add yet another layer of abstraction to equipment

This commit is contained in:
Rowan 2025-06-28 09:37:11 -04:00
parent a410c9c0e6
commit 3b39ff2970
18 changed files with 150 additions and 79 deletions

View file

@ -1,7 +1,7 @@
[gd_resource type="Resource" script_class="Equipment" load_steps=3 format=3 uid="uid://crgwey6ibaf2h"]
[ext_resource type="PackedScene" uid="uid://isqkayrtr7t8" path="res://scenes/pistol.tscn" id="1_6ttue"]
[ext_resource type="Script" uid="uid://c710qg683rqbc" path="res://src/equipment.gd" id="1_lqglu"]
[ext_resource type="Script" uid="uid://c710qg683rqbc" path="res://src/equippable_item.gd" id="1_lqglu"]
[resource]
script = ExtResource("1_lqglu")

View file

@ -0,0 +1,9 @@
[gd_resource type="Resource" script_class="Equipment" load_steps=3 format=3 uid="uid://cxm3s081hnw8l"]
[ext_resource type="Script" uid="uid://bff1tgf3sn855" path="res://src/equipment.gd" id="1_ajqsy"]
[ext_resource type="Resource" uid="uid://crgwey6ibaf2h" path="res://resources/items/pistol.tres" id="1_hds1i"]
[resource]
script = ExtResource("1_ajqsy")
_primary = ExtResource("1_hds1i")
metadata/_custom_type_script = "uid://bff1tgf3sn855"

View file

