Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions src/Ext/Building/Body.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,60 @@ bool BuildingExt::HasFreeDocks(BuildingClass* pBuilding)
return false;
}

bool BuildingExt::CanGrindTechno(BuildingClass* pBuilding, TechnoClass* pTechno)
{
if (!pBuilding->Type->Grinding || (pTechno->WhatAmI() != AbstractType::Infantry && pTechno->WhatAmI() != AbstractType::Unit))
return false;

if ((pBuilding->Type->InfantryAbsorb || pBuilding->Type->UnitAbsorb) &&
(pTechno->WhatAmI() == AbstractType::Infantry && !pBuilding->Type->InfantryAbsorb ||
pTechno->WhatAmI() == AbstractType::Unit && !pBuilding->Type->UnitAbsorb))
{
return false;
}

if (const auto pExt = BuildingTypeExt::ExtMap.Find(pBuilding->Type))
{
if (pBuilding->Owner == pTechno->Owner && !pExt->Grinding_AllowOwner)
return false;

if (pBuilding->Owner != pTechno->Owner && pBuilding->Owner->IsAlliedWith(pTechno) && !pExt->Grinding_AllowAllies)
return false;

if (pExt->Grinding_AllowTypes.size() > 0 && !pExt->Grinding_AllowTypes.Contains(pTechno->GetTechnoType()))
return false;

if (pExt->Grinding_DisallowTypes.size() > 0 && pExt->Grinding_DisallowTypes.Contains(pTechno->GetTechnoType()))
return false;
}

return true;
}

bool BuildingExt::DoGrindingExtras(BuildingClass* pBuilding, TechnoClass* pTechno)
{
if (const auto pTypeExt = BuildingTypeExt::ExtMap.Find(pBuilding->Type))
{
if (const auto pExt = BuildingExt::ExtMap.Find(pBuilding))
{
if (pTypeExt->Grinding_Weapon.isset()
&& Unsorted::CurrentFrame >= pExt->GrindingWeapon_LastFiredFrame + pTypeExt->Grinding_Weapon.Get()->ROF)
{
TechnoExt::FireWeaponAtSelf(pBuilding, pTypeExt->Grinding_Weapon.Get());
pExt->GrindingWeapon_LastFiredFrame = Unsorted::CurrentFrame;
}
}

if (pTypeExt->Grinding_Sound.isset())
{
VocClass::PlayAt(pTypeExt->Grinding_Sound.Get(), pTechno->GetCoords());
return true;
}
}

return false;
}

// =============================
// load / save

Expand Down
3 changes: 3 additions & 0 deletions src/Ext/Building/Body.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include <Utilities/Container.h>
#include <Utilities/TemplateDef.h>

#include <Ext/Techno/Body.h>
#include <Ext/TechnoType/Body.h>
#include <Ext/Building/Body.h>
#include <Ext/BuildingType/Body.h>
Expand Down Expand Up @@ -64,4 +65,6 @@ class BuildingExt
static void UpdatePrimaryFactoryAI(BuildingClass* pThis);
static int CountOccupiedDocks(BuildingClass* pBuilding);
static bool HasFreeDocks(BuildingClass* pBuilding);
static bool CanGrindTechno(BuildingClass* pBuilding, TechnoClass* pTechno);
static bool DoGrindingExtras(BuildingClass* pBuilding, TechnoClass* pTechno);
};
31 changes: 0 additions & 31 deletions src/Ext/BuildingType/Body.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,37 +63,6 @@ int BuildingTypeExt::GetUpgradesAmount(BuildingTypeClass* pBuilding, HouseClass*
return isUpgrade ? result : -1;
}

