Compare commits

..

45 Commits

Author SHA1 Message Date
9fc5a16ecd fix: handle ITEM cursor index in restore_cursor and remove duplicate 2026-04-26 22:37:31 -07:00
2cdbafe3bd fix: wire item_confirmed signal and set item cursor icon 2026-04-26 22:35:07 -07:00
b87c574b76 fix: set Background to MOUSE_FILTER_PASS so clicks reach panel children 2026-04-26 22:29:51 -07:00
f291f4bc25 fix: restore show_overlay and hide_overlay bodies (edit merged them) 2026-04-26 22:28:40 -07:00
4fa09e6769 debug: add logging to inventory overlay and backpack for click debugging 2026-04-26 22:26:22 -07:00
3393db5020 fix: set Frame mouse_filter to PASS so clicks reach inventory slots 2026-04-26 22:25:36 -07:00
221b1e2fd6 fix: set ItemBox mouse_filter to PASS so clicks reach InventorySlot 2026-04-26 22:24:25 -07:00
d98f0bb349 fix: single-click selects item and closes overlay 2026-04-26 22:23:31 -07:00
07e73ef741 fix: add slot to grid before calling set_item so @onready nodes exist 2026-04-26 22:21:54 -07:00
61a9649ec9 fix: refresh inventory grid when overlay opens 2026-04-26 22:20:19 -07:00
fad90a73e9 feat: add example splash item for inventory testing 2026-04-26 22:18:43 -07:00
1cc74d4e59 fix: backpack icon returns to home position when overlay closes 2026-04-26 22:16:47 -07:00
82c5aa0bfa fix: connect Background gui_input to close overlay on outside click 2026-04-26 22:04:43 -07:00
652d1e5fdc fix: clicking outside inventory panel closes overlay 2026-04-26 21:54:11 -07:00
79f152f161 fix: correct overlay node path in MainGame signal handlers 2026-04-26 21:53:33 -07:00
88b4ce3e14 fix: wire backpack signals to root Node2D instead of HUD CanvasLayer 2026-04-26 21:52:51 -07:00
09b96360f8 fix: wire backpack signals and simplify positioning
- Connect overlay_show_requested/overlay_hide_requested signals in Game.tscn
  to new handlers in MainGame.gd that call show_overlay()/hide_overlay()
- Simplify backpack to fixed 70x70 position at top-left (layout_mode=0)
- Remove broken anchor overrides from Game.tscn that were anchoring to bottom
2026-04-26 21:51:16 -07:00
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
1465104b98 merged 2026-04-22 23:04:44 -07:00
5ae9ff1f17 changes 2026-04-22 22:38:53 -07:00
0ec2f52172 interior 2026-04-18 12:32:13 -07:00
18bfeb9bcc cleans up connections 2026-04-18 12:03:51 -07:00
5f144fb5d7 transition work 2026-04-09 10:32:30 -07:00
5e9fb9251e line endings 2026-04-08 17:12:23 -07:00
e8982ba4ef changes 2026-04-08 17:11:03 -07:00
5613ae1d8c deleting bad 2026-04-08 15:26:56 -07:00
c0db909092 removing problematic files 2026-04-08 15:26:26 -07:00
078caadd0c Remove .lfsconfig - using per-remote LFS config instead 2026-04-07 17:21:42 -07:00
baf18dcb5f changes 2026-04-07 10:50:55 -07:00
6a64717c9d changes 2026-04-05 23:11:56 -07:00
351af5ad47 Update room backgrounds to high-res caption images and fix scaling 2026-04-05 08:22:25 -07:00
7b5ce2e4a5 changes 2026-04-05 08:02:34 -07:00
13519580c7 update kq4_084_cottage_front to extend Scene 2026-04-05 00:49:43 -07:00
8a4fc4e81b update kq4_083_castle_dungeon_cell to extend Scene 2026-04-05 00:49:16 -07:00
a61c6777a0 update kq4_082_lolottes_tower_bedroom to extend Scene 2026-04-05 00:48:49 -07:00
062d18bde1 update kq4_081_edgars_tower_bedroom to extend Scene 2026-04-05 00:48:27 -07:00
37b41caf7a update kq4_079_mountain_path_to_dark_castle to extend Scene 2026-04-04 22:09:52 -07:00
191ae85723 update kq4_078_swamp_island to extend Scene 2026-04-04 22:09:23 -07:00
847 changed files with 17296 additions and 1047 deletions

7
.gitattributes vendored
View File

