-
-
Notifications
You must be signed in to change notification settings - Fork 150
Expand file tree
/
Copy pathBody.h
More file actions
112 lines (96 loc) · 3.53 KB
/
Copy pathBody.h
File metadata and controls
112 lines (96 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#pragma once
#include <Ext/Techno/Body.h>
#include <Ext/BuildingType/Body.h>
class BuildingExt
{
public:
using base_type = BuildingClass;
static constexpr DWORD Canary = 0x87654321;
static constexpr size_t ExtPointerOffset = 0x6FC;
static constexpr bool ShouldConsiderInvalidatePointer = true;
class ExtData final : public Extension<BuildingClass>
{
public:
BuildingTypeExt::ExtData* TypeExtData;
TechnoExt::ExtData* TechnoExtData;
bool DeployedTechno;
bool IsCreatedFromMapFile;
int LimboID;
int GrindingWeapon_LastFiredFrame;
int GrindingWeapon_AccumulatedCredits;
BuildingClass* CurrentAirFactory;
int AccumulatedIncome;
std::optional<int> CurrentLaserWeaponIndex;
int PoweredUpToLevel; // Distinct from UpgradeLevel, and set to highest PowersUpToLevel out of applied upgrades regardless of how many are currently applied to this building.
SuperClass* CurrentEMPulseSW;
bool IsFiringNow;
int TurretAnimIdleFrame;
int TurretAnimFiringFrame;
int TurretAnimRateTick;
ExtData(BuildingClass* OwnerObject) : Extension<BuildingClass>(OwnerObject)
, TypeExtData { nullptr }
, TechnoExtData { nullptr }
, DeployedTechno { false }
, IsCreatedFromMapFile { false }
, LimboID { -1 }
, GrindingWeapon_LastFiredFrame { 0 }
, GrindingWeapon_AccumulatedCredits { 0 }
, CurrentAirFactory { nullptr }
, AccumulatedIncome { 0 }
, CurrentLaserWeaponIndex {}
, PoweredUpToLevel { 0 }
, CurrentEMPulseSW {}
, IsFiringNow { false }
, TurretAnimIdleFrame { 0 }
, TurretAnimFiringFrame { -1 }
, TurretAnimRateTick { 0 }
{ }
void DisplayIncomeString();
void ApplyPoweredKillSpawns();
bool HasSuperWeapon(int index, bool withUpgrades) const;
bool HandleInfiltrate(HouseClass* pInfiltratorHouse, int moneybefore);
void UpdatePrimaryFactoryAI();
virtual ~ExtData() = default;
// virtual void LoadFromINIFile(CCINIClass* pINI) override;
virtual void InvalidatePointer(void* ptr, bool bRemoved) override
{
AnnounceInvalidPointer(CurrentAirFactory, ptr);
}
virtual void LoadFromStream(PhobosStreamReader& Stm) override;
virtual void SaveToStream(PhobosStreamWriter& Stm) override;
private:
template <typename T>
void Serialize(T& Stm);
};
class ExtContainer final : public Container<BuildingExt>
{
public:
ExtContainer();
~ExtContainer();
virtual bool InvalidateExtDataIgnorable(void* const ptr) const override
{
auto const abs = static_cast<AbstractClass*>(ptr)->WhatAmI();
switch (abs)
{
case AbstractType::Building:
return false;
default:
return true;
}
}
};
static ExtContainer ExtMap;
static bool LoadGlobals(PhobosStreamReader& Stm);
static bool SaveGlobals(PhobosStreamWriter& Stm);
static void StoreTiberium(BuildingClass* pThis, float amount, int idxTiberiumType, int idxStorageTiberiumType);
static int CountOccupiedDocks(BuildingClass* pBuilding);
static bool HasFreeDocks(BuildingClass* pBuilding);
static bool CanGrindTechno(BuildingClass* pBuilding, TechnoClass* pTechno);
static bool DoGrindingExtras(BuildingClass* pBuilding, TechnoClass* pTechno, int refund);
static bool CanUndeployOnSell(BuildingClass* pThis);
static void KickOutStuckUnits(BuildingClass* pThis);
static const std::vector<CellStruct> GetFoundationCells(BuildingClass* pThis, CellStruct baseCoords, bool includeOccupyHeight = false);
static WeaponStruct* GetLaserWeapon(BuildingClass* pThis);
static void __fastcall KickOutClone(std::pair<TechnoTypeClass*, HouseClass*>& info, void*, BuildingClass* pFactory);
static int GetTurretFrame(BuildingClass* pThis);
};