Improved movement noise calculation.

Fixed max array size bugs.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8698 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Sevenfm
2019-10-22 20:45:43 +00:00
parent 7908dc2ff3
commit e1657cefb7
+65 -95
View File
@@ -3396,7 +3396,7 @@ void InitSoldierOppList(SOLDIERTYPE *pSoldier)
memset(pSoldier->aiData.bOppList,NOT_HEARD_OR_SEEN,sizeof(pSoldier->aiData.bOppList)); memset(pSoldier->aiData.bOppList,NOT_HEARD_OR_SEEN,sizeof(pSoldier->aiData.bOppList));
pSoldier->aiData.bOppCnt = 0; pSoldier->aiData.bOppCnt = 0;
ResetLastKnownLocs(pSoldier); ResetLastKnownLocs(pSoldier);
memset(gbSeenOpponents[pSoldier->ubID],0,MAXMERCS); memset(gbSeenOpponents[pSoldier->ubID], 0, TOTAL_SOLDIERS);
} }
@@ -5340,84 +5340,78 @@ void DebugSoldierPage4( )
#define VEHICLE_FAST_MOVEMENT_NOISE 25 #define VEHICLE_FAST_MOVEMENT_NOISE 25
#define VEHICLE_NORMAL_MOVEMENT_NOISE 15 #define VEHICLE_NORMAL_MOVEMENT_NOISE 15
UINT8 MovementNoise( SOLDIERTYPE *pSoldier ) UINT8 MovementNoise(SOLDIERTYPE *pSoldier)
{ {
INT32 iStealthSkill, iRoll; INT32 iStealthSkill, iRoll;
UINT8 ubMaxVolume, ubVolume, ubBandaged, ubEffLife; INT16 sMaxVolume, sVolume;
INT8 bInWater = FALSE; INT8 bBandaged, bEffLife;
// anv: vehicle and passengers // anv: vehicle and passengers
if( pSoldier->flags.uiStatusFlags & ( SOLDIER_DRIVER | SOLDIER_PASSENGER ) ) if (pSoldier->flags.uiStatusFlags & (SOLDIER_DRIVER | SOLDIER_PASSENGER))
{ {
return( 0 ); return(0);
} }
else if( pSoldier->flags.uiStatusFlags & ( SOLDIER_VEHICLE ) ) else if (pSoldier->flags.uiStatusFlags & (SOLDIER_VEHICLE))
{ {
if( pSoldier->usAnimState == RUNNING ) if (pSoldier->usAnimState == RUNNING)
{ {
// driving fast makes engine work louder // driving fast makes engine work louder
return( VEHICLE_FAST_MOVEMENT_NOISE ); return(VEHICLE_FAST_MOVEMENT_NOISE);
} }
else else
{ {
return( VEHICLE_NORMAL_MOVEMENT_NOISE ); return(VEHICLE_NORMAL_MOVEMENT_NOISE);
} }
} }
// anv: additional tile properties // anv: additional tile properties
// modify amount of noise and stealth difficulty depending on surface type // modify amount of noise and stealth difficulty depending on surface type
INT8 bGroundVolumeModifier = 0; INT8 bGroundVolumeModifier = 0;
INT8 bGroundStealthDifficultyModifier = 0; INT8 bGroundStealthDifficultyModifier = 0;
ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties; ADDITIONAL_TILE_PROPERTIES_VALUES zGivenTileProperties;
memset(&zGivenTileProperties,0,sizeof(zGivenTileProperties)); memset(&zGivenTileProperties, 0, sizeof(zGivenTileProperties));
if(gGameExternalOptions.fAdditionalTileProperties) if (gGameExternalOptions.fAdditionalTileProperties)
{ {
zGivenTileProperties = GetAllAdditonalTilePropertiesForGrid( pSoldier->sGridNo, pSoldier->pathing.bLevel ); zGivenTileProperties = GetAllAdditonalTilePropertiesForGrid(pSoldier->sGridNo, pSoldier->pathing.bLevel);
bGroundVolumeModifier = zGivenTileProperties.bSoundModifier; bGroundVolumeModifier = zGivenTileProperties.bSoundModifier;
bGroundStealthDifficultyModifier = zGivenTileProperties.bStealthDifficultyModifer; bGroundStealthDifficultyModifier = zGivenTileProperties.bStealthDifficultyModifer;
} }
if ( pSoldier->bTeam == ENEMY_TEAM ) if (pSoldier->bTeam == ENEMY_TEAM)
{ {
return( (UINT8) (MAX_MOVEMENT_NOISE - PreRandom( 2 )) + bGroundVolumeModifier ); return((UINT8)(MAX_MOVEMENT_NOISE - PreRandom(2)) + bGroundVolumeModifier);
} }
// CHANGED BY SANDRO - LET'S MAKE THE STEALTH BASED ON AGILITY LIKE IT SHOULD BE // CHANGED BY SANDRO - LET'S MAKE THE STEALTH BASED ON AGILITY LIKE IT SHOULD BE
//iStealthSkill = 20 + 4 * EffectiveExpLevel( pSoldier ) + ((EffectiveDexterity( pSoldier ) * 4) / 10); // 24-100 iStealthSkill = 20 + 4 * EffectiveExpLevel(pSoldier) + ((EffectiveAgility(pSoldier, FALSE) * 4) / 10); // 24-100
iStealthSkill = 20 + 4 * EffectiveExpLevel( pSoldier ) + ((EffectiveAgility( pSoldier, FALSE ) * 4) / 10); // 24-100
// big bonus for those "extra stealthy" mercs // big bonus for those "extra stealthy" mercs
if ( pSoldier->ubBodyType == BLOODCAT ) if (pSoldier->ubBodyType == BLOODCAT)
{ {
iStealthSkill += 50; iStealthSkill += 50;
} }
// SANDRO - new/old traits // SANDRO - new/old traits
else if ( gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, STEALTHY_NT )) else if (gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT(pSoldier, STEALTHY_NT))
{ {
iStealthSkill += gSkillTraitValues.ubSTBonusToMoveQuietly; iStealthSkill += gSkillTraitValues.ubSTBonusToMoveQuietly;
} }
else if ( !gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT( pSoldier, STEALTHY_OT )) else if (!gGameOptions.fNewTraitSystem && HAS_SKILL_TRAIT(pSoldier, STEALTHY_OT))
{ {
iStealthSkill += 25 * NUM_SKILL_TRAITS( pSoldier, STEALTHY_OT ); iStealthSkill += 25 * NUM_SKILL_TRAITS(pSoldier, STEALTHY_OT);
} }
INT16 wornstealth = GetWornStealth(pSoldier); INT16 wornstealth = GetWornStealth(pSoldier);
if ( wornstealth > 0 ) if (wornstealth > 0)
iStealthSkill += wornstealth / 2; iStealthSkill += wornstealth / 2;
bBandaged = pSoldier->stats.bLifeMax - pSoldier->stats.bLife - pSoldier->bBleeding;
bEffLife = pSoldier->stats.bLife + (bBandaged / 2);
//NumMessage("Base Stealth = ",stealthSkill); // IF "SNEAKER'S" "EFFECTIVE LIFE" IS AT LESS THAN 50
if (bEffLife < 50)
ubBandaged = pSoldier->stats.bLifeMax - pSoldier->stats.bLife - pSoldier->bBleeding;
ubEffLife = pSoldier->stats.bLife + (ubBandaged / 2);
// IF "SNEAKER'S" "EFFECTIVE LIFE" IS AT LESS THAN 50
if (ubEffLife < 50)
{ {
// reduce effective stealth skill by up to 50% for low life // reduce effective stealth skill by up to 50% for low life
iStealthSkill -= (iStealthSkill * (50 - ubEffLife)) / 100; iStealthSkill -= (iStealthSkill * (50 - bEffLife)) / 100;
} }
// if breath is below 50% // if breath is below 50%
@@ -5428,109 +5422,85 @@ UINT8 MovementNoise( SOLDIERTYPE *pSoldier )
} }
// if sneaker is moving through water // if sneaker is moving through water
if (Water( pSoldier->sGridNo, pSoldier->pathing.bLevel ) ) if (Water(pSoldier->sGridNo, pSoldier->pathing.bLevel))
{ {
iStealthSkill -= 10; // 10% penalty iStealthSkill -= 10; // 10% penalty
} }
else if (DeepWater( pSoldier->sGridNo, pSoldier->pathing.bLevel ) ) else if (DeepWater(pSoldier->sGridNo, pSoldier->pathing.bLevel))
{ {
iStealthSkill -= 20; // 20% penalty iStealthSkill -= 20; // 20% penalty
} }
// Flugente: deleting this iStealthSkill = __max(iStealthSkill, 0);
/*if ( pSoldier->drugs.bDrugEffect[ DRUG_TYPE_ADRENALINE ] )
{
// minus 3 percent per bonus AP from adrenaline
iStealthSkill -= 3 * pSoldier->drugs.bDrugEffect[ DRUG_TYPE_ADRENALINE ];
}*/
/*
// if sneaker is too eager and impatient to "do it right"
if ((pSoldier->bTrait == OVER_ENTHUS) || (pSoldier->aiData.bAttitude == AGGRESSIVE))
{
ubStealthSkill -= 10; // 10% penalty
}
*/
//NumMessage("Modified Stealth = ",stealthSkill);
iStealthSkill = __max( iStealthSkill, 0 );
if (!pSoldier->bStealthMode) // REGULAR movement if (!pSoldier->bStealthMode) // REGULAR movement
{ {
//ubMaxVolume = MAX_MOVEMENT_NOISE - (iStealthSkill / 16); // 9 - (0 to 6) => 3 to 9 //ubMaxVolume = MAX_MOVEMENT_NOISE - (iStealthSkill / 16); // 9 - (0 to 6) => 3 to 9
ubMaxVolume = MAX_MOVEMENT_NOISE - (iStealthSkill / 16) + bGroundVolumeModifier; // 9 - (0 to 6) => 3 to 9 sMaxVolume = MAX_MOVEMENT_NOISE - (iStealthSkill / 16) + bGroundVolumeModifier; // 9 - (0 to 6) => 3 to 9
if (bInWater) if (Water(pSoldier->sGridNo, pSoldier->pathing.bLevel))
{ {
ubMaxVolume++; // in water, can be even louder sMaxVolume++; // in water, can be even louder
} }
switch (pSoldier->usAnimState) switch (pSoldier->usUIMovementMode)
{ {
case CRAWLING: case CRAWLING:
ubMaxVolume -= 2; sMaxVolume -= 2;
break; break;
case SWATTING: case SWATTING:
ubMaxVolume -= 1; case SWATTING_WK:
break; sMaxVolume -= 1;
case RUNNING: break;
ubMaxVolume += 3; case RUNNING:
break; sMaxVolume += 3;
break;
} }
if (ubMaxVolume < 2) if (sMaxVolume < 2)
{ {
ubVolume = ubMaxVolume; sVolume = sMaxVolume;
} }
else else
{ {
ubVolume = 1 + (UINT8) PreRandom(ubMaxVolume); // actual volume is 1 to max volume sVolume = 1 + (UINT8)PreRandom(sMaxVolume); // actual volume is 1 to max volume
} }
} }
else // in STEALTH mode else // in STEALTH mode
{ {
//iRoll = (INT32) PreRandom(100); // roll them bones! iRoll = (INT32)PreRandom(100) + bGroundStealthDifficultyModifier; // roll them bones!
iRoll = (INT32) PreRandom(100) + bGroundStealthDifficultyModifier; // roll them bones!
if (iRoll >= iStealthSkill) // v1.13 modification: give a second chance! if (iRoll >= iStealthSkill) // v1.13 modification: give a second chance!
{ {
//iRoll = (INT32) PreRandom(100); iRoll = (INT32)PreRandom(100) + bGroundStealthDifficultyModifier;
iRoll = (INT32) PreRandom(100) + bGroundStealthDifficultyModifier;
} }
if (iRoll < iStealthSkill) if (iRoll < iStealthSkill)
{ {
ubVolume = 0; // made it, stayed quiet moving through this tile sVolume = 0; // made it, stayed quiet moving through this tile
} }
else // OOPS! else // OOPS!
{ {
ubVolume = 1 + ((iRoll - iStealthSkill + 1) / 16); // volume is 1 - 7 ... sVolume = 1 + ((iRoll - iStealthSkill + 1) / 16); // volume is 1 - 7 ...
switch (pSoldier->usAnimState) switch (pSoldier->usUIMovementMode)
{ {
case CRAWLING: case CRAWLING:
ubVolume -= 2; sVolume -= 2;
break; break;
case SWATTING: case SWATTING:
ubVolume -= 1; case SWATTING_WK:
break; sVolume -= 1;
case RUNNING: break;
ubVolume += 3; case RUNNING:
break; sVolume += 3;
break;
} }
if (ubVolume < 1)
{
ubVolume = 0;
}
// randomize at which movement step the sneaking failure will happen
// Status.stepsTilNoise = Random(MAXMOVESTEPS); // 0 - 6
} }
} }
//NumMessage("Volume = ",volume); sVolume = max(0, sVolume);
sVolume = min(255, sVolume);
// save noise volume where stepped HandleSteppedLook can back get at it later return (UINT8)sVolume;
// Status.moveNoiseVolume = ubVolume;
return( ubVolume );
} }
UINT8 DoorOpeningNoise( SOLDIERTYPE *pSoldier ) UINT8 DoorOpeningNoise( SOLDIERTYPE *pSoldier )
@@ -6993,7 +6963,7 @@ void DecayIndividualOpplist(SOLDIERTYPE *pSoldier)
if (pSoldier->stats.bLife < OKLIFE) if (pSoldier->stats.bLife < OKLIFE)
{ {
// must make sure that public opplist is kept to match... // must make sure that public opplist is kept to match...
for ( uiLoop = 0; uiLoop < TOTAL_SOLDIERS; ++uiLoop ) for (uiLoop = 0; uiLoop < MAX_NUM_SOLDIERS; ++uiLoop)
{ {
if ( pSoldier->aiData.bOppList[ uiLoop ] == SEEN_CURRENTLY ) if ( pSoldier->aiData.bOppList[ uiLoop ] == SEEN_CURRENTLY )
{ {