@@ -1,3 +1,10 @@
# Line ending normalization - prevents Windows/Linux conflicts
* text=auto eol=lf
# Windows-only files should use CRLF
*.bat text eol=crlf
*.cmd text eol=crlf
Assets/**/*.png filter=lfs diff=lfs merge=lfs -text
**/*.png filter=lfs diff=lfs merge=lfs -text
scenes/entrance/entrance-wall.png filter=lfs diff=lfs merge=lfs -text

View File

@@ -1,2 +0,0 @@
[remote "origin"]
lfsurl = https://bryce:R9mAjcxnBV!@ry858e838k.execute-api.us-west-2.amazonaws.com/common

View File

@@ -5,21 +5,100 @@
"packages": {
"": {
"dependencies": {
"@opencode-ai/plugin": "1.3.14"
"@opencode-ai/plugin": "1.14.27"
}
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz",
"integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz",
"integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz",
"integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==",
"cpu": [
"arm"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz",
"integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==",
"cpu": [
"arm64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz",
"integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz",
"integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@opencode-ai/plugin": {
"version": "1.3.14",
"resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.3.14.tgz",
"integrity": "sha512-dIEko9B4KytL1pABotkSw2Rm3/BKXb+5Z4g4c/aXjVd2cu86UIsFz8orgMB4zsQOa0bECzESaQzHOKTn3gMEMw==",
"version": "1.14.27",
"resolved": "https://registry.npmjs.org/@opencode-ai/plugin/-/plugin-1.14.27.tgz",
"integrity": "sha512-8J8JkrInF5oWaR2rsLuwQktdF9Yq3xoyA8B42/B8Te74/q4rqOt7YzWK2I/ZSxvKA/Ct+iQ8f2OeUrpQ2INgSw==",
"license": "MIT",
"dependencies": {
"@opencode-ai/sdk": "1.3.14",
"@opencode-ai/sdk": "1.14.27",
"effect": "4.0.0-beta.48",
"zod": "4.1.8"
},
"peerDependencies": {
"@opentui/core": ">=0.1.96",
"@opentui/solid": ">=0.1.96"
"@opentui/core": ">=0.1.105",
"@opentui/solid": ">=0.1.105"
},
"peerDependenciesMeta": {
"@opentui/core": {
@@ -31,14 +110,20 @@
}
},
"node_modules/@opencode-ai/sdk": {
"version": "1.3.14",
"resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.3.14.tgz",
"integrity": "sha512-8sNOFYB86d3b2KiIiL6wtio4V9U0mKEiJAlehzuaigZWiZMsI11Gq1Fdq+tIf9RWNQNsZSMYFuofLabPWQs7qA==",
"version": "1.14.27",
"resolved": "https://registry.npmjs.org/@opencode-ai/sdk/-/sdk-1.14.27.tgz",
"integrity": "sha512-mpzDFDAGi+8wKEcm4aP0HVtS56rN/q2hVs8Ai6JziPu7NuTMddfFoEvddArYsgkRWUfHL5ypZc1mDmAMEiO1vg==",
"license": "MIT",
"dependencies": {
"cross-spawn": "7.0.6"
}
},
"node_modules/@standard-schema/spec": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
"integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
"license": "MIT"
},
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -53,12 +138,135 @@
"node": ">= 8"
}
},
"node_modules/detect-libc": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"license": "Apache-2.0",
"optional": true,
"engines": {
"node": ">=8"
}
},
"node_modules/effect": {
"version": "4.0.0-beta.48",
"resolved": "https://registry.npmjs.org/effect/-/effect-4.0.0-beta.48.tgz",
"integrity": "sha512-MMAM/ZabuNdNmgXiin+BAanQXK7qM8mlt7nfXDoJ/Gn9V8i89JlCq+2N0AiWmqFLXjGLA0u3FjiOjSOYQk5uMw==",
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.1.0",
"fast-check": "^4.6.0",
"find-my-way-ts": "^0.1.6",
"ini": "^6.0.0",
"kubernetes-types": "^1.30.0",
"msgpackr": "^1.11.9",
"multipasta": "^0.2.7",
"toml": "^4.1.1",
"uuid": "^13.0.0",
"yaml": "^2.8.3"
}
},
"node_modules/fast-check": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.7.0.tgz",
"integrity": "sha512-NsZRtqvSSoCP0HbNjUD+r1JH8zqZalyp6gLY9e7OYs7NK9b6AHOs2baBFeBG7bVNsuoukh89x2Yg3rPsul8ziQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/dubzzz"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fast-check"
}
],
"license": "MIT",
"dependencies": {
"pure-rand": "^8.0.0"
},
"engines": {
"node": ">=12.17.0"
}
},
"node_modules/find-my-way-ts": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/find-my-way-ts/-/find-my-way-ts-0.1.6.tgz",
"integrity": "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA==",
"license": "MIT"
},
"node_modules/ini": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz",
"integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==",
"license": "ISC",
"engines": {
"node": "^20.17.0 || >=22.9.0"
}
},
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"license": "ISC"
},
"node_modules/kubernetes-types": {
"version": "1.30.0",
"resolved": "https://registry.npmjs.org/kubernetes-types/-/kubernetes-types-1.30.0.tgz",
"integrity": "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q==",
"license": "Apache-2.0"
},
"node_modules/msgpackr": {
"version": "1.11.10",
"resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.10.tgz",
"integrity": "sha512-iCZNq+HszvF+fC3anCm4nBmWEnbeIAfpDs6IStAEKhQ2YSgkjzVG2FF9XJqwwQh5bH3N9OUTUt4QwVN6MLMLtA==",
"license": "MIT",
"optionalDependencies": {
"msgpackr-extract": "^3.0.2"
}
},
"node_modules/msgpackr-extract": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz",
"integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==",
"hasInstallScript": true,
"license": "MIT",
"optional": true,
"dependencies": {
"node-gyp-build-optional-packages": "5.2.2"
},
"bin": {
"download-msgpackr-prebuilds": "bin/download-prebuilds.js"
},
"optionalDependencies": {
"@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3",
"@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3",
"@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3",
"@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3",
"@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3",
"@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3"
}
},
"node_modules/multipasta": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/multipasta/-/multipasta-0.2.7.tgz",
"integrity": "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA==",
"license": "MIT"
},
"node_modules/node-gyp-build-optional-packages": {
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz",
"integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==",
"license": "MIT",
"optional": true,
"dependencies": {
"detect-libc": "^2.0.1"
},
"bin": {
"node-gyp-build-optional-packages": "bin.js",
"node-gyp-build-optional-packages-optional": "optional.js",
"node-gyp-build-optional-packages-test": "build-test.js"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@@ -68,6 +276,22 @@
"node": ">=8"
}
},
"node_modules/pure-rand": {
"version": "8.4.0",
"resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-8.4.0.tgz",
"integrity": "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/dubzzz"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fast-check"
}
],
"license": "MIT"
},
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -89,6 +313,28 @@
"node": ">=8"
}
},
"node_modules/toml": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/toml/-/toml-4.1.1.tgz",
"integrity": "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw==",
"license": "MIT",
"engines": {
"node": ">=20"
}
},
"node_modules/uuid": {
"version": "13.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
"integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
"license": "MIT",
"bin": {
"uuid": "dist-node/bin/uuid"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -104,6 +350,21 @@
"node": ">= 8"
}
},
"node_modules/yaml": {
"version": "2.8.3",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz",
"integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
"node": ">= 14.6"
},
"funding": {
"url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/zod": {
"version": "4.1.8",
"license": "MIT",

View File

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

@@ -1,6 +1,6 @@
extends Node
enum Action { WALK = 0, LOOK = 1, TOUCH = 2, TALK = 3 }
enum Action { WALK = 0, LOOK = 1, TOUCH = 2, TALK = 3, ITEM = 4 }
var current_action: int = Action.WALK:
set(value):
@@ -9,13 +9,62 @@ var current_action: int = Action.WALK:
signal action_changed(new_action: int)
# Centralized SetPiece hover tracking
var current_scene: Node = null
var hovered_setpieces: Array[SetPiece] = []
var top_hovered_setpiece: SetPiece = null
signal hover_changed(piece: SetPiece)
func get_action_name() -> String:
match current_action:
Action.WALK: return "walk"
Action.LOOK: return "look"
Action.TOUCH: return "touch"
Action.TALK: return "talk"
Action.ITEM: return "item"
return "walk"
func get_action_enum() -> int:
return current_action
func set_current_scene(scene: Node) -> void:
current_scene = scene
hovered_setpieces.clear()
top_hovered_setpiece = null
func get_top_hovered_setpiece() -> SetPiece:
return top_hovered_setpiece
func _process(_delta: float) -> void:
if not current_scene:
return
# Use the scene's viewport (SubViewport), not the root viewport,
# so we get the correct Camera2D and properly account for zoom/position.
var scene_viewport = current_scene.get_viewport()
var camera = scene_viewport.get_camera_2d()
var global_mouse_pos: Vector2
if camera:
global_mouse_pos = camera.get_global_mouse_position()
else:
global_mouse_pos = scene_viewport.get_mouse_position()
# Find all SetPieces in current scene
var new_hovered: Array[SetPiece] = []
for piece in current_scene.find_children("*", "SetPiece", true, false):
if piece is SetPiece:
var local_pos = piece.to_local(global_mouse_pos)
if piece.polygon.size() > 0 and Geometry2D.is_point_in_polygon(local_pos, piece.polygon):
new_hovered.append(piece)
# Sort by priority (highest first)
new_hovered.sort_custom(func(a, b): return b.priority < a.priority)
# Check if top piece changed
var new_top = new_hovered[0] if new_hovered.size() > 0 else null
if new_top != top_hovered_setpiece:
top_hovered_setpiece = new_top
hover_changed.emit(top_hovered_setpiece)
hovered_setpieces = new_hovered

View File

@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/ComfyUI_09976_.png-90d1260948678f4c6d87ad664d
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
@@ -25,6 +27,10 @@ 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

516
Ego.tscn
View File

@@ -8,124 +8,139 @@
[ext_resource type="Texture2D" uid="uid://b4inlny6ixmf0" path="res://ego/masks/3.png" id="7_jhjmn"]
[ext_resource type="Texture2D" uid="uid://bnnap4pr1mr5h" path="res://ego/animations/rosella/img_00103_.png" id="9_pyi2f"]
[ext_resource type="Texture2D" uid="uid://dck67hsxi3rnv" path="res://ego/animations/rosella/img_00069_.png" id="10_l4ay1"]
[ext_resource type="Texture2D" uid="uid://bvrsr0b55pbou" path="res://ego/animations/walk6/e/image/frame_0000.png" id="12_4nppn"]
[ext_resource type="Texture2D" uid="uid://bma63tibheds3" path="res://ego/animations/rosella/img_00001_.png" id="12_84jj5"]
[ext_resource type="Texture2D" uid="uid://bewoslpmmowgr" path="res://ego/animations/walk6/e/image/frame_0001.png" id="13_72g70"]
[ext_resource type="Texture2D" uid="uid://notpa4ibijco" path="res://ego/animations/rosella/img_00031_.png" id="13_ttpag"]
[ext_resource type="Texture2D" uid="uid://bio44t1xei64v" path="res://ego/animations/rosella/img_00056_.png" id="14_2ts53"]
[ext_resource type="Texture2D" uid="uid://cg5sqbqaj1mmv" path="res://ego/animations/rosella/img_00076_.png" id="35_gphxb"]
[ext_resource type="Texture2D" uid="uid://dwbrh1gl8ig4y" path="res://ego/animations/rosella/img_00077_.png" id="36_gpkly"]
[ext_resource type="Texture2D" uid="uid://bgw06nmfunwda" path="res://ego/animations/rosella/img_00078_.png" id="37_0nogo"]
[ext_resource type="Texture2D" uid="uid://0vli2hym4ie" path="res://ego/animations/rosella/img_00079_.png" id="38_atjfg"]
[ext_resource type="Texture2D" uid="uid://cb0phxkfcvulo" path="res://ego/animations/rosella/img_00080_.png" id="39_vq1x5"]
[ext_resource type="Texture2D" uid="uid://bqeqgqd6fd76d" path="res://ego/animations/rosella/img_00081_.png" id="40_k80hd"]
[ext_resource type="Texture2D" uid="uid://b553win6ylbtv" path="res://ego/animations/rosella/img_00082_.png" id="41_fcwhd"]
[ext_resource type="Texture2D" uid="uid://d0de8nrdgr1wk" path="res://ego/animations/rosella/img_00083_.png" id="42_p3kcj"]
[ext_resource type="Texture2D" uid="uid://crwhr71lshdva" path="res://ego/animations/rosella/img_00084_.png" id="43_lt2am"]
[ext_resource type="Texture2D" uid="uid://d0l40is1juh67" path="res://ego/animations/rosella/img_00085_.png" id="44_a03gu"]
[ext_resource type="Texture2D" uid="uid://db848rfj88m05" path="res://ego/animations/rosella/img_00086_.png" id="45_8k8du"]
[ext_resource type="Texture2D" uid="uid://mr8owblcx4hd" path="res://ego/animations/rosella/img_00087_.png" id="46_d4tyc"]
[ext_resource type="Texture2D" uid="uid://dlug3lmdktatv" path="res://ego/animations/rosella/img_00088_.png" id="47_gjkxo"]
[ext_resource type="Texture2D" uid="uid://cph5yxxllk651" path="res://ego/animations/rosella/img_00089_.png" id="48_1s2in"]
[ext_resource type="Texture2D" uid="uid://m7igon4nf2cr" path="res://ego/animations/rosella/img_00090_.png" id="49_xusjq"]
[ext_resource type="Texture2D" uid="uid://b32tvyeo2qlyu" path="res://ego/animations/rosella/img_00091_.png" id="50_laj3v"]
[ext_resource type="Texture2D" uid="uid://bm8rmjef65tgj" path="res://ego/animations/rosella/img_00092_.png" id="51_w12ac"]
[ext_resource type="Texture2D" uid="uid://cbx760fqragtk" path="res://ego/animations/rosella/img_00093_.png" id="52_ww1el"]
[ext_resource type="Texture2D" uid="uid://puk2xmou5bse" path="res://ego/animations/rosella/img_00094_.png" id="53_5r8ch"]
[ext_resource type="Texture2D" uid="uid://51ebjq5e220v" path="res://ego/animations/rosella/img_00095_.png" id="54_twso8"]
[ext_resource type="Texture2D" uid="uid://b8xxc3utklfbg" path="res://ego/animations/rosella/img_00096_.png" id="55_qwddt"]
[ext_resource type="Texture2D" uid="uid://dgm08dti21wf" path="res://ego/animations/rosella/img_00097_.png" id="56_665sf"]
[ext_resource type="Texture2D" uid="uid://cg32svq3ubjl0" path="res://ego/animations/rosella/img_00098_.png" id="57_5qxwo"]
[ext_resource type="Texture2D" uid="uid://b2p68seocumxc" path="res://ego/animations/rosella/img_00099_.png" id="58_cv6on"]
[ext_resource type="Texture2D" uid="uid://ddysiuqg3md00" path="res://ego/animations/rosella/img_00100_.png" id="59_1ubhi"]
[ext_resource type="Texture2D" uid="uid://bqaskor0ehfuq" path="res://ego/animations/rosella/img_00101_.png" id="60_dqjs6"]
[ext_resource type="Texture2D" uid="uid://jidrqhgsqmec" path="res://ego/animations/rosella/img_00102_.png" id="61_fj0td"]
[ext_resource type="Texture2D" uid="uid://lbjiluk8ntk8" path="res://ego/animations/rosella/img_00104_.png" id="62_1oix2"]
[ext_resource type="Texture2D" uid="uid://bd5q4c6e0xye4" path="res://ego/animations/rosella/img_00105_.png" id="63_hkmm4"]
[ext_resource type="Texture2D" uid="uid://cf72vjyp24ppk" path="res://ego/animations/rosella/img_00061_.png" id="64_f3le7"]
[ext_resource type="Texture2D" uid="uid://f284av04l3qc" path="res://ego/animations/rosella/img_00062_.png" id="65_c1022"]
[ext_resource type="Texture2D" uid="uid://c43wvjoob67ga" path="res://ego/animations/rosella/img_00063_.png" id="66_1r88r"]
[ext_resource type="Texture2D" uid="uid://deg2xa6euweai" path="res://ego/animations/rosella/img_00064_.png" id="67_fo0ow"]
[ext_resource type="Texture2D" uid="uid://d0pwlq1h6m281" path="res://ego/animations/rosella/img_00065_.png" id="68_m0ljg"]
[ext_resource type="Texture2D" uid="uid://d1uudexxfkoxv" path="res://ego/animations/rosella/img_00066_.png" id="69_4wwa5"]
[ext_resource type="Texture2D" uid="uid://dbgb7pkwobys3" path="res://ego/animations/rosella/img_00067_.png" id="70_ouq1l"]
[ext_resource type="Texture2D" uid="uid://e52vgy56v2bk" path="res://ego/animations/rosella/img_00068_.png" id="71_gygjm"]
[ext_resource type="Texture2D" uid="uid://5viwlyfh5fj4" path="res://ego/animations/rosella/img_00070_.png" id="72_0kaxt"]
[ext_resource type="Texture2D" uid="uid://btva2sp0ktooh" path="res://ego/animations/rosella/img_00071_.png" id="73_db5ja"]
[ext_resource type="Texture2D" uid="uid://7fksrocnnefd" path="res://ego/animations/rosella/img_00072_.png" id="74_1jmh4"]
[ext_resource type="Texture2D" uid="uid://cy4ynarwk2lwt" path="res://ego/animations/rosella/img_00073_.png" id="75_i71gw"]
[ext_resource type="Texture2D" uid="uid://cxbsa3s17s4wy" path="res://ego/animations/rosella/img_00074_.png" id="76_t4gew"]
[ext_resource type="Texture2D" uid="uid://d0jhqqpkylfpk" path="res://ego/animations/rosella/img_00075_.png" id="77_bn0fg"]
[ext_resource type="Texture2D" uid="uid://d12fabpeuio5j" path="res://ego/animations/rosella/img_00002_.png" id="92_ie3g4"]
[ext_resource type="Texture2D" uid="uid://cy7q04eg5hjvx" path="res://ego/animations/rosella/img_00003_.png" id="93_nm270"]
[ext_resource type="Texture2D" uid="uid://bpqarq0yirtuh" path="res://ego/animations/rosella/img_00004_.png" id="94_vawqf"]
[ext_resource type="Texture2D" uid="uid://m5wgl7mifwqk" path="res://ego/animations/rosella/img_00005_.png" id="95_m3ymp"]
[ext_resource type="Texture2D" uid="uid://cbufiq5fjmq03" path="res://ego/animations/rosella/img_00006_.png" id="96_xowhf"]
[ext_resource type="Texture2D" uid="uid://gubrfsm2pk0x" path="res://ego/animations/rosella/img_00007_.png" id="97_3asjl"]
[ext_resource type="Texture2D" uid="uid://binxa18kwl3d4" path="res://ego/animations/rosella/img_00008_.png" id="98_bl8n8"]
[ext_resource type="Texture2D" uid="uid://cfbwoverts640" path="res://ego/animations/rosella/img_00009_.png" id="99_ski6f"]
[ext_resource type="Texture2D" uid="uid://bjk0a5x3tb84w" path="res://ego/animations/rosella/img_00010_.png" id="100_mf0u4"]
[ext_resource type="Texture2D" uid="uid://b6lqqhr124lh" path="res://ego/animations/rosella/img_00011_.png" id="101_stlf2"]
[ext_resource type="Texture2D" uid="uid://bv2b02uqonxe1" path="res://ego/animations/rosella/img_00012_.png" id="102_3uaju"]
[ext_resource type="Texture2D" uid="uid://b0icq1fqlcgup" path="res://ego/animations/rosella/img_00013_.png" id="103_k4pwn"]
[ext_resource type="Texture2D" uid="uid://t4ws1dxrk74k" path="res://ego/animations/rosella/img_00014_.png" id="104_yudkd"]
[ext_resource type="Texture2D" uid="uid://b0hr3ftsvypi3" path="res://ego/animations/rosella/img_00015_.png" id="105_gyxix"]
[ext_resource type="Texture2D" uid="uid://cujcg5fs2d4s1" path="res://ego/animations/rosella/img_00032_.png" id="106_tj1k5"]
[ext_resource type="Texture2D" uid="uid://0a1estsf13nm" path="res://ego/animations/rosella/img_00033_.png" id="107_gmbms"]
[ext_resource type="Texture2D" uid="uid://c46xhdf224a2m" path="res://ego/animations/rosella/img_00034_.png" id="108_o7aaa"]
[ext_resource type="Texture2D" uid="uid://rln2p7r6a5" path="res://ego/animations/rosella/img_00035_.png" id="109_7sodb"]
[ext_resource type="Texture2D" uid="uid://b1xifkxpy1hb6" path="res://ego/animations/rosella/img_00036_.png" id="110_5od0t"]
[ext_resource type="Texture2D" uid="uid://gog3qgvko874" path="res://ego/animations/rosella/img_00037_.png" id="111_mgwvh"]
[ext_resource type="Texture2D" uid="uid://b7qp3mt0ysveg" path="res://ego/animations/rosella/img_00038_.png" id="112_0r2r0"]
[ext_resource type="Texture2D" uid="uid://ccpx5q1dhhtda" path="res://ego/animations/rosella/img_00039_.png" id="113_vlgai"]
[ext_resource type="Texture2D" uid="uid://77s8kv2rrgms" path="res://ego/animations/rosella/img_00040_.png" id="114_2fgrx"]
[ext_resource type="Texture2D" uid="uid://cxeket55l1uox" path="res://ego/animations/rosella/img_00041_.png" id="115_gtwhg"]
[ext_resource type="Texture2D" uid="uid://bahwbfx8wlw8a" path="res://ego/animations/rosella/img_00042_.png" id="116_clvmm"]
[ext_resource type="Texture2D" uid="uid://x37xim021bcr" path="res://ego/animations/rosella/img_00043_.png" id="117_wons0"]
[ext_resource type="Texture2D" uid="uid://cfwcuk0rjmmf5" path="res://ego/animations/rosella/img_00044_.png" id="118_im20t"]
[ext_resource type="Texture2D" uid="uid://coyxuaeylsx1i" path="res://ego/animations/rosella/img_00045_.png" id="119_31gcv"]
[ext_resource type="Texture2D" uid="uid://b105ixtjlaemw" path="res://ego/animations/walk6/e/image/frame_0002.png" id="14_jgc4u"]
[ext_resource type="Texture2D" uid="uid://dj5qqu1i60t8b" path="res://ego/animations/walk6/e/image/frame_0003.png" id="15_k08d4"]
[ext_resource type="Texture2D" uid="uid://bv6a6vt0q5luo" path="res://ego/animations/walk6/e/image/frame_0004.png" id="16_kxwb1"]
[ext_resource type="Texture2D" uid="uid://clrk60e8f6cto" path="res://ego/animations/walk6/e/image/frame_0005.png" id="17_m5pot"]
[ext_resource type="Texture2D" uid="uid://hgah784brj1u" path="res://ego/animations/walk6/e/image/frame_0006.png" id="18_uejjd"]
[ext_resource type="Texture2D" uid="uid://dvct6l2bs4xfo" path="res://ego/animations/walk6/e/image/frame_0007.png" id="19_elvj4"]
[ext_resource type="Texture2D" uid="uid://73p11ya60fhx" path="res://ego/animations/walk6/e/image/frame_0008.png" id="20_gsu4v"]
[ext_resource type="Texture2D" uid="uid://b25stwboh3o6a" path="res://ego/animations/walk6/e/image/frame_0009.png" id="21_s0vn5"]
[ext_resource type="Texture2D" uid="uid://elkyn3cmg0c2" path="res://ego/animations/walk6/e/image/frame_0010.png" id="22_opx4c"]
[ext_resource type="Texture2D" uid="uid://djgn51fdby287" path="res://ego/animations/walk6/e/image/frame_0011.png" id="23_aoxuo"]
[ext_resource type="Texture2D" uid="uid://dlbpbe6s4l1tx" path="res://ego/animations/walk6/e/image/frame_0012.png" id="24_yyx1q"]
[ext_resource type="Texture2D" uid="uid://wrn8804ysm1r" path="res://ego/animations/walk6/e/image/frame_0013.png" id="25_gw6rl"]
[ext_resource type="Texture2D" uid="uid://dfknsguku55ft" path="res://ego/animations/walk6/e/image/frame_0014.png" id="26_qf3gd"]
[ext_resource type="Texture2D" uid="uid://o55311qur6ux" path="res://ego/animations/walk6/e/image/frame_0015.png" id="27_mk8du"]
[ext_resource type="Texture2D" uid="uid://btp8767fm0iq7" path="res://ego/animations/walk6/n/image/frame_0016.png" id="28_gw6rl"]
[ext_resource type="Texture2D" uid="uid://cq6envo4lp6ro" path="res://ego/animations/walk6/n/image/frame_0017.png" id="29_qf3gd"]
[ext_resource type="Texture2D" uid="uid://doelb4yxmyms4" path="res://ego/animations/walk6/n/image/frame_0018.png" id="30_mk8du"]
[ext_resource type="Texture2D" uid="uid://bu0kutuqi7eq" path="res://ego/animations/walk6/n/image/frame_0019.png" id="31_x73qc"]
[ext_resource type="Texture2D" uid="uid://b2gqntbxjjjqh" path="res://ego/animations/walk6/n/image/frame_0020.png" id="32_qrgip"]
[ext_resource type="Texture2D" uid="uid://ctxixw4wclmqk" path="res://ego/animations/walk6/n/image/frame_0021.png" id="33_2ah26"]
[ext_resource type="Texture2D" uid="uid://cekttv2sd1lp4" path="res://ego/animations/walk6/n/image/frame_0022.png" id="34_2kb50"]
[ext_resource type="Texture2D" uid="uid://hr3hg4yx4jgj" path="res://ego/animations/walk6/n/image/frame_0023.png" id="35_tl3rq"]
[ext_resource type="Texture2D" uid="uid://f35wf4l1k8vx" path="res://ego/animations/walk6/n/image/frame_0024.png" id="36_p38v6"]
[ext_resource type="Texture2D" uid="uid://ohs0yvbig878" path="res://ego/animations/walk6/n/image/frame_0025.png" id="37_0v1yx"]
[ext_resource type="Texture2D" uid="uid://djnwrqr3cyfyh" path="res://ego/animations/walk6/n/image/frame_0026.png" id="38_37u3v"]
[ext_resource type="Texture2D" uid="uid://ceo6nje8u1h4x" path="res://ego/animations/walk6/n/image/frame_0027.png" id="39_fkaqq"]
[ext_resource type="Texture2D" uid="uid://di8blm0onobj" path="res://ego/animations/walk6/n/image/frame_0028.png" id="40_okkqf"]
[ext_resource type="Texture2D" uid="uid://dnyd4ce7xwewg" path="res://ego/animations/walk6/n/image/frame_0029.png" id="41_c5tbi"]
[ext_resource type="Texture2D" uid="uid://cwxduxrkh52x0" path="res://ego/animations/walk6/n/image/frame_0030.png" id="42_q66kk"]
[ext_resource type="Texture2D" uid="uid://dmvy0ss2ettds" path="res://ego/animations/walk6/n/image/frame_0031.png" id="43_vvmec"]
[ext_resource type="Texture2D" uid="uid://dgodwo787wase" path="res://ego/animations/walk6/ne/image/frame_0000.png" id="44_xff26"]
[ext_resource type="Texture2D" uid="uid://bqjfph16yhjwa" path="res://ego/animations/walk6/ne/image/frame_0001.png" id="45_7hvw5"]
[ext_resource type="Texture2D" uid="uid://n5b27nerh745" path="res://ego/animations/walk6/ne/image/frame_0002.png" id="46_ib7pv"]
[ext_resource type="Texture2D" uid="uid://cbwxgca7b7d3p" path="res://ego/animations/walk6/ne/image/frame_0003.png" id="47_1ypi2"]
[ext_resource type="Texture2D" uid="uid://ck5cg76kjt2tj" path="res://ego/animations/walk6/ne/image/frame_0004.png" id="48_bb5nw"]
[ext_resource type="Texture2D" uid="uid://bol547r5xbbyo" path="res://ego/animations/walk6/ne/image/frame_0005.png" id="49_4hl61"]
[ext_resource type="Texture2D" uid="uid://b06wbkkgu47iu" path="res://ego/animations/walk6/ne/image/frame_0006.png" id="50_df5q1"]
[ext_resource type="Texture2D" uid="uid://c8cuugb52glen" path="res://ego/animations/walk6/ne/image/frame_0007.png" id="51_dnhwr"]
[ext_resource type="Texture2D" uid="uid://vjdars4cuymm" path="res://ego/animations/walk6/ne/image/frame_0008.png" id="52_0rhxg"]
[ext_resource type="Texture2D" uid="uid://bc14roj0xc7so" path="res://ego/animations/walk6/ne/image/frame_0009.png" id="53_lh1ea"]
[ext_resource type="Texture2D" uid="uid://cee5xi1s057bx" path="res://ego/animations/walk6/ne/image/frame_0010.png" id="54_i0lgs"]
[ext_resource type="Texture2D" uid="uid://dkmin76r8o88w" path="res://ego/animations/walk6/ne/image/frame_0011.png" id="55_av2vk"]
[ext_resource type="Texture2D" uid="uid://cayosnox1s802" path="res://ego/animations/walk6/ne/image/frame_0012.png" id="56_xba83"]
[ext_resource type="Texture2D" uid="uid://dw6b0np8svoyj" path="res://ego/animations/walk6/ne/image/frame_0013.png" id="57_v6qvo"]
[ext_resource type="Texture2D" uid="uid://1arv1eg1imfe" path="res://ego/animations/walk6/ne/image/frame_0014.png" id="58_kmnvl"]
[ext_resource type="Texture2D" uid="uid://dtll4c1enlifl" path="res://ego/animations/walk6/ne/image/frame_0015.png" id="59_fuy8j"]
[ext_resource type="Texture2D" uid="uid://8hrjled324vu" path="res://ego/animations/walk6/nw/image/frame_0016.png" id="60_uysyb"]
[ext_resource type="Texture2D" uid="uid://bk5b6jqj58euy" path="res://ego/animations/walk6/nw/image/frame_0017.png" id="61_0yvyt"]
[ext_resource type="Texture2D" uid="uid://by8hvy766aqo8" path="res://ego/animations/walk6/nw/image/frame_0018.png" id="62_6i2ne"]
[ext_resource type="Texture2D" uid="uid://q8ydpu1jq1m4" path="res://ego/animations/walk6/nw/image/frame_0019.png" id="63_cdocw"]
[ext_resource type="Texture2D" uid="uid://13btqib4d01m" path="res://ego/animations/walk6/nw/image/frame_0020.png" id="64_emfac"]
[ext_resource type="Texture2D" uid="uid://co406e0caf7rs" path="res://ego/animations/walk6/nw/image/frame_0021.png" id="65_24r7p"]
[ext_resource type="Texture2D" uid="uid://cq67a0pi8534b" path="res://ego/animations/walk6/nw/image/frame_0022.png" id="66_p6u0u"]
[ext_resource type="Texture2D" uid="uid://ccuqsnvb45wid" path="res://ego/animations/walk6/nw/image/frame_0023.png" id="67_n8x0v"]
[ext_resource type="Texture2D" uid="uid://nyt7luhf2exy" path="res://ego/animations/walk6/nw/image/frame_0024.png" id="68_amoxi"]
[ext_resource type="Texture2D" uid="uid://21pwhg2e8j5e" path="res://ego/animations/walk6/nw/image/frame_0025.png" id="69_5csai"]
[ext_resource type="Texture2D" uid="uid://1kw0wwwhcd2g" path="res://ego/animations/walk6/nw/image/frame_0026.png" id="70_b3d6q"]
[ext_resource type="Texture2D" uid="uid://ct752psctn0av" path="res://ego/animations/walk6/nw/image/frame_0027.png" id="71_m405h"]
[ext_resource type="Texture2D" uid="uid://do3855gst2lv4" path="res://ego/animations/walk6/nw/image/frame_0028.png" id="72_p25cj"]
[ext_resource type="Texture2D" uid="uid://bb5mp21ssu06q" path="res://ego/animations/walk6/nw/image/frame_0029.png" id="73_8hyjb"]
[ext_resource type="Texture2D" uid="uid://xxh03tdjncbt" path="res://ego/animations/walk6/nw/image/frame_0030.png" id="74_8q4hi"]
[ext_resource type="Texture2D" uid="uid://vutdndo0qgnk" path="res://ego/animations/walk6/nw/image/frame_0031.png" id="75_uff0b"]
[ext_resource type="Texture2D" uid="uid://ibpf2uuxc27e" path="res://ego/animations/walk6/s/image/frame_0016.png" id="76_dsexq"]
[ext_resource type="Texture2D" uid="uid://sh50dk0u21gv" path="res://ego/animations/walk6/s/image/frame_0017.png" id="77_hwnuj"]
[ext_resource type="Texture2D" uid="uid://cn0ec21d4e51i" path="res://ego/animations/walk6/s/image/frame_0018.png" id="78_ivvdo"]
[ext_resource type="Texture2D" uid="uid://lipn36kkmdg2" path="res://ego/animations/walk6/s/image/frame_0019.png" id="79_786ir"]
[ext_resource type="Texture2D" uid="uid://ckfndx0hhkfu3" path="res://ego/animations/walk6/s/image/frame_0020.png" id="80_5p581"]
[ext_resource type="Texture2D" uid="uid://s8r8v5tjo03l" path="res://ego/animations/walk6/s/image/frame_0021.png" id="81_5yp8t"]
[ext_resource type="Texture2D" uid="uid://bo52oqe8hpeke" path="res://ego/animations/walk6/s/image/frame_0022.png" id="82_8umh2"]
[ext_resource type="Texture2D" uid="uid://ckqjojy8c2m5e" path="res://ego/animations/walk6/s/image/frame_0023.png" id="83_dn78y"]
[ext_resource type="Texture2D" uid="uid://p837mhdkkifr" path="res://ego/animations/walk6/s/image/frame_0024.png" id="84_vjaoi"]
[ext_resource type="Texture2D" uid="uid://exf2i4ggwjak" path="res://ego/animations/walk6/s/image/frame_0025.png" id="85_1bupr"]
[ext_resource type="Texture2D" uid="uid://b6q01rev3b4yc" path="res://ego/animations/walk6/s/image/frame_0026.png" id="86_def6r"]
[ext_resource type="Texture2D" uid="uid://dp2oh6igsocar" path="res://ego/animations/walk6/s/image/frame_0027.png" id="87_se17v"]
[ext_resource type="Texture2D" uid="uid://c7appdm0bky1i" path="res://ego/animations/walk6/s/image/frame_0028.png" id="88_atafq"]
[ext_resource type="Texture2D" uid="uid://drx07btj8l6al" path="res://ego/animations/walk6/s/image/frame_0029.png" id="89_60r7o"]
[ext_resource type="Texture2D" uid="uid://cxxs1ywu72p6p" path="res://ego/animations/walk6/s/image/frame_0030.png" id="90_ub7dx"]
[ext_resource type="Texture2D" uid="uid://daelr7qf0yuhw" path="res://ego/animations/walk6/s/image/frame_0031.png" id="91_e7eqt"]
[ext_resource type="Texture2D" uid="uid://hdtep2u1rmer" path="res://ego/animations/walk6/se/image/frame_0000.png" id="92_3vrr3"]
[ext_resource type="Texture2D" uid="uid://bhvhwej1nrhx4" path="res://ego/animations/walk6/se/image/frame_0001.png" id="93_6epyu"]
[ext_resource type="Texture2D" uid="uid://dp2dw867l7ifl" path="res://ego/animations/walk6/se/image/frame_0002.png" id="94_pjif5"]
[ext_resource type="Texture2D" uid="uid://ctarli3djfk5d" path="res://ego/animations/walk6/se/image/frame_0003.png" id="95_1h26f"]
[ext_resource type="Texture2D" uid="uid://q8qlsog836fc" path="res://ego/animations/walk6/se/image/frame_0004.png" id="96_klrxs"]
[ext_resource type="Texture2D" uid="uid://dn8svxp7b2es7" path="res://ego/animations/walk6/se/image/frame_0005.png" id="97_nwnj3"]
[ext_resource type="Texture2D" uid="uid://dcbnlm0bbdtrr" path="res://ego/animations/walk6/se/image/frame_0006.png" id="98_bbx6e"]
[ext_resource type="Texture2D" uid="uid://b2pprdtdj31a2" path="res://ego/animations/walk6/se/image/frame_0007.png" id="99_bru01"]
[ext_resource type="Texture2D" uid="uid://cc5dn4iff37mi" path="res://ego/animations/walk6/se/image/frame_0008.png" id="100_cp2xd"]
[ext_resource type="Texture2D" uid="uid://cr5nma70ectjf" path="res://ego/animations/walk6/se/image/frame_0009.png" id="101_jbccs"]
[ext_resource type="Texture2D" uid="uid://j71c27rvol84" path="res://ego/animations/walk6/se/image/frame_0010.png" id="102_bu1yf"]
[ext_resource type="Texture2D" uid="uid://cragg3ffp8fkx" path="res://ego/animations/walk6/se/image/frame_0011.png" id="103_1484e"]
[ext_resource type="Texture2D" uid="uid://bhn47ko6cps5m" path="res://ego/animations/walk6/se/image/frame_0012.png" id="104_scw7s"]
[ext_resource type="Texture2D" uid="uid://qcggsl5xl2m7" path="res://ego/animations/walk6/se/image/frame_0013.png" id="105_timr7"]
[ext_resource type="Texture2D" uid="uid://c1ckt15isyv6a" path="res://ego/animations/walk6/se/image/frame_0014.png" id="106_nlo5j"]
[ext_resource type="Texture2D" uid="uid://wq201khar1r4" path="res://ego/animations/walk6/se/image/frame_0015.png" id="107_yna12"]
[ext_resource type="Texture2D" uid="uid://b3ulpsu03i0wp" path="res://ego/animations/walk6/sw/image/frame_0000.png" id="108_tbxo8"]
[ext_resource type="Texture2D" uid="uid://cdw2yjedrlvr7" path="res://ego/animations/walk6/sw/image/frame_0001.png" id="109_cwboe"]
[ext_resource type="Texture2D" uid="uid://xa7qkvs1xkp7" path="res://ego/animations/walk6/sw/image/frame_0002.png" id="110_fci48"]
[ext_resource type="Texture2D" uid="uid://d2lxnxeduchey" path="res://ego/animations/walk6/sw/image/frame_0003.png" id="111_oo60o"]
[ext_resource type="Texture2D" uid="uid://blxmeqor2delv" path="res://ego/animations/walk6/sw/image/frame_0004.png" id="112_jk871"]
[ext_resource type="Texture2D" uid="uid://bvkg4cb878msd" path="res://ego/animations/walk6/sw/image/frame_0005.png" id="113_fqwbh"]
[ext_resource type="Texture2D" uid="uid://dj7c4sjonys1l" path="res://ego/animations/walk6/sw/image/frame_0006.png" id="114_boqln"]
[ext_resource type="Texture2D" uid="uid://s1wbs8usun0m" path="res://ego/animations/walk6/sw/image/frame_0007.png" id="115_gjc4p"]
[ext_resource type="Texture2D" uid="uid://ds3t17hgm1a37" path="res://ego/animations/walk6/sw/image/frame_0008.png" id="116_338xc"]
[ext_resource type="Texture2D" uid="uid://cdakhhgglyq3a" path="res://ego/animations/walk6/sw/image/frame_0009.png" id="117_v50lk"]
[ext_resource type="Texture2D" uid="uid://8tuqjah64of1" path="res://ego/animations/walk6/sw/image/frame_0010.png" id="118_ssq1t"]
[ext_resource type="Texture2D" uid="uid://d3lfrum86awn2" path="res://ego/animations/walk6/sw/image/frame_0011.png" id="119_huqp0"]
[ext_resource type="Texture2D" uid="uid://j6v4fyxanf3q" path="res://ego/animations/rosella/img_00106_.png" id="119_q6yh0"]
[ext_resource type="Texture2D" uid="uid://bhulcb0tcph6y" path="res://ego/animations/rosella/img_00107_.png" id="120_pagte"]
[ext_resource type="Texture2D" uid="uid://dju8ct8uh4x4a" path="res://ego/animations/rosella/img_00046_.png" id="120_qeejn"]
[ext_resource type="Texture2D" uid="uid://btntcfpy7sxq3" path="res://ego/animations/rosella/img_00047_.png" id="121_h6nhi"]
[ext_resource type="Texture2D" uid="uid://xmqtqshjh5ad" path="res://ego/animations/rosella/img_00108_.png" id="121_hg8r5"]
[ext_resource type="Texture2D" uid="uid://c8bjdgjwj41ay" path="res://ego/animations/rosella/img_00109_.png" id="122_5oaqq"]
[ext_resource type="Texture2D" uid="uid://dnl5qg8pdg7js" path="res://ego/animations/rosella/img_00048_.png" id="122_grugb"]
[ext_resource type="Texture2D" uid="uid://dywo3e1aq3sdi" path="res://ego/animations/rosella/img_00110_.png" id="123_kn1mn"]
[ext_resource type="Texture2D" uid="uid://5okhhcxsivoq" path="res://ego/animations/rosella/img_00049_.png" id="123_yoybg"]
[ext_resource type="Texture2D" uid="uid://csnpmnd8mhela" path="res://ego/animations/rosella/img_00050_.png" id="124_8jd8x"]
[ext_resource type="Texture2D" uid="uid://bsyvm2c0x50np" path="res://ego/animations/rosella/img_00111_.png" id="124_opp18"]
[ext_resource type="Texture2D" uid="uid://ct2p00u6hqpfm" path="res://ego/animations/rosella/img_00112_.png" id="125_4nwac"]
[ext_resource type="Texture2D" uid="uid://ngodxvv1jgiy" path="res://ego/animations/rosella/img_00051_.png" id="125_nm7rs"]
[ext_resource type="Texture2D" uid="uid://wgat1ygky6vb" path="res://ego/animations/rosella/img_00052_.png" id="126_cviwa"]
[ext_resource type="Texture2D" uid="uid://brf3b2o7wehcm" path="res://ego/animations/rosella/img_00113_.png" id="126_ido3p"]
[ext_resource type="Texture2D" uid="uid://cwv0rfu6mixdo" path="res://ego/animations/rosella/img_00053_.png" id="127_bpypy"]
[ext_resource type="Texture2D" uid="uid://dsykfaqdjbnnf" path="res://ego/animations/rosella/img_00114_.png" id="127_iwaxh"]
[ext_resource type="Texture2D" uid="uid://pnvg6du2qq6d" path="res://ego/animations/rosella/img_00115_.png" id="128_ar1ys"]
[ext_resource type="Texture2D" uid="uid://dv1vf7vu27ug7" path="res://ego/animations/rosella/img_00054_.png" id="128_qenlf"]
[ext_resource type="Texture2D" uid="uid://bb855tpyoaitj" path="res://ego/animations/rosella/img_00055_.png" id="129_7b1px"]
[ext_resource type="Texture2D" uid="uid://dsg2pjb1wvt1q" path="res://ego/animations/rosella/img_00116_.png" id="129_gxp5c"]
[ext_resource type="Texture2D" uid="uid://dkbggvmvgf31a" path="res://ego/animations/rosella/img_00117_.png" id="130_0ooo7"]
[ext_resource type="Texture2D" uid="uid://l8c28scv1mb5" path="res://ego/animations/rosella/img_00057_.png" id="130_w3x52"]
[ext_resource type="Texture2D" uid="uid://tk736wuremvo" path="res://ego/animations/rosella/img_00058_.png" id="131_nfjxv"]
[ext_resource type="Texture2D" uid="uid://b7ndpr0lputtn" path="res://ego/animations/rosella/img_00118_.png" id="131_okk5g"]
[ext_resource type="Texture2D" uid="uid://d2rv38oy5neff" path="res://ego/animations/rosella/img_00119_.png" id="132_0g30d"]
[ext_resource type="Texture2D" uid="uid://bs3waxmju8q2x" path="res://ego/animations/rosella/img_00059_.png" id="132_v1scd"]
[ext_resource type="Texture2D" uid="uid://xh1mxrknsfle" path="res://ego/animations/rosella/img_00060_.png" id="133_kxwux"]
[ext_resource type="Texture2D" uid="uid://bdk2vrjstiodj" path="res://ego/animations/rosella/img_00120_.png" id="133_w8q6v"]
[ext_resource type="Texture2D" uid="uid://do2g2v7qq8kcs" path="res://ego/animations/walk6/sw/image/frame_0012.png" id="120_274ja"]
[ext_resource type="Texture2D" uid="uid://gsrymkte3dwy" path="res://ego/animations/walk6/sw/image/frame_0013.png" id="121_u8w2y"]
[ext_resource type="Texture2D" uid="uid://quow7u232wxa" path="res://ego/animations/walk6/sw/image/frame_0014.png" id="122_1pwk6"]
[ext_resource type="Texture2D" uid="uid://c3bt0sjoptdwx" path="res://ego/animations/walk6/sw/image/frame_0015.png" id="123_248hs"]
[ext_resource type="Texture2D" uid="uid://jhfveypdrxx6" path="res://ego/animations/walk6/w/image/frame_0000.png" id="124_uy2xp"]
[ext_resource type="Texture2D" uid="uid://jfl3v3tru3ok" path="res://ego/animations/walk6/w/image/frame_0001.png" id="125_o8wjp"]
[ext_resource type="Texture2D" uid="uid://bfgyj7g1s0tyu" path="res://ego/animations/walk6/w/image/frame_0002.png" id="126_y4i6c"]
[ext_resource type="Texture2D" uid="uid://b8dx5i3spo20" path="res://ego/animations/walk6/w/image/frame_0003.png" id="127_qpxhg"]
[ext_resource type="Texture2D" uid="uid://bv8t2mtx6str3" path="res://ego/animations/walk6/w/image/frame_0004.png" id="128_fua1r"]
[ext_resource type="Texture2D" uid="uid://dv5r6vggsvi1e" path="res://ego/animations/walk6/w/image/frame_0005.png" id="129_i3cnu"]
[ext_resource type="Texture2D" uid="uid://dwsw5mulqwaov" path="res://ego/animations/walk6/w/image/frame_0006.png" id="130_bt6sr"]
[ext_resource type="Texture2D" uid="uid://c1j245fawfb6r" path="res://ego/animations/walk6/w/image/frame_0007.png" id="131_u0i8g"]
[ext_resource type="Texture2D" uid="uid://dejanvimdcw73" path="res://ego/animations/walk6/w/image/frame_0008.png" id="132_wvpsm"]
[ext_resource type="Texture2D" uid="uid://dpgmhaf00uwrv" path="res://ego/animations/walk6/w/image/frame_0009.png" id="133_dxmcl"]
[ext_resource type="Texture2D" uid="uid://c1w600krkghsr" path="res://ego/animations/walk6/w/image/frame_0010.png" id="134_u084s"]
[ext_resource type="Texture2D" uid="uid://bitfme7l2hhmt" path="res://ego/animations/walk6/w/image/frame_0011.png" id="135_lflbb"]
[ext_resource type="Texture2D" uid="uid://c8wnouu2p482i" path="res://ego/animations/walk6/w/image/frame_0012.png" id="136_08xgv"]
[ext_resource type="Texture2D" uid="uid://dt0asn0fywk3l" path="res://ego/animations/walk6/w/image/frame_0013.png" id="137_j38cn"]
[ext_resource type="Texture2D" uid="uid://dbnjhs46g3tox" path="res://ego/animations/walk6/w/image/frame_0014.png" id="138_wfkq6"]
[ext_resource type="Texture2D" uid="uid://cnuokkal5qj8a" path="res://ego/animations/walk6/w/image/frame_0015.png" id="139_aqsva"]
[ext_resource type="Texture2D" uid="uid://cbiapiccssu0k" path="res://ego/animations/rosella/img_00016_.png" id="159_6fkdd"]
[ext_resource type="Texture2D" uid="uid://dtjlq5rm3gj3c" path="res://ego/animations/rosella/img_00017_.png" id="160_llhmj"]
[ext_resource type="Texture2D" uid="uid://dij6cjatpop24" path="res://ego/animations/rosella/img_00018_.png" id="161_uupqn"]
[ext_resource type="Texture2D" uid="uid://8ylna7crhmiq" path="res://ego/animations/rosella/img_00019_.png" id="162_vqsv2"]
[ext_resource type="Texture2D" uid="uid://rkrkgom3cm3v" path="res://ego/animations/rosella/img_00020_.png" id="163_nrmid"]
[ext_resource type="Texture2D" uid="uid://fg5643mb7a3q" path="res://ego/animations/rosella/img_00021_.png" id="164_orhiv"]
[ext_resource type="Texture2D" uid="uid://b4hg51a11paw1" path="res://ego/animations/rosella/img_00022_.png" id="165_qik70"]
[ext_resource type="Texture2D" uid="uid://n2hgry6npirj" path="res://ego/animations/rosella/img_00023_.png" id="166_414b7"]
[ext_resource type="Texture2D" uid="uid://0bi20hsxamun" path="res://ego/animations/rosella/img_00024_.png" id="167_gugxh"]
[ext_resource type="Texture2D" uid="uid://dkbnilfkftdo8" path="res://ego/animations/rosella/img_00025_.png" id="168_525u8"]
[ext_resource type="Texture2D" uid="uid://dywe87t2qm0im" path="res://ego/animations/rosella/img_00026_.png" id="169_wbmcb"]
[ext_resource type="Texture2D" uid="uid://r6hhulvl5wtn" path="res://ego/animations/rosella/img_00027_.png" id="170_t83h1"]
[ext_resource type="Texture2D" uid="uid://w47creb8ae45" path="res://ego/animations/rosella/img_00028_.png" id="171_ifskr"]
[ext_resource type="Texture2D" uid="uid://370l1illwxuv" path="res://ego/animations/rosella/img_00029_.png" id="172_rfe2v"]
[ext_resource type="Texture2D" uid="uid://c04v143dispfa" path="res://ego/animations/rosella/img_00030_.png" id="173_q1b42"]
[ext_resource type="Theme" uid="uid://dkli02kmdncbc" path="res://UITheme.tres" id="194"]
[ext_resource type="Script" uid="uid://b6gqw3bcaoye5" path="res://ego/Ego.gd" id="195"]
@@ -309,49 +324,52 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("119_q6yh0")
"texture": ExtResource("12_4nppn")
}, {
"duration": 1.0,
"texture": ExtResource("120_pagte")
"texture": ExtResource("13_72g70")
}, {
"duration": 1.0,
"texture": ExtResource("121_hg8r5")
"texture": ExtResource("14_jgc4u")
}, {
"duration": 1.0,
"texture": ExtResource("122_5oaqq")
"texture": ExtResource("15_k08d4")
}, {
"duration": 1.0,
"texture": ExtResource("123_kn1mn")
"texture": ExtResource("16_kxwb1")
}, {
"duration": 1.0,
"texture": ExtResource("124_opp18")
"texture": ExtResource("17_m5pot")
}, {
"duration": 1.0,
"texture": ExtResource("125_4nwac")
"texture": ExtResource("18_uejjd")
}, {
"duration": 1.0,
"texture": ExtResource("126_ido3p")
"texture": ExtResource("19_elvj4")
}, {
"duration": 1.0,
"texture": ExtResource("127_iwaxh")
"texture": ExtResource("20_gsu4v")
}, {
"duration": 1.0,
"texture": ExtResource("128_ar1ys")
"texture": ExtResource("21_s0vn5")
}, {
"duration": 1.0,
"texture": ExtResource("129_gxp5c")
"texture": ExtResource("22_opx4c")
}, {
"duration": 1.0,
"texture": ExtResource("130_0ooo7")
"texture": ExtResource("23_aoxuo")
}, {
"duration": 1.0,
"texture": ExtResource("131_okk5g")
"texture": ExtResource("24_yyx1q")
}, {
"duration": 1.0,
"texture": ExtResource("132_0g30d")
"texture": ExtResource("25_gw6rl")
}, {
"duration": 1.0,
"texture": ExtResource("133_w8q6v")
"texture": ExtResource("26_qf3gd")
}, {
"duration": 1.0,
"texture": ExtResource("27_mk8du")
}],
"loop": true,
"name": &"walk_E",
@@ -359,49 +377,52 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("35_gphxb")
"texture": ExtResource("28_gw6rl")
}, {
"duration": 1.0,
"texture": ExtResource("36_gpkly")
"texture": ExtResource("29_qf3gd")
}, {
"duration": 1.0,
"texture": ExtResource("37_0nogo")
"texture": ExtResource("30_mk8du")
}, {
"duration": 1.0,
"texture": ExtResource("38_atjfg")
"texture": ExtResource("31_x73qc")
}, {
"duration": 1.0,
"texture": ExtResource("39_vq1x5")
"texture": ExtResource("32_qrgip")
}, {
"duration": 1.0,
"texture": ExtResource("40_k80hd")
"texture": ExtResource("33_2ah26")
}, {
"duration": 1.0,
"texture": ExtResource("41_fcwhd")
"texture": ExtResource("34_2kb50")
}, {
"duration": 1.0,
"texture": ExtResource("42_p3kcj")
"texture": ExtResource("35_tl3rq")
}, {
"duration": 1.0,
"texture": ExtResource("43_lt2am")
"texture": ExtResource("36_p38v6")
}, {
"duration": 1.0,
"texture": ExtResource("44_a03gu")
"texture": ExtResource("37_0v1yx")
}, {
"duration": 1.0,
"texture": ExtResource("45_8k8du")
"texture": ExtResource("38_37u3v")
}, {
"duration": 1.0,
"texture": ExtResource("46_d4tyc")
"texture": ExtResource("39_fkaqq")
}, {
"duration": 1.0,
"texture": ExtResource("47_gjkxo")
"texture": ExtResource("40_okkqf")
}, {
"duration": 1.0,
"texture": ExtResource("48_1s2in")
"texture": ExtResource("41_c5tbi")
}, {
"duration": 1.0,
"texture": ExtResource("49_xusjq")
"texture": ExtResource("42_q66kk")
}, {
"duration": 1.0,
"texture": ExtResource("43_vvmec")
}],
"loop": true,
"name": &"walk_N",
@@ -409,49 +430,52 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("50_laj3v")
"texture": ExtResource("44_xff26")
}, {
"duration": 1.0,
"texture": ExtResource("51_w12ac")
"texture": ExtResource("45_7hvw5")
}, {
"duration": 1.0,
"texture": ExtResource("52_ww1el")
"texture": ExtResource("46_ib7pv")
}, {
"duration": 1.0,
"texture": ExtResource("53_5r8ch")
"texture": ExtResource("47_1ypi2")
}, {
"duration": 1.0,
"texture": ExtResource("54_twso8")
"texture": ExtResource("48_bb5nw")
}, {
"duration": 1.0,
"texture": ExtResource("55_qwddt")
"texture": ExtResource("49_4hl61")
}, {
"duration": 1.0,
"texture": ExtResource("56_665sf")
"texture": ExtResource("50_df5q1")
}, {
"duration": 1.0,
"texture": ExtResource("57_5qxwo")
"texture": ExtResource("51_dnhwr")
}, {
"duration": 1.0,
"texture": ExtResource("58_cv6on")
"texture": ExtResource("52_0rhxg")
}, {
"duration": 1.0,
"texture": ExtResource("59_1ubhi")
"texture": ExtResource("53_lh1ea")
}, {
"duration": 1.0,
"texture": ExtResource("60_dqjs6")
"texture": ExtResource("54_i0lgs")
}, {
"duration": 1.0,
"texture": ExtResource("61_fj0td")
"texture": ExtResource("55_av2vk")
}, {
"duration": 1.0,
"texture": ExtResource("9_pyi2f")
"texture": ExtResource("56_xba83")
}, {
"duration": 1.0,
"texture": ExtResource("62_1oix2")
"texture": ExtResource("57_v6qvo")
}, {
"duration": 1.0,
"texture": ExtResource("63_hkmm4")
"texture": ExtResource("58_kmnvl")
}, {
"duration": 1.0,
"texture": ExtResource("59_fuy8j")
}],
"loop": true,
"name": &"walk_NE",
@@ -459,49 +483,52 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("64_f3le7")
"texture": ExtResource("60_uysyb")
}, {
"duration": 1.0,
"texture": ExtResource("65_c1022")
"texture": ExtResource("61_0yvyt")
}, {
"duration": 1.0,
"texture": ExtResource("66_1r88r")
"texture": ExtResource("62_6i2ne")
}, {
"duration": 1.0,
"texture": ExtResource("67_fo0ow")
"texture": ExtResource("63_cdocw")
}, {
"duration": 1.0,
"texture": ExtResource("68_m0ljg")
"texture": ExtResource("64_emfac")
}, {
"duration": 1.0,
"texture": ExtResource("69_4wwa5")
"texture": ExtResource("65_24r7p")
}, {
"duration": 1.0,
"texture": ExtResource("70_ouq1l")
"texture": ExtResource("66_p6u0u")
}, {
"duration": 1.0,
"texture": ExtResource("71_gygjm")
"texture": ExtResource("67_n8x0v")
}, {
"duration": 1.0,
"texture": ExtResource("10_l4ay1")
"texture": ExtResource("68_amoxi")
}, {
"duration": 1.0,
"texture": ExtResource("72_0kaxt")
"texture": ExtResource("69_5csai")
}, {
"duration": 1.0,
"texture": ExtResource("73_db5ja")
"texture": ExtResource("70_b3d6q")
}, {
"duration": 1.0,
"texture": ExtResource("74_1jmh4")
"texture": ExtResource("71_m405h")
}, {
"duration": 1.0,
"texture": ExtResource("75_i71gw")
"texture": ExtResource("72_p25cj")
}, {
"duration": 1.0,
"texture": ExtResource("76_t4gew")
"texture": ExtResource("73_8hyjb")
}, {
"duration": 1.0,
"texture": ExtResource("77_bn0fg")
"texture": ExtResource("74_8q4hi")
}, {
"duration": 1.0,
"texture": ExtResource("75_uff0b")
}],
"loop": true,
"name": &"walk_NW",
@@ -509,49 +536,52 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("159_6fkdd")
"texture": ExtResource("76_dsexq")
}, {
"duration": 1.0,
"texture": ExtResource("160_llhmj")
"texture": ExtResource("77_hwnuj")
}, {
"duration": 1.0,
"texture": ExtResource("161_uupqn")
"texture": ExtResource("78_ivvdo")
}, {
"duration": 1.0,
"texture": ExtResource("162_vqsv2")
"texture": ExtResource("79_786ir")
}, {
"duration": 1.0,
"texture": ExtResource("163_nrmid")
"texture": ExtResource("80_5p581")
}, {
"duration": 1.0,
"texture": ExtResource("164_orhiv")
"texture": ExtResource("81_5yp8t")
}, {
"duration": 1.0,
"texture": ExtResource("165_qik70")
"texture": ExtResource("82_8umh2")
}, {
"duration": 1.0,
"texture": ExtResource("166_414b7")
"texture": ExtResource("83_dn78y")
}, {
"duration": 1.0,
"texture": ExtResource("167_gugxh")
"texture": ExtResource("84_vjaoi")
}, {
"duration": 1.0,
"texture": ExtResource("168_525u8")
"texture": ExtResource("85_1bupr")
}, {
"duration": 1.0,
"texture": ExtResource("169_wbmcb")
"texture": ExtResource("86_def6r")
}, {
"duration": 1.0,
"texture": ExtResource("170_t83h1")
"texture": ExtResource("87_se17v")
}, {
"duration": 1.0,
"texture": ExtResource("171_ifskr")
"texture": ExtResource("88_atafq")
}, {
"duration": 1.0,
"texture": ExtResource("172_rfe2v")
"texture": ExtResource("89_60r7o")
}, {
"duration": 1.0,
"texture": ExtResource("173_q1b42")
"texture": ExtResource("90_ub7dx")
}, {
"duration": 1.0,
"texture": ExtResource("91_e7eqt")
}],
"loop": true,
"name": &"walk_S",
@@ -559,49 +589,52 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("12_84jj5")
"texture": ExtResource("92_3vrr3")
}, {
"duration": 1.0,
"texture": ExtResource("92_ie3g4")
"texture": ExtResource("93_6epyu")
}, {
"duration": 1.0,
"texture": ExtResource("93_nm270")
"texture": ExtResource("94_pjif5")
}, {
"duration": 1.0,
"texture": ExtResource("94_vawqf")
"texture": ExtResource("95_1h26f")
}, {
"duration": 1.0,
"texture": ExtResource("95_m3ymp")
"texture": ExtResource("96_klrxs")
}, {
"duration": 1.0,
"texture": ExtResource("96_xowhf")
"texture": ExtResource("97_nwnj3")
}, {
"duration": 1.0,
"texture": ExtResource("97_3asjl")
"texture": ExtResource("98_bbx6e")
}, {
"duration": 1.0,
"texture": ExtResource("98_bl8n8")
"texture": ExtResource("99_bru01")
}, {
"duration": 1.0,
"texture": ExtResource("99_ski6f")
"texture": ExtResource("100_cp2xd")
}, {
"duration": 1.0,
"texture": ExtResource("100_mf0u4")
"texture": ExtResource("101_jbccs")
}, {
"duration": 1.0,
"texture": ExtResource("101_stlf2")
"texture": ExtResource("102_bu1yf")
}, {
"duration": 1.0,
"texture": ExtResource("102_3uaju")
"texture": ExtResource("103_1484e")
}, {
"duration": 1.0,
"texture": ExtResource("103_k4pwn")
"texture": ExtResource("104_scw7s")
}, {
"duration": 1.0,
"texture": ExtResource("104_yudkd")
"texture": ExtResource("105_timr7")
}, {
"duration": 1.0,
"texture": ExtResource("105_gyxix")
"texture": ExtResource("106_nlo5j")
}, {
"duration": 1.0,
"texture": ExtResource("107_yna12")
}],
"loop": true,
"name": &"walk_SE",
@@ -609,49 +642,52 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("13_ttpag")
"texture": ExtResource("108_tbxo8")
}, {
"duration": 1.0,
"texture": ExtResource("106_tj1k5")
"texture": ExtResource("109_cwboe")
}, {
"duration": 1.0,
"texture": ExtResource("107_gmbms")
"texture": ExtResource("110_fci48")
}, {
"duration": 1.0,
"texture": ExtResource("108_o7aaa")
"texture": ExtResource("111_oo60o")
}, {
"duration": 1.0,
"texture": ExtResource("109_7sodb")
"texture": ExtResource("112_jk871")
}, {
"duration": 1.0,
"texture": ExtResource("110_5od0t")
"texture": ExtResource("113_fqwbh")
}, {
"duration": 1.0,
"texture": ExtResource("111_mgwvh")
"texture": ExtResource("114_boqln")
}, {
"duration": 1.0,
"texture": ExtResource("112_0r2r0")
"texture": ExtResource("115_gjc4p")
}, {
"duration": 1.0,
"texture": ExtResource("113_vlgai")
"texture": ExtResource("116_338xc")
}, {
"duration": 1.0,
"texture": ExtResource("114_2fgrx")
"texture": ExtResource("117_v50lk")
}, {
"duration": 1.0,
"texture": ExtResource("115_gtwhg")
"texture": ExtResource("118_ssq1t")
}, {
"duration": 1.0,
"texture": ExtResource("116_clvmm")
"texture": ExtResource("119_huqp0")
}, {
"duration": 1.0,
"texture": ExtResource("117_wons0")
"texture": ExtResource("120_274ja")
}, {
"duration": 1.0,
"texture": ExtResource("118_im20t")
"texture": ExtResource("121_u8w2y")
}, {
"duration": 1.0,
"texture": ExtResource("119_31gcv")
"texture": ExtResource("122_1pwk6")
}, {
"duration": 1.0,
"texture": ExtResource("123_248hs")
}],
"loop": true,
"name": &"walk_SW",
@@ -659,49 +695,52 @@ animations = [{
}, {
"frames": [{
"duration": 1.0,
"texture": ExtResource("120_qeejn")
"texture": ExtResource("124_uy2xp")
}, {
"duration": 1.0,
"texture": ExtResource("121_h6nhi")
"texture": ExtResource("125_o8wjp")
}, {
"duration": 1.0,
"texture": ExtResource("122_grugb")
"texture": ExtResource("126_y4i6c")
}, {
"duration": 1.0,
"texture": ExtResource("123_yoybg")
"texture": ExtResource("127_qpxhg")
}, {
"duration": 1.0,
"texture": ExtResource("124_8jd8x")
"texture": ExtResource("128_fua1r")
}, {
"duration": 1.0,
"texture": ExtResource("125_nm7rs")
"texture": ExtResource("129_i3cnu")
}, {
"duration": 1.0,
"texture": ExtResource("126_cviwa")
"texture": ExtResource("130_bt6sr")
}, {
"duration": 1.0,
"texture": ExtResource("127_bpypy")
"texture": ExtResource("131_u0i8g")
}, {
"duration": 1.0,
"texture": ExtResource("128_qenlf")
"texture": ExtResource("132_wvpsm")
}, {
"duration": 1.0,
"texture": ExtResource("129_7b1px")
"texture": ExtResource("133_dxmcl")
}, {
"duration": 1.0,
"texture": ExtResource("14_2ts53")
"texture": ExtResource("134_u084s")
}, {
"duration": 1.0,
"texture": ExtResource("130_w3x52")
"texture": ExtResource("135_lflbb")
}, {
"duration": 1.0,
"texture": ExtResource("131_nfjxv")
"texture": ExtResource("136_08xgv")
}, {
"duration": 1.0,
"texture": ExtResource("132_v1scd")
"texture": ExtResource("137_j38cn")
}, {
"duration": 1.0,
"texture": ExtResource("133_kxwux")
"texture": ExtResource("138_wfkq6")
}, {
"duration": 1.0,
"texture": ExtResource("139_aqsva")
}],
"loop": true,
"name": &"walk_W",
@@ -770,14 +809,13 @@ unique_name_in_owner = true
z_as_relative = false
texture_filter = 2
material = SubResource("ShaderMaterial_sle7q")
position = Vector2(-14, -13)
scale = Vector2(1.5, 1.5)
position = Vector2(-14.000001, -23)
scale = Vector2(0.59, 0.59)
sprite_frames = SubResource("1")
animation = &"walk_SE"
frame = 10
frame_progress = 0.19484821
animation = &"walk_W"
frame_progress = 0.08623318
speed_scale = 2.0
offset = Vector2(1.33333, -413.333)
offset = Vector2(1.333, -800)
[node name="ClipMask" type="AnimatedSprite2D" parent="." unique_id=61198776]
visible = false

View File

@@ -10,6 +10,8 @@
[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")
@@ -183,3 +185,23 @@ 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

@@ -476,5 +476,54 @@ func switch_camera(path):
func reset_camera():
var thing = ResetCamera.new()
return thing
class GiveItem:
extends ScriptNode
var item_id: String = ""
var text: String = ""
var subject: Node2D = null
var done = false
var started = false
func step_type():
return "GiveItem " + item_id
func init(scene):
super(scene)
func do(delta):
if not started:
started = true
if text:
await scene.find_child("dialogue").say(text)
InventoryManager.acquire_item(item_id)
done = true
func is_done():
return done
func interrupt():
done = true
class GiveItemDeferred:
extends GiveItem
var subject_name: String = ""
func init(scene):
super(scene)
subject = scene.get_node(subject_name)
func give_item(item_id: String, text: String = ""):
var step = GiveItem.new()
step.item_id = item_id
step.text = text
return step
func give_item_deferred(item_id: String, subject_name: String, text: String = ""):
var step = GiveItemDeferred.new()
step.item_id = item_id
step.subject_name = subject_name
step.text = text
return step
var current_script : ScriptGraph = null

View File

@@ -21,6 +21,7 @@ msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
modulate_color_glyphs=false
hinting=1
subpixel_positioning=1
keep_rounding_remainders=true

View File

@@ -3,6 +3,7 @@ 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
@@ -14,6 +15,7 @@ func _ready():
# get_scene().connect("transitioned", Callable($SceneViewport/label, "_on_transitioned"))
get_scene().connect("transitioned", Callable(self, "_on_transitioned"))
reset_camera(get_scene())
ActionState.set_current_scene(get_scene())
pass # Replace with function body.
@@ -21,6 +23,7 @@ func _ready():
func _on_transitioned(scene):
reset_camera(scene)
$SceneViewport/label._on_transitioned(scene)
ActionState.set_current_scene(scene)
camera.position = Vector2(0,0 )
#scene.connect("transitioned", $SceneViwport/label, "_on_transitioned")
scene.connect("transitioned", Callable(self, "_on_transitioned"))
@@ -67,14 +70,46 @@ func set_script_cursor() -> void:
func restore_cursor() -> void:
is_script_running = false
is_cursor_locked = false # Unlock cursor
Input.set_custom_mouse_cursor(cursors[previous_cursor_index])
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])
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()
if event.is_action_released("right_click") and not is_cursor_locked:
ActionState.current_action = (ActionState.current_action + 1) % 4
Input.set_custom_mouse_cursor(cursors[ActionState.current_action])
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))
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))
else:
if prev_action == ActionState.Action.ITEM:
InventoryManager.clear_selection()
Input.set_custom_mouse_cursor(cursors[ActionState.current_action], Input.CursorShape.CURSOR_ARROW, Vector2(0,0))

View File

@@ -128,7 +128,12 @@ func _unhandled_input(event):
if ScriptBuilder.current_script and not ScriptBuilder.current_script.can_interrupt:
if ScriptBuilder.current_script.handle_input(event):
return
# Block input when inventory overlay is active
var overlay = get_node_or_null("/root/Node2D/InventoryOverlay")
if overlay and overlay is InventoryOverlay and overlay.is_active():
return
var root = get_node("/root/Node2D")
# If look cursor is active and we got here, no SetPiece handled the input
# so this is a room-wide look
@@ -138,7 +143,46 @@ func _unhandled_input(event):
if ActionState.current_action == ActionState.Action.WALK:
var path = NavigationServer2D.map_get_path(map, ego.position, pathfind.to_local(get_global_mouse_position()), true)
start_main_script(ScriptBuilder.init(ScriptBuilder.walk_path(ego, path)).can_interrupt().build(self, "_on_script_complete"))
if ActionState.current_action == ActionState.Action.ITEM:
_on_item_use_in_world()
func _on_room_looked() -> void:
# Default room look description - override in room scripts
pass
func _on_item_use_in_world() -> void:
if not InventoryManager.selected_item:
return
var item_id = InventoryManager.selected_item
var top_piece = ActionState.get_top_hovered_setpiece()
if top_piece:
_use_item_on_setpiece(item_id, top_piece)
else:
_on_item_used_empty_space(item_id)
func _use_item_on_setpiece(item_id: String, piece: SetPiece) -> void:
if piece.has_method("_on_item_used"):
piece._on_item_used(item_id)
else:
var def = InventoryManager.get_item_definition(item_id)
var item_name = item_id
if def:
item_name = def.name
var piece_name = piece.label if piece.label else piece.name
start_main_script(ScriptBuilder.init(ScriptBuilder.say(ego, "I can't use the %s on the %s." % [item_name, piece_name])).build(self, "_on_script_complete"))
func _on_item_used_empty_space(item_id: String) -> void:
var def = InventoryManager.get_item_definition(item_id)
var item_name = item_id
if def:
item_name = def.name
start_main_script(ScriptBuilder.init(ScriptBuilder.say(ego, "There's nothing to use the %s on here." % [item_name])).build(self, "_on_script_complete"))
func give_item(item_id: String) -> void:
InventoryManager.acquire_item(item_id)
func remove_item(item_id: String, quiet: bool = false) -> void:
InventoryManager.remove_item(item_id, quiet)
func strip_items(event_items: Array[String], exempt_items: Array[String] = []) -> void:
InventoryManager.bulk_strip_items(event_items, exempt_items)

View File

@@ -17,7 +17,8 @@ func _ready():
notify_property_list_changed()
pass
else:
hide()
pass
# hide()
pass # Replace with function body
@@ -40,74 +41,43 @@ signal exited(lab)
points_resource = value
_update_polygon_from_resource()
var is_in = false
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
if Engine.is_editor_hint():
self.color.a = 0.25
else:
if Geometry2D.is_point_in_polygon(to_local(get_global_mouse_position()), self.polygon):
if is_in == false:
is_in = true
emit_signal("entered", label)
else:
if is_in == true:
emit_signal("exited", label)
is_in = false
func _get_overlapping_setpieces() -> Array[SetPiece]:
var overlapping: Array[SetPiece] = []
var mouse_pos = to_local(get_global_mouse_position())
for child in get_tree().get_nodes_in_group("set-piece"):
if child is SetPiece and child != self:
if child.polygon.size() > 0 and Geometry2D.is_point_in_polygon(mouse_pos, child.polygon):
overlapping.append(child)
return overlapping
func _input(event):
if not Engine.is_editor_hint():
if Geometry2D.is_point_in_polygon(to_local(get_global_mouse_position()), self.polygon):
if event is InputEventMouseButton and Input.is_action_just_released("interact"):
# Check if a script is running that shouldn't be interrupted
var script_builder = get_node_or_null("/root/Node2D/GameScript")
if script_builder and script_builder.current_script and not script_builder.current_script.can_interrupt:
return # Let the script handle the input
# Find all overlapping SetPieces and check if this one has highest priority
var overlapping = _get_overlapping_setpieces()
overlapping.append(self)
var max_priority = self.priority
for piece in overlapping:
if piece.priority > max_priority:
max_priority = piece.priority
# Only process if this SetPiece has the highest priority
if self.priority < max_priority:
return
get_viewport().set_input_as_handled()
# Check if interacted signal has connections - it takes precedence
if interacted.get_connections().size() > 0:
emit_signal("interacted")
return
# Otherwise, emit action-specific signal based on current cursor
match ActionState.current_action:
ActionState.Action.WALK:
if walked.get_connections().size() > 0:
emit_signal("walked")
ActionState.Action.LOOK:
if looked.get_connections().size() > 0:
emit_signal("looked")
ActionState.Action.TOUCH:
if touched.get_connections().size() > 0:
emit_signal("touched")
ActionState.Action.TALK:
if talked.get_connections().size() > 0:
emit_signal("talked")
if event is InputEventMouseButton and Input.is_action_just_released("interact"):
# Check if a script is running that shouldn't be interrupted
var script_builder = get_node_or_null("/root/Node2D/GameScript")
if script_builder and script_builder.current_script and not script_builder.current_script.can_interrupt:
return # Let the script handle the input
# Check if this is the top-priority hovered SetPiece
var top_piece = ActionState.get_top_hovered_setpiece()
if top_piece != self:
return
get_viewport().set_input_as_handled()
# Check if interacted signal has connections - it takes precedence
if interacted.get_connections().size() > 0:
emit_signal("interacted")
return
# Otherwise, emit action-specific signal based on current cursor
match ActionState.current_action:
ActionState.Action.WALK:
if walked.get_connections().size() > 0:
emit_signal("walked")
ActionState.Action.LOOK:
if looked.get_connections().size() > 0:
emit_signal("looked")
ActionState.Action.TOUCH:
if touched.get_connections().size() > 0:
emit_signal("touched")
ActionState.Action.TALK:
if talked.get_connections().size() > 0:
emit_signal("talked")
ActionState.Action.ITEM:
if InventoryManager.selected_item:
var item_id = InventoryManager.selected_item
var scene = get_node_or_null("/root/Node2D/SceneViewport/background")
if scene and scene is Scene:
scene._use_item_on_setpiece(item_id, self)

View File

@@ -10,9 +10,7 @@ func _ready():
super()
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
super(delta)
func default_script(scene: Scene):
var path = NavigationServer2D.map_get_path(scene.map, scene.pathfind.to_local(scene.ego.global_position), scene.pathfind.to_local($"exit".global_position), true)

View File

@@ -21,6 +21,7 @@ msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
modulate_color_glyphs=false
hinting=1
subpixel_positioning=1
keep_rounding_remainders=true

BIN
boot_icon.png LFS

Binary file not shown.

View File

@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/boot_icon.png-2296416b096145c4821e2741d23d2ff
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
@@ -25,6 +27,10 @@ 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

View File

@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/boot_icon_big.png-68985c79f5e6cd0bab8b15bee07
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
@@ -25,6 +27,10 @@ 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

View File

@@ -0,0 +1,546 @@
---
title: feat: Inventory and Backpack System
type: feat
status: active
date: 2026-04-26
origin: inventory-prd.md
---
# Inventory and Backpack System
## Overview
Add a full inventory and backpack system to the point-and-click adventure game: a global inventory manager, an animated HUD backpack icon with a finite state machine, a full-screen inventory overlay for item viewing and combination, and integration with the existing cursor and scene systems.
---
## Problem Frame
The game currently has no concept of items, inventory, or item interaction. Players cannot pick up objects, combine items, or use items on entities in the game world. This system establishes the foundational item management infrastructure needed for adventure game gameplay.
---
## Requirements Trace
- R1. Current inventory is an ordered list preserving insertion order (AC-1)
- R2. Obtained items set persists across removal (AC-1)
- R3. Stripped items vault for forced removal recovery (AC-9)
- R4. Item definitions include name, identifier, and optional combination category. Interaction handlers are signals emitted by items, not embedded data (PRD §2.2)
- R5. Inventory queries: has_item, has_obtained, has_any_of, has_obtained_any_of, has_obtained_all_of (PRD §2.3)
- R6. HUD Backpack FSM with Idle, Open, Selected, Acquire, Remove states. Multi-step transition queuing is deferred — transitions execute immediately and interrupt any in-flight animation (AC-2, PRD §4)
- R7. Inventory overlay with grid layout, hover text, drag-and-drop, item selection, and combination (AC-3 through AC-6, AC-12, AC-13, PRD §5)
- R8. Item acquisition animation and sound (AC-7, PRD §6)
- R9. Item removal animation with quiet mode and bulk removal support (AC-8, AC-9, PRD §7)
- R10. Cursor system integration with item-specific cursors (AC-10, AC-14, PRD §8)
- R11. Guard conditions: foreground action, screen fade, game pause (AC-11, PRD §9)
- R12. Game world item use: left-click entity interaction, right-click return (AC-10, PRD §10)
---
## Scope Boundaries
- Audio assets are not part of this system
- Item sprite assets are out of scope — use colored `ColorRect` boxes as placeholders for all item/backpack visuals
- Save/load persistence for inventory is deferred — the manager should be structured to support it, but serialization is not implemented
- Item tooltips beyond name and combination hints are deferred
- Multi-step transition queuing is deferred — transitions interrupt in-flight animations immediately
### Deferred to Follow-Up Work
- Inventory save/load serialization: separate PR once save system infrastructure exists
- Item sprite asset creation: replace colored boxes with actual sprites in a separate art pass
- Multi-step transition queuing: add FIFO queue for rapid transitions in a follow-up
---
## Context & Research
### Relevant Code and Patterns
- `ActionState.gd` — Existing autoload singleton tracking cursor action (WALK/LOOK/TOUCH/TALK). Pattern to follow for `InventoryManager` autoload.
- `MainGame.gd` — Root scene (`Game.tscn`) that handles cursor switching via `Input.set_custom_mouse_cursor()`, scene transitions, and script-running cursor lock. The inventory system must integrate here for cursor management and guard conditions.
- `GameScript.gd` — Script builder with `ScriptGraph` for cutscenes. The `Narrate` class shows the pattern for overlay fade-in/fade-out with `modulate.a` tweens, and the `is_script_running` / `is_cursor_locked` pattern in `MainGame.gd` is the guard condition model.
- `Scene.gd` — Base room class. `_unhandled_input()` handles walk and look actions. Inventory input must be gated so overlay blocks game-world input.
- `SetPiece_.gd` — Interactive polygon areas. The `_input()` pattern shows how `ActionState` and `GameScript.current_script` are checked before processing input.
- `Game.tscn` — Root scene tree with `SubViewport` for game world, `CanvasLayer` for overlays (NarratorOverlay at layer 10), and `AnimationPlayer` for fades.
- `label.gd` — Floating label that follows mouse position in game world coordinates.
### Institutional Learnings
- None yet — no `docs/solutions/` entries exist.
### External References
- PRD §13 provides detailed Godot 4 node architecture brainstorm, including FSM implementation options, drag-and-drop approach, cursor system, input priority patterns, and signal flow. The plan follows the PRD's recommended approaches throughout.
---
## Key Technical Decisions
- **Hand-rolled FSM (PRD Option A)**: The backpack FSM uses a GDScript enum + Tween-based transitions, not `AnimationTree`. Transitions execute immediately and kill any in-flight animation — no FIFO queuing.
- **AutoLoad singleton for InventoryManager**: Follows the `ActionState` pattern. Signals (`item_acquired`, `item_removed`, `inventory_changed`) decouple the manager from UI components.
- **Signal-based interaction handlers**: Items emit signals for interactions rather than embedding interaction data in dictionaries. Room scenes connect to item signals to handle entity-specific behavior.
- **Item cursor as ActionState slot 5**: Item selection sets `ActionState.current_action = Action.ITEM` (slot 5). Right-click cycles WALK→LOOK→TOUCH→TALK→ITEM→WALK. The selected item is stored in `InventoryManager.selected_item`. Scripts and interactions fire the same way as regular cursor actions — item use is handled through the existing interaction signal pattern.
- **Raw `_gui_input()` for overlay drag-and-drop**: Godot's built-in drag-and-drop is a partial fit. Real-time cursor following, drag-out-close, and hover-under-drag tracking are more naturally handled with `InputEventMouseButton` and `InputEventMouseMotion` in `_gui_input()`.
- **Combined input priority defense**: Overlay background `ColorRect` with `MOUSE_FILTER_STOP` + `accept_event()` blocks Control input. Game world uses `_unhandled_input()` which is already filtered by Control `accept_event()`. An explicit `overlay_active` guard flag provides a safety net for `Node2D._input_event()` bypass. (PRD §13.10)
- **Colored boxes for placeholders**: All item sprites, backpack visuals, and cursor assets use colored `ColorRect` boxes instead of textures. Easy to replace with actual sprites later.
- **GridContainer for item grid**: Static layout uses Godot's `GridContainer`. During drag, items are reparented or switch to `PRESERVE_WIDE` anchors for free movement.
---
## Open Questions
### Resolved During Planning
- **Should the inventory overlay live under MainGame or be a separate autoload?** Under `MainGame` as a child node in `Game.tscn`. It needs to interact with the scene's input and animation system, and keeping it in the scene tree simplifies lifecycle management.
- **How does the backpack FSM know about guard conditions?** The FSM checks `GameScript.current_script` (foreground action), the Fade sprite's `modulate.a` (screen fade), and a pause flag on `MainGame`. If a guard blocks opening, clicking the backpack attempts to skip the running action.
- **Where does item combination logic live?** In `InventoryManager` as `attempt_combine(item_a, item_b)`. The manager looks up interactions on both items (forward and reverse), evaluates dynamic rules, and emits `combination_succeeded` or `combination_refused` signals.
### Deferred to Implementation
- Exact animation frame counts for backpack open/close sprite sequences — depends on final sprite assets
- Whether `ItemDefinition` interaction handlers use a `Dictionary` or a callable-based registry — either works; the implementer should choose based on what feels cleaner with GDScript's type system
---
## Output Structure
res://
├── inventory/
│ ├── InventoryManager.gd # AutoLoad singleton
│ ├── InventoryManager.gd.uid
│ ├── ItemDefinition.gd # Custom Resource class
│ ├── ItemDefinition.gd.uid
│ ├── inventory_backpack/
│ │ ├── InventoryBackpack.tscn # HUD backpack FSM scene
│ │ ├── InventoryBackpack.tscn.uid
│ │ ├── InventoryBackpack.gd # FSM script
│ │ └── InventoryBackpack.gd.uid
│ └── inventory_overlay/
│ ├── InventoryOverlay.tscn # Full-screen overlay scene
│ ├── InventoryOverlay.tscn.uid
│ ├── InventoryOverlay.gd # Overlay interaction script
│ ├── InventoryOverlay.gd.uid
│ ├── InventorySlot.tscn # Single item slot scene
│ ├── InventorySlot.tscn.uid
│ ├── InventorySlot.gd # Slot behavior script
│ └── InventorySlot.gd.uid
---
## High-Level Technical Design
> *This illustrates the intended approach and is directional guidance for review, not implementation specification. The implementing agent should treat it as context, not code to reproduce.*
```
┌─────────────────────────────────────────────────────────────┐
│ Game.tscn │
│ ┌─────────────────────────────────────────────────────────┐│
│ │ SceneViewport (SubViewport) ││
│ │ └── background (Scene) ││
│ │ └── game world entities ││
│ └─────────────────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────────────────┐│
│ │ HUD (CanvasLayer, layer=5) ││
│ │ └── InventoryBackpack (FSM) ││
│ │ ├── AnimationPlayer (backpack sprites) ││
│ │ ├── ColorRect (backpack icon placeholder) ││
│ │ └── FloatingItem (selected item placeholder) ││
│ └─────────────────────────────────────────────────────────┘│
│ ┌─────────────────────────────────────────────────────────┐│
│ │ InventoryOverlay (CanvasLayer, layer=10) ││
│ │ ├── ColorRect (MOUSE_FILTER_STOP background) ││
│ │ └── InventoryPanel ││
│ │ ├── TextureRect (decorative frame) ││
│ │ ├── GridContainer (item grid) ││
│ │ │ └── InventorySlot × N (dynamic) ││
│ │ └── HoverLabel ││
│ └─────────────────────────────────────────────────────────┘│
│ │
│ InventoryManager (AutoLoad singleton) │
│ ├── inventory: Array[String] (ordered) │
│ ├── obtained_items: Dictionary (set) │
│ ├── stripped_items: Array[String] (ordered) │
│ ├── selected_item: String (currently held item) │
│ └── signals: item_acquired, item_removed, │
│ inventory_changed, combination_attempted │
└─────────────────────────────────────────────────────────────┘
```
### Signal Flow
```
InventoryManager
├─ item_acquired(item_id) → InventoryBackpack._on_item_acquired()
├─ item_removed(item_id) → InventoryBackpack._on_item_removed()
└─ inventory_changed → InventoryOverlay._refresh_grid()
InventoryBackpack (FSM)
├─ overlay_show_requested → InventoryOverlay.show()
├─ item_selected(item_def) → MainGame._on_item_selected()
│ (set ActionState.ITEM, store selected item)
└─ returning_to_idle → InventoryOverlay.hide()
InventoryOverlay
├─ close_requested → InventoryBackpack.transition_to(IDLE)
├─ combine_requested(a, b) → InventoryManager.attempt_combine(a, b)
└─ inspect_requested(item) → Scene.play_ego_script(item)
ActionState
├─ right-click cycles: WALK→LOOK→TOUCH→TALK→ITEM→WALK
└─ ITEM action triggers same interaction flow as other cursors
MainGame / Scene
├─ backpack_clicked → InventoryBackpack.transition_to(OPEN) (guarded)
├─ world_entity_clicked (ITEM) → entity receives item interaction signal
└─ right-click in world → cycles cursor (ITEM→WALK, returns item)
```
---
## Implementation Units
- U1. **ItemDefinition Resource**
**Goal:** Define the data structure for inventory items as a Godot `Resource`.
**Requirements:** R4
**Dependencies:** None
**Files:**
- Create: `inventory/ItemDefinition.gd`
- Create: `inventory/ItemDefinition.gd.uid`
**Approach:**
- Extend `Resource` with `class_name ItemDefinition`
- Fields: `id` (String, unique key), `name` (String), `combination_category` (String, optional)
- Signals emitted by items when interacted with: `item_used_on_entity(entity)`, `item_combined_with(other_item)`, `item_inspected()`. Room scenes connect to these signals to define entity-specific behavior.
- No embedded interaction data — all interaction logic lives in the scene scripts that receive the signals.
**Patterns to follow:**
- Godot `Resource` pattern for serializable data
- Existing `PolygonPointsResource.gd` as a simple example of a custom resource
**Test scenarios:**
- Happy path: Create ItemDefinition with id, name, and combination_category; verify fields are set correctly
- Edge case: Create ItemDefinition with no combination_category; verify it works as standalone item
- Edge case: Create ItemDefinition with empty name; verify id is still valid
**Verification:**
- Resource can be instantiated in code with all fields populated
- Resource can be saved as a `.tres` file and reloaded
---
- U2. **InventoryManager AutoLoad Singleton**
**Goal:** Global inventory state management with signals, queries, and combination logic.
**Requirements:** R1, R2, R3, R5, R8
**Dependencies:** U1 (ItemDefinition)
**Files:**
- Create: `inventory/InventoryManager.gd`
- Create: `inventory/InventoryManager.gd.uid`
- Modify: `project.godot` (add autoload)
**Approach:**
- Extend `Node` with signals: `item_acquired(item_id: String)`, `item_removed(item_id: String)`, `inventory_changed`, `combination_attempted(item_a_id: String, item_b_id: String)`
- State: `inventory` (Array[String], ordered), `obtained_items` (Dictionary used as set), `stripped_items` (Array[String])
- Query methods: `has_item(item_id)`, `has_obtained(item_id)`, `has_any_of(item_ids)`, `has_obtained_any_of(item_ids)`, `has_obtained_all_of(item_ids)`
- Mutation methods: `acquire_item(item_id)`, `remove_item(item_id, quiet=false)`, `bulk_strip_items(event_items, exempt_items)` — moves stripped items to vault
- Combination logic: `attempt_combine(item_a_id, item_b_id)` emits `combination_attempted` signal. Room scripts or scene handlers connect to this signal to define what happens when two items are combined. No embedded combination data in the manager.
- Item definitions registry: `get_item_definition(item_id)` loads from a registry. Items are registered via `register_item(item_def: ItemDefinition)`
**Patterns to follow:**
- `ActionState.gd` for autoload singleton pattern with signals
- `GameScript.gd` Narrate class for overlay fade pattern (reference for how overlays interact with game state)
**Test scenarios:**
- Happy path: Acquire item → verify it's in inventory and obtained_items
- Happy path: Remove item → verify it's removed from inventory but stays in obtained_items
- Happy path: attempt_combine emits combination_attempted signal → connected handler receives both item IDs
- Edge case: Acquire already-owned item → item added to inventory again (duplicates allowed in current inventory)
- Edge case: Remove item not in inventory → no crash, no change
- Edge case: Query has_any_of with empty set → returns false
- Edge case: Query has_obtained_all_of with empty set → returns true
- Integration: acquire_item emits item_acquired signal → connected handler receives correct item_id
- Integration: remove_item emits item_removed signal → connected handler receives correct item_id
- Integration: bulk_strip_items moves items to vault, exempts protected items, leaves obtained_items untouched
**Verification:**
- AutoLoad registered in `project.godot` and accessible as `InventoryManager` from any scene
- All query methods return correct boolean values for various inventory states
- combination_attempted signal emits correct item pair to connected handlers
- Signal emissions are correct for acquire, remove, and combination events
---
- U3. **HUD Backpack FSM**
**Goal:** Animated backpack icon with state machine for Idle, Open, Selected, Acquire, Remove states and multi-step queued transitions.
**Requirements:** R6, R7, R8, R9
**Dependencies:** U2 (InventoryManager)
**Files:**
- Create: `inventory/inventory_backpack/InventoryBackpack.tscn`
- Create: `inventory/inventory_backpack/InventoryBackpack.tscn.uid`
- Create: `inventory/inventory_backpack/InventoryBackpack.gd`
- Create: `inventory/inventory_backpack/InventoryBackpack.gd.uid`
- Create: `inventory/inventory_backpack/InventoryBackpack.tscn.uid`
**Approach:**
- Scene tree: `InventoryBackpack` (Control) → `AnimationPlayer`, `ColorRect` (backpack icon placeholder), `FloatingItem` (Control) → `ColorRect` (dynamic item placeholder)
- Anchored to top-right using Control anchors/offsets
- FSM enum: `IDLE`, `OPEN`, `SELECTED`, `ACQUIRE`, `REMOVE`
- Transitions execute immediately. No FIFO queuing — a new transition kills any in-flight tween and starts fresh.
- Each transition is a chain of `Tween` operations with `tween_callback()` for step completion. New `Tween` per transition (Godot 4 Tweens are not reusable).
- `kill_tween()` called on any active tween before starting a new transition
- `is_busy` flag prevents concurrent transitions but does NOT queue — new transitions during busy state are dropped or interrupt immediately.
- Item appearance animation primitive: `_animate_item(fade_dir, move_dir)` with parameters for show/hide and movement direction (out/none/in/far-out)
- Connect to `InventoryManager.item_acquired` and `InventoryManager.item_removed` signals
- Guard condition checks before `transition_to(OPEN)`: `GameScript.current_script` (foreground action), Fade sprite `modulate.a` (screen fade), pause flag
- If guard blocks open and foreground action is running, emit `skip_action_requested` signal
**Tween timing (from PRD §11.2):**
- Backpack rotation: linear, 0.35s
- Backpack position: ease-in, 0.35s
- Item appear/disappear: linear, 0.5s
**Patterns to follow:**
- PRD §13.2 (Option A: Hand-Rolled FSM) for FSM structure
- PRD §13.3 for Tween chaining with callbacks
- `Game.tscn` Fade animation pattern for reference on AnimationPlayer usage
**Test scenarios:**
- Happy path: Click backpack in Idle → transitions to Open, overlay shown
- Happy path: Acquire item in Idle → backpack opens, item appears and drops in, closes
- Happy path: Select item from overlay → transitions to Selected, floating item appears
- Happy path: Remove item in Idle → backpack opens, item appears and slides up, closes
- Edge case: Rapid transition requests → new transition interrupts in-flight animation immediately
- Edge case: Acquire item while Selected → replaces selected item with acquire animation
- Edge case: Remove selected item (same item) → item slides up and fades, clears selection
- Edge case: Remove different item while Selected → deselects current, shows removed item, slides up
- Edge case: Transition interrupted by new transition → old tween killed, new transition starts
- Integration: item_acquired signal from InventoryManager triggers Acquire animation
- Integration: item_removed signal from InventoryManager triggers Remove animation
- Integration: Guard condition blocks open when script running → skip_action_requested emitted
**Verification:**
- FSM starts in IDLE state
- All state transitions execute their multi-step animation sequences
- New transitions interrupt in-flight animations (no queuing)
- Tween objects are properly killed and recreated per transition
- Guard conditions prevent opening during foreground action, screen fade, or pause
---
- U4. **Inventory Overlay Screen**
**Goal:** Full-screen overlay with item grid, hover text, drag-and-drop selection, and item combination.
**Requirements:** R7, R12
**Dependencies:** U2 (InventoryManager), U3 (InventoryBackpack)
**Files:**
- Create: `inventory/inventory_overlay/InventoryOverlay.tscn`
- Create: `inventory/inventory_overlay/InventoryOverlay.tscn.uid`
- Create: `inventory/inventory_overlay/InventoryOverlay.gd`
- Create: `inventory/inventory_overlay/InventoryOverlay.gd.uid`
- Create: `inventory/inventory_overlay/InventorySlot.tscn`
- Create: `inventory/inventory_overlay/InventorySlot.tscn.uid`
- Create: `inventory/inventory_overlay/InventorySlot.gd`
- Create: `inventory/inventory_overlay/InventorySlot.gd.uid`
**Approach:**
- Scene tree: `InventoryOverlay` (Control, full-screen) → `ColorRect` (background, `MOUSE_FILTER_STOP`), `InventoryPanel` (Control, centered) → `TextureRect` (frame), `GridContainer` (item grid), `HoverLabel` (Label)
- Overlay opacity controlled via `modulate.a` tweened for 0.2s fade-in/fade-out
- `input_active` boolean flag — only `true` when fully opaque (AC-12)
- `_gui_input()` handles all interaction:
- Hover: track mouse-over item, update hover label text
- Press: select item for drag
- Motion during press: move item sprite to follow cursor, track hover under dragged item
- Release on same item ≤0.5s: confirm selection, emit `item_confirmed`, close
- Release on same item >0.5s: deselect (long-press cancel), stay open
- Release on different item: emit `combine_requested(a, b)` to InventoryManager
- Right-click on item: emit `inspect_requested(item)`, close
- Release on empty space: close
- Drag outside panel bounds: close immediately, discard selection
- `InventorySlot` is a lightweight Control with a `ColorRect` child (colored box placeholder), `custom_minimum_size` for cell dimensions, and hover highlight modulate
- `_refresh_grid()` called on `inventory_changed` signal: clears grid, instantiates `InventorySlot` for each item in `InventoryManager.inventory`
- Combination result handling: on `combination_succeeded`, grid refreshes automatically via signal. On `combination_refused`, show message via `GameScript.narrate()` or dialogue system.
**Patterns to follow:**
- `GameScript.gd` Narrate class for overlay fade pattern
- `Game.tscn` NarratorOverlay for CanvasLayer overlay pattern
- PRD §13.4 for Control hierarchy and drag-and-drop approach
**Test scenarios:**
- Happy path: Open overlay → items displayed in grid, left-to-right, top-to-bottom
- Happy path: Hover item with no selection → hover label shows item name
- Happy path: Select item A, hover item B → hover label shows "Use A with B"
- Happy path: Short-click item → item confirmed, overlay closes
- Happy path: Drag item A onto item B → combination attempted
- Happy path: Right-click item → inspect dialogue played, overlay closes
- Happy path: Click empty space → overlay closes, selection cleared
- Edge case: Long-press release (>0.5s) on item → deselected, overlay stays open
- Edge case: Drag item outside panel bounds → overlay closes, selection discarded
- Edge case: Overlay during fade-in → renders but doesn't accept input
- Edge case: Overlay during fade-out → renders but doesn't accept input
- Edge case: Empty inventory → grid shows no items
- Error path: Combine items with no interaction → refusal message shown
- Integration: inventory_changed signal refreshes grid with new items
- Integration: combine_requested signal sent to InventoryManager with correct item pair
- Integration: Hover text tracks item under dragged item during drag
**Verification:**
- Overlay fades in/out with correct timing
- Grid layout respects fixed maximum items per row
- All interaction outcomes match PRD §5.4 table
- Input is blocked during fade transitions
- Drag-out escape closes overlay and discards selection
---
- U5. **MainGame Integration — Cursor, Guards, World Item Use**
**Goal:** Integrate inventory system with existing cursor management, guard conditions, and game world item interaction.
**Requirements:** R10, R11, R12
**Dependencies:** U2 (InventoryManager), U3 (InventoryBackpack), U4 (InventoryOverlay)
**Files:**
- Modify: `MainGame.gd`
- Modify: `Game.tscn`
- Modify: `Scene.gd`
**Approach:**
- **Game.tscn changes:** Add `InventoryBackpack` and `InventoryOverlay` as children of `Node2D` (MainGame), under separate `CanvasLayer` nodes at appropriate layers. Backpack at layer 5 (HUD), overlay at layer 10 (full-screen).
- **ActionState.gd changes:**
- Add `ITEM` as the 5th action (value 4): `WALK=0`, `LOOK=1`, `TOUCH=2`, `TALK=3`, `ITEM=4`
- Right-click cycling logic updated: cycles through 0→1→2→3→4→0
- When cycling to ITEM, the cursor uses the selected item's colored box as cursor (placeholder)
- **MainGame.gd changes:**
- `_on_item_selected(item_def)`: Store item in `InventoryManager.selected_item`, set `ActionState.current_action = ActionState.Action.ITEM`
- Guard conditions: `can_open_inventory()` checks `GameScript.current_script` (foreground action), Fade `modulate.a` (screen fade), and pause state
- World item use: When `ActionState.current_action == Action.ITEM` and player left-clicks in game world, emit item's interaction signal for the clicked entity. If no entity clicked, show item's self-description.
- Right-click in game world with item selected → cycles cursor to next action (ITEM→WALK), effectively returning item to backpack
- Input routing: Ensure `_unhandled_input()` in `Scene.gd` checks `InventoryOverlay.input_active` before processing game-world clicks
- **Scene.gd changes:**
- Add guard in `_unhandled_input()`: if `InventoryOverlay` is active, return early
- When `ActionState.current_action == Action.ITEM`, pass selected item to clicked entity's interaction handler via signal
**Patterns to follow:**
- `ActionState.gd` for cursor action enum and cycling pattern
- `MainGame.gd` `_on_input_action()` for right-click cycling integration
- `Scene.gd` `_unhandled_input()` for input handling
- `SetPiece_.gd` for entity interaction pattern
- PRD §13.10 recommended combined input priority approach
**Test scenarios:**
- Happy path: Item selected from overlay → ActionState set to ITEM, item stored in InventoryManager
- Happy path: Right-click in world with ITEM active → cursor cycles to WALK, item returned
- Happy path: Left-click entity with ITEM active → entity receives item interaction signal
- Happy path: Left-click empty space with ITEM active → item self-description shown
- Edge case: Click backpack while script running → skip action attempted, inventory doesn't open
- Edge case: Click backpack during screen fade → inventory doesn't open
- Edge case: Inventory overlay active → game world input is suppressed
- Edge case: Entity has no handler for selected item → generic "nothing to do" message
- Integration: InventoryBackpack guard check returns false when foreground action running
- Integration: Scene._unhandled_input returns early when overlay is active
- Integration: Right-click cycling includes ITEM state (WALK→LOOK→TOUCH→TALK→ITEM→WALK)
**Verification:**
- ActionState includes ITEM as value 4, right-click cycles through all 5 states
- Guard conditions prevent inventory from opening during foreground action, screen fade, or pause
- Game world input is properly suppressed when overlay is active
- Item use triggers entity interaction signals when ActionState is ITEM
---
- U6. **Scene Integration Hooks — Acquisition and Removal**
**Goal:** Provide hooks for room scenes to acquire and remove items, with proper signal propagation and animation triggering.
**Requirements:** R6, R7, R8, R9
**Dependencies:** U2 (InventoryManager), U3 (InventoryBackpack)
**Files:**
- Modify: `Scene.gd` (add helper methods)
- Modify: `scenes/kq4_placeholder_template/kq4_placeholder_template.gd` (example usage)
**Approach:**
- Add helper methods to `Scene.gd` (or as static utilities accessible from any scene):
- `give_item(item_id)`: Calls `InventoryManager.acquire_item(item_id)`. The manager emits `item_acquired` which triggers the backpack's Acquire animation.
- `remove_item(item_id, quiet=false)`: Calls `InventoryManager.remove_item(item_id, quiet)`. The manager emits `item_removed` which triggers the backpack's Remove animation (unless quiet).
- `strip_items(event_items, exempt_items)`: Calls `InventoryManager.bulk_strip_items()`. Stripped items go to vault.
- `use_item_on_entity(item_id, entity)`: Checks if entity has an interaction handler for the item. If yes, executes it. If no, shows generic refusal.
- Room scripts can call these helpers from SetPiece signal handlers or GameScript steps.
- Add a `GameScript` step class for item acquisition: `GiveItem` step that plays dialogue, acquires the item, and triggers the animation.
- Example usage in placeholder template: show how a SetPiece `touched` signal handler calls `give_item()`.
**Patterns to follow:**
- `GameScript.gd` `Say` and `Narrate` classes for new `GiveItem` step
- `Scene.gd` `start_main_script` for script-based item acquisition
- `TransitionPiece.gd` for how room scripts interact with global systems
**Test scenarios:**
- Happy path: SetPiece touched → give_item called → item in inventory, backpack Acquire animation plays
- Happy path: Combination consumes item → remove_item called → item removed from inventory, backpack Remove animation plays
- Edge case: Quiet removal → item removed from inventory, no backpack animation
- Edge case: Give item while another item selected → selected item display replaced with new item
- Integration: give_item triggers InventoryManager.acquire_item → signal propagates to InventoryBackpack → Acquire animation starts
- Integration: bulk_strip_items moves items to vault, exempt items stay in inventory
**Verification:**
- Room scripts can call `give_item()` and `remove_item()` from signal handlers
- Item acquisition triggers proper backpack animation via signal chain
- Item removal respects quiet flag
- Bulk strip moves items to vault and exempts protected items
- `GiveItem` GameScript step integrates with existing script builder pattern
---
## System-Wide Impact
- **Interaction graph:** `InventoryManager` signals connect to `InventoryBackpack` (animations), `InventoryOverlay` (grid refresh), and `MainGame` (cursor management). `InventoryBackpack` signals connect to `InventoryOverlay` (show/hide). `InventoryOverlay` signals connect back to `InventoryManager` (combination) and `InventoryBackpack` (close). The signal loop is: Manager → Backpack → Overlay → Manager.
- **Error propagation:** Combination refusals propagate as `combination_refused` signal with message, handled by the overlay or scene's dialogue system. Invalid item IDs should be guarded with `push_warning()`.
- **State lifecycle risks:** The FSM's transition queue must handle rapid state changes correctly. If the backpack node is freed during a transition, `bind_node(self)` on Tweens ensures they die cleanly. The overlay's `input_active` flag must be set/cleared at exact fade boundaries to avoid the "input black hole" problem.
- **API surface parity:** The existing `ActionState` cursor actions (WALK/LOOK/TOUCH/TALK) continue to work normally when no item is selected. When an item is selected, the walk cursor effectively becomes "use item" — this is a behavioral override, not a change to `ActionState` itself.
- **Integration coverage:** The full signal chain from `InventoryManager.acquire_item()` → backpack Acquire animation → FSM returning to Idle must work as an integration scenario that mocks alone won't prove. Similarly, the overlay combination flow: click A → click B → `attempt_combine()``combination_succeeded` → items removed/added → grid refreshes → overlay closes.
- **Unchanged invariants:** The existing cursor cycling (right-click cycles WALK/LOOK/TOUCH/TALK) is unchanged. The `ActionState` autoload is unchanged. The `GameScript` system continues to work for cutscenes — the new `GiveItem` step extends it without modifying existing steps.
---
## Risks & Dependencies
| Risk | Mitigation |
|------|-----------|
| Tween lifecycle bugs: FSM transitions interrupted mid-animation leave visual state inconsistent | Always `kill()` active tween before starting new transition. Use `bind_node(self)` to auto-clean on node free. |
| Input black hole during overlay fade transitions | `input_active` flag toggled at exact fade boundaries. Overlay blocks input from fade-start through fade-end. Game world regains input only after fade-out completes. |
| Node2D vs Control input gap: overlay `accept_event()` doesn't suppress `Node2D._input_event()` | Combined defense: `MOUSE_FILTER_STOP` background + `_unhandled_input()` gate in Scene + explicit `overlay_active` guard flag checked by game world. |
| GridContainer limitations during drag: item reparenting causes layout flicker | Test drag behavior early. If GridContainer causes issues, switch to manual grid positioning in a custom Control. |
| Combination logic complexity: dynamic rules, prerequisites, order guards | Start with static dictionary lookups (forward + reverse). Add dynamic category rules and guards as separate methods that can be extended per item. |
---
## Documentation / Operational Notes
- Item definitions (`.tres` files) should be placed in a dedicated `inventory/items/` directory when they are created
- The `InventoryManager` autoload should be documented in a brief comment at the top of its file, listing all signals and public methods
- No CLAUDE.md or AGENTS.md updates needed — the inventory system follows existing patterns (autoload singletons, scene hierarchy, signal-based communication)
---
## Sources & References
- **Origin document:** [inventory-prd.md](inventory-prd.md)
- Existing code: `ActionState.gd`, `MainGame.gd`, `GameScript.gd`, `Scene.gd`, `SetPiece_.gd`, `Game.tscn`
- Godot 4.6 docs: `Tween`, `Control`, `Resource`, `CanvasLayer`, `Input.create_custom_cursor()`

View File

@@ -18,6 +18,8 @@ dest_files=["res://.godot/imported/dragon.png-cd3ff3eaa8e7e24c15781ff6b9940064.c
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
@@ -25,6 +27,10 @@ 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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bvrsr0b55pbou"
path="res://.godot/imported/frame_0000.png-b2da7ec48320b00652e5e34531b24409.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0000.png"
dest_files=["res://.godot/imported/frame_0000.png-b2da7ec48320b00652e5e34531b24409.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bewoslpmmowgr"
path="res://.godot/imported/frame_0001.png-13d8d4ff8fb7e4f1132c1070be1eab98.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0001.png"
dest_files=["res://.godot/imported/frame_0001.png-13d8d4ff8fb7e4f1132c1070be1eab98.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b105ixtjlaemw"
path="res://.godot/imported/frame_0002.png-364696f5f255c004f638316c22cbe8fa.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0002.png"
dest_files=["res://.godot/imported/frame_0002.png-364696f5f255c004f638316c22cbe8fa.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dj5qqu1i60t8b"
path="res://.godot/imported/frame_0003.png-6c0016aab5739010b300d4aadf445275.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0003.png"
dest_files=["res://.godot/imported/frame_0003.png-6c0016aab5739010b300d4aadf445275.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bv6a6vt0q5luo"
path="res://.godot/imported/frame_0004.png-b620093ddbdd80ff6a65a6517f9c14b4.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0004.png"
dest_files=["res://.godot/imported/frame_0004.png-b620093ddbdd80ff6a65a6517f9c14b4.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://clrk60e8f6cto"
path="res://.godot/imported/frame_0005.png-b6c300fc202006f2fb177a3a1c513665.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0005.png"
dest_files=["res://.godot/imported/frame_0005.png-b6c300fc202006f2fb177a3a1c513665.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://hgah784brj1u"
path="res://.godot/imported/frame_0006.png-28c4b801c2546155230011f559169b9f.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0006.png"
dest_files=["res://.godot/imported/frame_0006.png-28c4b801c2546155230011f559169b9f.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dvct6l2bs4xfo"
path="res://.godot/imported/frame_0007.png-e422307b7496aacb187385bfb8795443.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0007.png"
dest_files=["res://.godot/imported/frame_0007.png-e422307b7496aacb187385bfb8795443.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://73p11ya60fhx"
path="res://.godot/imported/frame_0008.png-d5499d6e4b8d3a3eb3ad718c0335a962.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0008.png"
dest_files=["res://.godot/imported/frame_0008.png-d5499d6e4b8d3a3eb3ad718c0335a962.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b25stwboh3o6a"
path="res://.godot/imported/frame_0009.png-8e46c04cda201e73d3528324b56e66f3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0009.png"
dest_files=["res://.godot/imported/frame_0009.png-8e46c04cda201e73d3528324b56e66f3.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://elkyn3cmg0c2"
path="res://.godot/imported/frame_0010.png-de90a31a250647c0d5aee9a41a0b0d8c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0010.png"
dest_files=["res://.godot/imported/frame_0010.png-de90a31a250647c0d5aee9a41a0b0d8c.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://djgn51fdby287"
path="res://.godot/imported/frame_0011.png-bbc6c99728b46e3dd8887280c9381c78.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0011.png"
dest_files=["res://.godot/imported/frame_0011.png-bbc6c99728b46e3dd8887280c9381c78.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dlbpbe6s4l1tx"
path="res://.godot/imported/frame_0012.png-f5e74974717ec212928272d323393a98.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0012.png"
dest_files=["res://.godot/imported/frame_0012.png-f5e74974717ec212928272d323393a98.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://wrn8804ysm1r"
path="res://.godot/imported/frame_0013.png-675289ff80b3e47f5fd61784ae292a76.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0013.png"
dest_files=["res://.godot/imported/frame_0013.png-675289ff80b3e47f5fd61784ae292a76.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dfknsguku55ft"
path="res://.godot/imported/frame_0014.png-9424e4272c40efeb633b65529357249a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0014.png"
dest_files=["res://.godot/imported/frame_0014.png-9424e4272c40efeb633b65529357249a.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://o55311qur6ux"
path="res://.godot/imported/frame_0015.png-489fcfbbd3c4f4cda18e47e3dc8dcf15.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0015.png"
dest_files=["res://.godot/imported/frame_0015.png-489fcfbbd3c4f4cda18e47e3dc8dcf15.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://m5u07s02h2wm"
path="res://.godot/imported/frame_0016.png-7e03f5a0902e0df237c1d79afaef6581.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0016.png"
dest_files=["res://.godot/imported/frame_0016.png-7e03f5a0902e0df237c1d79afaef6581.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bybcqiuogapnj"
path="res://.godot/imported/frame_0017.png-2336272caeba6f1dc162cd5dfb7598a6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0017.png"
dest_files=["res://.godot/imported/frame_0017.png-2336272caeba6f1dc162cd5dfb7598a6.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dsipxnabk7nf2"
path="res://.godot/imported/frame_0018.png-c0ef7360e08db6fe8ef11fac3e141ea7.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0018.png"
dest_files=["res://.godot/imported/frame_0018.png-c0ef7360e08db6fe8ef11fac3e141ea7.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b178tkevj6xh6"
path="res://.godot/imported/frame_0019.png-c2ed177013a1787ee432d716372087d1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0019.png"
dest_files=["res://.godot/imported/frame_0019.png-c2ed177013a1787ee432d716372087d1.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://buuy33224yxhk"
path="res://.godot/imported/frame_0020.png-873c63b937324b14e6038a8f66bd563c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0020.png"
dest_files=["res://.godot/imported/frame_0020.png-873c63b937324b14e6038a8f66bd563c.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://2heg200vpyij"
path="res://.godot/imported/frame_0021.png-4b55ce999ff41efe5ba3479ebe6ea3d2.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0021.png"
dest_files=["res://.godot/imported/frame_0021.png-4b55ce999ff41efe5ba3479ebe6ea3d2.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cil7ci431vr5c"
path="res://.godot/imported/frame_0022.png-47bfede447f05f1f520b78e62d93dd2d.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0022.png"
dest_files=["res://.godot/imported/frame_0022.png-47bfede447f05f1f520b78e62d93dd2d.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cf11hpy3jxmpf"
path="res://.godot/imported/frame_0023.png-6d5ab9b27a44431b93f81160aebd8883.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0023.png"
dest_files=["res://.godot/imported/frame_0023.png-6d5ab9b27a44431b93f81160aebd8883.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cakxolxtw5evq"
path="res://.godot/imported/frame_0024.png-e59119e54e73aed9da9116e74406c80a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0024.png"
dest_files=["res://.godot/imported/frame_0024.png-e59119e54e73aed9da9116e74406c80a.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bshdhlsdu14nf"
path="res://.godot/imported/frame_0025.png-50c986c14484b1cb5e21d6081146073c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0025.png"
dest_files=["res://.godot/imported/frame_0025.png-50c986c14484b1cb5e21d6081146073c.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b12pqmrqkvvu4"
path="res://.godot/imported/frame_0026.png-a4ee4c6c8b4d95c3237f600469f31f83.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0026.png"
dest_files=["res://.godot/imported/frame_0026.png-a4ee4c6c8b4d95c3237f600469f31f83.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dkeuwc65l7610"
path="res://.godot/imported/frame_0027.png-be673ffe43ad0354e9248e401e495bda.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0027.png"
dest_files=["res://.godot/imported/frame_0027.png-be673ffe43ad0354e9248e401e495bda.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dh14dji4fio5i"
path="res://.godot/imported/frame_0028.png-4083bef9dafc3551bb7858101d5baa62.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0028.png"
dest_files=["res://.godot/imported/frame_0028.png-4083bef9dafc3551bb7858101d5baa62.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dsirxkxfyujpq"
path="res://.godot/imported/frame_0029.png-8e0c6cb312722c7b1b2ab9ad39faf599.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0029.png"
dest_files=["res://.godot/imported/frame_0029.png-8e0c6cb312722c7b1b2ab9ad39faf599.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cr221lb5mbjqx"
path="res://.godot/imported/frame_0030.png-73514f0085b41c6690929bb1c0bec043.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0030.png"
dest_files=["res://.godot/imported/frame_0030.png-73514f0085b41c6690929bb1c0bec043.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dp3b1u6wpn3uk"
path="res://.godot/imported/frame_0031.png-ba6b0d5f3ff0bfe98c184e2ad8b3e24b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/e/image/frame_0031.png"
dest_files=["res://.godot/imported/frame_0031.png-ba6b0d5f3ff0bfe98c184e2ad8b3e24b.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c1t56tj8biwme"
path="res://.godot/imported/frame_0000.png-e54f45bd69ff062f921522d50b742181.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/n/image/frame_0000.png"
dest_files=["res://.godot/imported/frame_0000.png-e54f45bd69ff062f921522d50b742181.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c0xeavih08jq"
path="res://.godot/imported/frame_0001.png-cdb94c68f8d05d27af93ea4fce5f2dfc.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/n/image/frame_0001.png"
dest_files=["res://.godot/imported/frame_0001.png-cdb94c68f8d05d27af93ea4fce5f2dfc.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

Binary file not shown.

View File

@@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://11dptrh34tq4"
path="res://.godot/imported/frame_0002.png-cdf9d370d56f5e711d628bd7cdc09d86.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://ego/animations/walk6/n/image/frame_0002.png"
dest_files=["res://.godot/imported/frame_0002.png-cdf9d370d56f5e711d628bd7cdc09d86.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

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More