diff --git a/CREDITS.md b/CREDITS.md index 0fb9954050..52ea1baa01 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -149,6 +149,7 @@ This page lists all the individual contributions to the project by their author. - Warhead activation target health thresholds enhancements - Event 606: AttachEffect is attaching to a Techno - Linked superweapons + - Unit & infantry auto-conversion on ammo change - **Starkku**: - Misc. minor bugfixes & improvements - AI script actions: diff --git a/YRpp b/YRpp index 1a4e510539..2d19944aa0 160000 --- a/YRpp +++ b/YRpp @@ -1 +1 @@ -Subproject commit 1a4e510539459bc3535b477e2b1a873fc62821f0 +Subproject commit 2d19944aa0846a098826b4cdd2e0ac00f36915b0 diff --git a/docs/Fixed-or-Improved-Logics.md b/docs/Fixed-or-Improved-Logics.md index 0b32fc9a08..1ff6fc7542 100644 --- a/docs/Fixed-or-Improved-Logics.md +++ b/docs/Fixed-or-Improved-Logics.md @@ -1804,6 +1804,27 @@ HarvesterDumpAmount=0.0 ; float point value HarvesterDumpAmount= ; float point value ``` +### Unit & infantry auto-conversion on ammo change + +- Units & infantry can now be converted into another unit by ammo count. +- `Ammo.AutoConvertMinimumAmount` determines the minimal number of ammo at which a unit converts automatically after the ammo update. +- `Ammo.AutoConvertMaximumAmount` determines the maximum number of ammo at which a unit converts automatically after the ammo update. +- `Ammo.AutoConvertType` specify the new techno after the conversion. This unit must be of the same type of the original (vehicle -> vehicle or infantry -> infantry). +- Setting a negative number will disable ammo count check. + +In `rulesmd.ini`: +```ini +[SOMETECHNO] ; InfantryType or VehicleType +Ammo.AutoConvertMinimumAmount=-1 ; integer +Ammo.AutoConvertMaximumAmount=-1 ; integer +Ammo.AutoConvertType= ; InfantryType or VehicleType +``` + +```{warning} +This auto-conversion feature requires [Ares](https://github.com/Ares-Developers/Ares). +Aircrafts weren't tested but if Ares supported them then this feature should work on them too. +``` + ## Veinholes & Weeds ### Veinholes diff --git a/docs/Whats-New.md b/docs/Whats-New.md index 007025be34..132d1bb611 100644 --- a/docs/Whats-New.md +++ b/docs/Whats-New.md @@ -425,6 +425,7 @@ New: - [Damaged aircraft image changes](New-or-Enhanced-Logics.md#damaged-aircraft-image-changes) (by Fryone) - [Additional attached animation position customizations](Fixed-or-Improved-Logics.md#attached-animation-position-customization) (by Starkku) - Use `SkipCrushSlowdown=true` to avoid the bug related to `Accelerates=true` and `MovementZone=CrushAll` (by TaranDahl) +- Unit & infantry auto-conversion on ammo change (by FS-21) Vanilla fixes: - Fixed sidebar not updating queued unit numbers when adding or removing units when the production is on hold (by CrimRecya) diff --git a/src/Ext/Techno/Body.Update.cpp b/src/Ext/Techno/Body.Update.cpp index 8d2d91efb1..3568417aa3 100644 --- a/src/Ext/Techno/Body.Update.cpp +++ b/src/Ext/Techno/Body.Update.cpp @@ -18,6 +18,7 @@ #include #include #include +#include // TechnoClass_AI_0x6F9E50 @@ -43,6 +44,7 @@ void TechnoExt::ExtData::OnEarlyUpdate() this->ApplyMindControlRangeLimit(); this->UpdateRecountBurst(); this->UpdateRearmInEMPState(); + this->AmmoAutoConvertActions(); if (this->AttackMoveFollowerTempCount) this->AttackMoveFollowerTempCount--; @@ -198,6 +200,33 @@ void TechnoExt::ExtData::DepletedAmmoActions() pThis->QueueMission(Mission::Unload, true); } +void TechnoExt::ExtData::AmmoAutoConvertActions() +{ + const auto pThis = this->OwnerObject(); + const auto pTypeExt = this->TypeExtData; + + if (!pTypeExt || pThis->GetTechnoType()->Ammo <= 0) + return; + + const bool skipMinimum = pTypeExt->Ammo_AutoConvertMinimumAmount < 0; + const bool skipMaximum = pTypeExt->Ammo_AutoConvertMaximumAmount < 0; + + if (skipMinimum && skipMaximum) + return; + + if ((skipMinimum || pThis->Ammo >= pTypeExt->Ammo_AutoConvertMinimumAmount) // More than minimum + && (skipMaximum || pThis->Ammo <= pTypeExt->Ammo_AutoConvertMaximumAmount)) // Less than maximum + { + const auto pFoot = abstract_cast(pThis); + + if (!pFoot) + return; + + if (pTypeExt->Ammo_AutoConvertType.isset()) + TechnoExt::ConvertToType(pFoot, pTypeExt->Ammo_AutoConvertType); + } +} + // TODO : Merge into new AttachEffects bool TechnoExt::ExtData::CheckDeathConditions(bool isInLimbo) { diff --git a/src/Ext/Techno/Body.h b/src/Ext/Techno/Body.h index 6493623e47..8be7d56763 100644 --- a/src/Ext/Techno/Body.h +++ b/src/Ext/Techno/Body.h @@ -184,6 +184,8 @@ class TechnoExt void ResetDelayedFireTimer(); void UpdateTintValues(); + void AmmoAutoConvertActions(); + virtual ~ExtData() override; virtual void InvalidatePointer(void* ptr, bool bRemoved) override; virtual void LoadFromStream(PhobosStreamReader& Stm) override; diff --git a/src/Ext/TechnoType/Body.cpp b/src/Ext/TechnoType/Body.cpp index 80810502d0..786fe94557 100644 --- a/src/Ext/TechnoType/Body.cpp +++ b/src/Ext/TechnoType/Body.cpp @@ -908,6 +908,10 @@ void TechnoTypeExt::ExtData::LoadFromINIFile(CCINIClass* const pINI) this->AttackMove_StopWhenTargetAcquired.Read(exINI, pSection, "AttackMove.StopWhenTargetAcquired"); this->AttackMove_PursuitTarget.Read(exINI, pSection, "AttackMove.PursuitTarget"); + this->Ammo_AutoConvertMinimumAmount.Read(exINI, pSection, "Ammo.AutoConvertMinimumAmount"); + this->Ammo_AutoConvertMaximumAmount.Read(exINI, pSection, "Ammo.AutoConvertMaximumAmount"); + this->Ammo_AutoConvertType.Read(exINI, pSection, "Ammo.AutoConvertType"); + // Ares 0.2 this->RadarJamRadius.Read(exINI, pSection, "RadarJamRadius"); @@ -1511,6 +1515,10 @@ void TechnoTypeExt::ExtData::Serialize(T& Stm) .Process(this->FallingDownDamage) .Process(this->FallingDownDamage_Water) + .Process(this->Ammo_AutoConvertMinimumAmount) + .Process(this->Ammo_AutoConvertMaximumAmount) + .Process(this->Ammo_AutoConvertType) + .Process(this->FiringForceScatter) .Process(this->FireUp) diff --git a/src/Ext/TechnoType/Body.h b/src/Ext/TechnoType/Body.h index 545b6a9d33..466d68d0b6 100644 --- a/src/Ext/TechnoType/Body.h +++ b/src/Ext/TechnoType/Body.h @@ -390,6 +390,10 @@ class TechnoTypeExt Valueable FallingDownDamage; Nullable FallingDownDamage_Water; + Valueable Ammo_AutoConvertMinimumAmount; + Valueable Ammo_AutoConvertMaximumAmount; + Nullable Ammo_AutoConvertType; + Valueable FiringForceScatter; Valueable FireUp; @@ -752,6 +756,10 @@ class TechnoTypeExt , FallingDownDamage { 1.0 } , FallingDownDamage_Water {} + , Ammo_AutoConvertMinimumAmount { -1 } + , Ammo_AutoConvertMaximumAmount { -1 } + , Ammo_AutoConvertType { nullptr } + , FiringForceScatter { true } , FireUp { -1 }