From 6d39b6feee929497bcabd13b9f892f9d68e9b8f7 Mon Sep 17 00:00:00 2001 From: kichikuou Date: Fri, 22 May 2020 19:39:47 +0900 Subject: [PATCH] Merge upstream changes: Merge DRI changes - Fail if file entry's size is 0 - load_mda() can now load MDA from subsequent disks. --- src/sys/dri.cpp | 159 +++++++++++++++++++++++++++++++++++++++--- src/sys/dri.h | 4 +- src/sys/mako_midi.cpp | 2 +- 3 files changed, 153 insertions(+), 12 deletions(-) diff --git a/src/sys/dri.cpp b/src/sys/dri.cpp index 4197a2e..df87973 100644 --- a/src/sys/dri.cpp +++ b/src/sys/dri.cpp @@ -62,24 +62,86 @@ uint8* DRI::load(const char* file_name, int page, int* size) int end_sector = fio->Fgetc(); end_sector |= fio->Fgetc() << 8; - int buffer_size = (end_sector - start_sector) * 256; - uint8* buffer = (uint8*)malloc(buffer_size); + if((*size = (end_sector - start_sector) * 256) == 0) { + // サイズ不正 + fio->Fclose(); + delete fio; + return NULL; + } + + uint8 *buffer = (uint8 *)malloc(*size); fio->Fseek((start_sector - 1) * 256, FILEIO_SEEK_SET); fio->Fread(buffer, 256, end_sector - start_sector); fio->Fclose(); delete fio; - *size = buffer_size; return buffer; } -uint8* DRI::load_mda(uint32 crc32, int page, int* size) +uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size) { // データ取得 const char* fname = NULL; - switch(crc32) { + switch(crc32_a) { + case CRC32_BUNKASAI: // あぶない文化祭前夜 + fname = "AMUS_AB.MDA"; + break; + case CRC32_CRESCENT: // クレセントムーンがぁる + fname = "AMUS_CRS.MDA"; + break; + case CRC32_DPS: // D.P.S. - Dream Program System + fname = "AMUS_DPS.MDA"; + break; + case CRC32_DPS_SG: // D.P.S. SG +// case CRC32_DPS_SG2: // D.P.S. SG set2 + case CRC32_DPS_SG3: // D.P.S. SG set2 + fname = "AMUS_SG.MDA"; + break; + case CRC32_FUKEI: // 婦警さんVX + fname = "AMUS_VX.MDA"; + break; + case CRC32_INTRUDER: // Intruder -桜屋敷の探索- + fname = "AMUS_INT"; + break; + case CRC32_TENGU: // あぶないてんぐ伝説 + fname = "AMUS_AT"; + break; + case CRC32_TOUSHIN_HINT: // 闘神都市 ヒントディスク + fname = "AMUS_T1"; + break; + case CRC32_VAMPIRE: // Little Vampire + fname = "AMUS_LP2"; + break; + case CRC32_YAKATA: // ALICEの館 + fname = "AMUS_AL1"; + break; + + case CRC32_AYUMI_FD: // あゆみちゃん物語 (FD) + case CRC32_AYUMI_HINT: // あゆみちゃん物語 ヒントディスク + case CRC32_AYUMI_PROTO: // あゆみちゃん物語 PROTO + fname = "AMUS_AYM"; + break; + case CRC32_DALK_HINT: // DALK ヒントディスク + fname = "AMUS_DLK"; + break; + case CRC32_DRSTOP: // Dr. STOP! + fname = "AMUS_DRS"; + break; + case CRC32_PROSTUDENTG_FD: // Prostudent -G- (FD) + fname = "AMUS_PSG"; + break; + case CRC32_RANCE3_HINT: // Rance3 ヒントディスク + fname = "AMUS_R3H"; + break; + case CRC32_SDPS: // Super D.P.S + fname = "AMUS_SDP"; + break; + case CRC32_YAKATA2: // ALICEの館II + fname = "AMUS_AL2"; + break; + case CRC32_AMBIVALENZ_FD: // AmbivalenZ (FD) case CRC32_AMBIVALENZ_CD: // AmbivalenZ (CD) fname = "AMUS_AMB.MDA"; @@ -117,6 +179,9 @@ uint8* DRI::load_mda(uint32 crc32, int page, int* size) case CRC32_HASHIRIONNA2: // 走り女2 (Rance 4.x ヒントディスク) fname = "AMUS_RG2.MDA"; break; + case CRC32_TOUSHIN2_GD: // 闘神都市2 グラフィックディスク + fname = "AMUS_T2"; + break; case CRC32_OTOMESENKI: // 乙女戦記 fname = "AMUS_OTM.MDA"; break; @@ -141,6 +206,7 @@ uint8* DRI::load_mda(uint32 crc32, int page, int* size) if(page > (data_sector - link_sector) * 128 - 1) { // ページ番号不正 + fclose(fp); return NULL; } @@ -151,6 +217,79 @@ uint8* DRI::load_mda(uint32 crc32, int page, int* size) if(disk_index == 0 || disk_index == 0x1a) { // 欠番 + fclose(fp); + return NULL; + } + + // AMUS.MDA以外にリンクされている場合はリソースを開き直す + if(disk_index == 2) { + fclose(fp); + switch(crc32_b) { + case CRC32_DPS_SG_FAHREN: // D.P.S. SG - Fahren Fliegen + fname = "BMUS_FAH"; + break; + case CRC32_DPS_SG_KATEI: // D.P.S. SG - 家庭教師はステキなお仕事 + fname = "BMUS_KAT"; + break; + case CRC32_DPS_SG_NOBUNAGA: // D.P.S. SG - 信長の淫謀 + fname = "BMUS_NOB"; + break; + case CRC32_DPS_SG2_ANTIQUE: // D.P.S. SG set2 - ANTIQUE HOUSE + fname = "BMUS_ANT"; + break; + case CRC32_DPS_SG2_IKENAI: // D.P.S. SG set2 - いけない内科検診再び + fname = "BMUS_NAI"; + break; + case CRC32_DPS_SG2_AKAI: // D.P.S. SG set2 - 朱い夜 + fname = "BMUS_AKA"; + break; + case CRC32_DPS_SG3_RABBIT: // D.P.S. SG set3 - Rabbit P4P + fname = "BMUS_RAB"; + break; + case CRC32_DPS_SG3_SHINKON: // D.P.S. SG set3 - しんこんさんものがたり + fname = "BMUS_SIN"; + break; + case CRC32_DPS_SG3_SOTSUGYOU: // D.P.S. SG set3 - 卒業 + fname = "BMUS_SOT"; + break; + case CRC32_SDPS_MARIA: // Super D.P.S - マリアとカンパン + fname = "BMUS_MTK"; + break; + case CRC32_SDPS_TONO: // Super D.P.S - 遠野の森 + fname = "BMUS_TNM"; + break; + case CRC32_SDPS_KAIZOKU: // Super D.P.S - うれしたのし海賊稼業 + fname = "BMUS_KAM"; + break; + default: + fname = NULL; + break; + } + if(fname == NULL) { + return NULL; + } + fp = fopen(fname, "rb"); + if (!fp) + return NULL; + } else if(disk_index == 3) { + fclose(fp); + switch(crc32_a) { + case CRC32_TOUSHIN_HINT: // 闘神都市 ヒントディスク + fname = "CMUS_T1"; + break; + default: + fname = NULL; + break; + } + if(fname == NULL) { + return NULL; + } + fp = fopen(fname, "rb"); + if (!fp) + return NULL; + } else if(disk_index != 1) { + // AMUS.MDA以外にリンクされている場合は失敗 + fclose(fp); return NULL; } @@ -160,14 +299,16 @@ uint8* DRI::load_mda(uint32 crc32, int page, int* size) int start_sector = buf[0] | (buf[1] << 8); int end_sector = buf[2] | (buf[3] << 8); - int buffer_size = (end_sector - start_sector) * 256; - uint8* buffer = (uint8*)malloc(buffer_size); + if((*size = (end_sector - start_sector) * 256) == 0) { + // サイズ不正 + return NULL; + } + uint8* buffer = (uint8*)malloc(*size); fseek(fp, (start_sector - 1) * 256, SEEK_SET); - fread(buffer, buffer_size, 1, fp); + fread(buffer, *size, 1, fp); fclose(fp); - *size = buffer_size; return buffer; } diff --git a/src/sys/dri.h b/src/sys/dri.h index ef6a41a..473b910 100644 --- a/src/sys/dri.h +++ b/src/sys/dri.h @@ -15,8 +15,8 @@ public: DRI() {} ~DRI() {} - uint8* load(const char* path, int page, int* size); - uint8* load_mda(uint32 crc32, int page, int* size); + uint8* load(const char* file_name, int page, int* size); + uint8* load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size); }; #endif diff --git a/src/sys/mako_midi.cpp b/src/sys/mako_midi.cpp index 11f07b5..549d358 100644 --- a/src/sys/mako_midi.cpp +++ b/src/sys/mako_midi.cpp @@ -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_a, page, &size); + data = dri->load_mda(nact->crc32_a, nact->crc32_b, page, &size); } if(data) {