diff --git a/src/Misc/Observers.Visibility.cpp b/src/Misc/Observers.Visibility.cpp index 89dd51dd..9b3c2f9a 100644 --- a/src/Misc/Observers.Visibility.cpp +++ b/src/Misc/Observers.Visibility.cpp @@ -1,228 +1,228 @@ -/** -* yrpp-spawner -* -* Copyright(C) 2022-present CnCNet -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program.If not, see . -*/ - -#include -#include - -DEFINE_HOOK(0x703A09, TechnoClass_VisualCharacter_CloakVisibility, 0x7) -{ - enum { UseShadowyVisual = 0x703A5A, CheckMutualAlliance = 0x703A16 }; - - return HouseClass::IsCurrentPlayerObserver() - ? UseShadowyVisual - : CheckMutualAlliance; -} - -DEFINE_HOOK(0x45455B, BuildingClass_VisualCharacter_CloakVisibility, 0x5) -{ - enum { UseShadowyVisual = 0x45452D, CheckMutualAlliance = 0x454564 }; - - return HouseClass::IsCurrentPlayerObserver() - ? UseShadowyVisual - : CheckMutualAlliance; -} - -// Allow observers and mutual allies coordthing cloaked Technos -DEFINE_HOOK(0x692540, ScrollClass_Coordthing_TechnoClass_Cloak, 0x5) -{ - enum { AllowCoordthing = 0x69256B, CheckSensedByHouses = 0 }; - - if (HouseClass::IsCurrentPlayerObserver()) - return AllowCoordthing; - - GET(TechnoClass*, pTechno, ESI); - const auto pTechnoOwner = pTechno->Owner; - - if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) - return AllowCoordthing; - - return CheckSensedByHouses; -} - -// Allow observers and mutual allies coordthing cloaked Buildings -DEFINE_HOOK(0x6925AA, ScrollClass_Coordthing_BuildingClass_Cloak, 0x6) -{ - enum { AllowCoordthing = 0x6925F0, CheckSensedByHouses = 0 }; - - if (HouseClass::IsCurrentPlayerObserver()) - return AllowCoordthing; - - GET(TechnoClass*, pTechno, ESI); - const auto pTechnoOwner = pTechno->Owner; - - if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) - return AllowCoordthing; - - return CheckSensedByHouses; -} - -DEFINE_HOOK(0x6DA412, Tactical_SelectAt_Cloak, 0x6) -{ - enum { AllowSelect = 0x6DA43E, CheckSensedByHouses = 0 }; - - if (HouseClass::IsCurrentPlayerObserver()) - return AllowSelect; - - GET(TechnoClass*, pTechno, EAX); - const auto pTechnoOwner = pTechno->Owner; - - if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) - return AllowSelect; - - return CheckSensedByHouses; -} - -// Allow observers and mutual allies selected cloaked Technos -DEFINE_HOOK(0x6F4F19, TechnoClass_6F4EB0_Cloak, 0x6) -{ - enum { DontUnselect = 0x6F4F3A, CheckSensedByHouses = 0x6F4F21 }; - - if (HouseClass::IsCurrentPlayerObserver()) - return DontUnselect; - - GET(TechnoClass*, pTechno, ESI); - const auto pTechnoOwner = pTechno->Owner; - - if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) - return DontUnselect; - - return CheckSensedByHouses; -} - -// Allow observers and mutual allies selected cloaked Technos -DEFINE_HOOK(0x4ABE3C, DisplayClass_MouseLeftRelease_Cloak, 0xA) -{ - enum { AllowSelect = 0x4ABE4A, Unselect = 0x4ABE88 }; - - if (HouseClass::IsCurrentPlayerObserver()) - return AllowSelect; - - GET(TechnoClass*, pTechno, ESI); - const auto pTechnoOwner = pTechno->Owner; - - if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) - return AllowSelect; - - if (pTechno->IsSensorVisibleToPlayer()) - return AllowSelect; - - return Unselect; -} - -// Show cloaked Technos on radar for observers and mutual allies -DEFINE_HOOK(0x70D386, TechnoClass_Radar_Cloak, 0xA) -{ - enum { Show = 0x70D3CD, DontShow = 0x70D407 }; - - if (HouseClass::IsCurrentPlayerObserver()) - return Show; - - GET(TechnoClass*, pTechno, ESI); - const auto pTechnoOwner = pTechno->Owner; - - if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) - return Show; - - if (pTechno->IsSensorVisibleToPlayer()) - return Show; - - return DontShow; -} - -// Show tooltips for observers and mutual allies -DEFINE_HOOK(0x4AE62B, DisplayClass_HelpText_Cloak, 0x5) -{ - enum { CheckIsInvisible = 0x4AE654, CheckSensedByHouses = 0 }; - - if (HouseClass::IsCurrentPlayerObserver()) - return CheckIsInvisible; - - GET(TechnoClass*, pTechno, ECX); - const auto pTechnoOwner = pTechno->Owner; - - if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) - return CheckIsInvisible; - - if (pTechno->IsSensorVisibleToPlayer()) - return CheckIsInvisible; - - return CheckSensedByHouses; -} - -// Allow showing the select cursor on the object -DEFINE_HOOK(0x700594, TechnoClass_WhatAction__AllowAllies, 0x5) -{ - GET(TechnoClass*, pThis, ESI); - GET(ObjectClass*, pObject, EDI); - - return pObject->GetOwningHouse()->IsAlliedWith(pThis->Owner) ? 0x70059D : 0x7005E6; -} - -// Show disguised units (Spy and Mirage) for observer -#pragma region -// Show spy for observer -DEFINE_HOOK(0x4DEDC3, FootClass_GetImageData_Disguise, 0x6) -{ - return HouseClass::IsCurrentPlayerObserver() - ? 0x4DEE15 - : 0; -} - -// Show real name of spy for observer -DEFINE_HOOK(0x51F2F3, InfantryClass_FullName_Disguise, 0x6) -{ - return HouseClass::IsCurrentPlayerObserver() - ? 0x51F31A - : 0; -} - -// Flash disguise for Observer -DEFINE_HOOK(0x70EE6A, TechnoClass_DisguiseBeenSeen, 0x6) -{ - return HouseClass::IsCurrentPlayerObserver() - ? 0x70EE79 - : 0; -} - -// Allow observers selected disguise -DEFINE_HOOK(0x7467CA, UnitClass_CantTargetDisguise, 0x5) -{ - GET(HouseClass*, pHouse, EDI); - return pHouse->IsObserver() - ? 0x7467FE - : 0; -} -#pragma endregion - -// Allow Observer to see Pips -#pragma region -DEFINE_HOOK(0x6F677D, TechnoClass_DrawSelection_Observer1, 0x5) -{ - return HouseClass::IsCurrentPlayerObserver() - ? 0x6F67B2 - : 0; -} - -DEFINE_HOOK(0x6F6A58, TechnoClass_DrawSelection_Observer2, 0x6) -{ - return HouseClass::IsCurrentPlayerObserver() - ? 0x6F6A8E - : 0; -} -#pragma endregion +/** +* yrpp-spawner +* +* Copyright(C) 2022-present CnCNet +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program.If not, see . +*/ + +#include +#include + +DEFINE_HOOK(0x703A09, TechnoClass_VisualCharacter_CloakVisibility, 0x7) +{ + enum { UseShadowyVisual = 0x703A5A, CheckMutualAlliance = 0x703A16 }; + + return HouseClass::IsCurrentPlayerObserver() + ? UseShadowyVisual + : CheckMutualAlliance; +} + +DEFINE_HOOK(0x45455B, BuildingClass_VisualCharacter_CloakVisibility, 0x5) +{ + enum { UseShadowyVisual = 0x45452D, CheckMutualAlliance = 0x454564 }; + + return HouseClass::IsCurrentPlayerObserver() + ? UseShadowyVisual + : CheckMutualAlliance; +} + +// Allow observers and mutual allies coordthing cloaked Technos +DEFINE_HOOK(0x692540, ScrollClass_Coordthing_TechnoClass_Cloak, 0x5) +{ + enum { AllowCoordthing = 0x69256B, CheckSensedByHouses = 0 }; + + if (HouseClass::IsCurrentPlayerObserver()) + return AllowCoordthing; + + GET(TechnoClass*, pTechno, ESI); + const auto pTechnoOwner = pTechno->Owner; + + if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) + return AllowCoordthing; + + return CheckSensedByHouses; +} + +// Allow observers and mutual allies coordthing cloaked Buildings +DEFINE_HOOK(0x6925AA, ScrollClass_Coordthing_BuildingClass_Cloak, 0x6) +{ + enum { AllowCoordthing = 0x6925F0, CheckSensedByHouses = 0 }; + + if (HouseClass::IsCurrentPlayerObserver()) + return AllowCoordthing; + + GET(TechnoClass*, pTechno, ESI); + const auto pTechnoOwner = pTechno->Owner; + + if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) + return AllowCoordthing; + + return CheckSensedByHouses; +} + +DEFINE_HOOK(0x6DA412, Tactical_SelectAt_Cloak, 0x6) +{ + enum { AllowSelect = 0x6DA43E, CheckSensedByHouses = 0 }; + + if (HouseClass::IsCurrentPlayerObserver()) + return AllowSelect; + + GET(TechnoClass*, pTechno, EAX); + const auto pTechnoOwner = pTechno->Owner; + + if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) + return AllowSelect; + + return CheckSensedByHouses; +} + +// Allow observers and mutual allies selected cloaked Technos +DEFINE_HOOK(0x6F4F19, TechnoClass_6F4EB0_Cloak, 0x6) +{ + enum { DontUnselect = 0x6F4F3A, CheckSensedByHouses = 0x6F4F21 }; + + if (HouseClass::IsCurrentPlayerObserver()) + return DontUnselect; + + GET(TechnoClass*, pTechno, ESI); + const auto pTechnoOwner = pTechno->Owner; + + if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) + return DontUnselect; + + return CheckSensedByHouses; +} + +// Allow observers and mutual allies selected cloaked Technos +DEFINE_HOOK(0x4ABE3C, DisplayClass_MouseLeftRelease_Cloak, 0xA) +{ + enum { AllowSelect = 0x4ABE4A, Unselect = 0x4ABE88 }; + + if (HouseClass::IsCurrentPlayerObserver()) + return AllowSelect; + + GET(TechnoClass*, pTechno, ESI); + const auto pTechnoOwner = pTechno->Owner; + + if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) + return AllowSelect; + + if (pTechno->IsSensorVisibleToPlayer()) + return AllowSelect; + + return Unselect; +} + +// Show cloaked Technos on radar for observers and mutual allies +DEFINE_HOOK(0x70D386, TechnoClass_Radar_Cloak, 0xA) +{ + enum { Show = 0x70D3CD, DontShow = 0x70D407 }; + + if (HouseClass::IsCurrentPlayerObserver()) + return Show; + + GET(TechnoClass*, pTechno, ESI); + const auto pTechnoOwner = pTechno->Owner; + + if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) + return Show; + + if (pTechno->IsSensorVisibleToPlayer()) + return Show; + + return DontShow; +} + +// Show tooltips for observers and mutual allies +DEFINE_HOOK(0x4AE62B, DisplayClass_HelpText_Cloak, 0x5) +{ + enum { CheckIsInvisible = 0x4AE654, CheckSensedByHouses = 0 }; + + if (HouseClass::IsCurrentPlayerObserver()) + return CheckIsInvisible; + + GET(TechnoClass*, pTechno, ECX); + const auto pTechnoOwner = pTechno->Owner; + + if (pTechnoOwner && pTechnoOwner->IsMutualAllie(HouseClass::CurrentPlayer)) + return CheckIsInvisible; + + if (pTechno->IsSensorVisibleToPlayer()) + return CheckIsInvisible; + + return CheckSensedByHouses; +} + +// Allow showing the select cursor on the object +DEFINE_HOOK(0x700594, TechnoClass_WhatAction__AllowAllies, 0x5) +{ + GET(TechnoClass*, pThis, ESI); + GET(ObjectClass*, pObject, EDI); + + return pThis->Owner->IsAlliedWith(pObject) ? 0x70059D : 0x7005E6; +} + +// Show disguised units (Spy and Mirage) for observer +#pragma region +// Show spy for observer +DEFINE_HOOK(0x4DEDC3, FootClass_GetImageData_Disguise, 0x6) +{ + return HouseClass::IsCurrentPlayerObserver() + ? 0x4DEE15 + : 0; +} + +// Show real name of spy for observer +DEFINE_HOOK(0x51F2F3, InfantryClass_FullName_Disguise, 0x6) +{ + return HouseClass::IsCurrentPlayerObserver() + ? 0x51F31A + : 0; +} + +// Flash disguise for Observer +DEFINE_HOOK(0x70EE6A, TechnoClass_DisguiseBeenSeen, 0x6) +{ + return HouseClass::IsCurrentPlayerObserver() + ? 0x70EE79 + : 0; +} + +// Allow observers selected disguise +DEFINE_HOOK(0x7467CA, UnitClass_CantTargetDisguise, 0x5) +{ + GET(HouseClass*, pHouse, EDI); + return pHouse->IsObserver() + ? 0x7467FE + : 0; +} +#pragma endregion + +// Allow Observer to see Pips +#pragma region +DEFINE_HOOK(0x6F677D, TechnoClass_DrawSelection_Observer1, 0x5) +{ + return HouseClass::IsCurrentPlayerObserver() + ? 0x6F67B2 + : 0; +} + +DEFINE_HOOK(0x6F6A58, TechnoClass_DrawSelection_Observer2, 0x6) +{ + return HouseClass::IsCurrentPlayerObserver() + ? 0x6F6A8E + : 0; +} +#pragma endregion