Skip to content

Commit

Permalink
Fix rearming pads so they actually rearm at the speed they're intende…
Browse files Browse the repository at this point in the history
…d to. Also make rearming upgrades affect rearming pad repair speed. Replaces REARM_PAD.currentPtsAdded with REARM_PAD.timeLastUpdated, but savefiles should still be compatible.

git-svn-id: https://warzone2100.svn.sourceforge.net/svnroot/warzone2100/trunk@8865 4a71c877-e1ca-e34f-864e-861f7616d084
  • Loading branch information
Zarel authored and Git SVN Gateway committed Jan 30, 2010
1 parent 8c6ca5c commit 75569d1
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 28 deletions.
6 changes: 3 additions & 3 deletions src/game.c
Expand Up @@ -7929,11 +7929,11 @@ BOOL loadSaveStructureV(char *pFileData, UDWORD filesize, UDWORD numStructures,
FIXME_CAST_ASSIGN(UDWORD, psReArmPad->psObj, psSaveStructure->subjectInc);
if (version < VERSION_28)
{
psReArmPad->currentPtsAdded = 0;
psReArmPad->timeLastUpdated = 0;
}
else
{
psReArmPad->currentPtsAdded = psSaveStructure->dummy2;
psReArmPad->timeLastUpdated = psSaveStructure->dummy2;
}
}
else
Expand Down Expand Up @@ -8227,7 +8227,7 @@ BOOL writeStructFile(char *pFileName)
psReArmPad = ((REARM_PAD *)psCurr->pFunctionality);
psSaveStruct->output = psReArmPad->reArmPoints;
psSaveStruct->droidTimeStarted = psReArmPad->timeStarted;
psSaveStruct->dummy2 = psReArmPad->currentPtsAdded;
psSaveStruct->dummy2 = psReArmPad->timeLastUpdated;
if (psReArmPad->psObj != NULL)
{
psSaveStruct->subjectInc = psReArmPad->psObj->id;
Expand Down
2 changes: 1 addition & 1 deletion src/map.c
Expand Up @@ -1305,7 +1305,7 @@ static void structureSaveTagged(STRUCTURE *psStruct)
tagWriteEnter(0x12, 1);
tagWrite(0x01, psRearm->reArmPoints);
tagWrite(0x02, psRearm->timeStarted);
tagWrite(0x03, psRearm->currentPtsAdded);
tagWrite(0x03, psRearm->timeLastUpdated);
if (psRearm->psObj)
{
tagWrites(0x04, psRearm->psObj->id);
Expand Down
66 changes: 44 additions & 22 deletions src/structure.c
Expand Up @@ -3323,7 +3323,7 @@ static void aiUpdateStructure(STRUCTURE *psStructure, bool mission)
{
/* reset rearm started */
psReArmPad->timeStarted = ACTION_START_TIME;
psReArmPad->currentPtsAdded = 0;
psReArmPad->timeLastUpdated = 0;
}
CLEAR_TILE_NOTBLOCKING(psTile); // no longer passable
}
Expand Down Expand Up @@ -3682,6 +3682,7 @@ static void aiUpdateStructure(STRUCTURE *psStructure, bool mission)
else if (structureMode == REF_REARM_PAD)
{
REARM_PAD *psReArmPad = &psStructure->pFunctionality->rearmPad;
UDWORD pointsAlreadyAdded;

psDroid = (DROID *)psChosenObj;
ASSERT_OR_RETURN( , psDroid != NULL, "invalid droid pointer");
Expand All @@ -3703,8 +3704,9 @@ static void aiUpdateStructure(STRUCTURE *psStructure, bool mission)
{
if (psReArmPad->timeStarted == ACTION_START_TIME)
{
//set the time started
//set the time started and last updated
psReArmPad->timeStarted = gameTime;
psReArmPad->timeLastUpdated = gameTime;
}

bFinishAction = false;
Expand All @@ -3720,55 +3722,75 @@ static void aiUpdateStructure(STRUCTURE *psStructure, bool mission)
//amount required is a factor of the droids' weight
pointsRequired = psDroid->weight / REARM_FACTOR;
//take numWeaps into consideration
pointsToAdd = psReArmPad->reArmPoints * (gameTime - psReArmPad->timeStarted) * psDroid->numWeaps /
GAME_TICKS_PER_SEC;
//if ((SDWORD)(psDroid->sMove.iAttackRuns - pointsToAdd) <= 0)
pointsToAdd = psReArmPad->reArmPoints * (gameTime - psReArmPad->timeStarted) /
GAME_TICKS_PER_SEC;
pointsAlreadyAdded = psReArmPad->reArmPoints * (psReArmPad->timeLastUpdated - psReArmPad->timeStarted) /
GAME_TICKS_PER_SEC;
if (pointsToAdd >= pointsRequired)
{
for (i = 0;i < psDroid->numWeaps;i++)
// We should be fully loaded by now.
for (i = 0; i < psDroid->numWeaps; i++)
{
/* set rearm value to no runs made */
// set rearm value to no runs made
psDroid->sMove.iAttackRuns[i] = 0;
//reset ammo and lastTimeFired
psDroid->asWeaps[i].ammo = asWeaponStats[psDroid->
asWeaps[i].nStat].numRounds;
// reset ammo and lastFired
psDroid->asWeaps[i].ammo = asWeaponStats[psDroid->asWeaps[i].nStat].numRounds;
psDroid->asWeaps[i].lastFired = 0;
}
}
else
{
for (i = 0;i < psDroid->numWeaps;i++)
for (i = 0; i < psDroid->numWeaps; i++)
{
//make sure that slot is depleted and dont divide integer by zero
if ( psDroid->sMove.iAttackRuns[i] > 0 )
// 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 (pointsToAdd >= pointsRequired/psDroid->sMove.iAttackRuns[i])
// 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;
}
if (ammoToAddThisTime)
{
psDroid->sMove.iAttackRuns[i]--;
// reset ammo and lastFired
psDroid->asWeaps[i].ammo = asWeaponStats[psDroid->asWeaps[i].nStat].numRounds;
psDroid->asWeaps[i].lastFired = 0;
break;
}
}
}
}
}
}

