Kelsidavis-WoWee/tools/editor/FORMAT_SPEC.md
Kelsi 4d5eef480e feat: WOC collision mesh format — 7th novel open format
New format: WOC (Wowee Open Collision) — binary collision mesh for
custom zone walkability. Magic WOC1 (0x31434F57).

- WoweeCollisionBuilder::fromTerrain() generates collision triangles
  from terrain heightmap with slope classification (50 deg threshold)
- Per-triangle flags: walkable (0x01), water (0x02), steep (0x04)
- Respects terrain holes (skips triangles in hole regions)
- Binary save/load with bounds, tile coords, triangle data
- Auto-exported on zone save alongside WOT/WHM/WOM/WOB
- Added to content pack validation (score now 0-7)
- FORMAT_SPEC.md v1.1 updated with WOC binary layout
- 19 new test assertions: flat terrain generation (32k tris all
  walkable), save/load round-trip, hole skipping
- 328 total assertions across 84 test cases
2026-05-05 15:23:58 -07:00

3.9 KiB
Raw Blame History

Wowee Open Format Specification v1.1

Novel file formats for custom WoW zone content. No Blizzard IP.

WOT — Wowee Open Terrain (JSON metadata)

  • Extension: .wot
  • Contains: tile coords, texture list, per-chunk layers/holes, water data, doodad placements (M2 objects), WMO placements (buildings)
  • Key: "format": "wot-1.0"
  • Placement fields: doodadNames[], doodads[] (nameId, uniqueId, pos, rot, scale, flags)
  • WMO fields: wmoNames[], wmos[] (nameId, uniqueId, pos, rot, flags, doodadSet)

WHM — Wowee HeightMap (binary)

  • Extension: .whm
  • Magic: WHM1 (0x314D4857)
  • Layout: magic(4) + chunks(4) + vertsPerChunk(4) + per-chunk data × 256
  • Per-chunk: baseHeight(4) + heights145 + alphaSize(4) + alphaData(alphaSize)
  • Alpha data: raw alpha blend maps for texture layers (same format as ADT MCAL)
  • Backward compatible: older WHM files without alpha data still load (alphaSize=0)

WOM — Wowee Open Model (binary)

  • Extension: .wom
  • Magic: WOM1 (0x314D4F57)
  • Layout: magic(4) + vertCount(4) + indexCount(4) + texCount(4) + bounds(28) + name + vertices + indices + texPaths
  • Vertex: position(vec3) + normal(vec3) + texCoord(vec2) = 32 bytes
  • Note: geometry-only (no skeletal animation — WOM2 planned for bone data)

WOB — Wowee Open Building (binary)

  • Extension: .wob
  • Magic: WOB1 (0x31424F57)
  • Layout: magic(4) + groupCount(4) + portalCount(4) + doodadCount(4) + bounds(4) + name + groups + portals + doodads
  • Group: name + vertexCount(4) + indexCount(4) + texCount(4) + outdoor(1) + bounds(24)
    • vertices(pos+normal+uv+color) + indices + texPaths + materialCount(4) + materials
  • Material: texturePath + flags(4) + shader(4) + blendMode(4)
  • Doodad: modelPath + position(12) + rotation(12) + scale(4)
  • Portal: groupA(4) + groupB(4) + vertexCount(4) + vertices

WCP — Wowee Content Pack (archive)

  • Extension: .wcp
  • Magic: WCP1 (0x31504357)
  • Layout: magic(4) + fileCount(4) + infoJsonSize(4) + infoJSON + [pathLen(2) + path + dataSize(4) + data] × N
  • Info JSON includes categorized file list (terrain/model/building/texture/data)

zone.json — Map Definition

  • Replaces WDT
  • Fields: mapName, displayName, mapId, biome, baseHeight
  • hasCreatures, description, tiles array, files map
  • doodadNames[], doodads[], wmoNames[], wmos[] for placed objects
  • editorVersion for compatibility tracking

JSON DBC — Data Table Replacement

  • Replaces binary DBC files
  • Format: {"format": "wowee-dbc-json-1.0", "records": [...], "fieldCount": N}
  • Records are arrays of mixed types: integers, floats, strings
  • Client loads via DBCFile::loadJSON() when found in custom_zones/ or output/

PNG Textures — Texture Replacement

  • Replaces BLP texture files
  • Standard PNG format, loaded by client's texture override system
  • Editor auto-converts BLP→PNG on export via stb_image_write

WOC — Wowee Open Collision (binary)

  • Extension: .woc
  • Magic: WOC1 (0x31434F57)
  • Layout: magic(4) + triCount(4) + tileX(4) + tileY(4) + boundsMin(12) + boundsMax(12) + triangles
  • Triangle: v0(12) + v1(12) + v2(12) + flags(1) = 37 bytes
  • Flags: 0x01=walkable, 0x02=water, 0x04=steep, 0x08=indoor
  • Generated from terrain heightmap with slope classification (50 deg threshold)
  • Respects terrain holes (skips triangles in hole regions)

Terrain Stamps (.json)

  • Portable terrain feature snapshots (mountains, craters, etc.)
  • Format: {"format": "wowee-stamp-1.0", "vertices": [[dx, dy, height], ...]}
  • Can be saved/loaded across zones and sessions

Open Format Scoring (0-7)

  1. WOT terrain metadata present
  2. WHM heightmap with valid magic
  3. zone.json map definition
  4. PNG textures present
  5. WOM models with valid magic
  6. WOB buildings with valid magic
  7. WOC collision mesh with valid magic

All formats are novel, portable, and open for redistribution.

No Blizzard intellectual property is used in any format definition.