Example #1
0
        /// <summary>
        /// 获取目标,如果卡牌为单一目标则为选择到的敌人,否则根据卡牌效果返回目标
        /// </summary>
        /// <param name="target">卡牌效果攻击的目标</param>
        /// <param name="selectedEnemy">选择到的敌人</param>
        /// <returns>所有目标</returns>
        /// <exception cref="ArgumentOutOfRangeException"></exception>
        private IEnumerable <TargetableObject> GetTargets(EffectTargetType target, TargetableObject selectedEnemy)
        {
            var targets = new List <TargetableObject>(4);

            switch (@target)
            {
            case EffectTargetType.Self:
                targets.Add(player);
                break;

            case EffectTargetType.TargetEnemy:
                targets.Add(selectedEnemy);
                break;

            case EffectTargetType.AllEnemies:
                targets.AddRange(enemys);
                break;

            case EffectTargetType.All:
                targets.Add(player);
                targets.AddRange(enemys);
                break;

            case EffectTargetType.RandomEnemy:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(target), @target, null);
            }
            return(targets);
        }
Example #2
0
    /// <summary>
    /// 获取查找列表
    /// </summary>
    /// <param name="sourceType">源的类型</param>
    /// <param name="effectTarget">作用阵营</param>
    /// <returns>查找列表</returns>
    private List <ActorBevBase> GetFindList(ActorType sourceType, EffectTargetType effectTarget)
    {
        bool isPlayer = (sourceType == ActorType.Enemy && effectTarget == EffectTargetType.Rival) ||
                        (sourceType == ActorType.Player && effectTarget == EffectTargetType.Friend);

        return(this.GetFindList(isPlayer));
    }
Example #3
0
 public ApplyStatusEffect(int value_, EffectTargetType target_, int templateId)
 {
     Value          = value_;
     Target         = target_;
     statusTemplate = GameEntry.DataTable.GetDataTable <DRStatus>().GetDataRow(templateId);
     if (statusTemplate == null)
     {
         Log.Error("没获取到状态");
     }
 }
Example #4
0
        public EnemyData(int entityId, int typeId) : base(entityId, typeId)
        {
            var dtEnemy = GameEntry.DataTable.GetDataTable <DREnemy>();
            var drEnemy = dtEnemy.GetDataRow(typeId);

            if (drEnemy == null)
            {
                return;
            }

            _enemyName  = drEnemy.Name;
            _maxHp      = Utility.Random.GetRandom(drEnemy.HpMin, drEnemy.HpMax + 1);
            _defaultAtk = Utility.Random.GetRandom(drEnemy.AtkMin, drEnemy.AtkMax);
            var dtEnemyPattern = GameEntry.DataTable.GetDataTable <DREnemyPattern>();

            foreach (var t in drEnemy.Intent)
            {
                var           skillData  = dtEnemyPattern.GetDataRow(t);
                List <Effect> intentList = new List <Effect>();
                string        effName;
                for (int i = 0; i < skillData.EffectCount && (effName = skillData.GetEffectAt(i)) != "null"; i++)
                {
                    if (effName.Contains("_"))
                    {
                        _statusId = int.Parse(effName.Split('_')[1]);
                        effName   = effName.Substring(0, effName.IndexOf('_'));
                    }
                    var eff   = Utility.Assembly.GetType($"CardGame.{effName}Effect");
                    var value = skillData.GetValueAt(i);
                    EffectTargetType target = (EffectTargetType)skillData.GetTargetAt(i);
                    IntegerEffect    effect;
                    if (eff == typeof(ApplyStatusEffect))
                    {
                        effect = (IntegerEffect)Activator.CreateInstance(eff, value, target, _statusId);
                    }
                    else
                    {
                        effect = (IntegerEffect)Activator.CreateInstance(eff, value, target);
                    }
                    intentList.Add(effect);
                }
                enemyPattern.Add(intentList);
                _intentUI.Add(skillData.Icon);
            }

            intentRatio = drEnemy.IntentRatio;
            currentHP   = _maxHp;
        }
