ユーザ用ツール

サイト用ツール


技術資料

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
技術資料 [2024/02/20 15:53] – [条件語] araki技術資料 [2024/02/21 10:50] (現在) – [部屋データ] araki
行 182: 行 182:
 ===== 画面データ仕様 ===== ===== 画面データ仕様 =====
  
 +==== 部屋データ ====
 +
 +部屋データは、一部屋 0xa00バイト(2.5KB)からなり、各部屋は1KBの画像描画データおよび、0x500バイトの部屋固有のメッセージデータおよび、0x100バイトの特定のコマンドとメッセージとのリンク情報からなる。
 +
 +部屋にしても、ものにしても、FM-7上で、BASICを使って描画することを前提につくられている。
 +線を引き、色を塗るという動作を座標と色データの形で格納している。
 +
 +線の描画は繊細で、BASICで使っているであろうロジックに近しいもので描画しないと、色を塗るときの座標が想定している境界線とマッチしなくなる可能性がある。((実際PalmOSで実装したときに、内蔵の線描をつかったらpaintしたときに想定外のところが塗られてしまった。))
 +
 +このため、移植する際には、まずグラフィックスの描画ルーチンを実装し、データを実際に描かせてみてから先へ進めることにしている。
 +とはいえ、昨今は256x152のビットマップバッファを作って、それをターゲットの環境にレンダリングさせているだけなので、ほぼほぼ、問題なく動いている。
 +
 +=== 描画データ ===
 +
 +先頭には、トーンパターンが何色分定義されているのかが1byteで表されている。
 +トーンパターンは、1-7の色を指定されたパターンで置き換えるためのもので、カラーパレット機能のようなものである。
 +
 +その後ろに3バイト(BRG)のトーンデータが指定された数だけ続き、その後ろがようやく最初の描画データになる。
 +
 +描画を始める前に、描画域全体を青(色コード1)で塗りつぶす。
 +
 +(x,y)のポイントデータの羅列で、最初のペアから次のペアへの線を白(色コード7)で描いていく。
 +読みだした(x,y)がともに0xffなら線描パートは終わりである。
 +yだけが0xffの場合はそのペアを捨てて、次のペアを新しい始点として線を描いていく。
 +
 +続いて、(x,y,c)のペアで色塗りデータが続く。(x,y)ともに0xffなら色塗りは終了である。
 +
 +画像によっては、この後ろに、白線での輪郭描画、黒線での輪郭描画のデータが続き、最後にトーン処理を行う。
 +
 +トーンデータは最初に書いたように、パターン数+パターン数*3バイトのパターンデータとして登録されている。
 +最大で6 (カラーコード1-7に対応)のパターンがあり、対応するカラーコードを置き換えていく。
 +
 +PC-9801では、パターンデータのままに、縞模様を使った中間色画像として描画されたが、PalmOS以降ではそれらしい色に置き換えるように変更してある。
 +
 +PalmOSとAndroidには縞模様の中間色画像を表示する機能も付けてあるが、あえて表示する価値はないと思われる。
 +^ トーンデータ ^^^^^ 線画データ ^^^^^^^^^^^^^^
 +|n|t1(B)|t1(R)|t1(G)|...|x0|y0|x1|y1|...|xn|0xff|x0|y0|x1|y1|...|0xff|0xff|
 +
 +^ ペイントデータ ^^^^^^^^^ 白線データ ^^^^^^^^^^^^
 +|x|y|c|x|y|c|...|0xff|0xff|x0|y0|...|xn|0xff|x0|y0|x1|y1|...|0xff|0xff|
 +
 +^ 黒線データ ^^^^^^^^^^^^^^
 +|x0|y0|x1|y1|...|xn|0xff|x0|y0|x1|y1|...|0xff|0xff|
 +
 +== トーンデータ ==
 +
 +トーンデータは、3バイトを一組として、BRGの横8dot分のトーンパターンを定義している。
 +カラーコード1-7で描かれている部分をこのトーンパターンで置き換え、中間色表現による色表現を行う。
 +
 +要は、当該カラーコードのある点に対して、<code>((b >> (7 - (x % 8)) & 1) | (((r >> (7 - (x % 8)) & 1) << 1) | (((g >> (7 - (x % 8)) & 1) << 2)</code> の色を置いていく(8色モードの場合)ことになる。
 +
 +なお、今どきの端末の多くはRGB565であったり ARGB8888であったりと、より多色を使った表示がかのうなので、あえて中間色を使う必要性は高くない。
 +
 +中間色は、要は、交互に色を並べることで、その中間の色に見せる(白+赤ならピンクに見えるように)というものなので、パターンのうち1が立っているビットの密度を数えて、それをB/R/Gそれぞれの色の輝度(0~7)と見なし、疑似的にRGB333の色コードとして変換、これをさらにRGB565やARGB8888に変換して表示している。
 +
 +
 +=== メッセージデータ ===
 +
 +メッセージデータは、部屋データのオフセット 0x500から0x500バイトの領域に配置される。
 +先頭からメッセージ番号0,1,2... と続く。
 +
 +メッセージは最初の2バイトがメッセージ長で、その後ろに長さ分のメッセージデータが続き、その後ろに次のメッセージが配置される。
 +メッセージはUTF-8でエンコーディングされている。
 +オリジナルとなったPC-9801版はShift_JISだったが、時代にそぐわないので、PalmOS版を作るときにすべてUTF-8にした。
 +メッセージ長はbig endianであるので、処理には注意。
 +メッセージ長0の文字列が現れたらメッセージは終わりである。
 +
 +メッセージ番号0のメッセージは、そのマップが表示されたときに表示されるメッセージで、それ以外のメッセージは、その場所で特定の動作をしたときに表示されるメッセージである。
 +その特定の動作は、コマンド・メッセージリンクで定義されている。
 +
 +^メッセージ長^^メッセージ^メッセージ長^^メッセージ^ ^終端マーク^^
 +|上位|下位|文字列0(UTF-8)...|上位|下位|文字列1(UTF-8)...|...|0|0|
 +
 +=== コマンド・メッセージリンク ===
 +
 +描画データのあと、オフセット0x400から0x100バイトのデータが、コマンド・メッセージリンクになる。
 +3バイト一組のデータで、動詞+目的語+メッセージIDである。
 +後続のメッセージ部のメッセージ数分だけのエントリーが存在している。
 +
 +その場所で、動詞+目的語の動作をしたときに、ID番目のメッセージを表示する。
 +
 +ただ表示するだけなので、ゲーム中で何ら作用を持たないものであることは明らかであるが、
 +こういう仕掛けを一所懸命しこんだであろう原作者たちの思いを表すものである。
 +
 +^リンクデータ0^^^ ^終端マーク^
 +|動詞|目的語|メッセージ番号|...|0|
 +
 +==== ものデータ ====
 +
 +ものデータは、落ちているものと○○先生の描画データである。
 +それぞれの描画データは0.5KBである。
 +
 +ものデータは、そのものがある部屋に来たときに、部屋の画像の上に表示される。
 +このことにより、任意の部屋にものを置けば、そのものが即座に表示されるし、拾えば即座に消える。
 +
 +なお、通常のアイテムの描画データの扱いは一意だが、先生だけは異なった処理を行う。
 ===== 語句辞書仕様 ===== ===== 語句辞書仕様 =====
  
技術資料.1708411990.txt.gz · 最終更新: 2024/02/20 15:53 by araki