- 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>
674 lines
12 KiB
JSON
674 lines
12 KiB
JSON
[
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "0b34e749-7a4e-4dc8-8b84-6d6444d80525",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
335,
|
|
1920,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 1,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 330,
|
|
"y1": 1915,
|
|
"z1": -128,
|
|
"x2": 341,
|
|
"y2": 1926,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 5,
|
|
"entries": [
|
|
{
|
|
"name": "Miasma",
|
|
"maxCount": 1,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "3ba58850-4bed-4935-8a37-e0c703f3b768",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
366,
|
|
1928,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 8,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 346,
|
|
"y1": 1908,
|
|
"z1": -128,
|
|
"x2": 387,
|
|
"y2": 1949,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 20,
|
|
"entries": [
|
|
{
|
|
"name": "Drake",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "AirElemental",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Rat",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Snake",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "3d9f4f90-3f61-4dc1-9715-0d614c34c99c",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
382,
|
|
1913,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 0,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 377,
|
|
"y1": 1908,
|
|
"z1": -128,
|
|
"x2": 388,
|
|
"y2": 1919,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 5,
|
|
"entries": [
|
|
{
|
|
"name": "Meraktus",
|
|
"maxCount": 0,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "46f54372-6b9c-4e33-9f35-99fc01204b59",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
427,
|
|
1923,
|
|
5
|
|
],
|
|
"map": "Malas",
|
|
"count": 10,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 412,
|
|
"y1": 1908,
|
|
"z1": -128,
|
|
"x2": 443,
|
|
"y2": 1939,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 15,
|
|
"entries": [
|
|
{
|
|
"name": "MinotaurCaptain",
|
|
"maxCount": 6,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Minotaur",
|
|
"maxCount": 6,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "MinotaurScout",
|
|
"maxCount": 6,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Rat",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "TropicalBird",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "4a9e68d9-d730-402c-96cc-979f6d08fcfa",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
357,
|
|
1898,
|
|
5
|
|
],
|
|
"map": "Malas",
|
|
"count": 1,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 347,
|
|
"y1": 1888,
|
|
"z1": -128,
|
|
"x2": 368,
|
|
"y2": 1909,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 10,
|
|
"entries": [
|
|
{
|
|
"name": "Rend",
|
|
"maxCount": 1,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "50f241e9-15cf-4561-9a1c-0fe8522d01cd",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
415,
|
|
1897,
|
|
5
|
|
],
|
|
"map": "Malas",
|
|
"count": 1,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 410,
|
|
"y1": 1892,
|
|
"z1": -128,
|
|
"x2": 421,
|
|
"y2": 1903,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 5,
|
|
"entries": [
|
|
{
|
|
"name": "Pyre",
|
|
"maxCount": 1,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "613eb20c-bb8e-4f16-8561-bd839851b463",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
390,
|
|
1883,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 8,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 380,
|
|
"y1": 1873,
|
|
"z1": -128,
|
|
"x2": 401,
|
|
"y2": 1894,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 10,
|
|
"entries": [
|
|
{
|
|
"name": "Eagle",
|
|
"maxCount": 8,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Cat",
|
|
"maxCount": 8,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Bird",
|
|
"maxCount": 8,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "TropicalBird",
|
|
"maxCount": 8,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "a451b30c-88b8-411d-99b6-3a66cdfd0cd5",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
355,
|
|
1918,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 6,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 335,
|
|
"y1": 1898,
|
|
"z1": -128,
|
|
"x2": 376,
|
|
"y2": 1939,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 20,
|
|
"entries": [
|
|
{
|
|
"name": "Reptalon",
|
|
"maxCount": 6,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Minotaur",
|
|
"maxCount": 6,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "aaca3ab0-5ea8-4af5-ac5f-c037d41b00fa",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
347,
|
|
1888,
|
|
5
|
|
],
|
|
"map": "Malas",
|
|
"count": 4,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 327,
|
|
"y1": 1868,
|
|
"z1": -128,
|
|
"x2": 368,
|
|
"y2": 1909,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 20,
|
|
"entries": [
|
|
{
|
|
"name": "flurry",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "grim",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "mistral",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "tempest",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "af7b61de-563e-4559-9905-d5113f0e7c02",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
392,
|
|
1917,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 20,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 372,
|
|
"y1": 1897,
|
|
"z1": -128,
|
|
"x2": 413,
|
|
"y2": 1938,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 20,
|
|
"entries": [
|
|
{
|
|
"name": "MinotaurScout",
|
|
"maxCount": 11,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Minotaur",
|
|
"maxCount": 11,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "MinotaurCaptain",
|
|
"maxCount": 11,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Squirrel",
|
|
"maxCount": 9,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "TropicalBird",
|
|
"maxCount": 9,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Bird",
|
|
"maxCount": 9,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Cat",
|
|
"maxCount": 9,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "b8196e8f-9f8f-4362-b188-6bb06dbfea9d",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
336,
|
|
1891,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 5,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 324,
|
|
"y1": 1879,
|
|
"z1": -128,
|
|
"x2": 349,
|
|
"y2": 1904,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 12,
|
|
"entries": [
|
|
{
|
|
"name": "Minotaur",
|
|
"maxCount": 5,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "MinotaurScout",
|
|
"maxCount": 5,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "b9da636f-3e98-4924-a7da-8ac3d0141e5f",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
1742,
|
|
990,
|
|
-84
|
|
],
|
|
"map": "Malas",
|
|
"count": 10,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 1730,
|
|
"y1": 978,
|
|
"z1": -128,
|
|
"x2": 1755,
|
|
"y2": 1003,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 12,
|
|
"entries": [
|
|
{
|
|
"name": "Scorpion",
|
|
"maxCount": 6,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Snake",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "c1e202ec-c6ba-4c76-8a26-29767ae27907",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
346,
|
|
1910,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 6,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 334,
|
|
"y1": 1898,
|
|
"z1": -128,
|
|
"x2": 359,
|
|
"y2": 1923,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 12,
|
|
"entries": [
|
|
{
|
|
"name": "TropicalBird",
|
|
"maxCount": 6,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Bird",
|
|
"maxCount": 6,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "ebe544f9-9a54-4822-bb37-ee11ba1059db",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
384,
|
|
1932,
|
|
10
|
|
],
|
|
"map": "Malas",
|
|
"count": 5,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 374,
|
|
"y1": 1922,
|
|
"z1": -128,
|
|
"x2": 395,
|
|
"y2": 1943,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 10,
|
|
"entries": [
|
|
{
|
|
"name": "Minotaur",
|
|
"maxCount": 3,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Snake",
|
|
"maxCount": 2,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "eea9dc24-23e1-4198-8dbc-b22bddb5a71c",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
1740,
|
|
990,
|
|
-80
|
|
],
|
|
"map": "Malas",
|
|
"count": 1,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 1725,
|
|
"y1": 975,
|
|
"z1": -128,
|
|
"x2": 1756,
|
|
"y2": 1006,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 15,
|
|
"entries": [
|
|
{
|
|
"name": "WanderingHealer",
|
|
"maxCount": 1,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "ef581668-95b6-4e1b-b43f-06e805e2e646",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
348,
|
|
1948,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 16,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 333,
|
|
"y1": 1933,
|
|
"z1": -128,
|
|
"x2": 364,
|
|
"y2": 1964,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 15,
|
|
"entries": [
|
|
{
|
|
"name": "TropicalBird",
|
|
"maxCount": 12,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Eagle",
|
|
"maxCount": 12,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Rat",
|
|
"maxCount": 12,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Bird",
|
|
"maxCount": 12,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "MinotaurScout",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"$type": "Spawner",
|
|
"guid": "f5972024-9852-4b8d-96a2-bf1afc05c588",
|
|
"name": "Spawner (407)",
|
|
"location": [
|
|
346,
|
|
1959,
|
|
0
|
|
],
|
|
"map": "Malas",
|
|
"count": 4,
|
|
"minDelay": "00:05:00",
|
|
"maxDelay": "00:10:00",
|
|
"team": 0,
|
|
"spawnBounds": {
|
|
"x1": 336,
|
|
"y1": 1949,
|
|
"z1": -128,
|
|
"x2": 357,
|
|
"y2": 1970,
|
|
"z2": 128
|
|
},
|
|
"walkingRange": 10,
|
|
"entries": [
|
|
{
|
|
"name": "Squirrel",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
},
|
|
{
|
|
"name": "Rat",
|
|
"maxCount": 4,
|
|
"probability": 100
|
|
}
|
|
]
|
|
}
|
|
]
|