mixedcards/Assets/Battle/HeroDeck.cs

123 lines
3.4 KiB
C#

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, BattleParticipant[] cardOwners) {
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], cardOwners[i]);
this.drawPile.Add(newCard);
}
this.drawPile.Shuffle();
}
public List<BaseCard> GetDrawPile() {
return drawPile;
}
public List<BaseCard> GetHandPile() {
return handPile;
}
public List<BaseCard> GetDiscardPile() {
return discardPile;
}
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 RemoveCardFromHand(BaseCard card) {
if (!this.handPile.Contains(card)) {
throw new InvalidOperationException("Cannot discard card " + card.GetDisplayName()
+ " because not in hand.");
}
this.handPile.Remove(card);
TriggerHandPileChanged();
}
public void MoveCardToDiscard(BaseCard card) {
this.discardPile.Insert(0, card);
TriggerDiscardPileChanged();
}
public void DiscardHand() {
this.discardPile.InsertRange(0, this.handPile);
this.handPile.Clear();
TriggerHandPileChanged();
TriggerDiscardPileChanged();
}
public void PutCardOnTopOfDrawPile(BaseCard card) {
this.drawPile.Insert(0, card);
TriggerDrawPileChanged();
}
public void ShuffleDrawPile() {
this.drawPile.Shuffle();
TriggerDrawPileChanged();
}
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();
}
}