The fourth part removes the fire-box hack (another premature optimisation).
Author: EvilGuru Signed-off-by: Dennis Schridde <devurandom@gna.org> git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@6501 4a71c877-e1ca-e34f-864e-861f7616d084master
parent
d3e29ec540
commit
defb67afbb
|
@ -65,14 +65,6 @@
|
|||
#define DIRECT_PROJ_SPEED 500
|
||||
#define VTOL_HITBOX_MODIFICATOR 100
|
||||
|
||||
/** Used for passing data to the checkBurnDamage function */
|
||||
typedef struct
|
||||
{
|
||||
SWORD x1, y1;
|
||||
SWORD x2, y2;
|
||||
SWORD rad;
|
||||
} FIRE_BOX;
|
||||
|
||||
// Watermelon:they are from droid.c
|
||||
/* The range for neighbouring objects */
|
||||
#define PROJ_NAYBOR_RANGE (TILE_UNITS*4)
|
||||
|
@ -104,8 +96,7 @@ static void proj_InFlightDirectFunc( PROJECTILE *psObj );
|
|||
static void proj_InFlightIndirectFunc( PROJECTILE *psObj );
|
||||
static void proj_ImpactFunc( PROJECTILE *psObj );
|
||||
static void proj_PostImpactFunc( PROJECTILE *psObj );
|
||||
static void proj_checkBurnDamage( BASE_OBJECT *apsList, PROJECTILE *psProj,
|
||||
FIRE_BOX *pFireBox );
|
||||
static void proj_checkBurnDamage( BASE_OBJECT *apsList, PROJECTILE *psProj);
|
||||
static void proj_Free(PROJECTILE *psObj);
|
||||
|
||||
static float objectDamage(BASE_OBJECT *psObj, UDWORD damage, UDWORD weaponClass,UDWORD weaponSubClass, HIT_SIDE impactSide);
|
||||
|
@ -1502,7 +1493,6 @@ static void proj_PostImpactFunc( PROJECTILE *psObj )
|
|||
{
|
||||
WEAPON_STATS *psStats;
|
||||
SDWORD i, age;
|
||||
FIRE_BOX flame;
|
||||
|
||||
CHECK_PROJECTILE(psObj);
|
||||
|
||||
|
@ -1523,21 +1513,13 @@ static void proj_PostImpactFunc( PROJECTILE *psObj )
|
|||
if (psStats->incenTime > 0)
|
||||
{
|
||||
/* See if anything is in the fire and burn it */
|
||||
|
||||
/* Calculate the fire's bounding box */
|
||||
flame.x1 = (SWORD)(psObj->pos.x - psStats->incenRadius);
|
||||
flame.y1 = (SWORD)(psObj->pos.y - psStats->incenRadius);
|
||||
flame.x2 = (SWORD)(psObj->pos.x + psStats->incenRadius);
|
||||
flame.y2 = (SWORD)(psObj->pos.y + psStats->incenRadius);
|
||||
flame.rad = (SWORD)(psStats->incenRadius*psStats->incenRadius);
|
||||
|
||||
for (i=0; i<MAX_PLAYERS; i++)
|
||||
{
|
||||
/* Don't damage your own droids - unrealistic, but better */
|
||||
if(i!=psObj->player)
|
||||
{
|
||||
proj_checkBurnDamage((BASE_OBJECT*)apsDroidLists[i], psObj, &flame);
|
||||
proj_checkBurnDamage((BASE_OBJECT*)apsStructLists[i], psObj, &flame);
|
||||
proj_checkBurnDamage((BASE_OBJECT*)apsDroidLists[i], psObj);
|
||||
proj_checkBurnDamage((BASE_OBJECT*)apsStructLists[i], psObj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1633,11 +1615,12 @@ void proj_UpdateAll()
|
|||
|
||||
/***************************************************************************/
|
||||
|
||||
static void proj_checkBurnDamage( BASE_OBJECT *apsList, PROJECTILE *psProj, FIRE_BOX *pFireBox )
|
||||
static void proj_checkBurnDamage( BASE_OBJECT *apsList, PROJECTILE *psProj)
|
||||
{
|
||||
BASE_OBJECT *psCurr, *psNext;
|
||||
SDWORD xDiff,yDiff;
|
||||
WEAPON_STATS *psStats;
|
||||
UDWORD radSquared;
|
||||
UDWORD damageSoFar;
|
||||
SDWORD damageToDo;
|
||||
float relativeDamage;
|
||||
|
@ -1648,6 +1631,8 @@ static void proj_checkBurnDamage( BASE_OBJECT *apsList, PROJECTILE *psProj, FIRE
|
|||
g_pProjLastAttacker = psProj->psSource;
|
||||
|
||||
psStats = psProj->psWStats;
|
||||
radSquared = psStats->incenRadius * psStats->incenRadius;
|
||||
|
||||
for (psCurr = apsList; psCurr; psCurr = psNext)
|
||||
{
|
||||
/* have to store the next pointer as psCurr could be destroyed */
|
||||
|
@ -1661,16 +1646,10 @@ static void proj_checkBurnDamage( BASE_OBJECT *apsList, PROJECTILE *psProj, FIRE
|
|||
continue;
|
||||
}
|
||||
|
||||
/* see if psCurr is hit (don't hit main target twice) */
|
||||
if (((SDWORD)psCurr->pos.x >= pFireBox->x1) &&
|
||||
((SDWORD)psCurr->pos.x <= pFireBox->x2) &&
|
||||
((SDWORD)psCurr->pos.y >= pFireBox->y1) &&
|
||||
((SDWORD)psCurr->pos.y <= pFireBox->y2))
|
||||
{
|
||||
/* Within the bounding box, now check the radius */
|
||||
xDiff = psCurr->pos.x - psProj->pos.x;
|
||||
yDiff = psCurr->pos.y - psProj->pos.y;
|
||||
if ((xDiff*xDiff + yDiff*yDiff) <= pFireBox->rad)
|
||||
if (xDiff*xDiff + yDiff*yDiff <= radSquared)
|
||||
{
|
||||
/* The object is in the fire */
|
||||
psCurr->inFire |= IN_FIRE;
|
||||
|
@ -1711,7 +1690,6 @@ static void proj_checkBurnDamage( BASE_OBJECT *apsList, PROJECTILE *psProj, FIRE
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
|
|
Loading…
Reference in New Issue