ドムドーラの町づくり（アレフガルド in マインクラフト Part8）

# はじめに
　[前回の投稿](https://qiita.com/yamamorisoba/items/1d059817551834c3d14f)で、ドムドーラの地形を生成した時に書きとどめておいた、ドムドーラの町の仕掛けを実装してみました。実際に動作させてみた部分が以下の動画です。

 <iframe width="560" height="315" src="https://www.youtube.com/embed/Fy9K2RK3PBg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

　「あくまのきし」の出現トリガーを、「特定エリアに踏み込むこと」から「特定エリアを掘ること（特定ブロックが破壊され空気になること）」に変えましたが、あくまのきしをたおすことで、宝箱が出現し、ロトのよろいが手に入るという形で、原作の流れを再現できているのではないかと思います。
 　なお、動画にはしていませんが、あくまのきしに倒されたり、逃げ出したりすると草ブロックが埋めなおされて、やり直しになります。また、あくまのきしとは、何度も戦闘可能ですが、宝箱がでるのはあくまのきしを最初に倒した時のみとしています。原作はロトのよろいをとるまで何度も再戦可能だった気がするのですが、アイテムの回収判定は意外と実装がむずかしそうだったので、今回は実装を見送りました。

# マップ
　今回作成したドムドーラの町のマップです。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/89666027-6e17-0afd-a460-999ff1e28ee0.png)
　原作では、20ブロック×20ブロックですが、[メルキドの街並みを作った時](https://qiita.com/yamamorisoba/items/26905b328cff581102d0)と同様に、縦横をそれぞれ2倍にして40ブロック×40ブロックで生成しています。壁は石レンガ（stone bricks）をベースとしていますが、魔物に襲われて廃墟となった印象をだすために、ひび割れた石レンガ（cracked stone bricks）が30%程度混ざるようにしています。
 
　町を作るコードの生成元となったExcelファイル上のデータは以下のようになっています。

高さ0：地面のデータです。砂地・草地・毒の沼地の配置や、レンガの床・道路の配置を決めています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/a9869a90-ebd8-62d5-b588-00dda7812b5c.png)

高さ1：地面の上にあるモノの配置です。ドムドーラの場合は、石レンガの壁・柱とお店のカウンターになります。色が濃い灰色になっている部分は、ひび割れた石レンガになるところです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/24b065e7-d8eb-2555-709d-c348a13aa71f.png)

高さ2～3：壁や柱などの配置です。ドムドーラは破壊された街なので、上に行くにつれて欠けるようにしてあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/72f601ee-dca1-2d7d-3c7e-fb4b4f83efee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/ef1de0a9-5615-6a3f-b47e-fb4f6c9e84b4.png)

# レッドストーン回路
　あくまのきしの出現や、撃破時の宝箱出現を制御するレッドストーン回路を紹介します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/b570eb8a-7629-1119-6d3b-f945185ed47d.png)

## 街の出入りにかかわる制御部分
### 滞在中フラグ
　青枠で囲んでいる部分は、ドムドーラの町のマップに滞在している間オンになる回路です。街マップに切り替わった時、青枠下側の石ブロックがおかれます。リピートのコマンドブロックで`testforblock`を用いることにより、石ブロックの有無がドムドーラの町にいるかどうかを判定するフラグの役割を果たします。ドムドーラの町中のみで有効な仕組みは、この回路から動力を得て動くようにすることで、街の外にいる時に、余計な計算リソースを消費することを防ぎます。

### 離脱判定
　赤枠で囲んでいる部分は、ドムドーラの町からの離脱判定の回路です。4つのリピートコマンドブロックを用いて、ドムドーラのエリアの外周四辺に対応する領域へのプレイヤーの立ち入り判定を行うことで、ドムドーラの町マップからフィールドマップへのプレイヤーの転送を行います。

## あくまのきしとの戦闘にかかわる制御部分
　黄色の枠で囲んでいる部分が、あくまのきしの出現とロトのよろい獲得にかかわる制御回路です。

