Kelsidavis-WoWee/src/pipeline
Kelsi 81b1897a24 feat(pipeline): add WLCK (Wowee Lock Template) format
Novel open replacement for Blizzard's Lock.dbc. The 18th
open format added to the editor. Closes the cross-reference
gap from WGOT.entry.lockId — until now that field pointed
to a format that didn't exist yet.

A lock is a multi-channel security check. Each lock has up
to 5 independent channels; a player can open the lock by
satisfying ANY ONE channel:
  • Item     — requires a specific key item (WIT cross-ref)
  • Lockpick — requires the lockpicking skill at minimum rank
                (rogue / engineering profession)
  • Spell    — requires casting a specific spell
  • Damage   — can be forced open with attack damage

Cross-references with previously-added formats:
  WGOT.entry.lockId               -> WLCK.entry.lockId
  WLCK.channel.targetId (Item)    -> WIT.entry.itemId
  WLCK.channel.targetId (Lockpick) -> future WSKL skillId
  WLCK.channel.targetId (Spell)   -> future WSPL spellId

The starter and dungeon presets' lockIds (1 and 2)
deliberately match WGOT.makeDungeon's iron-door lockId=1
and bandit-strongbox lockId=2, so the demo content stack
already wires together: WSPN spawn -> WGOT object template
-> WLCK lock template -> WIT key items.

Format:
  • magic "WLCK", version 1, little-endian
  • per lock: lockId / name / flags / 5 fixed channel slots
  • per channel: kind / skillRequired / targetId
  • all 5 slots written even when unused (kind=None +
    zeroed fields), keeping the per-entry size constant for
    fast random access

Enums:
  • ChannelKind: None / Item / Lockpick / Spell / Damage
  • Flags:       DestructOnOpen / RespawnOnKey / TrapOnFail

API: WoweeLockLoader::save / load / exists / findById;
presets makeStarter (Iron Door + Wooden Chest), makeDungeon
(matches WGOT cross-references; light/heavy lockpicks +
boss-key-only seal), makeProfessions (4-tier rogue lockpick
progression at ranks 1/100/175/250).

CLI added (5 flags, 521 documented total now):
  --gen-locks / --gen-locks-dungeon / --gen-locks-professions
  --info-wlck / --validate-wlck

Validator catches: lockId=0 + duplicates, all-None channels
(lock can never open), Item/Spell/Lockpick channels with
targetId=0 (no resource referenced), unknown channel kind,
skillRequired set on non-Lockpick channel (silently ignored
at runtime — flag as warning).
2026-05-09 15:44:26 -07:00
..
adt_loader.cpp fix(adt): scrub NaN/inf in MDDF + MODF placement floats 2026-05-06 06:05:17 -07:00
asset_manager.cpp feat(runtime): pick up JSON DBC sidecars from --emit-json-dbc 2026-05-06 10:43:13 -07:00
asset_manifest.cpp Replace MPQ runtime with loose file asset system 2026-02-12 20:32:14 -08:00
blp_loader.cpp refactor: name ADT vertex constants, add BLP decompression comments 2026-03-30 14:28:22 -07:00
custom_zone_discovery.cpp fix(zones): clamp discovery mapId and tile coords on scan 2026-05-06 07:00:04 -07:00
dbc_layout.cpp fix: auto-detect CharSections.dbc layout and add Blood Elf/Draenei NPC voices 2026-03-23 11:00:49 -07:00
dbc_loader.cpp fix(dbc): skip non-array rows in loadJSON instead of failing 2026-05-06 10:07:49 -07:00
loose_file_reader.cpp Replace MPQ runtime with loose file asset system 2026-02-12 20:32:14 -08:00
m2_loader.cpp feat(rendering): implement spell visual effects with bone-tracked ribbons and particles 2026-04-07 11:27:59 +03:00
terrain_mesh.cpp fix(terrain): hide chunk grid by tiling textures 4× per chunk 2026-05-08 12:34:16 -07:00
wdt_loader.cpp fix(parsing): bail on suspicious maskBlockCount in CREATE_OBJECT blocks 2026-04-05 20:12:17 -07:00
wmo_loader.cpp fix: guard fsPath underflow, name WMO doodad mask, add why-comments 2026-03-30 14:33:08 -07:00
wowee_building.cpp fix(wob): reject load on out-of-range string lengths 2026-05-06 09:23:19 -07:00
wowee_collision.cpp fix(woc): cap triangle count and clamp tile coords on save 2026-05-06 09:08:07 -07:00
wowee_creatures.cpp feat(pipeline): add WCRT (Wowee Creature Template) format 2026-05-09 15:18:44 -07:00
wowee_factions.cpp feat(pipeline): add WFAC (Wowee Faction Catalog) format 2026-05-09 15:37:59 -07:00
wowee_items.cpp feat(pipeline): add WIT (Wowee Item Template) format 2026-05-09 15:04:48 -07:00
wowee_light.cpp feat(pipeline): add WOL preset variants for cave/dungeon/night 2026-05-09 14:01:26 -07:00
wowee_locks.cpp feat(pipeline): add WLCK (Wowee Lock Template) format 2026-05-09 15:44:26 -07:00
wowee_loot.cpp feat(pipeline): add WLOT (Wowee Loot Table) format 2026-05-09 15:11:08 -07:00
wowee_model.cpp feat(extract): emit WOM and WOB side-files (M2/WMO → open formats) 2026-05-06 10:32:17 -07:00
wowee_model_fromm2.cpp feat(extract): emit WOM and WOB side-files (M2/WMO → open formats) 2026-05-06 10:32:17 -07:00
wowee_objects.cpp feat(pipeline): add WGOT (Wowee Game Object Template) format 2026-05-09 15:31:49 -07:00
wowee_quests.cpp feat(pipeline): add WQT (Wowee Quest Template) format 2026-05-09 15:25:02 -07:00
wowee_sound.cpp feat(pipeline): add WSND (Wowee Sound Catalog) format 2026-05-09 14:47:16 -07:00
wowee_spawns.cpp feat(pipeline): add WSPN (Wowee Spawn Point catalog) format 2026-05-09 14:57:53 -07:00
wowee_terrain_loader.cpp fix(wot): cap doodadNames/wmoNames at 65536 + guard non-string entries 2026-05-06 10:06:20 -07:00
wowee_weather.cpp feat(pipeline): add Wowee Open Weather (.wow) zone schedule 2026-05-09 14:10:13 -07:00
wowee_world_map.cpp feat(pipeline): add WOMX (Wowee World Map index) format 2026-05-09 14:38:05 -07:00