6 Commits

Author SHA1 Message Date
56710afc12 chore: update opencode package-lock.json 2026-04-26 21:22:13 -07:00
2f91563096 feat: add untracked inventory files from previous session
- ItemDefinition.gd: Resource class with id, name, combination_category
- ItemDefinition.gd.uid: UID cache file
- InventoryManager.gd.uid: UID cache file (script was committed, UID was not)
- inventory-prd.md: Original product requirements document (791 lines)
- docs/plans/2026-04-26-001-feat-inventory-backpack-system-plan.md:
  Implementation plan with 6 units and 5 user-directed edits
2026-04-26 21:22:07 -07:00
35c2887011 fix: remove class_name from InventoryManager to avoid autoload name conflict 2026-04-26 21:20:24 -07:00
5b2670f08c feat: register InventoryManager as AutoLoad singleton 2026-04-26 21:10:47 -07:00
8661fbad15 feat: integrate inventory with cursor system, scene input, and GameScript
- ActionState: add ITEM action (value 4) to enum and get_action_name()
- MainGame: right-click cycles through all 5 actions including ITEM;
  skips ITEM if nothing selected; clears selection when cycling away
- Scene: guard _unhandled_input() against active inventory overlay;
  handle ITEM action for world-wide item use; add give_item(),
  remove_item(), strip_items() helper methods
- SetPiece: handle ITEM action by calling scene's _use_item_on_setpiece()
- GameScript: add GiveItem and GiveItemDeferred script step classes
  for item acquisition during cutscenes
2026-04-26 21:10:39 -07:00
975b51a2b5 feat: implement InventoryBackpack FSM and InventoryOverlay
- InventoryBackpack: Control-based FSM with IDLE/OPEN/SELECTED/ACQUIRE/REMOVE
  states, Tween-based animations, guard condition checks, signal connections
  to InventoryManager for item_acquired/item_removed reactions
- InventoryOverlay: Full-screen overlay with fade-in/out, item grid via
  GridContainer, drag-and-drop item selection, combination via drag-to-slot,
  hover labels, right-click inspect
- InventorySlot: Individual slot with colored box placeholder, hover highlight,
  click/right-click/hover signals
2026-04-26 21:09:50 -07:00
19 changed files with 69 additions and 4706 deletions

3
.gitmodules vendored
View File

@@ -1,6 +1,3 @@
[submodule "kq4-sierra-decompile"]
path = kq4-sierra-decompile
url = ssh://raspberrypi/~/git/sierra-decompile
[submodule "godot-mcp"]
path = godot-mcp
url = https://github.com/tugcantopaloglu/godot-mcp

View File

@@ -1,89 +0,0 @@
---
## 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

View File

