From 1f9505eb1ca343f3412faa3a80ab833bfc281de0 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:49 +0200 Subject: [PATCH 01/77] reimplement: SHC_3BB0A8C1_0x004092E0 100.00% Reimplemented --- .../ViewportRenderState/computeTileXOffset.cpp | 13 +++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/computeTileXOffset.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/computeTileXOffset.cpp b/src/OpenSHC/Rendering/ViewportRenderState/computeTileXOffset.cpp new file mode 100644 index 000000000..0be078ea6 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/computeTileXOffset.cpp @@ -0,0 +1,13 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004092E0 + int ViewportRenderState::computeTileXOffset(int tile, int y) + { + return tile - this->translationMatrix[y].addXgetTile; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b80b8635f..b90bd2dc3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -2599,7 +2599,7 @@ SHC_3BB0A8C1_0x004092B0 | 0.0% | Pending SHC_3BB0A8C1_0x004092C0 | 0.0% | Pending -SHC_3BB0A8C1_0x004092E0 | 0.0% | Pending +SHC_3BB0A8C1_0x004092E0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00409300 | 0.0% | Pending From bfbc3ff89850e82d10dfa1eb7edf15b48f2be972 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:50 +0200 Subject: [PATCH 02/77] reimplement: SHC_3BB0A8C1_0x00401040 100.00% Reimplemented --- .../ViewportRenderState/translateXYToTile.cpp | 10 ++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/translateXYToTile.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/translateXYToTile.cpp b/src/OpenSHC/Rendering/ViewportRenderState/translateXYToTile.cpp new file mode 100644 index 000000000..fb37d0e29 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/translateXYToTile.cpp @@ -0,0 +1,10 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x00401040 + int ViewportRenderState::translateXYToTile(int x, int y) { return this->translationMatrix[y].addXgetTile + x; } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b90bd2dc3..e52bf2596 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -383,7 +383,7 @@ SHC_3BB0A8C1_0x00400288 | 0.0% | Pending SHC_3BB0A8C1_0x00401000 | 0.0% | Pending -SHC_3BB0A8C1_0x00401040 | 0.0% | Pending +SHC_3BB0A8C1_0x00401040 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00401060 | 0.0% | Pending From 4029c68a4d22bdb1aaf33e88eb83f24c79054464 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:50 +0200 Subject: [PATCH 03/77] reimplement: SHC_3BB0A8C1_0x004E7800 100.00% Reimplemented --- .../ViewportRenderState/resetupViewportThunk.cpp | 14 ++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/resetupViewportThunk.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/resetupViewportThunk.cpp b/src/OpenSHC/Rendering/ViewportRenderState/resetupViewportThunk.cpp new file mode 100644 index 000000000..122fce131 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/resetupViewportThunk.cpp @@ -0,0 +1,14 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E7800 + void ViewportRenderState::resetupViewportThunk() + { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::resetupViewport, this) + (this->viewportState.isZoomedOutUnk); + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e52bf2596..8eefbf370 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36985,7 +36985,7 @@ SHC_3BB0A8C1_0x004E66F0 | 0.0% | Pending SHC_3BB0A8C1_0x004E7770 | 0.0% | Pending -SHC_3BB0A8C1_0x004E7800 | 0.0% | Pending +SHC_3BB0A8C1_0x004E7800 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E7810 | 0.0% | Pending From 274960a352600690a0ed856e4fc67dee9d24f107 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:50 +0200 Subject: [PATCH 04/77] reimplement: SHC_3BB0A8C1_0x004E8C90 100.00% Reimplemented --- .../ViewportRenderState/restoreFocusTile.cpp | 14 ++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/restoreFocusTile.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/restoreFocusTile.cpp b/src/OpenSHC/Rendering/ViewportRenderState/restoreFocusTile.cpp new file mode 100644 index 000000000..cba76bbad --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/restoreFocusTile.cpp @@ -0,0 +1,14 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E8C90 + void ViewportRenderState::restoreFocusTile() + { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::focusOnTile, this) + (this->field44_0x18b738); + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8eefbf370..94e263283 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37335,7 +37335,7 @@ SHC_3BB0A8C1_0x004E8C4C | 0.0% | Pending SHC_3BB0A8C1_0x004E8C50 | 0.0% | Pending -SHC_3BB0A8C1_0x004E8C90 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8C90 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E8CA0 | 0.0% | Pending From e49b16e1f0a3f2d42d4ed193fefb2ed3c488d2db Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:51 +0200 Subject: [PATCH 05/77] reimplement: SHC_3BB0A8C1_0x004E8CC0 100.00% Reimplemented --- .../createFloatingTextElement.cpp | 17 +++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/createFloatingTextElement.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/createFloatingTextElement.cpp b/src/OpenSHC/Rendering/ViewportRenderState/createFloatingTextElement.cpp new file mode 100644 index 000000000..8244c06c7 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/createFloatingTextElement.cpp @@ -0,0 +1,17 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/IO/Graphics/GmID.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::IO::Graphics::GmID; + + // FUNCTION: STRONGHOLDCRUSADER 0x004E8CC0 + void ViewportRenderState::createFloatingTextElement(int param_1, int param_2, int param_3, int param_4, int param_5) + { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::createFloatingLayerElement, this) + (OpenSHC::IO::Graphics::GID_FLOATS, param_1, param_2, param_3, param_4, param_5); + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 94e263283..d2fd46697 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37339,7 +37339,7 @@ SHC_3BB0A8C1_0x004E8C90 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E8CA0 | 0.0% | Pending -SHC_3BB0A8C1_0x004E8CC0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8CC0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E8CF0 | 0.0% | Pending From ef88eb08619a589690d46e9a47fcd71e5c954700 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:51 +0200 Subject: [PATCH 06/77] reimplement: SHC_3BB0A8C1_0x004E8CA0 100.00% Reimplemented --- .../ViewportRenderState/focusOnCoordinate.cpp | 14 ++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/focusOnCoordinate.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/focusOnCoordinate.cpp b/src/OpenSHC/Rendering/ViewportRenderState/focusOnCoordinate.cpp new file mode 100644 index 000000000..8c9ba1553 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/focusOnCoordinate.cpp @@ -0,0 +1,14 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E8CA0 + void ViewportRenderState::focusOnCoordinate(int x, int y) + { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::focusOnTile, this) + (this->translationMatrix[y].addXgetTile + x); + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d2fd46697..057875785 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37337,7 +37337,7 @@ SHC_3BB0A8C1_0x004E8C50 | 0.0% | Pending SHC_3BB0A8C1_0x004E8C90 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E8CA0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8CA0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E8CC0 | 100.0% | Reimplemented From 903c6048a71aff6cf53f7038ea9fbe7783bb50aa Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:51 +0200 Subject: [PATCH 07/77] reimplement: SHC_3BB0A8C1_0x004E8C50 100.00% Reimplemented --- .../saveFocusTileAndCenterPreview.cpp | 15 +++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/saveFocusTileAndCenterPreview.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/saveFocusTileAndCenterPreview.cpp b/src/OpenSHC/Rendering/ViewportRenderState/saveFocusTileAndCenterPreview.cpp new file mode 100644 index 000000000..fc7bddcbe --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/saveFocusTileAndCenterPreview.cpp @@ -0,0 +1,15 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E8C50 + void ViewportRenderState::saveFocusTileAndCenterPreview() + { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::updateBuildingPreviewPosition, this) + ((int)this->screenPixelWidth / 2 + (int)this->windowX, (int)this->screenPixelHeight / 2 + (int)this->windowY); + this->field44_0x18b738 = this->viewportState.mouseTile; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 057875785..4397fc693 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37333,7 +37333,7 @@ SHC_3BB0A8C1_0x004E8C4B | 0.0% | Pending SHC_3BB0A8C1_0x004E8C4C | 0.0% | Pending -SHC_3BB0A8C1_0x004E8C50 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8C50 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E8C90 | 100.0% | Reimplemented From 4643526221b125bf7afffc7953dec91a94ceb4a7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:52 +0200 Subject: [PATCH 08/77] reimplement: SHC_3BB0A8C1_0x00401000 100.00% Reimplemented --- .../ViewportRenderState/xyAreValid.cpp | 19 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/xyAreValid.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/xyAreValid.cpp b/src/OpenSHC/Rendering/ViewportRenderState/xyAreValid.cpp new file mode 100644 index 000000000..acba3acc1 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/xyAreValid.cpp @@ -0,0 +1,19 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + // FUNCTION: STRONGHOLDCRUSADER 0x00401000 + BOOLEnum ViewportRenderState::xyAreValid(uint x, uint y) + { + if (x <= 399 && y <= 399 && this->DAT_BinaryTileMap400x400[y * 400 + x] != 0) { + return TRUE; + } + return FALSE; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4397fc693..67d16decc 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -381,7 +381,7 @@ SHC_3BB0A8C1_0x00400260 | 0.0% | Pending SHC_3BB0A8C1_0x00400288 | 0.0% | Pending -SHC_3BB0A8C1_0x00401000 | 0.0% | Pending +SHC_3BB0A8C1_0x00401000 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00401040 | 100.0% | Reimplemented From 09059c49dde4b6e49095549a6b9a7cf43889ae4f Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:52 +0200 Subject: [PATCH 09/77] reimplement: SHC_3BB0A8C1_0x004E2600 100.00% Reimplemented --- .../resetBatchedRender.cpp | 19 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/resetBatchedRender.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/resetBatchedRender.cpp b/src/OpenSHC/Rendering/ViewportRenderState/resetBatchedRender.cpp new file mode 100644 index 000000000..e11881f1e --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/resetBatchedRender.cpp @@ -0,0 +1,19 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E2600 + int ViewportRenderState::resetBatchedRender() + { + this->unitBatchedRenderCounterUntil6 = 1; + this->unitRender1 = 0; + this->unitRender2 = 0; + this->unitRender3 = 0; + this->unitRender4 = 0; + this->unitRender5 = 0; + return 0; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 67d16decc..a259afb2d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36399,7 +36399,7 @@ SHC_3BB0A8C1_0x004E2460 | 0.0% | Pending SHC_3BB0A8C1_0x004E25A0 | 0.0% | Pending -SHC_3BB0A8C1_0x004E2600 | 0.0% | Pending +SHC_3BB0A8C1_0x004E2600 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E2630 | 0.0% | Pending From 8cf40025d7338956d0d4f6d1a8fe6c4d3a0618b4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:52 +0200 Subject: [PATCH 10/77] reimplement: SHC_3BB0A8C1_0x004E5DD0 100.00% Reimplemented --- .../ViewportRenderState/setupMouseTileXY.cpp | 25 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/setupMouseTileXY.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setupMouseTileXY.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setupMouseTileXY.cpp new file mode 100644 index 000000000..4aae76058 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/setupMouseTileXY.cpp @@ -0,0 +1,25 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E5DD0 + void ViewportRenderState::setupMouseTileXY() + { + this->viewportState.mouseTileX = 0; + for (this->viewportState.mouseTileY = 0; this->viewportState.mouseTileY < 400; + this->viewportState.mouseTileY++) { + if (this->viewportState.mouseAtomRefFloorTile + < this->translationMatrix[this->viewportState.mouseTileY + 1].firstTileOfRow) { + break; + } + } + + this->viewportState.mouseTileX = this->viewportState.mouseAtomRefFloorTile + - this->translationMatrix[this->viewportState.mouseTileY].firstTileOfRow; + this->viewportState.mouseTileX + = this->translationMatrix[this->viewportState.mouseTileY].distanceToCenter + this->viewportState.mouseTileX; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index a259afb2d..93aac62ba 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36883,7 +36883,7 @@ SHC_3BB0A8C1_0x004E5C00 | 0.0% | Pending SHC_3BB0A8C1_0x004E5D80 | 0.0% | Pending -SHC_3BB0A8C1_0x004E5DD0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5DD0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5E20 | 0.0% | Pending From a93d59c54eded2171bdd4082c7ecd2155900c6b6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:53 +0200 Subject: [PATCH 11/77] reimplement: SHC_3BB0A8C1_0x004E5D80 100.00% Reimplemented --- .../ViewportRenderState/setupMouseTileXY2.cpp | 25 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/setupMouseTileXY2.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setupMouseTileXY2.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setupMouseTileXY2.cpp new file mode 100644 index 000000000..ae9679068 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/setupMouseTileXY2.cpp @@ -0,0 +1,25 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E5D80 + void ViewportRenderState::setupMouseTileXY2() + { + this->viewportState.mouseTileX = 0; + for (this->viewportState.mouseTileY = 0; this->viewportState.mouseTileY < 400; + this->viewportState.mouseTileY++) { + if (this->viewportState.mouseTile + < this->translationMatrix[this->viewportState.mouseTileY + 1].firstTileOfRow) { + break; + } + } + + this->viewportState.mouseTileX + = this->viewportState.mouseTile - this->translationMatrix[this->viewportState.mouseTileY].firstTileOfRow; + this->viewportState.mouseTileX + = this->translationMatrix[this->viewportState.mouseTileY].distanceToCenter + this->viewportState.mouseTileX; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 93aac62ba..bed334752 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36881,7 +36881,7 @@ SHC_3BB0A8C1_0x004E5B80 | 0.0% | Pending SHC_3BB0A8C1_0x004E5C00 | 0.0% | Pending -SHC_3BB0A8C1_0x004E5D80 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5D80 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5DD0 | 100.0% | Reimplemented From f18f12659e3143d92a53981af8001e605e027ac6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:11:53 +0200 Subject: [PATCH 12/77] reimplement: SHC_3BB0A8C1_0x004E6340 100.00% Reimplemented --- .../clearAllFloatingLayerElements.cpp | 24 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp b/src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp new file mode 100644 index 000000000..000727406 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp @@ -0,0 +1,24 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E6340 + void ViewportRenderState::clearAllFloatingLayerElements() + { + int floaterIndex = 1; + if (floaterIndex < (int)this->availableFloaterIndex) { + for (; floaterIndex < (int)this->availableFloaterIndex; floaterIndex++) { + DAT_TileMapState::instance.FloatingLayer[this->floatersArray[floaterIndex].tile] = 0; + this->floatersArray[floaterIndex].id = 0; + } + this->availableFloaterIndex = 1; + return; + } + this->availableFloaterIndex = 1; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bed334752..8847979b3 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36971,7 +36971,7 @@ SHC_3BB0A8C1_0x004E6335 | 0.0% | Pending SHC_3BB0A8C1_0x004E6336 | 0.0% | Pending -SHC_3BB0A8C1_0x004E6340 | 0.0% | Pending +SHC_3BB0A8C1_0x004E6340 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E6360 | 0.0% | Pending From 264327add2812237ba8694663df2dc1c539886e6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:47 +0200 Subject: [PATCH 13/77] reimplement: SHC_3BB0A8C1_0x004E7770 36.56% LTCG ecx reuse in callers --- .../ViewportRenderState/resetupViewport.cpp | 39 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp b/src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp new file mode 100644 index 000000000..a1ff7f57d --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp @@ -0,0 +1,39 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/UI/Enums/BuildingsAndStatusMenuTabType.hpp" +#include "OpenSHC/UI/Enums/MenuViewType.hpp" + +#include "OpenSHC/Globals/DAT_GameCore.hpp" +#include "OpenSHC/Globals/DAT_WindowAndDirectDraw.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::UI::Enums::BuildingsAndStatusMenuTabType; + using OpenSHC::UI::Enums::MenuViewType; + + // FUNCTION: STRONGHOLDCRUSADER 0x004E7770 + void ViewportRenderState::resetupViewport(int zoomUnk) + { + int savedViewportY = this->viewportState.viewportY + this->viewportState.mbr_0xb0 * 8; + int savedViewportX = this->viewportState.mbr_0xac * 0x20 + this->viewportState.viewportX; + this->viewportState.isZoomedOutUnk = zoomUnk; + + int screenPixelHeight; + if ((DAT_GameCore::instance.currentMenuViewType == OpenSHC::UI::Enums::MVT_BUILD_MENU + || DAT_GameCore::instance.currentMenuViewType == OpenSHC::UI::Enums::MVT_MAP_EDITOR_LANDSCAPING) + && (DAT_GameCore::instance.activeMenuTab.tabType == OpenSHC::UI::Enums::BASMTT_SIEGETENT_SIEGETOWER + || DAT_GameCore::instance.activeMenuTab.tabType == OpenSHC::UI::Enums::BASMTT_SIEGETENT_SHIELD)) { + screenPixelHeight = DAT_WindowAndDirectDraw::instance.resolutionY; + } else { + screenPixelHeight = DAT_WindowAndDirectDraw::instance.resolutionY - 0x80; + } + + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setupViewport, this) + (0, 0, DAT_WindowAndDirectDraw::instance.resolutionX, screenPixelHeight); + this->viewportState.viewportX = savedViewportX - this->viewportState.mbr_0xac * 0x20; + this->viewportState.viewportY = savedViewportY - this->viewportState.mbr_0xb0 * 8; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 8847979b3..67423700f 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36983,7 +36983,7 @@ SHC_3BB0A8C1_0x004E64D0 | 0.0% | Pending SHC_3BB0A8C1_0x004E66F0 | 0.0% | Pending -SHC_3BB0A8C1_0x004E7770 | 0.0% | Pending +SHC_3BB0A8C1_0x004E7770 | 36.6% | LTCG ecx reuse in callers SHC_3BB0A8C1_0x004E7800 | 100.0% | Reimplemented From b3c3de80b8b7eb3a05f0f70e67f19ac4ecbec40f Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:47 +0200 Subject: [PATCH 14/77] reimplement: SHC_3BB0A8C1_0x004E1FA0 100.00% Reimplemented --- .../Constructor_ViewportRenderState.cpp | 41 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/Constructor_ViewportRenderState.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/Constructor_ViewportRenderState.cpp b/src/OpenSHC/Rendering/ViewportRenderState/Constructor_ViewportRenderState.cpp new file mode 100644 index 000000000..81ebafb47 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/Constructor_ViewportRenderState.cpp @@ -0,0 +1,41 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E1FA0 + ViewportRenderState* ViewportRenderState::Constructor_ViewportRenderState() + { + this->viewportState.viewportX = 32; + this->viewportState.viewportY = 8; + this->viewportState.field4_0x10 = -1; + + DWORD now = timeGetTime(); + this->previousIntervalTime_02 = now; + this->previousIntervalTime_01 = now; + this->previousIntervalTime_04 = now; + this->previousIntervalTime_03 = now; + + this->viewportState.isZoomedOutUnk = 0; + this->DAT_MapEditorDisplayLayer = 0; + this->unknownCounterUntil_0x20 = 0; + this->unknownCounterUntil_0x200 = 0; + this->unknownCounterUntil_0x24 = 0; + this->field55_0x18b764 = 0; + this->unknownCounterUntil_0x10 = 0; + this->viewportState.field37_0x94 = 0; + + this->interval_03_160 = 160; + this->interval_04_180 = 180; + this->interval_01_80 = 80; + this->interval_02_100 = 100; + this->availableFloaterIndex = 1; + + for (int i = 0; i < 45; i++) { + this->landscapeAnimationRandomTileArray[i] = 0; + } + return this; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 67423700f..dde0c5ca9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36389,7 +36389,7 @@ SHC_3BB0A8C1_0x004E1E70 | 0.0% | Pending SHC_3BB0A8C1_0x004E1F50 | 0.0% | Pending -SHC_3BB0A8C1_0x004E1FA0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E1FA0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E2050 | 0.0% | Pending From c478137d0172584e26cc401da2bd0646541bb2a4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:47 +0200 Subject: [PATCH 15/77] reimplement: SHC_3BB0A8C1_0x004E25A0 100.00% Reimplemented --- .../tweakValidTilesToExcludeMapBorders.cpp | 26 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/tweakValidTilesToExcludeMapBorders.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/tweakValidTilesToExcludeMapBorders.cpp b/src/OpenSHC/Rendering/ViewportRenderState/tweakValidTilesToExcludeMapBorders.cpp new file mode 100644 index 000000000..feecfe0fc --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/tweakValidTilesToExcludeMapBorders.cpp @@ -0,0 +1,26 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E25A0 + void ViewportRenderState::tweakValidTilesToExcludeMapBorders() + { + for (int y = 0; y < 400; y++) { + for (int x = 0; x < 400; x++) { + if (this->DAT_BinaryTileMap400x400[y * 400 + x] == 0) { + continue; + } + int tile = this->translationMatrix[y].addXgetTile + x; + this->tileTranslationMatrix_YComponent[tile] = (short)y; + if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x30) != 0) { + this->DAT_BinaryTileMap400x400[y * 400 + x] = 0; + } + } + } + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index dde0c5ca9..6e7c9bd4b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36397,7 +36397,7 @@ SHC_3BB0A8C1_0x004E21E0 | 0.0% | Pending SHC_3BB0A8C1_0x004E2460 | 0.0% | Pending -SHC_3BB0A8C1_0x004E25A0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E25A0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E2600 | 100.0% | Reimplemented From 3ac35e39758ffc11f9d9745d39766f05c9ae2810 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:48 +0200 Subject: [PATCH 16/77] reimplement: SHC_3BB0A8C1_0x004E5B80 65.71% esi/edi allocation differs --- .../ViewportRenderState/assignRandomTiles.cpp | 30 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/assignRandomTiles.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/assignRandomTiles.cpp b/src/OpenSHC/Rendering/ViewportRenderState/assignRandomTiles.cpp new file mode 100644 index 000000000..989da8938 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/assignRandomTiles.cpp @@ -0,0 +1,30 @@ +#include "OpenSHC/OS.func.hpp" +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E5B80 + void ViewportRenderState::assignRandomTiles() + { + for (int i = 0; i < 45; i++) { + if (this->landscapeAnimationRandomTileArray[i] == 0) { + int randomHighBits = MACRO_CALL(OpenSHC::OS_Func::_rand)() << 0xf; + uint randomLowBits = MACRO_CALL(OpenSHC::OS_Func::_rand)(); + int randomTile = (int)(randomLowBits | randomHighBits) % 80400; + if ((DAT_TileMapState::instance.LogicLayer[randomTile] & 1) != 0 + && (DAT_TileMapState::instance.MiscDisplayLayer[randomTile] & 0x3c0) == 0 + && (DAT_TileMapState::instance.Logic2Layer[randomTile] & 8) == 0) { + this->landscapeAnimationRandomTileArray[i] = randomTile; + this->landscapeSeaWhiteCapsAnimationFrames[i] = 0; + } + } else if (8 <= this->landscapeSeaWhiteCapsAnimationFrames[i]) { + this->landscapeAnimationRandomTileArray[i] = 0; + } + } + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 6e7c9bd4b..3545b99bf 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36877,7 +36877,7 @@ SHC_3BB0A8C1_0x004E5A89 | 0.0% | Pending SHC_3BB0A8C1_0x004E5A90 | 0.0% | Pending -SHC_3BB0A8C1_0x004E5B80 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5B80 | 65.7% | esi/edi allocation differs SHC_3BB0A8C1_0x004E5C00 | 0.0% | Pending From 12e7a37693a8b1d031b5574e40b597f4a077f932 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:48 +0200 Subject: [PATCH 17/77] reimplement: SHC_3BB0A8C1_0x004E2630 51.16% register allocation differs --- .../renderAssassinClimbingOverlay.cpp | 44 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/renderAssassinClimbingOverlay.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderAssassinClimbingOverlay.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderAssassinClimbingOverlay.cpp new file mode 100644 index 000000000..dcad96ac3 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderAssassinClimbingOverlay.cpp @@ -0,0 +1,44 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/UI/Rendering/TextureRenderCore.func.hpp" + +#include "OpenSHC/Globals/DAT_TextureRenderCoreObject.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E2630 + void ViewportRenderState::renderAssassinClimbingOverlay(int unitID) + { + short facingDirection = DAT_UnitsState::instance.units[unitID].facingDirectionMapOrientationCorrected; + short assassinHeightDifference = DAT_UnitsState::instance.units[unitID].assassinHeightDifference; + if (assassinHeightDifference <= 0) { + return; + } + int imageID = DAT_UnitsState::instance.units[unitID].imageIDUnk; + if (imageID <= 0) { + return; + } + + if (DAT_UnitsState::instance.units[unitID].assassinClimbingUpUnk_OR_previousFacingDirection == 0) { + if (facingDirection != 4 && facingDirection != 2 && facingDirection != 3 && facingDirection != 1 + && facingDirection != 5) { + return; + } + } else { + if (facingDirection != 0 && facingDirection != 6 && facingDirection != 7 && facingDirection != 1 + && facingDirection != 5) { + return; + } + } + + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr) + ((OpenSHC::IO::Graphics::GmID)DAT_UnitsState::instance.units[unitID].gmIDUnk, imageID, + DAT_UnitsState::instance.units[unitID].field308_0x41c, + DAT_UnitsState::instance.units[unitID].field309_0x420 - assassinHeightDifference, + (short)DAT_UnitsState::instance.units[unitID].field307_0x41a); + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3545b99bf..4ab1b53c9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36401,7 +36401,7 @@ SHC_3BB0A8C1_0x004E25A0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E2600 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E2630 | 0.0% | Pending +SHC_3BB0A8C1_0x004E2630 | 51.2% | register allocation differs SHC_3BB0A8C1_0x004E26D0 | 0.0% | Pending From d689717b4f6e521616f9c8f7a677799271a3497d Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:48 +0200 Subject: [PATCH 18/77] reimplement: SHC_3BB0A8C1_0x004E3870 100.00% Reimplemented --- .../renderBuildingAnimation.cpp | 66 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/renderBuildingAnimation.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderBuildingAnimation.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderBuildingAnimation.cpp new file mode 100644 index 000000000..480361ee9 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderBuildingAnimation.cpp @@ -0,0 +1,66 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/UI/Rendering/TextureRenderCore.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_CurrentlyRenderedSpriteID.hpp" +#include "OpenSHC/Globals/DAT_RenderedUnitOwner.hpp" +#include "OpenSHC/Globals/DAT_TextureRenderCoreObject.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E3870 + void ViewportRenderState::renderBuildingAnimation( + int buildingID, int screenX, int screenY, undefined4 param_4, int clipToBuilding) + { + if (DAT_BuildingsState::instance.buildings[buildingID].renderAnimation == 0) { + return; + } + if (DAT_BuildingsState::instance.buildings[buildingID].animationFrame == 0) { + return; + } + if (DAT_TileMapState::instance.field93_0x5548c8 != 0) { + return; + } + if (DAT_BuildingsState::instance.buildings[buildingID].drawBridgeState1 != 0) { + return; + } + + if (clipToBuilding != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::temporarySaveMapSurfaceHeightRangeUnk, + DAT_TextureRenderCoreObject::ptr) + (); + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::setMapSurfaceHeightRange, + DAT_TextureRenderCoreObject::ptr) + ((screenY - 0x27 < 0) ? 0 : screenY - 0x27, 0x81c); + } + + DAT_RenderedUnitOwner::instance = DAT_BuildingsState::instance.buildings[buildingID].playerColorUnk; + DAT_CurrentlyRenderedSpriteID::instance = DAT_BuildingsState::instance.buildings[buildingID].spriteID2; + if (DAT_BuildingsState::instance.buildings[buildingID].field66_0xbe != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr) + ((OpenSHC::IO::Graphics::GmID)DAT_CurrentlyRenderedSpriteID::instance, + DAT_BuildingsState::instance.buildings[buildingID].animationFrame, + DAT_BuildingsState::instance.buildings[buildingID].spriteOffetX + screenX, + DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY, + DAT_BuildingsState::instance.buildings[buildingID].field66_0xbe); + } else { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr) + ((OpenSHC::DE::SHCDE::eGM)DAT_CurrentlyRenderedSpriteID::instance, + DAT_BuildingsState::instance.buildings[buildingID].animationFrame, + DAT_BuildingsState::instance.buildings[buildingID].spriteOffetX + screenX, + DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY); + } + if (clipToBuilding != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::restoreMapSurfaceHeightRangeFromTemporaryUnk, + DAT_TextureRenderCoreObject::ptr) + (); + } + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4ab1b53c9..3a14c1391 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36501,7 +36501,7 @@ SHC_3BB0A8C1_0x004E3868 | 0.0% | Pending SHC_3BB0A8C1_0x004E3869 | 0.0% | Pending -SHC_3BB0A8C1_0x004E3870 | 0.0% | Pending +SHC_3BB0A8C1_0x004E3870 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E3980 | 0.0% | Pending From 683ffc9fad803e14b405b4d73b3e173813195d4c Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:49 +0200 Subject: [PATCH 19/77] reimplement: SHC_3BB0A8C1_0x004E63A0 90.28% extra reg copy in original --- .../createFloatingLayerElement.cpp | 50 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp b/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp new file mode 100644 index 000000000..503ae2cb7 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp @@ -0,0 +1,50 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +#include "OpenSHC/Globals/DAT_TextureRenderCoreObject.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E63A0 + void ViewportRenderState::createFloatingLayerElement( + GmID gmID, int imageID, int imageX, int imageY, int tile, int variation) + { + int newFloaterIndex = this->availableFloaterIndex; + if (tile < 0) { + return; + } + if (250 <= (int)this->availableFloaterIndex) { + return; + } + + if (DAT_TileMapState::instance.FloatingLayer[tile] == 0) { + this->floatersArray[newFloaterIndex].id = 0; + } else { + uint idAtTile = DAT_TileMapState::instance.FloatingLayer[tile]; + uint floaterID = idAtTile; + if (249 < floaterID) { + return; + } + for (; floaterID != 0; floaterID = this->floatersArray[floaterID].id) { + if (this->floatersArray[floaterID].imageID == imageID && this->floatersArray[floaterID].gmID == gmID) { + return; + } + } + this->floatersArray[newFloaterIndex].id = idAtTile; + } + + DAT_TileMapState::instance.FloatingLayer[tile] = (ushort)newFloaterIndex; + this->floatersArray[newFloaterIndex].gmID = gmID; + this->floatersArray[newFloaterIndex].imageID = imageID; + this->floatersArray[newFloaterIndex].originX + = imageX - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[gmID].originX; + this->floatersArray[newFloaterIndex].originY + = imageY - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[gmID].originY; + this->floatersArray[newFloaterIndex].tile = tile; + this->floatersArray[newFloaterIndex].variation = variation; + this->availableFloaterIndex = this->availableFloaterIndex + 1; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3a14c1391..cb793a8f0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36975,7 +36975,7 @@ SHC_3BB0A8C1_0x004E6340 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E6360 | 0.0% | Pending -SHC_3BB0A8C1_0x004E63A0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E63A0 | 90.3% | extra reg copy in original SHC_3BB0A8C1_0x004E6410 | 0.0% | Pending From 38f4ca7866bcf02cc75f1ed53666a777a487925d Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:49 +0200 Subject: [PATCH 20/77] reimplement: SHC_3BB0A8C1_0x004E5E20 90.60% goto-free loop exit, 3 instr --- .../ViewportRenderState/focusOnTile.cpp | 49 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/focusOnTile.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/focusOnTile.cpp b/src/OpenSHC/Rendering/ViewportRenderState/focusOnTile.cpp new file mode 100644 index 000000000..a5e801087 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/focusOnTile.cpp @@ -0,0 +1,49 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E5E20 + void ViewportRenderState::focusOnTile(int tile) + { + int screenPointIndex = 8; + if (DAT_TileMapState::instance.mapOrientation != 0) { + if (DAT_TileMapState::instance.mapOrientation == 6) { + screenPointIndex = 80408; + } else if (DAT_TileMapState::instance.mapOrientation == 4) { + screenPointIndex = 160808; + } else if (DAT_TileMapState::instance.mapOrientation == 2) { + screenPointIndex = 241208; + } + } + + int rowLength = 201; + int tileX = 0; + int tileY = 0; + do { + rowLength = (rowLength != 201) + 200; + tileX = 0; + if (0 < rowLength) { + do { + if (this->screenPointToTileNumber[screenPointIndex - 8] == tile) { + break; + } + tileX = tileX + 1; + screenPointIndex = screenPointIndex + 1; + } while (tileX < rowLength); + if (tileX < rowLength) { + break; + } + } + tileY = tileY + 1; + } while (tileY < 400); + + this->viewportState.viewportX = (tileX - this->viewportState.mbr_0xac) * 0x20; + this->viewportState.viewportY = (tileY - this->viewportState.mbr_0xb0) * 8; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index cb793a8f0..e06f17cba 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36885,7 +36885,7 @@ SHC_3BB0A8C1_0x004E5D80 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5DD0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E5E20 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5E20 | 90.6% | goto-free loop exit, 3 instr SHC_3BB0A8C1_0x004E5ED0 | 0.0% | Pending From 088266f1dc479a82d84f89bf506ffad42e2cb407 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:49 +0200 Subject: [PATCH 21/77] reimplement: SHC_3BB0A8C1_0x004E64D0 86.86% reccmp label noise only --- .../renderDebugDataMousePointing.cpp | 72 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/renderDebugDataMousePointing.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderDebugDataMousePointing.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderDebugDataMousePointing.cpp new file mode 100644 index 000000000..250fab655 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderDebugDataMousePointing.cpp @@ -0,0 +1,72 @@ +#include "OpenSHC/OS.func.hpp" +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/Text/TextManager.func.hpp" +#include "OpenSHC/Text/TextAlignment.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/DAT_TextManagerObject.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_ViewportRenderState.hpp" +#include "OpenSHC/Globals/MSVC_SecurityCookie.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::Text::TextAlignment; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + // FUNCTION: STRONGHOLDCRUSADER 0x004E64D0 + void ViewportRenderState::renderDebugDataMousePointing(int x, int y, int width, int height) + { + char text[200]; + uint securityCookie = MSVC_SecurityCookie::instance ^ (uint)text; + + int textX = x + 2; + + MACRO_CALL(OpenSHC::OS_Func::_sprintf) + (text, "Mouse Atom Ref: %d", this->viewportState.mouseAtomRefFloorTile); + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderTextToScreen, DAT_TextManagerObject::ptr) + (text, textX, y, OpenSHC::Text::TTA_LEFT, 0xffffff, 0x12, FALSE, 0); + + MACRO_CALL(OpenSHC::OS_Func::_sprintf) + (text, "Mouse: x%d, y%d, off%d", DAT_ViewportRenderState::instance.viewportState.mouseX, + DAT_ViewportRenderState::instance.viewportState.mouseY, + DAT_ViewportRenderState::instance.viewportState.mouseTile); + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderTextToScreen, DAT_TextManagerObject::ptr) + (text, textX, y + 0x10, OpenSHC::Text::TTA_LEFT, 0xffffff, 0x12, FALSE, 0); + + MACRO_CALL(OpenSHC::OS_Func::_sprintf) + (text, "Tile centre: x%d,y%d", DAT_ViewportRenderState::instance.viewportState.tileCenterX, + DAT_ViewportRenderState::instance.viewportState.tileCenterY); + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderTextToScreen, DAT_TextManagerObject::ptr) + (text, textX, y + 0x20, OpenSHC::Text::TTA_LEFT, 0xffffff, 0x12, FALSE, 0); + + MACRO_CALL(OpenSHC::OS_Func::_sprintf) + (text, "Chimp: %d Struct: %d Fly: %d", this->viewportState.mouseRayUnitID, + this->viewportState.mouseRayBuildingID, this->viewportState.mouseRayEntityID); + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderTextToScreen, DAT_TextManagerObject::ptr) + (text, textX, y + 0x40, OpenSHC::Text::TTA_LEFT, 0xffffff, 0x12, FALSE, 0); + + MACRO_CALL(OpenSHC::OS_Func::_sprintf) + (text, "Logic Layer: %x %x", DAT_TileMapState::instance.LogicLayer[this->viewportState.mouseAtomRefFloorTile], + DAT_TileMapState::instance.LogicLayer[this->viewportState.mouseTile]); + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderTextToScreen, DAT_TextManagerObject::ptr) + (text, textX, y + 0x50, OpenSHC::Text::TTA_LEFT, 0xffffff, 0x12, FALSE, 0); + + MACRO_CALL(OpenSHC::OS_Func::_sprintf) + (text, "Logic2 Layer: %x %x", + (char)DAT_TileMapState::instance.Logic2Layer[this->viewportState.mouseAtomRefFloorTile], + (char)DAT_TileMapState::instance.Logic2Layer[this->viewportState.mouseTile]); + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderTextToScreen, DAT_TextManagerObject::ptr) + (text, textX + 0x14, y + 0x50, OpenSHC::Text::TTA_LEFT, 0xffffff, 0x12, TRUE, 0); + + MACRO_CALL(OpenSHC::OS_Func::_sprintf) + (text, "Damage Layer: %d %d", + (char)DAT_TileMapState::instance.DamageLayer[this->viewportState.mouseAtomRefFloorTile], + (char)DAT_TileMapState::instance.DamageLayer[this->viewportState.mouseTile]); + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderTextToScreen, DAT_TextManagerObject::ptr) + (text, textX, y + 0x60, OpenSHC::Text::TTA_LEFT, 0xffffff, 0x12, FALSE, 0); + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e06f17cba..f12f44e1d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36979,7 +36979,7 @@ SHC_3BB0A8C1_0x004E63A0 | 90.3% | extra reg copy in original SHC_3BB0A8C1_0x004E6410 | 0.0% | Pending -SHC_3BB0A8C1_0x004E64D0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E64D0 | 86.9% | reccmp label noise only SHC_3BB0A8C1_0x004E66F0 | 0.0% | Pending From 7480e9f4e1a44120c5e608d108ea5072028379f5 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:28:49 +0200 Subject: [PATCH 22/77] reimplement: SHC_3BB0A8C1_0x004E5A90 100.00% Reimplemented --- .../updateWaterAnimationFrames.cpp | 50 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/updateWaterAnimationFrames.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/updateWaterAnimationFrames.cpp b/src/OpenSHC/Rendering/ViewportRenderState/updateWaterAnimationFrames.cpp new file mode 100644 index 000000000..d3e349028 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/updateWaterAnimationFrames.cpp @@ -0,0 +1,50 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E5A90 + void ViewportRenderState::updateWaterAnimationFrames() + { + DWORD now = timeGetTime(); + + this->field55_0x18b764 = 0; + if ((int)(now - this->previousIntervalTime_04) >= (int)this->interval_04_180) { + this->previousIntervalTime_04 = now; + this->field55_0x18b764 = 1; + for (int i = 0; i < 45; i++) { + this->landscapeSeaWhiteCapsAnimationFrames[i] = this->landscapeSeaWhiteCapsAnimationFrames[i] + 1; + } + } + + if ((int)(now - this->previousIntervalTime_01) >= (int)this->interval_01_80) { + this->previousIntervalTime_01 = now; + this->unknownCounterUntil_0x10 = this->unknownCounterUntil_0x10 + 1; + if (this->unknownCounterUntil_0x10 >= 0x10) { + this->unknownCounterUntil_0x10 = 0; + } + } + + if ((int)(now - this->previousIntervalTime_02) >= (int)this->interval_02_100) { + this->previousIntervalTime_02 = now; + this->unknownCounterUntil_0x20 = this->unknownCounterUntil_0x20 + 1; + if (this->unknownCounterUntil_0x20 >= 0x20) { + this->unknownCounterUntil_0x20 = 0; + } + } + + if ((int)(now - this->previousIntervalTime_03) >= (int)this->interval_03_160) { + this->previousIntervalTime_03 = now; + this->unknownCounterUntil_0x24 = this->unknownCounterUntil_0x24 + 1; + if (this->unknownCounterUntil_0x24 >= 0x24) { + this->unknownCounterUntil_0x24 = 0; + } + this->unknownCounterUntil_0x200 = this->unknownCounterUntil_0x200 + 1; + if (this->unknownCounterUntil_0x200 >= 0x200) { + this->unknownCounterUntil_0x200 = 0; + } + } + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f12f44e1d..5e56f2aad 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36875,7 +36875,7 @@ SHC_3BB0A8C1_0x004E5A88 | 0.0% | Pending SHC_3BB0A8C1_0x004E5A89 | 0.0% | Pending -SHC_3BB0A8C1_0x004E5A90 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5A90 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5B80 | 65.7% | esi/edi allocation differs From b0a3af6a18f42ff9eb6c96297f5cf8269991f7ef Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:37:24 +0200 Subject: [PATCH 23/77] reimplement: SHC_3BB0A8C1_0x004E5C00 25.38% reg alloc, extra stack spill --- .../setViewportBasedOnMapSize.cpp | 91 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp new file mode 100644 index 000000000..fa287d6e2 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp @@ -0,0 +1,91 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/Rendering/ScreenResolutionEnum.hpp" + +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_WindowAndDirectDraw.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::Rendering::ScreenResolutionEnum; + + // FUNCTION: STRONGHOLDCRUSADER 0x004E5C00 + void ViewportRenderState::setViewportBasedOnMapSize() + { + int mapBorder = 400 - DAT_TileMapState::instance.mapSize; + if (mapBorder == 400) { + mapBorder = 0; + } + mapBorder = mapBorder / 2; + + int maxTileColumn = ((400 - mapBorder) / 2 - this->viewportState.viewportHeight) + 4; + int minViewportX = mapBorder / 2 + 1; + int maxViewportX = maxTileColumn * 0x20; + int maxViewportY = ((401 - this->viewportState.viewportWidth) - mapBorder) * 8; + int mapBorderY = mapBorder * 8; + int minViewportY = mapBorderY + 0x10; + if (this->viewportState.isZoomedOutUnk != 0) { + minViewportX = mapBorder / 2 + -4; + } + minViewportX = minViewportX * 0x20; + + if (this->viewportState.viewportX < minViewportX) { + this->viewportState.viewportX = minViewportX; + } + if (this->viewportState.viewportX > maxViewportX) { + this->viewportState.viewportX = maxViewportX; + } + if (this->viewportState.viewportY < minViewportY) { + this->viewportState.viewportY = minViewportY; + } + if (this->viewportState.viewportY > maxViewportY) { + this->viewportState.viewportY = maxViewportY; + } + + if (DAT_TileMapState::instance.mapOrientation != 0) { + if (DAT_TileMapState::instance.mapOrientation == 6) { + if (this->viewportState.viewportX > maxViewportX + -0x20) { + this->viewportState.viewportX = maxViewportX + -0x20; + } + } else if (DAT_TileMapState::instance.mapOrientation == 4) { + if (this->viewportState.viewportY < mapBorderY + 0x18) { + this->viewportState.viewportY = mapBorderY + 0x18; + } + if (this->viewportState.viewportY > maxViewportY + -8) { + this->viewportState.viewportY = maxViewportY + -8; + } + } else if (DAT_TileMapState::instance.mapOrientation == 2) { + if (this->viewportState.viewportX < minViewportX + 0x10) { + this->viewportState.viewportX = minViewportX + 0x10; + } + if (this->viewportState.viewportY > maxViewportY + -8) { + this->viewportState.viewportY = maxViewportY + -8; + } + } + } + + if (DAT_TileMapState::instance.mapSize == 160 + && DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x768 + && this->viewportState.isZoomedOutUnk != 0) { + minViewportY = mapBorderY + 6; + maxViewportY = maxViewportY + -10; + } + + if (maxViewportX < minViewportX) { + this->viewportState.viewportX = (minViewportX + maxTileColumn * -0x20) / 2 + maxViewportX; + } + if (maxViewportY < minViewportY) { + this->viewportState.viewportY = (minViewportY - maxViewportY) / 2 + maxViewportY; + } + + if (this->viewportState.isZoomedOutUnk == 0) { + this->viewportState.currentCameraOffsetX = (this->viewportState.viewportX & 0x1fU) + 150; + this->viewportState.currentCameraOffsetY = (this->viewportState.viewportY & 0xfU) + 0x10; + return; + } + this->viewportState.currentCameraOffsetX = (this->viewportState.viewportX >> 1 & 0xfU) + 150; + this->viewportState.currentCameraOffsetY = (this->viewportState.viewportY >> 1 & 7U) + 0x10; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5e56f2aad..9226cdbcf 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36879,7 +36879,7 @@ SHC_3BB0A8C1_0x004E5A90 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5B80 | 65.7% | esi/edi allocation differs -SHC_3BB0A8C1_0x004E5C00 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5C00 | 25.4% | reg alloc, extra stack spill SHC_3BB0A8C1_0x004E5D80 | 100.0% | Reimplemented From efde4b4b931f1d120c6df002fc7fdb5b1b71f944 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:37:24 +0200 Subject: [PATCH 24/77] reimplement: SHC_3BB0A8C1_0x004E26D0 54.08% esi/edx allocation differs --- .../scheduleUnitForBatchedRendering.cpp | 99 +++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp b/src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp new file mode 100644 index 000000000..4d9b6da97 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp @@ -0,0 +1,99 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +#include "OpenSHC/Globals/DAT_CurrentlyRenderedSpriteID.hpp" +#include "OpenSHC/Globals/DAT_RenderedUnitOwner.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E26D0 + void ViewportRenderState::scheduleUnitForBatchedRendering(undefined4 unitIDOrStatus, undefined4 drawX, + undefined4 drawY, undefined4 imageID, undefined4 blendStrength, undefined4 gmID, int param_7) + { + int batch; + if (param_7 == 1) { + batch = this->unitBatchedRenderCounterUntil6 + 4; + if (5 < batch) { + batch = batch - 5; + } + } else { + batch = this->unitBatchedRenderCounterUntil6; + if (param_7 == 2) { + batch = this->unitBatchedRenderCounterUntil6 + 3; + if (5 < batch) { + batch = batch - 5; + } + } + } + + switch (batch) { + case 1: + if ((int)this->unitRender1 < 500) { + this->unitBatch1[this->unitRender1].unitIDOrStatus = unitIDOrStatus; + this->unitBatch1[this->unitRender1].ownerColor = DAT_RenderedUnitOwner::instance; + this->unitBatch1[this->unitRender1].spriteID = DAT_CurrentlyRenderedSpriteID::instance; + this->unitBatch1[this->unitRender1].drawX = drawX; + this->unitBatch1[this->unitRender1].drawY = drawY; + this->unitBatch1[this->unitRender1].imageID = imageID; + this->unitBatch1[this->unitRender1].blendStrength = blendStrength; + this->unitBatch1[this->unitRender1].gmID = gmID; + this->unitRender1 = this->unitRender1 + 1; + } + break; + case 2: + if ((int)this->unitRender2 < 500) { + this->unitBatch2[this->unitRender2].unitIDOrStatus = unitIDOrStatus; + this->unitBatch2[this->unitRender2].ownerColor = DAT_RenderedUnitOwner::instance; + this->unitBatch2[this->unitRender2].spriteID = DAT_CurrentlyRenderedSpriteID::instance; + this->unitBatch2[this->unitRender2].drawX = drawX; + this->unitBatch2[this->unitRender2].drawY = drawY; + this->unitBatch2[this->unitRender2].imageID = imageID; + this->unitBatch2[this->unitRender2].blendStrength = blendStrength; + this->unitBatch2[this->unitRender2].gmID = gmID; + this->unitRender2 = this->unitRender2 + 1; + } + break; + case 3: + if ((int)this->unitRender3 < 500) { + this->unitBatch3[this->unitRender3].unitIDOrStatus = unitIDOrStatus; + this->unitBatch3[this->unitRender3].ownerColor = DAT_RenderedUnitOwner::instance; + this->unitBatch3[this->unitRender3].spriteID = DAT_CurrentlyRenderedSpriteID::instance; + this->unitBatch3[this->unitRender3].drawX = drawX; + this->unitBatch3[this->unitRender3].drawY = drawY; + this->unitBatch3[this->unitRender3].imageID = imageID; + this->unitBatch3[this->unitRender3].blendStrength = blendStrength; + this->unitBatch3[this->unitRender3].gmID = gmID; + this->unitRender3 = this->unitRender3 + 1; + } + break; + case 4: + if ((int)this->unitRender4 < 500) { + this->unitBatch4[this->unitRender4].unitIDOrStatus = unitIDOrStatus; + this->unitBatch4[this->unitRender4].ownerColor = DAT_RenderedUnitOwner::instance; + this->unitBatch4[this->unitRender4].spriteID = DAT_CurrentlyRenderedSpriteID::instance; + this->unitBatch4[this->unitRender4].drawX = drawX; + this->unitBatch4[this->unitRender4].drawY = drawY; + this->unitBatch4[this->unitRender4].imageID = imageID; + this->unitBatch4[this->unitRender4].blendStrength = blendStrength; + this->unitBatch4[this->unitRender4].gmID = gmID; + this->unitRender4 = this->unitRender4 + 1; + } + break; + case 5: + if ((int)this->unitRender5 < 500) { + this->unitBatch5[this->unitRender5].unitIDOrStatus = unitIDOrStatus; + this->unitBatch5[this->unitRender5].ownerColor = DAT_RenderedUnitOwner::instance; + this->unitBatch5[this->unitRender5].spriteID = DAT_CurrentlyRenderedSpriteID::instance; + this->unitBatch5[this->unitRender5].drawX = drawX; + this->unitBatch5[this->unitRender5].drawY = drawY; + this->unitBatch5[this->unitRender5].imageID = imageID; + this->unitBatch5[this->unitRender5].blendStrength = blendStrength; + this->unitBatch5[this->unitRender5].gmID = gmID; + this->unitRender5 = this->unitRender5 + 1; + } + break; + } + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9226cdbcf..40f9f9b73 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36403,7 +36403,7 @@ SHC_3BB0A8C1_0x004E2600 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E2630 | 51.2% | register allocation differs -SHC_3BB0A8C1_0x004E26D0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E26D0 | 54.1% | esi/edx allocation differs SHC_3BB0A8C1_0x004E2AB4 | 0.0% | Pending From 8bc983ba77c17248b23b09a6d40744f59aba7a8d Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:37:24 +0200 Subject: [PATCH 25/77] reimplement: SHC_3BB0A8C1_0x004E5ED0 34.12% reg alloc + tail merging --- .../computeMouseTileFromScreenPosition.cpp | 215 ++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp new file mode 100644 index 000000000..600a1c1ce --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp @@ -0,0 +1,215 @@ +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/TileMapState.func.hpp" +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_MapRenderDefinedData.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E5ED0 + void ViewportRenderState::computeMouseTileFromScreenPosition(int screenX, int screenY) + { + int probeScreenY = screenY + -8; + int foundTile = 0; + int orientationBase = 8; + + this->viewportState.field27_0x6c = 0; + this->viewportState.field24_0x60 = 0; + this->viewportState.mouseX = 0; + this->viewportState.mouseY = 0; + if (this->viewportState.field0_0x0 == 0) { + this->viewportState.field24_0x60 = 0; + this->viewportState.mouseX = 0; + this->viewportState.mouseY = 0; + this->viewportState.field27_0x6c = 0; + return; + } + + int tileColumnX; + if (this->viewportState.isZoomedOutUnk == 0) { + uint viewportXInTile = this->viewportState.viewportX & 0x8000001f; + if ((int)viewportXInTile < 0) { + viewportXInTile = (viewportXInTile - 1 | 0xffffffe0) + 1; + } + tileColumnX = (viewportXInTile - this->windowX) + screenX; + } else { + uint viewportXInTile = this->viewportState.viewportX & 0x8000001f; + if ((int)viewportXInTile < 0) { + viewportXInTile = (viewportXInTile - 1 | 0xffffffe0) + 1; + } + tileColumnX = (viewportXInTile + screenX * 2) - this->windowX; + } + + if (DAT_TileMapState::instance.mapOrientation == 0) { + orientationBase = 8; + } else if (DAT_TileMapState::instance.mapOrientation == 6) { + orientationBase = 0x13a18; + } else if (DAT_TileMapState::instance.mapOrientation == 4) { + orientationBase = 0x27428; + } else if (DAT_TileMapState::instance.mapOrientation == 2) { + orientationBase = 0x3ae38; + } + + int probeOffset = probeScreenY - screenY; + int probeDoubledY = screenY + probeScreenY; + do { + if ((DAT_TileMapState::instance.field93_0x5548c8 != 0 + || DAT_TileMapState::instance.flatViewToggleValue2 != 0) + && probeOffset != -8) { + break; + } + + int lookupIndex; + uint tileRowY; + if (this->viewportState.isZoomedOutUnk == 0) { + int unclampedY = (this->viewportState.viewportY - this->windowY) + 8 + probeScreenY; + tileRowY = ((this->viewportState.viewportY & 0x8000000fU) - this->windowY) + -8 + probeScreenY; + int unclampedX = (screenX - this->windowX) + this->viewportState.viewportX; + lookupIndex = ((int)(unclampedX + (unclampedX >> 0x1f & 0x1fU)) >> 5) + + ((int)(unclampedY + (unclampedY >> 0x1f & 0xfU)) >> 4) * 0x191 + orientationBase; + } else { + int unclampedX = ((screenX * 2 + 0xa0) - this->windowX) + this->viewportState.viewportX; + tileRowY = ((this->viewportState.viewportY & 0x8000000fU) - this->windowY) + probeDoubledY; + int unclampedY = (probeDoubledY - this->windowY) + this->viewportState.viewportY; + lookupIndex = ((int)(unclampedY + (unclampedY >> 0x1f & 0xfU)) >> 4) * 0x191 + + ((int)(unclampedX + (unclampedX >> 0x1f & 0x1fU)) >> 5) + orientationBase; + } + + int quadrant = DAT_MapRenderDefinedData::instance.field618_0xc24[tileRowY & 0xf][tileColumnX >> 1 & 0xf]; + if (quadrant == 1) { + lookupIndex = lookupIndex + 200; + } else if (quadrant == 2) { + lookupIndex = lookupIndex + 0xc9; + } else if (quadrant == 3) { + lookupIndex = lookupIndex + 0x191; + } + + int tile = this->screenPointToTileNumber[lookupIndex + -8]; + if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x30U) != 0) { + break; + } + + int tileHeightOffset + = DAT_TileMapState::instance.heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[tile]]; + if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x10000000U) != 0) { + tileHeightOffset = tileHeightOffset + + MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[tile]); + } + if (this->viewportState.isZoomedOutUnk != 0) { + tileHeightOffset = tileHeightOffset / 2; + } + + if ((probeOffset - tileHeightOffset) + 8 + screenY <= screenY + || DAT_TileMapState::instance.field93_0x5548c8 != 0 + || DAT_TileMapState::instance.flatViewToggleValue2 != 0) { + foundTile = tile; + } + + probeScreenY = probeScreenY + 1; + probeDoubledY = probeDoubledY + 2; + probeOffset = probeOffset + 1; + } while (probeOffset < 0xff); + + this->viewportState.field24_0x60 = foundTile; + if (DAT_TileMapState::instance.PathConnectionLayer[foundTile] == 0 + || (DAT_TileMapState::instance.LogicLayer[foundTile] & 0x200U) != 0) { + uint direction = DAT_TileMapState::instance.field84_0x5548a4 + 4U & 0x80000007; + if ((int)direction < 0) { + direction = (direction - 1 | 0xfffffff8) + 1; + } + uint tileFlags = DAT_TileMapState::instance.LogicLayer[foundTile]; + int neighbourTile + = DAT_TileMapState::instance + .directionTranslationMatrix[this->tileTranslationMatrix_YComponent[foundTile]][direction] + + foundTile; + if ((tileFlags & 0x40000000) == 0) { + if ((tileFlags & 0x200) == 0) { + if ((tileFlags & 0x400) != 0) { + switch ( + DAT_BuildingsState::instance.buildings[DAT_TileMapState::instance.BuildingLayer[foundTile]] + .buildingType) { + 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_TOWER: + 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_TileMapState::instance.LogicLayer[neighbourTile] & 0x10000000U) != 0) { + this->viewportState.field24_0x60 = neighbourTile; + } + break; + default: + this->viewportState.field24_0x60 = 0; + break; + } + } else { + this->viewportState.field24_0x60 = 0; + } + } else if ((DAT_TileMapState::instance.LogicLayer[neighbourTile] & 0x100U) != 0) { + this->viewportState.field24_0x60 = neighbourTile; + } + } + } + + if ((DAT_TileMapState::instance.LogicLayer[this->viewportState.field24_0x60] & 0x10000300U) != 0 + && (DAT_TileMapState::instance.LogicLayer[this->viewportState.field24_0x60] & 2U) == 0) { + this->viewportState.field27_0x6c = 1; + } + this->viewportState.somePitchDitchID = 0; + this->viewportState.mouseAtomRefFloorTile = foundTile; + + if (this->viewportState.field24_0x60 == 0) { + this->viewportState.mouseY = 0; + this->viewportState.mouseX = 0; + this->viewportState.field27_0x6c = 0; + this->viewportState.field14_0x38 = 0; + this->viewportState.field16_0x40 = 0; + this->viewportState.field15_0x3c = 0; + return; + } + + this->viewportState.mouseY = this->tileTranslationMatrix_YComponent[this->viewportState.field24_0x60]; + this->viewportState.mouseX + = this->viewportState.field24_0x60 - this->translationMatrix[this->viewportState.mouseY].addXgetTile; + + int hoveredTile = this->viewportState.field24_0x60; + if (DAT_TileMapState::instance.flatViewToggleValue1 != 0) { + hoveredTile = this->viewportState.mouseTile; + } + this->viewportState.field14_0x38 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x40000000; + this->viewportState.field16_0x40 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x4000; + + int moatID = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, DAT_TileMapState::ptr)( + hoveredTile); + if (moatID == 0) { + this->viewportState.field14_0x38 = 0; + this->viewportState.field16_0x40 = 0; + } + this->viewportState.field15_0x3c = this->viewportState.field14_0x38; + if (DAT_GameState::instance.mapAndTime.playerTeams[DAT_TileMapState::instance.moats[moatID].owner] + == DAT_GameState::instance.mapAndTime.playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]) { + this->viewportState.field14_0x38 = 0; + } else { + this->viewportState.field16_0x40 = 0; + this->viewportState.field15_0x3c = 0; + } + + if ((DAT_TileMapState::instance.LogicLayer[hoveredTile] & 8) != 0) { + this->viewportState.somePitchDitchID = MACRO_CALL_MEMBER( + OpenSHC::Map::TileMapState_Func::getPitchDitchIDForTile, DAT_TileMapState::ptr)(hoveredTile); + } + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 40f9f9b73..2b16843a6 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36887,7 +36887,7 @@ SHC_3BB0A8C1_0x004E5DD0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5E20 | 90.6% | goto-free loop exit, 3 instr -SHC_3BB0A8C1_0x004E5ED0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5ED0 | 34.1% | reg alloc + tail merging SHC_3BB0A8C1_0x004E6308 | 0.0% | Pending From 792a340e6562ba1fc646c245b472a66a1cac3f92 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 22:37:25 +0200 Subject: [PATCH 26/77] reimplement: SHC_3BB0A8C1_0x004E2050 15.14% style only, asm differs --- .../setTileSystemMemoryLookupArrays.cpp | 297 ++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 298 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp new file mode 100644 index 000000000..b404f2bc0 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp @@ -0,0 +1,297 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + /* + WARNING: Function: __alloca_probe replaced with injection: alloca_probe + */ + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + + // FUNCTION: STRONGHOLDCRUSADER 0x004E2050 + void ViewportRenderState::setTileSystemMemoryLookupArrays() + + { + int* piVar1; + int* piVar2; + int* piVar3; + int _i; + int iVar4; + int iVar5; + int iVar6; + int iVar7; + int _countdownBy1_199; + int _countdown_by2_398; + int _200; + int _79600; + int _stack[160001]; + int* _ptrStack; + int _countupBy2_2; + int _8; + + this->translationTracker1 = 0; + _ptrStack = _stack; + for (_i = 160000; _i != 0; _i = _i + -1) { + *_ptrStack = 0; + _ptrStack = _ptrStack + 1; + } + _countdownBy1_199 = 199; + _countupBy2_2 = 2; + _8 = 0; + _countdown_by2_398 = 398; + piVar1 = &this->translationMatrix[0].firstTileOfRow; + do { + ((TranslationMatrixTriplet*)(piVar1 + -1))->distanceToCenter = _countdown_by2_398 / 2; + *piVar1 = this->translationTracker1; + piVar1[1] = this->translationTracker1 - _countdown_by2_398 / 2; + if (0 < _countupBy2_2) { + piVar2 = _stack + _countdownBy1_199 + _8; + iVar4 = _countupBy2_2; + do { + *piVar2 = this->translationTracker1; + piVar2 = piVar2 + 1; + this->translationTracker1 = this->translationTracker1 + 1; + iVar4 = iVar4 + -1; + } while (iVar4 != 0); + } + _countdown_by2_398 = _countdown_by2_398 + -2; + _countdownBy1_199 = _countdownBy1_199 + -1; + _8 = _8 + 400; + _countupBy2_2 = _countupBy2_2 + 2; + piVar1 = piVar1 + 3; + } while (_8 < 80000); + /* + *** change of meaning *** + */ + + _countdown_by2_398 = 80000; + _8 = 400 - _countupBy2_2; + piVar1 = &this->translationMatrix[200].firstTileOfRow; + do { + _countdownBy1_199 = _countdownBy1_199 + 1; + _8 = _8 + 2; + _countupBy2_2 = _countupBy2_2 + -2; + ((TranslationMatrixTriplet*)(piVar1 + -1))->distanceToCenter = _8 / 2; + *piVar1 = this->translationTracker1; + piVar1[1] = this->translationTracker1 - _8 / 2; + if (0 < _countupBy2_2) { + piVar2 = _stack + _countdown_by2_398 + _countdownBy1_199; + iVar4 = _countupBy2_2; + do { + *piVar2 = this->translationTracker1; + piVar2 = piVar2 + 1; + this->translationTracker1 = this->translationTracker1 + 1; + iVar4 = iVar4 + -1; + } while (iVar4 != 0); + } + _countdown_by2_398 = _countdown_by2_398 + 400; + piVar1 = piVar1 + 3; + } while (_countdown_by2_398 < 160000); + this->translationResult1 = (400 - _countupBy2_2) / 2; + this->translationResult2 = this->translationTracker1 - this->translationResult1; + this->field9_0x4e5e0 = 0; + this->field10_0x4e5e4 = 0; + this->field11_0x4e5e8 = 0; + this->field12_0x4e5ec = 0; + this->field13_0x4e5f0 = 0; + this->field14_0x4e5f4 = 0; + this->field15_0x4e5f8 = 0; + this->field16_0x4e5fc = 0; + _200 = 200; + _countdownBy1_199 = 0; + _79600 = 79600; + piVar1 = this->screenPointToTileNumber; + _8 = 8; + do { + iVar7 = _8; + iVar6 = 200; + piVar3 = piVar1 + 200; + piVar2 = piVar1; + _8 = _countdownBy1_199; + iVar4 = _79600; + do { + *piVar2 = _stack[iVar4 + _8]; + iVar6 = iVar6 + -1; + piVar2 = piVar2 + 1; + _8 = _8 + 1; + iVar4 = iVar4 + -400; + } while (0 < iVar6); + _79600 = _79600 + 400; + piVar1 = piVar1 + 401; + iVar6 = 200; + _8 = _countdownBy1_199; + iVar4 = _79600; + do { + *piVar3 = _stack[iVar4 + _8]; + iVar6 = iVar6 + -1; + piVar3 = piVar3 + 1; + _8 = _8 + 1; + iVar4 = iVar4 + -400; + } while (-1 < iVar6); + _200 = _200 + -1; + _countdownBy1_199 = _countdownBy1_199 + 1; + _8 = iVar7 + 401; + } while (0 < _200); + _8 = 200; + piVar1 = this->screenPointToTileNumber + iVar7 + 393; + iVar4 = 159600; + do { + *piVar1 = _stack[iVar4 + _countdownBy1_199]; + _8 = _8 + -1; + piVar1 = piVar1 + 1; + _countdownBy1_199 = _countdownBy1_199 + 1; + iVar4 = iVar4 + -400; + } while (0 < _8); + _countdownBy1_199 = 399; + _79600 = 0x26f70; + piVar1 = this->screenPointToTileNumber + iVar7 + 0x251; + _countdown_by2_398 = 200; + _8 = iVar7 + 0x259; + iVar4 = 199; + do { + iVar6 = _8; + _200 = 200; + piVar3 = piVar1 + 200; + piVar2 = piVar1; + _8 = iVar4; + iVar7 = _79600; + do { + *piVar2 = _stack[iVar7 + _8]; + piVar2 = piVar2 + 1; + _8 = _8 + -1; + iVar7 = iVar7 + -400; + _200 = _200 + -1; + } while (_200 != 0); + iVar7 = iVar4 + 1; + _200 = (iVar7 - iVar4) + 199; + iVar4 = ((iVar7 - iVar4) + _countdownBy1_199) * 400; + piVar1 = piVar1 + 0x191; + _8 = iVar7; + do { + iVar4 = iVar4 + -400; + *piVar3 = _stack[iVar4 + _8]; + piVar3 = piVar3 + 1; + _8 = _8 + -1; + _200 = _200 + -1; + } while (-1 < _200); + _countdownBy1_199 = _countdownBy1_199 + -1; + _79600 = _79600 + -400; + _countdown_by2_398 = _countdown_by2_398 + -1; + _8 = iVar6 + 0x191; + iVar4 = iVar7; + } while (_countdown_by2_398 != 0); + _8 = _countdownBy1_199 * 400; + iVar4 = 200; + piVar1 = this->screenPointToTileNumber + iVar6 + 0x189; + do { + *piVar1 = _stack[_8 + iVar7]; + piVar1 = piVar1 + 1; + iVar7 = iVar7 + -1; + _8 = _8 + -400; + iVar4 = iVar4 + -1; + } while (iVar4 != 0); + iVar7 = 199; + _8 = 80000; + piVar1 = this->screenPointToTileNumber + iVar6 + 0x251; + iVar4 = iVar6 + 0x259; + do { + iVar5 = iVar4; + iVar6 = 200; + piVar3 = piVar1 + 200; + piVar2 = piVar1; + iVar4 = _8; + do { + *piVar2 = _stack[iVar7 + iVar4 + iVar6]; + iVar6 = iVar6 + -1; + piVar2 = piVar2 + 1; + iVar4 = iVar4 + 400; + } while (0 < iVar6); + _8 = _8 + -400; + iVar6 = 200; + piVar1 = piVar1 + 0x191; + iVar4 = _8; + do { + *piVar3 = _stack[iVar7 + iVar4 + iVar6]; + piVar3 = piVar3 + 1; + iVar4 = iVar4 + 400; + iVar6 = iVar6 + -1; + } while (-1 < iVar6); + iVar7 = iVar7 + -1; + iVar4 = iVar5 + 0x191; + } while (0 < _8); + _8 = 200; + iVar4 = 0; + piVar1 = this->screenPointToTileNumber + iVar5 + 0x189; + do { + *piVar1 = _stack[iVar4 + -1 + _8]; + _8 = _8 + -1; + piVar1 = piVar1 + 1; + iVar4 = iVar4 + 400; + } while (0 < _8); + _countdownBy1_199 = 0; + _79600 = 0; + piVar1 = this->screenPointToTileNumber + iVar5 + 0x251; + _8 = 200; + iVar4 = iVar5 + 0x259; + do { + iVar6 = iVar4; + iVar5 = 200; + piVar3 = piVar1 + 200; + piVar2 = piVar1; + iVar4 = _8; + iVar7 = _79600; + do { + *piVar2 = _stack[iVar7 + iVar4]; + iVar5 = iVar5 + -1; + piVar2 = piVar2 + 1; + iVar4 = iVar4 + 1; + iVar7 = iVar7 + 400; + } while (0 < iVar5); + iVar7 = _8 + -1; + iVar4 = ((iVar7 - _8) + 1 + _countdownBy1_199) * 400; + _200 = 200; + piVar1 = piVar1 + 0x191; + _8 = iVar7; + do { + *piVar3 = _stack[iVar4 + _8]; + piVar3 = piVar3 + 1; + _8 = _8 + 1; + iVar4 = iVar4 + 400; + _200 = _200 + -1; + } while (-1 < _200); + _countdownBy1_199 = _countdownBy1_199 + 1; + _79600 = _79600 + 400; + _8 = iVar7; + iVar4 = iVar6 + 0x191; + } while (0 < iVar7); + _8 = _countdownBy1_199 * 400; + iVar4 = 200; + piVar1 = this->screenPointToTileNumber + iVar6 + 0x189; + do { + *piVar1 = _stack[_8 + iVar7]; + iVar4 = iVar4 + -1; + piVar1 = piVar1 + 1; + iVar7 = iVar7 + 1; + _8 = _8 + 400; + } while (0 < iVar4); + _8 = 0x21aec98; + piVar1 = _stack; + iVar4 = 400; + do { + iVar7 = 0; + do { + *(bool*)(_8 + iVar7) = 0 < *piVar1; + iVar7 = iVar7 + 1; + piVar1 = piVar1 + 1; + } while (iVar7 < 400); + _8 = _8 + 400; + iVar4 = iVar4 + -1; + } while (iVar4 != 0); + return; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 2b16843a6..21d9febb6 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36391,7 +36391,7 @@ SHC_3BB0A8C1_0x004E1F50 | 0.0% | Pending SHC_3BB0A8C1_0x004E1FA0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E2050 | 0.0% | Pending +SHC_3BB0A8C1_0x004E2050 | 15.1% | style only, asm differs SHC_3BB0A8C1_0x004E21E0 | 0.0% | Pending From 4df501a8912abfdf61ea2b60edf61db5eb2b5855 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 23:51:37 +0200 Subject: [PATCH 27/77] reimplement: SHC_3BB0A8C1_0x004E3980 34.24% reg alloc + tail merging --- .../renderGmOverlayBuilding.cpp | 1803 +++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 1804 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp new file mode 100644 index 000000000..8ad8e209a --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp @@ -0,0 +1,1803 @@ +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/UI/Rendering/TextureRenderCore.func.hpp" +#include "OpenSHC/DE/SHCDE/eGM.hpp" +#include "OpenSHC/Game/GameMode2.hpp" +#include "OpenSHC/IO/Graphics/GmID.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" +#include "OpenSHC/Map/MapType2.hpp" +#include "OpenSHC/UI/Enums/MenuViewType.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_CurrentlyRenderedSpriteID.hpp" +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_GMImageHeaders.hpp" +#include "OpenSHC/Globals/DAT_GMImageOffsets.hpp" +#include "OpenSHC/Globals/DAT_GameCore.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_GmImageAddressToBeRendered.hpp" +#include "OpenSHC/Globals/DAT_MapPropertiesState.hpp" +#include "OpenSHC/Globals/DAT_RenderedUnitOwner.hpp" +#include "OpenSHC/Globals/DAT_TextureRenderCoreObject.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/GMTotalPicturesProcessed.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::DE::SHCDE::eGM; + using OpenSHC::Game::GameMode2; + using OpenSHC::IO::Graphics::GmID; + using OpenSHC::Map::MapType2; + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeShort; + using OpenSHC::UI::Enums::MenuViewType; + + /* + 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 0x004E3980 + void ViewportRenderState::renderGmOverlayBuilding(int tileIndex, int xUnk, int yUnk, int param_4) + + { + short sVar1; + BuildingTypeShort BVar2; + int iVar3; + int iVar4; + int iVar5; + int iVar6; + int* piVar7; + uint uVar8; + int iVar9; + int iVar10; + int iVar11; + GmID GVar12; + eGM gmID; + GmID maskGmID; + int local_18; + int local_14; + int local_10; + int local_8; + int local_4; + + iVar5 = yUnk; + iVar4 = xUnk; + DAT_RenderedUnitOwner::instance = DAT_BuildingsState::instance.buildings[tileIndex].playerColorUnk; + local_18 = 0; + local_14 = 0; + if (DAT_BuildingsState::instance.buildings[tileIndex].displayOwnerFlag != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].tickRelatedVisuallyActiveIndicator; + if (((sVar1 < 1) || (4 < sVar1)) || (iVar11 = 0x20 - ((int)sVar1 << 5) / 5, iVar11 == 0x20)) { + iVar11 = 0; + } + BVar2 = DAT_BuildingsState::instance.buildings[tileIndex].buildingType; + if (BVar2 == OpenSHC::Map::Buildings::BT_CAMPGROUND) { + if (DAT_BuildingsState::instance.buildings[tileIndex].owner + == DAT_GameSynchronyState::instance.currentPlayerSlotID) { + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC, iVar11, + (xUnk - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x55].originX) + -5, + (yUnk - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x55].originY) + + -0x59, + OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC, iVar11 + 0x65, 0); + } + } else { + iVar6 = 0; + if (DAT_TileMapState::instance.field93_0x5548c8 != 0) { + return; + } + switch (BVar2) { + case OpenSHC::Map::Buildings::BT_WOODCUTTERSHUT: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x27, yUnk + -0x67); + } + DAT_GmImageAddressToBeRendered::instance + = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_WOODCUTTER; + if (DAT_GmImageAddressToBeRendered::instance != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)(xUnk + -0x23, yUnk + -0x39, + (int)(( + int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].width)), + (int)((int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .height)), + (byte*)((int)((DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + } + DAT_GmImageAddressToBeRendered::instance + = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (DAT_GmImageAddressToBeRendered::instance != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)(xUnk + -0x38, yUnk + -0x46, + (int)(( + int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].width)), + (int)((int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .height)), + (byte*)((int)((DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + } + break; + case OpenSHC::Map::Buildings::BT_IRONMINE: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x27, yUnk + -0x21); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_IRON_MINER; + if (iVar11 != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field117_0x11a; + if (sVar1 == 0) { + local_18 = -0x1f; + local_14 = -0x58; + } else if ((sVar1 == 1) || (sVar1 == 2)) { + local_14 = -0x9d; + local_18 = -0x1a; + } + if (sVar1 == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, local_18 + xUnk, local_14 + yUnk); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_IRON_MINER, iVar11, + local_18 + xUnk, local_14 + yUnk, + (int)((int)((uint)DAT_BuildingsState::instance.buildings[tileIndex].field208_0x292))); + } + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, xUnk + -0x1f, yUnk + -0x59); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, xUnk + -0x17, yUnk + -0x36); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].state; + if (sVar1 == 0) { + iVar6 = -0x23; + iVar9 = -0x46; + } else if (sVar1 == 1) { + iVar6 = -0x23; + iVar9 = -0x38; + } else { + if (sVar1 == 2) { + iVar6 = -0x23; + iVar9 = -0x46; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, iVar6 + xUnk, iVar9 + yUnk); + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + iVar6 = yUnk + -0x54; + iVar9 = xUnk + -0x33; + gmID = OpenSHC::DE::SHCDE::GM_MINE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + } + break; + } + if (sVar1 == 3) { + iVar6 = -0x23; + iVar9 = -0x4e; + } else if (sVar1 == 4) { + iVar6 = -0x23; + iVar9 = -0x59; + } else { + if (sVar1 != 5) { + iVar6 = -0x33; + iVar9 = -0x46; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, iVar6 + xUnk, iVar9 + yUnk); + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + iVar6 = yUnk + -0x54; + iVar9 = xUnk + -0x33; + gmID = OpenSHC::DE::SHCDE::GM_MINE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + } + break; + } + iVar6 = -0x23; + iVar9 = -0x59; + } + } + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, iVar6 + xUnk, iVar9 + yUnk); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + iVar6 = yUnk + -0x54; + iVar9 = xUnk + -0x33; + gmID = OpenSHC::DE::SHCDE::GM_MINE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + } + break; + case OpenSHC::Map::Buildings::BT_PITCHRIG: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x50; + iVar9 = xUnk + 0xc; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_HUNTERSHUT: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x25, yUnk + -0x56); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_HUNTER; + if (iVar11 != 0) { + iVar6 = yUnk + -0x3c; + iVar9 = xUnk + -0x23; + gmID = OpenSHC::DE::SHCDE::GM_HUNTER_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_MERCENARYPOST: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x6b; + iVar9 = xUnk + -0x25; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_BARRACKS: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x75; + iVar9 = xUnk + -0x25; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_ARMORY: + piVar7 = &DAT_BuildingsState::instance.buildings[tileIndex].tileRef2; + do { + if (piVar7[-1] == param_4) + break; + if (*piVar7 == param_4) { + iVar6 = iVar6 + 1; + break; + } + if (piVar7[1] == param_4) { + iVar6 = iVar6 + 2; + break; + } + if (piVar7[2] == param_4) { + iVar6 = iVar6 + 3; + break; + } + iVar6 = iVar6 + 4; + piVar7 = piVar7 + 4; + } while (iVar6 < 0x10); + iVar9 = 0; + local_10 = 0; + local_18 = 0; + local_14 = 0; + local_4 = 0; + switch (DAT_TileMapState::instance.mapOrientation) { + case 0: + iVar9 = 5; + local_4 = 0; + local_10 = 7; + local_18 = 0xd; + local_14 = 0xf; + break; + case 2: + iVar9 = 4; + local_4 = 3; + local_10 = 6; + local_18 = 0xc; + local_14 = 0xe; + break; + case 4: + iVar9 = 0; + local_4 = 0xf; + local_10 = 2; + local_18 = 8; + local_14 = 10; + break; + case 6: + local_4 = 0xc; + iVar9 = 1; + local_10 = 3; + local_18 = 9; + local_14 = 0xb; + } + iVar10 = 0; + if (iVar6 == iVar9) { + iVar10 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + } else if (iVar6 == local_10) { + iVar10 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay; + } else if (iVar6 == local_18) { + iVar10 = DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c; + } else if (iVar6 == local_14) { + iVar10 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + } + if (0x20 <= iVar10) { + iVar10 = 0; + GVar12 = OpenSHC::IO::Graphics::GID_ANIM_GOODS; + local_8 = 0; + } else { + GVar12 = OpenSHC::IO::Graphics::GID_ANIM_SHIELDS; + local_8 = -10; + iVar10 = DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x68].originY; + } + iVar3 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = GVar12; + if ((iVar3 != 0) && (iVar6 == iVar9)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(GVar12, + DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c, + (xUnk + - (int)DAT_GMImageHeaders::instance + .imh[iVar3 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .width + / 2) + + 0xf + local_8, + (yUnk + - DAT_GMImageHeaders::instance + .imh[iVar3 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .height) + + -0xf + iVar10, + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay; + if ((iVar9 != 0) && (iVar6 == local_10)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(GVar12, + DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay, + (xUnk + - (int)DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .width + / 2) + + 0xf + local_8, + (yUnk + - DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .height) + + -0xf + iVar10, + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c; + if ((iVar9 != 0) && (iVar6 == local_18)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(GVar12, + DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c, + (xUnk + - (int)DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .width + / 2) + + 0xf + local_8, + (yUnk + - DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .height) + + -0xf + iVar10, + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + if ((iVar9 != 0) && (iVar6 == local_14)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(GVar12, iVar9, + (xUnk + - (int)DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .width + / 2) + + 0xf + local_8, + (yUnk + - DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .height) + + -0xf + iVar10, + iVar11); + } + if (param_4 + == *(int*)(DAT_BuildingsState::instance.buildings[tileIndex].workers + local_4 * 2 + 8)) { + DAT_RenderedUnitOwner::instance + = DAT_BuildingsState::instance.buildings[tileIndex].playerColorUnk; + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field36_0x78; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x88; + iVar9 = xUnk + -0x26; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_FLETCHER: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x82; + iVar9 = xUnk + -0x25; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_BLACKSMITH: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x25, yUnk + -0x7b); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 2; + DAT_CurrentlyRenderedSpriteID::instance = 0x3a; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_WORKSHOP_SMITH_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x49); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_SMOKE_30X30; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_SMOKE_30X30, iVar11, xUnk + 3, yUnk + -0x7c, 0x10); + } + break; + case OpenSHC::Map::Buildings::BT_POLETURNER: + case OpenSHC::Map::Buildings::BT_TANNER: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x80; + iVar9 = xUnk + -0x25; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_ARMOURER: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x89; + iVar9 = xUnk + -0x25; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_BAKERY: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x25, yUnk + -0x7b); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = 0x42; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_WORKSHOP_BAKER_ANIMS, iVar11, xUnk + -0x14, yUnk + -0x5f); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_SMOKE_30X30; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_SMOKE_30X30, iVar11, xUnk + -4, yUnk + -0x8c, 0x10); + } + break; + case OpenSHC::Map::Buildings::BT_BREWERY: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x25, yUnk + -0x7b); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 2; + DAT_CurrentlyRenderedSpriteID::instance = 0x33; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_WORKSHOP_BREW_ANIMS, iVar11, xUnk + -0x3c, yUnk + -0x44); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_SMOKE_30X30; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_SMOKE_30X30, iVar11, xUnk + 7, yUnk + -0x7c, 0x10); + } + break; + case OpenSHC::Map::Buildings::BT_GRANARY: + iVar6 = 0; + piVar7 = &DAT_BuildingsState::instance.buildings[tileIndex].tileRef2; + do { + if (piVar7[-1] == param_4) + break; + if (*piVar7 == param_4) { + iVar6 = iVar6 + 1; + break; + } + if (piVar7[1] == param_4) { + iVar6 = iVar6 + 2; + break; + } + if (piVar7[2] == param_4) { + iVar6 = iVar6 + 3; + break; + } + iVar6 = iVar6 + 4; + piVar7 = piVar7 + 4; + } while (iVar6 < 0x10); + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if ((iVar9 != 0) && (iVar6 == 0)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if ((iVar9 != 0) && (iVar6 == 1)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if ((iVar9 != 0) && (iVar6 == 2)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field34_0x70; + if ((iVar9 != 0) && (iVar6 == 3)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field34_0x70, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if ((iVar9 != 0) && (iVar6 == 4)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if ((iVar9 != 0) && (iVar6 == 5)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field32_0x68; + if ((iVar9 != 0) && (iVar6 == 6)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field32_0x68, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c; + if ((iVar9 != 0) && (iVar6 == 7)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if ((iVar9 != 0) && (iVar6 == 8)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay; + if ((iVar9 != 0) && (iVar6 == 9)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field35_0x74; + if ((iVar9 != 0) && (iVar6 == 10)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field35_0x74, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + if ((iVar9 != 0) && (iVar6 == 0xb)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field33_0x6c; + if ((iVar9 != 0) && (iVar6 == 0xc)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field33_0x6c, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field36_0x78; + if ((iVar9 != 0) && (iVar6 == 0xd)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].field36_0x78, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].ownerFlagFrame; + if ((iVar9 != 0) && (iVar6 == 0xe)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, + DAT_BuildingsState::instance.buildings[tileIndex].ownerFlagFrame, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field40_0x88; + if ((iVar9 != 0) && (iVar6 == 0xf)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, iVar9, + (int)((int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf)), + (int)((int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5)), + iVar11); + } + break; + case OpenSHC::Map::Buildings::BT_QUARRY: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x26, yUnk + -0x3c); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 1; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_QUARRY; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, iVar11, xUnk + 0xc, yUnk + -0x8c); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, iVar11, xUnk + -0x31, yUnk + -0x88); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, iVar11, xUnk + -0x20, yUnk + -0x6b); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (iVar11 != 0) { + iVar6 = yUnk + -0x6f; + iVar9 = xUnk + -0x5f; + gmID = OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_INN: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x45, yUnk + -0x95); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_INN; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, iVar11, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, iVar11, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, iVar11, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (iVar11 != 0) { + iVar6 = DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk; + iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_INN; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_APOTHECARY: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0xb1; + iVar9 = xUnk + 5; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_ENGINEERSGUILD: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x72; + iVar9 = xUnk + -0x33; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_TUNNELERSGUILD: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x77; + iVar9 = xUnk + -0x36; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_MARKETPLACE: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x6a; + iVar9 = xUnk + -0x27; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_OILSMELTER: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + 3, yUnk + -0x7d); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_BOILED_OIL; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_OIL_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x3e); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (iVar11 != 0) { + iVar9 = xUnk + -0x23; + if (iVar11 < 0x7b) { + iVar6 = yUnk + -100; + gmID = OpenSHC::DE::SHCDE::GM_OIL_ANIMS; + } else { + iVar6 = yUnk + -0x66; + gmID = OpenSHC::DE::SHCDE::GM_OIL_ANIMS; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_WHEATFARM: + case OpenSHC::Map::Buildings::BT_HOPFARM: + case OpenSHC::Map::Buildings::BT_APPLEFARM: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x6d; + iVar9 = xUnk + -0x37; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_DAIRYFARM: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x37, yUnk + -0x6d); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FARMER; + if (iVar11 != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + if (sVar1 == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_FARMER_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x51); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, iVar11, + xUnk + -0x23, yUnk + -0x51, (int)((int)(sVar1))); + } + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (iVar11 != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + if (sVar1 == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_FARMER_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x51); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, iVar11, + xUnk + -0x23, yUnk + -0x51, (int)((int)(sVar1))); + } + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_FARMER_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x51); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (iVar11 != 0) { + iVar6 = yUnk + -0x51; + iVar9 = xUnk + -0x23; + gmID = OpenSHC::DE::SHCDE::GM_FARMER_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_MILL: + iVar6 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar6 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar6, xUnk + -0x26, yUnk + -0x72); + } + iVar6 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_WINDMILL; + if (iVar6 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_WINDMILL_ANIMS, iVar6, xUnk + -0x4e, yUnk + -0x103); + } + iVar6 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (iVar6 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_ANIM_WINDMILL, iVar6, xUnk + -0x4e, yUnk + -0x103, iVar11); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_WINDMILL_ANIMS, iVar11, xUnk + -0x4e, yUnk + -0xd0); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (iVar11 != 0) { + iVar6 = yUnk + -0x124; + iVar9 = xUnk + -0x59; + gmID = OpenSHC::DE::SHCDE::GM_WINDMILL_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_STABLES: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x12, yUnk + -99); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_STABLES; + if (iVar11 != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + if (iVar11 < 0x26) { + if (sVar1 == 0) { + iVar6 = yUnk + -0x6b; + iVar9 = xUnk + -0x50; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + xUnk + -0x50, yUnk + -0x6b, (int)((int)(sVar1))); + } + } else { + if (sVar1 == 0) { + iVar6 = yUnk + -100; + iVar9 = xUnk + -0x67; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + xUnk + -0x50, yUnk + -0x6b, (int)((int)(sVar1))); + } + } + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + if (iVar11 < 0x26) { + if (sVar1 == 0) { + iVar6 = yUnk + -0x60; + iVar9 = xUnk + -0x3a; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + xUnk + -0x3a, yUnk + -0x60, (int)((int)(sVar1))); + } + } else { + if (sVar1 == 0) { + iVar6 = yUnk + -0x53; + iVar9 = xUnk + -0x51; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + xUnk + -0x3a, yUnk + -0x60, (int)((int)(sVar1))); + } + } + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (iVar11 != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + if (iVar11 < 0x26) { + if (sVar1 == 0) { + iVar6 = yUnk + -0x55; + iVar9 = xUnk + -0x24; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + xUnk + -0x24, yUnk + -0x55, (int)((int)(sVar1))); + } + } else { + if (sVar1 == 0) { + iVar6 = yUnk + -0x4a; + iVar9 = xUnk + -0x37; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + xUnk + -0x24, yUnk + -0x55, (int)((int)(sVar1))); + } + } + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + if (iVar11 < 0x26) { + if (sVar1 == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, xUnk + -0xe, yUnk + -0x4a); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + xUnk + -0xe, yUnk + -0x4a, (int)((int)(sVar1))); + } + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + if (sVar1 == 0) { + iVar6 = yUnk + -0x49; + iVar9 = xUnk + -2; + iVar11 = 0x26; + gmID = OpenSHC::DE::SHCDE::GM_STABLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, 0x26, + xUnk + -0xd, yUnk + -0x49, (int)((int)(sVar1))); + } else { + if (sVar1 == 0) { + iVar6 = yUnk + -0x3f; + iVar9 = xUnk + -0x21; + gmID = OpenSHC::DE::SHCDE::GM_STABLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + xUnk + -0xe, yUnk + -0x4a, (int)((int)(sVar1))); + } + } + break; + case OpenSHC::Map::Buildings::BT_CHAPEL: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x7c; + iVar9 = xUnk + -0x26; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_CHURCH: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0x97; + iVar9 = xUnk + -9; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_CATHEDRAL: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + if (iVar11 != 0) { + iVar6 = yUnk + -0xca; + iVar9 = xUnk + -0xd; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_STONEKEEP: + if ((DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) + && (iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38, iVar11 != 0)) { + iVar6 = yUnk + -0x8f; + iVar9 = xUnk + -0x60; + gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_STRONGHOLD: + if ((DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) + && (iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38, iVar11 != 0)) { + iVar6 = yUnk + -0x12a; + iVar9 = xUnk + -0x9f; + gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_GATEHOUSELARGE: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -7, yUnk + -0xc1); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x60, yUnk + -0xc1); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 3, yUnk + -0x5b); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x33, yUnk + -0x5b); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_BODY_GATE, iVar11, xUnk + 0x11, yUnk + -0x5e); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (iVar11 != 0) { + iVar6 = yUnk + -0x5e; + iVar9 = xUnk + -0x56; + gmID = OpenSHC::DE::SHCDE::GM_BODY_GATE; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_GATEHOUSESMALL: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 5, yUnk + -0xb2); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x40, yUnk + -0xb1); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0xd, yUnk + -0x53); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x53); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_BODY_GATE, iVar11, xUnk, yUnk + -0x58); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (iVar11 != 0) { + iVar6 = yUnk + -0x58; + iVar9 = xUnk + -0x46; + gmID = OpenSHC::DE::SHCDE::GM_BODY_GATE; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_WOODGATE1: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 3, yUnk + -0x6e); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x20, yUnk + -0x6a); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x20, yUnk + -0x46); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 8, yUnk + -0x47); + } + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 0x11, yUnk + -0x37); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (iVar11 != 0) { + iVar6 = yUnk + -0x37; + iVar9 = xUnk + -0x15; + gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_DRAWBRIDGE: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 7, yUnk + -0x7c); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (iVar11 != 0) { + iVar6 = yUnk + -0x7e; + iVar9 = xUnk + -0x33; + gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_TOWER1: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x21, yUnk + -0x140); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (iVar11 != 0) { + iVar6 = yUnk + -0x17b; + iVar9 = xUnk + -0x22; + gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER2: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x30, yUnk + -0xc2); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x29, yUnk + -0x93); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (iVar11 != 0) { + iVar6 = yUnk + -0x8c; + iVar9 = xUnk + -2; + gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER3: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + /* + crenellations + */ + + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x3f, yUnk + -0xe1); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x29, yUnk + -0x96); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (iVar11 != 0) { + iVar6 = yUnk + -0x93; + iVar9 = xUnk + 0xd; + gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER4: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x4d, yUnk + -0xf6); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x39, yUnk + -0x9a); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 0xf, yUnk + -0x96); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (iVar11 != 0) { + /* + roof + */ + + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x4d, yUnk + -0x13b); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay; + if (iVar11 != 0) { + iVar6 = yUnk + -0x114; + iVar9 = xUnk + -0x4d; + gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER5: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x4c, yUnk + -0x104); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (iVar11 != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x32, yUnk + -0x9d); + } + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (iVar11 != 0) { + iVar6 = yUnk + -0x97; + iVar9 = xUnk + 0x10; + gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_CHOPPINGBLOCK: + iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_CHOPPING_BLOCK; + DAT_RenderedUnitOwner::instance = 0; + if (iVar11 != 0) { + iVar6 = yUnk + -0x4c; + iVar9 = xUnk + -0x23; + gmID = OpenSHC::DE::SHCDE::GM_ANIM_CHOPPING_BLOCK; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + break; + } + } + } + } + iVar11 = DAT_BuildingDefinedData::instance + .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]; + xUnk = 0; + yUnk = 0; + if (iVar11 == 0) { + uVar8 = DAT_BuildingsState::instance.buildings[tileIndex].widthOrHeight; + xUnk = uVar8 << 5; + yUnk = uVar8 << 4; + } + if (((((DAT_GameCore::instance.currentMenuViewType == OpenSHC::UI::Enums::MVT_BUILDING_AND_STATUS_MENU) + && (tileIndex == DAT_BuildingsState::instance.menuSelectedBuildingID)) + || ((tileIndex == DAT_BuildingsState::instance.field28_0x18e05c + && (DAT_BuildingsState::instance.field29_0x18e060 + == DAT_BuildingsState::instance.buildings[tileIndex].uid)))) + && (((((sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].maxHealth, + sVar1 != 0 + && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType + != OpenSHC::Map::Buildings::BT_MANORHOUSE)) + && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType + != OpenSHC::Map::Buildings::BT_STONEKEEP)) + && ((DAT_BuildingsState::instance.buildings[tileIndex].buildingType + != OpenSHC::Map::Buildings::BT_STRONGHOLD + && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType + != OpenSHC::Map::Buildings::BT_KEEPFOUR)))) + && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType + != OpenSHC::Map::Buildings::BT_KEEPFIVE)))) + && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType + != OpenSHC::Map::Buildings::BT_CAMPGROUND)) { + iVar6 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::computeHealthPercentage, + DAT_DirectionAlgorithmState::ptr)( + (int)DAT_BuildingsState::instance.buildings[tileIndex].currentHealth, (int)((int)(sVar1))); + switch (DAT_BuildingsState::instance.buildings[tileIndex].buildingType) { + case OpenSHC::Map::Buildings::BT_GATEHOUSELARGE: + yUnk = yUnk + 0x14; + break; + case OpenSHC::Map::Buildings::BT_GATEHOUSESMALL: + yUnk = yUnk + 0x1e; + break; + case OpenSHC::Map::Buildings::BT_SIEGETOWER_PLACED: + yUnk = yUnk + -0x1e; + break; + case OpenSHC::Map::Buildings::BT_TOWER2: + yUnk = yUnk + 0x50; + break; + case OpenSHC::Map::Buildings::BT_TOWER3: + case OpenSHC::Map::Buildings::BT_TOWER4: + yUnk = yUnk + 0x5a; + break; + case OpenSHC::Map::Buildings::BT_TOWER5: + yUnk = yUnk + 100; + } + if ((uint)(iVar6 / 10) < 0xb) { + BVar2 = DAT_BuildingsState::instance.buildings[tileIndex].buildingType; + if ((BVar2 == OpenSHC::Map::Buildings::BT_GRANARY) || (BVar2 == OpenSHC::Map::Buildings::BT_ARMORY)) { + iVar9 = 0; + piVar7 = &DAT_BuildingsState::instance.buildings[tileIndex].tileRef2; + do { + if (piVar7[-1] == param_4) + break; + if (*piVar7 == param_4) { + iVar9 = iVar9 + 1; + break; + } + if (piVar7[1] == param_4) { + iVar9 = iVar9 + 2; + break; + } + if (piVar7[2] == param_4) { + iVar9 = iVar9 + 3; + break; + } + iVar9 = iVar9 + 4; + piVar7 = piVar7 + 4; + } while (iVar9 < 0x10); + if (((DAT_TileMapState::instance.mapOrientation == 0) && (iVar9 == 0xf)) + || ((DAT_TileMapState::instance.mapOrientation == 2) && (iVar9 == 0xc)) + || ((DAT_TileMapState::instance.mapOrientation == 4) && (iVar9 == 0)) + || ((DAT_TileMapState::instance.mapOrientation == 6) && (iVar9 == 3))) { + iVar11 = (iVar5 - iVar11) - yUnk; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, iVar4 + 4, iVar11 + -0xc); + } + } else { + iVar11 = (iVar5 - iVar11) - yUnk; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, iVar4 + 4, iVar11 + -0xc); + } + } + } + if ((DAT_GameCore::instance.gameMode_2 != OpenSHC::Game::GM_BUILDERUnk) + || (DAT_MapPropertiesState::instance.SEC_U3_MapType2_1 != OpenSHC::Map::MT_SIEGE)) { + if (DAT_BuildingsState::instance.buildings[tileIndex].sleeping != false) { + uVar8 = DAT_TileMapState::instance.field161_0x5549c0 - 1U & 0x80000007; + if ((int)uVar8 < 0) { + uVar8 = (uVar8 - 1 | 0xfffffff8) + 1; + } + iVar11 = uVar8 + 0xd3; + maskGmID = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; + iVar9 = (iVar5 + - DAT_BuildingDefinedData::instance + .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) + - yUnk; + iVar6 = uVar8 + 0xcb; + GVar12 = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(GVar12, iVar6, iVar4 + -0x23, iVar9 + -0x2a, maskGmID, iVar11, 0); + } else if ((DAT_BuildingsState::instance.buildings[tileIndex].currentlyNeededEmployeeCount != 0) + && (DAT_GameCore::instance.field63_0x108 != 0)) { + iVar11 = DAT_TileMapState::instance.field161_0x5549c0 + 0x128; + maskGmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + iVar9 = (iVar5 + - DAT_BuildingDefinedData::instance + .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) + - yUnk; + iVar6 = DAT_TileMapState::instance.field161_0x5549c0 + 0x118; + GVar12 = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(GVar12, iVar6, iVar4 + -0x23, iVar9 + -0x2a, maskGmID, iVar11, 0); + } + } + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field68_0xc2; + if (sVar1 == 1) { + iVar11 = DAT_TileMapState::instance.field161_0x5549c0 + 0x10; + iVar6 = DAT_TileMapState::instance.field161_0x5549c0; + } else { + if (sVar1 != 2) { + return; + } + iVar11 = DAT_TileMapState::instance.field161_0x5549c0 + 0x84; + iVar6 = DAT_TileMapState::instance.field161_0x5549c0 + 0x74; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar6, iVar4 + -0x23, + ((iVar5 + - DAT_BuildingDefinedData::instance + .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) + - xUnk) + + -0x2a, + OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar11, 0); + DAT_BuildingsState::instance.buildings[tileIndex].field68_0xc2 = 0; + return; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 21d9febb6..09949b01d 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36503,7 +36503,7 @@ SHC_3BB0A8C1_0x004E3869 | 0.0% | Pending SHC_3BB0A8C1_0x004E3870 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E3980 | 0.0% | Pending +SHC_3BB0A8C1_0x004E3980 | 34.2% | reg alloc + tail merging SHC_3BB0A8C1_0x004E46C0 | 0.0% | Pending From d7ff5b1d959e13c6a0a2814857d4ede2e4f4ea0f Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 23:51:37 +0200 Subject: [PATCH 28/77] reimplement: SHC_3BB0A8C1_0x004E2AD0 45.52% reg alloc, type-load CSE --- .../renderGmOverlayBuilding2.cpp | 671 ++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 672 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp new file mode 100644 index 000000000..f3da9828c --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp @@ -0,0 +1,671 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/UI/Rendering/TextureRenderCore.func.hpp" +#include "OpenSHC/DE/SHCDE/eGM.hpp" +#include "OpenSHC/Game/GameMode2.hpp" +#include "OpenSHC/IO/Graphics/GmID.hpp" +#include "OpenSHC/Map/Buildings/Building.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" +#include "OpenSHC/Map/MapType2.hpp" +#include "OpenSHC/UI/Enums/MenuViewType.hpp" + +#include "OpenSHC/Globals/DAT_BuildingDefinedData.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_CurrentlyRenderedSpriteID.hpp" +#include "OpenSHC/Globals/DAT_GameCore.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_MapPropertiesState.hpp" +#include "OpenSHC/Globals/DAT_RenderedUnitOwner.hpp" +#include "OpenSHC/Globals/DAT_TextureRenderCoreObject.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::DE::SHCDE::eGM; + using OpenSHC::Game::GameMode2; + using OpenSHC::IO::Graphics::GmID; + using OpenSHC::Map::MapType2; + using OpenSHC::Map::Buildings::Building; + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeShort; + using OpenSHC::UI::Enums::MenuViewType; + + /* + 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 0x004E2AD0 + void ViewportRenderState::renderGmOverlayBuilding2(int buildingID, int screenX, int screenY, int tile) + + { + BuildingTypeShort buildingType; + uint animationTick; + int renderX; + int renderY; + int renderBaseY; + GmID gmID; + GmID maskGmID; + + int heightOffset = 0; + if (DAT_BuildingDefinedData::instance + .BuildingHeights[DAT_BuildingsState::instance.buildings[buildingID].buildingType] + == 0) { + heightOffset = DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight << 5; + } + if ((int)DAT_BuildingsState::instance.buildings[buildingID].widthOrHeight <= 2) { + int healthBarYOffset = 0; + short maxHealth; + if ((((DAT_GameCore::instance.currentMenuViewType == OpenSHC::UI::Enums::MVT_BUILDING_AND_STATUS_MENU) + && (buildingID == DAT_BuildingsState::instance.menuSelectedBuildingID)) + || ((buildingID == DAT_BuildingsState::instance.field28_0x18e05c + && (DAT_BuildingsState::instance.field29_0x18e060 + == DAT_BuildingsState::instance.buildings[buildingID].uid)))) + && (maxHealth = DAT_BuildingsState::instance.buildings[buildingID].maxHealth, maxHealth != 0)) { + if ((int)maxHealth == 0) { + renderY = 100; + } else { + renderY = (DAT_BuildingsState::instance.buildings[buildingID].currentHealth * 100) / (int)maxHealth; + } + buildingType = DAT_BuildingsState::instance.buildings[buildingID].buildingType; + if (buildingType == OpenSHC::Map::Buildings::BT_GALLOWS) { + healthBarYOffset = 0x50; + } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER1) { + healthBarYOffset = 0x1e; + } else if (buildingType == OpenSHC::Map::Buildings::BT_GIBBET) { + healthBarYOffset = 0x50; + } + if ((uint)(renderY / 10) < 0xb) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_FLOATS, renderY / 10 + 0x11, + screenX + 4, + ((screenY + - DAT_BuildingDefinedData::instance + .BuildingHeights[DAT_BuildingsState::instance.buildings[buildingID].buildingType]) + - healthBarYOffset) + + -0xc); + } + } + if ((DAT_GameCore::instance.gameMode_2 != OpenSHC::Game::GM_BUILDERUnk) + || (DAT_MapPropertiesState::instance.SEC_U3_MapType2_1 != OpenSHC::Map::MT_SIEGE)) { + if (DAT_BuildingsState::instance.buildings[buildingID].sleeping != false) { + animationTick = DAT_TileMapState::instance.field161_0x5549c0 - 1U & 0x80000007; + if ((int)animationTick < 0) { + animationTick = (animationTick - 1 | 0xfffffff8) + 1; + } + renderY = animationTick + 0xd3; + maskGmID = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; + renderBaseY + = (screenY + - DAT_BuildingDefinedData::instance + .BuildingHeights[DAT_BuildingsState::instance.buildings[buildingID].buildingType]) + - heightOffset; + renderX = animationTick + 0xcb; + gmID = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)( + gmID, renderX, screenX + -0x23, renderBaseY + -0x2a, maskGmID, renderY, 0); + } else { + if ((DAT_BuildingsState::instance.buildings[buildingID].currentlyNeededEmployeeCount != 0) + && (DAT_GameCore::instance.field63_0x108 != 0)) { + renderY = DAT_TileMapState::instance.field161_0x5549c0 + 0x128; + maskGmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + renderBaseY + = (screenY + - DAT_BuildingDefinedData::instance + .BuildingHeights[DAT_BuildingsState::instance.buildings[buildingID].buildingType]) + - heightOffset; + renderX = DAT_TileMapState::instance.field161_0x5549c0 + 0x118; + gmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)( + gmID, renderX, screenX + -0x23, renderBaseY + -0x2a, maskGmID, renderY, 0); + } + } + } + short bannerState = DAT_BuildingsState::instance.buildings[buildingID].field68_0xc2; + if (bannerState == 1) { + renderY = DAT_TileMapState::instance.field161_0x5549c0 + 0x10; + renderX = DAT_TileMapState::instance.field161_0x5549c0; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, renderX, screenX + -0x23, + ((screenY + - DAT_BuildingDefinedData::instance + .BuildingHeights[DAT_BuildingsState::instance.buildings[buildingID].buildingType]) + - heightOffset) + + -0x2a, + OpenSHC::IO::Graphics::GID_FLOATS_NEW, renderY, 0); + DAT_BuildingsState::instance.buildings[buildingID].field68_0xc2 = 0; + } else if (bannerState == 2) { + renderY = DAT_TileMapState::instance.field161_0x5549c0 + 0x84; + renderX = DAT_TileMapState::instance.field161_0x5549c0 + 0x74; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, renderX, screenX + -0x23, + ((screenY + - DAT_BuildingDefinedData::instance + .BuildingHeights[DAT_BuildingsState::instance.buildings[buildingID].buildingType]) + - heightOffset) + + -0x2a, + OpenSHC::IO::Graphics::GID_FLOATS_NEW, renderY, 0); + DAT_BuildingsState::instance.buildings[buildingID].field68_0xc2 = 0; + } + } + int frame; + if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { + switch (DAT_BuildingsState::instance.buildings[buildingID].buildingType) { + case OpenSHC::Map::Buildings::BT_GATEHOUSELARGE: + if ((DAT_BuildingsState::instance.buildings[buildingID].currentHealth * 5) + / (int)DAT_BuildingsState::instance.buildings[buildingID].maxHealth + != 5) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field33_0x6c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x4f, screenY + -0x4c); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field34_0x70; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x24, screenY + -0x66); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field35_0x74; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x2b, screenY + -0x29); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field36_0x78; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x40, screenY + -0x76); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field37_0x7c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x24, screenY + -0x66); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].ownerFlagFrame; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x35, screenY + -0x3b); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field39_0x84; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x48, screenY + -0x57); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field40_0x88; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x4f, screenY + -0x73); + } + } + break; + case OpenSHC::Map::Buildings::BT_GATEHOUSESMALL: + if ((DAT_BuildingsState::instance.buildings[buildingID].currentHealth * 5) + / (int)DAT_BuildingsState::instance.buildings[buildingID].maxHealth + != 5) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field33_0x6c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x14, screenY + -0x58); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field34_0x70; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x2f, screenY + -0x54); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field35_0x74; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x11, screenY + -0x20); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field36_0x78; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x17, screenY + -0x67); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field37_0x7c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0xf, screenY + -0x27); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].ownerFlagFrame; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x38, screenY + -0x2d); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field39_0x84; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x19, screenY + -0x4c); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field40_0x88; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x3a, screenY + -0x7c); + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER1: + if ((DAT_BuildingsState::instance.buildings[buildingID].currentHealth * 5) + / (int)DAT_BuildingsState::instance.buildings[buildingID].maxHealth + != 5) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field33_0x6c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0xf, screenY + -0x42); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field34_0x70; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0xd, screenY + -0xb2); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field35_0x74; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -9, screenY + -0xfc); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field36_0x78; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX, screenY + -0x6c); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field37_0x7c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0xd, screenY + -0xbd); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].ownerFlagFrame; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0xf, screenY + -0xd9); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field39_0x84; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 8, screenY + -0x31); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field40_0x88; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0xb, screenY + -0x5a); + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER2: + if ((DAT_BuildingsState::instance.buildings[buildingID].currentHealth * 5) + / (int)DAT_BuildingsState::instance.buildings[buildingID].maxHealth + != 5) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field33_0x6c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -9, screenY + -0x3b); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field34_0x70; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x31, screenY + -0x2d); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field35_0x74; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x2b, screenY + -0x24); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field36_0x78; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x19, screenY + -0x45); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field37_0x7c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x26, screenY + -0x55); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].ownerFlagFrame; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x16, screenY + -0x24); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field39_0x84; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x10, screenY + -0x16); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field40_0x88; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x32, screenY + -0x5e); + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER3: + if ((DAT_BuildingsState::instance.buildings[buildingID].currentHealth * 5) + / (int)DAT_BuildingsState::instance.buildings[buildingID].maxHealth + != 5) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field33_0x6c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x39, screenY + -0x60); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field34_0x70; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x13, screenY + -0x16); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field35_0x74; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x23, screenY + -0x83); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field36_0x78; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x19, screenY + -0x81); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field37_0x7c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x31, screenY + -0x2f); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].ownerFlagFrame; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x2e, screenY + -0x60); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field39_0x84; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x10, screenY + -0x6a); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field40_0x88; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x20, screenY + -0x5b); + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER4: + if ((DAT_BuildingsState::instance.buildings[buildingID].currentHealth * 5) + / (int)DAT_BuildingsState::instance.buildings[buildingID].maxHealth + != 5) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field33_0x6c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x41, screenY + -0x9f); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field34_0x70; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x25, screenY + -0x61); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field35_0x74; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x4b, screenY + -0x41); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field36_0x78; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x41, screenY + -0x45); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field37_0x7c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x26, screenY + -0x73); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].ownerFlagFrame; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x13, screenY + -0x3b); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field39_0x84; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x36, screenY + -0x8b); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field40_0x88; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x42, screenY + -0x6e); + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER5: + if ((DAT_BuildingsState::instance.buildings[buildingID].currentHealth * 5) + / (int)DAT_BuildingsState::instance.buildings[buildingID].maxHealth + != 5) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field33_0x6c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x33, screenY + -0x7f); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field34_0x70; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 4, screenY + -0x5b); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field35_0x74; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x29, screenY + -0x7a); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field36_0x78; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x21, screenY + -0x45); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field37_0x7c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x28, screenY + -0x59); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].ownerFlagFrame; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x16, screenY + -0x37); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field39_0x84; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + -0x16, screenY + -0x84); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field40_0x88; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CRACKS, frame, screenX + 0x3a, screenY + -0x42); + } + } + } + } + if ((DAT_BuildingsState::instance.buildings[buildingID].displayOwnerFlag != 0) + && (DAT_BuildingsState::instance.buildings[buildingID].buildingType + == OpenSHC::Map::Buildings::BT_OXTETHER)) { + DAT_RenderedUnitOwner::instance = DAT_BuildingsState::instance.buildings[buildingID].playerColorUnk; + frame = DAT_BuildingsState::instance.buildings[buildingID].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, screenX + -0x1e, screenY + -0x43); + } + } + if (DAT_BuildingsState::instance.buildings[buildingID].renderAnimation == 0) { + return; + } + if (DAT_BuildingsState::instance.buildings[buildingID].animationFrame == 0) { + return; + } + if (DAT_TileMapState::instance.field93_0x5548c8 != 0) { + return; + } + DAT_CurrentlyRenderedSpriteID::instance = (GmID)DAT_BuildingsState::instance.buildings[buildingID].spriteID2; + buildingType = DAT_BuildingsState::instance.buildings[buildingID].buildingType; + DAT_RenderedUnitOwner::instance = 0; + if (((buildingType == OpenSHC::Map::Buildings::BT_KILLINGPIT) + && (DAT_BuildingsState::instance.buildings[buildingID].owner + != DAT_GameSynchronyState::instance.currentPlayerSlotID)) + && (DAT_BuildingsState::instance.buildings[buildingID].state < 1)) { + DAT_RenderedUnitOwner::instance = 0; + return; + } + if ((buildingType == OpenSHC::Map::Buildings::BT_DRAWBRIDGE) + && (MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::temporarySaveMapSurfaceHeightRangeUnk, + DAT_TextureRenderCoreObject::ptr)(), + DAT_BuildingsState::instance.buildings[buildingID].drawBridgeState1 == 0)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::setMapSurfaceHeightRange, + DAT_TextureRenderCoreObject::ptr)(screenY - 0x17U & ((int)(screenY - 0x17U) < 0) - 1, 0x81c); + } + frame = 0; + buildingType = DAT_BuildingsState::instance.buildings[buildingID].buildingType; + if (buildingType == OpenSHC::Map::Buildings::BT_TOWER2) { + if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x24, screenY + -0x78); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; + renderY = screenY + -0x71; + renderX = screenX + 0x20; + gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; + } + } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER3) { + if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x24, screenY + -0x77); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; + renderY = screenY + -0x77; + renderX = screenX + 0x2e; + gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; + } + } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER4) { + if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x34, screenY + -0x82); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; + renderY = screenY + -0x7d; + renderX = screenX + 0x30; + gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; + } + } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER5) { + if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x33, screenY + -0x82); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; + renderY = screenY + -0x7c; + renderX = screenX + 0x31; + gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; + } + } else { + DAT_RenderedUnitOwner::instance = DAT_BuildingsState::instance.buildings[buildingID].playerColorUnk; + short blendStrength = DAT_BuildingsState::instance.buildings[buildingID].field66_0xbe; + DAT_CurrentlyRenderedSpriteID::instance + = (GmID)DAT_BuildingsState::instance.buildings[buildingID].spriteID2; + if (blendStrength != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, + DAT_BuildingsState::instance.buildings[buildingID].animationFrame, + DAT_BuildingsState::instance.buildings[buildingID].spriteOffetX + screenX, + DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY, + (int)((int)(blendStrength))); + } else { + renderY = DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY; + frame = DAT_BuildingsState::instance.buildings[buildingID].animationFrame; + renderX = DAT_BuildingsState::instance.buildings[buildingID].spriteOffetX + screenX; + gmID = (GmID)DAT_CurrentlyRenderedSpriteID::instance; + } + } + if (frame != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)((eGM)gmID, frame, renderX, renderY); + } + if (DAT_BuildingsState::instance.buildings[buildingID].buildingType == OpenSHC::Map::Buildings::BT_DRAWBRIDGE) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::restoreMapSurfaceHeightRangeFromTemporaryUnk, + DAT_TextureRenderCoreObject::ptr)(); + } + return; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 09949b01d..9f13d07ac 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36415,7 +36415,7 @@ SHC_3BB0A8C1_0x004E2AC0 | 0.0% | Pending SHC_3BB0A8C1_0x004E2AC4 | 0.0% | Pending -SHC_3BB0A8C1_0x004E2AD0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E2AD0 | 45.5% | reg alloc, type-load CSE SHC_3BB0A8C1_0x004E3828 | 0.0% | Pending From 2b4d4c1322d0828fc2100e60a4eb4bb9c079af34 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 23:51:37 +0200 Subject: [PATCH 29/77] reimplement: SHC_3BB0A8C1_0x004E8CF0 29.44% frame slot allocation differs --- .../ViewportRenderState/renderMap.cpp | 2830 +++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2831 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp new file mode 100644 index 000000000..9664ef606 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp @@ -0,0 +1,2830 @@ +#include "OpenSHC/Audio/SFX/SFXState.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingsState.func.hpp" +#include "OpenSHC/Map/LandscapeState.func.hpp" +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Map/TileMapState.func.hpp" +#include "OpenSHC/Map/Units/UnitsState.func.hpp" +#include "OpenSHC/Rendering.func.hpp" +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/Text/TextManager.func.hpp" +#include "OpenSHC/UI/Rendering.func.hpp" +#include "OpenSHC/UI/Rendering/PencilRenderCore.func.hpp" +#include "OpenSHC/UI/Rendering/TextureRenderCore.func.hpp" +#include "OpenSHC/DE/SHCDE/eGM.hpp" +#include "OpenSHC/Game/GameMode.hpp" +#include "OpenSHC/Game/GameMode2.hpp" +#include "OpenSHC/IO/Graphics/GmID.hpp" +#include "OpenSHC/IO/Graphics/GmIDInt.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" +#include "OpenSHC/Map/Entities/EntityType.hpp" +#include "OpenSHC/Map/Entities/EntityTypeShort.hpp" +#include "OpenSHC/Map/Units/States/UnitState.hpp" +#include "OpenSHC/Map/Units/States/UnitStateShort.hpp" +#include "OpenSHC/Map/Units/UnitLogicState.hpp" +#include "OpenSHC/Map/Units/UnitType.hpp" +#include "OpenSHC/Map/Units/UnitTypeShort.hpp" +#include "OpenSHC/Rendering/Enums/RenderTarget.hpp" +#include "OpenSHC/Rendering/ScreenResolutionEnum.hpp" +#include "OpenSHC/Text/TextAlignment.hpp" +#include "OpenSHC/UI/Enums/BuildingsAndStatusMenuTabType.hpp" +#include "OpenSHC/UI/Enums/MenuModalType.hpp" +#include "OpenSHC/WindowsHelper/Enums/BOOLEnum.hpp" + +#include "OpenSHC/Globals/COL_BLACK.hpp" +#include "OpenSHC/Globals/COL_MAGENTA.hpp" +#include "OpenSHC/Globals/DAT_00ed3148.hpp" +#include "OpenSHC/Globals/DAT_00ed314c.hpp" +#include "OpenSHC/Globals/DAT_00ed3154.hpp" +#include "OpenSHC/Globals/DAT_00ed316c.hpp" +#include "OpenSHC/Globals/DAT_00ed3170.hpp" +#include "OpenSHC/Globals/DAT_00ed317c.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_CurrentlyRenderedSpriteID.hpp" +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_EntityState.hpp" +#include "OpenSHC/Globals/DAT_GMImageHeaders.hpp" +#include "OpenSHC/Globals/DAT_GMImageOffsets.hpp" +#include "OpenSHC/Globals/DAT_GMImageSizes.hpp" +#include "OpenSHC/Globals/DAT_GameCore.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_GmImageAddressToBeRendered.hpp" +#include "OpenSHC/Globals/DAT_LandscapeState.hpp" +#include "OpenSHC/Globals/DAT_MapRenderDefinedData.hpp" +#include "OpenSHC/Globals/DAT_MenuModalComposition1.hpp" +#include "OpenSHC/Globals/DAT_MouseState.hpp" +#include "OpenSHC/Globals/DAT_PencilRenderCore.hpp" +#include "OpenSHC/Globals/DAT_RenderMap_DrawSomeX.hpp" +#include "OpenSHC/Globals/DAT_RenderMap_DrawSomeY.hpp" +#include "OpenSHC/Globals/DAT_RenderMap_ImageID.hpp" +#include "OpenSHC/Globals/DAT_RenderMap_YOffset.hpp" +#include "OpenSHC/Globals/DAT_RenderedUnitOwner.hpp" +#include "OpenSHC/Globals/DAT_SFXState.hpp" +#include "OpenSHC/Globals/DAT_TextManagerObject.hpp" +#include "OpenSHC/Globals/DAT_TextureRenderCoreObject.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/DAT_WindowAndDirectDraw.hpp" +#include "OpenSHC/Globals/GMTotalPicturesProcessed.hpp" +#include "OpenSHC/Globals/INT_00ed315c.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::DE::SHCDE::eGM; + using OpenSHC::Game::GameMode; + using OpenSHC::Game::GameMode2; + using OpenSHC::IO::Graphics::GmID; + using OpenSHC::IO::Graphics::GmIDInt; + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeShort; + using OpenSHC::Map::Entities::EntityType; + using OpenSHC::Map::Entities::EntityTypeShort; + using OpenSHC::Map::Units::UnitLogicState; + using OpenSHC::Map::Units::UnitType; + using OpenSHC::Map::Units::UnitTypeShort; + using OpenSHC::Map::Units::States::UnitState; + using OpenSHC::Map::Units::States::UnitStateShort; + using OpenSHC::Rendering::ScreenResolutionEnum; + using OpenSHC::Rendering::Enums::RenderTarget; + using OpenSHC::Text::TextAlignment; + using OpenSHC::UI::Enums::BuildingsAndStatusMenuTabType; + using OpenSHC::UI::Enums::MenuModalType; + using OpenSHC::WindowsHelper::Enums::BOOLEnum; + + /* + WARNING: Restarted to delay deadcode elimination for space: ram + */ + + /* + 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 0x004E8CF0 + void ViewportRenderState::renderMap() + + { + ushort* puVar1; + int iVar2; + EntityTypeShort EVar3; + UnitStateShort UVar4; + short sVar5; + short sVar6; + UnitTypeShort UVar7; + BuildingTypeShort BVar8; + ushort uVar9; + ushort uVar10; + GmID GVar11; + bool bVar12; + bool bVar13; + bool bVar14; + byte bVar15; + int iVar16; + short* psVar17; + int iVar18; + byte bVar19; + short sVar20; + int _visualTileOffset; + int* piVar21; + uint uVar22; + int iVar23; + int _numberToDisplay; + short sVar24; + int iVar25; + int iVar26; + int iVar27; + int iVar28; + uint uVar29; + short sVar30; + int iVar31; + uint uVar32; + int local_60; + int local_5c; + uint local_58; + uint local_54; + int _vpWidthPlus1_1; + int local_48; + uint _displayLayerLogicalValue; + int _zoomOffset; + int local_2c; + int local_24; + int* local_20; + int local_1c; + int local_14; + uint local_c; + int local_8; + int _vpWidthPlus1; + int _tile; + int tileIndex; + int _yOffset_01; + bool _flatView; + int _viewportHeight; + int viewportWidth; + + iVar31 = 0; + iVar28 = 0; + _displayLayerLogicalValue = 0; + local_1c = 0; + local_5c = 600; + _flatView = false; + local_8 = 0; + _zoomOffset = 0; + uVar9 = 0; + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x768) { + local_5c = 768; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x1024) { + local_5c = 1024; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1600x1200) { + local_5c = 1200; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x720) { + local_5c = 720; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1440x900) { + local_5c = 900; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1920x1080) { + local_5c = 1080; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1920x1200) { + local_5c = 1200; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1440) { + local_5c = 1440; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1600) { + local_5c = 1600; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1366x768) { + local_5c = 768; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1680x1050) { + local_5c = 1050; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1600x900) { + local_5c = 900; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1360x768) { + local_5c = 768; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x600) { + local_5c = 600; + } + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::updateWaterAnimationFrames, this)(); + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::assignRandomTiles, this)(); + viewportWidth = this->viewportState.viewportWidth; + _viewportHeight = this->viewportState.viewportHeight; + if ((DAT_TileMapState::instance.flatViewToggleValue1 != 0) + && (DAT_TileMapState::instance.flatViewToggleValue2 != 0)) { + _flatView = true; + } + if (this->viewportState.isZoomedOutUnk != 0) { + iVar28 = 4; + _zoomOffset = 4; + } + _vpWidthPlus1_1 = this->viewportState.viewportHeight + 1; + this->viewportState.unknownScreenXRelated = iVar28 * 32 + 70; + iVar28 = this->viewportState.viewportWidth + 0x2a; + DAT_RenderMap_DrawSomeY::instance = 8; + if (DAT_TileMapState::instance.mapOrientation == 0) { + LAB_004e8e99: + _visualTileOffset = 8; + } else if (DAT_TileMapState::instance.mapOrientation == 6) { + _visualTileOffset = 80408; + } else if (DAT_TileMapState::instance.mapOrientation == 4) { + _visualTileOffset = 160808; + } else { + _visualTileOffset = 241208; + if (DAT_TileMapState::instance.mapOrientation != 2) + goto LAB_004e8e99; + } + if (this->viewportState.field37_0x94 != 0) { + if (this->viewportState.isZoomedOutUnk == 0) { + iVar31 = 64; + local_1c = 8; + } else { + iVar31 = 128; + local_1c = 0x10; + } + DAT_RenderMap_DrawSomeY::instance = iVar31 + 8; + } + _yOffset_01 + = (int)(this->viewportState.viewportY + iVar31 + (this->viewportState.viewportY + iVar31 >> 0x1f & 0xfU)) + >> 4; + iVar16 = ((int)(this->viewportState.viewportX + (this->viewportState.viewportX >> 0x1f & 0x1fU)) >> 5) + + _visualTileOffset; + /* + *** + This piece of logic together with the huge array in the ViewportState gets + the tile the top left corner of the screen is showing, offset by some margin + to the right, not sure why that applies + *** + */ + + iVar2 = iVar16 + -2 + _yOffset_01 * 401; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::resetBatchedRender, this)(); + if (DAT_TileMapState::instance.mapOrientation == 6) { + iVar26 = -this->viewportState.someYOffset; + iVar23 = this->viewportState.someXOffset; + } else if (DAT_TileMapState::instance.mapOrientation == 4) { + iVar23 = -this->viewportState.someYOffset; + iVar26 = -this->viewportState.someXOffset; + } else { + iVar23 = this->viewportState.someYOffset; + iVar26 = this->viewportState.someXOffset; + if (DAT_TileMapState::instance.mapOrientation == 2) { + iVar23 = -this->viewportState.someXOffset; + iVar26 = this->viewportState.someYOffset; + } + } + this->viewportState.tileCenterX = iVar23 + + (this->screenPointToTileNumber[_yOffset_01 * 0x191 + iVar16 + -8] + - this + ->translationMatrix[this->tileTranslationMatrix_YComponent[this + ->screenPointToTileNumber[_yOffset_01 * 0x191 + iVar16 + -8]]] + .addXgetTile); + this->viewportState.tileCenterY = iVar26 + + this->tileTranslationMatrix_YComponent[this->screenPointToTileNumber[_yOffset_01 * 0x191 + iVar16 + -8]]; + DAT_TextureRenderCoreObject::instance.isZoom2 = this->viewportState.isZoomedOutUnk; + if (this->viewportState.isZoomedOutUnk == 0) { + iVar16 = DAT_WindowAndDirectDraw::instance.resolutionY + 0x18; + } else { + iVar16 = DAT_WindowAndDirectDraw::instance.resolutionY * 2 + 0x20; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::setMapSurfaceHeightRange, + DAT_TextureRenderCoreObject::ptr)(iVar31, iVar16); + this->viewportState.ptrColor = (undefined4)(DAT_WindowAndDirectDraw::instance.surfacePointer_mapGame + + this->viewportState.currentCameraOffsetX + DAT_MouseState::instance.screenSpaceX + + (this->viewportState.currentCameraOffsetY + DAT_MouseState::instance.screenSpaceY) * 0xfd8); + this->viewportState.mouseRayBuildingID = 0; + this->viewportState.mouseRayUnitID = 0; + DAT_TextureRenderCoreObject::instance.drawBufferChoiceValue = OpenSHC::Rendering::Enums::RT_MAP_GAME; + iVar31 = 1; + if (1 < (int)DAT_UnitsState::instance.maxUnitCount) { + psVar17 = &DAT_UnitsState::instance.units[1].drawX; + do { + if (psVar17[0x3c] != OpenSHC::Map::Units::ULS_INVISIBLE) { + *psVar17 = 0; + psVar17[1] = 0; + psVar17[2] = 0; + psVar17[3] = 0; + } + iVar31 = iVar31 + 1; + psVar17 = psVar17 + 0x248; + } while (iVar31 < (int)DAT_UnitsState::instance.maxUnitCount); + } + iVar31 = 1; + if (1 < DAT_BuildingsState::instance.maxBuildingsCount) { + psVar17 = &DAT_BuildingsState::instance.buildings[1].surfaceAreaUnk; + do { + *psVar17 = 0; + iVar31 = iVar31 + 1; + psVar17 = psVar17 + 0x196; + } while (iVar31 < DAT_BuildingsState::instance.maxBuildingsCount); + } + while ((local_1c < iVar28 + && ((MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderUnits, this)(), + local_1c < viewportWidth + || ((DAT_TileMapState::instance.LogicLayer[this->screenPointToTileNumber[_zoomOffset + iVar2]] + & 0x30) + == 0))))) { + _vpWidthPlus1 = _viewportHeight + 1; + DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated; + iVar31 = _zoomOffset; + if (_vpWidthPlus1_1 == _vpWidthPlus1) { + DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated + 0x10; + _vpWidthPlus1 = _viewportHeight; + } + for (; iVar31 < _vpWidthPlus1; iVar31 = iVar31 + 1) { + iVar16 = this->screenPointToTileNumber[iVar31 + iVar2 + -8]; + DAT_00ed3148::instance = DAT_TileMapState::instance.LogicLayer[iVar16]; + if ((DAT_00ed3148::instance & 0x30) == 0) { + /* + draw every tile + */ + + DAT_GmImageAddressToBeRendered::instance = (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + if ((iVar31 < 2) || (bVar13 = true, _vpWidthPlus1 + -2 <= iVar31)) { + bVar13 = false; + } + if (this->DAT_MapEditorDisplayLayer != 0) { + if (this->DAT_MapEditorDisplayLayer == 1) { + _displayLayerLogicalValue + = (uint)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar16]; + } else if (this->DAT_MapEditorDisplayLayer == 2) { + _displayLayerLogicalValue = (uint)(char)DAT_TileMapState::instance.PathLinkageLayer[iVar16]; + } + if (_displayLayerLogicalValue != 0) { + if (this->DAT_MapEditorDisplayLayer == 2) { + _displayLayerLogicalValue = 0xff - (_displayLayerLogicalValue & 0xff); + if (DAT_TileMapState::instance.mapOrientation == 2) { + _yOffset_01 = 6; + LAB_004e91cc: + bVar15 = MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::rotateByteLeft, + DAT_DirectionAlgorithmState::ptr)((byte)_displayLayerLogicalValue, _yOffset_01); + _displayLayerLogicalValue = (uint)bVar15; + } else { + if (DAT_TileMapState::instance.mapOrientation == 4) { + _yOffset_01 = 4; + goto LAB_004e91cc; + } + if (DAT_TileMapState::instance.mapOrientation == 6) { + _yOffset_01 = 2; + goto LAB_004e91cc; + } + } + if (0xff < (int)_displayLayerLogicalValue) { + _displayLayerLogicalValue = _displayLayerLogicalValue - 0x100; + } + DAT_GmImageAddressToBeRendered::instance + = GMTotalPicturesProcessed::instance[0x26] + 0x40 + _displayLayerLogicalValue; + } else { + _displayLayerLogicalValue = _displayLayerLogicalValue & 0x3f; + DAT_GmImageAddressToBeRendered::instance + = GMTotalPicturesProcessed::instance[0x26] + _displayLayerLogicalValue; + } + } + } + _yOffset_01 = GMTotalPicturesProcessed::instance[0x9d]; + local_58 = (uint)DAT_TileMapState::instance.EntityLayer[iVar16]; + iVar23 = (int)DAT_TileMapState::instance.OrganismLayer[iVar16]; + local_2c = 0; + DAT_00ed3154::instance = 0; + if ((DAT_00ed3148::instance & 0xa0108001) == 0) { + LAB_004e97e2: + uVar32 = (uint)DAT_TileMapState::instance.HeightLayer[iVar16]; + if (((DAT_00ed3148::instance & 0x200) != 0) + && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x3c0) != 0)) { + uVar32 = uVar32 - 8; + } + DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance.heightBasedScreenYOffset[uVar32]; + if (((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) == 0) + || (DAT_TileMapState::instance.field93_0x5548c8 != 0)) { + DAT_00ed3154::instance = 0; + } else { + DAT_00ed3154::instance = 0x5a; + } + DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[iVar16]; + } else if ((DAT_00ed3148::instance & 1) == 0) { + if ((DAT_00ed3148::instance & 0x100000) == 0) { + if (DAT_00ed3148::instance != 0xa0008000) + goto LAB_004e97e2; + DAT_RenderMap_YOffset::instance + = DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar16]]; + DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[iVar16]; + bVar15 = (byte)DAT_TileMapState::instance.RandomLayer[iVar16]; + bVar19 = bVar15 & 7; + if (this->field55_0x18b764 != 0) { + DAT_TileMapState::instance.WallGFXLayer[iVar16] + = DAT_TileMapState::instance.WallGFXLayer[iVar16] + 1; + } + DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16]; + if ((bVar15 & 7) == 0) { + if (511 < DAT_00ed314c::instance) { + DAT_TileMapState::instance.WallGFXLayer[iVar16] = 0; + DAT_00ed314c::instance = 0; + } + DAT_GmImageAddressToBeRendered::instance + = (int)(char) + DAT_MapRenderDefinedData::instance.field615_0x724[DAT_00ed314c::instance] + + (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + } else { + if (bVar19 == 1) { + if (0x1fe < DAT_00ed314c::instance) { + DAT_TileMapState::instance.WallGFXLayer[iVar16] = 0; + DAT_00ed314c::instance = 0; + } + bVar15 = DAT_MapRenderDefinedData::instance.field616_0x924[DAT_00ed314c::instance]; + } else { + if ((bVar19 != 4) && (bVar19 != 5)) { + if (0x7e < DAT_00ed314c::instance) { + DAT_TileMapState::instance.WallGFXLayer[iVar16] = 0; + DAT_00ed314c::instance = 0; + } + DAT_GmImageAddressToBeRendered::instance + = (int)(char)DAT_MapRenderDefinedData::instance + .field617_0xb24[DAT_00ed314c::instance] + + (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + goto LAB_004e9845; + } + if (0xfe < DAT_00ed314c::instance) { + DAT_TileMapState::instance.WallGFXLayer[iVar16] = 0; + DAT_00ed314c::instance = 0; + } + bVar15 = DAT_MapRenderDefinedData::instance.field617_0xb24[DAT_00ed314c::instance]; + } + DAT_GmImageAddressToBeRendered::instance + = (int)(char)bVar15 + (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + } + } else { + DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[iVar16]; + DAT_RenderMap_YOffset::instance + = DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar16]]; + bVar15 = DAT_TileMapState::instance.Logic2Layer[iVar16]; + if ((bVar15 & 200) == 0) { + if ((bVar15 & 7) == 0) { + if ((bVar15 & 0x10) == 0) { + if ((bVar15 & 0x20) != 0) { + bVar15 = (byte)DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; + DAT_00ed314c::instance + = (uint)(DAT_TileMapState::instance.WallGFXLayer[iVar16] >> 10) + + this->unknownCounterUntil_0x10 / 2; + uVar32 = DAT_00ed314c::instance & 0x80000007; + if ((int)uVar32 < 0) { + uVar32 = (uVar32 - 1 | 0xfffffff8) + 1; + } + DAT_GmImageAddressToBeRendered::instance + = uVar32 + DAT_TileMapState::instance.GfxLayer[iVar16]; + goto LAB_004e96a7; + } + } else { + DAT_00ed3154::instance + = -(uint)((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) != 0) + & 0x5a; + DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16] + + this->unknownCounterUntil_0x10; + uVar32 = DAT_00ed314c::instance & 0x8000000f; + if ((int)uVar32 < 0) { + uVar32 = (uVar32 - 1 | 0xfffffff0) + 1; + } + DAT_GmImageAddressToBeRendered::instance + = uVar32 + DAT_TileMapState::instance.GfxLayer[iVar16]; + } + } else { + bVar15 = (byte)DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; + DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16] + + this->unknownCounterUntil_0x10 / 2; + uVar32 = DAT_00ed314c::instance & 0x80000007; + if ((int)uVar32 < 0) { + uVar32 = (uVar32 - 1 | 0xfffffff8) + 1; + } + DAT_GmImageAddressToBeRendered::instance + = uVar32 + DAT_TileMapState::instance.GfxLayer[iVar16]; + LAB_004e96a7: + DAT_00ed3154::instance = -(uint)((bVar15 & 0x20) != 0) & 0x5a; + } + } else { + DAT_00ed3154::instance + = -(uint)((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) != 0) & 0x5a; + DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16] + + this->unknownCounterUntil_0x10; + uVar32 = DAT_00ed314c::instance & 0x8000000f; + if ((int)uVar32 < 0) { + uVar32 = (uVar32 - 1 | 0xfffffff0) + 1; + } + DAT_GmImageAddressToBeRendered::instance + = uVar32 + DAT_TileMapState::instance.GfxLayer[iVar16]; + } + MACRO_CALL_MEMBER( + OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(7); + _yOffset_01 = GMTotalPicturesProcessed::instance[0x9d]; + } + } else { + uVar32 = (uint)(short)DAT_TileMapState::instance.RandomLayer[iVar16]; + INT_00ed315c::instance = uVar32 & 0x7f; + DAT_00ed314c::instance = uVar32 & 0xf; + DAT_RenderMap_YOffset::instance = 0; + DAT_00ed3170::instance = 8; + if ((DAT_TileMapState::instance.Logic2Layer[iVar16] & 8) == 0) { + uVar10 = DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; + if ((char)uVar10 < '\0') { + DAT_GmImageAddressToBeRendered::instance + = (uint)DAT_TileMapState::instance.GfxLayer[iVar16] + + DAT_MapRenderDefinedData::instance.field205_0x4dc + [(int)(this->unknownCounterUntil_0x24 + DAT_00ed314c::instance / 2) % 0xc]; + } else if ((uVar10 & 0x40) == 0) { + if ((uVar10 & 0x100) == 0) { + if ((uVar10 & 0x200) == 0) { + DAT_00ed314c::instance = uVar32 & 7; + piVar21 = this->landscapeSeaWhiteCapsAnimationFrames; + _yOffset_01 = 9; + do { + if (iVar16 == piVar21[-60]) { + local_2c = *piVar21 + 1 + (uVar32 & 3) * 8; + } + if (iVar16 == piVar21[-0x3b]) { + local_2c = piVar21[1] + 1 + (uVar32 & 3) * 8; + } + if (iVar16 == piVar21[-0x3a]) { + local_2c = piVar21[2] + 1 + (uVar32 & 3) * 8; + } + if (iVar16 == piVar21[-0x39]) { + local_2c = piVar21[3] + 1 + (uVar32 & 3) * 8; + } + if (iVar16 == piVar21[-0x38]) { + local_2c = piVar21[4] + 1 + (uVar32 & 3) * 8; + } + piVar21 = piVar21 + 5; + _yOffset_01 = _yOffset_01 + -1; + } while (_yOffset_01 != 0); + } + } else { + DAT_GmImageAddressToBeRendered::instance + = (uint)DAT_TileMapState::instance.GfxLayer[iVar16] + + DAT_MapRenderDefinedData::instance + .field614_0x6a4[this->unknownCounterUntil_0x20] + * 0x22; + } + } else { + uVar32 = (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + if (uVar32 == GMTotalPicturesProcessed::instance[0xa6] + 0x5dcU) { + uVar29 = this->unknownCounterUntil_0x24 + INT_00ed315c::instance & 0x8000001f; + if ((int)uVar29 < 0) { + uVar29 = (uVar29 - 1 | 0xffffffe0) + 1; + } + _yOffset_01 = (int)uVar29 / 6 + ((int)uVar29 >> 0x1f); + if ((int)uVar29 < 0x12) { + DAT_GmImageAddressToBeRendered::instance + = uVar32 + (_yOffset_01 - ((int)uVar29 >> 0x1f)) * -6 + uVar29; + } else { + LAB_004e941f: + _yOffset_01 = (_yOffset_01 >> 1) - (_yOffset_01 >> 0x1f); + LAB_004e9428: + DAT_GmImageAddressToBeRendered::instance + = *(int*)((int)DAT_MapRenderDefinedData::ptr + + (uVar29 + _yOffset_01 * -0xc) * 4 + 0x4dc) + + 0x5d0 + GMTotalPicturesProcessed::instance[0xa6]; + } + } else if (uVar32 == GMTotalPicturesProcessed::instance[0xa6] + 0x5e2U) { + uVar29 = this->unknownCounterUntil_0x24 + INT_00ed315c::instance & 0x8000001f; + if ((int)uVar29 < 0) { + uVar29 = (uVar29 - 1 | 0xffffffe0) + 1; + } + _yOffset_01 = (int)uVar29 / 0xc; + if (0x11 < (int)uVar29) + goto LAB_004e9428; + DAT_GmImageAddressToBeRendered::instance = uVar32 + _yOffset_01 * -0xc + uVar29; + } else if (uVar32 == GMTotalPicturesProcessed::instance[0xa6] + 0x5eeU) { + uVar29 = this->unknownCounterUntil_0x24 + INT_00ed315c::instance & 0x8000001f; + if ((int)uVar29 < 0) { + uVar29 = (uVar29 - 1 | 0xffffffe0) + 1; + } + if (0x11 < (int)uVar29) { + _yOffset_01 = (int)uVar29 / 6 + ((int)uVar29 >> 0x1f); + goto LAB_004e941f; + } + DAT_GmImageAddressToBeRendered::instance + = uVar32 + ((int)uVar29 / 0x12) * -0x12 + uVar29; + } + } + } else { + DAT_00ed3154::instance + = -(uint)((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) != 0) & 0x5a; + DAT_00ed314c::instance = this->unknownCounterUntil_0x10 + DAT_00ed314c::instance; + if (0xf < (int)DAT_00ed314c::instance) { + DAT_00ed314c::instance = DAT_00ed314c::instance - 0x10; + } + DAT_GmImageAddressToBeRendered::instance + = DAT_TileMapState::instance.GfxLayer[iVar16] + DAT_00ed314c::instance; + } + MACRO_CALL_MEMBER( + OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(2); + _yOffset_01 = GMTotalPicturesProcessed::instance[0x9d]; + } + LAB_004e9845: + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + if (_flatView) { + DAT_RenderMap_YOffset::instance = 8; + if (this->DAT_MapEditorDisplayLayer == 0) { + uVar32 = (uint)(short)DAT_TileMapState::instance.RandomLayer[iVar16]; + DAT_00ed314c::instance = uVar32 & 0xf; + DAT_00ed3170::instance = 0; + DAT_00ed3154::instance = 0; + if ((local_54 == 0) || ((DAT_00ed3148::instance & 0x40000000) != 0)) { + if ((DAT_00ed3148::instance & 0x100) == 0) { + if ((DAT_00ed3148::instance & 0x80) != 0) { + _yOffset_01 = (int)DAT_TileMapState::instance.OrganismLayer[iVar16]; + if (_yOffset_01 < 2000) { + _yOffset_01 = MACRO_CALL_MEMBER( + OpenSHC::Map::LandscapeState_Func::getRandomRockImageOffset, + DAT_LandscapeState::ptr)((uVar32 & 3) + 1); + DAT_GmImageAddressToBeRendered::instance + = _yOffset_01 + -1 + GMTotalPicturesProcessed::instance[0x38]; + } else { + _yOffset_01 = _yOffset_01 * 0x20; + if (1 < *(short*)((int)&DAT_LandscapeState::instance.trees[0x636] + .appleTreeColorVariation + + _yOffset_01 + 2)) { + iVar26 = MACRO_CALL_MEMBER( + OpenSHC::Map::LandscapeState_Func::getRandomRockImageOffset, + DAT_LandscapeState::ptr)((uVar32 & 3) + 1); + DAT_GmImageAddressToBeRendered::instance = iVar26 + -1 + + GMTotalPicturesProcessed::instance[*( + short*)((int)&DAT_LandscapeState::instance.trees[0x636] + .animationFrameUnk + + _yOffset_01 + 2)]; + } + } + } + } else if ((DAT_00ed3148::instance & 0x800) == 0) { + if ((DAT_00ed3148::instance & 0x200) == 0) { + if (DAT_TileMapState::instance.DamageLayer[iVar16] != 0) { + DAT_00ed3148::instance = DAT_00ed3148::instance & 1; + DAT_GmImageAddressToBeRendered::instance + = (uVar32 & 1) + 0x2c + _yOffset_01; + } + } else { + DAT_00ed3148::instance = DAT_00ed3148::instance & 1; + if (DAT_TileMapState::instance.DamageLayer[iVar16] == 0) { + DAT_GmImageAddressToBeRendered::instance + = (uVar32 & 3) + 0x24 + _yOffset_01; + } else { + DAT_GmImageAddressToBeRendered::instance + = (uVar32 & 1) + 0x2c + _yOffset_01; + } + } + } else { + DAT_00ed3148::instance = DAT_00ed3148::instance & 1; + if ((DAT_GmImageAddressToBeRendered::instance + == GMTotalPicturesProcessed::instance[0xc] + 0x86U) + || (DAT_GmImageAddressToBeRendered::instance + == GMTotalPicturesProcessed::instance[0xc] + 0x88U)) { + DAT_GmImageAddressToBeRendered::instance = _yOffset_01 + 0x2a; + } else { + DAT_GmImageAddressToBeRendered::instance = _yOffset_01 + 0x28; + } + } + } else { + BVar8 = DAT_BuildingsState::instance.buildings[local_54].buildingType; + iVar26 = DAT_MapRenderDefinedData::instance.BuildingRenderSomeTypeArray[(short)BVar8]; + if (iVar26 == 3) { + uVar32 = (uint)((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 4) != 0); + if (BVar8 == OpenSHC::Map::Buildings::BT_WOODCUTTERSHUT) { + DAT_GmImageAddressToBeRendered::instance = _yOffset_01 + 0x18 + uVar32; + } else if (BVar8 == OpenSHC::Map::Buildings::BT_HUNTERSHUT) { + DAT_GmImageAddressToBeRendered::instance = _yOffset_01 + 0x1a + uVar32; + } else if (BVar8 == OpenSHC::Map::Buildings::BT_DAIRYFARM) { + DAT_GmImageAddressToBeRendered::instance = _yOffset_01 + 0x1c + uVar32; + } else { + DAT_GmImageAddressToBeRendered::instance = _yOffset_01 + 0x1e + uVar32; + } + } else if (-1 < iVar26) { + DAT_GmImageAddressToBeRendered::instance + = (uVar32 & 3) + _yOffset_01 + ((local_54 & 1) + iVar26 * 2) * 4; + } + } + } else { + DAT_00ed3170::instance = 0; + DAT_00ed3154::instance = 0; + } + } + DAT_RenderMap_ImageID::instance = (uint)DAT_TileMapState::instance.ConstructionGFXLayer[iVar16]; + bVar12 = false; + bVar14 = false; + if (DAT_RenderMap_ImageID::instance == 0) { + if ((((DAT_00ed3148::instance & 0x4000) != 0) + && (DAT_TileMapState::instance.field159_0x5549b8 != 0)) + && ((DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY + || (_yOffset_01 + = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, + DAT_TileMapState::ptr)(iVar16), + DAT_GameState::instance.mapAndTime + .playerTeams[DAT_TileMapState::instance.moats[_yOffset_01].owner] + == DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])))) { + DAT_RenderMap_ImageID::instance = 0x39; + goto LAB_004e9b3c; + } + } else if ((DAT_TileMapState::instance.buildingPlacementFail == FALSE) + || ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x8000) != 0)) { + DAT_GmImageAddressToBeRendered::instance = DAT_RenderMap_ImageID::instance; + if (((DAT_00ed3148::instance & 0x100) != 0) && (!_flatView)) { + DAT_RenderMap_YOffset::instance + = DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.DefaultHeightLayer[iVar16]]; + } + } else { + LAB_004e9b3c: + bVar12 = true; + bVar14 = true; + } + local_60 = (int)(short)DAT_TileMapState::instance.UnitLayer[iVar16]; + if (((local_60 != 0) && (local_60 == DAT_UnitsState::instance.lastSelectedUnitID)) + && (DAT_MenuModalComposition1::instance.activeModalDialogID + == OpenSHC::UI::Enums::MMT_DEBUG_DATA_UNIT_DATA)) { + DAT_GmImageAddressToBeRendered::instance + = ((byte)DAT_UnitsState::instance.units[local_60].moveDelay & 0x3f) + + GMTotalPicturesProcessed::instance[0x26]; + } + if ((((DAT_00ed3148::instance & 8) != 0) + && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x2000) == 0)) + && (!_flatView)) { + DAT_RenderMap_YOffset::instance + = DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar16] + 4]; + } + if (local_54 != 0) { + uVar9 = *(ushort*)this->viewportState.ptrColor; + *(ushort*)this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + } + if (((DAT_00ed3170::instance != 0xff) && (bVar13)) + && (MACRO_CALL(OpenSHC::UI::Rendering_Func::RenderTerrainTilesCenterPiece)(), bVar12)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS, + (int)((int)(DAT_RenderMap_ImageID::instance)), + (int)((int)(DAT_RenderMap_DrawSomeX::instance)), + (int)((int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + + DAT_RenderMap_DrawSomeY::instance)), + 0x18); + } + if ((((DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].direction != 0) + && (local_54 == 0)) + && (bVar13)) + && (!bVar12)) { + _yOffset_01 = (int)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .tileOffset; + /* + renders preview of selected object + */ + + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderFunctionResponsibleForManyGameObjects, + DAT_TextureRenderCoreObject::ptr)( + (char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .horizontalOffsetImage + + DAT_RenderMap_DrawSomeX::instance, + (int)((int)(((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) - _yOffset_01) + + DAT_RenderMap_DrawSomeY::instance)), + (int)((int)((char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .buildingWidth)), + _yOffset_01 + 7, + (ushort*)((int)( + + (DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + 0x200 + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + } + if (local_2c != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_WHITECAPS, local_2c, + (DAT_RenderMap_DrawSomeX::instance + - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0xad].originX) + + 0xf, + (DAT_RenderMap_DrawSomeY::instance + - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0xad].originY) + + 7); + } + if (local_54 != 0) { + if (*(ushort*)this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *(ushort*)this->viewportState.ptrColor = uVar9; + } else { + this->viewportState.mouseRayUnitID = 0; + this->viewportState.mouseRayBuildingID = local_54; + } + } + if (((DAT_00ed3148::instance & 0x201) == 0) && (local_54 == 0)) { + uVar10 = DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; + if (((uVar10 & 0x3c0) != 0) + && ((((DAT_RenderMap_ImageID::instance == 0 + || (((DAT_00ed3148::instance & 0x4000) != 0 + && (DAT_TileMapState::instance.field159_0x5549b8 != 0)))) + && ((DAT_00ed3148::instance & 0x30) == 0)) + && (!_flatView)))) { + uVar32 = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16]; + DAT_GmImageAddressToBeRendered::instance + = (uint)DAT_TileMapState::instance.AlphaGFXLayer[iVar16]; + iVar26 = uVar32 - DAT_TileMapState::instance.heightBasedScreenYOffset[uVar32]; + _yOffset_01 = DAT_RenderMap_DrawSomeX::instance; + if ((uVar10 & 0x40) == 0) { + if ((char)uVar10 < '\0') { + _yOffset_01 = (int)DAT_GMImageHeaders::instance + .imh[DAT_GmImageAddressToBeRendered::instance + + GMTotalPicturesProcessed::instance[0x36] + -1] + .height; + /* + renders wall connections + */ + + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderFunctionResponsibleForManyGameObjects, + DAT_TextureRenderCoreObject::ptr)(DAT_RenderMap_DrawSomeX::instance, + (int)((int)(((iVar26 - uVar32) - _yOffset_01) + DAT_00ed3154::instance + 0x62 + + DAT_RenderMap_DrawSomeY::instance)), + (int)((int)(DAT_GMImageHeaders::instance + .imh[DAT_GmImageAddressToBeRendered::instance + + GMTotalPicturesProcessed::instance[0x36] + -1] + .width)), + _yOffset_01 - iVar26, + (ushort*)((int)( + + (DAT_GMImageOffsets::instance[GMTotalPicturesProcessed::instance[0x36] + -1 + + DAT_GmImageAddressToBeRendered::instance] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + goto LAB_004e9e36; + } + if ((uVar10 & 0x100) == 0) { + if ((uVar10 & 0x200) == 0) + goto LAB_004e9e36; + iVar26 = (iVar26 - uVar32) + DAT_00ed3154::instance + -1; + } else { + iVar26 = (iVar26 - uVar32) + DAT_00ed3154::instance; + _yOffset_01 = DAT_RenderMap_DrawSomeX::instance + 0x10; + } + } else { + iVar26 = (iVar26 - uVar32) + DAT_00ed3154::instance + 7; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, + (int)((int)(DAT_GmImageAddressToBeRendered::instance)), _yOffset_01, + (int)((int)(iVar26 + DAT_RenderMap_DrawSomeY::instance))); + } + } + LAB_004e9e36: + _yOffset_01 = DAT_RenderMap_YOffset::instance; + uVar32 = (uint)DAT_TileMapState::instance.FloatingLayer[iVar16]; + if (uVar32 != 0) { + if ((DAT_TileMapState::instance.refreshRelatedOne != 0) && (!_flatView)) { + if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x10000000U) == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x100U) != 0) { + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + if (local_54 == 0) { + _yOffset_01 = DAT_RenderMap_YOffset::instance + 4; + } else if (DAT_BuildingsState::instance.buildings[local_54].buildingType + == OpenSHC::Map::Buildings::BT_WOODGATE1) { + _yOffset_01 = DAT_RenderMap_YOffset::instance + 6; + } else { + _yOffset_01 = DAT_RenderMap_YOffset::instance + 0x14; + } + } + } else { + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + iVar26 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)(local_54); + _yOffset_01 = _yOffset_01 + iVar26; + } + } + do { + uVar29 = this->floatersArray[uVar32].variation; + if ((uVar29 & 2) != 0) { + if ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x10) == 0) { + if ((uVar29 & 4) != 0) { + DAT_RenderedUnitOwner::instance = ~-(uint)((uVar29 & 0x10) != 0) + & DAT_GameSynchronyState::instance.currentPlayerSlotID; + DAT_CurrentlyRenderedSpriteID::instance = this->floatersArray[uVar32].gmID; + uVar29 = this->floatersArray[uVar32].variation; + } + if ((uVar29 & 0x20) == 0) { + if ((uVar29 & 0xffff0000) == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)((eGM)this->floatersArray[uVar32].gmID, + this->floatersArray[uVar32].imageID, + (int)((int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance)), + (int)((int)((this->floatersArray[uVar32].originY - _yOffset_01) + + DAT_RenderMap_DrawSomeY::instance))); + } else { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + (GmID)this->floatersArray[uVar32].gmID, + this->floatersArray[uVar32].imageID, + (int)((int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance)), + (int)((int)((this->floatersArray[uVar32].originY - _yOffset_01) + + DAT_RenderMap_DrawSomeY::instance)), + (int)((int)(uVar29 >> 0x10))); + } + } else { + iVar26 = this->floatersArray[uVar32].imageID; + GVar11 = (GmID)this->floatersArray[uVar32].gmID; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)((GmID)GVar11, iVar26, + (int)((int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance)), + (int)((int)((this->floatersArray[uVar32].originY - _yOffset_01) + + DAT_RenderMap_DrawSomeY::instance)), + GVar11, ((int)uVar29 >> 0x10) + iVar26, 0); + } + } else { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, + this)(0, + this->floatersArray[uVar32].originX + DAT_RenderMap_DrawSomeX::instance, + (this->floatersArray[uVar32].originY - _yOffset_01) + + DAT_RenderMap_DrawSomeY::instance, + (undefined4)((int)(this->floatersArray[uVar32].imageID)), + (undefined4)((int)(uVar29)), + (undefined4)((int)(this->floatersArray[uVar32].gmID)), 0); + } + } + uVar32 = this->floatersArray[uVar32].id; + } while (uVar32 != 0); + } + _yOffset_01 = 0; + if (local_58 != 0) { + while ((iVar26 = DAT_RenderMap_YOffset::instance, _yOffset_01 = _yOffset_01 + 1, + _yOffset_01 < 10 && (DAT_EntityState::instance.entityArray[local_58].logicalState != 0))) { + if (((DAT_EntityState::instance.entityArray[local_58].graphicType2 != 0) + && (((EVar3 = DAT_EntityState::instance.entityArray[local_58].entityType, + EVar3 == OpenSHC::Map::Entities::EntityTypeInt__ET_CROW + || (EVar3 == OpenSHC::Map::Entities::ET_SEAGULLUnk)) + || (EVar3 == OpenSHC::Map::Entities::ET_COW_FLYING)))) + && (DAT_EntityState::instance.entityArray[local_58].imageID != 0)) { + DAT_RenderedUnitOwner::instance + = DAT_EntityState::instance.entityArray[local_58].colorUnk; + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_EntityState::instance.entityArray[local_58].gmID; + if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x10000000U) == 0) { + if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x100U) != 0) { + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + if (local_54 == 0) { + iVar26 = DAT_RenderMap_YOffset::instance + 4; + } else { + iVar26 = DAT_RenderMap_YOffset::instance + 0x14; + } + } + } else { + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + iVar18 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)(local_54); + iVar26 = iVar26 + iVar18; + } + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, + this)(0xffffffff, + ((int)DAT_EntityState::instance.entityArray[local_58].x1 + - (int)DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance, + (((int)DAT_EntityState::instance.entityArray[local_58].y1 + - (int)DAT_EntityState::instance.entityArray[local_58].originY) + - iVar26) + + DAT_RenderMap_DrawSomeY::instance, + (undefined4)((int)((int)DAT_EntityState::instance.entityArray[local_58].imageID)), + 0x14, 0, 0); + } + iVar26 = (int)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; + if (((local_58 == iVar26) || (DAT_GameSynchronyState::instance.syncStatus != 0)) + || (local_58 = iVar26, iVar26 == 0)) + break; + } + } + local_58 = (uint)DAT_TileMapState::instance.EntityLayer[iVar16]; + if (((local_54 != 0) + && (DAT_BuildingsState::instance.buildings[local_54].buildingType + == OpenSHC::Map::Buildings::BT_DRAWBRIDGE)) + && ((!_flatView + && ((DAT_TileMapState::instance.refreshRelatedOne != 0 + && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0xc) == 4)))))) { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding2, this)( + local_54, (int)((int)(DAT_RenderMap_DrawSomeX::instance)), + (int)((int)(DAT_00ed3154::instance + DAT_RenderMap_DrawSomeY::instance)), iVar16); + } + /* + ------ BEGIN RENDER UNITS ------ + */ + + if ((local_60 != 0) + && (MACRO_CALL_MEMBER( + OpenSHC::Map::Units::UnitsState_Func::triggerDesyncIfTileUnitLinkageInvalid, + DAT_UnitsState::ptr)(iVar16), + 0 < local_60)) { + while (_yOffset_01 = DAT_RenderMap_DrawSomeX::instance, + DAT_UnitsState::instance.units[local_60].logicalState + != OpenSHC::Map::Units::ULS_INVISIBLE) { + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_UnitsState::instance.units[local_60].spriteID; + local_2c = 0; + if ((DAT_UnitsState::instance.units[local_60].unitType + == OpenSHC::Map::Units::UT_A_ASSASSIN) + && (DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[local_60].owner] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) { + iVar26 = DAT_UnitsState::instance.units[local_60].assassinsMicroDistanceToEnemyUnk; + if ((iVar26 < 160) + || ((UVar4 = DAT_UnitsState::instance.units[local_60].state.generic, + UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK + || (UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK_WALL)))) { + if ((120 < iVar26) + && ((DAT_GameSynchronyState::instance.currentGameMode + != OpenSHC::Game::GM_SOLITARY + || (DAT_UnitsState::instance.units[local_60].idleCounterUnk < 0x961)))) { + local_2c = 0x10; + } + goto LAB_004ea2c6; + } + if ((DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY) + && (0x960 < DAT_UnitsState::instance.units[local_60].idleCounterUnk)) + goto LAB_004ea2c6; + } else { + LAB_004ea2c6: + if (DAT_UnitsState::instance.units[local_60].field40_0x5a == 0) { + DAT_RenderedUnitOwner::instance + = DAT_UnitsState::instance.units[local_60].calculatedOwnerPlayerIndex; + } else { + DAT_RenderedUnitOwner::instance = 9; + } + iVar18 = GMTotalPicturesProcessed::instance[DAT_CurrentlyRenderedSpriteID::instance]; + iVar27 = DAT_UnitsState::instance.units[local_60].gfxNumber; + iVar26 = iVar27 + -1 + iVar18; + iVar25 = DAT_RenderMap_YOffset::instance; + if (DAT_TileMapState::instance.refreshRelatedOne != 0) { + if (_flatView) { + iVar25 = ((int)(char)DAT_UnitsState::instance.units[local_60].negativeHeight + - (int)DAT_UnitsState::instance.units[local_60].buildingHeight) + + DAT_RenderMap_YOffset::instance; + } else { + iVar25 = (uint)(byte)DAT_UnitsState::instance.units[local_60].padding_0x83[0] + + (int)DAT_UnitsState::instance.units[local_60].terrainOrClimbHeight; + } + } + sVar30 = DAT_UnitsState::instance.units[local_60].orientationRelatedPositionX; + sVar20 = DAT_UnitsState::instance.units[local_60].orientationRelatedPositionY; + DAT_UnitsState::instance.units[local_60].field308_0x41c + = sVar30 + -6 + DAT_RenderMap_DrawSomeX::instance; + sVar30 = ((short)DAT_UnitsState::instance.units[local_60].field41_0x5c + - DAT_UnitsState::instance.units[local_60].field22_0x2a) + + (short)_yOffset_01 + sVar30; + bVar15 = DAT_UnitsState::instance.units[local_60].negativeHeight; + DAT_UnitsState::instance.units[local_60].field309_0x420 + = (sVar20 - iVar25) + -0xc + DAT_RenderMap_DrawSomeY::instance; + sVar24 = (short)DAT_UnitsState::instance.units[local_60].unknownV; + sVar5 = DAT_UnitsState::instance.units[local_60].field58_0x84; + sVar6 = DAT_UnitsState::instance.units[local_60].buildingHeight; + DAT_UnitsState::instance.units[local_60].drawX = sVar30; + sVar20 = (((sVar5 - sVar6) - (short)iVar25) - sVar24) + + (short)DAT_RenderMap_DrawSomeY::instance + (short)(char)bVar15 + sVar20; + sVar5 = DAT_GMImageHeaders::instance.imh[iVar18 + iVar27 + -1].width; + DAT_UnitsState::instance.units[local_60].drawY = sVar20; + DAT_UnitsState::instance.units[local_60].drawWidth = sVar5; + if (bVar15 == 0) { + sVar24 = DAT_GMImageHeaders::instance.imh[iVar18 + iVar27 + -1].height; + } else { + sVar24 = (sVar24 - (char)bVar15) + 8; + } + _yOffset_01 = DAT_UnitsState::instance.units[local_60].vanish; + DAT_UnitsState::instance.units[local_60].drawHeight1 = sVar24; + if (_yOffset_01 == 0) { + _yOffset_01 = DAT_UnitsState::instance.units[local_60].field43_0x64; + if (_yOffset_01 == 1) { + LAB_004ea49b: + _yOffset_01 = 1; + } else if (_yOffset_01 == 2) { + _yOffset_01 = 0; + } else { + if (((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x10) == 0) + || (DAT_UnitsState::instance.units[local_60].field43_0x64 == -1)) { + if ((DAT_00ed3148::instance & 0x400) == 0) { + if ((DAT_UnitsState::instance.units[local_60].unitType + == OpenSHC::Map::Units::UT_A_ASSASSIN) + && (_yOffset_01 = DAT_UnitsState::instance.units[local_60].imageID2, + _yOffset_01 != 0)) { + sVar24 = DAT_UnitsState::instance.units[local_60].field59_0x86; + if (sVar24 < 0) { + local_c = 0; + } else { + local_c = (uint)sVar24; + } + iVar27 = (0x20 - local_2c) / 3; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)((int)sVar30, + (int)(( + int)(DAT_UnitsState::instance.units[local_60].field59_0x86 + + sVar20)), + (int)((int)(sVar5)), + (int)((int)(DAT_UnitsState::instance.units[local_60].drawHeight1 + - local_c)), + (byte*)((int)(( + DAT_GMImageOffsets::instance[_yOffset_01 + -1 + iVar18] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData))), + (0x10 - iVar27) * 2); + sVar30 = DAT_UnitsState::instance.units[local_60].drawYOffset; + if (sVar30 != 0) { + sVar20 = DAT_UnitsState::instance.units[local_60].field59_0x86; + if (sVar20 < 0) { + _yOffset_01 = 0; + } else { + _yOffset_01 = (int)sVar20; + } + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)((int)(sVar20 + + DAT_UnitsState::instance.units[local_60].drawY)), + (int)((int)(DAT_UnitsState::instance.units[local_60] + .drawWidth)), + DAT_UnitsState::instance.units[local_60].drawHeight1 + - _yOffset_01, + (byte*)((int)(( + DAT_GMImageOffsets::instance + [GMTotalPicturesProcessed::instance + [DAT_CurrentlyRenderedSpriteID::instance] + + -1 + (int)sVar30] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData))), + 0x20 - iVar27); + } + } + uVar9 = *(ushort*)this->viewportState.ptrColor; + *(ushort*)this->viewportState.ptrColor + = COL_MAGENTA::instance.shortValue; + bVar15 = DAT_UnitsState::instance.units[local_60] + .disappearFadeAlphaCountdown; + if (bVar15 == 0) { + if (DAT_UnitsState::instance.units[local_60].graphicSize == 4) { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func:: + renderAssassinClimbingOverlay, + this)(local_60); + } + sVar30 = DAT_UnitsState::instance.units[local_60].field59_0x86; + if (sVar30 < 0) { + _yOffset_01 = 0; + } else { + _yOffset_01 = (int)sVar30; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)((int)(sVar30 + + DAT_UnitsState::instance.units[local_60].drawY)), + (int)(( + int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + DAT_UnitsState::instance.units[local_60].drawHeight1 + - _yOffset_01, + (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData)))); + sVar30 = DAT_UnitsState::instance.units[local_60].graphicSize; + if ((sVar30 != 4) && (1 < sVar30)) { + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_UnitsState::instance.units[local_60].gmIDUnk; + DAT_RenderedUnitOwner::instance + = (uint)DAT_UnitsState::instance.units[local_60] + .displayColorPlayerID; + _yOffset_01 + = DAT_UnitsState::instance.units[local_60].imageIDUnk; + if (0 < _yOffset_01) { + sVar30 + = DAT_UnitsState::instance.units[local_60].field60_0x88; + if (sVar30 < 0) { + iVar26 = 0; + } else { + iVar26 = (int)sVar30; + } + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)((int)(sVar30 + + DAT_UnitsState::instance.units[local_60].drawY)), + (int)((int)(DAT_UnitsState::instance.units[local_60] + .drawWidth)), + DAT_UnitsState::instance.units[local_60].drawHeight1 + - iVar26, + (byte*)(( + int)((DAT_GMImageSizes::instance + [GMTotalPicturesProcessed::instance + [DAT_CurrentlyRenderedSpriteID:: + instance] + + _yOffset_01 + 0x1c51f] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData)))); + } + } + if (2 < DAT_UnitsState::instance.units[local_60].graphicSize) { + _yOffset_01 = DAT_UnitsState::instance.units[local_60].imageID2; + if (0 < _yOffset_01) { + sVar30 + = DAT_UnitsState::instance.units[local_60].drawYOffset; + if (sVar30 < 0) { + iVar26 = 0; + } else { + iVar26 = (int)sVar30; + } + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)((int)(sVar30 + + DAT_UnitsState::instance.units[local_60].drawY)), + (int)((int)(DAT_UnitsState::instance.units[local_60] + .drawWidth)), + DAT_UnitsState::instance.units[local_60].drawHeight1 + - iVar26, + (byte*)(( + int)((DAT_GMImageSizes::instance + [GMTotalPicturesProcessed::instance + [DAT_CurrentlyRenderedSpriteID:: + instance] + + _yOffset_01 + 0x1c51f] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData)))); + } + if (DAT_GameSynchronyState::instance.currentGameMode + != OpenSHC::Game::GM_SOLITARY) { + UVar7 = DAT_UnitsState::instance.units[local_60].unitType; + if ((UVar7 == OpenSHC::Map::Units::UT_S_TOWER) + && (DAT_UnitsState::instance.units[local_60].dying + == 0)) { + _yOffset_01 + = (int)DAT_UnitsState::instance.units[local_60] + .drawX; + iVar26 = (int)DAT_UnitsState::instance.units[local_60] + .drawY; + switch (DAT_UnitsState::instance.units[local_60] + .facingDirectionMapOrientationCorrected) { + case 0: + _yOffset_01 = _yOffset_01 + 0x22; + break; + case 1: + _yOffset_01 = _yOffset_01 + 0x2f; + iVar26 = iVar26 + -0xc; + break; + case 2: + _yOffset_01 = _yOffset_01 + 0x4b; + iVar26 = iVar26 + -0x13; + break; + case 3: + _yOffset_01 = _yOffset_01 + 0x65; + iVar26 = iVar26 + -10; + break; + case 4: + _yOffset_01 = _yOffset_01 + 0x70; + iVar26 = iVar26 + 2; + break; + case 5: + _yOffset_01 = _yOffset_01 + 100; + iVar26 = iVar26 + 0x14; + break; + case 6: + _yOffset_01 = _yOffset_01 + 0x46; + iVar26 = iVar26 + 0x13; + break; + case 7: + _yOffset_01 = _yOffset_01 + 0x2c; + iVar26 = iVar26 + 0x17; + } + } else { + if ((UVar7 != OpenSHC::Map::Units::UT_S_BATTERINGRAM) + || (DAT_UnitsState::instance.units[local_60].dying + != 0)) + goto LAB_004eadfa; + _yOffset_01 + = (int)DAT_UnitsState::instance.units[local_60] + .drawX; + iVar26 = (int)DAT_UnitsState::instance.units[local_60] + .drawY; + switch (DAT_UnitsState::instance.units[local_60] + .facingDirectionMapOrientationCorrected) { + case 0: + case 1: + _yOffset_01 = _yOffset_01 + 0x2c; + iVar26 = iVar26 + -0x14; + break; + case 2: + _yOffset_01 = _yOffset_01 + 0x31; + iVar26 = iVar26 + -0x11; + break; + case 3: + _yOffset_01 = _yOffset_01 + 0x29; + iVar26 = iVar26 + -0xf; + break; + case 4: + _yOffset_01 = _yOffset_01 + 0x22; + iVar26 = iVar26 + -0x11; + break; + case 5: + case 6: + _yOffset_01 = _yOffset_01 + 0x20; + iVar26 = iVar26 + -0x14; + break; + case 7: + _yOffset_01 = _yOffset_01 + 0x28; + iVar26 = iVar26 + -0x17; + } + } + DAT_RenderedUnitOwner::instance + = (uint)DAT_UnitsState::instance.units[local_60].owner; + DAT_CurrentlyRenderedSpriteID::instance + = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + uVar32 = DAT_UnitsState::instance.units[local_60].fixedRng + + DAT_GameState::instance.mapAndTime + .totalGameTicksUnk + & 0x8000003f; + if ((int)uVar32 < 0) { + uVar32 = (uVar32 - 1 | 0xffffffc0) + 1; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering:: + TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, + (int)((int)(uVar32 / 2 + 1)), _yOffset_01, iVar26); + } + } + LAB_004eadfa: + if (*(ushort*)this->viewportState.ptrColor + == COL_MAGENTA::instance.shortValue) { + *(ushort*)this->viewportState.ptrColor = uVar9; + } else { + this->viewportState.mouseRayUnitID = local_60; + this->viewportState.mouseRayBuildingID = 0; + } + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)((int)(DAT_UnitsState::instance.units[local_60].drawY)), + (int)(( + int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + (int)(( + int)(DAT_UnitsState::instance.units[local_60].drawHeight1)), + (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData))), + (int)((int)((char)bVar15))); + if (*(ushort*)this->viewportState.ptrColor + == COL_MAGENTA::instance.shortValue) { + *(ushort*)this->viewportState.ptrColor = uVar9; + } else { + this->viewportState.mouseRayUnitID = local_60; + this->viewportState.mouseRayBuildingID = 0; + } + } + if (((DAT_UnitsState::instance.units[local_60].isSelected != 0) + && (DAT_UnitsState::instance.units[local_60].usingTeleport + == 0)) + && (DAT_UnitsState::instance.units[local_60] + .disappearFadeAlphaCountdown + == 0)) { + _yOffset_01 + = (DAT_UnitsState::instance.units[local_60].drawWidth + -0x16) + / 2; + if (DAT_UnitsState::instance.units[local_60].unitType + == OpenSHC::Map::Units::UT_LORD) { + sVar30 = DAT_UnitsState::instance.units[local_60] + .maxHealthRatingLord; + if (sVar30 == 0) { + iVar26 = DAT_UnitsState::instance.units[local_60] + .someDrawYOffset + + -6 + + (int)DAT_UnitsState::instance.units[local_60].drawY; + iVar27 = DAT_UnitsState::instance.units[local_60].drawX + + _yOffset_01; + iVar18 = DAT_UnitsState::instance.units[local_60].healthbar + + 0x11; + } else { + iVar26 = DAT_UnitsState::instance.units[local_60] + .someDrawYOffset + + -8 + + (int)DAT_UnitsState::instance.units[local_60].drawY; + iVar27 = DAT_UnitsState::instance.units[local_60].drawX + + _yOffset_01; + iVar18 = DAT_UnitsState::instance.units[local_60].healthbar + + 0xe4 + sVar30 * 0xb; + } + } else { + iVar26 + = DAT_GameState::instance + .playerDataArray + [DAT_UnitsState::instance.units[local_60].owner] + .fearFactorLevel; + if (iVar26 == 0) { + iVar26 = DAT_UnitsState::instance.units[local_60] + .someDrawYOffset + + -6 + + (int)DAT_UnitsState::instance.units[local_60].drawY; + iVar27 = DAT_UnitsState::instance.units[local_60].drawX + + _yOffset_01; + iVar18 = DAT_UnitsState::instance.units[local_60].healthbar + + 0x11; + } else { + if (iVar26 < 1) { + iVar18 = iVar26 * -0xb + 0xad; + } else { + iVar18 = iVar26 * 0xb + 0x76; + } + iVar26 = DAT_UnitsState::instance.units[local_60] + .someDrawYOffset + + -8 + + (int)DAT_UnitsState::instance.units[local_60].drawY; + iVar27 = DAT_UnitsState::instance.units[local_60].drawX + + _yOffset_01; + iVar18 = DAT_UnitsState::instance.units[local_60].healthbar + + iVar18; + } + } + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_FLOATS, iVar18, iVar27, iVar26); + if (((DAT_UnitsState::instance.units[local_60].unitType + == OpenSHC::Map::Units::UT_A_ASSASSIN) + && (DAT_GameState::instance.mapAndTime.playerTeams + [DAT_UnitsState::instance.units[local_60].owner] + == DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance + .currentPlayerSlotID])) + && ((DAT_UnitsState::instance.units[local_60] + .assassinsMicroDistanceToEnemyUnk + < 0xa1 + || ((UVar4 = DAT_UnitsState::instance.units[local_60] + .state.generic, + UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK + || (UVar4 + == OpenSHC::Map::Units::States:: + US_MELEE_ATTACK_WALL)))))) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_INTERFACE_ICONS_2, 0x1bf, + DAT_UnitsState::instance.units[local_60].drawX + 2 + + _yOffset_01, + (int)((int)(DAT_UnitsState::instance.units[local_60] + .someDrawYOffset + + -0x1b + + DAT_UnitsState::instance.units[local_60].drawY)), + 0x10); + } + } + if ((local_60 != 0) + && (sVar30 = DAT_UnitsState::instance.units[local_60].field46_0x6e, + sVar30 != 0)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_FLOATS_NEW, + (int)((int)(sVar30 + 0xd4)), + (int)((int)(DAT_UnitsState::instance.units[local_60].drawX)), + (int)((int)(DAT_UnitsState::instance.units[local_60] + .someDrawYOffset + + -0x36 + DAT_UnitsState::instance.units[local_60].drawY)), + OpenSHC::IO::Graphics::GID_FLOATS_NEW, + (int)((int)(sVar30 + 0xdc)), 0); + DAT_UnitsState::instance.units[local_60].field46_0x6e = 0; + } + sVar30 = DAT_UnitsState::instance.units[local_60].field45_0x6c; + if (sVar30 == 1) { + iVar26 = DAT_TileMapState::instance.field161_0x5549c0 + 0x30; + iVar18 = DAT_UnitsState::instance.units[local_60].someDrawYOffset + + -0x46 + (int)DAT_UnitsState::instance.units[local_60].drawY; + _yOffset_01 = DAT_UnitsState::instance.units[local_60].field22_0x2a + + -0x35 + (int)DAT_UnitsState::instance.units[local_60].drawX; + iVar27 = DAT_TileMapState::instance.field161_0x5549c0 + 0x20; + } else if (sVar30 == 2) { + _yOffset_01 = 0; + iVar18 = 0; + switch (DAT_UnitsState::instance.units[local_60].unitType) { + case OpenSHC::Map::Units::UT_S_CATAPULT: + _yOffset_01 = 0x29; + iVar18 = 0x3a; + break; + case OpenSHC::Map::Units::UT_S_TREBUCHET: + case OpenSHC::Map::Units::UT_S_TOWER: + _yOffset_01 = 0x4f; + iVar18 = 0x38; + break; + case OpenSHC::Map::Units::UT_S_MANGONEL: + _yOffset_01 = 0x2b; + iVar18 = 0x23; + break; + case OpenSHC::Map::Units::UT_S_BATTERINGRAM: + _yOffset_01 = 0x24; + iVar18 = 0x3d; + break; + case OpenSHC::Map::Units::UT_S_SHIELD: + _yOffset_01 = -3; + iVar18 = 0x3c; + break; + case OpenSHC::Map::Units::UT_S_BALLISTA: + case OpenSHC::Map::Units::UT_S_FBALLISTA: + iVar18 = 0x24; + _yOffset_01 = 0x13; + } + iVar26 = DAT_TileMapState::instance.field161_0x5549c0 + 0x84; + iVar18 = (DAT_UnitsState::instance.units[local_60].someDrawYOffset + - iVar18) + + (int)DAT_UnitsState::instance.units[local_60].drawY; + _yOffset_01 + = DAT_UnitsState::instance.units[local_60].drawX + _yOffset_01; + iVar27 = DAT_TileMapState::instance.field161_0x5549c0 + 0x74; + } else { + if (sVar30 != 3) + goto LAB_004eb1be; + iVar18 = 0; + _yOffset_01 = 0; + switch (DAT_UnitsState::instance.units[local_60].unitType) { + case OpenSHC::Map::Units::UT_S_CATAPULT: + _yOffset_01 = 0x29; + iVar18 = 0x3a; + break; + case OpenSHC::Map::Units::UT_S_TREBUCHET: + case OpenSHC::Map::Units::UT_S_TOWER: + _yOffset_01 = 0x4f; + iVar18 = 0x38; + break; + case OpenSHC::Map::Units::UT_S_MANGONEL: + _yOffset_01 = 0x2b; + iVar18 = 0x23; + break; + case OpenSHC::Map::Units::UT_S_BATTERINGRAM: + _yOffset_01 = 0x24; + iVar18 = 0x3d; + break; + case OpenSHC::Map::Units::UT_S_SHIELD: + _yOffset_01 = -3; + iVar18 = 0x3c; + break; + case OpenSHC::Map::Units::UT_S_BALLISTA: + case OpenSHC::Map::Units::UT_S_FBALLISTA: + iVar18 = 0x24; + _yOffset_01 = 0x13; + } + iVar26 = DAT_TileMapState::instance.field161_0x5549c0 + 0xa4; + iVar18 = (DAT_UnitsState::instance.units[local_60].someDrawYOffset + - iVar18) + + (int)DAT_UnitsState::instance.units[local_60].drawY; + _yOffset_01 + = DAT_UnitsState::instance.units[local_60].drawX + _yOffset_01; + iVar27 = DAT_TileMapState::instance.field161_0x5549c0 + 0x94; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar27, _yOffset_01, iVar18, + OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar26, 0); + DAT_UnitsState::instance.units[local_60].field45_0x6c = 0; + goto LAB_004eb1be; + } + if ((DAT_BuildingsState::instance.buildings[local_54].buildingType + != OpenSHC::Map::Buildings::BT_TOWER2) + || ((sVar24 = DAT_UnitsState::instance.units[local_60] + .facingDirectionMapOrientationCorrected, + sVar24 != 2 && (sVar24 != 6)))) + goto LAB_004ea49b; + if ((DAT_UnitsState::instance.units[local_60].unitType + == OpenSHC::Map::Units::UT_A_ASSASSIN) + && (_yOffset_01 = DAT_UnitsState::instance.units[local_60].imageID2, + _yOffset_01 != 0)) { + sVar24 = DAT_UnitsState::instance.units[local_60].field59_0x86; + if (sVar24 < 0) { + local_14 = 0; + } else { + local_14 = (int)sVar24; + } + iVar27 = (0x20 - local_2c) / 3; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)((int)sVar30, + (int)((int)(DAT_UnitsState::instance.units[local_60].field59_0x86 + + sVar20)), + (int)((int)(sVar5)), + DAT_UnitsState::instance.units[local_60].drawHeight1 - local_14, + (byte*)(( + int)((DAT_GMImageOffsets::instance[_yOffset_01 + -1 + iVar18] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData))), + (0x10 - iVar27) * 2); + sVar30 = DAT_UnitsState::instance.units[local_60].drawYOffset; + if (sVar30 != 0) { + sVar20 = DAT_UnitsState::instance.units[local_60].field59_0x86; + if (sVar20 < 0) { + _yOffset_01 = 0; + } else { + _yOffset_01 = (int)sVar20; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)((int)(sVar20 + + DAT_UnitsState::instance.units[local_60].drawY)), + (int)(( + int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + DAT_UnitsState::instance.units[local_60].drawHeight1 + - _yOffset_01, + (byte*)(( + int)((DAT_GMImageOffsets::instance + [GMTotalPicturesProcessed::instance + [DAT_CurrentlyRenderedSpriteID::instance] + + -1 + (int)sVar30] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData))), + 0x20 - iVar27); + } + } + uVar9 = *(ushort*)this->viewportState.ptrColor; + *(ushort*)this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + sVar30 = DAT_UnitsState::instance.units[local_60].field59_0x86; + if (local_2c == 0) { + if (sVar30 < 0) { + _yOffset_01 = 0; + } else { + _yOffset_01 = (int)sVar30; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)(( + int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY)), + (int)((int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + DAT_UnitsState::instance.units[local_60].drawHeight1 - _yOffset_01, + (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData)))); + } else { + if (sVar30 < 0) { + _yOffset_01 = 0; + } else { + _yOffset_01 = (int)sVar30; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)(( + int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY)), + (int)((int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + DAT_UnitsState::instance.units[local_60].drawHeight1 - _yOffset_01, + (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData))), + local_2c); + } + sVar30 = DAT_UnitsState::instance.units[local_60].graphicSize; + if ((sVar30 != 4) && (1 < sVar30)) { + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_UnitsState::instance.units[local_60].gmIDUnk; + DAT_RenderedUnitOwner::instance + = (uint)DAT_UnitsState::instance.units[local_60] + .displayColorPlayerID; + _yOffset_01 = DAT_UnitsState::instance.units[local_60].imageIDUnk; + if (0 < _yOffset_01) { + sVar30 = DAT_UnitsState::instance.units[local_60].field60_0x88; + if (sVar30 < 0) { + iVar26 = 0; + } else { + iVar26 = (int)sVar30; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)((int)(sVar30 + + DAT_UnitsState::instance.units[local_60].drawY)), + (int)(( + int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + DAT_UnitsState::instance.units[local_60].drawHeight1 - iVar26, + (byte*)(( + int)((DAT_GMImageSizes::instance + [GMTotalPicturesProcessed::instance + [DAT_CurrentlyRenderedSpriteID::instance] + + _yOffset_01 + 0x1c51f] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData)))); + } + } + if (2 < DAT_UnitsState::instance.units[local_60].graphicSize) { + _yOffset_01 = DAT_UnitsState::instance.units[local_60].imageID2; + if (0 < _yOffset_01) { + sVar30 = DAT_UnitsState::instance.units[local_60].drawYOffset; + if (sVar30 < 0) { + iVar26 = 0; + } else { + iVar26 = (int)sVar30; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)( + (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)((int)(sVar30 + + DAT_UnitsState::instance.units[local_60].drawY)), + (int)(( + int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + DAT_UnitsState::instance.units[local_60].drawHeight1 - iVar26, + (byte*)(( + int)((DAT_GMImageSizes::instance + [GMTotalPicturesProcessed::instance + [DAT_CurrentlyRenderedSpriteID::instance] + + _yOffset_01 + 0x1c51f] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData)))); + } + if (DAT_GameSynchronyState::instance.currentGameMode + != OpenSHC::Game::GM_SOLITARY) { + UVar7 = DAT_UnitsState::instance.units[local_60].unitType; + if ((UVar7 == OpenSHC::Map::Units::UT_S_TOWER) + && (DAT_UnitsState::instance.units[local_60].dying == 0)) { + _yOffset_01 + = (int)DAT_UnitsState::instance.units[local_60].drawX; + iVar26 = (int)DAT_UnitsState::instance.units[local_60].drawY; + switch (DAT_UnitsState::instance.units[local_60] + .facingDirectionMapOrientationCorrected) { + case 0: + _yOffset_01 = _yOffset_01 + 0x22; + break; + case 1: + _yOffset_01 = _yOffset_01 + 0x2f; + iVar26 = iVar26 + -0xc; + break; + case 2: + _yOffset_01 = _yOffset_01 + 0x4b; + iVar26 = iVar26 + -0x13; + break; + case 3: + _yOffset_01 = _yOffset_01 + 0x65; + iVar26 = iVar26 + -10; + break; + case 4: + _yOffset_01 = _yOffset_01 + 0x70; + iVar26 = iVar26 + 2; + break; + case 5: + _yOffset_01 = _yOffset_01 + 100; + iVar26 = iVar26 + 0x14; + break; + case 6: + _yOffset_01 = _yOffset_01 + 0x46; + iVar26 = iVar26 + 0x13; + break; + case 7: + _yOffset_01 = _yOffset_01 + 0x2c; + iVar26 = iVar26 + 0x17; + } + } else { + if ((UVar7 != OpenSHC::Map::Units::UT_S_BATTERINGRAM) + || (DAT_UnitsState::instance.units[local_60].dying != 0)) + goto LAB_004ea966; + _yOffset_01 + = (int)DAT_UnitsState::instance.units[local_60].drawX; + iVar26 = (int)DAT_UnitsState::instance.units[local_60].drawY; + switch (DAT_UnitsState::instance.units[local_60] + .facingDirectionMapOrientationCorrected) { + case 0: + case 1: + _yOffset_01 = _yOffset_01 + 0x2c; + iVar26 = iVar26 + -0x14; + break; + case 2: + _yOffset_01 = _yOffset_01 + 0x31; + iVar26 = iVar26 + -0x11; + break; + case 3: + _yOffset_01 = _yOffset_01 + 0x29; + iVar26 = iVar26 + -0xf; + break; + case 4: + _yOffset_01 = _yOffset_01 + 0x22; + iVar26 = iVar26 + -0x11; + break; + case 5: + case 6: + _yOffset_01 = _yOffset_01 + 0x20; + iVar26 = iVar26 + -0x14; + break; + case 7: + _yOffset_01 = _yOffset_01 + 0x28; + iVar26 = iVar26 + -0x17; + } + } + DAT_RenderedUnitOwner::instance + = (uint)DAT_UnitsState::instance.units[local_60].owner; + DAT_CurrentlyRenderedSpriteID::instance + = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + uVar32 = DAT_UnitsState::instance.units[local_60].fixedRng + + DAT_GameState::instance.mapAndTime.totalGameTicksUnk + & 0x8000003f; + if ((int)uVar32 < 0) { + uVar32 = (uVar32 - 1 | 0xffffffc0) + 1; + } + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, + (int)((int)(uVar32 / 2 + 1)), _yOffset_01, iVar26); + } + } + LAB_004ea966: + if (*(ushort*)this->viewportState.ptrColor + == COL_MAGENTA::instance.shortValue) { + *(ushort*)this->viewportState.ptrColor = uVar9; + } else { + this->viewportState.mouseRayUnitID = local_60; + this->viewportState.mouseRayBuildingID = 0; + } + goto LAB_004eb1be; + } + _yOffset_01 = 0; + } + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, + this)(local_60, (undefined4)((int)((int)sVar30)), + (undefined4)((int)((int)sVar20)), (undefined4)((int)((int)sVar5)), + (undefined4)((int)((int)DAT_UnitsState::instance.units[local_60].drawHeight1)), + (undefined4)((int)(DAT_GMImageOffsets::instance[iVar26] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)), + _yOffset_01); + } else if (_yOffset_01 != 1) { + if (local_2c == 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)((int)sVar30, (int)((int)(sVar20)), + (int)((int)(sVar5)), + (int)((int)(DAT_UnitsState::instance.units[local_60].drawHeight1)), + (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)((int)sVar30, (int)((int)(sVar20)), + (int)((int)(sVar5)), + (int)((int)(DAT_UnitsState::instance.units[local_60].drawHeight1)), + (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData))), + local_2c); + } + _yOffset_01 = DAT_UnitsState::instance.units[local_60].vanish; + if (1 < _yOffset_01) { + DAT_UnitsState::instance.units[local_60].vanish = _yOffset_01 + -1; + } + } + } + LAB_004eb1be: + local_60 = (int)(short)DAT_UnitsState::instance.units[local_60].nextUnitOnTheSameTile; + if ((DAT_GameSynchronyState::instance.syncStatus != 0) || (local_60 < 1)) + break; + } + } + /* + ------ END RENDER UNITS ------ + */ + + local_24 = 0; + _yOffset_01 = DAT_RenderMap_YOffset::instance; + if (local_58 != 0) { + do { + local_24 = local_24 + 1; + if ((9 < local_24) || (DAT_EntityState::instance.entityArray[local_58].logicalState == 0)) + break; + if (DAT_EntityState::instance.entityArray[local_58].graphicType2 == 0) + goto LAB_004eb439; + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_EntityState::instance.entityArray[local_58].gmID; + if ((DAT_CurrentlyRenderedSpriteID::instance == OpenSHC::IO::Graphics::GID_BODY_FIRE) + || (DAT_CurrentlyRenderedSpriteID::instance + == OpenSHC::IO::Graphics::GID_BODY_FIRE_2)) { + local_8 = local_8 + 1; + if ((DAT_EntityState::instance.entityArray[local_58].fireIntensity == 0) + && (0x4f < local_8)) { + if (local_8 < 200) { + bVar15 = (byte)DAT_EntityState::instance.entityArray[local_58].rng_1 & 1; + } else { + bVar15 = (byte)DAT_EntityState::instance.entityArray[local_58].rng_1 & 3; + } + if (bVar15 != 0) + break; + } + MACRO_CALL_MEMBER( + OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(5); + _yOffset_01 = DAT_RenderMap_YOffset::instance; + } + DAT_RenderedUnitOwner::instance = DAT_EntityState::instance.entityArray[local_58].colorUnk; + bVar12 = false; + iVar26 = (int)DAT_EntityState::instance.entityArray[local_58].height; + switch (DAT_CurrentlyRenderedSpriteID::instance) { + case OpenSHC::IO::Graphics::GID_ANIM_FLAGS: + case OpenSHC::IO::Graphics::GID_ANIM_CRUSADER_FLAG: + if (_flatView) + goto LAB_004eb439; + case OpenSHC::IO::Graphics::GID_BODY_INFO: + bVar12 = true; + switchD_004eb2c9_caseD_76: + if ((DAT_TileMapState::instance.refreshRelatedOne == 0) || (_flatView)) { + iVar26 = _yOffset_01; + } + if (!bVar12) + goto switchD_004eb2c9_caseD_4d; + break; + default: + goto switchD_004eb2c9_caseD_4d; + case OpenSHC::IO::Graphics::GID_BODY_FIRE: + case OpenSHC::IO::Graphics::GID_BODY_DISEASE: + case OpenSHC::IO::Graphics::GID_BLAST_3: + case OpenSHC::IO::Graphics::GID_BODY_FIRE_2: + goto switchD_004eb2c9_caseD_76; + case OpenSHC::IO::Graphics::GID_BODY_MISSILE_COW: + if ((DAT_EntityState::instance.entityArray[local_58].someCounter_OR_hitGround != 0) + && ((DAT_TileMapState::instance.refreshRelatedOne == 0 || (_flatView)))) { + iVar26 = _yOffset_01; + } + goto switchD_004eb2c9_caseD_4d; + case OpenSHC::IO::Graphics::GID_BODY_BRAZIER: + iVar18 + = iVar26 + 4 + (_yOffset_01 - (uint)DAT_TileMapState::instance.HeightLayer[iVar16]); + if (DAT_TileMapState::instance.refreshRelatedOne == 0) { + iVar26 = _yOffset_01; + if (DAT_TileMapState::instance.BuildingLayer[iVar16] != 0) { + iVar26 = _yOffset_01 + 0x14; + } + } else { + iVar26 = _yOffset_01; + if ((!_flatView) + && (iVar26 = iVar18, DAT_TileMapState::instance.BuildingLayer[iVar16] != 0)) { + iVar26 = iVar18 + -10; + } + } + break; + case OpenSHC::IO::Graphics::GID_ANIM_HEADS: + iVar26 + = iVar26 + 7 + (_yOffset_01 - (uint)DAT_TileMapState::instance.HeightLayer[iVar16]); + uVar32 = DAT_TileMapState::instance.LogicLayer[iVar16] & 0x400000; + if (uVar32 != 0) { + iVar26 = iVar26 + 0x12; + } + if (DAT_TileMapState::instance.refreshRelatedOne == 0) { + iVar26 = _yOffset_01 + 0x14; + if (DAT_TileMapState::instance.BuildingLayer[iVar16] == 0) { + iVar26 = _yOffset_01; + } + if (uVar32 != 0) { + iVar26 = iVar26 + 0x12; + } + } else if (_flatView) + goto LAB_004eb439; + } + if ((DAT_EntityState::instance.entityArray[local_58].field83_0xc0 == 0) + || (DAT_TextureRenderCoreObject::instance.isZoom2 == 0)) { + sVar30 = DAT_EntityState::instance.entityArray[local_58].unkMinusOne; + if (sVar30 < 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, + DAT_EntityState::instance.entityArray[local_58].graphicType2, + (int)((int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance)), + (int)((int)(((DAT_EntityState::instance.entityArray[local_58].y1 + - DAT_EntityState::instance.entityArray[local_58].originY) + - iVar26) + + DAT_RenderMap_DrawSomeY::instance)), + (GmID)((int)(DAT_CurrentlyRenderedSpriteID::instance)), + (int)((int)(DAT_EntityState::instance.entityArray[local_58].imageID)), + (int)((int)(-1 - sVar30))); + _yOffset_01 = DAT_RenderMap_YOffset::instance; + } else { + _yOffset_01 = (int)DAT_EntityState::instance.entityArray[local_58].originY; + if (sVar30 == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + (eGM)DAT_CurrentlyRenderedSpriteID::instance, + DAT_EntityState::instance.entityArray[local_58].graphicType2, + (int)((int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance)), + (int)(( + int)(((DAT_EntityState::instance.entityArray[local_58].y1 - _yOffset_01) + - iVar26) + + DAT_RenderMap_DrawSomeY::instance))); + _yOffset_01 = DAT_RenderMap_YOffset::instance; + } else { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + (GmID)DAT_CurrentlyRenderedSpriteID::instance, + DAT_EntityState::instance.entityArray[local_58].graphicType2, + (int)((int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance)), + (int)(( + int)(((DAT_EntityState::instance.entityArray[local_58].y1 - _yOffset_01) + - iVar26) + + DAT_RenderMap_DrawSomeY::instance)), + (int)((int)(sVar30))); + _yOffset_01 = DAT_RenderMap_YOffset::instance; + } + } + LAB_004eb439: + iVar26 = (int)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; + if ((local_58 == iVar26) + || (local_58 = iVar26, DAT_GameSynchronyState::instance.syncStatus != 0)) + break; + } else { + local_58 + = (uint)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; + } + if (local_58 == 0) + break; + } while (true); + } + local_58 = (uint)(byte)DAT_TileMapState::instance.EntityLayerLT25[iVar16]; + _yOffset_01 = 0; + if (local_58 != 0) { + while (_yOffset_01 = _yOffset_01 + 1, _yOffset_01 < 10) { + if (DAT_EntityState::instance.entityArray[local_58].tile != iVar16) { + DAT_TileMapState::instance.EntityLayerLT25[iVar16] = '\0'; + break; + } + if (DAT_EntityState::instance.entityArray[local_58].logicalState == 0) + break; + iVar26 = DAT_EntityState::instance.entityArray[local_58].graphicType2; + if (iVar26 == 0) { + LAB_004eb7db: + uVar32 = (uint)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; + if ((local_58 == uVar32) || (DAT_GameSynchronyState::instance.syncStatus != 0)) + break; + } else { + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_EntityState::instance.entityArray[local_58].gmID; + DAT_RenderedUnitOwner::instance + = DAT_EntityState::instance.entityArray[local_58].colorUnk; + iVar18 = (int)DAT_EntityState::instance.entityArray[local_58].height; + if ((DAT_EntityState::instance.entityArray[local_58].field83_0xc0 == 0) + || (DAT_TextureRenderCoreObject::instance.isZoom2 == 0)) { + sVar30 = DAT_EntityState::instance.entityArray[local_58].unkMinusOne; + if (sVar30 < 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)( + (GmID)DAT_CurrentlyRenderedSpriteID::instance, iVar26, + (int)((int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance)), + (int)((int)(((DAT_EntityState::instance.entityArray[local_58].y1 + - DAT_EntityState::instance.entityArray[local_58].originY) + - iVar18) + + DAT_RenderMap_DrawSomeY::instance)), + (GmID)((int)(DAT_CurrentlyRenderedSpriteID::instance)), + (int)((int)(DAT_EntityState::instance.entityArray[local_58].imageID)), + (int)((int)(-1 - sVar30))); + } else { + iVar27 = (int)DAT_EntityState::instance.entityArray[local_58].originY; + if (sVar30 == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + (eGM)DAT_CurrentlyRenderedSpriteID::instance, iVar26, + (int)(( + int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance)), + (int)(( + int)(((DAT_EntityState::instance.entityArray[local_58].y1 - iVar27) + - iVar18) + + DAT_RenderMap_DrawSomeY::instance))); + } else { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + (GmID)DAT_CurrentlyRenderedSpriteID::instance, iVar26, + (int)(( + int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance)), + (int)(( + int)(((DAT_EntityState::instance.entityArray[local_58].y1 - iVar27) + - iVar18) + + DAT_RenderMap_DrawSomeY::instance)), + (int)((int)(sVar30))); + } + } + sVar30 = DAT_EntityState::instance.entityArray[local_58].field83_0xc0; + if (sVar30 != 0) { + sVar20 = DAT_EntityState::instance.entityArray[local_58].unkMinusOne; + EVar3 = DAT_EntityState::instance.entityArray[local_58].entityType; + iVar27 = ((int)DAT_EntityState::instance.entityArray[local_58].x1 + - (int)DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance; + iVar18 = (((int)DAT_EntityState::instance.entityArray[local_58].y1 + - (int)DAT_EntityState::instance.entityArray[local_58].originY) + - iVar18) + + DAT_RenderMap_DrawSomeY::instance; + DAT_TextManagerObject::instance.textSurfaceTarget + = OpenSHC::Rendering::Enums::RT_MAP_GAME; + iVar26 = (int)sVar20; + local_c = 0; + if ((EVar3 == (OpenSHC::Map::Entities::EntityType)0x2a) + || (EVar3 == (OpenSHC::Map::Entities::EntityType)0x2b)) { + DAT_EntityState::instance.entityArray[local_58].unkMinusOne = sVar20 + -2; + DAT_TextManagerObject::instance.field8_0x20 = 1; + if (EVar3 == (OpenSHC::Map::Entities::EntityType)0x2b) { + local_c = 0xff; + } + } + if (iVar26 < 0) { + iVar26 = 0; + } + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_EntityState::instance.entityArray[local_58].field82_0xbe; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + (GmID)DAT_CurrentlyRenderedSpriteID::instance, (int)((int)(sVar30)), + DAT_EntityState::instance.entityArray[local_58].field86_0xc8 + iVar27, + DAT_EntityState::instance.entityArray[local_58].field87_0xca + iVar18, + iVar26); + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderNumberToScreen2, + DAT_TextManagerObject::ptr)( + DAT_EntityState::instance.entityArray[local_58].displayValue, + DAT_EntityState::instance.entityArray[local_58].field88_0xcc + iVar27, + DAT_EntityState::instance.entityArray[local_58].field89_0xce + iVar18, + OpenSHC::Text::TTA_LEFT, local_c, 0x12, FALSE, iVar26); + DAT_TextManagerObject::instance.textSurfaceTarget + = OpenSHC::Rendering::Enums::RT_SCREEN_MENU; + DAT_TextManagerObject::instance.field8_0x20 = 0; + } + goto LAB_004eb7db; + } + uVar32 = (uint)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; + } + local_58 = uVar32; + if (uVar32 == 0) + break; + } + } + if ((iVar23 != 0) && (iVar23 < 2000)) { + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_LandscapeState::instance.trees[iVar23].treeTypeBasedValue1; + iVar26 = DAT_LandscapeState::instance.trees[iVar23].animationFrameUnk; + iVar18 = GMTotalPicturesProcessed::instance[DAT_CurrentlyRenderedSpriteID::instance]; + _yOffset_01 = iVar18 + -1 + iVar26; + if ((0 < (int)DAT_CurrentlyRenderedSpriteID::instance) + && ((_yOffset_01 != 0 && (iVar26 != 0)))) { + DAT_RenderedUnitOwner::instance + = DAT_LandscapeState::instance.trees[iVar23].appleTreeColorVariation; + DAT_TextureRenderCoreObject::instance.mbr_0x10 = 1; + /* + renders trees + */ + + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)( + (DAT_RenderMap_DrawSomeX::instance + - DAT_LandscapeState::instance.trees[iVar23].gmOriginX) + + 0xe, + (int)((int)(((DAT_RenderMap_DrawSomeY::instance + - DAT_LandscapeState::instance.trees[iVar23].gmOriginY) + - DAT_RenderMap_YOffset::instance) + + 6)), + (int)((int)(DAT_GMImageHeaders::instance.imh[iVar26 + iVar18 + -1].width)), + (int)((int)(DAT_GMImageHeaders::instance.imh[iVar26 + iVar18 + -1].height)), + (byte*)((int)((DAT_GMImageOffsets::instance[_yOffset_01] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + DAT_TextureRenderCoreObject::instance.mbr_0x10 = 0; + if ((DAT_GameCore::instance.gameMode_2 == OpenSHC::Game::GM_EDITOR) + && (DAT_LandscapeState::instance.trees[iVar23].unknownDistanceRelatedToCrow != 0)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_BODY_CROW, + this->unknownCounterUntil_0x24 % 0xc + 0x49, + (int)((int)(DAT_RenderMap_DrawSomeX::instance + -0x1e)), + (int)((int)((DAT_RenderMap_DrawSomeY::instance - DAT_RenderMap_YOffset::instance) + + -0xdc))); + } + } + MACRO_CALL_MEMBER( + OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(4); + MACRO_CALL_MEMBER( + OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(8); + } + if (((DAT_00ed3170::instance != 0) && ((int)DAT_00ed3170::instance < 0xff)) && (bVar13)) { + uVar32 = (uint)(short)DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; + DAT_00ed317c::instance = uVar32 & 3; + if ((DAT_00ed3148::instance & 0x100) == 0) { + DAT_GmImageAddressToBeRendered::instance + = (uint)DAT_TileMapState::instance.PillarGFXLayer[iVar16]; + if ((DAT_00ed3148::instance & 0x100000) == 0) { + DAT_00ed316c::instance = DAT_GmImageAddressToBeRendered::instance; + if ((uVar32 & 0x800) == 0) { + MACRO_CALL(OpenSHC::Rendering_Func::BlitMapImageWithVerticalClip)(); + } else { + MACRO_CALL(OpenSHC::Rendering_Func::BlitMapImageWithVerticalClipAndYOffset)(); + } + if (bVar14) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS, + (int)((int)(DAT_RenderMap_ImageID::instance + 8)), + (int)((int)(DAT_RenderMap_DrawSomeX::instance)), + (int)((int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + 9 + + DAT_RenderMap_DrawSomeY::instance)), + 0x18); + } + } else { + if (DAT_GmImageAddressToBeRendered::instance == 0x20) { + DAT_GmImageAddressToBeRendered::instance + = GMTotalPicturesProcessed::instance[9] + 0x1f; + } else { + iVar16 = DAT_GmImageAddressToBeRendered::instance + this->unknownCounterUntil_0x10; + if (0x32 < iVar16) { + iVar16 = iVar16 + -0x10; + } + DAT_GmImageAddressToBeRendered::instance + = iVar16 + -1 + GMTotalPicturesProcessed::instance[9]; + if ((0x20 < (int)DAT_00ed3170::instance) + && ((int)(DAT_RenderMap_DrawSomeY::instance - DAT_00ed3170::instance) + < local_5c + -0xa0)) { + MACRO_CALL_MEMBER(OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, + DAT_SFXState::ptr)(6); + } + } + DAT_00ed316c::instance = DAT_GmImageAddressToBeRendered::instance; + if ((uVar32 & 0x800) == 0) + goto LAB_004eb9a4; + MACRO_CALL(OpenSHC::Rendering_Func::BlitMapImageWithVerticalClipAndYOffset)(); + } + } else { + DAT_GmImageAddressToBeRendered::instance + = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16]; + DAT_00ed316c::instance = DAT_GmImageAddressToBeRendered::instance; + if (local_54 != 0) { + DAT_00ed316c::instance = (uint)DAT_TileMapState::instance.PillarGFXLayer[iVar16]; + } + LAB_004eb9a4: + MACRO_CALL(OpenSHC::Rendering_Func::BlitMapImageWithVerticalClip)(); + } + } + } else { + DAT_GmImageAddressToBeRendered::instance = GMTotalPicturesProcessed::instance[0x26] + 0x140; + DAT_RenderMap_YOffset::instance = 0; + MACRO_CALL(OpenSHC::UI::Rendering_Func::RenderTerrainTilesCenterPiece)(); + } + DAT_RenderMap_DrawSomeX::instance = DAT_RenderMap_DrawSomeX::instance + 0x20; + } + iVar31 = _zoomOffset; + if (_vpWidthPlus1 == _viewportHeight) { + DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated + 0x10; + iVar16 = _viewportHeight; + } else { + iVar16 = _viewportHeight + 1; + DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated; + } + for (; iVar31 < iVar16; iVar31 = iVar31 + 1) { + _yOffset_01 = this->screenPointToTileNumber[iVar31 + iVar2 + -8]; + DAT_00ed3148::instance = DAT_TileMapState::instance.LogicLayer[_yOffset_01]; + if ((DAT_00ed3148::instance & 0x30) == 0) { + if ((iVar31 < 2) || (bVar13 = true, iVar16 + -2 <= iVar31)) { + bVar13 = false; + } + uVar32 = (uint)DAT_TileMapState::instance.FloatingLayer[_yOffset_01]; + DAT_RenderMap_ImageID::instance + = (uint)DAT_TileMapState::instance.ConstructionGFXLayer[_yOffset_01]; + DAT_GmImageAddressToBeRendered::instance = (uint)DAT_TileMapState::instance.GfxLayer[_yOffset_01]; + if (DAT_RenderMap_ImageID::instance != 0) { + DAT_GmImageAddressToBeRendered::instance = DAT_RenderMap_ImageID::instance; + } + DAT_RenderMap_YOffset::instance + = DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[_yOffset_01]]; + puVar1 = DAT_TileMapState::instance.MiscDisplayLayer + _yOffset_01; + uVar29 = (uint)DAT_TileMapState::instance.BuildingLayer[_yOffset_01]; + DAT_00ed3154::instance = -(uint)((*puVar1 & 0x20) != 0) & 0x5a; + if (_flatView) { + if (uVar29 == 0) { + if ((DAT_00ed3148::instance & 0x100) == 0) { + if ((((char)DAT_00ed3148::instance < '\0') + && (1999 < DAT_TileMapState::instance.OrganismLayer[_yOffset_01])) + && (iVar23 = DAT_TileMapState::instance.OrganismLayer[_yOffset_01] * 0x20, + 1 < *(short*)((int)&DAT_LandscapeState::instance.trees[0x636] + .appleTreeColorVariation + + iVar23 + 2))) { + iVar26 + = MACRO_CALL_MEMBER(OpenSHC::Map::LandscapeState_Func::getRandomRockImageOffset, + DAT_LandscapeState::ptr)( + ((byte)DAT_TileMapState::instance.RandomLayer[_yOffset_01] & 3) + 1); + DAT_GmImageAddressToBeRendered::instance = iVar26 + -1 + + GMTotalPicturesProcessed::instance[*( + short*)((int)&DAT_LandscapeState::instance.trees[0x636].animationFrameUnk + + iVar23 + 2)]; + } + } else if ((DAT_00ed3148::instance & 0x800) == 0) { + if ((DAT_00ed3148::instance & 0x200) != 0) { + DAT_00ed3148::instance = DAT_00ed3148::instance & 1; + DAT_GmImageAddressToBeRendered::instance = (DAT_00ed314c::instance & 3) + 0x24 + + GMTotalPicturesProcessed::instance[0x9d]; + } + } else { + DAT_00ed3148::instance = DAT_00ed3148::instance & 1; + if ((DAT_GmImageAddressToBeRendered::instance + == GMTotalPicturesProcessed::instance[0xc] + 0x86U) + || (DAT_GmImageAddressToBeRendered::instance + == GMTotalPicturesProcessed::instance[0xc] + 0x88U)) { + DAT_GmImageAddressToBeRendered::instance + = GMTotalPicturesProcessed::instance[0x9d] + 0x2a; + } else { + DAT_GmImageAddressToBeRendered::instance + = GMTotalPicturesProcessed::instance[0x9d] + 0x28; + } + } + } else { + BVar8 = DAT_BuildingsState::instance.buildings[uVar29].buildingType; + iVar23 = DAT_MapRenderDefinedData::instance.BuildingRenderSomeTypeArray[(short)BVar8]; + if (iVar23 == 3) { + uVar22 = (uint)((*puVar1 & 4) != 0); + if (BVar8 == OpenSHC::Map::Buildings::BT_WOODCUTTERSHUT) { + DAT_GmImageAddressToBeRendered::instance + = uVar22 + 0x18 + GMTotalPicturesProcessed::instance[0x9d]; + } else if (BVar8 == OpenSHC::Map::Buildings::BT_HUNTERSHUT) { + DAT_GmImageAddressToBeRendered::instance + = uVar22 + 0x1a + GMTotalPicturesProcessed::instance[0x9d]; + } else if (BVar8 == OpenSHC::Map::Buildings::BT_DAIRYFARM) { + DAT_GmImageAddressToBeRendered::instance + = uVar22 + 0x1c + GMTotalPicturesProcessed::instance[0x9d]; + } else { + DAT_GmImageAddressToBeRendered::instance + = uVar22 + 0x1e + GMTotalPicturesProcessed::instance[0x9d]; + } + } else if (-1 < iVar23) { + DAT_GmImageAddressToBeRendered::instance = (DAT_00ed314c::instance & 3) + + GMTotalPicturesProcessed::instance[0x9d] + ((uVar29 & 1) + iVar23 * 2) * 4; + } + } + DAT_RenderMap_YOffset::instance = 8; + } + if (uVar29 != 0) { + if (((local_1c < viewportWidth) && (bVar13)) && (4 < iVar31)) { + psVar17 = &DAT_BuildingsState::instance.buildings[uVar29].surfaceAreaUnk; + *psVar17 = *psVar17 + 1; + } + uVar9 = *(ushort*)this->viewportState.ptrColor; + *(ushort*)this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + if ((DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].direction != 0) + && (bVar13)) { + iVar23 = (int)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .tileOffset; + /* + renders building sprite ontop of tilemap + */ + + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderFunctionResponsibleForManyGameObjects, + DAT_TextureRenderCoreObject::ptr)( + (char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .horizontalOffsetImage + + DAT_RenderMap_DrawSomeX::instance, + (int)((int)(((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) - iVar23) + + DAT_RenderMap_DrawSomeY::instance)), + (int)((int)(( + char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .buildingWidth)), + iVar23 + 7, + (ushort*)((int)( + + (DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + 0x200 + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + } + if ((!_flatView) + || (DAT_MapRenderDefinedData::instance.BuildingRenderSomeTypeArray + [(short)DAT_BuildingsState::instance.buildings[uVar29].buildingType] + < 0)) { + if ((DAT_BuildingsState::instance.buildings[uVar29].buildingType + == OpenSHC::Map::Buildings::BT_DRAWBRIDGE) + && ((DAT_TileMapState::instance.refreshRelatedOne != 0 + && (_yOffset_01 + == this->translationMatrix + [(short)DAT_BuildingsState::instance.buildings[uVar29].y + 2] + .addXgetTile + + 2 + (int)(short)DAT_BuildingsState::instance.buildings[uVar29].x)))) { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderBuildingAnimation, + this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance + 0x10)), + (int)((int)(DAT_00ed3154::instance + 0x18 + DAT_RenderMap_DrawSomeY::instance)), + (undefined4)((int)(_yOffset_01)), 1); + } + uVar10 = *puVar1; + if ((uVar10 & 0xc) != 0) { + if (DAT_BuildingsState::instance.buildings[uVar29].buildingType + == OpenSHC::Map::Buildings::BT_DRAWBRIDGE) { + if (DAT_TileMapState::instance.refreshRelatedOne != 0) { + if ((uVar10 & 0xc) == 0xc) { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::renderBuildingAnimation, + this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance + 0x10)), + (int)((int)(DAT_00ed3154::instance + 0x28 + + DAT_RenderMap_DrawSomeY::instance)), + (undefined4)((int)(_yOffset_01)), 0); + } else if ((uVar10 & 8) != 0) { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding, + this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance)), + (int)((int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + + DAT_RenderMap_DrawSomeY::instance)), + _yOffset_01); + } + } + } else { + iVar23 = (DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + + DAT_RenderMap_DrawSomeY::instance; + if ((uVar10 & 8) == 0) { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding2, + this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance)), iVar23, + _yOffset_01); + } else { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding, + this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance)), iVar23, + _yOffset_01); + } + } + } + } + if (*(ushort*)this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *(ushort*)this->viewportState.ptrColor = uVar9; + } else { + this->viewportState.mouseRayUnitID = 0; + this->viewportState.mouseRayBuildingID = uVar29; + } + } + if (((DAT_00ed3148::instance & 8) != 0) && ((*puVar1 & 0x4000) != 0)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, + (int)((int)(DAT_TileMapState::instance.field161_0x5549c0)), + (int)((int)(DAT_RenderMap_DrawSomeX::instance + -0x23)), + (int)((int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + -0x4a + + DAT_RenderMap_DrawSomeY::instance)), + OpenSHC::IO::Graphics::GID_FLOATS_NEW, + (int)((int)(DAT_TileMapState::instance.field161_0x5549c0 + 0x10)), 0); + *puVar1 = *puVar1 & 0xbfff; + } + iVar23 = DAT_RenderMap_YOffset::instance; + if (uVar32 != 0) { + if ((DAT_TileMapState::instance.refreshRelatedOne != 0) && (!_flatView)) { + if ((DAT_TileMapState::instance.LogicLayer[_yOffset_01] & 0x10000000U) == 0) { + if ((DAT_TileMapState::instance.LogicLayer[_yOffset_01] & 0x100U) != 0) { + if (DAT_TileMapState::instance.BuildingLayer[_yOffset_01] == 0) { + iVar23 = DAT_RenderMap_YOffset::instance + 4; + } else if (DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[_yOffset_01]] + .buildingType + == OpenSHC::Map::Buildings::BT_WOODGATE1) { + iVar23 = DAT_RenderMap_YOffset::instance + 6; + } else { + iVar23 = DAT_RenderMap_YOffset::instance + 0x14; + } + } + } else { + iVar26 = MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)( + (int)DAT_TileMapState::instance.BuildingLayer[_yOffset_01]); + iVar23 = iVar23 + iVar26; + } + } + do { + uVar29 = this->floatersArray[uVar32].variation; + if ((uVar29 & 1) != 0) { + iVar26 = iVar23; + if (((((uVar29 & 8) != 0) && (DAT_TileMapState::instance.refreshRelatedOne != 0)) + && (!_flatView)) + && (iVar26 = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::getTotalHeightAt, + DAT_TileMapState::ptr)(_yOffset_01, 0), + iVar26 < 0)) { + iVar26 = -1 - iVar26; + } + if ((*puVar1 & 0x10) == 0) { + uVar29 = this->floatersArray[uVar32].variation; + if ((uVar29 & 4) != 0) { + DAT_RenderedUnitOwner::instance = ~-(uint)((uVar29 & 0x10) != 0) + & DAT_GameSynchronyState::instance.currentPlayerSlotID; + DAT_CurrentlyRenderedSpriteID::instance = this->floatersArray[uVar32].gmID; + uVar29 = this->floatersArray[uVar32].variation; + } + if ((uVar29 & 0x20) == 0) { + if ((uVar29 & 0xffff0000) == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)((eGM)this->floatersArray[uVar32].gmID, + this->floatersArray[uVar32].imageID, + (int)((int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance)), + (int)((int)((this->floatersArray[uVar32].originY - iVar26) + + DAT_RenderMap_DrawSomeY::instance))); + } else { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + (GmID)this->floatersArray[uVar32].gmID, + this->floatersArray[uVar32].imageID, + (int)((int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance)), + (int)((int)((this->floatersArray[uVar32].originY - iVar26) + + DAT_RenderMap_DrawSomeY::instance)), + (int)((int)(uVar29 >> 0x10))); + } + } else { + iVar18 = this->floatersArray[uVar32].imageID; + GVar11 = (GmID)this->floatersArray[uVar32].gmID; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)((GmID)GVar11, iVar18, + (int)((int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance)), + (int)((int)((this->floatersArray[uVar32].originY - iVar26) + + DAT_RenderMap_DrawSomeY::instance)), + GVar11, ((int)uVar29 >> 0x10) + iVar18, 0); + } + } else { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, + this)(0, + this->floatersArray[uVar32].originX + DAT_RenderMap_DrawSomeX::instance, + (this->floatersArray[uVar32].originY - iVar26) + + DAT_RenderMap_DrawSomeY::instance, + (undefined4)((int)(this->floatersArray[uVar32].imageID)), + (undefined4)((int)(this->floatersArray[uVar32].variation)), + (undefined4)((int)(this->floatersArray[uVar32].gmID)), 0); + } + } + uVar32 = this->floatersArray[uVar32].id; + } while (uVar32 != 0); + } + DAT_TileMapState::instance.ConstructionGFXLayer[_yOffset_01] = 0; + *puVar1 = *puVar1 & 0x7fff; + } + DAT_RenderMap_DrawSomeX::instance = DAT_RenderMap_DrawSomeX::instance + 0x20; + } + if (iVar16 == _viewportHeight) { + _vpWidthPlus1_1 = _viewportHeight; + local_c = 200; + DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated + 0x10; + } else { + _vpWidthPlus1_1 = _viewportHeight + 1; + local_c = 0xc9; + DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated; + } + if ((!_flatView) && (local_48 = _zoomOffset, _zoomOffset < _vpWidthPlus1_1)) { + local_20 = this->screenPointToTileNumber + _zoomOffset + iVar2 + -8; + do { + iVar31 = *local_20; + DAT_GmImageAddressToBeRendered::instance = (uint)DAT_TileMapState::instance.AlphaGFXLayer[iVar31]; + if ((DAT_GmImageAddressToBeRendered::instance != 0) + && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar31] & 0x3c0) == 0)) { + if ((local_48 < 2) || (_vpWidthPlus1_1 + -2 <= local_48)) { + bVar13 = false; + } else { + bVar13 = true; + } + DAT_00ed3148::instance = DAT_TileMapState::instance.LogicLayer[iVar31]; + if ((DAT_00ed3148::instance & 0x400) != 0) { + psVar17 = &DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[iVar31]] + .tickRelatedVisuallyActiveIndicator; + sVar30 = *psVar17; + if (((0 < sVar30) && (sVar30 < 5)) && (bVar13)) { + DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[iVar31]; + DAT_RenderMap_YOffset::instance + = DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar31]]; + MACRO_CALL(OpenSHC::Rendering_Func::ApplyBlending)(((int)sVar30 << 5) / 5); + if (DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].direction + != 0) { + iVar31 = (int)DAT_GMImageHeaders::instance + .imh[DAT_GmImageAddressToBeRendered::instance] + .tileOffset; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderInterfaceOrBuildingOccupationArea, + DAT_TextureRenderCoreObject::ptr)( + (char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .horizontalOffsetImage + + DAT_RenderMap_DrawSomeX::instance, + (DAT_RenderMap_DrawSomeY::instance - DAT_RenderMap_YOffset::instance) - iVar31, + (int)((int)((char)DAT_GMImageHeaders::instance + .imh[DAT_GmImageAddressToBeRendered::instance] + .buildingWidth)), + iVar31 + 7, + (ushort*)((int)( + + (DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + + 0x200 + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData))), + (int)((int)((*psVar17 << 5) / 5))); + } + } + } + } + local_20 = local_20 + 1; + DAT_RenderMap_DrawSomeX::instance = DAT_RenderMap_DrawSomeX::instance + 0x20; + local_48 = local_48 + 1; + } while (local_48 < _vpWidthPlus1_1); + } + iVar2 = iVar2 + local_c; + DAT_RenderMap_DrawSomeY::instance = DAT_RenderMap_DrawSomeY::instance + 8; + local_1c = local_1c + 1; + } + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderUnits, this)(); + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderUnits, this)(); + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderUnits, this)(); + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderUnits, this)(); + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderUnits, this)(); + if ((DAT_TileMapState::instance.mapSize == 0xa0) + && (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x768)) { + if (this->viewportState.isZoomedOutUnk != 0) { + if ((DAT_GameCore::instance.activeMenuTab.tabType == OpenSHC::UI::Enums::BASMTT_SIEGETENT_SIEGETOWER) + || (DAT_GameCore::instance.activeMenuTab.tabType == OpenSHC::UI::Enums::BASMTT_SIEGETENT_SHIELD)) { + DAT_PencilRenderCore::instance.surfaceTarget = OpenSHC::Rendering::Enums::RT_MAP_GAME; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::PencilRenderCore_Func::drawBlendedBlackBox, + DAT_PencilRenderCore::ptr)(0, 0x2cc, 0xfd8, 0x2cc, 0x1a); + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::PencilRenderCore_Func::drawBlendedBlackBox, + DAT_PencilRenderCore::ptr)(0, 0x2cd, 0xfd8, 0x2cd, 0x14); + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::PencilRenderCore_Func::drawBlendedBlackBox, + DAT_PencilRenderCore::ptr)(0, 0x2ce, 0xfd8, 0x2ce, 0xe); + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::PencilRenderCore_Func::drawBlendedBlackBox, + DAT_PencilRenderCore::ptr)(0, 0x2cf, 0xfd8, 0x2cf, 8); + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::PencilRenderCore_Func::drawColorBox, DAT_PencilRenderCore::ptr)( + 0, 0x2d0, 0xfd8, 0x7f1, (ushort)((int)(COL_BLACK::instance.shortValue))); + DAT_PencilRenderCore::instance.surfaceTarget = OpenSHC::Rendering::Enums::RT_SCREEN_MENU; + } + goto LAB_004ec57a; + } + LAB_004ec582: + iVar31 = this->viewportState.currentCameraOffsetX + DAT_MouseState::instance.screenSpaceX; + iVar28 = this->viewportState.currentCameraOffsetY + DAT_MouseState::instance.screenSpaceY; + _viewportHeight = iVar28; + viewportWidth = iVar31; + } else { + LAB_004ec57a: + if (this->viewportState.isZoomedOutUnk == 0) + goto LAB_004ec582; + iVar28 = this->viewportState.currentCameraOffsetY + DAT_MouseState::instance.screenSpaceY; + iVar31 = this->viewportState.currentCameraOffsetX + DAT_MouseState::instance.screenSpaceX; + _viewportHeight = this->viewportState.currentCameraOffsetY + DAT_MouseState::instance.screenSpaceY * 2; + viewportWidth = this->viewportState.currentCameraOffsetX + 0xa0 + DAT_MouseState::instance.screenSpaceX * 2; + } + if (this->viewportState.field0_0x0 != 0) { + if (DAT_MouseState::instance.field68_0x1dc < 0x3e9) { + if (DAT_MouseState::instance.field68_0x1dc != 1000) { + switch (DAT_MouseState::instance.field68_0x1dc) { + case 1: + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_CURSORS, 0x51, + viewportWidth + - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x6b].originX, + (_viewportHeight + - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x6b].originY) + + 0x2d); + break; + case 3: + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)((GmID)DAT_TileMapState::instance.field163_0x5549c8, + (int)((int)(DAT_TileMapState::instance.field162_0x5549c4 + 0x10 + + DAT_TileMapState::instance.field161_0x5549c0)), + viewportWidth + - DAT_TextureRenderCoreObject::instance + .gmFileHeaderColorpaletteArray[DAT_TileMapState::instance.field163_0x5549c8] + .originX, + _viewportHeight + - DAT_TextureRenderCoreObject::instance + .gmFileHeaderColorpaletteArray[DAT_TileMapState::instance.field163_0x5549c8] + .originY, + 0x15); + case 2: + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)((eGM)DAT_TileMapState::instance.field163_0x5549c8, + (int)((int)(DAT_TileMapState::instance.field162_0x5549c4 + + DAT_TileMapState::instance.field161_0x5549c0)), + viewportWidth + - DAT_TextureRenderCoreObject::instance + .gmFileHeaderColorpaletteArray[DAT_TileMapState::instance.field163_0x5549c8] + .originX, + _viewportHeight + - DAT_TextureRenderCoreObject::instance + .gmFileHeaderColorpaletteArray[DAT_TileMapState::instance.field163_0x5549c8] + .originY); + break; + case 4: + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)((eGM)DAT_TileMapState::instance.field163_0x5549c8, + (int)((int)(DAT_TileMapState::instance.field162_0x5549c4)), viewportWidth + -8, + _viewportHeight + -8); + break; + case 5: + iVar28 = DAT_TileMapState::instance.field165_0x5549d0 + % DAT_TileMapState::instance.field164_0x5549cc + + DAT_TileMapState::instance.field162_0x5549c4; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)((GmID)DAT_TileMapState::instance.field163_0x5549c8, + iVar28, + viewportWidth + - DAT_TextureRenderCoreObject::instance + .gmFileHeaderColorpaletteArray[DAT_TileMapState::instance.field163_0x5549c8] + .originX, + _viewportHeight + - DAT_TextureRenderCoreObject::instance + .gmFileHeaderColorpaletteArray[DAT_TileMapState::instance.field163_0x5549c8] + .originY, + (GmID)((int)(DAT_TileMapState::instance.field163_0x5549c8)), + DAT_TileMapState::instance.field164_0x5549cc + iVar28, 0); + } + goto switchD_004ec5fa_default; + } + DAT_TextureRenderCoreObject::instance.isZoom2 = 0; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_INTERFACE_ICONS2, 0x7b, iVar31 + 0x1c, iVar28 + 4); + DAT_TextManagerObject::instance.textSurfaceTarget = OpenSHC::Rendering::Enums::RT_MAP_GAME; + MACRO_CALL_MEMBER( + OpenSHC::Text::TextManager_Func::renderInGameTextWithShadow, DAT_TextManagerObject::ptr)( + "(", iVar31 + 0x3c, iVar28 + 7, OpenSHC::Text::TTA_LEFT, 0xb8eefb, 0, 0x12, FALSE, 0); + if (DAT_GameCore::instance.gameMode_2 == OpenSHC::Game::GM_SIEGE_THAT) { + _numberToDisplay + = DAT_GameState::instance.playerDataArray[DAT_GameSynchronyState::instance.currentPlayerSlotID] + .startResources[4] + - DAT_TileMapState::instance.wallPlacementCost; + } else { + _numberToDisplay + = DAT_GameState::instance.playerDataArray[DAT_GameSynchronyState::instance.currentPlayerSlotID] + .currentResources[4] + - DAT_TileMapState::instance.wallPlacementCost; + } + } else { + if (DAT_MouseState::instance.field68_0x1dc != 0x3e9) + goto switchD_004ec5fa_default; + DAT_TextureRenderCoreObject::instance.isZoom2 = 0; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_INTERFACE_ICONS2, 0x7e, iVar31 + 0x1c, iVar28 + 4); + DAT_TextManagerObject::instance.textSurfaceTarget = OpenSHC::Rendering::Enums::RT_MAP_GAME; + MACRO_CALL_MEMBER( + OpenSHC::Text::TextManager_Func::renderInGameTextWithShadow, DAT_TextManagerObject::ptr)( + "(", iVar31 + 0x3c, iVar28 + 7, OpenSHC::Text::TTA_LEFT, 0xb8eefb, 0, 0x12, FALSE, 0); + _numberToDisplay + = DAT_GameState::instance.playerDataArray[DAT_GameSynchronyState::instance.currentPlayerSlotID] + .currentResources[2] + - DAT_TileMapState::instance.wallPlacementCost; + } + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderNumber2, DAT_TextManagerObject::ptr)( + _numberToDisplay, iVar31 + 0x3c, iVar28 + 7, OpenSHC::Text::TTA_LEFT, 0xb8eefb, 0, 0x12, TRUE, 0); + MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderInGameTextWithShadow, DAT_TextManagerObject::ptr)( + ")", iVar31 + 0x3c, iVar28 + 7, OpenSHC::Text::TTA_LEFT, 0xb8eefb, 0, 0x12, TRUE, 0); + DAT_TextManagerObject::instance.textSurfaceTarget = OpenSHC::Rendering::Enums::RT_SCREEN_MENU; + } + switchD_004ec5fa_default: + DAT_MouseState::instance.field68_0x1dc = -1; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::clearAllFloatingLayerElements, this)(); + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::setMapSurfaceHeightRangeUnk, + DAT_TextureRenderCoreObject::ptr)(); + DAT_TextureRenderCoreObject::instance.isZoom2 = 0; + DAT_TileMapState::instance.field159_0x5549b8 = 0; + return; + switchD_004eb2c9_caseD_4d: + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, this)( + 0xffffffff, + ((int)DAT_EntityState::instance.entityArray[local_58].x1 + - (int)DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance, + (((int)DAT_EntityState::instance.entityArray[local_58].y1 + - (int)DAT_EntityState::instance.entityArray[local_58].originY) + - iVar26) + + DAT_RenderMap_DrawSomeY::instance, + (undefined4)((int)(DAT_EntityState::instance.entityArray[local_58].graphicType2)), + (undefined4)((int)((int)DAT_EntityState::instance.entityArray[local_58].unkMinusOne)), + (undefined4)((int)((int)DAT_EntityState::instance.entityArray[local_58].imageID)), 0); + _yOffset_01 = DAT_RenderMap_YOffset::instance; + goto LAB_004eb439; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9f13d07ac..585e28132 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37341,7 +37341,7 @@ SHC_3BB0A8C1_0x004E8CA0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E8CC0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E8CF0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8CF0 | 29.4% | frame slot allocation differs SHC_3BB0A8C1_0x004E9000 | 0.0% | Pending From 83860c0b7a9f7d64e894cff9f69be548fcbf9759 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 23:51:38 +0200 Subject: [PATCH 30/77] reimplement: SHC_3BB0A8C1_0x004E7810 32.43% frame and reg allocation diffe --- .../ViewportRenderState/renderUnits.cpp | 568 ++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 569 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp new file mode 100644 index 000000000..e1c1cf9f9 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp @@ -0,0 +1,568 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/UI/Rendering/TextureRenderCore.func.hpp" +#include "OpenSHC/DE/SHCDE/eGM.hpp" +#include "OpenSHC/Game/GameMode.hpp" +#include "OpenSHC/IO/Graphics/GmID.hpp" +#include "OpenSHC/Map/Units/States/UnitState.hpp" +#include "OpenSHC/Map/Units/States/UnitStateShort.hpp" +#include "OpenSHC/Map/Units/UnitType.hpp" +#include "OpenSHC/Map/Units/UnitTypeShort.hpp" + +#include "OpenSHC/Globals/COL_MAGENTA.hpp" +#include "OpenSHC/Globals/DAT_CurrentlyRenderedSpriteID.hpp" +#include "OpenSHC/Globals/DAT_GMImageSizes.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_GameSynchronyState.hpp" +#include "OpenSHC/Globals/DAT_RenderedUnitOwner.hpp" +#include "OpenSHC/Globals/DAT_TextureRenderCoreObject.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" +#include "OpenSHC/Globals/GMTotalPicturesProcessed.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::DE::SHCDE::eGM; + using OpenSHC::Game::GameMode; + using OpenSHC::IO::Graphics::GmID; + using OpenSHC::Map::Units::UnitType; + using OpenSHC::Map::Units::UnitTypeShort; + using OpenSHC::Map::Units::States::UnitState; + using OpenSHC::Map::Units::States::UnitStateShort; + + /* + WARNING: Restarted to delay deadcode elimination for space: ram + */ + + /* + 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 0x004E7810 + void ViewportRenderState::renderUnits() + + { + short savedPixelColor; + short graphicSize; + UnitTypeShort unitType; + UnitStateShort unitState; + int overlayX; + uint animationTick; + int overlayY; + int maskImageID; + int overlayImageID; + int _drawX; + int _drawY; + int _imageID; + uint _blendStrength; + int _unitID; + int _gmID; + int _renderBatchSize; + int _alpha; + int _batchedUnitID; + + int renderCount5 = this->unitRender5; + int renderCount4 = this->unitRender4; + int renderCount3 = this->unitRender3; + int renderCount2 = this->unitRender2; + int renderCount1 = this->unitRender1; + this->unitBatchedRenderCounterUntil6 = this->unitBatchedRenderCounterUntil6 + 1; + _drawX = 0; + _drawY = 0; + _renderBatchSize = 0; + _unitID = 0; + _imageID = 0; + _blendStrength = 0; + _gmID = 0; + if (5 < (int)this->unitBatchedRenderCounterUntil6) { + this->unitBatchedRenderCounterUntil6 = 1; + } + if ((int)this->unitBatchedRenderCounterUntil6 == 1) { + this->unitRender1 = 0; + _renderBatchSize = renderCount1; + } else if ((int)this->unitBatchedRenderCounterUntil6 == 2) { + this->unitRender2 = 0; + _renderBatchSize = renderCount2; + } else if ((int)this->unitBatchedRenderCounterUntil6 == 3) { + this->unitRender3 = 0; + _renderBatchSize = renderCount3; + } else if ((int)this->unitBatchedRenderCounterUntil6 == 4) { + this->unitRender4 = 0; + _renderBatchSize = renderCount4; + } else if ((int)this->unitBatchedRenderCounterUntil6 == 5) { + this->unitRender5 = 0; + _renderBatchSize = renderCount5; + } + if (0 < _renderBatchSize) { + for (_batchedUnitID = 0; _batchedUnitID < _renderBatchSize; _batchedUnitID++) { + switch ((int)this->unitBatchedRenderCounterUntil6) { + case 1: + _unitID = this->unitBatch1[_batchedUnitID].unitIDOrStatus; + DAT_RenderedUnitOwner::instance = this->unitBatch1[_batchedUnitID].ownerColor; + DAT_CurrentlyRenderedSpriteID::instance = this->unitBatch1[_batchedUnitID].spriteID; + _imageID = this->unitBatch1[_batchedUnitID].imageID; + _drawY = this->unitBatch1[_batchedUnitID].drawY; + _drawX = this->unitBatch1[_batchedUnitID].drawX; + _blendStrength = this->unitBatch1[_batchedUnitID].blendStrength; + _gmID = this->unitBatch1[_batchedUnitID].gmID; + break; + case 2: + _unitID = this->unitBatch2[_batchedUnitID].unitIDOrStatus; + DAT_RenderedUnitOwner::instance = this->unitBatch2[_batchedUnitID].ownerColor; + DAT_CurrentlyRenderedSpriteID::instance = this->unitBatch2[_batchedUnitID].spriteID; + _imageID = this->unitBatch2[_batchedUnitID].imageID; + _drawY = this->unitBatch2[_batchedUnitID].drawY; + _drawX = this->unitBatch2[_batchedUnitID].drawX; + _blendStrength = this->unitBatch2[_batchedUnitID].blendStrength; + _gmID = this->unitBatch2[_batchedUnitID].gmID; + break; + case 3: + _unitID = this->unitBatch3[_batchedUnitID].unitIDOrStatus; + DAT_RenderedUnitOwner::instance = this->unitBatch3[_batchedUnitID].ownerColor; + DAT_CurrentlyRenderedSpriteID::instance = this->unitBatch3[_batchedUnitID].spriteID; + _imageID = this->unitBatch3[_batchedUnitID].imageID; + _drawY = this->unitBatch3[_batchedUnitID].drawY; + _drawX = this->unitBatch3[_batchedUnitID].drawX; + _blendStrength = this->unitBatch3[_batchedUnitID].blendStrength; + _gmID = this->unitBatch3[_batchedUnitID].gmID; + break; + case 4: + _unitID = this->unitBatch4[_batchedUnitID].unitIDOrStatus; + DAT_RenderedUnitOwner::instance = this->unitBatch4[_batchedUnitID].ownerColor; + DAT_CurrentlyRenderedSpriteID::instance = this->unitBatch4[_batchedUnitID].spriteID; + _imageID = this->unitBatch4[_batchedUnitID].imageID; + _drawY = this->unitBatch4[_batchedUnitID].drawY; + _drawX = this->unitBatch4[_batchedUnitID].drawX; + _blendStrength = this->unitBatch4[_batchedUnitID].blendStrength; + _gmID = this->unitBatch4[_batchedUnitID].gmID; + break; + case 5: + _unitID = this->unitBatch5[_batchedUnitID].unitIDOrStatus; + DAT_RenderedUnitOwner::instance = this->unitBatch5[_batchedUnitID].ownerColor; + DAT_CurrentlyRenderedSpriteID::instance = this->unitBatch5[_batchedUnitID].spriteID; + _imageID = this->unitBatch5[_batchedUnitID].imageID; + _drawY = this->unitBatch5[_batchedUnitID].drawY; + _drawX = this->unitBatch5[_batchedUnitID].drawX; + _blendStrength = this->unitBatch5[_batchedUnitID].blendStrength; + _gmID = this->unitBatch5[_batchedUnitID].gmID; + } + if (_unitID == -1) { + if ((int)_blendStrength < 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, _imageID, + _drawX, _drawY, (GmID)((int)(DAT_CurrentlyRenderedSpriteID::instance)), (int)((int)(_gmID)), + (int)((int)(-1 - _blendStrength))); + } else if (_blendStrength == 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + (eGM)DAT_CurrentlyRenderedSpriteID::instance, _imageID, _drawX, _drawY); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, _imageID, + _drawX, _drawY, (int)((int)(_blendStrength))); + } + } else if (_unitID == 0) { + if ((_blendStrength & 4) != 0) { + DAT_RenderedUnitOwner::instance = ~-(uint)((_blendStrength & 0x10) != 0) + & DAT_GameSynchronyState::instance.currentPlayerSlotID; + DAT_CurrentlyRenderedSpriteID::instance = _gmID; + } + if ((_blendStrength & 0x20) == 0) { + if ((_blendStrength & 0xffff0000) == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)((eGM)_gmID, _imageID, _drawX, _drawY); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + (GmID)_gmID, _imageID, _drawX, _drawY, (int)((int)(_blendStrength >> 0x10))); + } + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)((GmID)_gmID, _imageID, _drawX, _drawY, + (GmID)((int)(_gmID)), ((int)_blendStrength >> 0x10) + _imageID, 0); + } + } else { + savedPixelColor = *(short*)this->viewportState.ptrColor; + *(short*)this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + _alpha = (int)(char)DAT_UnitsState::instance.units[_unitID].disappearFadeAlphaCountdown; + if (DAT_UnitsState::instance.units[_unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) { + if (((DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[_unitID].owner] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]) + && (120 < DAT_UnitsState::instance.units[_unitID].assassinsMicroDistanceToEnemyUnk)) + && ((DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY + || (DAT_UnitsState::instance.units[_unitID].idleCounterUnk < 2400)))) { + _alpha = 0x20 - (0x20 - _alpha) / 2; + } + overlayX = DAT_UnitsState::instance.units[_unitID].imageID2; + if (overlayX != 0) { + overlayY = (0x20 - _alpha) / 3; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)(_drawX, _drawY, _imageID, + (int)((int)(_blendStrength)), + (byte*)(( + int)((DAT_GMImageSizes::instance[GMTotalPicturesProcessed::instance[( + int)DAT_CurrentlyRenderedSpriteID::instance] + + overlayX + 0x1c51f] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData))), + (0x10 - overlayY) * 2); + graphicSize = DAT_UnitsState::instance.units[_unitID].drawYOffset; + if (graphicSize != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)(_drawX, _drawY, _imageID, + (int)((int)(_blendStrength)), + (byte*)((int)(( + DAT_GMImageSizes::instance[GMTotalPicturesProcessed::instance[( + int)DAT_CurrentlyRenderedSpriteID::instance] + + (int)graphicSize + 0x1c51f] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData))), + 0x20 - overlayY); + } + } + } + if (_alpha == 0) { + if (DAT_UnitsState::instance.units[_unitID].graphicSize == 4) { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::renderAssassinClimbingOverlay, this)( + _unitID); + } + graphicSize = DAT_UnitsState::instance.units[_unitID].field59_0x86; + if (graphicSize < 0) { + overlayX = 0; + } else { + overlayX = (int)graphicSize; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)( + _drawX, graphicSize + _drawY, _imageID, _blendStrength - overlayX, (byte*)_gmID); + graphicSize = DAT_UnitsState::instance.units[_unitID].graphicSize; + if ((graphicSize != 4) && (1 < graphicSize)) { + DAT_RenderedUnitOwner::instance + = (uint)DAT_UnitsState::instance.units[_unitID].displayColorPlayerID; + DAT_CurrentlyRenderedSpriteID::instance + = (int)DAT_UnitsState::instance.units[_unitID].gmIDUnk; + overlayX = DAT_UnitsState::instance.units[_unitID].imageIDUnk; + if (0 < overlayX) { + graphicSize = DAT_UnitsState::instance.units[_unitID].field60_0x88; + if (graphicSize < 0) { + overlayY = 0; + } else { + overlayY = (int)graphicSize; + } + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)(_drawX, graphicSize + _drawY, _imageID, + _blendStrength - overlayY, + (byte*)((int)(( + DAT_GMImageSizes::instance[GMTotalPicturesProcessed::instance[( + int)DAT_CurrentlyRenderedSpriteID::instance] + + overlayX + 0x1c51f] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + } + } + if (2 < DAT_UnitsState::instance.units[_unitID].graphicSize) { + overlayX = DAT_UnitsState::instance.units[_unitID].imageID2; + if (0 < overlayX) { + graphicSize = DAT_UnitsState::instance.units[_unitID].drawYOffset; + if (graphicSize < 0) { + overlayY = 0; + } else { + overlayY = (int)graphicSize; + } + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationUnk, + DAT_TextureRenderCoreObject::ptr)(_drawX, graphicSize + _drawY, _imageID, + _blendStrength - overlayY, + (byte*)((int)(( + DAT_GMImageSizes::instance[GMTotalPicturesProcessed::instance[( + int)DAT_CurrentlyRenderedSpriteID::instance] + + overlayX + 0x1c51f] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + } + if (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY) { + unitType = DAT_UnitsState::instance.units[_unitID].unitType; + overlayX = _drawX; + overlayY = _drawY; + if ((unitType == OpenSHC::Map::Units::UT_S_TOWER) + && (DAT_UnitsState::instance.units[_unitID].dying == 0)) { + switch (DAT_UnitsState::instance.units[_unitID] + .facingDirectionMapOrientationCorrected) { + case 0: + overlayX = _drawX + 0x22; + break; + case 1: + overlayX = _drawX + 0x2f; + overlayY = _drawY + -0xc; + break; + case 2: + overlayX = _drawX + 0x4b; + overlayY = _drawY + -0x13; + break; + case 3: + overlayX = _drawX + 0x65; + overlayY = _drawY + -10; + break; + case 4: + overlayX = _drawX + 0x70; + overlayY = _drawY + 2; + break; + case 5: + overlayX = _drawX + 100; + overlayY = _drawY + 0x14; + break; + case 6: + overlayX = _drawX + 0x46; + overlayY = _drawY + 0x13; + break; + case 7: + overlayX = _drawX + 0x2c; + overlayY = _drawY + 0x17; + } + } else if ((unitType == OpenSHC::Map::Units::UT_S_BATTERINGRAM) + && (DAT_UnitsState::instance.units[_unitID].dying == 0)) { + switch (DAT_UnitsState::instance.units[_unitID] + .facingDirectionMapOrientationCorrected) { + case 0: + case 1: + overlayX = _drawX + 0x2c; + overlayY = _drawY + -0x14; + break; + case 2: + overlayX = _drawX + 0x31; + overlayY = _drawY + -0x11; + break; + case 3: + overlayX = _drawX + 0x29; + overlayY = _drawY + -0xf; + break; + case 4: + overlayX = _drawX + 0x22; + overlayY = _drawY + -0x11; + break; + case 5: + case 6: + overlayX = _drawX + 0x20; + overlayY = _drawY + -0x14; + break; + case 7: + overlayX = _drawX + 0x28; + overlayY = _drawY + -0x17; + } + } + DAT_RenderedUnitOwner::instance = (uint)DAT_UnitsState::instance.units[_unitID].owner; + DAT_CurrentlyRenderedSpriteID::instance = 0xbd; + animationTick = DAT_UnitsState::instance.units[_unitID].fixedRng + + DAT_GameState::instance.mapAndTime.totalGameTicksUnk + & 0x8000003f; + if ((int)animationTick < 0) { + animationTick = (animationTick - 1 | 0xffffffc0) + 1; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, + (int)((int)(animationTick / 2 + 1)), overlayX, overlayY); + } + } + if (*(short*)this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *(short*)this->viewportState.ptrColor = savedPixelColor; + } else { + this->viewportState.mouseRayUnitID = _unitID; + this->viewportState.mouseRayBuildingID = 0; + } + } else { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationWithBlendingUnk, + DAT_TextureRenderCoreObject::ptr)( + _drawX, _drawY, _imageID, (int)((int)(_blendStrength)), (byte*)_gmID, _alpha); + if (*(short*)this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *(short*)this->viewportState.ptrColor = savedPixelColor; + } else { + this->viewportState.mouseRayUnitID = _unitID; + this->viewportState.mouseRayBuildingID = 0; + } + } + if (0 < _unitID) { + if ((DAT_UnitsState::instance.units[_unitID].isSelected != 0) + && (DAT_UnitsState::instance.units[_unitID].usingTeleport == 0)) { + if (DAT_UnitsState::instance.units[_unitID].unitType == OpenSHC::Map::Units::UT_LORD) { + savedPixelColor = DAT_UnitsState::instance.units[_unitID].maxHealthRatingLord; + overlayX = (int)DAT_UnitsState::instance.units[_unitID].someDrawYOffset; + if (savedPixelColor == 0) { + overlayX = overlayX + -6 + _drawY; + overlayY = DAT_UnitsState::instance.units[_unitID].healthbar + 0x11; + } else { + overlayX = overlayX + -8 + _drawY; + overlayY = DAT_UnitsState::instance.units[_unitID].healthbar + 0xe4 + + savedPixelColor * 0xb; + } + } else { + overlayX = DAT_GameState::instance + .playerDataArray[DAT_UnitsState::instance.units[_unitID].owner] + .fearFactorLevel; + if (overlayX == 0) { + overlayX = DAT_UnitsState::instance.units[_unitID].someDrawYOffset + -6; + overlayY = DAT_UnitsState::instance.units[_unitID].healthbar + 0x11; + } else { + if (overlayX < 1) { + overlayY = overlayX * -0xb + 0xad; + } else { + overlayY = overlayX * 0xb + 0x76; + } + overlayX = DAT_UnitsState::instance.units[_unitID].someDrawYOffset + -8; + overlayY = DAT_UnitsState::instance.units[_unitID].healthbar + overlayY; + } + overlayX = overlayX + _drawY; + } + maskImageID = (_imageID + -0x16) / 2 + _drawX; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_FLOATS, overlayY, maskImageID, overlayX); + if (((DAT_UnitsState::instance.units[_unitID].unitType + == OpenSHC::Map::Units::UT_A_ASSASSIN) + && (DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[_unitID].owner] + == DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) + && ((DAT_UnitsState::instance.units[_unitID].assassinsMicroDistanceToEnemyUnk < 160 + || ((unitState = DAT_UnitsState::instance.units[_unitID].state.generic, + unitState == OpenSHC::Map::Units::States::US_MELEE_ATTACK + || (unitState == OpenSHC::Map::Units::States::US_MELEE_ATTACK_WALL)))))) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_INTERFACE_ICONS_2, + (int)((int)(447)), maskImageID + 2, + DAT_UnitsState::instance.units[_unitID].someDrawYOffset + -0x1b + _drawY, 0x10); + } + } + savedPixelColor = DAT_UnitsState::instance.units[_unitID].field46_0x6e; + if (savedPixelColor != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, + (int)((int)(savedPixelColor + 0xd4)), + (int)((int)(DAT_UnitsState::instance.units[_unitID].drawX)), + (int)((int)(DAT_UnitsState::instance.units[_unitID].drawY + -0x36 + + DAT_UnitsState::instance.units[_unitID].someDrawYOffset)), + OpenSHC::IO::Graphics::GID_FLOATS_NEW, (int)((int)(savedPixelColor + 0xdc)), 0); + DAT_UnitsState::instance.units[_unitID].field46_0x6e = 0; + } + savedPixelColor = DAT_UnitsState::instance.units[_unitID].field45_0x6c; + if (savedPixelColor != 0) { + overlayY = 0; + overlayX = 0; + if (savedPixelColor == 1) { + maskImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x30; + overlayX = DAT_UnitsState::instance.units[_unitID].drawY + -0x46 + + (int)DAT_UnitsState::instance.units[_unitID].someDrawYOffset; + overlayY = DAT_UnitsState::instance.units[_unitID].field22_0x2a + -0x35 + + (int)DAT_UnitsState::instance.units[_unitID].drawX; + overlayImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x20; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, + overlayImageID, overlayY, overlayX, OpenSHC::IO::Graphics::GID_FLOATS_NEW, + maskImageID, 0); + } else { + if (savedPixelColor == 2) { + switch (DAT_UnitsState::instance.units[_unitID].unitType) { + case OpenSHC::Map::Units::UT_S_CATAPULT: + overlayY = 0x29; + overlayX = 0x3a; + break; + case OpenSHC::Map::Units::UT_S_TREBUCHET: + case OpenSHC::Map::Units::UT_S_TOWER: + overlayY = 0x4f; + overlayX = 0x38; + break; + case OpenSHC::Map::Units::UT_S_MANGONEL: + overlayY = 0x2b; + overlayX = 0x23; + break; + case OpenSHC::Map::Units::UT_S_BATTERINGRAM: + overlayY = 0x24; + overlayX = 0x3d; + break; + case OpenSHC::Map::Units::UT_S_SHIELD: + overlayY = -3; + overlayX = 0x3c; + break; + case OpenSHC::Map::Units::UT_S_BALLISTA: + case OpenSHC::Map::Units::UT_S_FBALLISTA: + overlayY = 0x13; + overlayX = 0x24; + } + maskImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x84; + overlayX = ((int)DAT_UnitsState::instance.units[_unitID].drawY + + (int)DAT_UnitsState::instance.units[_unitID].someDrawYOffset) + - overlayX; + overlayY = DAT_UnitsState::instance.units[_unitID].drawX + overlayY; + overlayImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x74; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, + overlayImageID, overlayY, overlayX, OpenSHC::IO::Graphics::GID_FLOATS_NEW, + maskImageID, 0); + } + if (savedPixelColor == 3) { + switch (DAT_UnitsState::instance.units[_unitID].unitType) { + case OpenSHC::Map::Units::UT_S_CATAPULT: + overlayY = 0x29; + overlayX = 0x3a; + break; + case OpenSHC::Map::Units::UT_S_TREBUCHET: + case OpenSHC::Map::Units::UT_S_TOWER: + overlayY = 0x4f; + overlayX = 0x38; + break; + case OpenSHC::Map::Units::UT_S_MANGONEL: + overlayY = 0x2b; + overlayX = 0x23; + break; + case OpenSHC::Map::Units::UT_S_BATTERINGRAM: + overlayY = 0x24; + overlayX = 0x3d; + break; + case OpenSHC::Map::Units::UT_S_SHIELD: + overlayY = -3; + overlayX = 0x3c; + break; + case OpenSHC::Map::Units::UT_S_BALLISTA: + case OpenSHC::Map::Units::UT_S_FBALLISTA: + overlayY = 0x13; + overlayX = 0x24; + } + maskImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0xa4; + overlayX = ((int)DAT_UnitsState::instance.units[_unitID].drawY + + (int)DAT_UnitsState::instance.units[_unitID].someDrawYOffset) + - overlayX; + overlayY = DAT_UnitsState::instance.units[_unitID].drawX + overlayY; + overlayImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x94; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, + overlayImageID, overlayY, overlayX, OpenSHC::IO::Graphics::GID_FLOATS_NEW, + maskImageID, 0); + } + } + DAT_UnitsState::instance.units[_unitID].field45_0x6c = 0; + } + } + } + } + } + return; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 585e28132..fc36450f9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36987,7 +36987,7 @@ SHC_3BB0A8C1_0x004E7770 | 36.6% | LTCG ecx reuse in callers SHC_3BB0A8C1_0x004E7800 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E7810 | 0.0% | Pending +SHC_3BB0A8C1_0x004E7810 | 32.4% | frame and reg allocation diffe SHC_3BB0A8C1_0x004E78D0 | 0.0% | Pending From a642d6eab399dfa70f510b014d1d34f4c7c49f8a Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 23:51:38 +0200 Subject: [PATCH 31/77] reimplement: SHC_3BB0A8C1_0x004E66F0 59.97% consts kept in regs by orig --- .../ViewportRenderState/setupViewport.cpp | 799 ++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 800 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp new file mode 100644 index 000000000..ca363cb61 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp @@ -0,0 +1,799 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/Rendering/ScreenResolutionEnum.hpp" +#include "OpenSHC/UI/Enums/BuildingsAndStatusMenuTabType.hpp" +#include "OpenSHC/UI/Enums/MenuViewType.hpp" + +#include "OpenSHC/Globals/DAT_GameCore.hpp" +#include "OpenSHC/Globals/DAT_ScrollingHandler.hpp" +#include "OpenSHC/Globals/DAT_WindowAndDirectDraw.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::Rendering::ScreenResolutionEnum; + using OpenSHC::UI::Enums::BuildingsAndStatusMenuTabType; + using OpenSHC::UI::Enums::MenuViewType; + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 + */ + + // FUNCTION: STRONGHOLDCRUSADER 0x004E66F0 + void ViewportRenderState::setupViewport( + undefined4 windowX, undefined4 windowY, undefined4 screenPixelWidth, undefined4 screenPixelHeight) + + { + this->windowX = windowX; + this->windowY = windowX; + this->screenPixelHeight = screenPixelHeight; + this->screenPixelWidth = screenPixelWidth; + undefined4 someXOffsetDefault = 0xe; + if (((DAT_GameCore::instance.currentMenuViewType == OpenSHC::UI::Enums::MVT_BUILD_MENU) + || (DAT_GameCore::instance.currentMenuViewType == OpenSHC::UI::Enums::MVT_MAP_EDITOR_LANDSCAPING)) + && ((DAT_GameCore::instance.activeMenuTab.tabType == OpenSHC::UI::Enums::BASMTT_SIEGETENT_SIEGETOWER + || (DAT_GameCore::instance.activeMenuTab.tabType == OpenSHC::UI::Enums::BASMTT_SIEGETENT_SHIELD)))) { + if (this->viewportState.isZoomedOutUnk == 0) { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_800x600) { + this->viewportState.viewportHeight = 30; + this->viewportState.viewportWidth = 79; + this->viewportState.mbr_0xac = 0xc; + this->viewportState.mbr_0xb0 = 40; + DAT_ScrollingHandler::instance.field12_0x30 = 0x14; + DAT_ScrollingHandler::instance.field13_0x34 = 40; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 30; + this->viewportState.someXOffset = 8; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x768) { + this->viewportState.viewportHeight = 0x25; + this->viewportState.viewportWidth = 100; + this->viewportState.mbr_0xac = 0xf; + this->viewportState.mbr_0xb0 = 0x2e; + DAT_ScrollingHandler::instance.field12_0x30 = 0x11; + DAT_ScrollingHandler::instance.field13_0x34 = 0x34; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x23; + this->viewportState.someXOffset = 10; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == 15) { + this->viewportState.viewportHeight = 0x25; + this->viewportState.viewportWidth = 0x4f; + this->viewportState.mbr_0xac = 15; + this->viewportState.mbr_0xb0 = 0x28; + DAT_ScrollingHandler::instance.field12_0x30 = 0x11; + DAT_ScrollingHandler::instance.field13_0x34 = 0x34; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x23; + this->viewportState.someXOffset = 10; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x1024) { + this->viewportState.viewportHeight = 0x2d; + this->viewportState.viewportWidth = 0x84; + this->viewportState.mbr_0xac = 0x13; + this->viewportState.mbr_0xb0 = 0x34; + DAT_ScrollingHandler::instance.field12_0x30 = 15; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x28; + this->viewportState.someXOffset = 0xc; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == 20) { + this->viewportState.viewportWidth = 0x40; + this->viewportState.viewportHeight = 0x19; + this->viewportState.mbr_0xac = 10; + this->viewportState.mbr_0xb0 = 0x1e; + DAT_ScrollingHandler::instance.field12_0x30 = 0x28; + DAT_ScrollingHandler::instance.field13_0x34 = 0x14; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x1e; + this->viewportState.someXOffset = 7; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1600x1200) { + this->viewportState.viewportWidth = 0x9a; + this->viewportState.mbr_0xb0 = 0x50; + } else { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x720) { + this->viewportState.viewportHeight = 45; + this->viewportState.viewportWidth = 94; + this->viewportState.mbr_0xac = 19; + this->viewportState.mbr_0xb0 = 48; + DAT_ScrollingHandler::instance.field12_0x30 = 15; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x34; + this->viewportState.someXOffset = 0x11; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1440x900) { + this->viewportState.viewportWidth = 0x74; + this->viewportState.viewportHeight = 0x32; + this->viewportState.mbr_0xac = 0x16; + this->viewportState.mbr_0xb0 = 0x3c; + this->viewportState.someXOffset = 10; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + someXOffsetDefault = 10; + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1920x1080) { + this->viewportState.viewportWidth = 0x8b; + this->viewportState.viewportHeight = 0x41; + this->viewportState.mbr_0xac = 0x1d; + this->viewportState.mbr_0xb0 = 0x48; + this->viewportState.someXOffset = 0xd; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1920x1200) { + this->viewportState.viewportWidth = 0x9a; + this->viewportState.mbr_0xac = 0x1d; + this->viewportState.viewportHeight = 0x41; + this->viewportState.mbr_0xb0 = 0x50; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x4c; + this->viewportState.someXOffset = 0xe; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1440) { + this->viewportState.viewportWidth = 184; + this->viewportState.mbr_0xb0 = 96; + this->viewportState.viewportHeight = 85; + this->viewportState.mbr_0xac = 39; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 100; + this->viewportState.someXOffset = 16; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1600) { + this->viewportState.viewportWidth = 0xcc; + this->viewportState.mbr_0xb0 = 0x70; + this->viewportState.viewportHeight = 85; + this->viewportState.mbr_0xac = 39; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 100; + this->viewportState.someXOffset = 16; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if ((DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1366x768) + || (DAT_WindowAndDirectDraw::instance.currentGameResolution + == OpenSHC::Rendering::SRE_1360x768)) { + this->viewportState.viewportHeight = 0x30; + this->viewportState.viewportWidth = 100; + this->viewportState.mbr_0xac = 0x16; + this->viewportState.mbr_0xb0 = 0x2e; + this->viewportState.someXOffset = someXOffsetDefault; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1680x1050) { + this->viewportState.viewportHeight = 0x3a; + this->viewportState.viewportWidth = 0x87; + this->viewportState.mbr_0xac = 0x18; + this->viewportState.mbr_0xb0 = 0x48; + this->viewportState.someXOffset = 0xd; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution != OpenSHC::Rendering::SRE_1600x900) { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + this->viewportState.viewportWidth = 0x74; + this->viewportState.mbr_0xb0 = 0x3c; + } + this->viewportState.viewportHeight = 0x37; + this->viewportState.mbr_0xac = 0x18; + this->viewportState.someXOffset = someXOffsetDefault; + } else { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_800x600) { + this->viewportState.viewportHeight = 0x3c; + this->viewportState.viewportWidth = 0x9e; + this->viewportState.mbr_0xac = 0x1f; + this->viewportState.mbr_0xb0 = 0x44; + DAT_ScrollingHandler::instance.field12_0x30 = 10; + DAT_ScrollingHandler::instance.field13_0x34 = 0x50; + DAT_ScrollingHandler::instance.field11_0x2c = 2; + this->viewportState.someYOffset = 0x41; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x768) { + this->viewportState.viewportHeight = 0x4a; + this->viewportState.viewportWidth = 200; + this->viewportState.mbr_0xac = 0x24; + this->viewportState.mbr_0xb0 = 0x54; + DAT_ScrollingHandler::instance.field12_0x30 = 7; + DAT_ScrollingHandler::instance.field13_0x34 = 100; + DAT_ScrollingHandler::instance.field11_0x2c = 3; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x600) { + this->viewportState.viewportHeight = 0x4a; + this->viewportState.viewportWidth = 0x9e; + this->viewportState.mbr_0xac = 0x24; + this->viewportState.mbr_0xb0 = 0x44; + DAT_ScrollingHandler::instance.field12_0x30 = 7; + DAT_ScrollingHandler::instance.field13_0x34 = 100; + DAT_ScrollingHandler::instance.field11_0x2c = 3; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x1024) { + this->viewportState.viewportHeight = 0x5a; + this->viewportState.viewportWidth = 0x108; + this->viewportState.mbr_0xac = 0x29; + this->viewportState.mbr_0xb0 = 0x5e; + DAT_ScrollingHandler::instance.field12_0x30 = 5; + DAT_ScrollingHandler::instance.field13_0x34 = 100; + DAT_ScrollingHandler::instance.field11_0x2c = 3; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_640x480) { + this->viewportState.viewportWidth = 0x80; + this->viewportState.viewportHeight = 0x32; + this->viewportState.mbr_0xac = 0x19; + this->viewportState.mbr_0xb0 = 0x32; + DAT_ScrollingHandler::instance.field12_0x30 = 0x14; + DAT_ScrollingHandler::instance.field13_0x34 = 0x28; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x1e; + this->viewportState.someXOffset = 7; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1600x1200) { + this->viewportState.viewportWidth = 0x134; + this->viewportState.viewportHeight = 0x6e; + this->viewportState.mbr_0xac = 0x32; + this->viewportState.mbr_0xb0 = 0x6e; + this->viewportState.someXOffset = 6; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x720) { + this->viewportState.viewportHeight = 0x5a; + this->viewportState.viewportWidth = 0xbc; + this->viewportState.mbr_0xac = 0x29; + this->viewportState.mbr_0xb0 = 0x50; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x34; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1440x900) { + this->viewportState.viewportHeight = 100; + this->viewportState.viewportWidth = 0xe8; + this->viewportState.mbr_0xac = 0x2f; + this->viewportState.mbr_0xb0 = 0x5a; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution + == OpenSHC::Rendering::SRE_1920x1080) { + this->viewportState.viewportHeight = 0x82; + this->viewportState.viewportWidth = 0x116; + this->viewportState.mbr_0xac = 0x38; + this->viewportState.mbr_0xb0 = 100; + } else { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1920x1200) { + this->viewportState.viewportHeight = 0x82; + this->viewportState.viewportWidth = 0x134; + this->viewportState.mbr_0xac = 0x38; + this->viewportState.mbr_0xb0 = 0x6e; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x4c; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1440) { + this->viewportState.viewportWidth = 0x170; + this->viewportState.mbr_0xb0 = 0x78; + this->viewportState.viewportHeight = 0xaa; + this->viewportState.mbr_0xac = 0x47; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 100; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1600) { + this->viewportState.viewportWidth = 0x198; + this->viewportState.mbr_0xb0 = 0x82; + this->viewportState.viewportHeight = 0xaa; + this->viewportState.mbr_0xac = 0x47; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 100; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if ((DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1366x768) + || (DAT_WindowAndDirectDraw::instance.currentGameResolution + == OpenSHC::Rendering::SRE_1360x768)) { + this->viewportState.viewportHeight = 0x60; + this->viewportState.viewportWidth = 200; + this->viewportState.mbr_0xac = 0x2f; + this->viewportState.mbr_0xb0 = 0x54; + this->viewportState.someXOffset = 3; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1680x1050) { + this->viewportState.viewportHeight = 0x74; + this->viewportState.viewportWidth = 0x10e; + this->viewportState.mbr_0xb0 = 100; + } else { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution + != OpenSHC::Rendering::SRE_1600x900) { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + this->viewportState.viewportWidth = 0xe8; + this->viewportState.mbr_0xb0 = 0x55; + this->viewportState.viewportHeight = 0x6e; + } + this->viewportState.mbr_0xac = 0x32; + } + this->viewportState.someXOffset = 6; + } + } else if (this->viewportState.isZoomedOutUnk == 0) { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_800x600) { + this->viewportState.viewportHeight = 0x1e; + this->viewportState.viewportWidth = 0x3f; + this->viewportState.mbr_0xac = 0xc; + this->viewportState.mbr_0xb0 = 0x28; + DAT_ScrollingHandler::instance.field12_0x30 = 0x14; + DAT_ScrollingHandler::instance.field13_0x34 = 0x28; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x1e; + this->viewportState.someXOffset = 7; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x768) { + this->viewportState.viewportHeight = 0x25; + this->viewportState.viewportWidth = 0x54; + this->viewportState.mbr_0xac = 0xf; + this->viewportState.mbr_0xb0 = 0x2e; + DAT_ScrollingHandler::instance.field12_0x30 = 0x11; + DAT_ScrollingHandler::instance.field13_0x34 = 0x34; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x28; + this->viewportState.someXOffset = 8; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x600) { + this->viewportState.viewportHeight = 0x25; + this->viewportState.viewportWidth = 0x3f; + this->viewportState.mbr_0xac = 0xf; + this->viewportState.mbr_0xb0 = 0x28; + DAT_ScrollingHandler::instance.field12_0x30 = 0x11; + DAT_ScrollingHandler::instance.field13_0x34 = 0x34; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x28; + this->viewportState.someXOffset = 8; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x1024) { + this->viewportState.viewportHeight = 0x2d; + this->viewportState.viewportWidth = 0x74; + this->viewportState.mbr_0xac = 0x13; + this->viewportState.mbr_0xb0 = 0x34; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x34; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x32; + this->viewportState.someXOffset = 8; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_640x480) { + this->viewportState.viewportWidth = 0x30; + this->viewportState.viewportHeight = 0x19; + this->viewportState.mbr_0xac = 10; + this->viewportState.mbr_0xb0 = 0x1e; + DAT_ScrollingHandler::instance.field12_0x30 = 0x28; + DAT_ScrollingHandler::instance.field13_0x34 = 0x14; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x1e; + this->viewportState.someXOffset = 7; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1600x1200) { + this->viewportState.viewportWidth = 0x8a; + this->viewportState.mbr_0xb0 = 0x50; + this->viewportState.viewportHeight = 0x37; + this->viewportState.mbr_0xac = 0x18; + this->viewportState.someXOffset = someXOffsetDefault; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x720) { + this->viewportState.viewportHeight = 0x2d; + this->viewportState.viewportWidth = 0x4e; + this->viewportState.mbr_0xac = 0x13; + this->viewportState.mbr_0xb0 = 0x30; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x34; + this->viewportState.someXOffset = 0x11; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1440x900) { + this->viewportState.viewportWidth = 100; + this->viewportState.viewportHeight = 0x32; + this->viewportState.mbr_0xac = 0x16; + this->viewportState.mbr_0xb0 = 0x3c; + this->viewportState.someXOffset = 10; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + someXOffsetDefault = 10; + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1920x1080) { + this->viewportState.viewportWidth = 0x7b; + this->viewportState.viewportHeight = 0x41; + this->viewportState.mbr_0xac = 0x1d; + this->viewportState.mbr_0xb0 = 0x48; + this->viewportState.someXOffset = 0xd; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1920x1200) { + this->viewportState.viewportWidth = 0x8a; + this->viewportState.mbr_0xac = 0x27; + this->viewportState.viewportHeight = 0x41; + this->viewportState.mbr_0xb0 = 0x50; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x4c; + this->viewportState.someXOffset = 0xe; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1440) { + this->viewportState.viewportWidth = 0xa8; + this->viewportState.mbr_0xb0 = 0x5a; + this->viewportState.viewportHeight = 85; + this->viewportState.mbr_0xac = 39; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 100; + this->viewportState.someXOffset = 16; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1600) { + this->viewportState.viewportHeight = 0x55; + this->viewportState.viewportWidth = 0xbc; + this->viewportState.mbr_0xac = 0x1d; + this->viewportState.mbr_0xb0 = 100; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 100; + this->viewportState.someXOffset = 0x12; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if ((DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1366x768) + || (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1360x768)) { + this->viewportState.viewportHeight = 0x30; + this->viewportState.viewportWidth = 0x54; + this->viewportState.mbr_0xac = 0x16; + this->viewportState.mbr_0xb0 = 0x2e; + this->viewportState.someXOffset = 8; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution != OpenSHC::Rendering::SRE_1680x1050) { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution != OpenSHC::Rendering::SRE_1600x900) { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + this->viewportState.viewportWidth = 100; + this->viewportState.mbr_0xb0 = 0x3c; + this->viewportState.viewportHeight = 0x37; + this->viewportState.mbr_0xac = 0x18; + this->viewportState.someXOffset = someXOffsetDefault; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + this->viewportState.viewportHeight = 0x3a; + this->viewportState.viewportWidth = 0x77; + this->viewportState.mbr_0xac = 0x18; + this->viewportState.mbr_0xb0 = 0x48; + this->viewportState.someXOffset = 0xd; + } else { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_800x600) { + this->viewportState.viewportHeight = 0x3c; + this->viewportState.viewportWidth = 0x7e; + this->viewportState.mbr_0xac = 0x1f; + this->viewportState.mbr_0xb0 = 0x44; + DAT_ScrollingHandler::instance.field12_0x30 = 10; + DAT_ScrollingHandler::instance.field13_0x34 = 0x50; + DAT_ScrollingHandler::instance.field11_0x2c = 2; + this->viewportState.someYOffset = 0x41; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x768) { + this->viewportState.viewportHeight = 0x4a; + this->viewportState.viewportWidth = 0xa8; + this->viewportState.mbr_0xac = 0x24; + this->viewportState.mbr_0xb0 = 0x54; + DAT_ScrollingHandler::instance.field12_0x30 = 7; + DAT_ScrollingHandler::instance.field13_0x34 = 100; + DAT_ScrollingHandler::instance.field11_0x2c = 3; + this->viewportState.someYOffset = 0x4e; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x600) { + this->viewportState.viewportHeight = 0x4a; + this->viewportState.viewportWidth = 0x7e; + this->viewportState.mbr_0xac = 0x24; + this->viewportState.mbr_0xb0 = 0x44; + DAT_ScrollingHandler::instance.field12_0x30 = 7; + DAT_ScrollingHandler::instance.field13_0x34 = 100; + DAT_ScrollingHandler::instance.field11_0x2c = 3; + this->viewportState.someYOffset = 0x4e; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x1024) { + this->viewportState.viewportHeight = 0x5a; + this->viewportState.viewportWidth = 0xe8; + this->viewportState.mbr_0xac = 0x29; + this->viewportState.mbr_0xb0 = 0x5e; + DAT_ScrollingHandler::instance.field12_0x30 = 5; + DAT_ScrollingHandler::instance.field13_0x34 = 100; + DAT_ScrollingHandler::instance.field11_0x2c = 3; + this->viewportState.someYOffset = 0x5b; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_640x480) { + this->viewportState.viewportWidth = 0x60; + this->viewportState.viewportHeight = 0x32; + this->viewportState.mbr_0xac = 0x19; + this->viewportState.mbr_0xb0 = 0x32; + DAT_ScrollingHandler::instance.field12_0x30 = 0x14; + DAT_ScrollingHandler::instance.field13_0x34 = 0x28; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x1e; + this->viewportState.someXOffset = 7; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution != OpenSHC::Rendering::SRE_1600x1200) { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1280x720) { + this->viewportState.viewportHeight = 0x5a; + this->viewportState.viewportWidth = 0x9c; + this->viewportState.mbr_0xac = 0x29; + this->viewportState.mbr_0xb0 = 0x50; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x34; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1440x900) { + this->viewportState.viewportHeight = 100; + this->viewportState.viewportWidth = 200; + this->viewportState.mbr_0xac = 0x2f; + this->viewportState.mbr_0xb0 = 0x5a; + } else if (DAT_WindowAndDirectDraw::instance.currentGameResolution + == OpenSHC::Rendering::SRE_1920x1080) { + this->viewportState.viewportHeight = 0x82; + this->viewportState.viewportWidth = 0xf6; + this->viewportState.mbr_0xac = 0x38; + this->viewportState.mbr_0xb0 = 100; + } else { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1920x1200) { + this->viewportState.viewportHeight = 0x82; + this->viewportState.viewportWidth = 0x114; + this->viewportState.mbr_0xac = 0x38; + this->viewportState.mbr_0xb0 = 0x6e; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x4c; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1440) { + this->viewportState.viewportWidth = 0x150; + this->viewportState.mbr_0xb0 = 0x78; + this->viewportState.viewportHeight = 0xaa; + this->viewportState.mbr_0xac = 0x47; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 100; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if (DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_2560x1600) { + this->viewportState.viewportWidth = 0x178; + this->viewportState.mbr_0xb0 = 0x82; + this->viewportState.viewportHeight = 0xaa; + this->viewportState.mbr_0xac = 0x47; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 100; + this->viewportState.someXOffset = 6; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + if ((DAT_WindowAndDirectDraw::instance.currentGameResolution != OpenSHC::Rendering::SRE_1366x768) + && (DAT_WindowAndDirectDraw::instance.currentGameResolution + != OpenSHC::Rendering::SRE_1360x768)) { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution + != OpenSHC::Rendering::SRE_1680x1050) { + if (DAT_WindowAndDirectDraw::instance.currentGameResolution + != OpenSHC::Rendering::SRE_1600x900) { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + this->viewportState.viewportWidth = 200; + this->viewportState.mbr_0xb0 = 0x55; + this->viewportState.viewportHeight = 0x6e; + this->viewportState.mbr_0xac = 0x32; + this->viewportState.someXOffset = 6; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + this->viewportState.viewportHeight = 0x74; + this->viewportState.viewportWidth = 0xee; + this->viewportState.mbr_0xb0 = 100; + this->viewportState.mbr_0xac = 0x32; + this->viewportState.someXOffset = 6; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + this->viewportState.viewportHeight = 0x60; + this->viewportState.viewportWidth = 0xa8; + this->viewportState.mbr_0xac = 0x2f; + this->viewportState.mbr_0xb0 = 0x54; + } + this->viewportState.someXOffset = 6; + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + this->viewportState.viewportWidth = 0x114; + this->viewportState.viewportHeight = 0x6e; + this->viewportState.mbr_0xac = 0x32; + this->viewportState.mbr_0xb0 = 0x6e; + this->viewportState.someXOffset = 6; + } + DAT_ScrollingHandler::instance.field13_0x34 = 0x3c; + DAT_ScrollingHandler::instance.field12_0x30 = 0xf; + DAT_ScrollingHandler::instance.field11_0x2c = 1; + this->viewportState.someYOffset = 0x40; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); + return; + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index fc36450f9..cd07ceaf8 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36981,7 +36981,7 @@ SHC_3BB0A8C1_0x004E6410 | 0.0% | Pending SHC_3BB0A8C1_0x004E64D0 | 86.9% | reccmp label noise only -SHC_3BB0A8C1_0x004E66F0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E66F0 | 60.0% | consts kept in regs by orig SHC_3BB0A8C1_0x004E7770 | 36.6% | LTCG ecx reuse in callers From 1b0f517da9ad48ae48de4b220ab69d01ca733878 Mon Sep 17 00:00:00 2001 From: Gynt Date: Sun, 27 Sep 2026 23:51:39 +0200 Subject: [PATCH 32/77] reimplement: SHC_3BB0A8C1_0x004E8430 44.09% reg alloc + tail merging --- .../updateBuildingPreviewPosition.cpp | 382 ++++++++++++++++++ status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 383 insertions(+), 1 deletion(-) create mode 100644 src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp diff --git a/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp new file mode 100644 index 000000000..c5fae97a2 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp @@ -0,0 +1,382 @@ +#include "OpenSHC/Map/TileMapState.func.hpp" +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" +#include "OpenSHC/UI/BottomLeftTextDisplayState.func.hpp" +#include "OpenSHC/UI/MinimapViewState.func.hpp" +#include "OpenSHC/Map/Buildings/BuildingType.hpp" +#include "OpenSHC/Map/Buildings/BuildingTypeShort.hpp" +#include "OpenSHC/Map/Units/States/UnitState.hpp" +#include "OpenSHC/Map/Units/UnitType.hpp" +#include "OpenSHC/UI/Enums/BuildingsAndStatusMenuTabType.hpp" +#include "OpenSHC/UI/Enums/MenuViewType.hpp" +#include "OpenSHC/UI/TextMessageBLLookupStructUnion.hpp" + +#include "OpenSHC/Globals/DAT_BottomLeftTextDisplayState.hpp" +#include "OpenSHC/Globals/DAT_BuildingsState.hpp" +#include "OpenSHC/Globals/DAT_GMImageHeaders.hpp" +#include "OpenSHC/Globals/DAT_GameCore.hpp" +#include "OpenSHC/Globals/DAT_MapRenderDefinedData.hpp" +#include "OpenSHC/Globals/DAT_MenuHandlerState.hpp" +#include "OpenSHC/Globals/DAT_MinimapViewState.hpp" +#include "OpenSHC/Globals/DAT_TextureRenderCoreObject.hpp" +#include "OpenSHC/Globals/DAT_TileMapState.hpp" +#include "OpenSHC/Globals/DAT_UnitPropertiesDefinedData.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Rendering { + + using OpenSHC::Map::Buildings::BuildingType; + using OpenSHC::Map::Buildings::BuildingTypeShort; + using OpenSHC::Map::Units::UnitType; + using OpenSHC::Map::Units::States::UnitState; + using OpenSHC::UI::TextMessageBLLookupStructUnion; + using OpenSHC::UI::Enums::BuildingsAndStatusMenuTabType; + using OpenSHC::UI::Enums::MenuViewType; + + // FUNCTION: STRONGHOLDCRUSADER 0x004E8430 + void ViewportRenderState::updateBuildingPreviewPosition(int mouseXScreenSpace, int mouseYScreenSpace) + { + int orientationBase = 8; + + this->viewportState.field0_0x0 = 1; + if (mouseYScreenSpace - (int)this->windowY < 0) { + this->viewportState.field0_0x0 = 0; + } + if (mouseYScreenSpace - (int)this->windowY >= (int)this->screenPixelHeight) { + this->viewportState.field0_0x0 = 0; + } + if (mouseXScreenSpace - (int)this->windowX < 0) { + this->viewportState.field0_0x0 = 0; + } + if (mouseXScreenSpace - (int)this->windowX >= (int)this->screenPixelWidth) { + this->viewportState.field0_0x0 = 0; + } + + if (DAT_TextureRenderCoreObject::instance.activeMenuTabIndex != 0) { + int hitBoxRow = (DAT_TextureRenderCoreObject::instance.activeMenuTabIndex * 5 - 5) * 2; + int nextHitBoxRow = (DAT_TextureRenderCoreObject::instance.activeMenuTabIndex * 5 - 5) * 2; + int hitBoxAnchor = DAT_MapRenderDefinedData::instance.BuildingPreviewPositionRelatedOffsets[hitBoxRow][0].x; + if (hitBoxAnchor != -1) { + do { + if (mouseXScreenSpace >= DAT_MenuHandlerState::instance.x + hitBoxAnchor + && mouseXScreenSpace + <= DAT_MapRenderDefinedData::instance.BuildingPreviewPositionRelatedOffsets[hitBoxRow][1].x + + hitBoxAnchor + DAT_MenuHandlerState::instance.x + && (hitBoxAnchor + = DAT_MapRenderDefinedData::instance.BuildingPreviewPositionRelatedOffsets[hitBoxRow][0].y, + mouseYScreenSpace >= hitBoxAnchor + DAT_MenuHandlerState::instance.y) + && mouseYScreenSpace + <= DAT_MapRenderDefinedData::instance.BuildingPreviewPositionRelatedOffsets[hitBoxRow][1].y + + hitBoxAnchor + DAT_MenuHandlerState::instance.y) { + this->viewportState.field0_0x0 = 0; + return; + } + hitBoxAnchor + = DAT_MapRenderDefinedData::instance.BuildingPreviewPositionRelatedOffsets[nextHitBoxRow + 1][0] + .x; + hitBoxRow = nextHitBoxRow + 1; + nextHitBoxRow = hitBoxRow; + } while (hitBoxAnchor != -1); + } + } + + if (this->viewportState.field0_0x0 == 0) { + if (DAT_GameCore::instance.currentMenuViewType != OpenSHC::UI::Enums::MVT_BUILD_MENU) { + return; + } + if (DAT_GameCore::instance.activeMenuTab.tabType != OpenSHC::UI::Enums::BASMTT_SIEGETENT_BATTERINGRAM + && DAT_TileMapState::instance.shiftRelated0or3 != 1) { + return; + } + + mouseXScreenSpace = 0; + mouseYScreenSpace = 0; + MACRO_CALL_MEMBER(OpenSHC::UI::MinimapViewState_Func::convertMinimapClickToTileXY, + DAT_MinimapViewState::ptr)(&mouseXScreenSpace, &mouseYScreenSpace); + if (mouseXScreenSpace == -1) { + return; + } + + int minimapTile = this->translationMatrix[mouseYScreenSpace].addXgetTile + mouseXScreenSpace; + this->viewportState.field18_0x48 = 0; + this->viewportState.field6_0x18 = DAT_TileMapState::instance.BuildingLayer[minimapTile]; + this->viewportState.field8_0x20 = (short)DAT_TileMapState::instance.UnitLayer[minimapTile]; + this->viewportState.mouseRayEntityID = DAT_TileMapState::instance.EntityLayer[minimapTile]; + + int minimapGateTile = 0; + if (DAT_TileMapState::instance.BuildingLayer[minimapTile] <= 0) { + if ((DAT_TileMapState::instance.LogicLayer[minimapTile] & 0x100U) != 0) { + minimapGateTile = minimapTile; + } else if (DAT_TileMapState::instance.BuildingLayer[minimapTile] <= 0) { + this->viewportState.field18_0x48 = DAT_TileMapState::instance.BuildingWasLayer[minimapTile]; + } + } + if (0 <= minimapGateTile) { + this->viewportState.mouseRayBuildingID = 0; + this->viewportState.field21_0x54 = minimapGateTile; + } + + this->viewportState.mouseX = mouseXScreenSpace; + this->viewportState.mouseTileX = mouseXScreenSpace; + this->viewportState.mouseY = mouseYScreenSpace; + this->viewportState.mouseTileY = mouseYScreenSpace; + this->viewportState.field14_0x38 = DAT_TileMapState::instance.LogicLayer[minimapTile] & 0x40000000; + this->viewportState.mouseTile = minimapTile; + this->viewportState.field24_0x60 = minimapTile; + this->viewportState.mouseAtomRefFloorTile = minimapTile; + if (MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, DAT_TileMapState::ptr)( + minimapTile) + == 0) { + this->viewportState.field14_0x38 = 0; + } + this->viewportState.field16_0x40 = DAT_TileMapState::instance.LogicLayer[minimapTile] & 0x4000; + return; + } + + int tileColumnX; + uint tileRowY; + if (this->viewportState.isZoomedOutUnk == 0) { + int viewportXInTile = this->viewportState.viewportX & 0x8000001f; + if (viewportXInTile < 0) { + viewportXInTile = (viewportXInTile - 1 | (int)0xffffffe0) + 1; + } + tileColumnX = (viewportXInTile - this->windowX) + mouseXScreenSpace; + tileRowY = ((this->viewportState.viewportY & 0x8000000fU) - this->windowY) + -8 + mouseYScreenSpace; + } else { + int viewportXInTile = this->viewportState.viewportX & 0x8000001f; + if (viewportXInTile < 0) { + viewportXInTile = (viewportXInTile - 1 | (int)0xffffffe0) + 1; + } + tileColumnX = (viewportXInTile + mouseXScreenSpace * 2) - this->windowX; + tileRowY = (((this->viewportState.viewportY & 0x8000000fU) - 8) + mouseYScreenSpace * 2) - this->windowY; + } + uint quadrantX = tileColumnX >> 1 & 0xf; + uint quadrantY = tileRowY & 0xf; + + if (DAT_TileMapState::instance.mapOrientation == 0) { + orientationBase = 8; + } else if (DAT_TileMapState::instance.mapOrientation == 6) { + orientationBase = 0x13a18; + } else if (DAT_TileMapState::instance.mapOrientation == 4) { + orientationBase = 0x27428; + } else if (DAT_TileMapState::instance.mapOrientation == 2) { + orientationBase = 0x3ae38; + } + + int unclampedY; + int unclampedX; + if (this->viewportState.isZoomedOutUnk == 0) { + unclampedY = (this->viewportState.viewportY - this->windowY) + 8 + mouseYScreenSpace; + unclampedY = unclampedY + (unclampedY >> 0x1f & 0xfU); + unclampedX = (this->viewportState.viewportX - this->windowX) + mouseXScreenSpace; + } else { + unclampedY = ((mouseYScreenSpace * 2 + 8) - this->windowY) + this->viewportState.viewportY; + unclampedY = unclampedY + (unclampedY >> 0x1f & 0xfU); + unclampedX = ((mouseXScreenSpace * 2 + 0xa0) - this->windowX) + this->viewportState.viewportX; + } + + int quadrant = DAT_MapRenderDefinedData::instance.field618_0xc24[quadrantY][quadrantX]; + int lookupIndex + = ((int)(unclampedX + (unclampedX >> 0x1f & 0x1fU)) >> 5) + orientationBase + (unclampedY >> 4) * 0x191; + if (quadrant == 1) { + lookupIndex = lookupIndex + 200; + } else if (quadrant == 2) { + lookupIndex = lookupIndex + 0xc9; + } else if (quadrant == 3) { + lookupIndex = lookupIndex + 0x191; + } + + this->viewportState.mouseTile = this->screenPointToTileNumber[lookupIndex + -8]; + this->viewportState.field5_0x14 = DAT_TileMapState::instance.LogicLayer[this->viewportState.mouseTile]; + this->viewportState.field6_0x18 = DAT_TileMapState::instance.BuildingLayer[this->viewportState.mouseTile]; + this->viewportState.field8_0x20 = (short)DAT_TileMapState::instance.UnitLayer[this->viewportState.mouseTile]; + this->viewportState.field18_0x48 = 0; + + if (this->viewportState.mouseRayUnitID != 0) { + this->viewportState.mouseRayLastUnitID = this->viewportState.mouseRayUnitID; + this->viewportState.field13_0x34 = timeGetTime(); + if (DAT_UnitsState::instance.units[this->viewportState.mouseRayUnitID].unitType + == OpenSHC::Map::Units::UT_S_TOWER + && DAT_UnitsState::instance.units[this->viewportState.mouseRayUnitID].state.generic + == (OpenSHC::Map::Units::States::US_STAND_UPUnk | OpenSHC::Map::Units::States::US_IDLEUnk)) { + this->viewportState.mouseRayBuildingID + = DAT_UnitsState::instance.units[this->viewportState.mouseRayUnitID].workplaceBuildingID_1; + this->viewportState.mouseRayUnitID = 0; + } + } + + this->viewportState.field19_0x4c = DAT_MapRenderDefinedData::instance.field619_0x1024[quadrantY][quadrantX]; + this->viewportState.field20_0x50 = DAT_MapRenderDefinedData::instance.field620_0x1424[quadrantY][quadrantX]; + this->viewportState.field22_0x58 + = DAT_UnitPropertiesDefinedData::instance + .field77_0x10f4c[this->viewportState.field19_0x4c + this->viewportState.field20_0x50 * 8][0]; + this->viewportState.field23_0x5c + = DAT_UnitPropertiesDefinedData::instance + .field77_0x10f4c[this->viewportState.field19_0x4c + this->viewportState.field20_0x50 * 8][1]; + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setupMouseTileXY2, this)(); + + int lastBuildingID = -1; + int hoveredBuildingID = -1; + int hoveredGateTile = -1; + if (DAT_TileMapState::instance.BuildingLayer[this->viewportState.mouseTile] <= 0) { + if ((DAT_TileMapState::instance.LogicLayer[this->viewportState.mouseTile] & 0x100U) != 0) { + hoveredGateTile = this->viewportState.mouseTile; + } else if (DAT_TileMapState::instance.BuildingLayer[this->viewportState.mouseTile] <= 0) { + this->viewportState.field18_0x48 + = DAT_TileMapState::instance.BuildingWasLayer[this->viewportState.mouseTile]; + } + } + + orientationBase = 8; + if (DAT_TileMapState::instance.mapOrientation == 0) { + orientationBase = 8; + } else if (DAT_TileMapState::instance.mapOrientation == 6) { + orientationBase = 0x13a18; + } else if (DAT_TileMapState::instance.mapOrientation == 4) { + orientationBase = 0x27428; + } else if (DAT_TileMapState::instance.mapOrientation == 2) { + orientationBase = 0x3ae38; + } + + int zoomDivisor = 1; + if (this->viewportState.isZoomedOutUnk != 0) { + zoomDivisor = 2; + } + + int probeDoubledY = mouseYScreenSpace * 2 + 8; + int probeOffset = -8; + int probeScreenY = mouseYScreenSpace + -8; + do { + if ((DAT_TileMapState::instance.field93_0x5548c8 != 0 + || DAT_TileMapState::instance.flatViewToggleValue2 != 0) + && probeOffset != -8) { + break; + } + + int probeIndex; + uint probeRowY; + if (this->viewportState.isZoomedOutUnk == 0) { + int probeY = (this->viewportState.viewportY - this->windowY) + 0x10 + probeScreenY; + int probeX = (this->viewportState.viewportX - this->windowX) + mouseXScreenSpace; + probeRowY = ((this->viewportState.viewportY & 0x8000000fU) - this->windowY) + probeScreenY; + probeIndex = ((int)(probeX + (probeX >> 0x1f & 0x1fU)) >> 5) + + ((int)(probeY + (probeY >> 0x1f & 0xfU)) >> 4) * 0x191 + orientationBase; + } else { + int probeX = ((mouseXScreenSpace * 2 + 0xa0) - this->windowX) + this->viewportState.viewportX; + probeRowY = ((this->viewportState.viewportY & 0x8000000fU) - this->windowY) + probeDoubledY; + int probeY = (this->viewportState.viewportY - this->windowY) + probeDoubledY; + probeIndex = ((int)(probeY + (probeY >> 0x1f & 0xfU)) >> 4) * 0x191 + + ((int)(probeX + (probeX >> 0x1f & 0x1fU)) >> 5) + orientationBase; + } + + int probeQuadrant = DAT_MapRenderDefinedData::instance.field618_0xc24[probeRowY & 0xf][quadrantX]; + if (probeQuadrant == 1) { + probeIndex = probeIndex + 200; + } else if (probeQuadrant == 2) { + probeIndex = probeIndex + 0xc9; + } else if (probeQuadrant == 3) { + probeIndex = probeIndex + 0x191; + } + + int probeTile = this->screenPointToTileNumber[probeIndex + -8]; + if ((DAT_TileMapState::instance.LogicLayer[probeTile] & 0x30U) != 0) { + break; + } + + int probeBuildingID = DAT_TileMapState::instance.BuildingLayer[probeTile]; + if (probeBuildingID < 1) { + if ((DAT_TileMapState::instance.LogicLayer[probeTile] & 0x100U) == 0) { + if (probeScreenY + - DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[probeTile]] + / zoomDivisor + <= mouseYScreenSpace + || DAT_TileMapState::instance.field93_0x5548c8 != 0 + || DAT_TileMapState::instance.flatViewToggleValue2 != 0) { + this->viewportState.field18_0x48 = DAT_TileMapState::instance.BuildingWasLayer[probeTile]; + hoveredBuildingID = -1; + } + } else if (probeScreenY + - DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[probeTile]] + / zoomDivisor + <= mouseYScreenSpace + || DAT_TileMapState::instance.field93_0x5548c8 != 0 + || DAT_TileMapState::instance.flatViewToggleValue2 != 0) { + hoveredBuildingID = -1; + hoveredGateTile = probeTile; + } + } else if (probeBuildingID != this->viewportState.field6_0x18 && probeBuildingID != hoveredBuildingID + && probeBuildingID != lastBuildingID + && (lastBuildingID = probeBuildingID, + (probeScreenY + - (int)DAT_GMImageHeaders::instance.imh[DAT_TileMapState::instance.GfxLayer[probeTile]] + .tileOffset + / zoomDivisor) + - DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[probeTile]] + / zoomDivisor + <= mouseYScreenSpace)) { + hoveredGateTile = -1; + hoveredBuildingID = probeBuildingID; + } + + probeDoubledY = probeDoubledY + 2; + probeOffset = probeOffset + 1; + probeScreenY = probeScreenY + 1; + } while (probeOffset < 0xff); + + this->viewportState.field21_0x54 = 0; + if (hoveredBuildingID == -1) { + if (-1 < hoveredGateTile) { + this->viewportState.mouseRayBuildingID = 0; + this->viewportState.field21_0x54 = hoveredGateTile; + } + } else { + BuildingTypeShort hoveredBuildingType + = DAT_BuildingsState::instance.buildings[hoveredBuildingID].buildingType; + if ((hoveredBuildingType == OpenSHC::Map::Buildings::BT_GRANARY + || hoveredBuildingType == OpenSHC::Map::Buildings::BT_ARMORY) + && DAT_BuildingsState::instance.buildings[hoveredBuildingID].buildingIsVisuallyActive != 0) { + this->viewportState.mouseRayBuildingID = hoveredBuildingID; + this->viewportState.mouseRayUnitID = 0; + } + } + + if (this->viewportState.field18_0x48 != 0) { + uint textNumInGroup = this->viewportState.field18_0x48; + switch (this->viewportState.field18_0x48) { + case 0x29: + textNumInGroup = 0x2a; + break; + case 0x2a: + textNumInGroup = 0x2c; + break; + case 0x4f: + textNumInGroup = 0x4e; + break; + case 0x56: + textNumInGroup = 0x4a; + break; + case 0x57: + textNumInGroup = 0x4b; + break; + case 0x58: + textNumInGroup = 0x4c; + break; + case 0x59: + textNumInGroup = 0x4d; + } + // set the text also for ruins tooltip: "This was a Round Tower" + TextMessageBLLookupStructUnion noAssociatedType; + noAssociatedType.buildingType = (OpenSHC::Commands::MappersEnum)0; + MACRO_CALL_MEMBER(OpenSHC::UI::BottomLeftTextDisplayState_Func::setBottomLeftTextDisplayText, + DAT_BottomLeftTextDisplayState::ptr)(5, 0x4e, textNumInGroup, noAssociatedType, 0x28, -1); + } + + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::computeMouseTileFromScreenPosition, this)( + mouseXScreenSpace, mouseYScreenSpace); + } + +} +} diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index cd07ceaf8..3c39c0c57 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37217,7 +37217,7 @@ SHC_3BB0A8C1_0x004E8429 | 0.0% | Pending SHC_3BB0A8C1_0x004E842A | 0.0% | Pending -SHC_3BB0A8C1_0x004E8430 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8430 | 44.1% | reg alloc + tail merging SHC_3BB0A8C1_0x004E8BFC | 0.0% | Pending From c580d07e857697236dfee1946bfa17f67b49dc56 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:15:05 +0200 Subject: [PATCH 33/77] reimplement: SHC_3BB0A8C1_0x004E5ED0 42.30% reg alloc, cold block inline --- .../computeMouseTileFromScreenPosition.cpp | 20 +++++++++++-------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp index 600a1c1ce..fa0c597c7 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp @@ -30,21 +30,27 @@ namespace Rendering { return; } - int tileColumnX; + uint quadrantX; if (this->viewportState.isZoomedOutUnk == 0) { uint viewportXInTile = this->viewportState.viewportX & 0x8000001f; if ((int)viewportXInTile < 0) { viewportXInTile = (viewportXInTile - 1 | 0xffffffe0) + 1; } - tileColumnX = (viewportXInTile - this->windowX) + screenX; + quadrantX = (int)((viewportXInTile - this->windowX) + screenX) >> 1 & 0xf; } else { uint viewportXInTile = this->viewportState.viewportX & 0x8000001f; if ((int)viewportXInTile < 0) { viewportXInTile = (viewportXInTile - 1 | 0xffffffe0) + 1; } - tileColumnX = (viewportXInTile + screenX * 2) - this->windowX; + quadrantX = (int)((viewportXInTile + screenX * 2) - this->windowX) >> 1 & 0xf; } + uint viewportYInTile = this->viewportState.viewportY & 0x8000000f; + if ((int)viewportYInTile < 0) { + viewportYInTile = (viewportYInTile - 1 | 0xfffffff0) + 1; + } + int probeOffset = probeScreenY - screenY; + int probeDoubledY = screenY + probeScreenY; if (DAT_TileMapState::instance.mapOrientation == 0) { orientationBase = 8; } else if (DAT_TileMapState::instance.mapOrientation == 6) { @@ -55,8 +61,6 @@ namespace Rendering { orientationBase = 0x3ae38; } - int probeOffset = probeScreenY - screenY; - int probeDoubledY = screenY + probeScreenY; do { if ((DAT_TileMapState::instance.field93_0x5548c8 != 0 || DAT_TileMapState::instance.flatViewToggleValue2 != 0) @@ -68,19 +72,19 @@ namespace Rendering { uint tileRowY; if (this->viewportState.isZoomedOutUnk == 0) { int unclampedY = (this->viewportState.viewportY - this->windowY) + 8 + probeScreenY; - tileRowY = ((this->viewportState.viewportY & 0x8000000fU) - this->windowY) + -8 + probeScreenY; + tileRowY = (viewportYInTile - this->windowY) + -8 + probeScreenY; int unclampedX = (screenX - this->windowX) + this->viewportState.viewportX; lookupIndex = ((int)(unclampedX + (unclampedX >> 0x1f & 0x1fU)) >> 5) + ((int)(unclampedY + (unclampedY >> 0x1f & 0xfU)) >> 4) * 0x191 + orientationBase; } else { int unclampedX = ((screenX * 2 + 0xa0) - this->windowX) + this->viewportState.viewportX; - tileRowY = ((this->viewportState.viewportY & 0x8000000fU) - this->windowY) + probeDoubledY; + tileRowY = (viewportYInTile - this->windowY) + probeDoubledY; int unclampedY = (probeDoubledY - this->windowY) + this->viewportState.viewportY; lookupIndex = ((int)(unclampedY + (unclampedY >> 0x1f & 0xfU)) >> 4) * 0x191 + ((int)(unclampedX + (unclampedX >> 0x1f & 0x1fU)) >> 5) + orientationBase; } - int quadrant = DAT_MapRenderDefinedData::instance.field618_0xc24[tileRowY & 0xf][tileColumnX >> 1 & 0xf]; + int quadrant = DAT_MapRenderDefinedData::instance.field618_0xc24[tileRowY & 0xf][quadrantX]; if (quadrant == 1) { lookupIndex = lookupIndex + 200; } else if (quadrant == 2) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 3c39c0c57..b32d6ce9e 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36887,7 +36887,7 @@ SHC_3BB0A8C1_0x004E5DD0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5E20 | 90.6% | goto-free loop exit, 3 instr -SHC_3BB0A8C1_0x004E5ED0 | 34.1% | reg alloc + tail merging +SHC_3BB0A8C1_0x004E5ED0 | 42.3% | reg alloc, cold block inline SHC_3BB0A8C1_0x004E6308 | 0.0% | Pending From 3324cbf808001f094dd383aedc2804bb9c7deada Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:15:05 +0200 Subject: [PATCH 34/77] reimplement: SHC_3BB0A8C1_0x004E63A0 93.79% one reg-copy form differs --- .../ViewportRenderState/createFloatingLayerElement.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp b/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp index 503ae2cb7..c7df92330 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp @@ -21,7 +21,7 @@ namespace Rendering { if (DAT_TileMapState::instance.FloatingLayer[tile] == 0) { this->floatersArray[newFloaterIndex].id = 0; } else { - uint idAtTile = DAT_TileMapState::instance.FloatingLayer[tile]; + ushort idAtTile = DAT_TileMapState::instance.FloatingLayer[tile]; uint floaterID = idAtTile; if (249 < floaterID) { return; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b32d6ce9e..50edb44eb 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36975,7 +36975,7 @@ SHC_3BB0A8C1_0x004E6340 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E6360 | 0.0% | Pending -SHC_3BB0A8C1_0x004E63A0 | 90.3% | extra reg copy in original +SHC_3BB0A8C1_0x004E63A0 | 93.8% | one reg-copy form differs SHC_3BB0A8C1_0x004E6410 | 0.0% | Pending From ad0a8f225b1945e16a19a6fb63c7f6d1963eea5c Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:15:05 +0200 Subject: [PATCH 35/77] reimplement: SHC_3BB0A8C1_0x004E7810 32.43% frame and reg allocation diffe --- src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp index e1c1cf9f9..8b3ac541b 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp @@ -71,7 +71,6 @@ namespace Rendering { int _gmID; int _renderBatchSize; int _alpha; - int _batchedUnitID; int renderCount5 = this->unitRender5; int renderCount4 = this->unitRender4; @@ -106,7 +105,7 @@ namespace Rendering { _renderBatchSize = renderCount5; } if (0 < _renderBatchSize) { - for (_batchedUnitID = 0; _batchedUnitID < _renderBatchSize; _batchedUnitID++) { + for (int _batchedUnitID = 0; _batchedUnitID < _renderBatchSize; _batchedUnitID++) { switch ((int)this->unitBatchedRenderCounterUntil6) { case 1: _unitID = this->unitBatch1[_batchedUnitID].unitIDOrStatus; From 285a23ed90990a052b9b9e5e5d0d4f07711713ce Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:15:06 +0200 Subject: [PATCH 36/77] reimplement: SHC_3BB0A8C1_0x004E5C00 57.37% reg alloc + one spill --- .../setViewportBasedOnMapSize.cpp | 16 +++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp index fa287d6e2..b6423137f 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp @@ -18,12 +18,10 @@ namespace Rendering { } mapBorder = mapBorder / 2; - int maxTileColumn = ((400 - mapBorder) / 2 - this->viewportState.viewportHeight) + 4; - int minViewportX = mapBorder / 2 + 1; - int maxViewportX = maxTileColumn * 0x20; + int maxViewportX = (((400 - mapBorder) / 2 - this->viewportState.viewportHeight) + 4) * 0x20; int maxViewportY = ((401 - this->viewportState.viewportWidth) - mapBorder) * 8; - int mapBorderY = mapBorder * 8; - int minViewportY = mapBorderY + 0x10; + int minViewportX = mapBorder / 2 + 1; + int minViewportY = mapBorder * 8 + 0x10; if (this->viewportState.isZoomedOutUnk != 0) { minViewportX = mapBorder / 2 + -4; } @@ -48,8 +46,8 @@ namespace Rendering { this->viewportState.viewportX = maxViewportX + -0x20; } } else if (DAT_TileMapState::instance.mapOrientation == 4) { - if (this->viewportState.viewportY < mapBorderY + 0x18) { - this->viewportState.viewportY = mapBorderY + 0x18; + if (this->viewportState.viewportY < minViewportY + 8) { + this->viewportState.viewportY = minViewportY + 8; } if (this->viewportState.viewportY > maxViewportY + -8) { this->viewportState.viewportY = maxViewportY + -8; @@ -67,12 +65,12 @@ namespace Rendering { if (DAT_TileMapState::instance.mapSize == 160 && DAT_WindowAndDirectDraw::instance.currentGameResolution == OpenSHC::Rendering::SRE_1024x768 && this->viewportState.isZoomedOutUnk != 0) { - minViewportY = mapBorderY + 6; + minViewportY = minViewportY - 10; maxViewportY = maxViewportY + -10; } if (maxViewportX < minViewportX) { - this->viewportState.viewportX = (minViewportX + maxTileColumn * -0x20) / 2 + maxViewportX; + this->viewportState.viewportX = (minViewportX - maxViewportX) / 2 + maxViewportX; } if (maxViewportY < minViewportY) { this->viewportState.viewportY = (minViewportY - maxViewportY) / 2 + maxViewportY; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 50edb44eb..f724d7ef9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36879,7 +36879,7 @@ SHC_3BB0A8C1_0x004E5A90 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5B80 | 65.7% | esi/edi allocation differs -SHC_3BB0A8C1_0x004E5C00 | 25.4% | reg alloc, extra stack spill +SHC_3BB0A8C1_0x004E5C00 | 57.4% | reg alloc + one spill SHC_3BB0A8C1_0x004E5D80 | 100.0% | Reimplemented From cd04abde0c54f31b8e01dee76b5408a5d2e90a92 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:24:44 +0200 Subject: [PATCH 37/77] reimplement: SHC_3BB0A8C1_0x004E2050 26.06% reg alloc; frame now matches --- .../setTileSystemMemoryLookupArrays.cpp | 465 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 220 insertions(+), 247 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp index b404f2bc0..3a10f2ef7 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp @@ -15,83 +15,64 @@ namespace Rendering { void ViewportRenderState::setTileSystemMemoryLookupArrays() { - int* piVar1; - int* piVar2; - int* piVar3; - int _i; - int iVar4; - int iVar5; - int iVar6; - int iVar7; - int _countdownBy1_199; - int _countdown_by2_398; - int _200; - int _79600; - int _stack[160001]; - int* _ptrStack; - int _countupBy2_2; - int _8; + int diagonal; + int savedDestOffset2; + int scratch6; + int scratch7; + int runRemaining; + int destIndex; + int firstHalfIndex; + int secondHalfIndex; + int rowBase; + int blockRemaining; + int diagonalBase; + int tileGrid[160000]; + int column; - this->translationTracker1 = 0; - _ptrStack = _stack; - for (_i = 160000; _i != 0; _i = _i + -1) { - *_ptrStack = 0; - _ptrStack = _ptrStack + 1; + int tileNumber = 0; + for (int i = 0; i < 160000; i++) { + tileGrid[i] = 0; } - _countdownBy1_199 = 199; - _countupBy2_2 = 2; - _8 = 0; - _countdown_by2_398 = 398; - piVar1 = &this->translationMatrix[0].firstTileOfRow; - do { - ((TranslationMatrixTriplet*)(piVar1 + -1))->distanceToCenter = _countdown_by2_398 / 2; - *piVar1 = this->translationTracker1; - piVar1[1] = this->translationTracker1 - _countdown_by2_398 / 2; - if (0 < _countupBy2_2) { - piVar2 = _stack + _countdownBy1_199 + _8; - iVar4 = _countupBy2_2; - do { - *piVar2 = this->translationTracker1; - piVar2 = piVar2 + 1; - this->translationTracker1 = this->translationTracker1 + 1; - iVar4 = iVar4 + -1; - } while (iVar4 != 0); + + int rowFirstColumn = 199; + int rowWidth = 2; + int rowStart = 0; + int rowSpan = 398; + for (int row = 0; rowStart < 80000; row++) { + this->translationMatrix[row].distanceToCenter = rowSpan / 2; + this->translationMatrix[row].firstTileOfRow = tileNumber; + this->translationMatrix[row].addXgetTile = tileNumber - rowSpan / 2; + if (0 < rowWidth) { + for (int column = 0; column < rowWidth; column++) { + tileGrid[rowFirstColumn + rowStart + column] = tileNumber; + tileNumber = tileNumber + 1; + } } - _countdown_by2_398 = _countdown_by2_398 + -2; - _countdownBy1_199 = _countdownBy1_199 + -1; - _8 = _8 + 400; - _countupBy2_2 = _countupBy2_2 + 2; - piVar1 = piVar1 + 3; - } while (_8 < 80000); - /* - *** change of meaning *** - */ + rowSpan = rowSpan + -2; + rowFirstColumn = rowFirstColumn + -1; + rowStart = rowStart + 400; + rowWidth = rowWidth + 2; + } - _countdown_by2_398 = 80000; - _8 = 400 - _countupBy2_2; - piVar1 = &this->translationMatrix[200].firstTileOfRow; - do { - _countdownBy1_199 = _countdownBy1_199 + 1; - _8 = _8 + 2; - _countupBy2_2 = _countupBy2_2 + -2; - ((TranslationMatrixTriplet*)(piVar1 + -1))->distanceToCenter = _8 / 2; - *piVar1 = this->translationTracker1; - piVar1[1] = this->translationTracker1 - _8 / 2; - if (0 < _countupBy2_2) { - piVar2 = _stack + _countdown_by2_398 + _countdownBy1_199; - iVar4 = _countupBy2_2; - do { - *piVar2 = this->translationTracker1; - piVar2 = piVar2 + 1; - this->translationTracker1 = this->translationTracker1 + 1; - iVar4 = iVar4 + -1; - } while (iVar4 != 0); + rowSpan = 400 - rowWidth; + for (int row = 200; rowStart < 160000; row++) { + rowFirstColumn = rowFirstColumn + 1; + rowSpan = rowSpan + 2; + rowWidth = rowWidth + -2; + this->translationMatrix[row].distanceToCenter = rowSpan / 2; + this->translationMatrix[row].firstTileOfRow = tileNumber; + this->translationMatrix[row].addXgetTile = tileNumber - rowSpan / 2; + if (0 < rowWidth) { + for (int column = 0; column < rowWidth; column++) { + tileGrid[rowStart + rowFirstColumn + column] = tileNumber; + tileNumber = tileNumber + 1; + } } - _countdown_by2_398 = _countdown_by2_398 + 400; - piVar1 = piVar1 + 3; - } while (_countdown_by2_398 < 160000); - this->translationResult1 = (400 - _countupBy2_2) / 2; - this->translationResult2 = this->translationTracker1 - this->translationResult1; + rowStart = rowStart + 400; + } + this->translationTracker1 = tileNumber; + this->translationResult1 = (400 - rowWidth) / 2; + this->translationResult2 = tileNumber - this->translationResult1; this->field9_0x4e5e0 = 0; this->field10_0x4e5e4 = 0; this->field11_0x4e5e8 = 0; @@ -100,196 +81,188 @@ namespace Rendering { this->field14_0x4e5f4 = 0; this->field15_0x4e5f8 = 0; this->field16_0x4e5fc = 0; - _200 = 200; - _countdownBy1_199 = 0; - _79600 = 79600; - piVar1 = this->screenPointToTileNumber; - _8 = 8; + runRemaining = 200; + rowBase = 0; + diagonalBase = 79600; + destIndex = 0; + column = 8; do { - iVar7 = _8; - iVar6 = 200; - piVar3 = piVar1 + 200; - piVar2 = piVar1; - _8 = _countdownBy1_199; - iVar4 = _79600; + scratch7 = column; + scratch6 = 200; + secondHalfIndex = destIndex + 200; + firstHalfIndex = destIndex; + column = rowBase; + diagonal = diagonalBase; do { - *piVar2 = _stack[iVar4 + _8]; - iVar6 = iVar6 + -1; - piVar2 = piVar2 + 1; - _8 = _8 + 1; - iVar4 = iVar4 + -400; - } while (0 < iVar6); - _79600 = _79600 + 400; - piVar1 = piVar1 + 401; - iVar6 = 200; - _8 = _countdownBy1_199; - iVar4 = _79600; + this->screenPointToTileNumber[firstHalfIndex] = tileGrid[diagonal + column]; + scratch6 = scratch6 + -1; + firstHalfIndex = firstHalfIndex + 1; + column = column + 1; + diagonal = diagonal + -400; + } while (0 < scratch6); + diagonalBase = diagonalBase + 400; + destIndex = destIndex + 401; + scratch6 = 200; + column = rowBase; + diagonal = diagonalBase; do { - *piVar3 = _stack[iVar4 + _8]; - iVar6 = iVar6 + -1; - piVar3 = piVar3 + 1; - _8 = _8 + 1; - iVar4 = iVar4 + -400; - } while (-1 < iVar6); - _200 = _200 + -1; - _countdownBy1_199 = _countdownBy1_199 + 1; - _8 = iVar7 + 401; - } while (0 < _200); - _8 = 200; - piVar1 = this->screenPointToTileNumber + iVar7 + 393; - iVar4 = 159600; + this->screenPointToTileNumber[secondHalfIndex] = tileGrid[diagonal + column]; + scratch6 = scratch6 + -1; + secondHalfIndex = secondHalfIndex + 1; + column = column + 1; + diagonal = diagonal + -400; + } while (-1 < scratch6); + runRemaining = runRemaining + -1; + rowBase = rowBase + 1; + column = scratch7 + 401; + } while (0 < runRemaining); + column = 200; + destIndex = scratch7 + 393; + diagonal = 159600; do { - *piVar1 = _stack[iVar4 + _countdownBy1_199]; - _8 = _8 + -1; - piVar1 = piVar1 + 1; - _countdownBy1_199 = _countdownBy1_199 + 1; - iVar4 = iVar4 + -400; - } while (0 < _8); - _countdownBy1_199 = 399; - _79600 = 0x26f70; - piVar1 = this->screenPointToTileNumber + iVar7 + 0x251; - _countdown_by2_398 = 200; - _8 = iVar7 + 0x259; - iVar4 = 199; + this->screenPointToTileNumber[destIndex] = tileGrid[diagonal + rowBase]; + column = column + -1; + destIndex = destIndex + 1; + rowBase = rowBase + 1; + diagonal = diagonal + -400; + } while (0 < column); + rowBase = 399; + diagonalBase = 0x26f70; + destIndex = scratch7 + 0x251; + blockRemaining = 200; + column = scratch7 + 0x259; + diagonal = 199; do { - iVar6 = _8; - _200 = 200; - piVar3 = piVar1 + 200; - piVar2 = piVar1; - _8 = iVar4; - iVar7 = _79600; + scratch6 = column; + runRemaining = 200; + secondHalfIndex = destIndex + 200; + firstHalfIndex = destIndex; + column = diagonal; + scratch7 = diagonalBase; do { - *piVar2 = _stack[iVar7 + _8]; - piVar2 = piVar2 + 1; - _8 = _8 + -1; - iVar7 = iVar7 + -400; - _200 = _200 + -1; - } while (_200 != 0); - iVar7 = iVar4 + 1; - _200 = (iVar7 - iVar4) + 199; - iVar4 = ((iVar7 - iVar4) + _countdownBy1_199) * 400; - piVar1 = piVar1 + 0x191; - _8 = iVar7; + this->screenPointToTileNumber[firstHalfIndex] = tileGrid[scratch7 + column]; + firstHalfIndex = firstHalfIndex + 1; + column = column + -1; + scratch7 = scratch7 + -400; + runRemaining = runRemaining + -1; + } while (runRemaining != 0); + scratch7 = diagonal + 1; + runRemaining = (scratch7 - diagonal) + 199; + diagonal = ((scratch7 - diagonal) + rowBase) * 400; + destIndex = destIndex + 0x191; + column = scratch7; do { - iVar4 = iVar4 + -400; - *piVar3 = _stack[iVar4 + _8]; - piVar3 = piVar3 + 1; - _8 = _8 + -1; - _200 = _200 + -1; - } while (-1 < _200); - _countdownBy1_199 = _countdownBy1_199 + -1; - _79600 = _79600 + -400; - _countdown_by2_398 = _countdown_by2_398 + -1; - _8 = iVar6 + 0x191; - iVar4 = iVar7; - } while (_countdown_by2_398 != 0); - _8 = _countdownBy1_199 * 400; - iVar4 = 200; - piVar1 = this->screenPointToTileNumber + iVar6 + 0x189; + diagonal = diagonal + -400; + this->screenPointToTileNumber[secondHalfIndex] = tileGrid[diagonal + column]; + secondHalfIndex = secondHalfIndex + 1; + column = column + -1; + runRemaining = runRemaining + -1; + } while (-1 < runRemaining); + rowBase = rowBase + -1; + diagonalBase = diagonalBase + -400; + blockRemaining = blockRemaining + -1; + column = scratch6 + 0x191; + diagonal = scratch7; + } while (blockRemaining != 0); + column = rowBase * 400; + diagonal = 200; + destIndex = scratch6 + 0x189; do { - *piVar1 = _stack[_8 + iVar7]; - piVar1 = piVar1 + 1; - iVar7 = iVar7 + -1; - _8 = _8 + -400; - iVar4 = iVar4 + -1; - } while (iVar4 != 0); - iVar7 = 199; - _8 = 80000; - piVar1 = this->screenPointToTileNumber + iVar6 + 0x251; - iVar4 = iVar6 + 0x259; + this->screenPointToTileNumber[destIndex] = tileGrid[column + scratch7]; + destIndex = destIndex + 1; + scratch7 = scratch7 + -1; + column = column + -400; + diagonal = diagonal + -1; + } while (diagonal != 0); + scratch7 = 199; + column = 80000; + destIndex = scratch6 + 0x251; + diagonal = scratch6 + 0x259; do { - iVar5 = iVar4; - iVar6 = 200; - piVar3 = piVar1 + 200; - piVar2 = piVar1; - iVar4 = _8; + savedDestOffset2 = diagonal; + scratch6 = 200; + secondHalfIndex = destIndex + 200; + firstHalfIndex = destIndex; + diagonal = column; do { - *piVar2 = _stack[iVar7 + iVar4 + iVar6]; - iVar6 = iVar6 + -1; - piVar2 = piVar2 + 1; - iVar4 = iVar4 + 400; - } while (0 < iVar6); - _8 = _8 + -400; - iVar6 = 200; - piVar1 = piVar1 + 0x191; - iVar4 = _8; + this->screenPointToTileNumber[firstHalfIndex] = tileGrid[scratch7 + diagonal + scratch6]; + scratch6 = scratch6 + -1; + firstHalfIndex = firstHalfIndex + 1; + diagonal = diagonal + 400; + } while (0 < scratch6); + column = column + -400; + scratch6 = 200; + destIndex = destIndex + 0x191; + diagonal = column; do { - *piVar3 = _stack[iVar7 + iVar4 + iVar6]; - piVar3 = piVar3 + 1; - iVar4 = iVar4 + 400; - iVar6 = iVar6 + -1; - } while (-1 < iVar6); - iVar7 = iVar7 + -1; - iVar4 = iVar5 + 0x191; - } while (0 < _8); - _8 = 200; - iVar4 = 0; - piVar1 = this->screenPointToTileNumber + iVar5 + 0x189; + this->screenPointToTileNumber[secondHalfIndex] = tileGrid[scratch7 + diagonal + scratch6]; + secondHalfIndex = secondHalfIndex + 1; + diagonal = diagonal + 400; + scratch6 = scratch6 + -1; + } while (-1 < scratch6); + scratch7 = scratch7 + -1; + diagonal = savedDestOffset2 + 0x191; + } while (0 < column); + column = 200; + diagonal = 0; + destIndex = savedDestOffset2 + 0x189; do { - *piVar1 = _stack[iVar4 + -1 + _8]; - _8 = _8 + -1; - piVar1 = piVar1 + 1; - iVar4 = iVar4 + 400; - } while (0 < _8); - _countdownBy1_199 = 0; - _79600 = 0; - piVar1 = this->screenPointToTileNumber + iVar5 + 0x251; - _8 = 200; - iVar4 = iVar5 + 0x259; + this->screenPointToTileNumber[destIndex] = tileGrid[diagonal + -1 + column]; + column = column + -1; + destIndex = destIndex + 1; + diagonal = diagonal + 400; + } while (0 < column); + rowBase = 0; + diagonalBase = 0; + destIndex = savedDestOffset2 + 0x251; + column = 200; + diagonal = savedDestOffset2 + 0x259; do { - iVar6 = iVar4; - iVar5 = 200; - piVar3 = piVar1 + 200; - piVar2 = piVar1; - iVar4 = _8; - iVar7 = _79600; + scratch6 = diagonal; + savedDestOffset2 = 200; + secondHalfIndex = destIndex + 200; + firstHalfIndex = destIndex; + diagonal = column; + scratch7 = diagonalBase; do { - *piVar2 = _stack[iVar7 + iVar4]; - iVar5 = iVar5 + -1; - piVar2 = piVar2 + 1; - iVar4 = iVar4 + 1; - iVar7 = iVar7 + 400; - } while (0 < iVar5); - iVar7 = _8 + -1; - iVar4 = ((iVar7 - _8) + 1 + _countdownBy1_199) * 400; - _200 = 200; - piVar1 = piVar1 + 0x191; - _8 = iVar7; + this->screenPointToTileNumber[firstHalfIndex] = tileGrid[scratch7 + diagonal]; + savedDestOffset2 = savedDestOffset2 + -1; + firstHalfIndex = firstHalfIndex + 1; + diagonal = diagonal + 1; + scratch7 = scratch7 + 400; + } while (0 < savedDestOffset2); + scratch7 = column + -1; + diagonal = ((scratch7 - column) + 1 + rowBase) * 400; + runRemaining = 200; + destIndex = destIndex + 0x191; + column = scratch7; do { - *piVar3 = _stack[iVar4 + _8]; - piVar3 = piVar3 + 1; - _8 = _8 + 1; - iVar4 = iVar4 + 400; - _200 = _200 + -1; - } while (-1 < _200); - _countdownBy1_199 = _countdownBy1_199 + 1; - _79600 = _79600 + 400; - _8 = iVar7; - iVar4 = iVar6 + 0x191; - } while (0 < iVar7); - _8 = _countdownBy1_199 * 400; - iVar4 = 200; - piVar1 = this->screenPointToTileNumber + iVar6 + 0x189; + this->screenPointToTileNumber[secondHalfIndex] = tileGrid[diagonal + column]; + secondHalfIndex = secondHalfIndex + 1; + column = column + 1; + diagonal = diagonal + 400; + runRemaining = runRemaining + -1; + } while (-1 < runRemaining); + rowBase = rowBase + 1; + diagonalBase = diagonalBase + 400; + column = scratch7; + diagonal = scratch6 + 0x191; + } while (0 < scratch7); + column = rowBase * 400; + diagonal = 200; + destIndex = scratch6 + 0x189; do { - *piVar1 = _stack[_8 + iVar7]; - iVar4 = iVar4 + -1; - piVar1 = piVar1 + 1; - iVar7 = iVar7 + 1; - _8 = _8 + 400; - } while (0 < iVar4); - _8 = 0x21aec98; - piVar1 = _stack; - iVar4 = 400; - do { - iVar7 = 0; - do { - *(bool*)(_8 + iVar7) = 0 < *piVar1; - iVar7 = iVar7 + 1; - piVar1 = piVar1 + 1; - } while (iVar7 < 400); - _8 = _8 + 400; - iVar4 = iVar4 + -1; - } while (iVar4 != 0); + this->screenPointToTileNumber[destIndex] = tileGrid[column + scratch7]; + diagonal = diagonal + -1; + destIndex = destIndex + 1; + scratch7 = scratch7 + 1; + column = column + 400; + } while (0 < diagonal); + for (int y = 0; y < 400; y++) { + for (int x = 0; x < 400; x++) { + this->DAT_BinaryTileMap400x400[y * 400 + x] = (0 < tileGrid[y * 400 + x]); + } + } return; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f724d7ef9..b2c0b34ee 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36391,7 +36391,7 @@ SHC_3BB0A8C1_0x004E1F50 | 0.0% | Pending SHC_3BB0A8C1_0x004E1FA0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E2050 | 15.1% | style only, asm differs +SHC_3BB0A8C1_0x004E2050 | 26.1% | reg alloc; frame now matches SHC_3BB0A8C1_0x004E21E0 | 0.0% | Pending From 6d24e3a14f0ba44ccfb3a4f11bab27b9a66aa91f Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:39:42 +0200 Subject: [PATCH 38/77] types: ViewportState::ptrColor is a ushort*, not undefined4 It is assigned WindowAndDirectDraw::surfacePointer_mapGame (ushort*) and every use dereferences it as a 16-bit pixel, so the reimplementations had to cast on both sides. Typing it correctly drops those casts and takes renderUnits from 32.43% to 34.50%. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KGVnoVPWJMmdidJaxX18se --- src/OpenSHC/Rendering/ViewportState.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Rendering/ViewportState.hpp b/src/OpenSHC/Rendering/ViewportState.hpp index f07f60083..587ba3d29 100644 --- a/src/OpenSHC/Rendering/ViewportState.hpp +++ b/src/OpenSHC/Rendering/ViewportState.hpp @@ -44,7 +44,7 @@ namespace Rendering { int mouseY; // 0x00000068 length: 4 undefined4 field27_0x6c; // 0x0000006C length: 4 int mouseAtomRefFloorTile; // 0x00000070 length: 4 - undefined4 ptrColor; // 0x00000074 length: 4 + ushort* ptrColor; // 0x00000074 length: 4 int viewportX; // 0x00000078 length: 4 int viewportY; // 0x0000007C length: 4 int currentCameraOffsetX; // 0x00000080 length: 4 From d05e025139f9ffca7ea90fd359c98b025c89d0e7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:39:51 +0200 Subject: [PATCH 39/77] reimplement: SHC_3BB0A8C1_0x004E3980 34.24% reg alloc + tail merging --- .../renderGmOverlayBuilding.cpp | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp index 8ad8e209a..ceb717822 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp @@ -35,25 +35,8 @@ namespace Rendering { using OpenSHC::Map::Buildings::BuildingTypeShort; using OpenSHC::UI::Enums::MenuViewType; - /* - 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 0x004E3980 void ViewportRenderState::renderGmOverlayBuilding(int tileIndex, int xUnk, int yUnk, int param_4) - { short sVar1; BuildingTypeShort BVar2; @@ -1796,7 +1779,6 @@ namespace Rendering { + -0x2a, OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar11, 0); DAT_BuildingsState::instance.buildings[tileIndex].field68_0xc2 = 0; - return; } } From 4655fa203df60f4469efd27dc22c33c7da133c9e Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:39:52 +0200 Subject: [PATCH 40/77] reimplement: SHC_3BB0A8C1_0x004E2AD0 45.52% reg alloc, type-load CSE --- .../renderGmOverlayBuilding2.cpp | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp index f3da9828c..0d155450b 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp @@ -31,25 +31,8 @@ namespace Rendering { using OpenSHC::Map::Buildings::BuildingTypeShort; using OpenSHC::UI::Enums::MenuViewType; - /* - 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 0x004E2AD0 void ViewportRenderState::renderGmOverlayBuilding2(int buildingID, int screenX, int screenY, int tile) - { BuildingTypeShort buildingType; uint animationTick; @@ -664,7 +647,6 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func::restoreMapSurfaceHeightRangeFromTemporaryUnk, DAT_TextureRenderCoreObject::ptr)(); } - return; } } From cb38d67cc8ceac501244dbc9e6000e20a7087434 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:39:52 +0200 Subject: [PATCH 41/77] reimplement: SHC_3BB0A8C1_0x004E8CF0 29.44% frame slot allocation differs --- .../ViewportRenderState/renderMap.cpp | 61 ++++++------------- 1 file changed, 19 insertions(+), 42 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp index 9664ef606..a2ef6dd40 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp @@ -93,29 +93,8 @@ namespace Rendering { using OpenSHC::UI::Enums::MenuModalType; using OpenSHC::WindowsHelper::Enums::BOOLEnum; - /* - WARNING: Restarted to delay deadcode elimination for space: ram - */ - - /* - 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 0x004E8CF0 void ViewportRenderState::renderMap() - { ushort* puVar1; int iVar2; @@ -295,7 +274,7 @@ namespace Rendering { } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::setMapSurfaceHeightRange, DAT_TextureRenderCoreObject::ptr)(iVar31, iVar16); - this->viewportState.ptrColor = (undefined4)(DAT_WindowAndDirectDraw::instance.surfacePointer_mapGame + this->viewportState.ptrColor = (DAT_WindowAndDirectDraw::instance.surfacePointer_mapGame + this->viewportState.currentCameraOffsetX + DAT_MouseState::instance.screenSpaceX + (this->viewportState.currentCameraOffsetY + DAT_MouseState::instance.screenSpaceY) * 0xfd8); this->viewportState.mouseRayBuildingID = 0; @@ -759,8 +738,8 @@ namespace Rendering { .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar16] + 4]; } if (local_54 != 0) { - uVar9 = *(ushort*)this->viewportState.ptrColor; - *(ushort*)this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + uVar9 = *this->viewportState.ptrColor; + *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; } if (((DAT_00ed3170::instance != 0xff) && (bVar13)) && (MACRO_CALL(OpenSHC::UI::Rendering_Func::RenderTerrainTilesCenterPiece)(), bVar12)) { @@ -809,8 +788,8 @@ namespace Rendering { + 7); } if (local_54 != 0) { - if (*(ushort*)this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { - *(ushort*)this->viewportState.ptrColor = uVar9; + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *this->viewportState.ptrColor = uVar9; } else { this->viewportState.mouseRayUnitID = 0; this->viewportState.mouseRayBuildingID = local_54; @@ -1166,9 +1145,8 @@ namespace Rendering { 0x20 - iVar27); } } - uVar9 = *(ushort*)this->viewportState.ptrColor; - *(ushort*)this->viewportState.ptrColor - = COL_MAGENTA::instance.shortValue; + uVar9 = *this->viewportState.ptrColor; + *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; bVar15 = DAT_UnitsState::instance.units[local_60] .disappearFadeAlphaCountdown; if (bVar15 == 0) { @@ -1366,9 +1344,9 @@ namespace Rendering { } } LAB_004eadfa: - if (*(ushort*)this->viewportState.ptrColor + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { - *(ushort*)this->viewportState.ptrColor = uVar9; + *this->viewportState.ptrColor = uVar9; } else { this->viewportState.mouseRayUnitID = local_60; this->viewportState.mouseRayBuildingID = 0; @@ -1387,9 +1365,9 @@ namespace Rendering { + (int)DAT_TextureRenderCoreObject::instance .gmProcessedImageData))), (int)((int)((char)bVar15))); - if (*(ushort*)this->viewportState.ptrColor + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { - *(ushort*)this->viewportState.ptrColor = uVar9; + *this->viewportState.ptrColor = uVar9; } else { this->viewportState.mouseRayUnitID = local_60; this->viewportState.mouseRayBuildingID = 0; @@ -1658,8 +1636,8 @@ namespace Rendering { 0x20 - iVar27); } } - uVar9 = *(ushort*)this->viewportState.ptrColor; - *(ushort*)this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + uVar9 = *this->viewportState.ptrColor; + *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; sVar30 = DAT_UnitsState::instance.units[local_60].field59_0x86; if (local_2c == 0) { if (sVar30 < 0) { @@ -1851,9 +1829,8 @@ namespace Rendering { } } LAB_004ea966: - if (*(ushort*)this->viewportState.ptrColor - == COL_MAGENTA::instance.shortValue) { - *(ushort*)this->viewportState.ptrColor = uVar9; + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *this->viewportState.ptrColor = uVar9; } else { this->viewportState.mouseRayUnitID = local_60; this->viewportState.mouseRayBuildingID = 0; @@ -2389,8 +2366,8 @@ namespace Rendering { psVar17 = &DAT_BuildingsState::instance.buildings[uVar29].surfaceAreaUnk; *psVar17 = *psVar17 + 1; } - uVar9 = *(ushort*)this->viewportState.ptrColor; - *(ushort*)this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + uVar9 = *this->viewportState.ptrColor; + *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; if ((DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].direction != 0) && (bVar13)) { iVar23 = (int)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] @@ -2471,8 +2448,8 @@ namespace Rendering { } } } - if (*(ushort*)this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { - *(ushort*)this->viewportState.ptrColor = uVar9; + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *this->viewportState.ptrColor = uVar9; } else { this->viewportState.mouseRayUnitID = 0; this->viewportState.mouseRayBuildingID = uVar29; From e8194a9a696c1989a5621e7eac9da2998e56ab09 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:39:52 +0200 Subject: [PATCH 42/77] reimplement: SHC_3BB0A8C1_0x004E7810 34.46% frame and reg allocation diffe --- .../ViewportRenderState/renderUnits.cpp | 36 ++++--------------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 8 insertions(+), 30 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp index 8b3ac541b..bdfc4dbd9 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp @@ -30,31 +30,10 @@ namespace Rendering { using OpenSHC::Map::Units::States::UnitState; using OpenSHC::Map::Units::States::UnitStateShort; - /* - WARNING: Restarted to delay deadcode elimination for space: ram - */ - - /* - 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 0x004E7810 void ViewportRenderState::renderUnits() - { - short savedPixelColor; + ushort savedPixelColor; short graphicSize; UnitTypeShort unitType; UnitStateShort unitState; @@ -193,8 +172,8 @@ namespace Rendering { (GmID)((int)(_gmID)), ((int)_blendStrength >> 0x10) + _imageID, 0); } } else { - savedPixelColor = *(short*)this->viewportState.ptrColor; - *(short*)this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + savedPixelColor = *this->viewportState.ptrColor; + *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; _alpha = (int)(char)DAT_UnitsState::instance.units[_unitID].disappearFadeAlphaCountdown; if (DAT_UnitsState::instance.units[_unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) { if (((DAT_GameState::instance.mapAndTime @@ -376,8 +355,8 @@ namespace Rendering { (int)((int)(animationTick / 2 + 1)), overlayX, overlayY); } } - if (*(short*)this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { - *(short*)this->viewportState.ptrColor = savedPixelColor; + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *this->viewportState.ptrColor = savedPixelColor; } else { this->viewportState.mouseRayUnitID = _unitID; this->viewportState.mouseRayBuildingID = 0; @@ -387,8 +366,8 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)( _drawX, _drawY, _imageID, (int)((int)(_blendStrength)), (byte*)_gmID, _alpha); - if (*(short*)this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { - *(short*)this->viewportState.ptrColor = savedPixelColor; + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *this->viewportState.ptrColor = savedPixelColor; } else { this->viewportState.mouseRayUnitID = _unitID; this->viewportState.mouseRayBuildingID = 0; @@ -560,7 +539,6 @@ namespace Rendering { } } } - return; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b2c0b34ee..4ec0a75ce 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36987,7 +36987,7 @@ SHC_3BB0A8C1_0x004E7770 | 36.6% | LTCG ecx reuse in callers SHC_3BB0A8C1_0x004E7800 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E7810 | 32.4% | frame and reg allocation diffe +SHC_3BB0A8C1_0x004E7810 | 34.5% | frame and reg allocation diffe SHC_3BB0A8C1_0x004E78D0 | 0.0% | Pending From a586ce17ee223a0f4593bdc3e3df433ef6032e0c Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:39:53 +0200 Subject: [PATCH 43/77] reimplement: SHC_3BB0A8C1_0x004E2050 26.06% reg alloc; frame now matches --- .../setTileSystemMemoryLookupArrays.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp index 3a10f2ef7..a67da7e1b 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp @@ -3,17 +3,8 @@ namespace OpenSHC { namespace Rendering { - /* - WARNING: Function: __alloca_probe replaced with injection: alloca_probe - */ - - /* - decompilerscript: committed: 2025-01-30 21:57:43.216000 - */ - // FUNCTION: STRONGHOLDCRUSADER 0x004E2050 void ViewportRenderState::setTileSystemMemoryLookupArrays() - { int diagonal; int savedDestOffset2; @@ -263,7 +254,6 @@ namespace Rendering { this->DAT_BinaryTileMap400x400[y * 400 + x] = (0 < tileGrid[y * 400 + x]); } } - return; } } From 078dce2fb8999e7ea53c1f25a9e5ca0a2124e639 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 00:39:53 +0200 Subject: [PATCH 44/77] reimplement: SHC_3BB0A8C1_0x004E66F0 59.97% consts kept in regs by orig --- src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp index ca363cb61..24f892a74 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp @@ -14,10 +14,6 @@ namespace Rendering { using OpenSHC::UI::Enums::BuildingsAndStatusMenuTabType; using OpenSHC::UI::Enums::MenuViewType; - /* - decompilerscript: committed: 2025-01-30 21:57:43.216000 - */ - // FUNCTION: STRONGHOLDCRUSADER 0x004E66F0 void ViewportRenderState::setupViewport( undefined4 windowX, undefined4 windowY, undefined4 screenPixelWidth, undefined4 screenPixelHeight) @@ -792,7 +788,6 @@ namespace Rendering { DAT_ScrollingHandler::instance.field11_0x2c = 1; this->viewportState.someYOffset = 0x40; MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); - return; } } From 426d7e14c9285a610085d560baf20566bfab9d5e Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:03:59 +0200 Subject: [PATCH 45/77] reimplement: SHC_3BB0A8C1_0x004E3980 34.24% reg alloc + tail merging --- .../Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp index ceb717822..cc901b9b0 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp @@ -1730,7 +1730,7 @@ namespace Rendering { } if ((DAT_GameCore::instance.gameMode_2 != OpenSHC::Game::GM_BUILDERUnk) || (DAT_MapPropertiesState::instance.SEC_U3_MapType2_1 != OpenSHC::Map::MT_SIEGE)) { - if (DAT_BuildingsState::instance.buildings[tileIndex].sleeping != false) { + if (DAT_BuildingsState::instance.buildings[tileIndex].sleeping) { uVar8 = DAT_TileMapState::instance.field161_0x5549c0 - 1U & 0x80000007; if ((int)uVar8 < 0) { uVar8 = (uVar8 - 1 | 0xfffffff8) + 1; From 59266bc25b48ce6aaf6fafea14de5291cff73390 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:04:00 +0200 Subject: [PATCH 46/77] reimplement: SHC_3BB0A8C1_0x004E2AD0 45.52% reg alloc, type-load CSE --- .../Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp index 0d155450b..c055335d2 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp @@ -83,7 +83,7 @@ namespace Rendering { } if ((DAT_GameCore::instance.gameMode_2 != OpenSHC::Game::GM_BUILDERUnk) || (DAT_MapPropertiesState::instance.SEC_U3_MapType2_1 != OpenSHC::Map::MT_SIEGE)) { - if (DAT_BuildingsState::instance.buildings[buildingID].sleeping != false) { + if (DAT_BuildingsState::instance.buildings[buildingID].sleeping) { animationTick = DAT_TileMapState::instance.field161_0x5549c0 - 1U & 0x80000007; if ((int)animationTick < 0) { animationTick = (animationTick - 1 | 0xfffffff8) + 1; From 1a20b502ee1fd9137fbe14c7f2bc212571b46588 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:04:00 +0200 Subject: [PATCH 47/77] reimplement: SHC_3BB0A8C1_0x004E8CF0 31.81% reg alloc + stack slot order --- .../ViewportRenderState/renderMap.cpp | 90 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp index a2ef6dd40..a44a1ed2d 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp @@ -107,9 +107,9 @@ namespace Rendering { ushort uVar9; ushort uVar10; GmID GVar11; - bool bVar12; - bool bVar13; - bool bVar14; + int bVar12; + int bVar13; + int bVar14; byte bVar15; int iVar16; short* psVar17; @@ -149,7 +149,7 @@ namespace Rendering { int _tile; int tileIndex; int _yOffset_01; - bool _flatView; + int _flatView; int _viewportHeight; int viewportWidth; @@ -158,7 +158,7 @@ namespace Rendering { _displayLayerLogicalValue = 0; local_1c = 0; local_5c = 600; - _flatView = false; + _flatView = 0; local_8 = 0; _zoomOffset = 0; uVar9 = 0; @@ -197,7 +197,7 @@ namespace Rendering { _viewportHeight = this->viewportState.viewportHeight; if ((DAT_TileMapState::instance.flatViewToggleValue1 != 0) && (DAT_TileMapState::instance.flatViewToggleValue2 != 0)) { - _flatView = true; + _flatView = 1; } if (this->viewportState.isZoomedOutUnk != 0) { iVar28 = 4; @@ -325,8 +325,8 @@ namespace Rendering { */ DAT_GmImageAddressToBeRendered::instance = (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; - if ((iVar31 < 2) || (bVar13 = true, _vpWidthPlus1 + -2 <= iVar31)) { - bVar13 = false; + if ((iVar31 < 2) || (bVar13 = 1, _vpWidthPlus1 + -2 <= iVar31)) { + bVar13 = 0; } if (this->DAT_MapEditorDisplayLayer != 0) { if (this->DAT_MapEditorDisplayLayer == 1) { @@ -607,7 +607,7 @@ namespace Rendering { } LAB_004e9845: local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; - if (_flatView) { + if (_flatView != 0) { DAT_RenderMap_YOffset::instance = 8; if (this->DAT_MapEditorDisplayLayer == 0) { uVar32 = (uint)(short)DAT_TileMapState::instance.RandomLayer[iVar16]; @@ -693,8 +693,8 @@ namespace Rendering { } } DAT_RenderMap_ImageID::instance = (uint)DAT_TileMapState::instance.ConstructionGFXLayer[iVar16]; - bVar12 = false; - bVar14 = false; + bVar12 = 0; + bVar14 = 0; if (DAT_RenderMap_ImageID::instance == 0) { if ((((DAT_00ed3148::instance & 0x4000) != 0) && (DAT_TileMapState::instance.field159_0x5549b8 != 0)) @@ -712,15 +712,15 @@ namespace Rendering { } else if ((DAT_TileMapState::instance.buildingPlacementFail == FALSE) || ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x8000) != 0)) { DAT_GmImageAddressToBeRendered::instance = DAT_RenderMap_ImageID::instance; - if (((DAT_00ed3148::instance & 0x100) != 0) && (!_flatView)) { + if (((DAT_00ed3148::instance & 0x100) != 0) && (_flatView == 0)) { DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance .heightBasedScreenYOffset[DAT_TileMapState::instance.DefaultHeightLayer[iVar16]]; } } else { LAB_004e9b3c: - bVar12 = true; - bVar14 = true; + bVar12 = 1; + bVar14 = 1; } local_60 = (int)(short)DAT_TileMapState::instance.UnitLayer[iVar16]; if (((local_60 != 0) && (local_60 == DAT_UnitsState::instance.lastSelectedUnitID)) @@ -732,7 +732,7 @@ namespace Rendering { } if ((((DAT_00ed3148::instance & 8) != 0) && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x2000) == 0)) - && (!_flatView)) { + && (_flatView == 0)) { DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar16] + 4]; @@ -741,8 +741,8 @@ namespace Rendering { uVar9 = *this->viewportState.ptrColor; *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; } - if (((DAT_00ed3170::instance != 0xff) && (bVar13)) - && (MACRO_CALL(OpenSHC::UI::Rendering_Func::RenderTerrainTilesCenterPiece)(), bVar12)) { + if (((DAT_00ed3170::instance != 0xff) && (bVar13 != 0)) + && (MACRO_CALL(OpenSHC::UI::Rendering_Func::RenderTerrainTilesCenterPiece)(), bVar12 != 0)) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS, (int)((int)(DAT_RenderMap_ImageID::instance)), @@ -753,8 +753,8 @@ namespace Rendering { } if ((((DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].direction != 0) && (local_54 == 0)) - && (bVar13)) - && (!bVar12)) { + && (bVar13 != 0)) + && (bVar12 == 0)) { _yOffset_01 = (int)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] .tileOffset; /* @@ -802,7 +802,7 @@ namespace Rendering { || (((DAT_00ed3148::instance & 0x4000) != 0 && (DAT_TileMapState::instance.field159_0x5549b8 != 0)))) && ((DAT_00ed3148::instance & 0x30) == 0)) - && (!_flatView)))) { + && (_flatView == 0)))) { uVar32 = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16]; DAT_GmImageAddressToBeRendered::instance = (uint)DAT_TileMapState::instance.AlphaGFXLayer[iVar16]; @@ -856,7 +856,7 @@ namespace Rendering { _yOffset_01 = DAT_RenderMap_YOffset::instance; uVar32 = (uint)DAT_TileMapState::instance.FloatingLayer[iVar16]; if (uVar32 != 0) { - if ((DAT_TileMapState::instance.refreshRelatedOne != 0) && (!_flatView)) { + if ((DAT_TileMapState::instance.refreshRelatedOne != 0) && (_flatView == 0)) { if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x10000000U) == 0) { if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x100U) != 0) { local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; @@ -988,7 +988,7 @@ namespace Rendering { if (((local_54 != 0) && (DAT_BuildingsState::instance.buildings[local_54].buildingType == OpenSHC::Map::Buildings::BT_DRAWBRIDGE)) - && ((!_flatView + && ((_flatView == 0 && ((DAT_TileMapState::instance.refreshRelatedOne != 0 && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0xc) == 4)))))) { MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding2, this)( @@ -1045,7 +1045,7 @@ namespace Rendering { iVar26 = iVar27 + -1 + iVar18; iVar25 = DAT_RenderMap_YOffset::instance; if (DAT_TileMapState::instance.refreshRelatedOne != 0) { - if (_flatView) { + if (_flatView != 0) { iVar25 = ((int)(char)DAT_UnitsState::instance.units[local_60].negativeHeight - (int)DAT_UnitsState::instance.units[local_60].buildingHeight) + DAT_RenderMap_YOffset::instance; @@ -1912,20 +1912,20 @@ namespace Rendering { _yOffset_01 = DAT_RenderMap_YOffset::instance; } DAT_RenderedUnitOwner::instance = DAT_EntityState::instance.entityArray[local_58].colorUnk; - bVar12 = false; + bVar12 = 0; iVar26 = (int)DAT_EntityState::instance.entityArray[local_58].height; switch (DAT_CurrentlyRenderedSpriteID::instance) { case OpenSHC::IO::Graphics::GID_ANIM_FLAGS: case OpenSHC::IO::Graphics::GID_ANIM_CRUSADER_FLAG: - if (_flatView) + if (_flatView != 0) goto LAB_004eb439; case OpenSHC::IO::Graphics::GID_BODY_INFO: - bVar12 = true; + bVar12 = 1; switchD_004eb2c9_caseD_76: - if ((DAT_TileMapState::instance.refreshRelatedOne == 0) || (_flatView)) { + if ((DAT_TileMapState::instance.refreshRelatedOne == 0) || (_flatView != 0)) { iVar26 = _yOffset_01; } - if (!bVar12) + if (bVar12 == 0) goto switchD_004eb2c9_caseD_4d; break; default: @@ -1937,7 +1937,7 @@ namespace Rendering { goto switchD_004eb2c9_caseD_76; case OpenSHC::IO::Graphics::GID_BODY_MISSILE_COW: if ((DAT_EntityState::instance.entityArray[local_58].someCounter_OR_hitGround != 0) - && ((DAT_TileMapState::instance.refreshRelatedOne == 0 || (_flatView)))) { + && ((DAT_TileMapState::instance.refreshRelatedOne == 0 || (_flatView != 0)))) { iVar26 = _yOffset_01; } goto switchD_004eb2c9_caseD_4d; @@ -1951,7 +1951,7 @@ namespace Rendering { } } else { iVar26 = _yOffset_01; - if ((!_flatView) + if ((_flatView == 0) && (iVar26 = iVar18, DAT_TileMapState::instance.BuildingLayer[iVar16] != 0)) { iVar26 = iVar18 + -10; } @@ -1972,7 +1972,7 @@ namespace Rendering { if (uVar32 != 0) { iVar26 = iVar26 + 0x12; } - } else if (_flatView) + } else if (_flatView != 0) goto LAB_004eb439; } if ((DAT_EntityState::instance.entityArray[local_58].field83_0xc0 == 0) @@ -2207,7 +2207,7 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(8); } - if (((DAT_00ed3170::instance != 0) && ((int)DAT_00ed3170::instance < 0xff)) && (bVar13)) { + if (((DAT_00ed3170::instance != 0) && ((int)DAT_00ed3170::instance < 0xff)) && (bVar13 != 0)) { uVar32 = (uint)(short)DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; DAT_00ed317c::instance = uVar32 & 3; if ((DAT_00ed3148::instance & 0x100) == 0) { @@ -2220,7 +2220,7 @@ namespace Rendering { } else { MACRO_CALL(OpenSHC::Rendering_Func::BlitMapImageWithVerticalClipAndYOffset)(); } - if (bVar14) { + if (bVar14 != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS, @@ -2283,8 +2283,8 @@ namespace Rendering { _yOffset_01 = this->screenPointToTileNumber[iVar31 + iVar2 + -8]; DAT_00ed3148::instance = DAT_TileMapState::instance.LogicLayer[_yOffset_01]; if ((DAT_00ed3148::instance & 0x30) == 0) { - if ((iVar31 < 2) || (bVar13 = true, iVar16 + -2 <= iVar31)) { - bVar13 = false; + if ((iVar31 < 2) || (bVar13 = 1, iVar16 + -2 <= iVar31)) { + bVar13 = 0; } uVar32 = (uint)DAT_TileMapState::instance.FloatingLayer[_yOffset_01]; DAT_RenderMap_ImageID::instance @@ -2299,7 +2299,7 @@ namespace Rendering { puVar1 = DAT_TileMapState::instance.MiscDisplayLayer + _yOffset_01; uVar29 = (uint)DAT_TileMapState::instance.BuildingLayer[_yOffset_01]; DAT_00ed3154::instance = -(uint)((*puVar1 & 0x20) != 0) & 0x5a; - if (_flatView) { + if (_flatView != 0) { if (uVar29 == 0) { if ((DAT_00ed3148::instance & 0x100) == 0) { if ((((char)DAT_00ed3148::instance < '\0') @@ -2362,14 +2362,14 @@ namespace Rendering { DAT_RenderMap_YOffset::instance = 8; } if (uVar29 != 0) { - if (((local_1c < viewportWidth) && (bVar13)) && (4 < iVar31)) { + if (((local_1c < viewportWidth) && (bVar13 != 0)) && (4 < iVar31)) { psVar17 = &DAT_BuildingsState::instance.buildings[uVar29].surfaceAreaUnk; *psVar17 = *psVar17 + 1; } uVar9 = *this->viewportState.ptrColor; *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; if ((DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].direction != 0) - && (bVar13)) { + && (bVar13 != 0)) { iVar23 = (int)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] .tileOffset; /* @@ -2393,7 +2393,7 @@ namespace Rendering { (DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + 0x200 + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); } - if ((!_flatView) + if ((_flatView == 0) || (DAT_MapRenderDefinedData::instance.BuildingRenderSomeTypeArray [(short)DAT_BuildingsState::instance.buildings[uVar29].buildingType] < 0)) { @@ -2468,7 +2468,7 @@ namespace Rendering { } iVar23 = DAT_RenderMap_YOffset::instance; if (uVar32 != 0) { - if ((DAT_TileMapState::instance.refreshRelatedOne != 0) && (!_flatView)) { + if ((DAT_TileMapState::instance.refreshRelatedOne != 0) && (_flatView == 0)) { if ((DAT_TileMapState::instance.LogicLayer[_yOffset_01] & 0x10000000U) == 0) { if ((DAT_TileMapState::instance.LogicLayer[_yOffset_01] & 0x100U) != 0) { if (DAT_TileMapState::instance.BuildingLayer[_yOffset_01] == 0) { @@ -2495,7 +2495,7 @@ namespace Rendering { if ((uVar29 & 1) != 0) { iVar26 = iVar23; if (((((uVar29 & 8) != 0) && (DAT_TileMapState::instance.refreshRelatedOne != 0)) - && (!_flatView)) + && (_flatView == 0)) && (iVar26 = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::getTotalHeightAt, DAT_TileMapState::ptr)(_yOffset_01, 0), iVar26 < 0)) { @@ -2571,7 +2571,7 @@ namespace Rendering { local_c = 0xc9; DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated; } - if ((!_flatView) && (local_48 = _zoomOffset, _zoomOffset < _vpWidthPlus1_1)) { + if ((_flatView == 0) && (local_48 = _zoomOffset, _zoomOffset < _vpWidthPlus1_1)) { local_20 = this->screenPointToTileNumber + _zoomOffset + iVar2 + -8; do { iVar31 = *local_20; @@ -2579,9 +2579,9 @@ namespace Rendering { if ((DAT_GmImageAddressToBeRendered::instance != 0) && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar31] & 0x3c0) == 0)) { if ((local_48 < 2) || (_vpWidthPlus1_1 + -2 <= local_48)) { - bVar13 = false; + bVar13 = 0; } else { - bVar13 = true; + bVar13 = 1; } DAT_00ed3148::instance = DAT_TileMapState::instance.LogicLayer[iVar31]; if ((DAT_00ed3148::instance & 0x400) != 0) { @@ -2589,7 +2589,7 @@ namespace Rendering { .buildings[DAT_TileMapState::instance.BuildingLayer[iVar31]] .tickRelatedVisuallyActiveIndicator; sVar30 = *psVar17; - if (((0 < sVar30) && (sVar30 < 5)) && (bVar13)) { + if (((0 < sVar30) && (sVar30 < 5)) && (bVar13 != 0)) { DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[iVar31]; DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 4ec0a75ce..faeeac64a 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37341,7 +37341,7 @@ SHC_3BB0A8C1_0x004E8CA0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E8CC0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E8CF0 | 29.4% | frame slot allocation differs +SHC_3BB0A8C1_0x004E8CF0 | 31.8% | reg alloc + stack slot order SHC_3BB0A8C1_0x004E9000 | 0.0% | Pending From 09c14450e12ee8edc7a54680d02015ca60fce57d Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:31:44 +0200 Subject: [PATCH 48/77] reimplement: SHC_3BB0A8C1_0x004E3980 44.97% reg alloc, const-in-reg --- .../renderGmOverlayBuilding.cpp | 50 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp index cc901b9b0..56555806d 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp @@ -41,8 +41,6 @@ namespace Rendering { short sVar1; BuildingTypeShort BVar2; int iVar3; - int iVar4; - int iVar5; int iVar6; int* piVar7; uint uVar8; @@ -58,8 +56,6 @@ namespace Rendering { int local_8; int local_4; - iVar5 = yUnk; - iVar4 = xUnk; DAT_RenderedUnitOwner::instance = DAT_BuildingsState::instance.buildings[tileIndex].playerColorUnk; local_18 = 0; local_14 = 0; @@ -1639,12 +1635,12 @@ namespace Rendering { } iVar11 = DAT_BuildingDefinedData::instance .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]; - xUnk = 0; - yUnk = 0; + int barXOffset = 0; + int barYOffset = 0; if (iVar11 == 0) { uVar8 = DAT_BuildingsState::instance.buildings[tileIndex].widthOrHeight; - xUnk = uVar8 << 5; - yUnk = uVar8 << 4; + barXOffset = uVar8 << 5; + barYOffset = uVar8 << 4; } if (((((DAT_GameCore::instance.currentMenuViewType == OpenSHC::UI::Enums::MVT_BUILDING_AND_STATUS_MENU) && (tileIndex == DAT_BuildingsState::instance.menuSelectedBuildingID)) @@ -1670,23 +1666,23 @@ namespace Rendering { (int)DAT_BuildingsState::instance.buildings[tileIndex].currentHealth, (int)((int)(sVar1))); switch (DAT_BuildingsState::instance.buildings[tileIndex].buildingType) { case OpenSHC::Map::Buildings::BT_GATEHOUSELARGE: - yUnk = yUnk + 0x14; + barYOffset = barYOffset + 0x14; break; case OpenSHC::Map::Buildings::BT_GATEHOUSESMALL: - yUnk = yUnk + 0x1e; + barYOffset = barYOffset + 0x1e; break; case OpenSHC::Map::Buildings::BT_SIEGETOWER_PLACED: - yUnk = yUnk + -0x1e; + barYOffset = barYOffset + -0x1e; break; case OpenSHC::Map::Buildings::BT_TOWER2: - yUnk = yUnk + 0x50; + barYOffset = barYOffset + 0x50; break; case OpenSHC::Map::Buildings::BT_TOWER3: case OpenSHC::Map::Buildings::BT_TOWER4: - yUnk = yUnk + 0x5a; + barYOffset = barYOffset + 0x5a; break; case OpenSHC::Map::Buildings::BT_TOWER5: - yUnk = yUnk + 100; + barYOffset = barYOffset + 100; } if ((uint)(iVar6 / 10) < 0xb) { BVar2 = DAT_BuildingsState::instance.buildings[tileIndex].buildingType; @@ -1715,16 +1711,16 @@ namespace Rendering { || ((DAT_TileMapState::instance.mapOrientation == 2) && (iVar9 == 0xc)) || ((DAT_TileMapState::instance.mapOrientation == 4) && (iVar9 == 0)) || ((DAT_TileMapState::instance.mapOrientation == 6) && (iVar9 == 3))) { - iVar11 = (iVar5 - iVar11) - yUnk; + iVar11 = (yUnk - iVar11) - barYOffset; MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, iVar4 + 4, iVar11 + -0xc); + OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, xUnk + 4, iVar11 + -0xc); } } else { - iVar11 = (iVar5 - iVar11) - yUnk; + iVar11 = (yUnk - iVar11) - barYOffset; MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, iVar4 + 4, iVar11 + -0xc); + OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, xUnk + 4, iVar11 + -0xc); } } } @@ -1737,26 +1733,26 @@ namespace Rendering { } iVar11 = uVar8 + 0xd3; maskGmID = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; - iVar9 = (iVar5 + iVar9 = (yUnk - DAT_BuildingDefinedData::instance .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) - - yUnk; + - barYOffset; iVar6 = uVar8 + 0xcb; GVar12 = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, - DAT_TextureRenderCoreObject::ptr)(GVar12, iVar6, iVar4 + -0x23, iVar9 + -0x2a, maskGmID, iVar11, 0); + DAT_TextureRenderCoreObject::ptr)(GVar12, iVar6, xUnk + -0x23, iVar9 + -0x2a, maskGmID, iVar11, 0); } else if ((DAT_BuildingsState::instance.buildings[tileIndex].currentlyNeededEmployeeCount != 0) && (DAT_GameCore::instance.field63_0x108 != 0)) { iVar11 = DAT_TileMapState::instance.field161_0x5549c0 + 0x128; maskGmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; - iVar9 = (iVar5 + iVar9 = (yUnk - DAT_BuildingDefinedData::instance .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) - - yUnk; + - barYOffset; iVar6 = DAT_TileMapState::instance.field161_0x5549c0 + 0x118; GVar12 = OpenSHC::IO::Graphics::GID_FLOATS_NEW; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, - DAT_TextureRenderCoreObject::ptr)(GVar12, iVar6, iVar4 + -0x23, iVar9 + -0x2a, maskGmID, iVar11, 0); + DAT_TextureRenderCoreObject::ptr)(GVar12, iVar6, xUnk + -0x23, iVar9 + -0x2a, maskGmID, iVar11, 0); } } sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field68_0xc2; @@ -1771,11 +1767,11 @@ namespace Rendering { iVar6 = DAT_TileMapState::instance.field161_0x5549c0 + 0x74; } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar6, iVar4 + -0x23, - ((iVar5 + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar6, xUnk + -0x23, + ((yUnk - DAT_BuildingDefinedData::instance .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) - - xUnk) + - barXOffset) + -0x2a, OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar11, 0); DAT_BuildingsState::instance.buildings[tileIndex].field68_0xc2 = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index faeeac64a..f2c03d6d7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36503,7 +36503,7 @@ SHC_3BB0A8C1_0x004E3869 | 0.0% | Pending SHC_3BB0A8C1_0x004E3870 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E3980 | 34.2% | reg alloc + tail merging +SHC_3BB0A8C1_0x004E3980 | 45.0% | reg alloc, const-in-reg SHC_3BB0A8C1_0x004E46C0 | 0.0% | Pending From 0b41fd76e0c73eac8632c519318f9a65ab540e8c Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:20:00 +0200 Subject: [PATCH 49/77] build: give each worktree its own mspdbsrv endpoint mspdbsrv.exe is a per-user singleton keyed on _MSPDBSRV_ENDPOINT_, and every worktree carries its own copy of MSVC1400-SP1. Two worktrees building at the same time shared one server and one image name, so: - cl.exe could end up talking to another worktree's copy of mspdbsrv, and - the unconditional "taskkill /f /im mspdbsrv.exe" at the start of a build took down the PDB server of any other worktree mid-compile. Either way the other build dies with "fatal error C1090: PDB API call failed, error code '23'", usually while expanding a precompiled header, so the error points at xstring or FunctionResolver.h rather than at anything the author changed. Derive the endpoint from the worktree directory name and kill only the mspdbsrv running out of this worktree. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01A4PvfebpUzaMXy93EutBjJ --- build.bat | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/build.bat b/build.bat index 40f1f3b08..028dee29a 100644 --- a/build.bat +++ b/build.bat @@ -23,16 +23,21 @@ if "%~1"=="" ( set "PRESET=%~1" set "TARGET=%~2" -:: --- Kill mspdbsrv.exe if it's running --- -tasklist | find /I "mspdbsrv.exe" >nul -if not errorlevel 1 ( - if not defined WRAP_QUIET echo Stopping mspdbsrv.exe... - taskkill /f /t /im mspdbsrv.exe >nul - if errorlevel 1 ( - if not defined WRAP_QUIET echo [WARNING] Failed to stop mspdbsrv.exe, continuing... - ) +:: --- Give this worktree its own PDB server --- +:: mspdbsrv.exe is a per-user singleton keyed on _MSPDBSRV_ENDPOINT_, and every worktree +:: carries its own copy of the toolchain. Sharing one endpoint across worktrees makes +:: cl.exe talk to whichever copy started first and fail with +:: fatal error C1090: PDB API call failed, error code '23' +if not defined _MSPDBSRV_ENDPOINT_ ( + for %%I in ("%~dp0.") do set "_MSPDBSRV_ENDPOINT_=openshc_%%~nxI" ) +:: --- Kill this worktree's mspdbsrv.exe if it's running --- +:: Only ours: killing every instance by image name takes down the PDB server of any other +:: worktree that is building at the same time, which fails their build with C1090. +powershell -NoProfile -Command ^ + "Get-Process mspdbsrv -ErrorAction SilentlyContinue | Where-Object { $_.Path -like '%~dp0*' } | Stop-Process -Force -ErrorAction SilentlyContinue" >nul 2>&1 + :: --- Run cmake configure using preset --- if not defined WRAP_QUIET echo [INFO] Configuring with preset "%PRESET%"... call .\cmakew --preset "%PRESET%" From 503ff52d34b6e69fae9e925de9685da3b1137005 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:37:19 +0200 Subject: [PATCH 50/77] types: the batch/floater counters are signed ints, not undefined4 availableFloaterIndex, unitBatchedRenderCounterUntil6 and unitRender1..5 are compared and bounded with signed jumps in the original (jl/jge, not jb/jae), so every reimplementation that touched them needed an (int) cast. Typing them int drops nine casts; generated code is unchanged. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KGVnoVPWJMmdidJaxX18se --- src/OpenSHC/Rendering/ViewportRenderState.hpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState.hpp b/src/OpenSHC/Rendering/ViewportRenderState.hpp index a64936a92..82a07dbc0 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState.hpp +++ b/src/OpenSHC/Rendering/ViewportRenderState.hpp @@ -55,7 +55,7 @@ namespace Rendering { undefined4 translationTracker1; // 0x001899E4 length: 4 undefined4 translationResult2; // 0x001899E8 length: 4 Floater floatersArray[250]; // 0x001899EC length: 7000 - undefined4 availableFloaterIndex; // 0x0018B544 length: 4 + int availableFloaterIndex; // 0x0018B544 length: 4 int landscapeAnimationRandomTileArray[45]; // 0x0018B548 length: 180 byte landscapeAnimationValueArray[60]; // 0x0018B5FC length: 60 int landscapeSeaWhiteCapsAnimationFrames[45]; // 0x0018B638 length: 180 @@ -78,17 +78,17 @@ namespace Rendering { int field55_0x18b764; // 0x0018B764 length: 4 int unknownCounterUntil_0x10; // 0x0018B768 length: 4 int unknownCounterUntil_0x200; // 0x0018B76C length: 4 - undefined4 unitBatchedRenderCounterUntil6; // 0x0018B770 length: 4 + int unitBatchedRenderCounterUntil6; // 0x0018B770 length: 4 UnitRenderHelpStructure unitBatch1[500]; // 0x0018B774 length: 16000 UnitRenderHelpStructure unitBatch2[500]; // 0x0018F5F4 length: 16000 UnitRenderHelpStructure unitBatch3[500]; // 0x00193474 length: 16000 UnitRenderHelpStructure unitBatch4[500]; // 0x001972F4 length: 16000 UnitRenderHelpStructure unitBatch5[500]; // 0x0019B174 length: 16000 - undefined4 unitRender1; // 0x0019EFF4 length: 4 - undefined4 unitRender2; // 0x0019EFF8 length: 4 - undefined4 unitRender3; // 0x0019EFFC length: 4 - undefined4 unitRender4; // 0x0019F000 length: 4 - undefined4 unitRender5; // 0x0019F004 length: 4 + int unitRender1; // 0x0019EFF4 length: 4 + int unitRender2; // 0x0019EFF8 length: 4 + int unitRender3; // 0x0019EFFC length: 4 + int unitRender4; // 0x0019F000 length: 4 + int unitRender5; // 0x0019F004 length: 4 private: ViewportRenderState(ViewportRenderState const&); From dd46e3c9031543cfbdfacb7a165ea00cff96ed75 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:38:52 +0200 Subject: [PATCH 51/77] reimplement: SHC_3BB0A8C1_0x004E6340 100.00% Reimplemented --- .../ViewportRenderState/clearAllFloatingLayerElements.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp b/src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp index 000727406..692dc74b0 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp @@ -9,8 +9,8 @@ namespace Rendering { void ViewportRenderState::clearAllFloatingLayerElements() { int floaterIndex = 1; - if (floaterIndex < (int)this->availableFloaterIndex) { - for (; floaterIndex < (int)this->availableFloaterIndex; floaterIndex++) { + if (floaterIndex < this->availableFloaterIndex) { + for (; floaterIndex < this->availableFloaterIndex; floaterIndex++) { DAT_TileMapState::instance.FloatingLayer[this->floatersArray[floaterIndex].tile] = 0; this->floatersArray[floaterIndex].id = 0; } From 934a20a57ef0117c34e892a0fb2165a9ddcf0b45 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:38:52 +0200 Subject: [PATCH 52/77] reimplement: SHC_3BB0A8C1_0x004E63A0 93.79% one reg-copy form differs --- .../ViewportRenderState/createFloatingLayerElement.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp b/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp index c7df92330..c081fe66a 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp @@ -14,7 +14,7 @@ namespace Rendering { if (tile < 0) { return; } - if (250 <= (int)this->availableFloaterIndex) { + if (250 <= this->availableFloaterIndex) { return; } From c8dc438117f88b6aa422d48ab8f15e165d150175 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:38:53 +0200 Subject: [PATCH 53/77] reimplement: SHC_3BB0A8C1_0x004E7810 34.46% frame and reg allocation diffe --- .../Rendering/ViewportRenderState/renderUnits.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp index bdfc4dbd9..ff26cd6f2 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp @@ -64,28 +64,28 @@ namespace Rendering { _imageID = 0; _blendStrength = 0; _gmID = 0; - if (5 < (int)this->unitBatchedRenderCounterUntil6) { + if (5 < this->unitBatchedRenderCounterUntil6) { this->unitBatchedRenderCounterUntil6 = 1; } - if ((int)this->unitBatchedRenderCounterUntil6 == 1) { + if (this->unitBatchedRenderCounterUntil6 == 1) { this->unitRender1 = 0; _renderBatchSize = renderCount1; - } else if ((int)this->unitBatchedRenderCounterUntil6 == 2) { + } else if (this->unitBatchedRenderCounterUntil6 == 2) { this->unitRender2 = 0; _renderBatchSize = renderCount2; - } else if ((int)this->unitBatchedRenderCounterUntil6 == 3) { + } else if (this->unitBatchedRenderCounterUntil6 == 3) { this->unitRender3 = 0; _renderBatchSize = renderCount3; - } else if ((int)this->unitBatchedRenderCounterUntil6 == 4) { + } else if (this->unitBatchedRenderCounterUntil6 == 4) { this->unitRender4 = 0; _renderBatchSize = renderCount4; - } else if ((int)this->unitBatchedRenderCounterUntil6 == 5) { + } else if (this->unitBatchedRenderCounterUntil6 == 5) { this->unitRender5 = 0; _renderBatchSize = renderCount5; } if (0 < _renderBatchSize) { for (int _batchedUnitID = 0; _batchedUnitID < _renderBatchSize; _batchedUnitID++) { - switch ((int)this->unitBatchedRenderCounterUntil6) { + switch (this->unitBatchedRenderCounterUntil6) { case 1: _unitID = this->unitBatch1[_batchedUnitID].unitIDOrStatus; DAT_RenderedUnitOwner::instance = this->unitBatch1[_batchedUnitID].ownerColor; From c04f4ebfb67de17e02fd79baf634daee9def17b8 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:38:53 +0200 Subject: [PATCH 54/77] reimplement: SHC_3BB0A8C1_0x004E26D0 54.08% esi/edx allocation differs --- .../scheduleUnitForBatchedRendering.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp b/src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp index 4d9b6da97..9a0054607 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp @@ -28,7 +28,7 @@ namespace Rendering { switch (batch) { case 1: - if ((int)this->unitRender1 < 500) { + if (this->unitRender1 < 500) { this->unitBatch1[this->unitRender1].unitIDOrStatus = unitIDOrStatus; this->unitBatch1[this->unitRender1].ownerColor = DAT_RenderedUnitOwner::instance; this->unitBatch1[this->unitRender1].spriteID = DAT_CurrentlyRenderedSpriteID::instance; @@ -41,7 +41,7 @@ namespace Rendering { } break; case 2: - if ((int)this->unitRender2 < 500) { + if (this->unitRender2 < 500) { this->unitBatch2[this->unitRender2].unitIDOrStatus = unitIDOrStatus; this->unitBatch2[this->unitRender2].ownerColor = DAT_RenderedUnitOwner::instance; this->unitBatch2[this->unitRender2].spriteID = DAT_CurrentlyRenderedSpriteID::instance; @@ -54,7 +54,7 @@ namespace Rendering { } break; case 3: - if ((int)this->unitRender3 < 500) { + if (this->unitRender3 < 500) { this->unitBatch3[this->unitRender3].unitIDOrStatus = unitIDOrStatus; this->unitBatch3[this->unitRender3].ownerColor = DAT_RenderedUnitOwner::instance; this->unitBatch3[this->unitRender3].spriteID = DAT_CurrentlyRenderedSpriteID::instance; @@ -67,7 +67,7 @@ namespace Rendering { } break; case 4: - if ((int)this->unitRender4 < 500) { + if (this->unitRender4 < 500) { this->unitBatch4[this->unitRender4].unitIDOrStatus = unitIDOrStatus; this->unitBatch4[this->unitRender4].ownerColor = DAT_RenderedUnitOwner::instance; this->unitBatch4[this->unitRender4].spriteID = DAT_CurrentlyRenderedSpriteID::instance; @@ -80,7 +80,7 @@ namespace Rendering { } break; case 5: - if ((int)this->unitRender5 < 500) { + if (this->unitRender5 < 500) { this->unitBatch5[this->unitRender5].unitIDOrStatus = unitIDOrStatus; this->unitBatch5[this->unitRender5].ownerColor = DAT_RenderedUnitOwner::instance; this->unitBatch5[this->unitRender5].spriteID = DAT_CurrentlyRenderedSpriteID::instance; From ba307f4cbfaba6238c7eadb813696d24096ae67d Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 01:43:29 +0200 Subject: [PATCH 55/77] reimplement: SHC_3BB0A8C1_0x004E2050 28.69% reg alloc; rowStart kept in re --- .../ViewportRenderState/setTileSystemMemoryLookupArrays.cpp | 1 + status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp index a67da7e1b..a8399330d 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp @@ -45,6 +45,7 @@ namespace Rendering { rowWidth = rowWidth + 2; } + rowStart = 80000; rowSpan = 400 - rowWidth; for (int row = 200; rowStart < 160000; row++) { rowFirstColumn = rowFirstColumn + 1; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index f2c03d6d7..d651287cd 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36391,7 +36391,7 @@ SHC_3BB0A8C1_0x004E1F50 | 0.0% | Pending SHC_3BB0A8C1_0x004E1FA0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E2050 | 26.1% | reg alloc; frame now matches +SHC_3BB0A8C1_0x004E2050 | 28.7% | reg alloc; rowStart kept in re SHC_3BB0A8C1_0x004E21E0 | 0.0% | Pending From 93e4126ff49103040d535eca28d07ffcab1e8181 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 09:09:53 +0200 Subject: [PATCH 56/77] reimplement: SHC_3BB0A8C1_0x004E8430 49.45% reg alloc + tail merging --- .../updateBuildingPreviewPosition.cpp | 10 ++++++---- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp index c5fae97a2..cafe6d6f6 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp @@ -104,10 +104,11 @@ namespace Rendering { this->viewportState.mouseRayEntityID = DAT_TileMapState::instance.EntityLayer[minimapTile]; int minimapGateTile = 0; - if (DAT_TileMapState::instance.BuildingLayer[minimapTile] <= 0) { + ushort minimapBuildingID = DAT_TileMapState::instance.BuildingLayer[minimapTile]; + if ((short)minimapBuildingID <= 0) { if ((DAT_TileMapState::instance.LogicLayer[minimapTile] & 0x100U) != 0) { minimapGateTile = minimapTile; - } else if (DAT_TileMapState::instance.BuildingLayer[minimapTile] <= 0) { + } else if ((short)minimapBuildingID <= 0) { this->viewportState.field18_0x48 = DAT_TileMapState::instance.BuildingWasLayer[minimapTile]; } } @@ -218,10 +219,11 @@ namespace Rendering { int lastBuildingID = -1; int hoveredBuildingID = -1; int hoveredGateTile = -1; - if (DAT_TileMapState::instance.BuildingLayer[this->viewportState.mouseTile] <= 0) { + ushort hoveredBuildingLayer = DAT_TileMapState::instance.BuildingLayer[this->viewportState.mouseTile]; + if ((short)hoveredBuildingLayer <= 0) { if ((DAT_TileMapState::instance.LogicLayer[this->viewportState.mouseTile] & 0x100U) != 0) { hoveredGateTile = this->viewportState.mouseTile; - } else if (DAT_TileMapState::instance.BuildingLayer[this->viewportState.mouseTile] <= 0) { + } else if ((short)hoveredBuildingLayer <= 0) { this->viewportState.field18_0x48 = DAT_TileMapState::instance.BuildingWasLayer[this->viewportState.mouseTile]; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d651287cd..003a9967b 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37217,7 +37217,7 @@ SHC_3BB0A8C1_0x004E8429 | 0.0% | Pending SHC_3BB0A8C1_0x004E842A | 0.0% | Pending -SHC_3BB0A8C1_0x004E8430 | 44.1% | reg alloc + tail merging +SHC_3BB0A8C1_0x004E8430 | 49.5% | reg alloc + tail merging SHC_3BB0A8C1_0x004E8BFC | 0.0% | Pending From f8dab5cd643d4f17bb08fdd161782c7b2e997229 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 11:22:00 +0200 Subject: [PATCH 57/77] reimplement: SHC_3BB0A8C1_0x004E7770 38.71% LTCG ecx reuse in callers --- src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp b/src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp index a1ff7f57d..e74ca7fbd 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp @@ -30,8 +30,8 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setupViewport, this) (0, 0, DAT_WindowAndDirectDraw::instance.resolutionX, screenPixelHeight); - this->viewportState.viewportX = savedViewportX - this->viewportState.mbr_0xac * 0x20; this->viewportState.viewportY = savedViewportY - this->viewportState.mbr_0xb0 * 8; + this->viewportState.viewportX = savedViewportX - this->viewportState.mbr_0xac * 0x20; MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::setViewportBasedOnMapSize, this)(); } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 003a9967b..d51f1f9e1 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36983,7 +36983,7 @@ SHC_3BB0A8C1_0x004E64D0 | 86.9% | reccmp label noise only SHC_3BB0A8C1_0x004E66F0 | 60.0% | consts kept in regs by orig -SHC_3BB0A8C1_0x004E7770 | 36.6% | LTCG ecx reuse in callers +SHC_3BB0A8C1_0x004E7770 | 38.7% | LTCG ecx reuse in callers SHC_3BB0A8C1_0x004E7800 | 100.0% | Reimplemented From 52481b9601fc982bf70d0c8f7fb78b060496c8e9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 11:22:01 +0200 Subject: [PATCH 58/77] reimplement: SHC_3BB0A8C1_0x004E2050 28.91% reg alloc; frame matches --- .../ViewportRenderState/setTileSystemMemoryLookupArrays.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp index a8399330d..69ed10b7a 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp @@ -89,8 +89,8 @@ namespace Rendering { this->screenPointToTileNumber[firstHalfIndex] = tileGrid[diagonal + column]; scratch6 = scratch6 + -1; firstHalfIndex = firstHalfIndex + 1; - column = column + 1; diagonal = diagonal + -400; + column = column + 1; } while (0 < scratch6); diagonalBase = diagonalBase + 400; destIndex = destIndex + 401; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d51f1f9e1..9a2e214a5 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36391,7 +36391,7 @@ SHC_3BB0A8C1_0x004E1F50 | 0.0% | Pending SHC_3BB0A8C1_0x004E1FA0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E2050 | 28.7% | reg alloc; rowStart kept in re +SHC_3BB0A8C1_0x004E2050 | 28.9% | reg alloc; frame matches SHC_3BB0A8C1_0x004E21E0 | 0.0% | Pending From b49debcf732328e9104626b347adcaef9739f605 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 12:07:26 +0200 Subject: [PATCH 59/77] reimplement: SHC_3BB0A8C1_0x004E2AD0 45.91% reg alloc, type-load CSE --- .../ViewportRenderState/renderGmOverlayBuilding2.cpp | 10 +++++----- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp index c055335d2..35a53fc1d 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp @@ -103,15 +103,15 @@ namespace Rendering { } else { if ((DAT_BuildingsState::instance.buildings[buildingID].currentlyNeededEmployeeCount != 0) && (DAT_GameCore::instance.field63_0x108 != 0)) { - renderY = DAT_TileMapState::instance.field161_0x5549c0 + 0x128; - maskGmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + gmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + renderX = DAT_TileMapState::instance.field161_0x5549c0 + 0x118; renderBaseY = (screenY - DAT_BuildingDefinedData::instance .BuildingHeights[DAT_BuildingsState::instance.buildings[buildingID].buildingType]) - heightOffset; - renderX = DAT_TileMapState::instance.field161_0x5549c0 + 0x118; - gmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + maskGmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + renderY = DAT_TileMapState::instance.field161_0x5549c0 + 0x128; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)( gmID, renderX, screenX + -0x23, renderBaseY + -0x2a, maskGmID, renderY, 0); @@ -632,10 +632,10 @@ namespace Rendering { DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY, (int)((int)(blendStrength))); } else { - renderY = DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY; frame = DAT_BuildingsState::instance.buildings[buildingID].animationFrame; renderX = DAT_BuildingsState::instance.buildings[buildingID].spriteOffetX + screenX; gmID = (GmID)DAT_CurrentlyRenderedSpriteID::instance; + renderY = DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY; } } if (frame != 0) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 9a2e214a5..41078bea7 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36415,7 +36415,7 @@ SHC_3BB0A8C1_0x004E2AC0 | 0.0% | Pending SHC_3BB0A8C1_0x004E2AC4 | 0.0% | Pending -SHC_3BB0A8C1_0x004E2AD0 | 45.5% | reg alloc, type-load CSE +SHC_3BB0A8C1_0x004E2AD0 | 45.9% | reg alloc, type-load CSE SHC_3BB0A8C1_0x004E3828 | 0.0% | Pending From 4f0ad4fe95a448f1383a96d66a80e9bac6b72430 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 12:07:26 +0200 Subject: [PATCH 60/77] reimplement: SHC_3BB0A8C1_0x004E8430 49.62% reg alloc + tail merging --- .../ViewportRenderState/updateBuildingPreviewPosition.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp index cafe6d6f6..efe4e0d10 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp @@ -188,10 +188,10 @@ namespace Rendering { } this->viewportState.mouseTile = this->screenPointToTileNumber[lookupIndex + -8]; - this->viewportState.field5_0x14 = DAT_TileMapState::instance.LogicLayer[this->viewportState.mouseTile]; this->viewportState.field6_0x18 = DAT_TileMapState::instance.BuildingLayer[this->viewportState.mouseTile]; this->viewportState.field8_0x20 = (short)DAT_TileMapState::instance.UnitLayer[this->viewportState.mouseTile]; this->viewportState.field18_0x48 = 0; + this->viewportState.field5_0x14 = DAT_TileMapState::instance.LogicLayer[this->viewportState.mouseTile]; if (this->viewportState.mouseRayUnitID != 0) { this->viewportState.mouseRayLastUnitID = this->viewportState.mouseRayUnitID; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 41078bea7..5ab974c34 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37217,7 +37217,7 @@ SHC_3BB0A8C1_0x004E8429 | 0.0% | Pending SHC_3BB0A8C1_0x004E842A | 0.0% | Pending -SHC_3BB0A8C1_0x004E8430 | 49.5% | reg alloc + tail merging +SHC_3BB0A8C1_0x004E8430 | 49.6% | reg alloc + tail merging SHC_3BB0A8C1_0x004E8BFC | 0.0% | Pending From 6559b71e879c0c1eb257f0cf66c36e9d7141700e Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 12:12:16 +0200 Subject: [PATCH 61/77] reimplement: SHC_3BB0A8C1_0x004E8CF0 31.83% reg alloc + stack slot order --- src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp index a44a1ed2d..e4357d013 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp @@ -1017,7 +1017,7 @@ namespace Rendering { != DAT_GameState::instance.mapAndTime .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) { iVar26 = DAT_UnitsState::instance.units[local_60].assassinsMicroDistanceToEnemyUnk; - if ((iVar26 < 160) + if ((iVar26 <= 160) || ((UVar4 = DAT_UnitsState::instance.units[local_60].state.generic, UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK || (UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK_WALL)))) { From b832da8cdd2b5bd00fdedce8e71869804d29a3ae Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 12:12:17 +0200 Subject: [PATCH 62/77] reimplement: SHC_3BB0A8C1_0x004E7810 34.69% frame and reg allocation diffe --- src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp index ff26cd6f2..098c340dc 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp @@ -182,7 +182,7 @@ namespace Rendering { .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]) && (120 < DAT_UnitsState::instance.units[_unitID].assassinsMicroDistanceToEnemyUnk)) && ((DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY - || (DAT_UnitsState::instance.units[_unitID].idleCounterUnk < 2400)))) { + || (DAT_UnitsState::instance.units[_unitID].idleCounterUnk <= 2400)))) { _alpha = 0x20 - (0x20 - _alpha) / 2; } overlayX = DAT_UnitsState::instance.units[_unitID].imageID2; @@ -415,7 +415,7 @@ namespace Rendering { .playerTeams[DAT_UnitsState::instance.units[_unitID].owner] == DAT_GameState::instance.mapAndTime .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) - && ((DAT_UnitsState::instance.units[_unitID].assassinsMicroDistanceToEnemyUnk < 160 + && ((DAT_UnitsState::instance.units[_unitID].assassinsMicroDistanceToEnemyUnk <= 160 || ((unitState = DAT_UnitsState::instance.units[_unitID].state.generic, unitState == OpenSHC::Map::Units::States::US_MELEE_ATTACK || (unitState == OpenSHC::Map::Units::States::US_MELEE_ATTACK_WALL)))))) { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 5ab974c34..91bfe8204 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36987,7 +36987,7 @@ SHC_3BB0A8C1_0x004E7770 | 38.7% | LTCG ecx reuse in callers SHC_3BB0A8C1_0x004E7800 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E7810 | 34.5% | frame and reg allocation diffe +SHC_3BB0A8C1_0x004E7810 | 34.7% | frame and reg allocation diffe SHC_3BB0A8C1_0x004E78D0 | 0.0% | Pending From 6fda8f1fb279f4bfa53d4a45d509b80aa6087e7d Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 12:41:02 +0200 Subject: [PATCH 63/77] reimplement: SHC_3BB0A8C1_0x004E5ED0 43.08% reg alloc, one extra spill --- .../computeMouseTileFromScreenPosition.cpp | 340 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 172 insertions(+), 170 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp index fa0c597c7..dd29470ee 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp @@ -22,196 +22,198 @@ namespace Rendering { this->viewportState.field24_0x60 = 0; this->viewportState.mouseX = 0; this->viewportState.mouseY = 0; - if (this->viewportState.field0_0x0 == 0) { - this->viewportState.field24_0x60 = 0; - this->viewportState.mouseX = 0; - this->viewportState.mouseY = 0; - this->viewportState.field27_0x6c = 0; - return; - } - - uint quadrantX; - if (this->viewportState.isZoomedOutUnk == 0) { - uint viewportXInTile = this->viewportState.viewportX & 0x8000001f; - if ((int)viewportXInTile < 0) { - viewportXInTile = (viewportXInTile - 1 | 0xffffffe0) + 1; - } - quadrantX = (int)((viewportXInTile - this->windowX) + screenX) >> 1 & 0xf; - } else { - uint viewportXInTile = this->viewportState.viewportX & 0x8000001f; - if ((int)viewportXInTile < 0) { - viewportXInTile = (viewportXInTile - 1 | 0xffffffe0) + 1; - } - quadrantX = (int)((viewportXInTile + screenX * 2) - this->windowX) >> 1 & 0xf; - } - - uint viewportYInTile = this->viewportState.viewportY & 0x8000000f; - if ((int)viewportYInTile < 0) { - viewportYInTile = (viewportYInTile - 1 | 0xfffffff0) + 1; - } - int probeOffset = probeScreenY - screenY; - int probeDoubledY = screenY + probeScreenY; - if (DAT_TileMapState::instance.mapOrientation == 0) { - orientationBase = 8; - } else if (DAT_TileMapState::instance.mapOrientation == 6) { - orientationBase = 0x13a18; - } else if (DAT_TileMapState::instance.mapOrientation == 4) { - orientationBase = 0x27428; - } else if (DAT_TileMapState::instance.mapOrientation == 2) { - orientationBase = 0x3ae38; - } - - do { - if ((DAT_TileMapState::instance.field93_0x5548c8 != 0 - || DAT_TileMapState::instance.flatViewToggleValue2 != 0) - && probeOffset != -8) { - break; - } + if (this->viewportState.field0_0x0 != 0) { - int lookupIndex; - uint tileRowY; + uint quadrantX; if (this->viewportState.isZoomedOutUnk == 0) { - int unclampedY = (this->viewportState.viewportY - this->windowY) + 8 + probeScreenY; - tileRowY = (viewportYInTile - this->windowY) + -8 + probeScreenY; - int unclampedX = (screenX - this->windowX) + this->viewportState.viewportX; - lookupIndex = ((int)(unclampedX + (unclampedX >> 0x1f & 0x1fU)) >> 5) - + ((int)(unclampedY + (unclampedY >> 0x1f & 0xfU)) >> 4) * 0x191 + orientationBase; + uint viewportXInTile = this->viewportState.viewportX & 0x8000001f; + if ((int)viewportXInTile < 0) { + viewportXInTile = (viewportXInTile - 1 | 0xffffffe0) + 1; + } + quadrantX = (int)((viewportXInTile - this->windowX) + screenX) >> 1 & 0xf; } else { - int unclampedX = ((screenX * 2 + 0xa0) - this->windowX) + this->viewportState.viewportX; - tileRowY = (viewportYInTile - this->windowY) + probeDoubledY; - int unclampedY = (probeDoubledY - this->windowY) + this->viewportState.viewportY; - lookupIndex = ((int)(unclampedY + (unclampedY >> 0x1f & 0xfU)) >> 4) * 0x191 - + ((int)(unclampedX + (unclampedX >> 0x1f & 0x1fU)) >> 5) + orientationBase; + uint viewportXInTile = this->viewportState.viewportX & 0x8000001f; + if ((int)viewportXInTile < 0) { + viewportXInTile = (viewportXInTile - 1 | 0xffffffe0) + 1; + } + quadrantX = (int)((viewportXInTile + screenX * 2) - this->windowX) >> 1 & 0xf; } - int quadrant = DAT_MapRenderDefinedData::instance.field618_0xc24[tileRowY & 0xf][quadrantX]; - if (quadrant == 1) { - lookupIndex = lookupIndex + 200; - } else if (quadrant == 2) { - lookupIndex = lookupIndex + 0xc9; - } else if (quadrant == 3) { - lookupIndex = lookupIndex + 0x191; + uint viewportYInTile = this->viewportState.viewportY & 0x8000000f; + if ((int)viewportYInTile < 0) { + viewportYInTile = (viewportYInTile - 1 | 0xfffffff0) + 1; } - - int tile = this->screenPointToTileNumber[lookupIndex + -8]; - if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x30U) != 0) { - break; + int probeOffset = probeScreenY - screenY; + int probeDoubledY = screenY + probeScreenY; + if (DAT_TileMapState::instance.mapOrientation == 0) { + orientationBase = 8; + } else if (DAT_TileMapState::instance.mapOrientation == 6) { + orientationBase = 0x13a18; + } else if (DAT_TileMapState::instance.mapOrientation == 4) { + orientationBase = 0x27428; + } else if (DAT_TileMapState::instance.mapOrientation == 2) { + orientationBase = 0x3ae38; } - int tileHeightOffset - = DAT_TileMapState::instance.heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[tile]]; - if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x10000000U) != 0) { - tileHeightOffset = tileHeightOffset - + MACRO_CALL_MEMBER(OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, - DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[tile]); - } - if (this->viewportState.isZoomedOutUnk != 0) { - tileHeightOffset = tileHeightOffset / 2; - } + do { + if ((DAT_TileMapState::instance.field93_0x5548c8 != 0 + || DAT_TileMapState::instance.flatViewToggleValue2 != 0) + && probeOffset != -8) { + break; + } - if ((probeOffset - tileHeightOffset) + 8 + screenY <= screenY - || DAT_TileMapState::instance.field93_0x5548c8 != 0 - || DAT_TileMapState::instance.flatViewToggleValue2 != 0) { - foundTile = tile; - } + int lookupIndex; + uint tileRowY; + if (this->viewportState.isZoomedOutUnk == 0) { + int unclampedY = (this->viewportState.viewportY - this->windowY) + 8 + probeScreenY; + tileRowY = (viewportYInTile - this->windowY) + -8 + probeScreenY; + int unclampedX = (screenX - this->windowX) + this->viewportState.viewportX; + lookupIndex = ((int)(unclampedX + (unclampedX >> 0x1f & 0x1fU)) >> 5) + + ((int)(unclampedY + (unclampedY >> 0x1f & 0xfU)) >> 4) * 0x191 + orientationBase; + } else { + int unclampedX = ((screenX * 2 + 0xa0) - this->windowX) + this->viewportState.viewportX; + tileRowY = (viewportYInTile - this->windowY) + probeDoubledY; + int unclampedY = (probeDoubledY - this->windowY) + this->viewportState.viewportY; + lookupIndex = ((int)(unclampedY + (unclampedY >> 0x1f & 0xfU)) >> 4) * 0x191 + + ((int)(unclampedX + (unclampedX >> 0x1f & 0x1fU)) >> 5) + orientationBase; + } - probeScreenY = probeScreenY + 1; - probeDoubledY = probeDoubledY + 2; - probeOffset = probeOffset + 1; - } while (probeOffset < 0xff); - - this->viewportState.field24_0x60 = foundTile; - if (DAT_TileMapState::instance.PathConnectionLayer[foundTile] == 0 - || (DAT_TileMapState::instance.LogicLayer[foundTile] & 0x200U) != 0) { - uint direction = DAT_TileMapState::instance.field84_0x5548a4 + 4U & 0x80000007; - if ((int)direction < 0) { - direction = (direction - 1 | 0xfffffff8) + 1; - } - uint tileFlags = DAT_TileMapState::instance.LogicLayer[foundTile]; - int neighbourTile - = DAT_TileMapState::instance - .directionTranslationMatrix[this->tileTranslationMatrix_YComponent[foundTile]][direction] - + foundTile; - if ((tileFlags & 0x40000000) == 0) { - if ((tileFlags & 0x200) == 0) { - if ((tileFlags & 0x400) != 0) { - switch ( - DAT_BuildingsState::instance.buildings[DAT_TileMapState::instance.BuildingLayer[foundTile]] - .buildingType) { - 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_TOWER: - 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_TileMapState::instance.LogicLayer[neighbourTile] & 0x10000000U) != 0) { - this->viewportState.field24_0x60 = neighbourTile; + int quadrant = DAT_MapRenderDefinedData::instance.field618_0xc24[tileRowY & 0xf][quadrantX]; + if (quadrant == 1) { + lookupIndex = lookupIndex + 200; + } else if (quadrant == 2) { + lookupIndex = lookupIndex + 0xc9; + } else if (quadrant == 3) { + lookupIndex = lookupIndex + 0x191; + } + + int tile = this->screenPointToTileNumber[lookupIndex + -8]; + if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x30U) != 0) { + break; + } + + int tileHeightOffset + = DAT_TileMapState::instance.heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[tile]]; + if ((DAT_TileMapState::instance.LogicLayer[tile] & 0x10000000U) != 0) { + tileHeightOffset = tileHeightOffset + + MACRO_CALL_MEMBER( + OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, + DAT_BuildingsState::ptr)((int)DAT_TileMapState::instance.BuildingLayer[tile]); + } + if (this->viewportState.isZoomedOutUnk != 0) { + tileHeightOffset = tileHeightOffset / 2; + } + + if ((probeOffset - tileHeightOffset) + 8 + screenY <= screenY + || DAT_TileMapState::instance.field93_0x5548c8 != 0 + || DAT_TileMapState::instance.flatViewToggleValue2 != 0) { + foundTile = tile; + } + + probeScreenY = probeScreenY + 1; + probeDoubledY = probeDoubledY + 2; + probeOffset = probeOffset + 1; + } while (probeOffset < 0xff); + + this->viewportState.field24_0x60 = foundTile; + if (DAT_TileMapState::instance.PathConnectionLayer[foundTile] == 0 + || (DAT_TileMapState::instance.LogicLayer[foundTile] & 0x200U) != 0) { + uint direction = DAT_TileMapState::instance.field84_0x5548a4 + 4U & 0x80000007; + if ((int)direction < 0) { + direction = (direction - 1 | 0xfffffff8) + 1; + } + uint tileFlags = DAT_TileMapState::instance.LogicLayer[foundTile]; + int neighbourTile + = DAT_TileMapState::instance + .directionTranslationMatrix[this->tileTranslationMatrix_YComponent[foundTile]][direction] + + foundTile; + if ((tileFlags & 0x40000000) == 0) { + if ((tileFlags & 0x200) == 0) { + if ((tileFlags & 0x400) != 0) { + switch (DAT_BuildingsState::instance + .buildings[DAT_TileMapState::instance.BuildingLayer[foundTile]] + .buildingType) { + 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_TOWER: + 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_TileMapState::instance.LogicLayer[neighbourTile] & 0x10000000U) != 0) { + this->viewportState.field24_0x60 = neighbourTile; + } + break; + default: + this->viewportState.field24_0x60 = 0; + break; } - break; - default: + } else { this->viewportState.field24_0x60 = 0; - break; } - } else { - this->viewportState.field24_0x60 = 0; + } else if ((DAT_TileMapState::instance.LogicLayer[neighbourTile] & 0x100U) != 0) { + this->viewportState.field24_0x60 = neighbourTile; } - } else if ((DAT_TileMapState::instance.LogicLayer[neighbourTile] & 0x100U) != 0) { - this->viewportState.field24_0x60 = neighbourTile; } } - } - if ((DAT_TileMapState::instance.LogicLayer[this->viewportState.field24_0x60] & 0x10000300U) != 0 - && (DAT_TileMapState::instance.LogicLayer[this->viewportState.field24_0x60] & 2U) == 0) { - this->viewportState.field27_0x6c = 1; - } - this->viewportState.somePitchDitchID = 0; - this->viewportState.mouseAtomRefFloorTile = foundTile; + if ((DAT_TileMapState::instance.LogicLayer[this->viewportState.field24_0x60] & 0x10000300U) != 0 + && (DAT_TileMapState::instance.LogicLayer[this->viewportState.field24_0x60] & 2U) == 0) { + this->viewportState.field27_0x6c = 1; + } + this->viewportState.somePitchDitchID = 0; + this->viewportState.mouseAtomRefFloorTile = foundTile; + + if (this->viewportState.field24_0x60 == 0) { + this->viewportState.mouseY = 0; + this->viewportState.mouseX = 0; + this->viewportState.field27_0x6c = 0; + this->viewportState.field14_0x38 = 0; + this->viewportState.field16_0x40 = 0; + this->viewportState.field15_0x3c = 0; + return; + } - if (this->viewportState.field24_0x60 == 0) { - this->viewportState.mouseY = 0; - this->viewportState.mouseX = 0; - this->viewportState.field27_0x6c = 0; - this->viewportState.field14_0x38 = 0; - this->viewportState.field16_0x40 = 0; - this->viewportState.field15_0x3c = 0; - return; - } + this->viewportState.mouseY = this->tileTranslationMatrix_YComponent[this->viewportState.field24_0x60]; + this->viewportState.mouseX + = this->viewportState.field24_0x60 - this->translationMatrix[this->viewportState.mouseY].addXgetTile; - this->viewportState.mouseY = this->tileTranslationMatrix_YComponent[this->viewportState.field24_0x60]; - this->viewportState.mouseX - = this->viewportState.field24_0x60 - this->translationMatrix[this->viewportState.mouseY].addXgetTile; + int hoveredTile = this->viewportState.field24_0x60; + if (DAT_TileMapState::instance.flatViewToggleValue1 != 0) { + hoveredTile = this->viewportState.mouseTile; + } + this->viewportState.field14_0x38 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x40000000; + this->viewportState.field16_0x40 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x4000; + + int moatID = MACRO_CALL_MEMBER( + OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, DAT_TileMapState::ptr)(hoveredTile); + if (moatID == 0) { + this->viewportState.field14_0x38 = 0; + this->viewportState.field16_0x40 = 0; + } + this->viewportState.field15_0x3c = this->viewportState.field14_0x38; + if (DAT_GameState::instance.mapAndTime.playerTeams[DAT_TileMapState::instance.moats[moatID].owner] + == DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]) { + this->viewportState.field14_0x38 = 0; + } else { + this->viewportState.field16_0x40 = 0; + this->viewportState.field15_0x3c = 0; + } - int hoveredTile = this->viewportState.field24_0x60; - if (DAT_TileMapState::instance.flatViewToggleValue1 != 0) { - hoveredTile = this->viewportState.mouseTile; - } - this->viewportState.field14_0x38 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x40000000; - this->viewportState.field16_0x40 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x4000; - - int moatID = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, DAT_TileMapState::ptr)( - hoveredTile); - if (moatID == 0) { - this->viewportState.field14_0x38 = 0; - this->viewportState.field16_0x40 = 0; - } - this->viewportState.field15_0x3c = this->viewportState.field14_0x38; - if (DAT_GameState::instance.mapAndTime.playerTeams[DAT_TileMapState::instance.moats[moatID].owner] - == DAT_GameState::instance.mapAndTime.playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]) { - this->viewportState.field14_0x38 = 0; + if ((DAT_TileMapState::instance.LogicLayer[hoveredTile] & 8) != 0) { + this->viewportState.somePitchDitchID = MACRO_CALL_MEMBER( + OpenSHC::Map::TileMapState_Func::getPitchDitchIDForTile, DAT_TileMapState::ptr)(hoveredTile); + } } else { - this->viewportState.field16_0x40 = 0; - this->viewportState.field15_0x3c = 0; - } - - if ((DAT_TileMapState::instance.LogicLayer[hoveredTile] & 8) != 0) { - this->viewportState.somePitchDitchID = MACRO_CALL_MEMBER( - OpenSHC::Map::TileMapState_Func::getPitchDitchIDForTile, DAT_TileMapState::ptr)(hoveredTile); + this->viewportState.field24_0x60 = 0; + this->viewportState.mouseX = 0; + this->viewportState.mouseY = 0; + this->viewportState.field27_0x6c = 0; } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 91bfe8204..ebeb01edc 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36887,7 +36887,7 @@ SHC_3BB0A8C1_0x004E5DD0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5E20 | 90.6% | goto-free loop exit, 3 instr -SHC_3BB0A8C1_0x004E5ED0 | 42.3% | reg alloc, cold block inline +SHC_3BB0A8C1_0x004E5ED0 | 43.1% | reg alloc, one extra spill SHC_3BB0A8C1_0x004E6308 | 0.0% | Pending From 8a0b988575c38029cebf71ba40a26374ead593d6 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 21:41:18 +0200 Subject: [PATCH 64/77] reimplement: SHC_3BB0A8C1_0x004E2AD0 47.42% Block order, reg alloc differs --- .../renderGmOverlayBuilding2.cpp | 176 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 88 insertions(+), 90 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp index 35a53fc1d..a0c7d8a81 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp @@ -551,101 +551,99 @@ namespace Rendering { DAT_CurrentlyRenderedSpriteID::instance = (GmID)DAT_BuildingsState::instance.buildings[buildingID].spriteID2; buildingType = DAT_BuildingsState::instance.buildings[buildingID].buildingType; DAT_RenderedUnitOwner::instance = 0; - if (((buildingType == OpenSHC::Map::Buildings::BT_KILLINGPIT) - && (DAT_BuildingsState::instance.buildings[buildingID].owner - != DAT_GameSynchronyState::instance.currentPlayerSlotID)) - && (DAT_BuildingsState::instance.buildings[buildingID].state < 1)) { - DAT_RenderedUnitOwner::instance = 0; - return; - } - if ((buildingType == OpenSHC::Map::Buildings::BT_DRAWBRIDGE) - && (MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::temporarySaveMapSurfaceHeightRangeUnk, - DAT_TextureRenderCoreObject::ptr)(), - DAT_BuildingsState::instance.buildings[buildingID].drawBridgeState1 == 0)) { - MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::setMapSurfaceHeightRange, - DAT_TextureRenderCoreObject::ptr)(screenY - 0x17U & ((int)(screenY - 0x17U) < 0) - 1, 0x81c); - } - frame = 0; - buildingType = DAT_BuildingsState::instance.buildings[buildingID].buildingType; - if (buildingType == OpenSHC::Map::Buildings::BT_TOWER2) { - if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { - frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; - if (frame != 0) { - MACRO_CALL_MEMBER( - OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x24, screenY + -0x78); - } - frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; - renderY = screenY + -0x71; - renderX = screenX + 0x20; - gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; + if (((buildingType != OpenSHC::Map::Buildings::BT_KILLINGPIT) + || (DAT_BuildingsState::instance.buildings[buildingID].owner + == DAT_GameSynchronyState::instance.currentPlayerSlotID)) + || (0 < DAT_BuildingsState::instance.buildings[buildingID].state)) { + if ((buildingType == OpenSHC::Map::Buildings::BT_DRAWBRIDGE) + && (MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::temporarySaveMapSurfaceHeightRangeUnk, + DAT_TextureRenderCoreObject::ptr)(), + DAT_BuildingsState::instance.buildings[buildingID].drawBridgeState1 == 0)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::setMapSurfaceHeightRange, + DAT_TextureRenderCoreObject::ptr)(screenY - 0x17U & ((int)(screenY - 0x17U) < 0) - 1, 0x81c); } - } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER3) { - if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { - frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; - if (frame != 0) { - MACRO_CALL_MEMBER( - OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x24, screenY + -0x77); + frame = 0; + buildingType = DAT_BuildingsState::instance.buildings[buildingID].buildingType; + if (buildingType == OpenSHC::Map::Buildings::BT_TOWER2) { + if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x24, screenY + -0x78); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; + renderY = screenY + -0x71; + renderX = screenX + 0x20; + gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; } - frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; - renderY = screenY + -0x77; - renderX = screenX + 0x2e; - gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; - } - } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER4) { - if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { - frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; - if (frame != 0) { - MACRO_CALL_MEMBER( - OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x34, screenY + -0x82); + } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER3) { + if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x24, screenY + -0x77); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; + renderY = screenY + -0x77; + renderX = screenX + 0x2e; + gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; } - frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; - renderY = screenY + -0x7d; - renderX = screenX + 0x30; - gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; - } - } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER5) { - if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { - frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; - if (frame != 0) { - MACRO_CALL_MEMBER( - OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x33, screenY + -0x82); + } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER4) { + if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x34, screenY + -0x82); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; + renderY = screenY + -0x7d; + renderX = screenX + 0x30; + gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; + } + } else if (buildingType == OpenSHC::Map::Buildings::BT_TOWER5) { + if (DAT_BuildingsState::instance.buildings[buildingID].field62_0xb0 == 0) { + frame = DAT_BuildingsState::instance.buildings[buildingID].field21_0x3c; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, screenX + -0x33, screenY + -0x82); + } + frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; + renderY = screenY + -0x7c; + renderX = screenX + 0x31; + gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; } - frame = DAT_BuildingsState::instance.buildings[buildingID].field23_0x44; - renderY = screenY + -0x7c; - renderX = screenX + 0x31; - gmID = OpenSHC::IO::Graphics::GID_ANIM_CASTLE; - } - } else { - DAT_RenderedUnitOwner::instance = DAT_BuildingsState::instance.buildings[buildingID].playerColorUnk; - short blendStrength = DAT_BuildingsState::instance.buildings[buildingID].field66_0xbe; - DAT_CurrentlyRenderedSpriteID::instance - = (GmID)DAT_BuildingsState::instance.buildings[buildingID].spriteID2; - if (blendStrength != 0) { - MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, - DAT_BuildingsState::instance.buildings[buildingID].animationFrame, - DAT_BuildingsState::instance.buildings[buildingID].spriteOffetX + screenX, - DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY, - (int)((int)(blendStrength))); } else { - frame = DAT_BuildingsState::instance.buildings[buildingID].animationFrame; - renderX = DAT_BuildingsState::instance.buildings[buildingID].spriteOffetX + screenX; - gmID = (GmID)DAT_CurrentlyRenderedSpriteID::instance; - renderY = DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY; + DAT_RenderedUnitOwner::instance = DAT_BuildingsState::instance.buildings[buildingID].playerColorUnk; + short blendStrength = DAT_BuildingsState::instance.buildings[buildingID].field66_0xbe; + DAT_CurrentlyRenderedSpriteID::instance + = (GmID)DAT_BuildingsState::instance.buildings[buildingID].spriteID2; + if (blendStrength != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, + DAT_BuildingsState::instance.buildings[buildingID].animationFrame, + DAT_BuildingsState::instance.buildings[buildingID].spriteOffetX + screenX, + DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY, + (int)((int)(blendStrength))); + } else { + frame = DAT_BuildingsState::instance.buildings[buildingID].animationFrame; + renderX = DAT_BuildingsState::instance.buildings[buildingID].spriteOffetX + screenX; + gmID = (GmID)DAT_CurrentlyRenderedSpriteID::instance; + renderY = DAT_BuildingsState::instance.buildings[buildingID].spriteOffetY + screenY; + } + } + if (frame != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)((eGM)gmID, frame, renderX, renderY); + } + if (DAT_BuildingsState::instance.buildings[buildingID].buildingType == OpenSHC::Map::Buildings::BT_DRAWBRIDGE) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::restoreMapSurfaceHeightRangeFromTemporaryUnk, + DAT_TextureRenderCoreObject::ptr)(); } - } - if (frame != 0) { - MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)((eGM)gmID, frame, renderX, renderY); - } - if (DAT_BuildingsState::instance.buildings[buildingID].buildingType == OpenSHC::Map::Buildings::BT_DRAWBRIDGE) { - MACRO_CALL_MEMBER( - OpenSHC::UI::Rendering::TextureRenderCore_Func::restoreMapSurfaceHeightRangeFromTemporaryUnk, - DAT_TextureRenderCoreObject::ptr)(); } } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index ebeb01edc..585bfcb64 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36415,7 +36415,7 @@ SHC_3BB0A8C1_0x004E2AC0 | 0.0% | Pending SHC_3BB0A8C1_0x004E2AC4 | 0.0% | Pending -SHC_3BB0A8C1_0x004E2AD0 | 45.9% | reg alloc, type-load CSE +SHC_3BB0A8C1_0x004E2AD0 | 47.4% | Block order, reg alloc differs SHC_3BB0A8C1_0x004E3828 | 0.0% | Pending From ec3ba047920ee84eb4c72f3cd66a107f06f801f0 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 22:17:21 +0200 Subject: [PATCH 65/77] reimplement: SHC_3BB0A8C1_0x004E5ED0 43.36% Block order, reg alloc differs --- .../computeMouseTileFromScreenPosition.cpp | 70 +++++++++---------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 36 insertions(+), 36 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp index dd29470ee..797383797 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp @@ -168,47 +168,47 @@ namespace Rendering { this->viewportState.somePitchDitchID = 0; this->viewportState.mouseAtomRefFloorTile = foundTile; - if (this->viewportState.field24_0x60 == 0) { - this->viewportState.mouseY = 0; - this->viewportState.mouseX = 0; - this->viewportState.field27_0x6c = 0; - this->viewportState.field14_0x38 = 0; - this->viewportState.field16_0x40 = 0; - this->viewportState.field15_0x3c = 0; - return; - } + if (this->viewportState.field24_0x60 != 0) { - this->viewportState.mouseY = this->tileTranslationMatrix_YComponent[this->viewportState.field24_0x60]; - this->viewportState.mouseX - = this->viewportState.field24_0x60 - this->translationMatrix[this->viewportState.mouseY].addXgetTile; + this->viewportState.mouseY = this->tileTranslationMatrix_YComponent[this->viewportState.field24_0x60]; + this->viewportState.mouseX + = this->viewportState.field24_0x60 - this->translationMatrix[this->viewportState.mouseY].addXgetTile; - int hoveredTile = this->viewportState.field24_0x60; - if (DAT_TileMapState::instance.flatViewToggleValue1 != 0) { - hoveredTile = this->viewportState.mouseTile; - } - this->viewportState.field14_0x38 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x40000000; - this->viewportState.field16_0x40 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x4000; + int hoveredTile = this->viewportState.field24_0x60; + if (DAT_TileMapState::instance.flatViewToggleValue1 != 0) { + hoveredTile = this->viewportState.mouseTile; + } + this->viewportState.field14_0x38 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x40000000; + this->viewportState.field16_0x40 = DAT_TileMapState::instance.LogicLayer[hoveredTile] & 0x4000; + + int moatID = MACRO_CALL_MEMBER( + OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, DAT_TileMapState::ptr)(hoveredTile); + if (moatID == 0) { + this->viewportState.field14_0x38 = 0; + this->viewportState.field16_0x40 = 0; + } + this->viewportState.field15_0x3c = this->viewportState.field14_0x38; + if (DAT_GameState::instance.mapAndTime.playerTeams[DAT_TileMapState::instance.moats[moatID].owner] + == DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]) { + this->viewportState.field14_0x38 = 0; + } else { + this->viewportState.field16_0x40 = 0; + this->viewportState.field15_0x3c = 0; + } - int moatID = MACRO_CALL_MEMBER( - OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, DAT_TileMapState::ptr)(hoveredTile); - if (moatID == 0) { - this->viewportState.field14_0x38 = 0; - this->viewportState.field16_0x40 = 0; - } - this->viewportState.field15_0x3c = this->viewportState.field14_0x38; - if (DAT_GameState::instance.mapAndTime.playerTeams[DAT_TileMapState::instance.moats[moatID].owner] - == DAT_GameState::instance.mapAndTime - .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]) { + if ((DAT_TileMapState::instance.LogicLayer[hoveredTile] & 8) != 0) { + this->viewportState.somePitchDitchID = MACRO_CALL_MEMBER( + OpenSHC::Map::TileMapState_Func::getPitchDitchIDForTile, DAT_TileMapState::ptr)(hoveredTile); + } + } else { + this->viewportState.mouseY = 0; + this->viewportState.mouseX = 0; + this->viewportState.field27_0x6c = 0; this->viewportState.field14_0x38 = 0; - } else { this->viewportState.field16_0x40 = 0; this->viewportState.field15_0x3c = 0; - } - - if ((DAT_TileMapState::instance.LogicLayer[hoveredTile] & 8) != 0) { - this->viewportState.somePitchDitchID = MACRO_CALL_MEMBER( - OpenSHC::Map::TileMapState_Func::getPitchDitchIDForTile, DAT_TileMapState::ptr)(hoveredTile); - } + } } else { this->viewportState.field24_0x60 = 0; this->viewportState.mouseX = 0; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 585bfcb64..bb84f7fa9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36887,7 +36887,7 @@ SHC_3BB0A8C1_0x004E5DD0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E5E20 | 90.6% | goto-free loop exit, 3 instr -SHC_3BB0A8C1_0x004E5ED0 | 43.1% | reg alloc, one extra spill +SHC_3BB0A8C1_0x004E5ED0 | 43.4% | Block order, reg alloc differs SHC_3BB0A8C1_0x004E6308 | 0.0% | Pending From b2c4f1855e8e04574677654e9bde57eebea62e53 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 22:19:55 +0200 Subject: [PATCH 66/77] reimplement: SHC_3BB0A8C1_0x004E3980 44.97% Style pass, reg alloc differs --- .../renderGmOverlayBuilding.cpp | 425 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 211 insertions(+), 216 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp index 56555806d..989d97c6d 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp @@ -40,7 +40,6 @@ namespace Rendering { { short sVar1; BuildingTypeShort BVar2; - int iVar3; int iVar6; int* piVar7; uint uVar8; @@ -61,7 +60,7 @@ namespace Rendering { local_14 = 0; if (DAT_BuildingsState::instance.buildings[tileIndex].displayOwnerFlag != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].tickRelatedVisuallyActiveIndicator; - if (((sVar1 < 1) || (4 < sVar1)) || (iVar11 = 0x20 - ((int)sVar1 << 5) / 5, iVar11 == 0x20)) { + if (sVar1 < 1 || 4 < sVar1 || (iVar11 = 0x20 - ((int)sVar1 << 5) / 5, iVar11 == 0x20)) { iVar11 = 0; } BVar2 = DAT_BuildingsState::instance.buildings[tileIndex].buildingType; @@ -99,8 +98,7 @@ namespace Rendering { DAT_TextureRenderCoreObject::ptr)(xUnk + -0x23, yUnk + -0x39, (int)(( int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].width)), - (int)((int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] - .height)), + (int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].height), (byte*)((int)((DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); } @@ -111,8 +109,7 @@ namespace Rendering { DAT_TextureRenderCoreObject::ptr)(xUnk + -0x38, yUnk + -0x46, (int)(( int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].width)), - (int)((int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] - .height)), + (int)(DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].height), (byte*)((int)((DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); } @@ -145,7 +142,7 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_IRON_MINER, iVar11, local_18 + xUnk, local_14 + yUnk, - (int)((int)((uint)DAT_BuildingsState::instance.buildings[tileIndex].field208_0x292))); + (int)(DAT_BuildingsState::instance.buildings[tileIndex].field208_0x292)); } } iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; @@ -286,6 +283,7 @@ namespace Rendering { } break; case OpenSHC::Map::Buildings::BT_ARMORY: + { piVar7 = &DAT_BuildingsState::instance.buildings[tileIndex].tileRef2; do { if (piVar7[-1] == param_4) @@ -358,7 +356,7 @@ namespace Rendering { local_8 = -10; iVar10 = DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x68].originY; } - iVar3 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + int iVar3 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = GVar12; if ((iVar3 != 0) && (iVar6 == iVar9)) { @@ -448,6 +446,7 @@ namespace Rendering { } } break; + } case OpenSHC::Map::Buildings::BT_FLETCHER: iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; @@ -589,17 +588,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; @@ -607,17 +606,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; @@ -625,17 +624,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field34_0x70; @@ -643,17 +642,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field34_0x70, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; @@ -661,17 +660,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; @@ -679,17 +678,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field32_0x68; @@ -697,17 +696,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field32_0x68, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c; @@ -715,17 +714,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; @@ -733,17 +732,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay; @@ -751,17 +750,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field35_0x74; @@ -769,17 +768,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field35_0x74, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; @@ -787,17 +786,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field33_0x6c; @@ -805,17 +804,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field33_0x6c, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field36_0x78; @@ -823,17 +822,17 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].field36_0x78, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].ownerFlagFrame; @@ -841,34 +840,34 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, DAT_BuildingsState::instance.buildings[tileIndex].ownerFlagFrame, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field40_0x88; if ((iVar9 != 0) && (iVar6 == 0xf)) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_GOODS, iVar9, - (int)((int)((xUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .width - / 2) - + 0xf)), - (int)((int)((yUnk - - DAT_GMImageHeaders::instance - .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] - .height) - + -5)), + (int)((xUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .width + / 2) + + 0xf), + (int)((yUnk + - DAT_GMImageHeaders::instance + .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] + .height) + + -5), iVar11); } break; @@ -1068,7 +1067,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, iVar11, - xUnk + -0x23, yUnk + -0x51, (int)((int)(sVar1))); + xUnk + -0x23, yUnk + -0x51, (int)(sVar1)); } } iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; @@ -1081,7 +1080,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, iVar11, - xUnk + -0x23, yUnk + -0x51, (int)((int)(sVar1))); + xUnk + -0x23, yUnk + -0x51, (int)(sVar1)); } } iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; @@ -1161,7 +1160,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, - xUnk + -0x50, yUnk + -0x6b, (int)((int)(sVar1))); + xUnk + -0x50, yUnk + -0x6b, (int)(sVar1)); } } else { if (sVar1 == 0) { @@ -1173,7 +1172,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, - xUnk + -0x50, yUnk + -0x6b, (int)((int)(sVar1))); + xUnk + -0x50, yUnk + -0x6b, (int)(sVar1)); } } } @@ -1190,7 +1189,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, - xUnk + -0x3a, yUnk + -0x60, (int)((int)(sVar1))); + xUnk + -0x3a, yUnk + -0x60, (int)(sVar1)); } } else { if (sVar1 == 0) { @@ -1202,7 +1201,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, - xUnk + -0x3a, yUnk + -0x60, (int)((int)(sVar1))); + xUnk + -0x3a, yUnk + -0x60, (int)(sVar1)); } } } @@ -1219,7 +1218,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, - xUnk + -0x24, yUnk + -0x55, (int)((int)(sVar1))); + xUnk + -0x24, yUnk + -0x55, (int)(sVar1)); } } else { if (sVar1 == 0) { @@ -1231,7 +1230,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, - xUnk + -0x24, yUnk + -0x55, (int)((int)(sVar1))); + xUnk + -0x24, yUnk + -0x55, (int)(sVar1)); } } } @@ -1246,7 +1245,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, - xUnk + -0xe, yUnk + -0x4a, (int)((int)(sVar1))); + xUnk + -0xe, yUnk + -0x4a, (int)(sVar1)); } sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; if (sVar1 == 0) { @@ -1259,8 +1258,8 @@ namespace Rendering { break; } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, 0x26, - xUnk + -0xd, yUnk + -0x49, (int)((int)(sVar1))); + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_ANIM_STABLES, 0x26, xUnk + -0xd, yUnk + -0x49, (int)(sVar1)); } else { if (sVar1 == 0) { iVar6 = yUnk + -0x3f; @@ -1272,7 +1271,7 @@ namespace Rendering { } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, - xUnk + -0xe, yUnk + -0x4a, (int)((int)(sVar1))); + xUnk + -0xe, yUnk + -0x4a, (int)(sVar1)); } } break; @@ -1642,28 +1641,24 @@ namespace Rendering { barXOffset = uVar8 << 5; barYOffset = uVar8 << 4; } - if (((((DAT_GameCore::instance.currentMenuViewType == OpenSHC::UI::Enums::MVT_BUILDING_AND_STATUS_MENU) - && (tileIndex == DAT_BuildingsState::instance.menuSelectedBuildingID)) - || ((tileIndex == DAT_BuildingsState::instance.field28_0x18e05c - && (DAT_BuildingsState::instance.field29_0x18e060 - == DAT_BuildingsState::instance.buildings[tileIndex].uid)))) - && (((((sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].maxHealth, - sVar1 != 0 - && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType - != OpenSHC::Map::Buildings::BT_MANORHOUSE)) - && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType - != OpenSHC::Map::Buildings::BT_STONEKEEP)) - && ((DAT_BuildingsState::instance.buildings[tileIndex].buildingType - != OpenSHC::Map::Buildings::BT_STRONGHOLD - && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType - != OpenSHC::Map::Buildings::BT_KEEPFOUR)))) + if ((((DAT_GameCore::instance.currentMenuViewType == OpenSHC::UI::Enums::MVT_BUILDING_AND_STATUS_MENU) + && (tileIndex == DAT_BuildingsState::instance.menuSelectedBuildingID)) + || ((tileIndex == DAT_BuildingsState::instance.field28_0x18e05c + && (DAT_BuildingsState::instance.field29_0x18e060 + == DAT_BuildingsState::instance.buildings[tileIndex].uid)))) + && (sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].maxHealth, + sVar1 != 0 && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType - != OpenSHC::Map::Buildings::BT_KEEPFIVE)))) - && (DAT_BuildingsState::instance.buildings[tileIndex].buildingType - != OpenSHC::Map::Buildings::BT_CAMPGROUND)) { + != OpenSHC::Map::Buildings::BT_MANORHOUSE)) + && DAT_BuildingsState::instance.buildings[tileIndex].buildingType != OpenSHC::Map::Buildings::BT_STONEKEEP + && DAT_BuildingsState::instance.buildings[tileIndex].buildingType != OpenSHC::Map::Buildings::BT_STRONGHOLD + && DAT_BuildingsState::instance.buildings[tileIndex].buildingType != OpenSHC::Map::Buildings::BT_KEEPFOUR + && DAT_BuildingsState::instance.buildings[tileIndex].buildingType != OpenSHC::Map::Buildings::BT_KEEPFIVE + && DAT_BuildingsState::instance.buildings[tileIndex].buildingType + != OpenSHC::Map::Buildings::BT_CAMPGROUND) { iVar6 = MACRO_CALL_MEMBER(OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::computeHealthPercentage, DAT_DirectionAlgorithmState::ptr)( - (int)DAT_BuildingsState::instance.buildings[tileIndex].currentHealth, (int)((int)(sVar1))); + (int)DAT_BuildingsState::instance.buildings[tileIndex].currentHealth, (int)(sVar1)); switch (DAT_BuildingsState::instance.buildings[tileIndex].buildingType) { case OpenSHC::Map::Buildings::BT_GATEHOUSELARGE: barYOffset = barYOffset + 0x14; diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index bb84f7fa9..e601bc6a0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36503,7 +36503,7 @@ SHC_3BB0A8C1_0x004E3869 | 0.0% | Pending SHC_3BB0A8C1_0x004E3870 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E3980 | 45.0% | reg alloc, const-in-reg +SHC_3BB0A8C1_0x004E3980 | 45.0% | Style pass, reg alloc differs SHC_3BB0A8C1_0x004E46C0 | 0.0% | Pending From 2d1bcb1740a8228dc664ec0922087d56b3069925 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 22:38:35 +0200 Subject: [PATCH 67/77] reimplement: SHC_3BB0A8C1_0x004E8CF0 31.88% Style pass, reg alloc differs --- .../ViewportRenderState/renderMap.cpp | 518 +++++++++--------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 249 insertions(+), 271 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp index e4357d013..d289f309b 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp @@ -303,12 +303,12 @@ namespace Rendering { psVar17 = psVar17 + 0x196; } while (iVar31 < DAT_BuildingsState::instance.maxBuildingsCount); } - while ((local_1c < iVar28 - && ((MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderUnits, this)(), + while (local_1c < iVar28 + && (MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderUnits, this)(), local_1c < viewportWidth || ((DAT_TileMapState::instance.LogicLayer[this->screenPointToTileNumber[_zoomOffset + iVar2]] & 0x30) - == 0))))) { + == 0))) { _vpWidthPlus1 = _viewportHeight + 1; DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated; iVar31 = _zoomOffset; @@ -375,13 +375,13 @@ namespace Rendering { if ((DAT_00ed3148::instance & 0xa0108001) == 0) { LAB_004e97e2: uVar32 = (uint)DAT_TileMapState::instance.HeightLayer[iVar16]; - if (((DAT_00ed3148::instance & 0x200) != 0) - && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x3c0) != 0)) { + if ((DAT_00ed3148::instance & 0x200) != 0 + && (DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x3c0) != 0) { uVar32 = uVar32 - 8; } DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance.heightBasedScreenYOffset[uVar32]; - if (((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) == 0) - || (DAT_TileMapState::instance.field93_0x5548c8 != 0)) { + if ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) == 0 + || DAT_TileMapState::instance.field93_0x5548c8 != 0) { DAT_00ed3154::instance = 0; } else { DAT_00ed3154::instance = 0x5a; @@ -614,7 +614,7 @@ namespace Rendering { DAT_00ed314c::instance = uVar32 & 0xf; DAT_00ed3170::instance = 0; DAT_00ed3154::instance = 0; - if ((local_54 == 0) || ((DAT_00ed3148::instance & 0x40000000) != 0)) { + if (local_54 == 0 || (DAT_00ed3148::instance & 0x40000000) != 0) { if ((DAT_00ed3148::instance & 0x100) == 0) { if ((DAT_00ed3148::instance & 0x80) != 0) { _yOffset_01 = (int)DAT_TileMapState::instance.OrganismLayer[iVar16]; @@ -696,23 +696,22 @@ namespace Rendering { bVar12 = 0; bVar14 = 0; if (DAT_RenderMap_ImageID::instance == 0) { - if ((((DAT_00ed3148::instance & 0x4000) != 0) - && (DAT_TileMapState::instance.field159_0x5549b8 != 0)) - && ((DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY + if ((DAT_00ed3148::instance & 0x4000) != 0 && DAT_TileMapState::instance.field159_0x5549b8 != 0 + && (DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY || (_yOffset_01 = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, DAT_TileMapState::ptr)(iVar16), DAT_GameState::instance.mapAndTime .playerTeams[DAT_TileMapState::instance.moats[_yOffset_01].owner] == DAT_GameState::instance.mapAndTime - .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])))) { + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]))) { DAT_RenderMap_ImageID::instance = 0x39; goto LAB_004e9b3c; } - } else if ((DAT_TileMapState::instance.buildingPlacementFail == FALSE) - || ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x8000) != 0)) { + } else if (DAT_TileMapState::instance.buildingPlacementFail == FALSE + || (DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x8000) != 0) { DAT_GmImageAddressToBeRendered::instance = DAT_RenderMap_ImageID::instance; - if (((DAT_00ed3148::instance & 0x100) != 0) && (_flatView == 0)) { + if ((DAT_00ed3148::instance & 0x100) != 0 && _flatView == 0) { DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance .heightBasedScreenYOffset[DAT_TileMapState::instance.DefaultHeightLayer[iVar16]]; @@ -723,16 +722,15 @@ namespace Rendering { bVar14 = 1; } local_60 = (int)(short)DAT_TileMapState::instance.UnitLayer[iVar16]; - if (((local_60 != 0) && (local_60 == DAT_UnitsState::instance.lastSelectedUnitID)) - && (DAT_MenuModalComposition1::instance.activeModalDialogID - == OpenSHC::UI::Enums::MMT_DEBUG_DATA_UNIT_DATA)) { + if (local_60 != 0 && local_60 == DAT_UnitsState::instance.lastSelectedUnitID + && DAT_MenuModalComposition1::instance.activeModalDialogID + == OpenSHC::UI::Enums::MMT_DEBUG_DATA_UNIT_DATA) { DAT_GmImageAddressToBeRendered::instance = ((byte)DAT_UnitsState::instance.units[local_60].moveDelay & 0x3f) + GMTotalPicturesProcessed::instance[0x26]; } - if ((((DAT_00ed3148::instance & 8) != 0) - && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x2000) == 0)) - && (_flatView == 0)) { + if ((DAT_00ed3148::instance & 8) != 0 + && (DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x2000) == 0 && _flatView == 0) { DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar16] + 4]; @@ -741,20 +739,17 @@ namespace Rendering { uVar9 = *this->viewportState.ptrColor; *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; } - if (((DAT_00ed3170::instance != 0xff) && (bVar13 != 0)) + if (DAT_00ed3170::instance != 0xff && bVar13 != 0 && (MACRO_CALL(OpenSHC::UI::Rendering_Func::RenderTerrainTilesCenterPiece)(), bVar12 != 0)) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS, - (int)((int)(DAT_RenderMap_ImageID::instance)), - (int)((int)(DAT_RenderMap_DrawSomeX::instance)), - (int)((int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) - + DAT_RenderMap_DrawSomeY::instance)), + (int)(DAT_RenderMap_ImageID::instance), (int)(DAT_RenderMap_DrawSomeX::instance), + (int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + + DAT_RenderMap_DrawSomeY::instance), 0x18); } - if ((((DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].direction != 0) - && (local_54 == 0)) - && (bVar13 != 0)) - && (bVar12 == 0)) { + if (DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance].direction != 0 + && local_54 == 0 && bVar13 != 0 && bVar12 == 0) { _yOffset_01 = (int)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] .tileOffset; /* @@ -767,10 +762,10 @@ namespace Rendering { (char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] .horizontalOffsetImage + DAT_RenderMap_DrawSomeX::instance, - (int)((int)(((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) - _yOffset_01) - + DAT_RenderMap_DrawSomeY::instance)), - (int)((int)((char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] - .buildingWidth)), + (int)(((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) - _yOffset_01) + + DAT_RenderMap_DrawSomeY::instance), + (int)((char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .buildingWidth), _yOffset_01 + 7, (ushort*)((int)( @@ -795,14 +790,13 @@ namespace Rendering { this->viewportState.mouseRayBuildingID = local_54; } } - if (((DAT_00ed3148::instance & 0x201) == 0) && (local_54 == 0)) { + if ((DAT_00ed3148::instance & 0x201) == 0 && local_54 == 0) { uVar10 = DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; - if (((uVar10 & 0x3c0) != 0) - && ((((DAT_RenderMap_ImageID::instance == 0 - || (((DAT_00ed3148::instance & 0x4000) != 0 - && (DAT_TileMapState::instance.field159_0x5549b8 != 0)))) - && ((DAT_00ed3148::instance & 0x30) == 0)) - && (_flatView == 0)))) { + if ((uVar10 & 0x3c0) != 0 + && (DAT_RenderMap_ImageID::instance == 0 + || (((DAT_00ed3148::instance & 0x4000) != 0 + && (DAT_TileMapState::instance.field159_0x5549b8 != 0)))) + && (DAT_00ed3148::instance & 0x30) == 0 && _flatView == 0) { uVar32 = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16]; DAT_GmImageAddressToBeRendered::instance = (uint)DAT_TileMapState::instance.AlphaGFXLayer[iVar16]; @@ -821,12 +815,12 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderFunctionResponsibleForManyGameObjects, DAT_TextureRenderCoreObject::ptr)(DAT_RenderMap_DrawSomeX::instance, - (int)((int)(((iVar26 - uVar32) - _yOffset_01) + DAT_00ed3154::instance + 0x62 - + DAT_RenderMap_DrawSomeY::instance)), - (int)((int)(DAT_GMImageHeaders::instance + (int)(((iVar26 - uVar32) - _yOffset_01) + DAT_00ed3154::instance + 0x62 + + DAT_RenderMap_DrawSomeY::instance), + (int)(DAT_GMImageHeaders::instance .imh[DAT_GmImageAddressToBeRendered::instance + GMTotalPicturesProcessed::instance[0x36] + -1] - .width)), + .width), _yOffset_01 - iVar26, (ushort*)((int)( @@ -848,8 +842,8 @@ namespace Rendering { } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, - (int)((int)(DAT_GmImageAddressToBeRendered::instance)), _yOffset_01, - (int)((int)(iVar26 + DAT_RenderMap_DrawSomeY::instance))); + (int)(DAT_GmImageAddressToBeRendered::instance), _yOffset_01, + (int)(iVar26 + DAT_RenderMap_DrawSomeY::instance)); } } LAB_004e9e36: @@ -892,21 +886,21 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)((eGM)this->floatersArray[uVar32].gmID, this->floatersArray[uVar32].imageID, - (int)((int)(this->floatersArray[uVar32].originX - + DAT_RenderMap_DrawSomeX::instance)), - (int)((int)((this->floatersArray[uVar32].originY - _yOffset_01) - + DAT_RenderMap_DrawSomeY::instance))); + (int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance), + (int)((this->floatersArray[uVar32].originY - _yOffset_01) + + DAT_RenderMap_DrawSomeY::instance)); } else { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( (GmID)this->floatersArray[uVar32].gmID, this->floatersArray[uVar32].imageID, - (int)((int)(this->floatersArray[uVar32].originX - + DAT_RenderMap_DrawSomeX::instance)), - (int)((int)((this->floatersArray[uVar32].originY - _yOffset_01) - + DAT_RenderMap_DrawSomeY::instance)), - (int)((int)(uVar29 >> 0x10))); + (int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance), + (int)((this->floatersArray[uVar32].originY - _yOffset_01) + + DAT_RenderMap_DrawSomeY::instance), + (int)(uVar29 >> 0x10)); } } else { iVar26 = this->floatersArray[uVar32].imageID; @@ -914,10 +908,10 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)((GmID)GVar11, iVar26, - (int)((int)(this->floatersArray[uVar32].originX - + DAT_RenderMap_DrawSomeX::instance)), - (int)((int)((this->floatersArray[uVar32].originY - _yOffset_01) - + DAT_RenderMap_DrawSomeY::instance)), + (int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance), + (int)((this->floatersArray[uVar32].originY - _yOffset_01) + + DAT_RenderMap_DrawSomeY::instance), GVar11, ((int)uVar29 >> 0x10) + iVar26, 0); } } else { @@ -939,12 +933,12 @@ namespace Rendering { if (local_58 != 0) { while ((iVar26 = DAT_RenderMap_YOffset::instance, _yOffset_01 = _yOffset_01 + 1, _yOffset_01 < 10 && (DAT_EntityState::instance.entityArray[local_58].logicalState != 0))) { - if (((DAT_EntityState::instance.entityArray[local_58].graphicType2 != 0) - && (((EVar3 = DAT_EntityState::instance.entityArray[local_58].entityType, - EVar3 == OpenSHC::Map::Entities::EntityTypeInt__ET_CROW - || (EVar3 == OpenSHC::Map::Entities::ET_SEAGULLUnk)) - || (EVar3 == OpenSHC::Map::Entities::ET_COW_FLYING)))) - && (DAT_EntityState::instance.entityArray[local_58].imageID != 0)) { + if (DAT_EntityState::instance.entityArray[local_58].graphicType2 != 0 + && ((EVar3 = DAT_EntityState::instance.entityArray[local_58].entityType, + EVar3 == OpenSHC::Map::Entities::EntityTypeInt__ET_CROW + || (EVar3 == OpenSHC::Map::Entities::ET_SEAGULLUnk)) + || (EVar3 == OpenSHC::Map::Entities::ET_COW_FLYING)) + && DAT_EntityState::instance.entityArray[local_58].imageID != 0) { DAT_RenderedUnitOwner::instance = DAT_EntityState::instance.entityArray[local_58].colorUnk; DAT_CurrentlyRenderedSpriteID::instance @@ -975,25 +969,24 @@ namespace Rendering { - (int)DAT_EntityState::instance.entityArray[local_58].originY) - iVar26) + DAT_RenderMap_DrawSomeY::instance, - (undefined4)((int)((int)DAT_EntityState::instance.entityArray[local_58].imageID)), - 0x14, 0, 0); + (undefined4)((int)(DAT_EntityState::instance.entityArray[local_58].imageID)), 0x14, + 0, 0); } iVar26 = (int)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; - if (((local_58 == iVar26) || (DAT_GameSynchronyState::instance.syncStatus != 0)) + if (local_58 == iVar26 || DAT_GameSynchronyState::instance.syncStatus != 0 || (local_58 = iVar26, iVar26 == 0)) break; } } local_58 = (uint)DAT_TileMapState::instance.EntityLayer[iVar16]; - if (((local_54 != 0) - && (DAT_BuildingsState::instance.buildings[local_54].buildingType - == OpenSHC::Map::Buildings::BT_DRAWBRIDGE)) - && ((_flatView == 0 - && ((DAT_TileMapState::instance.refreshRelatedOne != 0 - && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0xc) == 4)))))) { + if (local_54 != 0 + && DAT_BuildingsState::instance.buildings[local_54].buildingType + == OpenSHC::Map::Buildings::BT_DRAWBRIDGE + && _flatView == 0 && DAT_TileMapState::instance.refreshRelatedOne != 0 + && (DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0xc) == 4) { MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding2, this)( - local_54, (int)((int)(DAT_RenderMap_DrawSomeX::instance)), - (int)((int)(DAT_00ed3154::instance + DAT_RenderMap_DrawSomeY::instance)), iVar16); + local_54, (int)(DAT_RenderMap_DrawSomeX::instance), + (int)(DAT_00ed3154::instance + DAT_RenderMap_DrawSomeY::instance), iVar16); } /* ------ BEGIN RENDER UNITS ------ @@ -1017,14 +1010,14 @@ namespace Rendering { != DAT_GameState::instance.mapAndTime .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) { iVar26 = DAT_UnitsState::instance.units[local_60].assassinsMicroDistanceToEnemyUnk; - if ((iVar26 <= 160) - || ((UVar4 = DAT_UnitsState::instance.units[local_60].state.generic, + if (iVar26 <= 160 + || (UVar4 = DAT_UnitsState::instance.units[local_60].state.generic, UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK - || (UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK_WALL)))) { - if ((120 < iVar26) - && ((DAT_GameSynchronyState::instance.currentGameMode + || (UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK_WALL))) { + if (120 < iVar26 + && (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY - || (DAT_UnitsState::instance.units[local_60].idleCounterUnk < 0x961)))) { + || (DAT_UnitsState::instance.units[local_60].idleCounterUnk < 0x961))) { local_2c = 0x10; } goto LAB_004ea2c6; @@ -1088,8 +1081,8 @@ namespace Rendering { } else if (_yOffset_01 == 2) { _yOffset_01 = 0; } else { - if (((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x10) == 0) - || (DAT_UnitsState::instance.units[local_60].field43_0x64 == -1)) { + if ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x10) == 0 + || DAT_UnitsState::instance.units[local_60].field43_0x64 == -1) { if ((DAT_00ed3148::instance & 0x400) == 0) { if ((DAT_UnitsState::instance.units[local_60].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) @@ -1108,9 +1101,9 @@ namespace Rendering { (int)(( int)(DAT_UnitsState::instance.units[local_60].field59_0x86 + sVar20)), - (int)((int)(sVar5)), - (int)((int)(DAT_UnitsState::instance.units[local_60].drawHeight1 - - local_c)), + (int)(sVar5), + (int)(DAT_UnitsState::instance.units[local_60].drawHeight1 + - local_c), (byte*)((int)(( DAT_GMImageOffsets::instance[_yOffset_01 + -1 + iVar18] + (int)DAT_TextureRenderCoreObject::instance @@ -1129,10 +1122,9 @@ namespace Rendering { renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)( (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)((int)(sVar20 - + DAT_UnitsState::instance.units[local_60].drawY)), - (int)((int)(DAT_UnitsState::instance.units[local_60] - .drawWidth)), + (int)(sVar20 + + DAT_UnitsState::instance.units[local_60].drawY), + (int)(DAT_UnitsState::instance.units[local_60].drawWidth), DAT_UnitsState::instance.units[local_60].drawHeight1 - _yOffset_01, (byte*)((int)(( @@ -1165,8 +1157,7 @@ namespace Rendering { renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)((int)(sVar30 - + DAT_UnitsState::instance.units[local_60].drawY)), + (int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY), (int)(( int)(DAT_UnitsState::instance.units[local_60].drawWidth)), DAT_UnitsState::instance.units[local_60].drawHeight1 @@ -1196,10 +1187,10 @@ namespace Rendering { renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)((int)(sVar30 - + DAT_UnitsState::instance.units[local_60].drawY)), - (int)((int)(DAT_UnitsState::instance.units[local_60] - .drawWidth)), + (int)(sVar30 + + DAT_UnitsState::instance.units[local_60].drawY), + (int)(DAT_UnitsState::instance.units[local_60] + .drawWidth), DAT_UnitsState::instance.units[local_60].drawHeight1 - iVar26, (byte*)(( @@ -1227,10 +1218,10 @@ namespace Rendering { renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)((int)(sVar30 - + DAT_UnitsState::instance.units[local_60].drawY)), - (int)((int)(DAT_UnitsState::instance.units[local_60] - .drawWidth)), + (int)(sVar30 + + DAT_UnitsState::instance.units[local_60].drawY), + (int)(DAT_UnitsState::instance.units[local_60] + .drawWidth), DAT_UnitsState::instance.units[local_60].drawHeight1 - iVar26, (byte*)(( @@ -1340,7 +1331,7 @@ namespace Rendering { TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, - (int)((int)(uVar32 / 2 + 1)), _yOffset_01, iVar26); + (int)(uVar32 / 2 + 1), _yOffset_01, iVar26); } } LAB_004eadfa: @@ -1356,7 +1347,7 @@ namespace Rendering { renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)( (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)((int)(DAT_UnitsState::instance.units[local_60].drawY)), + (int)(DAT_UnitsState::instance.units[local_60].drawY), (int)(( int)(DAT_UnitsState::instance.units[local_60].drawWidth)), (int)(( @@ -1364,7 +1355,7 @@ namespace Rendering { (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance .gmProcessedImageData))), - (int)((int)((char)bVar15))); + (int)((char)bVar15)); if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { *this->viewportState.ptrColor = uVar9; @@ -1373,12 +1364,11 @@ namespace Rendering { this->viewportState.mouseRayBuildingID = 0; } } - if (((DAT_UnitsState::instance.units[local_60].isSelected != 0) - && (DAT_UnitsState::instance.units[local_60].usingTeleport - == 0)) - && (DAT_UnitsState::instance.units[local_60] + if (DAT_UnitsState::instance.units[local_60].isSelected != 0 + && DAT_UnitsState::instance.units[local_60].usingTeleport == 0 + && DAT_UnitsState::instance.units[local_60] .disappearFadeAlphaCountdown - == 0)) { + == 0) { _yOffset_01 = (DAT_UnitsState::instance.units[local_60].drawWidth + -0x16) / 2; @@ -1440,14 +1430,13 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( OpenSHC::DE::SHCDE::GM_FLOATS, iVar18, iVar27, iVar26); - if (((DAT_UnitsState::instance.units[local_60].unitType - == OpenSHC::Map::Units::UT_A_ASSASSIN) - && (DAT_GameState::instance.mapAndTime.playerTeams - [DAT_UnitsState::instance.units[local_60].owner] - == DAT_GameState::instance.mapAndTime - .playerTeams[DAT_GameSynchronyState::instance - .currentPlayerSlotID])) - && ((DAT_UnitsState::instance.units[local_60] + if (DAT_UnitsState::instance.units[local_60].unitType + == OpenSHC::Map::Units::UT_A_ASSASSIN + && DAT_GameState::instance.mapAndTime.playerTeams + [DAT_UnitsState::instance.units[local_60].owner] + == DAT_GameState::instance.mapAndTime.playerTeams + [DAT_GameSynchronyState::instance.currentPlayerSlotID] + && (DAT_UnitsState::instance.units[local_60] .assassinsMicroDistanceToEnemyUnk < 0xa1 || ((UVar4 = DAT_UnitsState::instance.units[local_60] @@ -1455,7 +1444,7 @@ namespace Rendering { UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK || (UVar4 == OpenSHC::Map::Units::States:: - US_MELEE_ATTACK_WALL)))))) { + US_MELEE_ATTACK_WALL))))) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderGMWithBlending, @@ -1463,10 +1452,10 @@ namespace Rendering { OpenSHC::IO::Graphics::GID_INTERFACE_ICONS_2, 0x1bf, DAT_UnitsState::instance.units[local_60].drawX + 2 + _yOffset_01, - (int)((int)(DAT_UnitsState::instance.units[local_60] - .someDrawYOffset + (int)(DAT_UnitsState::instance.units[local_60] + .someDrawYOffset + -0x1b - + DAT_UnitsState::instance.units[local_60].drawY)), + + DAT_UnitsState::instance.units[local_60].drawY), 0x10); } } @@ -1476,14 +1465,11 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::IO::Graphics::GID_FLOATS_NEW, - (int)((int)(sVar30 + 0xd4)), - (int)((int)(DAT_UnitsState::instance.units[local_60].drawX)), - (int)((int)(DAT_UnitsState::instance.units[local_60] - .someDrawYOffset - + -0x36 + DAT_UnitsState::instance.units[local_60].drawY)), - OpenSHC::IO::Graphics::GID_FLOATS_NEW, - (int)((int)(sVar30 + 0xdc)), 0); + OpenSHC::IO::Graphics::GID_FLOATS_NEW, (int)(sVar30 + 0xd4), + (int)(DAT_UnitsState::instance.units[local_60].drawX), + (int)(DAT_UnitsState::instance.units[local_60].someDrawYOffset + + -0x36 + DAT_UnitsState::instance.units[local_60].drawY), + OpenSHC::IO::Graphics::GID_FLOATS_NEW, (int)(sVar30 + 0xdc), 0); DAT_UnitsState::instance.units[local_60].field46_0x6e = 0; } sVar30 = DAT_UnitsState::instance.units[local_60].field45_0x6c; @@ -1579,11 +1565,11 @@ namespace Rendering { DAT_UnitsState::instance.units[local_60].field45_0x6c = 0; goto LAB_004eb1be; } - if ((DAT_BuildingsState::instance.buildings[local_54].buildingType - != OpenSHC::Map::Buildings::BT_TOWER2) - || ((sVar24 = DAT_UnitsState::instance.units[local_60] - .facingDirectionMapOrientationCorrected, - sVar24 != 2 && (sVar24 != 6)))) + if (DAT_BuildingsState::instance.buildings[local_54].buildingType + != OpenSHC::Map::Buildings::BT_TOWER2 + || (sVar24 = DAT_UnitsState::instance.units[local_60] + .facingDirectionMapOrientationCorrected, + sVar24 != 2 && (sVar24 != 6))) goto LAB_004ea49b; if ((DAT_UnitsState::instance.units[local_60].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) @@ -1599,9 +1585,9 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)((int)sVar30, - (int)((int)(DAT_UnitsState::instance.units[local_60].field59_0x86 - + sVar20)), - (int)((int)(sVar5)), + (int)(DAT_UnitsState::instance.units[local_60].field59_0x86 + + sVar20), + (int)(sVar5), DAT_UnitsState::instance.units[local_60].drawHeight1 - local_14, (byte*)(( int)((DAT_GMImageOffsets::instance[_yOffset_01 + -1 + iVar18] @@ -1620,8 +1606,7 @@ namespace Rendering { renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)( (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)((int)(sVar20 - + DAT_UnitsState::instance.units[local_60].drawY)), + (int)(sVar20 + DAT_UnitsState::instance.units[local_60].drawY), (int)(( int)(DAT_UnitsState::instance.units[local_60].drawWidth)), DAT_UnitsState::instance.units[local_60].drawHeight1 @@ -1651,7 +1636,7 @@ namespace Rendering { (int)DAT_UnitsState::instance.units[local_60].drawX, (int)(( int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY)), - (int)((int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + (int)(DAT_UnitsState::instance.units[local_60].drawWidth), DAT_UnitsState::instance.units[local_60].drawHeight1 - _yOffset_01, (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance @@ -1668,7 +1653,7 @@ namespace Rendering { (int)DAT_UnitsState::instance.units[local_60].drawX, (int)(( int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY)), - (int)((int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + (int)(DAT_UnitsState::instance.units[local_60].drawWidth), DAT_UnitsState::instance.units[local_60].drawHeight1 - _yOffset_01, (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance @@ -1694,8 +1679,7 @@ namespace Rendering { renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)((int)(sVar30 - + DAT_UnitsState::instance.units[local_60].drawY)), + (int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY), (int)(( int)(DAT_UnitsState::instance.units[local_60].drawWidth)), DAT_UnitsState::instance.units[local_60].drawHeight1 - iVar26, @@ -1721,8 +1705,7 @@ namespace Rendering { renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)((int)(sVar30 - + DAT_UnitsState::instance.units[local_60].drawY)), + (int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY), (int)(( int)(DAT_UnitsState::instance.units[local_60].drawWidth)), DAT_UnitsState::instance.units[local_60].drawHeight1 - iVar26, @@ -1824,8 +1807,8 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, - (int)((int)(uVar32 / 2 + 1)), _yOffset_01, iVar26); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, (int)(uVar32 / 2 + 1), + _yOffset_01, iVar26); } } LAB_004ea966: @@ -1841,9 +1824,9 @@ namespace Rendering { } MACRO_CALL_MEMBER( OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, - this)(local_60, (undefined4)((int)((int)sVar30)), - (undefined4)((int)((int)sVar20)), (undefined4)((int)((int)sVar5)), - (undefined4)((int)((int)DAT_UnitsState::instance.units[local_60].drawHeight1)), + this)(local_60, (undefined4)((int)(sVar30)), (undefined4)((int)(sVar20)), + (undefined4)((int)(sVar5)), + (undefined4)((int)(DAT_UnitsState::instance.units[local_60].drawHeight1)), (undefined4)((int)(DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)), _yOffset_01); @@ -1851,17 +1834,15 @@ namespace Rendering { if (local_2c == 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationUnk, - DAT_TextureRenderCoreObject::ptr)((int)sVar30, (int)((int)(sVar20)), - (int)((int)(sVar5)), - (int)((int)(DAT_UnitsState::instance.units[local_60].drawHeight1)), + DAT_TextureRenderCoreObject::ptr)((int)sVar30, (int)(sVar20), (int)(sVar5), + (int)(DAT_UnitsState::instance.units[local_60].drawHeight1), (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationWithBlendingUnk, - DAT_TextureRenderCoreObject::ptr)((int)sVar30, (int)((int)(sVar20)), - (int)((int)(sVar5)), - (int)((int)(DAT_UnitsState::instance.units[local_60].drawHeight1)), + DAT_TextureRenderCoreObject::ptr)((int)sVar30, (int)(sVar20), (int)(sVar5), + (int)(DAT_UnitsState::instance.units[local_60].drawHeight1), (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData))), local_2c); @@ -1936,8 +1917,8 @@ namespace Rendering { case OpenSHC::IO::Graphics::GID_BODY_FIRE_2: goto switchD_004eb2c9_caseD_76; case OpenSHC::IO::Graphics::GID_BODY_MISSILE_COW: - if ((DAT_EntityState::instance.entityArray[local_58].someCounter_OR_hitGround != 0) - && ((DAT_TileMapState::instance.refreshRelatedOne == 0 || (_flatView != 0)))) { + if (DAT_EntityState::instance.entityArray[local_58].someCounter_OR_hitGround != 0 + && (DAT_TileMapState::instance.refreshRelatedOne == 0 || (_flatView != 0))) { iVar26 = _yOffset_01; } goto switchD_004eb2c9_caseD_4d; @@ -1983,16 +1964,16 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, DAT_EntityState::instance.entityArray[local_58].graphicType2, - (int)((int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) - + DAT_RenderMap_DrawSomeX::instance)), - (int)((int)(((DAT_EntityState::instance.entityArray[local_58].y1 - - DAT_EntityState::instance.entityArray[local_58].originY) - - iVar26) - + DAT_RenderMap_DrawSomeY::instance)), + (int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance), + (int)(((DAT_EntityState::instance.entityArray[local_58].y1 + - DAT_EntityState::instance.entityArray[local_58].originY) + - iVar26) + + DAT_RenderMap_DrawSomeY::instance), (GmID)((int)(DAT_CurrentlyRenderedSpriteID::instance)), - (int)((int)(DAT_EntityState::instance.entityArray[local_58].imageID)), - (int)((int)(-1 - sVar30))); + (int)(DAT_EntityState::instance.entityArray[local_58].imageID), + (int)(-1 - sVar30)); _yOffset_01 = DAT_RenderMap_YOffset::instance; } else { _yOffset_01 = (int)DAT_EntityState::instance.entityArray[local_58].originY; @@ -2001,9 +1982,9 @@ namespace Rendering { DAT_TextureRenderCoreObject::ptr)( (eGM)DAT_CurrentlyRenderedSpriteID::instance, DAT_EntityState::instance.entityArray[local_58].graphicType2, - (int)((int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) - + DAT_RenderMap_DrawSomeX::instance)), + (int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance), (int)(( int)(((DAT_EntityState::instance.entityArray[local_58].y1 - _yOffset_01) - iVar26) @@ -2015,14 +1996,14 @@ namespace Rendering { DAT_TextureRenderCoreObject::ptr)( (GmID)DAT_CurrentlyRenderedSpriteID::instance, DAT_EntityState::instance.entityArray[local_58].graphicType2, - (int)((int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) - + DAT_RenderMap_DrawSomeX::instance)), + (int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance), (int)(( int)(((DAT_EntityState::instance.entityArray[local_58].y1 - _yOffset_01) - iVar26) + DAT_RenderMap_DrawSomeY::instance)), - (int)((int)(sVar30))); + (int)(sVar30)); _yOffset_01 = DAT_RenderMap_YOffset::instance; } } @@ -2069,16 +2050,16 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)( (GmID)DAT_CurrentlyRenderedSpriteID::instance, iVar26, - (int)((int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) - + DAT_RenderMap_DrawSomeX::instance)), - (int)((int)(((DAT_EntityState::instance.entityArray[local_58].y1 - - DAT_EntityState::instance.entityArray[local_58].originY) - - iVar18) - + DAT_RenderMap_DrawSomeY::instance)), + (int)((DAT_EntityState::instance.entityArray[local_58].x1 + - DAT_EntityState::instance.entityArray[local_58].originX) + + DAT_RenderMap_DrawSomeX::instance), + (int)(((DAT_EntityState::instance.entityArray[local_58].y1 + - DAT_EntityState::instance.entityArray[local_58].originY) + - iVar18) + + DAT_RenderMap_DrawSomeY::instance), (GmID)((int)(DAT_CurrentlyRenderedSpriteID::instance)), - (int)((int)(DAT_EntityState::instance.entityArray[local_58].imageID)), - (int)((int)(-1 - sVar30))); + (int)(DAT_EntityState::instance.entityArray[local_58].imageID), + (int)(-1 - sVar30)); } else { iVar27 = (int)DAT_EntityState::instance.entityArray[local_58].originY; if (sVar30 == 0) { @@ -2106,7 +2087,7 @@ namespace Rendering { int)(((DAT_EntityState::instance.entityArray[local_58].y1 - iVar27) - iVar18) + DAT_RenderMap_DrawSomeY::instance)), - (int)((int)(sVar30))); + (int)(sVar30)); } } sVar30 = DAT_EntityState::instance.entityArray[local_58].field83_0xc0; @@ -2140,7 +2121,7 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( - (GmID)DAT_CurrentlyRenderedSpriteID::instance, (int)((int)(sVar30)), + (GmID)DAT_CurrentlyRenderedSpriteID::instance, (int)(sVar30), DAT_EntityState::instance.entityArray[local_58].field86_0xc8 + iVar27, DAT_EntityState::instance.entityArray[local_58].field87_0xca + iVar18, iVar26); @@ -2169,8 +2150,7 @@ namespace Rendering { iVar26 = DAT_LandscapeState::instance.trees[iVar23].animationFrameUnk; iVar18 = GMTotalPicturesProcessed::instance[DAT_CurrentlyRenderedSpriteID::instance]; _yOffset_01 = iVar18 + -1 + iVar26; - if ((0 < (int)DAT_CurrentlyRenderedSpriteID::instance) - && ((_yOffset_01 != 0 && (iVar26 != 0)))) { + if (0 < (int)DAT_CurrentlyRenderedSpriteID::instance && _yOffset_01 != 0 && iVar26 != 0) { DAT_RenderedUnitOwner::instance = DAT_LandscapeState::instance.trees[iVar23].appleTreeColorVariation; DAT_TextureRenderCoreObject::instance.mbr_0x10 = 1; @@ -2183,12 +2163,12 @@ namespace Rendering { (DAT_RenderMap_DrawSomeX::instance - DAT_LandscapeState::instance.trees[iVar23].gmOriginX) + 0xe, - (int)((int)(((DAT_RenderMap_DrawSomeY::instance - - DAT_LandscapeState::instance.trees[iVar23].gmOriginY) - - DAT_RenderMap_YOffset::instance) - + 6)), - (int)((int)(DAT_GMImageHeaders::instance.imh[iVar26 + iVar18 + -1].width)), - (int)((int)(DAT_GMImageHeaders::instance.imh[iVar26 + iVar18 + -1].height)), + (int)(((DAT_RenderMap_DrawSomeY::instance + - DAT_LandscapeState::instance.trees[iVar23].gmOriginY) + - DAT_RenderMap_YOffset::instance) + + 6), + (int)(DAT_GMImageHeaders::instance.imh[iVar26 + iVar18 + -1].width), + (int)(DAT_GMImageHeaders::instance.imh[iVar26 + iVar18 + -1].height), (byte*)((int)((DAT_GMImageOffsets::instance[_yOffset_01] + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); DAT_TextureRenderCoreObject::instance.mbr_0x10 = 0; @@ -2197,9 +2177,9 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_BODY_CROW, this->unknownCounterUntil_0x24 % 0xc + 0x49, - (int)((int)(DAT_RenderMap_DrawSomeX::instance + -0x1e)), - (int)((int)((DAT_RenderMap_DrawSomeY::instance - DAT_RenderMap_YOffset::instance) - + -0xdc))); + (int)(DAT_RenderMap_DrawSomeX::instance + -0x1e), + (int)((DAT_RenderMap_DrawSomeY::instance - DAT_RenderMap_YOffset::instance) + + -0xdc)); } } MACRO_CALL_MEMBER( @@ -2207,7 +2187,7 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(8); } - if (((DAT_00ed3170::instance != 0) && ((int)DAT_00ed3170::instance < 0xff)) && (bVar13 != 0)) { + if (DAT_00ed3170::instance != 0 && (int)DAT_00ed3170::instance < 0xff && bVar13 != 0) { uVar32 = (uint)(short)DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; DAT_00ed317c::instance = uVar32 & 3; if ((DAT_00ed3148::instance & 0x100) == 0) { @@ -2224,10 +2204,10 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS, - (int)((int)(DAT_RenderMap_ImageID::instance + 8)), - (int)((int)(DAT_RenderMap_DrawSomeX::instance)), - (int)((int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + 9 - + DAT_RenderMap_DrawSomeY::instance)), + (int)(DAT_RenderMap_ImageID::instance + 8), + (int)(DAT_RenderMap_DrawSomeX::instance), + (int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + 9 + + DAT_RenderMap_DrawSomeY::instance), 0x18); } } else { @@ -2241,9 +2221,9 @@ namespace Rendering { } DAT_GmImageAddressToBeRendered::instance = iVar16 + -1 + GMTotalPicturesProcessed::instance[9]; - if ((0x20 < (int)DAT_00ed3170::instance) - && ((int)(DAT_RenderMap_DrawSomeY::instance - DAT_00ed3170::instance) - < local_5c + -0xa0)) { + if (0x20 < (int)DAT_00ed3170::instance + && (int)(DAT_RenderMap_DrawSomeY::instance - DAT_00ed3170::instance) + < local_5c + -0xa0) { MACRO_CALL_MEMBER(OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(6); } @@ -2302,8 +2282,8 @@ namespace Rendering { if (_flatView != 0) { if (uVar29 == 0) { if ((DAT_00ed3148::instance & 0x100) == 0) { - if ((((char)DAT_00ed3148::instance < '\0') - && (1999 < DAT_TileMapState::instance.OrganismLayer[_yOffset_01])) + if ((char)DAT_00ed3148::instance < '\0' + && 1999 < DAT_TileMapState::instance.OrganismLayer[_yOffset_01] && (iVar23 = DAT_TileMapState::instance.OrganismLayer[_yOffset_01] * 0x20, 1 < *(short*)((int)&DAT_LandscapeState::instance.trees[0x636] .appleTreeColorVariation @@ -2362,7 +2342,7 @@ namespace Rendering { DAT_RenderMap_YOffset::instance = 8; } if (uVar29 != 0) { - if (((local_1c < viewportWidth) && (bVar13 != 0)) && (4 < iVar31)) { + if (local_1c < viewportWidth && bVar13 != 0 && 4 < iVar31) { psVar17 = &DAT_BuildingsState::instance.buildings[uVar29].surfaceAreaUnk; *psVar17 = *psVar17 + 1; } @@ -2382,11 +2362,10 @@ namespace Rendering { (char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] .horizontalOffsetImage + DAT_RenderMap_DrawSomeX::instance, - (int)((int)(((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) - iVar23) - + DAT_RenderMap_DrawSomeY::instance)), - (int)((int)(( - char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] - .buildingWidth)), + (int)(((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) - iVar23) + + DAT_RenderMap_DrawSomeY::instance), + (int)((char)DAT_GMImageHeaders::instance.imh[DAT_GmImageAddressToBeRendered::instance] + .buildingWidth), iVar23 + 7, (ushort*)((int)( @@ -2397,17 +2376,17 @@ namespace Rendering { || (DAT_MapRenderDefinedData::instance.BuildingRenderSomeTypeArray [(short)DAT_BuildingsState::instance.buildings[uVar29].buildingType] < 0)) { - if ((DAT_BuildingsState::instance.buildings[uVar29].buildingType - == OpenSHC::Map::Buildings::BT_DRAWBRIDGE) - && ((DAT_TileMapState::instance.refreshRelatedOne != 0 - && (_yOffset_01 - == this->translationMatrix - [(short)DAT_BuildingsState::instance.buildings[uVar29].y + 2] - .addXgetTile - + 2 + (int)(short)DAT_BuildingsState::instance.buildings[uVar29].x)))) { + if (DAT_BuildingsState::instance.buildings[uVar29].buildingType + == OpenSHC::Map::Buildings::BT_DRAWBRIDGE + && DAT_TileMapState::instance.refreshRelatedOne != 0 + && _yOffset_01 + == this->translationMatrix[(short)DAT_BuildingsState::instance.buildings[uVar29].y + + 2] + .addXgetTile + + 2 + (int)(short)DAT_BuildingsState::instance.buildings[uVar29].x) { MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderBuildingAnimation, - this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance + 0x10)), - (int)((int)(DAT_00ed3154::instance + 0x18 + DAT_RenderMap_DrawSomeY::instance)), + this)(uVar29, (int)(DAT_RenderMap_DrawSomeX::instance + 0x10), + (int)(DAT_00ed3154::instance + 0x18 + DAT_RenderMap_DrawSomeY::instance), (undefined4)((int)(_yOffset_01)), 1); } uVar10 = *puVar1; @@ -2418,16 +2397,16 @@ namespace Rendering { if ((uVar10 & 0xc) == 0xc) { MACRO_CALL_MEMBER( OpenSHC::Rendering::ViewportRenderState_Func::renderBuildingAnimation, - this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance + 0x10)), - (int)((int)(DAT_00ed3154::instance + 0x28 - + DAT_RenderMap_DrawSomeY::instance)), + this)(uVar29, (int)(DAT_RenderMap_DrawSomeX::instance + 0x10), + (int)(DAT_00ed3154::instance + 0x28 + + DAT_RenderMap_DrawSomeY::instance), (undefined4)((int)(_yOffset_01)), 0); } else if ((uVar10 & 8) != 0) { MACRO_CALL_MEMBER( OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding, - this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance)), - (int)((int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) - + DAT_RenderMap_DrawSomeY::instance)), + this)(uVar29, (int)(DAT_RenderMap_DrawSomeX::instance), + (int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + + DAT_RenderMap_DrawSomeY::instance), _yOffset_01); } } @@ -2437,13 +2416,13 @@ namespace Rendering { if ((uVar10 & 8) == 0) { MACRO_CALL_MEMBER( OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding2, - this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance)), iVar23, - _yOffset_01); + this)( + uVar29, (int)(DAT_RenderMap_DrawSomeX::instance), iVar23, _yOffset_01); } else { MACRO_CALL_MEMBER( OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding, - this)(uVar29, (int)((int)(DAT_RenderMap_DrawSomeX::instance)), iVar23, - _yOffset_01); + this)( + uVar29, (int)(DAT_RenderMap_DrawSomeX::instance), iVar23, _yOffset_01); } } } @@ -2455,15 +2434,15 @@ namespace Rendering { this->viewportState.mouseRayBuildingID = uVar29; } } - if (((DAT_00ed3148::instance & 8) != 0) && ((*puVar1 & 0x4000) != 0)) { + if ((DAT_00ed3148::instance & 8) != 0 && (*puVar1 & 0x4000) != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, - (int)((int)(DAT_TileMapState::instance.field161_0x5549c0)), - (int)((int)(DAT_RenderMap_DrawSomeX::instance + -0x23)), - (int)((int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + -0x4a - + DAT_RenderMap_DrawSomeY::instance)), + (int)(DAT_TileMapState::instance.field161_0x5549c0), + (int)(DAT_RenderMap_DrawSomeX::instance + -0x23), + (int)((DAT_00ed3154::instance - DAT_RenderMap_YOffset::instance) + -0x4a + + DAT_RenderMap_DrawSomeY::instance), OpenSHC::IO::Graphics::GID_FLOATS_NEW, - (int)((int)(DAT_TileMapState::instance.field161_0x5549c0 + 0x10)), 0); + (int)(DAT_TileMapState::instance.field161_0x5549c0 + 0x10), 0); *puVar1 = *puVar1 & 0xbfff; } iVar23 = DAT_RenderMap_YOffset::instance; @@ -2494,8 +2473,8 @@ namespace Rendering { uVar29 = this->floatersArray[uVar32].variation; if ((uVar29 & 1) != 0) { iVar26 = iVar23; - if (((((uVar29 & 8) != 0) && (DAT_TileMapState::instance.refreshRelatedOne != 0)) - && (_flatView == 0)) + if ((uVar29 & 8) != 0 && DAT_TileMapState::instance.refreshRelatedOne != 0 + && _flatView == 0 && (iVar26 = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::getTotalHeightAt, DAT_TileMapState::ptr)(_yOffset_01, 0), iVar26 < 0)) { @@ -2514,21 +2493,21 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)((eGM)this->floatersArray[uVar32].gmID, this->floatersArray[uVar32].imageID, - (int)((int)(this->floatersArray[uVar32].originX - + DAT_RenderMap_DrawSomeX::instance)), - (int)((int)((this->floatersArray[uVar32].originY - iVar26) - + DAT_RenderMap_DrawSomeY::instance))); + (int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance), + (int)((this->floatersArray[uVar32].originY - iVar26) + + DAT_RenderMap_DrawSomeY::instance)); } else { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( (GmID)this->floatersArray[uVar32].gmID, this->floatersArray[uVar32].imageID, - (int)((int)(this->floatersArray[uVar32].originX - + DAT_RenderMap_DrawSomeX::instance)), - (int)((int)((this->floatersArray[uVar32].originY - iVar26) - + DAT_RenderMap_DrawSomeY::instance)), - (int)((int)(uVar29 >> 0x10))); + (int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance), + (int)((this->floatersArray[uVar32].originY - iVar26) + + DAT_RenderMap_DrawSomeY::instance), + (int)(uVar29 >> 0x10)); } } else { iVar18 = this->floatersArray[uVar32].imageID; @@ -2536,10 +2515,10 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)((GmID)GVar11, iVar18, - (int)((int)(this->floatersArray[uVar32].originX - + DAT_RenderMap_DrawSomeX::instance)), - (int)((int)((this->floatersArray[uVar32].originY - iVar26) - + DAT_RenderMap_DrawSomeY::instance)), + (int)(this->floatersArray[uVar32].originX + + DAT_RenderMap_DrawSomeX::instance), + (int)((this->floatersArray[uVar32].originY - iVar26) + + DAT_RenderMap_DrawSomeY::instance), GVar11, ((int)uVar29 >> 0x10) + iVar18, 0); } } else { @@ -2576,8 +2555,8 @@ namespace Rendering { do { iVar31 = *local_20; DAT_GmImageAddressToBeRendered::instance = (uint)DAT_TileMapState::instance.AlphaGFXLayer[iVar31]; - if ((DAT_GmImageAddressToBeRendered::instance != 0) - && ((DAT_TileMapState::instance.MiscDisplayLayer[iVar31] & 0x3c0) == 0)) { + if (DAT_GmImageAddressToBeRendered::instance != 0 + && (DAT_TileMapState::instance.MiscDisplayLayer[iVar31] & 0x3c0) == 0) { if ((local_48 < 2) || (_vpWidthPlus1_1 + -2 <= local_48)) { bVar13 = 0; } else { @@ -2589,7 +2568,7 @@ namespace Rendering { .buildings[DAT_TileMapState::instance.BuildingLayer[iVar31]] .tickRelatedVisuallyActiveIndicator; sVar30 = *psVar17; - if (((0 < sVar30) && (sVar30 < 5)) && (bVar13 != 0)) { + if (0 < sVar30 && sVar30 < 5 && bVar13 != 0) { DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[iVar31]; DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance @@ -2607,16 +2586,16 @@ namespace Rendering { .horizontalOffsetImage + DAT_RenderMap_DrawSomeX::instance, (DAT_RenderMap_DrawSomeY::instance - DAT_RenderMap_YOffset::instance) - iVar31, - (int)((int)((char)DAT_GMImageHeaders::instance + (int)((char)DAT_GMImageHeaders::instance .imh[DAT_GmImageAddressToBeRendered::instance] - .buildingWidth)), + .buildingWidth), iVar31 + 7, (ushort*)((int)( (DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + 0x200 + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData))), - (int)((int)((*psVar17 << 5) / 5))); + (int)((*psVar17 << 5) / 5)); } } } @@ -2649,9 +2628,8 @@ namespace Rendering { DAT_PencilRenderCore::ptr)(0, 0x2ce, 0xfd8, 0x2ce, 0xe); MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::PencilRenderCore_Func::drawBlendedBlackBox, DAT_PencilRenderCore::ptr)(0, 0x2cf, 0xfd8, 0x2cf, 8); - MACRO_CALL_MEMBER( - OpenSHC::UI::Rendering::PencilRenderCore_Func::drawColorBox, DAT_PencilRenderCore::ptr)( - 0, 0x2d0, 0xfd8, 0x7f1, (ushort)((int)(COL_BLACK::instance.shortValue))); + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::PencilRenderCore_Func::drawColorBox, + DAT_PencilRenderCore::ptr)(0, 0x2d0, 0xfd8, 0x7f1, (ushort)(COL_BLACK::instance.shortValue)); DAT_PencilRenderCore::instance.surfaceTarget = OpenSHC::Rendering::Enums::RT_SCREEN_MENU; } goto LAB_004ec57a; @@ -2686,8 +2664,8 @@ namespace Rendering { case 3: MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)((GmID)DAT_TileMapState::instance.field163_0x5549c8, - (int)((int)(DAT_TileMapState::instance.field162_0x5549c4 + 0x10 - + DAT_TileMapState::instance.field161_0x5549c0)), + (int)(DAT_TileMapState::instance.field162_0x5549c4 + 0x10 + + DAT_TileMapState::instance.field161_0x5549c0), viewportWidth - DAT_TextureRenderCoreObject::instance .gmFileHeaderColorpaletteArray[DAT_TileMapState::instance.field163_0x5549c8] @@ -2700,8 +2678,8 @@ namespace Rendering { case 2: MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)((eGM)DAT_TileMapState::instance.field163_0x5549c8, - (int)((int)(DAT_TileMapState::instance.field162_0x5549c4 - + DAT_TileMapState::instance.field161_0x5549c0)), + (int)(DAT_TileMapState::instance.field162_0x5549c4 + + DAT_TileMapState::instance.field161_0x5549c0), viewportWidth - DAT_TextureRenderCoreObject::instance .gmFileHeaderColorpaletteArray[DAT_TileMapState::instance.field163_0x5549c8] @@ -2714,7 +2692,7 @@ namespace Rendering { case 4: MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)((eGM)DAT_TileMapState::instance.field163_0x5549c8, - (int)((int)(DAT_TileMapState::instance.field162_0x5549c4)), viewportWidth + -8, + (int)(DAT_TileMapState::instance.field162_0x5549c4), viewportWidth + -8, _viewportHeight + -8); break; case 5: @@ -2797,8 +2775,8 @@ namespace Rendering { - iVar26) + DAT_RenderMap_DrawSomeY::instance, (undefined4)((int)(DAT_EntityState::instance.entityArray[local_58].graphicType2)), - (undefined4)((int)((int)DAT_EntityState::instance.entityArray[local_58].unkMinusOne)), - (undefined4)((int)((int)DAT_EntityState::instance.entityArray[local_58].imageID)), 0); + (undefined4)((int)(DAT_EntityState::instance.entityArray[local_58].unkMinusOne)), + (undefined4)((int)(DAT_EntityState::instance.entityArray[local_58].imageID)), 0); _yOffset_01 = DAT_RenderMap_YOffset::instance; goto LAB_004eb439; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index e601bc6a0..b6f51f7e9 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37341,7 +37341,7 @@ SHC_3BB0A8C1_0x004E8CA0 | 100.0% | Reimplemented SHC_3BB0A8C1_0x004E8CC0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E8CF0 | 31.8% | reg alloc + stack slot order +SHC_3BB0A8C1_0x004E8CF0 | 31.9% | Style pass, reg alloc differs SHC_3BB0A8C1_0x004E9000 | 0.0% | Pending From e37d63fd89c2dd95beccc659e0f6bbbe23ef5182 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 22:42:55 +0200 Subject: [PATCH 68/77] reimplement: SHC_3BB0A8C1_0x004E8430 49.62% Style pass, reg alloc differs --- .../ViewportRenderState/updateBuildingPreviewPosition.cpp | 4 ++-- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp index efe4e0d10..252e0f743 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp @@ -53,8 +53,8 @@ namespace Rendering { } if (DAT_TextureRenderCoreObject::instance.activeMenuTabIndex != 0) { - int hitBoxRow = (DAT_TextureRenderCoreObject::instance.activeMenuTabIndex * 5 - 5) * 2; - int nextHitBoxRow = (DAT_TextureRenderCoreObject::instance.activeMenuTabIndex * 5 - 5) * 2; + int hitBoxRow = (DAT_TextureRenderCoreObject::instance.activeMenuTabIndex - 1) * 10; + int nextHitBoxRow = (DAT_TextureRenderCoreObject::instance.activeMenuTabIndex - 1) * 10; int hitBoxAnchor = DAT_MapRenderDefinedData::instance.BuildingPreviewPositionRelatedOffsets[hitBoxRow][0].x; if (hitBoxAnchor != -1) { do { diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b6f51f7e9..c65d481a0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37217,7 +37217,7 @@ SHC_3BB0A8C1_0x004E8429 | 0.0% | Pending SHC_3BB0A8C1_0x004E842A | 0.0% | Pending -SHC_3BB0A8C1_0x004E8430 | 49.6% | reg alloc + tail merging +SHC_3BB0A8C1_0x004E8430 | 49.6% | Style pass, reg alloc differs SHC_3BB0A8C1_0x004E8BFC | 0.0% | Pending From c6ad8218c9ff353acab9ba3e7179b8d099d70732 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 23:02:01 +0200 Subject: [PATCH 69/77] reimplement: SHC_3BB0A8C1_0x004E3980 44.97% Style pass, reg alloc differs --- .../renderGmOverlayBuilding.cpp | 770 +++++++++--------- 1 file changed, 385 insertions(+), 385 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp index 989d97c6d..d08665f04 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp @@ -39,14 +39,14 @@ namespace Rendering { void ViewportRenderState::renderGmOverlayBuilding(int tileIndex, int xUnk, int yUnk, int param_4) { short sVar1; - BuildingTypeShort BVar2; + BuildingTypeShort buildingType; int iVar6; int* piVar7; uint uVar8; int iVar9; int iVar10; - int iVar11; - GmID GVar12; + int frame; + GmID overlayGmID; eGM gmID; GmID maskGmID; int local_18; @@ -60,34 +60,34 @@ namespace Rendering { local_14 = 0; if (DAT_BuildingsState::instance.buildings[tileIndex].displayOwnerFlag != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].tickRelatedVisuallyActiveIndicator; - if (sVar1 < 1 || 4 < sVar1 || (iVar11 = 0x20 - ((int)sVar1 << 5) / 5, iVar11 == 0x20)) { - iVar11 = 0; + if (sVar1 < 1 || 4 < sVar1 || (frame = 0x20 - ((int)sVar1 << 5) / 5, frame == 0x20)) { + frame = 0; } - BVar2 = DAT_BuildingsState::instance.buildings[tileIndex].buildingType; - if (BVar2 == OpenSHC::Map::Buildings::BT_CAMPGROUND) { + buildingType = DAT_BuildingsState::instance.buildings[tileIndex].buildingType; + if (buildingType == OpenSHC::Map::Buildings::BT_CAMPGROUND) { if (DAT_BuildingsState::instance.buildings[tileIndex].owner == DAT_GameSynchronyState::instance.currentPlayerSlotID) { - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC, frame, (xUnk - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x55].originX) + -5, (yUnk - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x55].originY) + -0x59, - OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC, iVar11 + 0x65, 0); + OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC, frame + 0x65, 0); } } else { iVar6 = 0; if (DAT_TileMapState::instance.field93_0x5548c8 != 0) { return; } - switch (BVar2) { + switch (buildingType) { case OpenSHC::Map::Buildings::BT_WOODCUTTERSHUT: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x27, yUnk + -0x67); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x27, yUnk + -0x67); } DAT_GmImageAddressToBeRendered::instance = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; @@ -115,17 +115,17 @@ namespace Rendering { } break; case OpenSHC::Map::Buildings::BT_IRONMINE: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x27, yUnk + -0x21); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x27, yUnk + -0x21); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_IRON_MINER; - if (iVar11 != 0) { + if (frame != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field117_0x11a; if (sVar1 == 0) { local_18 = -0x1f; @@ -137,28 +137,28 @@ namespace Rendering { if (sVar1 == 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, local_18 + xUnk, local_14 + yUnk); + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, frame, local_18 + xUnk, local_14 + yUnk); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_IRON_MINER, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_IRON_MINER, frame, local_18 + xUnk, local_14 + yUnk, (int)(DAT_BuildingsState::instance.buildings[tileIndex].field208_0x292)); } } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, xUnk + -0x1f, yUnk + -0x59); + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, frame, xUnk + -0x1f, yUnk + -0x59); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, xUnk + -0x17, yUnk + -0x36); + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, frame, xUnk + -0x17, yUnk + -0x36); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].state; if (sVar1 == 0) { iVar6 = -0x23; @@ -172,14 +172,14 @@ namespace Rendering { iVar9 = -0x46; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, iVar6 + xUnk, iVar9 + yUnk); - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, frame, iVar6 + xUnk, iVar9 + yUnk); + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { iVar6 = yUnk + -0x54; iVar9 = xUnk + -0x33; gmID = OpenSHC::DE::SHCDE::GM_MINE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); } break; } @@ -195,14 +195,14 @@ namespace Rendering { iVar9 = -0x46; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, iVar6 + xUnk, iVar9 + yUnk); - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, frame, iVar6 + xUnk, iVar9 + yUnk); + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { iVar6 = yUnk + -0x54; iVar9 = xUnk + -0x33; gmID = OpenSHC::DE::SHCDE::GM_MINE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); } break; } @@ -212,73 +212,73 @@ namespace Rendering { } MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_MINE_ANIMS, iVar11, iVar6 + xUnk, iVar9 + yUnk); + OpenSHC::DE::SHCDE::GM_MINE_ANIMS, frame, iVar6 + xUnk, iVar9 + yUnk); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { iVar6 = yUnk + -0x54; iVar9 = xUnk + -0x33; gmID = OpenSHC::DE::SHCDE::GM_MINE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); } break; case OpenSHC::Map::Buildings::BT_PITCHRIG: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x50; iVar9 = xUnk + 0xc; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_HUNTERSHUT: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x25, yUnk + -0x56); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x25, yUnk + -0x56); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_HUNTER; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x3c; iVar9 = xUnk + -0x23; gmID = OpenSHC::DE::SHCDE::GM_HUNTER_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_MERCENARYPOST: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x6b; iVar9 = xUnk + -0x25; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_BARRACKS: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x75; iVar9 = xUnk + -0x25; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; @@ -349,217 +349,217 @@ namespace Rendering { } if (0x20 <= iVar10) { iVar10 = 0; - GVar12 = OpenSHC::IO::Graphics::GID_ANIM_GOODS; + overlayGmID = OpenSHC::IO::Graphics::GID_ANIM_GOODS; local_8 = 0; } else { - GVar12 = OpenSHC::IO::Graphics::GID_ANIM_SHIELDS; + overlayGmID = OpenSHC::IO::Graphics::GID_ANIM_SHIELDS; local_8 = -10; iVar10 = DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x68].originY; } - int iVar3 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + int blendFrame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; DAT_RenderedUnitOwner::instance = 0; - DAT_CurrentlyRenderedSpriteID::instance = GVar12; - if ((iVar3 != 0) && (iVar6 == iVar9)) { + DAT_CurrentlyRenderedSpriteID::instance = overlayGmID; + if ((blendFrame != 0) && (iVar6 == iVar9)) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(GVar12, + DAT_TextureRenderCoreObject::ptr)(overlayGmID, DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c, (xUnk - (int)DAT_GMImageHeaders::instance - .imh[iVar3 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .imh[blendFrame + GMTotalPicturesProcessed::instance[overlayGmID] + -1] .width / 2) + 0xf + local_8, (yUnk - DAT_GMImageHeaders::instance - .imh[iVar3 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .imh[blendFrame + GMTotalPicturesProcessed::instance[overlayGmID] + -1] .height) + -0xf + iVar10, - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay; if ((iVar9 != 0) && (iVar6 == local_10)) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(GVar12, + DAT_TextureRenderCoreObject::ptr)(overlayGmID, DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay, (xUnk - (int)DAT_GMImageHeaders::instance - .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] .width / 2) + 0xf + local_8, (yUnk - DAT_GMImageHeaders::instance - .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] .height) + -0xf + iVar10, - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c; if ((iVar9 != 0) && (iVar6 == local_18)) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(GVar12, + DAT_TextureRenderCoreObject::ptr)(overlayGmID, DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c, (xUnk - (int)DAT_GMImageHeaders::instance - .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] .width / 2) + 0xf + local_8, (yUnk - DAT_GMImageHeaders::instance - .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] .height) + -0xf + iVar10, - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; if ((iVar9 != 0) && (iVar6 == local_14)) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(GVar12, iVar9, + DAT_TextureRenderCoreObject::ptr)(overlayGmID, iVar9, (xUnk - (int)DAT_GMImageHeaders::instance - .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] .width / 2) + 0xf + local_8, (yUnk - DAT_GMImageHeaders::instance - .imh[iVar9 + GMTotalPicturesProcessed::instance[GVar12] + -1] + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] .height) + -0xf + iVar10, - iVar11); + frame); } if (param_4 == *(int*)(DAT_BuildingsState::instance.buildings[tileIndex].workers + local_4 * 2 + 8)) { DAT_RenderedUnitOwner::instance = DAT_BuildingsState::instance.buildings[tileIndex].playerColorUnk; - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field36_0x78; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field36_0x78; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x88; iVar9 = xUnk + -0x26; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } } break; } case OpenSHC::Map::Buildings::BT_FLETCHER: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x82; iVar9 = xUnk + -0x25; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_BLACKSMITH: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x25, yUnk + -0x7b); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x25, yUnk + -0x7b); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; DAT_RenderedUnitOwner::instance = 2; DAT_CurrentlyRenderedSpriteID::instance = 0x3a; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_WORKSHOP_SMITH_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x49); + OpenSHC::DE::SHCDE::GM_WORKSHOP_SMITH_ANIMS, frame, xUnk + -0x23, yUnk + -0x49); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_SMOKE_30X30; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::IO::Graphics::GID_SMOKE_30X30, iVar11, xUnk + 3, yUnk + -0x7c, 0x10); + OpenSHC::IO::Graphics::GID_SMOKE_30X30, frame, xUnk + 3, yUnk + -0x7c, 0x10); } break; case OpenSHC::Map::Buildings::BT_POLETURNER: case OpenSHC::Map::Buildings::BT_TANNER: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x80; iVar9 = xUnk + -0x25; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_ARMOURER: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x89; iVar9 = xUnk + -0x25; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_BAKERY: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x25, yUnk + -0x7b); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x25, yUnk + -0x7b); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = 0x42; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_WORKSHOP_BAKER_ANIMS, iVar11, xUnk + -0x14, yUnk + -0x5f); + OpenSHC::DE::SHCDE::GM_WORKSHOP_BAKER_ANIMS, frame, xUnk + -0x14, yUnk + -0x5f); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_SMOKE_30X30; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::IO::Graphics::GID_SMOKE_30X30, iVar11, xUnk + -4, yUnk + -0x8c, 0x10); + OpenSHC::IO::Graphics::GID_SMOKE_30X30, frame, xUnk + -4, yUnk + -0x8c, 0x10); } break; case OpenSHC::Map::Buildings::BT_BREWERY: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x25, yUnk + -0x7b); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x25, yUnk + -0x7b); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; DAT_RenderedUnitOwner::instance = 2; DAT_CurrentlyRenderedSpriteID::instance = 0x33; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_WORKSHOP_BREW_ANIMS, iVar11, xUnk + -0x3c, yUnk + -0x44); + OpenSHC::DE::SHCDE::GM_WORKSHOP_BREW_ANIMS, frame, xUnk + -0x3c, yUnk + -0x44); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_SMOKE_30X30; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::IO::Graphics::GID_SMOKE_30X30, iVar11, xUnk + 7, yUnk + -0x7c, 0x10); + OpenSHC::IO::Graphics::GID_SMOKE_30X30, frame, xUnk + 7, yUnk + -0x7c, 0x10); } break; case OpenSHC::Map::Buildings::BT_GRANARY: @@ -599,7 +599,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; if ((iVar9 != 0) && (iVar6 == 1)) { @@ -617,7 +617,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; if ((iVar9 != 0) && (iVar6 == 2)) { @@ -635,7 +635,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field34_0x70; if ((iVar9 != 0) && (iVar6 == 3)) { @@ -653,7 +653,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; if ((iVar9 != 0) && (iVar6 == 4)) { @@ -671,7 +671,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; if ((iVar9 != 0) && (iVar6 == 5)) { @@ -689,7 +689,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field32_0x68; if ((iVar9 != 0) && (iVar6 == 6)) { @@ -707,7 +707,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c; if ((iVar9 != 0) && (iVar6 == 7)) { @@ -725,7 +725,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; if ((iVar9 != 0) && (iVar6 == 8)) { @@ -743,7 +743,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay; if ((iVar9 != 0) && (iVar6 == 9)) { @@ -761,7 +761,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field35_0x74; if ((iVar9 != 0) && (iVar6 == 10)) { @@ -779,7 +779,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; if ((iVar9 != 0) && (iVar6 == 0xb)) { @@ -797,7 +797,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field33_0x6c; if ((iVar9 != 0) && (iVar6 == 0xc)) { @@ -815,7 +815,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field36_0x78; if ((iVar9 != 0) && (iVar6 == 0xd)) { @@ -833,7 +833,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].ownerFlagFrame; if ((iVar9 != 0) && (iVar6 == 0xe)) { @@ -851,7 +851,7 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].field40_0x88; if ((iVar9 != 0) && (iVar6 == 0xf)) { @@ -868,159 +868,159 @@ namespace Rendering { .imh[GMTotalPicturesProcessed::instance[0x1c] + iVar9 + -1] .height) + -5), - iVar11); + frame); } break; case OpenSHC::Map::Buildings::BT_QUARRY: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x26, yUnk + -0x3c); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x26, yUnk + -0x3c); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; DAT_RenderedUnitOwner::instance = 1; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_QUARRY; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, iVar11, xUnk + 0xc, yUnk + -0x8c); + OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, frame, xUnk + 0xc, yUnk + -0x8c); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, iVar11, xUnk + -0x31, yUnk + -0x88); + OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, frame, xUnk + -0x31, yUnk + -0x88); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, iVar11, xUnk + -0x20, yUnk + -0x6b); + OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, frame, xUnk + -0x20, yUnk + -0x6b); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (frame != 0) { iVar6 = yUnk + -0x6f; iVar9 = xUnk + -0x5f; gmID = OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_INN: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x45, yUnk + -0x95); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x45, yUnk + -0x95); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_INN; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, frame, DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk, DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, frame, DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk, DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, frame, DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk, DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (frame != 0) { iVar6 = DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk; iVar9 = DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk; gmID = OpenSHC::DE::SHCDE::GM_ANIM_INN; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_APOTHECARY: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0xb1; iVar9 = xUnk + 5; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_ENGINEERSGUILD: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x72; iVar9 = xUnk + -0x33; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_TUNNELERSGUILD: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x77; iVar9 = xUnk + -0x36; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_MARKETPLACE: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x6a; iVar9 = xUnk + -0x27; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_OILSMELTER: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + 3, yUnk + -0x7d); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + 3, yUnk + -0x7d); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_BOILED_OIL; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_OIL_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x3e); + OpenSHC::DE::SHCDE::GM_OIL_ANIMS, frame, xUnk + -0x23, yUnk + -0x3e); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { iVar9 = xUnk + -0x23; - if (iVar11 < 0x7b) { + if (frame < 0x7b) { iVar6 = yUnk + -100; gmID = OpenSHC::DE::SHCDE::GM_OIL_ANIMS; } else { @@ -1028,74 +1028,74 @@ namespace Rendering { gmID = OpenSHC::DE::SHCDE::GM_OIL_ANIMS; } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_WHEATFARM: case OpenSHC::Map::Buildings::BT_HOPFARM: case OpenSHC::Map::Buildings::BT_APPLEFARM: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x6d; iVar9 = xUnk + -0x37; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_DAIRYFARM: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x37, yUnk + -0x6d); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x37, yUnk + -0x6d); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FARMER; - if (iVar11 != 0) { + if (frame != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; if (sVar1 == 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_FARMER_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x51); + OpenSHC::DE::SHCDE::GM_FARMER_ANIMS, frame, xUnk + -0x23, yUnk + -0x51); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, frame, xUnk + -0x23, yUnk + -0x51, (int)(sVar1)); } } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; if (sVar1 == 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_FARMER_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x51); + OpenSHC::DE::SHCDE::GM_FARMER_ANIMS, frame, xUnk + -0x23, yUnk + -0x51); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, frame, xUnk + -0x23, yUnk + -0x51, (int)(sVar1)); } } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_FARMER_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x51); + OpenSHC::DE::SHCDE::GM_FARMER_ANIMS, frame, xUnk + -0x23, yUnk + -0x51); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (frame != 0) { iVar6 = yUnk + -0x51; iVar9 = xUnk + -0x23; gmID = OpenSHC::DE::SHCDE::GM_FARMER_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; @@ -1119,47 +1119,47 @@ namespace Rendering { if (iVar6 != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::IO::Graphics::GID_ANIM_WINDMILL, iVar6, xUnk + -0x4e, yUnk + -0x103, iVar11); + OpenSHC::IO::Graphics::GID_ANIM_WINDMILL, iVar6, xUnk + -0x4e, yUnk + -0x103, frame); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_WINDMILL_ANIMS, iVar11, xUnk + -0x4e, yUnk + -0xd0); + OpenSHC::DE::SHCDE::GM_WINDMILL_ANIMS, frame, xUnk + -0x4e, yUnk + -0xd0); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (frame != 0) { iVar6 = yUnk + -0x124; iVar9 = xUnk + -0x59; gmID = OpenSHC::DE::SHCDE::GM_WINDMILL_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_STABLES: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - if (iVar11 != 0) { + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, iVar11, xUnk + -0x12, yUnk + -99); + OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, frame, xUnk + -0x12, yUnk + -99); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; DAT_RenderedUnitOwner::instance = 0; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_STABLES; - if (iVar11 != 0) { + if (frame != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; - if (iVar11 < 0x26) { + if (frame < 0x26) { if (sVar1 == 0) { iVar6 = yUnk + -0x6b; iVar9 = xUnk + -0x50; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, frame, iVar9, iVar6); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, xUnk + -0x50, yUnk + -0x6b, (int)(sVar1)); } } else { @@ -1168,27 +1168,27 @@ namespace Rendering { iVar9 = xUnk + -0x67; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, frame, iVar9, iVar6); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, xUnk + -0x50, yUnk + -0x6b, (int)(sVar1)); } } } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; - if (iVar11 < 0x26) { + if (frame < 0x26) { if (sVar1 == 0) { iVar6 = yUnk + -0x60; iVar9 = xUnk + -0x3a; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, frame, iVar9, iVar6); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, xUnk + -0x3a, yUnk + -0x60, (int)(sVar1)); } } else { @@ -1197,27 +1197,27 @@ namespace Rendering { iVar9 = xUnk + -0x51; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, frame, iVar9, iVar6); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, xUnk + -0x3a, yUnk + -0x60, (int)(sVar1)); } } } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; - if (iVar11 < 0x26) { + if (frame < 0x26) { if (sVar1 == 0) { iVar6 = yUnk + -0x55; iVar9 = xUnk + -0x24; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, frame, iVar9, iVar6); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, xUnk + -0x24, yUnk + -0x55, (int)(sVar1)); } } else { @@ -1226,35 +1226,35 @@ namespace Rendering { iVar9 = xUnk + -0x37; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, iVar9, iVar6); + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, frame, iVar9, iVar6); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, xUnk + -0x24, yUnk + -0x55, (int)(sVar1)); } } } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; - if (iVar11 < 0x26) { + if (frame < 0x26) { if (sVar1 == 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, iVar11, xUnk + -0xe, yUnk + -0x4a); + OpenSHC::DE::SHCDE::GM_STABLE_ANIMS, frame, xUnk + -0xe, yUnk + -0x4a); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, xUnk + -0xe, yUnk + -0x4a, (int)(sVar1)); } sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; if (sVar1 == 0) { iVar6 = yUnk + -0x49; iVar9 = xUnk + -2; - iVar11 = 0x26; + frame = 0x26; gmID = OpenSHC::DE::SHCDE::GM_STABLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, @@ -1266,377 +1266,377 @@ namespace Rendering { iVar9 = xUnk + -0x21; gmID = OpenSHC::DE::SHCDE::GM_STABLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, - DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, iVar11, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, xUnk + -0xe, yUnk + -0x4a, (int)(sVar1)); } } break; case OpenSHC::Map::Buildings::BT_CHAPEL: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x7c; iVar9 = xUnk + -0x26; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_CHURCH: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x97; iVar9 = xUnk + -9; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_CATHEDRAL: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0xca; iVar9 = xUnk + -0xd; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; gmID = OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_STONEKEEP: if ((DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) - && (iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38, iVar11 != 0)) { + && (frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38, frame != 0)) { iVar6 = yUnk + -0x8f; iVar9 = xUnk + -0x60; gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_STRONGHOLD: if ((DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) - && (iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38, iVar11 != 0)) { + && (frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38, frame != 0)) { iVar6 = yUnk + -0x12a; iVar9 = xUnk + -0x9f; gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_GATEHOUSELARGE: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -7, yUnk + -0xc1); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -7, yUnk + -0xc1); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x60, yUnk + -0xc1); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x60, yUnk + -0xc1); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 3, yUnk + -0x5b); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + 3, yUnk + -0x5b); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x33, yUnk + -0x5b); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x33, yUnk + -0x5b); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_BODY_GATE, iVar11, xUnk + 0x11, yUnk + -0x5e); + OpenSHC::DE::SHCDE::GM_BODY_GATE, frame, xUnk + 0x11, yUnk + -0x5e); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (frame != 0) { iVar6 = yUnk + -0x5e; iVar9 = xUnk + -0x56; gmID = OpenSHC::DE::SHCDE::GM_BODY_GATE; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_GATEHOUSESMALL: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 5, yUnk + -0xb2); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + 5, yUnk + -0xb2); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x40, yUnk + -0xb1); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x40, yUnk + -0xb1); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0xd, yUnk + -0x53); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0xd, yUnk + -0x53); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x23, yUnk + -0x53); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x23, yUnk + -0x53); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_BODY_GATE, iVar11, xUnk, yUnk + -0x58); + OpenSHC::DE::SHCDE::GM_BODY_GATE, frame, xUnk, yUnk + -0x58); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (frame != 0) { iVar6 = yUnk + -0x58; iVar9 = xUnk + -0x46; gmID = OpenSHC::DE::SHCDE::GM_BODY_GATE; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_WOODGATE1: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 3, yUnk + -0x6e); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + 3, yUnk + -0x6e); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x20, yUnk + -0x6a); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x20, yUnk + -0x6a); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x20, yUnk + -0x46); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x20, yUnk + -0x46); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 8, yUnk + -0x47); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + 8, yUnk + -0x47); } if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 0x11, yUnk + -0x37); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + 0x11, yUnk + -0x37); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (frame != 0) { iVar6 = yUnk + -0x37; iVar9 = xUnk + -0x15; gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } } break; case OpenSHC::Map::Buildings::BT_DRAWBRIDGE: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 7, yUnk + -0x7c); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + 7, yUnk + -0x7c); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + if (frame != 0) { iVar6 = yUnk + -0x7e; iVar9 = xUnk + -0x33; gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } break; case OpenSHC::Map::Buildings::BT_TOWER1: if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x21, yUnk + -0x140); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x21, yUnk + -0x140); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (frame != 0) { iVar6 = yUnk + -0x17b; iVar9 = xUnk + -0x22; gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } } break; case OpenSHC::Map::Buildings::BT_TOWER2: if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x30, yUnk + -0xc2); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x30, yUnk + -0xc2); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x29, yUnk + -0x93); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x29, yUnk + -0x93); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (frame != 0) { iVar6 = yUnk + -0x8c; iVar9 = xUnk + -2; gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } } break; case OpenSHC::Map::Buildings::BT_TOWER3: if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { /* crenellations */ MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x3f, yUnk + -0xe1); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x3f, yUnk + -0xe1); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x29, yUnk + -0x96); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x29, yUnk + -0x96); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (frame != 0) { iVar6 = yUnk + -0x93; iVar9 = xUnk + 0xd; gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } } break; case OpenSHC::Map::Buildings::BT_TOWER4: if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x4d, yUnk + -0xf6); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x4d, yUnk + -0xf6); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x39, yUnk + -0x9a); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x39, yUnk + -0x9a); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + 0xf, yUnk + -0x96); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + 0xf, yUnk + -0x96); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderRoof; + if (frame != 0) { /* roof */ MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x4d, yUnk + -0x13b); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x4d, yUnk + -0x13b); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay; + if (frame != 0) { iVar6 = yUnk + -0x114; iVar9 = xUnk + -0x4d; gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } } break; case OpenSHC::Map::Buildings::BT_TOWER5: if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 0) { - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x4c, yUnk + -0x104); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x4c, yUnk + -0x104); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, iVar11, xUnk + -0x32, yUnk + -0x9d); + OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS, frame, xUnk + -0x32, yUnk + -0x9d); } - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; - if (iVar11 != 0) { + frame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + if (frame != 0) { iVar6 = yUnk + -0x97; iVar9 = xUnk + 0x10; gmID = OpenSHC::DE::SHCDE::GM_CASTLE_ANIMS; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } } break; case OpenSHC::Map::Buildings::BT_CHOPPINGBLOCK: - iVar11 = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_CHOPPING_BLOCK; DAT_RenderedUnitOwner::instance = 0; - if (iVar11 != 0) { + if (frame != 0) { iVar6 = yUnk + -0x4c; iVar9 = xUnk + -0x23; gmID = OpenSHC::DE::SHCDE::GM_ANIM_CHOPPING_BLOCK; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, - DAT_TextureRenderCoreObject::ptr)(gmID, iVar11, iVar9, iVar6); + DAT_TextureRenderCoreObject::ptr)(gmID, frame, iVar9, iVar6); break; } } } } - iVar11 = DAT_BuildingDefinedData::instance + frame = DAT_BuildingDefinedData::instance .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]; int barXOffset = 0; int barYOffset = 0; - if (iVar11 == 0) { + if (frame == 0) { uVar8 = DAT_BuildingsState::instance.buildings[tileIndex].widthOrHeight; barXOffset = uVar8 << 5; barYOffset = uVar8 << 4; @@ -1680,8 +1680,8 @@ namespace Rendering { barYOffset = barYOffset + 100; } if ((uint)(iVar6 / 10) < 0xb) { - BVar2 = DAT_BuildingsState::instance.buildings[tileIndex].buildingType; - if ((BVar2 == OpenSHC::Map::Buildings::BT_GRANARY) || (BVar2 == OpenSHC::Map::Buildings::BT_ARMORY)) { + buildingType = DAT_BuildingsState::instance.buildings[tileIndex].buildingType; + if ((buildingType == OpenSHC::Map::Buildings::BT_GRANARY) || (buildingType == OpenSHC::Map::Buildings::BT_ARMORY)) { iVar9 = 0; piVar7 = &DAT_BuildingsState::instance.buildings[tileIndex].tileRef2; do { @@ -1706,16 +1706,16 @@ namespace Rendering { || ((DAT_TileMapState::instance.mapOrientation == 2) && (iVar9 == 0xc)) || ((DAT_TileMapState::instance.mapOrientation == 4) && (iVar9 == 0)) || ((DAT_TileMapState::instance.mapOrientation == 6) && (iVar9 == 3))) { - iVar11 = (yUnk - iVar11) - barYOffset; + frame = (yUnk - frame) - barYOffset; MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, xUnk + 4, iVar11 + -0xc); + OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, xUnk + 4, frame + -0xc); } } else { - iVar11 = (yUnk - iVar11) - barYOffset; + frame = (yUnk - frame) - barYOffset; MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( - OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, xUnk + 4, iVar11 + -0xc); + OpenSHC::DE::SHCDE::GM_FLOATS, iVar6 / 10 + 0x11, xUnk + 4, frame + -0xc); } } } @@ -1726,39 +1726,39 @@ namespace Rendering { if ((int)uVar8 < 0) { uVar8 = (uVar8 - 1 | 0xfffffff8) + 1; } - iVar11 = uVar8 + 0xd3; + frame = uVar8 + 0xd3; maskGmID = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; iVar9 = (yUnk - DAT_BuildingDefinedData::instance .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) - barYOffset; iVar6 = uVar8 + 0xcb; - GVar12 = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; + overlayGmID = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, - DAT_TextureRenderCoreObject::ptr)(GVar12, iVar6, xUnk + -0x23, iVar9 + -0x2a, maskGmID, iVar11, 0); + DAT_TextureRenderCoreObject::ptr)(overlayGmID, iVar6, xUnk + -0x23, iVar9 + -0x2a, maskGmID, frame, 0); } else if ((DAT_BuildingsState::instance.buildings[tileIndex].currentlyNeededEmployeeCount != 0) && (DAT_GameCore::instance.field63_0x108 != 0)) { - iVar11 = DAT_TileMapState::instance.field161_0x5549c0 + 0x128; + frame = DAT_TileMapState::instance.field161_0x5549c0 + 0x128; maskGmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; iVar9 = (yUnk - DAT_BuildingDefinedData::instance .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) - barYOffset; iVar6 = DAT_TileMapState::instance.field161_0x5549c0 + 0x118; - GVar12 = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + overlayGmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, - DAT_TextureRenderCoreObject::ptr)(GVar12, iVar6, xUnk + -0x23, iVar9 + -0x2a, maskGmID, iVar11, 0); + DAT_TextureRenderCoreObject::ptr)(overlayGmID, iVar6, xUnk + -0x23, iVar9 + -0x2a, maskGmID, frame, 0); } } sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field68_0xc2; if (sVar1 == 1) { - iVar11 = DAT_TileMapState::instance.field161_0x5549c0 + 0x10; + frame = DAT_TileMapState::instance.field161_0x5549c0 + 0x10; iVar6 = DAT_TileMapState::instance.field161_0x5549c0; } else { if (sVar1 != 2) { return; } - iVar11 = DAT_TileMapState::instance.field161_0x5549c0 + 0x84; + frame = DAT_TileMapState::instance.field161_0x5549c0 + 0x84; iVar6 = DAT_TileMapState::instance.field161_0x5549c0 + 0x74; } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, @@ -1768,7 +1768,7 @@ namespace Rendering { .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) - barXOffset) + -0x2a, - OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar11, 0); + OpenSHC::IO::Graphics::GID_FLOATS_NEW, frame, 0); DAT_BuildingsState::instance.buildings[tileIndex].field68_0xc2 = 0; } From 74c1b693cd3deaf36df28d0e6a62bd44387ef32c Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 23:04:17 +0200 Subject: [PATCH 70/77] reimplement: SHC_3BB0A8C1_0x004E8CF0 31.88% Style pass, reg alloc differs --- .../ViewportRenderState/renderMap.cpp | 808 +++++++++--------- 1 file changed, 404 insertions(+), 404 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp index d289f309b..b126d0da3 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp @@ -111,7 +111,7 @@ namespace Rendering { int bVar13; int bVar14; byte bVar15; - int iVar16; + int layerTileIndex; short* psVar17; int iVar18; byte bVar19; @@ -130,9 +130,9 @@ namespace Rendering { short sVar30; int iVar31; uint uVar32; - int local_60; + int unitID; int local_5c; - uint local_58; + uint entityID; uint local_54; int _vpWidthPlus1_1; int local_48; @@ -232,7 +232,7 @@ namespace Rendering { _yOffset_01 = (int)(this->viewportState.viewportY + iVar31 + (this->viewportState.viewportY + iVar31 >> 0x1f & 0xfU)) >> 4; - iVar16 = ((int)(this->viewportState.viewportX + (this->viewportState.viewportX >> 0x1f & 0x1fU)) >> 5) + layerTileIndex = ((int)(this->viewportState.viewportX + (this->viewportState.viewportX >> 0x1f & 0x1fU)) >> 5) + _visualTileOffset; /* *** @@ -242,7 +242,7 @@ namespace Rendering { *** */ - iVar2 = iVar16 + -2 + _yOffset_01 * 401; + iVar2 = layerTileIndex + -2 + _yOffset_01 * 401; MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::resetBatchedRender, this)(); if (DAT_TileMapState::instance.mapOrientation == 6) { iVar26 = -this->viewportState.someYOffset; @@ -259,21 +259,21 @@ namespace Rendering { } } this->viewportState.tileCenterX = iVar23 - + (this->screenPointToTileNumber[_yOffset_01 * 0x191 + iVar16 + -8] + + (this->screenPointToTileNumber[_yOffset_01 * 0x191 + layerTileIndex + -8] - this ->translationMatrix[this->tileTranslationMatrix_YComponent[this - ->screenPointToTileNumber[_yOffset_01 * 0x191 + iVar16 + -8]]] + ->screenPointToTileNumber[_yOffset_01 * 0x191 + layerTileIndex + -8]]] .addXgetTile); this->viewportState.tileCenterY = iVar26 - + this->tileTranslationMatrix_YComponent[this->screenPointToTileNumber[_yOffset_01 * 0x191 + iVar16 + -8]]; + + this->tileTranslationMatrix_YComponent[this->screenPointToTileNumber[_yOffset_01 * 0x191 + layerTileIndex + -8]]; DAT_TextureRenderCoreObject::instance.isZoom2 = this->viewportState.isZoomedOutUnk; if (this->viewportState.isZoomedOutUnk == 0) { - iVar16 = DAT_WindowAndDirectDraw::instance.resolutionY + 0x18; + layerTileIndex = DAT_WindowAndDirectDraw::instance.resolutionY + 0x18; } else { - iVar16 = DAT_WindowAndDirectDraw::instance.resolutionY * 2 + 0x20; + layerTileIndex = DAT_WindowAndDirectDraw::instance.resolutionY * 2 + 0x20; } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::setMapSurfaceHeightRange, - DAT_TextureRenderCoreObject::ptr)(iVar31, iVar16); + DAT_TextureRenderCoreObject::ptr)(iVar31, layerTileIndex); this->viewportState.ptrColor = (DAT_WindowAndDirectDraw::instance.surfacePointer_mapGame + this->viewportState.currentCameraOffsetX + DAT_MouseState::instance.screenSpaceX + (this->viewportState.currentCameraOffsetY + DAT_MouseState::instance.screenSpaceY) * 0xfd8); @@ -317,23 +317,23 @@ namespace Rendering { _vpWidthPlus1 = _viewportHeight; } for (; iVar31 < _vpWidthPlus1; iVar31 = iVar31 + 1) { - iVar16 = this->screenPointToTileNumber[iVar31 + iVar2 + -8]; - DAT_00ed3148::instance = DAT_TileMapState::instance.LogicLayer[iVar16]; + layerTileIndex = this->screenPointToTileNumber[iVar31 + iVar2 + -8]; + DAT_00ed3148::instance = DAT_TileMapState::instance.LogicLayer[layerTileIndex]; if ((DAT_00ed3148::instance & 0x30) == 0) { /* draw every tile */ - DAT_GmImageAddressToBeRendered::instance = (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + DAT_GmImageAddressToBeRendered::instance = (uint)DAT_TileMapState::instance.GfxLayer[layerTileIndex]; if ((iVar31 < 2) || (bVar13 = 1, _vpWidthPlus1 + -2 <= iVar31)) { bVar13 = 0; } if (this->DAT_MapEditorDisplayLayer != 0) { if (this->DAT_MapEditorDisplayLayer == 1) { _displayLayerLogicalValue - = (uint)(short)DAT_TileMapState::instance.PathConnectionLayer[iVar16]; + = (uint)(short)DAT_TileMapState::instance.PathConnectionLayer[layerTileIndex]; } else if (this->DAT_MapEditorDisplayLayer == 2) { - _displayLayerLogicalValue = (uint)(char)DAT_TileMapState::instance.PathLinkageLayer[iVar16]; + _displayLayerLogicalValue = (uint)(char)DAT_TileMapState::instance.PathLinkageLayer[layerTileIndex]; } if (_displayLayerLogicalValue != 0) { if (this->DAT_MapEditorDisplayLayer == 2) { @@ -368,152 +368,152 @@ namespace Rendering { } } _yOffset_01 = GMTotalPicturesProcessed::instance[0x9d]; - local_58 = (uint)DAT_TileMapState::instance.EntityLayer[iVar16]; - iVar23 = (int)DAT_TileMapState::instance.OrganismLayer[iVar16]; + entityID = (uint)DAT_TileMapState::instance.EntityLayer[layerTileIndex]; + iVar23 = (int)DAT_TileMapState::instance.OrganismLayer[layerTileIndex]; local_2c = 0; DAT_00ed3154::instance = 0; if ((DAT_00ed3148::instance & 0xa0108001) == 0) { LAB_004e97e2: - uVar32 = (uint)DAT_TileMapState::instance.HeightLayer[iVar16]; + uVar32 = (uint)DAT_TileMapState::instance.HeightLayer[layerTileIndex]; if ((DAT_00ed3148::instance & 0x200) != 0 - && (DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x3c0) != 0) { + && (DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x3c0) != 0) { uVar32 = uVar32 - 8; } DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance.heightBasedScreenYOffset[uVar32]; - if ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) == 0 + if ((DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x20) == 0 || DAT_TileMapState::instance.field93_0x5548c8 != 0) { DAT_00ed3154::instance = 0; } else { DAT_00ed3154::instance = 0x5a; } - DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[iVar16]; + DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[layerTileIndex]; } else if ((DAT_00ed3148::instance & 1) == 0) { if ((DAT_00ed3148::instance & 0x100000) == 0) { if (DAT_00ed3148::instance != 0xa0008000) goto LAB_004e97e2; DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance - .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar16]]; - DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[iVar16]; - bVar15 = (byte)DAT_TileMapState::instance.RandomLayer[iVar16]; + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[layerTileIndex]]; + DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[layerTileIndex]; + bVar15 = (byte)DAT_TileMapState::instance.RandomLayer[layerTileIndex]; bVar19 = bVar15 & 7; if (this->field55_0x18b764 != 0) { - DAT_TileMapState::instance.WallGFXLayer[iVar16] - = DAT_TileMapState::instance.WallGFXLayer[iVar16] + 1; + DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] + = DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] + 1; } - DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16]; + DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[layerTileIndex]; if ((bVar15 & 7) == 0) { if (511 < DAT_00ed314c::instance) { - DAT_TileMapState::instance.WallGFXLayer[iVar16] = 0; + DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] = 0; DAT_00ed314c::instance = 0; } DAT_GmImageAddressToBeRendered::instance = (int)(char) DAT_MapRenderDefinedData::instance.field615_0x724[DAT_00ed314c::instance] - + (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + + (uint)DAT_TileMapState::instance.GfxLayer[layerTileIndex]; } else { if (bVar19 == 1) { if (0x1fe < DAT_00ed314c::instance) { - DAT_TileMapState::instance.WallGFXLayer[iVar16] = 0; + DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] = 0; DAT_00ed314c::instance = 0; } bVar15 = DAT_MapRenderDefinedData::instance.field616_0x924[DAT_00ed314c::instance]; } else { if ((bVar19 != 4) && (bVar19 != 5)) { if (0x7e < DAT_00ed314c::instance) { - DAT_TileMapState::instance.WallGFXLayer[iVar16] = 0; + DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] = 0; DAT_00ed314c::instance = 0; } DAT_GmImageAddressToBeRendered::instance = (int)(char)DAT_MapRenderDefinedData::instance .field617_0xb24[DAT_00ed314c::instance] - + (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + + (uint)DAT_TileMapState::instance.GfxLayer[layerTileIndex]; goto LAB_004e9845; } if (0xfe < DAT_00ed314c::instance) { - DAT_TileMapState::instance.WallGFXLayer[iVar16] = 0; + DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] = 0; DAT_00ed314c::instance = 0; } bVar15 = DAT_MapRenderDefinedData::instance.field617_0xb24[DAT_00ed314c::instance]; } DAT_GmImageAddressToBeRendered::instance - = (int)(char)bVar15 + (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + = (int)(char)bVar15 + (uint)DAT_TileMapState::instance.GfxLayer[layerTileIndex]; } } else { - DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[iVar16]; + DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[layerTileIndex]; DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance - .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar16]]; - bVar15 = DAT_TileMapState::instance.Logic2Layer[iVar16]; + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[layerTileIndex]]; + bVar15 = DAT_TileMapState::instance.Logic2Layer[layerTileIndex]; if ((bVar15 & 200) == 0) { if ((bVar15 & 7) == 0) { if ((bVar15 & 0x10) == 0) { if ((bVar15 & 0x20) != 0) { - bVar15 = (byte)DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; + bVar15 = (byte)DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex]; DAT_00ed314c::instance - = (uint)(DAT_TileMapState::instance.WallGFXLayer[iVar16] >> 10) + = (uint)(DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] >> 10) + this->unknownCounterUntil_0x10 / 2; uVar32 = DAT_00ed314c::instance & 0x80000007; if ((int)uVar32 < 0) { uVar32 = (uVar32 - 1 | 0xfffffff8) + 1; } DAT_GmImageAddressToBeRendered::instance - = uVar32 + DAT_TileMapState::instance.GfxLayer[iVar16]; + = uVar32 + DAT_TileMapState::instance.GfxLayer[layerTileIndex]; goto LAB_004e96a7; } } else { DAT_00ed3154::instance - = -(uint)((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) != 0) + = -(uint)((DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x20) != 0) & 0x5a; - DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16] + DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] + this->unknownCounterUntil_0x10; uVar32 = DAT_00ed314c::instance & 0x8000000f; if ((int)uVar32 < 0) { uVar32 = (uVar32 - 1 | 0xfffffff0) + 1; } DAT_GmImageAddressToBeRendered::instance - = uVar32 + DAT_TileMapState::instance.GfxLayer[iVar16]; + = uVar32 + DAT_TileMapState::instance.GfxLayer[layerTileIndex]; } } else { - bVar15 = (byte)DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; - DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16] + bVar15 = (byte)DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex]; + DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] + this->unknownCounterUntil_0x10 / 2; uVar32 = DAT_00ed314c::instance & 0x80000007; if ((int)uVar32 < 0) { uVar32 = (uVar32 - 1 | 0xfffffff8) + 1; } DAT_GmImageAddressToBeRendered::instance - = uVar32 + DAT_TileMapState::instance.GfxLayer[iVar16]; + = uVar32 + DAT_TileMapState::instance.GfxLayer[layerTileIndex]; LAB_004e96a7: DAT_00ed3154::instance = -(uint)((bVar15 & 0x20) != 0) & 0x5a; } } else { DAT_00ed3154::instance - = -(uint)((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) != 0) & 0x5a; - DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16] + = -(uint)((DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x20) != 0) & 0x5a; + DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] + this->unknownCounterUntil_0x10; uVar32 = DAT_00ed314c::instance & 0x8000000f; if ((int)uVar32 < 0) { uVar32 = (uVar32 - 1 | 0xfffffff0) + 1; } DAT_GmImageAddressToBeRendered::instance - = uVar32 + DAT_TileMapState::instance.GfxLayer[iVar16]; + = uVar32 + DAT_TileMapState::instance.GfxLayer[layerTileIndex]; } MACRO_CALL_MEMBER( OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(7); _yOffset_01 = GMTotalPicturesProcessed::instance[0x9d]; } } else { - uVar32 = (uint)(short)DAT_TileMapState::instance.RandomLayer[iVar16]; + uVar32 = (uint)(short)DAT_TileMapState::instance.RandomLayer[layerTileIndex]; INT_00ed315c::instance = uVar32 & 0x7f; DAT_00ed314c::instance = uVar32 & 0xf; DAT_RenderMap_YOffset::instance = 0; DAT_00ed3170::instance = 8; - if ((DAT_TileMapState::instance.Logic2Layer[iVar16] & 8) == 0) { - uVar10 = DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; + if ((DAT_TileMapState::instance.Logic2Layer[layerTileIndex] & 8) == 0) { + uVar10 = DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex]; if ((char)uVar10 < '\0') { DAT_GmImageAddressToBeRendered::instance - = (uint)DAT_TileMapState::instance.GfxLayer[iVar16] + = (uint)DAT_TileMapState::instance.GfxLayer[layerTileIndex] + DAT_MapRenderDefinedData::instance.field205_0x4dc [(int)(this->unknownCounterUntil_0x24 + DAT_00ed314c::instance / 2) % 0xc]; } else if ((uVar10 & 0x40) == 0) { @@ -523,19 +523,19 @@ namespace Rendering { piVar21 = this->landscapeSeaWhiteCapsAnimationFrames; _yOffset_01 = 9; do { - if (iVar16 == piVar21[-60]) { + if (layerTileIndex == piVar21[-60]) { local_2c = *piVar21 + 1 + (uVar32 & 3) * 8; } - if (iVar16 == piVar21[-0x3b]) { + if (layerTileIndex == piVar21[-0x3b]) { local_2c = piVar21[1] + 1 + (uVar32 & 3) * 8; } - if (iVar16 == piVar21[-0x3a]) { + if (layerTileIndex == piVar21[-0x3a]) { local_2c = piVar21[2] + 1 + (uVar32 & 3) * 8; } - if (iVar16 == piVar21[-0x39]) { + if (layerTileIndex == piVar21[-0x39]) { local_2c = piVar21[3] + 1 + (uVar32 & 3) * 8; } - if (iVar16 == piVar21[-0x38]) { + if (layerTileIndex == piVar21[-0x38]) { local_2c = piVar21[4] + 1 + (uVar32 & 3) * 8; } piVar21 = piVar21 + 5; @@ -544,13 +544,13 @@ namespace Rendering { } } else { DAT_GmImageAddressToBeRendered::instance - = (uint)DAT_TileMapState::instance.GfxLayer[iVar16] + = (uint)DAT_TileMapState::instance.GfxLayer[layerTileIndex] + DAT_MapRenderDefinedData::instance .field614_0x6a4[this->unknownCounterUntil_0x20] * 0x22; } } else { - uVar32 = (uint)DAT_TileMapState::instance.GfxLayer[iVar16]; + uVar32 = (uint)DAT_TileMapState::instance.GfxLayer[layerTileIndex]; if (uVar32 == GMTotalPicturesProcessed::instance[0xa6] + 0x5dcU) { uVar29 = this->unknownCounterUntil_0x24 + INT_00ed315c::instance & 0x8000001f; if ((int)uVar29 < 0) { @@ -593,31 +593,31 @@ namespace Rendering { } } else { DAT_00ed3154::instance - = -(uint)((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x20) != 0) & 0x5a; + = -(uint)((DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x20) != 0) & 0x5a; DAT_00ed314c::instance = this->unknownCounterUntil_0x10 + DAT_00ed314c::instance; if (0xf < (int)DAT_00ed314c::instance) { DAT_00ed314c::instance = DAT_00ed314c::instance - 0x10; } DAT_GmImageAddressToBeRendered::instance - = DAT_TileMapState::instance.GfxLayer[iVar16] + DAT_00ed314c::instance; + = DAT_TileMapState::instance.GfxLayer[layerTileIndex] + DAT_00ed314c::instance; } MACRO_CALL_MEMBER( OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(2); _yOffset_01 = GMTotalPicturesProcessed::instance[0x9d]; } LAB_004e9845: - local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[layerTileIndex]; if (_flatView != 0) { DAT_RenderMap_YOffset::instance = 8; if (this->DAT_MapEditorDisplayLayer == 0) { - uVar32 = (uint)(short)DAT_TileMapState::instance.RandomLayer[iVar16]; + uVar32 = (uint)(short)DAT_TileMapState::instance.RandomLayer[layerTileIndex]; DAT_00ed314c::instance = uVar32 & 0xf; DAT_00ed3170::instance = 0; DAT_00ed3154::instance = 0; if (local_54 == 0 || (DAT_00ed3148::instance & 0x40000000) != 0) { if ((DAT_00ed3148::instance & 0x100) == 0) { if ((DAT_00ed3148::instance & 0x80) != 0) { - _yOffset_01 = (int)DAT_TileMapState::instance.OrganismLayer[iVar16]; + _yOffset_01 = (int)DAT_TileMapState::instance.OrganismLayer[layerTileIndex]; if (_yOffset_01 < 2000) { _yOffset_01 = MACRO_CALL_MEMBER( OpenSHC::Map::LandscapeState_Func::getRandomRockImageOffset, @@ -642,14 +642,14 @@ namespace Rendering { } } else if ((DAT_00ed3148::instance & 0x800) == 0) { if ((DAT_00ed3148::instance & 0x200) == 0) { - if (DAT_TileMapState::instance.DamageLayer[iVar16] != 0) { + if (DAT_TileMapState::instance.DamageLayer[layerTileIndex] != 0) { DAT_00ed3148::instance = DAT_00ed3148::instance & 1; DAT_GmImageAddressToBeRendered::instance = (uVar32 & 1) + 0x2c + _yOffset_01; } } else { DAT_00ed3148::instance = DAT_00ed3148::instance & 1; - if (DAT_TileMapState::instance.DamageLayer[iVar16] == 0) { + if (DAT_TileMapState::instance.DamageLayer[layerTileIndex] == 0) { DAT_GmImageAddressToBeRendered::instance = (uVar32 & 3) + 0x24 + _yOffset_01; } else { @@ -672,7 +672,7 @@ namespace Rendering { BVar8 = DAT_BuildingsState::instance.buildings[local_54].buildingType; iVar26 = DAT_MapRenderDefinedData::instance.BuildingRenderSomeTypeArray[(short)BVar8]; if (iVar26 == 3) { - uVar32 = (uint)((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 4) != 0); + uVar32 = (uint)((DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 4) != 0); if (BVar8 == OpenSHC::Map::Buildings::BT_WOODCUTTERSHUT) { DAT_GmImageAddressToBeRendered::instance = _yOffset_01 + 0x18 + uVar32; } else if (BVar8 == OpenSHC::Map::Buildings::BT_HUNTERSHUT) { @@ -692,7 +692,7 @@ namespace Rendering { DAT_00ed3154::instance = 0; } } - DAT_RenderMap_ImageID::instance = (uint)DAT_TileMapState::instance.ConstructionGFXLayer[iVar16]; + DAT_RenderMap_ImageID::instance = (uint)DAT_TileMapState::instance.ConstructionGFXLayer[layerTileIndex]; bVar12 = 0; bVar14 = 0; if (DAT_RenderMap_ImageID::instance == 0) { @@ -700,7 +700,7 @@ namespace Rendering { && (DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY || (_yOffset_01 = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, - DAT_TileMapState::ptr)(iVar16), + DAT_TileMapState::ptr)(layerTileIndex), DAT_GameState::instance.mapAndTime .playerTeams[DAT_TileMapState::instance.moats[_yOffset_01].owner] == DAT_GameState::instance.mapAndTime @@ -709,31 +709,31 @@ namespace Rendering { goto LAB_004e9b3c; } } else if (DAT_TileMapState::instance.buildingPlacementFail == FALSE - || (DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x8000) != 0) { + || (DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x8000) != 0) { DAT_GmImageAddressToBeRendered::instance = DAT_RenderMap_ImageID::instance; if ((DAT_00ed3148::instance & 0x100) != 0 && _flatView == 0) { DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance - .heightBasedScreenYOffset[DAT_TileMapState::instance.DefaultHeightLayer[iVar16]]; + .heightBasedScreenYOffset[DAT_TileMapState::instance.DefaultHeightLayer[layerTileIndex]]; } } else { LAB_004e9b3c: bVar12 = 1; bVar14 = 1; } - local_60 = (int)(short)DAT_TileMapState::instance.UnitLayer[iVar16]; - if (local_60 != 0 && local_60 == DAT_UnitsState::instance.lastSelectedUnitID + unitID = (int)(short)DAT_TileMapState::instance.UnitLayer[layerTileIndex]; + if (unitID != 0 && unitID == DAT_UnitsState::instance.lastSelectedUnitID && DAT_MenuModalComposition1::instance.activeModalDialogID == OpenSHC::UI::Enums::MMT_DEBUG_DATA_UNIT_DATA) { DAT_GmImageAddressToBeRendered::instance - = ((byte)DAT_UnitsState::instance.units[local_60].moveDelay & 0x3f) + = ((byte)DAT_UnitsState::instance.units[unitID].moveDelay & 0x3f) + GMTotalPicturesProcessed::instance[0x26]; } if ((DAT_00ed3148::instance & 8) != 0 - && (DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x2000) == 0 && _flatView == 0) { + && (DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x2000) == 0 && _flatView == 0) { DAT_RenderMap_YOffset::instance = DAT_TileMapState::instance - .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[iVar16] + 4]; + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[layerTileIndex] + 4]; } if (local_54 != 0) { uVar9 = *this->viewportState.ptrColor; @@ -791,15 +791,15 @@ namespace Rendering { } } if ((DAT_00ed3148::instance & 0x201) == 0 && local_54 == 0) { - uVar10 = DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; + uVar10 = DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex]; if ((uVar10 & 0x3c0) != 0 && (DAT_RenderMap_ImageID::instance == 0 || (((DAT_00ed3148::instance & 0x4000) != 0 && (DAT_TileMapState::instance.field159_0x5549b8 != 0)))) && (DAT_00ed3148::instance & 0x30) == 0 && _flatView == 0) { - uVar32 = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16]; + uVar32 = (uint)DAT_TileMapState::instance.WallGFXLayer[layerTileIndex]; DAT_GmImageAddressToBeRendered::instance - = (uint)DAT_TileMapState::instance.AlphaGFXLayer[iVar16]; + = (uint)DAT_TileMapState::instance.AlphaGFXLayer[layerTileIndex]; iVar26 = uVar32 - DAT_TileMapState::instance.heightBasedScreenYOffset[uVar32]; _yOffset_01 = DAT_RenderMap_DrawSomeX::instance; if ((uVar10 & 0x40) == 0) { @@ -848,12 +848,12 @@ namespace Rendering { } LAB_004e9e36: _yOffset_01 = DAT_RenderMap_YOffset::instance; - uVar32 = (uint)DAT_TileMapState::instance.FloatingLayer[iVar16]; + uVar32 = (uint)DAT_TileMapState::instance.FloatingLayer[layerTileIndex]; if (uVar32 != 0) { if ((DAT_TileMapState::instance.refreshRelatedOne != 0) && (_flatView == 0)) { - if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x10000000U) == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x100U) != 0) { - local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + if ((DAT_TileMapState::instance.LogicLayer[layerTileIndex] & 0x10000000U) == 0) { + if ((DAT_TileMapState::instance.LogicLayer[layerTileIndex] & 0x100U) != 0) { + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[layerTileIndex]; if (local_54 == 0) { _yOffset_01 = DAT_RenderMap_YOffset::instance + 4; } else if (DAT_BuildingsState::instance.buildings[local_54].buildingType @@ -864,7 +864,7 @@ namespace Rendering { } } } else { - local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[layerTileIndex]; iVar26 = MACRO_CALL_MEMBER( OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, DAT_BuildingsState::ptr)(local_54); @@ -874,7 +874,7 @@ namespace Rendering { do { uVar29 = this->floatersArray[uVar32].variation; if ((uVar29 & 2) != 0) { - if ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x10) == 0) { + if ((DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x10) == 0) { if ((uVar29 & 4) != 0) { DAT_RenderedUnitOwner::instance = ~-(uint)((uVar29 & 0x10) != 0) & DAT_GameSynchronyState::instance.currentPlayerSlotID; @@ -930,22 +930,22 @@ namespace Rendering { } while (uVar32 != 0); } _yOffset_01 = 0; - if (local_58 != 0) { + if (entityID != 0) { while ((iVar26 = DAT_RenderMap_YOffset::instance, _yOffset_01 = _yOffset_01 + 1, - _yOffset_01 < 10 && (DAT_EntityState::instance.entityArray[local_58].logicalState != 0))) { - if (DAT_EntityState::instance.entityArray[local_58].graphicType2 != 0 - && ((EVar3 = DAT_EntityState::instance.entityArray[local_58].entityType, + _yOffset_01 < 10 && (DAT_EntityState::instance.entityArray[entityID].logicalState != 0))) { + if (DAT_EntityState::instance.entityArray[entityID].graphicType2 != 0 + && ((EVar3 = DAT_EntityState::instance.entityArray[entityID].entityType, EVar3 == OpenSHC::Map::Entities::EntityTypeInt__ET_CROW || (EVar3 == OpenSHC::Map::Entities::ET_SEAGULLUnk)) || (EVar3 == OpenSHC::Map::Entities::ET_COW_FLYING)) - && DAT_EntityState::instance.entityArray[local_58].imageID != 0) { + && DAT_EntityState::instance.entityArray[entityID].imageID != 0) { DAT_RenderedUnitOwner::instance - = DAT_EntityState::instance.entityArray[local_58].colorUnk; + = DAT_EntityState::instance.entityArray[entityID].colorUnk; DAT_CurrentlyRenderedSpriteID::instance - = (GmIDInt)DAT_EntityState::instance.entityArray[local_58].gmID; - if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x10000000U) == 0) { - if ((DAT_TileMapState::instance.LogicLayer[iVar16] & 0x100U) != 0) { - local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + = (GmIDInt)DAT_EntityState::instance.entityArray[entityID].gmID; + if ((DAT_TileMapState::instance.LogicLayer[layerTileIndex] & 0x10000000U) == 0) { + if ((DAT_TileMapState::instance.LogicLayer[layerTileIndex] & 0x100U) != 0) { + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[layerTileIndex]; if (local_54 == 0) { iVar26 = DAT_RenderMap_YOffset::instance + 4; } else { @@ -953,7 +953,7 @@ namespace Rendering { } } } else { - local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[iVar16]; + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[layerTileIndex]; iVar18 = MACRO_CALL_MEMBER( OpenSHC::Map::Buildings::BuildingsState_Func::getBuildingHeightForBuildingID, DAT_BuildingsState::ptr)(local_54); @@ -962,133 +962,133 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, this)(0xffffffff, - ((int)DAT_EntityState::instance.entityArray[local_58].x1 - - (int)DAT_EntityState::instance.entityArray[local_58].originX) + ((int)DAT_EntityState::instance.entityArray[entityID].x1 + - (int)DAT_EntityState::instance.entityArray[entityID].originX) + DAT_RenderMap_DrawSomeX::instance, - (((int)DAT_EntityState::instance.entityArray[local_58].y1 - - (int)DAT_EntityState::instance.entityArray[local_58].originY) + (((int)DAT_EntityState::instance.entityArray[entityID].y1 + - (int)DAT_EntityState::instance.entityArray[entityID].originY) - iVar26) + DAT_RenderMap_DrawSomeY::instance, - (undefined4)((int)(DAT_EntityState::instance.entityArray[local_58].imageID)), 0x14, + (undefined4)((int)(DAT_EntityState::instance.entityArray[entityID].imageID)), 0x14, 0, 0); } - iVar26 = (int)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; - if (local_58 == iVar26 || DAT_GameSynchronyState::instance.syncStatus != 0 - || (local_58 = iVar26, iVar26 == 0)) + iVar26 = (int)DAT_EntityState::instance.entityArray[entityID].nextEntityOnThisTileByID; + if (entityID == iVar26 || DAT_GameSynchronyState::instance.syncStatus != 0 + || (entityID = iVar26, iVar26 == 0)) break; } } - local_58 = (uint)DAT_TileMapState::instance.EntityLayer[iVar16]; + entityID = (uint)DAT_TileMapState::instance.EntityLayer[layerTileIndex]; if (local_54 != 0 && DAT_BuildingsState::instance.buildings[local_54].buildingType == OpenSHC::Map::Buildings::BT_DRAWBRIDGE && _flatView == 0 && DAT_TileMapState::instance.refreshRelatedOne != 0 - && (DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0xc) == 4) { + && (DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0xc) == 4) { MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding2, this)( local_54, (int)(DAT_RenderMap_DrawSomeX::instance), - (int)(DAT_00ed3154::instance + DAT_RenderMap_DrawSomeY::instance), iVar16); + (int)(DAT_00ed3154::instance + DAT_RenderMap_DrawSomeY::instance), layerTileIndex); } /* ------ BEGIN RENDER UNITS ------ */ - if ((local_60 != 0) + if ((unitID != 0) && (MACRO_CALL_MEMBER( OpenSHC::Map::Units::UnitsState_Func::triggerDesyncIfTileUnitLinkageInvalid, - DAT_UnitsState::ptr)(iVar16), - 0 < local_60)) { + DAT_UnitsState::ptr)(layerTileIndex), + 0 < unitID)) { while (_yOffset_01 = DAT_RenderMap_DrawSomeX::instance, - DAT_UnitsState::instance.units[local_60].logicalState + DAT_UnitsState::instance.units[unitID].logicalState != OpenSHC::Map::Units::ULS_INVISIBLE) { DAT_CurrentlyRenderedSpriteID::instance - = (GmIDInt)DAT_UnitsState::instance.units[local_60].spriteID; + = (GmIDInt)DAT_UnitsState::instance.units[unitID].spriteID; local_2c = 0; - if ((DAT_UnitsState::instance.units[local_60].unitType + if ((DAT_UnitsState::instance.units[unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) && (DAT_GameState::instance.mapAndTime - .playerTeams[DAT_UnitsState::instance.units[local_60].owner] + .playerTeams[DAT_UnitsState::instance.units[unitID].owner] != DAT_GameState::instance.mapAndTime .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) { - iVar26 = DAT_UnitsState::instance.units[local_60].assassinsMicroDistanceToEnemyUnk; + iVar26 = DAT_UnitsState::instance.units[unitID].assassinsMicroDistanceToEnemyUnk; if (iVar26 <= 160 - || (UVar4 = DAT_UnitsState::instance.units[local_60].state.generic, + || (UVar4 = DAT_UnitsState::instance.units[unitID].state.generic, UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK || (UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK_WALL))) { if (120 < iVar26 && (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY - || (DAT_UnitsState::instance.units[local_60].idleCounterUnk < 0x961))) { + || (DAT_UnitsState::instance.units[unitID].idleCounterUnk < 0x961))) { local_2c = 0x10; } goto LAB_004ea2c6; } if ((DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY) - && (0x960 < DAT_UnitsState::instance.units[local_60].idleCounterUnk)) + && (0x960 < DAT_UnitsState::instance.units[unitID].idleCounterUnk)) goto LAB_004ea2c6; } else { LAB_004ea2c6: - if (DAT_UnitsState::instance.units[local_60].field40_0x5a == 0) { + if (DAT_UnitsState::instance.units[unitID].field40_0x5a == 0) { DAT_RenderedUnitOwner::instance - = DAT_UnitsState::instance.units[local_60].calculatedOwnerPlayerIndex; + = DAT_UnitsState::instance.units[unitID].calculatedOwnerPlayerIndex; } else { DAT_RenderedUnitOwner::instance = 9; } iVar18 = GMTotalPicturesProcessed::instance[DAT_CurrentlyRenderedSpriteID::instance]; - iVar27 = DAT_UnitsState::instance.units[local_60].gfxNumber; + iVar27 = DAT_UnitsState::instance.units[unitID].gfxNumber; iVar26 = iVar27 + -1 + iVar18; iVar25 = DAT_RenderMap_YOffset::instance; if (DAT_TileMapState::instance.refreshRelatedOne != 0) { if (_flatView != 0) { - iVar25 = ((int)(char)DAT_UnitsState::instance.units[local_60].negativeHeight - - (int)DAT_UnitsState::instance.units[local_60].buildingHeight) + iVar25 = ((int)(char)DAT_UnitsState::instance.units[unitID].negativeHeight + - (int)DAT_UnitsState::instance.units[unitID].buildingHeight) + DAT_RenderMap_YOffset::instance; } else { - iVar25 = (uint)(byte)DAT_UnitsState::instance.units[local_60].padding_0x83[0] - + (int)DAT_UnitsState::instance.units[local_60].terrainOrClimbHeight; + iVar25 = (uint)(byte)DAT_UnitsState::instance.units[unitID].padding_0x83[0] + + (int)DAT_UnitsState::instance.units[unitID].terrainOrClimbHeight; } } - sVar30 = DAT_UnitsState::instance.units[local_60].orientationRelatedPositionX; - sVar20 = DAT_UnitsState::instance.units[local_60].orientationRelatedPositionY; - DAT_UnitsState::instance.units[local_60].field308_0x41c + sVar30 = DAT_UnitsState::instance.units[unitID].orientationRelatedPositionX; + sVar20 = DAT_UnitsState::instance.units[unitID].orientationRelatedPositionY; + DAT_UnitsState::instance.units[unitID].field308_0x41c = sVar30 + -6 + DAT_RenderMap_DrawSomeX::instance; - sVar30 = ((short)DAT_UnitsState::instance.units[local_60].field41_0x5c - - DAT_UnitsState::instance.units[local_60].field22_0x2a) + sVar30 = ((short)DAT_UnitsState::instance.units[unitID].field41_0x5c + - DAT_UnitsState::instance.units[unitID].field22_0x2a) + (short)_yOffset_01 + sVar30; - bVar15 = DAT_UnitsState::instance.units[local_60].negativeHeight; - DAT_UnitsState::instance.units[local_60].field309_0x420 + bVar15 = DAT_UnitsState::instance.units[unitID].negativeHeight; + DAT_UnitsState::instance.units[unitID].field309_0x420 = (sVar20 - iVar25) + -0xc + DAT_RenderMap_DrawSomeY::instance; - sVar24 = (short)DAT_UnitsState::instance.units[local_60].unknownV; - sVar5 = DAT_UnitsState::instance.units[local_60].field58_0x84; - sVar6 = DAT_UnitsState::instance.units[local_60].buildingHeight; - DAT_UnitsState::instance.units[local_60].drawX = sVar30; + sVar24 = (short)DAT_UnitsState::instance.units[unitID].unknownV; + sVar5 = DAT_UnitsState::instance.units[unitID].field58_0x84; + sVar6 = DAT_UnitsState::instance.units[unitID].buildingHeight; + DAT_UnitsState::instance.units[unitID].drawX = sVar30; sVar20 = (((sVar5 - sVar6) - (short)iVar25) - sVar24) + (short)DAT_RenderMap_DrawSomeY::instance + (short)(char)bVar15 + sVar20; sVar5 = DAT_GMImageHeaders::instance.imh[iVar18 + iVar27 + -1].width; - DAT_UnitsState::instance.units[local_60].drawY = sVar20; - DAT_UnitsState::instance.units[local_60].drawWidth = sVar5; + DAT_UnitsState::instance.units[unitID].drawY = sVar20; + DAT_UnitsState::instance.units[unitID].drawWidth = sVar5; if (bVar15 == 0) { sVar24 = DAT_GMImageHeaders::instance.imh[iVar18 + iVar27 + -1].height; } else { sVar24 = (sVar24 - (char)bVar15) + 8; } - _yOffset_01 = DAT_UnitsState::instance.units[local_60].vanish; - DAT_UnitsState::instance.units[local_60].drawHeight1 = sVar24; + _yOffset_01 = DAT_UnitsState::instance.units[unitID].vanish; + DAT_UnitsState::instance.units[unitID].drawHeight1 = sVar24; if (_yOffset_01 == 0) { - _yOffset_01 = DAT_UnitsState::instance.units[local_60].field43_0x64; + _yOffset_01 = DAT_UnitsState::instance.units[unitID].field43_0x64; if (_yOffset_01 == 1) { LAB_004ea49b: _yOffset_01 = 1; } else if (_yOffset_01 == 2) { _yOffset_01 = 0; } else { - if ((DAT_TileMapState::instance.MiscDisplayLayer[iVar16] & 0x10) == 0 - || DAT_UnitsState::instance.units[local_60].field43_0x64 == -1) { + if ((DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x10) == 0 + || DAT_UnitsState::instance.units[unitID].field43_0x64 == -1) { if ((DAT_00ed3148::instance & 0x400) == 0) { - if ((DAT_UnitsState::instance.units[local_60].unitType + if ((DAT_UnitsState::instance.units[unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) - && (_yOffset_01 = DAT_UnitsState::instance.units[local_60].imageID2, + && (_yOffset_01 = DAT_UnitsState::instance.units[unitID].imageID2, _yOffset_01 != 0)) { - sVar24 = DAT_UnitsState::instance.units[local_60].field59_0x86; + sVar24 = DAT_UnitsState::instance.units[unitID].field59_0x86; if (sVar24 < 0) { local_c = 0; } else { @@ -1099,19 +1099,19 @@ namespace Rendering { renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)((int)sVar30, (int)(( - int)(DAT_UnitsState::instance.units[local_60].field59_0x86 + int)(DAT_UnitsState::instance.units[unitID].field59_0x86 + sVar20)), (int)(sVar5), - (int)(DAT_UnitsState::instance.units[local_60].drawHeight1 + (int)(DAT_UnitsState::instance.units[unitID].drawHeight1 - local_c), (byte*)((int)(( DAT_GMImageOffsets::instance[_yOffset_01 + -1 + iVar18] + (int)DAT_TextureRenderCoreObject::instance .gmProcessedImageData))), (0x10 - iVar27) * 2); - sVar30 = DAT_UnitsState::instance.units[local_60].drawYOffset; + sVar30 = DAT_UnitsState::instance.units[unitID].drawYOffset; if (sVar30 != 0) { - sVar20 = DAT_UnitsState::instance.units[local_60].field59_0x86; + sVar20 = DAT_UnitsState::instance.units[unitID].field59_0x86; if (sVar20 < 0) { _yOffset_01 = 0; } else { @@ -1121,11 +1121,11 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)DAT_UnitsState::instance.units[unitID].drawX, (int)(sVar20 - + DAT_UnitsState::instance.units[local_60].drawY), - (int)(DAT_UnitsState::instance.units[local_60].drawWidth), - DAT_UnitsState::instance.units[local_60].drawHeight1 + + DAT_UnitsState::instance.units[unitID].drawY), + (int)(DAT_UnitsState::instance.units[unitID].drawWidth), + DAT_UnitsState::instance.units[unitID].drawHeight1 - _yOffset_01, (byte*)((int)(( DAT_GMImageOffsets::instance @@ -1139,15 +1139,15 @@ namespace Rendering { } uVar9 = *this->viewportState.ptrColor; *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; - bVar15 = DAT_UnitsState::instance.units[local_60] + bVar15 = DAT_UnitsState::instance.units[unitID] .disappearFadeAlphaCountdown; if (bVar15 == 0) { - if (DAT_UnitsState::instance.units[local_60].graphicSize == 4) { + if (DAT_UnitsState::instance.units[unitID].graphicSize == 4) { MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func:: renderAssassinClimbingOverlay, - this)(local_60); + this)(unitID); } - sVar30 = DAT_UnitsState::instance.units[local_60].field59_0x86; + sVar30 = DAT_UnitsState::instance.units[unitID].field59_0x86; if (sVar30 < 0) { _yOffset_01 = 0; } else { @@ -1156,27 +1156,27 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY), + (int)DAT_UnitsState::instance.units[unitID].drawX, + (int)(sVar30 + DAT_UnitsState::instance.units[unitID].drawY), (int)(( - int)(DAT_UnitsState::instance.units[local_60].drawWidth)), - DAT_UnitsState::instance.units[local_60].drawHeight1 + int)(DAT_UnitsState::instance.units[unitID].drawWidth)), + DAT_UnitsState::instance.units[unitID].drawHeight1 - _yOffset_01, (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance .gmProcessedImageData)))); - sVar30 = DAT_UnitsState::instance.units[local_60].graphicSize; + sVar30 = DAT_UnitsState::instance.units[unitID].graphicSize; if ((sVar30 != 4) && (1 < sVar30)) { DAT_CurrentlyRenderedSpriteID::instance - = (GmIDInt)DAT_UnitsState::instance.units[local_60].gmIDUnk; + = (GmIDInt)DAT_UnitsState::instance.units[unitID].gmIDUnk; DAT_RenderedUnitOwner::instance - = (uint)DAT_UnitsState::instance.units[local_60] + = (uint)DAT_UnitsState::instance.units[unitID] .displayColorPlayerID; _yOffset_01 - = DAT_UnitsState::instance.units[local_60].imageIDUnk; + = DAT_UnitsState::instance.units[unitID].imageIDUnk; if (0 < _yOffset_01) { sVar30 - = DAT_UnitsState::instance.units[local_60].field60_0x88; + = DAT_UnitsState::instance.units[unitID].field60_0x88; if (sVar30 < 0) { iVar26 = 0; } else { @@ -1186,12 +1186,12 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)DAT_UnitsState::instance.units[unitID].drawX, (int)(sVar30 - + DAT_UnitsState::instance.units[local_60].drawY), - (int)(DAT_UnitsState::instance.units[local_60] + + DAT_UnitsState::instance.units[unitID].drawY), + (int)(DAT_UnitsState::instance.units[unitID] .drawWidth), - DAT_UnitsState::instance.units[local_60].drawHeight1 + DAT_UnitsState::instance.units[unitID].drawHeight1 - iVar26, (byte*)(( int)((DAT_GMImageSizes::instance @@ -1203,11 +1203,11 @@ namespace Rendering { .gmProcessedImageData)))); } } - if (2 < DAT_UnitsState::instance.units[local_60].graphicSize) { - _yOffset_01 = DAT_UnitsState::instance.units[local_60].imageID2; + if (2 < DAT_UnitsState::instance.units[unitID].graphicSize) { + _yOffset_01 = DAT_UnitsState::instance.units[unitID].imageID2; if (0 < _yOffset_01) { sVar30 - = DAT_UnitsState::instance.units[local_60].drawYOffset; + = DAT_UnitsState::instance.units[unitID].drawYOffset; if (sVar30 < 0) { iVar26 = 0; } else { @@ -1217,12 +1217,12 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)DAT_UnitsState::instance.units[unitID].drawX, (int)(sVar30 - + DAT_UnitsState::instance.units[local_60].drawY), - (int)(DAT_UnitsState::instance.units[local_60] + + DAT_UnitsState::instance.units[unitID].drawY), + (int)(DAT_UnitsState::instance.units[unitID] .drawWidth), - DAT_UnitsState::instance.units[local_60].drawHeight1 + DAT_UnitsState::instance.units[unitID].drawHeight1 - iVar26, (byte*)(( int)((DAT_GMImageSizes::instance @@ -1235,16 +1235,16 @@ namespace Rendering { } if (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY) { - UVar7 = DAT_UnitsState::instance.units[local_60].unitType; + UVar7 = DAT_UnitsState::instance.units[unitID].unitType; if ((UVar7 == OpenSHC::Map::Units::UT_S_TOWER) - && (DAT_UnitsState::instance.units[local_60].dying + && (DAT_UnitsState::instance.units[unitID].dying == 0)) { _yOffset_01 - = (int)DAT_UnitsState::instance.units[local_60] + = (int)DAT_UnitsState::instance.units[unitID] .drawX; - iVar26 = (int)DAT_UnitsState::instance.units[local_60] + iVar26 = (int)DAT_UnitsState::instance.units[unitID] .drawY; - switch (DAT_UnitsState::instance.units[local_60] + switch (DAT_UnitsState::instance.units[unitID] .facingDirectionMapOrientationCorrected) { case 0: _yOffset_01 = _yOffset_01 + 0x22; @@ -1279,15 +1279,15 @@ namespace Rendering { } } else { if ((UVar7 != OpenSHC::Map::Units::UT_S_BATTERINGRAM) - || (DAT_UnitsState::instance.units[local_60].dying + || (DAT_UnitsState::instance.units[unitID].dying != 0)) goto LAB_004eadfa; _yOffset_01 - = (int)DAT_UnitsState::instance.units[local_60] + = (int)DAT_UnitsState::instance.units[unitID] .drawX; - iVar26 = (int)DAT_UnitsState::instance.units[local_60] + iVar26 = (int)DAT_UnitsState::instance.units[unitID] .drawY; - switch (DAT_UnitsState::instance.units[local_60] + switch (DAT_UnitsState::instance.units[unitID] .facingDirectionMapOrientationCorrected) { case 0: case 1: @@ -1317,10 +1317,10 @@ namespace Rendering { } } DAT_RenderedUnitOwner::instance - = (uint)DAT_UnitsState::instance.units[local_60].owner; + = (uint)DAT_UnitsState::instance.units[unitID].owner; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - uVar32 = DAT_UnitsState::instance.units[local_60].fixedRng + uVar32 = DAT_UnitsState::instance.units[unitID].fixedRng + DAT_GameState::instance.mapAndTime .totalGameTicksUnk & 0x8000003f; @@ -1339,19 +1339,19 @@ namespace Rendering { == COL_MAGENTA::instance.shortValue) { *this->viewportState.ptrColor = uVar9; } else { - this->viewportState.mouseRayUnitID = local_60; + this->viewportState.mouseRayUnitID = unitID; this->viewportState.mouseRayBuildingID = 0; } } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)(DAT_UnitsState::instance.units[local_60].drawY), + (int)DAT_UnitsState::instance.units[unitID].drawX, + (int)(DAT_UnitsState::instance.units[unitID].drawY), (int)(( - int)(DAT_UnitsState::instance.units[local_60].drawWidth)), + int)(DAT_UnitsState::instance.units[unitID].drawWidth)), (int)(( - int)(DAT_UnitsState::instance.units[local_60].drawHeight1)), + int)(DAT_UnitsState::instance.units[unitID].drawHeight1)), (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance .gmProcessedImageData))), @@ -1360,55 +1360,55 @@ namespace Rendering { == COL_MAGENTA::instance.shortValue) { *this->viewportState.ptrColor = uVar9; } else { - this->viewportState.mouseRayUnitID = local_60; + this->viewportState.mouseRayUnitID = unitID; this->viewportState.mouseRayBuildingID = 0; } } - if (DAT_UnitsState::instance.units[local_60].isSelected != 0 - && DAT_UnitsState::instance.units[local_60].usingTeleport == 0 - && DAT_UnitsState::instance.units[local_60] + if (DAT_UnitsState::instance.units[unitID].isSelected != 0 + && DAT_UnitsState::instance.units[unitID].usingTeleport == 0 + && DAT_UnitsState::instance.units[unitID] .disappearFadeAlphaCountdown == 0) { _yOffset_01 - = (DAT_UnitsState::instance.units[local_60].drawWidth + -0x16) + = (DAT_UnitsState::instance.units[unitID].drawWidth + -0x16) / 2; - if (DAT_UnitsState::instance.units[local_60].unitType + if (DAT_UnitsState::instance.units[unitID].unitType == OpenSHC::Map::Units::UT_LORD) { - sVar30 = DAT_UnitsState::instance.units[local_60] + sVar30 = DAT_UnitsState::instance.units[unitID] .maxHealthRatingLord; if (sVar30 == 0) { - iVar26 = DAT_UnitsState::instance.units[local_60] + iVar26 = DAT_UnitsState::instance.units[unitID] .someDrawYOffset + -6 - + (int)DAT_UnitsState::instance.units[local_60].drawY; - iVar27 = DAT_UnitsState::instance.units[local_60].drawX + + (int)DAT_UnitsState::instance.units[unitID].drawY; + iVar27 = DAT_UnitsState::instance.units[unitID].drawX + _yOffset_01; - iVar18 = DAT_UnitsState::instance.units[local_60].healthbar + iVar18 = DAT_UnitsState::instance.units[unitID].healthbar + 0x11; } else { - iVar26 = DAT_UnitsState::instance.units[local_60] + iVar26 = DAT_UnitsState::instance.units[unitID] .someDrawYOffset + -8 - + (int)DAT_UnitsState::instance.units[local_60].drawY; - iVar27 = DAT_UnitsState::instance.units[local_60].drawX + + (int)DAT_UnitsState::instance.units[unitID].drawY; + iVar27 = DAT_UnitsState::instance.units[unitID].drawX + _yOffset_01; - iVar18 = DAT_UnitsState::instance.units[local_60].healthbar + iVar18 = DAT_UnitsState::instance.units[unitID].healthbar + 0xe4 + sVar30 * 0xb; } } else { iVar26 = DAT_GameState::instance .playerDataArray - [DAT_UnitsState::instance.units[local_60].owner] + [DAT_UnitsState::instance.units[unitID].owner] .fearFactorLevel; if (iVar26 == 0) { - iVar26 = DAT_UnitsState::instance.units[local_60] + iVar26 = DAT_UnitsState::instance.units[unitID] .someDrawYOffset + -6 - + (int)DAT_UnitsState::instance.units[local_60].drawY; - iVar27 = DAT_UnitsState::instance.units[local_60].drawX + + (int)DAT_UnitsState::instance.units[unitID].drawY; + iVar27 = DAT_UnitsState::instance.units[unitID].drawX + _yOffset_01; - iVar18 = DAT_UnitsState::instance.units[local_60].healthbar + iVar18 = DAT_UnitsState::instance.units[unitID].healthbar + 0x11; } else { if (iVar26 < 1) { @@ -1416,13 +1416,13 @@ namespace Rendering { } else { iVar18 = iVar26 * 0xb + 0x76; } - iVar26 = DAT_UnitsState::instance.units[local_60] + iVar26 = DAT_UnitsState::instance.units[unitID] .someDrawYOffset + -8 - + (int)DAT_UnitsState::instance.units[local_60].drawY; - iVar27 = DAT_UnitsState::instance.units[local_60].drawX + + (int)DAT_UnitsState::instance.units[unitID].drawY; + iVar27 = DAT_UnitsState::instance.units[unitID].drawX + _yOffset_01; - iVar18 = DAT_UnitsState::instance.units[local_60].healthbar + iVar18 = DAT_UnitsState::instance.units[unitID].healthbar + iVar18; } } @@ -1430,16 +1430,16 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( OpenSHC::DE::SHCDE::GM_FLOATS, iVar18, iVar27, iVar26); - if (DAT_UnitsState::instance.units[local_60].unitType + if (DAT_UnitsState::instance.units[unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN && DAT_GameState::instance.mapAndTime.playerTeams - [DAT_UnitsState::instance.units[local_60].owner] + [DAT_UnitsState::instance.units[unitID].owner] == DAT_GameState::instance.mapAndTime.playerTeams [DAT_GameSynchronyState::instance.currentPlayerSlotID] - && (DAT_UnitsState::instance.units[local_60] + && (DAT_UnitsState::instance.units[unitID] .assassinsMicroDistanceToEnemyUnk < 0xa1 - || ((UVar4 = DAT_UnitsState::instance.units[local_60] + || ((UVar4 = DAT_UnitsState::instance.units[unitID] .state.generic, UVar4 == OpenSHC::Map::Units::States::US_MELEE_ATTACK || (UVar4 @@ -1450,40 +1450,40 @@ namespace Rendering { renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( OpenSHC::IO::Graphics::GID_INTERFACE_ICONS_2, 0x1bf, - DAT_UnitsState::instance.units[local_60].drawX + 2 + DAT_UnitsState::instance.units[unitID].drawX + 2 + _yOffset_01, - (int)(DAT_UnitsState::instance.units[local_60] + (int)(DAT_UnitsState::instance.units[unitID] .someDrawYOffset + -0x1b - + DAT_UnitsState::instance.units[local_60].drawY), + + DAT_UnitsState::instance.units[unitID].drawY), 0x10); } } - if ((local_60 != 0) - && (sVar30 = DAT_UnitsState::instance.units[local_60].field46_0x6e, + if ((unitID != 0) + && (sVar30 = DAT_UnitsState::instance.units[unitID].field46_0x6e, sVar30 != 0)) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)( OpenSHC::IO::Graphics::GID_FLOATS_NEW, (int)(sVar30 + 0xd4), - (int)(DAT_UnitsState::instance.units[local_60].drawX), - (int)(DAT_UnitsState::instance.units[local_60].someDrawYOffset - + -0x36 + DAT_UnitsState::instance.units[local_60].drawY), + (int)(DAT_UnitsState::instance.units[unitID].drawX), + (int)(DAT_UnitsState::instance.units[unitID].someDrawYOffset + + -0x36 + DAT_UnitsState::instance.units[unitID].drawY), OpenSHC::IO::Graphics::GID_FLOATS_NEW, (int)(sVar30 + 0xdc), 0); - DAT_UnitsState::instance.units[local_60].field46_0x6e = 0; + DAT_UnitsState::instance.units[unitID].field46_0x6e = 0; } - sVar30 = DAT_UnitsState::instance.units[local_60].field45_0x6c; + sVar30 = DAT_UnitsState::instance.units[unitID].field45_0x6c; if (sVar30 == 1) { iVar26 = DAT_TileMapState::instance.field161_0x5549c0 + 0x30; - iVar18 = DAT_UnitsState::instance.units[local_60].someDrawYOffset - + -0x46 + (int)DAT_UnitsState::instance.units[local_60].drawY; - _yOffset_01 = DAT_UnitsState::instance.units[local_60].field22_0x2a - + -0x35 + (int)DAT_UnitsState::instance.units[local_60].drawX; + iVar18 = DAT_UnitsState::instance.units[unitID].someDrawYOffset + + -0x46 + (int)DAT_UnitsState::instance.units[unitID].drawY; + _yOffset_01 = DAT_UnitsState::instance.units[unitID].field22_0x2a + + -0x35 + (int)DAT_UnitsState::instance.units[unitID].drawX; iVar27 = DAT_TileMapState::instance.field161_0x5549c0 + 0x20; } else if (sVar30 == 2) { _yOffset_01 = 0; iVar18 = 0; - switch (DAT_UnitsState::instance.units[local_60].unitType) { + switch (DAT_UnitsState::instance.units[unitID].unitType) { case OpenSHC::Map::Units::UT_S_CATAPULT: _yOffset_01 = 0x29; iVar18 = 0x3a; @@ -1511,18 +1511,18 @@ namespace Rendering { _yOffset_01 = 0x13; } iVar26 = DAT_TileMapState::instance.field161_0x5549c0 + 0x84; - iVar18 = (DAT_UnitsState::instance.units[local_60].someDrawYOffset + iVar18 = (DAT_UnitsState::instance.units[unitID].someDrawYOffset - iVar18) - + (int)DAT_UnitsState::instance.units[local_60].drawY; + + (int)DAT_UnitsState::instance.units[unitID].drawY; _yOffset_01 - = DAT_UnitsState::instance.units[local_60].drawX + _yOffset_01; + = DAT_UnitsState::instance.units[unitID].drawX + _yOffset_01; iVar27 = DAT_TileMapState::instance.field161_0x5549c0 + 0x74; } else { if (sVar30 != 3) goto LAB_004eb1be; iVar18 = 0; _yOffset_01 = 0; - switch (DAT_UnitsState::instance.units[local_60].unitType) { + switch (DAT_UnitsState::instance.units[unitID].unitType) { case OpenSHC::Map::Units::UT_S_CATAPULT: _yOffset_01 = 0x29; iVar18 = 0x3a; @@ -1550,11 +1550,11 @@ namespace Rendering { _yOffset_01 = 0x13; } iVar26 = DAT_TileMapState::instance.field161_0x5549c0 + 0xa4; - iVar18 = (DAT_UnitsState::instance.units[local_60].someDrawYOffset + iVar18 = (DAT_UnitsState::instance.units[unitID].someDrawYOffset - iVar18) - + (int)DAT_UnitsState::instance.units[local_60].drawY; + + (int)DAT_UnitsState::instance.units[unitID].drawY; _yOffset_01 - = DAT_UnitsState::instance.units[local_60].drawX + _yOffset_01; + = DAT_UnitsState::instance.units[unitID].drawX + _yOffset_01; iVar27 = DAT_TileMapState::instance.field161_0x5549c0 + 0x94; } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: @@ -1562,20 +1562,20 @@ namespace Rendering { DAT_TextureRenderCoreObject::ptr)( OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar27, _yOffset_01, iVar18, OpenSHC::IO::Graphics::GID_FLOATS_NEW, iVar26, 0); - DAT_UnitsState::instance.units[local_60].field45_0x6c = 0; + DAT_UnitsState::instance.units[unitID].field45_0x6c = 0; goto LAB_004eb1be; } if (DAT_BuildingsState::instance.buildings[local_54].buildingType != OpenSHC::Map::Buildings::BT_TOWER2 - || (sVar24 = DAT_UnitsState::instance.units[local_60] + || (sVar24 = DAT_UnitsState::instance.units[unitID] .facingDirectionMapOrientationCorrected, sVar24 != 2 && (sVar24 != 6))) goto LAB_004ea49b; - if ((DAT_UnitsState::instance.units[local_60].unitType + if ((DAT_UnitsState::instance.units[unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) - && (_yOffset_01 = DAT_UnitsState::instance.units[local_60].imageID2, + && (_yOffset_01 = DAT_UnitsState::instance.units[unitID].imageID2, _yOffset_01 != 0)) { - sVar24 = DAT_UnitsState::instance.units[local_60].field59_0x86; + sVar24 = DAT_UnitsState::instance.units[unitID].field59_0x86; if (sVar24 < 0) { local_14 = 0; } else { @@ -1585,18 +1585,18 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)((int)sVar30, - (int)(DAT_UnitsState::instance.units[local_60].field59_0x86 + (int)(DAT_UnitsState::instance.units[unitID].field59_0x86 + sVar20), (int)(sVar5), - DAT_UnitsState::instance.units[local_60].drawHeight1 - local_14, + DAT_UnitsState::instance.units[unitID].drawHeight1 - local_14, (byte*)(( int)((DAT_GMImageOffsets::instance[_yOffset_01 + -1 + iVar18] + (int)DAT_TextureRenderCoreObject::instance .gmProcessedImageData))), (0x10 - iVar27) * 2); - sVar30 = DAT_UnitsState::instance.units[local_60].drawYOffset; + sVar30 = DAT_UnitsState::instance.units[unitID].drawYOffset; if (sVar30 != 0) { - sVar20 = DAT_UnitsState::instance.units[local_60].field59_0x86; + sVar20 = DAT_UnitsState::instance.units[unitID].field59_0x86; if (sVar20 < 0) { _yOffset_01 = 0; } else { @@ -1605,11 +1605,11 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)(sVar20 + DAT_UnitsState::instance.units[local_60].drawY), + (int)DAT_UnitsState::instance.units[unitID].drawX, + (int)(sVar20 + DAT_UnitsState::instance.units[unitID].drawY), (int)(( - int)(DAT_UnitsState::instance.units[local_60].drawWidth)), - DAT_UnitsState::instance.units[local_60].drawHeight1 + int)(DAT_UnitsState::instance.units[unitID].drawWidth)), + DAT_UnitsState::instance.units[unitID].drawHeight1 - _yOffset_01, (byte*)(( int)((DAT_GMImageOffsets::instance @@ -1623,7 +1623,7 @@ namespace Rendering { } uVar9 = *this->viewportState.ptrColor; *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; - sVar30 = DAT_UnitsState::instance.units[local_60].field59_0x86; + sVar30 = DAT_UnitsState::instance.units[unitID].field59_0x86; if (local_2c == 0) { if (sVar30 < 0) { _yOffset_01 = 0; @@ -1633,11 +1633,11 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)DAT_UnitsState::instance.units[unitID].drawX, (int)(( - int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY)), - (int)(DAT_UnitsState::instance.units[local_60].drawWidth), - DAT_UnitsState::instance.units[local_60].drawHeight1 - _yOffset_01, + int)(sVar30 + DAT_UnitsState::instance.units[unitID].drawY)), + (int)(DAT_UnitsState::instance.units[unitID].drawWidth), + DAT_UnitsState::instance.units[unitID].drawHeight1 - _yOffset_01, (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance .gmProcessedImageData)))); @@ -1650,26 +1650,26 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, + (int)DAT_UnitsState::instance.units[unitID].drawX, (int)(( - int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY)), - (int)(DAT_UnitsState::instance.units[local_60].drawWidth), - DAT_UnitsState::instance.units[local_60].drawHeight1 - _yOffset_01, + int)(sVar30 + DAT_UnitsState::instance.units[unitID].drawY)), + (int)(DAT_UnitsState::instance.units[unitID].drawWidth), + DAT_UnitsState::instance.units[unitID].drawHeight1 - _yOffset_01, (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance .gmProcessedImageData))), local_2c); } - sVar30 = DAT_UnitsState::instance.units[local_60].graphicSize; + sVar30 = DAT_UnitsState::instance.units[unitID].graphicSize; if ((sVar30 != 4) && (1 < sVar30)) { DAT_CurrentlyRenderedSpriteID::instance - = (GmIDInt)DAT_UnitsState::instance.units[local_60].gmIDUnk; + = (GmIDInt)DAT_UnitsState::instance.units[unitID].gmIDUnk; DAT_RenderedUnitOwner::instance - = (uint)DAT_UnitsState::instance.units[local_60] + = (uint)DAT_UnitsState::instance.units[unitID] .displayColorPlayerID; - _yOffset_01 = DAT_UnitsState::instance.units[local_60].imageIDUnk; + _yOffset_01 = DAT_UnitsState::instance.units[unitID].imageIDUnk; if (0 < _yOffset_01) { - sVar30 = DAT_UnitsState::instance.units[local_60].field60_0x88; + sVar30 = DAT_UnitsState::instance.units[unitID].field60_0x88; if (sVar30 < 0) { iVar26 = 0; } else { @@ -1678,11 +1678,11 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY), + (int)DAT_UnitsState::instance.units[unitID].drawX, + (int)(sVar30 + DAT_UnitsState::instance.units[unitID].drawY), (int)(( - int)(DAT_UnitsState::instance.units[local_60].drawWidth)), - DAT_UnitsState::instance.units[local_60].drawHeight1 - iVar26, + int)(DAT_UnitsState::instance.units[unitID].drawWidth)), + DAT_UnitsState::instance.units[unitID].drawHeight1 - iVar26, (byte*)(( int)((DAT_GMImageSizes::instance [GMTotalPicturesProcessed::instance @@ -1692,10 +1692,10 @@ namespace Rendering { .gmProcessedImageData)))); } } - if (2 < DAT_UnitsState::instance.units[local_60].graphicSize) { - _yOffset_01 = DAT_UnitsState::instance.units[local_60].imageID2; + if (2 < DAT_UnitsState::instance.units[unitID].graphicSize) { + _yOffset_01 = DAT_UnitsState::instance.units[unitID].imageID2; if (0 < _yOffset_01) { - sVar30 = DAT_UnitsState::instance.units[local_60].drawYOffset; + sVar30 = DAT_UnitsState::instance.units[unitID].drawYOffset; if (sVar30 < 0) { iVar26 = 0; } else { @@ -1704,11 +1704,11 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)( - (int)DAT_UnitsState::instance.units[local_60].drawX, - (int)(sVar30 + DAT_UnitsState::instance.units[local_60].drawY), + (int)DAT_UnitsState::instance.units[unitID].drawX, + (int)(sVar30 + DAT_UnitsState::instance.units[unitID].drawY), (int)(( - int)(DAT_UnitsState::instance.units[local_60].drawWidth)), - DAT_UnitsState::instance.units[local_60].drawHeight1 - iVar26, + int)(DAT_UnitsState::instance.units[unitID].drawWidth)), + DAT_UnitsState::instance.units[unitID].drawHeight1 - iVar26, (byte*)(( int)((DAT_GMImageSizes::instance [GMTotalPicturesProcessed::instance @@ -1719,13 +1719,13 @@ namespace Rendering { } if (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY) { - UVar7 = DAT_UnitsState::instance.units[local_60].unitType; + UVar7 = DAT_UnitsState::instance.units[unitID].unitType; if ((UVar7 == OpenSHC::Map::Units::UT_S_TOWER) - && (DAT_UnitsState::instance.units[local_60].dying == 0)) { + && (DAT_UnitsState::instance.units[unitID].dying == 0)) { _yOffset_01 - = (int)DAT_UnitsState::instance.units[local_60].drawX; - iVar26 = (int)DAT_UnitsState::instance.units[local_60].drawY; - switch (DAT_UnitsState::instance.units[local_60] + = (int)DAT_UnitsState::instance.units[unitID].drawX; + iVar26 = (int)DAT_UnitsState::instance.units[unitID].drawY; + switch (DAT_UnitsState::instance.units[unitID] .facingDirectionMapOrientationCorrected) { case 0: _yOffset_01 = _yOffset_01 + 0x22; @@ -1760,12 +1760,12 @@ namespace Rendering { } } else { if ((UVar7 != OpenSHC::Map::Units::UT_S_BATTERINGRAM) - || (DAT_UnitsState::instance.units[local_60].dying != 0)) + || (DAT_UnitsState::instance.units[unitID].dying != 0)) goto LAB_004ea966; _yOffset_01 - = (int)DAT_UnitsState::instance.units[local_60].drawX; - iVar26 = (int)DAT_UnitsState::instance.units[local_60].drawY; - switch (DAT_UnitsState::instance.units[local_60] + = (int)DAT_UnitsState::instance.units[unitID].drawX; + iVar26 = (int)DAT_UnitsState::instance.units[unitID].drawY; + switch (DAT_UnitsState::instance.units[unitID] .facingDirectionMapOrientationCorrected) { case 0: case 1: @@ -1795,10 +1795,10 @@ namespace Rendering { } } DAT_RenderedUnitOwner::instance - = (uint)DAT_UnitsState::instance.units[local_60].owner; + = (uint)DAT_UnitsState::instance.units[unitID].owner; DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; - uVar32 = DAT_UnitsState::instance.units[local_60].fixedRng + uVar32 = DAT_UnitsState::instance.units[unitID].fixedRng + DAT_GameState::instance.mapAndTime.totalGameTicksUnk & 0x8000003f; if ((int)uVar32 < 0) { @@ -1815,7 +1815,7 @@ namespace Rendering { if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { *this->viewportState.ptrColor = uVar9; } else { - this->viewportState.mouseRayUnitID = local_60; + this->viewportState.mouseRayUnitID = unitID; this->viewportState.mouseRayBuildingID = 0; } goto LAB_004eb1be; @@ -1824,9 +1824,9 @@ namespace Rendering { } MACRO_CALL_MEMBER( OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, - this)(local_60, (undefined4)((int)(sVar30)), (undefined4)((int)(sVar20)), + this)(unitID, (undefined4)((int)(sVar30)), (undefined4)((int)(sVar20)), (undefined4)((int)(sVar5)), - (undefined4)((int)(DAT_UnitsState::instance.units[local_60].drawHeight1)), + (undefined4)((int)(DAT_UnitsState::instance.units[unitID].drawHeight1)), (undefined4)((int)(DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)), _yOffset_01); @@ -1835,27 +1835,27 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationUnk, DAT_TextureRenderCoreObject::ptr)((int)sVar30, (int)(sVar20), (int)(sVar5), - (int)(DAT_UnitsState::instance.units[local_60].drawHeight1), + (int)(DAT_UnitsState::instance.units[unitID].drawHeight1), (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func:: renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)((int)sVar30, (int)(sVar20), (int)(sVar5), - (int)(DAT_UnitsState::instance.units[local_60].drawHeight1), + (int)(DAT_UnitsState::instance.units[unitID].drawHeight1), (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData))), local_2c); } - _yOffset_01 = DAT_UnitsState::instance.units[local_60].vanish; + _yOffset_01 = DAT_UnitsState::instance.units[unitID].vanish; if (1 < _yOffset_01) { - DAT_UnitsState::instance.units[local_60].vanish = _yOffset_01 + -1; + DAT_UnitsState::instance.units[unitID].vanish = _yOffset_01 + -1; } } } LAB_004eb1be: - local_60 = (int)(short)DAT_UnitsState::instance.units[local_60].nextUnitOnTheSameTile; - if ((DAT_GameSynchronyState::instance.syncStatus != 0) || (local_60 < 1)) + unitID = (int)(short)DAT_UnitsState::instance.units[unitID].nextUnitOnTheSameTile; + if ((DAT_GameSynchronyState::instance.syncStatus != 0) || (unitID < 1)) break; } } @@ -1865,25 +1865,25 @@ namespace Rendering { local_24 = 0; _yOffset_01 = DAT_RenderMap_YOffset::instance; - if (local_58 != 0) { + if (entityID != 0) { do { local_24 = local_24 + 1; - if ((9 < local_24) || (DAT_EntityState::instance.entityArray[local_58].logicalState == 0)) + if ((9 < local_24) || (DAT_EntityState::instance.entityArray[entityID].logicalState == 0)) break; - if (DAT_EntityState::instance.entityArray[local_58].graphicType2 == 0) + if (DAT_EntityState::instance.entityArray[entityID].graphicType2 == 0) goto LAB_004eb439; DAT_CurrentlyRenderedSpriteID::instance - = (GmIDInt)DAT_EntityState::instance.entityArray[local_58].gmID; + = (GmIDInt)DAT_EntityState::instance.entityArray[entityID].gmID; if ((DAT_CurrentlyRenderedSpriteID::instance == OpenSHC::IO::Graphics::GID_BODY_FIRE) || (DAT_CurrentlyRenderedSpriteID::instance == OpenSHC::IO::Graphics::GID_BODY_FIRE_2)) { local_8 = local_8 + 1; - if ((DAT_EntityState::instance.entityArray[local_58].fireIntensity == 0) + if ((DAT_EntityState::instance.entityArray[entityID].fireIntensity == 0) && (0x4f < local_8)) { if (local_8 < 200) { - bVar15 = (byte)DAT_EntityState::instance.entityArray[local_58].rng_1 & 1; + bVar15 = (byte)DAT_EntityState::instance.entityArray[entityID].rng_1 & 1; } else { - bVar15 = (byte)DAT_EntityState::instance.entityArray[local_58].rng_1 & 3; + bVar15 = (byte)DAT_EntityState::instance.entityArray[entityID].rng_1 & 3; } if (bVar15 != 0) break; @@ -1892,9 +1892,9 @@ namespace Rendering { OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(5); _yOffset_01 = DAT_RenderMap_YOffset::instance; } - DAT_RenderedUnitOwner::instance = DAT_EntityState::instance.entityArray[local_58].colorUnk; + DAT_RenderedUnitOwner::instance = DAT_EntityState::instance.entityArray[entityID].colorUnk; bVar12 = 0; - iVar26 = (int)DAT_EntityState::instance.entityArray[local_58].height; + iVar26 = (int)DAT_EntityState::instance.entityArray[entityID].height; switch (DAT_CurrentlyRenderedSpriteID::instance) { case OpenSHC::IO::Graphics::GID_ANIM_FLAGS: case OpenSHC::IO::Graphics::GID_ANIM_CRUSADER_FLAG: @@ -1917,37 +1917,37 @@ namespace Rendering { case OpenSHC::IO::Graphics::GID_BODY_FIRE_2: goto switchD_004eb2c9_caseD_76; case OpenSHC::IO::Graphics::GID_BODY_MISSILE_COW: - if (DAT_EntityState::instance.entityArray[local_58].someCounter_OR_hitGround != 0 + if (DAT_EntityState::instance.entityArray[entityID].someCounter_OR_hitGround != 0 && (DAT_TileMapState::instance.refreshRelatedOne == 0 || (_flatView != 0))) { iVar26 = _yOffset_01; } goto switchD_004eb2c9_caseD_4d; case OpenSHC::IO::Graphics::GID_BODY_BRAZIER: iVar18 - = iVar26 + 4 + (_yOffset_01 - (uint)DAT_TileMapState::instance.HeightLayer[iVar16]); + = iVar26 + 4 + (_yOffset_01 - (uint)DAT_TileMapState::instance.HeightLayer[layerTileIndex]); if (DAT_TileMapState::instance.refreshRelatedOne == 0) { iVar26 = _yOffset_01; - if (DAT_TileMapState::instance.BuildingLayer[iVar16] != 0) { + if (DAT_TileMapState::instance.BuildingLayer[layerTileIndex] != 0) { iVar26 = _yOffset_01 + 0x14; } } else { iVar26 = _yOffset_01; if ((_flatView == 0) - && (iVar26 = iVar18, DAT_TileMapState::instance.BuildingLayer[iVar16] != 0)) { + && (iVar26 = iVar18, DAT_TileMapState::instance.BuildingLayer[layerTileIndex] != 0)) { iVar26 = iVar18 + -10; } } break; case OpenSHC::IO::Graphics::GID_ANIM_HEADS: iVar26 - = iVar26 + 7 + (_yOffset_01 - (uint)DAT_TileMapState::instance.HeightLayer[iVar16]); - uVar32 = DAT_TileMapState::instance.LogicLayer[iVar16] & 0x400000; + = iVar26 + 7 + (_yOffset_01 - (uint)DAT_TileMapState::instance.HeightLayer[layerTileIndex]); + uVar32 = DAT_TileMapState::instance.LogicLayer[layerTileIndex] & 0x400000; if (uVar32 != 0) { iVar26 = iVar26 + 0x12; } if (DAT_TileMapState::instance.refreshRelatedOne == 0) { iVar26 = _yOffset_01 + 0x14; - if (DAT_TileMapState::instance.BuildingLayer[iVar16] == 0) { + if (DAT_TileMapState::instance.BuildingLayer[layerTileIndex] == 0) { iVar26 = _yOffset_01; } if (uVar32 != 0) { @@ -1956,37 +1956,37 @@ namespace Rendering { } else if (_flatView != 0) goto LAB_004eb439; } - if ((DAT_EntityState::instance.entityArray[local_58].field83_0xc0 == 0) + if ((DAT_EntityState::instance.entityArray[entityID].field83_0xc0 == 0) || (DAT_TextureRenderCoreObject::instance.isZoom2 == 0)) { - sVar30 = DAT_EntityState::instance.entityArray[local_58].unkMinusOne; + sVar30 = DAT_EntityState::instance.entityArray[entityID].unkMinusOne; if (sVar30 < 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, - DAT_EntityState::instance.entityArray[local_58].graphicType2, - (int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) + DAT_EntityState::instance.entityArray[entityID].graphicType2, + (int)((DAT_EntityState::instance.entityArray[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + DAT_RenderMap_DrawSomeX::instance), - (int)(((DAT_EntityState::instance.entityArray[local_58].y1 - - DAT_EntityState::instance.entityArray[local_58].originY) + (int)(((DAT_EntityState::instance.entityArray[entityID].y1 + - DAT_EntityState::instance.entityArray[entityID].originY) - iVar26) + DAT_RenderMap_DrawSomeY::instance), (GmID)((int)(DAT_CurrentlyRenderedSpriteID::instance)), - (int)(DAT_EntityState::instance.entityArray[local_58].imageID), + (int)(DAT_EntityState::instance.entityArray[entityID].imageID), (int)(-1 - sVar30)); _yOffset_01 = DAT_RenderMap_YOffset::instance; } else { - _yOffset_01 = (int)DAT_EntityState::instance.entityArray[local_58].originY; + _yOffset_01 = (int)DAT_EntityState::instance.entityArray[entityID].originY; if (sVar30 == 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( (eGM)DAT_CurrentlyRenderedSpriteID::instance, - DAT_EntityState::instance.entityArray[local_58].graphicType2, - (int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) + DAT_EntityState::instance.entityArray[entityID].graphicType2, + (int)((DAT_EntityState::instance.entityArray[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + DAT_RenderMap_DrawSomeX::instance), (int)(( - int)(((DAT_EntityState::instance.entityArray[local_58].y1 - _yOffset_01) + int)(((DAT_EntityState::instance.entityArray[entityID].y1 - _yOffset_01) - iVar26) + DAT_RenderMap_DrawSomeY::instance))); _yOffset_01 = DAT_RenderMap_YOffset::instance; @@ -1995,12 +1995,12 @@ namespace Rendering { OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( (GmID)DAT_CurrentlyRenderedSpriteID::instance, - DAT_EntityState::instance.entityArray[local_58].graphicType2, - (int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) + DAT_EntityState::instance.entityArray[entityID].graphicType2, + (int)((DAT_EntityState::instance.entityArray[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + DAT_RenderMap_DrawSomeX::instance), (int)(( - int)(((DAT_EntityState::instance.entityArray[local_58].y1 - _yOffset_01) + int)(((DAT_EntityState::instance.entityArray[entityID].y1 - _yOffset_01) - iVar26) + DAT_RenderMap_DrawSomeY::instance)), (int)(sVar30)); @@ -2008,70 +2008,70 @@ namespace Rendering { } } LAB_004eb439: - iVar26 = (int)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; - if ((local_58 == iVar26) - || (local_58 = iVar26, DAT_GameSynchronyState::instance.syncStatus != 0)) + iVar26 = (int)DAT_EntityState::instance.entityArray[entityID].nextEntityOnThisTileByID; + if ((entityID == iVar26) + || (entityID = iVar26, DAT_GameSynchronyState::instance.syncStatus != 0)) break; } else { - local_58 - = (uint)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; + entityID + = (uint)DAT_EntityState::instance.entityArray[entityID].nextEntityOnThisTileByID; } - if (local_58 == 0) + if (entityID == 0) break; } while (true); } - local_58 = (uint)(byte)DAT_TileMapState::instance.EntityLayerLT25[iVar16]; + entityID = (uint)(byte)DAT_TileMapState::instance.EntityLayerLT25[layerTileIndex]; _yOffset_01 = 0; - if (local_58 != 0) { + if (entityID != 0) { while (_yOffset_01 = _yOffset_01 + 1, _yOffset_01 < 10) { - if (DAT_EntityState::instance.entityArray[local_58].tile != iVar16) { - DAT_TileMapState::instance.EntityLayerLT25[iVar16] = '\0'; + if (DAT_EntityState::instance.entityArray[entityID].tile != layerTileIndex) { + DAT_TileMapState::instance.EntityLayerLT25[layerTileIndex] = '\0'; break; } - if (DAT_EntityState::instance.entityArray[local_58].logicalState == 0) + if (DAT_EntityState::instance.entityArray[entityID].logicalState == 0) break; - iVar26 = DAT_EntityState::instance.entityArray[local_58].graphicType2; + iVar26 = DAT_EntityState::instance.entityArray[entityID].graphicType2; if (iVar26 == 0) { LAB_004eb7db: - uVar32 = (uint)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; - if ((local_58 == uVar32) || (DAT_GameSynchronyState::instance.syncStatus != 0)) + uVar32 = (uint)DAT_EntityState::instance.entityArray[entityID].nextEntityOnThisTileByID; + if ((entityID == uVar32) || (DAT_GameSynchronyState::instance.syncStatus != 0)) break; } else { DAT_CurrentlyRenderedSpriteID::instance - = (GmIDInt)DAT_EntityState::instance.entityArray[local_58].gmID; + = (GmIDInt)DAT_EntityState::instance.entityArray[entityID].gmID; DAT_RenderedUnitOwner::instance - = DAT_EntityState::instance.entityArray[local_58].colorUnk; - iVar18 = (int)DAT_EntityState::instance.entityArray[local_58].height; - if ((DAT_EntityState::instance.entityArray[local_58].field83_0xc0 == 0) + = DAT_EntityState::instance.entityArray[entityID].colorUnk; + iVar18 = (int)DAT_EntityState::instance.entityArray[entityID].height; + if ((DAT_EntityState::instance.entityArray[entityID].field83_0xc0 == 0) || (DAT_TextureRenderCoreObject::instance.isZoom2 == 0)) { - sVar30 = DAT_EntityState::instance.entityArray[local_58].unkMinusOne; + sVar30 = DAT_EntityState::instance.entityArray[entityID].unkMinusOne; if (sVar30 < 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)( (GmID)DAT_CurrentlyRenderedSpriteID::instance, iVar26, - (int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) + (int)((DAT_EntityState::instance.entityArray[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + DAT_RenderMap_DrawSomeX::instance), - (int)(((DAT_EntityState::instance.entityArray[local_58].y1 - - DAT_EntityState::instance.entityArray[local_58].originY) + (int)(((DAT_EntityState::instance.entityArray[entityID].y1 + - DAT_EntityState::instance.entityArray[entityID].originY) - iVar18) + DAT_RenderMap_DrawSomeY::instance), (GmID)((int)(DAT_CurrentlyRenderedSpriteID::instance)), - (int)(DAT_EntityState::instance.entityArray[local_58].imageID), + (int)(DAT_EntityState::instance.entityArray[entityID].imageID), (int)(-1 - sVar30)); } else { - iVar27 = (int)DAT_EntityState::instance.entityArray[local_58].originY; + iVar27 = (int)DAT_EntityState::instance.entityArray[entityID].originY; if (sVar30 == 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( (eGM)DAT_CurrentlyRenderedSpriteID::instance, iVar26, (int)(( - int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) + int)((DAT_EntityState::instance.entityArray[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + DAT_RenderMap_DrawSomeX::instance)), (int)(( - int)(((DAT_EntityState::instance.entityArray[local_58].y1 - iVar27) + int)(((DAT_EntityState::instance.entityArray[entityID].y1 - iVar27) - iVar18) + DAT_RenderMap_DrawSomeY::instance))); } else { @@ -2080,25 +2080,25 @@ namespace Rendering { DAT_TextureRenderCoreObject::ptr)( (GmID)DAT_CurrentlyRenderedSpriteID::instance, iVar26, (int)(( - int)((DAT_EntityState::instance.entityArray[local_58].x1 - - DAT_EntityState::instance.entityArray[local_58].originX) + int)((DAT_EntityState::instance.entityArray[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + DAT_RenderMap_DrawSomeX::instance)), (int)(( - int)(((DAT_EntityState::instance.entityArray[local_58].y1 - iVar27) + int)(((DAT_EntityState::instance.entityArray[entityID].y1 - iVar27) - iVar18) + DAT_RenderMap_DrawSomeY::instance)), (int)(sVar30)); } } - sVar30 = DAT_EntityState::instance.entityArray[local_58].field83_0xc0; + sVar30 = DAT_EntityState::instance.entityArray[entityID].field83_0xc0; if (sVar30 != 0) { - sVar20 = DAT_EntityState::instance.entityArray[local_58].unkMinusOne; - EVar3 = DAT_EntityState::instance.entityArray[local_58].entityType; - iVar27 = ((int)DAT_EntityState::instance.entityArray[local_58].x1 - - (int)DAT_EntityState::instance.entityArray[local_58].originX) + sVar20 = DAT_EntityState::instance.entityArray[entityID].unkMinusOne; + EVar3 = DAT_EntityState::instance.entityArray[entityID].entityType; + iVar27 = ((int)DAT_EntityState::instance.entityArray[entityID].x1 + - (int)DAT_EntityState::instance.entityArray[entityID].originX) + DAT_RenderMap_DrawSomeX::instance; - iVar18 = (((int)DAT_EntityState::instance.entityArray[local_58].y1 - - (int)DAT_EntityState::instance.entityArray[local_58].originY) + iVar18 = (((int)DAT_EntityState::instance.entityArray[entityID].y1 + - (int)DAT_EntityState::instance.entityArray[entityID].originY) - iVar18) + DAT_RenderMap_DrawSomeY::instance; DAT_TextManagerObject::instance.textSurfaceTarget @@ -2107,7 +2107,7 @@ namespace Rendering { local_c = 0; if ((EVar3 == (OpenSHC::Map::Entities::EntityType)0x2a) || (EVar3 == (OpenSHC::Map::Entities::EntityType)0x2b)) { - DAT_EntityState::instance.entityArray[local_58].unkMinusOne = sVar20 + -2; + DAT_EntityState::instance.entityArray[entityID].unkMinusOne = sVar20 + -2; DAT_TextManagerObject::instance.field8_0x20 = 1; if (EVar3 == (OpenSHC::Map::Entities::EntityType)0x2b) { local_c = 0xff; @@ -2117,19 +2117,19 @@ namespace Rendering { iVar26 = 0; } DAT_CurrentlyRenderedSpriteID::instance - = (GmIDInt)DAT_EntityState::instance.entityArray[local_58].field82_0xbe; + = (GmIDInt)DAT_EntityState::instance.entityArray[entityID].field82_0xbe; MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( (GmID)DAT_CurrentlyRenderedSpriteID::instance, (int)(sVar30), - DAT_EntityState::instance.entityArray[local_58].field86_0xc8 + iVar27, - DAT_EntityState::instance.entityArray[local_58].field87_0xca + iVar18, + DAT_EntityState::instance.entityArray[entityID].field86_0xc8 + iVar27, + DAT_EntityState::instance.entityArray[entityID].field87_0xca + iVar18, iVar26); MACRO_CALL_MEMBER(OpenSHC::Text::TextManager_Func::renderNumberToScreen2, DAT_TextManagerObject::ptr)( - DAT_EntityState::instance.entityArray[local_58].displayValue, - DAT_EntityState::instance.entityArray[local_58].field88_0xcc + iVar27, - DAT_EntityState::instance.entityArray[local_58].field89_0xce + iVar18, + DAT_EntityState::instance.entityArray[entityID].displayValue, + DAT_EntityState::instance.entityArray[entityID].field88_0xcc + iVar27, + DAT_EntityState::instance.entityArray[entityID].field89_0xce + iVar18, OpenSHC::Text::TTA_LEFT, local_c, 0x12, FALSE, iVar26); DAT_TextManagerObject::instance.textSurfaceTarget = OpenSHC::Rendering::Enums::RT_SCREEN_MENU; @@ -2137,9 +2137,9 @@ namespace Rendering { } goto LAB_004eb7db; } - uVar32 = (uint)DAT_EntityState::instance.entityArray[local_58].nextEntityOnThisTileByID; + uVar32 = (uint)DAT_EntityState::instance.entityArray[entityID].nextEntityOnThisTileByID; } - local_58 = uVar32; + entityID = uVar32; if (uVar32 == 0) break; } @@ -2188,11 +2188,11 @@ namespace Rendering { OpenSHC::Audio::SFX::SFXState_Func::notifyAmbientSoundEvent, DAT_SFXState::ptr)(8); } if (DAT_00ed3170::instance != 0 && (int)DAT_00ed3170::instance < 0xff && bVar13 != 0) { - uVar32 = (uint)(short)DAT_TileMapState::instance.MiscDisplayLayer[iVar16]; + uVar32 = (uint)(short)DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex]; DAT_00ed317c::instance = uVar32 & 3; if ((DAT_00ed3148::instance & 0x100) == 0) { DAT_GmImageAddressToBeRendered::instance - = (uint)DAT_TileMapState::instance.PillarGFXLayer[iVar16]; + = (uint)DAT_TileMapState::instance.PillarGFXLayer[layerTileIndex]; if ((DAT_00ed3148::instance & 0x100000) == 0) { DAT_00ed316c::instance = DAT_GmImageAddressToBeRendered::instance; if ((uVar32 & 0x800) == 0) { @@ -2215,12 +2215,12 @@ namespace Rendering { DAT_GmImageAddressToBeRendered::instance = GMTotalPicturesProcessed::instance[9] + 0x1f; } else { - iVar16 = DAT_GmImageAddressToBeRendered::instance + this->unknownCounterUntil_0x10; - if (0x32 < iVar16) { - iVar16 = iVar16 + -0x10; + layerTileIndex = DAT_GmImageAddressToBeRendered::instance + this->unknownCounterUntil_0x10; + if (0x32 < layerTileIndex) { + layerTileIndex = layerTileIndex + -0x10; } DAT_GmImageAddressToBeRendered::instance - = iVar16 + -1 + GMTotalPicturesProcessed::instance[9]; + = layerTileIndex + -1 + GMTotalPicturesProcessed::instance[9]; if (0x20 < (int)DAT_00ed3170::instance && (int)(DAT_RenderMap_DrawSomeY::instance - DAT_00ed3170::instance) < local_5c + -0xa0) { @@ -2235,10 +2235,10 @@ namespace Rendering { } } else { DAT_GmImageAddressToBeRendered::instance - = (uint)DAT_TileMapState::instance.WallGFXLayer[iVar16]; + = (uint)DAT_TileMapState::instance.WallGFXLayer[layerTileIndex]; DAT_00ed316c::instance = DAT_GmImageAddressToBeRendered::instance; if (local_54 != 0) { - DAT_00ed316c::instance = (uint)DAT_TileMapState::instance.PillarGFXLayer[iVar16]; + DAT_00ed316c::instance = (uint)DAT_TileMapState::instance.PillarGFXLayer[layerTileIndex]; } LAB_004eb9a4: MACRO_CALL(OpenSHC::Rendering_Func::BlitMapImageWithVerticalClip)(); @@ -2254,16 +2254,16 @@ namespace Rendering { iVar31 = _zoomOffset; if (_vpWidthPlus1 == _viewportHeight) { DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated + 0x10; - iVar16 = _viewportHeight; + layerTileIndex = _viewportHeight; } else { - iVar16 = _viewportHeight + 1; + layerTileIndex = _viewportHeight + 1; DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated; } - for (; iVar31 < iVar16; iVar31 = iVar31 + 1) { + for (; iVar31 < layerTileIndex; iVar31 = iVar31 + 1) { _yOffset_01 = this->screenPointToTileNumber[iVar31 + iVar2 + -8]; DAT_00ed3148::instance = DAT_TileMapState::instance.LogicLayer[_yOffset_01]; if ((DAT_00ed3148::instance & 0x30) == 0) { - if ((iVar31 < 2) || (bVar13 = 1, iVar16 + -2 <= iVar31)) { + if ((iVar31 < 2) || (bVar13 = 1, layerTileIndex + -2 <= iVar31)) { bVar13 = 0; } uVar32 = (uint)DAT_TileMapState::instance.FloatingLayer[_yOffset_01]; @@ -2541,7 +2541,7 @@ namespace Rendering { } DAT_RenderMap_DrawSomeX::instance = DAT_RenderMap_DrawSomeX::instance + 0x20; } - if (iVar16 == _viewportHeight) { + if (layerTileIndex == _viewportHeight) { _vpWidthPlus1_1 = _viewportHeight; local_c = 200; DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated + 0x10; @@ -2767,16 +2767,16 @@ namespace Rendering { switchD_004eb2c9_caseD_4d: MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, this)( 0xffffffff, - ((int)DAT_EntityState::instance.entityArray[local_58].x1 - - (int)DAT_EntityState::instance.entityArray[local_58].originX) + ((int)DAT_EntityState::instance.entityArray[entityID].x1 + - (int)DAT_EntityState::instance.entityArray[entityID].originX) + DAT_RenderMap_DrawSomeX::instance, - (((int)DAT_EntityState::instance.entityArray[local_58].y1 - - (int)DAT_EntityState::instance.entityArray[local_58].originY) + (((int)DAT_EntityState::instance.entityArray[entityID].y1 + - (int)DAT_EntityState::instance.entityArray[entityID].originY) - iVar26) + DAT_RenderMap_DrawSomeY::instance, - (undefined4)((int)(DAT_EntityState::instance.entityArray[local_58].graphicType2)), - (undefined4)((int)(DAT_EntityState::instance.entityArray[local_58].unkMinusOne)), - (undefined4)((int)(DAT_EntityState::instance.entityArray[local_58].imageID)), 0); + (undefined4)((int)(DAT_EntityState::instance.entityArray[entityID].graphicType2)), + (undefined4)((int)(DAT_EntityState::instance.entityArray[entityID].unkMinusOne)), + (undefined4)((int)(DAT_EntityState::instance.entityArray[entityID].imageID)), 0); _yOffset_01 = DAT_RenderMap_YOffset::instance; goto LAB_004eb439; } From f361ea4eabbfbfee9493e1d1c3ffa2d0989898b9 Mon Sep 17 00:00:00 2001 From: Gynt Date: Mon, 28 Sep 2026 23:42:30 +0200 Subject: [PATCH 71/77] reimplement: SHC_3BB0A8C1_0x004E7810 34.69% Style pass, reg alloc differs --- .../ViewportRenderState/renderUnits.cpp | 95 ++++++++----------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 41 insertions(+), 56 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp index 098c340dc..81b8a9b53 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp @@ -33,23 +33,12 @@ namespace Rendering { // FUNCTION: STRONGHOLDCRUSADER 0x004E7810 void ViewportRenderState::renderUnits() { - ushort savedPixelColor; short graphicSize; UnitTypeShort unitType; UnitStateShort unitState; int overlayX; - uint animationTick; int overlayY; int maskImageID; - int overlayImageID; - int _drawX; - int _drawY; - int _imageID; - uint _blendStrength; - int _unitID; - int _gmID; - int _renderBatchSize; - int _alpha; int renderCount5 = this->unitRender5; int renderCount4 = this->unitRender4; @@ -57,13 +46,13 @@ namespace Rendering { int renderCount2 = this->unitRender2; int renderCount1 = this->unitRender1; this->unitBatchedRenderCounterUntil6 = this->unitBatchedRenderCounterUntil6 + 1; - _drawX = 0; - _drawY = 0; - _renderBatchSize = 0; - _unitID = 0; - _imageID = 0; - _blendStrength = 0; - _gmID = 0; + int _drawX = 0; + int _drawY = 0; + int _renderBatchSize = 0; + int _unitID = 0; + int _imageID = 0; + uint _blendStrength = 0; + int _gmID = 0; if (5 < this->unitBatchedRenderCounterUntil6) { this->unitBatchedRenderCounterUntil6 = 1; } @@ -140,8 +129,8 @@ namespace Rendering { if ((int)_blendStrength < 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, _imageID, - _drawX, _drawY, (GmID)((int)(DAT_CurrentlyRenderedSpriteID::instance)), (int)((int)(_gmID)), - (int)((int)(-1 - _blendStrength))); + _drawX, _drawY, (GmID)((int)(DAT_CurrentlyRenderedSpriteID::instance)), (int)(_gmID), + (int)(-1 - _blendStrength)); } else if (_blendStrength == 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( @@ -149,7 +138,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)((GmID)DAT_CurrentlyRenderedSpriteID::instance, _imageID, - _drawX, _drawY, (int)((int)(_blendStrength))); + _drawX, _drawY, (int)(_blendStrength)); } } else if (_unitID == 0) { if ((_blendStrength & 4) != 0) { @@ -164,7 +153,7 @@ namespace Rendering { } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)( - (GmID)_gmID, _imageID, _drawX, _drawY, (int)((int)(_blendStrength >> 0x10))); + (GmID)_gmID, _imageID, _drawX, _drawY, (int)(_blendStrength >> 0x10)); } } else { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, @@ -172,17 +161,17 @@ namespace Rendering { (GmID)((int)(_gmID)), ((int)_blendStrength >> 0x10) + _imageID, 0); } } else { - savedPixelColor = *this->viewportState.ptrColor; + ushort savedPixelColor = *this->viewportState.ptrColor; *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; - _alpha = (int)(char)DAT_UnitsState::instance.units[_unitID].disappearFadeAlphaCountdown; + int _alpha = (int)(char)DAT_UnitsState::instance.units[_unitID].disappearFadeAlphaCountdown; if (DAT_UnitsState::instance.units[_unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN) { - if (((DAT_GameState::instance.mapAndTime - .playerTeams[DAT_UnitsState::instance.units[_unitID].owner] - != DAT_GameState::instance.mapAndTime - .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID]) - && (120 < DAT_UnitsState::instance.units[_unitID].assassinsMicroDistanceToEnemyUnk)) - && ((DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY - || (DAT_UnitsState::instance.units[_unitID].idleCounterUnk <= 2400)))) { + if (DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[_unitID].owner] + != DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID] + && 120 < DAT_UnitsState::instance.units[_unitID].assassinsMicroDistanceToEnemyUnk + && (DAT_GameSynchronyState::instance.currentGameMode != OpenSHC::Game::GM_SOLITARY + || (DAT_UnitsState::instance.units[_unitID].idleCounterUnk <= 2400))) { _alpha = 0x20 - (0x20 - _alpha) / 2; } overlayX = DAT_UnitsState::instance.units[_unitID].imageID2; @@ -190,8 +179,7 @@ namespace Rendering { overlayY = (0x20 - _alpha) / 3; MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationWithBlendingUnk, - DAT_TextureRenderCoreObject::ptr)(_drawX, _drawY, _imageID, - (int)((int)(_blendStrength)), + DAT_TextureRenderCoreObject::ptr)(_drawX, _drawY, _imageID, (int)(_blendStrength), (byte*)(( int)((DAT_GMImageSizes::instance[GMTotalPicturesProcessed::instance[( int)DAT_CurrentlyRenderedSpriteID::instance] @@ -202,8 +190,7 @@ namespace Rendering { if (graphicSize != 0) { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationWithBlendingUnk, - DAT_TextureRenderCoreObject::ptr)(_drawX, _drawY, _imageID, - (int)((int)(_blendStrength)), + DAT_TextureRenderCoreObject::ptr)(_drawX, _drawY, _imageID, (int)(_blendStrength), (byte*)((int)(( DAT_GMImageSizes::instance[GMTotalPicturesProcessed::instance[( int)DAT_CurrentlyRenderedSpriteID::instance] @@ -344,7 +331,7 @@ namespace Rendering { } DAT_RenderedUnitOwner::instance = (uint)DAT_UnitsState::instance.units[_unitID].owner; DAT_CurrentlyRenderedSpriteID::instance = 0xbd; - animationTick = DAT_UnitsState::instance.units[_unitID].fixedRng + uint animationTick = DAT_UnitsState::instance.units[_unitID].fixedRng + DAT_GameState::instance.mapAndTime.totalGameTicksUnk & 0x8000003f; if ((int)animationTick < 0) { @@ -352,7 +339,7 @@ namespace Rendering { } MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_FLAG_SMALL, - (int)((int)(animationTick / 2 + 1)), overlayX, overlayY); + (int)(animationTick / 2 + 1), overlayX, overlayY); } } if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { @@ -365,7 +352,7 @@ namespace Rendering { MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderUnitAnimationWithBlendingUnk, DAT_TextureRenderCoreObject::ptr)( - _drawX, _drawY, _imageID, (int)((int)(_blendStrength)), (byte*)_gmID, _alpha); + _drawX, _drawY, _imageID, (int)(_blendStrength), (byte*)_gmID, _alpha); if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { *this->viewportState.ptrColor = savedPixelColor; } else { @@ -409,19 +396,18 @@ namespace Rendering { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( OpenSHC::DE::SHCDE::GM_FLOATS, overlayY, maskImageID, overlayX); - if (((DAT_UnitsState::instance.units[_unitID].unitType - == OpenSHC::Map::Units::UT_A_ASSASSIN) - && (DAT_GameState::instance.mapAndTime - .playerTeams[DAT_UnitsState::instance.units[_unitID].owner] - == DAT_GameState::instance.mapAndTime - .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID])) - && ((DAT_UnitsState::instance.units[_unitID].assassinsMicroDistanceToEnemyUnk <= 160 + if (DAT_UnitsState::instance.units[_unitID].unitType == OpenSHC::Map::Units::UT_A_ASSASSIN + && DAT_GameState::instance.mapAndTime + .playerTeams[DAT_UnitsState::instance.units[_unitID].owner] + == DAT_GameState::instance.mapAndTime + .playerTeams[DAT_GameSynchronyState::instance.currentPlayerSlotID] + && (DAT_UnitsState::instance.units[_unitID].assassinsMicroDistanceToEnemyUnk <= 160 || ((unitState = DAT_UnitsState::instance.units[_unitID].state.generic, unitState == OpenSHC::Map::Units::States::US_MELEE_ATTACK - || (unitState == OpenSHC::Map::Units::States::US_MELEE_ATTACK_WALL)))))) { + || (unitState == OpenSHC::Map::Units::States::US_MELEE_ATTACK_WALL))))) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_INTERFACE_ICONS_2, - (int)((int)(447)), maskImageID + 2, + (int)(447), maskImageID + 2, DAT_UnitsState::instance.units[_unitID].someDrawYOffset + -0x1b + _drawY, 0x10); } } @@ -429,11 +415,10 @@ namespace Rendering { if (savedPixelColor != 0) { MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, - (int)((int)(savedPixelColor + 0xd4)), - (int)((int)(DAT_UnitsState::instance.units[_unitID].drawX)), - (int)((int)(DAT_UnitsState::instance.units[_unitID].drawY + -0x36 - + DAT_UnitsState::instance.units[_unitID].someDrawYOffset)), - OpenSHC::IO::Graphics::GID_FLOATS_NEW, (int)((int)(savedPixelColor + 0xdc)), 0); + (int)(savedPixelColor + 0xd4), (int)(DAT_UnitsState::instance.units[_unitID].drawX), + (int)(DAT_UnitsState::instance.units[_unitID].drawY + -0x36 + + DAT_UnitsState::instance.units[_unitID].someDrawYOffset), + OpenSHC::IO::Graphics::GID_FLOATS_NEW, (int)(savedPixelColor + 0xdc), 0); DAT_UnitsState::instance.units[_unitID].field46_0x6e = 0; } savedPixelColor = DAT_UnitsState::instance.units[_unitID].field45_0x6c; @@ -446,7 +431,7 @@ namespace Rendering { + (int)DAT_UnitsState::instance.units[_unitID].someDrawYOffset; overlayY = DAT_UnitsState::instance.units[_unitID].field22_0x2a + -0x35 + (int)DAT_UnitsState::instance.units[_unitID].drawX; - overlayImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x20; + int overlayImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x20; MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, overlayImageID, overlayY, overlayX, OpenSHC::IO::Graphics::GID_FLOATS_NEW, @@ -485,7 +470,7 @@ namespace Rendering { + (int)DAT_UnitsState::instance.units[_unitID].someDrawYOffset) - overlayX; overlayY = DAT_UnitsState::instance.units[_unitID].drawX + overlayY; - overlayImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x74; + int overlayImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x74; MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, @@ -525,7 +510,7 @@ namespace Rendering { + (int)DAT_UnitsState::instance.units[_unitID].someDrawYOffset) - overlayX; overlayY = DAT_UnitsState::instance.units[_unitID].drawX + overlayY; - overlayImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x94; + int overlayImageID = DAT_TileMapState::instance.field161_0x5549c0 + 0x94; MACRO_CALL_MEMBER( OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS_NEW, diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index c65d481a0..2b64fb9f8 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36987,7 +36987,7 @@ SHC_3BB0A8C1_0x004E7770 | 38.7% | LTCG ecx reuse in callers SHC_3BB0A8C1_0x004E7800 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E7810 | 34.7% | frame and reg allocation diffe +SHC_3BB0A8C1_0x004E7810 | 34.7% | Style pass, reg alloc differs SHC_3BB0A8C1_0x004E78D0 | 0.0% | Pending From 2b146893311d5638664d773b58726d3e57dee7c7 Mon Sep 17 00:00:00 2001 From: Gynt Date: Tue, 29 Sep 2026 00:07:42 +0200 Subject: [PATCH 72/77] reimplement: SHC_3BB0A8C1_0x004E2050 30.73% for loops, reg alloc differs --- .../setTileSystemMemoryLookupArrays.cpp | 73 ++++++------------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 25 insertions(+), 50 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp index 69ed10b7a..4f70efd07 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp @@ -15,7 +15,6 @@ namespace Rendering { int firstHalfIndex; int secondHalfIndex; int rowBase; - int blockRemaining; int diagonalBase; int tileGrid[160000]; int column; @@ -73,71 +72,60 @@ namespace Rendering { this->field14_0x4e5f4 = 0; this->field15_0x4e5f8 = 0; this->field16_0x4e5fc = 0; - runRemaining = 200; rowBase = 0; diagonalBase = 79600; destIndex = 0; column = 8; - do { + for (int runRemaining = 200; 0 < runRemaining; runRemaining--) { scratch7 = column; - scratch6 = 200; secondHalfIndex = destIndex + 200; firstHalfIndex = destIndex; column = rowBase; diagonal = diagonalBase; - do { + for (int scratch6 = 200; 0 < scratch6; scratch6--) { this->screenPointToTileNumber[firstHalfIndex] = tileGrid[diagonal + column]; - scratch6 = scratch6 + -1; firstHalfIndex = firstHalfIndex + 1; diagonal = diagonal + -400; column = column + 1; - } while (0 < scratch6); + } diagonalBase = diagonalBase + 400; destIndex = destIndex + 401; - scratch6 = 200; column = rowBase; diagonal = diagonalBase; - do { + for (int scratch6 = 200; -1 < scratch6; scratch6--) { this->screenPointToTileNumber[secondHalfIndex] = tileGrid[diagonal + column]; - scratch6 = scratch6 + -1; secondHalfIndex = secondHalfIndex + 1; column = column + 1; diagonal = diagonal + -400; - } while (-1 < scratch6); - runRemaining = runRemaining + -1; + } rowBase = rowBase + 1; column = scratch7 + 401; - } while (0 < runRemaining); - column = 200; + } destIndex = scratch7 + 393; diagonal = 159600; - do { + for (int column = 200; 0 < column; column--) { this->screenPointToTileNumber[destIndex] = tileGrid[diagonal + rowBase]; - column = column + -1; destIndex = destIndex + 1; rowBase = rowBase + 1; diagonal = diagonal + -400; - } while (0 < column); + } rowBase = 399; diagonalBase = 0x26f70; destIndex = scratch7 + 0x251; - blockRemaining = 200; column = scratch7 + 0x259; diagonal = 199; - do { + for (int blockRemaining = 200; blockRemaining != 0; blockRemaining--) { scratch6 = column; - runRemaining = 200; secondHalfIndex = destIndex + 200; firstHalfIndex = destIndex; column = diagonal; scratch7 = diagonalBase; - do { + for (int runRemaining = 200; runRemaining != 0; runRemaining--) { this->screenPointToTileNumber[firstHalfIndex] = tileGrid[scratch7 + column]; firstHalfIndex = firstHalfIndex + 1; column = column + -1; scratch7 = scratch7 + -400; - runRemaining = runRemaining + -1; - } while (runRemaining != 0); + } scratch7 = diagonal + 1; runRemaining = (scratch7 - diagonal) + 199; diagonal = ((scratch7 - diagonal) + rowBase) * 400; @@ -152,58 +140,49 @@ namespace Rendering { } while (-1 < runRemaining); rowBase = rowBase + -1; diagonalBase = diagonalBase + -400; - blockRemaining = blockRemaining + -1; column = scratch6 + 0x191; diagonal = scratch7; - } while (blockRemaining != 0); + } column = rowBase * 400; - diagonal = 200; destIndex = scratch6 + 0x189; - do { + for (int diagonal = 200; diagonal != 0; diagonal--) { this->screenPointToTileNumber[destIndex] = tileGrid[column + scratch7]; destIndex = destIndex + 1; scratch7 = scratch7 + -1; column = column + -400; - diagonal = diagonal + -1; - } while (diagonal != 0); + } scratch7 = 199; column = 80000; destIndex = scratch6 + 0x251; diagonal = scratch6 + 0x259; do { savedDestOffset2 = diagonal; - scratch6 = 200; secondHalfIndex = destIndex + 200; firstHalfIndex = destIndex; diagonal = column; - do { + for (int scratch6 = 200; 0 < scratch6; scratch6--) { this->screenPointToTileNumber[firstHalfIndex] = tileGrid[scratch7 + diagonal + scratch6]; - scratch6 = scratch6 + -1; firstHalfIndex = firstHalfIndex + 1; diagonal = diagonal + 400; - } while (0 < scratch6); + } column = column + -400; - scratch6 = 200; destIndex = destIndex + 0x191; diagonal = column; - do { + for (int scratch6 = 200; -1 < scratch6; scratch6--) { this->screenPointToTileNumber[secondHalfIndex] = tileGrid[scratch7 + diagonal + scratch6]; secondHalfIndex = secondHalfIndex + 1; diagonal = diagonal + 400; - scratch6 = scratch6 + -1; - } while (-1 < scratch6); + } scratch7 = scratch7 + -1; diagonal = savedDestOffset2 + 0x191; } while (0 < column); - column = 200; diagonal = 0; destIndex = savedDestOffset2 + 0x189; - do { + for (int column = 200; 0 < column; column--) { this->screenPointToTileNumber[destIndex] = tileGrid[diagonal + -1 + column]; - column = column + -1; destIndex = destIndex + 1; diagonal = diagonal + 400; - } while (0 < column); + } rowBase = 0; diagonalBase = 0; destIndex = savedDestOffset2 + 0x251; @@ -225,31 +204,27 @@ namespace Rendering { } while (0 < savedDestOffset2); scratch7 = column + -1; diagonal = ((scratch7 - column) + 1 + rowBase) * 400; - runRemaining = 200; destIndex = destIndex + 0x191; column = scratch7; - do { + for (int runRemaining = 200; -1 < runRemaining; runRemaining--) { this->screenPointToTileNumber[secondHalfIndex] = tileGrid[diagonal + column]; secondHalfIndex = secondHalfIndex + 1; column = column + 1; diagonal = diagonal + 400; - runRemaining = runRemaining + -1; - } while (-1 < runRemaining); + } rowBase = rowBase + 1; diagonalBase = diagonalBase + 400; column = scratch7; diagonal = scratch6 + 0x191; } while (0 < scratch7); column = rowBase * 400; - diagonal = 200; destIndex = scratch6 + 0x189; - do { + for (int diagonal = 200; 0 < diagonal; diagonal--) { this->screenPointToTileNumber[destIndex] = tileGrid[column + scratch7]; - diagonal = diagonal + -1; destIndex = destIndex + 1; scratch7 = scratch7 + 1; column = column + 400; - } while (0 < diagonal); + } for (int y = 0; y < 400; y++) { for (int x = 0; x < 400; x++) { this->DAT_BinaryTileMap400x400[y * 400 + x] = (0 < tileGrid[y * 400 + x]); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 2b64fb9f8..961bcabfe 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36391,7 +36391,7 @@ SHC_3BB0A8C1_0x004E1F50 | 0.0% | Pending SHC_3BB0A8C1_0x004E1FA0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E2050 | 28.9% | reg alloc; frame matches +SHC_3BB0A8C1_0x004E2050 | 30.7% | for loops, reg alloc differs SHC_3BB0A8C1_0x004E21E0 | 0.0% | Pending From 2d911180215c3ac320a9147d4d9a78e5f8c25928 Mon Sep 17 00:00:00 2001 From: Gynt Date: Tue, 29 Sep 2026 14:16:31 +0200 Subject: [PATCH 73/77] reimplement: SHC_3BB0A8C1_0x004E8430 49.62% Off-by-one fix, reg alloc --- .../ViewportRenderState/updateBuildingPreviewPosition.cpp | 2 +- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp index 252e0f743..aeb3d6992 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp @@ -330,7 +330,7 @@ namespace Rendering { this->viewportState.field21_0x54 = 0; if (hoveredBuildingID == -1) { - if (-1 < hoveredGateTile) { + if (-1 <= hoveredGateTile) { this->viewportState.mouseRayBuildingID = 0; this->viewportState.field21_0x54 = hoveredGateTile; } diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index 961bcabfe..d2b5d8aa0 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -37217,7 +37217,7 @@ SHC_3BB0A8C1_0x004E8429 | 0.0% | Pending SHC_3BB0A8C1_0x004E842A | 0.0% | Pending -SHC_3BB0A8C1_0x004E8430 | 49.6% | Style pass, reg alloc differs +SHC_3BB0A8C1_0x004E8430 | 49.6% | Off-by-one fix, reg alloc SHC_3BB0A8C1_0x004E8BFC | 0.0% | Pending From e0479c4af046388430aa0b15b441f9adceed2bf4 Mon Sep 17 00:00:00 2001 From: Gynt Date: Tue, 29 Sep 2026 14:34:15 +0200 Subject: [PATCH 74/77] reimplement: SHC_3BB0A8C1_0x004E2050 33.02% Walking pointers, reg alloc --- .../setTileSystemMemoryLookupArrays.cpp | 56 +++++++++++-------- status/addresses-SHC-3BB0A8C1.txt | 2 +- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp index 4f70efd07..4ede148ee 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp @@ -28,13 +28,16 @@ namespace Rendering { int rowWidth = 2; int rowStart = 0; int rowSpan = 398; - for (int row = 0; rowStart < 80000; row++) { - this->translationMatrix[row].distanceToCenter = rowSpan / 2; - this->translationMatrix[row].firstTileOfRow = tileNumber; - this->translationMatrix[row].addXgetTile = tileNumber - rowSpan / 2; + TranslationMatrixTriplet* rowEntry = this->translationMatrix; + for (; rowStart < 80000; rowEntry++) { + rowEntry->distanceToCenter = rowSpan / 2; + rowEntry->firstTileOfRow = tileNumber; + rowEntry->addXgetTile = tileNumber - rowSpan / 2; if (0 < rowWidth) { + int* gridRow = &tileGrid[rowFirstColumn + rowStart]; for (int column = 0; column < rowWidth; column++) { - tileGrid[rowFirstColumn + rowStart + column] = tileNumber; + *gridRow = tileNumber; + gridRow++; tileNumber = tileNumber + 1; } } @@ -46,16 +49,19 @@ namespace Rendering { rowStart = 80000; rowSpan = 400 - rowWidth; - for (int row = 200; rowStart < 160000; row++) { + rowEntry = &this->translationMatrix[200]; + for (; rowStart < 160000; rowEntry++) { rowFirstColumn = rowFirstColumn + 1; rowSpan = rowSpan + 2; rowWidth = rowWidth + -2; - this->translationMatrix[row].distanceToCenter = rowSpan / 2; - this->translationMatrix[row].firstTileOfRow = tileNumber; - this->translationMatrix[row].addXgetTile = tileNumber - rowSpan / 2; + rowEntry->distanceToCenter = rowSpan / 2; + rowEntry->firstTileOfRow = tileNumber; + rowEntry->addXgetTile = tileNumber - rowSpan / 2; if (0 < rowWidth) { + int* gridRow = &tileGrid[rowStart + rowFirstColumn]; for (int column = 0; column < rowWidth; column++) { - tileGrid[rowStart + rowFirstColumn + column] = tileNumber; + *gridRow = tileNumber; + gridRow++; tileNumber = tileNumber + 1; } } @@ -76,25 +82,28 @@ namespace Rendering { diagonalBase = 79600; destIndex = 0; column = 8; + int* destRow = this->screenPointToTileNumber; for (int runRemaining = 200; 0 < runRemaining; runRemaining--) { scratch7 = column; - secondHalfIndex = destIndex + 200; - firstHalfIndex = destIndex; + int* firstHalf = destRow; + destRow = destRow + 200; column = rowBase; diagonal = diagonalBase; for (int scratch6 = 200; 0 < scratch6; scratch6--) { - this->screenPointToTileNumber[firstHalfIndex] = tileGrid[diagonal + column]; - firstHalfIndex = firstHalfIndex + 1; + *firstHalf = tileGrid[diagonal + column]; + firstHalf++; diagonal = diagonal + -400; column = column + 1; } diagonalBase = diagonalBase + 400; destIndex = destIndex + 401; + int* secondHalf = destRow; + destRow = destRow + 201; column = rowBase; diagonal = diagonalBase; for (int scratch6 = 200; -1 < scratch6; scratch6--) { - this->screenPointToTileNumber[secondHalfIndex] = tileGrid[diagonal + column]; - secondHalfIndex = secondHalfIndex + 1; + *secondHalf = tileGrid[diagonal + column]; + secondHalf++; column = column + 1; diagonal = diagonal + -400; } @@ -112,17 +121,18 @@ namespace Rendering { rowBase = 399; diagonalBase = 0x26f70; destIndex = scratch7 + 0x251; + destRow = &this->screenPointToTileNumber[destIndex]; column = scratch7 + 0x259; diagonal = 199; for (int blockRemaining = 200; blockRemaining != 0; blockRemaining--) { scratch6 = column; - secondHalfIndex = destIndex + 200; - firstHalfIndex = destIndex; + int* firstHalf = destRow; + destRow = destRow + 200; column = diagonal; scratch7 = diagonalBase; for (int runRemaining = 200; runRemaining != 0; runRemaining--) { - this->screenPointToTileNumber[firstHalfIndex] = tileGrid[scratch7 + column]; - firstHalfIndex = firstHalfIndex + 1; + *firstHalf = tileGrid[scratch7 + column]; + firstHalf++; column = column + -1; scratch7 = scratch7 + -400; } @@ -130,11 +140,13 @@ namespace Rendering { runRemaining = (scratch7 - diagonal) + 199; diagonal = ((scratch7 - diagonal) + rowBase) * 400; destIndex = destIndex + 0x191; + int* secondHalf = destRow; + destRow = destRow + 201; column = scratch7; do { diagonal = diagonal + -400; - this->screenPointToTileNumber[secondHalfIndex] = tileGrid[diagonal + column]; - secondHalfIndex = secondHalfIndex + 1; + *secondHalf = tileGrid[diagonal + column]; + secondHalf++; column = column + -1; runRemaining = runRemaining + -1; } while (-1 < runRemaining); diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index d2b5d8aa0..407a5278c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -36391,7 +36391,7 @@ SHC_3BB0A8C1_0x004E1F50 | 0.0% | Pending SHC_3BB0A8C1_0x004E1FA0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E2050 | 30.7% | for loops, reg alloc differs +SHC_3BB0A8C1_0x004E2050 | 33.0% | Walking pointers, reg alloc SHC_3BB0A8C1_0x004E21E0 | 0.0% | Pending From 89211249331d201f46cf60761a6b82e25558918a Mon Sep 17 00:00:00 2001 From: Gynt Date: Tue, 29 Sep 2026 14:49:15 +0200 Subject: [PATCH 75/77] reimplement: SHC_3BB0A8C1_0x004E2050 33.02% Walking pointers, reg alloc --- .../ViewportRenderState/setTileSystemMemoryLookupArrays.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp index 4ede148ee..7a0508504 100644 --- a/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp +++ b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp @@ -80,7 +80,6 @@ namespace Rendering { this->field16_0x4e5fc = 0; rowBase = 0; diagonalBase = 79600; - destIndex = 0; column = 8; int* destRow = this->screenPointToTileNumber; for (int runRemaining = 200; 0 < runRemaining; runRemaining--) { @@ -96,7 +95,6 @@ namespace Rendering { column = column + 1; } diagonalBase = diagonalBase + 400; - destIndex = destIndex + 401; int* secondHalf = destRow; destRow = destRow + 201; column = rowBase; @@ -139,7 +137,6 @@ namespace Rendering { scratch7 = diagonal + 1; runRemaining = (scratch7 - diagonal) + 199; diagonal = ((scratch7 - diagonal) + rowBase) * 400; - destIndex = destIndex + 0x191; int* secondHalf = destRow; destRow = destRow + 201; column = scratch7; From 1f82e1ce26eba9128f000a58d074eb1dff10f901 Mon Sep 17 00:00:00 2001 From: Gynt Date: Tue, 29 Sep 2026 15:02:32 +0200 Subject: [PATCH 76/77] tools: give the batch build scripts build.bat PDB server fix build.bat gives each worktree its own _MSPDBSRV_ENDPOINT_ and kills its own mspdbsrv.exe before building. build_quiet.py --keep-going calls cmakew directly and syntax_check.py calls cl.exe directly, so neither inherited that, and a server already wedged before the build started survived build.bat kill and still failed with C1090. common.build_env derives the same endpoint name; common.kill_pdb_server stops only this worktree instance; build_quiet.py retries the build once after a C1090/C1033. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01NaSkbxngnm28vFqxp3wNZs (cherry picked from commit ac343b42f3beedeb55deb6a2afee2112c0f407ea) --- tools/reimplementation-helper/batch/README.md | 9 +++++- .../batch/build_quiet.py | 31 ++++++++++++++----- tools/reimplementation-helper/batch/common.py | 30 ++++++++++++++++++ .../batch/syntax_check.py | 5 +-- 4 files changed, 65 insertions(+), 10 deletions(-) diff --git a/tools/reimplementation-helper/batch/README.md b/tools/reimplementation-helper/batch/README.md index 1960076d5..52b283a61 100644 --- a/tools/reimplementation-helper/batch/README.md +++ b/tools/reimplementation-helper/batch/README.md @@ -12,7 +12,7 @@ rewrite sources, because the Visual Studio bundled one is too old for `.clang-fo | Script | Purpose | |---|---| -| `build_quiet.py [--keep-going]` | `build.bat RelWithDebInfo OpenSHC.dll`, prints only errors and `BUILD_OK`/`BUILD_FAIL` (build.bat exits 0 even on errors). | +| `build_quiet.py [--keep-going]` | `build.bat RelWithDebInfo OpenSHC.dll`, prints only errors and `BUILD_OK`/`BUILD_FAIL` (build.bat exits 0 even on errors). Retries once on a PDB server error, see the note below. | | `syntax_check.py [substr...]` | `cl /Zs` every (matching) list file serially; finds all compile errors in one pass without linking. | | `reccmp_report.py [--run] pct\|save\|cmp\|diff` | Match % and *normalized* % (call/tail-jump targets and resolver addresses ignored) per function, snapshots, before/after comparison, compact asm diffs. | | `orig_asm.py NAME [--both\|--stats]` | The **original** instruction stream of one function (not the interleaved diff), in address order; `--stats` reports the tells that decide how to reimplement it: `mov reg, 0` (handwritten asm), frame pointer (built /Od), frame size, jump tables. | @@ -92,3 +92,10 @@ bugs that Ghidra had decompiled wrongly. - A file whose `// FUNCTION:` address has no reccmp entry is reported as `--` / skipped. Check the address against `src/precomp/addresses-SHC-3BB0A8C1.hpp`. - Sources are always written as UTF-8 with LF line endings. +- Every script that runs `cl.exe` sets this worktree's own `_MSPDBSRV_ENDPOINT_` + (`common.build_env`), the same name `build.bat` derives. `mspdbsrv.exe` is a per-user + singleton keyed on that endpoint and each worktree carries its own toolchain copy, so a + shared endpoint makes `cl.exe` talk to the wrong server and fail with + `fatal error C1090: PDB API call failed`. `build_quiet.py` retries once after stopping + this worktree's `mspdbsrv.exe` (`common.kill_pdb_server`, never other worktrees'), which + clears a server that was already wedged before the build started. diff --git a/tools/reimplementation-helper/batch/build_quiet.py b/tools/reimplementation-helper/batch/build_quiet.py index 4b0367ab7..ad3633089 100644 --- a/tools/reimplementation-helper/batch/build_quiet.py +++ b/tools/reimplementation-helper/batch/build_quiet.py @@ -5,13 +5,19 @@ Prints BUILD_OK or BUILD_FAIL as the last line. build.bat exits 0 even on compile errors, so the log is scanned instead of trusting the exit code. --keep-going reruns the build with nmake /K to collect errors from more files. + +The build runs with this worktree's own _MSPDBSRV_ENDPOINT_ (see common.build_env), which is what +build.bat does too; --keep-going bypasses build.bat and would otherwise inherit whatever endpoint +happens to be set. A build that still dies with C1090/C1033 gets one retry after stopping this +worktree's mspdbsrv.exe, because a wedged PDB server survives the kill build.bat does up front. """ import argparse import re import subprocess +import sys -from common import TMP +from common import PDB_ERROR_RE, TMP, build_env, kill_pdb_server parser = argparse.ArgumentParser() parser.add_argument("--keep-going", action="store_true") @@ -19,14 +25,25 @@ args = parser.parse_args() log = TMP / "build.log" -with open(log, "w") as out: - subprocess.run(["cmd", "/c", r".\build.bat RelWithDebInfo OpenSHC.dll"], stdout=out, stderr=subprocess.STDOUT) -if args.keep_going: + + +def run_build(): with open(log, "w") as out: - subprocess.run(["cmd", "/c", r".\cmakew --build --preset RelWithDebInfo --target OpenSHC.dll -- /K"], - stdout=out, stderr=subprocess.STDOUT) + subprocess.run(["cmd", "/c", r".\build.bat RelWithDebInfo OpenSHC.dll"], + stdout=out, stderr=subprocess.STDOUT, env=build_env()) + if args.keep_going: + with open(log, "w") as out: + subprocess.run(["cmd", "/c", r".\cmakew --build --preset RelWithDebInfo --target OpenSHC.dll -- /K"], + stdout=out, stderr=subprocess.STDOUT, env=build_env()) + return log.read_text(errors="replace") + + +text = run_build() +if PDB_ERROR_RE.search(text): + print("note: PDB server error, stopping this worktree's mspdbsrv.exe and retrying", file=sys.stderr) + kill_pdb_server() + text = run_build() -text = log.read_text(errors="replace") errors = [line for line in text.splitlines() if re.search(r" error |warning C4700|warning C4715", line) and "U1077" not in line] for line in errors[:args.max]: diff --git a/tools/reimplementation-helper/batch/common.py b/tools/reimplementation-helper/batch/common.py index a5c05e54a..5287dbdbc 100644 --- a/tools/reimplementation-helper/batch/common.py +++ b/tools/reimplementation-helper/batch/common.py @@ -27,6 +27,36 @@ DIFF_JSON = Path("reccmp/dll/diff.json") FUNCTION_RE = re.compile(r"//\s*FUNCTION:\s*STRONGHOLDCRUSADER\s+(0x[0-9A-Fa-f]+)") +# ---------------------------------------------------------------- pdb server + +# mspdbsrv.exe is a per-user singleton keyed on _MSPDBSRV_ENDPOINT_, and every worktree carries its +# own copy of the toolchain. Sharing one endpoint makes cl.exe talk to whichever copy started first +# and fail with "fatal error C1090: PDB API call failed, error code '23'" (or C1033). build.bat +# derives this same name, so setting it here keeps the two in step and also covers the scripts that +# drive cl.exe or cmake directly instead of going through build.bat. +PDB_ENDPOINT = "openshc_" + ROOT.name +PDB_ERROR_RE = re.compile(r"fatal error C10(90|33)") + + +def build_env(): + """Environment for anything that runs cl.exe, with this worktree's PDB endpoint.""" + env = dict(os.environ) + env.setdefault("_MSPDBSRV_ENDPOINT_", PDB_ENDPOINT) + return env + + +def kill_pdb_server(): + """Stop this worktree's mspdbsrv.exe only. + + Killing every instance by image name takes down the PDB server of any other worktree that is + building at the same time and fails their build with the same C1090. + """ + subprocess.run(["powershell", "-NoProfile", "-Command", + "Get-Process mspdbsrv -ErrorAction SilentlyContinue | " + "Where-Object { $_.Path -like '%s*' } | " + "Stop-Process -Force -ErrorAction SilentlyContinue" + % str(ROOT).replace("'", "''")], + capture_output=True) def list_files(existing_only=True): diff --git a/tools/reimplementation-helper/batch/syntax_check.py b/tools/reimplementation-helper/batch/syntax_check.py index 5fde77df5..4f7212a9f 100644 --- a/tools/reimplementation-helper/batch/syntax_check.py +++ b/tools/reimplementation-helper/batch/syntax_check.py @@ -12,7 +12,7 @@ import subprocess import sys -from common import BUILD_DIR, ROOT, TMP, list_files +from common import BUILD_DIR, ROOT, TMP, build_env, list_files commands = json.loads((BUILD_DIR / "compile_commands.json").read_text()) template = next(c["command"] for c in commands if "OpenSHC.dll.dir" in c["command"]) @@ -30,7 +30,8 @@ bat = TMP / "syntax_check.bat" bat.write_text("\n".join(lines) + "\n") -result = subprocess.run(["cmd", "/c", str(bat.resolve())], capture_output=True, text=True) +result = subprocess.run(["cmd", "/c", str(bat.resolve())], capture_output=True, text=True, + env=build_env()) errors = [l for l in (result.stdout + result.stderr).splitlines() if " error " in l or "fatal" in l] for line in errors: print(re.sub(r"^.*src.OpenSHC.", "", line)[:260]) From ecaa96f0c4ee93a22e8925323bc87893e1ef118c Mon Sep 17 00:00:00 2001 From: Gynt Date: Tue, 29 Sep 2026 15:40:54 +0200 Subject: [PATCH 77/77] tools/batch: retry on a fresh PDB endpoint, not just a fresh server The cherry-picked fix recovers from a wedged mspdbsrv.exe by stopping this worktree''s instance and building again. C1090 has a second cause that recovery cannot reach: the endpoint name itself can wedge, outliving every mspdbsrv.exe that uses it, so retrying into the same name fails forever. Six consecutive builds failed that way here. Killing the server did not help, nor did deleting the PCH and both PDBs; the endpoint was correctly unique, not inherited from the environment, and the toolchain binaries matched a worktree that was building fine at that moment. The same tree then built first try under a different endpoint name, which is what identified the cause. build_quiet.py now takes a second retry on a fresh endpoint, and build_env() accepts an explicit one so a caller can pin it for a session. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01A4PvfebpUzaMXy93EutBjJ (cherry picked from commit 2826353e6c2ab3761e2a762ec28cfb6a4a403fb1) --- .../batch/build_quiet.py | 28 +++++++++++++++---- tools/reimplementation-helper/batch/common.py | 24 ++++++++++++++-- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/tools/reimplementation-helper/batch/build_quiet.py b/tools/reimplementation-helper/batch/build_quiet.py index ad3633089..7e29e9fd9 100644 --- a/tools/reimplementation-helper/batch/build_quiet.py +++ b/tools/reimplementation-helper/batch/build_quiet.py @@ -8,8 +8,16 @@ The build runs with this worktree's own _MSPDBSRV_ENDPOINT_ (see common.build_env), which is what build.bat does too; --keep-going bypasses build.bat and would otherwise inherit whatever endpoint -happens to be set. A build that still dies with C1090/C1033 gets one retry after stopping this -worktree's mspdbsrv.exe, because a wedged PDB server survives the kill build.bat does up front. +happens to be set. A build that dies with C1090/C1033 gets two retries, because that error has two +different causes: + + 1. a wedged PDB server, which survives the kill build.bat does up front -> stop this worktree's + mspdbsrv.exe and build again; + 2. a wedged *endpoint*, which outlives every mspdbsrv.exe using it -> build again on a fresh + endpoint name, since retrying into the same name fails forever. + +The second cost six consecutive builds once, across a regenerated PCH and PDBs, while the same tree +built first try under a different endpoint name. """ import argparse @@ -17,7 +25,7 @@ import subprocess import sys -from common import PDB_ERROR_RE, TMP, build_env, kill_pdb_server +from common import PDB_ERROR_RE, TMP, build_env, fresh_pdb_endpoint, kill_pdb_server parser = argparse.ArgumentParser() parser.add_argument("--keep-going", action="store_true") @@ -27,14 +35,14 @@ log = TMP / "build.log" -def run_build(): +def run_build(endpoint=None): with open(log, "w") as out: subprocess.run(["cmd", "/c", r".\build.bat RelWithDebInfo OpenSHC.dll"], - stdout=out, stderr=subprocess.STDOUT, env=build_env()) + stdout=out, stderr=subprocess.STDOUT, env=build_env(endpoint)) if args.keep_going: with open(log, "w") as out: subprocess.run(["cmd", "/c", r".\cmakew --build --preset RelWithDebInfo --target OpenSHC.dll -- /K"], - stdout=out, stderr=subprocess.STDOUT, env=build_env()) + stdout=out, stderr=subprocess.STDOUT, env=build_env(endpoint)) return log.read_text(errors="replace") @@ -43,6 +51,14 @@ def run_build(): print("note: PDB server error, stopping this worktree's mspdbsrv.exe and retrying", file=sys.stderr) kill_pdb_server() text = run_build() +if PDB_ERROR_RE.search(text): + # The endpoint itself can be wedged, in which case it outlives every mspdbsrv.exe using it and + # retrying into the same name fails forever. Move to a fresh one. + endpoint = fresh_pdb_endpoint() + print("note: PDB endpoint still failing, retrying on a fresh endpoint %s" % endpoint, + file=sys.stderr) + kill_pdb_server() + text = run_build(endpoint) errors = [line for line in text.splitlines() if re.search(r" error |warning C4700|warning C4715", line) and "U1077" not in line] diff --git a/tools/reimplementation-helper/batch/common.py b/tools/reimplementation-helper/batch/common.py index 5287dbdbc..64406b95c 100644 --- a/tools/reimplementation-helper/batch/common.py +++ b/tools/reimplementation-helper/batch/common.py @@ -38,10 +38,28 @@ PDB_ERROR_RE = re.compile(r"fatal error C10(90|33)") -def build_env(): - """Environment for anything that runs cl.exe, with this worktree's PDB endpoint.""" +def fresh_pdb_endpoint(): + """A previously unused endpoint name for this worktree. + + An endpoint can wedge in a way that outlives every mspdbsrv.exe using it: the name stays + unusable, and `cl.exe` keeps failing with C1090 no matter how often the server is killed and + restarted. Six consecutive builds failed that way once, across a fresh PCH and PDBs, while the + same tree built first try under a different name. So when killing the server does not help, + move to a new name rather than retrying into the same one. + """ + return "%s_%d" % (PDB_ENDPOINT, os.getpid()) + + +def build_env(endpoint=None): + """Environment for anything that runs cl.exe, with this worktree's PDB endpoint. + + An endpoint already set in the environment wins, so a caller can pin one for a whole session. + """ env = dict(os.environ) - env.setdefault("_MSPDBSRV_ENDPOINT_", PDB_ENDPOINT) + if endpoint: + env["_MSPDBSRV_ENDPOINT_"] = endpoint + else: + env.setdefault("_MSPDBSRV_ENDPOINT_", PDB_ENDPOINT) return env