れーすのエグゼ流星Blog

エグゼとゲームと雑記

エグゼ解析したりゲーム作ったりいろいろ。

サイト案内(初めての方はこちらを)

初めまして。れーすです。

ここのブログに訪問したのは「流星のロックマン」や「DSネット対戦」などで検索したのがほとんどだと予想しているため、案内を記しておきます。

 

ニンテンドーDSのネット対戦(熱帯)について

 

exe-race.hateblo.jp

exe-race.hateblo.jp

exe-race.hateblo.jp

exe-race.hateblo.jp

 

 

 

ニンテンドーDSのPCエミュレーター【melonDS】で【ネット対戦】をしよう

はじめに

ニンテンドーDSは2014年5月20日ニンテンドーWifiサービスが終了しています。
「ニンテンドーDS」および「Wii」ソフトの「ニンテンドーWi-Fiコネクション」サービス終了のお知らせ|サポート情報|Nintendo


その後、有志によっていくつかのサーバーが立ち上げられ、それらのサーバーを介することによってWifiサービスが実現していました。
「ニンテンドーWi-Fiコネクション」終了にも関わらずDSとWiiをネット接続する方法が公開される - GIGAZINE


また、以前執筆したこちらの記事ではエミュレーターを用いたネット対戦の紹介もしてます。
exe-race.hateblo.jp
ただ、こちらのエミュレーターによるネット対戦は不完全かつ実用的ではなかったんですよね。


ですが、この度新たに開発されたmelonDSと呼ばれるDSエミュレーターによって
快適なネット対戦が可能である
との報告を海外の方からいただきました。


実際に私自身も試してみたところ、ほぼ実機と同じレベルの動作確認ができました。
ロックマンエグゼ6ネット対戦と同レベルといってもいいでしょう。

よって、本記事ではmelonDSの導入及びWifi接続の紹介を目的としております。

用意するもの

・melonDS(エミュレーター本体)
https://mega.nz/#!W7w0lCSa!ZDthS4TmDqwLMFnq7mo34zzEQSsaDsztVTOND7BJ0cw


・ゲームROM( .nds)
ニンテンドーds rom 吸出し - Google 検索
調べれば色々出ますね。 3dsが一番簡単そうです。


WinpcapWifi通信を可能にするもの)
WinPcap · Download
(Windows10の場合は下記のWinpcapになります)
Win10Pcap Download - WinPcap for Windows 10


biosファイル(bios7.bin bios9.bin firmware.bin)
DSからBIOSを吸い出す方法解説 | DS PSP初心者用講座アーカイブ
上記記事がわかりやすいです。
あくまで導入の参考程度にしておいて、実際に吸出しにしようするツールはdsbf dumperを利用してください。


dsbf dumper(biosファイルを吸い出すためのもの、マジコンで動かす)
DS-Scene - View Topic: DSBF Dump 7/9 Bios & Firmware Dumper for DLDI


・WfcPatcher(WifiSSL通信を解除するためのもの、ROMに適用する)
Release Version 1.6 · AdmiralCurtiss/WfcPatcher · GitHub

手順その1 Winpcap

上記のものを全て用意したらまずはWinpcapをインストールしましょう。
ポチポチしてたら終わると思います。

手順その2 bios

biosがないとmelonDSは起動しません。以下のような画面が出ると思います。
f:id:rai17321:20181108163516p:plain
なのでマジコンを用意し、マジコン上でdsbf dumperを起動すれば一瞬でダンプされます。
f:id:rai17321:20181108164055j:plain

もしマジコンがない人がいたらなんとか頑張りましょう。Googleで調べたら色々と出ると思います。

用意ができたら、このように配置します。
名前はそれぞれ bios7.bin bios9.bin firmware.bin に変えておきます。
f:id:rai17321:20181108164749p:plain

手順その3 ROM

ROMにパッチを当てましょう。パッチとはWfcPatcherのことです。
WfcPatcherに用意したROMをドラッグ&ドロップします。
少し経った後、新しいROMが生成されるでしょう。
f:id:rai17321:20181108164414p:plain

その後、melonDSにromsのような名前のフォルダを作成し、そこに生成されたndsファイルを移動しましょう。
ついでに使用するセーブデータ(.sav)も入れましょう。

手順その4 melonDSの起動

melonDSを起動します。
普通に使う場合に触るのはROM起動とキーコンフィグくらいでしょう。
Config→Input Configにて操作設定ができます。
f:id:rai17321:20181108165328p:plain

File → Open ROMで用意したROMを起動します。

手順その5 接続テスト

ゲーム内でWifi設定を行います。
流星のロックマン3なら メニュー → ネットワーク → Wifi でつうしん → Wi-fiせってい になります。

f:id:rai17321:20181108173312p:plain

接続先1を押し、右上に出てくる 接続テスト で接続を確認します。うまくいけば下記のようになります。

f:id:rai17321:20181108173521p:plain

手順その6 接続

ここまで準備が出来たらさっそく接続してみましょう。
f:id:rai17321:20181108173739p:plain

おめでとうございます。接続ができましたね。
f:id:rai17321:20181108173838p:plain

よくありそうな質問

Wifiがつながらない!
以下の場合が考えられます。

1. 1度接続を切ってからWifiに潜ろうとした
→melonDSを再起動してください

2. 普通につながらない
サーバーが休止中かもしれません。
サーバー自体はいくつかあるので、他のサーバーも試してみるといいかもしれません。
List of Servers · barronwaffles/dwc_network_server_emulator Wiki · GitHub

おすすめ
WFZwei 172.104.88.237
AltWFC 104.131.93.87
RiiConnect 164.132.44.106



melonDS重いんだけど!
PCスペックの問題です。
このエミュレーターはCPUに依存しているため、CPUが貧弱だと遅いかもしれません。
一般的なゲーミングPCであれば大丈夫だと思います。
筆者は次のようなスペックで快適に動作しています。

Core(TM) i5-6600 @ 3.30GHz


エラーコードよくわかんない
これ読んで(古いけど)
exe-race.hateblo.jp



友達と待ち合わせたのにマッチングしない!
使用しているサーバーが違う可能性が高いです。
使用するサーバーはDNSで設定した値によって決まります。
f:id:rai17321:20181108170248p:plain

この記事に掲載したmelonDSを使用しているならば、WFZwei 172.104.88.237 がデフォルトで設定されているはずです。
また、使用するサーバーを変えるたびにDS本体のWifi情報のリセットが必要なのでご注意ください。
(エラーコード 60000)


実機でもネット対戦したい
これ読んで(古いry)
exe-race.hateblo.jp

なんか新しいサーバーがあるらしくて、それ使うとマジコンとか改造コードいらずで実機でネット対戦できるらしいです。すごい。
gamegaz.com
ただ、自分で試したところマッチングしないので今後の対応に期待って感じです。
現状はやめておきましょう。


流星のロックマン3の対戦相手が欲しい!
下記のDiscordサーバーに入りましょう。
https://discord.gg/yqJ7M7g


海外の方が用意してくれたものですが、JP-chatが日本人専用のチャンネルとなっております。
そこで募集すればくるかもしれません。多分。

入ったら role-requestにて、以下のように発言しときましょう。
.iam JP
f:id:rai17321:20181108175139p:plain


わからないことや詰んだことがあれば

コメント欄か Twitter @EXE_raceまで連絡をお願いします。
基本的には15分くらいやってどうしてもわからなかったら聞いてください。
困ったらまずはmelonDSやPCを再起動しましょう。

ロックマンエグゼ5 チップトレーダー出現チップリストまとめ

エグゼオフを主催したときに収集したデータを記事として掲載しておきます。

エグゼ5ガチャ限リスト

ヒグレヤ(ノーマル)

キャノン
エアシュート
バルカン1
バルカン2
スプレッドガ
マークキャノン1
パルスビーム1
センシャホウ
ワイドショット
エレキリール1
サボテンボール1
サンダーボール
トルネード
ミニボム
エナジーボム
ブラックボム
アースクエイク1
マグマシード
オーシャンシード
アイスシード
クサムラシード
ソード
ワイドソード
ロングソード
カスタムソード
イアイフォーム
フウジンラケット
エンゲツクナイ1
サムライソード1
ヨーヨー
ドリルアーム1
スカルチェーン1
アクアわーる1
エアホイール1
ファイアパンチ
ヒートボディ1
サイドバブル1
カスタムボルト1
ブーメラン
メテオアース1
イナズマキング1
ウッディノーズ1
カモンレイン
カウントボム1
ボーイズボム1
ストーンキューブ
トップウ
スイコミ
オウエンカ
レッドフルーツ1
メットガード1
カースシールド1
クラックアウト
ダブルクラック
トリプルクラック
リカバリー10
リカバリー30
リカバリー50
リカバリー80
パネルスチール
エリアスチール
パネルリターン
デスマッチ1
ヘビーゲージ
ブラインド
インビジブル
バリア
バブルラップ
コピーダメージ
ライフシンクロ
アタック+10
カラーポイント

ごうかきゃくせん(スペシャル)

キャノン
ハイキャノン
エアシュート
バルカン1
バルカン2
スプレッドガ
マークキャノン1
マークキャノン2
パルスビーム1
パルスビーム2
センシャホウ1
センシャホウ2
ワイドショット1
ワイドショット2
エレキリール1
エレキリール2
サボテンボール1
サボテンボール2
ミニボム
エナジーボム
ブラックボム
パラライズボム
アースクエイク1
アースクエイク2
バグボム
マグマシード
アイスシード
オーシャンシード
クサムラシード
ソード
ワイドソード
ロングソード
イアイフォーム
エンゲツクナイ1
エンゲツクナイ2
サムライソード1
サムライソード2
ドリルアーム1
ドリルアーム2
スカルチェーン1
スカルチェーン2
アクアワール1
アクアワール2
エアホイール1
エアホイール2
ファイアパンチ
ファイアパンチ
ヒートボディ1
ヒートボディ2
サイドバブル1
サイドバブル2
カスタムボルト1
カスタムボルト2
メテオアース1
メテオアース2
スペースユラ1
スペースユラ2
イナズマキング1
イナズマキング2
ウッディノーズ1
ウッディノーズ2
カウントボム1
カウントボム2
ボーイズボム1
ボーイズボム2
ストーンキューブ
トップウ
スイコミ
オウエンカ
ディスコード
レッドフルーツ1
レッドフルーツ2
メットガード1
メットガード2
カースシールド1
カースシールド2
クラックアウト
ダブルクラック
トリプルクラック
リカバリー10
リカバリー30
リカバリー50
リカバリー120
リカバリー150
パネルスチール
エリアスチール
パネルリターン
バスターアップ
ブラインド
インビジブル
バリア
バリア100
バブルラップ
コピーダメージ
ライフシンクロ
アタック+10
カラーポイント
ロール
ジャイロマン(ブルース)
ナパームマン(ブルース)
マグネットマン(ブルース)
シャドーマン(カーネル
トマホークマンカーネル
イトマンカーネル
リザードマン
シェードマン
クラウドマン

オラン島(スペシャル)

キャノン
ハイキャノン
メガキャノン
エアシュート
バルカン1
バルカン2
バルカン3
スプレッドガ
マークキャノン1
マークキャノン2
マークキャノン3
パルスビーム1
パルスビーム2
パルスビーム3
センシャホウ1
センシャホウ2
センシャホウ3
ワイドショット1
ワイドショット2
ワイドショット3
エレキリール1
エレキリール2
エレキリール3
サボテンボール1
サボテンボール2
サボテンボール3
エレメント嶺二
サンダーボール
トルネード
ノイズストーム
ミニボム
エナジーボム
メガエナジーボム
クラックボム
パラライズボム
リセットボム
アースクエイク1
アースクエイク2
アースクエイク3
バグボム
ホウガン
ブラックボム
カンケツセン
マグマシード
オーシャンシード
アイスシード
クサムラシード
ソード
ワイドソード
ロングソード
ワイドブレード
ロングブレード
カスタムソード
バリアブルソード
イアイフォーム
フウジンラケット
エンゲツクナイ1
エンゲツクナイ2
エンゲツクナイ3
サムライソード1
サムライソード2
サムライソード3
ヨーヨー
ドリルアーム1
ドリルアーム2
ドリルアーム3
エアホッケー
スカルチェーン1
スカルチェーン2
スカルチェーン3
アクアワール1
アクアワール2
アクアワール3
エアホイール1
エアホイール2
エアホイール3
ファイアパンチ
ファイアパンチ
ファイアパンチ
ヒートボディ1
ヒートボディ2
ヒートボディ3
サイドバブル1
サイドバブル2
サイドバブル3
カスタムボルト1
カスタムボルト2
カスタムボルト3
ブーメラン
メテオアース1
メテオアース2
メテオアース3
スペースユラ1
スペースユラ2
スペースユラ3
イナズマキング1
イナズマキング2
イナズマキング3
ウッディノーズ1
ウッディノーズ2
ウッディノーズ3
バンブーランス
ツナミホール
アカツナミホール
ドロツナミホール
カモンレイン
カモンスネーク
マグナム
サークルガン
カウントボム1
カウントボム2
カウントボム3
ボーイズボム1
ボーイズボム2
ボーイズボム3
ステルスマイン
ストーンキューブ
トップウ
スイコミ
オウエンカ
ディスコード
ティンパニ
サイレンス
レッドフルーツ1
レッドフルーツ2
レッドフルーツ3
ラニンギョウ
メットガード1
メットガード2
メットガード3
カースシールド1
カースシールド2
カースシールド3
クラックアウト
ダブルクラック
トリプルクラック
リカバリー10
リカバリー30
リカバリー50
リカバリー80
リカバリー120
リカバリー150
リカバリー200
リカバリー300
パネルスチール
エリアスチール
スチールゼリー
スチールパニシュ
スチールリベンジ
パネルリターン
デスマッチ1
デスマッチ2
デスマッチ3
ヘビーゲージ
クイックゲージ
バスターアップ
ブラインド
スーパーキタカゼ
ホーリーパネル
インビジブル
バリア
バリア100
バリア200
バブルラップ
カキゲンキン
ダイコウズイ
ヒライシン
マヨイノモリ
カワリミ
シラハドリ
ナビスカウト
バッドメディス
コピーダメージ
ライフシンクロ
アタック+10
ナビ+20
カラーポイント
ブルース(ブルース)
サーチマン(サーチマン)
メディ
カーネルカーネル
ナンバーマン(カーネル
トードマン(カーネル
コスモマン
スワローマン
フットマン

GBAプログラミング 5日目

取り組んだ内容

Tutorial.6 キー入力とデバッグ
http://akkera102.sakura.ne.jp/gbadev/index.php?tutorial.6

やってみたこと

1.上 下 右 左 Bボタンのキー入力、同時入力の受け取りをVisualBoyAdvanceのloggingを用いて確認してみる

f:id:rai17321:20180606160308j:plain

#include "lib/gba.h"

//---------------------------------------------------------------------------
void WaitForVsync(void)
{
	while(*(vu16*)0x4000006 >= 160) {};
	while(*(vu16*)0x4000006 <  160) {};
}
//---------------------------------------------------------------------------
int main(void)
{
	// モード設定なし

	u32 x = 0;

	for(;;)
	{
		WaitForVsync();

		if( !(REG_KEYINPUT & KEY_UP)  ) TRACEOUT("上ボタン\n");
		if( !(REG_KEYINPUT & KEY_DOWN)) TRACEOUT("下ボタン\n");
		if (!(REG_KEYINPUT & KEY_LEFT)) TRACEOUT("左ボタン\n");
		if (!(REG_KEYINPUT & KEY_RIGHT)) TRACEOUT("右ボタン\n");

		//if (!(REG_KEYINPUT & KEY_UP & KEY_DOWN)) TRACEOUT("上と下\n");
		//if (!(REG_KEYINPUT & KEYIRQ_OR & KEY_RIGHT)) TRACEOUT("テスト\n");

		if( !(REG_KEYINPUT & KEY_A)   ) TRACEOUT("%d回押したよ\n", x++);
	}
}

考察

コメントアウトした部分の動作がうまくいかなかった。
&条件なので上と下を押さないと動作しないはずが、常に動作してしまっている。
KEYIRQ_ORとかを使うみたいなんだけど、使い方がよくわからなかった。

GBAには標準でリセット(A & B & SELECT & START)機能があるので、実装はできるはず。

GBAプログラミング 4日目

取組んだ内容

tutorial.4

mode4

やってみたこと

1.フレームバッファを無限ループでずっと切り替えさせてみる。

 

int main(void)
{
	// モード設定
	// 4bit目(BACKBUFFER)を1にすることで、フレーム2が有効になります
	SetMode(MODE_4 | BG2_ENABLE | BACKBUFFER);

	// 画像と色データの読み込み
	Mode4SetFrame((u8*)&frame1Bitmap, 1);
	Mode4SetFrame((u8*)&frame2Bitmap, 2);

	Mode4SetPalette((u16*)&frame1Pal);

	while(1){
	SetMode(MODE_4 | BG2_ENABLE);
	SetMode(MODE_4 | BG2_ENABLE | BACKBUFFER);
	}
	

	for(;;)
	{
	    WaitForVsync();
	}
}


f:id:rai17321:20180530155500j:plain

考察

 フレームバッファが画面切り替えに使われるのはわかったけど、BACKBUFFERの値をソースコード上で変えたら切り替わるのか?
という考えから、試しに無限ループでやってみたところ見事にヒット。

BACKBUFFERが定義されているのは
#include "lib/gba.h"
#include "res.h"
のどちらなのかな。

そして、助言をいただきはてなブログの記法を見たままからはてな記法にしました。
これでソースコード問題も解決だね!

GBAプログラミング 3日目

取組んだ内容

tutorial.3

ビットマップモード

 

やってみたこと

1.png画像を出力してみる

 

// 画像の読み込み

Mode3DrawImage((u16*)&imageBitmap);

f:id:rai17321:20180524133602j:plain

読み込ませるときの処理がよくわからない。

チュートリアル3のフォルダを流用し、gritで画像をGBA用に変換したものを読み込ませようとしたら、どうやらどこかの処理で画像をGBA用に変換、インポートまでしてくれてるみたいだ。(tut3/res)

楽っちゃ楽だけど、仕組みをきちんと知りたさがある。

 

 

2.四角形の描画をしてみる

f:id:rai17321:20180524142928j:plain

 

#include "lib/gba.h"#include "lib/gba.h"
//---------------------------------------------------------------------------

void WaitForVsync(void)

{ while (*(vu16*)0x4000006 >= 160) {};

while (*(vu16*)0x4000006 <  160) {};}

//---------------------------------------------------------------------------

void Mode3PutPixel(u32 x, u32 y, u16 col){

u16* ScreenBuffer = (u16*)0x6000000; ScreenBuffer[y * 240 + x] = col;}

//---------------------------------------------------------------------------

// モード3で四角形を塗りつぶすvoid Mode3DrawBox(u32 sx, u32 sy, u32 ex, u32 ey, u16 col){ u32 x, y;
for (y = sy; y<ey; y++) { for (x = sx; x<ex; x++) { Mode3PutPixel(x, y, col); } }}int main(void){ // モード設定 SetMode(MODE_3 | BG2_ENABLE);
// ドットの描画 u32 sx = 50; u32 sy = 50; u32 ex = 150; u32 ey = 150; u16 col = RGB5(31, 31, 31);
Mode3DrawBox(sx,sy,ex,ey,col);

for (;;) { WaitForVsync(); }
}

 

はてなソースコードの貼り付けするとインデント消えるのかよ!!!!!!!

 

DXlibでの描画と対して変わらない。

2つの頂点を設定することで描画を実現している。(sx,sy & ex,ey)

 

やってて思いましたが、UnityはDXlibを楽にしたもので、DXlibはこのような古典的なゲームプログラミングを楽にしたもの、このゲームプログラミングもアセンブリを楽にしたものなんじゃないかな。

GBAプログラミング 2日目

取組んだこと

・開発wikiチュートリアル2

tutorial.2

 

学んだこと(印象に残ったこと)

GBAの描画形式がmodeという種類で分けられている。

0-2がタイル

3-5がビットマップ

タイルとビットマップの違いは、このサイトがわかりやすいかも。

画像処理の話の中で、ラスター形式やタイル形式という言葉がでて… - 人力検索はてな

ビットマップが一番細かい描画なのかな?

 

processingのvoid setup()みたいに初期設定で描画設定を行う。

 

SetMode(MODE_3 | BG2_ENABLE);

 

で、この分解していくと

0x04000000~0x04000001

に代入する値によってmodeが切り替わるらしい。

 

f:id:rai17321:20180516162221p:plain