246 lines
7.1 KiB
Markdown
246 lines
7.1 KiB
Markdown
# 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) |
|