DQ3 「みのまもり」を導入する6+登録所の性格決定

今回は身の守りを追加することで登録所の性格決定にどう影響が出るのかについて、今まで解析をしていなかったので真面目にコードを読みながら変更するべき点を調べていくことにします。

  • SR: $03DE95 登録時仲間性格決定?
03DE95PHPPush P Flag
03DE96REP #$30m=off(A/M:16b), x=off(X/Y:16b)
03DE98PHAPush A
03DE99PHXPush X
03DE9APHYPush Y
03DE9BPHBPush DB
03DE9CPEA #$7E7EPush #$7E7E
03DE9FPLBPull DB
03DEA0PLBPull DB
03DEA1STA $2BBC$7E2BBC=A
03DEA4STA $7A$00007A=A
03DEA6JSL $046951SR: $046951 引数:1#$06 引数:2#$7A 引数:3#$FF職業ID取得
03DEADSTA $2BB8$7E2BB8=A
03DEB0JSL $042E19SR: $042E19 引数:1#$06 引数:2#$7A 引数:3#$FF性別取得
03DEB7STA $2BBA$7E2BBA=A
03DEBASTA $4054$7E4054=A
03DEBDJSL $042FEBSR: $042FEB 引数:1#$06 引数:2#$7A 引数:3#$FDレベル取得
03DEC4LDA $2BB8A=$7E2BB8
03DEC7LDX #$0135X=#$0135「職業」中の力の開始アドレス
03DECAJSL $046B9ESR: $046B9E指定パラメーターの新レベルでの理論値を取得
03DECESTA $78$000078=A
03DED0JSL $043414SR: $043414 引数:1#$06 引数:2#$7A 引数:3#$FF力取得
03DED7STA $2BD2$7E2BD2=A
03DEDASECc=on
03DEDBSBC $78A-=$000078新キャラクターの理論値からの差分作成
03DEDDSTA $2BC8$7E2BC8=A
03DEE0LDA #$0000A=#$0000
03DEE3STA $2BBE$7E2BBE=A
03DEE6LDA $2BB8A=$7E2BB8
03DEE9LDX #$0141X=#$0141
03DEECJSL $046B9ESR: $046B9E指定パラメーターの新レベルでの理論値を取得
03DEF0STA $78$000078=A
03DEF2JSL $043644SR: $043644 引数:1#$06 引数:2#$7A 引数:3#$FFステータス画面上の素早さ取得
03DEF9STA $2BD4$7E2BD4=A
03DEFCSECc=on
03DEFDSBC $78A-=$000078新キャラクターの理論値からの差分作成
03DEFFSTA $2BCA$7E2BCA=A
03DF02LDA #$0001A=#$0001
03DF05STA $2BC0$7E2BC0=A
03DF08LDA $2BB8A=$7E2BB8
03DF0BLDX #$014DX=#$014D
03DF0EJSL $046B9ESR: $046B9E指定パラメーターの新レベルでの理論値を取得
03DF12STA $78$000078=A
03DF14JSL $04350CSR: $04350C 引数:1#$06 引数:2#$7A 引数:3#$FFステータス画面上の体力取得
03DF1BSTA $2BD6$7E2BD6=A
03DF1ESECc=on
03DF1FSBC $78A-=$000078新キャラクターの理論値からの差分作成
03DF21STA $2BCC$7E2BCC=A
03DF24LDA #$0002A=#$0002
03DF27STA $2BC2$7E2BC2=A
03DF2ALDA $2BB8A=$7E2BB8
03DF2DLDX #$015BX=#$015B
03DF30JSL $046B9ESR: $046B9E指定パラメーターの新レベルでの理論値を取得
03DF34STA $78$000078=A
03DF36JSL $0437C1SR: $0437C1 引数:1#$06 引数:2#$7A 引数:3#$FFステータス画面上の賢さ取得
03DF3DSTA $2BD8$7E2BD8=A
03DF40SECc=on
03DF41SBC $78A-=$000078新キャラクターの理論値からの差分作成
03DF43STA $2BCE$7E2BCE=A
03DF46LDA #$0003A=#$0003
03DF49STA $2BC4$7E2BC4=A
03DF4CLDA $2BB8A=$7E2BB8
03DF4FLDX #$0167X=#$0167
03DF52JSL $046B9ESR: $046B9E指定パラメーターの新レベルでの理論値を取得
03DF56STA $78$000078=A
03DF58JSL $0438FBSR: $0438FB 引数:1#$06 引数:2#$7A 引数:3#$FFステータス画面上の運のよさ取得
03DF5FSTA $2BDA$7E2BDA=A
03DF62SECc=on
03DF63SBC $78A-=$000078新キャラクターの理論値からの差分作成
03DF65STA $2BD0$7E2BD0=A
03DF68LDA #$0004A=#$0004
03DF6BSTA $2BC6$7E2BC6=A
03DF6EJSR $DF8ESR: $03DF8Eデフォルトから差分の大きいステータスの順に並べ替え
03DF71JSR $DFF9SR: $03DFF9登録所性格決定2ID取得
03DF74JSR $E018SR: $03E018登録所性格決定1ID取得
03DF77JSR $E134SR: $03E134性格決定アクセス
03DF7ALDX $2BB4X=$7E2BB4
03DF7DJSL $042ED6SR: $042ED6 引数:1#$06 引数:2#$FE 引数:3#$FF性格変更
03DF84STA $06,SStack($06)=A
03DF86PLBPull DB
03DF87REP #$30m=off(A/M:16b), x=off(X/Y:16b)
03DF89PLYPull Y
03DF8APLXPull X
03DF8BPLAPull A
03DF8CPLPPull P Flag
03DF8DRTLreturn

まずは、$03DEA1~F6Dまで、何をしているかというと、新キャラクターの種投与後のステータスと、各職業のLv1のステータスとの差分を作成してバッファにセットしています。種を重点的に投与している場合は差分は大きくなり、種を投与していない場合は差分は0となります。$7E2BC8-D1(2*5Byte)に差分、$7E2BD2-DB(2*5Byte)にステータスの絶対値、$7E2BBE-C7(2*5Byte)にインデックス(力:0…運の良さ:4)がセットされます。SR: $03DF8Eは詳細は省きますが、これらの値を差分の大きい順番に並べ替えています(同じ場合は1/2の確率で順番を決定)。ステータスの絶対値、インデックスも差分の並べ替えに対応して並べ替えられます。

  • SR: $03DFF9 登録所性格決定2ID取得
03DFF9LDA $2BBEA=$7E2BBE差分の一番大きいインデックス
03DFFCASLA<<1
03DFFDTAXX=A
03DFFELDA $03E00E,XA=$03E00E+X「職業」の登録所性格決定1IDへのオフセット
03E002TAXX=A
03E003LDA $2BB8A=$7E2BB8
03E006JSL $046AFDSR: $046AFD 引数:1#$FF 引数:2#$FE 引数:3#$FF登録所性格決定1ID取得
03E00DRTSreturn

パッと見何をやっているかよくわかりませんが、$03E00E-1Dに並んでいるのは#$0006, #$0007, #$0008, #$0009, #$000Aです。それを引数にして$03E006でSR: $046AFDをコールして取得しているのは、固定長データ「職業」の6バイト目~10バイト目です。つまり、一番差分の大きいステータスに応じた該当部分の1Byteを取得している、ということになります。

  • SR: $03E018 登録所性格決定1ID取得
03E018TAXX=A
03E019JSL $09050DSR: $09050D 引数:1#$00 引数:2#$000F 引数:3#$C30EFD 引数:4#$78構造体アクセス X番目の先頭アドレスを$00,第4引数にセット
03E024LDY #$0001Y=#$0001
03E027LDA $78,YA=$($000078+Y)
03E029AND #$00FFA&=#$00FFステータス種別
03E02CSTA $7C$00007C=A
03E02ELDY #$0000Y=#$0000
03E031LDA $78,YA=$($000078+Y)
03E033AND #$007FA&=#$007F閾値
03E036STA $7E$00007E=A
03E038LDY #$0000Y=#$0000
03E03BLDA $78,YA=$($000078+Y)
03E03DAND #$0080A&=#$0080
03E040BNE #$0Eif(z==off) goto $03E050
03E042JSR $E11ASR: $03E11A指定したステータスが閾値を超えているか(該当c=on)
03E045BCC #$0Eif(c==off) goto $03E055
03E047LDY #$0002Y=#$0002
03E04ALDA $78,YA=$($000078+Y)
03E04CAND #$00FFA&=#$00FF登録所性格決定1のID
03E04FRTSreturn
03E050JSR $E12ESR: $03E12E2番目に差分の多いステータスが一致しているか(該当z=on)
03E053BEQ #$F2if(z==on) goto $03E047
以下略

  • SR: $03E11A 指定したステータスが閾値を超えているか(該当c=on)
