聖遺物の画像からスコアを計算する方法

選択した画像から聖遺物のサブステータスを抽出し、スコアを計算・表示します。
サブステータス全体が写っている画像であればどの画像でも読み取れます。
※聖遺物強化画面は非推奨

ゲーム画面を直撮りした写真でも実行できますが、精度は低いかもしれません。

### レシピ

https://www.icloud.com/shortcuts/32985ec5f9d54e0d91614c4db66669c6

### 使い方

1. サブステータス全体が写っている聖遺物の画像を選択します。
2. 計算に含むステータスを選択します。
3. スコアが表示されます。

![RPReplay_Final1699167763.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/61e65d9f-69c3-8dbc-66d9-706698689ada.gif)

### 計算方法

以下の計算方法を採用しています。

HP: `HP+会心率×2+会心ダメージ`
攻撃力: `攻撃力(%)+会心率×2+会心ダメージ`
防御力: `防御力(%)×0.8+会心率×2+会心ダメージ`
元素チャージ: `元素チャージ×0.9+会心率×2+会心ダメージ`
元素熟知: `元素熟知×0.25+会心率×2+会心ダメージ`

### 対応端末
- iPhone
- iPad
- MAC

### 解説

大まかな流れとしては以下です。

- 画像からテキストを抽出
- 中点から始まる行をサブステータスと判断
- 計算に含む項目をステータス名とパーセントの有無から判断
- 計算して計算結果を出力

以下に詳しい解説を記載します。
非エンジニアの方にもわかるように書いたつもりですが、無意識のうちに専門用語を使っているかもしれません🙇‍♀️

使用する画像はこちらです。
弊ワット最強聖遺物です。

![IMG_5409.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/97a82d95-7427-75d6-26bb-5d0ff6ffaeef.png)

上記の画像から、テキストを抽出してみます。

![IMG_5456.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/3a2a4bed-8305-3fd2-f56b-5fb5c1c62bdf.jpeg)

```
生の花／金メッキのコサージュ
◆詳細
◆強化
金メッキのコサージュ
生の花
HP
4,780
+20
•攻擊力+5.3%
・元素熟知+44
・会心ダメージ+28.0%
•会心率+6.6%
沈淪の心：
◎2セット：水素ダメージ＋15%。
4セット：元素スキルを発動した後の1
ストーリー
◎クイック装備
UID: 800123665
```

サブステータスの行は中点から始まることがわかりました。
続いて、中点から始まる行を抽出します。

![IMG_5473.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/ba84d806-9c86-0d5f-f742-0c96f4846d66.jpeg)

`[・•].*`は「全角中点(・)または半角中点(•)から始まる文字を取得する」といった意味になります。詳しくは「正規表現」で調べてみてください。

サブステータスを４つ抽出できました。
４つ一気に処理するのは難しいので、１つずつ繰り返します。

![IMG_5474.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/57eb9a96-2811-0247-ab20-e7f96946ef82.jpeg)

「各項目を繰り返す」で抽出したサブステータスの数（4）だけ繰り返されます。
「繰り返し項目」には、１巡目は１つ目のサブステータス（•攻擊力+5.3%）２巡目は２つ目のサブステータス（・元素熟知+44）が格納されます。

聖遺物のスコア計算では、「攻撃力(%)」「会心率」「会心ダメージ」を使って計算するのが一般的です。
抽出したサブステータスがこれに当てはまるかどうかを確認します。

![IMG_5475.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/85ef59f2-0fbe-8726-dacb-f0c4155060e4.jpeg)

`(攻撃|攻擊|会心).*`
これもまた正規表現です。「攻撃・攻擊・会心から始まる文字を取得する」と言った意味になります。

<details><summary>余談：攻撃が2個ある理由</summary>

なぜ攻撃が２つあるかわかりますか？
今まで「攻撃力」だと思っていた１つ目のサブステータス、実は

![IMG_5475.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/db4ce34d-e0b2-eeea-8d28-bd3363013108.jpeg)

「攻擊力」でした。
このテキストから文字を抽出する技術(OCR)、iOS16(2022/09/13〜)で日本語が対応されたばかりでまだまだ性能が低かったりします。
中点が半角になったり全角になったりしてるのもそうです。

</details>

これで計算に含むステータスを抽出できました。
次に、計算するために数字を抽出します。

![画像.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/a86f65f6-d318-2b7e-0643-5153d89ba474.jpeg)

計算に含むステータスの場合、`\d.`(数字と小数点)を抽出しています。
たまに小数点が`,`になっていることがあるので、`,`を`.`に置き換えてから抽出しています。

ここまできたらあとは計算するだけです。
スコアの計算式は、
`スコア=攻撃力(%)+会心率×2+会心ダメージ`
なので、

![IMG_5480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/824bc2e8-aee3-be13-5b56-c5ead987314d.png)

攻撃力・会心ダメージに1、会心率に2をかけ、

![IMG_5482.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3583885/b99d3a62-11d2-8811-b5cc-b0e34486ae66.png)

計算に含むステータスではない場合を0として合計を計算して完成です！

`5.3+0+28.0+6.6×2=46.5`

上記で配布しているレシピでは、攻撃力以外の計算方法でも計算できるようにしています。
興味がある方はぜひダウンロードして中身をのぞいてみてください。
わからない箇所があれば、質問していただければお答えします！

長々とお付き合いいただきありがとうございました。
これを機にプログラムやエンジニアに興味を持っていただけたら嬉しいです。

以上！エンジニアの卵から孵化したばかりのひよこちゃん。でした🐣