Add monster energy indicator
This commit is contained in:
parent
537538a6ca
commit
4ca7b7537a
6 changed files with 228 additions and 50 deletions
|
|
@ -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<HeroCard> GetHeroDeck() {
|
||||
|
|
@ -275,6 +266,9 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
|
|||
this.damageTriggers.RemoveAll(t => t.Expired);
|
||||
}
|
||||
|
||||
public EnergyPool HeroEnergy {get => this.heroEnergy;}
|
||||
public EnergyPool MonsterEnergy {get => this.monsterEnergy;}
|
||||
|
||||
// IBattleEffectApplier
|
||||
public void Apply(IBattleEffect effect) {
|
||||
effect.Apply(this);
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
41
Assets/Battle/EnergyPool.cs
Normal file
41
Assets/Battle/EnergyPool.cs
Normal 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;}
|
||||
}
|
||||
11
Assets/Battle/EnergyPool.cs.meta
Normal file
11
Assets/Battle/EnergyPool.cs.meta
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 59a0ba79b951ce94eb3564430b432e6b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
|
@ -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) {
|
||||
string currentEnergyString = "" + this.pool.Energy;
|
||||
if (this.pool.Energy == 0) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
1
TODO.txt
1
TODO.txt
|
|
@ -1,2 +1,3 @@
|
|||
- Make battle end
|
||||
- Do not allow dead heroes to act
|
||||
- Rename CardId to HCardId
|
||||
Loading…
Add table
Add a link
Reference in a new issue