- 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>
481 lines
8.4 KiB
JSON
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
|
|
}
|
|
]
|
|
}
|
|
]
|