World Dimension Loader (WDL) 1.3.0
設定例 / 遊び方
Minecraft 1.20.1 / Forge 47.4.22 / Java 17

============================================================
この文書の使い方
============================================================
この文書は、WDLで実際に遊べる構成を、そのまま真似できる設定例としてまとめたものです。

基本:
- 各Dimension IDと同名のワールドコピーを WDL_custom_dimensions/ に置く想定です。
- 例: id = "forest_ruins" -> WDL_custom_dimensions/forest_ruins/level.dat
- folderを明示すれば別フォルダ名も使用できます。
- 通常のDimension/Gate設定を変更したあとは /wdl scan で再読込できます。
- STARTUP ONLY設定は /wdl scan では切り替わらず、ゲーム/サーバーの完全再起動が必要です。
- 複数の例を同じgates.tomlへそのまま全部貼る場合、物理条件が重なるGateは曖昧になります。frame/corner、サイズ範囲、Igniter制限などで区別してください。
- selection_mode = "ALL" は、現在利用可能なREADY状態のWDLインポートDimensionが対象です。Overworldは自動では含まれません。
- LIST内で minecraft:overworld とWDL Dimension IDを混在させないでください。
- ランダム選択のweightは、現在選択可能な候補同士の相対値です。READY状態、Travel Policy、現在いる論理Dimensionなどによって候補が除外される場合があります。

============================================================
例 1 - 基本の1ワールドGate
============================================================
目的:
最小限の設定だけで、コピーした1つのワールドへ移動します。

遊び方:
まずWDLが動くことを確認したい場合や、普通の別ワールドとして1つだけ追加したい場合に使います。

【dimensions.toml】
```toml
[[dimensions]]
id = "test_world_01"
```

【gates.toml】
```toml
[[gates]]
id = "test_world_01_gate"
dimensions = ["test_world_01"]
```

動作:
- folder省略時は test_world_01 がそのままフォルダ名になります。
- dimensionsが指定されているため、selection_modeを省略するとLISTとして扱われます。
- Gateは初期値の黒曜石フレーム/角、既定サイズ、10秒開放、無料で動作します。

注意点:
- ワールドコピーは WDL_custom_dimensions/test_world_01/level.dat の位置に置いてください。
- 初めてWDLを使う場合は、まずこの構成で転移と帰還を確認することを推奨します。

============================================================
例 2 - 複数ワールドから固定LISTランダム
============================================================
目的:
決めた複数ワールドの中からランダムで行先を選びます。

遊び方:
「森・砂漠・氷」の3種類から、Gateを開くたびに遠征先が変わる構成です。

【dimensions.toml】
```toml
[[dimensions]]
id = "forest_ruins"

[[dimensions]]
id = "desert_temple"

[[dimensions]]
id = "ice_cave"
```

【gates.toml】
```toml
[[gates]]
id = "expedition_gate"
dimensions = [
    "forest_ruins",
    "desert_temple",
    "ice_cave"
]
```

動作:
- selection_mode省略 + dimensions指定なのでLISTです。
- 3つとも初期COMMON weightなので、全候補がREADYかつ移動可能なら相対weightは同じです。

注意点:
- LIST内の現在いるWDL Dimension自身は行先候補から外れます。
- READYでない候補やTravel Policyで禁止されている候補も抽選対象から外れる場合があります。

============================================================
例 3 - READYな全WDLワールドからALLランダム
============================================================
目的:
設定済みのWDLワールド全体からランダムで行先を選びます。

遊び方:
あとからWDL Dimensionを追加しても、Gateのdimensions一覧を書き直さずランダム候補へ加えたい場合に使います。

【dimensions.toml】
```toml
[[dimensions]]
id = "world_a"

[[dimensions]]
id = "world_b"
```

【gates.toml】
```toml
[[gates]]
id = "all_random_gate"
selection_mode = "ALL"
```

動作:
- 有効でREADY、かつ現在移動可能なWDLインポートDimension全体から抽選します。
- 後から追加したREADYなWDL Dimensionも自動的に候補になります。

注意点:
- ALLにOverworldは含まれません。
- 現在いる論理WDL Dimension自身は候補から除外されます。
- Overworld専用Gateは selection_mode = "LIST" と dimensions = ["minecraft:overworld"] を明示してください。

============================================================
例 4 - レアリティ抽選
============================================================
目的:
普通の行先は出やすく、特別な行先は低確率にします。

遊び方:
大半はcommon_cave、時々rare_vault、ごくまれにlegendary_ruinへ飛ぶルーレットGateです。

【dimensions.toml】
```toml
[[dimensions]]
id = "common_cave"
rarity = "COMMON"

[[dimensions]]
id = "rare_vault"
rarity = "RARE"

[[dimensions]]
id = "legendary_ruin"
rarity = "LEGENDARY"
```

【gates.toml】
```toml
[[gates]]
id = "rarity_gate"
dimensions = [
    "common_cave",
    "rare_vault",
    "legendary_ruin"
]
```

