Skip to content

Commit ecb2cd6

Browse files
committed
Add multiple upgrade triggers and upgrade removal to DelayedUpgrade
1 parent 4ab2fc0 commit ecb2cd6

File tree

2 files changed

+65
-35
lines changed

2 files changed

+65
-35
lines changed

GeneralsMD/Code/GameEngine/Include/GameLogic/Module/DelayedUpgradeBehavior.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,19 @@ class DelayedUpgradeBehaviorModuleData : public UpdateModuleData
4646
UpgradeMuxData m_upgradeMuxData;
4747

4848
Bool m_initiallyActive;
49-
AsciiString m_upgradeToTrigger;
49+
50+
// AsciiString m_upgradeToTrigger;
51+
std::vector<AsciiString> m_upgradesToTrigger;
52+
std::vector<AsciiString> m_upgradesToRemove;
53+
5054
UnsignedInt m_triggerDelay;
5155
//UnsignedInt m_triggerNumShots;
5256

5357
DelayedUpgradeBehaviorModuleData()
5458
{
59+
m_upgradesToTrigger.clear();
60+
m_upgradesToRemove.clear();
5561
m_initiallyActive = false;
56-
m_upgradeToTrigger.clear();
5762
m_triggerDelay = 0;
5863
//m_triggerNumShots = 0;
5964
}
@@ -63,7 +68,8 @@ class DelayedUpgradeBehaviorModuleData : public UpdateModuleData
6368
static const FieldParse dataFieldParse[] =
6469
{
6570
{ "StartsActive", INI::parseBool, NULL, offsetof(DelayedUpgradeBehaviorModuleData, m_initiallyActive) },
66-
{ "UpgradeToTrigger", INI::parseAsciiString, NULL, offsetof(DelayedUpgradeBehaviorModuleData, m_upgradeToTrigger) },
71+
{ "UpgradesToTrigger", INI::parseAsciiStringVector, NULL, offsetof(DelayedUpgradeBehaviorModuleData, m_upgradesToTrigger) },
72+
{ "UpgradesToRemove", INI::parseAsciiStringVector, NULL, offsetof(DelayedUpgradeBehaviorModuleData, m_upgradesToRemove) },
6773
{ "TriggerAfterTime", INI::parseDurationUnsignedInt, NULL, offsetof(DelayedUpgradeBehaviorModuleData, m_triggerDelay) },
6874
//{ "TriggerAfterShotsFired", INI::parseUnsignedInt, NULL, offsetof(DelayedUpgradeBehaviorModuleData, m_triggerNumShots) },
6975
{ 0, 0, 0, 0 }

GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Behavior/DelayedUpgradeBehavior.cpp

Lines changed: 56 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -31,30 +31,20 @@
3131
#include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine
3232

3333

34-
//#include "Common/Thing.h"
35-
//#include "Common/ThingTemplate.h"
3634
#include "Common/INI.h"
37-
//#include "Common/RandomValue.h"
3835
#include "Common/Xfer.h"
3936
#include "Common/Player.h"
40-
//#include "GameClient/Drawable.h"
41-
//#include "GameClient/FXList.h"
42-
//#include "GameClient/InGameUI.h"
4337
#include "GameLogic/GameLogic.h"
44-
//#include "GameLogic/Module/BodyModule.h"
4538
#include "GameLogic/Module/DelayedUpgradeBehavior.h"
4639
#include "GameLogic/Module/AIUpdate.h"
4740
#include "GameLogic/Object.h"
48-
//#include "GameLogic/ObjectCreationList.h"
4941
#include "GameLogic/Weapon.h"
50-
//#include "GameClient/Drawable.h"
5142

5243

5344
//-------------------------------------------------------------------------------------------------
5445
//-------------------------------------------------------------------------------------------------
5546
DelayedUpgradeBehavior::DelayedUpgradeBehavior(Thing* thing, const ModuleData* moduleData) : UpdateModule(thing, moduleData)
5647
{
57-
DEBUG_LOG(("DelayedUpgradeBehavior::INIT\n"));
5848
m_triggerCompleted = FALSE;
5949
m_triggerFrame = 0;
6050
//m_shotsLeft = 0;
@@ -78,7 +68,7 @@ DelayedUpgradeBehavior::~DelayedUpgradeBehavior(void)
7868
//-------------------------------------------------------------------------------------------------
7969
void DelayedUpgradeBehavior::upgradeImplementation(void)
8070
{
81-
DEBUG_LOG(("DelayedUpgradeBehavior::upgradeImplementation() 1\n"));
71+
// DEBUG_LOG(("DelayedUpgradeBehavior::upgradeImplementation() 1\n"));
8272

8373
const DelayedUpgradeBehaviorModuleData* d = getDelayedUpgradeBehaviorModuleData();
8474

@@ -96,13 +86,13 @@ void DelayedUpgradeBehavior::upgradeImplementation(void)
9686

9787
if (delay > 0) {
9888

99-
DEBUG_LOG(("DelayedUpgradeBehavior::upgradeImplementation(): trigger_frame = %d\n", m_triggerFrame));
89+
DEBUG_LOG(("DelayedUpgradeBehavior::upgradeImplementation(): trigger_frame = %d", m_triggerFrame));
10090

10191
setWakeFrame(getObject(), UPDATE_SLEEP(d->m_triggerDelay));
10292
return;
10393
}
10494

105-
DEBUG_LOG(("DelayedUpgradeBehavior::upgradeImplementation(): We have no trigger!!!\n"));
95+
// DEBUG_LOG(("DelayedUpgradeBehavior::upgradeImplementation(): We have no trigger!!!"));
10696

10797
}
10898

@@ -111,12 +101,12 @@ void DelayedUpgradeBehavior::upgradeImplementation(void)
111101
UpdateSleepTime DelayedUpgradeBehavior::update(void)
112102
{
113103
if (m_triggerCompleted) {
114-
DEBUG_LOG(("DelayedUpgradeBehavior::Update(): Already triggered. We should not be awake!!!\n"));
104+
DEBUG_LOG(("DelayedUpgradeBehavior::Update(): Already triggered. We should not be awake!!!"));
115105
return UPDATE_SLEEP_FOREVER;
116106
}
117107

118108
if (!isUpgradeActive()) {
119-
DEBUG_LOG(("DelayedUpgradeBehavior::Update(): Upgrade not applied. We should not be awake!!!\n"));
109+
DEBUG_LOG(("DelayedUpgradeBehavior::Update(): Upgrade not applied. We should not be awake!!!"));
120110
return UPDATE_SLEEP_FOREVER;
121111
}
122112

@@ -125,7 +115,7 @@ UpdateSleepTime DelayedUpgradeBehavior::update(void)
125115
if (d->m_triggerDelay > 0) {
126116
UnsignedInt now = TheGameLogic->getFrame();
127117
if (now >= m_triggerFrame) {
128-
DEBUG_LOG(("DelayedUpgradeBehavior::update(): Trigger Frame reached.\n"));
118+
// DEBUG_LOG(("DelayedUpgradeBehavior::update(): Trigger Frame reached."));
129119
triggerUpgrade();
130120
return UPDATE_SLEEP_FOREVER;
131121
}
@@ -150,37 +140,71 @@ void DelayedUpgradeBehavior::triggerUpgrade(void)
150140
{
151141

152142
const DelayedUpgradeBehaviorModuleData* d = getDelayedUpgradeBehaviorModuleData();
153-
const UpgradeTemplate* upgradeTemplate = TheUpgradeCenter->findUpgrade(d->m_upgradeToTrigger);
154-
if (!upgradeTemplate)
155-
{
156-
DEBUG_ASSERTCRASH(0, ("DelayedUpgradeBehavior for %s can't find upgrade template %s.", getObject()->getName(), d->m_upgradeToTrigger));
157-
return;
158-
}
159143

160144
m_triggerCompleted = TRUE;
161145

162146
Player* player = getObject()->getControllingPlayer();
163-
if (upgradeTemplate->getUpgradeType() == UPGRADE_TYPE_PLAYER)
164-
{
165-
// get the player
166-
player->addUpgrade(upgradeTemplate, UPGRADE_STATUS_COMPLETE);
147+
148+
if (!d->m_upgradesToTrigger.empty()) {
149+
150+
std::vector<AsciiString>::const_iterator it;
151+
for (it = d->m_upgradesToTrigger.begin(); it != d->m_upgradesToTrigger.end(); it++)
152+
{
153+
const UpgradeTemplate* upgradeTemplate = TheUpgradeCenter->findUpgrade(*it);
154+
155+
if (!upgradeTemplate)
156+
{
157+
DEBUG_CRASH(("DelayedUpgradeBehavior for %s can't find upgrade template %s.", getObject()->getName(), it->str()));
158+
throw INI_INVALID_DATA;
159+
}
160+
161+
if (upgradeTemplate->getUpgradeType() == UPGRADE_TYPE_PLAYER)
162+
{
163+
player->addUpgrade(upgradeTemplate, UPGRADE_STATUS_COMPLETE);
164+
}
165+
else
166+
{
167+
getObject()->giveUpgrade(upgradeTemplate);
168+
}
169+
170+
player->getAcademyStats()->recordUpgrade(upgradeTemplate, TRUE);
171+
}
167172
}
168-
else
169-
{
170-
getObject()->giveUpgrade(upgradeTemplate);
173+
174+
175+
if (!d->m_upgradesToRemove.empty()) {
176+
177+
std::vector<AsciiString>::const_iterator it;
178+
for (it = d->m_upgradesToRemove.begin(); it != d->m_upgradesToRemove.end(); it++)
179+
{
180+
const UpgradeTemplate* upgradeTemplate = TheUpgradeCenter->findUpgrade(*it);
181+
if (!upgradeTemplate)
182+
{
183+
DEBUG_CRASH(("DelayedUpgradeBehavior for '%s' cannot find upgrade to remove '%s'", getObject()->getName(), it->str()));
184+
throw INI_INVALID_DATA;
185+
}
186+
187+
if (upgradeTemplate->getUpgradeType() == UPGRADE_TYPE_PLAYER)
188+
{
189+
player->removeUpgrade(upgradeTemplate);
190+
}
191+
else
192+
{
193+
getObject()->removeUpgrade(upgradeTemplate);
194+
}
195+
}
171196
}
172197

173-
player->getAcademyStats()->recordUpgrade(upgradeTemplate, TRUE);
198+
// DEBUG_LOG(("DelayedUpgradeBehavior::triggerUpgrade() Done."));
174199

175-
DEBUG_LOG(("DelayedUpgradeBehavior::triggerUpgrade() Done.\n"));
176200

177201
}
178202

179203
//-------------------------------------------------------------------------------------------------
180204
//-------------------------------------------------------------------------------------------------
181205
Bool DelayedUpgradeBehavior::resetUpgrade(UpgradeMaskType keyMask)
182206
{
183-
DEBUG_LOG(("DelayedUpgradeBehavior::resetUpgrade().\n"));
207+
// DEBUG_LOG(("DelayedUpgradeBehavior::resetUpgrade()."));
184208
if (UpgradeMux::resetUpgrade(keyMask)) {
185209
m_triggerCompleted = FALSE;
186210
m_triggerFrame = 0;

0 commit comments

Comments
 (0)