mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
- Fix: security check for underflows when adding reinforcements
- Fix: added defined heights for kid's heads and torsos to correctly apply headshots - Fix: While filling canteens, poisoned water from sectors is only consumed if no water drum is found git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@5684 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -1529,7 +1529,13 @@ void AddPossiblePendingEnemiesToBattle()
|
|||||||
ubGroupIndex = Random( ubNumGroupsInSector);
|
ubGroupIndex = Random( ubNumGroupsInSector);
|
||||||
pGroup = pGroupInSectorList[ ubGroupIndex];
|
pGroup = pGroupInSectorList[ ubGroupIndex];
|
||||||
|
|
||||||
ubNumAvailable = pGroup->ubGroupSize - pGroup->pEnemyGroup->ubElitesInBattle - pGroup->pEnemyGroup->ubTroopsInBattle - pGroup->pEnemyGroup->ubAdminsInBattle;
|
// Flugente fix: check for underflow...
|
||||||
|
UINT8 currentgroupsize = pGroup->pEnemyGroup->ubElitesInBattle + pGroup->pEnemyGroup->ubTroopsInBattle + pGroup->pEnemyGroup->ubAdminsInBattle;
|
||||||
|
if ( currentgroupsize > pGroup->ubGroupSize )
|
||||||
|
ubNumAvailable = 0;
|
||||||
|
else
|
||||||
|
ubNumAvailable = pGroup->ubGroupSize - currentgroupsize;
|
||||||
|
|
||||||
if (!ubNumAvailable)
|
if (!ubNumAvailable)
|
||||||
{
|
{
|
||||||
// Looks like we picked an empty group. Make a note of it
|
// Looks like we picked an empty group. Make a note of it
|
||||||
|
|||||||
+9
-6
@@ -759,7 +759,14 @@ void SectorFillCanteens( void )
|
|||||||
// If not, see if there is a water drum, and fill up the canteens from that one
|
// If not, see if there is a water drum, and fill up the canteens from that one
|
||||||
UINT8 waterquality = GetWaterQuality(gWorldSectorX, gWorldSectorY, gbWorldSectorZ);
|
UINT8 waterquality = GetWaterQuality(gWorldSectorX, gWorldSectorY, gbWorldSectorZ);
|
||||||
|
|
||||||
if ( waterquality == WATER_DRINKABLE || waterquality == WATER_POISONOUS )
|
// search for a water drum
|
||||||
|
BOOLEAN waterdrumfound = FALSE;
|
||||||
|
OBJECTTYPE* pWaterDrum = GetUsableWaterDrumInSector();
|
||||||
|
if ( !pWaterDrum || !(pWaterDrum->exists()) )
|
||||||
|
waterdrumfound = TRUE;
|
||||||
|
|
||||||
|
// drink from sector if water is ok, or it is poisonous but we haven't found a useable water drum
|
||||||
|
if ( waterquality == WATER_DRINKABLE || (waterquality == WATER_POISONOUS && !waterdrumfound) )
|
||||||
{
|
{
|
||||||
// the temperature of the water in this sector (temperature reflects the quality)
|
// the temperature of the water in this sector (temperature reflects the quality)
|
||||||
FLOAT addtemperature = OVERHEATING_MAX_TEMPERATURE;
|
FLOAT addtemperature = OVERHEATING_MAX_TEMPERATURE;
|
||||||
@@ -837,12 +844,8 @@ void SectorFillCanteens( void )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else if ( waterdrumfound )
|
||||||
{
|
{
|
||||||
OBJECTTYPE* pWaterDrum = GetUsableWaterDrumInSector();
|
|
||||||
if ( !pWaterDrum || !(pWaterDrum->exists()) )
|
|
||||||
return;
|
|
||||||
|
|
||||||
INT32 drumsize = Food[Item[pWaterDrum->usItem].foodtype].bDrinkPoints;
|
INT32 drumsize = Food[Item[pWaterDrum->usItem].foodtype].bDrinkPoints;
|
||||||
|
|
||||||
// first step: fill all canteens in inventories
|
// first step: fill all canteens in inventories
|
||||||
|
|||||||
+57
-15
@@ -2460,6 +2460,9 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// Flugente: kids are smaller. We have to keep hat in mind... otherwise we will never make a sucessful headshot
|
||||||
|
BOOLEAN iskid = ( pTarget->ubBodyType == HATKIDCIV || pTarget->ubBodyType == KIDCIV );
|
||||||
|
|
||||||
switch (gAnimControl[ pTarget->usAnimState ].ubEndHeight)
|
switch (gAnimControl[ pTarget->usAnimState ].ubEndHeight)
|
||||||
{
|
{
|
||||||
case ANIM_STAND:
|
case ANIM_STAND:
|
||||||
@@ -2471,17 +2474,36 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend
|
|||||||
{
|
{
|
||||||
dZPosRelToMerc -= HEIGHT_UNITS;
|
dZPosRelToMerc -= HEIGHT_UNITS;
|
||||||
}
|
}
|
||||||
if (dZPosRelToMerc > STANDING_HEAD_BOTTOM_POS)
|
|
||||||
|
if ( iskid )
|
||||||
{
|
{
|
||||||
ubHitLocation = AIM_SHOT_HEAD;
|
if (dZPosRelToMerc > STANDING_HEAD_BOTTOM_POS_KID)
|
||||||
}
|
{
|
||||||
else if (dZPosRelToMerc < STANDING_TORSO_BOTTOM_POS )
|
ubHitLocation = AIM_SHOT_HEAD;
|
||||||
{
|
}
|
||||||
ubHitLocation = AIM_SHOT_LEGS;
|
else if (dZPosRelToMerc < STANDING_TORSO_BOTTOM_POS_KID )
|
||||||
|
{
|
||||||
|
ubHitLocation = AIM_SHOT_LEGS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ubHitLocation = AIM_SHOT_TORSO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ubHitLocation = AIM_SHOT_TORSO;
|
if (dZPosRelToMerc > STANDING_HEAD_BOTTOM_POS)
|
||||||
|
{
|
||||||
|
ubHitLocation = AIM_SHOT_HEAD;
|
||||||
|
}
|
||||||
|
else if (dZPosRelToMerc < STANDING_TORSO_BOTTOM_POS )
|
||||||
|
{
|
||||||
|
ubHitLocation = AIM_SHOT_LEGS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ubHitLocation = AIM_SHOT_TORSO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2491,18 +2513,38 @@ BOOLEAN BulletHitMerc( BULLET * pBullet, STRUCTURE * pStructure, BOOLEAN fIntend
|
|||||||
{
|
{
|
||||||
dZPosRelToMerc -= HEIGHT_UNITS;
|
dZPosRelToMerc -= HEIGHT_UNITS;
|
||||||
}
|
}
|
||||||
if (dZPosRelToMerc > CROUCHED_HEAD_BOTTOM_POS)
|
|
||||||
|
if ( iskid )
|
||||||
{
|
{
|
||||||
ubHitLocation = AIM_SHOT_HEAD;
|
if (dZPosRelToMerc > CROUCHED_HEAD_BOTTOM_POS_KID)
|
||||||
}
|
{
|
||||||
else if ( dZPosRelToMerc < CROUCHED_TORSO_BOTTOM_POS )
|
ubHitLocation = AIM_SHOT_HEAD;
|
||||||
{
|
}
|
||||||
// prevent targets in water from being hit in legs
|
else if ( dZPosRelToMerc < CROUCHED_TORSO_BOTTOM_POS_KID )
|
||||||
ubHitLocation = AIM_SHOT_LEGS;
|
{
|
||||||
|
// prevent targets in water from being hit in legs
|
||||||
|
ubHitLocation = AIM_SHOT_LEGS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ubHitLocation = AIM_SHOT_TORSO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ubHitLocation = AIM_SHOT_TORSO;
|
if (dZPosRelToMerc > CROUCHED_HEAD_BOTTOM_POS)
|
||||||
|
{
|
||||||
|
ubHitLocation = AIM_SHOT_HEAD;
|
||||||
|
}
|
||||||
|
else if ( dZPosRelToMerc < CROUCHED_TORSO_BOTTOM_POS )
|
||||||
|
{
|
||||||
|
// prevent targets in water from being hit in legs
|
||||||
|
ubHitLocation = AIM_SHOT_LEGS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ubHitLocation = AIM_SHOT_TORSO;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ANIM_PRONE:
|
case ANIM_PRONE:
|
||||||
|
|||||||
@@ -122,6 +122,12 @@ BOOLEAN CalculateSoldierZPos( SOLDIERTYPE * pSoldier, UINT8 ubPosType, FLOAT * p
|
|||||||
#define STANDING_LEGS_TARGET_POS 47.0f
|
#define STANDING_LEGS_TARGET_POS 47.0f
|
||||||
#define STANDING_TARGET_POS STANDING_HEAD_TARGET_POS
|
#define STANDING_TARGET_POS STANDING_HEAD_TARGET_POS
|
||||||
|
|
||||||
|
// Flugente: new defines for kid bodytypes
|
||||||
|
#define STANDING_HEAD_BOTTOM_POS_KID 111.0f
|
||||||
|
#define STANDING_TORSO_BOTTOM_POS_KID 67.0f
|
||||||
|
#define CROUCHED_HEAD_BOTTOM_POS_KID 78.0f
|
||||||
|
#define CROUCHED_TORSO_BOTTOM_POS_KID 33.0f
|
||||||
|
|
||||||
#define CROUCHED_HEIGHT 130.0f
|
#define CROUCHED_HEIGHT 130.0f
|
||||||
#define CROUCHED_LOS_POS 111.0f
|
#define CROUCHED_LOS_POS 111.0f
|
||||||
#define CROUCHED_FIRING_POS 111.0f
|
#define CROUCHED_FIRING_POS 111.0f
|
||||||
|
|||||||
Reference in New Issue
Block a user