ステラデウス

キーワード
相対アドレス
パッドコード
ワークコード


内容
ステータス・スキル
パッドコード
セーブデータ(スキル)


ステータス・スキル

はじめは最大値検索でステータスMAX
この後はセーブデータを参考にしようとしましたが、暗号化されていて手が出せない状態でした
しかし590◆k85oNvxc62さんから暗号化・復号化のコードを教えて頂いて
セーブデータを参考に出来る様になりました
詳しくはbenaturalさんのMainBBSを参照して下さい

相対アドレス セーブアドレス 効果
$0038 $0860 クラス
$0044 $086C LV
$0048 $0870 EXP
$004C $0874 現HP
$0050 $0878 現MP
$0054 $087C AP
$0058 $0880 SP
$005C $0884 最HP
$0060 $0888 最MP
$00D4 $08FC サポートSKILL1つ目
SP最大の処理の復帰(jr ra)をジャンプ(j)に変えて空き領域へ。
参考として私の場合よく$000f7000を使用しています
あとは相対アドレスを利用してEXP,HP,MP,APを追加してEXP,100,HP・MP全回復,
AP100,サポートSKILL1つ目連係『轟』装備を作りました
SPのストアはsw v1, $0058(a0)ですので空き領域には

EXP100の場合
addiu t7,zero,$0064
sw t7,$0048(a0)
APも同じでストアの相対アドレスを変えるだけです

HP・MP全回復の場合
HP
lw t7,$005c(a0)
sw t7,$004c(a0)
MP
lw t7,$0060(a0)
sw t7,$0050(a0)
回復コードは上記の様に最大値をロードし、その数値を現在値にストアする事で出来ます

サポートSKILL1つ目連係『轟』装備の場合
addiu t3,zero,$00de
sw t3,$00d4(a0)
セーブデータから轟の数値が$00deであると分かったので$00deをストア。

パッドコード

私はこのソフトに対応したライブラリソフトを所持していなく、padinfoを移植できませんでした
ですので当初は諦めていましたがAP関係のコードが敵にも反映していた為、
パッドコードを使用しなくては意味がありません。その後考えた結果パッド判定をしている箇所を見つけられたら
パッドアドレスが分かるかもしれない…と思い、試しに探してみました

パッド判定はandiと分岐命令で処理している事が多いので、その辺りから探します
パッド情報はプラス形式の場合

0001 L2 SELECT
0002 R2 L3
0004 L1 R3
0008 R1 START
0010
0020
0040 ×
0080
0100 SELECT L2
0200 R2 L3
0400 R3 L1
0800 START R1
1000
2000
4000 ×
8000
ですからこの中から検索してもヒットしにくそうな数値を16bit検索します

試しに$4000で検索しましたがあまりうまくいきません

上の場合は失敗したので今度は40で検索してみました、するとそれらしいものが多数ありました
その一例として

00106f80 lbu   v1, $0188(a0)
00106f84 nor   v1, v1, zero
00106f88 andi  v1, v1, $00ff
00106f8c andi  a1, v1, $0001
00106f90 bne   a1, zero, $00107068
00106f94 nop
00106f98 andi  a1, v1, $0002
00106f9c bne   a1, zero, $00107078
00106fa0 nop
00106fa4 andi  a1, v1, $0004
00106fa8 bne   a1, zero, $00107088
00106fac nop
00106fb0 andi  a1, v1, $0008
00106fb4 bne   a1, zero, $00107098
00106fb8 nop
00106fbc andi  a1, v1, $0010            
00106fc0 bne   a1, zero, $001070a8
00106fc4 nop
00106fc8 andi  a1, v1, $0020            
00106fcc bne   a1, zero, $001070b8
00106fd0 nop
00106fd4 andi  a1, v1, $0040
00106fd8 bne   a1, zero, $001070c8
00106fdc nop
00106fe0 andi  v1, v1, $0080
00106fe4 bne   v1, zero, $001070d8
00106fe8 nop
00106fec lbu   v1, $0189(a0)
00106ff0 nor   v1, v1, zero
00106ff4 andi  a2, v1, $00ff
00106ff8 andi  v1, a2, $0001
00106ffc bne   v1, zero, $001070e8
00107000 nop
00107004 andi  v1, a2, $0002
00107008 bne   v1, zero, $001070f8

どうやらハーフワードではなくバイトで判定しているようです
試しに青いバーの箇所と灰色のバーの箇所を次の様に書き換えてみました

00106fbc andi  a1, v1, $0020            
00106fc0 bne   a1, zero, $001070a8
00106fc4 nop
00106fc8 andi  a1, v1, $0010            
00106fcc bne   a1, zero, $001070b8

すると上、右ボタンの操作が不能になりました
何カ所かで同様の判定をしているのかもしれませんが今回はとりあえず

lbu v1, $0188(a0)
lbu v1, $0189(a0)

でパッド判定している事が分かったので後は(a0)の値さえ分かればパッドコードが出来るはずです

具体的にはこの処理中から空きメモリにジャンプ。

00106f80 jal   $000f7000              
00106f84 lbu   v1, $0188(a0)
00106f88 andi  v1, v1, $00ff
00106f8c andi  a1, v1, $0001
00106f90 bne   a1, zero, $00107068

590◆k85oNvxc62さん作成の所持金のワークコードのアドレスを
使用してa0レジスタの値を所持金に表示させます。
↓は実際とは違うアドレスです。

000f7000 nor   v1, v1, zero            
000f7004 lui   t0, $0079        t0=$00790000
000f7008 sw   a0, $9abc(t0)      [00789abc]
000f700c jr   ra

結果
2811200
と表示されましたので16進数に変換
002AE540
そうしてlbu v1, $0188(a0) の188hを足します
002AE6C8
後はこれをDコードに変えて終わりですが

00106f80 lbu   v1, $0188(a0)            
00106f84 nor   v1, v1, zero
00106f88 andi  v1, v1, $00ff
00106f8c andi  a1, v1, $0001
00106f90 bne   a1, zero, $00107068

ロードした値をzeroでnorつまり反転させた後andi v1, v1, $00ff でバイトデータ000000xxへと変換しています
という事はマイナス形式でロードした後、プラス形式の様に変更しています
その為先ほどのコードはマイナス形式のパッドコードであるという事です

結果パッドコードマイナス形式(復号化状態)は
D02AE6C8
である事が分かりました。

セーブデータ(スキル)

セーブアドレス 効果
$0920 アタックスキルカウント
$0924 アタックスキル種類1個目
$0928 アタックスキルフラグ1個目
$0A3C アタックスキル種類36個目
$0A40 アタックスキルフラグ36個目
$0A44 サポートスキルカウント
$0A48 サポートスキル種類1個目
$0A4C サポートスキルフラグ1個目
$0D10 サポートスキル種類90個目
$0D14 サポートスキルフラグ90個目
Ezスキルは省略します。
これは主人公のものですが、スキルを習得させるコードを作るのはかなり面倒です
まずカウントで習得する種類の数を設定し、スキルの種類を設定してそのスキルのフラグ$0001を
入力しなければなりません
スキルの数値も調べなくてはいけませんし、アタック・サポートスキルの全種類の個数が36・90を
超えているのであれば自分で種類を選ばなければなりません
没データもあるでしょうから恐らく超えていると思われます
コードを作っても説明をし難い為、コードを作る事は諦めました

戻る