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

NPCの出現率 その1

以前、NPCを出現させる処理はスクリプトで書かれていると言いましたが、少し調べてみました。
いずれも二面地蔵の谷と渓谷の宿場には出現しません。
イベント番号とその進行度はいずれも数値のままにしてあります。大体予想は付きますが、確認していないので。

・お竜

(イベント83)=00でないとき出現しない
(イベント03)=00,02のとき、町でなく、5F以上でなければ85/256の確率で出現
(イベント03)=04のとき、17F以上でなければ5/256の確率で出現

・座頭ケチ

(イベント85)=00でないとき出現しない
(イベント05)=00のとき、町でなく、5F以上でなく、到達度が8F以上であれば85/256の確率で出現
(イベント05)=03のとき、17F以上でなければ5/256の確率で出現

・ペケジ

(イベント86)=00でないとき出現しない
17F以上には出現しない
(イベント06)=05のとき、5/256の確率で出現

・三番弟子

15F以上には出現しない
(イベント04)<03のとき出現しない
(イベント87)=00のとき、16/256の確率で出現

・ナオキ(1回目)

(イベント09)=00でないとき出現しない
(イベント88)=00でないとき出現しない
3F以上には出現しない
町でないとき、64/256の確率で出現

・ナオキ(2回目)

(イベント09)=02でないとき出現しない
(イベント88)=00でないとき出現しない
7F以上でないとき、21/256の確率で出現

・スララ

12F以上には出現しない
8F未満には出現しない
(イベント0C)=00でないとき出現しない
(イベント89)=00のとき、64/256の確率で出現
[PR]
by oyasen | 2009-12-12 10:20 | 改造・解析

フェイの問題

各データのアドレス表は以下の場所にあります。第1問から順に並んでいて、1問につき3バイトです。

03B77C以降……通路・部屋の入口・水脈
03B812以降……道具
03B8A8以降……階段
03B93E以降……罠
03B9D4以降……モンスター
03BA6A以降……部屋
03BB00以降……出現する罠

そして、中身のフォーマットは以下の通りです。[]は括弧内を繰り返すことを意味します。

通路・部屋の入口・水脈:[X座標 Y座標 地形コード] FF
道具:[X座標 Y座標 種類 値2 識別 商品] FF (*1)
階段:X座標 Y座標
罠:[X座標 Y座標 罠コード+C0] FF (*2)
モンスター:[X座標 Y座標 種族 レベル 状態] FF (*3)
部屋:[部屋番号 左-1 上-1 右+1 下+1 部屋の状態] FF
出現する罠:出やすい罠のコードを5バイト、出にくい罠のコードを6バイト

*1:識別は00で未識別、01で識別済み。商品は00で通常、01で商品。
*2:第42問の店主専用スペースも罠コード+C0の部分に85を入れて設置していました。
*3:状態は00で起きている、01で睡眠1。

シレンの初期位置は少し離れた場所にあって、03AE13以降に"[00 00 00 00 08 問題番号 X座標 Y座標]"というデータがあるのでそれを変更すれば良いです。
[PR]
by oyasen | 2009-10-25 20:15 | 改造・解析

やみふくろうで時限爆弾

前回の続きです。前回、やみふくろうを迷路部屋に置くとどろぼうハウスのバグが起こることを説明しましたが、それではやみふくろうを通路(部屋の入口では駄目)に置くとどうなるでしょう。
通路の地形コードは30です。するとbit0が1になるのは$7EC196です。これはそのフロアに出現する罠リストの一部です。もし、この値が14(大型地雷)だったとしましょう。bit0が1になると15(時限爆弾)になるではありませんか!
以前、剛魔窟でどろぼうハウスのバグが出たフロアで時限爆弾が出たというページがありましたが、実は両者は関係していました。
あまり面白みはないですが、バネの出るフロアでは同様に投げ矢も作れます。$7EC196には出やすい罠(出現する罠の決定を参照)しか入らないので、残念ながら他の没罠は出せません。

無限増殖セット+カラクロイドの肉+やみふくろうの肉をお持ちの方は、お暇ならこばみ谷で時限爆弾探しでもしてみて下さい。

1.カラクロイドの肉でそのフロアに出現する罠の種類を調べる
2.大型地雷が出なければ次のフロアへ、1.に戻る
3.やみふくろうを通路に置く
4.もう1度カラクロイドの肉で罠を沢山作ってみる
5.運が良ければ時限爆弾発見。大型地雷が作られたら($7EC196は大型地雷ではなかった)次のフロアへ、1.に戻る

道具出現と次のフロアに移動するのにデバッグモードを使いましたが、とりあえずZSNESで確認済みです。実機でも運が良ければ見つかる筈です。
時限爆弾を作った時は、それのグラフィックが読み込まれていないので正しく表示されませんが、中断・再開することで正しく表示されます。