Example #5
0
    /// <summary>
    /// 查找属性最大的目标列表
    /// </summary>
    /// <param name="sourceType">源的类型</param>
    /// <param name="count">查找数量</param>
    /// <param name="effectTarget">查找阵营</param>
    /// <param name="attribute">参照属性</param>
    /// <returns>找到的目标列表</returns>
    public List <ActorBevBase> FindMaxAttribute(ActorType sourceType, byte count, EffectTargetType effectTarget, AttributeType attribute)
    {
        List <ActorBevBase> findList = this.GetFindList(sourceType, effectTarget);

        if (findList == null || findList.Count == 0)
        {
            return(null);
        }
        if (findList.Count <= count)
        {
            return(findList);
        }
        List <ActorBevBase> targetList = new List <ActorBevBase>();

        for (byte i = 0; i < count; i++)
        {
            ActorBevBase target = null;
            foreach (var tmpTarget in findList)
            {
                if (target == null)
                {
                    target = tmpTarget;
                }
                else
                {
                    if (tmpTarget.ActorLogicData.GetAttrbuteValueByType(attribute) > target.ActorLogicData.GetAttrbuteValueByType(attribute))
                    {
                        target = tmpTarget;
                    }
                    else if (tmpTarget.ActorLogicData.GetAttrbuteValueByType(attribute) == target.ActorLogicData.GetAttrbuteValueByType(attribute) &&
                             tmpTarget.Index < target.Index)
                    {
                        target = tmpTarget;
                    }
                }
            }
            findList.Remove(target);
            targetList.Add(target);
        }
        return(targetList);
    }
Example #6
0
    /// <summary>
    /// 查找随机目标列表
    /// </summary>
    /// <param name="sourceType">源的类型</param>
    /// <param name="count">查找数量</param>
    /// <param name="effectTarget">查找阵营</param>
    /// <returns>找到的目标列表</returns>
    public List <ActorBevBase> FindRandom(ActorType sourceType, byte count, EffectTargetType effectTarget)
    {
        List <ActorBevBase> findList = this.GetFindList(sourceType, effectTarget);

        if (findList == null || findList.Count == 0)
        {
            return(null);
        }
        if (findList.Count <= count)
        {
            return(findList);
        }
        List <ActorBevBase> targetList = new List <ActorBevBase>();

        for (byte i = 0; i < count; i++)
        {
            ActorBevBase target = findList[Random.Range(0, findList.Count)];
            findList.Remove(target);
            targetList.Add(target);
        }
        return(targetList);
    }
Example #7
0
    /// <summary>
    /// 查找最大十字形目标列表
    /// </summary>
    /// <param name="sourceType">源的类型</param>
    /// <param name="effectTarget">查找阵营</param>
    /// <param name="top">上</param>
    /// <param name="bottom">下</param>
    /// <param name="left">左</param>
    /// <param name="right">右</param>
    /// <returns>找到的目标列表</returns>
    public List <ActorBevBase> FindMaxCross(ActorType sourceType, EffectTargetType effectTarget, byte top, byte bottom, byte left, byte right)
    {
        List <ActorBevBase> findList = this.GetFindList(sourceType, effectTarget);

        if (findList == null || findList.Count == 0)
        {
            return(null);
        }
        List <ActorBevBase> targetList = null;

        for (byte x = 0; x < this.m_GridComp.XGridCount; x++)
        {
            for (byte z = 0; z < this.m_GridComp.ZGridCount; z++)
            {
                List <ActorBevBase> tmpTargetList = new List <ActorBevBase>();
                foreach (var tmpTarget in findList)
                {
                    if (tmpTarget.GridData.XGrid == x &&
                        (z - bottom) <= tmpTarget.GridData.ZGrid &&
                        tmpTarget.GridData.ZGrid <= (z + top))
                    {
                        tmpTargetList.Add(tmpTarget);
                    }
                    else if (tmpTarget.GridData.ZGrid == z &&
                             (x - left) <= tmpTarget.GridData.XGrid &&
                             tmpTarget.GridData.XGrid <= (x + right))
                    {
                        tmpTargetList.Add(tmpTarget);
                    }
                }
                if (targetList == null || tmpTargetList.Count > targetList.Count)
                {
                    targetList = tmpTargetList;
                }
            }
        }
        return(targetList);
    }
Example #8
0
    /// <summary>
    /// 查找最大矩形目标列表
    /// </summary>
    /// <param name="sourceType">源的类型</param>
    /// <param name="effectTarget">查找阵营</param>
    /// <param name="width">上(X)</param>
    /// <param name="height">宽(Z)</param>
    /// <returns>找到的目标列表</returns>
    public List <ActorBevBase> FindMaxRect(ActorType sourceType, EffectTargetType effectTarget, byte width, byte height)
    {
        List <ActorBevBase> findList = this.GetFindList(sourceType, effectTarget);

        if (findList == null || findList.Count == 0)
        {
            return(null);
        }
        if (width >= this.m_GridComp.XGridCount && height >= this.m_GridComp.ZGridCount)
        {
            return(findList);
        }

        //List<ActorBevBase> targetList = null;
        //for (byte x = 0; x <= this.m_GridComp.XGridCount - width; x++)
        //{
        //    for (byte z = 0; z <= this.m_GridComp.ZGridCount - height; z++)
        //    {
        //        List<ActorBevBase> tmpTargetList = new List<ActorBevBase>();
        //        foreach (var tmpTarget in findList)
        //        {
        //            if (x <= tmpTarget.GridData.XGrid && tmpTarget.GridData.XGrid < x + width
        //                && z <= tmpTarget.GridData.ZGrid && tmpTarget.GridData.ZGrid < z + height)
        //            {
        //                tmpTargetList.Add(tmpTarget);
        //            }
        //        }
        //        if (targetList == null || tmpTargetList.Count > targetList.Count)
        //        {
        //            targetList = tmpTargetList;
        //        }
        //    }
        //}
        //return targetList;

        return(this.GetTargetListWithRect(findList, 0, (byte)(this.m_GridComp.XGridCount - width), 0, (byte)(this.m_GridComp.ZGridCount - height), width, height));
    }
Example #9
0
 public GainShieldEffect(int value_, EffectTargetType target_)
 {
     Target = target_;
     Value  = value_;
 }
Example #10
0
    /// <summary>
    /// 查找最远的目标列表
    /// </summary>
    /// <param name="sourceType">源的类型</param>
    /// <param name="sourceGrid">源的格子数据</param>
    /// <param name="count">查找数量</param>
    /// <param name="effectTarget">查找阵营</param>
    /// <returns>找到的目标列表</returns>
    public List <ActorBevBase> FindFar(ActorType sourceType, GridData sourceGrid, byte count, EffectTargetType effectTarget)
    {
        List <ActorBevBase> findList = this.GetFindList(sourceType, effectTarget);

        if (findList == null || findList.Count == 0)
        {
            return(null);
        }
        if (findList.Count <= count)
        {
            return(findList);
        }
        List <ActorBevBase> targetList = new List <ActorBevBase>();

        if (effectTarget == EffectTargetType.Rival)
        {
            for (byte i = 0; i < count; i++)
            {
                ActorBevBase target = null;
                foreach (var tmpTarget in findList)
                {
                    if (target == null)
                    {
                        target = tmpTarget;
                    }
                    else
                    {
                        if (tmpTarget.GridData.ZGrid > target.GridData.ZGrid)
                        {
                            target = tmpTarget;
                        }
                        else if (tmpTarget.GridData.ZGrid == target.GridData.ZGrid &&
                                 Mathf.Abs(tmpTarget.GridData.XGrid - sourceGrid.XGrid) <= Mathf.Abs(tmpTarget.GridData.XGrid - sourceGrid.XGrid) &&
                                 tmpTarget.GridData.XGrid < target.GridData.XGrid)
                        {
                            target = tmpTarget;
                        }
                    }
                }
                findList.Remove(target);
                targetList.Add(target);
            }
        }
        else if (effectTarget == EffectTargetType.Friend)
        {
            for (byte i = 0; i < count; i++)
            {
                ActorBevBase target      = null;
                byte         maxDistance = byte.MaxValue;
                for (byte j = 0; j < findList.Count; j++)
                {
                    ActorBevBase tmpTarget = findList[j];
                    byte         distance  = sourceGrid.CalculateDistanceMagnitude(tmpTarget.GridData);
                    if (target == null)
                    {
                        target      = tmpTarget;
                        maxDistance = distance;
                    }
                    else
                    {
                        if (distance > maxDistance)
                        {
                            target      = tmpTarget;
                            maxDistance = distance;
                        }
                        else if (distance == maxDistance && tmpTarget.Index > target.Index)
                        {
                            target      = tmpTarget;
                            maxDistance = distance;
                        }
                    }
                }
                findList.Remove(target);
                targetList.Add(target);
            }
        }
        return(targetList);
    }
Example #11
0
 /// <summary>
 /// 获取所有目标列表
 /// </summary>
 /// <param name="sourceType">源的类型</param>
 /// <param name="effectTarget">作用阵营</param>
 /// <returns>所有目标列表</returns>
 public List <ActorBevBase> FindAll(ActorType sourceType, EffectTargetType effectTarget)
 {
     return(this.GetFindList(sourceType, effectTarget));
 }
Example #12
0
 public DealDamageEffect(int value, EffectTargetType target_)
 {
     Target = target_;
     Value  = value;
 }
Example #13
0
 public DrawCardEffect(int value_, EffectTargetType target_)
 {
     Value  = value_;
     Target = target_;
 }
Example #14
0
 public GainHpEffect(int value, EffectTargetType target_)
 {
     Target = target_;
     Value  = value;
 }