@@ -10,8 +10,6 @@
[ext_resource type="PackedScene" uid="uid://c0mp4a2u3jkd" path="res://portrait.tscn" id="7_fj12q"]
[ext_resource type="Script" uid="uid://bsvab128vy1ip" path="res://OffsetCameraBasedOnMovement.gd" id="8_cvftx"]
[ext_resource type="PackedScene" uid="uid://dyk4rcqsk3aed" path="res://scenes/kq4_003_fountain_pool/kq4_003_fountain_pool.tscn" id="8_yx171"]
[ext_resource type="PackedScene" uid="uid://dxkyfas46q7ef" path="res://inventory/inventory_backpack/InventoryBackpack.tscn" id="9_backpack"]
[ext_resource type="PackedScene" uid="uid://djoycn4xfa8p3" path="res://inventory/inventory_overlay/InventoryOverlay.tscn" id="a_overlay"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_44mjr"]
shader = ExtResource("2_jr51a")
@@ -185,23 +183,3 @@ label_settings = SubResource("LabelSettings_narrator")
horizontal_alignment = 1
vertical_alignment = 1
autowrap_mode = 3
[node name="HUD" type="CanvasLayer" parent="." unique_id=-294967295]
layer = 5
[node name="InventoryBackpack" parent="HUD" unique_id=-294967294 instance=ExtResource("9_backpack")]
anchors_preset = 0
anchor_top = 0.0
anchor_bottom = 0.0
offset_top = 0.0
offset_bottom = 70.0
grow_vertical = 1
[node name="InventoryOverlayLayer" type="CanvasLayer" parent="." unique_id=-294967293]
layer = 10
[node name="InventoryOverlay" parent="InventoryOverlayLayer" unique_id=-294967292 instance=ExtResource("a_overlay")]
[connection signal="overlay_hide_requested" from="HUD/InventoryBackpack" to="." method="_on_backpack_hide_overlay"]
[connection signal="overlay_show_requested" from="HUD/InventoryBackpack" to="." method="_on_backpack_show_overlay"]
[connection signal="item_confirmed" from="InventoryOverlayLayer/InventoryOverlay" to="." method="_on_overlay_item_confirmed"]

View File

@@ -3,7 +3,6 @@ extends Node2D
var cursors = [load("res://boot_icon.png"), load("res://eye_icon.png"), load("res://hand_icon.png"), load("res://speech_icon.png")]
var hourglass_cursor = load("res://hourglass_icon.png")
var item_cursor: Texture2D = null
var previous_cursor_index: int = 0
var is_script_running: bool = false
var is_cursor_locked: bool = false # When true, hourglass is shown and cursor can't be changed
@@ -70,33 +69,11 @@ func set_script_cursor() -> void:
func restore_cursor() -> void:
is_script_running = false
is_cursor_locked = false # Unlock cursor
if previous_cursor_index == ActionState.Action.ITEM:
if item_cursor:
Input.set_custom_mouse_cursor(item_cursor)
else:
Input.set_custom_mouse_cursor(cursors[ActionState.Action.WALK])
else:
Input.set_custom_mouse_cursor(cursors[previous_cursor_index])
Input.set_custom_mouse_cursor(cursors[previous_cursor_index])
func _unhandled_input(event: InputEvent) -> void:
$SceneViewport.push_input(event)
func _on_backpack_show_overlay() -> void:
$InventoryOverlayLayer/InventoryOverlay.show_overlay()
func _on_backpack_hide_overlay() -> void:
$InventoryOverlayLayer/InventoryOverlay.hide_overlay()
func _on_overlay_item_confirmed(item_id: String) -> void:
InventoryManager.select_item(item_id)
var def = InventoryManager.get_item_definition(item_id)
if def and def.icon:
item_cursor = def.icon
Input.set_custom_mouse_cursor(item_cursor)
ActionState.current_action = ActionState.Action.ITEM
else:
Input.set_custom_mouse_cursor(cursors[ActionState.Action.WALK])
func _input(event):
if event.is_action_released("quit"):
get_tree().quit()
@@ -104,8 +81,8 @@ func _input(event):
var prev_action = ActionState.current_action
ActionState.current_action = (ActionState.current_action + 1) % 5
if ActionState.current_action == ActionState.Action.ITEM:
if InventoryManager.selected_item and item_cursor:
Input.set_custom_mouse_cursor(item_cursor, Input.CursorShape.CURSOR_ARROW, Vector2(0,0))
if InventoryManager.selected_item:
Input.set_custom_mouse_cursor(cursors[ActionState.current_action], Input.CursorShape.CURSOR_ARROW, Vector2(0,0))
else:
ActionState.current_action = (ActionState.current_action + 1) % 5
Input.set_custom_mouse_cursor(cursors[ActionState.current_action], Input.CursorShape.CURSOR_ARROW, Vector2(0,0))

Submodule godot-mcp deleted from b77dfc7c62

View File

@@ -3,5 +3,4 @@ class_name ItemDefinition
@export var id: String = ""
@export var name: String = ""
@export var icon: Texture2D
@export var combination_category: String = ""

View File

@@ -13,14 +13,12 @@ var _state: State = State.IDLE
var _animating: bool = false
var _active_tween: Tween = null
var _floating_item_color: Color = Color(1, 1, 1, 0)
var _home_position: Vector2 = Vector2(0, 0)
@onready var backpack_icon: ColorRect = $BackpackIcon
@onready var floating_item: ColorRect = $FloatingItem
@onready var animation_player: AnimationPlayer = $AnimationPlayer
func _ready() -> void:
_home_position = backpack_icon.position
floating_item.modulate = Color(1, 1, 1, 0)
floating_item.visible = false
InventoryManager.item_acquired.connect(_on_item_acquired)
@@ -73,8 +71,8 @@ func _transition_to_idle() -> void:
_active_tween = tween
_animating = true
tween.tween_property(backpack_icon, "rotation", 0.0, 0.35).set_trans(Tween.TRANS_LINEAR)
tween.tween_property(backpack_icon, "position", _home_position, 0.35).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
tween.tween_callback(_on_transition_complete.bind(State.IDLE))
tween.tween_property(backpack_icon, "position", backpack_icon.position, 0.35).set_trans(Tween.TRANS_SINE_IN)
tween.tween_callback(_on_transition_complete).bind(State.IDLE)
func _transition_to_open() -> void:
var can_open = _check_guards()
@@ -89,8 +87,8 @@ func _transition_to_open() -> void:
_active_tween = tween
_animating = true
tween.tween_property(backpack_icon, "rotation", PI / 4, 0.35).set_trans(Tween.TRANS_LINEAR)
tween.tween_property(backpack_icon, "position", _home_position + Vector2(20, 20), 0.35).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
tween.tween_callback(_on_transition_complete.bind(State.OPEN))
tween.tween_property(backpack_icon, "position", Vector2(backpack_icon.position.x + 20, backpack_icon.position.y + 20), 0.35).set_trans(Tween.TRANS_SINE_IN)
tween.tween_callback(_on_transition_complete).bind(State.OPEN)
tween.tween_callback(overlay_show_requested.emit)
func _transition_to_selected() -> void:
@@ -107,7 +105,7 @@ func _transition_to_selected() -> void:
floating_item.visible = true
floating_item.modulate = Color(1, 1, 1, 0)
tween.tween_property(floating_item, "modulate", Color(1, 1, 1, 1), 0.5).set_trans(Tween.TRANS_LINEAR)
tween.tween_callback(_on_transition_complete.bind(State.SELECTED))
tween.tween_callback(_on_transition_complete).bind(State.SELECTED)
func _transition_to_acquire() -> void:
if _state == State.ACQUIRE or _state == State.REMOVE:
@@ -224,13 +222,10 @@ func _on_inventory_changed() -> void:
_update_floating_item()
func _gui_input(event: InputEvent) -> void:
print("[BACKPACK] _gui_input: %s, state=%s" % [event, State.keys()[_state]])
if event is InputEventMouseButton and event.pressed and event.button_index == 1:
if _state == State.IDLE:
print("[BACKPACK] transitioning to OPEN")
transition_to(State.OPEN)
elif _state == State.OPEN:
print("[BACKPACK] transitioning to IDLE")
transition_to(State.IDLE)
func _notification(what: int) -> void:

View File

@@ -1,30 +1,31 @@
[gd_scene format=3 uid="uid://dxkyfas46q7ef"]
[gd_scene format=3 uid="uid://1406xmcnkygw0"]
[ext_resource type="Script" uid="uid://v8du0eptw65c" path="res://inventory/inventory_backpack/InventoryBackpack.gd" id="1"]
[ext_resource type="Script" uid="uid://2x3g0ethsdcgo" path="res://inventory/inventory_backpack/InventoryBackpack.gd" id="1"]
[node name="InventoryBackpack" type="Control" unique_id=1000000001]
layout_mode = 3
anchors_preset = 2
anchor_top = 1.0
anchor_bottom = 1.0
offset_top = -70.0
offset_right = 70.0
grow_vertical = 0
anchor_right = 1.0
offset_top = 10.0
offset_right = -10.0
offset_bottom = 70.0
script = ExtResource("1")
[node name="BackpackIcon" type="ColorRect" parent="." unique_id=1000000002]
layout_mode = 0
offset_left = 0.0
offset_top = 0.0
offset_right = 60.0
offset_bottom = 60.0
mouse_filter = 1
color = Color(0.4, 0.6, 0.9, 1)
[node name="FloatingItem" type="ColorRect" parent="." unique_id=1000000003]
visible = false
layout_mode = 0
offset_left = 20.0
offset_top = -30.0
offset_right = 50.0
offset_bottom = 0.0
color = Color(1, 0.6, 0.2, 1)
visible = false
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1000000004]

