From 7a163e8a3e9a5be3ddb800a30ea876aae3652bff Mon Sep 17 00:00:00 2001 From: Flugente Date: Tue, 21 Apr 2015 21:50:47 +0000 Subject: [PATCH] Simplified ImprovedAutoFastForward feature (allows to accelerate only invisible enemies) (by sevenfm) Now single option IMPROVED_AUTO_FAST_FORWARD=TRUE by default Removed options: AUTO_FAST_FORWARD_ENEMIES AUTO_FAST_FORWARD_MILITIA AUTO_FAST_FORWARD_CIVS AUTO_FAST_FORWARD_CREATURES ENEMY_CLOCK_SPEED_PERCENT Also a small fix (additional update of AutoFastForward status when soldier arrives at new gridno) git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7828 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 6 +- GameSettings.h | 6 +- Tactical/Overhead.cpp | 44 +++++++++++++++ Tactical/TeamTurns.cpp | 4 -- TacticalAI/AIMain.cpp | 122 +---------------------------------------- 5 files changed, 47 insertions(+), 135 deletions(-) diff --git a/GameSettings.cpp b/GameSettings.cpp index b1a3881b..8692b4e1 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -2218,14 +2218,10 @@ void LoadGameExternalOptions() gGameExternalOptions.iFastForwardKey = ParseKeyString(sFFKeyBuffer); gGameExternalOptions.iFastForwardPeriod = (FLOAT)iniReader.ReadDouble("Clock Settings","FAST_FORWARD_PERIOD", 500, 1, 10000); gGameExternalOptions.fClockSpeedPercent = (FLOAT)iniReader.ReadDouble("Clock Settings","CLOCK_SPEED_PERCENT", 150, 100, 300); - gGameExternalOptions.fEnemyClockSpeedPercent = (FLOAT)iniReader.ReadDouble("Clock Settings","ENEMY_CLOCK_SPEED_PERCENT", 150, 100, 300); gGameExternalOptions.iNotifyFrequency = iniReader.ReadInteger("Clock Settings","UPDATE_FREQUENCY", 16000, 1000, 20000); // sevenfm: improved auto fast forwarding - gGameExternalOptions.ubAutoFastForwardEnemies = iniReader.ReadInteger("Clock Settings","AUTO_FAST_FORWARD_ENEMIES", 0, 0, 3); - gGameExternalOptions.ubAutoFastForwardMilitia = iniReader.ReadInteger("Clock Settings", "AUTO_FAST_FORWARD_MILITIA", 0, 0, 2); - gGameExternalOptions.ubAutoFastForwardCivs = iniReader.ReadInteger("Clock Settings", "AUTO_FAST_FORWARD_CIVS", 0, 0, 2); - gGameExternalOptions.ubAutoFastForwardCreatures = iniReader.ReadInteger("Clock Settings", "AUTO_FAST_FORWARD_CREATURES", 0, 0, 2); + gGameExternalOptions.fImprovedAutoFastForward = iniReader.ReadBoolean("Clock Settings","IMPROVED_AUTO_FAST_FORWARD", TRUE); } diff --git a/GameSettings.h b/GameSettings.h index 2d3cdfbe..5044d189 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -1260,13 +1260,9 @@ typedef struct INT32 iNotifyFrequency; // Frequency that the screen is updated FLOAT fClockSpeedPercent; - FLOAT fEnemyClockSpeedPercent; // sevenfm: improved auto fast forwarding - UINT8 ubAutoFastForwardEnemies; - UINT8 ubAutoFastForwardMilitia; - UINT8 ubAutoFastForwardCivs; - UINT8 ubAutoFastForwardCreatures; + BOOLEAN fImprovedAutoFastForward; // Flugente: Weapon Overheating BOOLEAN fWeaponOverheating; // Should weapons overheat, thus increasing the chance of malfunction? diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index e35a98a5..7dc44fd0 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -152,6 +152,8 @@ class SOLDIERTYPE; extern void HandleBestSightingPositionInRealtime(); +void UpdateFastForwardMode( SOLDIERTYPE* pSoldier ); // sevenfm: to call in HandleAtNewGridNo + extern UINT8 gubAICounter; #include "fresh_header.h" @@ -2770,6 +2772,9 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving ) } } + // sevenfm: additional check for auto fast forwarding + UpdateFastForwardMode( pSoldier ); + // ATE: Put some stuff in here to not handle certain things if we are // trversing... if ( gubWaitingForAllMercsToExitCode == WAIT_FOR_MERCS_TO_WALKOFF_SCREEN || gubWaitingForAllMercsToExitCode == WAIT_FOR_MERCS_TO_WALK_TO_GRIDNO ) @@ -11077,6 +11082,45 @@ BOOLEAN GetRandomUnknownVIPSector( UINT16& aSector ) return FALSE; } +void UpdateFastForwardMode( SOLDIERTYPE* pSoldier ) +{ + BOOLEAN action = FALSE; + BOOLEAN forward = FALSE; + + if( gGameExternalOptions.fImprovedAutoFastForward == FALSE || + !gGameSettings.fOptions[TOPTION_AUTO_FAST_FORWARD_MODE] || + is_networked || + !( gTacticalStatus.uiFlags & TURNBASED && gTacticalStatus.uiFlags & INCOMBAT ) || + pSoldier->bTeam == OUR_TEAM ) + return; + + switch ( pSoldier->aiData.bAction ) + { + case AI_ACTION_TOSS_PROJECTILE: + case AI_ACTION_KNIFE_MOVE: + case AI_ACTION_FIRE_GUN: + case AI_ACTION_THROW_KNIFE: + case AI_ACTION_PULL_TRIGGER: + case AI_ACTION_USE_DETONATOR: + case AI_ACTION_OPEN_OR_CLOSE_DOOR: + case AI_ACTION_LOWER_GUN: + case AI_ACTION_RAISE_GUN: + case AI_ACTION_CLIMB_ROOF: + case AI_ACTION_STEAL_MOVE: + case AI_ACTION_JUMP_WINDOW: + case AI_ACTION_USE_SKILL: + action = TRUE; + break; + } + + // accelerate only invisible soldiers that are not doing specific actions like shooting + if( pSoldier->bVisible == -1 ) + forward = !action; + + if ( IsFastForwardMode() != forward ) + SetFastForwardMode( forward ); +} + void DeleteVIP( INT16 sMapX, INT16 sMapY ) { if ( StrategicMap[SECTOR( sMapX, sMapY )].usFlags & ENEMY_VIP_PRESENT_KNOWN ) diff --git a/Tactical/TeamTurns.cpp b/Tactical/TeamTurns.cpp index 62841b55..e8703b81 100644 --- a/Tactical/TeamTurns.cpp +++ b/Tactical/TeamTurns.cpp @@ -528,8 +528,6 @@ void BeginTeamTurn( UINT8 ubTeam ) SetFastForwardMode( (ubTeam != OUR_TEAM) ); } } - if( !is_networked && ubTeam != OUR_TEAM ) - SetClockSpeedPercent(gGameExternalOptions.fEnemyClockSpeedPercent); // sevenfm: set clock speed for enemy turn while( 1 ) { @@ -1487,8 +1485,6 @@ void EndInterrupt( BOOLEAN fMarkInterruptOccurred ) SetFastForwardMode( (gTacticalStatus.ubCurrentTeam != OUR_TEAM) ); } } - if( !is_networked && gTacticalStatus.ubCurrentTeam != OUR_TEAM ) - SetClockSpeedPercent(gGameExternalOptions.fEnemyClockSpeedPercent); // sevenfm: set clock speed for enemy turn } diff --git a/TacticalAI/AIMain.cpp b/TacticalAI/AIMain.cpp index 76be1e48..c27ef34f 100644 --- a/TacticalAI/AIMain.cpp +++ b/TacticalAI/AIMain.cpp @@ -73,7 +73,7 @@ extern void AdjustNoAPToFinishMove( SOLDIERTYPE *pSoldier, BOOLEAN fSet ); void TurnBasedHandleNPCAI(SOLDIERTYPE *pSoldier); void HandleAITacticalTraversal( SOLDIERTYPE * pSoldier ); -void UpdateFastForwardMode( SOLDIERTYPE* pSoldier ); +extern void UpdateFastForwardMode( SOLDIERTYPE* pSoldier ); extern UINT8 gubElementsOnExplosionQueue; @@ -2619,123 +2619,3 @@ void HandleAITacticalTraversal( SOLDIERTYPE * pSoldier ) } CheckForEndOfBattle( TRUE ); } - -void UpdateFastForwardMode( SOLDIERTYPE* pSoldier ) -{ - BOOLEAN action = FALSE; - BOOLEAN forward = FALSE; - BOOLEAN found = FALSE; - UINT16 cnt; - SOLDIERTYPE * ps; - - if( ( gGameExternalOptions.ubAutoFastForwardEnemies == 0 && gGameExternalOptions.ubAutoFastForwardMilitia == 0 ) || - !gGameSettings.fOptions[TOPTION_AUTO_FAST_FORWARD_MODE] || - is_networked || - !( gTacticalStatus.uiFlags & TURNBASED && gTacticalStatus.uiFlags & INCOMBAT ) || - pSoldier->bTeam == OUR_TEAM ) - return; - - switch ( pSoldier->aiData.bAction ) - { - case AI_ACTION_TOSS_PROJECTILE: - case AI_ACTION_KNIFE_MOVE: - case AI_ACTION_FIRE_GUN: - case AI_ACTION_THROW_KNIFE: - case AI_ACTION_PULL_TRIGGER: - case AI_ACTION_USE_DETONATOR: - case AI_ACTION_OPEN_OR_CLOSE_DOOR: - case AI_ACTION_LOWER_GUN: - case AI_ACTION_RAISE_GUN: - case AI_ACTION_CLIMB_ROOF: - case AI_ACTION_STEAL_MOVE: - case AI_ACTION_JUMP_WINDOW: - case AI_ACTION_USE_SKILL: - action = TRUE; - break; - } - - if ( pSoldier->bTeam == MILITIA_TEAM ) - { - switch( gGameExternalOptions.ubAutoFastForwardMilitia ) - { - case 0: // default mode - forward = gGameSettings.fOptions[TOPTION_AUTO_FAST_FORWARD_MODE]; - break; - case 1: // auto fast forward this militiaman if he does not see opponents - if( pSoldier->aiData.bOppCnt == 0 ) - forward = TRUE && !action; - break; - case 2: // auto fast forward all militia - forward = TRUE && !action; - break; - } - } - else if ( pSoldier->bTeam == CIV_TEAM ) - { - switch( gGameExternalOptions.ubAutoFastForwardCivs ) - { - case 0: // default mode - forward = gGameSettings.fOptions[TOPTION_AUTO_FAST_FORWARD_MODE]; - break; - case 1: // auto fast forward only invisible civs - if( pSoldier->bVisible == -1 ) - forward = TRUE && !action; - break; - case 2: // auto fast forward civs always - forward = TRUE && !action; - break; - } - } - else if ( pSoldier->bTeam == CREATURE_TEAM ) - { - switch( gGameExternalOptions.ubAutoFastForwardCreatures ) - { - case 0: // default mode - forward = gGameSettings.fOptions[TOPTION_AUTO_FAST_FORWARD_MODE]; - break; - case 1: // auto fast forward only invisible - if( pSoldier->bVisible == -1 ) - forward = TRUE && !action; - break; - case 2: // auto fast forward always - forward = TRUE && !action; - break; - } - } - else - { - switch ( gGameExternalOptions.ubAutoFastForwardEnemies ) - { - case 0: // default mode - forward = gGameSettings.fOptions[TOPTION_AUTO_FAST_FORWARD_MODE]; - break; - case 1: // auto fast forward enemy soldier only if player team does not see him - for ( cnt = gTacticalStatus.Team[ OUR_TEAM ].bFirstID; cnt <= gTacticalStatus.Team[ OUR_TEAM ].bLastID; cnt++ ) - { - ps = MercPtrs[ cnt ]; - found= FALSE; - if (ps->bActive && ps->bInSector && ps->stats.bLife >= OKLIFE) - { - if (ps->aiData.bOppList[ pSoldier->ubID ] == SEEN_CURRENTLY) - { - found= TRUE; - break; - } - } - } - forward = !found && !action; - break; - case 2: // auto fast forward only invisible enemies - if( pSoldier->bVisible == -1 ) - forward = TRUE && !action; - break; - case 3: // always auto fast forward movements - forward = TRUE && !action; - break; - } - } - - if ( IsFastForwardMode() != forward ) - SetFastForwardMode( forward ); -} -