カテゴリ:改造・解析( 31 )

特殊モンスターハウスのモンスター出現率のバグ

web拍手で指摘を頂いたのですが、特殊モンスターハウスに出現するモンスターの出現率が、開発者の意図したようにはなっていないようなので、調べてみました。
その他のROMイメージ改造で、次のように書きました。

039764以降 種族データのオフセット
03976E以降 種族データ
039792以降 種族データのサイズ

本来の設定は次の通りです。バイナリエディタで確認しながら見て下さい。

どろぼう:ガマラ,ガマラ,ガマラ,ガマラ,ぬすっトド,ぬすっトド,ぬすっトド,ぬすっトド
ドレイン:吸引幼虫,吸引幼虫,くねくねハニー,くねくねハニー,まわるポリゴン,まわるポリゴン
1ッ目:吸引幼虫,吸引幼虫,ぴーたん,ぴーたん,ゲイズ,ゲイズ,アイアンヘッド,アイアンヘッド
ゴースト:死の使い,死の使い,エーテルデビル,エーテルデビル,パコレプキン,パコレプキン,セルアーマー,セルアーマー
パワー:ナイフゲータ,アイアンヘッド,タウロス,デブータ,火炎入道,キグニ族

しかし、データを読み込むプログラム(03973B以降)にバグがあります。これは書き換え版でも修正されていません(書き換え版ではアドレスがずれています)。
種族データのオフセットが2バイトずつなので、それを読み込む為に引数である$00(特殊モンスターハウスの種類)を2倍にして"X"に入れ、LDA $039764+"X"としてオフセットを読み込みます。
この後、0~7の乱数を発生させて$039792+"X"と比較して、前者が後者以上だと乱数生成をやり直すようになっているのですが、2倍にされた"X"を1/2倍する処理を忘れています。その結果、種族データのサイズとして読み込まれるデータは1バイトずつ飛び、次のプログラム(039797以降)にまではみ出してしまいます。
更に、種族データのサイズは1バイトずつなのにも拘わらず、比較する時点で2バイトモードを1バイトモードにするのを忘れています。その結果、この比較処理は意味がなくなり、本来6バイト分しか用意されていないドレイン、パワーハウスのデータは2バイトはみ出してしまいます。
それでも、不幸中の幸いと言うか、偶然にもドレインハウスの次の2バイトは1ッ目ハウスの吸引幼虫*2、パワーハウスの次の2バイトは種族データのサイズである08 06(種族データと見なすと火炎入道、デブータ)なので、意図しないモンスターが出たりはしません。だから気付かれなかったのしょう。
ということで、実際は次の表から等確率で選択ということになり、出現する種族に偏りが出ます。それにしても、あまりにも初歩的なミスの連続なのですが、よく大した不具合が起こりませんでしたね。

どろぼう:ガマラ,ガマラ,ガマラ,ガマラ,ぬすっトド,ぬすっトド,ぬすっトド,ぬすっトド
ドレイン:吸引幼虫,吸引幼虫,くねくねハニー,くねくねハニー,まわるポリゴン,まわるポリゴン,吸引幼虫,吸引幼虫
1ッ目:吸引幼虫,吸引幼虫,ぴーたん,ぴーたん,ゲイズ,ゲイズ,アイアンヘッド,アイアンヘッド
ゴースト:死の使い,死の使い,エーテルデビル,エーテルデビル,パコレプキン,パコレプキン,セルアーマー,セルアーマー
パワー:ナイフゲータ,アイアンヘッド,タウロス,デブータ,火炎入道,キグニ族,火炎入道,デブータ
[PR]
by oyasen | 2010-07-04 14:51 | 改造・解析

スプライトの圧縮

リクエストがあったので武器・盾のグラフィックデータのフォーマットを調べてみました。
それから、報告だけしておいてまだ解説できていなかったキャラのグラフィックデータのフォーマットも序でに解説します(武器・盾と殆ど同じです)。
古印体のフォーマットの応用なので、先そちらを理解した方が良いです。
1つのデータのフォーマットは以下の通りです。

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

