/// <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); }
/// <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)); }
public ApplyStatusEffect(int value_, EffectTargetType target_, int templateId) { Value = value_; Target = target_; statusTemplate = GameEntry.DataTable.GetDataTable <DRStatus>().GetDataRow(templateId); if (statusTemplate == null) { Log.Error("没获取到状态"); } }
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; }
/// <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); }
/// <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); }
/// <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); }
/// <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)); }
public GainShieldEffect(int value_, EffectTargetType target_) { Target = target_; Value = value_; }
/// <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); }
/// <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)); }
public DealDamageEffect(int value, EffectTargetType target_) { Target = target_; Value = value; }
public DrawCardEffect(int value_, EffectTargetType target_) { Value = value_; Target = target_; }
public GainHpEffect(int value, EffectTargetType target_) { Target = target_; Value = value; }