ModernUO/Distribution/Data/Spawns/uoml/malas/South.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

944 lines
17 KiB
JSON

[
{
"$type": "Spawner",
"guid": "436de8ee-4a2f-4494-ab76-e24fc6658954",
"name": "Spawner (2404)",
"location": [
2267,
1218,
-85
],
"map": "Malas",
"count": 15,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2087,
"y1": 1038,
"z1": -128,
"x2": 2448,
"y2": 1399,
"z2": 128
},
"walkingRange": 180,
"entries": [
{
"name": "Cat",
"maxCount": 4,
"probability": 100
},
{
"name": "Dog",
"maxCount": 4,
"probability": 100
},
{
"name": "JackRabbit",
"maxCount": 4,
"probability": 100
},
{
"name": "Rat",
"maxCount": 4,
"probability": 100
},
{
"name": "DreadSpider",
"maxCount": 3,
"probability": 100
},
{
"name": "Gazer",
"maxCount": 3,
"probability": 100
},
{
"name": "Ghoul",
"maxCount": 3,
"probability": 100
},
{
"name": "Lich",
"maxCount": 3,
"probability": 100
},
{
"name": "Mummy",
"maxCount": 3,
"probability": 100
},
{
"name": "Ogre",
"maxCount": 3,
"probability": 100
},
{
"name": "Reaper",
"maxCount": 2,
"probability": 100
},
{
"name": "Spectre",
"maxCount": 2,
"probability": 100
},
{
"name": "Wraith",
"maxCount": 2,
"probability": 100
},
{
"name": "Zombie",
"maxCount": 1,
"probability": 100
},
{
"name": "Hind",
"maxCount": 2,
"probability": 100
},
{
"name": "Horse",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "a2c8f9a1-d9fe-4626-9349-c75746354a52",
"name": "Spawner (2404)",
"location": [
2267,
1218,
-85
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2087,
"y1": 1038,
"z1": -128,
"x2": 2448,
"y2": 1399,
"z2": 128
},
"walkingRange": 180,
"entries": [
{
"name": "BrownBear",
"maxCount": 1,
"probability": 100
},
{
"name": "GrizzlyBear",
"maxCount": 1,
"probability": 100
},
{
"name": "BlackBear",
"maxCount": 1,
"probability": 100
},
{
"name": "Cougar",
"maxCount": 1,
"probability": 100
},
{
"name": "Panther",
"maxCount": 1,
"probability": 100
},
{
"name": "DireWolf",
"maxCount": 1,
"probability": 100
},
{
"name": "TimberWolf",
"maxCount": 1,
"probability": 100
},
{
"name": "GreyWolf",
"maxCount": 1,
"probability": 100
},
{
"name": "Bird",
"maxCount": 1,
"probability": 100
},
{
"name": "Eagle",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "adeed33a-83d4-4cf9-b289-f14877d5da5f",
"name": "Spawner (2404)",
"location": [
1943,
1270,
-90
],
"map": "Malas",
"count": 15,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 1763,
"y1": 1090,
"z1": -128,
"x2": 2124,
"y2": 1451,
"z2": 128
},
"walkingRange": 180,
"entries": [
{
"name": "Cat",
"maxCount": 4,
"probability": 100
},
{
"name": "Dog",
"maxCount": 4,
"probability": 100
},
{
"name": "JackRabbit",
"maxCount": 4,
"probability": 100
},
{
"name": "Rat",
"maxCount": 4,
"probability": 100
},
{
"name": "DreadSpider",
"maxCount": 3,
"probability": 100
},
{
"name": "Gazer",
"maxCount": 3,
"probability": 100
},
{
"name": "Ghoul",
"maxCount": 3,
"probability": 100
},
{
"name": "Lich",
"maxCount": 3,
"probability": 100
},
{
"name": "Mummy",
"maxCount": 3,
"probability": 100
},
{
"name": "Ogre",
"maxCount": 3,
"probability": 100
},
{
"name": "Reaper",
"maxCount": 2,
"probability": 100
},
{
"name": "Spectre",
"maxCount": 2,
"probability": 100
},
{
"name": "Wraith",
"maxCount": 2,
"probability": 100
},
{
"name": "Zombie",
"maxCount": 1,
"probability": 100
},
{
"name": "Hind",
"maxCount": 2,
"probability": 100
},
{
"name": "Horse",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "38709150-9301-4899-9792-039c4c4b1790",
"name": "Spawner (2404)",
"location": [
1943,
1270,
-90
],
"map": "Malas",
"count": 4,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 1763,
"y1": 1090,
"z1": -128,
"x2": 2124,
"y2": 1451,
"z2": 128
},
"walkingRange": 180,
"entries": [
{
"name": "BrownBear",
"maxCount": 1,
"probability": 100
},
{
"name": "GrizzlyBear",
"maxCount": 1,
"probability": 100
},
{
"name": "BlackBear",
"maxCount": 1,
"probability": 100
},
{
"name": "Cougar",
"maxCount": 1,
"probability": 100
},
{
"name": "Panther",
"maxCount": 1,
"probability": 100
},
{
"name": "DireWolf",
"maxCount": 1,
"probability": 100
},
{
"name": "TimberWolf",
"maxCount": 1,
"probability": 100
},
{
"name": "GreyWolf",
"maxCount": 1,
"probability": 100
},
{
"name": "Bird",
"maxCount": 1,
"probability": 100
},
{
"name": "Eagle",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "86cc85cb-88c2-44a2-bb9a-2f06be879c18",
"name": "Spawner (2404)",
"location": [
2304,
1258,
-86
],
"map": "Malas",
"count": 40,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2234,
"y1": 1188,
"z1": -128,
"x2": 2375,
"y2": 1329,
"z2": 128
},
"walkingRange": 70,
"entries": [
{
"name": "Corpser",
"maxCount": 6,
"probability": 100
},
{
"name": "Ogre",
"maxCount": 8,
"probability": 100
},
{
"name": "Ettin",
"maxCount": 8,
"probability": 100
},
{
"name": "Reaper",
"maxCount": 9,
"probability": 100
},
{
"name": "SkeletalKnight",
"maxCount": 9,
"probability": 100
},
{
"name": "SkeletalMage",
"maxCount": 8,
"probability": 100
},
{
"name": "Wraith",
"maxCount": 8,
"probability": 100
},
{
"name": "Zombie",
"maxCount": 5,
"probability": 100
},
{
"name": "Ghoul",
"maxCount": 4,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "b158c1ee-114f-418a-8272-cc602195304b",
"name": "Spawner (2404)",
"location": [
1471,
1357,
-85
],
"map": "Malas",
"count": 26,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 1291,
"y1": 1177,
"z1": -128,
"x2": 1652,
"y2": 1538,
"z2": 128
},
"walkingRange": 180,
"entries": [
{
"name": "Gazer",
"maxCount": 4,
"probability": 100
},
{
"name": "GreatHart",
"maxCount": 2,
"probability": 100
},
{
"name": "Hind",
"maxCount": 6,
"probability": 100
},
{
"name": "Horse",
"maxCount": 5,
"probability": 100
},
{
"name": "Sheep",
"maxCount": 4,
"probability": 100
},
{
"name": "Treefellow",
"maxCount": 5,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "42155e29-bf66-4f72-bd02-fda44a8d9882",
"name": "Spawner (2404)",
"location": [
1837,
1803,
-110
],
"map": "Malas",
"count": 40,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 1737,
"y1": 1703,
"z1": -128,
"x2": 1938,
"y2": 1904,
"z2": 128
},
"walkingRange": 100,
"entries": [
{
"name": "Mummy",
"maxCount": 6,
"probability": 100
},
{
"name": "SkeletalKnight",
"maxCount": 6,
"probability": 100
},
{
"name": "SkeletalMage",
"maxCount": 6,
"probability": 100
},
{
"name": "Spectre",
"maxCount": 7,
"probability": 100
},
{
"name": "Wraith",
"maxCount": 7,
"probability": 100
},
{
"name": "Zombie",
"maxCount": 8,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "db534aca-9faa-4405-90a0-ba19554e47fb",
"name": "Spawner (2404)",
"location": [
1641,
1797,
-110
],
"map": "Malas",
"count": 7,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 1541,
"y1": 1697,
"z1": -128,
"x2": 1742,
"y2": 1898,
"z2": 128
},
"walkingRange": 100,
"entries": [
{
"name": "Mongbat",
"maxCount": 2,
"probability": 100
},
{
"name": "SandVortex",
"maxCount": 1,
"probability": 100
},
{
"name": "Scorpion",
"maxCount": 1,
"probability": 100
},
{
"name": "Snake",
"maxCount": 2,
"probability": 100
},
{
"name": "Spectre",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "73285bc9-88f2-4fcf-9daa-9fc686d523d3",
"name": "Spawner (2404)",
"location": [
1899,
1609,
-110
],
"map": "Malas",
"count": 22,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 1799,
"y1": 1509,
"z1": -128,
"x2": 2000,
"y2": 1710,
"z2": 128
},
"walkingRange": 100,
"entries": [
{
"name": "Mongbat",
"maxCount": 6,
"probability": 100
},
{
"name": "SandVortex",
"maxCount": 5,
"probability": 100
},
{
"name": "Scorpion",
"maxCount": 6,
"probability": 100
},
{
"name": "Snake",
"maxCount": 5,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "bc9d5276-a7d4-4f9f-99f9-ce378158a5af",
"name": "Spawner (2404)",
"location": [
1741,
1487,
-110
],
"map": "Malas",
"count": 13,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 1641,
"y1": 1387,
"z1": -128,
"x2": 1842,
"y2": 1588,
"z2": 128
},
"walkingRange": 100,
"entries": [
{
"name": "Mongbat",
"maxCount": 3,
"probability": 100
},
{
"name": "SandVortex",
"maxCount": 2,
"probability": 100
},
{
"name": "Scorpion",
"maxCount": 3,
"probability": 100
},
{
"name": "Snake",
"maxCount": 3,
"probability": 100
},
{
"name": "Spectre",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "783e52d1-194e-474a-927e-0a50e4366d87",
"name": "Spawner (2404)",
"location": [
881,
927,
-90
],
"map": "Malas",
"count": 6,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 851,
"y1": 897,
"z1": -128,
"x2": 912,
"y2": 958,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "Pixie",
"maxCount": 6,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "62849279-92c4-4de1-8e02-1f0d4bf2b6f5",
"name": "Spawner (2404)",
"location": [
769,
1277,
-90
],
"map": "Malas",
"count": 9,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 549,
"y1": 1057,
"z1": -128,
"x2": 990,
"y2": 1498,
"z2": 128
},
"walkingRange": 220,
"entries": [
{
"name": "Titan",
"maxCount": 3,
"probability": 100
},
{
"name": "Horse",
"maxCount": 6,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "ca139d63-ba9b-48df-aa95-4d2f6310f5eb",
"name": "Spawner (2404)",
"location": [
761,
1283,
-90
],
"map": "Malas",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 561,
"y1": 1083,
"z1": -128,
"x2": 962,
"y2": 1484,
"z2": 128
},
"walkingRange": 200,
"entries": [
{
"name": "Eagle",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "a7c283cc-1081-4d32-983b-3d4a7df48438",
"name": "Spawner (2404)",
"location": [
743,
1280,
-90
],
"map": "Malas",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 643,
"y1": 1180,
"z1": -128,
"x2": 844,
"y2": 1381,
"z2": 128
},
"walkingRange": 100,
"entries": [
{
"name": "EvilHealer",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "ede8df6e-ef32-443e-b6fc-53d5a652ce53",
"name": "Spawner (2404)",
"location": [
2304,
1258,
-86
],
"map": "Malas",
"count": 1,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 2234,
"y1": 1188,
"z1": -128,
"x2": 2375,
"y2": 1329,
"z2": 128
},
"walkingRange": 70,
"entries": [
{
"name": "EvilHealer",
"maxCount": 1,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "5bfb14ac-698f-4f85-b3b0-6a7bf9e80efb",
"name": "Spawner (2404)",
"location": [
771,
1277,
-90
],
"map": "Malas",
"count": 29,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 551,
"y1": 1057,
"z1": -128,
"x2": 992,
"y2": 1498,
"z2": 128
},
"walkingRange": 220,
"entries": [
{
"name": "Hind",
"maxCount": 8,
"probability": 100
},
{
"name": "Sheep",
"maxCount": 7,
"probability": 100
},
{
"name": "Ettin",
"maxCount": 7,
"probability": 100
},
{
"name": "Harpy",
"maxCount": 7,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "c9ea7841-c46b-45af-ae9c-df25b1acab4d",
"name": "Spawner (2404)",
"location": [
1347,
1739,
-110
],
"map": "Malas",
"count": 9,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 1217,
"y1": 1609,
"z1": -128,
"x2": 1478,
"y2": 1870,
"z2": 128
},
"walkingRange": 130,
"entries": [
{
"name": "Sheep",
"maxCount": 5,
"probability": 100
},
{
"name": "Horse",
"maxCount": 1,
"probability": 100
},
{
"name": "Hind",
"maxCount": 3,
"probability": 100
}
]
}
]