From 050c4f6742788e1efe3329414a3781c100906cff Mon Sep 17 00:00:00 2001 From: Starkku Date: Fri, 25 Mar 2022 15:48:04 +0200 Subject: [PATCH 1/4] Fix aircraft & jumpjet units being unaffected by speed modifiers --- README.md | 2 +- YRpp | 2 +- docs/Fixed-or-Improved-Logics.md | 1 + docs/Whats-New.md | 1 + src/Misc/Hooks.BugFixes.cpp | 45 ++++++++++++++++++++++++++++++++ 5 files changed, 49 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b7b417a8a4..8d959a88e4 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Credits - **ChrisLv_CN** - interceptor logic, LaserTrails, laser fixes, general assistance (work relicensed under [following permission](images/ChrisLv-relicense.png)) - **Xkein** - general assistance, YRpp edits - **thomassneddon** - general assistance -- **Starkku** - Warhead shield penetration & breaking, strafing aircraft weapon customization, vehicle DeployFire fixes/improvements, stationary VehicleTypes, Burst logic improvements, TechnoType auto-firing weapons, Secondary weapon fallback customization, weapon target type filtering, AreaFire targeting customization, CreateUnit improvements, Attached animation & jumpjet unit layer customization, IsSimpleDeployer improvements, Shield modification warheads, Warhead decloaking toggle, Warp(In/Out)Weapon, Grinder improvements / additions, Attached animation position customization, Critical hit logic additions +- **Starkku** - Warhead shield penetration & breaking, strafing aircraft weapon customization, vehicle DeployFire fixes/improvements, stationary VehicleTypes, Burst logic improvements, TechnoType auto-firing weapons, Secondary weapon fallback customization, weapon target type filtering, AreaFire targeting customization, CreateUnit improvements, Attached animation & jumpjet unit layer customization, IsSimpleDeployer improvements, Shield modification warheads, Warhead decloaking toggle, Warp(In/Out)Weapon, Grinder improvements / additions, Attached animation position customization, Critical hit logic additions, Aircraft & jumpjet speed modifiers fix - **SukaHati (Erzoid)** - Minimum interceptor guard range - **Morton (MortonPL)** - XDrawOffset, Shield passthrough & absorption, building LimboDelivery, fix for Image in art rules, power delta counter - **mevitar** - honorary shield tester *triple* award diff --git a/YRpp b/YRpp index 7a71d0698b..9ecaa0167b 160000 --- a/YRpp +++ b/YRpp @@ -1 +1 @@ -Subproject commit 7a71d0698b36e38761d93576127b2503909614b0 +Subproject commit 9ecaa0167b73af9b2b01d3170422542d76f64609 diff --git a/docs/Fixed-or-Improved-Logics.md b/docs/Fixed-or-Improved-Logics.md index bcd0f1280b..2d55ba1c3f 100644 --- a/docs/Fixed-or-Improved-Logics.md +++ b/docs/Fixed-or-Improved-Logics.md @@ -50,6 +50,7 @@ This page describes all ingame logics that are fixed or improved in Phobos witho - Fixed interaction of `UnitAbsorb` & `InfantryAbsorb` with `Grinding` buildings. The keys will now make the building only accept appropriate types of objects. - Fixed missing 'no enter' cursor for VehicleTypes being unable to enter a `Grinding` building. - Fixed Engineers being able to enter `Grinding` buildings even when they shouldn't (such as ally building at full HP). +- Aircraft & jumpjet units are now affected by speed modifiers such as `SpeedAircraft/Infantry/UnitsMult` on `Countries`, `VeteranSpeed` and Crates / AttachEffect (Ares feature). ## Animations diff --git a/docs/Whats-New.md b/docs/Whats-New.md index f910ea4989..10ac9e8517 100644 --- a/docs/Whats-New.md +++ b/docs/Whats-New.md @@ -291,6 +291,7 @@ Vanilla fixes: - Fixed AI Aircraft docks bug when Ares tag `[GlobalControls]` > `AllowParallelAIQueues=no` is set (by FS-21) - Fixed the bug when occupied building's `MuzzleFlashX` is drawn on the center of the building when `X` goes past 10 (by Otamaa) - Fixed jumpjet units that are `Crashable` not crashing to ground properly if destroyed while being pulled by a `Locomotor` warhead (by Starkku) +- Fixed aircraft & jumpjet units not being affected by speed modifiers (by Starkku) Phobos fixes: - Fixed shields being able to take damage when the parent TechnoType was under effects of a `Temporal` Warhead (by Starkku) diff --git a/src/Misc/Hooks.BugFixes.cpp b/src/Misc/Hooks.BugFixes.cpp index cb1f68565c..4306ffd381 100644 --- a/src/Misc/Hooks.BugFixes.cpp +++ b/src/Misc/Hooks.BugFixes.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include @@ -363,5 +365,48 @@ DEFINE_HOOK(0x480552, CellClass_AttachesToNeighbourOverlay_Gate, 0x7) } } + return 0; +} + + +DEFINE_HOOK(0x4CFE21, FlyLocomotionClass_Apparent_Speed_Modifiers, 0x7) +{ + enum { SkipGameCode = 0x4CFE3E }; + + GET_STACK(FlyLocomotionClass*, pThis, STACK_OFFS(0x4, 0x4)); + + auto pFoot = pThis->LinkedTo; + + double currentSpeed = pFoot->GetTechnoType()->Speed * pThis->CurrentSpeed * + pFoot->SpeedMultiplier * pFoot->Owner->Type->SpeedAircraftMult * + (pFoot->HasAbility(Ability::Faster) ? RulesClass::Instance->VeteranSpeed : 1.0); + + R->EAX(currentSpeed); + + return SkipGameCode; +} + + +DEFINE_HOOK(0x54D138, JumpjetLocomotionClass_Movement_AI_SpeedModifiers, 0x6) +{ + GET(JumpjetLocomotionClass*, pThis, ESI); + + if (pThis->CurrentSpeed > 0.0) + { + auto pFoot = pThis->LinkedTo; + + double houseMultiplier = 1.0; + + if (pFoot->WhatAmI() == AbstractType::Infantry) + houseMultiplier = pFoot->Owner->Type->SpeedInfantryMult; + else + houseMultiplier = pFoot->Owner->Type->SpeedUnitsMult; + + double multiplier = pFoot->SpeedMultiplier * houseMultiplier * + (pFoot->HasAbility(Ability::Faster) ? RulesClass::Instance->VeteranSpeed : 1.0); + + pThis->Speed = (int)(pFoot->GetTechnoType()->JumpjetSpeed * multiplier); + } + return 0; } \ No newline at end of file From b08b66470c1ff0be3348faabb37d497403c4216d Mon Sep 17 00:00:00 2001 From: Starkku Date: Wed, 30 Mar 2022 04:24:46 +0300 Subject: [PATCH 2/4] Fix hooks --- src/Ext/Aircraft/Hooks.cpp | 12 ++++---- src/Ext/Techno/Body.cpp | 15 ++++++++++ src/Ext/Techno/Body.h | 2 +- src/Misc/Hooks.BugFixes.cpp | 59 +++++++++++++++++++++++-------------- 4 files changed, 59 insertions(+), 29 deletions(-) diff --git a/src/Ext/Aircraft/Hooks.cpp b/src/Ext/Aircraft/Hooks.cpp index fed8bbc168..bfa7e1c756 100644 --- a/src/Ext/Aircraft/Hooks.cpp +++ b/src/Ext/Aircraft/Hooks.cpp @@ -29,7 +29,7 @@ DEFINE_HOOK(0x417FF1, AircraftClass_Mission_Attack_StrafeShots, 0x6) return 0; } -DEFINE_HOOK(0x418409, AircraftClass_Mission_Attack_FireAtTarget_BurstFix, 0x0) +DEFINE_HOOK(0x418403, AircraftClass_Mission_Attack_FireAtTarget_BurstFix, 0x8) { GET(AircraftClass*, pThis, ESI); @@ -40,7 +40,7 @@ DEFINE_HOOK(0x418409, AircraftClass_Mission_Attack_FireAtTarget_BurstFix, 0x0) return 0x418478; } -DEFINE_HOOK(0x4186B6, AircraftClass_Mission_Attack_FireAtTarget2_BurstFix, 0x0) +DEFINE_HOOK(0x4186B6, AircraftClass_Mission_Attack_FireAtTarget2_BurstFix, 0x8) { GET(AircraftClass*, pThis, ESI); @@ -49,7 +49,7 @@ DEFINE_HOOK(0x4186B6, AircraftClass_Mission_Attack_FireAtTarget2_BurstFix, 0x0) return 0x4186D7; } -DEFINE_HOOK(0x418805, AircraftClass_Mission_Attack_FireAtTarget2Strafe_BurstFix, 0x0) +DEFINE_HOOK(0x418805, AircraftClass_Mission_Attack_FireAtTarget2Strafe_BurstFix, 0x8) { GET(AircraftClass*, pThis, ESI); @@ -58,7 +58,7 @@ DEFINE_HOOK(0x418805, AircraftClass_Mission_Attack_FireAtTarget2Strafe_BurstFix, return 0x418826; } -DEFINE_HOOK(0x418914, AircraftClass_Mission_Attack_FireAtTarget3Strafe_BurstFix, 0x0) +DEFINE_HOOK(0x418914, AircraftClass_Mission_Attack_FireAtTarget3Strafe_BurstFix, 0x8) { GET(AircraftClass*, pThis, ESI); @@ -67,7 +67,7 @@ DEFINE_HOOK(0x418914, AircraftClass_Mission_Attack_FireAtTarget3Strafe_BurstFix, return 0x418935; } -DEFINE_HOOK(0x418A23, AircraftClass_Mission_Attack_FireAtTarget4Strafe_BurstFix, 0x0) +DEFINE_HOOK(0x418A23, AircraftClass_Mission_Attack_FireAtTarget4Strafe_BurstFix, 0x8) { GET(AircraftClass*, pThis, ESI); @@ -76,7 +76,7 @@ DEFINE_HOOK(0x418A23, AircraftClass_Mission_Attack_FireAtTarget4Strafe_BurstFix, return 0x418A44; } -DEFINE_HOOK(0x418B25, AircraftClass_Mission_Attack_FireAtTarget5Strafe_BurstFix, 0x0) +DEFINE_HOOK(0x418B1F, AircraftClass_Mission_Attack_FireAtTarget5Strafe_BurstFix, 0x8) { GET(AircraftClass*, pThis, ESI); diff --git a/src/Ext/Techno/Body.cpp b/src/Ext/Techno/Body.cpp index 3c9fedd229..17f4443d59 100644 --- a/src/Ext/Techno/Body.cpp +++ b/src/Ext/Techno/Body.cpp @@ -494,6 +494,21 @@ void TechnoExt::UpdateSharedAmmo(TechnoClass* pThis) } } +double TechnoExt::GetCurrentSpeedMultiplier(FootClass* pThis) +{ + double houseMultiplier = 1.0; + + if (pThis->WhatAmI() == AbstractType::Aircraft) + houseMultiplier = pThis->Owner->Type->SpeedAircraftMult; + else if (pThis->WhatAmI() == AbstractType::Infantry) + houseMultiplier = pThis->Owner->Type->SpeedInfantryMult; + else + houseMultiplier = pThis->Owner->Type->SpeedUnitsMult; + + return pThis->SpeedMultiplier * houseMultiplier * + (pThis->HasAbility(Ability::Faster) ? RulesClass::Instance->VeteranSpeed : 1.0); +} + // ============================= // load / save diff --git a/src/Ext/Techno/Body.h b/src/Ext/Techno/Body.h index 77ffe79168..9d7819550a 100644 --- a/src/Ext/Techno/Body.h +++ b/src/Ext/Techno/Body.h @@ -95,6 +95,6 @@ class TechnoExt static void ObjectKilledBy(TechnoClass* pThis, TechnoClass* pKiller); static void EatPassengers(TechnoClass* pThis); static void UpdateSharedAmmo(TechnoClass* pThis); - + static double GetCurrentSpeedMultiplier(FootClass* pThis); static bool CanFireNoAmmoWeapon(TechnoClass* pThis, int weaponIndex); }; diff --git a/src/Misc/Hooks.BugFixes.cpp b/src/Misc/Hooks.BugFixes.cpp index 4306ffd381..e25f26d5e0 100644 --- a/src/Misc/Hooks.BugFixes.cpp +++ b/src/Misc/Hooks.BugFixes.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -13,6 +14,7 @@ #include #include +#include #include #include @@ -368,24 +370,47 @@ DEFINE_HOOK(0x480552, CellClass_AttachesToNeighbourOverlay_Gate, 0x7) return 0; } - -DEFINE_HOOK(0x4CFE21, FlyLocomotionClass_Apparent_Speed_Modifiers, 0x7) +DEFINE_HOOK(0x415F5C, AircraftClass_FireAt_SpeedModifiers, 0xA) { - enum { SkipGameCode = 0x4CFE3E }; + GET(AircraftClass*, pThis, EDI); + + if (pThis->Type->Locomotor == LocomotionClass::CLSIDs::Fly) + { + if (const auto pLocomotor = static_cast(pThis->Locomotor.get())) + { + double currentSpeed = pThis->GetTechnoType()->Speed * pLocomotor->CurrentSpeed * + TechnoExt::GetCurrentSpeedMultiplier(pThis); + + R->EAX(static_cast(currentSpeed)); + } + } - GET_STACK(FlyLocomotionClass*, pThis, STACK_OFFS(0x4, 0x4)); + return 0; +} - auto pFoot = pThis->LinkedTo; +DEFINE_HOOK(0x4CDA78, FlyLocomotionClass_MovementAI_SpeedModifiers, 0x6) +{ + GET(FlyLocomotionClass*, pThis, ESI); - double currentSpeed = pFoot->GetTechnoType()->Speed * pThis->CurrentSpeed * - pFoot->SpeedMultiplier * pFoot->Owner->Type->SpeedAircraftMult * - (pFoot->HasAbility(Ability::Faster) ? RulesClass::Instance->VeteranSpeed : 1.0); + double currentSpeed = pThis->LinkedTo->GetTechnoType()->Speed * pThis->CurrentSpeed * + TechnoExt::GetCurrentSpeedMultiplier(pThis->LinkedTo); - R->EAX(currentSpeed); + R->EAX(static_cast(currentSpeed)); - return SkipGameCode; + return 0; } +DEFINE_HOOK(0x4CE4BF, FlyLocomotionClass_4CE4B0_SpeedModifiers, 0x6) +{ + GET(FlyLocomotionClass*, pThis, ECX); + + double currentSpeed = pThis->LinkedTo->GetTechnoType()->Speed * pThis->CurrentSpeed * + TechnoExt::GetCurrentSpeedMultiplier(pThis->LinkedTo); + + R->EAX(static_cast(currentSpeed)); + + return 0; +} DEFINE_HOOK(0x54D138, JumpjetLocomotionClass_Movement_AI_SpeedModifiers, 0x6) { @@ -393,19 +418,9 @@ DEFINE_HOOK(0x54D138, JumpjetLocomotionClass_Movement_AI_SpeedModifiers, 0x6) if (pThis->CurrentSpeed > 0.0) { - auto pFoot = pThis->LinkedTo; - - double houseMultiplier = 1.0; - - if (pFoot->WhatAmI() == AbstractType::Infantry) - houseMultiplier = pFoot->Owner->Type->SpeedInfantryMult; - else - houseMultiplier = pFoot->Owner->Type->SpeedUnitsMult; - - double multiplier = pFoot->SpeedMultiplier * houseMultiplier * - (pFoot->HasAbility(Ability::Faster) ? RulesClass::Instance->VeteranSpeed : 1.0); + double multiplier = TechnoExt::GetCurrentSpeedMultiplier(pThis->LinkedTo); - pThis->Speed = (int)(pFoot->GetTechnoType()->JumpjetSpeed * multiplier); + pThis->Speed = (int)(pThis->LinkedTo->GetTechnoType()->JumpjetSpeed * multiplier); } return 0; From 36551e5b64892a88c6ecb9878ad7dd19d77fa23b Mon Sep 17 00:00:00 2001 From: Kerbiter Date: Wed, 30 Mar 2022 09:23:41 +0300 Subject: [PATCH 3/4] Remove excess newline --- src/Misc/Hooks.BugFixes.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Misc/Hooks.BugFixes.cpp b/src/Misc/Hooks.BugFixes.cpp index e25f26d5e0..aa4c063775 100644 --- a/src/Misc/Hooks.BugFixes.cpp +++ b/src/Misc/Hooks.BugFixes.cpp @@ -419,7 +419,6 @@ DEFINE_HOOK(0x54D138, JumpjetLocomotionClass_Movement_AI_SpeedModifiers, 0x6) if (pThis->CurrentSpeed > 0.0) { double multiplier = TechnoExt::GetCurrentSpeedMultiplier(pThis->LinkedTo); - pThis->Speed = (int)(pThis->LinkedTo->GetTechnoType()->JumpjetSpeed * multiplier); } From 34017013d4ae11209bc8991f4a1cfcf5bb0c4e55 Mon Sep 17 00:00:00 2001 From: Starkku Date: Wed, 30 Mar 2022 14:07:27 +0300 Subject: [PATCH 4/4] Fix jumpjets locking into place permanently if their speed is dropped to 0 --- src/Misc/Hooks.BugFixes.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Misc/Hooks.BugFixes.cpp b/src/Misc/Hooks.BugFixes.cpp index aa4c063775..ec5165e44f 100644 --- a/src/Misc/Hooks.BugFixes.cpp +++ b/src/Misc/Hooks.BugFixes.cpp @@ -416,11 +416,8 @@ DEFINE_HOOK(0x54D138, JumpjetLocomotionClass_Movement_AI_SpeedModifiers, 0x6) { GET(JumpjetLocomotionClass*, pThis, ESI); - if (pThis->CurrentSpeed > 0.0) - { - double multiplier = TechnoExt::GetCurrentSpeedMultiplier(pThis->LinkedTo); - pThis->Speed = (int)(pThis->LinkedTo->GetTechnoType()->JumpjetSpeed * multiplier); - } + double multiplier = TechnoExt::GetCurrentSpeedMultiplier(pThis->LinkedTo); + pThis->Speed = (int)(pThis->LinkedTo->GetTechnoType()->JumpjetSpeed * multiplier); return 0; } \ No newline at end of file