fixed up some damage number bugs

This commit is contained in:
2025-06-25 22:07:48 +10:00
parent 2bfea6471c
commit 0cd8715468
47 changed files with 6017 additions and 161 deletions

View File

@@ -1,16 +1,7 @@
class_name Affector
extends Node
var damage_particle_scene: PackedScene = preload("res://Scenes/damage_particle.tscn")
@warning_ignore("unused_parameter")
func apply_effect(effect: Effect, targets: Array[EnemyController]) -> void:
pass
func spawn_damage_indicator(damage: int, pos: Vector3) -> void:
var marker: Sprite3D = damage_particle_scene.instantiate()
get_tree().root.add_child(marker)
marker.set_number(damage)
marker.position = pos

View File

@@ -11,10 +11,6 @@ func apply_effect(effect: Effect, targets: Array[EnemyController]) -> void:
#print(shapecast.get_collider(i))
if targets.has(enemy):
enemy.apply_effect(effect)
if Data.preferences.display_tower_damage_indicators and effect.damage > 0:
spawn_damage_indicator(effect.damage, enemy.d_n.global_position)
else:
for enemy: EnemyController in targets:
enemy.apply_effect(effect)
if Data.preferences.display_tower_damage_indicators and effect.damage > 0:
spawn_damage_indicator(effect.damage, enemy.d_n.global_position)

View File

@@ -5,5 +5,3 @@ extends Affector
func apply_effect(effect: Effect, targets: Array[EnemyController]) -> void:
for enemy: EnemyController in targets:
enemy.apply_effect(effect)
if Data.preferences.display_tower_damage_indicators and effect.damage > 0:
spawn_damage_indicator(effect.damage, enemy.d_n.global_position)

View File

@@ -9,6 +9,8 @@ var next_node: FlowNode :
return next_node
set(value):
next_node = value
if next_node == null:
return
var found_point: bool = false
while !found_point:
#TODO: make deterministic random
@@ -44,9 +46,11 @@ func walk(delta: float) -> void:
var distance_travelled: float = (speed * clampf(speed, 0.0, 1.0)) * delta
distance_remaining -= distance_travelled
character.global_position = character.global_position.move_toward(next_pos, distance_travelled)
character.look_at(next_pos)
if character.global_position.distance_to(next_pos) <= 0.05:
var distance_to_next_pos: float = character.global_position.distance_to(next_pos)
if distance_to_next_pos <= 0.05:
next_node = next_node.best_path
else:
character.look_at(next_pos)
func _physics_process(delta: float) -> void:

View File

@@ -35,15 +35,15 @@ func explode() -> void:
func hit(target: CharacterBody3D) -> void:
target.apply_effect(effect)
if owner_id == 0:
if Data.preferences.display_tower_damage_indicators:
spawn_damage_indicator(target.d_n.global_position)
if owner_id == multiplayer.get_unique_id():
if Data.preferences.display_self_damage_indicators:
spawn_damage_indicator(target.d_n.global_position)
if owner_id != 0 and owner_id != multiplayer.get_unique_id():
if Data.preferences.display_party_damage_indicators:
spawn_damage_indicator(target.d_n.global_position)
#if owner_id == 0:
#if Data.preferences.display_tower_damage_indicators:
#spawn_damage_indicator(target.d_n.global_position)
#if owner_id == multiplayer.get_unique_id():
#if Data.preferences.display_self_damage_indicators:
#spawn_damage_indicator(target.d_n.global_position)
#if owner_id != 0 and owner_id != multiplayer.get_unique_id():
#if Data.preferences.display_party_damage_indicators:
#spawn_damage_indicator(target.d_n.global_position)
@rpc("reliable")

View File

