Example #1
0
    public override void Execute(BattleManager manager, BattleQueueTime time)
    {
        BattleQueueTime.Generator t = new BattleQueueTime.FiniteGenerator(time, Sequence.Count);

        foreach (BattleAction action in Sequence)
        {
            manager.Add(new BattleActionExecution(t.Generate(), action));
        }
    }
Example #2
0
    public override void Execute(BattleManager manager, BattleQueueTime time)
    {
        BattleQueueTime.Generator timeAllTargets = new BattleQueueTime.InfiniteGenerator(time);

        int hpcost = Mathf.RoundToInt(HPCost * Skill.Cost(Agent));
        int spcost = Mathf.RoundToInt(SPCost * Skill.Cost(Agent));

        if (Agent.HP <= hpcost || Agent.SP < spcost)
        {
            return;
        }
        Agent.HP -= hpcost;
        Agent.SP -= spcost;

        foreach (Vector2Int point in Target)
        {
            BattleTile tile = manager.grid[point];
            if (tile != null && tile.Actor != null)
            {
                BattleQueueTime.Generator timeThisTarget = new BattleQueueTime.FiniteGenerator(timeAllTargets.Generate(), 5);
                BattleAgent target = tile.Actor.Agent;

                // Trigger any events before the user uses the skill
                BattleSkillEvent eventInfo = new BattleSkillEvent(
                    BattleEvent.Type.BeforeUseSkill,
                    manager,
                    timeThisTarget.Generate(),
                    Agent,
                    target,
                    Skill
                    );
                eventInfo.Power = Mathf.RoundToInt(eventInfo.Power * Power);
                Agent.OnTrigger(eventInfo);

                // Trigger any events before the target is targeted by the skill
                eventInfo.Time  = timeThisTarget.Generate();
                eventInfo.Event = BattleEvent.Type.BeforeTargetedBySkill;
                target.OnTrigger(eventInfo);

                // Animate the skill
                if (Skill.Animation != null)
                {
                    manager.Add(new BattleSpecialEffectAnimation(timeThisTarget.Generate(), Skill.Animation, eventInfo.Target));
                }

                // Make the skill happen
                eventInfo.Time = timeThisTarget.Generate();
                Skill.Execute(eventInfo);

                // Trigger any events after the target is targeted by the skill
                eventInfo.Time  = timeThisTarget.Generate();
                eventInfo.Event = BattleEvent.Type.AfterTargetedBySkill;
                target.OnTrigger(eventInfo);
            }
        }
    }
Example #3
0
    public override bool QUpdate(BattleManager manager)
    {
        if (m_Agent.CP < 100)
        {
            return(true);
        }

        BattleAction decision = m_Decider.Update();

        if (decision != null)
        {
            BattleQueueTime.Generator t = new BattleQueueTime.FiniteGenerator(time - 1, 2);
            decision.Execute(manager, t.Generate());

            time = t.Generate();
            manager.Add(this);

            return(true);
        }

        return(false);
    }
Example #4
0
    /// <summary>
    /// Cause the agent to take damage.
    /// </summary>
    /// <param name="eventInfo">Information about the damage to be taken</param>
    public void Damage(BattleDamageEvent eventInfo)
    {
        BattleQueueTime.Generator time = new BattleQueueTime.FiniteGenerator(eventInfo.Time, 3);

        string message = eventInfo.Damage < 0 ? (-eventInfo.Damage).ToString() : eventInfo.Damage.ToString();
        Color  color   = Color.white;

        // Pre-events
        eventInfo.Event = BattleEvent.Type.BeforeTakeDamage;
        eventInfo.Time  = time.Generate();
        OnTrigger(eventInfo);

        // CP damage
        if (eventInfo.Affects == BattleDamageEvent.DamageTo.CP)
        {
            CP -= eventInfo.Damage;
            if (CP < 0)
            {
                CP = 0;
            }
            if (CP > 100)
            {
                CP = 100;
            }

            message += " CP";
        }

        // SP damage
        if (eventInfo.Affects == BattleDamageEvent.DamageTo.SP)
        {
            SP -= eventInfo.Damage;
            if (SP < 0)
            {
                SP = 0;
            }
            if (SP > this["SP"])
            {
                SP = this["SP"];
            }

            message += " SP";
        }

        // HP damage
        if (eventInfo.Affects == BattleDamageEvent.DamageTo.HP)
        {
            int hp = HP - eventInfo.Damage;

            if (hp <= 0)
            {
                if (HP > 0) // Inflict critical status
                {
                    Inflict(AssetHolder.StatusEffects["Critical"], 1, time.Generate(), "Critical");
                }
                else if (eventInfo.Damage > 1) // Inflict KO status
                {
                    Inflict(AssetHolder.StatusEffects["KO"], int.MaxValue, time.Generate(), "KO");
                }

                HP = 0;
                CP = 0;

                message = "";
            }
            else
            {
                if (hp > this["HP"])
                {
                    HP = this["HP"];
                }
                else
                {
                    HP = hp;
                }
            }
        }

        // Show damage taken
        if (!message.Equals(""))
        {
            eventInfo.Manager.Add(new BattleShowAgentMessage(
                                      time.Generate(),
                                      eventInfo.Manager,
                                      this,
                                      message,
                                      color
                                      ));
        }

        // Post-effects
        eventInfo.Event = BattleEvent.Type.AfterTakeDamage;
        eventInfo.Time  = time.Generate();
        OnTrigger(eventInfo);
    }