Add monster energy indicator

This commit is contained in:
henriquenakashima 2020-09-20 15:26:18 -04:00
parent 537538a6ca
commit 4ca7b7537a
6 changed files with 228 additions and 50 deletions

View file

@ -14,6 +14,8 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
public HeroInfoUI heroUIPrefab; public HeroInfoUI heroUIPrefab;
public GameObject uiCanvas; public GameObject uiCanvas;
public BattlePlayerControls battlePlayerControls; public BattlePlayerControls battlePlayerControls;
public EnergyUI heroEnergyUI;
public EnergyUI monsterEnergyUI;
private HeroCardDatabase heroCardDatabase; private HeroCardDatabase heroCardDatabase;
private MonsterCardDatabase monsterCardDatabase; private MonsterCardDatabase monsterCardDatabase;
@ -31,15 +33,20 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
private bool heroTurn; private bool heroTurn;
private bool heroPassedTurn; private bool heroPassedTurn;
private int maxEnergy; private EnergyPool heroEnergy;
private int energy; private EnergyPool monsterEnergy;
private int maxMEnergy;
private int mEnergy;
void Awake() { void Awake() {
this.heroCardDatabase = new HeroCardDatabase(); this.heroCardDatabase = new HeroCardDatabase();
this.monsterCardDatabase = new MonsterCardDatabase(); 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]; heroes = new BattleHero[3];
heroSprites = new GameObject[3]; heroSprites = new GameObject[3];
heroUIs = new HeroInfoUI[3]; heroUIs = new HeroInfoUI[3];
@ -136,8 +143,8 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
this.damageTriggers.RemoveAll(t => t.Expiration == TriggerExpiration.StartOfNextHeroTurn); this.damageTriggers.RemoveAll(t => t.Expiration == TriggerExpiration.StartOfNextHeroTurn);
this.energy = this.maxEnergy; heroEnergy.Replenish();
this.mEnergy = this.maxMEnergy; monsterEnergy.Replenish();
this.heroDeck.DrawHand(); this.heroDeck.DrawHand();
this.monsterDeck.DrawHand(); this.monsterDeck.DrawHand();
@ -149,9 +156,10 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
private IEnumerator RunHeroTurn() { private IEnumerator RunHeroTurn() {
// Start of hero turn // Start of hero turn
if (this.maxEnergy < 9) {
this.maxEnergy++; // TODO: Play emotions from hand
this.energy++; if (this.heroEnergy.MaxEnergy < 9) {
this.heroEnergy.DropOneEmotion();
} }
foreach (BattleHero hero in this.heroes) { foreach (BattleHero hero in this.heroes) {
hero.ResetBlock(); hero.ResetBlock();
@ -171,9 +179,8 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
yield return new WaitForSeconds(0.5f); yield return new WaitForSeconds(0.5f);
// Start of monster turn // Start of monster turn
if (this.maxMEnergy < 9) { if (this.monsterEnergy.MaxEnergy < 9) {
this.maxMEnergy++; this.monsterEnergy.DropOneEmotion();
this.mEnergy++;
} }
foreach (BattleMonster monster in this.monsters) { foreach (BattleMonster monster in this.monsters) {
monster.ResetBlock(); monster.ResetBlock();
@ -201,7 +208,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
public IEnumerator UseHeroCard(HeroCard card) { public IEnumerator UseHeroCard(HeroCard card) {
yield return card.Use(this, battlePlayerControls); yield return card.Use(this, battlePlayerControls);
PayHeroCardCost(card); this.heroEnergy.PayForCard(card);
this.heroDeck.RemoveCardFromHand(card); this.heroDeck.RemoveCardFromHand(card);
if (card.IsPermanent()) { if (card.IsPermanent()) {
this.playArea.AddPlayedHeroPermanent(card); this.playArea.AddPlayedHeroPermanent(card);
@ -212,7 +219,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
public IEnumerator UseMonsterCard(MonsterCard card) { public IEnumerator UseMonsterCard(MonsterCard card) {
yield return card.Use(this, this); yield return card.Use(this, this);
PayMonsterCardCost(card); this.monsterEnergy.PayForCard(card);
this.monsterDeck.RemoveCardFromHand(card); this.monsterDeck.RemoveCardFromHand(card);
if (card.IsPermanent()) { if (card.IsPermanent()) {
this.playArea.AddPlayedMonsterPermanent(card); this.playArea.AddPlayedMonsterPermanent(card);
@ -230,27 +237,11 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
} }
public bool CanUseHeroCard(HeroCard card) { public bool CanUseHeroCard(HeroCard card) {
return this.heroTurn && this.energy >= card.GetCost(); return this.heroTurn && this.heroEnergy.CanPayForCard(card);
} }
public bool CanUseMonsterCard(MonsterCard card) { public bool CanUseMonsterCard(MonsterCard card) {
return !this.heroTurn && this.mEnergy >= card.GetCost(); return !this.heroTurn && this.monsterEnergy.CanPayForCard(card);
}
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;
} }
public BattleDeck<HeroCard> GetHeroDeck() { public BattleDeck<HeroCard> GetHeroDeck() {
@ -275,6 +266,9 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
this.damageTriggers.RemoveAll(t => t.Expired); this.damageTriggers.RemoveAll(t => t.Expired);
} }
public EnergyPool HeroEnergy {get => this.heroEnergy;}
public EnergyPool MonsterEnergy {get => this.monsterEnergy;}
// IBattleEffectApplier // IBattleEffectApplier
public void Apply(IBattleEffect effect) { public void Apply(IBattleEffect effect) {
effect.Apply(this); effect.Apply(this);
@ -282,7 +276,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
// IBattleEffectResolver // IBattleEffectResolver
public void IncreaseHeroMaxEnergy(IncreaseMaxEnergyEffect effect) { public void IncreaseHeroMaxEnergy(IncreaseMaxEnergyEffect effect) {
this.maxEnergy += effect.Amount; this.heroEnergy.MaxEnergy += effect.Amount;
} }
public void IncreaseMaxHP(IncreaseMaxHPEffect effect) { public void IncreaseMaxHP(IncreaseMaxHPEffect effect) {

View file

@ -132,7 +132,7 @@ GameObject:
- component: {fileID: 24180900} - component: {fileID: 24180900}
- component: {fileID: 24180901} - component: {fileID: 24180901}
m_Layer: 5 m_Layer: 5
m_Name: EnergyUI m_Name: HeroEnergyUI
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
@ -171,7 +171,6 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
text: {fileID: 527589755} text: {fileID: 527589755}
battleController: {fileID: 359124400}
--- !u!1 &35522588 --- !u!1 &35522588
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -266,6 +265,7 @@ RectTransform:
- {fileID: 24180900} - {fileID: 24180900}
- {fileID: 1887276863} - {fileID: 1887276863}
- {fileID: 2103461257} - {fileID: 2103461257}
- {fileID: 431798875}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 3 m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@ -312,6 +312,8 @@ MonoBehaviour:
type: 3} type: 3}
uiCanvas: {fileID: 35522588} uiCanvas: {fileID: 35522588}
battlePlayerControls: {fileID: 1436154611} battlePlayerControls: {fileID: 1436154611}
heroEnergyUI: {fileID: 24180901}
monsterEnergyUI: {fileID: 431798876}
--- !u!4 &359124401 --- !u!4 &359124401
Transform: Transform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -326,6 +328,56 @@ Transform:
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 1 m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} 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 --- !u!1 &519420028
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -631,6 +683,84 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1242658818} m_GameObject: {fileID: 1242658818}
m_CullTransparentMesh: 0 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 --- !u!1 &1415908913
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View file

@ -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;}
}

View file

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 59a0ba79b951ce94eb3564430b432e6b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -6,28 +6,29 @@ using UnityEngine.UI;
public class EnergyUI : MonoBehaviour public class EnergyUI : MonoBehaviour
{ {
public Text text; public Text text;
public BattleController battleController;
private int renderedEnergy = -1; private EnergyPool pool;
private int renderedMaxEnergy = -1;
public void Init(EnergyPool pool) {
this.pool = pool;
}
// Start is called before the first frame update // Start is called before the first frame update
void Start() void Start()
{ {
Render();
} }
// Update is called once per frame private void Render()
void Update()
{ {
if (this.renderedEnergy != battleController.GetEnergy() || this.renderedMaxEnergy != battleController.GetMaxEnergy()) { string currentEnergyString = "" + this.pool.Energy;
string currentEnergyString = "" + battleController.GetEnergy(); if (this.pool.Energy == 0) {
if (battleController.GetEnergy() == 0) { currentEnergyString = "<color=red>" + currentEnergyString + "</color>";
currentEnergyString = "<color=red>" + currentEnergyString + "</color>";
}
text.text = "Energy: " + currentEnergyString + " / " + battleController.GetMaxEnergy();
this.renderedEnergy = battleController.GetEnergy();
this.renderedMaxEnergy = battleController.GetMaxEnergy();
} }
text.text = "Energy: " + currentEnergyString + " / " + this.pool.MaxEnergy;
}
public void NotifyEnergyChanged() {
Render();
} }
} }

View file

@ -1,2 +1,3 @@
- Make battle end - Make battle end
- Do not allow dead heroes to act - Do not allow dead heroes to act
- Rename CardId to HCardId