Skip to content

Commit 3aa4f3a

Browse files
authored
Merge pull request #57 from Andreas-W/drone_carrier_improvements
Drone carrier improvements
2 parents 05bdac1 + 369a328 commit 3aa4f3a

File tree

4 files changed

+84
-6
lines changed

4 files changed

+84
-6
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@
1212
#include "GameLogic/Module/TransportContain.h"
1313
#include "GameLogic/Module/GarrisonContain.h"
1414

15+
16+
enum DeathType CPP_11(: Int);
17+
1518
//-------------------------------------------------------------------------------------------------
1619
class DroneCarrierContainModuleData: public TransportContainModuleData
1720
{
1821
public:
1922
Real m_launchVelocityBoost;
23+
DeathType m_deathTypeToContained;
2024

2125
DroneCarrierContainModuleData();
2226

@@ -52,6 +56,8 @@ class DroneCarrierContain: public TransportContain
5256
virtual const ContainedItemsList* getAddOnList() const override;
5357
virtual ContainedItemsList* getAddOnList() override;
5458

59+
virtual void onDie(const DamageInfo* damageInfo) override;
60+
5561
// Called from the AI update to reload the contained drones
5662
void updateContainedReloadingStatus();
5763

GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Contain/DroneCarrierContain.cpp

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
// USER INCLUDES //////////////////////////////////////////////////////////////////////////////////
66
#include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine
77

8+
#define DEFINE_DEATH_NAMES
9+
810
#include "Common/Player.h"
911
#include "Common/ThingTemplate.h"
1012
#include "Common/ThingFactory.h"
@@ -19,6 +21,7 @@
1921
#include "GameLogic/Module/StealthUpdate.h"
2022
#include "GameLogic/Module/TransportContain.h"
2123
#include "GameLogic/Module/DroneCarrierContain.h"
24+
#include "GameLogic/Damage.h"
2225
#include "GameLogic/Object.h"
2326
#include "GameLogic/Weapon.h"
2427
#include "GameLogic/WeaponSetType.h"
@@ -27,6 +30,7 @@
2730
DroneCarrierContainModuleData::DroneCarrierContainModuleData() : TransportContainModuleData()
2831
{
2932
m_launchVelocityBoost = 0.0f;
33+
m_deathTypeToContained = DEATH_DETONATED;
3034
}
3135

3236
void DroneCarrierContainModuleData::buildFieldParse(MultiIniFieldParse& p)
@@ -35,6 +39,7 @@ void DroneCarrierContainModuleData::buildFieldParse(MultiIniFieldParse& p)
3539

3640
static const FieldParse dataFieldParse[] =
3741
{
42+
{ "ContainedUnitsDeathType", INI::parseIndexList, TheDeathNames, offsetof(DroneCarrierContainModuleData, m_deathTypeToContained) },
3843
{ "LaunchVelocityBoost", INI::parseReal, NULL, offsetof(DroneCarrierContainModuleData, m_launchVelocityBoost) },
3944
{ 0, 0, 0, 0 }
4045
};
@@ -244,6 +249,9 @@ void DroneCarrierContain::onRemoving(Object* rider)
244249
m_frameExitNotBusy = TheGameLogic->getFrame() + d->m_exitDelay;
245250
}
246251

252+
//---------------------------------------------------------------------
253+
//---------------------------------------------------------------------
254+
247255
void DroneCarrierContain::onContaining(Object* obj, Bool wasSelected)
248256
{
249257
TransportContain::onContaining(obj, wasSelected);
@@ -262,6 +270,57 @@ void DroneCarrierContain::onContaining(Object* obj, Bool wasSelected)
262270
}
263271
}
264272

