DQ3 PCの情報管理2

前回のエントリの内容を踏まえると、ルイーダ以外でのキャラクターの追加・削除のやりかたが見えてきます。追加時には以下の手順を踏めばいいということになります。

  1. 空いているPC用アドレスを探して必要情報をセット
  2. $7E36E2の数を操作
  3. $7E36E8-の配列に追加したキャラクターのアドレスを挿入して1つずらす

1点注意があり、この操作をミスると登録済みのキャラクターが消えるという最悪のバグが起きることもあるのでテストは十分やるべき、ということです。追加キャラクター用のステータスをハードコードするのもどうかと思ったので新規に「追加キャラクター用ステータス」という固定長データを定義しました。

  • $3EEADE 追加キャラクターステータス(32Byte*5rec)
範囲(Byte)範囲(bit)意味
0-1Byte名前(固定文字列ID)
2Byte0-3bit職業ID
2Byte4bit性別
2-3Byte5-3bit(7bit)性格
3-4Byte4-2bit(7bit)レベル
4-5Byte3-3bit(9bit)
5-6Byte4-4bit(9bit)素早さ
6-7Byte5-5bit(9bit)身の守り
7-8Byte6-6bit(9bit)体力
8-9Byte7-7bit(9bit)賢さ
10-11Byte0-0bit(9bit)運の良さ
11-12Byte1-2bit(10bit)最大HP
12-13Byte3-4bit(10bit)最大MP
14-16Byte初期状態経験値
17Byte装備武器アイテムID
18Byte装備鎧アイテムID
19Byte装備盾アイテムID
20Byte装備兜アイテムID
21Byte装備装飾品アイテムID
22-23Byte呪文習得状態1
24-25Byte呪文習得状態2
26-27Byte呪文習得状態3
28-29Byte呪文習得状態4
30-31Byte呪文習得状態5

これといって特筆するべきこともなく、必要なステータスをベタっと横に並べただけです。アイテムは12個まで持てますが、余り必要性を感じなかったので装備品以外は何も持たない、ということにしました。次に追加用のSRを実装します。

  • SR: $05EE00 追加キャラクターをPC領域に追加(Y=インデックス)(新SR)
