This commit is contained in:
Marek Lenczewski
2026-04-04 00:00:15 +02:00
parent 3488856b91
commit f1d34ebf1d
104 changed files with 1912 additions and 1789 deletions

View File

@@ -5,5 +5,5 @@ extends Node
func _unhandled_input(event: InputEvent) -> void:
for i in range(5):
if event.is_action_pressed("ability_%s" % (i + 1)):
EventBus.ability_use_requested.emit(player, i)
EventBus.ability_use.emit(player, i)
return

View File

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

View File

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

12
scenes/player/init.gd Normal file
View File

@@ -0,0 +1,12 @@
extends CharacterBody3D
@export var stats: PlayerStats
func _ready() -> void:
add_to_group("player")
PlayerData.init_from_resource(stats)
if PlayerData.returning_from_dungeon:
global_position = PlayerData.portal_position + Vector3(0, 1, -5)
PlayerData.returning_from_dungeon = false
elif PlayerData.dungeon_cleared:
PlayerData.clear_cache()

View File

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

View File

@@ -8,12 +8,8 @@ func _physics_process(delta: float) -> void:
if not player.is_on_floor():
player.velocity.y -= gravity * delta
var base: BaseStats = Stats.get_base(player)
var speed: float = base.speed if base is PlayerStats else 5.0
var jump_velocity: float = base.jump_velocity if base is PlayerStats else 4.5
if Input.is_action_just_pressed("ui_accept") and player.is_on_floor():
player.velocity.y = jump_velocity
player.velocity.y = PlayerData.jump_velocity
var input_dir := Input.get_vector("move_left", "move_right", "move_forward", "move_back")
var camera_pivot := player.get_node("CameraPivot") as Node3D
@@ -27,10 +23,10 @@ func _physics_process(delta: float) -> void:
var direction := (forward * -input_dir.y + right * input_dir.x).normalized()
if direction:
player.velocity.x = direction.x * speed
player.velocity.z = direction.z * speed
player.velocity.x = direction.x * PlayerData.speed
player.velocity.z = direction.z * PlayerData.speed
else:
player.velocity.x = move_toward(player.velocity.x, 0, speed)
player.velocity.z = move_toward(player.velocity.z, 0, speed)
player.velocity.x = move_toward(player.velocity.x, 0, PlayerData.speed)
player.velocity.z = move_toward(player.velocity.z, 0, PlayerData.speed)
player.move_and_slide()

View File

@@ -1,28 +0,0 @@
extends CharacterBody3D
@export var stats: BaseStats
func _ready() -> void:
add_to_group("player")
Stats.register(self, stats)
var cooldown_system: Node = get_tree().get_first_node_in_group("cooldown_system")
if cooldown_system:
cooldown_system.register(self, 5)
if GameState.returning_from_dungeon:
GameState.restore_player(self)
global_position = GameState.portal_position + Vector3(0, 1, -5)
GameState.returning_from_dungeon = false
elif GameState.dungeon_cleared:
GameState.clear()
var health: float = Stats.get_stat(self, "health")
var max_health: float = Stats.get_stat(self, "max_health")
var shield: float = Stats.get_stat(self, "shield")
var max_shield: float = Stats.get_stat(self, "max_shield")
EventBus.health_changed.emit(self, health, max_health)
EventBus.shield_changed.emit(self, shield, max_shield)
func _exit_tree() -> void:
Stats.deregister(self)
var cooldown_system: Node = get_tree().get_first_node_in_group("cooldown_system")
if cooldown_system:
cooldown_system.deregister(self)

View File

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

View File

