GBAFE逆汗講座 四


みなさんこんにちは。もしくは、はじめまして。
多分お久しぶりです。最後がいつなのかをもう忘れました。


こんにちは。ご無沙汰しております。
先生、忘れたということはかなりの期間が経ったという意味ですよ。


最後が補講でしたっけ? この講座の番号も忘れましたよ。
四ですよ、四。後参なみに不吉ですね。


つまらないネタはやめてください。ちなみに最後の出番はアニメ移植の講座でした。
よくもまだ飽きずにこんな事やってますね。


サイト移して一年経たずに消える訳ないじゃないですか、流石に。


そうはいっても、こちらに移ってから我々が登場していませんでした。なので黒歴史扱いになったかと納得していたのですけれどね。避けられるように移行も進んでいませんから。


いや、それはですね。大して需要のない逆汗講座だから移行していないというのもありますけど、わたし達のアイコンが法に触れてるんじゃないかと思ってちょっと躊躇してただけです。


…このサイト内容でそんなこと気にしていたんですか?


でも大手攻略サイトがどうどうとゲーム内の文章をコピーしたりしているのを考えたらバカバカしくなって気にしなくなりました。


それ別に許されてるわけじゃありませんよね。


この画像の権利は任天堂およびインテリジェントシステムズに帰属しており、明確にも暗黙にも許可をいただかずに、私的目的で使用しております。なので画像転用の求めなどに応じることはできませんのでご了承下さい。


この場で表明する文言ではないですね。
問題になるかどうかは権利者しだいなので、攻略サイトなら大目にみられても、このサイトはコンテンツの導線効果で的にされますよ。


何か問題があったら、問題あるコンテンツないコンテンツ関係なく全てを捨てて逐電する気でいます。
今日あるものが明日もあると思うんじゃないぞ、お兄さんとの約束だ。


ちなみに本講は一応「四」という位置づけですが、別に続き物では無いし壱はリメイクされていて見る価値が無かったりで、気にする必要はそんなにありません。


新スキルの追加


さて今回は新スキル追加ということで、聖魔に「鳴動」をつけようと思います。


…また地味なチョイスですね。
発動条件付きなのに、かすったみたいな追加ダメージを与える方ですか?それとも発動=確殺の方ですか?


ええと…今回は体格をそのまま追加ダメージにします。
それに別に「鳴動」のチョイスに大した意味はないのでしてね。言い換えるなら、ダメージ増加系スキルの増設です。


“増設”という事は元からある、と遠まわしに言ってるという意味でしょうか。


そうです。ダメージ増加系スキルとは「貫通」です。例の聖魔専用スキルであるところの。それは置いといて、効果は敵の守備をゼロにする事でダメージアップするスキルです。


敵の守備をゼロ、というのもなかなか曲者かもしれません。言葉遊びではありませんが、敵の守備をゼロにするのは、攻撃力に敵の守備を加算するのと、表面上は変わりません。
逆汗する時はそんな可能性にも気をつける必要があります。


今回の作業を簡潔にまとめると、貫通が使えるクラスを増やす+αです。
αの部分にはクラスによって使う計算式を変える作業が代入されます。


戦闘中に発動するスキルは映えますね。どうせ聖魔を改造するならスキルエフェクトを利用するものにしたいですから。


しかもそれでいて、たかが計算式を変えるだけなので、起こるバグもダメージが変だとか、スキルが発動しないくらいなので、わたしが楽です。


久々なので発言がたるみきってますね。…失礼、いつもでした。


もっと失礼になってますが。


オリジナルの処理を探す


ではまずは当然、貫通の処理がどこであるかを探さないといけませんね。


ここを調べるのに時間がかかります。やるとするなら、クラスIDにブレイクポイントを仕掛ける…などでしょうか。


しかし、貫通を発動させるクラスの指定はとっくの昔に周知の情報なので、調べるまでもありません。

<<貫通>>
0802B21A:[24] 28 01 D0 [23] 28 13 D1

だ、そうです。お手持ちの逆汗ファイルを開いて、近辺を探しましょう。

