From 8b494003fdca40b866a44e1c9bc12187e7452381 Mon Sep 17 00:00:00 2001 From: Wanne Date: Sun, 27 Apr 2014 16:16:14 +0000 Subject: [PATCH] New Feature: 2 new Iron Man game modes (by anv) - Selectable at campaign start under "Extra Difficulty" label - Soft Iron Man: No saving when in turn-based combat. Can save with enemies around (in sector) but only if still in real-time mode. - Extreme Iron Man: No saving, except punctually at midnight - save screen opens by itself, so Player won't accidentally miss saving time window. Besides Player's save, game will be auto-saved at midnight too if auto-saving is on. - New ja2_options.ini values for Extreme Iron Man setting: EXTREME_IRON_MAN_SAVING_TIME_NOTIFICATION, git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7167 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameInitOptionsScreen.cpp | 427 ++++++++++++++++++---- GameSettings.cpp | 19 +- GameSettings.h | 8 +- Strategic/Hourly Update.cpp | 96 +++-- Strategic/Map Screen Interface Bottom.cpp | 15 +- Strategic/mapscreen.cpp | 15 +- Tactical/Turn Based Input.cpp | 30 +- Utils/Text.h | 7 + Utils/_ChineseText.cpp | 7 + Utils/_DutchText.cpp | 7 + Utils/_EnglishText.cpp | 7 + Utils/_FrenchText.cpp | 7 + Utils/_GermanText.cpp | 7 + Utils/_ItalianText.cpp | 7 + Utils/_Ja25ChineseText.cpp | 2 + Utils/_Ja25DutchText.cpp | 2 + Utils/_Ja25DutchText.h | 2 + Utils/_Ja25EnglishText.cpp | 2 + Utils/_Ja25EnglishText.h | 2 + Utils/_Ja25FrenchText.cpp | 2 + Utils/_Ja25FrenchText.h | 2 + Utils/_Ja25GermanText.cpp | 2 + Utils/_Ja25GermanText.h | 2 + Utils/_Ja25ItalianText.cpp | 2 + Utils/_Ja25ItalianText.h | 2 + Utils/_Ja25PolishText.cpp | 4 +- Utils/_Ja25PolishText.h | 2 + Utils/_Ja25RussianText.cpp | 2 + Utils/_Ja25RussianText.h | 2 + Utils/_Ja25TaiwaneseText.cpp | 2 + Utils/_Ja25TaiwaneseText.h | 2 + Utils/_PolishText.cpp | 124 ++++--- Utils/_RussianText.cpp | 7 + Utils/_TaiwaneseText.cpp | 7 + 34 files changed, 654 insertions(+), 179 deletions(-) diff --git a/GameInitOptionsScreen.cpp b/GameInitOptionsScreen.cpp index 8957e455..efdbad02 100644 --- a/GameInitOptionsScreen.cpp +++ b/GameInitOptionsScreen.cpp @@ -119,16 +119,16 @@ #define GIO_GAME_SETTING_Y GIO_TRAITS_SETTING_Y + CHECK_Y_OFFSET + CORRECTION_Y_OFFSET #define GIO_GAME_SETTING_WIDTH CHECK_WIDTH -#define GIO_IRON_MAN_SETTING_X FIRST_COLUMN_X + CHECK_X_OFFSET -#define GIO_IRON_MAN_SETTING_Y GIO_GAME_SETTING_Y + CHECK_Y_OFFSET + CORRECTION_Y_OFFSET -#define GIO_IRON_MAN_SETTING_WIDTH CHECK_WIDTH +#define GIO_IRON_MAN_SETTING_X FIRST_COLUMN_X + COMBO_X_OFFSET//FIRST_COLUMN_X + CHECK_X_OFFSET +#define GIO_IRON_MAN_SETTING_Y GIO_GAME_SETTING_Y + COMBO_Y_OFFSET + CORRECTION_Y_OFFSET//GIO_GAME_SETTING_Y + CHECK_Y_OFFSET + CORRECTION_Y_OFFSET +#define GIO_IRON_MAN_SETTING_WIDTH COMBO_WIDTH//CHECK_WIDTH #define GIO_TIMED_TURN_SETTING_X FIRST_COLUMN_X + CHECK_X_OFFSET -#define GIO_TIMED_TURN_SETTING_Y GIO_IRON_MAN_SETTING_Y + CHECK_Y_OFFSET + CORRECTION_Y_OFFSET +#define GIO_TIMED_TURN_SETTING_Y GIO_IRON_MAN_SETTING_Y + CHECK_Y_OFFSET// + CORRECTION_Y_OFFSET #define GIO_TIMED_TURN_SETTING_WIDTH CHECK_WIDTH #define GIO_TERRORISTS_SETTING_X FIRST_COLUMN_X + CHECK_X_OFFSET -#define GIO_TERRORISTS_SETTING_Y GIO_IRON_MAN_SETTING_Y + CHECK_Y_OFFSET + CORRECTION_Y_OFFSET +#define GIO_TERRORISTS_SETTING_Y GIO_IRON_MAN_SETTING_Y + CHECK_Y_OFFSET// + CORRECTION_Y_OFFSET #define GIO_TERRORISTS_SETTING_WIDTH CHECK_WIDTH /********************************* @@ -331,6 +331,8 @@ enum { GIO_CAN_SAVE, GIO_IRON_MAN, + GIO_SOFT_IRON_MAN, + GIO_EXTREME_IRON_MAN, NUM_SAVE_OPTIONS, }; @@ -430,6 +432,7 @@ UINT32 guiGIOMainBackGroundImage; INT32 giGioMessageBox = -1; INT8 iCurrentDifficulty; +INT8 iCurrentExtraDifficultySetting; INT8 iCurrentBRQualitySetting; INT8 iCurrentBRQuantitySetting; INT8 iCurrentIMPNumberSetting; @@ -465,6 +468,11 @@ INT32 giGIOIMPNumberButtonImage[ 2 ]; void BtnGIOIMPNumberSelectionLeftCallback( GUI_BUTTON *btn,INT32 reason ); void BtnGIOIMPNumberSelectionRightCallback( GUI_BUTTON *btn,INT32 reason ); +UINT32 giGIOExtraDifficultySettingButton[ 2 ]; +INT32 giGIOExtraDifficultySettingButtonImage[ 2 ]; +void BtnGIOExtraDifficultySettingLeftCallback( GUI_BUTTON *btn,INT32 reason ); +void BtnGIOExtraDifficultySettingRightCallback( GUI_BUTTON *btn,INT32 reason ); + UINT32 giGIOBRQualitySettingButton[ 2 ]; INT32 giGIOBRQualitySettingButtonImage[ 2 ]; void BtnGIOBRQualitySettingLeftCallback( GUI_BUTTON *btn,INT32 reason ); @@ -927,31 +935,50 @@ BOOLEAN EnterGIOScreen() /////////////////////////////////////////////////////////////////////////////////////////////////////// // IRON MAN SETTING - guiGameSaveTogglesImage[ GIO_CAN_SAVE ] = UseLoadedButtonImage( guiTraitsOptionTogglesImage[ GIO_TRAITS_OLD ], -1,1,-1,3,-1 ); - guiGameSaveToggles[ GIO_CAN_SAVE ] = CreateIconAndTextButton( guiGameSaveTogglesImage[ GIO_CAN_SAVE ], gzGIOScreenText[ GIO_SAVE_ANYWHERE_TEXT ], GIO_TOGGLE_TEXT_FONT, - GIO_TOGGLE_TEXT_COLOR, NO_SHADOW, - GIO_TOGGLE_TEXT_COLOR, NO_SHADOW, - TEXT_CJUSTIFIED, - (GIO_IRON_MAN_SETTING_X), (GIO_IRON_MAN_SETTING_Y + 10), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, - DEFAULT_MOVE_CALLBACK, BtnGIOIronManOffCallback); + //guiGameSaveTogglesImage[ GIO_CAN_SAVE ] = UseLoadedButtonImage( guiTraitsOptionTogglesImage[ GIO_TRAITS_OLD ], -1,1,-1,3,-1 ); + //guiGameSaveToggles[ GIO_CAN_SAVE ] = CreateIconAndTextButton( guiGameSaveTogglesImage[ GIO_CAN_SAVE ], gzGIOScreenText[ GIO_SAVE_ANYWHERE_TEXT ], GIO_TOGGLE_TEXT_FONT, + // GIO_TOGGLE_TEXT_COLOR, NO_SHADOW, + // GIO_TOGGLE_TEXT_COLOR, NO_SHADOW, + // TEXT_CJUSTIFIED, + // (GIO_IRON_MAN_SETTING_X), (GIO_IRON_MAN_SETTING_Y + 10), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, + // DEFAULT_MOVE_CALLBACK, BtnGIOIronManOffCallback); - guiGameSaveTogglesImage[ GIO_IRON_MAN ] = UseLoadedButtonImage( guiTraitsOptionTogglesImage[ GIO_TRAITS_OLD ], -1,1,-1,3,-1 ); - guiGameSaveToggles[ GIO_IRON_MAN ] = CreateIconAndTextButton( guiGameSaveTogglesImage[ GIO_IRON_MAN ], gzGIOScreenText[ GIO_IRON_MAN_TEXT ], GIO_TOGGLE_TEXT_FONT, - GIO_TOGGLE_TEXT_COLOR, NO_SHADOW, - GIO_TOGGLE_TEXT_COLOR, NO_SHADOW, - TEXT_CJUSTIFIED, - (GIO_IRON_MAN_SETTING_X + 74), (GIO_IRON_MAN_SETTING_Y + 10), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, - DEFAULT_MOVE_CALLBACK, BtnGIOIronManOnCallback ); + //guiGameSaveTogglesImage[ GIO_IRON_MAN ] = UseLoadedButtonImage( guiTraitsOptionTogglesImage[ GIO_TRAITS_OLD ], -1,1,-1,3,-1 ); + //guiGameSaveToggles[ GIO_IRON_MAN ] = CreateIconAndTextButton( guiGameSaveTogglesImage[ GIO_IRON_MAN ], gzGIOScreenText[ GIO_IRON_MAN_TEXT ], GIO_TOGGLE_TEXT_FONT, + // GIO_TOGGLE_TEXT_COLOR, NO_SHADOW, + // GIO_TOGGLE_TEXT_COLOR, NO_SHADOW, + // TEXT_CJUSTIFIED, + // (GIO_IRON_MAN_SETTING_X + 74), (GIO_IRON_MAN_SETTING_Y + 10), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH, + // DEFAULT_MOVE_CALLBACK, BtnGIOIronManOnCallback ); - SpecifyButtonSoundScheme( guiGameSaveToggles[ GIO_CAN_SAVE ], BUTTON_SOUND_SCHEME_BIGSWITCH3 ); - SpecifyButtonSoundScheme( guiGameSaveToggles[ GIO_IRON_MAN ], BUTTON_SOUND_SCHEME_BIGSWITCH3 ); - MSYS_SetBtnUserData(guiGameSaveToggles[ GIO_CAN_SAVE ],0, 0 ); - MSYS_SetBtnUserData(guiGameSaveToggles[ GIO_IRON_MAN ],0, 1 ); + //SpecifyButtonSoundScheme( guiGameSaveToggles[ GIO_CAN_SAVE ], BUTTON_SOUND_SCHEME_BIGSWITCH3 ); + //SpecifyButtonSoundScheme( guiGameSaveToggles[ GIO_IRON_MAN ], BUTTON_SOUND_SCHEME_BIGSWITCH3 ); + //MSYS_SetBtnUserData(guiGameSaveToggles[ GIO_CAN_SAVE ],0, 0 ); + //MSYS_SetBtnUserData(guiGameSaveToggles[ GIO_IRON_MAN ],0, 1 ); - if( gGameOptions.fIronManMode ) - ButtonList[ guiGameSaveToggles[ GIO_IRON_MAN ] ]->uiFlags |= BUTTON_CLICKED_ON; - else - ButtonList[ guiGameSaveToggles[ GIO_CAN_SAVE ] ]->uiFlags |= BUTTON_CLICKED_ON; + //if( gGameOptions.fIronManMode ) + // ButtonList[ guiGameSaveToggles[ GIO_IRON_MAN ] ]->uiFlags |= BUTTON_CLICKED_ON; + //else + // ButtonList[ guiGameSaveToggles[ GIO_CAN_SAVE ] ]->uiFlags |= BUTTON_CLICKED_ON; + + giGIOExtraDifficultySettingButtonImage[ 0 ]= UseLoadedButtonImage( giGIODifficultyButtonImage[ 0 ], -1,0,-1,1,-1 ); + giGIOExtraDifficultySettingButtonImage[ 1 ]= UseLoadedButtonImage( giGIODifficultyButtonImage[ 1 ], -1,2,-1,3,-1 ); + + // left button - decrement Extra Difficulty + giGIOExtraDifficultySettingButton[ 0 ] = QuickCreateButton( giGIOExtraDifficultySettingButtonImage[ 0 ], GIO_IRON_MAN_SETTING_X + 39, GIO_IRON_MAN_SETTING_Y , + BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1, + BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnGIOExtraDifficultySettingLeftCallback ); + + // right button - increment Extra Difficulty + giGIOExtraDifficultySettingButton[ 1 ] = QuickCreateButton( giGIOExtraDifficultySettingButtonImage[ 1 ], GIO_IRON_MAN_SETTING_X + 158, GIO_IRON_MAN_SETTING_Y , + BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1, + BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnGIOExtraDifficultySettingRightCallback ); + + // set user data + MSYS_SetBtnUserData(giGIOExtraDifficultySettingButton[0],0, 0 ); + MSYS_SetBtnUserData(giGIOExtraDifficultySettingButton[1],0, 1 ); + + iCurrentExtraDifficultySetting = gGameOptions.ubIronManMode; /////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1433,6 +1460,94 @@ void BtnGIODifficultySelectionRightCallback( GUI_BUTTON *btn,INT32 reason ) } } +void BtnGIOExtraDifficultySettingLeftCallback( GUI_BUTTON *btn,INT32 reason ) +{ + if (!(btn->uiFlags & BUTTON_ENABLED)) + return; + + if( reason & MSYS_CALLBACK_REASON_LBUTTON_REPEAT ) + { + if ( iCurrentExtraDifficultySetting > 0 ) + { + PlayButtonSound( giGIOExtraDifficultySettingButton[0], BUTTON_SOUND_CLICKED_ON ); + + iCurrentExtraDifficultySetting--; + gfReRenderGIOScreen =TRUE; + } + else + { + PlayButtonSound( giGIOExtraDifficultySettingButton[0], BUTTON_SOUND_DISABLED_CLICK ); + } + } + else if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) + { + btn->uiFlags|=(BUTTON_CLICKED_ON); + + if ( iCurrentExtraDifficultySetting > 0 ) + { + PlayButtonSound( giGIOExtraDifficultySettingButton[0], BUTTON_SOUND_CLICKED_ON ); + + iCurrentExtraDifficultySetting--; + gfReRenderGIOScreen =TRUE; + } + else + { + PlayButtonSound( giGIOExtraDifficultySettingButton[0], BUTTON_SOUND_DISABLED_CLICK ); + } + } + else if( reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) + { + if (btn->uiFlags & BUTTON_CLICKED_ON) + { + btn->uiFlags&=~(BUTTON_CLICKED_ON); + } + } +} + +void BtnGIOExtraDifficultySettingRightCallback( GUI_BUTTON *btn,INT32 reason ) +{ + if (!(btn->uiFlags & BUTTON_ENABLED)) + return; + + if( reason & MSYS_CALLBACK_REASON_LBUTTON_REPEAT ) + { + if ( iCurrentExtraDifficultySetting < 3 ) + { + PlayButtonSound( giGIOExtraDifficultySettingButton[1], BUTTON_SOUND_CLICKED_ON ); + + iCurrentExtraDifficultySetting++; + gfReRenderGIOScreen =TRUE; + } + else + { + PlayButtonSound( giGIOExtraDifficultySettingButton[1], BUTTON_SOUND_DISABLED_CLICK ); + } + } + else if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) + { + btn->uiFlags|=(BUTTON_CLICKED_ON); + + if ( iCurrentExtraDifficultySetting < 3 ) + { + PlayButtonSound( giGIOExtraDifficultySettingButton[1], BUTTON_SOUND_CLICKED_ON ); + + iCurrentExtraDifficultySetting++; + gfReRenderGIOScreen =TRUE; + } + else + { + PlayButtonSound( giGIOExtraDifficultySettingButton[1], BUTTON_SOUND_DISABLED_CLICK ); + } + } + else if( reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) + { + if (btn->uiFlags & BUTTON_CLICKED_ON) + { + btn->uiFlags&=~(BUTTON_CLICKED_ON); + } + } +} + void BtnGIOBRQualitySettingLeftCallback( GUI_BUTTON *btn,INT32 reason ) { if (!(btn->uiFlags & BUTTON_ENABLED)) @@ -2391,11 +2506,15 @@ BOOLEAN ExitGIOScreen() } // Destroy Iron Man setting buttons - for( cnt=0; cntuiFlags |= BUTTON_CLICKED_ON; - else - ButtonList[ guiGameSaveToggles[ GIO_CAN_SAVE ] ]->uiFlags |= BUTTON_CLICKED_ON; + //if( gGameOptions.fIronManMode ) + // ButtonList[ guiGameSaveToggles[ GIO_IRON_MAN ] ]->uiFlags |= BUTTON_CLICKED_ON; + //else + // ButtonList[ guiGameSaveToggles[ GIO_CAN_SAVE ] ]->uiFlags |= BUTTON_CLICKED_ON; + + giGIOExtraDifficultySettingButtonImage[ 0 ]= UseLoadedButtonImage( giGIODifficultyButtonImage[ 0 ], -1,0,-1,1,-1 ); + giGIOExtraDifficultySettingButtonImage[ 1 ]= UseLoadedButtonImage( giGIODifficultyButtonImage[ 1 ], -1,2,-1,3,-1 ); + + // left button - decrement Extra Difficulty + giGIOExtraDifficultySettingButton[ 0 ] = QuickCreateButton( giGIOExtraDifficultySettingButtonImage[ 0 ], GIO_IRON_MAN_SETTING_X + 39, GIO_IRON_MAN_SETTING_Y , + BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1, + BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnGIOExtraDifficultySettingLeftCallback ); + + // right button - increment Extra Difficulty + giGIOExtraDifficultySettingButton[ 1 ] = QuickCreateButton( giGIOExtraDifficultySettingButtonImage[ 1 ], GIO_IRON_MAN_SETTING_X + 158, GIO_IRON_MAN_SETTING_Y , + BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1, + BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnGIOExtraDifficultySettingRightCallback ); + + // set user data + MSYS_SetBtnUserData(giGIOExtraDifficultySettingButton[0],0, 0 ); + MSYS_SetBtnUserData(giGIOExtraDifficultySettingButton[1],0, 1 ); + + iCurrentExtraDifficultySetting = gGameOptions.ubIronManMode; /////////////////////////////////////////////////////////////////////////////////////////////////////// // BOBBY RAY SETTING @@ -4382,6 +4550,94 @@ void BtnGIODifficultySelectionRightCallback( GUI_BUTTON *btn,INT32 reason ) } } +void BtnGIOExtraDifficultySettingLeftCallback( GUI_BUTTON *btn,INT32 reason ) +{ + if (!(btn->uiFlags & BUTTON_ENABLED)) + return; + + if( reason & MSYS_CALLBACK_REASON_LBUTTON_REPEAT ) + { + if ( iCurrentExtraDifficultySetting > 0 ) + { + PlayButtonSound( giGIOExtraDifficultySettingButton[0], BUTTON_SOUND_CLICKED_ON ); + + iCurrentExtraDifficultySetting--; + gfReRenderGIOScreen =TRUE; + } + else + { + PlayButtonSound( giGIOExtraDifficultySettingButton[0], BUTTON_SOUND_DISABLED_CLICK ); + } + } + else if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) + { + btn->uiFlags|=(BUTTON_CLICKED_ON); + + if ( iCurrentExtraDifficultySetting > 0 ) + { + PlayButtonSound( giGIOExtraDifficultySettingButton[0], BUTTON_SOUND_CLICKED_ON ); + + iCurrentExtraDifficultySetting--; + gfReRenderGIOScreen =TRUE; + } + else + { + PlayButtonSound( giGIOExtraDifficultySettingButton[0], BUTTON_SOUND_DISABLED_CLICK ); + } + } + else if( reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) + { + if (btn->uiFlags & BUTTON_CLICKED_ON) + { + btn->uiFlags&=~(BUTTON_CLICKED_ON); + } + } +} + +void BtnGIOExtraDifficultySettingRightCallback( GUI_BUTTON *btn,INT32 reason ) +{ + if (!(btn->uiFlags & BUTTON_ENABLED)) + return; + + if( reason & MSYS_CALLBACK_REASON_LBUTTON_REPEAT ) + { + if ( iCurrentExtraDifficultySetting < 3 ) + { + PlayButtonSound( giGIOExtraDifficultySettingButton[1], BUTTON_SOUND_CLICKED_ON ); + + iCurrentExtraDifficultySetting++; + gfReRenderGIOScreen =TRUE; + } + else + { + PlayButtonSound( giGIOExtraDifficultySettingButton[1], BUTTON_SOUND_DISABLED_CLICK ); + } + } + else if( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN ) + { + btn->uiFlags|=(BUTTON_CLICKED_ON); + + if ( iCurrentExtraDifficultySetting < 3 ) + { + PlayButtonSound( giGIOExtraDifficultySettingButton[1], BUTTON_SOUND_CLICKED_ON ); + + iCurrentExtraDifficultySetting++; + gfReRenderGIOScreen =TRUE; + } + else + { + PlayButtonSound( giGIOExtraDifficultySettingButton[1], BUTTON_SOUND_DISABLED_CLICK ); + } + } + else if( reason & MSYS_CALLBACK_REASON_LBUTTON_UP ) + { + if (btn->uiFlags & BUTTON_CLICKED_ON) + { + btn->uiFlags&=~(BUTTON_CLICKED_ON); + } + } +} + void BtnGIOBRQualitySettingLeftCallback( GUI_BUTTON *btn,INT32 reason ) { if (!(btn->uiFlags & BUTTON_ENABLED)) @@ -5307,11 +5563,15 @@ BOOLEAN ExitGIOScreen() } // Destroy Iron Man setting buttons - for( cnt=0; cnt 0 ) + NumEnemiesInAnySector( gWorldSectorX, gWorldSectorY, gbWorldSectorZ ) > 0 + && gGameOptions.ubIronManMode < 2 ) + { + //no save for you + return( FALSE ); + } + + if( gGameOptions.ubIronManMode == 3 && + ( GetWorldHour() != gGameExternalOptions.ubExtremeIronManSavingHour || + guiMin != 0 ) ) { //no save for you return( FALSE ); diff --git a/GameSettings.h b/GameSettings.h index 428d5083..0dfa65d3 100644 --- a/GameSettings.h +++ b/GameSettings.h @@ -238,9 +238,11 @@ typedef struct BOOLEAN fImprovedInterruptSystem; // ubFiller: From 498 to 497 BOOLEAN fBackGround; // ubFiller: From 497 to 496 BOOLEAN fFoodSystem; // ubFiler: From 496 to 495 + + UINT8 ubIronManMode; // ubFiler: From 495 to 494 // WANNE: Decrease this filler by 1, for each new UINT8 / BOOLEAN variable, so we can maintain savegame compatibility!! - UINT8 ubFiller[495]; + UINT8 ubFiller[494]; } GAME_OPTIONS; @@ -1439,6 +1441,10 @@ typedef struct BOOLEAN fHelicopterReturnToBaseIsNotFree; BOOLEAN fPaySkyriderInBase; + // anv: new iron man modes + UINT8 ubExtremeIronManSavingTimeNotification; + UINT8 ubExtremeIronManSavingHour; + } GAME_EXTERNAL_OPTIONS; typedef struct diff --git a/Strategic/Hourly Update.cpp b/Strategic/Hourly Update.cpp index fd8bc470..305e3495 100644 --- a/Strategic/Hourly Update.cpp +++ b/Strategic/Hourly Update.cpp @@ -35,6 +35,8 @@ // anv: for hourly heli repair #include "Vehicles.h" #include "Map Screen Helicopter.h" +// anv: transition to save screen in extreme iron man mode +#include "gameloop.h" void HourlyQuestUpdate(); void HourlyLarryUpdate(); @@ -157,81 +159,99 @@ CHAR16 zString[128]; { if ( AutoSaveToSlot[0] == TRUE ) { - if( CanGameBeSaved() ) + if( CanGameBeSaved() || ( gGameOptions.ubIronManMode == 3 && GetWorldHour() == gGameExternalOptions.ubExtremeIronManSavingHour ) ) { guiPreviousOptionScreen = guiCurrentScreen; swprintf( zString, L"%s%d",pMessageStrings[ MSG_SAVE_AUTOSAVE_TEXT ],SAVE__TIMED_AUTOSAVE_SLOT1); DoAutoSave(SAVE__TIMED_AUTOSAVE_SLOT1,zString); + + AutoSaveToSlot[0] = FALSE; + AutoSaveToSlot[1] = TRUE; + AutoSaveToSlot[2] = FALSE; + AutoSaveToSlot[3] = FALSE; + AutoSaveToSlot[4] = FALSE; } - - AutoSaveToSlot[0] = FALSE; - AutoSaveToSlot[1] = TRUE; - AutoSaveToSlot[2] = FALSE; - AutoSaveToSlot[3] = FALSE; - AutoSaveToSlot[4] = FALSE; } else if ( AutoSaveToSlot[1] == TRUE ) { - if( CanGameBeSaved() ) + if( CanGameBeSaved() || ( gGameOptions.ubIronManMode == 3 && GetWorldHour() == gGameExternalOptions.ubExtremeIronManSavingHour ) ) { guiPreviousOptionScreen = guiCurrentScreen; swprintf( zString, L"%s%d",pMessageStrings[ MSG_SAVE_AUTOSAVE_TEXT ],SAVE__TIMED_AUTOSAVE_SLOT2); DoAutoSave(SAVE__TIMED_AUTOSAVE_SLOT2,zString); - } - - AutoSaveToSlot[0] = FALSE; - AutoSaveToSlot[1] = FALSE; - AutoSaveToSlot[2] = TRUE; - AutoSaveToSlot[3] = FALSE; - AutoSaveToSlot[4] = FALSE; + + AutoSaveToSlot[0] = FALSE; + AutoSaveToSlot[1] = FALSE; + AutoSaveToSlot[2] = TRUE; + AutoSaveToSlot[3] = FALSE; + AutoSaveToSlot[4] = FALSE; + } } else if ( AutoSaveToSlot[2] == TRUE ) { - if( CanGameBeSaved() ) + if( CanGameBeSaved() || ( gGameOptions.ubIronManMode == 3 && GetWorldHour() == gGameExternalOptions.ubExtremeIronManSavingHour ) ) { guiPreviousOptionScreen = guiCurrentScreen; swprintf( zString, L"%s%d",pMessageStrings[ MSG_SAVE_AUTOSAVE_TEXT ],SAVE__TIMED_AUTOSAVE_SLOT3); DoAutoSave(SAVE__TIMED_AUTOSAVE_SLOT3,zString); + + AutoSaveToSlot[0] = FALSE; + AutoSaveToSlot[1] = FALSE; + AutoSaveToSlot[2] = FALSE; + AutoSaveToSlot[3] = TRUE; + AutoSaveToSlot[4] = FALSE; } - - AutoSaveToSlot[0] = FALSE; - AutoSaveToSlot[1] = FALSE; - AutoSaveToSlot[2] = FALSE; - AutoSaveToSlot[3] = TRUE; - AutoSaveToSlot[4] = FALSE; } else if ( AutoSaveToSlot[3] == TRUE ) { - if( CanGameBeSaved() ) + if( CanGameBeSaved() || ( gGameOptions.ubIronManMode == 3 && GetWorldHour() == gGameExternalOptions.ubExtremeIronManSavingHour ) ) { guiPreviousOptionScreen = guiCurrentScreen; swprintf( zString, L"%s%d",pMessageStrings[ MSG_SAVE_AUTOSAVE_TEXT ],SAVE__TIMED_AUTOSAVE_SLOT4); DoAutoSave(SAVE__TIMED_AUTOSAVE_SLOT4,zString); - } - AutoSaveToSlot[0] = FALSE; - AutoSaveToSlot[1] = FALSE; - AutoSaveToSlot[2] = FALSE; - AutoSaveToSlot[3] = FALSE; - AutoSaveToSlot[4] = TRUE; - + + AutoSaveToSlot[0] = FALSE; + AutoSaveToSlot[1] = FALSE; + AutoSaveToSlot[2] = FALSE; + AutoSaveToSlot[3] = FALSE; + AutoSaveToSlot[4] = TRUE; + } } else if ( AutoSaveToSlot[4] == TRUE ) { - if( CanGameBeSaved() ) + if( CanGameBeSaved() || ( gGameOptions.ubIronManMode == 3 && GetWorldHour() == gGameExternalOptions.ubExtremeIronManSavingHour ) ) { guiPreviousOptionScreen = guiCurrentScreen; swprintf( zString, L"%s%d",pMessageStrings[ MSG_SAVE_AUTOSAVE_TEXT ],SAVE__TIMED_AUTOSAVE_SLOT5); DoAutoSave(SAVE__TIMED_AUTOSAVE_SLOT5,zString); - } - AutoSaveToSlot[0] = TRUE; - AutoSaveToSlot[1] = FALSE; - AutoSaveToSlot[2] = FALSE; - AutoSaveToSlot[3] = FALSE; - AutoSaveToSlot[4] = FALSE; - + + AutoSaveToSlot[0] = TRUE; + AutoSaveToSlot[1] = FALSE; + AutoSaveToSlot[2] = FALSE; + AutoSaveToSlot[3] = FALSE; + AutoSaveToSlot[4] = FALSE; + } } } } + + // anv: in extreme iron man mode notify player it's time to save + if( doAutoSave && gGameOptions.ubIronManMode == 3 && GetWorldHour() == gGameExternalOptions.ubExtremeIronManSavingHour ) + { + // pause game + if( gGameExternalOptions.ubExtremeIronManSavingTimeNotification == 1 ) + { + // not really player's doing but oh well + HandlePlayerPauseUnPauseOfGame(); + } + // automatically open save screen when it's time + else if( gGameExternalOptions.ubExtremeIronManSavingTimeNotification == 0 ) + { + gfSaveGame = TRUE; + guiPreviousOptionScreen = guiCurrentScreen; + SetPendingNewScreen( SAVE_LOAD_SCREEN ); + } + } } void UpdateRegenCounters( void ) diff --git a/Strategic/Map Screen Interface Bottom.cpp b/Strategic/Map Screen Interface Bottom.cpp index ac93050d..f11df900 100644 --- a/Strategic/Map Screen Interface Bottom.cpp +++ b/Strategic/Map Screen Interface Bottom.cpp @@ -1740,7 +1740,20 @@ void RequestTriggerExitFromMapscreen( INT8 bExitToWhere ) if( !CanGameBeSaved() ) { //Display a message saying the player cant save now - DoMapMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__IRON_MAN_CANT_SAVE_NOW ], MAP_SCREEN, MSG_BOX_FLAG_OK, NULL ); + switch( gGameOptions.ubIronManMode ) + { + case 2: + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__SOFT_IRON_MAN_CANT_SAVE_NOW ], MAP_SCREEN, MSG_BOX_FLAG_OK, NULL ); + break; + case 3: + CHAR16 zTemp[320]; + swprintf( zTemp, zNewTacticalMessages[ TCTL_MSG__EXTREME_IRON_MAN_CANT_SAVE_NOW ], gGameExternalOptions.ubExtremeIronManSavingHour); + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zTemp, MAP_SCREEN, MSG_BOX_FLAG_OK, NULL ); + break; + default: + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__IRON_MAN_CANT_SAVE_NOW ], MAP_SCREEN, MSG_BOX_FLAG_OK, NULL ); + break; + } return; } } diff --git a/Strategic/mapscreen.cpp b/Strategic/mapscreen.cpp index cf484088..9175e660 100644 --- a/Strategic/mapscreen.cpp +++ b/Strategic/mapscreen.cpp @@ -7950,7 +7950,20 @@ void GetMapKeyboardInput( UINT32 *puiNewEvent ) else { //Display a message saying the player cant save now - DoMapMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__IRON_MAN_CANT_SAVE_NOW ], MAP_SCREEN, MSG_BOX_FLAG_OK, NULL ); + switch( gGameOptions.ubIronManMode ) + { + case 2: + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__SOFT_IRON_MAN_CANT_SAVE_NOW ], MAP_SCREEN, MSG_BOX_FLAG_OK, NULL ); + break; + case 3: + CHAR16 zTemp[320]; + swprintf( zTemp, zNewTacticalMessages[ TCTL_MSG__EXTREME_IRON_MAN_CANT_SAVE_NOW ], gGameExternalOptions.ubExtremeIronManSavingHour); + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zTemp, MAP_SCREEN, MSG_BOX_FLAG_OK, NULL ); + break; + default: + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__IRON_MAN_CANT_SAVE_NOW ], MAP_SCREEN, MSG_BOX_FLAG_OK, NULL ); + break; + } } } } diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index c760f00e..d1f08f07 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -3938,7 +3938,20 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) else { //Display a message saying the player cant save now - DoMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__IRON_MAN_CANT_SAVE_NOW ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_OK, NULL, NULL); + switch( gGameOptions.ubIronManMode ) + { + case 2: + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__SOFT_IRON_MAN_CANT_SAVE_NOW ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_OK, NULL ); + break; + case 3: + CHAR16 zTemp[320]; + swprintf( zTemp, zNewTacticalMessages[ TCTL_MSG__EXTREME_IRON_MAN_CANT_SAVE_NOW ], gGameExternalOptions.ubExtremeIronManSavingHour); + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zTemp, GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_OK, NULL ); + break; + default: + DoMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__IRON_MAN_CANT_SAVE_NOW ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_OK, NULL, NULL); + break; + } } } } @@ -3957,7 +3970,20 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) else { //Display a message saying the player cant save now - DoMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__IRON_MAN_CANT_SAVE_NOW ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_OK, NULL, NULL ); + switch( gGameOptions.ubIronManMode ) + { + case 2: + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__SOFT_IRON_MAN_CANT_SAVE_NOW ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_OK, NULL ); + break; + case 3: + CHAR16 zTemp[320]; + swprintf( zTemp, zNewTacticalMessages[ TCTL_MSG__EXTREME_IRON_MAN_CANT_SAVE_NOW ], gGameExternalOptions.ubExtremeIronManSavingHour); + DoMapMessageBox( MSG_BOX_BASIC_STYLE, zTemp, GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_OK, NULL ); + break; + default: + DoMessageBox( MSG_BOX_BASIC_STYLE, zNewTacticalMessages[ TCTL_MSG__IRON_MAN_CANT_SAVE_NOW ], GAME_SCREEN, ( UINT8 )MSG_BOX_FLAG_OK, NULL, NULL ); + break; + } } } } diff --git a/Utils/Text.h b/Utils/Text.h index 7b0db3f3..43d6bf75 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -33,6 +33,8 @@ enum TCTL_MSG__CAMPAIGN_LABEL, TCTL_MSG__NEW_CAMPAIGN_CONFIRM, TCTL_MSG__CANT_EDIT_DEFAULT, + TCTL_MSG__SOFT_IRON_MAN_CANT_SAVE_NOW, + TCTL_MSG__EXTREME_IRON_MAN_CANT_SAVE_NOW, }; //Ja25 UB @@ -2100,6 +2102,11 @@ enum GIO_FOODSYSTEM_TITLE_TEXT, GIO_BR_QUANTITY_TEXT, + // anv: new iron man modes + GIO_ALMOST_IRON_MAN_TEXT, + GIO_EXTREME_IRON_MAN_TEXT, + GIO_ULTIMATE_IRON_MAN_TEXT, + //////////////////////////////////// TEXT_NUM_GIO_TEXT }; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index b71bdcd4..8202cb2c 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -5793,6 +5793,10 @@ STR16 gzGIOScreenText[] = L"佣兵故事背景", //L"Merc Story Backgrounds", L"生存模式与食物系统", L"Bobby Ray 供货量", + + // anv: extra iron man modes + L"Soft Iron Man", // TODO.Translate + L"Extreme Iron Man", // TODO.Translate }; STR16 gzMPJScreenText[] = @@ -7955,6 +7959,9 @@ STR16 zNewTacticalMessages[]= L"战役: %S", // @@@ new text L"你选择了%S战役。 该战役是原版UB战役的玩家自定义游戏版本。你确认你要在 %S 战役下进行游戏吗?", L"如果你要使用编辑器的话,请选择一个战役,不要用默认战役。", + // anv: extra iron man modes + L"This is a SOFT IRON MAN game and you cannot save during turn-based combat.", // TODO.Translate + L"This is an EXTREME IRON MAN game and you can only save once per day, at %02d:00.", // TODO.Translate }; // The_bob : pocket popup text defs diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 1055c345..391cda3b 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -5797,6 +5797,10 @@ STR16 gzGIOScreenText[] = L"Merc Story Backgrounds", // TODO.Translate L"Food System",// TODO.Translate L"Bobby Ray Quantity",// TODO.Translate + + // anv: extra iron man modes + L"Soft Iron Man", // TODO.Translate + L"Extreme Iron Man", // TODO.Translate }; STR16 gzMPJScreenText[] = @@ -7966,6 +7970,9 @@ STR16 zNewTacticalMessages[]= L"Campaign: %S", // @@@ new text L"You have selected the campaign %S. This campaign is a player-modified version of the original Unfinished Business campaign. Are you sure you wish to play the %S campaign?", // @@@ new text L"In order to use the editor, please select a campaign other than the default.", ///@@new + // anv: extra iron man modes + L"This is a SOFT IRON MAN game and you cannot save during turn-based combat.", // TODO.Translate + L"This is an EXTREME IRON MAN game and you can only save once per day, at %02d:00.", // TODO.Translate }; // The_bob : pocket popup text defs // TODO.Translate diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 5e24541f..8620ec3b 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -5791,6 +5791,10 @@ STR16 gzGIOScreenText[] = L"Merc Story Backgrounds", L"Food System", L"Bobby Ray Quantity", + + // anv: extra iron man modes + L"Soft Iron Man", + L"Extreme Iron Man", }; STR16 gzMPJScreenText[] = @@ -7952,6 +7956,9 @@ STR16 zNewTacticalMessages[]= L"Campaign: %S", // @@@ new text L"You have selected the campaign %S. This campaign is a player-modified version of the original Unfinished Business campaign. Are you sure you wish to play the %S campaign?", // @@@ new text L"In order to use the editor, please select a campaign other than the default.", ///@@new + // anv: extra iron man modes + L"This is a SOFT IRON MAN game and you cannot save during turn-based combat.", + L"This is an EXTREME IRON MAN game and you can only save once per day, at %02d:00.", }; // The_bob : pocket popup text defs diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index e246eff3..860f1052 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -5802,6 +5802,10 @@ STR16 gzGIOScreenText[] = L"Passif des mercenaires", L"Système alimentaire", L"Stock de Bobby Ray", + + // anv: extra iron man modes + L"Soft Iron Man", // TODO.Translate + L"Extreme Iron Man", // TODO.Translate }; STR16 gzMPJScreenText[] = @@ -7953,6 +7957,9 @@ STR16 zNewTacticalMessages[]= L"Campagne : %S", // @@@ new text L"Vous avez choisi la campagne %S. Cette campagne est un mod d'Unfinished Business. Êtes-vous sûr de vouloir jouer la campagne %S ?", // @@@ new text L"Pour pouvoir utiliser l'éditeur, veuillez choisir une autre campagne que celle par défaut.", ///@@new + // anv: extra iron man modes + L"This is a SOFT IRON MAN game and you cannot save during turn-based combat.", // TODO.Translate + L"This is an EXTREME IRON MAN game and you can only save once per day, at %02d:00.", // TODO.Translate }; // The_bob : pocket popup text defs diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 5dcd8037..dc2e7a8b 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -5637,6 +5637,10 @@ STR16 gzGIOScreenText[] = L"Söldner-Hintergrundgeschichten", L"Nahrungssystem", L"Bobby Ray Auswahl", + + // anv: extra iron man modes + L"Soft Iron Man", // TODO.Translate + L"Extreme Iron Man", // TODO.Translate }; STR16 gzMPJScreenText[] = @@ -7780,6 +7784,9 @@ STR16 zNewTacticalMessages[]= L"Kampagne: %S", L"Sie haben die Kampagne %S gewählt. Diese ist eine vom Spieler modifizierte Version der Originalkampagne von JA2UB. Möchten Sie die Kampagne %S spielen?", L"Um den Editor zu benutzen, müssen Sie eine andere als die Standardkampgane auswählen.", + // anv: extra iron man modes + L"This is a SOFT IRON MAN game and you cannot save during turn-based combat.", // TODO.Translate + L"This is an EXTREME IRON MAN game and you can only save once per day, at %02d:00.", // TODO.Translate }; // The_bob : pocket popup text defs diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 2b79ca2a..93ca3c97 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -5782,6 +5782,10 @@ STR16 gzGIOScreenText[] = L"Merc Story Backgrounds", // TODO.Translate L"Food System",// TODO.Translate L"Bobby Ray Quantity", // TODO.Translate + + // anv: extra iron man modes + L"Soft Iron Man", // TODO.Translate + L"Extreme Iron Man", // TODO.Translate }; STR16 gzMPJScreenText[] = @@ -7957,6 +7961,9 @@ STR16 zNewTacticalMessages[]= L"Campagna: %S", L"Hai selezionato la campagna %S. Questa campagna è una versione amatoriale della campagna originale di Unfinished Business. Sei sicuro di voler giocare la campagna %S?", L"Per usare l'editor, selezionare una campagna diversa da quella di default.", + // anv: extra iron man modes + L"This is a SOFT IRON MAN game and you cannot save during turn-based combat.", // TODO.Translate + L"This is an EXTREME IRON MAN game and you can only save once per day, at %02d:00.", // TODO.Translate }; // The_bob : pocket popup text defs // TODO.Translate diff --git a/Utils/_Ja25ChineseText.cpp b/Utils/_Ja25ChineseText.cpp index b45db69a..06575407 100644 --- a/Utils/_Ja25ChineseText.cpp +++ b/Utils/_Ja25ChineseText.cpp @@ -480,6 +480,8 @@ STR16 zGioNewTraitsImpossibleText[]= STR16 gzIronManModeWarningText[]= { L"你选择了铁人模式。这将会游戏变得相当有挑战性,因为你无法在敌人占据的分区存档。 这个设置会影响游戏的整个进程。你确认你要在铁人模式下进行游戏吗?", + L"You have chosen SOFT IRON MAN mode. This setting makes the game slightly more challenging as you will not be able to save your game during turn-based combat. This setting will affect the entire course of the game. Are you sure want to play in SOFT IRON MAN mode?",// TODO.Translate + L"You have chosen EXTREME IRON MAN mode. This setting makes the game way more challenging as you will be able to save your progress only once per day - at %02d:00. This setting will affect the entire course of the game. Do you seriously want to play in EXTREME IRON MAN mode?",// TODO.Translate }; STR16 gzDisplayCoverText[]= diff --git a/Utils/_Ja25DutchText.cpp b/Utils/_Ja25DutchText.cpp index 6ce5cb5a..f5f27760 100644 --- a/Utils/_Ja25DutchText.cpp +++ b/Utils/_Ja25DutchText.cpp @@ -479,6 +479,8 @@ STR16 zGioNewTraitsImpossibleText[]= STR16 gzIronManModeWarningText[]= { L"You have chosen IRON MAN mode. This setting makes the game considerably more challenging as you will not be able to save your game when in a sector occupied by enemies. This setting will affect the entire course of the game. Are you sure want to play in IRON MAN mode?", + L"You have chosen SOFT IRON MAN mode. This setting makes the game slightly more challenging as you will not be able to save your game during turn-based combat. This setting will affect the entire course of the game. Are you sure want to play in SOFT IRON MAN mode?",// TODO.Translate + L"You have chosen EXTREME IRON MAN mode. This setting makes the game way more challenging as you will be able to save your progress only once per day - at %02d:00. This setting will affect the entire course of the game. Do you seriously want to play in EXTREME IRON MAN mode?",// TODO.Translate }; STR16 gzDisplayCoverText[]= diff --git a/Utils/_Ja25DutchText.h b/Utils/_Ja25DutchText.h index 2c54adcd..645ea93c 100644 --- a/Utils/_Ja25DutchText.h +++ b/Utils/_Ja25DutchText.h @@ -48,6 +48,8 @@ extern STR16 zGioNewTraitsImpossibleText[]; enum { IMM__IRON_MAN_MODE_WARNING_TEXT, + IMM__SOFT_IRON_MAN_MODE_WARNING_TEXT, + IMM__EXTREME_IRON_MAN_MODE_WARNING_TEXT, }; extern STR16 gzIronManModeWarningText[]; diff --git a/Utils/_Ja25EnglishText.cpp b/Utils/_Ja25EnglishText.cpp index 45ab2778..f2cd7d84 100644 --- a/Utils/_Ja25EnglishText.cpp +++ b/Utils/_Ja25EnglishText.cpp @@ -478,6 +478,8 @@ STR16 zGioNewTraitsImpossibleText[]= STR16 gzIronManModeWarningText[]= { L"You have chosen IRON MAN mode. This setting makes the game considerably more challenging as you will not be able to save your game when in a sector occupied by enemies. This setting will affect the entire course of the game. Are you sure want to play in IRON MAN mode?", + L"You have chosen SOFT IRON MAN mode. This setting makes the game slightly more challenging as you will not be able to save your game during turn-based combat. This setting will affect the entire course of the game. Are you sure want to play in SOFT IRON MAN mode?", + L"You have chosen EXTREME IRON MAN mode. This setting makes the game way more challenging as you will be able to save your progress only once per day - at %02d:00. This setting will affect the entire course of the game. Do you seriously want to play in EXTREME IRON MAN mode?", }; STR16 gzDisplayCoverText[]= diff --git a/Utils/_Ja25EnglishText.h b/Utils/_Ja25EnglishText.h index 7e4e34db..8ec405bd 100644 --- a/Utils/_Ja25EnglishText.h +++ b/Utils/_Ja25EnglishText.h @@ -48,6 +48,8 @@ extern STR16 zGioNewTraitsImpossibleText[]; enum { IMM__IRON_MAN_MODE_WARNING_TEXT, + IMM__SOFT_IRON_MAN_MODE_WARNING_TEXT, + IMM__EXTREME_IRON_MAN_MODE_WARNING_TEXT, }; extern STR16 gzIronManModeWarningText[]; diff --git a/Utils/_Ja25FrenchText.cpp b/Utils/_Ja25FrenchText.cpp index 608e431d..87827555 100644 --- a/Utils/_Ja25FrenchText.cpp +++ b/Utils/_Ja25FrenchText.cpp @@ -478,6 +478,8 @@ STR16 zGioNewTraitsImpossibleText[]= STR16 gzIronManModeWarningText[]= { L"Vous avez choisi le mode IRON MAN. La difficulté du jeu s'en trouvera considérablement augmentée du fait de l'impossibilité de sauvegarder en territoire ennemi. Ce paramètre prendra effet tout au long de la partie. Êtes-vous vraiment sûr de vouloir jouer en mode IRON MAN ?", + L"You have chosen SOFT IRON MAN mode. This setting makes the game slightly more challenging as you will not be able to save your game during turn-based combat. This setting will affect the entire course of the game. Are you sure want to play in SOFT IRON MAN mode?",// TODO.Translate + L"You have chosen EXTREME IRON MAN mode. This setting makes the game way more challenging as you will be able to save your progress only once per day - at %02d:00. This setting will affect the entire course of the game. Do you seriously want to play in EXTREME IRON MAN mode?",// TODO.Translate }; STR16 gzDisplayCoverText[]= diff --git a/Utils/_Ja25FrenchText.h b/Utils/_Ja25FrenchText.h index 2c54adcd..645ea93c 100644 --- a/Utils/_Ja25FrenchText.h +++ b/Utils/_Ja25FrenchText.h @@ -48,6 +48,8 @@ extern STR16 zGioNewTraitsImpossibleText[]; enum { IMM__IRON_MAN_MODE_WARNING_TEXT, + IMM__SOFT_IRON_MAN_MODE_WARNING_TEXT, + IMM__EXTREME_IRON_MAN_MODE_WARNING_TEXT, }; extern STR16 gzIronManModeWarningText[]; diff --git a/Utils/_Ja25GermanText.cpp b/Utils/_Ja25GermanText.cpp index 81f3570f..693899fe 100644 --- a/Utils/_Ja25GermanText.cpp +++ b/Utils/_Ja25GermanText.cpp @@ -476,6 +476,8 @@ STR16 zGioNewTraitsImpossibleText[]= STR16 gzIronManModeWarningText[]= { L"Sie haben sich für den Ironman-Modus entschieden. Mit dieser Einstellung können Sie das Spiel nicht speichern, wenn Feinde im Sektor sind. Sind Sie sicher, dass Sie im Ironman-Modus spielen wollen?", + L"You have chosen SOFT IRON MAN mode. This setting makes the game slightly more challenging as you will not be able to save your game during turn-based combat. This setting will affect the entire course of the game. Are you sure want to play in SOFT IRON MAN mode?",// TODO.Translate + L"You have chosen EXTREME IRON MAN mode. This setting makes the game way more challenging as you will be able to save your progress only once per day - at %02d:00. This setting will affect the entire course of the game. Do you seriously want to play in EXTREME IRON MAN mode?",// TODO.Translate }; STR16 gzDisplayCoverText[]= diff --git a/Utils/_Ja25GermanText.h b/Utils/_Ja25GermanText.h index 3829ba32..f0aa6614 100644 --- a/Utils/_Ja25GermanText.h +++ b/Utils/_Ja25GermanText.h @@ -48,6 +48,8 @@ extern STR16 zGioNewTraitsImpossibleText[]; enum { IMM__IRON_MAN_MODE_WARNING_TEXT, + IMM__SOFT_IRON_MAN_MODE_WARNING_TEXT, + IMM__EXTREME_IRON_MAN_MODE_WARNING_TEXT, }; extern STR16 gzIronManModeWarningText[]; diff --git a/Utils/_Ja25ItalianText.cpp b/Utils/_Ja25ItalianText.cpp index 4deb214a..bde25d21 100644 --- a/Utils/_Ja25ItalianText.cpp +++ b/Utils/_Ja25ItalianText.cpp @@ -476,6 +476,8 @@ STR16 zGioNewTraitsImpossibleText[]= STR16 gzIronManModeWarningText[]= { L"Hai scelto la modalità IRON MAN. Questa impostazione rende il gioco notevolmente più impegnativo, poiché non potrai salvare la partita in un settore occupato da nemici. Non potrai cambiare questa decisione nel corso della partita. Sei sicuro di voler giocare al livello IRON MAN?", + L"You have chosen SOFT IRON MAN mode. This setting makes the game slightly more challenging as you will not be able to save your game during turn-based combat. This setting will affect the entire course of the game. Are you sure want to play in SOFT IRON MAN mode?",// TODO.Translate + L"You have chosen EXTREME IRON MAN mode. This setting makes the game way more challenging as you will be able to save your progress only once per day - at %02d:00. This setting will affect the entire course of the game. Do you seriously want to play in EXTREME IRON MAN mode?",// TODO.Translate }; STR16 gzDisplayCoverText[]= diff --git a/Utils/_Ja25ItalianText.h b/Utils/_Ja25ItalianText.h index 2c54adcd..645ea93c 100644 --- a/Utils/_Ja25ItalianText.h +++ b/Utils/_Ja25ItalianText.h @@ -48,6 +48,8 @@ extern STR16 zGioNewTraitsImpossibleText[]; enum { IMM__IRON_MAN_MODE_WARNING_TEXT, + IMM__SOFT_IRON_MAN_MODE_WARNING_TEXT, + IMM__EXTREME_IRON_MAN_MODE_WARNING_TEXT, }; extern STR16 gzIronManModeWarningText[]; diff --git a/Utils/_Ja25PolishText.cpp b/Utils/_Ja25PolishText.cpp index c4c86a5e..4e0ae4d6 100644 --- a/Utils/_Ja25PolishText.cpp +++ b/Utils/_Ja25PolishText.cpp @@ -478,7 +478,9 @@ STR16 zGioNewTraitsImpossibleText[]= //@@@: New string as of March 3, 2000. STR16 gzIronManModeWarningText[]= { - L"Wybrałeś tryb CZŁOWIEK ZE STALI. Opcja ta sprawi, że gra będzie dużo trudniejsza ponieważ nie będzie możliwości zapisywania gry podczas walki. Będzie to miało wpływ na cały przebieg rozgrywki. Czy na pewno chcesz grać w trybie CZŁOWIEK ZE STALI?", + L"Wybrałeś tryb CZŁOWIEKA Z ŻELAZA. Opcja ta sprawi, że gra będzie dużo trudniejsza, ponieważ nie będzie możliwości zapisywania gry podczas walki. Będzie to miało wpływ na cały przebieg rozgrywki. Czy na pewno chcesz grać w trybie CZŁOWIEKA Z ŻELAZA?", + L"Wybrałeś tryb CZŁOWIEKA Z ŻELIWA. Opcja ta sprawi, że gra będzie nieco trudniejsza, gdyż nie będziesz miał możliwości zapisywania gry podczas walki w trybie turowym. Będzie to miało wpływ na cały przebieg rozgrywki. Czy na pewno chcesz grać w trybie CZŁOWIEKA Z ŻELIWA?", + L"Wybrałeś tryb CZŁOWIEKA ZE STALI. Opcja ta sprawi, że gra będzie znacznie trudniejsza, gdyż będziesz mógł zapisać grę zaledwie raz dziennie, o %02d:00. Będzie to miało wpływ na cały przebieg rozgrywki. Jesteś pewien, że gra w trybie CZŁOWIEKA ZE STALI to dobry pomysł?", }; STR16 gzDisplayCoverText[]= diff --git a/Utils/_Ja25PolishText.h b/Utils/_Ja25PolishText.h index 2c54adcd..645ea93c 100644 --- a/Utils/_Ja25PolishText.h +++ b/Utils/_Ja25PolishText.h @@ -48,6 +48,8 @@ extern STR16 zGioNewTraitsImpossibleText[]; enum { IMM__IRON_MAN_MODE_WARNING_TEXT, + IMM__SOFT_IRON_MAN_MODE_WARNING_TEXT, + IMM__EXTREME_IRON_MAN_MODE_WARNING_TEXT, }; extern STR16 gzIronManModeWarningText[]; diff --git a/Utils/_Ja25RussianText.cpp b/Utils/_Ja25RussianText.cpp index b6850293..e5ff664d 100644 --- a/Utils/_Ja25RussianText.cpp +++ b/Utils/_Ja25RussianText.cpp @@ -477,6 +477,8 @@ STR16 zGioNewTraitsImpossibleText[]= STR16 gzIronManModeWarningText[]= { L"Ваш выбор позволит сохраняться лишь в \"мирное время\". Проходить игру станет гораздо сложнее, так как сохраняться вы сможете только между боями. После старта игры изменить эту настройку нельзя. Вы уверены, что готовы расстаться с возможностью сохраняться в бою?", + L"You have chosen SOFT IRON MAN mode. This setting makes the game slightly more challenging as you will not be able to save your game during turn-based combat. This setting will affect the entire course of the game. Are you sure want to play in SOFT IRON MAN mode?",// TODO.Translate + L"You have chosen EXTREME IRON MAN mode. This setting makes the game way more challenging as you will be able to save your progress only once per day - at %02d:00. This setting will affect the entire course of the game. Do you seriously want to play in EXTREME IRON MAN mode?",// TODO.Translate }; STR16 gzDisplayCoverText[]= diff --git a/Utils/_Ja25RussianText.h b/Utils/_Ja25RussianText.h index 2c54adcd..645ea93c 100644 --- a/Utils/_Ja25RussianText.h +++ b/Utils/_Ja25RussianText.h @@ -48,6 +48,8 @@ extern STR16 zGioNewTraitsImpossibleText[]; enum { IMM__IRON_MAN_MODE_WARNING_TEXT, + IMM__SOFT_IRON_MAN_MODE_WARNING_TEXT, + IMM__EXTREME_IRON_MAN_MODE_WARNING_TEXT, }; extern STR16 gzIronManModeWarningText[]; diff --git a/Utils/_Ja25TaiwaneseText.cpp b/Utils/_Ja25TaiwaneseText.cpp index fac33b46..918b73a3 100644 --- a/Utils/_Ja25TaiwaneseText.cpp +++ b/Utils/_Ja25TaiwaneseText.cpp @@ -479,6 +479,8 @@ STR16 zGioNewTraitsImpossibleText[]= STR16 gzIronManModeWarningText[]= { L"You have chosen IRON MAN mode. This setting makes the game considerably more challenging as you will not be able to save your game when in a sector occupied by enemies. This setting will affect the entire course of the game. Are you sure want to play in IRON MAN mode?", + L"You have chosen SOFT IRON MAN mode. This setting makes the game slightly more challenging as you will not be able to save your game during turn-based combat. This setting will affect the entire course of the game. Are you sure want to play in SOFT IRON MAN mode?",// TODO.Translate + L"You have chosen EXTREME IRON MAN mode. This setting makes the game way more challenging as you will be able to save your progress only once per day - at %02d:00. This setting will affect the entire course of the game. Do you seriously want to play in EXTREME IRON MAN mode?",// TODO.Translate }; STR16 gzDisplayCoverText[]= diff --git a/Utils/_Ja25TaiwaneseText.h b/Utils/_Ja25TaiwaneseText.h index 125d17bf..a2f8f15f 100644 --- a/Utils/_Ja25TaiwaneseText.h +++ b/Utils/_Ja25TaiwaneseText.h @@ -48,6 +48,8 @@ extern STR16 zGioNewTraitsImpossibleText[]; enum { IMM__IRON_MAN_MODE_WARNING_TEXT, + IMM__SOFT_IRON_MAN_MODE_WARNING_TEXT, + IMM__EXTREME_IRON_MAN_MODE_WARNING_TEXT, }; extern STR16 gzIronManModeWarningText[]; diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index d695ae44..c58e58c4 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -5718,18 +5718,18 @@ STR16 gzGIOScreenText[] = { L"POCZĄTKOWE USTAWIENIA GRY", #ifdef JA2UB - L"Dialogi Manuel'a", - L"Off", - L"On", + L"Dialogi Manuela", + L"Wył.", + L"Wł.", #else L"Styl gry", L"Realistyczny", L"S-F", #endif L"Platynowy", //Placeholder English - L"Opcje broni", + L"Dostępny arsenał", L"Mnóstwo", - L"Standardowe", + L"Standardowo", L"Stopień trudności", L"Nowicjusz", L"Doświadczony", @@ -5738,70 +5738,73 @@ STR16 gzGIOScreenText[] = L"Start", // TODO.Translate L"Anuluj", L"Zapis gry", - L"Zawsze", - L"W czasie pokoju", + L"W dowolny momencie", + L"Człowiek z żelaza", L"Nie działa w wersji demo", - L"Bobby Ray Quality", // TODO.Translate - L"Normalne", - L"Świetne", - L"Wyśmienite", - L"Niewiarygodne", - L"Ekwipunek / Dodatki", - L"Nie używany", - L"Nie używany", + L"Jakość zasobów Bobby'ego Ray'a", + L"Normalna", + L"Świetna", + L"Wyśmienita", + L"Niewiarygodna", + L"System ekwipunku / dodatków", + L"Nieużywane", + L"Nieużywane", L"Wczytaj grę MP", - L"POCZĄTKOWE USTAWIENIA GRY (Only the server settings take effect)", + L"POCZĄTKOWE USTAWIENIA GRY (Tylko te po stronie serwera będą w użyciu)", // Added by SANDRO - L"Cechy umiejętności", - L"Stare", - L"Nowe", + L"System zdolności", + L"Stary", + L"Nowy", L"Maks. liczba IMP", - L"Jeden", - L"Dwa", - L"Trzy", - L"Cztery", - L"Pięć", - L"Sześć", - L"Wrogowie upuszczają całość ekwipunku", - L"Wyłączone", - L"Włączone", + L"1", + L"2", + L"3", + L"4", + L"5", + L"6", + L"Polegli wrogowie pozostawiają cały ekwipunek", + L"Wył.", + L"Wł.", #ifdef JA2UB - L"Tex and John", - L"Random", - L"All", + L"Tex i John", + L"Losowo", + L"Obaj", #else L"Liczba terrorystów", - L"Losowe", - L"Wszystkie", + L"Losowo", + L"Wszyscy", #endif - L"Tajne składy proni", + L"Ukryte składowiska broni", L"Losowe", L"Wszystkie", - L"Szybkość zwiększania dostępności przedmiotów", - L"Bardzo wolna", - L"Wolna", - L"Normala", - L"Szybka", - L"Bardzo szybkia", + L"Przyrost dostępności przedmiotów", + L"Bardzo wolny", + L"Wolny", + L"Normalny", + L"Szybki", + L"Bardzo szybki", - L"Stare / Stare", - L"Nowe / Stare", - L"Nowe / Nowe", + L"Stary / Stary", + L"Nowy / Stary", + L"Nowy / Nowy", - // TODO.Translate // Squad Size - L"Max. Squad Size", + L"Maks. liczebność oddziału", L"6", L"8", L"10", //L"Faster Bobby Ray Shipments", - L"Inventory Manipulation Costs AP", + L"Manipulacja ekwipunkiem kosztuje punkty akcji", - L"New Chance to Hit System", - L"Improved Interrupt System", - L"Merc Story Backgrounds", // TODO.Translate - L"Food System",// TODO.Translate - L"Bobby Ray Quantity", // TODO.Translate + L"Nowy system szans trafienia", + L"Ulepszony system przerwań, + L"Historie najemników", + L"System pożywienia", + L"Wielkość zasobów Bobby'ego Ray'a", + + // anv: extra iron man modes + L"Człowiek z żeliwa", + L"Człowiek ze stali", }; STR16 gzMPJScreenText[] = @@ -7955,20 +7958,20 @@ STR16 zNewTacticalMessages[]= { //L"Odległość od celu (w polach): %d, Jasność = %d/%d", L"Nadajnik został podłączony do twojego laptopa.", - L"Nie mo¿esz zatrudnić %s(a)", - L"Na określony czas, poni¿sze honorarium pokryje koszt całej misji razem z wyposażeniem zamieszonym poniżej.", - L"Zatrudnij %s(a) już teraz i weź udział naszej promocji 'jedno honorarium pokrywa wszystko'. Ponadto w tej niewiarygodnej ofercie cały ekwipunek najemnika dostaniesz za darmo.", + L"Nie możesz zatrudnić %s(a)", + L"Na określony czas, poniższe honorarium pokryje koszt całej misji razem z wyposażeniem zamieszczonym poniżej.", + L"Zatrudnij %s(a) już teraz i weź udział w naszej promocji 'jedno honorarium pokrywa wszystko'. Ponadto w tej niewiarygodnej ofercie cały ekwipunek najemnika otrzymasz za darmo.", L"Honorarium", L"Ktoś jest w sektorze...", //L"Zasięg broni (w polach): %d, Szansa na trafienie: %d procent", L"Pokaż osłonę", L"Zasięg wzroku", L"Nowi rekruci nie mogą tam przybyć.", - L"Dopóki twój laprop będzie bez nadajnika, nie będziesz mógł zatrudniać nowych członków zespołu. Możliwe, że to odpowiedni moment żeby odczytać zapisany stan gry lub zacząć grać od nowa!", - L"%s słyszy dźwięk zgniatanego metalu dochodzący spod ciała Jerrego. To niestety zabrzmiało jak dźwięk zgniatanej anteny od twojego laptopa.", //the %s is the name of a merc. @@@ Modified - L"Po przejżeniu notatki zostawionej przez zastępce dowódcy Morris'a, %s zauważa pewną możliwość. Notatka zawiera koordynaty do wystrzelenia pocisków w dwa miasteczka w Arulco. Są na niej również koordynaty z których te pociski zostaną wystrzelone - wojskowej placówki.", - L"Przyglądając się panelowi kontrolnemu, %s zauważa, że cyfry można odwrócić, tak, że pociski mogą zniszczyć tą placówkę. %s musi znaleźć drogę ucieczki. Wydaje się, że winda jest najszybszym rozwiązaniem...", - L"To jest tryb CZ£OWIEK ZE STALI i nie możesz zapisywać gry gdy wróg jest w sektorze.", // @@@ new text + L"Dopóki twój laptop będzie bez nadajnika, nie będziesz mógł zatrudniać nowych członków zespołu. Możliwe, że to odpowiedni moment by odczytać zapisany stan gry lub zacząć grać od nowa!", + L"%s słyszy dźwięk zgniatanego metalu dochodzący spod ciała Jerry'ego. Niestety zabrzmiało to jak dźwięk zgniatanej anteny twojego laptopa.", //the %s is the name of a merc. @@@ Modified + L"Po przejrzeniu notatki pozostawionej przez podkomendanta Morrisa, %s zauważa pewną możliwość. Notatka zawiera koordynaty potrzebne do wystrzelenia pocisków w stronę różnych miast w Arulco. Są na niej również współrzędne, z których pociski te zostaną wystrzelone.", + L"Przyglądając się panelowi kontrolnemu, %s spostrzega, że liczby można zamienić tak, by pociski zniszczyły tę placówkę. %s musi znaleźć drogę ucieczki. Winda zdaje się być najszybszym rozwiązaniem...", + L"Grasz w trybie CZŁOWIEKA Z ŻELAZA i nie możesz zapisywać gry, gdy wróg jest w sektorze.", // @@@ new text L"(Nie można zapisywać gry podczas walki)", //@@@@ new text L"Kampania ma więcej niż 30 postaci.", // @@@ new text L"Nie można odnaleźć kampanii.", // @@@ new text @@ -7976,6 +7979,9 @@ STR16 zNewTacticalMessages[]= L"Kampania: %S", // @@@ new text L"Wybrałeś kampanię %S. Ta kampania została stworzona przez fanów gry. Czy jesteś pewien, że chcesz w nią zagrać?", // @@@ new text L"Żeby użyć edytora powinieneś wcześniej wybrać kampanię inną niż standardowa.", ///@@new + // anv: extra iron man modes + L"Grasz w trybie CZŁOWIEKA Z ŻELIWA i nie możesz zapisywać gry w trakcie walki turowej.", + L"Grasz w trybie CZŁOWIEKA ZE STALI i możesz zapisywać grę tylko raz dziennie, o %02d:00.", }; // The_bob : pocket popup text defs // TODO.Translate diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 6d7edb41..e62f1d8d 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -5792,6 +5792,10 @@ STR16 gzGIOScreenText[] = L"Merc Story Backgrounds", // TODO.Translate L"Игра с едой", L"Количество товара у Бобби Рэя", + + // anv: extra iron man modes + L"Soft Iron Man", // TODO.Translate + L"Extreme Iron Man", // TODO.Translate }; STR16 gzMPJScreenText[] = @@ -7955,6 +7959,9 @@ STR16 zNewTacticalMessages[]= L"Кампания: %S", L"Вы выбрали кампанию %S. Эта кампания является модификацией оригинальной кампании Unfinished Business. Вы уверены, что хотите играть кампанию %S?", L"Чтобы воспользоваться редактором, смените кампанию по умолчанию на другую.", + // anv: extra iron man modes + L"This is a SOFT IRON MAN game and you cannot save during turn-based combat.", // TODO.Translate + L"This is an EXTREME IRON MAN game and you can only save once per day, at %02d:00.", // TODO.Translate }; // The_bob : pocket popup text defs // TODO.Translate diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index 949457c3..8ec45cc9 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -5799,6 +5799,10 @@ STR16 gzGIOScreenText[] = L"Merc Story Backgrounds", // TODO.Translate L"Food System",// TODO.Translate L"Bobby Ray Quantity", + + // anv: extra iron man modes + L"Soft Iron Man", // TODO.Translate + L"Extreme Iron Man", // TODO.Translate }; STR16 gzMPJScreenText[] = @@ -7966,6 +7970,9 @@ STR16 zNewTacticalMessages[]= L"Campaign: %S", // @@@ new text L"You have selected the campaign %S. This campaign is a player-modified version of the original Unfinished Business campaign. Are you sure you wish to play the %S campaign?", // @@@ new text L"In order to use the editor, please select a campaign other than the default.", ///@@new + // anv: extra iron man modes + L"This is a SOFT IRON MAN game and you cannot save during turn-based combat.", // TODO.Translate + L"This is an EXTREME IRON MAN game and you can only save once per day, at %02d:00.", // TODO.Translate }; // The_bob : pocket popup text defs // TODO.Translate