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.CrashingPunch,
HCardId.CrashingPunch,
HCardId.CrashingPunch,
HCardId.BlindFury,
HCardId.Cover,
HCardId.Cover,
HCardId.Thunderstorm,
@ -290,7 +290,7 @@ public class BattleController : MonoBehaviour, IBattleEffectApplier, IBattleEffe
public IEnumerator UseHeroCard(HeroCard card) {
this.heroEnergy.PayForCard(card);
this.heroDeck.RemoveCardFromHand(card);
yield return card.Use(this, battlePlayerControls);
yield return card.Use(this, this, battlePlayerControls);
if (card.IsPermanent()) {
this.playArea.AddPlayedHeroPermanent(card);
} 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));
yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting));
BattleParticipant target = singleTargeting.GetTarget();

View file

@ -9,7 +9,8 @@ public class CrashingPunchHCard : HeroCard
"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());
yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting));
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());
yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting));
BattleParticipant target = singleTargeting.GetTarget();

View file

@ -9,7 +9,8 @@ public class LightningStrikeHCard : HeroCard
"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());
yield return playerControls.StartCoroutine(playerControls.ChooseTarget(singleTargeting));
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.") {
}
public override IEnumerator Use(
IBattleEffectApplier effectApplier, BattlePlayerControls playerControls) {
public override IEnumerator Use(IBattleEffectApplier effectApplier,
MonsterViewpoint viewpoint, BattlePlayerControls playerControls) {
effectApplier.Apply(new ModifyInsightEffect(+1));
yield return new WaitForSeconds(1f);
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.") {
}
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));
DamageTrigger trigger = new DamageTrigger(
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.") {
}
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 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;
}
}

View file

@ -12,7 +12,8 @@ public abstract class HeroCard : BaseCard
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;}
}

View file

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

View file

@ -6,18 +6,29 @@ public class AIUtils {
public static BattleHero GetNearestHero(MonsterViewpoint viewpoint,
BattleParticipant 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;
for (int i = 0; i < viewpoint.Heroes.Length; i++) {
if (!viewpoint.Heroes[i].IsAlive()) continue;
for (int i = 0; i < otherTeam.Length; i++) {
if (!otherTeam[i].IsAlive()) continue;
int distance = System.Math.Abs(i - ownerPosition);
if (distance < nearestDistance) {
nearestHeroIndex = i;
nearestIndex = i;
nearestDistance = distance;
}
}
return HeroAtIndex(nearestHeroIndex, viewpoint);
return ParticipantAtIndex(nearestIndex, otherTeam);
}
public static BattleHero GetFarthestHero(MonsterViewpoint viewpoint,
@ -34,7 +45,7 @@ public class AIUtils {
farthestDistance = distance;
}
}
return HeroAtIndex(farthestHeroIndex, viewpoint);
return ParticipantAtIndex(farthestHeroIndex, viewpoint.Heroes);
}
private static int GetMonsterPosition(MonsterViewpoint viewpoint, BattleParticipant monster) {
@ -44,6 +55,13 @@ public class AIUtils {
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) {
int highestHPHeroIndex = -1;
int highestHP = -1;
@ -55,11 +73,12 @@ public class AIUtils {
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;
return viewpoint.Heroes[index];
return team[index];
}
}