diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index a3c887f..4bc0868 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -144,7 +144,17 @@ void NACT::mainloop() int sleep_cnt = 0; while(!terminate) { - execute(); + switch (sys_ver) { + case 1: + execute(static_cast(this)); + break; + case 2: + execute(static_cast(this)); + break; + case 3: + execute(static_cast(this)); + break; + } // 512コマンド実行毎にSleep(10) if(!(sleep_cnt = (sleep_cnt + 1) & 0x1ff)) { SDL_Delay(10); @@ -154,7 +164,8 @@ void NACT::mainloop() // コマンドパーサ -void NACT::execute() +template +void NACT::execute(T* impl) { // アドレスの確認 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) { - opening(); + impl->opening(); } // 1コマンド実行 @@ -185,117 +196,117 @@ void NACT::execute() if(verb_obj && cmd != '[' && cmd != ':') { // 動詞-目的語メニューの表示 scenario_addr--; - cmd_open_verb(); + impl->cmd_open_verb(); return; } switch(cmd) { case '!': - cmd_calc(); + impl->cmd_calc(); break; case '{': - cmd_branch(); + impl->cmd_branch(); break; case '}': break; case '@': - cmd_label_jump(); + impl->cmd_label_jump(); break; case '\\': - cmd_label_call(); + impl->cmd_label_call(); break; case '&': - cmd_page_jump(); + impl->cmd_page_jump(); break; case '%': - cmd_page_call(); + impl->cmd_page_call(); break; case '$': - cmd_set_menu(); + impl->cmd_set_menu(); break; case '[': - cmd_set_verbobj(); + impl->cmd_set_verbobj(); break; case ':': - cmd_set_verbobj2(); + impl->cmd_set_verbobj2(); break; case ']': - cmd_open_menu(); + impl->cmd_open_menu(); break; case 'A': - cmd_a(); + impl->cmd_a(); break; case 'B': - cmd_b(); + impl->cmd_b(); break; case 'D': - cmd_d(); + impl->cmd_d(); break; case 'E': - cmd_e(); + impl->cmd_e(); break; case 'F': - cmd_f(); + impl->cmd_f(); break; case 'G': - cmd_g(); + impl->cmd_g(); break; case 'H': - cmd_h(); + impl->cmd_h(); break; case 'I': - cmd_i(); + impl->cmd_i(); break; case 'J': - cmd_j(); + impl->cmd_j(); break; case 'K': - cmd_k(); + impl->cmd_k(); break; case 'L': - cmd_l(); + impl->cmd_l(); break; case 'M': - cmd_m(); + impl->cmd_m(); break; case 'N': - cmd_n(); + impl->cmd_n(); break; case 'O': - cmd_o(); + impl->cmd_o(); break; case 'P': - cmd_p(); + impl->cmd_p(); break; case 'Q': - cmd_q(); + impl->cmd_q(); break; case 'R': - cmd_r(); + impl->cmd_r(); break; case 'S': - cmd_s(); + impl->cmd_s(); break; case 'T': - cmd_t(); + impl->cmd_t(); break; case 'U': - cmd_u(); + impl->cmd_u(); break; case 'V': - cmd_v(); + impl->cmd_v(); break; case 'W': - cmd_w(); + impl->cmd_w(); break; case 'X': - cmd_x(); + impl->cmd_x(); break; case 'Y': - cmd_y(); + impl->cmd_y(); break; case 'Z': - cmd_z(); + impl->cmd_z(); break; default: if(cmd == 0x20 || (0xa1 <= cmd && cmd <= 0xdd)) { diff --git a/src/sys/nact.h b/src/sys/nact.h index 235267d..bb6b724 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -85,14 +85,14 @@ class NACT public: 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); - virtual ~NACT(); + ~NACT(); protected: AGS* ags; MAKO* mako; // コマンドパーサ - void execute(); + template void execute(T* impl); void load_scenario(int page); bool fatal_error = false; @@ -121,51 +121,7 @@ protected: char tvar_stack[30][10][22]; // 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 ---- - virtual void opening() {} int menu_max; // メニューの改ページ // DPS @@ -202,10 +158,12 @@ protected: int pcm[MAX_PCM]; // 下位関数 - virtual uint16 cali() = 0; - virtual uint16 cali2() = 0; - virtual uint8 getd() = 0; - virtual uint16 getw() = 0; + uint8 getd() { return scenario_data[scenario_addr++]; } + uint16 getw() { + uint16 val = scenario_data[scenario_addr] | (scenario_data[scenario_addr + 1] << 8); + scenario_addr += 2; + return val; + } uint16 random(uint16 range); uint32 seed; @@ -264,141 +222,139 @@ public: class NACT_Sys1 : public NACT { public: NACT_Sys1(uint32 crc32, const char* font_file, const char* playlist); - 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; - uint8 getd() override; - uint16 getw() override; + 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(); }; class NACT_Sys2 : public NACT { public: NACT_Sys2(uint32 crc32, const char* font_file, const char* playlist); - 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; - uint8 getd() override; - uint16 getw() override; + 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(); }; class NACT_Sys3 : public NACT { public: NACT_Sys3(uint32 crc32, const char* font_file, const char* playlist); - 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; - uint8 getd() override; - uint16 getw() override; + 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(); int menu_select(int num_items); }; diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 23cec25..97ec943 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -1579,16 +1579,3 @@ uint16 NACT_Sys1::cali2() } 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; -} - diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index c538021..4efa2ae 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -1661,16 +1661,3 @@ uint16 NACT_Sys2::cali2() } 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; -} - diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index d2ae8d1..295fdb9 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -1775,16 +1775,3 @@ uint16 NACT_Sys3::cali2() } 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; -} -