Kelsidavis-WoWee/tools/asset_extract/open_format_emitter.hpp
Kelsi 5ed2008621 feat(extract): emit open-format side-files (BLP→PNG, DBC→JSON)
The asset_extract tool now optionally writes wowee open-format
copies next to each extracted proprietary file:
  --emit-png      foo.blp → foo.png
  --emit-json-dbc foo.dbc → foo.json
  --emit-open     shortcut for both

Originals are left untouched, so private servers (AzerothCore,
TrinityCore) that load from the manifest's .blp/.dbc paths
continue to work unchanged. The wowee runtime / editor can now
consume the open formats directly without an extra conversion pass.

Implementation:
- New tools/asset_extract/open_format_emitter.{hpp,cpp} encapsulates
  the post-extract walk + per-file conversion.
- BLP→PNG uses BLPLoader::load + stbi_write_png with the same
  dimension/buffer-size sanity guards the editor's texture exporter
  applies.
- DBC→JSON mirrors the editor's DBCExporter::exportAsJson schema
  (string/float/uint heuristic) so the runtime DBC overlay loader
  can consume the output drop-in.
2026-05-06 10:23:32 -07:00

40 lines
1.5 KiB
C++

#pragma once
// Convert proprietary Blizzard formats to wowee open formats as a
// post-extraction pass. Each emit*() reads a single file from disk and
// writes the open-format equivalent SIDE-BY-SIDE — the original file is
// left untouched so private servers (AzerothCore/TrinityCore) that
// expect .blp/.dbc/.m2/.wmo continue to work unchanged.
//
// Naming: foo.blp → foo.png, foo.dbc → foo.json, foo.m2 → foo.wom,
// foo.wmo → foo.wob.
#include <string>
#include <cstdint>
namespace wowee {
namespace tools {
struct OpenFormatStats {
uint32_t pngOk = 0, pngFail = 0;
uint32_t jsonDbcOk = 0, jsonDbcFail = 0;
};
// Convert one BLP file on disk to a PNG side-file.
// Returns true on success; false on missing file, invalid BLP, or PNG write error.
bool emitPngFromBlp(const std::string& blpPath, const std::string& pngPath);
// Convert one DBC file on disk to a JSON side-file.
// JSON layout: {format, source, recordCount, fieldCount, records:[[...], ...]}
// — same schema the editor's runtime DBC loader (loadJSON) accepts so
// the output drops into custom_zones/<zone>/data/ directly.
bool emitJsonFromDbc(const std::string& dbcPath, const std::string& jsonPath);
// Walk an extracted-asset directory and emit open-format side-files for
// every BLP and/or DBC found. Counts are accumulated into stats.
void emitOpenFormats(const std::string& rootDir,
bool emitPng, bool emitJsonDbc,
OpenFormatStats& stats);
} // namespace tools
} // namespace wowee