diff --git a/src/sys/ags.cpp b/src/sys/ags.cpp index 6b8a81a..e2efb36 100644 --- a/src/sys/ags.cpp +++ b/src/sys/ags.cpp @@ -169,7 +169,7 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent) // Bコマンド for(int i = 0; i < 10; i++) { // ウィンドウの初期位置はシステムによって異なる - switch (nact->crc32) { + switch (nact->crc32_a) { case CRC32_BUNKASAI: SET_TEXT(i, 24, 304, 616, 384, false); SET_MENU(i, 440, 18, 620, 178, true); @@ -220,9 +220,9 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent) SET_BOX(i, 0, 0, 0, 639, 399); } if (nact->sys_ver == 2) { - if (nact->crc32 == CRC32_SDPS_TONO || nact->crc32 == CRC32_SDPS_KAIZOKU) { + if(nact->crc32_a == CRC32_SDPS && (nact->crc32_b == CRC32_SDPS_TONO || nact->crc32_b == CRC32_SDPS_KAIZOKU)) { SET_BOX(0, 0, 40, 8, 598, 271); - } else if (nact->crc32 == CRC32_PROSTUDENTG_FD) { + } else if(nact->crc32_a == CRC32_PROSTUDENTG_FD) { SET_BOX(0, 0, 64, 13, 407, 289); SET_BOX(1, 0, 24, 298, 111, 390); SET_BOX(2, 0, 0, 0, 639, 307); diff --git a/src/sys/ags_draw.cpp b/src/sys/ags_draw.cpp index d8dd8c4..05fc2ee 100644 --- a/src/sys/ags_draw.cpp +++ b/src/sys/ags_draw.cpp @@ -30,7 +30,7 @@ void AGS::load_cg(int page, int transparent) if(data && size > 0) { switch (nact->sys_ver) { case 1: - switch (nact->crc32) { + switch (nact->crc32_a) { case CRC32_BUNKASAI: load_vsp(data, page, transparent); break; @@ -47,10 +47,10 @@ void AGS::load_cg(int page, int transparent) } break; case 2: - if(nact->crc32 == CRC32_AYUMI_PROTO) { + if(nact->crc32_a == CRC32_AYUMI_PROTO) { // あゆみちゃん物語 PROTO load_gl3(data, page, transparent); - } else if(nact->crc32 == CRC32_SDPS_MARIA || nact->crc32 == CRC32_SDPS_TONO || nact->crc32 == CRC32_SDPS_KAIZOKU) { + } else if(nact->crc32_a == CRC32_SDPS) { // Super D.P.S load_pms(data, page, transparent); } else { diff --git a/src/sys/ags_pms.cpp b/src/sys/ags_pms.cpp index 23c125e..6d8d2b5 100644 --- a/src/sys/ags_pms.cpp +++ b/src/sys/ags_pms.cpp @@ -40,7 +40,7 @@ void AGS::load_pms(uint8* data, int page, int transparent) tmp_palette[i * 16 + j] = SETPALETTE256(r, g, b); } } - if(nact->crc32 == CRC32_RANCE41 || nact->crc32 == CRC32_RANCE42 || nact->crc32 == CRC32_HASHIRIONNA2) { + if(nact->crc32_a == CRC32_RANCE41 || nact->crc32_a == CRC32_RANCE42 || nact->crc32_a == CRC32_HASHIRIONNA2) { // 上下16色は取得しない for(int i = 1; i < 15; i++) { for(int j = 0; j < 16; j++) { @@ -49,7 +49,7 @@ void AGS::load_pms(uint8* data, int page, int transparent) } } } - } else if(nact->crc32 == CRC32_MUGENHOUYOU && transparent != -1) { + } else if(nact->crc32_a == CRC32_MUGENHOUYOU && transparent != -1) { // Uコマンドでは上下32色は取得しない for(int i = 2; i < 14; i++) { for(int j = 0; j < 16; j++) { @@ -71,8 +71,8 @@ void AGS::load_pms(uint8* data, int page, int transparent) // パレット展開 if (nact->sys_ver == 3) { - if((extract_palette && extract_palette_cg[page]) || nact->crc32 == CRC32_FUNNYBEE_CD) { - if(nact->crc32 == CRC32_RANCE41 || nact->crc32 == CRC32_RANCE42 || nact->crc32 == CRC32_HASHIRIONNA2) { + if((extract_palette && extract_palette_cg[page]) || nact->crc32_a == CRC32_FUNNYBEE_CD) { + if(nact->crc32_a == CRC32_RANCE41 || nact->crc32_a == CRC32_RANCE42 || nact->crc32_a == CRC32_HASHIRIONNA2) { // 上下16色は展開しない for(int i = 1; i < 15; i++) { for(int j = 0; j < 16; j++) { @@ -81,7 +81,7 @@ void AGS::load_pms(uint8* data, int page, int transparent) } } } - } else if(nact->crc32 == CRC32_MUGENHOUYOU && transparent != -1) { + } else if(nact->crc32_a == CRC32_MUGENHOUYOU && transparent != -1) { // Uコマンドでは上下32色は展開しない for(int i = 2; i < 14; i++) { for(int j = 0; j < 16; j++) { diff --git a/src/sys/ags_vsp.cpp b/src/sys/ags_vsp.cpp index 5a59b42..cc3b53c 100644 --- a/src/sys/ags_vsp.cpp +++ b/src/sys/ags_vsp.cpp @@ -28,7 +28,7 @@ void AGS::load_vsp(uint8* data, int page, int transparent) } // Zコマンドの処理 - if(nact->crc32 == CRC32_AMBIVALENZ_FD || nact->crc32 == CRC32_AMBIVALENZ_CD) { + if(nact->crc32_a == CRC32_AMBIVALENZ_FD || nact->crc32_a == CRC32_AMBIVALENZ_CD) { // Z 0,numを無視する } else { if(palette_bank != -1) { @@ -48,7 +48,7 @@ void AGS::load_vsp(uint8* data, int page, int transparent) } // パレット展開 - if(nact->crc32 == CRC32_FUNNYBEE_FD || nact->crc32 == CRC32_FUNNYBEE_CD || nact->crc32 == CRC32_FUNNYBEE_PATCH) { + if(nact->crc32_a == CRC32_FUNNYBEE_FD || nact->crc32_a == CRC32_FUNNYBEE_CD || nact->crc32_a == CRC32_FUNNYBEE_PATCH) { if(extract_palette_cg[page]) { for(int i = 0; i < 16; i++) { screen_palette[base + i] = program_palette[base + i]; diff --git a/src/sys/crc32.h b/src/sys/crc32.h index 19895be..559ede3 100644 --- a/src/sys/crc32.h +++ b/src/sys/crc32.h @@ -8,21 +8,46 @@ #define _CRC32_H_ // ADISK.DATの先頭256bytes +// SYSTEM1 -#define CRC32_CRESCENT 0x42351f2c // クレセントムーンがぁる +#define CRC32_BUNKASAI 0xc80f99b8 // あぶない文化祭前夜 +#define CRC32_CRESCENT 0x42351f2c // クレセントムーンがぁる #define CRC32_DPS 0x69ea4865 // D.P.S. - Dream Program System -#define CRC32_FUKEI 0x026de326 // 婦警さんVX (ALICEの館3 UNITBASE/Y_SYUREN.LZH) -#define CRC32_INTRUDER 0xa7520fb2 // Intruder -桜屋敷の探索- +#define CRC32_DPS_SG 0xab4cda48 // D.P.S. SG +#define CRC32_DPS_SG_FAHREN 0xe405d57c // D.P.S. SG - Fahren Fliegen +#define CRC32_DPS_SG_KATEI 0x23e67d18 // D.P.S. SG - 家庭教師はステキなお仕事 +#define CRC32_DPS_SG_NOBUNAGA 0x2ec116f2 // D.P.S. SG - 信長の淫謀 +#define CRC32_DPS_SG2 0xab4cda48 // D.P.S. SG set2 +#define CRC32_DPS_SG2_ANTIQUE 0x41fe8b3d // D.P.S. SG set2 - ANTIQUE HOUSE +#define CRC32_DPS_SG2_IKENAI 0x6b562c09 // D.P.S. SG set2 - いけない内科検診再び +#define CRC32_DPS_SG2_AKAI 0x1098e78c // D.P.S. SG set2 - 朱い夜 +#define CRC32_DPS_SG3 0xb77ae133 // D.P.S. SG SG set3 +#define CRC32_DPS_SG3_RABBIT 0xa3228b6c // D.P.S. SG set3 - Rabbit P4P +#define CRC32_DPS_SG3_SHINKON 0x09b4448a // D.P.S. SG set3 - しんこんさんものがたり +#define CRC32_DPS_SG3_SOTSUGYOU 0xbc4525d8 // D.P.S. SG set3 - 卒業 +#define CRC32_FUKEI 0x026de326 // 婦警さんVX +#define CRC32_INTRUDER 0xa7520fb2 // Intruder -桜屋敷の探索- #define CRC32_TENGU 0xc942ff58 // あぶないてんぐ伝説 -#define CRC32_VAMPIRE 0x957bcfbf // Little Vampire -#define CRC32_BUNKASAI 0 // あぶない文化祭前夜? (未確認) +#define CRC32_TOUSHIN_HINT 0xac337537 // 闘神都市 ヒントディスク +#define CRC32_VAMPIRE 0x957bcfbf // Little Vampire +#define CRC32_YAKATA 0x8cef6fa6 // ALICEの館 +// SYSTEM2 + +#define CRC32_AYUMI_FD 0x4e2fed2a // あゆみちゃん物語 (FD) +#define CRC32_AYUMI_HINT 0xf6bd963a // あゆみちゃん物語 ヒントディスク #define CRC32_AYUMI_PROTO 0x4e2f5678 // あゆみちゃん物語 PROTO -#define CRC32_SDPS 0xc7a20cdf // Super D.P.S -#define CRC32_SDPS_MARIA 0x80d4eaca // マリアとカンパン -#define CRC32_SDPS_TONO 0xbb1edff1 // 遠野の森 -#define CRC32_SDPS_KAIZOKU 0xf81829e3 // 海賊家業 +#define CRC32_DALK_HINT 0x4793b843 // DALK ヒントディスク +#define CRC32_DRSTOP 0x73fa86c4 // Dr. STOP! #define CRC32_PROSTUDENTG_FD 0x5ffbfee7 // Prostudent -G- (FD) +#define CRC32_RANCE3_HINT 0x8d5ec610 // Rance3 ヒントディスク +#define CRC32_SDPS 0xc7a20cdf // Super D.P.S +#define CRC32_SDPS_MARIA 0x80d4eaca // Super D.P.S - マリアとカンパン +#define CRC32_SDPS_TONO 0xbb1edff1 // Super D.P.S - 遠野の森 +#define CRC32_SDPS_KAIZOKU 0xf81829e3 // Super D.P.S - うれしたのし海賊稼業 +#define CRC32_YAKATA2 0x2df591ff // ALICEの館II + +// SYSTEM3 #define CRC32_AMBIVALENZ_FD 0xa6b48dfe // AmbivalenZ (FD) #define CRC32_AMBIVALENZ_CD 0x4b10db69 // AmbivalenZ (CD) @@ -42,7 +67,8 @@ #define CRC32_YAKATA3_CD 0x7f8f5e2a // アリスの館3 (CD) #define CRC32_YAKATA3_FD 0x58ebcc99 // アリスの館3 (FD) #define CRC32_HASHIRIONNA2 0x09f47cbd // 走り女2 (Rance 4.x ヒントディスク) -#define CRC32_TOUSHIN2_SP 0x2172c7b2 // 闘神都市2 〜そして、それから〜 +#define CRC32_TOUSHIN2_GD 0xb5eba798 // 闘神都市2 グラフィックディスク +#define CRC32_TOUSHIN2_SP 0x2172c7b2 // 闘神都市2 そして、それから… #define CRC32_OTOMESENKI 0x49a4db15 // 乙女戦記 #define CRC32_NINGYO 0xd491e7ab // 人魚 -蘿子- #define CRC32_MUGENHOUYOU 0xbb27d1ba // 夢幻泡影 diff --git a/src/sys/mako_midi.cpp b/src/sys/mako_midi.cpp index e8d1544..11f07b5 100644 --- a/src/sys/mako_midi.cpp +++ b/src/sys/mako_midi.cpp @@ -302,7 +302,7 @@ std::vector MAKOMidi::generate_smf(int current_max) w.send_3bytes(0xb0 + play[i].channel, 0x0a, play[i].pan); } else if(d0 == 0xec) { - if (nact->crc32 != CRC32_DPS) + if(!(nact->crc32_a == CRC32_DPS || nact->crc32_a == CRC32_DPS_SG || nact->crc32_a == CRC32_DPS_SG2 || nact->crc32_a == CRC32_DPS_SG3)) mute_flag = true; } else if(d0 == 0xf5) { @@ -570,7 +570,7 @@ void MAKOMidi::load_mda(int page) int size; uint8* data = NULL; if((data = dri->load(path, page, &size)) == NULL) { - data = dri->load_mda(nact->crc32, page, &size); + data = dri->load_mda(nact->crc32_a, page, &size); } if(data) { diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index d49c167..62af737 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -16,8 +16,8 @@ extern SDL_Window* g_window; // 初期化 -NACT::NACT(int sys_ver, uint32 crc32, const char* font_file, const char* playlist) - : sys_ver(sys_ver), crc32(crc32) +NACT::NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist) + : sys_ver(sys_ver), crc32_a(crc32_a), crc32_b(crc32_b) { // デバッグコンソール起動 initialize_console(); @@ -44,7 +44,7 @@ NACT::NACT(int sys_ver, uint32 crc32, const char* font_file, const char* playlis delete fio; // ADISK.DAT - if (crc32 == CRC32_PROG_OMAKE) + if (crc32_a == CRC32_PROG_OMAKE) strcpy_s(adisk, 16, "AGAME.DAT"); else strcpy_s(adisk, 16, "ADISK.DAT"); @@ -295,8 +295,10 @@ void NACT::execute(T* impl) string[0] = cmd; string[1] = '\0'; ags->draw_text(string); - if(crc32 == CRC32_DPS && !ags->draw_menu) { - text_refresh = false; + if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) { + if(!ags->draw_menu) { + text_refresh = false; + } } if(!ags->draw_menu && text_wait_enb && cmd != 0x20) { @@ -324,8 +326,10 @@ void NACT::execute(T* impl) string[1] = getd(); string[2] = '\0'; ags->draw_text(string); - if(crc32 == CRC32_DPS && !ags->draw_menu) { - text_refresh = false; + if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) { + if(!ags->draw_menu) { + text_refresh = false; + } } if(!ags->draw_menu && text_wait_enb) { @@ -418,14 +422,15 @@ void NACT::fatal(const char* format, ...) { } NACT* NACT::create(const char* game_id, const char* font_file, const char* playlist) { - uint32 crc32 = NACT::calc_crc32(game_id); - int sys_ver = NACT::get_sys_ver(crc32); + uint32 crc32_a = NACT::calc_crc32("ADISK.DAT", game_id); + uint32 crc32_b = NACT::calc_crc32("BDISK.DAT", game_id); + int sys_ver = NACT::get_sys_ver(crc32_a, crc32_b); switch (sys_ver) { case 1: - return new NACT_Sys1(crc32, font_file, playlist); + return new NACT_Sys1(crc32_a, crc32_b, font_file, playlist); case 2: - return new NACT_Sys2(crc32, font_file, playlist); + return new NACT_Sys2(crc32_a, crc32_b, font_file, playlist); default: - return new NACT_Sys3(crc32, font_file, playlist); + return new NACT_Sys3(crc32_a, crc32_b, font_file, playlist); } } diff --git a/src/sys/nact.h b/src/sys/nact.h index 4231e94..45880a0 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -87,7 +87,7 @@ 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); + NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist); virtual ~NACT(); protected: @@ -172,7 +172,7 @@ protected: #endif int mouse_x = 0, mouse_y = 0; - static uint32 calc_crc32(const char* game_id); + static uint32 calc_crc32(const char* file_name, const char* game_id); // Y27 ダイアログ void text_dialog(); @@ -193,13 +193,14 @@ public: void select_sound(int dev); const char* get_game_id(); - static const int get_sys_ver(uint32 crc32); + static const int get_sys_ver(uint32 crc32_a, uint32 crc32_b); const char* get_title(); bool text_skip_enb; // メッセージスキップ bool text_wait_enb; // テキスト表示のウェイト有効/無効 int sys_ver; - uint32 crc32; + uint32 crc32_a; // ADISK + uint32 crc32_b; // BDISK for D.P.S -SG- and Super D.P.S // for Y27 char tvar[10][22]; @@ -215,7 +216,7 @@ public: class NACT_Sys1 : public NACT { public: - NACT_Sys1(uint32 crc32, const char* font_file, const char* playlist); + 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(); @@ -258,8 +259,6 @@ private: uint16 cali(); uint16 cali2(); - int menu_max; // メニューの改ページ - // Intruder Zコマンド int paint_x; int paint_y; @@ -268,7 +267,7 @@ private: class NACT_Sys2 : public NACT { public: - NACT_Sys2(uint32 crc32, const char* font_file, const char* playlist); + 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(); @@ -314,7 +313,7 @@ private: class NACT_Sys3 : public NACT { public: - NACT_Sys3(uint32 crc32, const char* font_file, const char* playlist); + 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(); diff --git a/src/sys/nact_crc32.cpp b/src/sys/nact_crc32.cpp index 3826b79..28b1638 100644 --- a/src/sys/nact_crc32.cpp +++ b/src/sys/nact_crc32.cpp @@ -13,52 +13,72 @@ namespace { const struct CRCTable { const char* id; int sys_ver; - uint32 crc32; const char* title; + uint32 crc32_a; + uint32 crc32_b; } crc_table[] = { - {"crescent", 1, CRC32_CRESCENT, "クレセントムーンがぁる"}, - {"dps", 1, CRC32_DPS, "D.P.S - Dream Program System"}, - {"fukei", 1, CRC32_FUKEI, "婦警さんVX"}, - {"intruder", 1, CRC32_INTRUDER, "Intruder -桜屋敷の探索-"}, - {"tengu", 1, CRC32_TENGU, "あぶないてんぐ伝説"}, - {"little_vampire", 1, CRC32_VAMPIRE, "Little Vampire"}, + {"bunkasai", 1, "あぶない文化祭前夜", CRC32_BUNKASAI}, + {"crescent", 1, "クレセントムーンがぁる", CRC32_CRESCENT}, + {"dps", 1, "D.P.S - Dream Program System", CRC32_DPS}, + {"dps_sg_fahren", 1, "D.P.S SG - Fahren Fliegen", CRC32_DPS_SG, CRC32_DPS_SG_FAHREN}, + {"dps_sg_katei", 1, "D.P.S SG - 家庭教師はステキなお仕事", CRC32_DPS_SG, CRC32_DPS_SG_KATEI}, + {"dps_sg_nobunaga", 1, "D.P.S SG - 信長の淫謀", CRC32_DPS_SG, CRC32_DPS_SG_NOBUNAGA}, + {"dps_sg2_antique", 1, "D.P.S SG set2 - ANTIQUE HOUSE", CRC32_DPS_SG2, CRC32_DPS_SG2_ANTIQUE}, + {"dps_sg2_ikenai", 1, "D.P.S SG set2 - いけない内科検診再び", CRC32_DPS_SG2, CRC32_DPS_SG2_IKENAI}, + {"dps_sg2_akai", 1, "D.P.S SG set2 - 朱い夜", CRC32_DPS_SG2, CRC32_DPS_SG2_AKAI}, + {"dps_sg3_rabbit", 1, "D.P.S SG set3 - Rabbit P4P", CRC32_DPS_SG3, CRC32_DPS_SG3_RABBIT}, + {"dps_sg3_shinkon", 1, "D.P.S SG set3 - しんこんさんものがたり", CRC32_DPS_SG3, CRC32_DPS_SG3_SHINKON}, + {"dps_sg3_sotsugyou", 1, "D.P.S SG set3 - 卒業", CRC32_DPS_SG3, CRC32_DPS_SG3_SOTSUGYOU}, + {"fukei", 1, "婦警さんVX", CRC32_FUKEI}, + {"intruder", 1, "Intruder -桜屋敷の探索-", CRC32_INTRUDER}, + {"tengu", 1, "あぶないてんぐ伝説", CRC32_TENGU}, + {"toushin_hint", 1, "闘神都市 ヒントディスク", CRC32_TOUSHIN_HINT}, + {"little_vampire", 1, "Little Vampire", CRC32_VAMPIRE}, + {"yakata", 1, "ALICEの館", CRC32_YAKATA}, - {"ayumi_proto", 2, CRC32_AYUMI_PROTO, "あゆみちゃん物語 PROTO"}, - {"sdps_maria", 2, CRC32_SDPS_MARIA, "Super D.P.S"}, - {"sdps_tono", 2, CRC32_SDPS_TONO, "Super D.P.S"}, - {"sdps_kaizoku", 2, CRC32_SDPS_KAIZOKU, "Super D.P.S"}, - {"prog_fd", 2, CRC32_PROSTUDENTG_FD, "Prostudent G"}, + {"ayumi_fd", 2, "あゆみちゃん物語", CRC32_AYUMI_FD}, + {"ayumi_hint", 2, "あゆみちゃん物語 ヒントディスク", CRC32_AYUMI_HINT}, + {"ayumi_proto", 2, "あゆみちゃん物語 PROTO", CRC32_AYUMI_PROTO}, + {"dalk_hint", 2, "DALK ヒントディスク", CRC32_DALK_HINT}, + {"drstop", 2, "Dr. STOP!", CRC32_DRSTOP}, + {"prog_fd", 2, "Prostudent G", CRC32_PROSTUDENTG_FD}, + {"rance3_hint", 2, "Rance3 ヒントディスク", CRC32_RANCE3_HINT}, + {"sdps_maria", 2, "Super D.P.S - マリアとカンパン", CRC32_SDPS, CRC32_SDPS_MARIA}, + {"sdps_tono", 2, "Super D.P.S - 遠野の森", CRC32_SDPS, CRC32_SDPS_TONO}, + {"sdps_kaizoku", 2, "Super D.P.S - うれしたのし海賊稼業", CRC32_SDPS, CRC32_SDPS_KAIZOKU}, + {"yakata2", 2, "ALICEの館II", CRC32_YAKATA2}, - {"ambivalenz_fd", 3, CRC32_AMBIVALENZ_FD, "AmbivalenZ −二律背反−"}, - {"ambivalenz_cd", 3, CRC32_AMBIVALENZ_CD, "AmbivalenZ −二律背反−"}, - {"dps_all", 3, CRC32_DPSALL, "D.P.S. 全部"}, - {"funnybee_cd", 3, CRC32_FUNNYBEE_CD, "宇宙快盗ファニーBee"}, -// {"funnybee_patch", 3, CRC32_FUNNYBEE_PATCH, "宇宙快盗ファニーBee"}, - {"funnybee_fd", 3, CRC32_FUNNYBEE_FD, "宇宙快盗ファニーBee"}, - {"onlyyou", 3, CRC32_ONLYYOU, "Only You −世紀末のジュリエット達−"}, - {"onlyyou_demo", 3, CRC32_ONLYYOU_DEMO, "Only You −世紀末のジュリエット達− デモ版"}, - {"prog_cd", 3, CRC32_PROSTUDENTG_CD, "Prostudent G"}, - {"prog_omake", 3, CRC32_PROG_OMAKE, "Prostudent G おまけ"}, - {"rance41", 3, CRC32_RANCE41, "ランス 4.1 〜お薬工場を救え!〜"}, - {"rance42", 3, CRC32_RANCE42, "ランス 4.2 〜エンジェル組〜"}, - {"ayumi_cd", 3, CRC32_AYUMI_CD, "あゆみちゃん物語"}, - {"ayumi_live_256", 3, CRC32_AYUMI_JISSHA_256, "あゆみちゃん物語 実写版"}, - {"ayumi_live_full", 3, CRC32_AYUMI_JISSHA_FULL, "あゆみちゃん物語 フルカラー実写版"}, - {"yakata3_cd", 3, CRC32_YAKATA3_CD, "アリスの館3"}, - {"yakata3_fd", 3, CRC32_YAKATA3_FD, "アリスの館3"}, - {"hashirionna2", 3, CRC32_HASHIRIONNA2, "走り女2"}, - {"toushin2_sp", 3, CRC32_TOUSHIN2_SP, "闘神都市2 そして、それから…"}, - {"otome", 3, CRC32_OTOMESENKI, "乙女戦記"}, - {"ningyo", 3, CRC32_NINGYO, "人魚 -蘿子-"}, - {"mugen", 3, CRC32_MUGENHOUYOU, "夢幻泡影"}, + {"ambivalenz_fd", 3, "AmbivalenZ −二律背反−", CRC32_AMBIVALENZ_FD}, + {"ambivalenz_cd", 3, "AmbivalenZ −二律背反−", CRC32_AMBIVALENZ_CD}, + {"dps_all", 3, "D.P.S. 全部", CRC32_DPSALL}, + {"funnybee_cd", 3, "宇宙快盗ファニーBee", CRC32_FUNNYBEE_CD}, +// {"funnybee_patch", 3, "宇宙快盗ファニーBee", CRC32_FUNNYBEE_PATCH}, + {"funnybee_fd", 3, "宇宙快盗ファニーBee", CRC32_FUNNYBEE_FD}, + {"onlyyou", 3, "Only You −世紀末のジュリエット達−", CRC32_ONLYYOU}, + {"onlyyou_demo", 3, "Only You −世紀末のジュリエット達− デモ版", CRC32_ONLYYOU_DEMO}, + {"prog_cd", 3, "Prostudent G", CRC32_PROSTUDENTG_CD}, + {"prog_omake", 3, "Prostudent G おまけ", CRC32_PROG_OMAKE}, + {"rance41", 3, "ランス 4.1 〜お薬工場を救え!〜", CRC32_RANCE41}, + {"rance42", 3, "ランス 4.2 〜エンジェル組〜", CRC32_RANCE42}, + {"ayumi_cd", 3, "あゆみちゃん物語", CRC32_AYUMI_CD}, + {"ayumi_live_256", 3, "あゆみちゃん物語 実写版", CRC32_AYUMI_JISSHA_256}, + {"ayumi_live_full", 3, "あゆみちゃん物語 フルカラー実写版", CRC32_AYUMI_JISSHA_FULL}, + {"yakata3_cd", 3, "アリスの館3", CRC32_YAKATA3_CD}, + {"yakata3_fd", 3, "アリスの館3", CRC32_YAKATA3_FD}, + {"hashirionna2", 3, "走り女2", CRC32_HASHIRIONNA2}, + {"toushin2_gd", 3,"闘神都市2 グラフィックディスク", CRC32_TOUSHIN2_GD}, + {"toushin2_sp", 3, "闘神都市2 そして、それから…", CRC32_TOUSHIN2_SP}, + {"otome", 3, "乙女戦記", CRC32_OTOMESENKI}, + {"ningyo", 3, "人魚 -蘿子-", CRC32_NINGYO}, + {"mugen", 3, "夢幻泡影", CRC32_MUGENHOUYOU}, - {NULL, 0, 0, NULL}, + {NULL}, }; -const CRCTable* lookup(uint32 crc32) +const CRCTable* lookup(uint32 crc32_a, uint32 crc32_b) { for (const CRCTable* t = crc_table; t->id; t++) { - if (crc32 == t->crc32) + if (crc32_a == t->crc32_a && (!t->crc32_b || crc32_b == t->crc32_b)) return t; } return NULL; @@ -66,19 +86,19 @@ const CRCTable* lookup(uint32 crc32) } // namespace -uint32 NACT::calc_crc32(const char* game_id) +uint32 NACT::calc_crc32(const char* file_name, const char* game_id) { if (game_id) { for (const CRCTable* t = crc_table; t->id; t++) { if (strcmp(t->id, game_id) == 0) - return t->crc32; + return file_name[0] == 'A' ? t->crc32_a : t->crc32_b; } } uint32 crc = 0; FILEIO* fio = new FILEIO(); - if(fio->Fopen("ADISK.DAT", FILEIO_READ_BINARY)) { + if(fio->Fopen(file_name, FILEIO_READ_BINARY)) { uint32 table[256]; for(int i = 0; i < 256; i++) { uint32 c = i; @@ -100,56 +120,27 @@ uint32 NACT::calc_crc32(const char* game_id) } fio->Fclose(); } - if(crc == CRC32_SDPS) { - // Super D.P.Sの場合はBDISK.DATのCRCを取る - if(fio->Fopen("BDISK.DAT", FILEIO_READ_BINARY)) { - uint32 table[256]; - for(int i = 0; i < 256; i++) { - uint32 c = i; - for(int j = 0; j < 8; j++) { - if(c & 1) { - c = (c >> 1) ^ 0xedb88320; - } else { - c >>= 1; - } - } - table[i] = c; - } - // BDISK.DATの先頭256bytes - crc = 0; - for(int i = 0; i < 256; i++) { - int d = fio->Fgetc(); - uint32 c = ~crc; - c = table[(c ^ d) & 0xff] ^ (c >> 8); - crc = ~c; - } - fio->Fclose(); - } - } delete fio; -#if 0 - printf("CRC: %x\n", crc); -#endif return crc; } const char* NACT::get_game_id() { - if (const CRCTable* entry = lookup(crc32)) + if (const CRCTable* entry = lookup(crc32_a, crc32_b)) return entry->id; return NULL; } -const int NACT::get_sys_ver(uint32 crc32) +const int NACT::get_sys_ver(uint32 crc32_a, uint32 crc32_b) { - if (const CRCTable* entry = lookup(crc32)) + if (const CRCTable* entry = lookup(crc32_a, crc32_b)) return entry->sys_ver; return 3; } const char* NACT::get_title() { - if (const CRCTable* entry = lookup(crc32)) + if (const CRCTable* entry = lookup(crc32_a, crc32_b)) return entry->title; return NULL; } diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 69616d8..8ea6f2a 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -17,6 +17,9 @@ #include "crc32.h" #include "../fileio.h" +// メニューの改ページ +#define MENU_MAX (crc32_a == CRC32_INTRUDER ? 6 : 11) + #define WAIT(tm) \ { \ Uint32 dwTime = SDL_GetTicks() + (tm); \ @@ -60,12 +63,14 @@ } \ } -NACT_Sys1::NACT_Sys1(uint32 crc32, const char* font_file, const char* playlist) - : NACT(1, crc32, font_file, playlist) +NACT_Sys1::NACT_Sys1(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist) + : NACT(1, crc32_a, crc32_b, font_file, playlist) { - menu_max = 6; - switch (crc32) { + switch (crc32_a) { case CRC32_DPS: + case CRC32_DPS_SG: + //case CRC32_DPS_SG2: + case CRC32_DPS_SG3: text_refresh = false; strcpy_s(tvar[0], 22, "\x83\x4A\x83\x58\x83\x5E\x83\x80"); // "カスタム" in SJIS strcpy_s(tvar[1], 22, "\x83\x8A\x81\x5B\x83\x69\x83\x58"); // "リーナス" in SJIS @@ -76,7 +81,6 @@ NACT_Sys1::NACT_Sys1(uint32 crc32, const char* font_file, const char* playlist) strcpy_s(tvar[6], 22, "\x90\x5E\x97\x9D\x8E\x71"); // "真理子" in SJIS break; case CRC32_INTRUDER: - menu_max = 11; paint_x = paint_y = map_page = 0; break; } @@ -84,7 +88,7 @@ NACT_Sys1::NACT_Sys1(uint32 crc32, const char* font_file, const char* playlist) void NACT_Sys1::opening() { - switch (crc32) { + switch (crc32_a) { case CRC32_CRESCENT: mako->play_music(2); ags->load_cg(1, -1); @@ -316,8 +320,10 @@ void NACT_Sys1::cmd_open_menu() return; } - if(crc32 == CRC32_DPS && !text_refresh) { - cmd_a(); + if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) { + if(!text_refresh) { + cmd_a(); + } } // クリック中の間は待機 @@ -472,7 +478,7 @@ top: ags->menu_dest_y = 0; ags->draw_menu = true; - if(cnt <= menu_max) { + if(cnt <= MENU_MAX) { // 1ページ内に全て表示できる for(int i = 0; i < MAX_VERB; i++) { if(chk[i]) { @@ -494,7 +500,7 @@ top2: ags->menu_dest_y += ags->menu_font_size + 2; } page = i + 1; - if(index == menu_max - 1) { + if(index == MENU_MAX - 1) { break; } } @@ -647,7 +653,7 @@ top: ags->menu_dest_y = 0; ags->draw_menu = true; - if(cnt <= menu_max - 1) { + if(cnt <= MENU_MAX - 1) { // 1ページ内に全て表示できる for(int i = 0; i < MAX_OBJ; i++) { if(chk[i]) { @@ -675,7 +681,7 @@ top2: ags->menu_dest_y += ags->menu_font_size + 2; } page = i + 1; - if(index == menu_max - 2) { + if(index == MENU_MAX - 2) { break; } } @@ -832,8 +838,9 @@ void NACT_Sys1::cmd_a() // ウィンドウ更新 ags->clear_text_window(text_window, true); - if (crc32 == CRC32_DPS) + if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) { text_refresh = true; + } } void NACT_Sys1::cmd_b() @@ -867,13 +874,13 @@ void NACT_Sys1::cmd_g() output_console("\nG %d:", page); - if (crc32 == CRC32_INTRUDER) { + if(crc32_a == CRC32_INTRUDER) { page = (page == 97) ? 96 : (page == 98) ? 97 : page; } ags->load_cg(page, -1); - if (crc32 == CRC32_INTRUDER) { + if(crc32_a == CRC32_INTRUDER) { if(page == 94) { WAIT(400); } @@ -1169,7 +1176,7 @@ void NACT_Sys1::cmd_u() output_console("\nU %d,%d:", page, transparent); - if (crc32 == CRC32_INTRUDER) { + if(crc32_a == CRC32_INTRUDER) { ags->load_cg(page, 11); if(page == 5) { @@ -1210,7 +1217,7 @@ void NACT_Sys1::cmd_y() output_console("\nY %d,%d:", cmd, param); - switch (crc32) { + switch (crc32_a) { case CRC32_BUNKASAI: case CRC32_CRESCENT: case CRC32_DPS: @@ -1244,7 +1251,7 @@ void NACT_Sys1::cmd_y() } break; case 2: - switch (crc32) { + switch (crc32_a) { case CRC32_CRESCENT: for(int i = 39; i <= 48; i++) var[i] = 0; @@ -1266,12 +1273,12 @@ void NACT_Sys1::cmd_y() RND = (param == 0 || param == 1) ? 0 : random(param); break; case 7: - if(crc32 == CRC32_DPS && param == 1) { + if(crc32_a == CRC32_DPS && param == 1) { ags->box_fill(0, 40, 8, 598, 270, 0); } break; case 130: - if (crc32 == CRC32_TENGU) { + if (crc32_a == CRC32_TENGU) { WAIT(2000) ags->load_cg(180, -1); @@ -1306,7 +1313,7 @@ void NACT_Sys1::cmd_y() RND = 0; break; case 255: - if (crc32 == CRC32_DPS) + if (crc32_a == CRC32_DPS) post_quit = false; else post_quit = true; @@ -1366,7 +1373,7 @@ void NACT_Sys1::cmd_y() void NACT_Sys1::cmd_z() { - if (crc32 == CRC32_CRESCENT) { + if (crc32_a == CRC32_CRESCENT) { cmd_y(); return; } @@ -1375,7 +1382,7 @@ void NACT_Sys1::cmd_z() output_console("\nZ %d,%d:", cmd, param); - switch (crc32) { + switch (crc32_a) { case CRC32_INTRUDER: if(cmd == 1 && 1 <= param && param <= 4) { const char* buf[4] = { diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index a9e2034..3739e7d 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -55,8 +55,8 @@ } \ } -NACT_Sys2::NACT_Sys2(uint32 crc32, const char* font_file, const char* playlist) - : NACT(2, crc32, font_file, playlist) +NACT_Sys2::NACT_Sys2(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist) + : NACT(2, crc32_a, crc32_b, font_file, playlist) { } @@ -790,7 +790,7 @@ void NACT_Sys2::cmd_b() ags->menu_w[index - 1].screen = NULL; } } else if(cmd == 2) { -// if(crc32 == CRC32_PROSTUDENTG_FD) { +// if(crc32_a == CRC32_PROSTUDENTG_FD) { // ags->menu_w[index - 1].frame = (index == 1 || index == 3) ? true : false; // } else ags->menu_w[index - 1].frame = p1 ? true : false; @@ -815,7 +815,7 @@ void NACT_Sys2::cmd_b() } else if(cmd == 4) { if(p5 == 0) { // ウィンドウ退避 -// if(crc32 == CRC32_PROSTUDENTG_FD) { +// if(crc32_a == CRC32_PROSTUDENTG_FD) { // ags->text_w[index - 1].frame = (index == 1 || index == 3) ? true : false; // } else ags->text_w[index - 1].frame = p1 ? true : false; @@ -864,7 +864,7 @@ void NACT_Sys2::cmd_g() output_console("\nG %d:", page); - if(crc32 == CRC32_SDPS_TONO || crc32 == CRC32_SDPS_KAIZOKU) { + if(crc32_a == CRC32_SDPS && (crc32_b == CRC32_SDPS_TONO || crc32_b == CRC32_SDPS_KAIZOKU)) { if(20 <= page && page <= 100) { page--; } @@ -1308,7 +1308,7 @@ void NACT_Sys2::cmd_y() RND = (param == 0 || param == 1) ? 0 : random(param); break; case 7: - if(crc32 != CRC32_SDPS_MARIA) { + if(!(crc32_a == CRC32_SDPS && crc32_b == CRC32_SDPS_MARIA)) { ags->draw_box(param); } break; diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index 1a2999f..4013d46 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -13,8 +13,8 @@ #include "../fileio.h" #include "texthook.h" -NACT_Sys3::NACT_Sys3(uint32 crc32, const char* font_file, const char* playlist) - : NACT(3, crc32, font_file, playlist) +NACT_Sys3::NACT_Sys3(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist) + : NACT(3, crc32_a, crc32_b, font_file, playlist) { } @@ -431,10 +431,9 @@ void NACT_Sys3::cmd_b() if(cmd == 1) { // あゆみちゃん物語 - if(crc32 == CRC32_AYUMI_CD || crc32 == CRC32_AYUMI_JISSHA_256 || crc32 == CRC32_AYUMI_JISSHA_FULL) { + if(crc32_a == CRC32_AYUMI_CD || crc32_a == CRC32_AYUMI_JISSHA_256 || crc32_a == CRC32_AYUMI_JISSHA_FULL) { p5 = 1; } - ags->menu_w[index - 1].sx = column ? p1 * 8 : p1 & 0xfff8; ags->menu_w[index - 1].sy = p2; ags->menu_w[index - 1].ex = column ? p3 * 8 - 1 : (p3 & 0xfff8) - 1; @@ -469,7 +468,7 @@ void NACT_Sys3::cmd_b() } else if(cmd == 4) { if(p5 == 0) { // ウィンドウ退避 - if(crc32 == CRC32_PROSTUDENTG_CD && p4) { + if(crc32_a == CRC32_PROSTUDENTG_CD && p4) { // prostudent G オープニング画面化け対策 if(ags->text_w[index - 1].window) { free(ags->text_w[index - 1].window); @@ -586,7 +585,7 @@ void NACT_Sys3::cmd_i() // X方向はカラム単位で切り捨て sx = column ? sx * 8 : sx & 0xfff8; - ex = column ? ex * 8 - 1 : (crc32 == CRC32_NINGYO) ? (ex & 0xfff8) + 7 : (ex & 0xfff8) - 1; + ex = column ? ex * 8 - 1 : (crc32_a == CRC32_NINGYO) ? (ex & 0xfff8) + 7 : (ex & 0xfff8) - 1; dx = column ? dx * 8 : dx & 0xfff8; ags->copy(sx, sy, ex, ey, dx, dy); } @@ -1075,7 +1074,7 @@ void NACT_Sys3::cmd_u() output_console("\nU %d,%d:", page, transparent); - if(crc32 == CRC32_RANCE41 || crc32 == CRC32_RANCE42) { + if(crc32_a == CRC32_RANCE41 || crc32_a == CRC32_RANCE42) { transparent = (transparent == 28) ? 12 : transparent; } ags->load_cg(page, transparent); @@ -1413,7 +1412,7 @@ void NACT_Sys3::cmd_y() case 231: D01 = 640; D02 = (param == 1) ? ags->screen_height : 480; - D03 = (crc32 == CRC32_YAKATA3_FD) ? 16 : 256; + D03 = (crc32_a == CRC32_YAKATA3_FD) ? 16 : 256; break; case 232: if(ags->screen_height != param ? 480 : 400) { @@ -1500,13 +1499,13 @@ void NACT_Sys3::cmd_y() column = param ? false : true; break; case 252: - RND = (crc32 == CRC32_YAKATA3_FD) ? 4 : 8; + RND = (crc32_a == CRC32_YAKATA3_FD) ? 4 : 8; break; case 253: show_push = (param == 0) ? true : false; break; case 254: - RND = (crc32 == CRC32_YAKATA3_CD || crc32 == CRC32_YAKATA3_FD || crc32 == CRC32_NINGYO) ? 1 : 0; + RND = (crc32_a == CRC32_YAKATA3_CD || crc32_a == CRC32_YAKATA3_FD || crc32_a == CRC32_NINGYO) ? 1 : 0; break; case 255: post_quit = (param == 1) ? true : false;