diff --git a/src/fios.h b/src/fios.h index c34de10..10909d5 100644 --- a/src/fios.h +++ b/src/fios.h @@ -98,6 +98,7 @@ enum SaveLoadDialogMode { SLD_LOAD_SCENARIO, ///< Load a scenario. SLD_SAVE_GAME, ///< Save a game. SLD_SAVE_SCENARIO, ///< Save a scenario. + SLD_PLAY_SCENARIO, ///< Save then play a scenario. SLD_LOAD_HEIGHTMAP, ///< Load a heightmap. SLD_SAVE_HEIGHTMAP, ///< Save a heightmap. }; diff --git a/src/fios_gui.cpp b/src/fios_gui.cpp index 27c0f56..03f90d7 100644 --- a/src/fios_gui.cpp +++ b/src/fios_gui.cpp @@ -205,6 +205,7 @@ void BuildFileList() switch (_saveload_mode) { case SLD_LOAD_SCENARIO: case SLD_SAVE_SCENARIO: + case SLD_PLAY_SCENARIO: FiosGetScenarioList(_saveload_mode); break; case SLD_SAVE_HEIGHTMAP: case SLD_LOAD_HEIGHTMAP: @@ -257,6 +258,7 @@ public: static const StringID saveload_captions[] = { STR_SAVELOAD_LOAD_CAPTION, STR_SAVELOAD_LOAD_SCENARIO, + STR_SAVELOAD_PLAY_SCENARIO, STR_SAVELOAD_SAVE_CAPTION, STR_SAVELOAD_SAVE_SCENARIO, STR_SAVELOAD_LOAD_HEIGHTMAP, @@ -269,6 +271,7 @@ public: switch (mode) { case SLD_SAVE_GAME: this->GenerateFileName(); break; case SLD_SAVE_HEIGHTMAP: + case SLD_PLAY_SCENARIO: case SLD_SAVE_SCENARIO: strecpy(this->edit_str_buf, "UNNAMED", &this->edit_str_buf[edit_str_size - 1]); break; default: break; } @@ -304,6 +307,7 @@ public: break; case SLD_SAVE_SCENARIO: + case SLD_PLAY_SCENARIO: case SLD_LOAD_SCENARIO: FioGetDirectory(o_dir.name, lengthof(o_dir.name), SCENARIO_DIR); break; @@ -318,7 +322,7 @@ public: } /* Focus the edit box by default in the save windows */ - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP) { + if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP || _saveload_mode == SLD_PLAY_SCENARIO) { this->SetFocusedWidget(SLWW_SAVE_OSK_TITLE); } } @@ -423,7 +427,7 @@ public: if (y > y_max) break; /* Hide current date for scenarios */ - if (_saveload_mode != SLD_LOAD_SCENARIO && _saveload_mode != SLD_SAVE_SCENARIO) { + if (_saveload_mode != SLD_LOAD_SCENARIO && _saveload_mode != SLD_SAVE_SCENARIO && _saveload_mode != SLD_PLAY_SCENARIO) { /* Current date */ SetDParam(0, _load_check_data.current_date); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_NETWORK_SERVER_LIST_CURRENT_DATE); @@ -444,7 +448,7 @@ public: if (y > y_max) break; /* Hide the company stuff for scenarios */ - if (_saveload_mode != SLD_LOAD_SCENARIO && _saveload_mode != SLD_SAVE_SCENARIO) { + if (_saveload_mode != SLD_LOAD_SCENARIO && _saveload_mode != SLD_SAVE_SCENARIO && _saveload_mode != SLD_PLAY_SCENARIO) { y += FONT_HEIGHT_NORMAL; if (y > y_max) break; @@ -503,7 +507,7 @@ public: this->vscroll->SetCount(_fios_items.Length()); this->DrawWidgets(); - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP) { + if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP || _saveload_mode == SLD_PLAY_SCENARIO) { this->DrawEditBox(SLWW_SAVE_OSK_TITLE); } } @@ -569,7 +573,7 @@ public: this->InvalidateData(1); } - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP) { + if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP || _saveload_mode == SLD_PLAY_SCENARIO) { /* Copy clicked name to editbox */ ttd_strlcpy(this->text.buf, file->title, this->text.max_bytes); UpdateTextBufferSize(&this->text); @@ -616,7 +620,7 @@ public: virtual void OnMouseLoop() { - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP) { + if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP || _saveload_mode == SLD_PLAY_SCENARIO) { this->HandleEditBox(SLWW_SAVE_OSK_TITLE); } } @@ -629,7 +633,7 @@ public: } EventState state = ES_NOT_HANDLED; - if ((_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP) && + if ((_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP || _saveload_mode == SLD_PLAY_SCENARIO) && this->HandleEditBoxKey(SLWW_SAVE_OSK_TITLE, key, keycode, state) == HEBR_CONFIRM) { this->HandleButtonClick(SLWW_SAVE_GAME); } @@ -641,7 +645,7 @@ public: { /* This test protects against using widgets 11 and 12 which are only available * in those saveload modes. */ - if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP)) return; + if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_SAVE_HEIGHTMAP || _saveload_mode == SLD_PLAY_SCENARIO)) return; if (this->IsWidgetLowered(SLWW_DELETE_SELECTION)) { // Delete button clicked if (!FiosDelete(this->text.buf)) { @@ -654,8 +658,8 @@ public: UpdateTextBufferSize(&this->text); } else if (this->IsWidgetLowered(SLWW_SAVE_GAME)) { // Save button clicked - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) { - _switch_mode = SM_SAVE_GAME; + if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO || _saveload_mode == SLD_PLAY_SCENARIO) { + _switch_mode = (_saveload_mode == SLD_PLAY_SCENARIO) ? SM_PLAY_SCENARIO : SM_SAVE_GAME; FiosMakeSavegameName(_file_to_saveload.name, this->text.buf, sizeof(_file_to_saveload.name)); } else { _switch_mode = SM_SAVE_HEIGHTMAP; @@ -740,6 +744,7 @@ static const FileType _file_modetotype[] = { FT_SCENARIO, // used for SLD_LOAD_SCENARIO FT_SAVEGAME, // used for SLD_SAVE_GAME FT_SCENARIO, // used for SLD_SAVE_SCENARIO + FT_SCENARIO, // used for SLD_PLAY_SCENARIO FT_HEIGHTMAP, // used for SLD_LOAD_HEIGHTMAP FT_HEIGHTMAP, // used for SLD_SAVE_HEIGHTMAP }; @@ -756,6 +761,7 @@ void ShowSaveLoadDialog(SaveLoadDialogMode mode) switch (mode) { case SLD_SAVE_GAME: case SLD_SAVE_SCENARIO: + case SLD_PLAY_SCENARIO: case SLD_SAVE_HEIGHTMAP: sld = &_save_dialog_desc; break; case SLD_LOAD_HEIGHTMAP: diff --git a/src/lang/english.txt b/src/lang/english.txt index e2b778c..b9288b8 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -337,6 +337,7 @@ STR_SCENEDIT_TOOLBAR_PLACE_OBJECT :{BLACK}Place ob ############ range for SE file menu starts STR_SCENEDIT_FILE_MENU_SAVE_SCENARIO :Save scenario +STR_SCENEDIT_FILE_MENU_PLAY_SCENARIO :Play scenario STR_SCENEDIT_FILE_MENU_LOAD_SCENARIO :Load scenario STR_SCENEDIT_FILE_MENU_SAVE_HEIGHTMAP :Save heightmap STR_SCENEDIT_FILE_MENU_LOAD_HEIGHTMAP :Load heightmap @@ -2287,6 +2288,7 @@ STR_SAVELOAD_SAVE_CAPTION :{WHITE}Save Gam STR_SAVELOAD_LOAD_CAPTION :{WHITE}Load Game STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Save Scenario STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Load Scenario +STR_SAVELOAD_PLAY_SCENARIO :{WHITE}Play Scenario STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Load Heightmap STR_SAVELOAD_SAVE_HEIGHTMAP :{WHITE}Save Heightmap STR_SAVELOAD_HOME_BUTTON :{BLACK}Click here to jump to the current default save/load directory diff --git a/src/openttd.cpp b/src/openttd.cpp index af1f77f..775cdcf 100644 --- a/src/openttd.cpp +++ b/src/openttd.cpp @@ -974,6 +974,12 @@ void SwitchToMode(SwitchMode new_mode) } break; } + + case SM_PLAY_SCENARIO: + SwitchToMode(SM_SAVE_GAME); + SwitchToMode(SM_LOAD_GAME); + + break; case SM_MENU: // Switch to game intro menu LoadIntroGame(); diff --git a/src/openttd.h b/src/openttd.h index 40a78c4..38ea3c8 100644 --- a/src/openttd.h +++ b/src/openttd.h @@ -33,6 +33,7 @@ enum SwitchMode { SM_SAVE_HEIGHTMAP, ///< Save heightmap. SM_GENRANDLAND, ///< Generate random land within scenario editor. SM_LOAD_SCENARIO, ///< Load scenario from scenario editor. + SM_PLAY_SCENARIO, ///< Save scenario then load it. SM_START_HEIGHTMAP, ///< Load a heightmap and start a new game from it. SM_LOAD_HEIGHTMAP, ///< Load heightmap from scenario editor. }; diff --git a/src/toolbar_gui.cpp b/src/toolbar_gui.cpp index c59f131..f028990 100644 --- a/src/toolbar_gui.cpp +++ b/src/toolbar_gui.cpp @@ -382,11 +382,12 @@ static CallBackFunction MenuClickSettings(int index) */ enum SaveLoadEditorMenuEntries { SLEME_SAVE_SCENARIO = 0, + SLEME_PLAY_SCENARIO, SLEME_LOAD_SCENARIO, SLEME_SAVE_HEIGHTMAP, SLEME_LOAD_HEIGHTMAP, SLEME_EXIT_TOINTRO, - SLEME_EXIT_GAME = 6, + SLEME_EXIT_GAME = 7, SLEME_MENUCOUNT, }; @@ -436,6 +437,7 @@ static CallBackFunction MenuClickSaveLoad(int index = 0) if (_game_mode == GM_EDITOR) { switch (index) { case SLEME_SAVE_SCENARIO: ShowSaveLoadDialog(SLD_SAVE_SCENARIO); break; + case SLEME_PLAY_SCENARIO: ShowSaveLoadDialog(SLD_PLAY_SCENARIO); break; case SLEME_LOAD_SCENARIO: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break; case SLEME_SAVE_HEIGHTMAP: ShowSaveLoadDialog(SLD_SAVE_HEIGHTMAP); break; case SLEME_LOAD_HEIGHTMAP: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break;