メモリーカードのセーブデータのバイナリ構造を解説します。
セーブデータはいわゆるベタイメージを仮定しています。
ノエルのセーブデータが1ブロック目にあることを仮定しています。
アドレスを青、値を赤で示しています。このページの色付きの値は16進数です。
PlayStation のメモリーカード管理画面に表示されるセーブデータ名前はアドレス2000 〜 205Fに書かれています。
具体的には「NOёL月月/日日」という文字列です。
PlayStation のメモリーカード管理画面に表示されるアイコンはアドレス2080 〜 21FFに描かれています。
アドレス2080 〜 20FFがアイコン1です。
アドレス2100 〜 217Fがアイコン2です。
アドレス2180 〜 21FFがアイコン3です。
アイコン1, 2, 3でパラパラアニメします。
アニメーションは2タイプあり、メモリーカードに書き込まれるアニメーションはセーブするときにランダムで決定されます。
現在の日付と時刻はアドレス2200 〜 2203です。
この項目はチェックサムにかかりません。
2203 2202 2201 2200 アドレス ******** ******** ******** ******** -- -- 月 ----- 日 ---- - 時 -- ---- 分 ------ 秒
アドレス2200の上位2ビットとアドレス2201の下位2ビットが「月」です。
アドレス2201の上位2ビット目から6ビット目が「日」です。
アドレス2201の上位1ビットとアドレス2202の下位4ビットが「時」です。
アドレス2202の上位4ビットとアドレス2203の下位2ビットが「分」です。
アドレス2203の上位6ビットが「秒」です。
「20時61分」のように誤った値を入れると、ロード時に正しい値が計算されてます。この例の場合は「21時1分」となります。
また、会話した日や会話していない日は記録しないようです。現在時刻を過去に書き換えたら再び会話ができました。セーブすると次の日になるので、十分な実装でしょう。
相手に電話をかけるために必要なIDのフラグはアドレス2205です。
2205 アドレス
********
1 代歩
1 恵壬
1 由香
代歩が上位2ビット目、恵壬が上位3ビット目、由香が上位4ビット目がそれぞれのフラグです。1が ON で0が OFF です。ただし、代歩を OFF にしても、日付が 9/25 になると、強制的に代歩の ID を知っている状態になります。
VISUAL MAILは「MAIL所持フラグ」と「送信者」が別々に管理されています。
VISUAL MAILの所持フラグがアドレス2206 〜 2207です。
VISUAL MAILの送信者がアドレス2246 〜 2254です。
2206 2207 アドレス ******** ******** *NA* VACATION? 2246 1 ATHLETHIC 2248 1 AMUSEMENT 224A 1 CULTURAL FESTA(前日) 224C 1 CULTURAL FESTA(当日) 224E 1 EXCURSION 2250 1 TOURNAMENT(長) 2252 1 TOURNAMENT(短) 2254 1 TOURNAMENT(中)
アドレス2206の上位1ビット目は何の影響もありません。
アドレス2206の上位2ビット目はATHLETICの所持フラグ、アドレス2246が送信者です。
アドレス2206の上位3ビット目はAMUSEMENTの所持フラグ、アドレス2248が送信者です。
アドレス2206の上位4ビット目はCULTURAL FESTA(前日)の所持フラグ、アドレス224Aが送信者です。
アドレス2206の上位5ビット目はCLUTURAL FESTA(当日)の所持フラグ、アドレス224Cが送信者です。
アドレス2206の上位6ビット目はEXCURSIONの所持フラグ、アドレス224Eが送信者です。
アドレス2206の上位7ビット目はTOURNAMENT(長)の所持フラグ、アドレス2250が送信者です。
アドレス2206の上位8ビット目はTOURNAMENT(短)の所持フラグ、アドレス2252が送信者です。
アドレス2207の上位1ビット目はTOURNAMENT(中)の所持フラグ、アドレス2254が送信者です。
また、ゲーム中に表示されるVISUAL MAILは6つまでです。正規プレイではありえませんが、6個以上のフラグが立っている場合には表の上にあるものが優先されます。
送信者の値が00なら代歩から、01なら恵壬から、02なら由香からです。
アドレス224Aに01以外の数字を入れても、ゲーム中に表示されるメッセージは強制的に恵壬になりますが、エンディングのためのチェックには設定した値が使われます。
ネットワークエージェントデータの一部は以下のフラグを立てることにより検索にヒットするようになります。
そのフラグは
アドレス220Cで
10(上位4ビット目を1)にすると、XMAS CARD
20(上位3ビット目を1)にすると、YUKA DATE MAP
40(上位2ビット目を1)にすると、KAHO DATE MAP
80(上位1ビット目を1)にすると、EMI DATE MAP
がヒットするようになります。
好感度はアドレス226A 〜 226Fです。
アドレス226A 〜 226Bが代歩の好感度です。
アドレス226C 〜 226Dが恵壬の好感度です。
アドレス226E 〜 226Fが由香の好感度です。
初期値は3人ともに1Eです。
アドレス2270をちょうど32(10進数で50)にすると10/9に誕生日プレゼントをした会話ができます。
アドレス2270を64(10進数で100)以上にすると11/29, 12/2に付き合ってる会話ができます。
どちらも、あるビットを立てるわけではないので、正確には「フラグ」ではないです。
プールウインドウ関係はアドレス2274 〜 227Fです。
640x480ピクセルのボール置き場の一部がウインドウとして画面上に表示されています。
アドレス2274がウインドウの左上のx座標です。
アドレス2276がウインドウの左上のy座標です。
アドレス2278がウインドウの幅です。
アドレス227Aがウインドウの高さです。
x座標の値域が12 〜 DE(18 〜 222)ピクセル、y座標の値域が12 〜 8E(18 〜 142)ピクセルです。
幅の値域が30 〜 FC(48 〜 252)ピクセル、高さの値域が30 〜 AC(48 〜 172)ピクセルです。ただし幅、高さともにゲーム画面をはみ出さない範囲です。
アドレス227C 〜 227Dがゲーム画面を基準としたボール置き場の相対x位置です。
アドレス227D 〜 227Eがゲーム画面を基準としたボール置き場の相対y位置です。
相対x位置の値域がFD C2 〜 00 DE(-574 〜 222)ピクセル、相対y位置の値域がFE 9D 〜 00 8E(-414 〜 142)ピクセルです。ただし相対x位置, 相対y位置ともにウインドウのx, y座標を超えない範囲です。
これらを図示すると以下のようになります。
会話ボールはアドレス229B 〜 253Bです。
ボールはひとつ14バイトで構成されています。
ボールは48個まで持てます。アドレスは逆転していますがボールは1から順に埋まります。
ボール48 アドレス229C 〜 229Dがx座標です。 アドレス229E 〜 229Fがy座標です。 アドレス22A0 〜 22A3が常に00000000です。 アドレス22A4 〜 22A5がボールの存在フラグです。 アドレス22A6 〜 22A7がボールIDです。 アドレス22A8 〜 22A9が色です。 ボール47 アドレス22AA 〜 22ABがx座標です。 アドレス22AC 〜 22ADがy座標です。 アドレス22AE 〜 22B1が常に00000000です。 アドレス22B2 〜 22B3がボールの存在フラグです。 アドレス22B4 〜 22B5がボールIDです。 アドレス22B6 〜 22B7が色です。 … ボール1 アドレス252E 〜 252Fがx座標です。 アドレス2530 〜 2531がy座標です。 アドレス2532 〜 2535が常に00000000です。 アドレス2536 〜 2537がボールの存在フラグです。 アドレス2538 〜 2539がボールIDです。 アドレス253A 〜 253Bが色です。
座標xの値域は0000 〜 027F(0 〜 640)です。
座標yの値域は0000 〜 01DF(0 〜 480)です。
ボールの存在フラグは0000がOFF、FFFFがONです。
ボールIDは、それぞれ以下のようになります。
代歩のボールであれば、値0000が「バイト中」、0001が「制服」、…、03B2「予感」です。
恵壬のボールであれば、値2000が「夏」、2001が「代歩達」、…、2225が「バレンタイン」です。
由香のボールであれば、値4000が「グチ」、4001が「代歩」、…、41CBが「安心」です。
色の値は332Fが青、3330が緑、732Fが赤、7330が黄、B32Fが紫、B330が灰、F32Fが青緑です。通常プレイ中は、会話ボールの色は、ID の 0 から、青、赤、紫、青緑、緑、黄、灰、…と割り振られます。つまり、ID を 7 で割ったあまりで色が決まります。
会話ボールを使用したり、削除したりして、存在しなくなったときは、存在フラグを0000にします。それ以外の値はそのままになります。
新しい会話ボールを取得したときは、ボール1, ボール2, ... ボール48 の順で検索して、最初に見つかった存在フラグが0000のボールのそれをFFFFにして、それ以外の値を新しい会話ボールの値で上書きします。
音声のボリュームはアドレス253C 〜 2541です。
アドレス253C 〜 253DがVOICEです。
アドレス253E 〜 253FがSEです。
アドレス2540 〜 2541がMOVIEです。
値は2バイトです。
初期値は3000です。
値域は0 〜 4000 (0 〜 16384)です。4001以上の値を入れるとボリュームの数字の部分がバグります。
この値を10進数にして、 99/16384 (表示上の最大/内部データ上の最大)をかけた値(小数点以下切り上げ)が、ゲーム画面での値になります。
アカウント関係はアドレス2542 〜 254Bです。
アドレス2542 〜 2543が残りアカウントです
アドレス2544 〜 2545が9月のアカウント消費量です。
アドレス2546 〜 2547が10月のアカウント消費量です。
アドレス2548 〜 2549が11月のアカウント消費量です。
アドレス254A 〜 254Bが12月のアカウント消費量です。
値域は0000 〜 FFFF(0 〜 65535)分です。
ゲーム画面では下3桁のみ表示されます。1000分であれば000、65535分であれば535と表示されます。
すべて分単位で表示・保存されます。秒単位の値は保存されていません。
個々のボールの使用回数はアドレス254C 〜 2CF1です。
ボール1つに付き1バイト割り当てられていて、値域は00 〜 FF(0 〜 255)回です。
代歩のボールの表の順で、アドレス254Cが「バイト中」、254Dが「制服」、…、28FEが「予感」の使用回数です。
恵壬のボールの表の順で、アドレス28FFが「夏」、2900が「代歩達」、…、2B24が「バレンタイン」の使用回数です。
由香のボールの表の順で、アドレス2B25が「グチ」、2B26が「代歩」、…、2CF1が「安心」の使用回数です。
ネットワークデータで、各データを検索してヒットしたことがあるかどうかのフラグのアドレスは 3CC2 〜 3D25です。
アドレス3CC2が データID: 00(YUKA'S HOMEPAGE) の状態、3CC3がデータID: 01(YUKA'S HOMEPAGE OMOIDE KUN) の状態、…、3D1FがデータID: 5D(3 GIRLS SECRET DATA) の状態を示します。
フラグの状態は、ネットワークエージェントに左から右に、エージェント1、エージェント2、エージェント3、エージェント4、エージェント5とすると、
です。
ネットワークのデータはアドレス3D26 〜 3D89(100バイト)です。
それぞれ各1バイトにつき1つデータが入ります。
値域は00 〜 5DとFFです。
NETWORK AGENTのデータ順に、00が YUKA'S HOMEPAGE 、01が YUKA'S HOMEPAGE OMOIDE KUN、…、5Dが 3 GIRLS SECRET DATA を表します。
94種類のデータがあります。
データなしを意味するデフォルトはFFです。
正規プレイ中にはありえませんが、同じデータを100個持つこともできます。
ディスクにデータが設定されていない5Eなどの値を指定して、そのデータを選択すると、フリーズしたり、リセットがかかったりします。
データなしを意味するFFを設定したアドレスよりも後ろに、それ以外の値を設定すると、テキストがバグります。データありは連続している必要があります。
チェックサムはアドレス3D8Aです。
計算方式は単純な加算方式です。計算領域はアドレス2204からアドレス3D89です。
ゲームの起動時に、この値が正しくない場合は、データが壊れているとみなされ、最初(9/25 20:00)から初期状態でゲームが始まります。