From eff779a96689641bce0f134ebc367b8c453164bf Mon Sep 17 00:00:00 2001 From: Wanne Date: Wed, 18 Dec 2013 13:50:38 +0000 Subject: [PATCH] Improved Auto Fast Forward (by Sevenfm) - New options in ja2_options.ini AUTO_FAST_FORWARD_ENEMIES: 0 - default behavior 1 - auto fast forward only enemies that are not seen by player's team 2 - auto fast forward only invisible enemies 3 - auto fast forward all enemies AUTO_FAST_FORWARD_MILITIA: 0 - default behavior 1 - auto fast forward only militia that does not see enemies 2 - auto fast forward militia always Note: only movement is accelerated, most of specific actions like shooting and tossing grenades are performed at normal speed git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6693 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameSettings.cpp | 4 ++ GameSettings.h | 4 ++ TacticalAI/AIMain.cpp | 92 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+) diff --git a/GameSettings.cpp b/GameSettings.cpp index e9e77b6f4..65a0ce1f4 100644 --- a/GameSettings.cpp +++ b/GameSettings.cpp @@ -2126,6 +2126,10 @@ void LoadGameExternalOptions() 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.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); } diff --git a/GameSettings.h b/GameSettings.h index d72c6f696..3cec3b7b1 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -1251,6 +1251,10 @@ typedef struct // Frequency that the screen is updated FLOAT fClockSpeedPercent; + // sevenfm: improved auto fast forwarding + UINT8 ubAutoFastForwardEnemies; + UINT8 ubAutoFastForwardMilitia; + // Flugente: Weapon Overheating BOOLEAN fWeaponOverheating; // Should weapons overheat, thus increasing the chance of malfunction? BOOLEAN fDisplayOverheatThermometer; // Should a 'thermometer' for guns and replacable barrels be displayed? diff --git a/TacticalAI/AIMain.cpp b/TacticalAI/AIMain.cpp index 9a7354a43..d7c806e7f 100644 --- a/TacticalAI/AIMain.cpp +++ b/TacticalAI/AIMain.cpp @@ -73,6 +73,8 @@ extern void AdjustNoAPToFinishMove( SOLDIERTYPE *pSoldier, BOOLEAN fSet ); void TurnBasedHandleNPCAI(SOLDIERTYPE *pSoldier); void HandleAITacticalTraversal( SOLDIERTYPE * pSoldier ); +void UpdateFastForwardMode( SOLDIERTYPE* pSoldier ); + extern UINT8 gubElementsOnExplosionQueue; extern BOOLEAN gfWaitingForTriggerTimer; @@ -1321,6 +1323,7 @@ void TurnBasedHandleNPCAI(SOLDIERTYPE *pSoldier) return; } + if ((pSoldier->aiData.bAction != AI_ACTION_NONE) && pSoldier->aiData.bActionInProgress) { // if action should remain in progress @@ -1638,6 +1641,8 @@ INT8 ExecuteAction(SOLDIERTYPE *pSoldier) // relying on a stored path from there is a bad idea. pSoldier->pathing.usPathDataSize = pSoldier->pathing.usPathIndex = pSoldier->pathing.bPathStored = 0; + UpdateFastForwardMode( pSoldier ); + switch (pSoldier->aiData.bAction) { case AI_ACTION_NONE: // maintain current position & facing @@ -2593,3 +2598,90 @@ 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 + { + 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 ); +} +