From 31cb8fe4c0ad9c0c0c02416235a3ff34fc06eff7 Mon Sep 17 00:00:00 2001 From: henriquenakashima Date: Fri, 9 Oct 2020 01:43:37 -0400 Subject: [PATCH] Implement OilOfSharpness --- Assets/Battle/BaseCard.cs | 4 +- Assets/Battle/BattleClock.cs | 29 ++++++ Assets/Battle/BattleClock.cs.meta | 11 +++ Assets/Battle/BattleController.cs | 51 +++++++++- Assets/Battle/BattleParticipant.cs | 4 + Assets/Battle/BattleTime.cs | 24 +++++ Assets/Battle/BattleTime.cs.meta | 11 +++ Assets/Battle/BuffDuration.cs | 3 + Assets/Battle/BuffDuration.cs.meta | 11 +++ Assets/Battle/BuffManager.cs | 64 ++++++++++++ Assets/Battle/BuffManager.cs.meta | 11 +++ Assets/Battle/BuffType.cs | 3 + Assets/Battle/BuffType.cs.meta | 11 +++ Assets/Battle/CardType.cs | 1 + Assets/Battle/CardsHeroes/BlindFuryHCard.cs | 2 +- .../Battle/CardsHeroes/CrashingPunchHCard.cs | 2 +- Assets/Battle/CardsHeroes/LeadShotHCard.cs | 2 +- .../CardsHeroes/LightningHatchetHCard.cs | 2 +- .../CardsHeroes/LightningStrikeHCard.cs | 2 +- .../Battle/CardsHeroes/OilOfSharpnessHCard.cs | 26 +++++ .../CardsHeroes/OilOfSharpnessHCard.cs.meta | 11 +++ Assets/Battle/CardsHeroes/SwordSlashHCard.cs | 2 +- .../Battle/CardsMonsters/GolemBerserkMCard.cs | 4 +- .../Battle/CardsMonsters/GolemChargeMCard.cs | 2 +- Assets/Battle/CardsMonsters/GolemFistMCard.cs | 2 +- .../CardsMonsters/QuickSwiftDeathMCard.cs | 2 +- .../Battle/CardsMonsters/VampireFangsMCard.cs | 2 +- Assets/Battle/CheatBattle.cs | 14 ++- Assets/Battle/DefaultHeroCard.cs | 13 +++ Assets/Battle/DefaultHeroCard.cs.meta | 11 +++ Assets/Battle/DefaultsManager.cs | 42 ++++++++ Assets/Battle/DefaultsManager.cs.meta | 11 +++ .../Battle/Effects/BuffParticipantEffect.cs | 27 +++++ .../Effects/BuffParticipantEffect.cs.meta | 11 +++ Assets/Battle/Effects/DealDamageEffect.cs | 5 +- Assets/Battle/Effects/DefaultEffect.cs | 19 ++++ Assets/Battle/Effects/DefaultEffect.cs.meta | 11 +++ Assets/Battle/HeroCardDatabase.cs | 3 + Assets/Battle/IBattleEffectResolver.cs | 2 + Assets/Battle/ParticipantActivity.cs | 30 ++++++ Assets/Battle/ParticipantActivity.cs.meta | 11 +++ Assets/Battle/PlayArea.cs | 20 ++++ .../Resources/CardArt/HeroOilOfSharpness.jpg | Bin 0 -> 39668 bytes .../CardArt/HeroOilOfSharpness.jpg.meta | 92 ++++++++++++++++++ TODO.txt | 4 + 45 files changed, 604 insertions(+), 21 deletions(-) create mode 100644 Assets/Battle/BattleClock.cs create mode 100644 Assets/Battle/BattleClock.cs.meta create mode 100644 Assets/Battle/BattleTime.cs create mode 100644 Assets/Battle/BattleTime.cs.meta create mode 100644 Assets/Battle/BuffDuration.cs create mode 100644 Assets/Battle/BuffDuration.cs.meta create mode 100644 Assets/Battle/BuffManager.cs create mode 100644 Assets/Battle/BuffManager.cs.meta create mode 100644 Assets/Battle/BuffType.cs create mode 100644 Assets/Battle/BuffType.cs.meta create mode 100644 Assets/Battle/CardsHeroes/OilOfSharpnessHCard.cs create mode 100644 Assets/Battle/CardsHeroes/OilOfSharpnessHCard.cs.meta create mode 100644 Assets/Battle/DefaultHeroCard.cs create mode 100644 Assets/Battle/DefaultHeroCard.cs.meta create mode 100644 Assets/Battle/DefaultsManager.cs create mode 100644 Assets/Battle/DefaultsManager.cs.meta create mode 100644 Assets/Battle/Effects/BuffParticipantEffect.cs create mode 100644 Assets/Battle/Effects/BuffParticipantEffect.cs.meta create mode 100644 Assets/Battle/Effects/DefaultEffect.cs create mode 100644 Assets/Battle/Effects/DefaultEffect.cs.meta create mode 100644 Assets/Battle/ParticipantActivity.cs create mode 100644 Assets/Battle/ParticipantActivity.cs.meta create mode 100644 Assets/Resources/CardArt/HeroOilOfSharpness.jpg create mode 100644 Assets/Resources/CardArt/HeroOilOfSharpness.jpg.meta diff --git a/Assets/Battle/BaseCard.cs b/Assets/Battle/BaseCard.cs index a1c2062..7285421 100644 --- a/Assets/Battle/BaseCard.cs +++ b/Assets/Battle/BaseCard.cs @@ -33,6 +33,8 @@ public abstract class BaseCard return "Skill"; case CardType.Enchantment: return "Enchantment"; + case CardType.Default: + return "Default"; default: throw new System.ArgumentException("CardType unknown", "cardType"); } @@ -40,7 +42,7 @@ public abstract class BaseCard public string GetEffectText() {return this.effectText;} public bool IsPermanent() { - return this.type == CardType.Enchantment; + return this.type == CardType.Enchantment || this.type == CardType.Default; } public bool IsEphemeral() { diff --git a/Assets/Battle/BattleClock.cs b/Assets/Battle/BattleClock.cs new file mode 100644 index 0000000..a2d067b --- /dev/null +++ b/Assets/Battle/BattleClock.cs @@ -0,0 +1,29 @@ +public class BattleClock { + public delegate void TimeChangedAction(BattleTime timeNow); + public event TimeChangedAction OnTimeChanged; + + private int mRoundNumber; + private RoundStep mStep; + + public BattleClock() { + mRoundNumber = 0; + mStep = RoundStep.None; + } + + public void AdvanceRound() { + mRoundNumber++; + mStep = RoundStep.StartOfRound; + TriggerOnTimeChanged(); + } + + public void AdvanceToStep(RoundStep step) { + mStep = step; + TriggerOnTimeChanged(); + } + + private void TriggerOnTimeChanged() { + if (OnTimeChanged != null) OnTimeChanged(this.Now); + } + + public BattleTime Now {get => new BattleTime(mRoundNumber, mStep);} +} diff --git a/Assets/Battle/BattleClock.cs.meta b/Assets/Battle/BattleClock.cs.meta new file mode 100644 index 0000000..116f55f --- /dev/null +++ b/Assets/Battle/BattleClock.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 22aaeef7020f83f47a03c0b2d8186afa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/BattleController.cs b/Assets/Battle/BattleController.cs index 19e25c7..de01d26 100644 --- a/Assets/Battle/BattleController.cs +++ b/Assets/Battle/BattleController.cs @@ -34,6 +34,9 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe private HandPlayability heroHandPlayability; private HandPlayability monsterHandPlayability; private TurnIntentions monsterIntentions; + private BattleClock clock; + private BuffManager buffManager; + private ParticipantActivity participantActivity; private delegate void BattleStateChangedAction(); private event BattleStateChangedAction OnBattleStateChanged; @@ -93,6 +96,9 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe this.monsterDeck = new BattleDeck( this.monsterCardDatabase, parameters.MCardIds.Cast().ToArray(), mCardOwners); + this.clock = new BattleClock(); + this.buffManager = new BuffManager(this.clock); + this.participantActivity = new ParticipantActivity(); this.playArea = new PlayArea(); this.heroHandPlayability = new HandPlayability( @@ -151,6 +157,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe } private IEnumerator RunBattleRound() { + this.clock.AdvanceRound(); this.state.AdvanceToTeamTurn(TeamChoice.Heroes); this.damageTriggers.RemoveAll(t => t.Expiration == TriggerExpiration.StartOfNextHeroTurn); @@ -172,10 +179,14 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe this.state.AdvanceToTeamTurn(TeamChoice.Monsters); yield return RunMonsterTurn(); + + this.clock.AdvanceToStep(RoundStep.EndOfRound); + this.participantActivity.NextRound(); } private IEnumerator RunHeroTurn() { // Start of hero turn + this.clock.AdvanceToStep(RoundStep.StartOfHeroTurn); OnBattleStateChanged(); this.monsterIntentions.ResumeIntentions(); @@ -200,6 +211,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe } // End of hero turn + yield return this.playArea.UseHeroDefaults(this.heroes, this.participantActivity, UseHeroDefault); if (STABLE_HAND_STYLE) { this.heroDeck.DiscardInExcessOf(3); } else { @@ -208,11 +220,15 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe foreach (BattleHero hero in this.heroes) { hero.TickStatuses(); } + + this.clock.AdvanceToStep(RoundStep.EndOfHeroTurn); + OnBattleStateChanged(); this.monsterIntentions.PauseIntentions(); } private IEnumerator RunMonsterTurn() { + this.clock.AdvanceToStep(RoundStep.StartOfMonsterTurn); OnBattleStateChanged(); yield return new WaitForSeconds(0.5f); @@ -253,6 +269,8 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe foreach (BattleMonster monster in this.monsters) { monster.TickStatuses(); } + + this.clock.AdvanceToStep(RoundStep.EndOfMonsterTurn); OnBattleStateChanged(); } @@ -275,8 +293,11 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe this.heroEnergy.PayForCard(card); this.heroDeck.RemoveCardFromHand(card); + this.participantActivity.NotifyParticipantUsedCard(card.Owner, card); yield return card.Use(this, this, battlePlayerControls); - if (card.IsPermanent()) { + if (card.Type == CardType.Default) { + // Already added to playArea by effect + } else if (card.IsPermanent()) { this.playArea.AddPlayedHeroPermanent(card); } else if (card.IsEphemeral()) { this.heroDeck.MoveCardToOblivion(card); @@ -288,6 +309,17 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe OnBattleStateChanged(); } + public IEnumerator UseHeroDefault(DefaultHeroCard card) { + if (!card.Owner.CanUseDefault()) { + yield break; + } + + yield return card.UseDefault(this, this, battlePlayerControls); + + CheckState(); + OnBattleStateChanged(); + } + public IEnumerator UseMonsterCard(MonsterCard card) { this.monsterEnergy.PayForCard(card); this.monsterDeck.RemoveCardFromHand(card); @@ -444,7 +476,11 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe public int DealDamage(DealDamageEffect effect) { if (effect.Target == null) return 0; - int damageDealt = effect.Target.DealDamage(effect.Amount); + int amount = effect.Amount; + if (effect.Source != null) { + amount += this.buffManager.GetTotalBuffAmountOfType(effect.Source, BuffType.Power); + } + int damageDealt = effect.Target.DealDamage(amount); foreach (DamageTrigger dt in this.damageTriggers) { if (dt.IsTriggeredBy(effect)) { EnqueueActivatedTrigger(dt); @@ -499,6 +535,10 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe effect.Target.AddStatus(effect.Status, effect.Amount); } + public void BuffParticipant(BuffParticipantEffect effect) { + this.buffManager.AddBuff(effect, this.clock.Now); + } + public void Rotate(RotateEffect effect) { if (effect.Positions == 0) return; @@ -554,6 +594,13 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe } } + public void SetupDefault(DefaultEffect effect) { + DefaultHeroCard previousDefault = this.playArea.SetupDefault(effect); + if (previousDefault != null) { + this.heroDeck.MoveCardToDiscard(previousDefault); + } + } + public void ArmDamageTrigger(DamageTrigger damageTrigger) { this.damageTriggers.Add(damageTrigger); } diff --git a/Assets/Battle/BattleParticipant.cs b/Assets/Battle/BattleParticipant.cs index 2255095..38d5750 100644 --- a/Assets/Battle/BattleParticipant.cs +++ b/Assets/Battle/BattleParticipant.cs @@ -164,6 +164,10 @@ public class BattleParticipant return IsAlive() && !HasStatus(BattleStatus.Stun); } + public bool CanUseDefault() { + return IsAlive() && !HasStatus(BattleStatus.Stun); + } + public bool HasStatus(BattleStatus status) { return this.statuses.ContainsKey(status); } diff --git a/Assets/Battle/BattleTime.cs b/Assets/Battle/BattleTime.cs new file mode 100644 index 0000000..4dc750f --- /dev/null +++ b/Assets/Battle/BattleTime.cs @@ -0,0 +1,24 @@ +public enum RoundStep { + None, + StartOfRound, + StartOfHeroTurn, + EndOfHeroTurn, + StartOfMonsterTurn, + EndOfMonsterTurn, + EndOfRound, +} + +public class BattleTime { + private int mRoundNumber; + private RoundStep mRoundStep; + + public BattleTime(int roundNumber, RoundStep roundStep) { + mRoundNumber = roundNumber; + mRoundStep = roundStep; + } + + public int RoundNumber {get => mRoundNumber;} + public RoundStep RoundStep {get => mRoundStep;} + + public int Int {get => mRoundNumber * 100 + (int) mRoundStep;} +} diff --git a/Assets/Battle/BattleTime.cs.meta b/Assets/Battle/BattleTime.cs.meta new file mode 100644 index 0000000..8e49be6 --- /dev/null +++ b/Assets/Battle/BattleTime.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9c620593374fcf4c985eaf5041b1eff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/BuffDuration.cs b/Assets/Battle/BuffDuration.cs new file mode 100644 index 0000000..053cc37 --- /dev/null +++ b/Assets/Battle/BuffDuration.cs @@ -0,0 +1,3 @@ +public enum BuffDuration { + UntilEndOfNextHeroTurn, +} diff --git a/Assets/Battle/BuffDuration.cs.meta b/Assets/Battle/BuffDuration.cs.meta new file mode 100644 index 0000000..9d87db1 --- /dev/null +++ b/Assets/Battle/BuffDuration.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0b7d7799a49ca114481b8b4e0d1d3879 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/BuffManager.cs b/Assets/Battle/BuffManager.cs new file mode 100644 index 0000000..5fb9af4 --- /dev/null +++ b/Assets/Battle/BuffManager.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Linq; + +public class Buff { + private BuffType mType; + private int mAmount; + private BattleTime mEnd; + + public Buff(BuffType type, int amount, BattleTime end) { + mType = type; + mAmount = amount; + mEnd = end; + } + + public BuffType Type {get => mType;} + public int Amount {get => mAmount;} + public BattleTime End {get => mEnd;} +} + +public class BuffManager { + + private Dictionary> mBuffs = new Dictionary>(); + + public BuffManager(BattleClock clock) { + clock.OnTimeChanged += NotifyBattleTime; + } + + public void AddBuff(BuffParticipantEffect effect, BattleTime timeNow) { + List current = GetAllBuffsFor(effect.Participant); + current.Add(new Buff(effect.Type, effect.Amount, CalculateEnd(timeNow, effect.Duration))); + mBuffs[effect.Participant] = current; + } + + public int GetTotalBuffAmountOfType(BattleParticipant participant, BuffType type) { + int total = 0; + foreach (Buff buff in GetAllBuffsFor(participant)) { + if (buff.Type == type) { + total += buff.Amount; + } + } + return total; + } + + public List GetAllBuffsFor(BattleParticipant participant) { + if (mBuffs.ContainsKey(participant)) { + return mBuffs[participant]; + } else { + return new List(); + } + } + + private void NotifyBattleTime(BattleTime timeNow) { + foreach (List buffs in mBuffs.Values) { + buffs.RemoveAll(buff => timeNow.Int >= buff.End.Int); + } + } + + private static BattleTime CalculateEnd(BattleTime timeNow, BuffDuration duration) { + if (duration == BuffDuration.UntilEndOfNextHeroTurn) { + return new BattleTime(timeNow.RoundNumber + 1, RoundStep.EndOfHeroTurn); + } + throw new System.Exception(); + } +} \ No newline at end of file diff --git a/Assets/Battle/BuffManager.cs.meta b/Assets/Battle/BuffManager.cs.meta new file mode 100644 index 0000000..9312ac5 --- /dev/null +++ b/Assets/Battle/BuffManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ef089e4327ee000469448b5357efc161 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/BuffType.cs b/Assets/Battle/BuffType.cs new file mode 100644 index 0000000..9720b12 --- /dev/null +++ b/Assets/Battle/BuffType.cs @@ -0,0 +1,3 @@ +public enum BuffType { + Power, +} diff --git a/Assets/Battle/BuffType.cs.meta b/Assets/Battle/BuffType.cs.meta new file mode 100644 index 0000000..608ca8c --- /dev/null +++ b/Assets/Battle/BuffType.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c870b0605da509b42b5fb4284f6e04f6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/CardType.cs b/Assets/Battle/CardType.cs index eb15abe..83e62b5 100644 --- a/Assets/Battle/CardType.cs +++ b/Assets/Battle/CardType.cs @@ -3,4 +3,5 @@ public enum CardType { Attack, Skill, Enchantment, + Default, } diff --git a/Assets/Battle/CardsHeroes/BlindFuryHCard.cs b/Assets/Battle/CardsHeroes/BlindFuryHCard.cs index 14e8cf1..4eb1820 100644 --- a/Assets/Battle/CardsHeroes/BlindFuryHCard.cs +++ b/Assets/Battle/CardsHeroes/BlindFuryHCard.cs @@ -12,7 +12,7 @@ public class BlindFuryHCard : HeroCard public override IEnumerator Use(IBattleEffectApplier effectApplier, MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { BattleParticipant target = AIUtils.GetNearestMonster(viewpoint, this.owner); - effectApplier.Apply(new DealDamageEffect(target, 5)); + effectApplier.Apply(new DealDamageEffect(Owner, target, 5)); effectApplier.Apply(new ModifyInsightEffect(-1)); yield break; } diff --git a/Assets/Battle/CardsHeroes/CrashingPunchHCard.cs b/Assets/Battle/CardsHeroes/CrashingPunchHCard.cs index 5557915..50f8646 100644 --- a/Assets/Battle/CardsHeroes/CrashingPunchHCard.cs +++ b/Assets/Battle/CardsHeroes/CrashingPunchHCard.cs @@ -14,6 +14,6 @@ public class CrashingPunchHCard : HeroCard SingleTargeting singleTargeting = new SingleTargeting(new AnyTargetPolicy()); yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting)); BattleParticipant target = singleTargeting.GetTarget(); - effectApplier.Apply(new DealDamageEffect(target, 3)); + effectApplier.Apply(new DealDamageEffect(Owner, target, 3)); } } diff --git a/Assets/Battle/CardsHeroes/LeadShotHCard.cs b/Assets/Battle/CardsHeroes/LeadShotHCard.cs index e792840..1245e1f 100644 --- a/Assets/Battle/CardsHeroes/LeadShotHCard.cs +++ b/Assets/Battle/CardsHeroes/LeadShotHCard.cs @@ -15,7 +15,7 @@ public class LeadShotHCard : HeroCard yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting)); yield return new WaitForSeconds(0.4f); BattleParticipant target = singleTargeting.GetTarget(); - effectApplier.Apply(new DealDamageEffect(target, 2)); + effectApplier.Apply(new DealDamageEffect(Owner, target, 2)); yield return new WaitForSeconds(0.8f); } } diff --git a/Assets/Battle/CardsHeroes/LightningHatchetHCard.cs b/Assets/Battle/CardsHeroes/LightningHatchetHCard.cs index e82339b..e18ad8c 100644 --- a/Assets/Battle/CardsHeroes/LightningHatchetHCard.cs +++ b/Assets/Battle/CardsHeroes/LightningHatchetHCard.cs @@ -14,6 +14,6 @@ public class LightningHatchetHCard : HeroCard SingleTargeting singleTargeting = new SingleTargeting(new AnyMonsterTargetPolicy()); yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting)); BattleParticipant target = singleTargeting.GetTarget(); - effectApplier.Apply(new DealDamageEffect(target, 2)); + effectApplier.Apply(new DealDamageEffect(Owner, target, 2)); } } diff --git a/Assets/Battle/CardsHeroes/LightningStrikeHCard.cs b/Assets/Battle/CardsHeroes/LightningStrikeHCard.cs index a1faf34..b5d451a 100644 --- a/Assets/Battle/CardsHeroes/LightningStrikeHCard.cs +++ b/Assets/Battle/CardsHeroes/LightningStrikeHCard.cs @@ -14,6 +14,6 @@ public class LightningStrikeHCard : HeroCard SingleTargeting singleTargeting = new SingleTargeting(new AnyTargetPolicy()); yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting)); BattleParticipant target = singleTargeting.GetTarget(); - effectApplier.Apply(new DealDamageEffect(target, 3)); + effectApplier.Apply(new DealDamageEffect(Owner, target, 3)); } } diff --git a/Assets/Battle/CardsHeroes/OilOfSharpnessHCard.cs b/Assets/Battle/CardsHeroes/OilOfSharpnessHCard.cs new file mode 100644 index 0000000..44be2d9 --- /dev/null +++ b/Assets/Battle/CardsHeroes/OilOfSharpnessHCard.cs @@ -0,0 +1,26 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class OilOfSharpnessHCard : DefaultHeroCard +{ + public OilOfSharpnessHCard(BattleParticipant owner) + : base(owner, HCardId.OilOfSharpness, "Oil of Sharpness", 1, CardType.Default, + "Target hero gets +1 power until end of next turn.") { + } + + public override IEnumerator Use(IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { + effectApplier.Apply(new DefaultEffect(this)); + yield break; + } + + public override IEnumerator UseDefault(IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, BattlePlayerControls playerControls) { + SingleTargeting targeting = new SingleTargeting(new AnyHeroTargetPolicy()); + yield return playerControls.ChooseTarget(targeting); + BattleParticipant target = targeting.GetTarget(); + effectApplier.Apply(new BuffParticipantEffect(target, BuffType.Power, 1, BuffDuration.UntilEndOfNextHeroTurn)); + yield break; + } +} diff --git a/Assets/Battle/CardsHeroes/OilOfSharpnessHCard.cs.meta b/Assets/Battle/CardsHeroes/OilOfSharpnessHCard.cs.meta new file mode 100644 index 0000000..e2a1920 --- /dev/null +++ b/Assets/Battle/CardsHeroes/OilOfSharpnessHCard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac807b0678a548a46a0f67b2a4f43fed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/CardsHeroes/SwordSlashHCard.cs b/Assets/Battle/CardsHeroes/SwordSlashHCard.cs index b34aa30..f14c24d 100644 --- a/Assets/Battle/CardsHeroes/SwordSlashHCard.cs +++ b/Assets/Battle/CardsHeroes/SwordSlashHCard.cs @@ -15,7 +15,7 @@ public class SwordSlashHCard : HeroCard yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting)); yield return new WaitForSeconds(0.4f); BattleParticipant target = singleTargeting.GetTarget(); - effectApplier.Apply(new DealDamageEffect(target, 1)); + effectApplier.Apply(new DealDamageEffect(Owner, target, 1)); yield return new WaitForSeconds(0.8f); } } diff --git a/Assets/Battle/CardsMonsters/GolemBerserkMCard.cs b/Assets/Battle/CardsMonsters/GolemBerserkMCard.cs index 14c8c13..79d1ceb 100644 --- a/Assets/Battle/CardsMonsters/GolemBerserkMCard.cs +++ b/Assets/Battle/CardsMonsters/GolemBerserkMCard.cs @@ -13,11 +13,11 @@ public class GolemBerserkMCard : MonsterCard public override IEnumerator Use(IBattleEffectApplier effectApplier, MonsterViewpoint monsterViewpoint) { BattleParticipant target = AIUtils.GetNearestHero(monsterViewpoint, this.owner); - effectApplier.Apply(new DealDamageEffect(target, 8)); + effectApplier.Apply(new DealDamageEffect(Owner, target, 8)); yield return new WaitForSeconds(1f); foreach (BattleHero hero in monsterViewpoint.Heroes) { if (hero != target) { - effectApplier.Apply(new DealDamageEffect(hero, 4)); + effectApplier.Apply(new DealDamageEffect(Owner, hero, 4)); } } diff --git a/Assets/Battle/CardsMonsters/GolemChargeMCard.cs b/Assets/Battle/CardsMonsters/GolemChargeMCard.cs index cfe058f..7d99aa6 100644 --- a/Assets/Battle/CardsMonsters/GolemChargeMCard.cs +++ b/Assets/Battle/CardsMonsters/GolemChargeMCard.cs @@ -14,7 +14,7 @@ public class GolemChargeMCard : MonsterCard yield return new WaitForSeconds(0.5f); BattleParticipant target = AIUtils.GetFarthestHero(monsterViewpoint, this.owner); - DealDamageEffect damageEffect = new DealDamageEffect(target, 4); + DealDamageEffect damageEffect = new DealDamageEffect(Owner, target, 4); effectApplier.Apply(damageEffect); StatusEffect statusEffect = new StatusEffect(target, BattleStatus.Stun); effectApplier.Apply(statusEffect); diff --git a/Assets/Battle/CardsMonsters/GolemFistMCard.cs b/Assets/Battle/CardsMonsters/GolemFistMCard.cs index b89ef0a..406e0ee 100644 --- a/Assets/Battle/CardsMonsters/GolemFistMCard.cs +++ b/Assets/Battle/CardsMonsters/GolemFistMCard.cs @@ -11,7 +11,7 @@ public class GolemFistMCard : MonsterCard public override IEnumerator Use(IBattleEffectApplier effectApplier, MonsterViewpoint monsterViewpoint) { BattleParticipant target = AIUtils.GetNearestHero(monsterViewpoint, this.owner); - DealDamageEffect damageEffect = new DealDamageEffect(target, 3); + DealDamageEffect damageEffect = new DealDamageEffect(Owner, target, 3); effectApplier.Apply(damageEffect); yield break; } diff --git a/Assets/Battle/CardsMonsters/QuickSwiftDeathMCard.cs b/Assets/Battle/CardsMonsters/QuickSwiftDeathMCard.cs index 258bd5b..66ee712 100644 --- a/Assets/Battle/CardsMonsters/QuickSwiftDeathMCard.cs +++ b/Assets/Battle/CardsMonsters/QuickSwiftDeathMCard.cs @@ -11,7 +11,7 @@ public class QuickSwiftDeathMCard : MonsterCard public override IEnumerator Use(IBattleEffectApplier effectApplier, MonsterViewpoint monsterViewpoint) { BattleParticipant target = AIUtils.GetNearestHero(monsterViewpoint, this.owner); - DealDamageEffect damageEffect = new DealDamageEffect(target, 100); + DealDamageEffect damageEffect = new DealDamageEffect(Owner, target, 100); effectApplier.Apply(damageEffect); yield break; } diff --git a/Assets/Battle/CardsMonsters/VampireFangsMCard.cs b/Assets/Battle/CardsMonsters/VampireFangsMCard.cs index 1dabdb3..53f2085 100644 --- a/Assets/Battle/CardsMonsters/VampireFangsMCard.cs +++ b/Assets/Battle/CardsMonsters/VampireFangsMCard.cs @@ -11,7 +11,7 @@ public class VampireFangsMCard : MonsterCard public override IEnumerator Use(IBattleEffectApplier effectApplier, MonsterViewpoint monsterViewpoint) { BattleParticipant target = AIUtils.GetHeroWithHighestHP(monsterViewpoint); - DealDamageEffect damageEffect = new DealDamageEffect(target, 2); + DealDamageEffect damageEffect = new DealDamageEffect(Owner, target, 2); effectApplier.Apply(damageEffect); if (damageEffect.AmountDealt > 0) { HealEffect healEffect = new HealEffect(this.owner, damageEffect.AmountDealt); diff --git a/Assets/Battle/CheatBattle.cs b/Assets/Battle/CheatBattle.cs index 11dee07..2502875 100644 --- a/Assets/Battle/CheatBattle.cs +++ b/Assets/Battle/CheatBattle.cs @@ -20,20 +20,24 @@ public class CheatBattle: MonoBehaviour HCardId.Eagerness, HCardId.CrashingPunch, - HCardId.LightningHatchet, HCardId.BlindFury, HCardId.Cover, HCardId.Cover, - HCardId.Thunderstorm, HCardId.Scarring, - HCardId.Scarring, - HCardId.Meditate, + + HCardId.OilOfSharpness, HCardId.IronskinDraught, + + HCardId.LightningHatchet, + HCardId.Thunderstorm, + HCardId.Meditate, }; int[] hCardOwnerIndexes = new int[16] { 0, 0, 1, 1, 2, 2, - 0, 2, 0, 0, 0, 2, 0, 0, 2, 1, + 0, 0, 0, 0, 0, + 1, 1, + 2, 2, 2, }; MonsterId[] monsterIds = new MonsterId[3] { diff --git a/Assets/Battle/DefaultHeroCard.cs b/Assets/Battle/DefaultHeroCard.cs new file mode 100644 index 0000000..b8f529a --- /dev/null +++ b/Assets/Battle/DefaultHeroCard.cs @@ -0,0 +1,13 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public abstract class DefaultHeroCard: HeroCard +{ + public DefaultHeroCard(BattleParticipant owner, HCardId id, string displayName, int cost, CardType type, + string effectText) + : base(owner, id, displayName, cost, type, effectText) {} + + public abstract IEnumerator UseDefault(IBattleEffectApplier effectApplier, + MonsterViewpoint viewpoint, BattlePlayerControls playerControls); +} diff --git a/Assets/Battle/DefaultHeroCard.cs.meta b/Assets/Battle/DefaultHeroCard.cs.meta new file mode 100644 index 0000000..bbe0cfe --- /dev/null +++ b/Assets/Battle/DefaultHeroCard.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6d2e07039087c844c863e1b155f4d983 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/DefaultsManager.cs b/Assets/Battle/DefaultsManager.cs new file mode 100644 index 0000000..697c800 --- /dev/null +++ b/Assets/Battle/DefaultsManager.cs @@ -0,0 +1,42 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class DefaultsManager +{ + public delegate IEnumerator UseDefaultAction(DefaultHeroCard card); + + private Dictionary mHeroDefaults = new Dictionary(); + + public DefaultsManager() { + } + + public DefaultHeroCard Setup(DefaultEffect effect) { + DefaultHeroCard newCard = effect.Card; + DefaultHeroCard previousCard = null; + BattleHero heroOwner = (BattleHero) newCard.Owner; + mHeroDefaults.TryGetValue(heroOwner, out previousCard); + + mHeroDefaults[heroOwner] = newCard; + + return previousCard; + } + + public IEnumerator UseHeroDefaults( + BattleHero[] heroes, ParticipantActivity activity, + UseDefaultAction usedDefaultAction) { + foreach (BattleHero hero in heroes) { + if (hero == null) { + continue; + } + + if (activity.GetNonEmotionCardsUsedThisRound(hero) == 0) { + DefaultHeroCard defaultCard; + mHeroDefaults.TryGetValue(hero, out defaultCard); + if (defaultCard != null) { + yield return usedDefaultAction(defaultCard); + } + } + } + } +} diff --git a/Assets/Battle/DefaultsManager.cs.meta b/Assets/Battle/DefaultsManager.cs.meta new file mode 100644 index 0000000..fca1d2b --- /dev/null +++ b/Assets/Battle/DefaultsManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9517ccf8137932d458bdd10b84540001 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/Effects/BuffParticipantEffect.cs b/Assets/Battle/Effects/BuffParticipantEffect.cs new file mode 100644 index 0000000..2b8704b --- /dev/null +++ b/Assets/Battle/Effects/BuffParticipantEffect.cs @@ -0,0 +1,27 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class BuffParticipantEffect : IBattleEffect +{ + private BattleParticipant mParticipant; + private BuffType mType; + private BuffDuration mDuration; + private int mAmount; + + public BuffParticipantEffect(BattleParticipant participant, BuffType type, int amount, BuffDuration duration) { + mParticipant = participant; + mType = type; + mAmount = amount; + mDuration = duration; + } + + public void Apply(IBattleEffectResolver resolver) { + resolver.BuffParticipant(this); + } + + public BattleParticipant Participant {get => mParticipant;} + public BuffType Type {get => mType;} + public BuffDuration Duration {get => mDuration;} + public int Amount {get => mAmount;} +} diff --git a/Assets/Battle/Effects/BuffParticipantEffect.cs.meta b/Assets/Battle/Effects/BuffParticipantEffect.cs.meta new file mode 100644 index 0000000..f47f577 --- /dev/null +++ b/Assets/Battle/Effects/BuffParticipantEffect.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 203a8da7e3f13cf478d850b47c3f762e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/Effects/DealDamageEffect.cs b/Assets/Battle/Effects/DealDamageEffect.cs index add8423..2aef7f6 100644 --- a/Assets/Battle/Effects/DealDamageEffect.cs +++ b/Assets/Battle/Effects/DealDamageEffect.cs @@ -4,11 +4,13 @@ using UnityEngine; public class DealDamageEffect : IBattleEffect { + private BattleParticipant source; private BattleParticipant target; private int amount; private int amountDealt; - public DealDamageEffect(BattleParticipant target, int amount) { + public DealDamageEffect(BattleParticipant source, BattleParticipant target, int amount) { + this.source = source; this.target = target; this.amount = amount; } @@ -17,6 +19,7 @@ public class DealDamageEffect : IBattleEffect this.amountDealt = resolver.DealDamage(this); } + public BattleParticipant Source {get => this.source;} public BattleParticipant Target {get => this.target;} public int Amount {get => this.amount;} public int AmountDealt {get => this.amountDealt;} diff --git a/Assets/Battle/Effects/DefaultEffect.cs b/Assets/Battle/Effects/DefaultEffect.cs new file mode 100644 index 0000000..66cf6e3 --- /dev/null +++ b/Assets/Battle/Effects/DefaultEffect.cs @@ -0,0 +1,19 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using UnityEngine; + +public class DefaultEffect : IBattleEffect +{ + private DefaultHeroCard mCard; + + public DefaultEffect(DefaultHeroCard card) { + mCard = card; + } + + public void Apply(IBattleEffectResolver resolver) { + resolver.SetupDefault(this); + } + + public DefaultHeroCard Card {get => mCard;} +} diff --git a/Assets/Battle/Effects/DefaultEffect.cs.meta b/Assets/Battle/Effects/DefaultEffect.cs.meta new file mode 100644 index 0000000..f62d1a8 --- /dev/null +++ b/Assets/Battle/Effects/DefaultEffect.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c713bb4a53fb33249a23147f4f67114c +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 30e5fec..9302a56 100644 --- a/Assets/Battle/HeroCardDatabase.cs +++ b/Assets/Battle/HeroCardDatabase.cs @@ -24,6 +24,7 @@ public enum HCardId { LeadShot, SmokeBomb, Eagerness, + OilOfSharpness, } public class HeroCardDatabase : CardDatabase @@ -60,6 +61,8 @@ public class HeroCardDatabase : CardDatabase return new SmokeBombHCard(owner); case HCardId.Eagerness: return new EagernessHCard(owner); + case HCardId.OilOfSharpness: + return new OilOfSharpnessHCard(owner); default: throw new System.ArgumentException("HCardId unknown", "id"); } diff --git a/Assets/Battle/IBattleEffectResolver.cs b/Assets/Battle/IBattleEffectResolver.cs index 14410e2..8ecd9ff 100644 --- a/Assets/Battle/IBattleEffectResolver.cs +++ b/Assets/Battle/IBattleEffectResolver.cs @@ -13,9 +13,11 @@ public interface IBattleEffectResolver { void IncreaseHeroMaxEnergy(IncreaseMaxEnergyEffect delta); void IncreaseMaxHP(IncreaseMaxHPEffect effect); void ModifyInsight(ModifyInsightEffect effect); + void BuffParticipant(BuffParticipantEffect effect); void DrawCards(DrawCardsEffect effect); void AcquireCards(AcquireCardsEffect effect); void Rotate(RotateEffect effect); + void SetupDefault(DefaultEffect effect); void ArmDamageTrigger(DamageTrigger damageTrigger); } diff --git a/Assets/Battle/ParticipantActivity.cs b/Assets/Battle/ParticipantActivity.cs new file mode 100644 index 0000000..54560d2 --- /dev/null +++ b/Assets/Battle/ParticipantActivity.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; + +public class ParticipantActivity { + + private Dictionary> mCardsUsedThisRound = new Dictionary>(); + + public ParticipantActivity() { + } + + public void NotifyParticipantUsedCard(BattleParticipant participant, BaseCard card) { + if (mCardsUsedThisRound.ContainsKey(participant)) { + mCardsUsedThisRound[participant].Add(card); + } else { + mCardsUsedThisRound[participant] = new List() {card}; + } + } + + public int GetNonEmotionCardsUsedThisRound(BattleParticipant participant) { + if (mCardsUsedThisRound.ContainsKey(participant)) { + return mCardsUsedThisRound[participant].Count(card => card.Type != CardType.Emotion); + } else { + return 0; + } + } + + public void NextRound() { + mCardsUsedThisRound.Clear(); + } +} \ No newline at end of file diff --git a/Assets/Battle/ParticipantActivity.cs.meta b/Assets/Battle/ParticipantActivity.cs.meta new file mode 100644 index 0000000..634a2eb --- /dev/null +++ b/Assets/Battle/ParticipantActivity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: abe2bbff2aef9fc4388e4aad5eb0b1f7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/PlayArea.cs b/Assets/Battle/PlayArea.cs index 38db77a..b6ac69c 100644 --- a/Assets/Battle/PlayArea.cs +++ b/Assets/Battle/PlayArea.cs @@ -10,10 +10,12 @@ public class PlayArea private List heroPermanents; private List monsterPermanents; + private DefaultsManager mDefaultsManager; public PlayArea() { this.heroPermanents = new List(); this.monsterPermanents = new List(); + mDefaultsManager = new DefaultsManager(); } public List GetHeroPermanents() { @@ -40,6 +42,24 @@ public class PlayArea TriggerPlayAreaChanged(); } + public DefaultHeroCard SetupDefault(DefaultEffect effect) { + DefaultHeroCard previousDefault = mDefaultsManager.Setup(effect); + if (previousDefault != null) { + RemoveHeroPermanent(previousDefault); + } + + AddPlayedHeroPermanent(effect.Card); + + TriggerPlayAreaChanged(); + return previousDefault; + } + + public IEnumerator UseHeroDefaults( + BattleHero[] heroes, ParticipantActivity activity, + DefaultsManager.UseDefaultAction useDefaultAction) { + yield return mDefaultsManager.UseHeroDefaults(heroes, activity, useDefaultAction); + } + private void TriggerPlayAreaChanged() { if (OnPlayAreaChanged != null) OnPlayAreaChanged(); } diff --git a/Assets/Resources/CardArt/HeroOilOfSharpness.jpg b/Assets/Resources/CardArt/HeroOilOfSharpness.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab26bd3f9dc3e67f3dc61501413bb2f6a3d36995 GIT binary patch literal 39668 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