From 0d083f9153c713a53cec57d698c94074571631f6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Wed, 14 Oct 2026 23:39:12 +0200 Subject: [PATCH 001/516] reimplement: PathFindingState methods that are 100% --- AGENTS.md | 22 +- .../Constructor_PathFindingState.cpp | 36 +++ .../PathFindingState/LinkageNeighbourAsm.hpp | 216 ++++++++++++++++++ .../bindPathPlanToAlgorithmStateAndReset.cpp | 2 +- .../clearActiveClimbDataOfType6And7.cpp | 37 +++ .../PathFindingState/clearAllClimbData.cpp | 2 +- .../PathFindingState/clearClimbData.cpp | 3 +- .../clearPathFindingTileMaps.cpp | 34 +++ .../computeAttackVectorsBasedOnXAndY.cpp | 54 +++++ .../getComputationalTileIndex.cpp | 2 +- .../PathFindingState/getTileInSearchQueue.cpp | 2 +- .../getYSmallerThanYLimit.cpp | 3 +- .../retraceAndCommitPathPlan.cpp | 2 +- ...hLinkageLayerForEachBuildingAtEachTile.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 212 ++++++++--------- 15 files changed, 512 insertions(+), 117 deletions(-) create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/Constructor_PathFindingState.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/clearActiveClimbDataOfType6And7.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/clearPathFindingTileMaps.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/computeAttackVectorsBasedOnXAndY.cpp diff --git a/AGENTS.md b/AGENTS.md index 187d9a0ba3..c2626a4a92 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -151,8 +151,19 @@ restyling anything large: `__asm` block rather than C++. Functions are never `__declspec(naked)`: write a normal function, keep the compiler-generated statements as C++, and refer to parameters, locals and `this` by name. Prettify offsets with MSVC's struct-member asm syntax (`mov esi, dword ptr [eax]TileMapState.ptr_LogicLayer`) - `::` is not parseable in an - asm operand, so a resolver global cannot be named there. -- a frame pointer plus a `this` spill - the original was built without optimisation. Add `#pragma optimize(, off)` + asm operand, so a resolver global cannot be named there. Where the handwritten block reaches a *global* layer rather + than a `this` field, give it a C++ pointer local and name that local in the asm; the original caches the same bases in + stack slots anyway, so the inner loop still matches. `mov eax, 0` followed by `mov ax, word ptr [..]` is the giveaway + in its own right - that is a hand-rolled `movzx`, which the compiler always emits as one instruction. + Such a block is usually a **macro**: the same instruction stream appears verbatim in several functions and never as a + call, so it belongs in a hand-written `*Asm.hpp` beside them (`NeighbourFlagsAsm.hpp`, `LinkageNeighbourAsm.hpp`). + This has been worth ~45 points per function, three times over. +- a frame pointer plus a `this` spill - the original was built without optimisation, **unless the same function also + reports `mov reg, 0`**. MSVC keeps `ebp` in any function containing an `__asm` block, so for a function with + handwritten assembly the frame pointer says nothing about the optimisation level: reimplement the handwritten part as + inline asm and leave the rest at `/O2`. Checking the prologue settles it - values kept in registers across the entry + tests mean `/O2`. Taking the `/Od` reading instead took `findLinkageBasedPathOrWalkRadius` from 5.1% to 2.8%, where + the same body without the pragma reaches 49.2%. When it really is `/Od`, add `#pragma optimize(, off)` around the function; inline asm alone does not disable optimisation. Then match the reported **frame size** exactly, which is usually the single biggest win, because every local displacement shifts otherwise. Merge locals that share a slot and reproduce dead stores. At `/Od` prefer a nested `if` over an early `continue` (the original inverts the test @@ -234,6 +245,13 @@ of the switch leaving the value it should have set uninitialised. Fixing them wa suspicious dead store is worth decompiling for rather than deleting. Note this is the opposite of the duplicate-tail pattern below, where our shared block should have been two separate branches - check the predecessor count either way. +Duplicating a `LAB_*` is correct C++ but not automatically a better match, so **measure every `goto` removal**. A +`goto` in the decompiler output usually marks a block the original compiler emitted once and jumped to, and writing +the block out twice makes MSVC emit it twice: duplicating the single shared tail in +`setClimbBasedOnClosestClimbData` - two `if` arms that set a coordinate pair and then share the distance test - was +semantically identical and cost **35 points**. Keep the `goto` where the measurement says the original shared the +block, and record that in the commit remark rather than trading match for style. + Diff patterns that were reliable (more in the cheat sheet): - Absolute `DAT_*` addresses in the original asm where the source uses `this->` mean the original accessed the global instance. diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/Constructor_PathFindingState.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/Constructor_PathFindingState.cpp new file mode 100644 index 0000000000..b4eac3e668 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/Constructor_PathFindingState.cpp @@ -0,0 +1,36 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A9760 + PathFindingState* PathFindingState::Constructor_PathFindingState() + { + this->field40_0x70 = 0; + this->field41_0x74 = 0; + this->DAT_lWys = 0; + this->notAllAssassinsUnk = 0; + this->DAT_Easy = 0; + this->DAT_Hard = 0; + this->DAT_Test_likely = 0; + this->DAT_Test_gatehouse = 0; + this->searchNonmatchCount = 0; + this->searchMatchCounter = 0; + this->DAT_Ass = 0; + this->calculations = 0; + this->DAT_Mini_spreads = 0; + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::clearPathFindingTileMaps, this)(); + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::clearAllClimbData, this)(); + this->searchGeneration = 1; + return this; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp b/src/OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp new file mode 100644 index 0000000000..258744835c --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp @@ -0,0 +1,216 @@ +/** + HAND WRITTEN - not generated. + + path: 'OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp' + + The inner loop of the PathLinkageLayer searches - pushing the eight neighbours of the tile just + taken off the queue - is handwritten assembly in the original, and it is a MACRO: the identical + instruction stream appears verbatim inside findLinkageBasedPathOrWalkRadius (0x00497740), + findSuitableSpawnLocationUnk (0x00497B80) and updateSeparateAreaTileMap (0x004995E0), never as a + call. It is recognisable by + + - "mov eax, 0" followed by "mov ax, word ptr [..]", a zero extension no compiler writes that way + (MSVC emits movzx), + - the search generation and the distance kept in 16-bit registers and compared with "cmp ax, cx" + rather than widened to int, + - every layer base reloaded from its own stack slot before each use instead of being held in a + register across the block. + + Do NOT add "#pragma optimize("", off)" to the enclosing functions. orig_asm.py --stats reports a + frame pointer for all three, but that is caused by the inline assembly itself - MSVC keeps ebp in + any function containing an __asm block - not by a missing /O2. Their prologues are plainly + optimised (the bounds check runs out of registers, "this" stays in esi), and forcing /Od costs + about half of the match. + + PathLinkageLayer bits: 0x01 north, 0x02 north-east, 0x04 east, 0x08 south-east, + 0x10 south, 0x20 south-west, 0x40 west, 0x80 north-west. + + Cardinal neighbours are entered at distance + 1 and diagonal ones at distance + 2; the north and + south rows are reached by adding directionTranslationMatrix[y][0] and [y][4] to the tile. + + The macro expects these locals in the enclosing function, by these names: + + short* _walkLayer, _certainPath the two adjacent short layers + int* _tilesQueue this->searchQueue.tilesQueue + short* _yQueue this->searchQueue.yQueue + int* _dirMatrix directionTranslationMatrix, as a flat int array + int _tile, _cY, _cLink + short _curGen, _cCardinalDistance + + and takes the queue end as the WRITEIDX macro argument, which it advances. It clobbers eax, ebx, ecx, edx, esi and edi. + + ID must be unique within the enclosing function; it exists only to keep the assembler labels of two + expansions apart. + + The original reaches the layers through the global instance's absolute address; we load them from + locals because MSVC inline assembly cannot name DAT_TileMapState::instance ("::" is not parseable + in an asm operand). That costs the initial "mov esi, _" instructions and nothing else - the + original reloads from a stack slot at exactly those points anyway. +*/ + +#pragma once + +#include "OpenSHC/Map/TileMapState.hpp" + +// clang-format off + +// One neighbour: OFF is the byte offset on the short layers (-2, 0 or +2), BIT the linkage bit, +// DIST the distance instruction (none for a cardinal step, "add ax, 1" for a diagonal one), +// TILE the tile-delta instruction and YADJ the row-delta instruction. +#define MACRO_LINKAGE_PUSH(ID, N, WRITEIDX, OFF, BIT, DIST, TILE, YADJ) \ + __asm mov ax, word ptr [edi + edx*2 + OFF] \ + __asm cmp ax, word ptr _curGen \ + __asm je push_done_##ID##_##N \ + __asm test bl, BIT \ + __asm je push_done_##ID##_##N \ + __asm mov esi, _certainPath \ + __asm mov ax, word ptr _cCardinalDistance \ + DIST \ + __asm mov cx, word ptr _curGen \ + __asm mov word ptr [esi + edx*2 + OFF], ax \ + __asm mov word ptr [edi + edx*2 + OFF], cx \ + __asm mov ecx, WRITEIDX \ + __asm mov esi, _tilesQueue \ + __asm mov eax, edx \ + TILE \ + __asm mov dword ptr [esi + ecx*4], eax \ + __asm mov eax, _cY \ + YADJ \ + __asm mov esi, _yQueue \ + __asm mov word ptr [esi + ecx*2], ax \ + __asm add WRITEIDX, 1 \ + __asm push_done_##ID##_##N: + +#define MACRO_ASM_SAME +#define MACRO_ASM_INC __asm add eax, 1 +#define MACRO_ASM_DEC __asm sub eax, 1 +#define MACRO_ASM_DIAGONAL __asm add ax, 1 + +// The whole eight-neighbour expansion, in the original's order: west, east, then the north row +// (north, north-west, north-east) and the south row (south, south-west, south-east). +#define MACRO_LINKAGE_EXPAND_NEIGHBOURS(ID, WRITEIDX) \ + __asm mov edx, _tile \ + __asm mov edi, _walkLayer \ + __asm mov ebx, _cLink \ + MACRO_LINKAGE_PUSH(ID, w, WRITEIDX, -2, 0x40, MACRO_ASM_SAME, MACRO_ASM_DEC, MACRO_ASM_SAME) \ + MACRO_LINKAGE_PUSH(ID, e, WRITEIDX, +2, 0x04, MACRO_ASM_SAME, MACRO_ASM_INC, MACRO_ASM_SAME) \ + __asm mov eax, _cY \ + __asm shl eax, 3 \ + __asm mov esi, _dirMatrix \ + __asm add edx, dword ptr [esi + eax*4] \ + MACRO_LINKAGE_PUSH(ID, n, WRITEIDX, 0, 0x01, MACRO_ASM_SAME, MACRO_ASM_SAME, MACRO_ASM_DEC) \ + MACRO_LINKAGE_PUSH(ID, nw, WRITEIDX, -2, 0x80, MACRO_ASM_DIAGONAL, MACRO_ASM_DEC, MACRO_ASM_DEC) \ + MACRO_LINKAGE_PUSH(ID, ne, WRITEIDX, +2, 0x02, MACRO_ASM_DIAGONAL, MACRO_ASM_INC, MACRO_ASM_DEC) \ + __asm mov edx, _tile \ + __asm mov eax, _cY \ + __asm shl eax, 3 \ + __asm add eax, 4 \ + __asm mov esi, _dirMatrix \ + __asm add edx, dword ptr [esi + eax*4] \ + MACRO_LINKAGE_PUSH(ID, s, WRITEIDX, 0, 0x10, MACRO_ASM_SAME, MACRO_ASM_SAME, MACRO_ASM_INC) \ + MACRO_LINKAGE_PUSH(ID, sw, WRITEIDX, -2, 0x20, MACRO_ASM_DIAGONAL, MACRO_ASM_DEC, MACRO_ASM_INC) \ + MACRO_LINKAGE_PUSH(ID, se, WRITEIDX, +2, 0x08, MACRO_ASM_DIAGONAL, MACRO_ASM_INC, MACRO_ASM_INC) + +// The same neighbour, but only entered when OccupancyLayer says the tile is free. TOFF is the +// neighbour's offset in tiles (the occupancy layer holds one byte per tile, so it is not scaled +// like OFF is on the short layers). Needs one more local, "uchar* _occupancy". +#define MACRO_LINKAGE_PUSH_FREE(ID, N, WRITEIDX, OFF, TOFF, BIT, DIST, TILE, YADJ) \ + __asm mov ax, word ptr [edi + edx*2 + OFF] \ + __asm cmp ax, word ptr _curGen \ + __asm je push_done_##ID##_##N \ + __asm test bl, BIT \ + __asm je push_done_##ID##_##N \ + __asm mov esi, _occupancy \ + __asm mov cl, byte ptr [esi + edx + TOFF] \ + __asm cmp cl, 0 \ + __asm jne push_done_##ID##_##N \ + __asm mov esi, _certainPath \ + __asm mov ax, word ptr _cCardinalDistance \ + DIST \ + __asm mov cx, word ptr _curGen \ + __asm mov word ptr [esi + edx*2 + OFF], ax \ + __asm mov word ptr [edi + edx*2 + OFF], cx \ + __asm mov ecx, WRITEIDX \ + __asm mov esi, _tilesQueue \ + __asm mov eax, edx \ + TILE \ + __asm mov dword ptr [esi + ecx*4], eax \ + __asm mov eax, _cY \ + YADJ \ + __asm mov esi, _yQueue \ + __asm mov word ptr [esi + ecx*2], ax \ + __asm add WRITEIDX, 1 \ + __asm push_done_##ID##_##N: + +#define MACRO_LINKAGE_EXPAND_FREE_NEIGHBOURS(ID, WRITEIDX) \ + __asm mov edx, _tile \ + __asm mov edi, _walkLayer \ + __asm mov ebx, _cLink \ + MACRO_LINKAGE_PUSH_FREE(ID, w, WRITEIDX, -2, -1, 0x40, MACRO_ASM_SAME, MACRO_ASM_DEC, MACRO_ASM_SAME) \ + MACRO_LINKAGE_PUSH_FREE(ID, e, WRITEIDX, +2, +1, 0x04, MACRO_ASM_SAME, MACRO_ASM_INC, MACRO_ASM_SAME) \ + __asm mov eax, _cY \ + __asm shl eax, 3 \ + __asm mov esi, _dirMatrix \ + __asm add edx, dword ptr [esi + eax*4] \ + MACRO_LINKAGE_PUSH_FREE(ID, n, WRITEIDX, 0, 0, 0x01, MACRO_ASM_SAME, MACRO_ASM_SAME, MACRO_ASM_DEC) \ + MACRO_LINKAGE_PUSH_FREE(ID, nw, WRITEIDX, -2, -1, 0x80, MACRO_ASM_DIAGONAL, MACRO_ASM_DEC, MACRO_ASM_DEC) \ + MACRO_LINKAGE_PUSH_FREE(ID, ne, WRITEIDX, +2, +1, 0x02, MACRO_ASM_DIAGONAL, MACRO_ASM_INC, MACRO_ASM_DEC) \ + __asm mov edx, _tile \ + __asm mov eax, _cY \ + __asm shl eax, 3 \ + __asm add eax, 4 \ + __asm mov esi, _dirMatrix \ + __asm add edx, dword ptr [esi + eax*4] \ + MACRO_LINKAGE_PUSH_FREE(ID, s, WRITEIDX, 0, 0, 0x10, MACRO_ASM_SAME, MACRO_ASM_SAME, MACRO_ASM_INC) \ + MACRO_LINKAGE_PUSH_FREE(ID, sw, WRITEIDX, -2, -1, 0x20, MACRO_ASM_DIAGONAL, MACRO_ASM_DEC, MACRO_ASM_INC) \ + MACRO_LINKAGE_PUSH_FREE(ID, se, WRITEIDX, +2, +1, 0x08, MACRO_ASM_DIAGONAL, MACRO_ASM_INC, MACRO_ASM_INC) + +// The area flood-fill variant: no distance and no search generation, just "this neighbour has no +// area yet, give it mine". It tests the linkage bit first and walks the north and south rows +// west-to-east, both the other way round from the two search variants above. Needs the locals +// "ushort* _areaLayer" (PathConnectionLayer) and "short _areaID" in place of the layer pair. +#define MACRO_LINKAGE_PUSH_AREA(ID, N, WRITEIDX, OFF, BIT, TILE, YADJ) \ + __asm test bl, BIT \ + __asm je push_done_##ID##_##N \ + __asm mov ax, word ptr [edi + edx*2 + OFF] \ + __asm cmp ax, 0 \ + __asm jne push_done_##ID##_##N \ + __asm mov ax, word ptr _areaID \ + __asm mov word ptr [edi + edx*2 + OFF], ax \ + __asm mov ecx, WRITEIDX \ + __asm mov esi, _tilesQueue \ + __asm mov eax, edx \ + TILE \ + __asm mov dword ptr [esi + ecx*4], eax \ + __asm mov eax, _cY \ + YADJ \ + __asm mov esi, _yQueue \ + __asm mov word ptr [esi + ecx*2], ax \ + __asm add WRITEIDX, 1 \ + __asm push_done_##ID##_##N: + +#define MACRO_LINKAGE_EXPAND_AREA_NEIGHBOURS(ID, WRITEIDX) \ + __asm mov edx, _tile \ + __asm mov edi, _areaLayer \ + __asm mov ebx, _cLink \ + MACRO_LINKAGE_PUSH_AREA(ID, w, WRITEIDX, -2, 0x40, MACRO_ASM_DEC, MACRO_ASM_SAME) \ + MACRO_LINKAGE_PUSH_AREA(ID, e, WRITEIDX, +2, 0x04, MACRO_ASM_INC, MACRO_ASM_SAME) \ + __asm mov edx, _tile \ + __asm mov eax, _cY \ + __asm shl eax, 3 \ + __asm mov esi, _dirMatrix \ + __asm add edx, dword ptr [esi + eax*4] \ + MACRO_LINKAGE_PUSH_AREA(ID, nw, WRITEIDX, -2, 0x80, MACRO_ASM_DEC, MACRO_ASM_DEC) \ + MACRO_LINKAGE_PUSH_AREA(ID, n, WRITEIDX, 0, 0x01, MACRO_ASM_SAME, MACRO_ASM_DEC) \ + MACRO_LINKAGE_PUSH_AREA(ID, ne, WRITEIDX, +2, 0x02, MACRO_ASM_INC, MACRO_ASM_DEC) \ + __asm mov edx, _tile \ + __asm mov eax, _cY \ + __asm shl eax, 3 \ + __asm add eax, 4 \ + __asm mov esi, _dirMatrix \ + __asm add edx, dword ptr [esi + eax*4] \ + MACRO_LINKAGE_PUSH_AREA(ID, sw, WRITEIDX, -2, 0x20, MACRO_ASM_DEC, MACRO_ASM_INC) \ + MACRO_LINKAGE_PUSH_AREA(ID, s, WRITEIDX, 0, 0x10, MACRO_ASM_SAME, MACRO_ASM_INC) \ + MACRO_LINKAGE_PUSH_AREA(ID, se, WRITEIDX, +2, 0x08, MACRO_ASM_INC, MACRO_ASM_INC) + +// clang-format on diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/bindPathPlanToAlgorithmStateAndReset.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/bindPathPlanToAlgorithmStateAndReset.cpp index def1d655f2..aebd50bd61 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/bindPathPlanToAlgorithmStateAndReset.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/bindPathPlanToAlgorithmStateAndReset.cpp @@ -1,4 +1,4 @@ -#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "../PathFindingState.func.hpp" namespace OpenSHC { namespace Map { diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/clearActiveClimbDataOfType6And7.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/clearActiveClimbDataOfType6And7.cpp new file mode 100644 index 0000000000..08ca1960f7 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/clearActiveClimbDataOfType6And7.cpp @@ -0,0 +1,37 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + Iterates all climb data entries (1 to maxClimbDataCount) and calls clearLaddermanWalledData on any entry + that is active (canBeUsed != 0) and has type 6 or 7. The semantics of types 6 and 7 are not yet fully known; + this is likely called during a siege reset or wall state change. renamed by: Claude Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A52D0 + void PathFindingState::clearActiveClimbDataOfType6And7() + { + int* piVar2; + int iVar1 = 1; + piVar2 = &this->climbData[1].type; + do { + if (((ClimbData*)(piVar2 + -1))->canBeUsed != 0) { + if (*piVar2 == 6) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::clearClimbData, this)(iVar1); + } + if (*piVar2 == 7) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::clearClimbData, this)(iVar1); + } + } + iVar1 = iVar1 + 1; + piVar2 = piVar2 + 0x81; + } while (iVar1 < 200); + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/clearAllClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/clearAllClimbData.cpp index 80fbfda875..0c129f3613 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/clearAllClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/clearAllClimbData.cpp @@ -1,4 +1,4 @@ -#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "../PathFindingState.func.hpp" namespace OpenSHC { namespace Map { diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/clearClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/clearClimbData.cpp index 693e80c9d1..567520e82c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/clearClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/clearClimbData.cpp @@ -1,5 +1,6 @@ +#include "../PathFindingState.func.hpp" + #include "OpenSHC/IO/LowLevelMemory.func.hpp" -#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/clearPathFindingTileMaps.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/clearPathFindingTileMaps.cpp new file mode 100644 index 0000000000..2d6d4522df --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/clearPathFindingTileMaps.cpp @@ -0,0 +1,34 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00496E40 + void PathFindingState::clearPathFindingTileMaps() + { + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.PathConnectionLayer))); + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x13a10, '\0', (void*)((int)(DAT_TileMapState::instance.PathLinkageLayer))); + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.CertainPathLayer))); + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeAttackVectorsBasedOnXAndY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeAttackVectorsBasedOnXAndY.cpp new file mode 100644 index 0000000000..19de23dd20 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeAttackVectorsBasedOnXAndY.cpp @@ -0,0 +1,54 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A69F0 + void PathFindingState::computeAttackVectorsBasedOnXAndY(int playerID) + { + this->calculations = this->calculations + 1; + int _index = 0; + this->searchQueue.readIndex = 0; + if (this->searchQueue.writeIndex != 0) { + do { + uint y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int iVar1 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint x = iVar1 - DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile; + if (DAT_TileMapState::instance.CertainPathLayer[iVar1] != 100) { + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::budgetFloodFillOnCertainPathLayer, this)( + x, y, 100, 100); + DAT_GameState::instance.mapAndTime.attackVectors[playerID][_index].x = x; + DAT_GameState::instance.mapAndTime.attackVectors[playerID][_index].y = y; + DAT_GameState::instance.mapAndTime.attackVectors[playerID][_index].tribeUIDUnk = 0; + DAT_GameState::instance.mapAndTime.attackVectors[playerID][_index].tribeID = 0; + _index = _index + 1; + } + if (_index >= 50) { + return; + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/getComputationalTileIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/getComputationalTileIndex.cpp index b5329ac1f2..617aa511e2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/getComputationalTileIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/getComputationalTileIndex.cpp @@ -1,4 +1,4 @@ -#include "OpenSHC/Map/Navigation/PathFindingState.hpp" +#include "../PathFindingState.func.hpp" namespace OpenSHC { namespace Map { diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSearchQueue.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSearchQueue.cpp index 1b76cae820..fc5f970645 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSearchQueue.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSearchQueue.cpp @@ -1,4 +1,4 @@ -#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "../PathFindingState.func.hpp" namespace OpenSHC { namespace Map { diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/getYSmallerThanYLimit.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/getYSmallerThanYLimit.cpp index 7e1e89c5a8..98cfd4f137 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/getYSmallerThanYLimit.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/getYSmallerThanYLimit.cpp @@ -1,5 +1,4 @@ -#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" -#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" +#include "../PathFindingState.func.hpp" namespace OpenSHC { namespace Map { diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/retraceAndCommitPathPlan.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/retraceAndCommitPathPlan.cpp index 592967e90e..b264a3e20e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/retraceAndCommitPathPlan.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/retraceAndCommitPathPlan.cpp @@ -1,4 +1,4 @@ -#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "../PathFindingState.func.hpp" namespace OpenSHC { namespace Map { diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerForEachBuildingAtEachTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerForEachBuildingAtEachTile.cpp index 4d656c28f5..6e5712ada2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerForEachBuildingAtEachTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerForEachBuildingAtEachTile.cpp @@ -1,4 +1,4 @@ -#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "../PathFindingState.func.hpp" #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f6e47278b8..33114c519f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24347,103 +24347,103 @@ SHC_3BB0A8C1_0x00496E20 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00496E30 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x00496E40 | 0.0% | Pending +SHC_3BB0A8C1_0x00496E40 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00496EA0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x00496EC0 | 0.0% | Pending +SHC_3BB0A8C1_0x00496EC0 | 47.5% | Style pass, asm differs -SHC_3BB0A8C1_0x00496F90 | 0.0% | Pending +SHC_3BB0A8C1_0x00496F90 | 20.0% | Style pass, asm differs -SHC_3BB0A8C1_0x00497080 | 0.0% | Pending +SHC_3BB0A8C1_0x00497080 | 34.0% | Style pass, asm differs -SHC_3BB0A8C1_0x00497180 | 0.0% | Pending +SHC_3BB0A8C1_0x00497180 | 29.4% | Style pass, asm differs -SHC_3BB0A8C1_0x00497280 | 0.0% | Pending +SHC_3BB0A8C1_0x00497280 | 48.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004974D0 | 0.0% | Pending +SHC_3BB0A8C1_0x004974D0 | 30.8% | Style pass, asm differs -SHC_3BB0A8C1_0x00497690 | 0.0% | Pending +SHC_3BB0A8C1_0x00497690 | 13.6% | Style pass, asm differs -SHC_3BB0A8C1_0x00497740 | 0.0% | Pending +SHC_3BB0A8C1_0x00497740 | 49.2% | Style pass, asm differs -SHC_3BB0A8C1_0x00497B80 | 0.0% | Pending +SHC_3BB0A8C1_0x00497B80 | 51.7% | Style pass, asm differs -SHC_3BB0A8C1_0x00498020 | 0.0% | Pending +SHC_3BB0A8C1_0x00498020 | 54.8% | Style pass, asm differs SHC_3BB0A8C1_0x00498170 | 0.0% | Pending -SHC_3BB0A8C1_0x00498400 | 0.0% | Pending +SHC_3BB0A8C1_0x00498400 | 41.2% | Style pass, asm differs SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00498A40 | 0.0% | Pending +SHC_3BB0A8C1_0x00498A40 | 78.3% | Style pass, asm differs SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 0.0% | Pending +SHC_3BB0A8C1_0x00498FD0 | 12.1% | Style pass, asm differs SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004995E0 | 0.0% | Pending +SHC_3BB0A8C1_0x004995E0 | 49.3% | Style pass, asm differs SHC_3BB0A8C1_0x00499970 | 0.0% | Pending -SHC_3BB0A8C1_0x004999C0 | 0.0% | Pending +SHC_3BB0A8C1_0x004999C0 | 23.7% | Style pass, asm differs -SHC_3BB0A8C1_0x00499DC0 | 0.0% | Pending +SHC_3BB0A8C1_0x00499DC0 | 42.9% | Style pass, asm differs -SHC_3BB0A8C1_0x00499FA0 | 0.0% | Pending +SHC_3BB0A8C1_0x00499FA0 | 24.4% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A1C0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049A1C0 | 48.3% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A2E0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049A2E0 | 25.9% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A370 | 0.0% | Pending +SHC_3BB0A8C1_0x0049A370 | 8.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A5E0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049A5E0 | 78.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049A610 | 0.0% | Pending -SHC_3BB0A8C1_0x0049A6D0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AAD0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049AAD0 | 72.8% | Style pass, asm differs SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AF50 | 0.0% | Pending +SHC_3BB0A8C1_0x0049AF50 | 12.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049B000 | 0.0% | Pending SHC_3BB0A8C1_0x0049B1C0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x0049B1D0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049B1D0 | 86.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049B2B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049B5B0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049B5B0 | 66.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049B6B0 | 0.0% | Pending SHC_3BB0A8C1_0x0049B8C0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049B940 | 0.0% | Pending +SHC_3BB0A8C1_0x0049B940 | 70.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049BA30 | 0.0% | Pending SHC_3BB0A8C1_0x0049BA90 | 0.0% | Pending -SHC_3BB0A8C1_0x0049BBF0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049BBF0 | 49.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049BCD0 | 0.0% | Pending SHC_3BB0A8C1_0x0049BD40 | 0.0% | Pending -SHC_3BB0A8C1_0x0049BE60 | 0.0% | Pending +SHC_3BB0A8C1_0x0049BE60 | 48.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049C020 | 0.0% | Pending +SHC_3BB0A8C1_0x0049C020 | 61.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049C100 | 0.0% | Pending @@ -24655,93 +24655,93 @@ SHC_3BB0A8C1_0x0049C360 | 0.0% | Pending SHC_3BB0A8C1_0x0049C361 | 0.0% | Pending -SHC_3BB0A8C1_0x0049C370 | 0.0% | Pending +SHC_3BB0A8C1_0x0049C370 | 44.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049C4A0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049C5C0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049C5C0 | 37.6% | Style pass, asm differs -SHC_3BB0A8C1_0x0049C690 | 0.0% | Pending +SHC_3BB0A8C1_0x0049C690 | 71.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049C730 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CB00 | 0.0% | Pending +SHC_3BB0A8C1_0x0049CB00 | 51.1% | Style pass, asm differs SHC_3BB0A8C1_0x0049CBE0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CD60 | 0.0% | Pending +SHC_3BB0A8C1_0x0049CD60 | 29.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049CDB0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CE40 | 0.0% | Pending +SHC_3BB0A8C1_0x0049CE40 | 51.1% | Style pass, asm differs SHC_3BB0A8C1_0x0049CF30 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D0E0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049D0E0 | 52.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049D240 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D340 | 0.0% | Pending +SHC_3BB0A8C1_0x0049D340 | 64.6% | Style pass, asm differs SHC_3BB0A8C1_0x0049D470 | 0.0% | Pending SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D640 | 0.0% | Pending +SHC_3BB0A8C1_0x0049D640 | 77.1% | Style pass, asm differs -SHC_3BB0A8C1_0x0049D880 | 0.0% | Pending +SHC_3BB0A8C1_0x0049D880 | 52.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending -SHC_3BB0A8C1_0x0049DB30 | 0.0% | Pending +SHC_3BB0A8C1_0x0049DB30 | 78.1% | Style pass, asm differs -SHC_3BB0A8C1_0x0049DDC0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049DDC0 | 35.7% | Style pass, asm differs -SHC_3BB0A8C1_0x0049E0D0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049E0D0 | 86.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049E510 | 0.0% | Pending +SHC_3BB0A8C1_0x0049E510 | 90.8% | Style pass, asm differs -SHC_3BB0A8C1_0x0049E9E0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049E9E0 | 69.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049EB00 | 0.0% | Pending -SHC_3BB0A8C1_0x0049EDF0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049EDF0 | 62.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049F040 | 0.0% | Pending +SHC_3BB0A8C1_0x0049F040 | 79.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F2D0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049F2D0 | 78.7% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F540 | 0.0% | Pending +SHC_3BB0A8C1_0x0049F540 | 78.8% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F7D0 | 0.0% | Pending +SHC_3BB0A8C1_0x0049F7D0 | 19.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FC00 | 0.0% | Pending +SHC_3BB0A8C1_0x0049FC00 | 56.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049FD10 | 0.0% | Pending SHC_3BB0A8C1_0x0049FD70 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FF20 | 0.0% | Pending +SHC_3BB0A8C1_0x0049FF20 | 65.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A0050 | 0.0% | Pending -SHC_3BB0A8C1_0x004A01D0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A01D0 | 54.6% | Style pass, asm differs SHC_3BB0A8C1_0x004A0300 | 0.0% | Pending -SHC_3BB0A8C1_0x004A0460 | 0.0% | Pending +SHC_3BB0A8C1_0x004A0460 | 66.7% | Style pass, asm differs -SHC_3BB0A8C1_0x004A06B0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A06B0 | 60.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A07C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A08E0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A08E0 | 84.5% | Style pass, asm differs -SHC_3BB0A8C1_0x004A0B20 | 0.0% | Pending +SHC_3BB0A8C1_0x004A0B20 | 65.2% | Style pass, asm differs SHC_3BB0A8C1_0x004A0BD0 | 0.0% | Pending @@ -24875,9 +24875,9 @@ SHC_3BB0A8C1_0x004A0E4A | 0.0% | Pending SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending -SHC_3BB0A8C1_0x004A0E50 | 0.0% | Pending +SHC_3BB0A8C1_0x004A0E50 | 93.1% | Style pass, asm differs -SHC_3BB0A8C1_0x004A1230 | 0.0% | Pending +SHC_3BB0A8C1_0x004A1230 | 59.4% | Style pass, asm differs SHC_3BB0A8C1_0x004A1568 | 0.0% | Pending @@ -25011,9 +25011,9 @@ SHC_3BB0A8C1_0x004A15AE | 0.0% | Pending SHC_3BB0A8C1_0x004A15AF | 0.0% | Pending -SHC_3BB0A8C1_0x004A15B0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A15B0 | 28.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A16C0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A16C0 | 90.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A1800 | 0.0% | Pending @@ -25163,29 +25163,29 @@ SHC_3BB0A8C1_0x004A19AD | 0.0% | Pending SHC_3BB0A8C1_0x004A19AE | 0.0% | Pending -SHC_3BB0A8C1_0x004A19B0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A19B0 | 57.2% | Style pass, asm differs SHC_3BB0A8C1_0x004A1AF0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1C40 | 0.0% | Pending +SHC_3BB0A8C1_0x004A1C40 | 74.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1D30 | 0.0% | Pending +SHC_3BB0A8C1_0x004A1D30 | 65.7% | Style pass, asm differs SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending -SHC_3BB0A8C1_0x004A21B0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A21B0 | 57.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A22C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2650 | 0.0% | Pending +SHC_3BB0A8C1_0x004A2650 | 64.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A2740 | 0.0% | Pending SHC_3BB0A8C1_0x004A27D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2A90 | 0.0% | Pending +SHC_3BB0A8C1_0x004A2A90 | 54.4% | Style pass, asm differs SHC_3BB0A8C1_0x004A2B70 | 0.0% | Pending @@ -25201,27 +25201,27 @@ SHC_3BB0A8C1_0x004A2DC4 | 0.0% | Pending SHC_3BB0A8C1_0x004A2DC8 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2DD0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A2DD0 | 75.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A2F00 | 0.0% | Pending SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3220 | 0.0% | Pending +SHC_3BB0A8C1_0x004A3220 | 63.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A36B0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A36B0 | 40.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 0.0% | Pending +SHC_3BB0A8C1_0x004A3B20 | 33.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending -SHC_3BB0A8C1_0x004A4140 | 0.0% | Pending +SHC_3BB0A8C1_0x004A4140 | 83.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004A4470 | 0.0% | Pending +SHC_3BB0A8C1_0x004A4470 | 47.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A4500 | 0.0% | Pending @@ -25229,15 +25229,15 @@ SHC_3BB0A8C1_0x004A4550 | 0.0% | Pending SHC_3BB0A8C1_0x004A46C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A4930 | 0.0% | Pending +SHC_3BB0A8C1_0x004A4930 | 65.8% | ClimbData stride bug fixed -SHC_3BB0A8C1_0x004A4B30 | 0.0% | Pending +SHC_3BB0A8C1_0x004A4B30 | 79.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A4B80 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A4BB0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A4BB0 | 24.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A4C70 | 0.0% | Pending +SHC_3BB0A8C1_0x004A4C70 | 89.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A4D60 | 0.0% | Pending @@ -25249,61 +25249,61 @@ SHC_3BB0A8C1_0x004A50E0 | 0.0% | Pending SHC_3BB0A8C1_0x004A5230 | 0.0% | Pending -SHC_3BB0A8C1_0x004A52D0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A52D0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5320 | 0.0% | Pending +SHC_3BB0A8C1_0x004A5320 | 16.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending SHC_3BB0A8C1_0x004A5770 | 0.0% | Pending -SHC_3BB0A8C1_0x004A58A0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A58A0 | 14.6% | Style pass, asm differs SHC_3BB0A8C1_0x004A5980 | 0.0% | Pending SHC_3BB0A8C1_0x004A5A30 | 0.0% | Pending -SHC_3BB0A8C1_0x004A5B00 | 0.0% | Pending +SHC_3BB0A8C1_0x004A5B00 | 57.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A5DA0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A5DA0 | 76.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5F90 | 0.0% | Pending +SHC_3BB0A8C1_0x004A5F90 | 82.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004A6010 | 0.0% | Pending +SHC_3BB0A8C1_0x004A6010 | 37.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending -SHC_3BB0A8C1_0x004A6520 | 0.0% | Pending +SHC_3BB0A8C1_0x004A6520 | 95.7% | Style pass, asm differs -SHC_3BB0A8C1_0x004A65E0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A65E0 | 68.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A66D0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A66D0 | 83.1% | Style pass, asm differs -SHC_3BB0A8C1_0x004A67D0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A67D0 | 72.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending -SHC_3BB0A8C1_0x004A69F0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A69F0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6AB0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A6AB0 | 27.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending SHC_3BB0A8C1_0x004A6C40 | 0.0% | Pending -SHC_3BB0A8C1_0x004A6DF0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A6DF0 | 78.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A7090 | 0.0% | Pending +SHC_3BB0A8C1_0x004A7090 | 89.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004A75B0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A75B0 | 24.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A79A0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A7F50 | 0.0% | Pending +SHC_3BB0A8C1_0x004A7F50 | 49.5% | Style pass, asm differs SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending @@ -25311,15 +25311,15 @@ SHC_3BB0A8C1_0x004A8220 | 0.0% | Pending SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending -SHC_3BB0A8C1_0x004A83B0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A83B0 | 60.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A8780 | 0.0% | Pending +SHC_3BB0A8C1_0x004A8780 | 40.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A8860 | 0.0% | Pending +SHC_3BB0A8C1_0x004A8860 | 34.7% | Style pass, asm differs SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending -SHC_3BB0A8C1_0x004A8AB0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A8AB0 | 58.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A91B0 | 0.0% | Pending @@ -25453,23 +25453,23 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 0.0% | Pending +SHC_3BB0A8C1_0x004A9200 | 43.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A9510 | 0.0% | Pending +SHC_3BB0A8C1_0x004A9510 | 54.0% | Style pass, asm differs -SHC_3BB0A8C1_0x004A9680 | 0.0% | Pending +SHC_3BB0A8C1_0x004A9680 | 84.5% | Style pass, asm differs SHC_3BB0A8C1_0x004A96B0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9760 | 0.0% | Pending +SHC_3BB0A8C1_0x004A9760 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A97D0 | 0.0% | Pending +SHC_3BB0A8C1_0x004A97D0 | 20.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A98C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9B20 | 0.0% | Pending +SHC_3BB0A8C1_0x004A9B20 | 31.5% | Style pass, asm differs SHC_3BB0A8C1_0x004A9DD0 | 100.0% | Reimplemented From 522ea45c0d50f10f7a8f3ecd3892347a8108fd68 Mon Sep 17 00:00:00 2001 From: Gynt Date: Wed, 14 Oct 2026 23:40:58 +0200 Subject: [PATCH 002/516] reimplement: PathFindingState methods that are less than 100% --- .../aggressiveStanceTargetBuildingAtRange.cpp | 183 ++++++++++ .../PathFindingState/algFindAttackAngle.cpp | 112 ++++++ .../algTunnelerFindTarget.cpp | 134 +++++++ .../budgetFloodFillOnCertainPathLayer.cpp | 165 +++++++++ ...teCanPlayerUnitsNavigateToAreaFromArea.cpp | 339 +++++++++++++++++ .../calculateCanReachUsingCachedAreaLogic.cpp | 155 ++++++++ ...lculatePathKeepAndWallsGatesNotAllowed.cpp | 208 +++++++++++ .../canNavigateFunctionReturnsArea.cpp | 124 +++++++ .../certainDamageToUnitsUnk.cpp | 246 +++++++++++++ ...ldingOrDefensiveStructureWithin12Tiles.cpp | 135 +++++++ .../commitUnitPathPlanUsingWalkLayer.cpp | 272 ++++++++++++++ .../PathFindingState/computeAIZoneLayer.cpp | 333 +++++++++++++++++ .../computeNextRallyPointDestination.cpp | 121 +++++++ .../computeTotalUnitsWithinDistance.cpp | 199 ++++++++++ .../PathFindingState/createClimbData.cpp | 82 +++++ .../PathFindingState/doMoveFromTileToTile.cpp | 141 ++++++++ .../PathFindingState/doPathfinding.cpp | 130 +++++++ .../PathFindingState/findAIZoneWithFlags.cpp | 103 ++++++ .../findAccessibleWallAndNearbyFreeTile.cpp | 183 ++++++++++ .../findAppropriateLocationForSiegeTent.cpp | 340 ++++++++++++++++++ .../findArcherRelatedAttackInfoIndex.cpp | 116 ++++++ .../findBestAdjacentClimbTileToTarget.cpp | 101 ++++++ ...BestAttackTargetTileWithHeightAndOwner.cpp | 217 +++++++++++ .../findBestAttackTileByPathCost.cpp | 119 ++++++ .../findBuildingAccessPoint.cpp | 271 ++++++++++++++ .../findClosestFreeTileNearUnitOnBuilding.cpp | 126 +++++++ .../findClosestTileToStartingTile.cpp | 54 +++ .../findConnectingAreaBetweenTwoAreas.cpp | 156 ++++++++ .../findCrossAreaBridgeTileToTarget.cpp | 152 ++++++++ .../findDestinationCostLowerThan6.cpp | 48 +++ .../findDirectNeighbourWalkableTile.cpp | 60 ++++ .../findDistanceOrThreatLevelToUnitUnk.cpp | 153 ++++++++ ...nsiveStructureInSameAreaWithinDistance.cpp | 210 +++++++++++ .../findFreeTileOnDefensiveStructure.cpp | 113 ++++++ .../PathFindingState/findFurthestSeaTile.cpp | 106 ++++++ .../findLinkageBasedPathOrWalkRadius.cpp | 115 ++++++ ...apBorderEdgeTileAndStoreInSignpostData.cpp | 138 +++++++ ...findNearestEnemyBuildingWithinDistance.cpp | 113 ++++++ .../findNearestEnemyUnitWithinDistance.cpp | 107 ++++++ ...ileThatCanServeAsClimbPointClosestToXY.cpp | 115 ++++++ ...gPreviousSearchNotOnDefensiveStructure.cpp | 69 ++++ ...ExistingSearchThatIsModuloDistanceAway.cpp | 64 ++++ .../PathFindingState/findNoTreeInRange.cpp | 122 +++++++ .../PathFindingState/findOwnedGatehouse.cpp | 114 ++++++ ...indPathUsingClimbingWithHeightMargin16.cpp | 206 +++++++++++ ...athableTileWithoutUnitWithBuildingAtXY.cpp | 131 +++++++ .../findPositionForGivenClimbArea.cpp | 45 +++ .../findSomeSuitableLocationUnk.cpp | 181 ++++++++++ .../findSuitableSpawnLocationUnk.cpp | 96 +++++ .../findSupportPointIndex.cpp | 107 ++++++ ...PreferredOrientationBasedConnectedTile.cpp | 65 ++++ ...findWalkableTileThatDoesNotContainUnit.cpp | 128 +++++++ .../getGatehouseNearSomethingUnk.cpp | 118 ++++++ .../PathFindingState/getTileInSquareBrush.cpp | 108 ++++++ .../healUnitsOfPlayerWithinRadius.cpp | 179 +++++++++ .../igniteFireAtTilesDistanceAway.cpp | 177 +++++++++ .../PathFindingState/isEnemyTooCloseUnk.cpp | 58 +++ .../isOpponentBuildingInRange.cpp | 123 +++++++ .../isSignPostWithinDistance.cpp | 180 ++++++++++ .../isTileInRangeOfKeepRange.cpp | 63 ++++ .../isUsableClimbWithinArea.cpp | 29 ++ .../pathFindingDeerAndLionsUnk.cpp | 182 ++++++++++ .../PathFindingState/pathFindingRelated.cpp | 134 +++++++ .../pathFindingResultBased.cpp | 70 ++++ ...pathFindingToAttackCastleIncludingMoat.cpp | 130 +++++++ .../pathFindingWithBuildingsIncluded.cpp | 265 ++++++++++++++ .../PathFindingState/pathPlanningForTribe.cpp | 258 +++++++++++++ .../pathfindingForAttacksUnk.cpp | 198 ++++++++++ .../pathfindingRelated49ff20.cpp | 117 ++++++ .../pathfindingUpdate_0x4a8ab0.cpp | 311 ++++++++++++++++ ...placeCommemoratingStatueAtGoodLocation.cpp | 198 ++++++++++ ...yWithWallTileAndFreeTilePairInSameArea.cpp | 186 ++++++++++ .../PathFindingState/raiseLand2.cpp | 151 ++++++++ .../recomputeALGPathFindingTileMapUnk.cpp | 176 +++++++++ .../recountUnitsUsingClimbData.cpp | 61 ++++ .../registerUnitOnClimbData.cpp | 54 +++ .../reverseCurrentPathPlan.cpp | 132 +++++++ .../setChangedLayerZeroBasedOn40x40Layer.cpp | 143 ++++++++ .../setClimbBasedOnClosestClimbData.cpp | 113 ++++++ ...tDestinationPairsBasedOnPreviousSearch.cpp | 55 +++ .../setMoveDestinationPairs.cpp | 56 +++ ...lityBorderLogicLayerForSmallerMapSizes.cpp | 156 ++++++++ .../setupBabyTreeLocationInfo.cpp | 149 ++++++++ .../someBinaryAlgFunctionPathFinding.cpp | 95 +++++ .../spawnUnitAndAddToTribe.cpp | 86 +++++ .../spreadAlgorithmForFlagsAndBraziersUnk.cpp | 165 +++++++++ .../storeDestinationOptionsUnk.cpp | 52 +++ .../traceAndCommitPathPlan.cpp | 161 +++++++++ ...athPlanToDestinationViaUnoccupiedTiles.cpp | 137 +++++++ ...PathToFriendlyDefensesAndReturnTileUnk.cpp | 124 +++++++ .../updateAIZoneWithFloodFill0x20.cpp | 165 +++++++++ .../PathFindingState/updateClimbData.cpp | 52 +++ ...LinkageLayerAtTileForSomeLogicalReason.cpp | 98 +++++ ...atePathLinkageLayerBasedOnBuildingsUnk.cpp | 240 +++++++++++++ ...updatePathLinkageTileMapRelatedToGates.cpp | 120 +++++++ ...updatePathLinkageTileMapRelatedToKeeps.cpp | 70 ++++ ...ePathLinkageTileMapRelatedToSiegeTower.cpp | 67 ++++ ...updatePathLinkagesInAllEightDirections.cpp | 50 +++ .../updateSeparateAreaTileMap.cpp | 104 ++++++ ...ateUnitDeathHeatmapIn3SpacesAroundTile.cpp | 174 +++++++++ .../updateWalkAndPathLayer.cpp | 155 ++++++++ .../updateWalkLayerAndAIPathCostLayer.cpp | 307 ++++++++++++++++ 102 files changed, 14375 insertions(+) create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/calculateCanReachUsingCachedAreaLogic.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findClosestTileToStartingTile.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/getGatehouseNearSomethingUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/isUsableClimbWithinArea.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/registerUnitOnClimbData.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/reverseCurrentPathPlan.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/storeDestinationOptionsUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp create mode 100644 src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp new file mode 100644 index 0000000000..20384f692b --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp @@ -0,0 +1,183 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Game/GameMode.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Game::GameMode; + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "DPSEND_EnumInt": Some values do not have unique names + */ + /* + WARNING: Enum "DPERRInt": Some values do not have unique names + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A1230 + void PathFindingState::aggressiveStanceTargetBuildingAtRange(int unitID, int maxDistance) + { + int (*paiVar4)[8]; + uint uVar5; + short* psVar6; + uint uVar7; + int _nextCandidate; + int _tile; + short sVar1 = DAT_UnitsState::instance.units[unitID].x; + uVar5 = (uint)sVar1; + short sVar2 = DAT_UnitsState::instance.units[unitID].y; + uVar7 = (uint)sVar2; + this->calculations = this->calculations + 1; + this->ALG_ResultTile = 0; + this->ALG_ResultY = 0; + this->ALG_ResultX = 0; + if (uVar5 > 399 || uVar7 > 399 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar7 * 400 + uVar5] == '\0') { + return; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[uVar7].addXgetTile + uVar5; + this->searchQueue.yQueue[0] = sVar2; + this->searchQueue.xQueue[0] = sVar1; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if ((DAT_TileMapState::instance.LogicLayer[this->searchQueue.tilesQueue[0]] & 0x30) == 0 + && this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _tile && (_tile < 0x13a10))) { + sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; + sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return; + } + if (this->searchQueue.currentDistance > maxDistance) { + return; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + _nextCandidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + _tile; + uVar5 = DAT_TileMapState::instance.LogicLayer[_nextCandidate]; + if (DAT_TileMapState::instance.WalkLayer[_nextCandidate] != this->searchGeneration) { + if (DAT_TileMapState::instance.BuildingLayer[_nextCandidate] == 0) { + /* + Is wall or gatehouseIs wall or gatehouse + */ + /* + TODO:FIXME: WallOwnerLayer contains player ids, not necessarily team ids + */ + if ((uVar5 & 0x100) != 0 + && (DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY + || (DAT_GameState::instance.mapAndTime.skirmishStrongWalls == 0)) + && DAT_GameState::instance.mapAndTime + .playerTeams[(DAT_TileMapState::instance.WallOwnerLayer[_nextCandidate] & 7) + + 1] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[unitID].owner]) { + this->ALG_ResultTile = _nextCandidate; + return; + } + } else { + uVar7 = (uint)DAT_TileMapState::instance.BuildingLayer[_nextCandidate]; + if (DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[unitID].owner] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_BuildingsState::instance.buildings[uVar7].owner]) { + switch (DAT_BuildingsState::instance.buildings[uVar7].buildingType) { + case OpenSHC::Map::Buildings::BT_STOCKPILE: + case OpenSHC::Map::Buildings::BT_MANORHOUSE: + case OpenSHC::Map::Buildings::BT_STONEKEEP: + case OpenSHC::Map::Buildings::BT_STRONGHOLD: + case OpenSHC::Map::Buildings::BT_CAMPFIRE: + case OpenSHC::Map::Buildings::BT_SIGNPOST: + case OpenSHC::Map::Buildings::BT_PARADEGROUND: + case OpenSHC::Map::Buildings::BT_CAMPGROUND: + case OpenSHC::Map::Buildings::BT_PARADEGROUND2: + case OpenSHC::Map::Buildings::BT_PARADEGROUND3: + case OpenSHC::Map::Buildings::BT_PARADEGROUND4: + case OpenSHC::Map::Buildings::BT_PARADEGROUND5: + case OpenSHC::Map::Buildings::BT_KILLINGPIT: + case OpenSHC::Map::Buildings::BT_KEEPDOOR_LEFT: + case OpenSHC::Map::Buildings::BT_KEEPDOOR_RIGHT: + case OpenSHC::Map::Buildings::BT_KEEPDOOR: + break; + default: + BOOLEnum BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHasHealthProperty, + DAT_BuildingsState::ptr)(uVar7, _nextCandidate); + if (BVar3 != FALSE) { + this->ALG_ResultTile = _nextCandidate; + return; + } + } + } + } + if ((uVar5 & 0x30) == 0) { + /* + If not the border, enqueue next candidate + */ + DAT_TileMapState::instance.CertainPathLayer[_nextCandidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextCandidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextCandidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp new file mode 100644 index 0000000000..48929bc68b --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp @@ -0,0 +1,112 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Units/TroopValueState.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_TroopValueState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049F540 + int PathFindingState::algFindAttackAngle(int maxDistance200, uint x, uint y, int tribeID) + { + int _siegeIndex; + int _tile; + int _tileOption; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return 0; + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_tileOption = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _tileOption && (_tileOption < 80400))) { + int _xOption = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int _yOption = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tileOption]; + if (80400 < (int)this->searchQueue.currentDistance) { + return 0; + } + if ((int)this->searchQueue.currentDistance > maxDistance200) { + return 0; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + if ((DAT_TileMapState::instance.PathLinkageLayer[_tileOption] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) + != 0 + && (_tile = DAT_TileMapState::instance.directionTranslationMatrix[_yOption][_direction] + + _tileOption, + DAT_TileMapState::instance.WalkLayer[_tile] != this->searchGeneration)) { + if (4 < (int)this->searchQueue.currentDistance + && (DAT_TileMapState::instance.AIInfoLayer[_tile] & 0x80) != 0 + && (_siegeIndex + = MACRO_CALL_MEMBER(OpenSHC::Map::Units::TroopValueState_Func::getSiegeIndexForTile, + DAT_TroopValueState::ptr)(_tile), + _siegeIndex != 0) + && _siegeIndex != DAT_TribesState::instance.tribes[tribeID].siegeIndexValue1 + && _siegeIndex != DAT_TribesState::instance.tribes[tribeID].siegeIndexValue2 + && DAT_TroopValueState::instance.attackInfo.tentPointsValues[_siegeIndex].three == 0 + && DAT_TroopValueState::instance.attackInfo.tentPointsValues[_siegeIndex].tribeID + == 0) { + return _siegeIndex; + } + DAT_TileMapState::instance.CertainPathLayer[_tile] + = (short)this->searchQueue.currentDistance + 1; + short _xOffset + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset; + DAT_TileMapState::instance.WalkLayer[_tile] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = _xOffset + _xOption; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _yOption; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return 0; + } + } + } + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp new file mode 100644 index 0000000000..b86515024b --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp @@ -0,0 +1,134 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049B5B0 + void PathFindingState::algTunnelerFindTarget( + int playerID, int targetPlayerID, int distance, int originX, int originY) + { + int iVar4; + uint uVar5; + short* psVar6; + int iVar7; + int (*paiVar8)[8]; + this->calculations = this->calculations + 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.CertainPathLayer))); + this->ALG_TargetTile = 0; + this->ALG_TargetY = 0; + this->ALG_TargetX = 0; + if ((uint)originX <= 399 && (uint)originY <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[originY * 400 + originX] != '\0') { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)originY; + this->searchQueue.xQueue[0] = (short)originX; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[originY].addXgetTile + originX; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < iVar4 && (iVar4 < 0x13a10))) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + iVar7 = (int)sVar2; + if ((DAT_TileMapState::instance.LogicLayer[iVar4] & 0x100U) != 0 + && (DAT_TileMapState::instance.LogicLayer[iVar4] & 2U) == 0) { + uVar5 = DAT_TileMapState::instance.WallOwnerLayer[iVar4] & 7; + if (((targetPlayerID == 0) || (targetPlayerID == uVar5 + 1)) + && DAT_GameState::instance.mapAndTime.playerTeams[playerID] + != DAT_GameState::instance.mapAndTime.playerTeams[uVar5 + 1]) { + this->ALG_TargetX = (int)sVar1; + this->ALG_TargetY = iVar7; + this->ALG_TargetTile = iVar4; + return; + } + } + short sVar3 = DAT_TileMapState::instance.BuildingLayer[iVar4]; + if (sVar3 != 0 + && (targetPlayerID == 0 + || (targetPlayerID == DAT_BuildingsState::instance.buildings[sVar3].owner)) + && DAT_GameState::instance.mapAndTime.playerTeams[playerID] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_BuildingsState::instance.buildings[sVar3].owner]) { + this->ALG_TargetX = (int)sVar1; + this->ALG_TargetY = iVar7; + this->ALG_TargetTile = iVar4; + return; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; + if (this->searchQueue.currentDistance > distance) { + return; + } + paiVar8 = DAT_TileMapState::instance.directionTranslationMatrix + iVar7; + psVar6 = &DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[0].short_.yOffset; + do { + iVar7 = (*paiVar8)[0] + iVar4; + uVar5 = DAT_TileMapState::instance.LogicLayer[iVar7]; + if (DAT_TileMapState::instance.WalkLayer[iVar7] != this->searchGeneration + && (uVar5 & 0xb1) == 0 && (uVar5 & 0x301000) == 0 + && (DAT_TileMapState::instance.BuildingLayer[iVar7] == 0 + || ((int)(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar7]] + .buildingType + - 0x4aU + < 3)) + && (uVar5 & 0x40000000) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar7] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar7] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = ((Point8ShortXY*)(psVar6 + -2))->xOffset + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] = *psVar6 + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar7; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + psVar6 = psVar6 + 8; + paiVar8 = (int (*)[8])(*paiVar8 + 2); + } while ((int)psVar6 < 0xb4908c); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp new file mode 100644 index 0000000000..532880dcf1 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp @@ -0,0 +1,165 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Location/Point8IntXY.hpp" + +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8IntXY; + + /* + WARNING: Function: __alloca_probe replaced with injection: alloca_probe + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049DDC0 + void PathFindingState::budgetFloodFillOnCertainPathLayer(uint x, uint y, int marker, int budget) + { + int iVar1; + int* piVar2; + int* piVar3; + uint _candidate; + uint uVar4; + short _distance; + int _readIndex; + uint _ys[1000]; + uint _xs[1000]; + uint _tilesQueue[1000]; + uint _tile; + uint _xUnk; + uint _yUnk; + _tilesQueue[999] = 0x49ddca; + _readIndex = 0; + int _writeIndex = 1; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + this->DAT_Mini_spreads = this->DAT_Mini_spreads + 1; + _ys[0] = y; + _xs[0] = x; + _tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + do { + _tile = _tilesQueue[_readIndex]; + if (0x13a0f < _tile) { + return; + } + if (budget <= _writeIndex) { + return; + } + if (999 < _writeIndex) { + return; + } + _yUnk = _xs[_readIndex]; + _xUnk = _ys[_readIndex]; + _distance = (short)marker; + DAT_TileMapState::instance.CertainPathLayer[_tile] = _distance; + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] == this->searchGeneration) { + if (DAT_TileMapState::instance.CertainPathLayer[_candidate] == marker) { + budget = budget + -1; + } else if (0 < DAT_TileMapState::instance.CertainPathLayer[_candidate]) { + iVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset; + _tilesQueue[_writeIndex] = _candidate; + _xs[_writeIndex] = iVar1 + _yUnk; + _ys[_writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + + _xUnk; + _writeIndex = _writeIndex + 1; + DAT_TileMapState::instance.CertainPathLayer[_candidate] = _distance; + if (999 < _writeIndex) { + _writeIndex = 0; + } + } + } else { + budget = budget + -1; + } + uVar4 = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction + 1] + _tile; + if (DAT_TileMapState::instance.WalkLayer[uVar4] == this->searchGeneration) { + if (DAT_TileMapState::instance.CertainPathLayer[uVar4] == marker) { + budget = budget + -1; + } else if (0 < DAT_TileMapState::instance.CertainPathLayer[uVar4]) { + iVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .int_.xOffset; + _tilesQueue[_writeIndex] = uVar4; + _xs[_writeIndex] = iVar1 + _yUnk; + _ys[_writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .int_.yOffset + + _xUnk; + _writeIndex = _writeIndex + 1; + DAT_TileMapState::instance.CertainPathLayer[uVar4] = _distance; + if (999 < _writeIndex) { + _writeIndex = 0; + } + } + } else { + budget = budget + -1; + } + uVar4 = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction + 2] + _tile; + if (DAT_TileMapState::instance.WalkLayer[uVar4] == this->searchGeneration) { + if (DAT_TileMapState::instance.CertainPathLayer[uVar4] == marker) { + budget = budget + -1; + } else if (0 < DAT_TileMapState::instance.CertainPathLayer[uVar4]) { + iVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .int_.xOffset; + _tilesQueue[_writeIndex] = uVar4; + _xs[_writeIndex] = iVar1 + _yUnk; + _ys[_writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .int_.yOffset + + _xUnk; + _writeIndex = _writeIndex + 1; + DAT_TileMapState::instance.CertainPathLayer[uVar4] = _distance; + if (999 < _writeIndex) { + _writeIndex = 0; + } + } + } else { + budget = budget + -1; + } + uVar4 = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction + 3] + _tile; + if (DAT_TileMapState::instance.WalkLayer[uVar4] == this->searchGeneration) { + if (DAT_TileMapState::instance.CertainPathLayer[uVar4] == marker) { + budget = budget + -1; + } else if (0 < DAT_TileMapState::instance.CertainPathLayer[uVar4]) { + iVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .int_.xOffset; + _tilesQueue[_writeIndex] = uVar4; + _xs[_writeIndex] = iVar1 + _yUnk; + _ys[_writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .int_.yOffset + + _xUnk; + _writeIndex = _writeIndex + 1; + DAT_TileMapState::instance.CertainPathLayer[uVar4] = _distance; + if (999 < _writeIndex) { + _writeIndex = 0; + } + } + } else { + budget = budget + -1; + } + } + + _readIndex = _readIndex + 1; + if (999 < _readIndex) { + _readIndex = 0; + } + } while (_readIndex != _writeIndex); + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp new file mode 100644 index 0000000000..8f01cc5304 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -0,0 +1,339 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + maybe fromArea is the third argument, and toArea is the second? decompilerscript: committed: 2025-01-30 + 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A5320 + int PathFindingState::calculateCanPlayerUnitsNavigateToAreaFromArea( + int playerID, dword fromArea, dword toArea, int permitClimb) + { + int iVar1; + dword dVar2; + dword dVar3; + dword dVar4; + int iVar7; + bool bVar8; + int local_96c; + int local_968; + dword adStack_960[200]; + int aiStack_640[400]; + if (fromArea != toArea) { + int iVar5 = 0; + if ((toArea == 0) || (fromArea == 0)) { + return 0; + } + iVar7 = 1; + this->DAT_Test_likely = this->DAT_Test_likely + 1; + local_96c = 0; + local_968 = 0; + for (iVar7 = 1; iVar7 < this->maxClimbDataCount; iVar7 = iVar7 + 1) { + if (this->climbData[iVar7].canBeUsed == 1 + && this->climbData[iVar7].isRecognizedByPathfinding != 0) { + if (this->climbData[iVar7].type == 1) { + bVar8 = permitClimb == 0; + } else { + bVar8 = permitClimb == 2; + } + if (!bVar8 + && ((playerID == 0 + || (DAT_GameState::instance.mapAndTime.playerTeams[this->climbData[iVar7].owner] + == DAT_GameState::instance.mapAndTime.playerTeams[playerID])) + || (DAT_BuildingsState::instance.buildings[this->climbData[iVar7].buildingID] + .field241_0x2c6 + != 0))) { + aiStack_640[local_96c * 2 + 1] = 0; + aiStack_640[local_96c * 2] = iVar7; + local_96c = local_96c + 1; + } + } + } + int iVar6 = 0; + this->field63_0xc0 = 0; + iVar7 = iVar5; + if (0 < local_96c) { + do { + iVar1 = aiStack_640[iVar6 * 2]; + iVar5 = iVar7; + if (this->climbData[iVar1].type != 1) { + dVar2 = this->climbData[iVar1].area; + if (dVar2 == toArea) { + dVar2 = this->climbData[iVar1].wallGroupAreaID; + if ((dVar2 == fromArea) + || (dVar3 = this->climbData[iVar1].buildingArea, dVar3 == fromArea)) { + return (int)(toArea); + } + adStack_960[iVar7] = dVar2; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar7 + 1; + if (0 < (int)dVar3) { + adStack_960[iVar7 + 1] = dVar3; + iVar5 = iVar7 + 2; + } + } else { + dVar3 = this->climbData[iVar1].wallGroupAreaID; + if (dVar3 == toArea) { + if (dVar2 == fromArea) { + this->field63_0xc0 = 0; + return (int)(toArea); + } + dVar3 = this->climbData[iVar1].buildingArea; + if (dVar3 == fromArea) { + this->field63_0xc0 = 0; + return (int)(toArea); + } + adStack_960[iVar7] = dVar2; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar7 + 1; + if (0 < (int)dVar3) { + adStack_960[iVar7 + 1] = dVar3; + iVar5 = iVar7 + 2; + } + } else if (this->climbData[iVar1].buildingArea == toArea) { + if (dVar2 == fromArea) { + this->field63_0xc0 = 0; + return (int)(toArea); + } + if (dVar3 == fromArea) { + this->field63_0xc0 = 0; + return (int)(toArea); + } + adStack_960[iVar7] = dVar2; + adStack_960[iVar7 + 1] = dVar3; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar7 + 2; + } + } + } + iVar6 = iVar6 + 1; + iVar7 = iVar5; + } while (iVar6 < local_96c); + if (0 < iVar5) { + do { + dVar2 = adStack_960[local_968]; + local_968 = local_968 + 1; + iVar6 = 0; + iVar7 = iVar5; + do { + iVar5 = iVar7; + if ((aiStack_640[iVar6 * 2 + 1] != 1) + && (iVar1 = aiStack_640[iVar6 * 2], this->climbData[iVar1].type != 1)) { + /* + not a ladder + */ + dVar3 = this->climbData[iVar1].area; + if (dVar3 == dVar2) { + dVar3 = this->climbData[iVar1].wallGroupAreaID; + if (dVar3 == fromArea) { + this->field63_0xc0 = 0; + return (int)(dVar2); + } + dVar4 = this->climbData[iVar1].buildingArea; + if (dVar4 == fromArea) { + this->field63_0xc0 = 0; + return (int)(dVar2); + } + adStack_960[iVar7] = dVar3; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar7 + 1; + if (0 < (int)dVar4) { + adStack_960[iVar7 + 1] = dVar4; + iVar5 = iVar7 + 2; + } + } else { + dVar4 = this->climbData[iVar1].wallGroupAreaID; + if (dVar4 == dVar2) { + if (dVar3 == fromArea) { + this->field63_0xc0 = 0; + return (int)(dVar2); + } + dVar4 = this->climbData[iVar1].buildingArea; + if (dVar4 == fromArea) { + this->field63_0xc0 = 0; + return (int)(dVar2); + } + adStack_960[iVar7] = dVar3; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar7 + 1; + if (0 < (int)dVar4) { + adStack_960[iVar7 + 1] = dVar4; + LAB_004a5605: + iVar5 = iVar7 + 2; + } + } else if (this->climbData[iVar1].buildingArea == dVar2) { + if (dVar3 == fromArea) { + this->field63_0xc0 = 0; + return (int)(dVar2); + } + if (dVar4 == fromArea) { + this->field63_0xc0 = 0; + return (int)(dVar2); + } + adStack_960[iVar7] = dVar3; + aiStack_640[iVar6 * 2 + 1] = 1; + adStack_960[iVar7 + 1] = dVar4; + goto LAB_004a5605; + } + } + } + iVar6 = iVar6 + 1; + iVar7 = iVar5; + } while (iVar6 < local_96c); + } while (local_968 < iVar5); + } + } + iVar6 = 0; + this->field63_0xc0 = 1; + this->field50_0x98 = 1; + iVar7 = iVar5; + if (0 < local_96c) { + do { + iVar1 = aiStack_640[iVar6 * 2]; + dVar2 = this->climbData[iVar1].area; + aiStack_640[iVar6 * 2 + 1] = 0; + if (dVar2 == toArea) { + dVar2 = this->climbData[iVar1].wallGroupAreaID; + if ((dVar2 == fromArea) + || (dVar3 = this->climbData[iVar1].buildingArea, dVar3 == fromArea)) { + return (int)(toArea); + } + adStack_960[iVar7] = dVar2; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar7 + 1; + if (0 < (int)dVar3) { + adStack_960[iVar7 + 1] = dVar3; + iVar5 = iVar7 + 2; + } + } else { + dVar3 = this->climbData[iVar1].wallGroupAreaID; + if (dVar3 == toArea) { + if (dVar2 == fromArea) { + this->field50_0x98 = 1; + this->field63_0xc0 = 1; + return (int)(toArea); + } + dVar3 = this->climbData[iVar1].buildingArea; + if (dVar3 == fromArea) { + this->field50_0x98 = 1; + this->field63_0xc0 = 1; + return (int)(toArea); + } + adStack_960[iVar7] = dVar2; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar7 + 1; + if (0 < (int)dVar3) { + adStack_960[iVar7 + 1] = dVar3; + iVar5 = iVar7 + 2; + } + } else { + iVar5 = iVar7; + if (this->climbData[iVar1].buildingArea == toArea) { + if ((dVar2 == fromArea) || (dVar3 == fromArea)) { + return (int)(toArea); + } + adStack_960[iVar7] = dVar2; + adStack_960[iVar7 + 1] = dVar3; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar7 + 2; + } + } + } + iVar6 = iVar6 + 1; + iVar7 = iVar5; + } while (iVar6 < local_96c); + } + if (local_968 < iVar5) { + do { + dVar2 = adStack_960[local_968]; + local_968 = local_968 + 1; + iVar6 = 0; + iVar7 = iVar5; + if (0 < local_96c) { + do { + iVar7 = iVar5; + if (aiStack_640[iVar6 * 2 + 1] != 1) { + iVar1 = aiStack_640[iVar6 * 2]; + dVar3 = this->climbData[iVar1].area; + if (dVar3 == dVar2) { + dVar3 = this->climbData[iVar1].wallGroupAreaID; + if (dVar3 == fromArea) { + this->field50_0x98 = 1; + this->field63_0xc0 = 1; + return (int)(dVar2); + } + dVar4 = this->climbData[iVar1].buildingArea; + if (dVar4 == fromArea) { + this->field50_0x98 = 1; + this->field63_0xc0 = 1; + return (int)(dVar2); + } + adStack_960[iVar5] = dVar3; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar7 = iVar5 + 1; + if (0 < (int)dVar4) { + adStack_960[iVar5 + 1] = dVar4; + iVar7 = iVar5 + 2; + } + } else { + dVar4 = this->climbData[iVar1].wallGroupAreaID; + if (dVar4 == dVar2) { + if (dVar3 == fromArea) { + this->field50_0x98 = 1; + this->field63_0xc0 = 1; + return (int)(dVar2); + } + dVar4 = this->climbData[iVar1].buildingArea; + if (dVar4 == fromArea) { + this->field50_0x98 = 1; + this->field63_0xc0 = 1; + return (int)(dVar2); + } + adStack_960[iVar5] = dVar3; + aiStack_640[iVar6 * 2 + 1] = 1; + iVar7 = iVar5 + 1; + if (0 < (int)dVar4) { + adStack_960[iVar5 + 1] = dVar4; + LAB_004a584f: + iVar7 = iVar5 + 2; + } + } else if (this->climbData[iVar1].buildingArea == dVar2) { + if (dVar3 == fromArea) { + this->field50_0x98 = 1; + this->field63_0xc0 = 1; + return (int)(dVar2); + } + if (dVar4 == fromArea) { + this->field50_0x98 = 1; + this->field63_0xc0 = 1; + return (int)(dVar2); + } + adStack_960[iVar5] = dVar3; + aiStack_640[iVar6 * 2 + 1] = 1; + adStack_960[iVar5 + 1] = dVar4; + goto LAB_004a584f; + } + } + } + iVar6 = iVar6 + 1; + iVar5 = iVar7; + } while (iVar6 < local_96c); + } + iVar5 = iVar7; + } while (local_968 < iVar7); + } + this->field50_0x98 = 0; + fromArea = 0; + } + return (int)(fromArea); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanReachUsingCachedAreaLogic.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanReachUsingCachedAreaLogic.cpp new file mode 100644 index 0000000000..212204e104 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanReachUsingCachedAreaLogic.cpp @@ -0,0 +1,155 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A5B00 + BOOLEnum PathFindingState::calculateCanReachUsingCachedAreaLogic(int tile1, int tile2) + { + int iVar1; + AreaPairInt* pAVar2; + BOOLEnum BVar3; + int iVar4; + int _area1; + int _area2; + _area2 = (int)(short)DAT_TileMapState::instance.PathConnectionLayer[tile2]; + _area1 = (int)(short)DAT_TileMapState::instance.PathConnectionLayer[tile1]; + if (_area1 == _area2) { + return TRUE; + } + if ((_area1 == 0) || (_area2 == 0)) { + return FALSE; + } + if (this->field48_0x90 == 0) { + this->field48_0x90 = 1; + this->searchQueue.acceptAreaPairArray1[0].area1 = -1; + this->searchQueue.acceptAreaPairArray1[0].area2 = -1; + this->searchQueue.rejectionAreaPairArray[0].area1 = -1; + this->searchQueue.rejectionAreaPairArray[0].area2 = -1; + this->searchQueue.acceptAreaPairArray1[1].area1 = -1; + this->searchQueue.acceptAreaPairArray1[1].area2 = -1; + this->searchQueue.rejectionAreaPairArray[1].area1 = -1; + this->searchQueue.rejectionAreaPairArray[1].area2 = -1; + this->searchQueue.acceptAreaPairArray1[2].area1 = -1; + this->searchQueue.acceptAreaPairArray1[2].area2 = -1; + this->searchQueue.rejectionAreaPairArray[2].area1 = -1; + this->searchQueue.rejectionAreaPairArray[2].area2 = -1; + this->searchQueue.acceptAreaPairArray1[3].area1 = -1; + this->searchQueue.acceptAreaPairArray1[3].area2 = -1; + this->searchQueue.rejectionAreaPairArray[3].area1 = -1; + this->searchQueue.rejectionAreaPairArray[3].area2 = -1; + this->searchQueue.acceptAreaPairArray1[4].area1 = -1; + this->searchQueue.acceptAreaPairArray1[4].area2 = -1; + this->searchQueue.rejectionAreaPairArray[4].area1 = -1; + this->searchQueue.rejectionAreaPairArray[4].area2 = -1; + this->searchQueue.acceptAreaPairArray1[5].area1 = -1; + this->searchQueue.acceptAreaPairArray1[5].area2 = -1; + this->searchQueue.rejectionAreaPairArray[5].area1 = -1; + this->searchQueue.rejectionAreaPairArray[5].area2 = -1; + this->searchQueue.acceptAreaPairArray1[6].area1 = -1; + this->searchQueue.acceptAreaPairArray1[6].area2 = -1; + this->searchQueue.rejectionAreaPairArray[6].area1 = -1; + this->searchQueue.rejectionAreaPairArray[6].area2 = -1; + this->searchQueue.acceptAreaPairArray1[7].area1 = -1; + this->searchQueue.acceptAreaPairArray1[7].area2 = -1; + this->searchQueue.rejectionAreaPairArray[7].area1 = -1; + this->searchQueue.rejectionAreaPairArray[7].area2 = -1; + this->searchQueue.acceptAreaPairArray1[8].area1 = -1; + this->searchQueue.acceptAreaPairArray1[8].area2 = -1; + this->searchQueue.rejectionAreaPairArray[8].area1 = -1; + this->searchQueue.rejectionAreaPairArray[8].area2 = -1; + this->searchQueue.acceptAreaPairArray1[9].area1 = -1; + this->searchQueue.acceptAreaPairArray1[9].area2 = -1; + this->searchQueue.rejectionAreaPairArray[9].area1 = -1; + this->searchQueue.rejectionAreaPairArray[9].area2 = -1; + } else { + iVar4 = 0; + pAVar2 = this->searchQueue.acceptAreaPairArray1; + do { + iVar1 = pAVar2->area1; + if (iVar1 != -1) { + if ((iVar1 == _area1) && (pAVar2->area2 == _area2)) { + return TRUE; + } + if ((pAVar2->area2 == _area1) && (iVar1 == _area2)) { + return TRUE; + } + } + iVar4 = iVar4 + 1; + pAVar2 = pAVar2 + 1; + } while (iVar4 < 10); + iVar4 = 0; + pAVar2 = this->searchQueue.rejectionAreaPairArray; + do { + iVar1 = pAVar2->area1; + if (iVar1 != -1) { + if ((iVar1 == _area1) && (pAVar2->area2 == _area2)) { + return FALSE; + } + if ((pAVar2->area2 == _area1) && (iVar1 == _area2)) { + return FALSE; + } + } + iVar4 = iVar4 + 1; + pAVar2 = pAVar2 + 1; + } while (iVar4 < 10); + } + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::pathFindingWithBuildingsIncluded, this)(tile1 + - DAT_ViewportRenderState::instance + .translationMatrix[( + short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile1]] + .addXgetTile, + (uint)((short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile1]), + (uint)(tile2 + - DAT_ViewportRenderState::instance + .translationMatrix[( + short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile2]] + .addXgetTile), + (uint)((short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile2]), 100000, 0); + if (BVar3 != FALSE) { + iVar4 = 0; + pAVar2 = this->searchQueue.acceptAreaPairArray1; + do { + if (pAVar2->area1 == -1) { + this->searchQueue.acceptAreaPairArray1[iVar4].area1 = _area1; + this->searchQueue.acceptAreaPairArray1[iVar4].area2 = _area2; + return TRUE; + } + iVar4 = iVar4 + 1; + pAVar2 = pAVar2 + 1; + } while (iVar4 < 10); + return TRUE; + } + iVar4 = 0; + pAVar2 = this->searchQueue.rejectionAreaPairArray; + do { + if (pAVar2->area1 == -1) { + this->searchQueue.rejectionAreaPairArray[iVar4].area1 = _area1; + this->searchQueue.rejectionAreaPairArray[iVar4].area2 = _area2; + return FALSE; + } + iVar4 = iVar4 + 1; + pAVar2 = pAVar2 + 1; + } while (iVar4 < 10); + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp new file mode 100644 index 0000000000..25a2fb9229 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -0,0 +1,208 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00498A40 + undefined4 PathFindingState::calculatePathKeepAndWallsGatesNotAllowed( + int x1, int y1, int x2, int y2, int maxTries) + { + uint uVar4; + int* piVar5; + int iVar6; + uint _tile; + if (399 < (uint)x1 || 399 < (uint)y1 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y1 * 400 + x1] == '\0') { + return (undefined4)(0); + } + if (x2 == -1 + || (((uint)x2 <= 399 && ((uint)y2 <= 399)) + && (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] != '\0'))) { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.yQueue[0] = (short)y1; + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.currentDistance = 1; + this->searchQueue.xQueue[0] = (short)x1; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[y1].addXgetTile + x1; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (x2 == -1) { + uVar4 = 0; + } else { + uVar4 = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; + } + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile == uVar4) { + return (undefined4)(1); + } + if ((maxTries <= this->searchQueue.readIndex) || (80399 < _tile)) + break; + int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int iVar3 = 0; + do { + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3 + 1] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 1]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3 + 2] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 2]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3 + 3] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 3]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar3 = iVar3 + 4; + } while (iVar3 < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (80400 < this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return (undefined4)(0); + } + } + } + } + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp new file mode 100644 index 0000000000..198d9d7b90 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp @@ -0,0 +1,124 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + returns area (a value >= 1) if the unit can get there, if not, 0 decompilerscript: committed: 2025-01-30 + 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A6DF0 + int PathFindingState::canNavigateFunctionReturnsArea(int playerID, dword targetArea, uint unitX, uint unitY) + { + int (*paiVar5)[8]; + int iVar6; + ushort _area; + this->ALG_ResultTile = 0; + this->ALG_ResultY = 0; + this->ALG_ResultX = 0; + if (399 < unitX || 399 < unitY + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[unitY * 400 + unitX] == '\0') { + return 0; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + /* + clear up the tilemap short[160800] + */ + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)unitY; + this->searchQueue.xQueue[0] = (short)unitX; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[unitY].addXgetTile + unitX; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + do { + int iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (iVar3 < 0) { + return 0; + } + if (80400 < iVar3) { + return 0; + } + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar3]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return 0; + } + iVar6 = 0; + paiVar5 = DAT_TileMapState::instance.directionTranslationMatrix + sVar2; + do { + int _tile = (*paiVar5)[0] + iVar3; + uint uVar4 = DAT_TileMapState::instance.LogicLayer[_tile]; + if (DAT_TileMapState::instance.WalkLayer[_tile] != this->searchGeneration) { + if ((uVar4 & 0x40000000) != 0) { + DAT_TileMapState::instance.CertainPathLayer[_tile] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_tile] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((uVar4 & 0x4a5014b1) == 0) { + _area = (short)DAT_TileMapState::instance.PathConnectionLayer[_tile]; + _tile = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)(playerID, (dword)((int)((short)_area)), (dword)((int)(targetArea)), 0); + if (_tile != 0) { + this->climbX + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .int_.xOffset + + (int)sVar1; + this->climbY + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .int_.yOffset + + (int)sVar2; + return (int)(short)_area; + } + } + } + iVar6 = iVar6 + 1; + paiVar5 = (int (*)[8])(*paiVar5 + 1); + } while (iVar6 < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp new file mode 100644 index 0000000000..53cb5f23e2 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -0,0 +1,246 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Audio/SFX/SFXState.func.hpp" +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Entities/EntityState.func.hpp" +#include "OpenSHC/Random/RNG.func.hpp" +#include "OpenSHC/DE/SHCDE/eSFX.hpp" +#include "OpenSHC/Map/Entities/EntityType.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/Map/Units/States/UnitState.hpp" +#include "OpenSHC/Map/Units/UnitType.hpp" + +#include "OpenSHC/Globals/DAT_EntityState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_SFXState.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" +#include "OpenSHC/Globals/SEC_RNG.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::DE::SHCDE::eSFX; + using OpenSHC::Map::Entities::EntityType; + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::Map::Units::UnitType; + using OpenSHC::Map::Units::States::UnitState; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A3B20 + undefined4 PathFindingState::certainDamageToUnitsUnk( + int param_1, int param_2, int param_3, int param_4, undefined4 param_5) + { + short sVar5; + short sVar6; + short* psVar8; + int iVar9; + int* piVar10; + int iVar11; + eSFX sfxOffsetInArray; + EntityType local_8; + int local_4; + this->searchGeneration = this->searchGeneration + 1; + this->calculations = this->calculations + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.yQueue[0] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[param_1]; + uint uVar7 = (uint)this->searchQueue.yQueue[0]; + iVar9 = param_1 - DAT_ViewportRenderState::instance.translationMatrix[uVar7].addXgetTile; + local_4 = 1; + uint uVar1 = iVar9 + 100; + if (399 < uVar1 || 399 < uVar7 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar7 * 400 + uVar1] == '\0') { + local_4 = -1; + } + this->searchQueue.tilesQueue[0] = param_1; + this->searchQueue.xQueue[0] = (short)iVar9; + this->searchQueue.currentDistance = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + DAT_TileMapState::instance.CertainPathLayer[param_1] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + local_8 = OpenSHC::Map::Entities::ET_ARROW_AND_DEFAULT; + if ((char)param_5 == '\0') { + local_8 = OpenSHC::Map::Entities::ET_CATAPULT; + } + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (uVar1 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar1 < 0x13a10) { + int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar1]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return (undefined4)(0); + } + if (this->searchQueue.currentDistance > param_2) { + return (undefined4)(0); + } + int uVar4 = (short)DAT_TileMapState::instance.UnitLayer[uVar1]; + while (iVar9 = (int)(short)uVar4, iVar9 != 0) { + if (param_3 != 0 + && DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[iVar9].owner] + != DAT_GameState::instance.mapAndTime.playerTeams[param_3] + && DAT_UnitsState::instance.units[iVar9].unitType != OpenSHC::Map::Units::UT_LORD) { + DAT_UnitsState::instance.units[iVar9].health + = DAT_UnitsState::instance.units[iVar9].health - param_4; + if ((DAT_UnitsState::instance.units[iVar9].health < 1) + && (DAT_UnitsState::instance.units[iVar9].dying == 0)) { + DAT_UnitsState::instance.units[iVar9].health = 0; + DAT_UnitsState::instance.units[iVar9].dying = 1; + DAT_UnitsState::instance.units[iVar9].animationCycleNumber = 0; + if ((char)param_5 == '\0') { + sVar6 = DAT_UnitsState::instance.units[iVar9].y; + sVar5 = DAT_UnitsState::instance.units[iVar9].x; + sfxOffsetInArray = OpenSHC::DE::SHCDE::FX_SPLAT; + DAT_UnitsState::instance.units[iVar9].state.generic + = OpenSHC::Map::Units::States::US_STONE_DEATH_01; + } else { + sVar6 = DAT_UnitsState::instance.units[iVar9].y; + sVar5 = DAT_UnitsState::instance.units[iVar9].x; + sfxOffsetInArray = OpenSHC::DE::SHCDE::FX_DEATH_ARROW; + DAT_UnitsState::instance.units[iVar9].state.generic + = OpenSHC::Map::Units::States::US_DEATH_01; + } + MACRO_CALL_MEMBER(OpenSHC::Audio::SFX::SFXState_Func::playSFXAtLocation, + DAT_SFXState::ptr)((int)sVar5, (int)(sVar6), sfxOffsetInArray); + DAT_UnitsState::instance.units[iVar9].tunnelerFinishedDigging = 1; + } + iVar11 = DAT_UnitsState::instance.units[iVar9].maxHealth; + if (iVar11 == 0) { + sVar6 = 100; + } else { + sVar6 = (short)((DAT_UnitsState::instance.units[iVar9].health * 100) / iVar11); + } + DAT_UnitsState::instance.units[iVar9].healthPercentage = sVar6; + DAT_UnitsState::instance.units[iVar9].healthbar + = (sVar6 / 10 + (sVar6 >> 0xf)) - (short)((longlong)(int)sVar6 * 0x66666667 >> 0x3f); + } + uVar4 = DAT_UnitsState::instance.units[iVar9].nextUnitOnTheSameTile; + } + uVar7 = (uint)SEC_RNG::instance.currentNumber2; + MACRO_CALL_MEMBER(OpenSHC::Random::RNG_Func::nextRandomNumber2, SEC_RNG::ptr)(); + if ((uVar7 & 1) == 0) { + iVar11 = (int)SEC_RNG::instance.currentNumber2; + MACRO_CALL_MEMBER(OpenSHC::Random::RNG_Func::nextRandomNumber2, SEC_RNG::ptr)(); + iVar9 = sVar3 * 8; + MACRO_CALL_MEMBER( + OpenSHC::Map::Entities::EntityState_Func::spawnProjectileEntity, DAT_EntityState::ptr)(0, + (undefined4)((int)(param_3)), 0, (int)(((uVar7 >> 4) % 0x32 + 0x32) * local_4 + sVar2 * 8), + iVar9 + (iVar11 / 0x32) * -0x32 + -0x19 + iVar11, + (int)((uint)DAT_TileMapState::instance.HeightLayer[uVar1] + (uVar7 / 1000) * -1000 + 500 + + uVar7), + (int)(sVar2 * 8 + 4), iVar9 + 4, (int)(DAT_TileMapState::instance.HeightLayer[uVar1]), + local_8, 0); + } + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + iVar9 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction] + uVar1; + if (DAT_TileMapState::instance.WalkLayer[iVar9] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar9] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar9] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar9; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar9 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction + 1] + uVar1; + if (DAT_TileMapState::instance.WalkLayer[iVar9] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar9] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar9] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar9; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar9 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction + 2] + uVar1; + if (DAT_TileMapState::instance.WalkLayer[iVar9] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar9] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar9] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar9; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar9 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction + 3] + uVar1; + if (DAT_TileMapState::instance.WalkLayer[iVar9] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar9] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar9] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar9; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (80400 < this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return (undefined4)(0); + } + } + } + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp new file mode 100644 index 0000000000..80fd4da2a0 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp @@ -0,0 +1,135 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeShort; + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049DB30 + BOOLEnum PathFindingState::checkEnemyBuildingOrDefensiveStructureWithin12Tiles(int playerID, uint x, uint y) + { + short* psVar1; + int (*paiVar2)[8]; + int bVar3; + short _building; + BuildingTypeShort _buildingType; + int _tile; + int _x; + int _y; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + bVar3 = this->searchQueue.readIndex == this->searchQueue.writeIndex; + while (true) { + if (bVar3) { + return FALSE; + } + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile < 0) { + return FALSE; + } + if (0x13a0f < _tile) { + return FALSE; + } + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + _building = DAT_TileMapState::instance.BuildingLayer[_tile]; + if (_building != 0) { + _buildingType = DAT_BuildingsState::instance.buildings[_building].buildingType; + /* + find enemy building + */ + if (_buildingType != OpenSHC::Map::Buildings::BT_PITCHDITCH + && _buildingType != OpenSHC::Map::Buildings::BT_KILLINGPIT + && DAT_GameState::instance.mapAndTime + .playerTeams[DAT_BuildingsState::instance.buildings[_building].owner] + != DAT_GameState::instance.mapAndTime.playerTeams[playerID]) { + return TRUE; + } + } + /* + find enemy wall tower or gatehouse + */ + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x100U) != 0 + && DAT_GameState::instance.mapAndTime + .playerTeams[(DAT_TileMapState::instance.WallOwnerLayer[_tile] & 7) + 1] + != DAT_GameState::instance.mapAndTime.playerTeams[playerID]) { + return TRUE; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return FALSE; + } + if (12 < this->searchQueue.currentDistance) + break; + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + int _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + bVar3 = this->searchQueue.readIndex == this->searchQueue.writeIndex; + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp new file mode 100644 index 0000000000..fadfb85e3c --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -0,0 +1,272 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" +#include "OpenSHC/Globals/SEC_RNG.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00498FD0 + uint PathFindingState::commitUnitPathPlanUsingWalkLayer(uint param_1, int param_2, int param_3) + { + int* _ptrTranslationMatrix; + int _candidateTile1; + uint uVar2; + int _candidateTile2; + uint _cp3; + int _candidateTile4; + uint _cp1; + uint uVar3; + uint _cp2; + int _candidateTile3; + uint _cp4; + int iVar4; + uint _rng; + uint uVar5; + int iVar6; + int _direction; + uint local_24; + int _tile; + int local_14; + int _y; + int _inBounds; + uint _init_10; + short _walkLayer; + if (399 < (uint)this->unitX || 399 < (uint)this->unitY + || (_inBounds = false, + DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[this->unitY * 400 + this->unitX] + == '\0')) { + return 0; + } + _tile = DAT_ViewportRenderState::instance.translationMatrix[this->unitY].addXgetTile + this->unitX; + _y = this->unitY; + if ((short)DAT_TileMapState::instance.PathConnectionLayer[_tile] == 0) { + return 0; + } + if (param_1 == 0) { + iVar6 = 80; + } else if (param_1 == 1) { + iVar6 = 200; + } else if (param_1 == 2) { + iVar6 = 500; + } else if (param_1 == 3) { + iVar6 = 1000; + } else { + iVar6 = 2000; + } + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, this)( + this->unitX, this->unitY, -1, -1, iVar6, 0); + _walkLayer = DAT_TileMapState::instance.WalkLayer[_tile]; + _rng = (uint)SEC_RNG::instance.currentNumber2; + this->searchQueue.pathPlanIndex = 0; + iVar6 = 10; + local_24 = 1; + local_14 = 10; + while (true) { + while (true) { + _init_10 = local_24; + if ((_inBounds) && (local_24 < 2)) { + return (uint)(this->searchQueue.pathPlanIndex); + } + _ptrTranslationMatrix = DAT_TileMapState::instance.directionTranslationMatrix[_y] + 1; + _direction = 8; + param_1 = local_24; + iVar4 = 2; + do { + _candidateTile1 = (*(int (*)[8])(_ptrTranslationMatrix + -1))[0] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidateTile1] == _walkLayer) { + _cp1 = (uint)DAT_TileMapState::instance.CertainPathLayer[_candidateTile1]; + if (_inBounds) { + if ((_cp1 & 0x4000) == 0 && (uVar3 = _cp1 & 0x3fff, uVar3 <= _init_10) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = uVar3 + - ((DAT_TileMapState::instance.RandomLayer[_candidateTile1] ^ _rng) & 7); + uVar5 = uVar2; + if (iVar4 + -2 == iVar6) { + uVar5 = uVar2 - 1; + } + if ((int)uVar5 < (int)param_1) { + param_1 = uVar2; + _direction = iVar4 + -2; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + iVar6 = local_14; + } + } else if ((_cp1 & 0x8000) == 0 && (uVar3 = _cp1 & 0x3fff, _init_10 <= uVar3) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile1] ^ _rng) & 7) + uVar3; + uVar5 = uVar2; + if (iVar4 + -2 == iVar6) { + uVar5 = uVar2 + 1; + } + if ((int)param_1 < (int)uVar5) { + param_1 = uVar2; + _direction = iVar4 + -2; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + iVar6 = local_14; + } + } + _candidateTile2 = *_ptrTranslationMatrix + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidateTile2] == _walkLayer) { + _cp2 = (uint)DAT_TileMapState::instance.CertainPathLayer[_candidateTile2]; + if (_inBounds) { + if ((_cp2 & 0x4000) == 0 && (uVar3 = _cp2 & 0x3fff, uVar3 <= _init_10) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = uVar3 + - ((DAT_TileMapState::instance.RandomLayer[_candidateTile2] ^ _rng) & 7); + uVar5 = uVar2; + if (iVar4 + -1 == iVar6) { + uVar5 = uVar2 - 1; + } + if ((int)uVar5 < (int)param_1) { + param_1 = uVar2; + _direction = iVar4 + -1; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + iVar6 = local_14; + } + } else if ((_cp2 & 0x8000) == 0 && (uVar3 = _cp2 & 0x3fff, _init_10 <= uVar3) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile2] ^ _rng) & 7) + uVar3; + uVar5 = uVar2; + if (iVar4 + -1 == iVar6) { + uVar5 = uVar2 + 1; + } + if ((int)param_1 < (int)uVar5) { + param_1 = uVar2; + _direction = iVar4 + -1; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + iVar6 = local_14; + } + } + _candidateTile3 = _ptrTranslationMatrix[1] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidateTile3] == _walkLayer) { + _cp3 = (uint)DAT_TileMapState::instance.CertainPathLayer[_candidateTile3]; + if (_inBounds) { + if ((_cp3 & 0x4000) == 0 && (uVar3 = _cp3 & 0x3fff, uVar3 <= _init_10) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = uVar3 + - ((DAT_TileMapState::instance.RandomLayer[_candidateTile3] ^ _rng) & 7); + uVar5 = uVar2; + if (iVar4 == iVar6) { + uVar5 = uVar2 - 1; + } + if ((int)uVar5 < (int)param_1) { + param_1 = uVar2; + _direction = iVar4; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + } + } else if ((_cp3 & 0x8000) == 0 && (uVar3 = _cp3 & 0x3fff, _init_10 <= uVar3) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile3] ^ _rng) & 7) + uVar3; + uVar5 = uVar2; + if (iVar4 == iVar6) { + uVar5 = uVar2 + 1; + } + if ((int)param_1 < (int)uVar5) { + param_1 = uVar2; + _direction = iVar4; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + } + } + _candidateTile4 = _ptrTranslationMatrix[2] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidateTile4] == _walkLayer) { + _cp4 = (uint)DAT_TileMapState::instance.CertainPathLayer[_candidateTile4]; + if (_inBounds) { + if ((_cp4 & 0x4000) == 0 && (uVar3 = _cp4 & 0x3fff, uVar3 <= _init_10) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = uVar3 + - ((DAT_TileMapState::instance.RandomLayer[_candidateTile4] ^ _rng) & 7); + uVar5 = uVar2; + if (iVar4 + 1 == iVar6) { + uVar5 = uVar2 - 1; + } + if ((int)uVar5 < (int)param_1) { + param_1 = uVar2; + _direction = iVar4 + 1; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + iVar6 = local_14; + } + } else if ((_cp4 & 0x8000) == 0 && (uVar3 = _cp4 & 0x3fff, _init_10 <= uVar3) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile4] ^ _rng) & 7) + uVar3; + uVar5 = uVar2; + if (iVar4 + 1 == iVar6) { + uVar5 = uVar2 + 1; + } + if ((int)param_1 < (int)uVar5) { + param_1 = uVar2; + _direction = iVar4 + 1; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + iVar6 = local_14; + } + } + _ptrTranslationMatrix = _ptrTranslationMatrix + 4; + iVar4 = iVar4 + 4; + } while (iVar4 < 10); + if (_inBounds) { + DAT_TileMapState::instance.CertainPathLayer[_tile] + = DAT_TileMapState::instance.CertainPathLayer[_tile] | 0x4000; + } else { + DAT_TileMapState::instance.CertainPathLayer[_tile] + = DAT_TileMapState::instance.CertainPathLayer[_tile] | 0x8000; + } + if (_direction == 8) + break; + _tile = _tile + DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction]; + _y = _y + + DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.yOffset; + if ((this->searchQueue.pathPlanIndex & 1) == 0) { + this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] = (byte)_direction; + } else { + this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] + = this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] & 0xf; + this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] + = this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] + + (byte)_direction * '\x10'; + } + this->searchQueue.pathPlanIndex = this->searchQueue.pathPlanIndex + 1; + iVar6 = _direction; + local_14 = _direction; + if (799 < (int)this->searchQueue.pathPlanIndex) { + return (uint)(this->searchQueue.pathPlanIndex); + } + } + if (param_2 == 0) { + return (uint)(this->searchQueue.pathPlanIndex); + } + if (_inBounds) + break; + _inBounds = 1; + } + return (uint)(this->searchQueue.pathPlanIndex); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp new file mode 100644 index 0000000000..80590f66ea --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp @@ -0,0 +1,333 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeShort; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + Computes the AI Zone Layer - a flood-fill from the player's keep that marks accessible areas. This creates a + "zone of control" or "accessible territory" map for strategic AI decisions. The algorithm works in + phases: Phase 1: Flood-fill through walkable/connected areas (marks tiles with value 1) Phase 2: Expand + into surrounding tiles with weighted distances based on terrain difficulty @param this - PathFindingState + object pointer @param attackedPlayerID - The player whose keep/territory to analyze @param canReachKeep - + If non-zero, limits expansion to 2000 tiles (early termination) decompilerscript: committed: 2025-01-30 + 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A4470 + void PathFindingState::computeAIZoneLayer(int attackedPlayerID, int canReachKeep, int param_3) + { + uint uVar1; + int _offsetTile; + int _direction; + int (*_pDirectionTranslation)[8]; + int* piVar3; + int _candidateTile; + BuildingTypeShort _buildingType; + int _candidateY; + short _directionOffset; + /* + === VALIDATE PLAYER HAS A KEEP === Only compute AI zones if the player has a keep (main castle) + */ + if (DAT_GameState::instance.playerDataArray[attackedPlayerID].keep.id != 0) { + /* + === INITIALIZE BFS STARTING FROM KEEP === + */ + this->searchQueue.currentDistance = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + /* + Get the keep's position (specifically the campfire tile inside the keep) + */ + this->searchQueue.yQueue[0] + = (short)DAT_GameState::instance.playerDataArray[attackedPlayerID].campground.yEntry; + this->searchQueue.tilesQueue[0] + = DAT_GameState::instance.playerDataArray[attackedPlayerID].campground.xEntry + + DAT_ViewportRenderState::instance + .translationMatrix[DAT_GameState::instance.playerDataArray[attackedPlayerID] + .campground.yEntry] + .addXgetTile; + /* + Mark the keep tile as AI Zone with value 1 (the starting point) + */ + DAT_TileMapState::instance.AIZoneLayer[this->searchQueue.tilesQueue[0]] = 1; + /* + Repurpose variable as iteration counter + */ + attackedPlayerID = 0; + /* + Update path linkage (possibly opens gates or updates navigation mesh) + */ + MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::updatePathLinkageTileMap, DAT_BuildingsState::ptr)(1); + /* + === PHASE 1: FLOOD-FILL THROUGH WALKABLE/CONNECTED AREAS === This phase marks all tiles that + are directly connected via normal pathfinding + */ + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + /* + Save iteration counter + */ + int iVar2 = attackedPlayerID; + /* + === INNER LOOP: EXPAND THROUGH CONNECTED TILES === + */ + this->searchQueue.previousReadIndex = this->searchQueue.readIndex; + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + /* + Get current tile being processed + */ + _candidateY = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + _candidateTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + /* + Check all 8 adjacent directions + */ + _direction = 0; + _pDirectionTranslation = DAT_TileMapState::instance.directionTranslationMatrix + _candidateY; + do { + _offsetTile = (*_pDirectionTranslation)[0] + _candidateTile; + /* + Add tile to AI zone if: 1. Not already marked (< 1) 2. Has path connection + (PathConnectionLayer != 0) 3. Either: a) Normal pathfinding allows movement in + this direction, OR b) There's a gate (GATEHOUSELARGE or GATEHOUSESMALL) on the + tile + */ + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' + && (short)DAT_TileMapState::instance.PathConnectionLayer[_offsetTile] != 0 + && ((DAT_TileMapState::instance.PathLinkageLayer[_candidateTile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) + != 0 + || ((DAT_TileMapState::instance.BuildingLayer[_offsetTile] != 0 + && ((_buildingType = DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_offsetTile]] + .buildingType, + _buildingType == OpenSHC::Map::Buildings::BT_GATEHOUSELARGE + || (_buildingType == OpenSHC::Map::Buildings::BT_GATEHOUSESMALL))))))) { + /* + Calculate Y offset for this direction + */ + _directionOffset + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset; + /* + Mark tile as part of AI zone (value 1 = directly accessible) + */ + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] = 1; + /* + Add to BFS queue for further expansion + */ + this->searchQueue.yQueue[this->searchQueue.writeIndex] = _directionOffset + _candidateY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _offsetTile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) + goto LAB_004a4914; + } + _direction = _direction + 1; + _pDirectionTranslation = (int (*)[8])(*_pDirectionTranslation + 1); + } while (_direction < 8); + /* + Move to next tile in queue + */ + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (80400 < this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + /* + === EARLY TERMINATION CONDITIONS === If canReachKeep is set and we've marked > 2000 + tiles, stop OR if we've marked > 6000 tiles total, stop (Performance optimization + to prevent excessive computation) + */ + if (((canReachKeep != 0) && (1999 < this->searchQueue.writeIndex)) + || 5999 < this->searchQueue.writeIndex) + goto LAB_004a4914; + } + /* + === PHASE 2: EXPAND INTO DIFFICULT TERRAIN === After marking all easily accessible tiles, + expand into harder-to-reach areas with distance penalties based on terrain type + */ + this->searchQueue.readIndex = this->searchQueue.previousReadIndex; + this->searchQueue.nextWriteIndex = this->searchQueue.writeIndex; + if (this->searchQueue.previousReadIndex != this->searchQueue.writeIndex) { + do { + _direction = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + /* + Distance = current tile's AI zone value + 1 + */ + this->searchQueue.currentDistance + = (char)DAT_TileMapState::instance.AIZoneLayer[_direction] + 1; + /* + Get movement direction offsets + */ + piVar3 + = DAT_TileMapState::instance + .directionTranslationMatrix[this->searchQueue.yQueue[this->searchQueue.readIndex]] + + 1; + /* + Process tiles in groups of 4 (unrolled loop) === PROCESS ADJACENT TILES (Unrolled + loop for 4 directions at a time) === + */ + attackedPlayerID = 2; + do { + /* + === TILE 1 === + */ + _offsetTile = (*(int (*)[8])(piVar3 + -1))[0] + _direction; + /* + Only process if: 1. Not already marked 2. No blocking terrain (0x31 = sea, + cliff, or border) 3. Either no building OR building allows passage (unknownFlag4 + == 0) + */ + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' + && (uVar1 = DAT_TileMapState::instance.LogicLayer[_offsetTile], (uVar1 & 0x31) == 0) + && (DAT_TileMapState::instance.BuildingLayer[_offsetTile] == 0 + || (DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_offsetTile]] + .unknownFlag4 + == '\0'))) { + /* + === TERRAIN-BASED DISTANCE CALCULATION === + */ + if ((uVar1 & 0x100) == 0) { + /* + Non wall Non gatehouse + */ + if ((uVar1 & 0x40000000) == 0 || iVar2 == 0) { + /* + Non moat or + */ + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance; + } else { + /* + Moat discount making fortified areas closer in AI Zone calculations + */ + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance - 1; + } + } else { + /* + wall or gatehouse This makes walls, towers, and gatehouses "farther" + strategically + */ + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance + 6; + } + } + /* + === TILE 2 (same logic as tile 1) === + */ + _offsetTile = *piVar3 + _direction; + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' + && (uVar1 = DAT_TileMapState::instance.LogicLayer[_offsetTile], (uVar1 & 0x31) == 0) + && (DAT_TileMapState::instance.BuildingLayer[_offsetTile] == 0 + || (DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_offsetTile]] + .unknownFlag4 + == '\0'))) { + if ((uVar1 & 0x100) == 0) { + if ((uVar1 & 0x40000000) == 0 || iVar2 == 0) { + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance; + } else { + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance - 1; + } + } else { + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance + 6; + } + } + /* + === TILE 3 (same logic as tile 1) === + */ + _offsetTile = piVar3[1] + _direction; + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' + && (uVar1 = DAT_TileMapState::instance.LogicLayer[_offsetTile], (uVar1 & 0x31) == 0) + && (DAT_TileMapState::instance.BuildingLayer[_offsetTile] == 0 + || (DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_offsetTile]] + .unknownFlag4 + == '\0'))) { + if ((uVar1 & 0x100) == 0) { + if ((uVar1 & 0x40000000) == 0 || iVar2 == 0) { + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance; + } else { + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance - 1; + } + } else { + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance + 6; + } + } + /* + === TILE 4 (same logic as tile 1) === + */ + _offsetTile = piVar3[2] + _direction; + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' + && (uVar1 = DAT_TileMapState::instance.LogicLayer[_offsetTile], (uVar1 & 0x31) == 0) + && (DAT_TileMapState::instance.BuildingLayer[_offsetTile] == 0 + || (DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_offsetTile]] + .unknownFlag4 + == '\0'))) { + if ((uVar1 & 0x100) == 0) { + if ((uVar1 & 0x40000000) == 0 || iVar2 == 0) { + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance; + } else { + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance - 1; + } + } else { + DAT_TileMapState::instance.AIZoneLayer[_offsetTile] + = (byte)this->searchQueue.currentDistance + 6; + } + } + piVar3 = piVar3 + 4; + attackedPlayerID = attackedPlayerID + -1; + } while (attackedPlayerID != 0); + /* + Move to next tile in queue + */ + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.nextWriteIndex); + } + /* + Increment iteration counter (alternates between 0 and 1) + */ + attackedPlayerID = iVar2 + 1; + if (1 < attackedPlayerID) { + attackedPlayerID = 0; + } + } + LAB_004a4914: + MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::updatePathLinkageTileMap, DAT_BuildingsState::ptr)(0); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp new file mode 100644 index 0000000000..4f5bc69713 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp @@ -0,0 +1,121 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049CB00 + void PathFindingState::computeNextRallyPointDestination(int unitID, int xPos, int yPos) + { + short* _pOffsets; + int _cY_2; + int (*_cY2)[8]; + int _cTile; + short _cX; + short _cY; + this->calculations = this->calculations + 1; + this->ALG_ResultTile = 0; + this->ALG_ResultY = 0; + this->ALG_ResultX = 0; + if ((uint)xPos <= 399 && (uint)yPos <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[yPos * 400 + xPos] != '\0') { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)yPos; + this->searchQueue.xQueue[0] = (short)xPos; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[yPos].addXgetTile + xPos; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_cTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _cTile && (_cTile < 0x13a10))) { + _cX = this->searchQueue.xQueue[this->searchQueue.readIndex]; + _cY = this->searchQueue.yQueue[this->searchQueue.readIndex]; + _cY_2 = (int)_cY; + if ((short)DAT_TileMapState::instance.UnitLayer[_cTile] == unitID) { + this->ALG_ResultX = (int)_cX; + this->ALG_ResultY = _cY_2; + this->ALG_ResultTile = _cTile; + return; + } + if (DAT_TileMapState::instance.OccupancyLayer[_cTile] == '\0' + && (short)DAT_TileMapState::instance.UnitLayer[_cTile] == 0) { + this->ALG_ResultX = (int)_cX; + this->ALG_ResultY = _cY_2; + this->ALG_ResultTile = _cTile; + return; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_cTile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + int _cTile2 + = DAT_TileMapState::instance.directionTranslationMatrix[_cY_2][_direction] + _cTile; + /* + 0xb1 == test against sea, rocky, and borders + */ + /* + 0x10001400 == test against building tree keep + */ + if (DAT_TileMapState::instance.WalkLayer[_cTile2] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_cTile2] & 0xb1U) == 0 + && (DAT_TileMapState::instance.LogicLayer[_cTile2] & 0x10001400U) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_cTile2] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_cTile2] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _cX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _cY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _cTile2; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp new file mode 100644 index 0000000000..53194f8da3 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp @@ -0,0 +1,199 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Units/TroopValueState.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TroopValueState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049C690 + void PathFindingState::computeTotalUnitsWithinDistance( + int playerID, int sameTeamUnits, int someLogicalTileProperty, int tile, int distance) + { + uint uVar4; + int iVar5; + int iVar6; + int* piVar7; + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + this->ALGO_TotalTroopValue = 0; + this->ALGO_TotalTroopCount = 0; + this->field34_0x64 = 0; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; + this->searchQueue.tilesQueue[0] = tile; + DAT_TileMapState::instance.CertainPathLayer[tile] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar4 < 0x13a10) { + int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int uVar2 = (short)DAT_TileMapState::instance.UnitLayer[uVar4]; + while (iVar6 = (int)(short)uVar2, iVar6 != 0) { + if (sameTeamUnits == 1) { + if (DAT_GameState::instance.mapAndTime.playerTeams[playerID] + == DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[iVar6].owner]) { + LAB_0049c7ba: + if ((DAT_UnitsState::instance.units[iVar6].owner != 0) + && (DAT_UnitsState::instance.units[iVar6].dying == 0)) { + iVar5 = MACRO_CALL_MEMBER( + OpenSHC::Map::Units::TroopValueState_Func::getValueOfTroopType, + DAT_TroopValueState::ptr)( + (OpenSHC::Map::Units::UnitType)(int)(short)DAT_UnitsState::instance.units[iVar6] + .unitType); + this->ALGO_TotalTroopValue = this->ALGO_TotalTroopValue + iVar5; + this->ALGO_TotalTroopCount = this->ALGO_TotalTroopCount + 1; + if (this->field34_0x64 == 0) { + this->field34_0x64 = iVar6; + } + } + } + } else if ((sameTeamUnits != 0) + || (DAT_GameState::instance.mapAndTime.playerTeams[playerID] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[iVar6].owner])) + goto LAB_0049c7ba; + uVar2 = DAT_UnitsState::instance.units[iVar6].nextUnitOnTheSameTile; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return; + } + if (this->searchQueue.currentDistance > distance) { + return; + } + byte bVar1 = DAT_TileMapState::instance.PathLinkageLayer[uVar4]; + iVar6 = 0; + do { + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { + if (someLogicalTileProperty == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + goto LAB_0049c880; + } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6] & bVar1) + != 0) { + LAB_0049c880: + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6 + 1] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { + if (someLogicalTileProperty == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + goto LAB_0049c918; + } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 1] + & bVar1) + != 0) { + LAB_0049c918: + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6 + 1] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6 + 2] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { + if (someLogicalTileProperty == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + goto LAB_0049c9b1; + } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 2] + & bVar1) + != 0) { + LAB_0049c9b1: + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6 + 2] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6 + 3] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { + if (someLogicalTileProperty == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + goto LAB_0049ca4a; + } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 3] + & bVar1) + != 0) { + LAB_0049ca4a: + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6 + 3] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + iVar6 = iVar6 + 4; + } while (iVar6 < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp new file mode 100644 index 0000000000..32c170fcbc --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp @@ -0,0 +1,82 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameCore.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + @param size meaning width of climb area, e.g. gate small has 3, gate large has 4 (why not 5?), ladder has 1 + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A9510 + int PathFindingState::createClimbData(int size, int buildingID, int unitID, int direction, int param_5) + { + ClimbData* pCVar1; + int _climbID; + _climbID = 1; + pCVar1 = this->climbData; + while (pCVar1 = pCVar1 + 1, pCVar1->canBeUsed != 0) { + _climbID = _climbID + 1; + if (199 < _climbID) { + return 0; + } + } + this->climbData[_climbID].canBeUsed = 1; + this->climbData[_climbID].type = size; + this->climbData[_climbID].isRecognizedByPathfinding = 0; + this->climbData[_climbID].climbDataRelated = DAT_GameCore::instance.uniqueGameObjectTracker; + DAT_GameCore::instance.uniqueGameObjectTracker = DAT_GameCore::instance.uniqueGameObjectTracker + 1; + this->climbData[_climbID].buildingID = buildingID; + this->climbData[_climbID].unitID = unitID; + if (buildingID == 0) { + if (unitID == 0) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::clearClimbData, this)(_climbID); + return _climbID; + } + /* + unitID != 0 + */ + this->climbData[_climbID].sourceUID = DAT_UnitsState::instance.units[unitID].uid; + this->climbData[_climbID].owner = (int)DAT_UnitsState::instance.units[unitID].owner; + this->climbData[_climbID].bottomXPosition = (int)DAT_UnitsState::instance.units[unitID].x; + this->climbData[_climbID].bottomYPosition = (int)DAT_UnitsState::instance.units[unitID].y; + this->climbData[_climbID].bottomTilePosition = DAT_UnitsState::instance.units[unitID].tile; + DAT_UnitsState::instance.units[unitID].wallDataID = (short)_climbID; + return _climbID; + } + /* + buildingID != 0 + */ + this->climbData[_climbID].sourceUID = DAT_BuildingsState::instance.buildings[buildingID].uid; + this->climbData[_climbID].owner = (int)DAT_BuildingsState::instance.buildings[buildingID].owner; + this->climbData[_climbID].bottomXPosition + = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; + this->climbData[_climbID].bottomYPosition + = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + this->climbData[_climbID].bottomTilePosition + = DAT_BuildingsState::instance.buildings[buildingID].currentTilePositionAdjusted; + if (size != 6) { + if (size != 5) { + if (size == 4) + goto LAB_004a95d6; + if (size != 3) { + return _climbID; + } + } + this->climbData[_climbID].ladderDirection = direction; + return _climbID; + } + LAB_004a95d6: + this->climbData[_climbID].ladderDirection = direction; + return _climbID; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp new file mode 100644 index 0000000000..f7c6cb933b --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp @@ -0,0 +1,141 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Entities/EntityType.hpp" +#include "OpenSHC/Map/Units/States/UnitState.hpp" +#include "OpenSHC/Map/Units/UnitType.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_EntityState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Entities::EntityType; + using OpenSHC::Map::Units::UnitType; + using OpenSHC::Map::Units::States::UnitState; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00497280 + BOOLEnum PathFindingState::doMoveFromTileToTile( + int unitID, int tile, int y, int direction, int param_5, int ignoreAssassinClimbing) + { + short* psVar1; + int bVar2; + uint uVar3; + int _targetTile; + uint uVar4; + int _terrainHeight2; + int _height; + int _terrainHeight; + if (param_5 != 0) { + if (param_5 == 1) { + if ((DAT_TileMapState::instance + .LogicLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile] + & 0x30U) + != 0) { + return FALSE; + } + if ((DAT_TileMapState::instance + .LogicLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile] + & 1U) + != 0) { + return FALSE; + } + } + return TRUE; + } + /* + if we cannot move in that direction from the current tile? + */ + if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[direction] + & DAT_TileMapState::instance.PathLinkageLayer[tile]) + == 0) { + _targetTile = DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile; + if (ignoreAssassinClimbing == 0) { + if (DAT_UnitsState::instance.units[unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) { + uVar3 = DAT_TileMapState::instance.LogicLayer[_targetTile]; + if ((uVar3 & 0x4a5014b1) == 0 + && (uVar4 = DAT_TileMapState::instance.LogicLayer[tile] & 0x100, + uVar4 == 0 || ((uVar3 & 0x100) == 0)) + && (uVar4 != 0 || ((uVar3 & 0x100) != 0))) { + _height = DAT_TileMapState::instance.HeightLayer[tile]; + DAT_UnitsState::instance.units[unitID].animationCycleNumber = 0; + DAT_UnitsState::instance.units[unitID].field306_0x418 = 0; + if (uVar4 == 0) { + _terrainHeight = DAT_TileMapState::instance.HeightLayer[_targetTile]; + bVar2 = DAT_TileMapState::instance.WallOwnerLayer[_targetTile]; + DAT_UnitsState::instance.units[unitID].state.generic + = OpenSHC::Map::Units::States::US_ASSASSIN_THROWING_HOOK; + DAT_UnitsState::instance.units[unitID].assassinHeightDifference + = (ushort)_terrainHeight - (ushort)_height; + DAT_UnitsState::instance.units[unitID].assassinClimbingUpUnk_OR_previousFacingDirection + = 1; + DAT_UnitsState::instance.units[unitID].ownerOfAssassinScaledObject = (bVar2 & 7) + 1; + } else { + _terrainHeight2 = DAT_TileMapState::instance.HeightLayer[_targetTile]; + DAT_UnitsState::instance.units[unitID].state.generic + = OpenSHC::Map::Units::States::US_ASSASSIN_START_CLIMBING_DOWN; + DAT_UnitsState::instance.units[unitID].assassinHeightDifference + = (ushort)_height - (ushort)_terrainHeight2; + DAT_UnitsState::instance.units[unitID].assassinClimbingUpUnk_OR_previousFacingDirection + = 0; + } + if (DAT_UnitsState::instance.units[unitID].assassinHeightDifference < 0) { + DAT_UnitsState::instance.units[unitID].assassinHeightDifference = 0; + } + return TRUE; + } + return FALSE; + } + } else { + uVar3 = DAT_TileMapState::instance.LogicLayer[_targetTile]; + if ((uVar3 & 0x40000000) != 0) { + return TRUE; + } + if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x40000000U) != 0 && (uVar3 & 0x4a5014b1) == 0) { + return ~(uVar3 >> 8) & TRUE; + } + } + } else { + if ((DAT_EntityState::instance.fireCount == 0) + || (DAT_UnitsState::instance.units[unitID].field295_0x40a != 0)) { + DAT_UnitsState::instance.units[unitID].counter = 0; + return TRUE; + } + if (DAT_TileMapState::instance + .EntityLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile] + == 0) { + return TRUE; + } + if (DAT_EntityState::instance + .entityArray[DAT_TileMapState::instance.EntityLayer + [DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile]] + .entityType + != OpenSHC::Map::Entities::ET_FIRE) { + return TRUE; + } + if ((DAT_TileMapState::instance.EntityLayer[tile] != 0) + && (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[tile]].entityType + == OpenSHC::Map::Entities::ET_FIRE)) { + return TRUE; + } + DAT_UnitsState::instance.units[unitID].counter = DAT_UnitsState::instance.units[unitID].counter + 1; + DAT_UnitsState::instance.units[unitID].field280_0x3f4 = 5; + DAT_UnitsState::instance.units[unitID].field295_0x40a = 1; + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp new file mode 100644 index 0000000000..0a8f252339 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp @@ -0,0 +1,130 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A9B20 + dword PathFindingState::doPathfinding(int param_1, int param_2) + { + BOOLEnum BVar3; + ushort uVar1 = DAT_TileMapState::instance.PathConnectionLayer + [DAT_ViewportRenderState::instance.translationMatrix[this->destinationY].addXgetTile + + this->destinationX]; + if (DAT_TileMapState::instance.PathConnectionLayer + [DAT_ViewportRenderState::instance.translationMatrix[this->unitY].addXgetTile + this->unitX] + != uVar1 + && this->climbIsIllegal == 0 && this->allAssassinsUnk == 0) { + if (uVar1 == 0) { + return (dword)(0); + } + dword dVar2 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::findConnectingAreaBetweenTwoAreas, this)(param_1, + (dword)((int)((short)DAT_TileMapState::instance.PathConnectionLayer + [DAT_ViewportRenderState::instance.translationMatrix[this->unitY].addXgetTile + + this->unitX])), + (dword)((int)((short)uVar1))); + if (dVar2 == 0) { + return (dword)(0); + } + } + this->searchQueue.pathPlanIndex = 0; + this->field43_0x7c = 1; + if (this->climbIsIllegal == 0 && this->allAssassinsUnk == 0 + && (BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::tracePathPlanToDestinationViaUnoccupiedTiles, + this)(this->unitX, (uint)(this->unitY), (uint)(this->destinationX), (uint)(this->destinationY)), + BVar3 != FALSE)) { + this->DAT_Easy = this->DAT_Easy + 1; + return (dword)(this->searchQueue.pathPlanIndex); + } + this->DAT_Hard = this->DAT_Hard + 1; + this->field43_0x7c = 0; + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, + DAT_DirectionAlgorithmState::ptr)(this->unitX, this->unitY, this->destinationX, this->destinationY); + int iVar4 = (DAT_DirectionAlgorithmState::instance.distanceHigh + 4) + * (DAT_DirectionAlgorithmState::instance.distanceHigh + 4) * 10; + this->searchQueue.pathPlanIndex = 0; + if (this->notAllAssassinsUnk == 0) { + if (this->allAssassinsUnk == 0) { + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, this)( + this->unitX, this->unitY, this->destinationX, this->destinationY, iVar4, 0); + } else { + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::findLinkageBasedPathOrWalkRadius, this)( + this->unitX, (uint)(this->unitY), this->destinationX, this->destinationY, iVar4, FALSE); + } + if (BVar3 != FALSE) + goto LAB_004a9cdd; + if (this->allAssassinsUnk == 0) { + if (this->climbIsIllegal == 0) + goto LAB_004a9cce; + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::findPathUsingClimbingWithHeightMargin16, this)( + this->unitX, (uint)(this->unitY), (uint)(this->destinationX), (uint)(this->destinationY), + 100000, FALSE); + } else { + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::pathFindingWithBuildingsIncluded, this)( + this->unitX, (uint)(this->unitY), (uint)(this->destinationX), (uint)(this->destinationY), + 100000, 0); + } + } else { + LAB_004a9cce: + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::findLinkageBasedPathOrWalkRadius, this)( + this->unitX, (uint)(this->unitY), this->destinationX, this->destinationY, 100000, FALSE); + } + if (BVar3 == FALSE) { + return (dword)(0); + } + LAB_004a9cdd: + if (this->allAssassinsUnk == 0) { + if (this->climbIsIllegal == 0) { + iVar4 = 1; + } else { + iVar4 = 2; + } + } else { + iVar4 = 3; + } + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::traceAndCommitPathPlan, this)( + this->unitX, (uint)(this->unitY), (uint)(this->destinationX), (uint)(this->destinationY), iVar4); + if ((param_2 == 0) && (this->field49_0x94 != 0)) { + this->searchQueue.pathPlanIndex = 0; + iVar4 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::calculatePathKeepAndWallsGatesNotAllowed, this)( + this->unitX, this->unitY, this->destinationX, this->destinationY, 100000); + if (iVar4 != 0) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::traceAndCommitPathPlan, this)( + this->unitX, (uint)(this->unitY), (uint)(this->destinationX), (uint)(this->destinationY), 1); + return (dword)(this->searchQueue.pathPlanIndex); + } + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findLinkageBasedPathOrWalkRadius, + this)(this->unitX, (uint)(this->unitY), this->destinationX, this->destinationY, 100000, FALSE); + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::traceAndCommitPathPlan, this)( + this->unitX, (uint)(this->unitY), (uint)(this->destinationX), (uint)(this->destinationY), 1); + } + return (dword)(this->searchQueue.pathPlanIndex); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp new file mode 100644 index 0000000000..9fa8e56355 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp @@ -0,0 +1,103 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049EDF0 + BOOLEnum PathFindingState::findAIZoneWithFlags(int maxDistance, uint x, uint y, undefined4 aiInfoFlags) + { + int _candidate; + int _tile; + this->calculations = this->calculations + 1; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _tile && (_tile < 0x13a10))) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return FALSE; + } + if (this->searchQueue.currentDistance > maxDistance) { + return FALSE; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + if ((DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) + != 0 + && (_candidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + _tile, + DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration)) { + if ((DAT_TileMapState::instance.AIInfoLayer[_candidate] & (byte)aiInfoFlags) != 0) { + this->ALG_ResultY = (int)sVar2; + this->ALG_ResultX = (int)sVar1; + return TRUE; + } + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return FALSE; + } + } + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp new file mode 100644 index 0000000000..9acf760a8f --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp @@ -0,0 +1,183 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Units/UnitsState.func.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A3220 + BOOLEnum PathFindingState::findAccessibleWallAndNearbyFreeTile( + uint unitID, int tile, int* pFreeTile, int* pDefensesTile) + { + uint uVar2; + int _candidateNorthOrSouth; + uint _tile; + this->searchGeneration = this->searchGeneration + 1; + this->calculations = this->calculations + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.yQueue[0] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; + this->searchQueue.xQueue[0] = (short)tile + - (short)DAT_ViewportRenderState::instance.translationMatrix[this->searchQueue.yQueue[0]].addXgetTile; + this->searchQueue.tilesQueue[0] = tile; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + DAT_TileMapState::instance.CertainPathLayer[tile] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < (int)_tile && ((int)_tile < 0x13a10))) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return FALSE; + } + if (0xc < (int)this->searchQueue.currentDistance) { + return FALSE; + } + if (3 < (int)this->searchQueue.currentDistance + && (DAT_TileMapState::instance.LogicLayer[_tile] & 0x100U) != 0) { + /* + wall or gatehouse (or tower?) + */ + uVar2 = MACRO_CALL_MEMBER(OpenSHC::Map::Units::UnitsState_Func::findFreeTileNearby, + DAT_UnitsState::ptr)(unitID, _tile); + *pFreeTile = uVar2; + if (uVar2 != 0) { + *pDefensesTile = _tile; + return TRUE; + } + } + /* + every other unit searches in a different direction + */ + uVar2 = (unitID & 1) * 4 + 1; + int local_8 = 2; + do { + uint _direction = uVar2 - 1 & 7; + _candidateNorthOrSouth + = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidateNorthOrSouth] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_candidateNorthOrSouth] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_candidateNorthOrSouth] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidateNorthOrSouth] + = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidateNorthOrSouth; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + uint uVar4 = uVar2 & 7; + int iVar3 = DAT_TileMapState::instance.directionTranslationMatrix[_y][uVar4] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar3] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar3] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar3] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[uVar4] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[uVar4] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar3; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + uVar4 = uVar2 + 1 & 7; + iVar3 = DAT_TileMapState::instance.directionTranslationMatrix[_y][uVar4] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar3] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar3] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar3] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[uVar4] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[uVar4] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar3; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + uVar4 = uVar2 + 2 & 7; + iVar3 = DAT_TileMapState::instance.directionTranslationMatrix[_y][uVar4] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar3] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar3] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar3] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[uVar4] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[uVar4] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar3; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + uVar2 = uVar2 + 4; + local_8 = local_8 + -1; + } while (local_8 != 0); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return FALSE; + } + } + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp new file mode 100644 index 0000000000..e05404c12c --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -0,0 +1,340 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TroopValueState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + * Finds an appropriate location for placing a siege tent near a target position. * Uses breadth-first search + * (BFS) to explore tiles radiating outward from the starting position. * * @param this - + * PathFindingState object pointer * @param distance? - Maximum search distance (typically 100 or 200 tiles) + * * @param x - Starting X coordinate (0-399) * @param y - Starting Y coordinate (0-399) * @param + * selectionID - ID for selected unit/object (unused in function body) * @param requiredDistanceFromAIZone - + * Exact match required for AI zone tactical distance if nonzero * @param playerID - Current player's ID + * * @return Tile index of valid siege tent location, or 0 if none found decompilerscript: committed: + * 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049F7D0 + dword PathFindingState::findAppropriateLocationForSiegeTent( + int distanceUnk, uint x, uint y, undefined4 selectionID, uint requiredDistanceFromAIZone, int playerID) + { + int* piVar4; + int iVar5; + int iVar6; + dword _offsetTile; + uint uVar7; + uint uVar8; + int local_c; + int _tile; + /* + === INITIAL VALIDATION === Check if coordinates are within map bounds (400x400) and if the tile is + walkable + */ + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + /* + Invalid position - out of bounds or unwalkable + */ + return (dword)(0); + } + /* + === PATHFINDING STATE INITIALIZATION === Increment calculation counter (for profiling/debugging) + */ + this->calculations = this->calculations + 1; + /* + Increment the "active flag" value used to mark visited tiles this search iteration + */ + this->searchGeneration = this->searchGeneration + 1; + /* + If flag value exceeds 32000, reset to 1 and clear the entire WalkLayer This prevents overflow and avoids + having to clear the layer every search + */ + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + /* + Clear 160800 bytes 80400 short values + */ + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + /* + === BFS QUEUE INITIALIZATION === Initialize BFS queue indices Current tile being processed + */ + this->searchQueue.readIndex = 0; + /* + Next free slot in queue + */ + this->searchQueue.writeIndex = 1; + /* + Starting distance + */ + this->searchQueue.currentDistance = 1; + /* + Add starting position to queue + */ + this->searchQueue.yQueue[0] = (short)y; + /* + Convert 2D coordinates to 1D tile index + */ + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + /* + Mark starting tile with distance 1 + */ + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + /* + Mark as visited with current active flag value + */ + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + /* + === MAIN BFS LOOP === Continue while there are tiles in the queue to process + */ + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _tile && (_tile < 0x13a10))) { + /* + Get Y coordinate of current tile being processed + */ + short sVar1 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + /* + Get distance from start for current tile + */ + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + /* + Safety check: if distance exceeds max tile count, abort + */ + if (80400 < this->searchQueue.currentDistance) { + return (dword)(0); + } + /* + If we've exceeded search radius, stop searching + */ + if (this->searchQueue.currentDistance > distanceUnk) { + return (dword)(0); + } + /* + === EXPLORE 8 ADJACENT TILES === Check all 8 cardinal/diagonal directions from current tile + */ + y = 0; + do { + /* + Check if movement is possible in this direction (using bitflag for direction y) Check if + adjacent tile hasn't been visited this iteration + */ + if ((DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[y]) + != 0 + && (_offsetTile = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][y] + _tile, + DAT_TileMapState::instance.WalkLayer[_offsetTile] != this->searchGeneration)) { + int bVar2 = 1; + /* + === AI Zone DISTANCE CHECK === If specified (i.e. not 0), then the strategic distance of + the current tile must be exactly that value + */ + if (requiredDistanceFromAIZone != 0 + && (bVar2 = true, + *(byte*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + + playerID * 0x177bc + -0x10) + * 0x13a10 + + 0x1ee2998 + _offsetTile) + != requiredDistanceFromAIZone)) { + bVar2 = 0; + } + /* + === SIEGE TENT PLACEMENT VALIDATION === Only check for valid placement if distance > 4 + (minimum spacing requirement) + */ + if (4 < this->searchQueue.currentDistance + && (short)DAT_TileMapState::instance.UnitLayer[_offsetTile] == 0 && bVar2) { + /* + Get height of candidate tile + */ + uVar7 = (uint)DAT_TileMapState::instance.HeightLayer[_offsetTile]; + iVar6 = 0; + local_c = 0; + /* + Get pointer to movement direction offsets for checking surrounding tiles Track + minimum height in surrounding area + */ + x = uVar7; + /* + === CHECK 8 SURROUNDING TILES FOR TENT PLACEMENT === Loop checks tiles in groups of + 4 for optimization + */ + do { + /* + Check first tile in group + */ + iVar5 = DAT_TileMapState::instance + .directionTranslationMatrix[DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[y] + .int_.yOffset + + (int)sVar1][local_c] + + _offsetTile; + /* + Disqualify if tile has: impassable terrain, units, or buildings 0x4a7014b1 + checks for: sea, border, border_edge, rocky, building, tree, river, ford, + crenel wall impassible, farm field hop tree, farm field dairy fence, moat, farm + */ + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x4a7014b1U) != 0 + || (DAT_TileMapState::instance.LogicLayer[iVar5] & 4U) != 0 + || (short)DAT_TileMapState::instance.UnitLayer[iVar5] != 0 + || DAT_TileMapState::instance.BuildingLayer[iVar5] != 0) + break; + /* + Track height variation (for flatness check) + */ + uint uVar3 = (uint)DAT_TileMapState::instance.HeightLayer[iVar5]; + uVar8 = uVar3; + if ((uVar3 <= uVar7) && (uVar8 = uVar7, uVar3 < x)) { + /* + Update minimum height + */ + x = uVar3; + } + uVar7 = uVar8; + /* + Update maximum height Repeat checks for tiles 2, 3, and 4 in the group (Pattern + repeats with piVar4[0], + DAT_TileMapState::instance.directionTranslationMatrix[DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[y] .int_.yOffset + (int)sVar1][local_c + 2], + DAT_TileMapState::instance.directionTranslationMatrix[DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[y] .int_.yOffset + (int)sVar1][local_c + 3]) + Each tile checks: LogicLayer, UnitLayer, BuildingLayer, HeightLayer + */ + iVar5 = DAT_TileMapState::instance + .directionTranslationMatrix[DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[y] + .int_.yOffset + + (int)sVar1][local_c + 1] + + _offsetTile; + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x4a7014b1U) != 0 + || (DAT_TileMapState::instance.LogicLayer[iVar5] & 4U) != 0 + || (short)DAT_TileMapState::instance.UnitLayer[iVar5] != 0 + || DAT_TileMapState::instance.BuildingLayer[iVar5] != 0) { + iVar6 = iVar6 + 1; + break; + } + uVar3 = (uint)DAT_TileMapState::instance.HeightLayer[iVar5]; + uVar8 = uVar3; + if ((uVar3 <= uVar7) && (uVar8 = uVar7, uVar3 < x)) { + x = uVar3; + } + uVar7 = uVar8; + iVar5 = DAT_TileMapState::instance + .directionTranslationMatrix[DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[y] + .int_.yOffset + + (int)sVar1][local_c + 2] + + _offsetTile; + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x4a7014b1U) != 0 + || (DAT_TileMapState::instance.LogicLayer[iVar5] & 4U) != 0 + || (short)DAT_TileMapState::instance.UnitLayer[iVar5] != 0 + || DAT_TileMapState::instance.BuildingLayer[iVar5] != 0) { + iVar6 = iVar6 + 2; + break; + } + uVar3 = (uint)DAT_TileMapState::instance.HeightLayer[iVar5]; + uVar8 = uVar3; + if ((uVar3 <= uVar7) && (uVar8 = uVar7, uVar3 < x)) { + x = uVar3; + } + iVar5 = DAT_TileMapState::instance + .directionTranslationMatrix[DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[y] + .int_.yOffset + + (int)sVar1][local_c + 3] + + _offsetTile; + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x4a7014b1U) != 0 + || (DAT_TileMapState::instance.LogicLayer[iVar5] & 4U) != 0 + || (short)DAT_TileMapState::instance.UnitLayer[iVar5] != 0 + || DAT_TileMapState::instance.BuildingLayer[iVar5] != 0) { + iVar6 = iVar6 + 3; + uVar7 = uVar8; + break; + } + uVar3 = (uint)DAT_TileMapState::instance.HeightLayer[iVar5]; + uVar7 = uVar3; + if ((uVar3 <= uVar8) && (uVar7 = uVar8, uVar3 < x)) { + x = uVar3; + } + local_c = local_c + 4; + iVar6 = iVar6 + 4; + } while (local_c < 8); + /* + === FINAL VALIDATION === If all 8 surrounding tiles are clear (iVar6 == 8) AND + terrain is relatively flat (height difference < 12) + */ + if (iVar6 == 8 && (int)(uVar7 - x) < 0xc) { + /* + FOUND VALID LOCATION! + */ + return (dword)(_offsetTile); + } + } + /* + === ADD TILE TO BFS QUEUE === Mark this tile's distance (current distance + 1) + */ + DAT_TileMapState::instance.CertainPathLayer[_offsetTile] + = (short)this->searchQueue.currentDistance + 1; + /* + Mark as visited + */ + DAT_TileMapState::instance.WalkLayer[_offsetTile] = (short)this->searchGeneration; + /* + Add Y coordinate to queue + */ + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[y].short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _offsetTile; + /* + Increment queue write position + */ + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + /* + Move to next direction + */ + y = y + 1; + /* + Process all 8 directions + */ + } while ((int)y < 8); + /* + === ADVANCE TO NEXT TILE IN QUEUE === + */ + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (80400 < this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + /* + Check if queue is empty (read position caught up to write position) + */ + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return (dword)(0); + } + } + } + /* + No valid location found + */ + return (dword)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp new file mode 100644 index 0000000000..562374c8f4 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp @@ -0,0 +1,116 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Units/TroopValueState.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_TroopValueState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Type propagation algorithm not settling + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049F040 + int PathFindingState::findArcherRelatedAttackInfoIndex(int max, uint x, uint y, int tribeID) + { + int iVar4; + int _candidate; + int _tile; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return 0; + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _tile && (_tile < 0x13a10))) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return 0; + } + if ((int)this->searchQueue.currentDistance > max) { + return 0; + } + for (int iVar5 = 0; iVar5 < 8; iVar5 = iVar5 + 1) { + if ((DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar5]) + != 0 + && (_candidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar5] + _tile, + DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration)) { + if (4 < (int)this->searchQueue.currentDistance + && (DAT_TileMapState::instance.AIInfoLayer[_candidate] & 0x10) != 0 + && (iVar4 = MACRO_CALL_MEMBER( + OpenSHC::Map::Units::TroopValueState_Func::findOrReserveArcherPointSlot, + DAT_TroopValueState::ptr)(_candidate), + iVar4 != 0) + && iVar4 != DAT_TribesState::instance.tribes[tribeID].archerRelated + && iVar4 != DAT_TribesState::instance.tribes[tribeID].archerRelated2 + && DAT_TroopValueState::instance.attackInfo.arch2ValuesArray[iVar4 * 2 + 0x3eb].tile + == 0 + && DAT_TroopValueState::instance.attackInfo.arch2ValuesArray[iVar4 * 2 + 0x3ea] + .buildingID + == 0) { + return iVar4; + } + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + short sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar5] + .short_.xOffset; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar5] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return 0; + } + } + } + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp new file mode 100644 index 0000000000..bf5182e56f --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp @@ -0,0 +1,101 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Location/Point8IntXY.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8IntXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + Checks all cardinal neighbours of target tile (param_4, param_5) for tiles that are height-compatible + (within param_5 height margin) and navigable from (param_2, param_3) via + calculateCanPlayerUnitsNavigateToAreaFromArea. Uses calcApproxEuclideanDistance to pick the closest valid + neighbour. Stores the result in PathFindingState.climbX/climbY. Returns 1 if a suitable tile was found, 0 + otherwise. renamed by: Claude Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A5DA0 + undefined4 PathFindingState::findBestAdjacentClimbTileToTarget( + int param_1, uint param_2, uint param_3, uint param_4, uint param_5) + { + ushort uVar1; + int iVar2; + int (*paiVar3)[8]; + uint uVar4; + int iVar5; + int iVar6; + int* piVar7; + uint local_18; + int local_10; + undefined4 local_8; + if (399 < param_2 || 399 < param_3 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { + return (undefined4)(0); + } + if (param_4 <= 399 && param_5 <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_5 * 400 + param_4] != '\0') { + iVar5 = DAT_ViewportRenderState::instance.translationMatrix[param_5].addXgetTile + param_4; + local_18 = (uint)DAT_TileMapState::instance.HeightLayer[iVar5]; + uVar1 + = DAT_TileMapState::instance + .PathConnectionLayer[DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + + param_2]; + local_8 = 0; + local_10 = 1000; + if (DAT_TileMapState::instance.BuildingLayer[iVar5] != 0) { + iVar2 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar5]); + local_18 = local_18 + iVar2; + } + paiVar3 = DAT_TileMapState::instance.directionTranslationMatrix + param_5; + piVar7 = &DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[0].int_.yOffset; + do { + iVar6 = (*paiVar3)[0] + iVar5; + iVar2 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::calculateCanPlayerUnitsNavigateToAreaFromArea, + this)(param_1, (dword)((int)((short)uVar1)), + (dword)((int)((short)DAT_TileMapState::instance.PathConnectionLayer[iVar6])), 0); + if (iVar2 != 0) { + uVar4 = (uint)DAT_TileMapState::instance.HeightLayer[iVar6]; + if (DAT_TileMapState::instance.BuildingLayer[iVar6] != 0) { + iVar2 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar6]); + uVar4 = uVar4 + iVar2; + } + if ((int)local_18 <= (int)(uVar4 + 0x10) && (int)(uVar4 - 0x10) <= (int)local_18 + && (MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, + DAT_DirectionAlgorithmState::ptr)(param_2, (int)(param_3), + (int)(((Point8IntXY*)(piVar7 + -1))->xOffset + param_4), (int)(*piVar7 + param_5)), + DAT_DirectionAlgorithmState::instance.distanceHigh < local_10)) { + local_10 = DAT_DirectionAlgorithmState::instance.distanceHigh; + this->climbX = ((Point8IntXY*)(piVar7 + -1))->xOffset + param_4; + this->climbY = *piVar7 + param_5; + local_8 = 1; + } + } + paiVar3 = (int (*)[8])(*paiVar3 + 1); + piVar7 = piVar7 + 2; + } while ((int)piVar7 < 0xb4908c); + return (undefined4)(local_8); + } + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp new file mode 100644 index 0000000000..2b6c9f88e7 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -0,0 +1,217 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Navigation.func.hpp" +#include "OpenSHC/Game/GameMode.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Game::GameMode; + + /* + WARNING: Enum "DPSEND_EnumInt": Some values do not have unique names + */ + /* + WARNING: Enum "DPERRInt": Some values do not have unique names + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + BFS from (param_2, param_3) up to distance param_1, scoring enemy buildings and walls owned by player + param_7. Buildings score higher for defensive structures (0x400 flag), distance, and fire state. Walls are + scored by height difference from base terrain. The best-scoring tile coordinates are written to ALG_TargetX, + ALG_TargetY, and ALG_TargetTile. Height traversal cost is weighted in 3 tiers based on param_5. renamed + by: Claude Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A6010 + void PathFindingState::findBestAttackTargetTileWithHeightAndOwner(int param_1, uint param_2, uint param_3, + int param_4, int param_5, int param_6, int param_7, int param_8, int param_9) + { + short sVar5; + int iVar7; + int iVar9; + int (*paiVar12)[3]; + int local_20; + int local_14; + int local_10; + uint local_c; + uint local_8; + local_14 = -1; + local_10 = -1; + local_c = 0xffffffff; + this->calculations = this->calculations + 1; + local_20 = 1000000; + this->ALG_TargetTile = 0; + this->ALG_TargetY = 0; + this->ALG_TargetX = 0; + if (param_2 > 399 || param_3 > 399 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { + return; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.yQueue[0] = (short)param_3; + this->searchQueue.xQueue[0] = (short)param_2; + int iVar6 = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; + this->searchQueue.tilesQueue[0] = iVar6; + DAT_TileMapState::instance.CertainPathLayer[iVar6] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + uint uVar10 = (uint)DAT_TileMapState::instance.HeightLayer[iVar6]; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + do { + uint uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (0x13a0f < uVar4) + break; + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + iVar6 = (int)sVar2; + uint uVar8 = DAT_TileMapState::instance.LogicLayer[uVar4]; + uint uVar11 = (uint) * (byte*)(param_7 * 0x13a10 + 0x1ee2998 + uVar4); + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; + if (this->searchQueue.currentDistance <= param_1) { + if ((DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY) + && (7 < param_6)) { + uVar11 = 1; + } + if ((uVar8 & 2) == 0) { + if ((uVar8 & 0x10100) == 0 || uVar11 == 0 || param_8 <= (int)uVar11) { + if ((uVar8 & 0x10000400) != 0 && uVar11 != 0 && (int)uVar11 < param_8 + && (iVar9 = (int)DAT_TileMapState::instance.BuildingLayer[uVar4], + iVar9 != 0 + && (DAT_BuildingDefinedData::instance.BuildingTypeHasHealth + [(short)DAT_BuildingsState::instance.buildings[iVar9].buildingType] + != 0)) + && DAT_BuildingsState::instance.buildings[iVar9].owner == param_7 + && (param_9 == 0 + || ((iVar7 = MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func:: + getBuildingFlammabilityFactor, + DAT_BuildingsState::ptr)(iVar9), + iVar7 != 0 + && (DAT_BuildingsState::instance.buildings[iVar9].fireDuration + == 0))))) { + iVar9 = 0x96; + if ((uVar8 & 0x400) == 0) { + iVar9 = 0x4b; + } + if (this->searchQueue.currentDistance < 1) { + iVar9 = 100000; + } else if (this->searchQueue.currentDistance < 0x10) { + iVar9 = (iVar9 + -100) * this->searchQueue.currentDistance + 0x5dc; + } else { + iVar9 = this->searchQueue.currentDistance * iVar9; + } + goto LAB_004a62e3; + } + } else if ((DAT_TileMapState::instance.WallOwnerLayer[uVar4] & 7) + 1 == param_7 + && param_9 == 0) { + iVar9 = (uint)DAT_TileMapState::instance.HeightLayer[uVar4] + - (uint)DAT_TileMapState::instance.DefaultHeightLayer[uVar4]; + if (this->searchQueue.currentDistance < 1) { + iVar9 = 100000; + } else if (this->searchQueue.currentDistance < 0x10) { + iVar9 = (0x14 - this->searchQueue.currentDistance) * 300 + iVar9; + } else { + iVar9 = this->searchQueue.currentDistance * 100 + iVar9; + } + LAB_004a62e3: + if (iVar9 < local_20 + && (iVar7 = MACRO_CALL(OpenSHC::Map::Navigation_Func::calcApproxEuclideanDistance)( + param_2, (int)(sVar1), (int)(param_3), iVar6), + iVar7 <= param_1)) { + local_20 = iVar9; + local_14 = (int)sVar1; + local_10 = iVar6; + local_c = uVar4; + } + } + } + local_8 = ((int)(char)this->searchQueue.currentDistance & 1U) * 2 | 1; + paiVar12 = DAT_ClimbLogicDefinedData::instance.field13_0x13c + param_4; + do { + iVar9 = (*paiVar12)[0]; + iVar7 = DAT_TileMapState::instance.directionTranslationMatrix[iVar6][iVar9] + uVar4; + uVar8 = DAT_TileMapState::instance.LogicLayer[iVar7]; + if (DAT_TileMapState::instance.WalkLayer[iVar7] != this->searchGeneration + && (uVar8 & 0x30) == 0) { + if ((uVar8 & 0x10000400) == 0) { + if ((uVar8 & 0x100) == 0) { + uVar8 = (uint)DAT_TileMapState::instance.HeightLayer[iVar7]; + if ((int)uVar8 <= (int)(uVar10 + param_5)) + goto LAB_004a63f4; + } else if ((DAT_TileMapState::instance.WallOwnerLayer[iVar7] & 7) + 1 == param_7) { + uVar8 = (uint)DAT_TileMapState::instance.HeightLayer[iVar7]; + LAB_004a63f4: + if ((int)((param_5 * 2) / 3 + uVar10) < (int)uVar8) { + sVar5 = 3; + } else { + sVar5 = ((int)(param_5 / 3 + uVar10) < (int)uVar8) + 1; + } + short sVar3 + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar9] + .short_.xOffset; + DAT_TileMapState::instance.CertainPathLayer[iVar7] + = (short)this->searchQueue.currentDistance + sVar5; + DAT_TileMapState::instance.WalkLayer[iVar7] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar9] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar7; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } else { + int buildingID = (int)DAT_TileMapState::instance.BuildingLayer[iVar7]; + if ((buildingID != 0) + && (DAT_BuildingsState::instance.buildings[buildingID].owner == param_7)) { + uVar8 = MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func:: + getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)(buildingID); + goto LAB_004a63f4; + } + } + } + paiVar12 = (int (*)[3])(*paiVar12 + 1); + local_8 = local_8 - 1; + } while (local_8 != 0); + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + if (local_14 != -1) { + this->ALG_TargetX = local_14; + this->ALG_TargetY = local_10; + this->ALG_TargetTile = local_c; + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp new file mode 100644 index 0000000000..d74032f5ac --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp @@ -0,0 +1,119 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Entities/EntityType.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_EntityState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TroopValueState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Entities::EntityType; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + BFS from (param_1, param_2), scores reachable tiles against a hack values array (indexed by param_3) and a + target zone value (param_4). Returns the tile index with the lowest combined path cost and terrain cost + weighting. Used to select the optimal attack position for a unit approaching a target zone. renamed by: + Claude Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A01D0 + dword PathFindingState::findBestAttackTileByPathCost(uint param_1, uint param_2, int param_3, uint param_4) + { + int iVar1; + dword dVar4 = 1000; + int local_4 = 1000; + dword local_8 = 0; + if (param_1 > 399 || param_2 > 399 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_2 * 400 + param_1] == '\0') { + return (dword)(dVar4); + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)param_2; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[param_2].addXgetTile + param_1; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + dVar4 = local_8; + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + int iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (iVar3 < 0) { + return (dword)(local_8); + } + if (0x13a0f < iVar3) { + return (dword)(local_8); + } + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar3]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return (dword)(local_8); + } + for (int iVar5 = 0; iVar5 < 8; iVar5 = iVar5 + 1) { + if ((DAT_TileMapState::instance.PathLinkageLayer[iVar3] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar5]) + != 0 + && (dVar4 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar5] + iVar3, + DAT_TileMapState::instance.WalkLayer[dVar4] != this->searchGeneration)) { + if (((DAT_TileMapState::instance.EntityLayer[dVar4] == 0) + || (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[dVar4]] + .entityType + != OpenSHC::Map::Entities::ET_FIRE)) + && *(byte*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + + param_3 * 0x177bc + -0x10) + * 0x13a10 + + 0x1ee2998 + dVar4) + == param_4) { + if ((10 < (int)this->searchQueue.currentDistance) && (local_8 != 0)) { + return (dword)(local_8); + } + if ((6 < (int)this->searchQueue.currentDistance) + && (iVar1 = this->searchQueue.currentDistance + + (uint)DAT_TileMapState::instance.SEC_TileMap1104[dVar4] * 3, + iVar1 < local_4)) { + local_8 = dVar4; + local_4 = iVar1; + } + } + DAT_TileMapState::instance.CertainPathLayer[dVar4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[dVar4] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar5].short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = dVar4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + dVar4 = local_8; + } + return (dword)(dVar4); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp new file mode 100644 index 0000000000..8562452bac --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp @@ -0,0 +1,271 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Navigation::Algorithms::XYPair; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + Function Summary: Find Building Access Point This function solves the problem: "Where should a unit walk to + interact with this building?" What It Does: Phase 1: Find All Valid Access Points Iterates through + predefined perimeter positions around the building Validates each position with three checks: Height + Check #1: Access tile within 32 units of building foundation Navigation Check: Unit can path to this area + Height Check #2: Access tile within 16 units of building's terrain height Phase 2: Choose Closest + Valid Point 3. Calculates distance from unit to each valid access point 4. Returns the closest one * + Finds the best accessible tile for a unit to approach a building. * This function determines where a unit + should walk to interact with a building * * Algorithm: * 1. Get all potential access points around + the building perimeter * 2. Filter by height compatibility (< 32 units from building base, < 16 from + terrain) * 3. Filter by navigation area connectivity * 4. Choose the closest valid access point to the + unit * * @param this - PathFindingState object pointer * @param unitID - ID of the unit trying to + access the building * @param buildingID - ID of the target building * @param param_3 - Output parameter: + returns the building tile adjacent to access point * @return Tile index of best access point, or 0 if none + found decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A8860 + int PathFindingState::findBuildingAccessPoint(int unitID, int buildingID, int* pResultTile) + { + int _canNav; + uint _heightDiff2; + int _candidate2; + XYPair* pXVar1; + uint uVar2; + int _closestDistance; + int _closestTile; + int _entranceCandidate; + int _counter; + int _accessibleIndex; + int _validAccessPointsCount; + int _limit; + int _pairsOfAccessAndAdjacent[200][2]; + int _accessibleTilesCount; + int _yOffset; + byte _buidingDefHeight; + uint _buildingSize; + byte _cHeight; + ushort _unitArea; + short _unitOwner; + /* + === GET BUILDING INFORMATION === + */ + int _buildingY = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + int _buildingX = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; + /* + Get the default/base height of the building's foundation + */ + _buidingDefHeight + = DAT_TileMapState::instance.DefaultHeightLayer[DAT_BuildingsState::instance.buildings[buildingID] + .currentTilePositionAdjusted]; + /* + === GET UNIT INFORMATION === + */ + _unitArea + = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[unitID].tile]; + _unitOwner = DAT_UnitsState::instance.units[unitID].owner; + /* + === GET BUILDING SIZE AND ACCESS POINT COUNT === + */ + _buildingSize = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; + /* + Lookup table: building size -> number of accessible perimeter tiles Example: 2x2 building has 8 access + points, etc. + */ + _accessibleTilesCount = DAT_BuildingDefinedData::instance.BuildingAccessibleTilesCount[_buildingSize]; + /* + Count of valid access points found + */ + _validAccessPointsCount = 0; + /* + Current access point being checked + */ + _accessibleIndex = 0; + /* + Countdown for loop + */ + _limit = _accessibleTilesCount; + if (0 < _accessibleTilesCount) { + do { + /* + === PHASE 1: FIND ALL VALID ACCESS POINTS === Get the offset for this access point relative + to building origin This iterates through predefined perimeter positions + */ + MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func::setupBuildingEntrancesOffset, + DAT_BuildingsState::ptr)(_buildingSize, 1, _accessibleIndex, 0); + _yOffset = DAT_BuildingsState::instance.DAT_TempYOffset; + /* + Calculate absolute tile position of this access point + */ + _entranceCandidate + = DAT_ViewportRenderState::instance + .translationMatrix[_buildingY + DAT_BuildingsState::instance.DAT_TempYOffset] + .addXgetTile + + DAT_BuildingsState::instance.DAT_TempXOffset + _buildingX; + /* + Get height of the access tile + */ + _cHeight = DAT_TileMapState::instance.HeightLayer[_entranceCandidate]; + uint _heightDiff = (uint)_buidingDefHeight - (uint)_cHeight; + /* + Compute absolute value: abs(_heightDiff) < 32 + */ + /* + === HEIGHT VALIDATION #1: Building Foundation Height === Check if access point is within 32 + height units of building base + */ + /* + === NAVIGATION AREA VALIDATION === Check if unit can reach this access point + */ + /* + === HEIGHT VALIDATION #2: Building Terrain Height === Check if access point is within 16 height + units of building's actual terrain height + */ + if ((int)((_heightDiff ^ (int)_heightDiff >> 0x1f) - ((int)_heightDiff >> 0x1f)) < 32 + && ((int)(short)DAT_TileMapState::instance.PathConnectionLayer[_entranceCandidate] + == (int)(short)_unitArea + || (_canNav = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)((int)_unitOwner, (dword)((int)((short)_unitArea)), + (dword)((int)(( + int)(short)DAT_TileMapState::instance.PathConnectionLayer[_entranceCandidate])), + 0), + _canNav != 0)) + && (_heightDiff2 + = (int)DAT_BuildingsState::instance.buildings[buildingID].terrainHeightUnk - (uint)_cHeight, + uVar2 = (int)_heightDiff2 >> 0x1f, (int)((_heightDiff2 ^ uVar2) - uVar2) < 16)) { + /* + === ACCESS POINT IS VALID - ADD TO LIST === Store the access tile + */ + _pairsOfAccessAndAdjacent[_validAccessPointsCount][0] = _entranceCandidate; + /* + Initialize adjacent building tile (will find next) + */ + _pairsOfAccessAndAdjacent[_validAccessPointsCount][1] = 0; + /* + === FIND ADJACENT BUILDING TILE === Search cardinal directions (horizontal first) to find + which building tile is adjacent to this access point + */ + pXVar1 = DAT_ClimbLogicDefinedData::instance.CardinalHorizontalFirstSearchOrder; + do { + _candidate2 + = DAT_ViewportRenderState::instance.translationMatrix[pXVar1->y + _yOffset + _buildingY] + .addXgetTile + + pXVar1->x + DAT_BuildingsState::instance.DAT_TempXOffset + _buildingX; + /* + Check if this tile belongs to our building + */ + if (DAT_TileMapState::instance.BuildingLayer[_candidate2] == buildingID) { + /* + Found it! Store the building tile adjacent to the access point + */ + _pairsOfAccessAndAdjacent[_validAccessPointsCount][1] = _candidate2; + break; + } + pXVar1 = pXVar1 + 1; + /* + Check all cardinal directions + */ + } while ((int)pXVar1 < 0xb39238); + /* + Increment valid access point count + */ + _validAccessPointsCount = _validAccessPointsCount + 1; + } + /* + Move to next access point + */ + _accessibleIndex = _accessibleIndex + 1; + if (_accessibleTilesCount <= _accessibleIndex) { + _accessibleIndex = 0; + } + _limit = _limit + -1; + } while (_limit != 0); + } + /* + === PHASE 2: CHOOSE CLOSEST ACCESS POINT === Loop counter + */ + _counter = 0; + /* + Index of best access point (-1 = none found) + */ + _closestTile = -1; + /* + Initialize output parameter + */ + *pResultTile = 0; + /* + Best distance so far (initialized to very large) + */ + _closestDistance = 10000; + /* + If we found any valid access points + */ + if (0 < _validAccessPointsCount) { + do { + /* + === CALCULATE DISTANCE FROM UNIT TO ACCESS POINT === Convert tile index back to X,Y + coordinates + */ + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, + DAT_DirectionAlgorithmState::ptr)((int)DAT_UnitsState::instance.units[unitID].x, + (int)(DAT_UnitsState::instance.units[unitID].y), + _pairsOfAccessAndAdjacent[_counter][0] + - DAT_ViewportRenderState::instance + .translationMatrix[DAT_ViewportRenderState::instance + .tileTranslationMatrix_YComponent[_pairsOfAccessAndAdjacent[_counter][0]]] + .addXgetTile, + (int)(DAT_ViewportRenderState::instance + .tileTranslationMatrix_YComponent[_pairsOfAccessAndAdjacent[_counter][0]])); + /* + If this access point is closer than previous best + */ + if (DAT_DirectionAlgorithmState::instance.distanceHigh < _closestDistance) { + /* + Update best distance + */ + /* + Remember this index + */ + _closestDistance = DAT_DirectionAlgorithmState::instance.distanceHigh; + _closestTile = _counter; + } + _counter = _counter + 1; + } while (_counter < _validAccessPointsCount); + /* + === RETURN BEST ACCESS POINT === + */ + if (_closestTile != -1) { + /* + Set output parameter: adjacent building tile + */ + *pResultTile = _pairsOfAccessAndAdjacent[_closestTile][1]; + /* + Return: access point tile + */ + return _pairsOfAccessAndAdjacent[_closestTile][0]; + } + } + /* + No valid access points found + */ + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp new file mode 100644 index 0000000000..f386d290c6 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp @@ -0,0 +1,126 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049D880 + undefined4 PathFindingState::findClosestFreeTileNearUnitOnBuilding( + int buildingID, int unitID, int x, int y, int* pX, int* pY) + { + short* psVar2; + uint uVar3; + int (*paiVar4)[8]; + int iVar5; + int _lowestDist; + uint _tile; + int _unitArea; + int _x; + int _y; + this->searchGeneration = this->searchGeneration + 1; + this->calculations = this->calculations + 1; + _lowestDist = 10000; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + _unitArea = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[unitID].tile]; + *pX = (int)DAT_UnitsState::instance.units[unitID].x; + *pY = (int)DAT_UnitsState::instance.units[unitID].y; + this->searchQueue.yQueue[0] = DAT_UnitsState::instance.units[unitID].y; + this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[unitID].x; + this->searchQueue.tilesQueue[0] = DAT_UnitsState::instance.units[unitID].tile; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] + = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return (undefined4)(1); + } + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (0x13a0f < _tile) { + return (undefined4)(1); + } + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + iVar5 = (int)_y; + uint uVar1 = _x - x; + uVar3 = (int)uVar1 >> 0x1f; + int _absDistX = (uVar1 ^ uVar3) - uVar3; + uVar1 = iVar5 - y >> 0x1f; + int _absDistY = (iVar5 - y ^ uVar1) - uVar1; + if (_absDistY < _absDistX) { + _absDistY = _absDistX; + } + if (_absDistY < _lowestDist) { + /* + lowest manhatten distance + */ + *pX = (int)_x; + *pY = iVar5; + _lowestDist = _absDistY; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) + break; + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + int _candidate = DAT_TileMapState::instance.directionTranslationMatrix[iVar5][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration + && (short)DAT_TileMapState::instance.PathConnectionLayer[_candidate] == _unitArea + && DAT_TileMapState::instance.BuildingLayer[_candidate] == buildingID + && DAT_TileMapState::instance.UnitLayer[_candidate] == 0) { + /* + queue free spaces in the same area as the unit on the same building as the unit + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return (undefined4)(1); + } + } + return (undefined4)(1); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestTileToStartingTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestTileToStartingTile.cpp new file mode 100644 index 0000000000..dc3e1666d2 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestTileToStartingTile.cpp @@ -0,0 +1,54 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00496EC0 + int PathFindingState::findClosestTileToStartingTile(int param_1) + { + int* _pResultTile; + int _match; + int _d; + int _closest; + int _tile; + _closest = 4000; + _match = 0; + _pResultTile = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; + do { + _tile = *_pResultTile; + _d = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0 < _d + && (_d - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]]) % param_1 + == 0 + && _d < _closest) { + _match = DAT_TribesState::instance.ALG_ResultTileIndex; + _closest = _d; + } + DAT_TribesState::instance.ALG_ResultTileIndex = DAT_TribesState::instance.ALG_ResultTileIndex + 1; + _pResultTile = _pResultTile + 1; + } while ((DAT_TribesState::instance.ALG_ResultTileIndex < 4000) + && (DAT_TileMapState::instance.WalkLayer[_tile] + == DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]])); + _tile = this->searchQueue.tilesQueue[_match]; + DAT_TribesState::instance.ALG_ResultY = (int)this->searchQueue.yQueue[_match]; + DAT_TribesState::instance.ALG_ResultTileIndex = _match; + DAT_TribesState::instance.ALG_ResultX = _tile + - DAT_ViewportRenderState::instance.translationMatrix[DAT_TribesState::instance.ALG_ResultY] + .addXgetTile; + return _tile; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp new file mode 100644 index 0000000000..b8a53e3ec2 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp @@ -0,0 +1,156 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + Graph search over active, recognised climb data entries to determine whether two path-connection areas + (param_2 and param_3) are reachable from each other via intermediate wall or building areas. Returns the + connecting intermediate area ID if a path exists, param_2 if they are directly adjacent, or 0 if no + connection is found. Used to decide if units can navigate between disconnected areas via climbing + structures. renamed by: Claude Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A58A0 + dword PathFindingState::findConnectingAreaBetweenTwoAreas(int param_1, dword param_2, dword param_3) + { + undefined4 dVar2; + int iVar1; + int iVar3; + int* piVar5; + int iVar6; + dword dVar7; + dword dVar8; + int local_96c; + int local_968; + dword adStack_960[200]; + int aiStack_640[400]; + if (param_2 == param_3) { + return (dword)(param_2); + } + this->DAT_Test_gatehouse = this->DAT_Test_gatehouse + 1; + local_96c = 0; + local_968 = 0; + iVar6 = 1; + if (1 < this->maxClimbDataCount) { + piVar5 = &this->climbData[1].isRecognizedByPathfinding; + do { + if (((ClimbData*)(piVar5 + -6))->canBeUsed == 1 && *piVar5 != 0 && piVar5[-5] != 1 + && ((param_1 == 0 + || (DAT_GameState::instance.mapAndTime.playerTeams[piVar5[0x73]] + == DAT_GameState::instance.mapAndTime.playerTeams[param_1])) + || (DAT_BuildingsState::instance.buildings[piVar5[-3]].field241_0x2c6 != 0))) { + aiStack_640[local_96c * 2 + 1] = 0; + aiStack_640[local_96c * 2] = iVar6; + local_96c = local_96c + 1; + } + iVar6 = iVar6 + 1; + piVar5 = piVar5 + 0x81; + } while (iVar6 < this->maxClimbDataCount); + } + int iVar4 = 0; + iVar6 = 0; + if (0 < local_96c) { + do { + iVar1 = aiStack_640[iVar4 * 2]; + dVar7 = this->climbData[iVar1].area; + if (dVar7 == param_3) { + dVar7 = this->climbData[iVar1].wallGroupAreaID; + LAB_004a59a4: + if (dVar7 == param_2) { + return (dword)(param_3); + } + dVar8 = this->climbData[iVar1].buildingArea; + if (dVar8 == param_2) { + return (dword)(param_3); + } + adStack_960[iVar6] = dVar7; + aiStack_640[iVar4 * 2 + 1] = 1; + iVar3 = iVar6 + 1; + if (0 < (int)dVar8) { + adStack_960[iVar6 + 1] = dVar8; + LAB_004a5a12: + iVar3 = iVar6 + 2; + } + } else { + dVar8 = this->climbData[iVar1].wallGroupAreaID; + if (dVar8 == param_3) + goto LAB_004a59a4; + iVar3 = iVar6; + if (this->climbData[iVar1].buildingArea == param_3) { + if (dVar7 == param_2) { + return (dword)(param_3); + } + if (dVar8 == param_2) { + return (dword)(param_3); + } + adStack_960[iVar6] = dVar7; + aiStack_640[iVar4 * 2 + 1] = 1; + adStack_960[iVar6 + 1] = dVar8; + goto LAB_004a5a12; + } + } + iVar4 = iVar4 + 1; + iVar6 = iVar3; + } while (iVar4 < local_96c); + if (0 < iVar3) { + do { + dVar7 = adStack_960[local_968]; + local_968 = local_968 + 1; + iVar4 = 0; + iVar6 = iVar3; + do { + iVar3 = iVar6; + if (aiStack_640[iVar4 * 2 + 1] != 1) { + iVar1 = aiStack_640[iVar4 * 2]; + dVar8 = this->climbData[iVar1].area; + if (dVar8 == dVar7) { + dVar8 = this->climbData[iVar1].wallGroupAreaID; + LAB_004a5a70: + if (dVar8 == param_2) { + return (dword)(dVar7); + } + dword dVar2 = this->climbData[iVar1].buildingArea; + if (dVar2 == param_2) { + return (dword)(dVar7); + } + adStack_960[iVar6] = dVar8; + aiStack_640[iVar4 * 2 + 1] = 1; + iVar3 = iVar6 + 1; + if ((int)dVar2 < 1) + goto LAB_004a5ad0; + adStack_960[iVar6 + 1] = dVar2; + } else { + dVar2 = this->climbData[iVar1].wallGroupAreaID; + if (dVar2 == dVar7) + goto LAB_004a5a70; + if (this->climbData[iVar1].buildingArea != dVar7) + goto LAB_004a5ad0; + if (dVar8 == param_2) { + return (dword)(dVar7); + } + if (dVar2 == param_2) { + return (dword)(dVar7); + } + adStack_960[iVar6] = dVar8; + aiStack_640[iVar4 * 2 + 1] = 1; + adStack_960[iVar6 + 1] = dVar2; + } + iVar3 = iVar6 + 2; + } + LAB_004a5ad0: + iVar4 = iVar4 + 1; + iVar6 = iVar3; + } while (iVar4 < local_96c); + } while (local_968 < iVar3); + } + } + return (dword)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp new file mode 100644 index 0000000000..bcf7984c18 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -0,0 +1,152 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Location/Point8IntXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8IntXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + BFS from unit param_1's current tile, expanding within its own PathConnectionLayer area or through + walls/structures. When a tile in a different area is encountered, checks whether that area connects to the + target area (param_2, param_3) via calculateCanPlayerUnitsNavigateToAreaFromArea. Selects the neighbour tile + with the minimum Chebyshev distance to the target. Stores the source tile in ALG_TargetTile and the bridge + tile in ALG_ResultTile. Returns 1 on success, 0 if no bridge found. renamed by: Claude Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A6AB0 + undefined4 PathFindingState::findCrossAreaBridgeTileToTarget(int param_1, uint param_2, uint param_3) + { + int (*paiVar6)[8]; + int iVar7; + uint uVar8; + uint uVar9; + int iVar10; + uint uVar11; + int* piVar12; + int iVar13; + int local_20; + uint local_14; + int local_10; + local_14 = 0; + local_10 = 0; + local_20 = 10000; + if (param_2 > 399 || param_3 > 399 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { + return (undefined4)(0); + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + ushort uVar1 + = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[param_1].tile]; + ushort uVar2 + = DAT_TileMapState::instance + .PathConnectionLayer[DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + + param_2]; + this->searchQueue.yQueue[0] = DAT_UnitsState::instance.units[param_1].y; + this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[param_1].x; + this->searchQueue.tilesQueue[0] = DAT_UnitsState::instance.units[param_1].tile; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + do { + uint uVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (0x13a0f < uVar5) + break; + int sVar3 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar4 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar5]; + if (0x13a10 < (int)this->searchQueue.currentDistance) + break; + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + iVar13 = DAT_TileMapState::instance.directionTranslationMatrix[sVar4][_direction] + uVar5; + if (DAT_TileMapState::instance.WalkLayer[iVar13] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar13] & 0x400000U) == 0) { + if ((int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar13] == (int)(short)uVar1 + || (DAT_TileMapState::instance.LogicLayer[iVar13] & 0x10000100U) != 0) { + iVar7 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset; + DAT_TileMapState::instance.CertainPathLayer[iVar13] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar13] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = (short)iVar7 + sVar3; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = (short)DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + + sVar4; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar13; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } else { + iVar7 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)((int)DAT_UnitsState::instance.units[param_1].owner, + (dword)((int)((short)DAT_TileMapState::instance.PathConnectionLayer[iVar13])), + (dword)((int)((short)uVar2)), + (int)(DAT_UnitsState::instance.units[param_1].unitCanClimb)); + if (iVar7 != 0) { + uVar8 = (DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + - param_3) + + (int)sVar4; + uVar11 = (int)uVar8 >> 0x1f; + uVar9 = (DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset + - param_2) + + (int)sVar3; + iVar10 = (uVar8 ^ uVar11) - uVar11; + uVar8 = (int)uVar9 >> 0x1f; + iVar7 = (uVar9 ^ uVar8) - uVar8; + if (iVar7 <= iVar10) { + iVar7 = iVar10; + } + if (iVar7 < local_20) { + local_20 = iVar7; + local_14 = uVar5; + local_10 = iVar13; + } + } + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + if (local_20 < 10000) { + this->ALG_TargetTile = local_14; + this->ALG_ResultTile = local_10; + return (undefined4)(1); + } + } + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp new file mode 100644 index 0000000000..9fafbb2ef3 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp @@ -0,0 +1,48 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049C5C0 + BOOLEnum PathFindingState::findDestinationCostLowerThan6(int tile, int maxDistance) + { + uint _cost; + this->searchQueue.readIndex = 0; + if (this->searchQueue.writeIndex != 0) { + do { + int _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (DAT_TileMapState::instance.WalkLayer[_tile] == this->searchGeneration + && (_cost = (uint) * (byte*)(tile * 0x13a10 + 0x1ee2998 + _tile), _cost != 0) + && _cost - 0x28 < 6 && maxDistance <= DAT_TileMapState::instance.CertainPathLayer[_tile]) { + this->ALG_ResultX = _tile - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; + this->ALG_ResultY = _y; + this->ALG_ResultTile = _tile; + return TRUE; + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp new file mode 100644 index 0000000000..8164726d94 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp @@ -0,0 +1,60 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049CD60 + BOOLEnum PathFindingState::findDirectNeighbourWalkableTile(uint x, uint y) + { + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + int _directionIndex = 0; + do { + uint _x + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_directionIndex].int_.xOffset + + x; + uint _y + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_directionIndex].int_.yOffset + + y; + if (_x <= 399 && _y <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[_y * 400 + _x] != '\0') { + int _tile = DAT_TileMapState::instance.directionTranslationMatrix[y][_directionIndex] + + DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0xb1U) == 0 + && (DAT_TileMapState::instance.LogicLayer[_tile] & 0x50101400U) == 0) { + /* + No sea, borders, rocky, building, tree, river, keep, moat + */ + this->ALG_ResultY = _y; + this->ALG_ResultTile = _tile; + this->ALG_ResultX = _x; + return TRUE; + } + } + _directionIndex = _directionIndex + 1; + if (7 < _directionIndex) { + return FALSE; + } + } while (true); + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp new file mode 100644 index 0000000000..870ab55175 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp @@ -0,0 +1,153 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Units/UnitLogicState.hpp" + +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Units::UnitLogicState; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A0B20 + int PathFindingState::findDistanceOrThreatLevelToUnitUnk(int param_1, int param_2, int param_3, int param_4) + { + int (*paiVar3)[8]; + int iVar4; + int iVar5; + short* psVar6; + int local_c; + int local_8; + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + local_c = 0; + local_8 = 0; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.yQueue[0] = (short)param_3; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return 0; + } + do { + uint uVar2 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (0x13a0f < uVar2) { + return local_c; + } + int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar2]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return local_c; + } + if (this->searchQueue.currentDistance > param_4) { + return local_c; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + iVar4 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction] + uVar2; + if ((DAT_TileMapState::instance.LogicLayer[iVar4] & 0x4a5014b1U) == 0 + && DAT_TileMapState::instance.WalkLayer[iVar4] != this->searchGeneration) { + iVar5 = (int)(short)DAT_TileMapState::instance.UnitLayer[iVar4]; + DAT_TileMapState::instance.CertainPathLayer[iVar4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar4] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + if (iVar5 != 0 + && DAT_GameState::instance.mapAndTime.playerTeams[param_1] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[iVar5].owner] + && DAT_UnitsState::instance.units[iVar5].logicalState != OpenSHC::Map::Units::ULS_INVISIBLE + && DAT_UnitsState::instance.units[iVar5].dying == 0 + && DAT_UnitsState::instance.units[iVar5].isSelectable_OR_matchTime != 0) { + switch (DAT_UnitsState::instance.units[iVar5].unitType) { + case OpenSHC::Map::Units::UT_E_ARCHER: + case OpenSHC::Map::Units::UT_E_XBOW: + case OpenSHC::Map::Units::UT_A_ARCHER: + case OpenSHC::Map::Units::UT_A_HARCHER: + case OpenSHC::Map::Units::UT_S_FBALLISTA: + param_3 = 0xc; + break; + case OpenSHC::Map::Units::UT_E_SPEAR: + case OpenSHC::Map::Units::UT_E_LADDER: + case OpenSHC::Map::Units::UT_S_TOWER: + case OpenSHC::Map::Units::UT_S_BATTERINGRAM: + case OpenSHC::Map::Units::UT_S_SHIELD: + case OpenSHC::Map::Units::UT_A_SLAVE: + param_3 = 4; + break; + case OpenSHC::Map::Units::UT_E_PIKE: + case OpenSHC::Map::Units::UT_E_SWORD: + case OpenSHC::Map::Units::UT_E_KNIGHT: + case OpenSHC::Map::Units::UT_A_ASSASSIN: + case OpenSHC::Map::Units::UT_A_SWORDSMAN: + param_3 = 0; + break; + case OpenSHC::Map::Units::UT_E_MACE: + case OpenSHC::Map::Units::UT_E_MONK: + param_3 = 2; + break; + case OpenSHC::Map::Units::UT_E_ENGINEER: + case OpenSHC::Map::Units::UT_S_CATAPULT: + case OpenSHC::Map::Units::UT_A_FIRETHROWER: + param_3 = 0x14; + break; + case OpenSHC::Map::Units::UT_S_TREBUCHET: + param_3 = 0x1e; + break; + case OpenSHC::Map::Units::UT_S_MANGONEL: + case OpenSHC::Map::Units::UT_S_BALLISTA: + param_3 = 0x28; + break; + case OpenSHC::Map::Units::UT_LORD: + case OpenSHC::Map::Units::UT_A_SLINGER: + param_3 = 8; + } + param_3 = param_3 + 1 + this->searchQueue.currentDistance; + if (local_8 < param_3) { + local_c = iVar5; + local_8 = param_3; + } + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + return local_c; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp new file mode 100644 index 0000000000..322d2143a7 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -0,0 +1,210 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeInt.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeInt; + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::Map::Navigation::Algorithms::XYPair; + + /* + WARNING: Type propagation algorithm not settling + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A7F50 + void PathFindingState::findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance( + int tile, int maxDestinations, int* area, int playerID, int shortenedDistance, int direction) + { + int iVar2; + int _candidate2; + int* piVar3; + XYPair* pXVar4; + BuildingTypeInt _buildingType; + short* psVar5; + int (*paiVar6)[8]; + int _candidate; + int _index; + int _dIndex; + int _maxDistance; + int _tile2; + short _origY; + int _origAXGT; + int _x; + int _y; + uint _tile; + _origY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; + _origAXGT = DAT_ViewportRenderState::instance.translationMatrix[_origY].addXgetTile; + _dIndex = 0; + _maxDistance = 10; + if (shortenedDistance == 1) { + _maxDistance = 3; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + maxDestinations = maxDestinations * 2; + if (maxDestinations < 500) { + if (maxDestinations < 0x32) { + maxDestinations = 0x32; + } + } else { + maxDestinations = 500; + } + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.tilesQueue[0] = tile; + this->searchQueue.yQueue[0] = _origY; + this->searchQueue.xQueue[0] = (short)tile - (short)_origAXGT; + DAT_TileMapState::instance.CertainPathLayer[tile] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile < 0x13a10) { + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if ((80400 < this->searchQueue.currentDistance) + || (this->searchQueue.currentDistance > _maxDistance)) + break; + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration + && (area == (int*)(int)(short)DAT_TileMapState::instance.PathConnectionLayer[_candidate] + || (iVar2 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)(playerID, (dword)((int)(area)), + (dword)((int)(( + int)(short)DAT_TileMapState::instance.PathConnectionLayer[_candidate])), + 0), + iVar2 != 0))) { + short sVar1 + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset; + /* + queue tiles in same area that are pathable without climbing + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar1 + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) + break; + } + } + this->searchQueue.readIndex = 0; + if (0 < this->searchQueue.writeIndex) { + area = &this->searchQueue.destinationsArray[0].tile2OrAHelper; + do { + _tile2 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if ((DAT_TileMapState::instance.LogicLayer[_tile2] & 0x10000300U) == 0) { + _index = 0; + pXVar4 = DAT_ClimbLogicDefinedData::instance + .OrderedOrientationBasedCardinalDirectionList[direction]; + do { + _candidate2 = DAT_ViewportRenderState::instance + .translationMatrix[pXVar4->y + + (int)this->searchQueue.yQueue[this->searchQueue.readIndex]] + .addXgetTile + + ((XYPair*)&pXVar4->x)->x + (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + /* + if a wall gatehouse crenel keep and not a stockpile, and not a keep, and wall is of + enemy... break + */ + if ((DAT_TileMapState::instance.LogicLayer[_candidate2] & 0x10000300U) != 0 + && (DAT_TileMapState::instance.LogicLayer[_candidate2] & 2U) == 0 + && (DAT_TileMapState::instance.BuildingLayer[_candidate2] == 0 + || ((_buildingType = (BuildingTypeInt)(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_candidate2]] + .buildingType, + _buildingType != OpenSHC::Map::Buildings::BT_STOCKPILE + && (2 < _buildingType - OpenSHC::Map::Buildings::BT_MANORHOUSE)))) + && DAT_GameState::instance.mapAndTime + .playerTeams[(DAT_TileMapState::instance.WallOwnerLayer[_candidate2] & 7) + 1] + != DAT_GameState::instance.mapAndTime.playerTeams[playerID]) + break; + _candidate2 = 0; + _index = _index + 1; + pXVar4 = pXVar4 + 1; + } while (_index < 4); + if (((shortenedDistance != 1) + || ((short)DAT_TileMapState::instance.UnitLayer[_candidate2] == 0)) + && _candidate2 != 0) { + area[-1] = _tile2; + _dIndex = _dIndex + 1; + *area = _candidate2; + area = area + 3; + if (maxDestinations <= _dIndex) { + return; + } + this->searchQueue.tilesQueue[this->searchQueue.readIndex] = -1; + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + } while (this->searchQueue.readIndex < this->searchQueue.writeIndex); + } + this->searchQueue.readIndex = 0; + if (0 < this->searchQueue.writeIndex) { + piVar3 = &((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_dIndex].tile2OrAHelper; + do { + iVar2 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if ((DAT_TileMapState::instance.LogicLayer[iVar2] & 0x10000300U) == 0 && iVar2 != -1) { + ((PathHelper12*)(piVar3 + -1))->tile1 = iVar2; + *piVar3 = 0; + _dIndex = _dIndex + 1; + piVar3 = piVar3 + 3; + if (maxDestinations <= _dIndex) { + return; + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + } while (this->searchQueue.readIndex < this->searchQueue.writeIndex); + } + this->searchQueue.destinationsArray[_dIndex].tile1 = 0; + ((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_dIndex].tile2OrAHelper = 0; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp new file mode 100644 index 0000000000..6d62b64475 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp @@ -0,0 +1,113 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049D0E0 + void PathFindingState::findFreeTileOnDefensiveStructure(int unitID, int x, int y) + { + short* psVar3; + int (*paiVar4)[8]; + int iVar5; + int _tile; + this->calculations = this->calculations + 1; + this->ALG_ResultTile = 0; + this->ALG_ResultY = 0; + this->ALG_ResultX = 0; + if ((uint)x <= 399 && (uint)y <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] != '\0') { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _tile && (_tile < 0x13a10))) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + iVar5 = (int)sVar2; + if ((short)DAT_TileMapState::instance.UnitLayer[_tile] == 0) { + this->ALG_ResultX = (int)sVar1; + this->ALG_ResultY = iVar5; + this->ALG_ResultTile = _tile; + return; + } + if ((short)DAT_TileMapState::instance.UnitLayer[_tile] == unitID) { + this->ALG_ResultX = (int)sVar1; + this->ALG_ResultY = iVar5; + this->ALG_ResultTile = _tile; + return; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x10000100U) != 0) { + /* + queue tiles that are wall gatehouse tower or keep + */ + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp new file mode 100644 index 0000000000..fd97d28a4e --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp @@ -0,0 +1,106 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049BBF0 + void PathFindingState::findFurthestSeaTile(int budget, uint x, uint y) + { + short* psVar1; + int (*paiVar2)[8]; + int _x; + int _y; + this->ALG_ResultTile = 0; + this->ALG_ResultY = 0; + this->ALG_ResultX = 0; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + this->ALG_ResultTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if ((this->ALG_ResultTile < 0) || (0x13a0f < this->ALG_ResultTile)) + break; + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance + = (int)DAT_TileMapState::instance.CertainPathLayer[this->ALG_ResultTile]; + if (budget < this->searchQueue.writeIndex) { + this->ALG_ResultY = (int)_y; + this->ALG_ResultX = (int)_x; + return; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + /* + for each direction, do: + */ + int _candidate + = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + this->ALG_ResultTile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_candidate] & 1) != 0) { + /* + is sea + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } + this->ALG_ResultX = (int)this->searchQueue.yQueue[this->searchQueue.readIndex + 0x13a0f]; + this->ALG_ResultY = (int)this->searchQueue.yQueue[this->searchQueue.readIndex + -1]; + this->ALG_ResultTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex + -1]; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp new file mode 100644 index 0000000000..be8ffe2b34 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp @@ -0,0 +1,115 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + * Performs BFS pathfinding for AI units to determine if a path exists between two points. * This is a fast + * "can reach" check rather than a full path reconstruction. * * Key features: * - Diagonal movement + * costs 2, cardinal movement costs 1 * - Can optionally reuse previous search state (for incremental + * searches) * - Returns immediately upon finding target (doesn't compute full distance map) * - Limited + * by param_5 (max search depth) * * @param this - PathFindingState object pointer * @param x - + * Starting X coordinate (0-399) * @param y - Starting Y coordinate (0-399) * @param x2 - Target X + * coordinate (0-399, or -1 for "search without target") * @param y2 - Target Y coordinate (0-399) * + * @param param_5 - Maximum search depth/distance limit * @param doNotIncrementSearchGeneration - If + * non-zero, continue previous search (incremental mode) * @return 1 if target is reachable, 0 otherwise + * decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00497740 + BOOLEnum PathFindingState::findLinkageBasedPathOrWalkRadius( + uint x, uint y, int x2, int y2, int maxIterations, BOOLEnum continuePreviousSearch) + { + /* + === VALIDATE STARTING POSITION === Check bounds (400x400) and walkability + */ + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + /* + === VALIDATE TARGET POSITION === If the target is given but invalid, cap the search depth at 500 + */ + if (x2 != -1 + && (399 < (uint)x2 || 399 < (uint)y2 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] == '\0') + && 500 < maxIterations) { + maxIterations = 500; + } + if (continuePreviousSearch == FALSE) { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.depth = 0; + } + /* + The eight-neighbour expansion below is handwritten assembly in the original and reaches + the layers and the queue through these locals; see LinkageNeighbourAsm.hpp. The queue + indices and the target tile live in the parameter slots, as they do in the original. + */ + short _curGen = (short)this->searchGeneration; + short* _walkLayer = DAT_TileMapState::instance.WalkLayer; + short* _certainPath = DAT_TileMapState::instance.CertainPathLayer; + int* _tilesQueue = this->searchQueue.tilesQueue; + short* _yQueue = this->searchQueue.yQueue; + int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; + uchar* _linkage = DAT_TileMapState::instance.PathLinkageLayer; + + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = _curGen; + + y = this->searchQueue.writeIndex; + int _readIndex = this->searchQueue.readIndex; + continuePreviousSearch = this->searchQueue.depth; + if (x2 == -1) { + x = 0; + } else { + x = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; + } + int _result = 0; + while (_readIndex != (int)y && (int)continuePreviousSearch < maxIterations) { + continuePreviousSearch = continuePreviousSearch + 1; + int _tile = this->searchQueue.tilesQueue[_readIndex]; + if (_tile == (int)x) { + _result = 1; + break; + } + short _cCardinalDistance = _certainPath[_tile] + 1; + if (800 <= _cCardinalDistance) { + break; + } + int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; + int _cLink = _linkage[_tile]; + + MACRO_LINKAGE_EXPAND_NEIGHBOURS(1, y) + + _readIndex = _readIndex + 1; + } + this->searchQueue.writeIndex = y; + this->searchQueue.readIndex = _readIndex; + this->searchQueue.depth = continuePreviousSearch; + return (BOOLEnum)_result; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp new file mode 100644 index 0000000000..74986dd464 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp @@ -0,0 +1,138 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049B940 + void PathFindingState::findMapBorderEdgeTileAndStoreInSignpostData( + int signpostID, int maxDistance, uint x, uint y) + { + int (*paiVar1)[8]; + int _candidate; + int _offset; + int _index; + uint _tile; + int _x; + int _y; + DAT_GameState::instance.mapAndTime.signpostsMapEdgeDataCounter = 0; + this->calculations = this->calculations + 1; + this->resultTile = 0; + this->resultY = 0; + this->resultX = 0; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], (uint)_tile < 80400) { + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (this->searchQueue.currentDistance > maxDistance) { + return; + } + _index = 0; + paiVar1 = DAT_TileMapState::instance.directionTranslationMatrix + _y; + do { + /* + for each direction, do + */ + _candidate = (*paiVar1)[0] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { + /* + reached map border edge? + */ + if ((DAT_TileMapState::instance.LogicLayer[_candidate] & 0x30) != 0) { + this->resultX = (int)_x; + this->resultY = (int)_y; + this->resultTile = _tile; + DAT_GameState::instance.mapAndTime + .signpostsMapEdge[signpostID] + [DAT_GameState::instance.mapAndTime.signpostsMapEdgeDataCounter] + .x = (int)_x; + DAT_GameState::instance.mapAndTime + .signpostsMapEdge[signpostID] + [DAT_GameState::instance.mapAndTime.signpostsMapEdgeDataCounter] + .y = this->resultY; + DAT_GameState::instance.mapAndTime + .signpostsMapEdge[signpostID] + [DAT_GameState::instance.mapAndTime.signpostsMapEdgeDataCounter] + .tile = this->resultTile; + DAT_GameState::instance.mapAndTime.signpostsMapEdgeDataCounter + = DAT_GameState::instance.mapAndTime.signpostsMapEdgeDataCounter + 1; + if (DAT_GameState::instance.mapAndTime.signpostsMapEdgeDataCounter >= 50) { + return; + } + break; + } + if ((DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_index]) + != 0) { + /* + this direction can be walked to? add to queue + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_index] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_index] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + _index = _index + 2; + paiVar1 = (int (*)[8])(*paiVar1 + 2); + } while (_index < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp new file mode 100644 index 0000000000..b10b1d5d54 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp @@ -0,0 +1,113 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingLogicalState.hpp" +#include "OpenSHC/Map/Buildings/BuildingLogicalStateShort.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Buildings::BuildingLogicalState; + using OpenSHC::Map::Buildings::BuildingLogicalStateShort; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + BFS from (param_2, param_3) up to distance param_4, checking each visited tile's BuildingLayer. Returns the + building ID of the first reachable enemy building (different team to param_1) that is alive (logicalState != + 0 and != 3), not on fire, and has a valid fire-related building parameter. Returns 0 if none found. renamed + by: Claude Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A0460 + int PathFindingState::findNearestEnemyBuildingWithinDistance(int param_1, int param_2, int param_3, int param_4) + { + BuildingLogicalStateShort BVar2; + int iVar3; + int iVar5; + int (*paiVar6)[8]; + short* psVar7; + this->searchGeneration = this->searchGeneration + 1; + this->calculations = this->calculations + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.yQueue[0] = (short)param_3; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < iVar3 && (iVar3 < 0x13a10))) { + int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar3]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return 0; + } + if (this->searchQueue.currentDistance > param_4) { + return 0; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + int iVar4 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction] + iVar3; + if ((DAT_TileMapState::instance.LogicLayer[iVar4] & 0x30) == 0 + && DAT_TileMapState::instance.WalkLayer[iVar4] != this->searchGeneration) { + DAT_TileMapState::instance.CertainPathLayer[iVar4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar4] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + iVar4 = (int)DAT_TileMapState::instance.BuildingLayer[iVar4]; + if (iVar4 != 0 + && DAT_GameState::instance.mapAndTime.playerTeams[param_1] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_BuildingsState::instance.buildings[iVar4].owner] + && (BVar2 = DAT_BuildingsState::instance.buildings[iVar4].logicalState, + BVar2 != ((BuildingLogicalState)0)) + && BVar2 != OpenSHC::Map::Buildings::BLS_REMOVE + && DAT_BuildingsState::instance.buildings[iVar4].fireDuration == 0 + && (iVar5 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingFlammabilityFactor, + DAT_BuildingsState::ptr)(iVar4), + iVar5 != 0 && (iVar5 != 4))) { + return iVar4; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return 0; + } + } + } + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp new file mode 100644 index 0000000000..d74bce332f --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp @@ -0,0 +1,107 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Units/UnitLogicState.hpp" +#include "OpenSHC/Map/Units/UnitLogicStateShort.hpp" + +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Units::UnitLogicState; + using OpenSHC::Map::Units::UnitLogicStateShort; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + Structurally identical to findNearestEnemyBuildingWithinDistance but checks UnitLayer instead of + BuildingLayer. BFS from (param_2, param_3) up to distance param_4, returns the unit ID of the first + reachable live enemy unit (different team to param_1) that is not invisible, not flagged for removal, and + not dying. Returns 0 if none found. renamed by: Claude Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A06B0 + int PathFindingState::findNearestEnemyUnitWithinDistance(int param_1, int param_2, int param_3, int param_4) + { + UnitLogicStateShort UVar2; + int iVar3; + short* psVar5; + int (*paiVar6)[8]; + this->searchGeneration = this->searchGeneration + 1; + this->calculations = this->calculations + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.yQueue[0] = (short)param_3; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < iVar3 && (iVar3 < 0x13a10))) { + short sVar1 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar3]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return 0; + } + if (this->searchQueue.currentDistance > param_4) { + return 0; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + int iVar4 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction] + iVar3; + if ((DAT_TileMapState::instance.LogicLayer[iVar4] & 0x30) == 0 + && DAT_TileMapState::instance.WalkLayer[iVar4] != this->searchGeneration) { + DAT_TileMapState::instance.CertainPathLayer[iVar4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar4] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + iVar4 = (int)(short)DAT_TileMapState::instance.UnitLayer[iVar4]; + if (iVar4 != 0 + && DAT_GameState::instance.mapAndTime.playerTeams[param_1] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[iVar4].owner] + && (UVar2 = DAT_UnitsState::instance.units[iVar4].logicalState, + UVar2 != OpenSHC::Map::Units::ULS_INVISIBLE) + && UVar2 != OpenSHC::Map::Units::ULS_REMOVE + && DAT_UnitsState::instance.units[iVar4].dying == 0) { + return iVar4; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return 0; + } + } + } + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp new file mode 100644 index 0000000000..1e704786f9 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp @@ -0,0 +1,115 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Map/Location/Point8IntXY.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8IntXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004974D0 + BOOL PathFindingState::findNeighbourTileThatCanServeAsClimbPointClosestToXY(uint x, uint y, uint x2, uint y2) + { + int iVar2; + int (*paiVar3)[8]; + int _candidate2; + int _tile2; + uint _c2Height; + int* piVar4; + int _minDistance; + BOOL _status; + ushort _area1; + uint uVar1 = y2; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return 0; + } + if (x2 <= 399 && y2 <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] != '\0') { + _tile2 = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; + /* + height 2 + */ + y2 = (uint)DAT_TileMapState::instance.HeightLayer[_tile2]; + _area1 + = DAT_TileMapState::instance + .PathConnectionLayer[DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x]; + _status = 0; + _minDistance = 1000; + if (DAT_TileMapState::instance.BuildingLayer[_tile2] != 0) { + /* + add building height to height2 + */ + iVar2 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[_tile2]); + y2 = y2 + iVar2; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + /* + for each direction relative to tile 2, do + */ + _candidate2 = DAT_TileMapState::instance.directionTranslationMatrix[uVar1][_direction] + _tile2; + if ((short)DAT_TileMapState::instance.PathConnectionLayer[_candidate2] == _area1 + && (short)DAT_TileMapState::instance.UnitLayer[_candidate2] == 0) { + /* + area is same as area1, no units on this tile compute the total height at this candidate tile + */ + _c2Height = (uint)DAT_TileMapState::instance.HeightLayer[_candidate2]; + if (DAT_TileMapState::instance.BuildingLayer[_candidate2] != 0) { + iVar2 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[_candidate2]); + _c2Height = _c2Height + iVar2; + } + if ((int)y2 <= (int)(_c2Height + 16) && (int)(_c2Height - 4294967280) <= (int)y2) { + /* + if the height of this candidate tile is within 16 of the tile2 height then, compute the + distance between x,y and the candidate2 tile + */ + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, + DAT_DirectionAlgorithmState::ptr)(x, (int)(y), + (int)(DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset + + x2), + (int)(DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + + uVar1)); + if (DAT_DirectionAlgorithmState::instance.distanceHigh < _minDistance) { + this->climbX + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset + + x2; + _minDistance = DAT_DirectionAlgorithmState::instance.distanceHigh; + this->climbY + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + + uVar1; + _status = 1; + } + } + } + } + + return _status; + } + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp new file mode 100644 index 0000000000..321a4bf4fb --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp @@ -0,0 +1,69 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00497180 + dword PathFindingState::findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure(int modulo, int x, int y) + { + uint _xDistance; + uint _yDistance; + int* _pTile; + uint _absX; + uint _absY; + int iVar1; + dword _result; + int _tile; + _pTile = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; + iVar1 = DAT_TribesState::instance.ALG_ResultTileIndex; + while (true) { + _tile = *_pTile; + /* + manhatten distance + */ + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x10000100U) == 0 + && 0 < DAT_TileMapState::instance.CertainPathLayer[_tile] + && (_xDistance = (_tile + - DAT_ViewportRenderState::instance + .translationMatrix[DAT_ViewportRenderState::instance + .tileTranslationMatrix_YComponent[_tile]] + .addXgetTile) + - x, + _absX = (int)_xDistance >> 0x1f, + _yDistance + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile] - y, + _absY = (int)_yDistance >> 0x1f, + (int)(((_yDistance ^ _absY) - _absY) + ((_xDistance ^ _absX) - _absX)) % modulo == 0) + && DAT_TileMapState::instance.CertainPathLayer[_tile] < 4000) + break; + iVar1 = iVar1 + 1; + _pTile = _pTile + 1; + if ((4000 < iVar1) + || (DAT_TileMapState::instance.WalkLayer[_tile] + != DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]])) { + return (dword)(0); + } + } + _result = this->searchQueue.tilesQueue[iVar1]; + DAT_TribesState::instance.ALG_ResultY = (int)this->searchQueue.yQueue[iVar1]; + DAT_TribesState::instance.ALG_ResultTileIndex = iVar1; + DAT_TribesState::instance.ALG_ResultX = _result + - DAT_ViewportRenderState::instance.translationMatrix[DAT_TribesState::instance.ALG_ResultY] + .addXgetTile; + return (dword)(_result); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp new file mode 100644 index 0000000000..801ffad23c --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp @@ -0,0 +1,64 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00496F90 + void PathFindingState::findNextTileInExistingSearchThatIsModuloDistanceAway(int modulo, int x, int y) + { + int iVar2; + uint uVar3; + uint uVar4; + int* _pLastTile; + uint uVar5; + uint uVar6; + int local_10; + local_10 = 0; + _pLastTile = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; + while (true) { + int iVar1 = *_pLastTile; + if (0 < DAT_TileMapState::instance.CertainPathLayer[iVar1] + && (uVar3 = (iVar1 + - DAT_ViewportRenderState::instance + .translationMatrix[DAT_ViewportRenderState::instance + .tileTranslationMatrix_YComponent[iVar1]] + .addXgetTile) + - x, + uVar5 = (int)uVar3 >> 0x1f, + uVar4 = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[iVar1] - y, + uVar6 = (int)uVar4 >> 0x1f, + (int)(((uVar4 ^ uVar6) - uVar6) + ((uVar3 ^ uVar5) - uVar5)) % modulo == 0) + && (iVar2 = DAT_TribesState::instance.ALG_ResultTileIndex, + DAT_TileMapState::instance.CertainPathLayer[iVar1] < 4000)) + break; + DAT_TribesState::instance.ALG_ResultTileIndex = DAT_TribesState::instance.ALG_ResultTileIndex + 1; + _pLastTile = _pLastTile + 1; + iVar2 = local_10; + if ((4000 < DAT_TribesState::instance.ALG_ResultTileIndex) + || (DAT_TileMapState::instance.WalkLayer[iVar1] + != DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]])) + break; + } + local_10 = iVar2; + DAT_TribesState::instance.ALG_ResultY = (int)this->searchQueue.yQueue[local_10]; + DAT_TribesState::instance.ALG_ResultX = this->searchQueue.tilesQueue[local_10] + - DAT_ViewportRenderState::instance.translationMatrix[DAT_TribesState::instance.ALG_ResultY] + .addXgetTile; + DAT_TribesState::instance.ALG_ResultTileIndex = local_10; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp new file mode 100644 index 0000000000..f843ef3f99 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp @@ -0,0 +1,122 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Trees/TreeType.hpp" +#include "OpenSHC/Map/Trees/TreeTypeShort.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_LandscapeState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Trees::TreeType; + using OpenSHC::Map::Trees::TreeTypeShort; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049C370 + BOOLEnum PathFindingState::findNoTreeInRange(int budget, uint x, uint y) + { + int (*paiVar2)[8]; + short* psVar3; + int _tile; + TreeTypeShort _treeType; + this->ALG_ResultTile = 0; + this->ALG_ResultY = 0; + this->ALG_ResultX = 0; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _tile && (_tile < 0x13a10))) { + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (this->searchQueue.currentDistance > budget) { + return TRUE; + } + int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + /* + for each direction, do: + */ + int _candidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { + int _org = (int)DAT_TileMapState::instance.OrganismLayer[_candidate]; + if ((_org == 0) || (1999 < _org)) { + if ((DAT_TileMapState::instance.LogicLayer[_candidate] & 0x30) == 0) { + /* + not map edge? add to queue + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } else { + _treeType = DAT_LandscapeState::instance.trees[_org].treeType; + if (_treeType == (TreeType)1) { + return FALSE; + } + if (_treeType == (TreeType)2) { + return FALSE; + } + if (_treeType == (TreeType)3) { + return FALSE; + } + if (_treeType == (TreeType)4) { + return FALSE; + } + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return FALSE; + } + } + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp new file mode 100644 index 0000000000..96207bddeb --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp @@ -0,0 +1,114 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A19B0 + dword PathFindingState::findOwnedGatehouse(int playerID, uint x, uint y) + { + int (*paiVar3)[8]; + short _building; + int _link; + dword _tile; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return (dword)(0); + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if ((int)_tile < 0) { + return (dword)(0); + } + if (0x13a0f < (int)_tile) { + return (dword)(0); + } + short sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; + short sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return (dword)(0); + } + _link = DAT_TileMapState::instance.PathLinkageLayer[_tile]; + int _direction = 0; + paiVar3 = DAT_TileMapState::instance.directionTranslationMatrix + sVar2; + do { + int _candidate = (*paiVar3)[0] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_candidate] & 0x30) == 0) { + if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction] & _link) + == 0) { + _building = DAT_TileMapState::instance.BuildingLayer[_candidate]; + if (_building != 0 + && (int)(short)DAT_BuildingsState::instance.buildings[_building].buildingType - 45 < 2 + && DAT_BuildingsState::instance.buildings[_building].owner == playerID) { + /* + if gate house from player + */ + return (dword)(_tile); + } + } else { + /* + queue tiles + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + _direction = _direction + 1; + paiVar3 = (int (*)[8])(*paiVar3 + 1); + } while (_direction < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } + return (dword)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp new file mode 100644 index 0000000000..45e3e49902 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -0,0 +1,206 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeShort; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00498020 + BOOLEnum PathFindingState::findPathUsingClimbingWithHeightMargin16( + uint x, uint y, uint x2, uint y2, int budget, BOOLEnum continueSearch) + { + int (*paiVar4)[8]; + int _keepHeight; + int _tDiff; + int _direction; + uint _cHeight; + int _candidate; + BuildingTypeShort _cType; + uint _cLogic; + uint _tLogic; + BuildingTypeShort _tType; + uint _tile; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + if (x2 != 0xffffffff) { + if (399 < x2) { + return FALSE; + } + if (399 < y2) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] == '\0') { + return FALSE; + } + } + if (continueSearch == FALSE) { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.currentDistance = 1; + } + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] + = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (x2 == 0xffffffff) { + x = 0; + } else { + x = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; + } + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile == x) { + /* + if candidate matches target tile + */ + this->searchMatchCounter = this->searchMatchCounter + 1; + return TRUE; + } + if ((budget <= this->searchQueue.readIndex) || (0x13a0f < _tile)) + break; + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x78 < this->searchQueue.currentDistance) + break; + uint _tHeight = (uint)DAT_TileMapState::instance.HeightLayer[_tile]; + _tLogic = DAT_TileMapState::instance.LogicLayer[_tile]; + _direction = 0; + paiVar4 = DAT_TileMapState::instance.directionTranslationMatrix + sVar2; + do { + /* + for each direction, do: + */ + _candidate = (*paiVar4)[0] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { + if ((DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) + == 0) { + /* + tile is not wall or gatehouse + */ + if ((_tLogic & 0x100) == 0) { + /* + tile is not moat + */ + _cLogic = DAT_TileMapState::instance.LogicLayer[_candidate]; + if ((_tLogic & 0x40000000) == 0) { + if ((_cLogic & 0x40000000) != 0) + goto LAB_0049825d; + } else if ((_cLogic & 0x40000800) != 0 || (_cLogic & 0x4a5015b1) == 0) { + LAB_0049825d: + /* + candidate is moat or stairs OR not sea, border (edge), rocky, wall or + gatehouse, building, tree, rivere, crenel, farm field, moat + */ + _cHeight = (uint)DAT_TileMapState::instance.HeightLayer[_candidate]; + if ((_cLogic & 0x10000000) != 0) { + /* + candidate is keep + */ + _keepHeight = MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func:: + getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)( + (int)DAT_TileMapState::instance.BuildingLayer[_candidate]); + _cHeight = _cHeight + _keepHeight; + } + /* + test if height difference is within margin + */ + if ((int)_tHeight <= (int)(_cHeight + 16) + && (int)(_cHeight - 4294967280) <= (int)_tHeight) + goto LAB_00498308; + _cType = DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_candidate]] + .buildingType; + _tDiff = 0; + if ((_cType == OpenSHC::Map::Buildings::BT_GATEHOUSELARGE) + || (_cType == OpenSHC::Map::Buildings::BT_GATEHOUSESMALL)) { + _cHeight = _cHeight - 90; + } else { + _tType = DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_tile]] + .buildingType; + if ((_tType != OpenSHC::Map::Buildings::BT_GATEHOUSELARGE) + && (_tType != OpenSHC::Map::Buildings::BT_GATEHOUSESMALL)) + goto LAB_0049838d; + _tDiff = -90; + } + /* + test if height difference is within margin + */ + if ((int)(_tHeight + _tDiff) <= (int)(_cHeight + 0x10) + && (int)(_cHeight - 0x10) <= (int)(_tHeight + _tDiff)) + goto LAB_00498308; + } + } + } else { + LAB_00498308: + /* + add to queue also jumped to when height difference is within margin + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + short sVar3 + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + LAB_0049838d: + _direction = _direction + 1; + paiVar4 = (int (*)[8])(*paiVar4 + 1); + } while (_direction < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } + this->searchNonmatchCount = this->searchNonmatchCount + 1; + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp new file mode 100644 index 0000000000..e243694b26 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp @@ -0,0 +1,131 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049CE40 + void PathFindingState::findPathableTileWithoutUnitWithBuildingAtXY(int unitID, int x, int y) + { + short* psVar1; + int iVar2; + int (*paiVar3)[8]; + short _buildingAtStart; + int _tile; + int _x; + int _y; + this->calculations = this->calculations + 1; + this->ALG_ResultTile = 0; + this->ALG_ResultY = 0; + this->ALG_ResultX = 0; + if ((uint)x <= 399 && (uint)y <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] != '\0') { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + _buildingAtStart = DAT_TileMapState::instance.BuildingLayer[this->searchQueue.tilesQueue[0]]; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _tile && (_tile < 0x13a10))) { + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + iVar2 = (int)_y; + int _unitID = (int)(short)DAT_TileMapState::instance.UnitLayer[_tile]; + if (_unitID == unitID) { + this->ALG_ResultX = (int)_x; + this->ALG_ResultY = iVar2; + this->ALG_ResultTile = _tile; + return; + } + /* + find building space without unit + */ + if (DAT_TileMapState::instance.OccupancyLayer[_tile] == '\0' && _unitID == 0 + && _buildingAtStart == DAT_TileMapState::instance.BuildingLayer[_tile]) { + this->ALG_ResultX = (int)_x; + this->ALG_ResultY = iVar2; + this->ALG_ResultTile = _tile; + return; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return; + } + if (0x19 < this->searchQueue.currentDistance) { + return; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + /* + for each direction, do: + */ + int _candidate + = DAT_TileMapState::instance.directionTranslationMatrix[iVar2][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_candidate] & 0xb1U) == 0 + && (DAT_TileMapState::instance.LogicLayer[_candidate] & 0x1000U) == 0 + && (short)DAT_TileMapState::instance.PathConnectionLayer[_candidate] != 0) { + /* + queue pathable tiles that aren't see nor tree + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp new file mode 100644 index 0000000000..6093e5eb6a --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp @@ -0,0 +1,45 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00497690 + void PathFindingState::findPositionForGivenClimbArea(int area, uint x, uint y) + { + int _direction; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + int _directionIndex = 0; + while (_direction = (int)(char)DAT_ClimbLogicDefinedData::instance.DirectionArray[_directionIndex], + (short)DAT_TileMapState::instance + .PathConnectionLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][_direction] + + DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x] + != area) { + _directionIndex = _directionIndex + 1; + if (7 < _directionIndex) { + return; + } + } + this->climbX + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.xOffset + x; + this->climbY + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.yOffset + y; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp new file mode 100644 index 0000000000..e0b6814933 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -0,0 +1,181 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeShort; + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A1D30 + undefined4 PathFindingState::findSomeSuitableLocationUnk(int param_1, uint x, uint y, int param_4) + { + int iVar5; + short* psVar6; + int* piVar7; + int iVar8; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return (undefined4)(0); + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((iVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < iVar5 && (iVar5 < 0x13a10))) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar5]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return (undefined4)(0); + } + if (this->searchQueue.currentDistance > param_4) { + return (undefined4)(0); + } + short sVar3 = DAT_TileMapState::instance.BuildingLayer[iVar5]; + if (sVar3 != 0) { + BuildingTypeShort BVar4 = DAT_BuildingsState::instance.buildings[sVar3].buildingType; + if (BVar4 != OpenSHC::Map::Buildings::BT_QUARRY + && BVar4 != OpenSHC::Map::Buildings::BT_KILLINGPIT + && DAT_GameState::instance.mapAndTime + .playerTeams[DAT_BuildingsState::instance.buildings[sVar3].owner] + != DAT_GameState::instance.mapAndTime.playerTeams[param_1]) { + return (undefined4)(1); + } + } + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x100U) != 0 + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 2U) == 0 + && DAT_GameState::instance.mapAndTime + .playerTeams[(DAT_TileMapState::instance.WallOwnerLayer[iVar5] & 7) + 1] + != DAT_GameState::instance.mapAndTime.playerTeams[param_1]) { + return (undefined4)(1); + } + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + iVar5; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 1] + iVar5; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 2] + iVar5; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 3] + iVar5; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return (undefined4)(0); + } + } + } + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp new file mode 100644 index 0000000000..88be5d1df9 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp @@ -0,0 +1,96 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00497B80 + undefined4 PathFindingState::findSuitableSpawnLocationUnk( + int x, int y, int x2, int y2, int param_5, int param_6) + { + if (399 < (uint)x || 399 < (uint)y + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return (undefined4)(0); + } + if (x2 != -1 + && (399 < (uint)x2 || 399 < (uint)y2 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] == '\0') + && 500 < param_5) { + param_5 = 500; + } + if (param_6 == 0) { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.depth = 0; + } + /* + The eight-neighbour expansion below is handwritten assembly in the original and reaches + the layers and the queue through these locals; see LinkageNeighbourAsm.hpp. This is the + variant that only enters a neighbour whose OccupancyLayer byte is zero. + */ + short _curGen = (short)this->searchGeneration; + short* _walkLayer = DAT_TileMapState::instance.WalkLayer; + short* _certainPath = DAT_TileMapState::instance.CertainPathLayer; + uchar* _linkage = DAT_TileMapState::instance.PathLinkageLayer; + uchar* _occupancy = DAT_TileMapState::instance.OccupancyLayer; + int* _tilesQueue = this->searchQueue.tilesQueue; + short* _yQueue = this->searchQueue.yQueue; + int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; + + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = _curGen; + + y = this->searchQueue.writeIndex; + int _readIndex = this->searchQueue.readIndex; + param_6 = this->searchQueue.depth; + if (x2 == -1) { + x = 0; + } else { + x = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; + } + int _result = 0; + while (_readIndex != y && param_6 < param_5) { + param_6 = param_6 + 1; + int _tile = this->searchQueue.tilesQueue[_readIndex]; + if (_tile == x) { + _result = 1; + break; + } + short _cCardinalDistance = _certainPath[_tile] + 1; + int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; + int _cLink = _linkage[_tile]; + + MACRO_LINKAGE_EXPAND_FREE_NEIGHBOURS(1, y) + + _readIndex = _readIndex + 1; + } + this->searchQueue.writeIndex = y; + this->searchQueue.readIndex = _readIndex; + this->searchQueue.depth = param_6; + return (undefined4)(_result); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp new file mode 100644 index 0000000000..8061efbb51 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp @@ -0,0 +1,107 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Units/TroopValueState.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_TroopValueState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049F2D0 + int PathFindingState::findSupportPointIndex(int max, uint x, uint y, int tribeID) + { + int iVar4; + int iVar5; + int tile; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return 0; + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < iVar4 && (iVar4 < 0x13a10))) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return 0; + } + if ((int)this->searchQueue.currentDistance > max) { + return 0; + } + for (int iVar6 = 0; iVar6 < 8; iVar6 = iVar6 + 1) { + if ((DAT_TileMapState::instance.PathLinkageLayer[iVar4] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6]) + != 0 + && (tile = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar6] + iVar4, + DAT_TileMapState::instance.WalkLayer[tile] != this->searchGeneration)) { + if (4 < (int)this->searchQueue.currentDistance + && (DAT_TileMapState::instance.AIInfoLayer[tile] & 0x40) != 0 + && (iVar5 + = MACRO_CALL_MEMBER(OpenSHC::Map::Units::TroopValueState_Func::getSupportPointIndex, + DAT_TroopValueState::ptr)(tile), + iVar5 != 0) + && iVar5 != DAT_TribesState::instance.tribes[tribeID].supportPointIndex + && DAT_TroopValueState::instance.attackInfo.supportPointsArray[iVar5].tribeID == 0) { + return iVar5; + } + DAT_TileMapState::instance.CertainPathLayer[tile] + = (short)this->searchQueue.currentDistance + 1; + short sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .short_.xOffset; + DAT_TileMapState::instance.WalkLayer[tile] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = tile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return 0; + } + } + } + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp new file mode 100644 index 0000000000..12a36822b7 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp @@ -0,0 +1,65 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Navigation::Algorithms::XYPair; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A8780 + int PathFindingState::findUnitPreferredOrientationBasedConnectedTile(int unitID, int tile) + { + int _can; + XYPair* pXVar1; + int _y; + int _candidate; + ushort _area; + _y = (int)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; + int _x = tile - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::calculatePreferredRelativeOrientation, + DAT_DirectionAlgorithmState::ptr)(_x, _y, (int)(DAT_UnitsState::instance.units[unitID].x), + (int)(DAT_UnitsState::instance.units[unitID].y)); + _area = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[unitID].tile]; + pXVar1 + = DAT_ClimbLogicDefinedData::instance + .OrderedOrientationBasedCardinalDirectionList[DAT_DirectionAlgorithmState::instance.orientation]; + tile = 0; + while (true) { + _candidate = DAT_ViewportRenderState::instance.translationMatrix[pXVar1->y + _y].addXgetTile + + ((XYPair*)&pXVar1->x)->x + _x; + dword _toArea = (dword) * (short*)((int)DAT_TileMapState::ptr + _candidate * 2 + 0x363ed0); + if ((int)(short)_area == _toArea + || (_can = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)((int)DAT_UnitsState::instance.units[unitID].owner, (dword)((int)((short)_area)), + (dword)((int)(_toArea)), 0), + _can != 0)) + break; + tile = tile + 1; + pXVar1 = pXVar1 + 1; + if (3 < tile) { + return 0; + } + } + return _candidate; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp new file mode 100644 index 0000000000..418a2f2c5f --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp @@ -0,0 +1,128 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/TileMapState.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049D340 + void PathFindingState::findWalkableTileThatDoesNotContainUnit(int unitID, uint x, uint y, int considerUnits) + { + uint _tHeight; + short* psVar2; + uint _absHeight; + int (*paiVar3)[8]; + int _area; + uint _heightDiff; + int _tile; + int _x; + int _y; + int _unitHeight = (short)DAT_UnitsState::instance.units[unitID].buildingHeight + + (short)DAT_UnitsState::instance.units[unitID].terrainOrClimbHeight; + this->calculations = this->calculations + 1; + this->ALG_ResultTile = 0; + this->ALG_ResultY = 0; + this->ALG_ResultX = 0; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + _area = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[unitID].tile]; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if ((DAT_TileMapState::instance.LogicLayer[this->searchQueue.tilesQueue[0]] & 0x30) == 0 + && this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile < 0) { + break; + } + if (0x13a10 <= _tile) { + break; + } + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + if ((((int)(short)DAT_TileMapState::instance.UnitLayer[_tile] == 0) || (considerUnits == 0)) + && (short)DAT_TileMapState::instance.UnitLayer[_tile] != unitID + && _area == (short)DAT_TileMapState::instance.PathConnectionLayer[_tile] + && (_tHeight = MACRO_CALL_MEMBER( + OpenSHC::Map::TileMapState_Func::getTotalHeightAtTile, DAT_TileMapState::ptr)(_tile), + _heightDiff = _unitHeight - _tHeight, + _absHeight = (int)_heightDiff >> 0x1f, + (int)((_heightDiff ^ _absHeight) - _absHeight) < 16)) { + this->ALG_ResultX = (int)_x; + this->ALG_ResultY = (int)_y; + this->ALG_ResultTile = _tile; + return; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + int iVar1 = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar1] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar1] & 0xb1U) == 0 + && (DAT_TileMapState::instance.LogicLayer[iVar1] & 0x1400U) == 0 + && (short)DAT_TileMapState::instance.PathConnectionLayer[iVar1] == _area) { + DAT_TileMapState::instance.CertainPathLayer[iVar1] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar1] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar1; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/getGatehouseNearSomethingUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/getGatehouseNearSomethingUnk.cpp new file mode 100644 index 0000000000..f45137e2c9 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/getGatehouseNearSomethingUnk.cpp @@ -0,0 +1,118 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingLogicalState.hpp" +#include "OpenSHC/Map/Buildings/BuildingLogicalStateShort.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Buildings::BuildingLogicalState; + using OpenSHC::Map::Buildings::BuildingLogicalStateShort; + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeShort; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A08E0 + int PathFindingState::getGatehouseNearSomethingUnk(int param_1, int param_2, int param_3, int maxDistance) + { + BuildingLogicalStateShort BVar2; + BuildingTypeShort BVar3; + int iVar4; + int (*paiVar8)[8]; + this->searchGeneration = this->searchGeneration + 1; + this->calculations = this->calculations + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.yQueue[0] = (short)param_3; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < iVar4 && (iVar4 < 0x13a10))) { + int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return 0; + } + if ((int)this->searchQueue.currentDistance > maxDistance) { + return 0; + } + int iVar7 = 0; + paiVar8 = DAT_TileMapState::instance.directionTranslationMatrix + sVar1; + do { + int iVar6 = (*paiVar8)[0] + iVar4; + int iVar5 = (int)DAT_TileMapState::instance.BuildingLayer[iVar6]; + if (((iVar5 != 0) + || ((DAT_TileMapState::instance.PathLinkageLayer[iVar4] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar7]) + != 0)) + && DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar7] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + if (iVar5 != 0 + && DAT_GameState::instance.mapAndTime.playerTeams[param_1] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_BuildingsState::instance.buildings[iVar5].owner] + && (BVar2 = DAT_BuildingsState::instance.buildings[iVar5].logicalState, + BVar2 != ((BuildingLogicalState)0) + && (BVar2 != OpenSHC::Map::Buildings::BLS_REMOVE)) + && (BVar3 = DAT_BuildingsState::instance.buildings[iVar5].buildingType, + BVar3 == OpenSHC::Map::Buildings::BT_GATEHOUSELARGE + || (BVar3 == OpenSHC::Map::Buildings::BT_GATEHOUSESMALL)) + && DAT_BuildingsState::instance.buildings[iVar5].fireDuration == 0) { + return iVar5; + } + } + iVar7 = iVar7 + 1; + paiVar8 = (int (*)[8])(*paiVar8 + 1); + } while (iVar7 < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return 0; + } + } + } + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp new file mode 100644 index 0000000000..c768b1306b --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp @@ -0,0 +1,108 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Function: __alloca_probe replaced with injection: alloca_probe + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + fixme:bug: the index parameter is off by -1 for brush indices larger than 6. Phrased differently, index 7 is + faulty decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049BE60 + void PathFindingState::getTileInSquareBrush(int brushTileIndex, uint x, uint y) + { + int (*_dirAtTile)[8]; + int _index_3; + int _tracker_3; + int _tracker; + uint _yArray[1000]; + int _tileArray[1000]; + int _tile_2; + uint _y; + int _yTranslationUnk; + /* + __chkstk + */ + _tileArray[999] = 0x49be6a; + _index_3 = 1; + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + _tracker = 0; + _tracker_3 = 0; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->resultTile = 0; + this->resultY = 0; + this->resultX = 0; + if (x <= 399 && y <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] != '\0') { + _tileArray[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + _yArray[0] = y; + if (brushTileIndex < 1) { + this->resultY = y; + this->resultTile = _tileArray[0]; + return; + } + while ((_tile_2 = _tileArray[_tracker_3], -1 < _tile_2 && (_tile_2 < 80400))) { + _y = _yArray[_tracker_3]; + if ((DAT_TileMapState::instance.LogicLayer[_tile_2] & 0x30) == 0) { + int _direction = 0; + _dirAtTile = DAT_TileMapState::instance.directionTranslationMatrix + _y; + do { + int _currentTile = (*_dirAtTile)[0] + _tile_2; + if (DAT_TileMapState::instance.WalkLayer[_currentTile] != this->searchGeneration) { + _tracker = _tracker + 1; + if (brushTileIndex <= _tracker) { + this->resultY = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + + _y; + this->resultTile = _currentTile; + return; + } + DAT_TileMapState::instance.WalkLayer[_currentTile] = (short)this->searchGeneration; + _yTranslationUnk + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset; + _tileArray[_index_3] = _currentTile; + _yArray[_index_3] = _yTranslationUnk + _y; + _index_3 = _index_3 + 1; + if (_index_3 >= 80400) { + _index_3 = 0; + } + } + _direction = _direction + 2; + _dirAtTile = (int (*)[8])(*_dirAtTile + 2); + } while (_direction < 8); + } + _tracker_3 = _tracker_3 + 1; + if (80400 < _tracker_3) { + _tracker_3 = 0; + } + if (_tracker_3 == _index_3) { + return; + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp new file mode 100644 index 0000000000..0ea1bf7193 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp @@ -0,0 +1,179 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + BFS from tile param_1 up to distance param_2. For every unit owned by player param_3 found on visited tiles, + adds param_4 health, clamped to the unit's maxHealth. Also updates healthPercentage and healthbar fields + accordingly. Used for area healing effects such as from buildings or abilities. renamed by: Claude + Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A36B0 + undefined4 PathFindingState::healUnitsOfPlayerWithinRadius(int param_1, int param_2, int param_3, int param_4) + { + uint uVar4; + short sVar6; + short* psVar7; + int iVar8; + int* piVar9; + this->searchGeneration = this->searchGeneration + 1; + this->calculations = this->calculations + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.yQueue[0] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[param_1]; + this->searchQueue.xQueue[0] = (short)param_1 + - (short)DAT_ViewportRenderState::instance.translationMatrix[this->searchQueue.yQueue[0]].addXgetTile; + this->searchQueue.tilesQueue[0] = param_1; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + DAT_TileMapState::instance.CertainPathLayer[param_1] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar4 < 0x13a10) { + short sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; + short sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return (undefined4)(0); + } + if (this->searchQueue.currentDistance > param_2) { + return (undefined4)(0); + } + int uVar3 = (short)DAT_TileMapState::instance.UnitLayer[uVar4]; + while (iVar8 = (int)(short)uVar3, iVar8 != 0) { + if (DAT_UnitsState::instance.units[iVar8].owner == param_3) { + DAT_UnitsState::instance.units[iVar8].health + = DAT_UnitsState::instance.units[iVar8].health + param_4; + int iVar5 = DAT_UnitsState::instance.units[iVar8].maxHealth; + if (iVar5 < DAT_UnitsState::instance.units[iVar8].health) { + DAT_UnitsState::instance.units[iVar8].health = iVar5; + } + if (iVar5 == 0) { + sVar6 = 100; + } else { + sVar6 = (short)((DAT_UnitsState::instance.units[iVar8].health * 100) / iVar5); + } + DAT_UnitsState::instance.units[iVar8].healthPercentage = sVar6; + DAT_UnitsState::instance.units[iVar8].healthbar + = (sVar6 / 10 + (sVar6 >> 0xf)) - (short)((longlong)(int)sVar6 * 0x66666667 >> 0x3f); + } + uVar3 = DAT_UnitsState::instance.units[iVar8].nextUnitOnTheSameTile; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 1] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 2] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 3] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return (undefined4)(0); + } + } + } + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp new file mode 100644 index 0000000000..0aaf6e7b7f --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp @@ -0,0 +1,177 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Entities.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A2DD0 + undefined4 PathFindingState::igniteFireAtTilesDistanceAway(int tile, int maxDistance, int playerID) + { + short* psVar3; + int* piVar4; + int iVar5; + int _index2; + int _index; + uint _tiles[100]; + uint _tile; + uint _cTile; + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + _index = 0; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.yQueue[0] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; + this->searchQueue.xQueue[0] = (short)tile + - (short)DAT_ViewportRenderState::instance.translationMatrix[this->searchQueue.yQueue[0]].addXgetTile; + this->searchQueue.tilesQueue[0] = tile; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + DAT_TileMapState::instance.CertainPathLayer[tile] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile < 0x13a10) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if ((0x13a10 < (int)this->searchQueue.currentDistance) + || (this->searchQueue.currentDistance > maxDistance)) + break; + _tiles[_index] = _tile; + _index = _index + 1; + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + /* + For every direction, queue tiles that are not a border tile + */ + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 1] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 2] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 3] + _tile; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) + break; + } + } + _index2 = 0; + if (0 < _index) { + do { + _cTile = _tiles[_index2]; + MACRO_CALL(OpenSHC::Map::Entities_Func::IgniteFireAtMiniTile_Convenience)(playerID, + (_cTile + - DAT_ViewportRenderState::instance + .translationMatrix[DAT_ViewportRenderState::instance + .tileTranslationMatrix_YComponent[_cTile]] + .addXgetTile) + * 8, + (int)((short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_cTile] * 8), + (int)(DAT_TileMapState::instance.HeightLayer[_cTile]), 2); + _index2 = _index2 + 1; + } while (_index2 < _index); + } + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp new file mode 100644 index 0000000000..32fa71e778 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp @@ -0,0 +1,58 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A15B0 + BOOLEnum PathFindingState::isEnemyTooCloseUnk(int playerID, uint x, uint y, int requiredDistance) + { + short* _enemyIdPtr; + int _xEnemyDistance; + int _enemyLoopCounter; + int _yEnemyDistance; + int _enemies; + short _enemyID; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + _enemies = DAT_GameState::instance.playerDataArray[playerID].enemies; + _enemyLoopCounter = 0; + if (0 < _enemies) { + _enemyIdPtr = DAT_GameState::instance.playerDataArray[playerID].enemyIDArray; + do { + _enemyID = *_enemyIdPtr; + if (DAT_UnitsState::instance.units[_enemyID].dying == 0 + && DAT_UnitsState::instance.units[_enemyID].uid + == *(int*)(playerID * 10000 + 0x11a66f0 + _enemyLoopCounter * 4) + && (_xEnemyDistance = x - (int)DAT_UnitsState::instance.units[_enemyID].x, + _yEnemyDistance = y - (int)DAT_UnitsState::instance.units[_enemyID].y, + _yEnemyDistance * _yEnemyDistance + _xEnemyDistance * _xEnemyDistance + < requiredDistance * requiredDistance + && ((DAT_UnitsState::instance.units[_enemyID].unknownTestAgainst0_2 == 0 + && (DAT_UnitsState::instance.units[_enemyID].moveRelatedFlag != 1)))) + && DAT_UnitsState::instance.units[_enemyID].isStalked == 0 + && DAT_UnitsState::instance.units[_enemyID].owner != 0) { + return TRUE; + } + _enemyLoopCounter = _enemyLoopCounter + 1; + _enemyIdPtr = _enemyIdPtr + 1; + } while (_enemyLoopCounter < _enemies); + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp new file mode 100644 index 0000000000..41a73e1796 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -0,0 +1,123 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A9200 + undefined4 PathFindingState::isOpponentBuildingInRange( + int playerID, int x, int y, int range, int param_5, int param_6, int keepRange) + { + int iVar1; + short* psVar2; + int (*paiVar3)[8]; + int _tile; + short _buildingID; + int _x; + int _y; + if (399 < (uint)x || 399 < (uint)y + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return (undefined4)(0); + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (( + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _tile && (_tile < 80400))) { + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if ((80400 < this->searchQueue.currentDistance) || (this->searchQueue.currentDistance > range)) + break; + _buildingID = DAT_TileMapState::instance.BuildingLayer[_tile]; + if (_buildingID != 0 + && DAT_BuildingDefinedData::instance.BuildingTypeOwnable + [(short)DAT_BuildingsState::instance.buildings[_buildingID].buildingType] + != 0 + && DAT_GameState::instance.mapAndTime + .playerTeams[DAT_BuildingsState::instance.buildings[_buildingID].owner] + != DAT_GameState::instance.mapAndTime.playerTeams[playerID]) { + return (undefined4)(1); + } + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x100U) != 0 + && (DAT_TileMapState::instance.LogicLayer[_tile] & 2U) == 0 + && DAT_GameState::instance.mapAndTime + .playerTeams[(DAT_TileMapState::instance.WallOwnerLayer[_tile] & 7) + 1] + != DAT_GameState::instance.mapAndTime.playerTeams[playerID]) { + return (undefined4)(1); + } + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + int _newTile = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_newTile] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_newTile] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_newTile] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_newTile] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _newTile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (80400 < this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) + break; + } + } + if (keepRange != -1 + && (iVar1 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::isTileInRangeOfKeepRange, + this)(playerID, (uint)(x), (uint)(y), keepRange), + iVar1 != 0)) { + return (undefined4)(1); + } + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp new file mode 100644 index 0000000000..06d552d127 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp @@ -0,0 +1,180 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Game/GameMode.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Game::GameMode; + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "DPSEND_EnumInt": Some values do not have unique names + */ + /* + WARNING: Enum "DPERRInt": Some values do not have unique names + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A2650 + BOOLEnum PathFindingState::isSignPostWithinDistance(uint x, uint y, int limit) + { + int iVar3; + short* psVar4; + int* piVar5; + int iVar6; + if (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY) { + return FALSE; + } + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < iVar3 && (iVar3 < 0x13a10))) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar3]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return FALSE; + } + if (this->searchQueue.currentDistance > limit) { + return FALSE; + } + if ((DAT_TileMapState::instance.BuildingLayer[iVar3] != 0) + && (DAT_BuildingsState::instance.buildings[DAT_TileMapState::instance.BuildingLayer[iVar3]] + .buildingType + == OpenSHC::Map::Buildings::BT_SIGNPOST)) { + return TRUE; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + iVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 1] + iVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 2] + iVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 3] + iVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return FALSE; + } + } + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp new file mode 100644 index 0000000000..3aa8f1d028 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp @@ -0,0 +1,63 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Game/Player/BuildingEntryInfo.hpp" +#include "OpenSHC/Map/Buildings/BuildingFailReasonEnum.hpp" + +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Game::Player::BuildingEntryInfo; + using OpenSHC::Map::Buildings::BuildingFailReasonEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A1C40 + undefined4 PathFindingState::isTileInRangeOfKeepRange(int playerID, uint x, uint y, int range) + { + int* piVar1; + int* piVar2; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return (undefined4)(0); + } + if (DAT_GameState::instance.playerDataArray[playerID].keep.id != 0 + && (MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, + DAT_DirectionAlgorithmState::ptr)(x, (int)(y), + DAT_GameState::instance.playerDataArray[playerID].keep.xEntry, + DAT_GameState::instance.playerDataArray[playerID].keep.yEntry), + DAT_DirectionAlgorithmState::instance.distanceHigh <= range)) { + return (undefined4)(0); + } + piVar1 = &DAT_GameState::instance.playerDataArray[1].keep.yEntry; + piVar2 = DAT_GameState::instance.mapAndTime.playerTeams + 1; + while (*piVar2 != DAT_GameState::instance.mapAndTime.playerTeams[playerID] + || ((BuildingEntryInfo*)(piVar1 + -2))->id == 0 + || (MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, + DAT_DirectionAlgorithmState::ptr)(x, (int)(y), (int)(piVar1[-1]), (int)(*piVar1)), + range / 2 < DAT_DirectionAlgorithmState::instance.distanceHigh)) { + piVar2 = piVar2 + 1; + piVar1 = piVar1 + 0xe7d; + if (0x117d56b < (int)piVar2) { + DAT_TileMapState::instance.buildingPlacementFailReason = ((BuildingFailReasonEnum)0x12); + return (undefined4)(1); + } + } + return (undefined4)(0); + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isUsableClimbWithinArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isUsableClimbWithinArea.cpp new file mode 100644 index 0000000000..7e2ff91afd --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isUsableClimbWithinArea.cpp @@ -0,0 +1,29 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A4B30 + BOOLEnum PathFindingState::isUsableClimbWithinArea(int area, int wallDataID) + { + if ((this->climbData[wallDataID].canBeUsed == 1) + && (this->climbData[wallDataID].isRecognizedByPathfinding != 0)) { + if (this->climbData[wallDataID].area == area) { + return TRUE; + } + return (uint)(this->climbData[wallDataID].wallGroupAreaID == area); + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp new file mode 100644 index 0000000000..081291330f --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp @@ -0,0 +1,182 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8IntXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8IntXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + Computes the distance to reach x and y, has a shortcut to basically return distance 1 if the area of the + destination is the same as the current area was decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049B1D0 + void PathFindingState::pathFindingDeerAndLionsUnk(int originArea, uint destinationX, uint destinationY) + { + int _neswTile1; + int _neswTile2; + int _neswTile3; + int _neswTile4; + int _currentTile; + int _currentX; + int _currentY; + if (destinationX <= 399 && destinationY <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[destinationY * 400 + destinationX] + != '\0') { + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + this->climbX = destinationX; + this->climbY = destinationY; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.xQueue[0] = (short)destinationX; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)destinationY; + this->searchQueue.tilesQueue[0] + = destinationX + DAT_ViewportRenderState::instance.translationMatrix[destinationY].addXgetTile; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((_currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < _currentTile && (_currentTile < 80400))) { + _currentX = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _currentY = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + if ((short)DAT_TileMapState::instance.PathConnectionLayer[_currentTile] == originArea) { + this->climbX = (int)_currentX; + this->climbY = (int)_currentY; + return; + } + this->searchQueue.currentDistance + = (int)DAT_TileMapState::instance.CertainPathLayer[_currentTile]; + if (6 < (int)this->searchQueue.currentDistance) { + return; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + _neswTile1 + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 0] + + _currentTile; + if ((DAT_TileMapState::instance.LogicLayer[_neswTile1] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_neswTile1] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_neswTile1] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 0] + .int_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 0] + .int_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _neswTile1; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _neswTile2 + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 1] + + _currentTile; + if ((DAT_TileMapState::instance.LogicLayer[_neswTile2] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_neswTile2] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_neswTile2] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] + .int_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] + .int_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _neswTile2; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _neswTile3 + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 2] + + _currentTile; + if ((DAT_TileMapState::instance.LogicLayer[_neswTile3] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_neswTile3] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_neswTile3] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] + .int_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] + .int_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _neswTile3; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _neswTile4 + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 3] + + _currentTile; + if ((DAT_TileMapState::instance.LogicLayer[_neswTile4] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_neswTile4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_neswTile4] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] + .int_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] + .int_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _neswTile4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (80400 < (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + /* + the right hand side stops incrementing if no valid tiles are found, so the left hand side + catches up breaking when finished. Very elegant + */ + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp new file mode 100644 index 0000000000..95dd8935d9 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -0,0 +1,134 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049FC00 + dword PathFindingState::pathFindingRelated(int param_1, uint param_2, uint param_3, int param_4) + { + uint uVar5; + int iVar8; + dword dVar6 = 1000; + uint local_1c = 1000; + dword local_14 = 0; + int local_18 = 10000; + if (param_2 > 399 || param_3 > 399 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { + return (dword)(dVar6); + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)param_3; + this->searchQueue.xQueue[0] = (short)param_2; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; + int bVar1 = *(byte*)(param_4 * 0x13a10 + 0x1ee2998 + this->searchQueue.tilesQueue[0]); + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (uVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar5 < 0x13a10) { + short sVar2 = this->searchQueue.xQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar5]; + short sVar3 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + int iVar7 = (int)sVar3; + if ((0x13a10 < (int)this->searchQueue.currentDistance) || (this->searchQueue.currentDistance > param_1)) + break; + for (int iVar10 = 0; iVar10 < 8; iVar10 = iVar10 + 1) { + if ((DAT_TileMapState::instance.PathLinkageLayer[uVar5] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar10]) + != 0 + && (dVar6 = DAT_TileMapState::instance.directionTranslationMatrix[iVar7][iVar10] + uVar5, + DAT_TileMapState::instance.WalkLayer[dVar6] != this->searchGeneration)) { + uint uVar9 = (uint) * (byte*)(param_4 * 0x13a10 + 0x1ee2998 + dVar6); + if (uVar9 < 4) { + uVar9 = 0; + LAB_0049fdba: + if (uVar9 == local_1c + && (iVar8 + = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::DirectionAlgorithmState_Func:: + setAxisBasedDistanceResult, + DAT_DirectionAlgorithmState::ptr)(param_2, (int)(param_3), + (int)(DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[iVar10] + .int_.xOffset + + sVar2), + DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar10] + .int_.yOffset + + iVar7), + iVar8 < local_18)) + goto LAB_0049fdee; + } else { + if ((uVar9 == 0) || (local_1c <= uVar9)) + goto LAB_0049fdba; + iVar8 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, + DAT_DirectionAlgorithmState::ptr)(param_2, (int)(param_3), + (int)(DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar10] + .int_.xOffset + + sVar2), + DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar10] + .int_.yOffset + + iVar7); + LAB_0049fdee: + local_1c = uVar9; + local_18 = iVar8; + local_14 = dVar6; + } + DAT_TileMapState::instance.CertainPathLayer[dVar6] + = (short)this->searchQueue.currentDistance + 1; + short sVar4 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar10] + .short_.xOffset; + DAT_TileMapState::instance.WalkLayer[dVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar4 + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar10] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = dVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) + break; + } + } + this->field51_0x9c = bVar1 - local_1c; + dVar6 = local_14; + return (dword)(dVar6); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp new file mode 100644 index 0000000000..58007452dd --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp @@ -0,0 +1,70 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00497080 + dword PathFindingState::pathFindingResultBased(int param_1, int x, int y, int extraDistance) + { + int* _tilesPointer; + uint _isNegativeNumberX; + uint _isNegativeNumberY; + int _index; + int _distance; + int _tile; + _tilesPointer = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; + _index = DAT_TribesState::instance.ALG_ResultTileIndex; + do { + _tile = *_tilesPointer; + _distance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x10000100U) != 0 && 0 < _distance) { + if (extraDistance + 0xc < _distance) { + return (dword)(0); + } + uint _someX = (_tile + - DAT_ViewportRenderState::instance + .translationMatrix[DAT_ViewportRenderState::instance + .tileTranslationMatrix_YComponent[_tile]] + .addXgetTile) + - x; + _isNegativeNumberX = (int)_someX >> 0x1f; + uint _someY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile] - y; + _isNegativeNumberY = (int)_someY >> 0x1f; + if ((int)(((_someY ^ _isNegativeNumberY) - _isNegativeNumberY) + + ((_someX ^ _isNegativeNumberX) - _isNegativeNumberX)) + % param_1 + == 0 + && _distance < 4000) { + dword dVar1 = this->searchQueue.tilesQueue[_index]; + DAT_TribesState::instance.ALG_ResultY = (int)this->searchQueue.yQueue[_index]; + DAT_TribesState::instance.ALG_ResultTileIndex = _index; + DAT_TribesState::instance.ALG_ResultX = dVar1 + - DAT_ViewportRenderState::instance.translationMatrix[DAT_TribesState::instance.ALG_ResultY] + .addXgetTile; + return (dword)(dVar1); + } + } + _index = _index + 1; + _tilesPointer = _tilesPointer + 1; + if (4000 < _index) { + return (dword)(0); + } + } while (DAT_TileMapState::instance.WalkLayer[_tile] + == DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]]); + return (dword)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp new file mode 100644 index 0000000000..b67e9a4273 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp @@ -0,0 +1,130 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/TileMapState.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A4140 + BOOLEnum PathFindingState::pathFindingToAttackCastleIncludingMoat( + undefined4 playerID, int wallOwnerPlayerID, uint x, uint y, byte* out_successUnk, int* out_x, int* out_y) + { + this->calculations = this->calculations + 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.CertainPathLayer))); + *out_y = 0; + *out_x = 0; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + int _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if ((_currentTile < 0) || (0x13a0f < _currentTile)) { + return FALSE; + } + int _currentX = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int _currentY = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + if ((DAT_TileMapState::instance.LogicLayer[_currentTile] & 0x100) != 0 + && (DAT_TileMapState::instance.LogicLayer[_currentTile] & 2) == 0 + && wallOwnerPlayerID == (DAT_TileMapState::instance.WallOwnerLayer[_currentTile] & 7) + 1) { + *out_successUnk = 1; + *out_x = (int)_currentX; + *out_y = (int)_currentY; + return TRUE; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_currentTile]; + /* + Check all directions for movement + */ + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + int _nextTile + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] + _currentTile; + if (DAT_TileMapState::instance.WalkLayer[_nextTile] == this->searchGeneration + || (DAT_TileMapState::instance.LogicLayer[_nextTile] & 0x31) != 0 + || (((DAT_TileMapState::instance.LogicLayer[_nextTile] & 0x100000) != 0) + && ((DAT_TileMapState::instance.LogicLayer[_nextTile] & 0x200000) == 0)) + || (char)DAT_TileMapState::instance.LogicLayer[_nextTile] < 0 + || (DAT_TileMapState::instance.LogicLayer[_nextTile] & 0x1000) != 0) { + continue; + } + if ((DAT_TileMapState::instance.BuildingLayer[_nextTile] != 0) + && (2 < (int)(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_nextTile]] + .buildingType + - 0x4a)) { + continue; + } + if ((DAT_TileMapState::instance.LogicLayer[_nextTile] & 0x40000000) != 0) { + int _moatID = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::returnMoatIDForPlayerIDs, + DAT_TileMapState::ptr)(_nextTile, wallOwnerPlayerID); + if (_moatID != 0) { + *out_successUnk = 0; + *out_y = (int)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_nextTile]; + *out_x = _nextTile + - DAT_ViewportRenderState::instance + .translationMatrix[DAT_ViewportRenderState::instance + .tileTranslationMatrix_YComponent[_nextTile]] + .addXgetTile; + return TRUE; + } + continue; + } + DAT_TileMapState::instance.CertainPathLayer[_nextTile] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTile] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp new file mode 100644 index 0000000000..95f48e2524 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -0,0 +1,265 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Removing unreachable block (ram,0x00498700) + */ + /* + WARNING: Removing unreachable block (ram,0x00498713) + */ + /* + WARNING: Removing unreachable block (ram,0x0049871e) + */ + /* + WARNING: Removing unreachable block (ram,0x0049872d) + */ + /* + WARNING: Removing unreachable block (ram,0x00498739) + */ + /* + WARNING: Removing unreachable block (ram,0x00498745) + */ + /* + WARNING: Removing unreachable block (ram,0x00498749) + */ + /* + WARNING: Removing unreachable block (ram,0x00498907) + */ + /* + WARNING: Removing unreachable block (ram,0x0049891a) + */ + /* + WARNING: Removing unreachable block (ram,0x00498925) + */ + /* + WARNING: Removing unreachable block (ram,0x00498934) + */ + /* + WARNING: Removing unreachable block (ram,0x00498940) + */ + /* + WARNING: Removing unreachable block (ram,0x0049894c) + */ + /* + WARNING: Removing unreachable block (ram,0x00498950) + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00498400 + BOOLEnum PathFindingState::pathFindingWithBuildingsIncluded( + uint x, uint y, uint x2, uint y2, int maxOptionsToTry, int zeroMeansResetAlgorithm) + { + uint uVar1; + int* piVar2; + int _nextTileOption; + uint uVar3; + uint _tile2; + short _buildingID; + uint _currentTile; + short _currentX; + short _currentY; + uint _logical; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + if (x2 == 0xffffffff + || ((x2 <= 399 && (y2 <= 399)) + && (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] != '\0'))) { + if (zeroMeansResetAlgorithm == 0) { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER( + OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.currentDistance = 1; + } + this->DAT_Ass = this->DAT_Ass + 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] + = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (x2 == 0xffffffff) { + _tile2 = 0; + } else { + _tile2 = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; + } + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (true) { + _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_currentTile == _tile2) { + return TRUE; + } + if ((maxOptionsToTry <= this->searchQueue.readIndex) || (80399 < _currentTile)) + break; + _currentX = this->searchQueue.xQueue[this->searchQueue.readIndex]; + _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance + = (int)DAT_TileMapState::instance.CertainPathLayer[_currentTile]; + if (400 < this->searchQueue.currentDistance) { + return FALSE; + } + _buildingID = DAT_TileMapState::instance.BuildingLayer[_currentTile]; + _logical = DAT_TileMapState::instance.LogicLayer[_currentTile]; + int _direction = 0; + do { + _nextTileOption + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] + + _currentTile; + /* + 0x4a5014b1 == check against walkable tiles including keep, walls, and gatehouses + */ + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) + != 0 + || (((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], + (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) + && (DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0)) + && ((uVar3 = _logical & 0x100, uVar3 == 0 || ((uVar1 & 0x100) == 0)))) + && ((uVar3 != 0 || ((uVar1 & 0x100) != 0))))))) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _nextTileOption + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 1] + + _currentTile; + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 1]) + != 0) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _nextTileOption + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 2] + + _currentTile; + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 2]) + != 0 + || ((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], + (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) + && (DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0)) + && (((uVar3 = _logical & 0x100, uVar3 == 0 || ((uVar1 & 0x100) == 0)) + && ((uVar3 != 0 || ((uVar1 & 0x100) != 0))))))))) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _nextTileOption + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 3] + + _currentTile; + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 3]) + != 0) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _direction = _direction + 4; + } while (_direction < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return FALSE; + } + } + } + } + return FALSE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp new file mode 100644 index 0000000000..87509cc9dd --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -0,0 +1,258 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Units/TribesState.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Type propagation algorithm not settling + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A79A0 + void PathFindingState::pathPlanningForTribe( + uint tribeID, undefined4 targetUnitID, uint x, uint y, int unitCount, dword area, int playerID) + { + int iVar5; + BOOLEnum BVar6; + uint uVar7; + uint uVar8; + int (*paiVar9)[8]; + int* _pDest2; + short* psVar10; + uint uVar11; + int* _pDest3; + int iVar12; + int _destIndex; + int* _pDest1; + _destIndex = 0; + BOOL _assasinsTribe = MACRO_CALL_MEMBER( + OpenSHC::Map::Units::TribesState_Func::isTribeAllAssassins, DAT_TribesState::ptr)(tribeID); + if (399 < x) { + return; + } + if (399 < y) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + unitCount = unitCount * 2; + if (unitCount < 500) { + if (unitCount < 50) { + unitCount = 50; + } + } else { + unitCount = 500; + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + int iVar4 = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = iVar4; + DAT_TileMapState::instance.CertainPathLayer[iVar4] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (uVar11 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar11 < 0x13a10) { + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar11]; + if ((0x13a10 < (int)this->searchQueue.currentDistance) || (10 < this->searchQueue.currentDistance)) + break; + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + iVar12 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + uVar11; + if (DAT_TileMapState::instance.WalkLayer[iVar12] != this->searchGeneration + && ((area == (int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar12] + || (iVar5 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)(playerID, (dword)((int)(area)), + (dword)((int)(( + int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar12])), + 0), + iVar5 != 0)) + || ((_assasinsTribe != 0 + && (BVar6 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanReachUsingCachedAreaLogic, + this)(iVar4, iVar12), + BVar6 != FALSE))))) { + short sVar3 + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset; + DAT_TileMapState::instance.CertainPathLayer[iVar12] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar12] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar12; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) + break; + } + } + this->searchQueue.readIndex = 0; + if (0 < this->searchQueue.writeIndex) { + _pDest1 = &this->searchQueue.destinationsArray[0].tile2OrAHelper; + do { + /* + warning + */ + tribeID = (uint)DAT_TileMapState::instance.HeightLayer[iVar4]; + if ((DAT_TileMapState::instance.LogicLayer[iVar4] & 0x10000000U) != 0) { + iVar12 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar4]); + tribeID = tribeID + iVar12; + } + iVar12 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uVar11 = (uint)DAT_TileMapState::instance.HeightLayer[iVar12]; + if ((DAT_TileMapState::instance.LogicLayer[iVar12] & 0x10000000U) != 0) { + iVar12 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar12]); + uVar11 = uVar11 + iVar12; + } + uVar7 = y - (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + uVar8 = (int)uVar7 >> 0x1f; + iVar5 = (uVar7 ^ uVar8) - uVar8; + uVar7 = x - (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + uVar8 = (int)uVar7 >> 0x1f; + iVar12 = (uVar7 ^ uVar8) - uVar8; + if (iVar12 <= iVar5) { + iVar12 = iVar5; + } + if (iVar12 == 2 + && (uVar7 = (int)(tribeID - uVar11) >> 0x1f, + (int)((tribeID - uVar11 ^ uVar7) - uVar7) < 0x20)) { + _pDest1[-1] = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + _destIndex = _destIndex + 1; + *_pDest1 = 1; + _pDest1 = _pDest1 + 3; + if (unitCount <= _destIndex) { + return; + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + } while (this->searchQueue.readIndex < this->searchQueue.writeIndex); + if (4 < _destIndex) + goto LAB_004a7e8c; + } + this->searchQueue.readIndex = 0; + if (0 < this->searchQueue.writeIndex) { + _pDest2 + = &((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_destIndex].tile2OrAHelper; + do { + tribeID = (uint)DAT_TileMapState::instance.HeightLayer[iVar4]; + if ((DAT_TileMapState::instance.LogicLayer[iVar4] & 0x10000000U) != 0) { + iVar12 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar4]); + tribeID = tribeID + iVar12; + } + iVar12 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uVar11 = (uint)DAT_TileMapState::instance.HeightLayer[iVar12]; + if ((DAT_TileMapState::instance.LogicLayer[iVar12] & 0x10000000U) != 0) { + iVar12 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar12]); + uVar11 = uVar11 + iVar12; + } + uVar7 = y - (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + uVar8 = (int)uVar7 >> 0x1f; + iVar5 = (uVar7 ^ uVar8) - uVar8; + uVar7 = x - (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + uVar8 = (int)uVar7 >> 0x1f; + iVar12 = (uVar7 ^ uVar8) - uVar8; + if (iVar12 <= iVar5) { + iVar12 = iVar5; + } + if (iVar12 == 1 + && (uVar7 = (int)(tribeID - uVar11) >> 0x1f, + (int)((tribeID - uVar11 ^ uVar7) - uVar7) < 0x20)) { + ((PathHelper12*)(_pDest2 + -1))->tile1 + = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + _destIndex = _destIndex + 1; + *_pDest2 = 1; + _pDest2 = _pDest2 + 3; + if (unitCount <= _destIndex) { + return; + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + } while (this->searchQueue.readIndex < this->searchQueue.writeIndex); + } + LAB_004a7e8c: + this->searchQueue.readIndex = 0; + if (0 < this->searchQueue.writeIndex) { + _pDest3 + = &((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_destIndex].tile2OrAHelper; + do { + uint _yDiff3 = y - (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + iVar12 = (_yDiff3 ^ (int)_yDiff3 >> 0x1f) - ((int)_yDiff3 >> 0x1f); + uint _xDiff3 = x - (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + iVar4 = (_xDiff3 ^ (int)_xDiff3 >> 0x1f) - ((int)_xDiff3 >> 0x1f); + if (iVar4 <= iVar12) { + iVar4 = iVar12; + } + if (2 < iVar4) { + ((PathHelper12*)(_pDest3 + -1))->tile1 + = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + _destIndex = _destIndex + 1; + *_pDest3 = 0; + _pDest3 = _pDest3 + 3; + if (unitCount <= _destIndex) { + return; + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + } while (this->searchQueue.readIndex < this->searchQueue.writeIndex); + } + this->searchQueue.destinationsArray[_destIndex].tile1 = 0; + ((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_destIndex].tile2OrAHelper = 0; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp new file mode 100644 index 0000000000..f1ab2a4e72 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -0,0 +1,198 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Units/TribesState.func.hpp" +#include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Navigation::Algorithms::XYPair; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A75B0 + void PathFindingState::pathfindingForAttacksUnk( + int tribeID, int buildingID, int param_3, dword param_4, int param_5) + { + uint uVar5; + BOOLEnum BVar6; + XYPair* pXVar8; + uint uVar9; + int iVar10; + int* piVar11; + int iVar12; + int iVar13; + int iVar14; + int iVar15; + int tile2; + int local_28; + int* local_24; + int local_20; + int iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + uint uVar7 = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; + iVar10 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; + byte bVar1 + = DAT_TileMapState::instance.DefaultHeightLayer[DAT_BuildingsState::instance.buildings[buildingID] + .currentTilePositionAdjusted]; + short sVar2 = DAT_TribesState::instance.tribes[tribeID].selectionTargetUnitID; + local_28 = 0; + BOOLEnum BVar4 = MACRO_CALL_MEMBER( + OpenSHC::Map::Units::TribesState_Func::isTribeAllAssassins, DAT_TribesState::ptr)(tribeID); + param_3 = param_3 * 2; + if (param_3 < 0x1f5) { + if (param_3 < 0x32) { + param_3 = 0x32; + } + } else { + param_3 = 500; + } + iVar14 = DAT_BuildingDefinedData::instance.BuildingAccessibleTilesCount[uVar7]; + local_20 = 0; + tribeID = 0; + if (0 < iVar14) { + local_24 = &this->searchQueue.destinationsArray[0].tile2OrAHelper; + do { + MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func::setupBuildingEntrancesOffset, + DAT_BuildingsState::ptr)(uVar7, 1, local_20, 0); + iVar12 = DAT_ViewportRenderState::instance + .translationMatrix[iVar3 + DAT_BuildingsState::instance.DAT_TempYOffset] + .addXgetTile + + DAT_BuildingsState::instance.DAT_TempXOffset; + iVar13 = iVar12 + iVar10; + uVar5 = (uint)bVar1 - (uint)DAT_TileMapState::instance.HeightLayer[iVar12 + iVar10]; + uVar9 = (int)uVar5 >> 0x1f; + if ((int)((uVar5 ^ uVar9) - uVar9) < 0x20 + && (((int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar13] == param_4 + || (iVar12 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)(param_5, (dword)((int)(param_4)), + (dword)(( + int)((int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar13])), + 0), + iVar12 != 0)) + || ((BVar4 != FALSE + && (BVar6 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanReachUsingCachedAreaLogic, + this)(DAT_UnitsState::instance.units[sVar2].tile, iVar13), + BVar6 != FALSE)))) + && (uVar5 = (int)DAT_BuildingsState::instance.buildings[buildingID].terrainHeightUnk + - (uint)DAT_TileMapState::instance.HeightLayer[iVar13], + uVar9 = (int)uVar5 >> 0x1f, (int)((uVar5 ^ uVar9) - uVar9) < 0x10)) { + ((PathHelper12*)(local_24 + -1))->tile1 = iVar13; + *local_24 = 0; + pXVar8 = DAT_ClimbLogicDefinedData::instance.CardinalHorizontalFirstSearchOrder; + do { + iVar12 = DAT_ViewportRenderState::instance + .translationMatrix[pXVar8->y + DAT_BuildingsState::instance.DAT_TempYOffset + + iVar3] + .addXgetTile + + pXVar8->x + DAT_BuildingsState::instance.DAT_TempXOffset + iVar10; + if ((DAT_TileMapState::instance.LogicLayer[iVar12] & 0xf000000U) == 0 + && DAT_TileMapState::instance.BuildingLayer[iVar12] == buildingID) { + *local_24 = iVar12; + break; + } + pXVar8 = pXVar8 + 1; + } while ((int)pXVar8 < 0xb39238); + local_24 = local_24 + 3; + local_28 = local_28 + 1; + if (param_3 <= local_28) { + return; + } + } + local_20 = local_20 + 1; + if (iVar14 <= local_20) { + local_20 = 0; + } + tribeID = tribeID + 1; + } while (tribeID < iVar14); + } + iVar14 = uVar7 + 1; + if (iVar14 < 0xe) { + local_20 = 0x20; + do { + iVar12 = DAT_BuildingDefinedData::instance.BuildingAccessibleTilesCount[iVar14]; + iVar13 = 0; + tribeID = 0; + if (0 < iVar12) { + piVar11 = &((PathFindingStatePartB*)(this->climbData + 200)) + ->destinationsArray[local_28] + .tile2OrAHelper; + do { + MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::setupBuildingEntrancesOffset, + DAT_BuildingsState::ptr)(iVar14, 1, iVar13, 0); + uVar7 = iVar3 + DAT_BuildingsState::instance.DAT_TempYOffset; + if ((uint)(DAT_BuildingsState::instance.DAT_TempXOffset + iVar10) < 400 && uVar7 <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar7 * 400 + + DAT_BuildingsState::instance.DAT_TempXOffset + iVar10] + != '\0') { + iVar15 = DAT_ViewportRenderState::instance.translationMatrix[uVar7].addXgetTile + + DAT_BuildingsState::instance.DAT_TempXOffset; + tile2 = iVar15 + iVar10; + uVar7 = (uint)bVar1 - (uint)DAT_TileMapState::instance.HeightLayer[iVar15 + iVar10]; + uVar5 = (int)uVar7 >> 0x1f; + if ((int)((uVar7 ^ uVar5) - uVar5) < 0x20 + && (((int)(short)DAT_TileMapState::instance.PathConnectionLayer[tile2] == param_4 + || (iVar15 + = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)(param_5, (dword)((int)(param_4)), + (dword)((int)((short)(short)(short) + DAT_TileMapState::instance.PathConnectionLayer[tile2])), + 0), + iVar15 != 0)) + || ((BVar4 != FALSE + && (BVar6 + = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanReachUsingCachedAreaLogic, + this)(DAT_UnitsState::instance.units[sVar2].tile, tile2), + BVar6 != FALSE)))) + && (uVar7 = (int)DAT_BuildingsState::instance.buildings[buildingID].terrainHeightUnk + - (uint)DAT_TileMapState::instance.HeightLayer[tile2], + uVar5 = (int)uVar7 >> 0x1f, (int)((uVar7 ^ uVar5) - uVar5) < local_20)) { + local_28 = local_28 + 1; + ((PathHelper12*)(piVar11 + -1))->tile1 = tile2; + *piVar11 = 0; + piVar11 = piVar11 + 3; + if (param_3 <= local_28) { + return; + } + } + iVar13 = iVar13 + 1; + if (iVar12 <= iVar13) { + iVar13 = 0; + } + } + tribeID = tribeID + 1; + } while (tribeID < iVar12); + } + local_20 = local_20 + 0x10; + iVar14 = iVar14 + 1; + } while (iVar14 < 0xe); + } + this->searchQueue.destinationsArray[local_28].tile1 = 0; + ((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[local_28].tile2OrAHelper = 0; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp new file mode 100644 index 0000000000..d897fc5ada --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp @@ -0,0 +1,117 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Entities/EntityType.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_EntityState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TroopValueState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Entities::EntityType; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049FF20 + dword PathFindingState::pathfindingRelated49ff20(uint x, uint y, int playerID, uint distanceUnk, int param_5) + { + int iVar1; + dword dVar4 = 1000; + int local_4 = 1000; + dword local_8 = 0; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return (dword)(dVar4); + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + dVar4 = local_8; + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + int iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (iVar3 < 0) { + return (dword)(local_8); + } + if (0x13a0f < iVar3) { + return (dword)(local_8); + } + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar3]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return (dword)(local_8); + } + for (int iVar5 = 0; iVar5 < 8; iVar5 = iVar5 + 1) { + if ((DAT_TileMapState::instance.PathLinkageLayer[iVar3] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar5]) + != 0 + && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x10000100U) == 0 + && (dVar4 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar5] + iVar3, + DAT_TileMapState::instance.WalkLayer[dVar4] != this->searchGeneration)) { + uint uVar6 = (uint)DAT_TileMapState::instance.SEC_TileMap1104[dVar4]; + if (param_5 == 0) { + uVar6 = 0; + } + if (((DAT_TileMapState::instance.EntityLayer[dVar4] == 0) + || (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[dVar4]] + .entityType + != OpenSHC::Map::Entities::ET_FIRE)) + && *(byte*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + + playerID * 0x177bc + -0x10) + * 0x13a10 + + 0x1ee2998 + dVar4) + == distanceUnk) { + if ((16 < (int)this->searchQueue.currentDistance) && (local_8 != 0)) { + return (dword)(local_8); + } + if ((10 < (int)this->searchQueue.currentDistance) + && (iVar1 = this->searchQueue.currentDistance + uVar6 * 2, iVar1 < local_4)) { + local_8 = dVar4; + local_4 = iVar1; + } + } + DAT_TileMapState::instance.CertainPathLayer[dVar4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[dVar4] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar5].short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = dVar4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + dVar4 = local_8; + } + return (dword)(dVar4); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp new file mode 100644 index 0000000000..a3c2621d63 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp @@ -0,0 +1,311 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Audio/SFX/SFXState.func.hpp" +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Entities/EntityState.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/TileMapState.func.hpp" +#include "OpenSHC/DE/SHCDE/eSFX.hpp" +#include "OpenSHC/Map/Location/Point8IntXY.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_EntityState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_SFXState.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::DE::SHCDE::eSFX; + using OpenSHC::Map::Location::Point8IntXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A8AB0 + void PathFindingState::pathfindingUpdate_0x4a8ab0(int param_1) + { + ushort uVar1; + ushort uVar2; + int (*paiVar7)[8]; + int iVar8; + int iVar9; + int iVar10; + int* piVar11; + short* psVar12; + bool bVar13; + int local_24; + short* local_18; + short* local_14; + int* local_10; + this->searchGeneration = this->searchGeneration + 1; + this->calculations = this->calculations + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + bVar13 = DAT_GameState::instance.mapAndTime.signpostIDs[0] != 0; + local_24 = 0x9d08; + if (bVar13) { + this->searchQueue.xQueue[0] + = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[0]].x; + this->searchQueue.yQueue[0] + = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[0]].y; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[this->searchQueue.yQueue[0]].addXgetTile + + (int)this->searchQueue.xQueue[0]; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + } + uint uVar6 = (uint)bVar13; + if (DAT_GameState::instance.mapAndTime.signpostIDs[1] != 0) { + uVar1 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[1]].x; + uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[1]].y; + this->searchQueue.yQueue[uVar6] = uVar2; + this->searchQueue.xQueue[uVar6] = uVar1; + iVar9 + = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + this->searchQueue.tilesQueue[uVar6] = iVar9; + DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] + = (short)this->searchGeneration; + uVar6 = uVar6 + 1; + } + if (DAT_GameState::instance.mapAndTime.signpostIDs[2] != 0) { + uVar1 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[2]].x; + uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[2]].y; + this->searchQueue.yQueue[uVar6] = uVar2; + this->searchQueue.xQueue[uVar6] = uVar1; + iVar9 + = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + this->searchQueue.tilesQueue[uVar6] = iVar9; + DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] + = (short)this->searchGeneration; + uVar6 = uVar6 + 1; + } + if (DAT_GameState::instance.mapAndTime.signpostIDs[3] != 0) { + uVar1 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[3]].x; + uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[3]].y; + this->searchQueue.yQueue[uVar6] = uVar2; + this->searchQueue.xQueue[uVar6] = uVar1; + iVar9 + = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + this->searchQueue.tilesQueue[uVar6] = iVar9; + DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] + = (short)this->searchGeneration; + uVar6 = uVar6 + 1; + } + if (DAT_GameState::instance.mapAndTime.signpostIDs[4] != 0) { + uVar1 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[4]].x; + uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[4]].y; + this->searchQueue.yQueue[uVar6] = uVar2; + this->searchQueue.xQueue[uVar6] = uVar1; + iVar9 + = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + this->searchQueue.tilesQueue[uVar6] = iVar9; + DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] + = (short)this->searchGeneration; + uVar6 = uVar6 + 1; + } + if (DAT_GameState::instance.mapAndTime.signpostIDs[5] != 0) { + uVar1 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[5]].x; + uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[5]].y; + this->searchQueue.yQueue[uVar6] = uVar2; + this->searchQueue.xQueue[uVar6] = uVar1; + iVar9 + = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + this->searchQueue.tilesQueue[uVar6] = iVar9; + DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] + = (short)this->searchGeneration; + uVar6 = uVar6 + 1; + } + if (DAT_GameState::instance.mapAndTime.signpostIDs[6] != 0) { + uVar1 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[6]].x; + uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[6]].y; + this->searchQueue.yQueue[uVar6] = uVar2; + this->searchQueue.xQueue[uVar6] = uVar1; + iVar9 + = (int)(short)uVar1 + DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile; + this->searchQueue.tilesQueue[uVar6] = iVar9; + DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] + = (short)this->searchGeneration; + uVar6 = uVar6 + 1; + } + if (DAT_GameState::instance.mapAndTime.signpostIDs[7] != 0) { + uVar1 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[7]].x; + uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[7]].y; + this->searchQueue.yQueue[uVar6] = uVar2; + this->searchQueue.xQueue[uVar6] = uVar1; + iVar9 + = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + this->searchQueue.tilesQueue[uVar6] = iVar9; + DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] + = (short)this->searchGeneration; + } + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (uVar6 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar6 < 0x13a10) { + int sVar3 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar4 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar6]; + if ((0x13a10 < (int)this->searchQueue.currentDistance) || (this->searchQueue.currentDistance > param_1)) + break; + local_10 = this->searchQueue.tilesQueue + local_24; + local_14 = this->searchQueue.yQueue + local_24; + local_18 = this->searchQueue.xQueue + local_24; + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + iVar9 = DAT_TileMapState::instance.directionTranslationMatrix[sVar4][_direction] + uVar6; + uint uVar5 = DAT_TileMapState::instance.LogicLayer[iVar9]; + if (DAT_TileMapState::instance.WalkLayer[iVar9] != this->searchGeneration + && (uVar5 & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar9] + = (short)this->searchQueue.currentDistance + 1; + iVar8 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset; + DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = (short)iVar8 + sVar3; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = (short)DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + + sVar4; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar9; + if (DAT_TileMapState::instance.BuildingLayer[iVar9] != 0) { + iVar8 = (int)DAT_TileMapState::instance.BuildingLayer[iVar9]; + iVar10 = (int)(short)DAT_BuildingsState::instance.buildings[iVar8].buildingType; + switch (iVar10) { + case 10: + case 0xb: + case 0x13: + case 0x24: + case 0x25: + case 0x26: + case 0x28: + case 0x29: + case 0x2a: + case 0x34: + case 0x37: + case 0x47: + case 0x48: + case 0x49: + break; + default: + DAT_TileMapState::instance.showNoRubbleWhenDestroyingBuilding + = (int)(DAT_BuildingDefinedData::instance + .BuildingShowRubbleWhenDestroyed[iVar10] + == 0); + MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func::destroyBuilding, + DAT_BuildingsState::ptr)(iVar8); + MACRO_CALL_MEMBER(OpenSHC::Audio::SFX::SFXState_Func::playSFXAtLocation, + DAT_SFXState::ptr)((int)(short)DAT_BuildingsState::instance.buildings[iVar8].x, + (int)((short)DAT_BuildingsState::instance.buildings[iVar8].y), + OpenSHC::DE::SHCDE::FX_BUILDING_SMASH); + } + } + if ((uVar5 & 0x100) != 0 && (uVar5 & 2) == 0) { + MACRO_CALL_MEMBER(OpenSHC::Map::Entities::EntityState_Func::destroyEntitiesOnTile, + DAT_EntityState::ptr)(iVar9); + DAT_TileMapState::instance.LogicLayer[iVar9] + = DAT_TileMapState::instance.LogicLayer[iVar9] & 0xffbef4ff; + iVar8 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset; + local_24 = local_24 + 1; + DAT_TileMapState::instance.HeightLayer[iVar9] + = DAT_TileMapState::instance.DefaultHeightLayer[iVar9]; + DAT_TileMapState::instance.DamageLayer[iVar9] = 0; + this->toggleUpdateSeparateAreaTileMap = 1; + DAT_TileMapState::instance.field204_0x554a30 = 1; + *local_18 = (short)iVar8 + sVar3; + *local_14 = (short)DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + + sVar4; + local_14 = local_14 + 1; + local_18 = local_18 + 1; + *local_10 = iVar9; + local_10 = local_10 + 1; + } + if ((uVar5 & 0x40000000) != 0) { + MACRO_CALL_MEMBER( + OpenSHC::Map::TileMapState_Func::clearMoatDataAtTile, DAT_TileMapState::ptr)( + DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset + + (int)sVar3, + (int)(DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + + sVar4)); + iVar8 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset; + local_24 = local_24 + 1; + DAT_TileMapState::instance.HeightLayer[iVar9] = 8; + DAT_TileMapState::instance.LogicLayer[iVar9] + = DAT_TileMapState::instance.LogicLayer[iVar9] & 0xbfffbfff; + *local_18 = (short)iVar8 + sVar3; + *local_14 = (short)DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + + sVar4; + local_18 = local_18 + 1; + *local_10 = iVar9; + local_10 = local_10 + 1; + local_14 = local_14 + 1; + } + if ((uVar5 & 8) != 0) { + DAT_TileMapState::instance.LogicLayer[iVar9] + = DAT_TileMapState::instance.LogicLayer[iVar9] & 0xfffffff7; + } + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) + break; + } + } + if (0x9d08 < local_24) { + psVar12 = this->searchQueue.yQueue + 0x9d08; + piVar11 = this->searchQueue.tilesQueue + 0x9d08; + local_24 = local_24 + -0x9d08; + do { + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::updatePathLinkagesInAllEightDirections, this)( + (int)*psVar12, (int)(*piVar11)); + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::updateWalkAndPathLayer, this)( + 7, (uint)(psVar12[0x13a10]), (uint)((int)*psVar12)); + piVar11 = piVar11 + 1; + psVar12 = psVar12 + 1; + local_24 = local_24 + -1; + } while (local_24 != 0); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp new file mode 100644 index 0000000000..dc50908c56 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp @@ -0,0 +1,198 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/TileMapState.func.hpp" +#include "OpenSHC/Random/RNG.func.hpp" +#include "OpenSHC/Commands/MappersEnum.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" +#include "OpenSHC/Globals/SEC_RNG.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Commands::MappersEnum; + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + WARNING: Enum "MappersEnumInt": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A21B0 + void PathFindingState::placeCommemoratingStatueAtGoodLocation(int playerID) + { + int iVar3; + short* psVar4; + int* piVar5; + int iVar6; + MappersEnum commandBuildingType; + uint uVar7; + uint uVar8; + short sVar1 = DAT_GameState::instance.playerDataArray[playerID].someKeepRelatedX2; + uVar7 = (uint)sVar1; + short sVar2 = DAT_GameState::instance.playerDataArray[playerID].someKeepRelatedY2; + uVar8 = (uint)sVar2; + if (uVar7 > 399 || uVar8 > 399 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar8 * 400 + uVar7] == '\0') { + return; + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[uVar8].addXgetTile + uVar7; + this->searchQueue.yQueue[0] = sVar2; + this->searchQueue.xQueue[0] = sVar1; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + commandBuildingType = (OpenSHC::Commands::MappersEnum)((int)SEC_RNG::instance.currentNumber2 % 5 + + OpenSHC::Commands::M_MAPPER_STATUE1); + MACRO_CALL_MEMBER(OpenSHC::Random::RNG_Func::nextRandomNumber2, SEC_RNG::ptr)(); + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (true) { + iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (iVar3 < 0) { + return; + } + if (0x13a0f < iVar3) { + return; + } + sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; + sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + uVar7 = (uint)sVar2; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar3]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return; + } + if (0x14 < this->searchQueue.currentDistance) { + return; + } + MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::checkBuildingCanBePlacedHere, + DAT_TileMapState::ptr)(playerID, (uint)(sVar1), uVar7, commandBuildingType, -2); + if (DAT_TileMapState::instance.buildingPlacementFail == FALSE) + break; + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[uVar7][_direction] + iVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[uVar7][_direction + 1] + iVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[uVar7][_direction + 2] + iVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[uVar7][_direction + 3] + iVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + DAT_TileMapState::instance.field122_0x554930 = 1; + MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::placeBuilding, DAT_TileMapState::ptr)( + playerID, (int)(sVar1), (int)(uVar7), commandBuildingType, 2, 0xf); + iVar3 = DAT_TileMapState::instance.placedBuildingID; + DAT_BuildingsState::instance.buildings[DAT_TileMapState::instance.placedBuildingID].owner = 0; + DAT_BuildingsState::instance.buildings[iVar3].statueCommemoratingPlayerID = (short)playerID; + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp new file mode 100644 index 0000000000..b793e8aa39 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -0,0 +1,186 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::Map::Navigation::Algorithms::XYPair; + + /* + WARNING: Type propagation algorithm not settling + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A83B0 + void PathFindingState::populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea( + int tile, int maxDestinations, dword area, int playerID) + { + int iVar2; + int* piVar3; + XYPair* pXVar4; + short* psVar5; + int (*paiVar6)[8]; + int _candidate; + int _dIndex; + short _tileY; + int _axgt; + int _tile2; + uint _tile; + int _x; + int _y; + _tileY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; + _axgt = DAT_ViewportRenderState::instance.translationMatrix[_tileY].addXgetTile; + this->searchGeneration = this->searchGeneration + 1; + _dIndex = 0; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.writeIndex = 1; + maxDestinations = maxDestinations * 2; + this->searchQueue.readIndex = 0; + if (maxDestinations < 500) { + if (maxDestinations < 50) { + maxDestinations = 50; + } + } else { + maxDestinations = 500; + } + this->searchQueue.tilesQueue[0] = tile; + this->searchQueue.yQueue[0] = _tileY; + this->searchQueue.xQueue[0] = (short)tile - (short)_axgt; + DAT_TileMapState::instance.CertainPathLayer[tile] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile < 0x13a10) { + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if ((80400 < (int)this->searchQueue.currentDistance) || (10 < (int)this->searchQueue.currentDistance)) + break; + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration + && (area == (int)(short)DAT_TileMapState::instance.PathConnectionLayer[_candidate] + || (iVar2 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)(playerID, (dword)((int)(area)), + (dword)((int)(( + int)(short)DAT_TileMapState::instance.PathConnectionLayer[_candidate])), + 0), + iVar2 != 0))) { + /* + queue tiles in area that are navigatible by this player without climbing + */ + short sVar1 + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset; + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar1 + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) + break; + } + } + this->searchQueue.readIndex = 0; + if (0 < (int)this->searchQueue.writeIndex) { + piVar3 = &this->searchQueue.destinationsArray[0].tile2OrAHelper; + do { + _tile2 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + /* + no wall tower gatehouse crenel nor keep + */ + if ((DAT_TileMapState::instance.LogicLayer[_tile2] & 0x10000300U) == 0) { + pXVar4 = DAT_ClimbLogicDefinedData::instance.CardinalHorizontalFirstSearchOrder; + do { + int _candidate2 = DAT_ViewportRenderState::instance + .translationMatrix[pXVar4->y + + (int)this->searchQueue.yQueue[this->searchQueue.readIndex]] + .addXgetTile + + pXVar4->x + (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + if ((DAT_TileMapState::instance.LogicLayer[_candidate2] & 0x300U) != 0 + && (DAT_TileMapState::instance.LogicLayer[_candidate2] & 0x400000U) == 0 + && (DAT_TileMapState::instance.WallOwnerLayer[_candidate2] & 7) + 1 != playerID) { + /* + candidate 2 is wall tower gatehouse, or crenel (variation) + */ + if (_candidate2 != 0) { + *piVar3 = _candidate2; + _dIndex = _dIndex + 1; + ((PathHelper12*)(piVar3 + -1))->tile1 = _tile2; + piVar3 = piVar3 + 3; + if (maxDestinations <= _dIndex) { + return; + } + this->searchQueue.tilesQueue[this->searchQueue.readIndex] = -1; + } + break; + } + pXVar4 = pXVar4 + 1; + } while ((int)pXVar4 < 0xb39238); + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + } while ((int)this->searchQueue.readIndex < (int)this->searchQueue.writeIndex); + } + this->searchQueue.readIndex = 0; + if (0 < (int)this->searchQueue.writeIndex) { + piVar3 = &((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_dIndex].tile2OrAHelper; + do { + iVar2 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + /* + no wall tower gatehouse crenel nor keep + */ + if ((DAT_TileMapState::instance.LogicLayer[iVar2] & 0x10000300U) == 0 && iVar2 != -1) { + ((PathHelper12*)(piVar3 + -1))->tile1 = iVar2; + *piVar3 = 0; + _dIndex = _dIndex + 1; + piVar3 = piVar3 + 3; + if (maxDestinations <= _dIndex) { + return; + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + } while ((int)this->searchQueue.readIndex < (int)this->searchQueue.writeIndex); + } + this->searchQueue.destinationsArray[_dIndex].tile1 = 0; + ((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_dIndex].tile2OrAHelper = 0; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp new file mode 100644 index 0000000000..fdb205e4b8 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp @@ -0,0 +1,151 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/TileMapState.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049A6D0 + void PathFindingState::raiseLand2(uint x, uint y, int maxDistance) + { + short* psVar4; + int iVar5; + int* piVar6; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.CertainPathLayer))); + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int uVar1 = (short)DAT_TileMapState::instance.PathConnectionLayer[this->searchQueue.tilesQueue[0]]; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + do { + uint tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (0x13a0f < tile) + break; + int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[tile]; + if (this->searchQueue.currentDistance > maxDistance) + break; + MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::raiseLand, DAT_TileMapState::ptr)( + tile, (uint)(sVar3), 4, 1); + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction] + tile; + if (DAT_TileMapState::instance.CertainPathLayer[iVar5] < 1 + && (short)DAT_TileMapState::instance.PathConnectionLayer[iVar5] == uVar1 + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction + 1] + tile; + if (DAT_TileMapState::instance.CertainPathLayer[iVar5] < 1 + && (short)DAT_TileMapState::instance.PathConnectionLayer[iVar5] == uVar1 + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction + 2] + tile; + if (DAT_TileMapState::instance.CertainPathLayer[iVar5] < 1 + && (short)DAT_TileMapState::instance.PathConnectionLayer[iVar5] == uVar1 + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction + 3] + tile; + if (DAT_TileMapState::instance.CertainPathLayer[iVar5] < 1 + && (short)DAT_TileMapState::instance.PathConnectionLayer[iVar5] == uVar1 + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + DAT_TileMapState::instance.forceUpdateLogicalAndMiscDisplayLayers = 1; + DAT_TileMapState::instance.forceUpdateTextureTilemap = 1; + DAT_TileMapState::instance.forceUpdateGFXLayers = 1; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp new file mode 100644 index 0000000000..b9ef2e917b --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp @@ -0,0 +1,176 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049E510 + void PathFindingState::recomputeALGPathFindingTileMapUnk(int someMax, uint x, uint y, undefined4 param_4) + { + uint uVar3; + int iVar4; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.currentDistance = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + if ((DAT_TileMapState::instance.AIInfoLayer[this->searchQueue.tilesQueue[0]] & 0xf) == 0) { + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (uVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar3 < 0x13a10) { + DAT_TileMapState::instance.AIInfoLayer[uVar3] + = DAT_TileMapState::instance.AIInfoLayer[uVar3] | (byte)param_4; + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar3]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return; + } + if (this->searchQueue.currentDistance > someMax) { + return; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + if ((DAT_TileMapState::instance.LogicLayer[uVar3] & 0x30U) == 0 + && ((byte)param_4 != 8 + || ((DAT_TileMapState::instance.LogicLayer[uVar3] & 0x6a5014b1U) == 0)) + && (iVar4 + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + uVar3, + DAT_TileMapState::instance.WalkLayer[iVar4] != this->searchGeneration) + && ((byte)param_4 == 0x80 || (DAT_TileMapState::instance.AIInfoLayer[iVar4] == '\0'))) { + DAT_TileMapState::instance.CertainPathLayer[iVar4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar4] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.LogicLayer[uVar3] & 0x30U) == 0 + && ((byte)param_4 != 8 + || ((DAT_TileMapState::instance.LogicLayer[uVar3] & 0x6a5014b1U) == 0)) + && (iVar4 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 1] + + uVar3, + DAT_TileMapState::instance.WalkLayer[iVar4] != this->searchGeneration) + && ((byte)param_4 == 0x80 || (DAT_TileMapState::instance.AIInfoLayer[iVar4] == '\0'))) { + DAT_TileMapState::instance.CertainPathLayer[iVar4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar4] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.LogicLayer[uVar3] & 0x30U) == 0 + && ((byte)param_4 != 8 + || ((DAT_TileMapState::instance.LogicLayer[uVar3] & 0x6a5014b1U) == 0)) + && (iVar4 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 2] + + uVar3, + DAT_TileMapState::instance.WalkLayer[iVar4] != this->searchGeneration + && (((byte)param_4 == 0x80 + || (DAT_TileMapState::instance.AIInfoLayer[iVar4] == '\0'))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar4] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.LogicLayer[uVar3] & 0x30U) == 0 + && ((byte)param_4 != 8 + || ((DAT_TileMapState::instance.LogicLayer[uVar3] & 0x6a5014b1U) == 0)) + && (iVar4 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction + 3] + + uVar3, + DAT_TileMapState::instance.WalkLayer[iVar4] != this->searchGeneration) + && ((byte)param_4 == 0x80 || (DAT_TileMapState::instance.AIInfoLayer[iVar4] == '\0'))) { + DAT_TileMapState::instance.CertainPathLayer[iVar4] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar4] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar4; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp new file mode 100644 index 0000000000..527ae1fbe6 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp @@ -0,0 +1,61 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Units/UnitLogicState.hpp" + +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Units::UnitLogicState; + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A4BB0 + void PathFindingState::recountUnitsUsingClimbData(int climbDataID) + { + int* _ptrUnitID; + int _counter; + int _canBeUsed; + int* _ptrUnitUID; + int _unitID; + _counter = 0; + _canBeUsed = this->climbData[climbDataID].canBeUsed; + this->climbData[climbDataID].numberOfUnitsUsing = 0; + if (_canBeUsed != 0) { + _ptrUnitID = &this->climbData[climbDataID].unitID1; + do { + _unitID = *_ptrUnitID; + if (_unitID != 0) { + _ptrUnitUID = &this->climbData[climbDataID].unitUID1 + _counter; + if (DAT_UnitsState::instance.units[_unitID].logicalState == OpenSHC::Map::Units::ULS_NORMAL) { + if (DAT_UnitsState::instance.units[_unitID].uid + == (&this->climbData[climbDataID].unitUID1)[_counter]) { + if (DAT_UnitsState::instance.units[_unitID].climbDataID == climbDataID) { + _ptrUnitUID = &this->climbData[climbDataID].numberOfUnitsUsing; + *_ptrUnitUID = *_ptrUnitUID + 1; + } else { + *_ptrUnitID = 0; + *_ptrUnitUID = 0; + } + } else { + *_ptrUnitID = 0; + *_ptrUnitUID = 0; + } + } else { + *_ptrUnitID = 0; + *_ptrUnitUID = 0; + } + } + _counter = _counter + 1; + _ptrUnitID = _ptrUnitID + 1; + } while (_counter < 50); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/registerUnitOnClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/registerUnitOnClimbData.cpp new file mode 100644 index 0000000000..df7c68351d --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/registerUnitOnClimbData.cpp @@ -0,0 +1,54 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + Attempts to register unit param_2 on climb data slot param_1. Returns 0 if the climb system is disabled + (field63_0xc0 == 0), -1 if the slot is unusable or already at capacity (50 units), or 1 on success. On + success increments numberOfUnitsUsing, stores the unit ID and UID in the first free slot, and copies + climbDataRelated to the unit (zeroed for climb types 3, 4, and 5). renamed by: Claude Sonnet 4.6 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A4C70 + undefined4 PathFindingState::registerUnitOnClimbData(int param_1, int param_2) + { + int iVar1; + int* piVar2; + if (this->field63_0xc0 == 0) { + return (undefined4)(0); + } + if ((this->climbData[param_1].canBeUsed != 0) + && (iVar1 = this->climbData[param_1].numberOfUnitsUsing, iVar1 < 0x32)) { + this->climbData[param_1].numberOfUnitsUsing = iVar1 + 1; + DAT_UnitsState::instance.units[param_2].climbDataRelated = this->climbData[param_1].climbDataRelated; + if (this->climbData[param_1].type == 3) { + DAT_UnitsState::instance.units[param_2].climbDataRelated = 0; + } + if (this->climbData[param_1].type == 4) { + DAT_UnitsState::instance.units[param_2].climbDataRelated = 0; + } + if (this->climbData[param_1].type == 5) { + DAT_UnitsState::instance.units[param_2].climbDataRelated = 0; + } + iVar1 = 0; + piVar2 = &this->climbData[param_1].unitID1; + do { + if (*piVar2 == 0) { + (&this->climbData[param_1].unitID1)[iVar1] = param_2; + (&this->climbData[param_1].unitUID1)[iVar1] = DAT_UnitsState::instance.units[param_2].uid; + return (undefined4)(1); + } + iVar1 = iVar1 + 1; + piVar2 = piVar2 + 1; + } while (iVar1 < 0x32); + return (undefined4)(1); + } + return (undefined4)(0xffffffff); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/reverseCurrentPathPlan.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/reverseCurrentPathPlan.cpp new file mode 100644 index 0000000000..99156b5486 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/reverseCurrentPathPlan.cpp @@ -0,0 +1,132 @@ +#include "../PathFindingState.func.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049A5E0 + void PathFindingState::reverseCurrentPathPlan() + { + int bVar1; + int bVar2; + uint _endIndex; + int _swapCounter; + /* + Index from start of path + */ + uint _index = 0; + /* + === ONLY REVERSE IF PATH HAS MORE THAN 1 ELEMENT === + */ + /* + Index from end of path + */ + if (1 < (int)this->searchQueue.pathPlanIndex) { + /* + Calculate number of swaps needed (swap pairs from both ends toward center) Example: 8 elements = 4 + swaps, 7 elements = 3 swaps + */ + _swapCounter = (this->searchQueue.pathPlanIndex - 2 >> 1) + 1; + _endIndex = this->searchQueue.pathPlanIndex; + do { + /* + === SWAP LOOP: Exchange elements from both ends === === EXTRACT DIRECTION AT START (uVar3) === + */ + _endIndex = _endIndex - 1; + if ((_index & 1) == 0) { + /* + Even index: direction is in LOW nibble (bits 0-3) + */ + bVar2 = this->searchQueue.ptrPathPlan[(int)_index / 2] & 0xf; + } else { + /* + Odd index: direction is in HIGH nibble (bits 4-7) + */ + bVar2 = (char)this->searchQueue.ptrPathPlan[(int)_index / 2] >> 4; + } + /* + === EXTRACT DIRECTION AT END (_prevIndex) === + */ + if ((_endIndex & 1) == 0) { + /* + Even index: direction is in LOW nibble + */ + bVar1 = this->searchQueue.ptrPathPlan[(int)_endIndex / 2] & 0xf; + } else { + /* + Odd index: direction is in HIGH nibble + */ + bVar1 = (char)this->searchQueue.ptrPathPlan[(int)_endIndex / 2] >> 4; + } + /* + === WRITE END DIRECTION TO START POSITION === + */ + if ((_index & 1) == 0) { + /* + Even index: clear LOW nibble, keep HIGH nibble + */ + this->searchQueue.ptrPathPlan[(int)_index / 2] + = this->searchQueue.ptrPathPlan[(int)_index / 2] & 0xf0; + } else { + /* + Odd index: clear HIGH nibble, keep LOW nibble + */ + this->searchQueue.ptrPathPlan[(int)_index / 2] + = this->searchQueue.ptrPathPlan[(int)_index / 2] & 0xf; + /* + Shift value to HIGH nibble position + */ + bVar1 = bVar1 << 4; + } + /* + Write the direction value + */ + this->searchQueue.ptrPathPlan[(int)_index / 2] + = this->searchQueue.ptrPathPlan[(int)_index / 2] + bVar1; + /* + === WRITE START DIRECTION TO END POSITION === + */ + if ((_endIndex & 1) == 0) { + /* + Even index: clear LOW nibble + */ + this->searchQueue.ptrPathPlan[(int)_endIndex / 2] + = this->searchQueue.ptrPathPlan[(int)_endIndex / 2] & 0xf0; + } else { + /* + Odd index: clear HIGH nibble + */ + this->searchQueue.ptrPathPlan[(int)_endIndex / 2] + = this->searchQueue.ptrPathPlan[(int)_endIndex / 2] & 0xf; + /* + Shift value to HIGH nibble position + */ + bVar2 = bVar2 << 4; + } + /* + Write the direction value + */ + this->searchQueue.ptrPathPlan[(int)_endIndex / 2] + = this->searchQueue.ptrPathPlan[(int)_endIndex / 2] + bVar2; + /* + === MOVE INDICES TOWARD CENTER === Move end index forward + */ + /* + Move start index forward + */ + _index = _index + 1; + /* + Decrement swap counter + */ + _swapCounter = _swapCounter + -1; + } while (_swapCounter != 0); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp new file mode 100644 index 0000000000..ec05702c1d --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp @@ -0,0 +1,143 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049AF50 + void PathFindingState::setChangedLayerZeroBasedOn40x40Layer(uint flag_and_offset) + { + if ((this->field10_0x28 == 0) && (flag_and_offset == 0)) { + if ((int)DAT_TileMapState::instance.someIndex <= (int)DAT_TileMapState::instance.someLimit) { + int _index10 = DAT_TileMapState::instance.someIndex * 10; + /* + 10 400x400 rows + */ + int _index4000 = DAT_TileMapState::instance.someIndex * 4000; + int _someX = DAT_TileMapState::instance.someIndex * 120; + int _pMap4040 = DAT_TileMapState::instance.someIndex * 40 + 0x1f93438; + int _someYLikeLimit = DAT_TileMapState::instance.someYLikeLimit; + do { + if ((int)DAT_TileMapState::instance.someYLike <= _someYLikeLimit) { + flag_and_offset = DAT_TileMapState::instance.someYLike * 10 + 1; + int _someY = DAT_TileMapState::instance.someYLike; + do { + if (*(char*)(_pMap4040 + _someY) != '\0') { + /* + update this part + */ + *(undefined1*)(_pMap4040 + _someY) = 0; + int _cur10 = 0; + int _yOffset = _index4000; + int _curX = _someX; + do { + uint _coord2 = _index10 + _cur10; + int local_1c = 2; + uint _x = flag_and_offset; + do { + if (_x - 1 <= 399 && _coord2 <= 399 + && DAT_ViewportRenderState::instance + .DAT_BinaryTileMap400x400[_yOffset + (_x - 1)] + != '\0') { + /* + set changed layer to 0 + */ + /* + is valid coordinate + */ + *(undefined1*)(_x + 0x1c5ad87 + + *(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX)) = 0; + } + if (_x <= 399 && _coord2 <= 399 + && DAT_ViewportRenderState::instance + .DAT_BinaryTileMap400x400[_yOffset + _x] + != '\0') { + *(undefined1*)(*(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX) + + 0x1c5ad88 + _x) = 0; + } + if (_x + 1 <= 399 && _coord2 <= 399 + && DAT_ViewportRenderState::instance + .DAT_BinaryTileMap400x400[_yOffset + _x + 1] + != '\0') { + *(undefined1*)(_x + 0x1c5ad89 + + *(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX)) = 0; + } + if (_x + 2 <= 399 && _coord2 <= 399 + && DAT_ViewportRenderState::instance + .DAT_BinaryTileMap400x400[_yOffset + _x + 2] + != '\0') { + *(undefined1*)(_x + 0x1c5ad8a + + *(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX)) = 0; + } + if (_x + 3 <= 399 && _coord2 <= 399 + && DAT_ViewportRenderState::instance + .DAT_BinaryTileMap400x400[_yOffset + _x + 3] + != '\0') { + *(undefined1*)(_x + 0x1c5ad8b + + *(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX)) = 0; + } + _x = _x + 5; + local_1c = local_1c + -1; + } while (local_1c != 0); + _cur10 = _cur10 + 1; + _yOffset = _yOffset + 400; + _curX = _curX + 0xc; + _someYLikeLimit = DAT_TileMapState::instance.someYLikeLimit; + } while (_cur10 < 10); + } + flag_and_offset = flag_and_offset + 10; + _someY = _someY + 1; + } while (_someY <= _someYLikeLimit); + } + _index4000 = _index4000 + 4000; + _index10 = _index10 + 10; + DAT_TileMapState::instance.someIndex = DAT_TileMapState::instance.someIndex + 1; + _pMap4040 = _pMap4040 + 40; + _someX = _someX + 120; + } while ((int)DAT_TileMapState::instance.someIndex <= (int)DAT_TileMapState::instance.someLimit); + } + this->mappingYRelated = 1000; + this->yLimit = 0; + DAT_TileMapState::instance.someIndex = 1000; + DAT_TileMapState::instance.someLimit = 0; + DAT_TileMapState::instance.someYLike = 1000; + DAT_TileMapState::instance.someYLikeLimit = 0; + return; + } + this->field10_0x28 = 0; + this->mappingYRelated = 0; + this->yLimit = 399; + DAT_TileMapState::instance.someIndex = 0; + DAT_TileMapState::instance.someLimit = 39; + DAT_TileMapState::instance.someYLike = 0; + DAT_TileMapState::instance.someYLikeLimit = 0x27; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp new file mode 100644 index 0000000000..dd1d04b11e --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp @@ -0,0 +1,113 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Map/Units/UnitsState.func.hpp" + +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + called when pathfinding with walls decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A4930 + int PathFindingState::setClimbBasedOnClosestClimbData(int unitID, int ladderWallGroup, int ladderArea) + { + int iVar1; + int fromXPosition; + ClimbData* _pClimbData; + ClimbData* _pClimbData2; + short _downOrUp1; + int _climbDataID; + int _climbData2; + int _minDistance; + short _downOrUp; + int _distance; + _minDistance = 1000; + _climbData2 = 0; + _downOrUp = 0; + if (this->field63_0xc0 == 0) { + return 200; + } + int _climbDataCounter = 1; + if (1 < this->maxClimbDataCount) { + _pClimbData = &this->climbData[1]; + _downOrUp = 0; + do { + if ((_pClimbData->canBeUsed == 1) && (_pClimbData->isRecognizedByPathfinding != 0)) { + iVar1 = MACRO_CALL_MEMBER( + OpenSHC::Map::Units::UnitsState_Func::checkUnitHasPropertyBasedOnUnitType, + DAT_UnitsState::ptr)(unitID, _pClimbData->type); + if ((iVar1 != 0) && (_pClimbData->type == 1)) { + if (_pClimbData->area == ladderWallGroup) { + _downOrUp1 = 0; + if (_pClimbData->wallGroupAreaID == ladderArea) { + iVar1 = _pClimbData->bottomYPosition; + fromXPosition = _pClimbData->bottomXPosition; + LAB_004a49e1: + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::DirectionAlgorithmState_Func:: + setAxisBasedDistanceResult, + DAT_DirectionAlgorithmState::ptr)((int)DAT_UnitsState::instance.units[unitID].x, + (int)(DAT_UnitsState::instance.units[unitID].y), fromXPosition, iVar1); + _distance = DAT_DirectionAlgorithmState::instance.distanceHigh + + _pClimbData->numberOfUnitsUsing * 8; + if (_distance < _minDistance) { + _climbData2 = _climbDataCounter; + _minDistance = _distance; + _downOrUp = _downOrUp1; + if (_downOrUp1 == 0) { + this->climbX = _pClimbData->bottomXPosition; + this->climbY = _pClimbData->bottomYPosition; + } else { + this->climbX = _pClimbData->topXPosition; + this->climbY = _pClimbData->topYPosition; + } + } + } + } else if ((_pClimbData->area == ladderArea) + && (_downOrUp1 = 1, _pClimbData->wallGroupAreaID == ladderWallGroup)) { + iVar1 = _pClimbData->topYPosition; + fromXPosition = _pClimbData->topXPosition; + goto LAB_004a49e1; + } + } + } + _climbDataCounter = _climbDataCounter + 1; + _pClimbData = _pClimbData + 1; + } while (_climbDataCounter < this->maxClimbDataCount); + } + DAT_UnitsState::instance.units[unitID].climbDirection = _downOrUp; + if (_climbData2 == 0) { + _pClimbData2 = &this->climbData[1]; + _climbDataID = 1; + do { + if ((_pClimbData2->canBeUsed == 1) && (_pClimbData2->isRecognizedByPathfinding != 0)) { + iVar1 = MACRO_CALL_MEMBER( + OpenSHC::Map::Units::UnitsState_Func::checkUnitHasPropertyBasedOnUnitType, + DAT_UnitsState::ptr)(unitID, _pClimbData2->type); + if ((iVar1 != 0) && (0 < _pClimbData2->buildingArea)) { + if (_pClimbData2->area == ladderArea) { + this->climbX = this->climbData[_climbDataID].bottomXPosition; + this->climbY = this->climbData[_climbDataID].bottomYPosition; + return _climbDataID; + } + if (_pClimbData2->wallGroupAreaID == ladderArea) { + this->climbX = this->climbData[_climbDataID].topXPosition; + this->climbY = this->climbData[_climbDataID].topYPosition; + return _climbDataID; + } + } + } + _climbDataID = _climbDataID + 1; + _pClimbData2 = _pClimbData2 + 1; + } while (_climbDataID < 200); + } + return _climbData2; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp new file mode 100644 index 0000000000..c96c6b20dd --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp @@ -0,0 +1,55 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A65E0 + void PathFindingState::setDestinationPairsBasedOnPreviousSearch(int playerIDMin1, int attackedPlayerID) + { + int _pair = 0; + this->searchQueue.readIndex = 0; + if (this->searchQueue.writeIndex != 0) { + do { + uint y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint _attackedDistance = (uint) * (byte*)(attackedPlayerID * 0x13a10 + 0x1ee2998 + _tile); + uint x = _tile - DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile; + if (DAT_TileMapState::instance.WalkLayer[_tile] == this->searchGeneration && _attackedDistance != 0 + && _attackedDistance - 4294967224 < 4 + && DAT_TileMapState::instance.CertainPathLayer[_tile] < 0x4c + && DAT_TileMapState::instance.CertainPathLayer[_tile] != 100) { + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::budgetFloodFillOnCertainPathLayer, this)( + x, y, (int)(100), (int)(50)); + DAT_GameState::instance.mapAndTime.unitMoveDestinationXYPairs[playerIDMin1][_pair].x = x; + DAT_GameState::instance.mapAndTime.unitMoveDestinationXYPairs[playerIDMin1][_pair].y = y; + _pair = _pair + 1; + } + if (_pair >= 40) { + return; + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp new file mode 100644 index 0000000000..ed990485df --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp @@ -0,0 +1,56 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A66D0 + void PathFindingState::setMoveDestinationPairs(int playerIDmin1, int playerID, int maxCost) + { + int iVar1 = 0; + if (100 < maxCost) { + maxCost = 100; + } + this->searchQueue.readIndex = 0; + if (this->searchQueue.writeIndex != 0) { + do { + uint _y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int _tileCandidate = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint _cost = (uint) * (byte*)(playerID * 0x13a10 + 0x1ee2998 + _tileCandidate); + uint _x = _tileCandidate - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; + if (_cost != 0 && maxCost <= (int)_cost && (int)_cost <= maxCost + 10 + && DAT_TileMapState::instance.CertainPathLayer[_tileCandidate] != 100) { + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::budgetFloodFillOnCertainPathLayer, this)( + _x, _y, 100, 200); + DAT_GameState::instance.mapAndTime.unitMoveDestinationXYPairs[playerIDmin1][iVar1].x = _x; + DAT_GameState::instance.mapAndTime.unitMoveDestinationXYPairs[playerIDmin1][iVar1].y = _y; + iVar1 = iVar1 + 1; + } + if (0x13 < iVar1) { + return; + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp new file mode 100644 index 0000000000..7f08518948 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp @@ -0,0 +1,156 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + Executes a flood file with logic layer 0x10 to indicate impenetrable land decompilerscript: committed: + 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A0E50 + void PathFindingState::setWalkabilityBorderLogicLayerForSmallerMapSizes() + { + short sVar3; + short* psVar5; + int* piVar6; + int _candidateTile; + this->searchGeneration = this->searchGeneration + 1; + this->resultTile = 0; + this->resultY = 0; + this->resultX = 0; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = 2; + this->searchQueue.xQueue[0] = 198; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[2].addXgetTile + 0xc6; + DAT_TileMapState::instance + .CertainPathLayer[DAT_ViewportRenderState::instance.translationMatrix[2].addXgetTile + 0xc6] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + uint uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (0x13a0f < uVar4) { + return; + } + int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + _candidateTile = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[_candidateTile] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_candidateTile] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_candidateTile] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidateTile] = (short)this->searchGeneration; + sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset; + DAT_TileMapState::instance.LogicLayer[_candidateTile] + = DAT_TileMapState::instance.LogicLayer[_candidateTile] | 0x10; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidateTile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _candidateTile + = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction + 1] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[_candidateTile] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_candidateTile] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_candidateTile] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidateTile] = (short)this->searchGeneration; + sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset; + DAT_TileMapState::instance.LogicLayer[_candidateTile] + = DAT_TileMapState::instance.LogicLayer[_candidateTile] | 0x10; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidateTile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _candidateTile + = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction + 2] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[_candidateTile] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_candidateTile] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_candidateTile] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidateTile] = (short)this->searchGeneration; + sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset; + DAT_TileMapState::instance.LogicLayer[_candidateTile] + = DAT_TileMapState::instance.LogicLayer[_candidateTile] | 0x10; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidateTile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + _candidateTile + = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction + 3] + uVar4; + if (DAT_TileMapState::instance.WalkLayer[_candidateTile] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[_candidateTile] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[_candidateTile] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidateTile] = (short)this->searchGeneration; + sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset; + DAT_TileMapState::instance.LogicLayer[_candidateTile] + = DAT_TileMapState::instance.LogicLayer[_candidateTile] | 0x10; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidateTile; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp new file mode 100644 index 0000000000..ffb2341d74 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp @@ -0,0 +1,149 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" +#include "OpenSHC/Map/Trees/TreeType.hpp" +#include "OpenSHC/Map/Trees/TreeTypeShort.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_LandscapeState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Location::Point8ShortXY; + using OpenSHC::Map::Trees::TreeType; + using OpenSHC::Map::Trees::TreeTypeShort; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049C020 + undefined4 PathFindingState::setupBabyTreeLocationInfo(int param_1, int treeType, uint x, uint y) + { + int iVar4; + short* psVar7; + int (*paiVar8)[8]; + this->ALG_ResultTile = 0; + this->ALG_ResultY = 0; + this->ALG_ResultX = 0; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return (undefined4)(0); + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], + -1 < iVar4 && (iVar4 < 0x13a10))) { + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return (undefined4)(0); + } + if (this->searchQueue.currentDistance > param_1) { + return (undefined4)(1); + } + int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + int iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction] + iVar4; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { + int iVar6 = (int)DAT_TileMapState::instance.OrganismLayer[iVar5]; + if ((iVar6 == 0) || (1999 < iVar6)) { + if (DAT_TileMapState::instance.BuildingLayer[iVar5] != 0) { + switch (DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar5]] + .buildingType) { + case OpenSHC::Map::Buildings::BT_WOODCUTTERSHUT: + case OpenSHC::Map::Buildings::BT_QUARRY: + case OpenSHC::Map::Buildings::BT_WHEATFARM: + case OpenSHC::Map::Buildings::BT_HOPFARM: + case OpenSHC::Map::Buildings::BT_APPLEFARM: + case OpenSHC::Map::Buildings::BT_DAIRYFARM: + case OpenSHC::Map::Buildings::BT_SIGNPOST: + case OpenSHC::Map::Buildings::BT_POND: + break; + default: + goto switchD_0049c1f0_caseD_4; + } + } + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x703e25b5U) == 0) { + if (treeType == 1) { + if ((DAT_TileMapState::instance.Logic2Layer[iVar5] & 0x90) == 0) { + LAB_0049c26a: + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } else if ((DAT_TileMapState::instance.Logic2Layer[iVar5] & 0x90) != 0) + goto LAB_0049c26a; + } + } else { + TreeTypeShort TVar3 = DAT_LandscapeState::instance.trees[iVar6].treeType; + if (TVar3 == (TreeType)1) { + return (undefined4)(0); + } + if (TVar3 == (TreeType)2) { + return (undefined4)(0); + } + if (TVar3 == (TreeType)3) { + return (undefined4)(0); + } + if (TVar3 == (TreeType)4) { + return (undefined4)(0); + } + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return (undefined4)(0); + } + } + } + switchD_0049c1f0_caseD_4: + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp new file mode 100644 index 0000000000..1950539b2f --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp @@ -0,0 +1,95 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049D640 + undefined4 PathFindingState::someBinaryAlgFunctionPathFinding(int param_1) + { + short* psVar6; + int (*paiVar7)[8]; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + ushort uVar1 = DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[param_1].tile]; + this->searchQueue.yQueue[0] = DAT_UnitsState::instance.units[param_1].y; + this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[param_1].x; + this->searchQueue.tilesQueue[0] = DAT_UnitsState::instance.units[param_1].tile; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + do { + int iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (iVar4 < 0) { + return (undefined4)(1); + } + if (0x13a0f < iVar4) { + return (undefined4)(1); + } + int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return (undefined4)(1); + } + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + int iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction] + iVar4; + if ((DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) + && (DAT_TileMapState::instance.PathConnectionLayer[iVar5] == uVar1)) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x10000100U) == 0 + || (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x400000U) != 0) { + return (undefined4)(0); + } + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + return (undefined4)(1); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp new file mode 100644 index 0000000000..34116a0470 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp @@ -0,0 +1,86 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Map/Units/TribesState.func.hpp" +#include "OpenSHC/Map/Units/UnitsState.func.hpp" +#include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" + +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TribesState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Navigation::Algorithms::XYPair; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A67D0 + void PathFindingState::spawnUnitAndAddToTribe( + int playerID, int displayColor, int count, UnitType unitType, undefined4 tribeID) + { + int* local_4; + int _tile; + this->calculations = this->calculations + 1; + int iVar2 = -1; + this->searchQueue.readIndex = 0; + if (this->searchQueue.writeIndex != 0) { + local_4 = &DAT_GameState::instance.mapAndTime.somePairArray.y; + do { + uint _y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint _x = _tile - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; + if (DAT_TileMapState::instance.CertainPathLayer[_tile] != 100) { + int _unitID_2 = MACRO_CALL_MEMBER(OpenSHC::Map::Units::UnitsState_Func::spawnUnit, + DAT_UnitsState::ptr)(playerID, displayColor, (int)(_x * 8), (int)(_y * 8), 8, unitType); + if (_unitID_2 != 0) { + count = count + -1; + MACRO_CALL_MEMBER(OpenSHC::Map::Units::TribesState_Func::addUnitToTribe, + DAT_TribesState::ptr)(_unitID_2, tribeID); + } + if (count < 1) { + return; + } + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::budgetFloodFillOnCertainPathLayer, this)( + _x, _y, 10, 2); + ((XYPair*)(local_4 + -1))->x = _x; + *local_4 = _y; + local_4 = local_4 + 2; + iVar2 = _tile; + } + if (0x117cdef < (int)local_4) + break; + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + if ((0 < count) && (iVar2 != -1)) { + int sVar1 = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[iVar2]; + _tile = DAT_ViewportRenderState::instance.translationMatrix[sVar1].addXgetTile; + do { + int _unitID + = MACRO_CALL_MEMBER(OpenSHC::Map::Units::UnitsState_Func::spawnUnit, DAT_UnitsState::ptr)( + playerID, displayColor, (iVar2 - _tile) * 8, (int)(sVar1 * 8), 8, unitType); + if (_unitID != 0) { + MACRO_CALL_MEMBER(OpenSHC::Map::Units::TribesState_Func::addUnitToTribe, DAT_TribesState::ptr)( + _unitID, tribeID); + } + count = count + -1; + } while (0 < count); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp new file mode 100644 index 0000000000..6092077443 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp @@ -0,0 +1,165 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Entities/EntityState.func.hpp" +#include "OpenSHC/Commands/MappersEnum.hpp" +#include "OpenSHC/Game/GameMode2.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_EntityState.hpp" +#include "OpenSHC/Globals/DAT_GameCore.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Commands::MappersEnum; + using OpenSHC::Game::GameMode2; + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + WARNING: Enum "DPSEND_EnumInt": Some values do not have unique names + */ + /* + WARNING: Enum "DPERRInt": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A2A90 + undefined4 PathFindingState::spreadAlgorithmForFlagsAndBraziersUnk( + int playerID, uint x, uint y, int param_4, int param_5) + { + int* piVar1; + int sVar2; + int tile; + uint uVar3; + int iVar4; + int iVar5; + short* psVar6; + int (*paiVar7)[8]; + int iVar8; + int local_8; + int local_4; + uVar3 = y; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return (undefined4)(0); + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)uVar3; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[uVar3].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while ( + (tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < tile && (tile < 0x13a10))) { + local_4 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[tile]; + if (0x13a10 < this->searchQueue.currentDistance) { + return (undefined4)(0); + } + if (this->searchQueue.currentDistance > param_4) { + return (undefined4)(0); + } + iVar8 = 0; + iVar5 = (int)DAT_TileMapState::instance.EntityLayer[tile]; + if (DAT_TileMapState::instance.EntityLayer[tile] != 0) { + while (iVar8 = iVar8 + 1, iVar8 < 10) { + if (DAT_EntityState::instance.entityArray[iVar5].owner == playerID) { + switch (DAT_EntityState::instance.entityArray[iVar5].entityType) { + case OpenSHC::Map::Entities::ET_BRAZIER: + if ((DAT_GameCore::instance.gameMode_2 == OpenSHC::Game::GM_SIEGE_THAT) + && (DAT_EntityState::instance.entityArray[iVar5].logicalState != 3)) { + if (param_5 == 0) { + return (undefined4)(1); + } + local_8 = 0; + y = 0; + MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingCost, + DAT_BuildingsState::ptr)( + OpenSHC::Commands::M_MAPPER_BRAZIER, &local_8, (int*)&y); + piVar1 + = DAT_GameState::instance + .playerDataArray[DAT_GameSynchronyState::instance.currentPlayerSlotID] + .startResources + + 0xf; + *piVar1 = *piVar1 + y; + } + case OpenSHC::Map::Entities::ET_FLAG_1: + case OpenSHC::Map::Entities::ET_FLAG_4: + case OpenSHC::Map::Entities::ET_FLAG_2: + case OpenSHC::Map::Entities::ET_FLAG_3: + case OpenSHC::Map::Entities::ET_HEADS_ON_SPIKES: + if (param_5 == 0) { + return (undefined4)(1); + } + MACRO_CALL_MEMBER(OpenSHC::Map::Entities::EntityState_Func::destroyEntitiesOnTile, + DAT_EntityState::ptr)(tile); + } + } + iVar4 = (int)DAT_EntityState::instance.entityArray[iVar5].nextEntityOnThisTileByID; + if ((iVar5 == iVar4) || (iVar5 = iVar4, iVar4 == 0)) + break; + } + } + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + tile; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + (short)local_4; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a0f < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a0f < this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return (undefined4)(0); + } + } + } + return (undefined4)(0); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/storeDestinationOptionsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/storeDestinationOptionsUnk.cpp new file mode 100644 index 0000000000..2cbd686e75 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/storeDestinationOptionsUnk.cpp @@ -0,0 +1,52 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A6520 + void PathFindingState::storeDestinationOptionsUnk(int signpostID) + { + this->calculations = this->calculations + 1; + int iVar2 = 0; + this->searchQueue.readIndex = 0; + if (this->searchQueue.writeIndex != 0) { + do { + uint y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int iVar1 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint x = iVar1 - DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile; + if (DAT_TileMapState::instance.CertainPathLayer[iVar1] != 100) { + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::budgetFloodFillOnCertainPathLayer, this)( + x, y, 100, (int)(30)); + DAT_GameState::instance.mapAndTime.unitMoveDestinationXYPairs[signpostID][iVar2].x = x; + DAT_GameState::instance.mapAndTime.unitMoveDestinationXYPairs[signpostID][iVar2].y = y; + iVar2 = iVar2 + 1; + } + if (iVar2 >= 40) { + return; + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (80400 < this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp new file mode 100644 index 0000000000..652399b90d --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp @@ -0,0 +1,161 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A97D0 + void PathFindingState::traceAndCommitPathPlan(uint x, uint y, uint x2, uint y2, int param_5) + { + uint uVar3; + int iVar4; + uint uVar5; + if (x <= 399 && y <= 399 && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] != '\0' + && x2 <= 399 && y2 <= 399 + && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] != '\0') { + uint tile = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; + int iVar2 = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile; + short sVar1 = DAT_TileMapState::instance.WalkLayer[tile]; + x2 = 0; + this->field49_0x94 = 0; + y = (int)DAT_TileMapState::instance.CertainPathLayer[tile]; + do { + if (tile == iVar2 + x) + break; + uint _theDirection = 8; + uint _direction = 0; + do { + if (param_5 == 1) { + if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction] + & DAT_TileMapState::instance.PathLinkageLayer[tile]) + == 0) + goto LAB_004a99f7; + LAB_004a99b6: + uint uVar3 = DAT_TileMapState::instance.directionTranslationMatrix[y2][_direction] + tile; + if (DAT_TileMapState::instance.WalkLayer[uVar3] == sVar1 + && (uVar5 = (uint)DAT_TileMapState::instance.CertainPathLayer[uVar3], + (int)(y - 2) <= (int)uVar5) + && (int)uVar5 < (int)y) { + _theDirection = _direction; + y = uVar5; + x2 = uVar3; + } + } else { + if (param_5 != 2) { + if (param_5 == 3 + && (DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction] + & DAT_TileMapState::instance.PathLinkageLayer[tile]) + == 0) { + if ((_direction & 1) == 0 + && (iVar4 + = DAT_TileMapState::instance.directionTranslationMatrix[y2][_direction] + + tile, + DAT_TileMapState::instance.BuildingLayer[tile] == 0 + && (DAT_TileMapState::instance.BuildingLayer[iVar4] == 0))) { + if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x100U) == 0) { + uVar3 = DAT_TileMapState::instance.LogicLayer[iVar4] & 0x100; + goto joined_r0x004a99a9; + } + if ((DAT_TileMapState::instance.LogicLayer[iVar4] & 0x100U) == 0) + goto LAB_004a99b6; + } + goto LAB_004a99f7; + } + goto LAB_004a99b6; + } + if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction] + & DAT_TileMapState::instance.PathLinkageLayer[tile]) + != 0) + goto LAB_004a99b6; + iVar4 = DAT_TileMapState::instance.directionTranslationMatrix[y2][_direction] + tile; + if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x40000000U) == 0) { + uVar3 = DAT_TileMapState::instance.LogicLayer[iVar4] & 0x40000000; + joined_r0x004a99a9: + if (uVar3 != 0) + goto LAB_004a99b6; + } else if ((DAT_TileMapState::instance.LogicLayer[iVar4] & 0xa5014b1U) == 0) { + if ((uint)DAT_TileMapState::instance.HeightLayer[tile] + <= DAT_TileMapState::instance.HeightLayer[iVar4] + 0x10 + && (int)(DAT_TileMapState::instance.HeightLayer[iVar4] - 0x10) + <= (int)(uint)DAT_TileMapState::instance.HeightLayer[tile]) + goto LAB_004a99b6; + } + } + LAB_004a99f7: + _direction = _direction + 1; + } while ((int)_direction < 8); + if (_theDirection == 8) { + /* + I guess this increment means "total recomputes of the path linkage layer" + */ + this->DAT_lWys = this->DAT_lWys + 1; + this->searchQueue.pathPlanIndex = 0; + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + updatePathLinkageLayerForEachBuildingAtEachTile, + this)(); + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::updateSeparateAreaTileMap, this)(1); + MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::updatePathLinkageLayerForAllBuildings, + DAT_BuildingsState::ptr)(); + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + updatePathLinkageLayerAtTileForSomeLogicalReason, + this)(tile, (int)(y2)); + return; + } + y2 = y2 + + DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_theDirection] + .int_.yOffset; + if ((DAT_TileMapState::instance.LogicLayer[x2] & 0x10000100U) != 0 + && (DAT_TileMapState::instance.LogicLayer[x2] & 2U) == 0 + && (DAT_TileMapState::instance.BuildingLayer[x2] == 0 + || (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[x2]] + .buildingType] + == 0))) { + this->field49_0x94 = this->field49_0x94 + 1; + } + iVar4 = _theDirection + 4; + if (7 < iVar4) { + iVar4 = _theDirection - 4; + } + /* + commit path plan + */ + if ((this->searchQueue.pathPlanIndex & 1) == 0) { + this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] = (byte)iVar4; + } else { + this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] + = this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] & 0xf; + this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] + = this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] + + (byte)iVar4 * '\x10'; + } + this->searchQueue.pathPlanIndex = this->searchQueue.pathPlanIndex + 1; + tile = x2; + } while ((int)this->searchQueue.pathPlanIndex < 800); + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::reverseCurrentPathPlan, this)(); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp new file mode 100644 index 0000000000..125cf2da5c --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp @@ -0,0 +1,137 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_EntityState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + @return bool whether destination was reached decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049A370 + BOOLEnum PathFindingState::tracePathPlanToDestinationViaUnoccupiedTiles(uint x, uint y, uint destX, uint destY) + { + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + if (399 < destX || 399 < destY + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[destY * 400 + destX] == '\0') { + return FALSE; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + /* + The original keeps every layer base and both end points in its own stack slot for the + whole walk rather than reloading the globals, so they are locals here too. + */ + int _budget = 0; + uint _ppIndex = 0; + int _direction = 0; + uint _gen = (ushort)this->searchGeneration; + int _fireCount = DAT_EntityState::instance.fireCount; + short* _walkLayer = DAT_TileMapState::instance.WalkLayer; + uchar* _occupancy = DAT_TileMapState::instance.OccupancyLayer; + uchar* _linkage = DAT_TileMapState::instance.PathLinkageLayer; + int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; + Point8* _cardinal = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix; + int _tile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + int _destTile = DAT_ViewportRenderState::instance.translationMatrix[destY].addXgetTile + destX; + byte* _pPathPlan = this->searchQueue.ptrPathPlan; + _ppIndex = this->searchQueue.pathPlanIndex; + while (true) { + _budget = _budget + 1; + if (399 < _budget) { + break; + } + _walkLayer[_tile] = (short)_gen; + /* + tile2 matches tile ? + */ + if (_tile == _destTile) { + this->searchQueue.pathPlanIndex = _ppIndex; + return TRUE; + } + /* + tile is occupied and fire? + */ + if (_fireCount != 0 && _occupancy[_tile] != '\0') { + break; + } + int _canTraverseThisDirection = _linkage[_tile]; + if ((int)destY < (int)y) { + if ((int)destX < (int)x) { + _direction = 7; + _canTraverseThisDirection = _canTraverseThisDirection & 0x80; + } else if ((int)x < (int)destX) { + _direction = 1; + _canTraverseThisDirection = _canTraverseThisDirection & 2; + } else { + _direction = 0; + _canTraverseThisDirection = _canTraverseThisDirection & 1; + } + } else if ((int)y < (int)destY) { + if ((int)destX < (int)x) { + _direction = 5; + _canTraverseThisDirection = _canTraverseThisDirection & 0x20; + } else if ((int)x < (int)destX) { + _direction = 3; + _canTraverseThisDirection = _canTraverseThisDirection & 8; + } else { + _direction = 4; + _canTraverseThisDirection = _canTraverseThisDirection & 0x10; + } + } else if ((int)destX < (int)x) { + _direction = 6; + _canTraverseThisDirection = _canTraverseThisDirection & 0x40; + } else { + if ((int)destX <= (int)x) { + break; + } + _direction = 2; + _canTraverseThisDirection = _canTraverseThisDirection & 4; + } + /* + if cannot go any direction, stop + */ + if (_canTraverseThisDirection == 0) { + break; + } + /* + update tile with new direction + */ + _tile = _tile + _dirMatrix[y * 8 + _direction]; + x = x + _cardinal[_direction].int_.xOffset; + y = y + _cardinal[_direction].int_.yOffset; + /* + store direction in path plan + */ + if ((_ppIndex & 1) == 0) { + _pPathPlan[_ppIndex >> 1] = (byte)_direction; + } else { + _pPathPlan[_ppIndex >> 1] = (_pPathPlan[_ppIndex >> 1] & 0xf) | (byte)(_direction << 4); + } + _ppIndex = _ppIndex + 1; + } + this->searchQueue.pathPlanIndex = _ppIndex; + return FALSE; + } + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp new file mode 100644 index 0000000000..1dfc29b4cb --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp @@ -0,0 +1,124 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A16C0 + int PathFindingState::tracePathToFriendlyDefensesAndReturnTileUnk(int playerID, uint x, uint y) + { + int (*paiVar7)[8]; + int _candidateTile; + if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return 0; + } + this->calculations = this->calculations + 1; + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + _candidateTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_candidateTile < 0) { + return 0; + } + if (0x13a0f < _candidateTile) { + return 0; + } + int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_candidateTile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return 0; + } + byte bVar1 = DAT_TileMapState::instance.PathLinkageLayer[_candidateTile]; + int iVar6 = 0; + paiVar7 = DAT_TileMapState::instance.directionTranslationMatrix + sVar3; + do { + int iVar5 = (*paiVar7)[0] + _candidateTile; + if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { + if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6] & bVar1) == 0) { + short sVar4 = DAT_TileMapState::instance.BuildingLayer[iVar5]; + if (sVar4 != 0) { + switch (DAT_BuildingsState::instance.buildings[sVar4].buildingType) { + case OpenSHC::Map::Buildings::BT_MERCENARYPOST: + case OpenSHC::Map::Buildings::BT_BARRACKS: + case OpenSHC::Map::Buildings::BT_MANORHOUSE: + case OpenSHC::Map::Buildings::BT_STONEKEEP: + case OpenSHC::Map::Buildings::BT_STRONGHOLD: + case OpenSHC::Map::Buildings::BT_KEEPFOUR: + case OpenSHC::Map::Buildings::BT_KEEPFIVE: + case OpenSHC::Map::Buildings::BT_GATEHOUSELARGE: + case OpenSHC::Map::Buildings::BT_GATEHOUSESMALL: + case OpenSHC::Map::Buildings::BT_TOWER1: + case OpenSHC::Map::Buildings::BT_TOWER2: + case OpenSHC::Map::Buildings::BT_TOWER3: + case OpenSHC::Map::Buildings::BT_TOWER4: + case OpenSHC::Map::Buildings::BT_TOWER5: + if (DAT_GameState::instance.mapAndTime + .playerTeams[DAT_BuildingsState::instance.buildings[sVar4].owner] + == DAT_GameState::instance.mapAndTime.playerTeams[playerID]) { + return _candidateTile; + } + } + } + } else { + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + iVar6 = iVar6 + 1; + paiVar7 = (int (*)[8])(*paiVar7 + 1); + } while (iVar6 < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } + return 0; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp new file mode 100644 index 0000000000..aa2c994ae8 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp @@ -0,0 +1,165 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049E9E0 + void PathFindingState::updateAIZoneWithFloodFill0x20(int max, uint x, uint y) + { + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + do { + int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + DAT_TileMapState::instance.AIInfoLayer[_tile] + = DAT_TileMapState::instance.AIInfoLayer[_tile] | 0x20; + short sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; + short sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (this->searchQueue.currentDistance > max) { + return; + } + int iVar3 = 0; + do { + /* + fixme: why are there nested identical if else statements here? shouldn't it tested the + edge-ness of the candidate !? + */ + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0) { + int _candidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0) { + _candidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3 + 1] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0) { + _candidate = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3 + 2] + + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] + = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[iVar3 + 2] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[iVar3 + 2] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0 + && (_candidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3 + 3] + + _tile, + DAT_TileMapState::instance.WalkLayer[_candidate] + != this->searchGeneration)) { + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] + = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + } + } + iVar3 = iVar3 + 4; + } while (iVar3 < 8); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp new file mode 100644 index 0000000000..2e371a7cb7 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp @@ -0,0 +1,52 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_CurrentClimbDataID.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A9680 + void PathFindingState::updateClimbData() + { + int iVar1; + this->numberOfClimbTeleports = 0; + this->debugGreatestClimbLoading = 0; + this->maxClimbDataCount = 0; + DAT_CurrentClimbDataID::instance = 1; + do { + if (this->climbData[DAT_CurrentClimbDataID::instance].canBeUsed != 0) { + this->maxClimbDataCount = DAT_CurrentClimbDataID::instance + 1; + (*DAT_ClimbLogicDefinedData::instance + .updateFunctions[this->climbData[DAT_CurrentClimbDataID::instance].type])(); + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::recountUnitsUsingClimbData, + this)(DAT_CurrentClimbDataID::instance); + if (this->climbData[DAT_CurrentClimbDataID::instance].canBeUsed == 0) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::clearClimbData, this)( + DAT_CurrentClimbDataID::instance); + iVar1 = this->debugGreatestClimbLoading; + } else { + this->numberOfClimbTeleports = this->numberOfClimbTeleports + 1; + iVar1 = this->climbData[DAT_CurrentClimbDataID::instance].numberOfUnitsUsing; + if (iVar1 <= this->debugGreatestClimbLoading) + goto LAB_004a9740; + } + this->debugGreatestClimbLoading = iVar1; + } + LAB_004a9740: + DAT_CurrentClimbDataID::instance = DAT_CurrentClimbDataID::instance + 1; + if (199 < DAT_CurrentClimbDataID::instance) { + return; + } + } while (true); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp new file mode 100644 index 0000000000..4438ef2092 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp @@ -0,0 +1,98 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00499DC0 + void PathFindingState::updatePathLinkageLayerAtTileForSomeLogicalReason(int tile, int y) + { + int* _ptrY; + int iVar3; + uint uVar4; + uint uVar5; + int iVar2 = tile; + uVar5 = 4; + int bVar1 = DAT_TileMapState::instance.PathLinkageLayer[tile]; + _ptrY = DAT_TileMapState::instance.directionTranslationMatrix[y] + 1; + tile = 2; + do { + iVar3 = (*(int (*)[8])(_ptrY + -1))[0] + iVar2; + if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30U) == 0 + && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) == 0) { + if ((bVar1 & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 4]) == 0) { + uVar4 = (int)uVar5 % 8; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] + & ~DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; + } else { + uVar4 = (int)uVar5 % 8; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] + | DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; + } + } + iVar3 = *_ptrY + iVar2; + if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30U) == 0 + && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) == 0) { + if ((bVar1 & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 3]) == 0) { + uVar4 = (uVar5 + 1) % 8; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] + & ~DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; + } else { + uVar4 = (uVar5 + 1) % 8; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] + | DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; + } + } + iVar3 = _ptrY[1] + iVar2; + if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30U) == 0 + && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) == 0) { + if ((bVar1 & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 2]) == 0) { + uVar4 = (uVar5 + 2) % 8; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] + & ~DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; + } else { + uVar4 = (uVar5 + 2) % 8; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] + | DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; + } + } + iVar3 = _ptrY[2] + iVar2; + if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30U) == 0 + && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) == 0) { + if ((bVar1 & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 1]) == 0) { + uVar4 = (uVar5 + 3) % 8; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] + & ~DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; + } else { + uVar4 = (uVar5 + 3) % 8; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] + | DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; + } + } + _ptrY = _ptrY + 4; + uVar5 = uVar5 + 4; + tile = tile + -1; + } while (tile != 0); + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp new file mode 100644 index 0000000000..0576716e3b --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp @@ -0,0 +1,240 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::Map::Buildings::BuildingTypeShort; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004999C0 + BOOLEnum PathFindingState::updatePathLinkageLayerBasedOnBuildingsUnk(int yUnk, int tile) + { + byte bVar1; + int iVar6; + int (*paiVar8)[8]; + uint _height; + int _directionIndex; + int _building; + bool bVar9; + bool bVar10; + bool bVar11; + byte _linkageResult; + BOOLEnum _result; + int local_28; + uint local_24; + uint local_20[8]; + BuildingTypeShort _buildingType; + uint _logic; + _logic = DAT_TileMapState::instance.LogicLayer[tile]; + _height = (uint)DAT_TileMapState::instance.HeightLayer[tile]; + _building = (int)DAT_TileMapState::instance.BuildingLayer[tile]; + _result = FALSE; + if ((_logic & 0x10000000) != 0) { + iVar6 = MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)(_building); + _height = _height + iVar6; + } + local_24 = _height + 0x10; + local_28 = _height - 0x10; + if ((_building != 0) + && (_buildingType = DAT_BuildingsState::instance.buildings[_building].buildingType, + _result + = (BOOLEnum)(DAT_BuildingDefinedData::instance.BuildingIsGateHouseArray[(short)_buildingType] != 0), + DAT_BuildingDefinedData::instance.BuildingIsKeepArray[(short)_buildingType] != 0)) { + _result = TRUE; + } + bool bVar2 = false; + bool bVar4 = false; + bool bVar3 = false; + bool bVar5 = false; + byte bVar7 = 0; + iVar6 = 0; + _linkageResult = 0; + DAT_TileMapState::instance.PathLinkageLayer[tile] = '\0'; + if ((_logic & 0x800000) == 0) { + if ((_logic & 0x10000000) == 0) { + if ((_logic & 2) == 0 && (_logic & 0x200000) == 0) { + if ((_logic & 0x800) != 0) { + bVar4 = true; + goto LAB_00499ada; + } + if ((_logic & 0x400000) != 0) { + return _result; + } + if ((_logic & 0x100) != 0) { + bVar3 = true; + if (DAT_TileMapState::instance.BuildingLayer[tile] != 0) { + iVar6 = 2; + } + goto LAB_00499ada; + } + if ((_logic & 0x4a5014b1) != 0) { + return _result; + } + } + bVar5 = true; + } else { + bVar2 = true; + iVar6 = 1; + } + } + LAB_00499ada: + _directionIndex = 0; + paiVar8 = DAT_TileMapState::instance.directionTranslationMatrix + yUnk; + do { + int _tile = (*paiVar8)[0] + tile; + _logic = DAT_TileMapState::instance.LogicLayer[_tile]; + local_20[_directionIndex] = _logic; + if ((_logic & 0x200000) == 0) { + if ((_logic & 0x800) != 0) { + if ((iVar6 == 1) || ('\x14' < (char)DAT_TileMapState::instance.DamageLayer[_tile])) + goto LAB_00499c4b; + goto LAB_00499bce; + } + if ((_logic & 2) == 0) { + if ((_logic & 0x400) == 0) { + if ((_logic & 0x10000000) != 0) { + bVar7 = bVar7 + + DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_directionIndex]; + goto LAB_00499bce; + } + if ((_logic & 0x400000) == 0) { + if ((_logic & 0x100) != 0) { + bVar7 = bVar7 + + DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_directionIndex]; + goto LAB_00499bce; + } + if ((_logic & 0x30) == 0) { + bVar9 = (_logic & 0x4a5014b1) == 0; + goto LAB_00499bcc; + } + bVar7 = bVar7 + + DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_directionIndex]; + } else { + bVar7 = bVar7 + + DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_directionIndex]; + } + } else if (DAT_BuildingDefinedData::instance.field17_0x1774[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_tile]] + .buildingType] + != FALSE) { + bVar7 = bVar7 + + DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_directionIndex]; + } + } else if (!bVar2) { + if ((_logic & 0x400) != 0) { + bVar9 = DAT_TileMapState::instance.BuildingLayer[_tile] == 0; + LAB_00499bcc: + if (!bVar9) + goto LAB_00499c4b; + } + goto LAB_00499bce; + } + } else { + LAB_00499bce: + if ((_logic & 0x10000000) == 0) { + if ((_logic & 0x100) == 0 || iVar6 == 0) { + if (((bVar3) || (bVar4)) && (_logic & 0x100) != 0 + && DAT_TileMapState::instance.BuildingLayer[_tile] != 0) { + bVar1 = DAT_TileMapState::instance.DamageLayer[tile]; + bVar11 = (bVar1 < '\x14'); + bVar10 = (char)(bVar1 - 0x14) < '\0'; + bVar9 = bVar1 == 0x14; + } else { + _logic = (uint)DAT_TileMapState::instance.HeightLayer[_tile]; + if ((int)_logic < local_28) + goto LAB_00499c4b; + bVar11 = (_logic < local_24); + bVar10 = (int)(_logic - local_24) < 0; + bVar9 = _logic == local_24; + } + } else { + bVar1 = DAT_TileMapState::instance.DamageLayer[_tile]; + bVar11 = (bVar1 < '\x14'); + bVar10 = (char)(bVar1 - 0x14) < '\0'; + bVar9 = bVar1 == 0x14; + } + LAB_00499c3f: + if (!bVar9 && bVar11 == bVar10) + goto LAB_00499c4b; + } else if (!bVar2) { + if (!bVar3) + goto LAB_00499c4b; + bVar1 = DAT_TileMapState::instance.DamageLayer[tile]; + bVar11 = (bVar1 < '\x14'); + bVar10 = (char)(bVar1 - 0x14) < '\0'; + bVar9 = bVar1 == 0x14; + goto LAB_00499c3f; + } + _linkageResult = _linkageResult + | DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_directionIndex]; + } + LAB_00499c4b: + _directionIndex = _directionIndex + 1; + paiVar8 = (int (*)[8])(*paiVar8 + 1); + if (7 < _directionIndex) { + if (bVar5) { + if ((_linkageResult & 1) == 0 && (bVar7 & 1) != 0) { + if ((_linkageResult & 4) == 0 && (bVar7 & 4) != 0) { + _linkageResult = _linkageResult & 0xfd; + } + if ((_linkageResult & 0x40) == 0 && (bVar7 & 0x40) != 0) { + _linkageResult = _linkageResult & 0x7f; + } + } + if ((_linkageResult & 0x10) == 0 && (bVar7 & 0x10) != 0) { + if ((_linkageResult & 4) == 0 && (bVar7 & 4) != 0) { + _linkageResult = _linkageResult & 0xf7; + } + if ((_linkageResult & 0x40) == 0 && (bVar7 & 0x40) != 0) { + _linkageResult = _linkageResult & 0xdf; + } + } + } else { + if ((local_20[0] & 0x10000100) != 0 && (local_20[2] & 0x10000100) != 0 + && (local_20[1] & 0x10000100) == 0 && (local_20[1] & 2) == 0 && (local_20[0] & 0x800) == 0 + && (local_20[2] & 0x800) == 0) { + _linkageResult = _linkageResult & 0xfd; + } + if ((local_20[0] & 0x10000100) != 0 && (local_20[6] & 0x10000100) != 0 + && (local_20[7] & 0x10000100) == 0 && (local_20[7] & 2) == 0 && (local_20[0] & 0x800) == 0 + && (local_20[6] & 0x800) == 0) { + _linkageResult = _linkageResult & 0x7f; + } + if ((local_20[4] & 0x10000100) != 0 && (local_20[2] & 0x10000100) != 0 + && (local_20[3] & 0x10000100) == 0 && (local_20[3] & 2) == 0 && (local_20[4] & 0x800) == 0 + && (local_20[2] & 0x800) == 0) { + _linkageResult = _linkageResult & 0xf7; + } + if ((local_20[4] & 0x10000100) != 0 && (local_20[6] & 0x10000100) != 0 + && (local_20[5] & 0x10000100) == 0 && (local_20[5] & 2) == 0 && (local_20[4] & 0x800) == 0 + && (local_20[6] & 0x800) == 0) { + _linkageResult = _linkageResult & 0xdf; + } + } + DAT_TileMapState::instance.PathLinkageLayer[tile] = _linkageResult; + return _result; + } + } while (true); + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp new file mode 100644 index 0000000000..f54b4d58a9 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp @@ -0,0 +1,120 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x00499FA0 + void PathFindingState::updatePathLinkageTileMapRelatedToGates(int buildingID) + { + byte* pbVar1; + int iVar2; + int iVar3; + int _anotherTile; + int iVar4; + int _middleTileUnk; + uint uVar5; + int _xMiddleUnk; + int _offset; + int _pl2; + uint _widthOrHeight; + _middleTileUnk = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; + _widthOrHeight = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; + if (DAT_BuildingsState::instance.buildings[buildingID].buildingVariation != 80) { + _xMiddleUnk = _middleTileUnk + (int)_widthOrHeight / 2; + iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + _pl2 = DAT_BuildingsState::instance.buildings[buildingID].pathLinkageRelated2; + _middleTileUnk = DAT_ViewportRenderState::instance.translationMatrix[iVar3 + -1].addXgetTile; + iVar4 = DAT_ViewportRenderState::instance.translationMatrix[iVar3].addXgetTile; + uVar5 = (uint)DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + _xMiddleUnk]; + _middleTileUnk = _middleTileUnk + _xMiddleUnk; + _anotherTile = iVar4 + _xMiddleUnk; + if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) == 0 + && uVar5 <= DAT_TileMapState::instance.DefaultHeightLayer[iVar4 + _xMiddleUnk] + 0x10 + && (int)(DAT_TileMapState::instance.DefaultHeightLayer[_anotherTile] - 0x10) <= (int)uVar5 + && _pl2 != 2) { + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] | 0x10; + DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] + = DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] | 1; + } else { + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xef; + DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] + = DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] & 0xfe; + } + _middleTileUnk + = DAT_ViewportRenderState::instance.translationMatrix[_widthOrHeight + iVar3].addXgetTile; + uVar5 = (uint)DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + _xMiddleUnk]; + _middleTileUnk = _middleTileUnk + _xMiddleUnk; + iVar4 = DAT_ViewportRenderState::instance.translationMatrix[_widthOrHeight + iVar3 + -1].addXgetTile + + _xMiddleUnk; + if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) == 0 + && uVar5 <= DAT_TileMapState::instance.DefaultHeightLayer[iVar4] + 0x10 + && (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar4] - 0x10) <= (int)uVar5 && _pl2 != 2) { + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] | 1; + DAT_TileMapState::instance.PathLinkageLayer[iVar4] + = DAT_TileMapState::instance.PathLinkageLayer[iVar4] | 0x10; + return; + } + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xfe; + DAT_TileMapState::instance.PathLinkageLayer[iVar4] + = DAT_TileMapState::instance.PathLinkageLayer[iVar4] & 0xef; + return; + } + _pl2 = DAT_BuildingsState::instance.buildings[buildingID].pathLinkageRelated2; + iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + (int)_widthOrHeight / 2; + iVar2 = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile; + iVar3 = iVar2 + -1 + _middleTileUnk; + if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk + iVar2 + -1] & 0x4a5014b1U) == 0 + && (uint)(byte)DAT_TileMapState::instance.EntityLayerLT25[iVar3 + 0x13a10] + <= DAT_TileMapState::instance.DefaultHeightLayer[iVar3 + 1] + 0x10 + && (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar3 + 1] - 0x10) + <= (int)(uint)(byte)DAT_TileMapState::instance.EntityLayerLT25[iVar3 + 0x13a10] + && _pl2 != 2) { + pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + iVar3 + 0x27420); + *pbVar1 = *pbVar1 | 4; + DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] | 0x40; + } else { + pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + iVar3 + 0x27420); + *pbVar1 = *pbVar1 & 0xfb; + DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] & 0xbf; + } + _middleTileUnk = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + _widthOrHeight + + _middleTileUnk; + if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) == 0 + && (uint)DAT_TileMapState::instance.HeightLayer[_middleTileUnk] + <= DAT_TileMapState::instance.HeightLayer[_middleTileUnk + 0x13a0f] + 0x10 + && (int)(DAT_TileMapState::instance.HeightLayer[_middleTileUnk + 0x13a0f] - 0x10) + <= (int)(uint)DAT_TileMapState::instance.HeightLayer[_middleTileUnk] + && _pl2 != 2) { + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] | 0x40; + pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + _middleTileUnk + 0x2741f); + *pbVar1 = *pbVar1 | 4; + return; + } + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xbf; + pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + _middleTileUnk + 0x2741f); + *pbVar1 = *pbVar1 & 0xfb; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp new file mode 100644 index 0000000000..eb1f6c2b79 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp @@ -0,0 +1,70 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049A1C0 + void PathFindingState::updatePathLinkageTileMapRelatedToKeeps(int buildingID) + { + byte* pbVar1; + uint uVar2; + int iVar3; + int iVar4; + short _orientation; + _orientation = DAT_BuildingsState::instance.buildings[buildingID].orientation; + if (_orientation == 4) { + iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + iVar3 = (int)DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight / 2 + + (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; + pbVar1 = (byte*)(DAT_ViewportRenderState::instance.translationMatrix[iVar4 + -1].addXgetTile + 0x1e1e4f8 + + iVar3); + *pbVar1 = *pbVar1 | 0x10; + DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3] + = DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + + iVar3] + | 1; + return; + } + if (_orientation == 6) { + iVar3 = (short)DAT_BuildingsState::instance.buildings[buildingID].x + -1; + iVar4 = (int)DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight / 2 + + (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + } else { + uVar2 = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; + if (_orientation != 2) { + iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x + (int)uVar2 / 2; + pbVar1 = (byte*)(DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4 + -1].addXgetTile + + 0x1e1e4f8 + iVar3); + *pbVar1 = *pbVar1 | 0x10; + pbVar1 = (byte*)(DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4].addXgetTile + + 0x1e1e4f8 + iVar3); + *pbVar1 = *pbVar1 | 1; + return; + } + iVar3 = (short)DAT_BuildingsState::instance.buildings[buildingID].x + -1 + uVar2; + iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + (int)uVar2 / 2; + } + iVar3 = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] = DAT_TileMapState::instance.PathLinkageLayer[iVar3] | 4; + DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] | 0x40; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp new file mode 100644 index 0000000000..8a3de03a9e --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp @@ -0,0 +1,67 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049A2E0 + void PathFindingState::updatePathLinkageTileMapRelatedToSiegeTower(int param_1) + { + byte* pbVar1; + int iVar2; + int iVar3; + int iVar4; + iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[param_1].x; + iVar2 = (int)(short)DAT_BuildingsState::instance.buildings[param_1].y; + DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + -1].addXgetTile + iVar4 + + 1] + = DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + -1].addXgetTile + + iVar4 + 1] + | 0x10; + DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2].addXgetTile + iVar4 + 1] + = DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2].addXgetTile + iVar4 + + 1] + | 0x11; + DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 2].addXgetTile + iVar4 + + 1] + = DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 2].addXgetTile + + iVar4 + 1] + | 0x11; + iVar3 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 1].addXgetTile + iVar4; + DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 3].addXgetTile + iVar4 + + 1] + = DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 3].addXgetTile + + iVar4 + 1] + | 1; + pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + iVar3 + 0x2741f); + *pbVar1 = *pbVar1 | 4; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] | 0x44; + DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 2] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 2] | 0x44; + DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 3] | 0x40; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp new file mode 100644 index 0000000000..d4ad416065 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp @@ -0,0 +1,50 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A5F90 + void PathFindingState::updatePathLinkagesInAllEightDirections(int y, int tile) + { + int (*paiVar1)[8]; + int* piVar2; + int _someLinkageResult; + _someLinkageResult = 0; + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::updatePathLinkageLayerBasedOnBuildingsUnk, this)( + y, tile); + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + BOOLEnum _tileIsKeepUnk = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::updatePathLinkageLayerBasedOnBuildingsUnk, this)( + DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.yOffset + y, + DAT_TileMapState::instance.directionTranslationMatrix[y][_direction] + tile); + if (_tileIsKeepUnk != FALSE) { + _someLinkageResult = 1; + } + } + + if (_someLinkageResult) { + DAT_BuildingsState::instance.pathLinkageKeepWasUpdatedUnk = 1; + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp new file mode 100644 index 0000000000..8a5239f6d3 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp @@ -0,0 +1,104 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Restarted to delay deadcode elimination for space: ram + */ + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004995E0 + BOOLEnum PathFindingState::updateSeparateAreaTileMap(int forceUpdate) + { + if (forceUpdate != 0) { + this->toggleUpdateSeparateAreaTileMap = 1; + DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps = 0; + } + DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps + = DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps - 1; + if (0 < DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps + || (DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps = 200, + this->toggleUpdateSeparateAreaTileMap == 0)) { + return FALSE; + } + this->field41_0x74 = this->field41_0x74 + 1; + this->toggleUpdateSeparateAreaTileMap = 0; + this->totalZones = 0; + this->sum = 0; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.PathConnectionLayer))); + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 4000, '\0', (void*)((int)(this->zoneSizesArray))); + MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::updatePathLinkageTileMap, DAT_BuildingsState::ptr)(1); + /* + The eight-neighbour expansion below is handwritten assembly in the original and reaches + the area layer and the queue through these locals; see LinkageNeighbourAsm.hpp. The + queue end lives in the forceUpdate parameter slot, as it does in the original. + */ + ushort* _areaLayer = DAT_TileMapState::instance.PathConnectionLayer; + int* _tilesQueue = this->searchQueue.tilesQueue; + short* _yQueue = this->searchQueue.yQueue; + int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; + short _areaID = 1; + short _row = 0; + int* _rowEnd = &DAT_ViewportRenderState::instance.translationMatrix[1].firstTileOfRow; + for (int _first = 0; _first < 80400; _first = _first + 1) { + if (*_rowEnd <= _first) { + _row = _row + 1; + _rowEnd = _rowEnd + 3; + } + if ((char)(short)DAT_TileMapState::instance.PathConnectionLayer[_first] != '\0' + || (DAT_TileMapState::instance.LogicLayer[_first] & 0x4a5014b1) != 0) { + continue; + } + this->searchQueue.tilesQueue[0] = _first; + this->searchQueue.yQueue[0] = _row; + DAT_TileMapState::instance.PathConnectionLayer[_first] = _areaID; + forceUpdate = 1; + for (int _readIndex = 0; _readIndex != forceUpdate; _readIndex = _readIndex + 1) { + this->zoneSizesArray[(ushort)_areaID] = this->zoneSizesArray[(ushort)_areaID] + 1; + int _tile = this->searchQueue.tilesQueue[_readIndex]; + int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; + int _cLink = DAT_TileMapState::instance.PathLinkageLayer[_tile]; + + MACRO_LINKAGE_EXPAND_AREA_NEIGHBOURS(1, forceUpdate) + } + _areaID = _areaID + 1; + if (999 < _areaID) { + break; + } + } + this->totalZones = (int)_areaID; + int* _zoneSize = this->zoneSizesArray + 2; + for (int _group = 333; _group != 0; _group = _group - 1) { + this->sum = _zoneSize[1] + this->sum + _zoneSize[-1] + *_zoneSize; + _zoneSize = _zoneSize + 3; + } + MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::updatePathLinkageTileMap, DAT_BuildingsState::ptr)(0); + return TRUE; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp new file mode 100644 index 0000000000..330c9da3b3 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp @@ -0,0 +1,174 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" + +#include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049E0D0 + void PathFindingState::updateUnitDeathHeatmapIn3SpacesAroundTile(uint x, uint y) + { + int _candidate1; + uint _tile; + if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile < 0x13a10) { + int _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int iVar2 = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (80400 < iVar2) { + this->searchQueue.currentDistance = iVar2; + return; + } + if (3 < iVar2) { + this->searchQueue.currentDistance = iVar2; + return; + } + this->searchQueue.currentDistance = iVar2; + if (DAT_TileMapState::instance.unitDeathHeatMap[_tile] < 250) { + this->searchQueue.currentDistance = (char)DAT_TileMapState::instance.CertainPathLayer[_tile]; + char cVar1 = DAT_TileMapState::instance.unitDeathHeatMap[_tile] + - (char)this->searchQueue.currentDistance; + DAT_TileMapState::instance.unitDeathHeatMap[_tile] = cVar1 + 4; + } + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + if ((DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) + != 0 + && (_candidate1 + = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile, + DAT_TileMapState::instance.WalkLayer[_candidate1] != this->searchGeneration)) { + /* + queue tiles walkable in that direction + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate1] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate1] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate1; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 1]) + != 0 + && (iVar2 + = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction + 1] + _tile, + DAT_TileMapState::instance.WalkLayer[iVar2] != this->searchGeneration)) { + DAT_TileMapState::instance.CertainPathLayer[iVar2] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar2] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar2; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 2]) + != 0 + && (iVar2 + = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction + 2] + _tile, + DAT_TileMapState::instance.WalkLayer[iVar2] != this->searchGeneration)) { + DAT_TileMapState::instance.CertainPathLayer[iVar2] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar2] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar2; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 3]) + != 0 + && (iVar2 + = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction + 3] + _tile, + DAT_TileMapState::instance.WalkLayer[iVar2] != this->searchGeneration)) { + DAT_TileMapState::instance.CertainPathLayer[iVar2] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar2] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar2; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return; + } + } + } + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp new file mode 100644 index 0000000000..235a8b4ab9 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -0,0 +1,155 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Location/Point8ShortXY.hpp" + +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + using OpenSHC::Map::Location::Point8ShortXY; + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x0049AAD0 + void PathFindingState::updateWalkAndPathLayer(int param_1, uint xPosition, uint yPosition) + { + short* psVar6; + int* piVar7; + int iVar8; + if (xPosition > 399 || yPosition > 399 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[yPosition * 400 + xPosition] == '\0') { + return; + } + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.readIndex = 0; + this->searchQueue.writeIndex = 1; + this->searchQueue.currentDistance = 1; + this->searchQueue.yQueue[0] = (short)yPosition; + this->searchQueue.xQueue[0] = (short)xPosition; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[yPosition].addXgetTile + xPosition; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + uint uVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (0x13a0f < uVar3) + break; + int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + iVar8 = (int)sVar1; + int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + if (iVar8 < this->mappingYRelated) { + this->mappingYRelated = iVar8; + } + if (this->yLimit < iVar8) { + this->yLimit = iVar8; + } + int iVar4 = (int)sVar2 / 10; + int iVar5 = iVar8 / 10; + *(undefined1*)(iVar4 + 0x1f93438 + iVar5 * 0x28) = 2; + if (iVar4 < DAT_TileMapState::instance.someYLike) { + DAT_TileMapState::instance.someYLike = iVar4; + } + if (DAT_TileMapState::instance.someYLikeLimit < iVar4) { + DAT_TileMapState::instance.someYLikeLimit = iVar4; + } + if (iVar5 < DAT_TileMapState::instance.someIndex) { + DAT_TileMapState::instance.someIndex = iVar5; + } + if (DAT_TileMapState::instance.someLimit < iVar5) { + DAT_TileMapState::instance.someLimit = iVar5; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar3]; + if (this->searchQueue.currentDistance > param_1) + break; + piVar7 = DAT_TileMapState::instance.directionTranslationMatrix[iVar8] + 1; + DAT_TileMapState::instance.ChangedLayer[uVar3] = 2; + psVar6 = &DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[0].short_.yOffset; + do { + iVar8 = (*(int (*)[8])(piVar7 + -1))[0] + uVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = ((Point8ShortXY*)(psVar6 + -2))->xOffset + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] = *psVar6 + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar8 = *piVar7 + uVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = psVar6[2] + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] = psVar6[4] + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar8 = piVar7[1] + uVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = psVar6[6] + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] = psVar6[8] + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + iVar8 = piVar7[2] + uVar3; + if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration + && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { + DAT_TileMapState::instance.CertainPathLayer[iVar8] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar8] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = psVar6[10] + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] = psVar6[0xc] + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + piVar7 = piVar7 + 4; + psVar6 = psVar6 + 0x10; + } while ((int)psVar6 < 0xb4908c); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } + DAT_TileMapState::instance.forceUpdateLogicalAndMiscDisplayLayers = 1; + DAT_TileMapState::instance.forceUpdateTextureTilemap = 1; + DAT_TileMapState::instance.forceUpdateGFXLayers = 1; + return; + } + + } +} +} diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp new file mode 100644 index 0000000000..1614a31778 --- /dev/null +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp @@ -0,0 +1,307 @@ +#include "../PathFindingState.func.hpp" + +#include "OpenSHC/IO/LowLevelMemory.func.hpp" +#include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" + +#include "OpenSHC/Globals/DAT_AICState.hpp" +#include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_TroopValueState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" + +namespace OpenSHC { +namespace Map { + namespace Navigation { + + /* + WARNING: Enum "MappersEnum": Some values do not have unique names + */ + /* + * Updates the WalkLayer and AI Path Cost Layer using breadth-first search (BFS). * This creates a distance + * map showing how far each tile is from AI zones. * The distance values are stored in the same layer that + * param_5 checks in the siege tent function. * * @param this - PathFindingState object pointer * + * @param param_1 - Maximum distance to calculate (distance limit) * @param param_2 - Target distance for + * candidate collection (0 = don't collect) * @param param_3 - Area/zone ID for navigation check * @param + * playerID - Current player's ID decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + // FUNCTION: STRONGHOLDCRUSADER 0x004A7090 + void PathFindingState::updateWalkLayerAndAIPathCostLayer( + int limit, uint borderDistance, dword fromArea, int playerID) + { + int _canNav; + short* psVar3; + int (*paiVar4)[8]; + uint _tile2; + /* + === PATHFINDING STATE INITIALIZATION === Increment active flag value for this search iteration + */ + this->searchGeneration = this->searchGeneration + 1; + /* + Reset flag and clear WalkLayer if exceeding threshold + */ + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + /* + === INITIALIZE BFS QUEUE === + */ + int _tile = 0; + /* + Starting distance + */ + this->searchQueue.currentDistance = 1; + /* + Read position + */ + this->searchQueue.readIndex = 0; + /* + Write position (empty queue) + */ + this->searchQueue.writeIndex = 0; + /* + Track maximum distance found + */ + this->distance = 0; + do { + /* + === SEED QUEUE WITH ALL AI ZONE TILES === Scan entire map (80400 tiles) and add all tiles marked as + AI zones (value 1) This is the "multi-source BFS" starting point Processing in batches of 5 tiles + for optimization Check tile at offset _tile + */ + if (DAT_TileMapState::instance.AIZoneLayer[_tile] == 1) { + /* + Get Y coordinate for this tile + */ + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile]; + /* + Add tile to queue + */ + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile; + /* + SET DISTANCE TO 1 FOR ALL AI ZONE TILES This is the SAME data structure that param_5 checks in + the siege tent function! + */ + /* + // Sets to 1 + */ + *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10) + * 0x13a10 + + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + = (char)this->searchQueue.currentDistance; + /* + Mark as visited + */ + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + = (short)this->searchGeneration; + /* + Increment queue write position + */ + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + /* + Repeat exact same logic for tiles _tile+1, _tile+2, _tile+3, _tile+4 (Unrolled loop for performance + - checking 5 tiles per iteration) + */ + if (DAT_TileMapState::instance.AIZoneLayer[_tile + 1] == 1) { + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 1]; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 1; + *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10) + * 0x13a10 + + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + = (char)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + = (short)this->searchGeneration; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if (DAT_TileMapState::instance.AIZoneLayer[_tile + 2] == 1) { + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 2]; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 2; + *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10) + * 0x13a10 + + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + = (char)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + = (short)this->searchGeneration; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if (DAT_TileMapState::instance.AIZoneLayer[_tile + 3] == 1) { + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 3]; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 3; + *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10) + * 0x13a10 + + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + = (char)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + = (short)this->searchGeneration; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if (DAT_TileMapState::instance.AIZoneLayer[_tile + 4] == 1) { + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 4]; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 4; + *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10) + * 0x13a10 + + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + = (char)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + = (short)this->searchGeneration; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + /* + Process all 80400 tiles (entire map) + */ + _tile = _tile + 5; + } while (_tile < 80400); + /* + === MAIN BFS LOOP === Expand outward from all AI zone tiles, calculating distances + */ + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + /* + Get current tile from queue + */ + _tile2 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + /* + Bounds check + */ + if (0x13a0f < _tile2) { + return; + } + /* + Get Y coordinate of current tile + */ + int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + /* + Read the distance value for this tile from the AI path cost layer + */ + this->searchQueue.currentDistance = (uint) + * (byte*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10) + * 0x13a10 + + 0x1ee2998 + _tile2); + /* + Track maximum distance encountered, constitutes extra return value + */ + if (this->distance < (int)this->searchQueue.currentDistance) { + this->distance = this->searchQueue.currentDistance; + } + /* + Stop if we've exceeded the maximum distance limit + */ + if (limit < (int)this->searchQueue.currentDistance) { + return; + } + /* + === COLLECT CANDIDATE TILES AT SPECIFIC DISTANCE === If param_2 is non-zero and tile is at + exactly that distance, and it's reachable from param_3 zone, add to candidate list + */ + if (borderDistance != 0 && this->searchQueue.currentDistance == borderDistance + && (_canNav = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: + calculateCanPlayerUnitsNavigateToAreaFromArea, + this)(playerID, (dword)((int)(fromArea)), + (dword)((int)((short)DAT_TileMapState::instance.PathConnectionLayer[_tile2])), 0), + _canNav != 0) + && DAT_AICState::instance.aiBorderTilesIndex < 1000) { + /* + Add to candidate array (likely used by AI for strategic placement decisions) + */ + DAT_AICState::instance.aiBorderTiles[DAT_AICState::instance.aiBorderTilesIndex].tile = _tile2; + DAT_AICState::instance.aiBorderTilesIndex = DAT_AICState::instance.aiBorderTilesIndex + 1; + } + /* + === EXPAND TO ADJACENT TILES === Only expand if tile doesn't have blocking terrain 0x100031 + checks for: sea, border, border edge, river + */ + if ((DAT_TileMapState::instance.LogicLayer[_tile2] & 0x100031U) == 0) { + /* + Get pointer to movement direction offsets + */ + paiVar4 = DAT_TileMapState::instance.directionTranslationMatrix + sVar1; + /* + Process all 8 adjacent tiles (cardinal + diagonal directions) + */ + psVar3 = &DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[0].short_.yOffset; + do { + /* + Calculate adjacent tile index + */ + int iVar2 = (*paiVar4)[0] + _tile2; + /* + If adjacent tile hasn't been visited this iteration + */ + if (DAT_TileMapState::instance.WalkLayer[iVar2] != this->searchGeneration) { + /* + SET DISTANCE = CURRENT DISTANCE + 1 This creates the distance map radiating from AI + zones + */ + *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + + playerID * 0x177bc + -0x10) + * 0x13a10 + + 0x1ee2998 + iVar2) = (char)this->searchQueue.currentDistance + '\x01'; + /* + previous line sets pathfinding cost layer Mark as visited + */ + DAT_TileMapState::instance.WalkLayer[iVar2] = (short)this->searchGeneration; + /* + Add adjacent tile to queue + */ + this->searchQueue.yQueue[this->searchQueue.writeIndex] = *psVar3 + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar2; + /* + Increment queue write position + */ + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + /* + Move to next direction + */ + psVar3 = psVar3 + 8; + paiVar4 = (int (*)[8])(*paiVar4 + 2); + /* + Process all 8 directions + */ + } while ((int)psVar3 < 0xb4908c); + } + /* + === ADVANCE TO NEXT TILE IN QUEUE === + */ + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } + return; + } + + } +} +} From e8d8a89b802c9e37a5b97da8e3c470ffe5cdf4a7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Wed, 14 Oct 2026 23:44:37 +0200 Subject: [PATCH 003/516] add status file --- status/addresses-SHC-3BB0A8C1.txt | 808 +++++++++++++++--------------- 1 file changed, 412 insertions(+), 396 deletions(-) diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 33114c519f..df8c72a642 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -381,15 +381,15 @@ SHC_3BB0A8C1_0x00400260 | 0.0% | Pending SHC_3BB0A8C1_0x00400288 | 0.0% | Pending -SHC_3BB0A8C1_0x00401000 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00401000 | 0.0% | Pending -SHC_3BB0A8C1_0x00401040 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00401040 | 0.0% | Pending -SHC_3BB0A8C1_0x00401060 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00401060 | 0.0% | Pending -SHC_3BB0A8C1_0x00401090 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00401090 | 0.0% | Pending -SHC_3BB0A8C1_0x004010B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004010B0 | 0.0% | Pending SHC_3BB0A8C1_0x004010E0 | 0.0% | Pending @@ -415,13 +415,13 @@ SHC_3BB0A8C1_0x004012F0 | 0.0% | Pending SHC_3BB0A8C1_0x00401380 | 0.0% | Pending -SHC_3BB0A8C1_0x00401400 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00401400 | 0.0% | Pending -SHC_3BB0A8C1_0x00401430 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00401430 | 0.0% | Pending SHC_3BB0A8C1_0x00401460 | 0.0% | Pending -SHC_3BB0A8C1_0x00401540 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00401540 | 0.0% | Pending SHC_3BB0A8C1_0x00401570 | 0.0% | Pending @@ -445,11 +445,11 @@ SHC_3BB0A8C1_0x004019D0 | 0.0% | Pending SHC_3BB0A8C1_0x00401A50 | 0.0% | Pending -SHC_3BB0A8C1_0x00401AE0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00401AE0 | 0.0% | Pending SHC_3BB0A8C1_0x00401B20 | 0.0% | Pending -SHC_3BB0A8C1_0x00401B60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00401B60 | 0.0% | Pending SHC_3BB0A8C1_0x00401BA0 | 0.0% | Pending @@ -503,7 +503,7 @@ SHC_3BB0A8C1_0x00402A18 | 0.0% | Pending SHC_3BB0A8C1_0x00402A20 | 0.0% | Pending -SHC_3BB0A8C1_0x00402AB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00402AB0 | 0.0% | Pending SHC_3BB0A8C1_0x00402AE0 | 0.0% | Pending @@ -531,7 +531,7 @@ SHC_3BB0A8C1_0x004036F0 | 0.0% | Pending SHC_3BB0A8C1_0x00403790 | 0.0% | Pending -SHC_3BB0A8C1_0x004038A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004038A0 | 0.0% | Pending SHC_3BB0A8C1_0x004038B0 | 0.0% | Pending @@ -539,9 +539,9 @@ SHC_3BB0A8C1_0x00403900 | 0.0% | Pending SHC_3BB0A8C1_0x00403980 | 0.0% | Pending -SHC_3BB0A8C1_0x004039B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004039B0 | 0.0% | Pending -SHC_3BB0A8C1_0x004039F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004039F0 | 0.0% | Pending SHC_3BB0A8C1_0x00403A20 | 0.0% | Pending @@ -2347,9 +2347,9 @@ SHC_3BB0A8C1_0x00406900 | 0.0% | Pending SHC_3BB0A8C1_0x00406FD0 | 0.0% | Pending -SHC_3BB0A8C1_0x00407130 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00407130 | 0.0% | Pending -SHC_3BB0A8C1_0x00407160 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00407160 | 0.0% | Pending SHC_3BB0A8C1_0x00407190 | 0.0% | Pending @@ -2597,11 +2597,11 @@ SHC_3BB0A8C1_0x00409200 | 0.0% | Pending SHC_3BB0A8C1_0x004092B0 | 0.0% | Pending -SHC_3BB0A8C1_0x004092C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004092C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004092E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004092E0 | 0.0% | Pending -SHC_3BB0A8C1_0x00409300 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00409300 | 0.0% | Pending SHC_3BB0A8C1_0x00409330 | 0.0% | Pending @@ -5543,15 +5543,15 @@ SHC_3BB0A8C1_0x00417B90 | 0.0% | Pending SHC_3BB0A8C1_0x00417FD0 | 0.0% | Pending -SHC_3BB0A8C1_0x004180E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004180E0 | 0.0% | Pending SHC_3BB0A8C1_0x00418100 | 0.0% | Pending -SHC_3BB0A8C1_0x004184A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004184A0 | 0.0% | Pending -SHC_3BB0A8C1_0x004184D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004184D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00418500 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00418500 | 0.0% | Pending SHC_3BB0A8C1_0x00418530 | 0.0% | Pending @@ -5559,9 +5559,9 @@ SHC_3BB0A8C1_0x00418640 | 0.0% | Pending SHC_3BB0A8C1_0x00418740 | 0.0% | Pending -SHC_3BB0A8C1_0x00418880 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00418880 | 0.0% | Pending -SHC_3BB0A8C1_0x004188C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004188C0 | 0.0% | Pending SHC_3BB0A8C1_0x00418900 | 0.0% | Pending @@ -5575,7 +5575,7 @@ SHC_3BB0A8C1_0x00418C80 | 0.0% | Pending SHC_3BB0A8C1_0x00418EC0 | 0.0% | Pending -SHC_3BB0A8C1_0x00418F70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00418F70 | 0.0% | Pending SHC_3BB0A8C1_0x00418F90 | 0.0% | Pending @@ -5585,7 +5585,7 @@ SHC_3BB0A8C1_0x00419190 | 0.0% | Pending SHC_3BB0A8C1_0x00419290 | 0.0% | Pending -SHC_3BB0A8C1_0x00419340 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00419340 | 0.0% | Pending SHC_3BB0A8C1_0x00419370 | 0.0% | Pending @@ -5817,13 +5817,13 @@ SHC_3BB0A8C1_0x00419EB0 | 0.0% | Pending SHC_3BB0A8C1_0x00419FA0 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A060 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A060 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A0A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A0A0 | 0.0% | Pending SHC_3BB0A8C1_0x0041A0B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A0D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A0D0 | 0.0% | Pending SHC_3BB0A8C1_0x0041A100 | 0.0% | Pending @@ -6043,17 +6043,17 @@ SHC_3BB0A8C1_0x0041A2AE | 0.0% | Pending SHC_3BB0A8C1_0x0041A2AF | 0.0% | Pending -SHC_3BB0A8C1_0x0041A2B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A2B0 | 0.0% | Pending SHC_3BB0A8C1_0x0041A2E0 | 0.0% | Pending SHC_3BB0A8C1_0x0041A340 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A390 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A390 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A3C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A3C0 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A3F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A3F0 | 0.0% | Pending SHC_3BB0A8C1_0x0041A420 | 0.0% | Pending @@ -6061,17 +6061,17 @@ SHC_3BB0A8C1_0x0041A460 | 0.0% | Pending SHC_3BB0A8C1_0x0041A520 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A5C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A5C0 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A5F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A5F0 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A620 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A620 | 0.0% | Pending SHC_3BB0A8C1_0x0041A650 | 0.0% | Pending SHC_3BB0A8C1_0x0041A680 | 0.0% | Pending -SHC_3BB0A8C1_0x0041A710 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0041A710 | 0.0% | Pending SHC_3BB0A8C1_0x0041A740 | 100.0% | Reimplemented @@ -6657,13 +6657,13 @@ SHC_3BB0A8C1_0x00424680 | 0.0% | Pending SHC_3BB0A8C1_0x004246B0 | 0.0% | Pending -SHC_3BB0A8C1_0x004246E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004246E0 | 0.0% | Pending SHC_3BB0A8C1_0x00424700 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00424720 | 0.0% | Pending -SHC_3BB0A8C1_0x00424770 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00424770 | 0.0% | Pending SHC_3BB0A8C1_0x004247A0 | 0.0% | Pending @@ -6675,7 +6675,7 @@ SHC_3BB0A8C1_0x00424AD0 | 0.0% | Pending SHC_3BB0A8C1_0x00424B10 | 0.0% | Pending -SHC_3BB0A8C1_0x00424BD0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00424BD0 | 0.0% | Pending SHC_3BB0A8C1_0x00424BE0 | 0.0% | Pending @@ -6769,7 +6769,7 @@ SHC_3BB0A8C1_0x00426570 | 0.0% | Pending SHC_3BB0A8C1_0x00426600 | 0.0% | Pending -SHC_3BB0A8C1_0x004266A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004266A0 | 0.0% | Pending SHC_3BB0A8C1_0x004266E0 | 0.0% | Pending @@ -6793,7 +6793,7 @@ SHC_3BB0A8C1_0x00426D30 | 0.0% | Pending SHC_3BB0A8C1_0x00426ED0 | 0.0% | Pending -SHC_3BB0A8C1_0x00426F80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00426F80 | 0.0% | Pending SHC_3BB0A8C1_0x00426FB0 | 0.0% | Pending @@ -6803,9 +6803,9 @@ SHC_3BB0A8C1_0x00427110 | 0.0% | Pending SHC_3BB0A8C1_0x00427180 | 0.0% | Pending -SHC_3BB0A8C1_0x004271E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004271E0 | 0.0% | Pending -SHC_3BB0A8C1_0x00427210 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00427210 | 0.0% | Pending SHC_3BB0A8C1_0x00427240 | 0.0% | Pending @@ -6867,7 +6867,7 @@ SHC_3BB0A8C1_0x00428480 | 0.0% | Pending SHC_3BB0A8C1_0x00428590 | 0.0% | Pending -SHC_3BB0A8C1_0x004285C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004285C0 | 0.0% | Pending SHC_3BB0A8C1_0x004285F0 | 0.0% | Pending @@ -6891,7 +6891,7 @@ SHC_3BB0A8C1_0x00428A60 | 0.0% | Pending SHC_3BB0A8C1_0x00428AC0 | 0.0% | Pending -SHC_3BB0A8C1_0x00429630 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00429630 | 0.0% | Pending SHC_3BB0A8C1_0x00429650 | 0.0% | Pending @@ -6973,9 +6973,9 @@ SHC_3BB0A8C1_0x0042AC34 | 0.0% | Pending SHC_3BB0A8C1_0x0042AC38 | 0.0% | Pending -SHC_3BB0A8C1_0x0042AC40 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0042AC40 | 0.0% | Pending -SHC_3BB0A8C1_0x0042AC60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0042AC60 | 0.0% | Pending SHC_3BB0A8C1_0x0042AC70 | 0.0% | Pending @@ -7443,7 +7443,7 @@ SHC_3BB0A8C1_0x0042B960 | 0.0% | Pending SHC_3BB0A8C1_0x0042BA50 | 0.0% | Pending -SHC_3BB0A8C1_0x0042BB70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0042BB70 | 0.0% | Pending SHC_3BB0A8C1_0x0042BB90 | 0.0% | Pending @@ -7453,7 +7453,7 @@ SHC_3BB0A8C1_0x0042BF00 | 0.0% | Pending SHC_3BB0A8C1_0x0042BFC0 | 0.0% | Pending -SHC_3BB0A8C1_0x0042C060 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0042C060 | 0.0% | Pending SHC_3BB0A8C1_0x0042C090 | 0.0% | Pending @@ -8719,7 +8719,7 @@ SHC_3BB0A8C1_0x0042EF78 | 0.0% | Pending SHC_3BB0A8C1_0x0042EF80 | 0.0% | Pending -SHC_3BB0A8C1_0x0042EFE0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0042EFE0 | 0.0% | Pending SHC_3BB0A8C1_0x0042F010 | 0.0% | Pending @@ -8741,7 +8741,7 @@ SHC_3BB0A8C1_0x0042F3BC | 0.0% | Pending SHC_3BB0A8C1_0x0042F3C0 | 0.0% | Pending -SHC_3BB0A8C1_0x0042F3D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0042F3D0 | 0.0% | Pending SHC_3BB0A8C1_0x0042F3F0 | 0.0% | Pending @@ -9163,7 +9163,7 @@ SHC_3BB0A8C1_0x0042F940 | 0.0% | Pending SHC_3BB0A8C1_0x0042FA10 | 0.0% | Pending -SHC_3BB0A8C1_0x0042FAA0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0042FAA0 | 0.0% | Pending SHC_3BB0A8C1_0x0042FAC0 | 0.0% | Pending @@ -10535,7 +10535,7 @@ SHC_3BB0A8C1_0x00430BF0 | 0.0% | Pending SHC_3BB0A8C1_0x00430CB8 | 0.0% | Pending -SHC_3BB0A8C1_0x00430CC0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00430CC0 | 0.0% | Pending SHC_3BB0A8C1_0x00430CE0 | 0.0% | Pending @@ -11083,9 +11083,9 @@ SHC_3BB0A8C1_0x00431B60 | 0.0% | Pending SHC_3BB0A8C1_0x00433030 | 0.0% | Pending -SHC_3BB0A8C1_0x00433200 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00433200 | 0.0% | Pending -SHC_3BB0A8C1_0x00433230 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00433230 | 0.0% | Pending SHC_3BB0A8C1_0x00433260 | 0.0% | Pending @@ -11099,7 +11099,7 @@ SHC_3BB0A8C1_0x00433558 | 0.0% | Pending SHC_3BB0A8C1_0x0043355C | 0.0% | Pending -SHC_3BB0A8C1_0x00433560 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00433560 | 0.0% | Pending SHC_3BB0A8C1_0x004335A0 | 0.0% | Pending @@ -11135,9 +11135,9 @@ SHC_3BB0A8C1_0x00434224 | 0.0% | Pending SHC_3BB0A8C1_0x00434228 | 0.0% | Pending -SHC_3BB0A8C1_0x00434230 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00434230 | 0.0% | Pending -SHC_3BB0A8C1_0x00434260 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00434260 | 0.0% | Pending SHC_3BB0A8C1_0x00434270 | 0.0% | Pending @@ -13357,7 +13357,7 @@ SHC_3BB0A8C1_0x0043937C | 0.0% | Pending SHC_3BB0A8C1_0x00439380 | 0.0% | Pending -SHC_3BB0A8C1_0x00439390 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00439390 | 0.0% | Pending SHC_3BB0A8C1_0x004393C0 | 0.0% | Pending @@ -13389,19 +13389,19 @@ SHC_3BB0A8C1_0x00439724 | 0.0% | Pending SHC_3BB0A8C1_0x00439730 | 0.0% | Pending -SHC_3BB0A8C1_0x00439890 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00439890 | 0.0% | Pending SHC_3BB0A8C1_0x004398B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0043A850 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0043A850 | 0.0% | Pending -SHC_3BB0A8C1_0x0043A860 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0043A860 | 0.0% | Pending -SHC_3BB0A8C1_0x0043A880 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0043A880 | 0.0% | Pending -SHC_3BB0A8C1_0x0043A8C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0043A8C0 | 0.0% | Pending -SHC_3BB0A8C1_0x0043A8D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0043A8D0 | 0.0% | Pending SHC_3BB0A8C1_0x0043A8E0 | 0.0% | Pending @@ -13595,9 +13595,9 @@ SHC_3BB0A8C1_0x0043E5F0 | 0.0% | Pending SHC_3BB0A8C1_0x0043E6C0 | 0.0% | Pending -SHC_3BB0A8C1_0x0043F2B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0043F2B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0043F2C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0043F2C0 | 0.0% | Pending SHC_3BB0A8C1_0x0043F2F0 | 0.0% | Pending @@ -13611,9 +13611,9 @@ SHC_3BB0A8C1_0x0043FBB0 | 0.0% | Pending SHC_3BB0A8C1_0x0043FBF0 | 0.0% | Pending -SHC_3BB0A8C1_0x0043FC80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0043FC80 | 0.0% | Pending -SHC_3BB0A8C1_0x0043FCA0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0043FCA0 | 0.0% | Pending SHC_3BB0A8C1_0x0043FCB0 | 0.0% | Pending @@ -13631,13 +13631,13 @@ SHC_3BB0A8C1_0x00440280 | 0.0% | Pending SHC_3BB0A8C1_0x00440360 | 0.0% | Pending -SHC_3BB0A8C1_0x004403D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004403D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00440400 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00440400 | 0.0% | Pending -SHC_3BB0A8C1_0x00440410 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00440410 | 0.0% | Pending -SHC_3BB0A8C1_0x00440420 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00440420 | 0.0% | Pending SHC_3BB0A8C1_0x00440430 | 0.0% | Pending @@ -16649,11 +16649,11 @@ SHC_3BB0A8C1_0x0044A720 | 100.0% | Reimplemented SHC_3BB0A8C1_0x0044A830 | 0.0% | Pending -SHC_3BB0A8C1_0x0044AA70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044AA70 | 0.0% | Pending -SHC_3BB0A8C1_0x0044AA80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044AA80 | 0.0% | Pending -SHC_3BB0A8C1_0x0044AAA0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044AAA0 | 0.0% | Pending SHC_3BB0A8C1_0x0044AAB0 | 100.0% | Reimplemented @@ -16867,7 +16867,7 @@ SHC_3BB0A8C1_0x0044B680 | 0.0% | Pending SHC_3BB0A8C1_0x0044B760 | 0.0% | Pending -SHC_3BB0A8C1_0x0044B7D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044B7D0 | 0.0% | Pending SHC_3BB0A8C1_0x0044B800 | 0.0% | Pending @@ -16915,17 +16915,17 @@ SHC_3BB0A8C1_0x0044CBE0 | 0.0% | Pending SHC_3BB0A8C1_0x0044CC30 | 0.0% | Pending -SHC_3BB0A8C1_0x0044CCA0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044CCA0 | 0.0% | Pending -SHC_3BB0A8C1_0x0044CCC0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044CCC0 | 0.0% | Pending -SHC_3BB0A8C1_0x0044CCD0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044CCD0 | 0.0% | Pending -SHC_3BB0A8C1_0x0044CCF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044CCF0 | 0.0% | Pending -SHC_3BB0A8C1_0x0044CD10 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044CD10 | 0.0% | Pending -SHC_3BB0A8C1_0x0044CD30 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0044CD30 | 0.0% | Pending SHC_3BB0A8C1_0x0044CD40 | 0.0% | Pending @@ -16979,15 +16979,15 @@ SHC_3BB0A8C1_0x00454700 | 0.0% | Pending SHC_3BB0A8C1_0x004547C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004548D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004548D0 | 0.0% | Pending SHC_3BB0A8C1_0x00454900 | 0.0% | Pending -SHC_3BB0A8C1_0x00454960 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00454960 | 0.0% | Pending -SHC_3BB0A8C1_0x00454990 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00454990 | 0.0% | Pending -SHC_3BB0A8C1_0x004549C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004549C0 | 0.0% | Pending SHC_3BB0A8C1_0x004549F0 | 0.0% | Pending @@ -16999,21 +16999,21 @@ SHC_3BB0A8C1_0x00454CE0 | 0.0% | Pending SHC_3BB0A8C1_0x00454D20 | 0.0% | Pending -SHC_3BB0A8C1_0x00454EE0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00454EE0 | 0.0% | Pending -SHC_3BB0A8C1_0x00454EF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00454EF0 | 0.0% | Pending SHC_3BB0A8C1_0x00454F00 | 0.0% | Pending SHC_3BB0A8C1_0x00455050 | 0.0% | Pending -SHC_3BB0A8C1_0x00455250 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00455250 | 0.0% | Pending -SHC_3BB0A8C1_0x00455270 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00455270 | 0.0% | Pending SHC_3BB0A8C1_0x00455290 | 0.0% | Pending -SHC_3BB0A8C1_0x004552E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004552E0 | 0.0% | Pending SHC_3BB0A8C1_0x00455300 | 0.0% | Pending @@ -17045,7 +17045,7 @@ SHC_3BB0A8C1_0x00455E40 | 0.0% | Pending SHC_3BB0A8C1_0x004560F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004563B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004563B0 | 0.0% | Pending SHC_3BB0A8C1_0x004563D0 | 0.0% | Pending @@ -17669,7 +17669,7 @@ SHC_3BB0A8C1_0x00457A70 | 0.0% | Pending SHC_3BB0A8C1_0x00457AD0 | 0.0% | Pending -SHC_3BB0A8C1_0x00457B40 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00457B40 | 0.0% | Pending SHC_3BB0A8C1_0x00457B80 | 0.0% | Pending @@ -17693,15 +17693,15 @@ SHC_3BB0A8C1_0x004585B0 | 0.0% | Pending SHC_3BB0A8C1_0x004585F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004586D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004586D0 | 0.0% | Pending SHC_3BB0A8C1_0x004586F0 | 0.0% | Pending -SHC_3BB0A8C1_0x00458700 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00458700 | 0.0% | Pending SHC_3BB0A8C1_0x00458720 | 0.0% | Pending -SHC_3BB0A8C1_0x00458740 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00458740 | 0.0% | Pending SHC_3BB0A8C1_0x00458760 | 0.0% | Pending @@ -17713,13 +17713,13 @@ SHC_3BB0A8C1_0x00458820 | 0.0% | Pending SHC_3BB0A8C1_0x00458840 | 0.0% | Pending -SHC_3BB0A8C1_0x00458890 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00458890 | 0.0% | Pending SHC_3BB0A8C1_0x004588A0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004588D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004588D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004588F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004588F0 | 0.0% | Pending SHC_3BB0A8C1_0x00458910 | 100.0% | Reimplemented @@ -17757,11 +17757,11 @@ SHC_3BB0A8C1_0x00458F70 | 0.0% | Pending SHC_3BB0A8C1_0x00459080 | 0.0% | Pending -SHC_3BB0A8C1_0x00459140 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00459140 | 0.0% | Pending -SHC_3BB0A8C1_0x00459170 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00459170 | 0.0% | Pending -SHC_3BB0A8C1_0x004591B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004591B0 | 0.0% | Pending SHC_3BB0A8C1_0x004591F0 | 0.0% | Pending @@ -17889,7 +17889,7 @@ SHC_3BB0A8C1_0x004595D0 | 0.0% | Pending SHC_3BB0A8C1_0x00459640 | 0.0% | Pending -SHC_3BB0A8C1_0x004596D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004596D0 | 0.0% | Pending SHC_3BB0A8C1_0x00459700 | 0.0% | Pending @@ -17907,9 +17907,9 @@ SHC_3BB0A8C1_0x00459A40 | 0.0% | Pending SHC_3BB0A8C1_0x00459B50 | 0.0% | Pending -SHC_3BB0A8C1_0x00459BB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00459BB0 | 0.0% | Pending -SHC_3BB0A8C1_0x00459BE0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00459BE0 | 0.0% | Pending SHC_3BB0A8C1_0x00459BF0 | 0.0% | Pending @@ -18025,7 +18025,7 @@ SHC_3BB0A8C1_0x0045AE70 | 0.0% | Pending SHC_3BB0A8C1_0x0045AEB0 | 0.0% | Pending -SHC_3BB0A8C1_0x0045AF00 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0045AF00 | 0.0% | Pending SHC_3BB0A8C1_0x0045AF30 | 0.0% | Pending @@ -18035,13 +18035,13 @@ SHC_3BB0A8C1_0x0045B3A0 | 0.0% | Pending SHC_3BB0A8C1_0x0045B3E0 | 0.0% | Pending -SHC_3BB0A8C1_0x0045B460 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0045B460 | 0.0% | Pending SHC_3BB0A8C1_0x0045B4A0 | 0.0% | Pending SHC_3BB0A8C1_0x0045B6B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0045B7F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0045B7F0 | 0.0% | Pending SHC_3BB0A8C1_0x0045B830 | 0.0% | Pending @@ -18145,11 +18145,11 @@ SHC_3BB0A8C1_0x0045CA20 | 0.0% | Pending SHC_3BB0A8C1_0x0045CD10 | 0.0% | Pending -SHC_3BB0A8C1_0x0045D060 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0045D060 | 0.0% | Pending SHC_3BB0A8C1_0x0045D080 | 0.0% | Pending -SHC_3BB0A8C1_0x0045D0B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0045D0B0 | 0.0% | Pending SHC_3BB0A8C1_0x0045D0C0 | 0.0% | Pending @@ -18747,7 +18747,7 @@ SHC_3BB0A8C1_0x0045F0CD | 0.0% | Pending SHC_3BB0A8C1_0x0045F0D0 | 0.0% | Pending -SHC_3BB0A8C1_0x0045F120 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0045F120 | 0.0% | Pending SHC_3BB0A8C1_0x0045F130 | 0.0% | Pending @@ -19153,7 +19153,7 @@ SHC_3BB0A8C1_0x00462FE0 | 0.0% | Pending SHC_3BB0A8C1_0x00462FF0 | 0.0% | Pending -SHC_3BB0A8C1_0x004630B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004630B0 | 0.0% | Pending SHC_3BB0A8C1_0x004630D0 | 0.0% | Pending @@ -19843,11 +19843,11 @@ SHC_3BB0A8C1_0x00464856 | 0.0% | Pending SHC_3BB0A8C1_0x00464860 | 0.0% | Pending -SHC_3BB0A8C1_0x004649C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004649C0 | 0.0% | Pending SHC_3BB0A8C1_0x004649D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00464D90 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00464D90 | 0.0% | Pending SHC_3BB0A8C1_0x00464DA0 | 0.0% | Pending @@ -19857,19 +19857,19 @@ SHC_3BB0A8C1_0x00464EF0 | 0.0% | Pending SHC_3BB0A8C1_0x00465040 | 0.0% | Pending -SHC_3BB0A8C1_0x00465080 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00465080 | 0.0% | Pending -SHC_3BB0A8C1_0x004650A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004650A0 | 0.0% | Pending -SHC_3BB0A8C1_0x004650C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004650C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004650F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004650F0 | 0.0% | Pending SHC_3BB0A8C1_0x00465110 | 0.0% | Pending SHC_3BB0A8C1_0x00465200 | 0.0% | Pending -SHC_3BB0A8C1_0x004652A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004652A0 | 0.0% | Pending SHC_3BB0A8C1_0x004652D0 | 0.0% | Pending @@ -19905,15 +19905,15 @@ SHC_3BB0A8C1_0x00465700 | 0.0% | Pending SHC_3BB0A8C1_0x004657B0 | 0.0% | Pending -SHC_3BB0A8C1_0x00465800 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00465800 | 0.0% | Pending SHC_3BB0A8C1_0x00465820 | 0.0% | Pending -SHC_3BB0A8C1_0x00465890 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00465890 | 0.0% | Pending SHC_3BB0A8C1_0x004658B0 | 0.0% | Pending -SHC_3BB0A8C1_0x00465920 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00465920 | 0.0% | Pending SHC_3BB0A8C1_0x00465950 | 0.0% | Pending @@ -19929,7 +19929,7 @@ SHC_3BB0A8C1_0x00465F20 | 0.0% | Pending SHC_3BB0A8C1_0x00465F90 | 0.0% | Pending -SHC_3BB0A8C1_0x004660B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004660B0 | 0.0% | Pending SHC_3BB0A8C1_0x004660F0 | 0.0% | Pending @@ -19945,7 +19945,7 @@ SHC_3BB0A8C1_0x00466480 | 0.0% | Pending SHC_3BB0A8C1_0x00466620 | 0.0% | Pending -SHC_3BB0A8C1_0x00466710 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00466710 | 0.0% | Pending SHC_3BB0A8C1_0x00466730 | 0.0% | Pending @@ -19975,9 +19975,9 @@ SHC_3BB0A8C1_0x004668E0 | 0.0% | Pending SHC_3BB0A8C1_0x004668E4 | 0.0% | Pending -SHC_3BB0A8C1_0x004668F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004668F0 | 0.0% | Pending -SHC_3BB0A8C1_0x00466920 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00466920 | 0.0% | Pending SHC_3BB0A8C1_0x00466950 | 0.0% | Pending @@ -19987,9 +19987,9 @@ SHC_3BB0A8C1_0x00466C20 | 0.0% | Pending SHC_3BB0A8C1_0x00466D10 | 0.0% | Pending -SHC_3BB0A8C1_0x00466E00 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00466E00 | 0.0% | Pending -SHC_3BB0A8C1_0x00466E10 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00466E10 | 0.0% | Pending SHC_3BB0A8C1_0x00466E20 | 0.0% | Pending @@ -20051,7 +20051,7 @@ SHC_3BB0A8C1_0x00467E04 | 0.0% | Pending SHC_3BB0A8C1_0x00467E26 | 0.0% | Pending -SHC_3BB0A8C1_0x00467E40 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00467E40 | 0.0% | Pending SHC_3BB0A8C1_0x00467E50 | 0.0% | Pending @@ -20059,31 +20059,31 @@ SHC_3BB0A8C1_0x00467EC0 | 0.0% | Pending SHC_3BB0A8C1_0x00467F50 | 0.0% | Pending -SHC_3BB0A8C1_0x00467F60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00467F60 | 0.0% | Pending -SHC_3BB0A8C1_0x00467F80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00467F80 | 0.0% | Pending -SHC_3BB0A8C1_0x00468030 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00468030 | 0.0% | Pending -SHC_3BB0A8C1_0x004680B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004680B0 | 0.0% | Pending -SHC_3BB0A8C1_0x004680C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004680C0 | 0.0% | Pending -SHC_3BB0A8C1_0x00468100 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00468100 | 0.0% | Pending -SHC_3BB0A8C1_0x00468370 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00468370 | 0.0% | Pending -SHC_3BB0A8C1_0x00468420 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00468420 | 0.0% | Pending -SHC_3BB0A8C1_0x004684D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004684D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00468590 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00468590 | 0.0% | Pending -SHC_3BB0A8C1_0x004685C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004685C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004687F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004687F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004689D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004689D0 | 0.0% | Pending SHC_3BB0A8C1_0x00468A10 | 100.0% | Reimplemented @@ -20097,7 +20097,7 @@ SHC_3BB0A8C1_0x00468C30 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00468C40 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x00468C50 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00468C50 | 0.0% | Pending SHC_3BB0A8C1_0x00468C80 | 0.0% | Pending @@ -20149,19 +20149,19 @@ SHC_3BB0A8C1_0x00469980 | 0.0% | Pending SHC_3BB0A8C1_0x004699E0 | 0.0% | Pending -SHC_3BB0A8C1_0x00469A30 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00469A30 | 0.0% | Pending -SHC_3BB0A8C1_0x00469A70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00469A70 | 0.0% | Pending SHC_3BB0A8C1_0x00469AD0 | 0.0% | Pending -SHC_3BB0A8C1_0x00469B90 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00469B90 | 0.0% | Pending SHC_3BB0A8C1_0x00469BE0 | 0.0% | Pending -SHC_3BB0A8C1_0x00469C40 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00469C40 | 0.0% | Pending -SHC_3BB0A8C1_0x00469E10 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00469E10 | 0.0% | Pending SHC_3BB0A8C1_0x00469E70 | 0.0% | Pending @@ -20729,25 +20729,25 @@ SHC_3BB0A8C1_0x0046AE80 | 100.0% | Reimplemented SHC_3BB0A8C1_0x0046AEC0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x0046B080 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046B080 | 0.0% | Pending -SHC_3BB0A8C1_0x0046B0D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046B0D0 | 0.0% | Pending -SHC_3BB0A8C1_0x0046B110 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046B110 | 0.0% | Pending -SHC_3BB0A8C1_0x0046B140 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046B140 | 0.0% | Pending -SHC_3BB0A8C1_0x0046B170 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046B170 | 0.0% | Pending -SHC_3BB0A8C1_0x0046B1B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046B1B0 | 0.0% | Pending SHC_3BB0A8C1_0x0046B1F0 | 0.0% | Pending -SHC_3BB0A8C1_0x0046B2F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046B2F0 | 0.0% | Pending -SHC_3BB0A8C1_0x0046B300 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046B300 | 0.0% | Pending -SHC_3BB0A8C1_0x0046B320 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046B320 | 0.0% | Pending SHC_3BB0A8C1_0x0046B340 | 0.0% | Pending @@ -20893,7 +20893,7 @@ SHC_3BB0A8C1_0x0046BBD0 | 0.0% | Pending SHC_3BB0A8C1_0x0046BC90 | 0.0% | Pending -SHC_3BB0A8C1_0x0046BD20 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046BD20 | 0.0% | Pending SHC_3BB0A8C1_0x0046BD50 | 0.0% | Pending @@ -20945,7 +20945,7 @@ SHC_3BB0A8C1_0x0046CAA0 | 0.0% | Pending SHC_3BB0A8C1_0x0046CC80 | 0.0% | Pending -SHC_3BB0A8C1_0x0046CCD0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046CCD0 | 0.0% | Pending SHC_3BB0A8C1_0x0046CD30 | 100.0% | Reimplemented @@ -20967,11 +20967,11 @@ SHC_3BB0A8C1_0x0046CEAC | 0.0% | Pending SHC_3BB0A8C1_0x0046CEB0 | 0.0% | Pending -SHC_3BB0A8C1_0x0046CEC0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046CEC0 | 0.0% | Pending -SHC_3BB0A8C1_0x0046CED0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046CED0 | 0.0% | Pending -SHC_3BB0A8C1_0x0046CEF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046CEF0 | 0.0% | Pending SHC_3BB0A8C1_0x0046CF10 | 0.0% | Pending @@ -21201,7 +21201,7 @@ SHC_3BB0A8C1_0x0046F690 | 0.0% | Pending SHC_3BB0A8C1_0x0046F6B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0046F730 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0046F730 | 0.0% | Pending SHC_3BB0A8C1_0x0046F750 | 0.0% | Pending @@ -21257,13 +21257,13 @@ SHC_3BB0A8C1_0x004707F0 | 0.0% | Pending SHC_3BB0A8C1_0x004708F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004709B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004709B0 | 0.0% | Pending -SHC_3BB0A8C1_0x00470A00 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00470A00 | 0.0% | Pending -SHC_3BB0A8C1_0x00470B30 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00470B30 | 0.0% | Pending -SHC_3BB0A8C1_0x00470BC0 | 100.0% | Reimplemented, requires SHC_3BB0A8C1_0x0046CCD0 to be active +SHC_3BB0A8C1_0x00470BC0 | 0.0% | Pending SHC_3BB0A8C1_0x00470E90 | 0.0% | Pending @@ -21293,9 +21293,9 @@ SHC_3BB0A8C1_0x00471570 | 0.0% | Pending SHC_3BB0A8C1_0x004715A0 | 0.0% | Pending -SHC_3BB0A8C1_0x00471610 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00471610 | 0.0% | Pending -SHC_3BB0A8C1_0x00471670 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00471670 | 0.0% | Pending SHC_3BB0A8C1_0x00471690 | 0.0% | Pending @@ -21327,11 +21327,11 @@ SHC_3BB0A8C1_0x004718C0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004718F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004719E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004719E0 | 0.0% | Pending SHC_3BB0A8C1_0x00471A00 | 0.0% | Pending -SHC_3BB0A8C1_0x00471A80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00471A80 | 0.0% | Pending SHC_3BB0A8C1_0x00471AA0 | 0.0% | Pending @@ -21415,7 +21415,7 @@ SHC_3BB0A8C1_0x00472950 | 0.0% | Pending SHC_3BB0A8C1_0x004729B0 | 0.0% | Pending -SHC_3BB0A8C1_0x00472A90 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00472A90 | 0.0% | Pending SHC_3BB0A8C1_0x00472B20 | 0.0% | Pending @@ -21429,21 +21429,21 @@ SHC_3BB0A8C1_0x00472CB0 | 0.0% | Pending SHC_3BB0A8C1_0x00472D00 | 0.0% | Pending -SHC_3BB0A8C1_0x00472D60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00472D60 | 0.0% | Pending SHC_3BB0A8C1_0x00472DD0 | 0.0% | Pending -SHC_3BB0A8C1_0x00472EF0 | 55.0% | Severe Register Issues, seem functional, but can not be considered done +SHC_3BB0A8C1_0x00472EF0 | 0.0% | Pending -SHC_3BB0A8C1_0x00473300 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00473300 | 0.0% | Pending -SHC_3BB0A8C1_0x004733A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004733A0 | 0.0% | Pending -SHC_3BB0A8C1_0x00473640 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00473640 | 0.0% | Pending -SHC_3BB0A8C1_0x004737B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004737B0 | 0.0% | Pending -SHC_3BB0A8C1_0x00473830 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00473830 | 0.0% | Pending SHC_3BB0A8C1_0x00473870 | 0.0% | Pending @@ -22307,7 +22307,7 @@ SHC_3BB0A8C1_0x0047D0D8 | 0.0% | Pending SHC_3BB0A8C1_0x0047D0DC | 0.0% | Pending -SHC_3BB0A8C1_0x0047D0E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0047D0E0 | 0.0% | Pending SHC_3BB0A8C1_0x0047D100 | 0.0% | Pending @@ -22327,7 +22327,7 @@ SHC_3BB0A8C1_0x0047D3DC | 0.0% | Pending SHC_3BB0A8C1_0x0047D3E0 | 0.0% | Pending -SHC_3BB0A8C1_0x0047D3F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0047D3F0 | 0.0% | Pending SHC_3BB0A8C1_0x0047D410 | 0.0% | Pending @@ -22373,9 +22373,9 @@ SHC_3BB0A8C1_0x0047E5B0 | 0.0% | Pending SHC_3BB0A8C1_0x0047E5D0 | 0.0% | Pending -SHC_3BB0A8C1_0x0047E7E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0047E7E0 | 0.0% | Pending -SHC_3BB0A8C1_0x0047E800 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0047E800 | 0.0% | Pending SHC_3BB0A8C1_0x0047E830 | 0.0% | Pending @@ -22393,7 +22393,7 @@ SHC_3BB0A8C1_0x0047EC10 | 0.0% | Pending SHC_3BB0A8C1_0x0047EDE0 | 0.0% | Pending -SHC_3BB0A8C1_0x0047EEB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0047EEB0 | 0.0% | Pending SHC_3BB0A8C1_0x0047EED0 | 0.0% | Pending @@ -22411,13 +22411,13 @@ SHC_3BB0A8C1_0x0047FD50 | 0.0% | Pending SHC_3BB0A8C1_0x0047FEA0 | 0.0% | Pending -SHC_3BB0A8C1_0x0047FFA0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0047FFA0 | 0.0% | Pending SHC_3BB0A8C1_0x0047FFE0 | 0.0% | Pending SHC_3BB0A8C1_0x00480050 | 0.0% | Pending -SHC_3BB0A8C1_0x004800B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004800B0 | 0.0% | Pending SHC_3BB0A8C1_0x004800E0 | 0.0% | Pending @@ -22425,7 +22425,7 @@ SHC_3BB0A8C1_0x00480210 | 0.0% | Pending SHC_3BB0A8C1_0x00480440 | 0.0% | Pending -SHC_3BB0A8C1_0x00480570 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00480570 | 0.0% | Pending SHC_3BB0A8C1_0x00480580 | 0.0% | Pending @@ -22547,7 +22547,7 @@ SHC_3BB0A8C1_0x004821D5 | 0.0% | Pending SHC_3BB0A8C1_0x004821E0 | 0.0% | Pending -SHC_3BB0A8C1_0x00482280 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00482280 | 0.0% | Pending SHC_3BB0A8C1_0x00482290 | 0.0% | Pending @@ -23167,7 +23167,7 @@ SHC_3BB0A8C1_0x0048BD40 | 0.0% | Pending SHC_3BB0A8C1_0x0048BD80 | 0.0% | Pending -SHC_3BB0A8C1_0x0048BF70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0048BF70 | 0.0% | Pending SHC_3BB0A8C1_0x0048BF80 | 0.0% | Pending @@ -23357,7 +23357,7 @@ SHC_3BB0A8C1_0x0048F841 | 0.0% | Pending SHC_3BB0A8C1_0x0048F842 | 0.0% | Pending -SHC_3BB0A8C1_0x0048F850 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0048F850 | 0.0% | Pending SHC_3BB0A8C1_0x0048F870 | 0.0% | Pending @@ -23373,7 +23373,7 @@ SHC_3BB0A8C1_0x00490060 | 0.0% | Pending SHC_3BB0A8C1_0x00490080 | 0.0% | Pending -SHC_3BB0A8C1_0x00490340 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00490340 | 0.0% | Pending SHC_3BB0A8C1_0x00490380 | 0.0% | Pending @@ -23407,13 +23407,13 @@ SHC_3BB0A8C1_0x00491680 | 0.0% | Pending SHC_3BB0A8C1_0x004916C0 | 0.0% | Pending -SHC_3BB0A8C1_0x00491730 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00491730 | 0.0% | Pending SHC_3BB0A8C1_0x00491750 | 0.0% | Pending SHC_3BB0A8C1_0x004917C0 | 0.0% | Pending -SHC_3BB0A8C1_0x00491810 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00491810 | 0.0% | Pending SHC_3BB0A8C1_0x00491840 | 0.0% | Pending @@ -23421,9 +23421,9 @@ SHC_3BB0A8C1_0x00491A30 | 0.0% | Pending SHC_3BB0A8C1_0x00491AC0 | 0.0% | Pending -SHC_3BB0A8C1_0x00491BF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00491BF0 | 0.0% | Pending -SHC_3BB0A8C1_0x00491C20 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00491C20 | 0.0% | Pending SHC_3BB0A8C1_0x00491C50 | 0.0% | Pending @@ -23431,7 +23431,7 @@ SHC_3BB0A8C1_0x00491CE0 | 0.0% | Pending SHC_3BB0A8C1_0x00491D70 | 0.0% | Pending -SHC_3BB0A8C1_0x00491E80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00491E80 | 0.0% | Pending SHC_3BB0A8C1_0x00491EB0 | 0.0% | Pending @@ -23485,7 +23485,7 @@ SHC_3BB0A8C1_0x00492654 | 0.0% | Pending SHC_3BB0A8C1_0x00492658 | 0.0% | Pending -SHC_3BB0A8C1_0x00492660 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00492660 | 0.0% | Pending SHC_3BB0A8C1_0x00492690 | 0.0% | Pending @@ -23501,7 +23501,7 @@ SHC_3BB0A8C1_0x004929BC | 0.0% | Pending SHC_3BB0A8C1_0x004929C0 | 0.0% | Pending -SHC_3BB0A8C1_0x00492A60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00492A60 | 0.0% | Pending SHC_3BB0A8C1_0x00492A90 | 0.0% | Pending @@ -23521,7 +23521,7 @@ SHC_3BB0A8C1_0x00492C58 | 0.0% | Pending SHC_3BB0A8C1_0x00492C5C | 0.0% | Pending -SHC_3BB0A8C1_0x00492C60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00492C60 | 0.0% | Pending SHC_3BB0A8C1_0x00492C90 | 0.0% | Pending @@ -23629,7 +23629,7 @@ SHC_3BB0A8C1_0x00493690 | 0.0% | Pending SHC_3BB0A8C1_0x004937A4 | 0.0% | Pending -SHC_3BB0A8C1_0x004937B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004937B0 | 0.0% | Pending SHC_3BB0A8C1_0x004937E0 | 0.0% | Pending @@ -24041,7 +24041,7 @@ SHC_3BB0A8C1_0x004941E7 | 0.0% | Pending SHC_3BB0A8C1_0x004941E8 | 0.0% | Pending -SHC_3BB0A8C1_0x004941F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004941F0 | 0.0% | Pending SHC_3BB0A8C1_0x00494210 | 0.0% | Pending @@ -24111,7 +24111,7 @@ SHC_3BB0A8C1_0x004948BF | 0.0% | Pending SHC_3BB0A8C1_0x004948C0 | 0.0% | Pending -SHC_3BB0A8C1_0x00494920 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00494920 | 0.0% | Pending SHC_3BB0A8C1_0x00494950 | 0.0% | Pending @@ -24213,9 +24213,9 @@ SHC_3BB0A8C1_0x00495230 | 0.0% | Pending SHC_3BB0A8C1_0x004954A0 | 0.0% | Pending -SHC_3BB0A8C1_0x00495800 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00495800 | 0.0% | Pending -SHC_3BB0A8C1_0x00495840 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00495840 | 0.0% | Pending SHC_3BB0A8C1_0x00495860 | 0.0% | Pending @@ -25477,11 +25477,11 @@ SHC_3BB0A8C1_0x004A9E00 | 0.0% | Pending SHC_3BB0A8C1_0x004A9E60 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9E80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004A9E80 | 0.0% | Pending SHC_3BB0A8C1_0x004A9E90 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9EB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004A9EB0 | 0.0% | Pending SHC_3BB0A8C1_0x004A9ED0 | 0.0% | Pending @@ -25519,37 +25519,37 @@ SHC_3BB0A8C1_0x004AA930 | 0.0% | Pending SHC_3BB0A8C1_0x004AA970 | 0.0% | Pending -SHC_3BB0A8C1_0x004AAA40 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AAA40 | 0.0% | Pending -SHC_3BB0A8C1_0x004AAA60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AAA60 | 0.0% | Pending -SHC_3BB0A8C1_0x004AAA80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AAA80 | 0.0% | Pending -SHC_3BB0A8C1_0x004AAAA0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AAAA0 | 0.0% | Pending -SHC_3BB0A8C1_0x004AAAC0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AAAC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004AAAE0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AAAE0 | 0.0% | Pending -SHC_3BB0A8C1_0x004AAB00 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AAB00 | 0.0% | Pending -SHC_3BB0A8C1_0x004AAB20 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AAB20 | 0.0% | Pending -SHC_3BB0A8C1_0x004AAB40 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AAB40 | 0.0% | Pending SHC_3BB0A8C1_0x004AAB50 | 0.0% | Pending -SHC_3BB0A8C1_0x004AB440 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AB440 | 0.0% | Pending SHC_3BB0A8C1_0x004AB460 | 0.0% | Pending -SHC_3BB0A8C1_0x004AB4B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AB4B0 | 0.0% | Pending -SHC_3BB0A8C1_0x004AB4E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AB4E0 | 0.0% | Pending -SHC_3BB0A8C1_0x004AB510 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AB510 | 0.0% | Pending -SHC_3BB0A8C1_0x004AB540 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AB540 | 0.0% | Pending SHC_3BB0A8C1_0x004AB570 | 0.0% | Pending @@ -25619,17 +25619,17 @@ SHC_3BB0A8C1_0x004ABB91 | 0.0% | Pending SHC_3BB0A8C1_0x004ABBA0 | 0.0% | Pending -SHC_3BB0A8C1_0x004ABCB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004ABCB0 | 0.0% | Pending -SHC_3BB0A8C1_0x004ABCE0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004ABCE0 | 0.0% | Pending -SHC_3BB0A8C1_0x004ABD10 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004ABD10 | 0.0% | Pending SHC_3BB0A8C1_0x004ABD20 | 0.0% | Pending -SHC_3BB0A8C1_0x004ABE50 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004ABE50 | 0.0% | Pending -SHC_3BB0A8C1_0x004ABE80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004ABE80 | 0.0% | Pending SHC_3BB0A8C1_0x004ABEB0 | 0.0% | Pending @@ -25779,7 +25779,7 @@ SHC_3BB0A8C1_0x004AC24E | 0.0% | Pending SHC_3BB0A8C1_0x004AC24F | 0.0% | Pending -SHC_3BB0A8C1_0x004AC250 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AC250 | 0.0% | Pending SHC_3BB0A8C1_0x004AC280 | 0.0% | Pending @@ -25903,31 +25903,31 @@ SHC_3BB0A8C1_0x004AF4C0 | 0.0% | Pending SHC_3BB0A8C1_0x004AF5E0 | 0.0% | Pending -SHC_3BB0A8C1_0x004AF630 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AF630 | 0.0% | Pending -SHC_3BB0A8C1_0x004AF650 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AF650 | 0.0% | Pending -SHC_3BB0A8C1_0x004AF680 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AF680 | 0.0% | Pending -SHC_3BB0A8C1_0x004AF6B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AF6B0 | 0.0% | Pending -SHC_3BB0A8C1_0x004AF6E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AF6E0 | 0.0% | Pending SHC_3BB0A8C1_0x004AF700 | 0.0% | Pending -SHC_3BB0A8C1_0x004AF800 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AF800 | 0.0% | Pending -SHC_3BB0A8C1_0x004AF820 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AF820 | 0.0% | Pending -SHC_3BB0A8C1_0x004AF840 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AF840 | 0.0% | Pending SHC_3BB0A8C1_0x004AF860 | 0.0% | Pending -SHC_3BB0A8C1_0x004AFA50 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AFA50 | 0.0% | Pending SHC_3BB0A8C1_0x004AFA80 | 0.0% | Pending -SHC_3BB0A8C1_0x004AFB00 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004AFB00 | 0.0% | Pending SHC_3BB0A8C1_0x004AFB30 | 0.0% | Pending @@ -25967,7 +25967,7 @@ SHC_3BB0A8C1_0x004B0F70 | 0.0% | Pending SHC_3BB0A8C1_0x004B1000 | 0.0% | Pending -SHC_3BB0A8C1_0x004B1090 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B1090 | 0.0% | Pending SHC_3BB0A8C1_0x004B10D0 | 0.0% | Pending @@ -26001,7 +26001,7 @@ SHC_3BB0A8C1_0x004B1E60 | 0.0% | Pending SHC_3BB0A8C1_0x004B1EB0 | 0.0% | Pending -SHC_3BB0A8C1_0x004B20B0 | 82.4% | shared arm fold direction +SHC_3BB0A8C1_0x004B20B0 | 0.0% | Pending SHC_3BB0A8C1_0x004B2280 | 0.0% | Pending @@ -26881,7 +26881,7 @@ SHC_3BB0A8C1_0x004B51A0 | 0.0% | Pending SHC_3BB0A8C1_0x004B5280 | 0.0% | Pending -SHC_3BB0A8C1_0x004B5300 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B5300 | 0.0% | Pending SHC_3BB0A8C1_0x004B5330 | 0.0% | Pending @@ -26905,7 +26905,7 @@ SHC_3BB0A8C1_0x004B6480 | 0.0% | Pending SHC_3BB0A8C1_0x004B64D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004B6500 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B6500 | 0.0% | Pending SHC_3BB0A8C1_0x004B6530 | 0.0% | Pending @@ -26915,9 +26915,9 @@ SHC_3BB0A8C1_0x004B65A0 | 0.0% | Pending SHC_3BB0A8C1_0x004B65F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004B6640 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B6640 | 0.0% | Pending -SHC_3BB0A8C1_0x004B6680 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B6680 | 0.0% | Pending SHC_3BB0A8C1_0x004B66C0 | 0.0% | Pending @@ -27071,17 +27071,17 @@ SHC_3BB0A8C1_0x004B7530 | 0.0% | Pending SHC_3BB0A8C1_0x004B7600 | 0.0% | Pending -SHC_3BB0A8C1_0x004B7700 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B7700 | 0.0% | Pending SHC_3BB0A8C1_0x004B7730 | 0.0% | Pending SHC_3BB0A8C1_0x004B77A0 | 0.0% | Pending -SHC_3BB0A8C1_0x004B77E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B77E0 | 0.0% | Pending SHC_3BB0A8C1_0x004B7800 | 0.0% | Pending -SHC_3BB0A8C1_0x004B7890 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B7890 | 0.0% | Pending SHC_3BB0A8C1_0x004B78D0 | 0.0% | Pending @@ -27097,19 +27097,19 @@ SHC_3BB0A8C1_0x004B7AF0 | 0.0% | Pending SHC_3BB0A8C1_0x004B7C90 | 0.0% | Pending -SHC_3BB0A8C1_0x004B7F60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B7F60 | 0.0% | Pending SHC_3BB0A8C1_0x004B7FA0 | 0.0% | Pending SHC_3BB0A8C1_0x004B8000 | 0.0% | Pending -SHC_3BB0A8C1_0x004B8050 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B8050 | 0.0% | Pending SHC_3BB0A8C1_0x004B8080 | 0.0% | Pending -SHC_3BB0A8C1_0x004B8200 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B8200 | 0.0% | Pending -SHC_3BB0A8C1_0x004B8210 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B8210 | 0.0% | Pending SHC_3BB0A8C1_0x004B8220 | 0.0% | Pending @@ -27639,7 +27639,7 @@ SHC_3BB0A8C1_0x004B9528 | 0.0% | Pending SHC_3BB0A8C1_0x004B9530 | 0.0% | Pending -SHC_3BB0A8C1_0x004B9610 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004B9610 | 0.0% | Pending SHC_3BB0A8C1_0x004B9620 | 0.0% | Pending @@ -29119,7 +29119,7 @@ SHC_3BB0A8C1_0x004BAEC0 | 0.0% | Pending SHC_3BB0A8C1_0x004BB010 | 0.0% | Pending -SHC_3BB0A8C1_0x004BB0B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004BB0B0 | 0.0% | Pending SHC_3BB0A8C1_0x004BB0D0 | 0.0% | Pending @@ -29287,11 +29287,11 @@ SHC_3BB0A8C1_0x004BB52C | 0.0% | Pending SHC_3BB0A8C1_0x004BB530 | 0.0% | Pending -SHC_3BB0A8C1_0x004BB540 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004BB540 | 0.0% | Pending SHC_3BB0A8C1_0x004BB570 | 0.0% | Pending -SHC_3BB0A8C1_0x004BB650 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004BB650 | 0.0% | Pending SHC_3BB0A8C1_0x004BB680 | 0.0% | Pending @@ -29315,9 +29315,9 @@ SHC_3BB0A8C1_0x004BB900 | 0.0% | Pending SHC_3BB0A8C1_0x004BB990 | 0.0% | Pending -SHC_3BB0A8C1_0x004BB9F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004BB9F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004BBA20 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004BBA20 | 0.0% | Pending SHC_3BB0A8C1_0x004BBA30 | 0.0% | Pending @@ -30085,17 +30085,17 @@ SHC_3BB0A8C1_0x004BC5B0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004BC5F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004BC620 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004BC620 | 0.0% | Pending SHC_3BB0A8C1_0x004BC630 | 0.0% | Pending -SHC_3BB0A8C1_0x004BC690 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004BC690 | 0.0% | Pending SHC_3BB0A8C1_0x004BC6C0 | 0.0% | Pending SHC_3BB0A8C1_0x004BC6F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004BC770 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004BC770 | 0.0% | Pending SHC_3BB0A8C1_0x004BC790 | 0.0% | Pending @@ -30491,7 +30491,7 @@ SHC_3BB0A8C1_0x004BEA90 | 0.0% | Pending SHC_3BB0A8C1_0x004BEB20 | 0.0% | Pending -SHC_3BB0A8C1_0x004BEC10 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004BEC10 | 0.0% | Pending SHC_3BB0A8C1_0x004BEC40 | 0.0% | Pending @@ -35833,7 +35833,7 @@ SHC_3BB0A8C1_0x004D6D14 | 0.0% | Pending SHC_3BB0A8C1_0x004D6D20 | 0.0% | Pending -SHC_3BB0A8C1_0x004D6EF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004D6EF0 | 0.0% | Pending SHC_3BB0A8C1_0x004D6F20 | 0.0% | Pending @@ -35999,7 +35999,7 @@ SHC_3BB0A8C1_0x004D8A18 | 0.0% | Pending SHC_3BB0A8C1_0x004D8A20 | 0.0% | Pending -SHC_3BB0A8C1_0x004D8AB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004D8AB0 | 0.0% | Pending SHC_3BB0A8C1_0x004D8AE0 | 0.0% | Pending @@ -36019,7 +36019,7 @@ SHC_3BB0A8C1_0x004D91D0 | 0.0% | Pending SHC_3BB0A8C1_0x004D9230 | 0.0% | Pending -SHC_3BB0A8C1_0x004D9270 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004D9270 | 0.0% | Pending SHC_3BB0A8C1_0x004D9290 | 0.0% | Pending @@ -36027,7 +36027,7 @@ SHC_3BB0A8C1_0x004D9400 | 0.0% | Pending SHC_3BB0A8C1_0x004D9520 | 0.0% | Pending -SHC_3BB0A8C1_0x004D9700 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004D9700 | 0.0% | Pending SHC_3BB0A8C1_0x004D9730 | 0.0% | Pending @@ -36053,9 +36053,9 @@ SHC_3BB0A8C1_0x004D9C10 | 0.0% | Pending SHC_3BB0A8C1_0x004D9CC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004D9D60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004D9D60 | 0.0% | Pending -SHC_3BB0A8C1_0x004D9D90 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004D9D90 | 0.0% | Pending SHC_3BB0A8C1_0x004D9DB0 | 0.0% | Pending @@ -36135,7 +36135,7 @@ SHC_3BB0A8C1_0x004DA360 | 0.0% | Pending SHC_3BB0A8C1_0x004DA570 | 0.0% | Pending -SHC_3BB0A8C1_0x004DA640 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004DA640 | 0.0% | Pending SHC_3BB0A8C1_0x004DA670 | 0.0% | Pending @@ -36145,15 +36145,15 @@ SHC_3BB0A8C1_0x004DA750 | 0.0% | Pending SHC_3BB0A8C1_0x004DA7A0 | 0.0% | Pending -SHC_3BB0A8C1_0x004DA7E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004DA7E0 | 0.0% | Pending -SHC_3BB0A8C1_0x004DA810 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004DA810 | 0.0% | Pending -SHC_3BB0A8C1_0x004DA840 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004DA840 | 0.0% | Pending -SHC_3BB0A8C1_0x004DA870 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004DA870 | 0.0% | Pending -SHC_3BB0A8C1_0x004DA8A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004DA8A0 | 0.0% | Pending SHC_3BB0A8C1_0x004DA8D0 | 0.0% | Pending @@ -36171,7 +36171,7 @@ SHC_3BB0A8C1_0x004DAB80 | 0.0% | Pending SHC_3BB0A8C1_0x004DABB0 | 0.0% | Pending -SHC_3BB0A8C1_0x004DABF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004DABF0 | 0.0% | Pending SHC_3BB0A8C1_0x004DAC30 | 0.0% | Pending @@ -36257,7 +36257,7 @@ SHC_3BB0A8C1_0x004DC500 | 0.0% | Pending SHC_3BB0A8C1_0x004DC9E0 | 0.0% | Pending -SHC_3BB0A8C1_0x004DCC70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004DCC70 | 0.0% | Pending SHC_3BB0A8C1_0x004DCC90 | 0.0% | Pending @@ -36375,7 +36375,7 @@ SHC_3BB0A8C1_0x004E12C0 | 0.0% | Pending SHC_3BB0A8C1_0x004E1810 | 0.0% | Pending -SHC_3BB0A8C1_0x004E1A20 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004E1A20 | 0.0% | Pending SHC_3BB0A8C1_0x004E1A50 | 0.0% | Pending @@ -36399,7 +36399,7 @@ SHC_3BB0A8C1_0x004E2460 | 0.0% | Pending SHC_3BB0A8C1_0x004E25A0 | 0.0% | Pending -SHC_3BB0A8C1_0x004E2600 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004E2600 | 0.0% | Pending SHC_3BB0A8C1_0x004E2630 | 0.0% | Pending @@ -36985,7 +36985,7 @@ SHC_3BB0A8C1_0x004E66F0 | 0.0% | Pending SHC_3BB0A8C1_0x004E7770 | 0.0% | Pending -SHC_3BB0A8C1_0x004E7800 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004E7800 | 0.0% | Pending SHC_3BB0A8C1_0x004E7810 | 0.0% | Pending @@ -37335,11 +37335,11 @@ SHC_3BB0A8C1_0x004E8C4C | 0.0% | Pending SHC_3BB0A8C1_0x004E8C50 | 0.0% | Pending -SHC_3BB0A8C1_0x004E8C90 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004E8C90 | 0.0% | Pending -SHC_3BB0A8C1_0x004E8CA0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004E8CA0 | 0.0% | Pending -SHC_3BB0A8C1_0x004E8CC0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004E8CC0 | 0.0% | Pending SHC_3BB0A8C1_0x004E8CF0 | 0.0% | Pending @@ -38463,7 +38463,7 @@ SHC_3BB0A8C1_0x004F28E4 | 0.0% | Pending SHC_3BB0A8C1_0x004F28E8 | 0.0% | Pending -SHC_3BB0A8C1_0x004F28F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F28F0 | 0.0% | Pending SHC_3BB0A8C1_0x004F2920 | 0.0% | Pending @@ -38561,9 +38561,9 @@ SHC_3BB0A8C1_0x004F2E00 | 0.0% | Pending SHC_3BB0A8C1_0x004F2E90 | 0.0% | Pending -SHC_3BB0A8C1_0x004F2FB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F2FB0 | 0.0% | Pending -SHC_3BB0A8C1_0x004F2FE0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F2FE0 | 0.0% | Pending SHC_3BB0A8C1_0x004F3010 | 0.0% | Pending @@ -38579,7 +38579,7 @@ SHC_3BB0A8C1_0x004F3560 | 0.0% | Pending SHC_3BB0A8C1_0x004F3610 | 0.0% | Pending -SHC_3BB0A8C1_0x004F3700 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F3700 | 0.0% | Pending SHC_3BB0A8C1_0x004F3730 | 0.0% | Pending @@ -38589,9 +38589,9 @@ SHC_3BB0A8C1_0x004F3840 | 0.0% | Pending SHC_3BB0A8C1_0x004F38A0 | 0.0% | Pending -SHC_3BB0A8C1_0x004F3900 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F3900 | 0.0% | Pending -SHC_3BB0A8C1_0x004F3930 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F3930 | 0.0% | Pending SHC_3BB0A8C1_0x004F3960 | 0.0% | Pending @@ -38599,7 +38599,7 @@ SHC_3BB0A8C1_0x004F3B90 | 0.0% | Pending SHC_3BB0A8C1_0x004F3C50 | 0.0% | Pending -SHC_3BB0A8C1_0x004F3D30 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F3D30 | 0.0% | Pending SHC_3BB0A8C1_0x004F3D60 | 0.0% | Pending @@ -38633,9 +38633,9 @@ SHC_3BB0A8C1_0x004F4290 | 0.0% | Pending SHC_3BB0A8C1_0x004F49D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004F4C30 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F4C30 | 0.0% | Pending -SHC_3BB0A8C1_0x004F4C60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F4C60 | 0.0% | Pending SHC_3BB0A8C1_0x004F4C80 | 0.0% | Pending @@ -38697,7 +38697,7 @@ SHC_3BB0A8C1_0x004F6460 | 0.0% | Pending SHC_3BB0A8C1_0x004F6464 | 0.0% | Pending -SHC_3BB0A8C1_0x004F6470 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F6470 | 0.0% | Pending SHC_3BB0A8C1_0x004F64A0 | 0.0% | Pending @@ -38733,9 +38733,9 @@ SHC_3BB0A8C1_0x004F69D0 | 0.0% | Pending SHC_3BB0A8C1_0x004F6A20 | 0.0% | Pending -SHC_3BB0A8C1_0x004F6A60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F6A60 | 0.0% | Pending -SHC_3BB0A8C1_0x004F6A70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F6A70 | 0.0% | Pending SHC_3BB0A8C1_0x004F6A80 | 0.0% | Pending @@ -38755,11 +38755,11 @@ SHC_3BB0A8C1_0x004F6F90 | 0.0% | Pending SHC_3BB0A8C1_0x004F6FD0 | 0.0% | Pending -SHC_3BB0A8C1_0x004F70B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F70B0 | 0.0% | Pending SHC_3BB0A8C1_0x004F70D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004F70E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x004F70E0 | 0.0% | Pending SHC_3BB0A8C1_0x004F70F0 | 0.0% | Pending @@ -41419,19 +41419,19 @@ SHC_3BB0A8C1_0x00500090 | 0.0% | Pending SHC_3BB0A8C1_0x00500091 | 0.0% | Pending -SHC_3BB0A8C1_0x005000A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005000A0 | 0.0% | Pending SHC_3BB0A8C1_0x005000E0 | 0.0% | Pending SHC_3BB0A8C1_0x00500180 | 0.0% | Pending -SHC_3BB0A8C1_0x00500210 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500210 | 0.0% | Pending SHC_3BB0A8C1_0x00500250 | 0.0% | Pending SHC_3BB0A8C1_0x00500290 | 0.0% | Pending -SHC_3BB0A8C1_0x005002D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005002D0 | 0.0% | Pending SHC_3BB0A8C1_0x00500310 | 0.0% | Pending @@ -41443,19 +41443,19 @@ SHC_3BB0A8C1_0x00500500 | 0.0% | Pending SHC_3BB0A8C1_0x005005F0 | 0.0% | Pending -SHC_3BB0A8C1_0x00500640 | 46.2% | register allocation differs +SHC_3BB0A8C1_0x00500640 | 0.0% | Pending -SHC_3BB0A8C1_0x00500680 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500680 | 0.0% | Pending SHC_3BB0A8C1_0x005006C0 | 0.0% | Pending -SHC_3BB0A8C1_0x00500720 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500720 | 0.0% | Pending -SHC_3BB0A8C1_0x00500750 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500750 | 0.0% | Pending SHC_3BB0A8C1_0x00500790 | 0.0% | Pending -SHC_3BB0A8C1_0x005007D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005007D0 | 0.0% | Pending SHC_3BB0A8C1_0x00500800 | 0.0% | Pending @@ -41471,25 +41471,25 @@ SHC_3BB0A8C1_0x00500B50 | 0.0% | Pending SHC_3BB0A8C1_0x00500BB0 | 0.0% | Pending -SHC_3BB0A8C1_0x00500C20 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500C20 | 0.0% | Pending -SHC_3BB0A8C1_0x00500C80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500C80 | 0.0% | Pending -SHC_3BB0A8C1_0x00500CB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500CB0 | 0.0% | Pending -SHC_3BB0A8C1_0x00500CF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500CF0 | 0.0% | Pending -SHC_3BB0A8C1_0x00500D30 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500D30 | 0.0% | Pending -SHC_3BB0A8C1_0x00500D60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500D60 | 0.0% | Pending -SHC_3BB0A8C1_0x00500DD0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500DD0 | 0.0% | Pending -SHC_3BB0A8C1_0x00500E20 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500E20 | 0.0% | Pending -SHC_3BB0A8C1_0x00500EE0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500EE0 | 0.0% | Pending -SHC_3BB0A8C1_0x00500F40 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00500F40 | 0.0% | Pending SHC_3BB0A8C1_0x00501070 | 0.0% | Pending @@ -41503,19 +41503,19 @@ SHC_3BB0A8C1_0x005010B8 | 0.0% | Pending SHC_3BB0A8C1_0x005010BC | 0.0% | Pending -SHC_3BB0A8C1_0x005010C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005010C0 | 0.0% | Pending SHC_3BB0A8C1_0x005010D0 | 0.0% | Pending -SHC_3BB0A8C1_0x005010E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005010E0 | 0.0% | Pending SHC_3BB0A8C1_0x00501110 | 0.0% | Pending -SHC_3BB0A8C1_0x00501180 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00501180 | 0.0% | Pending -SHC_3BB0A8C1_0x005011A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005011A0 | 0.0% | Pending -SHC_3BB0A8C1_0x005011C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005011C0 | 0.0% | Pending SHC_3BB0A8C1_0x005011F0 | 0.0% | Pending @@ -41535,11 +41535,11 @@ SHC_3BB0A8C1_0x005016D0 | 0.0% | Pending SHC_3BB0A8C1_0x005016E0 | 0.0% | Pending -SHC_3BB0A8C1_0x00501730 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00501730 | 0.0% | Pending SHC_3BB0A8C1_0x00501760 | 0.0% | Pending -SHC_3BB0A8C1_0x005017A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005017A0 | 0.0% | Pending SHC_3BB0A8C1_0x005017C0 | 0.0% | Pending @@ -42067,7 +42067,7 @@ SHC_3BB0A8C1_0x00504ED0 | 0.0% | Pending SHC_3BB0A8C1_0x00504ED1 | 0.0% | Pending -SHC_3BB0A8C1_0x00504EE0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00504EE0 | 0.0% | Pending SHC_3BB0A8C1_0x00504F10 | 0.0% | Pending @@ -44191,7 +44191,7 @@ SHC_3BB0A8C1_0x005116E0 | 0.0% | Pending SHC_3BB0A8C1_0x00511850 | 0.0% | Pending -SHC_3BB0A8C1_0x005118C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005118C0 | 0.0% | Pending SHC_3BB0A8C1_0x005119A4 | 0.0% | Pending @@ -44739,7 +44739,7 @@ SHC_3BB0A8C1_0x005127B0 | 0.0% | Pending SHC_3BB0A8C1_0x005127D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00512920 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00512920 | 0.0% | Pending SHC_3BB0A8C1_0x00512940 | 0.0% | Pending @@ -45743,7 +45743,7 @@ SHC_3BB0A8C1_0x00518180 | 0.0% | Pending SHC_3BB0A8C1_0x005182A0 | 0.0% | Pending -SHC_3BB0A8C1_0x00518350 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00518350 | 0.0% | Pending SHC_3BB0A8C1_0x00518380 | 0.0% | Pending @@ -45773,7 +45773,7 @@ SHC_3BB0A8C1_0x00519850 | 0.0% | Pending SHC_3BB0A8C1_0x005198C0 | 0.0% | Pending -SHC_3BB0A8C1_0x00519960 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00519960 | 0.0% | Pending SHC_3BB0A8C1_0x00519990 | 0.0% | Pending @@ -45839,9 +45839,9 @@ SHC_3BB0A8C1_0x0051AB60 | 0.0% | Pending SHC_3BB0A8C1_0x0051ABB0 | 0.0% | Pending -SHC_3BB0A8C1_0x0051AC80 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0051AC80 | 0.0% | Pending -SHC_3BB0A8C1_0x0051ACB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0051ACB0 | 0.0% | Pending SHC_3BB0A8C1_0x0051ACE0 | 0.0% | Pending @@ -45879,7 +45879,7 @@ SHC_3BB0A8C1_0x0051B420 | 0.0% | Pending SHC_3BB0A8C1_0x0051B570 | 0.0% | Pending -SHC_3BB0A8C1_0x0051B680 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0051B680 | 0.0% | Pending SHC_3BB0A8C1_0x0051B690 | 0.0% | Pending @@ -46161,7 +46161,7 @@ SHC_3BB0A8C1_0x0051D5D0 | 0.0% | Pending SHC_3BB0A8C1_0x0051D5E0 | 0.0% | Pending -SHC_3BB0A8C1_0x0051D680 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0051D680 | 0.0% | Pending SHC_3BB0A8C1_0x0051D690 | 0.0% | Pending @@ -46379,11 +46379,11 @@ SHC_3BB0A8C1_0x00520CD0 | 0.0% | Pending SHC_3BB0A8C1_0x00520F70 | 0.0% | Pending -SHC_3BB0A8C1_0x00521180 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00521180 | 0.0% | Pending SHC_3BB0A8C1_0x005211B0 | 0.0% | Pending -SHC_3BB0A8C1_0x00521210 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00521210 | 0.0% | Pending SHC_3BB0A8C1_0x00521240 | 0.0% | Pending @@ -46633,7 +46633,7 @@ SHC_3BB0A8C1_0x00521EA5 | 0.0% | Pending SHC_3BB0A8C1_0x00521EA6 | 0.0% | Pending -SHC_3BB0A8C1_0x00521EB0 | 76.5% | pop esi scheduling +SHC_3BB0A8C1_0x00521EB0 | 0.0% | Pending SHC_3BB0A8C1_0x00521EF0 | 0.0% | Pending @@ -46765,11 +46765,11 @@ SHC_3BB0A8C1_0x00522083 | 0.0% | Pending SHC_3BB0A8C1_0x00522090 | 0.0% | Pending -SHC_3BB0A8C1_0x00522110 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00522110 | 0.0% | Pending -SHC_3BB0A8C1_0x00522150 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00522150 | 0.0% | Pending -SHC_3BB0A8C1_0x00522160 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00522160 | 0.0% | Pending SHC_3BB0A8C1_0x005221A0 | 0.0% | Pending @@ -46779,15 +46779,15 @@ SHC_3BB0A8C1_0x00522210 | 0.0% | Pending SHC_3BB0A8C1_0x005222B0 | 0.0% | Pending -SHC_3BB0A8C1_0x00522360 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00522360 | 0.0% | Pending SHC_3BB0A8C1_0x00522390 | 0.0% | Pending SHC_3BB0A8C1_0x00522410 | 0.0% | Pending -SHC_3BB0A8C1_0x005224E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005224E0 | 0.0% | Pending -SHC_3BB0A8C1_0x00522520 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00522520 | 0.0% | Pending SHC_3BB0A8C1_0x00522550 | 0.0% | Pending @@ -46807,11 +46807,11 @@ SHC_3BB0A8C1_0x005229C0 | 0.0% | Pending SHC_3BB0A8C1_0x00522B00 | 0.0% | Pending -SHC_3BB0A8C1_0x00522BC0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00522BC0 | 0.0% | Pending -SHC_3BB0A8C1_0x00522BF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00522BF0 | 0.0% | Pending -SHC_3BB0A8C1_0x00522C20 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00522C20 | 0.0% | Pending SHC_3BB0A8C1_0x00522C50 | 0.0% | Pending @@ -46833,13 +46833,13 @@ SHC_3BB0A8C1_0x005232E0 | 0.0% | Pending SHC_3BB0A8C1_0x005232F0 | 0.0% | Pending -SHC_3BB0A8C1_0x00523340 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00523340 | 0.0% | Pending -SHC_3BB0A8C1_0x00523370 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00523370 | 0.0% | Pending SHC_3BB0A8C1_0x005233A0 | 0.0% | Pending -SHC_3BB0A8C1_0x005233E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005233E0 | 0.0% | Pending SHC_3BB0A8C1_0x00523410 | 0.0% | Pending @@ -46851,7 +46851,7 @@ SHC_3BB0A8C1_0x00523630 | 0.0% | Pending SHC_3BB0A8C1_0x005236A0 | 0.0% | Pending -SHC_3BB0A8C1_0x00523730 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00523730 | 0.0% | Pending SHC_3BB0A8C1_0x00523750 | 0.0% | Pending @@ -46865,11 +46865,11 @@ SHC_3BB0A8C1_0x00523A30 | 0.0% | Pending SHC_3BB0A8C1_0x00523B00 | 0.0% | Pending -SHC_3BB0A8C1_0x00523E00 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00523E00 | 0.0% | Pending SHC_3BB0A8C1_0x00523E30 | 0.0% | Pending -SHC_3BB0A8C1_0x00523EB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00523EB0 | 0.0% | Pending SHC_3BB0A8C1_0x00523EF0 | 0.0% | Pending @@ -46917,7 +46917,7 @@ SHC_3BB0A8C1_0x00524EF0 | 0.0% | Pending SHC_3BB0A8C1_0x00525060 | 0.0% | Pending -SHC_3BB0A8C1_0x00525090 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00525090 | 0.0% | Pending SHC_3BB0A8C1_0x005250B0 | 0.0% | Pending @@ -46947,7 +46947,7 @@ SHC_3BB0A8C1_0x00525970 | 0.0% | Pending SHC_3BB0A8C1_0x00525A70 | 0.0% | Pending -SHC_3BB0A8C1_0x00525B70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00525B70 | 0.0% | Pending SHC_3BB0A8C1_0x00525BA0 | 0.0% | Pending @@ -46959,7 +46959,7 @@ SHC_3BB0A8C1_0x005261B0 | 0.0% | Pending SHC_3BB0A8C1_0x005262A0 | 0.0% | Pending -SHC_3BB0A8C1_0x00526370 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00526370 | 0.0% | Pending SHC_3BB0A8C1_0x005263A0 | 0.0% | Pending @@ -49233,7 +49233,7 @@ SHC_3BB0A8C1_0x0052B9E4 | 0.0% | Pending SHC_3BB0A8C1_0x0052B9E8 | 0.0% | Pending -SHC_3BB0A8C1_0x0052B9F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0052B9F0 | 0.0% | Pending SHC_3BB0A8C1_0x0052BA10 | 0.0% | Pending @@ -49317,9 +49317,9 @@ SHC_3BB0A8C1_0x0052EED0 | 0.0% | Pending SHC_3BB0A8C1_0x0052F010 | 0.0% | Pending -SHC_3BB0A8C1_0x0052F070 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0052F070 | 0.0% | Pending -SHC_3BB0A8C1_0x0052F0A0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0052F0A0 | 0.0% | Pending SHC_3BB0A8C1_0x0052F0D0 | 0.0% | Pending @@ -49345,9 +49345,9 @@ SHC_3BB0A8C1_0x0052F730 | 0.0% | Pending SHC_3BB0A8C1_0x0052F7E0 | 0.0% | Pending -SHC_3BB0A8C1_0x0052FBB0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0052FBB0 | 0.0% | Pending -SHC_3BB0A8C1_0x0052FBF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0052FBF0 | 0.0% | Pending SHC_3BB0A8C1_0x0052FC30 | 0.0% | Pending @@ -49361,7 +49361,7 @@ SHC_3BB0A8C1_0x0052FE90 | 0.0% | Pending SHC_3BB0A8C1_0x0052FF80 | 0.0% | Pending -SHC_3BB0A8C1_0x00530080 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00530080 | 0.0% | Pending SHC_3BB0A8C1_0x005300B0 | 0.0% | Pending @@ -49649,7 +49649,7 @@ SHC_3BB0A8C1_0x00530C40 | 0.0% | Pending SHC_3BB0A8C1_0x00530CF0 | 0.0% | Pending -SHC_3BB0A8C1_0x00530D50 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00530D50 | 0.0% | Pending SHC_3BB0A8C1_0x00530D70 | 0.0% | Pending @@ -49659,11 +49659,11 @@ SHC_3BB0A8C1_0x00530EB0 | 0.0% | Pending SHC_3BB0A8C1_0x00530F20 | 0.0% | Pending -SHC_3BB0A8C1_0x00530FD0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00530FD0 | 0.0% | Pending SHC_3BB0A8C1_0x00531000 | 0.0% | Pending -SHC_3BB0A8C1_0x005311F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005311F0 | 0.0% | Pending SHC_3BB0A8C1_0x00531220 | 0.0% | Pending @@ -50643,7 +50643,7 @@ SHC_3BB0A8C1_0x00532F5D | 0.0% | Pending SHC_3BB0A8C1_0x00532F5E | 0.0% | Pending -SHC_3BB0A8C1_0x00532F60 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00532F60 | 0.0% | Pending SHC_3BB0A8C1_0x00532F80 | 0.0% | Pending @@ -50677,19 +50677,19 @@ SHC_3BB0A8C1_0x00533630 | 0.0% | Pending SHC_3BB0A8C1_0x00533810 | 0.0% | Pending -SHC_3BB0A8C1_0x00533920 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00533920 | 0.0% | Pending SHC_3BB0A8C1_0x00533960 | 0.0% | Pending SHC_3BB0A8C1_0x005339A0 | 0.0% | Pending -SHC_3BB0A8C1_0x005339F0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005339F0 | 0.0% | Pending SHC_3BB0A8C1_0x00533A10 | 0.0% | Pending SHC_3BB0A8C1_0x00533B30 | 0.0% | Pending -SHC_3BB0A8C1_0x00533C70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00533C70 | 0.0% | Pending SHC_3BB0A8C1_0x00533CA0 | 0.0% | Pending @@ -50777,7 +50777,7 @@ SHC_3BB0A8C1_0x00533F84 | 0.0% | Pending SHC_3BB0A8C1_0x00533F85 | 0.0% | Pending -SHC_3BB0A8C1_0x00533F90 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00533F90 | 0.0% | Pending SHC_3BB0A8C1_0x00533FC0 | 0.0% | Pending @@ -50809,7 +50809,7 @@ SHC_3BB0A8C1_0x005343C0 | 0.0% | Pending SHC_3BB0A8C1_0x005343F0 | 0.0% | Pending -SHC_3BB0A8C1_0x00534460 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00534460 | 0.0% | Pending SHC_3BB0A8C1_0x00534490 | 0.0% | Pending @@ -50857,7 +50857,7 @@ SHC_3BB0A8C1_0x005350B0 | 0.0% | Pending SHC_3BB0A8C1_0x00535150 | 0.0% | Pending -SHC_3BB0A8C1_0x00535190 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00535190 | 0.0% | Pending SHC_3BB0A8C1_0x005351C0 | 0.0% | Pending @@ -51065,11 +51065,11 @@ SHC_3BB0A8C1_0x00535513 | 0.0% | Pending SHC_3BB0A8C1_0x00535514 | 0.0% | Pending -SHC_3BB0A8C1_0x00535520 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00535520 | 0.0% | Pending -SHC_3BB0A8C1_0x00535550 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00535550 | 0.0% | Pending -SHC_3BB0A8C1_0x00535560 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00535560 | 0.0% | Pending SHC_3BB0A8C1_0x00535580 | 0.0% | Pending @@ -51077,15 +51077,15 @@ SHC_3BB0A8C1_0x005355E0 | 0.0% | Pending SHC_3BB0A8C1_0x00535680 | 0.0% | Pending -SHC_3BB0A8C1_0x00535700 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00535700 | 0.0% | Pending SHC_3BB0A8C1_0x00535730 | 0.0% | Pending SHC_3BB0A8C1_0x005357E0 | 0.0% | Pending -SHC_3BB0A8C1_0x00535810 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00535810 | 0.0% | Pending -SHC_3BB0A8C1_0x00535840 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00535840 | 0.0% | Pending SHC_3BB0A8C1_0x00535870 | 0.0% | Pending @@ -51103,7 +51103,7 @@ SHC_3BB0A8C1_0x00535B00 | 0.0% | Pending SHC_3BB0A8C1_0x00535BC0 | 0.0% | Pending -SHC_3BB0A8C1_0x00535DF0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00535DF0 | 0.0% | Pending SHC_3BB0A8C1_0x00535E20 | 0.0% | Pending @@ -51205,9 +51205,9 @@ SHC_3BB0A8C1_0x00536A60 | 0.0% | Pending SHC_3BB0A8C1_0x00536C70 | 0.0% | Pending -SHC_3BB0A8C1_0x00536C90 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00536C90 | 0.0% | Pending -SHC_3BB0A8C1_0x00536CC0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00536CC0 | 0.0% | Pending SHC_3BB0A8C1_0x00536CF0 | 0.0% | Pending @@ -51221,17 +51221,17 @@ SHC_3BB0A8C1_0x00536E30 | 0.0% | Pending SHC_3BB0A8C1_0x00537070 | 0.0% | Pending -SHC_3BB0A8C1_0x005370C0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005370C0 | 0.0% | Pending -SHC_3BB0A8C1_0x00537100 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00537100 | 0.0% | Pending -SHC_3BB0A8C1_0x00537130 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00537130 | 0.0% | Pending -SHC_3BB0A8C1_0x00537160 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x00537160 | 0.0% | Pending SHC_3BB0A8C1_0x005371A0 | 0.0% | Pending -SHC_3BB0A8C1_0x005371E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x005371E0 | 0.0% | Pending SHC_3BB0A8C1_0x005371F0 | 0.0% | Pending @@ -59625,9 +59625,9 @@ SHC_3BB0A8C1_0x0053B210 | 0.0% | Pending SHC_3BB0A8C1_0x0053B260 | 0.0% | Pending -SHC_3BB0A8C1_0x0053B310 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0053B310 | 0.0% | Pending -SHC_3BB0A8C1_0x0053B340 | 90.91% | jne vs jl due to loop unroll prevention via != +SHC_3BB0A8C1_0x0053B340 | 0.0% | Pending SHC_3BB0A8C1_0x0053B380 | 0.0% | Pending @@ -59637,25 +59637,25 @@ SHC_3BB0A8C1_0x0053B3E0 | 0.0% | Pending SHC_3BB0A8C1_0x0053B4F0 | 0.0% | Pending -SHC_3BB0A8C1_0x0053B530 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0053B530 | 0.0% | Pending -SHC_3BB0A8C1_0x0053B570 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0053B570 | 0.0% | Pending SHC_3BB0A8C1_0x0053B5A0 | 0.0% | Pending -SHC_3BB0A8C1_0x0053B5E0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0053B5E0 | 0.0% | Pending SHC_3BB0A8C1_0x0053B610 | 0.0% | Pending SHC_3BB0A8C1_0x0053B800 | 0.0% | Pending -SHC_3BB0A8C1_0x0053B8B0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0053B8B0 | 0.0% | Pending SHC_3BB0A8C1_0x0053B8E0 | 0.0% | Pending SHC_3BB0A8C1_0x0053BB10 | 0.0% | Pending -SHC_3BB0A8C1_0x0053BB70 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0053BB70 | 0.0% | Pending SHC_3BB0A8C1_0x0053BB90 | 0.0% | Pending @@ -59669,7 +59669,7 @@ SHC_3BB0A8C1_0x0053C400 | 0.0% | Pending SHC_3BB0A8C1_0x0053C590 | 0.0% | Pending -SHC_3BB0A8C1_0x0053CAC0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0053CAC0 | 0.0% | Pending SHC_3BB0A8C1_0x0053CAE0 | 0.0% | Pending @@ -60095,7 +60095,7 @@ SHC_3BB0A8C1_0x0053E820 | 0.0% | Pending SHC_3BB0A8C1_0x0053E870 | 0.0% | Pending -SHC_3BB0A8C1_0x0053E8D0 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0053E8D0 | 0.0% | Pending SHC_3BB0A8C1_0x0053E900 | 0.0% | Pending @@ -60107,12 +60107,8 @@ SHC_3BB0A8C1_0x0053F07C | 0.0% | Pending SHC_3BB0A8C1_0x0053F084 | 0.0% | Pending -SHC_3BB0A8C1_0x0053F088 | 0.0% | Pending - SHC_3BB0A8C1_0x0053F08F | 0.0% | Pending -SHC_3BB0A8C1_0x0053F09C | 0.0% | Pending - SHC_3BB0A8C1_0x0053F0AA | 0.0% | Pending SHC_3BB0A8C1_0x0053F0BA | 0.0% | Pending @@ -67547,7 +67543,7 @@ SHC_3BB0A8C1_0x0057B9BE | 0.0% | Pending SHC_3BB0A8C1_0x0057B9C0 | 0.0% | Pending -SHC_3BB0A8C1_0x0057BE10 | 100.0% | Reimplemented +SHC_3BB0A8C1_0x0057BE10 | 0.0% | Pending SHC_3BB0A8C1_0x0057C815 | 0.0% | Pending @@ -68325,7 +68321,7 @@ SHC_3BB0A8C1_0x00584001 | 0.0% | Pending SHC_3BB0A8C1_0x0058401B | 0.0% | Pending -SHC_3BB0A8C1_0x00584026 | 0.0% | instruction selection differs +SHC_3BB0A8C1_0x00584026 | 0.0% | Pending SHC_3BB0A8C1_0x00584030 | 0.0% | Pending @@ -86289,14 +86285,34 @@ SHC_3BB0A8C1_0x00EE2350 | 0.0% | Pending SHC_3BB0A8C1_0x00EE2354 | 0.0% | Pending +SHC_3BB0A8C1_0x00EE2358 | 0.0% | Pending + +SHC_3BB0A8C1_0x00EE235C | 0.0% | Pending + +SHC_3BB0A8C1_0x00EE2360 | 0.0% | Pending + SHC_3BB0A8C1_0x00EE2364 | 0.0% | Pending SHC_3BB0A8C1_0x00EE2368 | 0.0% | Pending +SHC_3BB0A8C1_0x00EE236C | 0.0% | Pending + +SHC_3BB0A8C1_0x00EE2370 | 0.0% | Pending + SHC_3BB0A8C1_0x00EE2374 | 0.0% | Pending +SHC_3BB0A8C1_0x00EE2378 | 0.0% | Pending + +SHC_3BB0A8C1_0x00EE237C | 0.0% | Pending + SHC_3BB0A8C1_0x00EE2380 | 0.0% | Pending +SHC_3BB0A8C1_0x00EE2384 | 0.0% | Pending + +SHC_3BB0A8C1_0x00EE2388 | 0.0% | Pending + +SHC_3BB0A8C1_0x00EE238C | 0.0% | Pending + SHC_3BB0A8C1_0x00EE2390 | 0.0% | Pending SHC_3BB0A8C1_0x00EE2394 | 0.0% | Pending From 1dc7f4cba8511de3745e0ed9faec32c0b1ca8e58 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:02 +0200 Subject: [PATCH 004/516] reimplement: SHC_3BB0A8C1_0x004A1230 59.37% signed queue-bound compare --- .../PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp index 20384f692b..b44ae419ee 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp @@ -81,7 +81,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return; } - if (this->searchQueue.currentDistance > maxDistance) { + if ((int)this->searchQueue.currentDistance > maxDistance) { return; } for (int _direction = 0; _direction < 8; _direction = _direction + 2) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index df8c72a642..bf0957463a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24877,7 +24877,7 @@ SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending SHC_3BB0A8C1_0x004A0E50 | 93.1% | Style pass, asm differs -SHC_3BB0A8C1_0x004A1230 | 59.4% | Style pass, asm differs +SHC_3BB0A8C1_0x004A1230 | 59.4% | signed queue-bound compare SHC_3BB0A8C1_0x004A1568 | 0.0% | Pending From c2ab1ab80a086f4423053ca7cb6e83e1fbee7b92 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:02 +0200 Subject: [PATCH 005/516] reimplement: SHC_3BB0A8C1_0x0049B5B0 66.87% Style pass, asm differs --- .../Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp index b86515024b..6ee06a5ccf 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp @@ -84,7 +84,7 @@ namespace Map { return; } this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; - if (this->searchQueue.currentDistance > distance) { + if ((int)this->searchQueue.currentDistance > distance) { return; } paiVar8 = DAT_TileMapState::instance.directionTranslationMatrix + iVar7; From 37596ab597ead38b9eacf4da9eed15c2b5794d7c Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:02 +0200 Subject: [PATCH 006/516] reimplement: SHC_3BB0A8C1_0x004A5320 16.06% Style pass, asm differs --- .../calculateCanPlayerUnitsNavigateToAreaFromArea.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index 8f01cc5304..dcfa767ee2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -47,7 +47,7 @@ namespace Map { || (DAT_GameState::instance.mapAndTime.playerTeams[this->climbData[iVar7].owner] == DAT_GameState::instance.mapAndTime.playerTeams[playerID])) || (DAT_BuildingsState::instance.buildings[this->climbData[iVar7].buildingID] - .field241_0x2c6 + .field239_0x2c6 != 0))) { aiStack_640[local_96c * 2 + 1] = 0; aiStack_640[local_96c * 2] = iVar7; From 9f97d851b50cd4d04b421808976c57e74ed684c6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:03 +0200 Subject: [PATCH 007/516] reimplement: SHC_3BB0A8C1_0x004A3B20 33.82% Style pass, asm differs --- .../Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index 53cb5f23e2..8c12e0d5f8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -85,7 +85,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return (undefined4)(0); } - if (this->searchQueue.currentDistance > param_2) { + if ((int)this->searchQueue.currentDistance > param_2) { return (undefined4)(0); } int uVar4 = (short)DAT_TileMapState::instance.UnitLayer[uVar1]; From 9c347981628a25eab10ade0d77616fe5850f4684 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:03 +0200 Subject: [PATCH 008/516] reimplement: SHC_3BB0A8C1_0x0049DB30 78.10% Style pass, asm differs --- .../checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp index 80fd4da2a0..36134f2433 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp @@ -97,7 +97,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return FALSE; } - if (12 < this->searchQueue.currentDistance) + if (12 < (int)this->searchQueue.currentDistance) break; for (int _direction = 0; _direction < 8; _direction = _direction + 2) { int _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; From 148f220ef599793b0c47ec7097aa63d5a0ed0c58 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:03 +0200 Subject: [PATCH 009/516] reimplement: SHC_3BB0A8C1_0x0049C690 71.86% Style pass, asm differs --- .../PathFindingState/computeTotalUnitsWithinDistance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp index 53194f8da3..8c715438da 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp @@ -83,7 +83,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return; } - if (this->searchQueue.currentDistance > distance) { + if ((int)this->searchQueue.currentDistance > distance) { return; } byte bVar1 = DAT_TileMapState::instance.PathLinkageLayer[uVar4]; From fab7d563846544f75f1821a15d7970f317a6241b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:04 +0200 Subject: [PATCH 010/516] reimplement: SHC_3BB0A8C1_0x0049EDF0 62.50% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp index 9fa8e56355..2686b1bda3 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp @@ -53,7 +53,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return FALSE; } - if (this->searchQueue.currentDistance > maxDistance) { + if ((int)this->searchQueue.currentDistance > maxDistance) { return FALSE; } for (int _direction = 0; _direction < 8; _direction = _direction + 1) { From dc8e7874f66fdbf579513286faa5e189239bab8b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:04 +0200 Subject: [PATCH 011/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 20.12% Style pass, asm differs --- .../findAppropriateLocationForSiegeTent.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index e05404c12c..2d59088a05 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -113,13 +113,13 @@ namespace Map { /* Safety check: if distance exceeds max tile count, abort */ - if (80400 < this->searchQueue.currentDistance) { + if (80400 < (int)this->searchQueue.currentDistance) { return (dword)(0); } /* If we've exceeded search radius, stop searching */ - if (this->searchQueue.currentDistance > distanceUnk) { + if ((int)this->searchQueue.currentDistance > distanceUnk) { return (dword)(0); } /* @@ -154,7 +154,7 @@ namespace Map { === SIEGE TENT PLACEMENT VALIDATION === Only check for valid placement if distance > 4 (minimum spacing requirement) */ - if (4 < this->searchQueue.currentDistance + if (4 < (int)this->searchQueue.currentDistance && (short)DAT_TileMapState::instance.UnitLayer[_offsetTile] == 0 && bVar2) { /* Get height of candidate tile diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bf0957463a..779df383a1 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24715,7 +24715,7 @@ SHC_3BB0A8C1_0x0049F2D0 | 78.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 78.8% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F7D0 | 19.7% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F7D0 | 20.1% | Style pass, asm differs SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending From 949768489729149c0fc0b5143c75d47c93f4445e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:04 +0200 Subject: [PATCH 012/516] reimplement: SHC_3BB0A8C1_0x004A6010 37.01% Style pass, asm differs --- .../findBestAttackTargetTileWithHeightAndOwner.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp index 2b6c9f88e7..aa4885324a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -88,7 +88,7 @@ namespace Map { uint uVar8 = DAT_TileMapState::instance.LogicLayer[uVar4]; uint uVar11 = (uint) * (byte*)(param_7 * 0x13a10 + 0x1ee2998 + uVar4); this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; - if (this->searchQueue.currentDistance <= param_1) { + if ((int)this->searchQueue.currentDistance <= param_1) { if ((DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY) && (7 < param_6)) { uVar11 = 1; @@ -113,9 +113,9 @@ namespace Map { if ((uVar8 & 0x400) == 0) { iVar9 = 0x4b; } - if (this->searchQueue.currentDistance < 1) { + if ((int)this->searchQueue.currentDistance < 1) { iVar9 = 100000; - } else if (this->searchQueue.currentDistance < 0x10) { + } else if ((int)this->searchQueue.currentDistance < 0x10) { iVar9 = (iVar9 + -100) * this->searchQueue.currentDistance + 0x5dc; } else { iVar9 = this->searchQueue.currentDistance * iVar9; @@ -126,16 +126,16 @@ namespace Map { && param_9 == 0) { iVar9 = (uint)DAT_TileMapState::instance.HeightLayer[uVar4] - (uint)DAT_TileMapState::instance.DefaultHeightLayer[uVar4]; - if (this->searchQueue.currentDistance < 1) { + if ((int)this->searchQueue.currentDistance < 1) { iVar9 = 100000; - } else if (this->searchQueue.currentDistance < 0x10) { + } else if ((int)this->searchQueue.currentDistance < 0x10) { iVar9 = (0x14 - this->searchQueue.currentDistance) * 300 + iVar9; } else { iVar9 = this->searchQueue.currentDistance * 100 + iVar9; } LAB_004a62e3: if (iVar9 < local_20 - && (iVar7 = MACRO_CALL(OpenSHC::Map::Navigation_Func::calcApproxEuclideanDistance)( + && (iVar7 = MACRO_CALL(OpenSHC::Map::Navigation_Func::CalcApproxEuclideanDistance)( param_2, (int)(sVar1), (int)(param_3), iVar6), iVar7 <= param_1)) { local_20 = iVar9; From 6c61c37275263dd53b63e32cebda92dfbde3cf5b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:05 +0200 Subject: [PATCH 013/516] reimplement: SHC_3BB0A8C1_0x004A58A0 14.55% Style pass, asm differs --- .../PathFindingState/findConnectingAreaBetweenTwoAreas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp index b8a53e3ec2..7ada68400b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp @@ -42,7 +42,7 @@ namespace Map { && ((param_1 == 0 || (DAT_GameState::instance.mapAndTime.playerTeams[piVar5[0x73]] == DAT_GameState::instance.mapAndTime.playerTeams[param_1])) - || (DAT_BuildingsState::instance.buildings[piVar5[-3]].field241_0x2c6 != 0))) { + || (DAT_BuildingsState::instance.buildings[piVar5[-3]].field239_0x2c6 != 0))) { aiStack_640[local_96c * 2 + 1] = 0; aiStack_640[local_96c * 2] = iVar6; local_96c = local_96c + 1; From 2a7918659901a3812cdb30c450335a2c1d9cf1d9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:05 +0200 Subject: [PATCH 014/516] reimplement: SHC_3BB0A8C1_0x004A0B20 65.16% Style pass, asm differs --- .../PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp index 870ab55175..5b8f9cb29a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp @@ -61,7 +61,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return local_c; } - if (this->searchQueue.currentDistance > param_4) { + if ((int)this->searchQueue.currentDistance > param_4) { return local_c; } for (int _direction = 0; _direction < 8; _direction = _direction + 1) { From ecf527faccb6a9e40444cfa73a3b10d9e81965d0 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:06 +0200 Subject: [PATCH 015/516] reimplement: SHC_3BB0A8C1_0x004A7F50 49.48% Style pass, asm differs --- ...eNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 322d2143a7..03d7035869 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -88,8 +88,8 @@ namespace Map { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if ((80400 < this->searchQueue.currentDistance) - || (this->searchQueue.currentDistance > _maxDistance)) + if ((80400 < (int)this->searchQueue.currentDistance) + || ((int)this->searchQueue.currentDistance > _maxDistance)) break; for (int _direction = 0; _direction < 8; _direction = _direction + 1) { _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; From 989982f5446d55d2e39f571589ac8703caaa81eb Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:06 +0200 Subject: [PATCH 016/516] reimplement: SHC_3BB0A8C1_0x0049B940 70.34% Style pass, asm differs --- .../findMapBorderEdgeTileAndStoreInSignpostData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp index 74986dd464..2cab62b19d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp @@ -57,7 +57,7 @@ namespace Map { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if (this->searchQueue.currentDistance > maxDistance) { + if ((int)this->searchQueue.currentDistance > maxDistance) { return; } _index = 0; From b1a4ca30f861ed9d5d80ff3af34354aa14cbb1a8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:06 +0200 Subject: [PATCH 017/516] reimplement: SHC_3BB0A8C1_0x004A0460 66.67% Style pass, asm differs --- .../PathFindingState/findNearestEnemyBuildingWithinDistance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp index b10b1d5d54..1ff1229c4f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp @@ -59,7 +59,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return 0; } - if (this->searchQueue.currentDistance > param_4) { + if ((int)this->searchQueue.currentDistance > param_4) { return 0; } for (int _direction = 0; _direction < 8; _direction = _direction + 1) { From 47b4b1934b95628275784c08b956d7547577bc22 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:07 +0200 Subject: [PATCH 018/516] reimplement: SHC_3BB0A8C1_0x004A06B0 60.09% Style pass, asm differs --- .../PathFindingState/findNearestEnemyUnitWithinDistance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp index d74bce332f..31949ce51c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp @@ -57,7 +57,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return 0; } - if (this->searchQueue.currentDistance > param_4) { + if ((int)this->searchQueue.currentDistance > param_4) { return 0; } for (int _direction = 0; _direction < 8; _direction = _direction + 1) { From 814c3a8c6afa12f0aa66fa26d9147e01bd5373e8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:07 +0200 Subject: [PATCH 019/516] reimplement: SHC_3BB0A8C1_0x0049C370 44.00% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findNoTreeInRange.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp index f843ef3f99..63409d5b31 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp @@ -56,7 +56,7 @@ namespace Map { while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _tile && (_tile < 0x13a10))) { this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if (this->searchQueue.currentDistance > budget) { + if ((int)this->searchQueue.currentDistance > budget) { return TRUE; } int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; From 86eb1e786c01e146a9f90d1c015d90dd867cccca Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:07 +0200 Subject: [PATCH 020/516] reimplement: SHC_3BB0A8C1_0x00498020 54.75% Style pass, asm differs --- .../findPathUsingClimbingWithHeightMargin16.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp index 45e3e49902..070ea6d058 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -92,7 +92,7 @@ namespace Map { int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if (0x78 < this->searchQueue.currentDistance) + if (0x78 < (int)this->searchQueue.currentDistance) break; uint _tHeight = (uint)DAT_TileMapState::instance.HeightLayer[_tile]; _tLogic = DAT_TileMapState::instance.LogicLayer[_tile]; From f29dbbdfeccc07a3119859b5b75543ccdfd96170 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:08 +0200 Subject: [PATCH 021/516] reimplement: SHC_3BB0A8C1_0x0049CE40 51.13% Style pass, asm differs --- .../findPathableTileWithoutUnitWithBuildingAtXY.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp index e243694b26..e959c18366 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp @@ -78,7 +78,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return; } - if (0x19 < this->searchQueue.currentDistance) { + if (0x19 < (int)this->searchQueue.currentDistance) { return; } for (int _direction = 0; _direction < 8; _direction = _direction + 2) { From 83e9e11dacd27ae2d581df6f955f2cf149273a43 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:08 +0200 Subject: [PATCH 022/516] reimplement: SHC_3BB0A8C1_0x004A1D30 65.67% Style pass, asm differs --- .../Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp index e0b6814933..4ebe9001d2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -60,7 +60,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return (undefined4)(0); } - if (this->searchQueue.currentDistance > param_4) { + if ((int)this->searchQueue.currentDistance > param_4) { return (undefined4)(0); } short sVar3 = DAT_TileMapState::instance.BuildingLayer[iVar5]; From 3a47ed629f482a9d57d8b395b42de3fad428918f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:08 +0200 Subject: [PATCH 023/516] reimplement: SHC_3BB0A8C1_0x004A36B0 40.93% Style pass, asm differs --- .../PathFindingState/healUnitsOfPlayerWithinRadius.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp index 0ea1bf7193..3cf8025494 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp @@ -56,7 +56,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return (undefined4)(0); } - if (this->searchQueue.currentDistance > param_2) { + if ((int)this->searchQueue.currentDistance > param_2) { return (undefined4)(0); } int uVar3 = (short)DAT_TileMapState::instance.UnitLayer[uVar4]; From d56a614587757547a6cae9329d85e3521ca95e2a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:09 +0200 Subject: [PATCH 024/516] reimplement: SHC_3BB0A8C1_0x004A2DD0 75.34% Style pass, asm differs --- .../PathFindingState/igniteFireAtTilesDistanceAway.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp index 0aaf6e7b7f..7b9caf019c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp @@ -55,7 +55,7 @@ namespace Map { int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; if ((0x13a10 < (int)this->searchQueue.currentDistance) - || (this->searchQueue.currentDistance > maxDistance)) + || ((int)this->searchQueue.currentDistance > maxDistance)) break; _tiles[_index] = _tile; _index = _index + 1; From d184f4cd145607e093cfd39c93933b17f7575abe Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:09 +0200 Subject: [PATCH 025/516] reimplement: SHC_3BB0A8C1_0x004A9200 44.59% Style pass, asm differs --- .../Navigation/PathFindingState/isOpponentBuildingInRange.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index 41a73e1796..c4c7c03f8f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -59,7 +59,7 @@ namespace Map { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if ((80400 < this->searchQueue.currentDistance) || (this->searchQueue.currentDistance > range)) + if ((80400 < (int)this->searchQueue.currentDistance) || ((int)this->searchQueue.currentDistance > range)) break; _buildingID = DAT_TileMapState::instance.BuildingLayer[_tile]; if (_buildingID != 0 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 779df383a1..a95375ebed 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25453,7 +25453,7 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 43.3% | Style pass, asm differs +SHC_3BB0A8C1_0x004A9200 | 44.6% | Style pass, asm differs SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented From b08838718aa902204f91632e633e9fa0ce2ad92d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:09 +0200 Subject: [PATCH 026/516] reimplement: SHC_3BB0A8C1_0x004A2650 64.83% Style pass, asm differs --- .../Navigation/PathFindingState/isSignPostWithinDistance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp index 06d552d127..766dbc8033 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp @@ -71,7 +71,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return FALSE; } - if (this->searchQueue.currentDistance > limit) { + if ((int)this->searchQueue.currentDistance > limit) { return FALSE; } if ((DAT_TileMapState::instance.BuildingLayer[iVar3] != 0) From 0cc6ccaed26296288e4d9a6055d697170ddd87af Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:10 +0200 Subject: [PATCH 027/516] reimplement: SHC_3BB0A8C1_0x0049FC00 56.46% Style pass, asm differs --- .../Map/Navigation/PathFindingState/pathFindingRelated.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp index 95dd8935d9..09cf4bf726 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -56,7 +56,7 @@ namespace Map { this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar5]; short sVar3 = this->searchQueue.yQueue[this->searchQueue.readIndex]; int iVar7 = (int)sVar3; - if ((0x13a10 < (int)this->searchQueue.currentDistance) || (this->searchQueue.currentDistance > param_1)) + if ((0x13a10 < (int)this->searchQueue.currentDistance) || ((int)this->searchQueue.currentDistance > param_1)) break; for (int iVar10 = 0; iVar10 < 8; iVar10 = iVar10 + 1) { if ((DAT_TileMapState::instance.PathLinkageLayer[uVar5] From 9ebcd72b673a9b6435931c8b23fb2e8c79384318 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:10 +0200 Subject: [PATCH 028/516] reimplement: SHC_3BB0A8C1_0x00498400 41.25% Style pass, asm differs --- .../PathFindingState/pathFindingWithBuildingsIncluded.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index 95f48e2524..73f70399a7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -120,7 +120,7 @@ namespace Map { _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_currentTile]; - if (400 < this->searchQueue.currentDistance) { + if (400 < (int)this->searchQueue.currentDistance) { return FALSE; } _buildingID = DAT_TileMapState::instance.BuildingLayer[_currentTile]; From 20f1b2218ba77da638873f0e299499a942f8214b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:10 +0200 Subject: [PATCH 029/516] reimplement: SHC_3BB0A8C1_0x004A79A0 37.76% Style pass, asm differs --- .../Map/Navigation/PathFindingState/pathPlanningForTribe.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index 87509cc9dd..eb453ef40e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -86,7 +86,7 @@ namespace Map { int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar11]; - if ((0x13a10 < (int)this->searchQueue.currentDistance) || (10 < this->searchQueue.currentDistance)) + if ((0x13a10 < (int)this->searchQueue.currentDistance) || (10 < (int)this->searchQueue.currentDistance)) break; for (int _direction = 0; _direction < 8; _direction = _direction + 1) { iVar12 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + uVar11; From 583ebb18c57a1761bbf8876d1cec073662f5b4c4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:11 +0200 Subject: [PATCH 030/516] reimplement: SHC_3BB0A8C1_0x004A8AB0 58.30% Style pass, asm differs --- .../Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp index a3c2621d63..3eb7c2c266 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp @@ -167,7 +167,7 @@ namespace Map { int sVar3 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar4 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar6]; - if ((0x13a10 < (int)this->searchQueue.currentDistance) || (this->searchQueue.currentDistance > param_1)) + if ((0x13a10 < (int)this->searchQueue.currentDistance) || ((int)this->searchQueue.currentDistance > param_1)) break; local_10 = this->searchQueue.tilesQueue + local_24; local_14 = this->searchQueue.yQueue + local_24; From a9b21fb9f442eb53650f6fbbb54e5dbda3df0b13 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:11 +0200 Subject: [PATCH 031/516] reimplement: SHC_3BB0A8C1_0x004A21B0 57.85% Style pass, asm differs --- .../placeCommemoratingStatueAtGoodLocation.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp index dc50908c56..09f7af8e4a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp @@ -85,7 +85,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return; } - if (0x14 < this->searchQueue.currentDistance) { + if (0x14 < (int)this->searchQueue.currentDistance) { return; } MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::checkBuildingCanBePlacedHere, @@ -183,7 +183,7 @@ namespace Map { return; } } - DAT_TileMapState::instance.field122_0x554930 = 1; + DAT_TileMapState::instance.skipPlacementCheck = 1; MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::placeBuilding, DAT_TileMapState::ptr)( playerID, (int)(sVar1), (int)(uVar7), commandBuildingType, 2, 0xf); iVar3 = DAT_TileMapState::instance.placedBuildingID; From d14fa2565469698553801afcb00538a4e415f13a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:11 +0200 Subject: [PATCH 032/516] reimplement: SHC_3BB0A8C1_0x0049A6D0 72.45% Style pass, asm differs --- src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp index fdb205e4b8..90acf5c17e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp @@ -47,7 +47,7 @@ namespace Map { int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[tile]; - if (this->searchQueue.currentDistance > maxDistance) + if ((int)this->searchQueue.currentDistance > maxDistance) break; MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::raiseLand, DAT_TileMapState::ptr)( tile, (uint)(sVar3), 4, 1); From 4cc948b1e8d89ef4b32c1ccc9801d1c036b6966d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:12 +0200 Subject: [PATCH 033/516] reimplement: SHC_3BB0A8C1_0x0049E510 90.79% Style pass, asm differs --- .../PathFindingState/recomputeALGPathFindingTileMapUnk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp index b9ef2e917b..7c0917c9bb 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp @@ -50,7 +50,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return; } - if (this->searchQueue.currentDistance > someMax) { + if ((int)this->searchQueue.currentDistance > someMax) { return; } for (int _direction = 0; _direction < 8; _direction = _direction + 4) { From 313abf2d40f59bd6cbcf29c78352aea1f6e80913 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:12 +0200 Subject: [PATCH 034/516] reimplement: SHC_3BB0A8C1_0x0049C020 60.97% Style pass, asm differs --- .../Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp index ffb2341d74..0954c39f61 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp @@ -60,7 +60,7 @@ namespace Map { if (0x13a10 < (int)this->searchQueue.currentDistance) { return (undefined4)(0); } - if (this->searchQueue.currentDistance > param_1) { + if ((int)this->searchQueue.currentDistance > param_1) { return (undefined4)(1); } int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; From 01eaeb64d54e5317684491c0a5da4a4639fc2f9d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:13 +0200 Subject: [PATCH 035/516] reimplement: SHC_3BB0A8C1_0x004A2A90 55.98% Style pass, asm differs --- .../spreadAlgorithmForFlagsAndBraziersUnk.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp index 6092077443..aa5f71f6f9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp @@ -78,10 +78,10 @@ namespace Map { local_4 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[tile]; - if (0x13a10 < this->searchQueue.currentDistance) { + if (0x13a10 < (int)this->searchQueue.currentDistance) { return (undefined4)(0); } - if (this->searchQueue.currentDistance > param_4) { + if ((int)this->searchQueue.currentDistance > param_4) { return (undefined4)(0); } iVar8 = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a95375ebed..49a45eaa79 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25185,7 +25185,7 @@ SHC_3BB0A8C1_0x004A2740 | 0.0% | Pending SHC_3BB0A8C1_0x004A27D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2A90 | 54.4% | Style pass, asm differs +SHC_3BB0A8C1_0x004A2A90 | 56.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A2B70 | 0.0% | Pending From bec3b4c6cbef127782be86e0b8db3321041422cb Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:13 +0200 Subject: [PATCH 036/516] reimplement: SHC_3BB0A8C1_0x0049E9E0 69.40% Style pass, asm differs --- .../PathFindingState/updateAIZoneWithFloodFill0x20.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp index aa2c994ae8..e5ad9f9913 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp @@ -45,7 +45,7 @@ namespace Map { short sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; short sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if (this->searchQueue.currentDistance > max) { + if ((int)this->searchQueue.currentDistance > max) { return; } int iVar3 = 0; From 23dadc9f3685c80a5ccacaff0ff07e997c91f285 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:25:13 +0200 Subject: [PATCH 037/516] reimplement: SHC_3BB0A8C1_0x0049AAD0 72.81% Style pass, asm differs --- .../Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp index 235a8b4ab9..349cb6bee6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -73,7 +73,7 @@ namespace Map { DAT_TileMapState::instance.someLimit = iVar5; } this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar3]; - if (this->searchQueue.currentDistance > param_1) + if ((int)this->searchQueue.currentDistance > param_1) break; piVar7 = DAT_TileMapState::instance.directionTranslationMatrix[iVar8] + 1; DAT_TileMapState::instance.ChangedLayer[uVar3] = 2; From 80cfce630d985b0394f7101b7af6f92ad65ac447 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:41:19 +0200 Subject: [PATCH 038/516] reimplement: SHC_3BB0A8C1_0x004A75B0 40.00% widened byte local --- .../Navigation/PathFindingState/pathfindingForAttacksUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp index f1ab2a4e72..33f82306a9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -48,7 +48,7 @@ namespace Map { int iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; uint uVar7 = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; iVar10 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; - byte bVar1 + int bVar1 = DAT_TileMapState::instance.DefaultHeightLayer[DAT_BuildingsState::instance.buildings[buildingID] .currentTilePositionAdjusted]; short sVar2 = DAT_TribesState::instance.tribes[tribeID].selectionTargetUnitID; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 49a45eaa79..b54e20fe23 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25299,7 +25299,7 @@ SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending SHC_3BB0A8C1_0x004A7090 | 89.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004A75B0 | 24.4% | Style pass, asm differs +SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte local SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs From 9eb405152ae71b4d432c37ae7f4d350031b80ec1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:41:19 +0200 Subject: [PATCH 039/516] reimplement: SHC_3BB0A8C1_0x004999C0 50.67% decoded Ghidra flag triple --- ...atePathLinkageLayerBasedOnBuildingsUnk.cpp | 41 +++++++------------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp index 0576716e3b..86c05b4dca 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp @@ -25,15 +25,13 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x004999C0 BOOLEnum PathFindingState::updatePathLinkageLayerBasedOnBuildingsUnk(int yUnk, int tile) { - byte bVar1; int iVar6; int (*paiVar8)[8]; uint _height; int _directionIndex; int _building; bool bVar9; - bool bVar10; - bool bVar11; + bool _skip; byte _linkageResult; BOOLEnum _result; int local_28; @@ -59,10 +57,10 @@ namespace Map { DAT_BuildingDefinedData::instance.BuildingIsKeepArray[(short)_buildingType] != 0)) { _result = TRUE; } - bool bVar2 = false; - bool bVar4 = false; - bool bVar3 = false; - bool bVar5 = false; + int bVar2 = 0; + int bVar4 = 0; + int bVar3 = 0; + int bVar5 = 0; byte bVar7 = 0; iVar6 = 0; _linkageResult = 0; @@ -71,14 +69,14 @@ namespace Map { if ((_logic & 0x10000000) == 0) { if ((_logic & 2) == 0 && (_logic & 0x200000) == 0) { if ((_logic & 0x800) != 0) { - bVar4 = true; + bVar4 = 1; goto LAB_00499ada; } if ((_logic & 0x400000) != 0) { return _result; } if ((_logic & 0x100) != 0) { - bVar3 = true; + bVar3 = 1; if (DAT_TileMapState::instance.BuildingLayer[tile] != 0) { iVar6 = 2; } @@ -88,9 +86,9 @@ namespace Map { return _result; } } - bVar5 = true; + bVar5 = 1; } else { - bVar2 = true; + bVar2 = 1; iVar6 = 1; } } @@ -153,34 +151,23 @@ namespace Map { if ((_logic & 0x100) == 0 || iVar6 == 0) { if (((bVar3) || (bVar4)) && (_logic & 0x100) != 0 && DAT_TileMapState::instance.BuildingLayer[_tile] != 0) { - bVar1 = DAT_TileMapState::instance.DamageLayer[tile]; - bVar11 = (bVar1 < '\x14'); - bVar10 = (char)(bVar1 - 0x14) < '\0'; - bVar9 = bVar1 == 0x14; + _skip = (char)DAT_TileMapState::instance.DamageLayer[tile] > 0x14; } else { _logic = (uint)DAT_TileMapState::instance.HeightLayer[_tile]; if ((int)_logic < local_28) goto LAB_00499c4b; - bVar11 = (_logic < local_24); - bVar10 = (int)(_logic - local_24) < 0; - bVar9 = _logic == local_24; + _skip = (int)_logic > (int)local_24; } } else { - bVar1 = DAT_TileMapState::instance.DamageLayer[_tile]; - bVar11 = (bVar1 < '\x14'); - bVar10 = (char)(bVar1 - 0x14) < '\0'; - bVar9 = bVar1 == 0x14; + _skip = (char)DAT_TileMapState::instance.DamageLayer[_tile] > 0x14; } LAB_00499c3f: - if (!bVar9 && bVar11 == bVar10) + if (_skip) goto LAB_00499c4b; } else if (!bVar2) { if (!bVar3) goto LAB_00499c4b; - bVar1 = DAT_TileMapState::instance.DamageLayer[tile]; - bVar11 = (bVar1 < '\x14'); - bVar10 = (char)(bVar1 - 0x14) < '\0'; - bVar9 = bVar1 == 0x14; + _skip = (char)DAT_TileMapState::instance.DamageLayer[tile] > 0x14; goto LAB_00499c3f; } _linkageResult = _linkageResult diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b54e20fe23..cba58bd17d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24389,7 +24389,7 @@ SHC_3BB0A8C1_0x004995E0 | 49.3% | Style pass, asm differs SHC_3BB0A8C1_0x00499970 | 0.0% | Pending -SHC_3BB0A8C1_0x004999C0 | 23.7% | Style pass, asm differs +SHC_3BB0A8C1_0x004999C0 | 50.7% | decoded Ghidra flag triple SHC_3BB0A8C1_0x00499DC0 | 42.9% | Style pass, asm differs From dc3d34c3fb2df9919b35b5cc9e9d1725cfdae1e3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 00:51:42 +0200 Subject: [PATCH 040/516] reimplement: SHC_3BB0A8C1_0x004A5320 16.25% single exit; needs Ghidra --- ...teCanPlayerUnitsNavigateToAreaFromArea.cpp | 90 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 44 insertions(+), 48 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index dcfa767ee2..052e48e273 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -68,7 +68,8 @@ namespace Map { dVar2 = this->climbData[iVar1].wallGroupAreaID; if ((dVar2 == fromArea) || (dVar3 = this->climbData[iVar1].buildingArea, dVar3 == fromArea)) { - return (int)(toArea); + fromArea = toArea; + goto LAB_ret; } adStack_960[iVar7] = dVar2; aiStack_640[iVar6 * 2 + 1] = 1; @@ -81,13 +82,13 @@ namespace Map { dVar3 = this->climbData[iVar1].wallGroupAreaID; if (dVar3 == toArea) { if (dVar2 == fromArea) { - this->field63_0xc0 = 0; - return (int)(toArea); + fromArea = toArea; + goto LAB_ret; } dVar3 = this->climbData[iVar1].buildingArea; if (dVar3 == fromArea) { - this->field63_0xc0 = 0; - return (int)(toArea); + fromArea = toArea; + goto LAB_ret; } adStack_960[iVar7] = dVar2; aiStack_640[iVar6 * 2 + 1] = 1; @@ -98,12 +99,12 @@ namespace Map { } } else if (this->climbData[iVar1].buildingArea == toArea) { if (dVar2 == fromArea) { - this->field63_0xc0 = 0; - return (int)(toArea); + fromArea = toArea; + goto LAB_ret; } if (dVar3 == fromArea) { - this->field63_0xc0 = 0; - return (int)(toArea); + fromArea = toArea; + goto LAB_ret; } adStack_960[iVar7] = dVar2; adStack_960[iVar7 + 1] = dVar3; @@ -132,13 +133,13 @@ namespace Map { if (dVar3 == dVar2) { dVar3 = this->climbData[iVar1].wallGroupAreaID; if (dVar3 == fromArea) { - this->field63_0xc0 = 0; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } dVar4 = this->climbData[iVar1].buildingArea; if (dVar4 == fromArea) { - this->field63_0xc0 = 0; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } adStack_960[iVar7] = dVar3; aiStack_640[iVar6 * 2 + 1] = 1; @@ -151,13 +152,13 @@ namespace Map { dVar4 = this->climbData[iVar1].wallGroupAreaID; if (dVar4 == dVar2) { if (dVar3 == fromArea) { - this->field63_0xc0 = 0; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } dVar4 = this->climbData[iVar1].buildingArea; if (dVar4 == fromArea) { - this->field63_0xc0 = 0; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } adStack_960[iVar7] = dVar3; aiStack_640[iVar6 * 2 + 1] = 1; @@ -169,12 +170,12 @@ namespace Map { } } else if (this->climbData[iVar1].buildingArea == dVar2) { if (dVar3 == fromArea) { - this->field63_0xc0 = 0; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } if (dVar4 == fromArea) { - this->field63_0xc0 = 0; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } adStack_960[iVar7] = dVar3; aiStack_640[iVar6 * 2 + 1] = 1; @@ -202,7 +203,8 @@ namespace Map { dVar2 = this->climbData[iVar1].wallGroupAreaID; if ((dVar2 == fromArea) || (dVar3 = this->climbData[iVar1].buildingArea, dVar3 == fromArea)) { - return (int)(toArea); + fromArea = toArea; + goto LAB_ret; } adStack_960[iVar7] = dVar2; aiStack_640[iVar6 * 2 + 1] = 1; @@ -215,15 +217,13 @@ namespace Map { dVar3 = this->climbData[iVar1].wallGroupAreaID; if (dVar3 == toArea) { if (dVar2 == fromArea) { - this->field50_0x98 = 1; - this->field63_0xc0 = 1; - return (int)(toArea); + fromArea = toArea; + goto LAB_ret; } dVar3 = this->climbData[iVar1].buildingArea; if (dVar3 == fromArea) { - this->field50_0x98 = 1; - this->field63_0xc0 = 1; - return (int)(toArea); + fromArea = toArea; + goto LAB_ret; } adStack_960[iVar7] = dVar2; aiStack_640[iVar6 * 2 + 1] = 1; @@ -236,7 +236,8 @@ namespace Map { iVar5 = iVar7; if (this->climbData[iVar1].buildingArea == toArea) { if ((dVar2 == fromArea) || (dVar3 == fromArea)) { - return (int)(toArea); + fromArea = toArea; + goto LAB_ret; } adStack_960[iVar7] = dVar2; adStack_960[iVar7 + 1] = dVar3; @@ -264,15 +265,13 @@ namespace Map { if (dVar3 == dVar2) { dVar3 = this->climbData[iVar1].wallGroupAreaID; if (dVar3 == fromArea) { - this->field50_0x98 = 1; - this->field63_0xc0 = 1; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } dVar4 = this->climbData[iVar1].buildingArea; if (dVar4 == fromArea) { - this->field50_0x98 = 1; - this->field63_0xc0 = 1; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } adStack_960[iVar5] = dVar3; aiStack_640[iVar6 * 2 + 1] = 1; @@ -285,15 +284,13 @@ namespace Map { dVar4 = this->climbData[iVar1].wallGroupAreaID; if (dVar4 == dVar2) { if (dVar3 == fromArea) { - this->field50_0x98 = 1; - this->field63_0xc0 = 1; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } dVar4 = this->climbData[iVar1].buildingArea; if (dVar4 == fromArea) { - this->field50_0x98 = 1; - this->field63_0xc0 = 1; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } adStack_960[iVar5] = dVar3; aiStack_640[iVar6 * 2 + 1] = 1; @@ -305,14 +302,12 @@ namespace Map { } } else if (this->climbData[iVar1].buildingArea == dVar2) { if (dVar3 == fromArea) { - this->field50_0x98 = 1; - this->field63_0xc0 = 1; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } if (dVar4 == fromArea) { - this->field50_0x98 = 1; - this->field63_0xc0 = 1; - return (int)(dVar2); + fromArea = dVar2; + goto LAB_ret; } adStack_960[iVar5] = dVar3; aiStack_640[iVar6 * 2 + 1] = 1; @@ -331,6 +326,7 @@ namespace Map { this->field50_0x98 = 0; fromArea = 0; } + LAB_ret: return (int)(fromArea); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index cba58bd17d..1f989e607a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25251,7 +25251,7 @@ SHC_3BB0A8C1_0x004A5230 | 0.0% | Pending SHC_3BB0A8C1_0x004A52D0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5320 | 16.1% | Style pass, asm differs +SHC_3BB0A8C1_0x004A5320 | 16.2% | single exit; needs Ghidra SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending From 211563c33259794a42653a79fb6f48c5f04f6d14 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:17 +0200 Subject: [PATCH 041/516] reimplement: SHC_3BB0A8C1_0x004A1230 58.98% norm +6.7, raw flat --- .../aggressiveStanceTargetBuildingAtRange.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp index b44ae419ee..f88be6b711 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp @@ -44,9 +44,9 @@ namespace Map { uint uVar7; int _nextCandidate; int _tile; - short sVar1 = DAT_UnitsState::instance.units[unitID].x; + int sVar1 = DAT_UnitsState::instance.units[unitID].x; uVar5 = (uint)sVar1; - short sVar2 = DAT_UnitsState::instance.units[unitID].y; + int sVar2 = DAT_UnitsState::instance.units[unitID].y; uVar7 = (uint)sVar2; this->calculations = this->calculations + 1; this->ALG_ResultTile = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 1f989e607a..36f2b40549 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24877,7 +24877,7 @@ SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending SHC_3BB0A8C1_0x004A0E50 | 93.1% | Style pass, asm differs -SHC_3BB0A8C1_0x004A1230 | 59.4% | signed queue-bound compare +SHC_3BB0A8C1_0x004A1230 | 59.0% | norm +6.7, raw flat SHC_3BB0A8C1_0x004A1568 | 0.0% | Pending From e601b82a485803cca97206d5a438ea2cdc33f9f8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:18 +0200 Subject: [PATCH 042/516] reimplement: SHC_3BB0A8C1_0x0049B5B0 69.91% widened short field local --- .../Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp index 6ee06a5ccf..21ee852166 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp @@ -71,7 +71,7 @@ namespace Map { return; } } - short sVar3 = DAT_TileMapState::instance.BuildingLayer[iVar4]; + int sVar3 = DAT_TileMapState::instance.BuildingLayer[iVar4]; if (sVar3 != 0 && (targetPlayerID == 0 || (targetPlayerID == DAT_BuildingsState::instance.buildings[sVar3].owner)) diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 36f2b40549..eec8feedad 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24423,7 +24423,7 @@ SHC_3BB0A8C1_0x0049B1D0 | 86.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049B2B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049B5B0 | 66.9% | Style pass, asm differs +SHC_3BB0A8C1_0x0049B5B0 | 69.9% | widened short field local SHC_3BB0A8C1_0x0049B6B0 | 0.0% | Pending From c117abb82a9c4a032e5e1145cf1bf1723cc0a4bf Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:18 +0200 Subject: [PATCH 043/516] reimplement: SHC_3BB0A8C1_0x0049F040 79.54% Style pass, asm differs --- .../PathFindingState/findArcherRelatedAttackInfoIndex.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp index 562374c8f4..fa51d26010 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp @@ -84,7 +84,7 @@ namespace Map { } DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)this->searchQueue.currentDistance + 1; - short sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar5] + int sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar5] .short_.xOffset; DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; From 95978df49f34607b4aa36c1b619482d1399b7a1f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:18 +0200 Subject: [PATCH 044/516] reimplement: SHC_3BB0A8C1_0x004A19B0 58.18% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findOwnedGatehouse.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp index 96207bddeb..c277c7cf60 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp @@ -52,8 +52,8 @@ namespace Map { if (0x13a0f < (int)_tile) { return (dword)(0); } - short sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; - short sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + int sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; if (0x13a10 < (int)this->searchQueue.currentDistance) { return (dword)(0); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index eec8feedad..f31540e0ce 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25163,7 +25163,7 @@ SHC_3BB0A8C1_0x004A19AD | 0.0% | Pending SHC_3BB0A8C1_0x004A19AE | 0.0% | Pending -SHC_3BB0A8C1_0x004A19B0 | 57.2% | Style pass, asm differs +SHC_3BB0A8C1_0x004A19B0 | 58.2% | Style pass, asm differs SHC_3BB0A8C1_0x004A1AF0 | 0.0% | Pending From 2cb4748f72278cfb5dfef87e57a79f2d00f54e49 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:19 +0200 Subject: [PATCH 045/516] reimplement: SHC_3BB0A8C1_0x00497B80 52.35% Style pass, asm differs --- .../PathFindingState/findSuitableSpawnLocationUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp index 88be5d1df9..b95497291f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp @@ -77,7 +77,7 @@ namespace Map { _result = 1; break; } - short _cCardinalDistance = _certainPath[_tile] + 1; + int _cCardinalDistance = _certainPath[_tile] + 1; int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; int _cLink = _linkage[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f31540e0ce..438e36c51a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24367,7 +24367,7 @@ SHC_3BB0A8C1_0x00497690 | 13.6% | Style pass, asm differs SHC_3BB0A8C1_0x00497740 | 49.2% | Style pass, asm differs -SHC_3BB0A8C1_0x00497B80 | 51.7% | Style pass, asm differs +SHC_3BB0A8C1_0x00497B80 | 52.4% | Style pass, asm differs SHC_3BB0A8C1_0x00498020 | 54.8% | Style pass, asm differs From a98fe66c1104db475439a04a0d404cf9d0c910f8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:19 +0200 Subject: [PATCH 046/516] reimplement: SHC_3BB0A8C1_0x0049F2D0 78.71% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findSupportPointIndex.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp index 8061efbb51..1c9dc8b050 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp @@ -75,7 +75,7 @@ namespace Map { } DAT_TileMapState::instance.CertainPathLayer[tile] = (short)this->searchQueue.currentDistance + 1; - short sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + int sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] .short_.xOffset; DAT_TileMapState::instance.WalkLayer[tile] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; From fcfc5652ba00bf5b4e0bde814cd331a38ba79a42 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:19 +0200 Subject: [PATCH 047/516] reimplement: SHC_3BB0A8C1_0x004A75B0 40.00% widened byte+short locals --- .../Navigation/PathFindingState/pathfindingForAttacksUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp index 33f82306a9..1a55741ea5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -51,7 +51,7 @@ namespace Map { int bVar1 = DAT_TileMapState::instance.DefaultHeightLayer[DAT_BuildingsState::instance.buildings[buildingID] .currentTilePositionAdjusted]; - short sVar2 = DAT_TribesState::instance.tribes[tribeID].selectionTargetUnitID; + int sVar2 = DAT_TribesState::instance.tribes[tribeID].selectionTargetUnitID; local_28 = 0; BOOLEnum BVar4 = MACRO_CALL_MEMBER( OpenSHC::Map::Units::TribesState_Func::isTribeAllAssassins, DAT_TribesState::ptr)(tribeID); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 438e36c51a..533781d81a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25299,7 +25299,7 @@ SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending SHC_3BB0A8C1_0x004A7090 | 89.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte local +SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte+short locals SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs From 0ba2dd65215638129137e63f23f59a54b3bd8525 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:20 +0200 Subject: [PATCH 048/516] reimplement: SHC_3BB0A8C1_0x004A21B0 81.50% widened short field locals --- .../placeCommemoratingStatueAtGoodLocation.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp index 09f7af8e4a..e37d77ef77 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp @@ -42,9 +42,9 @@ namespace Map { MappersEnum commandBuildingType; uint uVar7; uint uVar8; - short sVar1 = DAT_GameState::instance.playerDataArray[playerID].someKeepRelatedX2; + int sVar1 = DAT_GameState::instance.playerDataArray[playerID].someKeepRelatedX2; uVar7 = (uint)sVar1; - short sVar2 = DAT_GameState::instance.playerDataArray[playerID].someKeepRelatedY2; + int sVar2 = DAT_GameState::instance.playerDataArray[playerID].someKeepRelatedY2; uVar8 = (uint)sVar2; if (uVar7 > 399 || uVar8 > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar8 * 400 + uVar7] == '\0') { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 533781d81a..9b56681f2e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25175,7 +25175,7 @@ SHC_3BB0A8C1_0x004A1D30 | 65.7% | Style pass, asm differs SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending -SHC_3BB0A8C1_0x004A21B0 | 57.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A21B0 | 81.5% | widened short field locals SHC_3BB0A8C1_0x004A22C0 | 0.0% | Pending From 276dbb54530a1fb9fca0e4d189b5294edc3089d2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:20 +0200 Subject: [PATCH 049/516] reimplement: SHC_3BB0A8C1_0x004A97D0 21.54% Style pass, asm differs --- .../Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp index 652399b90d..b0602d09d5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp @@ -31,7 +31,7 @@ namespace Map { && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] != '\0') { uint tile = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; int iVar2 = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile; - short sVar1 = DAT_TileMapState::instance.WalkLayer[tile]; + int sVar1 = DAT_TileMapState::instance.WalkLayer[tile]; x2 = 0; this->field49_0x94 = 0; y = (int)DAT_TileMapState::instance.CertainPathLayer[tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9b56681f2e..9d0c1da274 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25465,7 +25465,7 @@ SHC_3BB0A8C1_0x004A96B0 | 0.0% | Pending SHC_3BB0A8C1_0x004A9760 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A97D0 | 20.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A97D0 | 21.5% | Style pass, asm differs SHC_3BB0A8C1_0x004A98C0 | 0.0% | Pending From 11dfe10d3bb2f7ca6b106905f7a079c6d4bf8207 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:20 +0200 Subject: [PATCH 050/516] reimplement: SHC_3BB0A8C1_0x0049A370 11.18% ebp frame via optimize(y,off) --- ...athPlanToDestinationViaUnoccupiedTiles.cpp | 61 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp index 125cf2da5c..0a55ce2ee4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp @@ -21,9 +21,24 @@ namespace Map { /* @return bool whether destination was reached decompilerscript: committed: 2025-01-30 21:57:43.216000 */ +#pragma optimize("y", off) // original keeps an ebp frame // FUNCTION: STRONGHOLDCRUSADER 0x0049A370 BOOLEnum PathFindingState::tracePathPlanToDestinationViaUnoccupiedTiles(uint x, uint y, uint destX, uint destY) { + byte* _pPathPlan; + int _budget; + int _direction; + uint _ppIndexInit; + uint _ppIndex; + Point8* _cardinal; + int* _dirMatrix; + uchar* _linkage; + uchar* _occupancy; + int _fireCount; + int _destTile; + uint _gen; + int _tile; + short* _walkLayer; if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } @@ -37,40 +52,30 @@ namespace Map { MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } - /* - The original keeps every layer base and both end points in its own stack slot for the - whole walk rather than reloading the globals, so they are locals here too. - */ - int _budget = 0; - uint _ppIndex = 0; - int _direction = 0; - uint _gen = (ushort)this->searchGeneration; - int _fireCount = DAT_EntityState::instance.fireCount; - short* _walkLayer = DAT_TileMapState::instance.WalkLayer; - uchar* _occupancy = DAT_TileMapState::instance.OccupancyLayer; - uchar* _linkage = DAT_TileMapState::instance.PathLinkageLayer; - int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; - Point8* _cardinal = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix; - int _tile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - int _destTile = DAT_ViewportRenderState::instance.translationMatrix[destY].addXgetTile + destX; - byte* _pPathPlan = this->searchQueue.ptrPathPlan; + _budget = 0; + _ppIndexInit = 0; + _direction = 0; + _gen = (ushort)this->searchGeneration; + _fireCount = DAT_EntityState::instance.fireCount; + _tile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + _destTile = DAT_ViewportRenderState::instance.translationMatrix[destY].addXgetTile + destX; + _occupancy = DAT_TileMapState::instance.OccupancyLayer; + _walkLayer = DAT_TileMapState::instance.WalkLayer; + _linkage = DAT_TileMapState::instance.PathLinkageLayer; + _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; + _cardinal = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix; _ppIndex = this->searchQueue.pathPlanIndex; + _pPathPlan = this->searchQueue.ptrPathPlan; while (true) { _budget = _budget + 1; if (399 < _budget) { break; } _walkLayer[_tile] = (short)_gen; - /* - tile2 matches tile ? - */ if (_tile == _destTile) { this->searchQueue.pathPlanIndex = _ppIndex; return TRUE; } - /* - tile is occupied and fire? - */ if (_fireCount != 0 && _occupancy[_tile] != '\0') { break; } @@ -107,21 +112,12 @@ namespace Map { _direction = 2; _canTraverseThisDirection = _canTraverseThisDirection & 4; } - /* - if cannot go any direction, stop - */ if (_canTraverseThisDirection == 0) { break; } - /* - update tile with new direction - */ _tile = _tile + _dirMatrix[y * 8 + _direction]; x = x + _cardinal[_direction].int_.xOffset; y = y + _cardinal[_direction].int_.yOffset; - /* - store direction in path plan - */ if ((_ppIndex & 1) == 0) { _pPathPlan[_ppIndex >> 1] = (byte)_direction; } else { @@ -133,5 +129,6 @@ namespace Map { return FALSE; } } +#pragma optimize("", on) } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9d0c1da274..82f68db3a1 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24399,7 +24399,7 @@ SHC_3BB0A8C1_0x0049A1C0 | 48.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049A2E0 | 25.9% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A370 | 8.5% | Style pass, asm differs +SHC_3BB0A8C1_0x0049A370 | 11.2% | ebp frame via optimize(y,off) SHC_3BB0A8C1_0x0049A5E0 | 78.3% | Style pass, asm differs From 623bd97c29b0f38f74c661e0ead5c21177c8fe23 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:15:21 +0200 Subject: [PATCH 051/516] reimplement: SHC_3BB0A8C1_0x004995E0 50.80% Style pass, asm differs --- .../Navigation/PathFindingState/updateSeparateAreaTileMap.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp index 8a5239f6d3..edd1d736e6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp @@ -59,8 +59,8 @@ namespace Map { int* _tilesQueue = this->searchQueue.tilesQueue; short* _yQueue = this->searchQueue.yQueue; int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; - short _areaID = 1; - short _row = 0; + int _areaID = 1; + int _row = 0; int* _rowEnd = &DAT_ViewportRenderState::instance.translationMatrix[1].firstTileOfRow; for (int _first = 0; _first < 80400; _first = _first + 1) { if (*_rowEnd <= _first) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 82f68db3a1..9fe74e1cbc 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24385,7 +24385,7 @@ SHC_3BB0A8C1_0x00498FD0 | 12.1% | Style pass, asm differs SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004995E0 | 49.3% | Style pass, asm differs +SHC_3BB0A8C1_0x004995E0 | 50.8% | Style pass, asm differs SHC_3BB0A8C1_0x00499970 | 0.0% | Pending From 5ff6146ce4972e5c56479a04b7336cbe99a2b25b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:28 +0200 Subject: [PATCH 052/516] reimplement: SHC_3BB0A8C1_0x004A5320 17.08% Style pass, asm differs --- .../calculateCanPlayerUnitsNavigateToAreaFromArea.cpp | 11 ++++------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index 052e48e273..620c97c0f4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -19,10 +19,7 @@ namespace Map { dword dVar2; dword dVar3; dword dVar4; - int iVar7; bool bVar8; - int local_96c; - int local_968; dword adStack_960[200]; int aiStack_640[400]; if (fromArea != toArea) { @@ -30,10 +27,10 @@ namespace Map { if ((toArea == 0) || (fromArea == 0)) { return 0; } - iVar7 = 1; + int iVar7 = 1; this->DAT_Test_likely = this->DAT_Test_likely + 1; - local_96c = 0; - local_968 = 0; + int local_96c = 0; + int local_968 = 0; for (iVar7 = 1; iVar7 < this->maxClimbDataCount; iVar7 = iVar7 + 1) { if (this->climbData[iVar7].canBeUsed == 1 && this->climbData[iVar7].isRecognizedByPathfinding != 0) { @@ -326,7 +323,7 @@ namespace Map { this->field50_0x98 = 0; fromArea = 0; } - LAB_ret: + LAB_ret: return (int)(fromArea); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9fe74e1cbc..24bb053c4e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25251,7 +25251,7 @@ SHC_3BB0A8C1_0x004A5230 | 0.0% | Pending SHC_3BB0A8C1_0x004A52D0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5320 | 16.2% | single exit; needs Ghidra +SHC_3BB0A8C1_0x004A5320 | 17.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending From 91eb431aaca039204221468c1b407aed7f1ccd68 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:28 +0200 Subject: [PATCH 053/516] reimplement: SHC_3BB0A8C1_0x00498A40 78.26% decompiler shape pass --- ...lculatePathKeepAndWallsGatesNotAllowed.cpp | 222 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 111 insertions(+), 113 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp index 25a2fb9229..bbf632ba45 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -66,130 +66,128 @@ namespace Map { int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; - int iVar3 = 0; - do { + for (int iVar3 = 0; iVar3 < 8; iVar3 = iVar3 + 4) { iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3] + _tile; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_tile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3]) - != 0 - && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 - || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) - || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 - && (DAT_BuildingDefinedData::instance - .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] - .buildingType] - != 0))))) { - DAT_TileMapState::instance.CertainPathLayer[iVar6] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] - .short_.xOffset - + sVar2; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] - .short_.yOffset - + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3 + 1] + _tile; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_tile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 1]) - != 0 - && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 - || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) - || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 - && (DAT_BuildingDefinedData::instance - .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] - .buildingType] - != 0))))) { - DAT_TileMapState::instance.CertainPathLayer[iVar6] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] - .short_.xOffset - + sVar2; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] - .short_.yOffset - + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 1]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3 + 2] + _tile; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_tile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 2]) - != 0 - && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 - || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) - || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 - && (DAT_BuildingDefinedData::instance - .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] - .buildingType] - != 0))))) { - DAT_TileMapState::instance.CertainPathLayer[iVar6] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] - .short_.xOffset - + sVar2; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] - .short_.yOffset - + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 2]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3 + 3] + _tile; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_tile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 3]) - != 0 - && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 - || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) - || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 - && (DAT_BuildingDefinedData::instance - .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] - .buildingType] - != 0))))) { - DAT_TileMapState::instance.CertainPathLayer[iVar6] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] - .short_.xOffset - + sVar2; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] - .short_.yOffset - + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 3]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; } - iVar3 = iVar3 + 4; - } while (iVar3 < 8); + } + } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; if (80400 < this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 24bb053c4e..0424e505a0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24377,7 +24377,7 @@ SHC_3BB0A8C1_0x00498400 | 41.2% | Style pass, asm differs SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00498A40 | 78.3% | Style pass, asm differs +SHC_3BB0A8C1_0x00498A40 | 78.3% | decompiler shape pass SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending From 9d0aeda0c8bec8fc0e61da9daa5b47d890a8e59c Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:29 +0200 Subject: [PATCH 054/516] reimplement: SHC_3BB0A8C1_0x0049C690 71.86% Style pass, asm differs --- .../computeTotalUnitsWithinDistance.cpp | 156 +++++++++--------- 1 file changed, 77 insertions(+), 79 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp index 8c715438da..9b25e59b17 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp @@ -87,101 +87,99 @@ namespace Map { return; } byte bVar1 = DAT_TileMapState::instance.PathLinkageLayer[uVar4]; - iVar6 = 0; - do { + for (int iVar6 = 0; iVar6 < 8; iVar6 = iVar6 + 4) { iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6] + uVar4; if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { - if (someLogicalTileProperty == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) - goto LAB_0049c880; - } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6] & bVar1) - != 0) { - LAB_0049c880: - DAT_TileMapState::instance.CertainPathLayer[iVar5] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] - .short_.yOffset - + sVar3; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + if (someLogicalTileProperty == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + goto LAB_0049c880; + } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6] & bVar1) + != 0) { + LAB_0049c880: + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (80400 < this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; } } + } iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6 + 1] + uVar4; if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { - if (someLogicalTileProperty == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) - goto LAB_0049c918; - } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 1] - & bVar1) - != 0) { - LAB_0049c918: - DAT_TileMapState::instance.CertainPathLayer[iVar5] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6 + 1] - .short_.yOffset - + sVar3; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + if (someLogicalTileProperty == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + goto LAB_0049c918; + } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 1] + & bVar1) + != 0) { + LAB_0049c918: + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6 + 1] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; } } + } iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6 + 2] + uVar4; if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { - if (someLogicalTileProperty == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) - goto LAB_0049c9b1; - } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 2] - & bVar1) - != 0) { - LAB_0049c9b1: - DAT_TileMapState::instance.CertainPathLayer[iVar5] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6 + 2] - .short_.yOffset - + sVar3; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + if (someLogicalTileProperty == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + goto LAB_0049c9b1; + } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 2] + & bVar1) + != 0) { + LAB_0049c9b1: + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6 + 2] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; } } + } iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6 + 3] + uVar4; if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { - if (someLogicalTileProperty == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) - goto LAB_0049ca4a; - } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 3] - & bVar1) - != 0) { - LAB_0049ca4a: - DAT_TileMapState::instance.CertainPathLayer[iVar5] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6 + 3] - .short_.yOffset - + sVar3; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + if (someLogicalTileProperty == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + goto LAB_0049ca4a; + } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 3] + & bVar1) + != 0) { + LAB_0049ca4a: + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6 + 3] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; } } - iVar6 = iVar6 + 4; - } while (iVar6 < 8); + } + } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; if (0x13a10 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; From fe3df9a3dbb61f91e0d51b08c1746f1cb707281e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:29 +0200 Subject: [PATCH 055/516] reimplement: SHC_3BB0A8C1_0x004A7F50 49.48% Style pass, asm differs --- ...eNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 03d7035869..ecd591756e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -88,8 +88,8 @@ namespace Map { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if ((80400 < (int)this->searchQueue.currentDistance) - || ((int)this->searchQueue.currentDistance > _maxDistance)) + if (80400 < (int)this->searchQueue.currentDistance + || (int)this->searchQueue.currentDistance > _maxDistance) break; for (int _direction = 0; _direction < 8; _direction = _direction + 1) { _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; From 3e89e4e91281c6624b397418354fc9cb9f7eb84a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:29 +0200 Subject: [PATCH 056/516] reimplement: SHC_3BB0A8C1_0x004A2DD0 75.34% Style pass, asm differs --- .../PathFindingState/igniteFireAtTilesDistanceAway.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp index 7b9caf019c..bf74f9bbce 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp @@ -54,8 +54,8 @@ namespace Map { int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if ((0x13a10 < (int)this->searchQueue.currentDistance) - || ((int)this->searchQueue.currentDistance > maxDistance)) + if (0x13a10 < (int)this->searchQueue.currentDistance + || (int)this->searchQueue.currentDistance > maxDistance) break; _tiles[_index] = _tile; _index = _index + 1; From 8380f41eaf724155d22c68a18e3603ad9d69378d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:30 +0200 Subject: [PATCH 057/516] reimplement: SHC_3BB0A8C1_0x004A9200 44.59% Style pass, asm differs --- .../Navigation/PathFindingState/isOpponentBuildingInRange.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index c4c7c03f8f..bd261b098e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -59,7 +59,8 @@ namespace Map { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if ((80400 < (int)this->searchQueue.currentDistance) || ((int)this->searchQueue.currentDistance > range)) + if (80400 < (int)this->searchQueue.currentDistance + || (int)this->searchQueue.currentDistance > range) break; _buildingID = DAT_TileMapState::instance.BuildingLayer[_tile]; if (_buildingID != 0 From c8034d54cff91ae001d06fbb2624006f172d0716 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:30 +0200 Subject: [PATCH 058/516] reimplement: SHC_3BB0A8C1_0x0049B1D0 86.24% Style pass, asm differs --- .../PathFindingState/pathFindingDeerAndLionsUnk.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp index 081291330f..ab80d0c756 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp @@ -28,8 +28,6 @@ namespace Map { int _neswTile3; int _neswTile4; int _currentTile; - int _currentX; - int _currentY; if (destinationX <= 399 && destinationY <= 399 && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[destinationY * 400 + destinationX] != '\0') { @@ -54,8 +52,8 @@ namespace Map { if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((_currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _currentTile && (_currentTile < 80400))) { - _currentX = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; - _currentY = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int _currentX = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int _currentY = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; if ((short)DAT_TileMapState::instance.PathConnectionLayer[_currentTile] == originArea) { this->climbX = (int)_currentX; this->climbY = (int)_currentY; From ef2f00c80a1b41cf18fe417b72d588b30420efb3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:30 +0200 Subject: [PATCH 059/516] reimplement: SHC_3BB0A8C1_0x0049FC00 56.46% Style pass, asm differs --- .../Map/Navigation/PathFindingState/pathFindingRelated.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp index 09cf4bf726..08d8f5f973 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -56,7 +56,8 @@ namespace Map { this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar5]; short sVar3 = this->searchQueue.yQueue[this->searchQueue.readIndex]; int iVar7 = (int)sVar3; - if ((0x13a10 < (int)this->searchQueue.currentDistance) || ((int)this->searchQueue.currentDistance > param_1)) + if (0x13a10 < (int)this->searchQueue.currentDistance + || (int)this->searchQueue.currentDistance > param_1) break; for (int iVar10 = 0; iVar10 < 8; iVar10 = iVar10 + 1) { if ((DAT_TileMapState::instance.PathLinkageLayer[uVar5] From c046958e5dde8210ffed7eff1f9134cf2284df98 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:31 +0200 Subject: [PATCH 060/516] reimplement: SHC_3BB0A8C1_0x00498400 41.25% Style pass, asm differs --- .../pathFindingWithBuildingsIncluded.cpp | 212 +++++++++--------- 1 file changed, 105 insertions(+), 107 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index 73f70399a7..b7e44d7cf8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -125,128 +125,126 @@ namespace Map { } _buildingID = DAT_TileMapState::instance.BuildingLayer[_currentTile]; _logical = DAT_TileMapState::instance.LogicLayer[_currentTile]; - int _direction = 0; - do { + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { _nextTileOption - = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] - + _currentTile; + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] + + _currentTile; /* 0x4a5014b1 == check against walkable tiles including keep, walls, and gatehouses */ if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration - && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) - != 0 - || (((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], - (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) - && (DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0)) - && ((uVar3 = _logical & 0x100, uVar3 == 0 || ((uVar1 & 0x100) == 0)))) - && ((uVar3 != 0 || ((uVar1 & 0x100) != 0))))))) { - DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] - .short_.xOffset - + _currentX; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] - .short_.yOffset - + _currentY; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) + != 0 + || (((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], + (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) + && (DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0)) + && ((uVar3 = _logical & 0x100, uVar3 == 0 || ((uVar1 & 0x100) == 0)))) + && ((uVar3 != 0 || ((uVar1 & 0x100) != 0))))))) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } _nextTileOption - = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 1] - + _currentTile; + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 1] + + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance - .BitFlagHelperForPathLinkage[_direction + 1]) - != 0) { - DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 1] - .short_.xOffset - + _currentX; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 1] - .short_.yOffset - + _currentY; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 1]) + != 0) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } _nextTileOption - = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 2] - + _currentTile; + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 2] + + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration - && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance - .BitFlagHelperForPathLinkage[_direction + 2]) - != 0 - || ((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], - (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) - && (DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0)) - && (((uVar3 = _logical & 0x100, uVar3 == 0 || ((uVar1 & 0x100) == 0)) - && ((uVar3 != 0 || ((uVar1 & 0x100) != 0))))))))) { - DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 2] - .short_.xOffset - + _currentX; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 2] - .short_.yOffset - + _currentY; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 2]) + != 0 + || ((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], + (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) + && (DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0)) + && (((uVar3 = _logical & 0x100, uVar3 == 0 || ((uVar1 & 0x100) == 0)) + && ((uVar3 != 0 || ((uVar1 & 0x100) != 0))))))))) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } _nextTileOption - = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 3] - + _currentTile; + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 3] + + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance - .BitFlagHelperForPathLinkage[_direction + 3]) - != 0) { - DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 3] - .short_.xOffset - + _currentX; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 3] - .short_.yOffset - + _currentY; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 3]) + != 0) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; } - _direction = _direction + 4; - } while (_direction < 8); + } + } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; if (0x13a10 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; From d29746d2a0ef27948196e295d60a6b58ea8d9a97 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:31 +0200 Subject: [PATCH 061/516] reimplement: SHC_3BB0A8C1_0x004A8AB0 58.30% Style pass, asm differs --- .../Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp index 3eb7c2c266..62bb104d31 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp @@ -167,7 +167,8 @@ namespace Map { int sVar3 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar4 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar6]; - if ((0x13a10 < (int)this->searchQueue.currentDistance) || ((int)this->searchQueue.currentDistance > param_1)) + if (0x13a10 < (int)this->searchQueue.currentDistance + || (int)this->searchQueue.currentDistance > param_1) break; local_10 = this->searchQueue.tilesQueue + local_24; local_14 = this->searchQueue.yQueue + local_24; From d475e5e610009c80df83a9f950bf5950bec1988d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:40:31 +0200 Subject: [PATCH 062/516] reimplement: SHC_3BB0A8C1_0x0049A5E0 78.26% Style pass, asm differs --- .../Navigation/PathFindingState/reverseCurrentPathPlan.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/reverseCurrentPathPlan.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/reverseCurrentPathPlan.cpp index 99156b5486..810511cb46 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/reverseCurrentPathPlan.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/reverseCurrentPathPlan.cpp @@ -12,8 +12,6 @@ namespace Map { { int bVar1; int bVar2; - uint _endIndex; - int _swapCounter; /* Index from start of path */ @@ -29,8 +27,8 @@ namespace Map { Calculate number of swaps needed (swap pairs from both ends toward center) Example: 8 elements = 4 swaps, 7 elements = 3 swaps */ - _swapCounter = (this->searchQueue.pathPlanIndex - 2 >> 1) + 1; - _endIndex = this->searchQueue.pathPlanIndex; + int _swapCounter = (this->searchQueue.pathPlanIndex - 2 >> 1) + 1; + uint _endIndex = this->searchQueue.pathPlanIndex; do { /* === SWAP LOOP: Exchange elements from both ends === === EXTRACT DIRECTION AT START (uVar3) === From 81bcc76456fd5c3c2f9179cc4e77d00cd44c4af2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:46 +0200 Subject: [PATCH 063/516] reimplement: SHC_3BB0A8C1_0x0049B5B0 70.52% Style pass, asm differs --- .../Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp index 21ee852166..57fb6c3a78 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp @@ -109,7 +109,7 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = *psVar6 + sVar2; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar7; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0424e505a0..0e20d15668 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24423,7 +24423,7 @@ SHC_3BB0A8C1_0x0049B1D0 | 86.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049B2B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049B5B0 | 69.9% | widened short field local +SHC_3BB0A8C1_0x0049B5B0 | 70.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049B6B0 | 0.0% | Pending From 891c9c68e6705b9f1951fdf3d50166e702bfb0cf Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:46 +0200 Subject: [PATCH 064/516] reimplement: SHC_3BB0A8C1_0x00498A40 78.61% Style pass, asm differs --- .../calculatePathKeepAndWallsGatesNotAllowed.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp index bbf632ba45..5fe2fee348 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -189,7 +189,7 @@ namespace Map { } } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (80400 < this->searchQueue.readIndex) { + if (80400 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; } if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0e20d15668..05199e4e1b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24377,7 +24377,7 @@ SHC_3BB0A8C1_0x00498400 | 41.2% | Style pass, asm differs SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00498A40 | 78.3% | decompiler shape pass +SHC_3BB0A8C1_0x00498A40 | 78.6% | Style pass, asm differs SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending From 0ee72631404abc74fe9f792b08184638e9cd5a8d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:46 +0200 Subject: [PATCH 065/516] reimplement: SHC_3BB0A8C1_0x004A3B20 34.11% Style pass, asm differs --- .../Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index 8c12e0d5f8..d55eedee71 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -230,7 +230,7 @@ namespace Map { } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (80400 < this->searchQueue.readIndex) { + if (80400 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; } if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 05199e4e1b..a5dc724b76 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 33.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A3B20 | 34.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From c0788b9d2fd0493d0c751b86ce866f6e6a986d53 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:47 +0200 Subject: [PATCH 066/516] reimplement: SHC_3BB0A8C1_0x004A4470 47.52% queue wrap off-by-one --- .../Map/Navigation/PathFindingState/computeAIZoneLayer.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp index 80590f66ea..c11f2d5014 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp @@ -135,7 +135,7 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = _directionOffset + _candidateY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _offsetTile; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) + if (80400 <= (int)this->searchQueue.writeIndex) goto LAB_004a4914; } _direction = _direction + 1; @@ -145,7 +145,7 @@ namespace Map { Move to next tile in queue */ this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (80400 < this->searchQueue.readIndex) { + if (80400 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; } /* diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a5dc724b76..4ea6a39044 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25221,7 +25221,7 @@ SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending SHC_3BB0A8C1_0x004A4140 | 83.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004A4470 | 47.1% | Style pass, asm differs +SHC_3BB0A8C1_0x004A4470 | 47.5% | queue wrap off-by-one SHC_3BB0A8C1_0x004A4500 | 0.0% | Pending From 652ae4ab42a69eb74bd670597dd6be83a7c70e21 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:47 +0200 Subject: [PATCH 067/516] reimplement: SHC_3BB0A8C1_0x0049C690 72.29% Style pass, asm differs --- .../PathFindingState/computeTotalUnitsWithinDistance.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp index 9b25e59b17..a864a1d465 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp @@ -105,7 +105,7 @@ namespace Map { + sVar3; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4ea6a39044..ff50ab89e2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24661,7 +24661,7 @@ SHC_3BB0A8C1_0x0049C4A0 | 0.0% | Pending SHC_3BB0A8C1_0x0049C5C0 | 37.6% | Style pass, asm differs -SHC_3BB0A8C1_0x0049C690 | 71.9% | Style pass, asm differs +SHC_3BB0A8C1_0x0049C690 | 72.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049C730 | 0.0% | Pending From 4c1871fc2412af44979f7921c65cd196173fe21e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:47 +0200 Subject: [PATCH 068/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 20.94% Style pass, asm differs --- .../PathFindingState/findAppropriateLocationForSiegeTent.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index 2d59088a05..977a3d142d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -302,7 +302,7 @@ namespace Map { Increment queue write position */ this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } @@ -318,7 +318,7 @@ namespace Map { === ADVANCE TO NEXT TILE IN QUEUE === */ this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (80400 < this->searchQueue.readIndex) { + if (80400 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; } /* diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ff50ab89e2..d1331bb3c9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24715,7 +24715,7 @@ SHC_3BB0A8C1_0x0049F2D0 | 78.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 78.8% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F7D0 | 20.1% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F7D0 | 20.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending From a291966910921d266fe3464836b7ef8066e3f20d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:48 +0200 Subject: [PATCH 069/516] reimplement: SHC_3BB0A8C1_0x004A9200 45.22% queue wrap off-by-one --- .../Navigation/PathFindingState/isOpponentBuildingInRange.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index bd261b098e..dce82149a8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -96,14 +96,14 @@ namespace Map { + _y; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _newTile; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (80400 < this->searchQueue.readIndex) { + if (80400 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; } if (this->searchQueue.readIndex == this->searchQueue.writeIndex) diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d1331bb3c9..9d68ab0fb7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25453,7 +25453,7 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 44.6% | Style pass, asm differs +SHC_3BB0A8C1_0x004A9200 | 45.2% | queue wrap off-by-one SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented From b4fc40fabe1af57a83e3dc91fe215c63b607beb8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:48 +0200 Subject: [PATCH 070/516] reimplement: SHC_3BB0A8C1_0x004A6520 100.00% Reimplemented --- .../Navigation/PathFindingState/storeDestinationOptionsUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/storeDestinationOptionsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/storeDestinationOptionsUnk.cpp index 2cbd686e75..13a96394f7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/storeDestinationOptionsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/storeDestinationOptionsUnk.cpp @@ -39,7 +39,7 @@ namespace Map { return; } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (80400 < this->searchQueue.readIndex) { + if (80400 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; } } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9d68ab0fb7..397432c1c5 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25275,7 +25275,7 @@ SHC_3BB0A8C1_0x004A6010 | 37.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending -SHC_3BB0A8C1_0x004A6520 | 95.7% | Style pass, asm differs +SHC_3BB0A8C1_0x004A6520 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A65E0 | 68.8% | Style pass, asm differs From a29aaba6accc98678eaa93713c93db04ba9b2fbf Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:48 +0200 Subject: [PATCH 071/516] reimplement: SHC_3BB0A8C1_0x0049AAD0 82.02% queue wrap off-by-one fixed --- .../Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp index 349cb6bee6..f6f4729921 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -90,7 +90,7 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = *psVar6 + sVar1; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar8; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 397432c1c5..aa16643814 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24409,7 +24409,7 @@ SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AAD0 | 72.8% | Style pass, asm differs +SHC_3BB0A8C1_0x0049AAD0 | 82.0% | queue wrap off-by-one fixed SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending From 96799b7da1b5bbb022c818ec6e1c1078be760fd9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 01:50:49 +0200 Subject: [PATCH 072/516] reimplement: SHC_3BB0A8C1_0x004A7090 91.94% queue wrap off-by-one --- .../updateWalkLayerAndAIPathCostLayer.cpp | 10 +++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp index 1614a31778..709f082518 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp @@ -102,7 +102,7 @@ namespace Map { Increment queue write position */ this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } @@ -122,7 +122,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } @@ -138,7 +138,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } @@ -154,7 +154,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } @@ -170,7 +170,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index aa16643814..ef5efd257b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25297,7 +25297,7 @@ SHC_3BB0A8C1_0x004A6DF0 | 78.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A7090 | 89.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A7090 | 91.9% | queue wrap off-by-one SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte+short locals From d8d18cbd7ef9207cae9f2342080ec9ec6914abe0 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:06 +0200 Subject: [PATCH 073/516] reimplement: SHC_3BB0A8C1_0x0049F540 79.54% tile bound off-by-one --- .../Map/Navigation/PathFindingState/algFindAttackAngle.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp index 48929bc68b..61744b697c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp @@ -90,7 +90,7 @@ namespace Map { + _yOption; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (80400 < (int)this->searchQueue.writeIndex) { + if (80400 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ef5efd257b..853a3a7730 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24713,7 +24713,7 @@ SHC_3BB0A8C1_0x0049F040 | 79.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049F2D0 | 78.7% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F540 | 78.8% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F540 | 79.5% | tile bound off-by-one SHC_3BB0A8C1_0x0049F7D0 | 20.9% | Style pass, asm differs From c8e80e63987b28b307905220fc75d74688b9ee5e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:07 +0200 Subject: [PATCH 074/516] reimplement: SHC_3BB0A8C1_0x0049DDC0 35.71% Style pass, asm differs --- .../PathFindingState/budgetFloodFillOnCertainPathLayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp index 532880dcf1..b16eac1e9d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp @@ -48,7 +48,7 @@ namespace Map { _tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; do { _tile = _tilesQueue[_readIndex]; - if (0x13a0f < _tile) { + if (0x13a10 <= _tile) { return; } if (budget <= _writeIndex) { From 82b0864c6bda47c8ac5f72a3b47a172d7db6e683 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:07 +0200 Subject: [PATCH 075/516] reimplement: SHC_3BB0A8C1_0x00498A40 78.26% Style pass, asm differs --- .../calculatePathKeepAndWallsGatesNotAllowed.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp index 5fe2fee348..a39ff5932e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -61,7 +61,7 @@ namespace Map { if (_tile == uVar4) { return (undefined4)(1); } - if ((maxTries <= this->searchQueue.readIndex) || (80399 < _tile)) + if ((maxTries <= this->searchQueue.readIndex) || (80400 <= _tile)) break; int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 853a3a7730..e8b9b1e119 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24377,7 +24377,7 @@ SHC_3BB0A8C1_0x00498400 | 41.2% | Style pass, asm differs SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00498A40 | 78.6% | Style pass, asm differs +SHC_3BB0A8C1_0x00498A40 | 78.3% | Style pass, asm differs SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending From 9bd67726db530929310c1e437d687fcc19e0ca21 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:07 +0200 Subject: [PATCH 076/516] reimplement: SHC_3BB0A8C1_0x004A6DF0 78.81% tile bound off-by-one --- .../PathFindingState/canNavigateFunctionReturnsArea.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp index 198d9d7b90..a51953d0b1 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp @@ -56,7 +56,7 @@ namespace Map { if (iVar3 < 0) { return 0; } - if (80400 < iVar3) { + if (80400 <= iVar3) { return 0; } int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e8b9b1e119..8c1ccb47e5 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25293,7 +25293,7 @@ SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending SHC_3BB0A8C1_0x004A6C40 | 0.0% | Pending -SHC_3BB0A8C1_0x004A6DF0 | 78.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A6DF0 | 78.8% | tile bound off-by-one SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending From 952ec7e689cc0d3c8e6c7658f3fee777afa9d6fc Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:08 +0200 Subject: [PATCH 077/516] reimplement: SHC_3BB0A8C1_0x0049DB30 78.83% Style pass, asm differs --- .../checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp index 36134f2433..7fcbbf28fb 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp @@ -65,7 +65,7 @@ namespace Map { if (_tile < 0) { return FALSE; } - if (0x13a0f < _tile) { + if (0x13a10 <= _tile) { return FALSE; } _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8c1ccb47e5..4abd7ddf81 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24693,7 +24693,7 @@ SHC_3BB0A8C1_0x0049D880 | 52.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending -SHC_3BB0A8C1_0x0049DB30 | 78.1% | Style pass, asm differs +SHC_3BB0A8C1_0x0049DB30 | 78.8% | Style pass, asm differs SHC_3BB0A8C1_0x0049DDC0 | 35.7% | Style pass, asm differs From f8b755628a46fefc8e6ae76d83cc577b97841da9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:08 +0200 Subject: [PATCH 078/516] reimplement: SHC_3BB0A8C1_0x004A6010 37.01% Style pass, asm differs --- .../findBestAttackTargetTileWithHeightAndOwner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp index aa4885324a..51ec2c7358 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -80,7 +80,7 @@ namespace Map { if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { uint uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if (0x13a0f < uVar4) + if (0x13a10 <= uVar4) break; int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; From 14976fd393fe2420feff79698c914a4a949c467e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:08 +0200 Subject: [PATCH 079/516] reimplement: SHC_3BB0A8C1_0x004A01D0 54.61% Style pass, asm differs --- .../PathFindingState/findBestAttackTileByPathCost.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp index d74032f5ac..ad5e0aa444 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp @@ -58,7 +58,7 @@ namespace Map { if (iVar3 < 0) { return (dword)(local_8); } - if (0x13a0f < iVar3) { + if (0x13a10 <= iVar3) { return (dword)(local_8); } int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; From 86b2e1947e8791e9b806d8ddd8341769d83efd1a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:09 +0200 Subject: [PATCH 080/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 27.81% Style pass, asm differs --- .../PathFindingState/findCrossAreaBridgeTileToTarget.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index bcf7984c18..c99545cc81 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -69,7 +69,7 @@ namespace Map { if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { uint uVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if (0x13a0f < uVar5) + if (0x13a10 <= uVar5) break; int sVar3 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar4 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; From 29a44669541f3f4bfb210c2b07659e948cd9a552 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:09 +0200 Subject: [PATCH 081/516] reimplement: SHC_3BB0A8C1_0x0049BBF0 49.80% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findFurthestSeaTile.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp index fd97d28a4e..d8d17bba2a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp @@ -49,7 +49,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { this->ALG_ResultTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if ((this->ALG_ResultTile < 0) || (0x13a0f < this->ALG_ResultTile)) + if ((this->ALG_ResultTile < 0) || (0x13a10 <= this->ALG_ResultTile)) break; _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4abd7ddf81..ab1bde3b21 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24435,7 +24435,7 @@ SHC_3BB0A8C1_0x0049BA30 | 0.0% | Pending SHC_3BB0A8C1_0x0049BA90 | 0.0% | Pending -SHC_3BB0A8C1_0x0049BBF0 | 49.0% | Style pass, asm differs +SHC_3BB0A8C1_0x0049BBF0 | 49.8% | Style pass, asm differs SHC_3BB0A8C1_0x0049BCD0 | 0.0% | Pending From 8cc752fb8688f64a463292bb1daf46e6291a1f8b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:09 +0200 Subject: [PATCH 082/516] reimplement: SHC_3BB0A8C1_0x004A19B0 58.18% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findOwnedGatehouse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp index c277c7cf60..8a25b62269 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp @@ -49,7 +49,7 @@ namespace Map { if ((int)_tile < 0) { return (dword)(0); } - if (0x13a0f < (int)_tile) { + if (0x13a10 <= (int)_tile) { return (dword)(0); } int sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; From eee3fefaf3063a0aa4207e7d1954231b351729d9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:10 +0200 Subject: [PATCH 083/516] reimplement: SHC_3BB0A8C1_0x00498020 54.75% Style pass, asm differs --- .../findPathUsingClimbingWithHeightMargin16.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp index 070ea6d058..cef993fcd5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -87,7 +87,7 @@ namespace Map { this->searchMatchCounter = this->searchMatchCounter + 1; return TRUE; } - if ((budget <= this->searchQueue.readIndex) || (0x13a0f < _tile)) + if ((budget <= this->searchQueue.readIndex) || (0x13a10 <= _tile)) break; int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; From 98344ee566e0a5c9765c9d1cfd1b29e21ceefaf8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:10 +0200 Subject: [PATCH 084/516] reimplement: SHC_3BB0A8C1_0x0049B1D0 86.77% queue wrap off-by-one --- .../Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp index ab80d0c756..34b1db3c27 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp @@ -159,7 +159,7 @@ namespace Map { } } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (80400 < (int)this->searchQueue.readIndex) { + if (80400 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; } /* diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ab1bde3b21..de84b1ff51 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24419,7 +24419,7 @@ SHC_3BB0A8C1_0x0049B000 | 0.0% | Pending SHC_3BB0A8C1_0x0049B1C0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x0049B1D0 | 86.2% | Style pass, asm differs +SHC_3BB0A8C1_0x0049B1D0 | 86.8% | queue wrap off-by-one SHC_3BB0A8C1_0x0049B2B0 | 0.0% | Pending From fb8183a212d33cfa01ada6bc7583ee55e1fe1f90 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:11 +0200 Subject: [PATCH 085/516] reimplement: SHC_3BB0A8C1_0x004A4140 84.96% bound literal from asm --- .../PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp index b67e9a4273..74fe7216e5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp @@ -52,7 +52,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { int _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if ((_currentTile < 0) || (0x13a0f < _currentTile)) { + if ((_currentTile < 0) || (0x13a10 <= _currentTile)) { return FALSE; } int _currentX = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index de84b1ff51..186a516d72 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25219,7 +25219,7 @@ SHC_3BB0A8C1_0x004A3B20 | 34.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending -SHC_3BB0A8C1_0x004A4140 | 83.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A4140 | 85.0% | bound literal from asm SHC_3BB0A8C1_0x004A4470 | 47.5% | queue wrap off-by-one From d859209fbd22af7aa31e32a0e8522925a081914a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:11 +0200 Subject: [PATCH 086/516] reimplement: SHC_3BB0A8C1_0x00498400 41.25% Style pass, asm differs --- .../PathFindingState/pathFindingWithBuildingsIncluded.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index b7e44d7cf8..9cc4516fe9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -114,7 +114,7 @@ namespace Map { if (_currentTile == _tile2) { return TRUE; } - if ((maxOptionsToTry <= this->searchQueue.readIndex) || (80399 < _currentTile)) + if ((maxOptionsToTry <= this->searchQueue.readIndex) || (80400 <= _currentTile)) break; _currentX = this->searchQueue.xQueue[this->searchQueue.readIndex]; _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; From 05a7092d86129a3c5d2b4b925b266ce68c5422b1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:11 +0200 Subject: [PATCH 087/516] reimplement: SHC_3BB0A8C1_0x0049FF20 65.31% Style pass, asm differs --- .../Navigation/PathFindingState/pathfindingRelated49ff20.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp index d897fc5ada..4812f05ea5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp @@ -53,7 +53,7 @@ namespace Map { if (iVar3 < 0) { return (dword)(local_8); } - if (0x13a0f < iVar3) { + if (0x13a10 <= iVar3) { return (dword)(local_8); } int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; From 5ac0f5b290f5b7132e2125e0f6960d53650571c7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:12 +0200 Subject: [PATCH 088/516] reimplement: SHC_3BB0A8C1_0x004A21B0 81.91% Style pass, asm differs --- .../PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp index e37d77ef77..0a479cbebe 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp @@ -75,7 +75,7 @@ namespace Map { if (iVar3 < 0) { return; } - if (0x13a0f < iVar3) { + if (0x13a10 <= iVar3) { return; } sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 186a516d72..d80978be6b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25175,7 +25175,7 @@ SHC_3BB0A8C1_0x004A1D30 | 65.7% | Style pass, asm differs SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending -SHC_3BB0A8C1_0x004A21B0 | 81.5% | widened short field locals +SHC_3BB0A8C1_0x004A21B0 | 81.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A22C0 | 0.0% | Pending From 1fc0597bfaf15107f9b7ef45f1cd794138e14534 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:12 +0200 Subject: [PATCH 089/516] reimplement: SHC_3BB0A8C1_0x0049D640 77.97% bound literal from asm --- .../PathFindingState/someBinaryAlgFunctionPathFinding.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp index 1950539b2f..b14cd0afda 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp @@ -45,7 +45,7 @@ namespace Map { if (iVar4 < 0) { return (undefined4)(1); } - if (0x13a0f < iVar4) { + if (0x13a10 <= iVar4) { return (undefined4)(1); } int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d80978be6b..e2392f1584 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24687,7 +24687,7 @@ SHC_3BB0A8C1_0x0049D470 | 0.0% | Pending SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D640 | 77.1% | Style pass, asm differs +SHC_3BB0A8C1_0x0049D640 | 78.0% | bound literal from asm SHC_3BB0A8C1_0x0049D880 | 52.4% | Style pass, asm differs From 7b963c52ef1e2e8df4871080b3a47f44ed96b94d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:12 +0200 Subject: [PATCH 090/516] reimplement: SHC_3BB0A8C1_0x004A16C0 90.87% Style pass, asm differs --- .../tracePathToFriendlyDefensesAndReturnTileUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp index 1dfc29b4cb..de723fccdc 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp @@ -48,7 +48,7 @@ namespace Map { if (_candidateTile < 0) { return 0; } - if (0x13a0f < _candidateTile) { + if (0x13a10 <= _candidateTile) { return 0; } int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e2392f1584..32f29e4abf 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25013,7 +25013,7 @@ SHC_3BB0A8C1_0x004A15AF | 0.0% | Pending SHC_3BB0A8C1_0x004A15B0 | 28.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A16C0 | 90.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A16C0 | 90.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A1800 | 0.0% | Pending From 4e4ea059477fc6359f16e587dd6fdee798e3f435 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:03:13 +0200 Subject: [PATCH 091/516] reimplement: SHC_3BB0A8C1_0x004A7090 91.13% Style pass, asm differs --- .../PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp index 709f082518..bdb9fdf25b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp @@ -190,7 +190,7 @@ namespace Map { /* Bounds check */ - if (0x13a0f < _tile2) { + if (0x13a10 <= _tile2) { return; } /* diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 32f29e4abf..c098aa7014 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25297,7 +25297,7 @@ SHC_3BB0A8C1_0x004A6DF0 | 78.8% | tile bound off-by-one SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A7090 | 91.9% | queue wrap off-by-one +SHC_3BB0A8C1_0x004A7090 | 91.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte+short locals From 3aadd28d7a0ea2acb56d58d857f7ea2d110d32ef Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:14:23 +0200 Subject: [PATCH 092/516] reimplement: SHC_3BB0A8C1_0x004A7F50 49.48% unsigned range test --- ...aceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index ecd591756e..585c9baaf3 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -158,7 +158,7 @@ namespace Map { .buildings[DAT_TileMapState::instance.BuildingLayer[_candidate2]] .buildingType, _buildingType != OpenSHC::Map::Buildings::BT_STOCKPILE - && (2 < _buildingType - OpenSHC::Map::Buildings::BT_MANORHOUSE)))) + && (2 < (uint)(_buildingType - OpenSHC::Map::Buildings::BT_MANORHOUSE))))) && DAT_GameState::instance.mapAndTime .playerTeams[(DAT_TileMapState::instance.WallOwnerLayer[_candidate2] & 7) + 1] != DAT_GameState::instance.mapAndTime.playerTeams[playerID]) diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c098aa7014..bdb75b75de 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25303,7 +25303,7 @@ SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte+short locals SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A7F50 | 49.5% | Style pass, asm differs +SHC_3BB0A8C1_0x004A7F50 | 49.5% | unsigned range test SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending From e27220e669e7eee1a686de167b753012fcee72a0 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:14:23 +0200 Subject: [PATCH 093/516] reimplement: SHC_3BB0A8C1_0x004A4140 84.96% unsigned range test --- .../pathFindingToAttackCastleIncludingMoat.cpp | 8 ++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp index 74fe7216e5..0e1032dbbf 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp @@ -81,10 +81,10 @@ namespace Map { continue; } if ((DAT_TileMapState::instance.BuildingLayer[_nextTile] != 0) - && (2 < (int)(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[_nextTile]] - .buildingType - - 0x4a)) { + && (2 < (uint)((short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_nextTile]] + .buildingType + - 0x4a))) { continue; } if ((DAT_TileMapState::instance.LogicLayer[_nextTile] & 0x40000000) != 0) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bdb75b75de..7661afa57e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25219,7 +25219,7 @@ SHC_3BB0A8C1_0x004A3B20 | 34.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending -SHC_3BB0A8C1_0x004A4140 | 85.0% | bound literal from asm +SHC_3BB0A8C1_0x004A4140 | 85.0% | unsigned range test SHC_3BB0A8C1_0x004A4470 | 47.5% | queue wrap off-by-one From 9c82b7357a35a7945786c42a59b98a7e8be44a82 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:14:24 +0200 Subject: [PATCH 094/516] reimplement: SHC_3BB0A8C1_0x004A79A0 37.76% signed writeIndex compare --- .../Map/Navigation/PathFindingState/pathPlanningForTribe.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index eb453ef40e..de6abe8334 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -179,7 +179,7 @@ namespace Map { goto LAB_004a7e8c; } this->searchQueue.readIndex = 0; - if (0 < this->searchQueue.writeIndex) { + if (0 < (int)this->searchQueue.writeIndex) { _pDest2 = &((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_destIndex].tile2OrAHelper; do { @@ -224,7 +224,7 @@ namespace Map { } LAB_004a7e8c: this->searchQueue.readIndex = 0; - if (0 < this->searchQueue.writeIndex) { + if (0 < (int)this->searchQueue.writeIndex) { _pDest3 = &((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_destIndex].tile2OrAHelper; do { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7661afa57e..0647eeff16 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 91.1% | Style pass, asm differs SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte+short locals -SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A79A0 | 37.8% | signed writeIndex compare SHC_3BB0A8C1_0x004A7F50 | 49.5% | unsigned range test From cd73c253f01d68ee14a0653625c0d86245b9f020 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:14:24 +0200 Subject: [PATCH 095/516] reimplement: SHC_3BB0A8C1_0x0049AAD0 82.89% signed bbox compares --- .../PathFindingState/updateWalkAndPathLayer.cpp | 8 ++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp index f6f4729921..bcafedce9b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -60,16 +60,16 @@ namespace Map { int iVar4 = (int)sVar2 / 10; int iVar5 = iVar8 / 10; *(undefined1*)(iVar4 + 0x1f93438 + iVar5 * 0x28) = 2; - if (iVar4 < DAT_TileMapState::instance.someYLike) { + if (iVar4 < (int)DAT_TileMapState::instance.someYLike) { DAT_TileMapState::instance.someYLike = iVar4; } - if (DAT_TileMapState::instance.someYLikeLimit < iVar4) { + if ((int)DAT_TileMapState::instance.someYLikeLimit < iVar4) { DAT_TileMapState::instance.someYLikeLimit = iVar4; } - if (iVar5 < DAT_TileMapState::instance.someIndex) { + if (iVar5 < (int)DAT_TileMapState::instance.someIndex) { DAT_TileMapState::instance.someIndex = iVar5; } - if (DAT_TileMapState::instance.someLimit < iVar5) { + if ((int)DAT_TileMapState::instance.someLimit < iVar5) { DAT_TileMapState::instance.someLimit = iVar5; } this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar3]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0647eeff16..350f029018 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24409,7 +24409,7 @@ SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AAD0 | 82.0% | queue wrap off-by-one fixed +SHC_3BB0A8C1_0x0049AAD0 | 82.9% | signed bbox compares SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending From b6e4a35a74ae23afea792f6930cbc47a65f0f75e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:14:24 +0200 Subject: [PATCH 096/516] reimplement: SHC_3BB0A8C1_0x004A7090 91.53% signed index compare --- .../PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp index bdb9fdf25b..3338ddb5a6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp @@ -227,7 +227,7 @@ namespace Map { this)(playerID, (dword)((int)(fromArea)), (dword)((int)((short)DAT_TileMapState::instance.PathConnectionLayer[_tile2])), 0), _canNav != 0) - && DAT_AICState::instance.aiBorderTilesIndex < 1000) { + && (int)DAT_AICState::instance.aiBorderTilesIndex < 1000) { /* Add to candidate array (likely used by AI for strategic placement decisions) */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 350f029018..c81f0d4e0c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25297,7 +25297,7 @@ SHC_3BB0A8C1_0x004A6DF0 | 78.8% | tile bound off-by-one SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A7090 | 91.1% | Style pass, asm differs +SHC_3BB0A8C1_0x004A7090 | 91.5% | signed index compare SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte+short locals From 852ac7a5cc68e10a2d6184001240b36ef23dc662 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:22:39 +0200 Subject: [PATCH 097/516] reimplement: SHC_3BB0A8C1_0x004A0E50 94.91% reuse computed start tile --- .../setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp index 7f08518948..b344fda19d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp @@ -41,9 +41,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = 2; this->searchQueue.xQueue[0] = 198; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[2].addXgetTile + 0xc6; - DAT_TileMapState::instance - .CertainPathLayer[DAT_ViewportRenderState::instance.translationMatrix[2].addXgetTile + 0xc6] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[2].addXgetTile + 0xc6; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { uint uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c81f0d4e0c..6d706ac282 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24875,7 +24875,7 @@ SHC_3BB0A8C1_0x004A0E4A | 0.0% | Pending SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending -SHC_3BB0A8C1_0x004A0E50 | 93.1% | Style pass, asm differs +SHC_3BB0A8C1_0x004A0E50 | 94.9% | reuse computed start tile SHC_3BB0A8C1_0x004A1230 | 59.0% | norm +6.7, raw flat From 53bacc08e03fe78c24cab731139a879e26535a14 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:31:04 +0200 Subject: [PATCH 098/516] reimplement: SHC_3BB0A8C1_0x004A9680 95.83% dropped no-op load/store --- .../Navigation/PathFindingState/updateClimbData.cpp | 11 +++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp index 2e371a7cb7..4375a24210 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp @@ -30,13 +30,12 @@ namespace Map { if (this->climbData[DAT_CurrentClimbDataID::instance].canBeUsed == 0) { MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::clearClimbData, this)( DAT_CurrentClimbDataID::instance); - iVar1 = this->debugGreatestClimbLoading; - } else { - this->numberOfClimbTeleports = this->numberOfClimbTeleports + 1; - iVar1 = this->climbData[DAT_CurrentClimbDataID::instance].numberOfUnitsUsing; - if (iVar1 <= this->debugGreatestClimbLoading) - goto LAB_004a9740; + goto LAB_004a9740; } + this->numberOfClimbTeleports = this->numberOfClimbTeleports + 1; + iVar1 = this->climbData[DAT_CurrentClimbDataID::instance].numberOfUnitsUsing; + if (iVar1 <= this->debugGreatestClimbLoading) + goto LAB_004a9740; this->debugGreatestClimbLoading = iVar1; } LAB_004a9740: diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6d706ac282..d8de12382f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25459,7 +25459,7 @@ SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A9510 | 54.0% | Style pass, asm differs -SHC_3BB0A8C1_0x004A9680 | 84.5% | Style pass, asm differs +SHC_3BB0A8C1_0x004A9680 | 95.8% | dropped no-op load/store SHC_3BB0A8C1_0x004A96B0 | 0.0% | Pending From 870c560e0df4ad20fd7ff8558ec5b189648da51c Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:31:04 +0200 Subject: [PATCH 099/516] reimplement: SHC_3BB0A8C1_0x004A5F90 100.00% Reimplemented --- .../updatePathLinkagesInAllEightDirections.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp index d4ad416065..967053e054 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp @@ -30,10 +30,12 @@ namespace Map { OpenSHC::Map::Navigation::PathFindingState_Func::updatePathLinkageLayerBasedOnBuildingsUnk, this)( y, tile); for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + int _nextTile = DAT_TileMapState::instance.directionTranslationMatrix[y][_direction] + tile; + int _nextY + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.yOffset + y; BOOLEnum _tileIsKeepUnk = MACRO_CALL_MEMBER( OpenSHC::Map::Navigation::PathFindingState_Func::updatePathLinkageLayerBasedOnBuildingsUnk, this)( - DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.yOffset + y, - DAT_TileMapState::instance.directionTranslationMatrix[y][_direction] + tile); + _nextY, _nextTile); if (_tileIsKeepUnk != FALSE) { _someLinkageResult = 1; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d8de12382f..8749a49edc 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25269,7 +25269,7 @@ SHC_3BB0A8C1_0x004A5DA0 | 76.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5F90 | 82.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A5F90 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A6010 | 37.0% | Style pass, asm differs From 3d783fba5f600d08816fa9b9eb7f1922b2284ecc Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:14 +0200 Subject: [PATCH 100/516] reimplement: SHC_3BB0A8C1_0x004A3B20 34.69% Style pass, asm differs --- .../Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index d55eedee71..d255d7cfa1 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -78,7 +78,7 @@ namespace Map { local_8 = OpenSHC::Map::Entities::ET_CATAPULT; } if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (uVar1 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar1 < 0x13a10) { + while (uVar1 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar1 <= 0x13a0f) { int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar1]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8749a49edc..1fbb53ed6e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 34.1% | Style pass, asm differs +SHC_3BB0A8C1_0x004A3B20 | 34.7% | Style pass, asm differs SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From 7bd5d99ba5a659aea8c15e446a5f76c90ace3907 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:14 +0200 Subject: [PATCH 101/516] reimplement: SHC_3BB0A8C1_0x0049C690 72.29% Style pass, asm differs --- .../PathFindingState/computeTotalUnitsWithinDistance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp index a864a1d465..d00969fe75 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp @@ -49,7 +49,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[tile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar4 < 0x13a10) { + while (uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar4 <= 0x13a0f) { int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; int uVar2 = (short)DAT_TileMapState::instance.UnitLayer[uVar4]; while (iVar6 = (int)(short)uVar2, iVar6 != 0) { From 726598bf0e9265b230ff454e3db9905a334582d5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:15 +0200 Subject: [PATCH 102/516] reimplement: SHC_3BB0A8C1_0x004A9510 53.97% loop bound off-by-one --- src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp index 32c170fcbc..3b569fec78 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp @@ -23,7 +23,7 @@ namespace Map { pCVar1 = this->climbData; while (pCVar1 = pCVar1 + 1, pCVar1->canBeUsed != 0) { _climbID = _climbID + 1; - if (199 < _climbID) { + if (200 <= _climbID) { return 0; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 1fbb53ed6e..84cd70d966 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25457,7 +25457,7 @@ SHC_3BB0A8C1_0x004A9200 | 45.2% | queue wrap off-by-one SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A9510 | 54.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A9510 | 54.0% | loop bound off-by-one SHC_3BB0A8C1_0x004A9680 | 95.8% | dropped no-op load/store From ce3c98f3dc374f6bf230228670b8d66cdbf716fa Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:15 +0200 Subject: [PATCH 103/516] reimplement: SHC_3BB0A8C1_0x004A7F50 49.90% Style pass, asm differs --- ...aceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 585c9baaf3..7277688d20 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -84,7 +84,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[tile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile < 0x13a10) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile <= 0x13a0f) { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 84cd70d966..ada5b76f9c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25303,7 +25303,7 @@ SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte+short locals SHC_3BB0A8C1_0x004A79A0 | 37.8% | signed writeIndex compare -SHC_3BB0A8C1_0x004A7F50 | 49.5% | unsigned range test +SHC_3BB0A8C1_0x004A7F50 | 49.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending From 8ed93ea0fd4c9d3e691af4cc18adedb7d3a8406e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:15 +0200 Subject: [PATCH 104/516] reimplement: SHC_3BB0A8C1_0x004A36B0 40.93% Style pass, asm differs --- .../PathFindingState/healUnitsOfPlayerWithinRadius.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp index 3cf8025494..2321598d22 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp @@ -49,7 +49,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[param_1] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar4 < 0x13a10) { + while (uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar4 <= 0x13a0f) { short sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; short sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; From f3351e08e1400f6b982677b40e0a20a62a868561 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:16 +0200 Subject: [PATCH 105/516] reimplement: SHC_3BB0A8C1_0x004A2DD0 75.78% Style pass, asm differs --- .../PathFindingState/igniteFireAtTilesDistanceAway.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp index bf74f9bbce..d7715e3eff 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp @@ -50,7 +50,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[tile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile < 0x13a10) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile <= 0x13a0f) { int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ada5b76f9c..35375aa184 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25201,7 +25201,7 @@ SHC_3BB0A8C1_0x004A2DC4 | 0.0% | Pending SHC_3BB0A8C1_0x004A2DC8 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2DD0 | 75.3% | Style pass, asm differs +SHC_3BB0A8C1_0x004A2DD0 | 75.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A2F00 | 0.0% | Pending From a44aa99c3a4895a80c3dfd75e7338cff804ff01c Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:16 +0200 Subject: [PATCH 106/516] reimplement: SHC_3BB0A8C1_0x0049FC00 57.06% Style pass, asm differs --- .../Map/Navigation/PathFindingState/pathFindingRelated.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp index 08d8f5f973..c986136a29 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -51,7 +51,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (uVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar5 < 0x13a10) { + while (uVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar5 <= 0x13a0f) { short sVar2 = this->searchQueue.xQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar5]; short sVar3 = this->searchQueue.yQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 35375aa184..0c53410abe 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24719,7 +24719,7 @@ SHC_3BB0A8C1_0x0049F7D0 | 20.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FC00 | 56.5% | Style pass, asm differs +SHC_3BB0A8C1_0x0049FC00 | 57.1% | Style pass, asm differs SHC_3BB0A8C1_0x0049FD10 | 0.0% | Pending From c8c8cb402677ac45f4a36834be40d6808fe5a4c5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:16 +0200 Subject: [PATCH 107/516] reimplement: SHC_3BB0A8C1_0x004A79A0 37.76% Style pass, asm differs --- .../Map/Navigation/PathFindingState/pathPlanningForTribe.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index de6abe8334..ab8fa8ab00 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -82,7 +82,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[iVar4] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (uVar11 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar11 < 0x13a10) { + while (uVar11 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar11 <= 0x13a0f) { int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar11]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0c53410abe..c85ed12785 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 91.5% | signed index compare SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte+short locals -SHC_3BB0A8C1_0x004A79A0 | 37.8% | signed writeIndex compare +SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A7F50 | 49.9% | Style pass, asm differs From 1029ce706f86dde4d14884f97199ef790bc16fc5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:17 +0200 Subject: [PATCH 108/516] reimplement: SHC_3BB0A8C1_0x004A8AB0 58.30% Style pass, asm differs --- .../Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp index 62bb104d31..d80b5175b9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp @@ -163,7 +163,7 @@ namespace Map { = (short)this->searchGeneration; } if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (uVar6 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar6 < 0x13a10) { + while (uVar6 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar6 <= 0x13a0f) { int sVar3 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar4 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar6]; From 1aa408855360ebb7d1d6fa479bc8da4989e31df5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:17 +0200 Subject: [PATCH 109/516] reimplement: SHC_3BB0A8C1_0x004A83B0 60.87% Style pass, asm differs --- ...teDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index b793e8aa39..11b92e03aa 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -69,7 +69,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[tile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile < 0x13a10) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile <= 0x13a0f) { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c85ed12785..67952587bc 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25311,7 +25311,7 @@ SHC_3BB0A8C1_0x004A8220 | 0.0% | Pending SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending -SHC_3BB0A8C1_0x004A83B0 | 60.4% | Style pass, asm differs +SHC_3BB0A8C1_0x004A83B0 | 60.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A8780 | 40.8% | Style pass, asm differs From 9cc4c7cad3664ddc52cce6841a41f706c01c24e1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:17 +0200 Subject: [PATCH 110/516] reimplement: SHC_3BB0A8C1_0x0049E510 91.67% dequeue bound literal from asm --- .../PathFindingState/recomputeALGPathFindingTileMapUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp index 7c0917c9bb..3e6030b908 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp @@ -41,7 +41,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (uVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar3 < 0x13a10) { + while (uVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar3 <= 0x13a0f) { DAT_TileMapState::instance.AIInfoLayer[uVar3] = DAT_TileMapState::instance.AIInfoLayer[uVar3] | (byte)param_4; int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 67952587bc..49cd7eff14 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24699,7 +24699,7 @@ SHC_3BB0A8C1_0x0049DDC0 | 35.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049E0D0 | 86.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049E510 | 90.8% | Style pass, asm differs +SHC_3BB0A8C1_0x0049E510 | 91.7% | dequeue bound literal from asm SHC_3BB0A8C1_0x0049E9E0 | 69.4% | Style pass, asm differs From d37fa2efc70cf33c9cc812975bd5a379cfeb017d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:18 +0200 Subject: [PATCH 111/516] reimplement: SHC_3BB0A8C1_0x004A9680 100.00% Reimplemented --- src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp index 4375a24210..62b766b3f4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp @@ -40,7 +40,7 @@ namespace Map { } LAB_004a9740: DAT_CurrentClimbDataID::instance = DAT_CurrentClimbDataID::instance + 1; - if (199 < DAT_CurrentClimbDataID::instance) { + if (200 <= (int)DAT_CurrentClimbDataID::instance) { return; } } while (true); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 49cd7eff14..669150c901 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25459,7 +25459,7 @@ SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A9510 | 54.0% | loop bound off-by-one -SHC_3BB0A8C1_0x004A9680 | 95.8% | dropped no-op load/store +SHC_3BB0A8C1_0x004A9680 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A96B0 | 0.0% | Pending From 6cf1c85517fcf85a502a0c1ac1839e3a1e6a2575 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:49:18 +0200 Subject: [PATCH 112/516] reimplement: SHC_3BB0A8C1_0x0049E0D0 87.53% Style pass, asm differs --- .../updateUnitDeathHeatmapIn3SpacesAroundTile.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp index 330c9da3b3..b2ff04759f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp @@ -41,7 +41,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile < 0x13a10) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile <= 0x13a0f) { int _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; int iVar2 = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 669150c901..0de4c14322 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24697,7 +24697,7 @@ SHC_3BB0A8C1_0x0049DB30 | 78.8% | Style pass, asm differs SHC_3BB0A8C1_0x0049DDC0 | 35.7% | Style pass, asm differs -SHC_3BB0A8C1_0x0049E0D0 | 86.5% | Style pass, asm differs +SHC_3BB0A8C1_0x0049E0D0 | 87.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049E510 | 91.7% | dequeue bound literal from asm From 921baee150c28139f0a959f204b07bbd76373a4a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 02:51:43 +0200 Subject: [PATCH 113/516] reimplement: SHC_3BB0A8C1_0x004A75B0 40.37% compare operand order --- .../Navigation/PathFindingState/pathfindingForAttacksUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp index 1a55741ea5..d6258b50e7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -113,7 +113,7 @@ namespace Map { } while ((int)pXVar8 < 0xb39238); local_24 = local_24 + 3; local_28 = local_28 + 1; - if (param_3 <= local_28) { + if (local_28 >= param_3) { return; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0de4c14322..a1c119fcaf 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25299,7 +25299,7 @@ SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending SHC_3BB0A8C1_0x004A7090 | 91.5% | signed index compare -SHC_3BB0A8C1_0x004A75B0 | 40.0% | widened byte+short locals +SHC_3BB0A8C1_0x004A75B0 | 40.4% | compare operand order SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs From 2a21b0739cd2548fda4539b63c43810109ce27a3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:18 +0200 Subject: [PATCH 114/516] reimplement: SHC_3BB0A8C1_0x004A1230 58.98% Style pass, asm differs --- .../PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp | 1 - status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp index f88be6b711..24c5d92703 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp @@ -40,7 +40,6 @@ namespace Map { { int (*paiVar4)[8]; uint uVar5; - short* psVar6; uint uVar7; int _nextCandidate; int _tile; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a1c119fcaf..9c9b3bc82c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24877,7 +24877,7 @@ SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending SHC_3BB0A8C1_0x004A0E50 | 94.9% | reuse computed start tile -SHC_3BB0A8C1_0x004A1230 | 59.0% | norm +6.7, raw flat +SHC_3BB0A8C1_0x004A1230 | 59.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A1568 | 0.0% | Pending From 6fa3e411249c6a2745db0e52537449bd973b1494 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:18 +0200 Subject: [PATCH 115/516] reimplement: SHC_3BB0A8C1_0x0049DDC0 35.71% Style pass, asm differs --- .../PathFindingState/budgetFloodFillOnCertainPathLayer.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp index b16eac1e9d..af29795e12 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp @@ -24,8 +24,6 @@ namespace Map { void PathFindingState::budgetFloodFillOnCertainPathLayer(uint x, uint y, int marker, int budget) { int iVar1; - int* piVar2; - int* piVar3; uint _candidate; uint uVar4; short _distance; From 2f06f2e52daa30dc832fa20aaa17dad49e41501a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:19 +0200 Subject: [PATCH 116/516] reimplement: SHC_3BB0A8C1_0x00498A40 78.26% Style pass, asm differs --- .../calculatePathKeepAndWallsGatesNotAllowed.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp index a39ff5932e..ec9a9bf653 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -25,7 +25,6 @@ namespace Map { int x1, int y1, int x2, int y2, int maxTries) { uint uVar4; - int* piVar5; int iVar6; uint _tile; if (399 < (uint)x1 || 399 < (uint)y1 From 7c1fa95ea608cd51b86e476e47d28e610ba1b604 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:19 +0200 Subject: [PATCH 117/516] reimplement: SHC_3BB0A8C1_0x004A3B20 34.69% Style pass, asm differs --- .../Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index d255d7cfa1..48ded3ef24 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -42,9 +42,7 @@ namespace Map { { short sVar5; short sVar6; - short* psVar8; int iVar9; - int* piVar10; int iVar11; eSFX sfxOffsetInArray; EntityType local_8; From 5bdc03dc769bfa4fe32c597635d3f3e2ae5a483f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:19 +0200 Subject: [PATCH 118/516] reimplement: SHC_3BB0A8C1_0x0049DB30 78.83% Style pass, asm differs --- .../checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp index 7fcbbf28fb..f4284ba3e6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp @@ -31,7 +31,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049DB30 BOOLEnum PathFindingState::checkEnemyBuildingOrDefensiveStructureWithin12Tiles(int playerID, uint x, uint y) { - short* psVar1; int (*paiVar2)[8]; int bVar3; short _building; From 3fe523087c109a06c657af897265adf4c8593016 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:20 +0200 Subject: [PATCH 119/516] reimplement: SHC_3BB0A8C1_0x0049CB00 51.13% Style pass, asm differs --- .../PathFindingState/computeNextRallyPointDestination.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp index 4f5bc69713..36bf677f21 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp @@ -22,7 +22,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049CB00 void PathFindingState::computeNextRallyPointDestination(int unitID, int xPos, int yPos) { - short* _pOffsets; int _cY_2; int (*_cY2)[8]; int _cTile; From 3ef0e5862b15023a9ee74d656df2b098d42045bb Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:20 +0200 Subject: [PATCH 120/516] reimplement: SHC_3BB0A8C1_0x0049C690 72.29% Style pass, asm differs --- .../PathFindingState/computeTotalUnitsWithinDistance.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp index d00969fe75..cd36d7b5f9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp @@ -29,7 +29,6 @@ namespace Map { uint uVar4; int iVar5; int iVar6; - int* piVar7; this->calculations = this->calculations + 1; this->searchGeneration = this->searchGeneration + 1; this->ALGO_TotalTroopValue = 0; From a5e624f2e416eccb51af2bab401a41baade93fa5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:20 +0200 Subject: [PATCH 121/516] reimplement: SHC_3BB0A8C1_0x00497280 48.87% Style pass, asm differs --- .../Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp index f7c6cb933b..be82ba7142 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp @@ -29,7 +29,6 @@ namespace Map { BOOLEnum PathFindingState::doMoveFromTileToTile( int unitID, int tile, int y, int direction, int param_5, int ignoreAssassinClimbing) { - short* psVar1; int bVar2; uint uVar3; int _targetTile; From bdc785694709aa6de90f0fca3dc16aa48e82a01b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:21 +0200 Subject: [PATCH 122/516] reimplement: SHC_3BB0A8C1_0x0049D880 52.40% Style pass, asm differs --- .../PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp index f386d290c6..cc8effaefa 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp @@ -23,7 +23,6 @@ namespace Map { undefined4 PathFindingState::findClosestFreeTileNearUnitOnBuilding( int buildingID, int unitID, int x, int y, int* pX, int* pY) { - short* psVar2; uint uVar3; int (*paiVar4)[8]; int iVar5; From b12ed5c60d8fe8e8ff48b1a749a3ff970a735106 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:21 +0200 Subject: [PATCH 123/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 27.81% Style pass, asm differs --- .../PathFindingState/findCrossAreaBridgeTileToTarget.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index c99545cc81..d8eb8863a6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -34,7 +34,6 @@ namespace Map { uint uVar9; int iVar10; uint uVar11; - int* piVar12; int iVar13; int local_20; uint local_14; From 50487e735650fb1e6bd7db6100085a5e8fa5b6e1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:21 +0200 Subject: [PATCH 124/516] reimplement: SHC_3BB0A8C1_0x004A0B20 65.16% Style pass, asm differs --- .../PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp index 5b8f9cb29a..c9cb650090 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp @@ -28,7 +28,6 @@ namespace Map { int (*paiVar3)[8]; int iVar4; int iVar5; - short* psVar6; int local_c; int local_8; this->calculations = this->calculations + 1; From 5da34609710ee6ea40aba688a6afc20e65df753c Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:22 +0200 Subject: [PATCH 125/516] reimplement: SHC_3BB0A8C1_0x004A7F50 49.90% Style pass, asm differs --- ...paceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 7277688d20..665ed3dc25 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -42,7 +42,6 @@ namespace Map { int* piVar3; XYPair* pXVar4; BuildingTypeInt _buildingType; - short* psVar5; int (*paiVar6)[8]; int _candidate; int _index; From ace471c619e5afc4e501f9fd5525a3239492034c Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:22 +0200 Subject: [PATCH 126/516] reimplement: SHC_3BB0A8C1_0x0049D0E0 52.72% Style pass, asm differs --- .../PathFindingState/findFreeTileOnDefensiveStructure.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp index 6d62b64475..9482c1d526 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp @@ -22,7 +22,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049D0E0 void PathFindingState::findFreeTileOnDefensiveStructure(int unitID, int x, int y) { - short* psVar3; int (*paiVar4)[8]; int iVar5; int _tile; From b6c107ecb2a5b72430a37fb338931cb52ec19311 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:22 +0200 Subject: [PATCH 127/516] reimplement: SHC_3BB0A8C1_0x0049BBF0 49.80% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findFurthestSeaTile.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp index d8d17bba2a..769a52e837 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp @@ -22,7 +22,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049BBF0 void PathFindingState::findFurthestSeaTile(int budget, uint x, uint y) { - short* psVar1; int (*paiVar2)[8]; int _x; int _y; From f9e72beaf9bef1cababa7a6ce572c56239925ae5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:23 +0200 Subject: [PATCH 128/516] reimplement: SHC_3BB0A8C1_0x0049B940 70.34% Style pass, asm differs --- .../findMapBorderEdgeTileAndStoreInSignpostData.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp index 2cab62b19d..bbf39b93c2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp @@ -25,7 +25,6 @@ namespace Map { { int (*paiVar1)[8]; int _candidate; - int _offset; int _index; uint _tile; int _x; From d206763054ae3d5177fea13fab3a209da84284ce Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:23 +0200 Subject: [PATCH 129/516] reimplement: SHC_3BB0A8C1_0x004A0460 66.67% Style pass, asm differs --- .../PathFindingState/findNearestEnemyBuildingWithinDistance.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp index 1ff1229c4f..bfc0ba07d6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp @@ -35,7 +35,6 @@ namespace Map { int iVar3; int iVar5; int (*paiVar6)[8]; - short* psVar7; this->searchGeneration = this->searchGeneration + 1; this->calculations = this->calculations + 1; if (32000 < this->searchGeneration) { From 1ad831951be03c68b0e65e36fb04653a361c4c37 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:23 +0200 Subject: [PATCH 130/516] reimplement: SHC_3BB0A8C1_0x004A06B0 60.09% Style pass, asm differs --- .../PathFindingState/findNearestEnemyUnitWithinDistance.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp index 31949ce51c..85010a7b35 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp @@ -32,7 +32,6 @@ namespace Map { { UnitLogicStateShort UVar2; int iVar3; - short* psVar5; int (*paiVar6)[8]; this->searchGeneration = this->searchGeneration + 1; this->calculations = this->calculations + 1; From 1a387a148c1270f54e96e1d1eccfdf7ed0cf5580 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:24 +0200 Subject: [PATCH 131/516] reimplement: SHC_3BB0A8C1_0x004974D0 33.33% Style pass, asm differs --- .../findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp | 1 - status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp index 1e704786f9..6ee3216af0 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp @@ -29,7 +29,6 @@ namespace Map { int _candidate2; int _tile2; uint _c2Height; - int* piVar4; int _minDistance; BOOL _status; ushort _area1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9c9b3bc82c..e87810781b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24361,7 +24361,7 @@ SHC_3BB0A8C1_0x00497180 | 29.4% | Style pass, asm differs SHC_3BB0A8C1_0x00497280 | 48.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004974D0 | 30.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004974D0 | 33.3% | Style pass, asm differs SHC_3BB0A8C1_0x00497690 | 13.6% | Style pass, asm differs From 4899607cf308568b485df8b6d4eec81b36830694 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:24 +0200 Subject: [PATCH 132/516] reimplement: SHC_3BB0A8C1_0x0049C370 44.00% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findNoTreeInRange.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp index 63409d5b31..64c4d7413c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp @@ -29,7 +29,6 @@ namespace Map { BOOLEnum PathFindingState::findNoTreeInRange(int budget, uint x, uint y) { int (*paiVar2)[8]; - short* psVar3; int _tile; TreeTypeShort _treeType; this->ALG_ResultTile = 0; From eceea65480f2b768e24aad3aec37539635b96e7d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:24 +0200 Subject: [PATCH 133/516] reimplement: SHC_3BB0A8C1_0x0049CE40 51.13% Style pass, asm differs --- .../findPathableTileWithoutUnitWithBuildingAtXY.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp index e959c18366..71ffed38fb 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp @@ -22,7 +22,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049CE40 void PathFindingState::findPathableTileWithoutUnitWithBuildingAtXY(int unitID, int x, int y) { - short* psVar1; int iVar2; int (*paiVar3)[8]; short _buildingAtStart; From dad5bf54884f01eabf11b52da873ba091aac5271 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:25 +0200 Subject: [PATCH 134/516] reimplement: SHC_3BB0A8C1_0x004A1D30 65.67% Style pass, asm differs --- .../Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp index 4ebe9001d2..c9cea48648 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -30,8 +30,6 @@ namespace Map { undefined4 PathFindingState::findSomeSuitableLocationUnk(int param_1, uint x, uint y, int param_4) { int iVar5; - short* psVar6; - int* piVar7; int iVar8; if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return (undefined4)(0); From b0f047c11ac6764d25202bb4ab6b3877ac62eaca Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:25 +0200 Subject: [PATCH 135/516] reimplement: SHC_3BB0A8C1_0x0049D340 64.60% Style pass, asm differs --- .../PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp index 418a2f2c5f..9355cfc4e9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp @@ -25,7 +25,6 @@ namespace Map { void PathFindingState::findWalkableTileThatDoesNotContainUnit(int unitID, uint x, uint y, int considerUnits) { uint _tHeight; - short* psVar2; uint _absHeight; int (*paiVar3)[8]; int _area; From 0bdd77a239cfa4053cb4932a1e50433382ecda3b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:25 +0200 Subject: [PATCH 136/516] reimplement: SHC_3BB0A8C1_0x004A36B0 40.93% dropped dead declarations --- .../PathFindingState/healUnitsOfPlayerWithinRadius.cpp | 2 -- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp index 2321598d22..847cde958c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp @@ -28,9 +28,7 @@ namespace Map { { uint uVar4; short sVar6; - short* psVar7; int iVar8; - int* piVar9; this->searchGeneration = this->searchGeneration + 1; this->calculations = this->calculations + 1; if (32000 < this->searchGeneration) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e87810781b..294fe7ebb8 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25209,7 +25209,7 @@ SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3220 | 63.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A36B0 | 40.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A36B0 | 40.9% | dropped dead declarations SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending From ea2439f46056662f251a3701274a532f4f747d70 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:26 +0200 Subject: [PATCH 137/516] reimplement: SHC_3BB0A8C1_0x004A2DD0 75.78% Style pass, asm differs --- .../PathFindingState/igniteFireAtTilesDistanceAway.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp index d7715e3eff..812ece7170 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp @@ -23,8 +23,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x004A2DD0 undefined4 PathFindingState::igniteFireAtTilesDistanceAway(int tile, int maxDistance, int playerID) { - short* psVar3; - int* piVar4; int iVar5; int _index2; int _index; From f20716fbe540e981228efe247ef111f362c23d83 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:26 +0200 Subject: [PATCH 138/516] reimplement: SHC_3BB0A8C1_0x004A9200 45.22% Style pass, asm differs --- .../Navigation/PathFindingState/isOpponentBuildingInRange.cpp | 1 - status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index dce82149a8..8a3a50974d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -28,7 +28,6 @@ namespace Map { int playerID, int x, int y, int range, int param_5, int param_6, int keepRange) { int iVar1; - short* psVar2; int (*paiVar3)[8]; int _tile; short _buildingID; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 294fe7ebb8..506744c448 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25453,7 +25453,7 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 45.2% | queue wrap off-by-one +SHC_3BB0A8C1_0x004A9200 | 45.2% | Style pass, asm differs SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented From 7317d9f0a5a4ed846e2daf7597fdc4b42c2f1a5f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:26 +0200 Subject: [PATCH 139/516] reimplement: SHC_3BB0A8C1_0x004A2650 64.83% Style pass, asm differs --- .../Navigation/PathFindingState/isSignPostWithinDistance.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp index 766dbc8033..92908c683a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp @@ -38,8 +38,6 @@ namespace Map { BOOLEnum PathFindingState::isSignPostWithinDistance(uint x, uint y, int limit) { int iVar3; - short* psVar4; - int* piVar5; int iVar6; if (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY) { return FALSE; From 378c99b0478deb62db8d40da8bb0c0440aac597a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:27 +0200 Subject: [PATCH 140/516] reimplement: SHC_3BB0A8C1_0x00498400 41.25% Style pass, asm differs --- .../PathFindingState/pathFindingWithBuildingsIncluded.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index 9cc4516fe9..dfd6ffbf56 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -68,7 +68,6 @@ namespace Map { uint x, uint y, uint x2, uint y2, int maxOptionsToTry, int zeroMeansResetAlgorithm) { uint uVar1; - int* piVar2; int _nextTileOption; uint uVar3; uint _tile2; From f45c81d761f750847e57aabdd2f74fe90afb44ce Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:27 +0200 Subject: [PATCH 141/516] reimplement: SHC_3BB0A8C1_0x004A79A0 37.76% Style pass, asm differs --- .../Map/Navigation/PathFindingState/pathPlanningForTribe.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index ab8fa8ab00..13d4b6c417 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -40,7 +40,6 @@ namespace Map { uint uVar8; int (*paiVar9)[8]; int* _pDest2; - short* psVar10; uint uVar11; int* _pDest3; int iVar12; From b42fb67a564dd5e2f519f29bdb881425f9100abe Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:27 +0200 Subject: [PATCH 142/516] reimplement: SHC_3BB0A8C1_0x004A21B0 81.91% Style pass, asm differs --- .../PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp index 0a479cbebe..8042ee7285 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp @@ -36,8 +36,6 @@ namespace Map { void PathFindingState::placeCommemoratingStatueAtGoodLocation(int playerID) { int iVar3; - short* psVar4; - int* piVar5; int iVar6; MappersEnum commandBuildingType; uint uVar7; From 616ab505689ada51e9488bc24b238eb3ead7bcf7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:28 +0200 Subject: [PATCH 143/516] reimplement: SHC_3BB0A8C1_0x004A83B0 60.87% Style pass, asm differs --- ...ateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index 11b92e03aa..189d4959f9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -33,7 +33,6 @@ namespace Map { int iVar2; int* piVar3; XYPair* pXVar4; - short* psVar5; int (*paiVar6)[8]; int _candidate; int _dIndex; From e05a5b262deb6fcee033c14b45f5a85c100536fc Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:28 +0200 Subject: [PATCH 144/516] reimplement: SHC_3BB0A8C1_0x0049A6D0 72.45% Style pass, asm differs --- src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp index 90acf5c17e..20d5e9645c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp @@ -23,9 +23,7 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049A6D0 void PathFindingState::raiseLand2(uint x, uint y, int maxDistance) { - short* psVar4; int iVar5; - int* piVar6; if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } From 62b55bb99d685f28233d31f81c8b7915d91d9b5f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:28 +0200 Subject: [PATCH 145/516] reimplement: SHC_3BB0A8C1_0x004A0E50 94.91% Style pass, asm differs --- .../setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp | 2 -- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp index b344fda19d..c54558ffc2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp @@ -24,8 +24,6 @@ namespace Map { void PathFindingState::setWalkabilityBorderLogicLayerForSmallerMapSizes() { short sVar3; - short* psVar5; - int* piVar6; int _candidateTile; this->searchGeneration = this->searchGeneration + 1; this->resultTile = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 506744c448..e35a6c4a56 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24875,7 +24875,7 @@ SHC_3BB0A8C1_0x004A0E4A | 0.0% | Pending SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending -SHC_3BB0A8C1_0x004A0E50 | 94.9% | reuse computed start tile +SHC_3BB0A8C1_0x004A0E50 | 94.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A1230 | 59.0% | Style pass, asm differs From 9a2130fc7b73acc0a18d6d55b4d838c116f50b33 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:29 +0200 Subject: [PATCH 146/516] reimplement: SHC_3BB0A8C1_0x0049C020 60.97% Style pass, asm differs --- .../Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp index 0954c39f61..56f830ae7e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp @@ -30,7 +30,6 @@ namespace Map { undefined4 PathFindingState::setupBabyTreeLocationInfo(int param_1, int treeType, uint x, uint y) { int iVar4; - short* psVar7; int (*paiVar8)[8]; this->ALG_ResultTile = 0; this->ALG_ResultY = 0; From 6de08c06b42171dcf49683e4935c2c8fadb7feb8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:29 +0200 Subject: [PATCH 147/516] reimplement: SHC_3BB0A8C1_0x0049D640 77.97% Style pass, asm differs --- .../PathFindingState/someBinaryAlgFunctionPathFinding.cpp | 1 - status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp index b14cd0afda..4986a32482 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp @@ -22,7 +22,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049D640 undefined4 PathFindingState::someBinaryAlgFunctionPathFinding(int param_1) { - short* psVar6; int (*paiVar7)[8]; this->searchGeneration = this->searchGeneration + 1; if (32000 < this->searchGeneration) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e35a6c4a56..3c51bfa9a2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24687,7 +24687,7 @@ SHC_3BB0A8C1_0x0049D470 | 0.0% | Pending SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D640 | 78.0% | bound literal from asm +SHC_3BB0A8C1_0x0049D640 | 78.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049D880 | 52.4% | Style pass, asm differs From ba54f9373beaa974db6900b76645fd207139704f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:29 +0200 Subject: [PATCH 148/516] reimplement: SHC_3BB0A8C1_0x004A2A90 55.98% Style pass, asm differs --- .../PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp index aa5f71f6f9..6b5be4c359 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp @@ -47,7 +47,6 @@ namespace Map { uint uVar3; int iVar4; int iVar5; - short* psVar6; int (*paiVar7)[8]; int iVar8; int local_8; From c93eb9e69dc7772d7348f409f8696208a0039858 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:30 +0200 Subject: [PATCH 149/516] reimplement: SHC_3BB0A8C1_0x00499FA0 24.44% Style pass, asm differs --- .../PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp index f54b4d58a9..20e820d0e6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp @@ -25,7 +25,6 @@ namespace Map { int _middleTileUnk; uint uVar5; int _xMiddleUnk; - int _offset; int _pl2; uint _widthOrHeight; _middleTileUnk = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; From 886885b7c22d7da93dacb9eaa6b5e221edd56580 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:04:30 +0200 Subject: [PATCH 150/516] reimplement: SHC_3BB0A8C1_0x004A5F90 100.00% Reimplemented --- .../PathFindingState/updatePathLinkagesInAllEightDirections.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp index 967053e054..3fd877cea5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkagesInAllEightDirections.cpp @@ -23,7 +23,6 @@ namespace Map { void PathFindingState::updatePathLinkagesInAllEightDirections(int y, int tile) { int (*paiVar1)[8]; - int* piVar2; int _someLinkageResult; _someLinkageResult = 0; MACRO_CALL_MEMBER( From 4b6207adfae5a533c75cd599e2935d28be794076 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:18:57 +0200 Subject: [PATCH 151/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 20.94% Style pass, asm differs --- .../PathFindingState/findAppropriateLocationForSiegeTent.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index 977a3d142d..2089f91a2f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -143,10 +143,7 @@ namespace Map { */ if (requiredDistanceFromAIZone != 0 && (bVar2 = true, - *(byte*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray - + playerID * 0x177bc + -0x10) - * 0x13a10 - + 0x1ee2998 + _offsetTile) + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][_offsetTile] != requiredDistanceFromAIZone)) { bVar2 = 0; } From 8d3da9e38d25f4bdde45498360d57d61184c6c38 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:18:57 +0200 Subject: [PATCH 152/516] reimplement: SHC_3BB0A8C1_0x004A6010 37.01% Style pass, asm differs --- .../findBestAttackTargetTileWithHeightAndOwner.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp index 51ec2c7358..a03778aba2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -86,7 +86,7 @@ namespace Map { int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; iVar6 = (int)sVar2; uint uVar8 = DAT_TileMapState::instance.LogicLayer[uVar4]; - uint uVar11 = (uint) * (byte*)(param_7 * 0x13a10 + 0x1ee2998 + uVar4); + uint uVar11 = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_7][uVar4]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; if ((int)this->searchQueue.currentDistance <= param_1) { if ((DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY) From f3cbd3368f6593560e019c8571f59e2f78bdff4b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:18:57 +0200 Subject: [PATCH 153/516] reimplement: SHC_3BB0A8C1_0x004A01D0 54.61% Style pass, asm differs --- .../PathFindingState/findBestAttackTileByPathCost.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp index ad5e0aa444..b9d0921cc8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp @@ -76,10 +76,7 @@ namespace Map { || (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[dVar4]] .entityType != OpenSHC::Map::Entities::ET_FIRE)) - && *(byte*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray - + param_3 * 0x177bc + -0x10) - * 0x13a10 - + 0x1ee2998 + dVar4) + && DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + param_3 * 0x177bc + -0x10)][dVar4] == param_4) { if ((10 < (int)this->searchQueue.currentDistance) && (local_8 != 0)) { return (dword)(local_8); From 0ca9f5a8690c8c400b8a501b2ae8479cd1a6e1e4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:18:58 +0200 Subject: [PATCH 154/516] reimplement: SHC_3BB0A8C1_0x0049C5C0 37.62% Style pass, asm differs --- .../PathFindingState/findDestinationCostLowerThan6.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp index 9fafbb2ef3..aaa6797b1a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp @@ -27,7 +27,7 @@ namespace Map { int _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if (DAT_TileMapState::instance.WalkLayer[_tile] == this->searchGeneration - && (_cost = (uint) * (byte*)(tile * 0x13a10 + 0x1ee2998 + _tile), _cost != 0) + && (_cost = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[tile][_tile], _cost != 0) && _cost - 0x28 < 6 && maxDistance <= DAT_TileMapState::instance.CertainPathLayer[_tile]) { this->ALG_ResultX = _tile - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; this->ALG_ResultY = _y; From 45df380bba81a1eb2e28f7e11776690245453633 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:18:58 +0200 Subject: [PATCH 155/516] reimplement: SHC_3BB0A8C1_0x0049FC00 58.26% named cost map field --- .../Map/Navigation/PathFindingState/pathFindingRelated.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp index c986136a29..be51a58287 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -47,7 +47,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)param_2; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; - int bVar1 = *(byte*)(param_4 * 0x13a10 + 0x1ee2998 + this->searchQueue.tilesQueue[0]); + int bVar1 = DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_4][this->searchQueue.tilesQueue[0]]; DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { @@ -65,7 +65,7 @@ namespace Map { != 0 && (dVar6 = DAT_TileMapState::instance.directionTranslationMatrix[iVar7][iVar10] + uVar5, DAT_TileMapState::instance.WalkLayer[dVar6] != this->searchGeneration)) { - uint uVar9 = (uint) * (byte*)(param_4 * 0x13a10 + 0x1ee2998 + dVar6); + uint uVar9 = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_4][dVar6]; if (uVar9 < 4) { uVar9 = 0; LAB_0049fdba: diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3c51bfa9a2..e971b61346 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24719,7 +24719,7 @@ SHC_3BB0A8C1_0x0049F7D0 | 20.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FC00 | 57.1% | Style pass, asm differs +SHC_3BB0A8C1_0x0049FC00 | 58.3% | named cost map field SHC_3BB0A8C1_0x0049FD10 | 0.0% | Pending From 71c03cc3717f37f9ac7acbc58dda7b05a1041c7e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:18:58 +0200 Subject: [PATCH 156/516] reimplement: SHC_3BB0A8C1_0x0049FF20 65.31% Style pass, asm differs --- .../Navigation/PathFindingState/pathfindingRelated49ff20.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp index 4812f05ea5..1380881fb5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp @@ -76,10 +76,7 @@ namespace Map { || (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[dVar4]] .entityType != OpenSHC::Map::Entities::ET_FIRE)) - && *(byte*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray - + playerID * 0x177bc + -0x10) - * 0x13a10 - + 0x1ee2998 + dVar4) + && DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][dVar4] == distanceUnk) { if ((16 < (int)this->searchQueue.currentDistance) && (local_8 != 0)) { return (dword)(local_8); From 4d31fe9d897980738ab81a3d577354688e796496 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:18:59 +0200 Subject: [PATCH 157/516] reimplement: SHC_3BB0A8C1_0x004A65E0 70.31% named cost map field --- .../setDestinationPairsBasedOnPreviousSearch.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp index c96c6b20dd..2206bfd035 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp @@ -25,7 +25,7 @@ namespace Map { do { uint y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - uint _attackedDistance = (uint) * (byte*)(attackedPlayerID * 0x13a10 + 0x1ee2998 + _tile); + uint _attackedDistance = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[attackedPlayerID][_tile]; uint x = _tile - DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile; if (DAT_TileMapState::instance.WalkLayer[_tile] == this->searchGeneration && _attackedDistance != 0 && _attackedDistance - 4294967224 < 4 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e971b61346..0bc13b3995 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25277,7 +25277,7 @@ SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending SHC_3BB0A8C1_0x004A6520 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A65E0 | 68.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A65E0 | 70.3% | named cost map field SHC_3BB0A8C1_0x004A66D0 | 83.1% | Style pass, asm differs From dfe1204d575164e1a93204f8c7db459616efd103 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:18:59 +0200 Subject: [PATCH 158/516] reimplement: SHC_3BB0A8C1_0x004A66D0 84.62% named cost map field --- .../Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp index ed990485df..917130fd9f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp @@ -28,7 +28,7 @@ namespace Map { do { uint _y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; int _tileCandidate = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - uint _cost = (uint) * (byte*)(playerID * 0x13a10 + 0x1ee2998 + _tileCandidate); + uint _cost = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[playerID][_tileCandidate]; uint _x = _tileCandidate - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; if (_cost != 0 && maxCost <= (int)_cost && (int)_cost <= maxCost + 10 && DAT_TileMapState::instance.CertainPathLayer[_tileCandidate] != 100) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0bc13b3995..ee84dd8239 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25279,7 +25279,7 @@ SHC_3BB0A8C1_0x004A6520 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A65E0 | 70.3% | named cost map field -SHC_3BB0A8C1_0x004A66D0 | 83.1% | Style pass, asm differs +SHC_3BB0A8C1_0x004A66D0 | 84.6% | named cost map field SHC_3BB0A8C1_0x004A67D0 | 72.1% | Style pass, asm differs From de9b0b8e2fe9ff7d65ca2a6f6885fc711d4f82e3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:18:59 +0200 Subject: [PATCH 159/516] reimplement: SHC_3BB0A8C1_0x004A7090 94.76% named cost map field --- .../updateWalkLayerAndAIPathCostLayer.cpp | 35 ++++--------------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 29 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp index 3338ddb5a6..f30b8e4bd5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp @@ -88,10 +88,7 @@ namespace Map { /* // Sets to 1 */ - *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc - + -0x10) - * 0x13a10 - + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; /* Mark as visited @@ -114,10 +111,7 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 1]; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 1; - *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc - + -0x10) - * 0x13a10 - + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; @@ -130,10 +124,7 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 2]; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 2; - *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc - + -0x10) - * 0x13a10 - + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; @@ -146,10 +137,7 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 3]; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 3; - *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc - + -0x10) - * 0x13a10 - + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; @@ -162,10 +150,7 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 4]; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 4; - *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc - + -0x10) - * 0x13a10 - + 0x1ee2998 + this->searchQueue.tilesQueue[this->searchQueue.writeIndex]) + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; @@ -201,10 +186,7 @@ namespace Map { Read the distance value for this tile from the AI path cost layer */ this->searchQueue.currentDistance = (uint) - * (byte*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc - + -0x10) - * 0x13a10 - + 0x1ee2998 + _tile2); + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][_tile2]; /* Track maximum distance encountered, constitutes extra return value */ @@ -260,10 +242,7 @@ namespace Map { SET DISTANCE = CURRENT DISTANCE + 1 This creates the distance map radiating from AI zones */ - *(char*)(*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray - + playerID * 0x177bc + -0x10) - * 0x13a10 - + 0x1ee2998 + iVar2) = (char)this->searchQueue.currentDistance + '\x01'; + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][iVar2] = (char)this->searchQueue.currentDistance + '\x01'; /* previous line sets pathfinding cost layer Mark as visited */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ee84dd8239..1a80950392 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25297,7 +25297,7 @@ SHC_3BB0A8C1_0x004A6DF0 | 78.8% | tile bound off-by-one SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A7090 | 91.5% | signed index compare +SHC_3BB0A8C1_0x004A7090 | 94.8% | named cost map field SHC_3BB0A8C1_0x004A75B0 | 40.4% | compare operand order From dae4058a5ca1de24eff799f8089374dcc1cdc5a7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:56 +0200 Subject: [PATCH 160/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 20.94% Style pass, asm differs --- .../PathFindingState/findAppropriateLocationForSiegeTent.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index 2089f91a2f..a15a25cfa9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -143,7 +143,9 @@ namespace Map { */ if (requiredDistanceFromAIZone != 0 && (bVar2 = true, - DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][_offsetTile] + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + + playerID * 0x177bc + -0x10)][_offsetTile] != requiredDistanceFromAIZone)) { bVar2 = 0; } From 61b8f30d39152f350c6af47ea00bd1b611c32b21 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:57 +0200 Subject: [PATCH 161/516] reimplement: SHC_3BB0A8C1_0x004A01D0 54.61% Style pass, asm differs --- .../PathFindingState/findBestAttackTileByPathCost.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp index b9d0921cc8..3936f3b5f8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp @@ -76,7 +76,9 @@ namespace Map { || (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[dVar4]] .entityType != OpenSHC::Map::Entities::ET_FIRE)) - && DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + param_3 * 0x177bc + -0x10)][dVar4] + && DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + + param_3 * 0x177bc + -0x10)][dVar4] == param_4) { if ((10 < (int)this->searchQueue.currentDistance) && (local_8 != 0)) { return (dword)(local_8); From 98e11a8f5ea65113affdf3172ea675d416b07c3a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:57 +0200 Subject: [PATCH 162/516] reimplement: SHC_3BB0A8C1_0x0049D880 52.40% Style pass, asm differs --- .../PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp index cc8effaefa..ae42aeee8b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp @@ -42,7 +42,8 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.readIndex = 0; this->searchQueue.writeIndex = 1; - _unitArea = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[unitID].tile]; + _unitArea + = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[unitID].tile]; *pX = (int)DAT_UnitsState::instance.units[unitID].x; *pY = (int)DAT_UnitsState::instance.units[unitID].y; this->searchQueue.yQueue[0] = DAT_UnitsState::instance.units[unitID].y; From bb364ebe6a7dd8eb1289fb4ea8377ca756b68528 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:57 +0200 Subject: [PATCH 163/516] reimplement: SHC_3BB0A8C1_0x0049C5C0 37.62% Style pass, asm differs --- .../PathFindingState/findDestinationCostLowerThan6.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp index aaa6797b1a..cb6f222b51 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp @@ -27,7 +27,8 @@ namespace Map { int _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if (DAT_TileMapState::instance.WalkLayer[_tile] == this->searchGeneration - && (_cost = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[tile][_tile], _cost != 0) + && (_cost = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[tile][_tile], + _cost != 0) && _cost - 0x28 < 6 && maxDistance <= DAT_TileMapState::instance.CertainPathLayer[_tile]) { this->ALG_ResultX = _tile - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; this->ALG_ResultY = _y; From 2ec4e6314cec5d5ecef4f30c8e936d5c981d5117 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:58 +0200 Subject: [PATCH 164/516] reimplement: SHC_3BB0A8C1_0x0049FC00 58.26% Style pass, asm differs --- .../Map/Navigation/PathFindingState/pathFindingRelated.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp index be51a58287..5f25111be0 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -47,7 +47,8 @@ namespace Map { this->searchQueue.xQueue[0] = (short)param_2; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; - int bVar1 = DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_4][this->searchQueue.tilesQueue[0]]; + int bVar1 + = DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_4][this->searchQueue.tilesQueue[0]]; DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { @@ -65,7 +66,8 @@ namespace Map { != 0 && (dVar6 = DAT_TileMapState::instance.directionTranslationMatrix[iVar7][iVar10] + uVar5, DAT_TileMapState::instance.WalkLayer[dVar6] != this->searchGeneration)) { - uint uVar9 = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_4][dVar6]; + uint uVar9 + = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_4][dVar6]; if (uVar9 < 4) { uVar9 = 0; LAB_0049fdba: diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 1a80950392..f8fb58ba27 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24719,7 +24719,7 @@ SHC_3BB0A8C1_0x0049F7D0 | 20.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FC00 | 58.3% | named cost map field +SHC_3BB0A8C1_0x0049FC00 | 58.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049FD10 | 0.0% | Pending From 938c89d82c4a189aead5eeef4ae373c4b2175eef Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:58 +0200 Subject: [PATCH 165/516] reimplement: SHC_3BB0A8C1_0x004A79A0 37.76% Style pass, asm differs --- .../Map/Navigation/PathFindingState/pathPlanningForTribe.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index 13d4b6c417..14ddf99fb7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -85,7 +85,8 @@ namespace Map { int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar11]; - if ((0x13a10 < (int)this->searchQueue.currentDistance) || (10 < (int)this->searchQueue.currentDistance)) + if ((0x13a10 < (int)this->searchQueue.currentDistance) + || (10 < (int)this->searchQueue.currentDistance)) break; for (int _direction = 0; _direction < 8; _direction = _direction + 1) { iVar12 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + uVar11; From b01515791b7f43138a29d6391a68ef0a475d24d6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:58 +0200 Subject: [PATCH 166/516] reimplement: SHC_3BB0A8C1_0x0049FF20 65.31% Style pass, asm differs --- .../Navigation/PathFindingState/pathfindingRelated49ff20.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp index 1380881fb5..99f1629e3e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp @@ -76,7 +76,9 @@ namespace Map { || (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[dVar4]] .entityType != OpenSHC::Map::Entities::ET_FIRE)) - && DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][dVar4] + && DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + + playerID * 0x177bc + -0x10)][dVar4] == distanceUnk) { if ((16 < (int)this->searchQueue.currentDistance) && (local_8 != 0)) { return (dword)(local_8); From a635a97134251f8f60dd69c93070872eab43060c Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:59 +0200 Subject: [PATCH 167/516] reimplement: SHC_3BB0A8C1_0x004A83B0 60.87% Style pass, asm differs --- ...eDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index 189d4959f9..b55feaef44 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -72,7 +72,8 @@ namespace Map { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if ((80400 < (int)this->searchQueue.currentDistance) || (10 < (int)this->searchQueue.currentDistance)) + if ((80400 < (int)this->searchQueue.currentDistance) + || (10 < (int)this->searchQueue.currentDistance)) break; for (int _direction = 0; _direction < 8; _direction = _direction + 1) { _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_y][_direction] + _tile; From 9abd306a1a8b5439bb64821bec1b572a1e578fe4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:59 +0200 Subject: [PATCH 168/516] reimplement: SHC_3BB0A8C1_0x004A65E0 70.31% Style pass, asm differs --- .../setDestinationPairsBasedOnPreviousSearch.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp index 2206bfd035..52c7bfad0a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp @@ -25,7 +25,8 @@ namespace Map { do { uint y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - uint _attackedDistance = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[attackedPlayerID][_tile]; + uint _attackedDistance + = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[attackedPlayerID][_tile]; uint x = _tile - DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile; if (DAT_TileMapState::instance.WalkLayer[_tile] == this->searchGeneration && _attackedDistance != 0 && _attackedDistance - 4294967224 < 4 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f8fb58ba27..c4abd0ebab 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25277,7 +25277,7 @@ SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending SHC_3BB0A8C1_0x004A6520 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A65E0 | 70.3% | named cost map field +SHC_3BB0A8C1_0x004A65E0 | 70.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A66D0 | 84.6% | named cost map field From f5d95a2228d5cb1f09c577c3e454f0c83f6f5847 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:29:59 +0200 Subject: [PATCH 169/516] reimplement: SHC_3BB0A8C1_0x004A66D0 84.62% Style pass, asm differs --- .../Navigation/PathFindingState/setMoveDestinationPairs.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp index 917130fd9f..973b3f727e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp @@ -28,7 +28,8 @@ namespace Map { do { uint _y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; int _tileCandidate = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - uint _cost = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[playerID][_tileCandidate]; + uint _cost + = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[playerID][_tileCandidate]; uint _x = _tileCandidate - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; if (_cost != 0 && maxCost <= (int)_cost && (int)_cost <= maxCost + 10 && DAT_TileMapState::instance.CertainPathLayer[_tileCandidate] != 100) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c4abd0ebab..a2cb084d18 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25279,7 +25279,7 @@ SHC_3BB0A8C1_0x004A6520 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A65E0 | 70.3% | Style pass, asm differs -SHC_3BB0A8C1_0x004A66D0 | 84.6% | named cost map field +SHC_3BB0A8C1_0x004A66D0 | 84.6% | Style pass, asm differs SHC_3BB0A8C1_0x004A67D0 | 72.1% | Style pass, asm differs From 7cb22e333a264ccde25704d664006c2e31b833db Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:30:00 +0200 Subject: [PATCH 170/516] reimplement: SHC_3BB0A8C1_0x004A7090 96.37% operand order + bound literal --- .../updateWalkLayerAndAIPathCostLayer.cpp | 33 +++++++++++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp index f30b8e4bd5..59f4f5e54d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp @@ -88,7 +88,9 @@ namespace Map { /* // Sets to 1 */ - DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; /* Mark as visited @@ -111,7 +113,9 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 1]; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 1; - DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; @@ -124,7 +128,9 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 2]; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 2; - DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; @@ -137,7 +143,9 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 3]; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 3; - DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; @@ -150,7 +158,9 @@ namespace Map { this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile + 4]; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _tile + 4; - DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10)][this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (char)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[this->searchQueue.writeIndex]] = (short)this->searchGeneration; @@ -175,7 +185,7 @@ namespace Map { /* Bounds check */ - if (0x13a10 <= _tile2) { + if (0x13a0f < _tile2) { return; } /* @@ -185,12 +195,13 @@ namespace Map { /* Read the distance value for this tile from the AI path cost layer */ - this->searchQueue.currentDistance = (uint) - DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][_tile2]; + this->searchQueue.currentDistance = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10)][_tile2]; /* Track maximum distance encountered, constitutes extra return value */ - if (this->distance < (int)this->searchQueue.currentDistance) { + if ((int)this->searchQueue.currentDistance > this->distance) { this->distance = this->searchQueue.currentDistance; } /* @@ -242,7 +253,9 @@ namespace Map { SET DISTANCE = CURRENT DISTANCE + 1 This creates the distance map radiating from AI zones */ - DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*(int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][iVar2] = (char)this->searchQueue.currentDistance + '\x01'; + DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + + -0x10)][iVar2] = (char)this->searchQueue.currentDistance + '\x01'; /* previous line sets pathfinding cost layer Mark as visited */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a2cb084d18..ce3160c84f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25297,7 +25297,7 @@ SHC_3BB0A8C1_0x004A6DF0 | 78.8% | tile bound off-by-one SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A7090 | 94.8% | named cost map field +SHC_3BB0A8C1_0x004A7090 | 96.4% | operand order + bound literal SHC_3BB0A8C1_0x004A75B0 | 40.4% | compare operand order From a7fbf178666933a14605d9be42dabee9bf02c429 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:36:33 +0200 Subject: [PATCH 171/516] reimplement: SHC_3BB0A8C1_0x004A7090 99.19% global instance call + operand --- .../PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp index 59f4f5e54d..c2a50f0e3d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp @@ -6,6 +6,7 @@ #include "OpenSHC/Globals/DAT_AICState.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_TroopValueState.hpp" #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" @@ -207,7 +208,7 @@ namespace Map { /* Stop if we've exceeded the maximum distance limit */ - if (limit < (int)this->searchQueue.currentDistance) { + if ((int)this->searchQueue.currentDistance > limit) { return; } /* @@ -217,7 +218,7 @@ namespace Map { if (borderDistance != 0 && this->searchQueue.currentDistance == borderDistance && (_canNav = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - this)(playerID, (dword)((int)(fromArea)), + DAT_PathFindingState::ptr)(playerID, (dword)((int)(fromArea)), (dword)((int)((short)DAT_TileMapState::instance.PathConnectionLayer[_tile2])), 0), _canNav != 0) && (int)DAT_AICState::instance.aiBorderTilesIndex < 1000) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ce3160c84f..564eabb2fb 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25297,7 +25297,7 @@ SHC_3BB0A8C1_0x004A6DF0 | 78.8% | tile bound off-by-one SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A7090 | 96.4% | operand order + bound literal +SHC_3BB0A8C1_0x004A7090 | 99.2% | global instance call + operand SHC_3BB0A8C1_0x004A75B0 | 40.4% | compare operand order From 7136d32ef765c73eacba045523e40d16bb459f5d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:43:08 +0200 Subject: [PATCH 172/516] reimplement: SHC_3BB0A8C1_0x0049B5B0 71.12% named matrix end field --- .../Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp index 57fb6c3a78..d23e79de2d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp @@ -115,7 +115,7 @@ namespace Map { } psVar6 = psVar6 + 8; paiVar8 = (int (*)[8])(*paiVar8 + 2); - } while ((int)psVar6 < 0xb4908c); + } while ((int)psVar6 < (int)&DAT_TerrainDefinedData::instance.field61_0x138); this->searchQueue.readIndex = this->searchQueue.readIndex + 1; if (0x13a10 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 564eabb2fb..0717bf3045 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24423,7 +24423,7 @@ SHC_3BB0A8C1_0x0049B1D0 | 86.8% | queue wrap off-by-one SHC_3BB0A8C1_0x0049B2B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049B5B0 | 70.5% | Style pass, asm differs +SHC_3BB0A8C1_0x0049B5B0 | 71.1% | named matrix end field SHC_3BB0A8C1_0x0049B6B0 | 0.0% | Pending From 21880af798d3659b15f71ea797f399f836b28f48 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:43:08 +0200 Subject: [PATCH 173/516] reimplement: SHC_3BB0A8C1_0x004A5DA0 79.84% named matrix end field --- .../PathFindingState/findBestAdjacentClimbTileToTarget.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp index bf5182e56f..1cd4d10c0e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp @@ -90,7 +90,7 @@ namespace Map { } paiVar3 = (int (*)[8])(*paiVar3 + 1); piVar7 = piVar7 + 2; - } while ((int)piVar7 < 0xb4908c); + } while ((int)piVar7 < (int)&DAT_TerrainDefinedData::instance.field61_0x138); return (undefined4)(local_8); } return (undefined4)(0); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0717bf3045..03748c5312 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25265,7 +25265,7 @@ SHC_3BB0A8C1_0x004A5A30 | 0.0% | Pending SHC_3BB0A8C1_0x004A5B00 | 57.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A5DA0 | 76.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A5DA0 | 79.8% | named matrix end field SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented From b0ecafdf8fd06dc8e9005fe43581c87b29bdd7ad Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:43:08 +0200 Subject: [PATCH 174/516] reimplement: SHC_3BB0A8C1_0x0049AAD0 82.89% named matrix end field --- .../Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp index bcafedce9b..b6f1ffc391 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -138,7 +138,7 @@ namespace Map { } piVar7 = piVar7 + 4; psVar6 = psVar6 + 0x10; - } while ((int)psVar6 < 0xb4908c); + } while ((int)psVar6 < (int)&DAT_TerrainDefinedData::instance.field61_0x138); this->searchQueue.readIndex = this->searchQueue.readIndex + 1; if (0x13a10 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 03748c5312..3478b6b8bc 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24409,7 +24409,7 @@ SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AAD0 | 82.9% | signed bbox compares +SHC_3BB0A8C1_0x0049AAD0 | 82.9% | named matrix end field SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending From 888892e80317e70f0644ff324491601fed31c8c2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:43:09 +0200 Subject: [PATCH 175/516] reimplement: SHC_3BB0A8C1_0x004A7090 99.60% named matrix end field --- .../PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp index c2a50f0e3d..8b3c282dcb 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkLayerAndAIPathCostLayer.cpp @@ -282,7 +282,7 @@ namespace Map { /* Process all 8 directions */ - } while ((int)psVar3 < 0xb4908c); + } while ((int)psVar3 < (int)&DAT_TerrainDefinedData::instance.field61_0x138); } /* === ADVANCE TO NEXT TILE IN QUEUE === diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3478b6b8bc..93aafdfa8f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25297,7 +25297,7 @@ SHC_3BB0A8C1_0x004A6DF0 | 78.8% | tile bound off-by-one SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A7090 | 99.2% | global instance call + operand +SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field SHC_3BB0A8C1_0x004A75B0 | 40.4% | compare operand order From d35aa261bea6ff29feeedbe743d81cc04bcce5f8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:51:12 +0200 Subject: [PATCH 176/516] reimplement: SHC_3BB0A8C1_0x0049AF50 12.88% named mapping40x40 field --- .../setChangedLayerZeroBasedOn40x40Layer.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp index ec05702c1d..2d4ef39516 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp @@ -24,18 +24,18 @@ namespace Map { */ int _index4000 = DAT_TileMapState::instance.someIndex * 4000; int _someX = DAT_TileMapState::instance.someIndex * 120; - int _pMap4040 = DAT_TileMapState::instance.someIndex * 40 + 0x1f93438; + byte* _pMap4040 = DAT_TileMapState::instance.mapping40x40[DAT_TileMapState::instance.someIndex]; int _someYLikeLimit = DAT_TileMapState::instance.someYLikeLimit; do { if ((int)DAT_TileMapState::instance.someYLike <= _someYLikeLimit) { flag_and_offset = DAT_TileMapState::instance.someYLike * 10 + 1; int _someY = DAT_TileMapState::instance.someYLike; do { - if (*(char*)(_pMap4040 + _someY) != '\0') { + if (_pMap4040[_someY] != '\0') { /* update this part */ - *(undefined1*)(_pMap4040 + _someY) = 0; + _pMap4040[_someY] = 0; int _cur10 = 0; int _yOffset = _index4000; int _curX = _someX; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 93aafdfa8f..18b5fd21a7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24413,7 +24413,7 @@ SHC_3BB0A8C1_0x0049AAD0 | 82.9% | named matrix end field SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AF50 | 12.9% | Style pass, asm differs +SHC_3BB0A8C1_0x0049AF50 | 12.9% | named mapping40x40 field SHC_3BB0A8C1_0x0049B000 | 0.0% | Pending From 50ab503ff452dfb9cbd3d7660dcf7bd1e4ff5564 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:51:12 +0200 Subject: [PATCH 177/516] reimplement: SHC_3BB0A8C1_0x0049A1C0 49.66% named PathLinkageLayer --- ...updatePathLinkageTileMapRelatedToKeeps.cpp | 29 ++++++++++++------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp index eb1f6c2b79..0563216628 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp @@ -17,7 +17,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049A1C0 void PathFindingState::updatePathLinkageTileMapRelatedToKeeps(int buildingID) { - byte* pbVar1; uint uVar2; int iVar3; int iVar4; @@ -27,9 +26,13 @@ namespace Map { iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; iVar3 = (int)DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight / 2 + (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; - pbVar1 = (byte*)(DAT_ViewportRenderState::instance.translationMatrix[iVar4 + -1].addXgetTile + 0x1e1e4f8 - + iVar3); - *pbVar1 = *pbVar1 | 0x10; + DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + -1].addXgetTile + + iVar3] + = DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + -1].addXgetTile + + iVar3] + | 0x10; DAT_TileMapState::instance .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3] = DAT_TileMapState::instance @@ -47,12 +50,18 @@ namespace Map { if (_orientation != 2) { iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x + (int)uVar2 / 2; - pbVar1 = (byte*)(DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4 + -1].addXgetTile - + 0x1e1e4f8 + iVar3); - *pbVar1 = *pbVar1 | 0x10; - pbVar1 = (byte*)(DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4].addXgetTile - + 0x1e1e4f8 + iVar3); - *pbVar1 = *pbVar1 | 1; + DAT_TileMapState::instance.PathLinkageLayer + [DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4 + -1].addXgetTile + iVar3] + = DAT_TileMapState::instance.PathLinkageLayer + [DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4 + -1].addXgetTile + + iVar3] + | 0x10; + DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4].addXgetTile + + iVar3] + = DAT_TileMapState::instance.PathLinkageLayer + [DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4].addXgetTile + iVar3] + | 1; return; } iVar3 = (short)DAT_BuildingsState::instance.buildings[buildingID].x + -1 + uVar2; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 18b5fd21a7..51c5696049 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24395,7 +24395,7 @@ SHC_3BB0A8C1_0x00499DC0 | 42.9% | Style pass, asm differs SHC_3BB0A8C1_0x00499FA0 | 24.4% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A1C0 | 48.3% | Style pass, asm differs +SHC_3BB0A8C1_0x0049A1C0 | 49.7% | named PathLinkageLayer SHC_3BB0A8C1_0x0049A2E0 | 25.9% | Style pass, asm differs From 5749725f2c3358510c806a50ff442a860be7a210 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:51:13 +0200 Subject: [PATCH 178/516] reimplement: SHC_3BB0A8C1_0x0049AAD0 83.33% named mapping40x40 field --- .../Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp index b6f1ffc391..bc1f5119d2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -59,7 +59,7 @@ namespace Map { } int iVar4 = (int)sVar2 / 10; int iVar5 = iVar8 / 10; - *(undefined1*)(iVar4 + 0x1f93438 + iVar5 * 0x28) = 2; + DAT_TileMapState::instance.mapping40x40[iVar5][iVar4] = 2; if (iVar4 < (int)DAT_TileMapState::instance.someYLike) { DAT_TileMapState::instance.someYLike = iVar4; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 51c5696049..be8460c535 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24409,7 +24409,7 @@ SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AAD0 | 82.9% | named matrix end field +SHC_3BB0A8C1_0x0049AAD0 | 83.3% | named mapping40x40 field SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending From e72b39cd450a60a58387903387add4c1c4be2310 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:58:00 +0200 Subject: [PATCH 179/516] reimplement: SHC_3BB0A8C1_0x004A8860 37.15% named search order bound --- .../Navigation/PathFindingState/findBuildingAccessPoint.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp index 8562452bac..c0d95ddd23 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp @@ -179,7 +179,8 @@ namespace Map { /* Check all cardinal directions */ - } while ((int)pXVar1 < 0xb39238); + } while ((int)pXVar1 + < (int)&DAT_ClimbLogicDefinedData::instance.CardinalHorizontalFirstSearchOrder[4]); /* Increment valid access point count */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index be8460c535..cbcc2fb04f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25315,7 +25315,7 @@ SHC_3BB0A8C1_0x004A83B0 | 60.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A8780 | 40.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A8860 | 34.7% | Style pass, asm differs +SHC_3BB0A8C1_0x004A8860 | 37.1% | named search order bound SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending From 364f1fe6c3c0abda14685c7401789fe3a8000a00 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:58:00 +0200 Subject: [PATCH 180/516] reimplement: SHC_3BB0A8C1_0x004A75B0 40.74% named search order bound --- .../PathFindingState/pathfindingForAttacksUnk.cpp | 8 ++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp index d6258b50e7..c71e61a8f2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -48,9 +48,8 @@ namespace Map { int iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; uint uVar7 = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; iVar10 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; - int bVar1 - = DAT_TileMapState::instance.DefaultHeightLayer[DAT_BuildingsState::instance.buildings[buildingID] - .currentTilePositionAdjusted]; + int bVar1 = DAT_TileMapState::instance.DefaultHeightLayer[DAT_BuildingsState::instance.buildings[buildingID] + .currentTilePositionAdjusted]; int sVar2 = DAT_TribesState::instance.tribes[tribeID].selectionTargetUnitID; local_28 = 0; BOOLEnum BVar4 = MACRO_CALL_MEMBER( @@ -110,7 +109,8 @@ namespace Map { break; } pXVar8 = pXVar8 + 1; - } while ((int)pXVar8 < 0xb39238); + } while ((int)pXVar8 + < (int)&DAT_ClimbLogicDefinedData::instance.CardinalHorizontalFirstSearchOrder[4]); local_24 = local_24 + 3; local_28 = local_28 + 1; if (local_28 >= param_3) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index cbcc2fb04f..5efe1ad075 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25299,7 +25299,7 @@ SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field -SHC_3BB0A8C1_0x004A75B0 | 40.4% | compare operand order +SHC_3BB0A8C1_0x004A75B0 | 40.7% | named search order bound SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs From ef38404fbdd1d5bd7c43144a91358119673842ea Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 03:58:01 +0200 Subject: [PATCH 181/516] reimplement: SHC_3BB0A8C1_0x004A83B0 61.35% named search order bound --- ...eDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index b55feaef44..dce805d568 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -151,7 +151,8 @@ namespace Map { break; } pXVar4 = pXVar4 + 1; - } while ((int)pXVar4 < 0xb39238); + } while ((int)pXVar4 + < (int)&DAT_ClimbLogicDefinedData::instance.CardinalHorizontalFirstSearchOrder[4]); } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; } while ((int)this->searchQueue.readIndex < (int)this->searchQueue.writeIndex); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5efe1ad075..f4f24cca5f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25311,7 +25311,7 @@ SHC_3BB0A8C1_0x004A8220 | 0.0% | Pending SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending -SHC_3BB0A8C1_0x004A83B0 | 60.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A83B0 | 61.4% | named search order bound SHC_3BB0A8C1_0x004A8780 | 40.8% | Style pass, asm differs From 79ecf39b074d7c7ffcf110807642dc8b8faf8068 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:00:36 +0200 Subject: [PATCH 182/516] reimplement: SHC_3BB0A8C1_0x004A1C40 79.73% named playerTeams bound --- .../Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp index 3aa8f1d028..a3e8046693 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp @@ -49,13 +49,12 @@ namespace Map { range / 2 < DAT_DirectionAlgorithmState::instance.distanceHigh)) { piVar2 = piVar2 + 1; piVar1 = piVar1 + 0xe7d; - if (0x117d56b < (int)piVar2) { + if ((int)&DAT_GameState::instance.mapAndTime.playerTeams[9] <= (int)piVar2) { DAT_TileMapState::instance.buildingPlacementFailReason = ((BuildingFailReasonEnum)0x12); return (undefined4)(1); } } return (undefined4)(0); - return (undefined4)(0); } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f4f24cca5f..79ff0e9c37 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25167,7 +25167,7 @@ SHC_3BB0A8C1_0x004A19B0 | 58.2% | Style pass, asm differs SHC_3BB0A8C1_0x004A1AF0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1C40 | 74.3% | Style pass, asm differs +SHC_3BB0A8C1_0x004A1C40 | 79.7% | named playerTeams bound SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending From f2bc21bbd239e23b4b63991b4d2191353beefa55 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:08:20 +0200 Subject: [PATCH 183/516] reimplement: SHC_3BB0A8C1_0x00498FD0 12.61% call via global instance --- .../PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp index fadfb85e3c..4d93fa7f27 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -2,6 +2,7 @@ #include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" @@ -65,7 +66,7 @@ namespace Map { } else { iVar6 = 2000; } - MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, this)( + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, DAT_PathFindingState::ptr)( this->unitX, this->unitY, -1, -1, iVar6, 0); _walkLayer = DAT_TileMapState::instance.WalkLayer[_tile]; _rng = (uint)SEC_RNG::instance.currentNumber2; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 79ff0e9c37..b6c678c54c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24381,7 +24381,7 @@ SHC_3BB0A8C1_0x00498A40 | 78.3% | Style pass, asm differs SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 12.1% | Style pass, asm differs +SHC_3BB0A8C1_0x00498FD0 | 12.6% | call via global instance SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending From 888b45f5a2512551726c4daa3a652546d7014337 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:08:21 +0200 Subject: [PATCH 184/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 28.34% call via global instance --- .../PathFindingState/findCrossAreaBridgeTileToTarget.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index d8eb8863a6..6122b09f5a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -4,6 +4,7 @@ #include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" #include "OpenSHC/Map/Location/Point8IntXY.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" @@ -100,7 +101,7 @@ namespace Map { } else { iVar7 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - this)((int)DAT_UnitsState::instance.units[param_1].owner, + DAT_PathFindingState::ptr)((int)DAT_UnitsState::instance.units[param_1].owner, (dword)((int)((short)DAT_TileMapState::instance.PathConnectionLayer[iVar13])), (dword)((int)((short)uVar2)), (int)(DAT_UnitsState::instance.units[param_1].unitCanClimb)); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b6c678c54c..fe134daf47 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25287,7 +25287,7 @@ SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending SHC_3BB0A8C1_0x004A69F0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6AB0 | 27.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A6AB0 | 28.3% | call via global instance SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending From 3dd8d221f82f388448c9a2d3d97e73bc70c37284 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:08:21 +0200 Subject: [PATCH 185/516] reimplement: SHC_3BB0A8C1_0x004A7F50 51.76% call via global instance --- ...ceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 665ed3dc25..454c078128 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -7,6 +7,7 @@ #include "OpenSHC/Map/Location/Point8ShortXY.hpp" #include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_BuildingsState.hpp" #include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" #include "OpenSHC/Globals/DAT_GameState.hpp" @@ -96,7 +97,7 @@ namespace Map { && (area == (int*)(int)(short)DAT_TileMapState::instance.PathConnectionLayer[_candidate] || (iVar2 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - this)(playerID, (dword)((int)(area)), + DAT_PathFindingState::ptr)(playerID, (dword)((int)(area)), (dword)((int)(( int)(short)DAT_TileMapState::instance.PathConnectionLayer[_candidate])), 0), diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fe134daf47..4db9c6fce1 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25303,7 +25303,7 @@ SHC_3BB0A8C1_0x004A75B0 | 40.7% | named search order bound SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A7F50 | 49.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A7F50 | 51.8% | call via global instance SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending From 896844a1f8a8d0ece4809b703c9af9a60c3523d3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:08:21 +0200 Subject: [PATCH 186/516] reimplement: SHC_3BB0A8C1_0x004A8780 51.32% call via global instance --- .../findUnitPreferredOrientationBasedConnectedTile.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp index 12a36822b7..31a0854513 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp @@ -4,6 +4,7 @@ #include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" #include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" #include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" @@ -47,7 +48,7 @@ namespace Map { if ((int)(short)_area == _toArea || (_can = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - this)((int)DAT_UnitsState::instance.units[unitID].owner, (dword)((int)((short)_area)), + DAT_PathFindingState::ptr)((int)DAT_UnitsState::instance.units[unitID].owner, (dword)((int)((short)_area)), (dword)((int)(_toArea)), 0), _can != 0)) break; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4db9c6fce1..0998b6f970 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25313,7 +25313,7 @@ SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending SHC_3BB0A8C1_0x004A83B0 | 61.4% | named search order bound -SHC_3BB0A8C1_0x004A8780 | 40.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A8780 | 51.3% | call via global instance SHC_3BB0A8C1_0x004A8860 | 37.1% | named search order bound From 6562a647f30bba3aee825c64078809faa21df254 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:08:22 +0200 Subject: [PATCH 187/516] reimplement: SHC_3BB0A8C1_0x004A83B0 62.47% call via global instance --- ...eDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index dce805d568..ad1cae6c00 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -5,6 +5,7 @@ #include "OpenSHC/Map/Location/Point8ShortXY.hpp" #include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" @@ -81,7 +82,7 @@ namespace Map { && (area == (int)(short)DAT_TileMapState::instance.PathConnectionLayer[_candidate] || (iVar2 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - this)(playerID, (dword)((int)(area)), + DAT_PathFindingState::ptr)(playerID, (dword)((int)(area)), (dword)((int)(( int)(short)DAT_TileMapState::instance.PathConnectionLayer[_candidate])), 0), diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0998b6f970..3184afd3af 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25311,7 +25311,7 @@ SHC_3BB0A8C1_0x004A8220 | 0.0% | Pending SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending -SHC_3BB0A8C1_0x004A83B0 | 61.4% | named search order bound +SHC_3BB0A8C1_0x004A83B0 | 62.5% | call via global instance SHC_3BB0A8C1_0x004A8780 | 51.3% | call via global instance From 10408660e1a6358cb890dd2b54e26dc76c5b41a7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:17:41 +0200 Subject: [PATCH 188/516] reimplement: SHC_3BB0A8C1_0x004A79A0 38.24% call via global instance --- .../Map/Navigation/PathFindingState/pathPlanningForTribe.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index 14ddf99fb7..97d24b9596 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -7,6 +7,7 @@ #include "OpenSHC/Map/Location/Point8ShortXY.hpp" #include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_BuildingsState.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" @@ -94,7 +95,7 @@ namespace Map { && ((area == (int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar12] || (iVar5 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - this)(playerID, (dword)((int)(area)), + DAT_PathFindingState::ptr)(playerID, (dword)((int)(area)), (dword)((int)(( int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar12])), 0), diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3184afd3af..2deff465d9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field SHC_3BB0A8C1_0x004A75B0 | 40.7% | named search order bound -SHC_3BB0A8C1_0x004A79A0 | 37.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A79A0 | 38.2% | call via global instance SHC_3BB0A8C1_0x004A7F50 | 51.8% | call via global instance From 3d061872f7035e9efdc49cfebb65a2ec1263db7a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:17:41 +0200 Subject: [PATCH 189/516] reimplement: SHC_3BB0A8C1_0x004A75B0 43.74% calls via global instance --- .../Navigation/PathFindingState/pathfindingForAttacksUnk.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp index c71e61a8f2..081277f652 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -6,6 +6,7 @@ #include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" #include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" #include "OpenSHC/Globals/DAT_BuildingsState.hpp" #include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" @@ -81,7 +82,7 @@ namespace Map { && (((int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar13] == param_4 || (iVar12 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - this)(param_5, (dword)((int)(param_4)), + DAT_PathFindingState::ptr)(param_5, (dword)((int)(param_4)), (dword)(( int)((int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar13])), 0), @@ -154,7 +155,7 @@ namespace Map { || (iVar15 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - this)(param_5, (dword)((int)(param_4)), + DAT_PathFindingState::ptr)(param_5, (dword)((int)(param_4)), (dword)((int)((short)(short)(short) DAT_TileMapState::instance.PathConnectionLayer[tile2])), 0), diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 2deff465d9..e1d33780d0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25299,7 +25299,7 @@ SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field -SHC_3BB0A8C1_0x004A75B0 | 40.7% | named search order bound +SHC_3BB0A8C1_0x004A75B0 | 43.7% | calls via global instance SHC_3BB0A8C1_0x004A79A0 | 38.2% | call via global instance From f088294e902edbbd118c30c6f76244afebcd8747 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:23:43 +0200 Subject: [PATCH 190/516] reimplement: SHC_3BB0A8C1_0x004A1230 59.37% reverted widening, raw better --- .../aggressiveStanceTargetBuildingAtRange.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp index 24c5d92703..70207255dc 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp @@ -43,9 +43,9 @@ namespace Map { uint uVar7; int _nextCandidate; int _tile; - int sVar1 = DAT_UnitsState::instance.units[unitID].x; + short sVar1 = DAT_UnitsState::instance.units[unitID].x; uVar5 = (uint)sVar1; - int sVar2 = DAT_UnitsState::instance.units[unitID].y; + short sVar2 = DAT_UnitsState::instance.units[unitID].y; uVar7 = (uint)sVar2; this->calculations = this->calculations + 1; this->ALG_ResultTile = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e1d33780d0..7964c5ec4f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24877,7 +24877,7 @@ SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending SHC_3BB0A8C1_0x004A0E50 | 94.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004A1230 | 59.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A1230 | 59.4% | reverted widening, raw better SHC_3BB0A8C1_0x004A1568 | 0.0% | Pending From c9e497abb30000025524dc0e0e771e0a2a0d0ff6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:23 +0200 Subject: [PATCH 191/516] reimplement: SHC_3BB0A8C1_0x0049F540 85.27% Style pass, asm differs --- .../Map/Navigation/PathFindingState/algFindAttackAngle.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp index 61744b697c..2fe8dac5d2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp @@ -27,7 +27,10 @@ namespace Map { int _siegeIndex; int _tile; int _tileOption; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return 0; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return 0; } this->calculations = this->calculations + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7964c5ec4f..bf2cef2554 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24713,7 +24713,7 @@ SHC_3BB0A8C1_0x0049F040 | 79.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049F2D0 | 78.7% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F540 | 79.5% | tile bound off-by-one +SHC_3BB0A8C1_0x0049F540 | 85.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049F7D0 | 20.9% | Style pass, asm differs From 71fd40a0f94a863f3e6fe688e6a44a692ac90c5b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:23 +0200 Subject: [PATCH 192/516] reimplement: SHC_3BB0A8C1_0x0049DB30 80.43% Style pass, asm differs --- .../checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp index f4284ba3e6..8685fdbb5b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp @@ -38,7 +38,10 @@ namespace Map { int _tile; int _x; int _y; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bf2cef2554..da7f71ef69 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24693,7 +24693,7 @@ SHC_3BB0A8C1_0x0049D880 | 52.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending -SHC_3BB0A8C1_0x0049DB30 | 78.8% | Style pass, asm differs +SHC_3BB0A8C1_0x0049DB30 | 80.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049DDC0 | 35.7% | Style pass, asm differs From 8010d2ae01b8ccf294e0c5128c730dadaec2fb95 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:24 +0200 Subject: [PATCH 193/516] reimplement: SHC_3BB0A8C1_0x004A9B20 56.47% call via global instance --- src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp index 0a8f252339..92e0653064 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp @@ -4,6 +4,7 @@ #include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" #include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" @@ -35,7 +36,7 @@ namespace Map { return (dword)(0); } dword dVar2 = MACRO_CALL_MEMBER( - OpenSHC::Map::Navigation::PathFindingState_Func::findConnectingAreaBetweenTwoAreas, this)(param_1, + OpenSHC::Map::Navigation::PathFindingState_Func::findConnectingAreaBetweenTwoAreas, DAT_PathFindingState::ptr)(param_1, (dword)((int)((short)DAT_TileMapState::instance.PathConnectionLayer [DAT_ViewportRenderState::instance.translationMatrix[this->unitY].addXgetTile + this->unitX])), diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index da7f71ef69..4274a22543 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25469,7 +25469,7 @@ SHC_3BB0A8C1_0x004A97D0 | 21.5% | Style pass, asm differs SHC_3BB0A8C1_0x004A98C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9B20 | 31.5% | Style pass, asm differs +SHC_3BB0A8C1_0x004A9B20 | 56.5% | call via global instance SHC_3BB0A8C1_0x004A9DD0 | 100.0% | Reimplemented From 646f70ae4441bd6c2e371bf8540d7818f30017dd Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:24 +0200 Subject: [PATCH 194/516] reimplement: SHC_3BB0A8C1_0x0049EDF0 62.50% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp index 2686b1bda3..11e132598a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp @@ -27,7 +27,10 @@ namespace Map { int _candidate; int _tile; this->calculations = this->calculations + 1; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } this->searchGeneration = this->searchGeneration + 1; From 0a7d7abb0bb94c447fb55fb1be319c8207e5808e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:24 +0200 Subject: [PATCH 195/516] reimplement: SHC_3BB0A8C1_0x0049F040 85.27% Style pass, asm differs --- .../PathFindingState/findArcherRelatedAttackInfoIndex.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp index fa51d26010..89fa37d61c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp @@ -30,7 +30,10 @@ namespace Map { int iVar4; int _candidate; int _tile; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return 0; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return 0; } this->calculations = this->calculations + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4274a22543..534d6bed27 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24709,7 +24709,7 @@ SHC_3BB0A8C1_0x0049EDF0 | 62.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049F040 | 79.5% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F040 | 85.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049F2D0 | 78.7% | Style pass, asm differs From c163f18bbe3e8bd9b906f2f6243a82fdd1a95826 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:25 +0200 Subject: [PATCH 196/516] reimplement: SHC_3BB0A8C1_0x0049CD60 37.04% Style pass, asm differs --- .../PathFindingState/findDirectNeighbourWalkableTile.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp index 8164726d94..53e408acae 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp @@ -21,7 +21,10 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049CD60 BOOLEnum PathFindingState::findDirectNeighbourWalkableTile(uint x, uint y) { - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } int _directionIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 534d6bed27..4de7ba8374 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24669,7 +24669,7 @@ SHC_3BB0A8C1_0x0049CB00 | 51.1% | Style pass, asm differs SHC_3BB0A8C1_0x0049CBE0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CD60 | 29.2% | Style pass, asm differs +SHC_3BB0A8C1_0x0049CD60 | 37.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049CDB0 | 0.0% | Pending From 3834d0ffb9c3227d460335c6d018fff28e8ef9ac Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:25 +0200 Subject: [PATCH 197/516] reimplement: SHC_3BB0A8C1_0x00497740 49.51% Style pass, asm differs --- .../PathFindingState/findLinkageBasedPathOrWalkRadius.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp index be8ffe2b34..8944f86256 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp @@ -36,7 +36,10 @@ namespace Map { /* === VALIDATE STARTING POSITION === Check bounds (400x400) and walkability */ - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } /* diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4de7ba8374..b0a51c922d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24365,7 +24365,7 @@ SHC_3BB0A8C1_0x004974D0 | 33.3% | Style pass, asm differs SHC_3BB0A8C1_0x00497690 | 13.6% | Style pass, asm differs -SHC_3BB0A8C1_0x00497740 | 49.2% | Style pass, asm differs +SHC_3BB0A8C1_0x00497740 | 49.5% | Style pass, asm differs SHC_3BB0A8C1_0x00497B80 | 52.4% | Style pass, asm differs From f45878c66b0eca628e994a45c47cd8dd7d827e19 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:25 +0200 Subject: [PATCH 198/516] reimplement: SHC_3BB0A8C1_0x004974D0 34.01% Style pass, asm differs --- .../findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp index 6ee3216af0..3360f63d8a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp @@ -33,7 +33,10 @@ namespace Map { BOOL _status; ushort _area1; uint uVar1 = y2; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return 0; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return 0; } if (x2 <= 399 && y2 <= 399 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b0a51c922d..3dd741a510 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24361,7 +24361,7 @@ SHC_3BB0A8C1_0x00497180 | 29.4% | Style pass, asm differs SHC_3BB0A8C1_0x00497280 | 48.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004974D0 | 33.3% | Style pass, asm differs +SHC_3BB0A8C1_0x004974D0 | 34.0% | Style pass, asm differs SHC_3BB0A8C1_0x00497690 | 13.6% | Style pass, asm differs From c4ee34feeaeef1f06cececfe26af560abcb8a714 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:26 +0200 Subject: [PATCH 199/516] reimplement: SHC_3BB0A8C1_0x0049C370 44.00% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findNoTreeInRange.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp index 64c4d7413c..b12c3e430b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp @@ -34,7 +34,10 @@ namespace Map { this->ALG_ResultTile = 0; this->ALG_ResultY = 0; this->ALG_ResultX = 0; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } this->calculations = this->calculations + 1; From 03c6d65c23ce1567c96655fc1b8c84d71d23e382 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:26 +0200 Subject: [PATCH 200/516] reimplement: SHC_3BB0A8C1_0x00498020 61.05% Style pass, asm differs --- .../findPathUsingClimbingWithHeightMargin16.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp index cef993fcd5..967bd97b8c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -42,7 +42,10 @@ namespace Map { uint _tLogic; BuildingTypeShort _tType; uint _tile; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } if (x2 != 0xffffffff) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3dd741a510..ee8880bdd1 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24369,7 +24369,7 @@ SHC_3BB0A8C1_0x00497740 | 49.5% | Style pass, asm differs SHC_3BB0A8C1_0x00497B80 | 52.4% | Style pass, asm differs -SHC_3BB0A8C1_0x00498020 | 54.8% | Style pass, asm differs +SHC_3BB0A8C1_0x00498020 | 61.0% | Style pass, asm differs SHC_3BB0A8C1_0x00498170 | 0.0% | Pending From 8763538b7e6ab726d3277c129b830c5bc9a39950 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:26 +0200 Subject: [PATCH 201/516] reimplement: SHC_3BB0A8C1_0x004A1D30 68.94% Style pass, asm differs --- .../PathFindingState/findSomeSuitableLocationUnk.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp index c9cea48648..b3c8052732 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -31,7 +31,10 @@ namespace Map { { int iVar5; int iVar8; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return (undefined4)(0); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return (undefined4)(0); } this->calculations = this->calculations + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ee8880bdd1..cf933fa7a4 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25171,7 +25171,7 @@ SHC_3BB0A8C1_0x004A1C40 | 79.7% | named playerTeams bound SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1D30 | 65.7% | Style pass, asm differs +SHC_3BB0A8C1_0x004A1D30 | 68.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending From 47c11e6319828a1cbd5873c2fc17311cfccd4b83 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:27 +0200 Subject: [PATCH 202/516] reimplement: SHC_3BB0A8C1_0x0049F2D0 84.68% Style pass, asm differs --- .../Navigation/PathFindingState/findSupportPointIndex.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp index 1c9dc8b050..2bc47b79ba 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp @@ -27,7 +27,10 @@ namespace Map { int iVar4; int iVar5; int tile; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return 0; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return 0; } this->calculations = this->calculations + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index cf933fa7a4..521e3e6183 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24711,7 +24711,7 @@ SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending SHC_3BB0A8C1_0x0049F040 | 85.3% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F2D0 | 78.7% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F2D0 | 84.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 85.3% | Style pass, asm differs From 33aa63cb06d5e1edbeb7413c5e9a02974622de57 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:27 +0200 Subject: [PATCH 203/516] reimplement: SHC_3BB0A8C1_0x004A15B0 34.62% Style pass, asm differs --- .../Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp index 32fa71e778..5b6b9d1c5e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp @@ -24,7 +24,10 @@ namespace Map { int _yEnemyDistance; int _enemies; short _enemyID; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } _enemies = DAT_GameState::instance.playerDataArray[playerID].enemies; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 521e3e6183..ea98e8a1ad 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25011,7 +25011,7 @@ SHC_3BB0A8C1_0x004A15AE | 0.0% | Pending SHC_3BB0A8C1_0x004A15AF | 0.0% | Pending -SHC_3BB0A8C1_0x004A15B0 | 28.4% | Style pass, asm differs +SHC_3BB0A8C1_0x004A15B0 | 34.6% | Style pass, asm differs SHC_3BB0A8C1_0x004A16C0 | 90.9% | Style pass, asm differs From d319c46cd88c1569b7f3c81988e872926fc8b7da Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:28 +0200 Subject: [PATCH 204/516] reimplement: SHC_3BB0A8C1_0x004A2650 64.83% Style pass, asm differs --- .../Navigation/PathFindingState/isSignPostWithinDistance.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp index 92908c683a..a9b186e382 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp @@ -42,7 +42,10 @@ namespace Map { if (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY) { return FALSE; } - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } this->calculations = this->calculations + 1; From 88c2028e5b29b3b23f04fccf3e550e45a6d7895f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:28 +0200 Subject: [PATCH 205/516] reimplement: SHC_3BB0A8C1_0x004A1C40 91.89% Style pass, asm differs --- .../Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp index a3e8046693..bc7041aa5e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp @@ -27,7 +27,10 @@ namespace Map { { int* piVar1; int* piVar2; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return (undefined4)(0); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return (undefined4)(0); } if (DAT_GameState::instance.playerDataArray[playerID].keep.id != 0 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ea98e8a1ad..69e0b0842f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25167,7 +25167,7 @@ SHC_3BB0A8C1_0x004A19B0 | 58.2% | Style pass, asm differs SHC_3BB0A8C1_0x004A1AF0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1C40 | 79.7% | named playerTeams bound +SHC_3BB0A8C1_0x004A1C40 | 91.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending From a6d6ffd614abf73c6052667d84e9123147704d6b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:28 +0200 Subject: [PATCH 206/516] reimplement: SHC_3BB0A8C1_0x004A4140 84.96% Style pass, asm differs --- .../pathFindingToAttackCastleIncludingMoat.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp index 0e1032dbbf..76f64a0d85 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp @@ -33,7 +33,10 @@ namespace Map { 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.CertainPathLayer))); *out_y = 0; *out_x = 0; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 69e0b0842f..c6ddee9a92 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25219,7 +25219,7 @@ SHC_3BB0A8C1_0x004A3B20 | 34.7% | Style pass, asm differs SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending -SHC_3BB0A8C1_0x004A4140 | 85.0% | unsigned range test +SHC_3BB0A8C1_0x004A4140 | 85.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A4470 | 47.5% | queue wrap off-by-one From 4eea96974218aaa77e60b6d07288ee1664cddbbf Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:29 +0200 Subject: [PATCH 207/516] reimplement: SHC_3BB0A8C1_0x00498400 43.30% Style pass, asm differs --- .../PathFindingState/pathFindingWithBuildingsIncluded.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index dfd6ffbf56..b1ad905845 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -76,7 +76,10 @@ namespace Map { short _currentX; short _currentY; uint _logical; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } if (x2 == 0xffffffff diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c6ddee9a92..f0ea761466 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24373,7 +24373,7 @@ SHC_3BB0A8C1_0x00498020 | 61.0% | Style pass, asm differs SHC_3BB0A8C1_0x00498170 | 0.0% | Pending -SHC_3BB0A8C1_0x00498400 | 41.2% | Style pass, asm differs +SHC_3BB0A8C1_0x00498400 | 43.3% | Style pass, asm differs SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending From 7f9a62827e96456ea42f1c2cbb9a04e64ea7aa25 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:29 +0200 Subject: [PATCH 208/516] reimplement: SHC_3BB0A8C1_0x0049FF20 65.31% Style pass, asm differs --- .../Navigation/PathFindingState/pathfindingRelated49ff20.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp index 99f1629e3e..1b0259cff5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp @@ -30,7 +30,10 @@ namespace Map { dword dVar4 = 1000; int local_4 = 1000; dword local_8 = 0; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return (dword)(dVar4); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return (dword)(dVar4); } this->calculations = this->calculations + 1; From caf76709a45c4a5e735707d69de9784be93010e1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:29 +0200 Subject: [PATCH 209/516] reimplement: SHC_3BB0A8C1_0x0049C020 60.97% Style pass, asm differs --- .../PathFindingState/setupBabyTreeLocationInfo.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp index 56f830ae7e..a19e5e154f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp @@ -34,7 +34,10 @@ namespace Map { this->ALG_ResultTile = 0; this->ALG_ResultY = 0; this->ALG_ResultX = 0; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return (undefined4)(0); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return (undefined4)(0); } this->calculations = this->calculations + 1; From ee0271944a195178bd186043129153bfb6e98f8a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:30 +0200 Subject: [PATCH 210/516] reimplement: SHC_3BB0A8C1_0x004A2A90 60.82% split bounds guard --- .../spreadAlgorithmForFlagsAndBraziersUnk.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp index 6b5be4c359..deda8d7780 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp @@ -52,7 +52,10 @@ namespace Map { int local_8; int local_4; uVar3 = y; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return (undefined4)(0); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return (undefined4)(0); } this->calculations = this->calculations + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f0ea761466..008043c858 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25185,7 +25185,7 @@ SHC_3BB0A8C1_0x004A2740 | 0.0% | Pending SHC_3BB0A8C1_0x004A27D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2A90 | 56.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A2A90 | 60.8% | split bounds guard SHC_3BB0A8C1_0x004A2B70 | 0.0% | Pending From b26ef00ad35f5a6b8a920bafb2c02fad85bc196a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:30 +0200 Subject: [PATCH 211/516] reimplement: SHC_3BB0A8C1_0x0049A370 11.18% Style pass, asm differs --- .../tracePathPlanToDestinationViaUnoccupiedTiles.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp index 0a55ce2ee4..54501250f0 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp @@ -39,7 +39,10 @@ namespace Map { uint _gen; int _tile; short* _walkLayer; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } if (399 < destX || 399 < destY diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 008043c858..a559ebf335 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24399,7 +24399,7 @@ SHC_3BB0A8C1_0x0049A1C0 | 49.7% | named PathLinkageLayer SHC_3BB0A8C1_0x0049A2E0 | 25.9% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A370 | 11.2% | ebp frame via optimize(y,off) +SHC_3BB0A8C1_0x0049A370 | 11.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049A5E0 | 78.3% | Style pass, asm differs From 4c87919caf4fa1c33adfd3b49861fa6640764b0e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 04:36:30 +0200 Subject: [PATCH 212/516] reimplement: SHC_3BB0A8C1_0x004A16C0 94.98% split bounds guard --- .../tracePathToFriendlyDefensesAndReturnTileUnk.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp index de723fccdc..10d99e748c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp @@ -25,7 +25,10 @@ namespace Map { { int (*paiVar7)[8]; int _candidateTile; - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + return 0; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return 0; } this->calculations = this->calculations + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a559ebf335..a719b7df79 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25013,7 +25013,7 @@ SHC_3BB0A8C1_0x004A15AF | 0.0% | Pending SHC_3BB0A8C1_0x004A15B0 | 34.6% | Style pass, asm differs -SHC_3BB0A8C1_0x004A16C0 | 90.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A16C0 | 95.0% | split bounds guard SHC_3BB0A8C1_0x004A1800 | 0.0% | Pending From 5cbaf2e325743033a395a3ee9a77ebde39639487 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:45 +0200 Subject: [PATCH 213/516] reimplement: SHC_3BB0A8C1_0x0049F540 85.60% reuse computed start tile --- .../Map/Navigation/PathFindingState/algFindAttackAngle.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp index 2fe8dac5d2..2b09173b52 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp @@ -45,8 +45,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((_tileOption = this->searchQueue.tilesQueue[this->searchQueue.readIndex], diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a719b7df79..f57deee2da 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24713,7 +24713,7 @@ SHC_3BB0A8C1_0x0049F040 | 85.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049F2D0 | 84.7% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F540 | 85.3% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F540 | 85.6% | reuse computed start tile SHC_3BB0A8C1_0x0049F7D0 | 20.9% | Style pass, asm differs From 3690f422cd8cd7dbe793c3df7bd2a381df321e1a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:45 +0200 Subject: [PATCH 214/516] reimplement: SHC_3BB0A8C1_0x0049DB30 78.99% Style pass, asm differs --- .../checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp index 8685fdbb5b..fe3a7aabb0 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp @@ -55,8 +55,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; bVar3 = this->searchQueue.readIndex == this->searchQueue.writeIndex; while (true) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f57deee2da..233420e1dd 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24693,7 +24693,7 @@ SHC_3BB0A8C1_0x0049D880 | 52.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending -SHC_3BB0A8C1_0x0049DB30 | 80.4% | Style pass, asm differs +SHC_3BB0A8C1_0x0049DB30 | 79.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049DDC0 | 35.7% | Style pass, asm differs From 7761b07985e4fe73614ad2832309535f620da3e1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:46 +0200 Subject: [PATCH 215/516] reimplement: SHC_3BB0A8C1_0x0049EDF0 64.29% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp index 11e132598a..01825839bd 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp @@ -44,8 +44,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 233420e1dd..65576508f0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24705,7 +24705,7 @@ SHC_3BB0A8C1_0x0049E9E0 | 69.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049EB00 | 0.0% | Pending -SHC_3BB0A8C1_0x0049EDF0 | 62.5% | Style pass, asm differs +SHC_3BB0A8C1_0x0049EDF0 | 64.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending From 9f7576f267771cd6b3ae8d3e1a71631db5113378 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:46 +0200 Subject: [PATCH 216/516] reimplement: SHC_3BB0A8C1_0x0049F040 85.60% Style pass, asm differs --- .../PathFindingState/findArcherRelatedAttackInfoIndex.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp index 89fa37d61c..6808167780 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp @@ -48,8 +48,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 65576508f0..09e50d20bb 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24709,7 +24709,7 @@ SHC_3BB0A8C1_0x0049EDF0 | 64.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049F040 | 85.3% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F040 | 85.6% | Style pass, asm differs SHC_3BB0A8C1_0x0049F2D0 | 84.7% | Style pass, asm differs From c3231b82b92707aa9638aed6d590f40df7a3dc19 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:46 +0200 Subject: [PATCH 217/516] reimplement: SHC_3BB0A8C1_0x0049D880 52.40% Style pass, asm differs --- .../findClosestFreeTileNearUnitOnBuilding.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp index ae42aeee8b..236450c71b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp @@ -48,8 +48,9 @@ namespace Map { *pY = (int)DAT_UnitsState::instance.units[unitID].y; this->searchQueue.yQueue[0] = DAT_UnitsState::instance.units[unitID].y; this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[unitID].x; - this->searchQueue.tilesQueue[0] = DAT_UnitsState::instance.units[unitID].tile; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] + int _startTile = DAT_UnitsState::instance.units[unitID].tile; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { From b565e39056ba164debd72c754a7630c2646268b3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:47 +0200 Subject: [PATCH 218/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 28.34% Style pass, asm differs --- .../PathFindingState/findCrossAreaBridgeTileToTarget.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index 6122b09f5a..3ca5d56308 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -63,8 +63,9 @@ namespace Map { + param_2]; this->searchQueue.yQueue[0] = DAT_UnitsState::instance.units[param_1].y; this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[param_1].x; - this->searchQueue.tilesQueue[0] = DAT_UnitsState::instance.units[param_1].tile; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_UnitsState::instance.units[param_1].tile; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 09e50d20bb..5f4335c3df 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25287,7 +25287,7 @@ SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending SHC_3BB0A8C1_0x004A69F0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6AB0 | 28.3% | call via global instance +SHC_3BB0A8C1_0x004A6AB0 | 28.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending From 2a446208c05a1324a9d95279f5eccaf06d4d62ed Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:47 +0200 Subject: [PATCH 219/516] reimplement: SHC_3BB0A8C1_0x0049B940 70.34% Style pass, asm differs --- .../findMapBorderEdgeTileAndStoreInSignpostData.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp index bbf39b93c2..adcd906196 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp @@ -48,8 +48,9 @@ namespace Map { this->searchQueue.readIndex = 0; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], (uint)_tile < 80400) { From 48b268e675e7a41c88451338989c871b49d10824 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:47 +0200 Subject: [PATCH 220/516] reimplement: SHC_3BB0A8C1_0x004A19B0 60.14% reuse computed start tile --- .../Map/Navigation/PathFindingState/findOwnedGatehouse.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp index 8a25b62269..cb41e4b362 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp @@ -41,8 +41,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5f4335c3df..43ee7f2734 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25163,7 +25163,7 @@ SHC_3BB0A8C1_0x004A19AD | 0.0% | Pending SHC_3BB0A8C1_0x004A19AE | 0.0% | Pending -SHC_3BB0A8C1_0x004A19B0 | 58.2% | Style pass, asm differs +SHC_3BB0A8C1_0x004A19B0 | 60.1% | reuse computed start tile SHC_3BB0A8C1_0x004A1AF0 | 0.0% | Pending From f616c0b57785a4c52ac52c5f3c1813527d7bc907 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:48 +0200 Subject: [PATCH 221/516] reimplement: SHC_3BB0A8C1_0x00498020 58.31% reuse computed start tile --- .../findPathUsingClimbingWithHeightMargin16.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp index 967bd97b8c..89b1ed02e9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -72,8 +72,9 @@ namespace Map { } this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (x2 == 0xffffffff) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 43ee7f2734..d28839e89f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24369,7 +24369,7 @@ SHC_3BB0A8C1_0x00497740 | 49.5% | Style pass, asm differs SHC_3BB0A8C1_0x00497B80 | 52.4% | Style pass, asm differs -SHC_3BB0A8C1_0x00498020 | 61.0% | Style pass, asm differs +SHC_3BB0A8C1_0x00498020 | 58.3% | reuse computed start tile SHC_3BB0A8C1_0x00498170 | 0.0% | Pending From b8d4d633a1ef8331ee10acebebec7cd4636dc6c3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:48 +0200 Subject: [PATCH 222/516] reimplement: SHC_3BB0A8C1_0x004A1D30 65.67% Style pass, asm differs --- .../PathFindingState/findSomeSuitableLocationUnk.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp index b3c8052732..2a6f0cfbe6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -49,8 +49,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d28839e89f..ed2c5dd91a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25171,7 +25171,7 @@ SHC_3BB0A8C1_0x004A1C40 | 91.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1D30 | 68.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A1D30 | 65.7% | Style pass, asm differs SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending From 9edc37f4487e9aa2b67f81ec22a01b1ddb569b79 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:48 +0200 Subject: [PATCH 223/516] reimplement: SHC_3BB0A8C1_0x0049F2D0 85.02% Style pass, asm differs --- .../Navigation/PathFindingState/findSupportPointIndex.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp index 2bc47b79ba..86ba74d988 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp @@ -45,8 +45,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ed2c5dd91a..b977ee8129 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24711,7 +24711,7 @@ SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending SHC_3BB0A8C1_0x0049F040 | 85.6% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F2D0 | 84.7% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F2D0 | 85.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 85.6% | reuse computed start tile From 521f39618084cf5ddc4ae27539816c7e7f5e1828 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:49 +0200 Subject: [PATCH 224/516] reimplement: SHC_3BB0A8C1_0x0049D340 64.60% Style pass, asm differs --- .../findWalkableTileThatDoesNotContainUnit.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp index 9355cfc4e9..8aa77658a1 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp @@ -53,8 +53,9 @@ namespace Map { _area = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[unitID].tile]; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if ((DAT_TileMapState::instance.LogicLayer[this->searchQueue.tilesQueue[0]] & 0x30) == 0 && this->searchQueue.readIndex != this->searchQueue.writeIndex) { From c7fbb4c10a36db6bea139244839efcad20add1af Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:49 +0200 Subject: [PATCH 225/516] reimplement: SHC_3BB0A8C1_0x004A9200 45.71% Style pass, asm differs --- .../PathFindingState/isOpponentBuildingInRange.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index 8a3a50974d..2f930ccbbd 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -49,8 +49,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (( diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b977ee8129..fd76f79a55 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25453,7 +25453,7 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 45.2% | Style pass, asm differs +SHC_3BB0A8C1_0x004A9200 | 45.7% | Style pass, asm differs SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented From 3085c14906d2b7208ff9bf0ef4fd7ae19adb6365 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:49 +0200 Subject: [PATCH 226/516] reimplement: SHC_3BB0A8C1_0x0049C020 61.36% Style pass, asm differs --- .../PathFindingState/setupBabyTreeLocationInfo.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp index a19e5e154f..5b65ccd733 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp @@ -52,8 +52,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fd76f79a55..ec8b0731e2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24443,7 +24443,7 @@ SHC_3BB0A8C1_0x0049BD40 | 0.0% | Pending SHC_3BB0A8C1_0x0049BE60 | 48.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049C020 | 61.0% | Style pass, asm differs +SHC_3BB0A8C1_0x0049C020 | 61.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049C100 | 0.0% | Pending From a85df7f6fc5dd3bed421a3420bb882f162f2a957 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:50 +0200 Subject: [PATCH 227/516] reimplement: SHC_3BB0A8C1_0x0049D640 77.97% Style pass, asm differs --- .../PathFindingState/someBinaryAlgFunctionPathFinding.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp index 4986a32482..16a8f316c4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp @@ -35,8 +35,9 @@ namespace Map { ushort uVar1 = DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[param_1].tile]; this->searchQueue.yQueue[0] = DAT_UnitsState::instance.units[param_1].y; this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[param_1].x; - this->searchQueue.tilesQueue[0] = DAT_UnitsState::instance.units[param_1].tile; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_UnitsState::instance.units[param_1].tile; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { From 50b174203fa1d903af3ef40fb5ffe179ffb878b3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:01:50 +0200 Subject: [PATCH 228/516] reimplement: SHC_3BB0A8C1_0x004A16C0 97.26% reuse computed start tile --- .../tracePathToFriendlyDefensesAndReturnTileUnk.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp index 10d99e748c..2f69e83887 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathToFriendlyDefensesAndReturnTileUnk.cpp @@ -43,8 +43,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { _candidateTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ec8b0731e2..99b7240e14 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25013,7 +25013,7 @@ SHC_3BB0A8C1_0x004A15AF | 0.0% | Pending SHC_3BB0A8C1_0x004A15B0 | 34.6% | Style pass, asm differs -SHC_3BB0A8C1_0x004A16C0 | 95.0% | split bounds guard +SHC_3BB0A8C1_0x004A16C0 | 97.3% | reuse computed start tile SHC_3BB0A8C1_0x004A1800 | 0.0% | Pending From a39dcabf64ae4c210b25a60bac4adbf057623dde Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:09:50 +0200 Subject: [PATCH 229/516] reimplement: SHC_3BB0A8C1_0x004A1C40 95.95% walking pointer base offset --- .../PathFindingState/isTileInRangeOfKeepRange.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp index bc7041aa5e..22422898f2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp @@ -42,13 +42,13 @@ namespace Map { DAT_DirectionAlgorithmState::instance.distanceHigh <= range)) { return (undefined4)(0); } - piVar1 = &DAT_GameState::instance.playerDataArray[1].keep.yEntry; + piVar1 = &DAT_GameState::instance.playerDataArray[1].keep.tileEntry; piVar2 = DAT_GameState::instance.mapAndTime.playerTeams + 1; while (*piVar2 != DAT_GameState::instance.mapAndTime.playerTeams[playerID] - || ((BuildingEntryInfo*)(piVar1 + -2))->id == 0 + || ((BuildingEntryInfo*)(piVar1 + -3))->id == 0 || (MACRO_CALL_MEMBER( OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, - DAT_DirectionAlgorithmState::ptr)(x, (int)(y), (int)(piVar1[-1]), (int)(*piVar1)), + DAT_DirectionAlgorithmState::ptr)(x, (int)(y), (int)(piVar1[-2]), (int)(piVar1[-1])), range / 2 < DAT_DirectionAlgorithmState::instance.distanceHigh)) { piVar2 = piVar2 + 1; piVar1 = piVar1 + 0xe7d; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 99b7240e14..c0b231b562 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25167,7 +25167,7 @@ SHC_3BB0A8C1_0x004A19B0 | 60.1% | reuse computed start tile SHC_3BB0A8C1_0x004A1AF0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1C40 | 91.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A1C40 | 96.0% | walking pointer base offset SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending From e6cdd4e1ca8edfed256b62cfc4d8add7889ab4ad Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:24:25 +0200 Subject: [PATCH 230/516] reimplement: SHC_3BB0A8C1_0x004A6DF0 78.81% Style pass, asm differs --- .../PathFindingState/canNavigateFunctionReturnsArea.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp index a51953d0b1..39732d2d55 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp @@ -46,9 +46,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)unitY; this->searchQueue.xQueue[0] = (short)unitX; - this->searchQueue.tilesQueue[0] - = DAT_ViewportRenderState::instance.translationMatrix[unitY].addXgetTile + unitX; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[unitY].addXgetTile + unitX; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c0b231b562..21e6c38a0b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25293,7 +25293,7 @@ SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending SHC_3BB0A8C1_0x004A6C40 | 0.0% | Pending -SHC_3BB0A8C1_0x004A6DF0 | 78.8% | tile bound off-by-one +SHC_3BB0A8C1_0x004A6DF0 | 78.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending From e2db04910d0a1686da2bed26a2705e94b2cf5b6b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:24:25 +0200 Subject: [PATCH 231/516] reimplement: SHC_3BB0A8C1_0x004A01D0 56.03% reuse computed start tile --- .../PathFindingState/findBestAttackTileByPathCost.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp index 3936f3b5f8..5757fca304 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp @@ -48,9 +48,9 @@ namespace Map { this->searchQueue.writeIndex = 1; this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)param_2; - this->searchQueue.tilesQueue[0] - = DAT_ViewportRenderState::instance.translationMatrix[param_2].addXgetTile + param_1; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[param_2].addXgetTile + param_1; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; dVar4 = local_8; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 21e6c38a0b..48ed961a7c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24729,7 +24729,7 @@ SHC_3BB0A8C1_0x0049FF20 | 65.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A0050 | 0.0% | Pending -SHC_3BB0A8C1_0x004A01D0 | 54.6% | Style pass, asm differs +SHC_3BB0A8C1_0x004A01D0 | 56.0% | reuse computed start tile SHC_3BB0A8C1_0x004A0300 | 0.0% | Pending From de6794561be2d18861bddeebf57d67d8aab3801d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:24:26 +0200 Subject: [PATCH 232/516] reimplement: SHC_3BB0A8C1_0x004A0B20 65.16% Style pass, asm differs --- .../PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp index c9cb650090..6effb589e1 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp @@ -43,9 +43,9 @@ namespace Map { this->searchQueue.readIndex = 0; this->searchQueue.writeIndex = 1; this->searchQueue.currentDistance = 1; - this->searchQueue.tilesQueue[0] - = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { return 0; From 8847e17e4587f7599f74e4cf1f02e3ba96432707 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:24:26 +0200 Subject: [PATCH 233/516] reimplement: SHC_3BB0A8C1_0x0049CE40 51.13% Style pass, asm differs --- .../findPathableTileWithoutUnitWithBuildingAtXY.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp index 71ffed38fb..69e025b41b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp @@ -45,9 +45,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] - = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; _buildingAtStart = DAT_TileMapState::instance.BuildingLayer[this->searchQueue.tilesQueue[0]]; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { From a6ff0754a7f2603c065d02e3682bf5971312f300 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:24:26 +0200 Subject: [PATCH 234/516] reimplement: SHC_3BB0A8C1_0x0049AAD0 84.03% reuse computed start tile --- .../Navigation/PathFindingState/updateWalkAndPathLayer.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp index bc1f5119d2..4faac94d39 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -40,9 +40,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)yPosition; this->searchQueue.xQueue[0] = (short)xPosition; - this->searchQueue.tilesQueue[0] - = DAT_ViewportRenderState::instance.translationMatrix[yPosition].addXgetTile + xPosition; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + int _startTile = DAT_ViewportRenderState::instance.translationMatrix[yPosition].addXgetTile + xPosition; + this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { uint uVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 48ed961a7c..fb6fc5c33a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24409,7 +24409,7 @@ SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AAD0 | 83.3% | named mapping40x40 field +SHC_3BB0A8C1_0x0049AAD0 | 84.0% | reuse computed start tile SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending From 661555536f3b87121f142e64d093f54f70228bdc Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:45:39 +0200 Subject: [PATCH 235/516] reimplement: SHC_3BB0A8C1_0x004A4470 49.50% area read via local; compare v --- .../PathFindingState/computeAIZoneLayer.cpp | 13 +++++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp index c11f2d5014..4d062b46e6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp @@ -33,6 +33,7 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x004A4470 void PathFindingState::computeAIZoneLayer(int attackedPlayerID, int canReachKeep, int param_3) { + int _areaID; uint uVar1; int _offsetTile; int _direction; @@ -108,8 +109,8 @@ namespace Map { this direction, OR b) There's a gate (GATEHOUSELARGE or GATEHOUSESMALL) on the tile */ - if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' - && (short)DAT_TileMapState::instance.PathConnectionLayer[_offsetTile] != 0 + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] <= '\0' + && (_areaID = (short)DAT_TileMapState::instance.PathConnectionLayer[_offsetTile], _areaID != 0) && ((DAT_TileMapState::instance.PathLinkageLayer[_candidateTile] & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) != 0 @@ -193,7 +194,7 @@ namespace Map { cliff, or border) 3. Either no building OR building allows passage (unknownFlag4 == 0) */ - if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] <= '\0' && (uVar1 = DAT_TileMapState::instance.LogicLayer[_offsetTile], (uVar1 & 0x31) == 0) && (DAT_TileMapState::instance.BuildingLayer[_offsetTile] == 0 || (DAT_BuildingsState::instance @@ -233,7 +234,7 @@ namespace Map { === TILE 2 (same logic as tile 1) === */ _offsetTile = *piVar3 + _direction; - if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] <= '\0' && (uVar1 = DAT_TileMapState::instance.LogicLayer[_offsetTile], (uVar1 & 0x31) == 0) && (DAT_TileMapState::instance.BuildingLayer[_offsetTile] == 0 || (DAT_BuildingsState::instance @@ -257,7 +258,7 @@ namespace Map { === TILE 3 (same logic as tile 1) === */ _offsetTile = piVar3[1] + _direction; - if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] <= '\0' && (uVar1 = DAT_TileMapState::instance.LogicLayer[_offsetTile], (uVar1 & 0x31) == 0) && (DAT_TileMapState::instance.BuildingLayer[_offsetTile] == 0 || (DAT_BuildingsState::instance @@ -281,7 +282,7 @@ namespace Map { === TILE 4 (same logic as tile 1) === */ _offsetTile = piVar3[2] + _direction; - if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] < '\x01' + if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] <= '\0' && (uVar1 = DAT_TileMapState::instance.LogicLayer[_offsetTile], (uVar1 & 0x31) == 0) && (DAT_TileMapState::instance.BuildingLayer[_offsetTile] == 0 || (DAT_BuildingsState::instance diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fb6fc5c33a..0530de3e94 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25221,7 +25221,7 @@ SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending SHC_3BB0A8C1_0x004A4140 | 85.0% | Style pass, asm differs -SHC_3BB0A8C1_0x004A4470 | 47.5% | queue wrap off-by-one +SHC_3BB0A8C1_0x004A4470 | 49.5% | area read via local; compare v SHC_3BB0A8C1_0x004A4500 | 0.0% | Pending From 14c48f6c9d6ea60fc97c40d6c7c1938e90dbca37 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:45:40 +0200 Subject: [PATCH 236/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 22.63% split bounds guard --- .../findAppropriateLocationForSiegeTent.cpp | 8 +++++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index a15a25cfa9..6b04bf1572 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -42,7 +42,13 @@ namespace Map { === INITIAL VALIDATION === Check if coordinates are within map bounds (400x400) and if the tile is walkable */ - if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { + /* + Invalid position - out of bounds or unwalkable + */ + return (dword)(0); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { /* Invalid position - out of bounds or unwalkable */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0530de3e94..27705cb994 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24715,7 +24715,7 @@ SHC_3BB0A8C1_0x0049F2D0 | 85.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 85.6% | reuse computed start tile -SHC_3BB0A8C1_0x0049F7D0 | 20.9% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F7D0 | 22.6% | split bounds guard SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending From e9b58d0dd05da7464f0e5178b1a73c631ab7abb9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:45:40 +0200 Subject: [PATCH 237/516] reimplement: SHC_3BB0A8C1_0x004A6010 39.05% shared -1 constant --- .../findBestAttackTargetTileWithHeightAndOwner.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp index a03778aba2..c36ac185f5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -51,7 +51,7 @@ namespace Map { uint local_8; local_14 = -1; local_10 = -1; - local_c = 0xffffffff; + local_c = -1; this->calculations = this->calculations + 1; local_20 = 1000000; this->ALG_TargetTile = 0; @@ -113,7 +113,7 @@ namespace Map { if ((uVar8 & 0x400) == 0) { iVar9 = 0x4b; } - if ((int)this->searchQueue.currentDistance < 1) { + if ((int)this->searchQueue.currentDistance <= 0) { iVar9 = 100000; } else if ((int)this->searchQueue.currentDistance < 0x10) { iVar9 = (iVar9 + -100) * this->searchQueue.currentDistance + 0x5dc; @@ -126,7 +126,7 @@ namespace Map { && param_9 == 0) { iVar9 = (uint)DAT_TileMapState::instance.HeightLayer[uVar4] - (uint)DAT_TileMapState::instance.DefaultHeightLayer[uVar4]; - if ((int)this->searchQueue.currentDistance < 1) { + if ((int)this->searchQueue.currentDistance <= 0) { iVar9 = 100000; } else if ((int)this->searchQueue.currentDistance < 0x10) { iVar9 = (0x14 - this->searchQueue.currentDistance) * 300 + iVar9; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 27705cb994..a9eabcad52 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25271,7 +25271,7 @@ SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A5F90 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6010 | 37.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A6010 | 39.0% | shared -1 constant SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending From 8f7f0782d5ac10e31c3a9174b82b4768dd76fc0c Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:45:40 +0200 Subject: [PATCH 238/516] reimplement: SHC_3BB0A8C1_0x004A58A0 15.15% compare against 0 not 1 --- .../PathFindingState/findConnectingAreaBetweenTwoAreas.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp index 7ada68400b..a2365957ae 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp @@ -120,7 +120,7 @@ namespace Map { adStack_960[iVar6] = dVar8; aiStack_640[iVar4 * 2 + 1] = 1; iVar3 = iVar6 + 1; - if ((int)dVar2 < 1) + if ((int)dVar2 <= 0) goto LAB_004a5ad0; adStack_960[iVar6 + 1] = dVar2; } else { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a9eabcad52..a9970b11b9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25257,7 +25257,7 @@ SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending SHC_3BB0A8C1_0x004A5770 | 0.0% | Pending -SHC_3BB0A8C1_0x004A58A0 | 14.6% | Style pass, asm differs +SHC_3BB0A8C1_0x004A58A0 | 15.2% | compare against 0 not 1 SHC_3BB0A8C1_0x004A5980 | 0.0% | Pending From d3b2f5fdec90943f6e62fe44d134af7e52ea59a1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:45:41 +0200 Subject: [PATCH 239/516] reimplement: SHC_3BB0A8C1_0x0049BE60 54.46% compare against 0 not 1 --- .../Map/Navigation/PathFindingState/getTileInSquareBrush.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp index c768b1306b..83473685b4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp @@ -54,7 +54,7 @@ namespace Map { && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] != '\0') { _tileArray[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; _yArray[0] = y; - if (brushTileIndex < 1) { + if (brushTileIndex <= 0) { this->resultY = y; this->resultTile = _tileArray[0]; return; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a9970b11b9..13f5ec18ce 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24441,7 +24441,7 @@ SHC_3BB0A8C1_0x0049BCD0 | 0.0% | Pending SHC_3BB0A8C1_0x0049BD40 | 0.0% | Pending -SHC_3BB0A8C1_0x0049BE60 | 48.0% | Style pass, asm differs +SHC_3BB0A8C1_0x0049BE60 | 54.5% | compare against 0 not 1 SHC_3BB0A8C1_0x0049C020 | 61.4% | Style pass, asm differs From 2005bd74dbe8805c593ab8970adad29767042660 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:45:41 +0200 Subject: [PATCH 240/516] reimplement: SHC_3BB0A8C1_0x004A4930 68.42% statement reorder --- .../PathFindingState/setClimbBasedOnClosestClimbData.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp index dd1d04b11e..69a2f3f149 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp @@ -55,9 +55,9 @@ namespace Map { _distance = DAT_DirectionAlgorithmState::instance.distanceHigh + _pClimbData->numberOfUnitsUsing * 8; if (_distance < _minDistance) { - _climbData2 = _climbDataCounter; - _minDistance = _distance; _downOrUp = _downOrUp1; + _minDistance = _distance; + _climbData2 = _climbDataCounter; if (_downOrUp1 == 0) { this->climbX = _pClimbData->bottomXPosition; this->climbY = _pClimbData->bottomYPosition; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 13f5ec18ce..885187b49e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25229,7 +25229,7 @@ SHC_3BB0A8C1_0x004A4550 | 0.0% | Pending SHC_3BB0A8C1_0x004A46C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A4930 | 65.8% | ClimbData stride bug fixed +SHC_3BB0A8C1_0x004A4930 | 68.4% | statement reorder SHC_3BB0A8C1_0x004A4B30 | 79.0% | Style pass, asm differs From 906f640bbeeabc76d46911106ac8bdbd35a8f2a6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 05:45:41 +0200 Subject: [PATCH 241/516] reimplement: SHC_3BB0A8C1_0x004A67D0 73.08% compare against 0 not 1 --- .../Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp index 34116a0470..9721322065 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp @@ -45,7 +45,7 @@ namespace Map { MACRO_CALL_MEMBER(OpenSHC::Map::Units::TribesState_Func::addUnitToTribe, DAT_TribesState::ptr)(_unitID_2, tribeID); } - if (count < 1) { + if (count <= 0) { return; } MACRO_CALL_MEMBER( diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 885187b49e..bd15b0b5db 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25281,7 +25281,7 @@ SHC_3BB0A8C1_0x004A65E0 | 70.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A66D0 | 84.6% | Style pass, asm differs -SHC_3BB0A8C1_0x004A67D0 | 72.1% | Style pass, asm differs +SHC_3BB0A8C1_0x004A67D0 | 73.1% | compare against 0 not 1 SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending From f66d7eed81ba106e479a42257b3b93e8b2c98123 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:00:11 +0200 Subject: [PATCH 242/516] reimplement: SHC_3BB0A8C1_0x004A8860 38.51% abs() instead of shift idiom --- .../Navigation/PathFindingState/findBuildingAccessPoint.cpp | 5 ++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp index c0d95ddd23..27c608b75b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp @@ -44,7 +44,6 @@ namespace Map { uint _heightDiff2; int _candidate2; XYPair* pXVar1; - uint uVar2; int _closestDistance; int _closestTile; int _entranceCandidate; @@ -134,7 +133,7 @@ namespace Map { === HEIGHT VALIDATION #2: Building Terrain Height === Check if access point is within 16 height units of building's actual terrain height */ - if ((int)((_heightDiff ^ (int)_heightDiff >> 0x1f) - ((int)_heightDiff >> 0x1f)) < 32 + if (abs(_heightDiff) < 32 && ((int)(short)DAT_TileMapState::instance.PathConnectionLayer[_entranceCandidate] == (int)(short)_unitArea || (_canNav = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: @@ -146,7 +145,7 @@ namespace Map { _canNav != 0)) && (_heightDiff2 = (int)DAT_BuildingsState::instance.buildings[buildingID].terrainHeightUnk - (uint)_cHeight, - uVar2 = (int)_heightDiff2 >> 0x1f, (int)((_heightDiff2 ^ uVar2) - uVar2) < 16)) { + abs(_heightDiff2) < 16)) { /* === ACCESS POINT IS VALID - ADD TO LIST === Store the access tile */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bd15b0b5db..40012f68aa 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25315,7 +25315,7 @@ SHC_3BB0A8C1_0x004A83B0 | 62.5% | call via global instance SHC_3BB0A8C1_0x004A8780 | 51.3% | call via global instance -SHC_3BB0A8C1_0x004A8860 | 37.1% | named search order bound +SHC_3BB0A8C1_0x004A8860 | 38.5% | abs() instead of shift idiom SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending From 4c12119a0b8712cbd9f770e45588e92634fff1d6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:00:12 +0200 Subject: [PATCH 243/516] reimplement: SHC_3BB0A8C1_0x00496F90 51.61% abs() instead of shift idiom --- ...eInExistingSearchThatIsModuloDistanceAway.cpp | 16 ++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp index 801ffad23c..bf0b95bce4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp @@ -18,27 +18,23 @@ namespace Map { void PathFindingState::findNextTileInExistingSearchThatIsModuloDistanceAway(int modulo, int x, int y) { int iVar2; - uint uVar3; - uint uVar4; + int _dx; + int _dy; int* _pLastTile; - uint uVar5; - uint uVar6; int local_10; local_10 = 0; _pLastTile = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; while (true) { int iVar1 = *_pLastTile; if (0 < DAT_TileMapState::instance.CertainPathLayer[iVar1] - && (uVar3 = (iVar1 - - DAT_ViewportRenderState::instance + && (_dx = (iVar1 + - DAT_ViewportRenderState::instance .translationMatrix[DAT_ViewportRenderState::instance .tileTranslationMatrix_YComponent[iVar1]] .addXgetTile) - x, - uVar5 = (int)uVar3 >> 0x1f, - uVar4 = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[iVar1] - y, - uVar6 = (int)uVar4 >> 0x1f, - (int)(((uVar4 ^ uVar6) - uVar6) + ((uVar3 ^ uVar5) - uVar5)) % modulo == 0) + _dy = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[iVar1] - y, + (abs(_dy) + abs(_dx)) % modulo == 0) && (iVar2 = DAT_TribesState::instance.ALG_ResultTileIndex, DAT_TileMapState::instance.CertainPathLayer[iVar1] < 4000)) break; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 40012f68aa..0182cea4ca 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24353,7 +24353,7 @@ SHC_3BB0A8C1_0x00496EA0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00496EC0 | 47.5% | Style pass, asm differs -SHC_3BB0A8C1_0x00496F90 | 20.0% | Style pass, asm differs +SHC_3BB0A8C1_0x00496F90 | 51.6% | abs() instead of shift idiom SHC_3BB0A8C1_0x00497080 | 34.0% | Style pass, asm differs From 4bb4dde336ab2694f1cb00d3956909e9d0e933d9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:00:12 +0200 Subject: [PATCH 244/516] reimplement: SHC_3BB0A8C1_0x004A79A0 49.93% abs() instead of shift idiom --- .../PathFindingState/pathPlanningForTribe.cpp | 24 +++++-------------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index 97d24b9596..437b2b1ca5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -37,8 +37,6 @@ namespace Map { { int iVar5; BOOLEnum BVar6; - uint uVar7; - uint uVar8; int (*paiVar9)[8]; int* _pDest2; uint uVar11; @@ -154,18 +152,13 @@ namespace Map { DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar12]); uVar11 = uVar11 + iVar12; } - uVar7 = y - (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; - uVar8 = (int)uVar7 >> 0x1f; - iVar5 = (uVar7 ^ uVar8) - uVar8; - uVar7 = x - (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; - uVar8 = (int)uVar7 >> 0x1f; - iVar12 = (uVar7 ^ uVar8) - uVar8; + iVar5 = abs(y - (int)this->searchQueue.yQueue[this->searchQueue.readIndex]); + iVar12 = abs(x - (int)this->searchQueue.xQueue[this->searchQueue.readIndex]); if (iVar12 <= iVar5) { iVar12 = iVar5; } if (iVar12 == 2 - && (uVar7 = (int)(tribeID - uVar11) >> 0x1f, - (int)((tribeID - uVar11 ^ uVar7) - uVar7) < 0x20)) { + && (abs(tribeID - uVar11) < 0x20)) { _pDest1[-1] = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; _destIndex = _destIndex + 1; *_pDest1 = 1; @@ -199,18 +192,13 @@ namespace Map { DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar12]); uVar11 = uVar11 + iVar12; } - uVar7 = y - (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; - uVar8 = (int)uVar7 >> 0x1f; - iVar5 = (uVar7 ^ uVar8) - uVar8; - uVar7 = x - (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; - uVar8 = (int)uVar7 >> 0x1f; - iVar12 = (uVar7 ^ uVar8) - uVar8; + iVar5 = abs(y - (int)this->searchQueue.yQueue[this->searchQueue.readIndex]); + iVar12 = abs(x - (int)this->searchQueue.xQueue[this->searchQueue.readIndex]); if (iVar12 <= iVar5) { iVar12 = iVar5; } if (iVar12 == 1 - && (uVar7 = (int)(tribeID - uVar11) >> 0x1f, - (int)((tribeID - uVar11 ^ uVar7) - uVar7) < 0x20)) { + && (abs(tribeID - uVar11) < 0x20)) { ((PathHelper12*)(_pDest2 + -1))->tile1 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; _destIndex = _destIndex + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0182cea4ca..59ae1e20d9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field SHC_3BB0A8C1_0x004A75B0 | 43.7% | calls via global instance -SHC_3BB0A8C1_0x004A79A0 | 38.2% | call via global instance +SHC_3BB0A8C1_0x004A79A0 | 49.9% | abs() instead of shift idiom SHC_3BB0A8C1_0x004A7F50 | 51.8% | call via global instance From 2d7736073b7866b1252ccf2752ea72570ecd7202 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:10:54 +0200 Subject: [PATCH 245/516] reimplement: SHC_3BB0A8C1_0x0049D880 75.73% abs() instead of shift idiom --- .../findClosestFreeTileNearUnitOnBuilding.cpp | 6 ++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp index 236450c71b..549397971e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp @@ -50,8 +50,7 @@ namespace Map { this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[unitID].x; int _startTile = DAT_UnitsState::instance.units[unitID].tile; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] - = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { return (undefined4)(1); @@ -67,8 +66,7 @@ namespace Map { uint uVar1 = _x - x; uVar3 = (int)uVar1 >> 0x1f; int _absDistX = (uVar1 ^ uVar3) - uVar3; - uVar1 = iVar5 - y >> 0x1f; - int _absDistY = (iVar5 - y ^ uVar1) - uVar1; + int _absDistY = abs(iVar5 - y); if (_absDistY < _absDistX) { _absDistY = _absDistX; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 59ae1e20d9..33299c7b96 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24689,7 +24689,7 @@ SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending SHC_3BB0A8C1_0x0049D640 | 78.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049D880 | 52.4% | Style pass, asm differs +SHC_3BB0A8C1_0x0049D880 | 75.7% | abs() instead of shift idiom SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending From 14eb4d90cd7e87edaae5e6d82b597574b682f4b8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:10:54 +0200 Subject: [PATCH 246/516] reimplement: SHC_3BB0A8C1_0x00497180 52.17% abs() instead of shift idiom --- ...leByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp | 6 +----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp index 321a4bf4fb..4edf39f30f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp @@ -20,8 +20,6 @@ namespace Map { uint _xDistance; uint _yDistance; int* _pTile; - uint _absX; - uint _absY; int iVar1; dword _result; int _tile; @@ -40,11 +38,9 @@ namespace Map { .tileTranslationMatrix_YComponent[_tile]] .addXgetTile) - x, - _absX = (int)_xDistance >> 0x1f, _yDistance = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile] - y, - _absY = (int)_yDistance >> 0x1f, - (int)(((_yDistance ^ _absY) - _absY) + ((_xDistance ^ _absX) - _absX)) % modulo == 0) + (abs(_yDistance) + abs(_xDistance)) % modulo == 0) && DAT_TileMapState::instance.CertainPathLayer[_tile] < 4000) break; iVar1 = iVar1 + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 33299c7b96..443a339a4d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24357,7 +24357,7 @@ SHC_3BB0A8C1_0x00496F90 | 51.6% | abs() instead of shift idiom SHC_3BB0A8C1_0x00497080 | 34.0% | Style pass, asm differs -SHC_3BB0A8C1_0x00497180 | 29.4% | Style pass, asm differs +SHC_3BB0A8C1_0x00497180 | 52.2% | abs() instead of shift idiom SHC_3BB0A8C1_0x00497280 | 48.9% | Style pass, asm differs From ac8413b1798349d5d99f06a560e9a9ae95c966b5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:10:55 +0200 Subject: [PATCH 247/516] reimplement: SHC_3BB0A8C1_0x00497080 41.38% abs() instead of shift idiom --- .../PathFindingState/pathFindingResultBased.cpp | 10 +--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp index 58007452dd..0b63197460 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp @@ -18,8 +18,6 @@ namespace Map { dword PathFindingState::pathFindingResultBased(int param_1, int x, int y, int extraDistance) { int* _tilesPointer; - uint _isNegativeNumberX; - uint _isNegativeNumberY; int _index; int _distance; int _tile; @@ -38,14 +36,8 @@ namespace Map { .tileTranslationMatrix_YComponent[_tile]] .addXgetTile) - x; - _isNegativeNumberX = (int)_someX >> 0x1f; uint _someY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile] - y; - _isNegativeNumberY = (int)_someY >> 0x1f; - if ((int)(((_someY ^ _isNegativeNumberY) - _isNegativeNumberY) - + ((_someX ^ _isNegativeNumberX) - _isNegativeNumberX)) - % param_1 - == 0 - && _distance < 4000) { + if ((abs(_someY) + abs(_someX)) % param_1 == 0 && _distance < 4000) { dword dVar1 = this->searchQueue.tilesQueue[_index]; DAT_TribesState::instance.ALG_ResultY = (int)this->searchQueue.yQueue[_index]; DAT_TribesState::instance.ALG_ResultTileIndex = _index; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 443a339a4d..de3fa59e19 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24355,7 +24355,7 @@ SHC_3BB0A8C1_0x00496EC0 | 47.5% | Style pass, asm differs SHC_3BB0A8C1_0x00496F90 | 51.6% | abs() instead of shift idiom -SHC_3BB0A8C1_0x00497080 | 34.0% | Style pass, asm differs +SHC_3BB0A8C1_0x00497080 | 41.4% | abs() instead of shift idiom SHC_3BB0A8C1_0x00497180 | 52.2% | abs() instead of shift idiom From a3e5f1e777bb43b114de86da41611bedd3bc4566 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:10:55 +0200 Subject: [PATCH 248/516] reimplement: SHC_3BB0A8C1_0x004A79A0 58.26% abs() instead of shift idiom --- .../PathFindingState/pathPlanningForTribe.cpp | 12 +++++------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index 437b2b1ca5..2975312cf8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -7,9 +7,9 @@ #include "OpenSHC/Map/Location/Point8ShortXY.hpp" #include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" -#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_BuildingsState.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_TribesState.hpp" @@ -157,8 +157,7 @@ namespace Map { if (iVar12 <= iVar5) { iVar12 = iVar5; } - if (iVar12 == 2 - && (abs(tribeID - uVar11) < 0x20)) { + if (iVar12 == 2 && (abs(tribeID - uVar11) < 0x20)) { _pDest1[-1] = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; _destIndex = _destIndex + 1; *_pDest1 = 1; @@ -197,8 +196,7 @@ namespace Map { if (iVar12 <= iVar5) { iVar12 = iVar5; } - if (iVar12 == 1 - && (abs(tribeID - uVar11) < 0x20)) { + if (iVar12 == 1 && (abs(tribeID - uVar11) < 0x20)) { ((PathHelper12*)(_pDest2 + -1))->tile1 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; _destIndex = _destIndex + 1; @@ -218,9 +216,9 @@ namespace Map { = &((PathFindingStatePartB*)(this->climbData + 200))->destinationsArray[_destIndex].tile2OrAHelper; do { uint _yDiff3 = y - (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; - iVar12 = (_yDiff3 ^ (int)_yDiff3 >> 0x1f) - ((int)_yDiff3 >> 0x1f); + iVar12 = abs(_yDiff3); uint _xDiff3 = x - (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; - iVar4 = (_xDiff3 ^ (int)_xDiff3 >> 0x1f) - ((int)_xDiff3 >> 0x1f); + iVar4 = abs(_xDiff3); if (iVar4 <= iVar12) { iVar4 = iVar12; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index de3fa59e19..f0daac8329 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field SHC_3BB0A8C1_0x004A75B0 | 43.7% | calls via global instance -SHC_3BB0A8C1_0x004A79A0 | 49.9% | abs() instead of shift idiom +SHC_3BB0A8C1_0x004A79A0 | 58.3% | abs() instead of shift idiom SHC_3BB0A8C1_0x004A7F50 | 51.8% | call via global instance From ad3f0cb11dcd124098a1a70731aaec1b84fe6f49 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:20:28 +0200 Subject: [PATCH 249/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 57.61% abs() instead of shift idiom --- .../findCrossAreaBridgeTileToTarget.cpp | 29 +++++++------------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index 3ca5d56308..4863c03866 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -4,8 +4,8 @@ #include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" #include "OpenSHC/Map/Location/Point8IntXY.hpp" -#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_UnitsState.hpp" @@ -31,10 +31,7 @@ namespace Map { { int (*paiVar6)[8]; int iVar7; - uint uVar8; - uint uVar9; int iVar10; - uint uVar11; int iVar13; int local_20; uint local_14; @@ -107,20 +104,16 @@ namespace Map { (dword)((int)((short)uVar2)), (int)(DAT_UnitsState::instance.units[param_1].unitCanClimb)); if (iVar7 != 0) { - uVar8 = (DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction] - .int_.yOffset - - param_3) - + (int)sVar4; - uVar11 = (int)uVar8 >> 0x1f; - uVar9 = (DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction] - .int_.xOffset - - param_2) - + (int)sVar3; - iVar10 = (uVar8 ^ uVar11) - uVar11; - uVar8 = (int)uVar9 >> 0x1f; - iVar7 = (uVar9 ^ uVar8) - uVar8; + iVar10 = abs( + (DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.yOffset + - param_3) + + (int)sVar4); + iVar7 = abs( + (DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .int_.xOffset + - param_2) + + (int)sVar3); if (iVar7 <= iVar10) { iVar7 = iVar10; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f0daac8329..d7fda8e501 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25287,7 +25287,7 @@ SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending SHC_3BB0A8C1_0x004A69F0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6AB0 | 28.3% | Style pass, asm differs +SHC_3BB0A8C1_0x004A6AB0 | 57.6% | abs() instead of shift idiom SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending From 9cf1da3df3a2484f749607d4be506e2a81a84a21 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:26:52 +0200 Subject: [PATCH 250/516] reimplement: SHC_3BB0A8C1_0x0049D880 77.92% abs() instead of shift idiom --- .../findClosestFreeTileNearUnitOnBuilding.cpp | 5 +---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp index 549397971e..766e45054e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp @@ -23,7 +23,6 @@ namespace Map { undefined4 PathFindingState::findClosestFreeTileNearUnitOnBuilding( int buildingID, int unitID, int x, int y, int* pX, int* pY) { - uint uVar3; int (*paiVar4)[8]; int iVar5; int _lowestDist; @@ -63,9 +62,7 @@ namespace Map { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; iVar5 = (int)_y; - uint uVar1 = _x - x; - uVar3 = (int)uVar1 >> 0x1f; - int _absDistX = (uVar1 ^ uVar3) - uVar3; + int _absDistX = abs(_x - x); int _absDistY = abs(iVar5 - y); if (_absDistY < _absDistX) { _absDistY = _absDistX; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d7fda8e501..e35e71b9f7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24689,7 +24689,7 @@ SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending SHC_3BB0A8C1_0x0049D640 | 78.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049D880 | 75.7% | abs() instead of shift idiom +SHC_3BB0A8C1_0x0049D880 | 77.9% | abs() instead of shift idiom SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending From e76df4031258258760cf45f81567d4caea928338 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:33:48 +0200 Subject: [PATCH 251/516] reimplement: SHC_3BB0A8C1_0x004A3B20 39.38% plain /10, not magic multiply --- .../Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index 48ded3ef24..6ddb967761 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -125,7 +125,7 @@ namespace Map { } DAT_UnitsState::instance.units[iVar9].healthPercentage = sVar6; DAT_UnitsState::instance.units[iVar9].healthbar - = (sVar6 / 10 + (sVar6 >> 0xf)) - (short)((longlong)(int)sVar6 * 0x66666667 >> 0x3f); + = sVar6 / 10; } uVar4 = DAT_UnitsState::instance.units[iVar9].nextUnitOnTheSameTile; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e35e71b9f7..c01704ce8e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 34.7% | Style pass, asm differs +SHC_3BB0A8C1_0x004A3B20 | 39.4% | plain /10, not magic multiply SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From ed47f607db970784a0236af908ded9b68ac0efdf Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:33:49 +0200 Subject: [PATCH 252/516] reimplement: SHC_3BB0A8C1_0x004A36B0 79.20% plain /10, not magic multiply --- .../PathFindingState/healUnitsOfPlayerWithinRadius.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp index 847cde958c..37ac67ab65 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp @@ -73,7 +73,7 @@ namespace Map { } DAT_UnitsState::instance.units[iVar8].healthPercentage = sVar6; DAT_UnitsState::instance.units[iVar8].healthbar - = (sVar6 / 10 + (sVar6 >> 0xf)) - (short)((longlong)(int)sVar6 * 0x66666667 >> 0x3f); + = sVar6 / 10; } uVar3 = DAT_UnitsState::instance.units[iVar8].nextUnitOnTheSameTile; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c01704ce8e..7b27632eac 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25209,7 +25209,7 @@ SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3220 | 63.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A36B0 | 40.9% | dropped dead declarations +SHC_3BB0A8C1_0x004A36B0 | 79.2% | plain /10, not magic multiply SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending From 54c3ce75dc6ac0a92b37fbeb80525e7f729421c7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:36:16 +0200 Subject: [PATCH 253/516] reimplement: SHC_3BB0A8C1_0x004A79A0 58.26% signed writeIndex compare --- .../Map/Navigation/PathFindingState/pathPlanningForTribe.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index 2975312cf8..07645185be 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -131,7 +131,7 @@ namespace Map { } } this->searchQueue.readIndex = 0; - if (0 < this->searchQueue.writeIndex) { + if (0 < (int)this->searchQueue.writeIndex) { _pDest1 = &this->searchQueue.destinationsArray[0].tile2OrAHelper; do { /* diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7b27632eac..3a1ac52a71 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field SHC_3BB0A8C1_0x004A75B0 | 43.7% | calls via global instance -SHC_3BB0A8C1_0x004A79A0 | 58.3% | abs() instead of shift idiom +SHC_3BB0A8C1_0x004A79A0 | 58.3% | signed writeIndex compare SHC_3BB0A8C1_0x004A7F50 | 51.8% | call via global instance From baa9fd46a23a54af049016cb388cb54056b66e86 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 06:37:27 +0200 Subject: [PATCH 254/516] reimplement: SHC_3BB0A8C1_0x0049E9E0 69.40% counted for loop --- .../updateAIZoneWithFloodFill0x20.cpp | 120 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 60 insertions(+), 62 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp index e5ad9f9913..bf6a3f6f4f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp @@ -48,25 +48,45 @@ namespace Map { if ((int)this->searchQueue.currentDistance > max) { return; } - int iVar3 = 0; - do { + for (int iVar3 = 0; iVar3 < 8; iVar3 = iVar3 + 4) { /* fixme: why are there nested identical if else statements here? shouldn't it tested the edge-ness of the candidate !? */ if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0) { - int _candidate - = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3] + _tile; + int _candidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } + } + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0) { + _candidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3 + 1] + _tile; if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] .short_.xOffset + sVar1; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] .short_.yOffset + sVar2; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; @@ -76,18 +96,21 @@ namespace Map { } } if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0) { - _candidate - = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3 + 1] + _tile; + _candidate = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3 + 2] + + _tile; if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + DAT_TileMapState::instance.WalkLayer[_candidate] + = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[iVar3 + 2] .short_.xOffset + sVar1; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[iVar3 + 2] .short_.yOffset + sVar2; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; @@ -96,61 +119,36 @@ namespace Map { this->searchQueue.writeIndex = 0; } } - if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0) { - _candidate = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3 + 2] - + _tile; - if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration) { - DAT_TileMapState::instance.CertainPathLayer[_candidate] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_candidate] - = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[iVar3 + 2] - .short_.xOffset - + sVar1; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[iVar3 + 2] - .short_.yOffset - + sVar2; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } - } - if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0 - && (_candidate - = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3 + 3] - + _tile, - DAT_TileMapState::instance.WalkLayer[_candidate] - != this->searchGeneration)) { - DAT_TileMapState::instance.CertainPathLayer[_candidate] - = (short)this->searchQueue.currentDistance + 1; + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x30) == 0 + && (_candidate + = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][iVar3 + 3] + + _tile, DAT_TileMapState::instance.WalkLayer[_candidate] - = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[iVar3 + 3] - .short_.xOffset - + sVar1; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[iVar3 + 3] - .short_.yOffset - + sVar2; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + != this->searchGeneration)) { + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] + = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.xOffset + + sVar1; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.yOffset + + sVar2; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; } } } } - iVar3 = iVar3 + 4; - } while (iVar3 < 8); + } + } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; if (0x13a10 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3a1ac52a71..073ec90924 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24701,7 +24701,7 @@ SHC_3BB0A8C1_0x0049E0D0 | 87.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049E510 | 91.7% | dequeue bound literal from asm -SHC_3BB0A8C1_0x0049E9E0 | 69.4% | Style pass, asm differs +SHC_3BB0A8C1_0x0049E9E0 | 69.4% | counted for loop SHC_3BB0A8C1_0x0049EB00 | 0.0% | Pending From f4d54ca626cef81dd25c19850e3241e8004b8eed Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 10:21:31 +0200 Subject: [PATCH 255/516] reimplement: SHC_3BB0A8C1_0x0049A370 11.21% orig 3-way dispatch + shared e --- ...athPlanToDestinationViaUnoccupiedTiles.cpp | 73 +++++++++++-------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp index 54501250f0..8075e8c327 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp @@ -28,7 +28,7 @@ namespace Map { byte* _pPathPlan; int _budget; int _direction; - uint _ppIndexInit; + int _result; uint _ppIndex; Point8* _cardinal; int* _dirMatrix; @@ -39,10 +39,8 @@ namespace Map { uint _gen; int _tile; short* _walkLayer; - if (399 < x || 399 < y) { - return FALSE; - } - if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } if (399 < destX || 399 < destY @@ -56,7 +54,7 @@ namespace Map { 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } _budget = 0; - _ppIndexInit = 0; + _result = 0; _direction = 0; _gen = (ushort)this->searchGeneration; _fireCount = DAT_EntityState::instance.fireCount; @@ -67,8 +65,8 @@ namespace Map { _linkage = DAT_TileMapState::instance.PathLinkageLayer; _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; _cardinal = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix; - _ppIndex = this->searchQueue.pathPlanIndex; _pPathPlan = this->searchQueue.ptrPathPlan; + _ppIndex = this->searchQueue.pathPlanIndex; while (true) { _budget = _budget + 1; if (399 < _budget) { @@ -76,60 +74,73 @@ namespace Map { } _walkLayer[_tile] = (short)_gen; if (_tile == _destTile) { - this->searchQueue.pathPlanIndex = _ppIndex; - return TRUE; + _result = 1; + break; } if (_fireCount != 0 && _occupancy[_tile] != '\0') { break; } - int _canTraverseThisDirection = _linkage[_tile]; - if ((int)destY < (int)y) { - if ((int)destX < (int)x) { + byte _links = _linkage[_tile]; + if ((int)y > (int)destY) { + if ((int)x > (int)destX) { _direction = 7; - _canTraverseThisDirection = _canTraverseThisDirection & 0x80; + if ((_links & 0x80) == 0) { + break; + } } else if ((int)x < (int)destX) { _direction = 1; - _canTraverseThisDirection = _canTraverseThisDirection & 2; + if ((_links & 2) == 0) { + break; + } } else { _direction = 0; - _canTraverseThisDirection = _canTraverseThisDirection & 1; + if ((_links & 1) == 0) { + break; + } } } else if ((int)y < (int)destY) { - if ((int)destX < (int)x) { + if ((int)x > (int)destX) { _direction = 5; - _canTraverseThisDirection = _canTraverseThisDirection & 0x20; + if ((_links & 0x20) == 0) { + break; + } } else if ((int)x < (int)destX) { _direction = 3; - _canTraverseThisDirection = _canTraverseThisDirection & 8; + if ((_links & 8) == 0) { + break; + } } else { _direction = 4; - _canTraverseThisDirection = _canTraverseThisDirection & 0x10; + if ((_links & 0x10) == 0) { + break; + } } - } else if ((int)destX < (int)x) { + } else if ((int)x > (int)destX) { _direction = 6; - _canTraverseThisDirection = _canTraverseThisDirection & 0x40; - } else { - if ((int)destX <= (int)x) { + if ((_links & 0x40) == 0) { break; } + } else if ((int)x < (int)destX) { _direction = 2; - _canTraverseThisDirection = _canTraverseThisDirection & 4; - } - if (_canTraverseThisDirection == 0) { + if ((_links & 4) == 0) { + break; + } + } else { break; } _tile = _tile + _dirMatrix[y * 8 + _direction]; x = x + _cardinal[_direction].int_.xOffset; y = y + _cardinal[_direction].int_.yOffset; - if ((_ppIndex & 1) == 0) { - _pPathPlan[_ppIndex >> 1] = (byte)_direction; + uint _slot = _ppIndex; + _ppIndex = _ppIndex + 1; + if ((_slot & 1) == 0) { + _pPathPlan[_slot >> 1] = (byte)_direction; } else { - _pPathPlan[_ppIndex >> 1] = (_pPathPlan[_ppIndex >> 1] & 0xf) | (byte)(_direction << 4); + _pPathPlan[_slot >> 1] = (_pPathPlan[_slot >> 1] & 0xf) | (byte)(_direction << 4); } - _ppIndex = _ppIndex + 1; } this->searchQueue.pathPlanIndex = _ppIndex; - return FALSE; + return (BOOLEnum)_result; } } #pragma optimize("", on) diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 073ec90924..bc8a8970f2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24399,7 +24399,7 @@ SHC_3BB0A8C1_0x0049A1C0 | 49.7% | named PathLinkageLayer SHC_3BB0A8C1_0x0049A2E0 | 25.9% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A370 | 11.2% | Style pass, asm differs +SHC_3BB0A8C1_0x0049A370 | 11.2% | orig 3-way dispatch + shared e SHC_3BB0A8C1_0x0049A5E0 | 78.3% | Style pass, asm differs From 54f0fbc7e5033398b811b39448d64f4ed03a2d58 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 10:39:40 +0200 Subject: [PATCH 256/516] reimplement: SHC_3BB0A8C1_0x004A5320 38.72% single counter + global field5 --- ...teCanPlayerUnitsNavigateToAreaFromArea.cpp | 137 ++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 65 insertions(+), 74 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index 620c97c0f4..87b22fd732 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -2,6 +2,7 @@ #include "OpenSHC/Globals/DAT_BuildingsState.hpp" #include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" namespace OpenSHC { namespace Map { @@ -19,12 +20,14 @@ namespace Map { dword dVar2; dword dVar3; dword dVar4; - bool bVar8; dword adStack_960[200]; int aiStack_640[400]; if (fromArea != toArea) { int iVar5 = 0; - if ((toArea == 0) || (fromArea == 0)) { + if (toArea == 0) { + return 0; + } + if (fromArea == 0) { return 0; } int iVar7 = 1; @@ -35,12 +38,13 @@ namespace Map { if (this->climbData[iVar7].canBeUsed == 1 && this->climbData[iVar7].isRecognizedByPathfinding != 0) { if (this->climbData[iVar7].type == 1) { - bVar8 = permitClimb == 0; - } else { - bVar8 = permitClimb == 2; + if (permitClimb == 0) { + continue; + } + } else if (permitClimb == 2) { + continue; } - if (!bVar8 - && ((playerID == 0 + if (((playerID == 0 || (DAT_GameState::instance.mapAndTime.playerTeams[this->climbData[iVar7].owner] == DAT_GameState::instance.mapAndTime.playerTeams[playerID])) || (DAT_BuildingsState::instance.buildings[this->climbData[iVar7].buildingID] @@ -54,11 +58,9 @@ namespace Map { } int iVar6 = 0; this->field63_0xc0 = 0; - iVar7 = iVar5; if (0 < local_96c) { do { iVar1 = aiStack_640[iVar6 * 2]; - iVar5 = iVar7; if (this->climbData[iVar1].type != 1) { dVar2 = this->climbData[iVar1].area; if (dVar2 == toArea) { @@ -68,12 +70,12 @@ namespace Map { fromArea = toArea; goto LAB_ret; } - adStack_960[iVar7] = dVar2; + adStack_960[iVar5] = dVar2; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - iVar5 = iVar7 + 1; if (0 < (int)dVar3) { - adStack_960[iVar7 + 1] = dVar3; - iVar5 = iVar7 + 2; + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; } } else { dVar3 = this->climbData[iVar1].wallGroupAreaID; @@ -87,12 +89,12 @@ namespace Map { fromArea = toArea; goto LAB_ret; } - adStack_960[iVar7] = dVar2; + adStack_960[iVar5] = dVar2; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - iVar5 = iVar7 + 1; if (0 < (int)dVar3) { - adStack_960[iVar7 + 1] = dVar3; - iVar5 = iVar7 + 2; + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; } } else if (this->climbData[iVar1].buildingArea == toArea) { if (dVar2 == fromArea) { @@ -103,24 +105,22 @@ namespace Map { fromArea = toArea; goto LAB_ret; } - adStack_960[iVar7] = dVar2; - adStack_960[iVar7 + 1] = dVar3; + adStack_960[iVar5] = dVar2; + iVar5 = iVar5 + 1; + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - iVar5 = iVar7 + 2; } } } iVar6 = iVar6 + 1; - iVar7 = iVar5; } while (iVar6 < local_96c); if (0 < iVar5) { do { dVar2 = adStack_960[local_968]; local_968 = local_968 + 1; iVar6 = 0; - iVar7 = iVar5; do { - iVar5 = iVar7; if ((aiStack_640[iVar6 * 2 + 1] != 1) && (iVar1 = aiStack_640[iVar6 * 2], this->climbData[iVar1].type != 1)) { /* @@ -138,12 +138,12 @@ namespace Map { fromArea = dVar2; goto LAB_ret; } - adStack_960[iVar7] = dVar3; + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - iVar5 = iVar7 + 1; if (0 < (int)dVar4) { - adStack_960[iVar7 + 1] = dVar4; - iVar5 = iVar7 + 2; + adStack_960[iVar5] = dVar4; + iVar5 = iVar5 + 1; } } else { dVar4 = this->climbData[iVar1].wallGroupAreaID; @@ -157,13 +157,12 @@ namespace Map { fromArea = dVar2; goto LAB_ret; } - adStack_960[iVar7] = dVar3; + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - iVar5 = iVar7 + 1; if (0 < (int)dVar4) { - adStack_960[iVar7 + 1] = dVar4; - LAB_004a5605: - iVar5 = iVar7 + 2; + adStack_960[iVar5] = dVar4; + iVar5 = iVar5 + 1; } } else if (this->climbData[iVar1].buildingArea == dVar2) { if (dVar3 == fromArea) { @@ -174,23 +173,22 @@ namespace Map { fromArea = dVar2; goto LAB_ret; } - adStack_960[iVar7] = dVar3; + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - adStack_960[iVar7 + 1] = dVar4; - goto LAB_004a5605; + adStack_960[iVar5] = dVar4; + iVar5 = iVar5 + 1; } } } iVar6 = iVar6 + 1; - iVar7 = iVar5; } while (iVar6 < local_96c); } while (local_968 < iVar5); } } iVar6 = 0; this->field63_0xc0 = 1; - this->field50_0x98 = 1; - iVar7 = iVar5; + DAT_PathFindingState::instance.field50_0x98 = 1; if (0 < local_96c) { do { iVar1 = aiStack_640[iVar6 * 2]; @@ -203,12 +201,12 @@ namespace Map { fromArea = toArea; goto LAB_ret; } - adStack_960[iVar7] = dVar2; + adStack_960[iVar5] = dVar2; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - iVar5 = iVar7 + 1; if (0 < (int)dVar3) { - adStack_960[iVar7 + 1] = dVar3; - iVar5 = iVar7 + 2; + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; } } else { dVar3 = this->climbData[iVar1].wallGroupAreaID; @@ -222,29 +220,26 @@ namespace Map { fromArea = toArea; goto LAB_ret; } - adStack_960[iVar7] = dVar2; + adStack_960[iVar5] = dVar2; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - iVar5 = iVar7 + 1; if (0 < (int)dVar3) { - adStack_960[iVar7 + 1] = dVar3; - iVar5 = iVar7 + 2; + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; } - } else { - iVar5 = iVar7; - if (this->climbData[iVar1].buildingArea == toArea) { - if ((dVar2 == fromArea) || (dVar3 == fromArea)) { - fromArea = toArea; - goto LAB_ret; - } - adStack_960[iVar7] = dVar2; - adStack_960[iVar7 + 1] = dVar3; - aiStack_640[iVar6 * 2 + 1] = 1; - iVar5 = iVar7 + 2; + } else if (this->climbData[iVar1].buildingArea == toArea) { + if ((dVar2 == fromArea) || (dVar3 == fromArea)) { + fromArea = toArea; + goto LAB_ret; } + adStack_960[iVar5] = dVar2; + iVar5 = iVar5 + 1; + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; + aiStack_640[iVar6 * 2 + 1] = 1; } } iVar6 = iVar6 + 1; - iVar7 = iVar5; } while (iVar6 < local_96c); } if (local_968 < iVar5) { @@ -252,10 +247,8 @@ namespace Map { dVar2 = adStack_960[local_968]; local_968 = local_968 + 1; iVar6 = 0; - iVar7 = iVar5; if (0 < local_96c) { do { - iVar7 = iVar5; if (aiStack_640[iVar6 * 2 + 1] != 1) { iVar1 = aiStack_640[iVar6 * 2]; dVar3 = this->climbData[iVar1].area; @@ -271,11 +264,11 @@ namespace Map { goto LAB_ret; } adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - iVar7 = iVar5 + 1; if (0 < (int)dVar4) { - adStack_960[iVar5 + 1] = dVar4; - iVar7 = iVar5 + 2; + adStack_960[iVar5] = dVar4; + iVar5 = iVar5 + 1; } } else { dVar4 = this->climbData[iVar1].wallGroupAreaID; @@ -290,12 +283,11 @@ namespace Map { goto LAB_ret; } adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - iVar7 = iVar5 + 1; if (0 < (int)dVar4) { - adStack_960[iVar5 + 1] = dVar4; - LAB_004a584f: - iVar7 = iVar5 + 2; + adStack_960[iVar5] = dVar4; + iVar5 = iVar5 + 1; } } else if (this->climbData[iVar1].buildingArea == dVar2) { if (dVar3 == fromArea) { @@ -307,20 +299,19 @@ namespace Map { goto LAB_ret; } adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; - adStack_960[iVar5 + 1] = dVar4; - goto LAB_004a584f; + adStack_960[iVar5] = dVar4; + iVar5 = iVar5 + 1; } } } iVar6 = iVar6 + 1; - iVar5 = iVar7; } while (iVar6 < local_96c); } - iVar5 = iVar7; - } while (local_968 < iVar7); + } while (local_968 < iVar5); } - this->field50_0x98 = 0; + DAT_PathFindingState::instance.field50_0x98 = 0; fromArea = 0; } LAB_ret: diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bc8a8970f2..31daf63fd2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25251,7 +25251,7 @@ SHC_3BB0A8C1_0x004A5230 | 0.0% | Pending SHC_3BB0A8C1_0x004A52D0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5320 | 17.1% | Style pass, asm differs +SHC_3BB0A8C1_0x004A5320 | 38.7% | single counter + global field5 SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending From 356f4d6cd91b67df1984956edb3134a2e15145e3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 10:53:01 +0200 Subject: [PATCH 257/516] reimplement: SHC_3BB0A8C1_0x00498FD0 17.01% signed reads, switch, inBounds --- .../commitUnitPathPlanUsingWalkLayer.cpp | 186 ++++++++++-------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 103 insertions(+), 85 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp index 4d93fa7f27..8c6b8e79b6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -43,7 +43,7 @@ namespace Map { int _y; int _inBounds; uint _init_10; - short _walkLayer; + int _walkLayer; if (399 < (uint)this->unitX || 399 < (uint)this->unitY || (_inBounds = false, DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[this->unitY * 400 + this->unitX] @@ -55,21 +55,27 @@ namespace Map { if ((short)DAT_TileMapState::instance.PathConnectionLayer[_tile] == 0) { return 0; } - if (param_1 == 0) { + switch (param_1) { + case 0: iVar6 = 80; - } else if (param_1 == 1) { + break; + case 1: iVar6 = 200; - } else if (param_1 == 2) { + break; + case 2: iVar6 = 500; - } else if (param_1 == 3) { + break; + case 3: iVar6 = 1000; - } else { + break; + default: iVar6 = 2000; + break; } - MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, DAT_PathFindingState::ptr)( - this->unitX, this->unitY, -1, -1, iVar6, 0); - _walkLayer = DAT_TileMapState::instance.WalkLayer[_tile]; - _rng = (uint)SEC_RNG::instance.currentNumber2; + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, + DAT_PathFindingState::ptr)(this->unitX, this->unitY, -1, -1, iVar6, 0); + _walkLayer = (short)DAT_TileMapState::instance.WalkLayer[_tile]; + _rng = (short)SEC_RNG::instance.currentNumber2; this->searchQueue.pathPlanIndex = 0; iVar6 = 10; local_24 = 1; @@ -86,10 +92,27 @@ namespace Map { iVar4 = 2; do { _candidateTile1 = (*(int (*)[8])(_ptrTranslationMatrix + -1))[0] + _tile; - if (DAT_TileMapState::instance.WalkLayer[_candidateTile1] == _walkLayer) { - _cp1 = (uint)DAT_TileMapState::instance.CertainPathLayer[_candidateTile1]; - if (_inBounds) { - if ((_cp1 & 0x4000) == 0 && (uVar3 = _cp1 & 0x3fff, uVar3 <= _init_10) + if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile1] == _walkLayer) { + _cp1 = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile1]; + if (_inBounds == 0) { + if ((_cp1 & 0x8000) == 0 && (uVar3 = _cp1 & 0x3fff, (int)_init_10 <= (int)uVar3) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile1] ^ _rng) & 7) + + uVar3; + uVar5 = uVar2; + if (iVar4 + -2 == iVar6) { + uVar5 = uVar2 + 1; + } + if ((int)param_1 < (int)uVar5) { + param_1 = uVar2; + _direction = iVar4 + -2; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + iVar6 = local_14; + } + } else if (_inBounds == 1) { + if ((_cp1 & 0x4000) == 0 && (uVar3 = _cp1 & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { uVar2 = uVar3 - ((DAT_TileMapState::instance.RandomLayer[_candidateTile1] ^ _rng) & 7); @@ -105,27 +128,30 @@ namespace Map { _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; iVar6 = local_14; } - } else if ((_cp1 & 0x8000) == 0 && (uVar3 = _cp1 & 0x3fff, _init_10 <= uVar3) - && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile1] ^ _rng) & 7) + uVar3; - uVar5 = uVar2; - if (iVar4 + -2 == iVar6) { - uVar5 = uVar2 + 1; - } - if ((int)param_1 < (int)uVar5) { - param_1 = uVar2; - _direction = iVar4 + -2; - local_24 = uVar3; - } - _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; - iVar6 = local_14; } } _candidateTile2 = *_ptrTranslationMatrix + _tile; - if (DAT_TileMapState::instance.WalkLayer[_candidateTile2] == _walkLayer) { - _cp2 = (uint)DAT_TileMapState::instance.CertainPathLayer[_candidateTile2]; - if (_inBounds) { - if ((_cp2 & 0x4000) == 0 && (uVar3 = _cp2 & 0x3fff, uVar3 <= _init_10) + if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile2] == _walkLayer) { + _cp2 = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile2]; + if (_inBounds == 0) { + if ((_cp2 & 0x8000) == 0 && (uVar3 = _cp2 & 0x3fff, (int)_init_10 <= (int)uVar3) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile2] ^ _rng) & 7) + + uVar3; + uVar5 = uVar2; + if (iVar4 + -1 == iVar6) { + uVar5 = uVar2 + 1; + } + if ((int)param_1 < (int)uVar5) { + param_1 = uVar2; + _direction = iVar4 + -1; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + iVar6 = local_14; + } + } else if (_inBounds == 1) { + if ((_cp2 & 0x4000) == 0 && (uVar3 = _cp2 & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { uVar2 = uVar3 - ((DAT_TileMapState::instance.RandomLayer[_candidateTile2] ^ _rng) & 7); @@ -141,27 +167,29 @@ namespace Map { _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; iVar6 = local_14; } - } else if ((_cp2 & 0x8000) == 0 && (uVar3 = _cp2 & 0x3fff, _init_10 <= uVar3) - && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile2] ^ _rng) & 7) + uVar3; - uVar5 = uVar2; - if (iVar4 + -1 == iVar6) { - uVar5 = uVar2 + 1; - } - if ((int)param_1 < (int)uVar5) { - param_1 = uVar2; - _direction = iVar4 + -1; - local_24 = uVar3; - } - _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; - iVar6 = local_14; } } _candidateTile3 = _ptrTranslationMatrix[1] + _tile; - if (DAT_TileMapState::instance.WalkLayer[_candidateTile3] == _walkLayer) { - _cp3 = (uint)DAT_TileMapState::instance.CertainPathLayer[_candidateTile3]; - if (_inBounds) { - if ((_cp3 & 0x4000) == 0 && (uVar3 = _cp3 & 0x3fff, uVar3 <= _init_10) + if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile3] == _walkLayer) { + _cp3 = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile3]; + if (_inBounds == 0) { + if ((_cp3 & 0x8000) == 0 && (uVar3 = _cp3 & 0x3fff, (int)_init_10 <= (int)uVar3) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile3] ^ _rng) & 7) + + uVar3; + uVar5 = uVar2; + if (iVar4 == iVar6) { + uVar5 = uVar2 + 1; + } + if ((int)param_1 < (int)uVar5) { + param_1 = uVar2; + _direction = iVar4; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + } + } else if (_inBounds == 1) { + if ((_cp3 & 0x4000) == 0 && (uVar3 = _cp3 & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { uVar2 = uVar3 - ((DAT_TileMapState::instance.RandomLayer[_candidateTile3] ^ _rng) & 7); @@ -176,26 +204,30 @@ namespace Map { } _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; } - } else if ((_cp3 & 0x8000) == 0 && (uVar3 = _cp3 & 0x3fff, _init_10 <= uVar3) - && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile3] ^ _rng) & 7) + uVar3; - uVar5 = uVar2; - if (iVar4 == iVar6) { - uVar5 = uVar2 + 1; - } - if ((int)param_1 < (int)uVar5) { - param_1 = uVar2; - _direction = iVar4; - local_24 = uVar3; - } - _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; } } _candidateTile4 = _ptrTranslationMatrix[2] + _tile; - if (DAT_TileMapState::instance.WalkLayer[_candidateTile4] == _walkLayer) { - _cp4 = (uint)DAT_TileMapState::instance.CertainPathLayer[_candidateTile4]; - if (_inBounds) { - if ((_cp4 & 0x4000) == 0 && (uVar3 = _cp4 & 0x3fff, uVar3 <= _init_10) + if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile4] == _walkLayer) { + _cp4 = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile4]; + if (_inBounds == 0) { + if ((_cp4 & 0x8000) == 0 && (uVar3 = _cp4 & 0x3fff, (int)_init_10 <= (int)uVar3) + && (param_3 == 0 || (uVar3 != _init_10))) { + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile4] ^ _rng) & 7) + + uVar3; + uVar5 = uVar2; + if (iVar4 + 1 == iVar6) { + uVar5 = uVar2 + 1; + } + if ((int)param_1 < (int)uVar5) { + param_1 = uVar2; + _direction = iVar4 + 1; + local_24 = uVar3; + } + _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; + iVar6 = local_14; + } + } else if (_inBounds == 1) { + if ((_cp4 & 0x4000) == 0 && (uVar3 = _cp4 & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { uVar2 = uVar3 - ((DAT_TileMapState::instance.RandomLayer[_candidateTile4] ^ _rng) & 7); @@ -211,31 +243,17 @@ namespace Map { _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; iVar6 = local_14; } - } else if ((_cp4 & 0x8000) == 0 && (uVar3 = _cp4 & 0x3fff, _init_10 <= uVar3) - && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile4] ^ _rng) & 7) + uVar3; - uVar5 = uVar2; - if (iVar4 + 1 == iVar6) { - uVar5 = uVar2 + 1; - } - if ((int)param_1 < (int)uVar5) { - param_1 = uVar2; - _direction = iVar4 + 1; - local_24 = uVar3; - } - _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; - iVar6 = local_14; } } _ptrTranslationMatrix = _ptrTranslationMatrix + 4; iVar4 = iVar4 + 4; } while (iVar4 < 10); - if (_inBounds) { + if (_inBounds == 0) { DAT_TileMapState::instance.CertainPathLayer[_tile] - = DAT_TileMapState::instance.CertainPathLayer[_tile] | 0x4000; + = DAT_TileMapState::instance.CertainPathLayer[_tile] | 0x8000; } else { DAT_TileMapState::instance.CertainPathLayer[_tile] - = DAT_TileMapState::instance.CertainPathLayer[_tile] | 0x8000; + = DAT_TileMapState::instance.CertainPathLayer[_tile] | 0x4000; } if (_direction == 8) break; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 31daf63fd2..6b0c47fb4b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24381,7 +24381,7 @@ SHC_3BB0A8C1_0x00498A40 | 78.3% | Style pass, asm differs SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 12.6% | call via global instance +SHC_3BB0A8C1_0x00498FD0 | 17.0% | signed reads, switch, inBounds SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending From 6b741f8ad0f10daaed97fed2a2f2281305a73b33 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:11:31 +0200 Subject: [PATCH 258/516] reimplement: SHC_3BB0A8C1_0x00498020 58.77% global instance field access --- .../findPathUsingClimbingWithHeightMargin16.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp index 89b1ed02e9..ac05564cb3 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -9,6 +9,7 @@ #include "OpenSHC/Globals/DAT_BuildingsState.hpp" #include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" @@ -201,7 +202,7 @@ namespace Map { this->searchQueue.readIndex = 0; } } - this->searchNonmatchCount = this->searchNonmatchCount + 1; + DAT_PathFindingState::instance.searchNonmatchCount = DAT_PathFindingState::instance.searchNonmatchCount + 1; return FALSE; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6b0c47fb4b..482f8886b8 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24369,7 +24369,7 @@ SHC_3BB0A8C1_0x00497740 | 49.5% | Style pass, asm differs SHC_3BB0A8C1_0x00497B80 | 52.4% | Style pass, asm differs -SHC_3BB0A8C1_0x00498020 | 58.3% | reuse computed start tile +SHC_3BB0A8C1_0x00498020 | 58.8% | global instance field access SHC_3BB0A8C1_0x00498170 | 0.0% | Pending From 50b68041812c8284d429b18be622f740b828476a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:11:32 +0200 Subject: [PATCH 259/516] reimplement: SHC_3BB0A8C1_0x004A79A0 58.65% self-call via global instance --- .../Map/Navigation/PathFindingState/pathPlanningForTribe.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index 07645185be..c7ac685858 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -101,7 +101,7 @@ namespace Map { || ((_assasinsTribe != 0 && (BVar6 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanReachUsingCachedAreaLogic, - this)(iVar4, iVar12), + DAT_PathFindingState::ptr)(iVar4, iVar12), BVar6 != FALSE))))) { short sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 482f8886b8..aa944dc14d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field SHC_3BB0A8C1_0x004A75B0 | 43.7% | calls via global instance -SHC_3BB0A8C1_0x004A79A0 | 58.3% | signed writeIndex compare +SHC_3BB0A8C1_0x004A79A0 | 58.6% | self-call via global instance SHC_3BB0A8C1_0x004A7F50 | 51.8% | call via global instance From 8714fd162d9ae02e68e6a363e9df7f45baf21c09 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:11:32 +0200 Subject: [PATCH 260/516] reimplement: SHC_3BB0A8C1_0x004A75B0 46.27% self-call via global instance --- .../Navigation/PathFindingState/pathfindingForAttacksUnk.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp index 081277f652..4af23c492c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -90,7 +90,7 @@ namespace Map { || ((BVar4 != FALSE && (BVar6 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanReachUsingCachedAreaLogic, - this)(DAT_UnitsState::instance.units[sVar2].tile, iVar13), + DAT_PathFindingState::ptr)(DAT_UnitsState::instance.units[sVar2].tile, iVar13), BVar6 != FALSE)))) && (uVar5 = (int)DAT_BuildingsState::instance.buildings[buildingID].terrainHeightUnk - (uint)DAT_TileMapState::instance.HeightLayer[iVar13], @@ -164,7 +164,7 @@ namespace Map { && (BVar6 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanReachUsingCachedAreaLogic, - this)(DAT_UnitsState::instance.units[sVar2].tile, tile2), + DAT_PathFindingState::ptr)(DAT_UnitsState::instance.units[sVar2].tile, tile2), BVar6 != FALSE)))) && (uVar7 = (int)DAT_BuildingsState::instance.buildings[buildingID].terrainHeightUnk - (uint)DAT_TileMapState::instance.HeightLayer[tile2], diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index aa944dc14d..8e79639e81 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25299,7 +25299,7 @@ SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field -SHC_3BB0A8C1_0x004A75B0 | 43.7% | calls via global instance +SHC_3BB0A8C1_0x004A75B0 | 46.3% | self-call via global instance SHC_3BB0A8C1_0x004A79A0 | 58.6% | self-call via global instance From 7c261433e477d95120ecbb42842aedc5d85765ab Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:11:33 +0200 Subject: [PATCH 261/516] reimplement: SHC_3BB0A8C1_0x004A8AB0 62.47% global instance field access --- .../Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp | 3 ++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp index d80b5175b9..449b513aea 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp @@ -14,6 +14,7 @@ #include "OpenSHC/Globals/DAT_EntityState.hpp" #include "OpenSHC/Globals/DAT_GameState.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_SFXState.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" @@ -232,7 +233,7 @@ namespace Map { DAT_TileMapState::instance.HeightLayer[iVar9] = DAT_TileMapState::instance.DefaultHeightLayer[iVar9]; DAT_TileMapState::instance.DamageLayer[iVar9] = 0; - this->toggleUpdateSeparateAreaTileMap = 1; + DAT_PathFindingState::instance.toggleUpdateSeparateAreaTileMap = 1; DAT_TileMapState::instance.field204_0x554a30 = 1; *local_18 = (short)iVar8 + sVar3; *local_14 = (short)DAT_TerrainDefinedData::instance diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8e79639e81..4f94122281 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25319,7 +25319,7 @@ SHC_3BB0A8C1_0x004A8860 | 38.5% | abs() instead of shift idiom SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending -SHC_3BB0A8C1_0x004A8AB0 | 58.3% | Style pass, asm differs +SHC_3BB0A8C1_0x004A8AB0 | 62.5% | global instance field access SHC_3BB0A8C1_0x004A91B0 | 0.0% | Pending From a4397239aa63a5f8439d8347eff7211585acc756 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:18:20 +0200 Subject: [PATCH 262/516] reimplement: SHC_3BB0A8C1_0x00498A40 78.61% compare operand order --- .../calculatePathKeepAndWallsGatesNotAllowed.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp index ec9a9bf653..1b1b437c19 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -60,7 +60,7 @@ namespace Map { if (_tile == uVar4) { return (undefined4)(1); } - if ((maxTries <= this->searchQueue.readIndex) || (80400 <= _tile)) + if ((this->searchQueue.readIndex >= maxTries) || (80400 <= _tile)) break; int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4f94122281..93bace9e8f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24377,7 +24377,7 @@ SHC_3BB0A8C1_0x00498400 | 43.3% | Style pass, asm differs SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00498A40 | 78.3% | Style pass, asm differs +SHC_3BB0A8C1_0x00498A40 | 78.6% | compare operand order SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending From ce417caffc3f1b39c9a47a8ef86cb414ff9d0a16 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:18:20 +0200 Subject: [PATCH 263/516] reimplement: SHC_3BB0A8C1_0x0049D880 79.22% compare operand order --- .../PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp index 766e45054e..0bfa235e3c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp @@ -64,7 +64,7 @@ namespace Map { iVar5 = (int)_y; int _absDistX = abs(_x - x); int _absDistY = abs(iVar5 - y); - if (_absDistY < _absDistX) { + if (_absDistX > _absDistY) { _absDistY = _absDistX; } if (_absDistY < _lowestDist) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 93bace9e8f..05038609c3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24689,7 +24689,7 @@ SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending SHC_3BB0A8C1_0x0049D640 | 78.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049D880 | 77.9% | abs() instead of shift idiom +SHC_3BB0A8C1_0x0049D880 | 79.2% | compare operand order SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending From 6a6e85161f421d0b07477e7b8d49df809312f54b Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:18:20 +0200 Subject: [PATCH 264/516] reimplement: SHC_3BB0A8C1_0x004A0B20 66.06% compare operand order --- .../PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp index 6effb589e1..f885ae66d0 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp @@ -131,7 +131,7 @@ namespace Map { param_3 = 8; } param_3 = param_3 + 1 + this->searchQueue.currentDistance; - if (local_8 < param_3) { + if (param_3 > local_8) { local_c = iVar5; local_8 = param_3; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 05038609c3..e29783a98a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24741,7 +24741,7 @@ SHC_3BB0A8C1_0x004A07C0 | 0.0% | Pending SHC_3BB0A8C1_0x004A08E0 | 84.5% | Style pass, asm differs -SHC_3BB0A8C1_0x004A0B20 | 65.2% | Style pass, asm differs +SHC_3BB0A8C1_0x004A0B20 | 66.1% | compare operand order SHC_3BB0A8C1_0x004A0BD0 | 0.0% | Pending From 9345a742d1e10ae6b1986da36e709a754ccea053 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:18:21 +0200 Subject: [PATCH 265/516] reimplement: SHC_3BB0A8C1_0x00498020 59.23% compare operand order --- .../findPathUsingClimbingWithHeightMargin16.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp index ac05564cb3..fb15bc9c3c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -92,7 +92,7 @@ namespace Map { this->searchMatchCounter = this->searchMatchCounter + 1; return TRUE; } - if ((budget <= this->searchQueue.readIndex) || (0x13a10 <= _tile)) + if ((this->searchQueue.readIndex >= budget) || (0x13a10 <= _tile)) break; int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e29783a98a..879a3ecbc1 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24369,7 +24369,7 @@ SHC_3BB0A8C1_0x00497740 | 49.5% | Style pass, asm differs SHC_3BB0A8C1_0x00497B80 | 52.4% | Style pass, asm differs -SHC_3BB0A8C1_0x00498020 | 58.8% | global instance field access +SHC_3BB0A8C1_0x00498020 | 59.2% | compare operand order SHC_3BB0A8C1_0x00498170 | 0.0% | Pending From 27ce06a7f26cf7e9e1ec34b7e352ac5b19ef48ac Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:18:21 +0200 Subject: [PATCH 266/516] reimplement: SHC_3BB0A8C1_0x004A36B0 80.09% compare operand order --- .../PathFindingState/healUnitsOfPlayerWithinRadius.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp index 37ac67ab65..c1571bc3b5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp @@ -63,7 +63,7 @@ namespace Map { DAT_UnitsState::instance.units[iVar8].health = DAT_UnitsState::instance.units[iVar8].health + param_4; int iVar5 = DAT_UnitsState::instance.units[iVar8].maxHealth; - if (iVar5 < DAT_UnitsState::instance.units[iVar8].health) { + if (DAT_UnitsState::instance.units[iVar8].health > iVar5) { DAT_UnitsState::instance.units[iVar8].health = iVar5; } if (iVar5 == 0) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 879a3ecbc1..70ccb0763f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25209,7 +25209,7 @@ SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3220 | 63.8% | Style pass, asm differs -SHC_3BB0A8C1_0x004A36B0 | 79.2% | plain /10, not magic multiply +SHC_3BB0A8C1_0x004A36B0 | 80.1% | compare operand order SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending From 019f5eed14e445e3ecbcbb432c7d8002d7dc4532 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:18:21 +0200 Subject: [PATCH 267/516] reimplement: SHC_3BB0A8C1_0x00498400 43.67% compare operand order --- .../PathFindingState/pathFindingWithBuildingsIncluded.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index b1ad905845..22ac7802fb 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -116,7 +116,7 @@ namespace Map { if (_currentTile == _tile2) { return TRUE; } - if ((maxOptionsToTry <= this->searchQueue.readIndex) || (80400 <= _currentTile)) + if ((this->searchQueue.readIndex >= maxOptionsToTry) || (80400 <= _currentTile)) break; _currentX = this->searchQueue.xQueue[this->searchQueue.readIndex]; _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 70ccb0763f..882e87993b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24373,7 +24373,7 @@ SHC_3BB0A8C1_0x00498020 | 59.2% | compare operand order SHC_3BB0A8C1_0x00498170 | 0.0% | Pending -SHC_3BB0A8C1_0x00498400 | 43.3% | Style pass, asm differs +SHC_3BB0A8C1_0x00498400 | 43.7% | compare operand order SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending From 4907b94f0fc52e9bb9d673a8d5a7602b084b7350 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:18:22 +0200 Subject: [PATCH 268/516] reimplement: SHC_3BB0A8C1_0x004A75B0 47.01% compare operand order --- .../Navigation/PathFindingState/pathfindingForAttacksUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp index 4af23c492c..c31e962393 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -173,7 +173,7 @@ namespace Map { ((PathHelper12*)(piVar11 + -1))->tile1 = tile2; *piVar11 = 0; piVar11 = piVar11 + 3; - if (param_3 <= local_28) { + if (local_28 >= param_3) { return; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 882e87993b..378b855e2a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25299,7 +25299,7 @@ SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field -SHC_3BB0A8C1_0x004A75B0 | 46.3% | self-call via global instance +SHC_3BB0A8C1_0x004A75B0 | 47.0% | compare operand order SHC_3BB0A8C1_0x004A79A0 | 58.6% | self-call via global instance From 8ca84fde61f65b90bf60c7765d422cb72f74958f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:18:22 +0200 Subject: [PATCH 269/516] reimplement: SHC_3BB0A8C1_0x004A83B0 64.41% compare operand order --- ...DestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index ad1cae6c00..bf1562c834 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -144,7 +144,7 @@ namespace Map { _dIndex = _dIndex + 1; ((PathHelper12*)(piVar3 + -1))->tile1 = _tile2; piVar3 = piVar3 + 3; - if (maxDestinations <= _dIndex) { + if (_dIndex >= maxDestinations) { return; } this->searchQueue.tilesQueue[this->searchQueue.readIndex] = -1; @@ -171,7 +171,7 @@ namespace Map { *piVar3 = 0; _dIndex = _dIndex + 1; piVar3 = piVar3 + 3; - if (maxDestinations <= _dIndex) { + if (_dIndex >= maxDestinations) { return; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 378b855e2a..f0c867e53c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25311,7 +25311,7 @@ SHC_3BB0A8C1_0x004A8220 | 0.0% | Pending SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending -SHC_3BB0A8C1_0x004A83B0 | 62.5% | call via global instance +SHC_3BB0A8C1_0x004A83B0 | 64.4% | compare operand order SHC_3BB0A8C1_0x004A8780 | 51.3% | call via global instance From 0a6b80a1d9bd7c2164dd26595bb95f351884b686 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:18:23 +0200 Subject: [PATCH 270/516] reimplement: SHC_3BB0A8C1_0x0049AAD0 86.65% compare operand order --- .../Navigation/PathFindingState/updateWalkAndPathLayer.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp index 4faac94d39..0c85b5b22f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -54,7 +54,7 @@ namespace Map { if (iVar8 < this->mappingYRelated) { this->mappingYRelated = iVar8; } - if (this->yLimit < iVar8) { + if (iVar8 > this->yLimit) { this->yLimit = iVar8; } int iVar4 = (int)sVar2 / 10; @@ -63,13 +63,13 @@ namespace Map { if (iVar4 < (int)DAT_TileMapState::instance.someYLike) { DAT_TileMapState::instance.someYLike = iVar4; } - if ((int)DAT_TileMapState::instance.someYLikeLimit < iVar4) { + if (iVar4 > (int)DAT_TileMapState::instance.someYLikeLimit) { DAT_TileMapState::instance.someYLikeLimit = iVar4; } if (iVar5 < (int)DAT_TileMapState::instance.someIndex) { DAT_TileMapState::instance.someIndex = iVar5; } - if ((int)DAT_TileMapState::instance.someLimit < iVar5) { + if (iVar5 > (int)DAT_TileMapState::instance.someLimit) { DAT_TileMapState::instance.someLimit = iVar5; } this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar3]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f0c867e53c..a18f155e42 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24409,7 +24409,7 @@ SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AAD0 | 84.0% | reuse computed start tile +SHC_3BB0A8C1_0x0049AAD0 | 86.7% | compare operand order SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending From 2869f4013afeb218bd1a50add5dc92bfb1b375f7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:36:07 +0200 Subject: [PATCH 271/516] reimplement: SHC_3BB0A8C1_0x004A1C40 98.65% compare operand order --- .../Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp index 22422898f2..b28c1b6261 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isTileInRangeOfKeepRange.cpp @@ -49,7 +49,7 @@ namespace Map { || (MACRO_CALL_MEMBER( OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, DAT_DirectionAlgorithmState::ptr)(x, (int)(y), (int)(piVar1[-2]), (int)(piVar1[-1])), - range / 2 < DAT_DirectionAlgorithmState::instance.distanceHigh)) { + DAT_DirectionAlgorithmState::instance.distanceHigh > range / 2)) { piVar2 = piVar2 + 1; piVar1 = piVar1 + 0xe7d; if ((int)&DAT_GameState::instance.mapAndTime.playerTeams[9] <= (int)piVar2) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a18f155e42..6ccbf95b41 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25167,7 +25167,7 @@ SHC_3BB0A8C1_0x004A19B0 | 60.1% | reuse computed start tile SHC_3BB0A8C1_0x004A1AF0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1C40 | 96.0% | walking pointer base offset +SHC_3BB0A8C1_0x004A1C40 | 98.7% | compare operand order SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending From e4a8f59d185669b3529c5e9d780b2a8b99dd9221 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:36:07 +0200 Subject: [PATCH 272/516] reimplement: SHC_3BB0A8C1_0x0049A1C0 52.78% shifted row index variable --- ...updatePathLinkageTileMapRelatedToKeeps.cpp | 27 ++++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp index 0563216628..2ae7acd71e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp @@ -23,20 +23,20 @@ namespace Map { short _orientation; _orientation = DAT_BuildingsState::instance.buildings[buildingID].orientation; if (_orientation == 4) { - iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + -1; iVar3 = (int)DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight / 2 + (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + -1].addXgetTile - + iVar3] + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3] = DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + -1].addXgetTile + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3] | 0x10; DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3] + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile + + iVar3] = DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile + iVar3] | 1; return; @@ -48,19 +48,20 @@ namespace Map { } else { uVar2 = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; if (_orientation != 2) { - iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + (int)uVar2 + -1; iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x + (int)uVar2 / 2; - DAT_TileMapState::instance.PathLinkageLayer - [DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4 + -1].addXgetTile + iVar3] - = DAT_TileMapState::instance.PathLinkageLayer - [DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4 + -1].addXgetTile + DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + + iVar3] + = DAT_TileMapState::instance + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3] | 0x10; DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4].addXgetTile + .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile + iVar3] = DAT_TileMapState::instance.PathLinkageLayer - [DAT_ViewportRenderState::instance.translationMatrix[uVar2 + iVar4].addXgetTile + iVar3] + [DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile + iVar3] | 1; return; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6ccbf95b41..d48d0859ee 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24395,7 +24395,7 @@ SHC_3BB0A8C1_0x00499DC0 | 42.9% | Style pass, asm differs SHC_3BB0A8C1_0x00499FA0 | 24.4% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A1C0 | 49.7% | named PathLinkageLayer +SHC_3BB0A8C1_0x0049A1C0 | 52.8% | shifted row index variable SHC_3BB0A8C1_0x0049A2E0 | 25.9% | Style pass, asm differs From e630126cdc3c38cdb62b90544e3f05b03428491f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:36:08 +0200 Subject: [PATCH 273/516] reimplement: SHC_3BB0A8C1_0x0049A2E0 96.30% index locals + statement order --- ...ePathLinkageTileMapRelatedToSiegeTower.cpp | 45 +++++++------------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp index 8a3de03a9e..6093446b14 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp @@ -17,42 +17,27 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049A2E0 void PathFindingState::updatePathLinkageTileMapRelatedToSiegeTower(int param_1) { - byte* pbVar1; int iVar2; int iVar3; int iVar4; + int iVar5; iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[param_1].x; iVar2 = (int)(short)DAT_BuildingsState::instance.buildings[param_1].y; - DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + -1].addXgetTile + iVar4 - + 1] - = DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + -1].addXgetTile - + iVar4 + 1] - | 0x10; - DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2].addXgetTile + iVar4 + 1] - = DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2].addXgetTile + iVar4 - + 1] - | 0x11; - DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 2].addXgetTile + iVar4 - + 1] - = DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 2].addXgetTile - + iVar4 + 1] - | 0x11; + iVar5 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + -1].addXgetTile + iVar4 + 1; + DAT_TileMapState::instance.PathLinkageLayer[iVar5] + = DAT_TileMapState::instance.PathLinkageLayer[iVar5] | 0x10; + iVar5 = DAT_ViewportRenderState::instance.translationMatrix[iVar2].addXgetTile + iVar4 + 1; + DAT_TileMapState::instance.PathLinkageLayer[iVar5] + = DAT_TileMapState::instance.PathLinkageLayer[iVar5] | 0x11; + iVar5 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 2].addXgetTile + iVar4 + 1; + DAT_TileMapState::instance.PathLinkageLayer[iVar5] + = DAT_TileMapState::instance.PathLinkageLayer[iVar5] | 0x11; + iVar5 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 3].addXgetTile + iVar4 + 1; iVar3 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 1].addXgetTile + iVar4; - DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 3].addXgetTile + iVar4 - + 1] - = DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 3].addXgetTile - + iVar4 + 1] - | 1; - pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + iVar3 + 0x2741f); - *pbVar1 = *pbVar1 | 4; + DAT_TileMapState::instance.PathLinkageLayer[iVar5] + = DAT_TileMapState::instance.PathLinkageLayer[iVar5] | 1; + DAT_TileMapState::instance.PathLinkageLayer[iVar3 + -1] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + -1] | 4; DAT_TileMapState::instance.PathLinkageLayer[iVar3] = DAT_TileMapState::instance.PathLinkageLayer[iVar3] | 0x44; DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 2] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d48d0859ee..ff43ebc7ff 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24397,7 +24397,7 @@ SHC_3BB0A8C1_0x00499FA0 | 24.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049A1C0 | 52.8% | shifted row index variable -SHC_3BB0A8C1_0x0049A2E0 | 25.9% | Style pass, asm differs +SHC_3BB0A8C1_0x0049A2E0 | 96.3% | index locals + statement order SHC_3BB0A8C1_0x0049A370 | 11.2% | orig 3-way dispatch + shared e From a9b9f5f32fece7027675dc9cff40a94091770663 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:48:44 +0200 Subject: [PATCH 274/516] reimplement: SHC_3BB0A8C1_0x0049AF50 20.81% named ChangedLayer + local row --- .../setChangedLayerZeroBasedOn40x40Layer.cpp | 80 ++++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp index 2d4ef39516..97a2c38ba1 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp @@ -17,19 +17,20 @@ namespace Map { void PathFindingState::setChangedLayerZeroBasedOn40x40Layer(uint flag_and_offset) { if ((this->field10_0x28 == 0) && (flag_and_offset == 0)) { - if ((int)DAT_TileMapState::instance.someIndex <= (int)DAT_TileMapState::instance.someLimit) { - int _index10 = DAT_TileMapState::instance.someIndex * 10; + int _row = DAT_TileMapState::instance.someIndex; + if (_row <= (int)DAT_TileMapState::instance.someLimit) { + int _index10 = _row * 10; /* 10 400x400 rows */ - int _index4000 = DAT_TileMapState::instance.someIndex * 4000; - int _someX = DAT_TileMapState::instance.someIndex * 120; - byte* _pMap4040 = DAT_TileMapState::instance.mapping40x40[DAT_TileMapState::instance.someIndex]; - int _someYLikeLimit = DAT_TileMapState::instance.someYLikeLimit; + int _index4000 = _row * 4000; + int _someX = _row * 120; + byte* _pMap4040 = DAT_TileMapState::instance.mapping40x40[_row]; do { - if ((int)DAT_TileMapState::instance.someYLike <= _someYLikeLimit) { - flag_and_offset = DAT_TileMapState::instance.someYLike * 10 + 1; - int _someY = DAT_TileMapState::instance.someYLike; + int _someYLikeLimit = DAT_TileMapState::instance.someYLikeLimit; + int _someY = DAT_TileMapState::instance.someYLike; + if (_someY <= _someYLikeLimit) { + flag_and_offset = _someY * 10 + 1; do { if (_pMap4040[_someY] != '\0') { /* @@ -54,51 +55,56 @@ namespace Map { /* is valid coordinate */ - *(undefined1*)(_x + 0x1c5ad87 - + *(int*)((int)&DAT_ViewportRenderState::instance - .translationMatrix[0] - .addXgetTile - + _curX)) = 0; + DAT_TileMapState::instance + .ChangedLayer[*(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX) + + (_x - 1)] = 0; } if (_x <= 399 && _coord2 <= 399 && DAT_ViewportRenderState::instance .DAT_BinaryTileMap400x400[_yOffset + _x] != '\0') { - *(undefined1*)(*(int*)((int)&DAT_ViewportRenderState::instance - .translationMatrix[0] - .addXgetTile - + _curX) - + 0x1c5ad88 + _x) = 0; + DAT_TileMapState::instance + .ChangedLayer[*(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX) + + _x] = 0; } if (_x + 1 <= 399 && _coord2 <= 399 && DAT_ViewportRenderState::instance .DAT_BinaryTileMap400x400[_yOffset + _x + 1] != '\0') { - *(undefined1*)(_x + 0x1c5ad89 - + *(int*)((int)&DAT_ViewportRenderState::instance - .translationMatrix[0] - .addXgetTile - + _curX)) = 0; + DAT_TileMapState::instance + .ChangedLayer[*(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX) + + (_x + 1)] = 0; } if (_x + 2 <= 399 && _coord2 <= 399 && DAT_ViewportRenderState::instance .DAT_BinaryTileMap400x400[_yOffset + _x + 2] != '\0') { - *(undefined1*)(_x + 0x1c5ad8a - + *(int*)((int)&DAT_ViewportRenderState::instance - .translationMatrix[0] - .addXgetTile - + _curX)) = 0; + DAT_TileMapState::instance + .ChangedLayer[*(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX) + + (_x + 2)] = 0; } if (_x + 3 <= 399 && _coord2 <= 399 && DAT_ViewportRenderState::instance .DAT_BinaryTileMap400x400[_yOffset + _x + 3] != '\0') { - *(undefined1*)(_x + 0x1c5ad8b - + *(int*)((int)&DAT_ViewportRenderState::instance - .translationMatrix[0] - .addXgetTile - + _curX)) = 0; + DAT_TileMapState::instance + .ChangedLayer[*(int*)((int)&DAT_ViewportRenderState::instance + .translationMatrix[0] + .addXgetTile + + _curX) + + (_x + 3)] = 0; } _x = _x + 5; local_1c = local_1c + -1; @@ -106,8 +112,8 @@ namespace Map { _cur10 = _cur10 + 1; _yOffset = _yOffset + 400; _curX = _curX + 0xc; - _someYLikeLimit = DAT_TileMapState::instance.someYLikeLimit; } while (_cur10 < 10); + _someYLikeLimit = DAT_TileMapState::instance.someYLikeLimit; } flag_and_offset = flag_and_offset + 10; _someY = _someY + 1; @@ -115,10 +121,10 @@ namespace Map { } _index4000 = _index4000 + 4000; _index10 = _index10 + 10; - DAT_TileMapState::instance.someIndex = DAT_TileMapState::instance.someIndex + 1; + _row = _row + 1; _pMap4040 = _pMap4040 + 40; _someX = _someX + 120; - } while ((int)DAT_TileMapState::instance.someIndex <= (int)DAT_TileMapState::instance.someLimit); + } while (_row <= (int)DAT_TileMapState::instance.someLimit); } this->mappingYRelated = 1000; this->yLimit = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ff43ebc7ff..278ff47536 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24413,7 +24413,7 @@ SHC_3BB0A8C1_0x0049AAD0 | 86.7% | compare operand order SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AF50 | 12.9% | named mapping40x40 field +SHC_3BB0A8C1_0x0049AF50 | 20.8% | named ChangedLayer + local row SHC_3BB0A8C1_0x0049B000 | 0.0% | Pending From 89d87d39d77700653c77395dbf170fc46671d7aa Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 11:57:28 +0200 Subject: [PATCH 275/516] reimplement: SHC_3BB0A8C1_0x004A58A0 28.57% single in-place queue counter --- .../findConnectingAreaBetweenTwoAreas.cpp | 31 ++++++++----------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp index a2365957ae..603fd94a9b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp @@ -19,7 +19,6 @@ namespace Map { { undefined4 dVar2; int iVar1; - int iVar3; int* piVar5; int iVar6; dword dVar7; @@ -68,18 +67,16 @@ namespace Map { return (dword)(param_3); } adStack_960[iVar6] = dVar7; + iVar6 = iVar6 + 1; aiStack_640[iVar4 * 2 + 1] = 1; - iVar3 = iVar6 + 1; if (0 < (int)dVar8) { - adStack_960[iVar6 + 1] = dVar8; - LAB_004a5a12: - iVar3 = iVar6 + 2; + adStack_960[iVar6] = dVar8; + iVar6 = iVar6 + 1; } } else { dVar8 = this->climbData[iVar1].wallGroupAreaID; if (dVar8 == param_3) goto LAB_004a59a4; - iVar3 = iVar6; if (this->climbData[iVar1].buildingArea == param_3) { if (dVar7 == param_2) { return (dword)(param_3); @@ -88,22 +85,20 @@ namespace Map { return (dword)(param_3); } adStack_960[iVar6] = dVar7; + iVar6 = iVar6 + 1; aiStack_640[iVar4 * 2 + 1] = 1; - adStack_960[iVar6 + 1] = dVar8; - goto LAB_004a5a12; + adStack_960[iVar6] = dVar8; + iVar6 = iVar6 + 1; } } iVar4 = iVar4 + 1; - iVar6 = iVar3; } while (iVar4 < local_96c); - if (0 < iVar3) { + if (0 < iVar6) { do { dVar7 = adStack_960[local_968]; local_968 = local_968 + 1; iVar4 = 0; - iVar6 = iVar3; do { - iVar3 = iVar6; if (aiStack_640[iVar4 * 2 + 1] != 1) { iVar1 = aiStack_640[iVar4 * 2]; dVar8 = this->climbData[iVar1].area; @@ -118,11 +113,11 @@ namespace Map { return (dword)(dVar7); } adStack_960[iVar6] = dVar8; + iVar6 = iVar6 + 1; aiStack_640[iVar4 * 2 + 1] = 1; - iVar3 = iVar6 + 1; if ((int)dVar2 <= 0) goto LAB_004a5ad0; - adStack_960[iVar6 + 1] = dVar2; + adStack_960[iVar6] = dVar2; } else { dVar2 = this->climbData[iVar1].wallGroupAreaID; if (dVar2 == dVar7) @@ -136,16 +131,16 @@ namespace Map { return (dword)(dVar7); } adStack_960[iVar6] = dVar8; + iVar6 = iVar6 + 1; aiStack_640[iVar4 * 2 + 1] = 1; - adStack_960[iVar6 + 1] = dVar2; + adStack_960[iVar6] = dVar2; } - iVar3 = iVar6 + 2; + iVar6 = iVar6 + 1; } LAB_004a5ad0: iVar4 = iVar4 + 1; - iVar6 = iVar3; } while (iVar4 < local_96c); - } while (local_968 < iVar3); + } while (local_968 < iVar6); } } return (dword)(0); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 278ff47536..5a01618099 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25257,7 +25257,7 @@ SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending SHC_3BB0A8C1_0x004A5770 | 0.0% | Pending -SHC_3BB0A8C1_0x004A58A0 | 15.2% | compare against 0 not 1 +SHC_3BB0A8C1_0x004A58A0 | 28.6% | single in-place queue counter SHC_3BB0A8C1_0x004A5980 | 0.0% | Pending From 01dcd333ecc8a5462a0c0a93d5d9abe157062849 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 12:09:31 +0200 Subject: [PATCH 276/516] reimplement: SHC_3BB0A8C1_0x004A4BB0 49.50% inverted tests, climb base poi --- .../recountUnitsUsingClimbData.cpp | 31 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp index 527ae1fbe6..8265e53e70 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp @@ -21,32 +21,29 @@ namespace Map { int _canBeUsed; int* _ptrUnitUID; int _unitID; + OpenSHC::Map::ClimbData* _climb; _counter = 0; - _canBeUsed = this->climbData[climbDataID].canBeUsed; - this->climbData[climbDataID].numberOfUnitsUsing = 0; + _climb = &this->climbData[climbDataID]; + _canBeUsed = _climb->canBeUsed; + _climb->numberOfUnitsUsing = 0; if (_canBeUsed != 0) { _ptrUnitID = &this->climbData[climbDataID].unitID1; do { _unitID = *_ptrUnitID; if (_unitID != 0) { + int _uid = (&this->climbData[climbDataID].unitUID1)[_counter]; _ptrUnitUID = &this->climbData[climbDataID].unitUID1 + _counter; - if (DAT_UnitsState::instance.units[_unitID].logicalState == OpenSHC::Map::Units::ULS_NORMAL) { - if (DAT_UnitsState::instance.units[_unitID].uid - == (&this->climbData[climbDataID].unitUID1)[_counter]) { - if (DAT_UnitsState::instance.units[_unitID].climbDataID == climbDataID) { - _ptrUnitUID = &this->climbData[climbDataID].numberOfUnitsUsing; - *_ptrUnitUID = *_ptrUnitUID + 1; - } else { - *_ptrUnitID = 0; - *_ptrUnitUID = 0; - } - } else { - *_ptrUnitID = 0; - *_ptrUnitUID = 0; - } - } else { + if (DAT_UnitsState::instance.units[_unitID].logicalState != OpenSHC::Map::Units::ULS_NORMAL) { + *_ptrUnitID = 0; + *_ptrUnitUID = 0; + } else if (DAT_UnitsState::instance.units[_unitID].uid != _uid) { *_ptrUnitID = 0; *_ptrUnitUID = 0; + } else if (DAT_UnitsState::instance.units[_unitID].climbDataID != climbDataID) { + *_ptrUnitID = 0; + *_ptrUnitUID = 0; + } else { + _climb->numberOfUnitsUsing = _climb->numberOfUnitsUsing + 1; } } _counter = _counter + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5a01618099..61ad6248f5 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25235,7 +25235,7 @@ SHC_3BB0A8C1_0x004A4B30 | 79.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A4B80 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A4BB0 | 24.4% | Style pass, asm differs +SHC_3BB0A8C1_0x004A4BB0 | 49.5% | inverted tests, climb base poi SHC_3BB0A8C1_0x004A4C70 | 89.8% | Style pass, asm differs From 83684089ff8c5c8aac3b5e960000399681d1d8f7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 12:42:46 +0200 Subject: [PATCH 277/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 23.61% if/else min-max, orig queue or --- .../findAppropriateLocationForSiegeTent.cpp | 44 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index 6b04bf1572..e4f3a844b6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -35,7 +35,7 @@ namespace Map { int iVar6; dword _offsetTile; uint uVar7; - uint uVar8; + uint _minHeight; int local_c; int _tile; /* @@ -161,17 +161,17 @@ namespace Map { */ if (4 < (int)this->searchQueue.currentDistance && (short)DAT_TileMapState::instance.UnitLayer[_offsetTile] == 0 && bVar2) { + iVar6 = 0; + local_c = 0; /* Get height of candidate tile */ uVar7 = (uint)DAT_TileMapState::instance.HeightLayer[_offsetTile]; - iVar6 = 0; - local_c = 0; /* Get pointer to movement direction offsets for checking surrounding tiles Track minimum height in surrounding area */ - x = uVar7; + _minHeight = uVar7; /* === CHECK 8 SURROUNDING TILES FOR TENT PLACEMENT === Loop checks tiles in groups of 4 for optimization @@ -200,14 +200,11 @@ namespace Map { Track height variation (for flatness check) */ uint uVar3 = (uint)DAT_TileMapState::instance.HeightLayer[iVar5]; - uVar8 = uVar3; - if ((uVar3 <= uVar7) && (uVar8 = uVar7, uVar3 < x)) { - /* - Update minimum height - */ - x = uVar3; + if ((int)uVar3 > (int)uVar7) { + uVar7 = uVar3; + } else if ((int)uVar3 < (int)_minHeight) { + _minHeight = uVar3; } - uVar7 = uVar8; /* Update maximum height Repeat checks for tiles 2, 3, and 4 in the group (Pattern repeats with piVar4[0], @@ -231,11 +228,11 @@ namespace Map { break; } uVar3 = (uint)DAT_TileMapState::instance.HeightLayer[iVar5]; - uVar8 = uVar3; - if ((uVar3 <= uVar7) && (uVar8 = uVar7, uVar3 < x)) { - x = uVar3; + if ((int)uVar3 > (int)uVar7) { + uVar7 = uVar3; + } else if ((int)uVar3 < (int)_minHeight) { + _minHeight = uVar3; } - uVar7 = uVar8; iVar5 = DAT_TileMapState::instance .directionTranslationMatrix[DAT_TerrainDefinedData::instance .clockwiseCardinalTranslationMatrix[y] @@ -250,9 +247,10 @@ namespace Map { break; } uVar3 = (uint)DAT_TileMapState::instance.HeightLayer[iVar5]; - uVar8 = uVar3; - if ((uVar3 <= uVar7) && (uVar8 = uVar7, uVar3 < x)) { - x = uVar3; + if ((int)uVar3 > (int)uVar7) { + uVar7 = uVar3; + } else if ((int)uVar3 < (int)_minHeight) { + _minHeight = uVar3; } iVar5 = DAT_TileMapState::instance .directionTranslationMatrix[DAT_TerrainDefinedData::instance @@ -265,13 +263,13 @@ namespace Map { || (short)DAT_TileMapState::instance.UnitLayer[iVar5] != 0 || DAT_TileMapState::instance.BuildingLayer[iVar5] != 0) { iVar6 = iVar6 + 3; - uVar7 = uVar8; break; } uVar3 = (uint)DAT_TileMapState::instance.HeightLayer[iVar5]; - uVar7 = uVar3; - if ((uVar3 <= uVar8) && (uVar7 = uVar8, uVar3 < x)) { - x = uVar3; + if ((int)uVar3 > (int)uVar7) { + uVar7 = uVar3; + } else if ((int)uVar3 < (int)_minHeight) { + _minHeight = uVar3; } local_c = local_c + 4; iVar6 = iVar6 + 4; @@ -280,7 +278,7 @@ namespace Map { === FINAL VALIDATION === If all 8 surrounding tiles are clear (iVar6 == 8) AND terrain is relatively flat (height difference < 12) */ - if (iVar6 == 8 && (int)(uVar7 - x) < 0xc) { + if (iVar6 == 8 && (int)(uVar7 - _minHeight) < 0xc) { /* FOUND VALID LOCATION! */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 61ad6248f5..520ce509d7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24715,7 +24715,7 @@ SHC_3BB0A8C1_0x0049F2D0 | 85.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 85.6% | reuse computed start tile -SHC_3BB0A8C1_0x0049F7D0 | 22.6% | split bounds guard +SHC_3BB0A8C1_0x0049F7D0 | 23.6% | if/else min-max, orig queue or SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending From f920f4c5861b67f7ec871191e2fb534459923609 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 12:53:57 +0200 Subject: [PATCH 278/516] reimplement: SHC_3BB0A8C1_0x004A3B20 42.40% single movsx read, later queue --- .../Navigation/PathFindingState/certainDamageToUnitsUnk.cpp | 5 ++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index 6ddb967761..b50a030a85 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -54,9 +54,7 @@ namespace Map { MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } - this->searchQueue.yQueue[0] - = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[param_1]; - uint uVar7 = (uint)this->searchQueue.yQueue[0]; + uint uVar7 = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[param_1]; iVar9 = param_1 - DAT_ViewportRenderState::instance.translationMatrix[uVar7].addXgetTile; local_4 = 1; uint uVar1 = iVar9 + 100; @@ -64,6 +62,7 @@ namespace Map { || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar7 * 400 + uVar1] == '\0') { local_4 = -1; } + this->searchQueue.yQueue[0] = (short)uVar7; this->searchQueue.tilesQueue[0] = param_1; this->searchQueue.xQueue[0] = (short)iVar9; this->searchQueue.currentDistance = 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 520ce509d7..80742adb78 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 39.4% | plain /10, not magic multiply +SHC_3BB0A8C1_0x004A3B20 | 42.4% | single movsx read, later queue SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From da05647aac3a694718a93af506bce1be3eef4824 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 12:53:57 +0200 Subject: [PATCH 279/516] reimplement: SHC_3BB0A8C1_0x00498FD0 17.01% merge per-block temporaries --- .../commitUnitPathPlanUsingWalkLayer.cpp | 66 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 31 insertions(+), 37 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp index 8c6b8e79b6..836d8ae6e4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -22,16 +22,10 @@ namespace Map { uint PathFindingState::commitUnitPathPlanUsingWalkLayer(uint param_1, int param_2, int param_3) { int* _ptrTranslationMatrix; - int _candidateTile1; + int _candidateTile; uint uVar2; - int _candidateTile2; - uint _cp3; - int _candidateTile4; - uint _cp1; + uint _cp; uint uVar3; - uint _cp2; - int _candidateTile3; - uint _cp4; int iVar4; uint _rng; uint uVar5; @@ -91,13 +85,13 @@ namespace Map { param_1 = local_24; iVar4 = 2; do { - _candidateTile1 = (*(int (*)[8])(_ptrTranslationMatrix + -1))[0] + _tile; - if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile1] == _walkLayer) { - _cp1 = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile1]; + _candidateTile = (*(int (*)[8])(_ptrTranslationMatrix + -1))[0] + _tile; + if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile] == _walkLayer) { + _cp = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile]; if (_inBounds == 0) { - if ((_cp1 & 0x8000) == 0 && (uVar3 = _cp1 & 0x3fff, (int)_init_10 <= (int)uVar3) + if ((_cp & 0x8000) == 0 && (uVar3 = _cp & 0x3fff, (int)_init_10 <= (int)uVar3) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile1] ^ _rng) & 7) + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) + uVar3; uVar5 = uVar2; if (iVar4 + -2 == iVar6) { @@ -112,10 +106,10 @@ namespace Map { iVar6 = local_14; } } else if (_inBounds == 1) { - if ((_cp1 & 0x4000) == 0 && (uVar3 = _cp1 & 0x3fff, (int)uVar3 <= (int)_init_10) + if ((_cp & 0x4000) == 0 && (uVar3 = _cp & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { uVar2 = uVar3 - - ((DAT_TileMapState::instance.RandomLayer[_candidateTile1] ^ _rng) & 7); + - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); uVar5 = uVar2; if (iVar4 + -2 == iVar6) { uVar5 = uVar2 - 1; @@ -130,13 +124,13 @@ namespace Map { } } } - _candidateTile2 = *_ptrTranslationMatrix + _tile; - if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile2] == _walkLayer) { - _cp2 = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile2]; + _candidateTile = *_ptrTranslationMatrix + _tile; + if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile] == _walkLayer) { + _cp = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile]; if (_inBounds == 0) { - if ((_cp2 & 0x8000) == 0 && (uVar3 = _cp2 & 0x3fff, (int)_init_10 <= (int)uVar3) + if ((_cp & 0x8000) == 0 && (uVar3 = _cp & 0x3fff, (int)_init_10 <= (int)uVar3) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile2] ^ _rng) & 7) + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) + uVar3; uVar5 = uVar2; if (iVar4 + -1 == iVar6) { @@ -151,10 +145,10 @@ namespace Map { iVar6 = local_14; } } else if (_inBounds == 1) { - if ((_cp2 & 0x4000) == 0 && (uVar3 = _cp2 & 0x3fff, (int)uVar3 <= (int)_init_10) + if ((_cp & 0x4000) == 0 && (uVar3 = _cp & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { uVar2 = uVar3 - - ((DAT_TileMapState::instance.RandomLayer[_candidateTile2] ^ _rng) & 7); + - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); uVar5 = uVar2; if (iVar4 + -1 == iVar6) { uVar5 = uVar2 - 1; @@ -169,13 +163,13 @@ namespace Map { } } } - _candidateTile3 = _ptrTranslationMatrix[1] + _tile; - if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile3] == _walkLayer) { - _cp3 = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile3]; + _candidateTile = _ptrTranslationMatrix[1] + _tile; + if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile] == _walkLayer) { + _cp = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile]; if (_inBounds == 0) { - if ((_cp3 & 0x8000) == 0 && (uVar3 = _cp3 & 0x3fff, (int)_init_10 <= (int)uVar3) + if ((_cp & 0x8000) == 0 && (uVar3 = _cp & 0x3fff, (int)_init_10 <= (int)uVar3) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile3] ^ _rng) & 7) + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) + uVar3; uVar5 = uVar2; if (iVar4 == iVar6) { @@ -189,10 +183,10 @@ namespace Map { _rng = (int)_rng >> 1 & 0x7fffU | (_rng & 1) << 0xf; } } else if (_inBounds == 1) { - if ((_cp3 & 0x4000) == 0 && (uVar3 = _cp3 & 0x3fff, (int)uVar3 <= (int)_init_10) + if ((_cp & 0x4000) == 0 && (uVar3 = _cp & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { uVar2 = uVar3 - - ((DAT_TileMapState::instance.RandomLayer[_candidateTile3] ^ _rng) & 7); + - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); uVar5 = uVar2; if (iVar4 == iVar6) { uVar5 = uVar2 - 1; @@ -206,13 +200,13 @@ namespace Map { } } } - _candidateTile4 = _ptrTranslationMatrix[2] + _tile; - if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile4] == _walkLayer) { - _cp4 = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile4]; + _candidateTile = _ptrTranslationMatrix[2] + _tile; + if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile] == _walkLayer) { + _cp = (short)DAT_TileMapState::instance.CertainPathLayer[_candidateTile]; if (_inBounds == 0) { - if ((_cp4 & 0x8000) == 0 && (uVar3 = _cp4 & 0x3fff, (int)_init_10 <= (int)uVar3) + if ((_cp & 0x8000) == 0 && (uVar3 = _cp & 0x3fff, (int)_init_10 <= (int)uVar3) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile4] ^ _rng) & 7) + uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) + uVar3; uVar5 = uVar2; if (iVar4 + 1 == iVar6) { @@ -227,10 +221,10 @@ namespace Map { iVar6 = local_14; } } else if (_inBounds == 1) { - if ((_cp4 & 0x4000) == 0 && (uVar3 = _cp4 & 0x3fff, (int)uVar3 <= (int)_init_10) + if ((_cp & 0x4000) == 0 && (uVar3 = _cp & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { uVar2 = uVar3 - - ((DAT_TileMapState::instance.RandomLayer[_candidateTile4] ^ _rng) & 7); + - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); uVar5 = uVar2; if (iVar4 + 1 == iVar6) { uVar5 = uVar2 - 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 80742adb78..d3116db42e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24381,7 +24381,7 @@ SHC_3BB0A8C1_0x00498A40 | 78.6% | compare operand order SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 17.0% | signed reads, switch, inBounds +SHC_3BB0A8C1_0x00498FD0 | 17.0% | merge per-block temporaries SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending From c991e07d3b62f4a943bed24aeff8af5ea789a4c0 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:37 +0200 Subject: [PATCH 280/516] reimplement: SHC_3BB0A8C1_0x004A1230 59.37% Style pass, asm differs --- .../aggressiveStanceTargetBuildingAtRange.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp index 70207255dc..93705a0756 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp @@ -51,8 +51,10 @@ namespace Map { this->ALG_ResultTile = 0; this->ALG_ResultY = 0; this->ALG_ResultX = 0; - if (uVar5 > 399 || uVar7 > 399 - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar7 * 400 + uVar5] == '\0') { + if (uVar5 > 399 || uVar7 > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar7 * 400 + uVar5] == '\0') { return; } this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d3116db42e..badbc5df98 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24877,7 +24877,7 @@ SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending SHC_3BB0A8C1_0x004A0E50 | 94.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004A1230 | 59.4% | reverted widening, raw better +SHC_3BB0A8C1_0x004A1230 | 59.4% | Style pass, asm differs SHC_3BB0A8C1_0x004A1568 | 0.0% | Pending From b9748061a870ae5eac427e66538210911f1a4ec2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:38 +0200 Subject: [PATCH 281/516] reimplement: SHC_3BB0A8C1_0x0049DDC0 35.71% Style pass, asm differs --- .../PathFindingState/budgetFloodFillOnCertainPathLayer.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp index af29795e12..d65a024da0 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp @@ -37,7 +37,10 @@ namespace Map { _tilesQueue[999] = 0x49ddca; _readIndex = 0; int _writeIndex = 1; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } this->DAT_Mini_spreads = this->DAT_Mini_spreads + 1; From b3d031aab97aac9957e2392e04f0189dd16647df Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:38 +0200 Subject: [PATCH 282/516] reimplement: SHC_3BB0A8C1_0x00498A40 81.82% split bounds guard --- .../calculatePathKeepAndWallsGatesNotAllowed.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp index 1b1b437c19..4281899461 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -27,8 +27,10 @@ namespace Map { uint uVar4; int iVar6; uint _tile; - if (399 < (uint)x1 || 399 < (uint)y1 - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y1 * 400 + x1] == '\0') { + if (399 < (uint)x1 || 399 < (uint)y1) { + return (undefined4)(0); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y1 * 400 + x1] == '\0') { return (undefined4)(0); } if (x2 == -1 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index badbc5df98..a5e04d8099 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24377,7 +24377,7 @@ SHC_3BB0A8C1_0x00498400 | 43.7% | compare operand order SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00498A40 | 78.6% | compare operand order +SHC_3BB0A8C1_0x00498A40 | 81.8% | split bounds guard SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending From 5a1f6b7d0d141bd72369c62d53a0edb050405970 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:39 +0200 Subject: [PATCH 283/516] reimplement: SHC_3BB0A8C1_0x004A6DF0 82.76% split bounds guard --- .../PathFindingState/canNavigateFunctionReturnsArea.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp index 39732d2d55..e27fc86809 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp @@ -28,8 +28,10 @@ namespace Map { this->ALG_ResultTile = 0; this->ALG_ResultY = 0; this->ALG_ResultX = 0; - if (399 < unitX || 399 < unitY - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[unitY * 400 + unitX] == '\0') { + if (399 < unitX || 399 < unitY) { + return 0; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[unitY * 400 + unitX] == '\0') { return 0; } this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a5e04d8099..935c2495f0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25293,7 +25293,7 @@ SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending SHC_3BB0A8C1_0x004A6C40 | 0.0% | Pending -SHC_3BB0A8C1_0x004A6DF0 | 78.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A6DF0 | 82.8% | split bounds guard SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending From ba8fc5be1fcb9f09b7e6df673af33ca5d53fef57 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:39 +0200 Subject: [PATCH 284/516] reimplement: SHC_3BB0A8C1_0x004A5DA0 84.17% split bounds guard --- .../PathFindingState/findBestAdjacentClimbTileToTarget.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp index 1cd4d10c0e..f9c5f766d7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp @@ -40,8 +40,10 @@ namespace Map { uint local_18; int local_10; undefined4 local_8; - if (399 < param_2 || 399 < param_3 - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { + if (399 < param_2 || 399 < param_3) { + return (undefined4)(0); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { return (undefined4)(0); } if (param_4 <= 399 && param_5 <= 399 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 935c2495f0..e46fec1f66 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25265,7 +25265,7 @@ SHC_3BB0A8C1_0x004A5A30 | 0.0% | Pending SHC_3BB0A8C1_0x004A5B00 | 57.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A5DA0 | 79.8% | named matrix end field +SHC_3BB0A8C1_0x004A5DA0 | 84.2% | split bounds guard SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented From 7280021c2c07685120b54715099ffe44ecabbf8c Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:39 +0200 Subject: [PATCH 285/516] reimplement: SHC_3BB0A8C1_0x004A6010 39.05% Style pass, asm differs --- .../findBestAttackTargetTileWithHeightAndOwner.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp index c36ac185f5..d730477955 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -57,8 +57,10 @@ namespace Map { this->ALG_TargetTile = 0; this->ALG_TargetY = 0; this->ALG_TargetX = 0; - if (param_2 > 399 || param_3 > 399 - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { + if (param_2 > 399 || param_3 > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { return; } this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e46fec1f66..c5e804ad86 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25271,7 +25271,7 @@ SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A5F90 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6010 | 39.0% | shared -1 constant +SHC_3BB0A8C1_0x004A6010 | 39.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending From 486f32db3bb4e83b33023c676336efbee2a15f29 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:40 +0200 Subject: [PATCH 286/516] reimplement: SHC_3BB0A8C1_0x004A01D0 56.03% Style pass, asm differs --- .../PathFindingState/findBestAttackTileByPathCost.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp index 5757fca304..80c9200894 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp @@ -33,8 +33,10 @@ namespace Map { dword dVar4 = 1000; int local_4 = 1000; dword local_8 = 0; - if (param_1 > 399 || param_2 > 399 - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_2 * 400 + param_1] == '\0') { + if (param_1 > 399 || param_2 > 399) { + return (dword)(dVar4); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_2 * 400 + param_1] == '\0') { return (dword)(dVar4); } this->calculations = this->calculations + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c5e804ad86..eecf60667c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24729,7 +24729,7 @@ SHC_3BB0A8C1_0x0049FF20 | 65.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A0050 | 0.0% | Pending -SHC_3BB0A8C1_0x004A01D0 | 56.0% | reuse computed start tile +SHC_3BB0A8C1_0x004A01D0 | 56.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A0300 | 0.0% | Pending From fa5b664e2bcdbb337f15c48f3d96b94a5cae26e6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:40 +0200 Subject: [PATCH 287/516] reimplement: SHC_3BB0A8C1_0x0049BBF0 49.80% Style pass, asm differs --- .../Map/Navigation/PathFindingState/findFurthestSeaTile.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp index 769a52e837..daf84692e6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp @@ -28,7 +28,10 @@ namespace Map { this->ALG_ResultTile = 0; this->ALG_ResultY = 0; this->ALG_ResultX = 0; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } this->calculations = this->calculations + 1; From 822c52a962ec7c59f555654233ccc5c6bb4e125e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:40 +0200 Subject: [PATCH 288/516] reimplement: SHC_3BB0A8C1_0x0049B940 70.34% Style pass, asm differs --- .../findMapBorderEdgeTileAndStoreInSignpostData.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp index adcd906196..64346353ae 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp @@ -34,7 +34,10 @@ namespace Map { this->resultTile = 0; this->resultY = 0; this->resultX = 0; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } this->searchGeneration = this->searchGeneration + 1; From 737c4ff9bb13356d36d7360759630f08913a50a7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:41 +0200 Subject: [PATCH 289/516] reimplement: SHC_3BB0A8C1_0x00497690 13.59% Style pass, asm differs --- .../PathFindingState/findPositionForGivenClimbArea.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp index 6093e5eb6a..e05057d840 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp @@ -19,7 +19,10 @@ namespace Map { void PathFindingState::findPositionForGivenClimbArea(int area, uint x, uint y) { int _direction; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } int _directionIndex = 0; From b1e8bbf8640120b63a3bbed6ca5c2bb2cdf5f2e9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:41 +0200 Subject: [PATCH 290/516] reimplement: SHC_3BB0A8C1_0x00497B80 52.35% Style pass, asm differs --- .../PathFindingState/findSuitableSpawnLocationUnk.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp index b95497291f..b4548f097f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp @@ -21,8 +21,10 @@ namespace Map { undefined4 PathFindingState::findSuitableSpawnLocationUnk( int x, int y, int x2, int y2, int param_5, int param_6) { - if (399 < (uint)x || 399 < (uint)y - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < (uint)x || 399 < (uint)y) { + return (undefined4)(0); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return (undefined4)(0); } if (x2 != -1 From ea5d834421866ada4c2561c258489e798122de30 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:42 +0200 Subject: [PATCH 291/516] reimplement: SHC_3BB0A8C1_0x0049D340 64.60% Style pass, asm differs --- .../findWalkableTileThatDoesNotContainUnit.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp index 8aa77658a1..1223b02fea 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp @@ -38,7 +38,10 @@ namespace Map { this->ALG_ResultTile = 0; this->ALG_ResultY = 0; this->ALG_ResultX = 0; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } this->searchGeneration = this->searchGeneration + 1; From b02fc1e64fa9479874d339a9b5d35120a0dd8e81 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:42 +0200 Subject: [PATCH 292/516] reimplement: SHC_3BB0A8C1_0x004A9200 48.70% split bounds guard --- .../PathFindingState/isOpponentBuildingInRange.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index 2f930ccbbd..127cc1c309 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -33,8 +33,10 @@ namespace Map { short _buildingID; int _x; int _y; - if (399 < (uint)x || 399 < (uint)y - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < (uint)x || 399 < (uint)y) { + return (undefined4)(0); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return (undefined4)(0); } this->calculations = this->calculations + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index eecf60667c..a7eddb7d69 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25453,7 +25453,7 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 45.7% | Style pass, asm differs +SHC_3BB0A8C1_0x004A9200 | 48.7% | split bounds guard SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented From a763f98ae41a5530fa639698e6c42c203edd1e4d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:42 +0200 Subject: [PATCH 293/516] reimplement: SHC_3BB0A8C1_0x0049FC00 58.26% Style pass, asm differs --- .../Map/Navigation/PathFindingState/pathFindingRelated.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp index 5f25111be0..c493f8ff14 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -29,8 +29,10 @@ namespace Map { uint local_1c = 1000; dword local_14 = 0; int local_18 = 10000; - if (param_2 > 399 || param_3 > 399 - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { + if (param_2 > 399 || param_3 > 399) { + return (dword)(dVar6); + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[param_3 * 400 + param_2] == '\0') { return (dword)(dVar6); } this->calculations = this->calculations + 1; From 2e838ae71aa0c53fb13237727f84248f88f3d967 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:43 +0200 Subject: [PATCH 294/516] reimplement: SHC_3BB0A8C1_0x004A21B0 81.91% Style pass, asm differs --- .../placeCommemoratingStatueAtGoodLocation.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp index 8042ee7285..5b1d638a1f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp @@ -44,8 +44,10 @@ namespace Map { uVar7 = (uint)sVar1; int sVar2 = DAT_GameState::instance.playerDataArray[playerID].someKeepRelatedY2; uVar8 = (uint)sVar2; - if (uVar7 > 399 || uVar8 > 399 - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar8 * 400 + uVar7] == '\0') { + if (uVar7 > 399 || uVar8 > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar8 * 400 + uVar7] == '\0') { return; } this->calculations = this->calculations + 1; From 71ad00ff32c123871c70ea753bc0edaf9898a1ff Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:43 +0200 Subject: [PATCH 295/516] reimplement: SHC_3BB0A8C1_0x0049A6D0 72.45% Style pass, asm differs --- src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp index 20d5e9645c..aaaad71878 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp @@ -24,7 +24,10 @@ namespace Map { void PathFindingState::raiseLand2(uint x, uint y, int maxDistance) { int iVar5; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( From 16c12966a2e52268cb1129a3a25f3c15dda7e64e Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:43 +0200 Subject: [PATCH 296/516] reimplement: SHC_3BB0A8C1_0x0049E510 91.67% Style pass, asm differs --- .../PathFindingState/recomputeALGPathFindingTileMapUnk.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp index 3e6030b908..ad6792f7cb 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/recomputeALGPathFindingTileMapUnk.cpp @@ -22,7 +22,10 @@ namespace Map { { uint uVar3; int iVar4; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a7eddb7d69..c475e3ec6f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24699,7 +24699,7 @@ SHC_3BB0A8C1_0x0049DDC0 | 35.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049E0D0 | 87.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049E510 | 91.7% | dequeue bound literal from asm +SHC_3BB0A8C1_0x0049E510 | 91.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049E9E0 | 69.4% | counted for loop From 72cd5530759cb03887501fcd18745bcf5b3b3522 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:44 +0200 Subject: [PATCH 297/516] reimplement: SHC_3BB0A8C1_0x0049A370 11.21% Style pass, asm differs --- .../tracePathPlanToDestinationViaUnoccupiedTiles.cpp | 12 ++++++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp index 8075e8c327..3ae7fb77d6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp @@ -39,12 +39,16 @@ namespace Map { uint _gen; int _tile; short* _walkLayer; - if (399 < x || 399 < y - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (399 < x || 399 < y) { return FALSE; } - if (399 < destX || 399 < destY - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[destY * 400 + destX] == '\0') { + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + return FALSE; + } + if (399 < destX || 399 < destY) { + return FALSE; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[destY * 400 + destX] == '\0') { return FALSE; } this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c475e3ec6f..ed68d7e919 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24399,7 +24399,7 @@ SHC_3BB0A8C1_0x0049A1C0 | 52.8% | shifted row index variable SHC_3BB0A8C1_0x0049A2E0 | 96.3% | index locals + statement order -SHC_3BB0A8C1_0x0049A370 | 11.2% | orig 3-way dispatch + shared e +SHC_3BB0A8C1_0x0049A370 | 11.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049A5E0 | 78.3% | Style pass, asm differs From 3eba85ee43e4daf6fbc3feaeac0782f766ede7aa Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:44 +0200 Subject: [PATCH 298/516] reimplement: SHC_3BB0A8C1_0x0049E9E0 69.40% Style pass, asm differs --- .../PathFindingState/updateAIZoneWithFloodFill0x20.cpp | 5 ++++- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp index bf6a3f6f4f..acafb75b35 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp @@ -20,7 +20,10 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049E9E0 void PathFindingState::updateAIZoneWithFloodFill0x20(int max, uint x, uint y) { - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ed68d7e919..dc1f4ea5e3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24701,7 +24701,7 @@ SHC_3BB0A8C1_0x0049E0D0 | 87.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049E510 | 91.7% | Style pass, asm differs -SHC_3BB0A8C1_0x0049E9E0 | 69.4% | counted for loop +SHC_3BB0A8C1_0x0049E9E0 | 69.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049EB00 | 0.0% | Pending From fa0612112fe29393a0751db9ed9e51b594a0fc32 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:45 +0200 Subject: [PATCH 299/516] reimplement: SHC_3BB0A8C1_0x0049E0D0 87.53% Style pass, asm differs --- .../updateUnitDeathHeatmapIn3SpacesAroundTile.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp index b2ff04759f..c32e9fc1b1 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateUnitDeathHeatmapIn3SpacesAroundTile.cpp @@ -23,7 +23,10 @@ namespace Map { { int _candidate1; uint _tile; - if (x > 399 || y > 399 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { + if (x > 399 || y > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } this->searchGeneration = this->searchGeneration + 1; From 84b6afb788c9cfc709d1697629da5c8d8fc16147 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:20:45 +0200 Subject: [PATCH 300/516] reimplement: SHC_3BB0A8C1_0x0049AAD0 86.65% Style pass, asm differs --- .../Navigation/PathFindingState/updateWalkAndPathLayer.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp index 0c85b5b22f..ae77d19c65 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -25,8 +25,10 @@ namespace Map { short* psVar6; int* piVar7; int iVar8; - if (xPosition > 399 || yPosition > 399 - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[yPosition * 400 + xPosition] == '\0') { + if (xPosition > 399 || yPosition > 399) { + return; + } + if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[yPosition * 400 + xPosition] == '\0') { return; } this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index dc1f4ea5e3..c4ab979724 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24409,7 +24409,7 @@ SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AAD0 | 86.7% | compare operand order +SHC_3BB0A8C1_0x0049AAD0 | 86.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending From 16e2bdfbb7a9175bd89c810d1491095d8c3a6aa4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:38:17 +0200 Subject: [PATCH 301/516] reimplement: SHC_3BB0A8C1_0x00499FA0 35.29% orig branch order + stmt order --- ...updatePathLinkageTileMapRelatedToGates.cpp | 139 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 74 insertions(+), 67 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp index 20e820d0e6..31e06d5e06 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp @@ -17,7 +17,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x00499FA0 void PathFindingState::updatePathLinkageTileMapRelatedToGates(int buildingID) { - byte* pbVar1; int iVar2; int iVar3; int _anotherTile; @@ -29,88 +28,96 @@ namespace Map { uint _widthOrHeight; _middleTileUnk = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; _widthOrHeight = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; - if (DAT_BuildingsState::instance.buildings[buildingID].buildingVariation != 80) { - _xMiddleUnk = _middleTileUnk + (int)_widthOrHeight / 2; - iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + int _half = (int)_widthOrHeight / 2; + if (DAT_BuildingsState::instance.buildings[buildingID].buildingVariation == 80) { + iVar2 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + iVar4 = iVar2 + _half; _pl2 = DAT_BuildingsState::instance.buildings[buildingID].pathLinkageRelated2; - _middleTileUnk = DAT_ViewportRenderState::instance.translationMatrix[iVar3 + -1].addXgetTile; - iVar4 = DAT_ViewportRenderState::instance.translationMatrix[iVar3].addXgetTile; - uVar5 = (uint)DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + _xMiddleUnk]; - _middleTileUnk = _middleTileUnk + _xMiddleUnk; - _anotherTile = iVar4 + _xMiddleUnk; - if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) == 0 - && uVar5 <= DAT_TileMapState::instance.DefaultHeightLayer[iVar4 + _xMiddleUnk] + 0x10 - && (int)(DAT_TileMapState::instance.DefaultHeightLayer[_anotherTile] - 0x10) <= (int)uVar5 - && _pl2 != 2) { - DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] - = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] | 0x10; - DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] - = DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] | 1; + int _blocked = _pl2 == 2; + _anotherTile = _widthOrHeight + _middleTileUnk; + iVar3 = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + _middleTileUnk + -1; + if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) != 0 + || (int)DAT_TileMapState::instance.HeightLayer[iVar3] + > (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar3 + 1] + 0x10) + || (int)DAT_TileMapState::instance.HeightLayer[iVar3] + < (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar3 + 1] - 0x10) + || _blocked != 0) { + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] & 0xfb; + DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] & 0xbf; } else { - DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] - = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xef; - DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] - = DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] & 0xfe; + DAT_TileMapState::instance.PathLinkageLayer[iVar3] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3] | 4; + DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] + = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] | 0x40; } + _blocked = _pl2 == 2; _middleTileUnk - = DAT_ViewportRenderState::instance.translationMatrix[_widthOrHeight + iVar3].addXgetTile; - uVar5 = (uint)DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + _xMiddleUnk]; - _middleTileUnk = _middleTileUnk + _xMiddleUnk; - iVar4 = DAT_ViewportRenderState::instance.translationMatrix[_widthOrHeight + iVar3 + -1].addXgetTile - + _xMiddleUnk; - if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) == 0 - && uVar5 <= DAT_TileMapState::instance.DefaultHeightLayer[iVar4] + 0x10 - && (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar4] - 0x10) <= (int)uVar5 && _pl2 != 2) { + = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + _anotherTile; + if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) != 0 + || (int)DAT_TileMapState::instance.HeightLayer[_middleTileUnk] + > (int)(DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + -1] + 0x10) + || (int)DAT_TileMapState::instance.HeightLayer[_middleTileUnk] + < (int)(DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + -1] - 0x10) + || _blocked != 0) { DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] - = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] | 1; - DAT_TileMapState::instance.PathLinkageLayer[iVar4] - = DAT_TileMapState::instance.PathLinkageLayer[iVar4] | 0x10; + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xbf; + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk + -1] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk + -1] & 0xfb; return; } DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] - = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xfe; - DAT_TileMapState::instance.PathLinkageLayer[iVar4] - = DAT_TileMapState::instance.PathLinkageLayer[iVar4] & 0xef; + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] | 0x40; + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk + -1] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk + -1] | 4; return; } + iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + _xMiddleUnk = _middleTileUnk + _half; _pl2 = DAT_BuildingsState::instance.buildings[buildingID].pathLinkageRelated2; - iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + (int)_widthOrHeight / 2; - iVar2 = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile; - iVar3 = iVar2 + -1 + _middleTileUnk; - if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk + iVar2 + -1] & 0x4a5014b1U) == 0 - && (uint)(byte)DAT_TileMapState::instance.EntityLayerLT25[iVar3 + 0x13a10] - <= DAT_TileMapState::instance.DefaultHeightLayer[iVar3 + 1] + 0x10 - && (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar3 + 1] - 0x10) - <= (int)(uint)(byte)DAT_TileMapState::instance.EntityLayerLT25[iVar3 + 0x13a10] - && _pl2 != 2) { - pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + iVar3 + 0x27420); - *pbVar1 = *pbVar1 | 4; - DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] - = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] | 0x40; + int _rowBelow = _widthOrHeight + iVar3; + int _blocked = _pl2 == 2; + int _row = iVar3 + -1; + _middleTileUnk = DAT_ViewportRenderState::instance.translationMatrix[_row].addXgetTile; + iVar4 = DAT_ViewportRenderState::instance.translationMatrix[_row + 1].addXgetTile; + uVar5 = (uint)DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + _xMiddleUnk]; + uint _otherHeight = (uint)DAT_TileMapState::instance.DefaultHeightLayer[iVar4 + _xMiddleUnk]; + _middleTileUnk = _middleTileUnk + _xMiddleUnk; + _anotherTile = iVar4 + _xMiddleUnk; + if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) != 0 + || (int)uVar5 > (int)(_otherHeight + 0x10) + || (int)uVar5 < (int)(DAT_TileMapState::instance.DefaultHeightLayer[_anotherTile] - 0x10) + || _blocked != 0) { + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xef; + DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] + = DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] & 0xfe; } else { - pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + iVar3 + 0x27420); - *pbVar1 = *pbVar1 & 0xfb; - DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] - = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] & 0xbf; + DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] | 0x10; + DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] + = DAT_TileMapState::instance.PathLinkageLayer[_anotherTile] | 1; } - _middleTileUnk = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + _widthOrHeight - + _middleTileUnk; - if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) == 0 - && (uint)DAT_TileMapState::instance.HeightLayer[_middleTileUnk] - <= DAT_TileMapState::instance.HeightLayer[_middleTileUnk + 0x13a0f] + 0x10 - && (int)(DAT_TileMapState::instance.HeightLayer[_middleTileUnk + 0x13a0f] - 0x10) - <= (int)(uint)DAT_TileMapState::instance.HeightLayer[_middleTileUnk] - && _pl2 != 2) { + _blocked = _pl2 == 2; + _middleTileUnk = DAT_ViewportRenderState::instance.translationMatrix[_rowBelow].addXgetTile; + uVar5 = (uint)DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + _xMiddleUnk]; + iVar4 = DAT_ViewportRenderState::instance.translationMatrix[_rowBelow + -1].addXgetTile + _xMiddleUnk; + _middleTileUnk = _middleTileUnk + _xMiddleUnk; + if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) != 0 + || (int)uVar5 > (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar4] + 0x10) + || (int)uVar5 < (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar4] - 0x10) + || _blocked != 0) { DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] - = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] | 0x40; - pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + _middleTileUnk + 0x2741f); - *pbVar1 = *pbVar1 | 4; + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xfe; + DAT_TileMapState::instance.PathLinkageLayer[iVar4] + = DAT_TileMapState::instance.PathLinkageLayer[iVar4] & 0xef; return; } DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] - = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xbf; - pbVar1 = (byte*)((int)DAT_TileMapState::instance.PathConnectionLayer + _middleTileUnk + 0x2741f); - *pbVar1 = *pbVar1 & 0xfb; + = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] | 1; + DAT_TileMapState::instance.PathLinkageLayer[iVar4] + = DAT_TileMapState::instance.PathLinkageLayer[iVar4] | 0x10; return; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c4ab979724..7c44412adc 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24393,7 +24393,7 @@ SHC_3BB0A8C1_0x004999C0 | 50.7% | decoded Ghidra flag triple SHC_3BB0A8C1_0x00499DC0 | 42.9% | Style pass, asm differs -SHC_3BB0A8C1_0x00499FA0 | 24.4% | Style pass, asm differs +SHC_3BB0A8C1_0x00499FA0 | 35.3% | orig branch order + stmt order SHC_3BB0A8C1_0x0049A1C0 | 52.8% | shifted row index variable From c81ecc6f0d264ae9d14a4602173f2481dd0f74c2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:56:27 +0200 Subject: [PATCH 302/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 24.03% statement order --- .../findAppropriateLocationForSiegeTent.cpp | 10 +++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index e4f3a844b6..3ff7461b0b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -86,14 +86,14 @@ namespace Map { Starting distance */ this->searchQueue.currentDistance = 1; - /* - Add starting position to queue - */ - this->searchQueue.yQueue[0] = (short)y; /* Convert 2D coordinates to 1D tile index */ this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + /* + Add starting position to queue + */ + this->searchQueue.yQueue[0] = (short)y; /* Mark starting tile with distance 1 */ @@ -162,11 +162,11 @@ namespace Map { if (4 < (int)this->searchQueue.currentDistance && (short)DAT_TileMapState::instance.UnitLayer[_offsetTile] == 0 && bVar2) { iVar6 = 0; - local_c = 0; /* Get height of candidate tile */ uVar7 = (uint)DAT_TileMapState::instance.HeightLayer[_offsetTile]; + local_c = 0; /* Get pointer to movement direction offsets for checking surrounding tiles Track minimum height in surrounding area diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7c44412adc..e97b06a49a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24715,7 +24715,7 @@ SHC_3BB0A8C1_0x0049F2D0 | 85.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 85.6% | reuse computed start tile -SHC_3BB0A8C1_0x0049F7D0 | 23.6% | if/else min-max, orig queue or +SHC_3BB0A8C1_0x0049F7D0 | 24.0% | statement order SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending From 8495bbd0d8d44c1052f466d131418c74dd57de67 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:56:27 +0200 Subject: [PATCH 303/516] reimplement: SHC_3BB0A8C1_0x0049CD60 100.00% Reimplemented --- .../findDirectNeighbourWalkableTile.cpp | 13 ++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp index 53e408acae..6d6261e647 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDirectNeighbourWalkableTile.cpp @@ -27,8 +27,8 @@ namespace Map { if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } - int _directionIndex = 0; - do { + int _rowTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + for (int _directionIndex = 0; _directionIndex < 8; _directionIndex = _directionIndex + 1) { uint _x = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_directionIndex].int_.xOffset + x; @@ -37,8 +37,7 @@ namespace Map { + y; if (_x <= 399 && _y <= 399 && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[_y * 400 + _x] != '\0') { - int _tile = DAT_TileMapState::instance.directionTranslationMatrix[y][_directionIndex] - + DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + int _tile = DAT_TileMapState::instance.directionTranslationMatrix[y][_directionIndex] + _rowTile; if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0xb1U) == 0 && (DAT_TileMapState::instance.LogicLayer[_tile] & 0x50101400U) == 0) { /* @@ -50,11 +49,7 @@ namespace Map { return TRUE; } } - _directionIndex = _directionIndex + 1; - if (7 < _directionIndex) { - return FALSE; - } - } while (true); + } return FALSE; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e97b06a49a..cefe5c6728 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24669,7 +24669,7 @@ SHC_3BB0A8C1_0x0049CB00 | 51.1% | Style pass, asm differs SHC_3BB0A8C1_0x0049CBE0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CD60 | 37.0% | Style pass, asm differs +SHC_3BB0A8C1_0x0049CD60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x0049CDB0 | 0.0% | Pending From bee0250fe4a44d00f585e50d7ea278e2043fb582 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:56:28 +0200 Subject: [PATCH 304/516] reimplement: SHC_3BB0A8C1_0x00497690 100.00% Reimplemented --- .../findPositionForGivenClimbArea.cpp | 24 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp index e05057d840..0df04d69b2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPositionForGivenClimbArea.cpp @@ -18,28 +18,28 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x00497690 void PathFindingState::findPositionForGivenClimbArea(int area, uint x, uint y) { - int _direction; if (x > 399 || y > 399) { return; } if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return; } - int _directionIndex = 0; - while (_direction = (int)(char)DAT_ClimbLogicDefinedData::instance.DirectionArray[_directionIndex], - (short)DAT_TileMapState::instance + int _rowTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + for (int _directionIndex = 0; _directionIndex < 8; _directionIndex = _directionIndex + 1) { + int _direction = (int)(char)DAT_ClimbLogicDefinedData::instance.DirectionArray[_directionIndex]; + if ((short)DAT_TileMapState::instance .PathConnectionLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][_direction] - + DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x] - != area) { - _directionIndex = _directionIndex + 1; - if (7 < _directionIndex) { + + _rowTile] + == area) { + this->climbX + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.xOffset + + x; + this->climbY + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.yOffset + + y; return; } } - this->climbX - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.xOffset + x; - this->climbY - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction].int_.yOffset + y; return; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index cefe5c6728..f6e130d266 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24363,7 +24363,7 @@ SHC_3BB0A8C1_0x00497280 | 48.9% | Style pass, asm differs SHC_3BB0A8C1_0x004974D0 | 34.0% | Style pass, asm differs -SHC_3BB0A8C1_0x00497690 | 13.6% | Style pass, asm differs +SHC_3BB0A8C1_0x00497690 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00497740 | 49.5% | Style pass, asm differs From a03ab603b0ebeb8478138e0d9b387c7981bbb252 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 13:56:28 +0200 Subject: [PATCH 305/516] reimplement: SHC_3BB0A8C1_0x004999C0 51.05% counted for loop --- ...atePathLinkageLayerBasedOnBuildingsUnk.cpp | 99 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 48 insertions(+), 53 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp index 86c05b4dca..27f1a46c75 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp @@ -93,16 +93,16 @@ namespace Map { } } LAB_00499ada: - _directionIndex = 0; paiVar8 = DAT_TileMapState::instance.directionTranslationMatrix + yUnk; - do { + for (_directionIndex = 0; _directionIndex < 8; + _directionIndex = _directionIndex + 1, paiVar8 = (int (*)[8])(*paiVar8 + 1)) { int _tile = (*paiVar8)[0] + tile; _logic = DAT_TileMapState::instance.LogicLayer[_tile]; local_20[_directionIndex] = _logic; if ((_logic & 0x200000) == 0) { if ((_logic & 0x800) != 0) { if ((iVar6 == 1) || ('\x14' < (char)DAT_TileMapState::instance.DamageLayer[_tile])) - goto LAB_00499c4b; + continue; goto LAB_00499bce; } if ((_logic & 2) == 0) { @@ -141,7 +141,7 @@ namespace Map { bVar9 = DAT_TileMapState::instance.BuildingLayer[_tile] == 0; LAB_00499bcc: if (!bVar9) - goto LAB_00499c4b; + continue; } goto LAB_00499bce; } @@ -155,7 +155,7 @@ namespace Map { } else { _logic = (uint)DAT_TileMapState::instance.HeightLayer[_tile]; if ((int)_logic < local_28) - goto LAB_00499c4b; + continue; _skip = (int)_logic > (int)local_24; } } else { @@ -163,63 +163,58 @@ namespace Map { } LAB_00499c3f: if (_skip) - goto LAB_00499c4b; + continue; } else if (!bVar2) { if (!bVar3) - goto LAB_00499c4b; + continue; _skip = (char)DAT_TileMapState::instance.DamageLayer[tile] > 0x14; goto LAB_00499c3f; } _linkageResult = _linkageResult | DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_directionIndex]; } - LAB_00499c4b: - _directionIndex = _directionIndex + 1; - paiVar8 = (int (*)[8])(*paiVar8 + 1); - if (7 < _directionIndex) { - if (bVar5) { - if ((_linkageResult & 1) == 0 && (bVar7 & 1) != 0) { - if ((_linkageResult & 4) == 0 && (bVar7 & 4) != 0) { - _linkageResult = _linkageResult & 0xfd; - } - if ((_linkageResult & 0x40) == 0 && (bVar7 & 0x40) != 0) { - _linkageResult = _linkageResult & 0x7f; - } - } - if ((_linkageResult & 0x10) == 0 && (bVar7 & 0x10) != 0) { - if ((_linkageResult & 4) == 0 && (bVar7 & 4) != 0) { - _linkageResult = _linkageResult & 0xf7; - } - if ((_linkageResult & 0x40) == 0 && (bVar7 & 0x40) != 0) { - _linkageResult = _linkageResult & 0xdf; - } - } - } else { - if ((local_20[0] & 0x10000100) != 0 && (local_20[2] & 0x10000100) != 0 - && (local_20[1] & 0x10000100) == 0 && (local_20[1] & 2) == 0 && (local_20[0] & 0x800) == 0 - && (local_20[2] & 0x800) == 0) { - _linkageResult = _linkageResult & 0xfd; - } - if ((local_20[0] & 0x10000100) != 0 && (local_20[6] & 0x10000100) != 0 - && (local_20[7] & 0x10000100) == 0 && (local_20[7] & 2) == 0 && (local_20[0] & 0x800) == 0 - && (local_20[6] & 0x800) == 0) { - _linkageResult = _linkageResult & 0x7f; - } - if ((local_20[4] & 0x10000100) != 0 && (local_20[2] & 0x10000100) != 0 - && (local_20[3] & 0x10000100) == 0 && (local_20[3] & 2) == 0 && (local_20[4] & 0x800) == 0 - && (local_20[2] & 0x800) == 0) { - _linkageResult = _linkageResult & 0xf7; - } - if ((local_20[4] & 0x10000100) != 0 && (local_20[6] & 0x10000100) != 0 - && (local_20[5] & 0x10000100) == 0 && (local_20[5] & 2) == 0 && (local_20[4] & 0x800) == 0 - && (local_20[6] & 0x800) == 0) { - _linkageResult = _linkageResult & 0xdf; - } + } + if (bVar5) { + if ((_linkageResult & 1) == 0 && (bVar7 & 1) != 0) { + if ((_linkageResult & 4) == 0 && (bVar7 & 4) != 0) { + _linkageResult = _linkageResult & 0xfd; + } + if ((_linkageResult & 0x40) == 0 && (bVar7 & 0x40) != 0) { + _linkageResult = _linkageResult & 0x7f; + } + } + if ((_linkageResult & 0x10) == 0 && (bVar7 & 0x10) != 0) { + if ((_linkageResult & 4) == 0 && (bVar7 & 4) != 0) { + _linkageResult = _linkageResult & 0xf7; + } + if ((_linkageResult & 0x40) == 0 && (bVar7 & 0x40) != 0) { + _linkageResult = _linkageResult & 0xdf; } - DAT_TileMapState::instance.PathLinkageLayer[tile] = _linkageResult; - return _result; } - } while (true); + } else { + if ((local_20[0] & 0x10000100) != 0 && (local_20[2] & 0x10000100) != 0 + && (local_20[1] & 0x10000100) == 0 && (local_20[1] & 2) == 0 && (local_20[0] & 0x800) == 0 + && (local_20[2] & 0x800) == 0) { + _linkageResult = _linkageResult & 0xfd; + } + if ((local_20[0] & 0x10000100) != 0 && (local_20[6] & 0x10000100) != 0 + && (local_20[7] & 0x10000100) == 0 && (local_20[7] & 2) == 0 && (local_20[0] & 0x800) == 0 + && (local_20[6] & 0x800) == 0) { + _linkageResult = _linkageResult & 0x7f; + } + if ((local_20[4] & 0x10000100) != 0 && (local_20[2] & 0x10000100) != 0 + && (local_20[3] & 0x10000100) == 0 && (local_20[3] & 2) == 0 && (local_20[4] & 0x800) == 0 + && (local_20[2] & 0x800) == 0) { + _linkageResult = _linkageResult & 0xf7; + } + if ((local_20[4] & 0x10000100) != 0 && (local_20[6] & 0x10000100) != 0 + && (local_20[5] & 0x10000100) == 0 && (local_20[5] & 2) == 0 && (local_20[4] & 0x800) == 0 + && (local_20[6] & 0x800) == 0) { + _linkageResult = _linkageResult & 0xdf; + } + } + DAT_TileMapState::instance.PathLinkageLayer[tile] = _linkageResult; + return _result; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f6e130d266..c42fe5811c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24389,7 +24389,7 @@ SHC_3BB0A8C1_0x004995E0 | 50.8% | Style pass, asm differs SHC_3BB0A8C1_0x00499970 | 0.0% | Pending -SHC_3BB0A8C1_0x004999C0 | 50.7% | decoded Ghidra flag triple +SHC_3BB0A8C1_0x004999C0 | 51.0% | counted for loop SHC_3BB0A8C1_0x00499DC0 | 42.9% | Style pass, asm differs From 8ac0a0e932742aecae66205aa43f4e50da1cefac Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 14:05:58 +0200 Subject: [PATCH 306/516] reimplement: SHC_3BB0A8C1_0x004A8780 81.48% counted for + named layer --- ...PreferredOrientationBasedConnectedTile.cpp | 25 ++++++++----------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp index 31a0854513..15e0ad721e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findUnitPreferredOrientationBasedConnectedTile.cpp @@ -4,9 +4,9 @@ #include "OpenSHC/Map/Navigation/PathFindingState.func.hpp" #include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" -#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" #include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_UnitsState.hpp" #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" @@ -29,7 +29,7 @@ namespace Map { XYPair* pXVar1; int _y; int _candidate; - ushort _area; + int _area; _y = (int)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; int _x = tile - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; MACRO_CALL_MEMBER( @@ -40,25 +40,20 @@ namespace Map { pXVar1 = DAT_ClimbLogicDefinedData::instance .OrderedOrientationBasedCardinalDirectionList[DAT_DirectionAlgorithmState::instance.orientation]; - tile = 0; - while (true) { + for (tile = 0; tile < 4; tile = tile + 1, pXVar1 = pXVar1 + 1) { _candidate = DAT_ViewportRenderState::instance.translationMatrix[pXVar1->y + _y].addXgetTile + ((XYPair*)&pXVar1->x)->x + _x; - dword _toArea = (dword) * (short*)((int)DAT_TileMapState::ptr + _candidate * 2 + 0x363ed0); - if ((int)(short)_area == _toArea + int _toArea = (short)DAT_TileMapState::instance.PathConnectionLayer[_candidate]; + if (_area == _toArea || (_can = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - DAT_PathFindingState::ptr)((int)DAT_UnitsState::instance.units[unitID].owner, (dword)((int)((short)_area)), - (dword)((int)(_toArea)), 0), - _can != 0)) - break; - tile = tile + 1; - pXVar1 = pXVar1 + 1; - if (3 < tile) { - return 0; + DAT_PathFindingState::ptr)( + (int)DAT_UnitsState::instance.units[unitID].owner, (dword)(_area), (dword)(_toArea), 0), + _can != 0)) { + return _candidate; } } - return _candidate; + return 0; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c42fe5811c..5c34fa2557 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25313,7 +25313,7 @@ SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending SHC_3BB0A8C1_0x004A83B0 | 64.4% | compare operand order -SHC_3BB0A8C1_0x004A8780 | 51.3% | call via global instance +SHC_3BB0A8C1_0x004A8780 | 81.5% | counted for + named layer SHC_3BB0A8C1_0x004A8860 | 38.5% | abs() instead of shift idiom From c9cc2979859802df05dc39c5220c90cd79c83403 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 14:16:15 +0200 Subject: [PATCH 307/516] reimplement: SHC_3BB0A8C1_0x004A15B0 36.13% named UID array + base pointer --- .../Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp index 5b6b9d1c5e..64e0534c4d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp @@ -23,13 +23,14 @@ namespace Map { int _enemyLoopCounter; int _yEnemyDistance; int _enemies; - short _enemyID; + int _enemyID; if (399 < x || 399 < y) { return FALSE; } if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } + int* _pEnemyUid = DAT_GameState::instance.mapAndTime.playerEnemenyUnitUIDShortList[playerID]; _enemies = DAT_GameState::instance.playerDataArray[playerID].enemies; _enemyLoopCounter = 0; if (0 < _enemies) { @@ -38,7 +39,8 @@ namespace Map { _enemyID = *_enemyIdPtr; if (DAT_UnitsState::instance.units[_enemyID].dying == 0 && DAT_UnitsState::instance.units[_enemyID].uid - == *(int*)(playerID * 10000 + 0x11a66f0 + _enemyLoopCounter * 4) + == DAT_GameState::instance.mapAndTime + .playerEnemenyUnitUIDShortList[playerID][_enemyLoopCounter] && (_xEnemyDistance = x - (int)DAT_UnitsState::instance.units[_enemyID].x, _yEnemyDistance = y - (int)DAT_UnitsState::instance.units[_enemyID].y, _yEnemyDistance * _yEnemyDistance + _xEnemyDistance * _xEnemyDistance diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5c34fa2557..32431a825b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25011,7 +25011,7 @@ SHC_3BB0A8C1_0x004A15AE | 0.0% | Pending SHC_3BB0A8C1_0x004A15AF | 0.0% | Pending -SHC_3BB0A8C1_0x004A15B0 | 34.6% | Style pass, asm differs +SHC_3BB0A8C1_0x004A15B0 | 36.1% | named UID array + base pointer SHC_3BB0A8C1_0x004A16C0 | 97.3% | reuse computed start tile From 67b4b8b8298773741fb1fcd8a5e7b014c193e0e9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 14:36:47 +0200 Subject: [PATCH 308/516] reimplement: SHC_3BB0A8C1_0x004A5320 48.73% statement order --- .../calculateCanPlayerUnitsNavigateToAreaFromArea.cpp | 10 +++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index 87b22fd732..c3b8c552bd 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -90,8 +90,8 @@ namespace Map { goto LAB_ret; } adStack_960[iVar5] = dVar2; - iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar5 + 1; if (0 < (int)dVar3) { adStack_960[iVar5] = dVar3; iVar5 = iVar5 + 1; @@ -158,8 +158,8 @@ namespace Map { goto LAB_ret; } adStack_960[iVar5] = dVar3; - iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar5 + 1; if (0 < (int)dVar4) { adStack_960[iVar5] = dVar4; iVar5 = iVar5 + 1; @@ -221,8 +221,8 @@ namespace Map { goto LAB_ret; } adStack_960[iVar5] = dVar2; - iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar5 + 1; if (0 < (int)dVar3) { adStack_960[iVar5] = dVar3; iVar5 = iVar5 + 1; @@ -245,8 +245,8 @@ namespace Map { if (local_968 < iVar5) { do { dVar2 = adStack_960[local_968]; - local_968 = local_968 + 1; iVar6 = 0; + local_968 = local_968 + 1; if (0 < local_96c) { do { if (aiStack_640[iVar6 * 2 + 1] != 1) { @@ -283,8 +283,8 @@ namespace Map { goto LAB_ret; } adStack_960[iVar5] = dVar3; - iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar5 + 1; if (0 < (int)dVar4) { adStack_960[iVar5] = dVar4; iVar5 = iVar5 + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 32431a825b..dd1e40a59b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25251,7 +25251,7 @@ SHC_3BB0A8C1_0x004A5230 | 0.0% | Pending SHC_3BB0A8C1_0x004A52D0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5320 | 38.7% | single counter + global field5 +SHC_3BB0A8C1_0x004A5320 | 48.7% | statement order SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending From 8e1d72d42d31aaa900bde7234780df5e435d4638 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 14:36:48 +0200 Subject: [PATCH 309/516] reimplement: SHC_3BB0A8C1_0x004A9510 73.02% orig branch order + loop shape --- .../PathFindingState/createClimbData.cpp | 71 ++++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 37 insertions(+), 36 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp index 3b569fec78..f6cfa0066a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp @@ -20,9 +20,10 @@ namespace Map { ClimbData* pCVar1; int _climbID; _climbID = 1; - pCVar1 = this->climbData; - while (pCVar1 = pCVar1 + 1, pCVar1->canBeUsed != 0) { + pCVar1 = this->climbData + 1; + while (pCVar1->canBeUsed != 0) { _climbID = _climbID + 1; + pCVar1 = pCVar1 + 1; if (200 <= _climbID) { return 0; } @@ -34,46 +35,46 @@ namespace Map { DAT_GameCore::instance.uniqueGameObjectTracker = DAT_GameCore::instance.uniqueGameObjectTracker + 1; this->climbData[_climbID].buildingID = buildingID; this->climbData[_climbID].unitID = unitID; - if (buildingID == 0) { - if (unitID == 0) { - MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::clearClimbData, this)(_climbID); - return _climbID; - } + if (buildingID != 0) { /* - unitID != 0 + buildingID != 0 */ - this->climbData[_climbID].sourceUID = DAT_UnitsState::instance.units[unitID].uid; - this->climbData[_climbID].owner = (int)DAT_UnitsState::instance.units[unitID].owner; - this->climbData[_climbID].bottomXPosition = (int)DAT_UnitsState::instance.units[unitID].x; - this->climbData[_climbID].bottomYPosition = (int)DAT_UnitsState::instance.units[unitID].y; - this->climbData[_climbID].bottomTilePosition = DAT_UnitsState::instance.units[unitID].tile; - DAT_UnitsState::instance.units[unitID].wallDataID = (short)_climbID; - return _climbID; - } - /* - buildingID != 0 - */ - this->climbData[_climbID].sourceUID = DAT_BuildingsState::instance.buildings[buildingID].uid; - this->climbData[_climbID].owner = (int)DAT_BuildingsState::instance.buildings[buildingID].owner; - this->climbData[_climbID].bottomXPosition - = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; - this->climbData[_climbID].bottomYPosition - = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; - this->climbData[_climbID].bottomTilePosition - = DAT_BuildingsState::instance.buildings[buildingID].currentTilePositionAdjusted; - if (size != 6) { - if (size != 5) { - if (size == 4) - goto LAB_004a95d6; - if (size != 3) { - return _climbID; + this->climbData[_climbID].sourceUID = DAT_BuildingsState::instance.buildings[buildingID].uid; + this->climbData[_climbID].owner = (int)DAT_BuildingsState::instance.buildings[buildingID].owner; + this->climbData[_climbID].bottomXPosition + = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; + this->climbData[_climbID].bottomYPosition + = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + this->climbData[_climbID].bottomTilePosition + = DAT_BuildingsState::instance.buildings[buildingID].currentTilePositionAdjusted; + if (size != 6) { + if (size != 5) { + if (size == 4) + goto LAB_004a95d6; + if (size != 3) { + return _climbID; + } } + this->climbData[_climbID].ladderDirection = direction; + return _climbID; } + LAB_004a95d6: this->climbData[_climbID].ladderDirection = direction; return _climbID; } - LAB_004a95d6: - this->climbData[_climbID].ladderDirection = direction; + if (unitID == 0) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::clearClimbData, this)(_climbID); + return _climbID; + } + /* + unitID != 0 + */ + this->climbData[_climbID].sourceUID = DAT_UnitsState::instance.units[unitID].uid; + this->climbData[_climbID].owner = (int)DAT_UnitsState::instance.units[unitID].owner; + this->climbData[_climbID].bottomXPosition = (int)DAT_UnitsState::instance.units[unitID].x; + this->climbData[_climbID].bottomYPosition = (int)DAT_UnitsState::instance.units[unitID].y; + this->climbData[_climbID].bottomTilePosition = DAT_UnitsState::instance.units[unitID].tile; + DAT_UnitsState::instance.units[unitID].wallDataID = (short)_climbID; return _climbID; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index dd1e40a59b..6f278c8139 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25457,7 +25457,7 @@ SHC_3BB0A8C1_0x004A9200 | 48.7% | split bounds guard SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A9510 | 54.0% | loop bound off-by-one +SHC_3BB0A8C1_0x004A9510 | 73.0% | orig branch order + loop shape SHC_3BB0A8C1_0x004A9680 | 100.0% | Reimplemented From b39ebfca74f46945659f76008d35c79732798b03 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 14:36:48 +0200 Subject: [PATCH 310/516] reimplement: SHC_3BB0A8C1_0x0049C5C0 84.31% hoisted row ptr and result x --- .../PathFindingState/findDestinationCostLowerThan6.cpp | 9 +++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp index cb6f222b51..9bb5aa6132 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDestinationCostLowerThan6.cpp @@ -23,14 +23,15 @@ namespace Map { uint _cost; this->searchQueue.readIndex = 0; if (this->searchQueue.writeIndex != 0) { + byte* _pCost = DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[tile]; do { int _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + int _x = _tile - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; if (DAT_TileMapState::instance.WalkLayer[_tile] == this->searchGeneration - && (_cost = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[tile][_tile], - _cost != 0) - && _cost - 0x28 < 6 && maxDistance <= DAT_TileMapState::instance.CertainPathLayer[_tile]) { - this->ALG_ResultX = _tile - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; + && (_cost = (uint)_pCost[_tile], _cost != 0) && _cost - 0x28 < 6 + && DAT_TileMapState::instance.CertainPathLayer[_tile] >= maxDistance) { + this->ALG_ResultX = _x; this->ALG_ResultY = _y; this->ALG_ResultTile = _tile; return TRUE; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6f278c8139..564ae3810c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24659,7 +24659,7 @@ SHC_3BB0A8C1_0x0049C370 | 44.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049C4A0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049C5C0 | 37.6% | Style pass, asm differs +SHC_3BB0A8C1_0x0049C5C0 | 84.3% | hoisted row ptr and result x SHC_3BB0A8C1_0x0049C690 | 72.3% | Style pass, asm differs From 67e5fd16c0d351bbdff5b066b331bb551e00a7f7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 14:36:49 +0200 Subject: [PATCH 311/516] reimplement: SHC_3BB0A8C1_0x004974D0 31.33% fix height window -16 not +16 --- .../findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp index 3360f63d8a..da2543a1ee 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp @@ -77,7 +77,7 @@ namespace Map { DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[_candidate2]); _c2Height = _c2Height + iVar2; } - if ((int)y2 <= (int)(_c2Height + 16) && (int)(_c2Height - 4294967280) <= (int)y2) { + if ((int)y2 <= (int)(_c2Height + 16) && (int)y2 >= (int)(_c2Height - 16)) { /* if the height of this candidate tile is within 16 of the tile2 height then, compute the distance between x,y and the candidate2 tile diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 564ae3810c..629931aa7e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24361,7 +24361,7 @@ SHC_3BB0A8C1_0x00497180 | 52.2% | abs() instead of shift idiom SHC_3BB0A8C1_0x00497280 | 48.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004974D0 | 34.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004974D0 | 31.3% | fix height window -16 not +16 SHC_3BB0A8C1_0x00497690 | 100.0% | Reimplemented From c3b12df75b7392535216f4455adaa9d8122c672f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:06:19 +0200 Subject: [PATCH 312/516] reimplement: SHC_3BB0A8C1_0x0049DDC0 35.39% drop ghidra chkstk artifact st --- .../PathFindingState/budgetFloodFillOnCertainPathLayer.cpp | 1 - status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp index d65a024da0..e69defa58c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp @@ -34,7 +34,6 @@ namespace Map { uint _tile; uint _xUnk; uint _yUnk; - _tilesQueue[999] = 0x49ddca; _readIndex = 0; int _writeIndex = 1; if (x > 399 || y > 399) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 629931aa7e..bdd4b6e415 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24695,7 +24695,7 @@ SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending SHC_3BB0A8C1_0x0049DB30 | 79.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049DDC0 | 35.7% | Style pass, asm differs +SHC_3BB0A8C1_0x0049DDC0 | 35.4% | drop ghidra chkstk artifact st SHC_3BB0A8C1_0x0049E0D0 | 87.5% | Style pass, asm differs From cdef0058fe25c3ee94fcc2ff3b2e6ba31b45c6e3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:06:20 +0200 Subject: [PATCH 313/516] reimplement: SHC_3BB0A8C1_0x00498FD0 17.01% init order + signed bound --- .../PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp index 836d8ae6e4..0a464397de 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -76,12 +76,12 @@ namespace Map { local_14 = 10; while (true) { while (true) { - _init_10 = local_24; - if ((_inBounds) && (local_24 < 2)) { + if ((_inBounds) && ((int)local_24 <= 1)) { return (uint)(this->searchQueue.pathPlanIndex); } _ptrTranslationMatrix = DAT_TileMapState::instance.directionTranslationMatrix[_y] + 1; _direction = 8; + _init_10 = local_24; param_1 = local_24; iVar4 = 2; do { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bdd4b6e415..d7046c74eb 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24381,7 +24381,7 @@ SHC_3BB0A8C1_0x00498A40 | 81.8% | split bounds guard SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 17.0% | merge per-block temporaries +SHC_3BB0A8C1_0x00498FD0 | 17.0% | init order + signed bound SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending From f819e1a058c44f2c17365854b2aecd5db4374458 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:06:20 +0200 Subject: [PATCH 314/516] reimplement: SHC_3BB0A8C1_0x004A6010 39.39% statement order --- .../findBestAttackTargetTileWithHeightAndOwner.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp index d730477955..5d84e48f3e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -207,8 +207,8 @@ namespace Map { } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); if (local_14 != -1) { this->ALG_TargetX = local_14; - this->ALG_TargetY = local_10; this->ALG_TargetTile = local_c; + this->ALG_TargetY = local_10; } } return; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d7046c74eb..d347489fd3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25271,7 +25271,7 @@ SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A5F90 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6010 | 39.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A6010 | 39.4% | statement order SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending From 916ec42dd3a2c7dbce317e9d673056add0a4c14d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:06:20 +0200 Subject: [PATCH 315/516] reimplement: SHC_3BB0A8C1_0x0049BE60 51.64% drop ghidra chkstk artifact st --- .../Map/Navigation/PathFindingState/getTileInSquareBrush.cpp | 1 - status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp index 83473685b4..66ecce24ee 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/getTileInSquareBrush.cpp @@ -36,7 +36,6 @@ namespace Map { /* __chkstk */ - _tileArray[999] = 0x49be6a; _index_3 = 1; this->calculations = this->calculations + 1; this->searchGeneration = this->searchGeneration + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d347489fd3..7d9425d324 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24441,7 +24441,7 @@ SHC_3BB0A8C1_0x0049BCD0 | 0.0% | Pending SHC_3BB0A8C1_0x0049BD40 | 0.0% | Pending -SHC_3BB0A8C1_0x0049BE60 | 54.5% | compare against 0 not 1 +SHC_3BB0A8C1_0x0049BE60 | 51.6% | drop ghidra chkstk artifact st SHC_3BB0A8C1_0x0049C020 | 61.4% | Style pass, asm differs From 2901ff991be6ac9c81d66cb093351d0298d96749 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:06:21 +0200 Subject: [PATCH 316/516] reimplement: SHC_3BB0A8C1_0x00498400 40.94% orig early-return guard --- .../pathFindingWithBuildingsIncluded.cpp | 159 ++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 75 insertions(+), 86 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index 22ac7802fb..657d4e6c99 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -82,59 +82,58 @@ namespace Map { if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } - if (x2 == 0xffffffff - || ((x2 <= 399 && (y2 <= 399)) - && (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] != '\0'))) { - if (zeroMeansResetAlgorithm == 0) { - this->searchGeneration = this->searchGeneration + 1; - if (32000 < this->searchGeneration) { - this->searchGeneration = 1; - MACRO_CALL_MEMBER( - OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( - 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); - } - this->searchQueue.writeIndex = 1; - this->searchQueue.readIndex = 0; - this->searchQueue.currentDistance = 1; + if (x2 != 0xffffffff) { + if (399 < x2 || 399 < y2 + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] == '\0') { + return FALSE; } - this->DAT_Ass = this->DAT_Ass + 1; - this->searchQueue.yQueue[0] = (short)y; - this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] - = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] - = (short)this->searchQueue.currentDistance; - DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; - if (x2 == 0xffffffff) { - _tile2 = 0; - } else { - _tile2 = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; + } + if (zeroMeansResetAlgorithm == 0) { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } - if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (true) { - _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if (_currentTile == _tile2) { - return TRUE; - } - if ((this->searchQueue.readIndex >= maxOptionsToTry) || (80400 <= _currentTile)) - break; - _currentX = this->searchQueue.xQueue[this->searchQueue.readIndex]; - _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; - this->searchQueue.currentDistance - = (int)DAT_TileMapState::instance.CertainPathLayer[_currentTile]; - if (400 < (int)this->searchQueue.currentDistance) { - return FALSE; - } - _buildingID = DAT_TileMapState::instance.BuildingLayer[_currentTile]; - _logical = DAT_TileMapState::instance.LogicLayer[_currentTile]; - for (int _direction = 0; _direction < 8; _direction = _direction + 4) { - _nextTileOption - = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.currentDistance = 1; + } + this->DAT_Ass = this->DAT_Ass + 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] + = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (x2 == 0xffffffff) { + _tile2 = 0; + } else { + _tile2 = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; + } + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (true) { + _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_currentTile == _tile2) { + return TRUE; + } + if ((this->searchQueue.readIndex >= maxOptionsToTry) || (80400 <= _currentTile)) + break; + _currentX = this->searchQueue.xQueue[this->searchQueue.readIndex]; + _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_currentTile]; + if (400 < (int)this->searchQueue.currentDistance) { + return FALSE; + } + _buildingID = DAT_TileMapState::instance.BuildingLayer[_currentTile]; + _logical = DAT_TileMapState::instance.LogicLayer[_currentTile]; + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + _nextTileOption = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] + _currentTile; - /* - 0x4a5014b1 == check against walkable tiles including keep, walls, and gatehouses - */ - if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + /* + 0x4a5014b1 == check against walkable tiles including keep, walls, and gatehouses + */ + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) != 0 @@ -159,26 +158,23 @@ namespace Map { if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } - } - _nextTileOption + } + _nextTileOption = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 1] + _currentTile; - if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance - .BitFlagHelperForPathLinkage[_direction + 1]) + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 1]) != 0) { DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 1] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] .short_.xOffset + _currentX; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 1] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] .short_.yOffset + _currentY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; @@ -186,14 +182,13 @@ namespace Map { if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } - } - _nextTileOption + } + _nextTileOption = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 2] + _currentTile; - if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance - .BitFlagHelperForPathLinkage[_direction + 2]) + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 2]) != 0 || ((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) @@ -204,13 +199,11 @@ namespace Map { = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 2] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] .short_.xOffset + _currentX; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 2] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] .short_.yOffset + _currentY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; @@ -218,26 +211,23 @@ namespace Map { if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } - } - _nextTileOption + } + _nextTileOption = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 3] + _currentTile; - if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance - .BitFlagHelperForPathLinkage[_direction + 3]) + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 3]) != 0) { DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 3] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] .short_.xOffset + _currentX; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 3] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] .short_.yOffset + _currentY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; @@ -245,16 +235,15 @@ namespace Map { if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } - } - } - this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (0x13a10 <= (int)this->searchQueue.readIndex) { - this->searchQueue.readIndex = 0; - } - if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { - return FALSE; } } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return FALSE; + } } } return FALSE; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7d9425d324..579b476390 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24373,7 +24373,7 @@ SHC_3BB0A8C1_0x00498020 | 59.2% | compare operand order SHC_3BB0A8C1_0x00498170 | 0.0% | Pending -SHC_3BB0A8C1_0x00498400 | 43.7% | compare operand order +SHC_3BB0A8C1_0x00498400 | 40.9% | orig early-return guard SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending From 7bb5f6af82214857de65f5ee0f86e85aad06ae69 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:18:15 +0200 Subject: [PATCH 317/516] reimplement: SHC_3BB0A8C1_0x004A8860 47.47% widen narrow locals to int --- .../PathFindingState/findBuildingAccessPoint.cpp | 8 ++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp index 27c608b75b..e3a2c88eb8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp @@ -54,11 +54,11 @@ namespace Map { int _pairsOfAccessAndAdjacent[200][2]; int _accessibleTilesCount; int _yOffset; - byte _buidingDefHeight; + int _buidingDefHeight; uint _buildingSize; - byte _cHeight; - ushort _unitArea; - short _unitOwner; + int _cHeight; + int _unitArea; + int _unitOwner; /* === GET BUILDING INFORMATION === */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 579b476390..7118d0f3be 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25315,7 +25315,7 @@ SHC_3BB0A8C1_0x004A83B0 | 64.4% | compare operand order SHC_3BB0A8C1_0x004A8780 | 81.5% | counted for + named layer -SHC_3BB0A8C1_0x004A8860 | 38.5% | abs() instead of shift idiom +SHC_3BB0A8C1_0x004A8860 | 47.5% | widen narrow locals to int SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending From 0a89d6090fbc7300ce1fb61dc471253c5cc47437 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:18:16 +0200 Subject: [PATCH 318/516] reimplement: SHC_3BB0A8C1_0x00498400 43.67% revert guard split, worse --- .../pathFindingWithBuildingsIncluded.cpp | 159 ++++++++++-------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 86 insertions(+), 75 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index 657d4e6c99..22ac7802fb 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -82,58 +82,59 @@ namespace Map { if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } - if (x2 != 0xffffffff) { - if (399 < x2 || 399 < y2 - || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] == '\0') { - return FALSE; + if (x2 == 0xffffffff + || ((x2 <= 399 && (y2 <= 399)) + && (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y2 * 400 + x2] != '\0'))) { + if (zeroMeansResetAlgorithm == 0) { + this->searchGeneration = this->searchGeneration + 1; + if (32000 < this->searchGeneration) { + this->searchGeneration = 1; + MACRO_CALL_MEMBER( + OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( + 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + } + this->searchQueue.writeIndex = 1; + this->searchQueue.readIndex = 0; + this->searchQueue.currentDistance = 1; } - } - if (zeroMeansResetAlgorithm == 0) { - this->searchGeneration = this->searchGeneration + 1; - if (32000 < this->searchGeneration) { - this->searchGeneration = 1; - MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( - 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); + this->DAT_Ass = this->DAT_Ass + 1; + this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.xQueue[0] = (short)x; + this->searchQueue.tilesQueue[0] + = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] + = (short)this->searchQueue.currentDistance; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + if (x2 == 0xffffffff) { + _tile2 = 0; + } else { + _tile2 = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; } - this->searchQueue.writeIndex = 1; - this->searchQueue.readIndex = 0; - this->searchQueue.currentDistance = 1; - } - this->DAT_Ass = this->DAT_Ass + 1; - this->searchQueue.yQueue[0] = (short)y; - this->searchQueue.xQueue[0] = (short)x; - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] - = (short)this->searchQueue.currentDistance; - DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; - if (x2 == 0xffffffff) { - _tile2 = 0; - } else { - _tile2 = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; - } - if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (true) { - _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if (_currentTile == _tile2) { - return TRUE; - } - if ((this->searchQueue.readIndex >= maxOptionsToTry) || (80400 <= _currentTile)) - break; - _currentX = this->searchQueue.xQueue[this->searchQueue.readIndex]; - _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; - this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_currentTile]; - if (400 < (int)this->searchQueue.currentDistance) { - return FALSE; - } - _buildingID = DAT_TileMapState::instance.BuildingLayer[_currentTile]; - _logical = DAT_TileMapState::instance.LogicLayer[_currentTile]; - for (int _direction = 0; _direction < 8; _direction = _direction + 4) { - _nextTileOption = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (true) { + _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_currentTile == _tile2) { + return TRUE; + } + if ((this->searchQueue.readIndex >= maxOptionsToTry) || (80400 <= _currentTile)) + break; + _currentX = this->searchQueue.xQueue[this->searchQueue.readIndex]; + _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance + = (int)DAT_TileMapState::instance.CertainPathLayer[_currentTile]; + if (400 < (int)this->searchQueue.currentDistance) { + return FALSE; + } + _buildingID = DAT_TileMapState::instance.BuildingLayer[_currentTile]; + _logical = DAT_TileMapState::instance.LogicLayer[_currentTile]; + for (int _direction = 0; _direction < 8; _direction = _direction + 4) { + _nextTileOption + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] + _currentTile; - /* - 0x4a5014b1 == check against walkable tiles including keep, walls, and gatehouses - */ - if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + /* + 0x4a5014b1 == check against walkable tiles including keep, walls, and gatehouses + */ + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) != 0 @@ -158,23 +159,26 @@ namespace Map { if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } - } - _nextTileOption + } + _nextTileOption = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 1] + _currentTile; - if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 1]) + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 1]) != 0) { DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] .short_.xOffset + _currentX; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] .short_.yOffset + _currentY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; @@ -182,13 +186,14 @@ namespace Map { if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } - } - _nextTileOption + } + _nextTileOption = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 2] + _currentTile; - if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 2]) + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 2]) != 0 || ((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) @@ -199,11 +204,13 @@ namespace Map { = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] .short_.xOffset + _currentX; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] .short_.yOffset + _currentY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; @@ -211,23 +218,26 @@ namespace Map { if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } - } - _nextTileOption + } + _nextTileOption = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 3] + _currentTile; - if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration + if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 3]) + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 3]) != 0) { DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] .short_.xOffset + _currentX; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] .short_.yOffset + _currentY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; @@ -235,14 +245,15 @@ namespace Map { if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; } + } + } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + return FALSE; } - } - this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (0x13a10 <= (int)this->searchQueue.readIndex) { - this->searchQueue.readIndex = 0; - } - if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { - return FALSE; } } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7118d0f3be..ad0ff0d026 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24373,7 +24373,7 @@ SHC_3BB0A8C1_0x00498020 | 59.2% | compare operand order SHC_3BB0A8C1_0x00498170 | 0.0% | Pending -SHC_3BB0A8C1_0x00498400 | 40.9% | orig early-return guard +SHC_3BB0A8C1_0x00498400 | 43.7% | revert guard split, worse SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending From 18b380d7fe85b10ab62eb3e55f2e974bf2183293 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:31:34 +0200 Subject: [PATCH 319/516] reimplement: SHC_3BB0A8C1_0x004A6DF0 83.45% widen area local to int --- .../PathFindingState/canNavigateFunctionReturnsArea.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp index e27fc86809..a4e0e85625 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp @@ -24,7 +24,7 @@ namespace Map { { int (*paiVar5)[8]; int iVar6; - ushort _area; + int _area; this->ALG_ResultTile = 0; this->ALG_ResultY = 0; this->ALG_ResultX = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ad0ff0d026..5cfc6cf09a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25293,7 +25293,7 @@ SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending SHC_3BB0A8C1_0x004A6C40 | 0.0% | Pending -SHC_3BB0A8C1_0x004A6DF0 | 82.8% | split bounds guard +SHC_3BB0A8C1_0x004A6DF0 | 83.5% | widen area local to int SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending From 73d9727b4db19c85ebef995690ef92877142ad90 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:31:35 +0200 Subject: [PATCH 320/516] reimplement: SHC_3BB0A8C1_0x0049CE40 53.93% widen local to int --- .../findPathableTileWithoutUnitWithBuildingAtXY.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp index 69e025b41b..22d239c701 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp @@ -24,7 +24,7 @@ namespace Map { { int iVar2; int (*paiVar3)[8]; - short _buildingAtStart; + int _buildingAtStart; int _tile; int _x; int _y; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5cfc6cf09a..c23f0f096d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24673,7 +24673,7 @@ SHC_3BB0A8C1_0x0049CD60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x0049CDB0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CE40 | 51.1% | Style pass, asm differs +SHC_3BB0A8C1_0x0049CE40 | 53.9% | widen local to int SHC_3BB0A8C1_0x0049CF30 | 0.0% | Pending From d0a093ff7483a43499d9fa88e4ef7a3398953595 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:31:35 +0200 Subject: [PATCH 321/516] reimplement: SHC_3BB0A8C1_0x00498400 44.32% widen locals to int --- .../PathFindingState/pathFindingWithBuildingsIncluded.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index 22ac7802fb..7ed59f37dd 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -71,10 +71,10 @@ namespace Map { int _nextTileOption; uint uVar3; uint _tile2; - short _buildingID; + int _buildingID; uint _currentTile; - short _currentX; - short _currentY; + int _currentX; + int _currentY; uint _logical; if (399 < x || 399 < y) { return FALSE; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c23f0f096d..e737abbd44 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24373,7 +24373,7 @@ SHC_3BB0A8C1_0x00498020 | 59.2% | compare operand order SHC_3BB0A8C1_0x00498170 | 0.0% | Pending -SHC_3BB0A8C1_0x00498400 | 43.7% | revert guard split, worse +SHC_3BB0A8C1_0x00498400 | 44.3% | widen locals to int SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending From cad2669d6c991d017cbcfc395bcccbc8e7253098 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:31:36 +0200 Subject: [PATCH 322/516] reimplement: SHC_3BB0A8C1_0x004A8AB0 65.62% widen locals to int --- .../PathFindingState/pathfindingUpdate_0x4a8ab0.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp index 449b513aea..c33b69b8ac 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp @@ -36,8 +36,8 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x004A8AB0 void PathFindingState::pathfindingUpdate_0x4a8ab0(int param_1) { - ushort uVar1; - ushort uVar2; + int uVar1; + int uVar2; int (*paiVar7)[8]; int iVar8; int iVar9; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e737abbd44..b7ad1ef81d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25319,7 +25319,7 @@ SHC_3BB0A8C1_0x004A8860 | 47.5% | widen narrow locals to int SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending -SHC_3BB0A8C1_0x004A8AB0 | 62.5% | global instance field access +SHC_3BB0A8C1_0x004A8AB0 | 65.6% | widen locals to int SHC_3BB0A8C1_0x004A91B0 | 0.0% | Pending From 1c76584a9c5f64ce716d0187da4808dbf97f9467 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:31:36 +0200 Subject: [PATCH 323/516] reimplement: SHC_3BB0A8C1_0x004A4930 75.66% widen locals to int --- .../PathFindingState/setClimbBasedOnClosestClimbData.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp index 69a2f3f149..f415bb2231 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setClimbBasedOnClosestClimbData.cpp @@ -20,11 +20,11 @@ namespace Map { int fromXPosition; ClimbData* _pClimbData; ClimbData* _pClimbData2; - short _downOrUp1; + int _downOrUp1; int _climbDataID; int _climbData2; int _minDistance; - short _downOrUp; + int _downOrUp; int _distance; _minDistance = 1000; _climbData2 = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b7ad1ef81d..0a43314af4 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25229,7 +25229,7 @@ SHC_3BB0A8C1_0x004A4550 | 0.0% | Pending SHC_3BB0A8C1_0x004A46C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A4930 | 68.4% | statement reorder +SHC_3BB0A8C1_0x004A4930 | 75.7% | widen locals to int SHC_3BB0A8C1_0x004A4B30 | 79.0% | Style pass, asm differs From 2ea4cdb084285c216f8103f91c11b9b1b38c56d8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 15:48:58 +0200 Subject: [PATCH 324/516] reimplement: SHC_3BB0A8C1_0x00498FD0 17.25% statement order --- .../commitUnitPathPlanUsingWalkLayer.cpp | 10 +++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp index 0a464397de..f7c5b657d1 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -68,22 +68,22 @@ namespace Map { } MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, DAT_PathFindingState::ptr)(this->unitX, this->unitY, -1, -1, iVar6, 0); + local_14 = 10; _walkLayer = (short)DAT_TileMapState::instance.WalkLayer[_tile]; _rng = (short)SEC_RNG::instance.currentNumber2; this->searchQueue.pathPlanIndex = 0; iVar6 = 10; local_24 = 1; - local_14 = 10; while (true) { while (true) { if ((_inBounds) && ((int)local_24 <= 1)) { return (uint)(this->searchQueue.pathPlanIndex); } - _ptrTranslationMatrix = DAT_TileMapState::instance.directionTranslationMatrix[_y] + 1; - _direction = 8; - _init_10 = local_24; - param_1 = local_24; iVar4 = 2; + param_1 = local_24; + _init_10 = local_24; + _direction = 8; + _ptrTranslationMatrix = DAT_TileMapState::instance.directionTranslationMatrix[_y] + 1; do { _candidateTile = (*(int (*)[8])(_ptrTranslationMatrix + -1))[0] + _tile; if ((short)DAT_TileMapState::instance.WalkLayer[_candidateTile] == _walkLayer) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0a43314af4..4054607b6d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24381,7 +24381,7 @@ SHC_3BB0A8C1_0x00498A40 | 81.8% | split bounds guard SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 17.0% | init order + signed bound +SHC_3BB0A8C1_0x00498FD0 | 17.2% | statement order SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending From 6b4e1e21452b0b173c8cf37b68412b273244b8f4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 16:12:39 +0200 Subject: [PATCH 325/516] reimplement: SHC_3BB0A8C1_0x004A3B20 43.69% statement order --- .../Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index b50a030a85..667feea93e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -122,9 +122,9 @@ namespace Map { } else { sVar6 = (short)((DAT_UnitsState::instance.units[iVar9].health * 100) / iVar11); } - DAT_UnitsState::instance.units[iVar9].healthPercentage = sVar6; DAT_UnitsState::instance.units[iVar9].healthbar = sVar6 / 10; + DAT_UnitsState::instance.units[iVar9].healthPercentage = sVar6; } uVar4 = DAT_UnitsState::instance.units[iVar9].nextUnitOnTheSameTile; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4054607b6d..8f80f734da 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 42.4% | single movsx read, later queue +SHC_3BB0A8C1_0x004A3B20 | 43.7% | statement order SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From 1fd0ffaaacd919b6b6ca1e1b94b6633be02c6d2f Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 17:25:49 +0200 Subject: [PATCH 326/516] reimplement: SHC_3BB0A8C1_0x004A7F50 57.14% statement order --- ...extToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 454c078128..61771f5c79 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -80,8 +80,8 @@ namespace Map { this->searchQueue.readIndex = 0; this->searchQueue.tilesQueue[0] = tile; this->searchQueue.yQueue[0] = _origY; - this->searchQueue.xQueue[0] = (short)tile - (short)_origAXGT; DAT_TileMapState::instance.CertainPathLayer[tile] = 1; + this->searchQueue.xQueue[0] = (short)tile - (short)_origAXGT; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile <= 0x13a0f) { @@ -105,13 +105,13 @@ namespace Map { short sVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.xOffset; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar1 + _x; /* queue tiles in same area that are pathable without climbing */ DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar1 + _x; this->searchQueue.yQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.yOffset @@ -170,9 +170,9 @@ namespace Map { if (((shortenedDistance != 1) || ((short)DAT_TileMapState::instance.UnitLayer[_candidate2] == 0)) && _candidate2 != 0) { + *area = _candidate2; area[-1] = _tile2; _dIndex = _dIndex + 1; - *area = _candidate2; area = area + 3; if (maxDestinations <= _dIndex) { return; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8f80f734da..672a329c03 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25303,7 +25303,7 @@ SHC_3BB0A8C1_0x004A75B0 | 47.0% | compare operand order SHC_3BB0A8C1_0x004A79A0 | 58.6% | self-call via global instance -SHC_3BB0A8C1_0x004A7F50 | 51.8% | call via global instance +SHC_3BB0A8C1_0x004A7F50 | 57.1% | statement order SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending From 3962c1c3379a115423231fc4e20bcd1ea8fb7ff2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 17:25:49 +0200 Subject: [PATCH 327/516] reimplement: SHC_3BB0A8C1_0x00497740 50.49% statement order --- .../PathFindingState/findLinkageBasedPathOrWalkRadius.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp index 8944f86256..cd44b62c21 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp @@ -100,8 +100,8 @@ namespace Map { if (800 <= _cCardinalDistance) { break; } - int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; int _cLink = _linkage[_tile]; + int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; MACRO_LINKAGE_EXPAND_NEIGHBOURS(1, y) diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 672a329c03..7d262a3901 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24365,7 +24365,7 @@ SHC_3BB0A8C1_0x004974D0 | 31.3% | fix height window -16 not +16 SHC_3BB0A8C1_0x00497690 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x00497740 | 49.5% | Style pass, asm differs +SHC_3BB0A8C1_0x00497740 | 50.5% | statement order SHC_3BB0A8C1_0x00497B80 | 52.4% | Style pass, asm differs From 9ed40ab751ce7587dc11fae6f2ac8db53df93018 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 17:25:49 +0200 Subject: [PATCH 328/516] reimplement: SHC_3BB0A8C1_0x00497B80 52.65% statement order --- .../PathFindingState/findSuitableSpawnLocationUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp index b4548f097f..5a8740bd88 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp @@ -79,8 +79,8 @@ namespace Map { _result = 1; break; } - int _cCardinalDistance = _certainPath[_tile] + 1; int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; + int _cCardinalDistance = _certainPath[_tile] + 1; int _cLink = _linkage[_tile]; MACRO_LINKAGE_EXPAND_FREE_NEIGHBOURS(1, y) diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7d262a3901..74b2eea1fd 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24367,7 +24367,7 @@ SHC_3BB0A8C1_0x00497690 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00497740 | 50.5% | statement order -SHC_3BB0A8C1_0x00497B80 | 52.4% | Style pass, asm differs +SHC_3BB0A8C1_0x00497B80 | 52.6% | statement order SHC_3BB0A8C1_0x00498020 | 59.2% | compare operand order From d3321d80ac6873c33770b92567b1ae7e138ac6f4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 17:25:50 +0200 Subject: [PATCH 329/516] reimplement: SHC_3BB0A8C1_0x004A79A0 63.76% statement order --- .../Map/Navigation/PathFindingState/pathPlanningForTribe.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index c7ac685858..4267d33e50 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -81,8 +81,8 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (uVar11 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar11 <= 0x13a0f) { - int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar11]; if ((0x13a10 < (int)this->searchQueue.currentDistance) || (10 < (int)this->searchQueue.currentDistance)) @@ -197,9 +197,9 @@ namespace Map { iVar12 = iVar5; } if (iVar12 == 1 && (abs(tribeID - uVar11) < 0x20)) { + _destIndex = _destIndex + 1; ((PathHelper12*)(_pDest2 + -1))->tile1 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - _destIndex = _destIndex + 1; *_pDest2 = 1; _pDest2 = _pDest2 + 3; if (unitCount <= _destIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 74b2eea1fd..0b73b20dd3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field SHC_3BB0A8C1_0x004A75B0 | 47.0% | compare operand order -SHC_3BB0A8C1_0x004A79A0 | 58.6% | self-call via global instance +SHC_3BB0A8C1_0x004A79A0 | 63.8% | statement order SHC_3BB0A8C1_0x004A7F50 | 57.1% | statement order From c29101334f6fb6eb8e5276aae67873239066bc43 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 17:25:50 +0200 Subject: [PATCH 330/516] reimplement: SHC_3BB0A8C1_0x0049AF50 22.15% statement order --- .../PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp index 97a2c38ba1..661086ffbc 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setChangedLayerZeroBasedOn40x40Layer.cpp @@ -110,8 +110,8 @@ namespace Map { local_1c = local_1c + -1; } while (local_1c != 0); _cur10 = _cur10 + 1; - _yOffset = _yOffset + 400; _curX = _curX + 0xc; + _yOffset = _yOffset + 400; } while (_cur10 < 10); _someYLikeLimit = DAT_TileMapState::instance.someYLikeLimit; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0b73b20dd3..6f9857932c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24413,7 +24413,7 @@ SHC_3BB0A8C1_0x0049AAD0 | 86.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AF50 | 20.8% | named ChangedLayer + local row +SHC_3BB0A8C1_0x0049AF50 | 22.1% | statement order SHC_3BB0A8C1_0x0049B000 | 0.0% | Pending From f1188c48e9dc028123632f266023a0d29ef9a0da Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 20:17:18 +0200 Subject: [PATCH 331/516] reimplement: SHC_3BB0A8C1_0x0049DDC0 35.62% statement order --- .../PathFindingState/budgetFloodFillOnCertainPathLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp index e69defa58c..8e69077388 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp @@ -135,8 +135,8 @@ namespace Map { } else if (0 < DAT_TileMapState::instance.CertainPathLayer[uVar4]) { iVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] .int_.xOffset; - _tilesQueue[_writeIndex] = uVar4; _xs[_writeIndex] = iVar1 + _yUnk; + _tilesQueue[_writeIndex] = uVar4; _ys[_writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] .int_.yOffset diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6f9857932c..ec8246252b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24695,7 +24695,7 @@ SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending SHC_3BB0A8C1_0x0049DB30 | 79.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049DDC0 | 35.4% | drop ghidra chkstk artifact st +SHC_3BB0A8C1_0x0049DDC0 | 35.6% | statement order SHC_3BB0A8C1_0x0049E0D0 | 87.5% | Style pass, asm differs From 27bd1ff382fb23526f64d489ad9596402e6f62bf Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 20:17:19 +0200 Subject: [PATCH 332/516] reimplement: SHC_3BB0A8C1_0x004A5320 49.15% statement order --- .../calculateCanPlayerUnitsNavigateToAreaFromArea.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index c3b8c552bd..839f906e43 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -245,8 +245,8 @@ namespace Map { if (local_968 < iVar5) { do { dVar2 = adStack_960[local_968]; - iVar6 = 0; local_968 = local_968 + 1; + iVar6 = 0; if (0 < local_96c) { do { if (aiStack_640[iVar6 * 2 + 1] != 1) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ec8246252b..ea469acdff 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25251,7 +25251,7 @@ SHC_3BB0A8C1_0x004A5230 | 0.0% | Pending SHC_3BB0A8C1_0x004A52D0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5320 | 48.7% | statement order +SHC_3BB0A8C1_0x004A5320 | 49.1% | statement order SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending From d34de90ab0a0ba3fb0c1eed0077be34e677c09b7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 20:17:19 +0200 Subject: [PATCH 333/516] reimplement: SHC_3BB0A8C1_0x0049C370 70.59% statement order --- .../Map/Navigation/PathFindingState/findNoTreeInRange.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp index b12c3e430b..7e65ccd665 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp @@ -52,8 +52,8 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _tile && (_tile < 0x13a10))) { @@ -78,12 +78,12 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; this->searchQueue.yQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance .clockwiseCardinalTranslationMatrix[_direction] .short_.yOffset + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ea469acdff..ce9782b877 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24655,7 +24655,7 @@ SHC_3BB0A8C1_0x0049C360 | 0.0% | Pending SHC_3BB0A8C1_0x0049C361 | 0.0% | Pending -SHC_3BB0A8C1_0x0049C370 | 44.0% | Style pass, asm differs +SHC_3BB0A8C1_0x0049C370 | 70.6% | statement order SHC_3BB0A8C1_0x0049C4A0 | 0.0% | Pending From 4136fe7eab4b6192f96df7bf8b713eb46bbbb345 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 20:17:19 +0200 Subject: [PATCH 334/516] reimplement: SHC_3BB0A8C1_0x00498020 60.14% statement order --- .../findPathUsingClimbingWithHeightMargin16.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp index fb15bc9c3c..695fd0e38d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -101,8 +101,8 @@ namespace Map { break; uint _tHeight = (uint)DAT_TileMapState::instance.HeightLayer[_tile]; _tLogic = DAT_TileMapState::instance.LogicLayer[_tile]; - _direction = 0; paiVar4 = DAT_TileMapState::instance.directionTranslationMatrix + sVar2; + _direction = 0; do { /* for each direction, do: @@ -182,11 +182,11 @@ namespace Map { .short_.xOffset; DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; this->searchQueue.yQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.yOffset + sVar2; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ce9782b877..602e8e1271 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24369,7 +24369,7 @@ SHC_3BB0A8C1_0x00497740 | 50.5% | statement order SHC_3BB0A8C1_0x00497B80 | 52.6% | statement order -SHC_3BB0A8C1_0x00498020 | 59.2% | compare operand order +SHC_3BB0A8C1_0x00498020 | 60.1% | statement order SHC_3BB0A8C1_0x00498170 | 0.0% | Pending From 79f78c319a86068246ee8f5b4df1b5b97a22d33a Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 20:17:20 +0200 Subject: [PATCH 335/516] reimplement: SHC_3BB0A8C1_0x004A8AB0 74.10% statement order --- .../pathfindingUpdate_0x4a8ab0.cpp | 14 +++++++------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp index c33b69b8ac..e46c20b021 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp @@ -146,9 +146,9 @@ namespace Map { iVar9 = (int)(short)uVar1 + DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile; this->searchQueue.tilesQueue[uVar6] = iVar9; - DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; uVar6 = uVar6 + 1; } if (DAT_GameState::instance.mapAndTime.signpostIDs[7] != 0) { @@ -166,14 +166,14 @@ namespace Map { if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (uVar6 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar6 <= 0x13a0f) { int sVar3 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; - int sVar4 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar6]; + int sVar4 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; if (0x13a10 < (int)this->searchQueue.currentDistance || (int)this->searchQueue.currentDistance > param_1) break; local_10 = this->searchQueue.tilesQueue + local_24; - local_14 = this->searchQueue.yQueue + local_24; local_18 = this->searchQueue.xQueue + local_24; + local_14 = this->searchQueue.yQueue + local_24; for (int _direction = 0; _direction < 8; _direction = _direction + 1) { iVar9 = DAT_TileMapState::instance.directionTranslationMatrix[sVar4][_direction] + uVar6; uint uVar5 = DAT_TileMapState::instance.LogicLayer[iVar9]; @@ -240,9 +240,9 @@ namespace Map { .clockwiseCardinalTranslationMatrix[_direction] .int_.yOffset + sVar4; + *local_10 = iVar9; local_14 = local_14 + 1; local_18 = local_18 + 1; - *local_10 = iVar9; local_10 = local_10 + 1; } if ((uVar5 & 0x40000000) != 0) { @@ -262,14 +262,14 @@ namespace Map { DAT_TileMapState::instance.LogicLayer[iVar9] = DAT_TileMapState::instance.LogicLayer[iVar9] & 0xbfffbfff; *local_18 = (short)iVar8 + sVar3; + *local_10 = iVar9; *local_14 = (short)DAT_TerrainDefinedData::instance .clockwiseCardinalTranslationMatrix[_direction] .int_.yOffset + sVar4; local_18 = local_18 + 1; - *local_10 = iVar9; - local_10 = local_10 + 1; local_14 = local_14 + 1; + local_10 = local_10 + 1; } if ((uVar5 & 8) != 0) { DAT_TileMapState::instance.LogicLayer[iVar9] @@ -292,8 +292,8 @@ namespace Map { } if (0x9d08 < local_24) { psVar12 = this->searchQueue.yQueue + 0x9d08; - piVar11 = this->searchQueue.tilesQueue + 0x9d08; local_24 = local_24 + -0x9d08; + piVar11 = this->searchQueue.tilesQueue + 0x9d08; do { MACRO_CALL_MEMBER( OpenSHC::Map::Navigation::PathFindingState_Func::updatePathLinkagesInAllEightDirections, this)( diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 602e8e1271..c0468f5c4c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25319,7 +25319,7 @@ SHC_3BB0A8C1_0x004A8860 | 47.5% | widen narrow locals to int SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending -SHC_3BB0A8C1_0x004A8AB0 | 65.6% | widen locals to int +SHC_3BB0A8C1_0x004A8AB0 | 74.1% | statement order SHC_3BB0A8C1_0x004A91B0 | 0.0% | Pending From 78cee4dff9b6d83f373758a2a2c2693e53c62362 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 21:06:59 +0200 Subject: [PATCH 336/516] reimplement: SHC_3BB0A8C1_0x004A1230 60.76% statement order --- .../aggressiveStanceTargetBuildingAtRange.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp index 93705a0756..60d8fa5cc3 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/aggressiveStanceTargetBuildingAtRange.cpp @@ -66,9 +66,9 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.writeIndex = 1; this->searchQueue.readIndex = 0; + this->searchQueue.yQueue[0] = sVar2; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[uVar7].addXgetTile + uVar5; - this->searchQueue.yQueue[0] = sVar2; this->searchQueue.xQueue[0] = sVar1; DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; @@ -77,8 +77,8 @@ namespace Map { while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _tile && (_tile < 0x13a10))) { sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; - sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; if (0x13a10 < (int)this->searchQueue.currentDistance) { return; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c0468f5c4c..76b292302f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24877,7 +24877,7 @@ SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending SHC_3BB0A8C1_0x004A0E50 | 94.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004A1230 | 59.4% | Style pass, asm differs +SHC_3BB0A8C1_0x004A1230 | 60.8% | statement order SHC_3BB0A8C1_0x004A1568 | 0.0% | Pending From 973ed080232b33422268c3f071de8ec02985e87d Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 21:06:59 +0200 Subject: [PATCH 337/516] reimplement: SHC_3BB0A8C1_0x004A3220 73.80% statement order --- .../findAccessibleWallAndNearbyFreeTile.cpp | 8 ++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp index 9acf760a8f..fd97c20f8f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp @@ -149,14 +149,14 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[iVar3] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[iVar3] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[uVar4] - .short_.xOffset - + sVar1; this->searchQueue.yQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[uVar4] .short_.yOffset + _y; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[uVar4] + .short_.xOffset + + sVar1; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar3; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; if (0x13a10 <= (int)this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 76b292302f..77af8309ea 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25207,7 +25207,7 @@ SHC_3BB0A8C1_0x004A2F00 | 0.0% | Pending SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3220 | 63.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A3220 | 73.8% | statement order SHC_3BB0A8C1_0x004A36B0 | 80.1% | compare operand order From 68310649de51ba169944b82984085b8b05b68502 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 21:07:00 +0200 Subject: [PATCH 338/516] reimplement: SHC_3BB0A8C1_0x004974D0 32.13% statement order --- .../findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp index da2543a1ee..52f6a7c462 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNeighbourTileThatCanServeAsClimbPointClosestToXY.cpp @@ -96,11 +96,11 @@ namespace Map { = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .int_.xOffset + x2; - _minDistance = DAT_DirectionAlgorithmState::instance.distanceHigh; this->climbY = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .int_.yOffset + uVar1; + _minDistance = DAT_DirectionAlgorithmState::instance.distanceHigh; _status = 1; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 77af8309ea..10e3397899 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24361,7 +24361,7 @@ SHC_3BB0A8C1_0x00497180 | 52.2% | abs() instead of shift idiom SHC_3BB0A8C1_0x00497280 | 48.9% | Style pass, asm differs -SHC_3BB0A8C1_0x004974D0 | 31.3% | fix height window -16 not +16 +SHC_3BB0A8C1_0x004974D0 | 32.1% | statement order SHC_3BB0A8C1_0x00497690 | 100.0% | Reimplemented From 78923d429bdd84d268498c739fb755244e84f788 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 21:07:00 +0200 Subject: [PATCH 339/516] reimplement: SHC_3BB0A8C1_0x004A83B0 71.57% statement order --- ...tionsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 10 +++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index bf1562c834..f656efd015 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -45,8 +45,8 @@ namespace Map { int _y; _tileY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; _axgt = DAT_ViewportRenderState::instance.translationMatrix[_tileY].addXgetTile; - this->searchGeneration = this->searchGeneration + 1; _dIndex = 0; + this->searchGeneration = this->searchGeneration + 1; if (32000 < this->searchGeneration) { this->searchGeneration = 1; MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( @@ -54,8 +54,8 @@ namespace Map { } this->searchQueue.currentDistance = 1; this->searchQueue.writeIndex = 1; - maxDestinations = maxDestinations * 2; this->searchQueue.readIndex = 0; + maxDestinations = maxDestinations * 2; if (maxDestinations < 500) { if (maxDestinations < 50) { maxDestinations = 50; @@ -66,8 +66,8 @@ namespace Map { this->searchQueue.tilesQueue[0] = tile; this->searchQueue.yQueue[0] = _tileY; this->searchQueue.xQueue[0] = (short)tile - (short)_axgt; - DAT_TileMapState::instance.CertainPathLayer[tile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[tile] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile <= 0x13a0f) { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; @@ -93,10 +93,10 @@ namespace Map { short sVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.xOffset; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar1 + _x; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar1 + _x; this->searchQueue.yQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.yOffset diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 10e3397899..9111f6b400 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25311,7 +25311,7 @@ SHC_3BB0A8C1_0x004A8220 | 0.0% | Pending SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending -SHC_3BB0A8C1_0x004A83B0 | 64.4% | compare operand order +SHC_3BB0A8C1_0x004A83B0 | 71.6% | statement order SHC_3BB0A8C1_0x004A8780 | 81.5% | counted for + named layer From 5b7189093778444d559242bd65b9e846948cdd70 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 21:07:01 +0200 Subject: [PATCH 340/516] reimplement: SHC_3BB0A8C1_0x004A97D0 21.59% statement order --- .../Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp index b0602d09d5..6f79971f8d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp @@ -148,8 +148,8 @@ namespace Map { = this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] + (byte)iVar4 * '\x10'; } - this->searchQueue.pathPlanIndex = this->searchQueue.pathPlanIndex + 1; tile = x2; + this->searchQueue.pathPlanIndex = this->searchQueue.pathPlanIndex + 1; } while ((int)this->searchQueue.pathPlanIndex < 800); MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::reverseCurrentPathPlan, this)(); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9111f6b400..8eab524e3a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25465,7 +25465,7 @@ SHC_3BB0A8C1_0x004A96B0 | 0.0% | Pending SHC_3BB0A8C1_0x004A9760 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A97D0 | 21.5% | Style pass, asm differs +SHC_3BB0A8C1_0x004A97D0 | 21.6% | statement order SHC_3BB0A8C1_0x004A98C0 | 0.0% | Pending From d819de1b74e6a7029c679c66f8c8b54026de2ad8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Thu, 15 Oct 2026 21:07:01 +0200 Subject: [PATCH 341/516] reimplement: SHC_3BB0A8C1_0x0049A370 12.46% statement order --- .../tracePathPlanToDestinationViaUnoccupiedTiles.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp index 3ae7fb77d6..7a92c4bc37 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp @@ -62,8 +62,8 @@ namespace Map { _direction = 0; _gen = (ushort)this->searchGeneration; _fireCount = DAT_EntityState::instance.fireCount; - _tile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; _destTile = DAT_ViewportRenderState::instance.translationMatrix[destY].addXgetTile + destX; + _tile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; _occupancy = DAT_TileMapState::instance.OccupancyLayer; _walkLayer = DAT_TileMapState::instance.WalkLayer; _linkage = DAT_TileMapState::instance.PathLinkageLayer; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8eab524e3a..bd9773e5e5 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24399,7 +24399,7 @@ SHC_3BB0A8C1_0x0049A1C0 | 52.8% | shifted row index variable SHC_3BB0A8C1_0x0049A2E0 | 96.3% | index locals + statement order -SHC_3BB0A8C1_0x0049A370 | 11.2% | Style pass, asm differs +SHC_3BB0A8C1_0x0049A370 | 12.5% | statement order SHC_3BB0A8C1_0x0049A5E0 | 78.3% | Style pass, asm differs From a484b1f7dab1946479c66c35cb7b3b271660bc08 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:44 +0200 Subject: [PATCH 342/516] reimplement: SHC_3BB0A8C1_0x0049B5B0 72.34% statement order --- .../Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp index d23e79de2d..b93d126d86 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp @@ -51,8 +51,8 @@ namespace Map { this->searchQueue.xQueue[0] = (short)originX; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[originY].addXgetTile + originX; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < iVar4 && (iVar4 < 0x13a10))) { @@ -87,8 +87,8 @@ namespace Map { if ((int)this->searchQueue.currentDistance > distance) { return; } - paiVar8 = DAT_TileMapState::instance.directionTranslationMatrix + iVar7; psVar6 = &DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[0].short_.yOffset; + paiVar8 = DAT_TileMapState::instance.directionTranslationMatrix + iVar7; do { iVar7 = (*paiVar8)[0] + iVar4; uVar5 = DAT_TileMapState::instance.LogicLayer[iVar7]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bd9773e5e5..7ea71215d8 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24423,7 +24423,7 @@ SHC_3BB0A8C1_0x0049B1D0 | 86.8% | queue wrap off-by-one SHC_3BB0A8C1_0x0049B2B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049B5B0 | 71.1% | named matrix end field +SHC_3BB0A8C1_0x0049B5B0 | 72.3% | statement order SHC_3BB0A8C1_0x0049B6B0 | 0.0% | Pending From 03544aef42a4e7ad9936f4fd10df6413a1ba8036 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:44 +0200 Subject: [PATCH 343/516] reimplement: SHC_3BB0A8C1_0x00498A40 82.17% statement order --- .../calculatePathKeepAndWallsGatesNotAllowed.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp index 4281899461..e98ec7892b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -65,8 +65,8 @@ namespace Map { if ((this->searchQueue.readIndex >= maxTries) || (80400 <= _tile)) break; int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; - this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; for (int iVar3 = 0; iVar3 < 8; iVar3 = iVar3 + 4) { iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3] + _tile; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7ea71215d8..bb5712e826 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24377,7 +24377,7 @@ SHC_3BB0A8C1_0x00498400 | 44.3% | widen locals to int SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00498A40 | 81.8% | split bounds guard +SHC_3BB0A8C1_0x00498A40 | 82.2% | statement order SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending From 942156a9ea5a39a97d43eff045a6aac3fb62cc0e Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:44 +0200 Subject: [PATCH 344/516] reimplement: SHC_3BB0A8C1_0x004A6DF0 83.85% statement order --- .../PathFindingState/canNavigateFunctionReturnsArea.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp index a4e0e85625..2e68269e23 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp @@ -50,8 +50,8 @@ namespace Map { this->searchQueue.xQueue[0] = (short)unitX; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[unitY].addXgetTile + unitX; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { int iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bb5712e826..ae47913e68 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25293,7 +25293,7 @@ SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending SHC_3BB0A8C1_0x004A6C40 | 0.0% | Pending -SHC_3BB0A8C1_0x004A6DF0 | 83.5% | widen area local to int +SHC_3BB0A8C1_0x004A6DF0 | 83.8% | statement order SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending From b9bdf0aaa8fe0a27b5aa207846ef457eaacf02b3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:45 +0200 Subject: [PATCH 345/516] reimplement: SHC_3BB0A8C1_0x0049DB30 83.27% statement order --- .../checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp index fe3a7aabb0..2dfd5ece47 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/checkEnemyBuildingOrDefensiveStructureWithin12Tiles.cpp @@ -57,9 +57,9 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; + bVar3 = this->searchQueue.readIndex == this->searchQueue.writeIndex; DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; - bVar3 = this->searchQueue.readIndex == this->searchQueue.writeIndex; while (true) { if (bVar3) { return FALSE; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ae47913e68..1c5b22bb75 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24693,7 +24693,7 @@ SHC_3BB0A8C1_0x0049D880 | 79.2% | compare operand order SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending -SHC_3BB0A8C1_0x0049DB30 | 79.0% | Style pass, asm differs +SHC_3BB0A8C1_0x0049DB30 | 83.3% | statement order SHC_3BB0A8C1_0x0049DDC0 | 35.6% | statement order From c709d7dc7ccdfda41a42d0ca2df47b1993ae0d3f Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:45 +0200 Subject: [PATCH 346/516] reimplement: SHC_3BB0A8C1_0x0049CB00 51.88% statement order --- .../PathFindingState/computeNextRallyPointDestination.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp index 36bf677f21..bf85e7d0bc 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp @@ -46,8 +46,8 @@ namespace Map { this->searchQueue.xQueue[0] = (short)xPos; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[yPos].addXgetTile + xPos; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((_cTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _cTile && (_cTile < 0x13a10))) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 1c5b22bb75..f51126e181 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24665,7 +24665,7 @@ SHC_3BB0A8C1_0x0049C690 | 72.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049C730 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CB00 | 51.1% | Style pass, asm differs +SHC_3BB0A8C1_0x0049CB00 | 51.9% | statement order SHC_3BB0A8C1_0x0049CBE0 | 0.0% | Pending From ecb503289ff23057347b7178233e0b320d18e0dd Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:46 +0200 Subject: [PATCH 347/516] reimplement: SHC_3BB0A8C1_0x0049C690 77.06% statement order --- .../PathFindingState/computeTotalUnitsWithinDistance.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp index cd36d7b5f9..b9e23d0e3f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp @@ -45,8 +45,8 @@ namespace Map { this->searchQueue.yQueue[0] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; this->searchQueue.tilesQueue[0] = tile; - DAT_TileMapState::instance.CertainPathLayer[tile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[tile] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar4 <= 0x13a0f) { int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f51126e181..5e8f90de8c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24661,7 +24661,7 @@ SHC_3BB0A8C1_0x0049C4A0 | 0.0% | Pending SHC_3BB0A8C1_0x0049C5C0 | 84.3% | hoisted row ptr and result x -SHC_3BB0A8C1_0x0049C690 | 72.3% | Style pass, asm differs +SHC_3BB0A8C1_0x0049C690 | 77.1% | statement order SHC_3BB0A8C1_0x0049C730 | 0.0% | Pending From 8d573a1a76ffa36147b208a492dc01a8fa03f40b Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:46 +0200 Subject: [PATCH 348/516] reimplement: SHC_3BB0A8C1_0x004A5DA0 84.94% statement order --- .../PathFindingState/findBestAdjacentClimbTileToTarget.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp index f9c5f766d7..0bc8bb4f50 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp @@ -62,8 +62,8 @@ namespace Map { DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar5]); local_18 = local_18 + iVar2; } - paiVar3 = DAT_TileMapState::instance.directionTranslationMatrix + param_5; piVar7 = &DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[0].int_.yOffset; + paiVar3 = DAT_TileMapState::instance.directionTranslationMatrix + param_5; do { iVar6 = (*paiVar3)[0] + iVar5; iVar2 = MACRO_CALL_MEMBER( diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5e8f90de8c..0137ecca2b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25265,7 +25265,7 @@ SHC_3BB0A8C1_0x004A5A30 | 0.0% | Pending SHC_3BB0A8C1_0x004A5B00 | 57.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A5DA0 | 84.2% | split bounds guard +SHC_3BB0A8C1_0x004A5DA0 | 84.9% | statement order SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented From d8a1c429b5eb0c715aa8070ba221363fac2d0824 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:47 +0200 Subject: [PATCH 349/516] reimplement: SHC_3BB0A8C1_0x004A01D0 56.74% statement order --- .../PathFindingState/findBestAttackTileByPathCost.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp index 80c9200894..d24527b7bf 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp @@ -89,8 +89,8 @@ namespace Map { && (iVar1 = this->searchQueue.currentDistance + (uint)DAT_TileMapState::instance.SEC_TileMap1104[dVar4] * 3, iVar1 < local_4)) { - local_8 = dVar4; local_4 = iVar1; + local_8 = dVar4; } } DAT_TileMapState::instance.CertainPathLayer[dVar4] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0137ecca2b..a11ea06585 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24729,7 +24729,7 @@ SHC_3BB0A8C1_0x0049FF20 | 65.3% | Style pass, asm differs SHC_3BB0A8C1_0x004A0050 | 0.0% | Pending -SHC_3BB0A8C1_0x004A01D0 | 56.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A01D0 | 56.7% | statement order SHC_3BB0A8C1_0x004A0300 | 0.0% | Pending From 2266757db2f370ebae0b24097d77b6525c6914c8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:47 +0200 Subject: [PATCH 350/516] reimplement: SHC_3BB0A8C1_0x0049D880 80.52% statement order --- .../PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp index 0bfa235e3c..2fb764f7a3 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp @@ -68,11 +68,11 @@ namespace Map { _absDistY = _absDistX; } if (_absDistY < _lowestDist) { + *pY = iVar5; /* lowest manhatten distance */ *pX = (int)_x; - *pY = iVar5; _lowestDist = _absDistY; } this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a11ea06585..b6f04a1d61 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24689,7 +24689,7 @@ SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending SHC_3BB0A8C1_0x0049D640 | 78.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049D880 | 79.2% | compare operand order +SHC_3BB0A8C1_0x0049D880 | 80.5% | statement order SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending From ee2157865c0f08223bb8b52325bed338526a76ca Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:48 +0200 Subject: [PATCH 351/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 62.33% statement order --- .../PathFindingState/findCrossAreaBridgeTileToTarget.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index 4863c03866..af61316758 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -52,6 +52,7 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.writeIndex = 1; this->searchQueue.readIndex = 0; + this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[param_1].x; ushort uVar1 = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[param_1].tile]; ushort uVar2 @@ -59,7 +60,6 @@ namespace Map { .PathConnectionLayer[DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2]; this->searchQueue.yQueue[0] = DAT_UnitsState::instance.units[param_1].y; - this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[param_1].x; int _startTile = DAT_UnitsState::instance.units[param_1].tile; this->searchQueue.tilesQueue[0] = _startTile; DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; @@ -82,15 +82,15 @@ namespace Map { || (DAT_TileMapState::instance.LogicLayer[iVar13] & 0x10000100U) != 0) { iVar7 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .int_.xOffset; + DAT_TileMapState::instance.WalkLayer[iVar13] = (short)this->searchGeneration; DAT_TileMapState::instance.CertainPathLayer[iVar13] = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar13] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] = (short)iVar7 + sVar3; this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_TerrainDefinedData::instance .clockwiseCardinalTranslationMatrix[_direction] .int_.yOffset + sVar4; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = (short)iVar7 + sVar3; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar13; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; if (0x13a10 <= (int)this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b6f04a1d61..348ae2293d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25287,7 +25287,7 @@ SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending SHC_3BB0A8C1_0x004A69F0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6AB0 | 57.6% | abs() instead of shift idiom +SHC_3BB0A8C1_0x004A6AB0 | 62.3% | statement order SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending From d014203e9e98f233b0dac8ee56dac5083ef109a5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:48 +0200 Subject: [PATCH 352/516] reimplement: SHC_3BB0A8C1_0x004A0B20 66.52% statement order --- .../PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp index f885ae66d0..50b1abf950 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findDistanceOrThreatLevelToUnitUnk.cpp @@ -132,8 +132,8 @@ namespace Map { } param_3 = param_3 + 1 + this->searchQueue.currentDistance; if (param_3 > local_8) { - local_c = iVar5; local_8 = param_3; + local_c = iVar5; } } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 348ae2293d..587ca38def 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24741,7 +24741,7 @@ SHC_3BB0A8C1_0x004A07C0 | 0.0% | Pending SHC_3BB0A8C1_0x004A08E0 | 84.5% | Style pass, asm differs -SHC_3BB0A8C1_0x004A0B20 | 66.1% | compare operand order +SHC_3BB0A8C1_0x004A0B20 | 66.5% | statement order SHC_3BB0A8C1_0x004A0BD0 | 0.0% | Pending From 278b8882f52c0e5cd6ada379271e0210b0faff38 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:48 +0200 Subject: [PATCH 353/516] reimplement: SHC_3BB0A8C1_0x0049D0E0 54.39% statement order --- .../PathFindingState/findFreeTileOnDefensiveStructure.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp index 9482c1d526..dff6f2e9b5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp @@ -44,8 +44,8 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _tile && (_tile < 0x13a10))) { @@ -82,11 +82,11 @@ namespace Map { = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.xOffset + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; this->searchQueue.yQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.yOffset + sVar2; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 587ca38def..b28884ef46 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24677,7 +24677,7 @@ SHC_3BB0A8C1_0x0049CE40 | 53.9% | widen local to int SHC_3BB0A8C1_0x0049CF30 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D0E0 | 52.7% | Style pass, asm differs +SHC_3BB0A8C1_0x0049D0E0 | 54.4% | statement order SHC_3BB0A8C1_0x0049D240 | 0.0% | Pending From 206f3cf7a1d3162eb99ba7eb15c9fa056068c432 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:49 +0200 Subject: [PATCH 354/516] reimplement: SHC_3BB0A8C1_0x0049BBF0 52.17% statement order --- .../Map/Navigation/PathFindingState/findFurthestSeaTile.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp index daf84692e6..a6360f269a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFurthestSeaTile.cpp @@ -47,14 +47,14 @@ namespace Map { this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { this->ALG_ResultTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if ((this->ALG_ResultTile < 0) || (0x13a10 <= this->ALG_ResultTile)) break; - _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[this->ALG_ResultTile]; if (budget < this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b28884ef46..ec20de8aa2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24435,7 +24435,7 @@ SHC_3BB0A8C1_0x0049BA30 | 0.0% | Pending SHC_3BB0A8C1_0x0049BA90 | 0.0% | Pending -SHC_3BB0A8C1_0x0049BBF0 | 49.8% | Style pass, asm differs +SHC_3BB0A8C1_0x0049BBF0 | 52.2% | statement order SHC_3BB0A8C1_0x0049BCD0 | 0.0% | Pending From a4e42ce5c2955586a2b8a6a64f1de09830996aaf Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:49 +0200 Subject: [PATCH 355/516] reimplement: SHC_3BB0A8C1_0x004A0460 71.43% statement order --- .../findNearestEnemyBuildingWithinDistance.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp index bfc0ba07d6..63d122162d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyBuildingWithinDistance.cpp @@ -48,8 +48,8 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < iVar3 && (iVar3 < 0x13a10))) { @@ -68,11 +68,11 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[iVar4] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[iVar4] = (short)this->searchGeneration; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar4; this->searchQueue.yQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.yOffset + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar4; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; if (0x13a10 <= (int)this->searchQueue.writeIndex) { this->searchQueue.writeIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ec20de8aa2..59d689f9ea 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24733,7 +24733,7 @@ SHC_3BB0A8C1_0x004A01D0 | 56.7% | statement order SHC_3BB0A8C1_0x004A0300 | 0.0% | Pending -SHC_3BB0A8C1_0x004A0460 | 66.7% | Style pass, asm differs +SHC_3BB0A8C1_0x004A0460 | 71.4% | statement order SHC_3BB0A8C1_0x004A06B0 | 60.1% | Style pass, asm differs From 98eccd749cfd566056de08ebb1e9bb2e05542cef Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:50 +0200 Subject: [PATCH 356/516] reimplement: SHC_3BB0A8C1_0x004A06B0 61.88% statement order --- .../PathFindingState/findNearestEnemyUnitWithinDistance.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp index 85010a7b35..60ec156079 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNearestEnemyUnitWithinDistance.cpp @@ -46,8 +46,8 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < iVar3 && (iVar3 < 0x13a10))) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 59d689f9ea..154ca87c7f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24735,7 +24735,7 @@ SHC_3BB0A8C1_0x004A0300 | 0.0% | Pending SHC_3BB0A8C1_0x004A0460 | 71.4% | statement order -SHC_3BB0A8C1_0x004A06B0 | 60.1% | Style pass, asm differs +SHC_3BB0A8C1_0x004A06B0 | 61.9% | statement order SHC_3BB0A8C1_0x004A07C0 | 0.0% | Pending From bf918f72f65df4498a7f19388679f3b0979e3441 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:50 +0200 Subject: [PATCH 357/516] reimplement: SHC_3BB0A8C1_0x004A1D30 68.09% statement order --- .../Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp index 2a6f0cfbe6..ab8a025391 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -51,8 +51,8 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; + DAT_TileMapState::instance.WalkLayer[_startTile] = (short)this->searchGeneration; DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; - DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < iVar5 && (iVar5 < 0x13a10))) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 154ca87c7f..a871046989 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25171,7 +25171,7 @@ SHC_3BB0A8C1_0x004A1C40 | 98.7% | compare operand order SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1D30 | 65.7% | Style pass, asm differs +SHC_3BB0A8C1_0x004A1D30 | 68.1% | statement order SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending From 307b9bfa9eef1e32516678f27caf319e94140a64 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:51 +0200 Subject: [PATCH 358/516] reimplement: SHC_3BB0A8C1_0x004A08E0 86.21% statement order --- .../PathFindingState/getGatehouseNearSomethingUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/getGatehouseNearSomethingUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/getGatehouseNearSomethingUnk.cpp index f45137e2c9..28a6e5e2cd 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/getGatehouseNearSomethingUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/getGatehouseNearSomethingUnk.cpp @@ -49,8 +49,8 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < iVar4 && (iVar4 < 0x13a10))) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a871046989..fb6216b934 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24739,7 +24739,7 @@ SHC_3BB0A8C1_0x004A06B0 | 61.9% | statement order SHC_3BB0A8C1_0x004A07C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A08E0 | 84.5% | Style pass, asm differs +SHC_3BB0A8C1_0x004A08E0 | 86.2% | statement order SHC_3BB0A8C1_0x004A0B20 | 66.5% | statement order From 85e3911cda0e781d279a23bee4ba2d4fa955c532 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:51 +0200 Subject: [PATCH 359/516] reimplement: SHC_3BB0A8C1_0x004A36B0 82.48% statement order --- .../PathFindingState/healUnitsOfPlayerWithinRadius.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp index c1571bc3b5..9bad23fe2a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp @@ -38,9 +38,9 @@ namespace Map { } this->searchQueue.yQueue[0] = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[param_1]; + this->searchQueue.tilesQueue[0] = param_1; this->searchQueue.xQueue[0] = (short)param_1 - (short)DAT_ViewportRenderState::instance.translationMatrix[this->searchQueue.yQueue[0]].addXgetTile; - this->searchQueue.tilesQueue[0] = param_1; this->searchQueue.readIndex = 0; this->searchQueue.writeIndex = 1; this->searchQueue.currentDistance = 1; @@ -49,8 +49,8 @@ namespace Map { if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar4 <= 0x13a0f) { short sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; - short sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; + short sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; if (0x13a10 < (int)this->searchQueue.currentDistance) { return (undefined4)(0); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fb6216b934..f04465dff9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25209,7 +25209,7 @@ SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3220 | 73.8% | statement order -SHC_3BB0A8C1_0x004A36B0 | 80.1% | compare operand order +SHC_3BB0A8C1_0x004A36B0 | 82.5% | statement order SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending From 871d9c8cda8d19f4109886034107d8192038c916 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:52 +0200 Subject: [PATCH 360/516] reimplement: SHC_3BB0A8C1_0x004A2DD0 77.20% statement order --- .../PathFindingState/igniteFireAtTilesDistanceAway.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp index 812ece7170..9cd20757f0 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp @@ -30,8 +30,8 @@ namespace Map { uint _tile; uint _cTile; this->calculations = this->calculations + 1; - this->searchGeneration = this->searchGeneration + 1; _index = 0; + this->searchGeneration = this->searchGeneration + 1; if (32000 < this->searchGeneration) { this->searchGeneration = 1; MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( @@ -45,8 +45,8 @@ namespace Map { this->searchQueue.readIndex = 0; this->searchQueue.writeIndex = 1; this->searchQueue.currentDistance = 1; - DAT_TileMapState::instance.CertainPathLayer[tile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[tile] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile <= 0x13a0f) { int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f04465dff9..e3b1ac438d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25201,7 +25201,7 @@ SHC_3BB0A8C1_0x004A2DC4 | 0.0% | Pending SHC_3BB0A8C1_0x004A2DC8 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2DD0 | 75.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A2DD0 | 77.2% | statement order SHC_3BB0A8C1_0x004A2F00 | 0.0% | Pending From 9d58886daff12c29a63dddf96ca3d8893c3e3cab Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:52 +0200 Subject: [PATCH 361/516] reimplement: SHC_3BB0A8C1_0x004A9200 57.33% statement order --- .../Navigation/PathFindingState/isOpponentBuildingInRange.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index 127cc1c309..e5c6b8ab7e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -58,9 +58,9 @@ namespace Map { if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (( _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _tile && (_tile < 80400))) { + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; - this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; if (80400 < (int)this->searchQueue.currentDistance || (int)this->searchQueue.currentDistance > range) break; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e3b1ac438d..0bbad395ca 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25453,7 +25453,7 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 48.7% | split bounds guard +SHC_3BB0A8C1_0x004A9200 | 57.3% | statement order SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented From 289344f4088da975473a1b6102b30560df37483c Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:52 +0200 Subject: [PATCH 362/516] reimplement: SHC_3BB0A8C1_0x004A2650 65.29% statement order --- .../Navigation/PathFindingState/isSignPostWithinDistance.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp index a9b186e382..e7ba01800e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp @@ -61,8 +61,8 @@ namespace Map { this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < iVar3 && (iVar3 < 0x13a10))) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0bbad395ca..5c7b4befac 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25179,7 +25179,7 @@ SHC_3BB0A8C1_0x004A21B0 | 81.9% | Style pass, asm differs SHC_3BB0A8C1_0x004A22C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2650 | 64.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A2650 | 65.3% | statement order SHC_3BB0A8C1_0x004A2740 | 0.0% | Pending From f659823c6e57fd6edc107ac97cd86c17818cfa16 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:53 +0200 Subject: [PATCH 363/516] reimplement: SHC_3BB0A8C1_0x0049B1D0 87.30% statement order --- .../Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp index 34b1db3c27..a0e58f3564 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingDeerAndLionsUnk.cpp @@ -47,8 +47,8 @@ namespace Map { this->searchQueue.yQueue[0] = (short)destinationY; this->searchQueue.tilesQueue[0] = destinationX + DAT_ViewportRenderState::instance.translationMatrix[destinationY].addXgetTile; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((_currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _currentTile && (_currentTile < 80400))) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5c7b4befac..89e070df4d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24419,7 +24419,7 @@ SHC_3BB0A8C1_0x0049B000 | 0.0% | Pending SHC_3BB0A8C1_0x0049B1C0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x0049B1D0 | 86.8% | queue wrap off-by-one +SHC_3BB0A8C1_0x0049B1D0 | 87.3% | statement order SHC_3BB0A8C1_0x0049B2B0 | 0.0% | Pending From 841343a5960657fcd37063e369dcfd700a3b23f0 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:53 +0200 Subject: [PATCH 364/516] reimplement: SHC_3BB0A8C1_0x0049FC00 62.46% statement order --- .../Navigation/PathFindingState/pathFindingRelated.cpp | 8 ++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp index c493f8ff14..02848925ed 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -51,8 +51,8 @@ namespace Map { = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; int bVar1 = DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_4][this->searchQueue.tilesQueue[0]]; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (uVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar5 <= 0x13a0f) { short sVar2 = this->searchQueue.xQueue[this->searchQueue.readIndex]; @@ -104,16 +104,16 @@ namespace Map { local_18 = iVar8; local_14 = dVar6; } - DAT_TileMapState::instance.CertainPathLayer[dVar6] - = (short)this->searchQueue.currentDistance + 1; short sVar4 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar10] .short_.xOffset; + DAT_TileMapState::instance.CertainPathLayer[dVar6] + = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[dVar6] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar4 + sVar2; this->searchQueue.yQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar10] .short_.yOffset + sVar3; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar4 + sVar2; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = dVar6; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; if (0x13a10 <= (int)this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 89e070df4d..f88a8e1a24 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24719,7 +24719,7 @@ SHC_3BB0A8C1_0x0049F7D0 | 24.0% | statement order SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FC00 | 58.3% | Style pass, asm differs +SHC_3BB0A8C1_0x0049FC00 | 62.5% | statement order SHC_3BB0A8C1_0x0049FD10 | 0.0% | Pending From 4ea8f65717eefe100e866685e5e4ef9c1d17cca9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:54 +0200 Subject: [PATCH 365/516] reimplement: SHC_3BB0A8C1_0x004A4140 85.49% statement order --- .../PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp index 76f64a0d85..2f34b323bf 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp @@ -51,8 +51,8 @@ namespace Map { this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { int _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if ((_currentTile < 0) || (0x13a10 <= _currentTile)) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f88a8e1a24..7a9a19a7af 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25219,7 +25219,7 @@ SHC_3BB0A8C1_0x004A3B20 | 43.7% | statement order SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending -SHC_3BB0A8C1_0x004A4140 | 85.0% | Style pass, asm differs +SHC_3BB0A8C1_0x004A4140 | 85.5% | statement order SHC_3BB0A8C1_0x004A4470 | 49.5% | area read via local; compare v From 6e028e40121f98bdfaaa6bd136231a4fb0e53fcd Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:54 +0200 Subject: [PATCH 366/516] reimplement: SHC_3BB0A8C1_0x0049FF20 66.67% statement order --- .../Navigation/PathFindingState/pathfindingRelated49ff20.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp index 1b0259cff5..16c63f9be7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp @@ -48,8 +48,8 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; dVar4 = local_8; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { int iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; @@ -88,8 +88,8 @@ namespace Map { } if ((10 < (int)this->searchQueue.currentDistance) && (iVar1 = this->searchQueue.currentDistance + uVar6 * 2, iVar1 < local_4)) { - local_8 = dVar4; local_4 = iVar1; + local_8 = dVar4; } } DAT_TileMapState::instance.CertainPathLayer[dVar4] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7a9a19a7af..78396be809 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24725,7 +24725,7 @@ SHC_3BB0A8C1_0x0049FD10 | 0.0% | Pending SHC_3BB0A8C1_0x0049FD70 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FF20 | 65.3% | Style pass, asm differs +SHC_3BB0A8C1_0x0049FF20 | 66.7% | statement order SHC_3BB0A8C1_0x004A0050 | 0.0% | Pending From 2a073e43cc6473a536aa89baff3916097aeb9d6f Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:55 +0200 Subject: [PATCH 367/516] reimplement: SHC_3BB0A8C1_0x004A21B0 84.82% statement order --- .../placeCommemoratingStatueAtGoodLocation.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp index 5b1d638a1f..b26cd1ed09 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp @@ -60,14 +60,14 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.readIndex = 0; this->searchQueue.writeIndex = 1; + this->searchQueue.yQueue[0] = sVar2; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[uVar8].addXgetTile + uVar7; - this->searchQueue.yQueue[0] = sVar2; - this->searchQueue.xQueue[0] = sVar1; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + this->searchQueue.xQueue[0] = sVar1; commandBuildingType = (OpenSHC::Commands::MappersEnum)((int)SEC_RNG::instance.currentNumber2 % 5 + OpenSHC::Commands::M_MAPPER_STATUE1); + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; MACRO_CALL_MEMBER(OpenSHC::Random::RNG_Func::nextRandomNumber2, SEC_RNG::ptr)(); if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 78396be809..ac6fae077c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25175,7 +25175,7 @@ SHC_3BB0A8C1_0x004A1D30 | 68.1% | statement order SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending -SHC_3BB0A8C1_0x004A21B0 | 81.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A21B0 | 84.8% | statement order SHC_3BB0A8C1_0x004A22C0 | 0.0% | Pending From 8fea4ac55a031a119c6877fa93182e68ee325d06 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:55 +0200 Subject: [PATCH 368/516] reimplement: SHC_3BB0A8C1_0x004A4BB0 65.35% statement order --- .../Navigation/PathFindingState/recountUnitsUsingClimbData.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp index 8265e53e70..d0f49a0cca 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/recountUnitsUsingClimbData.cpp @@ -46,8 +46,8 @@ namespace Map { _climb->numberOfUnitsUsing = _climb->numberOfUnitsUsing + 1; } } - _counter = _counter + 1; _ptrUnitID = _ptrUnitID + 1; + _counter = _counter + 1; } while (_counter < 50); } return; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ac6fae077c..efdd60ec72 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25235,7 +25235,7 @@ SHC_3BB0A8C1_0x004A4B30 | 79.0% | Style pass, asm differs SHC_3BB0A8C1_0x004A4B80 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A4BB0 | 49.5% | inverted tests, climb base poi +SHC_3BB0A8C1_0x004A4BB0 | 65.3% | statement order SHC_3BB0A8C1_0x004A4C70 | 89.8% | Style pass, asm differs From 861e98673cac47e8da6801a865e585db4f2e199a Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:56 +0200 Subject: [PATCH 369/516] reimplement: SHC_3BB0A8C1_0x004A65E0 73.44% statement order --- .../setDestinationPairsBasedOnPreviousSearch.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp index 52c7bfad0a..45c87ffe9d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setDestinationPairsBasedOnPreviousSearch.cpp @@ -25,9 +25,9 @@ namespace Map { do { uint y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint x = _tile - DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile; uint _attackedDistance = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[attackedPlayerID][_tile]; - uint x = _tile - DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile; if (DAT_TileMapState::instance.WalkLayer[_tile] == this->searchGeneration && _attackedDistance != 0 && _attackedDistance - 4294967224 < 4 && DAT_TileMapState::instance.CertainPathLayer[_tile] < 0x4c diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index efdd60ec72..a587478650 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25277,7 +25277,7 @@ SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending SHC_3BB0A8C1_0x004A6520 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A65E0 | 70.3% | Style pass, asm differs +SHC_3BB0A8C1_0x004A65E0 | 73.4% | statement order SHC_3BB0A8C1_0x004A66D0 | 84.6% | Style pass, asm differs From a55dc8f420a534f27a11bf4adfe386281022006b Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:56 +0200 Subject: [PATCH 370/516] reimplement: SHC_3BB0A8C1_0x004A66D0 93.85% statement order --- .../Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp index 973b3f727e..d591dde4b6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp @@ -28,9 +28,9 @@ namespace Map { do { uint _y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; int _tileCandidate = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint _x = _tileCandidate - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; uint _cost = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[playerID][_tileCandidate]; - uint _x = _tileCandidate - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; if (_cost != 0 && maxCost <= (int)_cost && (int)_cost <= maxCost + 10 && DAT_TileMapState::instance.CertainPathLayer[_tileCandidate] != 100) { MACRO_CALL_MEMBER( diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a587478650..0a391b62d7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25279,7 +25279,7 @@ SHC_3BB0A8C1_0x004A6520 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A65E0 | 73.4% | statement order -SHC_3BB0A8C1_0x004A66D0 | 84.6% | Style pass, asm differs +SHC_3BB0A8C1_0x004A66D0 | 93.8% | statement order SHC_3BB0A8C1_0x004A67D0 | 73.1% | compare against 0 not 1 From 23c1e8c5b0fc6843ab2e4ae7433009ef8937cce6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:56 +0200 Subject: [PATCH 371/516] reimplement: SHC_3BB0A8C1_0x004A2A90 65.21% statement order --- .../spreadAlgorithmForFlagsAndBraziersUnk.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp index deda8d7780..30fbe87547 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp @@ -69,11 +69,11 @@ namespace Map { this->searchQueue.writeIndex = 1; this->searchQueue.currentDistance = 1; this->searchQueue.yQueue[0] = (short)uVar3; - this->searchQueue.xQueue[0] = (short)x; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[uVar3].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; + this->searchQueue.xQueue[0] = (short)x; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ( (tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < tile && (tile < 0x13a10))) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0a391b62d7..f5f2e2747c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25185,7 +25185,7 @@ SHC_3BB0A8C1_0x004A2740 | 0.0% | Pending SHC_3BB0A8C1_0x004A27D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2A90 | 60.8% | split bounds guard +SHC_3BB0A8C1_0x004A2A90 | 65.2% | statement order SHC_3BB0A8C1_0x004A2B70 | 0.0% | Pending From 130ccb9b6c3d9982fb4e461c61c28bfc3d519555 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:57 +0200 Subject: [PATCH 372/516] reimplement: SHC_3BB0A8C1_0x0049E9E0 69.95% statement order --- .../PathFindingState/updateAIZoneWithFloodFill0x20.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp index acafb75b35..9c66da31e4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateAIZoneWithFloodFill0x20.cpp @@ -38,8 +38,8 @@ namespace Map { this->searchQueue.yQueue[0] = (short)y; this->searchQueue.xQueue[0] = (short)x; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; + DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f5f2e2747c..15d4a9be16 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24701,7 +24701,7 @@ SHC_3BB0A8C1_0x0049E0D0 | 87.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049E510 | 91.7% | Style pass, asm differs -SHC_3BB0A8C1_0x0049E9E0 | 69.4% | Style pass, asm differs +SHC_3BB0A8C1_0x0049E9E0 | 70.0% | statement order SHC_3BB0A8C1_0x0049EB00 | 0.0% | Pending From b452f8401de490c130c7298452d91af120ccb098 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:57 +0200 Subject: [PATCH 373/516] reimplement: SHC_3BB0A8C1_0x00499DC0 46.09% statement order --- .../updatePathLinkageLayerAtTileForSomeLogicalReason.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp index 4438ef2092..d582dc2f30 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp @@ -87,8 +87,8 @@ namespace Map { } } _ptrY = _ptrY + 4; - uVar5 = uVar5 + 4; tile = tile + -1; + uVar5 = uVar5 + 4; } while (tile != 0); return; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 15d4a9be16..4169b7e733 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24391,7 +24391,7 @@ SHC_3BB0A8C1_0x00499970 | 0.0% | Pending SHC_3BB0A8C1_0x004999C0 | 51.0% | counted for loop -SHC_3BB0A8C1_0x00499DC0 | 42.9% | Style pass, asm differs +SHC_3BB0A8C1_0x00499DC0 | 46.1% | statement order SHC_3BB0A8C1_0x00499FA0 | 35.3% | orig branch order + stmt order From 17ec76cfc03f1df149fd46796d752c6ae1338ff7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:58 +0200 Subject: [PATCH 374/516] reimplement: SHC_3BB0A8C1_0x0049A1C0 54.05% statement order --- .../PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp index 2ae7acd71e..44b243e47b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp @@ -65,8 +65,8 @@ namespace Map { | 1; return; } - iVar3 = (short)DAT_BuildingsState::instance.buildings[buildingID].x + -1 + uVar2; iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + (int)uVar2 / 2; + iVar3 = (short)DAT_BuildingsState::instance.buildings[buildingID].x + -1 + uVar2; } iVar3 = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3; DAT_TileMapState::instance.PathLinkageLayer[iVar3] = DAT_TileMapState::instance.PathLinkageLayer[iVar3] | 4; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4169b7e733..65b375bb47 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24395,7 +24395,7 @@ SHC_3BB0A8C1_0x00499DC0 | 46.1% | statement order SHC_3BB0A8C1_0x00499FA0 | 35.3% | orig branch order + stmt order -SHC_3BB0A8C1_0x0049A1C0 | 52.8% | shifted row index variable +SHC_3BB0A8C1_0x0049A1C0 | 54.0% | statement order SHC_3BB0A8C1_0x0049A2E0 | 96.3% | index locals + statement order From a84a8da3b44cd34c61a94eb7183db6d9dc0cc6e4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:08:58 +0200 Subject: [PATCH 375/516] reimplement: SHC_3BB0A8C1_0x0049AAD0 87.09% statement order --- .../Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp index ae77d19c65..d7419acb3b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateWalkAndPathLayer.cpp @@ -77,8 +77,8 @@ namespace Map { this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar3]; if ((int)this->searchQueue.currentDistance > param_1) break; - piVar7 = DAT_TileMapState::instance.directionTranslationMatrix[iVar8] + 1; DAT_TileMapState::instance.ChangedLayer[uVar3] = 2; + piVar7 = DAT_TileMapState::instance.directionTranslationMatrix[iVar8] + 1; psVar6 = &DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[0].short_.yOffset; do { iVar8 = (*(int (*)[8])(piVar7 + -1))[0] + uVar3; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 65b375bb47..f318f68d4a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24409,7 +24409,7 @@ SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending -SHC_3BB0A8C1_0x0049AAD0 | 86.7% | Style pass, asm differs +SHC_3BB0A8C1_0x0049AAD0 | 87.1% | statement order SHC_3BB0A8C1_0x0049AC80 | 0.0% | Pending From 6004ae204a93a1fa70cfb2945d4073f0c7712bb1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:22:40 +0200 Subject: [PATCH 376/516] reimplement: SHC_3BB0A8C1_0x004A7F50 57.56% compare operand order --- ...aceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 61771f5c79..7ad7a02dba 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -174,7 +174,7 @@ namespace Map { area[-1] = _tile2; _dIndex = _dIndex + 1; area = area + 3; - if (maxDestinations <= _dIndex) { + if (_dIndex >= maxDestinations) { return; } this->searchQueue.tilesQueue[this->searchQueue.readIndex] = -1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f318f68d4a..4a0549fbbb 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25303,7 +25303,7 @@ SHC_3BB0A8C1_0x004A75B0 | 47.0% | compare operand order SHC_3BB0A8C1_0x004A79A0 | 63.8% | statement order -SHC_3BB0A8C1_0x004A7F50 | 57.1% | statement order +SHC_3BB0A8C1_0x004A7F50 | 57.6% | compare operand order SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending From 387c4e60202a6f97c02ae2c5c421776303db9c35 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:22:40 +0200 Subject: [PATCH 377/516] reimplement: SHC_3BB0A8C1_0x004A66D0 96.92% compare operand order --- .../Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp index d591dde4b6..525749dc9e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setMoveDestinationPairs.cpp @@ -31,7 +31,7 @@ namespace Map { uint _x = _tileCandidate - DAT_ViewportRenderState::instance.translationMatrix[_y].addXgetTile; uint _cost = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[playerID][_tileCandidate]; - if (_cost != 0 && maxCost <= (int)_cost && (int)_cost <= maxCost + 10 + if (_cost != 0 && (int)_cost >= maxCost && (int)_cost <= maxCost + 10 && DAT_TileMapState::instance.CertainPathLayer[_tileCandidate] != 100) { MACRO_CALL_MEMBER( OpenSHC::Map::Navigation::PathFindingState_Func::budgetFloodFillOnCertainPathLayer, this)( diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4a0549fbbb..803e63bb2b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25279,7 +25279,7 @@ SHC_3BB0A8C1_0x004A6520 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A65E0 | 73.4% | statement order -SHC_3BB0A8C1_0x004A66D0 | 93.8% | statement order +SHC_3BB0A8C1_0x004A66D0 | 96.9% | compare operand order SHC_3BB0A8C1_0x004A67D0 | 73.1% | compare against 0 not 1 From c4d5dbeca144edcd87dca54969304e7baba5c4e1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:35:08 +0200 Subject: [PATCH 378/516] reimplement: SHC_3BB0A8C1_0x004A5DA0 86.49% compare operand order --- .../PathFindingState/findBestAdjacentClimbTileToTarget.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp index 0bc8bb4f50..1e4c3fef0c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAdjacentClimbTileToTarget.cpp @@ -78,7 +78,7 @@ namespace Map { DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[iVar6]); uVar4 = uVar4 + iVar2; } - if ((int)local_18 <= (int)(uVar4 + 0x10) && (int)(uVar4 - 0x10) <= (int)local_18 + if ((int)local_18 <= (int)(uVar4 + 0x10) && (int)local_18 >= (int)(uVar4 - 0x10) && (MACRO_CALL_MEMBER( OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, DAT_DirectionAlgorithmState::ptr)(param_2, (int)(param_3), diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 803e63bb2b..161545281a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25265,7 +25265,7 @@ SHC_3BB0A8C1_0x004A5A30 | 0.0% | Pending SHC_3BB0A8C1_0x004A5B00 | 57.4% | Style pass, asm differs -SHC_3BB0A8C1_0x004A5DA0 | 84.9% | statement order +SHC_3BB0A8C1_0x004A5DA0 | 86.5% | compare operand order SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented From fb1546c50197c6264a949ef26c8fd1321e78817d Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:35:08 +0200 Subject: [PATCH 379/516] reimplement: SHC_3BB0A8C1_0x004A6010 40.75% compare operand order --- .../findBestAttackTargetTileWithHeightAndOwner.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp index 5d84e48f3e..bc0cdd028f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -163,10 +163,10 @@ namespace Map { } else if ((DAT_TileMapState::instance.WallOwnerLayer[iVar7] & 7) + 1 == param_7) { uVar8 = (uint)DAT_TileMapState::instance.HeightLayer[iVar7]; LAB_004a63f4: - if ((int)((param_5 * 2) / 3 + uVar10) < (int)uVar8) { + if ((int)uVar8 > (int)((param_5 * 2) / 3 + uVar10)) { sVar5 = 3; } else { - sVar5 = ((int)(param_5 / 3 + uVar10) < (int)uVar8) + 1; + sVar5 = ((int)uVar8 > (int)(param_5 / 3 + uVar10)) + 1; } short sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar9] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 161545281a..398cf2d14f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25271,7 +25271,7 @@ SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A5F90 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6010 | 39.4% | statement order +SHC_3BB0A8C1_0x004A6010 | 40.8% | compare operand order SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending From 1bde10ac984fdef00d153102f5cc1644a4b752b7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 03:35:09 +0200 Subject: [PATCH 380/516] reimplement: SHC_3BB0A8C1_0x00498020 61.26% fix height window bug --- .../findPathUsingClimbingWithHeightMargin16.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp index 695fd0e38d..7a00107df3 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -143,8 +143,7 @@ namespace Map { /* test if height difference is within margin */ - if ((int)_tHeight <= (int)(_cHeight + 16) - && (int)(_cHeight - 4294967280) <= (int)_tHeight) + if ((int)_tHeight <= (int)(_cHeight + 16) && (int)_tHeight >= (int)(_cHeight - 16)) goto LAB_00498308; _cType = DAT_BuildingsState::instance .buildings[DAT_TileMapState::instance.BuildingLayer[_candidate]] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 398cf2d14f..90a6de9b5c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24369,7 +24369,7 @@ SHC_3BB0A8C1_0x00497740 | 50.5% | statement order SHC_3BB0A8C1_0x00497B80 | 52.6% | statement order -SHC_3BB0A8C1_0x00498020 | 60.1% | statement order +SHC_3BB0A8C1_0x00498020 | 61.3% | fix height window bug SHC_3BB0A8C1_0x00498170 | 0.0% | Pending From 13b1754198144e117afa5ac4a4c45e52449ac87b Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 04:04:32 +0200 Subject: [PATCH 381/516] reimplement: SHC_3BB0A8C1_0x00498A40 82.17% fix off-by-one maxTries --- .../calculatePathKeepAndWallsGatesNotAllowed.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp index e98ec7892b..3061fde2d9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -62,7 +62,7 @@ namespace Map { if (_tile == uVar4) { return (undefined4)(1); } - if ((this->searchQueue.readIndex >= maxTries) || (80400 <= _tile)) + if ((this->searchQueue.readIndex > maxTries) || (80400 <= _tile)) break; int sVar1 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 90a6de9b5c..741a0e0105 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24377,7 +24377,7 @@ SHC_3BB0A8C1_0x00498400 | 44.3% | widen locals to int SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00498A40 | 82.2% | statement order +SHC_3BB0A8C1_0x00498A40 | 82.2% | fix off-by-one maxTries SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending From 3c0bb151c56704dedeb60fae55e4319ac7980bb4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 04:04:32 +0200 Subject: [PATCH 382/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 31.06% widen local to int --- .../PathFindingState/findAppropriateLocationForSiegeTent.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index 3ff7461b0b..7c495fdd84 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -111,7 +111,7 @@ namespace Map { /* Get Y coordinate of current tile being processed */ - short sVar1 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + int sVar1 = this->searchQueue.yQueue[this->searchQueue.readIndex]; /* Get distance from start for current tile */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 741a0e0105..39882e1baa 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24715,7 +24715,7 @@ SHC_3BB0A8C1_0x0049F2D0 | 85.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 85.6% | reuse computed start tile -SHC_3BB0A8C1_0x0049F7D0 | 24.0% | statement order +SHC_3BB0A8C1_0x0049F7D0 | 31.1% | widen local to int SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending From 8ccab87b77301d886473b870fb7fcd23b32beb1f Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 04:04:32 +0200 Subject: [PATCH 383/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 62.33% match bound literal --- .../PathFindingState/findCrossAreaBridgeTileToTarget.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index af61316758..e4c10278ff 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -53,9 +53,9 @@ namespace Map { this->searchQueue.writeIndex = 1; this->searchQueue.readIndex = 0; this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[param_1].x; - ushort uVar1 + int uVar1 = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[param_1].tile]; - ushort uVar2 + int uVar2 = DAT_TileMapState::instance .PathConnectionLayer[DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2]; @@ -67,7 +67,7 @@ namespace Map { if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { uint uVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if (0x13a10 <= uVar5) + if (0x13a0f < uVar5) break; int sVar3 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar4 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 39882e1baa..b073902dca 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25287,7 +25287,7 @@ SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending SHC_3BB0A8C1_0x004A69F0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6AB0 | 62.3% | statement order +SHC_3BB0A8C1_0x004A6AB0 | 62.3% | match bound literal SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending From 26e3926159e87b4322a05fe3a91c292d1376d6ea Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 10:16:21 +0200 Subject: [PATCH 384/516] reimplement: SHC_3BB0A8C1_0x00498400 49.76% uniform unrolled bodies with d --- .../pathFindingWithBuildingsIncluded.cpp | 222 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 117 insertions(+), 107 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index 7ed59f37dd..cba316a5a2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -129,122 +129,132 @@ namespace Map { _logical = DAT_TileMapState::instance.LogicLayer[_currentTile]; for (int _direction = 0; _direction < 8; _direction = _direction + 4) { _nextTileOption - = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] - + _currentTile; - /* - 0x4a5014b1 == check against walkable tiles including keep, walls, and gatehouses - */ + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] + + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration - && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) - != 0 - || (((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], - (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) - && (DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0)) - && ((uVar3 = _logical & 0x100, uVar3 == 0 || ((uVar1 & 0x100) == 0)))) - && ((uVar3 != 0 || ((uVar1 & 0x100) != 0))))))) { - DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] - .short_.xOffset - + _currentX; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] - .short_.yOffset - + _currentY; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) + != 0 + || (((_direction) & 1) == 0 + && (uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], + (uVar1 & 0x4a5014b1) == 0) + && _buildingID == 0 + && DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0 + && (uVar3 = _logical & 0x100, uVar3 == 0 || (uVar1 & 0x100) == 0) + && (uVar3 != 0 || (uVar1 & 0x100) != 0)))) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] + = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } _nextTileOption - = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 1] - + _currentTile; + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 1] + + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance - .BitFlagHelperForPathLinkage[_direction + 1]) - != 0) { - DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 1] - .short_.xOffset - + _currentX; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 1] - .short_.yOffset - + _currentY; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 1]) + != 0 + || (((_direction + 1) & 1) == 0 + && (uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], + (uVar1 & 0x4a5014b1) == 0) + && _buildingID == 0 + && DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0 + && (uVar3 = _logical & 0x100, uVar3 == 0 || (uVar1 & 0x100) == 0) + && (uVar3 != 0 || (uVar1 & 0x100) != 0)))) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] + = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } _nextTileOption - = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 2] - + _currentTile; + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 2] + + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration - && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance - .BitFlagHelperForPathLinkage[_direction + 2]) - != 0 - || ((((uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], - (uVar1 & 0x4a5014b1) == 0 && (_buildingID == 0)) - && (DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0)) - && (((uVar3 = _logical & 0x100, uVar3 == 0 || ((uVar1 & 0x100) == 0)) - && ((uVar3 != 0 || ((uVar1 & 0x100) != 0))))))))) { - DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 2] - .short_.xOffset - + _currentX; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 2] - .short_.yOffset - + _currentY; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 2]) + != 0 + || (((_direction + 2) & 1) == 0 + && (uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], + (uVar1 & 0x4a5014b1) == 0) + && _buildingID == 0 + && DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0 + && (uVar3 = _logical & 0x100, uVar3 == 0 || (uVar1 & 0x100) == 0) + && (uVar3 != 0 || (uVar1 & 0x100) != 0)))) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] + = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } _nextTileOption - = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 3] - + _currentTile; + = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction + 3] + + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance - .BitFlagHelperForPathLinkage[_direction + 3]) - != 0) { - DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 3] - .short_.xOffset - + _currentX; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance - .clockwiseCardinalTranslationMatrix[_direction + 3] - .short_.yOffset - + _currentY; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 3]) + != 0 + || (((_direction + 3) & 1) == 0 + && (uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], + (uVar1 & 0x4a5014b1) == 0) + && _buildingID == 0 + && DAT_TileMapState::instance.BuildingLayer[_nextTileOption] == 0 + && (uVar3 = _logical & 0x100, uVar3 == 0 || (uVar1 & 0x100) == 0) + && (uVar3 != 0 || (uVar1 & 0x100) != 0)))) { + DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] + = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.xOffset + + _currentX; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + .short_.yOffset + + _currentY; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b073902dca..cc7dff5c5a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24373,7 +24373,7 @@ SHC_3BB0A8C1_0x00498020 | 61.3% | fix height window bug SHC_3BB0A8C1_0x00498170 | 0.0% | Pending -SHC_3BB0A8C1_0x00498400 | 44.3% | widen locals to int +SHC_3BB0A8C1_0x00498400 | 49.8% | uniform unrolled bodies with d SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending From 3879332b819c1b0c10faac774285d10286c4a6e6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 10:25:26 +0200 Subject: [PATCH 385/516] reimplement: SHC_3BB0A8C1_0x00499DC0 67.13% signed modulo and signed byte --- ...hLinkageLayerAtTileForSomeLogicalReason.cpp | 18 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp index d582dc2f30..4045c9563f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerAtTileForSomeLogicalReason.cpp @@ -18,24 +18,24 @@ namespace Map { { int* _ptrY; int iVar3; - uint uVar4; - uint uVar5; + int uVar4; + int uVar5; int iVar2 = tile; uVar5 = 4; - int bVar1 = DAT_TileMapState::instance.PathLinkageLayer[tile]; + int bVar1 = (char)DAT_TileMapState::instance.PathLinkageLayer[tile]; _ptrY = DAT_TileMapState::instance.directionTranslationMatrix[y] + 1; tile = 2; do { iVar3 = (*(int (*)[8])(_ptrY + -1))[0] + iVar2; if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30U) == 0 && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) == 0) { - if ((bVar1 & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 4]) == 0) { - uVar4 = (int)uVar5 % 8; + if ((bVar1 & (char)DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 4]) == 0) { + uVar4 = uVar5 % 8; DAT_TileMapState::instance.PathLinkageLayer[iVar3] = DAT_TileMapState::instance.PathLinkageLayer[iVar3] & ~DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; } else { - uVar4 = (int)uVar5 % 8; + uVar4 = uVar5 % 8; DAT_TileMapState::instance.PathLinkageLayer[iVar3] = DAT_TileMapState::instance.PathLinkageLayer[iVar3] | DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar4]; @@ -44,7 +44,7 @@ namespace Map { iVar3 = *_ptrY + iVar2; if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30U) == 0 && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) == 0) { - if ((bVar1 & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 3]) == 0) { + if ((bVar1 & (char)DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 3]) == 0) { uVar4 = (uVar5 + 1) % 8; DAT_TileMapState::instance.PathLinkageLayer[iVar3] = DAT_TileMapState::instance.PathLinkageLayer[iVar3] @@ -59,7 +59,7 @@ namespace Map { iVar3 = _ptrY[1] + iVar2; if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30U) == 0 && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) == 0) { - if ((bVar1 & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 2]) == 0) { + if ((bVar1 & (char)DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 2]) == 0) { uVar4 = (uVar5 + 2) % 8; DAT_TileMapState::instance.PathLinkageLayer[iVar3] = DAT_TileMapState::instance.PathLinkageLayer[iVar3] @@ -74,7 +74,7 @@ namespace Map { iVar3 = _ptrY[2] + iVar2; if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x30U) == 0 && (DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) == 0) { - if ((bVar1 & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 1]) == 0) { + if ((bVar1 & (char)DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[uVar5 - 1]) == 0) { uVar4 = (uVar5 + 3) % 8; DAT_TileMapState::instance.PathLinkageLayer[iVar3] = DAT_TileMapState::instance.PathLinkageLayer[iVar3] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index cc7dff5c5a..d8ff3314e2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24391,7 +24391,7 @@ SHC_3BB0A8C1_0x00499970 | 0.0% | Pending SHC_3BB0A8C1_0x004999C0 | 51.0% | counted for loop -SHC_3BB0A8C1_0x00499DC0 | 46.1% | statement order +SHC_3BB0A8C1_0x00499DC0 | 67.1% | signed modulo and signed byte SHC_3BB0A8C1_0x00499FA0 | 35.3% | orig branch order + stmt order From fdb4d7967d01cf90663a22ac3bd7c9898d6c1166 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 11:03:31 +0200 Subject: [PATCH 386/516] reimplement: SHC_3BB0A8C1_0x00496EC0 66.04% hoist signed start-tile reads --- .../findClosestTileToStartingTile.cpp | 15 +++++++-------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestTileToStartingTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestTileToStartingTile.cpp index dc3e1666d2..2fecdbcf5a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestTileToStartingTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestTileToStartingTile.cpp @@ -22,24 +22,23 @@ namespace Map { int _d; int _closest; int _tile; + int _startWalk = (short)DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]]; + int _startDistance + = (short)DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]]; _closest = 4000; _match = 0; _pResultTile = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; do { _tile = *_pResultTile; - _d = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if (0 < _d - && (_d - DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]]) % param_1 - == 0 - && _d < _closest) { + _d = (short)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0 < _d && (_d - _startDistance) % param_1 == 0 && _d < _closest) { _match = DAT_TribesState::instance.ALG_ResultTileIndex; _closest = _d; } DAT_TribesState::instance.ALG_ResultTileIndex = DAT_TribesState::instance.ALG_ResultTileIndex + 1; _pResultTile = _pResultTile + 1; - } while ((DAT_TribesState::instance.ALG_ResultTileIndex < 4000) - && (DAT_TileMapState::instance.WalkLayer[_tile] - == DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]])); + } while ((int)DAT_TribesState::instance.ALG_ResultTileIndex < 4000 + && (short)DAT_TileMapState::instance.WalkLayer[_tile] == _startWalk); _tile = this->searchQueue.tilesQueue[_match]; DAT_TribesState::instance.ALG_ResultY = (int)this->searchQueue.yQueue[_match]; DAT_TribesState::instance.ALG_ResultTileIndex = _match; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d8ff3314e2..c1c617f418 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24351,7 +24351,7 @@ SHC_3BB0A8C1_0x00496E40 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00496EA0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x00496EC0 | 47.5% | Style pass, asm differs +SHC_3BB0A8C1_0x00496EC0 | 66.0% | hoist signed start-tile reads SHC_3BB0A8C1_0x00496F90 | 51.6% | abs() instead of shift idiom From e9bd661ba6bd3b00dac5d68780ee29cdafab1d43 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 11:03:31 +0200 Subject: [PATCH 387/516] reimplement: SHC_3BB0A8C1_0x00497180 78.26% hoist signed start-tile reads --- ...yModuloAmongPreviousSearchNotOnDefensiveStructure.cpp | 9 ++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp index 4edf39f30f..a22c34775f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp @@ -23,6 +23,7 @@ namespace Map { int iVar1; dword _result; int _tile; + int _startWalk = (short)DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]]; _pTile = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; iVar1 = DAT_TribesState::instance.ALG_ResultTileIndex; while (true) { @@ -31,7 +32,7 @@ namespace Map { manhatten distance */ if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x10000100U) == 0 - && 0 < DAT_TileMapState::instance.CertainPathLayer[_tile] + && 0 < (short)DAT_TileMapState::instance.CertainPathLayer[_tile] && (_xDistance = (_tile - DAT_ViewportRenderState::instance .translationMatrix[DAT_ViewportRenderState::instance @@ -41,13 +42,11 @@ namespace Map { _yDistance = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile] - y, (abs(_yDistance) + abs(_xDistance)) % modulo == 0) - && DAT_TileMapState::instance.CertainPathLayer[_tile] < 4000) + && (short)DAT_TileMapState::instance.CertainPathLayer[_tile] < 4000) break; iVar1 = iVar1 + 1; _pTile = _pTile + 1; - if ((4000 < iVar1) - || (DAT_TileMapState::instance.WalkLayer[_tile] - != DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]])) { + if (4000 < iVar1 || (short)DAT_TileMapState::instance.WalkLayer[_tile] != _startWalk) { return (dword)(0); } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c1c617f418..d341fbe0a1 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24357,7 +24357,7 @@ SHC_3BB0A8C1_0x00496F90 | 51.6% | abs() instead of shift idiom SHC_3BB0A8C1_0x00497080 | 41.4% | abs() instead of shift idiom -SHC_3BB0A8C1_0x00497180 | 52.2% | abs() instead of shift idiom +SHC_3BB0A8C1_0x00497180 | 78.3% | hoist signed start-tile reads SHC_3BB0A8C1_0x00497280 | 48.9% | Style pass, asm differs From c58b21276850b2f63133481ddfcd4f2b519299dc Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 11:28:13 +0200 Subject: [PATCH 388/516] reimplement: SHC_3BB0A8C1_0x00497080 78.08% hoist signed start-tile read --- .../PathFindingState/pathFindingResultBased.cpp | 8 ++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp index 0b63197460..0c3a244a89 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingResultBased.cpp @@ -21,12 +21,13 @@ namespace Map { int _index; int _distance; int _tile; + int _startWalk = (short)DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]]; _tilesPointer = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; _index = DAT_TribesState::instance.ALG_ResultTileIndex; do { _tile = *_tilesPointer; - _distance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x10000100U) != 0 && 0 < _distance) { + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x10000100U) != 0 + && (_distance = (short)DAT_TileMapState::instance.CertainPathLayer[_tile], 0 < _distance)) { if (extraDistance + 0xc < _distance) { return (dword)(0); } @@ -52,8 +53,7 @@ namespace Map { if (4000 < _index) { return (dword)(0); } - } while (DAT_TileMapState::instance.WalkLayer[_tile] - == DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]]); + } while ((short)DAT_TileMapState::instance.WalkLayer[_tile] == _startWalk); return (dword)(0); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d341fbe0a1..544079a5d2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24355,7 +24355,7 @@ SHC_3BB0A8C1_0x00496EC0 | 66.0% | hoist signed start-tile reads SHC_3BB0A8C1_0x00496F90 | 51.6% | abs() instead of shift idiom -SHC_3BB0A8C1_0x00497080 | 41.4% | abs() instead of shift idiom +SHC_3BB0A8C1_0x00497080 | 78.1% | hoist signed start-tile read SHC_3BB0A8C1_0x00497180 | 78.3% | hoist signed start-tile reads From 66205d74f0b049f9bff6b3e2ac8d17733c3e7b71 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 11:36:14 +0200 Subject: [PATCH 389/516] reimplement: SHC_3BB0A8C1_0x004A3B20 44.41% per-arm SFX call and health st --- .../certainDamageToUnitsUnk.cpp | 27 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index 667feea93e..43314f7fa0 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -40,11 +40,9 @@ namespace Map { undefined4 PathFindingState::certainDamageToUnitsUnk( int param_1, int param_2, int param_3, int param_4, undefined4 param_5) { - short sVar5; short sVar6; int iVar9; int iVar11; - eSFX sfxOffsetInArray; EntityType local_8; int local_4; this->searchGeneration = this->searchGeneration + 1; @@ -99,21 +97,21 @@ namespace Map { DAT_UnitsState::instance.units[iVar9].health = 0; DAT_UnitsState::instance.units[iVar9].dying = 1; DAT_UnitsState::instance.units[iVar9].animationCycleNumber = 0; - if ((char)param_5 == '\0') { - sVar6 = DAT_UnitsState::instance.units[iVar9].y; - sVar5 = DAT_UnitsState::instance.units[iVar9].x; - sfxOffsetInArray = OpenSHC::DE::SHCDE::FX_SPLAT; + if ((char)param_5 != '\0') { DAT_UnitsState::instance.units[iVar9].state.generic - = OpenSHC::Map::Units::States::US_STONE_DEATH_01; + = OpenSHC::Map::Units::States::US_DEATH_01; + MACRO_CALL_MEMBER(OpenSHC::Audio::SFX::SFXState_Func::playSFXAtLocation, + DAT_SFXState::ptr)((short)DAT_UnitsState::instance.units[iVar9].x, + (short)DAT_UnitsState::instance.units[iVar9].y, + OpenSHC::DE::SHCDE::FX_DEATH_ARROW); } else { - sVar6 = DAT_UnitsState::instance.units[iVar9].y; - sVar5 = DAT_UnitsState::instance.units[iVar9].x; - sfxOffsetInArray = OpenSHC::DE::SHCDE::FX_DEATH_ARROW; DAT_UnitsState::instance.units[iVar9].state.generic - = OpenSHC::Map::Units::States::US_DEATH_01; + = OpenSHC::Map::Units::States::US_STONE_DEATH_01; + MACRO_CALL_MEMBER(OpenSHC::Audio::SFX::SFXState_Func::playSFXAtLocation, + DAT_SFXState::ptr)((short)DAT_UnitsState::instance.units[iVar9].x, + (short)DAT_UnitsState::instance.units[iVar9].y, + OpenSHC::DE::SHCDE::FX_SPLAT); } - MACRO_CALL_MEMBER(OpenSHC::Audio::SFX::SFXState_Func::playSFXAtLocation, - DAT_SFXState::ptr)((int)sVar5, (int)(sVar6), sfxOffsetInArray); DAT_UnitsState::instance.units[iVar9].tunnelerFinishedDigging = 1; } iVar11 = DAT_UnitsState::instance.units[iVar9].maxHealth; @@ -122,9 +120,8 @@ namespace Map { } else { sVar6 = (short)((DAT_UnitsState::instance.units[iVar9].health * 100) / iVar11); } - DAT_UnitsState::instance.units[iVar9].healthbar - = sVar6 / 10; DAT_UnitsState::instance.units[iVar9].healthPercentage = sVar6; + DAT_UnitsState::instance.units[iVar9].healthbar = sVar6 / 10; } uVar4 = DAT_UnitsState::instance.units[iVar9].nextUnitOnTheSameTile; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 544079a5d2..33f4c2a592 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 43.7% | statement order +SHC_3BB0A8C1_0x004A3B20 | 44.4% | per-arm SFX call and health st SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From e29edbdc1c02dd27508884344474cf367f05de2c Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 11:50:03 +0200 Subject: [PATCH 390/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 62.87% signed area read --- .../PathFindingState/findCrossAreaBridgeTileToTarget.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index e4c10278ff..138786002e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -56,7 +56,7 @@ namespace Map { int uVar1 = (short)DAT_TileMapState::instance.PathConnectionLayer[DAT_UnitsState::instance.units[param_1].tile]; int uVar2 - = DAT_TileMapState::instance + = (short)DAT_TileMapState::instance .PathConnectionLayer[DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2]; this->searchQueue.yQueue[0] = DAT_UnitsState::instance.units[param_1].y; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 33f4c2a592..a6ee9b7d50 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25287,7 +25287,7 @@ SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending SHC_3BB0A8C1_0x004A69F0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6AB0 | 62.3% | match bound literal +SHC_3BB0A8C1_0x004A6AB0 | 62.9% | signed area read SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending From 449c23318629a65535fb1ebc29df2a55b0b535be Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:57:57 +0200 Subject: [PATCH 391/516] reimplement: SHC_3BB0A8C1_0x0049F540 86.55% Style pass, asm differs --- .../Navigation/PathFindingState/algFindAttackAngle.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp index 2b09173b52..501a876da3 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp @@ -50,8 +50,14 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((_tileOption = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < _tileOption && (_tileOption < 80400))) { + while (true) { + _tileOption = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tileOption < 0) { + break; + } + if (80400 <= _tileOption) { + break; + } int _xOption = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int _yOption = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tileOption]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a6ee9b7d50..c8ebfe86ec 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24713,7 +24713,7 @@ SHC_3BB0A8C1_0x0049F040 | 85.6% | Style pass, asm differs SHC_3BB0A8C1_0x0049F2D0 | 85.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F540 | 85.6% | reuse computed start tile +SHC_3BB0A8C1_0x0049F540 | 86.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049F7D0 | 31.1% | widen local to int From d2844f7ae61e4a62e5de6168ca9c9d09befb3cff Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:57:58 +0200 Subject: [PATCH 392/516] reimplement: SHC_3BB0A8C1_0x0049EDF0 67.21% Style pass, asm differs --- .../PathFindingState/findAIZoneWithFlags.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp index 01825839bd..cbb4ae73c3 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp @@ -49,8 +49,14 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < _tile && (_tile < 0x13a10))) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile < 0) { + break; + } + if (0x13a10 <= _tile) { + break; + } int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c8ebfe86ec..1774f45de4 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24705,7 +24705,7 @@ SHC_3BB0A8C1_0x0049E9E0 | 70.0% | statement order SHC_3BB0A8C1_0x0049EB00 | 0.0% | Pending -SHC_3BB0A8C1_0x0049EDF0 | 64.3% | Style pass, asm differs +SHC_3BB0A8C1_0x0049EDF0 | 67.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending From f1007e96276f31f6fbb7573002dfcfccc1ac05f1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:57:58 +0200 Subject: [PATCH 393/516] reimplement: SHC_3BB0A8C1_0x004A3220 76.55% Style pass, asm differs --- .../findAccessibleWallAndNearbyFreeTile.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp index fd97c20f8f..73a5f4a3f4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp @@ -47,8 +47,14 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[tile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < (int)_tile && ((int)_tile < 0x13a10))) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if ((int)_tile < 0) { + break; + } + if (0x13a10 <= (int)_tile) { + break; + } int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 1774f45de4..ced8c33722 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25207,7 +25207,7 @@ SHC_3BB0A8C1_0x004A2F00 | 0.0% | Pending SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3220 | 73.8% | statement order +SHC_3BB0A8C1_0x004A3220 | 76.5% | Style pass, asm differs SHC_3BB0A8C1_0x004A36B0 | 82.5% | statement order From a33ce519e6cd834ff49c6975b5597213bc823cf2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:57:58 +0200 Subject: [PATCH 394/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 31.92% Style pass, asm differs --- .../findAppropriateLocationForSiegeTent.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index 7c495fdd84..1454567a7b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -106,8 +106,14 @@ namespace Map { === MAIN BFS LOOP === Continue while there are tiles in the queue to process */ if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < _tile && (_tile < 0x13a10))) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile < 0) { + break; + } + if (0x13a10 <= _tile) { + break; + } /* Get Y coordinate of current tile being processed */ diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ced8c33722..d990b353b7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24715,7 +24715,7 @@ SHC_3BB0A8C1_0x0049F2D0 | 85.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 86.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F7D0 | 31.1% | widen local to int +SHC_3BB0A8C1_0x0049F7D0 | 31.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending From 4dd4e1eb4133a6d8033ae88ba2c01740dfde538d Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:57:59 +0200 Subject: [PATCH 395/516] reimplement: SHC_3BB0A8C1_0x0049F040 86.55% Style pass, asm differs --- .../findArcherRelatedAttackInfoIndex.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp index 6808167780..48ce6cd7d6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp @@ -53,8 +53,14 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < _tile && (_tile < 0x13a10))) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile < 0) { + break; + } + if (0x13a10 <= _tile) { + break; + } int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d990b353b7..ebcffe1501 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24709,7 +24709,7 @@ SHC_3BB0A8C1_0x0049EDF0 | 67.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049F040 | 85.6% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F040 | 86.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049F2D0 | 85.0% | Style pass, asm differs From 5bf9b14ac1eb313f1767355c3d03d43e15790431 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:57:59 +0200 Subject: [PATCH 396/516] reimplement: SHC_3BB0A8C1_0x0049D0E0 55.69% Style pass, asm differs --- .../findFreeTileOnDefensiveStructure.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp index dff6f2e9b5..c48c09c230 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp @@ -47,8 +47,14 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < _tile && (_tile < 0x13a10))) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile < 0) { + break; + } + if (0x13a10 <= _tile) { + break; + } int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; iVar5 = (int)sVar2; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ebcffe1501..51f6713311 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24677,7 +24677,7 @@ SHC_3BB0A8C1_0x0049CE40 | 53.9% | widen local to int SHC_3BB0A8C1_0x0049CF30 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D0E0 | 54.4% | statement order +SHC_3BB0A8C1_0x0049D0E0 | 55.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049D240 | 0.0% | Pending From cd112f88884f84d467b00889a5e54fa49ec7a60f Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:57:59 +0200 Subject: [PATCH 397/516] reimplement: SHC_3BB0A8C1_0x0049C370 76.36% Style pass, asm differs --- .../Navigation/PathFindingState/findNoTreeInRange.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp index 7e65ccd665..d523489e4f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNoTreeInRange.cpp @@ -55,8 +55,14 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < _tile && (_tile < 0x13a10))) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile < 0) { + break; + } + if (0x13a10 <= _tile) { + break; + } this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; if ((int)this->searchQueue.currentDistance > budget) { return TRUE; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 51f6713311..3b10e8683f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24655,7 +24655,7 @@ SHC_3BB0A8C1_0x0049C360 | 0.0% | Pending SHC_3BB0A8C1_0x0049C361 | 0.0% | Pending -SHC_3BB0A8C1_0x0049C370 | 70.6% | statement order +SHC_3BB0A8C1_0x0049C370 | 76.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049C4A0 | 0.0% | Pending From c37d98bc016179d50a2600eac84c00f0b9c62d44 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:58:00 +0200 Subject: [PATCH 398/516] reimplement: SHC_3BB0A8C1_0x0049CE40 59.50% Style pass, asm differs --- .../findPathableTileWithoutUnitWithBuildingAtXY.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp index 22d239c701..17b36fb497 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp @@ -51,8 +51,14 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; _buildingAtStart = DAT_TileMapState::instance.BuildingLayer[this->searchQueue.tilesQueue[0]]; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < _tile && (_tile < 0x13a10))) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile < 0) { + break; + } + if (0x13a10 <= _tile) { + break; + } _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; iVar2 = (int)_y; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3b10e8683f..f6864100e4 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24673,7 +24673,7 @@ SHC_3BB0A8C1_0x0049CD60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x0049CDB0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CE40 | 53.9% | widen local to int +SHC_3BB0A8C1_0x0049CE40 | 59.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049CF30 | 0.0% | Pending From 22618a72fdf67a355da22ec36ee602a35bd8ca4f Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:58:00 +0200 Subject: [PATCH 399/516] reimplement: SHC_3BB0A8C1_0x0049F2D0 86.04% Style pass, asm differs --- .../PathFindingState/findSupportPointIndex.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp index 86ba74d988..a322362968 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp @@ -50,8 +50,14 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < iVar4 && (iVar4 < 0x13a10))) { + while (true) { + iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (iVar4 < 0) { + break; + } + if (0x13a10 <= iVar4) { + break; + } int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f6864100e4..465de641c6 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24711,7 +24711,7 @@ SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending SHC_3BB0A8C1_0x0049F040 | 86.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F2D0 | 85.0% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F2D0 | 86.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 86.5% | Style pass, asm differs From 86d41d35d839a7ad4b4d0f01d41ac514f7a68f5a Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:58:01 +0200 Subject: [PATCH 400/516] reimplement: SHC_3BB0A8C1_0x004A9200 58.75% Style pass, asm differs --- .../PathFindingState/isOpponentBuildingInRange.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index e5c6b8ab7e..54cddc0364 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -56,8 +56,14 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (( - _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < _tile && (_tile < 80400))) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (_tile < 0) { + break; + } + if (80400 <= _tile) { + break; + } this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 465de641c6..9435afded9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25453,7 +25453,7 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 57.3% | statement order +SHC_3BB0A8C1_0x004A9200 | 58.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented From dc7cfe5539259559af8fdda3af7899a2b1757e0d Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 19:58:01 +0200 Subject: [PATCH 401/516] reimplement: SHC_3BB0A8C1_0x0049C020 72.50% Style pass, asm differs --- .../PathFindingState/setupBabyTreeLocationInfo.cpp | 10 ++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp index 5b65ccd733..533ec97fd8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp @@ -57,8 +57,14 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while ((iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], - -1 < iVar4 && (iVar4 < 0x13a10))) { + while (true) { + iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (iVar4 < 0) { + break; + } + if (0x13a10 <= iVar4) { + break; + } this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; if (0x13a10 < (int)this->searchQueue.currentDistance) { return (undefined4)(0); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9435afded9..9366702b6d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24443,7 +24443,7 @@ SHC_3BB0A8C1_0x0049BD40 | 0.0% | Pending SHC_3BB0A8C1_0x0049BE60 | 51.6% | drop ghidra chkstk artifact st -SHC_3BB0A8C1_0x0049C020 | 61.4% | Style pass, asm differs +SHC_3BB0A8C1_0x0049C020 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049C100 | 0.0% | Pending From b789c0d5f139e413b69adaafea0685c774550864 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 20:43:35 +0200 Subject: [PATCH 402/516] reimplement: SHC_3BB0A8C1_0x0049DDC0 35.62% bound literals from asm, frame --- .../budgetFloodFillOnCertainPathLayer.cpp | 53 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp index 8e69077388..a9b3ff2939 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp @@ -25,12 +25,10 @@ namespace Map { { int iVar1; uint _candidate; - uint uVar4; - short _distance; int _readIndex; - uint _ys[1000]; - uint _xs[1000]; uint _tilesQueue[1000]; + uint _xs[1000]; + uint _ys[1000]; uint _tile; uint _xUnk; uint _yUnk; @@ -48,19 +46,18 @@ namespace Map { _tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; do { _tile = _tilesQueue[_readIndex]; - if (0x13a10 <= _tile) { + if (0x13a0f < _tile) { return; } - if (budget <= _writeIndex) { + if (_writeIndex >= budget) { return; } - if (999 < _writeIndex) { + if (999 <= _writeIndex) { return; } _yUnk = _xs[_readIndex]; _xUnk = _ys[_readIndex]; - _distance = (short)marker; - DAT_TileMapState::instance.CertainPathLayer[_tile] = _distance; + DAT_TileMapState::instance.CertainPathLayer[_tile] = (short)marker; for (int _direction = 0; _direction < 8; _direction = _direction + 4) { _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction] + _tile; if (DAT_TileMapState::instance.WalkLayer[_candidate] == this->searchGeneration) { @@ -76,7 +73,7 @@ namespace Map { .int_.yOffset + _xUnk; _writeIndex = _writeIndex + 1; - DAT_TileMapState::instance.CertainPathLayer[_candidate] = _distance; + DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)marker; if (999 < _writeIndex) { _writeIndex = 0; } @@ -84,21 +81,21 @@ namespace Map { } else { budget = budget + -1; } - uVar4 = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction + 1] + _tile; - if (DAT_TileMapState::instance.WalkLayer[uVar4] == this->searchGeneration) { - if (DAT_TileMapState::instance.CertainPathLayer[uVar4] == marker) { + _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction + 1] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] == this->searchGeneration) { + if (DAT_TileMapState::instance.CertainPathLayer[_candidate] == marker) { budget = budget + -1; - } else if (0 < DAT_TileMapState::instance.CertainPathLayer[uVar4]) { + } else if (0 < DAT_TileMapState::instance.CertainPathLayer[_candidate]) { iVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] .int_.xOffset; - _tilesQueue[_writeIndex] = uVar4; + _tilesQueue[_writeIndex] = _candidate; _xs[_writeIndex] = iVar1 + _yUnk; _ys[_writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] .int_.yOffset + _xUnk; _writeIndex = _writeIndex + 1; - DAT_TileMapState::instance.CertainPathLayer[uVar4] = _distance; + DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)marker; if (999 < _writeIndex) { _writeIndex = 0; } @@ -106,21 +103,21 @@ namespace Map { } else { budget = budget + -1; } - uVar4 = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction + 2] + _tile; - if (DAT_TileMapState::instance.WalkLayer[uVar4] == this->searchGeneration) { - if (DAT_TileMapState::instance.CertainPathLayer[uVar4] == marker) { + _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction + 2] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] == this->searchGeneration) { + if (DAT_TileMapState::instance.CertainPathLayer[_candidate] == marker) { budget = budget + -1; - } else if (0 < DAT_TileMapState::instance.CertainPathLayer[uVar4]) { + } else if (0 < DAT_TileMapState::instance.CertainPathLayer[_candidate]) { iVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] .int_.xOffset; - _tilesQueue[_writeIndex] = uVar4; + _tilesQueue[_writeIndex] = _candidate; _xs[_writeIndex] = iVar1 + _yUnk; _ys[_writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] .int_.yOffset + _xUnk; _writeIndex = _writeIndex + 1; - DAT_TileMapState::instance.CertainPathLayer[uVar4] = _distance; + DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)marker; if (999 < _writeIndex) { _writeIndex = 0; } @@ -128,21 +125,21 @@ namespace Map { } else { budget = budget + -1; } - uVar4 = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction + 3] + _tile; - if (DAT_TileMapState::instance.WalkLayer[uVar4] == this->searchGeneration) { - if (DAT_TileMapState::instance.CertainPathLayer[uVar4] == marker) { + _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction + 3] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] == this->searchGeneration) { + if (DAT_TileMapState::instance.CertainPathLayer[_candidate] == marker) { budget = budget + -1; - } else if (0 < DAT_TileMapState::instance.CertainPathLayer[uVar4]) { + } else if (0 < DAT_TileMapState::instance.CertainPathLayer[_candidate]) { iVar1 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] .int_.xOffset; _xs[_writeIndex] = iVar1 + _yUnk; - _tilesQueue[_writeIndex] = uVar4; + _tilesQueue[_writeIndex] = _candidate; _ys[_writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] .int_.yOffset + _xUnk; _writeIndex = _writeIndex + 1; - DAT_TileMapState::instance.CertainPathLayer[uVar4] = _distance; + DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)marker; if (999 < _writeIndex) { _writeIndex = 0; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9366702b6d..4dcca09ca0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24695,7 +24695,7 @@ SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending SHC_3BB0A8C1_0x0049DB30 | 83.3% | statement order -SHC_3BB0A8C1_0x0049DDC0 | 35.6% | statement order +SHC_3BB0A8C1_0x0049DDC0 | 35.6% | bound literals from asm, frame SHC_3BB0A8C1_0x0049E0D0 | 87.5% | Style pass, asm differs From ef5e0590754b16b79902aa33c09e051bc1787b3b Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 20:43:36 +0200 Subject: [PATCH 403/516] reimplement: SHC_3BB0A8C1_0x0049FC00 62.46% signed compare fixed, allocato --- .../Map/Navigation/PathFindingState/pathFindingRelated.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp index 02848925ed..1bdb676c4d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -88,7 +88,7 @@ namespace Map { iVar8 < local_18)) goto LAB_0049fdee; } else { - if ((uVar9 == 0) || (local_1c <= uVar9)) + if ((uVar9 == 0) || ((int)local_1c <= (int)uVar9)) goto LAB_0049fdba; iVar8 = MACRO_CALL_MEMBER( OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4dcca09ca0..e2dd5f91b9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24719,7 +24719,7 @@ SHC_3BB0A8C1_0x0049F7D0 | 31.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FC00 | 62.5% | statement order +SHC_3BB0A8C1_0x0049FC00 | 62.5% | signed compare fixed, allocato SHC_3BB0A8C1_0x0049FD10 | 0.0% | Pending From fbb6f49936bd98c7ce4ceeb77d4409f1ac83ab78 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 20:43:36 +0200 Subject: [PATCH 404/516] reimplement: SHC_3BB0A8C1_0x004A2A90 65.21% counted for loop, allocator di --- .../spreadAlgorithmForFlagsAndBraziersUnk.cpp | 4 +--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp index 30fbe87547..207d84d9a8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp @@ -48,7 +48,6 @@ namespace Map { int iVar4; int iVar5; int (*paiVar7)[8]; - int iVar8; int local_8; int local_4; uVar3 = y; @@ -86,10 +85,9 @@ namespace Map { if ((int)this->searchQueue.currentDistance > param_4) { return (undefined4)(0); } - iVar8 = 0; iVar5 = (int)DAT_TileMapState::instance.EntityLayer[tile]; if (DAT_TileMapState::instance.EntityLayer[tile] != 0) { - while (iVar8 = iVar8 + 1, iVar8 < 10) { + for (int _step = 1; _step < 10; _step = _step + 1) { if (DAT_EntityState::instance.entityArray[iVar5].owner == playerID) { switch (DAT_EntityState::instance.entityArray[iVar5].entityType) { case OpenSHC::Map::Entities::ET_BRAZIER: diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e2dd5f91b9..25ab3e9e6e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25185,7 +25185,7 @@ SHC_3BB0A8C1_0x004A2740 | 0.0% | Pending SHC_3BB0A8C1_0x004A27D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2A90 | 65.2% | statement order +SHC_3BB0A8C1_0x004A2A90 | 65.2% | counted for loop, allocator di SHC_3BB0A8C1_0x004A2B70 | 0.0% | Pending From 69536dd1c4630b0a685951b92fb4843b34dc730d Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 21:03:36 +0200 Subject: [PATCH 405/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 32.32% yQueue stored before tilesQueu --- .../findAppropriateLocationForSiegeTent.cpp | 9 +++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index 1454567a7b..b6aba13ebc 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -89,11 +89,11 @@ namespace Map { /* Convert 2D coordinates to 1D tile index */ - this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + this->searchQueue.yQueue[0] = (short)y; /* Add starting position to queue */ - this->searchQueue.yQueue[0] = (short)y; + this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; /* Mark starting tile with distance 1 */ @@ -108,10 +108,7 @@ namespace Map { if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if (_tile < 0) { - break; - } - if (0x13a10 <= _tile) { + if (_tile < 0 || 0x13a10 <= _tile) { break; } /* diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 25ab3e9e6e..df0bc614f2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24715,7 +24715,7 @@ SHC_3BB0A8C1_0x0049F2D0 | 86.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 86.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F7D0 | 31.9% | Style pass, asm differs +SHC_3BB0A8C1_0x0049F7D0 | 32.3% | yQueue stored before tilesQueu SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending From 105e464f0de771e08e58abbf8bbcec3b0da9d021 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 21:11:50 +0200 Subject: [PATCH 406/516] reimplement: SHC_3BB0A8C1_0x004A9B20 60.04% duplicated the shared fallback --- .../PathFindingState/doPathfinding.cpp | 42 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp index 92e0653064..3aaed15365 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/doPathfinding.cpp @@ -62,7 +62,11 @@ namespace Map { int iVar4 = (DAT_DirectionAlgorithmState::instance.distanceHigh + 4) * (DAT_DirectionAlgorithmState::instance.distanceHigh + 4) * 10; this->searchQueue.pathPlanIndex = 0; - if (this->notAllAssassinsUnk == 0) { + if (this->notAllAssassinsUnk != 0) { + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::findLinkageBasedPathOrWalkRadius, this)( + this->unitX, (uint)(this->unitY), this->destinationX, this->destinationY, 100000, FALSE); + } else { if (this->allAssassinsUnk == 0) { BVar3 = MACRO_CALL_MEMBER( OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, this)( @@ -72,31 +76,27 @@ namespace Map { OpenSHC::Map::Navigation::PathFindingState_Func::findLinkageBasedPathOrWalkRadius, this)( this->unitX, (uint)(this->unitY), this->destinationX, this->destinationY, iVar4, FALSE); } - if (BVar3 != FALSE) - goto LAB_004a9cdd; - if (this->allAssassinsUnk == 0) { - if (this->climbIsIllegal == 0) - goto LAB_004a9cce; - BVar3 = MACRO_CALL_MEMBER( - OpenSHC::Map::Navigation::PathFindingState_Func::findPathUsingClimbingWithHeightMargin16, this)( - this->unitX, (uint)(this->unitY), (uint)(this->destinationX), (uint)(this->destinationY), - 100000, FALSE); - } else { - BVar3 = MACRO_CALL_MEMBER( - OpenSHC::Map::Navigation::PathFindingState_Func::pathFindingWithBuildingsIncluded, this)( - this->unitX, (uint)(this->unitY), (uint)(this->destinationX), (uint)(this->destinationY), - 100000, 0); + if (BVar3 == FALSE) { + if (this->allAssassinsUnk != 0) { + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::pathFindingWithBuildingsIncluded, this)( + this->unitX, (uint)(this->unitY), (uint)(this->destinationX), (uint)(this->destinationY), + 100000, 0); + } else if (this->climbIsIllegal != 0) { + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::findPathUsingClimbingWithHeightMargin16, + this)(this->unitX, (uint)(this->unitY), (uint)(this->destinationX), + (uint)(this->destinationY), 100000, FALSE); + } else { + BVar3 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::PathFindingState_Func::findLinkageBasedPathOrWalkRadius, this)( + this->unitX, (uint)(this->unitY), this->destinationX, this->destinationY, 100000, FALSE); + } } - } else { - LAB_004a9cce: - BVar3 = MACRO_CALL_MEMBER( - OpenSHC::Map::Navigation::PathFindingState_Func::findLinkageBasedPathOrWalkRadius, this)( - this->unitX, (uint)(this->unitY), this->destinationX, this->destinationY, 100000, FALSE); } if (BVar3 == FALSE) { return (dword)(0); } - LAB_004a9cdd: if (this->allAssassinsUnk == 0) { if (this->climbIsIllegal == 0) { iVar4 = 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index df0bc614f2..e910a0aba1 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25469,7 +25469,7 @@ SHC_3BB0A8C1_0x004A97D0 | 21.6% | statement order SHC_3BB0A8C1_0x004A98C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9B20 | 56.5% | call via global instance +SHC_3BB0A8C1_0x004A9B20 | 60.0% | duplicated the shared fallback SHC_3BB0A8C1_0x004A9DD0 | 100.0% | Reimplemented From 4d68ea5787c97bb249dbfd74ad0099dfe24619b6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 21:19:54 +0200 Subject: [PATCH 407/516] reimplement: SHC_3BB0A8C1_0x004A5320 67.90% 21 gotos to the shared return --- ...teCanPlayerUnitsNavigateToAreaFromArea.cpp | 63 +++++++------------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 22 insertions(+), 43 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index 839f906e43..d545e6e495 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -67,8 +67,7 @@ namespace Map { dVar2 = this->climbData[iVar1].wallGroupAreaID; if ((dVar2 == fromArea) || (dVar3 = this->climbData[iVar1].buildingArea, dVar3 == fromArea)) { - fromArea = toArea; - goto LAB_ret; + return (int)(toArea); } adStack_960[iVar5] = dVar2; iVar5 = iVar5 + 1; @@ -81,13 +80,11 @@ namespace Map { dVar3 = this->climbData[iVar1].wallGroupAreaID; if (dVar3 == toArea) { if (dVar2 == fromArea) { - fromArea = toArea; - goto LAB_ret; + return (int)(toArea); } dVar3 = this->climbData[iVar1].buildingArea; if (dVar3 == fromArea) { - fromArea = toArea; - goto LAB_ret; + return (int)(toArea); } adStack_960[iVar5] = dVar2; aiStack_640[iVar6 * 2 + 1] = 1; @@ -98,12 +95,10 @@ namespace Map { } } else if (this->climbData[iVar1].buildingArea == toArea) { if (dVar2 == fromArea) { - fromArea = toArea; - goto LAB_ret; + return (int)(toArea); } if (dVar3 == fromArea) { - fromArea = toArea; - goto LAB_ret; + return (int)(toArea); } adStack_960[iVar5] = dVar2; iVar5 = iVar5 + 1; @@ -130,13 +125,11 @@ namespace Map { if (dVar3 == dVar2) { dVar3 = this->climbData[iVar1].wallGroupAreaID; if (dVar3 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } dVar4 = this->climbData[iVar1].buildingArea; if (dVar4 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } adStack_960[iVar5] = dVar3; iVar5 = iVar5 + 1; @@ -149,13 +142,11 @@ namespace Map { dVar4 = this->climbData[iVar1].wallGroupAreaID; if (dVar4 == dVar2) { if (dVar3 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } dVar4 = this->climbData[iVar1].buildingArea; if (dVar4 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } adStack_960[iVar5] = dVar3; aiStack_640[iVar6 * 2 + 1] = 1; @@ -166,12 +157,10 @@ namespace Map { } } else if (this->climbData[iVar1].buildingArea == dVar2) { if (dVar3 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } if (dVar4 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } adStack_960[iVar5] = dVar3; iVar5 = iVar5 + 1; @@ -198,8 +187,7 @@ namespace Map { dVar2 = this->climbData[iVar1].wallGroupAreaID; if ((dVar2 == fromArea) || (dVar3 = this->climbData[iVar1].buildingArea, dVar3 == fromArea)) { - fromArea = toArea; - goto LAB_ret; + return (int)(toArea); } adStack_960[iVar5] = dVar2; iVar5 = iVar5 + 1; @@ -212,13 +200,11 @@ namespace Map { dVar3 = this->climbData[iVar1].wallGroupAreaID; if (dVar3 == toArea) { if (dVar2 == fromArea) { - fromArea = toArea; - goto LAB_ret; + return (int)(toArea); } dVar3 = this->climbData[iVar1].buildingArea; if (dVar3 == fromArea) { - fromArea = toArea; - goto LAB_ret; + return (int)(toArea); } adStack_960[iVar5] = dVar2; aiStack_640[iVar6 * 2 + 1] = 1; @@ -229,8 +215,7 @@ namespace Map { } } else if (this->climbData[iVar1].buildingArea == toArea) { if ((dVar2 == fromArea) || (dVar3 == fromArea)) { - fromArea = toArea; - goto LAB_ret; + return (int)(toArea); } adStack_960[iVar5] = dVar2; iVar5 = iVar5 + 1; @@ -255,13 +240,11 @@ namespace Map { if (dVar3 == dVar2) { dVar3 = this->climbData[iVar1].wallGroupAreaID; if (dVar3 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } dVar4 = this->climbData[iVar1].buildingArea; if (dVar4 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } adStack_960[iVar5] = dVar3; iVar5 = iVar5 + 1; @@ -274,13 +257,11 @@ namespace Map { dVar4 = this->climbData[iVar1].wallGroupAreaID; if (dVar4 == dVar2) { if (dVar3 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } dVar4 = this->climbData[iVar1].buildingArea; if (dVar4 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } adStack_960[iVar5] = dVar3; aiStack_640[iVar6 * 2 + 1] = 1; @@ -291,12 +272,10 @@ namespace Map { } } else if (this->climbData[iVar1].buildingArea == dVar2) { if (dVar3 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } if (dVar4 == fromArea) { - fromArea = dVar2; - goto LAB_ret; + return (int)(dVar2); } adStack_960[iVar5] = dVar3; iVar5 = iVar5 + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e910a0aba1..30923a0b8d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25251,7 +25251,7 @@ SHC_3BB0A8C1_0x004A5230 | 0.0% | Pending SHC_3BB0A8C1_0x004A52D0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5320 | 49.1% | statement order +SHC_3BB0A8C1_0x004A5320 | 67.9% | 21 gotos to the shared return SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending From 7351c6b296d37d9a4c5d3bcb5539a7fa2716f280 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 21:28:25 +0200 Subject: [PATCH 408/516] reimplement: SHC_3BB0A8C1_0x004A6010 41.25% small shared tail duplicated --- .../findBestAttackTargetTileWithHeightAndOwner.cpp | 12 ++++++++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp index bc0cdd028f..17ca7cfeed 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -122,7 +122,16 @@ namespace Map { } else { iVar9 = this->searchQueue.currentDistance * iVar9; } - goto LAB_004a62e3; + if (iVar9 < local_20 + && (iVar7 + = MACRO_CALL(OpenSHC::Map::Navigation_Func::CalcApproxEuclideanDistance)( + param_2, (int)(sVar1), (int)(param_3), iVar6), + iVar7 <= param_1)) { + local_20 = iVar9; + local_14 = (int)sVar1; + local_10 = iVar6; + local_c = uVar4; + } } } else if ((DAT_TileMapState::instance.WallOwnerLayer[uVar4] & 7) + 1 == param_7 && param_9 == 0) { @@ -135,7 +144,6 @@ namespace Map { } else { iVar9 = this->searchQueue.currentDistance * 100 + iVar9; } - LAB_004a62e3: if (iVar9 < local_20 && (iVar7 = MACRO_CALL(OpenSHC::Map::Navigation_Func::CalcApproxEuclideanDistance)( param_2, (int)(sVar1), (int)(param_3), iVar6), diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 30923a0b8d..8769eebeed 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25271,7 +25271,7 @@ SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A5F90 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6010 | 40.8% | compare operand order +SHC_3BB0A8C1_0x004A6010 | 41.2% | small shared tail duplicated SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending From da6ee7945bf4b01df1d57762116d9b87f3890e87 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 21:28:35 +0200 Subject: [PATCH 409/516] reimplement: SHC_3BB0A8C1_0x004A58A0 37.92% shared blocks duplicated, inne --- .../findConnectingAreaBetweenTwoAreas.cpp | 131 ++++++++++-------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 77 insertions(+), 56 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp index 603fd94a9b..66881d8af8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp @@ -58,7 +58,6 @@ namespace Map { dVar7 = this->climbData[iVar1].area; if (dVar7 == param_3) { dVar7 = this->climbData[iVar1].wallGroupAreaID; - LAB_004a59a4: if (dVar7 == param_2) { return (dword)(param_3); } @@ -73,23 +72,34 @@ namespace Map { adStack_960[iVar6] = dVar8; iVar6 = iVar6 + 1; } - } else { - dVar8 = this->climbData[iVar1].wallGroupAreaID; - if (dVar8 == param_3) - goto LAB_004a59a4; - if (this->climbData[iVar1].buildingArea == param_3) { - if (dVar7 == param_2) { - return (dword)(param_3); - } - if (dVar8 == param_2) { - return (dword)(param_3); - } - adStack_960[iVar6] = dVar7; - iVar6 = iVar6 + 1; - aiStack_640[iVar4 * 2 + 1] = 1; + } else if (this->climbData[iVar1].wallGroupAreaID == param_3) { + if (dVar7 == param_2) { + return (dword)(param_3); + } + dVar8 = this->climbData[iVar1].buildingArea; + if (dVar8 == param_2) { + return (dword)(param_3); + } + adStack_960[iVar6] = dVar7; + iVar6 = iVar6 + 1; + aiStack_640[iVar4 * 2 + 1] = 1; + if (0 < (int)dVar8) { adStack_960[iVar6] = dVar8; iVar6 = iVar6 + 1; } + } else if (this->climbData[iVar1].buildingArea == param_3) { + dVar8 = this->climbData[iVar1].wallGroupAreaID; + if (dVar7 == param_2) { + return (dword)(param_3); + } + if (dVar8 == param_2) { + return (dword)(param_3); + } + adStack_960[iVar6] = dVar7; + iVar6 = iVar6 + 1; + aiStack_640[iVar4 * 2 + 1] = 1; + adStack_960[iVar6] = dVar8; + iVar6 = iVar6 + 1; } iVar4 = iVar4 + 1; } while (iVar4 < local_96c); @@ -97,49 +107,60 @@ namespace Map { do { dVar7 = adStack_960[local_968]; local_968 = local_968 + 1; - iVar4 = 0; - do { - if (aiStack_640[iVar4 * 2 + 1] != 1) { - iVar1 = aiStack_640[iVar4 * 2]; - dVar8 = this->climbData[iVar1].area; - if (dVar8 == dVar7) { - dVar8 = this->climbData[iVar1].wallGroupAreaID; - LAB_004a5a70: - if (dVar8 == param_2) { - return (dword)(dVar7); - } - dword dVar2 = this->climbData[iVar1].buildingArea; - if (dVar2 == param_2) { - return (dword)(dVar7); - } - adStack_960[iVar6] = dVar8; - iVar6 = iVar6 + 1; - aiStack_640[iVar4 * 2 + 1] = 1; - if ((int)dVar2 <= 0) - goto LAB_004a5ad0; - adStack_960[iVar6] = dVar2; - } else { - dVar2 = this->climbData[iVar1].wallGroupAreaID; - if (dVar2 == dVar7) - goto LAB_004a5a70; - if (this->climbData[iVar1].buildingArea != dVar7) - goto LAB_004a5ad0; - if (dVar8 == param_2) { - return (dword)(dVar7); - } - if (dVar2 == param_2) { - return (dword)(dVar7); - } - adStack_960[iVar6] = dVar8; - iVar6 = iVar6 + 1; - aiStack_640[iVar4 * 2 + 1] = 1; - adStack_960[iVar6] = dVar2; + for (iVar4 = 0; iVar4 < local_96c; iVar4 = iVar4 + 1) { + if (aiStack_640[iVar4 * 2 + 1] == 1) { + continue; + } + iVar1 = aiStack_640[iVar4 * 2]; + dVar8 = this->climbData[iVar1].area; + if (dVar8 == dVar7) { + dVar8 = this->climbData[iVar1].wallGroupAreaID; + if (dVar8 == param_2) { + return (dword)(dVar7); + } + dVar2 = this->climbData[iVar1].buildingArea; + if (dVar2 == param_2) { + return (dword)(dVar7); + } + adStack_960[iVar6] = dVar8; + iVar6 = iVar6 + 1; + aiStack_640[iVar4 * 2 + 1] = 1; + if ((int)dVar2 <= 0) { + continue; } + adStack_960[iVar6] = dVar2; + iVar6 = iVar6 + 1; + } else if (this->climbData[iVar1].wallGroupAreaID == dVar7) { + if (dVar8 == param_2) { + return (dword)(dVar7); + } + dVar2 = this->climbData[iVar1].buildingArea; + if (dVar2 == param_2) { + return (dword)(dVar7); + } + adStack_960[iVar6] = dVar8; + iVar6 = iVar6 + 1; + aiStack_640[iVar4 * 2 + 1] = 1; + if ((int)dVar2 <= 0) { + continue; + } + adStack_960[iVar6] = dVar2; + iVar6 = iVar6 + 1; + } else if (this->climbData[iVar1].buildingArea == dVar7) { + dVar2 = this->climbData[iVar1].wallGroupAreaID; + if (dVar8 == param_2) { + return (dword)(dVar7); + } + if (dVar2 == param_2) { + return (dword)(dVar7); + } + adStack_960[iVar6] = dVar8; + iVar6 = iVar6 + 1; + aiStack_640[iVar4 * 2 + 1] = 1; + adStack_960[iVar6] = dVar2; iVar6 = iVar6 + 1; } - LAB_004a5ad0: - iVar4 = iVar4 + 1; - } while (iVar4 < local_96c); + } } while (local_968 < iVar6); } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8769eebeed..033042ccd0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25257,7 +25257,7 @@ SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending SHC_3BB0A8C1_0x004A5770 | 0.0% | Pending -SHC_3BB0A8C1_0x004A58A0 | 28.6% | single in-place queue counter +SHC_3BB0A8C1_0x004A58A0 | 37.9% | shared blocks duplicated, inne SHC_3BB0A8C1_0x004A5980 | 0.0% | Pending From e50fbe976c253e25b7542f0b3fe2a88a43a8038f Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 21:36:52 +0200 Subject: [PATCH 410/516] reimplement: SHC_3BB0A8C1_0x0049C690 77.06% four gotos as combined conditi --- .../computeTotalUnitsWithinDistance.cpp | 39 ++++++------------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 13 insertions(+), 28 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp index b9e23d0e3f..cfc6fae0f2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeTotalUnitsWithinDistance.cpp @@ -89,12 +89,9 @@ namespace Map { for (int iVar6 = 0; iVar6 < 8; iVar6 = iVar6 + 4) { iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6] + uVar4; if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { - if (someLogicalTileProperty == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) - goto LAB_0049c880; - } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6] & bVar1) - != 0) { - LAB_0049c880: + if ((someLogicalTileProperty == 0 && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + || (someLogicalTileProperty != 0 + && (DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6] & bVar1) != 0)) { DAT_TileMapState::instance.CertainPathLayer[iVar5] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; @@ -111,13 +108,9 @@ namespace Map { } iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6 + 1] + uVar4; if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { - if (someLogicalTileProperty == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) - goto LAB_0049c918; - } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 1] - & bVar1) - != 0) { - LAB_0049c918: + if ((someLogicalTileProperty == 0 && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + || (someLogicalTileProperty != 0 + && (DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 1] & bVar1) != 0)) { DAT_TileMapState::instance.CertainPathLayer[iVar5] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; @@ -134,13 +127,9 @@ namespace Map { } iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6 + 2] + uVar4; if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { - if (someLogicalTileProperty == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) - goto LAB_0049c9b1; - } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 2] - & bVar1) - != 0) { - LAB_0049c9b1: + if ((someLogicalTileProperty == 0 && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + || (someLogicalTileProperty != 0 + && (DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 2] & bVar1) != 0)) { DAT_TileMapState::instance.CertainPathLayer[iVar5] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; @@ -157,13 +146,9 @@ namespace Map { } iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][iVar6 + 3] + uVar4; if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { - if (someLogicalTileProperty == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) - goto LAB_0049ca4a; - } else if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 3] - & bVar1) - != 0) { - LAB_0049ca4a: + if ((someLogicalTileProperty == 0 && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) + || (someLogicalTileProperty != 0 + && (DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar6 + 3] & bVar1) != 0)) { DAT_TileMapState::instance.CertainPathLayer[iVar5] = (short)this->searchQueue.currentDistance + 1; DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 033042ccd0..389bb61e5b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24661,7 +24661,7 @@ SHC_3BB0A8C1_0x0049C4A0 | 0.0% | Pending SHC_3BB0A8C1_0x0049C5C0 | 84.3% | hoisted row ptr and result x -SHC_3BB0A8C1_0x0049C690 | 77.1% | statement order +SHC_3BB0A8C1_0x0049C690 | 77.1% | four gotos as combined conditi SHC_3BB0A8C1_0x0049C730 | 0.0% | Pending From e484069ad4fba8600443ae94daa7c7b15ae8e82a Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 21:36:53 +0200 Subject: [PATCH 411/516] reimplement: SHC_3BB0A8C1_0x004A9510 73.02% ladder sizes as one condition --- .../PathFindingState/createClimbData.cpp | 14 ++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp index f6cfa0066a..dada5f6eda 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/createClimbData.cpp @@ -47,19 +47,13 @@ namespace Map { = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; this->climbData[_climbID].bottomTilePosition = DAT_BuildingsState::instance.buildings[buildingID].currentTilePositionAdjusted; - if (size != 6) { - if (size != 5) { - if (size == 4) - goto LAB_004a95d6; - if (size != 3) { - return _climbID; - } - } + if (size == 6 || size == 4) { this->climbData[_climbID].ladderDirection = direction; return _climbID; } - LAB_004a95d6: - this->climbData[_climbID].ladderDirection = direction; + if (size == 5 || size == 3) { + this->climbData[_climbID].ladderDirection = direction; + } return _climbID; } if (unitID == 0) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 389bb61e5b..fd84b37cc3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25457,7 +25457,7 @@ SHC_3BB0A8C1_0x004A9200 | 58.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A9510 | 73.0% | orig branch order + loop shape +SHC_3BB0A8C1_0x004A9510 | 73.0% | ladder sizes as one condition SHC_3BB0A8C1_0x004A9680 | 100.0% | Reimplemented From 53c059a9e056a62d4c71711665839d474460f085 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 21:36:53 +0200 Subject: [PATCH 412/516] reimplement: SHC_3BB0A8C1_0x00498020 61.43% counted direction loop, combin --- ...indPathUsingClimbingWithHeightMargin16.cpp | 19 +++++++------------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp index 7a00107df3..7083962040 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathUsingClimbingWithHeightMargin16.cpp @@ -102,8 +102,8 @@ namespace Map { uint _tHeight = (uint)DAT_TileMapState::instance.HeightLayer[_tile]; _tLogic = DAT_TileMapState::instance.LogicLayer[_tile]; paiVar4 = DAT_TileMapState::instance.directionTranslationMatrix + sVar2; - _direction = 0; - do { + for (_direction = 0; _direction < 8; + _direction = _direction + 1, paiVar4 = (int (*)[8])(*paiVar4 + 1)) { /* for each direction, do: */ @@ -120,11 +120,9 @@ namespace Map { tile is not moat */ _cLogic = DAT_TileMapState::instance.LogicLayer[_candidate]; - if ((_tLogic & 0x40000000) == 0) { - if ((_cLogic & 0x40000000) != 0) - goto LAB_0049825d; - } else if ((_cLogic & 0x40000800) != 0 || (_cLogic & 0x4a5015b1) == 0) { - LAB_0049825d: + if (((_tLogic & 0x40000000) == 0 && (_cLogic & 0x40000000) != 0) + || ((_tLogic & 0x40000000) != 0 + && ((_cLogic & 0x40000800) != 0 || (_cLogic & 0x4a5015b1) == 0))) { /* candidate is moat or stairs OR not sea, border (edge), rocky, wall or gatehouse, building, tree, rivere, crenel, farm field, moat @@ -158,7 +156,7 @@ namespace Map { .buildingType; if ((_tType != OpenSHC::Map::Buildings::BT_GATEHOUSELARGE) && (_tType != OpenSHC::Map::Buildings::BT_GATEHOUSESMALL)) - goto LAB_0049838d; + continue; _tDiff = -90; } /* @@ -192,10 +190,7 @@ namespace Map { } } } - LAB_0049838d: - _direction = _direction + 1; - paiVar4 = (int (*)[8])(*paiVar4 + 1); - } while (_direction < 8); + } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; if (0x13a10 <= (int)this->searchQueue.readIndex) { this->searchQueue.readIndex = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fd84b37cc3..e4aefa787a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24369,7 +24369,7 @@ SHC_3BB0A8C1_0x00497740 | 50.5% | statement order SHC_3BB0A8C1_0x00497B80 | 52.6% | statement order -SHC_3BB0A8C1_0x00498020 | 61.3% | fix height window bug +SHC_3BB0A8C1_0x00498020 | 61.4% | counted direction loop, combin SHC_3BB0A8C1_0x00498170 | 0.0% | Pending From a7555eb1a86c4012224a5e96731637ff12a80948 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 21:51:21 +0200 Subject: [PATCH 413/516] reimplement: SHC_3BB0A8C1_0x004A97D0 21.59% counted direction loop; flag-b --- .../PathFindingState/traceAndCommitPathPlan.cpp | 11 ++++------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp index 6f79971f8d..92a8997a58 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp @@ -39,13 +39,12 @@ namespace Map { if (tile == iVar2 + x) break; uint _theDirection = 8; - uint _direction = 0; - do { + for (uint _direction = 0; (int)_direction < 8; _direction = _direction + 1) { if (param_5 == 1) { if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction] & DAT_TileMapState::instance.PathLinkageLayer[tile]) == 0) - goto LAB_004a99f7; + continue; LAB_004a99b6: uint uVar3 = DAT_TileMapState::instance.directionTranslationMatrix[y2][_direction] + tile; if (DAT_TileMapState::instance.WalkLayer[uVar3] == sVar1 @@ -75,7 +74,7 @@ namespace Map { if ((DAT_TileMapState::instance.LogicLayer[iVar4] & 0x100U) == 0) goto LAB_004a99b6; } - goto LAB_004a99f7; + continue; } goto LAB_004a99b6; } @@ -97,9 +96,7 @@ namespace Map { goto LAB_004a99b6; } } - LAB_004a99f7: - _direction = _direction + 1; - } while ((int)_direction < 8); + } if (_theDirection == 8) { /* I guess this increment means "total recomputes of the path linkage layer" diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e4aefa787a..8c4eba2193 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25465,7 +25465,7 @@ SHC_3BB0A8C1_0x004A96B0 | 0.0% | Pending SHC_3BB0A8C1_0x004A9760 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A97D0 | 21.6% | statement order +SHC_3BB0A8C1_0x004A97D0 | 21.6% | counted direction loop; flag-b SHC_3BB0A8C1_0x004A98C0 | 0.0% | Pending From 2430f4815edfd35b43e3242e178e0007f95fd740 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:37:53 +0200 Subject: [PATCH 414/516] reimplement: SHC_3BB0A8C1_0x0049B5B0 72.95% unsigned building layer read --- .../Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp index b93d126d86..a31c4f7d47 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algTunnelerFindTarget.cpp @@ -71,7 +71,7 @@ namespace Map { return; } } - int sVar3 = DAT_TileMapState::instance.BuildingLayer[iVar4]; + int sVar3 = (ushort)DAT_TileMapState::instance.BuildingLayer[iVar4]; if (sVar3 != 0 && (targetPlayerID == 0 || (targetPlayerID == DAT_BuildingsState::instance.buildings[sVar3].owner)) diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8c4eba2193..8ee69ff94b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24423,7 +24423,7 @@ SHC_3BB0A8C1_0x0049B1D0 | 87.3% | statement order SHC_3BB0A8C1_0x0049B2B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049B5B0 | 72.3% | statement order +SHC_3BB0A8C1_0x0049B5B0 | 73.0% | unsigned building layer read SHC_3BB0A8C1_0x0049B6B0 | 0.0% | Pending From 85488482d76dedaae7e7931193196cbc1b379799 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:37:53 +0200 Subject: [PATCH 415/516] reimplement: SHC_3BB0A8C1_0x004A8860 48.10% compare order from asm --- .../Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp index e3a2c88eb8..6606394a2b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp @@ -189,7 +189,7 @@ namespace Map { Move to next access point */ _accessibleIndex = _accessibleIndex + 1; - if (_accessibleTilesCount <= _accessibleIndex) { + if (_accessibleIndex >= _accessibleTilesCount) { _accessibleIndex = 0; } _limit = _limit + -1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8ee69ff94b..69d9bb0c6d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25315,7 +25315,7 @@ SHC_3BB0A8C1_0x004A83B0 | 71.6% | statement order SHC_3BB0A8C1_0x004A8780 | 81.5% | counted for + named layer -SHC_3BB0A8C1_0x004A8860 | 47.5% | widen narrow locals to int +SHC_3BB0A8C1_0x004A8860 | 48.1% | compare order from asm SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending From 82df618a1c416d080010f334c03ef9b3747c5a7a Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:37:53 +0200 Subject: [PATCH 416/516] reimplement: SHC_3BB0A8C1_0x004A7F50 57.56% bound literal from asm --- ...eNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 7ad7a02dba..293dc839d7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -7,11 +7,11 @@ #include "OpenSHC/Map/Location/Point8ShortXY.hpp" #include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" -#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_BuildingsState.hpp" #include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" #include "OpenSHC/Globals/DAT_GameState.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" @@ -68,7 +68,7 @@ namespace Map { 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } maxDestinations = maxDestinations * 2; - if (maxDestinations < 500) { + if (maxDestinations <= 500) { if (maxDestinations < 0x32) { maxDestinations = 0x32; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 69d9bb0c6d..b3ec92e446 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25303,7 +25303,7 @@ SHC_3BB0A8C1_0x004A75B0 | 47.0% | compare operand order SHC_3BB0A8C1_0x004A79A0 | 63.8% | statement order -SHC_3BB0A8C1_0x004A7F50 | 57.6% | compare operand order +SHC_3BB0A8C1_0x004A7F50 | 57.6% | bound literal from asm SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending From 29769d280bab1e6677c45421848a9e111d87bb64 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:37:54 +0200 Subject: [PATCH 417/516] reimplement: SHC_3BB0A8C1_0x0049D0E0 57.14% signed unit layer local --- .../PathFindingState/findFreeTileOnDefensiveStructure.cpp | 5 +++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp index c48c09c230..57d37e7111 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeTileOnDefensiveStructure.cpp @@ -58,13 +58,14 @@ namespace Map { int sVar1 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; iVar5 = (int)sVar2; - if ((short)DAT_TileMapState::instance.UnitLayer[_tile] == 0) { + int _unitAtTile = (short)DAT_TileMapState::instance.UnitLayer[_tile]; + if (_unitAtTile == 0) { this->ALG_ResultX = (int)sVar1; this->ALG_ResultY = iVar5; this->ALG_ResultTile = _tile; return; } - if ((short)DAT_TileMapState::instance.UnitLayer[_tile] == unitID) { + if (_unitAtTile == unitID) { this->ALG_ResultX = (int)sVar1; this->ALG_ResultY = iVar5; this->ALG_ResultTile = _tile; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b3ec92e446..a817ef9a7e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24677,7 +24677,7 @@ SHC_3BB0A8C1_0x0049CE40 | 59.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049CF30 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D0E0 | 55.7% | Style pass, asm differs +SHC_3BB0A8C1_0x0049D0E0 | 57.1% | signed unit layer local SHC_3BB0A8C1_0x0049D240 | 0.0% | Pending From 2c0e28ac91248940f07aa539b0aab8d237363333 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:37:54 +0200 Subject: [PATCH 418/516] reimplement: SHC_3BB0A8C1_0x00496F90 56.45% distance local hoisted --- ...tTileInExistingSearchThatIsModuloDistanceAway.cpp | 12 ++++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp index bf0b95bce4..f8423138d6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp @@ -26,17 +26,17 @@ namespace Map { _pLastTile = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; while (true) { int iVar1 = *_pLastTile; - if (0 < DAT_TileMapState::instance.CertainPathLayer[iVar1] + int _dist = DAT_TileMapState::instance.CertainPathLayer[iVar1]; + if (0 < _dist && (_dx = (iVar1 - DAT_ViewportRenderState::instance - .translationMatrix[DAT_ViewportRenderState::instance - .tileTranslationMatrix_YComponent[iVar1]] - .addXgetTile) + .translationMatrix[DAT_ViewportRenderState::instance + .tileTranslationMatrix_YComponent[iVar1]] + .addXgetTile) - x, _dy = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[iVar1] - y, (abs(_dy) + abs(_dx)) % modulo == 0) - && (iVar2 = DAT_TribesState::instance.ALG_ResultTileIndex, - DAT_TileMapState::instance.CertainPathLayer[iVar1] < 4000)) + && (iVar2 = DAT_TribesState::instance.ALG_ResultTileIndex, _dist < 4000)) break; DAT_TribesState::instance.ALG_ResultTileIndex = DAT_TribesState::instance.ALG_ResultTileIndex + 1; _pLastTile = _pLastTile + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a817ef9a7e..d8c0861918 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24353,7 +24353,7 @@ SHC_3BB0A8C1_0x00496EA0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00496EC0 | 66.0% | hoist signed start-tile reads -SHC_3BB0A8C1_0x00496F90 | 51.6% | abs() instead of shift idiom +SHC_3BB0A8C1_0x00496F90 | 56.5% | distance local hoisted SHC_3BB0A8C1_0x00497080 | 78.1% | hoist signed start-tile read From 37c8b1da7ca2bf1f173109dd9b41ff7431bf2d04 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:37:54 +0200 Subject: [PATCH 419/516] reimplement: SHC_3BB0A8C1_0x0049D340 67.29% signed unit layer local --- .../findWalkableTileThatDoesNotContainUnit.cpp | 7 +++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp index 1223b02fea..dac213e4d2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp @@ -72,13 +72,12 @@ namespace Map { } _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; - if ((((int)(short)DAT_TileMapState::instance.UnitLayer[_tile] == 0) || (considerUnits == 0)) - && (short)DAT_TileMapState::instance.UnitLayer[_tile] != unitID + int _unitAtTile = (short)DAT_TileMapState::instance.UnitLayer[_tile]; + if (((_unitAtTile == 0) || (considerUnits == 0)) && _unitAtTile != unitID && _area == (short)DAT_TileMapState::instance.PathConnectionLayer[_tile] && (_tHeight = MACRO_CALL_MEMBER( OpenSHC::Map::TileMapState_Func::getTotalHeightAtTile, DAT_TileMapState::ptr)(_tile), - _heightDiff = _unitHeight - _tHeight, - _absHeight = (int)_heightDiff >> 0x1f, + _heightDiff = _unitHeight - _tHeight, _absHeight = (int)_heightDiff >> 0x1f, (int)((_heightDiff ^ _absHeight) - _absHeight) < 16)) { this->ALG_ResultX = (int)_x; this->ALG_ResultY = (int)_y; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d8c0861918..cba5d6f035 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24681,7 +24681,7 @@ SHC_3BB0A8C1_0x0049D0E0 | 57.1% | signed unit layer local SHC_3BB0A8C1_0x0049D240 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D340 | 64.6% | Style pass, asm differs +SHC_3BB0A8C1_0x0049D340 | 67.3% | signed unit layer local SHC_3BB0A8C1_0x0049D470 | 0.0% | Pending From 1254c44871124b8b14b9c21448c1fe0d26200131 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:37:55 +0200 Subject: [PATCH 420/516] reimplement: SHC_3BB0A8C1_0x004A79A0 64.06% compare order from asm --- .../Navigation/PathFindingState/pathPlanningForTribe.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index 4267d33e50..da78c2dfaa 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -162,7 +162,7 @@ namespace Map { _destIndex = _destIndex + 1; *_pDest1 = 1; _pDest1 = _pDest1 + 3; - if (unitCount <= _destIndex) { + if (_destIndex >= unitCount) { return; } } @@ -202,7 +202,7 @@ namespace Map { = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; *_pDest2 = 1; _pDest2 = _pDest2 + 3; - if (unitCount <= _destIndex) { + if (_destIndex >= unitCount) { return; } } @@ -228,7 +228,7 @@ namespace Map { _destIndex = _destIndex + 1; *_pDest3 = 0; _pDest3 = _pDest3 + 3; - if (unitCount <= _destIndex) { + if (_destIndex >= unitCount) { return; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index cba5d6f035..b9f8075291 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field SHC_3BB0A8C1_0x004A75B0 | 47.0% | compare operand order -SHC_3BB0A8C1_0x004A79A0 | 63.8% | statement order +SHC_3BB0A8C1_0x004A79A0 | 64.1% | compare order from asm SHC_3BB0A8C1_0x004A7F50 | 57.6% | bound literal from asm From 0c4b1d786fa0d6ec32b3f2e30f40b8a51abbfb6c Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:37:55 +0200 Subject: [PATCH 421/516] reimplement: SHC_3BB0A8C1_0x004A75B0 47.39% bound literal from asm --- .../PathFindingState/pathfindingForAttacksUnk.cpp | 7 ++++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp index c31e962393..79df573ae5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -6,10 +6,10 @@ #include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" #include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" -#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" #include "OpenSHC/Globals/DAT_BuildingsState.hpp" #include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_TribesState.hpp" #include "OpenSHC/Globals/DAT_UnitsState.hpp" @@ -56,7 +56,7 @@ namespace Map { BOOLEnum BVar4 = MACRO_CALL_MEMBER( OpenSHC::Map::Units::TribesState_Func::isTribeAllAssassins, DAT_TribesState::ptr)(tribeID); param_3 = param_3 * 2; - if (param_3 < 0x1f5) { + if (param_3 <= 500) { if (param_3 < 0x32) { param_3 = 0x32; } @@ -164,7 +164,8 @@ namespace Map { && (BVar6 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanReachUsingCachedAreaLogic, - DAT_PathFindingState::ptr)(DAT_UnitsState::instance.units[sVar2].tile, tile2), + DAT_PathFindingState::ptr)( + DAT_UnitsState::instance.units[sVar2].tile, tile2), BVar6 != FALSE)))) && (uVar7 = (int)DAT_BuildingsState::instance.buildings[buildingID].terrainHeightUnk - (uint)DAT_TileMapState::instance.HeightLayer[tile2], diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b9f8075291..79b6f68b29 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25299,7 +25299,7 @@ SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field -SHC_3BB0A8C1_0x004A75B0 | 47.0% | compare operand order +SHC_3BB0A8C1_0x004A75B0 | 47.4% | bound literal from asm SHC_3BB0A8C1_0x004A79A0 | 64.1% | compare order from asm From 7aad42224c878a46bad54c800064250180b36f3d Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:51:11 +0200 Subject: [PATCH 422/516] reimplement: SHC_3BB0A8C1_0x004A3220 77.16% signed start row local --- .../findAccessibleWallAndNearbyFreeTile.cpp | 8 ++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp index 73a5f4a3f4..1e8814733d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp @@ -36,10 +36,10 @@ namespace Map { MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } - this->searchQueue.yQueue[0] - = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; - this->searchQueue.xQueue[0] = (short)tile - - (short)DAT_ViewportRenderState::instance.translationMatrix[this->searchQueue.yQueue[0]].addXgetTile; + int _startY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; + this->searchQueue.yQueue[0] = (short)_startY; + this->searchQueue.xQueue[0] + = (short)tile - (short)DAT_ViewportRenderState::instance.translationMatrix[_startY].addXgetTile; this->searchQueue.tilesQueue[0] = tile; this->searchQueue.readIndex = 0; this->searchQueue.writeIndex = 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 79b6f68b29..ab9ff14ff0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25207,7 +25207,7 @@ SHC_3BB0A8C1_0x004A2F00 | 0.0% | Pending SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3220 | 76.5% | Style pass, asm differs +SHC_3BB0A8C1_0x004A3220 | 77.2% | signed start row local SHC_3BB0A8C1_0x004A36B0 | 82.5% | statement order From 7e1fa145e7cca7ff74221e854b7b6aa4c35d70f0 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:51:11 +0200 Subject: [PATCH 423/516] reimplement: SHC_3BB0A8C1_0x004A36B0 82.74% signed queue reads --- .../PathFindingState/healUnitsOfPlayerWithinRadius.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp index 9bad23fe2a..d736ed849b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/healUnitsOfPlayerWithinRadius.cpp @@ -48,9 +48,9 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], uVar4 <= 0x13a0f) { - short sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar1 = this->searchQueue.xQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; - short sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; + int sVar2 = this->searchQueue.yQueue[this->searchQueue.readIndex]; if (0x13a10 < (int)this->searchQueue.currentDistance) { return (undefined4)(0); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ab9ff14ff0..781019e7e9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25209,7 +25209,7 @@ SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3220 | 77.2% | signed start row local -SHC_3BB0A8C1_0x004A36B0 | 82.5% | statement order +SHC_3BB0A8C1_0x004A36B0 | 82.7% | signed queue reads SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending From 36920f356b68076c9395a830677188550160f5ef Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 22:51:12 +0200 Subject: [PATCH 424/516] reimplement: SHC_3BB0A8C1_0x004A2DD0 77.83% signed start row local --- .../PathFindingState/igniteFireAtTilesDistanceAway.cpp | 8 ++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp index 9cd20757f0..a36b0446e5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp @@ -37,10 +37,10 @@ namespace Map { MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } - this->searchQueue.yQueue[0] - = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; - this->searchQueue.xQueue[0] = (short)tile - - (short)DAT_ViewportRenderState::instance.translationMatrix[this->searchQueue.yQueue[0]].addXgetTile; + int _startY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[tile]; + this->searchQueue.yQueue[0] = (short)_startY; + this->searchQueue.xQueue[0] + = (short)tile - (short)DAT_ViewportRenderState::instance.translationMatrix[_startY].addXgetTile; this->searchQueue.tilesQueue[0] = tile; this->searchQueue.readIndex = 0; this->searchQueue.writeIndex = 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 781019e7e9..99dcc69c6d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25201,7 +25201,7 @@ SHC_3BB0A8C1_0x004A2DC4 | 0.0% | Pending SHC_3BB0A8C1_0x004A2DC8 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2DD0 | 77.2% | statement order +SHC_3BB0A8C1_0x004A2DD0 | 77.8% | signed start row local SHC_3BB0A8C1_0x004A2F00 | 0.0% | Pending From 1e1c1df520291292aa5902f5cd88f624df306aad Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:10:52 +0200 Subject: [PATCH 425/516] reimplement: SHC_3BB0A8C1_0x00498FD0 19.87% tail-merged if chain --- .../commitUnitPathPlanUsingWalkLayer.cpp | 67 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 33 insertions(+), 36 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp index f7c5b657d1..642e6f1563 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -49,25 +49,22 @@ namespace Map { if ((short)DAT_TileMapState::instance.PathConnectionLayer[_tile] == 0) { return 0; } - switch (param_1) { - case 0: - iVar6 = 80; - break; - case 1: - iVar6 = 200; - break; - case 2: - iVar6 = 500; - break; - case 3: - iVar6 = 1000; - break; - default: - iVar6 = 2000; - break; + if (param_1 == 0) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, + DAT_PathFindingState::ptr)(this->unitX, this->unitY, -1, -1, 80, 0); + } else if (param_1 == 1) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, + DAT_PathFindingState::ptr)(this->unitX, this->unitY, -1, -1, 200, 0); + } else if (param_1 == 2) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, + DAT_PathFindingState::ptr)(this->unitX, this->unitY, -1, -1, 500, 0); + } else if (param_1 == 3) { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, + DAT_PathFindingState::ptr)(this->unitX, this->unitY, -1, -1, 1000, 0); + } else { + MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, + DAT_PathFindingState::ptr)(this->unitX, this->unitY, -1, -1, 2000, 0); } - MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::findSuitableSpawnLocationUnk, - DAT_PathFindingState::ptr)(this->unitX, this->unitY, -1, -1, iVar6, 0); local_14 = 10; _walkLayer = (short)DAT_TileMapState::instance.WalkLayer[_tile]; _rng = (short)SEC_RNG::instance.currentNumber2; @@ -91,8 +88,8 @@ namespace Map { if (_inBounds == 0) { if ((_cp & 0x8000) == 0 && (uVar3 = _cp & 0x3fff, (int)_init_10 <= (int)uVar3) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) - + uVar3; + uVar2 + = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) + uVar3; uVar5 = uVar2; if (iVar4 + -2 == iVar6) { uVar5 = uVar2 + 1; @@ -108,8 +105,8 @@ namespace Map { } else if (_inBounds == 1) { if ((_cp & 0x4000) == 0 && (uVar3 = _cp & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = uVar3 - - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); + uVar2 + = uVar3 - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); uVar5 = uVar2; if (iVar4 + -2 == iVar6) { uVar5 = uVar2 - 1; @@ -130,8 +127,8 @@ namespace Map { if (_inBounds == 0) { if ((_cp & 0x8000) == 0 && (uVar3 = _cp & 0x3fff, (int)_init_10 <= (int)uVar3) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) - + uVar3; + uVar2 + = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) + uVar3; uVar5 = uVar2; if (iVar4 + -1 == iVar6) { uVar5 = uVar2 + 1; @@ -147,8 +144,8 @@ namespace Map { } else if (_inBounds == 1) { if ((_cp & 0x4000) == 0 && (uVar3 = _cp & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = uVar3 - - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); + uVar2 + = uVar3 - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); uVar5 = uVar2; if (iVar4 + -1 == iVar6) { uVar5 = uVar2 - 1; @@ -169,8 +166,8 @@ namespace Map { if (_inBounds == 0) { if ((_cp & 0x8000) == 0 && (uVar3 = _cp & 0x3fff, (int)_init_10 <= (int)uVar3) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) - + uVar3; + uVar2 + = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) + uVar3; uVar5 = uVar2; if (iVar4 == iVar6) { uVar5 = uVar2 + 1; @@ -185,8 +182,8 @@ namespace Map { } else if (_inBounds == 1) { if ((_cp & 0x4000) == 0 && (uVar3 = _cp & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = uVar3 - - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); + uVar2 + = uVar3 - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); uVar5 = uVar2; if (iVar4 == iVar6) { uVar5 = uVar2 - 1; @@ -206,8 +203,8 @@ namespace Map { if (_inBounds == 0) { if ((_cp & 0x8000) == 0 && (uVar3 = _cp & 0x3fff, (int)_init_10 <= (int)uVar3) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) - + uVar3; + uVar2 + = ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7) + uVar3; uVar5 = uVar2; if (iVar4 + 1 == iVar6) { uVar5 = uVar2 + 1; @@ -223,8 +220,8 @@ namespace Map { } else if (_inBounds == 1) { if ((_cp & 0x4000) == 0 && (uVar3 = _cp & 0x3fff, (int)uVar3 <= (int)_init_10) && (param_3 == 0 || (uVar3 != _init_10))) { - uVar2 = uVar3 - - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); + uVar2 + = uVar3 - ((DAT_TileMapState::instance.RandomLayer[_candidateTile] ^ _rng) & 7); uVar5 = uVar2; if (iVar4 + 1 == iVar6) { uVar5 = uVar2 - 1; @@ -241,7 +238,7 @@ namespace Map { } _ptrTranslationMatrix = _ptrTranslationMatrix + 4; iVar4 = iVar4 + 4; - } while (iVar4 < 10); + } while (iVar4 + -2 < 8); if (_inBounds == 0) { DAT_TileMapState::instance.CertainPathLayer[_tile] = DAT_TileMapState::instance.CertainPathLayer[_tile] | 0x8000; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 99dcc69c6d..0c0393c1d3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24381,7 +24381,7 @@ SHC_3BB0A8C1_0x00498A40 | 82.2% | fix off-by-one maxTries SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 17.2% | statement order +SHC_3BB0A8C1_0x00498FD0 | 19.9% | tail-merged if chain SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending From 5f45e4f6241dc1fe6693c4020286e58b74c00378 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:10:52 +0200 Subject: [PATCH 426/516] reimplement: SHC_3BB0A8C1_0x00497280 52.24% 16-bit height arithmetic --- .../PathFindingState/doMoveFromTileToTile.cpp | 12 ++++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp index be82ba7142..1e27b98ee9 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp @@ -29,13 +29,13 @@ namespace Map { BOOLEnum PathFindingState::doMoveFromTileToTile( int unitID, int tile, int y, int direction, int param_5, int ignoreAssassinClimbing) { - int bVar2; + byte bVar2; uint uVar3; int _targetTile; uint uVar4; - int _terrainHeight2; - int _height; - int _terrainHeight; + ushort _terrainHeight2; + ushort _height; + ushort _terrainHeight; if (param_5 != 0) { if (param_5 == 1) { if ((DAT_TileMapState::instance @@ -76,7 +76,7 @@ namespace Map { DAT_UnitsState::instance.units[unitID].state.generic = OpenSHC::Map::Units::States::US_ASSASSIN_THROWING_HOOK; DAT_UnitsState::instance.units[unitID].assassinHeightDifference - = (ushort)_terrainHeight - (ushort)_height; + = _terrainHeight - _height; DAT_UnitsState::instance.units[unitID].assassinClimbingUpUnk_OR_previousFacingDirection = 1; DAT_UnitsState::instance.units[unitID].ownerOfAssassinScaledObject = (bVar2 & 7) + 1; @@ -85,7 +85,7 @@ namespace Map { DAT_UnitsState::instance.units[unitID].state.generic = OpenSHC::Map::Units::States::US_ASSASSIN_START_CLIMBING_DOWN; DAT_UnitsState::instance.units[unitID].assassinHeightDifference - = (ushort)_height - (ushort)_terrainHeight2; + = _height - _terrainHeight2; DAT_UnitsState::instance.units[unitID].assassinClimbingUpUnk_OR_previousFacingDirection = 0; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0c0393c1d3..f6679d13dd 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24359,7 +24359,7 @@ SHC_3BB0A8C1_0x00497080 | 78.1% | hoist signed start-tile read SHC_3BB0A8C1_0x00497180 | 78.3% | hoist signed start-tile reads -SHC_3BB0A8C1_0x00497280 | 48.9% | Style pass, asm differs +SHC_3BB0A8C1_0x00497280 | 52.2% | 16-bit height arithmetic SHC_3BB0A8C1_0x004974D0 | 32.1% | statement order From b4eae025defdf52f7505d68a51475588e4794fe4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:10:52 +0200 Subject: [PATCH 427/516] reimplement: SHC_3BB0A8C1_0x004A15B0 91.16% hoisted squared distance --- .../Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp | 7 +++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp index 64e0534c4d..78dfb7f648 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isEnemyTooCloseUnk.cpp @@ -30,6 +30,7 @@ namespace Map { if (DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return FALSE; } + int _requiredDistanceSquared = requiredDistance * requiredDistance; int* _pEnemyUid = DAT_GameState::instance.mapAndTime.playerEnemenyUnitUIDShortList[playerID]; _enemies = DAT_GameState::instance.playerDataArray[playerID].enemies; _enemyLoopCounter = 0; @@ -38,13 +39,11 @@ namespace Map { do { _enemyID = *_enemyIdPtr; if (DAT_UnitsState::instance.units[_enemyID].dying == 0 - && DAT_UnitsState::instance.units[_enemyID].uid - == DAT_GameState::instance.mapAndTime - .playerEnemenyUnitUIDShortList[playerID][_enemyLoopCounter] + && DAT_UnitsState::instance.units[_enemyID].uid == _pEnemyUid[_enemyLoopCounter] && (_xEnemyDistance = x - (int)DAT_UnitsState::instance.units[_enemyID].x, _yEnemyDistance = y - (int)DAT_UnitsState::instance.units[_enemyID].y, _yEnemyDistance * _yEnemyDistance + _xEnemyDistance * _xEnemyDistance - < requiredDistance * requiredDistance + < _requiredDistanceSquared && ((DAT_UnitsState::instance.units[_enemyID].unknownTestAgainst0_2 == 0 && (DAT_UnitsState::instance.units[_enemyID].moveRelatedFlag != 1)))) && DAT_UnitsState::instance.units[_enemyID].isStalked == 0 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f6679d13dd..60e3474a19 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25011,7 +25011,7 @@ SHC_3BB0A8C1_0x004A15AE | 0.0% | Pending SHC_3BB0A8C1_0x004A15AF | 0.0% | Pending -SHC_3BB0A8C1_0x004A15B0 | 36.1% | named UID array + base pointer +SHC_3BB0A8C1_0x004A15B0 | 91.2% | hoisted squared distance SHC_3BB0A8C1_0x004A16C0 | 97.3% | reuse computed start tile From e7f0f1f60dc769d4e8a17fc3e01d39eb6af186a9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:10:53 +0200 Subject: [PATCH 428/516] reimplement: SHC_3BB0A8C1_0x004A97D0 31.19% start-tile masks hoisted --- .../traceAndCommitPathPlan.cpp | 23 +++++++++++-------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp index 92a8997a58..2d10fde371 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp @@ -25,6 +25,7 @@ namespace Map { { uint uVar3; int iVar4; + int _buildingAtTile; uint uVar5; if (x <= 399 && y <= 399 && DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] != '\0' && x2 <= 399 && y2 <= 399 @@ -39,6 +40,8 @@ namespace Map { if (tile == iVar2 + x) break; uint _theDirection = 8; + uint _startGate = DAT_TileMapState::instance.LogicLayer[tile] & 0x40000000; + uint _startDoor = DAT_TileMapState::instance.LogicLayer[tile] & 0x100; for (uint _direction = 0; (int)_direction < 8; _direction = _direction + 1) { if (param_5 == 1) { if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction] @@ -65,9 +68,11 @@ namespace Map { && (iVar4 = DAT_TileMapState::instance.directionTranslationMatrix[y2][_direction] + tile, - DAT_TileMapState::instance.BuildingLayer[tile] == 0 - && (DAT_TileMapState::instance.BuildingLayer[iVar4] == 0))) { - if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x100U) == 0) { + _buildingAtTile = (short)DAT_TileMapState::instance.BuildingLayer[tile], + _buildingAtTile == 0 + && ((short)DAT_TileMapState::instance.BuildingLayer[iVar4] + == _buildingAtTile))) { + if (_startDoor == 0) { uVar3 = DAT_TileMapState::instance.LogicLayer[iVar4] & 0x100; goto joined_r0x004a99a9; } @@ -83,7 +88,7 @@ namespace Map { != 0) goto LAB_004a99b6; iVar4 = DAT_TileMapState::instance.directionTranslationMatrix[y2][_direction] + tile; - if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x40000000U) == 0) { + if (_startGate == 0) { uVar3 = DAT_TileMapState::instance.LogicLayer[iVar4] & 0x40000000; joined_r0x004a99a9: if (uVar3 != 0) @@ -129,21 +134,21 @@ namespace Map { == 0))) { this->field49_0x94 = this->field49_0x94 + 1; } - iVar4 = _theDirection + 4; - if (7 < iVar4) { - iVar4 = _theDirection - 4; + _theDirection = _theDirection + 4; + if (7 < (int)_theDirection) { + _theDirection = _theDirection - 8; } /* commit path plan */ if ((this->searchQueue.pathPlanIndex & 1) == 0) { - this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] = (byte)iVar4; + this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] = (byte)_theDirection; } else { this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] = this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] & 0xf; this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] = this->searchQueue.ptrPathPlan[(int)this->searchQueue.pathPlanIndex / 2] - + (byte)iVar4 * '\x10'; + + (byte)_theDirection * '\x10'; } tile = x2; this->searchQueue.pathPlanIndex = this->searchQueue.pathPlanIndex + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 60e3474a19..8dc3b4ad3f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25465,7 +25465,7 @@ SHC_3BB0A8C1_0x004A96B0 | 0.0% | Pending SHC_3BB0A8C1_0x004A9760 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A97D0 | 21.6% | counted direction loop; flag-b +SHC_3BB0A8C1_0x004A97D0 | 31.2% | start-tile masks hoisted SHC_3BB0A8C1_0x004A98C0 | 0.0% | Pending From acf53dbcea40e5e8c13992b349c9a61942ea19e2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:10:53 +0200 Subject: [PATCH 429/516] reimplement: SHC_3BB0A8C1_0x004995E0 63.84% flood-fill loop in asm --- .../PathFindingState/LinkageNeighbourAsm.hpp | 35 ++++++++++++++++--- .../updateSeparateAreaTileMap.cpp | 20 +++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp b/src/OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp index 258744835c..9320f9482d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/LinkageNeighbourAsm.hpp @@ -189,10 +189,7 @@ __asm add WRITEIDX, 1 \ __asm push_done_##ID##_##N: -#define MACRO_LINKAGE_EXPAND_AREA_NEIGHBOURS(ID, WRITEIDX) \ - __asm mov edx, _tile \ - __asm mov edi, _areaLayer \ - __asm mov ebx, _cLink \ +#define MACRO_LINKAGE_AREA_PUSHES(ID, WRITEIDX) \ MACRO_LINKAGE_PUSH_AREA(ID, w, WRITEIDX, -2, 0x40, MACRO_ASM_DEC, MACRO_ASM_SAME) \ MACRO_LINKAGE_PUSH_AREA(ID, e, WRITEIDX, +2, 0x04, MACRO_ASM_INC, MACRO_ASM_SAME) \ __asm mov edx, _tile \ @@ -213,4 +210,34 @@ MACRO_LINKAGE_PUSH_AREA(ID, s, WRITEIDX, 0, 0x10, MACRO_ASM_SAME, MACRO_ASM_INC) \ MACRO_LINKAGE_PUSH_AREA(ID, se, WRITEIDX, +2, 0x08, MACRO_ASM_INC, MACRO_ASM_INC) +// The flood-fill's inner loop as the original writes it (0x00499711): the loop test, the +// zone-size counter bump and the three per-entry loads are handwritten too, and what they leave +// in edx (the tile), bl (the linkage byte) and edi (the area layer) is what the pushes consume - +// which is why those no longer reload them. Needs "int* _zoneSizes" and "uchar* _linkage" +// beside the locals the pushes use, "int _tile" and "int _cY" declared outside the loop, and +// the area id as a short, since the original keeps it in a 16-bit register. +#define MACRO_LINKAGE_AREA_LOOP(ID, READIDX, WRITEIDX) \ + __asm mov edi, _areaLayer \ + __asm area_loop_##ID: \ + __asm mov ecx, READIDX \ + __asm cmp ecx, WRITEIDX \ + __asm je area_loop_done_##ID \ + __asm mov esi, _zoneSizes \ + __asm mov eax, 0 \ + __asm mov edx, 1 \ + __asm mov ax, word ptr _areaID \ + __asm add dword ptr [esi + eax*4], edx \ + __asm mov esi, _tilesQueue \ + __asm mov edx, dword ptr [esi + ecx*4] \ + __asm mov _tile, edx \ + __asm mov esi, _yQueue \ + __asm mov eax, 0 \ + __asm mov ax, word ptr [esi + ecx*2] \ + __asm mov _cY, eax \ + __asm mov ebx, _linkage \ + __asm mov bl, byte ptr [ebx + edx] \ + MACRO_LINKAGE_AREA_PUSHES(ID, WRITEIDX) \ + __asm add READIDX, 1 \ + __asm jmp area_loop_##ID \ + __asm area_loop_done_##ID: // clang-format on diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp index edd1d736e6..a2df65031e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp @@ -59,7 +59,11 @@ namespace Map { int* _tilesQueue = this->searchQueue.tilesQueue; short* _yQueue = this->searchQueue.yQueue; int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; - int _areaID = 1; + uchar* _linkage = DAT_TileMapState::instance.PathLinkageLayer; + int* _zoneSizes = this->zoneSizesArray; + int _tile; + int _cY; + short _areaID = 1; int _row = 0; int* _rowEnd = &DAT_ViewportRenderState::instance.translationMatrix[1].firstTileOfRow; for (int _first = 0; _first < 80400; _first = _first + 1) { @@ -75,14 +79,8 @@ namespace Map { this->searchQueue.yQueue[0] = _row; DAT_TileMapState::instance.PathConnectionLayer[_first] = _areaID; forceUpdate = 1; - for (int _readIndex = 0; _readIndex != forceUpdate; _readIndex = _readIndex + 1) { - this->zoneSizesArray[(ushort)_areaID] = this->zoneSizesArray[(ushort)_areaID] + 1; - int _tile = this->searchQueue.tilesQueue[_readIndex]; - int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; - int _cLink = DAT_TileMapState::instance.PathLinkageLayer[_tile]; - - MACRO_LINKAGE_EXPAND_AREA_NEIGHBOURS(1, forceUpdate) - } + int _readIndex = 0; + MACRO_LINKAGE_AREA_LOOP(1, _readIndex, forceUpdate) _areaID = _areaID + 1; if (999 < _areaID) { break; @@ -91,7 +89,9 @@ namespace Map { this->totalZones = (int)_areaID; int* _zoneSize = this->zoneSizesArray + 2; for (int _group = 333; _group != 0; _group = _group - 1) { - this->sum = _zoneSize[1] + this->sum + _zoneSize[-1] + *_zoneSize; + this->sum = this->sum + _zoneSize[-1]; + this->sum = this->sum + *_zoneSize; + this->sum = this->sum + _zoneSize[1]; _zoneSize = _zoneSize + 3; } MACRO_CALL_MEMBER( diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8dc3b4ad3f..e51eb3953d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24385,7 +24385,7 @@ SHC_3BB0A8C1_0x00498FD0 | 19.9% | tail-merged if chain SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004995E0 | 50.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004995E0 | 63.8% | flood-fill loop in asm SHC_3BB0A8C1_0x00499970 | 0.0% | Pending From 73ff3b5d382eba9582f23c54fd79409b54f5fd0e Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:25:08 +0200 Subject: [PATCH 430/516] reimplement: SHC_3BB0A8C1_0x004A3B20 46.62% signed rng modulo idioms --- .../certainDamageToUnitsUnk.cpp | 35 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index 43314f7fa0..e5a8b8d3bc 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -92,7 +92,7 @@ namespace Map { && DAT_UnitsState::instance.units[iVar9].unitType != OpenSHC::Map::Units::UT_LORD) { DAT_UnitsState::instance.units[iVar9].health = DAT_UnitsState::instance.units[iVar9].health - param_4; - if ((DAT_UnitsState::instance.units[iVar9].health < 1) + if ((DAT_UnitsState::instance.units[iVar9].health <= 0) && (DAT_UnitsState::instance.units[iVar9].dying == 0)) { DAT_UnitsState::instance.units[iVar9].health = 0; DAT_UnitsState::instance.units[iVar9].dying = 1; @@ -109,8 +109,7 @@ namespace Map { = OpenSHC::Map::Units::States::US_STONE_DEATH_01; MACRO_CALL_MEMBER(OpenSHC::Audio::SFX::SFXState_Func::playSFXAtLocation, DAT_SFXState::ptr)((short)DAT_UnitsState::instance.units[iVar9].x, - (short)DAT_UnitsState::instance.units[iVar9].y, - OpenSHC::DE::SHCDE::FX_SPLAT); + (short)DAT_UnitsState::instance.units[iVar9].y, OpenSHC::DE::SHCDE::FX_SPLAT); } DAT_UnitsState::instance.units[iVar9].tunnelerFinishedDigging = 1; } @@ -125,18 +124,16 @@ namespace Map { } uVar4 = DAT_UnitsState::instance.units[iVar9].nextUnitOnTheSameTile; } - uVar7 = (uint)SEC_RNG::instance.currentNumber2; + int _random = (int)SEC_RNG::instance.currentNumber2; MACRO_CALL_MEMBER(OpenSHC::Random::RNG_Func::nextRandomNumber2, SEC_RNG::ptr)(); - if ((uVar7 & 1) == 0) { + if ((_random & 1) == 0) { iVar11 = (int)SEC_RNG::instance.currentNumber2; MACRO_CALL_MEMBER(OpenSHC::Random::RNG_Func::nextRandomNumber2, SEC_RNG::ptr)(); iVar9 = sVar3 * 8; - MACRO_CALL_MEMBER( - OpenSHC::Map::Entities::EntityState_Func::spawnProjectileEntity, DAT_EntityState::ptr)(0, - (undefined4)((int)(param_3)), 0, (int)(((uVar7 >> 4) % 0x32 + 0x32) * local_4 + sVar2 * 8), - iVar9 + (iVar11 / 0x32) * -0x32 + -0x19 + iVar11, - (int)((uint)DAT_TileMapState::instance.HeightLayer[uVar1] + (uVar7 / 1000) * -1000 + 500 - + uVar7), + MACRO_CALL_MEMBER(OpenSHC::Map::Entities::EntityState_Func::spawnProjectileEntity, + DAT_EntityState::ptr)(0, (undefined4)((int)(param_3)), 0, + (int)(((_random >> 4) % 0x32 + 0x32) * local_4 + sVar2 * 8), iVar9 + iVar11 % 0x32 + -0x19, + (int)(DAT_TileMapState::instance.HeightLayer[uVar1] + _random % 1000 + 500), (int)(sVar2 * 8 + 4), iVar9 + 4, (int)(DAT_TileMapState::instance.HeightLayer[uVar1]), local_8, 0); } @@ -145,8 +142,8 @@ namespace Map { if (DAT_TileMapState::instance.WalkLayer[iVar9] != this->searchGeneration && (DAT_TileMapState::instance.LogicLayer[iVar9] & 0x30) == 0) { DAT_TileMapState::instance.CertainPathLayer[iVar9] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; + = (ushort)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar9] = (ushort)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.xOffset @@ -165,8 +162,8 @@ namespace Map { if (DAT_TileMapState::instance.WalkLayer[iVar9] != this->searchGeneration && (DAT_TileMapState::instance.LogicLayer[iVar9] & 0x30) == 0) { DAT_TileMapState::instance.CertainPathLayer[iVar9] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; + = (ushort)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar9] = (ushort)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] .short_.xOffset @@ -185,8 +182,8 @@ namespace Map { if (DAT_TileMapState::instance.WalkLayer[iVar9] != this->searchGeneration && (DAT_TileMapState::instance.LogicLayer[iVar9] & 0x30) == 0) { DAT_TileMapState::instance.CertainPathLayer[iVar9] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; + = (ushort)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar9] = (ushort)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] .short_.xOffset @@ -205,8 +202,8 @@ namespace Map { if (DAT_TileMapState::instance.WalkLayer[iVar9] != this->searchGeneration && (DAT_TileMapState::instance.LogicLayer[iVar9] & 0x30) == 0) { DAT_TileMapState::instance.CertainPathLayer[iVar9] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; + = (ushort)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar9] = (ushort)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] .short_.xOffset diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e51eb3953d..144942036f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 44.4% | per-arm SFX call and health st +SHC_3BB0A8C1_0x004A3B20 | 46.6% | signed rng modulo idioms SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From 34d5e7d47ac59464f3b506271c8a4e00ae5acdd3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:25:09 +0200 Subject: [PATCH 431/516] reimplement: SHC_3BB0A8C1_0x004A7F50 59.63% clamp arms from asm --- ...tToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 8 +++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 293dc839d7..d24a2b9018 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -68,12 +68,10 @@ namespace Map { 160800, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } maxDestinations = maxDestinations * 2; - if (maxDestinations <= 500) { - if (maxDestinations < 0x32) { - maxDestinations = 0x32; - } - } else { + if (500 < maxDestinations) { maxDestinations = 500; + } else if (maxDestinations < 0x32) { + maxDestinations = 0x32; } this->searchQueue.writeIndex = 1; this->searchQueue.currentDistance = 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 144942036f..1c62456b58 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25303,7 +25303,7 @@ SHC_3BB0A8C1_0x004A75B0 | 47.4% | bound literal from asm SHC_3BB0A8C1_0x004A79A0 | 64.1% | compare order from asm -SHC_3BB0A8C1_0x004A7F50 | 57.6% | bound literal from asm +SHC_3BB0A8C1_0x004A7F50 | 59.6% | clamp arms from asm SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending From 03aca78aa3b4112a2273b1e6ba99a8056d423765 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:25:09 +0200 Subject: [PATCH 432/516] reimplement: SHC_3BB0A8C1_0x004A75B0 49.25% clamp arms from asm --- .../PathFindingState/pathfindingForAttacksUnk.cpp | 8 +++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp index 79df573ae5..0392348f0f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingForAttacksUnk.cpp @@ -56,12 +56,10 @@ namespace Map { BOOLEnum BVar4 = MACRO_CALL_MEMBER( OpenSHC::Map::Units::TribesState_Func::isTribeAllAssassins, DAT_TribesState::ptr)(tribeID); param_3 = param_3 * 2; - if (param_3 <= 500) { - if (param_3 < 0x32) { - param_3 = 0x32; - } - } else { + if (500 < param_3) { param_3 = 500; + } else if (param_3 < 0x32) { + param_3 = 0x32; } iVar14 = DAT_BuildingDefinedData::instance.BuildingAccessibleTilesCount[uVar7]; local_20 = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 1c62456b58..8814dcda9a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25299,7 +25299,7 @@ SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field -SHC_3BB0A8C1_0x004A75B0 | 47.4% | bound literal from asm +SHC_3BB0A8C1_0x004A75B0 | 49.2% | clamp arms from asm SHC_3BB0A8C1_0x004A79A0 | 64.1% | compare order from asm From a79c9a4f34a37d821fb8e2ecba19b582852063cc Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:39:08 +0200 Subject: [PATCH 433/516] reimplement: SHC_3BB0A8C1_0x004A1D30 70.06% signed building type read --- .../Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp index ab8a025391..12098bd8f7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -67,7 +67,7 @@ namespace Map { } short sVar3 = DAT_TileMapState::instance.BuildingLayer[iVar5]; if (sVar3 != 0) { - BuildingTypeShort BVar4 = DAT_BuildingsState::instance.buildings[sVar3].buildingType; + int BVar4 = (short)DAT_BuildingsState::instance.buildings[sVar3].buildingType; if (BVar4 != OpenSHC::Map::Buildings::BT_QUARRY && BVar4 != OpenSHC::Map::Buildings::BT_KILLINGPIT && DAT_GameState::instance.mapAndTime diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8814dcda9a..d327f2319b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25171,7 +25171,7 @@ SHC_3BB0A8C1_0x004A1C40 | 98.7% | compare operand order SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1D30 | 68.1% | statement order +SHC_3BB0A8C1_0x004A1D30 | 70.1% | signed building type read SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending From e6d319ce552619c02681f415b1e5d3ca8e19f252 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:50:06 +0200 Subject: [PATCH 434/516] reimplement: SHC_3BB0A8C1_0x004A5320 68.75% plain while loop --- ...teCanPlayerUnitsNavigateToAreaFromArea.cpp | 94 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 47 insertions(+), 49 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index d545e6e495..ad7d4acc33 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -45,8 +45,8 @@ namespace Map { continue; } if (((playerID == 0 - || (DAT_GameState::instance.mapAndTime.playerTeams[this->climbData[iVar7].owner] - == DAT_GameState::instance.mapAndTime.playerTeams[playerID])) + || (DAT_GameState::instance.mapAndTime.playerTeams[this->climbData[iVar7].owner] + == DAT_GameState::instance.mapAndTime.playerTeams[playerID])) || (DAT_BuildingsState::instance.buildings[this->climbData[iVar7].buildingID] .field239_0x2c6 != 0))) { @@ -227,18 +227,34 @@ namespace Map { iVar6 = iVar6 + 1; } while (iVar6 < local_96c); } - if (local_968 < iVar5) { - do { - dVar2 = adStack_960[local_968]; - local_968 = local_968 + 1; - iVar6 = 0; - if (0 < local_96c) { - do { - if (aiStack_640[iVar6 * 2 + 1] != 1) { - iVar1 = aiStack_640[iVar6 * 2]; - dVar3 = this->climbData[iVar1].area; - if (dVar3 == dVar2) { - dVar3 = this->climbData[iVar1].wallGroupAreaID; + while (local_968 < iVar5) { + dVar2 = adStack_960[local_968]; + local_968 = local_968 + 1; + iVar6 = 0; + if (0 < local_96c) { + do { + if (aiStack_640[iVar6 * 2 + 1] != 1) { + iVar1 = aiStack_640[iVar6 * 2]; + dVar3 = this->climbData[iVar1].area; + if (dVar3 == dVar2) { + dVar3 = this->climbData[iVar1].wallGroupAreaID; + if (dVar3 == fromArea) { + return (int)(dVar2); + } + dVar4 = this->climbData[iVar1].buildingArea; + if (dVar4 == fromArea) { + return (int)(dVar2); + } + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; + aiStack_640[iVar6 * 2 + 1] = 1; + if (0 < (int)dVar4) { + adStack_960[iVar5] = dVar4; + iVar5 = iVar5 + 1; + } + } else { + dVar4 = this->climbData[iVar1].wallGroupAreaID; + if (dVar4 == dVar2) { if (dVar3 == fromArea) { return (int)(dVar2); } @@ -247,48 +263,30 @@ namespace Map { return (int)(dVar2); } adStack_960[iVar5] = dVar3; - iVar5 = iVar5 + 1; aiStack_640[iVar6 * 2 + 1] = 1; + iVar5 = iVar5 + 1; if (0 < (int)dVar4) { adStack_960[iVar5] = dVar4; iVar5 = iVar5 + 1; } - } else { - dVar4 = this->climbData[iVar1].wallGroupAreaID; - if (dVar4 == dVar2) { - if (dVar3 == fromArea) { - return (int)(dVar2); - } - dVar4 = this->climbData[iVar1].buildingArea; - if (dVar4 == fromArea) { - return (int)(dVar2); - } - adStack_960[iVar5] = dVar3; - aiStack_640[iVar6 * 2 + 1] = 1; - iVar5 = iVar5 + 1; - if (0 < (int)dVar4) { - adStack_960[iVar5] = dVar4; - iVar5 = iVar5 + 1; - } - } else if (this->climbData[iVar1].buildingArea == dVar2) { - if (dVar3 == fromArea) { - return (int)(dVar2); - } - if (dVar4 == fromArea) { - return (int)(dVar2); - } - adStack_960[iVar5] = dVar3; - iVar5 = iVar5 + 1; - aiStack_640[iVar6 * 2 + 1] = 1; - adStack_960[iVar5] = dVar4; - iVar5 = iVar5 + 1; + } else if (this->climbData[iVar1].buildingArea == dVar2) { + if (dVar3 == fromArea) { + return (int)(dVar2); } + if (dVar4 == fromArea) { + return (int)(dVar2); + } + adStack_960[iVar5] = dVar3; + iVar5 = iVar5 + 1; + aiStack_640[iVar6 * 2 + 1] = 1; + adStack_960[iVar5] = dVar4; + iVar5 = iVar5 + 1; } } - iVar6 = iVar6 + 1; - } while (iVar6 < local_96c); - } - } while (local_968 < iVar5); + } + iVar6 = iVar6 + 1; + } while (iVar6 < local_96c); + } } DAT_PathFindingState::instance.field50_0x98 = 0; fromArea = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d327f2319b..3cf69b8153 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25251,7 +25251,7 @@ SHC_3BB0A8C1_0x004A5230 | 0.0% | Pending SHC_3BB0A8C1_0x004A52D0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5320 | 67.9% | 21 gotos to the shared return +SHC_3BB0A8C1_0x004A5320 | 68.8% | plain while loop SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending From e3a4369fd6ae8d807119918dea2cdfd67cb1d5e7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 16 Oct 2026 23:50:06 +0200 Subject: [PATCH 435/516] reimplement: SHC_3BB0A8C1_0x00498FD0 19.87% flag init out of condition --- .../PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp index 642e6f1563..8956e68422 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -38,10 +38,10 @@ namespace Map { int _inBounds; uint _init_10; int _walkLayer; + _inBounds = 0; if (399 < (uint)this->unitX || 399 < (uint)this->unitY - || (_inBounds = false, - DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[this->unitY * 400 + this->unitX] - == '\0')) { + || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[this->unitY * 400 + this->unitX] + == '\0') { return 0; } _tile = DAT_ViewportRenderState::instance.translationMatrix[this->unitY].addXgetTile + this->unitX; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3cf69b8153..13e62f780c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24381,7 +24381,7 @@ SHC_3BB0A8C1_0x00498A40 | 82.2% | fix off-by-one maxTries SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 19.9% | tail-merged if chain +SHC_3BB0A8C1_0x00498FD0 | 19.9% | flag init out of condition SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending From c7f1f4a4dcf8944e523dd3aaf23e89fb9f83caf9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 00:40:00 +0200 Subject: [PATCH 436/516] reimplement: SHC_3BB0A8C1_0x004A5320 68.75% redundant parens removed --- .../calculateCanPlayerUnitsNavigateToAreaFromArea.cpp | 11 +++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- tools/reimplementation-helper/batch/quick_diff.py | 3 ++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index ad7d4acc33..9835b3805a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -44,12 +44,11 @@ namespace Map { } else if (permitClimb == 2) { continue; } - if (((playerID == 0 - || (DAT_GameState::instance.mapAndTime.playerTeams[this->climbData[iVar7].owner] - == DAT_GameState::instance.mapAndTime.playerTeams[playerID])) - || (DAT_BuildingsState::instance.buildings[this->climbData[iVar7].buildingID] - .field239_0x2c6 - != 0))) { + if (playerID == 0 + || DAT_GameState::instance.mapAndTime.playerTeams[this->climbData[iVar7].owner] + == DAT_GameState::instance.mapAndTime.playerTeams[playerID] + || DAT_BuildingsState::instance.buildings[this->climbData[iVar7].buildingID].field239_0x2c6 + != 0) { aiStack_640[local_96c * 2 + 1] = 0; aiStack_640[local_96c * 2] = iVar7; local_96c = local_96c + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 13e62f780c..e07e040bc6 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25251,7 +25251,7 @@ SHC_3BB0A8C1_0x004A5230 | 0.0% | Pending SHC_3BB0A8C1_0x004A52D0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A5320 | 68.8% | plain while loop +SHC_3BB0A8C1_0x004A5320 | 68.8% | redundant parens removed SHC_3BB0A8C1_0x004A5420 | 0.0% | Pending diff --git a/tools/reimplementation-helper/batch/quick_diff.py b/tools/reimplementation-helper/batch/quick_diff.py index ab36a2bdde..6b027b95ef 100644 --- a/tools/reimplementation-helper/batch/quick_diff.py +++ b/tools/reimplementation-helper/batch/quick_diff.py @@ -37,7 +37,8 @@ ENV['PATH'] = os.path.join(ROOT, 'MSVC1400-SP1', 'Common7', 'IDE') + os.pathsep + ENV['PATH'] cc = json.load(open('build-RelWithDebInfo/compile_commands.json')) base = [e for e in cc if 'OpenSHC.dll.dir' in e['command'] and '/src/OpenSHC/' in e['file'].replace(chr(92), '/')][0] -out = ROOT + '/build-RelWithDebInfo/batch/quick' +# QD_OUT picks the output folder, so concurrent runs (quick_reorder.py) do not share x.asm +out = ROOT + '/build-RelWithDebInfo/batch/' + os.environ.get('QD_OUT', 'quick') os.makedirs(out, exist_ok=True) d = open('_original/Stronghold Crusader.exe', 'rb').read() From 7ccdbc0c79fb5f9c8ec28439d2606d573a9df107 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 00:40:00 +0200 Subject: [PATCH 437/516] reimplement: SHC_3BB0A8C1_0x00498FD0 19.87% redundant parens removed --- .../PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp index 8956e68422..930f713888 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -73,7 +73,7 @@ namespace Map { local_24 = 1; while (true) { while (true) { - if ((_inBounds) && ((int)local_24 <= 1)) { + if (_inBounds && (int)local_24 <= 1) { return (uint)(this->searchQueue.pathPlanIndex); } iVar4 = 2; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e07e040bc6..124879f7da 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24381,7 +24381,7 @@ SHC_3BB0A8C1_0x00498A40 | 82.2% | fix off-by-one maxTries SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 19.9% | flag init out of condition +SHC_3BB0A8C1_0x00498FD0 | 19.9% | redundant parens removed SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending From 0385f1d9db2e3d067cc7b2d2a680101c97df0e9e Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 00:40:00 +0200 Subject: [PATCH 438/516] reimplement: SHC_3BB0A8C1_0x0049FC00 62.46% redundant parens removed --- .../Map/Navigation/PathFindingState/pathFindingRelated.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp index 1bdb676c4d..9961636a0a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingRelated.cpp @@ -88,7 +88,7 @@ namespace Map { iVar8 < local_18)) goto LAB_0049fdee; } else { - if ((uVar9 == 0) || ((int)local_1c <= (int)uVar9)) + if (uVar9 == 0 || (int)local_1c <= (int)uVar9) goto LAB_0049fdba; iVar8 = MACRO_CALL_MEMBER( OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::setAxisBasedDistanceResult, diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 124879f7da..fdd698cb03 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24719,7 +24719,7 @@ SHC_3BB0A8C1_0x0049F7D0 | 32.3% | yQueue stored before tilesQueu SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FC00 | 62.5% | signed compare fixed, allocato +SHC_3BB0A8C1_0x0049FC00 | 62.5% | redundant parens removed SHC_3BB0A8C1_0x0049FD10 | 0.0% | Pending From 19084a8b3e3683d69bf1cd4ce9120a0c38c89648 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 00:40:01 +0200 Subject: [PATCH 439/516] reimplement: SHC_3BB0A8C1_0x004A4140 85.49% redundant parens removed --- .../pathFindingToAttackCastleIncludingMoat.cpp | 10 +++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp index 2f34b323bf..0d4a777f43 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingToAttackCastleIncludingMoat.cpp @@ -83,11 +83,11 @@ namespace Map { || (DAT_TileMapState::instance.LogicLayer[_nextTile] & 0x1000) != 0) { continue; } - if ((DAT_TileMapState::instance.BuildingLayer[_nextTile] != 0) - && (2 < (uint)((short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[_nextTile]] - .buildingType - - 0x4a))) { + if (DAT_TileMapState::instance.BuildingLayer[_nextTile] != 0 + && 2 < (uint)((short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_nextTile]] + .buildingType + - 0x4a)) { continue; } if ((DAT_TileMapState::instance.LogicLayer[_nextTile] & 0x40000000) != 0) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fdd698cb03..4c3803248d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25219,7 +25219,7 @@ SHC_3BB0A8C1_0x004A3B20 | 46.6% | signed rng modulo idioms SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending -SHC_3BB0A8C1_0x004A4140 | 85.5% | statement order +SHC_3BB0A8C1_0x004A4140 | 85.5% | redundant parens removed SHC_3BB0A8C1_0x004A4470 | 49.5% | area read via local; compare v From c0a66972f04635af5fed783d443da56dc6f41baf Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 00:54:04 +0200 Subject: [PATCH 440/516] reimplement: SHC_3BB0A8C1_0x0049A1C0 62.16% tile locals per row --- ...updatePathLinkageTileMapRelatedToKeeps.cpp | 38 ++++++------------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp index 44b243e47b..fe0f71416d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp @@ -26,19 +26,12 @@ namespace Map { iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + -1; iVar3 = (int)DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight / 2 + (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; - DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3] - = DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile - + iVar3] - | 0x10; - DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile - + iVar3] - = DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile - + iVar3] - | 1; + int _tile = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3; + DAT_TileMapState::instance.PathLinkageLayer[_tile] + = DAT_TileMapState::instance.PathLinkageLayer[_tile] | 0x10; + int _tileBelow = DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile + iVar3; + DAT_TileMapState::instance.PathLinkageLayer[_tileBelow] + = DAT_TileMapState::instance.PathLinkageLayer[_tileBelow] | 1; return; } if (_orientation == 6) { @@ -50,19 +43,12 @@ namespace Map { if (_orientation != 2) { iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + (int)uVar2 + -1; iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x + (int)uVar2 / 2; - DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile - + iVar3] - = DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile - + iVar3] - | 0x10; - DAT_TileMapState::instance - .PathLinkageLayer[DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile - + iVar3] - = DAT_TileMapState::instance.PathLinkageLayer - [DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile + iVar3] - | 1; + int _tile = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + iVar3; + DAT_TileMapState::instance.PathLinkageLayer[_tile] + = DAT_TileMapState::instance.PathLinkageLayer[_tile] | 0x10; + int _tileBelow = DAT_ViewportRenderState::instance.translationMatrix[iVar4 + 1].addXgetTile + iVar3; + DAT_TileMapState::instance.PathLinkageLayer[_tileBelow] + = DAT_TileMapState::instance.PathLinkageLayer[_tileBelow] | 1; return; } iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + (int)uVar2 / 2; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4c3803248d..5972aedb06 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24395,7 +24395,7 @@ SHC_3BB0A8C1_0x00499DC0 | 67.1% | signed modulo and signed byte SHC_3BB0A8C1_0x00499FA0 | 35.3% | orig branch order + stmt order -SHC_3BB0A8C1_0x0049A1C0 | 54.0% | statement order +SHC_3BB0A8C1_0x0049A1C0 | 62.2% | tile locals per row SHC_3BB0A8C1_0x0049A2E0 | 96.3% | index locals + statement order From 85c53b5a5b67409e86ece435589a38163020b742 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:06:10 +0200 Subject: [PATCH 441/516] reimplement: SHC_3BB0A8C1_0x00497280 55.76% param_5 block out of line --- .../PathFindingState/doMoveFromTileToTile.cpp | 173 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 89 insertions(+), 86 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp index 1e27b98ee9..c2952105c7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp @@ -36,103 +36,106 @@ namespace Map { ushort _terrainHeight2; ushort _height; ushort _terrainHeight; - if (param_5 != 0) { - if (param_5 == 1) { - if ((DAT_TileMapState::instance - .LogicLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile] - & 0x30U) - != 0) { - return FALSE; - } - if ((DAT_TileMapState::instance - .LogicLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile] - & 1U) - != 0) { - return FALSE; - } - } - return TRUE; - } - /* - if we cannot move in that direction from the current tile? - */ - if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[direction] - & DAT_TileMapState::instance.PathLinkageLayer[tile]) - == 0) { - _targetTile = DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile; - if (ignoreAssassinClimbing == 0) { - if (DAT_UnitsState::instance.units[unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) { - uVar3 = DAT_TileMapState::instance.LogicLayer[_targetTile]; - if ((uVar3 & 0x4a5014b1) == 0 - && (uVar4 = DAT_TileMapState::instance.LogicLayer[tile] & 0x100, - uVar4 == 0 || ((uVar3 & 0x100) == 0)) - && (uVar4 != 0 || ((uVar3 & 0x100) != 0))) { - _height = DAT_TileMapState::instance.HeightLayer[tile]; - DAT_UnitsState::instance.units[unitID].animationCycleNumber = 0; - DAT_UnitsState::instance.units[unitID].field306_0x418 = 0; - if (uVar4 == 0) { - _terrainHeight = DAT_TileMapState::instance.HeightLayer[_targetTile]; - bVar2 = DAT_TileMapState::instance.WallOwnerLayer[_targetTile]; - DAT_UnitsState::instance.units[unitID].state.generic - = OpenSHC::Map::Units::States::US_ASSASSIN_THROWING_HOOK; - DAT_UnitsState::instance.units[unitID].assassinHeightDifference - = _terrainHeight - _height; - DAT_UnitsState::instance.units[unitID].assassinClimbingUpUnk_OR_previousFacingDirection - = 1; - DAT_UnitsState::instance.units[unitID].ownerOfAssassinScaledObject = (bVar2 & 7) + 1; - } else { - _terrainHeight2 = DAT_TileMapState::instance.HeightLayer[_targetTile]; - DAT_UnitsState::instance.units[unitID].state.generic - = OpenSHC::Map::Units::States::US_ASSASSIN_START_CLIMBING_DOWN; - DAT_UnitsState::instance.units[unitID].assassinHeightDifference - = _height - _terrainHeight2; - DAT_UnitsState::instance.units[unitID].assassinClimbingUpUnk_OR_previousFacingDirection - = 0; - } - if (DAT_UnitsState::instance.units[unitID].assassinHeightDifference < 0) { - DAT_UnitsState::instance.units[unitID].assassinHeightDifference = 0; + if (param_5 == 0) { + /* + if we cannot move in that direction from the current tile? + */ + if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[direction] + & DAT_TileMapState::instance.PathLinkageLayer[tile]) + == 0) { + _targetTile = DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile; + if (ignoreAssassinClimbing == 0) { + if (DAT_UnitsState::instance.units[unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) { + uVar3 = DAT_TileMapState::instance.LogicLayer[_targetTile]; + if ((uVar3 & 0x4a5014b1) == 0 + && (uVar4 = DAT_TileMapState::instance.LogicLayer[tile] & 0x100, + uVar4 == 0 || ((uVar3 & 0x100) == 0)) + && (uVar4 != 0 || ((uVar3 & 0x100) != 0))) { + _height = DAT_TileMapState::instance.HeightLayer[tile]; + DAT_UnitsState::instance.units[unitID].animationCycleNumber = 0; + DAT_UnitsState::instance.units[unitID].field306_0x418 = 0; + if (uVar4 == 0) { + _terrainHeight = DAT_TileMapState::instance.HeightLayer[_targetTile]; + bVar2 = DAT_TileMapState::instance.WallOwnerLayer[_targetTile]; + DAT_UnitsState::instance.units[unitID].state.generic + = OpenSHC::Map::Units::States::US_ASSASSIN_THROWING_HOOK; + DAT_UnitsState::instance.units[unitID].assassinHeightDifference + = _terrainHeight - _height; + DAT_UnitsState::instance.units[unitID] + .assassinClimbingUpUnk_OR_previousFacingDirection = 1; + DAT_UnitsState::instance.units[unitID].ownerOfAssassinScaledObject + = (bVar2 & 7) + 1; + } else { + _terrainHeight2 = DAT_TileMapState::instance.HeightLayer[_targetTile]; + DAT_UnitsState::instance.units[unitID].state.generic + = OpenSHC::Map::Units::States::US_ASSASSIN_START_CLIMBING_DOWN; + DAT_UnitsState::instance.units[unitID].assassinHeightDifference + = _height - _terrainHeight2; + DAT_UnitsState::instance.units[unitID] + .assassinClimbingUpUnk_OR_previousFacingDirection = 0; + } + if (DAT_UnitsState::instance.units[unitID].assassinHeightDifference < 0) { + DAT_UnitsState::instance.units[unitID].assassinHeightDifference = 0; + } + return TRUE; } + return FALSE; + } + } else { + uVar3 = DAT_TileMapState::instance.LogicLayer[_targetTile]; + if ((uVar3 & 0x40000000) != 0) { return TRUE; } - return FALSE; + if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x40000000U) != 0 + && (uVar3 & 0x4a5014b1) == 0) { + return ~(uVar3 >> 8) & TRUE; + } } } else { - uVar3 = DAT_TileMapState::instance.LogicLayer[_targetTile]; - if ((uVar3 & 0x40000000) != 0) { + if ((DAT_EntityState::instance.fireCount == 0) + || (DAT_UnitsState::instance.units[unitID].field295_0x40a != 0)) { + DAT_UnitsState::instance.units[unitID].counter = 0; return TRUE; } - if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x40000000U) != 0 && (uVar3 & 0x4a5014b1) == 0) { - return ~(uVar3 >> 8) & TRUE; + if (DAT_TileMapState::instance + .EntityLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile] + == 0) { + return TRUE; } + if (DAT_EntityState::instance + .entityArray[DAT_TileMapState::instance.EntityLayer + [DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile]] + .entityType + != OpenSHC::Map::Entities::ET_FIRE) { + return TRUE; + } + if ((DAT_TileMapState::instance.EntityLayer[tile] != 0) + && (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[tile]] + .entityType + == OpenSHC::Map::Entities::ET_FIRE)) { + return TRUE; + } + DAT_UnitsState::instance.units[unitID].counter = DAT_UnitsState::instance.units[unitID].counter + 1; + DAT_UnitsState::instance.units[unitID].field280_0x3f4 = 5; + DAT_UnitsState::instance.units[unitID].field295_0x40a = 1; } - } else { - if ((DAT_EntityState::instance.fireCount == 0) - || (DAT_UnitsState::instance.units[unitID].field295_0x40a != 0)) { - DAT_UnitsState::instance.units[unitID].counter = 0; - return TRUE; - } - if (DAT_TileMapState::instance - .EntityLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile] - == 0) { - return TRUE; - } - if (DAT_EntityState::instance - .entityArray[DAT_TileMapState::instance.EntityLayer - [DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile]] - .entityType - != OpenSHC::Map::Entities::ET_FIRE) { - return TRUE; + return FALSE; + } + if (param_5 == 1) { + if ((DAT_TileMapState::instance + .LogicLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile] + & 0x30U) + != 0) { + return FALSE; } - if ((DAT_TileMapState::instance.EntityLayer[tile] != 0) - && (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[tile]].entityType - == OpenSHC::Map::Entities::ET_FIRE)) { - return TRUE; + if ((DAT_TileMapState::instance + .LogicLayer[DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile] + & 1U) + != 0) { + return FALSE; } - DAT_UnitsState::instance.units[unitID].counter = DAT_UnitsState::instance.units[unitID].counter + 1; - DAT_UnitsState::instance.units[unitID].field280_0x3f4 = 5; - DAT_UnitsState::instance.units[unitID].field295_0x40a = 1; } - return FALSE; + return TRUE; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5972aedb06..5003a9f538 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24359,7 +24359,7 @@ SHC_3BB0A8C1_0x00497080 | 78.1% | hoist signed start-tile read SHC_3BB0A8C1_0x00497180 | 78.3% | hoist signed start-tile reads -SHC_3BB0A8C1_0x00497280 | 52.2% | 16-bit height arithmetic +SHC_3BB0A8C1_0x00497280 | 55.8% | param_5 block out of line SHC_3BB0A8C1_0x004974D0 | 32.1% | statement order From 1bb34a5c1360b4b27a5ab6b5edf9883b61b9524c Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:06:11 +0200 Subject: [PATCH 442/516] reimplement: SHC_3BB0A8C1_0x004A19B0 62.32% byte linkage local --- .../Map/Navigation/PathFindingState/findOwnedGatehouse.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp index cb41e4b362..29004cd031 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findOwnedGatehouse.cpp @@ -24,7 +24,7 @@ namespace Map { { int (*paiVar3)[8]; short _building; - int _link; + byte _link; dword _tile; if (399 < x || 399 < y || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[y * 400 + x] == '\0') { return (dword)(0); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5003a9f538..9b7deb5010 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25163,7 +25163,7 @@ SHC_3BB0A8C1_0x004A19AD | 0.0% | Pending SHC_3BB0A8C1_0x004A19AE | 0.0% | Pending -SHC_3BB0A8C1_0x004A19B0 | 60.1% | reuse computed start tile +SHC_3BB0A8C1_0x004A19B0 | 62.3% | byte linkage local SHC_3BB0A8C1_0x004A1AF0 | 0.0% | Pending From ea7e6a78f173fae209002f81f63ff1192c6f0382 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:29:32 +0200 Subject: [PATCH 443/516] reimplement: SHC_3BB0A8C1_0x0049D880 80.70% Style pass, asm differs --- .../findClosestFreeTileNearUnitOnBuilding.cpp | 112 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 57 insertions(+), 57 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp index 2fb764f7a3..e8a5e43691 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findClosestFreeTileNearUnitOnBuilding.cpp @@ -51,67 +51,67 @@ namespace Map { this->searchQueue.tilesQueue[0] = _startTile; DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; - if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { - return (undefined4)(1); - } - while (true) { - _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if (0x13a0f < _tile) { - return (undefined4)(1); - } - _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; - _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; - iVar5 = (int)_y; - int _absDistX = abs(_x - x); - int _absDistY = abs(iVar5 - y); - if (_absDistX > _absDistY) { - _absDistY = _absDistX; - } - if (_absDistY < _lowestDist) { - *pY = iVar5; - /* - lowest manhatten distance - */ - *pX = (int)_x; - _lowestDist = _absDistY; - } - this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; - if (0x13a10 < (int)this->searchQueue.currentDistance) - break; - for (int _direction = 0; _direction < 8; _direction = _direction + 2) { - int _candidate = DAT_TileMapState::instance.directionTranslationMatrix[iVar5][_direction] + _tile; - if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration - && (short)DAT_TileMapState::instance.PathConnectionLayer[_candidate] == _unitArea - && DAT_TileMapState::instance.BuildingLayer[_candidate] == buildingID - && DAT_TileMapState::instance.UnitLayer[_candidate] == 0) { + if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + while (true) { + _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (0x13a0f < _tile) { + return (undefined4)(1); + } + _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + iVar5 = (int)_y; + int _absDistX = abs(_x - x); + int _absDistY = abs(iVar5 - y); + if (_absDistX > _absDistY) { + _absDistY = _absDistX; + } + if (_absDistY < _lowestDist) { + *pY = iVar5; /* - queue free spaces in the same area as the unit on the same building as the unit + lowest manhatten distance */ - DAT_TileMapState::instance.CertainPathLayer[_candidate] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] - .short_.xOffset - + _x; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] - .short_.yOffset - + _y; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; + *pX = (int)_x; + _lowestDist = _absDistY; + } + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if (0x13a10 < (int)this->searchQueue.currentDistance) + break; + for (int _direction = 0; _direction < 8; _direction = _direction + 2) { + int _candidate + = DAT_TileMapState::instance.directionTranslationMatrix[iVar5][_direction] + _tile; + if (DAT_TileMapState::instance.WalkLayer[_candidate] != this->searchGeneration + && (short)DAT_TileMapState::instance.PathConnectionLayer[_candidate] == _unitArea + && DAT_TileMapState::instance.BuildingLayer[_candidate] == buildingID + && DAT_TileMapState::instance.UnitLayer[_candidate] == 0) { + /* + queue free spaces in the same area as the unit on the same building as the unit + */ + DAT_TileMapState::instance.CertainPathLayer[_candidate] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + _x; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + _y; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _candidate; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } } - } - this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (0x13a10 <= (int)this->searchQueue.readIndex) { - this->searchQueue.readIndex = 0; - } - if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { - return (undefined4)(1); + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + if (this->searchQueue.readIndex == this->searchQueue.writeIndex) { + break; + } } } return (undefined4)(1); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9b7deb5010..394e90e0a7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24689,7 +24689,7 @@ SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending SHC_3BB0A8C1_0x0049D640 | 78.0% | Style pass, asm differs -SHC_3BB0A8C1_0x0049D880 | 80.5% | statement order +SHC_3BB0A8C1_0x0049D880 | 80.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending From 8bb511e236e95e5d107b2e404705087261a16060 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:29:32 +0200 Subject: [PATCH 444/516] reimplement: SHC_3BB0A8C1_0x00499FA0 37.45% Style pass, asm differs --- ...updatePathLinkageTileMapRelatedToGates.cpp | 20 ++++++++----------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp index 31e06d5e06..bc0164f09b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp @@ -36,11 +36,10 @@ namespace Map { int _blocked = _pl2 == 2; _anotherTile = _widthOrHeight + _middleTileUnk; iVar3 = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + _middleTileUnk + -1; + uint _height = (uint)DAT_TileMapState::instance.HeightLayer[iVar3]; + uint _defaultHeight = (uint)DAT_TileMapState::instance.DefaultHeightLayer[iVar3 + 1]; if ((DAT_TileMapState::instance.LogicLayer[iVar3] & 0x4a5014b1U) != 0 - || (int)DAT_TileMapState::instance.HeightLayer[iVar3] - > (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar3 + 1] + 0x10) - || (int)DAT_TileMapState::instance.HeightLayer[iVar3] - < (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar3 + 1] - 0x10) + || (int)_height > (int)(_defaultHeight + 0x10) || (int)_height < (int)(_defaultHeight - 0x10) || _blocked != 0) { DAT_TileMapState::instance.PathLinkageLayer[iVar3] = DAT_TileMapState::instance.PathLinkageLayer[iVar3] & 0xfb; @@ -53,13 +52,11 @@ namespace Map { = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + 1] | 0x40; } _blocked = _pl2 == 2; - _middleTileUnk - = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + _anotherTile; + _middleTileUnk = DAT_ViewportRenderState::instance.translationMatrix[iVar4].addXgetTile + _anotherTile; + _height = (uint)DAT_TileMapState::instance.HeightLayer[_middleTileUnk]; + _defaultHeight = (uint)DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + -1]; if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) != 0 - || (int)DAT_TileMapState::instance.HeightLayer[_middleTileUnk] - > (int)(DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + -1] + 0x10) - || (int)DAT_TileMapState::instance.HeightLayer[_middleTileUnk] - < (int)(DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + -1] - 0x10) + || (int)_height > (int)(_defaultHeight + 0x10) || (int)_height < (int)(_defaultHeight - 0x10) || _blocked != 0) { DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xbf; @@ -106,8 +103,7 @@ namespace Map { _middleTileUnk = _middleTileUnk + _xMiddleUnk; if ((DAT_TileMapState::instance.LogicLayer[_middleTileUnk] & 0x4a5014b1U) != 0 || (int)uVar5 > (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar4] + 0x10) - || (int)uVar5 < (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar4] - 0x10) - || _blocked != 0) { + || (int)uVar5 < (int)(DAT_TileMapState::instance.DefaultHeightLayer[iVar4] - 0x10) || _blocked != 0) { DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] = DAT_TileMapState::instance.PathLinkageLayer[_middleTileUnk] & 0xfe; DAT_TileMapState::instance.PathLinkageLayer[iVar4] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 394e90e0a7..6164db4f26 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24393,7 +24393,7 @@ SHC_3BB0A8C1_0x004999C0 | 51.0% | counted for loop SHC_3BB0A8C1_0x00499DC0 | 67.1% | signed modulo and signed byte -SHC_3BB0A8C1_0x00499FA0 | 35.3% | orig branch order + stmt order +SHC_3BB0A8C1_0x00499FA0 | 37.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A1C0 | 62.2% | tile locals per row From 95e94bef6e494a5b56bc9ee8dd9ba25b39b5a50b Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:36:52 +0200 Subject: [PATCH 445/516] reimplement: SHC_3BB0A8C1_0x004995E0 66.67% counter guard split out --- .../PathFindingState/updateSeparateAreaTileMap.cpp | 8 +++++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp index a2df65031e..7e0c644f8c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp @@ -35,9 +35,11 @@ namespace Map { } DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps = DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps - 1; - if (0 < DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps - || (DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps = 200, - this->toggleUpdateSeparateAreaTileMap == 0)) { + if (0 < DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps) { + return FALSE; + } + DAT_GameState::instance.mapAndTime.counterForUpdatingSeparateAreaTileMaps = 200; + if (this->toggleUpdateSeparateAreaTileMap == 0) { return FALSE; } this->field41_0x74 = this->field41_0x74 + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6164db4f26..7a09fbef13 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24385,7 +24385,7 @@ SHC_3BB0A8C1_0x00498FD0 | 19.9% | redundant parens removed SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004995E0 | 63.8% | flood-fill loop in asm +SHC_3BB0A8C1_0x004995E0 | 66.7% | counter guard split out SHC_3BB0A8C1_0x00499970 | 0.0% | Pending From 47486633bd2b515231d680458e2f3641d8354ce6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:42:59 +0200 Subject: [PATCH 446/516] reimplement: SHC_3BB0A8C1_0x0049F7D0 32.32% comma expr expanded, tie --- .../findAppropriateLocationForSiegeTent.cpp | 11 ++++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp index b6aba13ebc..9e0972c8f0 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAppropriateLocationForSiegeTent.cpp @@ -150,13 +150,14 @@ namespace Map { === AI Zone DISTANCE CHECK === If specified (i.e. not 0), then the strategic distance of the current tile must be exactly that value */ - if (requiredDistanceFromAIZone != 0 - && (bVar2 = true, - DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( + if (requiredDistanceFromAIZone != 0) { + bVar2 = true; + if (DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray + playerID * 0x177bc + -0x10)][_offsetTile] - != requiredDistanceFromAIZone)) { - bVar2 = 0; + != requiredDistanceFromAIZone) { + bVar2 = 0; + } } /* === SIEGE TENT PLACEMENT VALIDATION === Only check for valid placement if distance > 4 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7a09fbef13..ced39282e4 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24715,7 +24715,7 @@ SHC_3BB0A8C1_0x0049F2D0 | 86.0% | Style pass, asm differs SHC_3BB0A8C1_0x0049F540 | 86.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049F7D0 | 32.3% | yQueue stored before tilesQueu +SHC_3BB0A8C1_0x0049F7D0 | 32.3% | comma expr expanded, tie SHC_3BB0A8C1_0x0049F9B0 | 0.0% | Pending From 5762bc1456c6ee29f82a7e942867bf1c55679eaa Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:42:59 +0200 Subject: [PATCH 447/516] reimplement: SHC_3BB0A8C1_0x004A9200 58.75% comma expr expanded, tie --- .../PathFindingState/isOpponentBuildingInRange.cpp | 11 ++++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index 54cddc0364..53af7a1391 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -118,11 +118,12 @@ namespace Map { break; } } - if (keepRange != -1 - && (iVar1 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::isTileInRangeOfKeepRange, - this)(playerID, (uint)(x), (uint)(y), keepRange), - iVar1 != 0)) { - return (undefined4)(1); + if (keepRange != -1) { + iVar1 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func::isTileInRangeOfKeepRange, + this)(playerID, (uint)(x), (uint)(y), keepRange); + if (iVar1 != 0) { + return (undefined4)(1); + } } return (undefined4)(0); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ced39282e4..6a00ccb536 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25453,7 +25453,7 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 58.8% | Style pass, asm differs +SHC_3BB0A8C1_0x004A9200 | 58.8% | comma expr expanded, tie SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented From eecb8d204464bcde1ef39793464e2a17544a6bfd Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:42:59 +0200 Subject: [PATCH 448/516] reimplement: SHC_3BB0A8C1_0x004999C0 51.05% comma expr expanded, tie --- .../updatePathLinkageLayerBasedOnBuildingsUnk.cpp | 13 +++++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp index 27f1a46c75..ad7119eb75 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerBasedOnBuildingsUnk.cpp @@ -50,12 +50,13 @@ namespace Map { } local_24 = _height + 0x10; local_28 = _height - 0x10; - if ((_building != 0) - && (_buildingType = DAT_BuildingsState::instance.buildings[_building].buildingType, - _result - = (BOOLEnum)(DAT_BuildingDefinedData::instance.BuildingIsGateHouseArray[(short)_buildingType] != 0), - DAT_BuildingDefinedData::instance.BuildingIsKeepArray[(short)_buildingType] != 0)) { - _result = TRUE; + if (_building != 0) { + _buildingType = DAT_BuildingsState::instance.buildings[_building].buildingType; + _result + = (BOOLEnum)(DAT_BuildingDefinedData::instance.BuildingIsGateHouseArray[(short)_buildingType] != 0); + if (DAT_BuildingDefinedData::instance.BuildingIsKeepArray[(short)_buildingType] != 0) { + _result = TRUE; + } } int bVar2 = 0; int bVar4 = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6a00ccb536..4183b915d1 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24389,7 +24389,7 @@ SHC_3BB0A8C1_0x004995E0 | 66.7% | counter guard split out SHC_3BB0A8C1_0x00499970 | 0.0% | Pending -SHC_3BB0A8C1_0x004999C0 | 51.0% | counted for loop +SHC_3BB0A8C1_0x004999C0 | 51.0% | comma expr expanded, tie SHC_3BB0A8C1_0x00499DC0 | 67.1% | signed modulo and signed byte From 4a7e834a60209d3d3758fdb2b70f2131047820ab Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:51:24 +0200 Subject: [PATCH 449/516] reimplement: SHC_3BB0A8C1_0x004A2650 65.74% building id in an int local --- .../PathFindingState/isSignPostWithinDistance.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp index e7ba01800e..04cbd702f5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp @@ -75,9 +75,9 @@ namespace Map { if ((int)this->searchQueue.currentDistance > limit) { return FALSE; } - if ((DAT_TileMapState::instance.BuildingLayer[iVar3] != 0) - && (DAT_BuildingsState::instance.buildings[DAT_TileMapState::instance.BuildingLayer[iVar3]] - .buildingType + int _building = DAT_TileMapState::instance.BuildingLayer[iVar3]; + if ((_building != 0) + && (DAT_BuildingsState::instance.buildings[_building].buildingType == OpenSHC::Map::Buildings::BT_SIGNPOST)) { return TRUE; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4183b915d1..9f49aec01f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25179,7 +25179,7 @@ SHC_3BB0A8C1_0x004A21B0 | 84.8% | statement order SHC_3BB0A8C1_0x004A22C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2650 | 65.3% | statement order +SHC_3BB0A8C1_0x004A2650 | 65.7% | building id in an int local SHC_3BB0A8C1_0x004A2740 | 0.0% | Pending From 37f99d926a27bbfe93e5a4ec0ff118c011af56f4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:51:24 +0200 Subject: [PATCH 450/516] reimplement: SHC_3BB0A8C1_0x0049A6D0 72.45% unsigned area read, matches mo --- src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp index aaaad71878..ccce4449fd 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp @@ -39,7 +39,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; - int uVar1 = (short)DAT_TileMapState::instance.PathConnectionLayer[this->searchQueue.tilesQueue[0]]; + int uVar1 = DAT_TileMapState::instance.PathConnectionLayer[this->searchQueue.tilesQueue[0]]; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { uint tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9f49aec01f..80e92587e6 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24405,7 +24405,7 @@ SHC_3BB0A8C1_0x0049A5E0 | 78.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049A610 | 0.0% | Pending -SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs +SHC_3BB0A8C1_0x0049A6D0 | 72.5% | unsigned area read, matches mo SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending From b58170fa8c599406e1e2a3b002445c586cd35588 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:51:25 +0200 Subject: [PATCH 451/516] reimplement: SHC_3BB0A8C1_0x0049C020 74.33% building id in an int local --- .../PathFindingState/setupBabyTreeLocationInfo.cpp | 7 +++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp index 533ec97fd8..cb9598918d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp @@ -79,10 +79,9 @@ namespace Map { if (DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) { int iVar6 = (int)DAT_TileMapState::instance.OrganismLayer[iVar5]; if ((iVar6 == 0) || (1999 < iVar6)) { - if (DAT_TileMapState::instance.BuildingLayer[iVar5] != 0) { - switch (DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[iVar5]] - .buildingType) { + int _building = DAT_TileMapState::instance.BuildingLayer[iVar5]; + if (_building != 0) { + switch (DAT_BuildingsState::instance.buildings[_building].buildingType) { case OpenSHC::Map::Buildings::BT_WOODCUTTERSHUT: case OpenSHC::Map::Buildings::BT_QUARRY: case OpenSHC::Map::Buildings::BT_WHEATFARM: diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 80e92587e6..baf569df63 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24443,7 +24443,7 @@ SHC_3BB0A8C1_0x0049BD40 | 0.0% | Pending SHC_3BB0A8C1_0x0049BE60 | 51.6% | drop ghidra chkstk artifact st -SHC_3BB0A8C1_0x0049C020 | 72.5% | Style pass, asm differs +SHC_3BB0A8C1_0x0049C020 | 74.3% | building id in an int local SHC_3BB0A8C1_0x0049C100 | 0.0% | Pending From f4d9ae0638f5aa894dcda548a38ca1085918198a Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:59:40 +0200 Subject: [PATCH 452/516] reimplement: SHC_3BB0A8C1_0x0049FF20 72.35% entity id in an int local --- .../PathFindingState/pathfindingRelated49ff20.cpp | 6 +++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp index 16c63f9be7..5607e8ec94 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingRelated49ff20.cpp @@ -75,9 +75,9 @@ namespace Map { if (param_5 == 0) { uVar6 = 0; } - if (((DAT_TileMapState::instance.EntityLayer[dVar4] == 0) - || (DAT_EntityState::instance.entityArray[DAT_TileMapState::instance.EntityLayer[dVar4]] - .entityType + int _entity = DAT_TileMapState::instance.EntityLayer[dVar4]; + if (((_entity == 0) + || (DAT_EntityState::instance.entityArray[_entity].entityType != OpenSHC::Map::Entities::ET_FIRE)) && DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[*( int*)((int)DAT_TroopValueState::instance.attackInfo.hackValuesArray diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index baf569df63..bfc7c313ba 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24725,7 +24725,7 @@ SHC_3BB0A8C1_0x0049FD10 | 0.0% | Pending SHC_3BB0A8C1_0x0049FD70 | 0.0% | Pending -SHC_3BB0A8C1_0x0049FF20 | 66.7% | statement order +SHC_3BB0A8C1_0x0049FF20 | 72.3% | entity id in an int local SHC_3BB0A8C1_0x004A0050 | 0.0% | Pending From 1506da471cee39378de91016ff819a360b2c08ba Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 01:59:40 +0200 Subject: [PATCH 453/516] reimplement: SHC_3BB0A8C1_0x004A97D0 31.84% building id in an int local --- .../PathFindingState/traceAndCommitPathPlan.cpp | 9 ++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp index 2d10fde371..40cf343ce2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/traceAndCommitPathPlan.cpp @@ -124,13 +124,12 @@ namespace Map { y2 = y2 + DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_theDirection] .int_.yOffset; + int _building = DAT_TileMapState::instance.BuildingLayer[x2]; if ((DAT_TileMapState::instance.LogicLayer[x2] & 0x10000100U) != 0 && (DAT_TileMapState::instance.LogicLayer[x2] & 2U) == 0 - && (DAT_TileMapState::instance.BuildingLayer[x2] == 0 - || (DAT_BuildingDefinedData::instance - .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[x2]] - .buildingType] + && (_building == 0 + || (DAT_BuildingDefinedData::instance.BuildingIsGateHouseArray + [(short)DAT_BuildingsState::instance.buildings[_building].buildingType] == 0))) { this->field49_0x94 = this->field49_0x94 + 1; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bfc7c313ba..67adda36b2 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25465,7 +25465,7 @@ SHC_3BB0A8C1_0x004A96B0 | 0.0% | Pending SHC_3BB0A8C1_0x004A9760 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A97D0 | 31.2% | start-tile masks hoisted +SHC_3BB0A8C1_0x004A97D0 | 31.8% | building id in an int local SHC_3BB0A8C1_0x004A98C0 | 0.0% | Pending From 723e23b5f00eac2985d10ecd5a23db4d98f547cd Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:08:22 +0200 Subject: [PATCH 454/516] reimplement: SHC_3BB0A8C1_0x004A3B20 46.62% redundant short cast removed, --- .../Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index e5a8b8d3bc..65c93661cd 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -84,7 +84,7 @@ namespace Map { return (undefined4)(0); } int uVar4 = (short)DAT_TileMapState::instance.UnitLayer[uVar1]; - while (iVar9 = (int)(short)uVar4, iVar9 != 0) { + while (iVar9 = uVar4, iVar9 != 0) { if (param_3 != 0 && DAT_GameState::instance.mapAndTime .playerTeams[DAT_UnitsState::instance.units[iVar9].owner] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 67adda36b2..6eb6ecabc3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 46.6% | signed rng modulo idioms +SHC_3BB0A8C1_0x004A3B20 | 46.6% | redundant short cast removed, SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From 7a476f3fc2d1f40f5ff749618872efb81a5b944e Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:08:22 +0200 Subject: [PATCH 455/516] reimplement: SHC_3BB0A8C1_0x004A8860 49.52% redundant short casts removed --- .../Navigation/PathFindingState/findBuildingAccessPoint.cpp | 5 ++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp index 6606394a2b..050e0c67f7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBuildingAccessPoint.cpp @@ -134,11 +134,10 @@ namespace Map { units of building's actual terrain height */ if (abs(_heightDiff) < 32 - && ((int)(short)DAT_TileMapState::instance.PathConnectionLayer[_entranceCandidate] - == (int)(short)_unitArea + && ((int)(short)DAT_TileMapState::instance.PathConnectionLayer[_entranceCandidate] == _unitArea || (_canNav = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::PathFindingState_Func:: calculateCanPlayerUnitsNavigateToAreaFromArea, - this)((int)_unitOwner, (dword)((int)((short)_unitArea)), + this)((int)_unitOwner, (dword)(_unitArea), (dword)((int)(( int)(short)DAT_TileMapState::instance.PathConnectionLayer[_entranceCandidate])), 0), diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6eb6ecabc3..524c86de32 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25315,7 +25315,7 @@ SHC_3BB0A8C1_0x004A83B0 | 71.6% | statement order SHC_3BB0A8C1_0x004A8780 | 81.5% | counted for + named layer -SHC_3BB0A8C1_0x004A8860 | 48.1% | compare order from asm +SHC_3BB0A8C1_0x004A8860 | 49.5% | redundant short casts removed SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending From 7cc2d81270f26803441d5bcfb7100880380f3c63 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:08:23 +0200 Subject: [PATCH 456/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 65.94% redundant short casts removed --- .../PathFindingState/findCrossAreaBridgeTileToTarget.cpp | 5 ++--- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index 138786002e..48015b0c6a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -78,7 +78,7 @@ namespace Map { iVar13 = DAT_TileMapState::instance.directionTranslationMatrix[sVar4][_direction] + uVar5; if (DAT_TileMapState::instance.WalkLayer[iVar13] != this->searchGeneration && (DAT_TileMapState::instance.LogicLayer[iVar13] & 0x400000U) == 0) { - if ((int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar13] == (int)(short)uVar1 + if ((int)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar13] == uVar1 || (DAT_TileMapState::instance.LogicLayer[iVar13] & 0x10000100U) != 0) { iVar7 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .int_.xOffset; @@ -101,8 +101,7 @@ namespace Map { calculateCanPlayerUnitsNavigateToAreaFromArea, DAT_PathFindingState::ptr)((int)DAT_UnitsState::instance.units[param_1].owner, (dword)((int)((short)DAT_TileMapState::instance.PathConnectionLayer[iVar13])), - (dword)((int)((short)uVar2)), - (int)(DAT_UnitsState::instance.units[param_1].unitCanClimb)); + (dword)(uVar2), (int)(DAT_UnitsState::instance.units[param_1].unitCanClimb)); if (iVar7 != 0) { iVar10 = abs( (DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 524c86de32..d62174a74d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25287,7 +25287,7 @@ SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending SHC_3BB0A8C1_0x004A69F0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6AB0 | 62.9% | signed area read +SHC_3BB0A8C1_0x004A6AB0 | 65.9% | redundant short casts removed SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending From d2d7ad5ac7dfad8cdd16d3b2999730e441cd564c Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:08:23 +0200 Subject: [PATCH 457/516] reimplement: SHC_3BB0A8C1_0x00497180 97.10% int locals for the 16-bit read --- ...gPreviousSearchNotOnDefensiveStructure.cpp | 19 +++++++------------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 13 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp index a22c34775f..3a77a62bb5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileByModuloAmongPreviousSearchNotOnDefensiveStructure.cpp @@ -31,18 +31,13 @@ namespace Map { /* manhatten distance */ - if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x10000100U) == 0 - && 0 < (short)DAT_TileMapState::instance.CertainPathLayer[_tile] - && (_xDistance = (_tile - - DAT_ViewportRenderState::instance - .translationMatrix[DAT_ViewportRenderState::instance - .tileTranslationMatrix_YComponent[_tile]] - .addXgetTile) - - x, - _yDistance - = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile] - y, - (abs(_yDistance) + abs(_xDistance)) % modulo == 0) - && (short)DAT_TileMapState::instance.CertainPathLayer[_tile] < 4000) + int _tileY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[_tile]; + int _distance = (short)DAT_TileMapState::instance.CertainPathLayer[_tile]; + if ((DAT_TileMapState::instance.LogicLayer[_tile] & 0x10000100U) == 0 && 0 < _distance + && (_xDistance + = (_tile - DAT_ViewportRenderState::instance.translationMatrix[_tileY].addXgetTile) - x, + _yDistance = _tileY - y, (abs(_yDistance) + abs(_xDistance)) % modulo == 0) + && _distance < 4000) break; iVar1 = iVar1 + 1; _pTile = _pTile + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d62174a74d..5b8a9ab668 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24357,7 +24357,7 @@ SHC_3BB0A8C1_0x00496F90 | 56.5% | distance local hoisted SHC_3BB0A8C1_0x00497080 | 78.1% | hoist signed start-tile read -SHC_3BB0A8C1_0x00497180 | 78.3% | hoist signed start-tile reads +SHC_3BB0A8C1_0x00497180 | 97.1% | int locals for the 16-bit read SHC_3BB0A8C1_0x00497280 | 55.8% | param_5 block out of line From e08159b5ea8d8db0fe953185c78d6c54ca77203f Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:08:23 +0200 Subject: [PATCH 458/516] reimplement: SHC_3BB0A8C1_0x004A8AB0 78.29% redundant short casts removed --- .../pathfindingUpdate_0x4a8ab0.cpp | 21 +++++++------------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp index e46c20b021..e870d17658 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp @@ -78,8 +78,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[1]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 - = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -91,8 +90,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[2]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 - = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -104,8 +102,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[3]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 - = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -117,8 +114,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[4]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 - = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -130,8 +126,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[5]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 - = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -143,8 +138,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[6]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 - = (int)(short)uVar1 + DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile; + iVar9 = uVar1 + DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] = (short)this->searchGeneration; @@ -156,8 +150,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[7]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 - = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + (int)(short)uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5b8a9ab668..6c791b5e16 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25319,7 +25319,7 @@ SHC_3BB0A8C1_0x004A8860 | 49.5% | redundant short casts removed SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending -SHC_3BB0A8C1_0x004A8AB0 | 74.1% | statement order +SHC_3BB0A8C1_0x004A8AB0 | 78.3% | redundant short casts removed SHC_3BB0A8C1_0x004A91B0 | 0.0% | Pending From d395506c1078f3c712999f962edaeda8ffa94b93 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:14:45 +0200 Subject: [PATCH 459/516] reimplement: SHC_3BB0A8C1_0x004A6AB0 65.94% narrowing cast removed, tie --- .../PathFindingState/findCrossAreaBridgeTileToTarget.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp index 48015b0c6a..9a447af1e6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findCrossAreaBridgeTileToTarget.cpp @@ -90,7 +90,7 @@ namespace Map { .clockwiseCardinalTranslationMatrix[_direction] .int_.yOffset + sVar4; - this->searchQueue.xQueue[this->searchQueue.writeIndex] = (short)iVar7 + sVar3; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = iVar7 + sVar3; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar13; this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; if (0x13a10 <= (int)this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6c791b5e16..f572a192ff 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25287,7 +25287,7 @@ SHC_3BB0A8C1_0x004A6940 | 0.0% | Pending SHC_3BB0A8C1_0x004A69F0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6AB0 | 65.9% | redundant short casts removed +SHC_3BB0A8C1_0x004A6AB0 | 65.9% | narrowing cast removed, tie SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending From cddca9b6da1398e94440ee00695003d3393b6cc2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:14:45 +0200 Subject: [PATCH 460/516] reimplement: SHC_3BB0A8C1_0x004A7F50 59.63% narrowing casts removed, tie --- ...aceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index d24a2b9018..00e7f2c565 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -79,7 +79,7 @@ namespace Map { this->searchQueue.tilesQueue[0] = tile; this->searchQueue.yQueue[0] = _origY; DAT_TileMapState::instance.CertainPathLayer[tile] = 1; - this->searchQueue.xQueue[0] = (short)tile - (short)_origAXGT; + this->searchQueue.xQueue[0] = tile - _origAXGT; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile <= 0x13a0f) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f572a192ff..fa071967f5 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25303,7 +25303,7 @@ SHC_3BB0A8C1_0x004A75B0 | 49.2% | clamp arms from asm SHC_3BB0A8C1_0x004A79A0 | 64.1% | compare order from asm -SHC_3BB0A8C1_0x004A7F50 | 59.6% | clamp arms from asm +SHC_3BB0A8C1_0x004A7F50 | 59.6% | narrowing casts removed, tie SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending From d4599ec0bf7357d9b94255ab4867098a07055d64 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:14:46 +0200 Subject: [PATCH 461/516] reimplement: SHC_3BB0A8C1_0x004A8AB0 80.09% narrowing index casts removed --- .../pathfindingUpdate_0x4a8ab0.cpp | 20 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp index e870d17658..173c65250a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathfindingUpdate_0x4a8ab0.cpp @@ -78,7 +78,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[1]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -90,7 +90,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[2]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -102,7 +102,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[3]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -114,7 +114,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[4]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -126,7 +126,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[5]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -138,7 +138,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[6]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 = uVar1 + DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile; + iVar9 = uVar1 + DAT_ViewportRenderState::instance.translationMatrix[uVar2].addXgetTile; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] = (short)this->searchGeneration; @@ -150,7 +150,7 @@ namespace Map { uVar2 = DAT_BuildingsState::instance.buildings[DAT_GameState::instance.mapAndTime.signpostIDs[7]].y; this->searchQueue.yQueue[uVar6] = uVar2; this->searchQueue.xQueue[uVar6] = uVar1; - iVar9 = DAT_ViewportRenderState::instance.translationMatrix[(short)uVar2].addXgetTile + uVar1; + iVar9 = DAT_ViewportRenderState::instance.translationMatrix[uVar2].addXgetTile + uVar1; this->searchQueue.tilesQueue[uVar6] = iVar9; DAT_TileMapState::instance.CertainPathLayer[iVar9] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[uVar6]] @@ -177,7 +177,7 @@ namespace Map { iVar8 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .int_.xOffset; DAT_TileMapState::instance.WalkLayer[iVar9] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] = (short)iVar8 + sVar3; + this->searchQueue.xQueue[this->searchQueue.writeIndex] = iVar8 + sVar3; this->searchQueue.yQueue[this->searchQueue.writeIndex] = (short)DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .int_.yOffset @@ -228,7 +228,7 @@ namespace Map { DAT_TileMapState::instance.DamageLayer[iVar9] = 0; DAT_PathFindingState::instance.toggleUpdateSeparateAreaTileMap = 1; DAT_TileMapState::instance.field204_0x554a30 = 1; - *local_18 = (short)iVar8 + sVar3; + *local_18 = iVar8 + sVar3; *local_14 = (short)DAT_TerrainDefinedData::instance .clockwiseCardinalTranslationMatrix[_direction] .int_.yOffset @@ -254,7 +254,7 @@ namespace Map { DAT_TileMapState::instance.HeightLayer[iVar9] = 8; DAT_TileMapState::instance.LogicLayer[iVar9] = DAT_TileMapState::instance.LogicLayer[iVar9] & 0xbfffbfff; - *local_18 = (short)iVar8 + sVar3; + *local_18 = iVar8 + sVar3; *local_10 = iVar9; *local_14 = (short)DAT_TerrainDefinedData::instance .clockwiseCardinalTranslationMatrix[_direction] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fa071967f5..f2832852e3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25319,7 +25319,7 @@ SHC_3BB0A8C1_0x004A8860 | 49.5% | redundant short casts removed SHC_3BB0A8C1_0x004A8900 | 0.0% | Pending -SHC_3BB0A8C1_0x004A8AB0 | 78.3% | redundant short casts removed +SHC_3BB0A8C1_0x004A8AB0 | 80.1% | narrowing index casts removed SHC_3BB0A8C1_0x004A91B0 | 0.0% | Pending From 1a55a130da44c1a2affec1aab08173b4e7f4fd78 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:14:46 +0200 Subject: [PATCH 462/516] reimplement: SHC_3BB0A8C1_0x004A83B0 71.57% narrowing casts removed, tie --- ...DestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index f656efd015..77bde7936f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -5,9 +5,9 @@ #include "OpenSHC/Map/Location/Point8ShortXY.hpp" #include "OpenSHC/Map/Navigation/Algorithms/XYPair.hpp" -#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_ClimbLogicDefinedData.hpp" #include "OpenSHC/Globals/DAT_LowLevelMemory.hpp" +#include "OpenSHC/Globals/DAT_PathFindingState.hpp" #include "OpenSHC/Globals/DAT_TerrainDefinedData.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" @@ -65,7 +65,7 @@ namespace Map { } this->searchQueue.tilesQueue[0] = tile; this->searchQueue.yQueue[0] = _tileY; - this->searchQueue.xQueue[0] = (short)tile - (short)_axgt; + this->searchQueue.xQueue[0] = tile - _axgt; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; DAT_TileMapState::instance.CertainPathLayer[tile] = 1; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f2832852e3..e0d7ccaf0e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25311,7 +25311,7 @@ SHC_3BB0A8C1_0x004A8220 | 0.0% | Pending SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending -SHC_3BB0A8C1_0x004A83B0 | 71.6% | statement order +SHC_3BB0A8C1_0x004A83B0 | 71.6% | narrowing casts removed, tie SHC_3BB0A8C1_0x004A8780 | 81.5% | counted for + named layer From c76b29fa6149b67664de7d99fefbfa233acc8e89 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:14:46 +0200 Subject: [PATCH 463/516] reimplement: SHC_3BB0A8C1_0x004A2A90 65.21% narrowing cast removed, tie --- .../PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp index 207d84d9a8..0b6cd6247d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spreadAlgorithmForFlagsAndBraziersUnk.cpp @@ -135,7 +135,7 @@ namespace Map { this->searchQueue.xQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.xOffset - + (short)local_4; + + local_4; this->searchQueue.yQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.yOffset diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e0d7ccaf0e..467a45948b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25185,7 +25185,7 @@ SHC_3BB0A8C1_0x004A2740 | 0.0% | Pending SHC_3BB0A8C1_0x004A27D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2A90 | 65.2% | counted for loop, allocator di +SHC_3BB0A8C1_0x004A2A90 | 65.2% | narrowing cast removed, tie SHC_3BB0A8C1_0x004A2B70 | 0.0% | Pending From d669c3db40c8f5b88325c7b89e54bccc89a365ab Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:20:52 +0200 Subject: [PATCH 464/516] reimplement: SHC_3BB0A8C1_0x00496F90 56.45% row local for the y read, tie --- ...xtTileInExistingSearchThatIsModuloDistanceAway.cpp | 11 +++-------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp index f8423138d6..399e8770c5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp @@ -26,16 +26,11 @@ namespace Map { _pLastTile = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; while (true) { int iVar1 = *_pLastTile; + int _tileY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[iVar1]; int _dist = DAT_TileMapState::instance.CertainPathLayer[iVar1]; if (0 < _dist - && (_dx = (iVar1 - - DAT_ViewportRenderState::instance - .translationMatrix[DAT_ViewportRenderState::instance - .tileTranslationMatrix_YComponent[iVar1]] - .addXgetTile) - - x, - _dy = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[iVar1] - y, - (abs(_dy) + abs(_dx)) % modulo == 0) + && (_dx = (iVar1 - DAT_ViewportRenderState::instance.translationMatrix[_tileY].addXgetTile) - x, + _dy = _tileY - y, (abs(_dy) + abs(_dx)) % modulo == 0) && (iVar2 = DAT_TribesState::instance.ALG_ResultTileIndex, _dist < 4000)) break; DAT_TribesState::instance.ALG_ResultTileIndex = DAT_TribesState::instance.ALG_ResultTileIndex + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 467a45948b..8299cceb4c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24353,7 +24353,7 @@ SHC_3BB0A8C1_0x00496EA0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00496EC0 | 66.0% | hoist signed start-tile reads -SHC_3BB0A8C1_0x00496F90 | 56.5% | distance local hoisted +SHC_3BB0A8C1_0x00496F90 | 56.5% | row local for the y read, tie SHC_3BB0A8C1_0x00497080 | 78.1% | hoist signed start-tile read From c992be6072a52733664f5a55730064694f5978e8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:27:36 +0200 Subject: [PATCH 465/516] reimplement: SHC_3BB0A8C1_0x00498FD0 19.87% flag init moved to the loop --- .../PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp index 930f713888..2cbc78f56e 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/commitUnitPathPlanUsingWalkLayer.cpp @@ -38,7 +38,6 @@ namespace Map { int _inBounds; uint _init_10; int _walkLayer; - _inBounds = 0; if (399 < (uint)this->unitX || 399 < (uint)this->unitY || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[this->unitY * 400 + this->unitX] == '\0') { @@ -71,6 +70,7 @@ namespace Map { this->searchQueue.pathPlanIndex = 0; iVar6 = 10; local_24 = 1; + _inBounds = 0; while (true) { while (true) { if (_inBounds && (int)local_24 <= 1) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8299cceb4c..d8c6bf22f0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24381,7 +24381,7 @@ SHC_3BB0A8C1_0x00498A40 | 82.2% | fix off-by-one maxTries SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending -SHC_3BB0A8C1_0x00498FD0 | 19.9% | redundant parens removed +SHC_3BB0A8C1_0x00498FD0 | 19.9% | flag init moved to the loop SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending From eb2a2da3d307e329b8909af1bf1d474ad1fafe1c Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:20 +0200 Subject: [PATCH 466/516] reimplement: SHC_3BB0A8C1_0x004A6DF0 85.43% start --- .../PathFindingState/canNavigateFunctionReturnsArea.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp index 2e68269e23..654d375b13 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/canNavigateFunctionReturnsArea.cpp @@ -51,7 +51,7 @@ namespace Map { int _startTile = DAT_ViewportRenderState::instance.translationMatrix[unitY].addXgetTile + unitX; this->searchQueue.tilesQueue[0] = _startTile; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { int iVar3 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d8c6bf22f0..89efaf548a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25293,7 +25293,7 @@ SHC_3BB0A8C1_0x004A6BE0 | 0.0% | Pending SHC_3BB0A8C1_0x004A6C40 | 0.0% | Pending -SHC_3BB0A8C1_0x004A6DF0 | 83.8% | statement order +SHC_3BB0A8C1_0x004A6DF0 | 85.4% | start SHC_3BB0A8C1_0x004A6ED0 | 0.0% | Pending From c310492cf2cf73afdda994bf6ce9783efecc3a1c Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:21 +0200 Subject: [PATCH 467/516] reimplement: SHC_3BB0A8C1_0x004A3B20 47.82% start --- .../Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index 65c93661cd..5b8d6f39d7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -66,7 +66,7 @@ namespace Map { this->searchQueue.currentDistance = 1; this->searchQueue.readIndex = 0; this->searchQueue.writeIndex = 1; - DAT_TileMapState::instance.CertainPathLayer[param_1] = 1; + DAT_TileMapState::instance.CertainPathLayer[param_1] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; local_8 = OpenSHC::Map::Entities::ET_ARROW_AND_DEFAULT; if ((char)param_5 == '\0') { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 89efaf548a..1ff912a43b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 46.6% | redundant short cast removed, +SHC_3BB0A8C1_0x004A3B20 | 47.8% | start SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From ad9ead404d5d28ee7d217ab8f11be6a4daccd3d6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:21 +0200 Subject: [PATCH 468/516] reimplement: SHC_3BB0A8C1_0x0049EDF0 78.69% start --- .../Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp index cbb4ae73c3..a6417107f4 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp @@ -46,7 +46,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 1ff912a43b..d1b15b115b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24705,7 +24705,7 @@ SHC_3BB0A8C1_0x0049E9E0 | 70.0% | statement order SHC_3BB0A8C1_0x0049EB00 | 0.0% | Pending -SHC_3BB0A8C1_0x0049EDF0 | 67.2% | Style pass, asm differs +SHC_3BB0A8C1_0x0049EDF0 | 78.7% | start SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending From 119df95a2b9b9baf74a3c38bfdd6fc9f666b5f07 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:21 +0200 Subject: [PATCH 469/516] reimplement: SHC_3BB0A8C1_0x004A6010 49.40% start --- .../findBestAttackTargetTileWithHeightAndOwner.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp index 17ca7cfeed..5928705101 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTargetTileWithHeightAndOwner.cpp @@ -76,7 +76,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)param_2; int iVar6 = DAT_ViewportRenderState::instance.translationMatrix[param_3].addXgetTile + param_2; this->searchQueue.tilesQueue[0] = iVar6; - DAT_TileMapState::instance.CertainPathLayer[iVar6] = 1; + DAT_TileMapState::instance.CertainPathLayer[iVar6] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; uint uVar10 = (uint)DAT_TileMapState::instance.HeightLayer[iVar6]; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { @@ -88,7 +88,7 @@ namespace Map { int sVar2 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; iVar6 = (int)sVar2; uint uVar8 = DAT_TileMapState::instance.LogicLayer[uVar4]; - uint uVar11 = (uint) DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_7][uVar4]; + uint uVar11 = (uint)DAT_TileMapState::instance.SEC_PathfindingCostTileMap1105[param_7][uVar4]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; if ((int)this->searchQueue.currentDistance <= param_1) { if ((DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY) diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d1b15b115b..956163b66b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25271,7 +25271,7 @@ SHC_3BB0A8C1_0x004A5F60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A5F90 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004A6010 | 41.2% | small shared tail duplicated +SHC_3BB0A8C1_0x004A6010 | 49.4% | start SHC_3BB0A8C1_0x004A6120 | 0.0% | Pending From 07524b39922cbc4ffb3df416029609d02bd338c1 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:22 +0200 Subject: [PATCH 470/516] reimplement: SHC_3BB0A8C1_0x004A01D0 58.16% start --- .../PathFindingState/findBestAttackTileByPathCost.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp index d24527b7bf..d889ec5b1b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findBestAttackTileByPathCost.cpp @@ -52,7 +52,7 @@ namespace Map { this->searchQueue.yQueue[0] = (short)param_2; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[param_2].addXgetTile + param_1; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; dVar4 = local_8; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 956163b66b..93fd845c78 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24729,7 +24729,7 @@ SHC_3BB0A8C1_0x0049FF20 | 72.3% | entity id in an int local SHC_3BB0A8C1_0x004A0050 | 0.0% | Pending -SHC_3BB0A8C1_0x004A01D0 | 56.7% | statement order +SHC_3BB0A8C1_0x004A01D0 | 58.2% | start SHC_3BB0A8C1_0x004A0300 | 0.0% | Pending From d8e410b6004daeadeca309e8aefaf6d237d1f2fc Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:22 +0200 Subject: [PATCH 471/516] reimplement: SHC_3BB0A8C1_0x004A7F50 66.95% start --- ...aceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp index 00e7f2c565..51ad48c387 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findFreeSpaceNextToEnemyDefensiveStructureInSameAreaWithinDistance.cpp @@ -78,7 +78,7 @@ namespace Map { this->searchQueue.readIndex = 0; this->searchQueue.tilesQueue[0] = tile; this->searchQueue.yQueue[0] = _origY; - DAT_TileMapState::instance.CertainPathLayer[tile] = 1; + DAT_TileMapState::instance.CertainPathLayer[tile] = (short)this->searchQueue.currentDistance; this->searchQueue.xQueue[0] = tile - _origAXGT; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 93fd845c78..e8bfa8f82d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25303,7 +25303,7 @@ SHC_3BB0A8C1_0x004A75B0 | 49.2% | clamp arms from asm SHC_3BB0A8C1_0x004A79A0 | 64.1% | compare order from asm -SHC_3BB0A8C1_0x004A7F50 | 59.6% | narrowing casts removed, tie +SHC_3BB0A8C1_0x004A7F50 | 67.0% | start SHC_3BB0A8C1_0x004A80B0 | 0.0% | Pending From 0867f5ff97c8969810e599e5e089449318db68dd Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:22 +0200 Subject: [PATCH 472/516] reimplement: SHC_3BB0A8C1_0x0049B940 85.81% start --- .../findMapBorderEdgeTileAndStoreInSignpostData.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp index 64346353ae..b029725d4d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp @@ -53,7 +53,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], (uint)_tile < 80400) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e8bfa8f82d..0d95f963f3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24429,7 +24429,7 @@ SHC_3BB0A8C1_0x0049B6B0 | 0.0% | Pending SHC_3BB0A8C1_0x0049B8C0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049B940 | 70.3% | Style pass, asm differs +SHC_3BB0A8C1_0x0049B940 | 85.8% | start SHC_3BB0A8C1_0x0049BA30 | 0.0% | Pending From 5e49db554d32ba83d1114650f84c5497e24673e8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:23 +0200 Subject: [PATCH 473/516] reimplement: SHC_3BB0A8C1_0x0049CE40 62.24% start --- .../findPathableTileWithoutUnitWithBuildingAtXY.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp index 17b36fb497..96d7d2182f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp @@ -47,7 +47,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; _buildingAtStart = DAT_TileMapState::instance.BuildingLayer[this->searchQueue.tilesQueue[0]]; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0d95f963f3..89a4c80810 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24673,7 +24673,7 @@ SHC_3BB0A8C1_0x0049CD60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x0049CDB0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CE40 | 59.5% | Style pass, asm differs +SHC_3BB0A8C1_0x0049CE40 | 62.2% | start SHC_3BB0A8C1_0x0049CF30 | 0.0% | Pending From 443f5d07323de1519dac8ad5796f24348c968544 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:23 +0200 Subject: [PATCH 474/516] reimplement: SHC_3BB0A8C1_0x004A1D30 70.49% start --- .../Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp index 12098bd8f7..851eeab7f6 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -52,7 +52,7 @@ namespace Map { int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; DAT_TileMapState::instance.WalkLayer[_startTile] = (short)this->searchGeneration; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], -1 < iVar5 && (iVar5 < 0x13a10))) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 89a4c80810..fba468d159 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25171,7 +25171,7 @@ SHC_3BB0A8C1_0x004A1C40 | 98.7% | compare operand order SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1D30 | 70.1% | signed building type read +SHC_3BB0A8C1_0x004A1D30 | 70.5% | start SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending From 79e6100a68048b9c7161dbc993ad187d7f06dcd4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:23 +0200 Subject: [PATCH 475/516] reimplement: SHC_3BB0A8C1_0x0049D340 73.23% start --- .../PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp index dac213e4d2..422a1ab941 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findWalkableTileThatDoesNotContainUnit.cpp @@ -58,7 +58,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if ((DAT_TileMapState::instance.LogicLayer[this->searchQueue.tilesQueue[0]] & 0x30) == 0 && this->searchQueue.readIndex != this->searchQueue.writeIndex) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fba468d159..b318ffb45d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24681,7 +24681,7 @@ SHC_3BB0A8C1_0x0049D0E0 | 57.1% | signed unit layer local SHC_3BB0A8C1_0x0049D240 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D340 | 67.3% | signed unit layer local +SHC_3BB0A8C1_0x0049D340 | 73.2% | start SHC_3BB0A8C1_0x0049D470 | 0.0% | Pending From 37cb8d7ea94e4ead0de726ce726768594a0fbc50 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:24 +0200 Subject: [PATCH 476/516] reimplement: SHC_3BB0A8C1_0x004A9200 74.16% start --- .../Navigation/PathFindingState/isOpponentBuildingInRange.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp index 53af7a1391..15dba819c2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isOpponentBuildingInRange.cpp @@ -53,7 +53,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b318ffb45d..5d7fc75e4e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25453,7 +25453,7 @@ SHC_3BB0A8C1_0x004A91F6 | 0.0% | Pending SHC_3BB0A8C1_0x004A91F7 | 0.0% | Pending -SHC_3BB0A8C1_0x004A9200 | 58.8% | comma expr expanded, tie +SHC_3BB0A8C1_0x004A9200 | 74.2% | start SHC_3BB0A8C1_0x004A94E0 | 100.0% | Reimplemented From d89e0f4c87e3a2485dbca60b56ba6b1a7161533b Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:24 +0200 Subject: [PATCH 477/516] reimplement: SHC_3BB0A8C1_0x004A83B0 71.84% start --- ...teDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index 77bde7936f..120d525ae1 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -67,7 +67,7 @@ namespace Map { this->searchQueue.yQueue[0] = _tileY; this->searchQueue.xQueue[0] = tile - _axgt; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; - DAT_TileMapState::instance.CertainPathLayer[tile] = 1; + DAT_TileMapState::instance.CertainPathLayer[tile] = (short)this->searchQueue.currentDistance; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], _tile <= 0x13a0f) { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5d7fc75e4e..72d962bbce 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25311,7 +25311,7 @@ SHC_3BB0A8C1_0x004A8220 | 0.0% | Pending SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending -SHC_3BB0A8C1_0x004A83B0 | 71.6% | narrowing casts removed, tie +SHC_3BB0A8C1_0x004A83B0 | 71.8% | start SHC_3BB0A8C1_0x004A8780 | 81.5% | counted for + named layer From b2c4ae5dc6754512d17d47308cff003bc23287ab Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:25 +0200 Subject: [PATCH 478/516] reimplement: SHC_3BB0A8C1_0x004A0E50 99.20% start --- .../setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp index c54558ffc2..4f4026ead1 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp @@ -41,7 +41,7 @@ namespace Map { this->searchQueue.xQueue[0] = 198; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[2].addXgetTile + 0xc6; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { uint uVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 72d962bbce..7b78ced378 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24875,7 +24875,7 @@ SHC_3BB0A8C1_0x004A0E4A | 0.0% | Pending SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending -SHC_3BB0A8C1_0x004A0E50 | 94.9% | Style pass, asm differs +SHC_3BB0A8C1_0x004A0E50 | 99.2% | start SHC_3BB0A8C1_0x004A1230 | 60.8% | statement order From 697b21369eecfff32dbfd0fe2f618703dc5f7811 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:25 +0200 Subject: [PATCH 479/516] reimplement: SHC_3BB0A8C1_0x0049C020 75.36% start --- .../Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp index cb9598918d..c7ea160bce 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp @@ -54,7 +54,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 7b78ced378..09b65341ac 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24443,7 +24443,7 @@ SHC_3BB0A8C1_0x0049BD40 | 0.0% | Pending SHC_3BB0A8C1_0x0049BE60 | 51.6% | drop ghidra chkstk artifact st -SHC_3BB0A8C1_0x0049C020 | 74.3% | building id in an int local +SHC_3BB0A8C1_0x0049C020 | 75.4% | start SHC_3BB0A8C1_0x0049C100 | 0.0% | Pending From 3c657821b60199edb1cf4e2870d3410f43451612 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:50:25 +0200 Subject: [PATCH 480/516] reimplement: SHC_3BB0A8C1_0x0049D640 78.48% start --- .../PathFindingState/someBinaryAlgFunctionPathFinding.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp index 16a8f316c4..ce32d56f9b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp @@ -37,7 +37,7 @@ namespace Map { this->searchQueue.xQueue[0] = DAT_UnitsState::instance.units[param_1].x; int _startTile = DAT_UnitsState::instance.units[param_1].tile; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.CertainPathLayer[_startTile] = 1; + DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { do { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 09b65341ac..29c72b4975 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24687,7 +24687,7 @@ SHC_3BB0A8C1_0x0049D470 | 0.0% | Pending SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D640 | 78.0% | Style pass, asm differs +SHC_3BB0A8C1_0x0049D640 | 78.5% | start SHC_3BB0A8C1_0x0049D880 | 80.7% | Style pass, asm differs From c751277bb70bfbdfbc6440f153357e9453a494ef Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:57:47 +0200 Subject: [PATCH 481/516] reimplement: SHC_3BB0A8C1_0x004A4470 51.09% start mark from queue field --- .../Map/Navigation/PathFindingState/computeAIZoneLayer.cpp | 6 ++++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp index 4d062b46e6..a68d79419d 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeAIZoneLayer.cpp @@ -67,7 +67,8 @@ namespace Map { /* Mark the keep tile as AI Zone with value 1 (the starting point) */ - DAT_TileMapState::instance.AIZoneLayer[this->searchQueue.tilesQueue[0]] = 1; + DAT_TileMapState::instance.AIZoneLayer[this->searchQueue.tilesQueue[0]] + = (byte)this->searchQueue.currentDistance; /* Repurpose variable as iteration counter */ @@ -110,7 +111,8 @@ namespace Map { tile */ if ((char)DAT_TileMapState::instance.AIZoneLayer[_offsetTile] <= '\0' - && (_areaID = (short)DAT_TileMapState::instance.PathConnectionLayer[_offsetTile], _areaID != 0) + && (_areaID = (short)DAT_TileMapState::instance.PathConnectionLayer[_offsetTile], + _areaID != 0) && ((DAT_TileMapState::instance.PathLinkageLayer[_candidateTile] & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction]) != 0 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 29c72b4975..875d921218 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25221,7 +25221,7 @@ SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending SHC_3BB0A8C1_0x004A4140 | 85.5% | redundant parens removed -SHC_3BB0A8C1_0x004A4470 | 49.5% | area read via local; compare v +SHC_3BB0A8C1_0x004A4470 | 51.1% | start mark from queue field SHC_3BB0A8C1_0x004A4500 | 0.0% | Pending From 32f71cb2187a542128ce23e02dc2739995348f22 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:57:48 +0200 Subject: [PATCH 482/516] reimplement: SHC_3BB0A8C1_0x0049B940 86.51% bound literal from the asm --- .../findMapBorderEdgeTileAndStoreInSignpostData.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp index b029725d4d..2b4d8d96ca 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findMapBorderEdgeTileAndStoreInSignpostData.cpp @@ -56,7 +56,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], (uint)_tile < 80400) { + while (_tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex], (uint)_tile <= 0x13a0f) { _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 875d921218..85b167911c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24429,7 +24429,7 @@ SHC_3BB0A8C1_0x0049B6B0 | 0.0% | Pending SHC_3BB0A8C1_0x0049B8C0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049B940 | 85.8% | start +SHC_3BB0A8C1_0x0049B940 | 86.5% | bound literal from the asm SHC_3BB0A8C1_0x0049BA30 | 0.0% | Pending From 6647ffe4c76713ef1dd934f1feef36307d210922 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:57:48 +0200 Subject: [PATCH 483/516] reimplement: SHC_3BB0A8C1_0x004A1D30 70.49% walk store via queue field --- .../Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp index 851eeab7f6..3cbe0f9531 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -51,7 +51,7 @@ namespace Map { this->searchQueue.xQueue[0] = (short)x; int _startTile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; this->searchQueue.tilesQueue[0] = _startTile; - DAT_TileMapState::instance.WalkLayer[_startTile] = (short)this->searchGeneration; + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while ((iVar5 = this->searchQueue.tilesQueue[this->searchQueue.readIndex], diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 85b167911c..b4427aa79b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25171,7 +25171,7 @@ SHC_3BB0A8C1_0x004A1C40 | 98.7% | compare operand order SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1D30 | 70.5% | start +SHC_3BB0A8C1_0x004A1D30 | 70.5% | walk store via queue field SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending From 87578e63cf6df4ca3ecd2af136687015a5c3a838 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:57:48 +0200 Subject: [PATCH 484/516] reimplement: SHC_3BB0A8C1_0x004A79A0 64.96% clamp arms reordered --- .../Navigation/PathFindingState/pathPlanningForTribe.cpp | 8 +++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp index da78c2dfaa..fe8b812970 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathPlanningForTribe.cpp @@ -63,12 +63,10 @@ namespace Map { 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } unitCount = unitCount * 2; - if (unitCount < 500) { - if (unitCount < 50) { - unitCount = 50; - } - } else { + if (500 < unitCount) { unitCount = 500; + } else if (unitCount < 50) { + unitCount = 50; } this->searchQueue.readIndex = 0; this->searchQueue.writeIndex = 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b4427aa79b..31dd08a288 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25301,7 +25301,7 @@ SHC_3BB0A8C1_0x004A7090 | 99.6% | named matrix end field SHC_3BB0A8C1_0x004A75B0 | 49.2% | clamp arms from asm -SHC_3BB0A8C1_0x004A79A0 | 64.1% | compare order from asm +SHC_3BB0A8C1_0x004A79A0 | 65.0% | clamp arms reordered SHC_3BB0A8C1_0x004A7F50 | 67.0% | start From 29cb9ab054d14323f9e4516e617efa9d848564e2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sat, 17 Oct 2026 02:57:49 +0200 Subject: [PATCH 485/516] reimplement: SHC_3BB0A8C1_0x004A83B0 74.27% clamp arms reordered --- ...inationsArrayWithWallTileAndFreeTilePairInSameArea.cpp | 8 +++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp index 120d525ae1..879e062383 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/populateDestinationsArrayWithWallTileAndFreeTilePairInSameArea.cpp @@ -56,12 +56,10 @@ namespace Map { this->searchQueue.writeIndex = 1; this->searchQueue.readIndex = 0; maxDestinations = maxDestinations * 2; - if (maxDestinations < 500) { - if (maxDestinations < 50) { - maxDestinations = 50; - } - } else { + if (500 < maxDestinations) { maxDestinations = 500; + } else if (maxDestinations < 50) { + maxDestinations = 50; } this->searchQueue.tilesQueue[0] = tile; this->searchQueue.yQueue[0] = _tileY; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 31dd08a288..971b1dee43 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25311,7 +25311,7 @@ SHC_3BB0A8C1_0x004A8220 | 0.0% | Pending SHC_3BB0A8C1_0x004A8340 | 0.0% | Pending -SHC_3BB0A8C1_0x004A83B0 | 71.8% | start +SHC_3BB0A8C1_0x004A83B0 | 74.3% | clamp arms reordered SHC_3BB0A8C1_0x004A8780 | 81.5% | counted for + named layer From cb5b2dba8c7e673e69b6b8688953f03145c0ec16 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:18 +0200 Subject: [PATCH 486/516] reimplement: SHC_3BB0A8C1_0x0049F540 86.55% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../Map/Navigation/PathFindingState/algFindAttackAngle.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp index 501a876da3..4c86b13032 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/algFindAttackAngle.cpp @@ -26,7 +26,6 @@ namespace Map { { int _siegeIndex; int _tile; - int _tileOption; if (399 < x || 399 < y) { return 0; } @@ -51,7 +50,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { - _tileOption = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + int _tileOption = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if (_tileOption < 0) { break; } From f173e8a42b6d337ba302a22334d7415aa3ccf6fe Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:18 +0200 Subject: [PATCH 487/516] reimplement: SHC_3BB0A8C1_0x0049DDC0 35.62% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../budgetFloodFillOnCertainPathLayer.cpp | 15 +++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp index a9b3ff2939..543af2c569 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/budgetFloodFillOnCertainPathLayer.cpp @@ -24,15 +24,10 @@ namespace Map { void PathFindingState::budgetFloodFillOnCertainPathLayer(uint x, uint y, int marker, int budget) { int iVar1; - uint _candidate; - int _readIndex; uint _tilesQueue[1000]; uint _xs[1000]; uint _ys[1000]; - uint _tile; - uint _xUnk; - uint _yUnk; - _readIndex = 0; + int _readIndex = 0; int _writeIndex = 1; if (x > 399 || y > 399) { return; @@ -45,7 +40,7 @@ namespace Map { _xs[0] = x; _tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; do { - _tile = _tilesQueue[_readIndex]; + uint _tile = _tilesQueue[_readIndex]; if (0x13a0f < _tile) { return; } @@ -55,11 +50,11 @@ namespace Map { if (999 <= _writeIndex) { return; } - _yUnk = _xs[_readIndex]; - _xUnk = _ys[_readIndex]; + uint _yUnk = _xs[_readIndex]; + uint _xUnk = _ys[_readIndex]; DAT_TileMapState::instance.CertainPathLayer[_tile] = (short)marker; for (int _direction = 0; _direction < 8; _direction = _direction + 4) { - _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction] + _tile; + uint _candidate = DAT_TileMapState::instance.directionTranslationMatrix[_xUnk][_direction] + _tile; if (DAT_TileMapState::instance.WalkLayer[_candidate] == this->searchGeneration) { if (DAT_TileMapState::instance.CertainPathLayer[_candidate] == marker) { budget = budget + -1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 971b1dee43..8b700447dd 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24695,7 +24695,7 @@ SHC_3BB0A8C1_0x0049D970 | 0.0% | Pending SHC_3BB0A8C1_0x0049DB30 | 83.3% | statement order -SHC_3BB0A8C1_0x0049DDC0 | 35.6% | bound literals from asm, frame +SHC_3BB0A8C1_0x0049DDC0 | 35.6% | Style pass, asm differs SHC_3BB0A8C1_0x0049E0D0 | 87.5% | Style pass, asm differs From 6dde6d4038a26341ddc4786cae7fcac368319882 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:18 +0200 Subject: [PATCH 488/516] reimplement: SHC_3BB0A8C1_0x00498A40 82.17% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- ...lculatePathKeepAndWallsGatesNotAllowed.cpp | 222 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 111 insertions(+), 113 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp index 3061fde2d9..53faaee291 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculatePathKeepAndWallsGatesNotAllowed.cpp @@ -25,8 +25,6 @@ namespace Map { int x1, int y1, int x2, int y2, int maxTries) { uint uVar4; - int iVar6; - uint _tile; if (399 < (uint)x1 || 399 < (uint)y1) { return (undefined4)(0); } @@ -58,7 +56,7 @@ namespace Map { } if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { - _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if (_tile == uVar4) { return (undefined4)(1); } @@ -68,125 +66,125 @@ namespace Map { int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_tile]; for (int iVar3 = 0; iVar3 < 8; iVar3 = iVar3 + 4) { - iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3] + _tile; + int iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3] + _tile; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_tile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3]) - != 0 - && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 - || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) - || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 - && (DAT_BuildingDefinedData::instance - .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] - .buildingType] - != 0))))) { - DAT_TileMapState::instance.CertainPathLayer[iVar6] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] - .short_.xOffset - + sVar2; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] - .short_.yOffset - + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3 + 1] + _tile; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_tile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 1]) - != 0 - && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 - || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) - || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 - && (DAT_BuildingDefinedData::instance - .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] - .buildingType] - != 0))))) { - DAT_TileMapState::instance.CertainPathLayer[iVar6] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] - .short_.xOffset - + sVar2; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] - .short_.yOffset - + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 1]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 1] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3 + 2] + _tile; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_tile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 2]) - != 0 - && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 - || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) - || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 - && (DAT_BuildingDefinedData::instance - .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] - .buildingType] - != 0))))) { - DAT_TileMapState::instance.CertainPathLayer[iVar6] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] - .short_.xOffset - + sVar2; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] - .short_.yOffset - + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 2]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 2] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][iVar3 + 3] + _tile; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration - && (DAT_TileMapState::instance.PathLinkageLayer[_tile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 3]) - != 0 - && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 - || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) - || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 - && (DAT_BuildingDefinedData::instance - .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance - .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] - .buildingType] - != 0))))) { - DAT_TileMapState::instance.CertainPathLayer[iVar6] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] - .short_.xOffset - + sVar2; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] - .short_.yOffset - + sVar1; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + && (DAT_TileMapState::instance.PathLinkageLayer[_tile] + & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[iVar3 + 3]) + != 0 + && (((DAT_TileMapState::instance.LogicLayer[iVar6] & 2U) != 0 + || ((DAT_TileMapState::instance.LogicLayer[iVar6] & 0x10000100U) == 0)) + || ((DAT_TileMapState::instance.BuildingLayer[iVar6] != 0 + && (DAT_BuildingDefinedData::instance + .BuildingIsGateHouseArray[(short)DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar6]] + .buildingType] + != 0))))) { + DAT_TileMapState::instance.CertainPathLayer[iVar6] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar6] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar3 + 3] + .short_.yOffset + + sVar1; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar6; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; + } } } this->searchQueue.readIndex = this->searchQueue.readIndex + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8b700447dd..336e4cc73c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24377,7 +24377,7 @@ SHC_3BB0A8C1_0x00498400 | 49.8% | uniform unrolled bodies with d SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending -SHC_3BB0A8C1_0x00498A40 | 82.2% | fix off-by-one maxTries +SHC_3BB0A8C1_0x00498A40 | 82.2% | Style pass, asm differs SHC_3BB0A8C1_0x00498B70 | 0.0% | Pending From f7f3cf8b9a9197cd29ff3a8d8106013324897122 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:18 +0200 Subject: [PATCH 489/516] reimplement: SHC_3BB0A8C1_0x004A3B20 47.82% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../PathFindingState/certainDamageToUnitsUnk.cpp | 9 +++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp index 5b8d6f39d7..be7b139c78 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/certainDamageToUnitsUnk.cpp @@ -41,10 +41,7 @@ namespace Map { int param_1, int param_2, int param_3, int param_4, undefined4 param_5) { short sVar6; - int iVar9; int iVar11; - EntityType local_8; - int local_4; this->searchGeneration = this->searchGeneration + 1; this->calculations = this->calculations + 1; if (32000 < this->searchGeneration) { @@ -53,8 +50,8 @@ namespace Map { 0x27420, '\0', (void*)((int)(DAT_TileMapState::instance.WalkLayer))); } uint uVar7 = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[param_1]; - iVar9 = param_1 - DAT_ViewportRenderState::instance.translationMatrix[uVar7].addXgetTile; - local_4 = 1; + int iVar9 = param_1 - DAT_ViewportRenderState::instance.translationMatrix[uVar7].addXgetTile; + int local_4 = 1; uint uVar1 = iVar9 + 100; if (399 < uVar1 || 399 < uVar7 || DAT_ViewportRenderState::instance.DAT_BinaryTileMap400x400[uVar7 * 400 + uVar1] == '\0') { @@ -68,7 +65,7 @@ namespace Map { this->searchQueue.writeIndex = 1; DAT_TileMapState::instance.CertainPathLayer[param_1] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; - local_8 = OpenSHC::Map::Entities::ET_ARROW_AND_DEFAULT; + EntityType local_8 = OpenSHC::Map::Entities::ET_ARROW_AND_DEFAULT; if ((char)param_5 == '\0') { local_8 = OpenSHC::Map::Entities::ET_CATAPULT; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 336e4cc73c..3e832f89bb 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25215,7 +25215,7 @@ SHC_3BB0A8C1_0x004A37D0 | 0.0% | Pending SHC_3BB0A8C1_0x004A3860 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3B20 | 47.8% | start +SHC_3BB0A8C1_0x004A3B20 | 47.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A3E80 | 0.0% | Pending From df34e91613ad66d8573cfe9f294b5fdf455fafc2 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:18 +0200 Subject: [PATCH 490/516] reimplement: SHC_3BB0A8C1_0x0049CB00 51.88% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../PathFindingState/computeNextRallyPointDestination.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp index bf85e7d0bc..3d8dbfc61c 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeNextRallyPointDestination.cpp @@ -22,7 +22,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049CB00 void PathFindingState::computeNextRallyPointDestination(int unitID, int xPos, int yPos) { - int _cY_2; int (*_cY2)[8]; int _cTile; short _cX; @@ -53,7 +52,7 @@ namespace Map { -1 < _cTile && (_cTile < 0x13a10))) { _cX = this->searchQueue.xQueue[this->searchQueue.readIndex]; _cY = this->searchQueue.yQueue[this->searchQueue.readIndex]; - _cY_2 = (int)_cY; + int _cY_2 = (int)_cY; if ((short)DAT_TileMapState::instance.UnitLayer[_cTile] == unitID) { this->ALG_ResultX = (int)_cX; this->ALG_ResultY = _cY_2; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3e832f89bb..a22d08f38d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24665,7 +24665,7 @@ SHC_3BB0A8C1_0x0049C690 | 77.1% | four gotos as combined conditi SHC_3BB0A8C1_0x0049C730 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CB00 | 51.9% | statement order +SHC_3BB0A8C1_0x0049CB00 | 51.9% | Style pass, asm differs SHC_3BB0A8C1_0x0049CBE0 | 0.0% | Pending From acea88bf3a9f0cb9800d67a530da0d78c5db8ebe Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:19 +0200 Subject: [PATCH 491/516] reimplement: SHC_3BB0A8C1_0x00497280 55.76% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../PathFindingState/doMoveFromTileToTile.cpp | 15 +++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp index c2952105c7..6fa4d5e836 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/doMoveFromTileToTile.cpp @@ -29,13 +29,8 @@ namespace Map { BOOLEnum PathFindingState::doMoveFromTileToTile( int unitID, int tile, int y, int direction, int param_5, int ignoreAssassinClimbing) { - byte bVar2; uint uVar3; - int _targetTile; uint uVar4; - ushort _terrainHeight2; - ushort _height; - ushort _terrainHeight; if (param_5 == 0) { /* if we cannot move in that direction from the current tile? @@ -43,7 +38,7 @@ namespace Map { if ((DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[direction] & DAT_TileMapState::instance.PathLinkageLayer[tile]) == 0) { - _targetTile = DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile; + int _targetTile = DAT_TileMapState::instance.directionTranslationMatrix[y][direction] + tile; if (ignoreAssassinClimbing == 0) { if (DAT_UnitsState::instance.units[unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) { uVar3 = DAT_TileMapState::instance.LogicLayer[_targetTile]; @@ -51,12 +46,12 @@ namespace Map { && (uVar4 = DAT_TileMapState::instance.LogicLayer[tile] & 0x100, uVar4 == 0 || ((uVar3 & 0x100) == 0)) && (uVar4 != 0 || ((uVar3 & 0x100) != 0))) { - _height = DAT_TileMapState::instance.HeightLayer[tile]; + ushort _height = DAT_TileMapState::instance.HeightLayer[tile]; DAT_UnitsState::instance.units[unitID].animationCycleNumber = 0; DAT_UnitsState::instance.units[unitID].field306_0x418 = 0; if (uVar4 == 0) { - _terrainHeight = DAT_TileMapState::instance.HeightLayer[_targetTile]; - bVar2 = DAT_TileMapState::instance.WallOwnerLayer[_targetTile]; + ushort _terrainHeight = DAT_TileMapState::instance.HeightLayer[_targetTile]; + byte bVar2 = DAT_TileMapState::instance.WallOwnerLayer[_targetTile]; DAT_UnitsState::instance.units[unitID].state.generic = OpenSHC::Map::Units::States::US_ASSASSIN_THROWING_HOOK; DAT_UnitsState::instance.units[unitID].assassinHeightDifference @@ -66,7 +61,7 @@ namespace Map { DAT_UnitsState::instance.units[unitID].ownerOfAssassinScaledObject = (bVar2 & 7) + 1; } else { - _terrainHeight2 = DAT_TileMapState::instance.HeightLayer[_targetTile]; + ushort _terrainHeight2 = DAT_TileMapState::instance.HeightLayer[_targetTile]; DAT_UnitsState::instance.units[unitID].state.generic = OpenSHC::Map::Units::States::US_ASSASSIN_START_CLIMBING_DOWN; DAT_UnitsState::instance.units[unitID].assassinHeightDifference diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a22d08f38d..32cc768cad 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24359,7 +24359,7 @@ SHC_3BB0A8C1_0x00497080 | 78.1% | hoist signed start-tile read SHC_3BB0A8C1_0x00497180 | 97.1% | int locals for the 16-bit read -SHC_3BB0A8C1_0x00497280 | 55.8% | param_5 block out of line +SHC_3BB0A8C1_0x00497280 | 55.8% | Style pass, asm differs SHC_3BB0A8C1_0x004974D0 | 32.1% | statement order From 6dad044430603c96e2303f293cc78d41335b3351 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:19 +0200 Subject: [PATCH 492/516] reimplement: SHC_3BB0A8C1_0x0049EDF0 78.69% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp index a6417107f4..f11b8ae051 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAIZoneWithFlags.cpp @@ -25,7 +25,6 @@ namespace Map { BOOLEnum PathFindingState::findAIZoneWithFlags(int maxDistance, uint x, uint y, undefined4 aiInfoFlags) { int _candidate; - int _tile; this->calculations = this->calculations + 1; if (x > 399 || y > 399) { return FALSE; @@ -50,7 +49,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { - _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if (_tile < 0) { break; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 32cc768cad..bb8fb49b67 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24705,7 +24705,7 @@ SHC_3BB0A8C1_0x0049E9E0 | 70.0% | statement order SHC_3BB0A8C1_0x0049EB00 | 0.0% | Pending -SHC_3BB0A8C1_0x0049EDF0 | 78.7% | start +SHC_3BB0A8C1_0x0049EDF0 | 78.7% | Style pass, asm differs SHC_3BB0A8C1_0x0049EED0 | 0.0% | Pending From 7c95aeb8378d0b8f83c0112084c7782d4dc721f4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:19 +0200 Subject: [PATCH 493/516] reimplement: SHC_3BB0A8C1_0x004A3220 77.16% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp index 1e8814733d..26aba64015 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findAccessibleWallAndNearbyFreeTile.cpp @@ -28,7 +28,6 @@ namespace Map { { uint uVar2; int _candidateNorthOrSouth; - uint _tile; this->searchGeneration = this->searchGeneration + 1; this->calculations = this->calculations + 1; if (32000 < this->searchGeneration) { @@ -48,7 +47,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { - _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if ((int)_tile < 0) { break; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bb8fb49b67..11cf00cfc9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25207,7 +25207,7 @@ SHC_3BB0A8C1_0x004A2F00 | 0.0% | Pending SHC_3BB0A8C1_0x004A31D0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A3220 | 77.2% | signed start row local +SHC_3BB0A8C1_0x004A3220 | 77.2% | Style pass, asm differs SHC_3BB0A8C1_0x004A36B0 | 82.7% | signed queue reads From db4d4bb87cc6aed835b04037491696b7dd13fa6e Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:19 +0200 Subject: [PATCH 494/516] reimplement: SHC_3BB0A8C1_0x0049F040 86.55% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../PathFindingState/findArcherRelatedAttackInfoIndex.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp index 48ce6cd7d6..038cc361dc 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findArcherRelatedAttackInfoIndex.cpp @@ -29,7 +29,6 @@ namespace Map { { int iVar4; int _candidate; - int _tile; if (399 < x || 399 < y) { return 0; } @@ -54,7 +53,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { - _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + int _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if (_tile < 0) { break; } @@ -95,7 +94,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[_candidate] = (short)this->searchQueue.currentDistance + 1; int sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar5] - .short_.xOffset; + .short_.xOffset; DAT_TileMapState::instance.WalkLayer[_candidate] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; this->searchQueue.yQueue[this->searchQueue.writeIndex] From 669cc6761019e7d41bfc55bccfd4049d6f580944 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:19 +0200 Subject: [PATCH 495/516] reimplement: SHC_3BB0A8C1_0x0049CE40 62.24% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../findPathableTileWithoutUnitWithBuildingAtXY.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp index 96d7d2182f..cdaa63ee8b 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findPathableTileWithoutUnitWithBuildingAtXY.cpp @@ -22,7 +22,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049CE40 void PathFindingState::findPathableTileWithoutUnitWithBuildingAtXY(int unitID, int x, int y) { - int iVar2; int (*paiVar3)[8]; int _buildingAtStart; int _tile; @@ -61,7 +60,7 @@ namespace Map { } _x = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; _y = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; - iVar2 = (int)_y; + int iVar2 = (int)_y; int _unitID = (int)(short)DAT_TileMapState::instance.UnitLayer[_tile]; if (_unitID == unitID) { this->ALG_ResultX = (int)_x; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 11cf00cfc9..5c4ebd73c7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24673,7 +24673,7 @@ SHC_3BB0A8C1_0x0049CD60 | 100.0% | Reimplemented SHC_3BB0A8C1_0x0049CDB0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049CE40 | 62.2% | start +SHC_3BB0A8C1_0x0049CE40 | 62.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049CF30 | 0.0% | Pending From ff5bb95b215ecefd0765aa012284f63926cd1e1e Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:20 +0200 Subject: [PATCH 496/516] reimplement: SHC_3BB0A8C1_0x004A1D30 70.49% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../PathFindingState/findSomeSuitableLocationUnk.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp index 3cbe0f9531..814c20ec81 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSomeSuitableLocationUnk.cpp @@ -30,7 +30,6 @@ namespace Map { undefined4 PathFindingState::findSomeSuitableLocationUnk(int param_1, uint x, uint y, int param_4) { int iVar5; - int iVar8; if (399 < x || 399 < y) { return (undefined4)(0); } @@ -84,7 +83,7 @@ namespace Map { return (undefined4)(1); } for (int _direction = 0; _direction < 8; _direction = _direction + 4) { - iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + iVar5; + int iVar8 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + iVar5; if (DAT_TileMapState::instance.WalkLayer[iVar8] != this->searchGeneration && (DAT_TileMapState::instance.LogicLayer[iVar8] & 0x30) == 0) { DAT_TileMapState::instance.CertainPathLayer[iVar8] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5c4ebd73c7..5aa4c9be3d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25171,7 +25171,7 @@ SHC_3BB0A8C1_0x004A1C40 | 98.7% | compare operand order SHC_3BB0A8C1_0x004A1CC0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A1D30 | 70.5% | walk store via queue field +SHC_3BB0A8C1_0x004A1D30 | 70.5% | Style pass, asm differs SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending From c49df033a7a8c6a2e68ff4e1b5bdfd25500f0318 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:20 +0200 Subject: [PATCH 497/516] reimplement: SHC_3BB0A8C1_0x0049F2D0 86.04% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../Navigation/PathFindingState/findSupportPointIndex.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp index a322362968..c34dda9eb5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSupportPointIndex.cpp @@ -24,7 +24,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049F2D0 int PathFindingState::findSupportPointIndex(int max, uint x, uint y, int tribeID) { - int iVar4; int iVar5; int tile; if (399 < x || 399 < y) { @@ -51,7 +50,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { - iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + int iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if (iVar4 < 0) { break; } @@ -86,7 +85,7 @@ namespace Map { DAT_TileMapState::instance.CertainPathLayer[tile] = (short)this->searchQueue.currentDistance + 1; int sVar3 = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[iVar6] - .short_.xOffset; + .short_.xOffset; DAT_TileMapState::instance.WalkLayer[tile] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = sVar3 + sVar1; this->searchQueue.yQueue[this->searchQueue.writeIndex] From 0d298eee5ac5e6a14b07628b5a977d2e19dc31cb Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:20 +0200 Subject: [PATCH 498/516] reimplement: SHC_3BB0A8C1_0x004A2DD0 77.83% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../PathFindingState/igniteFireAtTilesDistanceAway.cpp | 9 +++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp index a36b0446e5..6bc5e205cf 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/igniteFireAtTilesDistanceAway.cpp @@ -24,13 +24,10 @@ namespace Map { undefined4 PathFindingState::igniteFireAtTilesDistanceAway(int tile, int maxDistance, int playerID) { int iVar5; - int _index2; - int _index; uint _tiles[100]; uint _tile; - uint _cTile; this->calculations = this->calculations + 1; - _index = 0; + int _index = 0; this->searchGeneration = this->searchGeneration + 1; if (32000 < this->searchGeneration) { this->searchGeneration = 1; @@ -151,10 +148,10 @@ namespace Map { break; } } - _index2 = 0; + int _index2 = 0; if (0 < _index) { do { - _cTile = _tiles[_index2]; + uint _cTile = _tiles[_index2]; MACRO_CALL(OpenSHC::Map::Entities_Func::IgniteFireAtMiniTile_Convenience)(playerID, (_cTile - DAT_ViewportRenderState::instance diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5aa4c9be3d..fe22b2964c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25201,7 +25201,7 @@ SHC_3BB0A8C1_0x004A2DC4 | 0.0% | Pending SHC_3BB0A8C1_0x004A2DC8 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2DD0 | 77.8% | signed start row local +SHC_3BB0A8C1_0x004A2DD0 | 77.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A2F00 | 0.0% | Pending From c96ff14aa14af5159e26757cf8276f398ff73976 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:20 +0200 Subject: [PATCH 499/516] reimplement: SHC_3BB0A8C1_0x004A2650 65.74% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../Navigation/PathFindingState/isSignPostWithinDistance.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp index 04cbd702f5..4025fac425 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/isSignPostWithinDistance.cpp @@ -38,7 +38,6 @@ namespace Map { BOOLEnum PathFindingState::isSignPostWithinDistance(uint x, uint y, int limit) { int iVar3; - int iVar6; if (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY) { return FALSE; } @@ -82,7 +81,7 @@ namespace Map { return TRUE; } for (int _direction = 0; _direction < 8; _direction = _direction + 4) { - iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + iVar3; + int iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[sVar2][_direction] + iVar3; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { DAT_TileMapState::instance.CertainPathLayer[iVar6] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fe22b2964c..a68eb5ae19 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25179,7 +25179,7 @@ SHC_3BB0A8C1_0x004A21B0 | 84.8% | statement order SHC_3BB0A8C1_0x004A22C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004A2650 | 65.7% | building id in an int local +SHC_3BB0A8C1_0x004A2650 | 65.7% | Style pass, asm differs SHC_3BB0A8C1_0x004A2740 | 0.0% | Pending From 589a7332040c01091e62cea1bf6b9d247d55f64c Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:20 +0200 Subject: [PATCH 500/516] reimplement: SHC_3BB0A8C1_0x00498400 49.76% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../pathFindingWithBuildingsIncluded.cpp | 54 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp index cba316a5a2..bbd6c6f5c2 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/pathFindingWithBuildingsIncluded.cpp @@ -71,11 +71,6 @@ namespace Map { int _nextTileOption; uint uVar3; uint _tile2; - int _buildingID; - uint _currentTile; - int _currentX; - int _currentY; - uint _logical; if (399 < x || 399 < y) { return FALSE; } @@ -112,21 +107,21 @@ namespace Map { } if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { - _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + uint _currentTile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if (_currentTile == _tile2) { return TRUE; } if ((this->searchQueue.readIndex >= maxOptionsToTry) || (80400 <= _currentTile)) break; - _currentX = this->searchQueue.xQueue[this->searchQueue.readIndex]; - _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; + int _currentX = this->searchQueue.xQueue[this->searchQueue.readIndex]; + int _currentY = this->searchQueue.yQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[_currentTile]; if (400 < (int)this->searchQueue.currentDistance) { return FALSE; } - _buildingID = DAT_TileMapState::instance.BuildingLayer[_currentTile]; - _logical = DAT_TileMapState::instance.LogicLayer[_currentTile]; + int _buildingID = DAT_TileMapState::instance.BuildingLayer[_currentTile]; + uint _logical = DAT_TileMapState::instance.LogicLayer[_currentTile]; for (int _direction = 0; _direction < 8; _direction = _direction + 4) { _nextTileOption = DAT_TileMapState::instance.directionTranslationMatrix[_currentY][_direction] @@ -144,8 +139,7 @@ namespace Map { && (uVar3 != 0 || (uVar1 & 0x100) != 0)))) { DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] - = (short)this->searchGeneration; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] .short_.xOffset @@ -165,7 +159,8 @@ namespace Map { + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 1]) + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 1]) != 0 || (((_direction + 1) & 1) == 0 && (uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], @@ -176,14 +171,15 @@ namespace Map { && (uVar3 != 0 || (uVar1 & 0x100) != 0)))) { DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] - = (short)this->searchGeneration; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] .short_.xOffset + _currentX; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 1] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 1] .short_.yOffset + _currentY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; @@ -197,7 +193,8 @@ namespace Map { + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 2]) + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 2]) != 0 || (((_direction + 2) & 1) == 0 && (uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], @@ -208,14 +205,15 @@ namespace Map { && (uVar3 != 0 || (uVar1 & 0x100) != 0)))) { DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] - = (short)this->searchGeneration; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] .short_.xOffset + _currentX; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 2] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 2] .short_.yOffset + _currentY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; @@ -229,7 +227,8 @@ namespace Map { + _currentTile; if (DAT_TileMapState::instance.WalkLayer[_nextTileOption] != this->searchGeneration && ((DAT_TileMapState::instance.PathLinkageLayer[_currentTile] - & DAT_ClimbLogicDefinedData::instance.BitFlagHelperForPathLinkage[_direction + 3]) + & DAT_ClimbLogicDefinedData::instance + .BitFlagHelperForPathLinkage[_direction + 3]) != 0 || (((_direction + 3) & 1) == 0 && (uVar1 = DAT_TileMapState::instance.LogicLayer[_nextTileOption], @@ -240,14 +239,15 @@ namespace Map { && (uVar3 != 0 || (uVar1 & 0x100) != 0)))) { DAT_TileMapState::instance.CertainPathLayer[_nextTileOption] = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[_nextTileOption] - = (short)this->searchGeneration; + DAT_TileMapState::instance.WalkLayer[_nextTileOption] = (short)this->searchGeneration; this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] .short_.xOffset + _currentX; this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction + 3] + = DAT_TerrainDefinedData::instance + .clockwiseCardinalTranslationMatrix[_direction + 3] .short_.yOffset + _currentY; this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = _nextTileOption; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a68eb5ae19..a49e3fe68a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24373,7 +24373,7 @@ SHC_3BB0A8C1_0x00498020 | 61.4% | counted direction loop, combin SHC_3BB0A8C1_0x00498170 | 0.0% | Pending -SHC_3BB0A8C1_0x00498400 | 49.8% | uniform unrolled bodies with d +SHC_3BB0A8C1_0x00498400 | 49.8% | Style pass, asm differs SHC_3BB0A8C1_0x004985D0 | 0.0% | Pending From d6e210110f949e4b8a6b0417f142cae9c90e5ba3 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:21 +0200 Subject: [PATCH 501/516] reimplement: SHC_3BB0A8C1_0x004A21B0 84.82% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../placeCommemoratingStatueAtGoodLocation.cpp | 9 +++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp index b26cd1ed09..8c796903a5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/placeCommemoratingStatueAtGoodLocation.cpp @@ -36,14 +36,11 @@ namespace Map { void PathFindingState::placeCommemoratingStatueAtGoodLocation(int playerID) { int iVar3; - int iVar6; MappersEnum commandBuildingType; - uint uVar7; - uint uVar8; int sVar1 = DAT_GameState::instance.playerDataArray[playerID].someKeepRelatedX2; - uVar7 = (uint)sVar1; + uint uVar7 = (uint)sVar1; int sVar2 = DAT_GameState::instance.playerDataArray[playerID].someKeepRelatedY2; - uVar8 = (uint)sVar2; + uint uVar8 = (uint)sVar2; if (uVar7 > 399 || uVar8 > 399) { return; } @@ -93,7 +90,7 @@ namespace Map { if (DAT_TileMapState::instance.buildingPlacementFail == FALSE) break; for (int _direction = 0; _direction < 8; _direction = _direction + 4) { - iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[uVar7][_direction] + iVar3; + int iVar6 = DAT_TileMapState::instance.directionTranslationMatrix[uVar7][_direction] + iVar3; if (DAT_TileMapState::instance.WalkLayer[iVar6] != this->searchGeneration && (DAT_TileMapState::instance.LogicLayer[iVar6] & 0x30) == 0) { DAT_TileMapState::instance.CertainPathLayer[iVar6] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a49e3fe68a..230da72325 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -25175,7 +25175,7 @@ SHC_3BB0A8C1_0x004A1D30 | 70.5% | Style pass, asm differs SHC_3BB0A8C1_0x004A1E10 | 0.0% | Pending -SHC_3BB0A8C1_0x004A21B0 | 84.8% | statement order +SHC_3BB0A8C1_0x004A21B0 | 84.8% | Style pass, asm differs SHC_3BB0A8C1_0x004A22C0 | 0.0% | Pending From 3c827c14d6905875aae7391494ae2de6511ea129 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:21 +0200 Subject: [PATCH 502/516] reimplement: SHC_3BB0A8C1_0x0049A6D0 72.45% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp index ccce4449fd..fc484975e5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/raiseLand2.cpp @@ -23,7 +23,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049A6D0 void PathFindingState::raiseLand2(uint x, uint y, int maxDistance) { - int iVar5; if (x > 399 || y > 399) { return; } @@ -53,7 +52,7 @@ namespace Map { MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::raiseLand, DAT_TileMapState::ptr)( tile, (uint)(sVar3), 4, 1); for (int _direction = 0; _direction < 8; _direction = _direction + 4) { - iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction] + tile; + int iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction] + tile; if (DAT_TileMapState::instance.CertainPathLayer[iVar5] < 1 && (short)DAT_TileMapState::instance.PathConnectionLayer[iVar5] == uVar1 && (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x30) == 0) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 230da72325..0099738d6d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24405,7 +24405,7 @@ SHC_3BB0A8C1_0x0049A5E0 | 78.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049A610 | 0.0% | Pending -SHC_3BB0A8C1_0x0049A6D0 | 72.5% | unsigned area read, matches mo +SHC_3BB0A8C1_0x0049A6D0 | 72.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A800 | 0.0% | Pending From 9891e72ee7519137a51b10acde2e139f8dee89a5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:21 +0200 Subject: [PATCH 503/516] reimplement: SHC_3BB0A8C1_0x004A0E50 99.20% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp index 4f4026ead1..2aeeb53c78 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp @@ -24,7 +24,6 @@ namespace Map { void PathFindingState::setWalkabilityBorderLogicLayerForSmallerMapSizes() { short sVar3; - int _candidateTile; this->searchGeneration = this->searchGeneration + 1; this->resultTile = 0; this->resultY = 0; @@ -52,7 +51,8 @@ namespace Map { int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[uVar4]; for (int _direction = 0; _direction < 8; _direction = _direction + 4) { - _candidateTile = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction] + uVar4; + int _candidateTile + = DAT_TileMapState::instance.directionTranslationMatrix[sVar1][_direction] + uVar4; if (DAT_TileMapState::instance.WalkLayer[_candidateTile] != this->searchGeneration && (DAT_TileMapState::instance.LogicLayer[_candidateTile] & 0x30) == 0) { DAT_TileMapState::instance.CertainPathLayer[_candidateTile] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 0099738d6d..d392b28164 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24875,7 +24875,7 @@ SHC_3BB0A8C1_0x004A0E4A | 0.0% | Pending SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending -SHC_3BB0A8C1_0x004A0E50 | 99.2% | start +SHC_3BB0A8C1_0x004A0E50 | 99.2% | Style pass, asm differs SHC_3BB0A8C1_0x004A1230 | 60.8% | statement order From 9a45a1aa529c04bd9dd6488bed6b27da6495bf8d Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:21 +0200 Subject: [PATCH 504/516] reimplement: SHC_3BB0A8C1_0x0049C020 75.36% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp | 3 +-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp index c7ea160bce..04ad4cc42a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setupBabyTreeLocationInfo.cpp @@ -29,7 +29,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049C020 undefined4 PathFindingState::setupBabyTreeLocationInfo(int param_1, int treeType, uint x, uint y) { - int iVar4; int (*paiVar8)[8]; this->ALG_ResultTile = 0; this->ALG_ResultY = 0; @@ -58,7 +57,7 @@ namespace Map { DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { while (true) { - iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + int iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; if (iVar4 < 0) { break; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d392b28164..293e318a1d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24443,7 +24443,7 @@ SHC_3BB0A8C1_0x0049BD40 | 0.0% | Pending SHC_3BB0A8C1_0x0049BE60 | 51.6% | drop ghidra chkstk artifact st -SHC_3BB0A8C1_0x0049C020 | 75.4% | start +SHC_3BB0A8C1_0x0049C020 | 75.4% | Style pass, asm differs SHC_3BB0A8C1_0x0049C100 | 0.0% | Pending From 212ed831bfc817ea6721380727eb61e05fc2bedd Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:21 +0200 Subject: [PATCH 505/516] reimplement: SHC_3BB0A8C1_0x0049D640 84.39% do-while collapsed, was 78.5% Co-Authored-By: Claude Opus 5 (1M context) --- .../someBinaryAlgFunctionPathFinding.cpp | 88 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp index ce32d56f9b..8d31266250 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/someBinaryAlgFunctionPathFinding.cpp @@ -39,54 +39,52 @@ namespace Map { this->searchQueue.tilesQueue[0] = _startTile; DAT_TileMapState::instance.CertainPathLayer[_startTile] = (short)this->searchQueue.currentDistance; DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)this->searchGeneration; - if (this->searchQueue.readIndex != this->searchQueue.writeIndex) { - do { - int iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; - if (iVar4 < 0) { - return (undefined4)(1); - } - if (0x13a10 <= iVar4) { - return (undefined4)(1); - } - int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; - int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; - this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; - if (0x13a10 < (int)this->searchQueue.currentDistance) { - return (undefined4)(1); - } - for (int _direction = 0; _direction < 8; _direction = _direction + 1) { - int iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction] + iVar4; - if ((DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) - && (DAT_TileMapState::instance.PathConnectionLayer[iVar5] == uVar1)) { - if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x10000100U) == 0 - || (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x400000U) != 0) { - return (undefined4)(0); - } - DAT_TileMapState::instance.CertainPathLayer[iVar5] - = (short)this->searchQueue.currentDistance + 1; - DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; - this->searchQueue.xQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] - .short_.xOffset - + sVar2; - this->searchQueue.yQueue[this->searchQueue.writeIndex] - = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] - .short_.yOffset - + sVar3; - this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; - this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; - if (0x13a10 <= (int)this->searchQueue.writeIndex) { - this->searchQueue.writeIndex = 0; - } + while (this->searchQueue.readIndex != this->searchQueue.writeIndex) { + int iVar4 = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; + if (iVar4 < 0) { + return (undefined4)(1); + } + if (0x13a10 <= iVar4) { + return (undefined4)(1); + } + int sVar2 = (int)this->searchQueue.xQueue[this->searchQueue.readIndex]; + int sVar3 = (int)this->searchQueue.yQueue[this->searchQueue.readIndex]; + this->searchQueue.currentDistance = (int)DAT_TileMapState::instance.CertainPathLayer[iVar4]; + if (0x13a10 < (int)this->searchQueue.currentDistance) { + return (undefined4)(1); + } + for (int _direction = 0; _direction < 8; _direction = _direction + 1) { + int iVar5 = DAT_TileMapState::instance.directionTranslationMatrix[sVar3][_direction] + iVar4; + if ((DAT_TileMapState::instance.WalkLayer[iVar5] != this->searchGeneration) + && (DAT_TileMapState::instance.PathConnectionLayer[iVar5] == uVar1)) { + if ((DAT_TileMapState::instance.LogicLayer[iVar5] & 0x10000100U) == 0 + || (DAT_TileMapState::instance.LogicLayer[iVar5] & 0x400000U) != 0) { + return (undefined4)(0); + } + DAT_TileMapState::instance.CertainPathLayer[iVar5] + = (short)this->searchQueue.currentDistance + 1; + DAT_TileMapState::instance.WalkLayer[iVar5] = (short)this->searchGeneration; + this->searchQueue.xQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.xOffset + + sVar2; + this->searchQueue.yQueue[this->searchQueue.writeIndex] + = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix[_direction] + .short_.yOffset + + sVar3; + this->searchQueue.tilesQueue[this->searchQueue.writeIndex] = iVar5; + this->searchQueue.writeIndex = this->searchQueue.writeIndex + 1; + if (0x13a10 <= (int)this->searchQueue.writeIndex) { + this->searchQueue.writeIndex = 0; } } + } - this->searchQueue.readIndex = this->searchQueue.readIndex + 1; - if (0x13a10 <= (int)this->searchQueue.readIndex) { - this->searchQueue.readIndex = 0; - } - } while (this->searchQueue.readIndex != this->searchQueue.writeIndex); - } + this->searchQueue.readIndex = this->searchQueue.readIndex + 1; + if (0x13a10 <= (int)this->searchQueue.readIndex) { + this->searchQueue.readIndex = 0; + } + } return (undefined4)(1); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 293e318a1d..ca3d7e11c7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24687,7 +24687,7 @@ SHC_3BB0A8C1_0x0049D470 | 0.0% | Pending SHC_3BB0A8C1_0x0049D520 | 0.0% | Pending -SHC_3BB0A8C1_0x0049D640 | 78.5% | start +SHC_3BB0A8C1_0x0049D640 | 84.4% | do-while collapsed, was 78.5% SHC_3BB0A8C1_0x0049D880 | 80.7% | Style pass, asm differs From c6eef51985a695eb9801051eb99b9f5f64f8e7de Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:22 +0200 Subject: [PATCH 506/516] reimplement: SHC_3BB0A8C1_0x004A9680 100.00% Reimplemented Co-Authored-By: Claude Opus 5 (1M context) --- .../Map/Navigation/PathFindingState/updateClimbData.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp index 62b766b3f4..f253034a38 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateClimbData.cpp @@ -15,7 +15,6 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x004A9680 void PathFindingState::updateClimbData() { - int iVar1; this->numberOfClimbTeleports = 0; this->debugGreatestClimbLoading = 0; this->maxClimbDataCount = 0; @@ -33,7 +32,7 @@ namespace Map { goto LAB_004a9740; } this->numberOfClimbTeleports = this->numberOfClimbTeleports + 1; - iVar1 = this->climbData[DAT_CurrentClimbDataID::instance].numberOfUnitsUsing; + int iVar1 = this->climbData[DAT_CurrentClimbDataID::instance].numberOfUnitsUsing; if (iVar1 <= this->debugGreatestClimbLoading) goto LAB_004a9740; this->debugGreatestClimbLoading = iVar1; From a1bae255db26b1f620f5e003a734da484fbfe08a Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:22 +0200 Subject: [PATCH 507/516] reimplement: SHC_3BB0A8C1_0x00499FA0 37.45% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../updatePathLinkageTileMapRelatedToGates.cpp | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp index bc0164f09b..dcb900f46a 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToGates.cpp @@ -17,20 +17,15 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x00499FA0 void PathFindingState::updatePathLinkageTileMapRelatedToGates(int buildingID) { - int iVar2; int iVar3; int _anotherTile; int iVar4; - int _middleTileUnk; - uint uVar5; - int _xMiddleUnk; int _pl2; - uint _widthOrHeight; - _middleTileUnk = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; - _widthOrHeight = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; + int _middleTileUnk = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x; + uint _widthOrHeight = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; int _half = (int)_widthOrHeight / 2; if (DAT_BuildingsState::instance.buildings[buildingID].buildingVariation == 80) { - iVar2 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; + int iVar2 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; iVar4 = iVar2 + _half; _pl2 = DAT_BuildingsState::instance.buildings[buildingID].pathLinkageRelated2; int _blocked = _pl2 == 2; @@ -71,14 +66,14 @@ namespace Map { return; } iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; - _xMiddleUnk = _middleTileUnk + _half; + int _xMiddleUnk = _middleTileUnk + _half; _pl2 = DAT_BuildingsState::instance.buildings[buildingID].pathLinkageRelated2; int _rowBelow = _widthOrHeight + iVar3; int _blocked = _pl2 == 2; int _row = iVar3 + -1; _middleTileUnk = DAT_ViewportRenderState::instance.translationMatrix[_row].addXgetTile; iVar4 = DAT_ViewportRenderState::instance.translationMatrix[_row + 1].addXgetTile; - uVar5 = (uint)DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + _xMiddleUnk]; + uint uVar5 = (uint)DAT_TileMapState::instance.DefaultHeightLayer[_middleTileUnk + _xMiddleUnk]; uint _otherHeight = (uint)DAT_TileMapState::instance.DefaultHeightLayer[iVar4 + _xMiddleUnk]; _middleTileUnk = _middleTileUnk + _xMiddleUnk; _anotherTile = iVar4 + _xMiddleUnk; From 991423bfa505b5da6e9846269665c261fe49f7a9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:23 +0200 Subject: [PATCH 508/516] reimplement: SHC_3BB0A8C1_0x0049A1C0 62.16% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- .../updatePathLinkageTileMapRelatedToKeeps.cpp | 6 ++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp index fe0f71416d..203c31756f 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToKeeps.cpp @@ -17,11 +17,9 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049A1C0 void PathFindingState::updatePathLinkageTileMapRelatedToKeeps(int buildingID) { - uint uVar2; int iVar3; int iVar4; - short _orientation; - _orientation = DAT_BuildingsState::instance.buildings[buildingID].orientation; + short _orientation = DAT_BuildingsState::instance.buildings[buildingID].orientation; if (_orientation == 4) { iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + -1; iVar3 = (int)DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight / 2 @@ -39,7 +37,7 @@ namespace Map { iVar4 = (int)DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight / 2 + (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y; } else { - uVar2 = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; + uint uVar2 = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight; if (_orientation != 2) { iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].y + (int)uVar2 + -1; iVar3 = (int)(short)DAT_BuildingsState::instance.buildings[buildingID].x + (int)uVar2 / 2; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ca3d7e11c7..c59afc1493 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24395,7 +24395,7 @@ SHC_3BB0A8C1_0x00499DC0 | 67.1% | signed modulo and signed byte SHC_3BB0A8C1_0x00499FA0 | 37.5% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A1C0 | 62.2% | tile locals per row +SHC_3BB0A8C1_0x0049A1C0 | 62.2% | Style pass, asm differs SHC_3BB0A8C1_0x0049A2E0 | 96.3% | index locals + statement order From 4b09f0c2063ae7d3b07944dabdf0e59742ddaaca Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 11:07:23 +0200 Subject: [PATCH 509/516] reimplement: SHC_3BB0A8C1_0x0049A2E0 96.30% Style pass, asm differs Co-Authored-By: Claude Opus 5 (1M context) --- ...pdatePathLinkageTileMapRelatedToSiegeTower.cpp | 15 +++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp index 6093446b14..44c65e9895 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageTileMapRelatedToSiegeTower.cpp @@ -17,13 +17,9 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x0049A2E0 void PathFindingState::updatePathLinkageTileMapRelatedToSiegeTower(int param_1) { - int iVar2; - int iVar3; - int iVar4; - int iVar5; - iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[param_1].x; - iVar2 = (int)(short)DAT_BuildingsState::instance.buildings[param_1].y; - iVar5 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + -1].addXgetTile + iVar4 + 1; + int iVar4 = (int)(short)DAT_BuildingsState::instance.buildings[param_1].x; + int iVar2 = (int)(short)DAT_BuildingsState::instance.buildings[param_1].y; + int iVar5 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + -1].addXgetTile + iVar4 + 1; DAT_TileMapState::instance.PathLinkageLayer[iVar5] = DAT_TileMapState::instance.PathLinkageLayer[iVar5] | 0x10; iVar5 = DAT_ViewportRenderState::instance.translationMatrix[iVar2].addXgetTile + iVar4 + 1; @@ -33,9 +29,8 @@ namespace Map { DAT_TileMapState::instance.PathLinkageLayer[iVar5] = DAT_TileMapState::instance.PathLinkageLayer[iVar5] | 0x11; iVar5 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 3].addXgetTile + iVar4 + 1; - iVar3 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 1].addXgetTile + iVar4; - DAT_TileMapState::instance.PathLinkageLayer[iVar5] - = DAT_TileMapState::instance.PathLinkageLayer[iVar5] | 1; + int iVar3 = DAT_ViewportRenderState::instance.translationMatrix[iVar2 + 1].addXgetTile + iVar4; + DAT_TileMapState::instance.PathLinkageLayer[iVar5] = DAT_TileMapState::instance.PathLinkageLayer[iVar5] | 1; DAT_TileMapState::instance.PathLinkageLayer[iVar3 + -1] = DAT_TileMapState::instance.PathLinkageLayer[iVar3 + -1] | 4; DAT_TileMapState::instance.PathLinkageLayer[iVar3] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c59afc1493..76c4cafc5d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24397,7 +24397,7 @@ SHC_3BB0A8C1_0x00499FA0 | 37.5% | Style pass, asm differs SHC_3BB0A8C1_0x0049A1C0 | 62.2% | Style pass, asm differs -SHC_3BB0A8C1_0x0049A2E0 | 96.3% | index locals + statement order +SHC_3BB0A8C1_0x0049A2E0 | 96.3% | Style pass, asm differs SHC_3BB0A8C1_0x0049A370 | 12.5% | statement order From f6556178176fdcb5567b1e5447eb4a570275f4f0 Mon Sep 17 00:00:00 2001 From: Gynt Date: Fri, 23 Oct 2026 12:06:26 +0200 Subject: [PATCH 510/516] fix(PathFindingState): make the branch build and measure against current main 47 commits behind main and uncompilable against its regenerated headers, so this branch had never been measured. All 114 sources now build, link and score, with none excluded. Merge resolution, file by file rather than wholesale: - AGENTS.md and the status ledger take main's side. The ledger's five conflicts are addresses this branch had reset to "0.0% Pending" where main records real progress. - Constructor_PathFindingState, clearActiveClimbDataOfType6And7, clearPathFindingTileMaps and computeAttackVectorsBasedOnXAndY take main's side too: main's copies are the cleaned-up landed versions, using sizeof(layer) where this branch still had 0x27420 and 0x13a10 and carrying neither the decompiler comment blocks nor the trailing `return;`. None of the branch's recent commits touch these four, so nothing in-flight is lost. - LinkageNeighbourAsm.hpp keeps the branch's side. Main renamed MACRO_LINKAGE_AREA_PUSHES to MACRO_LINKAGE_EXPAND_AREA_NEIGHBOURS, folded the edx/edi/ebx loads into it and deleted MACRO_LINKAGE_AREA_LOOP; nothing on main uses the result, because main has no copy of updateSeparateAreaTileMap.cpp, this branch's only consumer. Main's version is a refactor with no caller, the branch's is self-consistent with the file that needs it, and this is a hand-written asm helper rather than a generated header. Source fixes: - somePairArray was a single XYPair at MapAndTimeState +0x520 and is now XYPair[40] at the same offset, so the old scalar is element 0. - MC_MAP_TILES_COUNT still lives in Map/MapConstants.hpp but no longer arrives transitively, so two files include it directly. - Two stale generated field references rewritten by the project's refactor_struct_fields.py. Derived against the branch tip as of 4b09f0c2, after its 24 style-pass commits, rather than pasted over them. First measurement, reimplemented data and all 114 resolvers enabled: BUILD_OK, avg 73.46 over 114, 98 functions below 100. No match work is attempted here - none was possible until it built. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_013Fzi11pcBU1Y7Y4oanrZQL --- .../calculateCanPlayerUnitsNavigateToAreaFromArea.cpp | 2 +- .../PathFindingState/computeAttackVectorsBasedOnXAndY.cpp | 2 ++ .../PathFindingState/findConnectingAreaBetweenTwoAreas.cpp | 2 +- .../Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp | 2 +- .../updatePathLinkageLayerForEachBuildingAtEachTile.cpp | 2 ++ 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp index 9835b3805a..3ed0d24790 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/calculateCanPlayerUnitsNavigateToAreaFromArea.cpp @@ -47,7 +47,7 @@ namespace Map { if (playerID == 0 || DAT_GameState::instance.mapAndTime.playerTeams[this->climbData[iVar7].owner] == DAT_GameState::instance.mapAndTime.playerTeams[playerID] - || DAT_BuildingsState::instance.buildings[this->climbData[iVar7].buildingID].field239_0x2c6 + || DAT_BuildingsState::instance.buildings[this->climbData[iVar7].buildingID].field201_0x2c6 != 0) { aiStack_640[local_96c * 2 + 1] = 0; aiStack_640[local_96c * 2] = iVar7; diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/computeAttackVectorsBasedOnXAndY.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/computeAttackVectorsBasedOnXAndY.cpp index 9bc5c4a601..950ebef199 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/computeAttackVectorsBasedOnXAndY.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/computeAttackVectorsBasedOnXAndY.cpp @@ -1,5 +1,7 @@ #include "../PathFindingState.func.hpp" +#include "OpenSHC/Map/MapConstants.hpp" + #include "OpenSHC/Globals/DAT_GameState.hpp" #include "OpenSHC/Globals/DAT_TileMapState.hpp" #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp index 66881d8af8..710766fa26 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findConnectingAreaBetweenTwoAreas.cpp @@ -41,7 +41,7 @@ namespace Map { && ((param_1 == 0 || (DAT_GameState::instance.mapAndTime.playerTeams[piVar5[0x73]] == DAT_GameState::instance.mapAndTime.playerTeams[param_1])) - || (DAT_BuildingsState::instance.buildings[piVar5[-3]].field239_0x2c6 != 0))) { + || (DAT_BuildingsState::instance.buildings[piVar5[-3]].field201_0x2c6 != 0))) { aiStack_640[local_96c * 2 + 1] = 0; aiStack_640[local_96c * 2] = iVar6; local_96c = local_96c + 1; diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp index 9721322065..129e26a8b8 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/spawnUnitAndAddToTribe.cpp @@ -32,7 +32,7 @@ namespace Map { int iVar2 = -1; this->searchQueue.readIndex = 0; if (this->searchQueue.writeIndex != 0) { - local_4 = &DAT_GameState::instance.mapAndTime.somePairArray.y; + local_4 = &DAT_GameState::instance.mapAndTime.somePairArray[0].y; do { uint _y = (uint)this->searchQueue.yQueue[this->searchQueue.readIndex]; _tile = this->searchQueue.tilesQueue[this->searchQueue.readIndex]; diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerForEachBuildingAtEachTile.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerForEachBuildingAtEachTile.cpp index e5117e7a5a..8ef7c108fb 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerForEachBuildingAtEachTile.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updatePathLinkageLayerForEachBuildingAtEachTile.cpp @@ -1,5 +1,7 @@ #include "../PathFindingState.func.hpp" +#include "OpenSHC/Map/MapConstants.hpp" + #include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" namespace OpenSHC { From a94fd8dc8d1bd83f82fb53fc52c51fce497e818a Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 25 Oct 2026 09:47:58 +0100 Subject: [PATCH 511/516] reimplement: SHC_3BB0A8C1_0x004A0E50 100.00% Reimplemented --- .../setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp index 2aeeb53c78..10e1525b81 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/setWalkabilityBorderLogicLayerForSmallerMapSizes.cpp @@ -24,10 +24,10 @@ namespace Map { void PathFindingState::setWalkabilityBorderLogicLayerForSmallerMapSizes() { short sVar3; - this->searchGeneration = this->searchGeneration + 1; this->resultTile = 0; this->resultY = 0; this->resultX = 0; + this->searchGeneration = this->searchGeneration + 1; if (32000 < this->searchGeneration) { this->searchGeneration = 1; MACRO_CALL_MEMBER(OpenSHC::IO::LowLevelMemory_Func::fillMemory_ByteValue, DAT_LowLevelMemory::ptr)( diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index dcc0e5208a..cfb3eb2eee 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24875,7 +24875,7 @@ SHC_3BB0A8C1_0x004A0E4A | 0.0% | Pending SHC_3BB0A8C1_0x004A0E4B | 0.0% | Pending -SHC_3BB0A8C1_0x004A0E50 | 0.0% | Pending +SHC_3BB0A8C1_0x004A0E50 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004A1230 | 0.0% | Pending From c8344cb3c7741a2cc20af6c8a454fb01812f5962 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 25 Oct 2026 10:09:36 +0100 Subject: [PATCH 512/516] reimplement: SHC_3BB0A8C1_0x00496F90 66.13% local counter, hoisted walk --- ...ExistingSearchThatIsModuloDistanceAway.cpp | 23 ++++++++----------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp index 399e8770c5..13e5c4e798 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findNextTileInExistingSearchThatIsModuloDistanceAway.cpp @@ -17,31 +17,28 @@ namespace Map { // FUNCTION: STRONGHOLDCRUSADER 0x00496F90 void PathFindingState::findNextTileInExistingSearchThatIsModuloDistanceAway(int modulo, int x, int y) { - int iVar2; int _dx; int _dy; - int* _pLastTile; - int local_10; - local_10 = 0; - _pLastTile = this->searchQueue.tilesQueue + DAT_TribesState::instance.ALG_ResultTileIndex; + int _firstTileWalk = DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]]; + int _index = DAT_TribesState::instance.ALG_ResultTileIndex; + int local_10 = 0; + int* _pLastTile = this->searchQueue.tilesQueue + _index; while (true) { int iVar1 = *_pLastTile; int _tileY = (short)DAT_ViewportRenderState::instance.tileTranslationMatrix_YComponent[iVar1]; int _dist = DAT_TileMapState::instance.CertainPathLayer[iVar1]; if (0 < _dist && (_dx = (iVar1 - DAT_ViewportRenderState::instance.translationMatrix[_tileY].addXgetTile) - x, - _dy = _tileY - y, (abs(_dy) + abs(_dx)) % modulo == 0) - && (iVar2 = DAT_TribesState::instance.ALG_ResultTileIndex, _dist < 4000)) + _dy = _tileY - y, (abs(_dx) + abs(_dy)) % modulo == 0) + && _dist < 4000) { + local_10 = _index; break; - DAT_TribesState::instance.ALG_ResultTileIndex = DAT_TribesState::instance.ALG_ResultTileIndex + 1; + } + _index = _index + 1; _pLastTile = _pLastTile + 1; - iVar2 = local_10; - if ((4000 < DAT_TribesState::instance.ALG_ResultTileIndex) - || (DAT_TileMapState::instance.WalkLayer[iVar1] - != DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]])) + if (4000 < _index || DAT_TileMapState::instance.WalkLayer[iVar1] != _firstTileWalk) break; } - local_10 = iVar2; DAT_TribesState::instance.ALG_ResultY = (int)this->searchQueue.yQueue[local_10]; DAT_TribesState::instance.ALG_ResultX = this->searchQueue.tilesQueue[local_10] - DAT_ViewportRenderState::instance.translationMatrix[DAT_TribesState::instance.ALG_ResultY] diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index cfb3eb2eee..83648359a6 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24353,7 +24353,7 @@ SHC_3BB0A8C1_0x00496EA0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00496EC0 | 0.0% | Pending -SHC_3BB0A8C1_0x00496F90 | 0.0% | Pending +SHC_3BB0A8C1_0x00496F90 | 66.1% | local counter, hoisted walk SHC_3BB0A8C1_0x00497080 | 0.0% | Pending From c24f9ee1d9dbb0816560e97b308ff5c77b98ea27 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 25 Oct 2026 10:24:17 +0100 Subject: [PATCH 513/516] reimplement: SHC_3BB0A8C1_0x0049A370 85.71% the walk is inline asm --- ...athPlanToDestinationViaUnoccupiedTiles.cpp | 191 +++++++++++------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 118 insertions(+), 75 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp index 7a92c4bc37..a630db00df 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/tracePathPlanToDestinationViaUnoccupiedTiles.cpp @@ -21,7 +21,6 @@ namespace Map { /* @return bool whether destination was reached decompilerscript: committed: 2025-01-30 21:57:43.216000 */ -#pragma optimize("y", off) // original keeps an ebp frame // FUNCTION: STRONGHOLDCRUSADER 0x0049A370 BOOLEnum PathFindingState::tracePathPlanToDestinationViaUnoccupiedTiles(uint x, uint y, uint destX, uint destY) { @@ -62,8 +61,8 @@ namespace Map { _direction = 0; _gen = (ushort)this->searchGeneration; _fireCount = DAT_EntityState::instance.fireCount; - _destTile = DAT_ViewportRenderState::instance.translationMatrix[destY].addXgetTile + destX; _tile = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; + _destTile = DAT_ViewportRenderState::instance.translationMatrix[destY].addXgetTile + destX; _occupancy = DAT_TileMapState::instance.OccupancyLayer; _walkLayer = DAT_TileMapState::instance.WalkLayer; _linkage = DAT_TileMapState::instance.PathLinkageLayer; @@ -71,82 +70,126 @@ namespace Map { _cardinal = DAT_TerrainDefinedData::instance.clockwiseCardinalTranslationMatrix; _pPathPlan = this->searchQueue.ptrPathPlan; _ppIndex = this->searchQueue.pathPlanIndex; - while (true) { - _budget = _budget + 1; - if (399 < _budget) { - break; - } - _walkLayer[_tile] = (short)_gen; - if (_tile == _destTile) { - _result = 1; - break; - } - if (_fireCount != 0 && _occupancy[_tile] != '\0') { - break; - } - byte _links = _linkage[_tile]; - if ((int)y > (int)destY) { - if ((int)x > (int)destX) { - _direction = 7; - if ((_links & 0x80) == 0) { - break; - } - } else if ((int)x < (int)destX) { - _direction = 1; - if ((_links & 2) == 0) { - break; - } - } else { - _direction = 0; - if ((_links & 1) == 0) { - break; - } - } - } else if ((int)y < (int)destY) { - if ((int)x > (int)destX) { - _direction = 5; - if ((_links & 0x20) == 0) { - break; - } - } else if ((int)x < (int)destX) { - _direction = 3; - if ((_links & 8) == 0) { - break; - } - } else { - _direction = 4; - if ((_links & 0x10) == 0) { - break; - } - } - } else if ((int)x > (int)destX) { - _direction = 6; - if ((_links & 0x40) == 0) { - break; - } - } else if ((int)x < (int)destX) { - _direction = 2; - if ((_links & 4) == 0) { - break; - } - } else { - break; - } - _tile = _tile + _dirMatrix[y * 8 + _direction]; - x = x + _cardinal[_direction].int_.xOffset; - y = y + _cardinal[_direction].int_.yOffset; - uint _slot = _ppIndex; - _ppIndex = _ppIndex + 1; - if ((_slot & 1) == 0) { - _pPathPlan[_slot >> 1] = (byte)_direction; - } else { - _pPathPlan[_slot >> 1] = (_pPathPlan[_slot >> 1] & 0xf) | (byte)(_direction << 4); - } + // The walk itself is handwritten assembly in the original (0x0049A481..0x0049A5BB), in + // the same hand as LinkageNeighbourAsm.hpp: x, y, the tile and the walk layer stay in + // ebx, ecx, edx and edi across iterations, everything else is reloaded from its slot + // before each use, the direction is stored as a constant and read back, and the + // three-way compare on y then x picks the direction and its linkage bit. + // clang-format off + __asm { + mov edi, _walkLayer + mov ebx, x + mov ecx, y + mov edx, _tile + trace_loop: + add dword ptr _budget, 1 + cmp dword ptr _budget, 400 + jge trace_exit + mov ax, word ptr _gen + mov word ptr [edi + edx*2], ax + mov eax, _destTile + cmp edx, eax + je trace_found + mov eax, _fireCount + cmp eax, 0 + je trace_links + mov esi, _occupancy + mov al, byte ptr [esi + edx] + cmp al, 0 + jne trace_exit + trace_links: + mov esi, _linkage + mov al, byte ptr [esi + edx] + cmp ecx, destY + jg trace_y_greater + jl trace_y_less + cmp ebx, destX + jg trace_dir6 + jl trace_dir2 + jmp trace_exit + trace_dir6: + mov dword ptr _direction, 6 + test al, 0x40 + je trace_exit + jmp trace_step + trace_dir2: + mov dword ptr _direction, 2 + test al, 4 + je trace_exit + jmp trace_step + trace_y_greater: + cmp ebx, destX + jg trace_dir7 + jl trace_dir1 + mov dword ptr _direction, 0 + test al, 1 + je trace_exit + jmp trace_step + trace_dir7: + mov dword ptr _direction, 7 + test al, 0x80 + je trace_exit + jmp trace_step + trace_dir1: + mov dword ptr _direction, 1 + test al, 2 + je trace_exit + jmp trace_step + trace_y_less: + cmp ebx, destX + jg trace_dir5 + jl trace_dir3 + mov dword ptr _direction, 4 + test al, 0x10 + je trace_exit + jmp trace_step + trace_dir5: + mov dword ptr _direction, 5 + test al, 0x20 + je trace_exit + jmp trace_step + trace_dir3: + mov dword ptr _direction, 3 + test al, 8 + je trace_exit + jmp trace_step + trace_step: + mov eax, ecx + shl eax, 3 + add eax, _direction + shl eax, 2 + mov esi, _dirMatrix + add edx, dword ptr [esi + eax] + mov esi, _cardinal + mov eax, _direction + add ebx, dword ptr [esi + eax*8] + add ecx, dword ptr [esi + eax*8 + 4] + mov eax, _ppIndex + mov esi, _pPathPlan + add dword ptr _ppIndex, 1 + test eax, 1 + je trace_even_slot + shr eax, 1 + add esi, eax + mov eax, _direction + shl eax, 4 + and byte ptr [esi], 0xf + or byte ptr [esi], al + jmp trace_loop + trace_even_slot: + shr eax, 1 + add esi, eax + mov eax, _direction + mov byte ptr [esi], al + jmp trace_loop + trace_found: + mov dword ptr _result, 1 + trace_exit: } + // clang-format on this->searchQueue.pathPlanIndex = _ppIndex; return (BOOLEnum)_result; } } -#pragma optimize("", on) } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 83648359a6..c799d06290 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24399,7 +24399,7 @@ SHC_3BB0A8C1_0x0049A1C0 | 0.0% | Pending SHC_3BB0A8C1_0x0049A2E0 | 0.0% | Pending -SHC_3BB0A8C1_0x0049A370 | 0.0% | Pending +SHC_3BB0A8C1_0x0049A370 | 85.7% | the walk is inline asm SHC_3BB0A8C1_0x0049A5E0 | 0.0% | Pending From ea6e4b845a12e95201e6865ffdb59b268a07045c Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 25 Oct 2026 10:30:31 +0100 Subject: [PATCH 514/516] reimplement: SHC_3BB0A8C1_0x00497740 79.74% asm loop head, indices in para --- .../findLinkageBasedPathOrWalkRadius.cpp | 96 +++++++++++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 70 insertions(+), 28 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp index cd44b62c21..11ee3a13ed 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findLinkageBasedPathOrWalkRadius.cpp @@ -63,52 +63,94 @@ namespace Map { this->searchQueue.depth = 0; } /* - The eight-neighbour expansion below is handwritten assembly in the original and reaches - the layers and the queue through these locals; see LinkageNeighbourAsm.hpp. The queue - indices and the target tile live in the parameter slots, as they do in the original. + From here to the return the original is handwritten assembly in the hand of + LinkageNeighbourAsm.hpp, including the loop head: the queue indices live in the + parameter slots (y is the write index, x2 the read index, continuePreviousSearch the + depth, x the target tile), every layer base is reloaded from its slot before each use, + the row position is zero-extended with "mov eax, 0 / mov ax" and the distance is kept + in bx. Only the local set-up before the loop and the write-back after it are C. */ - short _curGen = (short)this->searchGeneration; + uint _curGen = (ushort)this->searchGeneration; short* _walkLayer = DAT_TileMapState::instance.WalkLayer; short* _certainPath = DAT_TileMapState::instance.CertainPathLayer; int* _tilesQueue = this->searchQueue.tilesQueue; short* _yQueue = this->searchQueue.yQueue; int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; uchar* _linkage = DAT_TileMapState::instance.PathLinkageLayer; - + int _tile; + int _cY; + int _cCardinalDistance = 0; + int _result = 0; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; - DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = _curGen; - + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)_curGen; y = this->searchQueue.writeIndex; - int _readIndex = this->searchQueue.readIndex; continuePreviousSearch = this->searchQueue.depth; if (x2 == -1) { x = 0; } else { x = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; } - int _result = 0; - while (_readIndex != (int)y && (int)continuePreviousSearch < maxIterations) { - continuePreviousSearch = continuePreviousSearch + 1; - int _tile = this->searchQueue.tilesQueue[_readIndex]; - if (_tile == (int)x) { - _result = 1; - break; - } - short _cCardinalDistance = _certainPath[_tile] + 1; - if (800 <= _cCardinalDistance) { - break; - } - int _cLink = _linkage[_tile]; - int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; - - MACRO_LINKAGE_EXPAND_NEIGHBOURS(1, y) - - _readIndex = _readIndex + 1; + x2 = this->searchQueue.readIndex; + // clang-format off + __asm { + flr_loop: + mov ecx, x2 + cmp ecx, y + je flr_exit + mov eax, continuePreviousSearch + cmp eax, maxIterations + jge flr_exit + add dword ptr continuePreviousSearch, 1 + mov esi, _tilesQueue + mov edx, dword ptr [esi + ecx*4] + mov _tile, edx + cmp edx, x + je flr_found + mov esi, _certainPath + mov bx, word ptr [esi + edx*2] + add bx, 1 + cmp bx, 0x320 + jge flr_exit + mov word ptr _cCardinalDistance, bx + mov esi, _yQueue + mov eax, 0 + mov ax, word ptr [esi + ecx*2] + mov _cY, eax + mov edi, _walkLayer + mov edx, _tile + mov esi, _linkage + mov bl, byte ptr [esi + edx] + } + MACRO_LINKAGE_PUSH(1, w, y, -2, 0x40, MACRO_ASM_SAME, MACRO_ASM_DEC, MACRO_ASM_SAME) + MACRO_LINKAGE_PUSH(1, e, y, +2, 0x04, MACRO_ASM_SAME, MACRO_ASM_INC, MACRO_ASM_SAME) + __asm mov eax, _cY + __asm shl eax, 3 + __asm mov esi, _dirMatrix + __asm add edx, dword ptr [esi + eax*4] + MACRO_LINKAGE_PUSH(1, n, y, 0, 0x01, MACRO_ASM_SAME, MACRO_ASM_SAME, MACRO_ASM_DEC) + MACRO_LINKAGE_PUSH(1, nw, y, -2, 0x80, MACRO_ASM_DIAGONAL, MACRO_ASM_DEC, MACRO_ASM_DEC) + MACRO_LINKAGE_PUSH(1, ne, y, +2, 0x02, MACRO_ASM_DIAGONAL, MACRO_ASM_INC, MACRO_ASM_DEC) + __asm mov edx, _tile + __asm mov eax, _cY + __asm shl eax, 3 + __asm add eax, 4 + __asm mov esi, _dirMatrix + __asm add edx, dword ptr [esi + eax*4] + MACRO_LINKAGE_PUSH(1, s, y, 0, 0x10, MACRO_ASM_SAME, MACRO_ASM_SAME, MACRO_ASM_INC) + MACRO_LINKAGE_PUSH(1, sw, y, -2, 0x20, MACRO_ASM_DIAGONAL, MACRO_ASM_DEC, MACRO_ASM_INC) + MACRO_LINKAGE_PUSH(1, se, y, +2, 0x08, MACRO_ASM_DIAGONAL, MACRO_ASM_INC, MACRO_ASM_INC) + __asm { + add dword ptr x2, 1 + jmp flr_loop + flr_found: + mov dword ptr _result, 1 + flr_exit: } + // clang-format on this->searchQueue.writeIndex = y; - this->searchQueue.readIndex = _readIndex; + this->searchQueue.readIndex = x2; this->searchQueue.depth = continuePreviousSearch; return (BOOLEnum)_result; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c799d06290..19ca672da5 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24365,7 +24365,7 @@ SHC_3BB0A8C1_0x004974D0 | 0.0% | Pending SHC_3BB0A8C1_0x00497690 | 0.0% | Pending -SHC_3BB0A8C1_0x00497740 | 0.0% | Pending +SHC_3BB0A8C1_0x00497740 | 79.7% | asm loop head, indices in para SHC_3BB0A8C1_0x00497B80 | 0.0% | Pending From bee6aea45c9982370f60638bb33891d51f8317fe Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 25 Oct 2026 10:33:00 +0100 Subject: [PATCH 515/516] reimplement: SHC_3BB0A8C1_0x00497B80 82.49% asm loop head, indices in para --- .../findSuitableSpawnLocationUnk.cpp | 96 ++++++++++++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 73 insertions(+), 25 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp index 5a8740bd88..151724cfd5 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/findSuitableSpawnLocationUnk.cpp @@ -49,46 +49,94 @@ namespace Map { the layers and the queue through these locals; see LinkageNeighbourAsm.hpp. This is the variant that only enters a neighbour whose OccupancyLayer byte is zero. */ - short _curGen = (short)this->searchGeneration; - short* _walkLayer = DAT_TileMapState::instance.WalkLayer; + /* + From here to the return the original is handwritten assembly in the hand of + LinkageNeighbourAsm.hpp, loop head included: the queue indices live in the parameter + slots (y is the write index, x2 the read index, param_6 the depth, x the target tile), + every layer base is reloaded from its slot before each use and the row position is + zero-extended with "mov eax, 0 / mov ax". Unlike findLinkageBasedPathOrWalkRadius there + is no cap on the distance. Only the set-up and the write-back are C. + */ + uint _curGen = (ushort)this->searchGeneration; + int* _tilesQueue = this->searchQueue.tilesQueue; short* _certainPath = DAT_TileMapState::instance.CertainPathLayer; + short* _yQueue = this->searchQueue.yQueue; + short* _walkLayer = DAT_TileMapState::instance.WalkLayer; uchar* _linkage = DAT_TileMapState::instance.PathLinkageLayer; uchar* _occupancy = DAT_TileMapState::instance.OccupancyLayer; - int* _tilesQueue = this->searchQueue.tilesQueue; - short* _yQueue = this->searchQueue.yQueue; int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; - + int _tile; + int _cY; + int _cCardinalDistance = 0; + int _result = 0; this->searchQueue.yQueue[0] = (short)y; this->searchQueue.tilesQueue[0] = DAT_ViewportRenderState::instance.translationMatrix[y].addXgetTile + x; DAT_TileMapState::instance.CertainPathLayer[this->searchQueue.tilesQueue[0]] = 1; - DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = _curGen; - + DAT_TileMapState::instance.WalkLayer[this->searchQueue.tilesQueue[0]] = (short)_curGen; y = this->searchQueue.writeIndex; - int _readIndex = this->searchQueue.readIndex; param_6 = this->searchQueue.depth; if (x2 == -1) { x = 0; } else { x = DAT_ViewportRenderState::instance.translationMatrix[y2].addXgetTile + x2; } - int _result = 0; - while (_readIndex != y && param_6 < param_5) { - param_6 = param_6 + 1; - int _tile = this->searchQueue.tilesQueue[_readIndex]; - if (_tile == x) { - _result = 1; - break; - } - int _cY = (ushort)this->searchQueue.yQueue[_readIndex]; - int _cCardinalDistance = _certainPath[_tile] + 1; - int _cLink = _linkage[_tile]; - - MACRO_LINKAGE_EXPAND_FREE_NEIGHBOURS(1, y) - - _readIndex = _readIndex + 1; + x2 = this->searchQueue.readIndex; + // clang-format off + __asm { + fssl_loop: + mov ecx, x2 + cmp ecx, y + je fssl_exit + mov eax, param_6 + cmp eax, param_5 + jge fssl_exit + add dword ptr param_6, 1 + mov esi, _tilesQueue + mov edx, dword ptr [esi + ecx*4] + mov _tile, edx + cmp edx, x + je fssl_found + mov esi, _certainPath + mov bx, word ptr [esi + edx*2] + add bx, 1 + mov word ptr _cCardinalDistance, bx + mov esi, _yQueue + mov eax, 0 + mov ax, word ptr [esi + ecx*2] + mov _cY, eax + mov edi, _walkLayer + mov edx, _tile + mov esi, _linkage + mov bl, byte ptr [esi + edx] + } + MACRO_LINKAGE_PUSH_FREE(1, w, y, -2, -1, 0x40, MACRO_ASM_SAME, MACRO_ASM_DEC, MACRO_ASM_SAME) + MACRO_LINKAGE_PUSH_FREE(1, e, y, +2, +1, 0x04, MACRO_ASM_SAME, MACRO_ASM_INC, MACRO_ASM_SAME) + __asm mov eax, _cY + __asm shl eax, 3 + __asm mov esi, _dirMatrix + __asm add edx, dword ptr [esi + eax*4] + MACRO_LINKAGE_PUSH_FREE(1, n, y, 0, 0, 0x01, MACRO_ASM_SAME, MACRO_ASM_SAME, MACRO_ASM_DEC) + MACRO_LINKAGE_PUSH_FREE(1, nw, y, -2, -1, 0x80, MACRO_ASM_DIAGONAL, MACRO_ASM_DEC, MACRO_ASM_DEC) + MACRO_LINKAGE_PUSH_FREE(1, ne, y, +2, +1, 0x02, MACRO_ASM_DIAGONAL, MACRO_ASM_INC, MACRO_ASM_DEC) + __asm mov edx, _tile + __asm mov eax, _cY + __asm shl eax, 3 + __asm add eax, 4 + __asm mov esi, _dirMatrix + __asm add edx, dword ptr [esi + eax*4] + MACRO_LINKAGE_PUSH_FREE(1, s, y, 0, 0, 0x10, MACRO_ASM_SAME, MACRO_ASM_SAME, MACRO_ASM_INC) + MACRO_LINKAGE_PUSH_FREE(1, sw, y, -2, -1, 0x20, MACRO_ASM_DIAGONAL, MACRO_ASM_DEC, MACRO_ASM_INC) + MACRO_LINKAGE_PUSH_FREE(1, se, y, +2, +1, 0x08, MACRO_ASM_DIAGONAL, MACRO_ASM_INC, MACRO_ASM_INC) + __asm { + add dword ptr x2, 1 + jmp fssl_loop + fssl_found: + mov dword ptr _result, 1 + fssl_exit: } + // clang-format on this->searchQueue.writeIndex = y; - this->searchQueue.readIndex = _readIndex; + this->searchQueue.readIndex = x2; this->searchQueue.depth = param_6; return (undefined4)(_result); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 19ca672da5..f1516990de 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24367,7 +24367,7 @@ SHC_3BB0A8C1_0x00497690 | 0.0% | Pending SHC_3BB0A8C1_0x00497740 | 79.7% | asm loop head, indices in para -SHC_3BB0A8C1_0x00497B80 | 0.0% | Pending +SHC_3BB0A8C1_0x00497B80 | 82.5% | asm loop head, indices in para SHC_3BB0A8C1_0x00498020 | 0.0% | Pending From 9df25bac03e0b5be558ce41a264f937e387c9083 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 25 Oct 2026 10:50:03 +0100 Subject: [PATCH 516/516] reimplement: SHC_3BB0A8C1_0x004995E0 67.96% slots row/rowEnd/readIndex pla --- .../updateSeparateAreaTileMap.cpp | 16 ++++++++++------ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp index 7e0c644f8c..cee92631b7 100644 --- a/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp +++ b/src/OpenSHC/Map/Navigation/PathFindingState/updateSeparateAreaTileMap.cpp @@ -61,15 +61,19 @@ namespace Map { int* _tilesQueue = this->searchQueue.tilesQueue; short* _yQueue = this->searchQueue.yQueue; int* _dirMatrix = &DAT_TileMapState::instance.directionTranslationMatrix[0][0]; + int* _tilesQueueStart = this->searchQueue.tilesQueue; + short* _yQueueStart = this->searchQueue.yQueue; uchar* _linkage = DAT_TileMapState::instance.PathLinkageLayer; int* _zoneSizes = this->zoneSizesArray; - int _tile; int _cY; + int _tile; short _areaID = 1; int _row = 0; int* _rowEnd = &DAT_ViewportRenderState::instance.translationMatrix[1].firstTileOfRow; + int _readIndex = 0; + forceUpdate = 1; for (int _first = 0; _first < 80400; _first = _first + 1) { - if (*_rowEnd <= _first) { + if (_first >= *_rowEnd) { _row = _row + 1; _rowEnd = _rowEnd + 3; } @@ -77,14 +81,14 @@ namespace Map { || (DAT_TileMapState::instance.LogicLayer[_first] & 0x4a5014b1) != 0) { continue; } - this->searchQueue.tilesQueue[0] = _first; - this->searchQueue.yQueue[0] = _row; + *_tilesQueueStart = _first; + *_yQueueStart = (short)_row; DAT_TileMapState::instance.PathConnectionLayer[_first] = _areaID; forceUpdate = 1; - int _readIndex = 0; + _readIndex = 0; MACRO_LINKAGE_AREA_LOOP(1, _readIndex, forceUpdate) _areaID = _areaID + 1; - if (999 < _areaID) { + if (_areaID >= 1000) { break; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f1516990de..3004176c1a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -24385,7 +24385,7 @@ SHC_3BB0A8C1_0x00498FD0 | 0.0% | Pending SHC_3BB0A8C1_0x004990F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004995E0 | 0.0% | Pending +SHC_3BB0A8C1_0x004995E0 | 68.0% | slots row/rowEnd/readIndex pla SHC_3BB0A8C1_0x00499970 | 0.0% | Pending