diff --git a/src/res3/Script1.rc b/src/res3/Script1.rc index b687cc9..810eb1a 100644 --- a/src/res3/Script1.rc +++ b/src/res3/Script1.rc @@ -92,19 +92,49 @@ IDI_ICON1 ICON DISCARDABLE "icon1.ico" // MDA // -IDR_AL3 MDA DISCARDABLE "AMUS_AL3.MDA" -IDR_ALL MDA DISCARDABLE "AMUS_ALL.MDA" -IDR_AMB MDA DISCARDABLE "AMUS_AMB.MDA" -IDR_AYM MDA DISCARDABLE "AMUS_AYM.MDA" -IDR_BEE MDA DISCARDABLE "AMUS_BEE.MDA" -IDR_MGN MDA DISCARDABLE "AMUS_MGN.MDA" -IDR_OTM MDA DISCARDABLE "AMUS_OTM.MDA" -IDR_OY MDA DISCARDABLE "AMUS_OY.MDA" -IDR_PSG MDA DISCARDABLE "AMUS_PSG.MDA" -IDR_R41 MDA DISCARDABLE "AMUS_R41.MDA" -IDR_R42 MDA DISCARDABLE "AMUS_R42.MDA" -IDR_RG2 MDA DISCARDABLE "AMUS_RG2.MDA" -IDR_T2 MDA DISCARDABLE "AMUS_T2.MDA" +AMUS_AB.MDA MDA DISCARDABLE "AMUS_AB.MDA" +AMUS_AL1.MDA MDA DISCARDABLE "AMUS_AL1.MDA" +AMUS_AL2.MDA MDA DISCARDABLE "AMUS_AL2.MDA" +AMUS_AL3.MDA MDA DISCARDABLE "AMUS_AL3.MDA" +AMUS_ALL.MDA MDA DISCARDABLE "AMUS_ALL.MDA" +AMUS_AMB.MDA MDA DISCARDABLE "AMUS_AMB.MDA" +AMUS_AT.MDA MDA DISCARDABLE "AMUS_AT.MDA" +AMUS_AYM.MDA MDA DISCARDABLE "AMUS_AYM.MDA" +AMUS_BEE.MDA MDA DISCARDABLE "AMUS_BEE.MDA" +AMUS_CRS.MDA MDA DISCARDABLE "AMUS_CRS.MDA" +AMUS_DLK.MDA MDA DISCARDABLE "AMUS_DLK.MDA" +AMUS_DPS.MDA MDA DISCARDABLE "AMUS_DPS.MDA" +AMUS_DRS.MDA MDA DISCARDABLE "AMUS_DRS.MDA" +AMUS_INT.MDA MDA DISCARDABLE "AMUS_INT.MDA" +AMUS_KNG.MDA MDA DISCARDABLE "AMUS_KNG.MDA" +AMUS_LP2.MDA MDA DISCARDABLE "AMUS_LP2.MDA" +AMUS_MGN.MDA MDA DISCARDABLE "AMUS_MGN.MDA" +AMUS_OTM.MDA MDA DISCARDABLE "AMUS_OTM.MDA" +AMUS_OY.MDA MDA DISCARDABLE "AMUS_OY.MDA" +AMUS_PSG.MDA MDA DISCARDABLE "AMUS_PSG.MDA" +AMUS_R3H.MDA MDA DISCARDABLE "AMUS_R3H.MDA" +AMUS_R4.MDA MDA DISCARDABLE "AMUS_R4.MDA" +AMUS_R41.MDA MDA DISCARDABLE "AMUS_R41.MDA" +AMUS_R42.MDA MDA DISCARDABLE "AMUS_R42.MDA" +AMUS_RG2.MDA MDA DISCARDABLE "AMUS_RG2.MDA" +AMUS_SDP.MDA MDA DISCARDABLE "AMUS_SDP.MDA" +AMUS_SG.MDA MDA DISCARDABLE "AMUS_SG.MDA" +AMUS_T1.MDA MDA DISCARDABLE "AMUS_T1.MDA" +AMUS_T2.MDA MDA DISCARDABLE "AMUS_T2.MDA" +AMUS_VX.MDA MDA DISCARDABLE "AMUS_VX.MDA" +BMUS_AKA.MDA MDA DISCARDABLE "BMUS_AKA.MDA" +BMUS_ANT.MDA MDA DISCARDABLE "BMUS_ANT.MDA" +BMUS_FAH.MDA MDA DISCARDABLE "BMUS_FAH.MDA" +BMUS_KAM.MDA MDA DISCARDABLE "BMUS_KAM.MDA" +BMUS_KAT.MDA MDA DISCARDABLE "BMUS_KAT.MDA" +BMUS_MTK.MDA MDA DISCARDABLE "BMUS_MTK.MDA" +BMUS_NAI.MDA MDA DISCARDABLE "BMUS_NAI.MDA" +BMUS_NOB.MDA MDA DISCARDABLE "BMUS_NOB.MDA" +BMUS_RAB.MDA MDA DISCARDABLE "BMUS_RAB.MDA" +BMUS_SIN.MDA MDA DISCARDABLE "BMUS_SIN.MDA" +BMUS_SOT.MDA MDA DISCARDABLE "BMUS_SOT.MDA" +BMUS_TNM.MDA MDA DISCARDABLE "BMUS_TNM.MDA" +CMUS_T1.MDA MDA DISCARDABLE "CMUS_T1.MDA" ///////////////////////////////////////////////////////////////////////////// // diff --git a/src/sys/dri.cpp b/src/sys/dri.cpp index df87973..c6943f6 100644 --- a/src/sys/dri.cpp +++ b/src/sys/dri.cpp @@ -4,10 +4,59 @@ [ DRI ] */ +#ifdef _WIN32 +#include +#undef ERROR +#include +#endif #include "dri.h" #include "crc32.h" #include "../fileio.h" +extern SDL_Window* g_window; + +#ifdef _WIN32 + +uint8* load_resource(const char* name, const char* type) { + SDL_SysWMinfo info; + SDL_VERSION(&info.version); + if (!SDL_GetWindowWMInfo(g_window, &info)) { + WARNING("SDL_GetWindowWMInfo failed: %s", SDL_GetError()); + return NULL; + } + HINSTANCE hInst = info.info.win.hinstance; + HGLOBAL hGlobal = LoadResource(hInst, FindResource(hInst, name, type)); + if (!hGlobal) { + WARNING("Cannot load resource %s (type: %s)", name, type); + return NULL; + } + return (uint8*)LockResource(hGlobal); +} + +void free_resource(uint8* data) { +} + +#else + +uint8* load_resource(const char* name, const char* type) { + FILE* fp = fopen(name, "rb"); + if (!fp) + return NULL; + fseek(fp, 0, SEEK_END); + long len = ftell(fp); + fseek(fp, 0, SEEK_SET); + uint8* buf = (uint8*)malloc(len); + fread(buf, 1, len, fp); + fclose(fp); + return buf; +} + +void free_resource(uint8* data) { + free(data); +} + +#endif + uint8* DRI::load(const char* file_name, int page, int* size) { char tmp_name[_MAX_PATH]; @@ -82,233 +131,227 @@ uint8* DRI::load(const char* file_name, int page, int* size) uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size) { // データ取得 - const char* fname = NULL; + const char* name = NULL; switch(crc32_a) { case CRC32_BUNKASAI: // あぶない文化祭前夜 - fname = "AMUS_AB.MDA"; + name = "AMUS_AB.MDA"; break; case CRC32_CRESCENT: // クレセントムーンがぁる - fname = "AMUS_CRS.MDA"; + name = "AMUS_CRS.MDA"; break; case CRC32_DPS: // D.P.S. - Dream Program System - fname = "AMUS_DPS.MDA"; + name = "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"; + name = "AMUS_SG.MDA"; break; case CRC32_FUKEI: // 婦警さんVX - fname = "AMUS_VX.MDA"; + name = "AMUS_VX.MDA"; break; case CRC32_INTRUDER: // Intruder -桜屋敷の探索- - fname = "AMUS_INT"; + name = "AMUS_INT"; break; case CRC32_TENGU: // あぶないてんぐ伝説 - fname = "AMUS_AT"; + name = "AMUS_AT"; break; case CRC32_TOUSHIN_HINT: // 闘神都市 ヒントディスク - fname = "AMUS_T1"; + name = "AMUS_T1"; break; case CRC32_VAMPIRE: // Little Vampire - fname = "AMUS_LP2"; + name = "AMUS_LP2"; break; case CRC32_YAKATA: // ALICEの館 - fname = "AMUS_AL1"; + name = "AMUS_AL1"; break; case CRC32_AYUMI_FD: // あゆみちゃん物語 (FD) case CRC32_AYUMI_HINT: // あゆみちゃん物語 ヒントディスク case CRC32_AYUMI_PROTO: // あゆみちゃん物語 PROTO - fname = "AMUS_AYM"; + name = "AMUS_AYM"; break; case CRC32_DALK_HINT: // DALK ヒントディスク - fname = "AMUS_DLK"; + name = "AMUS_DLK"; break; case CRC32_DRSTOP: // Dr. STOP! - fname = "AMUS_DRS"; + name = "AMUS_DRS"; break; case CRC32_PROSTUDENTG_FD: // Prostudent -G- (FD) - fname = "AMUS_PSG"; + name = "AMUS_PSG"; break; case CRC32_RANCE3_HINT: // Rance3 ヒントディスク - fname = "AMUS_R3H"; + name = "AMUS_R3H"; break; case CRC32_SDPS: // Super D.P.S - fname = "AMUS_SDP"; + name = "AMUS_SDP"; break; case CRC32_YAKATA2: // ALICEの館II - fname = "AMUS_AL2"; + name = "AMUS_AL2"; break; case CRC32_AMBIVALENZ_FD: // AmbivalenZ (FD) case CRC32_AMBIVALENZ_CD: // AmbivalenZ (CD) - fname = "AMUS_AMB.MDA"; + name = "AMUS_AMB.MDA"; break; case CRC32_DPSALL: // DPS全部 - fname = "AMUS_ALL.MDA"; + name = "AMUS_ALL.MDA"; break; case CRC32_FUNNYBEE_CD: // Funny Bee (CD) // case CRC32_FUNNYBEE_PATCH: // Funny Bee (CD + Patch) case CRC32_FUNNYBEE_FD: // Funny Bee (FD) - fname = "AMUS_BEE.MDA"; + name = "AMUS_BEE.MDA"; break; case CRC32_ONLYYOU: // Only You case CRC32_ONLYYOU_DEMO: // Only You (DEMO) - fname = "AMUS_OY.MDA"; + name = "AMUS_OY.MDA"; break; case CRC32_PROSTUDENTG_CD: // Prostudent -G- (CD) - fname = "AMUS_PSG.MDA"; + name = "AMUS_PSG.MDA"; break; case CRC32_RANCE41: // Rance 4.1 - fname = "AMUS_R41.MDA"; + name = "AMUS_R41.MDA"; break; case CRC32_RANCE42: // Rance 4.2 - fname = "AMUS_R42.MDA"; + name = "AMUS_R42.MDA"; break; case CRC32_AYUMI_CD: // あゆみちゃん物語 (CD) case CRC32_AYUMI_JISSHA_256: // あゆみちゃん物語 実写版 case CRC32_AYUMI_JISSHA_FULL: // あゆみちゃん物語 フルカラー実写版 - fname = "AMUS_AYM.MDA"; + name = "AMUS_AYM.MDA"; break; case CRC32_YAKATA3_CD: // アリスの館3 (CD) case CRC32_YAKATA3_FD: // アリスの館3 (FD) - fname = "AMUS_AL3.MDA"; + name = "AMUS_AL3.MDA"; break; case CRC32_HASHIRIONNA2: // 走り女2 (Rance 4.x ヒントディスク) - fname = "AMUS_RG2.MDA"; + name = "AMUS_RG2.MDA"; break; case CRC32_TOUSHIN2_GD: // 闘神都市2 グラフィックディスク - fname = "AMUS_T2"; + name = "AMUS_T2"; break; case CRC32_OTOMESENKI: // 乙女戦記 - fname = "AMUS_OTM.MDA"; + name = "AMUS_OTM.MDA"; break; case CRC32_MUGENHOUYOU: // 夢幻泡影 - fname = "AMUS_MGN.MDA"; + name = "AMUS_MGN.MDA"; break; } - if(fname == NULL) { + if(name == NULL) { return NULL; } - FILE* fp = fopen(fname, "rb"); - if (!fp) + uint8 *data = load_resource(name, "mda"); + if(!data) { return NULL; - uint8 buf[4]; + } // ページの位置を取得 - fread(buf, 4, 1, fp); - int link_sector = buf[0] | (buf[1] << 8); - int data_sector = buf[2] | (buf[3] << 8); + int link_sector = data[0] | (data[1] << 8); + int data_sector = data[2] | (data[3] << 8); if(page > (data_sector - link_sector) * 128 - 1) { // ページ番号不正 - fclose(fp); + free_resource(data); return NULL; } - fseek(fp, (link_sector - 1) * 256 + (page - 1) * 2, SEEK_SET); - fread(buf, 2, 1, fp); - int disk_index = buf[0]; - int link_index = buf[1]; + int disk_index = data[(link_sector - 1) * 256 + (page - 1) * 2 + 0]; + int link_index = data[(link_sector - 1) * 256 + (page - 1) * 2 + 1]; if(disk_index == 0 || disk_index == 0x1a) { // 欠番 - fclose(fp); + free_resource(data); return NULL; } // AMUS.MDA以外にリンクされている場合はリソースを開き直す if(disk_index == 2) { - fclose(fp); + free_resource(data); switch(crc32_b) { case CRC32_DPS_SG_FAHREN: // D.P.S. SG - Fahren Fliegen - fname = "BMUS_FAH"; + name = "BMUS_FAH"; break; case CRC32_DPS_SG_KATEI: // D.P.S. SG - 家庭教師はステキなお仕事 - fname = "BMUS_KAT"; + name = "BMUS_KAT"; break; case CRC32_DPS_SG_NOBUNAGA: // D.P.S. SG - 信長の淫謀 - fname = "BMUS_NOB"; + name = "BMUS_NOB"; break; case CRC32_DPS_SG2_ANTIQUE: // D.P.S. SG set2 - ANTIQUE HOUSE - fname = "BMUS_ANT"; + name = "BMUS_ANT"; break; case CRC32_DPS_SG2_IKENAI: // D.P.S. SG set2 - いけない内科検診再び - fname = "BMUS_NAI"; + name = "BMUS_NAI"; break; case CRC32_DPS_SG2_AKAI: // D.P.S. SG set2 - 朱い夜 - fname = "BMUS_AKA"; + name = "BMUS_AKA"; break; case CRC32_DPS_SG3_RABBIT: // D.P.S. SG set3 - Rabbit P4P - fname = "BMUS_RAB"; + name = "BMUS_RAB"; break; case CRC32_DPS_SG3_SHINKON: // D.P.S. SG set3 - しんこんさんものがたり - fname = "BMUS_SIN"; + name = "BMUS_SIN"; break; case CRC32_DPS_SG3_SOTSUGYOU: // D.P.S. SG set3 - 卒業 - fname = "BMUS_SOT"; + name = "BMUS_SOT"; break; case CRC32_SDPS_MARIA: // Super D.P.S - マリアとカンパン - fname = "BMUS_MTK"; + name = "BMUS_MTK"; break; case CRC32_SDPS_TONO: // Super D.P.S - 遠野の森 - fname = "BMUS_TNM"; + name = "BMUS_TNM"; break; case CRC32_SDPS_KAIZOKU: // Super D.P.S - うれしたのし海賊稼業 - fname = "BMUS_KAM"; + name = "BMUS_KAM"; break; default: - fname = NULL; + name = NULL; break; } - if(fname == NULL) { + if(name == NULL) { return NULL; } - fp = fopen(fname, "rb"); - if (!fp) + if((data = load_resource(name, "mda")) == NULL) { return NULL; + } } else if(disk_index == 3) { - fclose(fp); + free_resource(data); switch(crc32_a) { case CRC32_TOUSHIN_HINT: // 闘神都市 ヒントディスク - fname = "CMUS_T1"; + name = "CMUS_T1"; break; default: - fname = NULL; + name = NULL; break; } - if(fname == NULL) { + if(name == NULL) { return NULL; } - fp = fopen(fname, "rb"); - if (!fp) + if((data = load_resource(name, "mda")) == NULL) { return NULL; + } } else if(disk_index != 1) { // AMUS.MDA以外にリンクされている場合は失敗 - fclose(fp); + free_resource(data); return NULL; } // データ取得 - fseek(fp, link_index * 2, SEEK_SET); - fread(buf, 4, 1, fp); - int start_sector = buf[0] | (buf[1] << 8); - int end_sector = buf[2] | (buf[3] << 8); + int start_sector = data[link_index * 2 + 0] | (data[link_index * 2 + 1] << 8); + int end_sector = data[link_index * 2 + 2] | (data[link_index * 2 + 3] << 8); if((*size = (end_sector - start_sector) * 256) == 0) { // サイズ不正 + free_resource(data); return NULL; } uint8* buffer = (uint8*)malloc(*size); - fseek(fp, (start_sector - 1) * 256, SEEK_SET); - fread(buffer, *size, 1, fp); + memcpy(buffer, &data[(start_sector - 1) * 256], *size); - fclose(fp); + free_resource(data); return buffer; } -