Implement BattleEffects, add Thunderstorm

This commit is contained in:
henriquenakashima 2020-09-19 16:58:14 -04:00
parent fc427bd276
commit 00448fe919
20 changed files with 215 additions and 18 deletions

View file

@ -3,7 +3,8 @@ using System.Collections.Generic;
using UnityEngine;
public enum CardType {
Action
Action,
Enchantment,
}
public abstract class BaseCard
@ -24,18 +25,24 @@ public abstract class BaseCard
this.effectText = effectText;
}
public abstract IEnumerator Use(BattlePlayerControls playerControls);
public abstract IEnumerator Use(IBattleEffectApplier effectApplier, BattlePlayerControls playerControls);
public CardId GetId() {return id;}
public string GetDisplayName() {return displayName;}
public int GetCost() {return cost;}
public CardId GetId() {return this.id;}
public string GetDisplayName() {return this.displayName;}
public int GetCost() {return this.cost;}
public string GetDisplayType() {
switch (type) {
switch (this.type) {
case CardType.Action:
return "";
return "Action";
case CardType.Enchantment:
return "Enchantment";
default:
throw new System.ArgumentException("CardType unknown", "cardType");
}
}
public string GetEffectText() {return effectText;}
public string GetEffectText() {return this.effectText;}
public bool IsPermanent() {
return this.type == CardType.Enchantment;
}
}

View file

@ -2,7 +2,7 @@
using System.Collections.Generic;
using UnityEngine;
public class BattleController : MonoBehaviour
public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffectResolver
{
public HeroId[] heroIds;
public MonsterId[] monsterIds;
@ -13,6 +13,7 @@ public class BattleController : MonoBehaviour
public BattlePlayerControls battlePlayerControls;
private HeroDeck heroDeck;
private PlayArea playArea;
public BattleHero[] heroes;
private GameObject[] heroSprites;
@ -77,6 +78,8 @@ public class BattleController : MonoBehaviour
this.battlePlayerControls.OnCardUsed += this.NotifyCardUsed;
this.battlePlayerControls.OnTurnPassed += this.NotifyTurnPassed;
this.heroDeck.OnHandPileChanged += this.battlePlayerControls.NotifyHandPileChanged;
this.playArea = new PlayArea();
}
private BattleParticipant FindHeroByClass(HeroId heroId) {
@ -144,9 +147,14 @@ public class BattleController : MonoBehaviour
}
public IEnumerator UseCard(BaseCard card) {
yield return card.Use(battlePlayerControls);
yield return card.Use(this, battlePlayerControls);
PayCardCost(card);
this.heroDeck.DiscardPlayedCard(card);
this.heroDeck.RemoveCardFromHand(card);
if (card.IsPermanent()) {
this.playArea.AddPlayedHeroPermanent(card);
} else {
this.heroDeck.MoveCardToDiscard(card);
}
}
public void NotifyTurnPassed() {
@ -175,4 +183,18 @@ public class BattleController : MonoBehaviour
public HeroDeck GetHeroDeck() {
return this.heroDeck;
}
public PlayArea GetPlayArea() {
return this.playArea;
}
// IBattleEffectApplier
public void Apply(IBattleEffect effect) {
effect.Apply(this);
}
// IBattleEffectResolver
public void IncreaseMaxEnergy(int delta) {
this.maxEnergy += delta;
}
}

View file

@ -305,8 +305,7 @@ MonoBehaviour:
m_EditorClassIdentifier:
heroIds: 010000000000000002000000
monsterIds: 000000000100000000000000
maxEnergy: 1
cardIds: 00000000000000000000000000000000000000000100000001000000010000000100000001000000
cardIds: 00000000000000000000000000000000000000000100000001000000010000000100000002000000
heroUIPrefab: {fileID: 6641511084601005557, guid: ef1b469b45cedee418e4c4adf577cd00,
type: 3}
uiCanvas: {fileID: 35522588}

View file

