<   2009年 06月 ( 4 )   > この月の画像一覧

古印体のフォーマット その2

前回の話の続きをします。
ブロックのタイプには4種類あると言いましたが、それぞれのタイプのフォーマットは以下の通りです。

・タイプ0(非圧縮,8バイト)
最初のバイトがそのブロックの1行目で、最後のバイトが8行目に対応します。
そして、各々のバイトのbit7が1列目で、bit0が8列目に対応します。
要するに圧縮しない、そのまんまのタイプです。

・タイプ1(全て黒,0バイト)
そのブロックのドットは全て黒になります。

・タイプ2(省略行は黒,1+nバイト)
最初のバイトで省略する行を表し、bit0が1行目、bit7が8行目に対応します。
ある行に対応するビットが1のときその行は省略せず、0のときその行は省略します。省略された行は8ドット全てが黒になります。
残りのnバイトに、省略しない行を続けて書きます。各々のバイトのbit7が1列目で、bit0が8列目です。

・タイプ3(省略行は上の行と同じ,1+nバイト)
タイプ2と同じような仕組みですが、省略された行は上の行と同じ描画をする所が違います。
続けてn個の行が省略された場合も、上の省略されていない行と同じ描画をn回(合計n+1回)繰り返します。
但し、1~n行目が省略行だった場合、それらは全て黒になります。

ということで、古印体のフォーマットの解説はこれで終了です。こんな説明でお分かり頂けますでしょうか?もっと分かりやすい説明ができれば良いのですが。
練習問題を1つ出しておきます。以下のデータがカタカナの「マ」であることを確認してみましょう。全てのタイプが使われています。

02 BB D8 63 FF 7E 38 3E 10 7B F0 E0 80 5E E0 F0
38 1C 1E E0 02 03 01 1A F0 01 03 8C FC 1F 3E 3C
78 E0 C0 F8 7C 1E 0F 0F 07 03 01 57 98 80 C0 80
[PR]
by oyasen | 2009-06-17 20:04 | 改造・解析

古印体のフォーマット その1

階段を降りた直後や、中断した所から再開した時に「99 掛軸裏の洞窟」等と表示されますね。今回はあのフォントの話です。
このフォントは「古印体」と呼ぶことを最近知りました。印鑑に使われる書体だそうですが、少し怖いイメージがあるからか、その手の作品にしばしば登場します(どちらが先かは分かりませんが)。言うまでもなく、かまいたちの夜のタイトル画面のフォントもこれです。
いつものようにJavaScriptで文字を表示していると、いきなり「怨」の文字が登場してびっくりしたのは秘密です。これはROMハッカーに対するCHUNSOFTからの怨念なのかと一瞬思いましたが、http://oyasen20.tripod.com/other_romhacking.htmlから分かるように、当初は「怨念坂」という地形を入れる予定だった訳ですね。
因みに見れば分かりますが、巻物の洞窟の「巻物」のフォントは適当に描いたもので、古印体ではありません。とても暇な時があれば描き直すかも知れません。

さて、前置きが長くなりましたがこのフォント、簡単な圧縮(と言う程でもないが)がされているのでYY-CHR等では編集できません。地道にバイナリエディタで編集しましょう。
1文字は24*24ドットですが、それは8*8ドットのブロックに分かれています。ブロックを左から右へ並べ、右端まで来ると下の行へ降りて左から右へ並べ……を繰り返して1つの文字を描画します。
更にブロックのデータにはタイプ0~タイプ3の4つのタイプがあります。これはブロック毎に自由に設定でき、そのデータを圧縮するか否か、圧縮する場合はその方法を決定します。

1つの文字のフォーマットは以下の通りです。

・横幅(1バイト)
・ブロック1~4のタイプ(1バイト)
・ブロック1(0~8バイト)
・ブロック2(0~8バイト)
・ブロック3(0~8バイト)
・ブロック4(0~8バイト)
・ブロック5~8のタイプ(1バイト)
・ブロック5(0~8バイト)
・ブロック6(0~8バイト)
・ブロック7(0~8バイト)
・ブロック8(0~8バイト)
……

但し、
・(横幅)=(実際の横幅/8)-1
・(ブロックn~n+3のタイプ)=(ブロックnのタイプ)+04h*(ブロックn+1のタイプ)+10h*(ブロックn+2のタイプ)+40h*(ブロックn+3のタイプ)

