Exemplo n.º 1
0
    public override void Execute(BattleSkillEvent eventInfo)
    {
        Status status = AssetHolder.StatusEffects[m_StatusEffect];

        float baseDuration = m_Power * eventInfo.Power;

        if (status.Resistible)
        {
            int resist = eventInfo.Target["Resist " + status.Element];

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

            baseDuration *= 0.01f * (100 - resist);
        }

        int duration = Mathf.FloorToInt(baseDuration);

        if (Random.Range(0f, 1f) < baseDuration - duration)
        {
            ++duration;
        }

        if (duration > 0)
        {
            eventInfo.Target.Inflict(status, duration, eventInfo.Time, m_StatusEffect);
        }
        else
        {
            eventInfo.Manager.Add(new BattleShowAgentMessage(eventInfo.Time, eventInfo.Manager, eventInfo.Target, "Miss"));
        }
    }
Exemplo n.º 2
0
    /*
     * public BattleManhattanDistanceZone Range(BattleAgent user)
     * {
     *  switch (m_Range)
     *  {
     *      case "Self":
     *          return new BattleManhattanDistanceZone(user.Coordinates, 0, 0);
     *      case "Adjacent":
     *          return new BattleManhattanDistanceZone(user.Coordinates, 1, 1);
     *      case "Weapon":
     *          Weapon primary = user.BaseCharacter.PrimaryWeapon;
     *
     *          if (primary != null)
     *          {
     *              if (primary.Type == WeaponType.Bow)
     *                  return new BattleManhattanDistanceZone(user.Coordinates, 2, 4);
     *              else if (primary.Type == WeaponType.Gun)
     *                  return new BattleManhattanDistanceZone(user.Coordinates, 2, 8);
     *          }
     *
     *          return new BattleManhattanDistanceZone(user.Coordinates, 1, 1);
     *      case "Radius":
     *          return new BattleManhattanDistanceZone(user.Coordinates, 0, user["Range " + Type]);
     *      case "All":
     *          return new BattleManhattanDistanceZone(user.Coordinates, 0, int.MaxValue);
     *  }
     *
     *  throw new System.ArgumentException("[Skill] Unrecognized range type: \"" + m_Range + "\"");
     * }
     *
     * public BattleManhattanDistanceZone Target(BattleAgent user, Vector2Int center)
     * {
     *  switch (m_Target)
     *  {
     *      case "Single":
     *          return new BattleManhattanDistanceZone(center, 0, 0);
     *      case "Area":
     *          return new BattleManhattanDistanceZone(center, 0, user["Area " + Type]);
     *      case "All":
     *          return Range(user);
     *  }
     *
     *  throw new System.ArgumentException("[Skill] Unrecognized target type: \"" + m_Target + "\"");
     * }
     */

    public void Execute(BattleSkillEvent eventInfo)
    {
        foreach (SkillEffect effect in Effects)
        {
            effect.Execute(eventInfo);
        }
    }
Exemplo n.º 3
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);
    }
Exemplo n.º 4
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);
            }
        }
    }
Exemplo n.º 5
0
    public override void Execute(StatusEvent eventInfo)
    {
        BattleSkillEvent skillEvent = eventInfo.Event as BattleSkillEvent;

        if (skillEvent != null)
        {
            skillEvent.Target = skillEvent.User;
            skillEvent.Power  = Mathf.RoundToInt(skillEvent.Power * m_Power);
        }
    }
Exemplo n.º 6
0
    public override void Execute(StatusEvent eventInfo)
    {
        BattleSkillEvent skillEvent = eventInfo.Event as BattleSkillEvent;

        if (skillEvent != null)
        {
            skillEvent.IgnoreResistance += m_IgnoreResistance;
            Debug.Log("Activated.");
        }
    }
    public override void Execute(StatusEvent eventInfo)
    {
        BattleSkillEvent skillEventInfo = eventInfo.Event as BattleSkillEvent;

        if (skillEventInfo != null)
        {
            Skill skill = skillEventInfo.Skill;
            if (skill.Type.StartsWith(m_Type) && skill.Element.StartsWith(m_Element))
            {
                base.Execute(eventInfo);
            }
        }
    }
Exemplo n.º 8
0
    public override void Execute(BattleSkillEvent eventInfo)
    {
        float k             = 0.7f + (0.2f * Accuracy * eventInfo.User["Accuracy"]) - (0.2f * eventInfo.Target["Evasion"]);
        float baseHitChance = 0.5f * (1f + Erf(k));

        float hitChance = baseHitChance;

        if (Random.Range(0f, 1f) < hitChance)
        {
            foreach (SkillEffect effect in Effects)
            {
                effect.Execute(eventInfo);
            }
        }
        else
        {
            eventInfo.Manager.Add(new BattleShowAgentMessage(eventInfo.Time, eventInfo.Manager, eventInfo.Target, "Miss"));
        }
    }
Exemplo n.º 9
0
    public override void Execute(BattleSkillEvent eventInfo)
    {
        BattleManager manager = GameObject.FindObjectOfType <BattleManager>();

        manager.Add(new BattleShowAgentReport(eventInfo.Time, eventInfo.Target));
    }
Exemplo n.º 10
0
 public abstract void Execute(BattleSkillEvent eventInfo);