feat(editor): zone validation for open format completeness scoring

- ContentPacker::validateZone() scans a zone directory and checks
  for all open format files (WOT, WHM, PNG, WOM, zone.json, etc.)
- openFormatScore(): returns 0-5 based on how many open formats present
- summary(): human-readable list of found formats
- Foundation for quality gate on WCP export: warn if zone uses
  Blizzard formats that could be converted to open versions
This commit is contained in:
Kelsi 2026-05-05 10:38:57 -07:00
parent 8517ae3778
commit a54ce494be
2 changed files with 47 additions and 0 deletions

View file

@ -171,5 +171,42 @@ bool ContentPacker::readInfo(const std::string& wcpPath, ContentPackInfo& info)
return true;
}
ContentPacker::ValidationResult ContentPacker::validateZone(const std::string& zoneDir) {
namespace fs = std::filesystem;
ValidationResult r;
if (!fs::exists(zoneDir)) return r;
for (auto& entry : fs::recursive_directory_iterator(zoneDir)) {
if (!entry.is_regular_file()) continue;
std::string ext = entry.path().extension().string();
std::string name = entry.path().filename().string();
if (ext == ".wot") r.hasWot = true;
if (ext == ".whm") r.hasWhm = true;
if (ext == ".wom") r.hasWom = true;
if (ext == ".png") r.hasPng = true;
if (name == "zone.json") r.hasZoneJson = true;
if (name == "creatures.json") r.hasCreatures = true;
if (name == "quests.json") r.hasQuests = true;
if (name == "objects.json") r.hasObjects = true;
}
return r;
}
int ContentPacker::ValidationResult::openFormatScore() const {
int score = 0;
if (hasWot) score++; if (hasWhm) score++; if (hasZoneJson) score++;
if (hasPng) score++; if (hasWom) score++;
return score; // max 5 for fully open
}
std::string ContentPacker::ValidationResult::summary() const {
std::string s;
s += hasWot ? "WOT " : ""; s += hasWhm ? "WHM " : "";
s += hasZoneJson ? "zone.json " : ""; s += hasPng ? "PNG " : "";
s += hasWom ? "WOM " : ""; s += hasCreatures ? "creatures " : "";
s += hasQuests ? "quests " : ""; s += hasObjects ? "objects " : "";
return s.empty() ? "(empty)" : s;
}
} // namespace editor
} // namespace wowee

View file

@ -34,6 +34,16 @@ public:
// Read pack info without extracting
static bool readInfo(const std::string& wcpPath, ContentPackInfo& info);
// Validate that a zone directory has all required open format files
struct ValidationResult {
bool hasWot = false, hasWhm = false, hasZoneJson = false;
bool hasPng = false, hasWom = false, hasCreatures = false;
bool hasQuests = false, hasObjects = false;
int openFormatScore() const;
std::string summary() const;
};
static ValidationResult validateZone(const std::string& zoneDir);
};
} // namespace editor