backend-infra-engineer: Post v0.3.9-hotfix7 snapshot (build cleanup)
This commit is contained in:
@@ -0,0 +1,245 @@
|
||||
# Gemini Pro 3 Antigravity - YAZE Development Session
|
||||
|
||||
## Context
|
||||
|
||||
You are working on **YAZE** (Yet Another Zelda3 Editor), a C++23 cross-platform ROM editor for The Legend of Zelda: A Link to the Past.
|
||||
|
||||
**Your previous session accomplished:**
|
||||
- Fixed ASM version check regression using `OverworldVersionHelper` abstraction
|
||||
- Improved texture queueing in `Tile16Editor`
|
||||
- The insight: `0xFF >= 3` evaluates true, incorrectly treating vanilla ROMs as v3
|
||||
|
||||
**Reference documentation available:**
|
||||
- `docs/internal/agents/gemini-overworld-system-reference.md` - Overworld architecture
|
||||
- `docs/internal/agents/gemini-dungeon-system-reference.md` - Dungeon architecture
|
||||
- `docs/internal/agents/gemini-build-setup.md` - Build commands
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# 1. Setup build directory (use dedicated dir, not user's build/)
|
||||
cmake --preset mac-dbg -B build_gemini
|
||||
|
||||
# 2. Build editor
|
||||
cmake --build build_gemini -j8 --target yaze
|
||||
|
||||
# 3. Run stable tests
|
||||
ctest --test-dir build_gemini -L stable -j4 --output-on-failure
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Task Categories
|
||||
|
||||
### Category A: Overworld Editor Gaps
|
||||
|
||||
#### A1. Texture Queueing TODOs (6 locations)
|
||||
**File:** `src/app/editor/overworld/overworld_editor.cc`
|
||||
**Lines:** 1392, 1397, 1740, 1809, 1819, 1962
|
||||
|
||||
These commented-out Renderer calls need to be converted to the Arena queue system:
|
||||
|
||||
```cpp
|
||||
// BEFORE (blocking - commented out)
|
||||
// Renderer::Get().RenderBitmap(&bitmap_);
|
||||
|
||||
// AFTER (non-blocking)
|
||||
gfx::Arena::Get().QueueTextureCommand(gfx::TextureCommand{
|
||||
.operation = gfx::TextureOperation::kCreate,
|
||||
.bitmap = &bitmap_,
|
||||
.priority = gfx::TexturePriority::kHigh
|
||||
});
|
||||
```
|
||||
|
||||
#### A2. Unimplemented Editor Methods
|
||||
**File:** `src/app/editor/overworld/overworld_editor.h` lines 82-87
|
||||
|
||||
| Method | Status | Complexity |
|
||||
|--------|--------|------------|
|
||||
| `Undo()` | Returns `UnimplementedError` | Medium |
|
||||
| `Redo()` | Returns `UnimplementedError` | Medium |
|
||||
| `Cut()` | Returns `UnimplementedError` | Simple |
|
||||
| `Find()` | Returns `UnimplementedError` | Medium |
|
||||
|
||||
#### A3. Entity Popup Static Variable Bug
|
||||
**File:** `src/app/editor/overworld/entity.cc`
|
||||
|
||||
Multiple popups use `static` variables that persist across calls, causing state contamination:
|
||||
|
||||
```cpp
|
||||
// CURRENT (BUG)
|
||||
bool DrawExitEditorPopup() {
|
||||
static bool set_done = false; // Persists! Wrong entity data shown
|
||||
static int doorType = ...;
|
||||
}
|
||||
|
||||
// FIX: Use local variables or proper state management
|
||||
bool DrawExitEditorPopup(ExitEditorState& state) {
|
||||
// state is passed in, not static
|
||||
}
|
||||
```
|
||||
|
||||
#### A4. Exit Editor Unconnected UI
|
||||
**File:** `src/app/editor/overworld/entity.cc` lines 216-264
|
||||
|
||||
UI elements exist but aren't connected to data:
|
||||
- Door type editing (Wooden, Bombable, Sanctuary, Palace)
|
||||
- Door X/Y position
|
||||
- Center X/Y, Link posture, sprite/BG GFX, palette
|
||||
|
||||
---
|
||||
|
||||
### Category B: Dungeon Object Rendering
|
||||
|
||||
#### B1. BothBG Dual-Layer Stubs (4 locations)
|
||||
**File:** `src/zelda3/dungeon/object_drawer.cc`
|
||||
|
||||
These routines should draw to BOTH BG1 and BG2 but only accept one buffer:
|
||||
|
||||
| Line | Routine | Status |
|
||||
|------|---------|--------|
|
||||
| 375-381 | `DrawRightwards2x4spaced4_1to16_BothBG` | STUB |
|
||||
| 437-442 | `DrawDiagonalAcute_1to16_BothBG` | STUB |
|
||||
| 444-449 | `DrawDiagonalGrave_1to16_BothBG` | STUB |
|
||||
| 755-761 | `DrawDownwards4x2_1to16_BothBG` | STUB |
|
||||
|
||||
**Fix:** Change signature to accept both buffers:
|
||||
```cpp
|
||||
// BEFORE
|
||||
void DrawRightwards2x4spaced4_1to16_BothBG(
|
||||
const RoomObject& obj, gfx::BackgroundBuffer& bg, ...);
|
||||
|
||||
// AFTER
|
||||
void DrawRightwards2x4spaced4_1to16_BothBG(
|
||||
const RoomObject& obj,
|
||||
gfx::BackgroundBuffer& bg1,
|
||||
gfx::BackgroundBuffer& bg2, ...);
|
||||
```
|
||||
|
||||
#### B2. Diagonal Routines Unclear Logic
|
||||
**File:** `src/zelda3/dungeon/object_drawer.cc` lines 401-435
|
||||
|
||||
Issues with `DrawDiagonalAcute_1to16` and `DrawDiagonalGrave_1to16`:
|
||||
- Hardcoded `size + 6` and 5 iterations (why?)
|
||||
- Coordinate formula `obj.y_ + (i - s)` can produce negative Y
|
||||
- No bounds checking
|
||||
- Only uses 4 tiles from larger span
|
||||
|
||||
#### B3. CustomDraw and DoorSwitcherer Stubs
|
||||
**File:** `src/zelda3/dungeon/object_drawer.cc`
|
||||
- Lines 524-532: `CustomDraw` - only draws first tile
|
||||
- Lines 566-575: `DrawDoorSwitcherer` - only draws first tile
|
||||
|
||||
#### B4. Unknown Object Names (30+ items)
|
||||
**File:** `src/zelda3/dungeon/room_object.h`
|
||||
|
||||
See `gemini-dungeon-system-reference.md` section 7 for full list of objects needing in-game verification.
|
||||
|
||||
---
|
||||
|
||||
### Category C: Already Complete (Verification Only)
|
||||
|
||||
#### C1. Tile16Editor Undo/Redo - COMPLETE
|
||||
**File:** `src/app/editor/overworld/tile16_editor.cc`
|
||||
- `SaveUndoState()` at lines 547, 1476, 1511, 1546, 1586, 1620
|
||||
- `Undo()` / `Redo()` at lines 1707-1760
|
||||
- Ctrl+Z/Ctrl+Y at lines 224-231
|
||||
- UI button at line 1101
|
||||
|
||||
**No work needed** - just verify it works.
|
||||
|
||||
#### C2. Entity Deletion Pattern - CORRECT
|
||||
**File:** `src/app/editor/overworld/entity.cc` line 319
|
||||
|
||||
The TODO comment is misleading. The `deleted` flag pattern IS correct for ROM editors:
|
||||
- Entities at fixed ROM offsets can't be "removed"
|
||||
- `entity_operations.cc` reuses deleted slots
|
||||
- Just clarify the comment if desired
|
||||
|
||||
---
|
||||
|
||||
## Prioritized Task List
|
||||
|
||||
### Phase 1: High Impact (45-60 min)
|
||||
1. **A1** - Texture queueing (6 TODOs) - Prevents UI freezes
|
||||
2. **B1** - BothBG dual-layer stubs (4 routines) - Completes dungeon rendering
|
||||
|
||||
### Phase 2: Medium Impact (30-45 min)
|
||||
3. **A3** - Entity popup static variable bug - Fixes data corruption
|
||||
4. **B2** - Diagonal routine logic - Fixes rendering artifacts
|
||||
|
||||
### Phase 3: Polish (30+ min)
|
||||
5. **A2** - Implement Undo/Redo for OverworldEditor
|
||||
6. **A4** - Connect exit editor UI to data
|
||||
7. **B3** - Implement CustomDraw/DoorSwitcherer
|
||||
|
||||
### Stretch Goals
|
||||
8. **B4** - Verify unknown object names (requires game testing)
|
||||
9. E2E cinematic tests (see `docs/internal/testing/dungeon-gui-test-design.md`)
|
||||
|
||||
---
|
||||
|
||||
## Code Patterns
|
||||
|
||||
### Texture Queue (Use This!)
|
||||
```cpp
|
||||
gfx::Arena::Get().QueueTextureCommand(gfx::TextureCommand{
|
||||
.operation = gfx::TextureOperation::kCreate, // or kUpdate
|
||||
.bitmap = &bitmap_,
|
||||
.priority = gfx::TexturePriority::kHigh
|
||||
});
|
||||
```
|
||||
|
||||
### Version-Aware Code
|
||||
```cpp
|
||||
auto version = OverworldVersionHelper::GetVersion(*rom_);
|
||||
if (OverworldVersionHelper::SupportsAreaEnum(version)) {
|
||||
// v3+ only
|
||||
}
|
||||
```
|
||||
|
||||
### Error Handling
|
||||
```cpp
|
||||
absl::Status MyFunction() {
|
||||
ASSIGN_OR_RETURN(auto data, LoadData());
|
||||
RETURN_IF_ERROR(ProcessData(data));
|
||||
return absl::OkStatus();
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Validation
|
||||
|
||||
```bash
|
||||
# After each change
|
||||
cmake --build build_gemini -j8 --target yaze
|
||||
ctest --test-dir build_gemini -L stable -j4 --output-on-failure
|
||||
|
||||
# Before finishing
|
||||
cmake --build build_gemini --target format-check
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Success Metrics
|
||||
|
||||
- [ ] `grep "TODO.*texture" src/app/editor/overworld/overworld_editor.cc` returns nothing
|
||||
- [ ] BothBG routines accept both buffer parameters
|
||||
- [ ] Static variable bug in entity popups fixed
|
||||
- [ ] `ctest -L stable` passes 100%
|
||||
- [ ] Code formatted
|
||||
|
||||
---
|
||||
|
||||
## File Quick Reference
|
||||
|
||||
| System | Key Files |
|
||||
|--------|-----------|
|
||||
| Overworld Editor | `src/app/editor/overworld/overworld_editor.cc` (3,204 lines) |
|
||||
| Entity UI | `src/app/editor/overworld/entity.cc` (491 lines) |
|
||||
| Tile16 Editor | `src/app/editor/overworld/tile16_editor.cc` (2,584 lines) |
|
||||
| Object Drawer | `src/zelda3/dungeon/object_drawer.cc` (972 lines) |
|
||||
| Room Object | `src/zelda3/dungeon/room_object.h` (633 lines) |
|
||||
Reference in New Issue
Block a user