8 Commits

Author SHA1 Message Date
374710ce61 fix: bind callbacks before passing to tween_callback, tighten backpack hitbox
- Godot 4's CallbackTweener doesn't have .bind() — move .bind() call
  inside tween_callback() for 3 callback sites
- Shrink InventoryBackpack Control to 60x60 (offset_right -70) so click
  area matches the visible BackpackIcon square
2026-04-26 21:46:55 -07:00
dd4bd87f90 fix: make inventory backpack visible by instancing in Game.tscn and fixing Tween API
- Add InventoryBackpack under HUD CanvasLayer (layer 5) in Game.tscn
- Add InventoryOverlay under InventoryOverlayLayer CanvasLayer (layer 10)
- Fix Tween.TRANS_SINE_IN -> .set_trans(TRANS_SINE).set_ease(EASE_IN) in
  InventoryBackpack.gd (Godot 4.6 split transition and easing APIs)
2026-04-26 21:46:03 -07:00
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
31 changed files with 422 additions and 4755 deletions

51
.beads/.gitignore vendored Normal file
View File

@@ -0,0 +1,51 @@
# Dolt database (managed by Dolt, not git)
dolt/
dolt-access.lock
# Runtime files
bd.sock
bd.sock.startlock
sync-state.json
last-touched
# Local version tracking (prevents upgrade notification spam after git ops)
.local_version
# Worktree redirect file (contains relative path to main repo's .beads/)
# Must not be committed as paths would be wrong in other clones
redirect
# Sync state (local-only, per-machine)
# These files are machine-specific and should not be shared across clones
.sync.lock
export-state/
# Ephemeral store (SQLite - wisps/molecules, intentionally not versioned)
ephemeral.sqlite3
ephemeral.sqlite3-journal
ephemeral.sqlite3-wal
ephemeral.sqlite3-shm
# Dolt server management (auto-started by bd)
dolt-server.pid
dolt-server.log
dolt-server.lock
dolt-server.port
dolt-server.activity
dolt-monitor.pid
# Backup data (auto-exported JSONL, local-only)
backup/
# Legacy files (from pre-Dolt versions)
*.db
*.db?*
*.db-journal
*.db-wal
*.db-shm
db.sqlite
bd.db
# NOTE: Do NOT add negation patterns here.
# They would override fork protection in .git/info/exclude.
# Config files (metadata.json, config.yaml) are tracked by git by default
# since no pattern above ignores them.

81
.beads/README.md Normal file
View File

@@ -0,0 +1,81 @@
# Beads - AI-Native Issue Tracking
Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code.
## What is Beads?
Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git.
**Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads)
## Quick Start
### Essential Commands
```bash
# Create new issues
bd create "Add user authentication"
# View all issues
bd list
# View issue details
bd show <issue-id>
# Update issue status
bd update <issue-id> --claim
bd update <issue-id> --status done
# Sync with Dolt remote
bd dolt push
```
### Working with Issues
Issues in Beads are:
- **Git-native**: Stored in Dolt database with version control and branching
- **AI-friendly**: CLI-first design works perfectly with AI coding agents
- **Branch-aware**: Issues can follow your branch workflow
- **Always in sync**: Auto-syncs with your commits
## Why Beads?
**AI-Native Design**
- Built specifically for AI-assisted development workflows
- CLI-first interface works seamlessly with AI coding agents
- No context switching to web UIs
🚀 **Developer Focused**
- Issues live in your repo, right next to your code
- Works offline, syncs when you push
- Fast, lightweight, and stays out of your way
🔧 **Git Integration**
- Automatic sync with git commits
- Branch-aware issue tracking
- Dolt-native three-way merge resolution
## Get Started with Beads
Try Beads in your own projects:
```bash
# Install Beads
curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash
# Initialize in your repo
bd init
# Create your first issue
bd create "Try out Beads"
```
## Learn More
- **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs)
- **Quick Start Guide**: Run `bd quickstart`
- **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples)
---
*Beads: Issue tracking that moves at the speed of thought*

54
.beads/config.yaml Normal file
View File

