れーすのエグゼ流星Blog

読者です 読者をやめる 読者になる 読者になる

れーすのエグゼ流星ブログ

ロックマンエグゼ6の解析を主に行っている情報学生のBlog。プロフィールのidをクリックしてもらえると詳しい詳細が見れます。 Twitter @EXE_race

GBA解析 アセンブリの勉強 

参考文献

ARM7TDMI saizen氏の解説ページ

Assembly Programming on ARM Linux(02) ARMリファレンス

GBAFE逆汗講座 GBAFE界隈の有志様による逆汗解説

解説/ARM_asmカンペ - FE8Archives 同じくFE界隈のwiki解説

http://wisdom.sakura.ne.jp/programming/asm/index.html アセンブリ入門

アセンブリ言語の基礎知識

 

個人的メモ命令集

BGE [address](label) 大きいか等しい 符号付き整数演算でより大きいか等しい

LDRH Rd,[Rs,#imm] Rsに符号無し#imm(6bit = 62まで)を足したメモリアドレスの値をRdにハーフワードロード

STRH Rd,[Rs,Rn] RsとRnを足したメモリアドレスにRdをハーフワードストア(2Byte)書き込み命令

BL [address](label) [PC±4MB]に強制分岐。今実行してるプログラムのアドレスから±409600Byte
ブランチとリンク。これはアドレスにジャンプし、r14を更新します。
これは、サブルーチンを呼び出すために使用されます。

MUL Rd,Rs RdをRsの値で積算

LDR Rd,[Rs,Rn] RsとRnを足したメモリアドレスの値をRdにワードロード(4Byte)

LDRB Rd,[Rs,Rn] RsとRnを足したメモリアドレスの値をRdにバイトロード(1Byte)

ADD Rd,Rs,Rn RsとRnを加算しRdに格納

BNE [address](label) 等しくない 比較結果が等しくないかゼロでない Z = 0

 

レジスタ

r0~r12 汎用レジスタ

 

r13はスタックポインタ

スタック専用のレジスタで、スタックが保持される

スタックは普通、何かのデータを一時保管用するために使用されます。たとえば、一時的にレジスタの中にあるデータをスタックへ積み(データの回避)、レジスタを別の目的に使用した後、スタックからデータを戻す(データの復元)ように使用されます。

push rr ;(SP) ← rr

pop rr ;rr ← (SP)

 

r14(LR)はリンクレジスタ 

BL 命令(サブルーチンコール)で分岐した場合の戻りアドレス を保持します

リンクレジスタは1つの戻りアドレスしか保持できないため、 スタック (普通は r13 が示す領域) に保存する場合が多くなります。

リンクレジスタがないとサブルーチンが終了した際に元の場所に戻ることができなくなる

 

r15(PC)はプログラムカウンタ 

実行中のメモリアドレスを保持しており、分岐する際の飛び先アドレスになる

 

BL命令の場合は予めr14(LR)に”戻りアドレス”を保持する

通常はサブルーチンの最初にr14(LR)をスタック、最後にr15(PC)にポップすることでr14(LR)→r15(PC)の代入を実現

よって飛び元に戻ることができる

(サブルーチン→サブルーチンが出来ないが、 mov r15 r14でも可能)

 

まとめる前メモ

lsl 論理左シフト 1回左シフトすれば2倍、1回右シフトすれば1/2倍です

bl サブルーチン

論理シフト
mov r0, #24
ldsb r0, [r4, r0] ;;体格ロード
asr r0, r0, #1 ;;1/2に
mov r2, #18
ldsb r2, [r4, r2] ;;力ロード
asr r2, r2, #2 ;;1/4に
add r0, r0, r2
mov r2, #19
ldsb r2, [r4, r2] ;;技ロード
asr r2, r2, #2 ;;1/4に
add r0, r0, r2

 

覚えておくべきことは、命令にSを追加すると(ANDS、SUBS、ADDSなど)、ステータスフラグが設定されることです。ループ内のS(第1章の最初のプログラムのような)を使用するのを忘れて、条件付きブランチを実行しようとすると、無限ループやその他の悪いバグが発生します。

ロックマンエグゼ6 セレナードイベントを作成するにあたって

こんにちは。

つい先日、ロックマンエグゼ6でセレナードイベントを再現してみました。

https://www.youtube.com/?hl=ja&gl=JP

 

なんで急にこんなもの作ったのかって言うと1つの契機があったからです。

 

1.TextPetを使えるようになったこと

これ、使ってみてめちゃくちゃ衝撃的でした。

GitHub - Prof9/TextPet: A plugin-based binary script extraction and insertion tool for Mega Man Battle Network modding and translation.

 

TextPetはテキスト編集ツールです。文字通りゲーム内のあらゆる文字を書き換えることが出来ます。

が、ツールの画期的なところといえばスクリプト形式での書き換えが可能という点です。

今まではDialogEditorやTalkEditorなどを用いて遠回りしながらもテキストを編集することは可能でした。ただ、特定作業や挿入作業が少々面倒くさいです。ときには得敵出来ないこともあります。

 

TextPetは予めゲーム内全テキストをエクスポートしたファイルがあり、その中身を書き換えてスクリプトを実行するだけです。

とんでもなく楽であり、人間にとって読みやすく、保持性が非常に高いです。

 

開発者のProf.9さんはとんでもないものを作ってくれました。

 

2.セレナードイベント作成時のあれこれ

大まかな流れ

シークレットエリアの再現→セレナードの用意→イベントの編集

 

2-1.シークレットエリア

多分ここに一番時間を使ったんじゃないんでしょうか。

まず、グレイブヤードを使うのはどのパッチを見ても定石ですね。墓石があるので使い勝手がいいです。

3のシークレットエリアをパレットビュアーで確認します。にらめっこしつつグレイブヤードに同じ配色を適用します。

 

スプライトと背景の導入後

 

背景とパレットを変えるだけでグレイブヤードの雰囲気が変わったのは予想はしつつも驚いたポイントです。

 

ただ、アニメーションパレットのせいで対応しなければならない箇所が多かったので地味に面倒でした。

 

2-2.セレナードの用意

実はSpriteReaderのアニメーション拡張機能に用いてセレナードのスプライトをフォルテ向けに調整してた経緯があったので、セレナードの戦闘スプライトはすぐ終わりました。

GitHub - idealexe/EXE6_Tools: 各種データを編集できるようになるかもしれないツール群

OWスプライトはエグゼ3から引用。アニメーションを入れ替えることにより違和感なく向きを調整。

 

顔アイコンが少々曲者でした。エグゼ3とエグゼ6では顔アイコンのサイズが異なるのでゲームに適用した際に表示が崩れてしまいます。

なので1から作り直しました。

 

2-3.イベントの編集

イベントを作るにはどうしようかと思いました。なにせポケモンと違ってイベントスクリプト自体を組むことはまだ不可能です。

なので、グレイブヤード最奥部のフォルテSPを改変しました。

 TextPetはこのような書式になっています。めっちゃかんたんですね。

 

完成しました。

 

 

 

3.まとめ

今回のセレナード改変はシークレットエリアのタイムアタックのような構図にしたいと考えています。

モノリスをエグゼ3の悪ナビにしてエグゼ3のボスを出現させたりなど、いろいろ企んでいます。

イベントスクリプトとフラグ管理さえなんとかなれば、エグゼ6ハックはかなーり進歩すると思います。

 

 

 

 

 

ロックマンエグゼ6に他ナンバリングの曲を完全移植するための方法とパッチ配布

idealさんによって他ゲーの音源を簡単に移植することが可能になったので、音源を既に移植したパッチを配布します

グレイガ版だけなのでファルザー版はしこしこがんばってください、対応する気はないですがどうしてもしたい人は声かけてね

 

github.com

 

主なやり方はここに書いてあります

 

BGM(ネイティブ音源)編

を参照

sファイルもgithubにあげているので落として好きなの使ってください

これもやり方わからない人はTwitterにでも聞いてね

www65.atwiki.jp

 

 

シャドウバース 解析

いろいろなきっかけがありシャドウバースのパケット解析をすることになったのでメモとして記録していく。

突然消すことも大いにあるので完全に個人用です。

ちなみに私自身はネットワーク、パケットキャプチャなどに関してはまったくの初心者なので悪しからず。

 

10.97.227.89⇄221.110.252.56    HTTP 164 POST

 

メニュー画面の移行

ポート80⇄50636,7,8,9...の行き来

 

51 6.925829 10.97.227.89 54.178.189.60 HTTP 420 GET /socket.io/?transport=websocket&sid=DsL1TWDY3yKkNobEAAF9 HTTP/1.1 

マッチング成立

 

13560⇄50636,7,8,9... ポート80がメニュー 13560がマッチング?

 

 

 

ロックマンエグゼ6ネット対戦における対戦BGMの変更方法

1.準備するもの

・Sappy

・sファイル

 

※弄れる人向け

・Domino

・LoopMaker

 

2.導入

今回のために用意したSappyとsファイルのセットを上げておきます。

https://www.axfc.net/u/3739475

(DominoとLoopMakerに関しては解析wiki見てください)

 

ダウンロードしたフォルダの中にあるSappy.exeを起動して、目的のROMを読み込みます。

 

f:id:rai17321:20161111191427j:plain

 

ネット対戦でデフォルトで使われてるBGMは21番目のウイルスバトルです。これに上書きしていきます。

 

f:id:rai17321:20161111191621j:plain

 

タスク→.sをアセンブルする をクリックします

 

f:id:rai17321:20161111191753j:plain

 

.sファイル名をクリックし、Sappyフォルダの中の「完成sファイル」フォルダにある好きなsファイルを読み込んでください。

 

f:id:rai17321:20161111191859j:plain

 

その際に出てくるダイアログも はい を選択してください。

 

以上で終了です。

 

3.補足

exe1battle2…エグゼ1のボスバトル

exe2battle1_brianuuu…エグゼ2のウイルスバトル ※

exe3_song25_to_exe6…エグゼ3のウイルスバトル

greatbattlers_brianuuu…エグゼ3のグレイトバトラーズ ※

ssr3battle1…流星のロックマン3のウイルスバトル

 

※がついているsファイルはループ処理が上手くいっていません。

DominoとLoopMaker、sファイルの編集を駆使すれば調整できると思いますが、私が直す予定は今のところありません。

 

改造コードを用いてもっと飛躍させたい場合はブルーさんのブログを参照してください。

ロックマンエグゼ6 BGM変更コード|チートコード|メットールのメモ帳

 

 

 

エグゼハック パレット編(ダークロックマン ダークブルース)

リアルが落ち着いてきたので久しぶりに簡単なパレットハック

f:id:rai17321:20160924125347j:plain

f:id:rai17321:20160924125400j:plain

f:id:rai17321:20160924125406j:plain

 

簡単な大体の流れ

変えたいものを決める → それのパレットのアドレスを特定 → バイナリエディタで目的のパレット配列に変える

 

詳しい流れ

変えたいもの(今回で言うならば ロックマン ブルース シールド ブルースのソード振りかざしの腕)のスプライトをダンプしておく。

 

SpliteListViewerの右下にスプライトのオフセット群が書いてあると思う、それを元にパレットの場所を把握

f:id:rai17321:20160924132630j:plain

ちなみに、ROM Offsetにチェックを入れているとROM全体で見たスプライトの場所を指している。外した場合はスプライトのみの場所を指しているので、必要に応じて使い分ける。

 

ただ、なぜかSprite File Infoが見切れてるんだよね。最後の方わからねえ!

というわけなので、パレット列を元にパレットツールで特定していく(MacでWineとか使ってリストビュアー起動するとちゃんと表示されるらしいです)

 

615.... となっているので体感6150あたりじゃね? ってことで検索。

f:id:rai17321:20160924133052j:plain

 

それっぽいのあるね! リストビュアーとにらめっこしながらそれっぽい開始ブロックをクリック

f:id:rai17321:20160924133145j:plain

というわけでロックマンのパレット0番目の列は615Eにあったというわけでした。

 

あとはバイナリエディタで煮るなり焼くなりって感じです。

 

他の特定手段としては、VBAのOAMビュアー、パレットビュアーでパレットを地道にみてバイナリエディタで特定していくという手段もあります。最終手段ですね。

 

 

 

 

ロックマンエグゼ6 解析wiki設立

今更ですが解析wiki作りました。

解析関係は全部こっちでやっていきます。

 

こっちは小ネタとかになるのかなぁ・・・

 

www65.atwiki.jp