ということで、やみふくろうは部屋にいる時以外は暗闇にする処理の必要がないのに無条件で処理をしてしまっているという、何とも初歩的なミスでしたが、"X"を地形コードのとり得る範囲とすると、$7EC166+"X"はモンスターハウスの種類と罠リスト以外は未使用のよう(つまり、どろぼうハウスと時限爆弾以外のバグは起こりそうにない)なので、ミスに気付かなかったのかも知れません。

と、ここまで書いて気付いたのですが、どろぼうハウスの報告も時限爆弾の報告もこばみ谷22Fでした。シューベルがやみふくろうを呼び出した、とかでもないとこれでは説明が付かないのですが。まあそれでも、意図的に出す方法を発見したということで。
[PR]
by oyasen | 2009-10-20 20:11 | 改造・解析

どろぼうハウスのバグ

通常のモンスターハウスなのに、「どろぼうハウスだ!!」と表示されることがあるというバグがありますが、その原因が判明しました。
バグが発生する条件から言うと、迷路部屋または暗い柱部屋にやみふくろうがいて、尚かつ通常のモンスターハウスがある場合、その部屋に突入すると「どろぼうハウスだ!!」と表示されます。

$7EC166-$7EC16Fは、部屋の状態を表すフラグで、その中身は以下の通りです。

bit0 暗闇,bit1 隠し部屋,bit2 迷路、暗い柱部屋,bit3 モンスターハウス
bit4 浮島,bit5 店,bit6 bit7と併せて埋蔵金,bit7 水脈(水脈で分断された部屋、網目部屋、水溜まり)

やみふくろうがいると、毎ターンそのやみふくろうの足元の地形(ダンジョン編集を参照)を"X"に入れて、$7EC166+"X"のbit0を1にします。そのやみふくろうが部屋にいる場合、足元の地形は部屋番号と等しいので上手くいきます。
しかし、やみふくろうが迷路部屋にいるとどうなるでしょう。迷路部屋の地形コードは10です。するとbit0が1になるのは$7EC176です。$7EC176は、そのフロアにモンスターハウスがある場合、その種類を表します。

00 モンスター,01 どろぼう,02 ドレイン,03 1ッ目,04 ゴースト,05 パワー,06 番犬隊

$7EC176は、通常のモンスターハウスの場合は00ですが、このバグによって01になってしまいます。その結果、その部屋に突入すると「どろぼうハウスだ!!」と表示されてしまいます。
こばみ谷では、迷路部屋はテーブルマウンテン以降にしか出現しませんし、テーブルマウンテンでは、やみふくろうは23~25Fにしか出現しません。このバグがテーブルマウンテンの後半で報告されることが多いのにも納得です。
勿論、こばみ谷以外でもこのバグは起こります。その場合、通常のモンスターハウスのみならず、ドレインハウスが1ッ目ハウスに、ゴーストハウスがパワーハウスになることもある筈です(誰か確認して下さい)。
迷路部屋の敵にやみふくろうの肉を投げ付けてモンスターハウスに突入してみましょう。暗い柱部屋でも可能です。
当たり前ですが、やみふくろうを作ってモンスターハウスの巻物を読むのは、モンスターハウスができる前にやみふくろうが消滅してしまうので駄目です。
[PR]
by oyasen | 2009-10-18 19:45 | 改造・解析

ガイコツまどうの杖のバグ

ガイコツまどうの杖を投げると、モンスターの特技としてのガイコツまどう系の杖の効果が出ることがあるというバグがありますが、その原因が判明しました。

ガイコツまどうの杖を振った時の処理は031EC3以降にあります。実はこのルーチンはガイコツまどう系の杖を振った時の処理と共通で、このルーチンで分岐するようになっています。
このルーチンは、$00(振られた側)と$01(振った側)を引数としています。魔法弾が反射した場合は$00は反射された側、$01は反射した側になります。
更に、7E935Eのbit7も参照します。7E935Eのbit7は、シレンが道具を使った時やガイコツまどう系が杖を振った時に、それらの処理の前に更新され、その行動の結果魔法弾が反射されるときに1になり、そうでないときに0になります。
7E935Eのbit7が0のときに$01(振った側)の、1のときに$00(反射された側、すなわち杖を振った側)の外見を読み込みます。その結果、必ず杖を振った側の外見が読み込まれ、それがシレンのときにガイコツまどうの杖の処理に、シレンでないとき(ガイコツまどう系に杖を振られたか、シレンがそれらの肉の特技を使った場合)にガイコツまどう系の杖の処理に分岐するようになっています。

