見出し画像

Switch自動化の歴史と無線化、そしてWindows対応のお話

Pokémon RNG Advent Calendar 2020 12月21日の記事となります。

はじめに

皆様、大変ご無沙汰しております。ゲーム好きの和菓子ことみずようかん(AT12806379)です。
ポケモン剣盾が発売されてからはや1年が過ぎ、発表されていたDLC2つも配信された今、乱数調整以外の用途にもマイコンによる自動化が広がってきています。
そんな中、自動化をよりワイヤレスに実現したいという需要も高まり、Bluetooth経由でswitchを操作する技術も確立されてきました。
そこで今日は、それぞれの自動化の歴史と、Bluetooth自動化のデメリットを打破するためのWindows移植を頑張った話を書いていこうと思います。
※拙い文章&調べて書いていますが正確性に欠ける記述があるかもしれません。ご了承くださいませ🙏

Switch自動化の歴史①解析とspoofing

ポケモン剣盾発売後、自動化界隈は大きく発展しましたが
自動化「自体」のルーツはswitch発売前後にさかのぼる事になります。
switch発売から一週間後の2017年3月10日、それを入手してコントローラー関連の解析をした結果がGithubで「Nintendo_Switch_Reverse_Engineering」として公開されました。そしてそのissuesにて、switchとコントローラー間の通信の再現をしよう(コントローラーになりすますプログラムを作ろう)という動きが始まったのが自動化のルーツだと僕は考えています(多分諸説あり)。
当時は今より解析が進んでなかった事もあり、コントローラーを無線/有線で再現することは難しかったようですが、数か月後の6月20日を機に状況は一変します。

Switch自動化の歴史②Switch本体更新ver3.0

2017年6月20日、Switch本体更新ver3.0が配信されました。
その中には、こんな文章が...

画像1

そう、このアップデートでHORI製等の他社製コントローラーが使えるようになったのです。
その結果、翌日にteensyというマイコンをPOKKENコントローラーに偽装する「Switch-Fightstick」が誕生する事となりました。
そしてしばらく海外ではこれを元にしたマイコンによる自動化が流行していくことになります(Botwの雪玉ボウリング自動化、Splatoon2の自動ドット打ち等)。
そんな中でも、Bluetoothによる自動化を諦めない人たちは先程のissuesにて少しづつ開発を続けていきました。

Switch自動化の歴史③ポケモン剣盾発売

そして時が経ち、2019年11月15日にポケモン剣盾が全世界で発売されると
今作の自動化のしやすさに注目が集まり、そこにレイド乱数調整という要素も加わって大きく(日本での)自動化界隈が成長するに至りました。
もう少し詳しく説明していきましょう。
発売直後、ランクマッチの後などに日付を変えるとペナルティなしで日付を変更できる所謂「チートモード」が発見され、それを利用したW稼ぎが編み出されました。(※レイド募集中に日付変更でも同じくペナルティを受けないことがわかっています)
そしてその作業がとても機械的に実行しやすいと思った有志の手により、Switch-FightstickをフォークしたArduino用無限W集めプログラムが5ちゃんねるにて公開されるに至ります。
そしてその同時期に、Arduino IDEを利用した「SwitchControlLibrary」も登場
Arduino microやその互換機で簡単に自動化を達成できるようになりました。

蛇足:なぜ日本はArduinoによる自動化が主流だったか

ここで皆さん思い出してください。
Switch-Fightstickはteensyというマイコンで海外では使われていました。
ではなぜ日本ではArduinoが主流なのでしょうか...?

答えは簡単、「入手性」です。
日本だと、teensyは入手が困難で、amazon等でもそれなりの高値で販売されています。
それに比べれば、Arduino UNOやmicro等の互換機は日本でも入手しやすくSwitch-Fightstickのmakefileを編集してコンパイルするだけでteensy用のプログラムを流用できる物であったので、日本ではArduinoでの自動化が加速していく事になりました。

蛇足2:レイド乱数調整におけるマイコンの活用法

さて、マイコンの利用は無限Wにとどまらずついに乱数調整との邂逅を果たします。
レイド乱数において、個体値等が変わるトリガーは日付変更にあります。そのため、seed特定後に自分の欲しい個体を手に入れるためには指定の回数日付を変える必要があるのです。
もし、その日付を変える動作をマイコンで自動化出来たら...?
そう、人より圧倒的に早くかつミスらず正確に消費をしてくれるわけです。この事が知れ渡ると、乱数調整界隈の間でもマイコンを買って消費を自動化する人が現れるようになりました。

蛇足3:自動化用PCソフトの出現

乱数調整/自動化界隈の人口が増えるという事は新しいツールが出てくるという事。
ポケモンやその他のゲームにも使える新たな自動化用ツールが現れることとなりました。
大抵のソフトはマイコンに指示を送るだけでなく、キャプチャーボード経由でswitchの映像を取得し、画像認識で指示を変えるなど以前より高度な自動化が達成できるようになっています。
(switchをマイコン経由でPCから操作する事に関しては、2018年に既に実現されています。)
全てを紹介するとこの記事が半端じゃなく長くなってしまうので、よく使われる2つの自動化ソフトを軽く紹介します。

NX Macro Controller

画像2

ぼんじり氏が制作しているWindows用自動化ソフトウェア
マイコン/Bluetoothでswitchに接続できる(この後の話に関係アリ)
簡単な構文で手軽にマクロが組め、画像認識も対応
専用の拡張子のファイルでマクロファイルを簡単に共有できる
Windows以外には対応していない

Poke-Controller

