diff --git a/src/ags.c b/src/ags.c index fc32ea0..d071cc7 100644 --- a/src/ags.c +++ b/src/ags.c @@ -117,11 +117,18 @@ void ags_init(const char *render_driver) { cg_init(); } -void ags_remove() { +void ags_remove(void) { ags_autorepeat(TRUE); sdl_Remove(); } +void ags_reset(void) { + nact->ags.mouse_movesw = 2; + nact->ags.eventcb = NULL; + initPal(&pal_256); + cg_reset(); +} + void ags_setWorldSize(int width, int height, int depth) { nact->ags.world_size.width = width; nact->ags.world_size.height = height; diff --git a/src/ags.h b/src/ags.h index 1ddfad3..159f9e2 100644 --- a/src/ags.h +++ b/src/ags.h @@ -126,8 +126,9 @@ typedef struct _ags ags_t; /* 初期化関係 */ -extern void ags_init(const char *render_driver); -extern void ags_remove(); +void ags_init(const char *render_driver); +void ags_remove(void); +void ags_reset(void); /* ウィンド関係 */ extern void ags_setWorldSize(int width, int height, int depth); diff --git a/src/cg.c b/src/cg.c index e4f61dc..ad56049 100644 --- a/src/cg.c +++ b/src/cg.c @@ -41,20 +41,20 @@ #include "cache.h" /* VSPのパレット展開バンク */ -int cg_vspPB = -1; +int cg_vspPB; /* cg,palette 展開フラグ (funciotn flag) */ -int cg_fflg = 7; +int cg_fflg; /* CGをロードした回数を書き込む変数 */ -int *cg_loadCountVar = NULL; +int *cg_loadCountVar; /* Brightness (PD command) */ -int cg_brightness = 255; +int cg_brightness; #define GCMD_EXTRACTCG(c) ((c) & 0x01) #define GCMD_SET_PALETTE(c) ((c) & 0x02) #define GCMD_LOAD_PALETTE(c) ((c) & 0x04) /* CG表示位置に関する情報 */ -static CG_WHERETODISP loc_policy = OFFSET_NOMOVE, loc_policy0; +static CG_WHERETODISP loc_policy, loc_policy0; static MyPoint loc_where, loc_where0; /* extracted cg data cache control object */ @@ -244,8 +244,19 @@ static cgdata *loader(int no) { /* * Initilize cache */ -void cg_init() { +void cg_init(void) { cacheid = cache_new(cgdata_free); + cg_reset(); +} + +void cg_reset(void) { + cg_vspPB = -1; + cg_fflg = 7; + cg_loadCountVar = NULL; + cg_brightness = 255; + loc_policy = loc_policy0 = OFFSET_NOMOVE; + memset(&loc_where, 0, sizeof(loc_where)); + memset(&loc_where0, 0, sizeof(loc_where0)); } /* diff --git a/src/cg.h b/src/cg.h index c10ec33..d5c006d 100644 --- a/src/cg.h +++ b/src/cg.h @@ -72,7 +72,8 @@ typedef enum { OFFSET_RELATIVE_JC /* relative location and use til J4 cmd */ } CG_WHERETODISP; -extern void cg_init(); +extern void cg_init(void); +extern void cg_reset(void); extern void cg_set_display_location(int x, int y, CG_WHERETODISP policy); extern void cg_load(int no, int flg); extern void cg_load_with_alpha(int cgno, int shadowno); diff --git a/src/cmd2F.c b/src/cmd2F.c index 5c57af9..33540b8 100644 --- a/src/cmd2F.c +++ b/src/cmd2F.c @@ -1527,5 +1527,11 @@ void commands2F8B() { void commands2F8C() { DEBUG_COMMAND("sysReset:\n"); - sys_reset(); + nact_quit(TRUE); +} + +void cmd2F_reset(void) { + cb_sel_init_page = 0; + cb_sel_init_address = 0; + memset(fnctbl, 0, sizeof(fnctbl)); } diff --git a/src/cmdv.c b/src/cmdv.c index 33e4eee..408ceac 100644 --- a/src/cmdv.c +++ b/src/cmdv.c @@ -964,7 +964,7 @@ static void va_updatePreArea(int i) { ags_updateArea(VAcmd[i].preX, VAcmd[i].preY, VAcmd[i].unitWidth, VAcmd[i].unitHeight); } -void va_animation() { +void va_animation(void) { int i; int x, y, w, h; @@ -1050,3 +1050,29 @@ static void va_update() { status_check_count = 0; #endif } + +void va_reset(void) { + free(UnitMap); + UnitMap = NULL; + + nPageNum = 0; + x0Map = 0; + y0Map = 0; + cxMap = 0; + cyMap = 0; + cxUnit = 0; + cyUnit = 0; + + free(_vh_src); + free(_vh_dst); + _vh_src = vh_src = NULL; + _vh_dst = vh_dst = NULL; + vh_cnt_src = 0; + vh_cnt_dst = 0; + + free(srcimg); + srcimg = NULL; + + memset(VAcmd, 0, sizeof(VAcmd)); + inAnimation = FALSE; +} diff --git a/src/cmdz.c b/src/cmdz.c index 401a7ef..d1fc7db 100644 --- a/src/cmdz.c +++ b/src/cmdz.c @@ -566,3 +566,7 @@ void commandZU() { DEBUG_COMMAND("ZU %d:\n",sw); } + +void cmdz_reset(void) { + memset(counters, 0, sizeof(counters)); +} diff --git a/src/debugger.c b/src/debugger.c index 8a1cafa..be95e3b 100644 --- a/src/debugger.c +++ b/src/debugger.c @@ -51,9 +51,9 @@ void dbg_init(const char *symbols_path, boolean use_dap) { dbg_impl->init(symbols_path); } -void dbg_quit(bool restart) { +void dbg_quit(void) { if (dbg_impl) - dbg_impl->quit(restart); + dbg_impl->quit(); } int dbg_lookup_var(const char *name) { diff --git a/src/debugger.h b/src/debugger.h index 3cb3a00..f8a5c55 100644 --- a/src/debugger.h +++ b/src/debugger.h @@ -42,7 +42,7 @@ extern DebuggerState dbg_state; #define dbg_trapped() (dbg_state != DBG_RUNNING) void dbg_init(const char *symbols_path, boolean use_dap); -void dbg_quit(bool restart); +void dbg_quit(void); void dbg_main(int bp_no); void dbg_onsleep(void); BYTE dbg_handle_breakpoint(int page, int addr); @@ -52,7 +52,7 @@ boolean dbg_console_vprintf(int lv, const char *format, va_list ap); #define dbg_trapped() false #define dbg_init(symbols_path, use_dap) -#define dbg_quit(restart) +#define dbg_quit() #define dbg_main(bp_no) #define dbg_onsleep() #define dbg_handle_breakpoint(page, addr) BREAKPOINT diff --git a/src/debugger_cui.c b/src/debugger_cui.c index f79cc78..b5d0ce0 100644 --- a/src/debugger_cui.c +++ b/src/debugger_cui.c @@ -344,7 +344,7 @@ static void dbg_cui_init(const char *symbols_path) { dbg_state = DBG_STOPPED_ENTRY; } -static void dbg_cui_quit(bool restart) { +static void dbg_cui_quit(void) { } typedef struct { diff --git a/src/debugger_dap.c b/src/debugger_dap.c index 9170489..293448a 100644 --- a/src/debugger_dap.c +++ b/src/debugger_dap.c @@ -82,14 +82,10 @@ static void emit_initialized_event(void) { send_json(event); } -static void emit_terminated_event(bool restart) { - cJSON *event = cJSON_CreateObject(), *body; +static void emit_terminated_event(void) { + cJSON *event = cJSON_CreateObject(); cJSON_AddStringToObject(event, "type", "event"); cJSON_AddStringToObject(event, "event", "terminated"); - if (restart) { - cJSON_AddItemToObjectCS(event, "body", body = cJSON_CreateObject()); - cJSON_AddBoolToObject(body, "restart", true); - } send_json(event); } @@ -590,10 +586,8 @@ static void dbg_dap_init(const char *path) { } } -static void dbg_dap_quit(bool restart) { - emit_terminated_event(restart); - if (restart) - exit(0); // The front end will restart xsystem35, so we can just exit. +static void dbg_dap_quit(void) { + emit_terminated_event(); } static void dbg_dap_repl(int bp_no) { diff --git a/src/debugger_private.h b/src/debugger_private.h index a7fcfd0..77acd16 100644 --- a/src/debugger_private.h +++ b/src/debugger_private.h @@ -55,7 +55,7 @@ typedef struct { typedef struct { void (*init)(const char *symbols_path); - void (*quit)(bool restart); + void (*quit)(void); void (*repl)(int bp_no); void (*onsleep)(void); void (*console_output)(int lv, const char *output); diff --git a/src/menu.h b/src/menu.h index d842602..480928c 100644 --- a/src/menu.h +++ b/src/menu.h @@ -47,6 +47,7 @@ typedef struct inputnum_param { extern void menu_open(void); extern void menu_quitmenu_open(void); +extern void menu_resetmenu_open(void); extern boolean menu_inputstring(INPUTSTRING_PARAM *); extern boolean menu_inputstring2(INPUTSTRING_PARAM *); extern boolean menu_inputnumber(INPUTNUM_PARAM *); diff --git a/src/menu_callback.c b/src/menu_callback.c index 1ec82b2..c6d8755 100644 --- a/src/menu_callback.c +++ b/src/menu_callback.c @@ -178,7 +178,7 @@ on_button5_clicked (GtkButton *button, gpointer user_data) { menu_ok_exit = TRUE; - nact->is_quit = TRUE; + nact_quit(FALSE); nact->popupmenu_opened = FALSE; } diff --git a/src/menu_sdl.c b/src/menu_sdl.c index d758f55..c34ed61 100644 --- a/src/menu_sdl.c +++ b/src/menu_sdl.c @@ -56,8 +56,30 @@ void menu_quitmenu_open(void) { return; } if (buttonid == 1) { - nact->is_quit = TRUE; - nact->wait_vsync = TRUE; + nact_quit(FALSE); + } +} + +void menu_resetmenu_open(void) { + const SDL_MessageBoxButtonData buttons[] = { + { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 1, "Restart" }, + { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, 0, "Cancel" }, + }; + const SDL_MessageBoxData messagebox_data = { + .flags = SDL_MESSAGEBOX_INFORMATION, + .window = sdl_window, + .title = "Confirm", + .message = "Restart the game?", + .numbuttons = SDL_arraysize(buttons), + .buttons = buttons, + }; + int buttonid = 0; + if (SDL_ShowMessageBox(&messagebox_data, &buttonid) < 0) { + WARNING("error displaying message box"); + return; + } + if (buttonid == 1) { + nact_quit(TRUE); } } diff --git a/src/message.c b/src/message.c index 64771c5..1045428 100644 --- a/src/message.c +++ b/src/message.c @@ -47,13 +47,10 @@ // static Bcom_WindowInfo winInfo = {8,311,616,80,0}; /* Window枠の種類 */ static int frameType; -static int frameCgNoTop; -static int frameCgNoMid; -static int frameCgNoBot; static int frameDot; /* 文字飾りの設定 */ -static int msgDecorateColor = 0; -static int msgDecorateType = 0; +static int msgDecorateColor; +static int msgDecorateType; /* 現在の文字表示位置 */ static MyPoint msgcur; static boolean nextLineIsAfterKaigyou = FALSE; @@ -90,6 +87,12 @@ void msg_init() { msg.mg_policyR = 0; msg.mg_policyA = 0; + for (int i = 0; i < MSGWINMAX; i++) { + if (msg.wininfo[i].savedimg) + ags_delRegion(msg.wininfo[i].savedimg); + } + memset(msg.wininfo, 0, sizeof(msg.wininfo)); + msg.winno = 1; msg.win = &msg.wininfo[0]; msg.wininfo[0].x = 8; @@ -97,6 +100,13 @@ void msg_init() { msg.wininfo[0].width = 616; msg.wininfo[0].height = 80; msg.wininfo[0].save = TRUE; + + // Private variables + msgDecorateColor = 0; + msgDecorateType = 0; + msgcur.x = 0; + msgcur.y = 0; + nextLineIsAfterKaigyou = FALSE; } void msg_setFontSize(int size) { @@ -304,9 +314,6 @@ void msg_openWindow(int W, int C1, int C2, int N, int M) { frameDot = 8; break; case WINDOW_FRAME_CG: - frameCgNoTop = C1; - frameCgNoMid = C2; - frameCgNoBot = N; frameDot = M; break; default: diff --git a/src/nact.c b/src/nact.c index 6811ef7..5b641c9 100644 --- a/src/nact.c +++ b/src/nact.c @@ -54,8 +54,6 @@ MG コマンド: 表示時の ZH に依存 */ -/* defined by cmdv.c */ -extern void va_animation(); /* 半角モード */ static int msg_msgHankakuMode = 0; /* 0:全角 1:半角, 2: 無変換 */ @@ -147,18 +145,56 @@ static void nact_callback() { if (nact->popupmenu_opened) { menu_gtkmainiteration(); } - if (nact->is_quit) { + if (nact->is_quit && !nact->restart) { sys_exit(0); } } void nact_init() { - nact->ags.mouse_movesw = 2; nact->is_quit = FALSE; + nact->restart = FALSE; + nact->callback = nact_callback; nact->is_va_animation = FALSE; nact->is_cursor_animation = FALSE; nact->is_message_locked = FALSE; + nact->encoding = SHIFT_JIS; + + free(nact->game_title_utf8); + nact->game_title_utf8 = NULL; + nact->scenario_version = 0; + + nact->datatbl_addr = NULL; + nact->fnc_return_value = 0; + + nact->messagewait_enable = FALSE; + nact->messagewait_cancelled = FALSE; + nact->messagewait_time = 0; + nact->messagewait_cancel = FALSE; + + msg_init(); nact->is_msg_out = TRUE; - nact->callback = nact_callback; + nact->msgout = NULL; + + sel_init(); + nact->patch_ec = 1; // TODO: revisit + nact->patch_emen = 0; + nact->patch_g0 = 0; + + msg_msgHankakuMode = 0; +} + +void nact_reset(void) { + nact_init(); + sl_reinit(); + v_reset(); + va_reset(); + cmdz_reset(); + cmd2F_reset(); +} + +void nact_quit(boolean restart) { + nact->is_quit = TRUE; + nact->restart = restart; + nact->wait_vsync = TRUE; } diff --git a/src/nact.h b/src/nact.h index 9e6dc8f..81676db 100644 --- a/src/nact.h +++ b/src/nact.h @@ -46,16 +46,26 @@ extern void sys_addMsg(const char *str); extern void sys_setHankakuMode(int mode); extern void sys_setCharacterEncoding(CharacterEncoding encoding); -// extern boolean sys_nact_engine(); extern void nact_main(); extern void nact_init(); +extern void nact_reset(void); +extern void nact_quit(boolean restart); // cmd_check.c extern void exec_command(void); +// cmdv.c +void va_animation(void); +void va_reset(void); +// cmdz.c +void cmdz_reset(void); +// cmd2F.c +void cmd2F_reset(void); + typedef struct { /* general */ boolean is_quit; /* quit command */ + boolean restart; void (*callback)(void); /* main の callback */ boolean is_va_animation; /* VA command working */ boolean is_cursor_animation; /* animation cursor working */ @@ -72,10 +82,7 @@ typedef struct { int fnc_return_value; /* 関数の戻り値として返す値 (~0,cali:で渡す値) */ /* key wait */ - int waittime; - int waitcancel_key; - int waitcancel_key_mask; - boolean waitcancel_enabled; + int waitcancel_key; // TODO: remove this /* message wait */ boolean messagewait_enable; diff --git a/src/scenario.c b/src/scenario.c index a5eec95..9acd5fd 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -69,6 +69,7 @@ boolean sl_init(void) { labelCallCnt = 0; pageCallCnt = 0; labelCallCnt_afterPageCall = 0; + dataPushCnt = 0; return TRUE; } diff --git a/src/sdl_cursor.c b/src/sdl_cursor.c index 3630443..594a935 100644 --- a/src/sdl_cursor.c +++ b/src/sdl_cursor.c @@ -133,6 +133,8 @@ boolean sdl_cursorNew(BYTE* data, int no, CursorImage *cursorImage, TCursorDirEn } } + if (cursor[no]) + SDL_FreeCursor(cursor[no]); cursor[no] = SDL_CreateCursor(buf3, buf4, 32, 32, cursordirentry->wxHotspot, cursordirentry->wyHotspot); free(buf1); diff --git a/src/selection.c b/src/selection.c index 75848f5..1b5b587 100644 --- a/src/selection.c +++ b/src/selection.c @@ -53,9 +53,9 @@ static char elm[ELEMENT_MAX][ELEMENT_LENGTH]; /* 選択したときに返す値 */ static int elmv[ELEMENT_MAX]; /* 現在登録中の選択肢の番号 */ -static int regnum = 0; +static int regnum; /* 選択肢の要素の最大長さ */ -static int maxElementLength = 0; +static int maxElementLength; /* 選択肢ウィンド退避 */ static MyRectangle saveArea; /* 選択ウィンドの退避用 */ @@ -69,7 +69,7 @@ static int cb_select_address; static int cb_cancel_page; static int cb_cancel_address; /* 選択肢 window を開いた時のマウスカーソルの動作 */ -static int default_element = 1; +static int default_element; /* 最後に選んだ選択肢の要素番号 */ static int last_selected_element; /* キーボードによる選択操作用 */ @@ -110,6 +110,12 @@ void sel_init() { sel.WinResizeWidth = FALSE; sel.WinResizeHeight = TRUE; + for (int i = 0; i < SELWINMAX; i++) { + if (sel.wininfo[i].savedimg) + ags_delRegion(sel.wininfo[i].savedimg); + } + memset(sel.wininfo, 0, sizeof(sel.wininfo)); + sel.winno = 1; sel.win = &sel.wininfo[0]; sel.wininfo[0].x = 464; @@ -120,6 +126,27 @@ void sel_init() { /* 選択肢を登録中 */ sel.in_setting = FALSE; + + // Private variables + memset(elm, 0, sizeof(elm)); + memset(elmv, 0, sizeof(elmv)); + regnum = 0; + maxElementLength = 0; + + if (saveimg) { + ags_delRegion(saveimg); + saveimg = NULL; + } + if (saveimg2) { + ags_delRegion(saveimg2); + saveimg2 = NULL; + } + cb_select_page = 0; + cb_select_address = 0; + cb_cancel_page = 0; + cb_cancel_address = 0; + default_element = 1; + last_selected_element = 0; } /* 登録された選択肢の個数を削減する */ diff --git a/src/system.h b/src/system.h index 940424b..3e717fc 100644 --- a/src/system.h +++ b/src/system.h @@ -30,7 +30,6 @@ extern void sys_error(char *format, ...); /* show nessafe and exit system */ extern void sys_exit(int code); /* exit system with code */ extern void sys_message(int lv, char *format, ...); /* show various message */ -extern void sys_reset(); /* DEBUGLEVEL diff --git a/src/variable.c b/src/variable.c index f034089..ebfa392 100644 --- a/src/variable.c +++ b/src/variable.c @@ -47,8 +47,8 @@ double longVar[SYSVARLONG_MAX]; /* 文字列変数 */ static char **strVar; /* 文字列変数の属性(最大,1つあたりの大きさ) */ -int strvar_cnt = STRVAR_MAX; -int strvar_len = STRVAR_LEN; +int strvar_cnt; +int strvar_len; int preVarPage; /* 直前にアクセスした変数のページ */ int preVarIndex; /* 直前にアクセスした変数のINDEX */ @@ -175,12 +175,28 @@ extern int svar_maxindex(void) { } /* 変数の初期化 */ -extern boolean v_initVars() { - strVar = calloc(STRVAR_MAX, sizeof(char *)); - if (strVar == NULL) { - NOMEMERR(); +void v_init(void) { + svar_init(STRVAR_MAX - 1, STRVAR_LEN); +} + +void v_reset(void) { + memset(sysVar, 0, sizeof(sysVar)); + memset(attributes, 0, sizeof(attributes)); + memset(longVar, 0, sizeof(longVar)); + + for (int i = 0; i < ARRAYVAR_PAGEMAX; i++) { + if (arrayVarBuffer[i].value) + free(arrayVarBuffer[i].value); } - return true; + memset(arrayVarBuffer, 0, sizeof(arrayVarBuffer)); + + for (int i = 0; i < strvar_cnt; i++) { + if (strVar[i]) { + free(strVar[i]); + strVar[i] = NULL; + } + } + svar_init(STRVAR_MAX - 1, STRVAR_LEN); } /* 文字変数への代入 */ diff --git a/src/variable.h b/src/variable.h index 2633690..a814cec 100644 --- a/src/variable.h +++ b/src/variable.h @@ -53,7 +53,8 @@ boolean v_allocateArrayBuffer(int page, int size, boolean saveflag); boolean v_defineArrayVar(int datavar, int *pointvar, int offset, int page); boolean v_releaseArrayVar(int datavar); boolean v_getArrayBufferStatus(int page); -boolean v_initVars(); +void v_init(void); +void v_reset(void); void svar_init(int max_index, int len); int svar_maxindex(void); diff --git a/src/win/menubar.c b/src/win/menubar.c index a57dc58..8373846 100644 --- a/src/win/menubar.c +++ b/src/win/menubar.c @@ -74,6 +74,9 @@ void win_menu_onsyswmevent(SDL_SysWMmsg* msg) { case ID_SCREENSHOT: saveScreenshot(); break; + case ID_RESTART: + menu_resetmenu_open(); + break; case ID_EXIT: menu_quitmenu_open(); break; diff --git a/src/win/resources.h b/src/win/resources.h index b4a08f0..e1122bc 100644 --- a/src/win/resources.h +++ b/src/win/resources.h @@ -29,7 +29,8 @@ #define IDS_CHOOSE_GAME_FOLDER 1001 #define ID_SCREENSHOT 40001 -#define ID_EXIT 40002 +#define ID_RESTART 40002 +#define ID_EXIT 40003 #define ID_SCREEN_WINDOW 40011 #define ID_SCREEN_FULL 40012 #define ID_MSGSKIP 40020 diff --git a/src/win/resources.rc b/src/win/resources.rc index 4e03e61..6738a47 100644 --- a/src/win/resources.rc +++ b/src/win/resources.rc @@ -12,6 +12,7 @@ IDR_MENU1 MENU DISCARDABLE POPUP "File" { MENUITEM "Save Screenshot", ID_SCREENSHOT + MENUITEM "Restart", ID_RESTART MENUITEM "Exit", ID_EXIT } POPUP "Screen" @@ -45,6 +46,7 @@ IDR_MENU1 MENU DISCARDABLE POPUP "ファイル" { MENUITEM "画面保存", ID_SCREENSHOT + MENUITEM "再起動", ID_RESTART MENUITEM "閉じる", ID_EXIT } POPUP "画面" diff --git a/src/xsystem35.c b/src/xsystem35.c index 3716c09..93b8e1d 100644 --- a/src/xsystem35.c +++ b/src/xsystem35.c @@ -101,10 +101,6 @@ static boolean font_noantialias; /* fullscreen on from command line */ static boolean fs_on; -// for reboot -static int saved_argc; -static char **saved_argv; - static void sys35_usage(boolean verbose) { if (verbose) { puts("System35 for X Window System [proj. Rainy Moon]"); @@ -210,7 +206,7 @@ static void sys35_init() { sl_init(); - v_initVars(); + v_init(); ags_init(render_driver); @@ -223,16 +219,13 @@ static void sys35_init() { sgenrand(getpid()); - msg_init(); - sel_init(); - if (nact->files.ain) s39ain_init(nact->files.ain, &nact->ain); msgskip_init(nact->files.msgskip); } static void sys35_remove() { - dbg_quit(false); + dbg_quit(); mus_exit(); ags_remove(); #ifdef ENABLE_GTK @@ -240,15 +233,10 @@ static void sys35_remove() { #endif } -void sys_reset() { - mus_exit(); - ags_remove(); -#ifdef ENABLE_GTK - s39ini_remove(); -#endif - dbg_quit(true); // This may exit(). - execvp(saved_argv[0], saved_argv); - sys_error("exec fail"); +static void sys_reset(void) { + nact_reset(); + ags_reset(); + mus_reset(); } static void sys35_ParseOption(int *argc, char **argv) { @@ -462,9 +450,6 @@ int main(int argc, char **argv) { sys_set_signalhandler(SIGINT, SIG_IGN); #endif - saved_argc = argc; - saved_argv = argv; - #ifdef __ANDROID__ // Handle -gamedir option here so that .xsys35rc is loaded from that directory. if (strcmp(argv[1], "-gamedir") == 0) @@ -516,7 +501,15 @@ int main(int argc, char **argv) { dbg_init(symbols_path, debugger_mode == DEBUGGER_DAP); } - nact_main(); + for (;;) { + nact_main(); + if (nact->restart) { + sys_reset(); + } else { + break; + } + } + #ifdef __EMSCRIPTEN__ sdl_sleep(1000000000); #endif