hyperSSCの機能解説用の記事です。
この記事ではhyperSSCの機能とその仕組について解説します。
この記事は公開されていますがグーグル等の検索クローラにはインデックスされないようにしています。検索してもなかなかこのページにはたどり着けないようになっています。
その理由などは開発事情編に書いてあるので併せて読んでください。
hyperSSCとは
NintendoSwitchへの入力(コントローラー)を制御するツールです。
名前はhyper Switch Serial Controllerの略です。
言語はC#でフレームワークはWPFです。このソフトウェアの公開予定はありません。
hyperSSCでSwitchを操作する仕組み
イメージしやすいように簡略化してあります。
通常Switchを操作するには市販のコントローラーを使います。純正のProコンであったりジョイコンであったりHORIコンなど。
hyperSSCではこのコントローラーの部分がマイコンになっています。マイコンにはプログラムを書き込むことができ「PCから送られてきた信号をProコントローラーの信号としてSwitchに送る」というプログラムが書き込んであります。
(普通のコントローラーも中身はマイコンで仕組みも同じです)
Switchはマイコンから受け取った信号を『おっ、これはプロコンさんの入力だな』という風に受け取り、処理してくれます。
入力を制御するメリット
- 人力では困難な入力を行える
- 同じ入力を延々と行える
hyperSSCでは1フレーム単位で入力を制御できるようにしています。なので1秒間に60個のコマンドを正確に入力したりなど人力ではとても困難なことができます。
ZL→A→B→X→Y→A→B→X→Y→ZRを1セットで1秒間に6回行ったもの。
1秒間に60回の制御にしてありますがSwitch本体はもっと細かい間隔での入力を受け付けています(正確には調べていませんが何倍、何十倍程度ではありません)
難しい入力だけでなく延々と同じ操作を行うことも大きな利点です。これはオンラインゲームなどでよく聞く「マクロ」と呼ばれるものですね。
市販のコントローラーにこのマクロ機能が付いたものもあります。
hyperSSCはこのマクロの作成を簡易にできるようになっています。
hyperSSCの機能
全てを細かく説明したところで需要がないと思うので、私が紹介したい部分だけを。
- ゲームパッドの入力を取得
- 入力をキーとタイムラインで編集できる
- ゲームパッドの入力の可視化
- シリアル通信
とりあえずこの4つを。
ゲームパッドの入力を取得
DirectInput、XInputどちらにも対応しています。SlimDXのAPIを使用しています。
ゲームパッドの入力を好きなボタンに割り振ることができます。連射設定もありますが使っていません。スティックは感度を調整できるようになっています。
深く倒しこまなくても倒した状態にしたり、その逆も。コントローラーでマクロを開始できるボタンもあります。
入力をキーとタイムラインで編集できる
動画や音楽の編集ソフトと同じようにタイムライン上にキーを配置して入力を編集できるようになっています。このようなツールを使わない場合は、少しの入力でも全て手書きでプログラムを書く必要があるのでとても大変です。そのような作業を毎回されている方にとっては神ツールだと思います。
このようなGUIもゼロから作ったのでとても苦労しました。参考になるサンプルもほとんどありませんでした。私のような趣味プログラミングでは難しいところでしたが本職の方ならサクサク作れたりするのでしょうね。
ゲームパッドの入力の可視化
何度か私のスマブラSPの動画に出てきたGCコンを模した入力可視化ウィンドウ。最終的に送る入力を表示させています。デザインは自由に変更できます。
シリアル通信
上の仕組みを解説した画像ではPC → マイコン → Switchとなっていますが正確にはもう1つマイコンがあります。
PC → マイコン[シリアル通信用] → マイコン[Proコン偽装] → Switch
マイコンはもちろん「はんだ付け」などの作業も必要です。
実現可能な機能・アイディア
- 入力の記録
- 人力入力とマクロの合成
- 同じ入力を送る(シンクロ)
- AIによるゲーム攻略
1つ目の入力の記録は既に実装してあります。常時記録した状態で5分を超えた場合は古いところから上書きされるようにしていました。5分間記録したあとに入力をタイムライン上のキーに変換したところで問題に気づいたので記録時間を1分に短縮しました。
問題はスティックの入力です。スティックの入力は2次元の数値になっていてボタンのようにオンオフだけではなく[XXX, YYY]のような数値になっています。
最大で1秒間に60個のキーが作られるのでこれを後で見たり編集したりするのは非常に困難だということが分かりました。
記録した入力の再編集が満足にできなかったとしても入力を再現できるというのは非常に有用なものです。ゲームをプレイしていて自分の入力でも「今のどうやった?」と思うことはよくあると思います。それを確認できるのはすごく便利です。
人力入力とマクロの合成も既に実装しています。これは例えばマクロでA→A→Bという操作を永遠にループさせているとします。この入力にゲームパッドで操作した入力も合わせて送ることができます。
マリオデの無限種ジャンプの動画でこの機能を使用していました。
種投げ→飛び込み→再キャッチという操作は全てマクロで行っていますが、それ以外のゲームプレイは全て通常の入力になっています。
市販のマクロ機能があるコントローラーでも同様の仕組みがありますが、PCを使用しているだけに精度には大きな差があります。
同じ入力を送るシンクロ操作も既に実装しています。こちらはマイコンを複数個使用するだけです。マイコンの性能によって若干のズレが出る可能性もあるので同性能のものを用意するのが好ましいですが、もちろんPC側で制御することも可能です。
AIによるゲーム攻略は技術は全て揃っていますが私にそのようなプログラムを作る知識はありません。やるならまずはPC用のゲームからですね。
以上でとりあえず紹介したい内容は書けました。コメントは開発事情編も読んでからお願いしますね!質問やアイディアの提供もいつものようにしてください。
「私もやってみたい!」という人でプログラミングにも挑戦する気がある人がいればそちらの細かい話にも答える知識は持っているので抵抗がなければメールで聞いてください。
マイコンの調達や組み立てなどもあるのでハードルは高そうです。
追記 2019-11-30
Switchとキャプチャを増設したので複数本体に同じ入力を送るテストをしました。
今回はポケモンの無限ワットを試してみました。
若干ズレているところがあるのはキャプチャの遅延、Switch本体の性能によるものです。
プログラムの方は特に力を入れて組んだので精度には自信があります。
今更ながら質問失礼します。もしかしてマイコンに書き込むSwitch-Fightstickのコマンドなどを少しいじってたり、簡易化させたりしてますか?私も検証の為に似たようなものを作りたいので詳しく教えて欲しいです。