/* do repairing */
if (psDroid->body < psDroid->originalBody)
{
pointsToAdd = VTOL_REPAIR_FACTOR * (gameTime -
psReArmPad->timeStarted) / GAME_TICKS_PER_SEC;
//this was exponential...
if ((pointsToAdd - psReArmPad->currentPtsAdded) > 0)
// Do not "simplify" this formula.
// It is written this way to prevent rounding errors.
pointsToAdd = VTOL_REPAIR_FACTOR * (100+asReArmUpgrade[psStructure->player].modifier) * (gameTime -
psReArmPad->timeStarted) / (GAME_TICKS_PER_SEC * 100);
pointsAlreadyAdded = VTOL_REPAIR_FACTOR * (100+asReArmUpgrade[psStructure->player].modifier) * (psReArmPad->timeLastUpdated -
psReArmPad->timeStarted) / (GAME_TICKS_PER_SEC * 100);

if ((pointsToAdd - pointsAlreadyAdded) > 0)
{
psDroid->body += (pointsToAdd - psReArmPad->currentPtsAdded);
psReArmPad->currentPtsAdded = pointsToAdd;
psDroid->body += (pointsToAdd - pointsAlreadyAdded);
}
if (psDroid->body >= psDroid->originalBody)
{
/* set droid points to max */
psDroid->body = psDroid->originalBody;
}
}
psReArmPad->timeLastUpdated = gameTime;

//check for fully armed and fully repaired
if (vtolHappy(psDroid))
Expand Down
3 changes: 1 addition & 2 deletions src/structuredef.h
Expand Up @@ -240,8 +240,7 @@ typedef struct _rearm_pad
UDWORD reArmPoints; /* rearm points per cycle */
UDWORD timeStarted; /* Time reArm started on current object */
BASE_OBJECT *psObj; /* Object being rearmed */
UDWORD currentPtsAdded; /* stores the amount of body points added to the unit
that is being worked on */
UDWORD timeLastUpdated; /* Time rearm was last updated */
} REARM_PAD;

typedef union
Expand Down

0 comments on commit 75569d1

Please sign in to comment.