From ad7501f962ef0ea1cf3273c6f3b2c378acaa6d27 Mon Sep 17 00:00:00 2001 From: Nunuhara Cabbage Date: Fri, 6 Mar 2020 22:43:42 -0800 Subject: [PATCH] Implement system.MsgBoxOkCancel --- src/instructions.c | 4 ++-- src/vm.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/instructions.c b/src/instructions.c index f5e7f03..017bf2c 100644 --- a/src/instructions.c +++ b/src/instructions.c @@ -54,7 +54,7 @@ const struct syscall syscalls[NR_SYSCALLS] = { SYS ( SYS_ERROR, Error ), SYS ( SYS_EXISTS_SAVE_FILE, ExistsSaveFile ), SYS ( SYS_IS_DEBUG_MODE, IsDebugMode ), - TODO ( SYS_MSGBOX_OK_CANCEL, MsgBoxOkCancel ), + SYS ( SYS_MSGBOX_OK_CANCEL, MsgBoxOkCancel ), SYS ( SYS_GET_FUNC_STACK_NAME, GetFuncStackName ), SYS ( SYS_PEEK, Peek ), SYS ( SYS_SLEEP, Sleep ), @@ -243,7 +243,7 @@ struct instruction instructions[NR_OPCODES] = { TODO ( R_NOTE, 0 ), OP ( SH_LOCALCREATE, 2, T_LOCAL, T_STRUCT ), OP ( SH_LOCALDELETE, 1, T_LOCAL ), - TODO ( STOI, 0 ), + OP ( STOI, 0 ), OP ( A_PUSHBACK, 0 ), OP ( A_POPBACK, 0 ), OP ( S_EMPTY, 0 ), diff --git a/src/vm.c b/src/vm.c index e66055e..1bc6008 100644 --- a/src/vm.c +++ b/src/vm.c @@ -328,6 +328,11 @@ static void function_return(void) call_stack_ptr--; } +static const SDL_MessageBoxButtonData buttons[] = { + { SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT, 1, "OK" }, + { SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT, 0, "Cancel" }, +}; + static void system_call(enum syscall_code code) { switch (code) { @@ -372,6 +377,29 @@ static void system_call(enum syscall_code code) // XXX: caller S_POPs break; } + case SYS_MSGBOX_OK_CANCEL: { + int result = 0; + struct string *str = stack_peek_string(0); + char *utf = sjis2utf(str->text, str->size); + + const SDL_MessageBoxData mbox = { + SDL_MESSAGEBOX_INFORMATION, + NULL, + "xsystem4", + str->text, + SDL_arraysize(buttons), + buttons, + NULL + }; + if (SDL_ShowMessageBox(&mbox, &result)) { + WARNING("Error displaying message box"); + } + // ... + free(utf); + heap_unref(stack_pop().i); + stack_push(result); + break; + } case SYS_RESUME_SAVE: { union vm_value *success = stack_pop_var(); struct string *filename = stack_peek_string(0);