1つのブロックは8*8ピクセルで、左から右へ16ブロック並べると次の行へ下ります。1つのデータにつき16*4ブロック、128*32ピクセルです(盾は16*2ブロック、128*16ピクセルです)。
古印体と同様に、ブロックn~n+3のタイプは、bit0,1がブロックnの、bit2,3がブロックn+1の、bit4,5がブロックn+2の、bit6,7がブロックn+3のタイプを示します。
そして、やはりタイプ0は非圧縮、タイプ1は全て透明なブロック、タイプ2は省略行は透明なブロック、タイプ3は省略行は上の行と同じブロックです。

タイプ0はそのまんま、
1行目のbit0、1行目のbit1、2行目のbit0、2行目のbit1、……、8行目のbit0、8行目のbit1、
1行目のbit2、1行目のbit3、2行目のbit2、2行目のbit3、……、8行目のbit2、8行目のbit3、
で32バイトです。それぞれのバイトは、最上位ビットが一番左のドット、最下位ビットが一番右のドットに対応します。bit0~bit3を組み合わせて1ピクセルにつき4ビットになります。

タイプ1は0バイトなので解説不要として、タイプ2,3はまず省略されたバイトを示す2バイトを入れます。bit0が1~2バイト目、bit15が31~32バイト目に対応し、0で省略、1で省略していないことを示します。
そして、タイプ2は0のビットに対応する2バイトを00 00で、タイプ3は0のビットに対応する2バイトを直前と同じ2バイト(先頭の行が省略されている場合は00 00)で埋めて、32バイトのデータを作ります。
但し、タイプ2で展開したデータはタイプ0,3とは違って、
1行目のbit0、1行目のbit1、1行目のbit2、1行目のbit3、……、8行目のbit0、8行目のbit1、8行目のbit2、8行目のbit3、
で32バイトとなります。

これを組み合わせて1つのグラフィックデータの完成です。
パレットは、0は透明、1~4は3BC5D7~3BC5DE、5~9は武器によって変わる5色、A~Fは盾によって変わる6色です。
これで展開していくと、次のようなグラフィックが出て来ます。
http://oyasen20.tripod.com/image/sprite1.png

キャラのグラフィックデータも圧縮の仕組みは同じですが、最初に横幅等を示すバイトがあり、左から右へではなく上から下へブロックを並べていく所が違います。
でも、古印体なら手作業でも展開できないことはないですが、グラフィックデータは自分で圧縮・展開ツールを作ってやらないと大変だと思います。
因みに私はまともなプログラムの開発環境がなく、グラフィックの表示はいつもJavaScriptにやらせている(非常に遅い)ので、私に展開ツールは求めないで下さい。

上の解説が分かりにくいという人は次の例を見てみると分かるかも知れません。
http://oyasen20.tripod.com/image/sprite2.png
http://oyasen20.tripod.com/image/sprite3.png
[PR]
by oyasen | 2010-06-20 14:19 | 改造・解析

コドモ戦車の行動の分かりやすい解説

コドモ戦車の行動が分かりにくいというトラックバックが来たので、もう少し分かりやすく解説してみます。
次の処理を2回繰り返します(1回目に攻撃した場合を除く)。これでコドモ戦車の行動は全て説明できる筈です。

1.隣接している→逃げる
2.2~3マスで軸が合っていない→軸を合わせる(シレンが見えていなくても)
3.それ以外→乱数発生
├3-1.乱数が00~7Fでシレンが見えていて、軸が合っていない→近づく
├3-2.乱数が00~7Fでシレンが見えていて、軸が合っている→攻撃、行動終了
├3-3.乱数が00~7Fでシレンが見えていない→目的地に向かって進む
└3-4.乱数が80~FF→何もしない



・部屋で壁に追い詰めると真横に逃げる……1.→1.
・部屋で軸が合っていて矢を撃つ……3-2.で行動終了または3-4.→3-2.
・部屋で軸が合っていて矢を撃ってこない……3-4.→3-4.
・部屋でシレンの移動と平行に移動して矢を撃つ……2.→3-2.
・部屋で1マスしか近付いて来ない……3-1.→3-4.または3-4.→3-1.
・通路の曲がり角を挟んでこちらに来ない……2.→2.(でも壁が邪魔)
・通路で後退した後戻って来る……1.→3-3.
・通路で後退した後戻って来ない……1.→3-4.
・通路の行き止まりに追い詰めた……1.→1.(でも逃げられない)
[PR]
by oyasen | 2010-06-06 12:10 | 改造・解析