@@ -3,9 +3,8 @@ extends RigidBody3D
@export var collision_shape: CollisionShape3D
var damage_particle_scene: PackedScene = preload("res://Scenes/damage_particle.tscn")
var owner_id: int = 0 #should be left unchanged by towers, 1 for host, peer_id on peers
var direction: Vector3= Vector3.FORWARD
var direction: Vector3 = Vector3.FORWARD
var force: float = 2.0
var damage: float = 0.0
var lifetime: float = 10.0
@@ -21,14 +20,6 @@ func _process(delta: float) -> void:
time_alive += delta
func spawn_damage_indicator(pos: Vector3) -> void:
if effect.damage > 0:
var marker: Node3D = damage_particle_scene.instantiate()
get_tree().root.add_child(marker)
marker.set_number(effect.damage)
marker.position = pos
func _on_body_entered(_body: Node) -> void:
pass # Replace with function body.

View File

@@ -3,4 +3,4 @@ extends StatusEffect
func proc(affected: EnemyController, stacks: int, _existing_effects: Dictionary) -> void:
affected.health.take_damage(int(stats.potency * stacks))
affected.take_damage(int(stats.potency * stacks), Data.DamageIndicationType.STATUS)

View File

@@ -19,23 +19,17 @@ func shoot() -> void:
super.shoot()
if raycast.is_colliding():
var target: CharacterBody3D = raycast.get_collider()
if target != null:
var target_hitbox: CollisionShape3D = target.shape_owner_get_owner(raycast.get_collider_shape())
if target_hitbox is Hitbox:
hit(target, target_hitbox)
if Data.preferences.display_self_damage_indicators:
spawn_damage_indicator(raycast.get_collision_point())
networked_hit.rpc(get_tree().root.get_path_to(target), get_tree().root.get_path_to(target_hitbox))
if target != null and target is EnemyController:
var hitbox: Hitbox = target.shape_owner_get_owner(raycast.get_collider_shape())
hit(hitbox, raycast.get_collision_point())
networked_hit.rpc(get_tree().root.get_path_to(hitbox), raycast.get_collision_point())
func hit(_target: CharacterBody3D, target_hitbox: Hitbox) -> void:
target_hitbox.damage(damage)
func hit(hitbox: Hitbox, hit_pos: Vector3) -> void:
hitbox.damage(damage, Data.DamageIndicationType.PLAYER, hit_pos)
@rpc("reliable")
func networked_hit(target_path: String, target_hitbox_path: String) -> void:
var target: CharacterBody3D = get_tree().root.get_node(target_path)
var target_hitbox: Hitbox = get_tree().root.get_node(target_hitbox_path) as Hitbox
hit(target, target_hitbox)
if Data.preferences.display_party_damage_indicators:
spawn_damage_indicator(target.d_n.global_position)
func networked_hit(hitbox_path: String, hit_pos: Vector3) -> void:
var hitbox: Hitbox = get_tree().root.get_node(hitbox_path) as Hitbox
hitbox.damage(damage, Data.DamageIndicationType.OTHER_PLAYER, hit_pos)

View File

@@ -30,8 +30,6 @@ func shoot() -> void:
var target_hitbox: Hitbox = target.shape_owner_get_owner(shapecast.get_collider_shape(index))
if target_hitbox is Hitbox:
hit(target, target_hitbox)
if Data.preferences.display_self_damage_indicators:
spawn_damage_indicator(target.d_n.global_position)
networked_hit.rpc(get_tree().root.get_path_to(target), get_tree().root.get_path_to(target_hitbox))
@@ -51,5 +49,3 @@ func networked_hit(target_path: String, target_hitbox_path: String) -> void:
var target: CharacterBody3D = get_tree().root.get_node(target_path) as CharacterBody3D
var target_hitbox: Hitbox = get_tree().root.get_node(target_hitbox_path) as Hitbox
hit(target, target_hitbox)
if Data.preferences.display_party_damage_indicators:
spawn_damage_indicator(target.d_n.global_position)

View File

@@ -4,9 +4,9 @@ extends HitscanWeapon
@export var status_stats: StatusStats
func hit(target: CharacterBody3D, target_hitbox: Hitbox) -> void:
super.hit(target, target_hitbox)
target.status_manager.add_effect(build_status_object())
func hit(hitbox: Hitbox, hit_pos: Vector3) -> void:
super.hit(hitbox, hit_pos)
hitbox.add_effect(build_status_object())
func build_status_object() -> StatusEffect:

