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", status.message()),
72 return absl::OkStatus();
77 return absl::FailedPreconditionError(
"No active project to save");
84 if (filename.empty()) {
86 return absl::InvalidArgumentError(
"No filename provided for save as");
97 absl::StrFormat(
"Failed to save project: %s", status.message()),
108 return absl::OkStatus();
112 if (project_path.empty()) {
113 return absl::InvalidArgumentError(
"No project path provided");
116#ifndef __EMSCRIPTEN__
117 if (!std::filesystem::exists(project_path)) {
118 return absl::NotFoundError(
119 absl::StrFormat(
"Project path does not exist: %s", project_path));
126 if (project_path.ends_with(
".zsproj")) {
130 "ZScream project imported successfully. Please configure ROM and "
139 absl::StrFormat(
"Project imported: %s", project_path),
145 return absl::OkStatus();
150 return absl::FailedPreconditionError(
"No active project to export");
153 if (export_path.empty()) {
154 return absl::InvalidArgumentError(
"No export path provided");
165 return absl::OkStatus();
170 return absl::FailedPreconditionError(
"No active project to repair");
180 return absl::OkStatus();
185 return absl::FailedPreconditionError(
"No active project to validate");
192 absl::StrFormat(
"Project validation failed: %s", result.message()),
202 return absl::OkStatus();
215 return {
"Empty Project",
"Dungeon Editor Project",
"Overworld Editor Project",
216 "Graphics Editor Project",
"Full Editor Project"};
220 const std::string& template_name,
const std::string& project_name) {
221 if (template_name.empty() || project_name.empty()) {
222 return absl::InvalidArgumentError(
223 "Template name and project name required");
235 absl::StrFormat(
"Project created from template: %s", template_name),
239 return absl::OkStatus();
243 const std::string& project_name)
const {
245 std::string filename = project_name;
246 std::replace(filename.begin(), filename.end(),
' ',
'_');
247 std::replace(filename.begin(), filename.end(),
'/',
'_');
248 std::replace(filename.begin(), filename.end(),
'\\',
'_');
250 return absl::StrFormat(
"%s.yaze", filename);
254 if (filename.empty()) {
258#ifndef __EMSCRIPTEN__
259 if (!std::filesystem::exists(filename)) {
265 std::string extension = std::filesystem::path(filename).extension().string();
266 return extension ==
".yaze" || extension ==
".json";
270 const std::string& project_path) {
273 return absl::OkStatus();
276 std::filesystem::create_directories(project_path);
277 std::filesystem::create_directories(project_path +
"/assets");
278 std::filesystem::create_directories(project_path +
"/scripts");
279 std::filesystem::create_directories(project_path +
"/output");
280 return absl::OkStatus();
281 }
catch (
const std::exception& e) {
282 return absl::InternalError(
283 absl::StrFormat(
"Failed to create project structure: %s", e.what()));
293 if (rom_path.empty()) {
294 return absl::InvalidArgumentError(
"ROM path cannot be empty");
297#ifndef __EMSCRIPTEN__
298 if (!std::filesystem::exists(rom_path)) {
299 return absl::NotFoundError(
300 absl::StrFormat(
"ROM file not found: %s", rom_path));
309 absl::StrFormat(
"ROM set for project: %s",
310 std::filesystem::path(rom_path).filename().
string()),
314 return absl::OkStatus();
318 const std::string& project_name,
const std::string& project_path) {
319 if (project_name.empty()) {
320 return absl::InvalidArgumentError(
"Project name cannot be empty");
325 if (!project_path.empty()) {
335 std::string project_dir;
336#ifndef __EMSCRIPTEN__
340 if (!project_dir.empty()) {
355 return absl::OkStatus();
380std::vector<project::ProjectManager::ProjectTemplate>
382 std::vector<project::ProjectManager::ProjectTemplate> templates;
387 t.
name =
"Vanilla ROM Hack";
389 "Standard ROM editing without custom ASM patches. "
390 "Limited to vanilla game features.";
391 t.
icon =
"MD_GAMEPAD";
394 templates.push_back(t);
400 t.
name =
"ZSCustomOverworld v2";
402 "Basic overworld expansion with custom BG colors, "
403 "main palettes, and parent system.";
408 templates.push_back(t);
414 t.
name =
"ZSCustomOverworld v3";
416 "Full overworld expansion: wide/tall areas, animated GFX, "
417 "subscreen overlays, and all custom features.";
418 t.
icon =
"MD_TERRAIN";
428 templates.push_back(t);
434 t.
name =
"Randomizer Compatible";
436 "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) {
460 return absl::OkStatus();
464 return absl::NotFoundError(
465 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