### あくまのきしの出現制御
　下のリピートコマンドブロックから続く回路は、ゆきのふじいさんの店の裏手の草地を掘り返した時に起動します。リピートのコマンドブロックで、草地が空気になったことを検知すると、信号が流れます。信号を受け取った後は、あくまのきしをスポーンさせるコマンド群が続きます。インパルスのコマンドブロックで「あくまのきし」という名前付きゾンビを召喚し、チェーンのコマンドブロックでゾンビに各種装備を装着させます。これらのコマンドの詳細は[前回の投稿](https://qiita.com/yamamorisoba/items/1d059817551834c3d14f#%E3%81%82%E3%81%8F%E3%81%BE%E3%81%AE%E3%81%8D%E3%81%97%E3%81%AE%E5%87%BA%E7%8F%BE%E6%96%B9%E6%B3%95)を参照してください。一通りの装備を装着した後は、`title`コマンドを用いてプレイヤーに「あくまのきしがあらわれた！」と通知します。そして、戦闘中であることを示すフラグとして①の位置に石ブロックを配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/b59194e6-2080-6027-37b0-152bcc2e98b9.png)
titleコマンドによる出現通知
　
### 戦闘終了判定
　上のリピートコマンドブロックから続く回路は、あくまのきしとの戦闘終了判定を制御する回路です。戦闘中フラグとなる①の石ブロックの存在を検出すると、左端のリピートコマンドブロックが作動し、信号が流れます。信号の先は二股に回路が分かれています。上の回路は勝利判定です。ドムドーラの町エリア内にあくまのきしという名前のエンティティがいなくなったことを検出すると信号が流れます。実装としては、リピートのコマンドブロックでエリア内にいるあくまのきしという名前のエンティティをカウントし続け、コンパレータとリピーターで信号を抽出します。あくまのきしをカウントする部分のコマンドは以下のようになります（xxxの部分には、ドムドーラの町に対応する座標の値が入ります）。

```
/testfor @e[name=あくまのきし,x=xxx,y=xxx,z=xxx,dx=xxx,dy=xxx,dz=xxx]
```
 
 　抽出した信号の先にレッドストーントーチを置き、オン・オフを反転させることで、あくまのきしという名前のエンティティがいる間はオフ、いなくなったらオンになる回路が出来上がります。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/e42b8ad4-2ef9-cb64-815e-747c3439718c.png)
　あくまのきしを倒すと、この回路が起動し、右側のインパルスのコマンドブロックに信号が流れます。ここから続くコマンドブロックでは、以下のような処理を実行します。
|ブロック|処理概要|コマンド|
|:-:|:-:|:-:|
|インパルス|戦闘中フラグ解除|/setblock <x> <y> <z> air|
|チェーン（条件付）|初回勝利判定(撃破フラグの有無判定)|/testforblock <x> <y> <z> air|
|チェーン（条件付）|宝箱出現処理|/structure load armor_chest <x> <y> <z>|
|チェーン（条件付）|撃破フラグ設定(②の位置に石ブロックを置く)|/setblock <x> <y> <z> stone|

　撃破フラグが立っているとインパルスの後に続くチェーンのコマンドは実行されないため、ロトのよろい入りのチェストは、初回撃破時のみ出現することになります。このチェストは、②の撃破判定フラグの右側にあるものと一緒ですが、structureコマンドで中身の情報を含めて、armor_chestという名前で保存しておき、呼び出せるようにしてあります。

　下の段の回路は敗北判定です。ドムドーラの町エリア内にプレイヤーがいなくなったことを検出して起動します。検出方法は勝利判定の回路と同様です。検出対象をプレイヤーに置き換えることで、ドムドーラの町からプレイヤーがいなくなった（町の外に出て逃走したorあくまのきしに倒されてリスポーンした）ことを検出することができます。敗北の後処理は以下の3点です。
 - あくまのきしを消す（うろつかれても困るので…）
 - 戦闘中フラグ解除
 - 草ブロック埋め戻し（掘り返した場所を元に戻す）

# おわりに
　今回は、ドムドーラの町を再現しました。あくまのきしを撃破すると入手できる「ロトのよろい」については、チェストプレートだけでなく、レギンズとブーツもセットにして全身鎧っぽくした方がよかったかも…とか、ヒーリングや毒・バリア無効などを再現すべく、何かしらのエンチャントを付与しておいた方がよかったかも…といった、心残りはまだありますが、未完成のフィールドマップがまだまだ広大に残っているので、マイクラ上でのフィールドマップの再現エリアを広げていくことを優先に対応を進めていきたいと思います。とりあえず、以前作ったメルキドとドムドーラが離れ離れになっているので地続きのマップにしたいところです。

# おまけ
　これまでの投稿をまとめておきます。
 |No.|内容|
 |:--:|:--|
 |Part1|[マインクラフトでの地形生成](https://qiita.com/yamamorisoba/items/a8736bfe8acb802dd2ae)|
 |Part2|[町の再現①](https://qiita.com/yamamorisoba/items/5e059388ac9db6037fb2)|
 |Part3|[メルキド as Code](https://qiita.com/yamamorisoba/items/26905b328cff581102d0)|
 |Part4|[住民との会話システム](https://qiita.com/yamamorisoba/items/fdd1dfdc42510e64af5a)|
 |Part5|[海と森の生成](https://qiita.com/yamamorisoba/items/f27bc50be589953ce696)|
 |Part6|[森の生成方法の改良](https://qiita.com/yamamorisoba/items/2e6fb100b4ed73d77a27)|
 |Part7|[ドムドーラ地方の生成](https://qiita.com/yamamorisoba/items/1d059817551834c3d14f)|