Convert HeroDeck into BattleDeck<HeroCard>

This commit is contained in:
henriquenakashima 2020-09-20 12:17:04 -04:00
parent c2e8b526b6
commit de072a80f7
8 changed files with 93 additions and 67 deletions

View file

@ -12,7 +12,9 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
public GameObject uiCanvas; public GameObject uiCanvas;
public BattlePlayerControls battlePlayerControls; public BattlePlayerControls battlePlayerControls;
private HeroDeck heroDeck; private HeroCardDatabase heroCardDatabase;
private MonsterCardDatabase monsterCardDatabase;
private BattleDeck<HeroCard> heroDeck;
private PlayArea playArea; private PlayArea playArea;
public BattleHero[] heroes; public BattleHero[] heroes;
@ -28,6 +30,9 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
private int energy; private int energy;
void Awake() { void Awake() {
this.heroCardDatabase = new HeroCardDatabase();
this.monsterCardDatabase = new MonsterCardDatabase();
heroes = new BattleHero[3]; heroes = new BattleHero[3];
heroSprites = new GameObject[3]; heroSprites = new GameObject[3];
heroUIs = new HeroInfoUI[3]; heroUIs = new HeroInfoUI[3];
@ -70,9 +75,9 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
BattleParticipant[] cardOwners = new BattleParticipant[this.cardIds.Length]; BattleParticipant[] cardOwners = new BattleParticipant[this.cardIds.Length];
for (int i = 0; i < this.cardIds.Length; i++) { for (int i = 0; i < this.cardIds.Length; i++) {
cardOwners[i] = FindHeroByClass(CardDatabase.GetHeroIdOfCard(this.cardIds[i])); cardOwners[i] = FindHeroByClass(HeroCardDatabase.GetHeroIdOfCard(this.cardIds[i]));
} }
this.heroDeck = new HeroDeck(this.cardIds, cardOwners); this.heroDeck = new BattleDeck<HeroCard>(this.heroCardDatabase, this.cardIds, cardOwners);
this.playArea = new PlayArea(); this.playArea = new PlayArea();
@ -127,7 +132,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
monster.ResetBlock(); monster.ResetBlock();
} }
MonsterCard card = MonsterCardDatabase.CreateCard(MCardId.VampireFangs, this.monsters[0]); MonsterCard card = this.monsterCardDatabase.CreateCard((int) MCardId.VampireFangs, this.monsters[0]);
StartCoroutine(UseMonsterCard(card)); StartCoroutine(UseMonsterCard(card));
StartHeroTurn(); StartHeroTurn();
@ -178,7 +183,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
return this.maxEnergy; return this.maxEnergy;
} }
public HeroDeck GetHeroDeck() { public BattleDeck<HeroCard> GetHeroDeck() {
return this.heroDeck; return this.heroDeck;
} }
@ -217,10 +222,10 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
public void AcquireHeroCards(AcquireCardsEffect effect) { public void AcquireHeroCards(AcquireCardsEffect effect) {
BattleHero hero = (BattleHero) effect.Participant; BattleHero hero = (BattleHero) effect.Participant;
foreach (CardId cardId in effect.CardIds) { foreach (CardId cardId in effect.CardIds) {
BaseCard acquiredCard = CardDatabase.CreateCard(cardId, hero); HeroCard acquiredCard = this.heroCardDatabase.CreateCard((int) cardId, hero);
switch (effect.Zone) { switch (effect.Zone) {
case BattleZone.DrawPile: case BattleZone.DrawPile:
this.GetHeroDeck().PutCardOnTopOfDrawPile(acquiredCard); this.heroDeck.PutCardOnTopOfDrawPile(acquiredCard);
break; break;
default: default:
throw new System.NotImplementedException(); throw new System.NotImplementedException();
@ -228,7 +233,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
} }
if (effect.Zone == BattleZone.DrawPile) { if (effect.Zone == BattleZone.DrawPile) {
this.GetHeroDeck().ShuffleDrawPile(); this.heroDeck.ShuffleDrawPile();
} }
} }

View file

@ -3,7 +3,7 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
public class HeroDeck public class BattleDeck<BaseCardT> where BaseCardT : BaseCard
{ {
public const int DEFAULT_HAND_DRAWN = 5; public const int DEFAULT_HAND_DRAWN = 5;
@ -13,31 +13,31 @@ public class HeroDeck
public event PileChangedAction OnDiscardPileChanged; public event PileChangedAction OnDiscardPileChanged;
// Piles are sorted from top to bottom. // Piles are sorted from top to bottom.
private List<BaseCard> drawPile; private List<BaseCardT> drawPile;
private List<BaseCard> handPile; private List<BaseCardT> handPile;
private List<BaseCard> discardPile; private List<BaseCardT> discardPile;
public HeroDeck(CardId[] cardIds, BattleParticipant[] cardOwners) { public BattleDeck(CardDatabase<BaseCardT> cardDatabase, CardId[] cardIds, BattleParticipant[] cardOwners) {
this.drawPile = new List<BaseCard>(); this.drawPile = new List<BaseCardT>();
this.handPile = new List<BaseCard>(); this.handPile = new List<BaseCardT>();
this.discardPile = new List<BaseCard>(); this.discardPile = new List<BaseCardT>();
for (int i = 0; i < cardIds.Length; i++) { for (int i = 0; i < cardIds.Length; i++) {
BaseCard newCard = CardDatabase.CreateCard(cardIds[i], cardOwners[i]); BaseCardT newCard = cardDatabase.CreateCard((int) cardIds[i], cardOwners[i]);
this.drawPile.Add(newCard); this.drawPile.Add(newCard);
} }
this.drawPile.Shuffle(); this.drawPile.Shuffle();
} }
public List<BaseCard> GetDrawPile() { public List<BaseCardT> GetDrawPile() {
return drawPile; return drawPile;
} }
public List<BaseCard> GetHandPile() { public List<BaseCardT> GetHandPile() {
return handPile; return handPile;
} }
public List<BaseCard> GetDiscardPile() { public List<BaseCardT> GetDiscardPile() {
return discardPile; return discardPile;
} }
@ -65,12 +65,12 @@ public class HeroDeck
} }
} }
BaseCard drawnCard = this.drawPile[0]; BaseCardT drawnCard = this.drawPile[0];
this.drawPile.RemoveAt(0); this.drawPile.RemoveAt(0);
this.handPile.Add(drawnCard); this.handPile.Add(drawnCard);
} }
public void RemoveCardFromHand(BaseCard card) { public void RemoveCardFromHand(BaseCardT card) {
if (!this.handPile.Contains(card)) { if (!this.handPile.Contains(card)) {
throw new InvalidOperationException("Cannot discard card " + card.GetDisplayName() throw new InvalidOperationException("Cannot discard card " + card.GetDisplayName()
+ " because not in hand."); + " because not in hand.");
@ -80,7 +80,7 @@ public class HeroDeck
TriggerHandPileChanged(); TriggerHandPileChanged();
} }
public void MoveCardToDiscard(BaseCard card) { public void MoveCardToDiscard(BaseCardT card) {
this.discardPile.Insert(0, card); this.discardPile.Insert(0, card);
TriggerDiscardPileChanged(); TriggerDiscardPileChanged();
} }
@ -92,7 +92,7 @@ public class HeroDeck
TriggerDiscardPileChanged(); TriggerDiscardPileChanged();
} }
public void PutCardOnTopOfDrawPile(BaseCard card) { public void PutCardOnTopOfDrawPile(BaseCardT card) {
this.drawPile.Insert(0, card); this.drawPile.Insert(0, card);
TriggerDrawPileChanged(); TriggerDrawPileChanged();
} }

