PowerApps GameDev#4 魔法管理テーブルを作り、魔法を簡単に追加実装できるようにする。

# 本日のゴール
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">もしかして何がしたいのかよくわからんって人もいるかもしれないから<br>ちょっとわかりやすくしてみた。<a href="https://twitter.com/hashtag/powerapps?src=hash&amp;ref_src=twsrc%5Etfw">#powerapps</a> <a href="https://twitter.com/hashtag/game?src=hash&amp;ref_src=twsrc%5Etfw">#game</a><a href="https://twitter.com/hashtag/RPG?src=hash&amp;ref_src=twsrc%5Etfw">#RPG</a> <a href="https://t.co/3fv6ubTUVY">pic.twitter.com/3fv6ubTUVY</a></p>&mdash; りなたむ@steed400 (@R_t_A_n_M) <a href="https://twitter.com/R_t_A_n_M/status/1083518216960233472?ref_src=twsrc%5Etfw">January 11, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# そもそもなんだこれは？？
ロールプレイングゲームにおいて
魔法っていうのは、戦略性の幅を大きく広げる重要な要素ですので
言葉は違えど、ほとんどのゲームで採用されているものです。
しかも、その種類が豊富であればあるほどより多様な戦闘を楽しむことができるわけですが
数が増えれば増えるだけ条件分岐を作らなければならず、非常に煩雑なものとなってしまいます。
そこで、管理テーブルを作り
・使用できる職業、レベル
・基本ダメージ値
・属性/範囲
・消費MP
などを定義しておくことで、魔法実行時におけるプログラムコードを極力減らそうというわけです。

# というわけで、実際に作っていきましょう
## テーブルの作成
外部から読み込んでもいいですが、とりあえずはアプリ内で作ってしまいましょう。

```bash:clearcollect
ClearCollect(sp_atk_tbl,
	{job:"wizard",id:1,splv:1,spname:"メラ",attri:"Fire",dmg:10},
	{job:"wizard",id:2,splv:1,spname:"ヒャド",attri:"Ice",dmg:20},
	{job:"wizard",id:3,splv:2,spname:"メラミ",attri:"Fire",dmg:80},
	{job:"wizard",id:4,splv:2,spname:"ヒャダルコ",attri:"Ice",dmg:75},
	{job:"wizard",id:5,splv:3,spname:"メラゾーマ",attri:"Fire",dmg:150},
	{job:"wizard",id:6,splv:3,spname:"マヒャド",attri:"Ice",dmg:165},
	{job:"warrior",id:1,splv:1,spname:"しっぷう突き",attri:"1atk",dmg:20},
	{job:"warrior",id:2,splv:1,spname:"まわしげり",attri:"allatk",dmg:10},
	{job:"warrior",id:3,splv:2,spname:"ドラゴン斬り",attri:"1atk",dmg:70},
	{job:"warrior",id:4,splv:2,spname:"せいけんづき",attri:"1atkC",dmg:150},
	{job:"warrior",id:5,splv:3,spname:"まじん斬り",attri:"1atk",dmg:200},
	{job:"warrior",id:6,splv:3,spname:"ばくれつけん",attri:"1atkC",dmg:400}
)
```
・job:職業
・id:職業内での管理ID
・splv:使用可能なレベル
・spname：技名
・attri：属性
・dmg:基本ダメージ値

## 表示用エリアの作成
本アプリでは最大6個までの魔法を表示させるようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/8e438d6e-0694-a675-2b7a-7efdfab9c838.png)

レベルや職業によって表示される技を制御しています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/e91c2c6b-8d1d-8527-7b70-9426cc9fa915.png)

### 表示用のラベル作成
1.まず初めに、「挿入」から「ラベル」を選択し、ラベルを作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/8be6ba5f-c78a-d5b1-209f-9e572f7d9d16.png)

2.Textプロパティに以下を入れます

```bash:text
Text(
	LookUp(
		Search(
			Filter(
				sp_atk_tbl,splv<=Value(splv_select.Selected.Value)
			),job_select.Selected.Value,"job"
		),id=1
	).spname
)
```
※補足説明
Filter関数でsp_atk_tblから選択したsplv以上のレコードを抽出
そこから、Search関数で選択したjobと一致するレコードを抽出
そこから、idが1番のレコードを抽出（２～６番目は適宜idを2~6を設定する）
そのspname列のデータを文字列として表示

3.Visibleプロパティに以下を入れます。

```bash:Visible
If(IsBlank(Magic1.Text),false,true)
```
※補足説明
Magic1.Textが空の時はFalse（非表示）
Magic1.Textにデータが入っているときはTrue（表示）

4.OnSelectプロパティに以下を入れます。

```bach:OnSelect
UpdateContext({
	magicname:LookUp(sp_atk_tbl,spname=Magic1.Text).spname,
	attribute:LookUp(sp_atk_tbl,spname=Magic1.Text).attri,
	damage:LookUp(sp_atk_tbl,spname=Magic1.Text).dmg
});
UpdateContext({enemyCHP:enemyCHP-Value(damage)})
```
※補足説明
技名をクリックすると
変数：magicnameにLookup関数でsp_atk_tblのspname列がMagic1.Textと一致しているレコードのspname列のデータを格納
変数：attributeにLookup関数でsp_atk_tblのspname列がMagic1.Textと一致しているレコードのattri列のデータを格納
変数：damageにLookup関数でsp_atk_tblのspname列がMagic1.Textと一致しているレコードのdmg列のデータを格納し
変数：enemyCHP（敵の現在HP）からダメージを引く

以上！
実は表示エリアの作成だけでこれらは実現しています。
実際にRPGを作るときは、これらをもとにした計算アルゴリズムをつくったボタンやタイマーを使用することで、戦闘画面のコントロールができるようになります。
計算自体も
たとえば、氷属性の敵に火属性の技を使用した場合は

```
If(
	And(enemyattribute="ice",attribute="fire",
		UpdateContext({enemyCHP:enemyCHP-(Value(damage)*2)}),
		UpdateContext({enemyCHP:enemyCHP-Value(damage)})
	)
)
```
こんな計算式にしておけばいいですね！
※実際はCase文にすると思いますが＾＾；

応用で、モンスター管理テーブルも同じようにして作ることができると思います。
PowerAppsでゲームを作っている方
いろいろデータ管理大変だと思います。
ぜひ参考にしてみてください！