画像3

KawaSwitch氏が開発しているPythonな自動化ソフトウェア
Windows、linuxなどクロスプラットフォームで動く(ラズパイでも動く!)
画像認識にももちろん対応、特定のフォルダに.pyファイルを入れる事でマクロを増やすことができる
接続方法はマイコンのみ
Pythonで書かれていて、マクロもPythonで記述するためPythonの知識が必要

どちらを使うべきかはOSや環境によって変わりますが、WindowsであればNX Macro Controllerで間違いないでしょう。
...すみません、かなり贔屓目です
どっちが良いかは自分自身で試してみよう!!!!!!!!!!!!

Switch自動化の歴史④Bluetoothによる自動化の確立

Switch-Fightstickが誕生しても、Bluetoothによる自動化を諦めない有志の手により2020年1月23日に「joycontrol」が登場します。
これは、ソースコードが公開されているlinuxの「Bluez」を利用してlinuxのPC&ラズパイをコントローラーに偽装する仕組みのPythonプログラムです。
これにより、Bluetooth内蔵(もしくはドングルつき)のPCにおいて無線でswitchを操作できるようになりました。
※ただ、joycontrol自体はCUIで操作するアプリケーションでありマクロを組める物ではなかったため、実際に使われるようになったのは「joycontrol-pluginloader」が登場してからです。

Switch-Fightstickとの大きな違いは偽装しているコントローラーにあり、
それぞれ以下のコントローラーに偽装されています。

Switch-Fightstick・・・POKKENコントローラー
joycontrol・・・Nintendo Switch Pro コントローラー

なので実はボタンやスティックのデータを無線で送るだけでなく、Amiiboのデータをswitchに送りつけてゲーム内のアイテムを解禁する事も出来ました。(現在はライセンスの都合でrevertされています。)
ただ、このjoycontrolにも弱点がありまして...

Windowsでは仮想環境を作らないと実行できないのです

linuxのBluetoothモジュールを使っているのでしょうがないのですが...windowsユーザーにとっては致命的です。
これこそが、今でもなかなかBluetoothによる自動化が浸透しない原因だと私は考えています...いや、考えていました。これこそが後のwin移植に奮闘したみずようかんの原動力となりました。

joycon自動化Win移植奮闘記①リポジトリ探し

さて、これでおおよそ自動化界隈の軌跡をおさらいすることができました。(大分寄り道しましたが...)
ここからは、先に紹介した「NX Macro Controller」におけるBluetooth接続機能をどうやってWindowsで実現したのかを簡単に綴っておこうと思います。

前の章で言及した通り、joycontrolはlinuxでしか動きません。
だからと言って「仮想環境入れて」というのもユーザー側の負担が大きすぎます。
そのため、どうしてもWindows専用のプログラムで実現する必要がありました。
まずはWindowsでL2CAP(コントローラー用の通信プロトコル)を使えるBluetoothスタックを検索。あわよくばWindowsネイティブ/Pythonで実現したい!

検索結果....0件

はい。WindowsデフォルトのBluetoothスタックではL2CAPを使用することはできませんでした。
Pythonに至ってはWindows用のBluetoothラッパーは2~3件しかないという始末。(当然L2CAPは使えませんPythonしっかりしろ)

検索する事30分、ついにBluetoothドングルのドライバを置き換えることでL2CAP通信に対応するスタック「BTstack」を発見しました。
しかも先駆者がいたという偶然も相成り、使用するスタックはBTstackに決めました。

joycon自動化Win移植奮闘記②先駆者の屍

先駆者がいたと言ったな...あれは嘘...ではなくて、
プロコンの偽装には成功していなかったのです...(先駆者は途中で諦めてた)
さぁ困った。これではリファレンスとにらめっこしなきゃいけなくなると思った矢先、既にBTstackとesp32のライブラリを使ってプロコンの偽装に成功しているリポジトリを発見します。
...これはもしかして、esp32のライブラリで行っている処理をBTstackに移植すれば上手くいくのでは...!?
BTstackのリファレンスやissuesを行き来して書き進めると...(以下、進捗を報告するツイートです)

なんとかSwitchにプロコンとして認識させることができました。
しかし、まだボタンもスティックも一切実装されていない状態です。
ここから僕はさらに苦戦し始める事になります。が...

joycon自動化Win移植奮闘記③ぼんじりさんの手助け

乱数鯖で夜綱さん他と通話しつつ実装していたところ、
「NX Macro Controller」作者のぼんじりさんが登場。たまたまテキストチャンネルに投稿していた上記のプログラムを元に、
NXへの組み込み・コードの改善(ボタンとスティックデータの送信)&DLL化まで辿り着くことができました。
そしてそのNXのβ版を貰い、細かい修正を経て今日に至ると言うわけです。
こうして、Bluetoothドングル一個あればswitchを自動化できる環境が整いました。(詳しくはぼんじりさんの記事へどうぞ)

最後に

おそらくこの記事が投稿されている12月21日には、正式にアップデートが行われていることでしょう。400円(Bluetoothドングルだけ)からできるswitch自動化を是非楽しんでください。
拙い文章でしたが、Switch自動化の歴史を少しでも理解できたなら私も嬉しいです。最後に一言書いてこの記事を終わろうと思います。

みんなNXを使おう!!!!(ダイマ)





ここから先はデベロッパ向け情報

長々と書いた移植奮闘記で完成したAPIを公開中です。
WindowsでSwitchを自動化するソフトウェアを開発している方、是非見てみてください。


この記事が気に入ったらサポートをしてみませんか?