今回から実装に入ります。
- SR: $03DAEB 登録所メイン
03DAEB | PHP | Push P Flag | |
---|---|---|---|
03DAEC | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
03DAEE | PHA | Push A | |
03DAEF | PHX | Push X | |
03DAF0 | PHY | Push Y | |
03DAF1 | PHB | Push DB | |
03DAF2 | PEA #$7E7E | Push #$7E7E | |
03DAF5 | PLB | Pull DB | |
03DAF6 | PLB | Pull DB | |
03DAF7 | JSL $CAFDE2 | SR: $0AFDE2 | 登録所台詞1(登録しますか) |
略 |
- SR: $0AFDE2 登録所台詞1(登録しますか)(新SR)
0AFDE2 | JSL $CAFDD6 | SR: $0AFDD6 | 盗賊登録中か(該当c=on) |
---|---|---|---|
0AFDE6 | BCS #$27 | if(c==on) goto $0AFE0F | |
0AFDE8 | JSL $C1A92E | SR: $01A92E 引数:1#$0B31 | メッセージ表示 |
0AFDEE | JSL $C909AE | SR: $0909AE 引数:1#$7E353A 引数:2#$0014 | RAM上情報取得 |
0AFDF7 | BCS #$0F | if(c==on) goto $0AFE08 | |
0AFDF9 | JSL $C1A92E | SR: $01A92E 引数:1#$0B32 | |
0AFDFF | JSL $C908F0 | SR: $0908F0 引数:1#$7E353A 引数:2#$0014 | RAM上情報変更(ON) |
0AFE08 | JSL $C1A92E | SR: $01A92E 引数:1#$0B33 | |
0AFE0E | RTL | return | |
0AFE0F | JSL $C1A92E | SR: $01A92E 引数:1#$108C | 盗賊登録所用のセリフ |
0AFE15 | RTL | return |
- SR: $0AFDD6 盗賊登録中か(該当c=on)(新SR)(省略)
基本的にフラグを見て表示するメッセージを1対1対応で切り替えて行くだけなので省略します。1番目のポイントは職業選択部分の処理です。
- SR: $03DAEB 登録所メイン
略 | |||
---|---|---|---|
03DBB2 | JSL $CAFE66 | SR: $0AFE66 | 登録所職業決定処理 |
03DBB6 | NOP | ||
03DBB7 | BCS #$EB | if(c==on) goto $03DBA4 | c=onならキャンセル |
03DBB9 | STA $4063 | $4063=A | |
略 |
- SR: $0AFE66 登録所職業決定処理(新SR)
0AFE66 | JSL $CAFDD6 | SR: $0AFDD6 | 盗賊登録中か(該当c=on) |
---|---|---|---|
0AFE6A | BCS #$06 | if(c==on) goto $0AFE72 | |
0AFE6C | JSL $C32251 | SR: $032251 引数:1#$A1 | ウィンドウ表示 |
0AFE71 | RTL | return | |
0AFE72 | LDA #$0006 | A=#$0006 | 盗賊登録中なら職業IDは6(盗賊)で固定 |
0AFE75 | CLC | c=off | キャンセルはなし |
0AFE76 | RTL | return |
ここはもともとは職業選択用のウィンドウ(ID:#$A1)を表示し、c=onなら登録処理をキャンセルする処理に飛ばす、ということをしていました。従ってアリアハンの登録所なら職業選択用のウィンドウ(盗賊は除く)を表示し、盗賊登録所ならウィンドウは表示せず盗賊(職業IDは6)を返す、とすればOKです。また、職業選択用のウィンドウの表示内容も変更する必要があります。
- SR: $03F540 ウィンドウ描画SR_00A1
03F540 | JSL $C3FF72 | SR: $03FF72 | 新規PC追加用職業リスト準備 |
---|---|---|---|
略 |
- SR: $03FF72 新規PC追加用職業リスト準備(新SR)
03FF72 | LDA #$0006 | A=#$0006 | |
---|---|---|---|
03FF75 | STA $40F7 | $40F7=A | |
03FF78 | LDA #$0000 | A=#$0000 | |
03FF7B | LDX #$0000 | X=#$0000 | |
03FF7E | STA $40F9,X | $40F9+X=A | |
03FF81 | INC | A++ | |
03FF82 | INX | X++ | |
03FF83 | INX | X++ | |
03FF84 | CMP #$0006 | A>=#$0006? | |
03FF87 | BCC #$F5 | if(c==off) goto $03FF7E | |
03FF89 | RTL | return |
あんまり良くないんですが、必要なIDが0から5までなのでハードコードでセットするSRを書いてしまいました。本当ならアリアハン登録所で選択できる職業IDの配列を作ってそのIDをリストするとかしないといけないところです。とりあえず前半はここまで。残りは盗賊を登録した時にその場で外す仲間を選択できるようにする処理です。
コメント
いつもこちらでは勉強させて頂いております。
読み応えがありすぎて時間がどんどん溶けて行きますが
面白さもあり夢中になってしまいます。
ところでアリアハンの登録所にあるリストから盗賊を削除されているようですが
たとえば遊び人をリストから削除して枠自体も遊び人がない分減らすといった
事をしたいと思うのですがどのようにすればいいのでしょうか?
46AEBからアリアハンの登録所にあるリストになっているようですが
一先ずは別の職業で遊び人を上書きして選択できないようには出来ました。
でも同じ職業が複数あるのも見栄えが良くないので、枠自体を縮めたいと思います。
登録所の職業選択ウィンドウ(#$A1)の高さを変えてください。
何度もすみません。
通常のドラクエ3なのですが、
$03DAEB登録所メインという所にこの記事の新SRと似たプログラムがあり
3DBB2の所に#$A1という文字列があるのは見つけられたのですが、
職業が7ある所を6にしようとしているので07という数値を06にする為
07という数値を探しているのですが見当たらず
SRの参照先?の「$032251ウィンドウ表示更新(1枚)?」
にも07はありませんでした。高さを変えるという意味が分からず
素人なりに考え、それっぽい所もいじってはみたのですがバグるばかりで
出来ませんでした。申し訳ありませんがこの辺り詳細をお教えいただければと思います。
見ないといけないのはウィンドウID「#$A1」の描画処理#$039439です。プログラムで動的に高さを変えているかは覚えてません。
キリがないので返信はこれで最後にします。
たしかに昔やった改造って自分自身でも案外覚えていませんよね。
私もそういう質問された事がありますが、調べ直すのもなかなかおっくうだし
色んな意味で正確な答えは出しがたい物です。
せっかくアドバイス頂いたのに残念ながら質問の改造は成功できませんでした。
しかし、答えて頂き感謝しております。サイト運営これからも頑張ってください。