03E11ALDX #$000AX=#$000A
03E11DDEXX–
03E11EDEXX–
03E11FBEQ #$07if(z==on) goto $03E128
03E121LDA $2BBE,XA=$7E2BBE+Xステータスのインデックス
03E124CMP $7CA==$00007C?
03E126BNE #$F5if(z==off) goto $03E11D
03E128LDA $2BC8,XA=$7E2BC8+X
03E12BCMP $7EA==or>=$00007E?
03E12DRTSreturn
  • SR: $03E12E 2番目に差分の多いステータスが一致しているか(該当z=on)
03E12ELDA $2BC0A=$7E2BC02番目に差分の多いステータスのインデックス取得
03E131CMP $7CA==or>=$00007C?
03E133RTSreturn

  • SR: $03E134 登録所性格決定
03E134TAXX=A
03E135JSL $09050DSR: $09050D 引数:1#$00 引数:2#$000C 引数:3#$C30FFC 引数:4#$78構造体アクセス X番目の先頭アドレスを$00,第4引数にセット
03E140STZ $2BBE$7E2BBE=#$00
03E143STZ $2BC0$7E2BC0=#$00
03E146LDX #$000EX=#$000E
03E149STZ $2BC2,X$7E2BC2+X=#$00
03E14CSTZ $2BD2,X$7E2BD2+X=#$00
03E14FDEXX–
03E150DEXX–
03E151BPL #$F6if(n==off) goto $03E149
03E153LDY #$0004Y=#$0004
03E156LDA $78,YA=$($000078+Y)
03E158AND #$00FFA&=#$00FF
03E15BSTA $2BC2$7E2BC2=A
03E15ELDY #$0005Y=#$0005
03E161LDA $78,YA=$($000078+Y)
03E163AND #$00FFA&=#$00FF
03E166STA $2BC4$7E2BC4=A
03E169LDY #$0006Y=#$0006
03E16CLDA $78,YA=$($000078+Y)
03E16EAND #$00FFA&=#$00FF
03E171STA $2BC6$7E2BC6=A
03E174LDY #$0007Y=#$0007
03E177LDA $78,YA=$($000078+Y)
03E179AND #$00FFA&=#$00FF
03E17CSTA $2BC8$7E2BC8=A
03E17FLDY #$0008Y=#$0008
03E182LDA $78,YA=$($000078+Y)
03E184AND #$00FFA&=#$00FF
03E187STA $2BCA$7E2BCA=A
03E18ALDY #$0009Y=#$0009
03E18DLDA $78,YA=$($000078+Y)
03E18FAND #$00FFA&=#$00FF
03E192STA $2BCC$7E2BCC=A
03E195LDY #$000AY=#$000A
03E198LDA $78,YA=$($000078+Y)
03E19AAND #$00FFA&=#$00FF
03E19DSTA $2BCE$7E2BCE=A
03E1A0LDY #$000BY=#$000B
03E1A3LDA $78,YA=$($000078+Y)
03E1A5AND #$00FFA&=#$00FF
03E1A8STA $2BD0$7E2BD0=A
03E1ABPEA #$0078Push #$0078
03E1AEPEA #$000FPush #$000F
03E1B1PEA #$0000Push #$0000
03E1B4JSL $090717SR: $090717構造体アクセス
03E1B8STA $2BD2$7E2BD2=A
03E1BBPEA #$0078Push #$0078
03E1BEPEA #$00F0Push #$00F0
03E1C1PEA #$0000Push #$0000
03E1C4JSL $090717SR: $090717構造体アクセス
03E1C8STA $2BD4$7E2BD4=A
03E1CBPEA #$0078Push #$0078
03E1CEPEA #$000FPush #$000F
03E1D1PEA #$0001Push #$0001
03E1D4JSL $090717SR: $090717構造体アクセス
03E1D8STA $2BD6$7E2BD6=A
03E1DBPEA #$0078Push #$0078
03E1DEPEA #$00F0Push #$00F0
03E1E1PEA #$0001Push #$0001
03E1E4JSL $090717SR: $090717構造体アクセス
03E1E8STA $2BD8$7E2BD8=A
03E1EBPEA #$0078Push #$0078
03E1EEPEA #$000FPush #$000F
03E1F1PEA #$0002Push #$0002
03E1F4JSL $090717SR: $090717構造体アクセス
03E1F8STA $2BDA$7E2BDA=A
03E1FBPEA #$0078Push #$0078
03E1FEPEA #$00F0Push #$00F0
03E201PEA #$0002Push #$0002
03E204JSL $090717SR: $090717構造体アクセス
03E208STA $2BDC$7E2BDC=A
03E20BPEA #$0078Push #$0078
03E20EPEA #$000FPush #$000F
03E211PEA #$0003Push #$0003
03E214JSL $090717SR: $090717構造体アクセス
03E218STA $2BDE$7E2BDE=A
03E21BPEA #$0078Push #$0078
03E21EPEA #$00F0Push #$00F0
03E221PEA #$0003Push #$0003
03E224JSL $090717SR: $090717構造体アクセス
03E228STA $2BE0$7E2BE0=A
03E22BLDA $2BBAA=$7E2BBA
03E22ECMP #$0001A==#$0001?性別が女か
03E231BEQ #$33if(z==on) goto $03E266
03E233LDX #$0000X=#$0000
03E236LDA $2BC2,XA=$7E2BC2+X
03E239BEQ #$25if(z==on) goto $03E260
03E23BJSL $046BEDSR: $046BED 引数:1#$FF 引数:2#$FF性格の男女専用情報を取得?
03E241CMP #$0002A==#$0002?女専用なら潰す
03E244BNE #$06if(z==off) goto $03E24C
03E246JSR $E2B4SR: $03E2B4性別に応じて使用できない性格を潰す
03E249JMP $E236goto $03E236
03E24CLDA $2BD2,XA=$7E2BD2+X
03E24FCLCc=off
03E250ADC $2BC0A+=$7E2BC0
03E253STA $2BC0$7E2BC0=A
03E256STA $2BD2,X$7E2BD2+X=A
03E259INXX++
03E25AINXX++
03E25BCPX #$0010X>=#$0010 ?
03E25EBCC #$D6if(c==off) goto $03E236
03E260STX $2BBE$7E2BBE=X
03E263JMP $E296goto $03E296
03E266LDX #$0000X=#$0000
03E269LDA $2BC2,XA=$7E2BC2+X
03E26CBEQ #$25if(z==on) goto $03E293
03E26EJSL $046BEDSR: $046BED 引数:1#$FF 引数:2#$FF性格の男女専用情報を取得?
03E274CMP #$0001A==#$0001?男専用なら潰す
03E277BNE #$06if(z==off) goto $03E27F
03E279JSR $E2B4SR: $03E2B4性別に応じて使用できない性格を潰す
03E27CJMP $E269goto $03E269
03E27FLDA $2BD2,XA=$7E2BD2+X
03E282CLCc=off
03E283ADC $2BC0A+=$7E2BC0
03E286STA $2BC0$7E2BC0=A
03E289STA $2BD2,X$7E2BD2+X=A
03E28CINXX++
03E28DINXX++
03E28ECPX #$0010X>=#$0010 ?
03E291BCC #$D6if(c==off) goto $03E269
03E293STX $2BBE$7E2BBE=X
03E296LDA $2BC0A=$7E2BC0
03E299DECA–
03E29AJSL $00135FSR: $00135F乱数発生 00-A A(2B)
03E29ELDX #$0000X=#$0000
03E2A1CMP $2BD2,XA>=$7E2BD2+X?
03E2A4BCC #$0Aif(c==off) goto $03E2B0
03E2A6INXX++
03E2A7INXX++
03E2A8CPX $2BBEX>=$7E2BBE?
03E2ABBCC #$F4if(c==off) goto $03E2A1
03E2ADLDX #$0000X=#$0000
03E2B0LDA $2BC2,XA=$7E2BC2+X
03E2B3RTSreturn

