24 KiB
Editor Development Roadmaps - November 2025
Generated: 2025-11-21 by Claude Code Source: Multi-agent analysis (5 specialized agents) Scope: Dungeon Editor, Overworld Editor, Message Editor, Testing Infrastructure
📊 Executive Summary
Based on comprehensive analysis by specialized agents, here are the strategic priorities for editor development:
Current State Assessment
| Editor | Completion | Primary Gap | Est. Effort |
|---|---|---|---|
| Dungeon Editor | 80% | Interaction wiring | 22-30 hours |
| Overworld Editor | 95% | Theme compliance & undo/redo | 14-18 hours |
| Message Editor | 70% | Translation features | 21 dev days |
| Testing Coverage | 34% | Editor-specific tests | 4-6 weeks |
🎯 Dungeon Editor Roadmap
Analysis: imgui-frontend-engineer agent Current State: Solid architecture, component-based design, just needs interaction wiring
Top 5 Milestones
Milestone 1: Object Interaction Foundation (4-6 hours)
Priority: HIGHEST - Unlocks actual editing capability
Tasks:
-
Wire object placement system
- Complete
DrawObjectSelector()with working preview - Connect
object_placed_callback_inDungeonObjectInteraction - Implement
PlaceObjectAtPosition()to write to room data - Add ghost preview when hovering with object selected
- Complete
-
Complete object selection
- Implement
CheckForObjectSelection()with click/drag rectangle - Wire
DrawSelectionHighlights()(high-contrast outline at 0.85f alpha) - Connect context menu to
HandleDeleteSelected() - Add multi-select with Shift/Ctrl modifiers
- Implement
-
Object drawing integration
- Ensure
ObjectDrawer::DrawObjectList()called during room rendering - Verify object outlines render with proper filtering
- Add object info tooltip on hover (ID, size, coordinates)
- Ensure
-
Theme compliance audit
- Replace all
IM_COL32()calls withAgentUI::GetTheme()colors - Audit all dungeon editor files for hardcoded colors
- Replace all
Files to Modify:
src/app/editor/dungeon/dungeon_object_selector.ccsrc/app/editor/dungeon/dungeon_object_interaction.ccsrc/app/editor/dungeon/dungeon_canvas_viewer.ccsrc/app/editor/dungeon/dungeon_editor_v2.cc
Success Criteria:
- User can select object from selector panel
- User can place object in room with mouse click
- User can select placed objects (single + multi)
- User can delete selected objects via context menu or Del key
- Object tooltips show useful info on hover
- No hardcoded colors remain
Milestone 2: Clipboard Operations (3-4 hours)
Priority: Medium - Big productivity boost
Tasks:
-
Implement copy/cut
- Store selected objects in
clipboard_vector - Serialize object properties (ID, position, size, layer)
- Add "Copy" and "Cut" to context menu
- Update status bar to show clipboard count
- Store selected objects in
-
Implement paste
- Deserialize clipboard data
- Place objects at mouse cursor position (offset from original)
- Support paste-with-drag for precise placement
- Add "Paste" to context menu + Ctrl+V shortcut
-
Cross-room clipboard
- Enable copying objects from one room and pasting into another
- Handle blockset differences gracefully (warn if incompatible)
- Persist clipboard across room switches
Success Criteria:
- User can copy selected objects (Ctrl+C or context menu)
- User can cut selected objects (Ctrl+X)
- User can paste objects at cursor (Ctrl+V)
- Paste works across different rooms
- Clipboard persists across room tabs
Milestone 3: Undo/Redo System (5-7 hours)
Priority: Medium - Professional editing experience
Tasks:
-
Design command pattern
- Create
DungeonEditorCommandbase class withExecute()/Undo()methods - Implement commands:
PlaceObjectCommand,DeleteObjectCommand,MoveObjectCommand,ModifyObjectCommand - Add command stack (max 50 actions) with pruning
- Create
-
Integrate with object operations
- Wrap all object modifications in commands
- Push commands to history stack in
DungeonEditorV2 - Update UI to show "Undo: [action]" / "Redo: [action]" tooltips
-
Property edit undo
- Track room property changes (blockset, palette, floor graphics)
- Create
ModifyRoomPropertiesCommandfor batch edits - Handle graphics refresh on undo/redo
-
UI indicators
- Gray out Undo/Redo menu items when unavailable
- Add Ctrl+Z / Ctrl+Shift+Z keyboard shortcuts
- Display undo history in optional panel (10 recent actions)
Files to Create:
src/app/editor/dungeon/dungeon_command_history.h(new file)
Success Criteria:
- All object operations support undo/redo
- Room property changes support undo/redo
- Keyboard shortcuts work (Ctrl+Z, Ctrl+Shift+Z)
- Undo history visible in debug panel
- No memory leaks (command cleanup after stack pruning)
Milestone 4: Object Properties Panel (4-5 hours)
Priority: Medium - Fine-tuned object customization
Tasks:
-
Properties UI design
- Create
ObjectPropertiesCard(dockable, 300×400 default size) - Display selected object ID, coordinates, size, layer
- Editable fields: X/Y position (hex input), size/length (numeric), layer (dropdown)
- Show object preview thumbnail (64×64 pixels)
- Create
-
Live property updates
- Changes to X/Y immediately move object on canvas
- Changes to size/length trigger re-render via
ObjectDrawer - Layer changes update object's BG assignment
- Add "Apply" vs "Live Update" toggle for performance
-
Multi-selection properties
- Show common properties when multiple objects selected
- Support batch edit (move all selected by offset, change layer for all)
- Display "Mixed" for differing values
-
Integration with ObjectEditorCard
- Merge or coordinate with existing
ObjectEditorCard - Decide if properties should be tab in unified card or separate panel
- Follow OverworldEditor's pattern (separate MapPropertiesSystem)
- Merge or coordinate with existing
Files to Create:
src/app/editor/dungeon/object_properties_card.h(new file)src/app/editor/dungeon/object_properties_card.cc(new file)
Success Criteria:
- Properties panel shows when object selected
- All object properties editable (X, Y, size, layer)
- Changes reflected immediately on canvas
- Multi-selection batch edit works
- Panel follows AgentUITheme standards
Milestone 5: Enhanced Canvas Features (6-8 hours)
Priority: Lower - Quality-of-life improvements
Tasks:
-
Object snapping
- Snap to 8×8 grid when placing/moving objects
- Snap to other objects' edges (magnetic guides)
- Toggle snapping with Shift key
- Visual guides (dotted lines) when snapping
-
Canvas navigation improvements
- Minimap overlay (128×128 px) showing full room with viewport indicator
- "Fit to Window" button to reset zoom/pan
- Zoom to selection (fit selected objects in view)
- Remember pan/zoom per room tab
-
Object filtering UI
- Checkboxes for object type visibility (Type1, Type2, Type3)
- Layer filter (show only BG1 objects, only BG2, etc.)
- "Show All" / "Hide All" quick toggles
- Filter state persists across rooms
-
Ruler/measurement tool
- Click-drag to measure distance between two points
- Display pixel distance + tile distance
- Show angle for diagonal measurements
Success Criteria:
- Object snapping works (grid + magnetic)
- Minimap overlay functional
- Object type/layer filtering works
- Measurement tool usable
- Canvas navigation smooth and intuitive
Quick Wins (4 hours total)
For immediate visible progress:
- Theme compliance fixes (1h) - Remove hardcoded colors
- Object placement wiring (2h) - Enable basic object placement
- Object deletion (1h) - Complete the basic edit loop
🎨 Overworld Editor Roadmap
Analysis: imgui-frontend-engineer agent Current State: Feature-complete but needs critical polish
Top 5 Critical Fixes
1. Eliminate All Hardcoded Colors (4-6 hours)
Priority: CRITICAL - Theme system violation
Problem: 22+ hardcoded ImVec4 color instances, zero usage of AgentUI::GetTheme()
Files Affected:
src/app/editor/overworld/map_properties.cc(22 instances)src/app/editor/overworld/overworld_entity_renderer.cc(entity colors)src/app/editor/overworld/overworld_editor.cc(selector highlight)
Required Fix:
// Add to AgentUITheme:
ImVec4 entity_entrance_color; // Bright yellow-gold (0.85f alpha)
ImVec4 entity_exit_color; // Cyan-white (0.85f alpha)
ImVec4 entity_item_color; // Bright red (0.85f alpha)
ImVec4 entity_sprite_color; // Bright magenta (0.85f alpha)
ImVec4 status_info; // Info messages
ImVec4 status_warning; // Warnings
ImVec4 status_success; // Success messages
// Refactor all entity_renderer colors:
const auto& theme = AgentUI::GetTheme();
ImVec4 GetEntranceColor() { return theme.entity_entrance_color; }
Success Criteria:
- All hardcoded colors replaced with theme system
- Entity colors follow visibility standards (0.85f alpha)
- No
ImVec4literals remain in overworld editor files
2. Implement Undo/Redo System for Tile Editing (6-8 hours)
Priority: HIGH - #1 user frustration point
Current State:
absl::Status Undo() override { return absl::UnimplementedError("Undo"); }
absl::Status Redo() override { return absl::UnimplementedError("Redo"); }
Implementation Approach:
- Create command pattern stack for tile modifications
- Track:
{map_id, x, y, old_tile16_id, new_tile16_id} - Store up to 100 undo steps (configurable)
- Batch consecutive paint strokes into single undo operation
- Hook into existing
RenderUpdatedMapBitmap()call sites - Add Ctrl+Z/Ctrl+Shift+Z keyboard shortcuts
Success Criteria:
- Tile painting supports undo/redo
- Keyboard shortcuts work (Ctrl+Z, Ctrl+Shift+Z)
- Consecutive paint strokes batched into single undo
- Undo stack limited to 100 actions
- Graphics refresh correctly on undo/redo
3. Complete OverworldItem Deletion Implementation (2-3 hours)
Priority: Medium - Data integrity issue
Current Issue:
// entity.cc:319
// TODO: Implement deleting OverworldItem objects, currently only hides them
bool DrawItemEditorPopup(zelda3::OverworldItem& item) {
Problem: Items marked as deleted = true but not actually removed from ROM data structures
Required Fix:
- Implement proper deletion in
zelda3::Overworld::SaveItems() - Compact the item array after deletion (remove deleted entries)
- Update item indices for all remaining items
- Add "Permanently Delete" vs "Hide" option in UI
Files to Modify:
src/app/editor/overworld/entity.ccsrc/zelda3/overworld/overworld.cc(SaveItems method)
Success Criteria:
- Deleted items removed from ROM data
- Item array compacted after deletion
- No ID conflicts when inserting new items
- UI clearly distinguishes "Hide" vs "Delete"
4. Remove TODO Comments for Deferred Texture Rendering (30 minutes)
Priority: Low - Code cleanliness
Found 9 instances:
// TODO: Queue texture for later rendering.
// Renderer::Get().UpdateBitmap(&tile16_blockset_.atlas);
Files Affected:
overworld_editor.cc(6 instances)tile16_editor.cc(3 instances)
Required Fix:
- Remove all 9 TODO comments
- Verify that
gfx::Arenais handling these textures properly - If not, use:
gfx::Arena::Get().QueueDeferredTexture(bitmap, priority) - Add documentation explaining why direct
UpdateBitmap()calls were removed
Success Criteria:
- All texture TODO comments removed
- Texture queuing verified functional
- Documentation added for future developers
5. Polish Exit Editor - Implement Door Type Controls (1 hour)
Priority: Low - UX clarity
Current State:
// entity.cc:216
gui::TextWithSeparators("Unimplemented below");
ImGui::RadioButton("None", &doorType, 0);
ImGui::RadioButton("Wooden", &doorType, 1);
ImGui::RadioButton("Bombable", &doorType, 2);
Problem: Door type controls shown but marked "Unimplemented" - misleading to users
Recommended Fix: Remove the unimplemented door controls entirely
ImGui::TextDisabled(ICON_MD_INFO " Door types are controlled by dungeon room properties");
ImGui::TextWrapped("To configure entrance doors, use the Dungeon Editor.");
Success Criteria:
- Misleading unimplemented UI removed
- Clear message explaining where door types are configured
💬 Message Editor Roadmap
Analysis: imgui-frontend-engineer agent Current State: Solid foundation, needs translation features
Phased Implementation Plan
Phase 1: JSON Export/Import (Weeks 1-2, 6 dev days)
Priority: HIGHEST - Foundation for all translation workflows
Tasks:
- Implement
SerializeMessages()andDeserializeMessages() - Add UI buttons for export/import
- Add CLI import support
- Write comprehensive tests
Proposed JSON Schema:
{
"version": "1.0",
"rom_name": "Zelda3 US",
"messages": [
{
"id": "0x01",
"address": "0xE0000",
"text": "Link rescued Zelda from Ganon.",
"context": "Opening narration",
"notes": "Translator: Keep under 40 characters",
"modified": false
}
],
"dictionary": [
{"index": "0x00", "phrase": "Link"},
{"index": "0x01", "phrase": "Zelda"}
]
}
Files to Modify:
src/app/editor/message/message_editor.hsrc/app/editor/message/message_editor.cc
Success Criteria:
- JSON export creates valid schema
- JSON import loads messages correctly
- CLI supports
z3ed message export --format json - Tests cover serialization/deserialization
Phase 2: Translation Workspace (Weeks 3-5, 9 dev days)
Priority: High - Unlocks localization capability
Tasks:
- Create
TranslationWorkspaceclass - Side-by-side reference/translation view
- Progress tracking (X/396 completed)
- Context notes field for translators
UI Mockup:
┌────────────────────────────────────────────────────┐
│ Translation Progress: 123/396 (31%) │
├────────────────────────────────────────────────────┤
│ Reference (English) │ Translation (Spanish) │
├───────────────────────┼───────────────────────────┤
│ Link rescued Zelda │ Link rescató a Zelda │
│ from Ganon. │ de Ganon. │
│ │ │
│ Context: Opening │ Notes: Keep dramatic tone │
├───────────────────────┴───────────────────────────┤
│ [Previous] [Mark Complete] [Save] [Next] │
└────────────────────────────────────────────────────┘
Files to Create:
src/app/editor/message/translation_workspace.h(new file)src/app/editor/message/translation_workspace.cc(new file)
Success Criteria:
- Side-by-side view displays reference and translation
- Progress tracker updates as messages marked complete
- Context notes persist with message data
- Navigation between messages smooth
Phase 3: Search & Replace (Week 6, 4 dev days)
Priority: Medium - QoL improvement
Tasks:
- Complete the Find/Replace implementation
- Add batch operations
- Optional: Add regex support
Success Criteria:
- Global search across all messages
- Batch replace (e.g., "Hyrule" → "Lorule")
- Search highlights matches in message list
- Replace confirms before applying
Phase 4: UI Polish (Week 7, 2 dev days)
Priority: Low - Final polish
Tasks:
- Integrate
AgentUITheme(if not already done) - Add keyboard shortcuts
- Improve accessibility
Success Criteria:
- All colors use theme system
- Keyboard shortcuts documented
- Tooltips on all major controls
Architectural Decisions Needed
- JSON Schema: Proposed schema includes context notes and metadata - needs review
- Translation Layout: Side-by-side vs. top-bottom layout - needs user feedback
- Dictionary Auto-Optimization: Complex NP-hard problem - may need background threads
🧪 Testing Infrastructure Roadmap
Analysis: test-infrastructure-expert agent Current State: Well-architected (34% test-to-code ratio), uneven coverage
Top 5 Priorities
Priority 1: Editor Lifecycle Test Framework (Week 1, 1-2 dev days)
Why: Every editor needs basic lifecycle testing
What to Build:
test/unit/editor/editor_lifecycle_test.cc- Parameterized test for all editor types
- Validates initialization, ROM binding, error handling
Implementation:
class EditorLifecycleTest : public ::testing::TestWithParam<editor::EditorType> {
// Test: InitializeWithoutRom_Succeeds
// Test: LoadWithoutRom_ReturnsError
// Test: FullLifecycle_Succeeds
// Test: UpdateBeforeLoad_ReturnsError
};
INSTANTIATE_TEST_SUITE_P(
AllEditors,
EditorLifecycleTest,
::testing::Values(
editor::EditorType::kOverworld,
editor::EditorType::kDungeon,
editor::EditorType::kMessage,
editor::EditorType::kGraphics,
editor::EditorType::kPalette,
editor::EditorType::kSprite
)
);
Impact: Catches 80% of editor regressions with minimal effort
Priority 2: OverworldEditor Entity Operations Tests (Week 2, 2-3 dev days)
Why: OverworldEditor is 118KB with complex entity management
What to Build:
test/unit/editor/overworld/entity_operations_test.cc- Tests for add/remove/modify entrances, exits, items, sprites
- Validation of entity constraints and error handling
Success Criteria:
- Add entity with valid position succeeds
- Add entity with invalid position returns error
- Remove entity by ID succeeds
- Modify entity updates graphics
- Delete all entities in region works
Priority 3: Graphics Refresh Verification Tests (Week 3, 2-3 dev days)
Why: Graphics refresh bugs are common (UpdateBitmap vs RenderBitmap, data/surface sync)
What to Build:
test/integration/editor/graphics_refresh_test.cc- Validates Update property → Load → Force render pipeline
- Tests Bitmap/surface synchronization
- Verifies Arena texture queue processing
Success Criteria:
- Change map palette triggers graphics reload
- Bitmap data and surface stay synced
- WriteToPixel updates surface
- Arena texture queue processes correctly
- Graphics sheet modification notifies Arena
Priority 4: Message Editor Workflow Tests (Week 4, 1-2 dev days)
Why: Message editor has good data parsing tests but no editor UI/workflow tests
What to Build:
test/integration/editor/message_editor_test.cc- E2E test for message editing workflow
- Tests for dictionary optimization
- Command parsing validation
Success Criteria:
- Load all messages succeeds
- Edit message updates ROM
- Add dictionary word optimizes message
- Insert command validates syntax
- Invalid command returns error
Priority 5: Canvas Interaction Test Utilities (Week 5-6, 2-3 dev days)
Why: Multiple editors use Canvas - need reusable test helpers
What to Build:
test/test_utils_canvas.h/test/test_utils_canvas.cc- Semantic helpers: Click tile, select rectangle, drag entity
- Bitmap comparison utilities
API Design:
namespace yaze::test::canvas {
void ClickTile(ImGuiTestContext* ctx, const std::string& canvas_name, int tile_x, int tile_y);
void SelectRectangle(ImGuiTestContext* ctx, const std::string& canvas_name, int x1, int y1, int x2, int y2);
void DragEntity(ImGuiTestContext* ctx, const std::string& canvas_name, int from_x, int from_y, int to_x, int to_y);
uint32_t CaptureBitmapChecksum(const gfx::Bitmap& bitmap);
int CompareBitmaps(const gfx::Bitmap& bitmap1, const gfx::Bitmap& bitmap2, bool log_differences = false);
}
Impact: Makes E2E tests easier to write, more maintainable, reduces duplication
Testing Strategy
ROM-Independent Tests (Primary CI Target):
- Use
MockRomwith minimal test data - Fast execution (< 5s total)
- No external dependencies
- Ideal for: Logic, calculations, data structures, error handling
ROM-Dependent Tests (Secondary/Manual):
- Require actual Zelda3 ROM file
- Slower execution (< 60s total)
- Test real-world data parsing
- Ideal for: Graphics rendering, full map loading, ROM patching
Developer Workflow:
# During development: Run fast unit tests frequently
./build/bin/yaze_test --unit "*OverworldEntity*"
# Before commit: Run integration tests for changed editor
./build/bin/yaze_test --integration "*Overworld*"
# Pre-PR: Run E2E tests for critical workflows
./build/bin/yaze_test --e2e --show-gui
📈 Success Metrics
After 4 Weeks:
- ✅ Dungeon editor functional for basic editing
- ✅ Overworld editor theme-compliant with undo/redo
- ✅ Message editor supports JSON export/import
- ✅ Test coverage increased from 10% → 40% for editors
- ✅ All editors have lifecycle tests
🎬 Recommended Development Order
Week 1: Quick Wins
Goal: Immediate visible progress (8 hours)
# Dungeon Editor (4 hours)
1. Fix theme violations (1h)
2. Wire object placement (2h)
3. Enable object deletion (1h)
# Overworld Editor (4 hours)
4. Start theme system refactor (4h)
Week 2: Core Functionality
Goal: Unlock basic editing workflows (18 hours)
# Dungeon Editor (10 hours)
1. Complete object selection system (3h)
2. Implement clipboard operations (4h)
3. Add object properties panel (3h)
# Overworld Editor (8 hours)
4. Finish theme system refactor (4h)
5. Implement undo/redo foundation (4h)
Week 3: Testing Foundation
Goal: Prevent regressions (15 hours)
# Testing Infrastructure
1. Create editor lifecycle test framework (5h)
2. Add overworld entity operation tests (5h)
3. Implement canvas interaction utilities (5h)
Week 4: Message Editor Phase 1
Goal: Unlock translation workflows (15 hours)
# Message Editor
1. Implement JSON serialization (6h)
2. Add export/import UI (4h)
3. Add CLI import support (2h)
4. Write comprehensive tests (3h)
📚 Key File Locations
Dungeon Editor
- Primary:
src/app/editor/dungeon/dungeon_editor_v2.{h,cc} - Components:
dungeon_canvas_viewer,dungeon_object_selector,dungeon_object_interaction,dungeon_room_loader - Core Data:
src/zelda3/dungeon/room.{h,cc},object_drawer.{h,cc} - Tests:
test/integration/dungeon_editor_v2_test.cc,test/e2e/dungeon_editor_smoke_test.cc
Overworld Editor
- Primary:
src/app/editor/overworld/overworld_editor.{h,cc} - Modules:
map_properties.cc,overworld_entity_renderer.cc,entity.cc - Core Data:
src/zelda3/overworld/overworld.{h,cc} - Tests:
test/unit/editor/overworld/overworld_editor_test.cc
Message Editor
- Primary:
src/app/editor/message/message_editor.{h,cc} - Tests:
test/integration/message/message_editor_test.cc
Testing Infrastructure
- Main Runner:
test/yaze_test.cc - Utilities:
test/test_utils.{h,cc},test/mocks/mock_rom.h - Fixtures:
test/unit/editor/editor_test_fixtures.h(to be created)
📝 Notes
Architecture Strengths:
- Modular editor design with clear separation of concerns
- Progressive loading via gfx::Arena
- ImGuiTestEngine integration for E2E tests
- Card-based UI system
Critical Issues:
- Overworld Editor: 22 hardcoded colors violate theme system
- All Editors: Missing undo/redo (user frustration #1)
- Testing: 67 editor headers, only 6 have tests
Strategic Recommendations:
- Start with dungeon editor - quickest path to "working" state
- Fix overworld theme violations - visible polish, affects UX
- Implement message JSON export - foundation for translation
- Add lifecycle tests - catches 80% of regressions
Document Version: 1.0 Last Updated: 2025-11-21 Next Review: After completing Week 1 priorities