2
#include <WeaponTypeClass.h>
4
#include "../../Misc/Applicators.h"
7
#include "../BuildingType/Body.h"
8
#include "../House/Body.h"
9
#include "../Techno/Body.h"
11
DEFINE_HOOK(4FB257, HouseClass_UnitFromFactory_Firewall, 6)
13
GET(BuildingClass *, B, ESI);
14
GET(HouseClass *, H, EBP);
15
GET_STACK(CellStruct, CenterPos, 0x4C);
17
//BuildingExt::ExtendFirewall(B, CenterPos, H);
18
BuildingExt::buildLines(B, CenterPos, H);
24
DEFINE_HOOK(445355, BuildingClass_KickOutUnit_Firewall, 6)
26
GET(BuildingClass *, Factory, ESI);
28
GET(BuildingClass *, B, EDI);
29
GET_STACK(CellStruct, CenterPos, 0x20);
31
//BuildingExt::ExtendFirewall(B, CenterPos, Factory->Owner);
32
BuildingExt::buildLines(B, CenterPos, Factory->Owner);
38
DEFINE_HOOK(6D5455, sub_6D5030, 6)
40
GET(BuildingTypeClass *, BT, EAX);
41
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(BT);
43
return pTypeData->IsLinkable()
49
DEFINE_HOOK(6D5A5C, sub_6D59D0, 6)
51
GET(BuildingTypeClass *, BT, EDX);
52
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(BT);
54
return pTypeData->IsLinkable()
60
DEFINE_HOOK(43EFB3, BuildingClass_GetStaticImageFrame, 6)
62
GET(BuildingClass *, B, ESI);
64
if(B->GetCurrentMission() != mission_Construction) {
65
signed int FrameIdx = BuildingExt::GetImageFrameIndex(B);
68
R->EAX<signed int>(FrameIdx);
76
DEFINE_HOOK(442230, BuildingClass_ReceiveDamage_FSW, 6)
78
GET(BuildingClass *, pThis, ECX);
79
GET_STACK(int *, Damage, 0x4);
81
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(pThis->Type);
82
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(pThis->Owner);
83
if(pTypeData->Firewall_Is && pHouseData->FirewallActive) {
92
DEFINE_HOOK(43FC39, BuildingClass_Update_FSW, 6)
94
GET(BuildingClass*, B, ESI);
96
BuildingExt::ExtData * pData = BuildingExt::ExtMap.Find(B);
97
pData->UpdateFirewall();
103
DEFINE_HOOK(483D8E, CellClass_Setup_Slave, 6)
105
GET(BuildingClass *, B, ESI);
106
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(B->Type);
107
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(B->Owner);
109
R->EAX<BuildingTypeClass *>(B->Type);
111
if(pTypeData->Firewall_Is) {
112
R->EAX<HouseClass *>(B->Owner);
113
return pHouseData->FirewallActive
123
DEFINE_HOOK(51BD4C, InfantryClass_Update, 6)
125
GET(BuildingClass *, B, EDI);
126
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(B->Type);
127
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(B->Owner);
129
if(pTypeData->Firewall_Is) {
130
return pHouseData->FirewallActive
140
DEFINE_HOOK(51C4C8, InfantryClass_IsCellOccupied, 6)
142
GET(BuildingClass *, B, ESI);
143
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(B->Type);
144
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(B->Owner);
146
if(pTypeData->Firewall_Is) {
147
return pHouseData->FirewallActive
157
DEFINE_HOOK(73F7B0, UnitClass_IsCellOccupied, 6)
159
GET(BuildingClass *, B, ESI);
160
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(B->Type);
161
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(B->Owner);
163
if(pTypeData->Firewall_Is) {
164
R->EAX<HouseClass *>(B->Owner);
165
return pHouseData->FirewallActive
175
DEFINE_HOOK(58819F, MapClass_SomePathfinding_1, 6)
177
GET(BuildingClass *, B, EAX);
178
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(B->Type);
179
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(B->Owner);
181
R->EAX<HouseClass *>(B->Owner);
182
return (pTypeData->Firewall_Is && pHouseData->FirewallActive)
189
DEFINE_HOOK(58828C, MapClass_SomePathfinding_2, 6)
191
GET(BuildingClass *, B, EAX);
192
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(B->Type);
193
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(B->Owner);
195
R->EAX<HouseClass *>(B->Owner);
196
return (pTypeData->Firewall_Is && pHouseData->FirewallActive)
203
DEFINE_HOOK(5884A4, MapClass_SomePathfinding_3, 6)
205
GET(BuildingClass *, B, EAX);
206
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(B->Type);
207
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(B->Owner);
209
R->EAX<HouseClass *>(B->Owner);
210
return (pTypeData->Firewall_Is && pHouseData->FirewallActive)
217
DEFINE_HOOK(6FC0C5, TechnoClass_GetObjectActivityState_Firewall, 6)
219
GET(TechnoClass *, Tgt, EBX);
220
if(BuildingClass *B = specific_cast<BuildingClass*>(Tgt)) {
221
if(BuildingTypeExt::ExtMap.Find(B->Type)->Firewall_Is) {
222
if(HouseExt::ExtMap.Find(B->Owner)->FirewallActive) {
231
DEFINE_HOOK(6FCD1D, TechnoClass_GetObjectActivityState_CanTargetFirewall, 5)
233
GET(TechnoClass *, Src, ESI);
234
GET_STACK(TechnoClass *, Tgt, 0x24);
235
GET_STACK(int, idxWeapon, 0x28);
237
WeaponTypeClass *Weapon = Src->GetWeapon(idxWeapon)->WeaponType;
238
if(!Weapon || !Weapon->Projectile) {
242
BulletTypeExt::ExtData *pBulletData = BulletTypeExt::ExtMap.Find(Weapon->Projectile);
243
if(!pBulletData->SubjectToFirewall) {
247
FirestormFinderApplicator FireFinder(Src->Owner);
249
CellSequence Path(&Src->Location, &Tgt->Location);
251
Path.Apply(FireFinder);
253
if(FireFinder.found) {
254
Src->ShouldLoseTargetNow = 1;
255
TechnoExt::FiringStateCache = FireError::ILLEGAL;
257
TechnoExt::FiringStateCache = FireError::NotAValue;
262
DEFINE_HOOK(6FCD23, TechnoClass_GetObjectActivityState_OverrideFirewall, 6)
264
if(TechnoExt::FiringStateCache != FireError::NotAValue) {
265
R->EAX(TechnoExt::FiringStateCache);
266
TechnoExt::FiringStateCache = FireError::NotAValue;
272
DEFINE_HOOK(6F64CB, TechnoClass_DrawHealthBar, 6)
274
GET(BuildingClass *, B, ESI);
275
BuildingTypeExt::ExtData * pData = BuildingTypeExt::ExtMap.Find(B->Type);
276
return (pData->Firewall_Is)
282
DEFINE_HOOK(71B126, TemporalClass_Fire, 7)
284
GET(BuildingClass *, B, EDI);
285
BuildingTypeExt::ExtData * pData = BuildingTypeExt::ExtMap.Find(B->Type);
286
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(B->Owner);
288
if(pData->Firewall_Is && pHouseData->FirewallActive) {
290
for(int i = 0; i < B->Owner->Buildings.Count; ++i) {
291
BuildingClass * pBuilding = B->Owner->Buildings[i];
292
if(pBuilding->Type == B->Type && pBuilding != B) {
293
if(!pBuilding->InLimbo && pBuilding->IsAlive && pBuilding->Health) {
300
pHouseData->SetFirestormState(0);
307
DEFINE_HOOK(4DA53E, FootClass_Update, 6)
309
GET(FootClass *, F, ESI);
311
CellClass *C = F->GetCell();
312
if(BuildingClass * B = C->GetBuilding()) {
313
BuildingTypeExt::ExtData* pTypeData = BuildingTypeExt::ExtMap.Find(B->Type);
314
HouseExt::ExtData *pHouseData = HouseExt::ExtMap.Find(B->Owner);
315
if(pTypeData->Firewall_Is && pHouseData->FirewallActive) {
316
BuildingExt::ExtData * pData = BuildingExt::ExtMap.Find(B);
317
pData->ImmolateVictim(F);