diff --git a/src/sdlmain.cpp b/src/sdlmain.cpp index 69ad134..c3c05c4 100644 --- a/src/sdlmain.cpp +++ b/src/sdlmain.cpp @@ -90,11 +90,11 @@ int main(int argc, char *argv[]) EM_ASM( xsystem35.shell.windowSizeChanged(); ); #endif - bool restart = true; - while (restart) { - restart = g_nact->mainloop(); + int exit_code = NACT_RESTART; + while (exit_code == NACT_RESTART) { + exit_code = g_nact->mainloop(); delete g_nact; - if (restart) + if (exit_code == NACT_RESTART) g_nact = NACT::create(config); } @@ -106,7 +106,7 @@ int main(int argc, char *argv[]) romfsExit(); #endif - return 0; + return exit_code; } #ifdef __EMSCRIPTEN__ @@ -115,7 +115,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void sys_restart() { - g_nact->quit(true); + g_nact->quit(NACT_RESTART); } #endif diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index f598b1f..2cb27b8 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -109,7 +109,6 @@ NACT::NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const Config& config) } terminate = false; - restart_after_terminate = false; } NACT::~NACT() @@ -126,7 +125,7 @@ NACT::~NACT() platform_finalize(); } -bool NACT::mainloop() +int NACT::mainloop() { msgskip->load_from_file(); @@ -138,13 +137,17 @@ bool NACT::mainloop() sys_sleep(10); } } - return restart_after_terminate; + while (exit_code == NACT_HALT) { + // exit_code can change if the user selects restart or exit from the menu. + sys_sleep(16); + } + return exit_code; } -void NACT::quit(bool restart) +void NACT::quit(int code) { + exit_code = code; terminate = true; - restart_after_terminate = restart; } // コマンドパーサ @@ -155,14 +158,6 @@ void NACT::execute() // アドレスの確認 if(scenario_addr < 2 || scenario_addr >= scenario_size) { fatal("Scenario error"); - } - - // 致命的なエラー発生 or 正常終了 - if(fatal_error) { - if(!post_quit) { - quit(false); - } - post_quit = true; return; } @@ -563,7 +558,7 @@ void NACT::fatal(const char* format, ...) { vsnprintf(buf, sizeof buf, format, args); SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Fatal Error: %s", buf); SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "system3", buf, g_window); - fatal_error = true; + quit(0); } NACT* NACT::create(const Config& config) { diff --git a/src/sys/nact.h b/src/sys/nact.h index 1c6a26d..819fb4c 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -90,6 +90,10 @@ enum Language { ENGLISH = 1, }; +// special codes for NACT::exit_code +const int NACT_HALT = -1; +const int NACT_RESTART = -2; + class NACT { public: @@ -106,9 +110,6 @@ protected: void execute(); void load_scenario(int page); - bool fatal_error = false; - bool post_quit = false; - // ADISK.DAT, ASLEEP.DAT char adisk[16]; @@ -245,16 +246,16 @@ protected: // 終了フラグ bool terminate; - bool restart_after_terminate; + int exit_code; // Platform-specific setup / cleanup code void platform_initialize(); void platform_finalize(); public: - bool mainloop(); + int mainloop(); void sys_sleep(int ms); - void quit(bool restart); + void quit(int code); int get_screen_height(); diff --git a/src/sys/nact_input.cpp b/src/sys/nact_input.cpp index b8c9b32..82a7bf9 100644 --- a/src/sys/nact_input.cpp +++ b/src/sys/nact_input.cpp @@ -32,7 +32,7 @@ void NACT::pump_events() switch (e.type) { case SDL_QUIT: - quit(false); + quit(0); break; case SDL_WINDOWEVENT: diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 06b0a52..5a2196b 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -1017,8 +1017,7 @@ void NACT_Sys1::cmd_y() break; case 2: if(param == 0) { - post_quit = true; - fatal_error = true; + quit(NACT_HALT); } else { WAIT(100) } @@ -1027,8 +1026,7 @@ void NACT_Sys1::cmd_y() WAIT(param * 1000) break; case 255: - post_quit = true; - fatal_error = true; + quit(NACT_HALT); break; } } else if (crc32_a == CRC32_GAKUEN || crc32_a == CRC32_GAKUEN_ENG) { @@ -1154,19 +1152,17 @@ void NACT_Sys1::cmd_y() ags->draw_hankaku = (param == 1) ? true : false; break; case 253: - post_quit = false; - fatal_error = true; + quit(0); break; case 254: RND = 0; break; case 255: if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) { - post_quit = false; + quit(0); } else { - post_quit = true; + quit(NACT_HALT); } - fatal_error = true; break; } } diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index 81c4d70..70dba0d 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -1242,8 +1242,7 @@ void NACT_Sys2::cmd_y() RND = 0; break; case 255: - post_quit = (param == 1) ? true : false; - fatal_error = true; + quit(param == 1 ? NACT_HALT : 0); break; } // Y1 diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index 87592fc..f816040 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -1402,8 +1402,7 @@ void NACT_Sys3::cmd_y() RND = (crc32_a == CRC32_YAKATA3_CD || crc32_a == CRC32_YAKATA3_FD || crc32_a == CRC32_NINGYO) ? 1 : 0; break; case 255: - post_quit = (param == 1) ? true : false; - fatal_error = true; + quit(param == 1 ? NACT_HALT : 0); break; } } diff --git a/src/win/nact_win.cpp b/src/win/nact_win.cpp index 353551f..14e5aa7 100644 --- a/src/win/nact_win.cpp +++ b/src/win/nact_win.cpp @@ -177,10 +177,10 @@ bool NACT::handle_platform_event(const SDL_Event& e) save_screenshot(ags); break; case ID_RESTART: - quit(true); + quit(NACT_RESTART); break; case ID_EXIT: - quit(false); + quit(0); break; case ID_SCREEN_WINDOW: SDL_SetWindowFullscreen(g_window, 0);