ようやく解析が終わったので改造の方針が立てられるようになりました。作業方針としては「凍てつく波動(or暗黒の波動)が選択されたら他の戦闘行動番号も連発不可フラグをONにしておく」ということをすればいい、ということになります。

ここでは都合上灰ゾーマのみ対象とします(DQ3 K.Mix用の改造なので)。適宜モンスターID等は読み替えて下さい。凍てつく波動、暗黒の波動には「連発不可フラグがONになっている」を前提条件とします。
| 略 |
|
|
|
| $02678B |
LDA $2470 |
A=$2470 |
|
| $02678E |
JSL $CEDC94 |
SR: $0EDC94 |
グループ共通連発不可フラグ作成 |
| $026792 |
SEP #$20 |
m=on(A/M:8b) |
|
| $026794 |
ORA $23B0,X |
Aor=$23B0+X |
|
| $026797 |
STA $23B0,X |
$23B0+X=A |
|
| $02679A |
REP #$20 |
m=off(A/M:16b) |
|
| 略 |
|
|
|
実行が決定された戦闘行動番号が連発不可の場合に連発不可フラグの更新を行うわけですが、連発不可フラグの作成のところを別SRに差し替えます。リターン値としてAレジスタに新たにセットとする連発不可フラグを返せばOKです。通常はONになるビットはどれか1つだけですが、特定のケースのみ(灰ゾーマが凍てつく波動or暗黒の波動を実行)複数ビットがONになって返ってくるようにします。
- SR:$0EDC94 グループ共通連発不可フラグ作成(新SR)
| $0EDC94 |
JSL $CEDCA4 |
SR: $0EDCA4 |
行動主体が灰ゾーマでかつ選択された行動が凍てつく波動or暗黒の波動(該当c=on) |
| $0EDC98 |
BCS #$05 |
if(c==on) goto $0EDC9F |
|
| $0EDC9A |
JSL $C014F2 |
SR: $0014F2 |
最大8ビットのビットマスク作成 |
| $0EDC9E |
RTL |
return |
|
| $0EDC9F |
JSL $CEDCE7 |
SR: $0EDCE7 |
凍てつく波動・暗黒の波動の連発不可フラグON |
| $0EDCA3 |
RTL |
return |
|
SR: $0EDCA4 行動主体が灰ゾーマでかつ選択された行動が凍てつく波動or暗黒の波動(該当c=on) 省略
- SR:$0EDCE7 凍てつく波動・暗黒の波動の連発不可フラグON
| $0EDCE7 |
PHA |
Push A |
|
| $0EDCE8 |
PHX |
Push X |
|
| $0EDCE9 |
STZ $40 |
DP($40)=#$00 |
バッファをクリアする |
| $0EDCEB |
STA $00 |
DP($00)=A |
Aには戦闘行動番号(0~7)が入っている |
| $0EDCED |
JSL $C2C573 |
SR: $02C573 引数:1#$00 |
モンスター行動パターン情報取得 |
| $0EDCF2 |
PHA |
Push A |
実際の戦闘行動IDを取得 |
| $0EDCF3 |
STZ $00 |
DP($00)=#$00 |
戦闘行動番号0~7の戦闘行動IDを取得し一致していたらフラグを立てる |
| $0EDCF5 |
JSL $C2C573 |
SR: $02C573 引数:1#$00 |
モンスター行動パターン情報取得 |
| $0EDCFA |
CMP $01,S |
A==Stack($01)? |
|
| $0EDCFC |
BNE #$0A |
if(z==off) goto $0EDD08 |
|
| $0EDCFE |
LDA $00 |
A=DP($00) |
|
| $0EDD00 |
JSL $C014F2 |
SR: $0014F2 |
最大8ビットのビットマスク作成 |
| $0EDD04 |
ORA $40 |
Aor=DP($40) |
|
| $0EDD06 |
STA $40 |
DP($40)=A |
|
| $0EDD08 |
INC $00 |
DP($00)++ |
|
| $0EDD0A |
LDA $00 |
A=DP($00) |
|
| $0EDD0C |
CMP #$0008 |
A>=#$0008? |
|
| $0EDD0F |
BCC #$E4 |
if(c==off) goto $0EDCF5 |
|
| $0EDD11 |
PLA |
Pull A |
|
| $0EDD12 |
PLX |
Pull X |
|
| $0EDD13 |
PLA |
Pull A |
|
| $0EDD14 |
LDA $40 |
A=DP($40) |
バッファに蓄積したフラグをAレジスタにセット |
| $0EDD16 |
RTL |
return |
|
やっていることは割と単純です。Aレジスタには実行することが決定した戦闘行動番号がセットされているので対応する戦闘行動IDを取得し、同じ戦闘行動IDがセットされている戦闘行動番号を調べて一致していたらフラグを立て、蓄積していくというだけです。連発しないようにするだけで1ターン中の発動率自体は変わらないはず。
コメント
こんばんは。
初めまして、管理人様に相談なんですが、管理人様はアベル伝説に興味はありませんか?
管理人様がおつくりになられたK.mixがとても素晴らしく、大好きで、今は個人でキャラグラを自分で作成したアベル伝説キャラのドット絵に差し替えて遊んでるんですが、良かったらK.mixで使ってもらえないかと思いダメ元でコメントしてみました。
作成したキャラグラは
アベル、デイジィ 、ヤナック、モコモコ、ティアラ、トビー、ドドンガ、ザナック、チチ、カカ、サーラ姫、バハラタ、パブロ神父、ミネアとマーニャ「アベル伝説の」の15キャラになります。
プレイしていただきありがとうございます。さて、結論から言うと使用する予定はありません。
悪しからず。
ドラクエ世界観をベースにしたアニメ化、漫画化作品で有名なものはいくつかありますが、自分がちゃんと読んでいるのは『ダイの大冒険』だけです。『アベル伝説』については薄ぼんやり見た記憶がある程度です。使用しない理由は「よく知らないから」というわけではなく、「あまり詰め込みすぎるとブレる」からです。今回の話が例えダイの大冒険のキャラであっても同様の回答になったと思います(あの作品自体は素晴らしいものだと思いますが、実際ゲームに落とし込んでうまくいくかはまた別問題だと思います)。
とはいえせっかく作ったものを使ってもらいたい、というのは当然の欲求だと思うので、「ドラクエバイナリ」アップローダにアップロードしてはいかがでしょうか?(URLを書くのが妥当かわからないので控えますが、ググればすぐでてきます)
グラフィックを作る作業の大変さ(と自分の絵心の無さ)はわかっているつもりなので素材提供だけでもこの界隈に十分貢献できると思います。ゲームは絵がないと始まらないので。
あるモンスターが次の条件を満たしているとき、行動連発禁止フラグの設定を事実上無意味なものにするというのが問題であるという認識で一連の解説を読んでいました。
1. 行動 8 個のうち同一行動が重複されて定義されていて、そのうちのどれかの連発禁止フラグが 1 である。
2. 行動が確率で(=ローテーションでない)選択される
サブルーチンを書くのもテストするのも面倒でしょうから、二つ定義されている行動の一方を何か他の行動に差し替えるという単純な対策で十分であるように思えます。特にそれが「~波動」に対してであれば 1 ターンに高々 1 回しか実行しないのが理に適っています。原作でそうなっていない理由は知る由もありません。
行動連発禁止フラグの本来の目的とは、モンスターグループの行動決定にカブリが(同一ターンにおいてある回数以上は)起こらないようにするためのものにしか過ぎないのではないかと思えます。
もしそうならオリジナルで行動パターンとして複数回設定されている光ゾーマの波動、ブレスに連発禁止フラグがONになっている理由がよくわからないですね。連発可を想定するならそもそも連発不可フラグをONにしなければいいわけで。自分も「ボスのこの行動は連発するときつすぎるから連発禁止にしよう」くらいのノリで使っていました(「連発禁止」にしても解析側で勝手に命名してるので本当のところはわかりません)。
重複している行動を別の行動に差し替えると発生確率に影響するので(行動パターンが「均等」なので1/4 -> 1/8になる)、それをいじらないまま1ターン波動2連発というだっさい行動を取らせないようにするにはどうするか、という問題に対しての解決法を提示したのが今回のエントリです。発生確率が下がるのを許容するのであればご指摘の通りダブってるどちらかを打撃にでも変えておけばOKです。
ちなみに1ターン2回行動のモンスターで波動が使われる確率は真面目に言うと
1/8にした場合: 1-(7/8 * 7/8)=15/64(約25%) = 4ターンに1回?
1/4にした場合: 1-(3/4 * 3/4)=7/16(約43%) = 2,3ターンに1回?
となるはずですが、1/8になっている神竜では来ないときは結構来なかったりするので1/4は崩したくないというのが当方の意図です。