コード例 #1
0
    /// <summary>
    /// Use every time before sent result of skill.
    /// </summary>
    public List <EffectReceiver> SetEffectOwnerIdAndDamage(Poring poring)
    {
        List <EffectReceiver> resultList = new List <EffectReceiver>();

        EffectsReceiver.ForEach(fx =>
        {
            float d = 0;
            if (fx.Damage == -1)
            {
                d  = ((DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk);
                d *= poring.GetBlessingBuff();
                EffectReceiver maximizePower = poring.GetStatus(SkillStatus.MaximizePower);
                d *= (maximizePower != null) ? maximizePower.Damage : 1;
                d *= DamageMultiple;
            }

            else
            {
                d = fx.Damage;
            }
            EffectReceiver result = new EffectReceiver()
            {
                OwnerId        = PrototypeGameMode.Instance.GetPoringIndexByPoring(poring),
                Damage         = d,
                EffectDuration = fx.EffectDuration,
                Status         = fx.Status,
                Particle       = fx.Particle
            };
            resultList.Add(result);
        });

        return(resultList);
    }
コード例 #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
            });
        }
    }
コード例 #3
0
ファイル: Node.cs プロジェクト: Fablelie/Prototype-DiceGame
    public void PoringKeepValueOnTile(Poring poring, bool ignoreOnFinish = false)
    {
        EffectReceiver maximizePower = poring.GetStatus(SkillStatus.MaximizePower);
        int            value         = (maximizePower != null) ? AppleList.Count / 2 : AppleList.Count;

        poring.Property.CurrentPoint += value;
        AppleList.ForEach(apple => DestroyImmediate(apple));
        AppleList.Clear();

        if (!ignoreOnFinish)
        {
            TileProperty.OnFinish(poring, this);
        }
    }
コード例 #4
0
ファイル: Node.cs プロジェクト: Fablelie/Prototype-DiceGame
    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);
    }
コード例 #5
0
    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));
    }
コード例 #6
0
    public void SetDetail(BaseSkill baseSkill, Poring poring)
    {
        float d = (baseSkill.DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk;

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

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

        Damage        = (int)((baseSkill.SkillMode == SkillMode.Activate) ? (baseSkill.DamageType == DamageType.PAtk) ? baseSkill.DamageMultiple * poring.Property.CurrentPAtk : baseSkill.DamageMultiple * poring.Property.CurrentMAtk : (baseSkill.DamageType == DamageType.PAtk) ? poring.Property.CurrentPAtk : poring.Property.CurrentMAtk);
        DamageType    = baseSkill.DamageType;
        TargetTypestr = (baseSkill.TargetType == TargetType.Another) ? "Poring" : baseSkill.TargetType.ToString();
        MoveToTarget  = baseSkill.MoveToTarget;
        AOE           = baseSkill.AOEValue;
        Range         = $"{baseSkill.MinRangeValue} - {baseSkill.MaxRangeValue}";
        CD            = baseSkill.TurnCD;
        Description   = baseSkill.Description;
    }
コード例 #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
            });
        }
    }
コード例 #8
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;
        }
    }