ModernUO/Distribution/Data/Spawns/shared/felucca/Destard.json
Kamron Batman 2f8a7afa57 chore(spawners): migrate spawn data to $type discriminator
- Rename "type" -> "$type" (first key, required for STJ polymorphism) in
  all 109 spawn JSON files (5,612 records).
- Convert "homeRange" + "location" -> "spawnBounds" object, dropping homeRange.
  Runtime keeps reading homeRange so un-migrated/external files still load.
- Add BoundsEquivalenceTests (hr=0/1/3/7) validating that the script's toBounds
  formula produces the same Rectangle3D as the runtime homeRange path.
- Add MigratedDataLoadTests loading a real migrated file as List<SpawnerDto>
  and round-tripping each DTO through ToSpawner().
- Add tools/spawner-json-migrate/migrate.mjs (offline Node script).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-25 16:17:35 -07:00

1025 lines
18 KiB
JSON

[
{
"$type": "Spawner",
"guid": "0fbce341-ca59-4ec4-a718-cc8f7b3ed34e",
"name": "Spawner (206)",
"location": [
5247,
956,
-40
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5217,
"y1": 926,
"z1": -128,
"x2": 5278,
"y2": 987,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Dragon",
"maxCount": 1,
"probability": 100
},
{
"name": "Drake",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "171e7677-5e0b-4da4-8599-9c3c16200e7a",
"name": "Spawner (206)",
"location": [
5141,
968,
0
],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5131,
"y1": 958,
"z1": -128,
"x2": 5152,
"y2": 979,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "FireElemental",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "326c64f4-34d3-414d-a79c-c7bb9d441e96",
"name": "Spawner (206)",
"location": [
5149,
907,
0
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5134,
"y1": 892,
"z1": -128,
"x2": 5165,
"y2": 923,
"z2": 128
},
"walkingRange": 20,
"entries": [
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
},
{
"name": "Dragon",
"maxCount": 1,
"probability": 100
},
{
"name": "Drake",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "3e318f8e-aec0-4b16-b435-43dc4fde4372",
"name": "Spawner (206)",
"location": [
5241,
945,
-40
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5231,
"y1": 935,
"z1": -128,
"x2": 5252,
"y2": 956,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "TreasureChestLevel3",
"maxCount": 1,
"probability": 100
},
{
"name": "TreasureChestLevel4",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "48b37663-ddee-4f04-978d-35f4c085f785",
"name": "Spawner (206)",
"location": [
5269,
811,
7
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5239,
"y1": 781,
"z1": -128,
"x2": 5300,
"y2": 842,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Dragon",
"maxCount": 1,
"probability": 100
},
{
"name": "Drake",
"maxCount": 2,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "4f8eb77e-64cb-4846-8c0f-0816f16c94b3",
"name": "Spawner (206)",
"location": [
5352,
934,
-5
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5342,
"y1": 924,
"z1": -128,
"x2": 5363,
"y2": 945,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "WaterElemental",
"maxCount": 4,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "506ce404-853e-4168-9b6b-1296d40c90e3",
"name": "Spawner (206)",
"location": [
5183,
1007,
0
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5173,
"y1": 997,
"z1": -128,
"x2": 5194,
"y2": 1018,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "TreasureChestLevel3",
"maxCount": 1,
"probability": 100
},
{
"name": "TreasureChestLevel4",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "59c245e9-e59f-4f6c-b3cb-2add65aba939",
"name": "Spawner (206)",
"location": [
5203,
787,
5
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5191,
"y1": 775,
"z1": -128,
"x2": 5216,
"y2": 800,
"z2": 128
},
"walkingRange": 25,
"entries": [
{
"name": "WaterElemental",
"maxCount": 4,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "79707431-23e6-4347-a89e-7bc970162938",
"name": "Spawner (206)",
"location": [
5280,
955,
-40
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5250,
"y1": 925,
"z1": -128,
"x2": 5311,
"y2": 986,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Dragon",
"maxCount": 1,
"probability": 100
},
{
"name": "Drake",
"maxCount": 2,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "7dfd256b-c903-4a4f-abf1-bdce7ff2217b",
"name": "Spawner (206)",
"location": [
5284,
926,
-40
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5254,
"y1": 896,
"z1": -128,
"x2": 5315,
"y2": 957,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Dragon",
"maxCount": 1,
"probability": 100
},
{
"name": "Drake",
"maxCount": 2,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "831f9d08-398c-42b0-bc53-72e1c0685e34",
"name": "Spawner (206)",
"location": [
5294,
842,
0
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5264,
"y1": 812,
"z1": -128,
"x2": 5325,
"y2": 873,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "WaterElemental",
"maxCount": 4,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "87114b5e-ac9d-4d7f-90c1-c6db7a570c2f",
"name": "Spawner (206)",
"location": [
5226,
826,
0
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5196,
"y1": 796,
"z1": -128,
"x2": 5257,
"y2": 857,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Dragon",
"maxCount": 1,
"probability": 100
},
{
"name": "Drake",
"maxCount": 2,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "889ccd57-8eda-4910-9790-2dc3bc80ca99",
"name": "Spawner (206)",
"location": [
5214,
917,
-40
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5184,
"y1": 887,
"z1": -128,
"x2": 5245,
"y2": 948,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Dragon",
"maxCount": 1,
"probability": 100
},
{
"name": "Drake",
"maxCount": 2,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "8b681dd7-a815-4513-85e6-901967f4e6ed",
"name": "Spawner (206)",
"location": [
5143,
986,
0
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5133,
"y1": 976,
"z1": -128,
"x2": 5154,
"y2": 997,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "TreasureChestLevel3",
"maxCount": 1,
"probability": 100
},
{
"name": "TreasureChestLevel4",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "936bde4a-dce6-44bb-859c-81a3e1f0a87b",
"name": "Spawner (206)",
"location": [
5307,
815,
0
],
"map": "Felucca",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5277,
"y1": 785,
"z1": -128,
"x2": 5338,
"y2": 846,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Drake",
"maxCount": 1,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "9641ac5e-6eec-4f35-8536-226265c67ace",
"name": "Spawner (206)",
"location": [
5205,
778,
0
],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5198,
"y1": 771,
"z1": -128,
"x2": 5213,
"y2": 786,
"z2": 128
},
"walkingRange": 7,
"entries": [
{
"name": "TreasureChestLevel3",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "ad446354-3f49-4c9d-ab1d-dea29378794e",
"name": "Spawner (206)",
"location": [
5157,
997,
0
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5137,
"y1": 977,
"z1": -128,
"x2": 5178,
"y2": 1018,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Wyvern",
"maxCount": 3,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 3,
"probability": 100
},
{
"name": "GiantSerpent",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "b6125064-8514-4c32-953d-c28eca82fa4e",
"name": "Spawner (206)",
"location": [
5229,
841,
1
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5219,
"y1": 831,
"z1": -128,
"x2": 5240,
"y2": 852,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "TreasureChestLevel2",
"maxCount": 1,
"probability": 100
},
{
"name": "TreasureChestLevel3",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "be7b487d-c201-413a-94c8-8201dc3a1c4d",
"name": "Spawner (206)",
"location": [
5141,
834,
0
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5111,
"y1": 804,
"z1": -128,
"x2": 5172,
"y2": 865,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Drake",
"maxCount": 1,
"probability": 100
},
{
"name": "ShadowWyrm",
"maxCount": 1,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "d045c909-34f1-46a6-8d61-7275dc6e45c9",
"name": "Spawner (206)",
"location": [
5317,
980,
0
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5310,
"y1": 973,
"z1": -128,
"x2": 5325,
"y2": 988,
"z2": 128
},
"walkingRange": 7,
"entries": [
{
"name": "TreasureChestLevel3",
"maxCount": 1,
"probability": 100
},
{
"name": "TreasureChestLevel4",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "d8aceeb2-7644-4b3d-96de-4e172f41abd6",
"name": "Spawner (206)",
"location": [
5153,
842,
0
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5113,
"y1": 802,
"z1": -128,
"x2": 5194,
"y2": 883,
"z2": 128
},
"walkingRange": 40,
"entries": [
{
"name": "TreasureChestLevel4",
"maxCount": 4,
"probability": 100
},
{
"name": "TreasureChestLevel3",
"maxCount": 4,
"probability": 100
},
{
"name": "TreasureChestLevel2",
"maxCount": 4,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "e2bea874-3646-4dec-8fc9-cbc0c67f2a0a",
"name": "Spawner (206)",
"location": [
5250,
869,
0
],
"map": "Felucca",
"count": 6,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5220,
"y1": 839,
"z1": -128,
"x2": 5281,
"y2": 900,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "GiantSerpent",
"maxCount": 6,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "e6703676-d851-4394-b09f-51286d5d85f2",
"name": "Spawner (206)",
"location": [
5185,
1006,
0
],
"map": "Felucca",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5165,
"y1": 986,
"z1": -128,
"x2": 5206,
"y2": 1027,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "AncientWyrm",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "e8017d92-b455-4ab2-b484-f95b2957b3be",
"name": "Spawner (206)",
"location": [
5209,
965,
-40
],
"map": "Felucca",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5179,
"y1": 935,
"z1": -128,
"x2": 5240,
"y2": 996,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Dragon",
"maxCount": 1,
"probability": 100
},
{
"name": "Drake",
"maxCount": 2,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "edd4aa65-92a9-491c-97e8-d9906e31fbea",
"name": "Spawner (206)",
"location": [
5169,
836,
0
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5139,
"y1": 806,
"z1": -128,
"x2": 5200,
"y2": 867,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Daemon",
"maxCount": 2,
"probability": 100
},
{
"name": "EvilMage",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "ef6d6675-0683-47e4-b236-bfc890a12227",
"name": "Spawner (206)",
"location": [
5141,
915,
0
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5116,
"y1": 890,
"z1": -128,
"x2": 5167,
"y2": 941,
"z2": 128
},
"walkingRange": 25,
"entries": [
{
"name": "TreasureChestLevel2",
"maxCount": 1,
"probability": 100
},
{
"name": "TreasureChestLevel3",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "f2aa7cb3-ff27-4ea9-a2a4-fe62a0e78b76",
"name": "Spawner (206)",
"location": [
5152,
869,
0
],
"map": "Felucca",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5127,
"y1": 844,
"z1": -128,
"x2": 5178,
"y2": 895,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "Drake",
"maxCount": 1,
"probability": 100
},
{
"name": "ShadowWyrm",
"maxCount": 1,
"probability": 100
},
{
"name": "Wyvern",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "f5973fd2-89b7-405a-bdea-4b1f2fafa92d",
"name": "Spawner (206)",
"location": [
5161,
940,
0
],
"map": "Felucca",
"count": 6,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5141,
"y1": 920,
"z1": -128,
"x2": 5182,
"y2": 961,
"z2": 128
},
"walkingRange": 50,
"entries": [
{
"name": "GiantSerpent",
"maxCount": 6,
"probability": 100
}
]
}
]