しかし、7E935Eのbit7はシレンが杖を投げた時には更新されません。従って、ガイコツまどう系に杖を振られてやまびこの盾で反射したり、エーテルデビルに杖を振って反射された後、他の道具を使わずにガイコツまどうの杖を投げると、ガイコツまどう系の杖の効果が出てしまいます。
杖を投げた時は、$00は投げた側、$01は投げられた側です。しかし、7E935Eのbit7が1のままなので、本来ならば$01(投げた側)の外見が読み込まれなければならない所を、$00(投げられた側)の外見が読み込まれ、それは当然シレンではないので、ガイコツまどう系の杖の効果が出ることになります。
レベルも同様で、本来ならば投げた側のレベルに応じた効果を出さなければならない所を、投げられた側のレベルに応じた効果が出ることになります。例えば、デブーチョにガイコツまどうの杖を投げると、かなしばりやいかずちの効果が出たりします。

ということで掛軸裏の洞窟でも、エーテルデビルに杖を振って反射された後、レベル3のモンスターにガイコツまどうの杖を投げれば肉が手に入る可能性があります。残念ながらエーテルデビルはレベル1しかいないので、エーテルデビルの肉は手に入りませんが。
掛軸裏の洞窟でこのバグが出にくいと言われているのは、やまびこの盾が出ないのでエーテルデビルに杖を振るしか方法がないからでしょう。
このバグ技を意図的に使って、風来のシレンランキング等にエントリーしたりしないで下さい。
[PR]
by oyasen | 2009-10-16 20:01 | 改造・解析

道具を落とす確率のバグ

「洞窟マムルが道具を落とす確率は100%ではない」という指摘をかなり前(5ヶ月前)に頂いたのですが、ようやく検証ができました。
実は、とんでもないバグがあって、道具を落とす確率はモンスターのレベルに関係なく、そのモンスターの種族レベル1の値を見ていました。
従って、マムル、あなぐらマムル、洞窟マムルが道具を落とす確率は全て1/64です。他の種族も確認はしていませんが恐らく同様です。
怪物のステータスリストの、道具の落としやすさレベル2,3の値は全く意味がないということが判明してしまいました。

まあ、確率に関するバグは発見が難しいかも知れません。デバッグチームにも詳細な確率は教えていないかも知れません。
しかし、洞窟マムルのパラメータを設定した人は、フェイの最終問題をクリアしなかったのでしょうか?
フェイの最終問題をクリアしていれば洞窟マムルも何匹か倒しているでしょうし、それなら洞窟マムルが必ずしも道具を落とさないことに気付く筈です。
それとも、レベル毎に値を設定してみたものの、結局没にしてしまったのでしょうか?
[PR]
by oyasen | 2009-10-12 18:03 | 改造・解析

M系列

本ゲームに用いられている乱数生成アルゴリズムは、「M系列」と呼ぶらしいことが分かりました。
以前この乱数の周期は2^31だと言いましたが、それに関するページを見ていると、どうやら2^31ではなく2^31-1になるそうだったので、これは間違えたかと思ってもう1度周期を確認してみると、本当に2^31-1でした。
以上、些細なミスかも知れませんが訂正です。

おまけ(ムクゲ幽谷)
http://oyasen20.tripod.com/image/mukugeyukoku.png
[PR]
by oyasen | 2009-09-28 19:55 | 改造・解析

BGM改造?

メニュー画面のメロディの位置を見つけました。ヘッダ無しで1F2FB7h(メモリに読み込まれるとDF2FB7h)に、以下の数列があります。

D8 63 D9 50 1A 1C 1D 1E DD

これを次のように変更してみて下さい。

D8 63 D8 50 18 18 18 18 D8

メニュー画面のBGMは、第1小節のメロディが"休 C D E G A B A"であることは絶対音感があれば分かりますが、これが"休 C C C C C C C"に変わる筈です(伴奏は手を付けていないのでそのままです)。
取り敢えず、18h=C音、19h=D音、……のようですが、DXhの時の次のバイトが意味不明です。

BGMの改造は難易度が高く、あまり一般的には行われていません。私も他のゲームでBGMを変更した経験はありません。なのでBGMのフォーマットがどのようになっているかは想像も付きません。
何せ相手は目には見えない音ですから、何の予備知識もなしに解析するのは相当苦労しそうです。ということで、今言えるのはこれだけです。

にも関わらず、どうやってメロディの位置を見つけたかと言うと、メモリビューアの上の方に、その瞬間に鳴らされている音と同じコードを示す(それは上とは違い、MIDIと同じでした)バイトがあり、そこの変化を追い掛けて見つけました。
[PR]
by oyasen | 2009-09-06 21:34 | 改造・解析

古印体のフォーマット その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 | 改造・解析