Merge upstream changes: CRC32 updates

- Check CRC32 of both ADISK.DAT (storead as crc32_a) and BDISK.DAT (crc32_b)
- Update the CRC32 database adding more titles
This commit is contained in:
kichikuou
2020-05-22 16:09:55 +09:00
parent e8d254328a
commit 657057fa64
12 changed files with 185 additions and 158 deletions
+3 -3
View File
@@ -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);
+3 -3
View File
@@ -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 {
+5 -5
View File
@@ -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++) {
+2 -2
View File
@@ -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];
+36 -10
View File
@@ -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 // 夢幻泡影
+2 -2
View File
@@ -302,7 +302,7 @@ std::vector<uint8> 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) {
+17 -12
View File
@@ -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);
}
}
+8 -9
View File
@@ -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();
+64 -73
View File
@@ -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;
}
+30 -23
View File
@@ -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] = {
+6 -6
View File
@@ -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;
+9 -10
View File
@@ -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;