mixedcards/Assets/Battle/TurnIntentions.cs
2020-10-01 22:52:50 -04:00

80 lines
2.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TurnIntentions<BaseCardT> where BaseCardT: BaseCard
{
public delegate void IntentionsChangedAction();
public event IntentionsChangedAction OnIntentionsChanged;
private BattleDeck<BaseCardT> mDeck;
private EnergyPool mEnergyPool;
private bool mActive;
private List<BaseCardT> mCardsToUse = new List<BaseCardT>();
public TurnIntentions(BattleDeck<BaseCardT> deck, EnergyPool energyPool,
HandPlayability<BaseCardT> playability) {
mDeck = deck;
mEnergyPool = energyPool;
mActive = true;
mDeck.OnDrawPileChanged += OnDependencyChanged;
mEnergyPool.OnEnergyChanged += OnDependencyChanged;
playability.OnPlayabilityChanged += OnDependencyChanged;
}
public void ResumeIntentions() {
mActive = true;
UpdateState();
TriggerOnIntentionsChanged();
}
public void PauseIntentions() {
mActive = false;
mCardsToUse.Clear();
TriggerOnIntentionsChanged();
}
private void OnDependencyChanged() {
if (mActive) {
UpdateState();
TriggerOnIntentionsChanged();
}
}
public bool WillUseCard(BaseCardT card) {
return mCardsToUse.Contains(card);
}
private void UpdateState() {
int projectedEnergy = mEnergyPool.Energy;
mCardsToUse.Clear();
List<BaseCardT> hand = mDeck.GetHandPile();
for (int i = 0; i < hand.Count; i++) {
BaseCardT card = hand[i];
if (card.Type == CardType.Emotion && card.Owner.CanUseCard(card)) {
projectedEnergy ++;
mCardsToUse.Add(card);
break;
}
}
for (int i = 0; i < hand.Count; i++) {
BaseCardT card = hand[i];
if (card.Type != CardType.Emotion
&& card.Owner.CanUseCard(card)
&& projectedEnergy >= card.GetCost()) {
projectedEnergy -= card.GetCost();
mCardsToUse.Add(card);
}
}
}
private void TriggerOnIntentionsChanged() {
if (OnIntentionsChanged != null) {
OnIntentionsChanged();
}
}
}