From 6c645132da128e4939c120cfe22f9440a04e1d3f Mon Sep 17 00:00:00 2001 From: Starkku Date: Wed, 16 Mar 2022 12:43:47 +0200 Subject: [PATCH] Refactor & fix grinding code - Fix PerCellProcess hook conflicts with Ares - Move CanGrindTechno from BuildingTypeExt to BuildingExt - Move PerCellProcess hook code to a function in BuildingExt to reduce redundancy --- src/Ext/Building/Body.cpp | 54 +++++++++++++++++++++++++++++ src/Ext/Building/Body.h | 3 ++ src/Ext/BuildingType/Body.cpp | 31 ----------------- src/Ext/BuildingType/Body.h | 1 - src/Ext/Techno/Hooks.Grinding.cpp | 57 +++++-------------------------- 5 files changed, 66 insertions(+), 80 deletions(-) diff --git a/src/Ext/Building/Body.cpp b/src/Ext/Building/Body.cpp index 44ee878df5..6198168f1d 100644 --- a/src/Ext/Building/Body.cpp +++ b/src/Ext/Building/Body.cpp @@ -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 diff --git a/src/Ext/Building/Body.h b/src/Ext/Building/Body.h index a1573f0fd6..fbc575619b 100644 --- a/src/Ext/Building/Body.h +++ b/src/Ext/Building/Body.h @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -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); }; \ No newline at end of file diff --git a/src/Ext/BuildingType/Body.cpp b/src/Ext/BuildingType/Body.cpp index 818cb5c6d5..c4a0baa04a 100644 --- a/src/Ext/BuildingType/Body.cpp +++ b/src/Ext/BuildingType/Body.cpp @@ -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() { diff --git a/src/Ext/BuildingType/Body.h b/src/Ext/BuildingType/Body.h index 9de227886a..a69745d973 100644 --- a/src/Ext/BuildingType/Body.h +++ b/src/Ext/BuildingType/Body.h @@ -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); }; \ No newline at end of file diff --git a/src/Ext/Techno/Hooks.Grinding.cpp b/src/Ext/Techno/Hooks.Grinding.cpp index 8e393dc2fd..1e63b407b5 100644 --- a/src/Ext/Techno/Hooks.Grinding.cpp +++ b/src/Ext/Techno/Hooks.Grinding.cpp @@ -3,7 +3,6 @@ #include #include -#include DEFINE_HOOK(0x43C30A, BuildingClass_ReceiveMessage_Grinding, 0x6) { @@ -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; @@ -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; } @@ -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; } @@ -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); } @@ -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; } \ No newline at end of file