24*24ドットの文字なら、横幅の値は24/8-1=2、すなわち02hになります。

タイプの解説は次回に行います。
[PR]
by oyasen | 2009-06-09 19:48 | 改造・解析

(疑似)乱数について

http://oyasen20.tripod.com/random.html
上のページでも解説している本ゲームの乱数ですが、周期は丁度2^31であることが分かりました。
残念ながら当方にはまともなプログラムの開発環境がないので、拙い方法ですが、ひたすら乱数生成をするJavaScriptを埋め込んだページを、PCを使っている間ずっと開いておく、ということを何日か続けて確認しました。
従って、乱数の初期値の組み合わせが2^31のループに含まれるようにセットされるならば、生成されるダンジョンは高々2^31通りということになります。
もし非常に高速なコンピュータがあって、ダンジョンの背景やシレンの初期位置から乱数を逆算できれば、そこからそのフロアの構造や未来が予測できるかも知れません。
2^31のループに含まれない乱数の組み合わせが与えられると、どこかで2^31のループに合流するか、それともより小さいループを回り続けるか、ということになるのでしょうが、勿論私には詳しくは分かりません。

http://www42.atwiki.jp/tsukikage_gb/pages/18.html
こんなページを見つけました。GB版でも乱数生成アルゴリズムは同じようです。トルネコでも多分同じでしょう。
[PR]
by oyasen | 2009-06-04 21:06 | 改造・解析

web拍手への返信

今まで全くできていなかった、web拍手への返信をしておきます。
これで終わりではありません。残りはまた次回で。


>どうも、お久しぶりです。記憶に残っていないかもしれないですがw
>
>久々に覗いてみたら更新されていてびっくりしました。
>サイトの内容は前以上に充実しつつありますね。
>没罠の出し方だとか、パレットの変更だとか・・・
>今後の更新を楽しみにしております。
>
>当時ここを利用させて頂いていた頃は中学生でしたが、
>今では3月に高校卒業を控えている年齢となりました。
>また暇ができたら是非、自分も改造に挑戦したいと思っております。
>ではでは。

お久しぶりです。重要な所は大体調べ終わった感がありますが、他にも調べたいことがまだいくつか残っているので、時間ができ次第手を付けていこうと思っています。


>デバッグモードの出し方参考になりました。
>
>トルネコのほうでも同じような方法でデバッグモードのようなものが出せたのですが、確認できたのが ダンジョン内でSTRATボタンを押すごとに地獄耳→千里眼→レミーラ→フロアの敵全滅(1フロアで1回限定)→1フロア移動+1レベルアップとお店でSELECTボタンを押すごとに店が発展する の2つだけで、シレンのようにいろいろとできるわけではなさそうです(もしかしたら確認できてないところもあるかも・・・2Pで操作など)
ちなみに出し方はアドレスの00000000と00000001をFFから00に変えるだけです。

何と。
これはいつかやってみたいと思います。


>巻物の洞窟、クリアしました~
>
>地巻きを読んで少しずつ盾を強くするのが楽しかったです。
>やっぱりバクスイ強いですね。混乱、パワーアップあたりもいい感じでした。
>
>鉄の矢は200本持って進めましたがちょうど使い切る感じでした。
>食糧難にも何度か見舞われましたが、実は困った時の使い道が食料か解呪しかないことに気がつきました。
>囲まれたらついバクスイ読んでしまいますね。
>
>モンスターは全体を通してガイコツまおうが脅威でした
>。まどうの杖を落とすいいヤツではありますが…
>ハイパーゲイズが即死攻撃を仕掛けてくるのも怖かったです。
>
>深層はアークをジェノってからは吸い出しを底抜けに読んだり、大部屋全滅などでサクサク展開でした。20フロアくらい直滑降でした。
>地球の裏側でフェイ一家を時の砂の巻物を併用して3回ほど自爆で吹っ飛ばして帰ってきました。
>
>楽しいダンジョンありがとうございました。

プレイして頂きありがとうございます。そして、クリアおめでとうございます。やまびこの盾が店限定で出るようにしているのですが、それが出るのと出ないのとでは難易度が大きく変わりますね。ガイコツまおうやハイパーゲイズがきついと思って出るようにしたのですが、出さない方がスリルがあって面白かったかな、とも思い始めています。
[PR]
by oyasen | 2009-06-01 20:53 | web拍手への返信