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消費に変える事も可能
戻る