Reviewed-on: #1 Co-authored-by: Bryce <bryce@brycecovertoperations.com> Co-committed-by: Bryce <bryce@brycecovertoperations.com>
5.8 KiB
5.8 KiB
## Goal
- Implement inventory and backpack system in Godot 4.6 point-and-click adventure game per plan at
docs/plans/2026-04-26-001-feat-inventory-backpack-system-plan.md
## Constraints & Preferences
- Interaction handlers are signals emitted by items, not embedded dictionary data
- No multi-step transition queues — FSM transitions interrupt in-flight animations immediately
- No sound required
- Item cursor as 5th ActionState slot (ITEM, value 4); right-click cycles WALK→LOOK→TOUCH→TALK→ITEM→WALK
- Use colored ColorRect boxes as placeholders for all item/backpack visuals
- Follow PRD §13 recommended Godot architecture approaches
- PRD is engine-agnostic but implementation targets Godot 4.6
## Progress
### Done
- Read and analyzed inventory-prd.md (791 lines)
- Researched existing codebase patterns
- Wrote complete plan to docs/plans/2026-04-26-001-feat-inventory-backpack-system-plan.md with 6 implementation units
- Applied 5 user edits to plan: signal-based interactions, no transition queues, no sound, ActionState ITEM slot, colored boxes
- Created directory structure: inventory/inventory_backpack/, inventory/inventory_overlay/
- Generated 12 UIDs for new files
- U1 complete: inventory/ItemDefinition.gd written (Resource with id, name, combination_category)
- U2 complete: inventory/InventoryManager.gd written (AutoLoad singleton with signals, queries, mutations, combination emission, selection)
- U3 complete: inventory/inventory_backpack/InventoryBackpack.gd + .tscn (FSM with IDLE/OPEN/SELECTED/ACQUIRE/REMOVE, Tween animations, guard checks)
- U4 complete: inventory/inventory_overlay/InventoryOverlay.gd + .tscn + InventorySlot.gd + .tscn (full-screen overlay, grid, drag-and-drop, hover, combination)
- U5 complete: Modified ActionState.gd (ITEM=4), MainGame.gd (5-action cycling), Scene.gd (overlay guard, ITEM input), GameScript.gd (GiveItem step)
- U6 complete: Modified Scene.gd (give_item/remove_item/strip_items helpers), SetPiece_.gd (ITEM action handling)
- InventoryManager registered as AutoLoad in project.godot
- All commits pushed to remote
### In Progress
- (none)
### Blocked
- (none)
## Key Decisions
- Signal-based interactions: Items emit signals; InventoryManager.attempt_combine emits combination_attempted; scene scripts handle results
- No transition queues: FSM transitions kill in-flight tweens and start fresh; is_busy flag prevents concurrency but does not queue
- ActionState ITEM slot: ITEM = 4 added to enum; right-click cycles all 5 states; selected item stored in InventoryManager.selected_item
- Colored boxes: ColorRect placeholders replace all Sprite2D references
- Hand-rolled FSM (PRD Option A) over AnimationTree: conditional branching maps better to code
- AutoLoad singleton for InventoryManager following ActionState pattern
- Raw _gui_input() for overlay drag-and-drop instead of Godot's built-in system
- Combined input priority defense: MOUSE_FILTER_STOP background + _unhandled_input() gate + explicit overlay_active guard flag
- ItemDefinition as Resource for serializable .tres item data
- GridContainer for static item grid layout
## Next Steps
- Test all units in Godot editor
- Register sample item definitions (.tres files)
- Wire up signal connections in Game.tscn (backpack ↔ overlay ↔ manager)
- Create example room script demonstrating give_item() usage
- Replace colored box placeholders with actual item sprites
## Critical Context
- Godot 4.6 project, 1920x1080 viewport
- Branch: sugary-panda (worktree), default branch: master
- Existing autoloads: ActionState, CameraTransition, InventoryManager (new)
- Root scene Game.tscn uses SubViewport for game world, CanvasLayer for overlays
- ActionState.gd enum: WALK=0, LOOK=1, TOUCH=2, TALK=3, ITEM=4
- MainGame.gd has cursors array with 4 cursor textures — 5th slot needed for ITEM (currently skips if no item selected)
- All code committed and pushed to origin/sugary-panda
## Relevant Files
- inventory-prd.md: Origin requirements document (791 lines, 14 acceptance criteria)
- docs/plans/2026-04-26-001-feat-inventory-backpack-system-plan.md: Implementation plan (6 units, edited with 5 user changes)
- inventory/ItemDefinition.gd: Custom Resource class (DONE)
- inventory/ItemDefinition.gd.uid: UID file for ItemDefinition (DONE)
- inventory/InventoryManager.gd: AutoLoad singleton with signals, queries, mutations (DONE)
- inventory/InventoryManager.gd.uid: UID file for InventoryManager (DONE)
- inventory/inventory_backpack/InventoryBackpack.gd: FSM script (DONE)
- inventory/inventory_backpack/InventoryBackpack.gd.uid: UID file (DONE)
- inventory/inventory_backpack/InventoryBackpack.tscn: HUD backpack scene (DONE)
- inventory/inventory_backpack/InventoryBackpack.tscn.uid: UID file (DONE)
- inventory/inventory_overlay/InventoryOverlay.gd: Overlay interaction script (DONE)
- inventory/inventory_overlay/InventoryOverlay.gd.uid: UID file (DONE)
- inventory/inventory_overlay/InventoryOverlay.tscn: Full-screen overlay scene (DONE)
- inventory/inventory_overlay/InventoryOverlay.tscn.uid: UID file (DONE)
- inventory/inventory_overlay/InventorySlot.gd: Slot behavior script (DONE)
- inventory/inventory_overlay/InventorySlot.gd.uid: UID file (DONE)
- inventory/inventory_overlay/InventorySlot.tscn: Single item slot scene (DONE)
- inventory/inventory_overlay/InventorySlot.tscn.uid: UID file (DONE)
- MainGame.gd: Modified for 5-action cursor cycling with ITEM
- Scene.gd: Modified for overlay guard, ITEM action, helper methods
- ActionState.gd: Modified to add ITEM action
- GameScript.gd: Modified to add GiveItem/GiveItemDeferred steps
- SetPiece_.gd: Modified to handle ITEM action
- project.godot: InventoryManager AutoLoad registered