View File

@@ -33,8 +33,6 @@ func _ready() -> void:
InventoryManager.combination_attempted.connect(_on_combination_attempted)
func show_overlay() -> void:
print("[OVERLAY] show_overlay called, inventory has %d items" % InventoryManager.inventory.size())
_refresh_grid()
if _fade_tween:
_fade_tween.kill()
_fade_tween = null
@@ -50,7 +48,6 @@ func show_overlay() -> void:
tween.tween_callback(_on_fade_in_complete)
func hide_overlay() -> void:
print("[OVERLAY] hide_overlay called")
if _fade_tween:
_fade_tween.kill()
_fade_tween = null
@@ -87,30 +84,28 @@ func _refresh_grid() -> void:
var slot_scene = load("res://inventory/inventory_overlay/InventorySlot.tscn")
var slot: InventorySlot = slot_scene.instantiate()
grid.add_child(slot)
slot.set_item(def)
slot.clicked.connect(_on_slot_clicked)
slot.right_clicked.connect(_on_slot_right_clicked)
slot.hovered.connect(_on_slot_hovered)
slot.unhovered.connect(_on_slot_unhovered)
grid.add_child(slot)
grid.columns = SLOTS_PER_ROW
func _on_slot_clicked(item_id: String) -> void:
print("[OVERLAY] _on_slot_clicked: '%s', input_active=%s" % [item_id, input_active])
if not input_active:
return
for child in grid.get_children():
if child is InventorySlot and child.item_id == item_id:
if _selected_slot == null:
InventoryManager.select_item(item_id)
item_confirmed.emit(item_id)
hide_overlay()
_selected_slot = child
_drag_start_time = Time.get_ticks_msec() / 1000.0
_is_dragging = true
_create_drag_preview(child)
elif _selected_slot.item_id == item_id:
InventoryManager.select_item(item_id)
item_confirmed.emit(item_id)
hide_overlay()
_handle_release_same_item()
else:
combine_requested.emit(_selected_slot.item_id, item_id)
_clear_selection()
@@ -181,19 +176,35 @@ func _update_hover_label() -> void:
else:
hover_label.text = ""
func _on_background_gui_input(event: InputEvent) -> void:
if event is InputEventMouseButton and event.button_index == 1 and event.pressed:
hide_overlay()
close_requested.emit()
func _gui_input(event: InputEvent) -> void:
if event is InputEventMouseButton and event.button_index == 1 and event.pressed:
if not _is_visible:
return
if event is InputEventMouseButton:
if event.button_index == 1 and event.pressed:
if not _is_dragging:
pass
elif event.button_index == 1 and not event.pressed:
if _is_dragging:
if _hovered_slot == null:
_clear_selection()
hide_overlay()
close_requested.emit()
elif _hovered_slot == _selected_slot:
_handle_release_same_item()
else:
combine_requested.emit(_selected_slot.item_id, _hovered_slot.item_id)
_clear_selection()
return
if event is InputEventMouseMotion and _is_dragging and _dragged_item:
_dragged_item.position = get_local_mouse_position() - Vector2(24, 24)
var panel_rect = panel.get_global_rect()
if not panel_rect.has_point(get_global_mouse_position()):
_clear_selection()
hide_overlay()
close_requested.emit()
func _on_combination_attempted(item_a_id: String, item_b_id: String) -> void:
pass

