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

366 lines
6.5 KiB
JSON

[
{
"$type": "Spawner",
"guid": "0fe79572-c943-489f-917b-ac21ab051e1e",
"name": "Spawner (127)",
"location": [
5857,
562,
15
],
"map": "Trammel",
"count": 5,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5850,
"y1": 555,
"z1": -128,
"x2": 5865,
"y2": 570,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "JukaLord",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaMage",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaWarrior",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "2292c4c5-79a7-42fe-89a0-4cca8b5c9ae2",
"name": "Spawner (127)",
"location": [
5792,
544,
10
],
"map": "Trammel",
"count": 8,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5786,
"y1": 538,
"z1": -128,
"x2": 5799,
"y2": 551,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "GolemController",
"maxCount": 4,
"probability": 100
},
{
"name": "Golem",
"maxCount": 4,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "4c508240-4996-456a-904f-164a1574fda9",
"name": "Spawner (127)",
"location": [
5819,
591,
0
],
"map": "Trammel",
"count": 2,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5814,
"y1": 586,
"z1": -128,
"x2": 5825,
"y2": 597,
"z2": 128
},
"walkingRange": 25,
"entries": [
{
"name": "JukaWarrior",
"maxCount": 2,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "7efd5b02-49ba-4d20-a39e-82d9bb6622bb",
"name": "Spawner (127)",
"location": [
5857,
586,
15
],
"map": "Trammel",
"count": 5,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5850,
"y1": 579,
"z1": -128,
"x2": 5865,
"y2": 594,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "JukaLord",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaMage",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaWarrior",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "8d70da7b-2571-4c11-a5fe-4f9a8a3d4083",
"name": "Spawner (127)",
"location": [
5724,
561,
20
],
"map": "Trammel",
"count": 6,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5716,
"y1": 553,
"z1": -128,
"x2": 5733,
"y2": 570,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "Golem",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaLord",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaMage",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaWarrior",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "a3e4a12b-3ec2-4c5e-a333-211c738e2105",
"name": "Spawner (127)",
"location": [
5828,
530,
0
],
"map": "Trammel",
"count": 5,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5820,
"y1": 522,
"z1": -128,
"x2": 5837,
"y2": 539,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "JukaLord",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaMage",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaWarrior",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "aab64623-d091-4058-9ce0-6ca3c039b824",
"name": "Spawner (127)",
"location": [
5690,
534,
0
],
"map": "Trammel",
"count": 5,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5682,
"y1": 526,
"z1": -128,
"x2": 5699,
"y2": 543,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "JukaLord",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaMage",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaWarrior",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "b316ad79-73f6-44b1-99e7-34845ddd72cf",
"name": "Spawner (127)",
"location": [
5659,
563,
20
],
"map": "Trammel",
"count": 9,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5649,
"y1": 553,
"z1": -128,
"x2": 5670,
"y2": 574,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "Brigand",
"maxCount": 4,
"probability": 100
},
{
"name": "JukaLord",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaMage",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaWarrior",
"maxCount": 3,
"probability": 100
}
]
},
{
"$type": "Spawner",
"guid": "d0aa4dc9-71ae-41c9-b16a-457c9946ccc4",
"name": "Spawner (127)",
"location": [
5808,
588,
12
],
"map": "Trammel",
"count": 5,
"minDelay": "00:05:00",
"maxDelay": "00:10:00",
"team": 0,
"spawnBounds": {
"x1": 5793,
"y1": 573,
"z1": -128,
"x2": 5824,
"y2": 604,
"z2": 128
},
"walkingRange": 30,
"entries": [
{
"name": "JukaLord",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaMage",
"maxCount": 1,
"probability": 100
},
{
"name": "JukaWarrior",
"maxCount": 3,
"probability": 100
}
]
}
]