Ejemplo n.º 1
0
    private OnDefenseSkillResult CalculateDefenderDiceResult(Poring attacker, Poring poring)
    {
        OnDefenseSkillResult result   = new OnDefenseSkillResult(DefenseTypeResult.None, DamageType.PAtk, 0);
        FaceDice             faceDice = poring.Property.DeffensiveDices[0].GetDiceFace(poring.DeffensiveResultList[0]);

        poring.Property.SkillList.ForEach(skill =>
        {
            var subResult = skill.OnDefense(attacker, poring, faceDice);
            if (subResult.Type != DefenseTypeResult.None)
            {
                result = subResult;
            }
        });

        return(result);
    }
Ejemplo n.º 2
0
    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;
        }
    }