209 changes: 89 additions & 120 deletions src/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@
#include "init.h"
#include "mission.h"
#include "scores.h"
#include "anim_id.h"
#include "design.h"
#include "component.h"
#include "radar.h"
Expand Down Expand Up @@ -4317,6 +4316,74 @@ static int healthValue(WzConfig &ini, int defaultValue)
}
}

static void loadSaveObject(WzConfig &ini, BASE_OBJECT *psObj)
{
psObj->died = ini.value("died", 0).toInt();
memset(psObj->visible, 0, sizeof(psObj->visible));
for (int j = 0; j < game.maxPlayers; j++)
{
psObj->visible[j] = ini.value("visible/" + QString::number(j), 0).toInt();
}
psObj->periodicalDamage = ini.value("periodicalDamage", 0).toInt();
psObj->periodicalDamageStart = ini.value("periodicalDamageStart", 0).toInt();
psObj->timeAnimationStarted = ini.value("timeAnimationStarted", 0).toInt();
psObj->animationEvent = ini.value("animationEvent", 0).toInt();
psObj->timeLastHit = ini.value("timeLastHit", UDWORD_MAX).toInt();
psObj->lastEmission = ini.value("lastEmission", 0).toInt();
psObj->selected = ini.value("selected", false).toBool();
psObj->born = ini.value("born", 2).toInt();
}

static void writeSaveObject(WzConfig &ini, BASE_OBJECT *psObj)
{
ini.setValue("id", psObj->id);
setPlayer(ini, psObj->player);
ini.setValue("health", psObj->body);
ini.setVector3i("position", psObj->pos);
ini.setVector3i("rotation", toVector(psObj->rot));
if (psObj->timeAnimationStarted)
{
ini.setValue("timeAnimationStarted", psObj->timeAnimationStarted);
}
if (psObj->animationEvent)
{
ini.setValue("animationEvent", psObj->animationEvent);
}
ini.setValue("selected", psObj->selected); // third kind of group
if (psObj->lastEmission)
{
ini.setValue("lastEmission", psObj->lastEmission);
}
if (psObj->periodicalDamageStart > 0)
{
ini.setValue("periodicalDamageStart", psObj->periodicalDamageStart);
}
if (psObj->periodicalDamage > 0)
{
ini.setValue("periodicalDamage", psObj->periodicalDamage);
}
ini.setValue("born", psObj->born);
if (psObj->died > 0)
{
ini.setValue("died", psObj->died);
}
if (psObj->timeLastHit != UDWORD_MAX)
{
ini.setValue("timeLastHit", psObj->timeLastHit);
}
if (psObj->selected)
{
ini.setValue("selected", psObj->selected);
}
for (int i = 0; i < game.maxPlayers; i++)
{
if (psObj->visible[i])
{
ini.setValue("visible/" + QString::number(i), psObj->visible[i]);
}
}
}

static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
{
if (!PHYSFS_exists(pFileName))
Expand Down Expand Up @@ -4413,10 +4480,7 @@ static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
ASSERT(id != 0, "Droid ID should never be zero here");
psDroid->body = healthValue(ini, psDroid->originalBody);
ASSERT(psDroid->body != 0, "%s : %d has zero hp!", pFileName, i);
psDroid->periodicalDamage = ini.value("periodicalDamage", 0).toInt();
psDroid->periodicalDamageStart = ini.value("periodicalDamageStart", 0).toInt();
psDroid->experience = ini.value("experience", 0).toInt();
psDroid->timeLastHit = ini.value("timeLastHit", UDWORD_MAX).toInt();
psDroid->secondaryOrder = ini.value("secondaryOrder", psDroid->secondaryOrder).toInt();
psDroid->secondaryOrderPending = psDroid->secondaryOrder;
psDroid->action = (DROID_ACTION)ini.value("action", DACTION_NONE).toInt();
Expand All @@ -4426,6 +4490,9 @@ static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
psDroid->resistance = ini.value("resistance", 0).toInt(); // zero resistance == no electronic damage
psDroid->lastFrustratedTime = ini.value("lastFrustratedTime", 0).toInt();

// common BASE_OBJECT info
loadSaveObject(ini, psDroid);

// copy the droid's weapon stats
for (int j = 0; j < psDroid->numWeaps; j++)
{
Expand All @@ -4439,7 +4506,6 @@ static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
}

psDroid->group = ini.value("group", UBYTE_MAX).toInt();
psDroid->selected = ini.value("selected", false).toBool();
int aigroup = ini.value("aigroup", -1).toInt();
if (aigroup >= 0)
{
Expand All @@ -4463,13 +4529,6 @@ static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
psDroid->psGroup = NULL;
}
}
psDroid->died = ini.value("died", 0).toInt();
psDroid->lastEmission = ini.value("lastEmission", 0).toInt();
memset(psDroid->visible, 0, sizeof(psDroid->visible));
for (int j = 0; j < game.maxPlayers; j++)
{
psDroid->visible[j] = ini.value("visible/" + QString::number(j), 0).toInt();
}

