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

永久倍速のやり方

とうとうSFC版風来のシレン最大の謎を解明する時が来てしまいました。
永久倍速は確実に起こす方法はないとかセーブデータが欲しいとか言った直後に判明したというのも困ったものですが。
やり方から言うと、「キャラ番号00のガイコツまどうに杖を振られて倍速効果が出るとそのまま永久倍速になる」です。

このバグの原因を解説します。
$7E8780はシレンの速度(01 通常,02 倍速)を示し、$7E8708は通常は00で、シレンが倍速のときその残りターンを示します。
$7E8708は00以外だとターン毎に値が1減少し、01から00になった時にシレンの速度を通常に戻します。しかし、シレンが倍速で$7E8708が00だと倍速はいつまで経っても解除されることがありません。この状態が永久倍速です。
そして、ガイコツまどうの倍速効果ですが、これは引数$01を$7E8708に入れるようになっています。しかし、このルーチンの前になければならない筈の、$01に残りターン数を設定する処理が忘れられています。
それでは$01には何が入っているのかというと、杖を振ったガイコツまどうのキャラ番号が以前の処理で入っています。つまり、倍速の残りターンは、杖を振ったガイコツまどうのキャラ番号になってしまいます。
従って、キャラ番号00のガイコツまどうに杖を振られて倍速効果が出ると、残りターンが00の倍速、すなわち永久倍速の完成ということになります。

キャラ番号は、シレンが常に13で、モンスターは12から前に割り当てられていくので、キャラ番号00はモンスターの数を限界まで増やさないと割り当てられません。だから、いざ検証しようと思って通常のフロアで敵にガイコツまどうの肉を投げ付けても永久倍速は起こりません。
それに対して、モンスターハウスならキャラ番号00のガイコツまどうに杖を振られるということは十分起こり得ます。発見報告は複数あるが、それを検証しようとしても誰も発見できない、ということにも納得です。
キャラ番号はメモリを調べなければ、先に行動するモンスター程大きいということくらいしか分かりません。トドを分裂させて最後に分裂したトドにガイコツまどうの肉を投げ付け、杖を振ってもらうのが最も簡単な方法でしょう。

ということで、モンスターハウスや罠が関係していると言われていましたが、きっとそれらは私が言うようにモンスターハウスで杖を振られて永久倍速になり、その後モンスターハウスにある罠を踏んでそれが原因だと勘違いしたのでしょう。
このバグ技を意図的に使って、風来のシレンランキング等にエントリーしたりしないで下さい。
[PR]
by oyasen | 2010-03-04 20:21 | 改造・解析

ワープ

すぐ近くにはワープしない、かと言って近くにしかワープできなくてもフリーズしない、というあのワープの仕組みを調べてみました。

まず、以下のトライを最大100回繰り返します。
1回目の乱数の下位4ビットと、2回目の乱数を合わせて0000~0FFFの乱数を作り、これを0980未満になるまで繰り返して0000~097Fの乱数を得ます。
これは座標(0,0)~(37,63)に対応するので、対応する座標を調べます。そこが店でない部屋で、尚かつキャラがいなければそこに決定し、そうでない場合はリトライします。

100回繰り返しても店でない部屋に当たらなかった場合(そうなるのは全部通路のシャッフルダンジョンくらいでしょう)はもう少し条件を緩めて、今度は成功するまで何度でも繰り返します。
やはり店には飛ばないようですが、今度はそこにキャラがいなければ通路にも飛ぶようです(隠し部屋・隠し通路の中にも飛ぶようです。私は経験がないので分かりませんが、その後は一体どうなるのでしょうか)。

こうして決まったワープ先とワープ元の、X方向の距離とY方向の距離の和(なぜか単なる距離ではない)を調べて、それが19以下なら今までの処理をもう一度最初からやり直します。次は18以下なら、その次は17以下なら、……と1ずつ条件を緩めていきます。
ワープするキャラがシレンで、尚かつ町の場合、更にワープ先が屋外でなければ最初からやり直す処理も加わります。

ということで、単にワープするだけなのに無駄にトライ回数が多いワープ処理でした。
通常はあり得ませんが、シレンとその隣の2マス以外が全部壁のフロアだと、5秒程かかって隣のマスにワープします。シレンのマス以外が全部壁の場合は、0以下ならやり直し、の次に255以下ならやり直し、となり無限ループ、すなわちフリーズしてしまいます(Windows版は修正されていましたが)。
[PR]
by oyasen | 2010-02-21 12:27 | 改造・解析

