diff --git a/src/app/core/common.cc b/src/app/core/common.cc index 18e28907..0dfc1045 100644 --- a/src/app/core/common.cc +++ b/src/app/core/common.cc @@ -171,8 +171,6 @@ bool StringReplace(std::string &str, const std::string &from, return true; } -std::shared_ptr ExperimentFlags::flags_; - uint32_t Get24LocalFromPC(uint8_t *data, int addr, bool pc) { uint32_t ret = (PcToSnes(addr) & 0xFF0000) | (data[addr + 1] << 8) | data[addr]; diff --git a/src/app/core/common.h b/src/app/core/common.h index 50e524a3..9d0da523 100644 --- a/src/app/core/common.h +++ b/src/app/core/common.h @@ -96,57 +96,44 @@ class ExperimentFlags { } overworld; }; - ExperimentFlags() = default; - virtual ~ExperimentFlags() = default; - auto flags() const { - if (!flags_) { - flags_ = std::make_shared(); - } - Flags *flags = flags_.get(); - return flags; - } - Flags *mutable_flags() { - if (!flags_) { - flags_ = std::make_shared(); - } - return flags_.get(); + static Flags &get() { + static Flags instance; + return instance; } + std::string Serialize() const { std::string result; result += - "kLogInstructions: " + std::to_string(flags_->kLogInstructions) + "\n"; + "kLogInstructions: " + std::to_string(get().kLogInstructions) + "\n"; result += - "kSaveAllPalettes: " + std::to_string(flags_->kSaveAllPalettes) + "\n"; + "kSaveAllPalettes: " + std::to_string(get().kSaveAllPalettes) + "\n"; + result += "kSaveGfxGroups: " + std::to_string(get().kSaveGfxGroups) + "\n"; result += - "kSaveGfxGroups: " + std::to_string(flags_->kSaveGfxGroups) + "\n"; - result += "kSaveWithChangeQueue: " + - std::to_string(flags_->kSaveWithChangeQueue) + "\n"; + "kSaveWithChangeQueue: " + std::to_string(get().kSaveWithChangeQueue) + + "\n"; result += "kDrawDungeonRoomGraphics: " + - std::to_string(flags_->kDrawDungeonRoomGraphics) + "\n"; + std::to_string(get().kDrawDungeonRoomGraphics) + "\n"; result += "kNewFileDialogWrapper: " + - std::to_string(flags_->kNewFileDialogWrapper) + "\n"; + std::to_string(get().kNewFileDialogWrapper) + "\n"; result += "kLoadTexturesAsStreaming: " + - std::to_string(flags_->kLoadTexturesAsStreaming) + "\n"; + std::to_string(get().kLoadTexturesAsStreaming) + "\n"; result += - "kSaveDungeonMaps: " + std::to_string(flags_->kSaveDungeonMaps) + "\n"; - result += "kLogToConsole: " + std::to_string(flags_->kLogToConsole) + "\n"; + "kSaveDungeonMaps: " + std::to_string(get().kSaveDungeonMaps) + "\n"; + result += "kLogToConsole: " + std::to_string(get().kLogToConsole) + "\n"; result += "kDrawOverworldSprites: " + - std::to_string(flags_->overworld.kDrawOverworldSprites) + "\n"; + std::to_string(get().overworld.kDrawOverworldSprites) + "\n"; result += "kSaveOverworldMaps: " + - std::to_string(flags_->overworld.kSaveOverworldMaps) + "\n"; + std::to_string(get().overworld.kSaveOverworldMaps) + "\n"; result += "kSaveOverworldEntrances: " + - std::to_string(flags_->overworld.kSaveOverworldEntrances) + "\n"; + std::to_string(get().overworld.kSaveOverworldEntrances) + "\n"; result += "kSaveOverworldExits: " + - std::to_string(flags_->overworld.kSaveOverworldExits) + "\n"; + std::to_string(get().overworld.kSaveOverworldExits) + "\n"; result += "kSaveOverworldItems: " + - std::to_string(flags_->overworld.kSaveOverworldItems) + "\n"; + std::to_string(get().overworld.kSaveOverworldItems) + "\n"; result += "kSaveOverworldProperties: " + - std::to_string(flags_->overworld.kSaveOverworldProperties) + "\n"; + std::to_string(get().overworld.kSaveOverworldProperties) + "\n"; return result; } - - private: - static std::shared_ptr flags_; }; /** diff --git a/src/app/core/project.h b/src/app/core/project.h index 8d844ee4..b12cc3a7 100644 --- a/src/app/core/project.h +++ b/src/app/core/project.h @@ -24,7 +24,7 @@ constexpr char kEndOfProjectFile[] = "EndOfProjectFile"; * user can have different rom file names for a single project and keep track of * backups. */ -struct Project : public core::ExperimentFlags { +struct Project { absl::Status Create(const std::string& project_name) { name = project_name; project_opened_ = true; diff --git a/src/app/editor/dungeon/dungeon_editor.cc b/src/app/editor/dungeon/dungeon_editor.cc index 975e0410..0887fffb 100644 --- a/src/app/editor/dungeon/dungeon_editor.cc +++ b/src/app/editor/dungeon/dungeon_editor.cc @@ -77,7 +77,7 @@ absl::Status DungeonEditor::Initialize() { rooms_.emplace_back(zelda3::Room(/*room_id=*/i)); rooms_[i].LoadHeader(); rooms_[i].LoadRoomFromROM(); - if (flags()->kDrawDungeonRoomGraphics) { + if (core::ExperimentFlags::get().kDrawDungeonRoomGraphics) { rooms_[i].LoadRoomGraphics(); } diff --git a/src/app/editor/dungeon/dungeon_editor.h b/src/app/editor/dungeon/dungeon_editor.h index 5d426105..076150bd 100644 --- a/src/app/editor/dungeon/dungeon_editor.h +++ b/src/app/editor/dungeon/dungeon_editor.h @@ -1,11 +1,11 @@ #ifndef YAZE_APP_EDITOR_DUNGEONEDITOR_H #define YAZE_APP_EDITOR_DUNGEONEDITOR_H -#include "app/core/common.h" #include "absl/container/flat_hash_map.h" +#include "app/core/common.h" +#include "app/editor/editor.h" #include "app/editor/graphics/gfx_group_editor.h" #include "app/editor/graphics/palette_editor.h" -#include "app/editor/editor.h" #include "app/gui/canvas.h" #include "app/rom.h" #include "imgui/imgui.h" @@ -39,9 +39,7 @@ constexpr ImGuiTableFlags kDungeonTableFlags = * tile selector, and object renderer. Additionally, it handles loading room * entrances, calculating usage statistics, and rendering set usage. */ -class DungeonEditor : public Editor, - public SharedRom, - public core::ExperimentFlags { +class DungeonEditor : public Editor, public SharedRom { public: DungeonEditor() { type_ = EditorType::kDungeon; } diff --git a/src/app/editor/editor_manager.cc b/src/app/editor/editor_manager.cc index 7b813d72..48db5bf2 100644 --- a/src/app/editor/editor_manager.cc +++ b/src/app/editor/editor_manager.cc @@ -683,7 +683,7 @@ void EditorManager::LoadRom() { } void EditorManager::SaveRom() { - if (flags()->kSaveDungeonMaps) { + if (core::ExperimentFlags::get().kSaveDungeonMaps) { status_ = screen_editor_.SaveDungeonMaps(); RETURN_VOID_IF_ERROR(status_); } diff --git a/src/app/editor/editor_manager.h b/src/app/editor/editor_manager.h index 5dcaaa51..04846fe6 100644 --- a/src/app/editor/editor_manager.h +++ b/src/app/editor/editor_manager.h @@ -35,7 +35,7 @@ namespace editor { * variable points to the currently active editor in the tab view. * */ -class EditorManager : public SharedRom, public core::ExperimentFlags { +class EditorManager : public SharedRom { public: EditorManager() { current_editor_ = &overworld_editor_; diff --git a/src/app/editor/overworld/overworld_editor.cc b/src/app/editor/overworld/overworld_editor.cc index 049a3199..285027a3 100644 --- a/src/app/editor/overworld/overworld_editor.cc +++ b/src/app/editor/overworld/overworld_editor.cc @@ -621,7 +621,7 @@ void OverworldEditor::CheckForMousePan() { void OverworldEditor::DrawOverworldCanvas() { if (all_gfx_loaded_) { - if (flags()->overworld.kLoadCustomOverworld) { + if (core::ExperimentFlags::get().overworld.kLoadCustomOverworld) { DrawCustomOverworldMapSettings(); } else { DrawOverworldMapSettings(); @@ -1009,22 +1009,22 @@ void OverworldEditor::DrawOverworldSprites() { } absl::Status OverworldEditor::Save() { - if (flags()->overworld.kSaveOverworldMaps) { + if (core::ExperimentFlags::get().overworld.kSaveOverworldMaps) { RETURN_IF_ERROR(overworld_.CreateTile32Tilemap()); RETURN_IF_ERROR(overworld_.SaveMap32Tiles()); RETURN_IF_ERROR(overworld_.SaveMap16Tiles()); RETURN_IF_ERROR(overworld_.SaveOverworldMaps()); } - if (flags()->overworld.kSaveOverworldEntrances) { + if (core::ExperimentFlags::get().overworld.kSaveOverworldEntrances) { RETURN_IF_ERROR(overworld_.SaveEntrances()); } - if (flags()->overworld.kSaveOverworldExits) { + if (core::ExperimentFlags::get().overworld.kSaveOverworldExits) { RETURN_IF_ERROR(overworld_.SaveExits()); } - if (flags()->overworld.kSaveOverworldItems) { + if (core::ExperimentFlags::get().overworld.kSaveOverworldItems) { RETURN_IF_ERROR(overworld_.SaveItems()); } - if (flags()->overworld.kSaveOverworldProperties) { + if (core::ExperimentFlags::get().overworld.kSaveOverworldProperties) { RETURN_IF_ERROR(overworld_.SaveMapProperties()); } return absl::OkStatus(); @@ -1082,7 +1082,7 @@ absl::Status OverworldEditor::LoadGraphics() { overworld_.current_map_bitmap_data(), maps_bmp_[i], palette)); } - if (flags()->overworld.kDrawOverworldSprites) { + if (core::ExperimentFlags::get().overworld.kDrawOverworldSprites) { RETURN_IF_ERROR(LoadSpriteGraphics()); } diff --git a/src/app/editor/overworld/overworld_editor.h b/src/app/editor/overworld/overworld_editor.h index d81e0515..c5dd58df 100644 --- a/src/app/editor/overworld/overworld_editor.h +++ b/src/app/editor/overworld/overworld_editor.h @@ -72,9 +72,7 @@ constexpr absl::string_view kOWMapTable = "#MapSettingsTable"; * Provides access to the GfxGroupEditor and Tile16Editor through popup windows. * */ -class OverworldEditor : public Editor, - public gfx::GfxContext, - public core::ExperimentFlags { +class OverworldEditor : public Editor, public gfx::GfxContext { public: OverworldEditor(Rom& rom) : rom_(rom) { type_ = EditorType::kOverworld; } diff --git a/src/app/editor/system/flags.h b/src/app/editor/system/flags.h index 6c00b978..fbada123 100644 --- a/src/app/editor/system/flags.h +++ b/src/app/editor/system/flags.h @@ -7,51 +7,53 @@ namespace yaze { namespace editor { +using core::ExperimentFlags; using ImGui::BeginMenu; using ImGui::Checkbox; using ImGui::EndMenu; using ImGui::MenuItem; using ImGui::Separator; -struct FlagsMenu : public core::ExperimentFlags { +struct FlagsMenu { void Draw() { if (BeginMenu("Overworld Flags")) { Checkbox("Enable Overworld Sprites", - &mutable_flags()->overworld.kDrawOverworldSprites); + &ExperimentFlags::get().overworld.kDrawOverworldSprites); Separator(); Checkbox("Save Overworld Maps", - &mutable_flags()->overworld.kSaveOverworldMaps); + &ExperimentFlags::get().overworld.kSaveOverworldMaps); Checkbox("Save Overworld Entrances", - &mutable_flags()->overworld.kSaveOverworldEntrances); + &ExperimentFlags::get().overworld.kSaveOverworldEntrances); Checkbox("Save Overworld Exits", - &mutable_flags()->overworld.kSaveOverworldExits); + &ExperimentFlags::get().overworld.kSaveOverworldExits); Checkbox("Save Overworld Items", - &mutable_flags()->overworld.kSaveOverworldItems); + &ExperimentFlags::get().overworld.kSaveOverworldItems); Checkbox("Save Overworld Properties", - &mutable_flags()->overworld.kSaveOverworldProperties); + &ExperimentFlags::get().overworld.kSaveOverworldProperties); Checkbox("Load Custom Overworld", - &mutable_flags()->overworld.kLoadCustomOverworld); + &ExperimentFlags::get().overworld.kLoadCustomOverworld); ImGui::EndMenu(); } if (BeginMenu("Dungeon Flags")) { Checkbox("Draw Dungeon Room Graphics", - &mutable_flags()->kDrawDungeonRoomGraphics); + &ExperimentFlags::get().kDrawDungeonRoomGraphics); Separator(); - Checkbox("Save Dungeon Maps", &mutable_flags()->kSaveDungeonMaps); + Checkbox("Save Dungeon Maps", &ExperimentFlags::get().kSaveDungeonMaps); ImGui::EndMenu(); } Checkbox("Use built-in file dialog", - &mutable_flags()->kNewFileDialogWrapper); - Checkbox("Enable Console Logging", &mutable_flags()->kLogToConsole); + &ExperimentFlags::get().kNewFileDialogWrapper); + Checkbox("Enable Console Logging", &ExperimentFlags::get().kLogToConsole); Checkbox("Enable Texture Streaming", - &mutable_flags()->kLoadTexturesAsStreaming); + &ExperimentFlags::get().kLoadTexturesAsStreaming); Checkbox("Log Instructions to Debugger", - &mutable_flags()->kLogInstructions); - Checkbox("Save All Palettes", &mutable_flags()->kSaveAllPalettes); - Checkbox("Save Gfx Groups", &mutable_flags()->kSaveGfxGroups); - Checkbox("Save Graphics Sheets", &mutable_flags()->kSaveGraphicsSheet); + &ExperimentFlags::get().kLogInstructions); + Checkbox("Save All Palettes", &ExperimentFlags::get().kSaveAllPalettes); + Checkbox("Save Gfx Groups", &ExperimentFlags::get().kSaveGfxGroups); + Checkbox("Save Graphics Sheets", + &ExperimentFlags::get().kSaveGraphicsSheet); } }; diff --git a/src/app/emu/cpu/cpu.cc b/src/app/emu/cpu/cpu.cc index 665c46e0..b2aa9361 100644 --- a/src/app/emu/cpu/cpu.cc +++ b/src/app/emu/cpu/cpu.cc @@ -1803,7 +1803,7 @@ void Cpu::ExecuteInstruction(uint8_t opcode) { void Cpu::LogInstructions(uint16_t PC, uint8_t opcode, uint16_t operand, bool immediate, bool accumulator_mode) { - if (flags()->kLogInstructions) { + if (core::ExperimentFlags::get().kLogInstructions) { std::ostringstream oss; oss << "$" << std::uppercase << std::setw(2) << std::setfill('0') << static_cast(PB) << ":" << std::hex << PC << ": 0x" diff --git a/src/app/emu/cpu/cpu.h b/src/app/emu/cpu/cpu.h index bdd2e460..dded241e 100644 --- a/src/app/emu/cpu/cpu.h +++ b/src/app/emu/cpu/cpu.h @@ -34,7 +34,7 @@ class InstructionEntry { std::string instruction; // Human-readable instruction text }; -class Cpu : public core::ExperimentFlags { +class Cpu { public: explicit Cpu(Memory& mem, Clock& vclock, CpuCallbacks& callbacks) : memory(mem), clock(vclock), callbacks_(callbacks) {} diff --git a/src/app/rom.cc b/src/app/rom.cc index 402edb17..515a320c 100644 --- a/src/app/rom.cc +++ b/src/app/rom.cc @@ -314,9 +314,12 @@ absl::Status Rom::SaveToFile(bool backup, bool save_new, std::string filename) { } // Run the other save functions - if (flags()->kSaveAllPalettes) RETURN_IF_ERROR(SaveAllPalettes()); - if (flags()->kSaveGfxGroups) RETURN_IF_ERROR(SaveGroupsToRom()); - if (flags()->kSaveGraphicsSheet) RETURN_IF_ERROR(SaveAllGraphicsData()); + if (core::ExperimentFlags::get().kSaveAllPalettes) + RETURN_IF_ERROR(SaveAllPalettes()); + if (core::ExperimentFlags::get().kSaveGfxGroups) + RETURN_IF_ERROR(SaveGroupsToRom()); + if (core::ExperimentFlags::get().kSaveGraphicsSheet) + RETURN_IF_ERROR(SaveAllGraphicsData()); if (save_new) { // Create a file of the same name and append the date between the filename diff --git a/src/app/rom.h b/src/app/rom.h index c6e9f46b..ebf7850c 100644 --- a/src/app/rom.h +++ b/src/app/rom.h @@ -131,7 +131,7 @@ constexpr uint32_t kMaxGraphics = 0xC3FB5; /** * @brief The Rom class is used to load, save, and modify Rom data. */ -class Rom : public core::ExperimentFlags { +class Rom { public: /** * @brief Loads the players 4bpp graphics sheet from Rom data. diff --git a/src/app/zelda3/overworld/overworld.cc b/src/app/zelda3/overworld/overworld.cc index 6bb874bd..6a39a087 100644 --- a/src/app/zelda3/overworld/overworld.cc +++ b/src/app/zelda3/overworld/overworld.cc @@ -21,7 +21,8 @@ absl::Status Overworld::Load(Rom &rom) { AssembleMap16Tiles(); RETURN_IF_ERROR(DecompressAllMapTiles()) - const bool load_custom_overworld = flags()->overworld.kLoadCustomOverworld; + const bool load_custom_overworld = + core::ExperimentFlags::get().overworld.kLoadCustomOverworld; for (int map_index = 0; map_index < kNumOverworldMaps; ++map_index) overworld_maps_.emplace_back(map_index, rom_, load_custom_overworld); @@ -377,7 +378,7 @@ absl::Status Overworld::LoadExits() { uint16_t px = (uint16_t)((rom_data[OWExitXPlayer + (i * 2) + 1] << 8) + rom_data[OWExitXPlayer + (i * 2)]); - if (rom()->flags()->kLogToConsole) { + if (core::ExperimentFlags::get().kLogToConsole) { std::cout << "Exit: " << i << " RoomID: " << exit_room_id << " MapID: " << exit_map_id << " VRAM: " << exit_vram << " YScroll: " << exit_y_scroll @@ -1075,7 +1076,7 @@ absl::Status Overworld::CreateTile32Tilemap() { unique_tiles.size(), LimitOfMap32)); } - if (flags()->kLogToConsole) { + if (core::ExperimentFlags::get().kLogToConsole) { std::cout << "Number of unique Tiles32: " << tiles32_unique_.size() << " Saved:" << tiles32_unique_.size() << " Out of: " << LimitOfMap32 << std::endl; @@ -1528,7 +1529,7 @@ absl::Status Overworld::SaveItems() { return absl::AbortedError("Too many items"); } - if (flags()->kLogToConsole) { + if (core::ExperimentFlags::get().kLogToConsole) { std::cout << "End of Items : " << data_pos << std::endl; } diff --git a/src/app/zelda3/overworld/overworld.h b/src/app/zelda3/overworld/overworld.h index d936e927..bcb43d80 100644 --- a/src/app/zelda3/overworld/overworld.h +++ b/src/app/zelda3/overworld/overworld.h @@ -110,7 +110,7 @@ constexpr int NumberOfMap32 = Map32PerScreen * kNumOverworldMaps; * This class is responsible for loading and saving the overworld data, * as well as creating the tilesets and tilemaps for the overworld. */ -class Overworld : public SharedRom, public core::ExperimentFlags { +class Overworld : public SharedRom { public: absl::Status Load(Rom &rom); absl::Status LoadOverworldMaps();