add yet another layer of abstraction to equipment
This commit is contained in:
parent
a410c9c0e6
commit
3b39ff2970
18 changed files with 150 additions and 79 deletions
|
@ -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")
|
||||
|
|
9
godot/resources/player_equipment.tres
Normal file
9
godot/resources/player_equipment.tres
Normal 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"
|
|
@ -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"]
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
uid://bhwc3ir05k8uc
|
|
@ -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
|
||||
|
|
|
@ -1 +1 @@
|
|||
uid://c710qg683rqbc
|
||||
uid://bff1tgf3sn855
|
||||
|
|
|
@ -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())
|
||||
|
|
9
godot/src/equippable_item.gd
Normal file
9
godot/src/equippable_item.gd
Normal 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
|
1
godot/src/equippable_item.gd.uid
Normal file
1
godot/src/equippable_item.gd.uid
Normal file
|
@ -0,0 +1 @@
|
|||
uid://c710qg683rqbc
|
|
@ -1 +0,0 @@
|
|||
uid://xwi0ehjmeqdu
|
|
@ -1 +0,0 @@
|
|||
uid://c4aptu03hf5ew
|
|
@ -1 +0,0 @@
|
|||
uid://cmf7ujtvt25fc
|
|
@ -1 +0,0 @@
|
|||
uid://ml88oygh8loh
|
|
@ -1 +0,0 @@
|
|||
uid://dgwcg6w0fqs4
|
|
@ -1 +0,0 @@
|
|||
uid://cn4vo23fokoli
|
|
@ -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 {
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
uid://dg6n501j1gjdo
|
Loading…
Add table
Reference in a new issue