ModernUO/Distribution/Data/Spawns/shared/ilshenar/Rock.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

481 lines
8.4 KiB
JSON

[
{
"$type": "Spawner",
"guid": "027c989e-9d77-4dfd-85d8-b7c83f722bde",
"name": "Spawner (308)",
"location": [
2094,
56,
-32
],
"map": "Ilshenar",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2089,
"y1": 51,
"z1": -128,
"x2": 2100,
"y2": 62,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "Executioner",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "148839f1-8a5b-44bd-b6f5-3b310de5c951",
"name": "Spawner (308)",
"location": [
2155,
24,
-32
],
"map": "Ilshenar",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2150,
"y1": 19,
"z1": -128,
"x2": 2161,
"y2": 30,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "PoisonElemental",
"maxCount": 2,
"probability": 100
},
{
"name": "LichLord",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "151afe47-a4c7-42d9-999b-6be7ab8ed901",
"name": "Spawner (308)",
"location": [
2125,
137,
-32
],
"map": "Ilshenar",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2120,
"y1": 132,
"z1": -128,
"x2": 2131,
"y2": 143,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "Lich",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "2481376c-f54f-453e-aa09-b0ae25a2da13",
"name": "Spawner (308)",
"location": [
2188,
310,
-7
],
"map": "Ilshenar",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2178,
"y1": 300,
"z1": -128,
"x2": 2199,
"y2": 321,
"z2": 128
},
"walkingRange": 15,
"entries": [
{
"name": "Skeleton",
"maxCount": 3,
"probability": 100
},
{
"name": "Wraith",
"maxCount": 3,
"probability": 100
},
{
"name": "Zombie",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "3a6c8beb-1840-4e1a-b55e-b44158315f59",
"name": "Spawner (308)",
"location": [
2138,
97,
-27
],
"map": "Ilshenar",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2133,
"y1": 92,
"z1": -128,
"x2": 2144,
"y2": 103,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "ElderGazer",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "4f5851f5-110c-4155-91a4-5d6715b52c2f",
"name": "Spawner (308)",
"location": [
2183,
85,
-32
],
"map": "Ilshenar",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2178,
"y1": 80,
"z1": -128,
"x2": 2189,
"y2": 91,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "EvilMage",
"maxCount": 1,
"probability": 100
},
{
"name": "EvilMageLord",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "5c78812b-3143-4ab4-a3e2-950a74181fb1",
"name": "Spawner (308)",
"location": [
2185,
168,
-32
],
"map": "Ilshenar",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2180,
"y1": 163,
"z1": -128,
"x2": 2191,
"y2": 174,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "TreasureChestLevel4",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "6d9c7f2b-dc74-4ca3-9396-fb2a38fa2d80",
"name": "Spawner (308)",
"location": [
2207,
113,
-27
],
"map": "Ilshenar",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2202,
"y1": 108,
"z1": -128,
"x2": 2213,
"y2": 119,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "StoneGargoyle",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "8d713f41-daf3-40c4-9d90-bbf4befb1b08",
"name": "Spawner (308)",
"location": [
2229,
143,
-32
],
"map": "Ilshenar",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2224,
"y1": 138,
"z1": -128,
"x2": 2235,
"y2": 149,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "EvilMage",
"maxCount": 2,
"probability": 100
},
{
"name": "Executioner",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "92ee0621-2fc1-434c-a2d8-11b9359e01bc",
"name": "Spawner (308)",
"location": [
2124,
96,
-32
],
"map": "Ilshenar",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2116,
"y1": 88,
"z1": -128,
"x2": 2133,
"y2": 105,
"z2": 128
},
"walkingRange": 15,
"entries": [
{
"name": "PoisonElemental",
"maxCount": 2,
"probability": 100
},
{
"name": "Lich",
"maxCount": 2,
"probability": 100
},
{
"name": "LichLord",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "93052936-70f8-43b4-a20c-d68adab714c6",
"name": "Spawner (308)",
"location": [
2220,
75,
-27
],
"map": "Ilshenar",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2215,
"y1": 70,
"z1": -128,
"x2": 2226,
"y2": 81,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "AcidElemental",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "bdba50d6-07c1-40ad-ba33-ac67631712cc",
"name": "Spawner (308)",
"location": [
2154,
163,
-27
],
"map": "Ilshenar",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2149,
"y1": 158,
"z1": -128,
"x2": 2160,
"y2": 169,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "Lich",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "f8cc122d-1672-4b14-a6bf-4dcc6178efdc",
"name": "Spawner (308)",
"location": [
2127,
29,
-32
],
"map": "Ilshenar",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2122,
"y1": 24,
"z1": -128,
"x2": 2133,
"y2": 35,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "HellHound",
"maxCount": 1,
"probability": 100
},
{
"name": "LichLord",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "fc19f651-1312-4542-80df-b9f2362974da",
"name": "Spawner (308)",
"location": [
2125,
165,
-32
],
"map": "Ilshenar",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2120,
"y1": 160,
"z1": -128,
"x2": 2131,
"y2": 171,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "EvilMage",
"maxCount": 2,
"probability": 100
},
{
"name": "Executioner",
"maxCount": 2,
"probability": 100
}
]
}
]