記事にならない小ネタ集 その4

・罠について色々

落とし穴と毒矢の罠(シレンに対して)は攻撃力8、毒矢の罠(モンスターに対して)は攻撃力30、落石スイッチは防御力無視で5~9のダメージでした。
見えている罠を踏んだ時に作動する確率は1/2でした。

・転んで壺が割れる確率

ばらまいた壺毎に乱数を発生させて1/16の確率で割れますが、1つ割れるとそれ以降の壺は割れません。
これは転び石、ドレムラス系共に同じでした。

・山頂の町での駆け落ちイベントの確率

宿屋には7/8の確率でツムリ、オビト、カズラの何れかの泊まり客がいます(ほぼ1/3ずつです)。泊まり客がいないとき、1/4の確率でイベントが起こります。ということで1/32でした。
勘違いされないように言っておきますが、1/4というのも山頂の町に着いた瞬間に決まっており、襖を調べる毎に1/4の確率でコッパが反応するのではありません。一度調べて何もなければそれまでです。
[PR]
by oyasen | 2010-05-23 12:58 | 改造・解析

記事にならない小ネタ集 その3

・奇岩谷の親子

奇岩谷で持っている道具と困った時の巻物の交換を求められるイベントですが、1/4の確率で、冒険回数が50回以上のときに起こります。
ただでさえ行き止まりに住居があるのでわざわざ行かなければ気付かないのに、なぜこんな奇妙な出現条件にしたのでしょうか。

・腹減りじじい

1/16の確率で、持っている道具(壺の中は除く)のおにぎりの個数が1のとき(おにぎりを食べる前に数える)に、おにぎり(こちらは壺の中のおにぎりでも)を食べようとすると出現します。
従って、壺の外におにぎりを1つ出しておくと、壺の中のおにぎりでも腹減りじじいが出現する可能性があります。多分足元のおにぎりでも出現します。

・座頭ケチの指圧

(現在HP)≠(最大HP)または(ちから)≠(ちからの最大値)のとき、171/256の確率で成功します。意外と成功率は高めでした。
しかし、上の否定は(現在HP)=(最大HP)かつ(ちから)=(ちからの最大値)ですから、指圧する意味がない時には必ず失敗します。これが成功率が低く感じる原因でしょう。
[PR]
by oyasen | 2010-05-02 13:30 | 改造・解析

コドモ戦車

恐らく、本ゲームで最も予測困難な動きをすると思われる、コドモ戦車の話です。
基本的にコドモ戦車が移動するかどうかは、2つの例外を除いてランダム性があります。コドモ戦車は1ターンに2回移動しますが、それぞれの移動で乱数を発生させて、1/2の確率で移動します(攻撃も同様だが、2回攻撃はしない)。
2つの例外とは、1つはシレンと隣接している場合(逃げる)、もう1つはシレンとの距離が2~3マスで軸が合っていない場合(軸を合わせる)です。後者の場合に限って、通路にいる場合でもシレンの位置が分かっているものとして移動するのはご存じの通りです。

例えば、通路で隣接している時は、1回目の移動では必ず逃げ、2回目の移動では、戻って来るか来ないかはそれぞれ1/2です。
もしコドモ戦車が逃げたまま戻って来なかった場合に、素振りするとどうなるか。1回目の移動で戻って来た場合、2回目は必ず逃げることになります。1回目の移動で戻って来なかった場合、2回目に戻って来るか来ないかはそれぞれ1/2です。

部屋で軸が合っている時に自ら近づいて来ないことと、上の2つの例外を除けば、ランダム性があるだけで動きは普通のモンスターと同じです。
Windows版シレンでは、動きはSFC版より予測しやすかったですが、恐らく、軸を合わせる時に通路でもシレンの位置が分かっているという問題と、移動のランダム性がなくなっているのだと思われます。攻撃にランダム性があるのは相変わらずでしたが。
[PR]
by oyasen | 2010-04-25 11:34 | 改造・解析

記事にならない小ネタ集 その2

・フェイからのご褒美

第1~24問目を解くと竹林の村の、第25~41問目を解くと9~14Fの、第42~50問目を解くと地下水脈の村の店で売られる可能性のある道具が貰えるようです。
何だか中途半端な感じがするので、何度か確認をしてしまいました。

・レベル変化時のHPの変化量

