Megamap: the zoom button zooms on the hero and follows him
The zoom button never set the zoom point, so it zoomed on the last magnifier point (or 0,0). While the button's zoom is on, the point is put on the hero's map pixel every engine tick; the held mouse button still zooms on the mouse. game::UiWindow / UiWindowShown shared from windows.h. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
1d16fc65c4
commit
c7d54a6cfd
6 files changed
+98
-20
No files matched your search
+4
-12
@@ -261,7 +261,6 @@ void OnTick(uint8_t* engine) {
|
||||
// letter switch (upper-case character - 'C': index bytes at 0x75868c, targets
|
||||
// at 0x758660) sends M to index 10, "no hotkey", and the closing branch
|
||||
// compares with -1 instead of 'M' (cmp eax, 4Dh at 0x757f86).
|
||||
constexpr int kMegamapSlot = 0x25;
|
||||
constexpr int kMapBlockingSlots[] = {0x2b, 0x2c, 0x2f};
|
||||
constexpr uint32_t kMapBlockedFlag = 0x017e82c4;
|
||||
constexpr uint32_t kMapDisabledFlag = 0x017e8264;
|
||||
@@ -270,32 +269,25 @@ constexpr uint32_t kUiLetterIndices = 0x0075868c;
|
||||
constexpr uint8_t kUiLetterMap = 5;
|
||||
constexpr uint8_t kUiNoHotkey = 10;
|
||||
constexpr uint32_t kUiMapCloseCompare = 0x00757f86;
|
||||
constexpr size_t kControlFlagsOffset = 0x10; // bit 0: visible
|
||||
|
||||
bool WindowShown(const uint32_t* ui, int slot) {
|
||||
const auto* window = reinterpret_cast<const uint8_t*>(static_cast<uintptr_t>(ui[slot]));
|
||||
return window && (*reinterpret_cast<const uint32_t*>(window + kControlFlagsOffset) & 1) != 0;
|
||||
}
|
||||
|
||||
bool Flag(uint32_t address) {
|
||||
return *reinterpret_cast<const uint8_t*>(static_cast<uintptr_t>(address)) != 0;
|
||||
}
|
||||
|
||||
void ToggleMap() {
|
||||
uint32_t* ui = game::UiManager();
|
||||
if (!ui || !ui[kMegamapSlot]) {
|
||||
if (!ui || !ui[game::kUiSlotMegamap]) {
|
||||
return;
|
||||
}
|
||||
if (WindowShown(ui, kMegamapSlot)) {
|
||||
if (game::UiWindowShown(ui, game::kUiSlotMegamap)) {
|
||||
game::SendWindowCommand(ui, "UI_WND_MEGAMAP", game::WindowCommand::Hide);
|
||||
return;
|
||||
}
|
||||
for (const int slot : kMapBlockingSlots) {
|
||||
if (WindowShown(ui, slot)) {
|
||||
if (game::UiWindowShown(ui, slot)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (!Flag(kMapBlockedFlag) && !Flag(kMapDisabledFlag) && !WindowShown(ui, kMapDisabledSlot)) {
|
||||
if (!Flag(kMapBlockedFlag) && !Flag(kMapDisabledFlag) && !game::UiWindowShown(ui, kMapDisabledSlot)) {
|
||||
game::SendWindowCommand(ui, "UI_WND_MEGAMAP", game::WindowCommand::Show);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user