示例#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 EffectReceiver(EffectReceiver baseObj)
 {
     OwnerId        = baseObj.OwnerId;
     EffectDuration = baseObj.EffectDuration;
     Status         = baseObj.Status;
     Particle       = baseObj.Particle;
     Damage         = baseObj.Damage;
 }
示例#3
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
            });
        }
    }
示例#4
0
    public float GetBlessingBuff()
    {
        EffectReceiver fx = m_currentEffects.Find(s => SkillStatus.Blessing == s.Status);

        if (fx != null)
        {
            return(fx.Damage);
        }
        else
        {
            return(1);
        }
    }
示例#5
0
    public EffectReceiver GetStatus(SkillStatus status)
    {
        EffectReceiver fx = m_currentEffects.Find(s => status == s.Status);

        if (fx != null)
        {
            return(fx);
        }
        else
        {
            return(null);
        }
    }
示例#6
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
        });
    }
示例#7
0
    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);
        }
    }
示例#8
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);
    }
示例#9
0
    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
        });
    }
示例#10
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));
    }
示例#11
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;
    }
示例#12
0
    public bool OnReceiverEffect(List <EffectReceiver> effectList)
    {
        foreach (EffectReceiver baseEffect in effectList)
        {
            EffectReceiver newEffect = new EffectReceiver(baseEffect);
            if ((int)newEffect.Status == 0)
            {
                if (!TakeDamage(PrototypeGameMode.Instance.GetPoringByIndex(newEffect.OwnerId), newEffect.Damage))
                {
                    return(false);
                }

                continue;
            }
            if (newEffect.Status.CheckHasStatus(SkillStatus.Posion) &&
                PrototypeGameMode.Instance.IsMineTurn())
            {
                newEffect.EffectDuration -= 1;
            }

            var v = m_currentEffects.Find(fx => fx.Status == newEffect.Status);
            if (v != null)
            {
                m_currentEffects[m_currentEffects.IndexOf(v)] = newEffect;
            }
            else
            {
                m_currentEffects.Add(newEffect);
                StatusIconData icon = new StatusIconData()
                {
                    status = newEffect.Status,
                    image  = StatusIconCreater.Instance.CreateIcon(newEffect.Status, iconRoot)
                };
                m_currentIconEffects.Add(icon);
            }
        }

        return(true);
    }
示例#13
0
    private bool TryHit(LogicEntity target)
    {
        EffectReceiver receiver = target.GetComponent <EffectReceiver>();

        if (receiver == null)
        {
            return(false);
        }
        LogicEntity releaser = EntityManager.Instance.GetEntity(this._releaserKey);

        if (releaser == null)
        {
            return(true);
        }
        AttrComponent attr = releaser.GetComponent <AttrComponent>();

        EffectData data = new EffectData();

        data.OpEntityKey = this._releaserKey;
        data.ChagneAttr  = new AttrPair[] { new AttrPair(Attr.Hp, attr.GetAttr(Attr.Attack)) };
        receiver.ReciveEffect(data);
        return(true);
    }