05EE00JSL $C41962SR: $041962新規PC追加可能かチェック+追加可能オフセットを返す(可能c=off, 全バンク用)
05EE04BCC #$01if(c==off) goto $05EE07
05EE06RTLreturn
05EE07PHXPush X
05EE08JSL $C90501SR: $090501 引数:1#$00 引数:2#$0020 引数:3#$FEEADE 引数:4#$00構造体アクセス Y番目の先頭アドレスをDP($00,第4引数)にセット
05EE13LDY #$0000Y=#$0000
05EE16LDA $00A=$(DP[$00])+Y
05EE18JSL $C1BA53SR: $01BA53固定文字列開始アドレス取得(オフセットをYにセット)
05EE1CLDX #$0000X=#$0000
05EE1FJSL $C1BACCSR: $01BACC固定文字列デコード+オフセットインクリメント
05EE23SEP #$20m=on(A/M:8b)
05EE25STA $4056,X$4056+X=A
05EE28REP #$20m=off(A/M:16b)
05EE2AINXX++
05EE2BCMP #$00ACA==#$00AC?
05EE2EBNE #$EFif(z==off) goto $05EE1F
05EE30PLXPull X
05EE31JSL $C4195ESR: $04195EPC追加場所を#$00で初期化(全バンク用)
05EE35JSL $C42FD5SR: $042FD5名前変更
05EE39JSL $C41966SR: $041966存在フラグオン(全バンク用)
05EE3DLDA #$0002A=#$0002
05EE40JSL $C42DFASR: $042DFAルイーダの酒場に預けられるかのフラグ変更
05EE44LDY #$000EY=#$000E
05EE47LDA $00A=$(DP[$00])+Y
05EE49STA $0001,X$0001+X=A
05EE4CLDY #$0010Y=#$0010
05EE4FLDA $00A=$(DP[$00])+Y
05EE51AND #$00FFA&=#$00FF
05EE54STA $0003,X$0003+X=A
05EE57LDY #$0002Y=#$0002
05EE5ALDA $00A=$(DP[$00])+Y
05EE5CAND #$000FA&=#$000F
05EE5FSTA $0021,X$0021+X=A
05EE62LDY #$0002Y=#$0002
05EE65LDA $00A=$(DP[$00])+Y
05EE67AND #$0010A&=#$0010
05EE6ABEQ #$06if(z==on) goto $05EE72
05EE6CLDA #$0020A=#$0020
05EE6FSTA $001F,X$001F+X=A
05EE72PEA #$0000Push #$0000
05EE75PEA #$0FE0Push #$0FE0
05EE78PEA #$0002Push #$0002
05EE7BJSL $C90717SR: $090717RAM上情報取得
05EE7FJSL $C42F06SR: $042F06性格変更
05EE83PEA #$0000Push #$0000
05EE86PEA #$07F0Push #$07F0
05EE89PEA #$0003Push #$0003
05EE8CJSL $C90717SR: $090717RAM上情報取得
05EE90JSL $C43021SR: $043021レベル変更
05EE94PEA #$0000Push #$0000
05EE97PEA #$0FF8Push #$0FF8
05EE9APEA #$0004Push #$0004
05EE9DJSL $C90717SR: $090717RAM上情報取得
05EEA1JSL $C43450SR: $043450力変更
05EEA5PEA #$0000Push #$0000
05EEA8PEA #$1FF0Push #$1FF0
05EEABPEA #$0005Push #$0005
05EEAEJSL $C90717SR: $090717RAM上情報取得
05EEB2JSL $C43707SR: $043707素早さ変更
05EEB6PEA #$0000Push #$0000
05EEB9PEA #$3FE0Push #$3FE0
05EEBCPEA #$0006Push #$0006
05EEBFJSL $C90717SR: $090717RAM上情報取得
05EEC3JSL $C41F3BSR: $041F3B身の守り変更
05EEC7PEA #$0000Push #$0000
05EECAPEA #$7FC0Push #$7FC0
05EECDPEA #$0007Push #$0007
05EED0JSL $C90717SR: $090717RAM上情報取得
05EED4JSL $C4358ASR: $04358A体力変更
05EED8PEA #$0000Push #$0000
05EEDBPEA #$FF80Push #$FF80
05EEDEPEA #$0008Push #$0008
05EEE1JSL $C90717SR: $090717RAM上情報取得
05EEE5JSL $C43841SR: $043841賢さ変更
05EEE9PEA #$0000Push #$0000
05EEECPEA #$01FFPush #$01FF
05EEEFPEA #$000APush #$000A
05EEF2JSL $C90717SR: $090717RAM上情報取得
05EEF6JSL $C43988SR: $043988運のよさ変更
05EEFAPEA #$0000Push #$0000
05EEFDPEA #$07FEPush #$07FE
05EF00PEA #$000BPush #$000B
05EF03JSL $C90717SR: $090717RAM上情報取得
05EF07JSL $C43073SR: $043073最大HP変更
05EF0BJSL $C43183SR: $043183現在HP変更
05EF0FPEA #$0000Push #$0000
05EF12PEA #$1FF8Push #$1FF8
05EF15PEA #$000CPush #$000C
05EF18JSL $C90717SR: $090717RAM上情報取得
05EF1CJSL $C43263SR: $043263最大MP変更
05EF20JSL $C43366SR: $043366現在MP変更
05EF24LDA #$0000A=#$0000
05EF27JSL $C43460SR: $043460力小数点部分変更
05EF2BJSL $C43717SR: $043717素早さ小数点部分変更
05EF2FJSL $C42349SR: $042349体力・身の守り小数点部分0セット
05EF33JSL $C43851SR: $043851賢さ小数点部分変更
05EF37JSL $C43998SR: $043998運のよさの小数点部分変更
05EF3BLDY #$0016Y=#$0016
05EF3ELDA $00A=$(DP[$00])+Y
05EF40STA $0024,X$0024+X=A
05EF43LDY #$0018Y=#$0018
05EF46LDA $00A=$(DP[$00])+Y
05EF48STA $0026,X$0026+X=A
05EF4BLDY #$001AY=#$001A
05EF4ELDA $00A=$(DP[$00])+Y
05EF50STA $0028,X$0028+X=A
05EF53LDY #$001CY=#$001C
05EF56LDA $00A=$(DP[$00])+Y
05EF58STA $002A,X$002A+X=A
05EF5BLDY #$001EY=#$001E
05EF5ELDA $00A=$(DP[$00])+Y
05EF60STA $002C,X$002C+X=A
05EF63STZ $40DP($40)=#$00
05EF65LDY #$0011Y=#$0011
05EF68LDA $00A=$(DP[$00])+Y
05EF6AAND #$00FFA&=#$00FF
05EF6DBEQ #$06if(z==on) goto $05EF75
05EF6FJSL $C44777SR: $044777PCにアイテムを持たせる
05EF73INC $40DP($40)++
05EF75LDY #$0012Y=#$0012
05EF78LDA $00A=$(DP[$00])+Y
05EF7AAND #$00FFA&=#$00FF
05EF7DBEQ #$06if(z==on) goto $05EF85
05EF7FJSL $C44777SR: $044777PCにアイテムを持たせる
05EF83INC $40DP($40)++
05EF85LDY #$0013Y=#$0013
05EF88LDA $00A=$(DP[$00])+Y
05EF8AAND #$00FFA&=#$00FF
05EF8DBEQ #$06if(z==on) goto $05EF95
05EF8FJSL $C44777SR: $044777PCにアイテムを持たせる
05EF93INC $40DP($40)++
05EF95LDY #$0014Y=#$0014
05EF98LDA $00A=$(DP[$00])+Y
05EF9AAND #$00FFA&=#$00FF
05EF9DBEQ #$06if(z==on) goto $05EFA5
05EF9FJSL $C44777SR: $044777PCにアイテムを持たせる
05EFA3INC $40DP($40)++
05EFA5LDY #$0015Y=#$0015
05EFA8LDA $00A=$(DP[$00])+Y
05EFAAAND #$00FFA&=#$00FF
05EFADBEQ #$06if(z==on) goto $05EFB5
05EFAFJSL $C44777SR: $044777PCにアイテムを持たせる
05EFB3INC $40DP($40)++
05EFB5LDA $40A=DP($40)
05EFB7PHAPush A
05EFB8LDA #$0000A=#$0000
05EFBBCMP $01,SA>=Stack($01)?
05EFBDBCS #$09if(c==on) goto $05EFC8
05EFBFPHAPush A
05EFC0JSL $C44C67SR: $044C67指定インデックスのアイテムを装備する?
05EFC4PLAPull A
05EFC5INCA++
05EFC6BRA #$F3goto $05EFBB
05EFC8PLAPull A
05EFC9RTLreturn

