Create HeroDeck with state of cards
This commit is contained in:
parent
967c871ed9
commit
567b732f85
7 changed files with 175 additions and 17 deletions
|
|
@ -6,14 +6,14 @@ public class BattleController : MonoBehaviour
|
||||||
{
|
{
|
||||||
public HeroId[] heroIds;
|
public HeroId[] heroIds;
|
||||||
public MonsterId[] monsterIds;
|
public MonsterId[] monsterIds;
|
||||||
public int maxEnergy = 6;
|
public int maxEnergy;
|
||||||
public CardId[] cardIds;
|
public CardId[] cardIds;
|
||||||
|
|
||||||
public HeroInfoUI heroUIPrefab;
|
public HeroInfoUI heroUIPrefab;
|
||||||
public GameObject uiCanvas;
|
public GameObject uiCanvas;
|
||||||
public BattlePlayerControls battlePlayerControls;
|
public BattlePlayerControls battlePlayerControls;
|
||||||
|
|
||||||
private List<BaseCard> hand;
|
private HeroDeck heroDeck;
|
||||||
|
|
||||||
public BattleHero[] heroes;
|
public BattleHero[] heroes;
|
||||||
private GameObject[] heroSprites;
|
private GameObject[] heroSprites;
|
||||||
|
|
@ -32,11 +32,7 @@ public class BattleController : MonoBehaviour
|
||||||
// Start is called before the first frame update
|
// Start is called before the first frame update
|
||||||
void Start()
|
void Start()
|
||||||
{
|
{
|
||||||
this.hand = new List<BaseCard>();
|
this.heroDeck = new HeroDeck(cardIds);
|
||||||
for (int i = 0; i < cardIds.Length; i++) {
|
|
||||||
BaseCard newCard = CardDatabase.CreateCard(cardIds[i]);
|
|
||||||
this.hand.Add(newCard);
|
|
||||||
}
|
|
||||||
|
|
||||||
heroes = new BattleHero[3];
|
heroes = new BattleHero[3];
|
||||||
heroSprites = new GameObject[3];
|
heroSprites = new GameObject[3];
|
||||||
|
|
@ -78,9 +74,10 @@ public class BattleController : MonoBehaviour
|
||||||
monsterUIs[i].Init(monsterSprites[i], monsters[i]);
|
monsterUIs[i].Init(monsterSprites[i], monsters[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.battlePlayerControls.OnCardUsed += this.OnCardUsed;
|
this.battlePlayerControls.Init(this.heroDeck);
|
||||||
this.battlePlayerControls.OnTurnPassed += this.OnTurnPassed;
|
this.battlePlayerControls.OnCardUsed += this.NotifyCardUsed;
|
||||||
this.battlePlayerControls.SetHand(this.hand);
|
this.battlePlayerControls.OnTurnPassed += this.NotifyTurnPassed;
|
||||||
|
this.heroDeck.OnHandPileChanged += this.battlePlayerControls.NotifyHandPileChanged;
|
||||||
|
|
||||||
DecideEnemyTarget();
|
DecideEnemyTarget();
|
||||||
StartHeroTurn();
|
StartHeroTurn();
|
||||||
|
|
@ -97,11 +94,15 @@ public class BattleController : MonoBehaviour
|
||||||
foreach (BattleHero hero in this.heroes) {
|
foreach (BattleHero hero in this.heroes) {
|
||||||
hero.ResetBlock();
|
hero.ResetBlock();
|
||||||
}
|
}
|
||||||
|
this.heroDeck.DrawHand();
|
||||||
|
this.battlePlayerControls.NotifyHandPileChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StartEnemyTurn() {
|
private void StartEnemyTurn() {
|
||||||
this.heroTurn = false;
|
this.heroTurn = false;
|
||||||
|
|
||||||
|
this.heroDeck.DiscardHand();
|
||||||
|
|
||||||
foreach (BattleMonster monster in this.monsters) {
|
foreach (BattleMonster monster in this.monsters) {
|
||||||
monster.ResetBlock();
|
monster.ResetBlock();
|
||||||
}
|
}
|
||||||
|
|
@ -118,8 +119,8 @@ public class BattleController : MonoBehaviour
|
||||||
Debug.Log("Will attack " + this.heroes[this.enemyTarget].GetDisplayName());
|
Debug.Log("Will attack " + this.heroes[this.enemyTarget].GetDisplayName());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnCardUsed(BaseCard card) {
|
public void NotifyCardUsed(BaseCard card) {
|
||||||
Debug.Log("OnCardUsed " + card);
|
Debug.Log("NotifyCardUsed " + card);
|
||||||
if (!CanUseCard(card)) {
|
if (!CanUseCard(card)) {
|
||||||
throw new System.InvalidOperationException("Cannot use card " + card.GetDisplayName());
|
throw new System.InvalidOperationException("Cannot use card " + card.GetDisplayName());
|
||||||
}
|
}
|
||||||
|
|
@ -129,11 +130,12 @@ public class BattleController : MonoBehaviour
|
||||||
public IEnumerator UseCard(BaseCard card) {
|
public IEnumerator UseCard(BaseCard card) {
|
||||||
yield return card.Use(battlePlayerControls);
|
yield return card.Use(battlePlayerControls);
|
||||||
PayCardCost(card);
|
PayCardCost(card);
|
||||||
|
this.heroDeck.DiscardPlayedCard(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OnTurnPassed() {
|
public void NotifyTurnPassed() {
|
||||||
if (this.heroTurn) {
|
if (this.heroTurn) {
|
||||||
Debug.Log("OnTurnPassed");
|
Debug.Log("NotifyTurnPassed");
|
||||||
StartEnemyTurn();
|
StartEnemyTurn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,9 +14,13 @@ public class BattlePlayerControls : MonoBehaviour
|
||||||
public delegate void TurnPassedAction();
|
public delegate void TurnPassedAction();
|
||||||
public event TurnPassedAction OnTurnPassed;
|
public event TurnPassedAction OnTurnPassed;
|
||||||
|
|
||||||
private List<BaseCard> cardsInHand;
|
private HeroDeck heroDeck;
|
||||||
private List<GameObject> cardsInHandUIs;
|
private List<GameObject> cardsInHandUIs;
|
||||||
|
|
||||||
|
public void Init(HeroDeck heroDeck) {
|
||||||
|
this.heroDeck = heroDeck;
|
||||||
|
}
|
||||||
|
|
||||||
// Start is called before the first frame update
|
// Start is called before the first frame update
|
||||||
void Start()
|
void Start()
|
||||||
{
|
{
|
||||||
|
|
@ -29,7 +33,13 @@ public class BattlePlayerControls : MonoBehaviour
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetHand(List<BaseCard> hand) {
|
private void SetHand(List<BaseCard> hand) {
|
||||||
|
if (this.cardsInHandUIs != null) {
|
||||||
|
foreach (GameObject cardInHandUI in this.cardsInHandUIs) {
|
||||||
|
Destroy(cardInHandUI);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.cardsInHandUIs = new List<GameObject>();
|
this.cardsInHandUIs = new List<GameObject>();
|
||||||
for (int i = 0; i < hand.Count; i++) {
|
for (int i = 0; i < hand.Count; i++) {
|
||||||
BaseCard card = hand[i];
|
BaseCard card = hand[i];
|
||||||
|
|
@ -87,4 +97,8 @@ public class BattlePlayerControls : MonoBehaviour
|
||||||
public bool IsTargeting() {
|
public bool IsTargeting() {
|
||||||
return this.waitingForTarget;
|
return this.waitingForTarget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void NotifyHandPileChanged() {
|
||||||
|
SetHand(this.heroDeck.GetHand());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -304,7 +304,7 @@ MonoBehaviour:
|
||||||
heroIds: 010000000000000002000000
|
heroIds: 010000000000000002000000
|
||||||
monsterIds: 000000000100000000000000
|
monsterIds: 000000000100000000000000
|
||||||
maxEnergy: 6
|
maxEnergy: 6
|
||||||
cardIds: 0000000000000000000000000000000001000000
|
cardIds: 00000000000000000000000000000000000000000100000001000000010000000100000001000000
|
||||||
heroUIPrefab: {fileID: 6641511084601005557, guid: ef1b469b45cedee418e4c4adf577cd00,
|
heroUIPrefab: {fileID: 6641511084601005557, guid: ef1b469b45cedee418e4c4adf577cd00,
|
||||||
type: 3}
|
type: 3}
|
||||||
uiCanvas: {fileID: 35522588}
|
uiCanvas: {fileID: 35522588}
|
||||||
|
|
|
||||||
102
Assets/Battle/HeroDeck.cs
Normal file
102
Assets/Battle/HeroDeck.cs
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public class HeroDeck
|
||||||
|
{
|
||||||
|
public const int DEFAULT_HAND_DRAWN = 5;
|
||||||
|
|
||||||
|
public delegate void PileChangedAction();
|
||||||
|
public event PileChangedAction OnDrawPileChanged;
|
||||||
|
public event PileChangedAction OnHandPileChanged;
|
||||||
|
public event PileChangedAction OnDiscardPileChanged;
|
||||||
|
|
||||||
|
// Piles are sorted from top to bottom.
|
||||||
|
private List<BaseCard> drawPile;
|
||||||
|
private List<BaseCard> handPile;
|
||||||
|
private List<BaseCard> discardPile;
|
||||||
|
|
||||||
|
public HeroDeck(CardId[] cardIds) {
|
||||||
|
this.drawPile = new List<BaseCard>();
|
||||||
|
this.handPile = new List<BaseCard>();
|
||||||
|
this.discardPile = new List<BaseCard>();
|
||||||
|
|
||||||
|
for (int i = 0; i < cardIds.Length; i++) {
|
||||||
|
BaseCard newCard = CardDatabase.CreateCard(cardIds[i]);
|
||||||
|
this.drawPile.Add(newCard);
|
||||||
|
}
|
||||||
|
this.drawPile.Shuffle();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<BaseCard> GetHand() {
|
||||||
|
return handPile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawHand() {
|
||||||
|
for (int i = 0; i < DEFAULT_HAND_DRAWN; i++) {
|
||||||
|
DrawCardInternal();
|
||||||
|
}
|
||||||
|
TriggerHandPileChanged();
|
||||||
|
TriggerDrawPileChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawCard() {
|
||||||
|
DrawCardInternal();
|
||||||
|
TriggerHandPileChanged();
|
||||||
|
TriggerDrawPileChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawCardInternal() {
|
||||||
|
if (this.drawPile.Count == 0) {
|
||||||
|
RemakeDrawPile();
|
||||||
|
// If there is still no draw pile, probably because no cards were in the discard pile, just
|
||||||
|
// skip the draw.
|
||||||
|
if (this.drawPile.Count == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseCard drawnCard = this.drawPile[0];
|
||||||
|
this.drawPile.RemoveAt(0);
|
||||||
|
this.handPile.Add(drawnCard);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DiscardPlayedCard(BaseCard card) {
|
||||||
|
if (!this.handPile.Contains(card)) {
|
||||||
|
throw new InvalidOperationException("Cannot discard card " + card.GetDisplayName()
|
||||||
|
+ " because not in hand.");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.discardPile.Insert(0, card);
|
||||||
|
this.handPile.Remove(card);
|
||||||
|
TriggerHandPileChanged();
|
||||||
|
TriggerDiscardPileChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DiscardHand() {
|
||||||
|
this.discardPile.InsertRange(0, this.handPile);
|
||||||
|
this.handPile.Clear();
|
||||||
|
TriggerHandPileChanged();
|
||||||
|
TriggerDiscardPileChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemakeDrawPile() {
|
||||||
|
this.drawPile.AddRange(this.discardPile);
|
||||||
|
this.discardPile.Clear();
|
||||||
|
|
||||||
|
this.drawPile.Shuffle();
|
||||||
|
TriggerDrawPileChanged();
|
||||||
|
TriggerDiscardPileChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TriggerDrawPileChanged() {
|
||||||
|
if (OnDrawPileChanged != null) OnDrawPileChanged();
|
||||||
|
}
|
||||||
|
private void TriggerHandPileChanged() {
|
||||||
|
if (OnHandPileChanged != null) OnHandPileChanged();
|
||||||
|
}
|
||||||
|
private void TriggerDiscardPileChanged() {
|
||||||
|
if (OnDiscardPileChanged != null) OnDiscardPileChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Assets/Battle/HeroDeck.cs.meta
Normal file
11
Assets/Battle/HeroDeck.cs.meta
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3bbe00a722dbb8641a68911a2b3bf542
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
18
Assets/ListShuffle.cs
Normal file
18
Assets/ListShuffle.cs
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
public static class ListShuffle
|
||||||
|
{
|
||||||
|
public static void Shuffle<T>(this IList<T> list)
|
||||||
|
{
|
||||||
|
int n = list.Count;
|
||||||
|
while (n > 1) {
|
||||||
|
int k = Random.Range(0, n);
|
||||||
|
n--;
|
||||||
|
T value = list[k];
|
||||||
|
list[k] = list[n];
|
||||||
|
list[n] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Assets/ListShuffle.cs.meta
Normal file
11
Assets/ListShuffle.cs.meta
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6b9dc1760fb65be41818a2f4372d9c01
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Loading…
Add table
Add a link
Reference in a new issue