@ -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,61 @@ | |||
[gd_resource type="Resource" script_class="InventoryResource" load_steps=13 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="Material" uid="uid://uex0dq00xomt" path="res://assets/materials/dirt.tres" id="2_8w148"] | |||
[ext_resource type="Script" uid="uid://dwrmy4mx0mw18" path="res://resources/block_resource.gd" id="3_vgvac"] | |||
[ext_resource type="Material" uid="uid://cx7m27qa4ds4s" path="res://assets/materials/stone.tres" id="4_7yuhn"] | |||
[ext_resource type="Material" uid="uid://bnqiumcb3ixan" path="res://assets/materials/wood_ends.tres" id="5_viap3"] | |||
[ext_resource type="Material" uid="uid://h0naiw6swfkl" path="res://assets/materials/wood_side.tres" id="6_wqat2"] | |||
[ext_resource type="Material" uid="uid://d15n1p3spu3jg" path="res://assets/materials/leaves.tres" id="7_xd1nd"] | |||
[sub_resource type="Resource" id="Resource_jaam2"] | |||
script = ExtResource("3_vgvac") | |||
material_east = ExtResource("2_8w148") | |||
id = "001" | |||
name = "Dirt" | |||
amount = 100 | |||
description = "Block of dirt" | |||
item_texture = "uid://li36txj7oweq" | |||
metadata/_custom_type_script = "uid://dwrmy4mx0mw18" | |||
[sub_resource type="Resource" id="Resource_4kby3"] | |||
script = ExtResource("3_vgvac") | |||
material_east = ExtResource("4_7yuhn") | |||
id = "002" | |||
name = "Stone" | |||
amount = 100 | |||
description = "Block of stone" | |||
item_texture = "uid://ct1iawpfkdf5l" | |||
metadata/_custom_type_script = "uid://dwrmy4mx0mw18" | |||
[sub_resource type="Resource" id="Resource_byct5"] | |||
script = ExtResource("3_vgvac") | |||
material_east = ExtResource("6_wqat2") | |||
material_west = ExtResource("6_wqat2") | |||
material_north = ExtResource("6_wqat2") | |||
material_south = ExtResource("6_wqat2") | |||
material_top = ExtResource("5_viap3") | |||
material_bottom = ExtResource("5_viap3") | |||
id = "003" | |||
name = "Wood" | |||
amount = 100 | |||
description = "Wood log" | |||
item_texture = "uid://0mw651622h01" | |||
metadata/_custom_type_script = "uid://dwrmy4mx0mw18" | |||
[sub_resource type="Resource" id="Resource_qycqj"] | |||
script = ExtResource("3_vgvac") | |||
material_east = ExtResource("7_xd1nd") | |||
id = "004" | |||
name = "Leaves" | |||
amount = 100 | |||
description = "Tree leaves" | |||
item_texture = "uid://goygbpyqhych" | |||
metadata/_custom_type_script = "uid://dwrmy4mx0mw18" | |||
[resource] | |||
script = ExtResource("1_4v6mg") | |||
inventory = Array[ExtResource("1_gg8jx")]([SubResource("Resource_jaam2"), SubResource("Resource_4kby3"), SubResource("Resource_byct5"), SubResource("Resource_qycqj")]) | |||
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,69 @@ | |||
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: | |||
InventoryManager.item_picked_up.connect(add_item.bind()) | |||
InventoryManager.item_dropped.connect(subtract_item.bind()) | |||
for item_resource: ItemResource in inventory_resource.inventory: | |||
add_item(item_resource) | |||
func add_item(item_resource: ItemResource, amount: int = 1) -> 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,60 @@ | |||
[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 | |||
custom_minimum_size = Vector2(860, 400) | |||
layout_mode = 3 | |||
anchors_preset = 8 | |||
anchor_left = 0.5 | |||
anchor_top = 0.5 | |||
anchor_right = 0.5 | |||
anchor_bottom = 0.5 | |||
offset_left = -410.0 | |||
offset_top = -200.0 | |||
offset_right = 410.0 | |||
offset_bottom = 200.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="Label" type="Label" parent="Background/MarginContainer/VBoxContainer"] | |||
layout_mode = 2 | |||
theme_type_variation = &"HeaderLarge" | |||
text = "Inventory" | |||
[node name="GridContainer" type="GridContainer" parent="Background/MarginContainer/VBoxContainer"] | |||
layout_mode = 2 | |||
size_flags_vertical = 3 | |||
theme_override_constants/h_separation = 20 | |||
theme_override_constants/v_separation = 20 | |||
columns = 10 |
@ -0,0 +1,19 @@ | |||
class_name InventoryItemRect | |||
extends Panel | |||
@export var amount_label: Label | |||
@export var item_resource: ItemResource | |||
@export var item_texture: TextureRect | |||
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 + "\n" + item_resource.description | |||
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,41 @@ | |||
[gd_scene load_steps=4 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"] | |||
[sub_resource type="LabelSettings" id="LabelSettings_oderi"] | |||
outline_size = 3 | |||
outline_color = Color(0, 0, 0, 1) | |||
[node name="ItemRect" type="Panel" node_paths=PackedStringArray("amount_label", "item_texture")] | |||
custom_minimum_size = Vector2(64, 64) | |||
offset_right = 64.0 | |||
offset_bottom = 64.0 | |||
script = ExtResource("1_oderi") | |||
amount_label = NodePath("AmountLabel") | |||
item_texture = NodePath("ItemTexture") | |||
metadata/_edit_use_anchors_ = true | |||
[node name="ItemTexture" type="TextureRect" parent="."] | |||
texture_filter = 1 | |||
layout_mode = 0 | |||
offset_right = 64.0 | |||
offset_bottom = 64.0 | |||
texture = ExtResource("1_o0kom") | |||
expand_mode = 1 | |||
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" | |||
label_settings = SubResource("LabelSettings_oderi") |