@@ -1,15 +1,12 @@
[gd_scene format=3 uid="uid://cdnkbt1f0db7e"]
[ext_resource type="Script" uid="uid://bfpt2p7uucfyb" path="res://scenes/player/player.gd" id="1"]
[ext_resource type="Script" uid="uid://cx6k5473yxno" path="res://scenes/player/init.gd" id="1"]
[ext_resource type="Script" uid="uid://cohjyjge1kqxb" path="res://scenes/player/camera.gd" id="2"]
[ext_resource type="Script" uid="uid://fg87dh8fbc8" path="res://scenes/player/movement.gd" id="3"]
[ext_resource type="Script" uid="uid://d15til6fsxw5b" path="res://scenes/player/combat.gd" id="4"]
[ext_resource type="Script" uid="uid://hh5yw7vcjdqr" path="res://scenes/player/ability.gd" id="4"]
[ext_resource type="Script" uid="uid://b05nkuryipwny" path="res://scenes/player/targeting.gd" id="8"]
[ext_resource type="Script" path="res://scenes/player/role/role.gd" id="10"]
[ext_resource type="Resource" uid="uid://cgxtn7dfs40bh" path="res://scenes/player/role/tank/set.tres" id="11"]
[ext_resource type="Resource" uid="uid://beodknb6i1pm4" path="res://scenes/player/role/damage/set.tres" id="12"]
[ext_resource type="Resource" uid="uid://kcwuhnqy34mj" path="res://scenes/player/role/healer/set.tres" id="13"]
[ext_resource type="Resource" path="res://scenes/player/player_stats.tres" id="14"]
[ext_resource type="Script" uid="uid://dhomrampxola4" path="res://scenes/player/role/role.gd" id="10"]
[ext_resource type="Resource" uid="uid://btd0g0oiulssq" path="res://scenes/player/player_stats.tres" id="14"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1"]
radius = 0.3
@@ -19,34 +16,31 @@ height = 1.8
radius = 0.3
height = 1.8
[node name="Player" type="CharacterBody3D" unique_id=1350215040]
[node name="Player" type="CharacterBody3D" unique_id=197716516]
script = ExtResource("1")
stats = ExtResource("14")
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=33887999]
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=311205642]
shape = SubResource("CapsuleShape3D_1")
[node name="Mesh" type="MeshInstance3D" parent="." unique_id=1346931672]
[node name="Mesh" type="MeshInstance3D" parent="." unique_id=1514179122]
mesh = SubResource("CapsuleMesh_1")
[node name="CameraPivot" type="Node3D" parent="." unique_id=1292689540]
[node name="CameraPivot" type="Node3D" parent="." unique_id=1881685457]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0)
script = ExtResource("2")
[node name="Camera3D" type="Camera3D" parent="CameraPivot" unique_id=1225820651]
[node name="Camera3D" type="Camera3D" parent="CameraPivot" unique_id=2062990383]
transform = Transform3D(1, 0, 0, 0, 0.966, 0.259, 0, -0.259, 0.966, 0, 2, 5)
[node name="Movement" type="Node" parent="." unique_id=654979387]
[node name="Movement" type="Node" parent="." unique_id=811179177]
script = ExtResource("3")
[node name="Combat" type="Node" parent="." unique_id=1754235583]
[node name="Ability" type="Node" parent="." unique_id=1184596245]
script = ExtResource("4")
[node name="Targeting" type="Node" parent="." unique_id=592540710]
[node name="Targeting" type="Node" parent="." unique_id=1974574662]
script = ExtResource("8")
[node name="Role" type="Node" parent="." unique_id=134158295]
[node name="Role" type="Node" parent="." unique_id=1637643687]
script = ExtResource("10")
tank_set = ExtResource("11")
damage_set = ExtResource("12")
healer_set = ExtResource("13")

View File

@@ -1,40 +1,14 @@
extends Node
enum Role { TANK, DAMAGE, HEALER }
var current_role: int = Role.DAMAGE
@export var tank_set: AbilitySet
@export var damage_set: AbilitySet
@export var healer_set: AbilitySet
@onready var player: CharacterBody3D = get_parent()
func _ready() -> void:
set_role.call_deferred(current_role)
EventBus.role_change_requested.emit(player, PlayerData.current_role)
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("class_tank"):
set_role(Role.TANK)
EventBus.role_change_requested.emit(player, PlayerData.Role.TANK)
elif event.is_action_pressed("class_damage"):
set_role(Role.DAMAGE)
EventBus.role_change_requested.emit(player, PlayerData.Role.DAMAGE)
elif event.is_action_pressed("class_healer"):
set_role(Role.HEALER)
func set_role(new_role: int) -> void:
current_role = new_role
EventBus.role_changed.emit(player, current_role)
func get_role_icon() -> String:
match current_role:
Role.TANK: return "T"
Role.DAMAGE: return "D"
Role.HEALER: return "H"
return ""
func get_ability_set() -> AbilitySet:
match current_role:
Role.TANK: return tank_set
Role.DAMAGE: return damage_set
Role.HEALER: return healer_set
return damage_set
EventBus.role_change_requested.emit(player, PlayerData.Role.HEALER)

