* Make sure to check the died status of objects and set pointers to them to NULL if they're dead

* Treat objects that have there status set to died should be treated similar to NULL pointers to droids

Patches aipsactiontargetfix & projfix by Watermelon in mail with Message-ID: <ca0601900706260022h69c31e06lb993dd8679d77482@mail.gmail.com> on the development mailinglist

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@1982 4a71c877-e1ca-e34f-864e-861f7616d084
master
Giel van Schijndel 2007-06-26 18:18:09 +00:00
parent 225a70c1f1
commit 17e25433e0
2 changed files with 13 additions and 9 deletions

View File

@ -145,7 +145,7 @@ SDWORD aiBestNearestTarget(DROID *psDroid, BASE_OBJECT **ppsObj, int weapon_slot
/* See if friendly droid has a target */
tempTarget = friendlyDroid->psActionTarget[0];
if(tempTarget != NULL)
if(tempTarget && !tempTarget->died)
{
//make sure a weapon droid is targeting it
if(friendlyDroid->numWeaps > 0)
@ -191,8 +191,8 @@ SDWORD aiBestNearestTarget(DROID *psDroid, BASE_OBJECT **ppsObj, int weapon_slot
if (bMultiPlayer)
{
// if not electronic then valid target
if (!electronic
|| (electronic
if (!electronic
|| (electronic
&& ((DROID *)targetInQuestion)->droidType != DROID_TRANSPORTER))
{
//only a valid target if NOT a transporter

View File

@ -386,7 +386,7 @@ proj_SendProjectile( WEAPON *psWeap, BASE_OBJECT *psAttacker, SDWORD player,
psObj->psDamaged = NULL;
/* If target is a VTOL or higher than ground, it is an air target. */
if ((psTarget != NULL && psTarget->type == OBJ_DROID && vtolDroid((DROID*)psTarget))
if ((psTarget != NULL && psTarget->type == OBJ_DROID && vtolDroid((DROID*)psTarget))
|| (psTarget == NULL && (SDWORD)tarZ > map_Height(tarX,tarY)))
{
psObj->airTarget = TRUE;
@ -399,7 +399,7 @@ proj_SendProjectile( WEAPON *psWeap, BASE_OBJECT *psAttacker, SDWORD player,
ASSERT(psProj->type == OBJ_BULLET, "Penetrating but not projectile?");
psObj->psSource = psProj->psSource;
psObj->psDamaged = psProj->psDest;
psObj->psDamaged = (psProj->psDest && !psProj->psDest->died) ? psProj->psDest : NULL;
psProj->state = PROJ_IMPACT;
}
else
@ -1440,7 +1440,7 @@ proj_ImpactFunc( PROJ_OBJECT *psObj )
percentDamage = objectDamage(psObj->psDest,damage , psStats->weaponClass,psStats->weaponSubClass, impact_angle);
proj_UpdateKills(psObj, percentDamage);
if (percentDamage >= 0) // So long as the target wasn't killed
{
psObj->psDamaged = psObj->psDest;
@ -1491,7 +1491,7 @@ proj_ImpactFunc( PROJ_OBJECT *psObj )
percentDamage = objectDamage(psObj->psDest, damage, psStats->weaponClass,psStats->weaponSubClass, impact_angle);
proj_UpdateKills(psObj, percentDamage);
if (percentDamage >= 0)
{
psObj->psDamaged = psObj->psDest;
@ -1809,7 +1809,7 @@ proj_ImpactFunc( PROJ_OBJECT *psObj )
percentDamage = featureDamage(psCurrF, calcDamage(weaponRadDamage(
psStats, psObj->player), psStats->weaponEffect,
(BASE_OBJECT *)psCurrF), psStats->weaponSubClass);
proj_UpdateKills(psObj, percentDamage);
}
}
@ -1894,6 +1894,10 @@ proj_Update( PROJ_OBJECT *psObj )
{
psObj->psDest = NULL;
}
if (psObj->psDamaged && psObj->psDamaged->died)
{
psObj->psDamaged = NULL;
}
//Watermelon:get naybors
projGetNaybors((PROJ_OBJECT *)psObj);
@ -2193,7 +2197,7 @@ UDWORD calcDamage(UDWORD baseDamage, WEAPON_EFFECT weaponEffect, BASE_OBJECT *ps
* damage to a cyborg with 150 points left the actual damage would be taken
* as 150.
* - Should sufficient damage be done to destroy/kill a unit then the value is
* multiplied by -1, resulting in a negative number.
* multiplied by -1, resulting in a negative number.
*/
SDWORD objectDamage(BASE_OBJECT *psObj, UDWORD damage, UDWORD weaponClass,UDWORD weaponSubClass, int angle)
{