bool BuildingTypeExt::CanGrindTechno(BuildingClass* pBuilding, TechnoClass* pTechno)
{
if (!pBuilding->Type->Grinding || (pTechno->WhatAmI() != AbstractType::Infantry && pTechno->WhatAmI() != AbstractType::Unit))
return false;

if ((pBuilding->Type->InfantryAbsorb || pBuilding->Type->UnitAbsorb) &&
(pTechno->WhatAmI() == AbstractType::Infantry && !pBuilding->Type->InfantryAbsorb ||
pTechno->WhatAmI() == AbstractType::Unit && !pBuilding->Type->UnitAbsorb))
{
return false;
}

if (const auto pExt = BuildingTypeExt::ExtMap.Find(pBuilding->Type))
{
if (pBuilding->Owner == pTechno->Owner && !pExt->Grinding_AllowOwner)
return false;

if (pBuilding->Owner != pTechno->Owner && pBuilding->Owner->IsAlliedWith(pTechno) && !pExt->Grinding_AllowAllies)
return false;

if (pExt->Grinding_AllowTypes.size() > 0 && !pExt->Grinding_AllowTypes.Contains(pTechno->GetTechnoType()))
return false;

if (pExt->Grinding_DisallowTypes.size() > 0 && pExt->Grinding_DisallowTypes.Contains(pTechno->GetTechnoType()))
return false;
}

return true;
}


void BuildingTypeExt::ExtData::Initialize()
{

Expand Down
1 change: 0 additions & 1 deletion src/Ext/BuildingType/Body.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,5 +81,4 @@ class BuildingTypeExt
static int GetEnhancedPower(BuildingClass* pBuilding, HouseClass* pHouse);
static bool CanUpgrade(BuildingClass* pBuilding, BuildingTypeClass* pUpgradeType, HouseClass* pUpgradeOwner);
static int GetUpgradesAmount(BuildingTypeClass* pBuilding, HouseClass* pHouse);
static bool CanGrindTechno(BuildingClass* pBuilding, TechnoClass* pTechno);
};
57 changes: 9 additions & 48 deletions src/Ext/Techno/Hooks.Grinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
#include <InfantryClass.h>

#include <Ext/Building/Body.h>
#include <Ext/BuildingType/Body.h>

DEFINE_HOOK(0x43C30A, BuildingClass_ReceiveMessage_Grinding, 0x6)
{
Expand Down Expand Up @@ -32,7 +31,7 @@ DEFINE_HOOK(0x43C30A, BuildingClass_ReceiveMessage_Grinding, 0x6)
return ReturnNegative;
}

return BuildingTypeExt::CanGrindTechno(pThis, pFrom) ? ReturnRoger : ReturnNegative;
return BuildingExt::CanGrindTechno(pThis, pFrom) ? ReturnRoger : ReturnNegative;
}

return 0;
Expand All @@ -53,7 +52,7 @@ DEFINE_HOOK(0x51F0AF, InfantryClass_WhatAction_Grinding, 0x0)
if (pBuilding->Type->Grinding && pThis->Owner->IsPlayerControl() && !pBuilding->IsBeingWarpedOut() &&
pThis->Owner->IsAlliedWith(pTarget) && (pExt->Grinding_AllowAllies || action == Action::Select))
{
action = BuildingTypeExt::CanGrindTechno(pBuilding, pThis) ? Action::Repair : Action::NoEnter;
action = BuildingExt::CanGrindTechno(pBuilding, pThis) ? Action::Repair : Action::NoEnter;
R->EBP(action);
return ReturnValue;
}
Expand All @@ -74,7 +73,7 @@ DEFINE_HOOK(0x51E63A, InfantryClass_WhatAction_Grinding_Engineer, 0x6)
{
if (const auto pExt = BuildingTypeExt::ExtMap.Find(pBuilding->Type))
{
bool canBeGrinded = BuildingTypeExt::CanGrindTechno(pBuilding, pThis);
bool canBeGrinded = BuildingExt::CanGrindTechno(pBuilding, pThis);
R->EBP(canBeGrinded ? Action::Repair : Action::NoGRepair);
return ReturnValue;
}
Expand All @@ -101,7 +100,7 @@ DEFINE_HOOK(0x740134, UnitClass_WhatAction_Grinding, 0x0)
if (pThis->SendCommand(RadioCommand::QueryCanEnter, pTarget) == RadioCommand::AnswerPositive)
{
bool isFlying = pThis->GetTechnoType()->MovementZone == MovementZone::Fly;
bool canBeGrinded = BuildingTypeExt::CanGrindTechno(pBuilding, pThis);
bool canBeGrinded = BuildingExt::CanGrindTechno(pBuilding, pThis);
action = pBuilding->Type->Grinding ? canBeGrinded && !isFlying ? Action::Repair : Action::NoEnter : !isFlying ? Action::Enter : Action::NoEnter;
R->EBX(action);
}
Expand All @@ -123,66 +122,28 @@ DEFINE_HOOK(0x4DFABD, FootClass_Try_Grinding_CheckIfAllowed, 0x8)
GET(FootClass*, pThis, ESI);
GET(BuildingClass*, pBuilding, EBX);

if (!BuildingTypeExt::CanGrindTechno(pBuilding, pThis))
if (!BuildingExt::CanGrindTechno(pBuilding, pThis))
return Skip;

return 0;
}