View File

@@ -1,27 +1,12 @@
extends Node
const TARGET_RANGE := 20.0
const COMBAT_TIMEOUT := 3.0
var current_target: Node3D = null
var mouse_press_pos: Vector2 = Vector2.ZERO
var in_combat := false
var combat_timer := 0.0
@onready var player: CharacterBody3D = get_parent()
@onready var camera: Camera3D = get_parent().get_node("CameraPivot/Camera3D")
func _ready() -> void:
EventBus.damage_dealt.connect(_on_damage_dealt)
EventBus.entity_died.connect(_on_entity_died)
EventBus.enemy_engaged.connect(_on_enemy_engaged)
func _process(delta: float) -> void:
if in_combat:
combat_timer -= delta
if combat_timer <= 0:
in_combat = false
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
if event.pressed:
@@ -44,71 +29,19 @@ func _try_target_under_mouse(mouse_pos: Vector2) -> void:
var result := space.intersect_ray(query)
if result:
var hit_target := result.collider.get_parent() as Node3D
set_target(hit_target)
EventBus.target_requested.emit(player, hit_target)
else:
set_target(null)
EventBus.target_requested.emit(player, null)
func _cycle_target() -> void:
var targets := get_tree().get_nodes_in_group("enemies") + get_tree().get_nodes_in_group("portals")
if targets.is_empty():
set_target(null)
EventBus.target_requested.emit(player, null)
return
if current_target == null or current_target not in targets:
set_target(targets[0])
var current: Node3D = PlayerData.target
if current == null or current not in targets:
EventBus.target_requested.emit(player, targets[0])
return
var idx := targets.find(current_target)
var idx := targets.find(current)
var next_idx := (idx + 1) % targets.size()
set_target(targets[next_idx])
func set_target(target: Node3D) -> void:
current_target = target
EventBus.target_changed.emit(player, target)
func _on_enemy_engaged(_enemy: Node, target: Node) -> void:
if target == player:
combat_timer = COMBAT_TIMEOUT
if not in_combat:
in_combat = true
if current_target == null:
_auto_target()
func _on_damage_dealt(attacker: Node, target: Node, _amount: float) -> void:
if target == player:
combat_timer = COMBAT_TIMEOUT
if not in_combat:
in_combat = true
if current_target == null:
_auto_target()
elif attacker == player and in_combat:
combat_timer = COMBAT_TIMEOUT
func _on_entity_died(entity: Node) -> void:
if entity == current_target:
set_target(null)
if in_combat:
_auto_target(entity)
func _auto_target(exclude: Node = null) -> void:
# Priorität 1: Nächster Gegner
var enemies := get_tree().get_nodes_in_group("enemies")
var nearest: Node3D = null
var nearest_dist: float = INF
for enemy in enemies:
if is_instance_valid(enemy) and enemy != exclude:
var dist: float = player.global_position.distance_to(enemy.global_position)
if dist < nearest_dist:
nearest_dist = dist
nearest = enemy
if nearest:
set_target(nearest)
return
# Priorität 2: Nächstes Portal
var portals := get_tree().get_nodes_in_group("portals")
for p in portals:
if is_instance_valid(p) and p != exclude:
var dist: float = player.global_position.distance_to(p.global_position)
if dist < nearest_dist:
nearest_dist = dist
nearest = p
if nearest:
set_target(nearest)
EventBus.target_requested.emit(player, targets[next_idx])