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 OnDefenseSkillResult OnDefense(Poring attacker, Poring poring, FaceDice faceDice)
    {
        if (faceDice == ActiveOnType && CurrentCD <= 0)
        {
            // Debug.LogError($"{poring.name} : {this.name}!!");
            float damage = 0;
            switch (DefenseType)
            {
            case DefenseTypeResult.None:
                damage = 0;
                break;

            case DefenseTypeResult.Counter:
                damage  = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk;
                damage *= poring.GetBlessingBuff();
                EffectReceiver maximizePower = poring.GetStatus(SkillStatus.MaximizePower);
                damage *= (maximizePower != null) ? maximizePower.Damage : 1;
                if (attacker.Node != poring.Node)
                {
                    DefenseType = DefenseTypeResult.None;
                    damage      = 0;
                }
                if (poring.CheckHasStatus(SkillStatus.Blind))
                {
                    damage = 0;
                }
                break;

            case DefenseTypeResult.Dodge:
                damage = 0;
                break;
            }

            return(new OnDefenseSkillResult()
            {
                Type = DefenseType,
                DamageType = DamageType,
                EffectStatusResults = SetEffectOwnerIdAndDamage(poring),
                DamageResult = damage,
                EffectOnSelf = EffectOnSelf,
                EffectOnTarget = EffectOnHit,
            });
        }
        else
        {
            return(new OnDefenseSkillResult()
            {
                Type = DefenseTypeResult.None,
                DamageType = DamageType,
                EffectStatusResults = new List <EffectReceiver>(),
                DamageResult = 0
            });
        }
    }
Exemple #3
0
    private bool CheckingEnableButtonByStatus(Poring poring)
    {
        // Skip turn.
        SkillStatus condition = SkillStatus.Sleep | SkillStatus.Freeze | SkillStatus.Stun;

        if (poring.CheckHasStatus(condition))
        {
            return(false);
        }

        // Can't move.
        condition = SkillStatus.Root;
        if (poring.CheckHasStatus(condition))
        {
            RollDiceBtn.gameObject.SetActive(false);
            if (!CancelSkillBtn.gameObject.activeInHierarchy)
            {
                SkipBtn.gameObject.SetActive(true);
            }
        }

        return(true);
    }
Exemple #4
0
    private void SetSkillsEvent(List <BaseSkill> skillList, Poring poring, int index)
    {
        BaseSkill ultimateSkill = poring.Property.UltimateSkill;

        UltimateSkillBtn.GetComponentInChildren <Text>().text = ultimateSkill.name;
        UltimateSkillBtn.GetComponent <SkillDetail>().SetDetail(ultimateSkill, poring);
        UltimateSkillBtn.onClick.RemoveAllListeners();
        UltimateSkillBtn.onClick.AddListener(() =>
        {
            SetActivePanel(false, currentPoring.Node.TileProperty.Type);
            ChangeModeToSelectTarget(ultimateSkill, poring, index);
        });

        BtnGroup.ForEach(group => {
            group.BtnObject.onClick.RemoveAllListeners();
            group.BtnObject.gameObject.SetActive(false);
        });

        for (int i = 0; i < skillList.Count; i++)
        {
            ButtonGroup group = BtnGroup[i];
            BaseSkill   skill = skillList[i];

            skill.CurrentCD--;
            group.BtnName.text = skill.name;
            group.BtnObject.gameObject.SetActive(true);

            var skillDetail = group.BtnObject.gameObject.GetComponent <SkillDetail>();
            skillDetail.SetDetail(skill, poring);

            group.BtnObject.interactable = (skill.CurrentCD <= 0 && skill.SkillMode == SkillMode.Activate);

            if (skill.MoveToTarget && poring.CheckHasStatus(SkillStatus.Root))
            {
                group.BtnObject.interactable = false;
            }

            group.BtnObject.onClick.AddListener(() =>
            {
                BtnGroup.ForEach(g => {
                    g.BtnObject.interactable = false;
                });
                UltimateSkillBtn.interactable = false;
                SetActivePanel(false, currentPoring.Node.TileProperty.Type);
                ChangeModeToSelectTarget(skill, poring, index);
            });
        }
    }
Exemple #5
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);
    }
    private void SkillEffectActivate(Poring poring, Poring targetPoring = null, Node targetNode = null)
    {
        float damageResult = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk;

        damageResult *= poring.GetBlessingBuff();
        EffectReceiver maximizePower = poring.GetStatus(SkillStatus.MaximizePower);

        damageResult *= (maximizePower != null) ? maximizePower.Damage : 1;
        damageResult *= DamageMultiple;

        if (poring.CheckHasStatus(SkillStatus.Blind) && targetNode == null)
        {
            damageResult = 0;
        }

        PrototypeGameMode.Instance.StartCoroutine(WaitForAnimation(poring, damageResult, targetPoring, targetNode));
    }
Exemple #7
0
    public override OnAttackSkillResult OnAttack(Poring poring, FaceDice faceDice)
    {
        EffectReceiver maximizePowerDef;

        if (faceDice == ActiveOnType && CurrentCD <= 0)
        {
            CurrentCD = TurnCD;
            float damage = 0;
            switch (AttackType)
            {
            case AttackTypeResult.None:
                damage = 0;
                break;

            case AttackTypeResult.Double:
                damage           = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk;
                damage          *= poring.GetBlessingBuff();
                maximizePowerDef = poring.GetStatus(SkillStatus.MaximizePower);
                damage          *= (maximizePowerDef != null) ? maximizePowerDef.Damage : 1;
                break;

            case AttackTypeResult.PowerUp:
                damage  = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk;
                damage *= poring.GetBlessingBuff();
                damage *= 2;

                maximizePowerDef = poring.GetStatus(SkillStatus.MaximizePower);
                damage          *= (maximizePowerDef != null) ? maximizePowerDef.Damage : 1;
                break;

            case AttackTypeResult.Enchant:
                damage           = (DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk;
                damage          *= poring.GetBlessingBuff();
                maximizePowerDef = poring.GetStatus(SkillStatus.MaximizePower);
                damage          *= (maximizePowerDef != null) ? maximizePowerDef.Damage : 1;
                break;
            }

            if (poring.CheckHasStatus(SkillStatus.Blind))
            {
                damage = 0;
            }

            return(new OnAttackSkillResult()
            {
                Type = AttackType,
                DamageType = DamageType,
                EffectStatusResults = SetEffectOwnerIdAndDamage(poring),
                DamageResult = damage,
                EffectOnSelf = EffectOnSelf,
                EffectOnTarget = EffectOnHit,
            });
        }
        else
        {
            return(new OnAttackSkillResult()
            {
                Type = AttackTypeResult.None,
                DamageType = DamageType,
                EffectStatusResults = new List <EffectReceiver>(),
                DamageResult = 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;
        }
    }