【Go/TUI】使徒に侵食される気分になれるツール作ってみた

# 作ってみた

https://github.com/kuredev/ireul

![ireul.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50690/ed2a0ea5-2ae6-d60a-074e-4123a6278b13.gif)

### 感謝

以下ガイドラインを参照しています。

https://www.khara.co.jp/guideline/

# 背景・動機

- Goの勉強
- TUIツールの作り方の勉強
- 楽しいことをしたかった

# 使い方

Linux/amd64の場合は[こちら](https://github.com/kuredev/ireul/releases)からバイナリをDLして、実行

```zsh
wget [ireul_vxxx_amd64_linux.zipのURL]
unzip [zipファイル名]
chmodu u+x ireul
./ireul
```

それ以外の環境ではGoの動作する環境で以下のように実施

```sh
git clone git@github.com:kuredev/ireul.git
go run main.go
```

# 作り方のメモ
## 動き

アルゴリズムで侵食や回復の動きを作れたらかっこいいなと思いつつ、仕組みはパラパラ漫画です。
各状態のアスキーアートを1ファイルずつ準備して、それっぽくなるよう sleep させつつ順次表示しています。

### 例

```txt:1ファイル目
                          H """""""""""""""""""""" H
                          H                        H
                          H                        H
+-+-+-+-+-+ +-+-+-+       H                        H
|C|O|D|E|:| |2|6|3|       H                        H
+-+-+-+-+-+ +-+-+-+       H                        H
                          H                        H
                          H                        H
                          H                        H
                          H                        H
H (((((((((((((((((,      .W.                    .B          ((((((((((((((((( H
H                  .YJ.      7W,               .J"        .T^                  H
H                     TQ,       TN,          .H^       .J"                     H
H                       (h,        """"""""""        .T^                       H
H                         .Ta.                    .J"                          H
H                            7H,               ..T'                            H
H                              (S,            J"                               H
H                               H            H                                 H
H                               H            H                                 H
H                               H            H                                 H
H...............................H            H.................................H

```

```txt:2ファイル名
                          H """""""""""""""""""""" H
                          H                        H
                          H                        H
+-+-+-+-+-+ +-+-+-+       H                        H        +-+-+-+-+-+ +-+-+-+
|C|O|D|E|:| |2|6|3|       H                        H        |Under Deliberation|
+-+-+-+-+-+ +-+-+-+       H                        H        +-+-+-+-+-+ +-+-+-+
                          H                        H
                          H                        H
                          H                        H
                          H                        H
H (((((((((((((((((,      .W.                    .B          ((((((((((((((((( H
H                  .YJ.      7W,               .J"        .T^ MMMMMMMMMMMMMMMMMH
H                     TQ,       TN,          .H^       .J"MMMMMMMMMMMMMMMMMMMMMH
H                       (h,        """"""""""        .T^ MMMMMMMMMMMMMMMMMMMMMMH
H                         .Ta.                    .J"MMMMMMMMMMMMMMMMMMMMMMMMMMH
H                            7H,               ..T'MMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H                              (S,            J" MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H                               H            H MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H                               H            H MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H                               H            H MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H...............................H            H.................................H
```

## 実装

表示部は [tcell](https://github.com/gdamore/tcell) というツールを使っています。

ファイルの内容を1Byteずつ表示しつつ、侵食されている部分は `M` で表示しているため、そこだけ色を変えるようにしています。

```go:主な表示処理部抜粋
bytes, err := files.ReadFile(fileName)
if err != nil {
	panic(err)
}
s := string(bytes)
x := 1
y := 1
for _, c := range s {
	if string(c) == "\n" {
		x = 1
		y = y + 1
	} else {
		if string(c) == "M" {
			screen.SetContent(x, y, c, nil, tcell.StyleDefault.Foreground(tcell.ColorRed))
		} else {
			screen.SetContent(x, y, c, nil, tcell.StyleDefault.Foreground(tcell.ColorDarkCyan))
		}
		x = x + 1
	}
}
screen.Show()
```

# その他

- 推しはマヤ、日向、青葉のオペレーターズ
- 感謝：

https://tool-taro.com/image_to_ascii/