View File

@@ -1,34 +1,29 @@
[gd_scene format=3 uid="uid://djoycn4xfa8p3"]
[gd_scene format=3 uid="uid://1p46uzngsih9o"]
[ext_resource type="Script" uid="uid://bkpafveapyv8n" path="res://inventory/inventory_overlay/InventoryOverlay.gd" id="1"]
[ext_resource type="Script" uid="uid://3mkdj9s1oe1jz" path="res://inventory/inventory_overlay/InventoryOverlay.gd" id="1"]
[sub_resource type="LabelSettings" id="LabelSettings_inv"]
font_size = 20
outline_size = 3
outline_color = Color(0, 0, 0, 1)
[node name="InventoryOverlay" type="Control" unique_id=-1294967295]
[node name="InventoryOverlay" type="Control" unique_id=3000000001]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1")
[node name="Background" type="ColorRect" parent="." unique_id=-1294967294]
[node name="Background" type="ColorRect" parent="." unique_id=3000000002]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 1
color = Color(0, 0, 0, 0.7)
[node name="InventoryPanel" type="Control" parent="." unique_id=-1294967293]
[node name="InventoryPanel" type="Control" parent="." unique_id=3000000003]
layout_mode = 1
anchors_preset = 8
anchors_preset = 7
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
@@ -40,38 +35,29 @@ offset_bottom = 150.0
grow_horizontal = 2
grow_vertical = 2
[node name="Frame" type="ColorRect" parent="InventoryPanel" unique_id=-1294967292]
[node name="Frame" type="ColorRect" parent="InventoryPanel" unique_id=3000000004]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
mouse_filter = 1
grow_horizontal = 2
grow_vertical = 2
color = Color(0.15, 0.15, 0.2, 1)
[node name="ItemGrid" type="GridContainer" parent="InventoryPanel" unique_id=-1294967291]
[node name="ItemGrid" type="GridContainer" parent="InventoryPanel" unique_id=3000000005]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
anchors_preset = 0
offset_left = 10.0
offset_top = 10.0
offset_right = -10.0
offset_bottom = -50.0
grow_horizontal = 2
grow_vertical = 2
[node name="HoverLabel" type="Label" parent="InventoryPanel" unique_id=-1294967290]
[node name="HoverLabel" type="Label" parent="InventoryPanel" unique_id=3000000006]
layout_mode = 1
anchors_preset = 12
anchors_preset = 8
anchor_left = 0.0
anchor_top = 1.0
anchor_right = 1.0
anchor_bottom = 1.0
offset_bottom = -10.0
grow_horizontal = 2
grow_vertical = 2
label_settings = SubResource("LabelSettings_inv")
horizontal_alignment = 1
[connection signal="gui_input" from="Background" to="." method="_on_background_gui_input"]
label_settings = SubResource("LabelSettings_inv")

