Skip to content

Commit

Permalink
Rename DROID::sMove.iAttackRuns[i] to DROID::asWeaps[i].usedAmmo.
Browse files Browse the repository at this point in the history
The sMove structure is cleared when unloading from transports, and it makes no sense to think of used ammo as pathfinding-related, anyway.

Fixes ticket:3554.
  • Loading branch information
Cyp committed Jun 21, 2012
1 parent e8ee5e6 commit e1dcb24
Show file tree
Hide file tree
Showing 7 changed files with 17 additions and 35 deletions.
2 changes: 1 addition & 1 deletion src/combat.cpp
Expand Up @@ -54,7 +54,7 @@ bool combFire(WEAPON *psWeap, BASE_OBJECT *psAttacker, BASE_OBJECT *psTarget, in
/* Watermelon:dont shoot if the weapon_slot of a vtol is empty */
if (psAttacker->type == OBJ_DROID && isVtolDroid(((DROID *)psAttacker)))
{
if (((DROID *)psAttacker)->sMove.iAttackRuns[weapon_slot] >= getNumAttackRuns(((DROID *)psAttacker), weapon_slot))
if (psWeap->usedAmmo >= getNumAttackRuns(((DROID *)psAttacker), weapon_slot))
{
objTrace(psAttacker->id, "VTOL slot %d is empty", weapon_slot);
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/display3d.cpp
Expand Up @@ -2842,7 +2842,7 @@ static void drawWeaponReloadBar(BASE_OBJECT *psObj, WEAPON *psWeap, int weapon_s
if (psObj->type == OBJ_DROID && isVtolDroid((DROID *)psObj))
{
//deal with VTOLs
firingStage = getNumAttackRuns((DROID *)psObj, weapon_slot) - ((DROID *)psObj)->sMove.iAttackRuns[weapon_slot];
firingStage = getNumAttackRuns((DROID *)psObj, weapon_slot) - ((DROID *)psObj)->asWeaps[weapon_slot].usedAmmo;

//compare with max value
interval = getNumAttackRuns((DROID *)psObj, weapon_slot);
Expand Down
13 changes: 7 additions & 6 deletions src/droid.cpp
Expand Up @@ -2021,6 +2021,7 @@ void droidSetBits(DROID_TEMPLATE *pTemplate,DROID *psDroid)
psDroid->asWeaps[inc].nStat = pTemplate->asWeaps[inc];
psDroid->asWeaps[inc].ammo = (asWeaponStats + psDroid->asWeaps[inc].nStat)->numRounds;
}
psDroid->asWeaps[inc].usedAmmo = 0;
}
//allocate the components hit points
psDroid->asBits[COMP_BODY].nStat = (UBYTE)pTemplate->asParts[COMP_BODY];
Expand Down Expand Up @@ -2963,7 +2964,7 @@ bool vtolEmpty(DROID *psDroid)
for (i = 0; i < psDroid->numWeaps; i++)
{
if (asWeaponStats[psDroid->asWeaps[i].nStat].vtolAttackRuns > 0 &&
psDroid->sMove.iAttackRuns[i] < getNumAttackRuns(psDroid, i))
psDroid->asWeaps[i].usedAmmo < getNumAttackRuns(psDroid, i))
{
return false;
}
Expand Down Expand Up @@ -2991,7 +2992,7 @@ bool vtolFull(DROID *psDroid)
for (i = 0; i < psDroid->numWeaps; i++)
{
if (asWeaponStats[psDroid->asWeaps[i].nStat].vtolAttackRuns > 0 &&
psDroid->sMove.iAttackRuns[i] > 0)
psDroid->asWeaps[i].usedAmmo > 0)
{
return false;
}
Expand Down Expand Up @@ -3177,7 +3178,7 @@ bool vtolHappy(const DROID* psDroid)
for (i = 0; i < psDroid->numWeaps; ++i)
{
if (asWeaponStats[psDroid->asWeaps[i].nStat].vtolAttackRuns > 0
&& psDroid->sMove.iAttackRuns[i] != 0)
&& psDroid->asWeaps[i].usedAmmo != 0)
{
return false;
}
Expand All @@ -3195,13 +3196,13 @@ void updateVtolAttackRun(DROID *psDroid , int weapon_slot)
{
if (asWeaponStats[psDroid->asWeaps[weapon_slot].nStat].vtolAttackRuns > 0)
{
psDroid->sMove.iAttackRuns[weapon_slot]++;
if (psDroid->sMove.iAttackRuns[weapon_slot] == getNumAttackRuns(psDroid, weapon_slot))
++psDroid->asWeaps[weapon_slot].usedAmmo;
if (psDroid->asWeaps[weapon_slot].usedAmmo == getNumAttackRuns(psDroid, weapon_slot))
{
psDroid->asWeaps[weapon_slot].ammo = 0;
}
//quick check doesn't go over limit
ASSERT( psDroid->sMove.iAttackRuns[weapon_slot] < UWORD_MAX, "too many attack runs");
ASSERT(psDroid->asWeaps[weapon_slot].usedAmmo < UWORD_MAX, "too many attack runs");
}
}
}
Expand Down
8 changes: 4 additions & 4 deletions src/game.cpp
Expand Up @@ -4310,9 +4310,9 @@ static bool loadSaveDroid(const char *pFileName, DROID **ppsCurrentDroidLists)
psDroid->sMove.iVertSpeed = ini.value("vertSpeed").toInt();
psDroid->sMove.bumpTime = ini.value("bumpTime").toInt();
psDroid->sMove.shuffleStart = ini.value("shuffleStart").toInt();
for (int j = 0; j < sizeof(psDroid->sMove.iAttackRuns) / sizeof(psDroid->sMove.iAttackRuns[0]); ++j)
for (int j = 0; j < DROID_MAXWEAPS; ++j)
{
psDroid->sMove.iAttackRuns[j] = ini.value("attackRun/" + QString::number(j)).toInt();
psDroid->asWeaps[j].usedAmmo = ini.value("attackRun/" + QString::number(j)).toInt();
}
psDroid->sMove.lastBump = ini.value("lastBump").toInt();
psDroid->sMove.pauseTime = ini.value("pauseTime").toInt();
Expand Down Expand Up @@ -4460,9 +4460,9 @@ static bool writeDroid(WzConfig &ini, DROID *psCurr, bool onMission, int &counte
ini.setValue("vertSpeed", psCurr->sMove.iVertSpeed);
ini.setValue("bumpTime", psCurr->sMove.bumpTime);
ini.setValue("shuffleStart", psCurr->sMove.shuffleStart);
for (int i = 0; i < sizeof(psCurr->sMove.iAttackRuns) / sizeof(psCurr->sMove.iAttackRuns[0]); ++i)
for (int i = 0; i < DROID_MAXWEAPS; ++i)
{
ini.setValue("attackRun/" + QString::number(i), psCurr->sMove.iAttackRuns[i]);
ini.setValue("attackRun/" + QString::number(i), psCurr->asWeaps[i].usedAmmo);
}
ini.setValue("lastBump", psCurr->sMove.lastBump);
ini.setValue("pauseTime", psCurr->sMove.pauseTime);
Expand Down
6 changes: 0 additions & 6 deletions src/movedef.h
Expand Up @@ -26,9 +26,6 @@

#include "lib/framework/vector.h"

//Watermelon:num of VTOL weapons should be same as DROID_MAXWEAPS
#define VTOL_MAXWEAPS 3

enum MOVE_STATUS
{
MOVEINACTIVE,
Expand Down Expand Up @@ -65,9 +62,6 @@ struct MOVE_CONTROL

/* vtol movement - GJ */
SWORD iVertSpeed;

// iAttackRuns tracks the amount of ammunition a VTOL has remaining for each weapon
UDWORD iAttackRuns[VTOL_MAXWEAPS];
};

#endif // __INCLUDED_MOVEDEF_H__
20 changes: 3 additions & 17 deletions src/structure.cpp
Expand Up @@ -3424,12 +3424,7 @@ static void aiUpdateStructure(STRUCTURE *psStructure, bool isMission)
psReArmPad->timeLastUpdated = gameTime;
}

// dont rearm on remote pcs.
// Huh?! Why not?! if(!bMultiPlayer || myResponsibility(psDroid->player))
{
/* do rearming */
if (psDroid->sMove.iAttackRuns != 0)
{
UDWORD pointsRequired;

//amount required is a factor of the droids' weight
Expand All @@ -3445,7 +3440,7 @@ static void aiUpdateStructure(STRUCTURE *psStructure, bool isMission)
for (i = 0; i < psDroid->numWeaps; i++)
{
// set rearm value to no runs made
psDroid->sMove.iAttackRuns[i] = 0;
psDroid->asWeaps[i].usedAmmo = 0;
// reset ammo and lastFired
psDroid->asWeaps[i].ammo = asWeaponStats[psDroid->asWeaps[i].nStat].numRounds;
psDroid->asWeaps[i].lastFired = 0;
Expand All @@ -3456,21 +3451,14 @@ static void aiUpdateStructure(STRUCTURE *psStructure, bool isMission)
for (i = 0; i < psDroid->numWeaps; i++)
{
// Make sure it's a rearmable weapon (and so we don't divide by zero)
if (psDroid->sMove.iAttackRuns[i] > 0 && asWeaponStats[psDroid->asWeaps[i].nStat].numRounds > 0)
if (psDroid->asWeaps[i].usedAmmo > 0 && asWeaponStats[psDroid->asWeaps[i].nStat].numRounds > 0)
{
// Do not "simplify" this formula.
// It is written this way to prevent rounding errors.
int ammoToAddThisTime =
pointsToAdd*getNumAttackRuns(psDroid,i)/pointsRequired -
pointsAlreadyAdded*getNumAttackRuns(psDroid,i)/pointsRequired;
if (ammoToAddThisTime > psDroid->sMove.iAttackRuns[i])
{
psDroid->sMove.iAttackRuns[i] = 0;
}
else if (ammoToAddThisTime > 0)
{
psDroid->sMove.iAttackRuns[i] -= ammoToAddThisTime;
}
psDroid->asWeaps[i].usedAmmo -= std::min<unsigned>(ammoToAddThisTime, psDroid->asWeaps[i].usedAmmo);
if (ammoToAddThisTime)
{
// reset ammo and lastFired
Expand All @@ -3481,8 +3469,6 @@ static void aiUpdateStructure(STRUCTURE *psStructure, bool isMission)
}
}
}
}
}
/* do repairing */
if (psDroid->body < psDroid->originalBody)
{
Expand Down
1 change: 1 addition & 0 deletions src/weapondef.h
Expand Up @@ -32,6 +32,7 @@ struct WEAPON
uint32_t shotsFired;
Rotation rot;
Rotation prevRot;
unsigned usedAmmo; ///< Amount of ammunition used up by a VTOL
};

// Defined in droid.cpp.
Expand Down

0 comments on commit e1dcb24

Please sign in to comment.