From 4ca7b7537a68700ca759c8c423240eea56f5e151 Mon Sep 17 00:00:00 2001 From: henriquenakashima Date: Sun, 20 Sep 2020 15:26:18 -0400 Subject: [PATCH] Add monster energy indicator --- Assets/Battle/BattleController.cs | 60 ++++++------- Assets/Battle/BattleScene.unity | 134 +++++++++++++++++++++++++++++- Assets/Battle/EnergyPool.cs | 41 +++++++++ Assets/Battle/EnergyPool.cs.meta | 11 +++ Assets/Battle/UI/EnergyUI.cs | 29 +++---- TODO.txt | 3 +- 6 files changed, 228 insertions(+), 50 deletions(-) create mode 100644 Assets/Battle/EnergyPool.cs create mode 100644 Assets/Battle/EnergyPool.cs.meta diff --git a/Assets/Battle/BattleController.cs b/Assets/Battle/BattleController.cs index da6b3a7..5a67bf2 100644 --- a/Assets/Battle/BattleController.cs +++ b/Assets/Battle/BattleController.cs @@ -14,6 +14,8 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe public HeroInfoUI heroUIPrefab; public GameObject uiCanvas; public BattlePlayerControls battlePlayerControls; + public EnergyUI heroEnergyUI; + public EnergyUI monsterEnergyUI; private HeroCardDatabase heroCardDatabase; private MonsterCardDatabase monsterCardDatabase; @@ -31,15 +33,20 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe private bool heroTurn; private bool heroPassedTurn; - private int maxEnergy; - private int energy; - private int maxMEnergy; - private int mEnergy; + private EnergyPool heroEnergy; + private EnergyPool monsterEnergy; void Awake() { this.heroCardDatabase = new HeroCardDatabase(); this.monsterCardDatabase = new MonsterCardDatabase(); + this.heroEnergy = new EnergyPool(); + this.heroEnergyUI.Init(this.heroEnergy); + this.heroEnergy.OnEnergyChanged += this.heroEnergyUI.NotifyEnergyChanged; + this.monsterEnergy = new EnergyPool(); + this.monsterEnergyUI.Init(this.monsterEnergy); + this.monsterEnergy.OnEnergyChanged += this.monsterEnergyUI.NotifyEnergyChanged; + heroes = new BattleHero[3]; heroSprites = new GameObject[3]; heroUIs = new HeroInfoUI[3]; @@ -136,8 +143,8 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe this.damageTriggers.RemoveAll(t => t.Expiration == TriggerExpiration.StartOfNextHeroTurn); - this.energy = this.maxEnergy; - this.mEnergy = this.maxMEnergy; + heroEnergy.Replenish(); + monsterEnergy.Replenish(); this.heroDeck.DrawHand(); this.monsterDeck.DrawHand(); @@ -149,9 +156,10 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe private IEnumerator RunHeroTurn() { // Start of hero turn - if (this.maxEnergy < 9) { - this.maxEnergy++; - this.energy++; + + // TODO: Play emotions from hand + if (this.heroEnergy.MaxEnergy < 9) { + this.heroEnergy.DropOneEmotion(); } foreach (BattleHero hero in this.heroes) { hero.ResetBlock(); @@ -171,9 +179,8 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe yield return new WaitForSeconds(0.5f); // Start of monster turn - if (this.maxMEnergy < 9) { - this.maxMEnergy++; - this.mEnergy++; + if (this.monsterEnergy.MaxEnergy < 9) { + this.monsterEnergy.DropOneEmotion(); } foreach (BattleMonster monster in this.monsters) { monster.ResetBlock(); @@ -201,7 +208,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe public IEnumerator UseHeroCard(HeroCard card) { yield return card.Use(this, battlePlayerControls); - PayHeroCardCost(card); + this.heroEnergy.PayForCard(card); this.heroDeck.RemoveCardFromHand(card); if (card.IsPermanent()) { this.playArea.AddPlayedHeroPermanent(card); @@ -212,7 +219,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe public IEnumerator UseMonsterCard(MonsterCard card) { yield return card.Use(this, this); - PayMonsterCardCost(card); + this.monsterEnergy.PayForCard(card); this.monsterDeck.RemoveCardFromHand(card); if (card.IsPermanent()) { this.playArea.AddPlayedMonsterPermanent(card); @@ -230,27 +237,11 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe } public bool CanUseHeroCard(HeroCard card) { - return this.heroTurn && this.energy >= card.GetCost(); + return this.heroTurn && this.heroEnergy.CanPayForCard(card); } public bool CanUseMonsterCard(MonsterCard card) { - return !this.heroTurn && this.mEnergy >= card.GetCost(); - } - - private void PayHeroCardCost(HeroCard card) { - this.energy -= card.GetCost(); - } - - private void PayMonsterCardCost(MonsterCard card) { - this.mEnergy -= card.GetCost(); - } - - public int GetEnergy() { - return this.energy; - } - - public int GetMaxEnergy() { - return this.maxEnergy; + return !this.heroTurn && this.monsterEnergy.CanPayForCard(card); } public BattleDeck GetHeroDeck() { @@ -274,6 +265,9 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe // Cleanup expired triggers this.damageTriggers.RemoveAll(t => t.Expired); } + + public EnergyPool HeroEnergy {get => this.heroEnergy;} + public EnergyPool MonsterEnergy {get => this.monsterEnergy;} // IBattleEffectApplier public void Apply(IBattleEffect effect) { @@ -282,7 +276,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe // IBattleEffectResolver public void IncreaseHeroMaxEnergy(IncreaseMaxEnergyEffect effect) { - this.maxEnergy += effect.Amount; + this.heroEnergy.MaxEnergy += effect.Amount; } public void IncreaseMaxHP(IncreaseMaxHPEffect effect) { diff --git a/Assets/Battle/BattleScene.unity b/Assets/Battle/BattleScene.unity index cff30c0..c08edc6 100644 --- a/Assets/Battle/BattleScene.unity +++ b/Assets/Battle/BattleScene.unity @@ -132,7 +132,7 @@ GameObject: - component: {fileID: 24180900} - component: {fileID: 24180901} m_Layer: 5 - m_Name: EnergyUI + m_Name: HeroEnergyUI m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -171,7 +171,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: text: {fileID: 527589755} - battleController: {fileID: 359124400} --- !u!1 &35522588 GameObject: m_ObjectHideFlags: 0 @@ -266,6 +265,7 @@ RectTransform: - {fileID: 24180900} - {fileID: 1887276863} - {fileID: 2103461257} + - {fileID: 431798875} m_Father: {fileID: 0} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} @@ -312,6 +312,8 @@ MonoBehaviour: type: 3} uiCanvas: {fileID: 35522588} battlePlayerControls: {fileID: 1436154611} + heroEnergyUI: {fileID: 24180901} + monsterEnergyUI: {fileID: 431798876} --- !u!4 &359124401 Transform: m_ObjectHideFlags: 0 @@ -326,6 +328,56 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &431798874 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 431798875} + - component: {fileID: 431798876} + m_Layer: 5 + m_Name: MonsterEnergyUi + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &431798875 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 431798874} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1357864254} + m_Father: {fileID: 35522592} + m_RootOrder: 4 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &431798876 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 431798874} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 7045cd41e530ab440bda43353370773b, type: 3} + m_Name: + m_EditorClassIdentifier: + text: {fileID: 1357864255} --- !u!1 &519420028 GameObject: m_ObjectHideFlags: 0 @@ -631,6 +683,84 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1242658818} m_CullTransparentMesh: 0 +--- !u!1 &1357864253 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1357864254} + - component: {fileID: 1357864256} + - component: {fileID: 1357864255} + m_Layer: 5 + m_Name: EnergyText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1357864254 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1357864253} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 431798875} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 472.8, y: 318.8} + m_SizeDelta: {x: 171.60992, y: 30} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1357864255 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1357864253} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0.93333334, g: 0.93333334, b: 0.93333334, a: 1} + m_RaycastTarget: 1 + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 20 + m_FontStyle: 1 + m_BestFit: 0 + m_MinSize: 2 + m_MaxSize: 40 + m_Alignment: 5 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Energy left: 3/3' +--- !u!222 &1357864256 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1357864253} + m_CullTransparentMesh: 0 --- !u!1 &1415908913 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Battle/EnergyPool.cs b/Assets/Battle/EnergyPool.cs new file mode 100644 index 0000000..ae7b45e --- /dev/null +++ b/Assets/Battle/EnergyPool.cs @@ -0,0 +1,41 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class EnergyPool +{ + private int maxEnergy; + private int energy; + + public delegate void EnergyChangedAction(); + public event EnergyChangedAction OnEnergyChanged; + + public void Replenish() { + this.energy = this.maxEnergy; + TriggerOnEnergyChanged(); + } + + public void DropOneEmotion() { + this.maxEnergy++; + this.energy++; + TriggerOnEnergyChanged(); + } + + public bool CanPayForCard(BaseCard card) { + return this.energy >= card.GetCost(); + } + + public void PayForCard(BaseCard card) { + this.energy -= card.GetCost(); + TriggerOnEnergyChanged(); + } + + private void TriggerOnEnergyChanged() { + if (this.OnEnergyChanged != null) { + OnEnergyChanged(); + } + } + + public int MaxEnergy {get => this.maxEnergy; set => this.maxEnergy = value;} + public int Energy {get => this.energy;} +} diff --git a/Assets/Battle/EnergyPool.cs.meta b/Assets/Battle/EnergyPool.cs.meta new file mode 100644 index 0000000..ab01b8d --- /dev/null +++ b/Assets/Battle/EnergyPool.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 59a0ba79b951ce94eb3564430b432e6b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Battle/UI/EnergyUI.cs b/Assets/Battle/UI/EnergyUI.cs index 087d73c..967a6c7 100644 --- a/Assets/Battle/UI/EnergyUI.cs +++ b/Assets/Battle/UI/EnergyUI.cs @@ -6,28 +6,29 @@ using UnityEngine.UI; public class EnergyUI : MonoBehaviour { public Text text; - public BattleController battleController; - private int renderedEnergy = -1; - private int renderedMaxEnergy = -1; + private EnergyPool pool; + + public void Init(EnergyPool pool) { + this.pool = pool; + } // Start is called before the first frame update void Start() { - + Render(); } - // Update is called once per frame - void Update() + private void Render() { - if (this.renderedEnergy != battleController.GetEnergy() || this.renderedMaxEnergy != battleController.GetMaxEnergy()) { - string currentEnergyString = "" + battleController.GetEnergy(); - if (battleController.GetEnergy() == 0) { - currentEnergyString = "" + currentEnergyString + ""; - } - text.text = "Energy: " + currentEnergyString + " / " + battleController.GetMaxEnergy(); - this.renderedEnergy = battleController.GetEnergy(); - this.renderedMaxEnergy = battleController.GetMaxEnergy(); + string currentEnergyString = "" + this.pool.Energy; + if (this.pool.Energy == 0) { + currentEnergyString = "" + currentEnergyString + ""; } + text.text = "Energy: " + currentEnergyString + " / " + this.pool.MaxEnergy; + } + + public void NotifyEnergyChanged() { + Render(); } } diff --git a/TODO.txt b/TODO.txt index 889c22d..0d49c25 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,2 +1,3 @@ - Make battle end -- Do not allow dead heroes to act \ No newline at end of file +- Do not allow dead heroes to act +- Rename CardId to HCardId \ No newline at end of file