diff --git a/src/Ext/Techno/Body.cpp b/src/Ext/Techno/Body.cpp index ed4ebd3ce3..cfead9c0d3 100644 --- a/src/Ext/Techno/Body.cpp +++ b/src/Ext/Techno/Body.cpp @@ -329,10 +329,6 @@ bool TechnoExt::ConvertToType(FootClass* pThis, TechnoTypeClass* pToType) if (AresFunctions::ConvertTypeTo(pThis, pToType)) { - // Fixed an issue where morphing could result in -1 health. - const double ratio = static_cast(pToType->Strength) / pType->Strength; - pThis->Health = static_cast(oldHealth * ratio + 0.5); - auto const pTypeExt = TechnoExt::ExtMap.Find(pThis); pTypeExt->UpdateTypeData(pToType); pTypeExt->UpdateTypeData_Foot(); @@ -833,7 +829,7 @@ bool TechnoExt::SimpleDeployerAllowedToDeploy(UnitClass* pThis, bool defaultValu const bool isLander = pType->DeployToLand && (isJumpjet || isHover); disallowedLandTypes = isLander ? (LandTypeFlags)(LandTypeFlags::Water | LandTypeFlags::Beach) : LandTypeFlags::None; } - + if (IsLandTypeInFlags(disallowedLandTypes, pThis->GetCell()->LandType)) return false; diff --git a/src/Misc/Hooks.BugFixes.cpp b/src/Misc/Hooks.BugFixes.cpp index 941dd90b55..b2f5a458be 100644 --- a/src/Misc/Hooks.BugFixes.cpp +++ b/src/Misc/Hooks.BugFixes.cpp @@ -3089,3 +3089,43 @@ DEFINE_HOOK(0x6F833E, TechnoClass_CanAutoTargetObject_Garrisonable, 0x6) R->AL(garrisonable && (isFullMap || pThis->MegaMissionIsAttackMove())); // Attack move is allowed because it can switch to Mission::Attack return 0; } + +#pragma region SetHealthPercentageFix + +DEFINE_HOOK(0x5F5C80, ObjectClass_SetHealthPercentage_Round, 0xA) +{ + enum { SkipGameCode = 0x5F5CBA }; + + GET(ObjectClass* const, pThis, ECX); + GET_STACK(const double, percentage, STACK_OFFSET(0x0, 0x4)); + + pThis->Health = (percentage <= 0.0) ? 0 : Math::max(1, Game::F2I(pThis->GetType()->Strength * percentage + 0.5)); + + return SkipGameCode; +} + +DEFINE_HOOK(0x44A010, BuildingClass_Mission_Selling_SetUnitHealthPercentage, 0xA) +{ + enum { SkipGameCode = 0x44A03C }; + + GET(UnitClass* const, pUnit, EBX); + GET_STACK(const double, percentage, STACK_OFFSET(0xD0, -0xAC)); + + pUnit->SetHealthPercentage(percentage); + pUnit->EstimatedHealth = pUnit->Health; + return SkipGameCode; +} + +DEFINE_HOOK(0x73992B, UnitClass_TryToDeploy_SetBuildingHealthPercentage, 0x7) +{ + enum { SkipGameCode = 0x739956 }; + + GET(const UnitClass* const, pThis, EBP); + GET(BuildingClass* const, pBuilding, EBX); + + pBuilding->SetHealthPercentage(pThis->GetHealthPercentage()); + pBuilding->EstimatedHealth = pBuilding->Health; + return SkipGameCode; +} + +#pragma endregion