やたらと長いですが、やっていることは上の固定長データの特定のインデックス(このSRをコールした時点でYレジスタにセットされていることが前提)の値を右から左にせっせとくべているだけです。元は登録所で新規PCを追加する処理をコピーしているだけなのでそれほど難しいことではありません。このSRから戻ってくるとXレジスタに追加したキャラクターの開始アドレスがセットされます。続けてこのキャラクターをパーティに追加するSRを実装します。

  • SR: $05F000 追加キャラクターをパーティに追加する(新SR)
05F000PHAPush A
05F001PHXPush X
05F002CMP #$0000A==#$0000?追加先はパーティ
05F005BNE #$0Dif(z==off) goto $05F014
05F007LDA $36E2A=$36E2
05F00ACMP #$0004A>=#$0004?パーティ人数が4人なら何もしない
05F00DBCS #$54if(c==on) goto $05F063
05F00FINC $36E2$36E2++
05F012BRA #$26goto $05F03A
05F014CMP #$0002A==#$0002?追加先はルイーダ
05F017BNE #$09if(z==off) goto $05F022
05F019INC $36E4$36E4++
05F01CCLCc=off
05F01DADC $36E2A+=($36E2+c)
05F020BRA #$18goto $05F03A
05F022CMP #$0004A==#$0004?
05F025BNE #$3Cif(z==off) goto $05F063
05F027LDA $36E6A=$36E6
05F02ACMP #$0003A>=#$0003?
05F02DBCS #$34if(c==on) goto $05F063
05F02FINC $36E6$36E6++
05F032CLCc=off
05F033ADC $36E2A+=($36E2+c)
05F036CLCc=off
05F037ADC $36E4A+=($36E4+c)
05F03AASLA<<1
05F03BSTA $00DP($00)=A
05F03DLDA #$0000A=#$0000
05F040CLCc=off
05F041ADC $36E2A+=($36E2+c)
05F044CLCc=off
05F045ADC $36E4A+=($36E4+c)
05F048CLCc=off
05F049ADC $36E6A+=($36E6+c)
05F04CASLA<<1
05F04DTAYY=A
05F04ELDA $36E8,YA=$36E8+Y
05F051STA $36EA,Y$36EA+Y=A
05F054DEYY–
05F055DEYY–
05F056CPY $00Y>=DP($00)?
05F058BCS #$F4if(c==on) goto $05F04E
05F05ALDY $00Y=DP($00)
05F05CPLAPull A
05F05DSTA $36E8,Y$36E8+Y=A
05F060SECc=on
05F061PLAPull A
05F062RTLreturn
05F063CLCc=off
05F064PLXPull X
05F065PLAPull A
05F066RTLreturn

Aレジスタには追加先(0:パーティ 2:酒場 4:一時待機)、Xレジスタには追加PCの開始アドレスをセットしていることが前提です。実際使っているのはパーティへの追加だけなので、その他の場合については正しく動作しないかもしれません。やっていることは追加先の最後に追加PCのアドレスをセットし、それ以外の配列の要素を1つずつ後ろにずらす、というものです。実際にこれらのSRをどう使うかを例示します。

  • SR: $0F09AF 呪術師の家イベント処理(新SR)
省略
0F09CBLDY #$0003Y=#$0003呪術師の追加キャラクターID
0F09CEJSL $C5EE00SR: $05EE00追加キャラクターをPC領域に追加(Y=インデックス)
省略
0F09D5LDA #$0000A=#$0000追加先をパーティに指定
0F09D8JSL $C5F000SR: $05F000追加キャラクターをパーティに追加する
省略

呪術師の家イベント処理全体としてはNPCとして表示されている呪術師がパーティの最後尾に移動する処理などがありますが、関係ないので省きます。

コメント

タイトルとURLをコピーしました