using Godot; public partial class GodCircuit : Node3D { [Export] private AnimationPlayer _animationPlayer; [Export] private Timer _attackTimer; [Signal] public delegate void OnEnemyBossHitEventHandler(long damage); [Signal] public delegate void OnGameEndingEventHandler(); [Signal] public delegate void DestroyRemainingOrbsEventHandler(); private void OnHit(Node3D node) { if (node is Character character && character.HasMethod(Character.MethodName.OnHit)) { GD.Print("Player hit: " + character.Name); character.Call(Character.MethodName.OnHit, node); } else { var hpComponent = GetNode("HP Component"); if (hpComponent.CurrentHP > 0) { GD.Print("Hit"); _animationPlayer.Play("OnHit"); hpComponent.TakeDamage(800000); EmitSignal(SignalName.OnEnemyBossHit, hpComponent.CurrentHP); if (hpComponent.CurrentHP <= 0) { _attackTimer.Stop(); EmitSignal(SignalName.DestroyRemainingOrbs); _animationPlayer.Play("OnDeath"); _animationPlayer.AnimationFinished += OnGameFinished; } } } } private void OnBossOrbDestroyed() { var hpComponent = GetNode("HP Component"); _animationPlayer.Play("OnHit"); hpComponent.TakeDamage(30000000); EmitSignal(SignalName.OnEnemyBossHit, hpComponent.CurrentHP); if (hpComponent.CurrentHP <= 0) hpComponent.CurrentHP = 1; } private void OnGameFinished(StringName animationName) { QueueFree(); EmitSignal(SignalName.OnGameEnding); } }