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>
This commit is contained in:
Kamron Batman 2026-06-25 16:17:35 -07:00
parent ede4bcc718
commit 2f8a7afa57
112 changed files with 198936 additions and 40949 deletions

View file

@ -1,42 +1,104 @@
[
[
{
"type": "Spawner",
"$type": "Spawner",
"guid": "8c2124f4-e175-4198-8cf8-9cf64804fc22",
"name": "Spawner (408)",
"location": [98, 1656, 0],
"location": [
98,
1656,
0
],
"map": "Malas",
"count": 16,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 40,
"spawnBounds": {
"x1": 58,
"y1": 1616,
"z1": -128,
"x2": 139,
"y2": 1697,
"z2": 128
},
"walkingRange": 40,
"entries": [
{ "name": "GoreFiend", "maxCount": 4, "probability": 100 },
{ "name": "PatchworkSkeleton", "maxCount": 4, "probability": 100 },
{ "name": "BoneKnight", "maxCount": 6, "probability": 100 },
{ "name": "BoneMagi", "maxCount": 6, "probability": 100 },
{ "name": "BoneKnight", "maxCount": 6, "probability": 100 },
{ "name": "SkeletalMage", "maxCount": 6, "probability": 100 },
{ "name": "Zombie", "maxCount": 4, "probability": 100 },
{ "name": "Skeleton", "maxCount": 4, "probability": 100 },
{ "name": "RottingCorpse", "maxCount": 2, "probability": 100 }
{
"name": "GoreFiend",
"maxCount": 4,
"probability": 100
},
{
"name": "PatchworkSkeleton",
"maxCount": 4,
"probability": 100
},
{
"name": "BoneKnight",
"maxCount": 6,
"probability": 100
},
{
"name": "BoneMagi",
"maxCount": 6,
"probability": 100
},
{
"name": "BoneKnight",
"maxCount": 6,
"probability": 100
},
{
"name": "SkeletalMage",
"maxCount": 6,
"probability": 100
},
{
"name": "Zombie",
"maxCount": 4,
"probability": 100
},
{
"name": "Skeleton",
"maxCount": 4,
"probability": 100
},
{
"name": "RottingCorpse",
"maxCount": 2,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "eaa69fa3-4076-4fc5-950a-fe175713bbd3",
"name": "Spawner (408)",
"location": [104, 1655, 0],
"location": [
104,
1655,
0
],
"map": "Malas",
"count": 1,
"minDelay": "00:15:00",
"maxDelay": "00:30:00",
"team": 0,
"homeRange": 15,
"spawnBounds": {
"x1": 89,
"y1": 1640,
"z1": -128,
"x2": 120,
"y2": 1671,
"z2": 128
},
"walkingRange": 15,
"entries": [
{ "name": "RedDeath", "maxCount": 1, "probability": 100 }
{
"name": "RedDeath",
"maxCount": 1,
"probability": 100
}
]
}
]

View file

@ -1,263 +1,572 @@
[
[
{
"type": "Spawner",
"$type": "Spawner",
"guid": "114d80f2-07e6-49e3-9418-6e7c30291028",
"name": "Spawner (406)",
"location": [142, 1921, 0],
"location": [
142,
1921,
0
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"spawnBounds": {
"x1": 137,
"y1": 1916,
"z1": -128,
"x2": 148,
"y2": 1927,
"z2": 128
},
"walkingRange": 5,
"entries": [
{ "name": "tigersclawthief", "maxCount": 4, "probability": 100 }
{
"name": "tigersclawthief",
"maxCount": 4,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "15b169f9-fe9e-4ef7-973b-cb0619b9937d",
"name": "Spawner (406)",
"location": [82, 1875, 0],
"location": [
82,
1875,
0
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"spawnBounds": {
"x1": 77,
"y1": 1870,
"z1": -128,
"x2": 88,
"y2": 1881,
"z2": 128
},
"walkingRange": 5,
"entries": [
{ "name": "serpentsfangassassin", "maxCount": 4, "probability": 100 },
{ "name": "eliteninjawarrior", "maxCount": 4, "probability": 100 }
{
"name": "serpentsfangassassin",
"maxCount": 4,
"probability": 100
},
{
"name": "eliteninjawarrior",
"maxCount": 4,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "17abd9d2-3b7a-44ec-a724-57c202236788",
"name": "Spawner (406)",
"location": [179, 1869, 0],
"location": [
179,
1869,
0
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"spawnBounds": {
"x1": 169,
"y1": 1859,
"z1": -128,
"x2": 190,
"y2": 1880,
"z2": 128
},
"walkingRange": 10,
"entries": [
{ "name": "serpentsfangassassin", "maxCount": 4, "probability": 100 },
{ "name": "tigersclawthief", "maxCount": 4, "probability": 100 }
{
"name": "serpentsfangassassin",
"maxCount": 4,
"probability": 100
},
{
"name": "tigersclawthief",
"maxCount": 4,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "28535caf-b979-4745-8a87-e62691d7cb11",
"name": "Spawner (406)",
"location": [145, 1898, 0],
"location": [
145,
1898,
0
],
"map": "Malas",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 25,
"spawnBounds": {
"x1": 120,
"y1": 1873,
"z1": -128,
"x2": 171,
"y2": 1924,
"z2": 128
},
"walkingRange": 25,
"entries": [
{ "name": "serpentsfangassassin", "maxCount": 3, "probability": 100 },
{ "name": "tigersclawthief", "maxCount": 3, "probability": 100 },
{ "name": "eliteninjawarrior", "maxCount": 3, "probability": 100 }
{
"name": "serpentsfangassassin",
"maxCount": 3,
"probability": 100
},
{
"name": "tigersclawthief",
"maxCount": 3,
"probability": 100
},
{
"name": "eliteninjawarrior",
"maxCount": 3,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "2d629e57-63db-4610-b6d2-cf3bfd34f0b0",
"name": "Spawner (406)",
"location": [181, 1883, 0],
"location": [
181,
1883,
0
],
"map": "Malas",
"count": 8,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"spawnBounds": {
"x1": 176,
"y1": 1878,
"z1": -128,
"x2": 187,
"y2": 1889,
"z2": 128
},
"walkingRange": 5,
"entries": [
{ "name": "serpentsfangassassin", "maxCount": 8, "probability": 100 },
{ "name": "tigersclawthief", "maxCount": 8, "probability": 100 },
{ "name": "dragonsflamemage", "maxCount": 8, "probability": 100 },
{ "name": "eliteninjawarrior", "maxCount": 8, "probability": 100 }
{
"name": "serpentsfangassassin",
"maxCount": 8,
"probability": 100
},
{
"name": "tigersclawthief",
"maxCount": 8,
"probability": 100
},
{
"name": "dragonsflamemage",
"maxCount": 8,
"probability": 100
},
{
"name": "eliteninjawarrior",
"maxCount": 8,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "347e85d2-c752-4abf-86c7-bda2a2051033",
"name": "Spawner (406)",
"location": [183, 1961, 0],
"location": [
183,
1961,
0
],
"map": "Malas",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 20,
"spawnBounds": {
"x1": 163,
"y1": 1941,
"z1": -128,
"x2": 204,
"y2": 1982,
"z2": 128
},
"walkingRange": 20,
"entries": [
{ "name": "dragonsflamemage", "maxCount": 2, "probability": 100 },
{ "name": "serpentsfangassassin", "maxCount": 2, "probability": 100 }
{
"name": "dragonsflamemage",
"maxCount": 2,
"probability": 100
},
{
"name": "serpentsfangassassin",
"maxCount": 2,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "364cc553-16d0-428d-bf97-061c3ddfd120",
"name": "Spawner (406)",
"location": [170, 1974, 0],
"location": [
170,
1974,
0
],
"map": "Malas",
"count": 3,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"spawnBounds": {
"x1": 165,
"y1": 1969,
"z1": -128,
"x2": 176,
"y2": 1980,
"z2": 128
},
"walkingRange": 5,
"entries": [
{ "name": "serpentsfangassassin", "maxCount": 3, "probability": 100 },
{ "name": "serpentsfanghighexecutioner", "maxCount": 3, "probability": 100 }
{
"name": "serpentsfangassassin",
"maxCount": 3,
"probability": 100
},
{
"name": "serpentsfanghighexecutioner",
"maxCount": 3,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "435ce67b-aad4-4ed0-b621-73ab4b6b0042",
"name": "Spawner (406)",
"location": [81, 1892, 0],
"location": [
81,
1892,
0
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"spawnBounds": {
"x1": 76,
"y1": 1887,
"z1": -128,
"x2": 87,
"y2": 1898,
"z2": 128
},
"walkingRange": 5,
"entries": [
{ "name": "eliteninjawarrior", "maxCount": 4, "probability": 100 },
{ "name": "serpentsfangassassin", "maxCount": 4, "probability": 100 },
{ "name": "dragonsflamemage", "maxCount": 4, "probability": 100 }
{
"name": "eliteninjawarrior",
"maxCount": 4,
"probability": 100
},
{
"name": "serpentsfangassassin",
"maxCount": 4,
"probability": 100
},
{
"name": "dragonsflamemage",
"maxCount": 4,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "4854c18d-7bf2-4f8c-a69f-7679204b6d7d",
"name": "Spawner (406)",
"location": [155, 1869, 0],
"location": [
155,
1869,
0
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 10,
"spawnBounds": {
"x1": 145,
"y1": 1859,
"z1": -128,
"x2": 166,
"y2": 1880,
"z2": 128
},
"walkingRange": 10,
"entries": [
{ "name": "serpentsfangassassin", "maxCount": 4, "probability": 100 },
{ "name": "dragonsflamemage", "maxCount": 4, "probability": 100 }
{
"name": "serpentsfangassassin",
"maxCount": 4,
"probability": 100
},
{
"name": "dragonsflamemage",
"maxCount": 4,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "50c87975-6021-46cb-bbe1-58c45ba776b7",
"name": "Spawner (406)",
"location": [77, 1883, 0],
"location": [
77,
1883,
0
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 5,
"spawnBounds": {
"x1": 72,
"y1": 1878,
"z1": -128,
"x2": 83,
"y2": 1889,
"z2": 128
},
"walkingRange": 5,
"entries": [
{ "name": "dragonsflamemage", "maxCount": 4, "probability": 100 },
{ "name": "eliteninjawarrior", "maxCount": 4, "probability": 100 }
{
"name": "dragonsflamemage",
"maxCount": 4,
"probability": 100
},
{
"name": "eliteninjawarrior",
"maxCount": 4,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "856c181e-183a-4231-acc8-5146301c56c6",
"name": "Spawner (406)",
"location": [185, 1920, 0],
"location": [
185,
1920,
0
],
"map": "Malas",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 7,
"spawnBounds": {
"x1": 178,
"y1": 1913,
"z1": -128,
"x2": 193,
"y2": 1928,
"z2": 128
},
"walkingRange": 7,
"entries": [
{ "name": "magedragonsflamemage", "maxCount": 2, "probability": 100 }
{
"name": "magedragonsflamemage",
"maxCount": 2,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "9f02ef97-7699-4a65-8cd6-615aa50cc318",
"name": "Spawner (406)",
"location": [139, 1868, 0],
"location": [
139,
1868,
0
],
"map": "Malas",
"count": 7,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 8,
"spawnBounds": {
"x1": 131,
"y1": 1860,
"z1": -128,
"x2": 148,
"y2": 1877,
"z2": 128
},
"walkingRange": 8,
"entries": [
{ "name": "serpentsfangassassin", "maxCount": 7, "probability": 100 },
{ "name": "tigersclawthief", "maxCount": 7, "probability": 100 },
{ "name": "magedragonsflamemage", "maxCount": 7, "probability": 100 },
{ "name": "dragonsflamemage", "maxCount": 7, "probability": 100 },
{ "name": "eliteninjawarrior", "maxCount": 7, "probability": 100 }
{
"name": "serpentsfangassassin",
"maxCount": 7,
"probability": 100
},
{
"name": "tigersclawthief",
"maxCount": 7,
"probability": 100
},
{
"name": "magedragonsflamemage",
"maxCount": 7,
"probability": 100
},
{
"name": "dragonsflamemage",
"maxCount": 7,
"probability": 100
},
{
"name": "eliteninjawarrior",
"maxCount": 7,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "b5fed5a1-35db-4f09-b4b6-8017146a8bf3",
"name": "Spawner (406)",
"location": [174, 1900, 0],
"location": [
174,
1900,
0
],
"map": "Malas",
"count": 5,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 20,
"spawnBounds": {
"x1": 154,
"y1": 1880,
"z1": -128,
"x2": 195,
"y2": 1921,
"z2": 128
},
"walkingRange": 20,
"entries": [
{ "name": "serpentsfangassassin", "maxCount": 5, "probability": 100 },
{ "name": "dragonsflamemage", "maxCount": 5, "probability": 100 },
{ "name": "eliteninjawarrior", "maxCount": 5, "probability": 100 }
{
"name": "serpentsfangassassin",
"maxCount": 5,
"probability": 100
},
{
"name": "dragonsflamemage",
"maxCount": 5,
"probability": 100
},
{
"name": "eliteninjawarrior",
"maxCount": 5,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "dccae74d-bafa-40ff-9984-7a2a0af5d8de",
"name": "Spawner (406)",
"location": [140, 1974, 0],
"location": [
140,
1974,
0
],
"map": "Malas",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 8,
"spawnBounds": {
"x1": 132,
"y1": 1966,
"z1": -128,
"x2": 149,
"y2": 1983,
"z2": 128
},
"walkingRange": 8,
"entries": [
{ "name": "magedragonsflamemage", "maxCount": 2, "probability": 100 },
{ "name": "serpentsfangassassin", "maxCount": 2, "probability": 100 }
{
"name": "magedragonsflamemage",
"maxCount": 2,
"probability": 100
},
{
"name": "serpentsfangassassin",
"maxCount": 2,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "fb6ee275-c5c2-4780-9180-76e3a4ac1a97",
"name": "Spawner (406)",
"location": [134, 1947, 0],
"location": [
134,
1947,
0
],
"map": "Malas",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 7,
"spawnBounds": {
"x1": 127,
"y1": 1940,
"z1": -128,
"x2": 142,
"y2": 1955,
"z2": 128
},
"walkingRange": 7,
"entries": [
{ "name": "magedragonsflamemage", "maxCount": 2, "probability": 100 },
{ "name": "dragonsflamemage", "maxCount": 2, "probability": 100 }
{
"name": "magedragonsflamemage",
"maxCount": 2,
"probability": 100
},
{
"name": "dragonsflamemage",
"maxCount": 2,
"probability": 100
}
]
}
]

File diff suppressed because it is too large Load diff

View file

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

File diff suppressed because it is too large Load diff

View file

@ -1,182 +1,412 @@
[
[
{
"type": "Spawner",
"$type": "Spawner",
"guid": "0cb005f6-2405-41d4-b9b6-9ad8c75a6851",
"name": "Spawner (403)",
"location": [1372, 1225, -90],
"location": [
1372,
1225,
-90
],
"map": "Malas",
"count": 10,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 20,
"spawnBounds": {
"x1": 1352,
"y1": 1205,
"z1": -128,
"x2": 1393,
"y2": 1246,
"z2": 128
},
"walkingRange": 40,
"entries": [
{ "name": "OrcBrute", "maxCount": 1, "probability": 100 },
{ "name": "OrcishLord", "maxCount": 2, "probability": 100 },
{ "name": "Orc", "maxCount": 4, "probability": 100 },
{ "name": "OrcishMage", "maxCount": 2, "probability": 100 },
{ "name": "OrcBomber", "maxCount": 1, "probability": 100 }
{
"name": "OrcBrute",
"maxCount": 1,
"probability": 100
},
{
"name": "OrcishLord",
"maxCount": 2,
"probability": 100
},
{
"name": "Orc",
"maxCount": 4,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 2,
"probability": 100
},
{
"name": "OrcBomber",
"maxCount": 1,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "2abcbbd3-3842-46f6-95f1-41b743bb7083",
"name": "Spawner (403)",
"location": [1364, 596, -86],
"location": [
1364,
596,
-86
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 4,
"spawnBounds": {
"x1": 1360,
"y1": 592,
"z1": -128,
"x2": 1369,
"y2": 601,
"z2": 128
},
"walkingRange": 15,
"entries": [
{ "name": "Orc", "maxCount": 2, "probability": 100 },
{ "name": "OrcishLord", "maxCount": 1, "probability": 100 },
{ "name": "OrcishMage", "maxCount": 1, "probability": 100 }
{
"name": "Orc",
"maxCount": 2,
"probability": 100
},
{
"name": "OrcishLord",
"maxCount": 1,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 1,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "415080ef-9b67-4529-8651-f82d4e0fba5c",
"name": "Spawner (403)",
"location": [1205, 700, -88],
"location": [
1205,
700,
-88
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 4,
"spawnBounds": {
"x1": 1201,
"y1": 696,
"z1": -128,
"x2": 1210,
"y2": 705,
"z2": 128
},
"walkingRange": 20,
"entries": [
{ "name": "Orc", "maxCount": 2, "probability": 100 },
{ "name": "OrcishLord", "maxCount": 1, "probability": 100 },
{ "name": "OrcishMage", "maxCount": 1, "probability": 100 }
{
"name": "Orc",
"maxCount": 2,
"probability": 100
},
{
"name": "OrcishLord",
"maxCount": 1,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 1,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "778c0ad2-e39e-4c61-9b1c-e45b6a9b554e",
"name": "Spawner (403)",
"location": [1257, 1326, -90],
"location": [
1257,
1326,
-90
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 4,
"spawnBounds": {
"x1": 1253,
"y1": 1322,
"z1": -128,
"x2": 1262,
"y2": 1331,
"z2": 128
},
"walkingRange": 15,
"entries": [
{ "name": "Orc", "maxCount": 2, "probability": 100 },
{ "name": "OrcishLord", "maxCount": 1, "probability": 100 },
{ "name": "OrcishMage", "maxCount": 1, "probability": 100 }
{
"name": "Orc",
"maxCount": 2,
"probability": 100
},
{
"name": "OrcishLord",
"maxCount": 1,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 1,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "9a42ced3-e2d2-4d65-bb78-3903a4092c9f",
"name": "Spawner (403)",
"location": [1343, 1196, -90],
"location": [
1343,
1196,
-90
],
"map": "Malas",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 4,
"spawnBounds": {
"x1": 1339,
"y1": 1192,
"z1": -128,
"x2": 1348,
"y2": 1201,
"z2": 128
},
"walkingRange": 4,
"entries": [
{ "name": "Orc", "maxCount": 2, "probability": 100 }
{
"name": "Orc",
"maxCount": 2,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "b187d6bd-fe00-43c8-906d-f18ee330f432",
"name": "Spawner (403)",
"location": [911, 194, -79],
"location": [
911,
194,
-79
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 4,
"spawnBounds": {
"x1": 907,
"y1": 190,
"z1": -128,
"x2": 916,
"y2": 199,
"z2": 128
},
"walkingRange": 15,
"entries": [
{ "name": "Orc", "maxCount": 2, "probability": 100 },
{ "name": "OrcishLord", "maxCount": 1, "probability": 100 },
{ "name": "OrcishMage", "maxCount": 1, "probability": 100 }
{
"name": "Orc",
"maxCount": 2,
"probability": 100
},
{
"name": "OrcishLord",
"maxCount": 1,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 1,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "c4a2ba68-4d62-480c-a9a9-b893f56a1a5d",
"name": "Spawner (403)",
"location": [1598, 1819, -110],
"location": [
1598,
1819,
-110
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 4,
"spawnBounds": {
"x1": 1594,
"y1": 1815,
"z1": -128,
"x2": 1603,
"y2": 1824,
"z2": 128
},
"walkingRange": 15,
"entries": [
{ "name": "Orc", "maxCount": 2, "probability": 100 },
{ "name": "OrcishLord", "maxCount": 1, "probability": 100 },
{ "name": "OrcishMage", "maxCount": 1, "probability": 100 }
{
"name": "Orc",
"maxCount": 2,
"probability": 100
},
{
"name": "OrcishLord",
"maxCount": 1,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 1,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "c93264b1-19bd-47d9-ae8d-261e8d36fc30",
"name": "Spawner (403)",
"location": [1665, 356, -50],
"location": [
1665,
356,
-50
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 4,
"spawnBounds": {
"x1": 1661,
"y1": 352,
"z1": -128,
"x2": 1670,
"y2": 361,
"z2": 128
},
"walkingRange": 25,
"entries": [
{ "name": "Orc", "maxCount": 2, "probability": 100 },
{ "name": "OrcishLord", "maxCount": 1, "probability": 100 },
{ "name": "OrcishMage", "maxCount": 1, "probability": 100 }
{
"name": "Orc",
"maxCount": 2,
"probability": 100
},
{
"name": "OrcishLord",
"maxCount": 1,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 1,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "ea44d8fe-27b9-4650-9c22-fed0630e5cc3",
"name": "Spawner (403)",
"location": [1322, 1225, -90],
"location": [
1322,
1225,
-90
],
"map": "Malas",
"count": 10,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 20,
"spawnBounds": {
"x1": 1302,
"y1": 1205,
"z1": -128,
"x2": 1343,
"y2": 1246,
"z2": 128
},
"walkingRange": 40,
"entries": [
{ "name": "OrcBrute", "maxCount": 1, "probability": 100 },
{ "name": "OrcishLord", "maxCount": 2, "probability": 100 },
{ "name": "Orc", "maxCount": 4, "probability": 100 },
{ "name": "OrcishMage", "maxCount": 2, "probability": 100 },
{ "name": "OrcBomber", "maxCount": 1, "probability": 100 }
{
"name": "OrcBrute",
"maxCount": 1,
"probability": 100
},
{
"name": "OrcishLord",
"maxCount": 2,
"probability": 100
},
{
"name": "Orc",
"maxCount": 4,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 2,
"probability": 100
},
{
"name": "OrcBomber",
"maxCount": 1,
"probability": 100
}
]
},
{
"type": "Spawner",
"$type": "Spawner",
"guid": "f4837b68-40f5-42db-b907-f4fe65248cf9",
"name": "Spawner (403)",
"location": [1343, 1248, -90],
"location": [
1343,
1248,
-90
],
"map": "Malas",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:15:00",
"team": 0,
"homeRange": 4,
"spawnBounds": {
"x1": 1339,
"y1": 1244,
"z1": -128,
"x2": 1348,
"y2": 1253,
"z2": 128
},
"walkingRange": 4,
"entries": [
{ "name": "Orc", "maxCount": 2, "probability": 100 }
{
"name": "Orc",
"maxCount": 2,
"probability": 100
}
]
}
]

View file

@ -1,22 +1,53 @@
[
[
{
"type": "Spawner",
"$type": "Spawner",
"guid": "6bbb82e4-b0d1-4a23-a9da-5d35911ce762",
"name": "Spawner (404)",
"location": [2231, 1605, -95],
"location": [
2231,
1605,
-95
],
"map": "Malas",
"count": 33,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"homeRange": 160,
"spawnBounds": {
"x1": 2071,
"y1": 1445,
"z1": -128,
"x2": 2392,
"y2": 1766,
"z2": 128
},
"walkingRange": 160,
"entries": [
{ "name": "Mongbat", "maxCount": 7, "probability": 100 },
{ "name": "SandVortex", "maxCount": 6, "probability": 100 },
{ "name": "Scorpion", "maxCount": 7, "probability": 100 },
{ "name": "Snake", "maxCount": 6, "probability": 100 },
{ "name": "Spectre", "maxCount": 7, "probability": 100 }
{
"name": "Mongbat",
"maxCount": 7,
"probability": 100
},
{
"name": "SandVortex",
"maxCount": 6,
"probability": 100
},
{
"name": "Scorpion",
"maxCount": 7,
"probability": 100
},
{
"name": "Snake",
"maxCount": 6,
"probability": 100
},
{
"name": "Spectre",
"maxCount": 7,
"probability": 100
}
]
}
]

File diff suppressed because it is too large Load diff