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

Reply via email to