diff --git a/Assets/Battle/BattleController.cs b/Assets/Battle/BattleController.cs index 8c6521e..27e4c0a 100644 --- a/Assets/Battle/BattleController.cs +++ b/Assets/Battle/BattleController.cs @@ -97,6 +97,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier private IEnumerator RunBattleRound() { this.state.Clock.AdvanceRound(); + yield return this.RunActivatedTriggers(); this.state.HeroEnergy.Replenish(); this.state.MonsterEnergy.Replenish(); @@ -116,6 +117,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier yield return RunMonsterTurn(); this.state.Clock.AdvanceToStep(RoundStep.EndOfRound); + yield return this.RunActivatedTriggers(); } private IEnumerator RunHeroTurn() { @@ -129,6 +131,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier hero.ResetBlock(); } OnBattleStateChanged(); + yield return this.RunActivatedTriggers(); // Heroes act until they pass while (true) { @@ -142,7 +145,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier // TODO: Implement a stack/queue to resolve triggers in order. // Do this after the card resolution is over to avoid reentraint effects. - this.state.TriggerManager.RunActivatedTriggers(this); + yield return this.RunActivatedTriggers(); CheckState(); OnBattleStateChanged(); } @@ -155,7 +158,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier yield return this.state.PlayArea.UseHeroDefaults(this.state.Heroes, this.state.ParticipantActivity, UseHeroDefault); // TODO: Implement a stack/queue to resolve triggers in order. // Do this after the card resolution is over to avoid reentraint effects. - this.state.TriggerManager.RunActivatedTriggers(this); + yield return this.RunActivatedTriggers(); CheckState(); OnBattleStateChanged(); @@ -169,6 +172,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier } this.state.Clock.AdvanceToStep(RoundStep.EndOfHeroTurn); + yield return this.RunActivatedTriggers(); OnBattleStateChanged(); this.monsterIntentions.PauseIntentions(); @@ -184,6 +188,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier monster.ResetBlock(); } OnBattleStateChanged(); + yield return this.RunActivatedTriggers(); yield return new WaitForSeconds(0.5f); // Monsters play an emotion @@ -195,7 +200,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier // TODO: Implement a stack/queue to resolve triggers in order. // Do this after the card resolution is over to avoid reentraint effects. - this.state.TriggerManager.RunActivatedTriggers(this); + yield return this.RunActivatedTriggers(); CheckState(); OnBattleStateChanged(); } @@ -213,7 +218,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier // TODO: Implement a stack/queue to resolve triggers in order. // Do this after the card resolution is over to avoid reentraint effects. - this.state.TriggerManager.RunActivatedTriggers(this); + yield return this.RunActivatedTriggers(); CheckState(); OnBattleStateChanged(); } @@ -231,6 +236,12 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier this.state.Clock.AdvanceToStep(RoundStep.EndOfMonsterTurn); OnBattleStateChanged(); + yield return this.RunActivatedTriggers(); + } + + private IEnumerator RunActivatedTriggers() { + yield return this.state.TriggerManager.RunActivatedTriggers( + this, this.state, this.battlePlayerControls); } private MonsterCard FirstMonsterActionToPlay() { diff --git a/Assets/Battle/CardsHeroes/MolotovCocktailHCard.cs b/Assets/Battle/CardsHeroes/MolotovCocktailHCard.cs new file mode 100644 index 0000000..2b7b720 --- /dev/null +++ b/Assets/Battle/CardsHeroes/MolotovCocktailHCard.cs @@ -0,0 +1,30 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class MolotovCocktailHCard : HeroCard +{ + public MolotovCocktailHCard(BattleParticipant owner) + : base(owner, HCardId.MolotovCocktail, "Molotov Cocktail", 3, CardType.Enchantment, + "At start of hero turn, deal 1 damage to all enemies.") { + } + + public override IEnumerator Use(IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { + StepTrigger trigger = new StepTrigger( + RoundStep.StartOfHeroTurn, + this.AtStartOfHeroTurn, + TriggerExpiration.Never, + TriggerRepetition.Multiple); + effectApplier.Apply(new ArmStepTriggerEffect(trigger)); + yield break; + } + + private IEnumerator AtStartOfHeroTurn(IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { + yield return new WaitForSeconds(0.3f); + MassDamageEffect damageEffect = new MassDamageEffect(TeamChoice.Monsters, 1); + effectApplier.Apply(damageEffect); + yield break; + } +} diff --git a/Assets/Battle/CardsHeroes/MolotovCocktailHCard.cs.meta b/Assets/Battle/CardsHeroes/MolotovCocktailHCard.cs.meta new file mode 100644 index 0000000..13f7bc1 --- /dev/null +++ b/Assets/Battle/CardsHeroes/MolotovCocktailHCard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e7662730dc6ed8643813c916a0f0372f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/CardsHeroes/ScarringHCard.cs b/Assets/Battle/CardsHeroes/ScarringHCard.cs index fa171f7..bfdacae 100644 --- a/Assets/Battle/CardsHeroes/ScarringHCard.cs +++ b/Assets/Battle/CardsHeroes/ScarringHCard.cs @@ -14,15 +14,18 @@ public class ScarringHCard : HeroCard effectApplier.Apply(new BlockEffect(this.owner, 4)); DamageTrigger trigger = new DamageTrigger( new List() {this.owner}, - this.NotifyDamageDealt, + this.WhenDamageDealt, TriggerExpiration.StartOfNextHeroTurn, TriggerRepetition.Once); effectApplier.Apply(new ArmDamageTriggerEffect(trigger)); yield break; } - public void NotifyDamageDealt(IBattleEffectApplier effectApplier) { + public IEnumerator WhenDamageDealt(IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { + yield return new WaitForSeconds(0.3f); IncreaseMaxHPEffect effect = new IncreaseMaxHPEffect(this.owner, 1); effectApplier.Apply(effect); + yield break; } } diff --git a/Assets/Battle/CheatBattle.cs b/Assets/Battle/CheatBattle.cs index 7555169..3503ece 100644 --- a/Assets/Battle/CheatBattle.cs +++ b/Assets/Battle/CheatBattle.cs @@ -22,11 +22,11 @@ public class CheatBattle: MonoBehaviour HCardId.CrashingPunch, HCardId.BlindFury, HCardId.Cover, - HCardId.Cover, HCardId.Scarring, HCardId.OilOfSharpness, HCardId.IronskinDraught, + HCardId.MolotovCocktail, HCardId.LightningHatchet, HCardId.Thunderstorm, @@ -35,8 +35,8 @@ public class CheatBattle: MonoBehaviour int[] hCardOwnerIndexes = new int[16] { 0, 0, 1, 1, 2, 2, - 0, 0, 0, 0, 0, - 1, 1, + 0, 0, 0, 0, + 1, 1, 1, 2, 2, 2, }; diff --git a/Assets/Battle/EffectResolver.cs b/Assets/Battle/EffectResolver.cs index 71931d7..0330c9c 100644 --- a/Assets/Battle/EffectResolver.cs +++ b/Assets/Battle/EffectResolver.cs @@ -176,7 +176,11 @@ public class EffectResolver : IBattleEffectResolver } } - public void ArmDamageTrigger(DamageTrigger damageTrigger) { - this.state.TriggerManager.ArmDamageTrigger(damageTrigger); + public void ArmDamageTrigger(DamageTrigger trigger) { + this.state.TriggerManager.ArmDamageTrigger(trigger); + } + + public void ArmStepTrigger(StepTrigger trigger) { + this.state.TriggerManager.ArmStepTrigger(trigger); } } diff --git a/Assets/Battle/Effects/ArmStepTriggerEffect.cs b/Assets/Battle/Effects/ArmStepTriggerEffect.cs new file mode 100644 index 0000000..6b728f6 --- /dev/null +++ b/Assets/Battle/Effects/ArmStepTriggerEffect.cs @@ -0,0 +1,16 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class ArmStepTriggerEffect : IBattleEffect +{ + private StepTrigger trigger; + + public ArmStepTriggerEffect(StepTrigger trigger) { + this.trigger = trigger; + } + + public void Apply(IBattleEffectResolver resolver) { + resolver.ArmStepTrigger(this.trigger); + } +} diff --git a/Assets/Battle/Effects/ArmStepTriggerEffect.cs.meta b/Assets/Battle/Effects/ArmStepTriggerEffect.cs.meta new file mode 100644 index 0000000..3bc5981 --- /dev/null +++ b/Assets/Battle/Effects/ArmStepTriggerEffect.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b25e3128bcc255146b46c32c41bd7a2b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/HeroCardDatabase.cs b/Assets/Battle/HeroCardDatabase.cs index 4fdee32..b5f384b 100644 --- a/Assets/Battle/HeroCardDatabase.cs +++ b/Assets/Battle/HeroCardDatabase.cs @@ -48,6 +48,8 @@ public class HeroCardDatabase : CardDatabase return typeof(MeditateHCard); case HCardId.LightningHatchet: return typeof(LightningHatchetHCard); + case HCardId.MolotovCocktail: + return typeof(MolotovCocktailHCard); case HCardId.IronskinDraught: return typeof(IronskinDraughtHCard); case HCardId.SwordSlash: diff --git a/Assets/Battle/IBattleEffectResolver.cs b/Assets/Battle/IBattleEffectResolver.cs index 8ecd9ff..5993b36 100644 --- a/Assets/Battle/IBattleEffectResolver.cs +++ b/Assets/Battle/IBattleEffectResolver.cs @@ -19,5 +19,6 @@ public interface IBattleEffectResolver { void Rotate(RotateEffect effect); void SetupDefault(DefaultEffect effect); - void ArmDamageTrigger(DamageTrigger damageTrigger); + void ArmDamageTrigger(DamageTrigger trigger); + void ArmStepTrigger(StepTrigger trigger); } diff --git a/Assets/Battle/Trigger.cs b/Assets/Battle/Trigger.cs index 3ba9341..cbc5556 100644 --- a/Assets/Battle/Trigger.cs +++ b/Assets/Battle/Trigger.cs @@ -1,3 +1,5 @@ +using System.Collections; + public enum TriggerExpiration { Never, StartOfNextHeroTurn, @@ -22,9 +24,15 @@ public class Trigger { this.repetition = repetition; } - public void Run(IBattleEffectApplier effectApplier) { - if (this.expired) return; - callback(effectApplier); + public IEnumerator Run(IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, + BattlePlayerControls playerControls) { + if (this.expired) { + yield break; + } + + yield return callback(effectApplier, viewpoint, playerControls); + if (this.repetition == TriggerRepetition.Once) { this.expired = true; } diff --git a/Assets/Battle/TriggerManager.cs b/Assets/Battle/TriggerManager.cs index c8362a5..3498b04 100644 --- a/Assets/Battle/TriggerManager.cs +++ b/Assets/Battle/TriggerManager.cs @@ -6,6 +6,7 @@ public class TriggerManager { private List activatedTriggers = new List(); private List damageTriggers = new List(); + private List stepTriggers = new List(); public TriggerManager(BattleClock clock) { clock.OnTimeChanged += this.NotifyTimeChanged; @@ -14,6 +15,13 @@ public class TriggerManager private void NotifyTimeChanged(BattleTime now) { if (now.RoundStep == RoundStep.StartOfHeroTurn) { this.damageTriggers.RemoveAll(t => t.Expiration == TriggerExpiration.StartOfNextHeroTurn); + this.stepTriggers.RemoveAll(t => t.Expiration == TriggerExpiration.StartOfNextHeroTurn); + } + + foreach (StepTrigger st in this.stepTriggers) { + if (st.IsTriggeredBy(now)) { + EnqueueActivatedTrigger(st); + } } } @@ -33,17 +41,23 @@ public class TriggerManager } } - public void ArmDamageTrigger(DamageTrigger damageTrigger) { - this.damageTriggers.Add(damageTrigger); + public void ArmDamageTrigger(DamageTrigger trigger) { + this.damageTriggers.Add(trigger); + } + + public void ArmStepTrigger(StepTrigger trigger) { + this.stepTriggers.Add(trigger); } private void EnqueueActivatedTrigger(Trigger trigger) { this.activatedTriggers.Add(trigger); } - public void RunActivatedTriggers(IBattleEffectApplier effectApplier) { + public IEnumerator RunActivatedTriggers(IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, + BattlePlayerControls playerControls) { foreach (Trigger t in this.activatedTriggers) { - t.Run(effectApplier); + yield return t.Run(effectApplier, viewpoint, playerControls); } this.activatedTriggers.Clear(); diff --git a/Assets/Battle/TriggeredEffect.cs b/Assets/Battle/TriggeredEffect.cs index c6d55c3..bf50511 100644 --- a/Assets/Battle/TriggeredEffect.cs +++ b/Assets/Battle/TriggeredEffect.cs @@ -1 +1,6 @@ -public delegate void TriggeredEffect(IBattleEffectApplier effectApplier); \ No newline at end of file +using System.Collections; + +public delegate IEnumerator TriggeredEffect( + IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, + BattlePlayerControls playerControls); \ No newline at end of file diff --git a/Assets/Battle/Triggers/StepTrigger.cs b/Assets/Battle/Triggers/StepTrigger.cs new file mode 100644 index 0000000..ef63fca --- /dev/null +++ b/Assets/Battle/Triggers/StepTrigger.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +public class StepTrigger : Trigger { + + private RoundStep step; + + public StepTrigger(RoundStep step, TriggeredEffect callback, + TriggerExpiration expiration, TriggerRepetition repetition) + : base(callback, expiration, repetition) { + this.step = step; + } + + public bool IsTriggeredBy(BattleTime time) { + return time.RoundStep == this.step; + } +} \ No newline at end of file diff --git a/Assets/Battle/Triggers/StepTrigger.cs.meta b/Assets/Battle/Triggers/StepTrigger.cs.meta new file mode 100644 index 0000000..24a798d --- /dev/null +++ b/Assets/Battle/Triggers/StepTrigger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f369bcd44b59b1345a33d76373db6a21 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/CardArt/HeroMolotovCocktail.jpg b/Assets/Resources/CardArt/HeroMolotovCocktail.jpg new file mode 100644 index 0000000..0175acf Binary files /dev/null and b/Assets/Resources/CardArt/HeroMolotovCocktail.jpg differ diff --git a/Assets/Resources/CardArt/HeroMolotovCocktail.jpg.meta b/Assets/Resources/CardArt/HeroMolotovCocktail.jpg.meta new file mode 100644 index 0000000..a6b29e0 --- /dev/null +++ b/Assets/Resources/CardArt/HeroMolotovCocktail.jpg.meta @@ -0,0 +1,92 @@ +fileFormatVersion: 2 +guid: 58b4b0ee9283648499d9b692031c0953 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: