DIGITAL DEVIL SAGA アバタール・チューナー2

キーワード
相対アドレス
復帰
レジスタ


内容
羅刹モード
戦闘中スキルのHPMP消費なし


羅刹モード

このソフトは続編なので前作と同じようなコードは比較的簡単に出来、それに加えラベルから出来るコードが
かなりあります。
クリティカルは"btl:critical=%d%%[raito=%.3f,fix=%d,auto=%d]\n"の参照箇所付近を見ると比較と分岐命令があるので
そこをいじればクリティカル制御が可能。
"btl:〜"の%があるものは見た目そのままの処理と思っていい程コード化出来ます。
羅刹モードもこの"btl:〜"から見つかりました。

こちらの処理を見て下さい

001b3c54 addiu  a0, a0, $4e80      a0="btl:majin=%d%%\n"
001b3c58 lw   a0, $af60(gp)
001b3c5c daddu  s2, zero, zero
001b3c60 daddu  s0, zero, zero
001b3c64 nop
001b3c68 addu  v1, s0, a0
001b3c6c lhu   v0, $0a60(v1)
001b3c70 andi  v0, v0, $0001
001b3c74 andi  v0, v0, $ffff
001b3c78 beq   v0, zero, $001b3c98
001b3c7c addiu  a1, zero, $00f8     a1=$000000f8
001b3c80 addu  a0, a0, s0
001b3c84 jal   $001acc88
001b3c88 addiu  a0, a0, $0a60
001b3c8c bne   v0, zero, $001b3cbc             
001b3c90 addiu  v0, zero, $0001     v0=$00000001
001b3c94 lw   a0, $af60(gp)
001b3c98 addiu  s2, s2, $0001      s2=$00000001
001b3c9c sltiu  v0, s2, $0005
001b3ca0 bne   v0, zero, $001b3c68
001b3ca4 addiu  s0, s0, $01c4      s0=$000001c4
001b3ca8 lw   v0, $0a48(a0)
001b3cac addiu  v0, v0, $0001
001b3cb0 jal   バトルランダム      ▼$00211748
001b3cb4 sw   v0, $0a48(a0)
001b3cb8 sltu  v0, v0, s1

この下はすぐjr raで復帰しています。
バトルランダムは私が他のコードを作る際に勝手にラベルを貼っただけで、初めからあったわけではないので
無視して下さい。
乱数処理の途中(?)の処理で、戦闘中に乱数が使用される際によくここを通っているのでバトルランダムとしています。

"btl:majin=%d%%\n"つまり戦闘:魔人。悪魔か羅刹の事かと推測出来、試しに書き換えると見事に羅刹状態に
なっていました。
この様な処理では復帰直前を見るだけで大体何とかなります。分岐した場合としない場合どの様な違いがあるかを
見る程度でいいです。
sltu つまりv0レジスタには0もしくは1が入る流れですので、青いマークの分岐を必ず分岐させるようにして
v0に1を格納させてみます。
コード化し使用してみると戦闘開始時に羅刹状態になっていました。後はこれをパッドで切り換えることで
ON,OFFにする事が可能。

ついでにこの復帰後はこの様になっています。

001cf8cc jal   $001b3b08                  
001cf8d0 nop
001cf8d4 bnel  v0, zero, $001cf8f8
001cf8d8 addiu  v0, zero, $0003     v0=$00000003
001cf8dc jal   $001b3cd8
001cf8e0 nop
001cf8e4 bne   v0, zero, $001cf8f8
001cf8e8 addiu  v0, zero, $0002     v0=$00000002
001cf8ec beq   zero, zero, $001cf8fc
001cf8f0 sb   zero, $026e(s0)
001cf8f4 nop
001cf8f8 sb   v0, $026e(s0)                

v0が0でなければ3をp$026eにストア。0であれば2または0がストアされる流れになっています。
途中のjalは"btl:surprise=%d%%[level=%d,ratio=%.2f]\n"が処理の復帰前にあり、ここでもslt v0,v0,s2が
復帰直前にあります。
サプライズですから不意打ちされたかどうかの処理ですね。
復帰後アドレス$001cf8e4でまたv0が0でなければ2をp$026eにストア。0であれば0がストアされるようになっています。
この流れからp$026eは戦闘中の羅刹・悪魔・人間のうちどの状態にあるかを判断しているという推測が出来、
実際に0,2,3をストアさせると0=悪魔、2=人間、3=羅刹になりました。
1がないのが気になりますが、1を入れても特に何もならなかったと思います。

このp$026eから羅刹時のコマンド制限解除を作ろうと思い色々と試してみましたが、
見つかった箇所はビットの処理でした。しかし私はビットと浮動小数点がよく解らないので途中で投げ出しています。
残ったのはバカコードの悪魔時に羅刹状態のコマンド制限という逆のもの…

しかし、戦闘中のBGMの処理が見つかりコード化することが出来ましたので、結構満足。
羅刹状態の時にはBGMが変わるので、p$026eがある処理を適当に変えていたら偶然出来ていました(汗

後はランダムで変わるようにしたかったのですが、乱数処理の使い方がわかっていないので
プレイタイム最下位4ビットをロードし、0であれば1を、1〜8であればそのまま格納。
9〜15であれば1/2にして格納するようにしてみました。
BGMは1〜8曲目まであり、プレイタイムは1秒につき30増えます。

戦闘中スキルのHPMP消費なし

現在HPの変動の処理から特定の処理を探し、そこを遡る事でどのスキルのHP消費箇所を探します。
現在HPの変動箇所はここになります。

001199c0 lhu   v0, $0006(a0)                
001199c4 lhu   a2, $0008(a0)
001199c8 addu  v0, v0, a1
001199cc addiu  v1, a0, $0000
001199d0 movn  v0, zero, v1
001199d4 slt   a1, a2, v0
001199d8 movn  v0, a2, a1
001199dc jr   ra
001199e0 sh   v0, $0006(a0)

p$0006が現在値でaddu v0,v0,a1のa1レジスタが変動量です。

ここから遡るので処理の先頭をスペースでマークし、F3を押して参照箇所をみていきます。
どこがスキルの変動処理をしているのか確認をする為に参照箇所のジャンプ命令を潰してゲーム中で
変動しないかどうかを1つずつ確認します。
そうして変動しなかった箇所が$001aa238から始まる処理ですが、ここではa1を設定している箇所ではないので
もう1つ前の参照箇所を見ていきます。その中で怪しい箇所を見て下さい。

001df82c lw   a2, $0004(s1)
001df830 beq   a2, zero, $001df898              
001df834 addiu  v0, zero, $0001     v0=$00000001
001df838 lw   v1, $0008(s1)
001df83c addiu  a1, zero, $0001     a1=$00000001
001df840 lw   a0, $afb0(gp)
001df844 sll   v0, v1, 3
001df848 subu  v0, v0, v1
001df84c sll   v0, v0, 3
001df850 addu  v0, v0, a0
001df854 lbu   a0, $0003(v0)
001df858 beq   a0, a1, $001df870
001df85c addiu  v0, zero, $0002     v0=$00000002
001df860 beq   a0, v0, $001df888
001df864 addiu  v0, zero, $0001     v0=$00000001
001df868 beq   zero, zero, $001df89c
001df86c ld   s0, $0000(sp)
001df870 addiu  a0, s2, $0120
001df874 jal   $001aa238                   
001df878 subu  a1, zero, a2
001df87c beq   zero, zero, $001df898
001df880 addiu  v0, zero, $0001     v0=$00000001
001df884 nop
001df888 addiu  a0, s2, $0120
001df88c jal   $001aa250
001df890 subu  a1, zero, a2

ジャンプ直前のa1レジスタを見るとnegu a1,a2となっています。
a2レジスタのプラスマイナスを反転させてa1に格納するという意味なのでここから上のa2レジスタを見ていきます。
lw a2, $0004(s1)このa2レジスタが変動値のようなのでaddu a2, zero, zeroと変える事で変動量を0へ変更可能。
コードにして使用するとHPMP双方に効果があります。この処理をよく見ると
lbu a0, $0003(v0)のa0レジスタによって2通りのnegu a1,a2があり、上がHP、下がMPの消費の際に通る処理と推測でき、
lbu a0, $0003(v0)のa0レジスタの値をそれぞれ1・2のどちらかに固定する事でHP消費のスキルをMP消費に変える事も可能

戻る