Fix possible signed/unsigned type inconsistency problems in auto resolve code, fix max limit for tries in auto bandage code.

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@9209 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Sevenfm
2021-11-01 16:09:59 +00:00
parent fbade9d355
commit 01a566494e
+63 -57
View File
@@ -1634,7 +1634,9 @@ UINT32 AutoBandageMercs()
// SANDRO - added safety check // SANDRO - added safety check
cnt++; cnt++;
if( cnt > 500 ) // sevenfm: INT8 cannot be larger than 127, should be 50 probably as in other check here
//if( cnt > 500 )
if (cnt > 50)
break; break;
} }
} }
@@ -4376,11 +4378,11 @@ BOOLEAN TargetHasLoadedGun( SOLDIERTYPE *pSoldier )
void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget ) void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
{ {
UINT16 usAttack; INT16 sAttack;
UINT16 usDefence; UINT16 sDefence;
UINT8 ubImpact; UINT8 ubImpact;
UINT8 ubLocation; UINT8 ubLocation;
UINT8 ubAccuracy; INT16 sAccuracy;
INT32 iRandom; INT32 iRandom;
INT32 iImpact; INT32 iImpact;
INT32 iNewLife; INT32 iNewLife;
@@ -4393,69 +4395,69 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
pAttacker->uiFlags |= CELL_FIREDATTARGET | CELL_DIRTY; pAttacker->uiFlags |= CELL_FIREDATTARGET | CELL_DIRTY;
if( pAttacker->usAttack < 950 ) if( pAttacker->usAttack < 950 )
usAttack = (UINT16)(pAttacker->usAttack + PreRandom((INT16)(gGameExternalOptions.iAutoResolveLuckFactor*1000.0) - pAttacker->usAttack )); sAttack = (INT16)(pAttacker->usAttack + PreRandom(max(0, (INT16)(gGameExternalOptions.iAutoResolveLuckFactor*1000.0) - (INT16)pAttacker->usAttack)));
else else
usAttack = (UINT16)(950 + PreRandom( 50 )); sAttack = 950 + PreRandom(50);
if( pTarget->uiFlags & CELL_RETREATING && !(pAttacker->uiFlags & CELL_FEMALECREATURE) ) if( pTarget->uiFlags & CELL_RETREATING && !(pAttacker->uiFlags & CELL_FEMALECREATURE) )
{ {
//Attacking a retreating merc is harder. Modify the attack value to 70% of it's value. //Attacking a retreating merc is harder. Modify the attack value to 70% of it's value.
//This allows retreaters to have a better chance of escaping. //This allows retreaters to have a better chance of escaping.
usAttack = usAttack * 7 / 10; sAttack = sAttack * 7 / 10;
} }
if( pTarget->usDefence < 950 ) if( pTarget->usDefence < 950 )
usDefence = (UINT16)(pTarget->usDefence + PreRandom((INT16)(gGameExternalOptions.iAutoResolveLuckFactor*1000.0) - pTarget->usDefence )); sDefence = (INT16)(pTarget->usDefence + PreRandom(max(0, (INT16)(gGameExternalOptions.iAutoResolveLuckFactor*1000.0) - (INT16)pTarget->usDefence)));
else else
usDefence = (UINT16)(950 + PreRandom( 50 )); sDefence = 950 + PreRandom(50);
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - Iincrease Militia Strength in autoresolve battles // SANDRO - Increase Militia Strength in autoresolve battles
// because the attack and defense is limited to max 1000, rather than only increasing the attack of milita, // because the attack and defense is limited to max 1000, rather than only increasing the attack of militia,
// decrease the defense of target - so +100% bonus means +50% attack of attacker and -50% defense of target // decrease the defense of target - so +100% bonus means +50% attack of attacker and -50% defense of target
//if militita is attacking increase attack by half and decrease the defense of enemy //if militia is attacking increase attack by half and decrease the defense of enemy
if (pAttacker->pSoldier->ubSoldierClass == SOLDIER_CLASS_GREEN_MILITIA && gGameExternalOptions.sGreenMilitiaAutoresolveStrength != 0) if (pAttacker->pSoldier->ubSoldierClass == SOLDIER_CLASS_GREEN_MILITIA && gGameExternalOptions.sGreenMilitiaAutoresolveStrength != 0)
{ {
usAttack += (usAttack * gGameExternalOptions.sGreenMilitiaAutoresolveStrength /200); sAttack += (sAttack * gGameExternalOptions.sGreenMilitiaAutoresolveStrength /200);
usDefence -= (usDefence * gGameExternalOptions.sGreenMilitiaAutoresolveStrength /200); sDefence -= (sDefence * gGameExternalOptions.sGreenMilitiaAutoresolveStrength /200);
} }
else if (pAttacker->pSoldier->ubSoldierClass == SOLDIER_CLASS_REG_MILITIA && gGameExternalOptions.sRegularMilitiaAutoresolveStrength != 0) else if (pAttacker->pSoldier->ubSoldierClass == SOLDIER_CLASS_REG_MILITIA && gGameExternalOptions.sRegularMilitiaAutoresolveStrength != 0)
{ {
usAttack += (usAttack * gGameExternalOptions.sRegularMilitiaAutoresolveStrength /200); sAttack += (sAttack * gGameExternalOptions.sRegularMilitiaAutoresolveStrength /200);
usDefence -= (usDefence * gGameExternalOptions.sRegularMilitiaAutoresolveStrength /200); sDefence -= (sDefence * gGameExternalOptions.sRegularMilitiaAutoresolveStrength /200);
} }
else if (pAttacker->pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE_MILITIA && gGameExternalOptions.sVeteranMilitiaAutoresolveStrength != 0) else if (pAttacker->pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE_MILITIA && gGameExternalOptions.sVeteranMilitiaAutoresolveStrength != 0)
{ {
usAttack += (usAttack * gGameExternalOptions.sVeteranMilitiaAutoresolveStrength /200); sAttack += (sAttack * gGameExternalOptions.sVeteranMilitiaAutoresolveStrength /200);
usDefence -= (usDefence * gGameExternalOptions.sVeteranMilitiaAutoresolveStrength /200); sDefence -= (sDefence * gGameExternalOptions.sVeteranMilitiaAutoresolveStrength /200);
} }
else if (pAttacker->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveOffenseBonus != 0) else if (pAttacker->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveOffenseBonus != 0)
{ {
usAttack += (usAttack * gGameExternalOptions.sMercsAutoresolveOffenseBonus /200); sAttack += (sAttack * gGameExternalOptions.sMercsAutoresolveOffenseBonus /200);
usDefence -= (usDefence * gGameExternalOptions.sMercsAutoresolveOffenseBonus /200); sDefence -= (sDefence * gGameExternalOptions.sMercsAutoresolveOffenseBonus /200);
} }
//if enemy is attacking decrease his attack by half and increase the defense of militia by half //if enemy is attacking decrease his attack by half and increase the defense of militia by half
if (pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_GREEN_MILITIA && gGameExternalOptions.sGreenMilitiaAutoresolveStrength != 0) if (pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_GREEN_MILITIA && gGameExternalOptions.sGreenMilitiaAutoresolveStrength != 0)
{ {
usDefence += (usDefence * gGameExternalOptions.sGreenMilitiaAutoresolveStrength /200); sDefence += (sDefence * gGameExternalOptions.sGreenMilitiaAutoresolveStrength /200);
usAttack -= (usAttack * gGameExternalOptions.sGreenMilitiaAutoresolveStrength /200); sAttack -= (sAttack * gGameExternalOptions.sGreenMilitiaAutoresolveStrength /200);
} }
else if (pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_REG_MILITIA && gGameExternalOptions.sRegularMilitiaAutoresolveStrength != 0) else if (pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_REG_MILITIA && gGameExternalOptions.sRegularMilitiaAutoresolveStrength != 0)
{ {
usDefence += (usDefence * gGameExternalOptions.sRegularMilitiaAutoresolveStrength /200); sDefence += (sDefence * gGameExternalOptions.sRegularMilitiaAutoresolveStrength /200);
usAttack -= (usAttack * gGameExternalOptions.sRegularMilitiaAutoresolveStrength /200); sAttack -= (sAttack * gGameExternalOptions.sRegularMilitiaAutoresolveStrength /200);
} }
else if (pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE_MILITIA && gGameExternalOptions.sVeteranMilitiaAutoresolveStrength != 0) else if (pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE_MILITIA && gGameExternalOptions.sVeteranMilitiaAutoresolveStrength != 0)
{ {
usDefence += (usDefence * gGameExternalOptions.sVeteranMilitiaAutoresolveStrength /200); sDefence += (sDefence * gGameExternalOptions.sVeteranMilitiaAutoresolveStrength /200);
usAttack -= (usAttack * gGameExternalOptions.sVeteranMilitiaAutoresolveStrength /200); sAttack -= (sAttack * gGameExternalOptions.sVeteranMilitiaAutoresolveStrength /200);
} }
else if (pTarget->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveDeffenseBonus != 0) else if (pTarget->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveDeffenseBonus != 0)
{ {
usDefence += (usDefence * gGameExternalOptions.sMercsAutoresolveDeffenseBonus /200); sDefence += (sDefence * gGameExternalOptions.sMercsAutoresolveDeffenseBonus /200);
usAttack -= (usAttack * gGameExternalOptions.sMercsAutoresolveDeffenseBonus /200); sAttack -= (sAttack * gGameExternalOptions.sMercsAutoresolveDeffenseBonus /200);
} }
// check fortifications bonus // check fortifications bonus
@@ -4464,13 +4466,13 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
|| pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE_MILITIA || pTarget->pSoldier->ubSoldierClass == SOLDIER_CLASS_ELITE_MILITIA
|| (pTarget->uiFlags & CELL_MERC)) || (pTarget->uiFlags & CELL_MERC))
{ {
usDefence += (usDefence * RebelCommand::GetFortificationsBonus(GetAutoResolveSectorID()) / 200); sDefence += (sDefence * RebelCommand::GetFortificationsBonus(GetAutoResolveSectorID()) / 200);
usAttack -= (usAttack * RebelCommand::GetFortificationsBonus(GetAutoResolveSectorID()) / 200); sAttack -= (sAttack * RebelCommand::GetFortificationsBonus(GetAutoResolveSectorID()) / 200);
} }
// reapair values // repair values
usAttack = max(0, min(1000, usAttack )); sAttack = max(0, min(1000, sAttack ));
usDefence = max(0, min(1000, usDefence )); sDefence = max(0, min(1000, sDefence ));
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
if( pAttacker->uiFlags & (CELL_FEMALECREATURE | CELL_BLOODCAT | CELL_ZOMBIE) ) if( pAttacker->uiFlags & (CELL_FEMALECREATURE | CELL_BLOODCAT | CELL_ZOMBIE) )
@@ -4487,7 +4489,7 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
fCannon = TRUE; fCannon = TRUE;
// cannons have a huge splash zone, so they are much more likely to hit // cannons have a huge splash zone, so they are much more likely to hit
usAttack *= 1.5; sAttack *= 1.5;
} }
// if our target is a tank, we use heavy weapons if we have any // if our target is a tank, we use heavy weapons if we have any
else if ( (ARMED_VEHICLE( pTarget->pSoldier ) || ENEMYROBOT( pTarget->pSoldier )) && FireAntiTankWeapon( pAttacker ) ) else if ( (ARMED_VEHICLE( pTarget->pSoldier ) || ENEMYROBOT( pTarget->pSoldier )) && FireAntiTankWeapon( pAttacker ) )
@@ -4495,7 +4497,7 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
fAntiTank = TRUE; fAntiTank = TRUE;
// hitting a tank with an rpg isn't easy // hitting a tank with an rpg isn't easy
usAttack *= 0.8; sAttack *= 0.8;
} }
else if( !FireAShot( pAttacker ) ) else if( !FireAShot( pAttacker ) )
{ {
@@ -4509,9 +4511,9 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
{ {
//except for creatures //except for creatures
if( fKnife ) if( fKnife )
usAttack = usAttack * 6 / 10; sAttack = sAttack * 6 / 10;
else else
usAttack = usAttack * 4 / 10; sAttack = sAttack * 4 / 10;
} }
} }
} }
@@ -4543,11 +4545,11 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
} }
} }
if( usAttack < usDefence ) if( sAttack < sDefence )
{ {
if( pTarget->pSoldier->stats.bLife >= OKLIFE || !PreRandom( 5 ) ) if( pTarget->pSoldier->stats.bLife >= OKLIFE || !PreRandom( 5 ) )
{ {
//Attacker misses -- use up a round of ammo. If target is unconcious, then 80% chance of hitting. //Attacker misses -- use up a round of ammo. If target is unconscious, then 80% chance of hitting.
pTarget->uiFlags |= CELL_DODGEDATTACK | CELL_DIRTY; pTarget->uiFlags |= CELL_DODGEDATTACK | CELL_DIRTY;
if( fMelee ) if( fMelee )
@@ -4601,7 +4603,7 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
//ubAccuracy = (UINT8)((usAttack - usDefence + PreRandom( usDefence - pTarget->usDefence )) / 10); //ubAccuracy = (UINT8)((usAttack - usDefence + PreRandom( usDefence - pTarget->usDefence )) / 10);
///////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - increased mercs' offense/deffense rating // SANDRO - increased mercs' offense/defense rating
if ( pAttacker->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveOffenseBonus != 0 ) if ( pAttacker->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveOffenseBonus != 0 )
{ {
ubImpact += (ubImpact * gGameExternalOptions.sMercsAutoresolveOffenseBonus / 150); ubImpact += (ubImpact * gGameExternalOptions.sMercsAutoresolveOffenseBonus / 150);
@@ -4675,7 +4677,7 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
//ubAccuracy = (UINT8)((usAttack - usDefence + PreRandom( usDefence - pTarget->usDefence )) / 10); //ubAccuracy = (UINT8)((usAttack - usDefence + PreRandom( usDefence - pTarget->usDefence )) / 10);
///////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - increased mercs' offense/deffense rating // SANDRO - increased mercs' offense/defense rating
if ( pAttacker->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveOffenseBonus != 0 ) if ( pAttacker->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveOffenseBonus != 0 )
{ {
ubImpact += (ubImpact * gGameExternalOptions.sMercsAutoresolveOffenseBonus / 150); ubImpact += (ubImpact * gGameExternalOptions.sMercsAutoresolveOffenseBonus / 150);
@@ -4710,16 +4712,17 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
else else
ubLocation = AIM_SHOT_TORSO; ubLocation = AIM_SHOT_TORSO;
if (usDefence >= pTarget->usDefence) if (sDefence >= pTarget->usDefence)
iRandom = PreRandom(usDefence - pTarget->usDefence); iRandom = PreRandom(sDefence - pTarget->usDefence);
else else
iRandom = -PreRandom(pTarget->usDefence - usDefence); iRandom = -PreRandom(pTarget->usDefence - sDefence);
sAccuracy = (sAttack - sDefence + iRandom) / 10;
ubAccuracy = (UINT8)((usAttack - usDefence + iRandom)/10);
// HEADROCK HAM 5: Added argument // HEADROCK HAM 5: Added argument
iImpact = BulletImpact( pAttacker->pSoldier, NULL, pTarget->pSoldier, ubLocation, ubImpact, ubAccuracy, NULL ); iImpact = BulletImpact( pAttacker->pSoldier, NULL, pTarget->pSoldier, ubLocation, ubImpact, sAccuracy, NULL );
///////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - increased mercs' offense/deffense rating // SANDRO - increased mercs' offense/defense rating
if (pAttacker->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveOffenseBonus != 0) if (pAttacker->uiFlags & CELL_MERC && gGameExternalOptions.sMercsAutoresolveOffenseBonus != 0)
{ {
iImpact += (iImpact * gGameExternalOptions.sMercsAutoresolveOffenseBonus /150); iImpact += (iImpact * gGameExternalOptions.sMercsAutoresolveOffenseBonus /150);
@@ -4751,12 +4754,12 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
return; return;
} }
if (usDefence >= pTarget->usDefence) if (sDefence >= pTarget->usDefence)
iRandom = PreRandom(usDefence - pTarget->usDefence); iRandom = PreRandom(sDefence - pTarget->usDefence);
else else
iRandom = -PreRandom(pTarget->usDefence - usDefence); iRandom = -PreRandom(pTarget->usDefence - sDefence);
ubAccuracy = (UINT8)((usAttack - usDefence + iRandom)/10); sAccuracy = (sAttack - sDefence + iRandom) / 10;
//Determine attacking weapon. //Determine attacking weapon.
pAttacker->pSoldier->usAttackingWeapon = 0; pAttacker->pSoldier->usAttackingWeapon = 0;
@@ -4774,13 +4777,13 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
//switch items //switch items
tempItem = pAttacker->pSoldier->inv[ HANDPOS ]; tempItem = pAttacker->pSoldier->inv[ HANDPOS ];
pAttacker->pSoldier->inv[ HANDPOS ] = pAttacker->pSoldier->inv[ pAttacker->bWeaponSlot ]; //CTD pAttacker->pSoldier->inv[ HANDPOS ] = pAttacker->pSoldier->inv[ pAttacker->bWeaponSlot ]; //CTD
iImpact = HTHImpact( pAttacker->pSoldier, pTarget->pSoldier, ubAccuracy, (BOOLEAN)(fKnife || fClaw) ); iImpact = HTHImpact( pAttacker->pSoldier, pTarget->pSoldier, sAccuracy, (BOOLEAN)(fKnife || fClaw) );
pAttacker->pSoldier->inv[ pAttacker->bWeaponSlot ] = pAttacker->pSoldier->inv[ HANDPOS ]; pAttacker->pSoldier->inv[ pAttacker->bWeaponSlot ] = pAttacker->pSoldier->inv[ HANDPOS ];
pAttacker->pSoldier->inv[ HANDPOS ] = tempItem; pAttacker->pSoldier->inv[ HANDPOS ] = tempItem;
} }
else else
{ {
iImpact = HTHImpact( pAttacker->pSoldier, pTarget->pSoldier, ubAccuracy, (BOOLEAN)(fKnife || fClaw) ); iImpact = HTHImpact( pAttacker->pSoldier, pTarget->pSoldier, sAccuracy, (BOOLEAN)(fKnife || fClaw) );
} }
///////////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SANDRO - increased mercs' offense/deffense rating // SANDRO - increased mercs' offense/deffense rating
@@ -4801,20 +4804,22 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
iImpact = 0; iImpact = 0;
} }
// WANNE: Just for safty. // WANNE: Just for safety.
if (iImpact < 0) if (iImpact < 0)
iImpact = 0; iImpact = 0;
iNewLife = pTarget->pSoldier->stats.bLife - iImpact; iNewLife = pTarget->pSoldier->stats.bLife - iImpact;
if( pAttacker->uiFlags & CELL_MERC ) if( pAttacker->uiFlags & CELL_MERC )
{ //Attacker is a player, so increment the number of shots that hit. {
//Attacker is a player, so increment the number of shots that hit.
gMercProfiles[ pAttacker->pSoldier->ubProfile ].records.usShotsHit++; gMercProfiles[ pAttacker->pSoldier->ubProfile ].records.usShotsHit++;
// MARKSMANSHIP GAIN: Attacker's shot hits // MARKSMANSHIP GAIN: Attacker's shot hits
StatChange( pAttacker->pSoldier, MARKAMT, 6, FALSE ); // in addition to 3 for taking a shot StatChange( pAttacker->pSoldier, MARKAMT, 6, FALSE ); // in addition to 3 for taking a shot
} }
if( pTarget->uiFlags & CELL_MERC ) if( pTarget->uiFlags & CELL_MERC )
{ //Target is a player, so increment the times he has been wounded. {
//Target is a player, so increment the times he has been wounded.
if( iImpact > 1 ) if( iImpact > 1 )
gMercProfiles[ pTarget->pSoldier->ubProfile ].records.usTimesWoundedStabbed++; gMercProfiles[ pTarget->pSoldier->ubProfile ].records.usTimesWoundedStabbed++;
// EXPERIENCE GAIN: Took some damage // EXPERIENCE GAIN: Took some damage
@@ -4867,7 +4872,8 @@ void AttackTarget( SOLDIERCELL *pAttacker, SOLDIERCELL *pTarget )
} }
if( pAttacker->uiFlags & CELL_MERC ) if( pAttacker->uiFlags & CELL_MERC )
{ //Player killed the enemy soldier -- update his stats as well as any assisters. {
//Player killed the enemy soldier -- update his stats as well as any assisters.
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////
// SANDRO - experimental - more specific statistics of mercs // SANDRO - experimental - more specific statistics of mercs
switch(pTarget->pSoldier->ubSoldierClass) switch(pTarget->pSoldier->ubSoldierClass)