Slay the SpireをAIにプレイさせる方法

# 本記事について
大人気ローグライクゲーム「Slay the Spire」を「spirecomm」というライブラリを使用してサンプルのAIにプレイさせました。
そのAIにプレイさせる具体的な方法を紹介します。

# AIのプレイ動画
https://x.com/miya00907380/status/1821304273348808935

https://x.com/miya00907380/status/1836223174452879573

Act3の50階層のボスを倒すまでのAIのプレイ動画です。
鍵を入手していなかったため、Act4には到達できませんでしたが、基本的には優秀なAIであり、終始危なげなくプレイしていたという印象を受けました。

# Slay the Spireとは
Mega Crit Gamesが開発した、非常に人気の高いデッキ構築型ローグライクゲームです。
プレイヤーは塔を登りながら、各階層でモンスターと戦い、新しいカードやアイテム（レリック）を獲得し、それらを使用してデッキを強化していきます。
数百種類のカードとレリックが存在し、遭遇する敵やイベント、入手できるレリック、塔構造などがランダムなため、高い戦略性が求められ、再プレイ性の高いゲームとなっています。
コミュニティが活発で、多くのMod（一般ユーザーが公開した、本ゲームの要素や機能を変更するためのプログラム）が無料で公開されています。

# spirecommとは
Slay the Spireと外部プロセスを通信するためのPythonライブラリです。
本ゲームから外部プロセスに現在のゲームの状態（プレイヤーの手札、デッキ、体力、敵の状態など）を送信したり、外部プロセスからゲームにコマンド（ゲーム開始、カードの使用、ターンの終了など）を送信したりできます。
本ライブラリを使用することで、外部のAIに本ゲームを自動プレイさせたり、AIに強化学習させることが可能です。
本ゲームをプレイするサンプルのAIが付属されており、今回このサンプルAIにプレイさせました。

# 実行環境
- MacBook Air
- Apple M2
- macOS Sonoma 14.5
- Python 3.11.5
- pip 24.3.1
- zsh 5.9 

# 準備するプログラムと設定ファイル
## Steam
https://store.steampowered.com/about/

Slay the Spire本体とModを入手するために必要です。
上記公式サイトからインストールしてください。

## Slay the Spire(Game)
https://store.steampowered.com/app/646570/Slay_the_Spire/?l=japanese

Slay the Spire本体です。Steamストアページから購入・インストールしてください。
インストール後は、以下の場所に配置されます。

```
~/Library/Application Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app
```

## spirecomm
https://github.com/matthewReff/spirecomm?tab=readme-ov-file

以下のコマンドを実行してインストールしてください。
Pythonは3.5以上のバージョンである必要があります。

### インストール用コマンド
```zsh
cd ~
git clone https://github.com/matthewReff/spirecomm.git
cd spirecomm
python3.11 -m venv myenv
source myenv/bin/activate
pip install --upgrade pip==24.3.1
pip install .
```


## ModTheSpire
https://steamcommunity.com/sharedfiles/filedetails/?id=1605060445

Slay the SpireにModを適用するためのランチャーです。
上記のSteamワークショップから入手してください。
上記ページのサブスクライブボタンを押すと、以下の場所に自動的にダウンロードされます。

```
~/Library/Application Support/Steam/steamapps/workshop/content/646570/1605060445/ModTheSpire.jar
```

ダウンロード後、以下の場所に移動させてください。

```
~/Library/Application Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources/ModTheSpire.jar
```

### インストール用コマンド
```zsh
cd ~/Library/Application\ Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources
mv ~/Library/Application\ Support/Steam/steamapps/workshop/content/646570/1605060445/ModTheSpire.jar .
ls -l ModTheSpire.jar
```

## MTS.sh
ModTheSpireを起動するためのスクリプトです。以下の場所に作成してください。
```
~/Library/Application Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources/MTS.sh
```