@ -4,7 +4,8 @@ using UnityEngine;
public enum CardId {
CrashingPunch,
Cover
Cover,
Thunderstorm,
}
public class CardDatabase
@ -12,6 +13,7 @@ public class CardDatabase
private static Dictionary<CardId, HeroId> CARD_TO_HERO = new Dictionary<CardId, HeroId>() {
{CardId.CrashingPunch, HeroId.Brute},
{CardId.Cover, HeroId.Brute},
{CardId.Thunderstorm, HeroId.Shaman},
};
public static BaseCard CreateCard(CardId id, BattleParticipant owner) {
@ -21,6 +23,8 @@ public class CardDatabase
return new CardCrashingPunch(owner);
case CardId.Cover:
return new CardCover(owner);
case CardId.Thunderstorm:
return new CardThunderstorm(owner);
default:
throw new System.ArgumentException("CardId unknown", "id");
}

View file

@ -10,7 +10,7 @@ public class CardCover : BaseCard
}
public override IEnumerator Use(BattlePlayerControls playerControls) {
public override IEnumerator Use(IBattleEffectApplier effectApplier, BattlePlayerControls playerControls) {
SingleTargeting singleTargeting = new SingleTargeting(new OtherHeroTargetPolicy(this.owner));
yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting));
BattleParticipant target = singleTargeting.GetTarget();

View file

@ -9,7 +9,7 @@ public class CardCrashingPunch : BaseCard
"Deals 3 damage to target.") {
}
public override IEnumerator Use(BattlePlayerControls playerControls) {
public override IEnumerator Use(IBattleEffectApplier effectApplier, BattlePlayerControls playerControls) {
SingleTargeting singleTargeting = new SingleTargeting(new AnyTargetPolicy());
yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting));
BattleParticipant target = singleTargeting.GetTarget();

View file

@ -0,0 +1,17 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CardThunderstorm : BaseCard
{
public CardThunderstorm(BattleParticipant owner)
: base(owner, CardId.Thunderstorm, "Thunderstorm", 3, CardType.Enchantment,
"Adds 1 energy.") {
}
public override IEnumerator Use(IBattleEffectApplier effectApplier, BattlePlayerControls playerControls) {
Debug.Log("A storm is brewing.");
effectApplier.Apply(new IncreaseMaxEnergyEffect(1));
yield break;
}
}

View file

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

View file

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 96d74ab445eb27f42a7f7e774d3eb77f
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -0,0 +1,16 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IncreaseMaxEnergyEffect : IBattleEffect
{
private int delta;
public IncreaseMaxEnergyEffect(int delta) {
this.delta = delta;
}
public void Apply(IBattleEffectResolver bc) {
bc.IncreaseMaxEnergy(this.delta);
}
}

View file

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

View file

@ -70,15 +70,18 @@ public class HeroDeck
this.handPile.Add(drawnCard);
}
public void DiscardPlayedCard(BaseCard card) {
public void RemoveCardFromHand(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();
}
public void MoveCardToDiscard(BaseCard card) {
this.discardPile.Insert(0, card);
TriggerDiscardPileChanged();
}

View file

@ -0,0 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface IBattleEffect {
void Apply(IBattleEffectResolver controller);
}

View file

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

View file

@ -0,0 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface IBattleEffectApplier {
void Apply(IBattleEffect effect);
}

View file

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

View file

@ -0,0 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public interface IBattleEffectResolver {
void IncreaseMaxEnergy(int delta);
}

View file

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

34
Assets/Battle/PlayArea.cs Normal file
View file

@ -0,0 +1,34 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayArea
{
public delegate void PlayAreaChangedAction();
public event PlayAreaChangedAction OnPlayAreaChanged;
private List<BaseCard> heroPermanents;
public PlayArea() {
this.heroPermanents = new List<BaseCard>();
}
public List<BaseCard> GetHeroPermanents() {
return heroPermanents;
}
public void AddPlayedHeroPermanent(BaseCard permanent) {
this.heroPermanents.Add(permanent);
TriggerPlayAreaChanged();
}
public void RemoveHeroPermanent(BaseCard permanent) {
this.heroPermanents.Remove(permanent);
TriggerPlayAreaChanged();
}
private void TriggerPlayAreaChanged() {
if (OnPlayAreaChanged != null) OnPlayAreaChanged();
}
}

View file

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