From 9a8ebbdcb0445381feddf13d53963bb41e64d844 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Thu, 18 Mar 2021 09:06:41 +0900 Subject: [PATCH] Support SysEng's quoted message commands --- src/sys/nact.cpp | 49 ++++++++++++++++++++++++++++--------------- src/sys/nact.h | 2 +- src/sys/nact_sys1.cpp | 5 +++++ src/sys/nact_sys2.cpp | 48 +++++++++++++++++++++++++++++------------- src/sys/nact_sys3.cpp | 23 ++++++++++++++------ 5 files changed, 88 insertions(+), 39 deletions(-) diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index 572bd2e..d2df264 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -275,10 +275,13 @@ void NACT::execute() case 'Z': cmd_z(); break; + case '\'': case '"': + message(cmd); + break; default: if(is_1byte_message(cmd) || is_2byte_message(cmd)) { ungetd(); - message(); + message(0); } else { if(cmd >= 0x20 && cmd < 0x7f) { fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr); @@ -290,24 +293,36 @@ void NACT::execute() } } -void NACT::message() +void NACT::message(uint8_t terminator) { - uint8* begin = &scenario_data[scenario_addr]; - uint8* end = begin; - for (;;) { - if (is_1byte_message(*end)) - end++; - else if (is_2byte_message(*end)) - end += 2; - else - break; - } - int len = end - begin; - scenario_addr += len; + char buf[200]; + if (terminator) { // SysEng + uint8* p = &scenario_data[scenario_addr]; + char* q = buf; + while (*p != terminator) { + if (*p == '\\') + p++; + *q++ = *p++; + } + *q = '\0'; + scenario_addr += p + 1 - &scenario_data[scenario_addr]; + } else { + uint8* begin = &scenario_data[scenario_addr]; + uint8* end = begin; + for (;;) { + if (is_1byte_message(*end)) + end++; + else if (is_2byte_message(*end)) + end += 2; + else + break; + } + int len = end - begin; + scenario_addr += len; - char* buf = (char*)alloca(len + 1); - strncpy(buf, reinterpret_cast(begin), len); - buf[len] = '\0'; + strncpy(buf, reinterpret_cast(begin), len); + buf[len] = '\0'; + } ags->draw_text(buf, text_wait_enb); diff --git a/src/sys/nact.h b/src/sys/nact.h index e2860fd..9133ff5 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -127,7 +127,7 @@ protected: char tvar_stack[30][10][22]; // int tvar_index; - void message(); + void message(uint8 terminator); // Commands virtual void cmd_calc() = 0; diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index d06bcbc..185f95c 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -212,6 +212,11 @@ void NACT_Sys1::cmd_branch() } else if(is_2byte_message(cmd)) { // message (2 bytes) getd(); + } else if (cmd == '\'' || cmd == '"') { // SysEng + for (uint8_t c = getd(); c != cmd; c = getd()) { + if (c == '\\') + getd(); + } } else { if(cmd >= 0x20 && cmd < 0x7f) { fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr); diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index b3d4794..89db34e 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -171,15 +171,17 @@ void NACT_Sys2::cmd_branch() } else if(cmd == 'L') { getd(); } else if(cmd == 'M') { - for(;;) { - uint8 val = getd(); - if(is_1byte_message(val)) { - // message (1 byte) - } else if(is_2byte_message(val)) { - // message (2 bytes) - getd(); - } else if(val == ':') { - break; + uint8 val = getd(); + if (val == '\'' || val == '"') { // SysEng + for (uint8_t c = getd(); c != val; c = getd()) { + if (c == '\\') + getd(); + } + } else { + while (val != ':') { + if(is_2byte_message(val)) + getd(); + val = getd(); } } } else if(cmd == 'N') { @@ -262,6 +264,11 @@ void NACT_Sys2::cmd_branch() } else if(is_2byte_message(cmd)) { // message (2 bytes) getd(); + } else if (cmd == '\'' || cmd == '"') { // SysEng + for (uint8_t c = getd(); c != cmd; c = getd()) { + if (c == '\\') + getd(); + } } else { if(cmd >= 0x20 && cmd < 0x7f) { fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr); @@ -849,15 +856,26 @@ void NACT_Sys2::cmd_l() void NACT_Sys2::cmd_m() { char string[33]; - int d, p = 0; + int p = 0; - while((d = getd()) != ':') { - if(is_2byte_message(d)) { - string[p++] = d; - string[p++] = getd(); - } else { + int d = getd(); + if (d == '\'' || d == '"') { // SysEng + int terminator = d; + while ((d = getd()) != terminator) { + if (d == '\\') + d = getd(); string[p++] = d; } + } else { + while(d != ':') { + if(is_2byte_message(d)) { + string[p++] = d; + string[p++] = getd(); + } else { + string[p++] = d; + } + d = getd(); + } } string[p] = '\0'; diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index 4a6f1f3..be36982 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -708,15 +708,26 @@ void NACT_Sys3::cmd_l() void NACT_Sys3::cmd_m() { char string[22]; - int d, p = 0; + int p = 0; - while((d = getd()) != ':') { - if(is_2byte_message(d)) { - string[p++] = d; - string[p++] = getd(); - } else { + int d = getd(); + if (d == '\'' || d == '"') { // SysEng + int terminator = d; + while ((d = getd()) != terminator) { + if (d == '\\') + d = getd(); string[p++] = d; } + } else { + while(d != ':') { + if(is_2byte_message(d)) { + string[p++] = d; + string[p++] = getd(); + } else { + string[p++] = d; + } + d = getd(); + } } string[p] = '\0';