mirror of
https://github.com/1dot13/source.git
synced 2026-08-05 14:00:23 +02:00
Merged New Inventory Project into main branch
git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@1871 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
+159
-155
@@ -2,7 +2,6 @@
|
||||
#include "Tactical All.h"
|
||||
#else
|
||||
#include "types.h"
|
||||
#include "soldier control.h"
|
||||
#include "overhead.h"
|
||||
#include "animation control.h"
|
||||
#include "points.h"
|
||||
@@ -51,6 +50,11 @@
|
||||
|
||||
#include "Reinforcement.h"
|
||||
|
||||
//forward declarations of common classes to eliminate includes
|
||||
class OBJECTTYPE;
|
||||
class SOLDIERTYPE;
|
||||
|
||||
|
||||
|
||||
extern INT8 STRAIGHT;
|
||||
//extern UINT8 gubSpeedUpAnimationFactor;
|
||||
@@ -70,7 +74,7 @@ void RecalculateSoldiersAniSpeed()
|
||||
// if this merc is inactive, at base, on assignment, dead, unconscious
|
||||
if (!pSoldier)
|
||||
{
|
||||
continue; // next merc
|
||||
continue; // next merc
|
||||
}
|
||||
|
||||
SetSoldierAniSpeed( pSoldier );
|
||||
@@ -140,7 +144,7 @@ BOOLEAN BloodcatsPresent( void )
|
||||
{
|
||||
pSoldier = MercPtrs[ iLoop ];
|
||||
|
||||
if ( pSoldier->bActive && pSoldier->bInSector && pSoldier->bLife > 0 && pSoldier->ubBodyType == BLOODCAT )
|
||||
if ( pSoldier->bActive && pSoldier->bInSector && pSoldier->stats.bLife > 0 && pSoldier->ubBodyType == BLOODCAT )
|
||||
{
|
||||
return( TRUE );
|
||||
}
|
||||
@@ -157,8 +161,8 @@ void StartPlayerTeamTurn( BOOLEAN fDoBattleSnd, BOOLEAN fEnteringCombatMode )
|
||||
// EV_S_BEGINTURN SBeginTurn;
|
||||
|
||||
// Start the turn of player charactors
|
||||
|
||||
//
|
||||
|
||||
//
|
||||
// PATCH 1.06:
|
||||
//
|
||||
// make sure set properly in gTacticalStatus:
|
||||
@@ -182,10 +186,10 @@ void StartPlayerTeamTurn( BOOLEAN fDoBattleSnd, BOOLEAN fEnteringCombatMode )
|
||||
// Check for victory conditions
|
||||
|
||||
// ATE: Commented out - looks like this message is called earlier for our team
|
||||
// look for all mercs on the same team,
|
||||
// look for all mercs on the same team,
|
||||
//for ( pSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gbPlayerNum ].bLastID; cnt++,pSoldier++)
|
||||
//{
|
||||
// if ( pSoldier->bActive && pSoldier->bLife > 0 )
|
||||
//{
|
||||
// if ( pSoldier->bActive && pSoldier->stats.bLife > 0 )
|
||||
// {
|
||||
// SBeginTurn.usSoldierID = (UINT16)cnt;
|
||||
// AddGameEvent( S_BEGINTURN, 0, &SBeginTurn );
|
||||
@@ -194,11 +198,11 @@ void StartPlayerTeamTurn( BOOLEAN fDoBattleSnd, BOOLEAN fEnteringCombatMode )
|
||||
|
||||
// Are we in combat already?
|
||||
if ( gTacticalStatus.uiFlags & INCOMBAT )
|
||||
{
|
||||
{
|
||||
if ( gusSelectedSoldier != NOBODY )
|
||||
{
|
||||
// Check if this guy is able to be selected....
|
||||
if ( MercPtrs[ gusSelectedSoldier ]->bLife < OKLIFE )
|
||||
if ( MercPtrs[ gusSelectedSoldier ]->stats.bLife < OKLIFE )
|
||||
{
|
||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("StartPlayerTeamTurn: SelectNextAvailSoldier"));
|
||||
SelectNextAvailSoldier( MercPtrs[ gusSelectedSoldier ] );
|
||||
@@ -216,7 +220,7 @@ void StartPlayerTeamTurn( BOOLEAN fDoBattleSnd, BOOLEAN fEnteringCombatMode )
|
||||
if ( fDoBattleSnd )
|
||||
{
|
||||
// Say ATTENTION SOUND...
|
||||
DoMercBattleSound( MercPtrs[ gusSelectedSoldier ], BATTLE_SOUND_ATTN1 );
|
||||
MercPtrs[ gusSelectedSoldier ]->DoMercBattleSound( BATTLE_SOUND_ATTN1 );
|
||||
}
|
||||
|
||||
if ( gsInterfaceLevel == 1 )
|
||||
@@ -245,9 +249,9 @@ void StartPlayerTeamTurn( BOOLEAN fDoBattleSnd, BOOLEAN fEnteringCombatMode )
|
||||
// Signal UI done enemy's turn
|
||||
guiPendingOverrideEvent = LU_ENDUILOCK;
|
||||
|
||||
// ATE: Reset killed on attack variable.. this is because sometimes timing is such
|
||||
/// that a baddie can die and still maintain it's attacker ID
|
||||
gTacticalStatus.fKilledEnemyOnAttack = FALSE;
|
||||
// ATE: Reset killed on attack variable.. this is because sometimes timing is such
|
||||
/// that a baddie can die and still maintain it's attacker ID
|
||||
gTacticalStatus.fKilledEnemyOnAttack = FALSE;
|
||||
|
||||
HandleTacticalUI( );
|
||||
}
|
||||
@@ -269,7 +273,7 @@ void FreezeInterfaceForEnemyTurn( void )
|
||||
{
|
||||
EndUIMessage( );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void EndTurn( UINT8 ubNextTeam )
|
||||
@@ -279,7 +283,7 @@ void EndTurn( UINT8 ubNextTeam )
|
||||
INT32 cnt;
|
||||
|
||||
//Check for enemy pooling (add enemies if there happens to be more than the max in the
|
||||
//current battle. If one or more slots have freed up, we can add them now.
|
||||
//current battle. If one or more slots have freed up, we can add them now.
|
||||
|
||||
EndDeadlockMsg( );
|
||||
|
||||
@@ -310,11 +314,11 @@ void EndTurn( UINT8 ubNextTeam )
|
||||
{
|
||||
if ( pSoldier->bActive )
|
||||
{
|
||||
pSoldier->bMoved = TRUE;
|
||||
pSoldier->aiData.bMoved = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
gTacticalStatus.ubCurrentTeam = ubNextTeam;
|
||||
gTacticalStatus.ubCurrentTeam = ubNextTeam;
|
||||
|
||||
BeginTeamTurn( gTacticalStatus.ubCurrentTeam );
|
||||
|
||||
@@ -341,10 +345,10 @@ void EndAITurn( void )
|
||||
{
|
||||
if ( pSoldier->bActive )
|
||||
{
|
||||
pSoldier->bMoved = TRUE;
|
||||
pSoldier->aiData.bMoved = TRUE;
|
||||
// record old life value... for creature AI; the human AI might
|
||||
// want to use this too at some point
|
||||
pSoldier->bOldLife = pSoldier->bLife;
|
||||
pSoldier->bOldLife = pSoldier->stats.bLife;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -374,11 +378,11 @@ void EndAllAITurns( void )
|
||||
{
|
||||
if ( pSoldier->bActive )
|
||||
{
|
||||
pSoldier->bMoved = TRUE;
|
||||
pSoldier->uiStatusFlags &= (~SOLDIER_UNDERAICONTROL);
|
||||
pSoldier->aiData.bMoved = TRUE;
|
||||
pSoldier->flags.uiStatusFlags &= (~SOLDIER_UNDERAICONTROL);
|
||||
// record old life value... for creature AI; the human AI might
|
||||
// want to use this too at some point
|
||||
pSoldier->bOldLife = pSoldier->bLife;
|
||||
pSoldier->bOldLife = pSoldier->stats.bLife;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -415,12 +419,12 @@ void BeginTeamTurn( UINT8 ubTeam )
|
||||
INT32 cnt;
|
||||
UINT8 ubID;
|
||||
SOLDIERTYPE *pSoldier;
|
||||
|
||||
|
||||
//rain
|
||||
if( !LightningEndOfTurn( ubTeam ) )return;
|
||||
//end rain
|
||||
|
||||
|
||||
|
||||
|
||||
while( 1 )
|
||||
{
|
||||
if ( ubTeam > LAST_TEAM )
|
||||
@@ -443,7 +447,7 @@ void BeginTeamTurn( UINT8 ubTeam )
|
||||
ubTeam++;
|
||||
gTacticalStatus.ubCurrentTeam++;
|
||||
// skip back to the top, as we are processing another team now.
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( gTacticalStatus.uiFlags & TURNBASED )
|
||||
@@ -455,11 +459,11 @@ void BeginTeamTurn( UINT8 ubTeam )
|
||||
|
||||
cnt = gTacticalStatus.Team[ ubTeam ].bFirstID;
|
||||
for ( pSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ ubTeam ].bLastID; cnt++,pSoldier++)
|
||||
{
|
||||
if ( pSoldier->bActive && pSoldier->bLife > 0)
|
||||
{
|
||||
if ( pSoldier->bActive && pSoldier->stats.bLife > 0)
|
||||
{
|
||||
// decay personal opplist, and refresh APs and BPs
|
||||
EVENT_BeginMercTurn( pSoldier, FALSE, 0 );
|
||||
pSoldier->EVENT_BeginMercTurn( FALSE, 0 );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -493,7 +497,7 @@ void BeginTeamTurn( UINT8 ubTeam )
|
||||
break;
|
||||
#endif
|
||||
|
||||
// Set First enemy merc to AI control
|
||||
// Set First enemy merc to AI control
|
||||
if ( BuildAIListForTeam( ubTeam ) )
|
||||
{
|
||||
|
||||
@@ -554,9 +558,9 @@ void DisplayHiddenInterrupt( SOLDIERTYPE * pSoldier )
|
||||
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"about to call AdjustNoAPToFinishMove");
|
||||
// Stop our guy....
|
||||
AdjustNoAPToFinishMove( MercPtrs[ LATEST_INTERRUPT_GUY ], TRUE );
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->AdjustNoAPToFinishMove( TRUE );
|
||||
// Stop him from going to prone position if doing a turn while prone
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->flags.bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"about to call AddTopMessage");
|
||||
// get rid of any old overlay message
|
||||
@@ -593,15 +597,15 @@ void DisplayHiddenTurnbased( SOLDIERTYPE * pActingSoldier )
|
||||
}
|
||||
|
||||
// Enter combat mode starting with this side's turn
|
||||
gTacticalStatus.ubCurrentTeam = pActingSoldier->bTeam;
|
||||
gTacticalStatus.ubCurrentTeam = pActingSoldier->bTeam;
|
||||
|
||||
CommonEnterCombatModeCode( );
|
||||
|
||||
//JA2Gold: use function to make sure flags turned off everywhere else
|
||||
//pActingSoldier->uiStatusFlags |= SOLDIER_UNDERAICONTROL;
|
||||
SetSoldierAsUnderAiControl( pActingSoldier );
|
||||
//pActingSoldier->flags.uiStatusFlags |= SOLDIER_UNDERAICONTROL;
|
||||
pActingSoldier->SetSoldierAsUnderAiControl( );
|
||||
DebugAI( String( "Giving AI control to %d", pActingSoldier->ubID ) );
|
||||
pActingSoldier->fTurnInProgress = TRUE;
|
||||
pActingSoldier->flags.fTurnInProgress = TRUE;
|
||||
gTacticalStatus.uiTimeSinceMercAIStart = GetJA2Clock();
|
||||
|
||||
if ( gTacticalStatus.ubTopMessageType != COMPUTER_TURN_MESSAGE)
|
||||
@@ -665,7 +669,7 @@ void StartInterrupt( void )
|
||||
// display everyone on int queue!
|
||||
for ( cnt = gubOutOfTurnPersons; cnt > 0; cnt-- )
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("STARTINT: Q position %d: %d", cnt, gubOutOfTurnOrder[ cnt ] ) );
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("STARTINT: Q position %d: %d", cnt, gubOutOfTurnOrder[ cnt ] ) );
|
||||
}
|
||||
|
||||
//DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: %d is now on top of the interrupt queue", ubFirstInterrupter ) );
|
||||
@@ -677,8 +681,8 @@ void StartInterrupt( void )
|
||||
{
|
||||
if ( pTempSoldier->bActive )
|
||||
{
|
||||
pTempSoldier->bMovedPriorToInterrupt = pTempSoldier->bMoved;
|
||||
pTempSoldier->bMoved = TRUE;
|
||||
pTempSoldier->bMovedPriorToInterrupt = pTempSoldier->aiData.bMoved;
|
||||
pTempSoldier->aiData.bMoved = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -692,7 +696,7 @@ void StartInterrupt( void )
|
||||
// build string for display of who gets interrupt
|
||||
while( 1 )
|
||||
{
|
||||
MercPtrs[ubInterrupter]->bMoved = FALSE;
|
||||
MercPtrs[ubInterrupter]->aiData.bMoved = FALSE;
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: popping %d off of the interrupt queue", ubInterrupter ) );
|
||||
|
||||
REMOVE_LATEST_INTERRUPT_GUY();
|
||||
@@ -717,7 +721,7 @@ void StartInterrupt( void )
|
||||
for ( iCounter = 0; iCounter < NUMBER_OF_SOLDIERS_PER_SQUAD; iCounter++ )
|
||||
{
|
||||
pTempSoldier = Squad[ iSquad ][ iCounter ];
|
||||
if ( pTempSoldier && pTempSoldier->bActive && pTempSoldier->bInSector && !pTempSoldier->bMoved )
|
||||
if ( pTempSoldier && pTempSoldier->bActive && pTempSoldier->bInSector && !pTempSoldier->aiData.bMoved )
|
||||
{
|
||||
// then this guy got an interrupt...
|
||||
ubInterrupters++;
|
||||
@@ -726,7 +730,7 @@ void StartInterrupt( void )
|
||||
// flush... display string, then clear it (we could have 20 names!)
|
||||
// add comma to end, we know we have another person after this...
|
||||
wcscat( sTemp, L", " );
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, sTemp );
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, sTemp );
|
||||
wcscpy( sTemp, L"" );
|
||||
ubInterrupters = 1;
|
||||
}
|
||||
@@ -740,7 +744,7 @@ void StartInterrupt( void )
|
||||
}
|
||||
}
|
||||
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, sTemp );
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, sTemp );
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: starting interrupt for %d", ubFirstInterrupter ) );
|
||||
// gusSelectedSoldier should become the topmost guy on the interrupt list
|
||||
@@ -748,7 +752,7 @@ void StartInterrupt( void )
|
||||
|
||||
// Remove deadlock message
|
||||
EndDeadlockMsg( );
|
||||
|
||||
|
||||
// Select guy....
|
||||
SelectSoldier( ubFirstInterrupter, TRUE, TRUE );
|
||||
|
||||
@@ -757,7 +761,7 @@ void StartInterrupt( void )
|
||||
|
||||
// Dirty panel interface!
|
||||
fInterfacePanelDirty = DIRTYLEVEL2;
|
||||
gTacticalStatus.ubCurrentTeam = pSoldier->bTeam;
|
||||
gTacticalStatus.ubCurrentTeam = pSoldier->bTeam;
|
||||
|
||||
// Signal UI done enemy's turn
|
||||
guiPendingOverrideEvent = LU_ENDUILOCK;
|
||||
@@ -773,7 +777,7 @@ void StartInterrupt( void )
|
||||
{
|
||||
if ( OK_INSECTOR_MERC( MercPtrs[ iCounter ] ) )
|
||||
{
|
||||
if ( MercPtrs[ iCounter ]->fCloseCall )
|
||||
if ( MercPtrs[ iCounter ]->flags.fCloseCall )
|
||||
{
|
||||
if ( MercPtrs[ iCounter ]->bNumHitsThisTurn == 0 && !(MercPtrs[ iCounter ]->usQuoteSaidExtFlags & SOLDIER_QUOTE_SAID_EXT_CLOSE_CALL) && Random( 3 ) == 0 )
|
||||
{
|
||||
@@ -781,7 +785,7 @@ void StartInterrupt( void )
|
||||
TacticalCharacterDialogue( MercPtrs[ iCounter ], QUOTE_CLOSE_CALL );
|
||||
MercPtrs[ iCounter ]->usQuoteSaidExtFlags |= SOLDIER_QUOTE_SAID_EXT_CLOSE_CALL;
|
||||
}
|
||||
MercPtrs[ iCounter ]->fCloseCall = FALSE;
|
||||
MercPtrs[ iCounter ]->flags.fCloseCall = FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -798,8 +802,8 @@ void StartInterrupt( void )
|
||||
{
|
||||
if ( pTempSoldier->bActive )
|
||||
{
|
||||
pTempSoldier->bMovedPriorToInterrupt = pTempSoldier->bMoved;
|
||||
pTempSoldier->bMoved = TRUE;
|
||||
pTempSoldier->bMovedPriorToInterrupt = pTempSoldier->aiData.bMoved;
|
||||
pTempSoldier->aiData.bMoved = TRUE;
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -807,7 +811,7 @@ void StartInterrupt( void )
|
||||
while( 1 )
|
||||
{
|
||||
|
||||
MercPtrs[ubInterrupter]->bMoved = FALSE;
|
||||
MercPtrs[ubInterrupter]->aiData.bMoved = FALSE;
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: popping %d off of the interrupt queue", ubInterrupter ) );
|
||||
|
||||
@@ -849,8 +853,8 @@ void StartInterrupt( void )
|
||||
}
|
||||
// otherwise it's the AI interrupting another AI team
|
||||
|
||||
gTacticalStatus.ubCurrentTeam = pSoldier->bTeam;
|
||||
|
||||
gTacticalStatus.ubCurrentTeam = pSoldier->bTeam;
|
||||
|
||||
#ifdef JA2BETAVERSION
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_TESTVERSION, L"Interrupt ( could be hidden )" );
|
||||
#endif
|
||||
@@ -861,8 +865,8 @@ void StartInterrupt( void )
|
||||
if ( !gfHiddenInterrupt )
|
||||
{
|
||||
// Stop this guy....
|
||||
AdjustNoAPToFinishMove( MercPtrs[ LATEST_INTERRUPT_GUY ], TRUE );
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->AdjustNoAPToFinishMove( TRUE );
|
||||
MercPtrs[ LATEST_INTERRUPT_GUY ]->flags.bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
}
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"StartInterrupt done");
|
||||
|
||||
@@ -881,7 +885,7 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
|
||||
for ( cnt = gubOutOfTurnPersons; cnt > 0; cnt-- )
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("ENDINT: Q position %d: %d", cnt, gubOutOfTurnOrder[ cnt ] ) );
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("ENDINT: Q position %d: %d", cnt, gubOutOfTurnOrder[ cnt ] ) );
|
||||
}
|
||||
|
||||
// ATE: OK, now if this all happended on one frame, we may not have to stop
|
||||
@@ -900,12 +904,12 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
cnt = gTacticalStatus.Team[ gTacticalStatus.ubCurrentTeam ].bFirstID;
|
||||
for ( pTempSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gTacticalStatus.ubCurrentTeam ].bLastID; cnt++,pTempSoldier++)
|
||||
{
|
||||
if ( pTempSoldier->bActive && pTempSoldier->bInSector && !pTempSoldier->bMoved && (pTempSoldier->bActionPoints == pTempSoldier->bIntStartAPs))
|
||||
if ( pTempSoldier->bActive && pTempSoldier->bInSector && !pTempSoldier->aiData.bMoved && (pTempSoldier->bActionPoints == pTempSoldier->aiData.bIntStartAPs))
|
||||
{
|
||||
ubMinAPsToAttack = MinAPsToAttack( pTempSoldier, pTempSoldier->sLastTarget, FALSE );
|
||||
if ( (ubMinAPsToAttack <= pTempSoldier->bActionPoints) && (ubMinAPsToAttack > 0) )
|
||||
{
|
||||
pTempSoldier->bPassedLastInterrupt = TRUE;
|
||||
pTempSoldier->aiData.bPassedLastInterrupt = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -933,22 +937,22 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
// AI guys only here...
|
||||
if ( pTempSoldier->bActionPoints == 0 )
|
||||
{
|
||||
pTempSoldier->bMoved = TRUE;
|
||||
pTempSoldier->aiData.bMoved = TRUE;
|
||||
}
|
||||
else if ( pTempSoldier->bTeam != gbPlayerNum && pTempSoldier->bNewSituation == IS_NEW_SITUATION )
|
||||
else if ( pTempSoldier->bTeam != gbPlayerNum && pTempSoldier->aiData.bNewSituation == IS_NEW_SITUATION )
|
||||
{
|
||||
pTempSoldier->bMoved = FALSE;
|
||||
pTempSoldier->aiData.bMoved = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
pTempSoldier->bMoved = pTempSoldier->bMovedPriorToInterrupt;
|
||||
}
|
||||
pTempSoldier->aiData.bMoved = pTempSoldier->bMovedPriorToInterrupt;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// change team
|
||||
gTacticalStatus.ubCurrentTeam = pSoldier->bTeam;
|
||||
gTacticalStatus.ubCurrentTeam = pSoldier->bTeam;
|
||||
// switch appropriate messages & flags
|
||||
if ( pSoldier->bTeam == OUR_TEAM)
|
||||
{
|
||||
@@ -960,7 +964,7 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
{
|
||||
if ( pTempSoldier->bActive )
|
||||
{
|
||||
pTempSoldier->bMoved = pTempSoldier->bMovedPriorToInterrupt;
|
||||
pTempSoldier->aiData.bMoved = pTempSoldier->bMovedPriorToInterrupt;
|
||||
}
|
||||
}
|
||||
*/
|
||||
@@ -968,7 +972,7 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
ClearIntList();
|
||||
|
||||
// Select soldier....
|
||||
if ( MercPtrs[ ubInterruptedSoldier ]->bLife < OKLIFE )
|
||||
if ( MercPtrs[ ubInterruptedSoldier ]->stats.bLife < OKLIFE )
|
||||
{
|
||||
DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("EndInterrupt: SelectNextAvailSoldier"));
|
||||
SelectNextAvailSoldier( MercPtrs[ ubInterruptedSoldier ] );
|
||||
@@ -984,14 +988,14 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
gfHiddenInterrupt = FALSE;
|
||||
|
||||
// If we can continue a move, do so!
|
||||
if ( MercPtrs[ gusSelectedSoldier ]->fNoAPToFinishMove && pSoldier->ubReasonCantFinishMove != REASON_STOPPED_SIGHT )
|
||||
if ( MercPtrs[ gusSelectedSoldier ]->flags.fNoAPToFinishMove && pSoldier->ubReasonCantFinishMove != REASON_STOPPED_SIGHT )
|
||||
{
|
||||
// Continue
|
||||
AdjustNoAPToFinishMove( MercPtrs[ gusSelectedSoldier ], FALSE );
|
||||
MercPtrs[ gusSelectedSoldier ]->AdjustNoAPToFinishMove( FALSE );
|
||||
|
||||
if ( MercPtrs[ gusSelectedSoldier ]->sGridNo != MercPtrs[ gusSelectedSoldier ]->sFinalDestination )
|
||||
if ( MercPtrs[ gusSelectedSoldier ]->sGridNo != MercPtrs[ gusSelectedSoldier ]->pathing.sFinalDestination )
|
||||
{
|
||||
EVENT_GetNewSoldierPath( MercPtrs[ gusSelectedSoldier ], MercPtrs[ gusSelectedSoldier ]->sFinalDestination, MercPtrs[ gusSelectedSoldier ]->usUIMovementMode );
|
||||
MercPtrs[ gusSelectedSoldier ]->EVENT_GetNewSoldierPath( MercPtrs[ gusSelectedSoldier ]->pathing.sFinalDestination, MercPtrs[ gusSelectedSoldier ]->usUIMovementMode );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1023,7 +1027,7 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
SlideTo( NOWHERE, gusSelectedSoldier, NOBODY ,SETLOCATOR);
|
||||
|
||||
// Say ATTENTION SOUND...
|
||||
DoMercBattleSound( MercPtrs[ gusSelectedSoldier ], BATTLE_SOUND_ATTN1 );
|
||||
MercPtrs[ gusSelectedSoldier ]->DoMercBattleSound( BATTLE_SOUND_ATTN1 );
|
||||
|
||||
if ( gsInterfaceLevel == 1 )
|
||||
{
|
||||
@@ -1053,15 +1057,15 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
|
||||
// Reset flags
|
||||
gfPlotNewMovement = TRUE;
|
||||
|
||||
|
||||
// restart AI with first available soldier
|
||||
fFound = FALSE;
|
||||
fFound = FALSE;
|
||||
|
||||
// rebuild list for this team if anyone on the team is still available
|
||||
cnt = gTacticalStatus.Team[ ENEMY_TEAM ].bFirstID;
|
||||
for ( pTempSoldier = MercPtrs[ cnt ]; cnt <= gTacticalStatus.Team[ gTacticalStatus.ubCurrentTeam ].bLastID; cnt++,pTempSoldier++)
|
||||
{
|
||||
if ( pTempSoldier->bActive && pTempSoldier->bInSector && pTempSoldier->bLife >= OKLIFE )
|
||||
{
|
||||
if ( pTempSoldier->bActive && pTempSoldier->bInSector && pTempSoldier->stats.bLife >= OKLIFE )
|
||||
{
|
||||
fFound = TRUE;
|
||||
break;
|
||||
@@ -1086,7 +1090,7 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred )
|
||||
if (cnt != NOBODY)
|
||||
{
|
||||
fFound = TRUE;
|
||||
StartNPCAI( MercPtrs[ cnt ] );
|
||||
StartNPCAI( MercPtrs[ cnt ] );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1192,7 +1196,7 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
return(FALSE);
|
||||
*/
|
||||
pOpponent = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// if interrupts have been disabled for any reason
|
||||
if (!InterruptsAllowed)
|
||||
@@ -1208,7 +1212,7 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
if (pSoldier->bTeam == gTacticalStatus.ubCurrentTeam )
|
||||
{
|
||||
// if this is a player's a merc or civilian
|
||||
if ((pSoldier->uiStatusFlags & SOLDIER_PC) || PTR_CIVILIAN)
|
||||
if ((pSoldier->flags.uiStatusFlags & SOLDIER_PC) || PTR_CIVILIAN)
|
||||
{
|
||||
// then they are not allowed to interrupt their own team
|
||||
return(FALSE);
|
||||
@@ -1216,12 +1220,12 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
else
|
||||
{
|
||||
// enemies, MAY interrupt each other, but NOT themselves!
|
||||
//if ( pSoldier->uiStatusFlags & SOLDIER_UNDERAICONTROL )
|
||||
//if ( pSoldier->flags.uiStatusFlags & SOLDIER_UNDERAICONTROL )
|
||||
//{
|
||||
return(FALSE);
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
// CJC, July 9 1998
|
||||
// NO ONE EVER interrupts his own team
|
||||
//return( FALSE );
|
||||
@@ -1240,7 +1244,7 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
}
|
||||
|
||||
// soldiers at less than OKLIFE can't perform any actions
|
||||
if (pSoldier->bLife < OKLIFE)
|
||||
if (pSoldier->stats.bLife < OKLIFE)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
@@ -1258,14 +1262,14 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
}
|
||||
|
||||
// soldiers gagging on gas are too busy about holding their cookies down...
|
||||
if ( pSoldier->uiStatusFlags & SOLDIER_GASSED )
|
||||
if ( pSoldier->flags.uiStatusFlags & SOLDIER_GASSED )
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
|
||||
// a soldier already engaged in a life & death battle is too busy doing his
|
||||
// best to survive to worry about "getting the jump" on additional threats
|
||||
if (pSoldier->bUnderFire)
|
||||
if (pSoldier->aiData.bUnderFire)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
@@ -1276,7 +1280,7 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
}
|
||||
|
||||
// don't allow neutral folks to get interrupts
|
||||
if (pSoldier->bNeutral)
|
||||
if (pSoldier->aiData.bNeutral)
|
||||
{
|
||||
return( FALSE );
|
||||
}
|
||||
@@ -1305,7 +1309,7 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
if (pSoldier->bSide == pOpponent->bSide)
|
||||
{
|
||||
// human/civilians on same side can't interrupt each other
|
||||
if ((pSoldier->uiStatusFlags & SOLDIER_PC) || PTR_CIVILIAN)
|
||||
if ((pSoldier->flags.uiStatusFlags & SOLDIER_PC) || PTR_CIVILIAN)
|
||||
{
|
||||
return(FALSE);
|
||||
}
|
||||
@@ -1332,7 +1336,7 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !(pOpponent->uiStatusFlags & SOLDIER_UNDERAICONTROL) && (pSoldier->bSide != pOpponent->bSide))
|
||||
if ( !(pOpponent->flags.uiStatusFlags & SOLDIER_UNDERAICONTROL) && (pSoldier->bSide != pOpponent->bSide))
|
||||
{
|
||||
return( FALSE );
|
||||
}
|
||||
@@ -1353,17 +1357,17 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
|
||||
|
||||
// if this is a "SEEING" interrupt
|
||||
if (pSoldier->bOppList[ubOpponentID] == SEEN_CURRENTLY)
|
||||
if (pSoldier->aiData.bOppList[ubOpponentID] == SEEN_CURRENTLY)
|
||||
{
|
||||
// if pSoldier already saw the opponent last "look" or at least this turn
|
||||
if ((bOldOppList == SEEN_CURRENTLY) || (bOldOppList == SEEN_THIS_TURN))
|
||||
{
|
||||
return(FALSE); // no interrupt is possible
|
||||
return(FALSE); // no interrupt is possible
|
||||
}
|
||||
|
||||
// if the soldier is behind him and not very close, forget it
|
||||
bDir = atan8( pSoldier->sX, pSoldier->sY, pOpponent->sX, pOpponent->sY );
|
||||
if ( gOppositeDirection[ pSoldier->bDesiredDirection ] == bDir )
|
||||
if ( gOppositeDirection[ pSoldier->pathing.bDesiredDirection ] == bDir )
|
||||
{
|
||||
// directly behind; allow interrupts only within # of tiles equal to level
|
||||
if ( PythSpacesAway( pSoldier->sGridNo, pOpponent->sGridNo ) > EffectiveExpLevel( pSoldier ) )
|
||||
@@ -1371,7 +1375,7 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
return( FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// if the soldier isn't currently crouching
|
||||
if (!PTR_CROUCHED)
|
||||
{
|
||||
@@ -1382,14 +1386,14 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
ubMinPtsNeeded = MinPtsToMove(pSoldier);
|
||||
}
|
||||
}
|
||||
else // this is a "HEARING" interrupt
|
||||
else // this is a "HEARING" interrupt
|
||||
{
|
||||
// if the opponent can't see the "interrupter" either, OR
|
||||
// if the "interrupter" already has any opponents already in sight, OR
|
||||
// if the "interrupter" already heard the active soldier this turn
|
||||
if ((pOpponent->bOppList[pSoldier->ubID] != SEEN_CURRENTLY) || (pSoldier->bOppCnt > 0) || (bOldOppList == HEARD_THIS_TURN))
|
||||
if ((pOpponent->aiData.bOppList[pSoldier->ubID] != SEEN_CURRENTLY) || (pSoldier->aiData.bOppCnt > 0) || (bOldOppList == HEARD_THIS_TURN))
|
||||
{
|
||||
return(FALSE); // no interrupt is possible
|
||||
return(FALSE); // no interrupt is possible
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1402,7 +1406,7 @@ BOOLEAN StandardInterruptConditionsMet( SOLDIERTYPE * pSoldier, UINT8 ubOpponent
|
||||
}
|
||||
|
||||
// soldier passed on the chance to react during previous interrupt this turn
|
||||
if (pSoldier->bPassedLastInterrupt)
|
||||
if (pSoldier->aiData.bPassedLastInterrupt)
|
||||
{
|
||||
#ifdef RECORDNET
|
||||
fprintf(NetDebugFile,"\tStandardInterruptConditionsMet: FAILING because PassedLastInterrupt %d(%s)\n",
|
||||
@@ -1430,20 +1434,20 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"CalcInterruptDuelPts");
|
||||
|
||||
// extra check to make sure neutral folks never get interrupts
|
||||
if (pSoldier->bNeutral)
|
||||
if (pSoldier->aiData.bNeutral)
|
||||
{
|
||||
return( NO_INTERRUPT );
|
||||
}
|
||||
|
||||
// Old: BASE is one point for each experience level.
|
||||
// Snap: Agility should be a factor, since it is a measure of
|
||||
// a person's reactions. We'll give more weight to experience
|
||||
// a person's reactions. We'll give more weight to experience
|
||||
// though, since combat initiative is too important to be left up
|
||||
// to an ordinary skill like agility.
|
||||
// BASE = (2*lev + agi/10) / 3
|
||||
// Robot has interrupt points based on the controller...
|
||||
// Controller's interrupt points are reduced by 2 for being distracted...
|
||||
if ( pSoldier->uiStatusFlags & SOLDIER_ROBOT && CanRobotBeControlled( pSoldier ) )
|
||||
if ( pSoldier->flags.uiStatusFlags & SOLDIER_ROBOT && pSoldier->CanRobotBeControlled( ) )
|
||||
{
|
||||
//iPoints = EffectiveExpLevel( MercPtrs[ pSoldier->ubRobotRemoteHolderID ] ) - 2;
|
||||
// Snap: (do some proper rounding here)
|
||||
@@ -1465,7 +1469,7 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
}
|
||||
*/
|
||||
|
||||
if ( ControllingRobot( pSoldier ) )
|
||||
if ( pSoldier->ControllingRobot( ) )
|
||||
{
|
||||
iPoints -= 2;
|
||||
}
|
||||
@@ -1474,29 +1478,29 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
if (fUseWatchSpots)
|
||||
{
|
||||
// if this is a previously noted spot of enemies, give bonus points!
|
||||
iPoints += GetWatchedLocPoints( pSoldier->ubID, MercPtrs[ ubOpponentID ]->sGridNo, MercPtrs[ ubOpponentID ]->bLevel );
|
||||
iPoints += GetWatchedLocPoints( pSoldier->ubID, MercPtrs[ ubOpponentID ]->sGridNo, MercPtrs[ ubOpponentID ]->pathing.bLevel );
|
||||
}
|
||||
|
||||
// LOSE one point for each 2 additional opponents he currently sees, above 2
|
||||
if (pSoldier->bOppCnt > 2)
|
||||
if (pSoldier->aiData.bOppCnt > 2)
|
||||
{
|
||||
// subtract 1 here so there is a penalty of 1 for seeing 3 enemies
|
||||
iPoints -= (pSoldier->bOppCnt - 1) / 2;
|
||||
iPoints -= (pSoldier->aiData.bOppCnt - 1) / 2;
|
||||
}
|
||||
|
||||
// LOSE one point if he's trying to interrupt only by hearing
|
||||
if (pSoldier->bOppList[ubOpponentID] == HEARD_THIS_TURN)
|
||||
if (pSoldier->aiData.bOppList[ubOpponentID] == HEARD_THIS_TURN)
|
||||
{
|
||||
iPoints--;
|
||||
}
|
||||
|
||||
// if soldier is still in shock from recent injuries, that penalizes him
|
||||
iPoints -= pSoldier->bShock;
|
||||
iPoints -= pSoldier->aiData.bShock;
|
||||
|
||||
ubDistance = (UINT8) PythSpacesAway( pSoldier->sGridNo, MercPtrs[ ubOpponentID ]->sGridNo );
|
||||
|
||||
// if we are in combat mode - thus doing an interrupt rather than determine who gets first turn -
|
||||
// then give bonus
|
||||
// if we are in combat mode - thus doing an interrupt rather than determine who gets first turn -
|
||||
// then give bonus
|
||||
if ( (gTacticalStatus.uiFlags & INCOMBAT) && (pSoldier->bTeam != gTacticalStatus.ubCurrentTeam) )
|
||||
{
|
||||
// passive player gets penalty due to range
|
||||
@@ -1506,7 +1510,7 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
{
|
||||
// either non-combat or the player with the current turn... i.e. active...
|
||||
// unfortunately we can't use opplist here to record whether or not we saw this guy before, because at this point
|
||||
// the opplist has been updated to seen. But we can use gbSeenOpponents ...
|
||||
// the opplist has been updated to seen. But we can use gbSeenOpponents ...
|
||||
|
||||
// this soldier is moving, so give them a bonus for crawling or swatting at long distances
|
||||
if ( !gbSeenOpponents[ ubOpponentID ][ pSoldier->ubID ] )
|
||||
@@ -1536,7 +1540,7 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
|
||||
if ( HAS_SKILL_TRAIT( pSoldier, NIGHTOPS ) )
|
||||
{
|
||||
bLightLevel = LightTrueLevel(pSoldier->sGridNo, pSoldier->bLevel);
|
||||
bLightLevel = LightTrueLevel(pSoldier->sGridNo, pSoldier->pathing.bLevel);
|
||||
if (bLightLevel > NORMAL_LIGHTLEVEL_DAY + 3)
|
||||
{
|
||||
// it's dark, give a bonus for interrupts
|
||||
@@ -1547,8 +1551,8 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
// if he's a computer soldier
|
||||
|
||||
// CJC note: this will affect friendly AI as well...
|
||||
|
||||
if ( pSoldier->uiStatusFlags & SOLDIER_PC )
|
||||
|
||||
if ( pSoldier->flags.uiStatusFlags & SOLDIER_PC )
|
||||
{
|
||||
if ( pSoldier->bAssignment >= ON_DUTY )
|
||||
{
|
||||
@@ -1560,7 +1564,7 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
// check for TRUE because -1 means we JUST saw him (always so here)
|
||||
if (gbSeenOpponents[pSoldier->ubID][ubOpponentID] == TRUE)
|
||||
{
|
||||
iPoints++; // seen him before, easier to react to him
|
||||
iPoints++; // seen him before, easier to react to him
|
||||
}
|
||||
}
|
||||
else if ( pSoldier->bTeam == ENEMY_TEAM )
|
||||
@@ -1569,7 +1573,7 @@ INT8 CalcInterruptDuelPts( SOLDIERTYPE * pSoldier, UINT8 ubOpponentID, BOOLEAN f
|
||||
// check for TRUE because -1 means we JUST saw him (always so here)
|
||||
if (gbSeenOpponents[pSoldier->ubID][ubOpponentID] == TRUE)
|
||||
{
|
||||
iPoints++; // seen him before, easier to react to him
|
||||
iPoints++; // seen him before, easier to react to him
|
||||
}
|
||||
else if (gbPublicOpplist[pSoldier->bTeam][ubOpponentID] != NOT_HEARD_OR_SEEN)
|
||||
{
|
||||
@@ -1607,24 +1611,24 @@ BOOLEAN InterruptDuel( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pOpponent)
|
||||
BOOLEAN fResult = FALSE;
|
||||
|
||||
// if opponent can't currently see us and we can see them
|
||||
if ( pSoldier->bOppList[ pOpponent->ubID ] == SEEN_CURRENTLY && pOpponent->bOppList[pSoldier->ubID] != SEEN_CURRENTLY )
|
||||
if ( pSoldier->aiData.bOppList[ pOpponent->ubID ] == SEEN_CURRENTLY && pOpponent->aiData.bOppList[pSoldier->ubID] != SEEN_CURRENTLY )
|
||||
{
|
||||
fResult = TRUE; // we automatically interrupt
|
||||
fResult = TRUE; // we automatically interrupt
|
||||
// fix up our interrupt duel pts if necessary
|
||||
if (pSoldier->bInterruptDuelPts < pOpponent->bInterruptDuelPts)
|
||||
if (pSoldier->aiData.bInterruptDuelPts < pOpponent->aiData.bInterruptDuelPts)
|
||||
{
|
||||
pSoldier->bInterruptDuelPts = pOpponent->bInterruptDuelPts;
|
||||
pSoldier->aiData.bInterruptDuelPts = pOpponent->aiData.bInterruptDuelPts;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// If our total points is HIGHER, then we interrupt him anyway
|
||||
if (pSoldier->bInterruptDuelPts > pOpponent->bInterruptDuelPts)
|
||||
if (pSoldier->aiData.bInterruptDuelPts > pOpponent->aiData.bInterruptDuelPts)
|
||||
{
|
||||
fResult = TRUE;
|
||||
}
|
||||
}
|
||||
// ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt duel %d (%d pts) vs %d (%d pts)", pSoldier->ubID, pSoldier->bInterruptDuelPts, pOpponent->ubID, pOpponent->bInterruptDuelPts );
|
||||
// ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"Interrupt duel %d (%d pts) vs %d (%d pts)", pSoldier->ubID, pSoldier->aiData.bInterruptDuelPts, pOpponent->ubID, pOpponent->aiData.bInterruptDuelPts );
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"InterruptDuel done");
|
||||
return( fResult );
|
||||
}
|
||||
@@ -1679,7 +1683,7 @@ void AddToIntList( UINT8 ubID, BOOLEAN fGainControl, BOOLEAN fCommunicate )
|
||||
|
||||
// ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%d added to int list", ubID );
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: adding ID %d who %s", ubID, fGainControl ? "gains control" : "loses control" ) );
|
||||
|
||||
|
||||
// check whether 'who' is already anywhere on the queue after the first index
|
||||
// which we want to preserve so we can restore turn order
|
||||
for (ubLoop = 2; ubLoop <= gubOutOfTurnPersons; ubLoop++)
|
||||
@@ -1696,7 +1700,7 @@ void AddToIntList( UINT8 ubID, BOOLEAN fGainControl, BOOLEAN fCommunicate )
|
||||
{
|
||||
// GAINING control, so delete him from this slot (because later he'll
|
||||
// get added to the end and we don't want him listed more than once!)
|
||||
DeleteFromIntList( ubLoop, FALSE );
|
||||
DeleteFromIntList( ubLoop, FALSE );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1719,16 +1723,16 @@ void AddToIntList( UINT8 ubID, BOOLEAN fGainControl, BOOLEAN fCommunicate )
|
||||
{
|
||||
// record his initial APs at the start of his interrupt at this time
|
||||
// this is not the ideal place for this, but it's the best I could do...
|
||||
Menptr[ubID].bIntStartAPs = Menptr[ubID].bActionPoints;
|
||||
Menptr[ubID].aiData.bIntStartAPs = Menptr[ubID].bActionPoints;
|
||||
}
|
||||
else
|
||||
{
|
||||
gubLastInterruptedGuy = ubID;
|
||||
// turn off AI control flag if they lost control
|
||||
if (Menptr[ubID].uiStatusFlags & SOLDIER_UNDERAICONTROL)
|
||||
if (Menptr[ubID].flags.uiStatusFlags & SOLDIER_UNDERAICONTROL)
|
||||
{
|
||||
DebugAI( String( "Taking away AI control from %d", ubID ) );
|
||||
Menptr[ubID].uiStatusFlags &= (~SOLDIER_UNDERAICONTROL);
|
||||
Menptr[ubID].flags.uiStatusFlags &= (~SOLDIER_UNDERAICONTROL);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1767,10 +1771,10 @@ void VerifyOutOfTurnOrderArray()
|
||||
while( gubOutOfTurnOrder[ ubNextIndex ] != ubNextInArrayOnTeam )
|
||||
{
|
||||
// Pause them...
|
||||
AdjustNoAPToFinishMove( MercPtrs[ gubOutOfTurnOrder[ ubNextIndex ] ], TRUE );
|
||||
MercPtrs[ gubOutOfTurnOrder[ ubNextIndex ] ]->AdjustNoAPToFinishMove( TRUE );
|
||||
|
||||
// If they were turning from prone, stop them
|
||||
MercPtrs[ gubOutOfTurnOrder[ ubNextIndex ] ]->bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
MercPtrs[ gubOutOfTurnOrder[ ubNextIndex ] ]->flags.bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
|
||||
DeleteFromIntList( ubNextIndex, FALSE );
|
||||
}
|
||||
@@ -1799,11 +1803,11 @@ void VerifyOutOfTurnOrderArray()
|
||||
ubTeamHighest[ ubTeam ] = ubLoop;
|
||||
}
|
||||
|
||||
// Another potential problem: the player is interrupted by the enemy who is interrupted by
|
||||
// the militia. In this situation the enemy should just lose their interrupt.
|
||||
// Another potential problem: the player is interrupted by the enemy who is interrupted by
|
||||
// the militia. In this situation the enemy should just lose their interrupt.
|
||||
// (Or, the militia is interrupted by the enemy who is interrupted by the player.)
|
||||
|
||||
// Check for 3+ teams in the interrupt queue. If three exist then abort all interrupts (return
|
||||
|
||||
// Check for 3+ teams in the interrupt queue. If three exist then abort all interrupts (return
|
||||
// control to the first team)
|
||||
ubTeamsInList = 0;
|
||||
for ( ubLoop = 0; ubLoop < MAXTEAMS; ubLoop++ )
|
||||
@@ -1815,7 +1819,7 @@ void VerifyOutOfTurnOrderArray()
|
||||
}
|
||||
if ( ubTeamsInList >= 3 )
|
||||
{
|
||||
// This is bad. Loop through everyone but the first person in the INT list and remove 'em
|
||||
// This is bad. Loop through everyone but the first person in the INT list and remove 'em
|
||||
for (ubLoop = 2; ubLoop <= gubOutOfTurnPersons; )
|
||||
{
|
||||
if ( MercPtrs[ gubOutOfTurnOrder[ ubLoop ] ]->bTeam != MercPtrs[ gubOutOfTurnOrder[ 1 ] ]->bTeam )
|
||||
@@ -1823,10 +1827,10 @@ void VerifyOutOfTurnOrderArray()
|
||||
// remove!
|
||||
|
||||
// Pause them...
|
||||
AdjustNoAPToFinishMove( MercPtrs[ gubOutOfTurnOrder[ ubLoop ] ], TRUE );
|
||||
MercPtrs[ gubOutOfTurnOrder[ ubLoop ] ]->AdjustNoAPToFinishMove( TRUE );
|
||||
|
||||
// If they were turning from prone, stop them
|
||||
MercPtrs[ gubOutOfTurnOrder[ ubLoop ] ]->bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
MercPtrs[ gubOutOfTurnOrder[ ubLoop ] ]->flags.bTurningFromPronePosition = TURNING_FROM_PRONE_OFF;
|
||||
|
||||
DeleteFromIntList( ubLoop, FALSE );
|
||||
|
||||
@@ -1884,23 +1888,23 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
for ( ubOpp = gTacticalStatus.Team[ ubTeam ].bFirstID; ubOpp <= gTacticalStatus.Team[ ubTeam ].bLastID; ubOpp++)
|
||||
{
|
||||
pOpponent = MercPtrs[ubOpp];
|
||||
if ( pOpponent->bActive && pOpponent->bInSector && (pOpponent->bLife >= OKLIFE) && !(pOpponent->bCollapsed) )
|
||||
if ( pOpponent->bActive && pOpponent->bInSector && (pOpponent->stats.bLife >= OKLIFE) && !(pOpponent->bCollapsed) )
|
||||
{
|
||||
if ( ubInterruptType == NOISEINTERRUPT )
|
||||
{
|
||||
// don't grant noise interrupts at greater than max. visible distance
|
||||
// don't grant noise interrupts at greater than max. visible distance
|
||||
if ( PythSpacesAway( pSoldier->sGridNo, pOpponent->sGridNo ) > MaxNormalDistanceVisible() )
|
||||
{
|
||||
pOpponent->bInterruptDuelPts = NO_INTERRUPT;
|
||||
pOpponent->aiData.bInterruptDuelPts = NO_INTERRUPT;
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Resetting int pts for %d - NOISE BEYOND SIGHT DISTANCE!?", pOpponent->ubID ) );
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if ( pOpponent->bOppList[pSoldier->ubID] != SEEN_CURRENTLY )
|
||||
else if ( pOpponent->aiData.bOppList[pSoldier->ubID] != SEEN_CURRENTLY )
|
||||
{
|
||||
pOpponent->bInterruptDuelPts = NO_INTERRUPT;
|
||||
pOpponent->aiData.bInterruptDuelPts = NO_INTERRUPT;
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Resetting int pts for %d - DOESN'T SEE ON SIGHT INTERRUPT!?", pOpponent->ubID ) );
|
||||
|
||||
@@ -1908,7 +1912,7 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (pOpponent->bInterruptDuelPts)
|
||||
switch (pOpponent->aiData.bInterruptDuelPts)
|
||||
{
|
||||
case NO_INTERRUPT: // no interrupt possible, no duel necessary
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("ResolveInterruptsVs: No interrupt for opponent %d", pOpponent->ubID ) );
|
||||
@@ -1916,7 +1920,7 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
break;
|
||||
|
||||
case AUTOMATIC_INTERRUPT: // interrupts occurs automatically
|
||||
pSoldier->bInterruptDuelPts = 0; // just to have a valid intDiff later
|
||||
pSoldier->aiData.bInterruptDuelPts = 0; // just to have a valid intDiff later
|
||||
fIntOccurs = TRUE;
|
||||
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: automatic interrupt on %d by %d", pSoldier->ubID, pOpponent->ubID ) );
|
||||
@@ -1925,12 +1929,12 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
|
||||
default: // interrupt is possible, run a duel
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, "Calculating int duel pts for onlooker in ResolveInterruptsVs" );
|
||||
pSoldier->bInterruptDuelPts = CalcInterruptDuelPts(pSoldier,pOpponent->ubID,TRUE);
|
||||
pSoldier->aiData.bInterruptDuelPts = CalcInterruptDuelPts(pSoldier,pOpponent->ubID,TRUE);
|
||||
fIntOccurs = InterruptDuel(pOpponent,pSoldier);
|
||||
#ifdef DEBUG_INTERRUPTS
|
||||
if (fIntOccurs)
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: standard interrupt on %d (%d pts) by %d (%d pts)", pSoldier->ubID, pSoldier->bInterruptDuelPts, pOpponent->ubID, pOpponent->bInterruptDuelPts) );
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("INTERRUPT: standard interrupt on %d (%d pts) by %d (%d pts)", pSoldier->ubID, pSoldier->aiData.bInterruptDuelPts, pOpponent->ubID, pOpponent->aiData.bInterruptDuelPts) );
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -1943,7 +1947,7 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
ubIntList[ubIntCnt] = pOpponent->ubID;
|
||||
|
||||
// and by how much he beat us in the duel
|
||||
ubIntDiff[ubIntCnt] = pOpponent->bInterruptDuelPts - pSoldier->bInterruptDuelPts;
|
||||
ubIntDiff[ubIntCnt] = pOpponent->aiData.bInterruptDuelPts - pSoldier->aiData.bInterruptDuelPts;
|
||||
|
||||
// increment counter of interrupts lost
|
||||
ubIntCnt++;
|
||||
@@ -1951,30 +1955,30 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
else
|
||||
{
|
||||
/*
|
||||
if (pOpponent->bInterruptDuelPts != NO_INTERRUPT)
|
||||
if (pOpponent->aiData.bInterruptDuelPts != NO_INTERRUPT)
|
||||
{
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%d fails to interrupt %d (%d vs %d pts)", pOpponent->ubID, pSoldier->ubID, pOpponent->bInterruptDuelPts, pSoldier->bInterruptDuelPts);
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, L"%d fails to interrupt %d (%d vs %d pts)", pOpponent->ubID, pSoldier->ubID, pOpponent->aiData.bInterruptDuelPts, pSoldier->aiData.bInterruptDuelPts);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// either way, clear out both sides' bInterruptDuelPts field to prepare next one
|
||||
|
||||
if (pSoldier->bInterruptDuelPts != NO_INTERRUPT)
|
||||
if (pSoldier->aiData.bInterruptDuelPts != NO_INTERRUPT)
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Resetting int pts for %d", pSoldier->ubID ) );
|
||||
}
|
||||
|
||||
|
||||
pSoldier->bInterruptDuelPts = NO_INTERRUPT;
|
||||
pSoldier->aiData.bInterruptDuelPts = NO_INTERRUPT;
|
||||
|
||||
|
||||
if (pOpponent->bInterruptDuelPts != NO_INTERRUPT)
|
||||
if (pOpponent->aiData.bInterruptDuelPts != NO_INTERRUPT)
|
||||
{
|
||||
DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String("Resetting int pts for %d", pOpponent->ubID ) );
|
||||
}
|
||||
|
||||
pOpponent->bInterruptDuelPts = NO_INTERRUPT;
|
||||
pOpponent->aiData.bInterruptDuelPts = NO_INTERRUPT;
|
||||
|
||||
}
|
||||
|
||||
@@ -1985,22 +1989,22 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
// if any interrupts are scheduled to occur (ie. I lost at least once)
|
||||
if (ubIntCnt)
|
||||
{
|
||||
// First add currently active character to the interrupt queue. This is
|
||||
// First add currently active character to the interrupt queue. This is
|
||||
// USUALLY pSoldier->guynum, but NOT always, because one enemy can
|
||||
// "interrupt" on another enemy's turn if he hears another team's wound
|
||||
// victim's screaming... the guy screaming is pSoldier here, it's not his turn!
|
||||
// victim's screaming... the guy screaming is pSoldier here, it's not his turn!
|
||||
//AddToIntList( (UINT8) gusSelectedSoldier, FALSE, TRUE);
|
||||
|
||||
if ( (gTacticalStatus.ubCurrentTeam != pSoldier->bTeam) && !(gTacticalStatus.Team[ gTacticalStatus.ubCurrentTeam ].bHuman) )
|
||||
{
|
||||
// if anyone on this team is under AI control, remove
|
||||
// if anyone on this team is under AI control, remove
|
||||
// their AI control flag and put them on the queue instead of this guy
|
||||
for ( ubLoop = gTacticalStatus.Team[ gTacticalStatus.ubCurrentTeam ].bFirstID; ubLoop <= gTacticalStatus.Team[ gTacticalStatus.ubCurrentTeam ].bLastID; ubLoop++ )
|
||||
{
|
||||
if ( (MercPtrs[ ubLoop ]->uiStatusFlags & SOLDIER_UNDERAICONTROL) )
|
||||
if ( (MercPtrs[ ubLoop ]->flags.uiStatusFlags & SOLDIER_UNDERAICONTROL) )
|
||||
{
|
||||
// this guy lost control
|
||||
MercPtrs[ ubLoop ]->uiStatusFlags &= (~SOLDIER_UNDERAICONTROL);
|
||||
MercPtrs[ ubLoop ]->flags.uiStatusFlags &= (~SOLDIER_UNDERAICONTROL);
|
||||
AddToIntList( ubLoop, FALSE, TRUE);
|
||||
break;
|
||||
}
|
||||
@@ -2040,7 +2044,7 @@ void ResolveInterruptsVs( SOLDIERTYPE * pSoldier, UINT8 ubInterruptType)
|
||||
return;
|
||||
}
|
||||
|
||||
ubIntDiff[ubSmallestSlot] = NO_INTERRUPT; // mark slot as been handled
|
||||
ubIntDiff[ubSmallestSlot] = NO_INTERRUPT; // mark slot as been handled
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2126,7 +2130,7 @@ BOOLEAN NPCFirstDraw( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pTargetSoldier )
|
||||
DebugMsg (TOPIC_JA2,DBG_LEVEL_3,"NPCFirstDraw");
|
||||
// if attacking an NPC check to see who draws first!
|
||||
|
||||
if ( pTargetSoldier->ubProfile != NO_PROFILE && pTargetSoldier->ubProfile != SLAY && pTargetSoldier->bNeutral && pTargetSoldier->bOppList[ pSoldier->ubID ] == SEEN_CURRENTLY && ( FindAIUsableObjClass( pTargetSoldier, IC_WEAPON ) != NO_SLOT ) )
|
||||
if ( pTargetSoldier->ubProfile != NO_PROFILE && pTargetSoldier->ubProfile != SLAY && pTargetSoldier->aiData.bNeutral && pTargetSoldier->aiData.bOppList[ pSoldier->ubID ] == SEEN_CURRENTLY && ( FindAIUsableObjClass( pTargetSoldier, IC_WEAPON ) != NO_SLOT ) )
|
||||
{
|
||||
UINT8 ubLargerHalf, ubSmallerHalf, ubTargetLargerHalf, ubTargetSmallerHalf;
|
||||
|
||||
@@ -2135,7 +2139,7 @@ BOOLEAN NPCFirstDraw( SOLDIERTYPE * pSoldier, SOLDIERTYPE * pTargetSoldier )
|
||||
// if level 4, roll Random( 2 + 1 ) + 2 for result from 2 to 4
|
||||
ubSmallerHalf = EffectiveExpLevel( pSoldier ) / 2;
|
||||
ubLargerHalf = EffectiveExpLevel( pSoldier ) - ubSmallerHalf;
|
||||
|
||||
|
||||
ubTargetSmallerHalf = EffectiveExpLevel( pTargetSoldier ) / 2;
|
||||
ubTargetLargerHalf = EffectiveExpLevel( pTargetSoldier ) - ubTargetSmallerHalf;
|
||||
if ( gMercProfiles[ pTargetSoldier->ubProfile ].bApproached & gbFirstApproachFlags[ APPROACH_THREATEN - 1 ] )
|
||||
|
||||
Reference in New Issue
Block a user