アレフガルド in マインクラフト Part2 町の再現①

# はじめに
　[Part1](https://qiita.com/yamamorisoba/items/a8736bfe8acb802dd2ae)では、アレフガルドのフィールドマップを、マインクラフト上に再現するための仕組みを検討し、ドラゴンクエストビルダーズ（以下、ビルダーズ）の地形情報をベースにメルキド周辺地域の再現に着手しました。
 　ビルダーズでは、メルキドの跡地が30ブロックx30ブロックのエリアになっていて、FC版のメルキドの町がちょうど収まるようになっています。そこで今回は、メルキドを最初の対象として、ドラゴンクエストの城や町・村などをマインクラフト上に再現する方法について検討していきたいと思います。

# 方法① フィールドマップへの埋め込み
　ビルダーズのメルキド跡地がちょうどよいサイズだったので、まずはフィールドマップ上にFC版メルキドの町並みを直接埋め込んで再現してみようと思います。実際に配置してみたものが以下の図です。

![スクリーンショット 2024-03-25 232939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/e3cfb46f-9c8e-16bb-8ccc-1ff53627e985.png)

　屋根で隠されているエリアがむき出しだったり、バリア床部分がなかったりと、まだ忠実に再現はできていませんが、上から見る限りそれっぽい町並みが出来上がっているように見えます。

 　ところが、実際に町の中に入ってみると…

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

　町の中央の広場周辺はさておき、通路や建物の中に入ると、迷路のような様相となっています。このマップに、町に住む人々を配置したとしても、かなり狭く感じる町になってしまいそうです。真上から見下ろす前提で作られたマップを、そのままのサイズで3Dのフィールドに埋め込むのは、いささか無理があるのかもしれません…

# 方法② マップの切り替え
　ドラゴンクエストでは、フィールドマップと城や町のマップは分かれており、マップの切り替えによってフィールドマップと城や町との出入りを行うつくりとなっていました。今回も、マップ切り替えで城や町との出入りを実現する仕組みを用意し、もう少し空間的に余裕を持った形で町並みを再現できるようにしたいと思います。

## フィールドマップ上のシンボル
　FC版のドラゴンクエストでは、フィールドマップ上の城や町は1ブロックのシンボルでした。が、マインクラフトの3Dマップ上に1ブロックでシンボルを置いても、全く目立ちません。そこで、フィールドマップ上にはFC版と等サイズの町並みを設置しておき、町並みへ足を踏み入れた時に、マップの切り替えを発生させ、町マップに移動する仕組みを作ることにします。
 
## マップ切り替え時の初期位置
　フィールドマップから町に入ったとき、町からフィールドマップに出たときのプレイヤーの初期位置は、町の出入口付近となるよう固定化することにします。幸か不幸か、メルキドは城塞都市なので、町をぐるっと城壁で囲んでしまえば、必然的に出入口は固定化されるわけですが、他の城や町は外縁部がオープンになっていることの方が多いため、どこから出入りしても、切り替え後のプレイヤーの初期位置は固定という前提でマップ切り替えの仕組みを考えます。
 
## マップ切り替えの判定方法
　マップ切り替えのトリガーとなる、フィールドマップ上の町並みへの踏み込みや、町マップからの抜け出しを判定する仕組みについて考えます。マインクラフトには、`testfor`というコマンドがあり、プレイヤーなどのエンティティが特定の条件を満たしているかを判定することができます。このコマンドで判定できる条件として、プレイヤーの位置を指定することが可能です。例えば、

 ```
/testfor @p[x=0,y=0,z=0,dx=10]
 ```
という条件を指定すると、プレイヤーが(0,0,0)から(10,0,0)の範囲に存在している時に、このコマンドはtrueを返します。これを、リピートのコマンドブロックに設定しておくと、指定範囲へのプレイヤーの進入を判定することができます。リピートのコマンドブロックに続けて、チェーンのコマンドブロックに条件付きでテレポートコマンドを設定しておくことで、特定のエリアへ踏み込んだ時にプレイヤーをテレポートさせる仕組みを作ることができます。

### 実装
　フィールドマップ上の町のシンボルは30ブロックx30ブロックのエリアとなっています。フィールドマップから町マップへの切り替えを判定する時には、このエリアの外周部が判定対象となります。例えば町のシンボルが、(0,0,0)から(29,0,29)の範囲にある場合、このエリアへの進入を検出するコマンドは以下の4つとなります。

 ```
/testfor @p[x=0,y=0,z=0,dx=29]
/testfor @p[x=0,y=0,z=0,dz=29]
/testfor @p[x=,y=0,z=29,dx=29]
/testfor @p[x=29,y=0,z=0,dz=29]
 ```
　コマンドブロックは1つのブロックに対して1つのコマンドしか実行できないので、対象エリアの外周を構成する4辺への進入を検出するためには、4つのコマンドブロックを用意することになります。この4つのコマンドブロックのうち、いずれか1つがtrueを返した場合に、町マップにテレポートするようにコマンドブロックを接続します。前節では、リピートのコマンドブロックに、条件付きチェーンコマンドブロックを接続する方法を紹介しましたが、その方法だとテレポートを実行するコマンドブロックも、下図のように4つ必要になります。
 
 ![Minecraft Education 2024_04_09 22_19_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/00075ee5-4b19-8a99-cf64-d2c91a51ee47.png)

　テレポート先を変更したくなった場合にブロック4つを編集するのは効率が悪いので、レッドストーン回路を組んで、4つのリピートコマンドブロックのどれかから信号を受け取るとテレポートコマンドが実行されるようにすることも可能です。

![Minecraft Education 2024_04_09 22_26_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/f7048209-484c-eef5-6cc4-52b9aaf38304.png)

　この回路を作る場合の注意点は以下の３つです。
 1. リピートのコマンドブロックにはレバーを取り付けてオンの状態にしておくこと
 1. リピートのコマンドブロックからの出力を検出・増幅して回路に流すために、コンパレーターとリピーターを接続しておくこと（接続する向きに注意）
 1. テレポートコマンドを実行するコマンドブロックは、条件付きではなくインパルスで動力が必要という設定にしておくこと（リピートのコマンドブロックから離れてしまうので、条件付きでは動作しない）
 
### マップ切り替え時のインターバル
　テレポートコマンドでプレイヤーを移動させると、タイムラグなしで移動先に画面が切り替わります。そうなると、急に画面が変わるため、マップ切り替えが発生したことに気が付きにくい場合があります。そこで、マップ切り替えの際に、画面が暗転するインターバルを仕込むことにします。といっても、マインクラフトのテレポートのオプションに、そんなものはないので…切り替え先のマップに直接テレポートするのではなく、真っ暗な箱（ブラックボックス）を経由して切り替え先のマップへテレポートするようにします。
　フィールドマップ上のシンボル→ブラックボックス→町マップという順で、2回テレポートを行うのですが、ブラックボックスから町マップへテレポートを行うコマンドブロックに遅延時間を設定することで、画面を暗転させておくインターバルを調整することができます。

# マップ切り替えデモ
 　それでは、本稿の冒頭で試作した、メルキドの等サイズの町並みをシンボルとして、フィールドマップから町マップへの切り替え、町マップからフィールドマップへの切り替えのデモを掲載しようと思います。ただし、切り替え先の町マップについては、いったん60ブロックx60ブロックでエリアを定義しただけで、実際の町並みを作るには至っていません。今回はあくまでマップ切り替え部分のみのデモである点をご承知おきください。

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

　フィールドマップ上のメルキドの城門を通過しようとすると、一瞬暗転のインターバルが入ったのちに、60x60のダイヤモンドブロックを敷き詰めた町マップ（仮）にマップ切り替えが発生しています。ダイヤモンドブロックの範囲から外に踏み出すと、メルキドの城門に背を向けた位置でフィールドマップに戻ってきます。町マップ（仮）からは、どの方向から抜け出したとしても、この位置でフィールドマップに戻ってくるように設定されています。

 # まとめ
 　今回は、町の再現の準備段階として、フィールドマップから町マップにマップ切り替えを行う仕組みを実装してみました。切り替え先となる町マップは任意の広さを用意できるので、空間的に余裕を持った形で城や町、村を再現していくことができそうです。今後は、切り替え先となる町マップ上に、建物や住民を再現していきたいと思います。

# おまけ（フィールドマップ再現進捗）
　町の仕組みをあれこれ検討することと並行して、メルキド周辺のフィールドマップは徐々に範囲を広げて再現されて行っています。スクリーンショットでは現状の再現範囲をうまく表現しきれていませんが、こんな感じになってきています。

 ![Minecraft Education 2024_04_08 21_50_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297527/a7dc3a5e-6e11-5f99-fc7b-de56693ec8d8.png)

　メルキドの周辺を囲っている山岳地帯（岩山）や、海岸線が徐々に再現され始めています。今再現しているのは陸地だけで、海を作っていないため、浮遊大陸みたいに見えていますが、海を作ればいよいよアレフガルドっぽさが出てくるのではないかと思います。