diff --git a/Classes/Relics/RelicEffect.cs b/Classes/Relics/RelicEffect.cs index 93ade4f0..c5a52109 100644 --- a/Classes/Relics/RelicEffect.cs +++ b/Classes/Relics/RelicEffect.cs @@ -5,23 +5,32 @@ public partial class RelicEffect : IBattleEvent { private BattleEffectTrigger Trigger { get; set; } - public int BaseValue; - private Action OnRelicEffect; + private int _baseValue; + public int Value; + private Action _onRelicEffect; + private bool _effectPersists = false; public RelicEffect( BattleEffectTrigger trigger, int val, - Action onRelicEffect + Action onRelicEffect ) { - BaseValue = val; + _baseValue = val; + Value = _baseValue; Trigger = trigger; - OnRelicEffect = onRelicEffect; + _onRelicEffect = onRelicEffect; + } + + public void OnBattleEnd() + { + if (!_effectPersists) + Value = _baseValue; } public void OnTrigger(BattleDirector battleDirector) { - OnRelicEffect(battleDirector, BaseValue); + _onRelicEffect(battleDirector, this, Value); } public BattleEffectTrigger GetTrigger() diff --git a/Globals/Scribe.cs b/Globals/Scribe.cs index bf0c2f09..16c87a9f 100644 --- a/Globals/Scribe.cs +++ b/Globals/Scribe.cs @@ -94,7 +94,7 @@ public partial class Scribe : Node new RelicEffect( BattleEffectTrigger.OnPickup, 10, - (director, val) => + (director, self, val) => { StageProducer.PlayerStats.MaxHealth += val; StageProducer.PlayerStats.CurrentHealth += val; @@ -111,7 +111,7 @@ public partial class Scribe : Node new RelicEffect( BattleEffectTrigger.NotePlaced, 2, - (director, val) => + (director, self, val) => { director.Player.Heal(val); } @@ -126,10 +126,11 @@ public partial class Scribe : Node { new RelicEffect( BattleEffectTrigger.OnLoop, - 2, - (director, val) => + 1, + (director, self, val) => { director.NotePlacementBar.IncreaseBonusMult(val); + self.Value++; } ), } @@ -143,9 +144,10 @@ public partial class Scribe : Node new RelicEffect( BattleEffectTrigger.OnLoop, 20, - (director, val) => + (director, self, val) => { director.NotePlacementBar.IncreaseCharge(val); + self.Value++; } ), } diff --git a/scenes/BattleDirector/scripts/BattleDirector.cs b/scenes/BattleDirector/scripts/BattleDirector.cs index d5a6bfa4..d59f3155 100644 --- a/scenes/BattleDirector/scripts/BattleDirector.cs +++ b/scenes/BattleDirector/scripts/BattleDirector.cs @@ -85,6 +85,7 @@ public override void _Ready() .Instantiate(); AddChild(Enemy); Enemy.Defeated += CheckBattleStatus; + AddEnemyEffects(); CM.PrepChart(_curSong); CD.Prep(); @@ -200,20 +201,22 @@ private void CheckBattleStatus(PuppetTemplate puppet) { if (puppet == Player) { - LostBattle(); + BattleLost(); return; } + else if (puppet == Enemy) + BattleWon(); //will have to adjust this to account for when we have multiple enemies at once + } - //will have to adjust this to account for when we have multiple enemies at once - if (puppet == Enemy) - { - Audio.StreamPaused = true; - GD.Print("Enemy is dead"); - ShowRewardSelection(3); - } + private void BattleWon() + { + Audio.StreamPaused = true; + GD.Print("Enemy is dead"); + CleanUpRelics(); + ShowRewardSelection(3); } - private void LostBattle() + private void BattleLost() { GD.Print("Player is Dead"); Audio.StreamPaused = true; @@ -241,21 +244,45 @@ private void ShowRewardSelection(int amount) private delegate void ChartLoopHandler(BattleDirector BD); private event ChartLoopHandler ChartLooped; + private void AddEvent(IBattleEvent bEvent) + { + switch (bEvent.GetTrigger()) //TODO: Look into a way to get eventhandler from string + { + case BattleEffectTrigger.NotePlaced: + NotePlaced += bEvent.OnTrigger; + break; + case BattleEffectTrigger.OnLoop: + ChartLooped += bEvent.OnTrigger; + break; + } + } + + private void AddEnemyEffects() + { + foreach (var effect in Enemy.GetBattleEvents()) + { + AddEvent(effect); + } + } + private void EventizeRelics() { foreach (var relic in Player.Stats.CurRelics) { foreach (var effect in relic.Effects) { - switch (effect.GetTrigger()) //TODO: Look into a way to get eventhandler from string - { - case BattleEffectTrigger.NotePlaced: - NotePlaced += effect.OnTrigger; - break; - case BattleEffectTrigger.OnLoop: - ChartLooped += effect.OnTrigger; - break; - } + AddEvent(effect); + } + } + } + + private void CleanUpRelics() + { + foreach (var relic in Player.Stats.CurRelics) + { + foreach (var effect in relic.Effects) + { + effect.OnBattleEnd(); } } } diff --git a/scenes/Puppets/Enemies/BossBlood/P_BossBlood.cs b/scenes/Puppets/Enemies/BossBlood/P_BossBlood.cs index 8c19a9b2..0ab6b111 100644 --- a/scenes/Puppets/Enemies/BossBlood/P_BossBlood.cs +++ b/scenes/Puppets/Enemies/BossBlood/P_BossBlood.cs @@ -1,4 +1,6 @@ using System; +using System.Linq; +using FunkEngine; using Godot; public partial class P_BossBlood : EnemyPuppet @@ -13,5 +15,18 @@ public override void _Ready() enemTween.SetEase(Tween.EaseType.In); enemTween.SetLoops(); enemTween.Play(); + + _battleEvents = new EnemyEffect[] + { + new EnemyEffect( + this, + BattleEffectTrigger.OnLoop, + 5, + (director, eff, val) => + { + eff.Owner.Heal(val); + } + ), + }; } } diff --git a/scenes/Puppets/Enemies/EnemyEffect.cs b/scenes/Puppets/Enemies/EnemyEffect.cs new file mode 100644 index 00000000..45a9531b --- /dev/null +++ b/scenes/Puppets/Enemies/EnemyEffect.cs @@ -0,0 +1,36 @@ +using System; +using FunkEngine; +using Godot; + +public partial class EnemyEffect : IBattleEvent +{ + private BattleEffectTrigger Trigger { get; set; } + public EnemyPuppet Owner; + private int _baseValue; + public int Value; + private Action _onEnemyEffect; + + public EnemyEffect( + EnemyPuppet owner, + BattleEffectTrigger trigger, + int val, + Action onEnemyEffect + ) + { + Owner = owner; + _baseValue = val; + Value = _baseValue; + Trigger = trigger; + _onEnemyEffect = onEnemyEffect; + } + + public void OnTrigger(BattleDirector battleDirector) + { + _onEnemyEffect(battleDirector, this, Value); + } + + public BattleEffectTrigger GetTrigger() + { + return Trigger; + } +} diff --git a/scenes/Puppets/Enemies/EnemyPuppet.cs b/scenes/Puppets/Enemies/EnemyPuppet.cs index 97c39da9..e6dd5f28 100644 --- a/scenes/Puppets/Enemies/EnemyPuppet.cs +++ b/scenes/Puppets/Enemies/EnemyPuppet.cs @@ -1,7 +1,14 @@ using System; +using FunkEngine; using Godot; public partial class EnemyPuppet : PuppetTemplate { //TODO: What do enemies need? + protected EnemyEffect[] _battleEvents = Array.Empty(); + + public virtual EnemyEffect[] GetBattleEvents() + { + return _battleEvents; + } }