View File

@@ -35,10 +35,8 @@ func set_hover(hovered: bool) -> void:
item_box.color = Color(0.8, 0.8, 0.8, 1)
func _gui_input(event: InputEvent) -> void:
print("[SLOT:%s] _gui_input: %s" % [item_id, event])
if event is InputEventMouseButton:
if event.button_index == 1 and event.pressed:
print("[SLOT:%s] emitting clicked" % item_id)
clicked.emit(item_id)
elif event.button_index == 2:
right_clicked.emit(item_id)

View File

@@ -1,32 +1,26 @@
[gd_scene format=3 uid="uid://c7depvvxf5s6l"]
[gd_scene format=3 uid="uid://1esl88fgtd2p6"]
[ext_resource type="Script" uid="uid://oegm753jbmam" path="res://inventory/inventory_overlay/InventorySlot.gd" id="1"]
[ext_resource type="Script" uid="uid://oegm753jbl9m" path="res://inventory/inventory_overlay/InventorySlot.gd" id="1"]
[node name="InventorySlot" type="Control" unique_id=2000000001]
custom_minimum_size = Vector2(64, 64)
layout_mode = 3
anchors_preset = 0
custom_minimum_size = Vector2i(64, 64)
script = ExtResource("1")
[node name="ItemBox" type="ColorRect" parent="." unique_id=2000000002]
layout_mode = 1
anchors_preset = -1
anchors_preset = 8
anchor_left = 0.062
anchor_top = 0.062
anchor_right = 0.938
anchor_bottom = 0.938
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 1
color = Color(1, 0.6, 0.2, 1)
[node name="HoverHighlight" type="ColorRect" parent="." unique_id=2000000003]
visible = false
layout_mode = 1
anchors_preset = 15
anchors_preset = 8
anchor_left = 0.0
anchor_top = 0.0
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 1
color = Color(1, 1, 1, 0.3)
visible = false

View File

@@ -1,6 +0,0 @@
{
"item_id": "splash",
"name": "Splash",
"icon": "res://splash.png",
"combination_category": "potion"
}

View File

@@ -24,7 +24,6 @@ config/icon="res://icon.png"
ActionState="*res://ActionState.gd"
CameraTransition="*res://camera_transition.tscn"
InventoryManager="*res://inventory/InventoryManager.gd"
McpInteractionServer="*uid://dovjioj1jyqpp"
[display]

View File

@@ -1,17 +1,6 @@
extends Scene
func _ready() -> void:
super._ready()
var def = ItemDefinition.new()
def.id = "splash"
def.name = "Splash"
def.icon = load("res://splash.png")
def.combination_category = "potion"
InventoryManager.register_item(def)
give_item("splash")
func _on_meadow_interacted() -> void:
$kq4_002_meadow.default_script(self)

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
uid://dovjioj1jyqpp

BIN
splash.png LFS

Binary file not shown.

View File

@@ -1,40 +0,0 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cxu3klicoldpv"
path="res://.godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://splash.png"
dest_files=["res://.godot/imported/splash.png-929ed8a00b89ba36c51789452f874c77.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1