動作:
common.tomlの初期weightを変更していない場合、相対weightは:
- COMMON = 100
- RARE = 25
- LEGENDARY = 3

全3候補が選択可能なら、100 : 25 : 3 の相対weightで抽選されます。

注意点:
- 「何回に1回必ず出る」という固定確率保証ではありません。
- 候補がREADYでない、Policyで禁止されるなどすると実際の候補集合が変わります。
- Dimensionごとに weight を明示するとrarityの初期weightを上書きできます。

============================================================
例 5 - 10分制限ダンジョン
============================================================
目的:
滞在時間が決まっているダンジョンを作ります。

遊び方:
10分間だけ探索・収集し、時間切れになったら安全に退出させるタイムアタック型です。

【dimensions.toml】
```toml
[[dimensions]]
id = "timed_dungeon"

[dimensions.time_limit]
minutes = 10
exit_destination = "PREVIOUS"
```

【gates.toml】
```toml
[[gates]]
id = "timed_dungeon_gate"
dimensions = ["timed_dungeon"]
```

動作:
- timed_dungeonには共有の10分Timed Sessionが作られます。
- 時間切れ時は、信頼できるPREVIOUS行先へForced Exitを試みます。

注意点:
- PREVIOUSがすでに安全な帰還先として使えない場合、Overworldへ安全フォールバックすることがあります。
- seconds / minutes / hours / minecraft_days は1つだけ指定してください。
- この設定だけではワールドResetは行いません。

============================================================
例 6 - 入るたびに遊び直せる周回Resetダンジョン
============================================================
目的:
プレイヤーがいなくなったあと、ダンジョンをインポート元の状態から作り直します。

遊び方:
攻略して退出し、次の周回では新しいRuntime世代から再スタートする繰り返し型ダンジョンです。

【dimensions.toml】
```toml
[[dimensions]]
id = "loop_dungeon"

[dimensions.runtime]
reset_on_empty = true
reset_delay_seconds = 30
```

【gates.toml】
```toml
[[gates]]
id = "loop_dungeon_gate"
dimensions = ["loop_dungeon"]
```

動作:
- Dimensionが安全に無人になったあと30秒の猶予を使います。
- Resetが完了すると、次のRuntime世代は WDL_custom_dimensions のインポート元コピーから作り直されます。

注意点:
- 建築、ブロック変更、Entityなど、Runtime Dimension内の変更はResetで失われる場合があります。
- WDL_custom_dimensions内のインポート元コピー自体はReset対象ではなく、そのまま保持されます。
- 安全性を優先する初期設定では、使用済みの旧Runtime世代をゲーム/サーバーの再起動まで保持します。再起動前にResetを繰り返すと、一時的に大量のディスク容量を使う可能性があります。
- common.tomlでゲーム中に旧Dimensionを削除する設定もありますが、安全性と他MOD互換性のため推奨しません。
- Valkyrien Skiesを検知した場合、ゲーム中削除を要求していても無視され、安全な再起動時cleanup方式が強制されます。

============================================================
例 7 - 状態を保持する長期冒険ワールド
============================================================
目的:
別Dimensionを長期的な冒険拠点や第二の生活ワールドとして使います。

遊び方:
建築や探索進行をResetせず保持し、ベッド、Anchor、Return Scrollも利用します。

【dimensions.toml】
```toml
[[dimensions]]
id = "adventure_world"

[dimensions.runtime]
reset_on_empty = false

[dimensions.bed]
allow_bed_respawn = true

[dimensions.anchor]
enabled = true

[dimensions.return_scroll]
enabled = true
```

【gates.toml】
```toml
[[gates]]
id = "adventure_world_gate"
dimensions = ["adventure_world"]
```

動作:
- Runtime Resetは無効です。
- このWDL Dimensionでベッドのリスポーン登録を許可します。
- Dimensional AnchorとReturn Scrollも利用できます。

注意点:
- reset_on_empty = false、Anchor有効、Return Scroll有効は初期値ですが、学習用に明示しています。
- Bed Respawnは初期値falseなので、利用する場合は明示的にtrueへ変更します。
- ベッドが無効/破損している場合やRuntime状態が安全でない場合は、不正な地点へ強制せず安全側へフォールバックする場合があります。

============================================================
例 8 - 持込禁止 + 持出制限チャレンジ
============================================================
目的:
装備を持ち込まず、現地で入手した指定報酬だけを通常帰還時に持ち帰れるチャレンジを作ります。

遊び方:
手ぶらで入り、ダイヤモンドとエメラルドだけを報酬として持ち帰ります。

【dimensions.toml】
```toml
[[dimensions]]
id = "inventory_trial"

[dimensions.inventory.import]
mode = "BLOCK_ALL"
items = []

[dimensions.inventory.export]
mode = "WHITELIST"
items = [
    "minecraft:diamond",
    "minecraft:emerald"
]
```

