Implement BlindFury

This commit is contained in:
henriquenakashima 2020-09-24 01:01:21 -04:00
parent 626f465ca0
commit 281ad2dbc5
13 changed files with 82 additions and 21 deletions

View file

@ -43,7 +43,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
HCardId[] cardIds = new HCardId[10] { HCardId[] cardIds = new HCardId[10] {
HCardId.CrashingPunch, HCardId.CrashingPunch,
HCardId.CrashingPunch, HCardId.CrashingPunch,
HCardId.CrashingPunch, HCardId.BlindFury,
HCardId.Cover, HCardId.Cover,
HCardId.Cover, HCardId.Cover,
HCardId.Thunderstorm, HCardId.Thunderstorm,
@ -290,7 +290,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
public IEnumerator UseHeroCard(HeroCard card) { public IEnumerator UseHeroCard(HeroCard card) {
this.heroEnergy.PayForCard(card); this.heroEnergy.PayForCard(card);
this.heroDeck.RemoveCardFromHand(card); this.heroDeck.RemoveCardFromHand(card);
yield return card.Use(this, battlePlayerControls); yield return card.Use(this, this, battlePlayerControls);
if (card.IsPermanent()) { if (card.IsPermanent()) {
this.playArea.AddPlayedHeroPermanent(card); this.playArea.AddPlayedHeroPermanent(card);
} else { } else {

View file

@ -0,0 +1,19 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BlindFuryHCard : HeroCard
{
public BlindFuryHCard(BattleParticipant owner)
: base(owner, HCardId.BlindFury, "Blind Fury", 2, CardType.Attack,
"Deals 5 damage to target. -1 insight.") {
}
public override IEnumerator Use(IBattleEffectApplier effectApplier,
MonsterViewpoint viewpoint, BattlePlayerControls playerControls) {
BattleParticipant target = AIUtils.GetNearestMonster(viewpoint, this.owner);
effectApplier.Apply(new DealDamageEffect(target, 5));
effectApplier.Apply(new ModifyInsightEffect(-1));
yield break;
}
}

View file

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

View file

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

View file

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

View file

@ -10,7 +10,8 @@ public class IronskinDraughtHCard : HeroCard
} }
public override IEnumerator Use(IBattleEffectApplier effectApplier, BattlePlayerControls playerControls) { public override IEnumerator Use(IBattleEffectApplier effectApplier,
MonsterViewpoint viewpoint, BattlePlayerControls playerControls) {
SingleTargeting singleTargeting = new SingleTargeting(new AnyHeroTargetPolicy()); SingleTargeting singleTargeting = new SingleTargeting(new AnyHeroTargetPolicy());
yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting)); yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting));
BattleParticipant target = singleTargeting.GetTarget(); BattleParticipant target = singleTargeting.GetTarget();

View file

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

View file

@ -8,8 +8,8 @@ public class MeditateHCard : HeroCard
: base(owner, HCardId.Meditate, "Meditate", 2, CardType.Skill, "+1 insight. Draw a card.") { : base(owner, HCardId.Meditate, "Meditate", 2, CardType.Skill, "+1 insight. Draw a card.") {
} }
public override IEnumerator Use( public override IEnumerator Use(IBattleEffectApplier effectApplier,
IBattleEffectApplier effectApplier, BattlePlayerControls playerControls) { MonsterViewpoint viewpoint, BattlePlayerControls playerControls) {
effectApplier.Apply(new ModifyInsightEffect(+1)); effectApplier.Apply(new ModifyInsightEffect(+1));
yield return new WaitForSeconds(1f); yield return new WaitForSeconds(1f);
effectApplier.Apply(new DrawCardsEffect(1, TeamChoice.Heroes)); effectApplier.Apply(new DrawCardsEffect(1, TeamChoice.Heroes));

View file

@ -9,7 +9,8 @@ public class ScarringHCard : HeroCard
"Block 4 damage. The next time damage is taken until next turn, gain 1 Max HP.") { "Block 4 damage. The next time damage is taken until next turn, gain 1 Max HP.") {
} }
public override IEnumerator Use(IBattleEffectApplier effectApplier, BattlePlayerControls playerControls) { public override IEnumerator Use(IBattleEffectApplier effectApplier,
MonsterViewpoint viewpoint, BattlePlayerControls playerControls) {
effectApplier.Apply(new BlockEffect(this.owner, 4)); effectApplier.Apply(new BlockEffect(this.owner, 4));
DamageTrigger trigger = new DamageTrigger( DamageTrigger trigger = new DamageTrigger(
new List<BattleParticipant>() {this.owner}, new List<BattleParticipant>() {this.owner},

View file

@ -9,9 +9,12 @@ public class ThunderstormHCard : HeroCard
"Add 1 max energy. Acquire 2 Lightning Strike into draw pile.") { "Add 1 max energy. Acquire 2 Lightning Strike into draw pile.") {
} }
public override IEnumerator Use(IBattleEffectApplier effectApplier, BattlePlayerControls playerControls) { public override IEnumerator Use(IBattleEffectApplier effectApplier,
MonsterViewpoint viewpoint, BattlePlayerControls playerControls) {
effectApplier.Apply(new IncreaseMaxEnergyEffect(1)); effectApplier.Apply(new IncreaseMaxEnergyEffect(1));
effectApplier.Apply(new AcquireCardsEffect(new HCardId[] {HCardId.LightningStrike, HCardId.LightningStrike}, BattleZone.DrawPile, this.owner)); effectApplier.Apply(new AcquireCardsEffect(
new HCardId[] {HCardId.LightningStrike, HCardId.LightningStrike},
BattleZone.DrawPile, this.owner));
yield break; yield break;
} }
} }

View file

@ -12,7 +12,8 @@ public abstract class HeroCard : BaseCard
this.id = id; this.id = id;
} }
public abstract IEnumerator Use(IBattleEffectApplier effectApplier, BattlePlayerControls playerControls); public abstract IEnumerator Use(IBattleEffectApplier effectApplier,
MonsterViewpoint viewpoint, BattlePlayerControls playerControls);
public HCardId GetId() {return this.id;} public HCardId GetId() {return this.id;}
} }

