Support SysEng's quoted message commands

This commit is contained in:
kichikuou
2021-03-18 09:38:10 +09:00
parent 20e06235d2
commit 9a8ebbdcb0
5 changed files with 88 additions and 39 deletions
+32 -17
View File
@@ -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<char*>(begin), len);
buf[len] = '\0';
strncpy(buf, reinterpret_cast<char*>(begin), len);
buf[len] = '\0';
}
ags->draw_text(buf, text_wait_enb);
+1 -1
View File
@@ -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;
+5
View File
@@ -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);
+33 -15
View File
@@ -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';
+17 -6
View File
@@ -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';