1つのフロアができるまで その3

前回の続きです。

10.網目部屋

・こばみ谷では8~14F、22~29F限定
・1/4の確率で出現させようとする
・部屋番号の大きい方から調べて、初めて特殊な部屋でなく横も縦も奇数の部屋を網目部屋にする

11.柱部屋

・こばみ谷では8F以上限定(意味がない)
・1/4の確率で出現させようとする
・部屋番号の大きい方から調べて、初めて特殊な部屋でなく横も縦も奇数の部屋を柱部屋にする

12.暗い柱部屋

・こばみ谷では12F以上限定
・1/16の確率で出現させようとする
・部屋番号の大きい方から調べて、初めて特殊な部屋でなく横も縦も奇数の部屋を暗い柱部屋にする

18.隠し部屋、隠し通路

・こばみ谷では22~29F限定
・部屋の数が1のとき出現しない(あり得ない)
・1/2の確率で出現させようとする

20.モンスターハウス

・1/16の確率で出現させようとする
・後は周知の事実なので省略
・全て特殊な部屋の場合に出現しないのはモンスターハウスも例外ではない(予約をしていた場合は予約失敗となる)
[PR]
by oyasen | 2010-02-07 12:52 | 改造・解析

1つのフロアができるまで その2

前回は、特殊な部屋が作られる順番だけを書きましたが、今回はそれぞれの具体的な出現率です。過去に調べたものもありますが、全部書いてしまいましょう。
全て条件を満たす部屋がなければ出現しません。

4.迷路部屋

・こばみ谷は17F以上限定
・部屋の数が1のとき出現しない(あり得ない)
・部屋番号の大きい方から調べて、初めて横も縦も7マス以上かつ奇数の部屋を迷路部屋にする
・迷路部屋の出入口の数は0扱いになる(店と被らないようにする)

6.水脈

・こばみ谷は17~21F限定
・2*2ブロックをランダムで決定し、部屋と通路の両方を含むループになっていないかどうかを調べるトライを5回行い、そのようなループがあれば、ループに含まれる部屋を横断するように水脈を設置する
・5回トライしてもそのようなループが見つからなかった場合は、水脈がないフロアになる(その場合でも浮島、水溜まり、網目部屋が出る可能性はある)

7.店

・こばみ谷は8~14F限定
・1/4の確率で出現させようとする
・部屋番号の大きい方から調べて、初めて入口の数が1の部屋を店にする
・但し、初めて入口の数が1の部屋の入口が水脈に接していた場合、次の部屋を調べるのではなくそのフロアに店は出現しない

8.浮島

・こばみ谷は13~22F限定
・1/16の確率で出現させようとする
・部屋番号の大きい方から調べて、初めて特殊な部屋でなく横も縦も6マス以上の部屋に浮島を設置する

9.水溜まり

・こばみ谷では8~14F、22~29F限定
・部屋番号の大きい方から調べて、初めて特殊な部屋でなく横も縦も5マス以上の部屋に水溜まりを設置する
・水溜まりのパターンは全部で130通り
[PR]
by oyasen | 2010-01-31 12:38 | 改造・解析

1つのフロアができるまで その1

1つのフロアができるまでに何が行われているか、今まではブレークポイントで調べたい処理だけ調べていたので全体が見えなかったのですが、地形のタイプを決定してからフロアが完成するまでに何が行われているか、その順番が分かりました。
これは通常の地形での場合です。特殊地形ではもう少し簡単でしょう。

1.フロアの構造決定、埋蔵金の出現判定
2.1.の時点では左上が(0,0)なので、地形データを右に4、下に4ずらす
3.外壁
4.迷路部屋
5.部屋の出入口の座標を書く
6.水脈
7.店
8.浮島
9.水溜まり
10.網目部屋
11.柱部屋
12.暗い柱部屋
13.モンスター
14.道具
15.階段
16.何もしない(没になった処理でもあったのでしょうか)
17.罠
18.隠し部屋、隠し通路
19.シレンの位置
20.モンスターハウス
21.1.で埋蔵金出現とされていれば埋蔵金出現
[PR]
by oyasen | 2010-01-24 11:50 | 改造・解析

とおせんりゅう系の肉の特技が使えないバグ

