From 2d005563a227ccbe92eb0a1034c97706a0a63c7f Mon Sep 17 00:00:00 2001 From: MaddMugsy Date: Sat, 3 Jun 2006 06:23:46 +0000 Subject: [PATCH] -continuation of last update git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@157 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/DisplayCover.cpp | 2 +- Tactical/Handle UI Plan.cpp | 2 +- Tactical/Handle UI.cpp | 4 +- Tactical/Points.cpp | 10 +- Tactical/Turn Based Input.cpp | 12 +++ Tactical/UI Cursors.cpp | 170 +++++++++++++++++++++++++++++----- Tactical/Weapons.cpp | 2 +- TileEngine/physics.cpp | 8 +- Utils/Text.h | 2 + Utils/_EnglishText.cpp | 4 + 10 files changed, 181 insertions(+), 35 deletions(-) diff --git a/Tactical/DisplayCover.cpp b/Tactical/DisplayCover.cpp index 685fdc17..059c9c6d 100644 --- a/Tactical/DisplayCover.cpp +++ b/Tactical/DisplayCover.cpp @@ -613,7 +613,7 @@ void DisplayRangeToTarget( SOLDIERTYPE *pSoldier, INT16 sTargetGridNo ) if( WeaponInHand( pSoldier ) ) { UINT32 uiHitChance; - uiHitChance = CalcChanceToHitGun( pSoldier, sTargetGridNo, (INT8)(pSoldier->bShownAimTime / 2), pSoldier->bAimShotLocation ); + uiHitChance = CalcChanceToHitGun( pSoldier, sTargetGridNo, (INT8)(pSoldier->bShownAimTime ), pSoldier->bAimShotLocation ); swprintf( zOutputString, zNewTacticalMessages[ TCTL_MSG__GUN_RANGE_AND_CTH ], Weapon[ pSoldier->inv[HANDPOS].usItem ].usRange / 10, uiHitChance ); diff --git a/Tactical/Handle UI Plan.cpp b/Tactical/Handle UI Plan.cpp index 576df640..4c8e4a8a 100644 --- a/Tactical/Handle UI Plan.cpp +++ b/Tactical/Handle UI Plan.cpp @@ -142,7 +142,7 @@ BOOLEAN AddUIPlan( UINT16 sGridNo, UINT8 ubPlanID ) } else if ( ubPlanID == UIPLAN_ACTION_FIRE ) { - sAPCost = CalcTotalAPsToAttack( gpUIPlannedSoldier, sGridNo, TRUE, (INT8)(gpUIPlannedSoldier->bShownAimTime /2) ); + sAPCost = CalcTotalAPsToAttack( gpUIPlannedSoldier, sGridNo, TRUE, (INT8)(gpUIPlannedSoldier->bShownAimTime ) ); // Get XY from Gridno ConvertGridNoToCenterCellXY( sGridNo, &sXPos, &sYPos ); diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp index 9e69eb28..e01dfb19 100644 --- a/Tactical/Handle UI.cpp +++ b/Tactical/Handle UI.cpp @@ -2390,7 +2390,7 @@ void UIHandleMercAttack( SOLDIERTYPE *pSoldier , SOLDIERTYPE *pTargetSoldier, UI } // Set aim time to one in UI - pSoldier->bAimTime = (pSoldier->bShownAimTime/2); + pSoldier->bAimTime = (pSoldier->bShownAimTime ); usItem = pSoldier->inv[ HANDPOS ].usItem; // ATE: Check if we are targeting an interactive tile, and adjust gridno accordingly... @@ -2893,7 +2893,7 @@ BOOLEAN SelectedMercCanAffordAttack( ) sTargetGridNo = usMapPos; } - sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, TRUE, (INT8)(pSoldier->bShownAimTime / 2) ); + sAPCost = CalcTotalAPsToAttack( pSoldier, sTargetGridNo, TRUE, (INT8)(pSoldier->bShownAimTime ) ); if ( EnoughPoints( pSoldier, sAPCost, 0, TRUE ) ) { diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index 152a333d..152a6e1d 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -885,12 +885,12 @@ UINT8 CalcAPsToBurst( INT8 bBaseActionPoints, OBJECTTYPE * pObj ) DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("CalcAPsToBurst: before bonus aps = %d, std bonus = %d, burst bonus = %d", aps,GetPercentAPReduction(pObj),GetPercentBurstFireAPReduction(pObj))); // Snap: do this a little differently: % reduction means // aps <- aps * ( 100 - red ) / 100 - aps = ( aps * ( 100 - GetPercentAPReduction(pObj) ) + 50 ) / 100; + aps = ( aps * ( 100 - GetPercentAPReduction(pObj) ) ) / 100; // Snap: moved this up to allow burst AP reduction up to 100% aps = __max( aps, ( Weapon[ pObj->usItem ].bBurstAP + 1 ) / 2 ); - aps = ( aps * ( 100 - GetPercentBurstFireAPReduction(pObj) ) + 50 ) / 100; + aps = ( aps * ( 100 - GetPercentBurstFireAPReduction(pObj) ) ) / 100; if ( aps < 0 ) aps = 0; else if ( aps > AP_MAXIMUM ) aps = AP_MAXIMUM; @@ -933,12 +933,12 @@ UINT8 CalcAPsToAutofire( INT8 bBaseActionPoints, OBJECTTYPE * pObj, UINT8 bDoAut //} DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("CalcAPsToAutoFire: before bonus aps = %d, std bonus = %d, auto bonus = %d", aps,GetPercentAPReduction(pObj),GetPercentAutofireAPReduction(pObj))); - aps = ( aps * ( 100 - GetPercentAPReduction(pObj) ) + 50 ) / 100; + aps = ( aps * ( 100 - GetPercentAPReduction(pObj) ) ) / 100; aps = __max( aps, ( autofireaps + 1 ) / 2 ); // Snap: extend the burst bonus to autofire as well? - aps = ( aps * ( 100 - GetPercentAutofireAPReduction(pObj) ) + 50 ) / 100; + aps = ( aps * ( 100 - GetPercentAutofireAPReduction(pObj) ) ) / 100; if ( aps < 0 ) aps = 0; else if ( aps > AP_MAXIMUM ) aps = AP_MAXIMUM; @@ -2033,7 +2033,7 @@ INT16 GetAPsToReadyWeapon( SOLDIERTYPE *pSoldier, UINT16 usAnimState ) if ( Item[ usItem ].usItemClass == IC_GUN ) { return ( Weapon[ usItem ].ubReadyTime - * ( 100 - GetPercentReadyTimeAPReduction(&pSoldier->inv[ HANDPOS ]) ) + 50 ) / 100; + * ( 100 - GetPercentReadyTimeAPReduction(&pSoldier->inv[ HANDPOS ]) ) ) / 100; } } diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index 46fbb5c8..20b6e706 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -2563,6 +2563,18 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_DROP_ALL_ON ] ); } break; + case 'q': + if ( gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE] ) + { + gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE] = FALSE; + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_GL_LOW_ANGLE ] ); + } + else + { + gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE] = TRUE; + ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, pMessageStrings[ MSG_GL_HIGH_ANGLE ] ); + } + break; case 'G': if ( gGameSettings.fOptions[TOPTION_GL_BURST_CURSOR] ) { diff --git a/Tactical/UI Cursors.cpp b/Tactical/UI Cursors.cpp index 1fcf553a..af3d0600 100644 --- a/Tactical/UI Cursors.cpp +++ b/Tactical/UI Cursors.cpp @@ -321,6 +321,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, UINT16 usMapPos, BOOLE BOOLEAN fMaxPointLimitHit = FALSE; UINT16 usInHand; + UINT8 maxAimLevels = AllowedAimingLevels(pSoldier); usInHand = pSoldier->inv[ HANDPOS ].usItem; @@ -390,7 +391,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, UINT16 usMapPos, BOOLE else gfUIAutofireBulletCount = FALSE; - gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, (INT8)(pSoldier->bShownAimTime / 2) ); + gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, (INT8)(pSoldier->bShownAimTime ) ); gfUIDisplayActionPoints = TRUE; gfUIDisplayActionPointsCenter = TRUE; @@ -398,7 +399,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, UINT16 usMapPos, BOOLE while(!EnoughPoints( pSoldier, gsCurrentActionPoints, 0 , FALSE ) && pSoldier->bDoAutofire > 1) //oops, we don't have enough points if we are in auto-fire try to decrease bulletcount { pSoldier->bDoAutofire--; - gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, (INT8)(pSoldier->bShownAimTime / 2) ); + gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, (INT8)(pSoldier->bShownAimTime ) ); } // If we don't have any points and we are at the first refine, do nothing but warn! @@ -410,11 +411,11 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, UINT16 usMapPos, BOOLE } else { - bFutureAim = (INT8)( pSoldier->bShownAimTime + 2 ); + bFutureAim = (INT8)( pSoldier->bShownAimTime + 1 ); - if ( bFutureAim <= REFINE_AIM_5 ) + if ( bFutureAim <= maxAimLevels ) { - sAPCosts = MinAPsToAttack( pSoldier, usMapPos, TRUE ) + ( bFutureAim / 2 ); + sAPCosts = MinAPsToAttack( pSoldier, usMapPos, TRUE ) + ( bFutureAim ); // Determine if we can afford! if ( !EnoughPoints( pSoldier, (INT16)sAPCosts, 0 , FALSE ) ) @@ -443,9 +444,9 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, UINT16 usMapPos, BOOLE { pSoldier->bShownAimTime++; - if ( pSoldier->bShownAimTime > REFINE_AIM_5 ) + if ( pSoldier->bShownAimTime > maxAimLevels ) { - pSoldier->bShownAimTime = REFINE_AIM_5; + pSoldier->bShownAimTime = maxAimLevels; } else { @@ -551,7 +552,7 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, UINT16 usMapPos, BOOLE if(gGameSettings.fOptions[ TOPTION_CTH_CURSOR ]) { UINT32 uiHitChance; - uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, (INT8)(pSoldier->bShownAimTime / 2), pSoldier->bAimShotLocation ); + uiHitChance = CalcChanceToHitGun( pSoldier, usMapPos, (INT8)(pSoldier->bShownAimTime ), pSoldier->bAimShotLocation ); gfUICtHBar = TRUE; gbCtH = (gbCtH+uiHitChance)/2; @@ -733,21 +734,144 @@ UINT8 HandleActivatedTargetCursor( SOLDIERTYPE *pSoldier, UINT16 usMapPos, BOOLE case REFINE_AIM_MID1: - usCursor = ACTION_TARGETAIM2_UICURSOR; + //usCursor = ACTION_TARGETAIM2_UICURSOR; + if ( Item[ usInHand ].usItemClass == IC_THROWING_KNIFE ) + { + if ( gfDisplayFullCountRing ) + { + usCursor = ACTION_THROWAIMYELLOW1_UICURSOR; + } + else if ( fEnoughPoints ) + { + usCursor = ACTION_THROWAIM2_UICURSOR; + } + else + { + usCursor = ACTION_THROWAIMCANT1_UICURSOR; + } + } + else + { + if ( gfDisplayFullCountRing ) + { + usCursor = ACTION_TARGETAIMYELLOW1_UICURSOR; + } + else if ( fEnoughPoints ) + { + usCursor = ACTION_TARGETAIM2_UICURSOR; + } + else + { + usCursor = ACTION_TARGETAIMCANT1_UICURSOR; + } + } break; case REFINE_AIM_MID2: - usCursor = ACTION_TARGETAIM4_UICURSOR; + //usCursor = ACTION_TARGETAIM4_UICURSOR; + if ( Item[ usInHand ].usItemClass == IC_THROWING_KNIFE ) + { + if ( gfDisplayFullCountRing ) + { + usCursor = ACTION_THROWAIMYELLOW3_UICURSOR; + } + else if ( fEnoughPoints ) + { + usCursor = ACTION_THROWAIM4_UICURSOR; + } + else + { + usCursor = ACTION_THROWAIMCANT3_UICURSOR; + } + } + else + { + if ( gfDisplayFullCountRing ) + { + usCursor = ACTION_TARGETAIMYELLOW3_UICURSOR; + } + else if ( fEnoughPoints ) + { + usCursor = ACTION_TARGETAIM4_UICURSOR; + } + else + { + usCursor = ACTION_TARGETAIMCANT3_UICURSOR; + } + } + break; case REFINE_AIM_MID3: - usCursor = ACTION_TARGETAIM6_UICURSOR; + //usCursor = ACTION_TARGETAIM6_UICURSOR; + + if ( Item[ usInHand ].usItemClass == IC_THROWING_KNIFE ) + { + if ( gfDisplayFullCountRing ) + { + usCursor = ACTION_THROWAIMYELLOW4_UICURSOR; + } + else if ( fEnoughPoints ) + { + usCursor = ACTION_THROWAIM6_UICURSOR; + } + else + { + usCursor = ACTION_THROWAIMCANT4_UICURSOR; + } + } + else + { + if ( gfDisplayFullCountRing ) + { + usCursor = ACTION_TARGETAIMYELLOW4_UICURSOR; + } + else if ( fEnoughPoints ) + { + usCursor = ACTION_TARGETAIM6_UICURSOR; + } + else + { + usCursor = ACTION_TARGETAIMCANT4_UICURSOR; + } + } + break; case REFINE_AIM_MID4: - usCursor = ACTION_TARGETAIM8_UICURSOR; + //usCursor = ACTION_TARGETAIM8_UICURSOR; + if ( Item[ usInHand ].usItemClass == IC_THROWING_KNIFE ) + { + if ( gfDisplayFullCountRing ) + { + usCursor = ACTION_THROWAIMFULL_UICURSOR; + } + else if ( fEnoughPoints ) + { + usCursor = ACTION_THROWAIM8_UICURSOR; + } + else + { + usCursor = ACTION_THROWAIMCANT5_UICURSOR; + } + } + else + { + if ( gfDisplayFullCountRing ) + { + usCursor = ACTION_TARGETAIMFULL_UICURSOR; + } + else if ( fEnoughPoints ) + { + usCursor = ACTION_TARGETAIM8_UICURSOR; + } + else + { + usCursor = ACTION_TARGETAIMCANT5_UICURSOR; + } + } break; } } @@ -829,7 +953,7 @@ UINT8 HandleNonActivatedTargetCursor( SOLDIERTYPE *pSoldier, UINT16 usMapPos , B { DetermineCursorBodyLocation( (UINT8)gusSelectedSoldier, fShowAPs, fRecalc ); - gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, (INT8)(pSoldier->bShownAimTime / 2) ); + gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, (INT8)(pSoldier->bShownAimTime ) ); gfUIDisplayActionPoints = TRUE; gfUIDisplayActionPointsCenter = TRUE; @@ -1180,7 +1304,7 @@ UINT8 HandleKnifeCursor( SOLDIERTYPE *pSoldier, UINT16 sGridNo, BOOLEAN fActivat // Calculate action points if ( gTacticalStatus.uiFlags & TURNBASED && (gTacticalStatus.uiFlags & INCOMBAT) ) { - gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, sGridNo, TRUE, (INT8)(pSoldier->bShownAimTime / 2) ); + gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, sGridNo, TRUE, (INT8)(pSoldier->bShownAimTime ) ); gfUIDisplayActionPoints = TRUE; gfUIDisplayActionPointsCenter = TRUE; @@ -1308,7 +1432,7 @@ UINT8 HandlePunchCursor( SOLDIERTYPE *pSoldier, UINT16 sGridNo, BOOLEAN fActivat // Calculate action points if ( gTacticalStatus.uiFlags & TURNBASED ) { - gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, sGridNo, TRUE, (INT8)(pSoldier->bShownAimTime / 2) ); + gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, sGridNo, TRUE, (INT8)(pSoldier->bShownAimTime ) ); gfUIDisplayActionPoints = TRUE; gfUIDisplayActionPointsCenter = TRUE; @@ -1487,7 +1611,7 @@ UINT8 HandleNonActivatedTossCursor( SOLDIERTYPE *pSoldier, UINT16 sGridNo, BOOLE { if ( ubItemCursor == TRAJECTORYCURS ) { - gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, sGridNo, TRUE, (INT8)(pSoldier->bShownAimTime / 2) ); + gsCurrentActionPoints = CalcTotalAPsToAttack( pSoldier, sGridNo, TRUE, (INT8)(pSoldier->bShownAimTime ) ); } else { @@ -1864,6 +1988,8 @@ void HandleRightClickAdjustCursor( SOLDIERTYPE *pSoldier, INT16 usMapPos ) ubCursor = GetActionModeCursor( pSoldier ); + UINT8 maxAimLevels = AllowedAimingLevels(pSoldier); + // 'snap' cursor to target tile.... if ( gfUIFullTargetFound ) { @@ -1949,19 +2075,19 @@ void HandleRightClickAdjustCursor( SOLDIERTYPE *pSoldier, INT16 usMapPos ) } } - bFutureAim = (INT8)( pSoldier->bShownAimTime + 2 ); + bFutureAim = (INT8)( pSoldier->bShownAimTime + 1 ); - if ( bFutureAim <= REFINE_AIM_5 ) + if ( bFutureAim <= maxAimLevels ) { - sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, (INT8)(bFutureAim / 2) ); + sAPCosts = CalcTotalAPsToAttack( pSoldier, usMapPos, TRUE, (INT8)(bFutureAim ) ); // Determine if we can afford! if ( EnoughPoints( pSoldier, sAPCosts, 0, FALSE ) ) { - pSoldier->bShownAimTime+= 2; - if ( pSoldier->bShownAimTime > REFINE_AIM_5 ) + pSoldier->bShownAimTime+= 1; + if ( pSoldier->bShownAimTime > maxAimLevels ) { - pSoldier->bShownAimTime = REFINE_AIM_5; + pSoldier->bShownAimTime = maxAimLevels; } } // Else - goto first level! diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 2db7b86e..61a34410 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -5535,7 +5535,7 @@ INT8 GetAPsToReload( OBJECTTYPE *pObj ) // DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("GetAPsToReload")); return ( Weapon[ pObj->usItem ].APsToReload * - ( 100 - GetPercentReloadTimeAPReduction(pObj) ) + 50 ) / 100; + ( 100 - GetPercentReloadTimeAPReduction(pObj) ) ) / 100; } diff --git a/TileEngine/physics.cpp b/TileEngine/physics.cpp index e006d5ed..58927bf1 100644 --- a/TileEngine/physics.cpp +++ b/TileEngine/physics.cpp @@ -42,7 +42,7 @@ #define INDOORS_START_ANGLE (FLOAT)( PI/30 ) //#define INDOORS_START_ANGLE (FLOAT)( 0 ) #define GLAUNCHER_START_ANGLE (FLOAT)( PI/8 ) -#define GLAUNCHER_HIGHER_LEVEL_START_ANGLE (FLOAT)( PI/6 ) +#define GLAUNCHER_HIGHER_LEVEL_START_ANGLE (FLOAT)( PI/6 ) #define GET_THROW_HEIGHT( l ) (INT16)( ( l * 256 ) ) //#define GET_SOLDIER_THROW_HEIGHT( l ) (INT16)( ( l * 256 ) + STANDING_HEIGHT ) @@ -1837,7 +1837,6 @@ DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("physics.cpp line 1750")); // OK, look at target level and decide angle to use... if ( ubLevel == 1 ) { - //dDegrees = GLAUNCHER_START_ANGLE; dDegrees = GLAUNCHER_HIGHER_LEVEL_START_ANGLE; } else @@ -1845,7 +1844,10 @@ DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("physics.cpp line 1750")); dDegrees = GLAUNCHER_START_ANGLE; } fGLauncher = TRUE; - sMinRange = MIN_MORTAR_RANGE; + sMinRange = MIN_MORTAR_RANGE/2; + + if (gGameSettings.fOptions[TOPTION_GL_HIGH_ANGLE]) + dDegrees *= 2; //fLauncher = TRUE; } diff --git a/Utils/Text.h b/Utils/Text.h index 723bb5f6..e203d414 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -249,6 +249,8 @@ enum MSG_GL_BURST_CURSOR_OFF, MSG_DROP_ALL_ON, MSG_DROP_ALL_OFF, + MSG_GL_LOW_ANGLE, + MSG_GL_HIGH_ANGLE, #ifdef JA2BETAVERSION MSG_END_TURN_AUTO_SAVE, #endif diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index e8fd63ee..1178203c 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -3414,6 +3414,7 @@ STR16 zOptionsToggleText[] = L"Show Chance to Hit on the cursor", L"GL Burst Uses Burst Cursor", L"Enemies Drop All Items", + L"High Angle Grenade Launching", }; //This is the help text associated with the above toggles. @@ -3482,6 +3483,7 @@ STR16 zOptionsScreenHelpText[] = L"When ON, the chance to hit is shown on the cursor.", L"GL Burst uses burst cursor.", L"Enemies drop all items on death.", + L"Grenade launchers fire grenades at more vertical angles.", }; @@ -3691,6 +3693,8 @@ STR16 pMessageStrings[] = L"Grenade Bursts - Using Trajectory Cursor (Spread fire disabled)", L"Drop All Enabled", L"Drop All Disabled", + L"Grenade Launchers - Fire at standard angles", + L"Grenade Launchers - Fire at high angles", #ifdef JA2BETAVERSION L"Successfully Saved the Game into the End Turn Auto Save slot.", #endif