Merge pull request #3 from kichikuou/merge-upstream

This merges changes in System3 for Win32 between 2016-01-16 and 2020-03-21.
This commit is contained in:
kichikuou
2020-05-23 13:08:14 +09:00
committed by GitHub
53 changed files with 1049 additions and 1047 deletions
+22 -3
View File
@@ -74,17 +74,35 @@ Since System1-3 behave slightly differently depending on the game, `system3` use
Here's the list of available game IDs and corresponding titles:
| game_id | Title |
----------|--------
| `bunkasai` | あぶない文化祭前夜 |
| `crescent` | クレセントムーンがぁる |
| `dps` | D.P.S - Dream Program System |
| `dps_sg_fahren` | D.P.S SG - Fahren Fliegen |
| `dps_sg_katei` | D.P.S SG - 家庭教師はステキなお仕事 |
| `dps_sg_nobunaga` | D.P.S SG - 信長の淫謀 |
| `dps_sg2_antique` | D.P.S SG set2 - ANTIQUE HOUSE |
| `dps_sg2_ikenai` | D.P.S SG set2 - いけない内科検診再び |
| `dps_sg2_akai` | D.P.S SG set2 - 朱い夜 |
| `dps_sg3_rabbit` | D.P.S SG set3 - Rabbit P4P |
| `dps_sg3_shinkon` | D.P.S SG set3 - しんこんさんものがたり |
| `dps_sg3_sotsugyou` | D.P.S SG set3 - 卒業 |
| `fukei` | 婦警さんVX |
| `intruder` | Intruder -桜屋敷の探索- |
| `tengu` | あぶないてんぐ伝説 |
| `toushin_hint` | 闘神都市 ヒントディスク |
| `little_vampire` | Little Vampire |
| `yakata` | ALICEの館 |
| `ayumi_fd` | あゆみちゃん物語 |
| `ayumi_hint` | あゆみちゃん物語 ヒントディスク |
| `ayumi_proto` | あゆみちゃん物語 PROTO |
| `sdps_maria` | Super D.P.S マリアとカンパン |
| `sdps_tono` | Super D.P.S 遠野の森 |
| `sdps_kaizoku` | Super D.P.S 海賊家業 |
| `dalk_hint` | DALK ヒントディスク |
| `drstop` | Dr. STOP! |
| `prog_fd` | Prostudent G (FD) |
| `rance3_hint` | Rance3 ヒントディスク |
| `sdps_maria` | Super D.P.S - マリアとカンパン |
| `sdps_tono` | Super D.P.S - 遠野の森 |
| `sdps_kaizoku` | Super D.P.S - うれしたのし海賊稼業 |
| `yakata2` | ALICEの館II |
| `ambivalenz_fd` | AmbivalenZ −二律背反− (FD) |
| `ambivalenz_cd` | AmbivalenZ −二律背反− (CD) |
| `dps_all` | D.P.S. 全部 |
@@ -102,6 +120,7 @@ Here's the list of available game IDs and corresponding titles:
| `yakata3_cd` | アリスの館3 (CD) |
| `yakata3_fd` | アリスの館3 (FD) |
| `hashirionna2` | 走り女2 |
| `toushin2_gd` |闘神都市2 グラフィックディスク |
| `toushin2_sp` | 闘神都市2 そして、それから… |
| `otome` | 乙女戦記 |
| `ningyo` | 人魚 -蘿子- |
+33 -1
View File
@@ -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版)をサポートしました。
あゆみちゃん物語 ヒントディスクをサポートしました。
+3 -9
View File
@@ -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版や、
+9 -5
View File
@@ -40,13 +40,13 @@ FILEIO::~FILEIO(void)
}
}
bool FILEIO::Fopen(const char *filename, int mode)
bool FILEIO::Fopen(const char *file_name, int mode)
{
mode_ = mode;
char path[_MAX_PATH];
sprintf_s(path, _MAX_PATH, "%s%s",
(g_savedir && mode & FILEIO_SAVEDATA) ? g_savedir : g_root,
filename);
file_name);
mode &= ~FILEIO_SAVEDATA;
@@ -115,7 +115,7 @@ int FILEIO::Fgetw()
return val | (Fgetc() << 8);
}
void FILEIO::Fgets(char dest[])
void FILEIO::Fgets(char *dest, int length)
{
int p = 0;
@@ -125,9 +125,13 @@ void FILEIO::Fgets(char dest[])
break;
}
if(c != 0x0a) {
dest[p++] = c;
if(p < length + 1) {
dest[p++] = c;
}
if((0x81 <= c && c <= 0x9f) || 0xe0 <= c) {
dest[p++] = Fgetc();
if(p < length + 1) {
dest[p++] = Fgetc();
}
}
}
}
+2 -2
View File
@@ -30,7 +30,7 @@ public:
static void SetSaveDir(const char* savedir);
static int StatSavedata(const char* filename, struct stat* buf);
bool Fopen(const char *filename, int mode);
bool Fopen(const char *file_name, int mode);
void Fclose();
uint32 Fseek(long offset, int origin);
uint32 Ftell();
@@ -38,7 +38,7 @@ public:
uint32 Fwrite(void* buffer, uint32 size, uint32 count);
int Fgetc();
int Fgetw();
void Fgets(char dest[]);
void Fgets(char* dest, int length);
void Fputc(int c);
void Fputw(int w);
};
+6 -2
View File
@@ -35,9 +35,13 @@ void NACT::release_console()
{
}
void NACT::output_console(char log[])
void NACT::output_console(const char *format, ...)
{
#if defined(_DEBUG_CONSOLE)
fputs(log, stderr);
va_list ap;
va_start(ap, format);
vfprintf(stdout, format, ap);
va_end(ap);
#endif
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+26 -4
View File
@@ -169,7 +169,7 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent)
// Bコマンド
for(int i = 0; i < 10; i++) {
// ウィンドウの初期位置はシステムによって異なる
switch (nact->crc32) {
switch (nact->crc32_a) {
case CRC32_BUNKASAI:
SET_TEXT(i, 24, 304, 616, 384, false);
SET_MENU(i, 440, 18, 620, 178, true);
@@ -180,6 +180,9 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent)
SET_MENU(i, 464, 50, 623, 240, true);
break;
case CRC32_DPS:
case CRC32_DPS_SG:
//case CRC32_DPS_SG2:
case CRC32_DPS_SG3:
SET_TEXT(i, 48, 288, 594, 393, false);
//SET_MENU(i, 48, 288, 584, 393, false);
SET_MENU(i, 48, 288, 594, 393, false);
@@ -196,10 +199,30 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent)
SET_TEXT(i, 44, 282, 593, 396, false);
SET_MENU(i, 452, 14, 627, 214, false);
break;
case CRC32_TOUSHIN_HINT:
SET_TEXT(i, 8, 311, 623, 391, false);
SET_MENU(i, 452, 14, 627, 214, true);
break;
case CRC32_VAMPIRE:
SET_TEXT(i, 8, 255, 615, 383, false);
SET_MENU(i, 448, 11, 615, 224, false);
break;
case CRC32_YAKATA:
SET_TEXT(i, 48, 288, 594, 393, false);
SET_MENU(i, 452, 14, 627, 214, false);
break;
case CRC32_DALK_HINT:
SET_TEXT(i, 24, 308, 376, 386, false);
SET_MENU(i, 404, 28, 604, 244, true);
break;
case CRC32_RANCE3_HINT:
SET_TEXT(i, 104, 304, 615, 383, false);
SET_MENU(i, 464, 24, 623, 200, true);
break;
case CRC32_YAKATA2:
SET_TEXT(i, 104, 304, 620, 382, false);
SET_MENU(i, 420, 28, 620, 244, true);
break;
default:
SET_TEXT(i, 8, 311, 623, 391, true);
SET_MENU(i, 464, 80, 623, 240, true);
@@ -211,7 +234,6 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent)
menu_w[i].push = true;
menu_w[i].screen = NULL;
menu_w[i].window = NULL;
}
// Eコマンド
@@ -220,9 +242,9 @@ AGS::AGS(NACT* parent, const char* fontfile) : nact(parent)
SET_BOX(i, 0, 0, 0, 639, 399);
}
if (nact->sys_ver == 2) {
if (nact->crc32 == CRC32_SDPS_TONO || nact->crc32 == CRC32_SDPS_KAIZOKU) {
if(nact->crc32_a == CRC32_SDPS && (nact->crc32_b == CRC32_SDPS_TONO || nact->crc32_b == CRC32_SDPS_KAIZOKU)) {
SET_BOX(0, 0, 40, 8, 598, 271);
} else if (nact->crc32 == CRC32_PROSTUDENTG_FD) {
} else if(nact->crc32_a == CRC32_PROSTUDENTG_FD) {
SET_BOX(0, 0, 64, 13, 407, 289);
SET_BOX(1, 0, 24, 298, 111, 390);
SET_BOX(2, 0, 0, 0, 639, 307);
+6 -6
View File
@@ -59,18 +59,16 @@ private:
SDL_Cursor* hCursor[10];
// AGS
void load_gm3(uint8* data, int page, int transparent); // Intruder -桜屋敷の探索-
void load_vsp2l(uint8* data, int page, int transparent); // Little Vampire
void load_gl3(uint8* data, int page, int transparent); // あぶない天狗伝説
void load_gm3(uint8* data, int page, int transparent); // Intruder
void load_vsp(uint8* data, int page, int transparent);
void load_gl3(uint8* data, int page, int transparent);
void load_pms(uint8* data, int page, int transparent);
void load_bmp(const char *file_path);
void load_bmp(const char* file_name); // あゆみちゃん物語 フルカラー実写版
void load_vsp(uint8* data, int page, int transparent);
void draw_char(int dest, int dest_x, int dest_y, uint16 code, int size, uint8 color);
void draw_char_antialias(int dest, int dest_x, int dest_y, uint16 code, int size, uint8 color, uint8 cache[]);
void draw_gaiji(int dest, int dest_x, int dest_y, uint16 code, int size, uint8 color);
uint16 convert_zenkaku(uint16 code);
uint16 convert_hankaku(uint16 code);
void draw_window(int sx, int sy, int ex, int ey, bool frame, uint8 frame_color, uint8 back_color);
@@ -118,6 +116,8 @@ public:
void box_line(int dest, int sx, int sy, int ex, int ey, uint8 color);
void draw_text(const char* string);
uint16 convert_zenkaku(uint16 code);
uint16 convert_hankaku(uint16 code);
void clear_text_window(int index, bool erase);
bool return_text_line(int index);
+3 -2
View File
@@ -5,8 +5,9 @@
*/
#include "ags.h"
#include "../fileio.h"
void AGS::load_bmp(const char *file_path)
void AGS::load_bmp(const char* file_name)
{
// ヘッダ取得
int sx = 0, sy = 0;
@@ -23,7 +24,7 @@ void AGS::load_bmp(const char *file_path)
#if 0
// BMP読み込み
WCHAR wszFilePath[_MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, file_path, -1, wszFilePath, _MAX_PATH);
MultiByteToWideChar(CP_ACP, 0, FILEIO::GetFilePath(file_name), -1, wszFilePath, _MAX_PATH);
Gdiplus::Bitmap *pBitmap = Gdiplus::Bitmap::FromFile(wszFilePath);
for(unsigned int y = 0; y < pBitmap->GetHeight(); y++) {
for(unsigned int x = 0; x < pBitmap->GetWidth(); x++) {
+12 -11
View File
@@ -8,21 +8,19 @@
#include "dri.h"
#include "crc32.h"
extern char g_root[_MAX_PATH];
void AGS::load_cg(int page, int transparent)
{
if (nact->sys_ver == 3) {
// あゆみちゃん物語 フルカラー実写版
if(strncmp(acg, "CGA000.BMP", 10) == 0) {
char file_path[_MAX_PATH];
sprintf_s(file_path, _MAX_PATH, "%sCGA%03d.BMP", g_root, page);
load_bmp(file_path);
char file_name[_MAX_PATH];
sprintf_s(file_name, _MAX_PATH, "CGA%03d.BMP", page);
load_bmp(file_name);
return;
} else if(strncmp(acg, "CGB000.BMP", 10) == 0) {
char file_path[_MAX_PATH];
sprintf_s(file_path, _MAX_PATH, "%sCGB%03d.BMP", g_root, page);
load_bmp(file_path);
char file_name[_MAX_PATH];
sprintf_s(file_name, _MAX_PATH, "CGB%03d.BMP", page);
load_bmp(file_name);
return;
}
}
@@ -32,7 +30,7 @@ void AGS::load_cg(int page, int transparent)
if(data && size > 0) {
switch (nact->sys_ver) {
case 1:
switch (nact->crc32) {
switch (nact->crc32_a) {
case CRC32_BUNKASAI:
load_vsp(data, page, transparent);
break;
@@ -49,10 +47,13 @@ void AGS::load_cg(int page, int transparent)
}
break;
case 2:
if(nact->crc32 == CRC32_AYUMI_PROTO) {
if(nact->crc32_a == CRC32_AYUMI_PROTO) {
// あゆみちゃん物語 PROTO
load_gl3(data, page, transparent);
} else if(nact->crc32 == CRC32_SDPS_MARIA || nact->crc32 == CRC32_SDPS_TONO || nact->crc32 == CRC32_SDPS_KAIZOKU) {
} else if(nact->crc32_a == CRC32_AYUMI_FD || nact->crc32_a == CRC32_AYUMI_HINT) {
// あゆみちゃん物語
load_vsp(data, page, transparent);
} else if(nact->crc32_a == CRC32_SDPS) {
// Super D.P.S
load_pms(data, page, transparent);
} else {
+5 -5
View File
@@ -40,7 +40,7 @@ void AGS::load_pms(uint8* data, int page, int transparent)
tmp_palette[i * 16 + j] = SETPALETTE256(r, g, b);
}
}
if(nact->crc32 == CRC32_RANCE41 || nact->crc32 == CRC32_RANCE42 || nact->crc32 == CRC32_HASHIRIONNA2) {
if(nact->crc32_a == CRC32_RANCE41 || nact->crc32_a == CRC32_RANCE42 || nact->crc32_a == CRC32_HASHIRIONNA2) {
// 上下16色は取得しない
for(int i = 1; i < 15; i++) {
for(int j = 0; j < 16; j++) {
@@ -49,7 +49,7 @@ void AGS::load_pms(uint8* data, int page, int transparent)
}
}
}
} else if(nact->crc32 == CRC32_MUGENHOUYOU && transparent != -1) {
} else if(nact->crc32_a == CRC32_MUGENHOUYOU && transparent != -1) {
// Uコマンドでは上下32色は取得しない
for(int i = 2; i < 14; i++) {
for(int j = 0; j < 16; j++) {
@@ -71,8 +71,8 @@ void AGS::load_pms(uint8* data, int page, int transparent)
// パレット展開
if (nact->sys_ver == 3) {
if((extract_palette && extract_palette_cg[page]) || nact->crc32 == CRC32_FUNNYBEE_CD) {
if(nact->crc32 == CRC32_RANCE41 || nact->crc32 == CRC32_RANCE42 || nact->crc32 == CRC32_HASHIRIONNA2) {
if((extract_palette && extract_palette_cg[page]) || nact->crc32_a == CRC32_FUNNYBEE_CD) {
if(nact->crc32_a == CRC32_RANCE41 || nact->crc32_a == CRC32_RANCE42 || nact->crc32_a == CRC32_HASHIRIONNA2) {
// 上下16色は展開しない
for(int i = 1; i < 15; i++) {
for(int j = 0; j < 16; j++) {
@@ -81,7 +81,7 @@ void AGS::load_pms(uint8* data, int page, int transparent)
}
}
}
} else if(nact->crc32 == CRC32_MUGENHOUYOU && transparent != -1) {
} else if(nact->crc32_a == CRC32_MUGENHOUYOU && transparent != -1) {
// Uコマンドでは上下32色は展開しない
for(int i = 2; i < 14; i++) {
for(int j = 0; j < 16; j++) {
+3 -3
View File
@@ -28,7 +28,7 @@ void AGS::load_vsp(uint8* data, int page, int transparent)
}
// Zコマンドの処理
if(nact->crc32 == CRC32_AMBIVALENZ_FD || nact->crc32 == CRC32_AMBIVALENZ_CD) {
if(nact->crc32_a == CRC32_AMBIVALENZ_FD || nact->crc32_a == CRC32_AMBIVALENZ_CD) {
// Z 0,numを無視する
} else {
if(palette_bank != -1) {
@@ -37,7 +37,7 @@ void AGS::load_vsp(uint8* data, int page, int transparent)
}
// パレット取得
if(get_palette) {
if(get_palette && transparent != 101) {
int p = 0x0a;
for(int i = 0; i < 16; i++) {
uint32 b = data[p++] & 0xf;
@@ -48,7 +48,7 @@ void AGS::load_vsp(uint8* data, int page, int transparent)
}
// パレット展開
if(nact->crc32 == CRC32_FUNNYBEE_FD || nact->crc32 == CRC32_FUNNYBEE_CD || nact->crc32 == CRC32_FUNNYBEE_PATCH) {
if(nact->crc32_a == CRC32_FUNNYBEE_FD || nact->crc32_a == CRC32_FUNNYBEE_CD || nact->crc32_a == CRC32_FUNNYBEE_PATCH) {
if(extract_palette_cg[page]) {
for(int i = 0; i < 16; i++) {
screen_palette[base + i] = program_palette[base + i];
+36 -10
View File
@@ -8,21 +8,46 @@
#define _CRC32_H_
// ADISK.DATの先頭256bytes
// SYSTEM1
#define CRC32_CRESCENT 0x42351f2c // クレセントムーンがぁる
#define CRC32_BUNKASAI 0xc80f99b8 // あぶない文化祭前夜
#define CRC32_CRESCENT 0x42351f2c // クレセントムーンがぁる
#define CRC32_DPS 0x69ea4865 // D.P.S. - Dream Program System
#define CRC32_FUKEI 0x026de326 // 婦警さんVX (ALICEの館3 UNITBASE/Y_SYUREN.LZH)
#define CRC32_INTRUDER 0xa7520fb2 // Intruder -桜屋敷の探索-
#define CRC32_DPS_SG 0xab4cda48 // D.P.S. SG
#define CRC32_DPS_SG_FAHREN 0xe405d57c // D.P.S. SG - Fahren Fliegen
#define CRC32_DPS_SG_KATEI 0x23e67d18 // D.P.S. SG - 家庭教師はステキなお仕事
#define CRC32_DPS_SG_NOBUNAGA 0x2ec116f2 // D.P.S. SG - 信長の淫謀
#define CRC32_DPS_SG2 0xab4cda48 // D.P.S. SG set2
#define CRC32_DPS_SG2_ANTIQUE 0x41fe8b3d // D.P.S. SG set2 - ANTIQUE HOUSE
#define CRC32_DPS_SG2_IKENAI 0x6b562c09 // D.P.S. SG set2 - いけない内科検診再び
#define CRC32_DPS_SG2_AKAI 0x1098e78c // D.P.S. SG set2 - 朱い夜
#define CRC32_DPS_SG3 0xb77ae133 // D.P.S. SG SG set3
#define CRC32_DPS_SG3_RABBIT 0xa3228b6c // D.P.S. SG set3 - Rabbit P4P
#define CRC32_DPS_SG3_SHINKON 0x09b4448a // D.P.S. SG set3 - しんこんさんものがたり
#define CRC32_DPS_SG3_SOTSUGYOU 0xbc4525d8 // D.P.S. SG set3 - 卒業
#define CRC32_FUKEI 0x026de326 // 婦警さんVX
#define CRC32_INTRUDER 0xa7520fb2 // Intruder -桜屋敷の探索-
#define CRC32_TENGU 0xc942ff58 // あぶないてんぐ伝説
#define CRC32_VAMPIRE 0x957bcfbf // Little Vampire
#define CRC32_BUNKASAI 0 // あぶない文化祭前夜? (未確認)
#define CRC32_TOUSHIN_HINT 0xac337537 // 闘神都市 ヒントディスク
#define CRC32_VAMPIRE 0x957bcfbf // Little Vampire
#define CRC32_YAKATA 0x8cef6fa6 // ALICEの館
// SYSTEM2
#define CRC32_AYUMI_FD 0x4e2fed2a // あゆみちゃん物語 (FD)
#define CRC32_AYUMI_HINT 0xf6bd963a // あゆみちゃん物語 ヒントディスク
#define CRC32_AYUMI_PROTO 0x4e2f5678 // あゆみちゃん物語 PROTO
#define CRC32_SDPS 0xc7a20cdf // Super D.P.S
#define CRC32_SDPS_MARIA 0x80d4eaca // マリアとカンパン
#define CRC32_SDPS_TONO 0xbb1edff1 // 遠野の森
#define CRC32_SDPS_KAIZOKU 0xf81829e3 // 海賊家業
#define CRC32_DALK_HINT 0x4793b843 // DALK ヒントディスク
#define CRC32_DRSTOP 0x73fa86c4 // Dr. STOP!
#define CRC32_PROSTUDENTG_FD 0x5ffbfee7 // Prostudent -G- (FD)
#define CRC32_RANCE3_HINT 0x8d5ec610 // Rance3 ヒントディスク
#define CRC32_SDPS 0xc7a20cdf // Super D.P.S
#define CRC32_SDPS_MARIA 0x80d4eaca // Super D.P.S - マリアとカンパン
#define CRC32_SDPS_TONO 0xbb1edff1 // Super D.P.S - 遠野の森
#define CRC32_SDPS_KAIZOKU 0xf81829e3 // Super D.P.S - うれしたのし海賊稼業
#define CRC32_YAKATA2 0x2df591ff // ALICEの館II
// SYSTEM3
#define CRC32_AMBIVALENZ_FD 0xa6b48dfe // AmbivalenZ (FD)
#define CRC32_AMBIVALENZ_CD 0x4b10db69 // AmbivalenZ (CD)
@@ -42,7 +67,8 @@
#define CRC32_YAKATA3_CD 0x7f8f5e2a // アリスの館3 (CD)
#define CRC32_YAKATA3_FD 0x58ebcc99 // アリスの館3 (FD)
#define CRC32_HASHIRIONNA2 0x09f47cbd // 走り女2 (Rance 4.x ヒントディスク)
#define CRC32_TOUSHIN2_SP 0x2172c7b2 // 闘神都市2 〜そして、それから〜
#define CRC32_TOUSHIN2_GD 0xb5eba798 // 闘神都市2 グラフィックディスク
#define CRC32_TOUSHIN2_SP 0x2172c7b2 // 闘神都市2 そして、それから…
#define CRC32_OTOMESENKI 0x49a4db15 // 乙女戦記
#define CRC32_NINGYO 0xd491e7ab // 人魚 -蘿子-
#define CRC32_MUGENHOUYOU 0xbb27d1ba // 夢幻泡影
+157 -17
View File
@@ -8,17 +8,16 @@
#include "crc32.h"
#include "../fileio.h"
uint8* DRI::load(const char* path, int page, int* size)
uint8* DRI::load(const char* file_name, int page, int* size)
{
char base_path[_MAX_PATH];
strcpy_s(base_path, _MAX_PATH, path);
char tmp_name[_MAX_PATH];
strcpy_s(tmp_name, _MAX_PATH, file_name);
FILEIO* fio = new FILEIO();
// ページの位置を取得
base_path[0] = 'A';
if(!fio->Fopen(base_path, FILEIO_READ_BINARY)) {
tmp_name[0] = 'A';
if(!fio->Fopen(tmp_name, FILEIO_READ_BINARY)) {
delete fio;
return NULL;
}
@@ -48,9 +47,9 @@ uint8* DRI::load(const char* path, int page, int* size)
// A??.DAT以外にリンクされている場合はファイルを開き直す
if(disk_index != 1) {
base_path[0] = 'A' + disk_index - 1;
tmp_name[0] = 'A' + disk_index - 1;
fio->Fclose();
if(!fio->Fopen(base_path, FILEIO_READ_BINARY)) {
if(!fio->Fopen(tmp_name, FILEIO_READ_BINARY)) {
delete fio;
return NULL;
}
@@ -63,24 +62,86 @@ uint8* DRI::load(const char* path, int page, int* size)
int end_sector = fio->Fgetc();
end_sector |= fio->Fgetc() << 8;
int buffer_size = (end_sector - start_sector) * 256;
uint8* buffer = (uint8*)malloc(buffer_size);
if((*size = (end_sector - start_sector) * 256) == 0) {
// サイズ不正
fio->Fclose();
delete fio;
return NULL;
}
uint8 *buffer = (uint8 *)malloc(*size);
fio->Fseek((start_sector - 1) * 256, FILEIO_SEEK_SET);
fio->Fread(buffer, 256, end_sector - start_sector);
fio->Fclose();
delete fio;
*size = buffer_size;
return buffer;
}
uint8* DRI::load_mda(uint32 crc32, int page, int* size)
uint8* DRI::load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size)
{
// データ取得
const char* fname = NULL;
switch(crc32) {
switch(crc32_a) {
case CRC32_BUNKASAI: // あぶない文化祭前夜
fname = "AMUS_AB.MDA";
break;
case CRC32_CRESCENT: // クレセントムーンがぁる
fname = "AMUS_CRS.MDA";
break;
case CRC32_DPS: // D.P.S. - Dream Program System
fname = "AMUS_DPS.MDA";
break;
case CRC32_DPS_SG: // D.P.S. SG
// case CRC32_DPS_SG2: // D.P.S. SG set2
case CRC32_DPS_SG3: // D.P.S. SG set2
fname = "AMUS_SG.MDA";
break;
case CRC32_FUKEI: // 婦警さんVX
fname = "AMUS_VX.MDA";
break;
case CRC32_INTRUDER: // Intruder -桜屋敷の探索-
fname = "AMUS_INT";
break;
case CRC32_TENGU: // あぶないてんぐ伝説
fname = "AMUS_AT";
break;
case CRC32_TOUSHIN_HINT: // 闘神都市 ヒントディスク
fname = "AMUS_T1";
break;
case CRC32_VAMPIRE: // Little Vampire
fname = "AMUS_LP2";
break;
case CRC32_YAKATA: // ALICEの館
fname = "AMUS_AL1";
break;
case CRC32_AYUMI_FD: // あゆみちゃん物語 (FD)
case CRC32_AYUMI_HINT: // あゆみちゃん物語 ヒントディスク
case CRC32_AYUMI_PROTO: // あゆみちゃん物語 PROTO
fname = "AMUS_AYM";
break;
case CRC32_DALK_HINT: // DALK ヒントディスク
fname = "AMUS_DLK";
break;
case CRC32_DRSTOP: // Dr. STOP!
fname = "AMUS_DRS";
break;
case CRC32_PROSTUDENTG_FD: // Prostudent -G- (FD)
fname = "AMUS_PSG";
break;
case CRC32_RANCE3_HINT: // Rance3 ヒントディスク
fname = "AMUS_R3H";
break;
case CRC32_SDPS: // Super D.P.S
fname = "AMUS_SDP";
break;
case CRC32_YAKATA2: // ALICEの館II
fname = "AMUS_AL2";
break;
case CRC32_AMBIVALENZ_FD: // AmbivalenZ (FD)
case CRC32_AMBIVALENZ_CD: // AmbivalenZ (CD)
fname = "AMUS_AMB.MDA";
@@ -118,6 +179,9 @@ uint8* DRI::load_mda(uint32 crc32, int page, int* size)
case CRC32_HASHIRIONNA2: // 走り女2 (Rance 4.x ヒントディスク)
fname = "AMUS_RG2.MDA";
break;
case CRC32_TOUSHIN2_GD: // 闘神都市2 グラフィックディスク
fname = "AMUS_T2";
break;
case CRC32_OTOMESENKI: // 乙女戦記
fname = "AMUS_OTM.MDA";
break;
@@ -142,6 +206,7 @@ uint8* DRI::load_mda(uint32 crc32, int page, int* size)
if(page > (data_sector - link_sector) * 128 - 1) {
// ページ番号不正
fclose(fp);
return NULL;
}
@@ -152,6 +217,79 @@ uint8* DRI::load_mda(uint32 crc32, int page, int* size)
if(disk_index == 0 || disk_index == 0x1a) {
// 欠番
fclose(fp);
return NULL;
}
// AMUS.MDA以外にリンクされている場合はリソースを開き直す
if(disk_index == 2) {
fclose(fp);
switch(crc32_b) {
case CRC32_DPS_SG_FAHREN: // D.P.S. SG - Fahren Fliegen
fname = "BMUS_FAH";
break;
case CRC32_DPS_SG_KATEI: // D.P.S. SG - 家庭教師はステキなお仕事
fname = "BMUS_KAT";
break;
case CRC32_DPS_SG_NOBUNAGA: // D.P.S. SG - 信長の淫謀
fname = "BMUS_NOB";
break;
case CRC32_DPS_SG2_ANTIQUE: // D.P.S. SG set2 - ANTIQUE HOUSE
fname = "BMUS_ANT";
break;
case CRC32_DPS_SG2_IKENAI: // D.P.S. SG set2 - いけない内科検診再び
fname = "BMUS_NAI";
break;
case CRC32_DPS_SG2_AKAI: // D.P.S. SG set2 - 朱い夜
fname = "BMUS_AKA";
break;
case CRC32_DPS_SG3_RABBIT: // D.P.S. SG set3 - Rabbit P4P
fname = "BMUS_RAB";
break;
case CRC32_DPS_SG3_SHINKON: // D.P.S. SG set3 - しんこんさんものがたり
fname = "BMUS_SIN";
break;
case CRC32_DPS_SG3_SOTSUGYOU: // D.P.S. SG set3 - 卒業
fname = "BMUS_SOT";
break;
case CRC32_SDPS_MARIA: // Super D.P.S - マリアとカンパン
fname = "BMUS_MTK";
break;
case CRC32_SDPS_TONO: // Super D.P.S - 遠野の森
fname = "BMUS_TNM";
break;
case CRC32_SDPS_KAIZOKU: // Super D.P.S - うれしたのし海賊稼業
fname = "BMUS_KAM";
break;
default:
fname = NULL;
break;
}
if(fname == NULL) {
return NULL;
}
fp = fopen(fname, "rb");
if (!fp)
return NULL;
} else if(disk_index == 3) {
fclose(fp);
switch(crc32_a) {
case CRC32_TOUSHIN_HINT: // 闘神都市 ヒントディスク
fname = "CMUS_T1";
break;
default:
fname = NULL;
break;
}
if(fname == NULL) {
return NULL;
}
fp = fopen(fname, "rb");
if (!fp)
return NULL;
} else if(disk_index != 1) {
// AMUS.MDA以外にリンクされている場合は失敗
fclose(fp);
return NULL;
}
@@ -161,14 +299,16 @@ uint8* DRI::load_mda(uint32 crc32, int page, int* size)
int start_sector = buf[0] | (buf[1] << 8);
int end_sector = buf[2] | (buf[3] << 8);
int buffer_size = (end_sector - start_sector) * 256;
uint8* buffer = (uint8*)malloc(buffer_size);
if((*size = (end_sector - start_sector) * 256) == 0) {
// サイズ不正
return NULL;
}
uint8* buffer = (uint8*)malloc(*size);
fseek(fp, (start_sector - 1) * 256, SEEK_SET);
fread(buffer, buffer_size, 1, fp);
fread(buffer, *size, 1, fp);
fclose(fp);
*size = buffer_size;
return buffer;
}
+2 -2
View File
@@ -15,8 +15,8 @@ public:
DRI() {}
~DRI() {}
uint8* load(const char* path, int page, int* size);
uint8* load_mda(uint32 crc32, int page, int* size);
uint8* load(const char* file_name, int page, int* size);
uint8* load_mda(uint32 crc32_a, uint32 crc32_b, int page, int* size);
};
#endif
+2 -2
View File
@@ -302,7 +302,7 @@ std::vector<uint8> MAKOMidi::generate_smf(int current_max)
w.send_3bytes(0xb0 + play[i].channel, 0x0a, play[i].pan);
}
else if(d0 == 0xec) {
if (nact->crc32 != CRC32_DPS)
if(!(nact->crc32_a == CRC32_DPS || nact->crc32_a == CRC32_DPS_SG || nact->crc32_a == CRC32_DPS_SG2 || nact->crc32_a == CRC32_DPS_SG3))
mute_flag = true;
}
else if(d0 == 0xf5) {
@@ -570,7 +570,7 @@ void MAKOMidi::load_mda(int page)
int size;
uint8* data = NULL;
if((data = dri->load(path, page, &size)) == NULL) {
data = dri->load_mda(nact->crc32, page, &size);
data = dri->load_mda(nact->crc32_a, nact->crc32_b, page, &size);
}
if(data) {
+65 -24
View File
@@ -16,8 +16,8 @@ extern SDL_Window* g_window;
// 初期化
NACT::NACT(int sys_ver, uint32 crc32, const char* font_file, const char* playlist)
: sys_ver(sys_ver), crc32(crc32)
NACT::NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist)
: sys_ver(sys_ver), crc32_a(crc32_a), crc32_b(crc32_b)
{
// デバッグコンソール起動
initialize_console();
@@ -27,16 +27,16 @@ NACT::NACT(int sys_ver, uint32 crc32, const char* font_file, const char* playlis
if(fio->Fopen("AG00.DAT", FILEIO_READ_BINARY)) {
int d0, d1, d2, d3;
char string[MAX_CAPTION];
fio->Fgets(string);
fio->Fgets(string, MAX_CAPTION);
sscanf_s(string, "%d,%d,%d,%d", &d0, &d1, &d2, &d3);
for(int i = 0; i < d1; i++) {
// 動詞の読み込み
fio->Fgets(string);
fio->Fgets(string, MAX_CAPTION);
memcpy(caption_verb[i], string, sizeof(string));
}
for(int i = 0; i < d2; i++) {
// 目的語の読み込み
fio->Fgets(string);
fio->Fgets(string, MAX_CAPTION);
memcpy(caption_obj[i], string, sizeof(string));
}
fio->Fclose();
@@ -44,7 +44,7 @@ NACT::NACT(int sys_ver, uint32 crc32, const char* font_file, const char* playlis
delete fio;
// ADISK.DAT
if (crc32 == CRC32_PROG_OMAKE)
if (crc32_a == CRC32_PROG_OMAKE)
strcpy_s(adisk, 16, "AGAME.DAT");
else
strcpy_s(adisk, 16, "ADISK.DAT");
@@ -165,6 +165,7 @@ void NACT::execute(T* impl)
}
// 1コマンド実行
prev_addr = scenario_addr;
uint8 cmd = getd();
if(set_palette && cmd != 'P') {
@@ -290,12 +291,14 @@ void NACT::execute(T* impl)
default:
if(cmd == 0x20 || (0xa1 <= cmd && cmd <= 0xdd)) {
// message (1 byte)
char string[2];
char string[3];
string[0] = cmd;
string[1] = '\0';
ags->draw_text(string);
if(crc32 == CRC32_DPS && !ags->draw_menu) {
text_refresh = false;
if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) {
if(!ags->draw_menu) {
text_refresh = false;
}
}
if(!ags->draw_menu && text_wait_enb && cmd != 0x20) {
@@ -314,10 +317,13 @@ void NACT::execute(T* impl)
SDL_Delay(16);
}
}
#if defined(_DEBUG_CONSOLE)
if(!ags->draw_hankaku) {
uint16 code = ags->convert_zenkaku(cmd);
string[0] = code >> 8;
string[1] = code & 0xff;
string[2] = '\0';
}
output_console(string);
#endif
} else if((0x81 <= cmd && cmd <= 0x9f) || 0xe0 <= cmd) {
// message (2 bytes)
char string[3];
@@ -325,8 +331,10 @@ void NACT::execute(T* impl)
string[1] = getd();
string[2] = '\0';
ags->draw_text(string);
if(crc32 == CRC32_DPS && !ags->draw_menu) {
text_refresh = false;
if(crc32_a == CRC32_DPS || crc32_a == CRC32_DPS_SG || crc32_a == CRC32_DPS_SG2 || crc32_a == CRC32_DPS_SG3) {
if(!ags->draw_menu) {
text_refresh = false;
}
}
if(!ags->draw_menu && text_wait_enb) {
@@ -345,12 +353,13 @@ void NACT::execute(T* impl)
SDL_Delay(16);
}
}
#if defined(_DEBUG_CONSOLE)
output_console(string);
#endif
} else {
fatal("Unknown command %2x at %d", cmd, scenario_addr);
if(cmd >= 0x20 && cmd < 0x7f) {
fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr);
} else {
fatal("Unknown Command: %02x at page = %d, addr = %d", cmd, scenario_page, prev_addr);
}
}
break;
}
@@ -372,13 +381,44 @@ void NACT::load_scenario(int page)
uint16 NACT::random(uint16 range)
{
// xorhift32
// xorshift32
seed = seed ^ (seed << 13);
seed = seed ^ (seed >> 17);
seed = seed ^ (seed << 15);
return (uint16)(((uint32)range * (seed & 0xffff)) >> 16) + 1;
}
void NACT::wait_after_open_menu()
{
// 連打による誤クリック防止
Uint32 dwTime = SDL_GetTicks();
Uint32 dwWait = dwTime + 400;
while(dwTime < dwWait) {
if(terminate) {
return;
}
/*
if(get_key() == 16) {
break;
}
*/
SDL_Delay(10);
dwTime = SDL_GetTicks();
}
// クリック中の間は待機
for(;;) {
if(terminate) {
return;
}
if(!get_key()) {
break;
}
SDL_Delay(10);
}
}
// WinMainとのインターフェース
int NACT::get_screen_height()
@@ -418,14 +458,15 @@ void NACT::fatal(const char* format, ...) {
}
NACT* NACT::create(const char* game_id, const char* font_file, const char* playlist) {
uint32 crc32 = NACT::calc_crc32(game_id);
int sys_ver = NACT::get_sys_ver(crc32);
uint32 crc32_a = NACT::calc_crc32("ADISK.DAT", game_id);
uint32 crc32_b = NACT::calc_crc32("BDISK.DAT", game_id);
int sys_ver = NACT::get_sys_ver(crc32_a, crc32_b);
switch (sys_ver) {
case 1:
return new NACT_Sys1(crc32, font_file, playlist);
return new NACT_Sys1(crc32_a, crc32_b, font_file, playlist);
case 2:
return new NACT_Sys2(crc32, font_file, playlist);
return new NACT_Sys2(crc32_a, crc32_b, font_file, playlist);
default:
return new NACT_Sys3(crc32, font_file, playlist);
return new NACT_Sys3(crc32_a, crc32_b, font_file, playlist);
}
}
+13 -12
View File
@@ -87,7 +87,7 @@ class NACT
{
public:
static NACT* create(const char* game_id, const char* font_file, const char* playlist);
NACT(int sys_ver, uint32 crc32, const char* font_file, const char* playlist);
NACT(int sys_ver, uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist);
virtual ~NACT();
protected:
@@ -109,7 +109,7 @@ protected:
int scenario_size;
// アドレス、ページ管理
int scenario_addr;
int scenario_addr, prev_addr;
int scenario_page;
int label_depth;
int label_stack[MAX_STACK];
@@ -162,6 +162,8 @@ protected:
uint16 random(uint16 range);
uint32 seed;
void wait_after_open_menu();
uint8 get_key();
void get_cursor(int* x, int* y);
void set_cursor(int x, int y);
@@ -172,7 +174,7 @@ protected:
#endif
int mouse_x = 0, mouse_y = 0;
static uint32 calc_crc32(const char* game_id);
static uint32 calc_crc32(const char* file_name, const char* game_id);
// Y27 ダイアログ
void text_dialog();
@@ -193,20 +195,21 @@ public:
void select_sound(int dev);
const char* get_game_id();
static const int get_sys_ver(uint32 crc32);
static const int get_sys_ver(uint32 crc32_a, uint32 crc32_b);
const char* get_title();
bool text_skip_enb; // メッセージスキップ
bool text_wait_enb; // テキスト表示のウェイト有効/無効
int sys_ver;
uint32 crc32;
uint32 crc32_a; // ADISK
uint32 crc32_b; // BDISK for D.P.S -SG- and Super D.P.S
// for Y27
char tvar[10][22];
char tvar[10][33];
int tvar_index, tvar_maxlen;
// デバッグログ
void output_console(char log[]);
void output_console(const char *format, ...);
int get_scenario_page() const { return scenario_page; }
@@ -215,7 +218,7 @@ public:
class NACT_Sys1 : public NACT {
public:
NACT_Sys1(uint32 crc32, const char* font_file, const char* playlist);
NACT_Sys1(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist);
void cmd_calc();
void cmd_branch();
void cmd_label_jump();
@@ -258,8 +261,6 @@ private:
uint16 cali();
uint16 cali2();
int menu_max; // メニューの改ページ
// Intruder Zコマンド
int paint_x;
int paint_y;
@@ -268,7 +269,7 @@ private:
class NACT_Sys2 : public NACT {
public:
NACT_Sys2(uint32 crc32, const char* font_file, const char* playlist);
NACT_Sys2(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist);
void cmd_calc();
void cmd_branch();
void cmd_label_jump();
@@ -314,7 +315,7 @@ private:
class NACT_Sys3 : public NACT {
public:
NACT_Sys3(uint32 crc32, const char* font_file, const char* playlist);
NACT_Sys3(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist);
void cmd_calc();
void cmd_branch();
void cmd_label_jump();
+65 -73
View File
@@ -13,52 +13,72 @@ namespace {
const struct CRCTable {
const char* id;
int sys_ver;
uint32 crc32;
const char* title;
uint32 crc32_a;
uint32 crc32_b;
} crc_table[] = {
{"crescent", 1, CRC32_CRESCENT, "クレセントムーンがぁる"},
{"dps", 1, CRC32_DPS, "D.P.S - Dream Program System"},
{"fukei", 1, CRC32_FUKEI, "婦警さんVX"},
{"intruder", 1, CRC32_INTRUDER, "Intruder -桜屋敷の探索-"},
{"tengu", 1, CRC32_TENGU, "あぶないてんぐ伝説"},
{"little_vampire", 1, CRC32_VAMPIRE, "Little Vampire"},
{"bunkasai", 1, "あぶない文化祭前夜", CRC32_BUNKASAI},
{"crescent", 1, "クレセントムーンがぁる", CRC32_CRESCENT},
{"dps", 1, "D.P.S - Dream Program System", CRC32_DPS},
{"dps_sg_fahren", 1, "D.P.S SG - Fahren Fliegen", CRC32_DPS_SG, CRC32_DPS_SG_FAHREN},
{"dps_sg_katei", 1, "D.P.S SG - 家庭教師はステキなお仕事", CRC32_DPS_SG, CRC32_DPS_SG_KATEI},
{"dps_sg_nobunaga", 1, "D.P.S SG - 信長の淫謀", CRC32_DPS_SG, CRC32_DPS_SG_NOBUNAGA},
{"dps_sg2_antique", 1, "D.P.S SG set2 - ANTIQUE HOUSE", CRC32_DPS_SG2, CRC32_DPS_SG2_ANTIQUE},
{"dps_sg2_ikenai", 1, "D.P.S SG set2 - いけない内科検診再び", CRC32_DPS_SG2, CRC32_DPS_SG2_IKENAI},
{"dps_sg2_akai", 1, "D.P.S SG set2 - 朱い夜", CRC32_DPS_SG2, CRC32_DPS_SG2_AKAI},
{"dps_sg3_rabbit", 1, "D.P.S SG set3 - Rabbit P4P", CRC32_DPS_SG3, CRC32_DPS_SG3_RABBIT},
{"dps_sg3_shinkon", 1, "D.P.S SG set3 - しんこんさんものがたり", CRC32_DPS_SG3, CRC32_DPS_SG3_SHINKON},
{"dps_sg3_sotsugyou", 1, "D.P.S SG set3 - 卒業", CRC32_DPS_SG3, CRC32_DPS_SG3_SOTSUGYOU},
{"fukei", 1, "婦警さんVX", CRC32_FUKEI},
{"intruder", 1, "Intruder -桜屋敷の探索-", CRC32_INTRUDER},
{"tengu", 1, "あぶないてんぐ伝説", CRC32_TENGU},
{"toushin_hint", 1, "闘神都市 ヒントディスク", CRC32_TOUSHIN_HINT},
{"little_vampire", 1, "Little Vampire", CRC32_VAMPIRE},
{"yakata", 1, "ALICEの館", CRC32_YAKATA},
{"ayumi_proto", 2, CRC32_AYUMI_PROTO, "あゆみちゃん物語 PROTO"},
{"sdps_maria", 2, CRC32_SDPS_MARIA, "Super D.P.S"},
{"sdps_tono", 2, CRC32_SDPS_TONO, "Super D.P.S"},
{"sdps_kaizoku", 2, CRC32_SDPS_KAIZOKU, "Super D.P.S"},
{"prog_fd", 2, CRC32_PROSTUDENTG_FD, "Prostudent G"},
{"ayumi_fd", 2, "あゆみちゃん物語", CRC32_AYUMI_FD},
{"ayumi_hint", 2, "あゆみちゃん物語 ヒントディスク", CRC32_AYUMI_HINT},
{"ayumi_proto", 2, "あゆみちゃん物語 PROTO", CRC32_AYUMI_PROTO},
{"dalk_hint", 2, "DALK ヒントディスク", CRC32_DALK_HINT},
{"drstop", 2, "Dr. STOP!", CRC32_DRSTOP},
{"prog_fd", 2, "Prostudent G", CRC32_PROSTUDENTG_FD},
{"rance3_hint", 2, "Rance3 ヒントディスク", CRC32_RANCE3_HINT},
{"sdps_maria", 2, "Super D.P.S - マリアとカンパン", CRC32_SDPS, CRC32_SDPS_MARIA},
{"sdps_tono", 2, "Super D.P.S - 遠野の森", CRC32_SDPS, CRC32_SDPS_TONO},
{"sdps_kaizoku", 2, "Super D.P.S - うれしたのし海賊稼業", CRC32_SDPS, CRC32_SDPS_KAIZOKU},
{"yakata2", 2, "ALICEの館II", CRC32_YAKATA2},
{"ambivalenz_fd", 3, CRC32_AMBIVALENZ_FD, "AmbivalenZ −二律背反−"},
{"ambivalenz_cd", 3, CRC32_AMBIVALENZ_CD, "AmbivalenZ −二律背反−"},
{"dps_all", 3, CRC32_DPSALL, "D.P.S. 全部"},
{"funnybee_cd", 3, CRC32_FUNNYBEE_CD, "宇宙快盗ファニーBee"},
// {"funnybee_patch", 3, CRC32_FUNNYBEE_PATCH, "宇宙快盗ファニーBee"},
{"funnybee_fd", 3, CRC32_FUNNYBEE_FD, "宇宙快盗ファニーBee"},
{"onlyyou", 3, CRC32_ONLYYOU, "Only You −世紀末のジュリエット達−"},
{"onlyyou_demo", 3, CRC32_ONLYYOU_DEMO, "Only You −世紀末のジュリエット達− デモ版"},
{"prog_cd", 3, CRC32_PROSTUDENTG_CD, "Prostudent G"},
{"prog_omake", 3, CRC32_PROG_OMAKE, "Prostudent G おまけ"},
{"rance41", 3, CRC32_RANCE41, "ランス 4.1 〜お薬工場を救え!〜"},
{"rance42", 3, CRC32_RANCE42, "ランス 4.2 〜エンジェル組〜"},
{"ayumi_cd", 3, CRC32_AYUMI_CD, "あゆみちゃん物語"},
{"ayumi_live_256", 3, CRC32_AYUMI_JISSHA_256, "あゆみちゃん物語 実写版"},
{"ayumi_live_full", 3, CRC32_AYUMI_JISSHA_FULL, "あゆみちゃん物語 フルカラー実写版"},
{"yakata3_cd", 3, CRC32_YAKATA3_CD, "アリスの館3"},
{"yakata3_fd", 3, CRC32_YAKATA3_FD, "アリスの館3"},
{"hashirionna2", 3, CRC32_HASHIRIONNA2, "走り女2"},
{"toushin2_sp", 3, CRC32_TOUSHIN2_SP, "闘神都市2 そして、それから…"},
{"otome", 3, CRC32_OTOMESENKI, "乙女戦記"},
{"ningyo", 3, CRC32_NINGYO, "人魚 -蘿子-"},
{"mugen", 3, CRC32_MUGENHOUYOU, "夢幻泡影"},
{"ambivalenz_fd", 3, "AmbivalenZ −二律背反−", CRC32_AMBIVALENZ_FD},
{"ambivalenz_cd", 3, "AmbivalenZ −二律背反−", CRC32_AMBIVALENZ_CD},
{"dps_all", 3, "D.P.S. 全部", CRC32_DPSALL},
{"funnybee_cd", 3, "宇宙快盗ファニーBee", CRC32_FUNNYBEE_CD},
// {"funnybee_patch", 3, "宇宙快盗ファニーBee", CRC32_FUNNYBEE_PATCH},
{"funnybee_fd", 3, "宇宙快盗ファニーBee", CRC32_FUNNYBEE_FD},
{"onlyyou", 3, "Only You −世紀末のジュリエット達−", CRC32_ONLYYOU},
{"onlyyou_demo", 3, "Only You −世紀末のジュリエット達− デモ版", CRC32_ONLYYOU_DEMO},
{"prog_cd", 3, "Prostudent G", CRC32_PROSTUDENTG_CD},
{"prog_omake", 3, "Prostudent G おまけ", CRC32_PROG_OMAKE},
{"rance41", 3, "ランス 4.1 〜お薬工場を救え!〜", CRC32_RANCE41},
{"rance42", 3, "ランス 4.2 〜エンジェル組〜", CRC32_RANCE42},
{"ayumi_cd", 3, "あゆみちゃん物語", CRC32_AYUMI_CD},
{"ayumi_live_256", 3, "あゆみちゃん物語 実写版", CRC32_AYUMI_JISSHA_256},
{"ayumi_live_full", 3, "あゆみちゃん物語 フルカラー実写版", CRC32_AYUMI_JISSHA_FULL},
{"yakata3_cd", 3, "アリスの館3", CRC32_YAKATA3_CD},
{"yakata3_fd", 3, "アリスの館3", CRC32_YAKATA3_FD},
{"hashirionna2", 3, "走り女2", CRC32_HASHIRIONNA2},
{"toushin2_gd", 3,"闘神都市2 グラフィックディスク", CRC32_TOUSHIN2_GD},
{"toushin2_sp", 3, "闘神都市2 そして、それから…", CRC32_TOUSHIN2_SP},
{"otome", 3, "乙女戦記", CRC32_OTOMESENKI},
{"ningyo", 3, "人魚 -蘿子-", CRC32_NINGYO},
{"mugen", 3, "夢幻泡影", CRC32_MUGENHOUYOU},
{NULL, 0, 0, NULL},
{NULL},
};
const CRCTable* lookup(uint32 crc32)
const CRCTable* lookup(uint32 crc32_a, uint32 crc32_b)
{
for (const CRCTable* t = crc_table; t->id; t++) {
if (crc32 == t->crc32)
if (crc32_a == t->crc32_a && (!t->crc32_b || crc32_b == t->crc32_b))
return t;
}
return NULL;
@@ -66,18 +86,19 @@ const CRCTable* lookup(uint32 crc32)
} // namespace
uint32 NACT::calc_crc32(const char* game_id)
uint32 NACT::calc_crc32(const char* file_name, const char* game_id)
{
if (game_id) {
for (const CRCTable* t = crc_table; t->id; t++) {
if (strcmp(t->id, game_id) == 0)
return t->crc32;
return file_name[0] == 'A' ? t->crc32_a : t->crc32_b;
}
}
uint32 crc = 0;
FILEIO* fio = new FILEIO();
if(fio->Fopen("ADISK.DAT", FILEIO_READ_BINARY)) {
if(fio->Fopen(file_name, FILEIO_READ_BINARY)) {
uint32 table[256];
for(int i = 0; i < 256; i++) {
uint32 c = i;
@@ -99,56 +120,27 @@ uint32 NACT::calc_crc32(const char* game_id)
}
fio->Fclose();
}
if(crc == CRC32_SDPS) {
// Super D.P.Sの場合はBDISK.DATのCRCを取る
if(fio->Fopen("BDISK.DAT", FILEIO_READ_BINARY)) {
uint32 table[256];
for(int i = 0; i < 256; i++) {
uint32 c = i;
for(int j = 0; j < 8; j++) {
if(c & 1) {
c = (c >> 1) ^ 0xedb88320;
} else {
c >>= 1;
}
}
table[i] = c;
}
// BDISK.DATの先頭256bytes
crc = 0;
for(int i = 0; i < 256; i++) {
int d = fio->Fgetc();
uint32 c = ~crc;
c = table[(c ^ d) & 0xff] ^ (c >> 8);
crc = ~c;
}
fio->Fclose();
}
}
delete fio;
#if 0
printf("CRC: %x\n", crc);
#endif
return crc;
}
const char* NACT::get_game_id()
{
if (const CRCTable* entry = lookup(crc32))
if (const CRCTable* entry = lookup(crc32_a, crc32_b))
return entry->id;
return NULL;
}
const int NACT::get_sys_ver(uint32 crc32)
const int NACT::get_sys_ver(uint32 crc32_a, uint32 crc32_b)
{
if (const CRCTable* entry = lookup(crc32))
if (const CRCTable* entry = lookup(crc32_a, crc32_b))
return entry->sys_ver;
return 3;
}
const char* NACT::get_title()
{
if (const CRCTable* entry = lookup(crc32))
if (const CRCTable* entry = lookup(crc32_a, crc32_b))
return entry->title;
return NULL;
}
+244 -344
View File
File diff suppressed because it is too large Load Diff
+247 -269
View File
@@ -55,8 +55,8 @@
} \
}
NACT_Sys2::NACT_Sys2(uint32 crc32, const char* font_file, const char* playlist)
: NACT(2, crc32, font_file, playlist)
NACT_Sys2::NACT_Sys2(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist)
: NACT(2, crc32_a, crc32_b, font_file, playlist)
{
}
@@ -70,11 +70,7 @@ void NACT_Sys2::cmd_calc()
}
var[index] = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n!var[%d]:%d!", index, var[index]);
output_console(log);
#endif
output_console("\n!var[%d]:%d!", index, var[index]);
}
void NACT_Sys2::cmd_branch()
@@ -84,7 +80,9 @@ void NACT_Sys2::cmd_branch()
bool set_menu = false;
if(!condition) {
// 次の'}'命令までスキップする(ネストも考慮する)
for(;;) {
prev_addr = scenario_addr;
uint8 cmd = getd();
if(cmd == '!') {
@@ -103,19 +101,16 @@ void NACT_Sys2::cmd_branch()
break;
}
} else if(cmd == '@') {
getd();
getd();
getw();
} else if(cmd == '\\') {
getd();
getd();
getw();
} else if(cmd == '&') {
cali();
} else if(cmd == '%') {
cali();
} else if(cmd == '$') {
if(!set_menu) {
getd();
getd();
getw();
set_menu = true;
} else {
set_menu = false;
@@ -123,14 +118,12 @@ void NACT_Sys2::cmd_branch()
} else if(cmd == '[') {
getd();
getd();
getd();
getd();
getw();
} else if(cmd == ':') {
cali();
getd();
getd();
getd();
getd();
getw();
} else if(cmd == ']') {
} else if(cmd == 'A') {
@@ -166,7 +159,8 @@ void NACT_Sys2::cmd_branch()
} else if(cmd == 'I') {
cali();
cali();
getd();
// getd();
cali();
} else if(cmd == 'J') {
cali();
cali();
@@ -206,11 +200,48 @@ void NACT_Sys2::cmd_branch()
cali();
cali();
} else if(cmd == 'U') {
getd();
getd();
if(crc32_a == CRC32_YAKATA2) {
cali();
cali();
} else {
getd();
getd();
}
} else if(cmd == 'V') {
#if 1
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
cali();
#else
cali();
cali();
#endif
} else if(cmd == 'W') {
cali();
cali();
@@ -230,17 +261,17 @@ void NACT_Sys2::cmd_branch()
// message (2 bytes)
getd();
} else {
fatal("cmd_branch: invalid command %2x", cmd);
if(cmd >= 0x20 && cmd < 0x7f) {
fatal("Unknown Command: '%c' at page = %d, addr = %d", cmd, scenario_page, prev_addr);
} else {
fatal("Unknown Command: %02x at page = %d, addr = %d", cmd, scenario_page, prev_addr);
}
break;
}
}
}
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n{%d:", condition);
output_console(log);
#endif
output_console("\n{%d:", condition);
}
void NACT_Sys2::cmd_label_jump()
@@ -248,22 +279,14 @@ void NACT_Sys2::cmd_label_jump()
int next_addr = getw();
scenario_addr = next_addr;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n@%x:", next_addr);
output_console(log);
#endif
output_console("\n@%x:", next_addr);
}
void NACT_Sys2::cmd_label_call()
{
int next_addr = getw();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n\\%x:", next_addr);
output_console(log);
#endif
output_console("\n\\%x:", next_addr);
if(next_addr == 0) {
// リターン
@@ -285,22 +308,14 @@ void NACT_Sys2::cmd_page_jump()
scenario_page = next_page;
scenario_addr = 2;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n&%d:", next_page);
output_console(log);
#endif
output_console("\n&%d:", next_page);
}
void NACT_Sys2::cmd_page_call()
{
int next_page = cali(), next_addr;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n%%%d:", next_page);
output_console(log);
#endif
output_console("\n%%%d:", next_page);
if(next_page == 0) {
// リターン
@@ -327,11 +342,7 @@ void NACT_Sys2::cmd_set_menu()
ags->menu_dest_y += ags->menu_font_size + 2;
ags->draw_menu = false;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "$");
output_console(log);
#endif
output_console("$");
} else {
if(!menu_index) {
ags->clear_menu_window();
@@ -342,42 +353,21 @@ void NACT_Sys2::cmd_set_menu()
ags->menu_dest_y += 2;
ags->draw_menu = true;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n$%x,", menu_addr[menu_index - 1]);
output_console(log);
#endif
output_console("\n$%x,", menu_addr[menu_index - 1]);
}
}
void NACT_Sys2::cmd_open_menu()
{
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n]");
output_console(log);
#endif
output_console("\n]");
if(!menu_index) {
scenario_addr = scenario_data[0] | (scenario_data[1] << 8);
return;
}
// クリック中の間は待機
for(;;) {
if(terminate) {
return;
}
// if(get_key() != 32) {
if(!get_key()) {
break;
}
SDL_Delay(10);
}
// メニュー表示
ags->open_menu_window(menu_window);
int current_index = 0;
// マウス移動
int sx = ags->menu_w[menu_window - 1].sx;
@@ -386,17 +376,20 @@ void NACT_Sys2::cmd_open_menu()
int mx = ex - 16;
int my = sy + 10;
int height = ags->menu_font_size + 4;
int current_index = 0;
set_cursor(mx, my);
wait_after_open_menu();
// メニュー選択
for(;;) {
for(bool selectable = true;;) {
// 入力待機
int val = 0, current_mx = mx, current_my = my;
for(;;) {
if(terminate) {
return;
}
if((val = get_key())) {
if((val = get_key()) != 0) {
SDL_Delay(100);
break;
}
@@ -425,6 +418,9 @@ void NACT_Sys2::cmd_open_menu()
if(sx <= mx && mx <= ex && 0 <= index && index < menu_index) {
current_index = index;
ags->redraw_menu_window(menu_window, current_index);
selectable = true;
} else {
selectable = false;
}
} else if(val == 1 || val == 2 || val == 4 || val == 8) {
if(val == 1) {
@@ -437,7 +433,8 @@ void NACT_Sys2::cmd_open_menu()
current_index = menu_index - 1;
}
ags->redraw_menu_window(menu_window, current_index);
} else if(val == 16) {
selectable = true;
} else if(val == 16 && selectable) {
break;
} else if(val == 32) {
current_index = -1;
@@ -468,11 +465,7 @@ void NACT_Sys2::cmd_set_verbobj()
menu_obj[menu_index++] = obj;
verb_obj = true;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]);
output_console(log);
#endif
output_console("\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]);
}
void NACT_Sys2::cmd_set_verbobj2()
@@ -489,21 +482,13 @@ void NACT_Sys2::cmd_set_verbobj2()
}
verb_obj = true;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]);
output_console(log);
#endif
output_console("\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]);
}
void NACT_Sys2::cmd_open_verb()
{
// 動詞メニューの表示
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nopen verb-obj menu");
output_console(log);
#endif
output_console("\nopen verb-obj menu");
verb_obj = false;
// 表示する動詞のチェック
@@ -532,21 +517,8 @@ void NACT_Sys2::cmd_open_verb()
}
ags->draw_menu = false;
// クリック中の間は待機
for(;;) {
if(terminate) {
return;
}
// if(get_key() != 32) {
if(!get_key()) {
break;
}
SDL_Delay(10);
}
// メニュー表示
ags->open_menu_window(menu_window);
int current_index = 0;
// マウス移動
int sx = ags->menu_w[menu_window - 1].sx;
@@ -555,17 +527,20 @@ void NACT_Sys2::cmd_open_verb()
int mx = ex - 16;
int my = sy + 10;
int height = ags->menu_font_size + 4;
int current_index = 0;
set_cursor(mx, my);
wait_after_open_menu();
// メニュー選択
for(;;) {
for(bool selectable = true;;) {
// 入力待機
int val = 0, current_mx = mx, current_my = my;
for(;;) {
if(terminate) {
return;
}
if((val = get_key())) {
if((val = get_key()) != 0) {
SDL_Delay(100);
break;
}
@@ -594,6 +569,9 @@ void NACT_Sys2::cmd_open_verb()
if(sx <= mx && mx <= ex && 0 <= mindex && mindex < index) {
current_index = mindex;
ags->redraw_menu_window(menu_window, current_index);
selectable = true;
} else {
selectable = false;
}
} else if(val == 1 || val == 2 || val == 4 || val == 8) {
if(val == 1) {
@@ -606,7 +584,8 @@ void NACT_Sys2::cmd_open_verb()
current_index = index - 1;
}
ags->redraw_menu_window(menu_window, current_index);
} else if(val == 16) {
selectable = true;
} else if(val == 16 && selectable) {
break;
} else if(val == 32) {
current_index = -1;
@@ -676,21 +655,8 @@ void NACT_Sys2::cmd_open_obj(int verb)
ags->menu_dest_y += ags->menu_font_size + 2;
ags->draw_menu = false;
// クリック中の間は待機
for(;;) {
if(terminate) {
return;
}
// if(get_key() != 32) {
if(!get_key()) {
break;
}
SDL_Delay(10);
}
// メニュー表示
ags->open_menu_window(menu_window);
int current_index = 0;
// マウス移動
int sx = ags->menu_w[menu_window - 1].sx;
@@ -699,17 +665,20 @@ void NACT_Sys2::cmd_open_obj(int verb)
int mx = ex - 16;
int my = sy + 10;
int height = ags->menu_font_size + 4;
int current_index = 0;
set_cursor(mx, my);
wait_after_open_menu();
// メニュー選択
for(;;) {
for(bool selectable = true;;) {
// 入力待機
int val = 0, current_mx = mx, current_my = my;
for(;;) {
if(terminate) {
return;
}
if((val = get_key())) {
if((val = get_key()) != 0) {
SDL_Delay(100);
break;
}
@@ -738,6 +707,9 @@ void NACT_Sys2::cmd_open_obj(int verb)
if(sx <= mx && mx <= ex && 0 <= mindex && mindex < index) {
current_index = mindex;
ags->redraw_menu_window(menu_window, current_index);
selectable = true;
} else {
selectable = false;
}
} else if(val == 1 || val == 2 || val == 4 || val == 8) {
if(val == 1) {
@@ -750,7 +722,8 @@ void NACT_Sys2::cmd_open_obj(int verb)
current_index = index - 1;
}
ags->redraw_menu_window(menu_window, current_index);
} else if(val == 16) {
selectable = true;
} else if(val == 16 && selectable) {
break;
} else if(val == 32) {
current_index = -1;
@@ -773,11 +746,7 @@ void NACT_Sys2::cmd_open_obj(int verb)
void NACT_Sys2::cmd_a()
{
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "A\n");
output_console(log);
#endif
output_console("A\n");
if(!text_skip_enb) {
// Pushマークの表示
@@ -821,13 +790,12 @@ void NACT_Sys2::cmd_b()
int p4 = cali();
int p5 = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5);
output_console(log);
#endif
output_console("\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5);
if(cmd == 1) {
if(crc32_a == CRC32_AYUMI_FD || crc32_a == CRC32_AYUMI_HINT || crc32_a == CRC32_DRSTOP) {
p5 = 1;
}
ags->menu_w[index - 1].sx = p1 * 8;
ags->menu_w[index - 1].sy = p2;
ags->menu_w[index - 1].ex = p3 * 8 - 1;
@@ -840,7 +808,10 @@ void NACT_Sys2::cmd_b()
ags->menu_w[index - 1].screen = NULL;
}
} else if(cmd == 2) {
// if(crc32 == CRC32_PROSTUDENTG_FD) {
if(crc32_a == CRC32_AYUMI_FD || crc32_a == CRC32_AYUMI_HINT || crc32_a == CRC32_DRSTOP) {
p1 = 1;
}
// if(crc32_a == CRC32_PROSTUDENTG_FD) {
// ags->menu_w[index - 1].frame = (index == 1 || index == 3) ? true : false;
// } else
ags->menu_w[index - 1].frame = p1 ? true : false;
@@ -863,9 +834,16 @@ void NACT_Sys2::cmd_b()
ags->text_w[index - 1].window = NULL;
}
} else if(cmd == 4) {
if(crc32_a == CRC32_AYUMI_FD || crc32_a == CRC32_AYUMI_HINT) {
p1 = 1;
//p5 ? 0 : 1; // 逆?
p5 = 0;
} else if(crc32_a == CRC32_DRSTOP) {
p1 = 1;
}
if(p5 == 0) {
// ウィンドウ退避
// if(crc32 == CRC32_PROSTUDENTG_FD) {
// if(crc32_a == CRC32_PROSTUDENTG_FD) {
// ags->text_w[index - 1].frame = (index == 1 || index == 3) ? true : false;
// } else
ags->text_w[index - 1].frame = p1 ? true : false;
@@ -889,11 +867,7 @@ void NACT_Sys2::cmd_d()
int p7 = cali();
int p8 = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nD %d,%d,%d,%d,%d,%d,%d,%d:", p1, p2, p3, p4, p5, p6, p7, p8);
output_console(log);
#endif
output_console("\nD %d,%d,%d,%d,%d,%d,%d,%d:", p1, p2, p3, p4, p5, p6, p7, p8);
}
void NACT_Sys2::cmd_e()
@@ -902,20 +876,12 @@ void NACT_Sys2::cmd_e()
int p2 = cali();
int p3 = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nE %d,%d,%d:", p1, p2, p3);
output_console(log);
#endif
output_console("\nE %d,%d,%d:", p1, p2, p3);
}
void NACT_Sys2::cmd_f()
{
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nF");
output_console(log);
#endif
output_console("\nF");
scenario_addr = 2;
}
@@ -924,18 +890,24 @@ void NACT_Sys2::cmd_g()
{
int page = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nG %d:", page);
output_console(log);
#endif
output_console("\nG %d:", page);
if(crc32 == CRC32_SDPS_TONO || crc32 == CRC32_SDPS_KAIZOKU) {
if(crc32_a == CRC32_SDPS && (crc32_b == CRC32_SDPS_TONO || crc32_b == CRC32_SDPS_KAIZOKU)) {
if(20 <= page && page <= 100) {
page--;
}
}
ags->load_cg(page, -1);
if(crc32_a == CRC32_DALK_HINT) {
if(page == 3) {
WAIT(2000)
}
} else if(crc32_a == CRC32_RANCE3_HINT) {
if(page == 25) {
WAIT(2000)
}
}
}
void NACT_Sys2::cmd_h()
@@ -943,11 +915,7 @@ void NACT_Sys2::cmd_h()
int length = getd();
int val = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nH %d,%d:", length, val);
output_console(log);
#endif
output_console("\nH %d,%d:", length, val);
// 8桁の文字列を生成
char tmp[8];
@@ -987,13 +955,10 @@ void NACT_Sys2::cmd_i()
{
int p1 = cali();
int p2 = cali();
int p3 = getd();
// int p3 = getd();
int p3 = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nI %d,%d,%d:", p1, p2, p3);
output_console(log);
#endif
output_console("\nI %d,%d,%d:", p1, p2, p3);
}
void NACT_Sys2::cmd_j()
@@ -1001,11 +966,7 @@ void NACT_Sys2::cmd_j()
int p1 = cali();
int p2 = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nJ %d,%d:", p1, p2);
output_console(log);
#endif
output_console("\nJ %d,%d:", p1, p2);
}
void NACT_Sys2::cmd_k()
@@ -1018,20 +979,15 @@ void NACT_Sys2::cmd_l()
{
int index = getd();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nL %d:", index);
output_console(log);
#endif
output_console("\nL %d:", index);
if(1 <= index && index <= 26) {
// ASLEEP_A.DAT - ASLEEP_Z.DAT
char path[_MAX_PATH];
strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT");
path[7] = 'A' + index - 1;
char file_name[_MAX_PATH];
sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1);
FILEIO* fio = new FILEIO();
if(fio->Fopen(path, FILEIO_READ_BINARY)) {
if(fio->Fopen(file_name, FILEIO_READ_BINARY)) {
fio->Fseek(112, FILEIO_SEEK_SET);
int next_page = fio->Fgetw() - 1;
@@ -1122,7 +1078,7 @@ void NACT_Sys2::cmd_l()
void NACT_Sys2::cmd_m()
{
char string[22];
char string[33];
int d, p = 0;
while((d = getd()) != ':') {
@@ -1136,14 +1092,10 @@ void NACT_Sys2::cmd_m()
}
string[p] = '\0';
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nM %s:", string);
output_console(log);
#endif
output_console("\nM %s:", string);
if(1 <= tvar_index && tvar_index <= 10) {
memcpy(tvar[tvar_index - 1], string, 22);
memcpy(tvar[tvar_index - 1], string, 33);
}
}
@@ -1152,11 +1104,7 @@ void NACT_Sys2::cmd_n()
int p1 = cali();
int p2 = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nN %d,%d:", p1, p2);
output_console(log);
#endif
output_console("\nN %d,%d:", p1, p2);
}
void NACT_Sys2::cmd_o()
@@ -1165,29 +1113,25 @@ void NACT_Sys2::cmd_o()
int width = cali();
int height = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nO %d,%d,%d:", st, width, height);
output_console(log);
#endif
output_console("\nO %d,%d,%d:", st, width, height);
#if 0
// white mesh
int sx = (st % 80) * 8;
int sy = (int)(st / 80);
ags->draw_mesh(sx, sy, width, height);
#endif
}
void NACT_Sys2::cmd_p()
{
int param = getd();
ags->text_font_color = (uint8)((param & 0x7) + 16);
if(crc32_a != CRC32_YAKATA2 && crc32_a != CRC32_DALK_HINT && crc32_a != CRC32_RANCE3_HINT) {
ags->text_font_color = (uint8)((param & 0x7) + 16);
}
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nP %d:", param);
output_console(log);
#endif
output_console("\nP %d:", param);
}
#define FWRITE(data, size) { \
@@ -1214,20 +1158,15 @@ void NACT_Sys2::cmd_q()
int index = getd();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nQ %d:", index);
output_console(log);
#endif
output_console("\nQ %d:", index);
if(1 <= index && index <= 26) {
// ASLEEP_A.DAT - ASLEEP_Z.DAT
char path[_MAX_PATH];
strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT");
path[7] = 'A' + index - 1;
char file_name[_MAX_PATH];
sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1);
FILEIO* fio = new FILEIO();
if(fio->Fopen(path, FILEIO_WRITE_BINARY)) {
if(fio->Fopen(file_name, FILEIO_WRITE_BINARY)) {
uint8 buffer[9510];
int p = 0;
@@ -1295,11 +1234,7 @@ void NACT_Sys2::cmd_q()
void NACT_Sys2::cmd_r()
{
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "R\n");
output_console(log);
#endif
output_console("R\n");
// ウィンドウの表示範囲外の場合は改ページ
if(ags->return_text_line(text_window)) {
@@ -1311,11 +1246,7 @@ void NACT_Sys2::cmd_s()
{
int page = getd();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nS %d:", page);
output_console(log);
#endif
output_console("\nS %d:", page);
if(page) {
mako->play_music(page);
@@ -1330,62 +1261,86 @@ void NACT_Sys2::cmd_t()
int p2 = cali();
int p3 = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nT %d,%d,%d:", p1, p2, p3);
output_console(log);
#endif
output_console("\nT %d,%d,%d:", p1, p2, p3);
}
void NACT_Sys2::cmd_u()
{
int page = getd();
int transparent = getd();
int page, transparent;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nU %d,%d:", page, transparent);
output_console(log);
#endif
if(crc32_a == CRC32_YAKATA2) {
page = cali();
transparent = cali();
} else {
page = getd();
transparent = getd();
}
output_console("\nU %d,%d:", page, transparent);
ags->load_cg(page, transparent);
}
void NACT_Sys2::cmd_v()
{
#if 1
int p01 = cali();
int p02 = cali();
int p03 = cali();
int p04 = cali();
int p05 = cali();
int p06 = cali();
int p07 = cali();
int p08 = cali();
int p09 = cali();
int p10 = cali();
int p11 = cali();
int p12 = cali();
int p13 = cali();
int p14 = cali();
int p15 = cali();
int p16 = cali();
int p17 = cali();
int p18 = cali();
int p19 = cali();
int p20 = cali();
int p21 = cali();
int p22 = cali();
int p23 = cali();
int p24 = cali();
int p25 = cali();
int p26 = cali();
int p27 = cali();
int p28 = cali();
int p29 = cali();
output_console("\nV %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d:",
p01, p02, p03, p04, p05, p06, p07, p08, p09, p10, p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, p21, p22, p23, p24, p25, p26, p27, p28, p29);
#else
int p1 = cali();
int p2 = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nV %d,%d:", p1, p2);
output_console(log);
output_console("\nV %d,%d:", p1, p2);
#endif
}
void NACT_Sys2::cmd_w()
{
int p1 = cali();
int p2 = cali();
int p3 = cali();
int p4 = cali();
int sx = cali();
int sy = cali();
int ex = cali();
int ey = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nW %d,%d,%d,%d:", p1, p2, p3, p4);
output_console(log);
#endif
output_console("\nW %d,%d,%d,%d:", sx, sy, ex, ey);
ags->draw_mesh(sx, sy, ex - sx, ey - sy);
}
void NACT_Sys2::cmd_x()
{
int index = getd();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nX %d:", index);
output_console(log);
#endif
output_console("\nX %d:", index);
if(1 <= index && index <= 10) {
ags->draw_text(tvar[index - 1]);
@@ -1397,11 +1352,7 @@ void NACT_Sys2::cmd_y()
int cmd = cali();
int param = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nY %d,%d:", cmd, param);
output_console(log);
#endif
output_console("\nY %d,%d:", cmd, param);
switch(cmd) {
case 1:
@@ -1444,7 +1395,7 @@ void NACT_Sys2::cmd_y()
RND = (param == 0 || param == 1) ? 0 : random(param);
break;
case 7:
if(crc32 != CRC32_SDPS_MARIA) {
if(!(crc32_a == CRC32_SDPS && crc32_b == CRC32_SDPS_MARIA)) {
ags->draw_box(param);
}
break;
@@ -1460,10 +1411,18 @@ void NACT_Sys2::cmd_y()
case 26:
ags->text_font_size = (param == 1) ? 16 : (param == 2) ? 24 : (param == 3) ? 32 : (param == 4) ? 48 : (param == 5) ? 64 : 16;
break;
#if 0 // Broken in Super D.P.S
case 27:
{
int tmp = tvar_index;
tvar_index = param;
tvar_maxlen = 8;//param;
text_dialog();
tvar_index = tmp;
}
break;
case 40:
case 42:
{
if(ags->now_fade()) {
Uint32 dwStart = SDL_GetTicks();
for(int i = 0; i < 16; i++) {
ags->fade_in(i);
@@ -1478,11 +1437,13 @@ void NACT_Sys2::cmd_y()
SDL_Delay(0);
}
}
ags->fade_end();
}
break;
case 41:
case 43:
{
if(!ags->now_fade()) {
ags->fade_start();
Uint32 dwStart = SDL_GetTicks();
for(int i = 0; i < 16; i++) {
ags->fade_out(i, (cmd == 41) ? false : true);
@@ -1499,7 +1460,6 @@ void NACT_Sys2::cmd_y()
}
}
break;
#endif
case 221:
case 222:
case 223:
@@ -1530,6 +1490,28 @@ void NACT_Sys2::cmd_y()
case 252:
RND = 8;
break;
case 253:
// キーが押されて離されるまで待機
for(;;) {
if(terminate) {
return;
}
if(get_key()) {
break;
}
SDL_Delay(10);
}
SDL_Delay(100);
for(;;) {
if(terminate) {
return;
}
if(!(get_key() & 0x18)) {
break;
}
SDL_Delay(10);
}
break;
case 254:
RND = 0;
break;
@@ -1560,11 +1542,7 @@ void NACT_Sys2::cmd_z()
int cmd = cali();
int param = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nZ %d,%d:", cmd, param);
output_console(log);
#endif
output_console("\nZ %d,%d:", cmd, param);
// Z1
// Z2
+82 -239
View File
@@ -13,8 +13,8 @@
#include "../fileio.h"
#include "texthook.h"
NACT_Sys3::NACT_Sys3(uint32 crc32, const char* font_file, const char* playlist)
: NACT(3, crc32, font_file, playlist)
NACT_Sys3::NACT_Sys3(uint32 crc32_a, uint32 crc32_b, const char* font_file, const char* playlist)
: NACT(3, crc32_a, crc32_b, font_file, playlist)
{
}
@@ -28,11 +28,7 @@ void NACT_Sys3::cmd_calc()
}
var[index] = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n!var[%d]:%d!", index, var[index]);
output_console(log);
#endif
output_console("\n!var[%d]:%d!", index, var[index]);
}
void NACT_Sys3::cmd_branch()
@@ -44,11 +40,7 @@ void NACT_Sys3::cmd_branch()
// sigmarion3 最適化誤爆の対策
scenario_addr = condition ? t_addr : f_addr;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n{%d: T:%4x, F:%4x", condition, t_addr, f_addr);
output_console(log);
#endif
output_console("\n{%d: T:%4x, F:%4x", condition, t_addr, f_addr);
}
void NACT_Sys3::cmd_label_jump()
@@ -56,22 +48,14 @@ void NACT_Sys3::cmd_label_jump()
int next_addr = getw();
scenario_addr = next_addr;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n@%x:", next_addr);
output_console(log);
#endif
output_console("\n@%x:", next_addr);
}
void NACT_Sys3::cmd_label_call()
{
int next_addr = getw();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n\\%x:", next_addr);
output_console(log);
#endif
output_console("\n\\%x:", next_addr);
if(next_addr == 0) {
// リターン
@@ -93,22 +77,14 @@ void NACT_Sys3::cmd_page_jump()
scenario_page = next_page;
scenario_addr = 2;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n&%d:", next_page);
output_console(log);
#endif
output_console("\n&%d:", next_page);
}
void NACT_Sys3::cmd_page_call()
{
int next_page = cali(), next_addr;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n%%%d:", next_page);
output_console(log);
#endif
output_console("\n%%%d:", next_page);
if(next_page == 0) {
// リターン
@@ -135,11 +111,7 @@ void NACT_Sys3::cmd_set_menu()
ags->menu_dest_y += ags->menu_font_size + 2;
ags->draw_menu = false;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "$");
output_console(log);
#endif
output_console("$");
} else {
if(!menu_index) {
ags->clear_menu_window();
@@ -150,31 +122,14 @@ void NACT_Sys3::cmd_set_menu()
ags->menu_dest_y += 2;
ags->draw_menu = true;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n$%x,", menu_addr[menu_index - 1]);
output_console(log);
#endif
output_console("\n$%x,", menu_addr[menu_index - 1]);
}
}
int NACT_Sys3::menu_select(int num_items)
{
// クリック中の間は待機
for(;;) {
if(terminate) {
return -1;
}
// if(get_key() != 32) {
if(!get_key()) {
break;
}
SDL_Delay(16);
}
// メニュー表示
ags->open_menu_window(menu_window);
int current_index = 0;
// マウス移動
int sx = ags->menu_w[menu_window - 1].sx;
@@ -183,12 +138,13 @@ int NACT_Sys3::menu_select(int num_items)
int mx = ex - 16;
int my = sy + 10;
int height = ags->menu_font_size + 4;
set_cursor(mx, my);
int current_index = 0;
bool selectable = true;
set_cursor(mx, my);
wait_after_open_menu();
// メニュー選択
for(;;) {
for(bool selectable = true;;) {
// 入力待機
int val = 0, current_mx = mx, current_my = my;
for(;;) {
@@ -200,7 +156,7 @@ int NACT_Sys3::menu_select(int num_items)
int dy = my - current_my;
if (dx*dx + dy*dy > 10)
break;
if((val = get_key())) {
if((val = get_key()) != 0) {
SDL_Delay(100);
break;
}
@@ -260,11 +216,7 @@ int NACT_Sys3::menu_select(int num_items)
void NACT_Sys3::cmd_open_menu()
{
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n]");
output_console(log);
#endif
output_console("\n]");
if(!menu_index) {
scenario_addr = scenario_data[0] | (scenario_data[1] << 8);
@@ -292,11 +244,7 @@ void NACT_Sys3::cmd_set_verbobj()
menu_obj[menu_index++] = obj;
verb_obj = true;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]);
output_console(log);
#endif
output_console("\n[%x,%s,%s:", addr, caption_verb[verb], caption_obj[obj]);
}
void NACT_Sys3::cmd_set_verbobj2()
@@ -313,21 +261,13 @@ void NACT_Sys3::cmd_set_verbobj2()
}
verb_obj = true;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]);
output_console(log);
#endif
output_console("\n:%d,%x,%s,%s:", condition, addr, caption_verb[verb], caption_obj[obj]);
}
void NACT_Sys3::cmd_open_verb()
{
// 動詞メニューの表示
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nopen verb-obj menu");
output_console(log);
#endif
output_console("\nopen verb-obj menu");
verb_obj = false;
// 表示する動詞のチェック
@@ -431,11 +371,7 @@ void NACT_Sys3::cmd_a()
{
texthook_nextpage();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "A\n");
output_console(log);
#endif
output_console("A\n");
if(!text_skip_enb) {
// Pushマークの表示
@@ -479,18 +415,13 @@ void NACT_Sys3::cmd_b()
int p4 = cali();
int p5 = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5);
output_console(log);
#endif
output_console("\nB %d,%d,%d,%d,%d,%d,%d:", cmd, index, p1, p2, p3, p4, p5);
if(cmd == 1) {
// あゆみちゃん物語
if(crc32 == CRC32_AYUMI_CD || crc32 == CRC32_AYUMI_JISSHA_256 || crc32 == CRC32_AYUMI_JISSHA_FULL) {
if(crc32_a == CRC32_AYUMI_CD || crc32_a == CRC32_AYUMI_JISSHA_256 || crc32_a == CRC32_AYUMI_JISSHA_FULL) {
p5 = 1;
}
ags->menu_w[index - 1].sx = column ? p1 * 8 : p1 & 0xfff8;
ags->menu_w[index - 1].sy = p2;
ags->menu_w[index - 1].ex = column ? p3 * 8 - 1 : (p3 & 0xfff8) - 1;
@@ -525,7 +456,7 @@ void NACT_Sys3::cmd_b()
} else if(cmd == 4) {
if(p5 == 0) {
// ウィンドウ退避
if(crc32 == CRC32_PROSTUDENTG_CD && p4) {
if(crc32_a == CRC32_PROSTUDENTG_CD && p4) {
// prostudent G オープニング画面化け対策
if(ags->text_w[index - 1].window) {
free(ags->text_w[index - 1].window);
@@ -545,6 +476,7 @@ void NACT_Sys3::cmd_b()
void NACT_Sys3::cmd_d()
{
// 未使用
fatal("Unknown Command: 'D' at page = %d, addr = %d", scenario_page, prev_addr);
}
void NACT_Sys3::cmd_e()
@@ -556,11 +488,7 @@ void NACT_Sys3::cmd_e()
int ex = cali();
int ey = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nE %d,%d,%d,%d,%d,%d:", index, color, sx, sy, ex, ey);
output_console(log);
#endif
output_console("\nE %d,%d,%d,%d,%d,%d:", index, color, sx, sy, ex, ey);
ags->box[index - 1].color = color;
ags->box[index - 1].sx = column ? sx * 8 : sx;
@@ -571,11 +499,7 @@ void NACT_Sys3::cmd_e()
void NACT_Sys3::cmd_f()
{
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nF");
output_console(log);
#endif
output_console("\nF");
scenario_addr = 2;
}
@@ -584,11 +508,7 @@ void NACT_Sys3::cmd_g()
{
int page = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nG %d:", page);
output_console(log);
#endif
output_console("\nG %d:", page);
ags->load_cg(page, -1);
}
@@ -598,11 +518,7 @@ void NACT_Sys3::cmd_h()
int length = getd();
int val = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nH %d,%d:", length, val);
output_console(log);
#endif
output_console("\nH %d,%d:", length, val);
// 隠しコマンド?
if(length >= 9) {
@@ -653,15 +569,11 @@ void NACT_Sys3::cmd_i()
int dx = cali();
int dy = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nI %d,%d,%d,%d,%d,%d:", sx, sy, ex, ey, dx, dy);
output_console(log);
#endif
output_console("\nI %d,%d,%d,%d,%d,%d:", sx, sy, ex, ey, dx, dy);
// X方向はカラム単位で切り捨て
sx = column ? sx * 8 : sx & 0xfff8;
ex = column ? ex * 8 - 1 : (crc32 == CRC32_NINGYO) ? (ex & 0xfff8) + 7 : (ex & 0xfff8) - 1;
ex = column ? ex * 8 - 1 : (crc32_a == CRC32_NINGYO) ? (ex & 0xfff8) + 7 : (ex & 0xfff8) - 1;
dx = column ? dx * 8 : dx & 0xfff8;
ags->copy(sx, sy, ex, ey, dx, dy);
}
@@ -671,11 +583,7 @@ void NACT_Sys3::cmd_j()
int x = cali();
int y = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nJ %d,%d:", x, y);
output_console(log);
#endif
output_console("\nJ %d,%d:", x, y);
// x方向はカラム単位で切り捨て
ags->cg_dest_x = column ? x * 8 : x & 0xfff8;
@@ -687,11 +595,7 @@ void NACT_Sys3::cmd_k()
{
int cmd = getd(), val;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nK %d:", cmd);
output_console(log);
#endif
output_console("\nK %d:", cmd);
// K6の場合は、すぐに返る
if(cmd == 6) {
@@ -708,7 +612,7 @@ void NACT_Sys3::cmd_k()
if(terminate) {
return;
}
if((val = get_key())) {
if((val = get_key()) != 0) {
break;
}
if(1 <= cmd && cmd <= 3) {
@@ -764,11 +668,7 @@ void NACT_Sys3::cmd_l()
{
int index = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nL %d:", index);
output_console(log);
#endif
output_console("\nL %d:", index);
if(index == 0) {
// 特殊セーブ
@@ -787,12 +687,11 @@ void NACT_Sys3::cmd_l()
delete fio;
} else if(1 <= index && index <= 26) {
// ASLEEP_A.DAT - ASLEEP_Z.DAT
char path[_MAX_PATH];
strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT");
path[7] = 'A' + index - 1;
char file_name[_MAX_PATH];
sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1);
FILEIO* fio = new FILEIO();
if(fio->Fopen(path, FILEIO_READ_BINARY | FILEIO_SAVEDATA)) {
if(fio->Fopen(file_name, FILEIO_READ_BINARY | FILEIO_SAVEDATA)) {
fio->Fseek(112, FILEIO_SEEK_SET);
int next_page = fio->Fgetw() - 1;
@@ -880,12 +779,11 @@ void NACT_Sys3::cmd_l()
delete fio;
} else if(101 <= index && index <= 126) {
// ASLEEP_A.DAT - ASLEEP_Z.DAT
char path[_MAX_PATH];
strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT");
path[7] = 'A' + index - 101;
char file_name[_MAX_PATH];
sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 101);
FILEIO* fio = new FILEIO();
if(fio->Fopen(path, FILEIO_READ_BINARY | FILEIO_SAVEDATA)) {
if(fio->Fopen(file_name, FILEIO_READ_BINARY | FILEIO_SAVEDATA)) {
fio->Fseek(112 + 16, FILEIO_SEEK_SET);
var[0] = fio->Fgetw();
fio->Fclose();
@@ -910,11 +808,7 @@ void NACT_Sys3::cmd_m()
}
string[p] = '\0';
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nM %s:", string);
output_console(log);
#endif
output_console("\nM %s:", string);
if(1 <= tvar_index && tvar_index <= 10) {
memcpy(tvar[tvar_index - 1], string, 22);
@@ -935,11 +829,7 @@ void NACT_Sys3::cmd_n()
int src = cali();
int dest = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nN %d,%d,%d:", cmd, src, dest);
output_console(log);
#endif
output_console("\nN %d,%d,%d:", cmd, src, dest);
}
void NACT_Sys3::cmd_o()
@@ -964,11 +854,7 @@ void NACT_Sys3::cmd_o()
B15 = (val & 0x4000) ? 1 : 0;
B16 = (val & 0x8000) ? 1 : 0;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nO %d,%d:", cmd, val);
output_console(log);
#endif
output_console("\nO %d,%d:", cmd, val);
} else {
uint16 val = 0;
val |= B01 ? 0x0001 : 0;
@@ -990,11 +876,7 @@ void NACT_Sys3::cmd_o()
int index = cali2();
var[index] = val;
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nO %d,var[%d]:", cmd, index);
output_console(log);
#endif
output_console("\nO %d,var[%d]:", cmd, index);
}
}
@@ -1005,11 +887,7 @@ void NACT_Sys3::cmd_p()
int g = cali();
int b = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nP %d,%d,%d,%d:", index, r, g, b);
output_console(log);
#endif
output_console("\nP %d,%d,%d,%d:", index, r, g, b);
ags->set_palette(index, r, g, b);
set_palette = true;
@@ -1051,11 +929,7 @@ void NACT_Sys3::cmd_q()
int index = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nQ %d:", index);
output_console(log);
#endif
output_console("\nQ %d:", index);
if(index == 0) {
// 特殊セーブ
@@ -1074,12 +948,11 @@ void NACT_Sys3::cmd_q()
delete fio;
} else if(1 <= index && index <= 26) {
// ASLEEP_A.DAT - ASLEEP_Z.DAT
char path[_MAX_PATH];
strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT");
path[7] = 'A' + index - 1;
char file_name[_MAX_PATH];
sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + index - 1);
FILEIO* fio = new FILEIO();
if(fio->Fopen(path, FILEIO_WRITE_BINARY | FILEIO_SAVEDATA)) {
if(fio->Fopen(file_name, FILEIO_WRITE_BINARY | FILEIO_SAVEDATA)) {
uint8 buffer[9510];
int p = 0;
@@ -1149,11 +1022,7 @@ void NACT_Sys3::cmd_r()
{
texthook_newline();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "R\n");
output_console(log);
#endif
output_console("R\n");
// ウィンドウの表示範囲外の場合は改ページ
if(ags->return_text_line(text_window)) {
@@ -1165,11 +1034,7 @@ void NACT_Sys3::cmd_s()
{
int page = getd();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nS %d:", page);
output_console(log);
#endif
output_console("\nS %d:", page);
if(page) {
mako->play_music(page);
@@ -1183,11 +1048,7 @@ void NACT_Sys3::cmd_t()
int x = cali();
int y = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nT %d,%d:", x, y);
output_console(log);
#endif
output_console("\nT %d,%d:", x, y);
// x方向はカラム単位で切り捨て
ags->text_dest_x = column ? x * 8 : x & 0xfff8;
@@ -1199,13 +1060,9 @@ void NACT_Sys3::cmd_u()
int page = cali();
int transparent = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nU %d,%d:", page, transparent);
output_console(log);
#endif
output_console("\nU %d,%d:", page, transparent);
if(crc32 == CRC32_RANCE41 || crc32 == CRC32_RANCE42) {
if(crc32_a == CRC32_RANCE41 || crc32_a == CRC32_RANCE42) {
transparent = (transparent == 28) ? 12 : transparent;
}
ags->load_cg(page, transparent);
@@ -1216,11 +1073,7 @@ void NACT_Sys3::cmd_v()
int cmd = cali();
int index = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nV %d,%d:", cmd, index);
output_console(log);
#endif
output_console("\nV %d,%d:", cmd, index);
if(cmd == 0) {
for(int i = 0; i < 20; i++) {
@@ -1245,11 +1098,7 @@ void NACT_Sys3::cmd_w()
int y = cali();
uint8 color = (uint8)cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nW %d,%d,%d", x, y, color);
output_console(log);
#endif
output_console("\nW %d,%d,%d", x, y, color);
ags->paint(x, y, color);
}
@@ -1258,11 +1107,7 @@ void NACT_Sys3::cmd_x()
{
int index = getd();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nX %d:", index);
output_console(log);
#endif
output_console("\nX %d:", index);
if(1 <= index && index <= 10) {
ags->draw_text(tvar[index - 1]);
@@ -1274,11 +1119,7 @@ void NACT_Sys3::cmd_y()
int cmd = cali();
int param = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nY %d,%d:", cmd, param);
output_console(log);
#endif
output_console("\nY %d,%d:", cmd, param);
switch(cmd) {
case 1:
@@ -1559,7 +1400,7 @@ void NACT_Sys3::cmd_y()
case 231:
D01 = 640;
D02 = (param == 1) ? ags->screen_height : 480;
D03 = (crc32 == CRC32_YAKATA3_FD) ? 16 : 256;
D03 = (crc32_a == CRC32_YAKATA3_FD) ? 16 : 256;
break;
case 232:
if(ags->screen_height != param ? 480 : 400) {
@@ -1595,13 +1436,12 @@ void NACT_Sys3::cmd_y()
}
break;
case 239:
{
char path[_MAX_PATH];
strcpy_s(path, _MAX_PATH, "ASLEEP_A.DAT");
path[7] = 'A' + param - 1;
if(1 <= param && param <= 26) {
char file_name[_MAX_PATH];
sprintf_s(file_name, _MAX_PATH, "ASLEEP_%c.DAT", 'A' + param - 1);
struct stat statbuf;
if (FILEIO::StatSavedata(path, &statbuf) != -1) {
if (FILEIO::StatSavedata(file_name, &statbuf) != -1) {
struct tm *t = localtime(&statbuf.st_mtime);
D01 = t->tm_year + 1900;
D02 = t->tm_mon + 1;
@@ -1612,6 +1452,9 @@ void NACT_Sys3::cmd_y()
} else {
D01 = D02 = D03 = D04 = D05 = D06 = 0;
}
} else {
// 不正なファイル番号
D01 = D02 = D03 = D04 = D05 = D06 = 0;
}
break;
case 240:
@@ -1620,33 +1463,37 @@ void NACT_Sys3::cmd_y()
case 241:
break;
case 250:
{
#if 0
char path[4];
path[0] = g_root[0];
path[1] = ':';
path[2] = '\\';
path[3] = '\0';
UINT t = GetDriveType(path);
if(FILEIO::GetRootPath()[1] == ':') {␍
_TCHAR root_path[4];
root_path[0] = FILEIO::GetRootPath()[0];
root_path[1] = ':';
root_path[2] = '\\';
root_path[3] = '\0';
UINT t = GetDriveType(root_path);
// フロッピーから起動した場合は0が返る
//RND = (t == DRIVE_REMOVABLE) ? 0 : (t == DRIVE_CDROM) ? 2 : 1;
RND = (t == DRIVE_CDROM) ? 2 : 1;
#else
} else {
// ネットワークドライブ?
RND = 1;
#endif
}
#else
RND = 1;
#endif
break;
case 251:
column = param ? false : true;
break;
case 252:
RND = (crc32 == CRC32_YAKATA3_FD) ? 4 : 8;
RND = (crc32_a == CRC32_YAKATA3_FD) ? 4 : 8;
break;
case 253:
show_push = (param == 0) ? true : false;
break;
case 254:
RND = (crc32 == CRC32_YAKATA3_CD || crc32 == CRC32_YAKATA3_FD || crc32 == CRC32_NINGYO) ? 1 : 0;
RND = (crc32_a == CRC32_YAKATA3_CD || crc32_a == CRC32_YAKATA3_FD || crc32_a == CRC32_NINGYO) ? 1 : 0;
break;
case 255:
post_quit = (param == 1) ? true : false;
@@ -1660,11 +1507,7 @@ void NACT_Sys3::cmd_z()
int cmd = cali();
int param = cali();
#if defined(_DEBUG_CONSOLE)
char log[128];
sprintf_s(log, 128, "\nZ %d,%d:", cmd, param);
output_console(log);
#endif
output_console("\nZ %d,%d:", cmd, param);
if(cmd == 0) {
ags->palette_bank = (uint8)(param & 0xff);
+6 -2
View File
@@ -92,9 +92,13 @@ void NACT::release_console()
#endif
}
void NACT::output_console(char log[])
void NACT::output_console(const char *format, ...)
{
#if defined(_DEBUG_CONSOLE)
fputs(log, stdout);
va_list ap;
va_start(ap, format);
vfprintf(stdout, format, ap);
va_end(ap);
#endif
}