@ -6,7 +6,7 @@
[ext_resource type="Script" uid="uid://8umksf8e80fw" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_b121j"]
[ext_resource type="Script" uid="uid://dyghf5fq7s72x" path="res://src/interactable.gd" id="3_w8frs"]
[ext_resource type="Script" uid="uid://bd046eokvcnu2" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_8c41q"]
[ext_resource type="Script" uid="uid://cdvtrsqkkxtdd" path="res://src/persistence.gd" id="4_mx8sn"]
[ext_resource type="Script" uid="uid://pdpejp2xor23" path="res://src/persistence.gd" id="4_mx8sn"]
[ext_resource type="Resource" uid="uid://cqfnwpmo4fyv4" path="res://resources/items/key.tres" id="7_8c41q"]
[ext_resource type="PackedScene" uid="uid://cn7tgd4y67wnd" path="res://scenes/inventory.tscn" id="8_b121j"]
[ext_resource type="PackedScene" uid="uid://c0cf6jkxasplk" path="res://scenes/enemy.tscn" id="10_olg7q"]

View file

@ -6,7 +6,7 @@
[ext_resource type="Script" uid="uid://c3wlcxy4vnm2i" path="res://src/interactor.gd" id="4_dqkch"]
[ext_resource type="Script" uid="uid://csjl56hf0fnoy" path="res://src/item_container.gd" id="5_qlg0r"]
[ext_resource type="Script" uid="uid://k1ihjmhj7ix" path="res://src/equipment_handler.gd" id="5_smehm"]
[ext_resource type="Resource" uid="uid://crgwey6ibaf2h" path="res://resources/items/pistol.tres" id="6_smehm"]
[ext_resource type="Resource" uid="uid://cxm3s081hnw8l" path="res://resources/player_equipment.tres" id="6_smehm"]
[ext_resource type="Resource" uid="uid://bllq6ri54q3ne" path="res://resources/player_inventory.tres" id="6_tuyoq"]
[sub_resource type="SphereShape3D" id="SphereShape3D_qhqgy"]
@ -215,7 +215,7 @@ bone_idx = 24
use_external_skeleton = true
external_skeleton = NodePath("../Mesh/AuxScene/Scene/Armature/Skeleton3D")
script = ExtResource("5_smehm")
initial_equipment = ExtResource("6_smehm")
equipment = ExtResource("6_smehm")
[node name="Interactor" type="Node3D" parent="." node_paths=PackedStringArray("area", "root_node")]
script = ExtResource("4_dqkch")

View file

@ -1 +0,0 @@
uid://bhwc3ir05k8uc

View file

@ -1,9 +1,63 @@
class_name Equipment extends Item
class_name Equipment extends Resource
@export var scene: PackedScene
signal unequipped_primary(equipment: EquippableItem)
signal equipped_primary(equipment: EquippableItem)
signal unequipped_secondary(equipment: EquippableItem)
signal equipped_secondary(equipment: EquippableItem)
@export var _primary: EquippableItem
var primary: Option:
get: return Option.from(_primary)
set(value): set_primary(value)
func _unequip_primary():
if _primary != null:
var previous = _primary
_primary = null
unequipped_primary.emit(previous)
func _equip_primary(item: EquippableItem):
if _primary != null:
_unequip_primary()
if item != null:
_primary = item
equipped_primary.emit(item)
func set_primary(item: Option):
_equip_primary(item.unwrap())
@export var _secondary: EquippableItem
var secondary: Option:
get: return Option.from(_secondary)
set(value): set_secondary(value)
func _unequip_secondary():
if _secondary != null:
var previous = _secondary
_secondary = null
unequipped_secondary.emit(previous)
func _equip_secondary(item: EquippableItem):
if _secondary != null:
_unequip_secondary()
if item != null:
_secondary = item
equipped_secondary.emit(item)
func set_secondary(item: Option):
_equip_secondary(item.unwrap())
func _init():
call_deferred("_ready")
func _ready():
if _primary != null:
_equip_primary(_primary)
if _secondary != null:
_equip_secondary(_secondary)
func create() -> Option:
if scene != null and scene.can_instantiate():
return Option.some(scene.instantiate())
else:
return Option.none

View file

@ -1 +1 @@
uid://c710qg683rqbc
uid://bff1tgf3sn855

View file

@ -1,33 +1,39 @@
class_name EquipmentHandler extends Node3D
signal unequipped(equipment: Equipment)
signal equipped(equipment: Equipment)
@export var equipment: Equipment
@export var initial_equipment: Equipment
var current_equipment: Option = Option.none
var primary_node: Node
var secondary_node: Node
var has_equipped_item: bool:
get: return current_equipment.is_some()
func _ready():
equipment.unequipped_primary.connect(_on_unequipped_primary)
equipment.equipped_primary.connect(_on_equipped_primary)
func _ready() -> void:
equip(initial_equipment)
func equip(item: EquippableItem):
equipment.set_primary(Option.from(item))
func unequip():
if current_equipment.is_some():
var equipment = current_equipment.unwrap()
current_equipment = Option.none
unequipped.emit(equipment)
equipment.queue_free()
equipment.set_primary(Option.none)
func equip(equipment: Equipment):
unequip()
if equipment != null:
match initial_equipment.create():
var opt when opt.is_some():
var item = opt.unwrap()
add_child(item)
current_equipment = Option.from(item)
equipped.emit(equipment)
func remove_equipment():
if primary_node != null:
primary_node.queue_free()
primary_node = null
func equip_item(item: EquippableItem):
remove_equipment()
if item != null:
print(item.scene)
primary_node = item.scene.instantiate()
add_child(primary_node)
func _on_unequipped_primary(_item: EquippableItem):
remove_equipment()
func _on_equipped_primary(item: EquippableItem):
equip_item(item)
func use_primary():
if primary_node != null:
primary_node.use()
func use():
current_equipment.inspect(func(x: Variant) -> void: x.use())

View file

@ -0,0 +1,9 @@
class_name EquippableItem extends Item
@export var scene: PackedScene
func create() -> Option:
if scene != null and scene.can_instantiate():
return Option.some(scene.instantiate())
else:
return Option.none

View file

@ -0,0 +1 @@
uid://c710qg683rqbc

View file

@ -1 +0,0 @@
uid://xwi0ehjmeqdu

View file

@ -1 +0,0 @@
uid://c4aptu03hf5ew

View file

@ -1 +0,0 @@
uid://cmf7ujtvt25fc

View file

@ -1 +0,0 @@
uid://ml88oygh8loh

View file

@ -1 +0,0 @@
uid://dgwcg6w0fqs4

View file

@ -1 +0,0 @@
uid://cn4vo23fokoli

View file

@ -12,7 +12,7 @@ var is_running: bool:
get: return velocity and input.is_running
var is_carrying_item: bool:
get: return equipment.has_equipped_item
get: return equipment.equipment.primary.is_some()
var is_weapon_ready: bool:
get: return is_carrying_item and input.is_weapon_ready
@ -53,7 +53,7 @@ func _on_interact():
func _on_fire():
if is_weapon_ready:
equipment.use()
equipment.use_primary()
func on_save():
return {

View file

@ -1 +0,0 @@
uid://dg6n501j1gjdo