Merge upstream changes: Merge DRI changes

- Fail if file entry's size is 0
- load_mda() can now load MDA from subsequent disks.
This commit is contained in:
kichikuou
2020-05-22 19:39:47 +09:00
parent 657057fa64
commit 6d39b6feee
3 changed files with 153 additions and 12 deletions
+150 -9
View File
@@ -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;
}