2026-05-09 10:08:14 -07:00
|
|
|
#include "cli_arg_required.hpp"
|
|
|
|
|
|
|
|
|
|
namespace wowee {
|
|
|
|
|
namespace editor {
|
|
|
|
|
namespace cli {
|
|
|
|
|
|
|
|
|
|
const char* const kArgRequired[] = {
|
|
|
|
|
"--data", "--info", "--info-batches", "--info-textures", "--info-doodads",
|
|
|
|
|
"--info-attachments", "--info-particles", "--info-sequences",
|
|
|
|
|
"--info-bones", "--export-bones-dot",
|
|
|
|
|
"--list-zone-meshes", "--list-zone-audio", "--list-zone-textures",
|
|
|
|
|
"--list-project-meshes", "--list-project-audio",
|
|
|
|
|
"--list-project-textures",
|
|
|
|
|
"--info-zone-models-total", "--info-project-models-total",
|
|
|
|
|
"--list-zone-meshes-detail", "--list-project-meshes-detail", "--info-mesh",
|
2026-05-09 10:41:58 -07:00
|
|
|
"--info-mesh-storage-budget", "--info-mesh-stats",
|
2026-05-09 10:57:22 -07:00
|
|
|
"--info-wob", "--info-wob-stats", "--info-woc", "--info-wot",
|
feat(pipeline): add WOL validation + time-of-day sampling
Three additions to the Wowee Open Light format that landed
last commit:
• WoweeLightLoader::sampleAtTime(light, timeMin) returns
the linearly-interpolated keyframe at any time-of-day,
correctly handling wrap-around between the last keyframe
and the first (e.g. 21:00 blends from dusk toward
midnight by going forward through 00:00).
• --validate-wol <wol-base> [--json] walks every keyframe
and reports structural problems: time bounds (must be
[0, 1440)), strict-ascending sort order, fogEnd >
fogStart, finite color components. Exit code 0 PASS /
1 FAIL — CI-friendly.
• --info-wol-at <wol-base> <HH:MM|minutes> samples the
interpolated state at a specific time of day. Useful
for previewing what the renderer would feed in at a
given moment, debugging keyframe gaps, or previewing
a sub-range of the cycle.
Smoke-tested: dawn-to-midnight blend at 03:00 yields a
plausible mid-fade ambient (0.18, 0.16, 0.15) and dusk-to-
midnight wrap at 21:00 yields the symmetric (0.19, 0.145,
0.14). The default 4-keyframe day/night cycle from
makeDefaultDayNight passes --validate-wol cleanly.
2026-05-09 13:54:57 -07:00
|
|
|
"--info-wol", "--info-wol-at", "--validate-wol", "--gen-light",
|
2026-05-09 14:01:26 -07:00
|
|
|
"--gen-light-cave", "--gen-light-dungeon", "--gen-light-night",
|
2026-05-09 14:18:14 -07:00
|
|
|
"--export-wol-json", "--import-wol-json",
|
2026-05-09 14:25:41 -07:00
|
|
|
"--export-wow-json", "--import-wow-json",
|
2026-05-09 14:13:30 -07:00
|
|
|
"--info-wow", "--validate-wow",
|
2026-05-09 14:34:22 -07:00
|
|
|
"--validate-wom",
|
2026-05-09 14:38:05 -07:00
|
|
|
"--gen-world-map", "--gen-world-map-instance",
|
|
|
|
|
"--gen-world-map-arena",
|
|
|
|
|
"--info-womx", "--validate-womx",
|
feat(editor): add WOMX JSON round-trip authoring workflow
Mirrors the WOL/WOW JSON pair from earlier batches: gives
hand-editable access to .womx world-map manifests for
quick tile-bitmap edits without writing a binary patcher.
Tile bitmap is represented as a JSON array of '1'/'0' row
strings — one string per row of the grid. Visual layout
makes missing-row patterns obvious at a glance:
"tiles": [
"10000001",
"01000010",
"00100100",
"00011000",
...
]
Sparse [[x,y]] pair arrays were considered but rejected:
4× larger for a full continent (4096 tiles), and the dense
visual layout is far easier to spot-read for typical
edits like "carve out a hole in this region".
The importer tolerates missing optional fields (uses
WoweeWorldMap defaults), and accepts either worldType
int or worldTypeName string so JSON can be authored by
hand or by tools.
Verified byte-identical round-trip on a 4x4 instance and
a hand-authored 8x8 sparse continent (16/64 tiles, both
defaultLightId and defaultWeatherId preserved through the
JSON layer).
Adds 2 flags to reach 458 documented kArgRequired entries.
All 9 open formats now have established CLI tooling — WOM,
WOB, WOC, WOT, JsonDBC, PNG, WOL, WOW, and WOMX.
2026-05-09 14:39:47 -07:00
|
|
|
"--export-womx-json", "--import-womx-json",
|
feat(pipeline): add WSND (Wowee Sound Catalog) format
Novel open replacement for Blizzard's SoundEntries.dbc +
SoundEntriesAdvanced.dbc. The 10th open format added to the
editor — covers the audio-metadata gap (the previous 9 cover
geometry, terrain, atmosphere, and world manifests, but no
sound metadata).
Format:
• magic "WSND", version 1, little-endian
• catalogName + entry count
• per entry: soundId / kind / flags / volume /
minDistance / maxDistance / filePath / label
Kind enum (7 categories):
sfx, music, ambient, ui, voice, spell, combat
Flags packed (3 bits used, rest reserved):
loop (0x01), 3d (0x02), stream (0x04)
API: WoweeSoundLoader::save / load / exists; presets
makeStarter (one entry per kind), makeAmbient (wilderness
loops + footsteps), makeTavern (fire + crowd + drink + door
+ lute).
CLI added (5 flags, 465 documented total now):
--gen-sound-catalog <base> [name]
--gen-sound-catalog-ambient <base> [name]
--gen-sound-catalog-tavern <base> [name]
--info-wsnd <base> [--json]
--validate-wsnd <base> [--json]
Validator catches: out-of-range kind, NaN/inf volume or
distances, 3D sounds with bad min/max, duplicate sound IDs,
empty filePaths.
All 3 presets verified: save / load / validate clean
on first run. Variable-length string fields use length-
prefixed encoding with a 1 MiB sanity cap on read to
prevent corrupted-file allocation blowups.
2026-05-09 14:47:16 -07:00
|
|
|
"--gen-sound-catalog", "--gen-sound-catalog-ambient",
|
|
|
|
|
"--gen-sound-catalog-tavern",
|
|
|
|
|
"--info-wsnd", "--validate-wsnd",
|
feat(editor): add WSND JSON round-trip authoring workflow
Closes the WSND open-format loop with --export-wsnd-json /
--import-wsnd-json, mirroring the WOL/WOW/WOMX JSON pairs
from earlier batches.
Each entry round-trips all 9 fields:
soundId, kind (int + kindName string), flags (int +
flagsList string array), volume, minDistance, maxDistance,
filePath, label.
Both kind and flags are emitted in dual form (int + named):
• kind : 2,
kindName : "ambient",
• flags : 3,
flagsList: ["loop", "3d"]
The importer accepts either form per field, so a hand-author
can write only the named string forms and skip the integer
boilerplate. Missing optional fields fall back to
WoweeSound::Entry defaults.
Verified byte-identical round-trip on the tavern preset
(5 entries with mixed flags and 3D distances).
Adds 2 flags (467 kArgRequired entries total). All 4 binary
formats added in recent batches now have full JSON round-trip:
WOL, WOW, WOMX, WSND.
2026-05-09 14:51:44 -07:00
|
|
|
"--export-wsnd-json", "--import-wsnd-json",
|
feat(pipeline): add WSPN (Wowee Spawn Point catalog) format
Novel open replacement for AzerothCore-style scattered
creature_template / gameobject SQL spawn tables PLUS the
ADT MDDF / MODF doodad-placement chunks. The 11th open
format, and the first that covers the live world-content
side (atmosphere + sounds + spawns now form the runtime
"what fills this zone" picture).
A WSPN file holds all spawn points for a zone in a single
table, with kind discriminating creature vs game object
vs static doodad. The same format powers:
• server runtime — knows what NPCs / objects to spawn
• editor — draws spawn markers
• renderer — reads the doodad subset directly to
draw static props without going
through a server roundtrip
Format:
• magic "WSPN", version 1, little-endian
• per entry: kind / entryId / position(3f) / rotation(3f)
/ scale / flags / respawnSec / factionId /
questIdRequired / wanderRadius / label
Flags packed: disabled (0x01), event-only (0x02),
quest-phased (0x04). Reserved bits for future per-entry
encoding extensions.
API: WoweeSpawnsLoader::save / load / exists; presets
makeStarter (1 each kind), makeCamp (4-bandit ring +
chest + 2 tents), makeVillage (6 NPCs + 2 signs + 4
corner trees).
CLI added (5 flags, 473 documented total now):
--gen-spawns / --gen-spawns-camp / --gen-spawns-village
--info-wspn / --validate-wspn
Validator catches: out-of-range kind, NaN/inf coords,
non-positive scale, doodad with non-zero respawn (static
prop misuse), creature with respawn=0 (won't respawn after
kill), entryId=0 (orphan reference).
All 3 presets save / load / re-validate clean. Doodad and
game-object entries explicitly set wanderRadius=0 so the
generated catalogs are noise-free.
2026-05-09 14:57:53 -07:00
|
|
|
"--gen-spawns", "--gen-spawns-camp", "--gen-spawns-village",
|
|
|
|
|
"--info-wspn", "--validate-wspn",
|
feat(editor): add WSPN JSON round-trip authoring workflow
Closes the WSPN open-format loop with --export-wspn-json /
--import-wspn-json, mirroring the WOL/WOW/WOMX/WSND JSON
pairs from earlier batches. All 5 binary formats added in
recent batches now have full JSON round-trip authoring.
Each entry round-trips all 12 fields:
kind (int + kindName string), entryId, position[3],
rotation[3], scale, flags (int + flagsList string array),
respawnSec, factionId, questIdRequired, wanderRadius,
label.
Vector fields are emitted as 3-element arrays for natural
JSON layout. Both kind and flags are emitted in dual form
(int + named) so a hand-author can write the named string
forms and skip the integer boilerplate. Missing optional
fields fall back to WoweeSpawns::Entry defaults.
Verified byte-identical round-trip on the village preset
(12 entries: 6 creature + 2 object + 4 doodad). The
position vec3 round-trips through floats with no precision
loss for the typical small-coordinate test cases.
Adds 2 flags (475 kArgRequired entries total).
2026-05-09 14:59:48 -07:00
|
|
|
"--export-wspn-json", "--import-wspn-json",
|
feat(pipeline): add WIT (Wowee Item Template) format
Novel open replacement for Blizzard's Item.dbc +
ItemDisplayInfo.dbc + the SQL item_template tables that
AzerothCore-style servers store item definitions in. The
12th open format added to the editor.
A WIT file holds the catalog of all items in a content
pack: weapons, armor, consumables, quest items, trade
goods. Each entry pairs gameplay metadata (stats, level
reqs, flags, weapon damage / speed) with display metadata
(displayId for icon / model, quality color), so the
runtime can render inventory tooltips and equip slots
from a single load.
Format:
• magic "WITM", version 1, little-endian
• per item: itemId / displayId / quality / itemClass /
itemSubClass / inventoryType / flags / requiredLevel /
itemLevel / sellPrice / buyPrice / maxStack / durability
/ damageMin / damageMax / attackSpeedMs /
statCount + stats[] / name / description
Enums:
• Quality: Poor..Heirloom (8 levels)
• Class: Consumable, Weapon, Armor, Quest, ... (13)
• InventoryType: Head..Cloak..Weapon2H (18 slots)
• Flags: Unique, BoP, BoE, QuestItem, Conjured, ...
• StatType: Stamina, Strength, Intellect, Defense, ...
API: WoweeItemLoader::save / load / exists / findById;
presets makeStarter (4-item demo), makeWeapons (5 items
common -> legendary), makeArmor (6-piece mail set with
BoE flag).
CLI added (5 flags, 480 documented total now):
--gen-items / --gen-items-weapons / --gen-items-armor
--info-wit / --validate-wit
Validator catches: itemId=0, duplicate itemIds, weapons
with 0 damage or attackSpeed, weapons with non-weapon
slot, equippables with durability=0 or maxStack>1, sell
price >= buy price (vendor would lose money), out-of-range
quality.
All 3 presets save / load / re-validate clean. Info-table
output includes a gold/silver/copper price formatter for
hand-readability.
2026-05-09 15:04:48 -07:00
|
|
|
"--gen-items", "--gen-items-weapons", "--gen-items-armor",
|
|
|
|
|
"--info-wit", "--validate-wit",
|
2026-05-09 15:13:26 -07:00
|
|
|
"--export-wit-json", "--import-wit-json",
|
feat(pipeline): add WLOT (Wowee Loot Table) format
Novel open replacement for AzerothCore-style
creature_loot_template / gameobject_loot_template SQL
tables. The 13th open format added to the editor.
Pairs naturally with the WIT item catalog from the
preceding commit: each loot drop's itemId references an
entry in a WIT file, so a content pack ships both the
item definitions and the loot tables that reference them.
The runtime composes WIT + WLOT + WSPN to drive the full
"creature dies, drops items" flow without any SQL.
Format:
• magic "WLOT", version 1, little-endian
• per table: creatureId / flags / dropCount /
moneyMin..Max / itemDropCount + drops[]
• per drop: itemId / chancePercent (float, 0..100) /
minQty / maxQty / drop_flags
Table flags: QuestOnly, GroupOnly, Pickpocket
Drop flags: QuestRequired, GroupRollOnly, AlwaysDrop
dropCount is the slot budget — how many distinct drops
to roll per kill. Each item drop is rolled independently
against its chancePercent (so dropCount=2 with 4 candidate
drops at varying chances gives the classic "up to 2 distinct
items per kill" behavior). Drops with the AlwaysDrop flag
bypass the slot budget — used for guaranteed quest items.
API: WoweeLootLoader::save / load / exists /
findByCreatureId; presets makeStarter (1 table, 1 drop),
makeBandit (4 candidates, dropCount=2, matches the camp
spawns from WSPN at creatureId=1000), makeBoss (6 candidates
including guaranteed quest item via AlwaysDrop and a
group-only epic at 5%).
CLI added (5 flags, 486 documented total now):
--gen-loot / --gen-loot-bandit / --gen-loot-boss
--info-wlot / --validate-wlot
Validator catches: creatureId=0, duplicates, chance not in
0..100, NaN chance, money min > max, minQty > maxQty,
dropCount=0 with non-empty drops list (silent dead config).
All 3 presets save / load / re-validate clean. The bandit
table's creatureId=1000 deliberately matches WSPN's
makeCamp creatureId so the open-format demo content pack
already has working cross-references.
2026-05-09 15:11:08 -07:00
|
|
|
"--gen-loot", "--gen-loot-bandit", "--gen-loot-boss",
|
|
|
|
|
"--info-wlot", "--validate-wlot",
|
feat(editor): add WLOT JSON round-trip authoring workflow
Closes the WLOT open-format loop with --export-wlot-json /
--import-wlot-json, mirroring the WOL/WOW/WOMX/WSND/WSPN/WIT
JSON pairs. All 7 binary formats added since WOL now have
full JSON round-trip authoring.
Each loot table round-trips:
• table-level: creatureId, flags (int + flagsList strings),
dropCount, money min/max (copper)
• per-drop: itemId, chancePercent (float),
minQty / maxQty, flags (int + flagsList)
Both flag fields emit dual int + named string-array forms.
A hand-author can write ["quest", "always"] instead of
having to remember that QuestRequired|AlwaysDrop = 5.
Verified byte-identical round-trip on the boss preset
(6 drops including the QuestRequired+AlwaysDrop combo on
the guaranteed quest item, group-only epic at 5%, mass-loot
trade goods at 90%).
Adds 2 flags (495 documented total now).
2026-05-09 15:20:05 -07:00
|
|
|
"--export-wlot-json", "--import-wlot-json",
|
feat(pipeline): add WCRT (Wowee Creature Template) format
Novel open replacement for the AzerothCore-style
creature_template SQL table PLUS the Blizzard
CreatureTemplate / CreatureFamily / CreatureType.dbc trio.
The 14th open format added to the editor.
This is the canonical metadata side of creatures shared
across every spawn instance: HP, level range, faction,
behavior flags, NPC role bits (vendor / trainer /
quest-giver / innkeeper), base damage, equipped gear
references.
Cross-references with the previously-added formats:
WSPN.entry.entryId -> WCRT.entry.creatureId
WLOT.entry.creatureId -> WCRT.entry.creatureId
WCRT.entry.equipped* -> WIT.entry.itemId
The 4-format set (WIT + WLOT + WSPN + WCRT) now lets a
content pack define a complete RPG zone's creature
ecosystem: what creatures are, where they spawn, what they
drop, and what gear they carry — entirely in open formats
with no SQL dependencies.
Format:
• magic "WCRT", version 1, little-endian
• per entry: creatureId / displayId / name / subname /
minLevel..maxLevel / baseHealth + healthPerLevel /
baseMana + manaPerLevel / factionId / npcFlags /
typeId / familyId / damageMin..Max / attackSpeedMs /
baseArmor / walkSpeed + runSpeed / gossipId /
equippedMain + equippedOffhand + equippedRanged /
aiFlags
Enums:
• TypeId: Beast / Dragon / Demon / Elemental / Giant /
Undead / Humanoid / Critter / Mechanical
• FamilyId: Wolf / Cat / Bear / Boar / Raptor / Hyena /
Spider / Gorilla / Crab (for Beast types)
• NpcFlags: Vendor / QuestGiver / Trainer / Banker /
Innkeeper / FlightMaster / Auctioneer /
Repair / Stable
• Behavior: Passive / Aggressive / FleeLowHp / CallHelp /
NoLeash
API: WoweeCreatureLoader::save / load / exists /
findById; presets makeStarter (1 innkeeper),
makeBandit (creatureId=1000 matches WSPN/WLOT bandit
references, equips WIT itemId=1001 sword), makeMerchants
(creatureIds 4001/4002/4003 match WSPN village labels).
CLI added (5 flags, 493 documented total):
--gen-creatures / --gen-creatures-bandit / --gen-creatures-merchants
--info-wcrt / --validate-wcrt
Validator catches: creatureId=0, duplicates, level=0,
minLevel>maxLevel, baseHealth=0, damageMin>damageMax,
attackSpeed=0, non-positive walk/runSpeed, behavior flag
contradictions (passive+aggressive), vendor with
aggressive behavior (player can't trade).
2026-05-09 15:18:44 -07:00
|
|
|
"--gen-creatures", "--gen-creatures-bandit", "--gen-creatures-merchants",
|
|
|
|
|
"--info-wcrt", "--validate-wcrt",
|
2026-05-09 15:27:12 -07:00
|
|
|
"--export-wcrt-json", "--import-wcrt-json",
|
feat(pipeline): add WQT (Wowee Quest Template) format
Novel open replacement for AzerothCore-style quest_template
SQL tables PLUS the Blizzard Quest.dbc / QuestObjective.dbc
trio. The 15th open format added to the editor — and the
last gameplay-graph piece the catalog needed.
Cross-references with previously-added formats:
WQT.giverCreatureId -> WCRT.entry.creatureId
WQT.turninCreatureId -> WCRT.entry.creatureId
WQT.objective.targetId -> WCRT (kill) / WIT (collect) /
WOB (interact)
WQT.rewardItem.itemId -> WIT.entry.itemId
WQT.prevQuestId -> WQT.entry.questId (intra-format)
WQT.nextQuestId -> WQT.entry.questId
Together with WIT / WCRT / WLOT / WSPN / WOMX / WOL / WOW /
WSND, a content pack can now ship a complete RPG zone
(terrain + props + atmosphere + sounds + creatures + items
+ loot + spawns + quests) entirely in open formats with no
SQL or .dbc dependencies. 15 of 15 expected slots filled.
Format:
• magic "WQTM", version 1, little-endian
• per quest: questId / title / objective / description /
minLevel..maxLevel + questLevel / requiredClass+RaceMask /
prev+nextQuestId / giver+turninCreatureId /
objectives[] / xpReward + moneyCopperReward /
rewardItems[] / flags
Per-objective:
kind (kill/collect/interact/visit/escort/cast),
targetId, quantity
Per-reward:
itemId, qty, pickFlags (AutoGiven / PlayerChoice)
Quest flags: Daily / Weekly / Raid / Group / AutoComplete /
AutoAccept / Repeatable / ClassQuest / Pvp
API: WoweeQuestLoader::save / load / exists / findById;
presets makeStarter (1 simple kill quest, references the
bandit creatureId=1000), makeChain (3-quest chain with
prev/next links + AutoComplete bridge + player-choice
rewards), makeDaily (Daily+Repeatable+AutoAccept combo).
CLI added (5 flags, 500 documented total — round milestone):
--gen-quests / --gen-quests-chain / --gen-quests-daily
--info-wqt / --validate-wqt
Validator catches: questId=0+duplicates, level=0,
maxLevel<minLevel, empty title, no objectives without
AutoComplete (player can't finish), no rewards at all,
Daily without Repeatable (incoherent), targetId=0,
quantity=0, unknown objective kind, reward itemId=0 or qty=0.
The 3-quest chain demo exercises every major feature:
• multiple objective kinds (visit / collect / kill)
• prev/next chain links
• AutoComplete dialogue-bridge quest
• PlayerChoice reward (1 of 2 weapons)
2026-05-09 15:25:02 -07:00
|
|
|
"--gen-quests", "--gen-quests-chain", "--gen-quests-daily",
|
|
|
|
|
"--info-wqt", "--validate-wqt",
|
feat(editor): add WQT JSON round-trip authoring workflow
Closes the WQT open-format loop with --export-wqt-json /
--import-wqt-json, mirroring the WOL/WOW/WOMX/WSND/WSPN/
WIT/WLOT/WCRT JSON pairs. All 9 binary formats added since
WOL now have full JSON round-trip authoring.
Each quest round-trips:
• 13 scalar fields (id, level range, masks, chain links,
giver/turnin, xp + money reward, flags)
• 3 string fields (title, objective, description)
• objectives array with dual int + name kindName
• rewardItems array with dual int + name pickFlagsList
The flag bitset emits string-array form so a hand-author can
write ["daily", "repeatable", "auto-accept"] instead of
having to remember the bit math. The objective kindName
makes "visit/collect/kill" obvious without needing to know
that kind=3 means VisitArea.
Verified byte-identical round-trip on the 3-quest chain
preset (full feature exercise: prev/next chain links,
mixed objective kinds, AutoComplete bridge quest, player-
choice rewards). Adds 2 flags (509 documented total now).
2026-05-09 15:33:21 -07:00
|
|
|
"--export-wqt-json", "--import-wqt-json",
|
feat(pipeline): add WGOT (Wowee Game Object Template) format
Novel open replacement for AzerothCore-style
gameobject_template SQL tables PLUS the Blizzard
GameObjectDisplayInfo.dbc / GameObject types metadata. The
16th open format added to the editor.
Game objects are the non-creature interactable scenery:
chests (with loot), doors, buttons, mailboxes, herb / ore
gathering nodes, fishing pools, signposts, mounts. Each
has a displayId for the model, a typeId driving its
interaction logic, and optional cross-references to a lock
(future WLCK) and loot table (existing WLOT).
Cross-references with previously-added formats:
WSPN.entry.entryId (kind=GameObject) -> WGOT.entry.objectId
WGOT.entry.lootTableId -> WLOT.entry.creatureId
(loot tables are
universal — chests
and creatures both
key by ID)
The dungeon preset's Bandit Strongbox uses lootTableId=2000
to match WLOT's bandit chest table id, so the demo content
stack already wires together: spawn (WSPN object kind 2000)
-> object template (WGOT 2000) -> loot table (WLOT 2000).
Format:
• magic "WGOT", version 1, little-endian
• per object: objectId / displayId / name / typeId /
size / castBarCaption / requiredSkill +
requiredSkillValue / lockId / lootTableId /
minOpenTimeMs..maxOpenTimeMs / flags
Enums:
• TypeId (16): Door / Button / Chest / Container /
QuestGiver / Text / Trap / Goober / Transport /
Mailbox / MineralNode / HerbNode / FishingNode /
Mount / Sign / Bonfire
• Flags: Disabled / ScriptOnly / UsableFromMount /
Despawn / Frozen / QuestGated
API: WoweeGameObjectLoader::save / load / exists /
findById; presets makeStarter (chest + mailbox + sign),
makeDungeon (door + button + 2 chests + trap with proper
WLOT cross-references), makeGather (Peacebloom herb +
Tin Vein ore + fishing pool with skill requirements).
CLI added (5 flags, 507 documented total now):
--gen-objects / --gen-objects-dungeon / --gen-objects-gather
--info-wgot / --validate-wgot
Validator catches: objectId=0 + duplicates, size<=0,
minOpenTime>maxOpenTime, gathering node without skill
requirement (anyone can harvest — usually a typo), chest
without loot table (script must populate), requiredSkillValue
set without requiredSkill (incoherent).
2026-05-09 15:31:49 -07:00
|
|
|
"--gen-objects", "--gen-objects-dungeon", "--gen-objects-gather",
|
|
|
|
|
"--info-wgot", "--validate-wgot",
|
2026-05-09 15:39:50 -07:00
|
|
|
"--export-wgot-json", "--import-wgot-json",
|
feat(pipeline): add WFAC (Wowee Faction Catalog) format
Novel open replacement for Blizzard's Faction.dbc +
FactionTemplate.dbc + the AzerothCore-style
reputation_reward / reputation_spillover SQL tables. The
17th open format added to the editor.
Combines the "displayable Faction" (player-facing name +
reputation thresholds for friendly/honored/revered/exalted)
with the "FactionTemplate matrix" (which factions are
hostile to which) into one entry. The runtime walks the
catalog to answer two questions:
• "Will faction A attack faction B on sight?" -> enemy list
• "What rep tier is the player with X?" -> thresholds
Cross-references with previously-added formats:
WCRT.entry.factionId -> WFAC.entry.factionId
WFAC.entry.parentFactionId -> WFAC.entry.factionId
WFAC.entry.enemies[] -> WFAC.entry.factionId
WFAC.entry.friends[] -> WFAC.entry.factionId
The starter preset's factionId 35 (Friendly) and 14
(Hostile) deliberately match the WCRT preset defaults, so
the demo content stack is consistent: WCRT.makeBandit's
factionId=14 has a real entry in WFAC.makeStarter that
declares it hostile to friendly NPCs (35) and players (1).
Format:
• magic "WFAC", version 1, little-endian
• per faction: factionId / parentFactionId / name /
description / reputationFlags / baseReputation /
7 ascending tier thresholds (hostile..exalted) /
enemies[] / friends[]
Enums:
• ReputationFlags: VisibleOnTab / AtWarDefault / Hidden /
NoReputation / IsHeader (group label)
• Tier (canonical): Hated / Hostile / Unfriendly /
Neutral / Friendly / Honored /
Revered / Exalted
API: WoweeFactionLoader::save / load / exists / findById +
WoweeFaction::isHostile(a, b); presets makeStarter (3-faction
demo matching WCRT defaults), makeAlliance (header +
Stormwind / Darnassus / Ironforge with reciprocal friend
lists + Defias enemy), makeWildlife (4 beast factions, each
hostile to player but ignoring other beasts).
CLI added (5 flags, 514 documented total now):
--gen-factions / --gen-factions-alliance / --gen-factions-wildlife
--info-wfac / --validate-wfac
Validator catches: factionId=0 + duplicates, empty name,
threshold ordering violations (hostile must be < unfriendly
< neutral < ... < exalted), self-listed as enemy or friend,
faction in both enemies and friends (incoherent).
2026-05-09 15:37:59 -07:00
|
|
|
"--gen-factions", "--gen-factions-alliance", "--gen-factions-wildlife",
|
|
|
|
|
"--info-wfac", "--validate-wfac",
|
2026-05-09 15:45:58 -07:00
|
|
|
"--export-wfac-json", "--import-wfac-json",
|
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
|
|
|
"--gen-locks", "--gen-locks-dungeon", "--gen-locks-professions",
|
|
|
|
|
"--info-wlck", "--validate-wlck",
|
2026-05-09 15:52:20 -07:00
|
|
|
"--export-wlck-json", "--import-wlck-json",
|
feat(pipeline): add WSKL (Wowee Skill Catalog) format
Novel open replacement for Blizzard's SkillLine.dbc +
SkillLineCategory.dbc + the AzerothCore-style player skill
base tables. The 19th open format added to the editor.
Defines every player-trackable skill: weapon proficiencies
(Swords, Axes, Bows), professions (Mining, Alchemy,
Cooking), languages (Common, Dwarvish), class
specializations (Fire, Frost, Holy, Protection), armor
proficiencies (Mail, Plate), and secondary skills (First
Aid, Lockpicking, Riding).
Cross-references with previously-added formats:
WLCK.channel.targetId (kind=Lockpick) -> WSKL.entry.skillId
WGOT.entry.requiredSkill -> WSKL.entry.skillId
The starter preset's skillIds 186 (Mining) and 633
(Lockpicking) deliberately match the canonical IDs already
referenced by WGOT.makeGather and WLCK.makeDungeon —
so the demo content stack now wires together end-to-end:
WGOT herb-node requires skill 186 -> WSKL Mining at rank 1+;
WLCK bandit-strongbox channel requires skill 633 -> WSKL
Lockpicking at rank 1+.
Format:
• magic "WSKL", version 1, little-endian
• per skill: skillId / name / description / categoryId /
canTrain / maxRank / rankPerLevel / iconPath
Enums:
• CategoryId (8): Weapon / Class / Profession /
SecondaryProfession / Language / ArmorProficiency /
Riding / WeaponSpec
API: WoweeSkillLoader::save / load / exists / findById;
presets makeStarter (5-skill demo with cross-referenced
canonical IDs), makeProfessions (12 classic professions:
9 primary + 3 secondary), makeWeapons (16 weapon skills
with canonical SkillLine IDs and rankPerLevel=5 auto-grow).
CLI added (5 flags, 528 documented total now):
--gen-skills / --gen-skills-professions / --gen-skills-weapons
--info-wskl / --validate-wskl
Validator catches: skillId=0 + duplicates, empty name,
maxRank=0, unknown categoryId, suspicious maxRank=1 on
non-Language skill (only languages cap at 1), weapon skill
with rankPerLevel=0 (won't auto-grow on use).
2026-05-09 15:50:25 -07:00
|
|
|
"--gen-skills", "--gen-skills-professions", "--gen-skills-weapons",
|
|
|
|
|
"--info-wskl", "--validate-wskl",
|
2026-05-09 15:59:20 -07:00
|
|
|
"--export-wskl-json", "--import-wskl-json",
|
feat(pipeline): add WSPL (Wowee Spell Catalog) format
Novel open replacement for Blizzard's Spell.dbc +
SpellEffect.dbc + the AzerothCore-style spell_dbc /
spell_proc tables. The 20th open format added to the
editor — completes the canonical-data side of the gameplay
graph.
Each entry holds the metadata side of a spell: name,
description, school, range, mana / cast / cooldown times,
plus a single primary effect. The simplified effect model
(one effectKind + min/max value + misc field) covers the
common cases (damage / heal / buff / debuff / teleport /
summon / dispel) without needing to reproduce the full
multi-effect graph that classic Spell.dbc carries.
Cross-references with previously-added formats:
WLCK.channel.targetId (kind=Spell) -> WSPL.entry.spellId
WQT.objective.targetId (kind=SpellCast) -> WSPL.entry.spellId
WCRT.equippedMain (item with on-use) -> WIT -> WSPL
Format:
• magic "WSPL", version 1, little-endian
• per spell: spellId / name / description / iconPath /
school / targetType / effectKind / cast & cooldown &
GCD ms / manaCost / range min..max / minLevel /
maxStacks / durationMs / effectValueMin..Max /
effectMisc / flags
Enums:
• School (7): Physical / Holy / Fire / Nature / Frost /
Shadow / Arcane
• TargetType (6): Self / Single / Cone / AoeFromSelf /
Line / Ground
• EffectKind (7): Damage / Heal / Buff / Debuff / Teleport /
Summon / Dispel
• Flags: Passive / Hidden / Channeled / Ranged /
AreaOfEffect / Triggered / UnitTargetOnly /
FriendlyOnly / HostileOnly
API: WoweeSpellLoader::save / load / exists / findById;
presets makeStarter (Strike + Lesser Heal + Power Word:
Fortitude + Hearthstone, one per major effect kind),
makeMage (Frostbolt 116 + Fireball 133 + Arcane Intellect
1459 + Blink 1953, canonical Classic spellIds), makeWarrior
(Heroic Strike 78 + Thunder Clap 6343 + Battle Shout 6673 +
Mortal Strike 12294).
CLI added (5 flags, 535 documented total now):
--gen-spells / --gen-spells-mage / --gen-spells-warrior
--info-wspl / --validate-wspl
Validator catches: spellId=0 + duplicates, empty name,
school out of range, effectKind out of range, NaN range,
range/value min>max, FriendlyOnly+HostileOnly conflict
(incoherent), friendly-only with damage/debuff effect
(incoherent), hostile-only with heal/buff effect, buff/debuff
effect with durationMs=0 (instant fade — almost certainly
authoring oversight).
The validator caught a real preset-emitter authoring error
during initial smoke testing — buff spells were setting
effectValueMin without effectValueMax (validator's range
check immediately flagged it), prompting an in-batch fix
to set both fields. This is exactly the catch-the-typo
purpose validators serve.
2026-05-09 15:58:09 -07:00
|
|
|
"--gen-spells", "--gen-spells-mage", "--gen-spells-warrior",
|
|
|
|
|
"--info-wspl", "--validate-wspl",
|
2026-05-09 14:13:30 -07:00
|
|
|
"--gen-weather-temperate", "--gen-weather-arctic",
|
feat(pipeline): add Wowee Open Weather (.wow) zone schedule
8th open-format addition to the Wowee pipeline. Replaces
WoW's WeatherTypes.dbc / WeatherEffect logic with a single
binary file holding a list of weather states for one zone,
each tagged with intensity bounds, a probability weight,
and duration bounds. The renderer / runtime samples one
entry at a time using weighted-random selection, drives
it for a uniform-random duration in [min, max] sec, then
re-rolls.
• Types: Clear / Rain / Snow / Storm / Sandstorm / Fog /
Blizzard (extensible enum).
• Binary format: magic "WOWA", version 1, name, N entries
each storing (typeId, minIntensity, maxIntensity, weight,
minDurationSec, maxDurationSec).
CLI:
• --info-wow <wow-base> [--json] — inspect a WOW
• --gen-weather-temperate — clear + rain + fog (forest)
• --gen-weather-arctic — snow + blizzard + fog (tundra)
• --gen-weather-desert — clear + sandstorm (dunes)
• --gen-weather-stormy — rain + storm + occasional clear
The 8th open format complementing the rest:
M2 → WOM | WMO → WOB | WMO collision → WOC | ADT → WOT
DBC → JsonDBC | BLP → PNG | Light.dbc → WOL | WeatherTypes.dbc → WOW
Smoke-tested all 4 presets + JSON output. Each preset reads
back identically with the expected entry count and weight
distribution.
2026-05-09 14:10:13 -07:00
|
|
|
"--gen-weather-desert", "--gen-weather-stormy",
|
2026-05-09 14:21:55 -07:00
|
|
|
"--gen-zone-atmosphere",
|
2026-05-09 10:08:14 -07:00
|
|
|
"--info-creatures", "--info-objects", "--info-quests",
|
|
|
|
|
"--info-extract", "--info-extract-tree", "--info-extract-budget",
|
|
|
|
|
"--list-missing-sidecars",
|
|
|
|
|
"--info-png", "--info-jsondbc", "--info-blp", "--info-pack-budget",
|
|
|
|
|
"--info-pack-tree",
|
|
|
|
|
"--info-m2", "--info-wmo", "--info-adt",
|
|
|
|
|
"--info-zone", "--info-zone-overview", "--info-project-overview",
|
|
|
|
|
"--copy-project", "--info-wcp", "--list-wcp",
|
|
|
|
|
"--list-creatures", "--list-objects", "--list-quests",
|
|
|
|
|
"--list-quest-objectives", "--list-quest-rewards",
|
|
|
|
|
"--info-creature", "--info-quest", "--info-object",
|
|
|
|
|
"--info-quest-graph-stats",
|
|
|
|
|
"--info-creatures-by-faction", "--info-creatures-by-level",
|
|
|
|
|
"--info-objects-by-path", "--info-objects-by-type",
|
|
|
|
|
"--info-quests-by-level", "--info-quests-by-xp",
|
|
|
|
|
"--unpack-wcp", "--pack-wcp",
|
|
|
|
|
"--validate", "--validate-wom", "--validate-wob", "--validate-woc",
|
|
|
|
|
"--validate-whm", "--validate-all", "--validate-project",
|
|
|
|
|
"--validate-project-open-only", "--audit-project", "--bench-audit-project",
|
|
|
|
|
"--bench-validate-project", "--bench-bake-project",
|
|
|
|
|
"--bench-migrate-data-tree", "--list-data-tree-largest",
|
|
|
|
|
"--export-data-tree-md", "--gen-texture", "--gen-mesh", "--gen-mesh-textured",
|
|
|
|
|
"--add-texture-to-mesh", "--add-texture-to-zone",
|
|
|
|
|
"--gen-mesh-stairs", "--gen-mesh-grid", "--gen-mesh-disc",
|
|
|
|
|
"--gen-mesh-tube", "--gen-mesh-capsule", "--gen-mesh-arch",
|
|
|
|
|
"--gen-mesh-pyramid", "--gen-mesh-fence", "--gen-mesh-tree",
|
|
|
|
|
"--gen-mesh-rock", "--gen-mesh-pillar", "--gen-mesh-bridge",
|
|
|
|
|
"--gen-mesh-tower", "--gen-mesh-house", "--gen-mesh-fountain",
|
|
|
|
|
"--gen-mesh-statue", "--gen-mesh-altar", "--gen-mesh-portal",
|
|
|
|
|
"--gen-mesh-archway", "--gen-mesh-barrel", "--gen-mesh-chest",
|
|
|
|
|
"--gen-mesh-anvil", "--gen-mesh-mushroom", "--gen-mesh-cart",
|
|
|
|
|
"--gen-mesh-banner", "--gen-mesh-grave", "--gen-mesh-bench",
|
|
|
|
|
"--gen-mesh-shrine", "--gen-mesh-totem", "--gen-mesh-cage",
|
|
|
|
|
"--gen-mesh-throne", "--gen-mesh-coffin", "--gen-mesh-bookshelf",
|
2026-05-09 10:47:21 -07:00
|
|
|
"--gen-mesh-tent", "--gen-mesh-firepit", "--gen-mesh-woodpile",
|
2026-05-09 11:17:28 -07:00
|
|
|
"--gen-mesh-canopy", "--gen-mesh-haystack", "--gen-mesh-dock",
|
2026-05-09 11:39:33 -07:00
|
|
|
"--gen-mesh-pergola", "--gen-mesh-chimney", "--gen-mesh-bedroll",
|
2026-05-09 11:52:20 -07:00
|
|
|
"--gen-mesh-workbench", "--gen-mesh-crate-stack",
|
2026-05-09 12:02:35 -07:00
|
|
|
"--gen-mesh-watchpost", "--gen-mesh-water-trough",
|
feat(editor): add --gen-mesh-hitching-post stable fixture
67th procedural mesh primitive. Standard town/stable
hitching post:
• two vertical posts separated by `span`
• horizontal cross-bar at upper-post height (length =
span - postW so it tucks INSIDE the post inner faces,
matching real fence joinery)
• optional decorative caps on each post — set capH=0
for a bare working-yard post
All axis-aligned boxes, exercises every shared helper
(stripExt, initWomDefaults, addFlatBox,
finalizeAsSingleBatch, saveWomOrError). Watertight under
weld (verified 90 manifold edges, 0 boundary, 0
non-manifold).
Useful for stables, taverns with mount parking, town
squares, frontier outposts, ranger camps, post-and-rail
fence segments.
2026-05-09 12:15:41 -07:00
|
|
|
"--gen-mesh-training-dummy", "--gen-mesh-hitching-post",
|
2026-05-09 12:29:09 -07:00
|
|
|
"--gen-mesh-outhouse", "--gen-mesh-forge",
|
feat(editor): add --gen-mesh-gravel-pile rubble heap
71st procedural mesh primitive. Hash-distributed pile of
stone cubes in a roughly conical heap. Each stone gets:
• polar position (radial, theta) with sqrt(rand) on radial
so stones aren't bunched at center
• height limited by yMax = pileH * (1 - radial/baseR), so
larger / more numerous stones land near the base and
smaller ones perch on top — natural gravel-pile profile
• size in the 40-100% range of maxStoneSize
The second multi-box "scene" composite primitive (after
--gen-mesh-crate-stack), but using irregular hashed
placement instead of a regular N×M×K grid. Deterministic
from seed: re-running with same args reproduces the
identical pile.
Useful for mine entrances, construction sites, quarries,
ruined walls, abandoned-fort rubble, pirate-cove stash
mounds. Default 24 stones at 0.6 m base radius gives a
reasonable medium-pile.
Uses every shared helper introduced this batch (printWomWrote,
printWomMeshStats, setCenteredBoundsXZ, addFlatBox,
saveWomOrError, parseOpt*, stripExt).
2026-05-09 12:43:03 -07:00
|
|
|
"--gen-mesh-archery-target", "--gen-mesh-gravel-pile",
|
2026-05-09 12:54:17 -07:00
|
|
|
"--gen-mesh-stone-bench", "--gen-mesh-mine-cart",
|
2026-05-09 13:04:55 -07:00
|
|
|
"--gen-mesh-hitching-rail", "--gen-mesh-pillar-row",
|
2026-05-09 13:16:06 -07:00
|
|
|
"--gen-mesh-statue-base", "--gen-mesh-bird-bath",
|
2026-05-09 13:32:43 -07:00
|
|
|
"--gen-mesh-planter-box", "--gen-mesh-urn", "--gen-mesh-candle",
|
2026-05-09 13:42:58 -07:00
|
|
|
"--gen-mesh-lantern", "--gen-mesh-chalice",
|
2026-05-09 13:58:22 -07:00
|
|
|
"--gen-mesh-standing-torch", "--gen-mesh-scroll-case",
|
2026-05-09 14:23:23 -07:00
|
|
|
"--gen-mesh-stove", "--gen-mesh-well-pail",
|
2026-05-09 14:43:21 -07:00
|
|
|
"--gen-mesh-mug", "--gen-mesh-mortar-pestle",
|
2026-05-09 12:45:25 -07:00
|
|
|
"--gen-camp-pack", "--gen-blacksmith-pack", "--gen-village-pack",
|
2026-05-09 12:55:50 -07:00
|
|
|
"--gen-temple-pack", "--gen-graveyard-pack",
|
2026-05-09 13:17:49 -07:00
|
|
|
"--gen-garden-pack", "--gen-dock-pack", "--gen-tavern-pack",
|
2026-05-09 13:44:48 -07:00
|
|
|
"--gen-mining-pack", "--gen-arena-pack",
|
feat(editor): add --gen-kitchen-pack composite (11th themed pack)
Tavern back-of-house / cookhouse scene composite. Pairs
naturally with --gen-tavern-pack (front-of-house common
room) for a complete inn setup.
Emits 7 .wom files into outDir:
• stove — pot-bellied cookfire stove
• cauldron — large hanging pot
• prep-table — flat work surface
• stool — cook's seat
• barrel — water / ale / flour storage
• mug — drink ready for the inn customer
• mortar — herb / spice grinding tool
This is the 11th themed pack (camp, blacksmith, village,
temple, graveyard, garden, dock, tavern, mining, arena,
kitchen). Notable for being the first pack that uses the
two recently-added drinking-vessel + alchemy primitives
(mug from batch 111, mortar-pestle from batch 113), proving
out the "build small primitives, then compose into themed
packs" workflow.
All 7 emitted primitives pass --validate-wom on first
generation. 468 kArgRequired entries total.
2026-05-09 14:53:01 -07:00
|
|
|
"--gen-kitchen-pack",
|
2026-05-09 10:08:14 -07:00
|
|
|
"--gen-mesh-table", "--gen-mesh-lamppost", "--gen-mesh-bed",
|
|
|
|
|
"--gen-mesh-ladder", "--gen-mesh-well", "--gen-mesh-signpost",
|
|
|
|
|
"--gen-mesh-mailbox", "--gen-mesh-tombstone", "--gen-mesh-crate",
|
|
|
|
|
"--gen-mesh-stool", "--gen-mesh-cauldron", "--gen-mesh-gate",
|
|
|
|
|
"--gen-mesh-beehive", "--gen-mesh-weathervane",
|
|
|
|
|
"--gen-mesh-scarecrow", "--gen-mesh-sundial",
|
2026-05-09 10:11:24 -07:00
|
|
|
"--gen-mesh-podium", "--gen-mesh-brazier", "--gen-mesh-archway-double",
|
2026-05-09 10:08:14 -07:00
|
|
|
"--gen-texture-gradient",
|
|
|
|
|
"--gen-mesh-from-heightmap", "--export-mesh-heightmap",
|
|
|
|
|
"--displace-mesh",
|
|
|
|
|
"--scale-mesh", "--translate-mesh", "--strip-mesh",
|
|
|
|
|
"--gen-texture-noise", "--gen-texture-noise-color", "--rotate-mesh",
|
|
|
|
|
"--center-mesh", "--flip-mesh-normals", "--mirror-mesh",
|
|
|
|
|
"--smooth-mesh-normals",
|
|
|
|
|
"--merge-meshes",
|
|
|
|
|
"--gen-texture-radial", "--gen-texture-stripes", "--gen-texture-dots",
|
|
|
|
|
"--gen-texture-rings", "--gen-texture-checker", "--gen-texture-brick",
|
|
|
|
|
"--gen-texture-wood", "--gen-texture-grass", "--gen-texture-fabric",
|
|
|
|
|
"--gen-texture-cobble", "--gen-texture-marble", "--gen-texture-metal",
|
|
|
|
|
"--gen-texture-leather", "--gen-texture-sand", "--gen-texture-snow",
|
|
|
|
|
"--gen-texture-lava", "--gen-texture-tile", "--gen-texture-bark",
|
|
|
|
|
"--gen-texture-clouds", "--gen-texture-stars", "--gen-texture-vines",
|
|
|
|
|
"--gen-texture-mosaic", "--gen-texture-rust", "--gen-texture-circuit",
|
|
|
|
|
"--gen-texture-coral", "--gen-texture-flame", "--gen-texture-tartan",
|
|
|
|
|
"--gen-texture-argyle", "--gen-texture-herringbone",
|
|
|
|
|
"--gen-texture-scales", "--gen-texture-stained-glass",
|
|
|
|
|
"--gen-texture-shingles", "--gen-texture-frost",
|
|
|
|
|
"--gen-texture-parquet", "--gen-texture-bubbles",
|
|
|
|
|
"--gen-texture-spider-web", "--gen-texture-gingham",
|
|
|
|
|
"--gen-texture-lattice", "--gen-texture-honeycomb",
|
|
|
|
|
"--gen-texture-cracked", "--gen-texture-runes",
|
|
|
|
|
"--gen-texture-leopard", "--gen-texture-zebra",
|
2026-05-09 10:34:02 -07:00
|
|
|
"--gen-texture-knit", "--gen-texture-chainmail",
|
2026-05-09 10:50:46 -07:00
|
|
|
"--gen-texture-planks", "--gen-texture-corrugated",
|
2026-05-09 11:12:28 -07:00
|
|
|
"--gen-texture-rope", "--gen-texture-caustics",
|
2026-05-09 11:31:27 -07:00
|
|
|
"--gen-texture-starburst", "--gen-texture-studs",
|
2026-05-09 11:44:33 -07:00
|
|
|
"--gen-texture-moss", "--gen-texture-woodgrain",
|
2026-05-09 11:56:01 -07:00
|
|
|
"--gen-texture-carbon", "--gen-texture-pinstripe",
|
2026-05-09 12:08:11 -07:00
|
|
|
"--gen-texture-camo", "--gen-texture-snake-skin",
|
2026-05-09 12:20:11 -07:00
|
|
|
"--gen-texture-mesh-screen", "--gen-texture-bamboo",
|
2026-05-09 12:33:25 -07:00
|
|
|
"--gen-texture-blueprint", "--gen-texture-rust-streaks",
|
2026-05-09 12:47:28 -07:00
|
|
|
"--gen-texture-plaid", "--gen-texture-diamond-grid",
|
2026-05-09 12:57:47 -07:00
|
|
|
"--gen-texture-houndstooth", "--gen-texture-chevron",
|
2026-05-09 13:08:07 -07:00
|
|
|
"--gen-texture-dunes", "--gen-texture-swirl",
|
2026-05-09 13:19:30 -07:00
|
|
|
"--gen-texture-ironbark", "--gen-texture-mold",
|
2026-05-09 13:30:57 -07:00
|
|
|
"--gen-texture-embroidery", "--gen-texture-lightbeam",
|
2026-05-09 13:41:40 -07:00
|
|
|
"--gen-texture-dewdrops", "--gen-texture-pinwheel",
|
2026-05-09 13:56:41 -07:00
|
|
|
"--gen-texture-scratched-metal", "--gen-texture-crackle",
|
2026-05-09 14:12:04 -07:00
|
|
|
"--gen-texture-star", "--gen-texture-halftone",
|
2026-05-09 14:26:57 -07:00
|
|
|
"--gen-texture-bayer", "--gen-texture-moon",
|
feat(editor): add --gen-texture-snowflake 6-fold ice crystal
84th procedural texture: 6-fold symmetric snowflake stamp
tiled per cell. Built by computing polar (r, theta) from
the cell center and folding theta into a [0, pi/6] wedge,
so a single arm-shape definition replicates 12 times via
mirror + 60-degree rotation.
Each arm is a thin sliver (sin-based perpendicular distance
test) thickened at two perpendicular knobs at r = 0.40 and
0.70 of the cell-half radius — the knobs provide the
classic "branched ice crystal" silhouette without needing
a separate per-arm subdivision pass.
A small filled center dot anchors the motif at small cell
sizes where the knobs vanish.
Useful for: arctic / winter zones, frost spell effects,
frost-mage themed gear icons, holiday-event decoration,
crystal-shrine backdrops, snowstorm overlays.
Distinct from --gen-texture-snow (random tiny dots, not a
patterned crystal) and --gen-texture-frost (spider-web
crackle, not radial). The first 6-fold-symmetric texture in
the catalogue.
2026-05-09 15:06:32 -07:00
|
|
|
"--gen-texture-damask", "--gen-texture-snowflake",
|
2026-05-09 10:08:14 -07:00
|
|
|
"--validate-glb", "--info-glb", "--info-glb-tree", "--info-glb-bytes",
|
|
|
|
|
"--validate-jsondbc", "--check-glb-bounds", "--validate-stl",
|
|
|
|
|
"--validate-png", "--validate-blp",
|
|
|
|
|
"--zone-summary", "--info-zone-tree", "--info-project-tree",
|
|
|
|
|
"--info-zone-bytes", "--info-project-bytes",
|
|
|
|
|
"--info-zone-extents", "--info-project-extents",
|
|
|
|
|
"--info-zone-water", "--info-project-water",
|
|
|
|
|
"--info-zone-density", "--info-project-density",
|
|
|
|
|
"--export-zone-summary-md", "--export-quest-graph",
|
|
|
|
|
"--export-zone-csv", "--export-zone-html", "--export-project-html",
|
|
|
|
|
"--export-project-md", "--export-zone-checksum", "--export-project-checksum",
|
|
|
|
|
"--validate-project-checksum",
|
|
|
|
|
"--scaffold-zone", "--mvp-zone", "--add-tile", "--remove-tile", "--list-tiles",
|
|
|
|
|
"--for-each-zone", "--for-each-tile", "--zone-stats", "--info-tilemap",
|
|
|
|
|
"--list-zone-deps", "--list-project-orphans", "--remove-project-orphans",
|
|
|
|
|
"--check-zone-refs", "--check-zone-content",
|
|
|
|
|
"--check-project-content", "--check-project-refs",
|
|
|
|
|
"--export-zone-deps-md", "--export-zone-spawn-png",
|
|
|
|
|
"--add-creature", "--add-object", "--add-quest", "--add-item",
|
|
|
|
|
"--random-populate-zone", "--random-populate-items",
|
|
|
|
|
"--info-zone-audio", "--snap-zone-to-ground", "--audit-zone-spawns",
|
|
|
|
|
"--info-project-audio", "--snap-project-to-ground",
|
|
|
|
|
"--audit-project-spawns", "--list-zone-spawns", "--list-project-spawns",
|
|
|
|
|
"--gen-random-zone", "--gen-random-project", "--gen-zone-texture-pack",
|
|
|
|
|
"--gen-zone-mesh-pack", "--gen-zone-starter-pack",
|
|
|
|
|
"--gen-project-starter-pack", "--gen-audio-tone",
|
|
|
|
|
"--gen-audio-noise", "--gen-audio-sweep", "--gen-zone-audio-pack",
|
|
|
|
|
"--info-zone-summary", "--info-project-summary",
|
|
|
|
|
"--info-zone-deps", "--info-project-deps",
|
|
|
|
|
"--gen-zone-readme", "--gen-project-readme",
|
|
|
|
|
"--validate-zone-pack", "--validate-project-packs", "--info-spawn",
|
|
|
|
|
"--diff-zone-spawns",
|
|
|
|
|
"--list-items", "--info-item", "--set-item", "--export-zone-items-md",
|
|
|
|
|
"--export-project-items-md", "--export-project-items-csv",
|
|
|
|
|
"--add-quest-objective", "--add-quest-reward-item", "--set-quest-reward",
|
|
|
|
|
"--remove-quest-objective", "--clone-quest", "--clone-creature",
|
|
|
|
|
"--clone-item", "--validate-items", "--validate-project-items",
|
|
|
|
|
"--info-project-items",
|
|
|
|
|
"--clone-object",
|
|
|
|
|
"--remove-creature", "--remove-object", "--remove-quest", "--remove-item",
|
|
|
|
|
"--copy-zone-items",
|
|
|
|
|
"--copy-zone", "--rename-zone", "--remove-zone",
|
|
|
|
|
"--clear-zone-content", "--strip-zone", "--strip-project",
|
|
|
|
|
"--repair-zone", "--repair-project",
|
|
|
|
|
"--gen-makefile", "--gen-project-makefile",
|
|
|
|
|
"--build-woc", "--regen-collision", "--fix-zone",
|
|
|
|
|
"--export-png", "--export-obj", "--import-obj",
|
|
|
|
|
"--export-wob-obj", "--import-wob-obj",
|
|
|
|
|
"--export-woc-obj", "--export-whm-obj",
|
|
|
|
|
"--export-glb", "--export-wob-glb", "--export-whm-glb",
|
|
|
|
|
"--export-stl", "--import-stl",
|
|
|
|
|
"--bake-zone-glb", "--bake-zone-stl", "--bake-zone-obj",
|
|
|
|
|
"--bake-project-obj", "--bake-project-stl", "--bake-project-glb",
|
2026-05-09 11:36:38 -07:00
|
|
|
"--bake-wom-collision", "--bake-wob-collision", "--bake-zone-collision",
|
2026-05-09 11:33:10 -07:00
|
|
|
"--audit-watertight", "--audit-watertight-wob",
|
2026-05-09 10:08:14 -07:00
|
|
|
"--convert-m2", "--convert-m2-batch",
|
|
|
|
|
"--convert-wmo", "--convert-wmo-batch",
|
|
|
|
|
"--convert-dbc-json", "--convert-dbc-batch", "--convert-json-dbc",
|
|
|
|
|
"--convert-blp-png", "--convert-blp-batch",
|
|
|
|
|
"--migrate-wom", "--migrate-zone", "--migrate-project",
|
|
|
|
|
"--migrate-data-tree", "--info-data-tree", "--strip-data-tree",
|
|
|
|
|
"--audit-data-tree",
|
|
|
|
|
"--migrate-jsondbc",
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const std::size_t kArgRequiredSize =
|
|
|
|
|
sizeof(kArgRequired) / sizeof(kArgRequired[0]);
|
|
|
|
|
|
|
|
|
|
} // namespace cli
|
|
|
|
|
} // namespace editor
|
|
|
|
|
} // namespace wowee
|