Add BOXER() & ISVIP() macros

This commit is contained in:
Asdow
2024-02-18 12:03:43 +02:00
parent 5fe730b075
commit ab2c5fc10d
10 changed files with 48 additions and 47 deletions
+6 -5
View File
@@ -22,6 +22,7 @@
#include "Font Control.h" #include "Font Control.h"
#include "message.h" #include "message.h"
#include "GameSettings.h" // added by SANDRO #include "GameSettings.h" // added by SANDRO
#include "Soldier macros.h"
INT32 gsBoxerGridNo[ NUM_BOXERS ] = { 11393, 11233, 11073 }; INT32 gsBoxerGridNo[ NUM_BOXERS ] = { 11393, 11233, 11073 };
UINT8 gubBoxerID[ NUM_BOXERS ] = { NOBODY, NOBODY, NOBODY }; UINT8 gubBoxerID[ NUM_BOXERS ] = { NOBODY, NOBODY, NOBODY };
@@ -55,7 +56,7 @@ void ExitBoxing( void )
if ( pSoldier != NULL ) if ( pSoldier != NULL )
{ {
if ( ( pSoldier->flags.uiStatusFlags & SOLDIER_BOXER ) && InARoom( pSoldier->sGridNo, &usRoom ) && usRoom == BOXING_RING ) if ( BOXER(pSoldier) && InARoom( pSoldier->sGridNo, &usRoom ) && usRoom == BOXING_RING )
{ {
if ( pSoldier->flags.uiStatusFlags & SOLDIER_PC ) if ( pSoldier->flags.uiStatusFlags & SOLDIER_PC )
{ {
@@ -239,7 +240,7 @@ void CountPeopleInBoxingRingAndDoActions( void )
{ {
++ubPlayersInRing; ++ubPlayersInRing;
if ( !pNonBoxingPlayer && !(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) ) if ( !pNonBoxingPlayer && !BOXER(pSoldier) )
{ {
pNonBoxingPlayer = pSoldier; pNonBoxingPlayer = pSoldier;
} }
@@ -291,7 +292,7 @@ void CountPeopleInBoxingRingAndDoActions( void )
// ladieees and gennleman, we have a fight! // ladieees and gennleman, we have a fight!
for (uiLoop = 0; uiLoop < 2; ++uiLoop) for (uiLoop = 0; uiLoop < 2; ++uiLoop)
{ {
if (!(pInRing[uiLoop]->flags.uiStatusFlags & SOLDIER_BOXER)) if (!BOXER(pInRing[uiLoop]))
{ {
// set as boxer! // set as boxer!
pInRing[uiLoop]->flags.uiStatusFlags |= SOLDIER_BOXER; pInRing[uiLoop]->flags.uiStatusFlags |= SOLDIER_BOXER;
@@ -515,7 +516,7 @@ void BoxingMovementCheck( SOLDIERTYPE * pSoldier )
// someone moving in/into the ring // someone moving in/into the ring
CountPeopleInBoxingRingAndDoActions(); CountPeopleInBoxingRingAndDoActions();
} }
else if ( ( gTacticalStatus.bBoxingState == BOXING ) && ( pSoldier->flags.uiStatusFlags & SOLDIER_BOXER ) ) else if ( ( gTacticalStatus.bBoxingState == BOXING ) && BOXER(pSoldier) )
{ {
// boxer stepped out of the ring! // boxer stepped out of the ring!
BoxingPlayerDisqualified( pSoldier, BOXER_OUT_OF_RING ); BoxingPlayerDisqualified( pSoldier, BOXER_OUT_OF_RING );
@@ -565,7 +566,7 @@ void ClearAllBoxerFlags( void )
{ {
for (UINT32 uiSlot = 0; uiSlot < guiNumMercSlots; ++uiSlot) for (UINT32 uiSlot = 0; uiSlot < guiNumMercSlots; ++uiSlot)
{ {
if ( MercSlots[ uiSlot ] && MercSlots[ uiSlot ]->flags.uiStatusFlags & SOLDIER_BOXER ) if ( MercSlots[ uiSlot ] && BOXER(MercSlots[ uiSlot ]) )
{ {
// Flugente: nuke the entire opponent count, remove boxing flag, reevaluate opponent list // Flugente: nuke the entire opponent count, remove boxing flag, reevaluate opponent list
DecayIndividualOpplist(MercSlots[uiSlot]); DecayIndividualOpplist(MercSlots[uiSlot]);
+1 -1
View File
@@ -6299,7 +6299,7 @@ BOOLEAN ShowSoldierRoleSymbol(SOLDIERTYPE* pSoldier)
if ( pSoldier->usSkillCounter[SOLDIER_COUNTER_ROLE_OBSERVED] >= gGameExternalOptions.usTurnsToUncover ) if ( pSoldier->usSkillCounter[SOLDIER_COUNTER_ROLE_OBSERVED] >= gGameExternalOptions.usTurnsToUncover )
{ {
// are we a VIP? show that only when the player knows a VIP is in this sector. otherwise, don't even show our officer property // are we a VIP? show that only when the player knows a VIP is in this sector. otherwise, don't even show our officer property
if ( pSoldier->usSoldierFlagMask & SOLDIER_VIP && !pSoldier->bSectorZ ) if (ISVIP(pSoldier) && !pSoldier->bSectorZ )
{ {
if ( PlayerKnowsAboutVIP( pSoldier->sSectorX, pSoldier->sSectorY ) ) if ( PlayerKnowsAboutVIP( pSoldier->sSectorX, pSoldier->sSectorY ) )
{ {
+9 -9
View File
@@ -3043,7 +3043,7 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving )
// sevenfm: check all nearby enemy boxers for opportunity attack // sevenfm: check all nearby enemy boxers for opportunity attack
if (IS_MERC_BODY_TYPE(pSoldier) && if (IS_MERC_BODY_TYPE(pSoldier) &&
(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && BOXER(pSoldier) &&
gTacticalStatus.bBoxingState == BOXING && gTacticalStatus.bBoxingState == BOXING &&
pSoldier->aiData.bAlertStatus >= STATUS_RED) pSoldier->aiData.bAlertStatus >= STATUS_RED)
{ {
@@ -3064,7 +3064,7 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving )
pOpponent->bCollapsed || pOpponent->bCollapsed ||
pOpponent->bBreathCollapsed || pOpponent->bBreathCollapsed ||
!IS_MERC_BODY_TYPE(pOpponent) || !IS_MERC_BODY_TYPE(pOpponent) ||
!(pOpponent->flags.uiStatusFlags & SOLDIER_BOXER) || !BOXER(pOpponent) ||
gAnimControl[pOpponent->usAnimState].ubEndHeight < ANIM_STAND || gAnimControl[pOpponent->usAnimState].ubEndHeight < ANIM_STAND ||
pOpponent->pathing.bLevel != pSoldier->pathing.bLevel || pOpponent->pathing.bLevel != pSoldier->pathing.bLevel ||
!SoldierToSoldierLineOfSightTest(pOpponent, pSoldier, TRUE, CALC_FROM_WANTED_DIR) || !SoldierToSoldierLineOfSightTest(pOpponent, pSoldier, TRUE, CALC_FROM_WANTED_DIR) ||
@@ -7233,7 +7233,7 @@ void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
//if ( pTeamSoldier->stats.bLife >= OKLIFE && pTeamSoldier->stats.bLife != 0 ) //if ( pTeamSoldier->stats.bLife >= OKLIFE && pTeamSoldier->stats.bLife != 0 )
{ {
// officers and generals are 'special' prisoners... // officers and generals are 'special' prisoners...
if ( pTeamSoldier->usSoldierFlagMask & SOLDIER_VIP ) if (ISVIP(pTeamSoldier))
++sNumPrisoner[PRISONER_GENERAL]; ++sNumPrisoner[PRISONER_GENERAL];
// downed pilots count as officers too, even though they are civilians. This makes capturing them more rewarding // downed pilots count as officers too, even though they are civilians. This makes capturing them more rewarding
else if ( (pTeamSoldier->usSoldierFlagMask & SOLDIER_ENEMY_OFFICER) || pTeamSoldier->ubCivilianGroup == DOWNEDPILOT_CIV_GROUP ) else if ( (pTeamSoldier->usSoldierFlagMask & SOLDIER_ENEMY_OFFICER) || pTeamSoldier->ubCivilianGroup == DOWNEDPILOT_CIV_GROUP )
@@ -7262,7 +7262,7 @@ void RemoveCapturedEnemiesFromSectorInfo( INT16 sMapX, INT16 sMapY, INT8 bMapZ )
} }
// Flugente: VIPs // Flugente: VIPs
if ( pTeamSoldier->usSoldierFlagMask & SOLDIER_VIP ) if (ISVIP(pTeamSoldier))
DeleteVIP( pTeamSoldier->sSectorX, pTeamSoldier->sSectorY ); DeleteVIP( pTeamSoldier->sSectorX, pTeamSoldier->sSectorY );
// Flugente: turncoats // Flugente: turncoats
@@ -9320,10 +9320,10 @@ BOOLEAN ProcessImplicationsOfPCAttack( SOLDIERTYPE * pSoldier, SOLDIERTYPE ** pp
if ( gTacticalStatus.bBoxingState == BOXING ) if ( gTacticalStatus.bBoxingState == BOXING )
{ {
// should have a check for "in boxing ring", no? // should have a check for "in boxing ring", no?
if ( ( pSoldier->usAttackingWeapon != NOTHING && !Item[pSoldier->usAttackingWeapon].brassknuckles ) || !( pSoldier->flags.uiStatusFlags & SOLDIER_BOXER ) || pSoldier->IsRiotShieldEquipped() ) if ( ( pSoldier->usAttackingWeapon != NOTHING && !Item[pSoldier->usAttackingWeapon].brassknuckles ) || !BOXER(pSoldier) || pSoldier->IsRiotShieldEquipped() )
{ {
// someone's cheating! // someone's cheating!
if ( (Item[ pSoldier->usAttackingWeapon ].usItemClass == IC_BLADE || Item[ pSoldier->usAttackingWeapon ].usItemClass == IC_PUNCH) && (pTarget->flags.uiStatusFlags & SOLDIER_BOXER) ) if ( (Item[ pSoldier->usAttackingWeapon ].usItemClass == IC_BLADE || Item[ pSoldier->usAttackingWeapon ].usItemClass == IC_PUNCH) && BOXER(pTarget) )
{ {
// knife or brass knuckles disqualify the player! // knife or brass knuckles disqualify the player!
BoxingPlayerDisqualified( pSoldier, BAD_ATTACK ); BoxingPlayerDisqualified( pSoldier, BAD_ATTACK );
@@ -9334,7 +9334,7 @@ BOOLEAN ProcessImplicationsOfPCAttack( SOLDIERTYPE * pSoldier, SOLDIERTYPE ** pp
//gTacticalStatus.bBoxingState = NOT_BOXING; //gTacticalStatus.bBoxingState = NOT_BOXING;
SetBoxingState( NOT_BOXING ); SetBoxingState( NOT_BOXING );
// if we are attacking a boxer we should set them to neutral (temporarily) so that the rest of the civgroup code works... // if we are attacking a boxer we should set them to neutral (temporarily) so that the rest of the civgroup code works...
if ( (pTarget->bTeam == CIV_TEAM) && (pTarget->flags.uiStatusFlags & SOLDIER_BOXER) ) if ( (pTarget->bTeam == CIV_TEAM) && BOXER(pTarget) )
{ {
SetSoldierNeutral( pTarget ); SetSoldierNeutral( pTarget );
} }
@@ -9481,7 +9481,7 @@ BOOLEAN ProcessImplicationsOfPCAttack( SOLDIERTYPE * pSoldier, SOLDIERTYPE ** pp
//TriggerNPCWithIHateYouQuote( pTarget->ubProfile ); //TriggerNPCWithIHateYouQuote( pTarget->ubProfile );
} }
} }
else if ( pTarget->ubCivilianGroup != NON_CIV_GROUP && !( pTarget->flags.uiStatusFlags & SOLDIER_BOXER ) ) else if ( pTarget->ubCivilianGroup != NON_CIV_GROUP && !BOXER(pTarget) )
{ {
// Firing at a civ in a civ group who isn't hostile... if anyone in that civ group can see this // Firing at a civ in a civ group who isn't hostile... if anyone in that civ group can see this
// going on they should become hostile. // going on they should become hostile.
@@ -10927,7 +10927,7 @@ void TurnCoatAttemptMessageBoxCallBack( UINT8 ubExitValue )
UINT8 approachchance = MercPtrs[gusSelectedSoldier]->GetTurncoatConvinctionChance( prisonerdialoguetargetID, approachselected ); UINT8 approachchance = MercPtrs[gusSelectedSoldier]->GetTurncoatConvinctionChance( prisonerdialoguetargetID, approachselected );
// you can never turn a VIP (though we don't tell the player if someone is a VIP, lest they have an exploit to find out) // you can never turn a VIP (though we don't tell the player if someone is a VIP, lest they have an exploit to find out)
if ( pSoldier->usSoldierFlagMask & SOLDIER_VIP ) if (ISVIP(pSoldier))
approachchance = 0; approachchance = 0;
// as using random numbers to pass the check would result in players savescumming, use a number based on the soldier's stats // as using random numbers to pass the check would result in players savescumming, use a number based on the soldier's stats
+1 -1
View File
@@ -4234,7 +4234,7 @@ BOOLEAN HandleSoldierDeath( SOLDIERTYPE *pSoldier , BOOLEAN *pfMadeCorpse )
} }
// Flugente: VIPs // Flugente: VIPs
if ( pSoldier->usSoldierFlagMask & SOLDIER_VIP ) if (ISVIP(pSoldier))
{ {
DeleteVIP( pSoldier->sSectorX, pSoldier->sSectorY ); DeleteVIP( pSoldier->sSectorX, pSoldier->sSectorY );
} }
+1 -1
View File
@@ -9847,7 +9847,7 @@ void SOLDIERTYPE::BeginSoldierGetup( void )
else else
{ {
this->bTurnsCollapsed++; this->bTurnsCollapsed++;
if ( (gTacticalStatus.bBoxingState == BOXING) && (this->flags.uiStatusFlags & SOLDIER_BOXER) ) if ( (gTacticalStatus.bBoxingState == BOXING) && (BOXER(this)) )
{ {
if ( this->bTurnsCollapsed > 1 ) if ( this->bTurnsCollapsed > 1 )
{ {
+2
View File
@@ -37,6 +37,8 @@
#define TANK( p ) (p->ubBodyType == TANK_NE || p->ubBodyType == TANK_NW ) #define TANK( p ) (p->ubBodyType == TANK_NE || p->ubBodyType == TANK_NW )
#define ENEMYROBOT( p ) (p->ubBodyType == ROBOTNOWEAPON && p->bTeam == ENEMY_TEAM) #define ENEMYROBOT( p ) (p->ubBodyType == ROBOTNOWEAPON && p->bTeam == ENEMY_TEAM)
#define ARMED_VEHICLE( p ) ( TANK( p ) || COMBAT_JEEP(p) ) #define ARMED_VEHICLE( p ) ( TANK( p ) || COMBAT_JEEP(p) )
#define BOXER( p ) ( p->flags.uiStatusFlags & SOLDIER_BOXER )
#define ISVIP( p ) ( p->usSoldierFlagMask & SOLDIER_VIP )
//#define OK_ENTERABLE_VEHICLE( p ) ( ( p->flags.uiStatusFlags & SOLDIER_VEHICLE ) && !TANK( p ) && p->stats.bLife >= OKLIFE ) //#define OK_ENTERABLE_VEHICLE( p ) ( ( p->flags.uiStatusFlags & SOLDIER_VEHICLE ) && !TANK( p ) && p->stats.bLife >= OKLIFE )
#define OK_ENTERABLE_VEHICLE( p ) ( ( p->flags.uiStatusFlags & SOLDIER_VEHICLE ) && (!ARMED_VEHICLE( p ) || !(p->flags.uiStatusFlags & SOLDIER_ENEMY) ) && p->stats.bLife >= OKLIFE ) #define OK_ENTERABLE_VEHICLE( p ) ( ( p->flags.uiStatusFlags & SOLDIER_VEHICLE ) && (!ARMED_VEHICLE( p ) || !(p->flags.uiStatusFlags & SOLDIER_ENEMY) ) && p->stats.bLife >= OKLIFE )
+6 -6
View File
@@ -4260,10 +4260,10 @@ BOOLEAN UseHandToHand( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, BOOLEAN fStea
// sevenfm: bonus for boxers for attack from the back // sevenfm: bonus for boxers for attack from the back
if (iHitChance < 100 && if (iHitChance < 100 &&
(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && BOXER(pSoldier) &&
!pSoldier->bBlindedCounter && !pSoldier->bBlindedCounter &&
gAnimControl[pTargetSoldier->usAnimState].ubEndHeight > ANIM_PRONE && gAnimControl[pTargetSoldier->usAnimState].ubEndHeight > ANIM_PRONE &&
(pTargetSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && BOXER(pTargetSoldier) &&
pTargetSoldier->usSoldierFlagMask2 & SOLDIER_BACK_ATTACK) pTargetSoldier->usSoldierFlagMask2 & SOLDIER_BACK_ATTACK)
{ {
iHitChance += (100 - iHitChance) / 2; iHitChance += (100 - iHitChance) / 2;
@@ -4879,7 +4879,7 @@ BOOLEAN UseHandToHand( SOLDIERTYPE *pSoldier, INT32 sTargetGridNo, BOOLEAN fStea
if (pTargetSoldier->bActionPoints > 0 && if (pTargetSoldier->bActionPoints > 0 &&
gGameOptions.fNewTraitSystem && gGameOptions.fNewTraitSystem &&
gTacticalStatus.bBoxingState == BOXING && gTacticalStatus.bBoxingState == BOXING &&
(pTargetSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && BOXER(pTargetSoldier) &&
Chance(ubCounterattackChance) && Chance(ubCounterattackChance) &&
IS_MERC_BODY_TYPE(pSoldier) && IS_MERC_BODY_TYPE(pSoldier) &&
IS_MERC_BODY_TYPE(pTargetSoldier) && IS_MERC_BODY_TYPE(pTargetSoldier) &&
@@ -9719,7 +9719,7 @@ UINT32 CalcChanceHTH( SOLDIERTYPE * pAttacker,SOLDIERTYPE *pDefender, INT16 ubAi
{ {
// Changed from DG by CJC to give higher chances of hitting with a stab or punch // Changed from DG by CJC to give higher chances of hitting with a stab or punch
// sevenfm: lowered chance for boxers // sevenfm: lowered chance for boxers
if (pAttacker->flags.uiStatusFlags & SOLDIER_BOXER) if (BOXER(pAttacker))
iChance = 50 + (iAttRating - iDefRating) / 3; iChance = 50 + (iAttRating - iDefRating) / 3;
else else
iChance = 67 + (iAttRating - iDefRating) / 3; iChance = 67 + (iAttRating - iDefRating) / 3;
@@ -9774,8 +9774,8 @@ UINT32 CalcChanceHTH( SOLDIERTYPE * pAttacker,SOLDIERTYPE *pDefender, INT16 ubAi
// sevenfm: bonus for boxers for attacking from the back // sevenfm: bonus for boxers for attacking from the back
if (ubMode == HTH_MODE_PUNCH && if (ubMode == HTH_MODE_PUNCH &&
(pAttacker->flags.uiStatusFlags & SOLDIER_BOXER) && BOXER(pAttacker) &&
(pDefender->flags.uiStatusFlags & SOLDIER_BOXER) && BOXER(pDefender) &&
iChance < 100 && iChance < 100 &&
!pAttacker->bBlindedCounter && !pAttacker->bBlindedCounter &&
gAnimControl[pDefender->usAnimState].ubEndHeight > ANIM_PRONE && gAnimControl[pDefender->usAnimState].ubEndHeight > ANIM_PRONE &&
+2 -1
View File
@@ -18,6 +18,7 @@
#include "opplist.h" #include "opplist.h"
#include "Interface.h" #include "Interface.h"
#include "Tactical Save.h" #include "Tactical Save.h"
#include <Soldier macros.h>
#define AI_LIST_SIZE TOTAL_SOLDIERS #define AI_LIST_SIZE TOTAL_SOLDIERS
@@ -180,7 +181,7 @@ BOOLEAN InsertIntoAIList( UINT8 ubID, INT8 bPriority )
BOOLEAN SatisfiesAIListConditions( SOLDIERTYPE * pSoldier, UINT8 * pubDoneCount, BOOLEAN fDoRandomChecks ) BOOLEAN SatisfiesAIListConditions( SOLDIERTYPE * pSoldier, UINT8 * pubDoneCount, BOOLEAN fDoRandomChecks )
{ {
if ( (gTacticalStatus.bBoxingState == BOXING) && !(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) ) if ( (gTacticalStatus.bBoxingState == BOXING) && !BOXER(pSoldier) )
{ {
return( FALSE ); return( FALSE );
} }
+5 -5
View File
@@ -418,7 +418,7 @@ UINT16 DetermineMovementMode( SOLDIERTYPE * pSoldier, INT8 bAction )
if (IS_MERC_BODY_TYPE(pSoldier) && if (IS_MERC_BODY_TYPE(pSoldier) &&
pSoldier->aiData.bAlertStatus >= STATUS_YELLOW && pSoldier->aiData.bAlertStatus >= STATUS_YELLOW &&
!InWaterGasOrSmoke(pSoldier, pSoldier->sGridNo) && !InWaterGasOrSmoke(pSoldier, pSoldier->sGridNo) &&
!(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && !BOXER(pSoldier) &&
!TileIsOutOfBounds(sClosestThreat) && !TileIsOutOfBounds(sClosestThreat) &&
(pSoldier->bTeam == ENEMY_TEAM || pSoldier->bTeam == MILITIA_TEAM)) (pSoldier->bTeam == ENEMY_TEAM || pSoldier->bTeam == MILITIA_TEAM))
{ {
@@ -1474,7 +1474,7 @@ INT32 ClosestKnownOpponent(SOLDIERTYPE *pSoldier, INT32 * psGridNo, INT8 * pbLev
if (sClosestOpponent == NOWHERE || if (sClosestOpponent == NOWHERE ||
iRange < iClosestRange || iRange < iClosestRange ||
pClosestOpponent && !pClosestOpponent->IsZombie() && !(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && pClosestOpponent->stats.bLife < OKLIFE && pOpponent->stats.bLife >= OKLIFE) pClosestOpponent && !pClosestOpponent->IsZombie() && !BOXER(pSoldier) && pClosestOpponent->stats.bLife < OKLIFE && pOpponent->stats.bLife >= OKLIFE)
{ {
iClosestRange = iRange; iClosestRange = iRange;
sClosestOpponent = sGridNo; sClosestOpponent = sGridNo;
@@ -2670,7 +2670,7 @@ INT32 CalcManThreatValue( SOLDIERTYPE *pEnemy, INT32 sMyGrid, UINT8 ubReduceForC
} }
// in boxing mode, let only a boxer be considered a threat. // in boxing mode, let only a boxer be considered a threat.
if ( (gTacticalStatus.bBoxingState == BOXING) && !(pEnemy->flags.uiStatusFlags & SOLDIER_BOXER) ) if ( (gTacticalStatus.bBoxingState == BOXING) && !BOXER(pEnemy) )
{ {
iThreatValue = -999; iThreatValue = -999;
return( iThreatValue ); return( iThreatValue );
@@ -4803,7 +4803,7 @@ BOOLEAN ValidOpponent(SOLDIERTYPE* pSoldier, SOLDIERTYPE* pOpponent)
pSoldier->bSide == pOpponent->bSide || pSoldier->bSide == pOpponent->bSide ||
pSoldier->aiData.bAttitude == ATTACKSLAYONLY && pOpponent->ubProfile != SLAY || pSoldier->aiData.bAttitude == ATTACKSLAYONLY && pOpponent->ubProfile != SLAY ||
(pOpponent->ubWhatKindOfMercAmI == MERC_TYPE__VEHICLE && GetNumberInVehicle(pOpponent->bVehicleID) == 0) || (pOpponent->ubWhatKindOfMercAmI == MERC_TYPE__VEHICLE && GetNumberInVehicle(pOpponent->bVehicleID) == 0) ||
gTacticalStatus.bBoxingState == BOXING && (pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && !(pOpponent->flags.uiStatusFlags & SOLDIER_BOXER) || gTacticalStatus.bBoxingState == BOXING && BOXER(pSoldier) && !BOXER(pOpponent) ||
pOpponent->ubBodyType == CROW) pOpponent->ubBodyType == CROW)
{ {
return FALSE; return FALSE;
@@ -4913,7 +4913,7 @@ BOOLEAN SoldierAI(SOLDIERTYPE *pSoldier)
if (!IS_MERC_BODY_TYPE(pSoldier) || if (!IS_MERC_BODY_TYPE(pSoldier) ||
pSoldier->aiData.bNeutral || pSoldier->aiData.bNeutral ||
fCivilian || fCivilian ||
pSoldier->flags.uiStatusFlags & SOLDIER_BOXER || BOXER(pSoldier) ||
ARMED_VEHICLE(pSoldier) || ARMED_VEHICLE(pSoldier) ||
pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE || pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ||
AM_A_ROBOT(pSoldier) || AM_A_ROBOT(pSoldier) ||
+14 -17
View File
@@ -718,7 +718,7 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier)
if ( gTacticalStatus.bBoxingState != NOT_BOXING ) if ( gTacticalStatus.bBoxingState != NOT_BOXING )
{ {
if (pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) if (BOXER(pSoldier))
{ {
if ( gTacticalStatus.bBoxingState == PRE_BOXING ) if ( gTacticalStatus.bBoxingState == PRE_BOXING )
{ {
@@ -2707,7 +2707,7 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier)
!bInGas && !bInGas &&
pSoldier->CheckInitialAP() && pSoldier->CheckInitialAP() &&
!pSoldier->IsFlanking() && !pSoldier->IsFlanking() &&
!(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && !BOXER(pSoldier) &&
(CanNPCAttack(pSoldier) == TRUE)) (CanNPCAttack(pSoldier) == TRUE))
{ {
BestThrow.ubPossible = FALSE; // by default, assume Throwing isn't possible BestThrow.ubPossible = FALSE; // by default, assume Throwing isn't possible
@@ -5195,7 +5195,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier)
} }
INT8 bInWater, bInDeepWater, bInGas; INT8 bInWater, bInDeepWater, bInGas;
if ( pSoldier->flags.uiStatusFlags & SOLDIER_BOXER ) if (BOXER(pSoldier) )
{ {
if ( gTacticalStatus.bBoxingState == PRE_BOXING ) if ( gTacticalStatus.bBoxingState == PRE_BOXING )
{ {
@@ -5304,7 +5304,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier)
{ {
bCanAttack = FALSE; bCanAttack = FALSE;
} }
else if (pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) else if (BOXER(pSoldier))
{ {
bCanAttack = TRUE; bCanAttack = TRUE;
fTryPunching = TRUE; fTryPunching = TRUE;
@@ -5318,7 +5318,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier)
{ {
if (fCivilian) if (fCivilian)
{ {
if ( ( bCanAttack == NOSHOOT_NOWEAPON) && !(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && pSoldier->ubBodyType != COW && pSoldier->ubBodyType != CRIPPLECIV && !(pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE) ) if ( ( bCanAttack == NOSHOOT_NOWEAPON) && !BOXER(pSoldier) && pSoldier->ubBodyType != COW && pSoldier->ubBodyType != CRIPPLECIV && !(pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE) )
{ {
// cower in fear!! // cower in fear!!
if ( pSoldier->flags.uiStatusFlags & SOLDIER_COWERING ) if ( pSoldier->flags.uiStatusFlags & SOLDIER_COWERING )
@@ -5806,7 +5806,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier)
if (BestStab.ubPossible) if (BestStab.ubPossible)
{ {
if (!(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER)) if (!BOXER(pSoldier))
{ {
// if we have not enough APs to deal at least two or three punches, // if we have not enough APs to deal at least two or three punches,
// reduce the attack value as one punch ain't much // reduce the attack value as one punch ain't much
@@ -5903,7 +5903,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier)
// cautious boxer approach, reserve AP for two attacks (only if not attacking from the back) // cautious boxer approach, reserve AP for two attacks (only if not attacking from the back)
if (BestStab.ubPossible && if (BestStab.ubPossible &&
(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && BOXER(pSoldier) &&
SpacesAway(pSoldier->sGridNo, BestStab.sTarget) > 2 && SpacesAway(pSoldier->sGridNo, BestStab.sTarget) > 2 &&
BestStab.ubOpponent != NOBODY && BestStab.ubOpponent != NOBODY &&
MercPtrs[BestStab.ubOpponent] && MercPtrs[BestStab.ubOpponent] &&
@@ -5920,7 +5920,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier)
// try to avoid frontal attack // try to avoid frontal attack
if (BestStab.ubPossible && if (BestStab.ubPossible &&
(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) && BOXER(pSoldier) &&
SpacesAway(pSoldier->sGridNo, BestStab.sTarget) > 1 && SpacesAway(pSoldier->sGridNo, BestStab.sTarget) > 1 &&
BestStab.ubOpponent != NOBODY && BestStab.ubOpponent != NOBODY &&
MercPtrs[BestStab.ubOpponent] && MercPtrs[BestStab.ubOpponent] &&
@@ -6285,8 +6285,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier)
{ {
DebugAI(AI_MSG_TOPIC, pSoldier, String("[Allow taking cover]")); DebugAI(AI_MSG_TOPIC, pSoldier, String("[Allow taking cover]"));
// okay, really got to wonder about this... could taking cover be an option? // okay, really got to wonder about this... could taking cover be an option?
if (ubCanMove && pSoldier->aiData.bOrders != STATIONARY && !gfHiddenInterrupt && if (ubCanMove && pSoldier->aiData.bOrders != STATIONARY && !gfHiddenInterrupt && !BOXER(pSoldier) )
!(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) )
{ {
// make militia a bit more cautious // make militia a bit more cautious
// 3 (UINT16) CONVERSIONS HERE TO AVOID ERRORS. GOTTHARD 7/15/08 // 3 (UINT16) CONVERSIONS HERE TO AVOID ERRORS. GOTTHARD 7/15/08
@@ -6323,7 +6322,7 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier)
if ( (ubCanMove && !SkipCoverCheck && !gfHiddenInterrupt && if ( (ubCanMove && !SkipCoverCheck && !gfHiddenInterrupt &&
((ubBestAttackAction == AI_ACTION_NONE) || pSoldier->aiData.bLastAttackHit) && ((ubBestAttackAction == AI_ACTION_NONE) || pSoldier->aiData.bLastAttackHit) &&
(pSoldier->bTeam != gbPlayerNum || pSoldier->aiData.fAIFlags & AI_RTP_OPTION_CAN_SEEK_COVER) && (pSoldier->bTeam != gbPlayerNum || pSoldier->aiData.fAIFlags & AI_RTP_OPTION_CAN_SEEK_COVER) &&
!(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) ) !BOXER(pSoldier) )
|| fAllowCoverCheck ) || fAllowCoverCheck )
{ {
DebugAI(AI_MSG_TOPIC, pSoldier, String("[Find cover]")); DebugAI(AI_MSG_TOPIC, pSoldier, String("[Find cover]"));
@@ -7004,7 +7003,7 @@ L_NEWAIM:
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// BOXER CLOSE IN ON OPPONENT // BOXER CLOSE IN ON OPPONENT
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
if (pSoldier->flags.uiStatusFlags & SOLDIER_BOXER ) if (BOXER(pSoldier))
{ {
DebugAI(AI_MSG_TOPIC, pSoldier, String("[Make boxer close if possible]")); DebugAI(AI_MSG_TOPIC, pSoldier, String("[Make boxer close if possible]"));
@@ -10071,8 +10070,7 @@ INT8 ArmedVehicleDecideActionBlack( SOLDIERTYPE *pSoldier )
(RangeChangeDesire( pSoldier ) >= 4) ) (RangeChangeDesire( pSoldier ) >= 4) )
{ {
// okay, really got to wonder about this... could taking cover be an option? // okay, really got to wonder about this... could taking cover be an option?
if ( ubCanMove && pSoldier->aiData.bOrders != STATIONARY && !gfHiddenInterrupt && if ( ubCanMove && pSoldier->aiData.bOrders != STATIONARY && !gfHiddenInterrupt && !BOXER(pSoldier) )
!(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER) )
{ {
// make militia a bit more cautious // make militia a bit more cautious
// 3 (UINT16) CONVERSIONS HERE TO AVOID ERRORS. GOTTHARD 7/15/08 // 3 (UINT16) CONVERSIONS HERE TO AVOID ERRORS. GOTTHARD 7/15/08
@@ -10103,9 +10101,8 @@ INT8 ArmedVehicleDecideActionBlack( SOLDIERTYPE *pSoldier )
if ( (ubCanMove && !SkipCoverCheck && !gfHiddenInterrupt && if ( (ubCanMove && !SkipCoverCheck && !gfHiddenInterrupt &&
((ubBestAttackAction == AI_ACTION_NONE) || pSoldier->aiData.bLastAttackHit) && ((ubBestAttackAction == AI_ACTION_NONE) || pSoldier->aiData.bLastAttackHit) &&
(pSoldier->bTeam != gbPlayerNum || pSoldier->aiData.fAIFlags & AI_RTP_OPTION_CAN_SEEK_COVER) && (pSoldier->bTeam != gbPlayerNum || pSoldier->aiData.fAIFlags & AI_RTP_OPTION_CAN_SEEK_COVER) && !BOXER(pSoldier)) ||
!(pSoldier->flags.uiStatusFlags & SOLDIER_BOXER)) fAllowCoverCheck )
|| fAllowCoverCheck )
{ {
sBestCover = FindBestNearbyCover( pSoldier, pSoldier->aiData.bAIMorale, &iCoverPercentBetter ); sBestCover = FindBestNearbyCover( pSoldier, pSoldier->aiData.bAIMorale, &iCoverPercentBetter );
} }