作成したMTS.shに実行権限を付与し、以下の内容を記述してください。
```sh
#!/bin/sh
cd ~/Library/Application\ Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources
./jre/bin/java -jar ModTheSpire.jar
```

### インストール用コマンド
```zsh
cd ~/Library/Application\ Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources
touch MTS.sh
chmod u+x MTS.sh
ls -l MTS.sh
```
```zsh
setopt interactivecomments
vim MTS.sh # 内容を編集
```

## BaseMod
https://steamcommunity.com/sharedfiles/filedetails/?id=1605833019&searchtext=basemod

Slay the SpireのModの導入・開発を支援するためのModです。
同様に上記のSteamワークショップからサブスクライブボタンを押し、ダウンロードしてください。
本Modは以下の場所に自動的に配置されます。
```
~/Library/Application Support/Steam/steamapps/workshop/content/646570/1605833019/BaseMod.jar
```

本Modを以下の場所に移動してください。
```
~/Library/Application Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources/mods/BaseMod.jar
```

### インストール用コマンド
```zsh
cd ~/Library/Application\ Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources
mkdir -p mods
cd mods
mv ~/Library/Application\ Support/Steam/steamapps/workshop/content/646570/1605833019/BaseMod.jar .
ls -l BaseMod.jar
```


## Communication Mod
https://steamcommunity.com/sharedfiles/filedetails/?id=2131373661&searchtext=communication+mod

Communication ModはSlay the Spireと外部プロセスとの通信を可能にするModです。
このModを使用することで、ゲームの状態を外部プロセスに送信したり、外部プロセスからゲームにコマンドを送信したりすることができます。
spirecommと似ていますが、spirecommはこのCommunication Modを利用して、ゲームを簡単に制御できるようにするためのPythonライブラリです。
Communication ModはJavaで書かれています。

同様に、上記のSteamワークショップから入手してください。

本Modは以下の場所に配置されます。
```
~/Library/Application Support/Steam/steamapps/workshop/content/646570/2131373661/CommunicationMod.jar
```

以下の場所に移動してください。
```
~/Library/Application Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources/mods/CommunicationMod.jar
```

### インストール用コマンド
```zsh
cd ~/Library/Application\ Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources
mkdir -p mods
cd mods
mv ~/Library/Application\ Support/Steam/steamapps/workshop/content/646570/2131373661/CommunicationMod.jar .
ls -l CommunicationMod.jar
```

## config.properties
Communication Modの設定ファイルです。

以下の場所に作成してください。
```
~/Library/Preferences/ModTheSpire/CommunicationMod/config.properties
```

そして以下のような内容を記述してください。

```
verbose=false
command=python /Users/miya/spirecomm/main.py
runAtGameStart=true
```

verboseは詳細なログを表示するためのフラグです。
commandはプレイさせるAI（main.py）のパスです。"/Users/miya"は著者のホームディレクトリですので、ご自身のホームディレクトリに置き換えてください。。"~"は使用できないようです。
runAtGameStartは、ゲーム起動時に自動的にAIにプレイさせるかを指定するフラグのようです。

### 作成用コマンド
```zsh
mkdir -p ~/Library/Preferences/ModTheSpire/CommunicationMod
cd ~/Library/Preferences/ModTheSpire/CommunicationMod
```
```zsh
setopt interactivecomments
vim config.properties # config.propertiesの内容を編集
```


# AIにプレイさせる方法
上記のプログラムと設定ファイルの準備が完了後、MTS.shを実行し、ModTheSpireを起動します。
すると、以下のようなランチャー画面が表示されます。

![ModTheSpire.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633154/7b6246c5-5788-fda9-2e6b-7da000838a09.png)


BaseModとCommunicationModにチェックを入れ、Playボタンを押すとAI（main.py）によるプレイが開始されます。

### ModTheSpireを起動するためのコマンド
```zsh
cd ~/spirecomm
source myenv/bin/activate
~/Library/Application\ Support/Steam/steamapps/common/SlayTheSpire/SlayTheSpire.app/Contents/Resources/MTS.sh
```