psDroid->sMove.Status = (MOVE_STATUS)ini.value("moveStatus", 0).toInt();
psDroid->sMove.pathIndex = ini.value("pathIndex", 0).toInt();
Expand Down Expand Up @@ -4497,7 +4556,6 @@ static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
tmp = ini.vector2i("bumpPosition");
psDroid->sMove.bumpX = tmp.x;
psDroid->sMove.bumpY = tmp.y;
psDroid->born = ini.value("born", 2).toInt();

// Recreate path-finding jobs
if (psDroid->sMove.Status == MOVEWAITROUTE)
Expand Down Expand Up @@ -4545,12 +4603,11 @@ Writes the linked list of droids for each player to a file
static bool writeDroid(WzConfig &ini, DROID *psCurr, bool onMission, int &counter)
{
ini.beginGroup("droid_" + QString("%1").arg(counter++, 10, 10, QLatin1Char('0'))); // Zero padded so that alphabetical sort works.
ini.setValue("id", psCurr->id);
setPlayer(ini, psCurr->player);
ini.setValue("name", psCurr->aName);
ini.setVector3i("position", psCurr->pos);
ini.setVector3i("rotation", toVector(psCurr->rot));
ini.setValue("health", psCurr->body);

// write common BASE_OBJECT info
writeSaveObject(ini, psCurr);

for (int i = 0; i < psCurr->numWeaps; i++)
{
if (psCurr->asWeaps[i].nStat > 0)
Expand All @@ -4565,7 +4622,6 @@ static bool writeDroid(WzConfig &ini, DROID *psCurr, bool onMission, int &counte
{
setIniBaseObject(ini, "actionTarget/" + QString::number(i), psCurr->psActionTarget[i]);
}
ini.setValue("born", psCurr->born);
if (psCurr->lastFrustratedTime > 0)
{
ini.setValue("lastFrustratedTime", psCurr->lastFrustratedTime);
Expand All @@ -4574,6 +4630,7 @@ static bool writeDroid(WzConfig &ini, DROID *psCurr, bool onMission, int &counte
{
ini.setValue("experience", psCurr->experience);
}

setIniDroidOrder(ini, "order", psCurr->order);
ini.setValue("orderList/size", psCurr->listSize);
for (int i = 0; i < psCurr->listSize; ++i)
Expand Down Expand Up @@ -4602,35 +4659,14 @@ static bool writeDroid(WzConfig &ini, DROID *psCurr, bool onMission, int &counte
ini.setValue("aigroup/type", psCurr->psGroup->type);
}
ini.setValue("group", psCurr->group); // different kind of group. of course.
ini.setValue("selected", psCurr->selected); // third kind of group
if (psCurr->lastEmission)
{
ini.setValue("lastEmission", psCurr->lastEmission);
}
for (int i = 0; i < game.maxPlayers; i++)
{
ini.setValue("visible/" + QString::number(i), psCurr->visible[i]);
}
if (hasCommander(psCurr) && psCurr->psGroup->psCommander->died <= 1)
{
ini.setValue("commander", psCurr->psGroup->psCommander->id);
}
if (psCurr->died > 0)
{
ini.setValue("died", psCurr->died);
}
if (psCurr->resistance > 0)
{
ini.setValue("resistance", psCurr->resistance);
}
if (psCurr->periodicalDamageStart > 0)
{
ini.setValue("periodicalDamageStart", psCurr->periodicalDamageStart);
}
if (psCurr->periodicalDamage > 0)
{
ini.setValue("periodicalDamage", psCurr->periodicalDamage);
}
ini.setValue("droidType", psCurr->droidType);
ini.setValue("weapons", psCurr->numWeaps);
ini.beginGroup("parts");
Expand Down Expand Up @@ -4966,13 +5002,10 @@ static bool loadSaveStructure2(const char *pFileName, STRUCTURE **ppList)
{
psStructure->id = id; // force correct ID
}
psStructure->periodicalDamage = ini.value("periodicalDamage", 0).toInt();
psStructure->periodicalDamageStart = ini.value("periodicalDamageStart", 0).toInt();
memset(psStructure->visible, 0, sizeof(psStructure->visible));
for (int i = 0; i < game.maxPlayers; i++)
{
psStructure->visible[i] = ini.value("visible/" + QString::number(i), 0).toInt();
}

// common BASE_OBJECT info
loadSaveObject(ini, psStructure);

if (psStructure->pStructureType->type == REF_HQ)
{
scriptSetStartPos(player, psStructure->pos.x, psStructure->pos.y);
Expand Down Expand Up @@ -5111,11 +5144,6 @@ static bool loadSaveStructure2(const char *pFileName, STRUCTURE **ppList)
break;
case REF_RESOURCE_EXTRACTOR:
checkForPowerGen(psStructure);
/* GJ HACK! - add anim to deriks */
if (psStructure->psCurAnim == NULL)
{
psStructure->psCurAnim = animObj_Add(psStructure, ID_ANIM_DERIK, 0);
}
break;
default:
//do nothing for factories etc
Expand All @@ -5133,10 +5161,6 @@ static bool loadSaveStructure2(const char *pFileName, STRUCTURE **ppList)
psStructure->asWeaps[j].rot = ini.vector3i("rotation/" + QString::number(j));
}
}
psStructure->selected = ini.value("selected", false).toBool();
psStructure->died = ini.value("died", 0).toInt();
psStructure->lastEmission = ini.value("lastEmission", 0).toInt();
psStructure->timeLastHit = ini.value("timeLastHit", UDWORD_MAX).toInt();
psStructure->status = (STRUCT_STATES)ini.value("status", SS_BUILT).toInt();
if (psStructure->status == SS_BUILT)
{
Expand Down Expand Up @@ -5199,44 +5223,14 @@ bool writeStructFile(const char *pFileName)
for (STRUCTURE *psCurr = apsStructLists[player]; psCurr != NULL; psCurr = psCurr->psNext)
{
ini.beginGroup("structure_" + QString("%1").arg(counter++, 10, 10, QLatin1Char('0'))); // Zero padded so that alphabetical sort works.
ini.setValue("id", psCurr->id);
setPlayer(ini, psCurr->player);
ini.setValue("name", psCurr->pStructureType->id);
ini.setVector3i("position", psCurr->pos);
ini.setVector3i("rotation", toVector(psCurr->rot));
ini.setValue("health", psCurr->body);
ini.setValue("born", psCurr->born);
if (psCurr->timeLastHit != UDWORD_MAX)
{
ini.setValue("timeLastHit", psCurr->timeLastHit);
}
if (psCurr->selected)
{
ini.setValue("selected", psCurr->selected);
}
for (int i = 0; i < MAX_PLAYERS; i++)
{
if (psCurr->visible[i])
{
ini.setValue("visible/" + QString::number(i), psCurr->visible[i]);
}
}
if (psCurr->died > 0)
{
ini.setValue("died", psCurr->died);
}

writeSaveObject(ini, psCurr);

if (psCurr->resistance > 0)
{
ini.setValue("resistance", psCurr->resistance);
}
if (psCurr->periodicalDamageStart > 0)
{
ini.setValue("periodicalDamageStart", psCurr->periodicalDamageStart);
}
if (psCurr->periodicalDamage > 0)
{
ini.setValue("periodicalDamage", psCurr->periodicalDamage);
}
if (psCurr->status != SS_BUILT)
{
ini.setValue("status", psCurr->status);
Expand Down Expand Up @@ -5622,16 +5616,12 @@ bool loadSaveFeature2(const char *pFileName)
pFeature->id = generateSynchronisedObjectId();
}
pFeature->rot = ini.vector3i("rotation");
pFeature->periodicalDamage = ini.value("periodicalDamage", 0).toInt();
pFeature->periodicalDamageStart = ini.value("periodicalDamageStart", 0).toInt();
pFeature->born = ini.value("born", 2).toInt();
pFeature->timeLastHit = ini.value("timeLastHit", UDWORD_MAX).toInt();
pFeature->selected = ini.value("selected", false).toBool();

// common BASE_OBJECT info
loadSaveObject(ini, pFeature);

pFeature->body = healthValue(ini, pFeature->psStats->body);
for (int i = 0; i < MAX_PLAYERS; i++)
{
pFeature->visible[i] = ini.value("visible/" + QString::number(i), 0).toInt();
}

ini.endGroup();
}
return true;
Expand All @@ -5649,29 +5639,8 @@ bool writeFeatureFile(const char *pFileName)
for (FEATURE *psCurr = apsFeatureLists[0]; psCurr != NULL; psCurr = psCurr->psNext)
{
ini.beginGroup("feature_" + QString("%1").arg(counter++, 10, 10, QLatin1Char('0'))); // Zero padded so that alphabetical sort works.
ini.setValue("id", psCurr->id);
ini.setValue("name", psCurr->psStats->id);
ini.setVector3i("position", psCurr->pos);
ini.setVector3i("rotation", toVector(psCurr->rot));
ini.setValue("periodicalDamage", psCurr->periodicalDamage);
ini.setValue("periodicalDamageStart", psCurr->periodicalDamageStart);
ini.setValue("health", psCurr->body);
ini.setValue("born", psCurr->born);
if (psCurr->selected)
{
ini.setValue("selected", psCurr->selected);
}
if (psCurr->timeLastHit != UDWORD_MAX)
{
ini.setValue("timeLastHit", psCurr->timeLastHit);
}
for (int i = 0; i < MAX_PLAYERS; i++)
{
if (psCurr->visible[i])
{
ini.setValue("visible/" + QString::number(i), psCurr->visible[i]);
}
}
writeSaveObject(ini, psCurr);
ini.endGroup();
}
return true;
Expand Down
42 changes: 1 addition & 41 deletions src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,7 @@ static bool CheckInMap(const char *archive, const char *mountpoint, const char *
if (PHYSFS_isDirectory((checkpath + checkfile).c_str()))
{
if (checkfile.compare("wrf") == 0 || checkfile.compare("stats") == 0 || checkfile.compare("components") == 0
|| checkfile.compare("anims") == 0 || checkfile.compare("effects") == 0 || checkfile.compare("messages") == 0
|| checkfile.compare("effects") == 0 || checkfile.compare("messages") == 0
|| checkfile.compare("audio") == 0 || checkfile.compare("sequenceaudio") == 0 || checkfile.compare("misc") == 0
|| checkfile.compare("features") == 0 || checkfile.compare("script") == 0 || checkfile.compare("structs") == 0
|| checkfile.compare("tileset") == 0 || checkfile.compare("images") == 0 || checkfile.compare("texpages") == 0
Expand Down Expand Up @@ -811,16 +811,6 @@ bool frontendInitialise(const char *ResourceFile)
return false;
}

if (!anim_Init())
{
return false;
}

if (!animObj_Init())
{
return false;
}

if (!allocPlayerPower()) //set up the PlayerPower for each player - this should only be done ONCE now
{
return false;
Expand Down Expand Up @@ -892,16 +882,6 @@ bool frontendShutdown(void)

ResearchRelease();

if (!anim_Shutdown())
{
return false;
}

if (!animObj_Shutdown())
{
return false;
}

debug(LOG_TEXTURE, "=== frontendShutdown ===");
modelShutdown();
pie_TexShutDown();
Expand Down Expand Up @@ -960,16 +940,6 @@ bool stageOneInitialise(void)
return false;
}

if (!anim_Init())
{
return false;
}

if (!animObj_Init())
{
return false;
}

if (!allocPlayerPower()) /*set up the PlayerPower for each player - this should only be done ONCE now*/
{
return false;
Expand Down Expand Up @@ -1058,16 +1028,6 @@ bool stageOneShutDown(void)
scrShutDown();
gridShutDown();

if (!anim_Shutdown())
{
return false;
}

if (!animObj_Shutdown())
{
return false;
}

debug(LOG_TEXTURE, "=== stageOneShutDown ===");
modelShutdown();
pie_TexShutDown();
Expand Down
4 changes: 0 additions & 4 deletions src/loop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
#include "lib/sound/mixer.h"
#include "lib/netplay/netplay.h"

#include "animobj.h"
#include "loop.h"
#include "objects.h"
#include "display.h"
Expand Down Expand Up @@ -194,9 +193,6 @@ static GAMECODE renderLoop()
calcDroidIllumination(psCurr);
}
}

/* update animations */
animObj_Update();
}

if (!consolePaused())
Expand Down
119 changes: 20 additions & 99 deletions src/move.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,12 @@

#include "move.h"

//#include "animobj.h"
#include "objects.h"
#include "visibility.h"
#include "map.h"
#include "fpath.h"
#include "loop.h"
#include "geometry.h"
#include "anim_id.h"
#include "action.h"
#include "display3d.h"
#include "order.h"
Expand Down Expand Up @@ -1612,40 +1610,21 @@ static void moveUpdatePersonModel(DROID *psDroid, SDWORD speed, uint16_t directi

CHECK_DROID(psDroid);

// nothing to do if the droid is stopped
if (moveDroidStopped(psDroid, speed) == true)
// if the droid is stopped, only make sure animations are set correctly
if (moveDroidStopped(psDroid, speed))
{
if (psDroid->droidType == DROID_PERSON &&
psDroid->order.type != DORDER_RUNBURN &&
(psDroid->action == DACTION_ATTACK ||
psDroid->action == DACTION_ROTATETOATTACK))
psDroid->action == DACTION_ROTATETOATTACK)
&& psDroid->timeAnimationStarted == 0)
{
/* remove previous anim */
if (psDroid->psCurAnim != NULL &&
psDroid->psCurAnim->psAnim->uwID != ID_ANIM_DROIDFIRE)
{
const bool bRet = animObj_Remove(psDroid->psCurAnim, psDroid->psCurAnim->psAnim->uwID);
ASSERT(bRet, "animObj_Remove failed");
psDroid->psCurAnim = NULL;
}

/* add firing anim */
if (psDroid->psCurAnim == NULL)
{
psDroid->psCurAnim = animObj_Add(psDroid, ID_ANIM_DROIDFIRE, 0);
}
else
{
psDroid->psCurAnim->bVisible = true;
}

return;
psDroid->timeAnimationStarted = gameTime;
psDroid->animationEvent = ANIM_EVENT_FIRING;
}

/* don't show move animations if inactive */
if (psDroid->psCurAnim != NULL)
else if (psDroid->timeAnimationStarted && psDroid->animationEvent == ANIM_EVENT_ACTIVE)
{
psDroid->psCurAnim->bVisible = false;
psDroid->timeAnimationStarted = 0; // turn off movement animation, since we stopped
psDroid->animationEvent = ANIM_EVENT_NONE;
}
return;
}
Expand All @@ -1672,47 +1651,12 @@ static void moveUpdatePersonModel(DROID *psDroid, SDWORD speed, uint16_t directi
psDroid->pos.z = map_Height(psDroid->pos.x, psDroid->pos.y);//jps 21july96

/* update anim if moving and not on fire */
if (psDroid->droidType == DROID_PERSON && speed != 0 &&
psDroid->order.type != DORDER_RUNBURN)
if (psDroid->droidType == DROID_PERSON && speed != 0 && psDroid->timeAnimationStarted == 0)
{
/* remove previous anim */
if (psDroid->psCurAnim != NULL &&
(psDroid->psCurAnim->psAnim->uwID != ID_ANIM_DROIDRUN ||
psDroid->psCurAnim->psAnim->uwID != ID_ANIM_DROIDRUN))
{
const bool bRet = animObj_Remove(psDroid->psCurAnim, psDroid->psCurAnim->psAnim->uwID);
ASSERT(bRet, "animObj_Remove failed");
psDroid->psCurAnim = NULL;
}

/* if no anim currently attached, get one */
if (psDroid->psCurAnim == NULL)
{
// Only add the animation if the droid is on screen, saves memory and time.
if (clipXY(psDroid->pos.x, psDroid->pos.y))
{
debug(LOG_NEVER, "Added person run anim");
psDroid->psCurAnim = animObj_Add(psDroid, ID_ANIM_DROIDRUN, 0);
}
}
else
{
// If the droid went off screen then remove the animation, saves memory and time.
if (!clipXY(psDroid->pos.x, psDroid->pos.y))
{
const bool bRet = animObj_Remove(psDroid->psCurAnim, psDroid->psCurAnim->psAnim->uwID);
ASSERT(bRet, "animObj_Remove failed");
psDroid->psCurAnim = NULL;
debug(LOG_NEVER, "Removed person run anim");
}
}
psDroid->timeAnimationStarted = gameTime;
psDroid->animationEvent = ANIM_EVENT_ACTIVE;
}

/* show anim */
if (psDroid->psCurAnim != NULL)
{
psDroid->psCurAnim->bVisible = true;
}
CHECK_DROID(psDroid);
}

Expand Down Expand Up @@ -1829,40 +1773,19 @@ static void moveUpdateCyborgModel(DROID *psDroid, SDWORD moveSpeed, uint16_t mov
CHECK_DROID(psDroid);

// nothing to do if the droid is stopped
if (moveDroidStopped(psDroid, moveSpeed) == true)
if (moveDroidStopped(psDroid, moveSpeed))
{
if (psDroid->psCurAnim != NULL)
if (psDroid->animationEvent == ANIM_EVENT_ACTIVE)
{
if (!animObj_Remove(psDroid->psCurAnim, psDroid->psCurAnim->uwID))
{
debug(LOG_NEVER, "couldn't remove walk anim");
}
psDroid->psCurAnim = NULL;
psDroid->timeAnimationStarted = 0;
}
return;
}

if (psDroid->psCurAnim == NULL)
{
// Only add the animation if the droid is on screen, saves memory and time.
if (clipXY(psDroid->pos.x, psDroid->pos.y))
{
if (psDroid->droidType == DROID_CYBORG_SUPER)
{
psDroid->psCurAnim = animObj_Add(psDroid, ID_ANIM_SUPERCYBORG_RUN, 0);
}
else if (cyborgDroid(psDroid))
{
psDroid->psCurAnim = animObj_Add(psDroid, ID_ANIM_CYBORG_RUN, 0);
}
}
}
// If the droid went off screen then remove the animation, saves memory and time
else if (!clipXY(psDroid->pos.x, psDroid->pos.y))
if (psDroid->timeAnimationStarted == 0)
{
const bool bRet = animObj_Remove(psDroid->psCurAnim, psDroid->psCurAnim->psAnim->uwID);
ASSERT(bRet, "animObj_Remove failed");
psDroid->psCurAnim = NULL;
psDroid->timeAnimationStarted = gameTime;
psDroid->animationEvent = ANIM_EVENT_ACTIVE;
}

/* use baba person movement */
Expand Down Expand Up @@ -2147,11 +2070,9 @@ void moveUpdateDroid(DROID *psDroid)
switch (psDroid->sMove.Status)
{
case MOVEINACTIVE:
if ((psDroid->droidType == DROID_PERSON) &&
(psDroid->psCurAnim != NULL) &&
(psDroid->psCurAnim->psAnim->uwID == ID_ANIM_DROIDRUN))
if (psDroid->animationEvent == ANIM_EVENT_ACTIVE && psDroid->timeAnimationStarted)
{
psDroid->psCurAnim->bVisible = false;
psDroid->timeAnimationStarted = 0;
}
break;
case MOVESHUFFLE:
Expand Down
1 change: 0 additions & 1 deletion src/multigifts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
#include "research.h"
#include "power.h"
#include "group.h"
#include "anim_id.h"
#include "hci.h"
#include "scriptfuncs.h" // for objectinrange.
#include "lib/gamelib/gtime.h"
Expand Down
1 change: 0 additions & 1 deletion src/multistruct.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
#include "basedef.h"
#include "power.h"
#include "geometry.h" // for gettilestructure
#include "anim_id.h"
#include "stats.h"
#include "map.h"
#include "console.h"
Expand Down
2 changes: 1 addition & 1 deletion src/objmem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ template <typename OBJECT>
static inline void destroyObject(OBJECT *list[], OBJECT *object)
{
ASSERT_OR_RETURN(, object != NULL, "Invalid pointer");
ASSERT(gameTime - deltaGameTime < gameTime || gameTime == 2, "Expected %u < %u, bad time", gameTime - deltaGameTime, gameTime);
ASSERT(gameTime - deltaGameTime <= gameTime || gameTime == 2, "Expected %u <= %u, bad time", gameTime - deltaGameTime, gameTime);

// If the message to remove is the first one in the list then mark the next one as the first
if (list[object->player] == object)
Expand Down
16 changes: 2 additions & 14 deletions src/order.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -920,13 +920,6 @@ void orderUpdateDroid(DROID *psDroid)
orderDroid(psDroid, DORDER_RTR, ModeImmediate);
}
break;
case DORDER_RUNBURN:
if (psDroid->actionStarted + RUN_BURN_TIME <= gameTime)
{
debug(LOG_DEATH, "orderUpdateDroid: Droid %d burned to death", psDroid->id); // why is this an order?
destroyDroid(psDroid, psDroid->actionStarted + RUN_BURN_TIME);
}
break;
case DORDER_RUN:
if (psDroid->action == DACTION_NONE)
{
Expand Down Expand Up @@ -1569,7 +1562,6 @@ void orderDroidBase(DROID *psDroid, DROID_ORDER_DATA *psOrder)
cmdDroidAddDroid((DROID *)psOrder->psObj, psDroid);
break;
case DORDER_RETREAT:
case DORDER_RUNBURN:
case DORDER_RUN:
psDroid->order = *psOrder;
if (psOrder->type != DORDER_RUN || psOrder->pos == Vector2i(0, 0))
Expand Down Expand Up @@ -1839,7 +1831,6 @@ void orderDroid(DROID *psDroid, DROID_ORDER order, QUEUE_MODE mode)
order == DORDER_RTB ||
order == DORDER_RECYCLE ||
order == DORDER_RUN ||
order == DORDER_RUNBURN ||
order == DORDER_TRANSPORTIN ||
order == DORDER_STOP || // Added this PD.
order == DORDER_HOLD,
Expand Down Expand Up @@ -3721,7 +3712,6 @@ void orderMoralCheck(UDWORD player)
for (psCurr = apsDroidLists[player]; psCurr; psCurr = psCurr->psNext)
{
if (orderState(psCurr, DORDER_RUN) ||
orderState(psCurr, DORDER_RUNBURN) ||
orderState(psCurr, DORDER_RETREAT) ||
orderState(psCurr, DORDER_RTB) ||
orderState(psCurr, DORDER_RTR))
Expand Down Expand Up @@ -3788,7 +3778,6 @@ void orderGroupMoralCheck(DROID_GROUP *psGroup)
for (psCurr = psGroup->psList; psCurr; psCurr = psCurr->psGrpNext)
{
if (orderState(psCurr, DORDER_RUN) ||
orderState(psCurr, DORDER_RUNBURN) ||
orderState(psCurr, DORDER_RETREAT) ||
orderState(psCurr, DORDER_RTB) ||
orderState(psCurr, DORDER_RTR))
Expand Down Expand Up @@ -3864,7 +3853,6 @@ void orderHealthCheck(DROID *psDroid)
{
// order this droid to turn and run - // if already running - ignore
if (!(orderState(psDroid, DORDER_RUN) ||
orderState(psDroid, DORDER_RUNBURN) ||
orderState(psDroid, DORDER_RETREAT) ||
orderState(psDroid, DORDER_RTB) ||
orderState(psDroid, DORDER_RTR)))
Expand All @@ -3878,7 +3866,7 @@ void orderHealthCheck(DROID *psDroid)
{
for (psCurr = psDroid->psGroup->psList; psCurr; psCurr = psCurr->psGrpNext)
{
if (orderState(psCurr, DORDER_RUN) || orderState(psCurr, DORDER_RUNBURN) || orderState(psCurr, DORDER_RETREAT)
if (orderState(psCurr, DORDER_RUN) || orderState(psCurr, DORDER_RETREAT)
|| orderState(psCurr, DORDER_RTB) || orderState(psCurr, DORDER_RTR))
{
// already running - ignore
Expand Down Expand Up @@ -4035,7 +4023,7 @@ const char *getDroidOrderName(DROID_ORDER order)
case DORDER_DROIDREPAIR: return "DORDER_DROIDREPAIR";
case DORDER_RESTORE: return "DORDER_RESTORE";
case DORDER_SCOUT: return "DORDER_SCOUT";
case DORDER_RUNBURN: return "DORDER_RUNBURN";
case DORDER_UNUSED_3: return "DORDER_UNUSED_3";
case DORDER_UNUSED: return "DORDER_UNUSED";
case DORDER_PATROL: return "DORDER_PATROL";
case DORDER_REARM: return "DORDER_REARM";
Expand Down
2 changes: 1 addition & 1 deletion src/orderdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ enum DroidOrderType
DORDER_DROIDREPAIR, /**< 26 - repair a droid. */
DORDER_RESTORE, /**< restore resistance points for a structure. */
DORDER_SCOUT, /**< 28 - same as move, but stop if an enemy is seen. */
DORDER_RUNBURN, /**< run away on fire. */
DORDER_UNUSED_3,
DORDER_UNUSED,
DORDER_PATROL, /**< move between two way points. */
DORDER_REARM, /**< 32 - order a vtol to rearming pad. */
Expand Down
1 change: 0 additions & 1 deletion src/projectile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
#include "map.h"
#include "lib/sound/audio_id.h"
#include "lib/sound/audio.h"
#include "anim_id.h"
#include "projectile.h"
#include "visibility.h"
#include "lib/script/script.h"
Expand Down
2 changes: 2 additions & 0 deletions src/qtscriptfuncs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -846,6 +846,7 @@ BASE_OBJECT *IdToObject(OBJECT_TYPE type, int id, int player)
bool loadGroup(QScriptEngine *engine, int groupId, int objId)
{
BASE_OBJECT *psObj = IdToPointer(objId, ANYPLAYER);
ASSERT_OR_RETURN(false, psObj, "Non-existent object %d in group %d in savegame", objId, groupId);
return groupAddObject(psObj, groupId, engine);
}

Expand All @@ -857,6 +858,7 @@ bool saveGroups(WzConfig &ini, QScriptEngine *engine)
{
QStringList value;
BASE_OBJECT *psObj = i.key();
ASSERT(!isDead(psObj), "Wanted to save dead %s to savegame!", objInfo(psObj));
if (ini.contains(QString::number(psObj->id)))
{
value.push_back(ini.value(QString::number(psObj->id)).toString());
Expand Down
52 changes: 12 additions & 40 deletions src/structure.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,6 @@
#include "stats.h"
#include "lib/framework/math_ext.h"
#include "edit3d.h"
#include "anim_id.h"
#include "lib/gamelib/anim.h"
#include "display3d.h"
#include "geometry.h"
// FIXME Direct iVis implementation include!
Expand Down Expand Up @@ -3600,6 +3598,18 @@ void structureUpdate(STRUCTURE *psBuilding, bool mission)
psBuilding->lastStateTime = gameTime; // reset timer
}
}
else if (psBuilding->pStructureType->type == REF_RESOURCE_EXTRACTOR)
{
if (!psBuilding->pFunctionality->resourceExtractor.psPowerGen) // no power generator connected
{
psBuilding->timeAnimationStarted = 0; // so turn off animation, if any
}
else if (psBuilding->timeAnimationStarted == 0) // we have a power generator, but no animation
{
psBuilding->timeAnimationStarted = gameTime; // so start animation
psBuilding->animationEvent = ANIM_EVENT_ACTIVE;
}
}

// Remove invalid targets. This must be done each frame.
for (i = 0; i < MAX_WEAPONS; i++)
Expand Down Expand Up @@ -3777,13 +3787,6 @@ STRUCTURE::~STRUCTURE()
{
STRUCTURE *psBuilding = this;

/* remove animation if present */
if (psBuilding->psCurAnim != NULL)
{
animObj_Remove(psBuilding->psCurAnim, psBuilding->psCurAnim->psAnim->uwID);
psBuilding->psCurAnim = NULL;
}

// free up the space used by the functionality array
free(psBuilding->pFunctionality);
psBuilding->pFunctionality = NULL;
Expand Down Expand Up @@ -4512,7 +4515,6 @@ static void removeStructFromMap(STRUCTURE *psStruct)
bool removeStruct(STRUCTURE *psDel, bool bDestroy)
{
bool resourceFound = false;
SDWORD cluster;
FLAG_POSITION *psAssemblyPoint = NULL;

ASSERT_OR_RETURN(false, psDel != NULL, "Invalid structure pointer");
Expand Down Expand Up @@ -4595,7 +4597,6 @@ bool removeStruct(STRUCTURE *psDel, bool bDestroy)
}

// remove the structure from the cluster
cluster = psDel->cluster;
clustRemoveObject(psDel);

if (bDestroy)
Expand All @@ -4604,15 +4605,6 @@ bool removeStruct(STRUCTURE *psDel, bool bDestroy)
killStruct(psDel);
}

/* remove animation if present */
if (psDel->psCurAnim != NULL)
{
animObj_Remove(psDel->psCurAnim, psDel->psCurAnim->psAnim->uwID);
psDel->psCurAnim = NULL;
}

clustUpdateCluster(apsStructLists[psDel->player], cluster);

if (psDel->player == selectedPlayer)
{
intRefreshScreen();
Expand Down Expand Up @@ -4737,18 +4729,6 @@ bool destroyStruct(STRUCTURE *psDel, unsigned impactTime)
}
}

/* remove animation if present */
if (psDel->psCurAnim != NULL)
{
animObj_Remove(psDel->psCurAnim, psDel->psCurAnim->psAnim->uwID);
psDel->psCurAnim = NULL;
}

if (bMultiPlayer)
{
technologyGiveAway(psDel); // Drop an artefact, if applicable.
}

// updates score stats only if not wall
if (!bMinor)
{
Expand Down Expand Up @@ -5389,21 +5369,13 @@ void buildingComplete(STRUCTURE *psBuilding)
{
case REF_POWER_GEN:
checkForResExtractors(psBuilding);

if (selectedPlayer == psBuilding->player)
{
audio_PlayObjStaticTrack(psBuilding, ID_SOUND_POWER_HUM);
}

break;
case REF_RESOURCE_EXTRACTOR:
checkForPowerGen(psBuilding);
/* GJ HACK! - add anim to deriks */
if (psBuilding->psCurAnim == NULL)
{
psBuilding->psCurAnim = animObj_Add(psBuilding, ID_ANIM_DERIK, 0);
}

break;
case REF_RESEARCH:
//this deals with research facilities that are upgraded whilst mid-research
Expand Down