mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-11 03:23:51 +00:00
53rd open format — replaces the companion-pet portions of CreatureFamily.dbc plus the AzerothCore-style critter / vanity- pet SQL data. Distinct from WPET (which covers hunter combat pets and warlock minions); WCMP covers non-combat "vanity" pets that follow the player around for cosmetic reasons — Mechanical Squirrel, Mini Diablo, Panda Cub, dragon hatchlings. 8 companion kinds (Critter, Mechanical, DragonHatchling, Demonic, Spectral, Elemental, Plush, UndeadCritter), 4 rarity tiers (Common / Uncommon / Rare / Epic), and 3 faction restrictions (AnyFaction / AllianceOnly / HordeOnly). Cross-references with prior formats — creatureId points at WCRT.creatureId (the rendered model), learnSpellId at WSPL.spellId (the spell that summons the pet), itemId at WIT.itemId (the item that teaches the spell), and idleSoundId at WSND.soundId (idle ambient noise). CLI: --gen-cmp (3 common vendor pets), --gen-cmp-rare (4 promo / collector pets at Epic rarity — Mini Diablo, Panda Cub, Zergling, Murky), --gen-cmp-faction (3 faction- restricted Alliance Lion Cub / Horde Mottled Boar / neutral Argent Squire), --info-wcmp, --validate-wcmp with --json variants. Validator catches id+name+creatureId+ learnSpellId required, kind 0..7 / rarity 0..3 / faction 0..2 range, and Epic-rarity-no-itemId warning (most promo pets need a redemption-code item). Format graph: 52 → 53 binary formats. CLI flag count: 777 → 782.
138 lines
8.1 KiB
C++
138 lines
8.1 KiB
C++
#include "cli_list_formats.hpp"
|
|
#include "cli_arg_parse.hpp"
|
|
|
|
#include <nlohmann/json.hpp>
|
|
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
#include <string>
|
|
|
|
namespace wowee {
|
|
namespace editor {
|
|
namespace cli {
|
|
|
|
namespace {
|
|
|
|
// Static catalog of every novel open format the editor can
|
|
// currently emit, parse, and round-trip. Adding a new format
|
|
// requires appending one row here so --list-formats stays
|
|
// authoritative. The list is intentionally kept in
|
|
// introduction order so users can correlate against the
|
|
// commit history.
|
|
struct FormatRow {
|
|
const char* magic; // 4-char binary magic
|
|
const char* extension; // file suffix (with dot)
|
|
const char* category; // grouping label
|
|
const char* replaces; // proprietary source(s)
|
|
const char* description;
|
|
};
|
|
|
|
constexpr FormatRow kFormats[] = {
|
|
// World / asset / pipeline foundations.
|
|
{"WOM ", ".wom", "asset", "M2", "M2 model — bones / vertices / animations"},
|
|
{"WOB ", ".wob", "asset", "WMO", "WMO building — groups / portals / collision"},
|
|
{"WHM ", ".whm", "world", "ADT heightmap", "ADT terrain heightmap tile"},
|
|
{"WOT ", ".wot", "world", "ADT textures", "ADT terrain texture splats + alpha layers"},
|
|
{"WOW ", ".wow", "world", "WDT/WDL", "Per-zone world manifest + weather"},
|
|
|
|
// Catalog / DBC replacements.
|
|
{"WITM", ".wit", "items", "Item.dbc + item_template", "Item catalog (gear, consumables, quest items)"},
|
|
{"WCRT", ".wcrt", "creatures", "creature_template", "Creature catalog (NPCs, mobs, vendors)"},
|
|
{"WSPN", ".wspn", "wspn", "creature SQL", "Creature/object spawns by zone+coord"},
|
|
{"WLOT", ".wlot", "loot", "creature_loot_template", "Loot tables and drop chances"},
|
|
{"WGOT", ".wgot", "objects", "gameobject_template", "GameObject catalog (chests / doors)"},
|
|
{"WSND", ".wsnd", "audio", "SoundEntries.dbc", "Sound entry catalog"},
|
|
{"WSPL", ".wspl", "spells", "Spell.dbc + spell_template", "Spell catalog (effects, durations, costs)"},
|
|
{"WQTM", ".wqt", "quests", "quest_template + Quest*.dbc", "Quest catalog (objectives, rewards)"},
|
|
{"WMSX", ".wms", "maps", "Map.dbc + AreaTable.dbc", "Map and area catalog"},
|
|
{"WCHC", ".wchc", "chars", "ChrClasses.dbc + ChrRaces.dbc", "Class + race catalog"},
|
|
{"WACH", ".wach", "achieve", "Achievement.dbc + Criteria.dbc", "Achievement catalog with criteria"},
|
|
{"WTRN", ".wtrr", "trainers", "npc_trainer + Spell.dbc", "Trainer catalog (spell teaching)"},
|
|
{"WGSP", ".wgoss", "gossip", "gossip_menu + npc_gossip", "Gossip menu / dialog tree catalog"},
|
|
{"WTAX", ".wtax", "taxi", "TaxiNodes.dbc + TaxiPath.dbc", "Flight path catalog (taxi network)"},
|
|
{"WTAL", ".wtal", "talents", "Talent.dbc + TalentTab.dbc", "Talent tree catalog"},
|
|
{"WTKN", ".wtkn", "tokens", "ItemExtendedCost + currency", "Token / currency catalog"},
|
|
{"WTRG", ".wtrg", "triggers", "AreaTrigger.dbc + areatrigger", "Area trigger catalog"},
|
|
{"WTIT", ".wttl", "titles", "CharTitles.dbc", "Player title catalog"},
|
|
{"WSEA", ".wevt", "events", "GameEvent + spell_script", "Scripted event catalog"},
|
|
{"WMOU", ".wmnt", "mounts", "Mount.dbc + spell_mount", "Mount catalog (ground+flying)"},
|
|
{"WBGD", ".wbgd", "battle", "BattlemasterList.dbc + bg_*", "Battleground definition catalog"},
|
|
{"WMAL", ".wmal", "mail", "mail + mail_external", "In-game mail message catalog"},
|
|
{"WGEM", ".wgem", "gems", "GemProperties.dbc + Enchant.dbc", "Gem + enchantment catalog"},
|
|
{"WGLD", ".wgld", "guilds", "guild + guild_member", "Guild catalog (charters, ranks)"},
|
|
{"WPCD", ".wcnd", "cond", "Conditions + spell_proc_event", "Reusable condition rule catalog"},
|
|
{"WPET", ".wpet", "pets", "CreatureFamily.dbc + pet SQL", "Hunter pet + warlock minion catalog"},
|
|
{"WAUC", ".wauc", "auction", "auctionhouse + npc_auctioneer", "Auction house rules catalog"},
|
|
{"WCHN", ".wchn", "channels", "ChatChannels.dbc + chat_channel", "Chat channel catalog"},
|
|
{"WCMS", ".wcms", "cinematic", "Movie.dbc + CinematicCamera.dbc", "Cinematic catalog (videos, cutscenes)"},
|
|
{"WGLY", ".wgly", "glyphs", "GlyphProperties.dbc + GlyphSlot", "WotLK glyph catalog"},
|
|
{"WVHC", ".wvhc", "vehicles", "Vehicle.dbc + VehicleSeat.dbc", "Vehicle + seat-layout catalog"},
|
|
{"WHOL", ".whol", "holiday", "Holidays.dbc + game_event", "Calendar holiday + event catalog"},
|
|
{"WLIQ", ".wliq", "liquids", "LiquidType.dbc", "Liquid material catalog (water/lava/slime)"},
|
|
{"WANI", ".wani", "anim", "AnimationData.dbc", "Animation ID + fallback + weapon-flag catalog"},
|
|
{"WSVK", ".wsvk", "spellfx", "SpellVisualKit.dbc + SpellVisFx", "Spell visual kit (cast/proj/impact effects)"},
|
|
{"WWUI", ".wwui", "ui", "WorldStateUI.dbc + world_state", "World-state UI (BG scoreboards / siege counters)"},
|
|
{"WPCN", ".wpcn", "logic", "PlayerCondition.dbc + conditions", "Player condition (gates, AND/OR/NOT chains)"},
|
|
{"WTSK", ".wtsk", "crafting", "SkillLineAbility.dbc + recipes", "Trade skill recipes (per-profession crafts)"},
|
|
{"WCEQ", ".wceq", "creatures", "creature_equip_template", "Creature equipment loadout (visible weapons)"},
|
|
{"WSET", ".wset", "items", "ItemSet.dbc + ItemSetSpell.dbc", "Item set + tier-bonus catalog"},
|
|
{"WGTP", ".wgtp", "ui", "GameTips.dbc + tutorial hints", "Game tips / tutorial / loading-screen catalog"},
|
|
{"WCMP", ".wcmp", "pets", "CreatureFamily + companion SQL", "Companion / vanity pet catalog"},
|
|
|
|
// Additional pipeline catalogs without the alternating
|
|
// gen/info/validate CLI surface (loaded by the engine
|
|
// directly).
|
|
{"WFAC", ".wfac", "factions", "Faction.dbc + FactionTemplate", "Faction + reputation catalog"},
|
|
{"WLCK", ".wlck", "locks", "Lock.dbc", "Lock + key requirement catalog"},
|
|
{"WSKL", ".wskl", "skills", "SkillLine.dbc + SkillLineAbility","Skill / profession catalog"},
|
|
{"WOLA", ".wola", "light", "Light.dbc + LightParams.dbc", "Outdoor lighting / sky color catalog"},
|
|
{"WOWA", ".wowa", "weather", "weather + LightParams", "Per-zone weather schedule catalog"},
|
|
{"WMPX", ".wmpx", "worldmap", "WorldMapArea.dbc", "World map / minimap zone catalog"},
|
|
};
|
|
|
|
constexpr size_t kFormatsCount =
|
|
sizeof(kFormats) / sizeof(kFormats[0]);
|
|
|
|
int handleList(int& i, int argc, char** argv) {
|
|
bool jsonOut = consumeJsonFlag(i, argc, argv);
|
|
if (jsonOut) {
|
|
nlohmann::json j;
|
|
j["count"] = kFormatsCount;
|
|
nlohmann::json arr = nlohmann::json::array();
|
|
for (const auto& row : kFormats) {
|
|
arr.push_back({
|
|
{"magic", row.magic},
|
|
{"extension", row.extension},
|
|
{"category", row.category},
|
|
{"replaces", row.replaces},
|
|
{"description", row.description},
|
|
});
|
|
}
|
|
j["formats"] = arr;
|
|
std::printf("%s\n", j.dump(2).c_str());
|
|
return 0;
|
|
}
|
|
std::printf("Wowee open formats: %zu total\n", kFormatsCount);
|
|
std::printf("\n");
|
|
std::printf(" magic ext category replaces description\n");
|
|
std::printf(" ------- ------- ----------- -------------------------------- -----------\n");
|
|
for (const auto& row : kFormats) {
|
|
std::printf(" %-7s %-7s %-11s %-32s %s\n",
|
|
row.magic, row.extension, row.category,
|
|
row.replaces, row.description);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
bool handleListFormats(int& i, int argc, char** argv, int& outRc) {
|
|
if (std::strcmp(argv[i], "--list-formats") == 0) {
|
|
outRc = handleList(i, argc, argv); return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
} // namespace cli
|
|
} // namespace editor
|
|
} // namespace wowee
|