mirror of
https://github.com/kichikuou/system3-sdl2.git
synced 2026-10-10 00:08:26 +03:00
Introduce Scenario class
This commit is contained in:
+86
-92
@@ -125,11 +125,11 @@ void NACT_Sys1::opening()
|
||||
|
||||
void NACT_Sys1::cmd_calc()
|
||||
{
|
||||
int index = getd();
|
||||
int index = sco.getd();
|
||||
if(0x80 <= index && index <= 0xbf) {
|
||||
index &= 0x3f;
|
||||
} else {
|
||||
index = ((index & 0x3f) << 8) | getd();
|
||||
index = ((index & 0x3f) << 8) | sco.getd();
|
||||
}
|
||||
var[index] = cali();
|
||||
|
||||
@@ -145,13 +145,13 @@ void NACT_Sys1::cmd_branch()
|
||||
if(!condition) {
|
||||
// 次の'}'命令までスキップする(ネストも考慮する)
|
||||
for(;;) {
|
||||
prev_addr = scenario_addr;
|
||||
uint8 cmd = getd();
|
||||
prev_addr = sco.addr();
|
||||
uint8 cmd = sco.getd();
|
||||
|
||||
if(cmd == '!') {
|
||||
int index = getd();
|
||||
int index = sco.getd();
|
||||
if(!(0x80 <= index && index <= 0xbf)) {
|
||||
getd();
|
||||
sco.getd();
|
||||
}
|
||||
cali();
|
||||
} else if(cmd == '{') {
|
||||
@@ -164,29 +164,29 @@ void NACT_Sys1::cmd_branch()
|
||||
break;
|
||||
}
|
||||
} else if(cmd == '@') {
|
||||
getw();
|
||||
sco.getw();
|
||||
} else if(cmd == '\\') {
|
||||
getw();
|
||||
sco.getw();
|
||||
} else if(cmd == '&') {
|
||||
cali();
|
||||
} else if(cmd == '%') {
|
||||
cali();
|
||||
} else if(cmd == '$') {
|
||||
if(!set_menu) {
|
||||
getw();
|
||||
sco.getw();
|
||||
set_menu = true;
|
||||
} else {
|
||||
set_menu = false;
|
||||
}
|
||||
} else if(cmd == '[') {
|
||||
getd();
|
||||
getd();
|
||||
getw();
|
||||
sco.getd();
|
||||
sco.getd();
|
||||
sco.getw();
|
||||
} else if(cmd == ':') {
|
||||
cali();
|
||||
getd();
|
||||
getd();
|
||||
getw();
|
||||
sco.getd();
|
||||
sco.getd();
|
||||
sco.getw();
|
||||
} else if(cmd == ']') {
|
||||
|
||||
} else if(cmd == 'A') {
|
||||
@@ -194,22 +194,22 @@ void NACT_Sys1::cmd_branch()
|
||||
} else if(cmd == 'F') {
|
||||
|
||||
} else if(cmd == 'G') {
|
||||
getd();
|
||||
sco.getd();
|
||||
} else if(cmd == 'L') {
|
||||
getd();
|
||||
sco.getd();
|
||||
} else if(cmd == 'P') {
|
||||
getd();
|
||||
sco.getd();
|
||||
} else if(cmd == 'Q') {
|
||||
getd();
|
||||
sco.getd();
|
||||
} else if(cmd == 'R') {
|
||||
|
||||
} else if(cmd == 'S') {
|
||||
getd();
|
||||
sco.getd();
|
||||
} else if(cmd == 'U') {
|
||||
getd();
|
||||
getd();
|
||||
sco.getd();
|
||||
sco.getd();
|
||||
} else if(cmd == 'X') {
|
||||
getd();
|
||||
sco.getd();
|
||||
} else if(cmd == 'Y') {
|
||||
cali();
|
||||
cali();
|
||||
@@ -217,14 +217,14 @@ void NACT_Sys1::cmd_branch()
|
||||
cali();
|
||||
cali();
|
||||
} else if (cmd == '\'' || cmd == '"') { // SysEng
|
||||
skip_string(cmd);
|
||||
sco.skip_string(encoding.get(), cmd);
|
||||
} else if (is_message(cmd)) {
|
||||
ungetd();
|
||||
scenario_addr += encoding->mblen(&scenario_data[scenario_addr]);
|
||||
sco.ungetd();
|
||||
sco.skip(encoding->mblen(sco.ptr()));
|
||||
} else if (cmd >= 0x20 && cmd < 0x7f) {
|
||||
fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr);
|
||||
fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, sco.page(), prev_addr);
|
||||
} else {
|
||||
fatal("Unknown Command: %02x at page = %d, addr = %d", cmd, scenario_page, prev_addr);
|
||||
fatal("Unknown Command: %02x at page = %d, addr = %d", cmd, sco.page(), prev_addr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -234,15 +234,15 @@ void NACT_Sys1::cmd_branch()
|
||||
|
||||
void NACT_Sys1::cmd_label_jump()
|
||||
{
|
||||
int next_addr = getw();
|
||||
scenario_addr = next_addr;
|
||||
int next_addr = sco.getw();
|
||||
sco.jump_to(next_addr);
|
||||
|
||||
output_console("\n@%x:", next_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_label_call()
|
||||
{
|
||||
int next_addr = getw();
|
||||
int next_addr = sco.getw();
|
||||
|
||||
output_console("\n\\%x:", next_addr);
|
||||
|
||||
@@ -252,19 +252,17 @@ void NACT_Sys1::cmd_label_call()
|
||||
// fatal_error = true;
|
||||
return;
|
||||
}
|
||||
scenario_addr = label_stack[--label_depth];
|
||||
sco.jump_to(label_stack[--label_depth]);
|
||||
} else {
|
||||
label_stack[label_depth++] = scenario_addr;
|
||||
scenario_addr = next_addr;
|
||||
label_stack[label_depth++] = sco.addr();
|
||||
sco.jump_to(next_addr);
|
||||
}
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_page_jump()
|
||||
{
|
||||
int next_page = cali();
|
||||
load_scenario(next_page);
|
||||
scenario_page = next_page;
|
||||
scenario_addr = 2;
|
||||
sco.page_jump(next_page, 2);
|
||||
|
||||
output_console("\n&%d:", next_page);
|
||||
}
|
||||
@@ -284,13 +282,11 @@ void NACT_Sys1::cmd_page_call()
|
||||
next_page = page_stack[--page_depth];
|
||||
next_addr = addr_stack[page_depth];
|
||||
} else {
|
||||
page_stack[page_depth] = scenario_page;
|
||||
addr_stack[page_depth++] = scenario_addr;
|
||||
page_stack[page_depth] = sco.page();
|
||||
addr_stack[page_depth++] = sco.addr();
|
||||
next_addr = 2;
|
||||
}
|
||||
load_scenario(next_page);
|
||||
scenario_page = next_page;
|
||||
scenario_addr = next_addr;
|
||||
sco.page_jump(next_page, next_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_set_menu()
|
||||
@@ -306,7 +302,7 @@ void NACT_Sys1::cmd_set_menu()
|
||||
ags->clear_menu_window();
|
||||
ags->menu_dest_y = 0;
|
||||
}
|
||||
menu_addr[menu_index++] = getw();
|
||||
menu_addr[menu_index++] = sco.getw();
|
||||
ags->menu_dest_x = 2;
|
||||
ags->menu_dest_y += 2;
|
||||
ags->draw_menu = true;
|
||||
@@ -323,7 +319,7 @@ void NACT_Sys1::cmd_open_menu()
|
||||
output_console("\n]");
|
||||
|
||||
if(!menu_index) {
|
||||
scenario_addr = scenario_data[0] | (scenario_data[1] << 8);
|
||||
sco.jump_to(sco.default_addr());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -338,16 +334,16 @@ void NACT_Sys1::cmd_open_menu()
|
||||
return;
|
||||
|
||||
if (selection != -1) {
|
||||
scenario_addr = menu_addr[selection];
|
||||
sco.jump_to(menu_addr[selection]);
|
||||
}
|
||||
menu_index = 0;
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_set_verbobj()
|
||||
{
|
||||
int verb = getd();
|
||||
int obj = getd();
|
||||
int addr = getw();
|
||||
int verb = sco.getd();
|
||||
int obj = sco.getd();
|
||||
int addr = sco.getw();
|
||||
|
||||
menu_addr[menu_index] = addr;
|
||||
menu_verb[menu_index] = verb;
|
||||
@@ -360,9 +356,9 @@ void NACT_Sys1::cmd_set_verbobj()
|
||||
void NACT_Sys1::cmd_set_verbobj2()
|
||||
{
|
||||
int condition = cali();
|
||||
int verb = getd();
|
||||
int obj = getd();
|
||||
int addr = getw();
|
||||
int verb = sco.getd();
|
||||
int obj = sco.getd();
|
||||
int addr = sco.getw();
|
||||
|
||||
if(condition) {
|
||||
menu_addr[menu_index] = addr;
|
||||
@@ -450,7 +446,7 @@ top2:
|
||||
return;
|
||||
|
||||
if(selection == -1) {
|
||||
scenario_addr = scenario_data[0] | (scenario_data[1] << 8);
|
||||
sco.jump_to(sco.default_addr());
|
||||
} else if(id[selection] == -1) {
|
||||
goto top;
|
||||
} else {
|
||||
@@ -483,12 +479,12 @@ void NACT_Sys1::cmd_open_obj(int verb)
|
||||
}
|
||||
// 目的語がない場合
|
||||
if(chk[0] && cnt == 1) {
|
||||
scenario_addr = addr[0];
|
||||
sco.jump_to(addr[0]);
|
||||
return;
|
||||
}
|
||||
// 以後、obj=0は戻るとして扱う
|
||||
chk[0] = 0;
|
||||
addr[0] = scenario_data[0] | (scenario_data[1] << 8);
|
||||
addr[0] = sco.default_addr();
|
||||
|
||||
top:
|
||||
// メニュー項目の準備
|
||||
@@ -556,11 +552,11 @@ top2:
|
||||
return;
|
||||
|
||||
if(selection == -1) {
|
||||
scenario_addr = scenario_data[0] | (scenario_data[1] << 8);
|
||||
sco.jump_to(sco.default_addr());
|
||||
} else if(id[selection] == -1) {
|
||||
goto top;
|
||||
} else {
|
||||
scenario_addr = addr[id[selection]];
|
||||
sco.jump_to(addr[id[selection]]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -609,31 +605,31 @@ void NACT_Sys1::cmd_a()
|
||||
void NACT_Sys1::cmd_b()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'B' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'B' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_d()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'D' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'D' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_e()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'E' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'E' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_f()
|
||||
{
|
||||
output_console("\nF");
|
||||
|
||||
scenario_addr = 2;
|
||||
sco.jump_to(2);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_g()
|
||||
{
|
||||
int page = getd();
|
||||
int page = sco.getd();
|
||||
|
||||
output_console("\nG %d:", page);
|
||||
|
||||
@@ -659,30 +655,30 @@ void NACT_Sys1::cmd_g()
|
||||
void NACT_Sys1::cmd_h()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'H' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'H' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_i()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'I' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'I' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_j()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'J' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'J' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_k()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'K' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'K' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_l()
|
||||
{
|
||||
int index = getd();
|
||||
int index = sco.getd();
|
||||
|
||||
output_console("\nL %d:", index);
|
||||
|
||||
@@ -771,9 +767,7 @@ void NACT_Sys1::cmd_l()
|
||||
}
|
||||
fio.reset();
|
||||
|
||||
load_scenario(next_page);
|
||||
scenario_page = next_page;
|
||||
scenario_addr = next_addr;
|
||||
sco.page_jump(next_page, next_addr);
|
||||
|
||||
mako->play_music(next_music);
|
||||
}
|
||||
@@ -783,24 +777,24 @@ void NACT_Sys1::cmd_l()
|
||||
void NACT_Sys1::cmd_m()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'M' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'M' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_n()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'N' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'N' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_o()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'O' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'O' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_p()
|
||||
{
|
||||
int param = getd();
|
||||
int param = sco.getd();
|
||||
|
||||
ags->text_font_color = (uint8)((param & 0x7) + 16);
|
||||
|
||||
@@ -829,7 +823,7 @@ void NACT_Sys1::cmd_q()
|
||||
'4', ' ', 'A', 'L', 'I', 'C', 'E', '-', 'S', 'O', 'F', 'T', ' ', ' ', ' ', ' '
|
||||
};
|
||||
|
||||
int index = getd();
|
||||
int index = sco.getd();
|
||||
|
||||
output_console("\nQ %d:", index);
|
||||
|
||||
@@ -844,13 +838,13 @@ void NACT_Sys1::cmd_q()
|
||||
int p = 0;
|
||||
|
||||
FWRITE(header, 112);
|
||||
FPUTW(scenario_page + 1);
|
||||
FPUTW(sco.page() + 1);
|
||||
FPUTW(0);
|
||||
FPUTW(0); // cg no?
|
||||
FPUTW(0);
|
||||
FPUTW(mako->current_music);
|
||||
FPUTW(0);
|
||||
FPUTW(scenario_addr);
|
||||
FPUTW(sco.addr());
|
||||
FPUTW(0);
|
||||
for(int i = 0; i < 512; i++) {
|
||||
FPUTW(var[i]);
|
||||
@@ -917,7 +911,7 @@ void NACT_Sys1::cmd_r()
|
||||
|
||||
void NACT_Sys1::cmd_s()
|
||||
{
|
||||
int page = getd();
|
||||
int page = sco.getd();
|
||||
|
||||
output_console("\nS %d:", page);
|
||||
|
||||
@@ -931,13 +925,13 @@ void NACT_Sys1::cmd_s()
|
||||
void NACT_Sys1::cmd_t()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'T' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'T' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_u()
|
||||
{
|
||||
int page = getd();
|
||||
int transparent = getd();
|
||||
int page = sco.getd();
|
||||
int transparent = sco.getd();
|
||||
|
||||
output_console("\nU %d,%d:", page, transparent);
|
||||
|
||||
@@ -955,18 +949,18 @@ void NACT_Sys1::cmd_u()
|
||||
void NACT_Sys1::cmd_v()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'V' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'V' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_w()
|
||||
{
|
||||
// 未使用
|
||||
fatal("Unknown Command: 'W' at page = %d, addr = %d", scenario_page, prev_addr);
|
||||
fatal("Unknown Command: 'W' at page = %d, addr = %d", sco.page(), prev_addr);
|
||||
}
|
||||
|
||||
void NACT_Sys1::cmd_x()
|
||||
{
|
||||
int index = getd();
|
||||
int index = sco.getd();
|
||||
|
||||
output_console("\nX %d:", index);
|
||||
|
||||
@@ -1309,15 +1303,15 @@ uint16 NACT_Sys1::cali()
|
||||
bool ok = false;
|
||||
|
||||
while(p > 0) {
|
||||
uint8 dat = getd();
|
||||
uint8 dat = sco.getd();
|
||||
|
||||
// 除算はサポートしない?
|
||||
if(0x80 <= dat && dat <= 0xbf) {
|
||||
cali[p++] = var[dat & 0x3f];
|
||||
} else if(0xc0 <= dat && dat <= 0xff) {
|
||||
cali[p++] = var[((dat & 0x3f) << 8) | getd()];
|
||||
cali[p++] = var[((dat & 0x3f) << 8) | sco.getd()];
|
||||
} else if(0x00 <= dat && dat <= 0x3f) {
|
||||
cali[p++] = ((dat & 0x3f) << 8) | getd();
|
||||
cali[p++] = ((dat & 0x3f) << 8) | sco.getd();
|
||||
} else if(0x40 <= dat && dat <= 0x77) {
|
||||
cali[p++] = dat & 0x3f;
|
||||
} else if(dat == 0x78) {
|
||||
@@ -1359,7 +1353,7 @@ uint16 NACT_Sys1::cali()
|
||||
}
|
||||
}
|
||||
if (!ok) {
|
||||
fatal("cali: invalid expression at %d:%04x", scenario_page, scenario_addr);
|
||||
fatal("cali: invalid expression at %d:%04x", sco.page(), sco.addr());
|
||||
}
|
||||
return (uint16)(cali[1] & 0xffff);
|
||||
}
|
||||
@@ -1367,17 +1361,17 @@ uint16 NACT_Sys1::cali()
|
||||
uint16 NACT_Sys1::cali2()
|
||||
{
|
||||
uint16 val = 0;
|
||||
uint16 dat = getd();
|
||||
uint16 dat = sco.getd();
|
||||
|
||||
if(0x80 <= dat && dat <= 0xbf) {
|
||||
val = dat & 0x3f;
|
||||
} else if(0xc0 <= dat && dat <= 0xff) {
|
||||
val = ((dat & 0x3f) << 8) | getd();
|
||||
val = ((dat & 0x3f) << 8) | sco.getd();
|
||||
} else {
|
||||
fatal("cali2: invalid expression at %d:%04x", scenario_page, scenario_addr);
|
||||
fatal("cali2: invalid expression at %d:%04x", sco.page(), sco.addr());
|
||||
}
|
||||
if(getd() != 0x7f) {
|
||||
fatal("cali2: invalid expression at %d:%04x", scenario_page, scenario_addr);
|
||||
if (sco.getd() != 0x7f) {
|
||||
fatal("cali2: invalid expression at %d:%04x", sco.page(), sco.addr());
|
||||
}
|
||||
return val;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user