refactor
This commit is contained in:
@@ -1,53 +1,38 @@
|
||||
extends Node
|
||||
|
||||
enum Element { NONE, FIRE }
|
||||
@onready var effect_system: Node = get_node("../EffectSystem")
|
||||
|
||||
var applied_elements: Dictionary = {}
|
||||
var _applied: Dictionary = {}
|
||||
|
||||
func _ready() -> void:
|
||||
EventBus.element_damage_dealt.connect(_on_element_damage_dealt)
|
||||
EventBus.entity_died.connect(_on_entity_died)
|
||||
EventBus.effect_expired.connect(_on_effect_expired)
|
||||
EventBus.damage_requested.connect(_on_damage_requested)
|
||||
EventBus.entity_died.connect(_on_died)
|
||||
|
||||
func _on_element_damage_dealt(attacker: Node, target: Node, _amount: float, element: int) -> void:
|
||||
func _on_damage_requested(attacker: Node, target: Node, _amount: float, element: int) -> void:
|
||||
if not multiplayer.is_server() and multiplayer.multiplayer_peer != null:
|
||||
return
|
||||
if element == Element.NONE:
|
||||
return
|
||||
if not target.is_in_group("enemies") and not target.is_in_group("portals"):
|
||||
if not is_instance_valid(target):
|
||||
return
|
||||
var current: int = applied_elements.get(target, Element.NONE)
|
||||
if current != Element.NONE and current != element:
|
||||
_trigger_reaction(attacker, target, current, element)
|
||||
if not (target.is_in_group("enemies") or target.is_in_group("portals") or target.is_in_group("gates")):
|
||||
return
|
||||
_apply_element(attacker, target, element)
|
||||
apply_element(attacker, target, element)
|
||||
|
||||
func _apply_element(source: Node, target: Node, element: int) -> void:
|
||||
applied_elements[target] = element
|
||||
func apply_element(source: Node, target: Node, element: int) -> void:
|
||||
if element == Element.NONE or not is_instance_valid(target):
|
||||
return
|
||||
_applied[target] = element
|
||||
EventBus.element_applied.emit(target, element)
|
||||
match element:
|
||||
Element.FIRE:
|
||||
_apply_fire(source, target)
|
||||
if element == Element.FIRE:
|
||||
var dot := Effect.new()
|
||||
dot.effect_name = &"fire_dot"
|
||||
dot.type = Effect.Type.DOT
|
||||
dot.value = 3.0
|
||||
dot.duration = 6.0
|
||||
dot.tick_interval = 2.0
|
||||
dot.element = Element.FIRE
|
||||
effect_system.apply(target, dot, source)
|
||||
|
||||
func _apply_fire(source: Node, target: Node) -> void:
|
||||
var fire_dot := Effect.new()
|
||||
fire_dot.effect_name = "Burning"
|
||||
fire_dot.type = Effect.Type.DEBUFF
|
||||
fire_dot.stat = "damage"
|
||||
fire_dot.value = 3.0
|
||||
fire_dot.duration = 6.0
|
||||
fire_dot.is_multiplier = false
|
||||
fire_dot.tick_interval = 2.0
|
||||
fire_dot.element = Element.FIRE
|
||||
EventBus.effect_requested.emit(target, fire_dot, source)
|
||||
|
||||
func _trigger_reaction(_attacker: Node, target: Node, _elem_a: int, _elem_b: int) -> void:
|
||||
applied_elements.erase(target)
|
||||
EventBus.element_reaction.emit(target, _elem_a, _elem_b, "")
|
||||
|
||||
func _on_entity_died(entity: Node) -> void:
|
||||
applied_elements.erase(entity)
|
||||
|
||||
func _on_effect_expired(target: Node, effect: Effect) -> void:
|
||||
if effect.element != Element.NONE:
|
||||
var current: int = applied_elements.get(target, Element.NONE)
|
||||
if current == effect.element:
|
||||
applied_elements.erase(target)
|
||||
func _on_died(entity: Node) -> void:
|
||||
_applied.erase(entity)
|
||||
|
||||
Reference in New Issue
Block a user