みんなでFactorio!! --EC2でマルチプレイ--

# はじめに
エンジニアならみんな大好きFactorioの初正式版が、昨年8月にリリースされたのは記憶に新しいですが、2021年1月26日に次の安定版1.1.19がリリースされました。
今回、これを機にメンバーをFactorio沼にハメてやろうと思い、EC2にマルチプレイ用のサーバを立てたので、その手順をメモしておきます。

# 前提
<dl>
  <dt>Factorioを購入済み</dt>
  <dd>当たり前といえば当たり前ですが、プレイする人全員購入する必要があります。</dd>
  　<dt>Factorioアカウントを作成済み</dt>
  <dd>公式ページから無料でできます。Steamアカウントでも代用可能っぽいです（未確認）。</dd>
　　<dt>EC2構築済み</dt>
  <dd>気分でt2.mediumで構築しました。が、microでも動くんじゃないかなー。</dd>
　　<dt>EC2にEIPを割り当て</dt>
  <dd>毎回接続設定変えるのがめんどくさいので、、、</dd>
　　<dt>Mac環境</dt>
  <dd>すみません、Mac環境のみ対象です。Windowsの場合は適宜読み替えればできると思います。</dd>
</dl>

# 1. EC2の穴空け作業
セキュリティグループのインバウンドに以下を設定
- SSH（マイIPにしてね）
- UDP（ソースは任意）今回はカスタムポート番号を使うので、ポート：34198で設定
※Factorioサーバのデフォルトポートは34197番です。

# 2. EC2にソースを配置
今回はSSHできる環境なはずなので、SCPでアップロードする手順にします。サーバ上でファイルを直接取り込んでも問題ないです。

## 公式サイトから最新安定版を入手
https://factorio.com/get-download/1.1.19/headless/linux64
上記をローカルにダウンロードする。（2021/01/27現在の最新安定版）
[公式サイト](https://factorio.com/download)から選んでダウンロードでもOKです。
その場合、ダウンロードファイルはlinux64を選択してください。
 
最新安定版を落とす理由ですが、Steam等でプレイするFactorioクライアントとバージョンを合わせるためです。
クライアントとサーバのバージョンが一致していないとプレイできません…

## scpでEC2にソースを配置

```
scp -i PEMの場所.pem ~/Downloads/factorio_headless_x64_1.0.0.tar.xz ec2-user@IPアドレス:~
```
## 解凍

```
xz -dv factorio_headless_x64_1.1.19.tar.xz
tar xfv factorio_headless_x64_1.1.19.tar
```

## factorioディレクトリに移動
上記手順でfactorioディレクトリが作成されているはずなので、移動します。
以降はfactorioディレクトリ配下で実行します。

```
cd factorio
```

# 3. 初回起動と動作確認

## セーブデータ作成

```
./bin/x64/factorio --create ./saves/my-save.zip
```

## 34198番ポートで起動

```
./bin/x64/factorio --start-server ./saves/my-save.zip --port 34198
```

## 動作確認
コンソール画面は閉じないように気をつけてください。
```Factorioのクライアントを起動→マルチプレイ→アドレスに接続```
ここでFactorioアカウントを求められると思うので入力。
```パブリックIP:34198```の形式でアドレスを入力し、接続！
無事にマップが表示されたら成功です。

そのままゲームを続けても良いですが、好きなマップにしたいのと、コンソール閉じても大丈夫なように、以降の手順で設定します。

## 一旦、終了
クライアント側Factorioを終了し、コンソールで起動しているサーバ側Factorioを```CTR+C```で終了します。

# 4. 好きなマップ作成と設定変更

Factorioはなんといっても、好きな条件でマップを厳選するのが醍醐味！
マルチプレイ向きの過酷な設定にしてもよし、初心者向け設定にしてもよし！

## クライアント側Factorioで好きなマップのセーブデータを作成
まず、クライアント側Factorioを起動し、ニューゲームで好きなマップを作成してください。
余談ですが、気に入ったシード値を保存しておくと、いろんなマップを比較できます。
ゲームスタート後、好きな名前でセーブして、ゲームを終了してください。

## セーブデータをサーバに配置
1. Macの場合、以下の場所にセーブデータがあるので移動します。
2. lsコマンドで目的のセーブデータのzipファイルがあることを確認してください。
3. 最後に、scpしやすいようにDownloadsディレクトリにセーブデータをコピーします。
4. scpで、サーバ上の```~/factorio/saves```配下にzipファイルをアップロードします。

```
cd ~/Library/Application\ Support/factorio/saves
ls →さっきつけた名前のセーブデータを探す
cp favorite-map.zip ~/Downloads
scp -i PEMの場所.pem ~/Downloads/favorite-map.zip ec2-user@IPアドレス:~/factorio/saves
```

## config.iniを編集
上記手順3にて、一度でもサーバを起動していれば、```~/factorio/config```配下に```config.ini```ファイルがあると思います。
今回は、オートセーブの設定と起動ポートを変更します。

```
autosave-interval=15
autosave-slots=2
port=34198
```

# 5. サーバ永続化
コンソールを閉じてもFactorioを起動しっぱなしにして、24時間インできるようにします。

```
nohup ./bin/x64/factorio --start-server ./saves/favarite-map.zip > /dev/null 2> /dev/null &
```

## 終了
永続化時の終了は、Factorioのプロセスを探してキルしてください。

```
$ ps aux | grep factorio
$ kill [PID]
```

## あとは遊ぶだけ
動作確認時と同じ方法でサーバに接続し、好きなマップでマルチプレイを楽しんでください！

# 6. アップデート
[参考文献1](https://qiita.com/nanocloudx/items/f0612595cf334aef18b8)を参照ください。
自分でもできたら記事更新します。（今のところやる必要がないため）

# 参考文献
1. [factorio headless server の準備](https://qiita.com/nanocloudx/items/f0612595cf334aef18b8)
2. [factorio official wiki: Multiplayer](https://wiki.factorio.com/Multiplayer)