Windows: Add "Restart" menu command

It resets all VM states and restart the game.
This commit is contained in:
kichikuou
2022-06-26 17:25:39 +09:00
parent 26db7f46f5
commit b15690d9b7
28 changed files with 252 additions and 84 deletions
+8 -1
View File
@@ -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;
+3 -2
View File
@@ -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);
+17 -6
View File
@@ -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));
}
/*
+2 -1
View File
@@ -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);
+7 -1
View File
@@ -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));
}
+27 -1
View File
@@ -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;
}
+4
View File
@@ -566,3 +566,7 @@ void commandZU() {
DEBUG_COMMAND("ZU %d:\n",sw);
}
void cmdz_reset(void) {
memset(counters, 0, sizeof(counters));
}
+2 -2
View File
@@ -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) {
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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 {
+4 -10
View File
@@ -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) {
+1 -1
View File
@@ -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);
+1
View File
@@ -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 *);
+1 -1
View File
@@ -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;
}
+24 -2
View File
@@ -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);
}
}
+15 -8
View File
@@ -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:
+41 -5
View File
@@ -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;
}
+12 -5
View File
@@ -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;
+1
View File
@@ -69,6 +69,7 @@ boolean sl_init(void) {
labelCallCnt = 0;
pageCallCnt = 0;
labelCallCnt_afterPageCall = 0;
dataPushCnt = 0;
return TRUE;
}
+2
View File
@@ -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);
+30 -3
View File
@@ -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;
}
/* 登録された選択肢の個数を削減する */
-1
View File
@@ -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
+23 -7
View File
@@ -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);
}
/* 文字変数への代入 */
+2 -1
View File
@@ -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);
+3
View File
@@ -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;
+2 -1
View File
@@ -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
+2
View File
@@ -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 "画面"
+15 -22
View File
@@ -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