Create function for decision to wear a gasmask

This commit is contained in:
Asdow
2023-08-18 23:56:40 +03:00
parent 06478266d0
commit a0cbe42a01
+27 -37
View File
@@ -46,6 +46,7 @@ extern UINT16 PickSoldierReadyAnimation( SOLDIERTYPE *pSoldier, BOOLEAN fEndRead
extern void IncrementWatchedLoc(UINT8 ubID, INT32 sGridNo, INT8 bLevel); extern void IncrementWatchedLoc(UINT8 ubID, INT32 sGridNo, INT8 bLevel);
void LogDecideInfo(SOLDIERTYPE *pSoldier); void LogDecideInfo(SOLDIERTYPE *pSoldier);
void LogKnowledgeInfo(SOLDIERTYPE *pSoldier); void LogKnowledgeInfo(SOLDIERTYPE *pSoldier);
INT8 DecideActionWearGasmask(SOLDIERTYPE* pSoldier);
// global status time counters to determine what takes the most time // global status time counters to determine what takes the most time
@@ -2450,7 +2451,6 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier)
INT32 sClosestDisturbance = NOWHERE, sCheckGridNo; INT32 sClosestDisturbance = NOWHERE, sCheckGridNo;
INT32 sDistVisible; INT32 sDistVisible;
UINT8 ubCanMove,ubOpponentDir; UINT8 ubCanMove,ubOpponentDir;
INT8 bInWater, bInDeepWater, bInGas;
INT8 bSeekPts = 0, bHelpPts = 0, bHidePts = 0, bWatchPts = 0; INT8 bSeekPts = 0, bHelpPts = 0, bHidePts = 0, bWatchPts = 0;
INT8 bHighestWatchLoc; INT8 bHighestWatchLoc;
ATTACKTYPE BestThrow, BestShot; ATTACKTYPE BestThrow, BestShot;
@@ -2577,29 +2577,13 @@ INT8 DecideActionRed(SOLDIERTYPE *pSoldier)
// determine if we happen to be in water (in which case we're in BIG trouble!) // determine if we happen to be in water (in which case we're in BIG trouble!)
bInWater = Water( pSoldier->sGridNo, pSoldier->pathing.bLevel ); INT8 bInWater = Water( pSoldier->sGridNo, pSoldier->pathing.bLevel );
bInDeepWater = DeepWater( pSoldier->sGridNo, pSoldier->pathing.bLevel ); INT8 bInDeepWater = DeepWater( pSoldier->sGridNo, pSoldier->pathing.bLevel );
// check if standing in tear gas without a gas mask on
bInGas = InGasOrSmoke( pSoldier, pSoldier->sGridNo );
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// WHEN LEFT IN GAS, WEAR GAS MASK IF AVAILABLE AND NOT WORN // WHEN LEFT IN GAS, WEAR GAS MASK IF AVAILABLE AND NOT WORN
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
INT8 bInGas = DecideActionWearGasmask(pSoldier);
if ( !bInGas && (gWorldSectorX == TIXA_SECTOR_X && gWorldSectorY == TIXA_SECTOR_Y) )
{
// only chance if we happen to be caught with our gas mask off
if ( PreRandom( 10 ) == 0 && WearGasMaskIfAvailable( pSoldier ) )
{
// reevaluate
bInGas = InGasOrSmoke( pSoldier, pSoldier->sGridNo );
}
}
//Only put mask on in gas
if(bInGas && WearGasMaskIfAvailable(pSoldier))//dnl ch40 200909
bInGas = InGasOrSmoke(pSoldier, pSoldier->sGridNo);
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// WHEN IN GAS, GO TO NEAREST REACHABLE SPOT OF UNGASSED LAND // WHEN IN GAS, GO TO NEAREST REACHABLE SPOT OF UNGASSED LAND
@@ -4878,7 +4862,6 @@ INT8 DecideActionBlack(SOLDIERTYPE *pSoldier)
INT32 sClosestDisturbance; INT32 sClosestDisturbance;
INT16 ubMinAPCost; INT16 ubMinAPCost;
UINT8 ubCanMove; UINT8 ubCanMove;
INT8 bInWater,bInDeepWater,bInGas;
INT8 bDirection; INT8 bDirection;
UINT8 ubBestAttackAction = AI_ACTION_NONE; UINT8 ubBestAttackAction = AI_ACTION_NONE;
INT8 bCanAttack,bActionReturned; INT8 bCanAttack,bActionReturned;
@@ -4998,6 +4981,7 @@ INT16 ubMinAPCost;
} }
} }
INT8 bInWater, bInDeepWater, bInGas;
if ( pSoldier->flags.uiStatusFlags & SOLDIER_BOXER ) if ( pSoldier->flags.uiStatusFlags & SOLDIER_BOXER )
{ {
if ( gTacticalStatus.bBoxingState == PRE_BOXING ) if ( gTacticalStatus.bBoxingState == PRE_BOXING )
@@ -5027,28 +5011,13 @@ INT16 ubMinAPCost;
bInWater = Water( pSoldier->sGridNo, pSoldier->pathing.bLevel ); bInWater = Water( pSoldier->sGridNo, pSoldier->pathing.bLevel );
bInDeepWater = WaterTooDeepForAttacks( pSoldier->sGridNo, pSoldier->pathing.bLevel ); bInDeepWater = WaterTooDeepForAttacks( pSoldier->sGridNo, pSoldier->pathing.bLevel );
// check if standing in tear gas without a gas mask on
bInGas = InGasOrSmoke( pSoldier, pSoldier->sGridNo );
// calculate our morale // calculate our morale
pSoldier->aiData.bAIMorale = CalcMorale(pSoldier); pSoldier->aiData.bAIMorale = CalcMorale(pSoldier);
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// WHEN LEFT IN GAS, WEAR GAS MASK IF AVAILABLE AND NOT WORN // WHEN LEFT IN GAS, WEAR GAS MASK IF AVAILABLE AND NOT WORN
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
bInGas = DecideActionWearGasmask(pSoldier);
if ( !bInGas && (gWorldSectorX == TIXA_SECTOR_X && gWorldSectorY == TIXA_SECTOR_Y) )
{
// only chance if we happen to be caught with our gas mask off
if ( PreRandom( 10 ) == 0 && WearGasMaskIfAvailable( pSoldier ) )
{
bInGas = FALSE;
}
}
//Only put mask on in gas
if(bInGas && WearGasMaskIfAvailable(pSoldier))//dnl ch40 200909
bInGas = InGasOrSmoke(pSoldier, pSoldier->sGridNo);
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
// IF GASSED, OR REALLY TIRED (ON THE VERGE OF COLLAPSING), TRY TO RUN AWAY // IF GASSED, OR REALLY TIRED (ON THE VERGE OF COLLAPSING), TRY TO RUN AWAY
@@ -10392,3 +10361,24 @@ void LogKnowledgeInfo(SOLDIERTYPE *pSoldier)
} }
} }
} }
INT8 DecideActionWearGasmask(SOLDIERTYPE *pSoldier)
{
// check if standing in tear gas without a gas mask on
INT8 bInGas = InGasOrSmoke(pSoldier, pSoldier->sGridNo);
if (!bInGas && (gWorldSectorX == TIXA_SECTOR_X && gWorldSectorY == TIXA_SECTOR_Y))
{
// only chance if we happen to be caught with our gas mask off
if (PreRandom(10) == 0 && WearGasMaskIfAvailable(pSoldier))
{
bInGas = FALSE;
}
}
//Only put mask on in gas
if (bInGas && WearGasMaskIfAvailable(pSoldier)) { bInGas = InGasOrSmoke(pSoldier, pSoldier->sGridNo); }
return bInGas;
}