Ejemplo n.º 1
0
    public override List <BattleUnit> AcquireAITargets(IntentSpell intent)
    {
        List <BattleUnit> units = new List <BattleUnit> {
            intent.actor
        };

        return(units);
    }
Ejemplo n.º 2
0
    protected List <BattleUnit> GetEnemies(IntentSpell intent)
    {
        List <BattleUnit> result = new List <BattleUnit>();

        foreach (BattleFaction faction in intent.battle.GetFactions())
        {
            if (!faction.GetUnits().Contains(intent.actor))
            {
                result.AddRange(faction.GetUnits());
            }
        }
        return(result);
    }
Ejemplo n.º 3
0
    // called repeatedly by the battle while ai units still have moves left
    public IEnumerator PlayNextAIActionRoutine()
    {
        BattleUnit actor = battle.GetFaction(Alignment.Enemy).NextMoveableUnit();

        yield return(actor.ActionStartRoutine());

        if (actor.IsDead())
        {
            yield break;
        }

        // TODO: AI

        Spell       spell  = RandomUtils.RandomItem(battle.r, actor.unit.spells);
        IntentSpell intent = new IntentSpell(battle, actor, spell);

        intent.AcquireAITargets();
        yield return(intent.ResolveRoutine());

        yield return(actor.ActionEndRoutine());

        actor.MarkActionTaken();
        yield return(null);
    }
Ejemplo n.º 4
0
    public override List <BattleUnit> AcquireAITargets(IntentSpell intent)
    {
        switch (targets)
        {
        case TargetType.All:
            return(intent.battle.AllUnits().ToList());

        case TargetType.AllAllies:
            return(GetAllies(intent));

        case TargetType.AllEnemies:
            return(GetEnemies(intent));

        case TargetType.AllNotSelf:
            return(Without(intent.battle.AllUnits().ToList(), intent.actor));

        case TargetType.Ally:
            return(RandomLiving(intent, GetAllies(intent)));

        case TargetType.AllyNotSelf:
            return(RandomLiving(intent, Without(GetAllies(intent), intent.actor)));

        case TargetType.Anyone:
        case TargetType.Enemy:
        case TargetType.AnyoneNotSelf:
            return(RandomLiving(intent, GetEnemies(intent)));

        case TargetType.Self:
            return(new List <BattleUnit> {
                intent.actor
            });

        default:
            return(null);
        }
    }
Ejemplo n.º 5
0
 public override void ModifyIntent(IntentSpell next)
 {
     next.AddPrefix(this);
 }
Ejemplo n.º 6
0
 public override void ConsumePrefixSpell(IntentSpell intent)
 {
     intent.spell.ModifyIntent(this);
 }
Ejemplo n.º 7
0
 public abstract void ConsumePrefixSpell(IntentSpell intent);
Ejemplo n.º 8
0
 public IEnumerator ResolveRoutine(IntentSpell intent, List <Prefix> prefixes)
 {
     this.intent   = intent;
     this.prefixes = prefixes;
     yield return(InternalResolveRoutine());
 }
Ejemplo n.º 9
0
    public IEnumerator SelectSpellsRoutine(Result <List <Intent> > result, BattleUnit hero)
    {
        List <Intent> queuedIntents  = new List <Intent>();
        List <Spell>  previousSpells = new List <Spell>();

        linker.SetUp((int)hero.Get(StatTag.MAP));
        yield return(spellSelect.EnableRoutine(hero.unit.spells));

        while (hero.Get(StatTag.AP) > 0)
        {
            linker.Populate(previousSpells);
            Result <Selectable> cardResult = new Result <Selectable>();
            yield return(spellSelect.SelectSpellRoutine(cardResult, previousSpells));

            if (cardResult.canceled)
            {
                // canceled the selection
                if (queuedIntents.Count > 0)
                {
                    Global.Instance().Audio.PlaySFX("cancel");
                    Intent canceled = queuedIntents.Last();
                    hero.unit.stats.Add(StatTag.AP, canceled.APCost());
                    queuedIntents.RemoveAt(queuedIntents.Count - 1);
                    previousSpells.RemoveAt(previousSpells.Count - 1);
                }
            }
            else if (cardResult.value.GetComponent <SpellCard>())
            {
                // selected a spell
                Spell spell = cardResult.value.GetComponent <SpellCard>().spell;
                linker.Populate(new List <Spell>(previousSpells)
                {
                    spell
                });
                if (hero.Get(StatTag.AP) > spell.apCost ||
                    (hero.Get(StatTag.AP) >= spell.apCost && !spell.LinksToNextSpell()))
                {
                    Global.Instance().Audio.PlaySFX("confirm");
                    hero.unit.stats.Sub(StatTag.AP, spell.apCost);
                    // find a target for the spell
                    Result <List <BattleUnit> > targetsResult = new Result <List <BattleUnit> >();
                    IntentSpell intent = new IntentSpell(this.battle, hero, spell);
                    yield return(intent.AcquireTargetsRoutine(targetsResult));

                    if (!targetsResult.canceled)
                    {
                        queuedIntents.Add(intent);
                        previousSpells.Add(spell);
                    }
                    else
                    {
                        hero.unit.stats.Add(StatTag.AP, spell.apCost);
                    }
                }
                else
                {
                    Global.Instance().Audio.PlaySFX("error");
                }
            }
            else
            {
                // selected the go ahead
                if (queuedIntents.Count > 0)
                {
                    Global.Instance().Audio.PlaySFX("confirm");
                    break;
                }
                else
                {
                    Global.Instance().Audio.PlaySFX("error");
                }
            }
        }
        yield return(spellSelect.DisableRoutine());

        result.value = queuedIntents;
    }
Ejemplo n.º 10
0
 public override void ModifyIntent(IntentSpell next)
 {
     Debug.Assert(false);
 }
Ejemplo n.º 11
0
 protected List <BattleUnit> GetAllies(IntentSpell intent)
 {
     return(intent.battle.UnitsByAlignment(intent.actor.align).ToList());
 }
Ejemplo n.º 12
0
 public abstract void ModifyIntent(IntentSpell next);
Ejemplo n.º 13
0
 public abstract List <BattleUnit> AcquireAITargets(IntentSpell intent);