@@ -0,0 +1,54 @@
# Beads Configuration File
# This file configures default behavior for all bd commands in this repository
# All settings can also be set via environment variables (BD_* prefix)
# or overridden with command-line flags
# Issue prefix for this repository (used by bd init)
# If not set, bd init will auto-detect from directory name
# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc.
# issue-prefix: ""
# Use no-db mode: JSONL-only, no Dolt database
# When true, bd will use .beads/issues.jsonl as the source of truth
# no-db: false
# Enable JSON output by default
# json: false
# Feedback title formatting for mutating commands (create/update/close/dep/edit)
# 0 = hide titles, N > 0 = truncate to N characters
# output:
# title-length: 255
# Default actor for audit trails (overridden by BD_ACTOR or --actor)
# actor: ""
# Export events (audit trail) to .beads/events.jsonl on each flush/sync
# When enabled, new events are appended incrementally using a high-water mark.
# Use 'bd export --events' to trigger manually regardless of this setting.
# events-export: false
# Multi-repo configuration (experimental - bd-307)
# Allows hydrating from multiple repositories and routing writes to the correct database
# repos:
# primary: "." # Primary repo (where this database lives)
# additional: # Additional repos to hydrate from (read-only)
# - ~/beads-planning # Personal planning repo
# - ~/work-planning # Work planning repo
# JSONL backup (periodic export for off-machine recovery)
# Auto-enabled when a git remote exists. Override explicitly:
# backup:
# enabled: false # Disable auto-backup entirely
# interval: 15m # Minimum time between auto-exports
# git-push: false # Disable git push (export locally only)
# git-repo: "" # Separate git repo for backups (default: project repo)
# Integration settings (access with 'bd config get/set')
# These are stored in the database, not in this file:
# - jira.url
# - jira.project
# - linear.url
# - linear.api-key
# - github.org
# - github.repo

9
.beads/hooks/post-checkout Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env sh
# --- BEGIN BEADS INTEGRATION v0.59.0 ---
# This section is managed by beads. Do not remove these markers.
if command -v bd >/dev/null 2>&1; then
export BD_GIT_HOOK=1
bd hooks run post-checkout "$@"
_bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
fi
# --- END BEADS INTEGRATION v0.59.0 ---

9
.beads/hooks/post-merge Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env sh
# --- BEGIN BEADS INTEGRATION v0.59.0 ---
# This section is managed by beads. Do not remove these markers.
if command -v bd >/dev/null 2>&1; then
export BD_GIT_HOOK=1
bd hooks run post-merge "$@"
_bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
fi
# --- END BEADS INTEGRATION v0.59.0 ---

9
.beads/hooks/pre-commit Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env sh
# --- BEGIN BEADS INTEGRATION v0.59.0 ---
# This section is managed by beads. Do not remove these markers.
if command -v bd >/dev/null 2>&1; then
export BD_GIT_HOOK=1
bd hooks run pre-commit "$@"
_bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
fi
# --- END BEADS INTEGRATION v0.59.0 ---

9
.beads/hooks/pre-push Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env sh
# --- BEGIN BEADS INTEGRATION v0.59.0 ---
# This section is managed by beads. Do not remove these markers.
if command -v bd >/dev/null 2>&1; then
export BD_GIT_HOOK=1
bd hooks run pre-push "$@"
_bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
fi
# --- END BEADS INTEGRATION v0.59.0 ---

View File

@@ -0,0 +1,9 @@
#!/usr/bin/env sh
# --- BEGIN BEADS INTEGRATION v0.59.0 ---
# This section is managed by beads. Do not remove these markers.
if command -v bd >/dev/null 2>&1; then
export BD_GIT_HOOK=1
bd hooks run prepare-commit-msg "$@"
_bd_exit=$?; if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi
fi
# --- END BEADS INTEGRATION v0.59.0 ---

View File

7
.beads/metadata.json Normal file
View File

@@ -0,0 +1,7 @@
{
"database": "dolt",
"backend": "dolt",
"dolt_mode": "server",
"dolt_database": "ai_game_2",
"project_id": "16f0248d-5833-44e9-91cc-42afea26fd77"
}

1
.gitignore vendored
View File

