同級生の部屋
この部屋ではPC-98版同級生を解析していきます for me
このコーナーの役に立つような情報をお持ちでしたらこちらから情報を提供して下さい
第1回 データ
第1回目の今回はデータについてです。ここでのデータとはプログラムファイル以外のファイルのことを指します。同級生では実に1000個以上のファイルがあります。
Data Files |
MES | Message File |
PD8 | Graphic File |
S4 | Animation Data |
PAL | Palette File |
A6 | Mouse Data |
C5 | Map Data?? |
MP | Map Data File |
M | Muisc File |
MOUSE.DAT | Mouse Cursor Data |
FLAG0 | Saved Data File |
一番解析が簡単なのが PAL ファイルです。これはパレット情報がそのまま入っています。PD8 は只今解析中ですが座標とパレット情報以外わかっていません。MES ファイルはゲームの中核をなすので解析が面倒です。先頭の2バイトはわかりました。大抵、メッセージは 6x となっているところ全部に 20Byte 加えると SJIS でベタで出てきますが未だ足りません。S4 は某ローダーでアニメーションデータという事がわかりました。しかし、内部のデータの詳細については未だわかっていません。M ファイルはシェル上で
> PLAY5 ○○.M
とやると音楽がなることからミュージックデータということがわかります。これはプログラムを逆アセンブルしないとフォーマットがわかりません。A6 は何に使われるかも不明でしたが、マウス情報が入っていることが解りました。マウスの位置の情報が入っています。詳しくは第6回で説明します。MOUSE.DAT は名前からしてマウスカーソル情報です。マウスの形状のデータが入っています。MP はマップ情報でしょう。 C5 というものがありますが MP と同じ名前のファイルがあることから MP を移動する際のデータだとおもわれます(例:電車の移動)。FLAG0 はセーブデータです。
第2回 プログラム
プログラムはインストーラを合せても4つしかありません。
Program Files |
AI5.EXE | メインプログラム |
AMD.COM | Animation Mouse Driver |
PLAY5.COM | BGM Play TSR |
INSTALL.EXE | Install Program |
AI5.EXE はエルフのゲームのメインプログラムです。AMD.COM と PLAY5.COM もお決まりの TSR です。INSTALL.EXE はあってもなくてもインストールが済めば関係ありませんのでこのコーナーでは取り上げません。AI5.EXE は逆アセンブラにかけてもうまく逆アセンブルができませんでした。また、PACK されているので DEBUG.EXE などで追いかけるのも一苦労です。
第3回 セーブデータ
「+○○」と書いてあるのはオフセットアドレスを意味します
一番厄介なセーブデータの解析です。なんで一番厄介なセーブデータを最初の方に選らんだのか自分でもわかりませんが。これがわかってしまえばゲームなどやらなくてもすんでしまいます。ここではいちいちセーブして終了してチェックするのは面倒なので超有名常駐型メモリエディタの「STAND-DX」を使用して実際のゲームのメモリをチェックしました。STAND-DX の情報はNON-STANDARDホームページを参照してください。また HyperEGNet でも STAND-DX を使った改造コーナーを作りました。ちなみにセーブデータ付近のパスワードは ID=AI5 PASSWD=0ECD0A となっています。
先頭の数バイト(10Byte)はセーブした時の MES ファイルです。実際はゲーム中では現在の MES ファイルが入るのですが、よほどのこと(裏技セーブ機能でセーブした等々)がない限りセーブデータでは myroom.mes となっているはずです。その次は 00 となっていますが、ゲーム中ではこの 00 でファイル名を区切っているようです。そこから暫くはフラグですが、マウスでクリックしたときに立つフラグです。例えば自分の部屋の机をクリックすると1回目と2回目のメッセージが変化します。それは1回目にクリックするとフラグが立つからです。このフラグは詳しく調べてはいないのですが +25H 〜 +51H あたりまでだと思われます。ここのフラグはシーンが変るたびに変化しますのであまり気合を入れて調べていません。
曜日は日曜日が 00 月曜日が 01 火曜日が 02 ・・・・となっています。時間と日付は少々特殊で8月10日の時は 810 、16進数に直すと 32A となります。時間は午前10:30のときは 1030 、16進数では 406となり、午後10:30のときは22:30と数えるので 2230 、16進数では 8B6 というように記録されます。
逆ワード形式で記録されているので実際には B608 と記録されています
Offset Address | size | 内容 |
+00 | 0AH | 固定文字 myroom.mes |
+0C | 01H | 固定文字 $ |
+25 | 2CH | 固定数字 00 |
+52 | 08H | 好感度 |
+228 | 02H | 所持金 |
+22A | 02H | 曜日 |
+230 | 01H | 月日 |
+248 | 02H | 時間 |
+250 | 02H | Mouse X + 8 |
+252 | 02H | Mouse Y + 8 |
+26A | 02H | Mouse X |
+26C | 02H | Mouse Y |
+31D | 08H | 名前(SJIS) |
+BF9 | 07H | 固定文字 TAM・TAM(半角) |
データは逆ワードで保存されています。
各人物の好感度は以下の通りになっています。
+53 | 54 | 55 | 56 | 57 | 58 | 59 | 5A |
00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
斎鈴 | 黒 | 成田 | 正斎 | 桜芹 | 田仁 | 真佐 | 草 |
藤木 | 川 | 瀬町 | 樹藤 | 木沢 | 中科 | 行久 | 薙 |
| | | | | | 寺間 | |
亜美 | さ | かひ | 夏真 | よ | 美く | ち | や |
子穂 | と | おろ | 子子 | 舞し | 沙る | 麗は | よ |
| み | りみ | | 子 | み | 子る | い |
「黒川さとみ」の隣が空いていますがここはボツとなった「桜木京子」の好感度だったと思われます。グラフィックは残っているし。
各人物が出現したかどうかのフラグと思われるものを書いておきます。パソコンフラグ(勝手に命名)が立っていてこのフラグを立っていると一応パソコンで見ることができますが、他にも色々フラグは立っていますので御注意を。
パソコンフラグ | +77 | 10 |
鈴木美穂 | +75 | 01 |
斎藤亜子 | +75 | 10 |
黒川さとみ | +78 | 10 |
田町ひろみ | +7B | 10 |
斎藤真子 | +8E | 10 |
田中美沙 | +8F | 10 |
正樹夏子 | +95 | 11 |
芹沢よしこ | +97 | 10 |
桜木舞 | +9C | 01 |
仁科くるみ | +9D | 01 |
成瀬かおり | +8C | 10 |
佐久間ちはる | +107 | 10 |
真行司麗子 | +135 | 01 |
草薙やよい | +14B | 01 |
アドレス順&パソコンで表示される順
ゲームを進めて行く上でのフラグは複雑なので MES ファイルのときに一緒に解説しようと思います。
第4回 パレットファイル
パレットは *.PAL となっている物です。5個のファイルがあります。
ASA.PAL | 朝 |
HIRU.PAL | 昼 |
YUGA.PAL | 夕方 |
YORU.PAL | 夜 |
PAL.PAL | ??? |
大きさは48バイトですが普通のRGBファイルではありません。このパレットファイルはBRGの順に並んでいます。実際には +1B 〜 +24 までの 9Bypte しか違っていません。パレット番号に直すと 9〜B の3個が違うだけです。ただ、PAL.PAL は何処で使われているのかが解っていませんので解りしだい更新します。このパレットを読み込んで画面上の色を変化させるプログラムを以下にしめします。ただし PC-98用&要C言語&手抜き。それと実行ファイルをアップしておきます。LP.EXE 6950Byte.
/* LP.EXE */
#include <stdio.h>
#include <stdlib.h>
#ifndef outportb
#define outportb(p, c)\
_asm_c("\n\tOUT\tDX,AL", (char)(c), _asm_c, _asm_c, (unsigned)(p))
#endif
FILE *fp;
main(int argc, char **argv)
{
char i=16;
if(!argc) exit(0);
*++argv;
outportb(0x6A,0x01);
outportb(0xA2,0x0D);
if((fp = fopen(*argv,"rb")) == NULL) exit(-1);
while(--i){
outportb(0xA8,15-i);
outportb(0xAE,fgetc(fp));
outportb(0xAC,fgetc(fp));
outportb(0xAA,fgetc(fp));
}
fclose(fp);
exit(0);
}
これでコマンドラインから
A:> lp asa.pal
とかやると見事にパレットが読み込まれます。某ローダーではこの PAL ファイルを読み込んでくれないのでグラフィックをロードした後に使ったりすると良いと思われます。
第5回 マウスカーソル
マウスカーソルの形状は MOUSE.DAT に入っています。本当はグラフィックをアップしたいのですが著作権に触れると思われるので止めておきます。このデータの形式は4バイト(32BIT)づつ読み込んでビットが1だったら白い点を打ち、0だったら黒い点を打つとあのような画像が出てきます。マウスカーソルの大きさは 32x32 です。
実際のデータ(16進数) | 実際のカーソル(2進数化) |
00 00 00 00 | -------------------------------- |
00 00 00 00 | -------------------------------- |
20 00 00 00 | --0----------------------------- |
18 00 00 00 | ---00--------------------------- |
1E 00 00 00 | ---0000------------------------- |
0F 80 00 00 | ----00000----------------------- |
0F E0 00 00 | ----0000000--------------------- |
07 F8 00 00 | -----00000000------------------- |
これはカーソルの一部ですが、2進数に直すと非常にわかりやすくなります。サンプルプログラムをつけてみました。サンプルなのでこのままでは動きませんが実行ファイルをアップしておきます。MOUSE.EXE 9360Byte.
#include <stdio.h>
#include <stdlib.h>
FILE *fp
/* pset(unsigned int x, unsigned int y, char color); */
main(){
int c,i,j,k;
if(NULL == (fp = fopen("mouse.dat","rb"))) exit(-1);
(中略)
for(i=0;i<32;i++){
for(j=1;j<5;j++){
c = fgetc(fp);
for(k=0;k<8;k++){
pset(j*8-k,i,(c & 1)*7);
c = c >> 1;
}
}
}
getch();
(中略)
}
データは普通1・マスク1・普通2・マスク2・・・・と交互に入っています。ゲーム上ではマスクデータを AND で表示して普通のデータを OR で表示させていると思われます。アニメーションするカーソルなのでデータは2つづつ、マスクを合わせると4つのデータが一まとまりとなっています。
第6回 A6ファイル
A6 といえばこの前まで何に使うかさっぱりでしたがやっとわかりました。マウスの位置の情報です。普通の状態ではマウスカーソルは矢印ですが、場所によっては形状が変ります。A6 にはその場所の情報が入っています。これは文章では説明しづらいので箇条書き(?)にしてみました。
- 最初の2バイトは番号を表す
- 次に2バイトづつ「左上X」、「左上Y」、「右上X」、「右上Y」となっている
- 次の2バイトが先程の番号と同じならばその番号で続ける
- 違うならば新しいオブジェクトの座標となる
- 番号が FF となったらファイル終了
言葉の補足をします。オブジェクトとは画面上のクリックできる物体のことです。物体ではなくて顔や目だったりすることもあります。番号とはそのオブジェクトに与えられた番号だと思ってください。そのオブジェクトが矩形だったら座標を与えるのは簡単ですが、円形だったりした場合はそのオブジェクトを数個に分割してそれぞれの座標を与えます。しかし元は同じオブジェクトで同じメッセージが返ってくるので同じ番号が振られます。図で説明します。

ここでの物体1は一つしかないので座標を与えるのは1回で十分です。物体2は三つに分割されているので3回座標を与える必要があります。3回座標を与えるには手順3にあるように番号3の座標をもう2度与えるしかありません。物体3も同様に2回座標を与える必要があります。
詳しく知りたい人はメールを下さい(汗)。
第7回 アニメーション用「S4ファイル」
S4 はアニメーションする際に必要な座標データ等々が入っています。わかっているのは座標だけです。
- ファイルの中身が 53H となっている所を探す
- その次の1バイトx8がコピー元の左上のX座標
- その後の1バイトがコピー元の左上のY座標
- その次の1バイトは不明
- その次の1バイトx8がコピー元の右下のX座
しかし、グラフィックローダーを使用して絵を見てみるとわかりますがグラフィックとアニメーショングラフィックを両方とも同じ画面に表示すると重なる場合があります(例:L.PD8 と LAN.PD8)。その場合は手順1が少し違います。手順1は
ファイルの中身が 12H となっている所を探す
となります。
このコーナーでの情報はあくまで私個人が勝手に調べた物です。elf に問い合わせたりしないようお願いします。また、間違いが多数あると思いますが責任は取れませんので御了承下さい