ドラクエ4の移動速度をなおしたい

このころの RPG の移動速度は 1 pixel相当/frame で遅いものが大半でいまやるとかったるい(ナイトガンダム物語2はなぜか早いので例外)。今回はドラクエ4をやりかけ中。

CAEA: lda $0584
CAED: cmp #$01
CAEF: beq $cb17
CAF1: lda #$01
CAF3: sta $0584 <- tile scroll speed
CAF6: lda #$10
CAF8: sta $0585 <- sprite scroll speed
CAFB: ldx #$03
CAFD: lda $70e0, x
CB00: and #$bf
CB02: sta $70e0, x
CB05: lda $6be7, x
CB08: and #$20
CB0A: asl a
CB0B: asl a
CB0C: eor #$80
CB0E: ora $70e0, x
CB11: sta $70e0, x
CB14: dex
CB15: bpl $cafd
CB17: jmp $d234

$caed の cmp #1 を cmp #2, $caf1 の lda #1 を lda #2, $caf6 の lda #$10 を lda #$20 にするととりあえず移動速度が2倍になる。ちょっと動かしてみたところ不具合多数。

  • 特定の場所に移動するとメッセージがでるイベントが発生しないことがある
  • エンカウントしない
  • プレイヤーが自動的に移動するイベント系で他のキャラより早く動いて進行がおかしくなる
  • 一部の村人の座標が変になる

後ろ2つの問題はどうも例外的な動きをする村人の移動量とプレイヤーキャラの移動量の変数($0584,$0585)を使いまわしているのが原因ぽい。プレイヤー(=コントローラ)からの移動遷移のみを見分けないと使い物にならない。 $caea の分岐はたぶんその関係だと思う。

あとは想定するに、こういったシリーズ物の根底的な処理は、初代のソースをつぎたしつぎたし使いまわしているからソースが汚くなっていると思うので、いきなり4作目を触ったのはよろしくない気がした。

またドラクエ4は SUROM という無理矢理 Program bank を拡張しているから $c000-$ffff が半固定バンクになっている。半固定を実質固定にするために ROM の 0x3c000-0x3ffff と 0x7c000-0x7ffff がほぼ同内容になっているから、両方書き換えないとだめ。片方だけ替えたら1章だけ動きが速かった。

どういうわけか1章の最後でセーブデータが残ってたのですぐわかった。