| @ -0,0 +1,10 @@ | |||||
| [gd_resource type="Resource" script_class="InventoryResource" load_steps=3 format=3 uid="uid://cnpw7y1csu774"] | |||||
| [ext_resource type="Script" uid="uid://becun6dj78v8d" path="res://resources/inventory_resource.gd" id="1_o2th4"] | |||||
| [ext_resource type="Script" uid="uid://bdx4q355l5ugl" path="res://resources/item_resource.gd" id="1_udg6i"] | |||||
| [resource] | |||||
| script = ExtResource("1_o2th4") | |||||
| inventory = Array[ExtResource("1_udg6i")]([]) | |||||
| max_stack_size = 999 | |||||
| metadata/_custom_type_script = "uid://becun6dj78v8d" | |||||
| @ -0,0 +1,14 @@ | |||||
| [gd_resource type="Resource" script_class="InventoryResource" load_steps=7 format=3 uid="uid://blfp6tiir282o"] | |||||
| [ext_resource type="Script" uid="uid://becun6dj78v8d" path="res://resources/inventory_resource.gd" id="1_4v6mg"] | |||||
| [ext_resource type="Script" uid="uid://bdx4q355l5ugl" path="res://resources/item_resource.gd" id="1_gg8jx"] | |||||
| [ext_resource type="Resource" uid="uid://bu0yoee1rs1se" path="res://resources/blocks/001_dirt.tres" id="2_rssib"] | |||||
| [ext_resource type="Resource" uid="uid://cpddnknmxpohc" path="res://resources/blocks/002_stone.tres" id="3_rlc1a"] | |||||
| [ext_resource type="Resource" uid="uid://bvudydis6w27b" path="res://resources/blocks/003_wood.tres" id="4_rlc1a"] | |||||
| [ext_resource type="Resource" uid="uid://4knt6o2ohku3" path="res://resources/blocks/004_leaves.tres" id="5_p27bu"] | |||||
| [resource] | |||||
| script = ExtResource("1_4v6mg") | |||||
| inventory = Array[ExtResource("1_gg8jx")]([ExtResource("2_rssib"), ExtResource("3_rlc1a"), ExtResource("4_rlc1a"), ExtResource("5_p27bu")]) | |||||
| max_stack_size = 999 | |||||
| metadata/_custom_type_script = "uid://becun6dj78v8d" | |||||
| @ -0,0 +1,6 @@ | |||||
| class_name InventoryResource | |||||
| extends Resource | |||||
| @export var inventory: Array[ItemResource] = [] | |||||
| @export var max_stack_size: int = 999 | |||||
| @ -0,0 +1 @@ | |||||
| uid://becun6dj78v8d | |||||
| @ -0,0 +1,68 @@ | |||||
| class_name Inventory | |||||
| extends Control | |||||
| @export var inventory_resource: InventoryResource | |||||
| @export var item_rect_scene: PackedScene | |||||
| @export var grid_container: GridContainer | |||||
| func _input(event: InputEvent) -> void: | |||||
| if event.is_action_pressed("open_inventory"): | |||||
| toggle_inventory() | |||||
| func _ready() -> void: | |||||
| for item_resource: ItemResource in inventory_resource.inventory: | |||||
| print(item_resource.name + " - " + str(item_resource.amount)) | |||||
| add_item(item_resource) | |||||
| func add_item(item_resource: ItemResource) -> void: | |||||
| var item_rect: InventoryItemRect = find_item_rect(item_resource) | |||||
| if item_rect != null: | |||||
| if item_rect.item_resource.amount + item_resource.amount >= inventory_resource.max_stack_size: | |||||
| item_rect.on_stack_full(true) | |||||
| return | |||||
| item_rect.item_resource.amount += item_resource.amount | |||||
| item_rect.update_rect() | |||||
| else: | |||||
| item_rect = item_rect_scene.instantiate() | |||||
| grid_container.add_child(item_rect) | |||||
| item_rect.item_resource = item_resource | |||||
| item_rect.update_rect() | |||||
| func find_item_rect(item_resource: ItemResource) -> InventoryItemRect: | |||||
| var rect: InventoryItemRect = null | |||||
| for container: InventoryItemRect in grid_container.get_children(): | |||||
| if container.item_resource.id == item_resource.id: | |||||
| rect = container | |||||
| break | |||||
| return rect | |||||
| func subtract_item(item_resource: ItemResource) -> void: | |||||
| var item_rect: InventoryItemRect = find_item_rect(item_resource) | |||||
| if item_rect != null: | |||||
| if item_rect.item_resource.amount >= inventory_resource.max_stack_size: | |||||
| item_rect.on_stack_full(false) | |||||
| item_rect.item_resource.amount -= item_resource.amount | |||||
| item_rect.update_rect() | |||||
| if item_rect.item_resource.amount < 1: # Empty stack | |||||
| item_rect.queue_free() | |||||
| else: | |||||
| push_error("Attempting to subtract amount (" + str(item_resource.amount) + " from nonexistent inventory item (" + str(item_resource.name) + ")") | |||||
| func toggle_inventory() -> void: | |||||
| visible = not visible | |||||
| if visible: | |||||
| Input.mouse_mode = Input.MOUSE_MODE_VISIBLE | |||||
| InventoryManager.inventory_opened.emit() | |||||
| get_tree().paused = true | |||||
| else: | |||||
| Input.mouse_mode = Input.MOUSE_MODE_CAPTURED | |||||
| InventoryManager.inventory_closed.emit() | |||||
| get_tree().paused = false | |||||
| @ -0,0 +1 @@ | |||||
| uid://dybecq130mxhn | |||||
| @ -0,0 +1,47 @@ | |||||
| [gd_scene load_steps=4 format=3 uid="uid://dcr25y1lw4wjp"] | |||||
| [ext_resource type="Script" uid="uid://dybecq130mxhn" path="res://scenes/ui/inventory/inventory.gd" id="1_s6ek7"] | |||||
| [ext_resource type="Resource" uid="uid://cnpw7y1csu774" path="res://resources/inventory/player_inventory_empty.tres" id="2_avmd0"] | |||||
| [ext_resource type="PackedScene" uid="uid://boueuk2hnfvg" path="res://scenes/ui/inventory/item_rect.tscn" id="3_xeaml"] | |||||
| [node name="Inventory" type="Control" node_paths=PackedStringArray("grid_container")] | |||||
| process_mode = 3 | |||||
| layout_mode = 3 | |||||
| anchors_preset = 15 | |||||
| anchor_right = 1.0 | |||||
| anchor_bottom = 1.0 | |||||
| grow_horizontal = 2 | |||||
| grow_vertical = 2 | |||||
| script = ExtResource("1_s6ek7") | |||||
| inventory_resource = ExtResource("2_avmd0") | |||||
| item_rect_scene = ExtResource("3_xeaml") | |||||
| grid_container = NodePath("Background/MarginContainer/VBoxContainer/GridContainer") | |||||
| [node name="Background" type="Panel" parent="."] | |||||
| layout_mode = 1 | |||||
| anchors_preset = 15 | |||||
| anchor_right = 1.0 | |||||
| anchor_bottom = 1.0 | |||||
| grow_horizontal = 2 | |||||
| grow_vertical = 2 | |||||
| [node name="MarginContainer" type="MarginContainer" parent="Background"] | |||||
| layout_mode = 1 | |||||
| anchors_preset = 15 | |||||
| anchor_right = 1.0 | |||||
| anchor_bottom = 1.0 | |||||
| grow_horizontal = 2 | |||||
| grow_vertical = 2 | |||||
| theme_override_constants/margin_left = 20 | |||||
| theme_override_constants/margin_top = 20 | |||||
| theme_override_constants/margin_right = 20 | |||||
| theme_override_constants/margin_bottom = 20 | |||||
| [node name="VBoxContainer" type="VBoxContainer" parent="Background/MarginContainer"] | |||||
| layout_mode = 2 | |||||
| [node name="GridContainer" type="GridContainer" parent="Background/MarginContainer/VBoxContainer"] | |||||
| layout_mode = 2 | |||||
| theme_override_constants/h_separation = 256 | |||||
| theme_override_constants/v_separation = 256 | |||||
| columns = 4 | |||||
| @ -0,0 +1,21 @@ | |||||
| class_name InventoryItemRect | |||||
| extends Panel | |||||
| @export var item_resource: ItemResource | |||||
| @onready var amount_label: Label = $AmountLabel | |||||
| @onready var item_texture: TextureRect = $ItemTexture | |||||
| func update_rect() -> void: | |||||
| item_texture.texture = load(item_resource.item_texture) | |||||
| amount_label.text = "x" + str(item_resource.amount) | |||||
| tooltip_text = item_resource.name | |||||
| func on_stack_full(is_full: bool) -> void: | |||||
| if is_full: | |||||
| amount_label.add_theme_color_override("font_color", Color(1, 0, 0)) | |||||
| else: | |||||
| amount_label.add_theme_color_override("font_color", Color(1, 1, 1)) | |||||
| @ -0,0 +1 @@ | |||||
| uid://cknl6i0jce5jr | |||||
| @ -0,0 +1,38 @@ | |||||
| [gd_scene load_steps=3 format=3 uid="uid://boueuk2hnfvg"] | |||||
| [ext_resource type="Texture2D" uid="uid://dknv7amroftm8" path="res://icon.svg" id="1_o0kom"] | |||||
| [ext_resource type="Script" uid="uid://cknl6i0jce5jr" path="res://scenes/ui/inventory/item_rect.gd" id="1_oderi"] | |||||
| [node name="ItemRect" type="Panel"] | |||||
| anchors_preset = -1 | |||||
| anchor_right = 0.111111 | |||||
| anchor_bottom = 0.197531 | |||||
| grow_horizontal = 2 | |||||
| grow_vertical = 2 | |||||
| script = ExtResource("1_oderi") | |||||
| metadata/_edit_use_anchors_ = true | |||||
| [node name="ItemTexture" type="TextureRect" parent="."] | |||||
| custom_minimum_size = Vector2(64, 64) | |||||
| layout_mode = 1 | |||||
| anchors_preset = 15 | |||||
| anchor_right = 1.0 | |||||
| anchor_bottom = 1.0 | |||||
| grow_horizontal = 2 | |||||
| grow_vertical = 2 | |||||
| texture = ExtResource("1_o0kom") | |||||
| stretch_mode = 4 | |||||
| [node name="AmountLabel" type="Label" parent="."] | |||||
| layout_mode = 1 | |||||
| anchors_preset = 3 | |||||
| anchor_left = 1.0 | |||||
| anchor_top = 1.0 | |||||
| anchor_right = 1.0 | |||||
| anchor_bottom = 1.0 | |||||
| offset_left = -40.0 | |||||
| offset_top = -23.0 | |||||
| offset_right = -3.0 | |||||
| grow_horizontal = 0 | |||||
| grow_vertical = 0 | |||||
| text = "x100" | |||||