List of fixes:
1.Fixed a crash when firing the 2nd/3rd indirect weapon in combFire in
combat.c.
2.Fixed target prediction finally(confused by x,y,z in pie and x,y,z in game
and swapped the sin and cos and never thought droid->sMove.dir is in
degree's ...) AA weapons can hit VTOL's relatively easy now due to this
change.
3.Added smoke to AA gun bullet explosion effect even if it hits the target.
4.Fixed a bug which prevents AA weapon area of effect damage from working
properly(VTOL's was excluded in area effect damage check in original
project_Impact function),the 25% chance of AOE damage of AA weapons defined
in weapons.txt should work now.
5.Changed units hitbox radius to use unit pie imd:
avg(imd.xmax + imd.zmax) for 2D radius
(imd.zmax + component.imd.zmax) for height(z) radius
note:in pie/imd z is in game y,in pie/imd y is in game z
6.Removed the 'HeightBonus' thing since it's no longer needed.
_________________________________________________________________
Express yourself instantly with MSN Messenger! Download today it's FREE!
http://messenger.msn.click-url.com/go/onm00200471ave/direct/01/
Index: src/combat.c
===================================================================
--- src/combat.c (revision 510)
+++ src/combat.c (working copy)
@@ -179,7 +179,7 @@
if ( (psAttacker->type == OBJ_DROID) &&
!vtolDroid((DROID *)psAttacker) &&
(proj_Direct(psStats) ||
- (actionInsideMinRange(psDroid, psDroid->psActionTarget[weapon_slot]) >
1))
+ (actionInsideMinRange(psDroid, psDroid->psActionTarget[0]) & (1 << (1 +
weapon_slot))))
)
{
if(!visibleObjWallBlock(psAttacker, psTarget))
@@ -369,20 +369,10 @@
//Watermelon:Target prediction
if(psTarget->type == OBJ_DROID)
{
- if (vtolDroid((DROID *)psTarget))
- {
- predictX = (cos((FRACT)((DROID *)psTarget)->direction) *
moveCalcDroidSpeed((DROID *)psTarget) * dist) /psStats->flightSpeed;
- predictX += psTarget->x;
- predictY = (sin((FRACT)((DROID *)psTarget)->direction) *
moveCalcDroidSpeed((DROID *)psTarget) * dist) /psStats->flightSpeed;
- predictY += psTarget->y;
- }
- else
- {
- predictX = (cos((FRACT)((DROID *)psTarget)->sMove.dir) * ((DROID
*)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
- predictX += psTarget->x;
- predictY = (sin((FRACT)((DROID *)psTarget)->sMove.dir) * ((DROID
*)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
- predictY += psTarget->y;
- }
+ predictX = (sinf(((float)pi/180)*(((DROID *)psTarget)->sMove.dir)) *
((DROID *)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
+ predictX += psTarget->x;
+ predictY = (cosf(((float)pi/180)*(((DROID *)psTarget)->sMove.dir)) *
((DROID *)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
+ predictY += psTarget->y;
}
else
{
@@ -430,20 +420,10 @@
//Watermelon:Target prediction
if(psTarget->type == OBJ_DROID)
{
- if (vtolDroid((DROID *)psTarget))
- {
- predictX = (cos((FRACT)((DROID *)psTarget)->direction) *
moveCalcDroidSpeed((DROID *)psTarget) * dist) /psStats->flightSpeed;
- predictX += psTarget->x;
- predictY = (sin((FRACT)((DROID *)psTarget)->direction) *
moveCalcDroidSpeed((DROID *)psTarget) * dist) /psStats->flightSpeed;
- predictY += psTarget->y;
- }
- else
- {
- predictX = (cos((FRACT)((DROID *)psTarget)->sMove.dir) * ((DROID
*)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
- predictX += psTarget->x;
- predictY = (sin((FRACT)((DROID *)psTarget)->sMove.dir) * ((DROID
*)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
- predictY += psTarget->y;
- }
+ predictX = (sinf(((float)pi/180)*(((DROID *)psTarget)->sMove.dir)) *
((DROID *)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
+ predictX += psTarget->x;
+ predictY = (cosf(((float)pi/180)*(((DROID *)psTarget)->sMove.dir)) *
((DROID *)psTarget)->sMove.speed * dist) /psStats->flightSpeed;
+ predictY += psTarget->y;
}
else
{
Index: src/projectile.c
===================================================================
--- src/projectile.c (revision 510)
+++ src/projectile.c (working copy)
@@ -319,6 +319,7 @@
SDWORD iRadSq, iPitchLow, iPitchHigh, iTemp;
UDWORD heightVariance;
WEAPON_STATS *psWeapStats = &asWeaponStats[psWeap->nStat];
+ int i;
ASSERT( PTRVALID(psWeapStats,sizeof(WEAPON_STATS)),
"proj_SendProjectile: invalid weapon stats" );
@@ -393,11 +394,15 @@
case OBJ_FEATURE:
if( ((DROID*)psTarget)->droidType == DROID_PERSON )
{
- heightVariance = rand()%8;
+ //Watermelon:this value is too big for 'real'
projectile
+ //heightVariance = rand()%8;
+ heightVariance = rand()%4;
}
else
{
- heightVariance = rand()%24;
+ //Watermelon:this value is too big for 'real'
projectile
+ //heightVariance = rand()%24;
+ heightVariance = rand()%8;
}
break;
case OBJ_STRUCTURE:
@@ -544,11 +549,33 @@
{
if (psAttacker->type == OBJ_DROID)
{
- ((DROID *) psAttacker)->turretPitch[0] =
psObj->pitch;
+ //Watermelon:fix turret pitch for more turrets
+ if (((DROID *)psAttacker)->numWeaps > 0)
+ {
+ for (i = 0;i < ((DROID
*)psAttacker)->numWeaps;i++)
+ {
+ ((DROID *)
psAttacker)->turretPitch[i] = psObj->pitch;
+ }
+ }
+ else
+ {
+ ((DROID *) psAttacker)->turretPitch[0] =
psObj->pitch;
+ }
}
else if (psAttacker->type == OBJ_STRUCTURE)
{
- ((STRUCTURE *) psAttacker)->turretPitch[0] =
psObj->pitch;
+ //Watermelon:fix turret pitch for more turrets
+ if (((STRUCTURE *)psAttacker)->numWeaps > 0)
+ {
+ for (i = 0;i < ((DROID
*)psAttacker)->numWeaps;i++)
+ {
+ ((STRUCTURE *)
psAttacker)->turretPitch[i] = psObj->pitch;
+ }
+ }
+ else
+ {
+ ((STRUCTURE *) psAttacker)->turretPitch[0]
= psObj->pitch;
+ }
}
}
@@ -639,7 +666,7 @@
//Watermelon:Penetrate or not
BOOL bPenetrate;
WEAPON asWeap;
- int HeightBonus;
+ DROID *psTempDroid;
bMissile = FALSE;
bPenetrate = FALSE;
@@ -792,7 +819,7 @@
addEffect(&pos,EFFECT_SMOKE,SMOKE_TYPE_TRAIL,FALSE,NULL,0);
}
bMissile = TRUE;
- wpRadius = 4;
+ wpRadius = 2;
}
//Watermelon:weapon radius,or the 'real' projectile will never hit a moving
target with the changes...
@@ -811,24 +838,21 @@
psStats->weaponSubClass == WSC_ENERGY ||
psStats->weaponSubClass == WSC_GAUSS)
{
- wpRadius = 3;
+ wpRadius = 2;
//Watermelon:extended life span
extendRad = (SDWORD)(rad * 1.5f);
}
else if (psStats->weaponSubClass == WSC_AAGUN)
{
wpRadius = 16;
- //Watermelon:extended life span
- extendRad = (SDWORD)rad * 2;
+ extendRad = rad;
}
- //Watermelon:these 3 types of weapon should have the ability to pentrate
targets and damage the enemies behind
if (psStats->penetrate)
{
bPenetrate = TRUE;
}
- //Watermelon:test test
for (i = 0;i < numProjNaybors;i++)
{
//if (asProjNaybors[i].psObj == psObj->psDest)
@@ -841,7 +865,6 @@
asProjNaybors[i].psObj->type == OBJ_STRUCTURE ||
asProjNaybors[i].psObj->type == OBJ_BULLET ||
asProjNaybors[i].psObj->type == OBJ_FEATURE) &&
- asProjNaybors[i].psObj->visible[psObj->player] &&
!aiCheckAlliances(asProjNaybors[i].psObj->player,psObj->player))
{
psTempObj = asProjNaybors[i].psObj;
@@ -861,7 +884,6 @@
if ( psTempObj->type == OBJ_STRUCTURE ||
psTempObj->type == OBJ_FEATURE)
{
- HeightBonus = 0;
//Watermelon:ignore oil resource and pickup
if ( psTempObj->type == OBJ_FEATURE )
{
@@ -881,22 +903,8 @@
ydiff = (SDWORD)psObj->y - (SDWORD)psTempObj->y;
zdiff = abs((SDWORD)psObj->z -
(SDWORD)psTempObj->z);
- if (psTempObj->type == OBJ_STRUCTURE)
- {
- //Watermelon:tower and hardpoint are
much easier to hit now
- if (((STRUCTURE *)psTempObj)->pStructureType->strength ==
STRENGTH_SOFT ||
- ((STRUCTURE
*)psTempObj)->pStructureType->strength == STRENGTH_HARD)
- {
- HeightBonus = 100;
- }
- else if (((STRUCTURE *)psTempObj)->pStructureType->strength ==
STRENGTH_MEDIUM)
- {
- HeightBonus = 50;
- }
- }
-
if ( (xdiff*xdiff + ydiff*ydiff) <
((SDWORD)(establishTargetRadius(psTempObj)) *
(SDWORD)(establishTargetRadius(psTempObj))) &&
- zdiff < (50 + HeightBonus) )
+ zdiff < psTempObj->sDisplay.imd->ymax )
{
if ( psObj->psWStats->surfaceToAir ==
SHOOT_IN_AIR )
{
@@ -926,15 +934,49 @@
ydiff = (SDWORD)psObj->y - (SDWORD)psTempObj->y;
zdiff = abs((SDWORD)psObj->z -
(SDWORD)psTempObj->z);
- HeightBonus = 0;
- //Watermelon:to make VTOL easier to hit
- if (psTempObj->type == OBJ_DROID &&
vtolDroid((DROID *)psTempObj))
+ if (psTempObj->type == OBJ_DROID )
{
- HeightBonus = 100;
+ psTempDroid = (DROID *)psTempObj;
+ //Watermelon:to make VTOL easier to hit
+ if (vtolDroid(psTempDroid))
+ {
+ zdiff -= 100;
+ }
+ else if ( !(cyborgDroid(psTempDroid)) )
+ {
+ //appends the turret height to the droid z,since there is no real
geometries in wz
+ if ( psTempDroid->numWeaps > 0 )
+ {
+ zdiff -=
(asWeaponStats[psTempDroid->asWeaps[0].nStat]).pIMD->ymax;
+ }
+ else
+ {
+ if
(psTempDroid->droidType == DROID_CONSTRUCT)
+ {
+ zdiff -=
(asConstructStats[psTempDroid->asBits[COMP_CONSTRUCT].nStat]).pIMD->ymax;
+ }
+ else if
(psTempDroid->droidType == DROID_REPAIR)
+ {
+ zdiff -=
(asRepairStats[psTempDroid->asBits[COMP_REPAIRUNIT].nStat]).pIMD->ymax;
+ }
+ else if
(psTempDroid->droidType == DROID_SENSOR)
+ {
+ zdiff -=
(asSensorStats[psTempDroid->asBits[COMP_SENSOR].nStat]).pIMD->ymax;
+ }
+ else if
(psTempDroid->droidType == DROID_COMMAND)
+ {
+ zdiff -=
(asBrainStats[psTempDroid->asBits[COMP_BRAIN].nStat]).pIMD->ymax;
+ }
+ else if
(psTempDroid->droidType == DROID_ECM)
+ {
+ zdiff -=
(asECMStats[psTempDroid->asBits[COMP_ECM].nStat]).pIMD->ymax;
+ }
+ }
+ }
}
if ( (xdiff*xdiff + ydiff*ydiff) < (wpRadius *
(SDWORD)(establishTargetRadius(psTempObj)) *
(SDWORD)(establishTargetRadius(psTempObj))) &&
- zdiff < (50 + HeightBonus) )
+ zdiff < psTempObj->sDisplay.imd->ymax )
{
if ( psObj->psWStats->surfaceToAir ==
SHOOT_IN_AIR )
{
@@ -944,7 +986,7 @@
}
}
- if (bPenetrate && psTempObj->type !=
OBJ_STRUCTURE)
+ if (bPenetrate)
{
//Watermelon:just assume we
damaged the chosen target
psObj->psDamaged = psTempObj;
@@ -969,7 +1011,7 @@
zdiff = abs((SDWORD)psObj->z - (SDWORD)psObj->psDest->z);
if ((xdiff*xdiff + ydiff*ydiff) < ((SDWORD)psObj->targetRadius *
(SDWORD)psObj->targetRadius) &&
- zdiff < 50)
+ zdiff < psObj->psDest->sDisplay.imd->ymax)
{
psObj->state = PROJ_IMPACT;
}
@@ -987,7 +1029,7 @@
//Watermelon:'real' hit check even if the projectile is about to
'timeout'
if ( (xdiff*xdiff + ydiff*ydiff) < (wpRadius *
(SDWORD)(establishTargetRadius(psObj->psDest) ) *
(SDWORD)(establishTargetRadius(psObj->psDest)) ) &&
- zdiff < 25)
+ zdiff < 50)
{
psObj->state = PROJ_IMPACT;
}
@@ -1042,8 +1084,8 @@
BASE_OBJECT *psNewTarget;
int i;
SDWORD xdiff,ydiff,zdiff,extendRad;
- int wpRadius = 9;
- int HeightBonus;
+ int wpRadius = 3;
+ DROID *psTempDroid;
ASSERT( PTRVALID(psObj, sizeof(PROJ_OBJECT)),
"proj_InFlightIndirectFunc: invalid projectile pointer" );
@@ -1162,7 +1204,6 @@
asProjNaybors[i].psObj->type == OBJ_STRUCTURE ||
asProjNaybors[i].psObj->type == OBJ_BULLET ||
asProjNaybors[i].psObj->type == OBJ_FEATURE) &&
- asProjNaybors[i].psObj->visible[psObj->player] &&
!aiCheckAlliances(asProjNaybors[i].psObj->player,psObj->player))
{
psTempObj = asProjNaybors[i].psObj;
@@ -1174,7 +1215,6 @@
if ( psTempObj->type == OBJ_STRUCTURE ||
psTempObj->type == OBJ_FEATURE )
{
- HeightBonus = 0;
//Watermelon:ignore oil resource and pickup
if ( psTempObj->type == OBJ_FEATURE )
{
@@ -1188,22 +1228,8 @@
ydiff = (SDWORD)psObj->y - (SDWORD)psTempObj->y;
zdiff = (SDWORD)psObj->z - (SDWORD)psTempObj->z;
- if (psTempObj->type == OBJ_STRUCTURE)
- {
- //Watermelon:tower and hardpoint are
much easier to hit now
- if (((STRUCTURE *)psTempObj)->pStructureType->strength ==
STRENGTH_SOFT ||
- ((STRUCTURE
*)psTempObj)->pStructureType->strength == STRENGTH_HARD)
- {
- HeightBonus = 100;
- }
- else if (((STRUCTURE *)psTempObj)->pStructureType->strength ==
STRENGTH_MEDIUM)
- {
- HeightBonus = 50;
- }
- }
-
if ( (xdiff*xdiff + ydiff*ydiff) <
((SDWORD)(establishTargetRadius(psTempObj)) *
(SDWORD)(establishTargetRadius(psTempObj))) &&
- zdiff < (50 + HeightBonus) )
+ zdiff < psTempObj->sDisplay.imd->ymax )
{
psNewTarget = psTempObj;
psObj->psDest = psNewTarget;
@@ -1217,8 +1243,49 @@
ydiff = (SDWORD)psObj->y - (SDWORD)psTempObj->y;
zdiff = (SDWORD)psObj->z - (SDWORD)psTempObj->z;
+ if (psTempObj->type == OBJ_DROID )
+ {
+ psTempDroid = (DROID *)psTempObj;
+ //Watermelon:to make VTOL easier to hit
+ if (vtolDroid(psTempDroid))
+ {
+ zdiff -= 100;
+ }
+ else if ( !(cyborgDroid(psTempDroid)) )
+ {
+ //appends the turret height to the droid z,since there is no real
geometries in wz
+ if ( psTempDroid->numWeaps > 0 )
+ {
+ zdiff -=
(asWeaponStats[psTempDroid->asWeaps[0].nStat]).pIMD->ymax;
+ }
+ else
+ {
+ if
(psTempDroid->droidType == DROID_CONSTRUCT)
+ {
+ zdiff -=
(asConstructStats[psTempDroid->asBits[COMP_CONSTRUCT].nStat]).pIMD->ymax;
+ }
+ else if
(psTempDroid->droidType == DROID_REPAIR)
+ {
+ zdiff -=
(asRepairStats[psTempDroid->asBits[COMP_REPAIRUNIT].nStat]).pIMD->ymax;
+ }
+ else if
(psTempDroid->droidType == DROID_SENSOR)
+ {
+ zdiff -=
(asSensorStats[psTempDroid->asBits[COMP_SENSOR].nStat]).pIMD->ymax;
+ }
+ else if
(psTempDroid->droidType == DROID_COMMAND)
+ {
+ zdiff -=
(asBrainStats[psTempDroid->asBits[COMP_BRAIN].nStat]).pIMD->ymax;
+ }
+ else if
(psTempDroid->droidType == DROID_ECM)
+ {
+ zdiff -=
(asECMStats[psTempDroid->asBits[COMP_ECM].nStat]).pIMD->ymax;
+ }
+ }
+ }
+ }
+
if ((xdiff*xdiff + ydiff*ydiff) < ((wpRadius *
(SDWORD)(establishTargetRadius(psTempObj)) *
(SDWORD)(establishTargetRadius(psTempObj)))) &&
- zdiff < 25 )
+ zdiff < psTempObj->sDisplay.imd->ymax )
{
psNewTarget = psTempObj;
psObj->psDest = psNewTarget;
@@ -1248,25 +1315,14 @@
ydiff = (SDWORD)psObj->y - (SDWORD)psObj->psDest->y;
zdiff = abs((SDWORD)psObj->z -
(SDWORD)psObj->psDest->z);
- HeightBonus = 0;
//Watermelon:dont apply the 'hitbox' bonus if the
target is a building
if ( psObj->psDest->type == OBJ_STRUCTURE )
{
- //Watermelon:tower and hardpoint are much
easier to hit now
- if (((STRUCTURE *)psObj->psDest)->pStructureType->strength ==
STRENGTH_SOFT ||
- ((STRUCTURE *)psObj->psDest)->pStructureType->strength ==
STRENGTH_HARD)
- {
- HeightBonus = 100;
- }
- else if (((STRUCTURE *)psObj->psDest)->pStructureType->strength ==
STRENGTH_MEDIUM)
- {
- HeightBonus = 50;
- }
wpRadius = 1;
}
if ((xdiff*xdiff + ydiff*ydiff) < (wpRadius *
(SDWORD)(establishTargetRadius(psObj->psDest)) *
(SDWORD)(establishTargetRadius(psObj->psDest))) &&
- zdiff < (50 + HeightBonus) )
+ zdiff < psObj->psDest->sDisplay.imd->ymax )
{
psObj->state = PROJ_IMPACT;
}
@@ -1333,6 +1389,8 @@
BOOL bKilled;//,bMultiTemp;
iVector position,scatter;
UDWORD damage; //optimisation - were all being
calculated twice on PC
+ //Watermelon: tarZ0,tarZ1,zDiff for AA AOE weapons;
+ SDWORD tarZ0,tarZ1,zDiff;
ASSERT( PTRVALID(psObj, sizeof(PROJ_OBJECT)),
@@ -1487,24 +1545,61 @@
}
else
{
+ if (psObj->psDest->type == OBJ_FEATURE &&
+ ((FEATURE *)psObj->psDest)->psStats->damageable == 0)
+ {
+ debug( LOG_NEVER, "proj_ImpactFunc: trying to damage non-damageable
target,projectile removed\n");
+ if ( hashTable_RemoveElement( g_pProjObjTable, psObj,
+
(int) psObj, UNUSED_KEY ) == FALSE )
+ {
+ debug( LOG_NEVER, "proj_ImpactFunc: couldn't remove projectile from
table\n" );
+ }
+ return;
+ }
position.x = psObj->x;
position.z = psObj->y;
position.y = psObj->z;//map_Height(psObj->x, psObj->y) + 24;
scatter.x = psStats->radius; scatter.y = 0; scatter.z =
psStats->radius;
- if(psStats->facePlayer)
+
+ /* Watermelon:gives AA gun explosive field and smoke effect even if it
hits the target */
+ if (psObj->airTarget)
{
-//
addEffect(&position,EFFECT_EXPLOSION,EXPLOSION_TYPE_SPECIFIED,TRUE,psStats->pTargetHitGraphic);
+ if ((psStats->surfaceToAir & SHOOT_IN_AIR) &&
+ !(psStats->surfaceToAir & SHOOT_ON_GROUND) &&
+ psStats->weaponSubClass == WSC_AAGUN)
+ {
+ if(psStats->facePlayer)
+ {
if(gfxVisible(psObj))
-// if(GFX_VISIBLE(psObj))
-
addMultiEffect(&position,&scatter,EFFECT_EXPLOSION,EXPLOSION_TYPE_SPECIFIED,TRUE,psStats->pTargetHitGraphic,psStats->numExplosions,psStats->lightWorld,psStats->effectSize);
+
addMultiEffect(&position,&scatter,EFFECT_EXPLOSION,EXPLOSION_TYPE_SPECIFIED,TRUE,psStats->pTargetMissGraphic,psStats->numExplosions,psStats->lightWorld,psStats->effectSize);
+ }
+ else
+ {
+ if(gfxVisible(psObj))
+
addMultiEffect(&position,&scatter,EFFECT_EXPLOSION,EXPLOSION_TYPE_NOT_FACING,TRUE,psStats->pTargetMissGraphic,psStats->numExplosions,psStats->lightWorld,psStats->effectSize);
+ }
+ /* Add some smoke to flak */
+
addMultiEffect(&position,&scatter,EFFECT_SMOKE,SMOKE_TYPE_DRIFTING,FALSE,NULL,3,0,0);
+ }
}
else
{
-//
addEffect(&position,EFFECT_EXPLOSION,EXPLOSION_TYPE_NOT_FACING,TRUE,psStats->pTargetHitGraphic);
- if(gfxVisible(psObj))
-// if(GFX_VISIBLE(psObj))
-
addMultiEffect(&position,&scatter,EFFECT_EXPLOSION,EXPLOSION_TYPE_NOT_FACING,TRUE,psStats->pTargetHitGraphic,psStats->numExplosions,psStats->lightWorld,psStats->effectSize);
+ if(psStats->facePlayer)
+ {
+ //
addEffect(&position,EFFECT_EXPLOSION,EXPLOSION_TYPE_SPECIFIED,TRUE,psStats->pTargetHitGraphic);
+ if(gfxVisible(psObj))
+ // if(GFX_VISIBLE(psObj))
+
addMultiEffect(&position,&scatter,EFFECT_EXPLOSION,EXPLOSION_TYPE_SPECIFIED,TRUE,psStats->pTargetHitGraphic,psStats->numExplosions,psStats->lightWorld,psStats->effectSize);
+ }
+ else
+ {
+ //
addEffect(&position,EFFECT_EXPLOSION,EXPLOSION_TYPE_NOT_FACING,TRUE,psStats->pTargetHitGraphic);
+ if(gfxVisible(psObj))
+ // if(GFX_VISIBLE(psObj))
+
addMultiEffect(&position,&scatter,EFFECT_EXPLOSION,EXPLOSION_TYPE_NOT_FACING,TRUE,psStats->pTargetHitGraphic,psStats->numExplosions,psStats->lightWorld,psStats->effectSize);
+ }
}
+
/* Do damage to the target */
if (proj_Direct(psStats))
{
@@ -1726,141 +1821,222 @@
tarY0 = (SDWORD)psObj->y - (SDWORD)psStats->radius;
tarX1 = (SDWORD)psObj->x + (SDWORD)psStats->radius;
tarY1 = (SDWORD)psObj->y + (SDWORD)psStats->radius;
+ /* Watermelon:height bounding box for airborne units*/
+ tarZ0 = (SDWORD)psObj->z - (SDWORD)psStats->radius;
+ tarZ1 = (SDWORD)psObj->z + (SDWORD)psStats->radius;
/* Store the radius squared */
- radSquared = psStats->radius * psStats->radius;
+ radSquared = psStats->radius * psStats->radius *
psStats->radius;
- /* Do damage to everything in range */
- for (i=0; i<MAX_PLAYERS; i++)
+ /* Watermelon:air suppression */
+ if (psObj->airTarget)
{
- for (psCurrD = apsDroidLists[i]; psCurrD; psCurrD =
psNextD)
+ for (i=0; i<MAX_PLAYERS; i++)
{
- /* have to store the next pointer as psCurrD
could be destroyed */
- psNextD = psCurrD->psNext;
-
- if (vtolDroid(psCurrD) &&
- (psCurrD->sMove.Status != MOVEINACTIVE))
+ for (psCurrD = apsDroidLists[i]; psCurrD;
psCurrD = psNextD)
{
- // skip VTOLs in the air
- continue;
- }
+ /* have to store the next pointer as
psCurrD could be destroyed */
+ psNextD = psCurrD->psNext;
- /* see if psCurrD is hit (don't hit main target
twice) */
- if (((BASE_OBJECT *)psCurrD != psObj->psDest) &&
- ((SDWORD)psCurrD->x >= tarX0) &&
- ((SDWORD)psCurrD->x <= tarX1) &&
- ((SDWORD)psCurrD->y >= tarY0) &&
- ((SDWORD)psCurrD->y <= tarY1))
- {
- /* Within the bounding box, now check
the radius */
- xDiff = psCurrD->x - psObj->x;
- yDiff = psCurrD->y - psObj->y;
- if ((xDiff*xDiff + yDiff*yDiff) <=
radSquared)
+ /* Watermelon:skip no vtol droids and
landed votl's */
+ if (!vtolDroid(psCurrD) ||
+ (vtolDroid(psCurrD) &&
psCurrD->sMove.Status == MOVEINACTIVE))
{
- HIT_ROLL(dice);
- //if (dice < psStats->radiusHit)
- if (dice <
weaponRadiusHit(psStats, psObj->player))
+ continue;
+ }
+
+ /* see if psCurrD is hit (don't hit
main target twice) */
+ if (((BASE_OBJECT *)psCurrD != psObj->psDest)
&&
+ ((SDWORD)psCurrD->x >= tarX0) &&
+ ((SDWORD)psCurrD->x <= tarX1) &&
+ ((SDWORD)psCurrD->y >= tarY0) &&
+ ((SDWORD)psCurrD->y <= tarY1) &&
+ ((SDWORD)psCurrD->z >= tarZ0) &&
+ ((SDWORD)psCurrD->z <= tarZ1))
+ {
+ /* Within the bounding box, now
check the radius */
+ xDiff = psCurrD->x - psObj->x;
+ yDiff = psCurrD->y - psObj->y;
+ zDiff = psCurrD->z - psObj->z;
+ if ((xDiff*xDiff + yDiff*yDiff +
zDiff*zDiff) <= radSquared)
{
- DBP1(("Damage to object %d,
player %d\n",
-
psCurrD->id, psCurrD->player));
+ HIT_ROLL(dice);
+ //if (dice <
psStats->radiusHit)
+ if (dice <
weaponRadiusHit(psStats, psObj->player))
+ {
+ DBP1(("Damage to
object %d, player %d\n",
+
psCurrD->id, psCurrD->player));
- damage = calcDamage(
-
weaponRadDamage(psStats, psObj->player),
-
psStats->weaponEffect, (BASE_OBJECT *)psCurrD);
- if(bMultiPlayer)
- {
- if(psObj->psSource &&
myResponsibility(psObj->psSource->player))
+ damage =
calcDamage(
+
weaponRadDamage(psStats, psObj->player),
+
psStats->weaponEffect, (BASE_OBJECT *)psCurrD);
+ if(bMultiPlayer)
{
-
updateMultiStatsDamage(psObj->psSource->player,
-
psCurrD->player, damage);
+ if(psObj->psSource
&& myResponsibility(psObj->psSource->player))
+ {
+
updateMultiStatsDamage(psObj->psSource->player,
+
psCurrD->player, damage);
+ }
+
turnOffMultiMsg(TRUE);
}
-
turnOffMultiMsg(TRUE);
- }
- //bKilled = psCurrD->damage(psCurrD, psStats->radiusDamage,
psStats->weaponClass);
- /*bKilled =
psCurrD->damage(psCurrD, calcDamage(
-
//psStats->radiusDamage, psStats->weaponEffect,
-
weaponRadDamage(psStats,psObj->player),
-
psStats->weaponEffect,
- (BASE_OBJECT
*)psCurrD), psStats->weaponClass);*/
+ //bKilled = psCurrD->damage(psCurrD, psStats->radiusDamage,
psStats->weaponClass);
+ /*bKilled =
psCurrD->damage(psCurrD, calcDamage(
+
//psStats->radiusDamage, psStats->weaponEffect,
+
weaponRadDamage(psStats,psObj->player),
+
psStats->weaponEffect,
+
(BASE_OBJECT *)psCurrD), psStats->weaponClass);*/
- bKilled = droidDamage(psCurrD, damage,
psStats->weaponClass,psStats->weaponSubClass);
+ bKilled = droidDamage(psCurrD, damage,
psStats->weaponClass,psStats->weaponSubClass);
- turnOffMultiMsg(FALSE);
// multiplay msgs back on.
+
turnOffMultiMsg(FALSE); // multiplay msgs back on.
- if(bKilled)
- {
-
proj_UpdateKills(psObj);
+ if(bKilled)
+ {
+
proj_UpdateKills(psObj);
+ }
}
}
}
}
}
- for (psCurrS = apsStructLists[i]; psCurrS; psCurrS =
psNextS)
+ }
+ else
+ {
+ /* Do damage to everything in range */
+ for (i=0; i<MAX_PLAYERS; i++)
{
- /* have to store the next pointer as psCurrD
could be destroyed */
- psNextS = psCurrS->psNext;
+ for (psCurrD = apsDroidLists[i]; psCurrD;
psCurrD = psNextD)
+ {
+ /* have to store the next pointer as
psCurrD could be destroyed */
+ psNextD = psCurrD->psNext;
- /* see if psCurrS is hit (don't hit main target
twice) */
- if (((BASE_OBJECT *)psCurrS != psObj->psDest) &&
- ((SDWORD)psCurrS->x >= tarX0) &&
- ((SDWORD)psCurrS->x <= tarX1) &&
- ((SDWORD)psCurrS->y >= tarY0) &&
- ((SDWORD)psCurrS->y <= tarY1))
- {
- /* Within the bounding box, now check
the radius */
- xDiff = psCurrS->x - psObj->x;
- yDiff = psCurrS->y - psObj->y;
- if ((xDiff*xDiff + yDiff*yDiff) <=
radSquared)
+ if (vtolDroid(psCurrD) &&
+ (psCurrD->sMove.Status !=
MOVEINACTIVE))
{
- HIT_ROLL(dice);
- //if (dice < psStats->radiusHit)
- if (dice <
weaponRadiusHit(psStats, psObj->player))
+ // skip VTOLs in the air
+ continue;
+ }
+
+ /* see if psCurrD is hit (don't hit
main target twice) */
+ if (((BASE_OBJECT *)psCurrD != psObj->psDest)
&&
+ ((SDWORD)psCurrD->x >= tarX0) &&
+ ((SDWORD)psCurrD->x <= tarX1) &&
+ ((SDWORD)psCurrD->y >= tarY0) &&
+ ((SDWORD)psCurrD->y <= tarY1))
+ {
+ /* Within the bounding box, now
check the radius */
+ xDiff = psCurrD->x - psObj->x;
+ yDiff = psCurrD->y - psObj->y;
+ if ((xDiff*xDiff + yDiff*yDiff)
<= radSquared)
{
- damage =
calcDamage(weaponRadDamage(
- psStats, psObj->player),
-
psStats->weaponEffect, (BASE_OBJECT *)psCurrS);
+ HIT_ROLL(dice);
+ //if (dice <
psStats->radiusHit)
+ if (dice <
weaponRadiusHit(psStats, psObj->player))
+ {
+ DBP1(("Damage to
object %d, player %d\n",
+
psCurrD->id, psCurrD->player));
-
- if(bMultiPlayer)
- {
- if(psObj->psSource &&
myResponsibility(psObj->psSource->player))
+ damage =
calcDamage(
+
weaponRadDamage(psStats, psObj->player),
+
psStats->weaponEffect, (BASE_OBJECT *)psCurrD);
+ if(bMultiPlayer)
{
-
updateMultiStatsDamage(psObj->psSource->player, psCurrS->player,damage);
+ if(psObj->psSource
&& myResponsibility(psObj->psSource->player))
+ {
+
updateMultiStatsDamage(psObj->psSource->player,
+
psCurrD->player, damage);
+ }
+
turnOffMultiMsg(TRUE);
}
- }
- bKilled =
structureDamage(psCurrS, damage,
- psStats->weaponClass,
psStats->weaponSubClass);
- if(bKilled)
- {
-
proj_UpdateKills(psObj);
+ //bKilled = psCurrD->damage(psCurrD, psStats->radiusDamage,
psStats->weaponClass);
+ /*bKilled =
psCurrD->damage(psCurrD, calcDamage(
+
//psStats->radiusDamage, psStats->weaponEffect,
+
weaponRadDamage(psStats,psObj->player),
+
psStats->weaponEffect,
+
(BASE_OBJECT *)psCurrD), psStats->weaponClass);*/
+
+ bKilled = droidDamage(psCurrD, damage,
psStats->weaponClass,psStats->weaponSubClass);
+
+
+
turnOffMultiMsg(FALSE); // multiplay msgs back on.
+
+ if(bKilled)
+ {
+
proj_UpdateKills(psObj);
+ }
}
}
}
}
- // Missed by old method, but maybe in landed within the building's
footprint(baseplate)
- else if(ptInStructure(psCurrS,psObj->x,psObj->y) AND
(BASE_OBJECT*)psCurrS!=psObj->psDest)
+ for (psCurrS = apsStructLists[i]; psCurrS;
psCurrS = psNextS)
{
- damage = NOMINAL_DAMAGE;
+ /* have to store the next pointer as
psCurrD could be destroyed */
+ psNextS = psCurrS->psNext;
- if(bMultiPlayer)
+ /* see if psCurrS is hit (don't hit
main target twice) */
+ if (((BASE_OBJECT *)psCurrS != psObj->psDest)
&&
+ ((SDWORD)psCurrS->x >= tarX0) &&
+ ((SDWORD)psCurrS->x <= tarX1) &&
+ ((SDWORD)psCurrS->y >= tarY0) &&
+ ((SDWORD)psCurrS->y <= tarY1))
{
- if(psObj->psSource &&
myResponsibility(psObj->psSource->player))
+ /* Within the bounding box, now
check the radius */
+ xDiff = psCurrS->x - psObj->x;
+ yDiff = psCurrS->y - psObj->y;
+ if ((xDiff*xDiff + yDiff*yDiff)
<= radSquared)
{
-
updateMultiStatsDamage(psObj->psSource->player, psCurrS->player,damage);
+ HIT_ROLL(dice);
+ //if (dice <
psStats->radiusHit)
+ if (dice <
weaponRadiusHit(psStats, psObj->player))
+ {
+ damage =
calcDamage(weaponRadDamage(
+ psStats,
psObj->player),
+
psStats->weaponEffect, (BASE_OBJECT *)psCurrS);
+
+
+ if(bMultiPlayer)
+ {
+ if(psObj->psSource
&& myResponsibility(psObj->psSource->player))
+ {
+
updateMultiStatsDamage(psObj->psSource->player, psCurrS->player,damage);
+ }
+ }
+
+ bKilled =
structureDamage(psCurrS, damage,
+
psStats->weaponClass, psStats->weaponSubClass);
+
+ if(bKilled)
+ {
+
proj_UpdateKills(psObj);
+ }
+ }
}
}
+ // Missed by old method, but maybe in landed within the building's
footprint(baseplate)
+ else if(ptInStructure(psCurrS,psObj->x,psObj->y) AND
(BASE_OBJECT*)psCurrS!=psObj->psDest)
+ {
+ damage = NOMINAL_DAMAGE;
- bKilled = structureDamage(psCurrS,
damage,
- psStats->weaponClass, psStats->weaponSubClass);
+ if(bMultiPlayer)
+ {
+ if(psObj->psSource &&
myResponsibility(psObj->psSource->player))
+ {
+
updateMultiStatsDamage(psObj->psSource->player, psCurrS->player,damage);
+ }
+ }
- if(bKilled)
- {
- proj_UpdateKills(psObj);
+ bKilled =
structureDamage(psCurrS, damage,
+ psStats->weaponClass,
psStats->weaponSubClass);
+
+ if(bKilled)
+ {
+ proj_UpdateKills(psObj);
+ }
}
}
}
@@ -1901,7 +2077,8 @@
(BASE_OBJECT *)psCurrF),
psStats->weaponClass);*/
bKilled =
featureDamage(psCurrF, calcDamage(weaponRadDamage(
psStats, psObj->player),
psStats->weaponEffect,
- (BASE_OBJECT *)psCurrF),
psStats->weaponSubClass);
+ (BASE_OBJECT *)psCurrF),
psStats->weaponClass,
+ psStats->weaponSubClass);
if(bKilled)
{
proj_UpdateKills(psObj);
@@ -2186,7 +2363,6 @@
STRUCTURE *psStructure;
FEATURE *psFeat;
//Watermelon:droid pointer
-DROID *psDroid = NULL;
radius = 0;
@@ -2199,8 +2375,7 @@
switch(psTarget->type)
{
case OBJ_DROID:
- psDroid = (DROID *)psTarget;
- switch(psDroid->droidType)
+ switch(((DROID *)psTarget)->droidType)
{
case DROID_WEAPON:
case DROID_SENSOR:
@@ -2208,17 +2383,13 @@
case DROID_CONSTRUCT:
case DROID_COMMAND:
case DROID_REPAIR:
- //Watermelon:'hitbox' size is now based
on body size
- //Watermelon:Light:16 Medium:32
Heavy:48 S.Heavy:64
- radius = TILE_UNITS/8 + ( (asBodyStats +
psDroid->asBits[COMP_BODY].nStat)->size * 16 );
- break;
case DROID_PERSON:
case DROID_CYBORG:
case DROID_CYBORG_CONSTRUCT:
case DROID_CYBORG_REPAIR:
case DROID_CYBORG_SUPER:
- //Watermelon:cyborg and person have
smaller 'hitbox' now
- radius = TILE_UNITS/8;
+ //Watermelon:'hitbox' size is now based
on imd size
+ radius = (psTarget->sDisplay.imd->xmax +
psTarget->sDisplay.imd->zmax)/2;
break;
case DROID_DEFAULT:
case DROID_TRANSPORTER:
@@ -2333,7 +2504,7 @@
return structureDamage((STRUCTURE *)psObj, damage, weaponClass,
weaponSubClass);
break;
case OBJ_FEATURE:
- return featureDamage((FEATURE *)psObj, damage,
weaponSubClass);
+ return featureDamage((FEATURE *)psObj, damage, weaponClass,
weaponSubClass);
break;
default:
ASSERT( FALSE, "objectDamage - unknown object type" );
@@ -2490,4 +2661,3 @@
-
_______________________________________________
Warzone-dev mailing list
Warzone-dev@gna.org
https://mail.gna.org/listinfo/warzone-dev