mirror of
https://github.com/1dot13/source.git
synced 2026-09-09 14:46:05 +02:00
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:
+66
-96
@@ -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 )
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user