void Owner_Damaged(BaseCharacter source, BaseCharacter target, DamageCalculator.DamageInfo info)
    {
        if (info.type != DamageCalculator.DamageType.Normal)
        {
            return;
        }

        var abilityInfo = source.caster.Get(index);

        if (abilityInfo.isUse)
        {
            return;
        }

        int attackCnt = abilityInfo.amount[0];

        if (++abilityInfo.usableAmount[0] < attackCnt)
        {
            abilityInfo.isUse = false;
            return;
        }
        else
        {
            abilityInfo.usableAmount[0] = 0;
        }

        source.StartCoroutine(Protected(source, abilityInfo));
    }
Example #2
0
    IEnumerator Spell(BaseCharacter owner, AbilityInfo info, Vector3 position)
    {
        owner.Audio.play(LoadManager.Instance.GetSFXData(SFXType.BossSkill).clip, 1F, 0F, 1F);

        owner.caster.abilityCast = true;
        info.isUse = true;

        owner.Order = order;
        owner.SetAnim( );
        owner.Anim_Event = false;
        while (owner.Anim_Event == false)
        {
            if (owner.Order != order || owner.IsDeath)
            {
                break;
            }
            yield return(null);
        }

        int cnt = info.amount[0];

        LayerMask            layerMask = GameLayerHelper.Layer(GameLayer.Actor);
        var                  col       = new Collider2D[MAX_COUNT];
        var                  actors    = Physics2D.OverlapCircleNonAlloc(position, Range, col, layerMask);
        List <BaseCharacter> targets   = new List <BaseCharacter> ( );

        for (int i = 0; i < actors; ++i)
        {
            BaseCharacter character = col[i].GetComponentInParent <BaseCharacter> ( );
            if (character == null || character.Equals(owner) || owner.Owner.IsAlliance(character.Owner) || character.IsDeath)
            {
                continue;
            }
            targets.Insert(Random.Range(0, targets.Count + 1), character);
        }

        GameObject vfx = LoadManager.Instance.GetVFX(VFXType.BossSkill);

        foreach (var t in targets)
        {
            Instantiate(vfx, t.Position, Quaternion.identity);
            DamageCalculator.DamageInfo damageInfo = new DamageCalculator.DamageInfo(DamageCalculator.DamageType.Magic);
            damageInfo.damage = 99999999;
            owner.damageCalculator.Damaged(t, damageInfo);
            if (--cnt == 0)
            {
                break;
            }
        }

        if (owner.Order == order || owner.Order == AbilityOrder.Idle)
        {
            owner.Order = AbilityOrder.Idle;
            owner.AddAnim( );
        }

        info.isUse = false;
        owner.caster.abilityCast = false;
    }
    private void Owner_Damaged(BaseCharacter source, BaseCharacter target, DamageCalculator.DamageInfo info)
    {
        if (info.type != DamageCalculator.DamageType.Normal)
        {
            return;
        }

        var abilityInfo = source.caster.Get(index);

        if (abilityInfo.isUse)
        {
            return;
        }
        abilityInfo.isUse = true;

        int cnt = abilityInfo.amount[0];

        LayerMask            layerMask = GameLayerHelper.Layer(GameLayer.Actor);
        var                  col       = new Collider2D[MAX_COUNT];
        var                  actors    = Physics2D.OverlapCircleNonAlloc(target.Position, Range, col, layerMask);
        List <BaseCharacter> targets   = new List <BaseCharacter> ( );

        for (int i = 0; i < actors; ++i)
        {
            BaseCharacter character = col[i].GetComponentInParent <BaseCharacter> ( );
            if (character == null || character.Equals(source) || character.Equals(target) || source.Owner.IsAlliance(character.Owner) || character.IsDeath)
            {
                continue;
            }
            targets.Insert(Random.Range(0, targets.Count + 1), character);
        }

        GameObject vfx = LoadManager.Instance.GetVFX(VFXType.BossSkill);

        foreach (var t in targets)
        {
            Instantiate(vfx, t.Position, Quaternion.identity);
            source.damageCalculator.Damaged(t, info);
            if (--cnt == 0)
            {
                break;
            }
        }
        abilityInfo.isUse = false;
    }
    IEnumerator Attack(BaseCharacter owner, AbilityInfo info, IActor target)
    {
        BaseCharacter targetCharacter = target as BaseCharacter;

        info.cooltime = owner.status.Get(ActorStatus.AtkCoolTime, true, true, true);

        owner.Order = order;
        owner.SetAnim( );
        owner.OnAttack(targetCharacter);
        owner.Anim_Event = false;
        while (owner.Anim_Event == false)
        {
            if (owner.Order != order || owner.IsDeath)
            {
                break;
            }
            yield return(null);
        }

        if (targetCharacter == null || targetCharacter.IsDeath)
        {
            owner.StartCoroutine(info.UpdateCoolTime( ));
            yield break;
        }

        Vector2 forward = new Vector3(owner.Forward, 0F);
        float   delta   = Mathf.Cos(90F * Mathf.Deg2Rad);
        Vector2 dir     = targetCharacter.Center - owner.Center;
        float   dot     = Vector2.Dot(forward, dir.normalized);

        if (dot > delta)
        {
            DamageCalculator.DamageInfo damageInfo = new DamageCalculator.DamageInfo(DamageCalculator.DamageType.Normal);
            damageInfo.damage = (int)owner.status.Get(ActorStatus.Atk, true, true, true);
            owner.damageCalculator.Damaged(targetCharacter, damageInfo);
        }

        if (owner.Order == order || owner.Order == AbilityOrder.Idle)
        {
            owner.Order = AbilityOrder.Idle;
            owner.AddAnim( );
        }

        owner.StartCoroutine(info.UpdateCoolTime( ));
    }
    void Owner_Damaged(BaseCharacter source, BaseCharacter target, DamageCalculator.DamageInfo info)
    {
        if (info.type != DamageCalculator.DamageType.Normal)
        {
            return;
        }

        var abilityInfo = source.caster.Get(index);

        if (abilityInfo.isUse)
        {
            return;
        }
        abilityInfo.isUse = true;

        int attackCnt = abilityInfo.amount[1];

        if (++abilityInfo.usableAmount[0] < attackCnt)
        {
            abilityInfo.isUse = false;
            return;
        }
        else
        {
            abilityInfo.usableAmount[0] = 0;
        }

        float atk = info.damage * (abilityInfo.amount[0] * 0.01f);

        info.trueDamage += atk;

        source.Audio.play(LoadManager.Instance.GetSFXData(SFXType.UndeadSkill).clip, 1F, 0F, 1F);
        GameObject vfx = LoadManager.Instance.GetVFX(VFXType.UndeadSkill);

        Instantiate(vfx, target.Center, Quaternion.identity);

        abilityInfo.isUse = false;
    }
Example #6
0
 public void RecordScore(BaseCharacter source, BaseCharacter target, DamageCalculator.DamageInfo info)
 {
     score += (int)RaidBoss.damageCalculator.Formula(info);
 }