feat(editor): Export Content Pack button in File menu

- File > Export Content Pack (.wcp) saves zone + packs into WCP archive
- Auto-saves zone first, then bundles into the novel WCP format
- WCP is a custom format unique to wowee (not MPQ, not CASC)
- Output: output/MapName.wcp ready for distribution
- Toast notification on success/failure
This commit is contained in:
Kelsi 2026-05-05 09:29:57 -07:00
parent 79ae91a6d5
commit be18ceea73
3 changed files with 23 additions and 0 deletions

View file

@ -1,6 +1,7 @@
#include "editor_app.hpp" #include "editor_app.hpp"
#include "adt_writer.hpp" #include "adt_writer.hpp"
#include "zone_manifest.hpp" #include "zone_manifest.hpp"
#include "content_pack.hpp"
#include "core/coordinates.hpp" #include "core/coordinates.hpp"
#include "rendering/vk_context.hpp" #include "rendering/vk_context.hpp"
#include "pipeline/adt_loader.hpp" #include "pipeline/adt_loader.hpp"
@ -762,6 +763,23 @@ void EditorApp::exportZone(const std::string& outputDir) {
LOG_INFO("Zone exported to: ", base); LOG_INFO("Zone exported to: ", base);
} }
void EditorApp::exportContentPack(const std::string& destPath) {
if (!terrain_.isLoaded()) return;
// Save zone first
std::string dir = lastSavePath_.empty() ? "output" : lastSavePath_;
exportZone(dir);
// Pack into WCP
ContentPackInfo info;
info.name = loadedMap_;
info.author = "Kelsi Davis";
info.description = "Custom zone created with Wowee World Editor";
info.mapId = 9000;
if (ContentPacker::packZone(dir, loadedMap_, destPath, info))
showToast("Content pack exported: " + destPath);
else
showToast("Failed to create content pack");
}
void EditorApp::quickSave() { void EditorApp::quickSave() {
if (!terrain_.isLoaded()) return; if (!terrain_.isLoaded()) return;
std::string dir = lastSavePath_.empty() ? "output" : lastSavePath_; std::string dir = lastSavePath_.empty() ? "output" : lastSavePath_;

View file

@ -36,6 +36,7 @@ public:
void saveWDT(const std::string& path); void saveWDT(const std::string& path);
void exportZone(const std::string& outputDir); void exportZone(const std::string& outputDir);
void quickSave(); void quickSave();
void exportContentPack(const std::string& destPath);
void requestQuit(); void requestQuit();
void resetCamera(); void resetCamera();

View file

@ -158,6 +158,10 @@ void EditorUI::renderMenuBar(EditorApp& app) {
app.quickSave(); app.quickSave();
if (ImGui::MenuItem("Export Zone...", nullptr, false, app.hasTerrainLoaded())) if (ImGui::MenuItem("Export Zone...", nullptr, false, app.hasTerrainLoaded()))
showSaveDialog_ = true; showSaveDialog_ = true;
if (ImGui::MenuItem("Export Content Pack (.wcp)", nullptr, false, app.hasTerrainLoaded())) {
std::string wcpPath = "output/" + app.getLoadedMap() + ".wcp";
app.exportContentPack(wcpPath);
}
if (ImGui::BeginMenu("Add Adjacent Tile", app.hasTerrainLoaded())) { if (ImGui::BeginMenu("Add Adjacent Tile", app.hasTerrainLoaded())) {
if (ImGui::MenuItem("North (+X)")) app.addAdjacentTile(1, 0); if (ImGui::MenuItem("North (+X)")) app.addAdjacentTile(1, 0);
if (ImGui::MenuItem("South (-X)")) app.addAdjacentTile(-1, 0); if (ImGui::MenuItem("South (-X)")) app.addAdjacentTile(-1, 0);