@@ -14,4 +14,3 @@ tmp/**
tools/ora_editor/node_modules/*
node_modules/*
**/*.log
kq4-sierra-decompile/**

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,151 +0,0 @@
---
name: gitea-tea
description: Use tea CLI to create, manage, and checkout Gitea pull requests. Use this when opening a PR, managing PRs, or checking out PRs on the Gitea remote (gitea.story-basking.ts.net).
---
# Gitea Tea CLI Skill
This skill covers using `tea` (Gitea's official CLI) for pull request workflows in this project.
## When to Use This Skill
Use this skill when you need to:
- Create a PR from a working branch to master on the Gitea remote
- Open, list, or view PRs
- Checkout a PR locally for review or iteration
- Manage PR state (close, reopen, merge)
## Project Setup
The git remote is `origin` pointing to `git@gitea:notid/ai-game-2.git`. The repo slug is `notid/ai-game-2`.
In this project's environment:
- Gitea login is pre-configured for `gitea.story-basking.ts.net`
- Repo slug: `notid/ai-game-2`
- Target branch for PRs: `master`
- The git remote named `origin` points to this instance
## Key Flags
All tea subcommands support these flags for repo and auth context:
- `-r notid/ai-game-2` - Override repo slug (required when auto-discovery fails, e.g. in worktrees)
- `-R origin` - Discover Gitea login from a specific git remote
- `-l <username>` - Use a different Gitea login
In practice, you usually need just `-r notid/ai-game-2` on the subcommand you're running.
## Creating a PR
Use `tea pulls create` to open a PR from the current branch to master:
```bash
tea pulls create -r notid/ai-game-2 -b master -t "Title" -d "Body"
```
Common flags:
- `-t, --title` - PR title
- `-d, --description` - PR body/description (use heredoc or file for long descriptions)
- `-a, --assignees` - Comma-separated usernames to assign
- `-L, --labels` - Comma-separated labels to apply
- `-m, --milestone` - Milestone to assign
**Writing a multiline description:**
```bash
tea pulls create -r notid/ai-game-2 -b master \
-t "feat: add feature" \
-d "$(cat <<'EOF'
## Summary
- Bullet point one
- Bullet point two
EOF
)"
```
Or write the body to a temp file first and reference it.
## Listing PRs
```bash
tea pulls list -r notid/ai-game-2 # List open PRs
tea pulls list -r notid/ai-game-2 --state all # All PRs
tea pulls list -r notid/ai-game-2 --limit 10 -o simple # Limit output, simple format
```
## Opening a PR in Browser
```bash
tea open pr <number> -r notid/ai-game-2
tea open pr create -r notid/ai-game-2 # Open web UI to create a PR
```
## Checking Out a PR Locally
```bash
tea pulls checkout <number> -r notid/ai-game-2
```
This fetches and checks out the PR branch locally.
## Managing PR State
**Close a PR:**
```bash
tea pulls close <number> -r notid/ai-game-2 --confirm
```
**Reopen a closed PR:**
```bash
tea pulls reopen <number> -r notid/ai-game-2 --confirm
```
**Merge a PR:**
```bash
tea pulls merge <number> -r notid/ai-game-2 --confirm
```
**Edit a PR (title, description, etc.):**
```bash
tea pulls edit <number> -r notid/ai-game-2 -t "New title" -d "New body"
```
## Full PR Creation Workflow
1. Commit all changes on your branch:
```bash
git add . && git commit -m "describe the change"
```
2. Push the branch to origin:
```bash
git push origin <branch-name>
```
3. Create the PR with tea:
```bash
tea pulls create -r notid/ai-game-2 -b master \
-t "feat: description of change" \
-d "Detailed PR body here"
```
4. Open the PR in browser to verify:
```bash
tea open pr <number> -r notid/ai-game-2
```
## Worktree Gotcha
When running from a git worktree, tea may fail to auto-discover the repo. Always pass `-r notid/ai-game-2` explicitly in that case:
```bash
tea pulls list -r notid/ai-game-2 # Works in worktrees
tea pulls create -r notid/ai-game-2 ... # Works in worktrees
```
## Tips
- Always use `-r notid/ai-game-2` to specify the repo explicitly, especially in worktrees
- Use `-b master` to set the target branch (default may differ)
- The `--confirm` flag is required for destructive actions (close, merge)
- Use `-o simple`, `-o json`, `-o table`, etc. to control output format
- `tea whoami` verifies your authentication before running PR commands

108
AGENTS.md
View File

@@ -299,10 +299,116 @@ func _on_exit_interacted() -> void:
Do all work in a branch. Squash the branch before merging into master.
<!-- BEGIN BEADS INTEGRATION -->
## Issue Tracking with bd (beads)
**IMPORTANT**: This project uses **bd (beads)** for ALL issue tracking. Do NOT use markdown TODOs, task lists, or other tracking methods.
### Why bd?
- Dependency-aware: Track blockers and relationships between issues
- Git-friendly: Dolt-powered version control with native sync
- Agent-optimized: JSON output, ready work detection, discovered-from links
- Prevents duplicate tracking systems and confusion
### Quick Start
**Check for ready work:**
```bash
bd ready --json
```
**Create new issues:**
```bash
bd create "Issue title" --description="Detailed context" -t bug|feature|task -p 0-4 --json
bd create "Issue title" --description="What this issue is about" -p 1 --deps discovered-from:bd-123 --json
```
**Claim and update:**
```bash
bd update <id> --claim --json
bd update bd-42 --priority 1 --json
```
**Complete work:**
```bash
bd close bd-42 --reason "Completed" --json
```
### Issue Types
- `bug` - Something broken
- `feature` - New functionality
- `task` - Work item (tests, docs, refactoring)
- `epic` - Large feature with subtasks
- `chore` - Maintenance (dependencies, tooling)
### Priorities
- `0` - Critical (security, data loss, broken builds)
- `1` - High (major features, important bugs)
- `2` - Medium (default, nice-to-have)
- `3` - Low (polish, optimization)
- `4` - Backlog (future ideas)
### Workflow for AI Agents
1. **Check ready work**: `bd ready` shows unblocked issues
2. **Claim your task atomically**: `bd update <id> --claim`
3. **Work on it**: Implement, test, document
4. **Discover new work?** Create linked issue:
- `bd create "Found bug" --description="Details about what was found" -p 1 --deps discovered-from:<parent-id>`
5. **Complete**: `bd close <id> --reason "Done"`
### Auto-Sync
bd automatically syncs via Dolt:
- Each write auto-commits to Dolt history
- Use `bd dolt push`/`bd dolt pull` for remote sync
- No manual export/import needed!
### Important Rules
- ✅ Use bd for ALL task tracking
- ✅ Always use `--json` flag for programmatic use
- ✅ Link discovered work with `discovered-from` dependencies
- ✅ Check `bd ready` before asking "what should I work on?"
- ❌ Do NOT create markdown TODO lists
- ❌ Do NOT use external issue trackers
- ❌ Do NOT duplicate tracking systems
For more details, see README.md and docs/QUICKSTART.md.
## Landing the Plane (Session Completion)
**When ending a work session**, you MUST complete ALL steps below. Work is NOT complete until `git push` succeeds.
**MANDATORY WORKFLOW:**
1. **File issues for remaining work** - Create issues for anything that needs follow-up
2. **Run quality gates** (if code changed) - Tests, linters, builds
3. **Update issue status** - Close finished work, update in-progress items
4. **PUSH TO REMOTE** - This is MANDATORY:
```bash
git pull --rebase
bd sync
git push
git status # MUST show "up to date with origin"
```
5. **Clean up** - Clear stashes, prune remote branches
6. **Verify** - All changes committed AND pushed
7. **Hand off** - Provide context for next session
**CRITICAL RULES:**
- Work is NOT complete until `git push` succeeds
- NEVER stop before pushing - that leaves work stranded locally
- NEVER say "ready to push when you are" - YOU must push
- If push fails, resolve and retry until it succeeds
<!-- END BEADS INTEGRATION -->

View File

@@ -190,18 +190,17 @@ autowrap_mode = 3
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
anchors_preset = 12
anchor_top = 1.0
anchor_bottom = 1.0
offset_top = -64.65503
offset_bottom = -4.654907
grow_vertical = 0
[node name="InventoryOverlayLayer" type="CanvasLayer" parent="." unique_id=-294967293]
layer = 10
visible = false
[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"]
grow_horizontal = 2
grow_vertical = 2

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,7 +71,7 @@ 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_property(backpack_icon, "position", backpack_icon.position, 0.35).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
tween.tween_callback(_on_transition_complete.bind(State.IDLE))
func _transition_to_open() -> void:
@@ -89,7 +87,7 @@ 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_property(backpack_icon, "position", Vector2(backpack_icon.position.x + 20, backpack_icon.position.y + 20), 0.35).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN)
tween.tween_callback(_on_transition_complete.bind(State.OPEN))
tween.tween_callback(overlay_show_requested.emit)
@@ -224,13 +222,12 @@ 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:
print("OBTAINED")
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 = -70.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