273+
//-------------------------------------------------------------------------------------------------
274+
/** Custom Die callback to apply specific death type. */
275+
//-------------------------------------------------------------------------------------------------
276+
void DroneCarrierContain::onDie(const DamageInfo* damageInfo)
277+
{
278+
const DroneCarrierContainModuleData* data = getDroneCarrierContainModuleData();
279+
280+
if (!data->m_dieMuxData.isDieApplicable(getObject(), damageInfo))
281+
return;
282+
283+
// Note: Using SH fix from OpenContain::processDamageToContained
284+
285+
ContainedItemsList list;
286+
m_containList.swap(list);
287+
m_containListSize = 0;
288+
289+
ContainedItemsList::iterator it = list.begin();
290+
291+
while (it != list.end())
292+
{
293+
Object* object = *it;
294+
295+
DEBUG_ASSERTCRASH(object, ("Contain list must not contain NULL element"));
296+
297+
if (!object->isEffectivelyDead())
298+
object->kill(DAMAGE_UNRESISTABLE, data->m_deathTypeToContained);
299+
300+
if (object->isEffectivelyDead())
301+
{
302+
onRemoving(object);
303+
object->onRemovedFrom(getObject());
304+
it = list.erase(it);
305+
}
306+
else
307+
{
308+
++it;
309+
}
310+
}
311+
312+
// Swap the list back where it belongs.
313+
m_containList.swap(list);
314+
m_containListSize = (UnsignedInt)m_containList.size();
315+
316+
killRidersWhoAreNotFreeToExit();
317+
removeAllContained();
318+
}
319+
320+
//---------------------------------------------------------------------
321+
//---------------------------------------------------------------------
322+
323+
265324
short DroneCarrierContain::getRiderSlot(ObjectID riderID) const
266325
{
267326
for (size_t i = 0; i < m_contained_units.size(); i++) {

GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/AIUpdate/CarrierDroneAIUpdate.cpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@
2020
#include "GameLogic/PartitionManager.h"
2121
#include "GameLogic/Module/PhysicsUpdate.h"
2222
//#include "GameLogic/TerrainLogic.h"
23-
//#include "GameLogic/Weapon.h"
23+
#include "GameLogic/Weapon.h"
24+
#include "Common/ObjectStatusTypes.h"
2425

2526
#include "GameLogic/Module/CarrierDroneAIUpdate.h"
2627
// #include "GameLogic/Module/JetAIUpdate.h"
@@ -96,7 +97,7 @@ UpdateSleepTime CarrierDroneAIUpdate::update()
9697

9798
// Init launch state (check contained status)
9899
if (!obj->isContained() && m_isContained && m_launchFrame == 0) {
99-
DEBUG_LOG((">>> CarrierDroneAIUpdate::update() - Start Launch State %d", obj->getID()));
100+
//DEBUG_LOG((">>> CarrierDroneAIUpdate::update() - Start Launch State %d", obj->getID()));
100101
obj->setModelConditionState(MODELCONDITION_TAKEOFF);
101102
chooseLocomotorSet(data->m_launchingLoco);
102103
m_launchFrame = TheGameLogic->getFrame();
@@ -106,14 +107,17 @@ UpdateSleepTime CarrierDroneAIUpdate::update()
106107
m_launchingSound.setObjectID(obj->getID());
107108
m_launchingSound.setPlayingHandle(TheAudio->addAudioEvent(&m_launchingSound));
108109
}
110+
111+
// obj->setStatus(MAKE_OBJECT_STATUS_MASK(OBJECT_STATUS_NO_ATTACK));
112+
//obj->getCurrentWeapon()->setPossibleNextShotFrame(m_launchFrame + data->m_launchTime);
109113
}
110114
m_isContained = obj->isContained();
111115

112116
// Exit launch state (check timer)
113117
if (m_launchFrame != 0) {
114118
UnsignedInt now = TheGameLogic->getFrame();
115119
if (m_launchFrame + data->m_launchTime <= now) {
116-
DEBUG_LOG((">>> CarrierDroneAIUpdate::update() - Stop Launch State %d", obj->getID()));
120+
//DEBUG_LOG((">>> CarrierDroneAIUpdate::update() - Stop Launch State %d", obj->getID()));
117121
obj->clearModelConditionState(MODELCONDITION_TAKEOFF);
118122
chooseLocomotorSet(LOCOMOTORSET_NORMAL);
119123
m_launchFrame = 0;
@@ -122,7 +126,14 @@ UpdateSleepTime CarrierDroneAIUpdate::update()
122126
{
123127
TheAudio->removeAudioEvent(m_launchingSound.getPlayingHandle());
124128
}
129+
130+
// obj->clearStatus(MAKE_OBJECT_STATUS_MASK(OBJECT_STATUS_NO_ATTACK));
125131
}
132+
//else { // We are still launching
133+
// if (isAttacking()) {
134+
// return UPDATE_SLEEP_NONE;
135+
// }
136+
//}
126137
}
127138

128139

@@ -137,7 +148,7 @@ UpdateSleepTime CarrierDroneAIUpdate::update()
137148
Real dockingDistSquared = data->m_dockingDistance * data->m_dockingDistance;
138149
if (getStateMachine()->getCurrentStateID() == AI_ENTER && getGoalObject() != NULL) {
139150
distanceToTargetSquared = ThePartitionManager->getDistanceSquared(obj, getGoalObject(), FROM_CENTER_2D);
140-
DEBUG_LOG(("CarrierDroneAIUpdate::update() - distance = %f", sqrt(distanceToTargetSquared)));
151+
//DEBUG_LOG(("CarrierDroneAIUpdate::update() - distance = %f", sqrt(distanceToTargetSquared)));
141152
if (distanceToTargetSquared < dockingDistSquared) {
142153
isDocking = true;
143154
}
@@ -146,7 +157,7 @@ UpdateSleepTime CarrierDroneAIUpdate::update()
146157
Locomotor* loco = getCurLocomotor();
147158

148159
if (isDocking && !m_isDocking) {
149-
DEBUG_LOG((">>> CarrierDroneAIUpdate::update() - ENTER LANDING STATE %d", obj->getID()));
160+
//DEBUG_LOG((">>> CarrierDroneAIUpdate::update() - ENTER LANDING STATE %d", obj->getID()));
150161

151162
//loco->setMaxSpeed(DOCKING_SPEED);
152163
chooseLocomotorSet(data->m_dockingLoco);
@@ -166,7 +177,7 @@ UpdateSleepTime CarrierDroneAIUpdate::update()
166177
m_isDocking = true;
167178
}
168179
else if (!isDocking && m_isDocking) {
169-
DEBUG_LOG(("<<< CarrierDroneAIUpdate::update() - EXIT LANDING STATE %d", obj->getID()));
180+
//DEBUG_LOG(("<<< CarrierDroneAIUpdate::update() - EXIT LANDING STATE %d", obj->getID()));
170181

171182
obj->clearModelConditionState(MODELCONDITION_LANDING);
172183
//loco->setMaxSpeed(loco->getMaxSpeedForCondition(getObject()->getBodyModule()->getDamageState()));

GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Update/DroneCarrierSlavedUpdate.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ UpdateSleepTime DroneCarrierSlavedUpdate::update(void)
9191
{
9292
stopSlavedEffects();
9393

94+
//TODO: Make the drone crash properly (JetSlowDeath) instead of just dropping
95+
9496
//Let's disable the drone so it crashes instead!
9597
//Added special case code in physics falling to ensure death.
9698
me->setDisabled(DISABLED_UNMANNED);

0 commit comments

Comments
 (0)