diff --git a/src/OpenSHC/Map/Units/UpdateBurningAnimal1.cpp b/src/OpenSHC/Map/Units/UpdateBurningAnimal1.cpp new file mode 100644 index 00000000..37c705df --- /dev/null +++ b/src/OpenSHC/Map/Units/UpdateBurningAnimal1.cpp @@ -0,0 +1,79 @@ +#include "OpenSHC/Map/Units.func.hpp" +#include "OpenSHC/Map/Units/States/UnitState.hpp" +#include "OpenSHC/Map/Units/UnitLogicState.hpp" + +#include "OpenSHC/Globals/DAT_CurrentUnitSlotID.hpp" +#include "OpenSHC/Globals/DAT_UnitHasBecomeIdle.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + + using OpenSHC::Map::Units::UnitLogicState; + using OpenSHC::Map::Units::States::UnitState; + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 */ + + // FUNCTION: STRONGHOLDCRUSADER 0x005309E0 + void __stdcall Units ::UpdateBurningAnimal1() + + { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].stateBasedSpeed = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].owner = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].calculatedOwnerPlayerIndex = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].dying = 1; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].isSelected = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].animationSpeed = 3; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].disappearFadeAlphaCountdown = 8; + + if (DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].state.generic + == OpenSHC::Map::Units::States::US_IDLEUnk) { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].animationCycleNumber = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].field_0x30_animRelated = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].gfxNumber = 1; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].state.generic = ((UnitState)2); + + return; + } + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].field_0x30_animRelated = 0; + + int iVar1 = DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].animationCycleNumber; + + if (0x15 <= iVar1) { + + DAT_UnitHasBecomeIdle::instance = 1; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].logicalState + = OpenSHC::Map::Units::ULS_REMOVE; + + return; + } + + bool bVar3 = DAT_UnitHasBecomeIdle::instance != 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].gfxNumber = iVar1 + 1; + + if (bVar3) { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].logicalState + = OpenSHC::Map::Units::ULS_REMOVE; + } + + return; + } + +} +} diff --git a/src/OpenSHC/Map/Units/UpdateBurningAnimal2.cpp b/src/OpenSHC/Map/Units/UpdateBurningAnimal2.cpp new file mode 100644 index 00000000..af398f83 --- /dev/null +++ b/src/OpenSHC/Map/Units/UpdateBurningAnimal2.cpp @@ -0,0 +1,79 @@ +#include "OpenSHC/Map/Units.func.hpp" +#include "OpenSHC/Map/Units/States/UnitState.hpp" +#include "OpenSHC/Map/Units/UnitLogicState.hpp" + +#include "OpenSHC/Globals/DAT_CurrentUnitSlotID.hpp" +#include "OpenSHC/Globals/DAT_UnitHasBecomeIdle.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + + using OpenSHC::Map::Units::UnitLogicState; + using OpenSHC::Map::Units::States::UnitState; + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 */ + + // FUNCTION: STRONGHOLDCRUSADER 0x00530A90 + void __stdcall Units ::UpdateBurningAnimal2() + + { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].stateBasedSpeed = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].owner = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].calculatedOwnerPlayerIndex = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].dying = 1; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].isSelected = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].animationSpeed = 3; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].disappearFadeAlphaCountdown = 8; + + if (DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].state.generic + == OpenSHC::Map::Units::States::US_IDLEUnk) { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].animationCycleNumber = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].field_0x30_animRelated = 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].gfxNumber = 1; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].state.generic = ((UnitState)2); + + return; + } + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].field_0x30_animRelated = 0; + + int iVar1 = DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].animationCycleNumber; + + if (0x11 <= iVar1) { + + DAT_UnitHasBecomeIdle::instance = 1; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].logicalState + = OpenSHC::Map::Units::ULS_REMOVE; + + return; + } + + bool bVar3 = DAT_UnitHasBecomeIdle::instance != 0; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].gfxNumber = iVar1 + 1; + + if (bVar3) { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].logicalState + = OpenSHC::Map::Units::ULS_REMOVE; + } + + return; + } + +} +} \ No newline at end of file diff --git a/src/OpenSHC/Map/Units/UpdateSiegeTent.cpp b/src/OpenSHC/Map/Units/UpdateSiegeTent.cpp new file mode 100644 index 00000000..6626a9ea --- /dev/null +++ b/src/OpenSHC/Map/Units/UpdateSiegeTent.cpp @@ -0,0 +1,76 @@ +#include "OpenSHC/Map/Navigation/DirectionAlgorithmState.func.hpp" +#include "OpenSHC/Map/Units.func.hpp" +#include "OpenSHC/Map/Units/UnitLogicState.hpp" +#include "OpenSHC/Map/Units/UnitType.hpp" + +#include "OpenSHC/Globals/DAT_CurrentUnitSlotID.hpp" +#include "OpenSHC/Globals/DAT_DirectionAlgorithmState.hpp" +#include "OpenSHC/Globals/DAT_GameState.hpp" +#include "OpenSHC/Globals/DAT_UnitsState.hpp" + +namespace OpenSHC { +namespace Map { + + using OpenSHC::Map::Units::UnitLogicState; + using OpenSHC::Map::Units::UnitType; + + /* + decompilerscript: committed: 2025-01-30 21:57:43.216000 */ + + // FUNCTION: STRONGHOLDCRUSADER 0x005307B0 + void __stdcall Units ::UpdateSiegeTent() + + { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].field_0x30_animRelated = 0; + + int uVar5 = DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].fixedRng + 1 & 3; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].gfxNumber = uVar5; + + if (4 <= uVar5) { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].gfxNumber = 2; + } + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].animationCycleNumber + = DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].animationCycleNumber + 1; + + if (500 < DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].animationCycleNumber) { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].logicalState + = OpenSHC::Map::Units::ULS_TRANSITIONING; + + if (DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].fixedRng % 4 < 2) { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].unitTypeToChangeInto + = OpenSHC::Map::Units::UT_S_CATAPULT; + } else { + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].unitTypeToChangeInto + = OpenSHC::Map::Units::UT_S_TREBUCHET; + } + + int iVar4 = DAT_GameState::instance.playerDataArray[1].keep.yEntry; + + int iVar3 = DAT_GameState::instance.playerDataArray[1].keep.xEntry; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].state_2 = 6; + + MACRO_CALL_MEMBER( + OpenSHC::Map::Navigation::DirectionAlgorithmState_Func::calculatePreferredRelativeOrientation, + DAT_DirectionAlgorithmState::ptr)( + (int)DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].x, + (int)((int)(DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].y)), iVar3, iVar4); + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].facingDirection + = DAT_DirectionAlgorithmState::instance.orientation; + + DAT_UnitsState::instance.units[DAT_CurrentUnitSlotID::instance].field265_0x3bc = 0; + } + + return; + } + +} +}