diff --git a/build8.bat b/build8.bat deleted file mode 100644 index 4ba473e..0000000 --- a/build8.bat +++ /dev/null @@ -1,21 +0,0 @@ -echo off -if exist "%ProgramFiles(x86)%" goto is_x64 -set path="%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE";%PATH% -goto start -:is_x64 -set path="%ProgramFiles(x86)%\Microsoft Visual Studio 9.0\Common7\IDE";%PATH% -:start - -devenv.com crescent.vcproj /Rebuild Release -devenv.com dps.vcproj /Rebuild Release -devenv.com fukei.vcproj /Rebuild Release -devenv.com intruder.vcproj /Rebuild Release -devenv.com maria.vcproj /Rebuild Release -devenv.com prog_omake.vcproj /Rebuild Release -devenv.com sdps.vcproj /Rebuild Release -devenv.com system3.vcproj /Rebuild Release -devenv.com tengu.vcproj /Rebuild Release -devenv.com vampire.vcproj /Rebuild Release - -pause -echo on diff --git a/build9.bat b/build9.bat new file mode 100644 index 0000000..4dc4700 --- /dev/null +++ b/build9.bat @@ -0,0 +1,24 @@ +echo off + +if exist "%ProgramFiles(x86)%" goto is_x64 +set path="%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE";%PATH% +set path="%ProgramFiles%\Windows Kits\8.1\bin\x86";%PATH% +goto start + +:is_x64 +set path="%ProgramFiles(x86)%\Microsoft Visual Studio 9.0\Common7\IDE";%PATH% +set path="%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86";%PATH% + +:start + +devenv.com system1.vcproj /Rebuild Release +devenv.com system2.vcproj /Rebuild Release +devenv.com system3.vcproj /Rebuild Release +devenv.com prog_omake.vcproj /Rebuild Release + +pushd Release +for /r %%i in (*.exe) do mt.exe /manifest ..\vista.manifest -outputresource:%%i;1 +popd + +pause +echo on diff --git a/crescent.vcproj b/crescent.vcproj deleted file mode 100644 index 87e8ff7..0000000 --- a/crescent.vcproj +++ /dev/null @@ -1,656 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fukei.vcproj b/fukei.vcproj deleted file mode 100644 index be5145b..0000000 --- a/fukei.vcproj +++ /dev/null @@ -1,656 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/history.txt b/history.txt index 0cc83e4..9c76af9 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/intruder.vcproj b/intruder.vcproj deleted file mode 100644 index 357c44c..0000000 --- a/intruder.vcproj +++ /dev/null @@ -1,656 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/maria.vcproj b/maria.vcproj deleted file mode 100644 index 4768fc3..0000000 --- a/maria.vcproj +++ /dev/null @@ -1,636 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/prog_omake.vcproj b/prog_omake.vcproj index 006d92d..593493e 100644 --- a/prog_omake.vcproj +++ b/prog_omake.vcproj @@ -4,6 +4,7 @@ Version="9.00" Name="prog_omake" ProjectGUID="{2F98D020-2D77-4650-84C7-589A44DAC686}" + RootNamespace="prog_omake" TargetFrameworkVersion="0" > @@ -48,7 +49,7 @@ + + + + + + + + @@ -661,6 +685,10 @@ RelativePath="src\res3\AMUS_RG2.MDA" > + + diff --git a/readme.txt b/readme.txt index 8ca3ece..f973658 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/common.h b/src/common.h index dc52a6a..af637a3 100644 --- a/src/common.h +++ b/src/common.h @@ -13,7 +13,7 @@ #pragma comment(lib, "Gdiplus.lib") using namespace Gdiplus; -#ifdef _DEBUG +#if defined(_DEBUG) // detect memory leaks #define _CRTDBG_MAP_ALLOC #include diff --git a/src/fileio.cpp b/src/fileio.cpp index cb61930..eda61f1 100644 --- a/src/fileio.cpp +++ b/src/fileio.cpp @@ -20,7 +20,34 @@ FILEIO::~FILEIO(void) } } -bool FILEIO::Fopen(_TCHAR *filename, int mode) +const char *FILEIO::GetRootPath() +{ + static bool initialized = false; + static char root_path[_MAX_PATH]; + + // モジュールパス取得 + if(!initialized) { + char tmp_path[_MAX_PATH], *ptr = NULL; + + if(GetModuleFileNameA(NULL, tmp_path, _MAX_PATH) != 0 && GetFullPathNameA(tmp_path, _MAX_PATH, root_path, &ptr) != 0 && ptr != NULL) { + *ptr = '\0'; + } else { + strcpy_s(root_path, _MAX_PATH, ".\\"); + } + initialized = true; + } + return root_path; +} + +const char *FILEIO::GetFilePath(const char *file_name) +{ + static char file_path[_MAX_PATH]; + + sprintf_s(file_path, _MAX_PATH, "%s%s", GetRootPath(), file_name); + return file_path; +} + +bool FILEIO::Fopen(const char *file_name, int mode) { if(fp != NULL) { Fclose(); @@ -28,17 +55,17 @@ bool FILEIO::Fopen(_TCHAR *filename, int mode) fp = NULL; if(mode == FILEIO_READ_BINARY) { - _tfopen_s(&fp, filename, _T("rb")); + fopen_s(&fp, GetFilePath(file_name), "rb"); } else if(mode == FILEIO_WRITE_BINARY) { - _tfopen_s(&fp, filename, _T("wb")); + fopen_s(&fp, GetFilePath(file_name), "wb"); } else if(mode == FILEIO_READ_WRITE_BINARY) { - _tfopen_s(&fp, filename, _T("r+b")); + fopen_s(&fp, GetFilePath(file_name), "r+b"); } else if(mode == FILEIO_READ_ASCII) { - _tfopen_s(&fp, filename, __T("r")); + fopen_s(&fp, GetFilePath(file_name), "r"); } else if(mode == FILEIO_WRITE_ASCII) { - _tfopen_s(&fp, filename, _T("w")); + fopen_s(&fp, GetFilePath(file_name), "w"); } else if(mode == FILEIO_READ_WRITE_ASCII) { - _tfopen_s(&fp, filename, _T("r+w")); + fopen_s(&fp, GetFilePath(file_name), "r+w"); } return (fp != NULL); } @@ -69,12 +96,12 @@ uint32 FILEIO::Ftell() return ftell(fp); } -uint32 FILEIO::Fread(void* buffer, uint32 size, uint32 count) +uint32 FILEIO::Fread(void *buffer, uint32 size, uint32 count) { return fread(buffer, size, count, fp); } -uint32 FILEIO::Fwrite(void* buffer, uint32 size, uint32 count) +uint32 FILEIO::Fwrite(void *buffer, uint32 size, uint32 count) { return fwrite(buffer, size, count, fp); } @@ -90,19 +117,24 @@ int FILEIO::Fgetw() return val | (Fgetc() << 8); } -void FILEIO::Fgets(char dest[]) +void FILEIO::Fgets(char *dest, int length) { int p = 0; for(;;) { int c = Fgetc(); + if(c == 0x0d || c == EOF) { 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 37d994a..20b5af7 100644 --- a/src/fileio.h +++ b/src/fileio.h @@ -24,20 +24,22 @@ class FILEIO { private: - FILE* fp; + FILE *fp; public: FILEIO(); ~FILEIO(); - bool Fopen(_TCHAR *filename, int mode); + static const char *GetRootPath(); + static const char *GetFilePath(const char *file_name); + bool Fopen(const char *file_name, int mode); void Fclose(); uint32 Fseek(long offset, int origin); uint32 Ftell(); - uint32 Fread(void* buffer, uint32 size, uint32 count); - uint32 Fwrite(void* buffer, uint32 size, uint32 count); + uint32 Fread(void *buffer, uint32 size, uint32 count); + 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/res1/AMUS_AB.MDA b/src/res1/AMUS_AB.MDA new file mode 100644 index 0000000..fce0edc Binary files /dev/null and b/src/res1/AMUS_AB.MDA differ diff --git a/src/res1/AMUS_AL1.MDA b/src/res1/AMUS_AL1.MDA new file mode 100644 index 0000000..1355c67 Binary files /dev/null and b/src/res1/AMUS_AL1.MDA differ diff --git a/src/res1/AMUS_AT.MDA b/src/res1/AMUS_AT.MDA new file mode 100644 index 0000000..546a5a6 Binary files /dev/null and b/src/res1/AMUS_AT.MDA differ diff --git a/src/res1/AMUS_CRS.MDA b/src/res1/AMUS_CRS.MDA new file mode 100644 index 0000000..84bd891 Binary files /dev/null and b/src/res1/AMUS_CRS.MDA differ diff --git a/src/res1/AMUS_DPS.MDA b/src/res1/AMUS_DPS.MDA new file mode 100644 index 0000000..ee86a0b Binary files /dev/null and b/src/res1/AMUS_DPS.MDA differ diff --git a/src/res1/AMUS_INT.MDA b/src/res1/AMUS_INT.MDA new file mode 100644 index 0000000..bd14d6b Binary files /dev/null and b/src/res1/AMUS_INT.MDA differ diff --git a/src/res1/AMUS_LP2.MDA b/src/res1/AMUS_LP2.MDA new file mode 100644 index 0000000..7b09e7f Binary files /dev/null and b/src/res1/AMUS_LP2.MDA differ diff --git a/src/res1/AMUS_SG.MDA b/src/res1/AMUS_SG.MDA new file mode 100644 index 0000000..5c7543f Binary files /dev/null and b/src/res1/AMUS_SG.MDA differ diff --git a/src/res1/AMUS_T1.MDA b/src/res1/AMUS_T1.MDA new file mode 100644 index 0000000..3580720 Binary files /dev/null and b/src/res1/AMUS_T1.MDA differ diff --git a/src/res1/AMUS_VX.MDA b/src/res1/AMUS_VX.MDA new file mode 100644 index 0000000..6af3fd9 Binary files /dev/null and b/src/res1/AMUS_VX.MDA differ diff --git a/src/res1/BMUS_AKA.MDA b/src/res1/BMUS_AKA.MDA new file mode 100644 index 0000000..7b69e75 Binary files /dev/null and b/src/res1/BMUS_AKA.MDA differ diff --git a/src/res1/BMUS_ANT.MDA b/src/res1/BMUS_ANT.MDA new file mode 100644 index 0000000..6cce8c8 Binary files /dev/null and b/src/res1/BMUS_ANT.MDA differ diff --git a/src/res1/BMUS_FAH.MDA b/src/res1/BMUS_FAH.MDA new file mode 100644 index 0000000..49778c4 Binary files /dev/null and b/src/res1/BMUS_FAH.MDA differ diff --git a/src/res1/BMUS_KAT.MDA b/src/res1/BMUS_KAT.MDA new file mode 100644 index 0000000..2e2bce3 Binary files /dev/null and b/src/res1/BMUS_KAT.MDA differ diff --git a/src/res1/BMUS_NAI.MDA b/src/res1/BMUS_NAI.MDA new file mode 100644 index 0000000..82fb56a Binary files /dev/null and b/src/res1/BMUS_NAI.MDA differ diff --git a/src/res1/BMUS_NOB.MDA b/src/res1/BMUS_NOB.MDA new file mode 100644 index 0000000..e19a1b9 Binary files /dev/null and b/src/res1/BMUS_NOB.MDA differ diff --git a/src/res1/BMUS_RAB.MDA b/src/res1/BMUS_RAB.MDA new file mode 100644 index 0000000..cdaf05b Binary files /dev/null and b/src/res1/BMUS_RAB.MDA differ diff --git a/src/res1/BMUS_SIN.MDA b/src/res1/BMUS_SIN.MDA new file mode 100644 index 0000000..baa64e6 Binary files /dev/null and b/src/res1/BMUS_SIN.MDA differ diff --git a/src/res1/BMUS_SOT.MDA b/src/res1/BMUS_SOT.MDA new file mode 100644 index 0000000..971cf9e Binary files /dev/null and b/src/res1/BMUS_SOT.MDA differ diff --git a/src/res1/CMUS_T1.MDA b/src/res1/CMUS_T1.MDA new file mode 100644 index 0000000..1d33e0c Binary files /dev/null and b/src/res1/CMUS_T1.MDA differ diff --git a/src/res1/Script1.rc b/src/res1/Script1.rc index ee8edde..9807f0b 100644 --- a/src/res1/Script1.rc +++ b/src/res1/Script1.rc @@ -87,6 +87,32 @@ END // remains consistent on all systems. IDI_ICON1 ICON DISCARDABLE "icon1.ico" +///////////////////////////////////////////////////////////////////////////// +// +// MDA +// + +IDR_AMUS_AB MDA DISCARDABLE "AMUS_AB.MDA" +IDR_AMUS_AL1 MDA DISCARDABLE "AMUS_AL1.MDA" +IDR_AMUS_AT MDA DISCARDABLE "AMUS_AT.MDA" +IDR_AMUS_CRS MDA DISCARDABLE "AMUS_CRS.MDA" +IDR_AMUS_DPS MDA DISCARDABLE "AMUS_DPS.MDA" +IDR_AMUS_INT MDA DISCARDABLE "AMUS_INT.MDA" +IDR_AMUS_LP2 MDA DISCARDABLE "AMUS_LP2.MDA" +IDR_AMUS_SG MDA DISCARDABLE "AMUS_SG.MDA" +IDR_AMUS_T1 MDA DISCARDABLE "AMUS_T1.MDA" +IDR_AMUS_VX MDA DISCARDABLE "AMUS_VX.MDA" +IDR_BMUS_AKA MDA DISCARDABLE "BMUS_AKA.MDA" +IDR_BMUS_ANT MDA DISCARDABLE "BMUS_ANT.MDA" +IDR_BMUS_FAH MDA DISCARDABLE "BMUS_FAH.MDA" +IDR_BMUS_KAT MDA DISCARDABLE "BMUS_KAT.MDA" +IDR_BMUS_NAI MDA DISCARDABLE "BMUS_NAI.MDA" +IDR_BMUS_NOB MDA DISCARDABLE "BMUS_NOB.MDA" +IDR_BMUS_RAB MDA DISCARDABLE "BMUS_RAB.MDA" +IDR_BMUS_SIN MDA DISCARDABLE "BMUS_SIN.MDA" +IDR_BMUS_SOT MDA DISCARDABLE "BMUS_SOT.MDA" +IDR_CMUS_T1 MDA DISCARDABLE "CMUS_T1.MDA" + ///////////////////////////////////////////////////////////////////////////// // // Dialog diff --git a/src/res1/resource.h b/src/res1/resource.h index a3c33a3..9ce237a 100644 --- a/src/res1/resource.h +++ b/src/res1/resource.h @@ -7,6 +7,26 @@ #define IDD_DIALOG1 103 #define IDC_TEXT 104 #define IDC_EDITBOX 105 +#define IDR_AMUS_AB 106 +#define IDR_AMUS_AL1 107 +#define IDR_AMUS_AT 108 +#define IDR_AMUS_CRS 109 +#define IDR_AMUS_DPS 110 +#define IDR_AMUS_INT 111 +#define IDR_AMUS_LP2 112 +#define IDR_AMUS_SG 113 +#define IDR_AMUS_T1 114 +#define IDR_AMUS_VX 115 +#define IDR_BMUS_AKA 116 +#define IDR_BMUS_ANT 117 +#define IDR_BMUS_FAH 118 +#define IDR_BMUS_KAT 119 +#define IDR_BMUS_NAI 120 +#define IDR_BMUS_NOB 121 +#define IDR_BMUS_RAB 122 +#define IDR_BMUS_SIN 123 +#define IDR_BMUS_SOT 124 +#define IDR_CMUS_T1 125 #define ID_RESTART 40001 #define ID_EXIT 40002 #define ID_SCREEN_WINDOW 40003 @@ -20,7 +40,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 118 +#define _APS_NEXT_RESOURCE_VALUE 126 #define _APS_NEXT_COMMAND_VALUE 40009 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/src/res2/AMUS_AL2.MDA b/src/res2/AMUS_AL2.MDA new file mode 100644 index 0000000..45a0dd1 Binary files /dev/null and b/src/res2/AMUS_AL2.MDA differ diff --git a/src/res2/AMUS_AYM.MDA b/src/res2/AMUS_AYM.MDA new file mode 100644 index 0000000..eb0ab3c Binary files /dev/null and b/src/res2/AMUS_AYM.MDA differ diff --git a/src/res2/AMUS_DLK.MDA b/src/res2/AMUS_DLK.MDA new file mode 100644 index 0000000..b72c427 Binary files /dev/null and b/src/res2/AMUS_DLK.MDA differ diff --git a/src/res2/AMUS_DRS.MDA b/src/res2/AMUS_DRS.MDA new file mode 100644 index 0000000..c963711 Binary files /dev/null and b/src/res2/AMUS_DRS.MDA differ diff --git a/src/res2/AMUS_PSG.MDA b/src/res2/AMUS_PSG.MDA new file mode 100644 index 0000000..aaece60 Binary files /dev/null and b/src/res2/AMUS_PSG.MDA differ diff --git a/src/res2/AMUS_R3H.MDA b/src/res2/AMUS_R3H.MDA new file mode 100644 index 0000000..5b68f52 Binary files /dev/null and b/src/res2/AMUS_R3H.MDA differ diff --git a/src/res2/AMUS_R4.MDA b/src/res2/AMUS_R4.MDA new file mode 100644 index 0000000..ff0109b Binary files /dev/null and b/src/res2/AMUS_R4.MDA differ diff --git a/src/res2/AMUS_SDP.MDA b/src/res2/AMUS_SDP.MDA new file mode 100644 index 0000000..6931ce1 Binary files /dev/null and b/src/res2/AMUS_SDP.MDA differ diff --git a/src/res2/BMUS_KAM.MDA b/src/res2/BMUS_KAM.MDA new file mode 100644 index 0000000..ef1e1fa Binary files /dev/null and b/src/res2/BMUS_KAM.MDA differ diff --git a/src/res2/BMUS_MTK.MDA b/src/res2/BMUS_MTK.MDA new file mode 100644 index 0000000..aa56d12 Binary files /dev/null and b/src/res2/BMUS_MTK.MDA differ diff --git a/src/res2/BMUS_TNM.MDA b/src/res2/BMUS_TNM.MDA new file mode 100644 index 0000000..5505e3b Binary files /dev/null and b/src/res2/BMUS_TNM.MDA differ diff --git a/src/res2/Script1.rc b/src/res2/Script1.rc index ee8edde..d567bf8 100644 --- a/src/res2/Script1.rc +++ b/src/res2/Script1.rc @@ -87,6 +87,22 @@ END // remains consistent on all systems. IDI_ICON1 ICON DISCARDABLE "icon1.ico" +///////////////////////////////////////////////////////////////////////////// +// +// MDA +// + +IDR_AMUS_AL2 MDA DISCARDABLE "AMUS_AL2.MDA" +IDR_AMUS_AYM MDA DISCARDABLE "AMUS_AYM.MDA" +IDR_AMUS_DLK MDA DISCARDABLE "AMUS_DLK.MDA" +IDR_AMUS_DRS MDA DISCARDABLE "AMUS_DRS.MDA" +IDR_AMUS_PSG MDA DISCARDABLE "AMUS_PSG.MDA" +IDR_AMUS_R3H MDA DISCARDABLE "AMUS_R3H.MDA" +IDR_AMUS_SDP MDA DISCARDABLE "AMUS_SDP.MDA" +IDR_BMUS_KAM MDA DISCARDABLE "BMUS_KAM.MDA" +IDR_BMUS_MTK MDA DISCARDABLE "BMUS_MTK.MDA" +IDR_BMUS_TNM MDA DISCARDABLE "BMUS_TNM.MDA" + ///////////////////////////////////////////////////////////////////////////// // // Dialog diff --git a/src/res2/resource.h b/src/res2/resource.h index a3c33a3..8d46202 100644 --- a/src/res2/resource.h +++ b/src/res2/resource.h @@ -7,6 +7,16 @@ #define IDD_DIALOG1 103 #define IDC_TEXT 104 #define IDC_EDITBOX 105 +#define IDR_AMUS_AL2 106 +#define IDR_AMUS_AYM 107 +#define IDR_AMUS_DLK 108 +#define IDR_AMUS_DRS 109 +#define IDR_AMUS_PSG 110 +#define IDR_AMUS_R3H 111 +#define IDR_AMUS_SDP 112 +#define IDR_BMUS_KAM 113 +#define IDR_BMUS_MTK 114 +#define IDR_BMUS_TNM 115 #define ID_RESTART 40001 #define ID_EXIT 40002 #define ID_SCREEN_WINDOW 40003 @@ -20,7 +30,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 118 +#define _APS_NEXT_RESOURCE_VALUE 116 #define _APS_NEXT_COMMAND_VALUE 40009 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/src/res3/AMUS_T2.MDA b/src/res3/AMUS_T2.MDA new file mode 100644 index 0000000..51a36a4 Binary files /dev/null and b/src/res3/AMUS_T2.MDA differ diff --git a/src/res3/Script1.rc b/src/res3/Script1.rc index bb3d9d0..f241caa 100644 --- a/src/res3/Script1.rc +++ b/src/res3/Script1.rc @@ -92,18 +92,19 @@ IDI_ICON1 ICON DISCARDABLE "icon1.ico" // MDA // -IDR_AL3 MDA DISCARDABLE "AMUS_AL3.MDA" -IDR_ALL MDA DISCARDABLE "AMUS_ALL.MDA" -IDR_AMB MDA DISCARDABLE "AMUS_AMB.MDA" -IDR_AYM MDA DISCARDABLE "AMUS_AYM.MDA" -IDR_BEE MDA DISCARDABLE "AMUS_BEE.MDA" -IDR_MGN MDA DISCARDABLE "AMUS_MGN.MDA" -IDR_OTM MDA DISCARDABLE "AMUS_OTM.MDA" -IDR_OY MDA DISCARDABLE "AMUS_OY.MDA" -IDR_PSG MDA DISCARDABLE "AMUS_PSG.MDA" -IDR_R41 MDA DISCARDABLE "AMUS_R41.MDA" -IDR_R42 MDA DISCARDABLE "AMUS_R42.MDA" -IDR_RG2 MDA DISCARDABLE "AMUS_RG2.MDA" +IDR_AMUS_AL3 MDA DISCARDABLE "AMUS_AL3.MDA" +IDR_AMUS_ALL MDA DISCARDABLE "AMUS_ALL.MDA" +IDR_AMUS_AMB MDA DISCARDABLE "AMUS_AMB.MDA" +IDR_AMUS_AYM MDA DISCARDABLE "AMUS_AYM.MDA" +IDR_AMUS_BEE MDA DISCARDABLE "AMUS_BEE.MDA" +IDR_AMUS_MGN MDA DISCARDABLE "AMUS_MGN.MDA" +IDR_AMUS_OTM MDA DISCARDABLE "AMUS_OTM.MDA" +IDR_AMUS_OY MDA DISCARDABLE "AMUS_OY.MDA" +IDR_AMUS_PSG MDA DISCARDABLE "AMUS_PSG.MDA" +IDR_AMUS_R41 MDA DISCARDABLE "AMUS_R41.MDA" +IDR_AMUS_R42 MDA DISCARDABLE "AMUS_R42.MDA" +IDR_AMUS_RG2 MDA DISCARDABLE "AMUS_RG2.MDA" +IDR_AMUS_T2 MDA DISCARDABLE "AMUS_T2.MDA" ///////////////////////////////////////////////////////////////////////////// // diff --git a/src/res3/resource.h b/src/res3/resource.h index f5666c2..0a9caa2 100644 --- a/src/res3/resource.h +++ b/src/res3/resource.h @@ -7,18 +7,19 @@ #define IDD_DIALOG1 103 #define IDC_TEXT 104 #define IDC_EDITBOX 105 -#define IDR_AL3 106 -#define IDR_ALL 107 -#define IDR_AMB 108 -#define IDR_AYM 109 -#define IDR_BEE 110 -#define IDR_MGN 111 -#define IDR_OTM 112 -#define IDR_OY 113 -#define IDR_PSG 114 -#define IDR_R41 115 -#define IDR_R42 116 -#define IDR_RG2 117 +#define IDR_AMUS_AL3 106 +#define IDR_AMUS_ALL 107 +#define IDR_AMUS_AMB 108 +#define IDR_AMUS_AYM 109 +#define IDR_AMUS_BEE 110 +#define IDR_AMUS_MGN 111 +#define IDR_AMUS_OTM 112 +#define IDR_AMUS_OY 113 +#define IDR_AMUS_PSG 114 +#define IDR_AMUS_R41 115 +#define IDR_AMUS_R42 116 +#define IDR_AMUS_RG2 117 +#define IDR_AMUS_T2 118 #define ID_RESTART 40001 #define ID_EXIT 40002 #define ID_SCREEN_WINDOW 40003 @@ -32,7 +33,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 118 +#define _APS_NEXT_RESOURCE_VALUE 119 #define _APS_NEXT_COMMAND_VALUE 40009 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/src/rest2/AMUS_AL3.MDA b/src/rest2/AMUS_AL3.MDA deleted file mode 100644 index c0ed11d..0000000 Binary files a/src/rest2/AMUS_AL3.MDA and /dev/null differ diff --git a/src/rest2/AMUS_KNG.MDA b/src/rest2/AMUS_KNG.MDA new file mode 100644 index 0000000..91a71b0 Binary files /dev/null and b/src/rest2/AMUS_KNG.MDA differ diff --git a/src/rest2/Script1.rc b/src/rest2/Script1.rc index 57d769a..28b4b63 100644 --- a/src/rest2/Script1.rc +++ b/src/rest2/Script1.rc @@ -92,8 +92,8 @@ IDI_ICON1 ICON DISCARDABLE "icon1.ico" // MDA // -IDR_AL3 MDA DISCARDABLE "AMUS_AL3.MDA" -IDR_T2 MDA DISCARDABLE "AMUS_T2.MDA" +IDR_AMUS_T2 MDA DISCARDABLE "AMUS_T2.MDA" +IDR_AMUS_KNG MDA DISCARDABLE "AMUS_KNG.MDA" ///////////////////////////////////////////////////////////////////////////// // diff --git a/src/rest2/resource.h b/src/rest2/resource.h index f652de0..7d1b571 100644 --- a/src/rest2/resource.h +++ b/src/rest2/resource.h @@ -7,8 +7,8 @@ #define IDD_DIALOG1 103 #define IDC_TEXT 104 #define IDC_EDITBOX 105 -#define IDR_AL3 106 -#define IDR_T2 107 +#define IDR_AMUS_T2 106 +#define IDR_AMUS_KNG 107 #define ID_RESTART 40001 #define ID_EXIT 40002 #define ID_SCREEN_WINDOW 40003 @@ -22,7 +22,7 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 118 +#define _APS_NEXT_RESOURCE_VALUE 108 #define _APS_NEXT_COMMAND_VALUE 40009 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 101 diff --git a/src/sys/ags.cpp b/src/sys/ags.cpp index 1f25821..c9fc582 100644 --- a/src/sys/ags.cpp +++ b/src/sys/ags.cpp @@ -8,7 +8,6 @@ #include "crc32.h" #include "../fileio.h" -extern _TCHAR g_root[_MAX_PATH]; extern HWND g_hwnd; #define SET_TEXT(n, x1, y1, x2, y2, f) { \ @@ -33,7 +32,7 @@ extern HWND g_hwnd; box[n].ey = y2; \ } -AGS::AGS(NACT* parent) : nact(parent) +AGS::AGS(NACT *parent) : nact(parent) { // GDI+初期化 GdiplusStartup(&gdiToken, &gdiSI, NULL); @@ -55,7 +54,7 @@ AGS::AGS(NACT* parent) : nact(parent) lpDibScreen[i]->bmiHeader.biYPelsPerMeter = 0; lpDibScreen[i]->bmiHeader.biClrUsed = 0; lpDibScreen[i]->bmiHeader.biClrImportant = 0; - hBmpScreen[i] = CreateDIBSection(hdc, lpDibScreen[i], DIB_RGB_COLORS, (PVOID*)&lpBmpScreen[i], NULL, 0); + hBmpScreen[i] = CreateDIBSection(hdc, lpDibScreen[i], DIB_RGB_COLORS, (PVOID *)&lpBmpScreen[i], NULL, 0); hdcDibScreen[i] = CreateCompatibleDC(hdc); SelectObject(hdcDibScreen[i], hBmpScreen[i]); memset(lpBmpScreen[i], 0, 640 * 480 * sizeof(DWORD)); @@ -80,7 +79,7 @@ AGS::AGS(NACT* parent) : nact(parent) lpDibDest->bmiHeader.biYPelsPerMeter = 0; lpDibDest->bmiHeader.biClrUsed = 0; lpDibDest->bmiHeader.biClrImportant = 0; - hBmpDest = CreateDIBSection(hdc, lpDibDest, DIB_RGB_COLORS, (PVOID*)&lpBmpDest, NULL, 0); + hBmpDest = CreateDIBSection(hdc, lpDibDest, DIB_RGB_COLORS, (PVOID *)&lpBmpDest, NULL, 0); hdcDibDest = CreateCompatibleDC(hdc); SelectObject(hdcDibDest, hBmpDest); memset(lpBmpDest, 0, 640 * 480 * sizeof(DWORD)); @@ -99,7 +98,7 @@ AGS::AGS(NACT* parent) : nact(parent) lpDibText->bmiHeader.biYPelsPerMeter = 0; lpDibText->bmiHeader.biClrUsed = 0; lpDibText->bmiHeader.biClrImportant = 0; - hBmpText = CreateDIBSection(hdc, lpDibText, DIB_RGB_COLORS, (PVOID*)&lpBmpText, NULL, 0); + hBmpText = CreateDIBSection(hdc, lpDibText, DIB_RGB_COLORS, (PVOID *)&lpBmpText, NULL, 0); hdcDibText = CreateCompatibleDC(hdc); SelectObject(hdcDibText, hBmpText); // memset(lpBmpText, 0, 64 * 64 * sizeof(DWORD)); @@ -118,7 +117,7 @@ AGS::AGS(NACT* parent) : nact(parent) lpDibMenu->bmiHeader.biYPelsPerMeter = 0; lpDibMenu->bmiHeader.biClrUsed = 0; lpDibMenu->bmiHeader.biClrImportant = 0; - hBmpMenu = CreateDIBSection(hdc, lpDibMenu, DIB_RGB_COLORS, (PVOID*)&lpBmpMenu, NULL, 0); + hBmpMenu = CreateDIBSection(hdc, lpDibMenu, DIB_RGB_COLORS, (PVOID *)&lpBmpMenu, NULL, 0); hdcDibMenu = CreateCompatibleDC(hdc); SelectObject(hdcDibMenu, hBmpMenu); // memset(lpBmpMenu, 0, 64 * 64 * sizeof(DWORD)); @@ -165,11 +164,9 @@ AGS::AGS(NACT* parent) : nact(parent) // GAIJI.DAT読み込み memset(gaiji, 0, sizeof(gaiji)); - FILEIO* fio = new FILEIO(); - _TCHAR file_path[_MAX_PATH]; - _stprintf_s(file_path, _MAX_PATH, _T("%sGAIJI.DAT"), g_root); + FILEIO *fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { + if(fio->Fopen("GAIJI.DAT", FILEIO_READ_BINARY)) { int d1, d2; while((d1 = fio->Fgetc()) != EOF) { d2 = fio->Fgetc(); @@ -199,7 +196,7 @@ AGS::AGS(NACT* parent) : nact(parent) // SYSTEM3 初期化 // ACG.DAT - _tcscpy_s(acg, 16, _T("ACG.DAT")); + strcpy_s(acg, 16, "ACG.DAT"); // パレット memset(program_palette, 0, sizeof(program_palette)); @@ -256,40 +253,59 @@ AGS::AGS(NACT* parent) : nact(parent) // Bコマンド for(int i = 0; i < 10; i++) { // ウィンドウの初期位置はシステムによって異なる -#if defined(_BUNKASAI) - SET_TEXT(i, 24, 304, 616, 384, false); - SET_MENU(i, 440, 18, 620, 178, true); -#elif defined(_CRESCENT) - SET_TEXT(i, 24, 288, 616, 378, false); - // 本来は横メニュー - SET_MENU(i, 464, 50, 623, 240, true); -#elif defined(_DPS) - SET_TEXT(i, 48, 288, 594, 393, false); - //SET_MENU(i, 48, 288, 584, 393, false); - SET_MENU(i, 48, 288, 594, 393, false); -#elif defined(_FUKEI) - SET_TEXT(i, 44, 282, 593, 396, false); - SET_MENU(i, 460, 14, 635, 214, false); -#elif defined(_INTRUDER) - SET_TEXT(i, 8, 280, 629, 393, false); - SET_MENU(i, 448, 136, 623, 340, true); -#elif defined(_TENGU) - SET_TEXT(i, 44, 282, 593, 396, false); - SET_MENU(i, 452, 14, 627, 214, false); -#elif defined(_VAMPIRE) - SET_TEXT(i, 8, 255, 615, 383, false); - SET_MENU(i, 448, 11, 615, 224, false); -#else - SET_TEXT(i, 8, 311, 623, 391, true); - SET_MENU(i, 464, 80, 623, 240, true); +#if defined(_SYSTEM1) + if(nact->crc32_a == CRC32_BUNKASAI) { + SET_TEXT(i, 24, 304, 616, 384, false); + SET_MENU(i, 440, 18, 620, 178, true); + } else if(nact->crc32_a == CRC32_CRESCENT) { + SET_TEXT(i, 24, 288, 616, 378, false); + // 本来は横メニュー + SET_MENU(i, 464, 50, 623, 240, true); + } else if(nact->crc32_a == CRC32_DPS || nact->crc32_a == CRC32_DPS_SG || nact->crc32_a == CRC32_DPS_SG2 || nact->crc32_a == 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); + } else if(nact->crc32_a == CRC32_FUKEI) { + SET_TEXT(i, 44, 282, 593, 396, false); + SET_MENU(i, 460, 14, 635, 214, false); + } else if(nact->crc32_a == CRC32_INTRUDER) { + SET_TEXT(i, 8, 280, 629, 393, false); + SET_MENU(i, 448, 136, 623, 340, true); + } else if(nact->crc32_a == CRC32_TENGU) { + SET_TEXT(i, 44, 282, 593, 396, false); + SET_MENU(i, 452, 14, 627, 214, false); + } else if(nact->crc32_a == CRC32_TOUSHIN_HINT) { + SET_TEXT(i, 8, 311, 623, 391, false); + SET_MENU(i, 452, 14, 627, 214, true); + } else if(nact->crc32_a == CRC32_VAMPIRE) { + SET_TEXT(i, 8, 255, 615, 383, false); + SET_MENU(i, 448, 11, 615, 224, false); + } else if(nact->crc32_a == CRC32_YAKATA) { + SET_TEXT(i, 48, 288, 594, 393, false); + SET_MENU(i, 452, 14, 627, 214, false); + } else +#elif defined(_SYSTEM2) + if(nact->crc32_a == CRC32_DALK_HINT) { + SET_TEXT(i, 24, 308, 376, 386, false); + SET_MENU(i, 404, 28, 604, 244, true); + } else if(nact->crc32_a == CRC32_RANCE3_HINT) { + SET_TEXT(i, 104, 304, 615, 383, false); + SET_MENU(i, 464, 24, 623, 200, true); + } else if(nact->crc32_a == CRC32_YAKATA2) { + SET_TEXT(i, 104, 304, 620, 382, false); + SET_MENU(i, 420, 28, 620, 244, true); + } else #endif + { + SET_TEXT(i, 8, 311, 623, 391, true); + SET_MENU(i, 464, 80, 623, 240, true); + } text_w[i].push = false; text_w[i].screen = NULL; text_w[i].window = NULL; menu_w[i].push = true; menu_w[i].screen = NULL; menu_w[i].window = NULL; - } // Eコマンド @@ -298,9 +314,9 @@ AGS::AGS(NACT* parent) : nact(parent) SET_BOX(i, 0, 0, 0, 639, 399); } #if defined(_SYSTEM2) - 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); @@ -470,7 +486,7 @@ void AGS::fade_out(int depth, bool white) fader = true; for(int y = 0; y < 480; y += 4) { - uint32* dest = &lpBmpDest[640 * (479 - y - fy) + fx]; + uint32 *dest = &lpBmpDest[640 * (479 - y - fy) + fx]; for(int x = 0; x < 640; x += 4) { dest[x] = white ? 0xffffff : 0; } @@ -488,8 +504,8 @@ void AGS::fade_in(int depth) fader = (depth == 15) ? false : true; for(int y = 0; y < 480; y += 4) { - uint32* src = &fader_screen[640 * (479 - y - fy) + fx]; - uint32* dest = &lpBmpDest[640 * (479 - y - fy) + fx]; + uint32 *src = &fader_screen[640 * (479 - y - fy) + fx]; + uint32 *dest = &lpBmpDest[640 * (479 - y - fy) + fx]; for(int x = 0; x < 640; x += 4) { dest[x] = src[x]; } @@ -503,8 +519,8 @@ void AGS::flush_screen(bool update) { if(update) { for(int y = 0; y < screen_height; y++) { - uint32* src = vram[0][y]; - uint32* dest = &lpBmpDest[640 * (479 - y)]; + uint32 *src = vram[0][y]; + uint32 *dest = &lpBmpDest[640 * (479 - y)]; for(int x = 0; x < 640; x++) { #if defined(_SYSTEM3) // あゆみちゃん物語 フルカラー実写版 @@ -523,8 +539,8 @@ void AGS::draw_screen(int sx, int sy, int width, int height) { if(fader) { for(int y = sy; y < (sy + height) && y < 480; y++) { - uint32* src = vram[0][y]; - uint32* dest = &fader_screen[640 * (479 - y)]; + uint32 *src = vram[0][y]; + uint32 *dest = &fader_screen[640 * (479 - y)]; for(int x = sx; x < (sx + width) && x < 640; x++) { uint32 a=src[x]; #if defined(_SYSTEM3) @@ -538,8 +554,8 @@ void AGS::draw_screen(int sx, int sy, int width, int height) } } else { for(int y = sy; y < (sy + height) && y < 480; y++) { - uint32* src = vram[0][y]; - uint32* dest = &lpBmpDest[640 * (479 - y)]; + uint32 *src = vram[0][y]; + uint32 *dest = &lpBmpDest[640 * (479 - y)]; for(int x = sx; x < (sx + width) && x < 640; x++) { uint32 a=src[x]; #if defined(_SYSTEM3) diff --git a/src/sys/ags.h b/src/sys/ags.h index bea8167..7124203 100644 --- a/src/sys/ags.h +++ b/src/sys/ags.h @@ -36,7 +36,7 @@ static inline uint32 SETPALETTE16(uint32 R, uint32 G, uint32 B) class AGS { protected: - NACT* nact; + NACT *nact; private: // GDI+ Gdiplus::GdiplusStartupInput gdiSI; @@ -83,30 +83,29 @@ private: // AGS #if defined(_SYSTEM1) - 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); -#else - void load_gl3(uint8* data, int page, int transparent); // あぶない天狗伝説 - void load_vsp(uint8* data, int page, int transparent); - void load_pms(uint8* data, int page, int transparent); + void load_gm3(uint8 *data, int page, int transparent); // Intruder -桜屋敷の探索- + void load_vsp2l(uint8 *data, int page, int transparent); // Little Vampire +#endif +#if defined(_SYSTEM1) || defined(_SYSTEM2) + void load_gl3(uint8 *data, int page, int transparent); +#endif +#if defined(_SYSTEM2) || defined(_SYSTEM3) + void load_pms(uint8 *data, int page, int transparent); #endif #if defined(_SYSTEM3) - void load_bmp(const _TCHAR *file_path); + void load_bmp(const char *file_name); // あゆみちゃん物語 フルカラー実写版 #endif + 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_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); void draw_screen(int sx, int sy, int width, int heignt); void invalidate_screen(int sx, int sy, int width, int height); - uint32* vram[3][480]; // 仮想VRAMへのポインタ + uint32 *vram[3][480]; // 仮想VRAMへのポインタ uint32 program_palette[256]; uint32 screen_palette[256]; @@ -116,7 +115,7 @@ private: uint32 fader_screen[640 * 480]; public: - AGS(NACT* parent); + AGS(NACT *parent); ~AGS(); void update_screen(HDC hdc, int sx, int sy, int width, int height); @@ -142,7 +141,9 @@ public: void box_fill(int dest, int sx, int sy, int ex, int ey, uint8 color); void box_line(int dest, int sx, int sy, int ex, int ey, uint8 color); - void draw_text(char string[]); + 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); @@ -159,7 +160,7 @@ public: void select_cursor(); // ACG.DAT - _TCHAR acg[16]; + char acg[16]; // 画面選択 int src_screen; @@ -200,13 +201,13 @@ public: int ey; bool frame; bool push; - uint32* screen; + uint32 *screen; int screen_x; int screen_y; int screen_width; int screen_height; uint32 screen_palette[256]; - uint32* window; + uint32 *window; int window_x; int window_y; int window_width; diff --git a/src/sys/ags_bmp.cpp b/src/sys/ags_bmp.cpp index 748da72..961e86d 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 _TCHAR *file_path) +void AGS::load_bmp(const char *file_name) { // ヘッダ取得 int sx = 0, sy = 0; @@ -21,7 +22,7 @@ void AGS::load_bmp(const _TCHAR *file_path) if(extract_cg) { // 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 bd4aef6..68b3fb9 100644 --- a/src/sys/ags_draw.cpp +++ b/src/sys/ags_draw.cpp @@ -8,60 +8,61 @@ #include "dri.h" #include "crc32.h" -extern _TCHAR g_root[_MAX_PATH]; - void AGS::load_cg(int page, int transparent) { #if defined(_SYSTEM3) // あゆみちゃん物語 フルカラー実写版 if(strncmp(acg, "CGA000.BMP", 10) == 0) { - char file_path[_MAX_PATH]; - _stprintf_s(file_path, _MAX_PATH, _T("%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]; - _stprintf_s(file_path, _MAX_PATH, _T("%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; } #endif - DRI* dri = new DRI(); + DRI *dri = new DRI(); int size; - uint8* data = dri->load(acg, page, &size); + uint8 *data = dri->load(acg, page, &size); if(data) { -#if defined(_SYSTEM1) -#if defined(_BUNKASAI) - load_vsp(data, page, transparent); -#elif defined(_INTRUDER) -// load_gm3(data, page, transparent); - load_vsp(data, page, transparent); // 暫定 -#elif defined(_VAMPIRE) - load_vsp2l(data, page, transparent); -#else - load_gl3(data, page, transparent); -#endif -#elif defined(_SYSTEM2) - if(nact->crc32 == 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) { - // Super D.P.S - load_pms(data, page, transparent); - } else { + #if defined(_SYSTEM1) + if(nact->crc32_a == CRC32_BUNKASAI) { + load_vsp(data, page, transparent); + } else if(nact->crc32_a == CRC32_INTRUDER) { +// load_gm3(data, page, transparent); + load_vsp(data, page, transparent); // 暫定 + } else if(nact->crc32_a == CRC32_VAMPIRE) { + load_vsp2l(data, page, transparent); + } else { + load_gl3(data, page, transparent); + } + #elif defined(_SYSTEM2) + if(nact->crc32_a == CRC32_AYUMI_PROTO) { + // あゆみちゃん物語 PROTO + load_gl3(data, page, transparent); + } 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 { + if(data[0x8] == 0) { + load_vsp(data, page, transparent); + } else { + load_pms(data, page, transparent); + } + } + #elif defined(_SYSTEM3) if(data[0x8] == 0) { load_vsp(data, page, transparent); } else { load_pms(data, page, transparent); } - } -#else - if(data[0x8] == 0) { - load_vsp(data, page, transparent); - } else { - load_pms(data, page, transparent); - } -#endif + #endif free(data); } delete dri; @@ -77,8 +78,8 @@ void AGS::copy(int sx, int sy, int ex, int ey, int dx, int dy) memcpy(tmp, lpBmpScreen[src_screen], sizeof(tmp)); for(int y = 0; y < height && y + sy < 480 && y + dy < 480; y++) { - uint32* src = &tmp[640 * (479 - (y + sy))]; - uint32* dest = vram[dest_screen][y + dy]; + uint32 *src = &tmp[640 * (479 - (y + sy))]; + uint32 *dest = vram[dest_screen][y + dy]; for(int x = 0; x < width && x + sx < 640 && x + dx < 640; x++) { dest[x + dx] = src[x + sx]; } diff --git a/src/sys/ags_gl3.cpp b/src/sys/ags_gl3.cpp index b3c80eb..90dce5f 100644 --- a/src/sys/ags_gl3.cpp +++ b/src/sys/ags_gl3.cpp @@ -6,7 +6,7 @@ #include "ags.h" -void AGS::load_gl3(uint8* data, int page, int transparent) +void AGS::load_gl3(uint8 *data, int page, int transparent) { // ヘッダ取得 uint16 tmp = (data[0x30] | (data[0x31] << 8)) - 0x8000; @@ -126,7 +126,7 @@ void AGS::load_gl3(uint8* data, int page, int transparent) c[6] = ((b0 >> 1) & 1) | ((b1 ) & 2) | ((b2 << 1) & 4) | ((b3 << 2) & 8); c[7] = ((b0 ) & 1) | ((b1 << 1) & 2) | ((b2 << 2) & 4) | ((b3 << 3) & 8); - uint32* dest = &vram[dest_screen][y + sy][(x + sx) * 8]; + uint32 *dest = &vram[dest_screen][y + sy][(x + sx) * 8]; if(transparent == -1) { for(int i = 0; i < 8; i++) { dest[i] = c[i] | base; diff --git a/src/sys/ags_gm3.cpp b/src/sys/ags_gm3.cpp index 9edfa7d..46a220a 100644 --- a/src/sys/ags_gm3.cpp +++ b/src/sys/ags_gm3.cpp @@ -6,7 +6,7 @@ #include "ags.h" -void AGS::load_gm3(uint8* data, int page, int transparent) +void AGS::load_gm3(uint8 *data, int page, int transparent) { // ヘッダ取得 uint16 tmp = (data[0x30] | (data[0x31] << 8)) - 0x8000; @@ -127,8 +127,8 @@ void AGS::load_gm3(uint8* data, int page, int transparent) c[6] = ((b0 >> 1) & 1) | ((b1 ) & 2) | ((b2 << 1) & 4); c[7] = ((b0 ) & 1) | ((b1 << 1) & 2) | ((b2 << 2) & 4); - uint32* dest0 = &vram[dest_screen][(y + sy) * 2 + 0][(x + sx) * 8]; - uint32* dest1 = &vram[dest_screen][(y + sy) * 2 + 1][(x + sx) * 8]; + uint32 *dest0 = &vram[dest_screen][(y + sy) * 2 + 0][(x + sx) * 8]; + uint32 *dest1 = &vram[dest_screen][(y + sy) * 2 + 1][(x + sx) * 8]; if(transparent == -1) { for(int i = 0; i < 8; i++) { dest0[i] = dest1[i] = c[i] | base; diff --git a/src/sys/ags_pms.cpp b/src/sys/ags_pms.cpp index a8bb1c6..593ef55 100644 --- a/src/sys/ags_pms.cpp +++ b/src/sys/ags_pms.cpp @@ -7,7 +7,7 @@ #include "ags.h" #include "crc32.h" -void AGS::load_pms(uint8* data, int page, int transparent) +void AGS::load_pms(uint8 *data, int page, int transparent) { // ヘッダ取得 int sx = data[0x0] | (data[0x1] << 8); @@ -41,7 +41,7 @@ void AGS::load_pms(uint8* data, int page, int transparent) } } #if defined(_SYSTEM3) - 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++) { @@ -50,7 +50,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++) { @@ -59,8 +59,9 @@ void AGS::load_pms(uint8* data, int page, int transparent) } } } - } else { + } else #endif + { for(int i = 0; i < 16; i++) { for(int j = 0; j < 16; j++) { if(!(mask & (0x01 << i))) { @@ -68,15 +69,13 @@ void AGS::load_pms(uint8* data, int page, int transparent) } } } -#if defined(_SYSTEM3) } -#endif } // パレット展開 #if defined(_SYSTEM3) - 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++) { @@ -85,7 +84,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++) { @@ -155,7 +154,7 @@ void AGS::load_pms(uint8* data, int page, int transparent) // VRAMに転送 if(extract_cg) { - uint32* dest = &vram[dest_screen][y + sy][sx]; + uint32 *dest = &vram[dest_screen][y + sy][sx]; if(transparent == -1) { for(int x = 0; x < width; x++) { cgdata[2][x] = cgdata[1][x]; diff --git a/src/sys/ags_text.cpp b/src/sys/ags_text.cpp index 33335cf..c3cc1cd 100644 --- a/src/sys/ags_text.cpp +++ b/src/sys/ags_text.cpp @@ -6,7 +6,7 @@ #include "ags.h" -void AGS::draw_text(char string[]) +void AGS::draw_text(const char *string) { // フォントサイズの変更後、一度だけ更新する if(draw_menu) { @@ -105,7 +105,7 @@ void AGS::draw_char(int dest, int dest_x, int dest_y, uint16 code, int size, uin length = 1; } memset(draw_menu ? lpBmpMenu : lpBmpText, 0, 64 * 64 * sizeof(DWORD)); - ExtTextOut(draw_menu ? hdcDibMenu : hdcDibText, 0, 0, NULL, NULL, string, length, NULL); + ExtTextOutA(draw_menu ? hdcDibMenu : hdcDibText, 0, 0, NULL, NULL, string, length, NULL); // パターン出力 for(int y = 0; y < size && y < 64 && dest_y + y < 480; y++) { diff --git a/src/sys/ags_vsp.cpp b/src/sys/ags_vsp.cpp index c58626f..7f6469d 100644 --- a/src/sys/ags_vsp.cpp +++ b/src/sys/ags_vsp.cpp @@ -7,7 +7,7 @@ #include "ags.h" #include "crc32.h" -void AGS::load_vsp(uint8* data, int page, int transparent) +void AGS::load_vsp(uint8 *data, int page, int transparent) { // ヘッダ取得 int sx = data[0] | (data[1] << 8); @@ -29,19 +29,18 @@ void AGS::load_vsp(uint8* data, int page, int transparent) // Zコマンドの処理 #if defined(_SYSTEM3) - 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 { + } else #endif + { if(palette_bank != -1) { base = (palette_bank & 0x0f) << 4; } -#if defined(_SYSTEM3) } -#endif // パレット取得 - if(get_palette) { + if(get_palette && transparent != 101) { int p = 0x0a; for(int i = 0; i < 16; i++) { uint32 b = data[p++] & 0xf; @@ -53,22 +52,21 @@ void AGS::load_vsp(uint8* data, int page, int transparent) // パレット展開 #if defined(_SYSTEM3) - 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]; } } - } else { + } else #endif + { if(extract_palette && extract_palette_cg[page]) { for(int i = 0; i < 16; i++) { screen_palette[base + i] = program_palette[base + i]; } } -#if defined(_SYSTEM3) } -#endif // VSP展開 uint8 cgdata[4][2][480], mask = 0; @@ -148,7 +146,7 @@ void AGS::load_vsp(uint8* data, int page, int transparent) c[6] = ((b0 >> 1) & 1) | ((b1 ) & 2) | ((b2 << 1) & 4) | ((b3 << 2) & 8); c[7] = ((b0 ) & 1) | ((b1 << 1) & 2) | ((b2 << 2) & 4) | ((b3 << 3) & 8); - uint32* dest = &vram[dest_screen][y + sy][(x + sx) * 8]; + uint32 *dest = &vram[dest_screen][y + sy][(x + sx) * 8]; if(transparent == -1) { for(int i = 0; i < 8; i++) { dest[i] = c[i] | base; diff --git a/src/sys/ags_vsp2l.cpp b/src/sys/ags_vsp2l.cpp index 59c1a19..b358863 100644 --- a/src/sys/ags_vsp2l.cpp +++ b/src/sys/ags_vsp2l.cpp @@ -6,7 +6,7 @@ #include "ags.h" -void AGS::load_vsp2l(uint8* data, int page, int transparent) +void AGS::load_vsp2l(uint8 *data, int page, int transparent) { // ヘッダ取得 int sx = data[0] | (data[1] << 8); @@ -118,8 +118,8 @@ void AGS::load_vsp2l(uint8* data, int page, int transparent) c[6] = ((b0 >> 1) & 1) | ((b1 ) & 2) | ((b2 << 1) & 4); c[7] = ((b0 ) & 1) | ((b1 << 1) & 2) | ((b2 << 2) & 4); - uint32* dest0 = &vram[dest_screen][(y + sy) * 2 + 0][(x + sx) * 8]; - uint32* dest1 = &vram[dest_screen][(y + sy) * 2 + 1][(x + sx) * 8]; + uint32 *dest0 = &vram[dest_screen][(y + sy) * 2 + 0][(x + sx) * 8]; + uint32 *dest1 = &vram[dest_screen][(y + sy) * 2 + 1][(x + sx) * 8]; if(transparent == -1) { for(int i = 0; i < 8; i++) { dest0[i] = dest1[i] = c[i] | base; diff --git a/src/sys/ags_window.cpp b/src/sys/ags_window.cpp index 7b96817..eb869d2 100644 --- a/src/sys/ags_window.cpp +++ b/src/sys/ags_window.cpp @@ -87,14 +87,14 @@ void AGS::open_text_window(int index, bool erase) free(text_w[index - 1].screen); } - text_w[index - 1].screen = (uint32*)malloc(width * height * sizeof(uint32)); + text_w[index - 1].screen = (uint32 *)malloc(width * height * sizeof(uint32)); text_w[index - 1].screen_x = sx; text_w[index - 1].screen_y = sy; text_w[index - 1].screen_width = width; text_w[index - 1].screen_height = height; for(int y = 0; y < height && y + sy < 480; y++) { - uint32* scr = fader ? &fader_screen[640 * (479 - y - sy) + sx] : &lpBmpDest[640 * (479 - y - sy) + sx]; + uint32 *scr = fader ? &fader_screen[640 * (479 - y - sy) + sx] : &lpBmpDest[640 * (479 - y - sy) + sx]; for(int x = 0; x < width && x + sx < 640; x++) { uint32 col = vram[0][y + sy][x + sx]; if(!(col & 0x80000000)) { @@ -149,14 +149,14 @@ void AGS::close_text_window(int index, bool update) free(text_w[index - 1].window); } - text_w[index - 1].window = (uint32*)malloc(width * height * sizeof(uint32)); + text_w[index - 1].window = (uint32 *)malloc(width * height * sizeof(uint32)); text_w[index - 1].window_x = sx; text_w[index - 1].window_y = sy; text_w[index - 1].window_width = width; text_w[index - 1].window_height = height; for(int y = 0; y < height && y + sy < 480; y++) { - uint32* scr = fader ? &fader_screen[640 * (479 - y - sy) + sx] : &lpBmpDest[640 * (479 - y - sy) + sx]; + uint32 *scr = fader ? &fader_screen[640 * (479 - y - sy) + sx] : &lpBmpDest[640 * (479 - y - sy) + sx]; for(int x = 0; x < width && x + sx < 640; x++) { uint32 col = vram[0][y + sy][x + sx]; if(!(col & 0x80000000)) { @@ -221,14 +221,14 @@ void AGS::open_menu_window(int index) free(menu_w[index - 1].screen); } - menu_w[index - 1].screen = (uint32*)malloc(wwidth * wheight * sizeof(uint32)); + menu_w[index - 1].screen = (uint32 *)malloc(wwidth * wheight * sizeof(uint32)); menu_w[index - 1].screen_x = wsx; menu_w[index - 1].screen_y = wsy; menu_w[index - 1].screen_width = wwidth; menu_w[index - 1].screen_height = wheight; for(int y = 0; y < wheight && y + wsy < 480; y++) { - uint32* scr = fader ? &fader_screen[640 * (479 - y - wsy) + wsx] : &lpBmpDest[640 * (479 - y - wsy) + wsx]; + uint32 *scr = fader ? &fader_screen[640 * (479 - y - wsy) + wsx] : &lpBmpDest[640 * (479 - y - wsy) + wsx]; for(int x = 0; x < wwidth && x + wsx < 640; x++) { uint32 col = vram[0][y + wsy][x + wsx]; if(!(col & 0x80000000)) { @@ -295,7 +295,7 @@ void AGS::draw_window(int sx, int sy, int ex, int ey, bool frame, uint8 frame_co { // 領域の塗り潰し for(int y = sy; y <= ey && y < 480; y++) { - uint32* dest = vram[0][y]; + uint32 *dest = vram[0][y]; for(int x = sx; x <= ex && x < 640; x++) { dest[x] = back_color; } diff --git a/src/sys/crc32.h b/src/sys/crc32.h index d56ab26..0a7d74f 100644 --- a/src/sys/crc32.h +++ b/src/sys/crc32.h @@ -10,16 +10,44 @@ // ADISK.DATの先頭256bytes #if defined(_SYSTEM1) +#define CRC32_BUNKASAI 0xc80f99b8 // あぶない文化祭前夜 +#define CRC32_CRESCENT 0x42351f2c // クレセントムーンがぁる +#define CRC32_DPS 0x69ea4865 // D.P.S. - Dream Program System +#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_TOUSHIN_HINT 0xac337537 // 闘神都市 ヒントディスク +#define CRC32_VAMPIRE 0x957bcfbf // Little Vampire +#define CRC32_YAKATA 0x8cef6fa6 // ALICEの館 + #elif defined(_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 -#else +#elif defined(_SYSTEM3) #define CRC32_AMBIVALENZ_FD 0xa6b48dfe // AmbivalenZ (FD) #define CRC32_AMBIVALENZ_CD 0x4b10db69 // AmbivalenZ (CD) @@ -38,7 +66,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 b94187b..d7048e5 100644 --- a/src/sys/dri.cpp +++ b/src/sys/dri.cpp @@ -15,20 +15,16 @@ #include "../res3/resource.h" #endif -extern _TCHAR g_root[_MAX_PATH]; - -uint8* DRI::load(_TCHAR path[], int page, int* size) +uint8 *DRI::load(const char *file_name, int page, int *size) { - _TCHAR base_path[_MAX_PATH], file_path[_MAX_PATH]; - _tcscpy_s(base_path, _MAX_PATH, path); + char tmp_name[_MAX_PATH]; + strcpy_s(tmp_name, _MAX_PATH, file_name); - FILEIO* fio = new FILEIO(); + FILEIO *fio = new FILEIO(); // ページの位置を取得 - base_path[0] = _T('A'); - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, base_path); - - if(!fio->Fopen(file_path, FILEIO_READ_BINARY)) { + tmp_name[0] = 'A'; + if(!fio->Fopen(tmp_name, FILEIO_READ_BINARY)) { delete fio; return NULL; } @@ -58,10 +54,9 @@ uint8* DRI::load(_TCHAR path[], int page, int* size) // A??.DAT以外にリンクされている場合はファイルを開き直す if(disk_index != 1) { - base_path[0] = _T('A') + disk_index - 1; - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, base_path); + tmp_name[0] = 'A' + disk_index - 1; fio->Fclose(); - if(!fio->Fopen(file_path, FILEIO_READ_BINARY)) { + if(!fio->Fopen(tmp_name, FILEIO_READ_BINARY)) { delete fio; return NULL; } @@ -74,79 +69,145 @@ uint8* DRI::load(_TCHAR 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(HINSTANCE hInst, uint32 crc32, int page, int* size) +uint8 *DRI::load_mda(HINSTANCE hInst, uint32 crc32_a, uint32 crc32_b, int page, int *size) { -#if defined(_SYSTEM1) - return NULL; -#elif defined(_SYSTEM2) - return NULL; -#else // データ取得 HGLOBAL hGlobal = NULL; - switch(crc32) { +#if defined(_SYSTEM1) + switch(crc32_a) { + case CRC32_BUNKASAI: // あぶない文化祭前夜 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_AB ), _T("mda"))); + break; + case CRC32_CRESCENT: // クレセントムーンがぁる + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_CRS), _T("mda"))); + break; + case CRC32_DPS: // D.P.S. - Dream Program System + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_DPS), _T("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 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_SG ), _T("mda"))); + break; + case CRC32_FUKEI: // 婦警さんVX + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_VX ), _T("mda"))); + break; + case CRC32_INTRUDER: // Intruder -桜屋敷の探索- + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_INT), _T("mda"))); + break; + case CRC32_TENGU: // あぶないてんぐ伝説 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_AT ), _T("mda"))); + break; + case CRC32_TOUSHIN_HINT: // 闘神都市 ヒントディスク + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_T1 ), _T("mda"))); + break; + case CRC32_VAMPIRE: // Little Vampire + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_LP2), _T("mda"))); + break; + case CRC32_YAKATA: // ALICEの館 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_AL1), _T("mda"))); + break; + } +#elif defined(_SYSTEM2) + switch(crc32_a) { + case CRC32_AYUMI_FD: // あゆみちゃん物語 (FD) + case CRC32_AYUMI_HINT: // あゆみちゃん物語 ヒントディスク + case CRC32_AYUMI_PROTO: // あゆみちゃん物語 PROTO + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_AYM), _T("mda"))); + break; + case CRC32_DALK_HINT: // DALK ヒントディスク + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_DLK), _T("mda"))); + break; + case CRC32_DRSTOP: // Dr. STOP! + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_DRS), _T("mda"))); + break; + case CRC32_PROSTUDENTG_FD: // Prostudent -G- (FD) + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_PSG), _T("mda"))); + break; + case CRC32_RANCE3_HINT: // Rance3 ヒントディスク + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_R3H), _T("mda"))); + break; + case CRC32_SDPS: // Super D.P.S + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_SDP), _T("mda"))); + break; + case CRC32_YAKATA2: // ALICEの館II + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_AL2), _T("mda"))); + break; + } +#elif defined(_SYSTEM3) + switch(crc32_a) { case CRC32_AMBIVALENZ_FD: // AmbivalenZ (FD) case CRC32_AMBIVALENZ_CD: // AmbivalenZ (CD) - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMB), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_AMB), _T("mda"))); break; case CRC32_DPSALL: // DPS全部 - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_ALL), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_ALL), _T("mda"))); break; case CRC32_FUNNYBEE_CD: // Funny Bee (CD) // case CRC32_FUNNYBEE_PATCH: // Funny Bee (CD + Patch) case CRC32_FUNNYBEE_FD: // Funny Bee (FD) - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BEE), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_BEE), _T("mda"))); break; case CRC32_ONLYYOU: // Only You case CRC32_ONLYYOU_DEMO: // Only You (DEMO) - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_OY), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_OY ), _T("mda"))); break; case CRC32_PROSTUDENTG_CD: // Prostudent -G- (CD) - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_PSG), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_PSG), _T("mda"))); break; case CRC32_RANCE41: // Rance 4.1 - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_R41), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_R41), _T("mda"))); break; case CRC32_RANCE42: // Rance 4.2 - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_R42), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_R42), _T("mda"))); break; case CRC32_AYUMI_CD: // あゆみちゃん物語 (CD) case CRC32_AYUMI_JISSHA_256: // あゆみちゃん物語 実写版 case CRC32_AYUMI_JISSHA_FULL: // あゆみちゃん物語 フルカラー実写版 - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AYM), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_AYM), _T("mda"))); break; case CRC32_YAKATA3_CD: // アリスの館3 (CD) case CRC32_YAKATA3_FD: // アリスの館3 (FD) - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AL3), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_AL3), _T("mda"))); break; case CRC32_HASHIRIONNA2: // 走り女2 (Rance 4.x ヒントディスク) - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_RG2), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_RG2), _T("mda"))); + break; + case CRC32_TOUSHIN2_GD: // 闘神都市2 グラフィックディスク + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_T2 ), _T("mda"))); break; case CRC32_OTOMESENKI: // 乙女戦記 - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_OTM), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_OTM), _T("mda"))); break; case CRC32_MUGENHOUYOU: // 夢幻泡影 - hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_MGN), _T("mda"))); + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_AMUS_MGN), _T("mda"))); break; } +#endif if(hGlobal == NULL) { return NULL; } - uint8* data = (uint8*)LockResource(hGlobal); + uint8 *data = (uint8 *)LockResource(hGlobal); // ページの位置を取得 int link_sector = data[0] | (data[1] << 8); @@ -165,16 +226,98 @@ uint8* DRI::load_mda(HINSTANCE hInst, uint32 crc32, int page, int* size) return NULL; } + // AMUS.MDA以外にリンクされている場合はリソースを開き直す +#if defined(_SYSTEM1) + if(disk_index == 2) { + switch(crc32_b) { + case CRC32_DPS_SG_FAHREN: // D.P.S. SG - Fahren Fliegen + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_FAH), _T("mda"))); + break; + case CRC32_DPS_SG_KATEI: // D.P.S. SG - 家庭教師はステキなお仕事 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_KAT), _T("mda"))); + break; + case CRC32_DPS_SG_NOBUNAGA: // D.P.S. SG - 信長の淫謀 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_NOB), _T("mda"))); + break; + case CRC32_DPS_SG2_ANTIQUE: // D.P.S. SG set2 - ANTIQUE HOUSE + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_ANT), _T("mda"))); + break; + case CRC32_DPS_SG2_IKENAI: // D.P.S. SG set2 - いけない内科検診再び + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_NAI), _T("mda"))); + break; + case CRC32_DPS_SG2_AKAI: // D.P.S. SG set2 - 朱い夜 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_AKA), _T("mda"))); + break; + case CRC32_DPS_SG3_RABBIT: // D.P.S. SG set3 - Rabbit P4P + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_RAB), _T("mda"))); + break; + case CRC32_DPS_SG3_SHINKON: // D.P.S. SG set3 - しんこんさんものがたり + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_SIN), _T("mda"))); + break; + case CRC32_DPS_SG3_SOTSUGYOU: // D.P.S. SG set3 - 卒業 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_SOT), _T("mda"))); + break; + default: + hGlobal = NULL; + break; + } + if(hGlobal == NULL) { + return NULL; + } + data = (uint8 *)LockResource(hGlobal); + } else if(disk_index == 3) { + switch(crc32_a) { + case CRC32_TOUSHIN_HINT: // 闘神都市 ヒントディスク + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_CMUS_T1 ), _T("mda"))); + break; + default: + hGlobal = NULL; + break; + } + if(hGlobal == NULL) { + return NULL; + } + data = (uint8 *)LockResource(hGlobal); + } else +#elif defined(_SYSTEM2) + if(disk_index == 2) { + switch(crc32_b) { + case CRC32_SDPS_MARIA: // Super D.P.S - マリアとカンパン + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_MTK), _T("mda"))); + break; + case CRC32_SDPS_TONO: // Super D.P.S - 遠野の森 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_TNM), _T("mda"))); + break; + case CRC32_SDPS_KAIZOKU: // Super D.P.S - うれしたのし海賊稼業 + hGlobal = LoadResource(hInst, FindResource(hInst, MAKEINTRESOURCE(IDR_BMUS_KAM), _T("mda"))); + break; + default: + hGlobal = NULL; + break; + } + if(hGlobal == NULL) { + return NULL; + } + data = (uint8 *)LockResource(hGlobal); + } else +#endif + // AMUS.MDA以外にリンクされている場合は失敗 + if(disk_index != 1) { + return NULL; + } + // データ取得 int start_sector = data[link_index * 2 + 0] | (data[link_index * 2 + 1] << 8); int end_sector = data[link_index * 2 + 2] | (data[link_index * 2 + 3] << 8); - int buffer_size = (end_sector - start_sector) * 256; - uint8* buffer = (uint8*)malloc(buffer_size); - memcpy(buffer, &data[(start_sector - 1) * 256], buffer_size); + if((*size = (end_sector - start_sector) * 256) == 0) { + // サイズ不正 + return NULL; + } + + uint8 *buffer = (uint8 *)malloc(*size); + memcpy(buffer, &data[(start_sector - 1) * 256], *size); - *size = buffer_size; return buffer; -#endif } diff --git a/src/sys/dri.h b/src/sys/dri.h index c7dd319..1e0707d 100644 --- a/src/sys/dri.h +++ b/src/sys/dri.h @@ -17,8 +17,8 @@ public: DRI() {} ~DRI() {} - uint8* load(_TCHAR path[], int page, int* size); - uint8* load_mda(HINSTANCE hInst, uint32 crc32, int page, int* size); + uint8 *load(const char *file_name, int page, int *size); + uint8 *load_mda(HINSTANCE hInst, uint32 crc32_a, uint32 crc32_b, int page, int *size); }; #endif diff --git a/src/sys/mako.cpp b/src/sys/mako.cpp index c97e36a..319923c 100644 --- a/src/sys/mako.cpp +++ b/src/sys/mako.cpp @@ -9,11 +9,11 @@ extern HWND g_hwnd; -MAKO::MAKO(NACT* parent) : nact(parent) +MAKO::MAKO(NACT *parent) : nact(parent) { // AMUS.DAT, AMSE.DAT - _tcscpy_s(amus, 16, _T("AMUS.DAT")); - _tcscpy_s(amse, 16, _T("AMSE.DAT")); // 実際には使わない + strcpy_s(amus, 16, "AMUS.DAT"); + strcpy_s(amse, 16, "AMSE.DAT"); // 実際には使わない // 再生状況 current_music = current_mark = current_loop = 0; @@ -147,7 +147,7 @@ bool MAKO::check_music() return current_music ? true : false; } -void MAKO::get_mark(int* mark, int* loop) +void MAKO::get_mark(int *mark, int *loop) { *mark = cdda_play ? 0 : current_mark; *loop = cdda_play ? 0 : current_loop; @@ -184,21 +184,21 @@ void MAKO::play_pcm(int page, bool loop) // 現在再生中のPCMを停止 PlaySound(NULL, NULL, SND_PURGE); - uint8* buffer = NULL; + uint8 *buffer = NULL; int size; - DRI* dri = new DRI(); + DRI *dri = new DRI(); - if((buffer = dri->load(_T("AWAV.DAT"), page, &size)) != NULL) { + if((buffer = dri->load("AWAV.DAT", page, &size)) != NULL) { // WAV形式 (Only You) memcpy(wav, buffer, (size < MAX_SAMPLES) ? size : MAX_SAMPLES); if(loop) { - PlaySound(wav, NULL, SND_ASYNC | SND_MEMORY | SND_LOOP); + PlaySoundA(wav, NULL, SND_ASYNC | SND_MEMORY | SND_LOOP); } else { - PlaySound(wav, NULL, SND_ASYNC | SND_MEMORY); + PlaySoundA(wav, NULL, SND_ASYNC | SND_MEMORY); } free(buffer); - } else if((buffer = dri->load(_T("AMSE.DAT"), page, &size)) != NULL) { + } else if((buffer = dri->load("AMSE.DAT", page, &size)) != NULL) { // AMSE形式 (乙女戦記) int total = (size - 12) * 2 + 0x24; int samples = (size - 12) * 2; @@ -218,9 +218,9 @@ void MAKO::play_pcm(int page, bool loop) } if(loop) { - PlaySound(wav, NULL, SND_ASYNC | SND_MEMORY | SND_LOOP); + PlaySoundA(wav, NULL, SND_ASYNC | SND_MEMORY | SND_LOOP); } else { - PlaySound(wav, NULL, SND_ASYNC | SND_MEMORY); + PlaySoundA(wav, NULL, SND_ASYNC | SND_MEMORY); } free(buffer); } @@ -230,7 +230,7 @@ void MAKO::play_pcm(int page, bool loop) void MAKO::stop_pcm() { #if defined(_USE_PCM) - PlaySound(NULL, NULL, SND_PURGE); + PlaySoundA(NULL, NULL, SND_PURGE); #endif } @@ -243,7 +243,7 @@ bool MAKO::check_pcm() 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x40, 0x1f, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 'd' , 'a' , 't' , 'a' , 0x01, 0x00, 0x00, 0x00, 0x00 }; - return PlaySound(null_wav, NULL, SND_ASYNC | SND_MEMORY | SND_NOSTOP) ? false : true; + return PlaySoundA(null_wav, NULL, SND_ASYNC | SND_MEMORY | SND_NOSTOP) ? false : true; #else return false; #endif diff --git a/src/sys/mako.h b/src/sys/mako.h index ade93ee..074a1bb 100644 --- a/src/sys/mako.h +++ b/src/sys/mako.h @@ -26,7 +26,7 @@ class MAKO { protected: - NACT* nact; + NACT *nact; private: // FM, CD-DA @@ -40,7 +40,7 @@ private: // MIDI再生スレッド typedef struct { - MAKO* mako; + MAKO *mako; int current_music; int next_music; bool request_fill; @@ -103,13 +103,13 @@ private: DWORD prev_time; public: - MAKO(NACT* parent); + MAKO(NACT *parent); ~MAKO(); void play_music(int page); void stop_music(); bool check_music(); - void get_mark(int* mark, int* loop); + void get_mark(int *mark, int *loop); void notify_mci(int status); void play_pcm(int page, bool loop); @@ -126,8 +126,8 @@ public: void load_mda(int page); // AMUS.DAT, AMSE.DAT - _TCHAR amus[16]; - _TCHAR amse[16]; + char amus[16]; + char amse[16]; int current_music; int next_loop; // Y19 diff --git a/src/sys/mako_midi.cpp b/src/sys/mako_midi.cpp index 170a521..d9b40b6 100644 --- a/src/sys/mako_midi.cpp +++ b/src/sys/mako_midi.cpp @@ -6,6 +6,7 @@ #include "mako.h" #include "dri.h" +#include "crc32.h" extern HINSTANCE g_hinst; extern HWND g_hwnd; @@ -228,13 +229,12 @@ void MAKO::play_midi() } else if(d0 == 0xeb) { play[i].pan = next_mml(i); send_3bytes(0xb0 + play[i].channel, 0x0a, play[i].pan); - } -#if !defined(_DPS) - else if(d0 == 0xec) { - mute_flag = true; - } + } else if(d0 == 0xec) { +#if defined(_SYSTEM1) + if(!(nact->crc32_a == CRC32_DPS || nact->crc32_a == CRC32_DPS_SG || nact->crc32_a == CRC32_DPS_SG2 || nact->crc32_a == CRC32_DPS_SG3)) #endif - else if(d0 == 0xf5) { + mute_flag = true; + } else if(d0 == 0xf5) { int n = next_mml(i); if(n != play[i].timbre) { if(mda[n].bank_select < 128) { @@ -291,9 +291,9 @@ void MAKO::play_midi() bool MAKO::load_mml(int page) { // データ読み込み - DRI* dri = new DRI(); + DRI *dri = new DRI(); int size; - uint8* data = dri->load(amus, page, &size); + uint8 *data = dri->load(amus, page, &size); if(data == NULL) { delete dri; return false; @@ -478,18 +478,18 @@ void MAKO::load_mda(int page) tempo_dif = 0x40; // MDAデータの読み込み - _TCHAR path[16]; - _tcscpy_s(path, 16, amus); - int p = _tcslen(path); - path[p - 3] = _T('M'); - path[p - 2] = _T('D'); - path[p - 1] = _T('A'); + char path[16]; + strcpy_s(path, 16, amus); + int p = strlen(path); + path[p - 3] = 'M'; + path[p - 2] = 'D'; + path[p - 1] = 'A'; - DRI* dri = new DRI(); + DRI *dri = new DRI(); int size; - uint8* data = NULL; + uint8 *data = NULL; if((data = dri->load(path, page, &size)) == NULL) { - data = dri->load_mda(g_hinst, nact->crc32, page, &size); + data = dri->load_mda(g_hinst, nact->crc32_a, nact->crc32_b, page, &size); } if(data) { @@ -500,7 +500,7 @@ void MAKO::load_mda(int page) // SSGパートの音色設定 for(int i = 0; i < 3; i++) { - uint8* buf = &data[map_wide * i + 27]; + uint8 *buf = &data[map_wide * i + 27]; mda[i + 256].bank_select = buf[0]; mda[i + 256].program_change = buf[1]; mda[i + 256].level = buf[2]; @@ -512,7 +512,7 @@ void MAKO::load_mda(int page) // 通常の音色設定 for(int i = 0; i < inst_num; i++) { - uint8* buf = &data[27 + map_wide * 3 + (map_wide + 1) * i]; + uint8 *buf = &data[27 + map_wide * 3 + (map_wide + 1) * i]; int n = buf[0]; mda[n].bank_select = buf[1]; mda[n].program_change = buf[2]; @@ -525,7 +525,7 @@ void MAKO::load_mda(int page) // ドラムパートの音色設定 if(drum_format) { - uint8* buf = &data[27 + map_wide * 3 + (map_wide + 1) * inst_num]; + uint8 *buf = &data[27 + map_wide * 3 + (map_wide + 1) * inst_num]; int drum_num = buf[0]; for(int i = 0; i < drum_num; i++) { int d = buf[i * 3 + 1]; diff --git a/src/sys/nact.cpp b/src/sys/nact.cpp index a8022e5..dfd77e4 100644 --- a/src/sys/nact.cpp +++ b/src/sys/nact.cpp @@ -4,23 +4,22 @@ [ NACT ] */ -#if defined(_SYSTEM1) -#include "../res1/resource.h" -#elif defined(_SYSTEM2) -#include "../res2/resource.h" -#else -#include "../res3/resource.h" -#endif - #include #include #include "nact.h" #include "ags.h" #include "mako.h" #include "dri.h" +#include "crc32.h" #include "../fileio.h" +#if defined(_SYSTEM1) +#include "../res1/resource.h" +#elif defined(_SYSTEM2) +#include "../res2/resource.h" +#elif defined(_SYSTEM3) +#include "../res3/resource.h" +#endif -extern _TCHAR g_root[_MAX_PATH]; extern HWND g_hwnd; // 初期化 @@ -34,28 +33,26 @@ NACT::NACT() initialize_console(); // SYSTEM3 初期化 - - crc32 = calc_crc32(); + crc32_a = calc_crc32("ADISK.DAT"); + crc32_b = calc_crc32("BDISK.DAT"); fatal_error = post_quit = false; // AG00.DAT読み込み - FILEIO* fio = new FILEIO(); - _TCHAR file_path[_MAX_PATH]; - _stprintf_s(file_path, _MAX_PATH, _T("%sAG00.DAT"), g_root); + FILEIO *fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { + 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(); @@ -64,9 +61,9 @@ NACT::NACT() // ADISK.DAT #if defined(_PROG_OMAKE) - _tcscpy_s(adisk, 16, _T("AGAME.DAT")); + strcpy_s(adisk, 16, "AGAME.DAT"); #else - _tcscpy_s(adisk, 16, _T("ADISK.DAT")); + strcpy_s(adisk, 16, "ADISK.DAT"); #endif // シナリオ管理 @@ -104,18 +101,20 @@ NACT::NACT() pcm_index = 0; memset(pcm, 0, sizeof(pcm)); +#if defined(_SYSTEM1) // SYETEM1 初期化 -#if defined(_DPS) - text_refresh = false; - _tcscpy_s(tvar[0], 22, _T("カスタム")); - _tcscpy_s(tvar[1], 22, _T("リーナス")); - _tcscpy_s(tvar[2], 22, _T("かつみ")); - _tcscpy_s(tvar[3], 22, _T("由美子")); - _tcscpy_s(tvar[4], 22, _T("いつみ")); - _tcscpy_s(tvar[5], 22, _T("ひとみ")); - _tcscpy_s(tvar[6], 22, _T("真理子")); -#elif defined(_INTRUDER) - paint_x = paint_y = map_page = 0; + if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) { + text_refresh = false; + sprintf_s(tvar[0], 22, "カスタム"); + sprintf_s(tvar[1], 22, "リーナス"); + sprintf_s(tvar[2], 22, "かつみ"); + sprintf_s(tvar[3], 22, "由美子"); + sprintf_s(tvar[4], 22, "いつみ"); + sprintf_s(tvar[5], 22, "ひとみ"); + sprintf_s(tvar[6], 22, "真理子"); + } else if(crc32_a == CRC32_INTRUDER) { + paint_x = paint_y = map_page = 0; + } #endif // 各種クラス生成 @@ -204,6 +203,7 @@ void NACT::execute() #endif // 1コマンド実行 + prev_addr = scenario_addr; uint8 cmd = getd(); if(set_palette && cmd != 'P') { @@ -329,16 +329,18 @@ void NACT::execute() 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 defined(_DPS) - if(!ags->draw_menu) { - text_refresh = false; + +#if defined(_SYSTEM1) + 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; + } } #endif - if(!ags->draw_menu && text_wait_enb && cmd != 0x20) { DWORD dwTime = timeGetTime() + text_wait_time; for(;;) { @@ -355,10 +357,13 @@ void NACT::execute() Sleep(10); } } - -#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]; @@ -366,12 +371,14 @@ void NACT::execute() string[1] = getd(); string[2] = '\0'; ags->draw_text(string); -#if defined(_DPS) - if(!ags->draw_menu) { - text_refresh = false; + +#if defined(_SYSTEM1) + 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; + } } #endif - if(!ags->draw_menu && text_wait_enb) { DWORD dwTime = timeGetTime() + text_wait_time; for(;;) { @@ -388,19 +395,14 @@ void NACT::execute() Sleep(10); } } - -#if defined(_DEBUG_CONSOLE) output_console(string); -#endif } else { + if(cmd >= 0x20 && cmd < 0x7f) { + output_console("\nUnknown Command: '%c' at page = %d, addr = %d\n", cmd, scenario_page, prev_addr); + } else { + output_console("\nUnknown Command: %02x at page = %d, addr = %d\n", cmd, scenario_page, prev_addr); + } fatal_error = true; - -#if defined(_DEBUG_CONSOLE) - char log[128]; - memset(log, 0, sizeof(log)); - sprintf_s(log, 128, "\nFAILED: %2x, %d", cmd, scenario_addr); - output_console(log); -#endif } break; } @@ -411,7 +413,7 @@ void NACT::load_scenario(int page) if(scenario_data) { free(scenario_data); } - DRI* dri = new DRI(); + DRI *dri = new DRI(); if((scenario_data = dri->load(adisk, page + 1, &scenario_size)) == NULL) { fatal_error = true; } @@ -422,13 +424,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() +{ + // 連打による誤クリック防止 + DWORD dwTime = timeGetTime(); + DWORD dwWait = dwTime + 400; + + while(dwTime < dwWait) { + if(params.terminate) { + return; + } +/* + if(get_key() == 16) { + break; + } +*/ + Sleep(10); + dwTime = timeGetTime(); + } + + // クリック中の間は待機 + for(;;) { + if(params.terminate) { + return; + } + if(!get_key()) { + break; + } + Sleep(10); + } +} + // WinMainとのインターフェース int NACT::get_screen_height() @@ -490,11 +523,11 @@ void NACT::initialize_console() AllocConsole(); hConsole = GetStdHandle(STD_OUTPUT_HANDLE); #if defined(_SYSTEM1) - SetConsoleTitle("SYSTEM1 NACT Tracer"); + SetConsoleTitle(_T("SYSTEM1 NACT Tracer")); #elif defined(_SYSTEM2) - SetConsoleTitle("SYSTEM2 NACT Tracer"); -#else - SetConsoleTitle("SYSTEM3 NACT Tracer"); + SetConsoleTitle(_T("SYSTEM2 NACT Tracer")); +#elif defined(_SYSTEM3) + SetConsoleTitle(_T("SYSTEM3 NACT Tracer")); #endif #endif } @@ -506,17 +539,24 @@ void NACT::release_console() #endif } -void NACT::output_console(char log[]) +void NACT::output_console(const char *format, ...) { #if defined(_DEBUG_CONSOLE) + va_list ap; + char buffer[1024]; + + va_start(ap, format); + vsprintf_s(buffer, sizeof(buffer), format, ap); + va_end(ap); + DWORD dwWritten; - WriteConsole(hConsole, log, strlen(log), &dwWritten, NULL); + WriteConsoleA(hConsole, buffer, strlen(buffer), &dwWritten, NULL); #endif } BOOL CALLBACK NACT::TextDialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) { - static NACT* nact; + static NACT *nact; char string[64]; int pnt, cnt; @@ -529,8 +569,8 @@ BOOL CALLBACK NACT::TextDialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lP nact = (NACT *)lParam; // init dialog sprintf_s(string, 64, "文字列を入力してください(最大%d文字)", nact->tvar_maxlen); - Edit_SetText(GetDlgItem(hDlg, IDC_TEXT), string); - Edit_SetText(GetDlgItem(hDlg, IDC_EDITBOX), nact->tvar[nact->tvar_index - 1]); + SetWindowTextA(GetDlgItem(hDlg, IDC_TEXT), string); + SetWindowTextA(GetDlgItem(hDlg, IDC_EDITBOX), nact->tvar[nact->tvar_index - 1]); if(nact->tvar[nact->tvar_index - 1][0] == '\0') { EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); } else { @@ -541,7 +581,7 @@ BOOL CALLBACK NACT::TextDialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lP case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_EDITBOX: - GetDlgItemText(hDlg, IDC_EDITBOX, string, 32); + GetDlgItemTextA(hDlg, IDC_EDITBOX, string, 32); pnt = cnt = 0; while(string[pnt] != '\0') { unsigned char dat = string[pnt]; @@ -558,7 +598,7 @@ BOOL CALLBACK NACT::TextDialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lP } break; case IDOK: - GetDlgItemText(hDlg, IDC_EDITBOX, string, 32); + GetDlgItemTextA(hDlg, IDC_EDITBOX, string, 32); strcpy_s(nact->tvar[nact->tvar_index - 1], 22, string); EndDialog(hDlg, IDOK); break; diff --git a/src/sys/nact.h b/src/sys/nact.h index c2be2c5..2cc382a 100644 --- a/src/sys/nact.h +++ b/src/sys/nact.h @@ -90,8 +90,8 @@ class MAKO; class NACT { protected: - AGS* ags; - MAKO* mako; + AGS *ags; + MAKO *mako; private: // コマンドパーサ @@ -102,14 +102,14 @@ private: bool post_quit; // ADISK.DAT, ASLEEP.DAT - _TCHAR adisk[16]; + char adisk[16]; // シナリオデータ - uint8* scenario_data; + uint8 *scenario_data; int scenario_size; // アドレス、ページ管理 - int scenario_addr; + int scenario_addr, prev_addr; int scenario_page; int label_depth; int label_stack[MAX_STACK]; @@ -169,13 +169,12 @@ private: #if defined(_SYSTEM1) void opening(); -#if defined(_DPS) + // D.P.S. - Dream Program System bool text_refresh; -#elif defined(_INTRUDER) + // Intruder -桜屋敷の探索- int paint_x; // Intruder Zコマンド int paint_y; int map_page; -#endif #endif bool column; // 座標モード @@ -211,8 +210,10 @@ private: uint16 random(uint16 range); uint32 seed; + void wait_after_open_menu(); + uint8 get_key(); - void get_cursor(int* x, int* y); + void get_cursor(int *x, int *y); void set_cursor(int x, int y); int joy_num; @@ -220,14 +221,14 @@ private: uint8 key[256]; int mouse_x, mouse_y; - uint32 calc_crc32(); + uint32 calc_crc32(const char *file_name); // Y27 ダイアログ static BOOL CALLBACK TextDialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam); // メインスレッド typedef struct { - NACT* nact; + NACT *nact; bool terminate; } PARAMS, *PPARAMS; PARAMS params; @@ -253,18 +254,19 @@ public: void select_cursor(); void select_sound(int dev); - bool get_title(_TCHAR title[], int length); + bool get_title(_TCHAR *title, int length); bool text_skip_enb; // メッセージスキップ bool text_wait_enb; // テキスト表示のウェイト有効/無効 - 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, ...); }; #endif diff --git a/src/sys/nact_crc32.cpp b/src/sys/nact_crc32.cpp index f446879..fafa6b0 100644 --- a/src/sys/nact_crc32.cpp +++ b/src/sys/nact_crc32.cpp @@ -8,17 +8,12 @@ #include "crc32.h" #include "../fileio.h" -extern _TCHAR g_root[_MAX_PATH]; - -uint32 NACT::calc_crc32() +uint32 NACT::calc_crc32(const char *file_name) { uint32 crc = 0; - FILEIO* fio = new FILEIO(); + FILEIO *fio = new FILEIO(); - _TCHAR file_path[_MAX_PATH]; - _stprintf_s(file_path, _MAX_PATH, _T("%sADISK.DAT"), g_root); - - if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { + if(fio->Fopen(file_name, FILEIO_READ_BINARY)) { uint32 table[256]; for(int i = 0; i < 256; i++) { uint32 c = i; @@ -40,93 +35,123 @@ uint32 NACT::calc_crc32() } fio->Fclose(); } -#if defined(_SYSTEM2) - if(crc == CRC32_SDPS) { - // Super D.P.Sの場合はBDISK.DATのCRCを取る - _stprintf_s(file_path, _MAX_PATH, _T("%sBDISK.DAT"), g_root); - - if(fio->Fopen(file_path, 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(); - } - } -#endif delete fio; -#if 0 -FILE* fp = fopen("crc32.txt", "w"); -fprintf(fp, "%x\n", crc); -fclose(fp); -#endif return crc; } -bool NACT::get_title(_TCHAR title[], int length) +bool NACT::get_title(_TCHAR *title, int length) { #if defined(_SYSTEM1) - -#if defined(_CRESCENT) - _tcscpy_s(title, length, _T("クレセントムーンがぁる")); - return true; -#elif defined(_DPS) - _tcscpy_s(title, length, _T("D.P.S - Dream Program System")); - return true; -#elif defined(_FUKEI) - _tcscpy_s(title, length, _T("婦警さんVX")); - return true; -#elif defined(_INTRUDER) - _tcscpy_s(title, length, _T("Intruder -桜屋敷の探索-")); - return true; -#elif defined(_TENGU) - _tcscpy_s(title, length, _T("あぶないてんぐ伝説")); - return true; -#elif defined(_VAMPIRE) - _tcscpy_s(title, length, _T("Little Vampire")); - return true; -#else - title[0] = _T('\0'); - return false; -#endif - + switch(crc32_a) { + case CRC32_BUNKASAI: + _tcscpy_s(title, length, _T("あぶない文化祭前夜")); + return true; + case CRC32_CRESCENT: + _tcscpy_s(title, length, _T("クレセントムーンがぁる")); + return true; + case CRC32_DPS: + _tcscpy_s(title, length, _T("D.P.S - Dream Program System")); + return true; + case CRC32_DPS_SG: +// case CRC32_DPS_SG2: + switch(crc32_b) { + case CRC32_DPS_SG_FAHREN: + _tcscpy_s(title, length, _T("D.P.S SG - Fahren Fliegen")); + return true; + case CRC32_DPS_SG_KATEI: + _tcscpy_s(title, length, _T("D.P.S SG - 家庭教師はステキなお仕事")); + return true; + case CRC32_DPS_SG_NOBUNAGA: + _tcscpy_s(title, length, _T("D.P.S SG - 信長の淫謀")); + return true; + case CRC32_DPS_SG2_ANTIQUE: + _tcscpy_s(title, length, _T("D.P.S SG set2 - ANTIQUE HOUSE")); + return true; + case CRC32_DPS_SG2_IKENAI: + _tcscpy_s(title, length, _T("D.P.S SG set2 - いけない内科検診再び")); + return true; + case CRC32_DPS_SG2_AKAI: + _tcscpy_s(title, length, _T("D.P.S SG set2 - 朱い夜")); + return true; + } + _tcscpy_s(title, length, _T("D.P.S SG")); + return true; + case CRC32_DPS_SG3: + switch(crc32_b) { + case CRC32_DPS_SG3_RABBIT: + _tcscpy_s(title, length, _T("D.P.S SG set3 - Rabbit P4P")); + return true; + case CRC32_DPS_SG3_SHINKON: + _tcscpy_s(title, length, _T("D.P.S SG set3 - しんこんさんものがたり")); + return true; + case CRC32_DPS_SG3_SOTSUGYOU: + _tcscpy_s(title, length, _T("D.P.S SG set3 - 卒業")); + return true; + } + _tcscpy_s(title, length, _T("D.P.S SG set3")); + return true; + case CRC32_FUKEI: + _tcscpy_s(title, length, _T("婦警さんVX")); + return true; + case CRC32_INTRUDER: + _tcscpy_s(title, length, _T("Intruder -桜屋敷の探索-")); + return true; + case CRC32_TENGU: + _tcscpy_s(title, length, _T("あぶないてんぐ伝説")); + return true; + case CRC32_TOUSHIN_HINT: + _tcscpy_s(title, length, _T("闘神都市 ヒントディスク")); + return true; + case CRC32_VAMPIRE: + _tcscpy_s(title, length, _T("Little Vampire")); + return true; + case CRC32_YAKATA: + _tcscpy_s(title, length, _T("ALICEの館")); + return true; + } #elif defined(_SYSTEM2) - - switch(crc32) { + switch(crc32_a) { + case CRC32_AYUMI_FD: + _tcscpy_s(title, length, _T("あゆみちゃん物語")); + return true; + case CRC32_AYUMI_HINT: + _tcscpy_s(title, length, _T("あゆみちゃん物語 ヒントディスク")); + return true; case CRC32_AYUMI_PROTO: _tcscpy_s(title, length, _T("あゆみちゃん物語 PROTO")); return true; - case CRC32_SDPS_MARIA: - case CRC32_SDPS_TONO: - case CRC32_SDPS_KAIZOKU: - _tcscpy_s(title, length, _T("Super D.P.S")); + case CRC32_DALK_HINT: + _tcscpy_s(title, length, _T("DALK ヒントディスク")); + return true; + case CRC32_DRSTOP: + _tcscpy_s(title, length, _T("Dr. STOP!")); return true; case CRC32_PROSTUDENTG_FD: _tcscpy_s(title, length, _T("prostudent G")); return true; + case CRC32_RANCE3_HINT: + _tcscpy_s(title, length, _T("Rance3 ヒントディスク")); + return true; + case CRC32_SDPS: + switch(crc32_b) { + case CRC32_SDPS_MARIA: + _tcscpy_s(title, length, _T("Super D.P.S - マリアとカンパン")); + return true; + case CRC32_SDPS_TONO: + _tcscpy_s(title, length, _T("Super D.P.S - 遠野の森")); + return true; + case CRC32_SDPS_KAIZOKU: + _tcscpy_s(title, length, _T("Super D.P.S - うれしたのし海賊稼業")); + return true; + } + _tcscpy_s(title, length, _T("Super D.P.S")); + return true; + case CRC32_YAKATA2: + _tcscpy_s(title, length, _T("ALICEの館II")); + return true; } - title[0] = _T('\0'); - return false; - -#else - - switch(crc32) { +#elif defined(_SYSTEM3) + switch(crc32_a) { case CRC32_AMBIVALENZ_FD: case CRC32_AMBIVALENZ_CD: _tcscpy_s(title, length, _T("AmbivalenZ −二律背反−")); @@ -170,6 +195,9 @@ bool NACT::get_title(_TCHAR title[], int length) case CRC32_HASHIRIONNA2: _tcscpy_s(title, length, _T("走り女2")); return true; + case CRC32_TOUSHIN2_GD: + _tcscpy_s(title, length, _T("闘神都市2 グラフィックディスク")); + return true; case CRC32_TOUSHIN2_SP: _tcscpy_s(title, length, _T("闘神都市2 そして、それから…")); return true; @@ -183,9 +211,8 @@ bool NACT::get_title(_TCHAR title[], int length) _tcscpy_s(title, length, _T("夢幻泡影")); return true; } +#endif title[0] = _T('\0'); return false; - -#endif } diff --git a/src/sys/nact_dialog.cpp b/src/sys/nact_dialog.cpp deleted file mode 100644 index 83c4fc8..0000000 --- a/src/sys/nact_dialog.cpp +++ /dev/null @@ -1,67 +0,0 @@ - -BOOL CALLBACK NACT::TextDialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ - _TCHAR string[64]; - char origin[22]; - - switch(msg) { - case WM_CLOSE: - EndDialog(hDlg, IDCANCEL); - break; - - case WM_INITDIALOG: - { - // ダイアログの初期化 - _TCHAR string[256]; - _stprintf_s(string, 258, _T("文字列を入力してください (最大%d文字)"), tvar_length); - Edit_SetText(GetDlgItem(hDlg, IDC_TEXT), string); - - char origin[22]; - memcpy(origin, tvar[tvar_index - 1], 22); - Edit_SetText(GetDlgItem(hDlg, IDC_EDITBOX), origin); - if(origin[0] == '\0') { - EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); - } else { - EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); - } - } - break; - - case WM_COMMAND: - switch(LOWORD(wParam)) { - case IDC_EDITBOX: - { - GetDlgItemText(hDlg, IDC_EDITBOX, string, 32); - int p = 0, cnt = 0; - while(string[p] != _T('\0')) { - int c = string[p]; - if((0x81 <= c && c <= 0x9f) || 0xe0 <= c) { - p++; - } - p++; - cnt++; - } - if(cnt == 0 || cnt > tvar_length) { - EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); - } else { - EnableWindow(GetDlgItem(hDlg, IDOK), TRUE); - } - } - break; - - case IDOK: - GetDlgItemText(hDlg, IDC_EDITBOX, string, 32); - strcpy(tvar[tvar_index - 1], string); - EndDialog(hDlg, IDOK); - break; - default: - return FALSE; - } - break; - - default: - return FALSE; - } - return TRUE; -} - diff --git a/src/sys/nact_input.cpp b/src/sys/nact_input.cpp index 1dbeb4b..8f58422 100644 --- a/src/sys/nact_input.cpp +++ b/src/sys/nact_input.cpp @@ -42,7 +42,7 @@ uint8 NACT::get_key() return val; } -void NACT::get_cursor(int* x, int* y) +void NACT::get_cursor(int *x, int *y) { POINT pt; GetCursorPos(&pt); diff --git a/src/sys/nact_sys1.cpp b/src/sys/nact_sys1.cpp index 1e0e1bf..bda3b5c 100644 --- a/src/sys/nact_sys1.cpp +++ b/src/sys/nact_sys1.cpp @@ -18,11 +18,7 @@ #include "../fileio.h" // メニューの改ページ -#if defined(_INTRUDER) -#define MENU_MAX 6 -#else -#define MENU_MAX 11 -#endif +#define MENU_MAX (crc32_a == CRC32_INTRUDER ? 6 : 11) #define WAIT(tm) \ { \ @@ -67,28 +63,27 @@ } \ } -extern _TCHAR g_root[_MAX_PATH]; extern HWND g_hwnd; void NACT::opening() { -#if defined(_CRESCENT) - mako->play_music(2); - ags->load_cg(1, -1); - WAIT(3000); - ags->load_cg(81, -1); -#elif defined(_INTRUDER) - ags->load_cg(77, -1); - WAIT(1667) - ags->load_cg(74, -1); -#elif defined(_VAMPIRE) - mako->play_music(4); - ags->load_cg(3, -1); - WAIT(2000) - ags->load_cg(38, -1); - cmd_a(); - ags->draw_box(0); -#endif + if(crc32_a == CRC32_CRESCENT) { + mako->play_music(2); + ags->load_cg(1, -1); + WAIT(3000); + ags->load_cg(81, -1); + } else if(crc32_a == CRC32_INTRUDER) { + ags->load_cg(77, -1); + WAIT(1667) + ags->load_cg(74, -1); + } else if(crc32_a == CRC32_VAMPIRE) { + mako->play_music(4); + ags->load_cg(3, -1); + WAIT(2000) + ags->load_cg(38, -1); + cmd_a(); + ags->draw_box(0); + } } void NACT::cmd_calc() @@ -101,11 +96,7 @@ void NACT::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::cmd_branch() @@ -115,7 +106,9 @@ void NACT::cmd_branch() bool set_menu = false; if(!condition) { + // 次の'}'命令までスキップする(ネストも考慮する) for(;;) { + prev_addr = scenario_addr; uint8 cmd = getd(); if(cmd == '!') { @@ -134,19 +127,16 @@ void NACT::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; @@ -154,14 +144,12 @@ void NACT::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') { @@ -197,17 +185,18 @@ void NACT::cmd_branch() // message (2 bytes) getd(); } else { + if(cmd >= 0x20 && cmd < 0x7f) { + output_console("\nUnknown Command: '%c' at page = %d, addr = %d\n", cmd, scenario_page, prev_addr); + } else { + output_console("\nUnknown Command: %02x at page = %d, addr = %d\n", cmd, scenario_page, prev_addr); + } fatal_error = true; 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::cmd_label_jump() @@ -215,22 +204,14 @@ void NACT::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::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) { // リターン @@ -252,22 +233,14 @@ void NACT::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::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) { // リターン @@ -294,11 +267,7 @@ void NACT::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(); @@ -309,48 +278,27 @@ void NACT::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::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 defined(_DPS) - if(!text_refresh) { - cmd_a(); - } -#endif - - // クリック中の間は待機 - for(;;) { - if(params.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; - } - Sleep(10); } // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -359,17 +307,20 @@ void NACT::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(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { Sleep(100); break; } @@ -398,6 +349,9 @@ void NACT::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) { @@ -410,7 +364,8 @@ void NACT::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; @@ -441,11 +396,7 @@ void NACT::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::cmd_set_verbobj2() @@ -462,21 +413,14 @@ void NACT::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::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; // 表示する動詞のチェック @@ -540,21 +484,8 @@ top2: } ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(params.terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - Sleep(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -563,17 +494,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(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { Sleep(100); break; } @@ -602,6 +536,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) { @@ -614,7 +551,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; @@ -728,21 +666,8 @@ top2: } ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(params.terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - Sleep(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -751,17 +676,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(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { Sleep(100); break; } @@ -790,6 +718,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) { @@ -802,7 +733,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; @@ -827,11 +759,7 @@ top2: void NACT::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マークの表示 @@ -864,33 +792,35 @@ void NACT::cmd_a() // ウィンドウ更新 ags->clear_text_window(text_window, true); -#if defined(_DPS) - text_refresh = true; -#endif + 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::cmd_b() { // 未使用 + output_console("\nUnknown Command: 'B' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_d() { // 未使用 + output_console("\nUnknown Command: 'D' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_e() { // 未使用 + output_console("\nUnknown Command: 'E' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_f() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nF"); - output_console(log); -#endif + output_console("\nF"); scenario_addr = 2; } @@ -899,67 +829,65 @@ void NACT::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 defined(_INTRUDER) - page = (page == 97) ? 96 : (page == 98) ? 97 : page; -#endif + if(crc32_a == CRC32_INTRUDER) { + page = (page == 97) ? 96 : (page == 98) ? 97 : page; + } ags->load_cg(page, -1); -#if defined(_INTRUDER) - if(page == 94) { - WAIT(400) + if(crc32_a == CRC32_INTRUDER) { + if(page == 94) { + WAIT(400) + } + if(page == 81 || page == 82) { + map_page = page; + } } - if(page == 81 || page == 82) { - map_page = page; - } -#endif } void NACT::cmd_h() { // 未使用 + output_console("\nUnknown Command: 'H' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_i() { // 未使用 + output_console("\nUnknown Command: 'I' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_j() { // 未使用 + output_console("\nUnknown Command: 'J' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_k() { // 未使用 + output_console("\nUnknown Command: 'K' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::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 - _TCHAR path[_MAX_PATH], file_path[_MAX_PATH]; - _tcscpy_s(path, _MAX_PATH, _T("ASLEEP_A.DAT")); - path[7] = _T('A') + index - 1; - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, path); + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); - FILEIO* fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { + FILEIO *fio = new FILEIO(); + if(fio->Fopen(file_name, FILEIO_READ_BINARY)) { fio->Fseek(112, FILEIO_SEEK_SET); int next_page = fio->Fgetw() - 1; @@ -1053,16 +981,22 @@ void NACT::cmd_l() void NACT::cmd_m() { // 未使用 + output_console("\nUnknown Command: 'M' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_n() { // 未使用 + output_console("\nUnknown Command: 'N' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_o() { // 未使用 + output_console("\nUnknown Command: 'O' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_p() @@ -1071,11 +1005,7 @@ void NACT::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) { \ @@ -1102,21 +1032,15 @@ void NACT::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 - _TCHAR path[_MAX_PATH], file_path[_MAX_PATH]; - _tcscpy_s(path, _MAX_PATH, _T("ASLEEP_A.DAT")); - path[7] = _T('A') + index - 1; - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, path); + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); - FILEIO* fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_WRITE_BINARY)) { + FILEIO *fio = new FILEIO(); + if(fio->Fopen(file_name, FILEIO_WRITE_BINARY)) { uint8 buffer[9510]; int p = 0; @@ -1184,11 +1108,7 @@ void NACT::cmd_q() void NACT::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)) { @@ -1200,11 +1120,7 @@ void NACT::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); @@ -1216,6 +1132,8 @@ void NACT::cmd_s() void NACT::cmd_t() { // 未使用 + output_console("\nUnknown Command: 'T' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_u() @@ -1223,42 +1141,38 @@ void NACT::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 defined(_INTRUDER) - ags->load_cg(page, 11); + if(crc32_a == CRC32_INTRUDER) { + ags->load_cg(page, 11); - if(page == 5) { - WAIT(400) + if(page == 5) { + WAIT(400) + } + } else { + ags->load_cg(page, transparent); } -#else - ags->load_cg(page, transparent); -#endif } void NACT::cmd_v() { // 未使用 + output_console("\nUnknown Command: 'V' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_w() { // 未使用 + output_console("\nUnknown Command: 'W' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::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]); @@ -1270,228 +1184,223 @@ void NACT::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); -#if defined(_BUNKASAI) || defined(_CRESCENT) || defined(_DPS) || defined(_FUKEI) || defined(_TENGU) - 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; + if(crc32_a == 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(buf[p] != '0') { + if(params.terminate) { + return; + } + if(get_key()) { break; } - p++; + Sleep(10); } - ags->draw_text(&buf[p < 4 ? p : 4]); - } - break; - case 2: -#if defined(_CRESCENT) - for(int i = 39; i <= 48; i++) { -#elif defined(_DPS) - for(int i = 0; i <= 20; i++) { -#else - for(int i = 0; i <= 16; i++) { -#endif - var[i] = 0; - } - break; - case 3: - WAIT(param * 1000 / 60) - break; - case 4: - RND = (param == 0 || param == 1) ? 0 : random(param); - break; -#if defined(_DPS) - case 7: - if(param == 1) { - ags->box_fill(0, 40, 8, 598, 270, 0); - } - break; -#endif -#if defined(_TENGU) - case 130: - { - 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); + Sleep(100); + for(;;) { + if(params.terminate) { + return; + } + if(!(get_key() & 0x18)) { + break; + } + Sleep(10); } - WAIT_KEYQUIT(6000) - ags->draw_box(param); - } - break; -#endif - case 253: - post_quit = false; - fatal_error = true; - break; - case 254: - RND = 0; - break; - case 255: -#if defined(_DPS) - post_quit = false; -#else - post_quit = true; -#endif - fatal_error = true; - break; - } -#elif defined(_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(params.terminate) { - return; + ags->clear_text_window(text_window, true); + break; + case 2: + if(param == 0) { + post_quit = true; + fatal_error = true; + } else { + WAIT(100) } - if(get_key()) { - break; - } - Sleep(10); - } - Sleep(100); - for(;;) { - if(params.terminate) { - return; - } - if(!(get_key() & 0x18)) { - break; - } - Sleep(10); - } - ags->clear_text_window(text_window, true); - break; - case 2: - if(param == 0) { + break; + case 3: + WAIT(param * 1000) + break; + 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; + } } -#endif } void NACT::cmd_z() { -#if defined(_CRESCENT) - cmd_y(); - return; -#endif + 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); -#if defined(_INTRUDER) - if(cmd == 1 && 1 <= param && param <= 4) { - char* buf[4] = {"<", "∧", ">", "∨"}; + if(crc32_a == CRC32_INTRUDER) { + if(cmd == 1 && 1 <= param && param <= 4) { + char *buf[4] = {"<", "∧", ">", "∨"}; - // 矢印を消去する - if(map_page) { - ags->load_cg(map_page, -1); + // 矢印を消去する + if(map_page) { + ags->load_cg(map_page, -1); + if(paint_x) { + ags->paint(paint_x, paint_y * 2, 2 + 16); + } + } + + // 矢印を表示する + int x = ags->text_dest_x; + int y = ags->text_dest_y; + int color = ags->text_font_color; + ags->text_font_size = 24; + ags->text_font_color = 16; + + ags->text_dest_x = 456; + ags->text_dest_y = 103; + ags->draw_text(buf[param - 1]); + + ags->text_dest_x = x; + ags->text_dest_y = y; + ags->text_font_size = 16; + ags->text_font_color = color; + } else if(cmd == 2) { + ags->load_cg(74, -1); + ags->load_cg(81, -1); + map_page = 81; + } else if(cmd == 3) { + RND = (param == 0 || param == 1) ? 0 : random(param); + } else if(460 <= cmd && cmd <= 625 && 20 <= param && param <= 55) { if(paint_x) { - ags->paint(paint_x, paint_y * 2, 2 + 16); + ags->paint(paint_x, paint_y * 2, 5 + 16); + } + ags->paint(cmd, param * 2, 2 + 16); + paint_x = cmd; + paint_y = param; + } else { + paint_x = 0; + } + } else if(crc32_a == CRC32_TENGU) { + if(cmd == 10) { + // nop + } else if(cmd == 20) { + if(param == 20) { + ags->gcopy(8, 8, 46, 144, 2); + } else if(param == 21) { + ags->gcopy(8, 8, 46, 144, 3); } } - - // 矢印を表示する - int x = ags->text_dest_x; - int y = ags->text_dest_y; - int color = ags->text_font_color; - ags->text_font_size = 24; - ags->text_font_color = 16; - - ags->text_dest_x = 456; - ags->text_dest_y = 103; - ags->draw_text(buf[param - 1]); - - ags->text_dest_x = x; - ags->text_dest_y = y; - ags->text_font_size = 16; - ags->text_font_color = color; - } else if(cmd == 2) { - ags->load_cg(74, -1); - ags->load_cg(81, -1); - map_page = 81; - } else if(cmd == 3) { - RND = (param == 0 || param == 1) ? 0 : random(param); - } else if(460 <= cmd && cmd <= 625 && 20 <= param && param <= 55) { - if(paint_x) { - ags->paint(paint_x, paint_y * 2, 5 + 16); - } - ags->paint(cmd, param * 2, 2 + 16); - paint_x = cmd; - paint_y = param; - } else { - paint_x = 0; } -#elif defined(_TENGU) - if(cmd == 10) { - // nop - } else if(cmd == 20) { - if(param == 20) { - ags->gcopy(8, 8, 46, 144, 2); - } else if(param == 21) { - ags->gcopy(8, 8, 46, 144, 3); - } - } -#endif } diff --git a/src/sys/nact_sys2.cpp b/src/sys/nact_sys2.cpp index 751c9d9..75c042d 100644 --- a/src/sys/nact_sys2.cpp +++ b/src/sys/nact_sys2.cpp @@ -11,6 +11,10 @@ #include "mako.h" #include "crc32.h" #include "../fileio.h" +#include "../res2/resource.h" + +extern HINSTANCE g_hinst; +extern HWND g_hwnd; #define WAIT(tm) \ { \ @@ -55,9 +59,6 @@ } \ } -extern _TCHAR g_root[_MAX_PATH]; -extern HWND g_hwnd; - void NACT::cmd_calc() { int index = getd(); @@ -68,11 +69,7 @@ void NACT::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::cmd_branch() @@ -82,7 +79,9 @@ void NACT::cmd_branch() bool set_menu = false; if(!condition) { + // 次の'}'命令までスキップする(ネストも考慮する) for(;;) { + prev_addr = scenario_addr; uint8 cmd = getd(); if(cmd == '!') { @@ -101,19 +100,16 @@ void NACT::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; @@ -121,14 +117,12 @@ void NACT::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') { @@ -164,7 +158,8 @@ void NACT::cmd_branch() } else if(cmd == 'I') { cali(); cali(); - getd(); +// getd(); + cali(); } else if(cmd == 'J') { cali(); cali(); @@ -204,11 +199,48 @@ void NACT::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(); @@ -228,17 +260,18 @@ void NACT::cmd_branch() // message (2 bytes) getd(); } else { + if(cmd >= 0x20 && cmd < 0x7f) { + output_console("\nUnknown Command: '%c' at page = %d, addr = %d\n", cmd, scenario_page, prev_addr); + } else { + output_console("\nUnknown Command: %02x at page = %d, addr = %d\n", cmd, scenario_page, prev_addr); + } fatal_error = true; 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::cmd_label_jump() @@ -246,22 +279,14 @@ void NACT::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::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) { // リターン @@ -283,22 +308,14 @@ void NACT::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::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) { // リターン @@ -325,11 +342,7 @@ void NACT::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(); @@ -340,42 +353,21 @@ void NACT::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::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(params.terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - Sleep(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -384,17 +376,20 @@ void NACT::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(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { Sleep(100); break; } @@ -423,6 +418,9 @@ void NACT::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) { @@ -435,7 +433,8 @@ void NACT::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; @@ -466,11 +465,7 @@ void NACT::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::cmd_set_verbobj2() @@ -487,21 +482,14 @@ void NACT::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::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; // 表示する動詞のチェック @@ -530,21 +518,8 @@ void NACT::cmd_open_verb() } ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(params.terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - Sleep(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -553,17 +528,20 @@ void NACT::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(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { Sleep(100); break; } @@ -592,6 +570,9 @@ void NACT::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) { @@ -604,7 +585,8 @@ void NACT::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; @@ -674,21 +656,8 @@ void NACT::cmd_open_obj(int verb) ags->menu_dest_y += ags->menu_font_size + 2; ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(params.terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - Sleep(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -697,17 +666,20 @@ void NACT::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(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { Sleep(100); break; } @@ -736,6 +708,9 @@ void NACT::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) { @@ -748,7 +723,8 @@ void NACT::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; @@ -771,11 +747,7 @@ void NACT::cmd_open_obj(int verb) void NACT::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マークの表示 @@ -819,13 +791,12 @@ void NACT::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; @@ -838,7 +809,10 @@ void NACT::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; @@ -861,9 +835,16 @@ void NACT::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; @@ -887,11 +868,7 @@ void NACT::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::cmd_e() @@ -900,20 +877,12 @@ void NACT::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::cmd_f() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nF"); - output_console(log); -#endif + output_console("\nF"); scenario_addr = 2; } @@ -922,18 +891,24 @@ void NACT::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::cmd_h() @@ -941,11 +916,7 @@ void NACT::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]; @@ -985,13 +956,10 @@ void NACT::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::cmd_j() @@ -999,11 +967,7 @@ void NACT::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::cmd_k() @@ -1016,21 +980,15 @@ void NACT::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 - _TCHAR path[_MAX_PATH], file_path[_MAX_PATH]; - _tcscpy_s(path, _MAX_PATH, _T("ASLEEP_A.DAT")); - path[7] = _T('A') + index - 1; - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, path); + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); - FILEIO* fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { + FILEIO *fio = new FILEIO(); + if(fio->Fopen(file_name, FILEIO_READ_BINARY)) { fio->Fseek(112, FILEIO_SEEK_SET); int next_page = fio->Fgetw() - 1; @@ -1123,7 +1081,7 @@ void NACT::cmd_l() void NACT::cmd_m() { - char string[22]; + char string[33]; int d, p = 0; while((d = getd()) != ':') { @@ -1137,14 +1095,10 @@ void NACT::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); } } @@ -1153,11 +1107,7 @@ void NACT::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::cmd_o() @@ -1166,29 +1116,25 @@ void NACT::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::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) { \ @@ -1215,21 +1161,15 @@ void NACT::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 - _TCHAR path[_MAX_PATH], file_path[_MAX_PATH]; - _tcscpy_s(path, _MAX_PATH, _T("ASLEEP_A.DAT")); - path[7] = _T('A') + index - 1; - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, path); + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); - FILEIO* fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_WRITE_BINARY)) { + FILEIO *fio = new FILEIO(); + if(fio->Fopen(file_name, FILEIO_WRITE_BINARY)) { uint8 buffer[9510]; int p = 0; @@ -1297,11 +1237,7 @@ void NACT::cmd_q() void NACT::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)) { @@ -1313,11 +1249,7 @@ void NACT::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); @@ -1332,70 +1264,86 @@ void NACT::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::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 defined(_INTRUDER) - ags->load_cg(page, 11); - - if(page == 5) { - WAIT(400) + if(crc32_a == CRC32_YAKATA2) { + page = cali(); + transparent = cali(); + } else { + page = getd(); + transparent = getd(); } -#else + + output_console("\nU %d,%d:", page, transparent); + ags->load_cg(page, transparent); -#endif } void NACT::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::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::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]); @@ -1407,11 +1355,7 @@ void NACT::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: @@ -1454,7 +1398,7 @@ void NACT::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; @@ -1470,9 +1414,18 @@ void NACT::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; + case 27: + { + int tmp = tvar_index; + tvar_index = param; + tvar_maxlen = 8;//param; + DialogBoxParam(g_hinst, MAKEINTRESOURCE(IDD_DIALOG1), g_hwnd, TextDialogProc, (LPARAM)this); + tvar_index = tmp; + } + break; case 40: case 42: - { + if(ags->now_fade()) { DWORD dwStart = timeGetTime(); for(int i = 0; i < 16; i++) { ags->fade_in(i); @@ -1487,11 +1440,13 @@ void NACT::cmd_y() Sleep(0); } } + ags->fade_end(); } break; case 41: case 43: - { + if(!ags->now_fade()) { + ags->fade_start(); DWORD dwStart = timeGetTime(); for(int i = 0; i < 16; i++) { ags->fade_out(i, (cmd == 41) ? false : true); @@ -1538,6 +1493,28 @@ void NACT::cmd_y() case 252: RND = 8; break; + case 253: + // キーが押されて離されるまで待機 + for(;;) { + if(params.terminate) { + return; + } + if(get_key()) { + break; + } + Sleep(10); + } + Sleep(100); + for(;;) { + if(params.terminate) { + return; + } + if(!(get_key() & 0x18)) { + break; + } + Sleep(10); + } + break; case 254: RND = 0; break; @@ -1568,11 +1545,7 @@ void NACT::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 c5b39ee..4141c38 100644 --- a/src/sys/nact_sys3.cpp +++ b/src/sys/nact_sys3.cpp @@ -4,21 +4,13 @@ [ NACT - command ] */ -#if defined(_SYSTEM1) -#include "../res1/resource.h" -#elif defined(_SYSTEM2) -#include "../res2/resource.h" -#else -#include "../res3/resource.h" -#endif - #include "nact.h" #include "ags.h" #include "mako.h" #include "crc32.h" #include "../fileio.h" +#include "../res3/resource.h" -extern _TCHAR g_root[_MAX_PATH]; extern HINSTANCE g_hinst; extern HWND g_hwnd; @@ -32,11 +24,7 @@ void NACT::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::cmd_branch() @@ -48,11 +36,7 @@ void NACT::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::cmd_label_jump() @@ -60,22 +44,14 @@ void NACT::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::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) { // リターン @@ -97,22 +73,14 @@ void NACT::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::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) { // リターン @@ -139,11 +107,7 @@ void NACT::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(); @@ -154,42 +118,21 @@ void NACT::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::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(params.terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - Sleep(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -198,17 +141,20 @@ void NACT::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(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { Sleep(100); break; } @@ -237,6 +183,9 @@ void NACT::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) { @@ -249,7 +198,8 @@ void NACT::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; @@ -280,11 +230,7 @@ void NACT::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::cmd_set_verbobj2() @@ -301,21 +247,14 @@ void NACT::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::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; // 表示する動詞のチェック @@ -344,21 +283,8 @@ void NACT::cmd_open_verb() } ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(params.terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - Sleep(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -367,17 +293,20 @@ void NACT::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(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { Sleep(100); break; } @@ -406,6 +335,9 @@ void NACT::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) { @@ -418,7 +350,8 @@ void NACT::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; @@ -488,21 +421,8 @@ void NACT::cmd_open_obj(int verb) ags->menu_dest_y += ags->menu_font_size + 2; ags->draw_menu = false; - // クリック中の間は待機 - for(;;) { - if(params.terminate) { - return; - } -// if(get_key() != 32) { - if(!get_key()) { - break; - } - Sleep(10); - } - // メニュー表示 ags->open_menu_window(menu_window); - int current_index = 0; // マウス移動 int sx = ags->menu_w[menu_window - 1].sx; @@ -511,17 +431,20 @@ void NACT::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(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { Sleep(100); break; } @@ -550,6 +473,9 @@ void NACT::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) { @@ -562,7 +488,8 @@ void NACT::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; @@ -585,11 +512,7 @@ void NACT::cmd_open_obj(int verb) void NACT::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マークの表示 @@ -633,18 +556,13 @@ void NACT::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; @@ -679,7 +597,7 @@ void NACT::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); @@ -699,6 +617,8 @@ void NACT::cmd_b() void NACT::cmd_d() { // 未使用 + output_console("\nUnknown Command: 'D' at page = %d, addr = %d\n", scenario_page, prev_addr); + fatal_error = true; } void NACT::cmd_e() @@ -710,11 +630,7 @@ void NACT::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; @@ -725,11 +641,7 @@ void NACT::cmd_e() void NACT::cmd_f() { -#if defined(_DEBUG_CONSOLE) - char log[128]; - sprintf_s(log, 128, "\nF"); - output_console(log); -#endif + output_console("\nF"); scenario_addr = 2; } @@ -738,11 +650,7 @@ void NACT::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); } @@ -752,11 +660,7 @@ void NACT::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) { @@ -807,15 +711,11 @@ void NACT::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); } @@ -825,11 +725,7 @@ void NACT::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; @@ -841,11 +737,7 @@ void NACT::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) { @@ -862,7 +754,7 @@ void NACT::cmd_k() if(params.terminate) { return; } - if(val = get_key()) { + if((val = get_key()) != 0) { break; } if(1 <= cmd && cmd <= 3) { @@ -918,19 +810,12 @@ void NACT::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) { // 特殊セーブ - _TCHAR file_path[_MAX_PATH]; - _stprintf_s(file_path, _MAX_PATH, _T("%sASLEEP.DAT"), g_root); - - FILEIO* fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { + FILEIO *fio = new FILEIO(); + if(fio->Fopen("ASLEEP.DAT", FILEIO_READ_BINARY)) { // U01 - U20 for(int i = 21; i <= 40; i++) { var[i] = fio->Fgetw(); @@ -944,13 +829,11 @@ void NACT::cmd_l() delete fio; } else if(1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - _TCHAR path[_MAX_PATH], file_path[_MAX_PATH]; - _tcscpy_s(path, _MAX_PATH, _T("ASLEEP_A.DAT")); - path[7] = _T('A') + index - 1; - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, path); + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); - FILEIO* fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { + FILEIO *fio = new FILEIO(); + if(fio->Fopen(file_name, FILEIO_READ_BINARY)) { fio->Fseek(112, FILEIO_SEEK_SET); int next_page = fio->Fgetw() - 1; @@ -1040,13 +923,11 @@ void NACT::cmd_l() delete fio; } else if(101 <= index && index <= 126) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - _TCHAR path[_MAX_PATH], file_path[_MAX_PATH]; - _tcscpy_s(path, _MAX_PATH, _T("ASLEEP_A.DAT")); - path[7] = _T('A') + index - 101; - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, path); + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 101); - FILEIO* fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_READ_BINARY)) { + FILEIO *fio = new FILEIO(); + if(fio->Fopen(file_name, FILEIO_READ_BINARY)) { fio->Fseek(112 + 16, FILEIO_SEEK_SET); var[0] = fio->Fgetw(); fio->Fclose(); @@ -1071,22 +952,18 @@ void NACT::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); } else if(tvar_index == 31) { - _tcscpy_s(adisk, 16, string); + strcpy_s(adisk, 16, string); } else if(tvar_index == 32) { - _tcscpy_s(ags->acg, 16, string); + strcpy_s(ags->acg, 16, string); } else if(tvar_index == 33) { - _tcscpy_s(mako->amus, 16, string); + strcpy_s(mako->amus, 16, string); } else if(tvar_index == 34) { - _tcscpy_s(mako->amse, 16, string); + strcpy_s(mako->amse, 16, string); } } @@ -1096,11 +973,7 @@ void NACT::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::cmd_o() @@ -1125,11 +998,7 @@ void NACT::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; @@ -1151,11 +1020,7 @@ void NACT::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); } } @@ -1166,11 +1031,7 @@ void NACT::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; @@ -1212,19 +1073,12 @@ void NACT::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) { // 特殊セーブ - _TCHAR file_path[_MAX_PATH]; - _stprintf_s(file_path, _MAX_PATH, _T("%sASLEEP.DAT"), g_root); - - FILEIO* fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_WRITE_BINARY)) { + FILEIO *fio = new FILEIO(); + if(fio->Fopen("ASLEEP.DAT", FILEIO_WRITE_BINARY)) { // U01 - U20 for(int i = 21; i <= 40; i++) { fio->Fputw(var[i]); @@ -1238,13 +1092,11 @@ void NACT::cmd_q() delete fio; } else if(1 <= index && index <= 26) { // ASLEEP_A.DAT - ASLEEP_Z.DAT - _TCHAR path[_MAX_PATH], file_path[_MAX_PATH]; - _tcscpy_s(path, _MAX_PATH, _T("ASLEEP_A.DAT")); - path[7] = _T('A') + index - 1; - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, path); + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1); - FILEIO* fio = new FILEIO(); - if(fio->Fopen(file_path, FILEIO_WRITE_BINARY)) { + FILEIO *fio = new FILEIO(); + if(fio->Fopen(file_name, FILEIO_WRITE_BINARY)) { uint8 buffer[9510]; int p = 0; @@ -1312,11 +1164,7 @@ void NACT::cmd_q() void NACT::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)) { @@ -1328,11 +1176,7 @@ void NACT::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); @@ -1346,11 +1190,7 @@ void NACT::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; @@ -1362,13 +1202,9 @@ void NACT::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); @@ -1379,11 +1215,7 @@ void NACT::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++) { @@ -1408,11 +1240,7 @@ void NACT::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); } @@ -1421,11 +1249,7 @@ void NACT::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]); @@ -1437,11 +1261,7 @@ void NACT::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: @@ -1736,7 +1556,7 @@ void NACT::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) { @@ -1770,14 +1590,12 @@ void NACT::cmd_y() } break; case 239: - { - _TCHAR path[_MAX_PATH], file_path[_MAX_PATH]; - _tcscpy_s(path, _MAX_PATH, _T("ASLEEP_A.DAT")); - path[7] = _T('A') + param - 1; - _stprintf_s(file_path, _MAX_PATH, _T("%s%s"), g_root, path); - - HANDLE hFile = CreateFile(file_path, GENERIC_READ, FILE_SHARE_WRITE, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if(1 <= param && param <= 26) { + char file_name[_MAX_PATH]; + sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + param - 1); + + HANDLE hFile = CreateFileA(FILEIO::GetFilePath(file_name), GENERIC_READ, FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile != INVALID_HANDLE_VALUE) { FILETIME fTime, fLocalTime; SYSTEMTIME sTime; @@ -1794,6 +1612,9 @@ void NACT::cmd_y() } else { D01 = D02 = D03 = D04 = D05 = D06 = 0; } + } else { + // 不正なファイル番号 + D01 = D02 = D03 = D04 = D05 = D06 = 0; } break; case 240: @@ -1802,29 +1623,33 @@ void NACT::cmd_y() case 241: break; case 250: - { - _TCHAR path[4]; - path[0] = g_root[0]; - path[1] = _T(':'); - path[2] = _T('\\'); - path[3] = _T('\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 { + // ネットワークドライブ? + RND = 1; } 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; @@ -1838,11 +1663,7 @@ void NACT::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/winmain.cpp b/src/winmain.cpp index 972f5a9..af12f77 100644 --- a/src/winmain.cpp +++ b/src/winmain.cpp @@ -15,12 +15,12 @@ #include "res1/resource.h" #elif defined(_SYSTEM2) #include "res2/resource.h" -#else +#elif defined(_SYSTEM3) #include "res3/resource.h" #endif #include "sys/nact.h" -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow); +int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow); LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam); // フルスクリーン @@ -37,23 +37,14 @@ void release_mci(); void play_mci(HWND hWnd, int index); void stop_mci(); -_TCHAR g_root[_MAX_PATH]; HINSTANCE g_hinst; HWND g_hwnd = NULL; HMENU g_hmenu = NULL; -NACT* nact; +NACT *nact; -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow) +int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow) { - // モジュールパス取得 - GetModuleFileName(NULL, g_root, _MAX_PATH); - int p = _tcslen(g_root); - while(g_root[p] != _T('\\')) { - p--; - } - g_root[p + 1] = _T('\0'); - g_hinst = hInstance; // ウィンドウの表示位置を取得する @@ -88,7 +79,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLin _tcscpy_s(buf, 128, _T("Scenario Decoder SYSTEM1")); #elif defined(_SYSTEM2) _tcscpy_s(buf, 128, _T("Scenario Decoder SYSTEM2")); -#else +#elif defined(_SYSTEM3) _tcscpy_s(buf, 128, _T("Scenario Decoder SYSTEM3")); #endif @@ -114,7 +105,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLin _stprintf_s(buf, 128, _T("Scenario Decoder SYSTEM1 - %s"), title); #elif defined(_SYSTEM2) _stprintf_s(buf, 128, _T("Scenario Decoder SYSTEM2 - %s"), title); -#else +#elif defined(_SYSTEM3) _stprintf_s(buf, 128, _T("Scenario Decoder SYSTEM3 - %s"), title); #endif SetWindowText(g_hwnd, buf); @@ -140,7 +131,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLin ChangeDisplaySettings(NULL, 0); } -#ifdef _DEBUG +#if defined(_DEBUG) // メモリリーク検出 _CrtDumpMemoryLeaks(); #endif diff --git a/dps.vcproj b/system1.vcproj similarity index 81% rename from dps.vcproj rename to system1.vcproj index c3415b7..cc94f7f 100644 --- a/dps.vcproj +++ b/system1.vcproj @@ -2,8 +2,9 @@ @@ -42,17 +43,17 @@ MkTypLibCompatible="true" SuppressStartupBanner="true" TargetEnvironment="1" - TypeLibraryName=".\Debug/dps.tlb" + TypeLibraryName=".\Debug/system1.tlb" HeaderFileName="" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sdps.vcproj b/system2.vcproj similarity index 83% rename from sdps.vcproj rename to system2.vcproj index 3001c72..ac98d87 100644 --- a/sdps.vcproj +++ b/system2.vcproj @@ -2,8 +2,9 @@ @@ -42,17 +43,17 @@ MkTypLibCompatible="true" SuppressStartupBanner="true" TargetEnvironment="1" - TypeLibraryName=".\Debug/sdps.tlb" + TypeLibraryName=".\Debug/system2.tlb" HeaderFileName="" /> + + + + + + + + + + + + + + + + + + + + + + diff --git a/system3.vcproj b/system3.vcproj index de2a4e1..553f462 100644 --- a/system3.vcproj +++ b/system3.vcproj @@ -4,6 +4,7 @@ Version="9.00" Name="system3" ProjectGUID="{13659905-B0B3-4B70-ADAA-64F6A35051B8}" + RootNamespace="system3" TargetFrameworkVersion="0" > @@ -684,6 +685,10 @@ RelativePath="src\res3\AMUS_RG2.MDA" > + + diff --git a/tengu.vcproj b/tengu.vcproj deleted file mode 100644 index 8cd8cf9..0000000 --- a/tengu.vcproj +++ /dev/null @@ -1,656 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vampire.vcproj b/vampire.vcproj deleted file mode 100644 index 5fb9ae9..0000000 --- a/vampire.vcproj +++ /dev/null @@ -1,656 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vista.manifest b/vista.manifest new file mode 100644 index 0000000..1019a20 --- /dev/null +++ b/vista.manifest @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + +