VirtualBoxと仮想化技術をポケモンルビーの通信交換でやっちゃおう！


# 動画について

https://youtu.be/ynKqBh-amjM?si=yDWhcfYLR50vLYUY

https://www.nicovideo.jp/watch/sm45089205

# きっかけ

ポケモンをパソコンで遊んでいて「通信交換をやってみたい」と思ったのが始まりです。調べたところ、VBALink というエミュレータを使えば実現できることがわかりました。

ただ、1台のPC内で2つの VBALink を起動して通信しようとすると、うまくデバイス同士が連携できず、画面がフリーズしてしまいます。そこで、VirtualBox で別の Windows 環境を作り、その中に VBALink をインストールする方法で通信交換を実現しました。

# 準備するもの

- Windows OSが入ったPC．
  - 4コアあるPCが望ましいです。
  - IntelのCPUを使っているならば、i5，i7シリーズであればそのくらいのスペックのものはあると思いますが、タスクマネージャーで確認することもできます。
- インターネット接続
- 外部ストレージ（40GB 以上の空き容量があるもの）
- VirtualBoxの空き容量として利用します
- Windows 11が入ったISOファイル
  - https://www.microsoft.com/ja-jp/software-download/windows11
  - 環境再現はWindows 11 24H2で実施しました。バージョン番号によって、ポリシーが変わるので、注意が必要です。非正規品（ライセンス認証がない状態）としてインストールします。
- VirtualBox
  - https://www.virtualbox.org/
- レトロダンパーv4
  - https://www.amazon.co.jp/dp/B0CZ997XW8
  - 前回の型番が廃止となったので持ってないならAmazon等で買いましょう。
  - ROM をダウンロードして遊ぶのは犯罪ですので、絶対にやめましょう。
- ゲームボーイのソフト。
  - 今回はポケモンルビーで試します。
- ゲームパッド1台。

# 注意

今回の手順では、ライセンス認証を行わずにゲストOSとしてWindows 11 をインストールします。
今回の記事は、自分の学習・開発・検証目的でWindows 11 の仮想環境を構築し、将来的に製品版 Windows 間での通信交換やゲーム関連ツールの動作確認を行う準備として作業した記録です。

これは技術的に「このような環境構築が可能である」という学習・検証目的の手順紹介であり、ライセンス認証を行わない状態での利用や、その長期運用を推奨するものではありません。

商用利用・日常業務利用・ライセンス条項に違反する利用は絶対に行わないでください。すべて自己責任で実施してください。本記事は技術的メモ・記録であることをご理解ください。


# システム構成図

VirtualBoxは、あるパソコンに別のOSを模擬させるソフトウエアです。VirtualBoxを動かす側のOSをホストOSと言います。VirtualBoxの中で動くOSをゲストOSと呼びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/56c8cc9e-e36b-4ba4-ba4c-772b1151e488.png)

## ホストOSとゲストOSの違い

今回はWindows 11の中にWindows 11を入れるというなかなか不思議なことをします。今回はゲストOSにWindows 11の評価版を利用します。

# VirtualBoxにWindowsをインストールする方法

ISOファイルをアタッチしてインストール

VirtualBoxの設定 ”新規”のボタンを押して、次のように入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/c38bf109-4678-49d1-b425-8f2024ce210d.png)


自動インストールの画面にて、ユーザ・パスワードの情報などを記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/8ca41a12-fd7b-4ce0-928d-097f534b6531.png)

ハードウエアの設定。プロセッサ数を可能なら4以上に設定するのがおすすめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/cf69f3fe-519b-4ff1-8a47-df931df2d95e.png)

# インストール作業

この画面が出てきたら、VirtualBoxの画面を押して何かボタンを押す。VirtualBoxのコツとして、右Ctrlキーを押すと、マウス操作をホストOSに戻すことができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/ce5825a0-47c7-4fdc-8b42-8115016cc207.png)

「プロダクトキーがありません」を選択する。これをすると、ライセンス認証がされていない環境でコンピュータのインストールをする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/184520f2-6543-4ece-8b93-6cb7d7f2c310.png)

インストールを待ちます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/c32f0c7a-ae2d-443d-ac6b-8e4771b679ef.png)


## 再起動がかかるので操作する

しばらくして起動するとWindowsのインストール画面が出てくるので、指示に従う
再起動がかかるので、操作する
VirtualBoxにWindowsの画面が映れば成功

## ネットワークの設定

一度VirtualBoxを切って「設定」からホストオンリーアダプターの設定をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/0c9d4673-6284-4b15-a9b0-2dae4042628c.png)

## デバイスの設定

ゲームパッドを接続して、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/8189238d-dba9-402f-888c-7bbee85a10e4.png)


VirtualBoxの設定にて、USBの設定で、「プラス」アイコンを押して、PCに接続しているキーボードを割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/1bb93e58-89bf-41dd-a385-2d566361d5b0.png)


プラスボタンを押してキーボードのデバイスを登録
キーボードを登録するというのがポイントで、ゲストOSでキーボードを、ホストOSでゲームパッドを操作すると使いやすいです。

## ネットワーク共有の設定


ネットワークの設定をして、ROMやセーブデータを受け渡しできるようにしましょう。
ROMファイルとセーブデータファイルをフォルダひとまとめにして、それをバックアップとしてフォルダごと残しておくようにします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/2303ee0d-cd58-4957-bba1-974dc806cf14.png)

## レトロダンパーでROM吸い上げ

ポケモンルビーのカセットをレトロダンパーに刺した状態。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/4d4e139e-4dbc-4927-a284-be9548afbb8f.png)

レトロダンパーを指すと、USBメモリのようにROMデータを拾ってくれます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/17ec365b-a8b6-4443-9810-ddd7c3a66e48.png)

上記のファイルをローカルにコピー。

## VBALinkにて、ポケモンルビーで遊ぶ

とりあえず、VBALinkをダウンロード後展開し、任意のフォルダにおいて、先ほどコピーしたPOKEMON.GBAを適当なフォルダを作成して配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/0cd6a717-0b6e-418a-8ff3-c8d1f5130cf9.png)

VBALinkを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/a6ae3bbd-3f1a-47e8-af1f-39334e4f9ec7.png)

Options > JoyPad > Configureを押して、ゲームパッドの割り当てをします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/b6ec54e5-ed28-4b9f-b0fd-fd40af09e2d6.png)

また、ゲームは適当に進めて交換できるところまで行きましょう。
最低、コトキタウンまで行く必要はあります

## バックアップ

フォルダ構成を間違えると、結構データの読み込みが失敗します。
なので、バックアップが必要な場合は、VBALinkのフォルダごとバックアップを取ります。

ネットワーク共有するときに、このバックアップファイルから選んでゲストOSにコピーします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/5bc82221-3b7a-42a7-82ef-e96147a47d33.png)


先ほど設定したネットワークのフォルダに、遊んだゲームのexeファイル一式をコピペしましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/cdb9fec3-09af-46bd-b758-6336f3014b8d.png)

## VirtualBoxで起動確認

VirtualBoxにキーボードの設定を占有させた理由は、ゲストOSでキーボードが使えるほうが便利だからです。

起動後、ネットワークを開く

ネットワーク探索とファイル共有のエラーが出るので有効化

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/8253ff21-bd3f-4da3-8385-594da6298214.png)

いいえ、探索しているネットワークをプライベートネットワークにします　をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/8c01145a-9a11-4e02-ac87-44edf4349be6.png)

共有するフォルダを開いてネットワークの資格情報を記録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/88638bbe-5a0e-4dbc-bb28-4467c3826e4a.png)

ネットワークの参照先が開くので全部ローカル環境にコピーする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/729c87bd-3d41-406d-b930-94ba06c20987.png)

VirtualBoxで起動確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/635aa4f8-7d8c-42b6-8481-90ef1ed5f01d.png)


# さあ、通信交換をやってみよう

ホストOSをサーバにするほうがわかりやすいです。

## ポケモンルビーを両方の環境を開き、ポケモンセンターの2Fへいく

動作確認のために、キーボードで動かすとゲストOSのポケモンが、ゲームパッドで動かすとホストOSのポケモンが動くと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/aaf4a66c-2fb5-4134-9b47-e004eda37b56.png)


## ネットワークの設定

Optionsから"Link" "Settings"を開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/fbca012e-6009-4f25-a730-066a3f6b3145.png)

ホストOSは「General」を「Network」に設定して、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/104f1fd2-43a5-4642-b3e2-8da7ced22f14.png)

「Server」をクリック。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/4688b5a3-9fa0-4cc7-8337-32b1fb76cd91.png)

Startを押すとIPアドレスが出てくるのでこれをメモる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/0b902307-786c-438d-b1f0-6f4380fe73b3.png)

ゲストOSでもNetworkを設定　「Client」を指定して、


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/f5211fa9-68a8-4392-b07d-937aecfca787.png)

ホストOSのIPアドレスを入力して「Connect」を押す

両方の画面でポケモンセンターのお姉さんに聞いて、今回はとりあえず対戦して指示にしたがうと・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/d815969c-21e2-4aa1-a304-938ea02aa1d9.png)

ホストOSとゲストOSで通信画面の表示ができる！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/09371410-f9a5-4607-ae7a-a1f35d6c8e9c.png)

とりあえず対戦させてみました。初期データだけなのでミズゴロウしかいないけど。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/e69feb2c-4c2c-4b69-9aba-c759e396b9e2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/6de33a18-01bc-4061-be59-6f944bd91816.png)

ただ、結構失敗します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281173/2f8fee69-8efd-4f8a-9feb-7870470c47a6.png)

昔の通信方式でポーリングタイミングなどの問題があって、なかなかうまくいかないこともあります。
上手くいくまで何度か粘ってやってみましょう。