using Chickensoft.AutoInject; using Chickensoft.Collections; using Chickensoft.GodotNodeInterfaces; using Chickensoft.Introspection; using Godot; using System; using System.Linq; using Zennysoft.Game.Ma; using Zennysoft.Ma.Adapter; [Meta(typeof(IAutoNode))] public partial class LoadNextLevel : Control, IFloorClearMenu { public override void _Notification(int what) => this.Notify(what); [Dependency] protected IPlayer _player => this.DependOn(() => GetParent().GetChildren().OfType().Single()); [Dependency] public IMap _map => this.DependOn(); [Node] public IAnimationPlayer AnimationPlayer { get; set; } = default!; [Node] public Button ContinueButton { get; set; } [Node] public Button ExitButton { get; set; } [Node] public Label LevelLabel { get; set; } [Node] public Label EXPLabel { get; set; } [Node] public Label HPLabel { get; set; } [Node] public Label VTLabel { get; set; } [Node] public Label ATKLabel { get; set; } [Node] public Label DEFLabel { get; set; } [Node] public Label FloorNumber { get; set; } public void FadeIn() => AnimationPlayer.Play("fade_in"); public void FadeOut() => AnimationPlayer.Play("fade_out"); public event Action GoToNextFloor; public event Action Exit; public event Action TransitionCompleted; private bool _fadingIn = false; public void OnResolved() { EnableUISync(); AnimationPlayer.AnimationFinished += AnimationPlayer_AnimationFinished; AnimationPlayer.AnimationStarted += AnimationPlayer_AnimationStarted; ContinueButton.Pressed += ContinueButton_Pressed; ExitButton.Pressed += ExitButton_Pressed; } private void CurrentFloorNumber_Sync(int _) => FloorNumber.Text = _map.NextFloorDisplayString; private void EquipmentComponent_EquipmentChanged(IEquipableItem obj) { Attack_Sync(0); Defense_Sync(0); } private void Attack_Sync(int _) => ATKLabel.Text = $"{_player.AttackComponent.CurrentAttack.Value}/{_player.AttackComponent.MaximumAttack.Value}+{_player.EquipmentComponent.BonusAttack}"; private void Defense_Sync(int _) => DEFLabel.Text = $"{_player.DefenseComponent.CurrentDefense.Value}/{_player.DefenseComponent.MaximumDefense.Value}+{_player.EquipmentComponent.BonusDefense}"; private void HP_Sync(int _) => HPLabel.Text = $"{_player.HealthComponent.CurrentHP.Value}/{_player.HealthComponent.MaximumHP.Value}"; private void VT_Sync(int _) => VTLabel.Text = $"{_player.VTComponent.CurrentVT.Value}/{_player.VTComponent.MaximumVT.Value}"; private void Exp_Sync(int _) => EXPLabel.Text = $"{_player.ExperiencePointsComponent.CurrentExp.Value}/{_player.ExperiencePointsComponent.ExpToNextLevel.Value}"; private void Level_Sync(int _) => LevelLabel.Text = _player.ExperiencePointsComponent.Level.Value.ToString("D2"); private void ExitButton_Pressed() { ContinueButton.FocusMode = FocusModeEnum.None; ExitButton.FocusMode = FocusModeEnum.None; SfxDatabase.Instance.Play(SoundEffect.SelectUI); FadeOut(); Exit?.Invoke(); } private void ContinueButton_Pressed() { ContinueButton.FocusMode = FocusModeEnum.None; ExitButton.FocusMode = FocusModeEnum.None; SfxDatabase.Instance.Play(SoundEffect.SelectUI); GoToNextFloor?.Invoke(); } private void AnimationPlayer_AnimationStarted(StringName animName) { if (animName == "fade_in") { _fadingIn = true; ContinueButton.FocusMode = FocusModeEnum.None; ExitButton.FocusMode = FocusModeEnum.None; } if (animName == "fade_out") { DisableUISync(); _fadingIn = false; ContinueButton.CallDeferred(MethodName.ReleaseFocus); } } private void AnimationPlayer_AnimationFinished(StringName animName) { if (animName == "fade_in") { ContinueButton.CallDeferred(MethodName.GrabFocus); _fadingIn = false; ContinueButton.FocusMode = FocusModeEnum.All; ExitButton.FocusMode = FocusModeEnum.All; } if (animName == "fade_out") { EnableUISync(); TransitionCompleted?.Invoke(); } } private void EnableUISync() { _player.ExperiencePointsComponent.Level.Sync += Level_Sync; _player.ExperiencePointsComponent.CurrentExp.Sync += Exp_Sync; _player.ExperiencePointsComponent.ExpToNextLevel.Sync += Exp_Sync; _player.HealthComponent.CurrentHP.Sync += HP_Sync; _player.HealthComponent.MaximumHP.Sync += HP_Sync; _player.VTComponent.CurrentVT.Sync += VT_Sync; _player.VTComponent.MaximumVT.Sync += VT_Sync; _player.AttackComponent.CurrentAttack.Sync += Attack_Sync; _player.AttackComponent.MaximumAttack.Sync += Attack_Sync; _player.DefenseComponent.CurrentDefense.Sync += Defense_Sync; _player.DefenseComponent.MaximumDefense.Sync += Defense_Sync; _player.EquipmentComponent.EquipmentChanged += EquipmentComponent_EquipmentChanged; _map.CurrentFloorNumber.Sync += CurrentFloorNumber_Sync; } private void DisableUISync() { _player.ExperiencePointsComponent.Level.Sync -= Level_Sync; _player.ExperiencePointsComponent.CurrentExp.Sync -= Exp_Sync; _player.ExperiencePointsComponent.ExpToNextLevel.Sync -= Exp_Sync; _player.HealthComponent.CurrentHP.Sync -= HP_Sync; _player.HealthComponent.MaximumHP.Sync -= HP_Sync; _player.VTComponent.CurrentVT.Sync -= VT_Sync; _player.VTComponent.MaximumVT.Sync -= VT_Sync; _player.AttackComponent.CurrentAttack.Sync -= Attack_Sync; _player.AttackComponent.MaximumAttack.Sync -= Attack_Sync; _player.DefenseComponent.CurrentDefense.Sync -= Defense_Sync; _player.DefenseComponent.MaximumDefense.Sync -= Defense_Sync; _player.EquipmentComponent.EquipmentChanged -= EquipmentComponent_EquipmentChanged; _map.CurrentFloorNumber.Sync -= CurrentFloorNumber_Sync; } }