SFCGENEditor 1.1.2リリース

だいぶ更新間隔が空いてしまいましたが、例によって「ダウンロード」ページにうpしてあります。今回の変更点は以下のとおり。

  1. 複合型フィールドの対応
  2. 他内部的な構造の見直し

DQ5ではモンスターのHP、攻撃力などがなぜか分かれて保存されています(上2ビット、下8ビットなど)。これを直感的に参照・変更できるようにするというのが今回の変更の一番の大きいところです。この実装に絡んで内部構造の見直しも行ったため、実装にずいぶんと時間がかかってしまいました(ただ単にやる気が起きなくて投入時間自体も少なかったのですが…)。エラーチェックがまるでザルなので今後はその辺りのケアもする必要もあるのですがとりあえず現状あまりやる気が起きないので後で対応することにします。

プログラムの変更とは別にDQ5の解析も少し進めました。BRKの引数のバリエーションが多く、引数の数まではそこそこ正確に把握できるようになったものの、依然としてその多くは用途が不明のままです。戦闘部分は大枠は解析が進んだので仲間モンスター加入部分の処理がぼんやりとつかめてきました。あの有名な「ひとしこのみ」の実装も場所が特定出来ました。バグ技というよりはデバッグ用に仕込まれたものというのがわかります。

  • SR: 仲間モンスター加入判定(加入c=off)?
1041F6LDA $208000A=$100000
1041FALSRA>>1
1041FBBCS #$2Aif(c==on) goto $104227
1041FDBRK #$0B #$40 #$21goto $000F80 #$0B #$40 #$21
104201BEQ #$3Cif(z==on) goto $10423F
104203LDA $1010A=$1010
104206BEQ #$37if(z==on) goto $10423F
104208BRK #$88 #$A6goto $000F80 #$88 #$A6待機モンスター数取得
10420BLDA $46A=DP($46)
10420DCMP #$32A>=#$32?
10420FBCS #$2Eif(c==on) goto $10423F
104211LDA #$00A=#$00
104213BRK #$8A #$DBgoto $000F80 #$8A #$DB
104216LDA $47A=DP($47)
104218BRK #$8A #$27goto $000F80 #$8A #$27
10421BLDA $100FA=$100F
10421ESECc=on
10421FSBC $46A-=(DP($46)+!c)
104221BCC #$04if(c==off) goto $104227
104223CMP #$08A>=#$08?
104225BCS #$18if(c==on) goto $10423F
104227LDA $1117A=$1117
10422ACMP #$FFA==#$FF?
10422CBEQ #$11if(z==on) goto $10423F
10422ELDA #$00A=#$00
104230BRK #$8A #$78goto $000F80 #$8A #$78
104233LDX $46X=DP($46)
104235CPX $1117X==$1117?
104238BEQ #$07if(z==on) goto $104241
10423AINCA++
10423BCMP #$10A>=#$10?
10423DBCC #$F1if(c==off) goto $104230
10423FSECc=on
104240RTSreturn
104241BRK #$8A #$76goto $000F80 #$8A #$76
104244LDX $46X=DP($46)
104246STX $74DP($74)=X
104248BRK #$88 #$77goto $000F80 #$88 #$77
10424BLDX $46X=DP($46)
10424DSTX $71DP($71)=X
10424FLDA $7E29EA,XA=$7E29EA+X
104253AND #$0FA&=#$0F
104255STA $72DP($72)=A
104257TAXX=A
104258BEQ #$44if(z==on) goto $10429E
10425ALDA $278153,XA=$138153+X
10425ECMP #$02A>=#$02?
104260BCC #$1Fif(c==off) goto $104281
104262BNE #$DBif(z==off) goto $10423F
104264JSL $268D0ASR: $130D0A所持アイテムチェック(ひとしこのみ判定)
104268BCS #$4Fif(c==on) goto $1042B9
10426ALDA $74A=DP($74)
10426CASLA<<1
10426DTAXX=A
10426EREP #$20m=off(A/M:16b)
104270LDA $278182,XA=$138182+X
104274JSL $00953ESR: $00153E乱数発生?(0~A-1)
104278CMP #$0000A==or>=#$0000?
10427BSEP #$20m=on(A/M:8b)
10427DBNE #$C0if(z==off) goto $10423F
10427FBEQ #$38if(z==on) goto $1042B9
104281JSL $268D0ASR: $130D0A所持アイテムチェック(ひとしこのみ判定)
104285BCS #$32if(c==on) goto $1042B9
104287LDA $74A=DP($74)
104289ASLA<<1
10428ATAXX=A
10428BREP #$20m=off(A/M:16b)
10428DLDA $278172,XA=$138172+X
104291JSL $00953ESR: $00153E乱数発生?(0~A-1)
104295CMP #$0000A==or>=#$0000?
104298SEP #$20m=on(A/M:8b)
10429ABNE #$A3if(z==off) goto $10423F
10429CBEQ #$1Bif(z==on) goto $1042B9
10429EJSL $268D0ASR: $130D0A所持アイテムチェック(ひとしこのみ判定)
1042A2BCS #$15if(c==on) goto $1042B9
1042A4LDA $74A=DP($74)
1042A6ASLA<<1
1042A7TAXX=A
1042A8REP #$20m=off(A/M:16b)
1042AALDA $278162,XA=$138162+X
1042AEJSL $00953ESR: $00153E乱数発生?(0~A-1)
1042B2CMP #$0000A==or>=#$0000?
1042B5SEP #$20m=on(A/M:8b)
1042B7BNE #$86if(z==off) goto $10423F
1042B9CLCc=off
1042BARTSreturn

