game: add bleed

This commit is contained in:
2025-08-22 20:50:11 +02:00
parent 0dada63709
commit 6fff2dd9a3
15 changed files with 163 additions and 28 deletions

View File

@@ -4,6 +4,8 @@ extends Node2D
enum WeaponTag {
CAN_RETURN,
CAN_BLEED,
CAN_CHAIN,
CAN_FORK,
}
@export var attack_cd: float
@@ -12,11 +14,19 @@ enum WeaponTag {
@export var attack_duration: float
@export var attack_range: float
@export var attack_crit_chance: float = 0.05
@export var return_chance: float = 0.0
@export var bleed_chance: float = 0.0
@export var bleed_duration: float = 5.0
@export var chain_chance: float = 0.0
@export var tags: Array[String] = []
@export var modifiers: Array[WeaponModBase] = []
@onready var active_cd_timer: Timer = $ActiveCDTimer
var _player: Player
func _ready() -> void:
_player = get_tree().get_first_node_in_group(GlobalConst.GROUP_PLAYER)
func _on_attack_cd_timer_timeout() -> void:
do_attack()
@@ -76,3 +86,19 @@ func has_property(key: String) -> bool:
if prop.name == key:
return true
return false
func did_crit() -> bool:
var weapon_crit = get_calculated("attack_crit_chance")
var player_crit = _player.player_stats.get_final("crit_chance", _player.modifiers)
return randf() >= 1 - weapon_crit + player_crit
func did_bleed() -> bool:
return randf() >= 1 - bleed_chance
func base_damage() -> Array[Variant]:
var damage = get_calculated("attack_damage")
var is_crit := did_crit()
if is_crit:
damage *= _player.player_stats.get_final("crit_multiplier", _player.modifiers)
return [damage, is_crit]

View File

@@ -8,13 +8,14 @@ const WEAPON_SWORD_PROJECTILE = preload("res://scenes/weapons/weapon_sword_proje
signal projectile_hit(projectile: WeaponSwordProjectile, enemy: EnemyBase)
var _player: Player
func _ready() -> void:
bleed_chance = 0.2
targeting_range_shape.shape.radius = attack_range
projectile_hit.connect(_on_projectile_hit)
_player = get_tree().get_first_node_in_group(GlobalConst.GROUP_PLAYER)
super._ready()
func do_attack() -> void:
@@ -44,13 +45,13 @@ func _do_active() -> void:
func deal_damage(enemy: EnemyBase, damage_mult: float):
var weapon_crit = get_calculated("attack_crit_chance")
var player_crit = _player.player_stats.get_final("crit_chance", _player.modifiers)
var damage = get_calculated("attack_damage")
var is_crit = randf() >= 1 - weapon_crit + player_crit
if is_crit:
damage *= _player.player_stats.get_final("crit_multiplier", _player.modifiers)
enemy.take_damage(damage * damage_mult, is_crit)
var damage_and_crit = base_damage()
# TODO: Fix crit value
enemy.take_damage(damage_and_crit[0], damage_and_crit[1])
if did_bleed():
var bleed = EnemyEffectBleed.new(enemy, damage_and_crit[0], bleed_duration)
bleed.apply(enemy)
func _on_projectile_hit(projectile: WeaponSwordProjectile, enemy: EnemyBase, damage_mult: float):

View File

@@ -5,6 +5,7 @@ extends Node2D
@export var range: float = 200.0
@export var target: Node2D
@export var damage_mult: float = 1.0
@export var bleed_chance: float = 0.2
@export var on_hit_sig: Signal
var _direction: Vector2