ドラクエ2の任意コード実行(ACE)の可能性
DQ2はじめに
マドハンドバグで作れるバグアイテム0x6bを戦闘中に使用するとメモリー上の$0b/00a9※からコードを実行させることができますが、大抵はうまく行かずにフリーズ等が起きます。しかし、色々と条件を整えると、サマルトリアの王子の名前をコードとして実行したりそこからゲームパッド入力の領域($4218-$421f)にジャンプしたりする事ができます。こちらとこちらを参考にLsnes上で4つのゲームパッドからの1フレーム分の命令はなんとか実行できたのですが、2フレーム目からは狙った命令が実行されませんでした。原因がよくわからないので、とりあえず方法をまとめておきます。※この記事はSNES ADDRESSで表示します
名前をコードとして実行させる方法
サマルトリアの王子の名前2文字目 ($0160) からコードを実行させる方法
- 条件1.アイテムID0x6bのバグアイテムなしを作成する
- 条件2.右1マス移動後、上か下に1マス移動した位置でエンカウントする($00ee,$00ef の設定)
- 条件3.出現したモンスターが1グループまたは2グループのパーティである ($00aa)
- 条件4.ドラゴンフライやどろにんぎょうなど、右端の出現モンスターが特定のIDである ($00ab)
PR
世界樹の葉を諦めによるアイテム増殖と命の紋章リセット
DQ2概要
道具欄いっぱいで世界樹の葉を諦めると入手フラグが巻き戻り、直前に入手したマップ上のアイテムが再配置される。【手順】
- マップに配置された増殖したいアイテムを拾う。
- 世界樹までマップに配置されたほかのアイテムは拾わない(*)
- アイテム欄を埋めた状態で世界樹の葉の場所へ向かう
- 世界樹の葉を拾いに行き、いったん「いいえ」を選んで諦める(拾得フラグがOFFになる)
- 連続で行わない場合は世界樹の葉を回収する
- アイテムが再配置されているので回収する
【フラグ巻き戻しが出来ないことが確認されたもの】
- 太陽の紋章(炎の祠)
- 星の紋章(大灯台)(戦闘後自動でメッセージ窓が開く)
【なにか】
どちらも取得時に7e10b6が書き換わらない。世界樹入手時に「いいえ」を選んだ時に7e10b6の値に対応するアイテムの拾得済フラグが消されて再配置される。アイテム回収して回ってこのメモリが変化しないのを探すのが早そう。(7e10b6は直前に取得したアイテムのフラグ先をビット単位で示すオフセット イベントアイテムで確認)フラグが消えた状態になるから初期状態の中身が入った状態に戻る。所持品は減らないが紋章はこのフラグで取得済みか判定されて消える?
【使用例】
- 不思議な帽子を複数回拾う
- ザハンの祈りを温存しておいて葉っぱ回収の前後に入手
「再現なしバグあり」で世界樹増殖とか病気サマルLv22マヌザラとかを合わせるのも面白いのかもしれない
モンスターの行動再選択とMP消費
DQ2【モンスターのMP消費と行動再選択の関係性】(DQ2の仕様)
最大MPが255(無限)であるか呪文を封じられているか、仮選択された呪文を使えるだけのMPがない場合、MPは消費しません。それ以外の呪文選択時は、一時的にMPを減算します。
魔封じ・MP不足以外の理由で行動再選択となった時に各行動のサブルーチンSRでMPを元に戻しますが、次の呪文は再選択されてもMPを元に戻しません。
消費する行動:ルカナン[2]、スクルト[2]、メガンテ[1]
※[]内の数値はMP消費
さらに最大HP255以上のモンスターによるホイミ(自)[3]、ベホイミ(自)[5]、ベホマ(自)[8]も一時的に選択されただけでMPを消費します。これに該当するのはベリアルのベホマだけです。(ハーゴンはMP無限のため該当しません)
また、1ターンにモンスターあたり最大で8回行動が仮選択され、8回目も実行しない場合は非痛恨の打撃に確定となります。このため実行されない呪文によるMP消費は最大で1ターン8回起こることになります。ベリアルで起こす事ができればMPを64消費して打撃1発撃つ事になります。
【各行動の再選択条件】
ルカナン:死者も含めたプレイヤーキャラの守備力が全員0になっている。スクルト:判断力1以上ある。行動時に出現中の全モンスターの守備力が、初期値の2倍または255に達している。
メガンテ:「術者の現在HP ≧ (左端のモンスターの最大HPを8で割った値の整数部)」 となる時(バズズはHP31以上の時)
ベリアルのベホマ:現在HPが160以上
コピペが多くて見づらいかも知れませんが、再選択条件はこちらにも記述しています。
SFC版DQ3直接攻撃(打撃)
DQ3
打撃のダメージ計算式
【計算式の表記】
[x]:x の整数部分
<x, y>: x とy を含む、x から y までの全ての整数の中から選ばれた1つの整数
rnd: 0から255の一様乱数(と推測されるもの)
【プレイングキャラクター(以下PC)が行動した時】
基本的なダメージ計算式はモンスターと違って2種類だけです。
atk - [ def / 2 ] < 2 の時
ダメージは 0 or 1(等確率)
atk - [ def / 2 ] ≧ 2の時
ダメージは [ ( atk - [ def / 2 ] ) * <99, 153> / 256 ]
<99, 153>は最大・最小のでやすい分布で、
(0から15までの一様乱数を16回生成した合計値) + 6
を求め、99未満なら99、153より大きい場合は153とする乱数。
※混乱状態でターンを開始したPCにパーティアタックした時にはダメージが大幅に軽減されます。上の式で得られるダメージDを1/8倍して1から3加算した値になります。($028E4Aの処理)
D' = [D/8] + <1, 3>
<1, 3>は、 [ ( 2 + 1 ) * rnd / 256 ] + 1 で求まり、 1 は86/256, 2 や 3 は 85/256の比率。
※装備による補正など(複数攻撃武器、痛恨・会心、耐性、防御、毒針)
(更新未定)
※バイキルトはダメージを2倍にします。
【モンスターが行動した時】
こちらは分岐条件が複雑です。ダメージ計算式は3種類で下表に条件別にまとめてあります。
例えばダメージ計算式が [ ( atk - [ def / 2 ] ) * <99, 153> / 256 ] となるのは、
atk - [ def / 2 ] ≧ 0 かつ atk - [ def / 2 ] > [ atk / 8 ] かつ atk ≧ 8 の時になります。
<99, 153>はPCの打撃と同じものです。(最小99、最大153の整数です。0から15までの一様乱数を16回生成・加算し、さらに6加算したものです。99未満なら99、153より大きい場合は153。)
_/_/_/ 参考サイト _/_/_/
SFC版DQ3 打撃ダメージ値乱数
_/_/_/ 解析資料(dq_492氏) _/_/_/
ほとんどは資料にあるサブルーチンの内容をなぞってまとめたもの
DQ3戦闘部分解説19直接攻撃の処理について
DQ3戦闘部分解説2戦闘関連のメモリーについて
2019年6月5日 リンクを修正
【計算式の表記】
[x]:x の整数部分
<x, y>: x とy を含む、x から y までの全ての整数の中から選ばれた1つの整数
rnd: 0から255の一様乱数(と推測されるもの)
【プレイングキャラクター(以下PC)が行動した時】
基本的なダメージ計算式はモンスターと違って2種類だけです。
atk - [ def / 2 ] < 2 の時
ダメージは 0 or 1(等確率)
atk - [ def / 2 ] ≧ 2の時
ダメージは [ ( atk - [ def / 2 ] ) * <99, 153> / 256 ]
<99, 153>は最大・最小のでやすい分布で、
(0から15までの一様乱数を16回生成した合計値) + 6
を求め、99未満なら99、153より大きい場合は153とする乱数。
※混乱状態でターンを開始したPCにパーティアタックした時にはダメージが大幅に軽減されます。上の式で得られるダメージDを1/8倍して1から3加算した値になります。($028E4Aの処理)
D' = [D/8] + <1, 3>
<1, 3>は、 [ ( 2 + 1 ) * rnd / 256 ] + 1 で求まり、 1 は86/256, 2 や 3 は 85/256の比率。
※装備による補正など(複数攻撃武器、痛恨・会心、耐性、防御、毒針)
(更新未定)
※バイキルトはダメージを2倍にします。
【モンスターが行動した時】
こちらは分岐条件が複雑です。ダメージ計算式は3種類で下表に条件別にまとめてあります。
例えばダメージ計算式が [ ( atk - [ def / 2 ] ) * <99, 153> / 256 ] となるのは、
atk - [ def / 2 ] ≧ 0 かつ atk - [ def / 2 ] > [ atk / 8 ] かつ atk ≧ 8 の時になります。
atk - [ def / 2 ] < 0 | |||||
Yes | No | ||||
atk < 16 | atk - [ def / 2 ] ≦ [ atk / 8 ] | ||||
Yes | No | Yes | No | ||
atk < 16 | atk < 8 | ||||
Yes | No | Yes | No | ||
ダメージ計算式 | |||||
0 or 1 | [ [atk/8]*rnd / 256 ] | 0 or 1 | [ [atk/8]*rnd / 256 ] | 0 or 1 | [ ( atk – [ def / 2 ] ) * <99, 153 > / 256 ] |
_/_/_/ 参考サイト _/_/_/
SFC版DQ3 打撃ダメージ値乱数
_/_/_/ 解析資料(dq_492氏) _/_/_/
ほとんどは資料にあるサブルーチンの内容をなぞってまとめたもの
DQ3戦闘部分解説19直接攻撃の処理について
DQ3戦闘部分解説2戦闘関連のメモリーについて
2019年6月5日 リンクを修正
SFC版ドラゴンクエスト3の行動順と素早さの関係
DQ3乱数を使って先攻率を求めるページ
SFC版DQ3先攻率のシミュレーターターンごとの素早さの計算式は
(素早さ+20)*(0~255)/256 [端数切り捨て]
だけど、0~255の部分は一様分布乱数ではない。
説明はリンク先に。ブログには解析関係のことを書いてみる。
カレンダー
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
最新記事
(12/18)
(04/18)
(09/15)
(09/11)
(06/21)
プロフィール
HN:
bamboo
性別:
非公開
自己紹介:
2010年の3月ごろニコニコ生放送のゲーム放送でRTAを知ってよく見るようになった。
どちらかというとゲームはプレイするものじゃなくてプレイを"みる"ものだと思っている。
逆アセンブル解析というのをかじったものの放置していたが、某放送の影響で解析を再開。
2を初クリアしたのは2011.3.10。ブログの内容はSFC版ドラクエ1・2の解析がメイン。最近はjavascriptとかluaをある程度扱えるようになったので、botでルート検証とかできたらと思いつつも進んでいない。
要点をまとめたり文章書くのが苦手なので記事が長ったらしかったり、日本語のようで日本語でなかったりする。プログラム用語が使えるようになりたいかも。
ツイッター: https://twitter.com/bamb00h
ブログに公開せずツイートのみの情報もあり(twilog)
どちらかというとゲームはプレイするものじゃなくてプレイを"みる"ものだと思っている。
逆アセンブル解析というのをかじったものの放置していたが、某放送の影響で解析を再開。
2を初クリアしたのは2011.3.10。ブログの内容はSFC版ドラクエ1・2の解析がメイン。最近はjavascriptとかluaをある程度扱えるようになったので、botでルート検証とかできたらと思いつつも進んでいない。
要点をまとめたり文章書くのが苦手なので記事が長ったらしかったり、日本語のようで日本語でなかったりする。プログラム用語が使えるようになりたいかも。
ツイッター: https://twitter.com/bamb00h
ブログに公開せずツイートのみの情報もあり(twilog)
ブログ内検索
最古記事
(09/17)
(09/17)
(09/18)
(02/04)
(02/07)
カウンター
忍者アナライズ