View file

@ -15,12 +15,12 @@ public class BattlePlayerControls : MonoBehaviour
public delegate void TurnPassedAction(); public delegate void TurnPassedAction();
public event TurnPassedAction OnTurnPassed; public event TurnPassedAction OnTurnPassed;
private HeroDeck heroDeck; private BattleDeck<HeroCard> heroDeck;
private List<GameObject> cardsInHandUIs; private List<GameObject> cardsInHandUIs;
private PlayArea playArea; private PlayArea playArea;
private Dictionary<BaseCard, GameObject> cardsInPlayUIs; private Dictionary<BaseCard, GameObject> cardsInPlayUIs;
public void Init(HeroDeck heroDeck, PlayArea playArea) { public void Init(BattleDeck<HeroCard> heroDeck, PlayArea playArea) {
this.heroDeck = heroDeck; this.heroDeck = heroDeck;
this.playArea = playArea; this.playArea = playArea;

View file

@ -2,43 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using UnityEngine; using UnityEngine;
public enum CardId { public abstract class CardDatabase<BaseCardT> where BaseCardT : BaseCard
CrashingPunch,
Cover,
LightningStrike,
Scarring,
Thunderstorm,
}
public class CardDatabase
{ {
private static Dictionary<CardId, HeroId> CARD_TO_HERO = new Dictionary<CardId, HeroId>() { public abstract BaseCardT CreateCard(int id, BattleParticipant owner);
{CardId.CrashingPunch, HeroId.Brute},
{CardId.Cover, HeroId.Brute},
{CardId.LightningStrike, HeroId.Shaman},
{CardId.Scarring, HeroId.Brute},
{CardId.Thunderstorm, HeroId.Shaman},
};
public static HeroCard CreateCard(CardId id, BattleParticipant owner) {
switch (id)
{
case CardId.CrashingPunch:
return new CardCrashingPunch(owner);
case CardId.Cover:
return new CardCover(owner);
case CardId.LightningStrike:
return new CardLightningStrike(owner);
case CardId.Scarring:
return new CardScarring(owner);
case CardId.Thunderstorm:
return new CardThunderstorm(owner);
default:
throw new System.ArgumentException("CardId unknown", "id");
}
}
public static HeroId GetHeroIdOfCard(CardId id) {
return CARD_TO_HERO[id];
}
} }

View file

@ -0,0 +1,45 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum CardId {
CrashingPunch,
Cover,
LightningStrike,
Scarring,
Thunderstorm,
}
public class HeroCardDatabase : CardDatabase<HeroCard>
{
private static Dictionary<CardId, HeroId> CARD_TO_HERO = new Dictionary<CardId, HeroId>() {
{CardId.CrashingPunch, HeroId.Brute},
{CardId.Cover, HeroId.Brute},
{CardId.LightningStrike, HeroId.Shaman},
{CardId.Scarring, HeroId.Brute},
{CardId.Thunderstorm, HeroId.Shaman},
};
public override HeroCard CreateCard(int id, BattleParticipant owner) {
CardId heroCardId = (CardId) id;
switch (heroCardId)
{
case CardId.CrashingPunch:
return new CardCrashingPunch(owner);
case CardId.Cover:
return new CardCover(owner);
case CardId.LightningStrike:
return new CardLightningStrike(owner);
case CardId.Scarring:
return new CardScarring(owner);
case CardId.Thunderstorm:
return new CardThunderstorm(owner);
default:
throw new System.ArgumentException("CardId unknown", "id");
}
}
public static HeroId GetHeroIdOfCard(CardId id) {
return CARD_TO_HERO[id];
}
}

View file

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

View file

@ -6,10 +6,11 @@ public enum MCardId {
VampireFangs, VampireFangs,
} }
public static class MonsterCardDatabase public class MonsterCardDatabase : CardDatabase<MonsterCard>
{ {
public static MonsterCard CreateCard(MCardId id, BattleParticipant owner) { public override MonsterCard CreateCard(int id, BattleParticipant owner) {
switch (id) MCardId monsterCardId = (MCardId) id;
switch (monsterCardId)
{ {
case MCardId.VampireFangs: case MCardId.VampireFangs:
return new VampireFangsMCard(owner); return new VampireFangsMCard(owner);