ざっくりとしか見ていませんが、待機モンスターが50体を超えていたら加入判定はスキップされます。同じ処理が3回繰り返されているのは1体目、2体目、3体目の判定のためのようです。乱数による判定の前に所持アイテムチェックを行い、合致していれば必ず仲間になるようになります。この部分が例の「ひとしこのみ」に相当するわけです。

  • SR: $130D14 所持アイテムチェック(ひとしこのみ判定)
130D14LDA $7E2056,XA=$7E2056+X
130D18CMP $268D33,XA==$130D33+X?
130D1CBNE #$0Dif(z==off) goto $130D2B
130D1EINXX++
130D1FCPX #$07X>=#$07?
130D21BCC #$F1if(c==off) goto $130D14
130D23REP #$30m=off(A/M:16b) x=off(X/Y:16b)
130D25PLYPull Y
130D26PLXPull X
130D27PLAPull A
130D28PLPPull P Flag
130D29SECc=on
130D2ARTLreturn
130D2BREP #$30m=off(A/M:16b) x=off(X/Y:16b)
130D2DPLYPull Y
130D2EPLXPull X
130D2FPLAPull A
130D30PLPPull P Flag
130D31CLCc=off
130D32RTLreturn

ちゃんとRAMの解析はしていませんが、どうやら7E2056が先頭のキャラクターのアイテムアドレスの開始位置なのでしょう。$130D33から6バイトは

00ひのきのぼう
0Aとがったホネ
91しあわせのぼうし
02こんぼう
3Cのこぎりがたな
64みかわしのふく

となっているので、この順番にアイテムを持っていると確実に仲間になる、ということのようです。しかし、正直残念グラフィックのDQ5はDQ3や6に比べると「変えてやろう」というモチベーションが段違いで沸かないのでどこまで続くかは未定です。モンスター画像やマップのデコードなんかもひと通りやりたい気はあるのですが、DQ5のグラフィックは圧縮されているとのことでデコードするプログラムを書くのも面倒だなあということでモチベーションは絶賛低下中です。ただ、ここしばらくツールの改良ばっかりやっていたわけですが、とりあえずそこそこ必要な機能は実装できたということでまた解析作業に戻れる感じです。そもそもDQ6やDQ5の解析をやっていたのは「AIの挙動を調べて可能であればDQ3にインポートしたい」「一応SFCのDQの解析はひと通りやりたい」というところから始まっていたのですが、最近改めてAI付きのDQをやって実感したのは「ボス戦はともかく、通常戦闘はAI任せだとボタン連打の白痴プレイになるわなあ」ということです。実装する側としては挑むべき壁としてはなかなか魅力的なネタではあるのですが、やっぱり便利なものがあると使ってしまうのは人間の性なので「実装したとして果たしておもろいんかね」というのが疑問として残ります。FC版のDQ4は自分で操作が一切できなかった+学習機能があったので自分の期待した通りの行動を取ってくれると嬉しかったりしたのですが、「命令させろ」があるのが当たり前の現在となってはAIは単なる自分のコマンド入力の手間を省くためのものに成り下がってしまっているという印象しか持てないので、モチベーションが湧きません。しばらくはゆるゆると作業をしようかと思います。

スポンサーリンク

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。