Commit graph

2 commits

Author SHA1 Message Date
Kelsi
85ac2e0248 feat(editor): WTSC JSON round-trip closure
Adds --export-wtsc-json / --import-wtsc-json with the established
readEnumField template factoring int+name dual encoding for both
vehicleType ("taxi"/"zeppelin"/"boat"/"mount") and factionAccess
("both"/"alliance"/"horde"/"neutral"). Float coordinates
(originX/Y, destinationX/Y) preserved bit-for-bit through JSON.

All 3 presets (zeppelins/boats/taxis) byte-identical binary
roundtrip OK including BootyBay<->Ratchet Neutral cross-faction
boat coords (-14305.f, 570.f -> -984.f, -3835.f).

Live-tested scheduling-overflow detection: hand-mutated routeId=2
(OG<->Grom'Gol travel=90s capacity=40) interval to 60s, validator
correctly errored: "departureIntervalSec=60 < travelDurationSec=90
with finite capacity — vehicle pool overflow (next zeppelin
departs before prior arrives)".

CLI flag count 1353 -> 1355.
2026-05-10 03:57:15 -07:00
Kelsi
12e77e69ce feat(pipeline): WTSC transit schedule catalog (128th open format)
Novel replacement for the implicit taxi/zeppelin/boat scheduling
that vanilla WoW drove from a tangle of TaxiNodes.dbc +
TaxiPath.dbc + per-zeppelin GameObject scripts + hard-coded
transport interval timers in the server's MapManager. Each WTSC
entry binds one scheduled passenger route to its origin /
destination coords, vehicle type (Taxi/Zeppelin/Boat/Mount),
departure interval, in-flight duration, capacity, and faction-
access gate.

Initially designed with magic 'WTRN' but discovered collision
with existing trainers catalog (also WTRN) — renamed to 'WTSC'
(Transit SChedule) and updated all CLI flags.

Three presets:
  --gen-trn-zeppelins  3 vanilla Horde zeppelin routes
                       (OG<->UC 240s interval, OG<->Grom'Gol,
                       UC<->Grom'Gol)
  --gen-trn-boats      3 vanilla boat routes (Auberdine<->
                       Stormwind Alliance, Menethil<->Theramore
                       Alliance, BootyBay<->Ratchet Neutral
                       cross-faction)
  --gen-trn-taxis      3 taxi gryphon/wyvern routes — capacity=0
                       indicates solo gryphon ride

CRITICAL scheduling invariant validator catches: when capacity > 0
the departureInterval MUST be >= travelDuration. A zeppelin with
interval=60s + travel=90s with capacity=40 would overflow the
vehicle pool — next zeppelin departs before prior arrives. Solo
gryphon (capacity=0) is exempt because each ride is independent.

Validator also catches: id+name+origin+destination required,
vehicleType/factionAccess range, zero intervals/travel, duplicate
routeIds, duplicate route names. Warns on same-map routes
(originMapId == destinationMapId) — preset taxi route Crossroads
to Razor Hill triggered this warning in smoke-test (both in
Kalimdor mapId=1, intentional).

Format count 127 -> 128. CLI flag count 1346 -> 1353.
2026-05-10 03:54:39 -07:00