とおせんりゅう系の肉を食べて特技を使っても、(間に壁や水脈がなくても)2マス潜って進めないというバグがありますが、その原因が判明しました。
このバグが発生する条件から言うと、ワナ師状態(ワナ師の腕輪を装備中か、カラクロイドに変身している)の時にシレンが罠に乗ると(作動させなくても)、クリア後のダンジョンに入るか、次の冒険になるまでとおせんりゅう系の肉の特技が使えなくなります。

まず、モンスターが罠を踏む仕組みの解説が必要になります。
メモリの$7E8899~$7E88ACは、通常は00ですが、シレンがワナ師状態の時、モンスターが罠に乗ると、そのモンスターの足元の道具・罠コード(C0~D8またはE0~F8)が入り、後でこの値を調べて罠を作動させていくようになっています。罠が作動するとこの値は00に戻ります。
この処理はキャラがシレンの時の例外処理が行われておらず、シレンに対しても同様の処理が行われます。元々シレンが罠を踏む処理とモンスターが罠を踏む処理は別なので、シレンに対する値($7E88AC)は本来は未使用の値で、次のフロアに進んでも00に戻ることはありません。
なので、一度この処理でシレンに対する値がセットされてしまうと、別の罠に乗ってその値が更新されることはあっても、クリア後のダンジョンに入ったり、帰還するか倒されるかして次の冒険になって、キャラのステータスの領域がリセットされるまで、その値は00には戻らないことになります。

次に、とおせんりゅう系の肉の特技ですが、この特技による移動の処理(02791F~027950)は、モンスターの移動の処理と共通になっています。
この処理は、移動するモンスターに対して先程の値を読み取り、00でなければ移動を無効にするようになっています。これにより、モンスターを場所替えの杖で罠に乗せると、そのターンにモンスターは罠を踏み、攻撃はしても移動はしないようになっています。
それではシレンがとおせんりゅう系の肉の特技を使うとどうなるか。ワナ師状態で一度も罠に乗ったことがなければ、先程の値は00だから問題ありませんが、そうでなければ移動できないことになってしまいます。

ということで、罠に乗らずにクリアするなんて殆ど不可能な掛軸裏の洞窟では、とおせんりゅう系の肉は2マス先を確認できるだけのものに過ぎなくなるということになります。
[PR]
by oyasen | 2010-01-17 12:57 | 改造・解析

ダンジョンの作られ方

とうとう不思議のダンジョンシリーズの要にまで手を出しました。と言っても、実は10ヶ月前に調べていたのですが、想像に難くないでしょうがプログラムが長いので、なかなか解説する気力が起きず、気が付けばこんなに時間が経過していたのでした。なので簡単に解説します。
通常の地形で1~3Fの場合だけ解説しますが、特殊地形でも作られ方はよく似ていると思います。

最初に、「ブロック」という単位を解説しておかなければなりません。
通常の地形の場合、1つのフロアは5*3のブロックに分かれています。この内中央のブロックを除いた14ブロックの中に部屋が配置されます。
以下の画像を見れば直ぐに分かります。

http://oyasen20.tripod.com/image/block.png

なぜ中央のブロックが使われないのかは分かりませんが、いつも中央に描画されるシレンが邪魔になるからかも知れません。

まず、通路の骨格を決定します。14ブロックの中からランダムに1ブロックを決定し、そこから一筆書きで既にある通路に当たらないようにして、4方向どこにも進めなくなるまで進めていきます。最も左上のブロックから始めた例です。

│←─┐□
└┐×└┐
□└──┘

次に、まだ骨格が決められていないブロックがあれば、それがなくなるまで、「既に骨格が決められたブロックから」分岐して、同様のことを繰り返します。

│──┬→
├┐×└┐
↓└──┘

どうして、骨格が決められていないブロックから進めないのか。少し考えると、同じフロア内で繋がっていない部分ができてしまうことが分かると思います。
全てのブロックで骨格が決定されると、高々3本ランダムにブロックを繋ぎます。1本につき最大10回トライします。これで通路の骨格が決定します。

│┌─┬┐
├┤×└┤
│└──┘

骨格が決まると、今度はどのブロックが部屋になるかを決定します。
部屋の数が高々10個であることはよく知られていますが、部屋のブロックを決めるトライを部屋1個につき最大5回行います。

後は部屋のサイズを決定し、通路が部屋のどこから延びるか(そのブロックが部屋でない場合、ある1マスを決めてそこから通路を延ばします)、延びた通路同士がどこで曲がって接続するかを決定して完成です。

読者の皆様は、どのようにしてダンジョンが作られると想像していましたか?私は、こう見えてもプログラミングはあまりできないので、恥ずかしながらこれで初めて迷路の作り方を知りました。

