IEnumerator Move2Position(BaseCharacter owner, AbilityInfo info, Vector3 position)
    {
        owner.OrderPosition = position;
        if (owner.Order == order)
        {
            yield break;
        }

        owner.Order = order;
        float distance = Vector2.Distance(owner.Position, owner.OrderPosition);

        while (owner.Radius < distance)
        {
            if (owner.Order != order)
            {
                break;
            }
            Vector3 dir = owner.OrderPosition - owner.Position;
            owner.SetAction(Move, dir);
            distance = Vector2.Distance(owner.Position, owner.OrderPosition);
            yield return(new WaitForFixedUpdate());
        }

        info.isUse = false;
        if (owner.Order == order || owner.Order == AbilityOrder.Idle)
        {
            owner.Order = AbilityOrder.Idle;
            owner.AddAnim( );
        }
    }
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;
    }
    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( ));
    }