DQ3 ストーリー変更(幽霊船3)

今回は追加NPCの配置、モンスターデータの設定、イベント戦闘の実装を行います。イベントの発生条件をチェックして、愛の思い出を持った状態で追加イベントを終了させていない場合のみ、画面上に配置するNPCを変えます。配置するのは、骸骨(#$5C)、囚人(#$49)、モンスター(#$5D)です。NPC1のデータ(座標など)の設定は省略します。

  • SR: $0CCF31 幽霊船1FNPC設定
0CCF31-7NOP
0CCF38LDA #$0535A=#$0535
0CCF3BJSL $C75828SR: $075828
0CCF3FLDA #$008AA=#$008A
0CCF42JSL $C758DESR: $0758DE
0CCF46JSL $CCF698SR: $0CF698
0CCF4ARTLreturn

  • SR: $0CF698 幽霊船1FNPC設定(サブ)
0CF698LDA $3629A=$3629
0CF69BAND #$0004A&=#$0004
0CF69EBNE #$07if(z==off) goto $0CF6A7
0CF6A0LDA #$0534A=#$0534
0CF6A3JSL $C75828SR: $075828
0CF6A7JSL $CCF15ASR: $0CF15A追加イベント発生か
0CF6ABBCC #$48if(c==off) goto $0CF6F5
0CF6ADLDA #$0574A=#$0574
0CF6B0JSL $C75828SR: $075828
0CF6B4LDA #$0575A=#$0575
0CF6B7JSL $C75828SR: $075828
0CF6BBLDA #$0576A=#$0576
0CF6BEJSL $C75828SR: $075828
0CF6C2LDA #$0577A=#$0577
0CF6C5JSL $C75828SR: $075828
0CF6C9LDA #$0578A=#$0578
0CF6CCJSL $C75828SR: $075828
0CF6D0LDA #$0579A=#$0579
0CF6D3JSL $C75828SR: $075828
0CF6D7LDA #$057AA=#$057A
0CF6DAJSL $C75828SR: $075828
0CF6DELDA $35B1A=$35B1
0CF6E1AND #$0001A&=#$0001
0CF6E4BNE #$07if(z==off) goto $0CF6ED
0CF6E6LDA #$057BA=#$057B
0CF6E9JSL $C75828SR: $075828
0CF6EDLDA #$057CA=#$057C
0CF6F0JSL $C75828SR: $075828
0CF6F4RTLreturn
0CF6F5LDA #$0533A=#$0533骸骨船長のNPC
0CF6F8JSL $C75828SR: $075828
0CF6FCRTLreturn

  • SR: 0CF15A 幽霊船追加イベント発生条件かしらべる(該当c=on)
0CF15ALDA $35B1A=$35B1
0CF15DAND #$0002A&=#$0002
0CF160BNE #$0Aif(z==off) goto $0CF16C
0CF162LDA $3542A=$3542
0CF165AND #$0080A&=#$0080
0CF168BEQ #$02if(z==on) goto $0CF16C
0CF16ASECc=on
0CF16BRTLreturn
0CF16CCLCc=off
0CF16DRTLreturn

SRの実装自体はこれといって特筆すべきものはありません。条件によって配置するNPCを変えているだけです。

追加NPCの配置は、甲板の出口に骸骨3体、舳先にいるボスに簡単に到達できないように囚人2体、骸骨2体とします。できれば囚人はDQ6から腐った死体のキャラクターグラフィックを移植したり、ボス専用グラフィックを用意したかったのですが、とりあえずスキップします。

20090902033306.jpg 20090902031106.jpg

次にこれらのNPCに話し掛けたときに戦闘になるモンスターの設定を行います。DQ6からグラコス、ボーンプリズナーの画像を移植し、新たに追加モンスターとして

  • グラコス(ボス)
  • ネクロマンサー(ボス、シャーマンの色違い)
  • ボーンプリズナー(イベント専用ザコ)
  • リビングデッド(イベント専用ザコ、くさった死体の色違い)

を定義します。今回モンスターの行動定義を初めてまじめにやってみたんですが、さじ加減が難しいですね。モンスターの強さの調整は最終段階の通しテストでバランス調整をする予定です。グラコスおなじみのげはげは笑ってのなぎ払いもまだ未実装です。

モンスターの定義が終わったので、追加NPCに話し掛けたときのイベント戦闘の実装を行います。イベント戦闘の処理はすでに存在するので基本的にはまんまコピーしてイベント戦闘IDだけ変えればいいだけですが、1点変える所があります。今まではオリジナルにならって4C(JMP,アドレス指定でジャンプ)を所々で使用していましたが、空き領域の効率的な使用の観点から、80(BRA,前後127バイトまで相対バイトで移動)の使用にできるだけ統一することにしました。作業開始時に複数のSRを定義/実装する場合に個々のSRのサイズがどれくらいになるかわからない/後で追加の可能性もあるので余裕を持ってSRの開始位置を決めますが、実際は隙間が空くので後でSRを移動して間を詰めたりします。その際に4Cを使ってジャンプ先のアドレスを固定で指定している場合はそのままにしておくとバグってしまうので再度設定しなおさないといけないですが、(論理的に)正しいジャンプ先を指定しなかったりなどバグの温床になるので作業が非常に煩雑になります。というわけで、小規模のSRであれば80を使っておけばSRを移動してもバグる心配はありません。こういうの他の開発環境なら関係ないんだろうなーと思いつつ、ガラパゴス化した環境で作業を続けます。

  • SR: $0DE4BB イベント戦闘(vsボーンプリズナー3体)
0DE4BBLDA #$0021A=#$0021
0DE4BEJSL $C687A0SR: $0687A0イベント戦闘処理
0DE4C2BRA #$10goto $0DE4D4
0DE4C4JSL $CCD383SR: $0CD383メニュー表示モードON?
0DE4C8JSL $CDC5B0SR: $0DC5B0
0DE4CCBRA #$17goto $0DE4E5
0DE4CEJSL $C67A85SR: $067A85全滅時復活処理
0DE4D2BRA #$11goto $0DE4E5
0DE4D4LDA $C149A=$C149戦闘終了フラグ?
0DE4D7CMP #$0000A==#$0000?勝利時
0DE4DABNE #$02if(z==off) goto $0DE4DE
0DE4DCBRA #$E6goto $0DE4C4
0DE4DECMP #$0002A==#$0002?全滅時
0DE4E1BNE #$02if(z==off) goto $0DE4E5
0DE4E3BRA #$E9goto $0DE4CE
0DE4E5RTLreturn

  • SR: $0DE456 イベント戦闘(vsボーンプリズナー)
0DE456LDA #$0023A=#$0023
0DE459JSL $C687A0SR: $0687A0イベント戦闘処理
0DE45DBRA #$1Fgoto $0DE47E
0DE45FLDA #$0018A=#$0018
0DE462JSL $C74B8CSR: $074B8C行動キャラクター指定
0DE466JSL $C75930SR: $075930キャラクター消滅
0DE46AJSL $C74BC2SR: $074BC2?
0DE46EJSL $CCD383SR: $0CD383メニュー表示モードON?
0DE472JSL $CDC5B0SR: $0DC5B0
0DE476BRA #$17goto $0DE48F
0DE478JSL $C67A85SR: $067A85全滅時復活処理
0DE47CBRA #$11goto $0DE48F
0DE47ELDA $C149A=$C149戦闘終了フラグ?
0DE481CMP #$0000A==#$0000?勝利時
0DE484BNE #$02if(z==off) goto $0DE488
0DE486BRA #$D7goto $0DE45F
0DE488CMP #$0002A==#$0002?全滅時
0DE48BBNE #$02if(z==off) goto $0DE48F
0DE48DBRA #$E9goto $0DE478
0DE48FRTLreturn

今回のイベントではNPCのほとんどが「死なない?アンデッド(なんか変ですね)」なので、SR: $0DE4BBのような実装になりますが、1体は例外で戦闘がおわったら消えるようにします(SR: $0DE456)。そのあたりの実装が$0DE45F-6Aなのですが、ここで#$18を指定していますが、どうやらこれはNPC1の0バイト目の0-5ビットの値に対応しているようです。マップ中に配置するNPCのうち、そのNPCに付随するSR(Move,Talk)ではなく、それ以外から操作する場合はこのID?をマップ中で一意にしておくとコントロールできるようです。ちなみに幽霊船の甲板にはもともとミニデーモンがいますが、このNPC(ID:#$534)のは#19が設定されており、ミニデーモンとのイベント戦闘(SR: $0D8DD3-)では戦闘に勝った場合には、#$19を指定して消滅処理を行っているようです。とりあえず今回はここまでにします。

20090902033307.jpg

スポンサーリンク

コメントを書く

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