private void AddDamageToTarget(Poring poring, Poring targetPoring, float damage)
    {
        if (EffectOnHit != null)
        {
            InstantiateParticleEffect.CreateFx(EffectOnHit, targetPoring.transform.localPosition);
        }

        foreach (var s in StrongerList)
        {
            if (targetPoring.CheckHasStatus(s.Status))
            {
                damage *= s.DamageMultiple;
            }
        }

        bool isAlive = targetPoring.TakeDamage(poring, damage);

        if (isAlive)
        {
            isAlive = targetPoring.OnReceiverEffect(SetEffectOwnerIdAndDamage(poring));
        }

        if (!isAlive)
        {
            targetPoring.Behavior.Respawn();
        }
    }
Exemple #2
0
    public override void OnFinish(Poring poring, Node node)
    {
        var e = new EffectReceiver()
        {
            EffectDuration = 1,
            Status         = SkillStatus.Ambursh
        };

        InstantiateParticleEffect.CreateFx(particle, poring.transform.position);
        poring.OnReceiverEffect(new List <EffectReceiver>()
        {
            e
        });
    }
Exemple #3
0
    public bool AddPoring(Poring poring)
    {
        poring.transform.position = transform.position;
        poring.Node = this;
        porings.Add(poring);
        if (porings.Count > 1 &&
            porings[0].CheckHasStatus(SkillStatus.Ambursh) &&
            !poring.CheckHasStatus(SkillStatus.Ambursh))
        {
            porings[0].Animator.Play("Skill");
            float damage = porings[0].Property.CurrentPAtk;
            damage *= porings[0].GetBlessingBuff();
            EffectReceiver maximizePower = poring.GetStatus(SkillStatus.MaximizePower);
            damage *= (maximizePower != null) ? maximizePower.Damage : 1;
            if (porings[0].CheckHasStatus(SkillStatus.Blind))
            {
                damage = 0;
            }

            poring.TakeDamage(porings[0], damage, porings[0].Property.NormalAttackEffect);
        }

        TileProperty.OnEnter(poring, this);
        List <EffectReceiver> effectsResult = new List <EffectReceiver>();

        for (int i = 0; i < effectsOnTile.Count; i++)
        {
            BaseEffectOnTile      baseFx     = effectsOnTile[i];
            List <EffectReceiver> listEffect = baseFx.OnEnter(this);
            effectsResult.AddRange(listEffect);
        }
        bool isAlive = poring.OnReceiverEffect(effectsResult);

        if (!isAlive)
        {
            return(false);
        }
        foreach (var fx in effectsResult)
        {
            SkillStatus e = SkillStatus.Freeze | SkillStatus.Root | SkillStatus.Sleep | SkillStatus.Stun;
            if (fx.Status.CheckHasStatus(e))
            {
                return(false);
            }
        }
        return(true);
    }
    public override void OnEnter(Poring poring, Node node)
    {
        var e = new EffectReceiver()
        {
            OwnerId        = -1,
            Damage         = tileDamage,
            EffectDuration = 5,
            Status         = SkillStatus.Posion,
            Particle       = particle
        };

        InstantiateParticleEffect.CreateFx(particle, poring.transform.position);
        poring.OnReceiverEffect(new List <EffectReceiver>()
        {
            e
        });
    }
    private void AddDamageToTargetNode(Poring poring, float damage, Node node)
    {
        if (IsSelfOnly)
        {
            poring.OnReceiverEffect(SetEffectOwnerIdAndDamage(poring));
            return;
        }

        for (int i = 0; i < node.porings.Count; i++)
        {
            var target = node.porings[i];
            if (target == poring && IsIgnoreSelf)
            {
            }
            else
            {
                AddDamageToTarget(poring, target, damage);
            }
        }
    }
    private IEnumerator WaitForDiceResult()
    {
        yield return(new WaitUntil(() => Poring.OffensiveResultList.Count > 0 && Poring.Target.DeffensiveResultList.Count > 0));

        TurnFaceTo(Poring.Target.transform.position);
        hasAttack = true;
        OnAttackSkillResult  attackerDiceResult = CalculateAtackerDiceResult(Poring);
        OnDefenseSkillResult defenderDiceResult = CalculateDefenderDiceResult(Poring, Poring.Target);

        EffectReceiver maximizePower;

        switch (defenderDiceResult.Type)
        {
        case DefenseTypeResult.None:
            break;

        case DefenseTypeResult.Counter:
            Poring.Target.Animator.Play("Skill");
            yield return(waitSecond);

            maximizePower = Poring.Target.GetStatus(SkillStatus.MaximizePower);
            defenderDiceResult.DamageResult *= (maximizePower != null) ? maximizePower.Damage : 1;
            Poring.Property.CurrentHp       -= defenderDiceResult.DamageResult;

            if (defenderDiceResult.EffectOnTarget != null)
            {
                InstantiateParticleEffect.CreateFx(defenderDiceResult.EffectOnTarget, Poring.transform.localPosition);
            }

            if (Poring.TakeDamage(Poring.Target, defenderDiceResult.DamageResult))
            {
                yield return(waitSecond);

                Poring.OnReceiverEffect(defenderDiceResult.EffectStatusResults);

                if (!Poring.Target.Behavior.hasAttack && Poring.Node == Poring.Target.Node)
                {
                    Poring.Target.Target = Poring;
                    Poring.Target.Behavior.AttackTarget();
                    yield break;
                }
                else
                {
                    Poring.Target.Behavior.hasAttack = hasAttack = false;
                    Poring.Target.Target             = Poring.Target = null;

                    m_gameMode.CurrentGameState = eStateGameMode.EndTurn;
                    yield break;
                }
            }
            else
            {
                yield return(waitSecond);

                Poring.Behavior.Respawn();
                Poring.Target.Behavior.hasAttack = hasAttack = false;
                Poring.Target.Target             = Poring.Target = null;

                m_gameMode.CurrentGameState = eStateGameMode.EndTurn;
                yield break;
            }

        case DefenseTypeResult.Dodge:
            break;
        }

        float damageResult = AdaptiveDamageCalculate(Poring);

        damageResult  = AdaptiveDefenseCalculate(damageResult, Poring.Target);
        maximizePower = Poring.GetStatus(SkillStatus.MaximizePower);
        damageResult *= (maximizePower != null) ? maximizePower.Damage : 1;

        Poring.Animator.Play("Skill");
        yield return(waitSecond);

        switch (attackerDiceResult.Type)
        {
        case AttackTypeResult.None:
            break;

        case AttackTypeResult.Double:
        case AttackTypeResult.PowerUp:
        case AttackTypeResult.Enchant:
            InstantiateParticleEffect.CreateFx(attackerDiceResult.EffectOnTarget, Poring.Target.transform.localPosition);
            Poring.Target.OnReceiverEffect(attackerDiceResult.EffectStatusResults);
            break;
        }

        if (damageResult != 0 && Poring.Property.NormalAttackEffect != null)
        {
            InstantiateParticleEffect.CreateFx(Poring.Property.NormalAttackEffect, Poring.Target.transform.position);
        }

        if (Poring.Target.TakeDamage(Poring, damageResult))         // alive
        {
            yield return(waitSecond);

            if (!Poring.Target.Behavior.hasAttack &&
                Poring.Node == Poring.Target.Node &&
                !Poring.Target.CheckHasStatus(SkillStatus.Freeze | SkillStatus.Sleep | SkillStatus.Stun) && // target is not freeze, sleep, stun
                !Poring.CheckHasStatus(SkillStatus.Ambursh))                                                // Attacker is not ambursh
            {
                Poring.Target.Target = Poring;
                Poring.Target.Behavior.AttackTarget();
            }
            else
            {
                Poring.Target.Behavior.hasAttack = hasAttack = false;
                Poring.Target.Target             = Poring.Target = null;

                m_gameMode.CurrentGameState = eStateGameMode.EndTurn;
            }
        }
        else         // die
        {
            yield return(waitSecond);

            Poring.Target.Behavior.Respawn();
            Poring.Target.Behavior.hasAttack = hasAttack = false;
            Poring.Target.Target             = Poring.Target = null;

            m_gameMode.CurrentGameState = eStateGameMode.EndTurn;
        }
    }