0802b1e8 b530 push {r4, r5, lr}
0802b1ea 1c02 mov r2, r0 (add r2, r0, #0)
0802b1ec 4d18 ldr r5, [pc, #60] ($0002b250)
0802b1ee 6828 ldr r0, [r5, #0]
0802b1f0 6800 ldr r0, [r0, #0]
0802b1f2 0340 lsl r0, r0, #13
0802b1f4 0b41 lsr r1, r0, #13
0802b1f6 2080 mov r0, #80
0802b1f8 01c0 lsl r0, r0, #7
0802b1fa 4008 and r0, r1
0802b1fc 2800 cmp r0, #0
0802b1fe d124 bne $0002b24a
0802b200 2480 mov r4, #80
0802b202 0264 lsl r4, r4, #9
0802b204 1c08 mov r0, r1 (add r0, r1, #0)
0802b206 4020 and r0, r4
0802b208 2800 cmp r0, #0
0802b20a d11e bne $0002b24a
0802b20c 2080 mov r0, #80
0802b20e 0200 lsl r0, r0, #8
0802b210 4001 and r1, r0
0802b212 2900 cmp r1, #0
0802b214 d119 bne $0002b24a
0802b216 6850 ldr r0, [r2, #4]
0802b218 7900 ldrb r0, [r0, #4]
0802b21a 2824 cmp r0, #0x24 ;ワイバーンナイト
0802b21c dc15 bgt $0002b24a
0802b21e 2823 cmp r0, #0x23 ;ワイバーンナイト
0802b220 db13 blt $0002b24a
0802b222 2008 mov r0, #8
0802b224 5610 ldsb r0, [r2, r0]
0802b226 0400 lsl r0, r0, #16
0802b228 0c00 lsr r0, r0, #16
0802b22a 2100 mov r1, #0
0802b22c f7ff f930 bl $0002a490
0802b230 0600 lsl r0, r0, #24
0802b232 1600 asr r0, r0, #24
0802b234 2801 cmp r0, #1
0802b236 d108 bne $0002b24a
0802b238 682b ldr r3, [r5, #0]
0802b23a 681a ldr r2, [r3, #0]
0802b23c 0351 lsl r1, r2, #13
0802b23e 0b49 lsr r1, r1, #13
0802b240 4321 orr r1, r4
0802b242 4804 ldr r0, [pc, #16] ($0002b254)
0802b244 4010 and r0, r2
0802b246 4308 orr r0, r1
0802b248 6018 str r0, [r3, #0]
0802b24a bc30 pop {r4, r5}
0802b24c bc01 pop {r0}
0802b24e 4700 bx r0
0802b250 a604 0203
0802b254 0000 fff8


さてこれが「貫通」の全貌…といいたいのですが全貌ではありません。
この処理をざっと解説すると、貫通発動不可判定、貫通発動クラス判定、貫通発動乱数判定、という流れです。何が言いたいかというと、計算式の変更はここではやっていません。


処理が分かれている場合は、処理の最後に「貫通」発動のフラグを立ててメモリに書き込んでいるので、そこのメモリにブレイクポイントを仕掛けて追うのが普通の流れになります。


まあ「貫通」の計算式の変更もわざわざ調べるまでもなく、(ここのサイトですが)公開されてるので別に調べるまでもないです。なのでさっさと紹介しておきます。

・貫通を防御半減に
0002b3e8:00 24 > 64 10


さて。ではダメージ増加スキルの増設にあたって、どんな処理にすれば良いでしょうか?
貫通を潰してしまうのが一番楽なのですが、両立させる方向でいきます。もちろん、別に正解はありません。自由ですよ。
むしろ正解があってくれれば、それを教えるだけなので楽なのですけれど。


わたしがやっている流れは以下のようになります。

・とりあえず、鳴動だろうと貫通フラグを立てる
・計算式変更の処理でさらにクラス毎に分岐し、違う計算式を使う

こうやっています。どう変えればこれを実現できそうかを是非自分で考えて欲しいのですけれど、ここを自由にすると解説することがなくなるので固定です。


なお、分岐条件は奥義の書とか空きメモリではなく、クラスで分岐させるつもりです。入門なので他には触れません。
特に奥義の書となると、空きメモリの管理や書システムの追加にまで発展しますから。

スキル発動クラスの増設


それではまずは処理を理解していきましょうか。
最初に通るのは貫通発動不可の処理ですが、それは無視して、「0802b216~」からです。


ldr r0, [r2, #4]
ldrb r0, [r0, #4]

ここでなにかを読み込んでますが…


cmp r0, #0x24 ;ワイバーンナイト
bgt $0002b24a
cmp r0, #0x23 ;ワイバーンナイト
blt $0002b24a

これが続いているので、読み込んだr0はクラスIDでほぼ確定です。
0x24より大きいIDと、0x23より小さいIDは、0002b24aへジャンプ(不発)します。つまりジャンプしなければ、貫通の発動判定へ移るのでしょう。


ldr r0, [r2, #4]
ldrb r0, [r0, #4]

これはクラスIDを読み込むときの、お決まりの流れです。(r2はその時々によってr4だったりr6だったりします)
こんな感じの処理で、なんだかクラスIDっぽい雰囲気を感じたら間違いなく、r0はクラスIDで読み込み元のレジスタ(今回はr2)にはステータスのベースアドレスがあります。


ということでr2はステータスのベースアドレスで確定でしょう。ベースアドレスが分かれば色々できます。
とりあえず、ジャンプしない場合(乱数判定へ)の先を見ましょう。


0802b222 2008 mov r0, #8
0802b224 5610 ldsb r0, [r2, r0]


端折りますが、これが発動率です。
r2のアドレスから数えて8番目の値を読み込んでいる命令ですね。


8番目の値の正体は、下のアドレスから聖魔のデータを見て調べましょう。
ベースアドレスから得られる情報がまとまっています。

https://docs.google.com/spreadsheets/d/1_VB6h3AX1po_C-cCIzyBY3Fup96IRz2iOu1F2k9ImzM/edit#gid=0

分かりましたか?
8番目の値はレベルです。例えば、”技”にしたければmov r0, #21にすれば良いだけです。


話が逸れましたね。じゃあクラス追加をしていきましょう。
空き領域に飛ばすのでこんな感じですね。


ldr r3, =$09000000
mov pc, r3


面倒くさい人用にバイナリ変換しておきます。


0802b218 > 00 4B 9F 46 00 00 00 09

それでは空き領域の先で処理を追加します。


ldr r0, [r2, #4]
ldrb r0, [r0, #4]
cmp r0, #0x24 ;ワイバーンナイト
bgt $0002b24a
cmp r0, #0x23 ;ワイバーンナイト
blt $0002b24a


基本はこれですね。
このままだと連番だけOKな処理になるので、分岐の処理を変えなくてはいけません。
なので使える部分は以下の部分だけですね。


ldr r0, [r2, #4]
ldrb r0, [r0, #4]

さて、ではワイバーンナイト男女とヲリアID【40】、バサカID【43】のみ分岐させるような処理にしましょうか。どうせなので自分で考えましょう!


goldroadを使う練習にちょうどいいですね。使う命令も“cmp”“beq”“bne”だけあれば十分です。
そんなに難しくはないですが、少しは頭をひねる必要があります。では頑張って下さい。



CM(笑)
509211

提供:最萌トーナメント支援(無断)

暁だけでしたね、杖ポコ。ゲーム的に意味は無い仕様ですが。







それじゃあ先に進めましょうか。
こんな感じです。


@thumb
 cmp r0, #0x24 ;ワイバーンナイト
 beq skill
 cmp r0, #0x23 ;ワイバーンナイト
 beq skill
 cmp r0, #0x40 ;ヲリア
 beq skill
 cmp r0, #0x43 ;バサカ
 beq skill
 ldr r3, =$0802b24a
 mov pc, r3
skill
 ldr r3, =$0802b222
 mov pc, r3


こんなところでしょう。
ポイントは
・IDの16進数表記
・branch命令の使い方
辺りになります。


そして、最後についてる命令で元の処理に戻ります。分岐する場合(skill)は貫通判定の処理があるアドレスへ、分岐しなかったら不発のアドレスへジャンプします。


クラス追加をするならこんなところじゃないでしょうか。


これで、バサカとヲリアが貫通を発動します。貫通だけじゃまだスキル追加にはなりませんね。


まあこれで半分といったところです。

スキル効果の分岐


さて次は計算式を変えていきましょうか。


先ほどの貫通計算式変更法です。


0002b3e8:00 24 > 64 10

ではこの近辺を確認しましょう。


0802b3d6 6832 ldr r2, [r6, #0]
0802b3d8 6810 ldr r0, [r2, #0]
0802b3da 0340 lsl r0, r0, #13
0802b3dc 0b40 lsr r0, r0, #13
0802b3de 2180 mov r1, #128
0802b3e0 0249 lsl r1, r1, #9
0802b3e2 4008 and r0, r1
0802b3e4 2800 cmp r0, #0
0802b3e6 d000 beq $0002b3ea
0802b3e8 2400 mov r4, #0 ;防御ゼロ
0802b3ea 4649 mov r1, r9
0802b3ec 1b08 sub r0, r1, r4


防御ゼロの部分がどこか分かりますね。


その後の処理を見てみましょうか。そのあとの処理で”sub r0, r1, r4″となっています。少し考えれば、r1が攻撃力、さらにその上を見ると、その元となっているr9が攻撃力だと判断出来ますね。r9なのでハイレジスタです。


鳴動を作るなら体格を攻撃力に加算しなければなりませんね。
そんな処理を追加するほどのスペースはないので、まずは空き領域にとばしましょうか


0802b3d6 > 00 4B 9F 46 00 00 00 09

そして空き領域に飛ばした先では、こうなりますね。
頭の方に元々の処理を加えて、こんな感じです。


 ldr r2, [r6, #0]
 ldr r0, [r2, #0]
 lsl r0, r0, #13
 lsr r0, r0, #13
 mov r1, #128
 lsl r1, r1, #9
 and r0, r1
 cmp r0, #0
 beq end
(貫通効果の分岐)
end
 ldr r3, =$0802b3ea
 mov pc, r3


それではクラスで分岐させたいところですが…
残念、今回はクラスIDを近くで読み込んでいませんね。でもどうしてもクラスIDを読み込まなくてはいけません。


そういう時はどうするのかというと、どこかのレジスタにステータスのベースアドレスを格納していないかを確認するのです。と、言うわけでno$gbaを使って調べましょう。


0802b3e4

この部分にブレイクポイントを仕掛けて戦闘をします。
そして、その状態でどこかのレジスタにステータスのベースアドレスがないか調べましょう。

スクリーンショット


さて、調べるといっても色々試して探すのみなんですがね。


データウィンドウで”go to”から”r2″と入力すればr2のアドレスの状態を確認出来ます。理解不能なデータなら次へ、次へ、と…そんな風にひとつずつレジスタ先のメモリの状態を調べます。そうやって、今回ならエイリークのステータスが格納されていそうなアドレスを探すのです。
例えば、もしステータスアドレスならば、先ほどの表の通りに8番目にレベル、20番目に力、21番目に技が格納されているはずです。メモリの値と、実際のゲームのステータスが一致していたら、それが目的のレジスタとなるのです。


ただそんな事をしなくても、お決まりのアドレスってのがあったりします。


自軍選択中のユニットステータスアドレス
0203a4e8
敵軍選択中のユニットのステータスアドレス
0203a568

これです。聖魔では、このアドレスに選択中のユニットのデータが存在します。あの表と基本的には同じです。が、あの表でのステータスは、武器補正などを含めない純粋なステータスが格納されています。このアドレスには、武器補正などを含めた後のステータスが格納されているのが特徴です。
今はエイリークを選択しているので、エイリークのステータスが存在しています。


さっきのno$gbaのスクリーンショットを見てみましょう。r7が一致してますね。なのでr7にエイリークのアドレスがあるはずです。


この処理では、r7=攻め側のステータス、r8=受け側のステータスという風に格納しています。
今回にはあまり関係ないかもしれませんが、この計算が終わったら、次は反撃用に敵の攻撃力の計算を行うので、再びこの処理を通ります。ですがその時には、r7=敵軍のステータス、r8=自軍のステータスとなります。
これを理解していないと、いつか混乱するかもしれないので補足しておきます。複雑で嫌になるかもしれませんが、解析をするならこういった部分は自力で解読しなくてはいけないのですよ。


さてr7にステータスのアドレスがあることが分かりましたので、復習を兼ねてここからクラスIDをロードして分岐させてみましょう!


復習なので、前と同じ具合ですね。
ワイバーンナイトの場合は

mov r4, #0

で良いのですが、貫通ではなく鳴動が発動する場合は、体格を攻撃力に加える処理を新たに追加しなくてはいけませんね。


まあそれ含めて一度、悩んでみるのもいいんじゃないでしょうか。
どうやって体格を読み込むのか…などですね。


では一旦切るので、自分でやってみましょうか。



CM
FE-ByakuyaVsIchigo

提供:bwdyeti(無断)

もう何年も前の画像ですねぇこれ。回ってる所が凄まじい。
Fakeですけど。







それじゃわたしの物と比較してみましょうか。


 ldr r2, [r6, #0]
 ldr r0, [r2, #0]
 lsl r0, r0, #13
 lsr r0, r0, #13
 mov r1, #128
 lsl r1, r1, #9
 and r0, r1
 beq end
 ldr r0, [r7, #4]
 ldrb r0, [r0, #4]
 cmp r0, #0x40 ;ヲリア
 beq meido
 cmp r0, #0x43 ;バサカ
 beq meido
lunar
 mov r4, #0
 b end
meido
 ldrb r0, [r7, #26] ;体格
 add r9, r0
end
 ldr r3, =$0802b3ea
 mov pc, r3

こうですね。注目する点は
・分岐無しは「貫通」扱い
・体格の読み込み方
(・ハイレジスタの扱いについて)

辺りだと思います。
分岐しないなら貫通扱いは地味な盲点じゃないでしょうか。全部分岐させる必要は無いですからね。


あまり関係ありませんでしたが、ハイレジスタについて補足します。sinzan氏の資料に書いてあることですが、レジスタはr8以上がハイレジスタとなりまして、一部の命令で利用出来なくなります。add命令は使い方次第(add r0, r1, r9などは不可)で使えなかったりしますので、気をつけて下さい。


さてこれで、鳴動の導入は終わりました。本講のタスクは終了となります。


あとやることと言えば、テストプレイだけですね。


とはいえ、折角なので他にも様々なスキルを作って練習兼ねて遊んでみるべきでしょう。
例えば「復讐」なんて作ってみるのはどうでしょうか。


 cmp r0, #0x40 ;ヲリア
 beq revenge

revenge
 ldrb r1, [r7, #18] ;最大HP
 ldrb r0, [r7, #19] ;現在HP
 sub r0, r1, r0
 asr r0, r0, #1
 add r9, r0
 b end


「復讐」という名前が奥義的スキルとしてどうなのかという以外は面白いスキルですね。


他にも、トラキアの必殺風ダメージ(攻撃力2倍)にするとか。
…名前が「必殺」だと紛らわしいので暁のスキルになぞらえて「撃破」とでも名付けましょうか。


impale
 mov r0, r9
 add r9, r0
 b end

どうでしょうか。色々と試しがいがありますね。
これだと強すぎる気がしますが。


lsl r9, r9, #1じゃダメなのはハイレジスタだからですよ。ご理解いただけているでしょうか。
それにしても、さっきの「復讐」より単純化してませんか。


…ダメージ増加スキルに限るとそう大してネタがないんですよ。
でもこれでだいたい掴めたんじゃないでしょうか?ステータス画面変えるよりよっぽど単純ですよね。


まあ、そうでしたね。


あの時は解説を始めた事を後悔しました。もうパッチだけでいいかと思うくらいに。

終幕


それでは最後はバグチェックですね。スキル発動するまでひたすら殴りましょう。


色々と辛くなりそうなので、こちらの利用も検討しましょう。


・色々100%発動(テストプレイに)
0002a494: 64 23
0002b411: D1 > E0

見るべきなのは、指定のクラスが発動するか、逆に関係ないクラスは発動しないか、ダメージ量は大丈夫なのか、ですね。この辺りをチェックしましょう。
クリアデータの配布もしてるので、そちらも利用して下さい。

fe8t


キラリーンと光ると強そうですねぇ。他作品と違ってアニメオフだとスキル発動したかどうか分からないのが惜しい。
モッサリアニメより遥かにマシですけどね。


トップにも出てましたが、使い回し画像ですね。ウォーリアかバーサーカーの画像くらい用意してください。


これは資源の有効活用です。鯖容量も有限なのですよ。


このサイトの使い方だと到底たどり着かない境地です。


新規画像を用意する暇があるならバグチェックします。
まあわたしが言えた口ではありませんが、今回は空き領域に飛ばして条件つけて分岐するだけで、ミスをするとも思えませんがね。ねっ簡単でしょ。


簡単なら先生が全部パッチ化してあげればみんな幸せになりますよ。


それとこれとはですね、それだと私だけ幸せになってないので。


この講座がそもそも自己満足だーと言ってたじゃないですか。


確かに自己満足で構わないんですが、とはいえ、これが助けになって色々作られる事を頭の隅で考えてはいますよ。
なにせハックロムなんて絶対的に作品の点数が少ないうえ、それが自分の好みに合った改造じゃないと完成度がどれだけ高くても面白くありませんからねぇ。楽しめる改造FEは本当に一握りという事もあって、できれば十人十色な状況になって欲しいです。


聖戦好きとトラキア好きは一致しないし、聖魔はもとより、封印好きと烈火好きも一致しない。難しい世界です。


あの作品の作風に似せる!と意識しないと方向性が迷子になるので気をつけましょう。 


経験者は語るという奴ですね。


それも言わない約束です。


はい。
では初耳なので今から気をつけます。

2 thoughts on “GBAFE逆汗講座 四”

    1. 前後の処理をよく見て問題なさそうな所としか言いようがありません。
      基本的には分岐命令です。分岐命令の着地点をまたがるように置いてはいけない、分岐命令自体を潰すのも避ける。などなどなどなど。
      多すぎるのでその時々、自分で考えるしかありません。

コメントを残す

メールアドレスが公開されることはありません。