Ejemplo n.º 1
0
    public override void Execute(BattleSkillEvent eventInfo)
    {
        // Calculate resistance
        int resist = eventInfo.Target["Resist " + m_Element];

        if (resist > 0)
        {
            resist = resist < eventInfo.IgnoreResistance ? 0 : resist - eventInfo.IgnoreResistance;
        }

        // Calculate damage
        float baseDamage   = 0.01f * m_Power * (eventInfo.Power * (100 - resist));
        float baseCritical = m_Critical;

        float damage   = baseDamage;
        float critical = baseCritical;

        // Trigger pre-events
        BattleDamageEvent damageEventInfo = new BattleDamageEvent(
            BattleEvent.Type.BeforeTakeDamage,
            eventInfo.Manager,
            eventInfo.Time,
            eventInfo.Target,
            m_Element,
            Random.Range(0f, 1f) < critical ? 2 * Mathf.RoundToInt(damage) : Mathf.RoundToInt(damage)
            );

        eventInfo.Target.Damage(damageEventInfo);
    }
Ejemplo n.º 2
0
    public override void Execute(BattleManager manager, BattleQueueTime time)
    {
        BattleDamageEvent eventInfo = new BattleDamageEvent(
            BattleEvent.Type.BeforeTakeDamage,
            manager,
            time,
            m_Agent,
            m_Element,
            m_Damage
            );

        m_Agent.Damage(eventInfo);
    }
    public override void Execute(StatusEvent eventInfo)
    {
        BattleDamageEvent damageEventInfo = eventInfo.Event as BattleDamageEvent;

        if (damageEventInfo != null)
        {
            if (((damageEventInfo.Damage > 0 && m_Damaged) || (damageEventInfo.Damage < 0 && !m_Damaged)) &&
                (m_Element == Element.Null || damageEventInfo.Element == m_Element))
            {
                base.Execute(eventInfo);
            }
        }
    }
Ejemplo n.º 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);
    }