diff --git a/README.md b/README.md index 93260aa..1a6cb16 100644 --- a/README.md +++ b/README.md @@ -74,17 +74,35 @@ Since System1-3 behave slightly differently depending on the game, `system3` use Here's the list of available game IDs and corresponding titles: | game_id | Title | ----------|-------- +| `bunkasai` | あぶない文化祭前夜 | | `crescent` | クレセントムーンがぁる | | `dps` | D.P.S - Dream Program System | +| `dps_sg_fahren` | D.P.S SG - Fahren Fliegen | +| `dps_sg_katei` | D.P.S SG - 家庭教師はステキなお仕事 | +| `dps_sg_nobunaga` | D.P.S SG - 信長の淫謀 | +| `dps_sg2_antique` | D.P.S SG set2 - ANTIQUE HOUSE | +| `dps_sg2_ikenai` | D.P.S SG set2 - いけない内科検診再び | +| `dps_sg2_akai` | D.P.S SG set2 - 朱い夜 | +| `dps_sg3_rabbit` | D.P.S SG set3 - Rabbit P4P | +| `dps_sg3_shinkon` | D.P.S SG set3 - しんこんさんものがたり | +| `dps_sg3_sotsugyou` | D.P.S SG set3 - 卒業 | | `fukei` | 婦警さんVX | | `intruder` | Intruder -桜屋敷の探索- | | `tengu` | あぶないてんぐ伝説 | +| `toushin_hint` | 闘神都市 ヒントディスク | | `little_vampire` | Little Vampire | +| `yakata` | ALICEの館 | +| `ayumi_fd` | あゆみちゃん物語 | +| `ayumi_hint` | あゆみちゃん物語 ヒントディスク | | `ayumi_proto` | あゆみちゃん物語 PROTO | -| `sdps_maria` | Super D.P.S マリアとカンパン | -| `sdps_tono` | Super D.P.S 遠野の森 | -| `sdps_kaizoku` | Super D.P.S 海賊家業 | +| `dalk_hint` | DALK ヒントディスク | +| `drstop` | Dr. STOP! | | `prog_fd` | Prostudent G (FD) | +| `rance3_hint` | Rance3 ヒントディスク | +| `sdps_maria` | Super D.P.S - マリアとカンパン | +| `sdps_tono` | Super D.P.S - 遠野の森 | +| `sdps_kaizoku` | Super D.P.S - うれしたのし海賊稼業 | +| `yakata2` | ALICEの館II | | `ambivalenz_fd` | AmbivalenZ −二律背反− (FD) | | `ambivalenz_cd` | AmbivalenZ −二律背反− (CD) | | `dps_all` | D.P.S. 全部 | @@ -102,6 +120,7 @@ Here's the list of available game IDs and corresponding titles: | `yakata3_cd` | アリスの館3 (CD) | | `yakata3_fd` | アリスの館3 (FD) | | `hashirionna2` | 走り女2 | +| `toushin2_gd` |闘神都市2 グラフィックディスク | | `toushin2_sp` | 闘神都市2 そして、それから… | | `otome` | 乙女戦記 | | `ningyo` | 人魚 -蘿子- | diff --git a/history.txt b/history.txt index 02b4b44..cec874a 100644 --- a/history.txt +++ b/history.txt @@ -113,10 +113,42 @@ 2016.01.13 文字の描画も24bppで処理するようにしました。 - Y4の乱数生成をxorhift32にしました。 + Y4の乱数生成をxorshift32にしました。 512命令毎にSleep(10)を入れるようにしました。 2016.01.15 あゆみちゃん物語 フルカラー実写版をサポートしました。 キーまたはボタンが離されるまで、メニューを表示しないようにしました。 + +2020.03.21 + + SYSTEM1, SYSTEM2用の実行ファイルを統合しました。 + SYSTEM1, SYSTEM2用のAMUS.MDAをリソースに追加しました。 + + マウス操作でメニューが未選択になっているときに、Enterキーを押して + 誤選択されないようにしました。(thanks system3-sdl2) + 連打によってメニューが誤選択されないように待機時間を追加しました。 + + DRIでファイルサイズをチェックするようにしました。 + DRIでリソースからBMUS.MDA, CMUS.MDAを読み込めるようにしました。 + + Super D.P.Sの画面がフェードしたままになる問題を修正しました。 + (Y40-Y43はそもそもフェード命令ではないかもしれない) + + SYSTEM2のUコマンドで、透明色の指定が101の場合はパレットを取得しない + ようにしました。(婦警さんDA) + SYSTEM2のY2コマンドの引数を、最大文字数でなく、文字列変数番号と + 解釈するようにしました。(Super D.P.S) + + ALICEの館をサポートしました。 + あぶない文化祭前夜をサポートしました。 + 闘神都市 ヒントディスクをサポートしました。(闘神ランスは動作しません) + + ALICEの館IIをサポートしました。(ぱっとん、おかゆは動作しません) + DALK ヒントディスクをサポートしました。(零式は動作しません) + Dr.STOP!をサポートしました。(DRD.COMのオープニングは未移植) + prostudent G (FD版)をサポートしました。 + Rance 3 ヒントディスクをサポートしました。(走り女は動作しません) + あゆみちゃん物語 (FD版)をサポートしました。 + あゆみちゃん物語 ヒントディスクをサポートしました。 diff --git a/readme.txt b/readme.txt index d023a0b..ccd1d00 100644 --- a/readme.txt +++ b/readme.txt @@ -7,16 +7,10 @@ GPL扱いで、適当に。 プロジェクトファイルは以下の通りです。 - crescent.vcproj クレセントムーンがぁる - dsp.vcproj D.P.S. - Dream Program System - fukei.vcproj 婦警さん物語VX - intruder.vcproj Intruder -桜屋敷の探索- - maria.vcproj Super D.P.S. マリアとカンパン - prog_omake.vcproj prostudent G おまけ - sdps.vcproj Super D.P.S. + system1.vcproj SYSTEM1汎用 + system2.vcproj SYSTEM2汎用 system3.vcproj SYSTEM3汎用 - tengu.vcproj あぶないてんぐ伝説 - vampire.vcproj Little Vampire + prog_omake.vcproj prostudent G おまけ 実装上では、近間さんのxsystem35を参考にしています。 旧作の実装については、Ryu1さんが移植されたDOS版や、 diff --git a/src/fileio.cpp b/src/fileio.cpp index 8c2e86f..4bb0e6c 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -40,13 +40,13 @@ FILEIO::~FILEIO(void) } } -bool FILEIO::Fopen(const char *filename, int mode) +bool FILEIO::Fopen(const char *file_name, int mode) { mode_ = mode; char path[_MAX_PATH]; sprintf_s(path, _MAX_PATH, "%s%s", (g_savedir && mode & FILEIO_SAVEDATA) ? g_savedir : g_root, - filename); + file_name); mode &= ~FILEIO_SAVEDATA; @@ -115,7 +115,7 @@ int FILEIO::Fgetw() return val | (Fgetc() << 8); } -void FILEIO::Fgets(char dest[]) +void FILEIO::Fgets(char *dest, int length) { int p = 0; @@ -125,9 +125,13 @@ void FILEIO::Fgets(char dest[]) break; } if(c != 0x0a) { - dest[p++] = c; + if(p < length + 1) { + dest[p++] = c; + } if((0x81 <= c && c <= 0x9f) || 0xe0 <= c) { - dest[p++] = Fgetc(); + if(p < length + 1) { + dest[p++] = Fgetc(); + } } } } diff --git a/src/fileio.h b/src/fileio.h index 99e71cf..aedd4a9 100644 --- a/src/fileio.h +++ b/src/fileio.h @@ -30,7 +30,7 @@ public: static void SetSaveDir(const char* savedir); static int StatSavedata(const char* filename, struct stat* buf); - bool Fopen(const char *filename, int mode); + bool Fopen(const char *file_name, int mode); void Fclose(); uint32 Fseek(long offset, int origin); uint32 Ftell(); @@ -38,7 +38,7 @@ public: uint32 Fwrite(void* buffer, uint32 size, uint32 count); int Fgetc(); int Fgetw(); - void Fgets(char dest[]); + void Fgets(char* dest, int length); void Fputc(int c); void Fputw(int w); }; diff --git a/src/linux/nact_linux.cpp b/src/linux/nact_linux.cpp index 56c2b22..9367d02 100644 --- a/src/linux/nact_linux.cpp +++ b/src/linux/nact_linux.cpp @@ -35,9 +35,13 @@ void NACT::release_console() { } -void NACT::output_console(char log[]) +void NACT::output_console(const char *format, ...) { #if defined(_DEBUG_CONSOLE) - fputs(log, stderr); + va_list ap; + + va_start(ap, format); + vfprintf(stdout, format, ap); + va_end(ap); #endif } diff --git a/src/res3/AMUS_AB.MDA b/src/res3/AMUS_AB.MDA new file mode 100644 index 0000000..fce0edc Binary files /dev/null and b/src/res3/AMUS_AB.MDA differ diff --git a/src/res3/AMUS_AL1.MDA b/src/res3/AMUS_AL1.MDA new file mode 100644 index 0000000..1355c67 Binary files /dev/null and b/src/res3/AMUS_AL1.MDA differ diff --git a/src/res3/AMUS_AL2.MDA b/src/res3/AMUS_AL2.MDA new file mode 100644 index 0000000..45a0dd1 Binary files /dev/null and b/src/res3/AMUS_AL2.MDA differ diff --git a/src/res3/AMUS_AT.MDA b/src/res3/AMUS_AT.MDA new file mode 100644 index 0000000..546a5a6 Binary files /dev/null and b/src/res3/AMUS_AT.MDA differ diff --git a/src/res3/AMUS_CRS.MDA b/src/res3/AMUS_CRS.MDA new file mode 100644 index 0000000..84bd891 Binary files /dev/null and b/src/res3/AMUS_CRS.MDA differ diff --git a/src/res3/AMUS_DLK.MDA b/src/res3/AMUS_DLK.MDA new file mode 100644 index 0000000..b72c427 Binary files /dev/null and b/src/res3/AMUS_DLK.MDA differ diff --git a/src/res3/AMUS_DPS.MDA b/src/res3/AMUS_DPS.MDA new file mode 100644 index 0000000..ee86a0b Binary files /dev/null and b/src/res3/AMUS_DPS.MDA differ diff --git a/src/res3/AMUS_DRS.MDA b/src/res3/AMUS_DRS.MDA new file mode 100644 index 0000000..c963711 Binary files /dev/null and b/src/res3/AMUS_DRS.MDA differ diff --git a/src/res3/AMUS_INT.MDA b/src/res3/AMUS_INT.MDA new file mode 100644 index 0000000..bd14d6b Binary files /dev/null and b/src/res3/AMUS_INT.MDA differ diff --git a/src/res3/AMUS_KNG.MDA b/src/res3/AMUS_KNG.MDA new file mode 100644 index 0000000..91a71b0 Binary files /dev/null and b/src/res3/AMUS_KNG.MDA differ diff --git a/src/res3/AMUS_LP2.MDA b/src/res3/AMUS_LP2.MDA new file mode 100644 index 0000000..7b09e7f Binary files /dev/null and b/src/res3/AMUS_LP2.MDA differ diff --git a/src/res3/AMUS_R3H.MDA b/src/res3/AMUS_R3H.MDA new file mode 100644 index 0000000..5b68f52 Binary files /dev/null and b/src/res3/AMUS_R3H.MDA differ diff --git a/src/res3/AMUS_R4.MDA b/src/res3/AMUS_R4.MDA new file mode 100644 index 0000000..ff0109b Binary files /dev/null and b/src/res3/AMUS_R4.MDA differ diff --git a/src/res3/AMUS_SDP.MDA b/src/res3/AMUS_SDP.MDA new file mode 100644 index 0000000..6931ce1 Binary files /dev/null and b/src/res3/AMUS_SDP.MDA differ diff --git a/src/res3/AMUS_SG.MDA b/src/res3/AMUS_SG.MDA new file mode 100644 index 0000000..5c7543f Binary files /dev/null and b/src/res3/AMUS_SG.MDA differ diff --git a/src/res3/AMUS_T1.MDA b/src/res3/AMUS_T1.MDA new file mode 100644 index 0000000..3580720 Binary files /dev/null and b/src/res3/AMUS_T1.MDA differ diff --git a/src/res3/AMUS_VX.MDA b/src/res3/AMUS_VX.MDA new file mode 100644 index 0000000..6af3fd9 Binary files /dev/null and b/src/res3/AMUS_VX.MDA differ diff --git a/src/res3/BMUS_AKA.MDA b/src/res3/BMUS_AKA.MDA new file mode 100644 index 0000000..7b69e75 Binary files /dev/null and b/src/res3/BMUS_AKA.MDA differ diff --git a/src/res3/BMUS_ANT.MDA b/src/res3/BMUS_ANT.MDA new file mode 100644 index 0000000..6cce8c8 Binary files /dev/null and b/src/res3/BMUS_ANT.MDA differ diff --git a/src/res3/BMUS_FAH.MDA b/src/res3/BMUS_FAH.MDA new file mode 100644 index 0000000..49778c4 Binary files /dev/null and b/src/res3/BMUS_FAH.MDA differ diff --git a/src/res3/BMUS_KAM.MDA b/src/res3/BMUS_KAM.MDA new file mode 100644 index 0000000..ef1e1fa Binary files /dev/null and b/src/res3/BMUS_KAM.MDA differ diff --git a/src/res3/BMUS_KAT.MDA b/src/res3/BMUS_KAT.MDA new file mode 100644 index 0000000..2e2bce3 Binary files /dev/null and b/src/res3/BMUS_KAT.MDA differ diff --git a/src/res3/BMUS_MTK.MDA b/src/res3/BMUS_MTK.MDA new file mode 100644 index 0000000..aa56d12 Binary files /dev/null and b/src/res3/BMUS_MTK.MDA differ diff --git a/src/res3/BMUS_NAI.MDA b/src/res3/BMUS_NAI.MDA new file mode 100644 index 0000000..82fb56a Binary files /dev/null and b/src/res3/BMUS_NAI.MDA differ diff --git a/src/res3/BMUS_NOB.MDA b/src/res3/BMUS_NOB.MDA new file mode 100644 index 0000000..e19a1b9 Binary files /dev/null and b/src/res3/BMUS_NOB.MDA differ diff --git a/src/res3/BMUS_RAB.MDA b/src/res3/BMUS_RAB.MDA new file mode 100644 index 0000000..cdaf05b Binary files /dev/null and b/src/res3/BMUS_RAB.MDA differ diff --git a/src/res3/BMUS_SIN.MDA b/src/res3/BMUS_SIN.MDA new file mode 100644 index 0000000..baa64e6 Binary files /dev/null and b/src/res3/BMUS_SIN.MDA differ diff --git a/src/res3/BMUS_SOT.MDA b/src/res3/BMUS_SOT.MDA new file mode 100644 index 0000000..971cf9e Binary files /dev/null and b/src/res3/BMUS_SOT.MDA differ diff --git a/src/res3/BMUS_TNM.MDA b/src/res3/BMUS_TNM.MDA new file mode 100644 index 0000000..5505e3b Binary files /dev/null and b/src/res3/BMUS_TNM.MDA differ diff --git a/src/res3/CMUS_T1.MDA b/src/res3/CMUS_T1.MDA new file mode 100644 index 0000000..1d33e0c Binary files /dev/null and b/src/res3/CMUS_T1.MDA differ diff --git a/src/sys/ags.cpp b/src/sys/ags.cpp index 6b8a81a..1c50674 100644 --- a/src/sys/ags.cpp +++ b/src/sys/ags.cpp @@ -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); @@ -180,6 +180,9 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent) SET_MENU(i, 464, 50, 623, 240, true); break; case CRC32_DPS: + case CRC32_DPS_SG: + //case CRC32_DPS_SG2: + case CRC32_DPS_SG3: SET_TEXT(i, 48, 288, 594, 393, false); //SET_MENU(i, 48, 288, 584, 393, false); SET_MENU(i, 48, 288, 594, 393, false); @@ -196,10 +199,30 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent) SET_TEXT(i, 44, 282, 593, 396, false); SET_MENU(i, 452, 14, 627, 214, false); break; + case CRC32_TOUSHIN_HINT: + SET_TEXT(i, 8, 311, 623, 391, false); + SET_MENU(i, 452, 14, 627, 214, true); + break; case CRC32_VAMPIRE: SET_TEXT(i, 8, 255, 615, 383, false); SET_MENU(i, 448, 11, 615, 224, false); break; + case CRC32_YAKATA: + SET_TEXT(i, 48, 288, 594, 393, false); + SET_MENU(i, 452, 14, 627, 214, false); + break; + case CRC32_DALK_HINT: + SET_TEXT(i, 24, 308, 376, 386, false); + SET_MENU(i, 404, 28, 604, 244, true); + break; + case CRC32_RANCE3_HINT: + SET_TEXT(i, 104, 304, 615, 383, false); + SET_MENU(i, 464, 24, 623, 200, true); + break; + case CRC32_YAKATA2: + SET_TEXT(i, 104, 304, 620, 382, false); + SET_MENU(i, 420, 28, 620, 244, true); + break; default: SET_TEXT(i, 8, 311, 623, 391, true); SET_MENU(i, 464, 80, 623, 240, true); @@ -211,7 +234,6 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent) menu_w[i].push = true; menu_w[i].screen = NULL; menu_w[i].window = NULL; - } // Eコマンド @@ -220,9 +242,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); diff --git a/src/sys/ags.h b/src/sys/ags.h index fa3adb8..79b8fe3 100644 --- a/src/sys/ags.h +++ b/src/sys/ags.h @@ -59,18 +59,16 @@ private: SDL_Cursor* hCursor[10]; // AGS + void load_gm3(uint8* data, int page, int transparent); // Intruder -桜屋敷の探索- void load_vsp2l(uint8* data, int page, int transparent); // Little Vampire - void load_gl3(uint8* data, int page, int transparent); // あぶない天狗伝説 - void load_gm3(uint8* data, int page, int transparent); // Intruder - void load_vsp(uint8* data, int page, int transparent); + void load_gl3(uint8* data, int page, int transparent); void load_pms(uint8* data, int page, int transparent); - void load_bmp(const char *file_path); + void load_bmp(const char* file_name); // あゆみちゃん物語 フルカラー実写版 + void load_vsp(uint8* data, int page, int transparent); void draw_char(int dest, int dest_x, int dest_y, uint16 code, int size, uint8 color); void draw_char_antialias(int dest, int dest_x, int dest_y, uint16 code, int size, uint8 color, uint8 cache[]); void draw_gaiji(int dest, int dest_x, int dest_y, uint16 code, int size, uint8 color); - uint16 convert_zenkaku(uint16 code); - uint16 convert_hankaku(uint16 code); void draw_window(int sx, int sy, int ex, int ey, bool frame, uint8 frame_color, uint8 back_color); @@ -118,6 +116,8 @@ public: void box_line(int dest, int sx, int sy, int ex, int ey, uint8 color); void draw_text(const char* string); + uint16 convert_zenkaku(uint16 code); + uint16 convert_hankaku(uint16 code); void clear_text_window(int index, bool erase); bool return_text_line(int index); diff --git a/src/sys/ags_bmp.cpp b/src/sys/ags_bmp.cpp index bf41448..ab1bbc9 100644 --- a/src/sys/ags_bmp.cpp +++ b/src/sys/ags_bmp.cpp @@ -5,8 +5,9 @@ */ #include "ags.h" +#include "../fileio.h" -void AGS::load_bmp(const char *file_path) +void AGS::load_bmp(const char* file_name) { // ヘッダ取得 int sx = 0, sy = 0; @@ -23,7 +24,7 @@ void AGS::load_bmp(const char *file_path) #if 0 // BMP読み込み WCHAR wszFilePath[_MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, file_path, -1, wszFilePath, _MAX_PATH); + MultiByteToWideChar(CP_ACP, 0, FILEIO::GetFilePath(file_name), -1, wszFilePath, _MAX_PATH); Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromFile(wszFilePath); for(unsigned int y = 0; y < pBitmap->GetHeight(); y++) { for(unsigned int x = 0; x < pBitmap->GetWidth(); x++) { diff --git a/src/sys/ags_draw.cpp b/src/sys/ags_draw.cpp index 1ed1963..98f8a5d 100644 --- a/src/sys/ags_draw.cpp +++ b/src/sys/ags_draw.cpp @@ -8,21 +8,19 @@ #include "dri.h" #include "crc32.h" -extern char g_root[_MAX_PATH]; - void AGS::load_cg(int page, int transparent) { if (nact->sys_ver == 3) { // あゆみちゃん物語 フルカラー実写版 if(strncmp(acg, "CGA000.BMP", 10) == 0) { - char file_path[_MAX_PATH]; - sprintf_s(file_path, _MAX_PATH, "%sCGA%03d.BMP", g_root, page); - load_bmp(file_path); + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "CGA%03d.BMP", page); + load_bmp(file_name); return; } else if(strncmp(acg, "CGB000.BMP", 10) == 0) { - char file_path[_MAX_PATH]; - sprintf_s(file_path, _MAX_PATH, "%sCGB%03d.BMP", g_root, page); - load_bmp(file_path); + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "CGB%03d.BMP", page); + load_bmp(file_name); return; } } @@ -32,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; @@ -49,10 +47,13 @@ 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_AYUMI_FD || nact->crc32_a == CRC32_AYUMI_HINT) { + // あゆみちゃん物語 + load_vsp(data, page, transparent); + } else if(nact->crc32_a == CRC32_SDPS) { // Super D.P.S load_pms(data, page, transparent); } else { diff --git a/src/sys/ags_pms.cpp b/src/sys/ags_pms.cpp index 23c125e..6d8d2b5 100644 --- a/src/sys/ags_pms.cpp +++ b/src/sys/ags_pms.cpp @@ -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++) { diff --git a/src/sys/ags_vsp.cpp b/src/sys/ags_vsp.cpp index 5a59b42..153aa1e 100644 --- a/src/sys/ags_vsp.cpp +++ b/src/sys/ags_vsp.cpp @@ -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) { @@ -37,7 +37,7 @@ void AGS::load_vsp(uint8* data, int page, int transparent) } // パレット取得 - if(get_palette) { + if(get_palette && transparent != 101) { int p = 0x0a; for(int i = 0; i < 16; i++) { uint32 b = data[p++] & 0xf; @@ -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]; diff --git a/src/sys/crc32.h b/src/sys/crc32.h index 19895be..559ede3 100644 --- a/src/sys/crc32.h +++ b/src/sys/crc32.h @@ -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 // 夢幻泡影 diff --git a/src/sys/dri.cpp b/src/sys/dri.cpp index 4edb682..df87973 100644 --- a/src/sys/dri.cpp +++ b/src/sys/dri.cpp @@ -8,17 +8,16 @@ #include "crc32.h" #include "../fileio.h" -uint8* DRI::load(const char* path, int page, int* size) +uint8* DRI::load(const char* file_name, int page, int* size) { - char base_path[_MAX_PATH]; - strcpy_s(base_path, _MAX_PATH, path); + char tmp_name[_MAX_PATH]; + strcpy_s(tmp_name, _MAX_PATH, file_name); FILEIO* fio = new FILEIO(); // ページの位置を取得 - base_path[0] = 'A'; - - if(!fio->Fopen(base_path, FILEIO_READ_BINARY)) { + tmp_name[0] = 'A'; + if(!fio->Fopen(tmp_name, FILEIO_READ_BINARY)) { delete fio; return NULL; } @@ -48,9 +47,9 @@ uint8* DRI::load(const char* path, int page, int* size) // A??.DAT以外にリンクされている場合はファイルを開き直す if(disk_index != 1) { - base_path[0] = 'A' + disk_index - 1; + tmp_name[0] = 'A' + disk_index - 1; fio->Fclose(); - if(!fio->Fopen(base_path, FILEIO_READ_BINARY)) { + if(!fio->Fopen(tmp_name, FILEIO_READ_BINARY)) { delete fio; return NULL; } @@ -63,24 +62,86 @@ uint8* DRI::load(const char* path, 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"; @@ -118,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; @@ -142,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; } @@ -152,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; } @@ -161,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 e8d1544..549d358 100644 --- a/src/sys/mako_midi.cpp +++ b/src/sys/mako_midi.cpp @@ -302,7 +302,7 @@ std::vector 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, nact->crc32_b, page, &size); } if(data) { diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index c08ca75..6ed1eba 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -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(); @@ -27,16 +27,16 @@ NACT::NACT(int sys_ver, uint32 crc32, const char* font_file, const char* playlis if(fio->Fopen("AG00.DAT", FILEIO_READ_BINARY)) { int d0, d1, d2, d3; char string[MAX_CAPTION]; - fio->Fgets(string); + fio->Fgets(string, MAX_CAPTION); sscanf_s(string, "%d,%d,%d,%d", &d0, &d1, &d2, &d3); for(int i = 0; i < d1; i++) { // 動詞の読み込み - fio->Fgets(string); + fio->Fgets(string, MAX_CAPTION); memcpy(caption_verb[i], string, sizeof(string)); } for(int i = 0; i < d2; i++) { // 目的語の読み込み - fio->Fgets(string); + fio->Fgets(string, MAX_CAPTION); memcpy(caption_obj[i], string, sizeof(string)); } fio->Fclose(); @@ -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"); @@ -165,6 +165,7 @@ void NACT::execute(T* impl) } // 1コマンド実行 + prev_addr = scenario_addr; uint8 cmd = getd(); if(set_palette && cmd != 'P') { @@ -290,12 +291,14 @@ void NACT::execute(T* impl) default: if(cmd == 0x20 || (0xa1 <= cmd && cmd <= 0xdd)) { // message (1 byte) - char string[2]; + char string[3]; 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) { @@ -314,10 +317,13 @@ void NACT::execute(T* impl) SDL_Delay(16); } } - -#if defined(_DEBUG_CONSOLE) + if(!ags->draw_hankaku) { + uint16 code = ags->convert_zenkaku(cmd); + string[0] = code >> 8; + string[1] = code & 0xff; + string[2] = '\0'; + } output_console(string); -#endif } else if((0x81 <= cmd && cmd <= 0x9f) || 0xe0 <= cmd) { // message (2 bytes) char string[3]; @@ -325,8 +331,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) { @@ -345,12 +353,13 @@ void NACT::execute(T* impl) SDL_Delay(16); } } - -#if defined(_DEBUG_CONSOLE) output_console(string); -#endif } else { - fatal("Unknown command %2x at %d", cmd, scenario_addr); + if(cmd >= 0x20 && cmd < 0x7f) { + fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr); + } else { + fatal("Unknown Command: %02x at page = %d, addr = %d", cmd, scenario_page, prev_addr); + } } break; } @@ -372,13 +381,44 @@ void NACT::load_scenario(int page) uint16 NACT::random(uint16 range) { - // xorhift32 + // xorshift32 seed = seed ^ (seed << 13); seed = seed ^ (seed >> 17); seed = seed ^ (seed << 15); return (uint16)(((uint32)range * (seed & 0xffff)) >> 16) + 1; } +void NACT::wait_after_open_menu() +{ + // 連打による誤クリック防止 + Uint32 dwTime = SDL_GetTicks(); + Uint32 dwWait = dwTime + 400; + + while(dwTime < dwWait) { + if(terminate) { + return; + } +/* + if(get_key() == 16) { + break; + } +*/ + SDL_Delay(10); + dwTime = SDL_GetTicks(); + } + + // クリック中の間は待機 + for(;;) { + if(terminate) { + return; + } + if(!get_key()) { + break; + } + SDL_Delay(10); + } +} + // WinMainとのインターフェース int NACT::get_screen_height() @@ -418,14 +458,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); } } diff --git a/src/sys/nact.h b/src/sys/nact.h index af478c9..1cf5172 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -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: @@ -109,7 +109,7 @@ protected: int scenario_size; // アドレス、ページ管理 - int scenario_addr; + int scenario_addr, prev_addr; int scenario_page; int label_depth; int label_stack[MAX_STACK]; @@ -162,6 +162,8 @@ protected: uint16 random(uint16 range); uint32 seed; + void wait_after_open_menu(); + uint8 get_key(); void get_cursor(int* x, int* y); void set_cursor(int x, int y); @@ -172,7 +174,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,20 +195,21 @@ 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]; + char tvar[10][33]; int tvar_index, tvar_maxlen; // デバッグログ - void output_console(char log[]); + void output_console(const char *format, ...); int get_scenario_page() const { return scenario_page; } @@ -215,7 +218,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 +261,6 @@ private: uint16 cali(); uint16 cali2(); - int menu_max; // メニューの改ページ - // Intruder Zコマンド int paint_x; int paint_y; @@ -268,7 +269,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 +315,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(); diff --git a/src/sys/nact_crc32.cpp b/src/sys/nact_crc32.cpp index a2ed177..28b1638 100644 --- a/src/sys/nact_crc32.cpp +++ b/src/sys/nact_crc32.cpp @@ -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,18 +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; @@ -99,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; } diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 80720cb..f394c82 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -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); @@ -117,11 +121,7 @@ void NACT_Sys1::cmd_calc() } var[index] = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n!var[%d]:%d!", index, var[index]); - output_console(log); -#endif + output_console("\n!var[%d]:%d!", index, var[index]); } void NACT_Sys1::cmd_branch() @@ -131,7 +131,9 @@ void NACT_Sys1::cmd_branch() bool set_menu = false; if(!condition) { + // 次の'}'命令までスキップする(ネストも考慮する) for(;;) { + prev_addr = scenario_addr; uint8 cmd = getd(); if(cmd == '!') { @@ -150,19 +152,16 @@ void NACT_Sys1::cmd_branch() break; } } else if(cmd == '@') { - getd(); - getd(); + getw(); } else if(cmd == '\\') { - getd(); - getd(); + getw(); } else if(cmd == '&') { cali(); } else if(cmd == '%') { cali(); } else if(cmd == '$') { if(!set_menu) { - getd(); - getd(); + getw(); set_menu = true; } else { set_menu = false; @@ -170,14 +169,12 @@ void NACT_Sys1::cmd_branch() } else if(cmd == '[') { getd(); getd(); - getd(); - getd(); + getw(); } else if(cmd == ':') { cali(); getd(); getd(); - getd(); - getd(); + getw(); } else if(cmd == ']') { } else if(cmd == 'A') { @@ -213,17 +210,17 @@ void NACT_Sys1::cmd_branch() // message (2 bytes) getd(); } else { - fatal("cmd_branch: invalid command %2x", cmd); + if(cmd >= 0x20 && cmd < 0x7f) { + fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr); + } else { + fatal("Unknown Command: %02x at page = %d, addr = %d", cmd, scenario_page, prev_addr); + } break; } } } -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n{%d:", condition); - output_console(log); -#endif + output_console("\n{%d:", condition); } void NACT_Sys1::cmd_label_jump() @@ -231,22 +228,14 @@ void NACT_Sys1::cmd_label_jump() int next_addr = getw(); scenario_addr = next_addr; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n@%x:", next_addr); - output_console(log); -#endif + output_console("\n@%x:", next_addr); } void NACT_Sys1::cmd_label_call() { int next_addr = getw(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n\\%x:", next_addr); - output_console(log); -#endif + output_console("\n\\%x:", next_addr); if(next_addr == 0) { // リターン @@ -268,22 +257,14 @@ void NACT_Sys1::cmd_page_jump() scenario_page = next_page; scenario_addr = 2; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n&%d:", next_page); - output_console(log); -#endif + output_console("\n&%d:", next_page); } void NACT_Sys1::cmd_page_call() { int next_page = cali(), next_addr; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n%%%d:", next_page); - output_console(log); -#endif + output_console("\n%%%d:", next_page); if(next_page == 0) { // リターン @@ -310,11 +291,7 @@ void NACT_Sys1::cmd_set_menu() ags->menu_dest_y += ags->menu_font_size + 2; ags->draw_menu = false; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "$"); - output_console(log); -#endif + output_console("$"); } else { if(!menu_index) { ags->clear_menu_window(); @@ -325,46 +302,27 @@ void NACT_Sys1::cmd_set_menu() ags->menu_dest_y += 2; ags->draw_menu = true; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n$%x,", menu_addr[menu_index - 1]); - output_console(log); -#endif + output_console("\n$%x,", menu_addr[menu_index - 1]); } } void NACT_Sys1::cmd_open_menu() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n]"); - output_console(log); -#endif + output_console("\n]"); if(!menu_index) { scenario_addr = scenario_data[0] | (scenario_data[1] << 8); return; } - if(crc32 == CRC32_DPS && !text_refresh) { - cmd_a(); - } - - // クリック中の間は待機 - for(;;) { - if(terminate) { - return; + 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(); } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - SDL_Delay(10); } // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -373,17 +331,20 @@ void NACT_Sys1::cmd_open_menu() int mx = ex - 16; int my = sy + 10; int height = ags->menu_font_size + 4; + int current_index = 0; + set_cursor(mx, my); + wait_after_open_menu(); // メニュー選択 - for(;;) { + for(bool selectable = true;;) { // 入力待機 int val = 0, current_mx = mx, current_my = my; for(;;) { if(terminate) { return; } - if((val = get_key())) { + if((val = get_key()) != 0) { SDL_Delay(100); break; } @@ -412,6 +373,9 @@ void NACT_Sys1::cmd_open_menu() if(sx <= mx && mx <= ex && 0 <= index && index < menu_index) { current_index = index; ags->redraw_menu_window(menu_window, current_index); + selectable = true; + } else { + selectable = false; } } else if(val == 1 || val == 2 || val == 4 || val == 8) { if(val == 1) { @@ -424,7 +388,8 @@ void NACT_Sys1::cmd_open_menu() current_index = menu_index - 1; } ags->redraw_menu_window(menu_window, current_index); - } else if(val == 16) { + selectable = true; + } else if(val == 16 && selectable) { break; } else if(val == 32) { current_index = -1; @@ -455,11 +420,7 @@ void NACT_Sys1::cmd_set_verbobj() menu_obj[menu_index++] = obj; verb_obj = true; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]); - output_console(log); -#endif + output_console("\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]); } void NACT_Sys1::cmd_set_verbobj2() @@ -476,21 +437,13 @@ void NACT_Sys1::cmd_set_verbobj2() } verb_obj = true; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]); - output_console(log); -#endif + output_console("\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]); } void NACT_Sys1::cmd_open_verb() { // 動詞メニューの表示 -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nopen verb-obj menu"); - output_console(log); -#endif + output_console("\nopen verb-obj menu"); verb_obj = false; // 表示する動詞のチェック @@ -514,7 +467,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]) { @@ -536,7 +489,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; } } @@ -554,21 +507,8 @@ top2: } ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - SDL_Delay(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -577,17 +517,20 @@ top2: int mx = ex - 16; int my = sy + 10; int height = ags->menu_font_size + 4; + int current_index = 0; + set_cursor(mx, my); + wait_after_open_menu(); // メニュー選択 - for(;;) { + for(bool selectable = true;;) { // 入力待機 int val = 0, current_mx = mx, current_my = my; for(;;) { if(terminate) { return; } - if((val = get_key())) { + if((val = get_key()) != 0) { SDL_Delay(100); break; } @@ -616,6 +559,9 @@ top2: if(sx <= mx && mx <= ex && 0 <= mindex && mindex < index) { current_index = mindex; ags->redraw_menu_window(menu_window, current_index); + selectable = true; + } else { + selectable = false; } } else if(val == 1 || val == 2 || val == 4 || val == 8) { if(val == 1) { @@ -628,7 +574,8 @@ top2: current_index = index - 1; } ags->redraw_menu_window(menu_window, current_index); - } else if(val == 16) { + selectable = true; + } else if(val == 16 && selectable) { break; } else if(val == 32) { current_index = -1; @@ -689,7 +636,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]) { @@ -717,7 +664,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; } } @@ -742,21 +689,8 @@ top2: } ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - SDL_Delay(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -765,17 +699,20 @@ top2: int mx = ex - 16; int my = sy + 10; int height = ags->menu_font_size + 4; + int current_index = 0; + set_cursor(mx, my); + wait_after_open_menu(); // メニュー選択 - for(;;) { + for(bool selectable = true;;) { // 入力待機 int val = 0, current_mx = mx, current_my = my; for(;;) { if(terminate) { return; } - if((val = get_key())) { + if((val = get_key()) != 0) { SDL_Delay(100); break; } @@ -804,6 +741,9 @@ top2: if(sx <= mx && mx <= ex && 0 <= mindex && mindex < index) { current_index = mindex; ags->redraw_menu_window(menu_window, current_index); + selectable = true; + } else { + selectable = false; } } else if(val == 1 || val == 2 || val == 4 || val == 8) { if(val == 1) { @@ -816,7 +756,8 @@ top2: current_index = index - 1; } ags->redraw_menu_window(menu_window, current_index); - } else if(val == 16) { + selectable = true; + } else if(val == 16 && selectable) { break; } else if(val == 32) { current_index = -1; @@ -841,11 +782,7 @@ top2: void NACT_Sys1::cmd_a() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "A\n"); - output_console(log); -#endif + output_console("A\n"); if(!text_skip_enb) { // Pushマークの表示 @@ -878,32 +815,32 @@ 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() { // 未使用 + fatal("Unknown Command: 'B' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_d() { // 未使用 + fatal("Unknown Command: 'D' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_e() { // 未使用 + fatal("Unknown Command: 'E' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_f() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nF"); - output_console(log); -#endif + output_console("\nF"); scenario_addr = 2; } @@ -912,19 +849,15 @@ void NACT_Sys1::cmd_g() { int page = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nG %d:", page); - output_console(log); -#endif + 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); } @@ -937,41 +870,40 @@ void NACT_Sys1::cmd_g() void NACT_Sys1::cmd_h() { // 未使用 + fatal("Unknown Command: 'H' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_i() { // 未使用 + fatal("Unknown Command: 'I' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_j() { // 未使用 + fatal("Unknown Command: 'J' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_k() { // 未使用 + fatal("Unknown Command: 'K' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_l() { int index = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nL %d:", index); - output_console(log); -#endif + output_console("\nL %d:", index); if(1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - char path[_MAX_PATH]; - strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT"); - path[7] = 'A' + index - 1; + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); FILEIO* fio = new FILEIO(); - if(fio->Fopen(path, FILEIO_READ_BINARY)) { + if(fio->Fopen(file_name, FILEIO_READ_BINARY)) { fio->Fseek(112, FILEIO_SEEK_SET); int next_page = fio->Fgetw() - 1; @@ -1063,16 +995,19 @@ void NACT_Sys1::cmd_l() void NACT_Sys1::cmd_m() { // 未使用 + fatal("Unknown Command: 'M' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_n() { // 未使用 + fatal("Unknown Command: 'N' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_o() { // 未使用 + fatal("Unknown Command: 'O' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_p() @@ -1081,11 +1016,7 @@ void NACT_Sys1::cmd_p() ags->text_font_color = (uint8)((param & 0x7) + 16); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nP %d:", param); - output_console(log); -#endif + output_console("\nP %d:", param); } #define FWRITE(data, size) { \ @@ -1112,20 +1043,15 @@ void NACT_Sys1::cmd_q() int index = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nQ %d:", index); - output_console(log); -#endif + output_console("\nQ %d:", index); if(1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - char path[_MAX_PATH]; - strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT"); - path[7] = 'A' + index - 1; + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); FILEIO* fio = new FILEIO(); - if(fio->Fopen(path, FILEIO_WRITE_BINARY)) { + if(fio->Fopen(file_name, FILEIO_WRITE_BINARY)) { uint8 buffer[9510]; int p = 0; @@ -1193,11 +1119,7 @@ void NACT_Sys1::cmd_q() void NACT_Sys1::cmd_r() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "R\n"); - output_console(log); -#endif + output_console("R\n"); // ウィンドウの表示範囲外の場合は改ページ if(ags->return_text_line(text_window)) { @@ -1209,11 +1131,7 @@ void NACT_Sys1::cmd_s() { int page = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nS %d:", page); - output_console(log); -#endif + output_console("\nS %d:", page); if(page) { mako->play_music(page); @@ -1225,6 +1143,7 @@ void NACT_Sys1::cmd_s() void NACT_Sys1::cmd_t() { // 未使用 + fatal("Unknown Command: 'T' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_u() @@ -1232,13 +1151,9 @@ void NACT_Sys1::cmd_u() int page = getd(); int transparent = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nU %d,%d:", page, transparent); - output_console(log); -#endif + output_console("\nU %d,%d:", page, transparent); - if (crc32 == CRC32_INTRUDER) { + if(crc32_a == CRC32_INTRUDER) { ags->load_cg(page, 11); if(page == 5) { @@ -1252,22 +1167,20 @@ void NACT_Sys1::cmd_u() void NACT_Sys1::cmd_v() { // 未使用 + fatal("Unknown Command: 'V' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_w() { // 未使用 + fatal("Unknown Command: 'W' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys1::cmd_x() { int index = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nX %d:", index); - output_console(log); -#endif + output_console("\nX %d:", index); if(1 <= index && index <= 10) { ags->draw_text(tvar[index - 1]); @@ -1279,182 +1192,169 @@ void NACT_Sys1::cmd_y() int cmd = cali(); int param = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nY %d,%d:", cmd, param); - output_console(log); -#endif + output_console("\nY %d,%d:", cmd, param); - switch (crc32) { - case CRC32_BUNKASAI: - case CRC32_CRESCENT: - case CRC32_DPS: - case CRC32_FUKEI: - case CRC32_TENGU: + if(crc32_a == CRC32_INTRUDER) { switch(cmd) { - case 0: - ags->clear_text_window(text_window, true); - break; - case 1: - { - char buf[16]; - buf[0] = '0' + (int)(param / 10000); - param %= 10000; - buf[1] = '0' + (int)(param / 1000); - param %= 1000; - buf[2] = '0' + (int)(param / 100); - param %= 100; - buf[3] = '0' + (int)(param / 10); - buf[4] = '0' + (param % 10); - buf[5] = '\0'; - - int p = 0; + case 0: + ags->clear_text_window(text_window, true); + break; + case 1: + if(show_push) { + ags->draw_push(text_window); + } for(;;) { - if(buf[p] != '0') { + if(terminate) { + return; + } + if(get_key()) { break; } - p++; + SDL_Delay(10); } - ags->draw_text(&buf[p < 4 ? p : 4]); - } - break; - case 2: - switch (crc32) { - case CRC32_CRESCENT: - for(int i = 39; i <= 48; i++) - var[i] = 0; + SDL_Delay(100); + for(;;) { + if(terminate) { + return; + } + if(!(get_key() & 0x18)) { + break; + } + SDL_Delay(10); + } + ags->clear_text_window(text_window, true); break; - case CRC32_DPS: - for(int i = 0; i <= 20; i++) - var[i] = 0; + case 2: + if(param == 0) { + post_quit = true; + fatal_error = true; + } else { + WAIT(100) + } break; - default: - for(int i = 0; i <= 16; i++) - var[i] = 0; + case 3: + WAIT(param * 1000) break; - } - break; - case 3: - WAIT(param * 1000 / 60) - break; - case 4: - RND = (param == 0 || param == 1) ? 0 : random(param); - break; - case 7: - if(crc32 == CRC32_DPS && param == 1) { - ags->box_fill(0, 40, 8, 598, 270, 0); - } - break; - case 130: - if (crc32 == CRC32_TENGU) { - WAIT(2000) - ags->load_cg(180, -1); - - WAIT(2000) - ags->draw_box(0); - ags->dest_screen = 1; - ags->load_cg(173, -1); - ags->dest_screen = 0; - ags->gcopy(0x1ecd, 0x3a2a, 8, 60, 3); - WAIT(667); - ags->gcopy(0x1b65, 0x262e, 8, 60, 3); - ags->gcopy(0x2e25, 0x38ee, 7, 9, 3); - WAIT(667); - ags->gcopy(0x1914, 0x1914, 8, 63, 3); - WAIT(667); - ags->gcopy(0x182c, 0x182c, 7, 50, 3); - WAIT(667); - ags->gcopy(0x0000, 0x1ecd, 32, 60, 1); - WAIT(667); - for(int i = 12; i <= 57; i++) { - ags->gcopy(i + 0x2306, i + 0x2306, 1, 165, 3); - } - WAIT_KEYQUIT(6000) - ags->draw_box(param); - } - break; - case 253: - post_quit = false; - fatal_error = true; - break; - case 254: - RND = 0; - break; - case 255: - if (crc32 == CRC32_DPS) - post_quit = false; - else - post_quit = true; - fatal_error = true; - break; - } - break; - case CRC32_INTRUDER: - switch(cmd) { - case 0: - ags->clear_text_window(text_window, true); - break; - case 1: - if(show_push) { - ags->draw_push(text_window); - } - for(;;) { - if(terminate) { - return; - } - if(get_key()) { - break; - } - SDL_Delay(10); - } - SDL_Delay(100); - for(;;) { - if(terminate) { - return; - } - if(!(get_key() & 0x18)) { - break; - } - SDL_Delay(10); - } - ags->clear_text_window(text_window, true); - break; - case 2: - if(param == 0) { + case 255: post_quit = true; fatal_error = true; - } else { - WAIT(100) - } - break; - case 3: - WAIT(param * 1000) - break; - case 255: - post_quit = true; - fatal_error = true; - break; + break; + } + } else { + switch(cmd) { + case 0: + ags->clear_text_window(text_window, true); + break; + case 1: + { + char buf[16]; + buf[0] = '0' + (int)(param / 10000); + param %= 10000; + buf[1] = '0' + (int)(param / 1000); + param %= 1000; + buf[2] = '0' + (int)(param / 100); + param %= 100; + buf[3] = '0' + (int)(param / 10); + buf[4] = '0' + (param % 10); + buf[5] = '\0'; + + int p = 0; + for(;;) { + if(buf[p] != '0') { + break; + } + p++; + } + ags->draw_text(&buf[p < 4 ? p : 4]); + } + break; + case 2: + if(crc32_a == CRC32_CRESCENT) { + for(int i = 39; i <= 48; i++) { + var[i] = 0; + } + } else if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) { + for(int i = 0; i <= 20; i++) { + var[i] = 0; + } + } else { + for(int i = 0; i <= 16; i++) { + var[i] = 0; + } + } + break; + case 3: + WAIT(param * 1000 / 60) + break; + case 4: + RND = (param == 0 || param == 1) ? 0 : random(param); + break; + case 7: + if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) { + if(param == 1) { + ags->box_fill(0, 40, 8, 598, 270, 0); + } + } + break; + case 130: + if(crc32_a == CRC32_TENGU) { + WAIT(2000) + ags->load_cg(180, -1); + + WAIT(2000) + ags->draw_box(0); + ags->dest_screen = 1; + ags->load_cg(173, -1); + ags->dest_screen = 0; + ags->gcopy(0x1ecd, 0x3a2a, 8, 60, 3); + WAIT(667); + ags->gcopy(0x1b65, 0x262e, 8, 60, 3); + ags->gcopy(0x2e25, 0x38ee, 7, 9, 3); + WAIT(667); + ags->gcopy(0x1914, 0x1914, 8, 63, 3); + WAIT(667); + ags->gcopy(0x182c, 0x182c, 7, 50, 3); + WAIT(667); + ags->gcopy(0x0000, 0x1ecd, 32, 60, 1); + WAIT(667); + for(int i = 12; i <= 57; i++) { + ags->gcopy(i + 0x2306, i + 0x2306, 1, 165, 3); + } + WAIT_KEYQUIT(6000) + ags->draw_box(param); + } + break; + case 253: + post_quit = false; + fatal_error = true; + break; + case 254: + RND = 0; + break; + case 255: + if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) { + post_quit = false; + } else { + post_quit = true; + } + fatal_error = true; + break; } - break; } } void NACT_Sys1::cmd_z() { - if (crc32 == CRC32_CRESCENT) { + if (crc32_a == CRC32_CRESCENT) { cmd_y(); return; } int cmd = cali(); int param = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nZ %d,%d:", cmd, param); - output_console(log); -#endif + 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] = { diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index f6e024f..0cb8122 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -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) { } @@ -70,11 +70,7 @@ void NACT_Sys2::cmd_calc() } var[index] = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n!var[%d]:%d!", index, var[index]); - output_console(log); -#endif + output_console("\n!var[%d]:%d!", index, var[index]); } void NACT_Sys2::cmd_branch() @@ -84,7 +80,9 @@ void NACT_Sys2::cmd_branch() bool set_menu = false; if(!condition) { + // 次の'}'命令までスキップする(ネストも考慮する) for(;;) { + prev_addr = scenario_addr; uint8 cmd = getd(); if(cmd == '!') { @@ -103,19 +101,16 @@ void NACT_Sys2::cmd_branch() break; } } else if(cmd == '@') { - getd(); - getd(); + getw(); } else if(cmd == '\\') { - getd(); - getd(); + getw(); } else if(cmd == '&') { cali(); } else if(cmd == '%') { cali(); } else if(cmd == '$') { if(!set_menu) { - getd(); - getd(); + getw(); set_menu = true; } else { set_menu = false; @@ -123,14 +118,12 @@ void NACT_Sys2::cmd_branch() } else if(cmd == '[') { getd(); getd(); - getd(); - getd(); + getw(); } else if(cmd == ':') { cali(); getd(); getd(); - getd(); - getd(); + getw(); } else if(cmd == ']') { } else if(cmd == 'A') { @@ -166,7 +159,8 @@ void NACT_Sys2::cmd_branch() } else if(cmd == 'I') { cali(); cali(); - getd(); +// getd(); + cali(); } else if(cmd == 'J') { cali(); cali(); @@ -206,11 +200,48 @@ void NACT_Sys2::cmd_branch() cali(); cali(); } else if(cmd == 'U') { - getd(); - getd(); + if(crc32_a == CRC32_YAKATA2) { + cali(); + cali(); + } else { + getd(); + getd(); + } } else if(cmd == 'V') { +#if 1 cali(); cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); + cali(); +#else + cali(); + cali(); +#endif } else if(cmd == 'W') { cali(); cali(); @@ -230,17 +261,17 @@ void NACT_Sys2::cmd_branch() // message (2 bytes) getd(); } else { - fatal("cmd_branch: invalid command %2x", cmd); + if(cmd >= 0x20 && cmd < 0x7f) { + fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr); + } else { + fatal("Unknown Command: %02x at page = %d, addr = %d", cmd, scenario_page, prev_addr); + } break; } } } -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n{%d:", condition); - output_console(log); -#endif + output_console("\n{%d:", condition); } void NACT_Sys2::cmd_label_jump() @@ -248,22 +279,14 @@ void NACT_Sys2::cmd_label_jump() int next_addr = getw(); scenario_addr = next_addr; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n@%x:", next_addr); - output_console(log); -#endif + output_console("\n@%x:", next_addr); } void NACT_Sys2::cmd_label_call() { int next_addr = getw(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n\\%x:", next_addr); - output_console(log); -#endif + output_console("\n\\%x:", next_addr); if(next_addr == 0) { // リターン @@ -285,22 +308,14 @@ void NACT_Sys2::cmd_page_jump() scenario_page = next_page; scenario_addr = 2; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n&%d:", next_page); - output_console(log); -#endif + output_console("\n&%d:", next_page); } void NACT_Sys2::cmd_page_call() { int next_page = cali(), next_addr; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n%%%d:", next_page); - output_console(log); -#endif + output_console("\n%%%d:", next_page); if(next_page == 0) { // リターン @@ -327,11 +342,7 @@ void NACT_Sys2::cmd_set_menu() ags->menu_dest_y += ags->menu_font_size + 2; ags->draw_menu = false; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "$"); - output_console(log); -#endif + output_console("$"); } else { if(!menu_index) { ags->clear_menu_window(); @@ -342,42 +353,21 @@ void NACT_Sys2::cmd_set_menu() ags->menu_dest_y += 2; ags->draw_menu = true; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n$%x,", menu_addr[menu_index - 1]); - output_console(log); -#endif + output_console("\n$%x,", menu_addr[menu_index - 1]); } } void NACT_Sys2::cmd_open_menu() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n]"); - output_console(log); -#endif + output_console("\n]"); if(!menu_index) { scenario_addr = scenario_data[0] | (scenario_data[1] << 8); return; } - // クリック中の間は待機 - for(;;) { - if(terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - SDL_Delay(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -386,17 +376,20 @@ void NACT_Sys2::cmd_open_menu() int mx = ex - 16; int my = sy + 10; int height = ags->menu_font_size + 4; + int current_index = 0; + set_cursor(mx, my); + wait_after_open_menu(); // メニュー選択 - for(;;) { + for(bool selectable = true;;) { // 入力待機 int val = 0, current_mx = mx, current_my = my; for(;;) { if(terminate) { return; } - if((val = get_key())) { + if((val = get_key()) != 0) { SDL_Delay(100); break; } @@ -425,6 +418,9 @@ void NACT_Sys2::cmd_open_menu() if(sx <= mx && mx <= ex && 0 <= index && index < menu_index) { current_index = index; ags->redraw_menu_window(menu_window, current_index); + selectable = true; + } else { + selectable = false; } } else if(val == 1 || val == 2 || val == 4 || val == 8) { if(val == 1) { @@ -437,7 +433,8 @@ void NACT_Sys2::cmd_open_menu() current_index = menu_index - 1; } ags->redraw_menu_window(menu_window, current_index); - } else if(val == 16) { + selectable = true; + } else if(val == 16 && selectable) { break; } else if(val == 32) { current_index = -1; @@ -468,11 +465,7 @@ void NACT_Sys2::cmd_set_verbobj() menu_obj[menu_index++] = obj; verb_obj = true; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]); - output_console(log); -#endif + output_console("\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]); } void NACT_Sys2::cmd_set_verbobj2() @@ -489,21 +482,13 @@ void NACT_Sys2::cmd_set_verbobj2() } verb_obj = true; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]); - output_console(log); -#endif + output_console("\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]); } void NACT_Sys2::cmd_open_verb() { // 動詞メニューの表示 -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nopen verb-obj menu"); - output_console(log); -#endif + output_console("\nopen verb-obj menu"); verb_obj = false; // 表示する動詞のチェック @@ -532,21 +517,8 @@ void NACT_Sys2::cmd_open_verb() } ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - SDL_Delay(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -555,17 +527,20 @@ void NACT_Sys2::cmd_open_verb() int mx = ex - 16; int my = sy + 10; int height = ags->menu_font_size + 4; + int current_index = 0; + set_cursor(mx, my); + wait_after_open_menu(); // メニュー選択 - for(;;) { + for(bool selectable = true;;) { // 入力待機 int val = 0, current_mx = mx, current_my = my; for(;;) { if(terminate) { return; } - if((val = get_key())) { + if((val = get_key()) != 0) { SDL_Delay(100); break; } @@ -594,6 +569,9 @@ void NACT_Sys2::cmd_open_verb() if(sx <= mx && mx <= ex && 0 <= mindex && mindex < index) { current_index = mindex; ags->redraw_menu_window(menu_window, current_index); + selectable = true; + } else { + selectable = false; } } else if(val == 1 || val == 2 || val == 4 || val == 8) { if(val == 1) { @@ -606,7 +584,8 @@ void NACT_Sys2::cmd_open_verb() current_index = index - 1; } ags->redraw_menu_window(menu_window, current_index); - } else if(val == 16) { + selectable = true; + } else if(val == 16 && selectable) { break; } else if(val == 32) { current_index = -1; @@ -676,21 +655,8 @@ void NACT_Sys2::cmd_open_obj(int verb) ags->menu_dest_y += ags->menu_font_size + 2; ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - SDL_Delay(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -699,17 +665,20 @@ void NACT_Sys2::cmd_open_obj(int verb) int mx = ex - 16; int my = sy + 10; int height = ags->menu_font_size + 4; + int current_index = 0; + set_cursor(mx, my); + wait_after_open_menu(); // メニュー選択 - for(;;) { + for(bool selectable = true;;) { // 入力待機 int val = 0, current_mx = mx, current_my = my; for(;;) { if(terminate) { return; } - if((val = get_key())) { + if((val = get_key()) != 0) { SDL_Delay(100); break; } @@ -738,6 +707,9 @@ void NACT_Sys2::cmd_open_obj(int verb) if(sx <= mx && mx <= ex && 0 <= mindex && mindex < index) { current_index = mindex; ags->redraw_menu_window(menu_window, current_index); + selectable = true; + } else { + selectable = false; } } else if(val == 1 || val == 2 || val == 4 || val == 8) { if(val == 1) { @@ -750,7 +722,8 @@ void NACT_Sys2::cmd_open_obj(int verb) current_index = index - 1; } ags->redraw_menu_window(menu_window, current_index); - } else if(val == 16) { + selectable = true; + } else if(val == 16 && selectable) { break; } else if(val == 32) { current_index = -1; @@ -773,11 +746,7 @@ void NACT_Sys2::cmd_open_obj(int verb) void NACT_Sys2::cmd_a() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "A\n"); - output_console(log); -#endif + output_console("A\n"); if(!text_skip_enb) { // Pushマークの表示 @@ -821,13 +790,12 @@ void NACT_Sys2::cmd_b() int p4 = cali(); int p5 = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5); - output_console(log); -#endif + output_console("\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5); if(cmd == 1) { + if(crc32_a == CRC32_AYUMI_FD || crc32_a == CRC32_AYUMI_HINT || crc32_a == CRC32_DRSTOP) { + p5 = 1; + } ags->menu_w[index - 1].sx = p1 * 8; ags->menu_w[index - 1].sy = p2; ags->menu_w[index - 1].ex = p3 * 8 - 1; @@ -840,7 +808,10 @@ 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_AYUMI_FD || crc32_a == CRC32_AYUMI_HINT || crc32_a == CRC32_DRSTOP) { + p1 = 1; + } +// 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; @@ -863,9 +834,16 @@ void NACT_Sys2::cmd_b() ags->text_w[index - 1].window = NULL; } } else if(cmd == 4) { + if(crc32_a == CRC32_AYUMI_FD || crc32_a == CRC32_AYUMI_HINT) { + p1 = 1; + //p5 ? 0 : 1; // 逆? + p5 = 0; + } else if(crc32_a == CRC32_DRSTOP) { + p1 = 1; + } 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; @@ -889,11 +867,7 @@ void NACT_Sys2::cmd_d() int p7 = cali(); int p8 = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nD %d,%d,%d,%d,%d,%d,%d,%d:", p1, p2, p3, p4, p5, p6, p7, p8); - output_console(log); -#endif + output_console("\nD %d,%d,%d,%d,%d,%d,%d,%d:", p1, p2, p3, p4, p5, p6, p7, p8); } void NACT_Sys2::cmd_e() @@ -902,20 +876,12 @@ void NACT_Sys2::cmd_e() int p2 = cali(); int p3 = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nE %d,%d,%d:", p1, p2, p3); - output_console(log); -#endif + output_console("\nE %d,%d,%d:", p1, p2, p3); } void NACT_Sys2::cmd_f() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nF"); - output_console(log); -#endif + output_console("\nF"); scenario_addr = 2; } @@ -924,18 +890,24 @@ void NACT_Sys2::cmd_g() { int page = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nG %d:", page); - output_console(log); -#endif + 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--; } } ags->load_cg(page, -1); + + if(crc32_a == CRC32_DALK_HINT) { + if(page == 3) { + WAIT(2000) + } + } else if(crc32_a == CRC32_RANCE3_HINT) { + if(page == 25) { + WAIT(2000) + } + } } void NACT_Sys2::cmd_h() @@ -943,11 +915,7 @@ void NACT_Sys2::cmd_h() int length = getd(); int val = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nH %d,%d:", length, val); - output_console(log); -#endif + output_console("\nH %d,%d:", length, val); // 8桁の文字列を生成 char tmp[8]; @@ -987,13 +955,10 @@ void NACT_Sys2::cmd_i() { int p1 = cali(); int p2 = cali(); - int p3 = getd(); +// int p3 = getd(); + int p3 = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nI %d,%d,%d:", p1, p2, p3); - output_console(log); -#endif + output_console("\nI %d,%d,%d:", p1, p2, p3); } void NACT_Sys2::cmd_j() @@ -1001,11 +966,7 @@ void NACT_Sys2::cmd_j() int p1 = cali(); int p2 = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nJ %d,%d:", p1, p2); - output_console(log); -#endif + output_console("\nJ %d,%d:", p1, p2); } void NACT_Sys2::cmd_k() @@ -1018,20 +979,15 @@ void NACT_Sys2::cmd_l() { int index = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nL %d:", index); - output_console(log); -#endif + output_console("\nL %d:", index); if(1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - char path[_MAX_PATH]; - strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT"); - path[7] = 'A' + index - 1; + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); FILEIO* fio = new FILEIO(); - if(fio->Fopen(path, FILEIO_READ_BINARY)) { + if(fio->Fopen(file_name, FILEIO_READ_BINARY)) { fio->Fseek(112, FILEIO_SEEK_SET); int next_page = fio->Fgetw() - 1; @@ -1122,7 +1078,7 @@ void NACT_Sys2::cmd_l() void NACT_Sys2::cmd_m() { - char string[22]; + char string[33]; int d, p = 0; while((d = getd()) != ':') { @@ -1136,14 +1092,10 @@ void NACT_Sys2::cmd_m() } string[p] = '\0'; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nM %s:", string); - output_console(log); -#endif + output_console("\nM %s:", string); if(1 <= tvar_index && tvar_index <= 10) { - memcpy(tvar[tvar_index - 1], string, 22); + memcpy(tvar[tvar_index - 1], string, 33); } } @@ -1152,11 +1104,7 @@ void NACT_Sys2::cmd_n() int p1 = cali(); int p2 = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nN %d,%d:", p1, p2); - output_console(log); -#endif + output_console("\nN %d,%d:", p1, p2); } void NACT_Sys2::cmd_o() @@ -1165,29 +1113,25 @@ void NACT_Sys2::cmd_o() int width = cali(); int height = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nO %d,%d,%d:", st, width, height); - output_console(log); -#endif + output_console("\nO %d,%d,%d:", st, width, height); +#if 0 // white mesh int sx = (st % 80) * 8; int sy = (int)(st / 80); ags->draw_mesh(sx, sy, width, height); +#endif } void NACT_Sys2::cmd_p() { int param = getd(); - ags->text_font_color = (uint8)((param & 0x7) + 16); + if(crc32_a != CRC32_YAKATA2 && crc32_a != CRC32_DALK_HINT && crc32_a != CRC32_RANCE3_HINT) { + ags->text_font_color = (uint8)((param & 0x7) + 16); + } -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nP %d:", param); - output_console(log); -#endif + output_console("\nP %d:", param); } #define FWRITE(data, size) { \ @@ -1214,20 +1158,15 @@ void NACT_Sys2::cmd_q() int index = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nQ %d:", index); - output_console(log); -#endif + output_console("\nQ %d:", index); if(1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - char path[_MAX_PATH]; - strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT"); - path[7] = 'A' + index - 1; + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); FILEIO* fio = new FILEIO(); - if(fio->Fopen(path, FILEIO_WRITE_BINARY)) { + if(fio->Fopen(file_name, FILEIO_WRITE_BINARY)) { uint8 buffer[9510]; int p = 0; @@ -1295,11 +1234,7 @@ void NACT_Sys2::cmd_q() void NACT_Sys2::cmd_r() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "R\n"); - output_console(log); -#endif + output_console("R\n"); // ウィンドウの表示範囲外の場合は改ページ if(ags->return_text_line(text_window)) { @@ -1311,11 +1246,7 @@ void NACT_Sys2::cmd_s() { int page = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nS %d:", page); - output_console(log); -#endif + output_console("\nS %d:", page); if(page) { mako->play_music(page); @@ -1330,62 +1261,86 @@ void NACT_Sys2::cmd_t() int p2 = cali(); int p3 = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nT %d,%d,%d:", p1, p2, p3); - output_console(log); -#endif + output_console("\nT %d,%d,%d:", p1, p2, p3); } void NACT_Sys2::cmd_u() { - int page = getd(); - int transparent = getd(); + int page, transparent; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nU %d,%d:", page, transparent); - output_console(log); -#endif + if(crc32_a == CRC32_YAKATA2) { + page = cali(); + transparent = cali(); + } else { + page = getd(); + transparent = getd(); + } + + output_console("\nU %d,%d:", page, transparent); ags->load_cg(page, transparent); } void NACT_Sys2::cmd_v() { +#if 1 + int p01 = cali(); + int p02 = cali(); + int p03 = cali(); + int p04 = cali(); + int p05 = cali(); + int p06 = cali(); + int p07 = cali(); + int p08 = cali(); + int p09 = cali(); + int p10 = cali(); + int p11 = cali(); + int p12 = cali(); + int p13 = cali(); + int p14 = cali(); + int p15 = cali(); + int p16 = cali(); + int p17 = cali(); + int p18 = cali(); + int p19 = cali(); + int p20 = cali(); + int p21 = cali(); + int p22 = cali(); + int p23 = cali(); + int p24 = cali(); + int p25 = cali(); + int p26 = cali(); + int p27 = cali(); + int p28 = cali(); + int p29 = cali(); + + output_console("\nV %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d:", + p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29); +#else int p1 = cali(); int p2 = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nV %d,%d:", p1, p2); - output_console(log); + output_console("\nV %d,%d:", p1, p2); #endif } void NACT_Sys2::cmd_w() { - int p1 = cali(); - int p2 = cali(); - int p3 = cali(); - int p4 = cali(); + int sx = cali(); + int sy = cali(); + int ex = cali(); + int ey = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nW %d,%d,%d,%d:", p1, p2, p3, p4); - output_console(log); -#endif + output_console("\nW %d,%d,%d,%d:", sx, sy, ex, ey); + + ags->draw_mesh(sx, sy, ex - sx, ey - sy); } void NACT_Sys2::cmd_x() { int index = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nX %d:", index); - output_console(log); -#endif + output_console("\nX %d:", index); if(1 <= index && index <= 10) { ags->draw_text(tvar[index - 1]); @@ -1397,11 +1352,7 @@ void NACT_Sys2::cmd_y() int cmd = cali(); int param = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nY %d,%d:", cmd, param); - output_console(log); -#endif + output_console("\nY %d,%d:", cmd, param); switch(cmd) { case 1: @@ -1444,7 +1395,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; @@ -1460,10 +1411,18 @@ void NACT_Sys2::cmd_y() case 26: ags->text_font_size = (param == 1) ? 16 : (param == 2) ? 24 : (param == 3) ? 32 : (param == 4) ? 48 : (param == 5) ? 64 : 16; break; -#if 0 // Broken in Super D.P.S + case 27: + { + int tmp = tvar_index; + tvar_index = param; + tvar_maxlen = 8;//param; + text_dialog(); + tvar_index = tmp; + } + break; case 40: case 42: - { + if(ags->now_fade()) { Uint32 dwStart = SDL_GetTicks(); for(int i = 0; i < 16; i++) { ags->fade_in(i); @@ -1478,11 +1437,13 @@ void NACT_Sys2::cmd_y() SDL_Delay(0); } } + ags->fade_end(); } break; case 41: case 43: - { + if(!ags->now_fade()) { + ags->fade_start(); Uint32 dwStart = SDL_GetTicks(); for(int i = 0; i < 16; i++) { ags->fade_out(i, (cmd == 41) ? false : true); @@ -1499,7 +1460,6 @@ void NACT_Sys2::cmd_y() } } break; -#endif case 221: case 222: case 223: @@ -1530,6 +1490,28 @@ void NACT_Sys2::cmd_y() case 252: RND = 8; break; + case 253: + // キーが押されて離されるまで待機 + for(;;) { + if(terminate) { + return; + } + if(get_key()) { + break; + } + SDL_Delay(10); + } + SDL_Delay(100); + for(;;) { + if(terminate) { + return; + } + if(!(get_key() & 0x18)) { + break; + } + SDL_Delay(10); + } + break; case 254: RND = 0; break; @@ -1560,11 +1542,7 @@ void NACT_Sys2::cmd_z() int cmd = cali(); int param = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nZ %d,%d:", cmd, param); - output_console(log); -#endif + output_console("\nZ %d,%d:", cmd, param); // Z1 // Z2 diff --git a/src/sys/nact_sys3.cpp b/src/sys/nact_sys3.cpp index aa5dede..b8e98df 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -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) { } @@ -28,11 +28,7 @@ void NACT_Sys3::cmd_calc() } var[index] = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n!var[%d]:%d!", index, var[index]); - output_console(log); -#endif + output_console("\n!var[%d]:%d!", index, var[index]); } void NACT_Sys3::cmd_branch() @@ -44,11 +40,7 @@ void NACT_Sys3::cmd_branch() // sigmarion3 最適化誤爆の対策 scenario_addr = condition ? t_addr : f_addr; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n{%d: T:%4x, F:%4x", condition, t_addr, f_addr); - output_console(log); -#endif + output_console("\n{%d: T:%4x, F:%4x", condition, t_addr, f_addr); } void NACT_Sys3::cmd_label_jump() @@ -56,22 +48,14 @@ void NACT_Sys3::cmd_label_jump() int next_addr = getw(); scenario_addr = next_addr; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n@%x:", next_addr); - output_console(log); -#endif + output_console("\n@%x:", next_addr); } void NACT_Sys3::cmd_label_call() { int next_addr = getw(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n\\%x:", next_addr); - output_console(log); -#endif + output_console("\n\\%x:", next_addr); if(next_addr == 0) { // リターン @@ -93,22 +77,14 @@ void NACT_Sys3::cmd_page_jump() scenario_page = next_page; scenario_addr = 2; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n&%d:", next_page); - output_console(log); -#endif + output_console("\n&%d:", next_page); } void NACT_Sys3::cmd_page_call() { int next_page = cali(), next_addr; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n%%%d:", next_page); - output_console(log); -#endif + output_console("\n%%%d:", next_page); if(next_page == 0) { // リターン @@ -135,11 +111,7 @@ void NACT_Sys3::cmd_set_menu() ags->menu_dest_y += ags->menu_font_size + 2; ags->draw_menu = false; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "$"); - output_console(log); -#endif + output_console("$"); } else { if(!menu_index) { ags->clear_menu_window(); @@ -150,31 +122,14 @@ void NACT_Sys3::cmd_set_menu() ags->menu_dest_y += 2; ags->draw_menu = true; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n$%x,", menu_addr[menu_index - 1]); - output_console(log); -#endif + output_console("\n$%x,", menu_addr[menu_index - 1]); } } int NACT_Sys3::menu_select(int num_items) { - // クリック中の間は待機 - for(;;) { - if(terminate) { - return -1; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - SDL_Delay(16); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -183,12 +138,13 @@ int NACT_Sys3::menu_select(int num_items) int mx = ex - 16; int my = sy + 10; int height = ags->menu_font_size + 4; - set_cursor(mx, my); + int current_index = 0; - bool selectable = true; + set_cursor(mx, my); + wait_after_open_menu(); // メニュー選択 - for(;;) { + for(bool selectable = true;;) { // 入力待機 int val = 0, current_mx = mx, current_my = my; for(;;) { @@ -200,7 +156,7 @@ int NACT_Sys3::menu_select(int num_items) int dy = my - current_my; if (dx*dx + dy*dy > 10) break; - if((val = get_key())) { + if((val = get_key()) != 0) { SDL_Delay(100); break; } @@ -260,11 +216,7 @@ int NACT_Sys3::menu_select(int num_items) void NACT_Sys3::cmd_open_menu() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n]"); - output_console(log); -#endif + output_console("\n]"); if(!menu_index) { scenario_addr = scenario_data[0] | (scenario_data[1] << 8); @@ -292,11 +244,7 @@ void NACT_Sys3::cmd_set_verbobj() menu_obj[menu_index++] = obj; verb_obj = true; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]); - output_console(log); -#endif + output_console("\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]); } void NACT_Sys3::cmd_set_verbobj2() @@ -313,21 +261,13 @@ void NACT_Sys3::cmd_set_verbobj2() } verb_obj = true; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]); - output_console(log); -#endif + output_console("\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]); } void NACT_Sys3::cmd_open_verb() { // 動詞メニューの表示 -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nopen verb-obj menu"); - output_console(log); -#endif + output_console("\nopen verb-obj menu"); verb_obj = false; // 表示する動詞のチェック @@ -431,11 +371,7 @@ void NACT_Sys3::cmd_a() { texthook_nextpage(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "A\n"); - output_console(log); -#endif + output_console("A\n"); if(!text_skip_enb) { // Pushマークの表示 @@ -479,18 +415,13 @@ void NACT_Sys3::cmd_b() int p4 = cali(); int p5 = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5); - output_console(log); -#endif + output_console("\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5); 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; @@ -525,7 +456,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); @@ -545,6 +476,7 @@ void NACT_Sys3::cmd_b() void NACT_Sys3::cmd_d() { // 未使用 + fatal("Unknown Command: 'D' at page = %d, addr = %d", scenario_page, prev_addr); } void NACT_Sys3::cmd_e() @@ -556,11 +488,7 @@ void NACT_Sys3::cmd_e() int ex = cali(); int ey = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nE %d,%d,%d,%d,%d,%d:", index, color, sx, sy, ex, ey); - output_console(log); -#endif + output_console("\nE %d,%d,%d,%d,%d,%d:", index, color, sx, sy, ex, ey); ags->box[index - 1].color = color; ags->box[index - 1].sx = column ? sx * 8 : sx; @@ -571,11 +499,7 @@ void NACT_Sys3::cmd_e() void NACT_Sys3::cmd_f() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nF"); - output_console(log); -#endif + output_console("\nF"); scenario_addr = 2; } @@ -584,11 +508,7 @@ void NACT_Sys3::cmd_g() { int page = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nG %d:", page); - output_console(log); -#endif + output_console("\nG %d:", page); ags->load_cg(page, -1); } @@ -598,11 +518,7 @@ void NACT_Sys3::cmd_h() int length = getd(); int val = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nH %d,%d:", length, val); - output_console(log); -#endif + output_console("\nH %d,%d:", length, val); // 隠しコマンド? if(length >= 9) { @@ -653,15 +569,11 @@ void NACT_Sys3::cmd_i() int dx = cali(); int dy = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nI %d,%d,%d,%d,%d,%d:", sx, sy, ex, ey, dx, dy); - output_console(log); -#endif + output_console("\nI %d,%d,%d,%d,%d,%d:", sx, sy, ex, ey, dx, dy); // 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); } @@ -671,11 +583,7 @@ void NACT_Sys3::cmd_j() int x = cali(); int y = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nJ %d,%d:", x, y); - output_console(log); -#endif + output_console("\nJ %d,%d:", x, y); // x方向はカラム単位で切り捨て ags->cg_dest_x = column ? x * 8 : x & 0xfff8; @@ -687,11 +595,7 @@ void NACT_Sys3::cmd_k() { int cmd = getd(), val; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nK %d:", cmd); - output_console(log); -#endif + output_console("\nK %d:", cmd); // K6の場合は、すぐに返る if(cmd == 6) { @@ -708,7 +612,7 @@ void NACT_Sys3::cmd_k() if(terminate) { return; } - if((val = get_key())) { + if((val = get_key()) != 0) { break; } if(1 <= cmd && cmd <= 3) { @@ -764,11 +668,7 @@ void NACT_Sys3::cmd_l() { int index = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nL %d:", index); - output_console(log); -#endif + output_console("\nL %d:", index); if(index == 0) { // 特殊セーブ @@ -787,12 +687,11 @@ void NACT_Sys3::cmd_l() delete fio; } else if(1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - char path[_MAX_PATH]; - strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT"); - path[7] = 'A' + index - 1; + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); FILEIO* fio = new FILEIO(); - if(fio->Fopen(path, FILEIO_READ_BINARY | FILEIO_SAVEDATA)) { + if(fio->Fopen(file_name, FILEIO_READ_BINARY | FILEIO_SAVEDATA)) { fio->Fseek(112, FILEIO_SEEK_SET); int next_page = fio->Fgetw() - 1; @@ -880,12 +779,11 @@ void NACT_Sys3::cmd_l() delete fio; } else if(101 <= index && index <= 126) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - char path[_MAX_PATH]; - strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT"); - path[7] = 'A' + index - 101; + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 101); FILEIO* fio = new FILEIO(); - if(fio->Fopen(path, FILEIO_READ_BINARY | FILEIO_SAVEDATA)) { + if(fio->Fopen(file_name, FILEIO_READ_BINARY | FILEIO_SAVEDATA)) { fio->Fseek(112 + 16, FILEIO_SEEK_SET); var[0] = fio->Fgetw(); fio->Fclose(); @@ -910,11 +808,7 @@ void NACT_Sys3::cmd_m() } string[p] = '\0'; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nM %s:", string); - output_console(log); -#endif + output_console("\nM %s:", string); if(1 <= tvar_index && tvar_index <= 10) { memcpy(tvar[tvar_index - 1], string, 22); @@ -935,11 +829,7 @@ void NACT_Sys3::cmd_n() int src = cali(); int dest = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nN %d,%d,%d:", cmd, src, dest); - output_console(log); -#endif + output_console("\nN %d,%d,%d:", cmd, src, dest); } void NACT_Sys3::cmd_o() @@ -964,11 +854,7 @@ void NACT_Sys3::cmd_o() B15 = (val & 0x4000) ? 1 : 0; B16 = (val & 0x8000) ? 1 : 0; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nO %d,%d:", cmd, val); - output_console(log); -#endif + output_console("\nO %d,%d:", cmd, val); } else { uint16 val = 0; val |= B01 ? 0x0001 : 0; @@ -990,11 +876,7 @@ void NACT_Sys3::cmd_o() int index = cali2(); var[index] = val; -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nO %d,var[%d]:", cmd, index); - output_console(log); -#endif + output_console("\nO %d,var[%d]:", cmd, index); } } @@ -1005,11 +887,7 @@ void NACT_Sys3::cmd_p() int g = cali(); int b = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nP %d,%d,%d,%d:", index, r, g, b); - output_console(log); -#endif + output_console("\nP %d,%d,%d,%d:", index, r, g, b); ags->set_palette(index, r, g, b); set_palette = true; @@ -1051,11 +929,7 @@ void NACT_Sys3::cmd_q() int index = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nQ %d:", index); - output_console(log); -#endif + output_console("\nQ %d:", index); if(index == 0) { // 特殊セーブ @@ -1074,12 +948,11 @@ void NACT_Sys3::cmd_q() delete fio; } else if(1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - char path[_MAX_PATH]; - strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT"); - path[7] = 'A' + index - 1; + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); FILEIO* fio = new FILEIO(); - if(fio->Fopen(path, FILEIO_WRITE_BINARY | FILEIO_SAVEDATA)) { + if(fio->Fopen(file_name, FILEIO_WRITE_BINARY | FILEIO_SAVEDATA)) { uint8 buffer[9510]; int p = 0; @@ -1149,11 +1022,7 @@ void NACT_Sys3::cmd_r() { texthook_newline(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "R\n"); - output_console(log); -#endif + output_console("R\n"); // ウィンドウの表示範囲外の場合は改ページ if(ags->return_text_line(text_window)) { @@ -1165,11 +1034,7 @@ void NACT_Sys3::cmd_s() { int page = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nS %d:", page); - output_console(log); -#endif + output_console("\nS %d:", page); if(page) { mako->play_music(page); @@ -1183,11 +1048,7 @@ void NACT_Sys3::cmd_t() int x = cali(); int y = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nT %d,%d:", x, y); - output_console(log); -#endif + output_console("\nT %d,%d:", x, y); // x方向はカラム単位で切り捨て ags->text_dest_x = column ? x * 8 : x & 0xfff8; @@ -1199,13 +1060,9 @@ void NACT_Sys3::cmd_u() int page = cali(); int transparent = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nU %d,%d:", page, transparent); - output_console(log); -#endif + 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); @@ -1216,11 +1073,7 @@ void NACT_Sys3::cmd_v() int cmd = cali(); int index = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nV %d,%d:", cmd, index); - output_console(log); -#endif + output_console("\nV %d,%d:", cmd, index); if(cmd == 0) { for(int i = 0; i < 20; i++) { @@ -1245,11 +1098,7 @@ void NACT_Sys3::cmd_w() int y = cali(); uint8 color = (uint8)cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nW %d,%d,%d", x, y, color); - output_console(log); -#endif + output_console("\nW %d,%d,%d", x, y, color); ags->paint(x, y, color); } @@ -1258,11 +1107,7 @@ void NACT_Sys3::cmd_x() { int index = getd(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nX %d:", index); - output_console(log); -#endif + output_console("\nX %d:", index); if(1 <= index && index <= 10) { ags->draw_text(tvar[index - 1]); @@ -1274,11 +1119,7 @@ void NACT_Sys3::cmd_y() int cmd = cali(); int param = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nY %d,%d:", cmd, param); - output_console(log); -#endif + output_console("\nY %d,%d:", cmd, param); switch(cmd) { case 1: @@ -1559,7 +1400,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) { @@ -1595,13 +1436,12 @@ void NACT_Sys3::cmd_y() } break; case 239: - { - char path[_MAX_PATH]; - strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT"); - path[7] = 'A' + param - 1; + if(1 <= param && param <= 26) { + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + param - 1); struct stat statbuf; - if (FILEIO::StatSavedata(path, &statbuf) != -1) { + if (FILEIO::StatSavedata(file_name, &statbuf) != -1) { struct tm *t = localtime(&statbuf.st_mtime); D01 = t->tm_year + 1900; D02 = t->tm_mon + 1; @@ -1612,6 +1452,9 @@ void NACT_Sys3::cmd_y() } else { D01 = D02 = D03 = D04 = D05 = D06 = 0; } + } else { + // 不正なファイル番号 + D01 = D02 = D03 = D04 = D05 = D06 = 0; } break; case 240: @@ -1620,33 +1463,37 @@ void NACT_Sys3::cmd_y() case 241: break; case 250: - { #if 0 - char path[4]; - path[0] = g_root[0]; - path[1] = ':'; - path[2] = '\\'; - path[3] = '\0'; - UINT t = GetDriveType(path); + if(FILEIO::GetRootPath()[1] == ':') { + _TCHAR root_path[4]; + root_path[0] = FILEIO::GetRootPath()[0]; + root_path[1] = ':'; + root_path[2] = '\\'; + root_path[3] = '\0'; + + UINT t = GetDriveType(root_path); // フロッピーから起動した場合は0が返る //RND = (t == DRIVE_REMOVABLE) ? 0 : (t == DRIVE_CDROM) ? 2 : 1; RND = (t == DRIVE_CDROM) ? 2 : 1; -#else + } else { + // ネットワークドライブ? RND = 1; -#endif } +#else + RND = 1; +#endif break; case 251: 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; @@ -1660,11 +1507,7 @@ void NACT_Sys3::cmd_z() int cmd = cali(); int param = cali(); -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nZ %d,%d:", cmd, param); - output_console(log); -#endif + output_console("\nZ %d,%d:", cmd, param); if(cmd == 0) { ags->palette_bank = (uint8)(param & 0xff); diff --git a/src/win/nact_win.cpp b/src/win/nact_win.cpp index 4ca2e08..0d7d7ac 100644 --- a/src/win/nact_win.cpp +++ b/src/win/nact_win.cpp @@ -92,9 +92,13 @@ void NACT::release_console() #endif } -void NACT::output_console(char log[]) +void NACT::output_console(const char *format, ...) { #if defined(_DEBUG_CONSOLE) - fputs(log, stdout); + va_list ap; + + va_start(ap, format); + vfprintf(stdout, format, ap); + va_end(ap); #endif }