Avoid virtual functions in NACT

Since NACT functions call asynchronous operations and we use
ASYNCIFY_IGNORE_INDIRECT in emscripten.
This commit is contained in:
kichikuou
2020-02-23 14:23:30 +09:00
parent d6aaf31b1a
commit 7ffa8bc306
5 changed files with 180 additions and 252 deletions
+50 -39
View File
@@ -144,7 +144,17 @@ void NACT::mainloop()
int sleep_cnt = 0; int sleep_cnt = 0;
while(!terminate) { while(!terminate) {
execute(); switch (sys_ver) {
case 1:
execute(static_cast<NACT_Sys1*>(this));
break;
case 2:
execute(static_cast<NACT_Sys2*>(this));
break;
case 3:
execute(static_cast<NACT_Sys3*>(this));
break;
}
// 512コマンド実行毎にSleep(10) // 512コマンド実行毎にSleep(10)
if(!(sleep_cnt = (sleep_cnt + 1) & 0x1ff)) { if(!(sleep_cnt = (sleep_cnt + 1) & 0x1ff)) {
SDL_Delay(10); SDL_Delay(10);
@@ -154,7 +164,8 @@ void NACT::mainloop()
// コマンドパーサ // コマンドパーサ
void NACT::execute() template <class T>
void NACT::execute(T* impl)
{ {
// アドレスの確認 // アドレスの確認
if(scenario_addr < 2 || scenario_addr >= scenario_size) { if(scenario_addr < 2 || scenario_addr >= scenario_size) {
@@ -171,7 +182,7 @@ void NACT::execute()
} }
if(sys_ver == 1 && scenario_page == 0 && scenario_addr == 2) { if(sys_ver == 1 && scenario_page == 0 && scenario_addr == 2) {
opening(); impl->opening();
} }
// 1コマンド実行 // 1コマンド実行
@@ -185,117 +196,117 @@ void NACT::execute()
if(verb_obj && cmd != '[' && cmd != ':') { if(verb_obj && cmd != '[' && cmd != ':') {
// 動詞-目的語メニューの表示 // 動詞-目的語メニューの表示
scenario_addr--; scenario_addr--;
cmd_open_verb(); impl->cmd_open_verb();
return; return;
} }
switch(cmd) { switch(cmd) {
case '!': case '!':
cmd_calc(); impl->cmd_calc();
break; break;
case '{': case '{':
cmd_branch(); impl->cmd_branch();
break; break;
case '}': case '}':
break; break;
case '@': case '@':
cmd_label_jump(); impl->cmd_label_jump();
break; break;
case '\\': case '\\':
cmd_label_call(); impl->cmd_label_call();
break; break;
case '&': case '&':
cmd_page_jump(); impl->cmd_page_jump();
break; break;
case '%': case '%':
cmd_page_call(); impl->cmd_page_call();
break; break;
case '$': case '$':
cmd_set_menu(); impl->cmd_set_menu();
break; break;
case '[': case '[':
cmd_set_verbobj(); impl->cmd_set_verbobj();
break; break;
case ':': case ':':
cmd_set_verbobj2(); impl->cmd_set_verbobj2();
break; break;
case ']': case ']':
cmd_open_menu(); impl->cmd_open_menu();
break; break;
case 'A': case 'A':
cmd_a(); impl->cmd_a();
break; break;
case 'B': case 'B':
cmd_b(); impl->cmd_b();
break; break;
case 'D': case 'D':
cmd_d(); impl->cmd_d();
break; break;
case 'E': case 'E':
cmd_e(); impl->cmd_e();
break; break;
case 'F': case 'F':
cmd_f(); impl->cmd_f();
break; break;
case 'G': case 'G':
cmd_g(); impl->cmd_g();
break; break;
case 'H': case 'H':
cmd_h(); impl->cmd_h();
break; break;
case 'I': case 'I':
cmd_i(); impl->cmd_i();
break; break;
case 'J': case 'J':
cmd_j(); impl->cmd_j();
break; break;
case 'K': case 'K':
cmd_k(); impl->cmd_k();
break; break;
case 'L': case 'L':
cmd_l(); impl->cmd_l();
break; break;
case 'M': case 'M':
cmd_m(); impl->cmd_m();
break; break;
case 'N': case 'N':
cmd_n(); impl->cmd_n();
break; break;
case 'O': case 'O':
cmd_o(); impl->cmd_o();
break; break;
case 'P': case 'P':
cmd_p(); impl->cmd_p();
break; break;
case 'Q': case 'Q':
cmd_q(); impl->cmd_q();
break; break;
case 'R': case 'R':
cmd_r(); impl->cmd_r();
break; break;
case 'S': case 'S':
cmd_s(); impl->cmd_s();
break; break;
case 'T': case 'T':
cmd_t(); impl->cmd_t();
break; break;
case 'U': case 'U':
cmd_u(); impl->cmd_u();
break; break;
case 'V': case 'V':
cmd_v(); impl->cmd_v();
break; break;
case 'W': case 'W':
cmd_w(); impl->cmd_w();
break; break;
case 'X': case 'X':
cmd_x(); impl->cmd_x();
break; break;
case 'Y': case 'Y':
cmd_y(); impl->cmd_y();
break; break;
case 'Z': case 'Z':
cmd_z(); impl->cmd_z();
break; break;
default: default:
if(cmd == 0x20 || (0xa1 <= cmd && cmd <= 0xdd)) { if(cmd == 0x20 || (0xa1 <= cmd && cmd <= 0xdd)) {
+130 -174
View File
@@ -85,14 +85,14 @@ class NACT
public: public:
static NACT* create(const char* game_id, const char* font_file, const char* playlist); static NACT* create(const char* game_id, const char* font_file, const char* playlist);
NACT(int sys_ver, uint32 crc32, const char* font_file, const char* playlist); NACT(int sys_ver, uint32 crc32, const char* font_file, const char* playlist);
virtual ~NACT(); ~NACT();
protected: protected:
AGS* ags; AGS* ags;
MAKO* mako; MAKO* mako;
// コマンドパーサ // コマンドパーサ
void execute(); template <class T> void execute(T* impl);
void load_scenario(int page); void load_scenario(int page);
bool fatal_error = false; bool fatal_error = false;
@@ -121,51 +121,7 @@ protected:
char tvar_stack[30][10][22]; char tvar_stack[30][10][22];
// int tvar_index; // int tvar_index;
// コマンド
virtual void cmd_calc() = 0;
virtual void cmd_branch() = 0;
virtual void cmd_label_jump() = 0;
virtual void cmd_label_call() = 0;
virtual void cmd_page_jump() = 0;
virtual void cmd_page_call() = 0;
virtual void cmd_set_menu() = 0;
virtual void cmd_open_menu() = 0;
virtual void cmd_set_verbobj() = 0;
virtual void cmd_set_verbobj2() = 0;
virtual void cmd_open_verb() = 0;
virtual void cmd_open_obj(int verb) = 0;
virtual void cmd_a() = 0;
virtual void cmd_b() = 0;
virtual void cmd_d() = 0;
virtual void cmd_e() = 0;
virtual void cmd_f() = 0;
virtual void cmd_g() = 0;
virtual void cmd_h() = 0;
virtual void cmd_i() = 0;
virtual void cmd_j() = 0;
virtual void cmd_k() = 0;
virtual void cmd_l() = 0;
virtual void cmd_m() = 0;
virtual void cmd_n() = 0;
virtual void cmd_o() = 0;
virtual void cmd_p() = 0;
virtual void cmd_q() = 0;
virtual void cmd_r() = 0;
virtual void cmd_s() = 0;
virtual void cmd_t() = 0;
virtual void cmd_u() = 0;
virtual void cmd_v() = 0;
virtual void cmd_w() = 0;
virtual void cmd_x() = 0;
virtual void cmd_y() = 0;
virtual void cmd_z() = 0;
// SYSTEM1 ---- // SYSTEM1 ----
virtual void opening() {}
int menu_max; // メニューの改ページ int menu_max; // メニューの改ページ
// DPS // DPS
@@ -202,10 +158,12 @@ protected:
int pcm[MAX_PCM]; int pcm[MAX_PCM];
// 下位関数 // 下位関数
virtual uint16 cali() = 0; uint8 getd() { return scenario_data[scenario_addr++]; }
virtual uint16 cali2() = 0; uint16 getw() {
virtual uint8 getd() = 0; uint16 val = scenario_data[scenario_addr] | (scenario_data[scenario_addr + 1] << 8);
virtual uint16 getw() = 0; scenario_addr += 2;
return val;
}
uint16 random(uint16 range); uint16 random(uint16 range);
uint32 seed; uint32 seed;
@@ -264,141 +222,139 @@ public:
class NACT_Sys1 : public NACT { class NACT_Sys1 : public NACT {
public: public:
NACT_Sys1(uint32 crc32, const char* font_file, const char* playlist); NACT_Sys1(uint32 crc32, const char* font_file, const char* playlist);
void cmd_calc() override; void cmd_calc();
void cmd_branch() override; void cmd_branch();
void cmd_label_jump() override; void cmd_label_jump();
void cmd_label_call() override; void cmd_label_call();
void cmd_page_jump() override; void cmd_page_jump();
void cmd_page_call() override; void cmd_page_call();
void cmd_set_menu() override; void cmd_set_menu();
void cmd_open_menu() override; void cmd_open_menu();
void cmd_set_verbobj() override; void cmd_set_verbobj();
void cmd_set_verbobj2() override; void cmd_set_verbobj2();
void cmd_open_verb() override; void cmd_open_verb();
void cmd_open_obj(int verb) override; void cmd_open_obj(int verb);
void cmd_a() override; void cmd_a();
void cmd_b() override; void cmd_b();
void cmd_d() override; void cmd_d();
void cmd_e() override; void cmd_e();
void cmd_f() override; void cmd_f();
void cmd_g() override; void cmd_g();
void cmd_h() override; void cmd_h();
void cmd_i() override; void cmd_i();
void cmd_j() override; void cmd_j();
void cmd_k() override; void cmd_k();
void cmd_l() override; void cmd_l();
void cmd_m() override; void cmd_m();
void cmd_n() override; void cmd_n();
void cmd_o() override; void cmd_o();
void cmd_p() override; void cmd_p();
void cmd_q() override; void cmd_q();
void cmd_r() override; void cmd_r();
void cmd_s() override; void cmd_s();
void cmd_t() override; void cmd_t();
void cmd_u() override; void cmd_u();
void cmd_v() override; void cmd_v();
void cmd_w() override; void cmd_w();
void cmd_x() override; void cmd_x();
void cmd_y() override; void cmd_y();
void cmd_z() override; void cmd_z();
void opening() override; void opening();
uint16 cali() override; private:
uint16 cali2() override; uint16 cali();
uint8 getd() override; uint16 cali2();
uint16 getw() override;
}; };
class NACT_Sys2 : public NACT { class NACT_Sys2 : public NACT {
public: public:
NACT_Sys2(uint32 crc32, const char* font_file, const char* playlist); NACT_Sys2(uint32 crc32, const char* font_file, const char* playlist);
void cmd_calc() override; void cmd_calc();
void cmd_branch() override; void cmd_branch();
void cmd_label_jump() override; void cmd_label_jump();
void cmd_label_call() override; void cmd_label_call();
void cmd_page_jump() override; void cmd_page_jump();
void cmd_page_call() override; void cmd_page_call();
void cmd_set_menu() override; void cmd_set_menu();
void cmd_open_menu() override; void cmd_open_menu();
void cmd_set_verbobj() override; void cmd_set_verbobj();
void cmd_set_verbobj2() override; void cmd_set_verbobj2();
void cmd_open_verb() override; void cmd_open_verb();
void cmd_open_obj(int verb) override; void cmd_open_obj(int verb);
void cmd_a() override; void cmd_a();
void cmd_b() override; void cmd_b();
void cmd_d() override; void cmd_d();
void cmd_e() override; void cmd_e();
void cmd_f() override; void cmd_f();
void cmd_g() override; void cmd_g();
void cmd_h() override; void cmd_h();
void cmd_i() override; void cmd_i();
void cmd_j() override; void cmd_j();
void cmd_k() override; void cmd_k();
void cmd_l() override; void cmd_l();
void cmd_m() override; void cmd_m();
void cmd_n() override; void cmd_n();
void cmd_o() override; void cmd_o();
void cmd_p() override; void cmd_p();
void cmd_q() override; void cmd_q();
void cmd_r() override; void cmd_r();
void cmd_s() override; void cmd_s();
void cmd_t() override; void cmd_t();
void cmd_u() override; void cmd_u();
void cmd_v() override; void cmd_v();
void cmd_w() override; void cmd_w();
void cmd_x() override; void cmd_x();
void cmd_y() override; void cmd_y();
void cmd_z() override; void cmd_z();
uint16 cali() override; void opening() {}
uint16 cali2() override; private:
uint8 getd() override; uint16 cali();
uint16 getw() override; uint16 cali2();
}; };
class NACT_Sys3 : public NACT { class NACT_Sys3 : public NACT {
public: public:
NACT_Sys3(uint32 crc32, const char* font_file, const char* playlist); NACT_Sys3(uint32 crc32, const char* font_file, const char* playlist);
void cmd_calc() override; void cmd_calc();
void cmd_branch() override; void cmd_branch();
void cmd_label_jump() override; void cmd_label_jump();
void cmd_label_call() override; void cmd_label_call();
void cmd_page_jump() override; void cmd_page_jump();
void cmd_page_call() override; void cmd_page_call();
void cmd_set_menu() override; void cmd_set_menu();
void cmd_open_menu() override; void cmd_open_menu();
void cmd_set_verbobj() override; void cmd_set_verbobj();
void cmd_set_verbobj2() override; void cmd_set_verbobj2();
void cmd_open_verb() override; void cmd_open_verb();
void cmd_open_obj(int verb) override; void cmd_open_obj(int verb);
void cmd_a() override; void cmd_a();
void cmd_b() override; void cmd_b();
void cmd_d() override; void cmd_d();
void cmd_e() override; void cmd_e();
void cmd_f() override; void cmd_f();
void cmd_g() override; void cmd_g();
void cmd_h() override; void cmd_h();
void cmd_i() override; void cmd_i();
void cmd_j() override; void cmd_j();
void cmd_k() override; void cmd_k();
void cmd_l() override; void cmd_l();
void cmd_m() override; void cmd_m();
void cmd_n() override; void cmd_n();
void cmd_o() override; void cmd_o();
void cmd_p() override; void cmd_p();
void cmd_q() override; void cmd_q();
void cmd_r() override; void cmd_r();
void cmd_s() override; void cmd_s();
void cmd_t() override; void cmd_t();
void cmd_u() override; void cmd_u();
void cmd_v() override; void cmd_v();
void cmd_w() override; void cmd_w();
void cmd_x() override; void cmd_x();
void cmd_y() override; void cmd_y();
void cmd_z() override; void cmd_z();
uint16 cali() override; void opening() {}
uint16 cali2() override;
uint8 getd() override;
uint16 getw() override;
private: private:
uint16 cali();
uint16 cali2();
int menu_select(int num_items); int menu_select(int num_items);
}; };
-13
View File
@@ -1579,16 +1579,3 @@ uint16 NACT_Sys1::cali2()
} }
return val; return val;
} }
uint8 NACT_Sys1::getd()
{
return scenario_data[scenario_addr++];
}
uint16 NACT_Sys1::getw()
{
uint16 val = scenario_data[scenario_addr] | (scenario_data[scenario_addr + 1] << 8);
scenario_addr += 2;
return val;
}
-13
View File
@@ -1661,16 +1661,3 @@ uint16 NACT_Sys2::cali2()
} }
return val; return val;
} }
uint8 NACT_Sys2::getd()
{
return scenario_data[scenario_addr++];
}
uint16 NACT_Sys2::getw()
{
uint16 val = scenario_data[scenario_addr] | (scenario_data[scenario_addr + 1] << 8);
scenario_addr += 2;
return val;
}
-13
View File
@@ -1775,16 +1775,3 @@ uint16 NACT_Sys3::cali2()
} }
return val; return val;
} }
uint8 NACT_Sys3::getd()
{
return scenario_data[scenario_addr++];
}
uint16 NACT_Sys3::getw()
{
uint16 val = scenario_data[scenario_addr] | (scenario_data[scenario_addr + 1] << 8);
scenario_addr += 2;
return val;
}