diff --git a/godot/resources/items/pistol.tres b/godot/resources/items/pistol.tres index 2260a60..39aed5e 100644 --- a/godot/resources/items/pistol.tres +++ b/godot/resources/items/pistol.tres @@ -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") diff --git a/godot/resources/player_equipment.tres b/godot/resources/player_equipment.tres new file mode 100644 index 0000000..e544b57 --- /dev/null +++ b/godot/resources/player_equipment.tres @@ -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" diff --git a/godot/scenes/level.tscn b/godot/scenes/level.tscn index ed2e8e8..d0fcdce 100644 --- a/godot/scenes/level.tscn +++ b/godot/scenes/level.tscn @@ -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"] diff --git a/godot/scenes/player.tscn b/godot/scenes/player.tscn index 2e094ed..5dd1d46 100644 --- a/godot/scenes/player.tscn +++ b/godot/scenes/player.tscn @@ -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") diff --git a/godot/src/carousel.gd.uid b/godot/src/carousel.gd.uid deleted file mode 100644 index 310885d..0000000 --- a/godot/src/carousel.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bhwc3ir05k8uc diff --git a/godot/src/equipment.gd b/godot/src/equipment.gd index ae9259f..f9b6ae1 100644 --- a/godot/src/equipment.gd +++ b/godot/src/equipment.gd @@ -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 diff --git a/godot/src/equipment.gd.uid b/godot/src/equipment.gd.uid index 9366656..cd84c39 100644 --- a/godot/src/equipment.gd.uid +++ b/godot/src/equipment.gd.uid @@ -1 +1 @@ -uid://c710qg683rqbc +uid://bff1tgf3sn855 diff --git a/godot/src/equipment_handler.gd b/godot/src/equipment_handler.gd index e057b5a..f15ba18 100644 --- a/godot/src/equipment_handler.gd +++ b/godot/src/equipment_handler.gd @@ -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()) diff --git a/godot/src/equippable_item.gd b/godot/src/equippable_item.gd new file mode 100644 index 0000000..ab52ba0 --- /dev/null +++ b/godot/src/equippable_item.gd @@ -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 diff --git a/godot/src/equippable_item.gd.uid b/godot/src/equippable_item.gd.uid new file mode 100644 index 0000000..9366656 --- /dev/null +++ b/godot/src/equippable_item.gd.uid @@ -0,0 +1 @@ +uid://c710qg683rqbc diff --git a/godot/src/file.gd.uid b/godot/src/file.gd.uid deleted file mode 100644 index 7da4a7f..0000000 --- a/godot/src/file.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://xwi0ehjmeqdu diff --git a/godot/src/follow.gd.uid b/godot/src/follow.gd.uid deleted file mode 100644 index 061e526..0000000 --- a/godot/src/follow.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c4aptu03hf5ew diff --git a/godot/src/h_list_container.gd.uid b/godot/src/h_list_container.gd.uid deleted file mode 100644 index c589d76..0000000 --- a/godot/src/h_list_container.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cmf7ujtvt25fc diff --git a/godot/src/item_details.gd.uid b/godot/src/item_details.gd.uid deleted file mode 100644 index c0495bd..0000000 --- a/godot/src/item_details.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ml88oygh8loh diff --git a/godot/src/item_list.gd.uid b/godot/src/item_list.gd.uid deleted file mode 100644 index a2763d5..0000000 --- a/godot/src/item_list.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dgwcg6w0fqs4 diff --git a/godot/src/padded_ring_buffer.gd.uid b/godot/src/padded_ring_buffer.gd.uid deleted file mode 100644 index c0c4ded..0000000 --- a/godot/src/padded_ring_buffer.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cn4vo23fokoli diff --git a/godot/src/player.gd b/godot/src/player.gd index 5707eaf..01ba1c6 100644 --- a/godot/src/player.gd +++ b/godot/src/player.gd @@ -9,61 +9,61 @@ class_name Player extends CharacterBody3D @export var equipment: EquipmentHandler var is_running: bool: - get: return velocity and input.is_running + 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 + get: return is_carrying_item and input.is_weapon_ready func _ready() -> void: - input.connect('interact', _on_interact) - input.connect('fire', _on_fire) + input.connect('interact', _on_interact) + input.connect('fire', _on_fire) func _physics_process(delta: float) -> void: - if is_weapon_ready: - rotate_toward_look(delta) - else: - move_and_rotate(delta) + if is_weapon_ready: + rotate_toward_look(delta) + else: + move_and_rotate(delta) func move_and_rotate(_delta: float): - var speed = run_speed if input.is_running else walk_speed - velocity = input.next_velocity(speed) - if !velocity.is_zero_approx(): - look_at(global_position + velocity, Vector3.UP, true) - move_and_slide() + var speed = run_speed if input.is_running else walk_speed + velocity = input.next_velocity(speed) + if !velocity.is_zero_approx(): + look_at(global_position + velocity, Vector3.UP, true) + move_and_slide() func rotate_toward_look(_delta: float): - velocity = Vector3.ZERO - var target = input.get_look_target(global_position) - if target.is_some(): - var target_point = target.unwrap() - var mouse_dir = (target_point - global_position) - if mouse_dir.length_squared() > 0.0001: - var desired_basis = Basis.looking_at(mouse_dir.normalized(), Vector3.UP) - var yaw = desired_basis.get_euler().y - rotation.y = fmod(yaw + PI, TAU) + velocity = Vector3.ZERO + var target = input.get_look_target(global_position) + if target.is_some(): + var target_point = target.unwrap() + var mouse_dir = (target_point - global_position) + if mouse_dir.length_squared() > 0.0001: + var desired_basis = Basis.looking_at(mouse_dir.normalized(), Vector3.UP) + var yaw = desired_basis.get_euler().y + rotation.y = fmod(yaw + PI, TAU) - rotation.x = 0.0 - rotation.z = 0.0 + rotation.x = 0.0 + rotation.z = 0.0 func _on_interact(): - interactor.interact_nearest() + interactor.interact_nearest() func _on_fire(): - if is_weapon_ready: - equipment.use() + if is_weapon_ready: + equipment.use_primary() func on_save(): - return { - position = position, - rotation = rotation - } + return { + position = position, + rotation = rotation + } func on_before_load(): - pass + pass func on_load(data: Dictionary): - position = data.position - rotation = data.rotation + position = data.position + rotation = data.rotation diff --git a/godot/src/root.gd.uid b/godot/src/root.gd.uid deleted file mode 100644 index 0a5adc9..0000000 --- a/godot/src/root.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dg6n501j1gjdo