View file

@ -29,6 +29,7 @@ public class HeroCardDatabase : CardDatabase<HeroCard>
{HCardId.LightningStrike, HeroId.Shaman}, {HCardId.LightningStrike, HeroId.Shaman},
{HCardId.Scarring, HeroId.Brute}, {HCardId.Scarring, HeroId.Brute},
{HCardId.Thunderstorm, HeroId.Shaman}, {HCardId.Thunderstorm, HeroId.Shaman},
{HCardId.BlindFury, HeroId.Brute},
{HCardId.Meditate, HeroId.Shaman}, {HCardId.Meditate, HeroId.Shaman},
{HCardId.IronskinDraught, HeroId.Alchemist}, {HCardId.IronskinDraught, HeroId.Alchemist},
}; };
@ -47,6 +48,8 @@ public class HeroCardDatabase : CardDatabase<HeroCard>
return new ScarringHCard(owner); return new ScarringHCard(owner);
case HCardId.Thunderstorm: case HCardId.Thunderstorm:
return new ThunderstormHCard(owner); return new ThunderstormHCard(owner);
case HCardId.BlindFury:
return new BlindFuryHCard(owner);
case HCardId.Meditate: case HCardId.Meditate:
return new MeditateHCard(owner); return new MeditateHCard(owner);
case HCardId.IronskinDraught: case HCardId.IronskinDraught:

View file

@ -6,18 +6,29 @@ public class AIUtils {
public static BattleHero GetNearestHero(MonsterViewpoint viewpoint, public static BattleHero GetNearestHero(MonsterViewpoint viewpoint,
BattleParticipant owner) { BattleParticipant owner) {
int ownerPosition = GetMonsterPosition(viewpoint, owner); int ownerPosition = GetMonsterPosition(viewpoint, owner);
return GetNearestEnemy(ownerPosition, viewpoint.Heroes);
}
int nearestHeroIndex = -1; public static BattleMonster GetNearestMonster(MonsterViewpoint viewpoint,
BattleParticipant owner) {
int ownerPosition = GetHeroPosition(viewpoint, owner);
return GetNearestEnemy(ownerPosition, viewpoint.Monsters);
}
private static ParticipantT GetNearestEnemy<ParticipantT>(
int ownerPosition, ParticipantT[] otherTeam)
where ParticipantT : BattleParticipant{
int nearestIndex = -1;
int nearestDistance = int.MaxValue; int nearestDistance = int.MaxValue;
for (int i = 0; i < viewpoint.Heroes.Length; i++) { for (int i = 0; i < otherTeam.Length; i++) {
if (!viewpoint.Heroes[i].IsAlive()) continue; if (!otherTeam[i].IsAlive()) continue;
int distance = System.Math.Abs(i - ownerPosition); int distance = System.Math.Abs(i - ownerPosition);
if (distance < nearestDistance) { if (distance < nearestDistance) {
nearestHeroIndex = i; nearestIndex = i;
nearestDistance = distance; nearestDistance = distance;
} }
} }
return HeroAtIndex(nearestHeroIndex, viewpoint); return ParticipantAtIndex(nearestIndex, otherTeam);
} }
public static BattleHero GetFarthestHero(MonsterViewpoint viewpoint, public static BattleHero GetFarthestHero(MonsterViewpoint viewpoint,
@ -34,7 +45,7 @@ public class AIUtils {
farthestDistance = distance; farthestDistance = distance;
} }
} }
return HeroAtIndex(farthestHeroIndex, viewpoint); return ParticipantAtIndex(farthestHeroIndex, viewpoint.Heroes);
} }
private static int GetMonsterPosition(MonsterViewpoint viewpoint, BattleParticipant monster) { private static int GetMonsterPosition(MonsterViewpoint viewpoint, BattleParticipant monster) {
@ -44,6 +55,13 @@ public class AIUtils {
return -1; return -1;
} }
private static int GetHeroPosition(MonsterViewpoint viewpoint, BattleParticipant hero) {
for (int i = 0; i < viewpoint.Heroes.Length; i++) {
if (viewpoint.Heroes[i] == hero) return i;
}
return -1;
}
public static BattleHero GetHeroWithHighestHP(MonsterViewpoint viewpoint) { public static BattleHero GetHeroWithHighestHP(MonsterViewpoint viewpoint) {
int highestHPHeroIndex = -1; int highestHPHeroIndex = -1;
int highestHP = -1; int highestHP = -1;
@ -55,11 +73,12 @@ public class AIUtils {
highestHP = heroHP; highestHP = heroHP;
} }
} }
return HeroAtIndex(highestHPHeroIndex, viewpoint); return ParticipantAtIndex(highestHPHeroIndex, viewpoint.Heroes);
} }
private static BattleHero HeroAtIndex(int index, MonsterViewpoint viewpoint) { private static ParticipantT ParticipantAtIndex<ParticipantT>(int index, ParticipantT[] team)
where ParticipantT : BattleParticipant {
if (index == -1) return null; if (index == -1) return null;
return viewpoint.Heroes[index]; return team[index];
} }
} }