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&); 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/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/src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp b/src/OpenSHC/Rendering/ViewportRenderState/clearAllFloatingLayerElements.cpp new file mode 100644 index 000000000..692dc74b0 --- /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 < this->availableFloaterIndex) { + for (; floaterIndex < 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/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp new file mode 100644 index 000000000..797383797 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/computeMouseTileFromScreenPosition.cpp @@ -0,0 +1,221 @@ +#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) { + + 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; + } + + 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; + } + + 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; + } + } 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 = 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); + } + } else { + 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; + } + } else { + this->viewportState.field24_0x60 = 0; + this->viewportState.mouseX = 0; + this->viewportState.mouseY = 0; + this->viewportState.field27_0x6c = 0; + } + } + +} +} 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/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp b/src/OpenSHC/Rendering/ViewportRenderState/createFloatingLayerElement.cpp new file mode 100644 index 000000000..c081fe66a --- /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 <= this->availableFloaterIndex) { + return; + } + + if (DAT_TileMapState::instance.FloatingLayer[tile] == 0) { + this->floatersArray[newFloaterIndex].id = 0; + } else { + ushort 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/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/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/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/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/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/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/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp new file mode 100644 index 000000000..d08665f04 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding.cpp @@ -0,0 +1,1776 @@ +#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; + + // FUNCTION: STRONGHOLDCRUSADER 0x004E3980 + void ViewportRenderState::renderGmOverlayBuilding(int tileIndex, int xUnk, int yUnk, int param_4) + { + short sVar1; + BuildingTypeShort buildingType; + int iVar6; + int* piVar7; + uint uVar8; + int iVar9; + int iVar10; + int frame; + GmID overlayGmID; + eGM gmID; + GmID maskGmID; + int local_18; + int local_14; + int local_10; + int local_8; + int local_4; + + 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 || (frame = 0x20 - ((int)sVar1 << 5) / 5, frame == 0x20)) { + frame = 0; + } + 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) { + 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, frame, + (xUnk - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x55].originX) + -5, + (yUnk - DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x55].originY) + + -0x59, + OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC, frame + 0x65, 0); + } + } else { + iVar6 = 0; + if (DAT_TileMapState::instance.field93_0x5548c8 != 0) { + return; + } + switch (buildingType) { + case OpenSHC::Map::Buildings::BT_WOODCUTTERSHUT: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, 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)(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)(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: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + -0x27, yUnk + -0x21); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_IRON_MINER; + if (frame != 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, 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, frame, + local_18 + xUnk, local_14 + yUnk, + (int)(DAT_BuildingsState::instance.buildings[tileIndex].field208_0x292)); + } + } + 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, frame, xUnk + -0x1f, yUnk + -0x59); + } + 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, frame, xUnk + -0x17, yUnk + -0x36); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 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, 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, frame, 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, 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, frame, 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, 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, frame, iVar9, iVar6); + } + break; + case OpenSHC::Map::Buildings::BT_PITCHRIG: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_HUNTERSHUT: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + -0x25, yUnk + -0x56); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_HUNTER; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_MERCENARYPOST: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_BARRACKS: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, 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; + overlayGmID = OpenSHC::IO::Graphics::GID_ANIM_GOODS; + local_8 = 0; + } else { + overlayGmID = OpenSHC::IO::Graphics::GID_ANIM_SHIELDS; + local_8 = -10; + iVar10 = DAT_TextureRenderCoreObject::instance.gmFileHeaderColorpaletteArray[0x68].originY; + } + int blendFrame = DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = overlayGmID; + if ((blendFrame != 0) && (iVar6 == iVar9)) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(overlayGmID, + DAT_BuildingsState::instance.buildings[tileIndex].field29_0x5c, + (xUnk + - (int)DAT_GMImageHeaders::instance + .imh[blendFrame + GMTotalPicturesProcessed::instance[overlayGmID] + -1] + .width + / 2) + + 0xf + local_8, + (yUnk + - DAT_GMImageHeaders::instance + .imh[blendFrame + GMTotalPicturesProcessed::instance[overlayGmID] + -1] + .height) + + -0xf + iVar10, + 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)(overlayGmID, + DAT_BuildingsState::instance.buildings[tileIndex].shouldRenderSomeOverlay, + (xUnk + - (int)DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] + .width + / 2) + + 0xf + local_8, + (yUnk + - DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] + .height) + + -0xf + iVar10, + 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)(overlayGmID, + DAT_BuildingsState::instance.buildings[tileIndex].field37_0x7c, + (xUnk + - (int)DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] + .width + / 2) + + 0xf + local_8, + (yUnk + - DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] + .height) + + -0xf + iVar10, + 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)(overlayGmID, iVar9, + (xUnk + - (int)DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] + .width + / 2) + + 0xf + local_8, + (yUnk + - DAT_GMImageHeaders::instance + .imh[iVar9 + GMTotalPicturesProcessed::instance[overlayGmID] + -1] + .height) + + -0xf + iVar10, + frame); + } + if (param_4 + == *(int*)(DAT_BuildingsState::instance.buildings[tileIndex].workers + local_4 * 2 + 8)) { + DAT_RenderedUnitOwner::instance + = DAT_BuildingsState::instance.buildings[tileIndex].playerColorUnk; + frame = DAT_BuildingsState::instance.buildings[tileIndex].field36_0x78; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + } + break; + } + case OpenSHC::Map::Buildings::BT_FLETCHER: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_BLACKSMITH: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + -0x25, yUnk + -0x7b); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 2; + DAT_CurrentlyRenderedSpriteID::instance = 0x3a; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_WORKSHOP_SMITH_ANIMS, frame, xUnk + -0x23, yUnk + -0x49); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_SMOKE_30X30; + if (frame != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + 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: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_ARMOURER: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_BAKERY: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + -0x25, yUnk + -0x7b); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = 0x42; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_WORKSHOP_BAKER_ANIMS, frame, xUnk + -0x14, yUnk + -0x5f); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_SMOKE_30X30; + if (frame != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_SMOKE_30X30, frame, xUnk + -4, yUnk + -0x8c, 0x10); + } + break; + case OpenSHC::Map::Buildings::BT_BREWERY: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + -0x25, yUnk + -0x7b); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 2; + DAT_CurrentlyRenderedSpriteID::instance = 0x33; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_WORKSHOP_BREW_ANIMS, frame, xUnk + -0x3c, yUnk + -0x44); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_SMOKE_30X30; + if (frame != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_SMOKE_30X30, frame, 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + 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)((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), + frame); + } + break; + case OpenSHC::Map::Buildings::BT_QUARRY: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + -0x26, yUnk + -0x3c); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 1; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_QUARRY; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_QUARRY_ANIMS, frame, xUnk + 0xc, yUnk + -0x8c); + } + 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, frame, xUnk + -0x31, yUnk + -0x88); + } + 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, frame, xUnk + -0x20, yUnk + -0x6b); + } + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_INN: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + -0x45, yUnk + -0x95); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_INN; + if (frame != 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::DE::SHCDE::GM_ANIM_INN, frame, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk); + } + 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, frame, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk); + } + 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, frame, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetX + xUnk, + DAT_BuildingsState::instance.buildings[tileIndex].spriteOffetY + yUnk); + } + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_APOTHECARY: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_ENGINEERSGUILD: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_TUNNELERSGUILD: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_MARKETPLACE: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_OILSMELTER: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + 3, yUnk + -0x7d); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_BOILED_OIL; + if (frame != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, DAT_TextureRenderCoreObject::ptr)( + OpenSHC::DE::SHCDE::GM_OIL_ANIMS, frame, xUnk + -0x23, yUnk + -0x3e); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { + iVar9 = xUnk + -0x23; + if (frame < 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_WHEATFARM: + case OpenSHC::Map::Buildings::BT_HOPFARM: + case OpenSHC::Map::Buildings::BT_APPLEFARM: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_DAIRYFARM: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + -0x37, yUnk + -0x6d); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FARMER; + 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, frame, xUnk + -0x23, yUnk + -0x51); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, frame, + xUnk + -0x23, yUnk + -0x51, (int)(sVar1)); + } + } + 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, frame, xUnk + -0x23, yUnk + -0x51); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_FARMER, frame, + xUnk + -0x23, yUnk + -0x51, (int)(sVar1)); + } + } + 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, frame, xUnk + -0x23, yUnk + -0x51); + } + 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, frame, 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, frame); + } + 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, frame, xUnk + -0x4e, yUnk + -0xd0); + } + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_STABLES: + frame = DAT_BuildingsState::instance.buildings[tileIndex].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, xUnk + -0x12, yUnk + -99); + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field23_0x44; + DAT_RenderedUnitOwner::instance = 0; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_STABLES; + if (frame != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + 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, frame, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, + xUnk + -0x50, yUnk + -0x6b, (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, frame, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, + xUnk + -0x50, yUnk + -0x6b, (int)(sVar1)); + } + } + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field22_0x40; + if (frame != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + 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, frame, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, + xUnk + -0x3a, yUnk + -0x60, (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, frame, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, + xUnk + -0x3a, yUnk + -0x60, (int)(sVar1)); + } + } + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field21_0x3c; + if (frame != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + 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, frame, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, + xUnk + -0x24, yUnk + -0x55, (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, frame, iVar9, iVar6); + } else { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, + xUnk + -0x24, yUnk + -0x55, (int)(sVar1)); + } + } + } + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + if (frame != 0) { + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + if (frame < 0x26) { + if (sVar1 == 0) { + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + DAT_TextureRenderCoreObject::ptr)( + 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, frame, + xUnk + -0xe, yUnk + -0x4a, (int)(sVar1)); + } + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field66_0xbe; + if (sVar1 == 0) { + iVar6 = yUnk + -0x49; + iVar9 = xUnk + -2; + frame = 0x26; + gmID = OpenSHC::DE::SHCDE::GM_STABLE_ANIMS; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGM, + 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, 0x26, xUnk + -0xd, yUnk + -0x49, (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, frame, iVar9, iVar6); + break; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_ANIM_STABLES, frame, + xUnk + -0xe, yUnk + -0x4a, (int)(sVar1)); + } + } + break; + case OpenSHC::Map::Buildings::BT_CHAPEL: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_CHURCH: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_CATHEDRAL: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field39_0x84; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_STONEKEEP: + if ((DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_STRONGHOLD: + if ((DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_GATEHOUSELARGE: + 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, frame, xUnk + -7, yUnk + -0xc1); + } + 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, frame, xUnk + -0x60, yUnk + -0xc1); + } + 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, frame, xUnk + 3, yUnk + -0x5b); + } + 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, frame, xUnk + -0x33, yUnk + -0x5b); + } + 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, frame, xUnk + 0x11, yUnk + -0x5e); + } + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_GATEHOUSESMALL: + 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, frame, xUnk + 5, yUnk + -0xb2); + } + 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, frame, xUnk + -0x40, yUnk + -0xb1); + } + 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, frame, xUnk + -0xd, yUnk + -0x53); + } + 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, frame, xUnk + -0x23, yUnk + -0x53); + } + 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, frame, xUnk, yUnk + -0x58); + } + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_WOODGATE1: + 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, frame, xUnk + 3, yUnk + -0x6e); + } + 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, frame, xUnk + -0x20, yUnk + -0x6a); + } + 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, frame, xUnk + -0x20, yUnk + -0x46); + } + 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, frame, xUnk + 8, yUnk + -0x47); + } + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 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, frame, xUnk + 0x11, yUnk + -0x37); + } + 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, frame, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_DRAWBRIDGE: + 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, frame, xUnk + 7, yUnk + -0x7c); + } + 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, frame, iVar9, iVar6); + break; + } + break; + case OpenSHC::Map::Buildings::BT_TOWER1: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 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, frame, xUnk + -0x21, yUnk + -0x140); + } + 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, frame, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER2: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 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, frame, xUnk + -0x30, yUnk + -0xc2); + } + 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, frame, xUnk + -0x29, yUnk + -0x93); + } + 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, frame, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER3: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 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, frame, xUnk + -0x3f, yUnk + -0xe1); + } + 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, frame, xUnk + -0x29, yUnk + -0x96); + } + 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, frame, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER4: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 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, frame, xUnk + -0x4d, yUnk + -0xf6); + } + 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, frame, xUnk + -0x39, yUnk + -0x9a); + } + 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, frame, xUnk + 0xf, yUnk + -0x96); + } + 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, frame, xUnk + -0x4d, yUnk + -0x13b); + } + 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, frame, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_TOWER5: + if (DAT_BuildingsState::instance.buildings[tileIndex].field62_0xb0 == 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, frame, xUnk + -0x4c, yUnk + -0x104); + } + 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, frame, xUnk + -0x32, yUnk + -0x9d); + } + 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, frame, iVar9, iVar6); + break; + } + } + break; + case OpenSHC::Map::Buildings::BT_CHOPPINGBLOCK: + frame = DAT_BuildingsState::instance.buildings[tileIndex].field20_0x38; + DAT_CurrentlyRenderedSpriteID::instance = OpenSHC::IO::Graphics::GID_ANIM_CHOPPING_BLOCK; + DAT_RenderedUnitOwner::instance = 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, frame, iVar9, iVar6); + break; + } + } + } + } + frame = DAT_BuildingDefinedData::instance + .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]; + int barXOffset = 0; + int barYOffset = 0; + if (frame == 0) { + uVar8 = DAT_BuildingsState::instance.buildings[tileIndex].widthOrHeight; + 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 + && 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)(sVar1)); + switch (DAT_BuildingsState::instance.buildings[tileIndex].buildingType) { + case OpenSHC::Map::Buildings::BT_GATEHOUSELARGE: + barYOffset = barYOffset + 0x14; + break; + case OpenSHC::Map::Buildings::BT_GATEHOUSESMALL: + barYOffset = barYOffset + 0x1e; + break; + case OpenSHC::Map::Buildings::BT_SIEGETOWER_PLACED: + barYOffset = barYOffset + -0x1e; + break; + case OpenSHC::Map::Buildings::BT_TOWER2: + barYOffset = barYOffset + 0x50; + break; + case OpenSHC::Map::Buildings::BT_TOWER3: + case OpenSHC::Map::Buildings::BT_TOWER4: + barYOffset = barYOffset + 0x5a; + break; + case OpenSHC::Map::Buildings::BT_TOWER5: + barYOffset = barYOffset + 100; + } + if ((uint)(iVar6 / 10) < 0xb) { + 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 { + 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))) { + 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, frame + -0xc); + } + } else { + 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, frame + -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) { + uVar8 = DAT_TileMapState::instance.field161_0x5549c0 - 1U & 0x80000007; + if ((int)uVar8 < 0) { + uVar8 = (uVar8 - 1 | 0xfffffff8) + 1; + } + 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; + overlayGmID = OpenSHC::IO::Graphics::GID_FLOAT_POP_CIRC; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + 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)) { + 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; + overlayGmID = OpenSHC::IO::Graphics::GID_FLOATS_NEW; + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)(overlayGmID, iVar6, xUnk + -0x23, iVar9 + -0x2a, maskGmID, frame, 0); + } + } + sVar1 = DAT_BuildingsState::instance.buildings[tileIndex].field68_0xc2; + if (sVar1 == 1) { + frame = DAT_TileMapState::instance.field161_0x5549c0 + 0x10; + iVar6 = DAT_TileMapState::instance.field161_0x5549c0; + } else { + if (sVar1 != 2) { + return; + } + frame = 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, xUnk + -0x23, + ((yUnk + - DAT_BuildingDefinedData::instance + .BuildingHeights[(short)DAT_BuildingsState::instance.buildings[tileIndex].buildingType]) + - barXOffset) + + -0x2a, + OpenSHC::IO::Graphics::GID_FLOATS_NEW, frame, 0); + DAT_BuildingsState::instance.buildings[tileIndex].field68_0xc2 = 0; + } + +} +} diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp new file mode 100644 index 000000000..a0c7d8a81 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderGmOverlayBuilding2.cpp @@ -0,0 +1,651 @@ +#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; + + // 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) { + 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)) { + 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; + 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); + } + } + } + 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)) + || (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); + } + 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 { + 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)(); + } + } + } + +} +} diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp new file mode 100644 index 000000000..b126d0da3 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderMap.cpp @@ -0,0 +1,2785 @@ +#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; + + // 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; + int bVar12; + int bVar13; + int bVar14; + byte bVar15; + int layerTileIndex; + 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 unitID; + int local_5c; + uint entityID; + 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; + int _flatView; + int _viewportHeight; + int viewportWidth; + + iVar31 = 0; + iVar28 = 0; + _displayLayerLogicalValue = 0; + local_1c = 0; + local_5c = 600; + _flatView = 0; + 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 = 1; + } + 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; + layerTileIndex = ((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 = layerTileIndex + -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 + layerTileIndex + -8] + - this + ->translationMatrix[this->tileTranslationMatrix_YComponent[this + ->screenPointToTileNumber[_yOffset_01 * 0x191 + layerTileIndex + -8]]] + .addXgetTile); + this->viewportState.tileCenterY = iVar26 + + this->tileTranslationMatrix_YComponent[this->screenPointToTileNumber[_yOffset_01 * 0x191 + layerTileIndex + -8]]; + DAT_TextureRenderCoreObject::instance.isZoom2 = this->viewportState.isZoomedOutUnk; + if (this->viewportState.isZoomedOutUnk == 0) { + layerTileIndex = DAT_WindowAndDirectDraw::instance.resolutionY + 0x18; + } else { + layerTileIndex = DAT_WindowAndDirectDraw::instance.resolutionY * 2 + 0x20; + } + MACRO_CALL_MEMBER(OpenSHC::UI::Rendering::TextureRenderCore_Func::setMapSurfaceHeightRange, + 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); + 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) { + 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[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[layerTileIndex]; + } else if (this->DAT_MapEditorDisplayLayer == 2) { + _displayLayerLogicalValue = (uint)(char)DAT_TileMapState::instance.PathLinkageLayer[layerTileIndex]; + } + 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]; + 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[layerTileIndex]; + if ((DAT_00ed3148::instance & 0x200) != 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[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[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[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[layerTileIndex] + = DAT_TileMapState::instance.WallGFXLayer[layerTileIndex] + 1; + } + DAT_00ed314c::instance = (uint)DAT_TileMapState::instance.WallGFXLayer[layerTileIndex]; + if ((bVar15 & 7) == 0) { + if (511 < DAT_00ed314c::instance) { + 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[layerTileIndex]; + } else { + if (bVar19 == 1) { + if (0x1fe < DAT_00ed314c::instance) { + 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[layerTileIndex] = 0; + DAT_00ed314c::instance = 0; + } + DAT_GmImageAddressToBeRendered::instance + = (int)(char)DAT_MapRenderDefinedData::instance + .field617_0xb24[DAT_00ed314c::instance] + + (uint)DAT_TileMapState::instance.GfxLayer[layerTileIndex]; + goto LAB_004e9845; + } + if (0xfe < DAT_00ed314c::instance) { + 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[layerTileIndex]; + } + } else { + DAT_00ed3170::instance = (uint)DAT_TileMapState::instance.ShowHiLayer[layerTileIndex]; + DAT_RenderMap_YOffset::instance + = DAT_TileMapState::instance + .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[layerTileIndex]; + DAT_00ed314c::instance + = (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[layerTileIndex]; + goto LAB_004e96a7; + } + } else { + DAT_00ed3154::instance + = -(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[layerTileIndex]; + } + } else { + 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[layerTileIndex]; + LAB_004e96a7: + DAT_00ed3154::instance = -(uint)((bVar15 & 0x20) != 0) & 0x5a; + } + } else { + DAT_00ed3154::instance + = -(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[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[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[layerTileIndex] & 8) == 0) { + uVar10 = DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex]; + if ((char)uVar10 < '\0') { + DAT_GmImageAddressToBeRendered::instance + = (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) { + if ((uVar10 & 0x100) == 0) { + if ((uVar10 & 0x200) == 0) { + DAT_00ed314c::instance = uVar32 & 7; + piVar21 = this->landscapeSeaWhiteCapsAnimationFrames; + _yOffset_01 = 9; + do { + if (layerTileIndex == piVar21[-60]) { + local_2c = *piVar21 + 1 + (uVar32 & 3) * 8; + } + if (layerTileIndex == piVar21[-0x3b]) { + local_2c = piVar21[1] + 1 + (uVar32 & 3) * 8; + } + if (layerTileIndex == piVar21[-0x3a]) { + local_2c = piVar21[2] + 1 + (uVar32 & 3) * 8; + } + if (layerTileIndex == piVar21[-0x39]) { + local_2c = piVar21[3] + 1 + (uVar32 & 3) * 8; + } + if (layerTileIndex == 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[layerTileIndex] + + DAT_MapRenderDefinedData::instance + .field614_0x6a4[this->unknownCounterUntil_0x20] + * 0x22; + } + } else { + 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) { + 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[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[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[layerTileIndex]; + if (_flatView != 0) { + DAT_RenderMap_YOffset::instance = 8; + if (this->DAT_MapEditorDisplayLayer == 0) { + 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[layerTileIndex]; + 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[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[layerTileIndex] == 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[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) { + 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[layerTileIndex]; + 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 + || (_yOffset_01 + = MACRO_CALL_MEMBER(OpenSHC::Map::TileMapState_Func::returnOwnedMoatAtTile, + DAT_TileMapState::ptr)(layerTileIndex), + 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[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[layerTileIndex]]; + } + } else { + LAB_004e9b3c: + bVar12 = 1; + bVar14 = 1; + } + 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[unitID].moveDelay & 0x3f) + + GMTotalPicturesProcessed::instance[0x26]; + } + if ((DAT_00ed3148::instance & 8) != 0 + && (DAT_TileMapState::instance.MiscDisplayLayer[layerTileIndex] & 0x2000) == 0 && _flatView == 0) { + DAT_RenderMap_YOffset::instance + = DAT_TileMapState::instance + .heightBasedScreenYOffset[DAT_TileMapState::instance.HeightLayer[layerTileIndex] + 4]; + } + if (local_54 != 0) { + uVar9 = *this->viewportState.ptrColor; + *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + } + 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)(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) { + _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)(((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)( + + (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 (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *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[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[layerTileIndex]; + DAT_GmImageAddressToBeRendered::instance + = (uint)DAT_TileMapState::instance.AlphaGFXLayer[layerTileIndex]; + 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)(((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), + _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)(DAT_GmImageAddressToBeRendered::instance), _yOffset_01, + (int)(iVar26 + DAT_RenderMap_DrawSomeY::instance)); + } + } + LAB_004e9e36: + _yOffset_01 = DAT_RenderMap_YOffset::instance; + uVar32 = (uint)DAT_TileMapState::instance.FloatingLayer[layerTileIndex]; + if (uVar32 != 0) { + if ((DAT_TileMapState::instance.refreshRelatedOne != 0) && (_flatView == 0)) { + 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 + == 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[layerTileIndex]; + 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[layerTileIndex] & 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)(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)(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; + GVar11 = (GmID)this->floatersArray[uVar32].gmID; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)((GmID)GVar11, iVar26, + (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 { + 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 (entityID != 0) { + while ((iVar26 = DAT_RenderMap_YOffset::instance, _yOffset_01 = _yOffset_01 + 1, + _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[entityID].imageID != 0) { + DAT_RenderedUnitOwner::instance + = DAT_EntityState::instance.entityArray[entityID].colorUnk; + DAT_CurrentlyRenderedSpriteID::instance + = (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 { + iVar26 = DAT_RenderMap_YOffset::instance + 0x14; + } + } + } else { + local_54 = (uint)DAT_TileMapState::instance.BuildingLayer[layerTileIndex]; + 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[entityID].x1 + - (int)DAT_EntityState::instance.entityArray[entityID].originX) + + DAT_RenderMap_DrawSomeX::instance, + (((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[entityID].imageID)), 0x14, + 0, 0); + } + iVar26 = (int)DAT_EntityState::instance.entityArray[entityID].nextEntityOnThisTileByID; + if (entityID == iVar26 || DAT_GameSynchronyState::instance.syncStatus != 0 + || (entityID = iVar26, iVar26 == 0)) + break; + } + } + 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[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), layerTileIndex); + } + /* + ------ BEGIN RENDER UNITS ------ + */ + + if ((unitID != 0) + && (MACRO_CALL_MEMBER( + OpenSHC::Map::Units::UnitsState_Func::triggerDesyncIfTileUnitLinkageInvalid, + DAT_UnitsState::ptr)(layerTileIndex), + 0 < unitID)) { + while (_yOffset_01 = DAT_RenderMap_DrawSomeX::instance, + DAT_UnitsState::instance.units[unitID].logicalState + != OpenSHC::Map::Units::ULS_INVISIBLE) { + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_UnitsState::instance.units[unitID].spriteID; + local_2c = 0; + 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])) { + iVar26 = DAT_UnitsState::instance.units[unitID].assassinsMicroDistanceToEnemyUnk; + if (iVar26 <= 160 + || (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[unitID].idleCounterUnk < 0x961))) { + local_2c = 0x10; + } + goto LAB_004ea2c6; + } + if ((DAT_GameSynchronyState::instance.currentGameMode == OpenSHC::Game::GM_SOLITARY) + && (0x960 < DAT_UnitsState::instance.units[unitID].idleCounterUnk)) + goto LAB_004ea2c6; + } else { + LAB_004ea2c6: + if (DAT_UnitsState::instance.units[unitID].field40_0x5a == 0) { + DAT_RenderedUnitOwner::instance + = DAT_UnitsState::instance.units[unitID].calculatedOwnerPlayerIndex; + } else { + DAT_RenderedUnitOwner::instance = 9; + } + iVar18 = GMTotalPicturesProcessed::instance[DAT_CurrentlyRenderedSpriteID::instance]; + 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[unitID].negativeHeight + - (int)DAT_UnitsState::instance.units[unitID].buildingHeight) + + DAT_RenderMap_YOffset::instance; + } else { + iVar25 = (uint)(byte)DAT_UnitsState::instance.units[unitID].padding_0x83[0] + + (int)DAT_UnitsState::instance.units[unitID].terrainOrClimbHeight; + } + } + 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[unitID].field41_0x5c + - DAT_UnitsState::instance.units[unitID].field22_0x2a) + + (short)_yOffset_01 + sVar30; + 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[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[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[unitID].vanish; + DAT_UnitsState::instance.units[unitID].drawHeight1 = sVar24; + if (_yOffset_01 == 0) { + _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[layerTileIndex] & 0x10) == 0 + || DAT_UnitsState::instance.units[unitID].field43_0x64 == -1) { + if ((DAT_00ed3148::instance & 0x400) == 0) { + if ((DAT_UnitsState::instance.units[unitID].unitType + == OpenSHC::Map::Units::UT_A_ASSASSIN) + && (_yOffset_01 = DAT_UnitsState::instance.units[unitID].imageID2, + _yOffset_01 != 0)) { + sVar24 = DAT_UnitsState::instance.units[unitID].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[unitID].field59_0x86 + + sVar20)), + (int)(sVar5), + (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[unitID].drawYOffset; + if (sVar30 != 0) { + sVar20 = DAT_UnitsState::instance.units[unitID].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[unitID].drawX, + (int)(sVar20 + + 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 + [GMTotalPicturesProcessed::instance + [DAT_CurrentlyRenderedSpriteID::instance] + + -1 + (int)sVar30] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData))), + 0x20 - iVar27); + } + } + uVar9 = *this->viewportState.ptrColor; + *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + bVar15 = DAT_UnitsState::instance.units[unitID] + .disappearFadeAlphaCountdown; + if (bVar15 == 0) { + if (DAT_UnitsState::instance.units[unitID].graphicSize == 4) { + MACRO_CALL_MEMBER(OpenSHC::Rendering::ViewportRenderState_Func:: + renderAssassinClimbingOverlay, + this)(unitID); + } + sVar30 = DAT_UnitsState::instance.units[unitID].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[unitID].drawX, + (int)(sVar30 + DAT_UnitsState::instance.units[unitID].drawY), + (int)(( + 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[unitID].graphicSize; + if ((sVar30 != 4) && (1 < sVar30)) { + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_UnitsState::instance.units[unitID].gmIDUnk; + DAT_RenderedUnitOwner::instance + = (uint)DAT_UnitsState::instance.units[unitID] + .displayColorPlayerID; + _yOffset_01 + = DAT_UnitsState::instance.units[unitID].imageIDUnk; + if (0 < _yOffset_01) { + sVar30 + = DAT_UnitsState::instance.units[unitID].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[unitID].drawX, + (int)(sVar30 + + DAT_UnitsState::instance.units[unitID].drawY), + (int)(DAT_UnitsState::instance.units[unitID] + .drawWidth), + DAT_UnitsState::instance.units[unitID].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[unitID].graphicSize) { + _yOffset_01 = DAT_UnitsState::instance.units[unitID].imageID2; + if (0 < _yOffset_01) { + sVar30 + = DAT_UnitsState::instance.units[unitID].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[unitID].drawX, + (int)(sVar30 + + DAT_UnitsState::instance.units[unitID].drawY), + (int)(DAT_UnitsState::instance.units[unitID] + .drawWidth), + DAT_UnitsState::instance.units[unitID].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[unitID].unitType; + if ((UVar7 == OpenSHC::Map::Units::UT_S_TOWER) + && (DAT_UnitsState::instance.units[unitID].dying + == 0)) { + _yOffset_01 + = (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; + 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[unitID].dying + != 0)) + goto LAB_004eadfa; + _yOffset_01 + = (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: + _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[unitID].owner; + DAT_CurrentlyRenderedSpriteID::instance + = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + uVar32 = DAT_UnitsState::instance.units[unitID].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)(uVar32 / 2 + 1), _yOffset_01, iVar26); + } + } + LAB_004eadfa: + if (*this->viewportState.ptrColor + == COL_MAGENTA::instance.shortValue) { + *this->viewportState.ptrColor = uVar9; + } else { + 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[unitID].drawX, + (int)(DAT_UnitsState::instance.units[unitID].drawY), + (int)(( + int)(DAT_UnitsState::instance.units[unitID].drawWidth)), + (int)(( + int)(DAT_UnitsState::instance.units[unitID].drawHeight1)), + (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData))), + (int)((char)bVar15)); + if (*this->viewportState.ptrColor + == COL_MAGENTA::instance.shortValue) { + *this->viewportState.ptrColor = uVar9; + } else { + this->viewportState.mouseRayUnitID = unitID; + this->viewportState.mouseRayBuildingID = 0; + } + } + 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[unitID].drawWidth + -0x16) + / 2; + if (DAT_UnitsState::instance.units[unitID].unitType + == OpenSHC::Map::Units::UT_LORD) { + sVar30 = DAT_UnitsState::instance.units[unitID] + .maxHealthRatingLord; + if (sVar30 == 0) { + iVar26 = DAT_UnitsState::instance.units[unitID] + .someDrawYOffset + + -6 + + (int)DAT_UnitsState::instance.units[unitID].drawY; + iVar27 = DAT_UnitsState::instance.units[unitID].drawX + + _yOffset_01; + iVar18 = DAT_UnitsState::instance.units[unitID].healthbar + + 0x11; + } else { + iVar26 = DAT_UnitsState::instance.units[unitID] + .someDrawYOffset + + -8 + + (int)DAT_UnitsState::instance.units[unitID].drawY; + iVar27 = DAT_UnitsState::instance.units[unitID].drawX + + _yOffset_01; + iVar18 = DAT_UnitsState::instance.units[unitID].healthbar + + 0xe4 + sVar30 * 0xb; + } + } else { + iVar26 + = DAT_GameState::instance + .playerDataArray + [DAT_UnitsState::instance.units[unitID].owner] + .fearFactorLevel; + if (iVar26 == 0) { + iVar26 = DAT_UnitsState::instance.units[unitID] + .someDrawYOffset + + -6 + + (int)DAT_UnitsState::instance.units[unitID].drawY; + iVar27 = DAT_UnitsState::instance.units[unitID].drawX + + _yOffset_01; + iVar18 = DAT_UnitsState::instance.units[unitID].healthbar + + 0x11; + } else { + if (iVar26 < 1) { + iVar18 = iVar26 * -0xb + 0xad; + } else { + iVar18 = iVar26 * 0xb + 0x76; + } + iVar26 = DAT_UnitsState::instance.units[unitID] + .someDrawYOffset + + -8 + + (int)DAT_UnitsState::instance.units[unitID].drawY; + iVar27 = DAT_UnitsState::instance.units[unitID].drawX + + _yOffset_01; + iVar18 = DAT_UnitsState::instance.units[unitID].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[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 + < 0xa1 + || ((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))))) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func:: + renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)( + OpenSHC::IO::Graphics::GID_INTERFACE_ICONS_2, 0x1bf, + DAT_UnitsState::instance.units[unitID].drawX + 2 + + _yOffset_01, + (int)(DAT_UnitsState::instance.units[unitID] + .someDrawYOffset + + -0x1b + + DAT_UnitsState::instance.units[unitID].drawY), + 0x10); + } + } + 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[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[unitID].field46_0x6e = 0; + } + sVar30 = DAT_UnitsState::instance.units[unitID].field45_0x6c; + if (sVar30 == 1) { + iVar26 = DAT_TileMapState::instance.field161_0x5549c0 + 0x30; + 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[unitID].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[unitID].someDrawYOffset + - iVar18) + + (int)DAT_UnitsState::instance.units[unitID].drawY; + _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[unitID].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[unitID].someDrawYOffset + - iVar18) + + (int)DAT_UnitsState::instance.units[unitID].drawY; + _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:: + 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[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[unitID] + .facingDirectionMapOrientationCorrected, + sVar24 != 2 && (sVar24 != 6))) + goto LAB_004ea49b; + if ((DAT_UnitsState::instance.units[unitID].unitType + == OpenSHC::Map::Units::UT_A_ASSASSIN) + && (_yOffset_01 = DAT_UnitsState::instance.units[unitID].imageID2, + _yOffset_01 != 0)) { + sVar24 = DAT_UnitsState::instance.units[unitID].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)(DAT_UnitsState::instance.units[unitID].field59_0x86 + + sVar20), + (int)(sVar5), + 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[unitID].drawYOffset; + if (sVar30 != 0) { + sVar20 = DAT_UnitsState::instance.units[unitID].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[unitID].drawX, + (int)(sVar20 + DAT_UnitsState::instance.units[unitID].drawY), + (int)(( + int)(DAT_UnitsState::instance.units[unitID].drawWidth)), + DAT_UnitsState::instance.units[unitID].drawHeight1 + - _yOffset_01, + (byte*)(( + int)((DAT_GMImageOffsets::instance + [GMTotalPicturesProcessed::instance + [DAT_CurrentlyRenderedSpriteID::instance] + + -1 + (int)sVar30] + + (int)DAT_TextureRenderCoreObject::instance + .gmProcessedImageData))), + 0x20 - iVar27); + } + } + uVar9 = *this->viewportState.ptrColor; + *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + sVar30 = DAT_UnitsState::instance.units[unitID].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[unitID].drawX, + (int)(( + 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)))); + } 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[unitID].drawX, + (int)(( + 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[unitID].graphicSize; + if ((sVar30 != 4) && (1 < sVar30)) { + DAT_CurrentlyRenderedSpriteID::instance + = (GmIDInt)DAT_UnitsState::instance.units[unitID].gmIDUnk; + DAT_RenderedUnitOwner::instance + = (uint)DAT_UnitsState::instance.units[unitID] + .displayColorPlayerID; + _yOffset_01 = DAT_UnitsState::instance.units[unitID].imageIDUnk; + if (0 < _yOffset_01) { + sVar30 = DAT_UnitsState::instance.units[unitID].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[unitID].drawX, + (int)(sVar30 + DAT_UnitsState::instance.units[unitID].drawY), + (int)(( + int)(DAT_UnitsState::instance.units[unitID].drawWidth)), + DAT_UnitsState::instance.units[unitID].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[unitID].graphicSize) { + _yOffset_01 = DAT_UnitsState::instance.units[unitID].imageID2; + if (0 < _yOffset_01) { + sVar30 = DAT_UnitsState::instance.units[unitID].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[unitID].drawX, + (int)(sVar30 + DAT_UnitsState::instance.units[unitID].drawY), + (int)(( + int)(DAT_UnitsState::instance.units[unitID].drawWidth)), + DAT_UnitsState::instance.units[unitID].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[unitID].unitType; + if ((UVar7 == OpenSHC::Map::Units::UT_S_TOWER) + && (DAT_UnitsState::instance.units[unitID].dying == 0)) { + _yOffset_01 + = (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; + 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[unitID].dying != 0)) + goto LAB_004ea966; + _yOffset_01 + = (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: + _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[unitID].owner; + DAT_CurrentlyRenderedSpriteID::instance + = OpenSHC::IO::Graphics::GID_ANIM_FLAG_SMALL; + uVar32 = DAT_UnitsState::instance.units[unitID].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)(uVar32 / 2 + 1), + _yOffset_01, iVar26); + } + } + LAB_004ea966: + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *this->viewportState.ptrColor = uVar9; + } else { + this->viewportState.mouseRayUnitID = unitID; + this->viewportState.mouseRayBuildingID = 0; + } + goto LAB_004eb1be; + } + _yOffset_01 = 0; + } + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::scheduleUnitForBatchedRendering, + this)(unitID, (undefined4)((int)(sVar30)), (undefined4)((int)(sVar20)), + (undefined4)((int)(sVar5)), + (undefined4)((int)(DAT_UnitsState::instance.units[unitID].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)(sVar20), (int)(sVar5), + (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[unitID].drawHeight1), + (byte*)((int)((DAT_GMImageOffsets::instance[iVar26] + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData))), + local_2c); + } + _yOffset_01 = DAT_UnitsState::instance.units[unitID].vanish; + if (1 < _yOffset_01) { + DAT_UnitsState::instance.units[unitID].vanish = _yOffset_01 + -1; + } + } + } + LAB_004eb1be: + unitID = (int)(short)DAT_UnitsState::instance.units[unitID].nextUnitOnTheSameTile; + if ((DAT_GameSynchronyState::instance.syncStatus != 0) || (unitID < 1)) + break; + } + } + /* + ------ END RENDER UNITS ------ + */ + + local_24 = 0; + _yOffset_01 = DAT_RenderMap_YOffset::instance; + if (entityID != 0) { + do { + local_24 = local_24 + 1; + if ((9 < local_24) || (DAT_EntityState::instance.entityArray[entityID].logicalState == 0)) + break; + if (DAT_EntityState::instance.entityArray[entityID].graphicType2 == 0) + goto LAB_004eb439; + DAT_CurrentlyRenderedSpriteID::instance + = (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[entityID].fireIntensity == 0) + && (0x4f < local_8)) { + if (local_8 < 200) { + bVar15 = (byte)DAT_EntityState::instance.entityArray[entityID].rng_1 & 1; + } else { + bVar15 = (byte)DAT_EntityState::instance.entityArray[entityID].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[entityID].colorUnk; + bVar12 = 0; + 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: + if (_flatView != 0) + goto LAB_004eb439; + case OpenSHC::IO::Graphics::GID_BODY_INFO: + bVar12 = 1; + switchD_004eb2c9_caseD_76: + if ((DAT_TileMapState::instance.refreshRelatedOne == 0) || (_flatView != 0)) { + iVar26 = _yOffset_01; + } + if (bVar12 == 0) + 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[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[layerTileIndex]); + if (DAT_TileMapState::instance.refreshRelatedOne == 0) { + iVar26 = _yOffset_01; + if (DAT_TileMapState::instance.BuildingLayer[layerTileIndex] != 0) { + iVar26 = _yOffset_01 + 0x14; + } + } else { + iVar26 = _yOffset_01; + if ((_flatView == 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[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[layerTileIndex] == 0) { + iVar26 = _yOffset_01; + } + if (uVar32 != 0) { + iVar26 = iVar26 + 0x12; + } + } else if (_flatView != 0) + goto LAB_004eb439; + } + if ((DAT_EntityState::instance.entityArray[entityID].field83_0xc0 == 0) + || (DAT_TextureRenderCoreObject::instance.isZoom2 == 0)) { + 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[entityID].graphicType2, + (int)((DAT_EntityState::instance.entityArray[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + + DAT_RenderMap_DrawSomeX::instance), + (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[entityID].imageID), + (int)(-1 - sVar30)); + _yOffset_01 = DAT_RenderMap_YOffset::instance; + } else { + _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[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[entityID].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[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[entityID].y1 - _yOffset_01) + - iVar26) + + DAT_RenderMap_DrawSomeY::instance)), + (int)(sVar30)); + _yOffset_01 = DAT_RenderMap_YOffset::instance; + } + } + LAB_004eb439: + iVar26 = (int)DAT_EntityState::instance.entityArray[entityID].nextEntityOnThisTileByID; + if ((entityID == iVar26) + || (entityID = iVar26, DAT_GameSynchronyState::instance.syncStatus != 0)) + break; + } else { + entityID + = (uint)DAT_EntityState::instance.entityArray[entityID].nextEntityOnThisTileByID; + } + if (entityID == 0) + break; + } while (true); + } + entityID = (uint)(byte)DAT_TileMapState::instance.EntityLayerLT25[layerTileIndex]; + _yOffset_01 = 0; + if (entityID != 0) { + while (_yOffset_01 = _yOffset_01 + 1, _yOffset_01 < 10) { + if (DAT_EntityState::instance.entityArray[entityID].tile != layerTileIndex) { + DAT_TileMapState::instance.EntityLayerLT25[layerTileIndex] = '\0'; + break; + } + if (DAT_EntityState::instance.entityArray[entityID].logicalState == 0) + break; + iVar26 = DAT_EntityState::instance.entityArray[entityID].graphicType2; + if (iVar26 == 0) { + LAB_004eb7db: + 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[entityID].gmID; + DAT_RenderedUnitOwner::instance + = 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[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[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + + DAT_RenderMap_DrawSomeX::instance), + (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[entityID].imageID), + (int)(-1 - sVar30)); + } else { + 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[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + + DAT_RenderMap_DrawSomeX::instance)), + (int)(( + int)(((DAT_EntityState::instance.entityArray[entityID].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[entityID].x1 + - DAT_EntityState::instance.entityArray[entityID].originX) + + DAT_RenderMap_DrawSomeX::instance)), + (int)(( + int)(((DAT_EntityState::instance.entityArray[entityID].y1 - iVar27) + - iVar18) + + DAT_RenderMap_DrawSomeY::instance)), + (int)(sVar30)); + } + } + sVar30 = DAT_EntityState::instance.entityArray[entityID].field83_0xc0; + if (sVar30 != 0) { + 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[entityID].y1 + - (int)DAT_EntityState::instance.entityArray[entityID].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[entityID].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[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[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[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; + DAT_TextManagerObject::instance.field8_0x20 = 0; + } + goto LAB_004eb7db; + } + uVar32 = (uint)DAT_EntityState::instance.entityArray[entityID].nextEntityOnThisTileByID; + } + entityID = 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)(((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; + 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)(DAT_RenderMap_DrawSomeX::instance + -0x1e), + (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 != 0) { + 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[layerTileIndex]; + 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 != 0) { + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithBlending, + DAT_TextureRenderCoreObject::ptr)(OpenSHC::IO::Graphics::GID_FLOATS, + (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 { + if (DAT_GmImageAddressToBeRendered::instance == 0x20) { + DAT_GmImageAddressToBeRendered::instance + = GMTotalPicturesProcessed::instance[9] + 0x1f; + } else { + layerTileIndex = DAT_GmImageAddressToBeRendered::instance + this->unknownCounterUntil_0x10; + if (0x32 < layerTileIndex) { + layerTileIndex = layerTileIndex + -0x10; + } + DAT_GmImageAddressToBeRendered::instance + = layerTileIndex + -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[layerTileIndex]; + DAT_00ed316c::instance = DAT_GmImageAddressToBeRendered::instance; + if (local_54 != 0) { + DAT_00ed316c::instance = (uint)DAT_TileMapState::instance.PillarGFXLayer[layerTileIndex]; + } + 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; + layerTileIndex = _viewportHeight; + } else { + layerTileIndex = _viewportHeight + 1; + DAT_RenderMap_DrawSomeX::instance = this->viewportState.unknownScreenXRelated; + } + 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, layerTileIndex + -2 <= iVar31)) { + bVar13 = 0; + } + 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 != 0) { + 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 != 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 != 0)) { + 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)(((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)( + + (DAT_GMImageOffsets::instance[DAT_GmImageAddressToBeRendered::instance] + 0x200 + + (int)DAT_TextureRenderCoreObject::instance.gmProcessedImageData)))); + } + if ((_flatView == 0) + || (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)(DAT_RenderMap_DrawSomeX::instance + 0x10), + (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)(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)(DAT_RenderMap_DrawSomeX::instance), + (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)(DAT_RenderMap_DrawSomeX::instance), iVar23, _yOffset_01); + } else { + MACRO_CALL_MEMBER( + OpenSHC::Rendering::ViewportRenderState_Func::renderGmOverlayBuilding, + this)( + uVar29, (int)(DAT_RenderMap_DrawSomeX::instance), iVar23, _yOffset_01); + } + } + } + } + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *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)(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)(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 == 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) { + 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 == 0 + && (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)(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)(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; + GVar11 = (GmID)this->floatersArray[uVar32].gmID; + MACRO_CALL_MEMBER( + OpenSHC::UI::Rendering::TextureRenderCore_Func::renderGMWithAlphaMask, + DAT_TextureRenderCoreObject::ptr)((GmID)GVar11, iVar18, + (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 { + 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 (layerTileIndex == _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 == 0) && (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 = 0; + } else { + bVar13 = 1; + } + 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 != 0) { + 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)((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)((*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)(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)(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)(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)(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[entityID].x1 + - (int)DAT_EntityState::instance.entityArray[entityID].originX) + + DAT_RenderMap_DrawSomeX::instance, + (((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[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; + } + +} +} diff --git a/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp new file mode 100644 index 000000000..81b8a9b53 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/renderUnits.cpp @@ -0,0 +1,530 @@ +#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; + + // FUNCTION: STRONGHOLDCRUSADER 0x004E7810 + void ViewportRenderState::renderUnits() + { + short graphicSize; + UnitTypeShort unitType; + UnitStateShort unitState; + int overlayX; + int overlayY; + int maskImageID; + + 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; + 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; + } + if (this->unitBatchedRenderCounterUntil6 == 1) { + this->unitRender1 = 0; + _renderBatchSize = renderCount1; + } else if (this->unitBatchedRenderCounterUntil6 == 2) { + this->unitRender2 = 0; + _renderBatchSize = renderCount2; + } else if (this->unitBatchedRenderCounterUntil6 == 3) { + this->unitRender3 = 0; + _renderBatchSize = renderCount3; + } else if (this->unitBatchedRenderCounterUntil6 == 4) { + this->unitRender4 = 0; + _renderBatchSize = renderCount4; + } else if (this->unitBatchedRenderCounterUntil6 == 5) { + this->unitRender5 = 0; + _renderBatchSize = renderCount5; + } + if (0 < _renderBatchSize) { + for (int _batchedUnitID = 0; _batchedUnitID < _renderBatchSize; _batchedUnitID++) { + switch (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)(_gmID), + (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)(_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)(_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 { + ushort savedPixelColor = *this->viewportState.ptrColor; + *this->viewportState.ptrColor = COL_MAGENTA::instance.shortValue; + 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))) { + _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)(_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)(_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; + uint 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)(animationTick / 2 + 1), overlayX, overlayY); + } + } + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *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)(_blendStrength), (byte*)_gmID, _alpha); + if (*this->viewportState.ptrColor == COL_MAGENTA::instance.shortValue) { + *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)(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)(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; + 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; + 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, + 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; + 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, + 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; + 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, + overlayImageID, overlayY, overlayX, OpenSHC::IO::Graphics::GID_FLOATS_NEW, + maskImageID, 0); + } + } + DAT_UnitsState::instance.units[_unitID].field45_0x6c = 0; + } + } + } + } + } + } + +} +} 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/src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp b/src/OpenSHC/Rendering/ViewportRenderState/resetupViewport.cpp new file mode 100644 index 000000000..e74ca7fbd --- /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.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/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/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/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/src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp b/src/OpenSHC/Rendering/ViewportRenderState/scheduleUnitForBatchedRendering.cpp new file mode 100644 index 000000000..9a0054607 --- /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 (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 (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 (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 (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 (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/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp new file mode 100644 index 000000000..7a0508504 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/setTileSystemMemoryLookupArrays.cpp @@ -0,0 +1,245 @@ +#include "OpenSHC/Rendering/ViewportRenderState.func.hpp" + +namespace OpenSHC { +namespace Rendering { + + // FUNCTION: STRONGHOLDCRUSADER 0x004E2050 + void ViewportRenderState::setTileSystemMemoryLookupArrays() + { + int diagonal; + int savedDestOffset2; + int scratch6; + int scratch7; + int runRemaining; + int destIndex; + int firstHalfIndex; + int secondHalfIndex; + int rowBase; + int diagonalBase; + int tileGrid[160000]; + int column; + + int tileNumber = 0; + for (int i = 0; i < 160000; i++) { + tileGrid[i] = 0; + } + + int rowFirstColumn = 199; + int rowWidth = 2; + int rowStart = 0; + int rowSpan = 398; + 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++) { + *gridRow = tileNumber; + gridRow++; + tileNumber = tileNumber + 1; + } + } + rowSpan = rowSpan + -2; + rowFirstColumn = rowFirstColumn + -1; + rowStart = rowStart + 400; + rowWidth = rowWidth + 2; + } + + rowStart = 80000; + rowSpan = 400 - rowWidth; + rowEntry = &this->translationMatrix[200]; + for (; rowStart < 160000; rowEntry++) { + rowFirstColumn = rowFirstColumn + 1; + rowSpan = rowSpan + 2; + rowWidth = rowWidth + -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++) { + *gridRow = tileNumber; + gridRow++; + tileNumber = tileNumber + 1; + } + } + 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; + this->field12_0x4e5ec = 0; + this->field13_0x4e5f0 = 0; + this->field14_0x4e5f4 = 0; + this->field15_0x4e5f8 = 0; + this->field16_0x4e5fc = 0; + rowBase = 0; + diagonalBase = 79600; + column = 8; + int* destRow = this->screenPointToTileNumber; + for (int runRemaining = 200; 0 < runRemaining; runRemaining--) { + scratch7 = column; + int* firstHalf = destRow; + destRow = destRow + 200; + column = rowBase; + diagonal = diagonalBase; + for (int scratch6 = 200; 0 < scratch6; scratch6--) { + *firstHalf = tileGrid[diagonal + column]; + firstHalf++; + diagonal = diagonal + -400; + column = column + 1; + } + diagonalBase = diagonalBase + 400; + int* secondHalf = destRow; + destRow = destRow + 201; + column = rowBase; + diagonal = diagonalBase; + for (int scratch6 = 200; -1 < scratch6; scratch6--) { + *secondHalf = tileGrid[diagonal + column]; + secondHalf++; + column = column + 1; + diagonal = diagonal + -400; + } + rowBase = rowBase + 1; + column = scratch7 + 401; + } + destIndex = scratch7 + 393; + diagonal = 159600; + for (int column = 200; 0 < column; column--) { + this->screenPointToTileNumber[destIndex] = tileGrid[diagonal + rowBase]; + destIndex = destIndex + 1; + rowBase = rowBase + 1; + diagonal = diagonal + -400; + } + 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; + int* firstHalf = destRow; + destRow = destRow + 200; + column = diagonal; + scratch7 = diagonalBase; + for (int runRemaining = 200; runRemaining != 0; runRemaining--) { + *firstHalf = tileGrid[scratch7 + column]; + firstHalf++; + column = column + -1; + scratch7 = scratch7 + -400; + } + scratch7 = diagonal + 1; + runRemaining = (scratch7 - diagonal) + 199; + diagonal = ((scratch7 - diagonal) + rowBase) * 400; + int* secondHalf = destRow; + destRow = destRow + 201; + column = scratch7; + do { + diagonal = diagonal + -400; + *secondHalf = tileGrid[diagonal + column]; + secondHalf++; + column = column + -1; + runRemaining = runRemaining + -1; + } while (-1 < runRemaining); + rowBase = rowBase + -1; + diagonalBase = diagonalBase + -400; + column = scratch6 + 0x191; + diagonal = scratch7; + } + column = rowBase * 400; + destIndex = scratch6 + 0x189; + for (int diagonal = 200; diagonal != 0; diagonal--) { + this->screenPointToTileNumber[destIndex] = tileGrid[column + scratch7]; + destIndex = destIndex + 1; + scratch7 = scratch7 + -1; + column = column + -400; + } + scratch7 = 199; + column = 80000; + destIndex = scratch6 + 0x251; + diagonal = scratch6 + 0x259; + do { + savedDestOffset2 = diagonal; + secondHalfIndex = destIndex + 200; + firstHalfIndex = destIndex; + diagonal = column; + for (int scratch6 = 200; 0 < scratch6; scratch6--) { + this->screenPointToTileNumber[firstHalfIndex] = tileGrid[scratch7 + diagonal + scratch6]; + firstHalfIndex = firstHalfIndex + 1; + diagonal = diagonal + 400; + } + column = column + -400; + destIndex = destIndex + 0x191; + diagonal = column; + for (int scratch6 = 200; -1 < scratch6; scratch6--) { + this->screenPointToTileNumber[secondHalfIndex] = tileGrid[scratch7 + diagonal + scratch6]; + secondHalfIndex = secondHalfIndex + 1; + diagonal = diagonal + 400; + } + scratch7 = scratch7 + -1; + diagonal = savedDestOffset2 + 0x191; + } while (0 < column); + diagonal = 0; + destIndex = savedDestOffset2 + 0x189; + for (int column = 200; 0 < column; column--) { + this->screenPointToTileNumber[destIndex] = tileGrid[diagonal + -1 + column]; + destIndex = destIndex + 1; + diagonal = diagonal + 400; + } + rowBase = 0; + diagonalBase = 0; + destIndex = savedDestOffset2 + 0x251; + column = 200; + diagonal = savedDestOffset2 + 0x259; + do { + scratch6 = diagonal; + savedDestOffset2 = 200; + secondHalfIndex = destIndex + 200; + firstHalfIndex = destIndex; + diagonal = column; + scratch7 = diagonalBase; + do { + 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; + destIndex = destIndex + 0x191; + column = scratch7; + for (int runRemaining = 200; -1 < runRemaining; runRemaining--) { + this->screenPointToTileNumber[secondHalfIndex] = tileGrid[diagonal + column]; + secondHalfIndex = secondHalfIndex + 1; + column = column + 1; + diagonal = diagonal + 400; + } + rowBase = rowBase + 1; + diagonalBase = diagonalBase + 400; + column = scratch7; + diagonal = scratch6 + 0x191; + } while (0 < scratch7); + column = rowBase * 400; + destIndex = scratch6 + 0x189; + for (int diagonal = 200; 0 < diagonal; diagonal--) { + this->screenPointToTileNumber[destIndex] = tileGrid[column + scratch7]; + destIndex = destIndex + 1; + scratch7 = scratch7 + 1; + column = column + 400; + } + 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/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp new file mode 100644 index 000000000..b6423137f --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/setViewportBasedOnMapSize.cpp @@ -0,0 +1,89 @@ +#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 maxViewportX = (((400 - mapBorder) / 2 - this->viewportState.viewportHeight) + 4) * 0x20; + int maxViewportY = ((401 - this->viewportState.viewportWidth) - mapBorder) * 8; + int minViewportX = mapBorder / 2 + 1; + int minViewportY = mapBorder * 8 + 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 < minViewportY + 8) { + this->viewportState.viewportY = minViewportY + 8; + } + 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 = minViewportY - 10; + maxViewportY = maxViewportY + -10; + } + + if (maxViewportX < minViewportX) { + this->viewportState.viewportX = (minViewportX - maxViewportX) / 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/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/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/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp b/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp new file mode 100644 index 000000000..24f892a74 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/setupViewport.cpp @@ -0,0 +1,794 @@ +#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; + + // 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)(); + } + +} +} 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/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/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp new file mode 100644 index 000000000..aeb3d6992 --- /dev/null +++ b/src/OpenSHC/Rendering/ViewportRenderState/updateBuildingPreviewPosition.cpp @@ -0,0 +1,384 @@ +#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 - 1) * 10; + int nextHitBoxRow = (DAT_TextureRenderCoreObject::instance.activeMenuTabIndex - 1) * 10; + 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; + ushort minimapBuildingID = DAT_TileMapState::instance.BuildingLayer[minimapTile]; + if ((short)minimapBuildingID <= 0) { + if ((DAT_TileMapState::instance.LogicLayer[minimapTile] & 0x100U) != 0) { + minimapGateTile = minimapTile; + } else if ((short)minimapBuildingID <= 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.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; + 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; + 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 ((short)hoveredBuildingLayer <= 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/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/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/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 diff --git a/status/addresses-SHC-3BB0A8C1.txt b/status/addresses-SHC-3BB0A8C1.txt index b80b8635f..407a5278c 100644 --- a/status/addresses-SHC-3BB0A8C1.txt +++ b/status/addresses-SHC-3BB0A8C1.txt @@ -381,9 +381,9 @@ 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 | 0.0% | Pending +SHC_3BB0A8C1_0x00401040 | 100.0% | Reimplemented SHC_3BB0A8C1_0x00401060 | 0.0% | Pending @@ -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 @@ -36389,21 +36389,21 @@ 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 +SHC_3BB0A8C1_0x004E2050 | 33.0% | Walking pointers, reg alloc 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 | 0.0% | Pending +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 +SHC_3BB0A8C1_0x004E26D0 | 54.1% | esi/edx allocation differs SHC_3BB0A8C1_0x004E2AB4 | 0.0% | Pending @@ -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 | 47.4% | Block order, reg alloc differs SHC_3BB0A8C1_0x004E3828 | 0.0% | Pending @@ -36501,9 +36501,9 @@ 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 +SHC_3BB0A8C1_0x004E3980 | 45.0% | Style pass, reg alloc differs SHC_3BB0A8C1_0x004E46C0 | 0.0% | Pending @@ -36875,19 +36875,19 @@ 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 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5B80 | 65.7% | esi/edi allocation differs -SHC_3BB0A8C1_0x004E5C00 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5C00 | 57.4% | reg alloc + one spill -SHC_3BB0A8C1_0x004E5D80 | 0.0% | Pending +SHC_3BB0A8C1_0x004E5D80 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E5DD0 | 0.0% | Pending +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 +SHC_3BB0A8C1_0x004E5ED0 | 43.4% | Block order, reg alloc differs SHC_3BB0A8C1_0x004E6308 | 0.0% | Pending @@ -36971,23 +36971,23 @@ 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 -SHC_3BB0A8C1_0x004E63A0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E63A0 | 93.8% | one reg-copy form differs 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 +SHC_3BB0A8C1_0x004E66F0 | 60.0% | consts kept in regs by orig -SHC_3BB0A8C1_0x004E7770 | 0.0% | Pending +SHC_3BB0A8C1_0x004E7770 | 38.7% | LTCG ecx reuse in callers -SHC_3BB0A8C1_0x004E7800 | 0.0% | Pending +SHC_3BB0A8C1_0x004E7800 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E7810 | 0.0% | Pending +SHC_3BB0A8C1_0x004E7810 | 34.7% | Style pass, reg alloc differs SHC_3BB0A8C1_0x004E78D0 | 0.0% | Pending @@ -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 | 49.6% | Off-by-one fix, reg alloc SHC_3BB0A8C1_0x004E8BFC | 0.0% | Pending @@ -37333,15 +37333,15 @@ 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 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8C90 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E8CA0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8CA0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E8CC0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8CC0 | 100.0% | Reimplemented -SHC_3BB0A8C1_0x004E8CF0 | 0.0% | Pending +SHC_3BB0A8C1_0x004E8CF0 | 31.9% | Style pass, reg alloc differs SHC_3BB0A8C1_0x004E9000 | 0.0% | Pending 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..7e29e9fd9 100644 --- a/tools/reimplementation-helper/batch/build_quiet.py +++ b/tools/reimplementation-helper/batch/build_quiet.py @@ -5,13 +5,27 @@ 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 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 import re import subprocess +import sys -from common import TMP +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") @@ -19,14 +33,33 @@ 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(endpoint=None): 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(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(endpoint)) + 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() +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) -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..64406b95c 100644 --- a/tools/reimplementation-helper/batch/common.py +++ b/tools/reimplementation-helper/batch/common.py @@ -27,6 +27,54 @@ 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 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) + if endpoint: + env["_MSPDBSRV_ENDPOINT_"] = endpoint + else: + 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])