View File

@@ -9,7 +9,6 @@ signal energy_recharged(energy: int, type: Data.EnergyType)
@export var audio_player: AudioStreamPlayer3D
@export var recharge_timer: Timer
var damage_particle_scene: PackedScene = preload("res://Scenes/damage_particle.tscn")
var hero: Hero
var trigger_held: bool = false
var second_trigger_held: bool = false
@@ -86,14 +85,6 @@ func release_second_trigger() -> void:
second_trigger_held = false
func spawn_damage_indicator(pos: Vector3) -> void:
if damage > 0:
var marker: Node3D = damage_particle_scene.instantiate()
get_tree().root.add_child(marker)
marker.set_number(damage)
marker.position = pos
func shoot() -> void:
animator.play("shoot")
audio_player.play()

View File

@@ -6,6 +6,7 @@ var time_alive: float = 0.0
var movement_speed: float = 1.0
var movement_vector: Vector3
func _ready() -> void:
var theta: float = deg_to_rad(40)
var z: float = randf_range(cos(theta), 1)
@@ -13,10 +14,15 @@ func _ready() -> void:
var vector: Vector3 = Vector3(sqrt(1 - pow(z, 2)) * cos(phi), z, sqrt(1 - pow(z, 2)) * sin(phi))
movement_vector = vector.normalized()
func set_number(num: int) -> void:
label.text = str(num)
func set_color(color: Color) -> void:
label.modulate = color
func _process(delta: float) -> void:
time_alive += delta
position += movement_vector * movement_speed * delta

View File

@@ -12,6 +12,7 @@ var save_data: SaveData
var keymap_data: KeymapData
const DEFAULT_SERVER_PORT: int = 58008
enum DamageIndicationType {PLAYER = 0, TOWER = 1, OTHER_PLAYER = 2, STATUS = 3}
enum EnergyType {UNDEFINED = 0, DISCRETE = 1, CONTINUOUS = 2}
enum TargetType {UNDEFINED = 0, LAND = 1, AIR = 2, BOTH = 3}
enum EnemyType {UNDEFINED = 0, LAND = 1, AIR = 2}

View File

@@ -173,6 +173,7 @@ func spawn_enemy_wave() -> void:
level.flow_field.calculate()
for spawn: EnemySpawner in level.enemy_spawns:
#spawn.path.disable_visualization()
spawn.visible = false
spawn.spawn_wave()
wave_started.emit(wave)
@@ -247,7 +248,7 @@ func end_wave() -> void:
connected_players_nodes[peer_id].currency += ceili(pot / connected_players_nodes.size())
connected_players_nodes[peer_id].unready_self()
for spawn: EnemySpawner in level.enemy_spawns:
spawn.path.enable_visualization()
spawn.visible = true
#level.a_star_graph_3d.enable_non_path_tower_frames()
level.enable_non_path_tower_frames()
if is_multiplayer_authority():

View File

@@ -4,7 +4,6 @@ extends Node
signal health_depleted
signal health_changed(health: int)
@export var damage_particle_scene: PackedScene
@export var max_health: int = 10
var current_health: int

View File

@@ -3,8 +3,13 @@ extends CollisionShape3D
@export var critical_zone: bool = false
signal took_damage(amount: int)
signal took_damage(amount: int, damage_type: Data.DamageIndicationType, pos: Vector3)
signal recieved_effect(effect: StatusEffect)
func damage(amount: int) -> void:
took_damage.emit(amount * 1.5 if critical_zone else amount)
func damage(amount: int, damage_type: Data.DamageIndicationType = Data.DamageIndicationType.PLAYER, pos: Vector3 = global_position) -> void:
took_damage.emit(roundi(amount * 1.5) if critical_zone else amount, damage_type, pos)
func apply_effect(effect: StatusEffect) -> void:
recieved_effect.emit(effect)