PC側の成長ステータスをいじっていたんですが、それにあわせて装備品の見直しをしていたら、光のドレス、ドラゴンローブのあまりのチートさをようやく認識するにいたりました。これはひどすぎる、ということで光のドレスは守備力を大幅に下げることにしたんですが、それでも割と簡単に無限に手に入るのはけしからんということで、すごろくのシステムをちょっと変えることにしました。普通は入手数制限で対応するんですが、それ一辺倒というのもアレなので、すごろく中は「コイン」制を導入することにします。毎回スタート時にはコイン1枚から開始なので積極的に戦闘することも考えないと目標額まで到達できませんし、コインマイナスのマスに止まるとその時点でアウトになります。コインを増やすギミックを追加で用意したり、モンスターの編成を変えたりしないと単なる無理ゲーになってしまうのでバランス調整が難しいところ。あとはバランス調整とデバッグだけだと思ってたのにねえ。
さて、最近停滞気味だったストーリー関連の実装の説明を進めます。メルキド襲撃の追加イベント終了後、精霊のほこらでヒントを貰ったあとの実装です。切りどころがいまいちわからなくてベタ書きしているので、意味不明な可能性高し。
- SR: $0A1859 NPC1_TalkSR_0228(エルフの女王の会話処理)
| 略 |
|
|
|
| 0A1865 |
JSL $CCF4B7 |
SR: $0CF4B7 |
|
| 0A1869 |
BCC #$16 |
if(c==off) goto $0A1881 |
|
| 0A186B-7D |
NOP |
|
|
| 略 |
|
|
|
- SR: $0CF4B7 エルフの女王会話処理(サブ)(新SR)
| 0CF4B7 |
LDA $35B2 |
A=$35B2 |
|
| 0CF4BA |
AND #$0004 |
A&=#$0004 |
|
| 0CF4BD |
BEQ #$0B |
if(z==on) goto $0CF4CA |
|
| 0CF4BF |
BRK $103C ($0C103C) |
goto $00FFE6(メッセージ表示) #$103C |
光の鎧のヒント表示 |
| 0CF4C2 |
LDA #$0001 |
A=#$0001 |
|
| 0CF4C5 |
TSB $35B4 |
A or $35B4 |
光の鎧の隠し場所のヒントを聞いたフラグon |
| 0CF4C8 |
BRA #$17 |
goto $0CF4E1 |
|
| 0CF4CA |
LDA $354A |
A=$354A |
|
| 0CF4CD |
AND #$0010 |
A&=#$0010 |
|
| 0CF4D0 |
BNE #$02 |
if(z==off) goto $0CF4D4 |
|
| 0CF4D2 |
BRA #$0F |
goto $0CF4E3 |
|
| 0CF4D4 |
LDA $353E |
A=$353E |
|
| 0CF4D7 |
AND #$0004 |
A&=#$0004 |
|
| 0CF4DA |
BNE #$02 |
if(z==off) goto $0CF4DE |
|
| 0CF4DC |
BRA #$05 |
goto $0CF4E3 |
|
| 0CF4DE |
BRK $03E8 ($0C03E8) |
goto $00FFE6(メッセージ表示) #$03E8 |
|
| 0CF4E1 |
SEC |
c=on |
|
| 0CF4E2 |
RTL |
return |
|
| 0CF4E3 |
CLC |
c=off |
|
| 0CF4E4 |
RTL |
return |
|
ただ単にお使いフラグを立てるだけです。この1クッションなしでいきなりバラモス城にGOでもいいのですが、あまりに下の精霊が万能になってしまうのでこうしました。次はバラモス城の変更です。バラモス城には都合2回来ることになります。1回目はエルフの女王にヒントを貰ってバラモスの間に来て、さらに骸骨からヒントをもらい、2回目はガライを連れてもう一度バラモスの間に来る、という修正です。まずは1回目の追加イベントの実装を行いますが、順番としては、
- バラモス城1F-2(骸骨が玉座にいるフロア)のドアの近くに行くと「視線を感じる」メッセージが表示される
- バラモスの間の特定座標に達すると後ろに骸骨が現れて逃げる
- バラモスの間を出てバラモス城外観に移動し、左方向に向かい特定座標に達すると骸骨が左に逃げて消える
- 再度バラモス城1F-2に戻り、骸骨と話して光の鎧のヒントをもらう
となります。問題なのは、「イベント中にルーラで移動された場合どうするか」という問題ですが、これは「同一ダンジョン?中のみ有効なフラグ」を使用することで一連のイベントを1パックにすることができます。「同一ダンジョン?中のみ有効なフラグ」は7E3628-40に存在し、扉の開閉状態等もここを使っています(ドア開閉データの「同一フロア内開閉管理番号」というのは7E3628からのビット単位でのオフセットを意味しています)。このフラグは同一ダンジョン?から移動するときにクリアされるテンポラリのものです。今回のようにルーラ可能な複数フロア間にまたがるイベントを実装する場合にはこの領域を利用するのが一番便利です。
- SR: $0A59D3 バラモス城1F-2進入時初期化処理
| 略 |
|
|
|
| 0A59F0 |
JSL $CCF4E5 |
SR: $0CF4E5 |
バラモス城1F-2イベント・NPC等設定 |
| 0A59F4-6 |
NOP |
|
|
| 略 |
|
|
|
- SR: $0CF4E5 バラモス城1F-2イベント・NPC等設定(新SR)
| 0CF4E5 |
JSL $C77843 |
SR: $077843 引数:1#$CAA16B |
移動・宝箱・ドア・NPC情報設定 |
| 0CF4EC |
JSL $C7785F |
SR: $07785F 引数:1#$CCFE2D |
イベント設定 |
| 0CF4F3 |
RTL |
return |
|
- SR: $0CFE2D バラモス城1F-2追加イベント処理(新SR)
| 0CFE2D |
JSL $CCFE50 |
SR: $0CFE50 |
バラモス上の骸骨から光の鎧の情報を聞いた(該当c=on) |
| 0CFE31 |
BCS #$18 |
if(c==on) goto $0CFE4B |
|
| 0CFE33 |
JSL $CCFEED |
SR: $0CFEED |
バラモス城1F-2追加イベント処理(骸骨と会話)発生条件か(該当c=on) |
| 0CFE37 |
BCC #$06 |
if(c==off) goto $0CFE3F |
|
| 0CFE39 |
JSL $CCFA23 |
SR: $0CFA23 |
バラモス城1F-2追加イベント処理(骸骨と会話)実処理 |
| 0CFE3D |
BRA #$10 |
goto $0CFE4F |
|
| 0CFE3F |
JSL $CCFA10 |
SR: $0CFA10 |
バラモス城1F-2追加イベント処理(視線を感じた)発生条件か(該当c=on) |
| 0CFE43 |
BCC #$06 |
if(c==off) goto $0CFE4B |
|
| 0CFE45 |
JSL $CCF8F2 |
SR: $0CF8F2 |
バラモス城1F-2追加イベント処理(視線を感じた)実処理 |
| 0CFE49 |
BRA #$04 |
goto $0CFE4F |
|
| 0CFE4B |
JSL $CCD211 |
SR: $0CD211 |
フラグ消化後のイベント終了時処理? |
| 0CFE4F |
RTL |
return |
|
- SR: $0CFE50 バラモス上の骸骨から光の鎧の情報を聞いた(該当c=on)(新SR)
- SR: $0CFEED バラモス城1F-2追加イベント処理(骸骨と会話)発生条件か(該当c=on)(新SR)
- SR: $0CFA10 バラモス城1F-2追加イベント処理(視線を感じた)発生条件か(該当c=on)(新SR)
フラグのチェックのみなので省略
- SR: $0CF8F2 バラモス城1F-2追加イベント処理(視線を感じた)実処理(新SR)
| 0CF8F2 |
COP |
goto $00FFE4 |
|
| 0CF8F3 |
JSL $CCD276 |
SR: $0CD276 |
|
| 0CF8F7 |
LDA #$08F0 |
A=#$08F0 |
|
| 0CF8FA |
LDX #$0900 |
X=#$0900 |
|
| 0CF8FD |
LDY #$0938 |
Y=#$0938 |
|
| 0CF900 |
JSL $C75365 |
SR: $075365 |
PCが指定座標(X座標は範囲指定)に到達しているか(しているc=on) |
| 0CF904 |
BCS #$02 |
if(c==on) goto $0CF908 |
|
| 0CF906 |
BRA #$EB |
goto $0CF8F3 |
|
| 0CF908 |
JSL $C737BE |
SR: $0737BE 引数:1#$104A |
メッセージ表示 |
| 0CF90E |
LDA #$0001 |
A=#$0001 |
|
| 0CF911 |
TSB $3638 |
A or $3638 |
フラグON |
| 0CF914 |
JSL $CDACD2 |
SR: $0DACD2 |
キー入力でメッセージウィンドウを閉じる |
| 0CF918 |
JSL $CDD65C |
SR: $0DD65C |
PC表示? |
| 0CF91C |
JSL $CCD298 |
SR: $0CD298 |
イベント終了時処理? |
| 0CF920 |
RTL |
return |
|
- SR: $0AA1E2 バラモスの間移動・宝箱・ドア・NPC情報設定
| 略 |
|
|
|
| 0AA209 |
JSL $CDE763 |
SR: $0DE763 |
バラモスの間NPC設定+追加イベント用設定 |
| 略 |
|
|
|
- SR: $0DE763 バラモスの間NPC設定+追加イベント用設定(新SR)
| 0DE763 |
JSL $CCC8A2 |
SR: $0CC8A2 |
バラモスの間NPC設定 |
| 0DE767 |
JSL $CDF23F |
SR: $0DF23F |
バラモスの間追加イベント用設定 |
| 0DE76B |
RTL |
return |
|
- SR: $0DF23F バラモスの間追加イベント用設定(新SR)
| 略 |
|
|
|
| 0DF24D |
LDX #$0097 |
X=#$0097 |
|
| 0DF250 |
JSL $C666FA |
SR: $0666FA |
しらべるイベント設定 |
| 略 |
|
|
|
| 0CC8A2 |
JSR $F22E |
SR: $0CF22E |
バラモスの間NPC設定(サブ) |
| 略 |
|
|
|
- SR: $0CF22E バラモスの間NPC設定(サブ)(新SR)
| 略 |
|
|
|
| 0CF251 |
LDA #$0599 |
A=#$0599 |
骸骨のNPC |
| 0CF254 |
JSL $C75828 |
SR: $075828 |
NPC1設定 |
| 0CF258 |
RTS |
return |
|
| 略 |
|
|
|
| 0CEBC7 |
JSL $CCFDFA |
SR: $0CFDFA |
バラモスの間追加イベント処理 |
| 略 |
|
|
|
- SR: $0CFFDA バラモスの間追加イベント処理(新SR)
| 0CFDFA |
JSL $CDE55C |
SR: $0DE55C |
バラモス城追加ボスを倒したか(該当c=on) |
| 0CFDFE |
BCC #$06 |
if(c==off) goto $0CFE06 |
|
| 0CFE00 |
JSL $CCD211 |
SR: $0CD211 |
フラグ消化後のイベント終了時処理 |
| 0CFE04 |
BRA #$16 |
goto $0CFE1C |
|
| 0CFE06 |
JSL $CCFF1C |
SR: $0CFF1C |
ガライが仲間になっているか(該当c=on) |
| 0CFE0A |
BCC #$06 |
if(c==off) goto $0CFE12 |
|
| 0CFE0C |
JSL $CDF32A |
SR: $0DF32A |
|
| 0CFE10 |
BRA #$0A |
goto $0CFE1C |
|
| 0CFE12 |
JSL $CCFE5D |
SR: $0CFE5D |
バラモスの間追加イベント1が発生する条件か(該当c=on) |
| 0CFE16 |
BCC #$E8 |
if(c==off) goto $0CFE00 |
|
| 0CFE18 |
JSL $CDEEF8 |
SR: $0DEEF8 |
バラモスの間追加イベント1処理 |
| 0CFE1C |
RTL |
return |
|
- SR: $0DE55C バラモス城追加ボスを倒したか(該当c=on)(新SR)
- SR: $0CFF1C ガライが仲間になっているか(該当c=on)(新SR)
- SR: $0CFE5D バラモスの間追加イベント1が発生する条件か(該当c=on)(新SR)
フラグのチェックのみなので省略
- SR: $0DEEF8 バラモスの間追加イベント1処理(新SR)
| 0DEEF8 |
COP |
goto $00FFE4 |
|
| 0DEEF9 |
JSL $CCD276 |
SR: $0CD276 |
|
| 0DEEFD |
LDA #$0980 |
A=#$0980 |
|
| 0DEF00 |
LDX #$0980 |
X=#$0980 |
|
| 0DEF03 |
LDY #$0920 |
Y=#$0920 |
|
| 0DEF06 |
JSL $C75365 |
SR: $075365 |
PCが指定座標(X座標は範囲指定)に到達しているか(しているc=on) |
| 0DEF0A |
BCS #$02 |
if(c==on) goto $0DEF0E |
|
| 0DEF0C |
BRA #$EB |
goto $0DEEF9 |
|
| 0DEF0E |
JSL $CDADD8 |
SR: $0DADD8 |
カウンタに1000をセット |
| 0DEF12 |
JSL $CDAED1 |
SR: $0DAED1 |
カウンタが2000になるまで待機 |
| 0DEF16 |
LDA #$0002 |
A=#$0002 |
|
| 0DEF19 |
TSB $3638 |
A or $3638 |
フラグON |
| 0DEF1C |
JSL $CDD65C |
SR: $0DD65C |
PC表示? |
| 0DEF20 |
JSL $CCD298 |
SR: $0CD298 |
イベント終了時処理 |
| 0DEF24 |
RTL |
return |
|
- SR: $0CFE70 NPC1_MoveSR_0599(骸骨のNPC)(新SR)
| 0CFE70 |
COP |
goto $00FFE4 |
|
| 0CFE71 |
JSL $CDAEB1 |
SR: $0DAEB1 |
カウンタが1000になるまで待機 |
| 0CFE75 |
JSL $CCD392 |
SR: $0CD392 |
キャラクターイベント中移動フラグON? |
| 0CFE79 |
JSL $CCD35E |
SR: $0CD35E |
移動速度4/3倍速セット? |
| 0CFE7D |
LDA #$002E |
A=#$002E |
|
| 0CFE80 |
LDX #$0039 |
X=#$0039 |
|
| 0CFE83 |
JSL $C75305 |
SR: $075305 |
キャラクター出現座標指定 |
| 0CFE87 |
JSL $CCD857 |
SR: $0CD857 |
キャラクターを上に向かせる |
| 0CFE8B |
LDX #$002E |
X=#$002E |
|
| 0CFE8E |
LDA #$0030 |
A=#$0030 |
|
| 0CFE91 |
JSL $C75474 |
SR: $075474 |
キャラクター移動先座標指定 |
| 0CFE95 |
JSL $CCD59D |
SR: $0CD59D |
指定座標にY軸→X軸の順でキャラクター移動 |
| 0CFE99 |
JSL $CC73CF |
SR: $0C73CF |
キャラクターが足踏する処理 |
| 0CFE9D |
LDX #$002E |
X=#$002E |
|
| 0CFEA0 |
LDA #$0039 |
A=#$0039 |
|
| 0CFEA3 |
JSL $C75474 |
SR: $075474 |
|
| 0CFEA7 |
JSL $CCD59D |
SR: $0CD59D |
|
| 0CFEAB |
JSL $C75930 |
SR: $075930 |
キャラクター消滅 |
| 0CFEAF |
JSL $CDADE6 |
SR: $0DADE6 |
カウンタに2000セット |
| 0CFEB3 |
RTL |
return |
|
まだ半分くらいなんですが、長くなったので今回はこの辺で。
コメント
通りすがりですが簡単なバグ報告です。ここの改造でできた奇跡の剣を使いますと、たとえばスライムを攻撃したときに、スライムに89のダメージ!のつぎに表示されるメッセージが、スライムのキズが回復した!になってしまっています。戦闘メッセージ005E:FCA4EE:[BD][B8]の キズが かいふくした![B1]のうちの動作の対象を表す変数文字コードの[B8]を動作の主体を表す文字コードの[B7]に変更した戦闘メッセージを増設して、それを使うことですぐに直りますが。
実装ではそれを見越して$02D3C7-E2で行動主体と対象を入れ替えてるんですが…。念のため手元で確認してみましたが、一応ちゃんと動いてました。とはいえ、ご指摘の実装方法のほうがプログラムがすっきりするのでいいですね。取り入れさせてもらいます。