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/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 cb1f68565c..ec5165e44f 100644 --- a/src/Misc/Hooks.BugFixes.cpp +++ b/src/Misc/Hooks.BugFixes.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -8,9 +9,12 @@ #include #include #include +#include +#include #include #include +#include #include #include @@ -363,5 +367,57 @@ DEFINE_HOOK(0x480552, CellClass_AttachesToNeighbourOverlay_Gate, 0x7) } } + return 0; +} + +DEFINE_HOOK(0x415F5C, AircraftClass_FireAt_SpeedModifiers, 0xA) +{ + 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)); + } + } + + return 0; +} + +DEFINE_HOOK(0x4CDA78, FlyLocomotionClass_MovementAI_SpeedModifiers, 0x6) +{ + GET(FlyLocomotionClass*, pThis, ESI); + + double currentSpeed = pThis->LinkedTo->GetTechnoType()->Speed * pThis->CurrentSpeed * + TechnoExt::GetCurrentSpeedMultiplier(pThis->LinkedTo); + + R->EAX(static_cast(currentSpeed)); + + 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) +{ + GET(JumpjetLocomotionClass*, pThis, ESI); + + double multiplier = TechnoExt::GetCurrentSpeedMultiplier(pThis->LinkedTo); + pThis->Speed = (int)(pThis->LinkedTo->GetTechnoType()->JumpjetSpeed * multiplier); + return 0; } \ No newline at end of file