DEFINE_HOOK(0x5198AD, InfantryClass_PerCellProcess_Grinding, 0x6)
DEFINE_HOOK(0x5198B3, InfantryClass_PerCellProcess_Grinding, 0x5)
{
enum { Continue = 0x5198CE };

GET(InfantryClass*, pThis, ESI);
GET(BuildingClass*, pBuilding, EBX);

if (const auto pTypeExt = BuildingTypeExt::ExtMap.Find(pBuilding->Type))
{
if (const auto pExt = BuildingExt::ExtMap.Find(pBuilding))
{
if (pTypeExt->Grinding_Weapon.isset()
&& Unsorted::CurrentFrame >= pExt->GrindingWeapon_LastFiredFrame + pTypeExt->Grinding_Weapon.Get()->ROF)
{
TechnoExt::FireWeaponAtSelf(pBuilding, pTypeExt->Grinding_Weapon.Get());
pExt->GrindingWeapon_LastFiredFrame = Unsorted::CurrentFrame;
}
}

if (pTypeExt->Grinding_Sound.isset())
{
VocClass::PlayAt(pTypeExt->Grinding_Sound.Get(), pThis->GetCoords());
return Continue;
}
}

return 0;
return BuildingExt::DoGrindingExtras(pBuilding, pThis) ? Continue : 0;
}

DEFINE_HOOK(0x73A1BC, UnitClass_PerCellProcess_Grinding, 0x7)
DEFINE_HOOK(0x73A1C3, UnitClass_PerCellProcess_Grinding, 0x5)
{
enum { Continue = 0x73A1DE};

GET(UnitClass*, pThis, EBP);
GET(BuildingClass*, pBuilding, EBX);

if (const auto pTypeExt = BuildingTypeExt::ExtMap.Find(pBuilding->Type))
{
if (const auto pExt = BuildingExt::ExtMap.Find(pBuilding))
{
if (pTypeExt->Grinding_Weapon.isset()
&& Unsorted::CurrentFrame >= pExt->GrindingWeapon_LastFiredFrame + pTypeExt->Grinding_Weapon.Get()->ROF)
{
TechnoExt::FireWeaponAtSelf(pBuilding, pTypeExt->Grinding_Weapon.Get());
pExt->GrindingWeapon_LastFiredFrame = Unsorted::CurrentFrame;
}
}

if (pTypeExt->Grinding_Sound.isset())
{
VocClass::PlayAt(pTypeExt->Grinding_Sound.Get(), pThis->GetCoords());
return Continue;
}
}

return 0;
return BuildingExt::DoGrindingExtras(pBuilding, pThis) ? Continue : 0;
}