ダンジョンの作られ方の序でに、埋蔵金部屋の出現率らしきものも発見したので書いておきます。通常の地形に限って、以下の確率で出現するようです。

1~9F:1/256
10~14F:26/256
15~19F:86/256
20~24F:26/256
25F以上:1/256
[PR]
by oyasen | 2010-01-03 11:52 | 改造・解析

チェックサム回避方法

チェックサム処理のルーチンを特定しましたので、それらを無効化させる方法を書いておきます。
ROMの中身をバイナリエディタで3ヶ所書き換えるだけです。

・01CF71 38 → 18 (風来日記チェック後半)
・03E191 97 → B7 (風来日記チェック前半)
・067EFD 38 → 18 (風来人番付)

改造コードでも可能ですが、一々入力するのが面倒でしょう。入力を忘れるとデータが消えてしまいますし。
これでチェックサムを気にすることなく、やりたい放題改造ができます。
[PR]
by oyasen | 2009-12-27 14:30 | 改造・解析

デモ改造

回想でSELECTまたはSTARTを押しながら風来日記を選ぶとデモが見られますが、それの改造方法が分かりました。
デモの仕組みは非常に単純で、ROM中にセーブデータが入っていて、それを風来日記の代わりに読み込んでいるだけです。

03E158~03E169 デモデータオフセット
1B1000~1B1C59 デモ1(SELECT+風来日記1,杉並の旧街道)
1B1C5A~1B28BA デモ2(SELECT+風来日記2,竹林の村)
1B28BB~1B35C5 デモ3(SELECT+風来日記3,断崖の岩屋)
1B35C6~1B4224 デモ4(START+風来日記1,山頂の町)
1B4225~1B4F15 デモ5(START+風来日記2,テーブルマウンテン)
1B4F16~1B5B6C デモ6(START+風来日記3,地下水脈の村)
1B5B6D~1BFFFF 空き領域

例によって元からあるデモデータはビッシリ詰まっていて、長時間の回想だと次のデータにはみ出してしまうので、1B5B6D~1BFFFFの空き領域を使いましょう。
例えば風来日記1のセーブデータで置き換えたい場合、SRMファイルの000000~001FFFをコピーして、ROMの1B6000~1B7FFF(切りの良い方が分かりやすいでしょう)の空き領域に上書きし、03E158~03E15Aを"00 60 DB"と書き換えれば、デモ1が風来日記1のものに書き換わります。
実際は行動データ以降(渓谷の宿場に戻ると反映されるイベント進行度とか倉庫の中身とか)は必要ないので、風来日記1だと000000から、000BED以降の初めてのFFまででも良いのですが、まあ全部コピーする方が分かりやすいでしょう。
逆にセーブデータをデモデータで置き換えれば、デモデータの続きをプレイすることもできます。是非一度お試しあれ。
[PR]
by oyasen | 2009-12-20 12:35 | 改造・解析

NPCの出現率 その2

・一般NPC

15F以上には出現しない
町には出現しない
32/256の確率で、以下のNPCの中から何れか1人出現

1.シケのハンザキ
2.投テキのツブテ
3.聞き耳のサブ
4.親切なおじいさん
5.流浪のシジマ
6.橋タタキのヤマケ
7.犬
8.ソダテのカンジ

・飛脚

15F以上でないとき、32/256の確率で出現
奇岩谷、山頂の町、渓谷の宿場それぞれ等確率
どれも送り先が今いる町と同じ時は再選択
奇岩谷で(イベント0C)<03のとき再選択
山頂の町で到達度が8F未満の時は出現しない

・カマヒゲ

5~14Fのとき、10/256の確率で出現

・少女

1~9Fのとき、10/256の確率で出現

・じじい

8~16Fのとき、21/256の確率で出現

因みに、スクリプトを少しだけ紹介すると、次のような感じになっています。

00 XX XX YY YY …… アドレスXXXXのプログラムを実行して、C=0ならスクリプトのオフセットYYYYへ、C=1なら次の命令へ
05 XX XX アドレスXXXXのプログラムを実行して、その結果"A"に入ったコードのNPC出現
06 XX …… コードXXのNPC出現

スクリプト全体は固定NPCも含まれているので長すぎて、全ては書ききれません。なので、取り敢えず今回はこの辺までにしておきます。
[PR]
by oyasen | 2009-12-19 16:28 | 改造・解析