生成型ダンジョン
生成型ダンジョンには、テンプレートワールドがありません。小さなルームを一度だけ作り、それらがどうつながるかを記述すると、ジェネレーターがランごとに新しいレイアウトを組み立てます。開始ルームから、通常ルーム、宝物ルーム、秘密ルームを経て、ボスルームまでです。
固定型と生成型のダンジョンは、ラン、メニュー、チェスト、NPC、モブ、イベント、ファクトを共有します。変わるのは、ルームの出どころだけです。
構成要素
| 要素 | エントリ | 内容 |
|---|---|---|
| 扉の種類 | Dungeon Connector Type | 扉の開口部の大きさ、使われない扉をふさぐブロック、そしてどの種類同士をつなげられるか。 |
| ルーム | Dungeon Room Template | 保存された構造物(アーティファクトとして保持される Paper の構造物 .nbt)。カテゴリ、扉、マーカーを持ちます。 |
| プール | Dungeon Room Pool | ルームテンプレートの重み付きリスト。 |
| ジェネレーター | Dungeon Generator | ルール。どのプールを使うか、ルームの数、ボスの深さ、通路が分岐する頻度。 |
| アフィックス | Dungeon Affix | 「素早いモブ」のように、ランダムに引かれるランの修飾。 |
| ダンジョン | Dungeon Instance | generator フィールドを設定すると、生成型ダンジョンになります。 |
手順を追って作る
- 扉の種類。 Dungeon Connector Type を少なくとも 1 つ追加します。
widthとheight(デフォルトは 3 × 3)、使われない扉を閉じるsealBlock(デフォルトはminecraft:stone_bricks)、そして複数の種類がある場合はcompatibleWithを設定します。種類は、常に自分自身とつなげられます。 - ルーム。 ルームごとに Dungeon Room Template を追加し、ゲーム内エディタでブロックを取り込み、扉とマーカーを配置します。
categoryを選びます。 - プール。 開始ルーム用に 1 つ、ボスルーム用に 1 つ、その他のルーム用に 1 つ(またはそれ以上)、必要なら通路用に 1 つ、Dungeon Room Pool を追加します。開始、ボス、通路のプールには、そのカテゴリのテンプレートだけが入ります。通常のプールには、
NORMAL、TREASURE、SECRETのテンプレートを混ぜられます。 - ジェネレーター。 Dungeon Generator を追加し、
startPool、bossPool、必要ならcorridorPool、そして重みをそれぞれ持つnormalPoolsを設定します。 - ダンジョン。 Dungeon Instance で
generatorを設定します。templateWorldは空のままにします。生成型ダンジョンにはテンプレートワールドがありません。隔離はAUTOまたはWORLD_PER_RUNにする必要があります。 - ゲームロジック。 ルームテンプレートの
onEnterとonClearのトリガー、TRIGGER マーカー、ルームイベント、MOB マーカー上の Dungeon Mob Spawn エントリを使い、ランは Dungeon Complete で終わらせます。
プールとテンプレートからダンジョンを作れない場合、開始は拒否され、サーバーログに理由が出ます(例えば、開始ルームのないプールや、読み取れる取り込みのないテンプレート)。ジェネレーターの messages フィールドには、作成者であるあなたに報告される理由が入ります。プレイヤーに表示されるのは、スニペット content.dungeon_generated.refusal.setup(プールとテンプレートからダンジョンを作れない)と content.dungeon_generated.refusal.paste(ルームを貼り付けられなかった)から取られる短いテキストだけで、Web パネルで編集できます。それらからは何も徴収されません。ランのアフィックスを告知する行は、スニペット content.dungeon_generated.affix.announcement です。
ルームのカテゴリ
ルームテンプレートの category は、それが果たせる役割を示します。
| カテゴリ | 役割 |
|---|---|
START | ランはここから始まります。ダンジョンに 1 つ。SPAWN マーカーを持つ必要があります。 |
NORMAL | 普通のルーム。 |
TREASURE | 常に分岐の先にあり、ボスへ向かう道には置かれません。 |
CORRIDOR | 直接つながれない 2 つのルームの間に挿入されます。 |
SECRET | 常に行き止まりです。 |
BOSS | 最後のルーム。ダンジョンに 1 つ。 |
ルームは扉どうしでつながれるため、扉のないルームは、行き止まりの START にしかなれません。required がオンの扉は、別のルームとつながっていなければなりません。必須の扉をすべて埋められないテンプレートは、使われません。誰も通らなかった扉は、その種類の sealBlock で閉じられます。
マーカー
マーカーは、ルーム内の見どころとなる点です。それぞれに kind があります。
| 種類 | 役割 | 埋めるフィールド |
|---|---|---|
SPAWN | ランが始まるときにプレイヤーが現れる場所。開始ルームの最初の SPAWN だけが使われます。 | なし |
CHEST | ここに戦利品チェストが置かれます。その位置と向き(yaw)が、エントリの location を置き換えます。マーカーで指定されたチェストは、そのエントリが manualMode であっても、常に置かれます。 | chest: Dungeon Loot Chest |
TRIGGER | ルームに到達したプレイヤーに対して、トリガーが発火します。 | triggers |
NPC | Dungeon NPC Instance がここに立ち、ランのメンバーに表示されます。 | npc |
MOB | ランのメンバーが初めてルームに入ったときに、Dungeon Mob Spawn のモブがここに出現します。 | mob |
マーカーの yaw は、チェスト(yaw の方向を背にします)と NPC(その方向を向きます)の向きを決めます。マーカーは、markers リスト内での位置によって、エントリとひも付けられます。
プレイ中のルーム
プレイヤーが生成型ダンジョンのルームに入ると、そのテンプレートの onEnter トリガー、続いて TRIGGER マーカーのトリガーと MOB マーカーのモブが発火します。enterOnce がオン(テンプレートのデフォルト)なら、ランの中でプレイヤーごとに最初にルームへ入ったときだけ発火します。
onClear トリガーは、プレイヤーがルームにいる間に Dungeon Clear Room アクションが実行されると、ランごとに一度だけ発火します。プラットフォームが、ルームがクリアされたと単独で判断することはありません。判断するのはあなたです。例えば、最後のモンスターが死んだときのモブ死亡イベントからです。
ルームのトリガーは、コンテキストから(interaction_context_variable で)次の値を読み取れます。
| キー | 値 |
|---|---|
RUN_ID | ランの id。 |
SEED | ダンジョンのシード(10 進数)。 |
ROOM | ルームの番号。0 が開始ルームで、以降はジェネレーターが配置した順です。 |
ROOM_TEMPLATE | ルームテンプレートエントリの id。 |
DIFFICULTY | ジェネレーターの difficulty。 |
POSITION | TRIGGER マーカーの場合はマーカーのブロック、それ以外はプレイヤーの位置。 |
アフィックスのトリガーが読み取れるのは、RUN_ID、SEED、DIFFICULTY だけです。固定型ダンジョンは、これらのキーをどれも提供しません。
シード、アフィックス、難易度
同じシードからは常に同じダンジョンができるため、レイアウトを再現できます。シードは、ランごとに新しく引かれます。シードはランとともに保存されるので、リロードしても同じダンジョンがメモリ上で再構築されます。再構築できない場合、誰も知らないルームのまま引き継がれるのではなく、起動時にランが閉じられます。
アフィックスは、レイアウトの後に、ジェネレーターの affixes から weight に従って、affixCount 個が重複なしで引かれます。この抽選はシードに従いますが、レイアウトを変えることは決してありません。そのモディファイアとトリガーは、ランの開始時に各メンバーに適用されます。
difficulty は、コンテキストを通じてトリガーに渡される単なる数値です。それ自体がレイアウトを変えることはありません。
重要なジェネレーター設定
| フィールド | デフォルト | 備考 |
|---|---|---|
minRooms, maxRooms | 6, 10 | 開始とボスを含み、通路を除く、ルームの合計数。許容範囲は 2 から 256。 |
minBossDepth | 3 | ボスは、開始から少なくともこの歩数だけ離れます。 |
branchRatePercent | 40 | メインの道の先にあるルームが、枝道を開く確率(パーセント)。 |
quotas | なし | NORMAL、TREASURE、SECRET のルーム数の上限と下限。境界のないカテゴリは無制限です。 |
trialBudget, replans | 20000, 5 | 失敗するまでに探索がどれだけ粘るか。試行予算 × (replans + 1) は 5 000 000 以内に収める必要があります。 |
baseY | 64 | ランのワールドでの、開始ルームの床の高さ。 |
roomsPerTick | 4 | サーバーの 1 ティックあたりに貼り付けるルーム数。低いとティックが短く保たれ、高いと速くなります。 |
pasteTimeoutSeconds | 120 | これを過ぎると、開始は取り消され、コストは返金され、ワールドは破棄されます。 |
naturalSpawning | off | ランのワールドで、モンスターや動物が自然にスポーンします。デフォルトはオフ。 |
verticalMargin | 1.0 | プレイヤーが中にいるかを判定するとき、各ルームの天井の上と床の下に加えるブロック数。 |
paster | STRUCTURE | Paper の構造物 API を使います。他のプラグインは不要です。 |
ルームテンプレートは、各辺が最大 256 ブロック、扉は最大 64、マーカーは最大 1024 です。
ゲーム内エディタ
Web パネルで Dungeon Room Template を開き、artifactId フィールドのコンテンツエディタをクリックします。ホットバーに一式のツールが与えられます。
| ツール | 用途 |
|---|---|
| コーナーワンド | ブロックを左クリックでコーナー A、右クリックでコーナー B。 |
| 取り込み | ボックス内のブロックを、テンプレートの構造物として保存します。 |
| 扉ツール | 壁のブロックを右クリックして扉を追加します(そのブロックが開口部の下の中央です)。左クリックで、そこにある扉を削除します。 |
| 扉の種類 | 右クリックで次のコネクタータイプ、左クリックで前のコネクタータイプ。 |
| 必須の切り替え | 次に置く扉を必須にするかどうかを切り替えます。 |
| マーカーツール | ブロックを右クリックして、その手前にマーカーを追加します。左クリックで、そこにあるマーカーを削除します。 |
| マーカーの種類 | 右クリックで次の種類、左クリックで前の種類。 |
| 保存 | 扉とマーカーをエントリに書き込みます。 |
ボスバーには、ボックスの大きさ、扉とマーカーの数、そして未保存の作業があるかが表示されます。ルームの大きさは保存された構造物から読み取られ、入力することはありません。扉を追加する前に、コネクタータイプを少なくとも 1 つ作成して Publish しておく必要があります。
取り込みはデフォルトでエンティティを無視します。生きているエンティティは、取り込みのたびにルームを変えてしまい、すべてのコピーで野良のモブとして戻ってくるためです。これらの動作とエディタのすべてのテキストは、content.dungeon_room_template. の下にある Typewriter のスニペットなので、Web パネルで変更や翻訳ができます。
| スニペット | デフォルト | 意味 |
|---|---|---|
capture.include_entities | false | 取り込みでボックス内のエンティティを保存するかどうか。 |
capture.max_volume | 262144 | 1 回の取り込みで読み取る最大ブロック数。1 つのサーバーティックで読み取られるため、非常に大きなボックスはそのティックを占有します。 |
capture.timeout_seconds | 30 | 取り込みを諦めるまで待つ秒数。 |
sound.confirm | entity.experience_orb.pickup | 取り込みまたは保存の後に鳴る音。空にすると鳴りません。 |
制限とグッドプラクティス
- 生成型ダンジョンは
WORLD_PER_RUNのみを使います。ランごとにワールドを作成し、後で削除します。 - 固定ルームのエディタ(ノード)には、
content.dungeon_room.の下に専用のスニペットがあります(メッセージnode.*、save.*、editor.*、ツールtool.add、tool.remove、tool.save)。 - つなげる 2 つの同じ種類の扉が、きちんと揃うようにルームを作ってください。開口部の幅が偶数の場合、余分なブロックはテンプレートの x または z の大きい側に付きます。偶数の開口部で必要なとき、ジェネレーターはルームを 1 ブロックずらします。
- ダンジョン全体は、
baseYから数えて、ワールドの最も低いブロックと最も高いブロックの間に収まる必要があります。 - ルームの数が固定だと思わないでください。ルーム番号ではなく、マーカーとイベントを使ってください。