From de3bbf25955f1426ded51f378802f8f85c6d3ab9 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 18 Aug 2019 16:55:17 +0900 Subject: [PATCH] System1: Detect game title by CRC32 --- src/sys/ags.cpp | 63 ++++++---- src/sys/ags_draw.cpp | 25 ++-- src/sys/crc32.h | 8 ++ src/sys/mako_midi.cpp | 6 +- src/sys/nact.cpp | 38 +++--- src/sys/nact.h | 11 +- src/sys/nact_crc32.cpp | 49 ++++---- src/sys/nact_sys1.cpp | 263 +++++++++++++++++++++-------------------- src/sys/nact_sys2.cpp | 8 -- 9 files changed, 252 insertions(+), 219 deletions(-) diff --git a/src/sys/ags.cpp b/src/sys/ags.cpp index 5fd7fa3..cb959c7 100644 --- a/src/sys/ags.cpp +++ b/src/sys/ags.cpp @@ -167,33 +167,44 @@ AGS::AGS(NACT* parent) : nact(parent) // Bコマンド for(int i = 0; i < 10; i++) { // ウィンドウの初期位置はシステムによって異なる -#if defined(_BUNKASAI) - SET_TEXT(i, 24, 304, 616, 384, false); - SET_MENU(i, 440, 18, 620, 178, true); -#elif defined(_CRESCENT) - SET_TEXT(i, 24, 288, 616, 378, false); - // 本来は横メニュー - SET_MENU(i, 464, 50, 623, 240, true); -#elif defined(_DPS) - SET_TEXT(i, 48, 288, 594, 393, false); - //SET_MENU(i, 48, 288, 584, 393, false); - SET_MENU(i, 48, 288, 594, 393, false); -#elif defined(_FUKEI) - SET_TEXT(i, 44, 282, 593, 396, false); - SET_MENU(i, 460, 14, 635, 214, false); -#elif defined(_INTRUDER) - SET_TEXT(i, 8, 280, 629, 393, false); - SET_MENU(i, 448, 136, 623, 340, true); -#elif defined(_TENGU) - SET_TEXT(i, 44, 282, 593, 396, false); - SET_MENU(i, 452, 14, 627, 214, false); -#elif defined(_VAMPIRE) - SET_TEXT(i, 8, 255, 615, 383, false); - SET_MENU(i, 448, 11, 615, 224, false); -#else - SET_TEXT(i, 8, 311, 623, 391, true); - SET_MENU(i, 464, 80, 623, 240, true); + switch (nact->crc32) { +#if defined(_SYSTEM1) + case CRC32_BUNKASAI: + SET_TEXT(i, 24, 304, 616, 384, false); + SET_MENU(i, 440, 18, 620, 178, true); + break; + case CRC32_CRESCENT: + SET_TEXT(i, 24, 288, 616, 378, false); + // 本来は横メニュー + SET_MENU(i, 464, 50, 623, 240, true); + break; + case CRC32_DPS: + SET_TEXT(i, 48, 288, 594, 393, false); + //SET_MENU(i, 48, 288, 584, 393, false); + SET_MENU(i, 48, 288, 594, 393, false); + break; + case CRC32_FUKEI: + SET_TEXT(i, 44, 282, 593, 396, false); + SET_MENU(i, 460, 14, 635, 214, false); + break; + case CRC32_INTRUDER: + SET_TEXT(i, 8, 280, 629, 393, false); + SET_MENU(i, 448, 136, 623, 340, true); + break; + case CRC32_TENGU: + SET_TEXT(i, 44, 282, 593, 396, false); + SET_MENU(i, 452, 14, 627, 214, false); + break; + case CRC32_VAMPIRE: + SET_TEXT(i, 8, 255, 615, 383, false); + SET_MENU(i, 448, 11, 615, 224, false); + break; #endif + default: + SET_TEXT(i, 8, 311, 623, 391, true); + SET_MENU(i, 464, 80, 623, 240, true); + break; + } text_w[i].push = false; text_w[i].screen = NULL; text_w[i].window = NULL; diff --git a/src/sys/ags_draw.cpp b/src/sys/ags_draw.cpp index 122d865..08c52cf 100644 --- a/src/sys/ags_draw.cpp +++ b/src/sys/ags_draw.cpp @@ -31,16 +31,21 @@ void AGS::load_cg(int page, int transparent) uint8* data = dri->load(acg, page, &size); if(data) { #if defined(_SYSTEM1) -#if defined(_BUNKASAI) - load_vsp(data, page, transparent); -#elif defined(_INTRUDER) -// load_gm3(data, page, transparent); - load_vsp(data, page, transparent); // 暫定 -#elif defined(_VAMPIRE) - load_vsp2l(data, page, transparent); -#else - load_gl3(data, page, transparent); -#endif + switch (nact->crc32) { + case CRC32_BUNKASAI: + load_vsp(data, page, transparent); + break; + case CRC32_INTRUDER: + // load_gm3(data, page, transparent); + load_vsp(data, page, transparent); // 暫定 + break; + case CRC32_VAMPIRE: + load_vsp2l(data, page, transparent); + break; + default: + load_gl3(data, page, transparent); + break; + } #elif defined(_SYSTEM2) if(nact->crc32 == CRC32_AYUMI_PROTO) { // あゆみちゃん物語 PROTO diff --git a/src/sys/crc32.h b/src/sys/crc32.h index d56ab26..0926cc4 100644 --- a/src/sys/crc32.h +++ b/src/sys/crc32.h @@ -10,6 +10,14 @@ // ADISK.DATの先頭256bytes #if defined(_SYSTEM1) +#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_TENGU 0xc942ff58 // あぶないてんぐ伝説 +#define CRC32_VAMPIRE 0x957bcfbf // Little Vampire +#define CRC32_BUNKASAI 0 // あぶない文化祭前夜? (未確認) + #elif defined(_SYSTEM2) #define CRC32_AYUMI_PROTO 0x4e2f5678 // あゆみちゃん物語 PROTO diff --git a/src/sys/mako_midi.cpp b/src/sys/mako_midi.cpp index 3add5da..eedd102 100644 --- a/src/sys/mako_midi.cpp +++ b/src/sys/mako_midi.cpp @@ -6,6 +6,7 @@ #include "mako.h" #include "dri.h" +#include "crc32.h" #define next_mml(p) mml[p].data[mml[p].addr++] @@ -197,11 +198,12 @@ void MAKO::play_midi() play[i].pan = next_mml(i); send_3bytes(0xb0 + play[i].channel, 0x0a, play[i].pan); } -#if !defined(_DPS) else if(d0 == 0xec) { +#ifdef _SYSTEM1 + if (nact->crc32 != CRC32_DPS) +#endif mute_flag = true; } -#endif else if(d0 == 0xf5) { int n = next_mml(i); if(n != play[i].timbre) { diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index 7d93147..4ca1f66 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -9,6 +9,7 @@ #include "mako.h" #include "dri.h" #include "../fileio.h" +#include "crc32.h" // 初期化 @@ -87,18 +88,25 @@ NACT::NACT() pcm_index = 0; memset(pcm, 0, sizeof(pcm)); +#ifdef _SYSTEM1 // SYETEM1 初期化 -#if defined(_DPS) - text_refresh = false; - _tcscpy_s(tvar[0], 22, _T("カスタム")); - _tcscpy_s(tvar[1], 22, _T("リーナス")); - _tcscpy_s(tvar[2], 22, _T("かつみ")); - _tcscpy_s(tvar[3], 22, _T("由美子")); - _tcscpy_s(tvar[4], 22, _T("いつみ")); - _tcscpy_s(tvar[5], 22, _T("ひとみ")); - _tcscpy_s(tvar[6], 22, _T("真理子")); -#elif defined(_INTRUDER) - paint_x = paint_y = map_page = 0; + menu_max = 6; + switch (crc32) { + case CRC32_DPS: + text_refresh = false; + _tcscpy_s(tvar[0], 22, _T("カスタム")); + _tcscpy_s(tvar[1], 22, _T("リーナス")); + _tcscpy_s(tvar[2], 22, _T("かつみ")); + _tcscpy_s(tvar[3], 22, _T("由美子")); + _tcscpy_s(tvar[4], 22, _T("いつみ")); + _tcscpy_s(tvar[5], 22, _T("ひとみ")); + _tcscpy_s(tvar[6], 22, _T("真理子")); + break; + case CRC32_INTRUDER: + menu_max = 11; + paint_x = paint_y = map_page = 0; + break; + } #endif // 各種クラス生成 @@ -302,8 +310,8 @@ void NACT::execute() string[0] = cmd; string[1] = '\0'; ags->draw_text(string); -#if defined(_DPS) - if(!ags->draw_menu) { +#if defined(_SYSTEM1) + if(crc32 == CRC32_DPS && !ags->draw_menu) { text_refresh = false; } #endif @@ -335,8 +343,8 @@ void NACT::execute() string[1] = getd(); string[2] = '\0'; ags->draw_text(string); -#if defined(_DPS) - if(!ags->draw_menu) { +#if defined(_SYSTEM1) + if(crc32 == CRC32_DPS && !ags->draw_menu) { text_refresh = false; } #endif diff --git a/src/sys/nact.h b/src/sys/nact.h index e034602..ea7d1b9 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -163,13 +163,16 @@ private: #if defined(_SYSTEM1) void opening(); -#if defined(_DPS) + + int menu_max; // メニューの改ページ + + // DPS bool text_refresh; -#elif defined(_INTRUDER) - int paint_x; // Intruder Zコマンド + + // Intruder Zコマンド + int paint_x; int paint_y; int map_page; -#endif #endif bool column; // 座標モード diff --git a/src/sys/nact_crc32.cpp b/src/sys/nact_crc32.cpp index fb7afbe..44896fc 100644 --- a/src/sys/nact_crc32.cpp +++ b/src/sys/nact_crc32.cpp @@ -64,9 +64,7 @@ uint32 NACT::calc_crc32() #endif delete fio; #if 0 -FILE* fp = fopen("crc32.txt", "w"); -fprintf(fp, "%x\n", crc); -fclose(fp); + printf("CRC: %x\n", crc); #endif return crc; } @@ -75,28 +73,29 @@ bool NACT::get_title(_TCHAR title[], int length) { #if defined(_SYSTEM1) -#if defined(_CRESCENT) - _tcscpy_s(title, length, _T("繧ッ繝ャ繧サ繝ウ繝医Β繝シ繝ウ縺後=繧�")); - return true; -#elif defined(_DPS) - _tcscpy_s(title, length, _T("D.P.S - Dream Program System")); - return true; -#elif defined(_FUKEI) - _tcscpy_s(title, length, _T("蟀ヲ隴ヲ縺輔s�シカ�シク")); - return true; -#elif defined(_INTRUDER) - _tcscpy_s(title, length, _T("Intruder -譯懷ア区聞縺ョ謗「邏「-")); - return true; -#elif defined(_TENGU) - _tcscpy_s(title, length, _T("縺ゅ�カ縺ェ縺�縺ヲ繧薙$莨晁ェャ")); - return true; -#elif defined(_VAMPIRE) - _tcscpy_s(title, length, _T("Little Vampire")); - return true; -#else - title[0] = _T('\0'); - return false; -#endif + switch(crc32) { + case CRC32_CRESCENT: + _tcscpy_s(title, length, _T("繧ッ繝ャ繧サ繝ウ繝医Β繝シ繝ウ縺後=繧�")); + return true; + case CRC32_DPS: + _tcscpy_s(title, length, _T("D.P.S - Dream Program System")); + return true; + case CRC32_FUKEI: + _tcscpy_s(title, length, _T("蟀ヲ隴ヲ縺輔s�シカ�シク")); + return true; + case CRC32_INTRUDER: + _tcscpy_s(title, length, _T("Intruder -譯懷ア区聞縺ョ謗「邏「-")); + return true; + case CRC32_TENGU: + _tcscpy_s(title, length, _T("縺ゅ�カ縺ェ縺�縺ヲ繧薙$莨晁ェャ")); + return true; + case CRC32_VAMPIRE: + _tcscpy_s(title, length, _T("Little Vampire")); + return true; + default: + title[0] = _T('\0'); + return false; + } #elif defined(_SYSTEM2) diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 44814b5..658ae71 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -17,13 +17,6 @@ #include "crc32.h" #include "../fileio.h" -// メニューの改ページ -#if defined(_INTRUDER) -#define MENU_MAX 6 -#else -#define MENU_MAX 11 -#endif - #define WAIT(tm) \ { \ Uint32 dwTime = SDL_GetTicks() + (tm); \ @@ -69,23 +62,27 @@ void NACT::opening() { -#if defined(_CRESCENT) - mako->play_music(2); - ags->load_cg(1, -1); - WAIT(3000); - ags->load_cg(81, -1); -#elif defined(_INTRUDER) - ags->load_cg(77, -1); - WAIT(1667) - ags->load_cg(74, -1); -#elif defined(_VAMPIRE) - mako->play_music(4); - ags->load_cg(3, -1); - WAIT(2000) - ags->load_cg(38, -1); - cmd_a(); - ags->draw_box(0); -#endif + switch (crc32) { + case CRC32_CRESCENT: + mako->play_music(2); + ags->load_cg(1, -1); + WAIT(3000); + ags->load_cg(81, -1); + break; + case CRC32_INTRUDER: + ags->load_cg(77, -1); + WAIT(1667); + ags->load_cg(74, -1); + break; + case CRC32_VAMPIRE: + mako->play_music(4); + ags->load_cg(3, -1); + WAIT(2000); + ags->load_cg(38, -1); + cmd_a(); + ags->draw_box(0); + break; + } } void NACT::cmd_calc() @@ -327,11 +324,9 @@ void NACT::cmd_open_menu() return; } -#if defined(_DPS) - if(!text_refresh) { + if(crc32 == CRC32_DPS && !text_refresh) { cmd_a(); } -#endif // クリック中の間は待機 for(;;) { @@ -497,7 +492,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]) { @@ -519,7 +514,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; } } @@ -672,7 +667,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]) { @@ -700,7 +695,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; } } @@ -861,9 +856,8 @@ void NACT::cmd_a() // ウィンドウ更新 ags->clear_text_window(text_window, true); -#if defined(_DPS) - text_refresh = true; -#endif + if (crc32 == CRC32_DPS) + text_refresh = true; } void NACT::cmd_b() @@ -902,20 +896,20 @@ void NACT::cmd_g() output_console(log); #endif -#if defined(_INTRUDER) - page = (page == 97) ? 96 : (page == 98) ? 97 : page; -#endif + if (crc32 == CRC32_INTRUDER) { + page = (page == 97) ? 96 : (page == 98) ? 97 : page; + } ags->load_cg(page, -1); -#if defined(_INTRUDER) - if(page == 94) { - WAIT(400) + if (crc32 == CRC32_INTRUDER) { + if(page == 94) { + WAIT(400); + } + if(page == 81 || page == 82) { + map_page = page; + } } - if(page == 81 || page == 82) { - map_page = page; - } -#endif } void NACT::cmd_h() @@ -1222,15 +1216,15 @@ void NACT::cmd_u() output_console(log); #endif -#if defined(_INTRUDER) - ags->load_cg(page, 11); + if (crc32 == CRC32_INTRUDER) { + ags->load_cg(page, 11); - if(page == 5) { - WAIT(400) + if(page == 5) { + WAIT(400); + } + } else { + ags->load_cg(page, transparent); } -#else - ags->load_cg(page, transparent); -#endif } void NACT::cmd_v() @@ -1269,8 +1263,13 @@ void NACT::cmd_y() output_console(log); #endif -#if defined(_BUNKASAI) || defined(_CRESCENT) || defined(_DPS) || defined(_FUKEI) || defined(_TENGU) - switch(cmd) { + switch (crc32) { + case CRC32_BUNKASAI: + case CRC32_CRESCENT: + case CRC32_DPS: + case CRC32_FUKEI: + case CRC32_TENGU: + switch(cmd) { case 0: ags->clear_text_window(text_window, true); break; @@ -1298,14 +1297,19 @@ void NACT::cmd_y() } break; case 2: -#if defined(_CRESCENT) - for(int i = 39; i <= 48; i++) { -#elif defined(_DPS) - for(int i = 0; i <= 20; i++) { -#else - for(int i = 0; i <= 16; i++) { -#endif - var[i] = 0; + switch (crc32) { + case CRC32_CRESCENT: + for(int i = 39; i <= 48; i++) + var[i] = 0; + break; + case CRC32_DPS: + for(int i = 0; i <= 20; i++) + var[i] = 0; + break; + default: + for(int i = 0; i <= 16; i++) + var[i] = 0; + break; } break; case 3: @@ -1314,16 +1318,13 @@ void NACT::cmd_y() case 4: RND = (param == 0 || param == 1) ? 0 : random(param); break; -#if defined(_DPS) case 7: - if(param == 1) { + if(crc32 == CRC32_DPS && param == 1) { ags->box_fill(0, 40, 8, 598, 270, 0); } break; -#endif -#if defined(_TENGU) case 130: - { + if (crc32 == CRC32_TENGU) { WAIT(2000) ags->load_cg(180, -1); @@ -1350,7 +1351,6 @@ void NACT::cmd_y() ags->draw_box(param); } break; -#endif case 253: post_quit = false; fatal_error = true; @@ -1359,16 +1359,16 @@ void NACT::cmd_y() RND = 0; break; case 255: -#if defined(_DPS) - post_quit = false; -#else - post_quit = true; -#endif + if (crc32 == CRC32_DPS) + post_quit = false; + else + post_quit = true; fatal_error = true; break; - } -#elif defined(_INTRUDER) - switch(cmd) { + } + break; + case CRC32_INTRUDER: + switch(cmd) { case 0: ags->clear_text_window(text_window, true); break; @@ -1412,16 +1412,17 @@ void NACT::cmd_y() post_quit = true; fatal_error = true; break; + } + break; } -#endif } void NACT::cmd_z() { -#if defined(_CRESCENT) - cmd_y(); - return; -#endif + if (crc32 == CRC32_CRESCENT) { + cmd_y(); + return; + } int cmd = cali(); int param = cali(); @@ -1431,60 +1432,64 @@ void NACT::cmd_z() output_console(log); #endif -#if defined(_INTRUDER) - if(cmd == 1 && 1 <= param && param <= 4) { - char* buf[4] = {"<", "∧", ">", "∨"}; + switch (crc32) { + case CRC32_INTRUDER: + if(cmd == 1 && 1 <= param && param <= 4) { + char* buf[4] = {"<", "∧", ">", "∨"}; - // 矢印を消去する - if(map_page) { - ags->load_cg(map_page, -1); + // 矢印を消去する + if(map_page) { + ags->load_cg(map_page, -1); + if(paint_x) { + ags->paint(paint_x, paint_y * 2, 2 + 16); + } + } + + // 矢印を表示する + int x = ags->text_dest_x; + int y = ags->text_dest_y; + int color = ags->text_font_color; + ags->text_font_size = 24; + ags->text_font_color = 16; + + ags->text_dest_x = 456; + ags->text_dest_y = 103; + ags->draw_text(buf[param - 1]); + + ags->text_dest_x = x; + ags->text_dest_y = y; + ags->text_font_size = 16; + ags->text_font_color = color; + } else if(cmd == 2) { + ags->load_cg(74, -1); + ags->load_cg(81, -1); + map_page = 81; + } else if(cmd == 3) { + RND = (param == 0 || param == 1) ? 0 : random(param); + } else if(460 <= cmd && cmd <= 625 && 20 <= param && param <= 55) { if(paint_x) { - ags->paint(paint_x, paint_y * 2, 2 + 16); + ags->paint(paint_x, paint_y * 2, 5 + 16); + } + ags->paint(cmd, param * 2, 2 + 16); + paint_x = cmd; + paint_y = param; + } else { + paint_x = 0; + } + break; + + case CRC32_TENGU: + if(cmd == 10) { + // nop + } else if(cmd == 20) { + if(param == 20) { + ags->gcopy(8, 8, 46, 144, 2); + } else if(param == 21) { + ags->gcopy(8, 8, 46, 144, 3); } } - - // 矢印を表示する - int x = ags->text_dest_x; - int y = ags->text_dest_y; - int color = ags->text_font_color; - ags->text_font_size = 24; - ags->text_font_color = 16; - - ags->text_dest_x = 456; - ags->text_dest_y = 103; - ags->draw_text(buf[param - 1]); - - ags->text_dest_x = x; - ags->text_dest_y = y; - ags->text_font_size = 16; - ags->text_font_color = color; - } else if(cmd == 2) { - ags->load_cg(74, -1); - ags->load_cg(81, -1); - map_page = 81; - } else if(cmd == 3) { - RND = (param == 0 || param == 1) ? 0 : random(param); - } else if(460 <= cmd && cmd <= 625 && 20 <= param && param <= 55) { - if(paint_x) { - ags->paint(paint_x, paint_y * 2, 5 + 16); - } - ags->paint(cmd, param * 2, 2 + 16); - paint_x = cmd; - paint_y = param; - } else { - paint_x = 0; + break; } -#elif defined(_TENGU) - if(cmd == 10) { - // nop - } else if(cmd == 20) { - if(param == 20) { - ags->gcopy(8, 8, 46, 144, 2); - } else if(param == 21) { - ags->gcopy(8, 8, 46, 144, 3); - } - } -#endif } diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index 65b3aa3..d8c4744 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -1343,15 +1343,7 @@ void NACT::cmd_u() output_console(log); #endif -#if defined(_INTRUDER) - ags->load_cg(page, 11); - - if(page == 5) { - WAIT(400) - } -#else ags->load_cg(page, transparent); -#endif } void NACT::cmd_v()