前回までで、登録中にスタートボタンを押した時にのみ反応するようにできたので、残りはコアの処理の実装です。方針として、プリセット名前用の固定文字列IDの配列を用意しておき、ランダムで選ばれたインデックスの名前をデコードして名前入力用のバッファ($7E3310-)にセットしてやる、とします。配列の要素数は128個(そんなにいらないとは思いますが)用意しておきます。
- SR? $03FE3D 登録中にスタートボタンを押した時の処理(新SR)
03FE3D | JSL $CF5049 | SR: $0F5049 | |
---|---|---|---|
03FE41 | CLC | c=off | |
03FE42 | RTL | return |
- SR: $0F5049 登録中にスタートボタンを押した時の処理(新SR)
0F5049 | JSR $507D | SR: $0F507D | 登録所名前用バッファクリア |
---|---|---|---|
0F504C | JSR $5096 | SR: $0F5096 | 登録所用名前を選択 |
0F504F | JSL $C1BA53 | SR: $01BA53 | 固定文字列開始アドレス取得(オフセットをYにセット) |
0F5053 | LDX #$0000 | X=#$0000 | |
0F5056 | JSL $C1BAD3 | SR: $01BAD3 | 1Byte文字コード濁音半濁音→清音変換? |
0F505A | CMP #$00AC | A==#$00AC? | |
0F505D | BEQ #$0C | if(z==on) goto $0F506B | |
0F505F | STA $3310,X | $3310+X=A | |
0F5062 | INX | X++ | |
0F5063 | INX | X++ | |
0F5064 | CPX #$0008 | X>=#$0008? | |
0F5067 | BCS #$02 | if(c==on) goto $0F506B | |
0F5069 | BRA #$EB | goto $0F5056 | |
0F506B | CPX #$0008 | X>=#$0008? | |
0F506E | BCC #$03 | if(c==off) goto $0F5073 | |
0F5070 | LDX #$0006 | X=#$0006 | |
0F5073 | STX $3306 | $3306=X | |
0F5076 | LDA #$0034 | A=#$0034 | カーソルを「終わり」に飛ばす |
0F5079 | JMP $0334A6 | goto $0334A6 |
- SR: $0F507D 登録所名前用バッファクリア(新SR)(省略)
- SR: $0F5096 登録所用名前を選択(新SR)
0F5096 | LDA #$003F | A=#$003F | 0-63から選ぶ |
---|---|---|---|
0F5099 | JSL $C0133E | SR: $00133E | 乱数発生 00-A A(1B) |
0F509D | ASL | A<<1 | |
0F509E | TAX | X=A | |
0F509F | LDA $CF5100,X | A=$0F5100+X | プリセット名前用固定文字列リストからIDを取得 |
0F50A3 | RTS | return |
ここでのポイントはSR: $01BA53です。Aレジスタの値を固定文字列IDとして引数に取り、DP[$BA]に開始アドレス、Yレジスタに開始アドレスからのオフセットをセットして返してきます。固定文字列IDの開始アドレス情報は8つに1つなので、ターゲットの固定文字列IDの開始位置を探してオフセットとして返してくる、ということのようです。というわけで、正しくデコードするにはYレジスタの値も使用する必要があるということに注意しないといけません。あとは、濁音・半濁音の場合も考慮して専用のデコードSR: $01BAD3を呼べばOKです。すぐそばにSR: $01BACCがありますが、これを使うと濁音・半濁音の文字をセットするとバグります。
さて、肝心のプリセットの名前ですが、DQ4,7の移民の名前から38個、ルイーダの酒場に最初からいるキャラクターの名前12個、あとはFFT(TOと兼用)の汎用キャラの名前候補から14個もらってきて全部で64個セットしてあります。偏らないように男女ペアを1セットにしています。あくまで「候補」で決定しているわけではないので、気に入らなければその場で変えてもらえばいいかなということで割と適当です。というわけで名前リストはこちら。順番は自分が追加していった順番なので特に意味はありません。
00 | ロナルド | ※DQ4,7の移民の名前 |
---|---|---|
01 | リニア | |
02 | シュンク | |
03 | ニキータ | |
04 | ケネス | |
05 | フィオナ | |
06 | ブラーノ | |
07 | モニカ | |
08 | レオン | |
09 | ゾフィー | |
0A | ゲオルグ | |
0B | ビビアン | |
0C | ゾット | |
0D | ビアナ | |
0E | ロビン | |
0F | リンダ | |
10 | アッシュ | |
11 | リリー | |
12 | バーキン | |
13 | セーラ | |
14 | アキム | |
15 | ベラ | |
16 | マックス | |
17 | ステラ | |
18 | ハンス | |
19 | マロン | |
1A | ゴン | |
1B | ミルキー | |
1C | ナハトム | |
1D | ユリア | |
1E | アラン | |
1F | ノエル | |
20 | デービス | |
21 | カレン | |
22 | ボイド | |
23 | ブレンダ | |
24 | ノイマン | |
25 | アンナ | |
26 | ライアス | ※ここからDQ3のルイーダにいる仲間の名前 |
27 | ネルソン | |
28 | エルロイ | |
29 | ミザリー | |
2A | サマンサ | |
2B | ローザ | |
2C | ベティ | |
2D | ドロシー | |
2E | エルシト | |
2F | ニコライ | |
30 | ピエール | |
31 | マゴット | |
32 | オニール | ※ここからFFT(TO)の汎用キャラの名前 |
33 | オリーブ | |
34 | ケイン | |
35 | ケイシー | |
36 | セルジュ | |
37 | シルキィ | |
38 | ディロン | |
39 | ドリス | |
3A | ノックス | |
3B | ナタリー | |
3C | ヒューゴ | |
3D | ベロニカ | |
3E | モリスン | |
3F | ミスティ |
というわけで完成するとこのようになります。以前に載せたものと同じ。
コメント
これって$03DAEB 登録所メインの省略されてるところに
けっこう改造ポイント隠れてますよね。
新規に入れたと思われるSRの部分がほとんど省略されてる。
今見ているところですが、追いきれない^^;
>登録所メインで行なっている変更は盗賊の登録所とアリアハンの登録所の台詞を切り替えるためだけの処理で、今回の変更とは無関係です。表示するメッセージが違うだけでやっていることは基本全部同じです。詳細は「登録所変更」タグのエントリを見て下さい。
ああ、なるほど。だから省略されてたんですね。
てことはもし自動入力だけを導入したい場合は
省略された部分は変えなくていいってことでしょうか?
そうです。
う~ん、そのままやってみたものの、「ぼうけんする」を
選んだ段階でフリーズしますね。
もう一度見直すか・・・
だめだ とりあえずスタートボタンを押して名前が出てくるところまでは来たけど、
名前が表示されなかったり「J」とかあり得ないのが入力されたりします。
ここまで出来てる以上、$0F5096のところ以外間違いはないと思うのですが、違うところが見当たらない・・・
もちろん文字列のリスト(F5100)も見直しましたがおかしいところはなし。
他に間違ってるポイントはあり得るのでしょうか?
ここの処理のポイントは「固定文字列IDから文字1文字1文字を正しくデコードできるか」です。濁音、半濁音を含んだ固定文字列をランダムでなく固定で指定して正しく1文字1文字読めているか$0F504F-6B当たりをデバッガで追うしかないでしょう。こちらから言えるのは以上です。
う~ん、テスト兼ねて名前も完全コピーさせてもらったのですが
ロビンまではちゃんと表示できるので
そのあたりは問題ないと思うんですがね・・・
とにかくやってみます。