やたらと長いですが、やっていることは例によって幅の異なるルーレットを回すことです。こうしてみると、登録所の性格決定は種投与の結果、同じステータス値になったとしても、その後の処理によってかなり確率に左右される、ということがわかります。勇者の性格はオープニングの質問の答え方によってかなり確定的に決まるのとは対照的です。性格決定のプロセスの手間の違いなんでしょうか(登録所のキャラクターメイクは短時間でできるのでリトライが簡単)。また、初期の性格決定では職業ごとに取り得る性格もある程度限定されていることがわかります。細かく見ていくのは時間がかかるので省略しますが、女戦士がセクシーギャルになることはありません(男戦士がむっつりスケベになることはある)。この決定プロセスを積極的に変更する気にはなりませんが、問題はむしろ種投与による仲間キャラクターの過度なドーピングが可能な点です。例えば、僧侶に賢さの種を重点的に投与することで、Lv2になった時点で40以上のMPを確保することができるわけで、FC版のときのようにアリアハン大陸を出るにあたりホイミ用のMP切れになる恐れが大幅に低下します(ふくろもあるのでアイテム切れになる心配もない)。アリアハン脱出の道中はおばけありくいやアルミラージに恐れおののきながら長丁場の洞窟を進んでいくのが楽しかったわけで、なんとかならないかなあと思考停止しながら今回は終りにします。

コメント

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