Among Us Launcher的なのを自作した録

# はじめ
みなさん、Among Us楽しんでますか？
えぇ、とりあえずYouTuberの動画でも見るといいですよ。
というわけで、`Among Us`の記事は2回目、`Python`の記事はn度目ですよろしくお願いします。

# さっさとインストールしたい人向け
下の方に技術的解説も載せてます。気になる人は見てみてください。

## 0. Requirements
まず、このLauncherは、主の開発環境であるEpic版Among Usでのみ試しています。Steam版でも動くかもしれませんが、メインストリーム的サポートは全くもってしません。

まず、Among Usに事前にModを入れたりしてる場合は一回Among Usを消して再インストールした方が良いかもしれません。
その方が、色々なMODを入れられるのでバニラの状態のAmong Usにしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/5fa505dc-12e2-cfd9-3424-b3b51e353da8.png)
(多分バニラ状態のEpic版Among Us)

## 1. Copy Game
MODを導入したい数だけ、Among Usのフォルダーをコピペして増やしておきましょう。
私は`Town Of Host`や`Super New Roles!`をメインに使い、更にバニラも残してあるので追加で3つ増やしておきます。
その時、ちゃんと元のフォルダも残しておきましょう。でないと起動できなくなっちゃいますよ！

<details>
<summary>ざっとしたフォルダ構成</summary>

```
D:/-+-/AmongUs
    +-/AmongUs_SNR
    +-/AmongUs_TOH
    +-/AmongUs_Vanilla
```
(WindowsのTreeコマンド風)
</details>

そしたらそれぞれのフォルダの中に対応するMODでも入れておきましょう。

### 1-1. Town Of Host

https://github.com/tukasa0001/TownOfHost/releases/latest

こちらのページの下部の方に`TownOfHost-X.X.X.zip`というファイルがあると思うので、それをダウンロード・解凍します。

そしたら、Town Of Hostを導入したいAmong Usのフォルダ（`Among Us.exe`があるフォルダ）に中身をコピペします。

### 1-2. SuperNewRoles!

https://github.com/SuperNewRoles/SuperNewRoles/releases/latest

こちらのページの下部の方に`SuperNewRoles-vX.X.X.X.zip`というファイルがあると思うので、それをダウンロード・解凍します。

そしたら、SuperNewRoles!を導入したいAmong Usのフォルダ（`Among Us.exe`があるフォルダ）に中身をコピペします。

## 2. Overwrite Application

https://github.com/nattyan-tv/amongus_launcher/releases/latest

リンクの中にある`AmongUsLauncher.zip`をダウンロードして解凍してください。
中身にある`Among Us.exe`がランチャー本体です。
`Among Us.exe`という名前ですが、これはゲームではなく __ランチャー本体__ です。
そしたらこの`Among Us.exe`を、もともと`Among Us`がインストールされていたフォルダの中に上書きで入れてください。

## 3. Setup Application

__Epic Games LauncherもしくはSteamから__`Among Us`を起動してください。
そしたら、Among UsではなくLauncherが起動すると思います！

では、セットアップを行っていきましょう。
このランチャーでは、それぞれのAmong Usのことを「インスタンス」と呼びます。
まずはインスタンスを追加していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/bd364221-66f5-3979-1201-ac58874efc06.png)

「インスタンスの追加」の所に、「インスタンス名」と「追加したいAmong Usのフォルダ(`Among Us.exe`があるフォルダ)」を入れます。
「インスタンスを追加」ボタンを押すと追加されます。

## 4. Launch Game

Among Usを起動するときは、青色になっているインスタンスの名前をクリックします。
すると、対応するAmong Usが起動します。

# やぁ！僕は（ベントに入れない）エンジニア！

ここから先は技術的な解説になりますので、暇な人だけ見てみてください。

さて、このLauncherを一言で説明するなら、起動引数を保持してインスタンスに渡すことで正規Launcherに偽装するような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1107984/66d7fe66-b7b3-4dba-3c66-a0df585b26e6.png)

## `Among Us.exe`のそもそもの仕様

まず、`Among Us.exe`をダブルクリックしても、通常は起動しないと思います。（少なくともEpic版は）
それはなぜなのかというと、Among Us側が起動したユーザーが誰かわからずログインが出来ないという所にあります。（もしかしたらライセンスなどの理由もあるかもしれない）
じゃあ、僕たちがエクスプローラーで`Among Us.exe`をダブルクリックするのと、EpicGamesLauncherやSteamから`Among Us.exe`を起動するのでは何が違うのでしょうか？
理由は単純で、EGLやSteamから起動するときは、`Among Us.exe`に追加で「ユーザーID」や「ログイントークン」などを渡しているからです。
この、アプリケーション起動時に渡せるデータを「[起動引数](https://wa3.i-3-i.info/word11643.html)」（ちょっと端折った）と言います。

例えばPythonでプログラムを実行する際は
```sh
$ python main.py
```
という風に実行すると思うのですが、この`main.py`以下が、`python`というプログラムに渡す起動引数になります。

さて、この起動引数、通常は我々ユーザーが渡す事はできません。
エクスプローラーからプロパティで設定したり、ターミナル(PowerShell/コマンドプロンプト)から`"./Among Us.exe" ...`と引数を設定して起動することは出来ますが、我々はEGCやSteamがどんな引数を渡しているのか分かりません。
先ほど、ユーザーIDとトークンを例に出しましたが、そのトークンをどこから取得するのかなどは分かりません。もしかしたら、トークンは随時生成されているものかもしれません。
なので、このような **動的に起動引数を受け渡すランチャー** が必要になってくるんですね。

## プログラム

もともと、`SuperNewRoles!`でみんなでアモアスをやってたところ、ある方に`「エンジニア使えない！！！！」`と言われて、「あぁじゃあまぁバニラアモアス起動するかぁ」ってなった時に、「これランチャー的なのあったら便利だよなぁ...」となってCLIアプリケーションとして作りました。
その時はまだ、コマンドライン引数でトークンなどを渡していると知らずに、ただ`subprocess`で他の`Among Us.exe`を起動するだけのアプリでした。
使えないなぁこれってなってから数ヶ月経って、もう一回作り始めて、タスクマネージャーのコマンドライン引数と睨めっこしながら今のGUIアプリケーションに至りました。

言語は`Python`で、Pyinstallerを使って`.exe`化しています。
GUIフレームワークは`Flet`で、`React`みたいな感じのを`Python`で書けるってものです。

仕様としては、まずこのランチャー本体を`Among Us.exe`として偽装して、ランチャーに起動させます。
すると、このランチャーは`sys.argv`に引数を保持しているので、それをそのまま別のインスタンスに渡せば良いだけの話ってわけです。難しい事はしてません。
難しい事はしてないので、簡単にonefileパッケージ化出来るって訳です。

ビルドとかしてみたい方は以下からどうぞ。

https://github.com/nattyan-tv/amongus_launcher/

近アモやMOD解説を少しだけした1回目の記事はこちらから。

https://qiita.com/nattyan_tv/items/292ad7828a344b005f88

# Extra
Town Of Host、SuperNewRolesはただ私が好きってだけで、一切関係ないです。
TOH、SNR作者様へのお問い合わせはご遠慮ください。