【gates.toml】
```toml
[[gates]]
id = "inventory_trial_gate"
dimensions = ["inventory_trial"]
```

動作:
- 通常入場では、管理対象Inventoryにアイテムを持っていると入場を拒否します。
- 通常退出では、export WHITELIST外のアイテムを持っていると退出を拒否します。

注意点:
- Main Inventory、Armor、Offhandが判定対象です。
- 通常帰還する前に、許可されていないアイテムを捨てる/保管する必要があります。
- Timed SessionのForced Exitでは、避難処理を永久に止めないため、Policy違反Stackが安全cleanup計画によって除去される場合があります。価値の高いTimed LootとInventory制限を組み合わせる場合は、この挙動を理解してから使用してください。
- 通常の移動でPolicy違反アイテムが自動削除されるわけではありません。通常移動は拒否されます。

============================================================
例 9 - Travel Policyで一方通行の2階層ダンジョン
============================================================
目的:
Floor 1からFloor 2へ進めるが、Floor 2からFloor 1へ戻れない進行ルートを作ります。

遊び方:
Overworld -> Floor 1 -> Floor 2 -> Overworld の一方通行攻略です。

【dimensions.toml】
```toml
[[dimensions]]
id = "floor_01"

[[dimensions]]
id = "floor_02"

[dimensions.travel.import]
mode = "WHITELIST"
dimensions = ["floor_01"]

[dimensions.travel.export]
mode = "BLACKLIST"
dimensions = ["floor_01"]
```

上の2つのPolicyセクションは、直前の [[dimensions]] である floor_02 に設定されます。

【gates.toml】
```toml
[[gates]]
id = "floor_01_entry"
dimensions = ["floor_01"]

[[gates]]
id = "floor_01_to_02"
corner_block = "minecraft:crying_obsidian"
dimensions = ["floor_02"]
```

動作:
- floor_02はWDL管理移動でfloor_01から来た場合だけ入場を許可します。
- floor_02からfloor_01への移動は拒否します。
- export BLACKLISTはfloor_01だけなので、Overworldへの帰還は許可されたままです。

注意点:
- floor_02用Gateを別の場所に作っても、Travel Policyの条件を満たさなければ入場できません。
- 2つ目のGateは角をcrying_obsidianへ変え、最初のGate定義と物理的に区別しています。
- Travel Policy内の短いWDL IDはWDLのDimension IDとして正規化されます。

============================================================
例 10 - 複数Gateを役割別に使い分けるハブ
============================================================
目的:
通常冒険、ランダム、Boss用のGateを1つの拠点で使い分けます。

遊び方:
- 通常冒険Gate
- READYなWDL Dimension全体からのランダムGate
- XPを支払うBoss Gate
- WDL標準のOverworld帰還Gate
を別々の見た目で配置します。

【dimensions.toml】
```toml
[[dimensions]]
id = "adventure_world"

[[dimensions]]
id = "boss_world"
rarity = "EPIC"
```

【gates.toml】
```toml
[[gates]]
id = "adventure_gate"
dimensions = ["adventure_world"]

[[gates]]
id = "random_gate"
corner_block = "minecraft:crying_obsidian"
selection_mode = "ALL"

[[gates]]
id = "boss_gate"
corner_block = "minecraft:gold_block"
dimensions = ["boss_world"]
open_time_seconds = 20

[[gates.costs]]
type = "XP_LEVEL"
amount = 10
```

動作:
- adventure_gateは通常の黒曜石Gateです。
- random_gateはcrying obsidianの角で区別され、ALL抽選を使います。
- boss_gateは金ブロックの角で区別され、10 XP Levelを消費し、20秒開放します。
- 初期生成されるOverworld Gateは石レンガ枠 + エメラルドブロック角なので、これらとは別定義です。

注意点:
- 行先IDが違うだけでは、物理Gate定義を区別できません。
- 複数の有効Gateでframe/corner、サイズ範囲、Igniter条件が重なる場合、WDLはConfig順で勝手に選ばず、安全側で曖昧な定義を拒否します。
- [[gates.costs]] は直前のGateに属します。この例ではboss_gateのコストです。
- Costブロックを複数書いた場合は累積し、すべて支払える必要があります。

============================================================
もっと遊ぶアイデア
============================================================
次の機能も組み合わせられます。

- dimensions.environment でADVENTURE固定 + HARD + 夜固定のホラーワールド
- reopen_cooldown_seconds で連続起動できないGate
- ITEM Costで鍵アイテムを要求するGate
- Return ScrollのDimension別XPコスト変更
- keep_loaded = true で常駐させたいWDL Dimension
- Anchorを無効化した探索チャレンジ
- Bed Respawnを有効化した長期サバイバルワールド

各オプションの初期値・有効値・詳細は WDL_CONFIG_GUIDE_JA_1.3.0.txt と生成ConfigのALL OPTIONSを参照してください。
