Refactor logging system to use LOG_* macros
- Updated logging calls in main.cc, rom.cc, and test_manager.cc to utilize the new LOG_* macros for consistency and improved readability. - Removed deprecated util::logf function and replaced its usage with appropriate logging macros. - Enhanced logging in TestManager to provide more detailed information about ROM state and testing processes. - Cleaned up commented-out logf calls in room.cc to streamline the code. - Adjusted LogManager to support general logging through a new logf function for non-category specific messages.
This commit is contained in:
@@ -64,7 +64,8 @@ absl::Status CreateWindow(Window& window, int flags) {
|
|||||||
auto status = theme_manager.LoadTheme("YAZE Classic");
|
auto status = theme_manager.LoadTheme("YAZE Classic");
|
||||||
if (!status.ok()) {
|
if (!status.ok()) {
|
||||||
// Theme system failed, stick with original ColorsYaze()
|
// Theme system failed, stick with original ColorsYaze()
|
||||||
util::logf("Theme system failed, using original ColorsYaze(): %s", status.message().data());
|
LOG_WARN("Window", "Theme system failed, using original ColorsYaze(): %s",
|
||||||
|
status.message().data());
|
||||||
}
|
}
|
||||||
|
|
||||||
const int audio_frequency = 48000;
|
const int audio_frequency = 48000;
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ void EditorManager::RefreshWorkspacePresets() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
util::logf("Warning: Failed to load workspace presets: %s", e.what());
|
LOG_WARN("EditorManager", "Failed to load workspace presets: %s", e.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Safely replace the vector
|
// Safely replace the vector
|
||||||
@@ -128,7 +128,7 @@ void EditorManager::RefreshWorkspacePresets() {
|
|||||||
workspace_presets_loaded_ = true;
|
workspace_presets_loaded_ = true;
|
||||||
|
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
util::logf("Error in RefreshWorkspacePresets: %s", e.what());
|
LOG_ERROR("EditorManager", "Error in RefreshWorkspacePresets: %s", e.what());
|
||||||
// Ensure we have a valid empty vector
|
// Ensure we have a valid empty vector
|
||||||
workspace_presets_ = std::vector<std::string>();
|
workspace_presets_ = std::vector<std::string>();
|
||||||
workspace_presets_loaded_ =
|
workspace_presets_loaded_ =
|
||||||
@@ -157,7 +157,7 @@ void EditorManager::SaveWorkspacePreset(const std::string& name) {
|
|||||||
ss << n << "\n";
|
ss << n << "\n";
|
||||||
core::SaveFile("workspace_presets.txt", ss.str());
|
core::SaveFile("workspace_presets.txt", ss.str());
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
util::logf("Warning: Failed to save workspace presets: %s", e.what());
|
LOG_WARN("EditorManager", "Failed to save workspace presets: %s", e.what());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
last_workspace_preset_ = name;
|
last_workspace_preset_ = name;
|
||||||
@@ -853,9 +853,10 @@ absl::Status EditorManager::Update() {
|
|||||||
// Ensure TestManager always has the current ROM
|
// Ensure TestManager always has the current ROM
|
||||||
static Rom* last_test_rom = nullptr;
|
static Rom* last_test_rom = nullptr;
|
||||||
if (last_test_rom != current_rom_) {
|
if (last_test_rom != current_rom_) {
|
||||||
util::logf(
|
LOG_INFO("EditorManager",
|
||||||
"EditorManager::Update - ROM changed, updating TestManager: %p -> %p",
|
"EditorManager::Update - ROM changed, updating TestManager: %p -> "
|
||||||
(void*)last_test_rom, (void*)current_rom_);
|
"%p",
|
||||||
|
(void*)last_test_rom, (void*)current_rom_);
|
||||||
test::TestManager::Get().SetCurrentRom(current_rom_);
|
test::TestManager::Get().SetCurrentRom(current_rom_);
|
||||||
last_test_rom = current_rom_;
|
last_test_rom = current_rom_;
|
||||||
}
|
}
|
||||||
@@ -1733,8 +1734,8 @@ absl::Status EditorManager::LoadRom() {
|
|||||||
for (auto& session : sessions_) {
|
for (auto& session : sessions_) {
|
||||||
if (!session.rom.is_loaded()) {
|
if (!session.rom.is_loaded()) {
|
||||||
target_session = &session;
|
target_session = &session;
|
||||||
util::logf("Found empty session to populate with ROM: %s",
|
LOG_INFO("EditorManager", "Found empty session to populate with ROM: %s",
|
||||||
file_name.c_str());
|
file_name.c_str());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1761,9 +1762,9 @@ absl::Status EditorManager::LoadRom() {
|
|||||||
|
|
||||||
// Update test manager with current ROM for ROM-dependent tests (only when tests are enabled)
|
// Update test manager with current ROM for ROM-dependent tests (only when tests are enabled)
|
||||||
#ifdef YAZE_ENABLE_TESTING
|
#ifdef YAZE_ENABLE_TESTING
|
||||||
util::logf("EditorManager: Setting ROM in TestManager - %p ('%s')",
|
LOG_INFO("EditorManager", "Setting ROM in TestManager - %p ('%s')",
|
||||||
(void*)current_rom_,
|
(void*)current_rom_,
|
||||||
current_rom_ ? current_rom_->title().c_str() : "null");
|
current_rom_ ? current_rom_->title().c_str() : "null");
|
||||||
test::TestManager::Get().SetCurrentRom(current_rom_);
|
test::TestManager::Get().SetCurrentRom(current_rom_);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -1804,7 +1805,7 @@ absl::Status EditorManager::LoadAssets() {
|
|||||||
auto end_time = std::chrono::steady_clock::now();
|
auto end_time = std::chrono::steady_clock::now();
|
||||||
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
|
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
end_time - start_time);
|
end_time - start_time);
|
||||||
util::logf("ROM assets loaded in %lld ms", duration.count());
|
LOG_INFO("EditorManager", "ROM assets loaded in %lld ms", duration.count());
|
||||||
|
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
@@ -1963,9 +1964,9 @@ absl::Status EditorManager::OpenProject() {
|
|||||||
|
|
||||||
// Update test manager with current ROM for ROM-dependent tests (only when tests are enabled)
|
// Update test manager with current ROM for ROM-dependent tests (only when tests are enabled)
|
||||||
#ifdef YAZE_ENABLE_TESTING
|
#ifdef YAZE_ENABLE_TESTING
|
||||||
util::logf("EditorManager: Setting ROM in TestManager - %p ('%s')",
|
LOG_INFO("EditorManager", "Setting ROM in TestManager - %p ('%s')",
|
||||||
(void*)current_rom_,
|
(void*)current_rom_,
|
||||||
current_rom_ ? current_rom_->title().c_str() : "null");
|
current_rom_ ? current_rom_->title().c_str() : "null");
|
||||||
test::TestManager::Get().SetCurrentRom(current_rom_);
|
test::TestManager::Get().SetCurrentRom(current_rom_);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -2225,8 +2226,8 @@ void EditorManager::RemoveSession(size_t index) {
|
|||||||
sessions_[index].custom_name = "[CLOSED SESSION]";
|
sessions_[index].custom_name = "[CLOSED SESSION]";
|
||||||
sessions_[index].filepath = "";
|
sessions_[index].filepath = "";
|
||||||
|
|
||||||
util::logf("Marked session as closed: %s (index %zu)", session_name.c_str(),
|
LOG_INFO("EditorManager", "Marked session as closed: %s (index %zu)",
|
||||||
index);
|
session_name.c_str(), index);
|
||||||
toast_manager_.Show(
|
toast_manager_.Show(
|
||||||
absl::StrFormat("Session marked as closed: %s", session_name),
|
absl::StrFormat("Session marked as closed: %s", session_name),
|
||||||
editor::ToastType::kInfo);
|
editor::ToastType::kInfo);
|
||||||
|
|||||||
@@ -180,6 +180,9 @@ void OverworldEditor::Initialize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
absl::Status OverworldEditor::Load() {
|
absl::Status OverworldEditor::Load() {
|
||||||
|
gfx::ScopedTimer timer("OverworldEditor::Load");
|
||||||
|
|
||||||
|
LOG_INFO("OverworldEditor", "Loading overworld.");
|
||||||
if (!rom_ || !rom_->is_loaded()) {
|
if (!rom_ || !rom_->is_loaded()) {
|
||||||
return absl::FailedPreconditionError("ROM not loaded");
|
return absl::FailedPreconditionError("ROM not loaded");
|
||||||
}
|
}
|
||||||
@@ -201,7 +204,7 @@ absl::Status OverworldEditor::Load() {
|
|||||||
// Force refresh of the current overworld map to show changes
|
// Force refresh of the current overworld map to show changes
|
||||||
RefreshOverworldMap();
|
RefreshOverworldMap();
|
||||||
|
|
||||||
util::logf("Overworld editor refreshed after Tile16 changes");
|
LOG_INFO("OverworldEditor", "Overworld editor refreshed after Tile16 changes");
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -471,8 +474,8 @@ void OverworldEditor::DrawOverworldMapSettings() {
|
|||||||
auto asm_status = ApplyZSCustomOverworldASM(3);
|
auto asm_status = ApplyZSCustomOverworldASM(3);
|
||||||
if (!asm_status.ok()) {
|
if (!asm_status.ok()) {
|
||||||
// Show error but still set version marker
|
// Show error but still set version marker
|
||||||
util::logf("Failed to apply ZSCustomOverworld ASM: %s",
|
LOG_ERROR("OverworldEditor", "Failed to apply ZSCustomOverworld ASM: %s",
|
||||||
asm_status.ToString().c_str());
|
asm_status.ToString().c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -843,11 +846,11 @@ void OverworldEditor::DrawOverworldEdits() {
|
|||||||
// Validate tile16_blockset_ before calling GetTilemapData
|
// Validate tile16_blockset_ before calling GetTilemapData
|
||||||
if (!tile16_blockset_.atlas.is_active() ||
|
if (!tile16_blockset_.atlas.is_active() ||
|
||||||
tile16_blockset_.atlas.vector().empty()) {
|
tile16_blockset_.atlas.vector().empty()) {
|
||||||
util::logf(
|
LOG_ERROR("OverworldEditor",
|
||||||
"Error: tile16_blockset_ is not properly initialized (active: %s, "
|
"Error: tile16_blockset_ is not properly initialized (active: %s, "
|
||||||
"size: %zu)",
|
"size: %zu)",
|
||||||
tile16_blockset_.atlas.is_active() ? "true" : "false",
|
tile16_blockset_.atlas.is_active() ? "true" : "false",
|
||||||
tile16_blockset_.atlas.vector().size());
|
tile16_blockset_.atlas.vector().size());
|
||||||
return; // Skip drawing if blockset is invalid
|
return; // Skip drawing if blockset is invalid
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -881,10 +884,10 @@ void OverworldEditor::RenderUpdatedMapBitmap(
|
|||||||
|
|
||||||
// Bounds checking to prevent crashes
|
// Bounds checking to prevent crashes
|
||||||
if (current_map_ < 0 || current_map_ >= static_cast<int>(maps_bmp_.size())) {
|
if (current_map_ < 0 || current_map_ >= static_cast<int>(maps_bmp_.size())) {
|
||||||
util::logf(
|
LOG_ERROR("OverworldEditor",
|
||||||
"ERROR: RenderUpdatedMapBitmap - Invalid current_map_ %d "
|
"ERROR: RenderUpdatedMapBitmap - Invalid current_map_ %d "
|
||||||
"(maps_bmp_.size()=%zu)",
|
"(maps_bmp_.size()=%zu)",
|
||||||
current_map_, maps_bmp_.size());
|
current_map_, maps_bmp_.size());
|
||||||
return; // Invalid map index, skip rendering
|
return; // Invalid map index, skip rendering
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -904,11 +907,11 @@ void OverworldEditor::RenderUpdatedMapBitmap(
|
|||||||
|
|
||||||
// Validate bitmap state before writing
|
// Validate bitmap state before writing
|
||||||
if (!current_bitmap.is_active() || current_bitmap.size() == 0) {
|
if (!current_bitmap.is_active() || current_bitmap.size() == 0) {
|
||||||
util::logf(
|
LOG_ERROR("OverworldEditor",
|
||||||
"ERROR: RenderUpdatedMapBitmap - Bitmap %d is not active or has no "
|
"ERROR: RenderUpdatedMapBitmap - Bitmap %d is not active or has no "
|
||||||
"data (active=%s, size=%zu)",
|
"data (active=%s, size=%zu)",
|
||||||
current_map_, current_bitmap.is_active() ? "true" : "false",
|
current_map_, current_bitmap.is_active() ? "true" : "false",
|
||||||
current_bitmap.size());
|
current_bitmap.size());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -920,10 +923,10 @@ void OverworldEditor::RenderUpdatedMapBitmap(
|
|||||||
// Bounds check for pixel index
|
// Bounds check for pixel index
|
||||||
if (pixel_index < 0 ||
|
if (pixel_index < 0 ||
|
||||||
pixel_index >= static_cast<int>(current_bitmap.size())) {
|
pixel_index >= static_cast<int>(current_bitmap.size())) {
|
||||||
util::logf(
|
LOG_ERROR("OverworldEditor",
|
||||||
"ERROR: RenderUpdatedMapBitmap - pixel_index %d out of bounds "
|
"ERROR: RenderUpdatedMapBitmap - pixel_index %d out of bounds "
|
||||||
"(bitmap size=%zu)",
|
"(bitmap size=%zu)",
|
||||||
pixel_index, current_bitmap.size());
|
pixel_index, current_bitmap.size());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -931,10 +934,10 @@ void OverworldEditor::RenderUpdatedMapBitmap(
|
|||||||
int tile_data_index = y * kTile16Size + x;
|
int tile_data_index = y * kTile16Size + x;
|
||||||
if (tile_data_index < 0 ||
|
if (tile_data_index < 0 ||
|
||||||
tile_data_index >= static_cast<int>(tile_data.size())) {
|
tile_data_index >= static_cast<int>(tile_data.size())) {
|
||||||
util::logf(
|
LOG_ERROR("OverworldEditor",
|
||||||
"ERROR: RenderUpdatedMapBitmap - tile_data_index %d out of bounds "
|
"ERROR: RenderUpdatedMapBitmap - tile_data_index %d out of bounds "
|
||||||
"(tile_data size=%zu)",
|
"(tile_data size=%zu)",
|
||||||
tile_data_index, tile_data.size());
|
tile_data_index, tile_data.size());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -949,6 +952,9 @@ void OverworldEditor::RenderUpdatedMapBitmap(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void OverworldEditor::CheckForOverworldEdits() {
|
void OverworldEditor::CheckForOverworldEdits() {
|
||||||
|
LOG_DEBUG("OverworldEditor", "CheckForOverworldEdits: Frame %d",
|
||||||
|
ImGui::GetFrameCount());
|
||||||
|
|
||||||
CheckForSelectRectangle();
|
CheckForSelectRectangle();
|
||||||
|
|
||||||
// User has selected a tile they want to draw from the blockset
|
// User has selected a tile they want to draw from the blockset
|
||||||
@@ -962,7 +968,7 @@ void OverworldEditor::CheckForOverworldEdits() {
|
|||||||
if (ow_map_canvas_.select_rect_active()) {
|
if (ow_map_canvas_.select_rect_active()) {
|
||||||
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left) ||
|
if (ImGui::IsMouseClicked(ImGuiMouseButton_Left) ||
|
||||||
ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
|
ImGui::IsMouseDragging(ImGuiMouseButton_Left)) {
|
||||||
util::logf("CheckForOverworldEdits: About to apply rectangle selection");
|
LOG_DEBUG("OverworldEditor", "CheckForOverworldEdits: About to apply rectangle selection");
|
||||||
|
|
||||||
auto& selected_world =
|
auto& selected_world =
|
||||||
(current_world_ == 0) ? overworld_.mutable_map_tiles()->light_world
|
(current_world_ == 0) ? overworld_.mutable_map_tiles()->light_world
|
||||||
@@ -988,10 +994,10 @@ void OverworldEditor::CheckForOverworldEdits() {
|
|||||||
// Number of tiles per local map (since each tile is 16x16)
|
// Number of tiles per local map (since each tile is 16x16)
|
||||||
constexpr int tiles_per_local_map = local_map_size / kTile16Size;
|
constexpr int tiles_per_local_map = local_map_size / kTile16Size;
|
||||||
|
|
||||||
util::logf(
|
LOG_DEBUG("OverworldEditor",
|
||||||
"CheckForOverworldEdits: About to fill rectangle with "
|
"CheckForOverworldEdits: About to fill rectangle with "
|
||||||
"current_tile16_=%d",
|
"current_tile16_=%d",
|
||||||
current_tile16_);
|
current_tile16_);
|
||||||
|
|
||||||
// Apply the selected tiles to each position in the rectangle
|
// Apply the selected tiles to each position in the rectangle
|
||||||
// CRITICAL FIX: Use pre-computed tile16_ids_ instead of recalculating from selected_tiles_
|
// CRITICAL FIX: Use pre-computed tile16_ids_ instead of recalculating from selected_tiles_
|
||||||
@@ -1038,12 +1044,12 @@ void OverworldEditor::CheckForOverworldEdits() {
|
|||||||
auto tile_data = gfx::GetTilemapData(tile16_blockset_, tile16_id);
|
auto tile_data = gfx::GetTilemapData(tile16_blockset_, tile16_id);
|
||||||
if (!tile_data.empty()) {
|
if (!tile_data.empty()) {
|
||||||
RenderUpdatedMapBitmap(tile_position, tile_data);
|
RenderUpdatedMapBitmap(tile_position, tile_data);
|
||||||
util::logf(
|
LOG_INFO("OverworldEditor",
|
||||||
"CheckForOverworldEdits: Updated bitmap at position (%d,%d) "
|
"CheckForOverworldEdits: Updated bitmap at position (%d,%d) "
|
||||||
"with tile16_id=%d",
|
"with tile16_id=%d",
|
||||||
x, y, tile16_id);
|
x, y, tile16_id);
|
||||||
} else {
|
} else {
|
||||||
util::logf("ERROR: Failed to get tile data for tile16_id=%d",
|
LOG_ERROR("OverworldEditor", "ERROR: Failed to get tile data for tile16_id=%d",
|
||||||
tile16_id);
|
tile16_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1055,8 +1061,8 @@ void OverworldEditor::CheckForOverworldEdits() {
|
|||||||
// This is commented out for now, will come back to later.
|
// This is commented out for now, will come back to later.
|
||||||
// ow_map_canvas_.mutable_selected_tiles()->clear();
|
// ow_map_canvas_.mutable_selected_tiles()->clear();
|
||||||
// ow_map_canvas_.mutable_points()->clear();
|
// ow_map_canvas_.mutable_points()->clear();
|
||||||
util::logf(
|
LOG_INFO("OverworldEditor",
|
||||||
"CheckForOverworldEdits: Rectangle selection applied and cleared");
|
"CheckForOverworldEdits: Rectangle selection applied and cleared");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1821,7 +1827,7 @@ absl::Status OverworldEditor::Save() {
|
|||||||
absl::Status OverworldEditor::LoadGraphics() {
|
absl::Status OverworldEditor::LoadGraphics() {
|
||||||
gfx::ScopedTimer timer("LoadGraphics");
|
gfx::ScopedTimer timer("LoadGraphics");
|
||||||
|
|
||||||
util::logf("Loading overworld.");
|
LOG_INFO("OverworldEditor", "Loading overworld.");
|
||||||
// Load the Link to the Past overworld.
|
// Load the Link to the Past overworld.
|
||||||
{
|
{
|
||||||
gfx::ScopedTimer load_timer("Overworld::Load");
|
gfx::ScopedTimer load_timer("Overworld::Load");
|
||||||
@@ -1829,7 +1835,7 @@ absl::Status OverworldEditor::LoadGraphics() {
|
|||||||
}
|
}
|
||||||
palette_ = overworld_.current_area_palette();
|
palette_ = overworld_.current_area_palette();
|
||||||
|
|
||||||
util::logf("Loading overworld graphics (optimized).");
|
LOG_INFO("OverworldEditor", "Loading overworld graphics (optimized).");
|
||||||
|
|
||||||
// Phase 1: Create bitmaps without textures for faster loading
|
// Phase 1: Create bitmaps without textures for faster loading
|
||||||
// This avoids blocking the main thread with GPU texture creation
|
// This avoids blocking the main thread with GPU texture creation
|
||||||
@@ -1840,7 +1846,7 @@ absl::Status OverworldEditor::LoadGraphics() {
|
|||||||
current_gfx_bmp_, palette_);
|
current_gfx_bmp_, palette_);
|
||||||
}
|
}
|
||||||
|
|
||||||
util::logf("Loading overworld tileset (deferred textures).");
|
LOG_INFO("OverworldEditor", "Loading overworld tileset (deferred textures).");
|
||||||
{
|
{
|
||||||
gfx::ScopedTimer tileset_timer("CreateBitmapWithoutTexture_Tileset");
|
gfx::ScopedTimer tileset_timer("CreateBitmapWithoutTexture_Tileset");
|
||||||
Renderer::Get().CreateBitmapWithoutTexture(
|
Renderer::Get().CreateBitmapWithoutTexture(
|
||||||
@@ -1851,7 +1857,7 @@ absl::Status OverworldEditor::LoadGraphics() {
|
|||||||
|
|
||||||
// Copy the tile16 data into individual tiles.
|
// Copy the tile16 data into individual tiles.
|
||||||
auto tile16_blockset_data = overworld_.tile16_blockset_data();
|
auto tile16_blockset_data = overworld_.tile16_blockset_data();
|
||||||
util::logf("Loading overworld tile16 graphics.");
|
LOG_INFO("OverworldEditor", "Loading overworld tile16 graphics.");
|
||||||
|
|
||||||
{
|
{
|
||||||
gfx::ScopedTimer tilemap_timer("CreateTilemap");
|
gfx::ScopedTimer tilemap_timer("CreateTilemap");
|
||||||
@@ -1869,9 +1875,9 @@ absl::Status OverworldEditor::LoadGraphics() {
|
|||||||
constexpr int kSpecialWorldEssential =
|
constexpr int kSpecialWorldEssential =
|
||||||
zelda3::kSpecialWorldMapIdStart + kEssentialMapsPerWorld;
|
zelda3::kSpecialWorldMapIdStart + kEssentialMapsPerWorld;
|
||||||
|
|
||||||
util::logf(
|
LOG_INFO("OverworldEditor",
|
||||||
"Creating bitmaps for essential maps only (first %d maps per world)",
|
"Creating bitmaps for essential maps only (first %d maps per world)",
|
||||||
kEssentialMapsPerWorld);
|
kEssentialMapsPerWorld);
|
||||||
|
|
||||||
std::vector<gfx::Bitmap*> maps_to_texture;
|
std::vector<gfx::Bitmap*> maps_to_texture;
|
||||||
maps_to_texture.reserve(kEssentialMapsPerWorld *
|
maps_to_texture.reserve(kEssentialMapsPerWorld *
|
||||||
@@ -2040,7 +2046,8 @@ void OverworldEditor::EnsureMapTexture(int map_index) {
|
|||||||
// Ensure the map is built first (on-demand loading)
|
// Ensure the map is built first (on-demand loading)
|
||||||
auto status = overworld_.EnsureMapBuilt(map_index);
|
auto status = overworld_.EnsureMapBuilt(map_index);
|
||||||
if (!status.ok()) {
|
if (!status.ok()) {
|
||||||
util::logf("Failed to build map %d: %s", map_index, status.message());
|
LOG_ERROR("OverworldEditor", "Failed to build map %d: %s", map_index,
|
||||||
|
status.message());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2055,7 +2062,8 @@ void OverworldEditor::EnsureMapTexture(int map_index) {
|
|||||||
overworld_.current_map_bitmap_data());
|
overworld_.current_map_bitmap_data());
|
||||||
bitmap.SetPalette(palette);
|
bitmap.SetPalette(palette);
|
||||||
} catch (const std::bad_alloc& e) {
|
} catch (const std::bad_alloc& e) {
|
||||||
util::logf("Error allocating bitmap for map %d: %s", map_index, e.what());
|
LOG_ERROR("OverworldEditor", "Error allocating bitmap for map %d: %s",
|
||||||
|
map_index, e.what());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2137,8 +2145,8 @@ void OverworldEditor::RefreshChildMapOnDemand(int map_index) {
|
|||||||
// Rebuild tileset only if graphics changed
|
// Rebuild tileset only if graphics changed
|
||||||
auto status = map->BuildTileset();
|
auto status = map->BuildTileset();
|
||||||
if (!status.ok()) {
|
if (!status.ok()) {
|
||||||
util::logf("Failed to build tileset for map %d: %s", map_index,
|
LOG_ERROR("OverworldEditor", "Failed to build tileset for map %d: %s",
|
||||||
status.message().data());
|
map_index, status.message().data());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2146,16 +2154,16 @@ void OverworldEditor::RefreshChildMapOnDemand(int map_index) {
|
|||||||
status = map->BuildTiles16Gfx(*overworld_.mutable_tiles16(),
|
status = map->BuildTiles16Gfx(*overworld_.mutable_tiles16(),
|
||||||
overworld_.tiles16().size());
|
overworld_.tiles16().size());
|
||||||
if (!status.ok()) {
|
if (!status.ok()) {
|
||||||
util::logf("Failed to build tiles16 graphics for map %d: %s", map_index,
|
LOG_ERROR("OverworldEditor", "Failed to build tiles16 graphics for map %d: %s",
|
||||||
status.message().data());
|
map_index, status.message().data());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rebuild bitmap
|
// Rebuild bitmap
|
||||||
status = map->BuildBitmap(overworld_.GetMapTiles(current_world_));
|
status = map->BuildBitmap(overworld_.GetMapTiles(current_world_));
|
||||||
if (!status.ok()) {
|
if (!status.ok()) {
|
||||||
util::logf("Failed to build bitmap for map %d: %s", map_index,
|
LOG_ERROR("OverworldEditor", "Failed to build bitmap for map %d: %s",
|
||||||
status.message().data());
|
map_index, status.message().data());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2165,8 +2173,8 @@ void OverworldEditor::RefreshChildMapOnDemand(int map_index) {
|
|||||||
|
|
||||||
// Validate surface synchronization to help debug crashes
|
// Validate surface synchronization to help debug crashes
|
||||||
if (!maps_bmp_[map_index].ValidateDataSurfaceSync()) {
|
if (!maps_bmp_[map_index].ValidateDataSurfaceSync()) {
|
||||||
util::logf("Warning: Surface synchronization issue detected for map %d",
|
LOG_WARN("OverworldEditor", "Warning: Surface synchronization issue detected for map %d",
|
||||||
map_index);
|
map_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update texture on main thread
|
// Update texture on main thread
|
||||||
@@ -2216,12 +2224,12 @@ void OverworldEditor::RefreshMultiAreaMapsSafely(int map_index,
|
|||||||
return; // No siblings to coordinate
|
return; // No siblings to coordinate
|
||||||
}
|
}
|
||||||
|
|
||||||
util::logf(
|
LOG_DEBUG("OverworldEditor",
|
||||||
"RefreshMultiAreaMapsSafely: Processing %s area map %d (parent: %d)",
|
"RefreshMultiAreaMapsSafely: Processing %s area map %d (parent: %d)",
|
||||||
(area_size == AreaSizeEnum::LargeArea) ? "large"
|
(area_size == AreaSizeEnum::LargeArea) ? "large"
|
||||||
: (area_size == AreaSizeEnum::WideArea) ? "wide"
|
: (area_size == AreaSizeEnum::WideArea) ? "wide"
|
||||||
: "tall",
|
: "tall",
|
||||||
map_index, map->parent());
|
map_index, map->parent());
|
||||||
|
|
||||||
// Determine all maps that are part of this multi-area structure
|
// Determine all maps that are part of this multi-area structure
|
||||||
std::vector<int> sibling_maps;
|
std::vector<int> sibling_maps;
|
||||||
@@ -2234,9 +2242,9 @@ void OverworldEditor::RefreshMultiAreaMapsSafely(int map_index,
|
|||||||
// Parent is top-left (quadrant 0), siblings are:
|
// Parent is top-left (quadrant 0), siblings are:
|
||||||
// +1 (top-right, quadrant 1), +8 (bottom-left, quadrant 2), +9 (bottom-right, quadrant 3)
|
// +1 (top-right, quadrant 1), +8 (bottom-left, quadrant 2), +9 (bottom-right, quadrant 3)
|
||||||
sibling_maps = {parent_id, parent_id + 1, parent_id + 8, parent_id + 9};
|
sibling_maps = {parent_id, parent_id + 1, parent_id + 8, parent_id + 9};
|
||||||
util::logf(
|
LOG_DEBUG("OverworldEditor",
|
||||||
"RefreshMultiAreaMapsSafely: Large area siblings: %d, %d, %d, %d",
|
"RefreshMultiAreaMapsSafely: Large area siblings: %d, %d, %d, %d",
|
||||||
parent_id, parent_id + 1, parent_id + 8, parent_id + 9);
|
parent_id, parent_id + 1, parent_id + 8, parent_id + 9);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2244,8 +2252,9 @@ void OverworldEditor::RefreshMultiAreaMapsSafely(int map_index,
|
|||||||
// Wide Area: 2x1 grid (2 maps total, horizontally adjacent)
|
// Wide Area: 2x1 grid (2 maps total, horizontally adjacent)
|
||||||
// Parent is left, sibling is +1 (right)
|
// Parent is left, sibling is +1 (right)
|
||||||
sibling_maps = {parent_id, parent_id + 1};
|
sibling_maps = {parent_id, parent_id + 1};
|
||||||
util::logf("RefreshMultiAreaMapsSafely: Wide area siblings: %d, %d",
|
LOG_DEBUG("OverworldEditor",
|
||||||
parent_id, parent_id + 1);
|
"RefreshMultiAreaMapsSafely: Wide area siblings: %d, %d",
|
||||||
|
parent_id, parent_id + 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2253,14 +2262,16 @@ void OverworldEditor::RefreshMultiAreaMapsSafely(int map_index,
|
|||||||
// Tall Area: 1x2 grid (2 maps total, vertically adjacent)
|
// Tall Area: 1x2 grid (2 maps total, vertically adjacent)
|
||||||
// Parent is top, sibling is +8 (bottom)
|
// Parent is top, sibling is +8 (bottom)
|
||||||
sibling_maps = {parent_id, parent_id + 8};
|
sibling_maps = {parent_id, parent_id + 8};
|
||||||
util::logf("RefreshMultiAreaMapsSafely: Tall area siblings: %d, %d",
|
LOG_DEBUG("OverworldEditor",
|
||||||
parent_id, parent_id + 8);
|
"RefreshMultiAreaMapsSafely: Tall area siblings: %d, %d",
|
||||||
|
parent_id, parent_id + 8);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
util::logf("RefreshMultiAreaMapsSafely: Unknown area size %d for map %d",
|
LOG_WARN("OverworldEditor",
|
||||||
static_cast<int>(area_size), map_index);
|
"RefreshMultiAreaMapsSafely: Unknown area size %d for map %d",
|
||||||
|
static_cast<int>(area_size), map_index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2286,13 +2297,13 @@ void OverworldEditor::RefreshMultiAreaMapsSafely(int map_index,
|
|||||||
bool needs_refresh = maps_bmp_[sibling].modified();
|
bool needs_refresh = maps_bmp_[sibling].modified();
|
||||||
|
|
||||||
if ((is_current_map || is_current_world) && needs_refresh) {
|
if ((is_current_map || is_current_world) && needs_refresh) {
|
||||||
util::logf(
|
LOG_DEBUG("OverworldEditor",
|
||||||
"RefreshMultiAreaMapsSafely: Refreshing %s area sibling map %d "
|
"RefreshMultiAreaMapsSafely: Refreshing %s area sibling map %d "
|
||||||
"(parent: %d)",
|
"(parent: %d)",
|
||||||
(area_size == AreaSizeEnum::LargeArea) ? "large"
|
(area_size == AreaSizeEnum::LargeArea) ? "large"
|
||||||
: (area_size == AreaSizeEnum::WideArea) ? "wide"
|
: (area_size == AreaSizeEnum::WideArea) ? "wide"
|
||||||
: "tall",
|
: "tall",
|
||||||
sibling, parent_id);
|
sibling, parent_id);
|
||||||
|
|
||||||
// Direct refresh without calling RefreshChildMapOnDemand to avoid recursion
|
// Direct refresh without calling RefreshChildMapOnDemand to avoid recursion
|
||||||
auto* sibling_map = overworld_.mutable_overworld_map(sibling);
|
auto* sibling_map = overworld_.mutable_overworld_map(sibling);
|
||||||
@@ -2327,10 +2338,10 @@ void OverworldEditor::RefreshMultiAreaMapsSafely(int map_index,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!status.ok()) {
|
if (!status.ok()) {
|
||||||
util::logf(
|
LOG_ERROR("OverworldEditor",
|
||||||
"RefreshMultiAreaMapsSafely: Failed to refresh sibling map %d: "
|
"RefreshMultiAreaMapsSafely: Failed to refresh sibling map %d: "
|
||||||
"%s",
|
"%s",
|
||||||
sibling, status.message().data());
|
sibling, status.message().data());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (!is_current_map && !is_current_world) {
|
} else if (!is_current_map && !is_current_world) {
|
||||||
@@ -2487,6 +2498,7 @@ void OverworldEditor::RefreshMapProperties() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
absl::Status OverworldEditor::RefreshTile16Blockset() {
|
absl::Status OverworldEditor::RefreshTile16Blockset() {
|
||||||
|
LOG_DEBUG("OverworldEditor", "RefreshTile16Blockset called");
|
||||||
if (current_blockset_ ==
|
if (current_blockset_ ==
|
||||||
overworld_.overworld_map(current_map_)->area_graphics()) {
|
overworld_.overworld_map(current_map_)->area_graphics()) {
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
@@ -3261,8 +3273,8 @@ void OverworldEditor::SetupOverworldCanvasContextMenu() {
|
|||||||
RefreshOverworldMap();
|
RefreshOverworldMap();
|
||||||
auto status = RefreshTile16Blockset();
|
auto status = RefreshTile16Blockset();
|
||||||
if (!status.ok()) {
|
if (!status.ok()) {
|
||||||
util::logf("Failed to refresh tile16 blockset: %s",
|
LOG_ERROR("OverworldEditor", "Failed to refresh tile16 blockset: %s",
|
||||||
status.message().data());
|
status.message().data());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
ow_map_canvas_.AddContextMenuItem(refresh_map_item);
|
ow_map_canvas_.AddContextMenuItem(refresh_map_item);
|
||||||
@@ -3581,7 +3593,8 @@ absl::Status OverworldEditor::ApplyZSCustomOverworldASM(int target_version) {
|
|||||||
"ROM is already version %d or higher", current_version));
|
"ROM is already version %d or higher", current_version));
|
||||||
}
|
}
|
||||||
|
|
||||||
util::logf("Applying ZSCustomOverworld ASM v%d to ROM...", target_version);
|
LOG_INFO("OverworldEditor", "Applying ZSCustomOverworld ASM v%d to ROM...",
|
||||||
|
target_version);
|
||||||
|
|
||||||
// Initialize Asar wrapper
|
// Initialize Asar wrapper
|
||||||
auto asar_wrapper = std::make_unique<core::AsarWrapper>();
|
auto asar_wrapper = std::make_unique<core::AsarWrapper>();
|
||||||
@@ -3636,25 +3649,26 @@ absl::Status OverworldEditor::ApplyZSCustomOverworldASM(int target_version) {
|
|||||||
RETURN_IF_ERROR(UpdateROMVersionMarkers(target_version));
|
RETURN_IF_ERROR(UpdateROMVersionMarkers(target_version));
|
||||||
|
|
||||||
// Log symbols found during patching
|
// Log symbols found during patching
|
||||||
util::logf("ASM patch applied successfully. Found %zu symbols:",
|
LOG_INFO("OverworldEditor", "ASM patch applied successfully. Found %zu symbols:",
|
||||||
result.symbols.size());
|
result.symbols.size());
|
||||||
for (const auto& symbol : result.symbols) {
|
for (const auto& symbol : result.symbols) {
|
||||||
util::logf(" %s @ $%06X", symbol.name.c_str(), symbol.address);
|
LOG_INFO("OverworldEditor", " %s @ $%06X", symbol.name.c_str(),
|
||||||
|
symbol.address);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Refresh overworld data to reflect changes
|
// Refresh overworld data to reflect changes
|
||||||
RETURN_IF_ERROR(overworld_.Load(rom_));
|
RETURN_IF_ERROR(overworld_.Load(rom_));
|
||||||
|
|
||||||
util::logf("ZSCustomOverworld v%d successfully applied to ROM",
|
LOG_INFO("OverworldEditor", "ZSCustomOverworld v%d successfully applied to ROM",
|
||||||
target_version);
|
target_version);
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
|
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
// Restore original ROM data on any exception
|
// Restore original ROM data on any exception
|
||||||
auto restore_result = rom_->LoadFromData(original_rom_data, false);
|
auto restore_result = rom_->LoadFromData(original_rom_data, false);
|
||||||
if (!restore_result.ok()) {
|
if (!restore_result.ok()) {
|
||||||
util::logf("Failed to restore ROM data: %s",
|
LOG_ERROR("OverworldEditor", "Failed to restore ROM data: %s",
|
||||||
restore_result.message().data());
|
restore_result.message().data());
|
||||||
}
|
}
|
||||||
return absl::InternalError(
|
return absl::InternalError(
|
||||||
absl::StrFormat("Exception during ASM application: %s", e.what()));
|
absl::StrFormat("Exception during ASM application: %s", e.what()));
|
||||||
@@ -3672,7 +3686,7 @@ absl::Status OverworldEditor::UpdateROMVersionMarkers(int target_version) {
|
|||||||
(*rom_)[zelda3::OverworldCustomAreaSpecificBGEnabled] = 0x01;
|
(*rom_)[zelda3::OverworldCustomAreaSpecificBGEnabled] = 0x01;
|
||||||
(*rom_)[zelda3::OverworldCustomMainPaletteEnabled] = 0x01;
|
(*rom_)[zelda3::OverworldCustomMainPaletteEnabled] = 0x01;
|
||||||
|
|
||||||
util::logf("Enabled v2+ features: Custom BG colors, Main palettes");
|
LOG_INFO("OverworldEditor", "Enabled v2+ features: Custom BG colors, Main palettes");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (target_version >= 3) {
|
if (target_version >= 3) {
|
||||||
@@ -3682,9 +3696,9 @@ absl::Status OverworldEditor::UpdateROMVersionMarkers(int target_version) {
|
|||||||
(*rom_)[zelda3::OverworldCustomTileGFXGroupEnabled] = 0x01;
|
(*rom_)[zelda3::OverworldCustomTileGFXGroupEnabled] = 0x01;
|
||||||
(*rom_)[zelda3::OverworldCustomMosaicEnabled] = 0x01;
|
(*rom_)[zelda3::OverworldCustomMosaicEnabled] = 0x01;
|
||||||
|
|
||||||
util::logf(
|
LOG_INFO("OverworldEditor",
|
||||||
"Enabled v3+ features: Subscreen overlays, Animated GFX, Tile GFX "
|
"Enabled v3+ features: Subscreen overlays, Animated GFX, Tile GFX "
|
||||||
"groups, Mosaic");
|
"groups, Mosaic");
|
||||||
|
|
||||||
// Initialize area size data for v3 (set all areas to small by default)
|
// Initialize area size data for v3 (set all areas to small by default)
|
||||||
for (int i = 0; i < 0xA0; i++) {
|
for (int i = 0; i < 0xA0; i++) {
|
||||||
@@ -3706,10 +3720,11 @@ absl::Status OverworldEditor::UpdateROMVersionMarkers(int target_version) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
util::logf("Initialized area size data for %zu areas", large_areas.size());
|
LOG_INFO("OverworldEditor", "Initialized area size data for %zu areas",
|
||||||
|
large_areas.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
util::logf("ROM version markers updated to v%d", target_version);
|
LOG_INFO("OverworldEditor", "ROM version markers updated to v%d", target_version);
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,15 +54,17 @@ int main(int argc, char **argv) {
|
|||||||
yaze::util::FlagParser parser(yaze::util::global_flag_registry());
|
yaze::util::FlagParser parser(yaze::util::global_flag_registry());
|
||||||
RETURN_IF_EXCEPTION(parser.Parse(argc, argv));
|
RETURN_IF_EXCEPTION(parser.Parse(argc, argv));
|
||||||
|
|
||||||
// Set up logging and debug flags (using custom flag system)
|
// Set up logging
|
||||||
if (!FLAGS_log_file->Get().empty()) {
|
yaze::util::LogLevel log_level = FLAGS_debug->Get()
|
||||||
yaze::util::SetLogFile(FLAGS_log_file->Get());
|
? yaze::util::LogLevel::YAZE_DEBUG
|
||||||
}
|
: yaze::util::LogLevel::INFO;
|
||||||
|
yaze::util::LogManager::instance().configure(log_level, FLAGS_log_file->Get(),
|
||||||
// Enable debugging if requested
|
{});
|
||||||
|
|
||||||
|
// Enable console logging via feature flag if debug is enabled.
|
||||||
if (FLAGS_debug->Get()) {
|
if (FLAGS_debug->Get()) {
|
||||||
yaze::core::FeatureFlags::get().kLogToConsole = true;
|
yaze::core::FeatureFlags::get().kLogToConsole = true;
|
||||||
yaze::util::logf("🚀 YAZE started in debug mode");
|
LOG_INFO("Main", "🚀 YAZE started in debug mode");
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string rom_filename = "";
|
std::string rom_filename = "";
|
||||||
|
|||||||
@@ -674,7 +674,7 @@ absl::Status Rom::WriteByte(int addr, uint8_t value) {
|
|||||||
value, addr));
|
value, addr));
|
||||||
}
|
}
|
||||||
rom_data_[addr] = value;
|
rom_data_[addr] = value;
|
||||||
util::logf("WriteByte: %#06X: %s", addr, util::HexByte(value).data());
|
LOG_DEBUG("Rom", "WriteByte: %#06X: %s", addr, util::HexByte(value).data());
|
||||||
dirty_ = true;
|
dirty_ = true;
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
@@ -687,7 +687,7 @@ absl::Status Rom::WriteWord(int addr, uint16_t value) {
|
|||||||
}
|
}
|
||||||
rom_data_[addr] = (uint8_t)(value & 0xFF);
|
rom_data_[addr] = (uint8_t)(value & 0xFF);
|
||||||
rom_data_[addr + 1] = (uint8_t)((value >> 8) & 0xFF);
|
rom_data_[addr + 1] = (uint8_t)((value >> 8) & 0xFF);
|
||||||
util::logf("WriteWord: %#06X: %s", addr, util::HexWord(value).data());
|
LOG_DEBUG("Rom", "WriteWord: %#06X: %s", addr, util::HexWord(value).data());
|
||||||
dirty_ = true;
|
dirty_ = true;
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
@@ -700,7 +700,7 @@ absl::Status Rom::WriteShort(int addr, uint16_t value) {
|
|||||||
}
|
}
|
||||||
rom_data_[addr] = (uint8_t)(value & 0xFF);
|
rom_data_[addr] = (uint8_t)(value & 0xFF);
|
||||||
rom_data_[addr + 1] = (uint8_t)((value >> 8) & 0xFF);
|
rom_data_[addr + 1] = (uint8_t)((value >> 8) & 0xFF);
|
||||||
util::logf("WriteShort: %#06X: %s", addr, util::HexWord(value).data());
|
LOG_DEBUG("Rom", "WriteShort: %#06X: %s", addr, util::HexWord(value).data());
|
||||||
dirty_ = true;
|
dirty_ = true;
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
@@ -714,7 +714,7 @@ absl::Status Rom::WriteLong(uint32_t addr, uint32_t value) {
|
|||||||
rom_data_[addr] = (uint8_t)(value & 0xFF);
|
rom_data_[addr] = (uint8_t)(value & 0xFF);
|
||||||
rom_data_[addr + 1] = (uint8_t)((value >> 8) & 0xFF);
|
rom_data_[addr + 1] = (uint8_t)((value >> 8) & 0xFF);
|
||||||
rom_data_[addr + 2] = (uint8_t)((value >> 16) & 0xFF);
|
rom_data_[addr + 2] = (uint8_t)((value >> 16) & 0xFF);
|
||||||
util::logf("WriteLong: %#06X: %s", addr, util::HexLong(value).data());
|
LOG_DEBUG("Rom", "WriteLong: %#06X: %s", addr, util::HexLong(value).data());
|
||||||
dirty_ = true;
|
dirty_ = true;
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
@@ -728,7 +728,8 @@ absl::Status Rom::WriteVector(int addr, std::vector<uint8_t> data) {
|
|||||||
for (int i = 0; i < static_cast<int>(data.size()); i++) {
|
for (int i = 0; i < static_cast<int>(data.size()); i++) {
|
||||||
rom_data_[addr + i] = data[i];
|
rom_data_[addr + i] = data[i];
|
||||||
}
|
}
|
||||||
util::logf("WriteVector: %#06X: %s", addr, util::HexByte(data[0]).data());
|
LOG_DEBUG("Rom", "WriteVector: %#06X: %s", addr,
|
||||||
|
util::HexByte(data[0]).data());
|
||||||
dirty_ = true;
|
dirty_ = true;
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
@@ -738,9 +739,10 @@ absl::Status Rom::WriteColor(uint32_t address, const gfx::SnesColor &color) {
|
|||||||
(color.snes() & 0x7C00);
|
(color.snes() & 0x7C00);
|
||||||
|
|
||||||
// Write the 16-bit color value to the ROM at the specified address
|
// Write the 16-bit color value to the ROM at the specified address
|
||||||
util::logf("WriteColor: %#06X: %s", address, util::HexWord(bgr).data());
|
LOG_DEBUG("Rom", "WriteColor: %#06X: %s", address, util::HexWord(bgr).data());
|
||||||
auto st = WriteShort(address, bgr);
|
auto st = WriteShort(address, bgr);
|
||||||
if (st.ok()) dirty_ = true;
|
if (st.ok())
|
||||||
|
dirty_ = true;
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -129,9 +129,8 @@ void TestManager::InitializeUITesting() {
|
|||||||
if (!ui_test_engine_) {
|
if (!ui_test_engine_) {
|
||||||
// Check if ImGui context is ready
|
// Check if ImGui context is ready
|
||||||
if (ImGui::GetCurrentContext() == nullptr) {
|
if (ImGui::GetCurrentContext() == nullptr) {
|
||||||
util::logf(
|
LOG_WARN("TestManager",
|
||||||
"[TestManager] Warning: ImGui context not ready, deferring test "
|
"ImGui context not ready, deferring test engine initialization");
|
||||||
"engine initialization");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +143,7 @@ void TestManager::InitializeUITesting() {
|
|||||||
|
|
||||||
// Start the test engine
|
// Start the test engine
|
||||||
ImGuiTestEngine_Start(ui_test_engine_, ImGui::GetCurrentContext());
|
ImGuiTestEngine_Start(ui_test_engine_, ImGui::GetCurrentContext());
|
||||||
util::logf("[TestManager] ImGuiTestEngine initialized successfully");
|
LOG_INFO("TestManager", "ImGuiTestEngine initialized successfully");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -364,8 +363,9 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
frame_counter++;
|
frame_counter++;
|
||||||
if (frame_counter % 60 == 0) { // Check every 60 frames
|
if (frame_counter % 60 == 0) { // Check every 60 frames
|
||||||
// Log ROM status periodically for debugging
|
// Log ROM status periodically for debugging
|
||||||
util::logf("TestManager ROM status check - Frame %d: ROM %p, loaded: %s",
|
LOG_INFO("TestManager",
|
||||||
frame_counter, (void*)current_rom_, has_rom ? "true" : "false");
|
"TestManager ROM status check - Frame %d: ROM %p, loaded: %s",
|
||||||
|
frame_counter, (void*)current_rom_, has_rom ? "true" : "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::BeginTable("ROM_Status_Table", 2, ImGuiTableFlags_BordersInner)) {
|
if (ImGui::BeginTable("ROM_Status_Table", 2, ImGuiTableFlags_BordersInner)) {
|
||||||
@@ -448,16 +448,18 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Debug ROM State")) {
|
if (ImGui::Button("Debug ROM State")) {
|
||||||
util::logf("=== ROM DEBUG INFO ===");
|
LOG_INFO("TestManager", "=== ROM DEBUG INFO ===");
|
||||||
util::logf("current_rom_ pointer: %p", (void*)current_rom_);
|
LOG_INFO("TestManager", "current_rom_ pointer: %p", (void*)current_rom_);
|
||||||
if (current_rom_) {
|
if (current_rom_) {
|
||||||
util::logf("ROM title: '%s'", current_rom_->title().c_str());
|
LOG_INFO("TestManager", "ROM title: '%s'",
|
||||||
util::logf("ROM size: %zu", current_rom_->size());
|
current_rom_->title().c_str());
|
||||||
util::logf("ROM is_loaded(): %s",
|
LOG_INFO("TestManager", "ROM size: %zu", current_rom_->size());
|
||||||
current_rom_->is_loaded() ? "true" : "false");
|
LOG_INFO("TestManager", "ROM is_loaded(): %s",
|
||||||
util::logf("ROM data pointer: %p", (void*)current_rom_->data());
|
current_rom_->is_loaded() ? "true" : "false");
|
||||||
|
LOG_INFO("TestManager", "ROM data pointer: %p",
|
||||||
|
(void*)current_rom_->data());
|
||||||
}
|
}
|
||||||
util::logf("======================");
|
LOG_INFO("TestManager", "======================");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -529,8 +531,8 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
bool nfd_mode = core::FeatureFlags::get().kUseNativeFileDialog;
|
bool nfd_mode = core::FeatureFlags::get().kUseNativeFileDialog;
|
||||||
if (ImGui::MenuItem("Use NFD File Dialog", nullptr, &nfd_mode)) {
|
if (ImGui::MenuItem("Use NFD File Dialog", nullptr, &nfd_mode)) {
|
||||||
core::FeatureFlags::get().kUseNativeFileDialog = nfd_mode;
|
core::FeatureFlags::get().kUseNativeFileDialog = nfd_mode;
|
||||||
util::logf("Global file dialog mode changed to: %s",
|
LOG_INFO("TestManager", "Global file dialog mode changed to: %s",
|
||||||
nfd_mode ? "NFD" : "Bespoke");
|
nfd_mode ? "NFD" : "Bespoke");
|
||||||
}
|
}
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
@@ -858,7 +860,7 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
|
|
||||||
if (ImGui::Button("Run All Google Tests")) {
|
if (ImGui::Button("Run All Google Tests")) {
|
||||||
// Run Google tests - this would integrate with gtest
|
// Run Google tests - this would integrate with gtest
|
||||||
util::logf("Running Google Tests...");
|
LOG_INFO("TestManager", "Running Google Tests...");
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
@@ -977,7 +979,7 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
bool nfd_mode = core::FeatureFlags::get().kUseNativeFileDialog;
|
bool nfd_mode = core::FeatureFlags::get().kUseNativeFileDialog;
|
||||||
if (ImGui::RadioButton("NFD (Native File Dialog)", nfd_mode)) {
|
if (ImGui::RadioButton("NFD (Native File Dialog)", nfd_mode)) {
|
||||||
core::FeatureFlags::get().kUseNativeFileDialog = true;
|
core::FeatureFlags::get().kUseNativeFileDialog = true;
|
||||||
util::logf("Global file dialog mode set to: NFD");
|
LOG_INFO("TestManager", "Global file dialog mode set to: NFD");
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip(
|
ImGui::SetTooltip(
|
||||||
@@ -986,7 +988,7 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
|
|
||||||
if (ImGui::RadioButton("Bespoke Implementation", !nfd_mode)) {
|
if (ImGui::RadioButton("Bespoke Implementation", !nfd_mode)) {
|
||||||
core::FeatureFlags::get().kUseNativeFileDialog = false;
|
core::FeatureFlags::get().kUseNativeFileDialog = false;
|
||||||
util::logf("Global file dialog mode set to: Bespoke");
|
LOG_INFO("TestManager", "Global file dialog mode set to: Bespoke");
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered()) {
|
if (ImGui::IsItemHovered()) {
|
||||||
ImGui::SetTooltip(
|
ImGui::SetTooltip(
|
||||||
@@ -1003,17 +1005,19 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
|
|
||||||
if (ImGui::Button("Test Current File Dialog")) {
|
if (ImGui::Button("Test Current File Dialog")) {
|
||||||
// Test the current file dialog implementation
|
// Test the current file dialog implementation
|
||||||
util::logf("Testing global file dialog mode: %s",
|
LOG_INFO("TestManager", "Testing global file dialog mode: %s",
|
||||||
core::FeatureFlags::get().kUseNativeFileDialog
|
core::FeatureFlags::get().kUseNativeFileDialog
|
||||||
? "NFD"
|
? "NFD"
|
||||||
: "Bespoke");
|
: "Bespoke");
|
||||||
|
|
||||||
// Actually test the file dialog
|
// Actually test the file dialog
|
||||||
auto result = core::FileDialogWrapper::ShowOpenFileDialog();
|
auto result = core::FileDialogWrapper::ShowOpenFileDialog();
|
||||||
if (!result.empty()) {
|
if (!result.empty()) {
|
||||||
util::logf("File dialog test successful: %s", result.c_str());
|
LOG_INFO("TestManager", "File dialog test successful: %s",
|
||||||
|
result.c_str());
|
||||||
} else {
|
} else {
|
||||||
util::logf("File dialog test: No file selected or dialog canceled");
|
LOG_INFO("TestManager",
|
||||||
|
"File dialog test: No file selected or dialog canceled");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1021,9 +1025,10 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
if (ImGui::Button("Test NFD Directly")) {
|
if (ImGui::Button("Test NFD Directly")) {
|
||||||
auto result = core::FileDialogWrapper::ShowOpenFileDialogNFD();
|
auto result = core::FileDialogWrapper::ShowOpenFileDialogNFD();
|
||||||
if (!result.empty()) {
|
if (!result.empty()) {
|
||||||
util::logf("NFD test successful: %s", result.c_str());
|
LOG_INFO("TestManager", "NFD test successful: %s", result.c_str());
|
||||||
} else {
|
} else {
|
||||||
util::logf(
|
LOG_INFO(
|
||||||
|
"TestManager",
|
||||||
"NFD test: No file selected, canceled, or error occurred");
|
"NFD test: No file selected, canceled, or error occurred");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1032,9 +1037,11 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
if (ImGui::Button("Test Bespoke Directly")) {
|
if (ImGui::Button("Test Bespoke Directly")) {
|
||||||
auto result = core::FileDialogWrapper::ShowOpenFileDialogBespoke();
|
auto result = core::FileDialogWrapper::ShowOpenFileDialogBespoke();
|
||||||
if (!result.empty()) {
|
if (!result.empty()) {
|
||||||
util::logf("Bespoke test successful: %s", result.c_str());
|
LOG_INFO("TestManager", "Bespoke test successful: %s",
|
||||||
|
result.c_str());
|
||||||
} else {
|
} else {
|
||||||
util::logf("Bespoke test: No file selected or not implemented");
|
LOG_INFO("TestManager",
|
||||||
|
"Bespoke test: No file selected or not implemented");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1118,12 +1125,12 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
if (enabled) {
|
if (enabled) {
|
||||||
if (ImGui::Button("Disable")) {
|
if (ImGui::Button("Disable")) {
|
||||||
DisableTest(test_name);
|
DisableTest(test_name);
|
||||||
util::logf("Disabled test: %s", test_name.c_str());
|
LOG_INFO("TestManager", "Disabled test: %s", test_name.c_str());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (ImGui::Button("Enable")) {
|
if (ImGui::Button("Enable")) {
|
||||||
EnableTest(test_name);
|
EnableTest(test_name);
|
||||||
util::logf("Enabled test: %s", test_name.c_str());
|
LOG_INFO("TestManager", "Enabled test: %s", test_name.c_str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
@@ -1143,7 +1150,7 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
DisableTest(test_name);
|
DisableTest(test_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
util::logf("Enabled only safe tests");
|
LOG_INFO("TestManager", "Enabled only safe tests");
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
@@ -1151,7 +1158,7 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
for (const auto& [test_name, description] : known_tests) {
|
for (const auto& [test_name, description] : known_tests) {
|
||||||
EnableTest(test_name);
|
EnableTest(test_name);
|
||||||
}
|
}
|
||||||
util::logf("Enabled all tests (including dangerous ones)");
|
LOG_INFO("TestManager", "Enabled all tests (including dangerous ones)");
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
@@ -1159,7 +1166,7 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
for (const auto& [test_name, description] : known_tests) {
|
for (const auto& [test_name, description] : known_tests) {
|
||||||
DisableTest(test_name);
|
DisableTest(test_name);
|
||||||
}
|
}
|
||||||
util::logf("Disabled all tests");
|
LOG_INFO("TestManager", "Disabled all tests");
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
@@ -1181,15 +1188,14 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
|
|
||||||
if (ImGui::Button("Quick Test NFD")) {
|
if (ImGui::Button("Quick Test NFD")) {
|
||||||
auto result = core::FileDialogWrapper::ShowOpenFileDialogNFD();
|
auto result = core::FileDialogWrapper::ShowOpenFileDialogNFD();
|
||||||
util::logf("NFD test result: %s",
|
LOG_INFO("TestManager", "NFD test result: %s",
|
||||||
result.empty() ? "Failed/Canceled" : result.c_str());
|
result.empty() ? "Failed/Canceled" : result.c_str());
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Quick Test Bespoke")) {
|
if (ImGui::Button("Quick Test Bespoke")) {
|
||||||
auto result = core::FileDialogWrapper::ShowOpenFileDialogBespoke();
|
auto result = core::FileDialogWrapper::ShowOpenFileDialogBespoke();
|
||||||
util::logf("Bespoke test result: %s", result.empty()
|
LOG_INFO("TestManager", "Bespoke test result: %s",
|
||||||
? "Failed/Not Implemented"
|
result.empty() ? "Failed/Not Implemented" : result.c_str());
|
||||||
: result.c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::Separator();
|
ImGui::Separator();
|
||||||
@@ -1229,8 +1235,9 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
ImVec2(200, 0))) {
|
ImVec2(200, 0))) {
|
||||||
// TODO: This would need access to EditorManager to create a new session
|
// TODO: This would need access to EditorManager to create a new session
|
||||||
// For now, just show a message
|
// For now, just show a message
|
||||||
util::logf("User requested to open test ROM in new session: %s",
|
LOG_INFO("TestManager",
|
||||||
test_rom_path_for_session_.c_str());
|
"User requested to open test ROM in new session: %s",
|
||||||
|
test_rom_path_for_session_.c_str());
|
||||||
show_test_session_dialog_ = false;
|
show_test_session_dialog_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1253,32 +1260,38 @@ void TestManager::DrawTestDashboard(bool* show_dashboard) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TestManager::RefreshCurrentRom() {
|
void TestManager::RefreshCurrentRom() {
|
||||||
util::logf("=== TestManager ROM Refresh ===");
|
LOG_INFO("TestManager", "=== TestManager ROM Refresh ===");
|
||||||
|
|
||||||
// Log current TestManager ROM state for debugging
|
// Log current TestManager ROM state for debugging
|
||||||
if (current_rom_) {
|
if (current_rom_) {
|
||||||
util::logf("TestManager ROM pointer: %p", (void*)current_rom_);
|
LOG_INFO("TestManager", "TestManager ROM pointer: %p", (void*)current_rom_);
|
||||||
util::logf("ROM is_loaded(): %s",
|
LOG_INFO("TestManager", "ROM is_loaded(): %s",
|
||||||
current_rom_->is_loaded() ? "true" : "false");
|
current_rom_->is_loaded() ? "true" : "false");
|
||||||
if (current_rom_->is_loaded()) {
|
if (current_rom_->is_loaded()) {
|
||||||
util::logf("ROM title: '%s'", current_rom_->title().c_str());
|
LOG_INFO("TestManager", "ROM title: '%s'",
|
||||||
util::logf("ROM size: %.2f MB", current_rom_->size() / 1048576.0f);
|
current_rom_->title().c_str());
|
||||||
util::logf("ROM dirty: %s", current_rom_->dirty() ? "true" : "false");
|
LOG_INFO("TestManager", "ROM size: %.2f MB",
|
||||||
|
current_rom_->size() / 1048576.0f);
|
||||||
|
LOG_INFO("TestManager", "ROM dirty: %s",
|
||||||
|
current_rom_->dirty() ? "true" : "false");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
util::logf("TestManager ROM pointer is null");
|
LOG_INFO("TestManager", "TestManager ROM pointer is null");
|
||||||
util::logf("Note: ROM should be set by EditorManager when ROM is loaded");
|
LOG_INFO(
|
||||||
|
"TestManager",
|
||||||
|
"Note: ROM should be set by EditorManager when ROM is loaded");
|
||||||
}
|
}
|
||||||
util::logf("===============================");
|
LOG_INFO("TestManager", "===============================");
|
||||||
}
|
}
|
||||||
|
|
||||||
absl::Status TestManager::CreateTestRomCopy(Rom* source_rom,
|
absl::Status TestManager::CreateTestRomCopy(
|
||||||
std::unique_ptr<Rom>& test_rom) {
|
Rom* source_rom, std::unique_ptr<Rom>& test_rom) {
|
||||||
if (!source_rom || !source_rom->is_loaded()) {
|
if (!source_rom || !source_rom->is_loaded()) {
|
||||||
return absl::FailedPreconditionError("Source ROM not loaded");
|
return absl::FailedPreconditionError("Source ROM not loaded");
|
||||||
}
|
}
|
||||||
|
|
||||||
util::logf("Creating test ROM copy from: %s", source_rom->title().c_str());
|
LOG_INFO("TestManager", "Creating test ROM copy from: %s",
|
||||||
|
source_rom->title().c_str());
|
||||||
|
|
||||||
// Create a new ROM instance
|
// Create a new ROM instance
|
||||||
test_rom = std::make_unique<Rom>();
|
test_rom = std::make_unique<Rom>();
|
||||||
@@ -1290,12 +1303,13 @@ absl::Status TestManager::CreateTestRomCopy(Rom* source_rom,
|
|||||||
return load_status;
|
return load_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
util::logf("Test ROM copy created successfully (size: %.2f MB)",
|
LOG_INFO("TestManager", "Test ROM copy created successfully (size: %.2f MB)",
|
||||||
test_rom->size() / 1048576.0f);
|
test_rom->size() / 1048576.0f);
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string TestManager::GenerateTestRomFilename(const std::string& base_name) {
|
std::string TestManager::GenerateTestRomFilename(
|
||||||
|
const std::string& base_name) {
|
||||||
// Generate filename with timestamp
|
// Generate filename with timestamp
|
||||||
auto now = std::chrono::system_clock::now();
|
auto now = std::chrono::system_clock::now();
|
||||||
auto time_t = std::chrono::system_clock::to_time_t(now);
|
auto time_t = std::chrono::system_clock::to_time_t(now);
|
||||||
@@ -1337,13 +1351,13 @@ absl::Status TestManager::TestRomWithCopy(
|
|||||||
std::unique_ptr<Rom> test_rom;
|
std::unique_ptr<Rom> test_rom;
|
||||||
RETURN_IF_ERROR(CreateTestRomCopy(source_rom, test_rom));
|
RETURN_IF_ERROR(CreateTestRomCopy(source_rom, test_rom));
|
||||||
|
|
||||||
util::logf("Executing test function on ROM copy");
|
LOG_INFO("TestManager", "Executing test function on ROM copy");
|
||||||
|
|
||||||
// Run the test function on the copy
|
// Run the test function on the copy
|
||||||
auto test_result = test_function(test_rom.get());
|
auto test_result = test_function(test_rom.get());
|
||||||
|
|
||||||
util::logf("Test function completed with status: %s",
|
LOG_INFO("TestManager", "Test function completed with status: %s",
|
||||||
test_result.ToString().c_str());
|
test_result.ToString().c_str());
|
||||||
|
|
||||||
return test_result;
|
return test_result;
|
||||||
}
|
}
|
||||||
@@ -1351,7 +1365,8 @@ absl::Status TestManager::TestRomWithCopy(
|
|||||||
absl::Status TestManager::LoadRomForTesting(const std::string& filename) {
|
absl::Status TestManager::LoadRomForTesting(const std::string& filename) {
|
||||||
// This would load a ROM specifically for testing purposes
|
// This would load a ROM specifically for testing purposes
|
||||||
// For now, just log the request
|
// For now, just log the request
|
||||||
util::logf("Request to load ROM for testing: %s", filename.c_str());
|
LOG_INFO("TestManager", "Request to load ROM for testing: %s",
|
||||||
|
filename.c_str());
|
||||||
return absl::UnimplementedError(
|
return absl::UnimplementedError(
|
||||||
"ROM loading for testing not yet implemented");
|
"ROM loading for testing not yet implemented");
|
||||||
}
|
}
|
||||||
@@ -1397,8 +1412,8 @@ absl::Status TestManager::TestRomSaveLoad(Rom* rom) {
|
|||||||
|
|
||||||
// Use TestRomWithCopy to avoid affecting the original ROM
|
// Use TestRomWithCopy to avoid affecting the original ROM
|
||||||
return TestRomWithCopy(rom, [this](Rom* test_rom) -> absl::Status {
|
return TestRomWithCopy(rom, [this](Rom* test_rom) -> absl::Status {
|
||||||
util::logf("Testing ROM save/load operations on copy: %s",
|
LOG_INFO("TestManager", "Testing ROM save/load operations on copy: %s",
|
||||||
test_rom->title().c_str());
|
test_rom->title().c_str());
|
||||||
|
|
||||||
// Perform test modifications on the copy
|
// Perform test modifications on the copy
|
||||||
// Test save operations
|
// Test save operations
|
||||||
@@ -1412,7 +1427,8 @@ absl::Status TestManager::TestRomSaveLoad(Rom* rom) {
|
|||||||
return save_status;
|
return save_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
util::logf("Test ROM saved successfully to: %s", settings.filename.c_str());
|
LOG_INFO("TestManager", "Test ROM saved successfully to: %s",
|
||||||
|
settings.filename.c_str());
|
||||||
|
|
||||||
// Offer to open test ROM in new session
|
// Offer to open test ROM in new session
|
||||||
OfferTestSessionCreation(settings.filename);
|
OfferTestSessionCreation(settings.filename);
|
||||||
@@ -1428,8 +1444,8 @@ absl::Status TestManager::TestRomDataIntegrity(Rom* rom) {
|
|||||||
|
|
||||||
// Use TestRomWithCopy for integrity testing (read-only but uses copy for safety)
|
// Use TestRomWithCopy for integrity testing (read-only but uses copy for safety)
|
||||||
return TestRomWithCopy(rom, [](Rom* test_rom) -> absl::Status {
|
return TestRomWithCopy(rom, [](Rom* test_rom) -> absl::Status {
|
||||||
util::logf("Testing ROM data integrity on copy: %s",
|
LOG_INFO("TestManager", "Testing ROM data integrity on copy: %s",
|
||||||
test_rom->title().c_str());
|
test_rom->title().c_str());
|
||||||
|
|
||||||
// Perform data integrity checks on the copy
|
// Perform data integrity checks on the copy
|
||||||
// This validates ROM structure, checksums, etc. without affecting original
|
// This validates ROM structure, checksums, etc. without affecting original
|
||||||
@@ -1446,7 +1462,8 @@ absl::Status TestManager::TestRomDataIntegrity(Rom* rom) {
|
|||||||
return header_status.status();
|
return header_status.status();
|
||||||
}
|
}
|
||||||
|
|
||||||
util::logf("ROM integrity check passed for: %s", test_rom->title().c_str());
|
LOG_INFO("TestManager", "ROM integrity check passed for: %s",
|
||||||
|
test_rom->title().c_str());
|
||||||
return absl::OkStatus();
|
return absl::OkStatus();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1753,22 +1770,25 @@ void TestManager::CaptureFailureContext(const std::string& test_id) {
|
|||||||
|
|
||||||
#if defined(YAZE_WITH_GRPC)
|
#if defined(YAZE_WITH_GRPC)
|
||||||
if (screenshot_artifact.ok()) {
|
if (screenshot_artifact.ok()) {
|
||||||
util::logf("[TestManager] Captured failure context for test %s: %s",
|
LOG_INFO("TestManager",
|
||||||
test_id.c_str(), failure_context.c_str());
|
"Captured failure context for test %s: %s", test_id.c_str(),
|
||||||
util::logf("[TestManager] Failure screenshot stored at %s (%lld bytes)",
|
failure_context.c_str());
|
||||||
screenshot_artifact->file_path.c_str(),
|
LOG_INFO("TestManager",
|
||||||
static_cast<long long>(screenshot_artifact->file_size_bytes));
|
"Failure screenshot stored at %s (%lld bytes)",
|
||||||
|
screenshot_artifact->file_path.c_str(),
|
||||||
|
static_cast<long long>(screenshot_artifact->file_size_bytes));
|
||||||
} else {
|
} else {
|
||||||
util::logf("[TestManager] Failed to capture screenshot for test %s: %s",
|
LOG_WARN("TestManager",
|
||||||
test_id.c_str(),
|
"Failed to capture screenshot for test %s: %s", test_id.c_str(),
|
||||||
screenshot_artifact.status().ToString().c_str());
|
screenshot_artifact.status().ToString().c_str());
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
util::logf(
|
LOG_INFO(
|
||||||
"[TestManager] Screenshot capture unavailable (YAZE_WITH_GRPC=OFF) for test %s",
|
"TestManager",
|
||||||
|
"Screenshot capture unavailable (YAZE_WITH_GRPC=OFF) for test %s",
|
||||||
test_id.c_str());
|
test_id.c_str());
|
||||||
#endif
|
#endif
|
||||||
util::logf("[TestManager] Widget state: %s", widget_state.c_str());
|
LOG_INFO("TestManager", "Widget state: %s", widget_state.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
|
|||||||
@@ -213,10 +213,10 @@ class TestManager {
|
|||||||
|
|
||||||
// ROM-dependent testing
|
// ROM-dependent testing
|
||||||
void SetCurrentRom(Rom* rom) {
|
void SetCurrentRom(Rom* rom) {
|
||||||
util::logf("TestManager::SetCurrentRom called with ROM: %p", (void*)rom);
|
LOG_INFO("TestManager", "SetCurrentRom called with ROM: %p", (void*)rom);
|
||||||
if (rom) {
|
if (rom) {
|
||||||
util::logf("ROM title: '%s', loaded: %s", rom->title().c_str(),
|
LOG_INFO("TestManager", "ROM title: '%s', loaded: %s",
|
||||||
rom->is_loaded() ? "true" : "false");
|
rom->title().c_str(), rom->is_loaded() ? "true" : "false");
|
||||||
}
|
}
|
||||||
current_rom_ = rom;
|
current_rom_ = rom;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ RoomSize CalculateRoomSize(Rom *rom, int room_id) {
|
|||||||
room_size.room_size = 0;
|
room_size.room_size = 0;
|
||||||
|
|
||||||
auto room_size_address = 0xF8000 + (room_id * 3);
|
auto room_size_address = 0xF8000 + (room_id * 3);
|
||||||
// util::logf("Room #%#03X Addresss: %#06X", room_id, room_size_address);
|
|
||||||
|
|
||||||
// Reading bytes for long address construction
|
// Reading bytes for long address construction
|
||||||
uint8_t low = rom->data()[room_size_address];
|
uint8_t low = rom->data()[room_size_address];
|
||||||
@@ -45,12 +44,10 @@ RoomSize CalculateRoomSize(Rom *rom, int room_id) {
|
|||||||
|
|
||||||
// Constructing the long address
|
// Constructing the long address
|
||||||
int long_address = (bank << 16) | (high << 8) | low;
|
int long_address = (bank << 16) | (high << 8) | low;
|
||||||
// util::logf("%#06X", long_address);
|
|
||||||
room_size.room_size_pointer = long_address;
|
room_size.room_size_pointer = long_address;
|
||||||
|
|
||||||
if (long_address == 0x0A8000) {
|
if (long_address == 0x0A8000) {
|
||||||
// Blank room disregard in size calculation
|
// Blank room disregard in size calculation
|
||||||
// util::logf("Size of Room #%#03X: 0 bytes", room_id);
|
|
||||||
room_size.room_size = 0;
|
room_size.room_size = 0;
|
||||||
} else {
|
} else {
|
||||||
// use the long address to calculate the size of the room
|
// use the long address to calculate the size of the room
|
||||||
@@ -58,7 +55,6 @@ RoomSize CalculateRoomSize(Rom *rom, int room_id) {
|
|||||||
// and subtract the two to get the size of the room
|
// and subtract the two to get the size of the room
|
||||||
|
|
||||||
int next_room_address = 0xF8000 + ((room_id + 1) * 3);
|
int next_room_address = 0xF8000 + ((room_id + 1) * 3);
|
||||||
// util::logf("Next Room Address: %#06X", next_room_address);
|
|
||||||
|
|
||||||
// Reading bytes for long address construction
|
// Reading bytes for long address construction
|
||||||
uint8_t next_low = rom->data()[next_room_address];
|
uint8_t next_low = rom->data()[next_room_address];
|
||||||
@@ -67,12 +63,10 @@ RoomSize CalculateRoomSize(Rom *rom, int room_id) {
|
|||||||
|
|
||||||
// Constructing the long address
|
// Constructing the long address
|
||||||
int next_long_address = (next_bank << 16) | (next_high << 8) | next_low;
|
int next_long_address = (next_bank << 16) | (next_high << 8) | next_low;
|
||||||
// util::logf("%#06X", next_long_address);
|
|
||||||
|
|
||||||
// Calculate the size of the room
|
// Calculate the size of the room
|
||||||
int actual_room_size = next_long_address - long_address;
|
int actual_room_size = next_long_address - long_address;
|
||||||
room_size.room_size = actual_room_size;
|
room_size.room_size = actual_room_size;
|
||||||
// util::logf("Size of Room #%#03X: %d bytes", room_id, actual_room_size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return room_size;
|
return room_size;
|
||||||
@@ -522,7 +516,6 @@ void Room::LoadObjects() {
|
|||||||
|
|
||||||
// Enhanced bounds checking for object pointer
|
// Enhanced bounds checking for object pointer
|
||||||
if (object_pointer < 0 || object_pointer >= (int)rom_->size()) {
|
if (object_pointer < 0 || object_pointer >= (int)rom_->size()) {
|
||||||
// util::logf("Object pointer out of range for room %d: %#06x", room_id_, object_pointer);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -530,7 +523,6 @@ void Room::LoadObjects() {
|
|||||||
|
|
||||||
// Enhanced bounds checking for room address
|
// Enhanced bounds checking for room address
|
||||||
if (room_address < 0 || room_address + 2 >= (int)rom_->size()) {
|
if (room_address < 0 || room_address + 2 >= (int)rom_->size()) {
|
||||||
// util::logf("Room address out of range for room %d: %#06x", room_id_, room_address);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -541,7 +533,6 @@ void Room::LoadObjects() {
|
|||||||
|
|
||||||
// Enhanced bounds checking for objects location
|
// Enhanced bounds checking for objects location
|
||||||
if (objects_location < 0 || objects_location >= (int)rom_->size()) {
|
if (objects_location < 0 || objects_location >= (int)rom_->size()) {
|
||||||
// util::logf("Objects location out of range for room %d: %#06x", room_id_, objects_location);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -912,16 +903,11 @@ void Room::LoadRoomLayout() {
|
|||||||
auto status = layout_.LoadLayout(room_id_);
|
auto status = layout_.LoadLayout(room_id_);
|
||||||
if (!status.ok()) {
|
if (!status.ok()) {
|
||||||
// Log error but don't fail - some rooms might not have layout data
|
// Log error but don't fail - some rooms might not have layout data
|
||||||
// util::logf("Failed to load room layout for room %d: %s",
|
|
||||||
// room_id_, status.message().data());
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Store the layout ID for compatibility with existing code
|
// Store the layout ID for compatibility with existing code
|
||||||
layout = static_cast<uint8_t>(room_id_ & 0xFF);
|
layout = static_cast<uint8_t>(room_id_ & 0xFF);
|
||||||
|
|
||||||
// util::logf("Loaded room layout for room %d with %zu objects",
|
|
||||||
// room_id_, layout_.GetObjects().size());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Room::LoadDoors() {
|
void Room::LoadDoors() {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <set>
|
#include <set>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#include "absl/strings/str_format.h"
|
#include "absl/strings/str_format.h"
|
||||||
#include "absl/strings/str_cat.h"
|
#include "absl/strings/str_cat.h"
|
||||||
@@ -18,45 +19,6 @@
|
|||||||
namespace yaze {
|
namespace yaze {
|
||||||
namespace util {
|
namespace util {
|
||||||
|
|
||||||
// Static variables for library state
|
|
||||||
static std::string g_log_file_path = "";
|
|
||||||
|
|
||||||
|
|
||||||
// Set custom log file path
|
|
||||||
inline void SetLogFile(const std::string& filepath) {
|
|
||||||
g_log_file_path = filepath;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename... Args>
|
|
||||||
static void logf(const absl::FormatSpec<Args...> &format, const Args &...args) {
|
|
||||||
std::string message = absl::StrFormat(format, args...);
|
|
||||||
auto timestamp = std::chrono::system_clock::now();
|
|
||||||
|
|
||||||
std::time_t now_tt = std::chrono::system_clock::to_time_t(timestamp);
|
|
||||||
std::tm tm = *std::localtime(&now_tt);
|
|
||||||
message = absl::StrCat("[", tm.tm_hour, ":", tm.tm_min, ":", tm.tm_sec, "] ",
|
|
||||||
message, "\n");
|
|
||||||
|
|
||||||
if (core::FeatureFlags::get().kLogToConsole) {
|
|
||||||
std::cout << message;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use the configurable log file path
|
|
||||||
static std::ofstream fout;
|
|
||||||
static std::string last_log_path = "";
|
|
||||||
|
|
||||||
// Reopen file if path changed
|
|
||||||
if (g_log_file_path != last_log_path) {
|
|
||||||
fout.close();
|
|
||||||
fout.open(g_log_file_path, std::ios::out | std::ios::trunc);
|
|
||||||
last_log_path = g_log_file_path;
|
|
||||||
}
|
|
||||||
|
|
||||||
fout << message;
|
|
||||||
fout.flush(); // Ensure immediate write for debugging
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @enum LogLevel
|
* @enum LogLevel
|
||||||
* @brief Defines the severity levels for log messages.
|
* @brief Defines the severity levels for log messages.
|
||||||
@@ -114,9 +76,6 @@ class LogManager {
|
|||||||
std::string log_file_path_;
|
std::string log_file_path_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// logf mapping
|
|
||||||
#define logf LOG_INFO
|
|
||||||
|
|
||||||
// --- Public Logging Macros ---
|
// --- Public Logging Macros ---
|
||||||
// These macros provide a convenient and efficient API for logging.
|
// These macros provide a convenient and efficient API for logging.
|
||||||
// The `do-while(0)` loop ensures they behave like a single statement.
|
// The `do-while(0)` loop ensures they behave like a single statement.
|
||||||
@@ -140,6 +99,16 @@ class LogManager {
|
|||||||
#define LOG_FATAL(category, format, ...) \
|
#define LOG_FATAL(category, format, ...) \
|
||||||
LOG(yaze::util::LogLevel::FATAL, category, format, ##__VA_ARGS__)
|
LOG(yaze::util::LogLevel::FATAL, category, format, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
template <typename... Args>
|
||||||
|
inline void logf(const absl::FormatSpec<Args...>& format, Args&&... args) {
|
||||||
|
LogManager::instance().log(LogLevel::INFO, "General",
|
||||||
|
absl::StrFormat(format, std::forward<Args>(args)...));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void logf(absl::string_view message) {
|
||||||
|
LogManager::instance().log(LogLevel::INFO, "General", message);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace util
|
} // namespace util
|
||||||
} // namespace yaze
|
} // namespace yaze
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user