6#include "absl/strings/str_format.h"
15 : toast_manager_(toast_manager) {}
18 const std::string& template_name) {
22 if (template_name.empty()) {
35 return absl::OkStatus();
42 if (filename.empty()) {
44 return absl::InvalidArgumentError(
"No filename provided");
52 return absl::InvalidArgumentError(
53 absl::StrFormat(
"Invalid project file: %s", filename));
60 absl::StrFormat(
"Failed to load project: %s",
69 absl::StrFormat(
"Project loaded: %s",
74 return absl::OkStatus();
79 return absl::FailedPreconditionError(
"No active project to save");
86 if (filename.empty()) {
88 return absl::InvalidArgumentError(
"No filename provided for save as");
99 absl::StrFormat(
"Failed to save project: %s", status.message()),
110 return absl::OkStatus();
114 if (project_path.empty()) {
115 return absl::InvalidArgumentError(
"No project path provided");
118#ifndef __EMSCRIPTEN__
119 if (!std::filesystem::exists(project_path)) {
120 return absl::NotFoundError(
121 absl::StrFormat(
"Project path does not exist: %s", project_path));
128 if (project_path.ends_with(
".zsproj")) {
132 "ZScream project imported successfully. Please configure ROM and "
141 absl::StrFormat(
"Project imported: %s", project_path),
147 return absl::OkStatus();
152 return absl::FailedPreconditionError(
"No active project to export");
155 if (export_path.empty()) {
156 return absl::InvalidArgumentError(
"No export path provided");
167 return absl::OkStatus();
172 return absl::FailedPreconditionError(
"No active project to repair");
182 return absl::OkStatus();
187 return absl::FailedPreconditionError(
"No active project to validate");
194 absl::StrFormat(
"Project validation failed: %s", result.message()),
204 return absl::OkStatus();
217 return {
"Empty Project",
"Dungeon Editor Project",
"Overworld Editor Project",
218 "Graphics Editor Project",
"Full Editor Project"};
222 const std::string& template_name,
const std::string& project_name) {
223 if (template_name.empty() || project_name.empty()) {
224 return absl::InvalidArgumentError(
225 "Template name and project name required");
237 absl::StrFormat(
"Project created from template: %s", template_name),
241 return absl::OkStatus();
245 const std::string& project_name)
const {
247 std::string filename = project_name;
248 std::replace(filename.begin(), filename.end(),
' ',
'_');
249 std::replace(filename.begin(), filename.end(),
'/',
'_');
250 std::replace(filename.begin(), filename.end(),
'\\',
'_');
252 return absl::StrFormat(
"%s.yaze", filename);
256 if (filename.empty()) {
260#ifndef __EMSCRIPTEN__
261 if (!std::filesystem::exists(filename)) {
267 std::string extension = std::filesystem::path(filename).extension().string();
268 return extension ==
".yaze" || extension ==
".json";
272 const std::string& project_path) {
275 return absl::OkStatus();
278 std::filesystem::create_directories(project_path);
279 std::filesystem::create_directories(project_path +
"/assets");
280 std::filesystem::create_directories(project_path +
"/scripts");
281 std::filesystem::create_directories(project_path +
"/output");
282 return absl::OkStatus();
283 }
catch (
const std::exception& e) {
284 return absl::InternalError(
285 absl::StrFormat(
"Failed to create project structure: %s", e.what()));
295 if (rom_path.empty()) {
296 return absl::InvalidArgumentError(
"ROM path cannot be empty");
299#ifndef __EMSCRIPTEN__
300 if (!std::filesystem::exists(rom_path)) {
301 return absl::NotFoundError(
302 absl::StrFormat(
"ROM file not found: %s", rom_path));
311 absl::StrFormat(
"ROM set for project: %s",
312 std::filesystem::path(rom_path).filename().
string()),
316 return absl::OkStatus();
320 const std::string& project_name,
const std::string& project_path) {
321 if (project_name.empty()) {
322 return absl::InvalidArgumentError(
"Project name cannot be empty");
327 if (!project_path.empty()) {
337 std::string project_dir;
338#ifndef __EMSCRIPTEN__
343 if (!project_dir.empty()) {
355 absl::StrFormat(
"Project created: %s", project_name),
359 return absl::OkStatus();
384std::vector<project::ProjectManager::ProjectTemplate>
386 std::vector<project::ProjectManager::ProjectTemplate> templates;
391 t.
name =
"Vanilla ROM Hack";
392 t.
description =
"Standard ROM editing without custom ASM patches. "
393 "Limited to vanilla game features.";
394 t.
icon =
"MD_GAMEPAD";
397 templates.push_back(t);
403 t.
name =
"ZSCustomOverworld v2";
404 t.
description =
"Basic overworld expansion with custom BG colors, "
405 "main palettes, and parent system.";
410 templates.push_back(t);
416 t.
name =
"ZSCustomOverworld v3";
417 t.
description =
"Full overworld expansion: wide/tall areas, animated GFX, "
418 "subscreen overlays, and all custom features.";
419 t.
icon =
"MD_TERRAIN";
429 templates.push_back(t);
435 t.
name =
"Randomizer Compatible";
436 t.
description =
"Minimal editing preset compatible with ALttP Randomizer. "
437 "Avoids changes that break randomizer compatibility.";
438 t.
icon =
"MD_SHUFFLE";
441 templates.push_back(t);
450 for (
const auto& t : templates) {
451 if (t.name == preset_name) {
457 absl::StrFormat(
"Applied preset: %s", preset_name),
461 return absl::OkStatus();
465 return absl::NotFoundError(
466 absl::StrFormat(
"Unknown preset: %s", preset_name));
std::string GenerateProjectFilename(const std::string &project_name) const
absl::Status FinalizeProjectCreation(const std::string &project_name, const std::string &project_path)
Complete project creation after ROM is loaded.
absl::Status SaveProjectAs(const std::string &filename="")
absl::Status ExportProject(const std::string &export_path)
absl::Status RepairCurrentProject()
std::vector< std::string > GetAvailableTemplates() const
ToastManager * toast_manager_
bool HasActiveProject() const
std::string GetProjectPath() const
absl::Status ApplyZsoPreset(const std::string &preset_name)
Apply a ZSO preset to the current project.
absl::Status ValidateProject()
bool pending_rom_selection_
bool IsValidProjectFile(const std::string &filename) const
absl::Status SaveProject()
absl::Status SetProjectRom(const std::string &rom_path)
Set the ROM for the current project.
absl::Status CreateNewProject(const std::string &template_name="")
project::YazeProject current_project_
absl::Status OpenProject(const std::string &filename="")
void RequestRomSelection()
Request ROM selection (triggers callback)
static std::vector< project::ProjectManager::ProjectTemplate > GetZsoTemplates()
Get ZSO-specific project templates.
void CancelPendingProject()
Cancel pending project creation.
ProjectManager(ToastManager *toast_manager)
absl::Status ImportProject(const std::string &project_path)
std::function< void()> rom_selection_callback_
absl::Status LoadProjectFromFile(const std::string &filename)
std::string pending_template_name_
absl::Status InitializeProjectStructure(const std::string &project_path)
absl::Status CreateFromTemplate(const std::string &template_name, const std::string &project_name)
absl::Status SaveProjectToFile(const std::string &filename)
std::string GetProjectName() const
void Show(const std::string &message, ToastType type=ToastType::kInfo, float ttl_seconds=3.0f)
#define RETURN_IF_ERROR(expr)
bool kSaveOverworldProperties
bool kLoadCustomOverworld
bool kSaveOverworldEntrances
struct yaze::core::FeatureFlags::Flags::Overworld overworld
YazeProject template_project
Modern project structure with comprehensive settings consolidation.
absl::Status ImportZScreamProject(const std::string &zscream_project_path)
std::string GetDisplayName() const
absl::Status SaveAs(const std::string &new_path)
absl::Status Open(const std::string &project_path)
absl::Status Validate() const
core::FeatureFlags::Flags feature_flags