From 0e9bc5a10b0fb2cff6a17f8c7ad7e5fd1b9fdbe9 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sat, 8 Aug 2020 12:16:39 +0900 Subject: [PATCH] Allow virtual functions in NACT This essentially reverts commit 7ffa8bc. With the new "ASYNCIFY_ADD" emscripten option, we no longer need this workaround. --- src/CMakeLists.txt | 1 + src/sys/nact.cpp | 89 ++++++-------- src/sys/nact.h | 299 ++++++++++++++++++++++++++------------------- 3 files changed, 213 insertions(+), 176 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0734459..d660b3f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,6 +38,7 @@ elseif (EMSCRIPTEN) "SHELL:-s ASYNCIFY=1 -s ASYNCIFY_IGNORE_INDIRECT=1" "SHELL:-s ALLOW_MEMORY_GROWTH=1" "SHELL:-s NO_EXIT_RUNTIME=1" + "SHELL:-s ASYNCIFY_ADD=\"['NACT::execute()']\"" "SHELL:-s EXPORTED_FUNCTIONS=\"['_main','_ags_setAntialiasedStringMode']\"" "SHELL:-s EXTRA_EXPORTED_RUNTIME_METHODS=\"['getValue','getMemory','addRunDependency','removeRunDependency']\"") diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index 6ed1eba..b7c719d 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -123,17 +123,7 @@ void NACT::mainloop() int sleep_cnt = 0; while(!terminate) { - switch (sys_ver) { - case 1: - execute(static_cast(this)); - break; - case 2: - execute(static_cast(this)); - break; - case 3: - execute(static_cast(this)); - break; - } + execute(); // 512コマンド実行毎にSleep(10) if(!(sleep_cnt = (sleep_cnt + 1) & 0x1ff)) { SDL_Delay(10); @@ -143,8 +133,7 @@ void NACT::mainloop() // コマンドパーサ -template -void NACT::execute(T* impl) +void NACT::execute() { // アドレスの確認 if(scenario_addr < 2 || scenario_addr >= scenario_size) { @@ -161,7 +150,7 @@ void NACT::execute(T* impl) } if(sys_ver == 1 && scenario_page == 0 && scenario_addr == 2) { - impl->opening(); + opening(); } // 1コマンド実行 @@ -176,117 +165,117 @@ void NACT::execute(T* impl) if(verb_obj && cmd != '[' && cmd != ':') { // 動詞-目的語メニューの表示 scenario_addr--; - impl->cmd_open_verb(); + cmd_open_verb(); return; } switch(cmd) { case '!': - impl->cmd_calc(); + cmd_calc(); break; case '{': - impl->cmd_branch(); + cmd_branch(); break; case '}': break; case '@': - impl->cmd_label_jump(); + cmd_label_jump(); break; case '\\': - impl->cmd_label_call(); + cmd_label_call(); break; case '&': - impl->cmd_page_jump(); + cmd_page_jump(); break; case '%': - impl->cmd_page_call(); + cmd_page_call(); break; case '$': - impl->cmd_set_menu(); + cmd_set_menu(); break; case '[': - impl->cmd_set_verbobj(); + cmd_set_verbobj(); break; case ':': - impl->cmd_set_verbobj2(); + cmd_set_verbobj2(); break; case ']': - impl->cmd_open_menu(); + cmd_open_menu(); break; case 'A': - impl->cmd_a(); + cmd_a(); break; case 'B': - impl->cmd_b(); + cmd_b(); break; case 'D': - impl->cmd_d(); + cmd_d(); break; case 'E': - impl->cmd_e(); + cmd_e(); break; case 'F': - impl->cmd_f(); + cmd_f(); break; case 'G': - impl->cmd_g(); + cmd_g(); break; case 'H': - impl->cmd_h(); + cmd_h(); break; case 'I': - impl->cmd_i(); + cmd_i(); break; case 'J': - impl->cmd_j(); + cmd_j(); break; case 'K': - impl->cmd_k(); + cmd_k(); break; case 'L': - impl->cmd_l(); + cmd_l(); break; case 'M': - impl->cmd_m(); + cmd_m(); break; case 'N': - impl->cmd_n(); + cmd_n(); break; case 'O': - impl->cmd_o(); + cmd_o(); break; case 'P': - impl->cmd_p(); + cmd_p(); break; case 'Q': - impl->cmd_q(); + cmd_q(); break; case 'R': - impl->cmd_r(); + cmd_r(); break; case 'S': - impl->cmd_s(); + cmd_s(); break; case 'T': - impl->cmd_t(); + cmd_t(); break; case 'U': - impl->cmd_u(); + cmd_u(); break; case 'V': - impl->cmd_v(); + cmd_v(); break; case 'W': - impl->cmd_w(); + cmd_w(); break; case 'X': - impl->cmd_x(); + cmd_x(); break; case 'Y': - impl->cmd_y(); + cmd_y(); break; case 'Z': - impl->cmd_z(); + cmd_z(); break; default: if(cmd == 0x20 || (0xa1 <= cmd && cmd <= 0xdd)) { diff --git a/src/sys/nact.h b/src/sys/nact.h index 1cf5172..b7eb131 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -95,7 +95,7 @@ protected: MAKO* mako; // コマンドパーサ - template void execute(T* impl); + void execute(); void load_scenario(int page); bool fatal_error = false; @@ -124,6 +124,52 @@ protected: char tvar_stack[30][10][22]; // int tvar_index; + // Commands + 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 + virtual void opening() {} + // DPS bool text_refresh; @@ -152,6 +198,8 @@ protected: int pcm[MAX_PCM]; // 下位関数 + virtual uint16 cali() = 0; + virtual uint16 cali2() = 0; uint8 getd() { return scenario_data[scenario_addr++]; } uint16 getw() { uint16 val = scenario_data[scenario_addr] | (scenario_data[scenario_addr + 1] << 8); @@ -216,147 +264,146 @@ public: void fatal(const char* msg, ...); }; -class NACT_Sys1 : public NACT { +class NACT_Sys1 final : public NACT { public: NACT_Sys1(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist); - void cmd_calc(); - void cmd_branch(); - void cmd_label_jump(); - void cmd_label_call(); - void cmd_page_jump(); - void cmd_page_call(); - void cmd_set_menu(); - void cmd_open_menu(); - void cmd_set_verbobj(); - void cmd_set_verbobj2(); - void cmd_open_verb(); - void cmd_open_obj(int verb); - void cmd_a(); - void cmd_b(); - void cmd_d(); - void cmd_e(); - void cmd_f(); - void cmd_g(); - void cmd_h(); - void cmd_i(); - void cmd_j(); - void cmd_k(); - void cmd_l(); - void cmd_m(); - void cmd_n(); - void cmd_o(); - void cmd_p(); - void cmd_q(); - void cmd_r(); - void cmd_s(); - void cmd_t(); - void cmd_u(); - void cmd_v(); - void cmd_w(); - void cmd_x(); - void cmd_y(); - void cmd_z(); - void opening(); +protected: + void cmd_calc() override; + void cmd_branch() override; + void cmd_label_jump() override; + void cmd_label_call() override; + void cmd_page_jump() override; + void cmd_page_call() override; + void cmd_set_menu() override; + void cmd_open_menu() override; + void cmd_set_verbobj() override; + void cmd_set_verbobj2() override; + void cmd_open_verb() override; + void cmd_open_obj(int verb) override; + void cmd_a() override; + void cmd_b() override; + void cmd_d() override; + void cmd_e() override; + void cmd_f() override; + void cmd_g() override; + void cmd_h() override; + void cmd_i() override; + void cmd_j() override; + void cmd_k() override; + void cmd_l() override; + void cmd_m() override; + void cmd_n() override; + void cmd_o() override; + void cmd_p() override; + void cmd_q() override; + void cmd_r() override; + void cmd_s() override; + void cmd_t() override; + void cmd_u() override; + void cmd_v() override; + void cmd_w() override; + void cmd_x() override; + void cmd_y() override; + void cmd_z() override; + void opening() override; + uint16 cali() override; + uint16 cali2() override; private: - uint16 cali(); - uint16 cali2(); - // Intruder Zコマンド int paint_x; int paint_y; int map_page; }; -class NACT_Sys2 : public NACT { +class NACT_Sys2 final : public NACT { public: NACT_Sys2(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist); - void cmd_calc(); - void cmd_branch(); - void cmd_label_jump(); - void cmd_label_call(); - void cmd_page_jump(); - void cmd_page_call(); - void cmd_set_menu(); - void cmd_open_menu(); - void cmd_set_verbobj(); - void cmd_set_verbobj2(); - void cmd_open_verb(); - void cmd_open_obj(int verb); - void cmd_a(); - void cmd_b(); - void cmd_d(); - void cmd_e(); - void cmd_f(); - void cmd_g(); - void cmd_h(); - void cmd_i(); - void cmd_j(); - void cmd_k(); - void cmd_l(); - void cmd_m(); - void cmd_n(); - void cmd_o(); - void cmd_p(); - void cmd_q(); - void cmd_r(); - void cmd_s(); - void cmd_t(); - void cmd_u(); - void cmd_v(); - void cmd_w(); - void cmd_x(); - void cmd_y(); - void cmd_z(); - void opening() {} -private: - uint16 cali(); - uint16 cali2(); +protected: + void cmd_calc() override; + void cmd_branch() override; + void cmd_label_jump() override; + void cmd_label_call() override; + void cmd_page_jump() override; + void cmd_page_call() override; + void cmd_set_menu() override; + void cmd_open_menu() override; + void cmd_set_verbobj() override; + void cmd_set_verbobj2() override; + void cmd_open_verb() override; + void cmd_open_obj(int verb) override; + void cmd_a() override; + void cmd_b() override; + void cmd_d() override; + void cmd_e() override; + void cmd_f() override; + void cmd_g() override; + void cmd_h() override; + void cmd_i() override; + void cmd_j() override; + void cmd_k() override; + void cmd_l() override; + void cmd_m() override; + void cmd_n() override; + void cmd_o() override; + void cmd_p() override; + void cmd_q() override; + void cmd_r() override; + void cmd_s() override; + void cmd_t() override; + void cmd_u() override; + void cmd_v() override; + void cmd_w() override; + void cmd_x() override; + void cmd_y() override; + void cmd_z() override; + uint16 cali() override; + uint16 cali2() override; }; -class NACT_Sys3 : public NACT { +class NACT_Sys3 final : public NACT { public: NACT_Sys3(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist); - void cmd_calc(); - void cmd_branch(); - void cmd_label_jump(); - void cmd_label_call(); - void cmd_page_jump(); - void cmd_page_call(); - void cmd_set_menu(); - void cmd_open_menu(); - void cmd_set_verbobj(); - void cmd_set_verbobj2(); - void cmd_open_verb(); - void cmd_open_obj(int verb); - void cmd_a(); - void cmd_b(); - void cmd_d(); - void cmd_e(); - void cmd_f(); - void cmd_g(); - void cmd_h(); - void cmd_i(); - void cmd_j(); - void cmd_k(); - void cmd_l(); - void cmd_m(); - void cmd_n(); - void cmd_o(); - void cmd_p(); - void cmd_q(); - void cmd_r(); - void cmd_s(); - void cmd_t(); - void cmd_u(); - void cmd_v(); - void cmd_w(); - void cmd_x(); - void cmd_y(); - void cmd_z(); - void opening() {} +protected: + void cmd_calc() override; + void cmd_branch() override; + void cmd_label_jump() override; + void cmd_label_call() override; + void cmd_page_jump() override; + void cmd_page_call() override; + void cmd_set_menu() override; + void cmd_open_menu() override; + void cmd_set_verbobj() override; + void cmd_set_verbobj2() override; + void cmd_open_verb() override; + void cmd_open_obj(int verb) override; + void cmd_a() override; + void cmd_b() override; + void cmd_d() override; + void cmd_e() override; + void cmd_f() override; + void cmd_g() override; + void cmd_h() override; + void cmd_i() override; + void cmd_j() override; + void cmd_k() override; + void cmd_l() override; + void cmd_m() override; + void cmd_n() override; + void cmd_o() override; + void cmd_p() override; + void cmd_q() override; + void cmd_r() override; + void cmd_s() override; + void cmd_t() override; + void cmd_u() override; + void cmd_v() override; + void cmd_w() override; + void cmd_x() override; + void cmd_y() override; + void cmd_z() override; + uint16 cali() override; + uint16 cali2() override; private: - uint16 cali(); - uint16 cali2(); int menu_select(int num_items); };