/** * * rct2: 0x0066F7C0 */ void window_editor_bottom_toolbar_jump_forward_to_save_scenario() { rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; int parkFlagsBackup, success; char path[256]; if (!scenario_prepare_for_save()) { window_error_open(STR_UNABLE_TO_SAVE_SCENARIO_FILE, RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TEXT, rct_string_id)); gfx_invalidate_screen(); return; } window_close_all(); window_loadsave_open(LOADSAVETYPE_SAVE | LOADSAVETYPE_SCENARIO, s6Info->name); return; if (!show_save_scenario_dialog(path)) { gfx_invalidate_screen(); return; } // s6Info->editor_step = 255; // Ensure path has .SC6 extension path_set_extension(path, ".SC6"); // Save the scenario parkFlagsBackup = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32); RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_18; SDL_RWops* rw = SDL_RWFromFile(path, "wb+"); if (rw != NULL) { success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); SDL_RWclose(rw); } RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) = parkFlagsBackup; if (success) { title_load(); } else { window_error_open(STR_SCENARIO_SAVE_FAILED, -1); s6Info->editor_step = EDITOR_STEP_OBJECTIVE_SELECTION; } }
static void window_title_menu_scenarioselect_callback(const utf8 *path) { if (!scenario_load_and_play_from_path(path)) { title_load(); } }
/** * Launches the game, after command line arguments have been parsed and processed. */ void openrct2_launch() { if (openrct2_initialise()) { gIntroState = INTRO_STATE_NONE; if ((gOpenRCT2StartupAction == STARTUP_ACTION_TITLE) && gConfigGeneral.play_intro) { gOpenRCT2StartupAction = STARTUP_ACTION_INTRO; } switch (gOpenRCT2StartupAction) { case STARTUP_ACTION_INTRO: gIntroState = INTRO_STATE_PUBLISHER_BEGIN; title_load(); break; case STARTUP_ACTION_TITLE: title_load(); break; case STARTUP_ACTION_OPEN: { bool parkLoaded = false; // A path that includes "://" is illegal with all common filesystems, so it is almost certainly a URL // This way all cURL supported protocols, like http, ftp, scp and smb are automatically handled if (strstr(gOpenRCT2StartupActionPath, "://") != nullptr) { #ifndef DISABLE_HTTP // Download park and open it using its temporary filename char tmpPath[MAX_PATH]; if (!http_download_park(gOpenRCT2StartupActionPath, tmpPath)) { title_load(); break; } parkLoaded = OpenRCT2::OpenParkAutoDetectFormat(tmpPath); #endif } else { parkLoaded = rct2_open_file(gOpenRCT2StartupActionPath); } if (!parkLoaded) { Console::Error::WriteLine("Failed to load '%s'", gOpenRCT2StartupActionPath); title_load(); break; } gScreenFlags = SCREEN_FLAGS_PLAYING; #ifndef DISABLE_NETWORK if (gNetworkStart == NETWORK_MODE_SERVER) { if (gNetworkStartPort == 0) { gNetworkStartPort = gConfigNetwork.default_port; } if (String::IsNullOrEmpty(gCustomPassword)) { network_set_password(gConfigNetwork.default_password); } else { network_set_password(gCustomPassword); } network_begin_server(gNetworkStartPort); } #endif // DISABLE_NETWORK break; } case STARTUP_ACTION_EDIT: if (String::SizeOf(gOpenRCT2StartupActionPath) == 0) { editor_load(); } else if (!editor_load_landscape(gOpenRCT2StartupActionPath)) { title_load(); } break; } #ifndef DISABLE_NETWORK if (gNetworkStart == NETWORK_MODE_CLIENT) { if (gNetworkStartPort == 0) { gNetworkStartPort = gConfigNetwork.default_port; } network_begin_client(gNetworkStartHost, gNetworkStartPort); } #endif // DISABLE_NETWORK OpenRCT2::RunGameLoop(); } openrct2_dispose(); // HACK Some threads are still running which causes the game to not terminate. Investigation required! exit(gExitCode); }
static void window_loadsave_select(rct_window *w, const char *path) { SDL_RWops* rw; switch (_loadsaveType & 0x0F) { case (LOADSAVETYPE_LOAD | LOADSAVETYPE_GAME) : if (gLoadSaveTitleSequenceSave) { utf8 newName[MAX_PATH]; char *extension = (char*)path_get_extension(path); safe_strcpy(newName, path_get_filename(path), MAX_PATH); if (_stricmp(extension, ".sv6") != 0 && _stricmp(extension, ".sc6") != 0) strcat(newName, ".sv6"); if (title_sequence_save_exists(gCurrentTitleSequence, newName)) { RCT2_GLOBAL(RCT2_ADDRESS_COMMON_FORMAT_ARGS + 0, uint32) = (uint32)&_listItems[w->selected_list_item].name; window_text_input_open(w, WIDX_SCROLL, 5435, 5404, 1170, (uint32)_listItems[w->selected_list_item].name, TITLE_SEQUENCE_MAX_SAVE_LENGTH - 1); } else { title_sequence_add_save(gCurrentTitleSequence, path, newName); window_close(w); } window_loadsave_invoke_callback(MODAL_RESULT_OK); } else if (game_load_save(path)) { safe_strcpy(gScenarioSavePath, path, MAX_PATH); gFirstTimeSave = 0; window_close(w); gfx_invalidate_screen(); window_loadsave_invoke_callback(MODAL_RESULT_OK); } else { // 1050, not the best message... window_error_open(STR_LOAD_GAME, 1050); window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_GAME) : rw = SDL_RWFromFile(path, "wb+"); if (rw != NULL) { int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 1 : 0); SDL_RWclose(rw); if (success) { safe_strcpy(gScenarioSavePath, path, MAX_PATH); gFirstTimeSave = 0; window_close_by_class(WC_LOADSAVE); gfx_invalidate_screen(); window_loadsave_invoke_callback(MODAL_RESULT_OK); } else { window_error_open(STR_SAVE_GAME, 1047); window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } } else { window_error_open(STR_SAVE_GAME, 1047); window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_LOAD | LOADSAVETYPE_LANDSCAPE) : if (editor_load_landscape(path)) { gfx_invalidate_screen(); window_loadsave_invoke_callback(MODAL_RESULT_OK); } else { // 1050, not the best message... window_error_open(STR_LOAD_LANDSCAPE, 1050); window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_LANDSCAPE) : rw = SDL_RWFromFile(path, "wb+"); if (rw != NULL) { scenario_set_filename(path); int success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); SDL_RWclose(rw); if (success) { window_close_by_class(WC_LOADSAVE); gfx_invalidate_screen(); window_loadsave_invoke_callback(MODAL_RESULT_OK); } else { window_error_open(STR_SAVE_LANDSCAPE, 1049); window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } } else { window_error_open(STR_SAVE_LANDSCAPE, 1049); window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; case (LOADSAVETYPE_SAVE | LOADSAVETYPE_SCENARIO) : { rct_s6_info *s6Info = (rct_s6_info*)0x0141F570; int parkFlagsBackup = RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32); RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) &= ~PARK_FLAGS_18; s6Info->editor_step = 255; rw = SDL_RWFromFile(path, "wb+"); int success = 0; if (rw != NULL) { scenario_set_filename(path); success = scenario_save(rw, gConfigGeneral.save_plugin_data ? 3 : 2); SDL_RWclose(rw); } RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) = parkFlagsBackup; if (success) { window_close_by_class(WC_LOADSAVE); window_loadsave_invoke_callback(MODAL_RESULT_OK); title_load(); } else { window_error_open(STR_FILE_DIALOG_TITLE_SAVE_SCENARIO, STR_SCENARIO_SAVE_FAILED); s6Info->editor_step = EDITOR_STEP_OBJECTIVE_SELECTION; window_loadsave_invoke_callback(MODAL_RESULT_FAIL); } break; } case (LOADSAVETYPE_LOAD | LOADSAVETYPE_TRACK) : window_install_track_open(path); window_close_by_class(WC_LOADSAVE); window_loadsave_invoke_callback(MODAL_RESULT_OK); break; } }
int rct2_init() { log_verbose("initialising game"); RCT2_GLOBAL(RCT2_ADDRESS_SCENARIO_TICKS, uint32) = 0; RCT2_GLOBAL(0x009AC310, char*) = RCT2_GLOBAL(RCT2_ADDRESS_CMDLINE, char*); get_system_time(); util_srand((unsigned int)time(0)); RCT2_GLOBAL(0x009DEA69, short) = RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_DAY, short); RCT2_GLOBAL(0x009DEA6B, short) = RCT2_GLOBAL(RCT2_ADDRESS_OS_TIME_MONTH, short); if (!rct2_init_directories()) return 0; if (!rct2_startup_checks()) return 0; config_reset_shortcut_keys(); config_shortcut_keys_load(); RCT2_GLOBAL(RCT2_ADDRESS_PLACE_OBJECT_MODIFIER, uint8) = 0; // config_load(); object_list_load(); scenario_load_list(); ride_list_item item = { 253, 0 }; track_load_list(item); gfx_load_g1(); gfx_load_g2(); font_sprite_initialise_characters(); if (!gOpenRCT2Headless) { platform_init(); audio_init_ride_sounds_and_info(); } viewport_init_all(); news_item_init_queue(); get_local_time(); reset_park_entrances(); user_string_clear_all(); reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); staff_reset_modes(); map_init(150); park_init(); if (!gOpenRCT2Headless) window_title_menu_open(); date_reset(); climate_reset(CLIMATE_COOL_AND_WET); scenery_set_default_placement_configuration(); window_new_ride_init_vars(); window_guest_list_init_vars_b(); window_staff_list_init_vars(); if (!gOpenRCT2Headless) { title_load(); gfx_clear(RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo), 10); } log_verbose("initialising game finished"); return 1; }