0以上2以下の乱数を2回発生させてその和をとり、それに2を加えた分だけ変化します。
従って、HPの変化量がnとなる確率をP(n)とすると、P(2)=7396/65536,P(3)=14620/65536,P(4)=21845/65536,P(5)=14450/65536,P(6)=7225/65536です(概ね1/9,2/9,3/9,2/9,1/9です)。

・浮島、暗い柱部屋

浮島はマス毎に1/2の確率で道具が出現します。道具が出現する場合、それがギタンになる確率は1/2です。
暗い柱部屋は柱毎に、何もない、モンスター、道具、ンドゥバがそれぞれ1/4ずつの確率で出現します。こちらは道具が出現する場合、それがギタンになる確率は落ちている場合と同じで1/4でした。
[PR]
by oyasen | 2010-04-11 14:08 | 改造・解析

リクエスト

以前にリクエストがあったものを調べてみました。

・「どれを」と聞かれる道具

03F17D~03F1F2で設定します。03F19Dでサブルーチンに飛び、$01に道具の種類を入れます。
壺だと03F1ABで背中、魔物、やりすごし、トドかどうか、壺以外だと03F1BFで識別、壺増大、吸い出しかどうかを見ています。

・投げた道具の貫通

0246C5で$05に遠投かどうかを入れて、その直後に033382にジャンプします。
0333C8~0333D0が遠投、銀の矢のチェックです。この時点で遠投かどうかは$07+"S"、道具の種類は$05+"S"に入っています。

道具の設定方法が分かるくらいなら、これだけ言えば十分でしょう。頑張って下さい。
[PR]
by oyasen | 2010-03-28 15:09 | 改造・解析

記事にならない小ネタ集

1つだけでは記事にならないようなことを3連発です。

・武器を投げた時のダメージ

直接攻撃の場合、(攻撃力)=($00+8)*(素手の攻撃力)/16に$00=(剣の強さ)+(ちから)を入れて求めますが、武器を投げた時の場合は単に$00=(剣の強さ)として攻撃力を求めるようです。
それから非常に細かいことですが、この式は厳密には、(攻撃力)=(素手の攻撃力)+($00-8)*(素手の攻撃力)/16で、/16の四捨五入は絶対値を四捨五入しなければなりません。厳密に計算しないと$00が8未満の時に攻撃力が実際の値より1大きくなってしまうことがあります。

・シャッフルダンジョンのパターン数

1~7Fはそれぞれ10通り、15,16,26Fはそれぞれ5通りでした。多いような少ないような。
杉並の旧街道、山間渓流、天馬峠、瀑布湿原はそれぞれ2フロアありますが、どちらにも出現するパターンというのはなくて、フロア毎にそれぞれ10または5パターンずつあります。まあ同じ形状のフロアが連続で出るのも困りますが。

・会心の重複

まずミノタウロスの斧での判定を行い、次に会心の腕輪での判定を行います。ミノタウロスの斧で会心の一撃と判定されると会心の腕輪の判定は飛ばされます。
よって、両方装備した状態で会心の一撃が出る確率は、1-(1-1/4)*(1-1/2)=5/8でした。実はひねりなしに計算すれば良かったということですね。間違っても1/4+1/2=3/4ではありません。
[PR]
by oyasen | 2010-03-14 15:23 | 改造・解析

アイテムエラー

デバッグモード限定で、以下の状態で次のフロアに進もうとすると、「アイテムエラー」と表示されて操作を受け付けなくなってしまいます。

1.同じ道具番号の道具が複数存在している
2.割り当てがあるにも関わらず、その道具がフロアに存在していない(落ちていない、シレンもモンスターも持っていない)道具番号が存在する
3.割り当てのない道具番号の道具を持っている

通常時は、1.は放置し、2.は割り当てを消去し、3.は雑草を割り当てるようです。
「0本の矢:」が雑草に変わったというバグがありましたが、「0本の矢:」はコードFF(割り当てなし)のバグアイテムなので、3.が適用されたものと思われます。

リセットすると腹が減って倒れたことになってしまい、改造する上では全くメリットがないのですが、普通はあり得ない状態になっていないかチェックする機能ということです。まだまだ秘密が多いデバッグモードでした。
[PR]
by oyasen | 2010-03-07 12:17 | 改造・解析