From cd378a9e8211fa1fdcdaff8f989b714a6782007c Mon Sep 17 00:00:00 2001 From: hheik <4469778+hheik@users.noreply.github.com> Date: Thu, 11 Sep 2025 19:46:12 +0300 Subject: [PATCH] Added inventory UI --- godot/prefabs/player/player.gd | 9 ++- godot/prefabs/player/player.tscn | 9 ++- godot/prefabs/player/player_inventory.tres | 3 + godot/prefabs/tiles/blueberry.tscn | 15 ++-- godot/prefabs/tiles/cowberry.tscn | 15 ++-- godot/prefabs/ui/inventory_ui.gd | 14 ++++ godot/prefabs/ui/inventory_ui.gd.uid | 1 + godot/prefabs/ui/ui.gd | 16 ++++ godot/prefabs/ui/ui.gd.uid | 1 + godot/prefabs/ui/ui.tscn | 47 ++++++++++++ godot/scenes/overworld.tscn | 16 ++-- godot/sprites/blueberry_item.png | Bin 0 -> 319 bytes godot/sprites/blueberry_item.png.import | 34 +++++++++ godot/sprites/blueberry_plant.png | Bin 0 -> 426 bytes godot/sprites/blueberry_plant.png.import | 34 +++++++++ godot/sprites/cowberry_item.png | Bin 0 -> 317 bytes godot/sprites/cowberry_item.png.import | 34 +++++++++ godot/sprites/cowberry_plant.png | Bin 0 -> 424 bytes godot/sprites/cowberry_plant.png.import | 34 +++++++++ godot/sprites/generic_picked.png | Bin 0 -> 288 bytes godot/sprites/generic_picked.png.import | 34 +++++++++ rust/src/gathering.rs | 23 +----- rust/src/grid.rs | 41 ++++++++++- rust/src/inventory.rs | 82 +++++++++++++++++++++ rust/src/lib.rs | 9 +++ rust/src/turn.rs | 3 +- 26 files changed, 423 insertions(+), 51 deletions(-) create mode 100644 godot/prefabs/player/player_inventory.tres create mode 100644 godot/prefabs/ui/inventory_ui.gd create mode 100644 godot/prefabs/ui/inventory_ui.gd.uid create mode 100644 godot/prefabs/ui/ui.gd create mode 100644 godot/prefabs/ui/ui.gd.uid create mode 100644 godot/prefabs/ui/ui.tscn create mode 100644 godot/sprites/blueberry_item.png create mode 100644 godot/sprites/blueberry_item.png.import create mode 100644 godot/sprites/blueberry_plant.png create mode 100644 godot/sprites/blueberry_plant.png.import create mode 100644 godot/sprites/cowberry_item.png create mode 100644 godot/sprites/cowberry_item.png.import create mode 100644 godot/sprites/cowberry_plant.png create mode 100644 godot/sprites/cowberry_plant.png.import create mode 100644 godot/sprites/generic_picked.png create mode 100644 godot/sprites/generic_picked.png.import create mode 100644 rust/src/inventory.rs diff --git a/godot/prefabs/player/player.gd b/godot/prefabs/player/player.gd index eea81d0..4ea8ecf 100644 --- a/godot/prefabs/player/player.gd +++ b/godot/prefabs/player/player.gd @@ -2,12 +2,19 @@ class_name Player extends GridPosition @export var gatherer: Gatherer +@export var entity_inventory: EntityInventory static func is_player(node: Node) -> bool: return node is Player || node.get_parent() is Player +func get_inventory() -> Inventory: + return entity_inventory.inventory + func _ready() -> void: gatherer.gathered.connect(_on_gathered) func _on_gathered(item: String, count: int): - print("gathered: ", count, " x ", item) + insert_into_inventory(item, count) + +func insert_into_inventory(item: String, count: int): + entity_inventory.inventory.insert(item, count) diff --git a/godot/prefabs/player/player.tscn b/godot/prefabs/player/player.tscn index 7d1abd8..628fd3c 100644 --- a/godot/prefabs/player/player.tscn +++ b/godot/prefabs/player/player.tscn @@ -1,12 +1,14 @@ -[gd_scene load_steps=4 format=3 uid="uid://drs6h7ks4r2ta"] +[gd_scene load_steps=5 format=3 uid="uid://drs6h7ks4r2ta"] [ext_resource type="Texture2D" uid="uid://doscvutq8uqmd" path="res://sprites/sheet.png" id="1_72ieh"] [ext_resource type="Script" uid="uid://cvviym6gdlod8" path="res://prefabs/player/player.gd" id="1_wv1mm"] [ext_resource type="Script" uid="uid://sxo578w2yds2" path="res://prefabs/player/player_input.gd" id="2_rdx4y"] +[ext_resource type="Inventory" uid="uid://dm71wjetr4e52" path="res://prefabs/player/player_inventory.tres" id="4_binfn"] -[node name="Player" type="GridPosition" node_paths=PackedStringArray("gatherer")] +[node name="Player" type="GridPosition" node_paths=PackedStringArray("gatherer", "entity_inventory")] script = ExtResource("1_wv1mm") gatherer = NodePath("Gatherer") +entity_inventory = NodePath("EntityInventory") [node name="Sprite2D" type="Sprite2D" parent="."] texture = ExtResource("1_72ieh") @@ -29,3 +31,6 @@ grid = NodePath("..") mover = NodePath("../Mover") actor = NodePath("../TurnActor") metadata/_custom_type_script = "uid://okxdlbfuvb1b" + +[node name="EntityInventory" type="EntityInventory" parent="."] +inventory = ExtResource("4_binfn") diff --git a/godot/prefabs/player/player_inventory.tres b/godot/prefabs/player/player_inventory.tres new file mode 100644 index 0000000..6c00ebc --- /dev/null +++ b/godot/prefabs/player/player_inventory.tres @@ -0,0 +1,3 @@ +[gd_resource type="Inventory" format=3 uid="uid://dm71wjetr4e52"] + +[resource] diff --git a/godot/prefabs/tiles/blueberry.tscn b/godot/prefabs/tiles/blueberry.tscn index bf60705..36606d1 100644 --- a/godot/prefabs/tiles/blueberry.tscn +++ b/godot/prefabs/tiles/blueberry.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=3 uid="uid://8xuvjmyjkpeo"] +[gd_scene load_steps=4 format=3 uid="uid://8xuvjmyjkpeo"] -[ext_resource type="Texture2D" uid="uid://doscvutq8uqmd" path="res://sprites/sheet.png" id="1_gjkx7"] [ext_resource type="Script" uid="uid://jd6ce3f7e1bh" path="res://prefabs/tiles/gatherable_animation.gd" id="1_jqgth"] +[ext_resource type="Texture2D" uid="uid://noksw27wlt1y" path="res://sprites/blueberry_plant.png" id="2_c8jpc"] +[ext_resource type="Texture2D" uid="uid://1udkm2j25i8o" path="res://sprites/generic_picked.png" id="3_c8jpc"] [node name="Blueberry" type="GridPosition" node_paths=PackedStringArray("gatherable", "picked", "not_picked")] script = ExtResource("1_jqgth") @@ -10,17 +11,11 @@ picked = NodePath("Picked") not_picked = NodePath("Not Picked") [node name="Not Picked" type="Sprite2D" parent="."] -texture = ExtResource("1_gjkx7") -hframes = 8 -vframes = 8 -frame = 16 +texture = ExtResource("2_c8jpc") [node name="Picked" type="Sprite2D" parent="."] visible = false -texture = ExtResource("1_gjkx7") -hframes = 8 -vframes = 8 -frame = 17 +texture = ExtResource("3_c8jpc") [node name="Gatherable" type="Gatherable" parent="." node_paths=PackedStringArray("grid")] grid = NodePath("..") diff --git a/godot/prefabs/tiles/cowberry.tscn b/godot/prefabs/tiles/cowberry.tscn index b73fa94..f79bf9f 100644 --- a/godot/prefabs/tiles/cowberry.tscn +++ b/godot/prefabs/tiles/cowberry.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=3 format=3 uid="uid://l72f05nek0y4"] +[gd_scene load_steps=4 format=3 uid="uid://l72f05nek0y4"] -[ext_resource type="Texture2D" uid="uid://doscvutq8uqmd" path="res://sprites/sheet.png" id="1_e3ld6"] +[ext_resource type="Texture2D" uid="uid://c3td3bhrbd0kp" path="res://sprites/cowberry_plant.png" id="2_ihdej"] [ext_resource type="Script" uid="uid://jd6ce3f7e1bh" path="res://prefabs/tiles/gatherable_animation.gd" id="2_kod7n"] +[ext_resource type="Texture2D" uid="uid://1udkm2j25i8o" path="res://sprites/generic_picked.png" id="3_ihdej"] [node name="Blueberry" type="GridPosition" node_paths=PackedStringArray("gatherable", "picked", "not_picked")] script = ExtResource("2_kod7n") @@ -10,17 +11,11 @@ picked = NodePath("Picked") not_picked = NodePath("Not Picked") [node name="Not Picked" type="Sprite2D" parent="."] -texture = ExtResource("1_e3ld6") -hframes = 8 -vframes = 8 -frame = 20 +texture = ExtResource("2_ihdej") [node name="Picked" type="Sprite2D" parent="."] visible = false -texture = ExtResource("1_e3ld6") -hframes = 8 -vframes = 8 -frame = 17 +texture = ExtResource("3_ihdej") [node name="Gatherable" type="Gatherable" parent="." node_paths=PackedStringArray("grid")] grid = NodePath("..") diff --git a/godot/prefabs/ui/inventory_ui.gd b/godot/prefabs/ui/inventory_ui.gd new file mode 100644 index 0000000..db83793 --- /dev/null +++ b/godot/prefabs/ui/inventory_ui.gd @@ -0,0 +1,14 @@ +class_name InventoryUI +extends Node + +func update(inventory: Inventory): + for item in inventory.items: + var count = inventory.get_item_count(item) + update_item(item, count) + +func update_item(item: String, count: int): + var child = get_node(item) + if child == null: + return + var label = child.get_node("Count") as Label + label.text = str(count) diff --git a/godot/prefabs/ui/inventory_ui.gd.uid b/godot/prefabs/ui/inventory_ui.gd.uid new file mode 100644 index 0000000..c6ff749 --- /dev/null +++ b/godot/prefabs/ui/inventory_ui.gd.uid @@ -0,0 +1 @@ +uid://djccw7ahn8b47 diff --git a/godot/prefabs/ui/ui.gd b/godot/prefabs/ui/ui.gd new file mode 100644 index 0000000..6bf9c52 --- /dev/null +++ b/godot/prefabs/ui/ui.gd @@ -0,0 +1,16 @@ +class_name UI +extends Node + +@export var player: Player + +@onready var inventory_ui: InventoryUI = %Inventory + +func _ready(): + player.entity_inventory.inventory.changed.connect(_on_player_inventory_changed) + update_inventory_ui() + +func _on_player_inventory_changed(): + update_inventory_ui() + +func update_inventory_ui(): + inventory_ui.update(player.get_inventory()) diff --git a/godot/prefabs/ui/ui.gd.uid b/godot/prefabs/ui/ui.gd.uid new file mode 100644 index 0000000..1d1091a --- /dev/null +++ b/godot/prefabs/ui/ui.gd.uid @@ -0,0 +1 @@ +uid://ckalp7icn1f28 diff --git a/godot/prefabs/ui/ui.tscn b/godot/prefabs/ui/ui.tscn new file mode 100644 index 0000000..ffd7c5e --- /dev/null +++ b/godot/prefabs/ui/ui.tscn @@ -0,0 +1,47 @@ +[gd_scene load_steps=5 format=3 uid="uid://blutrglw7mycx"] + +[ext_resource type="Script" uid="uid://djccw7ahn8b47" path="res://prefabs/ui/inventory_ui.gd" id="1_4ieor"] +[ext_resource type="Script" uid="uid://ckalp7icn1f28" path="res://prefabs/ui/ui.gd" id="1_htiv7"] +[ext_resource type="Texture2D" uid="uid://4rxwcyoye2sa" path="res://sprites/blueberry_item.png" id="2_htiv7"] +[ext_resource type="Texture2D" uid="uid://d11rkcho3c38n" path="res://sprites/cowberry_item.png" id="3_gxjsb"] + +[node name="UI" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_htiv7") + +[node name="PanelContainer" type="PanelContainer" parent="."] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="Inventory" type="VBoxContainer" parent="PanelContainer"] +unique_name_in_owner = true +layout_mode = 2 +script = ExtResource("1_4ieor") + +[node name="Blueberry" type="HBoxContainer" parent="PanelContainer/Inventory"] +layout_mode = 2 + +[node name="Item" type="TextureRect" parent="PanelContainer/Inventory/Blueberry"] +layout_mode = 2 +texture = ExtResource("2_htiv7") + +[node name="Count" type="Label" parent="PanelContainer/Inventory/Blueberry"] +layout_mode = 2 +text = "0" + +[node name="Cowberry" type="HBoxContainer" parent="PanelContainer/Inventory"] +layout_mode = 2 + +[node name="Item" type="TextureRect" parent="PanelContainer/Inventory/Cowberry"] +layout_mode = 2 +texture = ExtResource("3_gxjsb") + +[node name="Count" type="Label" parent="PanelContainer/Inventory/Cowberry"] +layout_mode = 2 +text = "0" diff --git a/godot/scenes/overworld.tscn b/godot/scenes/overworld.tscn index 4591630..4486938 100644 --- a/godot/scenes/overworld.tscn +++ b/godot/scenes/overworld.tscn @@ -1,22 +1,28 @@ -[gd_scene load_steps=4 format=4 uid="uid://b3odri2wtvke4"] +[gd_scene load_steps=5 format=4 uid="uid://b3odri2wtvke4"] [ext_resource type="TileSet" uid="uid://b1ps1ww0rtkop" path="res://tilesets/background_tileset.tres" id="1_m1b5j"] [ext_resource type="TileSet" uid="uid://bxwohuw2p43k1" path="res://tilesets/foreground_tileset.tres" id="2_u2ss0"] [ext_resource type="PackedScene" uid="uid://drs6h7ks4r2ta" path="res://prefabs/player/player.tscn" id="3_u2ss0"] +[ext_resource type="PackedScene" uid="uid://blutrglw7mycx" path="res://prefabs/ui/ui.tscn" id="4_356oe"] [node name="TurnManager" type="TurnManager"] -[node name="Root" type="Level" parent="." node_paths=PackedStringArray("background", "foreground")] +[node name="World" type="Level" parent="." node_paths=PackedStringArray("background", "foreground")] background = NodePath("Background") foreground = NodePath("Foreground") -[node name="Background" type="TileMapLayer" parent="Root"] +[node name="Background" type="TileMapLayer" parent="World"] tile_map_data = PackedByteArray("AAD8//z/AQAAAAQAAAD8//3/AQAAAAQAAAD8//7/AQAAAAQAAAD8////AQAAAAQAAAD9//z/AQAAAAQAAAD9//3/AQAAAAQAAAD9//7/AQAAAAQAAAD9////AQAAAAQAAAD+//z/AQAAAAQAAAD+//3/AQAAAAQAAAD+//7/AQAAAAQAAAD+////AQAAAAQAAAD///z/AQAAAAQAAAD///3/AQAAAAQAAAD///7/AQAAAAQAAAD/////AQAAAAQAAAD8/wAAAQAAAAQAAAD8/wEAAQAAAAQAAAD8/wIAAQAAAAQAAAD8/wMAAQAAAAQAAAD9/wAAAQAAAAQAAAD9/wEAAQAAAAQAAAD9/wIAAQAAAAQAAAD9/wMAAQAAAAQAAAD+/wAAAQAAAAQAAAD+/wEAAQAAAAQAAAD+/wIAAQAAAAQAAAD+/wMAAQAAAAQAAAD//wAAAQAAAAQAAAD//wEAAQAAAAQAAAD//wIAAQAAAAQAAAD//wMAAQAAAAQAAAAAAPz/AQAAAAQAAAAAAP3/AQAAAAQAAAAAAP7/AQAAAAQAAAAAAP//AQAAAAQAAAAAAAAAAQAAAAQAAAAAAAEAAQAAAAQAAAAAAAIAAQAAAAQAAAAAAAMAAQAAAAQAAAABAPz/AQAAAAQAAAABAP3/AQAAAAQAAAABAP7/AQAAAAQAAAABAP//AQAAAAQAAAABAAAAAQAAAAQAAAABAAEAAQAAAAQAAAABAAIAAQAAAAQAAAABAAMAAQAAAAQAAAACAPz/AQAAAAQAAAACAP3/AQAAAAQAAAACAP7/AQAAAAQAAAACAP//AQAAAAQAAAACAAAAAQAAAAQAAAACAAEAAQAAAAQAAAACAAIAAQAAAAQAAAACAAMAAQAAAAQAAAADAPz/AQAAAAQAAAADAP3/AQAAAAQAAAADAP7/AQAAAAQAAAADAP//AQAAAAQAAAADAAAAAQAAAAQAAAADAAEAAQAAAAQAAAADAAIAAQAAAAQAAAADAAMAAQAAAAQAAAD6//v/AQAAAAQAAAD6//z/AQAAAAQAAAD6//3/AQAAAAQAAAD6//7/AQAAAAQAAAD6////AQAAAAQAAAD6/wAAAQAAAAQAAAD6/wEAAQAAAAQAAAD6/wIAAQAAAAQAAAD6/wMAAQAAAAQAAAD6/wQAAQAAAAQAAAD6/wUAAQAAAAQAAAD7//v/AQAAAAQAAAD7//z/AQAAAAQAAAD7//3/AQAAAAQAAAD7//7/AQAAAAQAAAD7////AQAAAAQAAAD7/wAAAQAAAAQAAAD7/wEAAQAAAAQAAAD7/wIAAQAAAAQAAAD7/wMAAQAAAAQAAAD7/wQAAQAAAAQAAAD7/wUAAQAAAAQAAAD8//v/AQAAAAQAAAD8/wQAAQAAAAQAAAD8/wUAAQAAAAQAAAD9//v/AQAAAAQAAAD9/wQAAQAAAAQAAAD9/wUAAQAAAAQAAAD+//v/AQAAAAQAAAD+/wQAAQAAAAQAAAD+/wUAAQAAAAQAAAD///v/AQAAAAQAAAD//wQAAQAAAAQAAAD//wUAAQAAAAQAAAAAAPv/AQAAAAQAAAAAAAQAAQAAAAQAAAAAAAUAAQAAAAQAAAABAPv/AQAAAAQAAAABAAQAAQAAAAQAAAABAAUAAQAAAAQAAAACAPv/AQAAAAQAAAACAAQAAQAAAAQAAAACAAUAAQAAAAQAAAADAPr/AQABAAQAAAADAPv/AQAAAAQAAAADAAQAAQAAAAQAAAADAAUAAQAAAAQAAAAEAPr/AQABAAQAAAAEAPv/AQABAAQAAAAEAPz/AQABAAQAAAAEAP3/AQABAAQAAAAEAP7/AQAAAAQAAAAEAP//AQAAAAQAAAAEAAAAAQAAAAQAAAAEAAEAAQAAAAQAAAAEAAIAAQAAAAQAAAAEAAMAAQAAAAQAAAAEAAQAAQAAAAQAAAAEAAUAAQAAAAQAAAAFAPr/AQABAAQAAAAFAPv/AQABAAQAAAAFAPz/AQABAAQAAAAFAP3/AQABAAQAAAAFAP7/AQAAAAQAAAAFAP//AQAAAAQAAAAFAAAAAQAAAAQAAAAFAAEAAQAAAAQAAAAFAAIAAQAAAAQAAAAFAAMAAQAAAAQAAAAFAAQAAQAAAAQAAAAFAAUAAQAAAAQAAAAGAPj/AQABAAQAAAAGAPn/AQABAAQAAAAGAPr/AQABAAQAAAAGAPv/AQABAAQAAAAGAPz/AQABAAQAAAAHAPj/AQABAAQAAAAHAPn/AQABAAQAAAAHAPr/AQABAAQAAAAHAPv/AQABAAQAAAAHAPz/AQABAAQAAAAIAPj/AQABAAQAAAAIAPn/AQABAAQAAAAIAPr/AQABAAQAAAAIAPv/AQABAAQAAAAIAPz/AQABAAQAAAAJAPj/AQABAAQAAAAJAPn/AQABAAQAAAAJAPr/AQABAAQAAAAJAPv/AQABAAQAAAAJAPz/AQABAAQAAAAKAPj/AQABAAQAAAAKAPn/AQABAAQAAAAKAPr/AQABAAQAAAAKAPv/AQABAAQAAAAKAPz/AQABAAQAAAAEAPn/AQABAAQAAAAGAP3/AQABAAQAAAAHAP3/AQABAAQAAAAIAP3/AQABAAQAAAAIAP7/AQABAAQAAAAHAP7/AQABAAQAAAAEAPj/AQABAAQAAAAEAPf/AQABAAQAAAAFAPf/AQABAAQAAAAFAPj/AQABAAQAAAAFAPn/AQABAAQAAAAHAPf/AQABAAQAAAAGAPf/AQABAAQAAAAIAPf/AQABAAQAAAAJAPf/AQABAAQAAAAKAPf/AQABAAQAAAALAPn/AQABAAQAAAALAPr/AQABAAQAAAALAPv/AQABAAQAAAAKAP3/AQABAAQAAAAJAP3/AQABAAQAAAD3//v/AQAAAAQAAAD3//z/AQAAAAQAAAD3//3/AQAAAAQAAAD3//7/AQAAAAQAAAD3////AQAAAAQAAAD3/wAAAQAAAAQAAAD3/wEAAQAAAAQAAAD3/wIAAQAAAAQAAAD3/wMAAQAAAAQAAAD3/wQAAQAAAAQAAAD3/wUAAQAAAAQAAAD4//v/AQAAAAQAAAD4//z/AQAAAAQAAAD4//3/AQAAAAQAAAD4//7/AQAAAAQAAAD4////AQAAAAQAAAD4/wAAAQAAAAQAAAD4/wEAAQAAAAQAAAD4/wIAAQAAAAQAAAD4/wMAAQAAAAQAAAD4/wQAAQAAAAQAAAD4/wUAAQAAAAQAAAD5//v/AQAAAAQAAAD5//z/AQAAAAQAAAD5//3/AQAAAAQAAAD5//7/AQAAAAQAAAD5////AQAAAAQAAAD5/wAAAQAAAAQAAAD5/wEAAQAAAAQAAAD5/wIAAQAAAAQAAAD5/wMAAQAAAAQAAAD5/wQAAQAAAAQAAAD5/wUAAQAAAAQAAAAGAP//AQAAAAQAAAAGAAAAAQAAAAQAAAAGAAEAAQAAAAQAAAAGAAIAAQAAAAQAAAAGAAMAAQAAAAQAAAAGAAQAAQAAAAQAAAAGAAUAAQAAAAQAAAAHAP//AQAAAAQAAAAHAAAAAQAAAAQAAAAHAAEAAQAAAAQAAAAHAAIAAQAAAAQAAAAHAAMAAQAAAAQAAAAHAAQAAQAAAAQAAAAHAAUAAQAAAAQAAAAIAP//AQAAAAQAAAAIAAAAAQAAAAQAAAAIAAEAAQAAAAQAAAAIAAIAAQAAAAQAAAAIAAMAAQAAAAQAAAAIAAQAAQAAAAQAAAAIAAUAAQAAAAQAAAAJAP//AQAAAAQAAAAJAAAAAQAAAAQAAAAJAAEAAQAAAAQAAAAJAAIAAQAAAAQAAAAJAAMAAQAAAAQAAAAJAAQAAQAAAAQAAAAJAAUAAQAAAAQAAAAJAP7/AQABAAQAAAAGAP7/AQABAAQAAAA=") tile_set = ExtResource("1_m1b5j") -[node name="Foreground" type="TileMapLayer" parent="Root"] +[node name="Foreground" type="TileMapLayer" parent="World"] tile_map_data = PackedByteArray("AAD/////AQAAAAMAAAD8//3/AQABAAMAAAD9//3/AQABAAMAAAD9//7/AQABAAMAAAD9/wAAAQABAAMAAAD9/wEAAQABAAMAAAD8/wEAAQABAAMAAAAEAPv/AQACAAMAAAAGAP3/AQACAAMAAAAHAP7/AQACAAMAAAAIAP7/AQACAAMAAAAJAP7/AQACAAMAAAAGAPn/AQACAAMAAAAGAPr/AQACAAMAAAAGAPv/AQACAAMAAAAHAPv/AQACAAMAAAAIAPv/AQACAAMAAAAIAPz/AQACAAMAAAAJAPz/AQACAAMAAAAKAPz/AQACAAMAAAAKAPv/AQACAAMAAAAJAPv/AQACAAMAAAAIAPr/AQACAAMAAAAHAPr/AQACAAMAAAAHAPn/AQACAAMAAAD3//v/AQABAAMAAAD3//z/AQABAAMAAAD3//3/AQABAAMAAAD3//7/AQABAAMAAAD3////AQABAAMAAAD3/wAAAQABAAMAAAD3/wEAAQABAAMAAAD3/wIAAQABAAMAAAD4//v/AQABAAMAAAD4//z/AQABAAMAAAD4//3/AQABAAMAAAD4//7/AQABAAMAAAD4////AQABAAMAAAD4/wAAAQABAAMAAAD4/wEAAQABAAMAAAD4/wIAAQABAAMAAAD3/wMAAQABAAMAAAD3/wQAAQABAAMAAAD3/wUAAQABAAMAAAD4/wMAAQABAAMAAAD4/wQAAQABAAMAAAD4/wUAAQABAAMAAAD5/wUAAQABAAMAAAD6/wUAAQABAAMAAAD7/wUAAQABAAMAAAD8/wUAAQABAAMAAAD9/wUAAQABAAMAAAD+/wUAAQABAAMAAAD//wUAAQABAAMAAAAAAAUAAQABAAMAAAABAAUAAQABAAMAAAACAAUAAQABAAMAAAADAAUAAQABAAMAAAAEAAUAAQABAAMAAAAFAAUAAQABAAMAAAAGAAUAAQABAAMAAAAHAAUAAQABAAMAAAAIAAUAAQABAAMAAAAJAAUAAQABAAMAAAD5//v/AQABAAMAAAD6//v/AQABAAMAAAD7//v/AQABAAMAAAD8//v/AQABAAMAAAD9//v/AQABAAMAAAD+//v/AQABAAMAAAD///v/AQABAAMAAAAAAPv/AQABAAMAAAABAPv/AQABAAMAAAACAPv/AQABAAMAAAADAPv/AQABAAMAAAAJAP//AQABAAMAAAAJAAAAAQABAAMAAAAJAAEAAQABAAMAAAAJAAIAAQABAAMAAAAJAAMAAQABAAMAAAAJAAQAAQABAAMAAAD7/wEAAQABAAMAAAD7//3/AQABAAMAAAD6//3/AQABAAMAAAD6/wEAAQABAAMAAAD6//7/AQABAAMAAAD6/wAAAQABAAMAAAD6/wQAAAAAAAAAAgD5/wQAAAAAAAAAAgD5/wMAAAAAAAAAAgAEAAEAAAAAAAAAAQADAAEAAAAAAAAAAQADAAIAAAAAAAAAAQADAAMAAAAAAAAAAQACAAMAAAAAAAAAAQA=") tile_set = ExtResource("2_u2ss0") -[node name="Player" parent="Root" instance=ExtResource("3_u2ss0")] +[node name="Player" parent="World" instance=ExtResource("3_u2ss0")] position = Vector2(16, 16) + +[node name="CanvasLayer" type="CanvasLayer" parent="."] + +[node name="UI" parent="CanvasLayer" node_paths=PackedStringArray("player") instance=ExtResource("4_356oe")] +player = NodePath("../../World/Player") diff --git a/godot/sprites/blueberry_item.png b/godot/sprites/blueberry_item.png new file mode 100644 index 0000000000000000000000000000000000000000..668dfb4d174fd220c449c8bafad7bb3ed4772e98 GIT binary patch literal 319 zcmV-F0l@x=P)Px#`AI}UR9J=WmOB=MAP_~LIoSpUWlHL7#GPaf*@vsJPi<*w;X+I!IRu8!IG85f zio?hEgkcz<(fD_|!g-rut=PbJyFY@?`Sq+~BKHAOyrzlNVp3db0{~c;DQ3byuB5@( zU{c&dm~X#=GV_C6|z`3CGC`)vU5#oczw#Fb-!5|&c)2tK5Cs?Px$WJyFpR9J=WmNAmTFbqZIoxMhi6e&_BZ7#wMa)g|LBhYgSdfKI=*n)zCc$;WP zktJCsVQBJaU>sxnKg+TLz^+{%R&b7sE9R~Si0v>Xo%ic;6NuabqWP8()@0GVsyhGx zcs_0#1V1hlQ2Ws|M+p$gyj+yNEV@E1%&WSCs_tO!laja`0C&vW007*awk?Qn_N z#%o0*5c{!#er#4RYDG!|h}5_r8%&<8v~kbJ%@r**2Rsn>>k-;vf_9k9vDQsk++QjD zKc`>NDk1h`(p}DnWGn+qAb5ug!Ntu{m-AuqOxI)U1d+&sC@oG_LeDTk%7Gy5SW`*H zQ_XOZ*8xsg4B-_622NlU1OE zod@xtsiL-}QF=0rXb3 UkzHl7Qvd(}07*qoM6N<$g7;m$zW@LL literal 0 HcmV?d00001 diff --git a/godot/sprites/blueberry_plant.png.import b/godot/sprites/blueberry_plant.png.import new file mode 100644 index 0000000..290e187 --- /dev/null +++ b/godot/sprites/blueberry_plant.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://noksw27wlt1y" +path="res://.godot/imported/blueberry_plant.png-4986df59aeb9b01dddc5281f264ea4c6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/blueberry_plant.png" +dest_files=["res://.godot/imported/blueberry_plant.png-4986df59aeb9b01dddc5281f264ea4c6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 diff --git a/godot/sprites/cowberry_item.png b/godot/sprites/cowberry_item.png new file mode 100644 index 0000000000000000000000000000000000000000..0725f0682428190f2996f9f12725fafdcf62a40d GIT binary patch literal 317 zcmV-D0mA-?P)Px#_en%SR9J=WmOT!`APj|Hs@?&ij-5GH)*hy3%A6&0#wyAw(j`d{W1!LaF(=y#-{Fp>U5RB@R@$ z1(JxT5a)rE2`Q)K0SVHlG%F4y&-9VEylRbbw3w(?C6!b&r`3s##((h!zIPx$Vo5|nR9J=WmNBk_FbsyBr``b}M#RX%ohmjC)2;XE%+j&ySXDhm-h!*(*p5SZ zdJDf)6he~!i!n|C4juYuIpa8AFt-@MPfZ(jUS7{#AW{pk=6gbDlUeh=ssRAt{&`Cf z^mVC#(nHl8#Xv;!Qc?QR=rXl3@2eX6s)nVHOX7S0+%atf08sO=twEf~y+|q5V0ufqf(rbR-l-jJMxPp zCSgh(1TE+D_2DJs%>ZEn!E$<*9AH~2AzQpC2mv(%d>1o};}p)_Px#+DSw~R9J=Wmdg>uAP7KlC#|G`G?kic$_6aPJ?RhxL7mNId8d3-UI3i{IF92u z|4tzHW$^Cj0_D2Tc9UX$MWinN2#y(u6zG|jRRtIk005}tQ_PR+SqZTOR-D> literal 0 HcmV?d00001 diff --git a/godot/sprites/generic_picked.png.import b/godot/sprites/generic_picked.png.import new file mode 100644 index 0000000..20d0664 --- /dev/null +++ b/godot/sprites/generic_picked.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://1udkm2j25i8o" +path="res://.godot/imported/generic_picked.png-ef06719c1fc035896cd7963ba5e40a37.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://sprites/generic_picked.png" +dest_files=["res://.godot/imported/generic_picked.png-ef06719c1fc035896cd7963ba5e40a37.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +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/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 diff --git a/rust/src/gathering.rs b/rust/src/gathering.rs index 30cefac..aed23d5 100644 --- a/rust/src/gathering.rs +++ b/rust/src/gathering.rs @@ -1,18 +1,6 @@ -use godot::{classes::*, obj::WithUserSignals, prelude::*}; +use godot::{classes::*, prelude::*}; -use crate::{ - grid::*, - turn::*, - utils::{find_by_type_in_children, find_in_parents}, -}; - -#[derive(GodotConvert, Var, Export, Clone, Copy, Default, Debug, PartialEq, Eq)] -#[godot(via = GString)] -pub enum ItemKind { - #[default] - Blueberry, - Cowberry, -} +use crate::prelude::*; #[derive(Debug, GodotClass)] #[class(init, base=Node)] @@ -50,7 +38,7 @@ pub struct Gatherable { count: i32, #[export] #[init(val = true)] - pick_automatically: bool, + remove_automatically: bool, #[var(get = get_is_picked, set = set_is_picked)] _is_picked: bool, @@ -58,9 +46,6 @@ pub struct Gatherable { base: Base, } -#[godot_api] -impl INode for Gatherable {} - #[godot_api] impl Gatherable { #[func] @@ -110,7 +95,7 @@ impl Gatherable { gatherer.bind_mut().gather(self.item, self.count); let item = self.item.to_godot().clone(); let count = self.count; - if self.pick_automatically { + if self.remove_automatically { self.set_is_picked(true); } self.signals().gathered().emit(&item, count); diff --git a/rust/src/grid.rs b/rust/src/grid.rs index 2cb00b6..2f72f96 100644 --- a/rust/src/grid.rs +++ b/rust/src/grid.rs @@ -1,6 +1,6 @@ -use godot::{classes::*, obj::WithUserSignals, prelude::*}; +use godot::{classes::*, prelude::*}; -use crate::utils::find_in_parents; +use crate::prelude::*; #[derive(Debug, GodotClass)] #[class(init, base=Node)] @@ -231,3 +231,40 @@ impl Mover { #[signal] fn finished_moving(coords: Vector2i); } + +// #[derive(Debug, GodotClass)] +// #[class(init, base=Node)] +// pub struct EnterTrigger { +// #[export] +// grid: Option>, + +// base: Base, +// } + +// #[godot_api] +// impl EnterTrigger { +// #[func] +// fn on_turn_end(&mut self, actor: Option>, _action: GString) { +// let actor = match actor { +// Some(actor) => actor, +// None => return, +// }; +// let actor_grid = match find_in_parents::(actor.clone()) { +// Some(grid) => grid, +// None => return, +// }; +// let my_coords = self +// .grid +// .as_ref() +// .expect("Getting Grid from EnterTrigger") +// .bind() +// .get_coords(); +// let coords = actor_grid.bind().get_coords(); +// if my_coords == coords { +// self.signals().is_inside().emit(&actor_grid, &actor) +// } +// } + +// #[signal] +// fn is_inside(grid: Gd, actor: Gd); +// } diff --git a/rust/src/inventory.rs b/rust/src/inventory.rs new file mode 100644 index 0000000..4489fdb --- /dev/null +++ b/rust/src/inventory.rs @@ -0,0 +1,82 @@ +use std::collections::HashMap; + +use godot::{classes::*, prelude::*}; + +type InventoryMap = HashMap; + +#[derive(GodotConvert, Var, Export, Clone, Copy, Default, Debug, PartialEq, Eq, Hash)] +#[godot(via = GString)] +pub enum ItemKind { + #[default] + Blueberry, + Cowberry, +} + +#[derive(GodotClass)] +#[class(init, base=Resource)] +pub struct Inventory { + #[export] + items: Dictionary, + + base: Base, +} + +#[godot_api] +impl Inventory { + pub fn cleanup(&mut self) { + self.items_from_map(self.items_as_map()); + } + + #[func] + pub fn get_item_count(&self, item: ItemKind) -> i32 { + self.items + .get_or_nil(item.to_godot()) + .try_to::() + .unwrap_or_default() + } + + #[func] + pub fn insert(&mut self, item: ItemKind, count: i32) { + let mut items = self.items_as_map(); + items + .entry(item) + .and_modify(|amount| *amount += count) + .or_insert(count); + self.items_from_map(items); + self.base_mut().emit_changed(); + } + + fn items_as_map(&self) -> InventoryMap { + let mut result = InventoryMap::new(); + for (key, value) in self.items.iter_shared() { + let item = match key + .try_to::() + .and_then(ItemKind::try_from_godot) + .ok() + { + Some(item) => item, + None => continue, + }; + let count = value.try_to::().unwrap_or_default(); + result.insert(item, count); + } + result + } + + fn items_from_map(&mut self, items: InventoryMap) { + let mut item_dict = Dictionary::new(); + for (item, count) in items.iter() { + item_dict.set(item.to_godot(), *count); + } + self.items = item_dict; + } +} + +#[derive(GodotClass)] +#[class(init, base=Node)] +pub struct EntityInventory { + #[export] + inventory: Option>, + + base: Base, +} diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 983f022..01caf22 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -4,8 +4,17 @@ pub struct VelhoExtension; mod gathering; mod grid; +mod inventory; mod turn; mod utils; +pub mod prelude { + pub use super::gathering::*; + pub use super::grid::*; + pub use super::inventory::*; + pub use super::turn::*; + pub use super::utils::*; +} + #[gdextension] unsafe impl ExtensionLibrary for VelhoExtension {} diff --git a/rust/src/turn.rs b/rust/src/turn.rs index d39f8d0..714de62 100644 --- a/rust/src/turn.rs +++ b/rust/src/turn.rs @@ -5,7 +5,7 @@ use godot::{ prelude::*, }; -use crate::utils::find_in_parents; +use crate::prelude::*; #[derive(Debug, GodotClass)] #[class(init, base=Node)] @@ -66,7 +66,6 @@ impl TurnManager { self.current_actor = self.round_queue.pop(); if let Some(mut actor) = self.current_actor.clone() { if actor.is_instance_valid() && !actor.is_queued_for_deletion() { - godot_print!("Next up: \"{}\" {:?}", actor.get_path(), actor); actor .signals() .turn_ended()