久しぶりの質問回答コーナーです。お題は
DQ6の主人公の勇者転職条件に魔法戦士、パラディンマスターを加える
です。
DQ6の主人公の転職条件はぼんやり「どれか上級職1つ」と認識していたりしたので、パラディンをマスターしただけでは勇者に転職できなかったなあと今更ながら思い出しました。オリジナルでは「主人公はバトルマスター・賢者・スーパースター・レンジャーのどれか1つ」「それ以外のキャラクターは4職業全部マスター」が勇者への転職条件です。ダーマでの転職処理をたまたま見つけたので中を見ていたらそれほど難しもなさそうだったのでちゃちゃっとやってしまいます。まずはオリジナルの実装。
- SR:$043674 職業熟練度一覧情報作成
略 | |||
---|---|---|---|
043806 | LDA $4928 | A=$4928 | |
043809 | CMP #$0001 | A==#$0001? | キャラクターIDが主人公か? |
04380C | BEQ #$1C | if(z==on) goto $04382A | |
04380E | LDA $493C | A=$493C | |
043811 | BEQ #$15 | if(z==on) goto $043828 | バトルマスターをマスター状態か |
043813 | LDA $4942 | A=$4942 | |
043816 | BEQ #$10 | if(z==on) goto $043828 | 賢者をマスター状態か |
043818 | LDA $4944 | A=$4944 | |
04381B | BEQ #$0B | if(z==on) goto $043828 | スーパースターをマスター状態か |
04381D | LDA $4946 | A=$4946 | |
043820 | BEQ #$06 | if(z==on) goto $043828 | レンジャーをマスター状態か |
043822 | LDA #$0011 | A=#$0011 | 勇者の職業ID |
043825 | JSR $3891 | SR: $043891 | 指定職業IDをリストに加える |
043828 | BRA #$14 | goto $04383E | |
04382A | LDA $493C | A=$493C | バトルマスターをマスター状態か |
04382D | BNE #$F3 | if(z==off) goto $043822 | |
04382F | LDA $4942 | A=$4942 | 賢者をマスター状態か |
043832 | BNE #$EE | if(z==off) goto $043822 | |
043834 | LDA $4944 | A=$4944 | スーパースターをマスター状態か |
043837 | BNE #$E9 | if(z==off) goto $043822 | |
043839 | LDA $4946 | A=$4946 | レンジャーをマスター状態か |
04383C | BNE #$E4 | if(z==off) goto $043822 | |
略 |
ここより前で下級職を含めたマスター状態をテンポラリの変数にセットしています(戦士:$7E492A、武闘家:$7E492C…)。上記のプログラムの前半は主人公以外、後半は主人公になっているので前半は4つの上級職が全てマスターになっている時のみ勇者をリストに追加、後半はどれかがマスターになっていれば勇者をリストに追加、という実装になっているのがわかります。というわけでここまでくれば後はやることはだいたい見えてきました。魔法戦士のマスター状態は$7E493E、パラディンのマスター状態は$7E3940に保持されているのでそれを追加でチェックすればいいということになります。
- SR:$043674 職業熟練度一覧情報作成
略 | |||
---|---|---|---|
043839 | JSR $FFD1 | SR: $04FFD1 | レンジャー・魔法戦士・パラディンのどれかがマスターか(該当c=on) |
04383C | BCS #$E4 | if(c==on) goto $043822 | |
略 |
- SR:$04FFD1 レンジャー・魔法戦士・パラディンのどれかがマスターか(該当c=on)(新SR)
04FFD1 | LDA $4946 | A=$4946 | レンジャーがマスター状態か |
---|---|---|---|
04FFD4 | BNE #$0C | if(z==off) goto $04FFE2 | |
04FFD6 | LDA $493E | A=$493E | 魔法戦士がマスター状態か |
04FFD9 | BNE #$07 | if(z==off) goto $04FFE2 | |
04FFDB | LDA $4940 | A=$4940 | パラディンがマスター状態か |
04FFDE | BNE #$02 | if(z==off) goto $04FFE2 | |
04FFE0 | CLC | c=off | |
04FFE1 | RTS | return | |
04FFE2 | SEC | c=on | |
04FFE3 | RTS | return |
お手軽にやるならこんな感じ。個人的には判定SRは分けないで1ヶ所に書いたほうがいいと思いますが。証拠画像は↓のようになります。
転職時の職業選択画面
転職後の職業熟練度画面。パラディンしかマスターしてないのに勇者になっていることがわかります。
コメント
質問したものです。詳細ありがとうございます( ^^)
なるほど、すごい技術ですね。ちなみに、制作主の開発環境はどのようなものでしょうか??
どんなツールを使っているか簡単に教えていただきたいです。
開発環境は自作のSFCGENEditorです。