Skip to content

Commit d604d6b

Browse files
TaranDahlFS-21
authored andcommitted
[New Feature]Raise alert when technos are taking damage (Phobos-developers#1313)
### Raise alert when technos are taking damage - In Vanilla, non-building technos will not generate radar events or EVAs when attacked, so players can hardly notice them until they are destroyed. You can now receive a radar event (and optionally a sound effect) when your units is attacked, so you can respond to the combats in time. - `[AudioVisual]->CombatAlert` is a global switch, set it to `true` to enable the entire logic. - These flags controlls when to trigger a combat alert. - You can disable this logic on specific techno by setting `[SOMETECHNO]->CombatAlert` to `false`. You may hope to disable it on insignificant technos, like the spawns or slaves. - `[AudioVisual]->CombatAlert.IgnoreBuilding` will turn the logic off on buildings. You can override it for specific building by setting `[SOMETECHNO]->CombatAlert.NotBuilding` to true. You may hope to use it on veh-buildings. - `[AudioVisual]->CombatAlert.SuppressIfInScreen` decides whether to disable the logic for the units in the current screen. - `[AudioVisual]->CombatAlert.Interval` decides the time interval (in frames) between alerts, to prevent the alert from being anonying. It is default to 150 frames. - `[AudioVisual]->CombatAlert.SuppressIfAllyDamage` decides whether to disable the logic for the damage from allys. - Technos hitted by a warhead with `[SOMEWARHEAD]->CombatAlert.Suppress` setted to `true` will not raise a radar event or EVA. This flag is default to the inverse value of ares flag `[SOMEWARHEAD]->Malicious`. - And the following flags controlls the effect of a combat alert. - `[AudioVisual]->CombatAlert.MakeAVoice` decides whether to play some sound effect with the combat alert. Set it to `true` will enable the following flags, otherwise they will be ignored. - `[SOMETECHNO]->CombatAlert.UseFeedbackVoice` decides whether to use the sound defined by `VoiceFeedback`. Default to `[AudioVisual]->CombatAlert.UseFeedbackVoice`. - `[SOMETECHNO]->CombatAlert.UseAttackVoice` decides whether to use the sound defined by `VoiceAttack`. Default to `[AudioVisual]->CombatAlert.UseAttackVoice`. - `[SOMETECHNO]->CombatAlert.UseEVA` decides whether to play an EVA. Default to `[AudioVisual]->CombatAlert.UseEVA`. The EVA to play is default to `EVA_UnitsInCombat`, and can be specified through `[SOMETECHNO]->CombatAlert.EVA`. - The sound effect is taken **at order**, feedback first, attack then, eva finally. The flags in `[AudioVisual]` controlls whether to check it globally, and can be specify per techno. - An example: You set `CombatAlert.UseFeedbackVoice` and `CombatAlert.UseEVA` to `true` and `CombatAlert.UseAttackVoice` to `false`. A unit with `VoiceFeedback` `VoiceAttack` and `CombatAlert.EVA` are all set will play `VoiceFeedback`. A unit with `VoiceAttack` set will play `EVA_UnitsInCombat`. In `rulesmd.ini`: ```ini [AudioVisual] CombatAlert=false ;boolean CombatAlert.IgnoreBuilding=true ;boolean CombatAlert.SuppressIfInScreen=true ;boolean CombatAlert.Interval=150 ;integer, game frames CombatAlert.SuppressIfAllyDamage=true ;boolean CombatAlert.MakeAVoice=true ;boolean CombatAlert.UseFeedbackVoice=true ;boolean CombatAlert.UseAttackVoice=true ;boolean CombatAlert.UseEVA=true ;boolean [SOMETECHNO] CombatAlert=true ;boolean CombatAlert.NotBuilding=false ;boolean CombatAlert.UseFeedbackVoice=true ;boolean CombatAlert.UseAttackVoice=true ;boolean CombatAlert.UseEVA=true ;boolean CombatAlert.EVA=EVA_UnitsInCombat ;EVA entry [SOMEWARHEAD] CombatAlert.Suppress= ;boolean ```
1 parent 8bc14ee commit d604d6b

File tree

13 files changed

+207
-5
lines changed

13 files changed

+207
-5
lines changed

CREDITS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,7 @@ This page lists all the individual contributions to the project by their author.
398398
- Global value of `RepairBaseNodes`
399399
- Skip anim delay for burst fire
400400
- Type select for buildings (code)
401+
- Raise alert when technos are taking damage
401402
- **tyuah8** - Drive/Jumpjet/Ship/Teleport locomotor did not power on when it is un-piggybacked bugfix
402403
- **Aephiex** - initial fix for Ares academy not working on the initial payloads of vehicles built from a war factory
403404
- **Ares developers**

docs/New-or-Enhanced-Logics.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1504,6 +1504,50 @@ Promote.VeteranAnimation= ; Animation
15041504
Promote.EliteAnimation= ; Animation
15051505
```
15061506

1507+
### Raise alert when technos are taking damage
1508+
1509+
- In Vanilla, non-building technos will not generate radar events or EVAs when attacked, so players can hardly notice them until they are destroyed. You can now receive a radar event (and optionally a sound effect) when your units is attacked, so you can respond to the combats in time.
1510+
- `[AudioVisual]->CombatAlert` is a global switch, set it to `true` to enable the entire logic.
1511+
- These flags controlls when to trigger a combat alert.
1512+
- You can disable this logic on specific techno by setting `[SOMETECHNO]->CombatAlert` to `false`. It is defaultly disabled for technos with `Insignificant=yes` or `Spawned=yes`.
1513+
- `[AudioVisual]->CombatAlert.IgnoreBuilding` will turn the logic off on buildings. You can override it for specific building by setting `[SOMETECHNO]->CombatAlert.NotBuilding` to true. You may hope to use it on veh-buildings.
1514+
- `[AudioVisual]->CombatAlert.SuppressIfInScreen` decides whether to disable the logic for the units in the current screen.
1515+
- `[AudioVisual]->CombatAlert.Interval` decides the time interval (in frames) between alerts, to prevent the alert from being anonying. It is default to 150 frames.
1516+
- `[AudioVisual]->CombatAlert.SuppressIfAllyDamage` decides whether to disable the logic for the damage from allys.
1517+
- Technos hitted by a warhead with `[SOMEWARHEAD]->CombatAlert.Suppress` setted to `true` will not raise a radar event or EVA. This flag is default to the logical or of inverse value of ares flag `[SOMEWARHEAD]->Malicious` and `[SOMEWARHEAD]->Nonprovocative`.
1518+
- And the following flags controlls the effect of a combat alert.
1519+
- `[AudioVisual]->CombatAlert.MakeAVoice` decides whether to play some sound effect with the combat alert. Set it to `true` will enable the following flags, otherwise they will be ignored.
1520+
- `[SOMETECHNO]->CombatAlert.UseFeedbackVoice` decides whether to use the sound defined by `VoiceFeedback`. Default to `[AudioVisual]->CombatAlert.UseFeedbackVoice`.
1521+
- `[SOMETECHNO]->CombatAlert.UseAttackVoice` decides whether to use the sound defined by `VoiceAttack`. Default to `[AudioVisual]->CombatAlert.UseAttackVoice`.
1522+
- `[SOMETECHNO]->CombatAlert.UseEVA` decides whether to play an EVA. Default to `[AudioVisual]->CombatAlert.UseEVA`. The EVA to play is default to `EVA_UnitsInCombat`, and can be specified through `[SOMETECHNO]->CombatAlert.EVA`.
1523+
- The sound effect is taken **at order**, feedback first, attack then, eva finally. The flags in `[AudioVisual]` controlls whether to check it globally, and can be specify per techno.
1524+
- An example: You set `CombatAlert.UseFeedbackVoice` and `CombatAlert.UseEVA` to `true` and `CombatAlert.UseAttackVoice` to `false`. A unit with `VoiceFeedback` `VoiceAttack` and `CombatAlert.EVA` are all set will play `VoiceFeedback`. A unit with `VoiceAttack` set will play `EVA_UnitsInCombat`.
1525+
1526+
In `rulesmd.ini`:
1527+
```ini
1528+
[AudioVisual]
1529+
CombatAlert=false ;boolean
1530+
CombatAlert.IgnoreBuilding=true ;boolean
1531+
CombatAlert.SuppressIfInScreen=true ;boolean
1532+
CombatAlert.Interval=150 ;integer, game frames
1533+
CombatAlert.SuppressIfAllyDamage=true ;boolean
1534+
CombatAlert.MakeAVoice=true ;boolean
1535+
CombatAlert.UseFeedbackVoice=true ;boolean
1536+
CombatAlert.UseAttackVoice=true ;boolean
1537+
CombatAlert.UseEVA=true ;boolean
1538+
1539+
[SOMETECHNO]
1540+
CombatAlert= ;boolean
1541+
CombatAlert.NotBuilding=false ;boolean
1542+
CombatAlert.UseFeedbackVoice=true ;boolean
1543+
CombatAlert.UseAttackVoice=true ;boolean
1544+
CombatAlert.UseEVA=true ;boolean
1545+
CombatAlert.EVA=EVA_UnitsInCombat ;EVA entry
1546+
1547+
[SOMEWARHEAD]
1548+
CombatAlert.Suppress= ;boolean
1549+
```
1550+
15071551
### Convert TechnoType on owner house change
15081552

15091553
- You can now change a unit's type when changing ownership from human to computer or from computer to human.

docs/Whats-New.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,7 @@ New:
321321
- Skip anim delay for burst fire (by TaranDahl)
322322
- New Parabola trajectory (by CrimRecya)
323323
- Type select for buildings (code by TaranDahl(航味麻酱), doc by Ollerus)
324+
- Raise alert when technos are taking damage (by TaranDahl)
324325
325326
Vanilla fixes:
326327
- Aircraft will now behave as expected according to it's `MovementZone` and `SpeedType` when moving onto different surfaces. In particular, this fixes erratic behavior when vanilla aircraft is ordered to move onto water surface and instead the movement order changes to a shore nearby (by CrimRecya)

src/Ext/House/Body.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,7 @@ void HouseExt::ExtData::Serialize(T& Stm)
621621
.Process(this->RestrictedFactoryPlants)
622622
.Process(this->LastBuiltNavalVehicleType)
623623
.Process(this->ProducingNavalUnitTypeIndex)
624+
.Process(this->CombatAlertTimer)
624625
.Process(this->NumAirpads_NonMFB)
625626
.Process(this->NumBarracks_NonMFB)
626627
.Process(this->NumWarFactories_NonMFB)

src/Ext/House/Body.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class HouseExt
3535
BuildingClass* Factory_NavyType;
3636
BuildingClass* Factory_AircraftType;
3737

38+
CDTimerClass CombatAlertTimer;
3839
CDTimerClass AISuperWeaponDelayTimer;
3940
CDTimerClass AIFireSaleDelayTimer;
4041

@@ -79,6 +80,7 @@ class HouseExt
7980
, RestrictedFactoryPlants {}
8081
, LastBuiltNavalVehicleType { -1 }
8182
, ProducingNavalUnitTypeIndex { -1 }
83+
, CombatAlertTimer {}
8284
, NumAirpads_NonMFB { 0 }
8385
, NumBarracks_NonMFB { 0 }
8486
, NumWarFactories_NonMFB { 0 }

src/Ext/Rules/Body.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,16 @@ void RulesExt::ExtData::LoadBeforeTypeData(RulesClass* pThis, CCINIClass* pINI)
198198
this->VoxelLightSource.Read(exINI, GameStrings::AudioVisual, "VoxelLightSource");
199199
// this->VoxelShadowLightSource.Read(exINI, GameStrings::AudioVisual, "VoxelShadowLightSource");
200200

201+
this->CombatAlert.Read(exINI, GameStrings::AudioVisual, "CombatAlert");
202+
this->CombatAlert_IgnoreBuilding.Read(exINI, GameStrings::AudioVisual, "CombatAlert.IgnoreBuilding");
203+
this->CombatAlert_SuppressIfInScreen.Read(exINI, GameStrings::AudioVisual, "CombatAlert.SuppressIfInScreen");
204+
this->CombatAlert_Interval.Read(exINI, GameStrings::AudioVisual, "CombatAlert.Interval");
205+
this->CombatAlert_SuppressIfAllyDamage.Read(exINI, GameStrings::AudioVisual, "CombatAlert.SuppressIfAllyDamage");
206+
this->CombatAlert_MakeAVoice.Read(exINI, GameStrings::AudioVisual, "CombatAlert.MakeAVoice");
207+
this->CombatAlert_UseFeedbackVoice.Read(exINI, GameStrings::AudioVisual, "CombatAlert.UseFeedbackVoice");
208+
this->CombatAlert_UseAttackVoice.Read(exINI, GameStrings::AudioVisual, "CombatAlert.UseAttackVoice");
209+
this->CombatAlert_UseEVA.Read(exINI, GameStrings::AudioVisual, "CombatAlert.UseEVA");
210+
201211
this->ReplaceVoxelLightSources();
202212

203213
this->UseFixedVoxelLighting.Read(exINI, GameStrings::AudioVisual, "UseFixedVoxelLighting");
@@ -390,6 +400,15 @@ void RulesExt::ExtData::Serialize(T& Stm)
390400
.Process(this->JumpjetLevelLightMultiplier)
391401
.Process(this->VoxelLightSource)
392402
// .Process(this->VoxelShadowLightSource)
403+
.Process(this->CombatAlert)
404+
.Process(this->CombatAlert_IgnoreBuilding)
405+
.Process(this->CombatAlert_SuppressIfInScreen)
406+
.Process(this->CombatAlert_Interval)
407+
.Process(this->CombatAlert_SuppressIfAllyDamage)
408+
.Process(this->CombatAlert_MakeAVoice)
409+
.Process(this->CombatAlert_UseFeedbackVoice)
410+
.Process(this->CombatAlert_UseAttackVoice)
411+
.Process(this->CombatAlert_UseEVA)
393412
.Process(this->UseFixedVoxelLighting)
394413
.Process(this->GatherWhenMCVDeploy)
395414
.Process(this->AIFireSale)

src/Ext/Rules/Body.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,16 @@ class RulesExt
157157
Valueable<double> AircraftLevelLightMultiplier;
158158
Valueable<double> JumpjetLevelLightMultiplier;
159159

160+
Valueable<bool> CombatAlert;
161+
Valueable<bool> CombatAlert_IgnoreBuilding;
162+
Valueable<bool> CombatAlert_SuppressIfInScreen;
163+
Valueable<int> CombatAlert_Interval;
164+
Valueable<bool> CombatAlert_SuppressIfAllyDamage;
165+
Valueable<bool> CombatAlert_MakeAVoice;
166+
Valueable<bool> CombatAlert_UseFeedbackVoice;
167+
Valueable<bool> CombatAlert_UseAttackVoice;
168+
Valueable<bool> CombatAlert_UseEVA;
169+
160170
Nullable<Vector3D<float>> VoxelLightSource;
161171
// Nullable<Vector3D<float>> VoxelShadowLightSource;
162172
Valueable<bool> UseFixedVoxelLighting;
@@ -288,6 +298,16 @@ class RulesExt
288298
, JumpjetLevelLightMultiplier { 0.0 }
289299
, VoxelLightSource { }
290300
// , VoxelShadowLightSource { }
301+
302+
, CombatAlert { false }
303+
, CombatAlert_IgnoreBuilding { true }
304+
, CombatAlert_SuppressIfInScreen { true }
305+
, CombatAlert_Interval { 150 }
306+
, CombatAlert_SuppressIfAllyDamage { true }
307+
, CombatAlert_MakeAVoice { true }
308+
, CombatAlert_UseFeedbackVoice { true }
309+
, CombatAlert_UseAttackVoice { true }
310+
, CombatAlert_UseEVA { true }
291311
, UseFixedVoxelLighting { false }
292312
, GatherWhenMCVDeploy { true }
293313
, AIFireSale { true }

src/Ext/Techno/Hooks.ReceiveDamage.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
#include "Body.h"
22

3+
#include <TacticalClass.h>
4+
#include <RadarEventClass.h>
5+
36
#include <Ext/WarheadType/Body.h>
47
#include <Ext/WeaponType/Body.h>
58
#include <Ext/TEvent/Body.h>
9+
#include <Ext/House/Body.h>
610

711
namespace ReceiveDamageTemp
812
{
@@ -19,6 +23,75 @@ DEFINE_HOOK(0x701900, TechnoClass_ReceiveDamage_Shield, 0x6)
1923

2024
int nDamageLeft = *args->Damage;
2125

26+
const auto pRules = RulesExt::Global();
27+
28+
if (pRules->CombatAlert && nDamageLeft > 1)
29+
{
30+
do
31+
{
32+
const auto pHouse = pThis->Owner;
33+
34+
if (!pHouse || (!pThis->IsOwnedByCurrentPlayer && !pHouse->IsInPlayerControl) || !pThis->IsInPlayfield)
35+
break;
36+
37+
const auto pSourceHouse = args->SourceHouse;
38+
39+
if (pRules->CombatAlert_SuppressIfAllyDamage && pHouse->IsAlliedWith(pSourceHouse))
40+
break;
41+
42+
const auto pHouseExt = HouseExt::ExtMap.Find(pHouse);
43+
44+
if (pHouseExt->CombatAlertTimer.HasTimeLeft())
45+
break;
46+
47+
const auto pWHExt = WarheadTypeExt::ExtMap.Find(args->WH);
48+
49+
if (pWHExt->CombatAlert_Suppress.Get(!pWHExt->Malicious || pWHExt->Nonprovocative))
50+
break;
51+
52+
const auto pType = pThis->GetTechnoType();
53+
const auto pTypeExt = TechnoTypeExt::ExtMap.Find(pType);
54+
55+
if (!pType || !pTypeExt || !pTypeExt->CombatAlert.Get(!pType->Insignificant && !pType->Spawned))
56+
break;
57+
58+
const auto pBuilding = pThis->WhatAmI() == AbstractType::Building ? static_cast<BuildingClass*>(pThis) : nullptr;
59+
60+
if (pRules->CombatAlert_IgnoreBuilding && pBuilding && !pTypeExt->CombatAlert_NotBuilding.Get(pBuilding->Type->IsVehicle()))
61+
break;
62+
63+
const CoordStruct coordInMap = pThis->GetCoords();
64+
65+
if (pRules->CombatAlert_SuppressIfInScreen)
66+
{
67+
TacticalClass* const pTactical = TacticalClass::Instance;
68+
const Point2D coordInScreen = pTactical->CoordsToScreen(coordInMap) - pTactical->TacticalPos;
69+
const RectangleStruct screenArea = DSurface::Composite->GetRect();
70+
71+
if (screenArea.Width >= coordInScreen.X && screenArea.Height >= coordInScreen.Y && coordInScreen.X >= 0 && coordInScreen.Y >= 0) // check if the unit is in screen
72+
break;
73+
}
74+
75+
pHouseExt->CombatAlertTimer.Start(pRules->CombatAlert_Interval);
76+
RadarEventClass::Create(RadarEventType::Combat, CellClass::Coord2Cell(coordInMap));
77+
78+
int index = -1;
79+
80+
if (!pRules->CombatAlert_MakeAVoice) // No one want to play two sound at a time, I guess?
81+
break;
82+
else if (pTypeExt->CombatAlert_UseFeedbackVoice.Get((const bool)pRules->CombatAlert_UseFeedbackVoice) && pType->VoiceFeedback.Count > 0) // Use VoiceFeedback first
83+
VocClass::PlayGlobal(pType->VoiceFeedback.GetItem(0), 0x2000, 1.0);
84+
else if (pTypeExt->CombatAlert_UseAttackVoice.Get((const bool)pRules->CombatAlert_UseAttackVoice) && pType->VoiceAttack.Count > 0) // Use VoiceAttack then
85+
VocClass::PlayGlobal(pType->VoiceAttack.GetItem(0), 0x2000, 1.0);
86+
else if (pTypeExt->CombatAlert_UseEVA.Get((const bool)pRules->CombatAlert_UseEVA)) // Use Eva finally
87+
index = pTypeExt->CombatAlert_EVA.Get(VoxClass::FindIndex((const char*)"EVA_UnitsInCombat"));
88+
89+
if (index != -1)
90+
VoxClass::PlayIndex(index);
91+
}
92+
while (false);
93+
}
94+
2295
if (!args->IgnoreDefenses)
2396
{
2497
if (const auto pShieldData = pExt->Shield.get())

src/Ext/Techno/Hooks.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <Ext/House/Body.h>
1010
#include <Ext/WarheadType/Body.h>
1111
#include <Ext/WeaponType/Body.h>
12+
#include <Ext/TechnoType/Body.h>
1213
#include <Utilities/EnumFunctions.h>
1314
#include <Utilities/AresHelper.h>
1415

@@ -565,7 +566,7 @@ DEFINE_HOOK(0x4C7462, EventClass_Execute_KeepTargetOnMove, 0x5)
565566

566567
auto const mission = static_cast<Mission>(pThis->MegaMission.Mission);
567568
auto const pExt = TechnoExt::ExtMap.Find(pTechno);
568-
569+
569570
if ((mission == Mission::Move) && pExt->TypeExtData->KeepTargetOnMove && pTechno->Target && !pTarget)
570571
{
571572
if (pTechno->IsCloseEnoughToAttack(pTechno->Target))
@@ -614,7 +615,6 @@ DEFINE_HOOK(0x736480, UnitClass_AI_KeepTargetOnMove, 0x6)
614615

615616
#pragma endregion
616617

617-
618618
#pragma region BuildingTypeSelectable
619619

620620
namespace BuildingTypeSelectable
@@ -641,10 +641,10 @@ DEFINE_HOOK(0x732C97, TechnoClass_IDMatches_ResetContext, 0x5)
641641
DEFINE_HOOK(0x465D40, BuildingClass_Is1x1AndUndeployable_BuildingMassSelectable, 0x6)
642642
{
643643
enum { SkipGameCode = 0x465D6A };
644-
644+
645645
// Since Ares hooks around, we have difficulty juggling Ares and no Ares.
646646
// So we simply disable this feature if no Ares.
647-
if (!AresHelper::CanUseAres)
647+
if (!AresHelper::CanUseAres)
648648
return 0;
649649

650650
if (!BuildingTypeSelectable::ProcessingIDMatches || !RulesExt::Global()->BuildingTypeSelectable)
@@ -654,4 +654,4 @@ DEFINE_HOOK(0x465D40, BuildingClass_Is1x1AndUndeployable_BuildingMassSelectable,
654654
return SkipGameCode;
655655
}
656656

657-
#pragma endregion
657+
#pragma endregion

src/Ext/TechnoType/Body.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,13 @@ void TechnoTypeExt::ExtData::LoadFromINIFile(CCINIClass* const pINI)
324324
this->SellSound.Read(exINI, pSection, "SellSound");
325325
this->EVA_Sold.Read(exINI, pSection, "EVA.Sold");
326326

327+
this->CombatAlert.Read(exINI, pSection, "CombatAlert");
328+
this->CombatAlert_NotBuilding.Read(exINI, pSection, "CombatAlert.NotBuilding");
329+
this->CombatAlert_UseFeedbackVoice.Read(exINI, pSection, "CombatAlert.UseFeedbackVoice");
330+
this->CombatAlert_UseAttackVoice.Read(exINI, pSection, "CombatAlert.UseAttackVoice");
331+
this->CombatAlert_UseEVA.Read(exINI, pSection, "CombatAlert.UseEVA");
332+
this->CombatAlert_EVA.Read(exINI, pSection, "CombatAlert.EVA");
333+
327334
this->VoiceCreated.Read(exINI, pSection, "VoiceCreated");
328335
this->VoicePickup.Read(exINI, pSection, "VoicePickup");
329336

@@ -707,6 +714,13 @@ void TechnoTypeExt::ExtData::Serialize(T& Stm)
707714
.Process(this->SellSound)
708715
.Process(this->EVA_Sold)
709716

717+
.Process(this->CombatAlert)
718+
.Process(this->CombatAlert_NotBuilding)
719+
.Process(this->CombatAlert_UseFeedbackVoice)
720+
.Process(this->CombatAlert_UseAttackVoice)
721+
.Process(this->CombatAlert_UseEVA)
722+
.Process(this->CombatAlert_EVA)
723+
710724
.Process(this->VoiceCreated)
711725
.Process(this->VoicePickup)
712726

0 commit comments

Comments
 (0)