ModernUO/Distribution/Data/Spawns/shared/trammel/Sanctuary.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

710 lines
13 KiB
JSON

[
{
"$type": "Spawner",
"guid": "01891c2e-7b0f-4f3e-81a6-199eb062ec9c",
"name": "Spawner (117)",
"location": [
6168,
117,
0
],
"map": "Trammel",
"count": 34,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 6138,
"y1": 87,
"z1": -128,
"x2": 6199,
"y2": 148,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "Ratman",
"maxCount": 11,
"probability": 100
},
{
"name": "RatmanArcher",
"maxCount": 11,
"probability": 100
},
{
"name": "RatmanMage",
"maxCount": 11,
"probability": 100
},
{
"name": "Changeling",
"maxCount": 11,
"probability": 100
},
{
"name": "Doppleganger",
"maxCount": 11,
"probability": 100
},
{
"name": "Dog",
"maxCount": 9,
"probability": 100
},
{
"name": "Chicken",
"maxCount": 9,
"probability": 100
},
{
"name": "Cat",
"maxCount": 9,
"probability": 100
},
{
"name": "Boar",
"maxCount": 9,
"probability": 100
},
{
"name": "Bird",
"maxCount": 9,
"probability": 100
},
{
"name": "Gargoyle",
"maxCount": 3,
"probability": 100
},
{
"name": "Titan",
"maxCount": 3,
"probability": 100
},
{
"name": "Cyclops",
"maxCount": 3,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 5,
"probability": 100
},
{
"name": "orcscout",
"maxCount": 5,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "0983061e-4deb-4750-8f2b-ee10756735ec",
"name": "Spawner (117)",
"location": [
6184,
29,
0
],
"map": "Trammel",
"count": 9,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 6174,
"y1": 19,
"z1": -128,
"x2": 6195,
"y2": 40,
"z2": 128
},
"walkingRange": 10,
"entries": [
{
"name": "Bird",
"maxCount": 6,
"probability": 100
},
{
"name": "Chicken",
"maxCount": 6,
"probability": 100
},
{
"name": "Rat",
"maxCount": 6,
"probability": 100
},
{
"name": "Dog",
"maxCount": 6,
"probability": 100
},
{
"name": "Doppleganger",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "18850a42-5089-43d9-9f0c-1adca014ed3e",
"name": "Spawner (117)",
"location": [
6349,
89,
-20
],
"map": "Trammel",
"count": 30,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 6279,
"y1": 19,
"z1": -128,
"x2": 6420,
"y2": 160,
"z2": 128
},
"walkingRange": 70,
"entries": [
{
"name": "Ratman",
"maxCount": 18,
"probability": 100
},
{
"name": "RatmanArcher",
"maxCount": 18,
"probability": 100
},
{
"name": "Chiikkaha",
"maxCount": 18,
"probability": 100
},
{
"name": "Titan",
"maxCount": 18,
"probability": 100
},
{
"name": "Cyclops",
"maxCount": 18,
"probability": 100
},
{
"name": "Rat",
"maxCount": 18,
"probability": 100
},
{
"name": "Ratman",
"maxCount": 4,
"probability": 100
},
{
"name": "RatmanArcher",
"maxCount": 4,
"probability": 100
},
{
"name": "Chiikkaha",
"maxCount": 2,
"probability": 100
},
{
"name": "Titan",
"maxCount": 2,
"probability": 100
},
{
"name": "Cyclops",
"maxCount": 2,
"probability": 100
},
{
"name": "Rat",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "2862d617-a6ad-449e-b063-3a11f39753d7",
"name": "Spawner (117)",
"location": [
6265,
48,
-10
],
"map": "Trammel",
"count": 53,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 6235,
"y1": 18,
"z1": -128,
"x2": 6296,
"y2": 79,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "Szavetra",
"maxCount": 22,
"probability": 100
},
{
"name": "Imp",
"maxCount": 22,
"probability": 100
},
{
"name": "Titan",
"maxCount": 22,
"probability": 100
},
{
"name": "Snake",
"maxCount": 22,
"probability": 100
},
{
"name": "Ratman",
"maxCount": 22,
"probability": 100
},
{
"name": "Doppleganger",
"maxCount": 22,
"probability": 100
},
{
"name": "Gargoyle",
"maxCount": 22,
"probability": 100
},
{
"name": "Cow",
"maxCount": 18,
"probability": 100
},
{
"name": "Bull",
"maxCount": 18,
"probability": 100
},
{
"name": "Chicken",
"maxCount": 18,
"probability": 100
},
{
"name": "Bird",
"maxCount": 18,
"probability": 100
},
{
"name": "Pig",
"maxCount": 18,
"probability": 100
},
{
"name": "Dog",
"maxCount": 18,
"probability": 100
},
{
"name": "Goat",
"maxCount": 18,
"probability": 100
},
{
"name": "Cat",
"maxCount": 18,
"probability": 100
},
{
"name": "Rat",
"maxCount": 18,
"probability": 100
},
{
"name": "Orc",
"maxCount": 9,
"probability": 100
},
{
"name": "OrcCaptain",
"maxCount": 9,
"probability": 100
},
{
"name": "OrcishMage",
"maxCount": 9,
"probability": 100
},
{
"name": "Ogre",
"maxCount": 4,
"probability": 100
},
{
"name": "Ogre",
"maxCount": 4,
"probability": 100
},
{
"name": "OgreLord",
"maxCount": 4,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "28f37a01-81c7-4090-a181-5cd3f670ef72",
"name": "Spawner (117)",
"location": [
6187,
101,
0
],
"map": "Trammel",
"count": 34,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 6162,
"y1": 76,
"z1": -128,
"x2": 6213,
"y2": 127,
"z2": 128
},
"walkingRange": 25,
"entries": [
{
"name": "Titan",
"maxCount": 10,
"probability": 100
},
{
"name": "Ettin",
"maxCount": 10,
"probability": 100
},
{
"name": "Doppleganger",
"maxCount": 10,
"probability": 100
},
{
"name": "MougGuur",
"maxCount": 10,
"probability": 100
},
{
"name": "Dog",
"maxCount": 10,
"probability": 100
},
{
"name": "Chicken",
"maxCount": 10,
"probability": 100
},
{
"name": "Rat",
"maxCount": 10,
"probability": 100
},
{
"name": "Cow",
"maxCount": 10,
"probability": 100
},
{
"name": "Bull",
"maxCount": 10,
"probability": 100
},
{
"name": "OrcBomber",
"maxCount": 7,
"probability": 100
},
{
"name": "OrcBrute",
"maxCount": 7,
"probability": 100
},
{
"name": "Orc",
"maxCount": 7,
"probability": 100
},
{
"name": "Snake",
"maxCount": 7,
"probability": 100
},
{
"name": "Gargoyle",
"maxCount": 7,
"probability": 100
},
{
"name": "Ogre",
"maxCount": 7,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "499d7a5c-d73c-4e43-889f-f88bc94cf40e",
"name": "Spawner (117)",
"location": [
6263,
118,
-10
],
"map": "Trammel",
"count": 24,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 6243,
"y1": 98,
"z1": -128,
"x2": 6284,
"y2": 139,
"z2": 128
},
"walkingRange": 20,
"entries": [
{
"name": "Chicken",
"maxCount": 6,
"probability": 100
},
{
"name": "Bird",
"maxCount": 6,
"probability": 100
},
{
"name": "Dog",
"maxCount": 3,
"probability": 100
},
{
"name": "Cat",
"maxCount": 3,
"probability": 100
},
{
"name": "Cow",
"maxCount": 6,
"probability": 100
},
{
"name": "Bull",
"maxCount": 6,
"probability": 100
},
{
"name": "Pig",
"maxCount": 3,
"probability": 100
},
{
"name": "Boar",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "5f510865-94bd-49b7-90bf-c24131ef1151",
"name": "Spawner (117)",
"location": [
6191,
155,
0
],
"map": "Trammel",
"count": 42,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 6166,
"y1": 130,
"z1": -128,
"x2": 6217,
"y2": 181,
"z2": 128
},
"walkingRange": 25,
"entries": [
{
"name": "Changeling",
"maxCount": 18,
"probability": 100
},
{
"name": "Ratman",
"maxCount": 18,
"probability": 100
},
{
"name": "Ettin",
"maxCount": 18,
"probability": 100
},
{
"name": "Titan",
"maxCount": 18,
"probability": 100
},
{
"name": "RatmanArcher",
"maxCount": 18,
"probability": 100
},
{
"name": "RatmanMage",
"maxCount": 18,
"probability": 100
},
{
"name": "Goat",
"maxCount": 12,
"probability": 100
},
{
"name": "Pig",
"maxCount": 12,
"probability": 100
},
{
"name": "Cow",
"maxCount": 12,
"probability": 100
},
{
"name": "Bull",
"maxCount": 12,
"probability": 100
},
{
"name": "Rat",
"maxCount": 12,
"probability": 100
},
{
"name": "GargoyleEnforcer",
"maxCount": 9,
"probability": 100
},
{
"name": "GargoyleDestroyer",
"maxCount": 9,
"probability": 100
},
{
"name": "Gargoyle",
"maxCount": 9,
"probability": 100
},
{
"name": "Snake",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "e35998b5-c9fa-4547-b793-3efeeca0253f",
"name": "Spawner (117)",
"location": [
6189,
71,
0
],
"map": "Trammel",
"count": 12,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 6164,
"y1": 46,
"z1": -128,
"x2": 6215,
"y2": 97,
"z2": 128
},
"walkingRange": 25,
"entries": [
{
"name": "OgreLord",
"maxCount": 8,
"probability": 100
},
{
"name": "OrcishLord",
"maxCount": 8,
"probability": 100
},
{
"name": "Ratman",
"maxCount": 8,
"probability": 100
},
{
"name": "Bird",
"maxCount": 4,
"probability": 100
},
{
"name": "Cow",
"maxCount": 4,
"probability": 100
},
{
"name": "Bull",
"maxCount": 4,
"probability": 100
},
{
"name": "Pig",
"maxCount": 4,
"probability": 100
},
{
"name": "Chicken",
"maxCount": 4,
"probability": 100
}
]
}
]