コード例 #1
0
        private int SetRecoveryAndGetOverRecovery(int _value, UnitCtrl _source, BasePartsData _target, bool _isMagic)
        {
            eInhibitHealType eInhibit = _isMagic ? eInhibitHealType.MAGIC : eInhibitHealType.PHYSICS;

            SetRecovery(_value, eInhibit, _source, true, false, false, false, true, _target);
            return((int)(Hp + _value - BaseValues.Hp));
        }
コード例 #2
0
        public virtual void Initialize(BasePartsData _target, List <ActionParameter> _actions, Skill _skill, List <NormalSkillEffect> _skillEffect, UnitCtrl _owner, float _height, bool _hasBlackOutTime, bool _isAbsolute, Vector3 _targetPosition, List <ShakeEffect> _shakes, eTargetBone _targetBone)
        {
            ShakeEffects = _shakes;
            IsAbsolute   = _isAbsolute;
            Skill        = _skill;
            Vector3 pos = _targetPosition;

            if (!IsAbsolute)
            {
                if (_targetBone == eTargetBone.FIXED_CENETER || _targetBone == eTargetBone.CENTER)
                {
                    pos = _target.GetButtontransformPosition() + _target.GetFixedCenterPos();
                }
                if (_targetBone == eTargetBone.BOTTOM)
                {
                    pos = _target.GetButtontransformPosition();
                }
                if (_targetBone == eTargetBone.HEAD)
                {
                    pos = GetHeadBonePos(_target);
                }
            }
            TargetPos  = pos;
            FireTarget = _target;
            _target.Owner.FirearmCtrlsOnMe.Add(this);
            SkillHitEffects = _skillEffect;
            EndActions      = _actions;
            owner           = _owner;
            SetInitialPosition();
            InitMoveType(_height, _owner);
            float distance = Vector3.Distance(TargetPos, initialPosistion) + 1;

            owner.StartCoroutine(UpdatePosition(distance));
        }
コード例 #3
0
 public void ExecChildrenAction(ActionParameter action, Skill skill, BasePartsData target, int num, float starttime, Dictionary <int, bool> enabledChildAction)
 {
     foreach (int idx in action.ActionChildrenIndexes)
     {
         ActionParameter childAction = skill.ActionParmeters[idx];
         if (childAction.ActionType != eActionType.MODE_CHANGE || childAction.ActionDetail1 != 3)
         {
             if (!enabledChildAction.ContainsKey(childAction.ActionId) || enabledChildAction[childAction.ActionId])
             {
                 if (action.ActionType != eActionType.ATTACK || action.ExecTime.Length - 1 == num)
                 {
                     //简化调用协程的流程
                     StartCoroutine(ExecActionWithDelayAndTarget(childAction, skill, target, starttime, false, true, false));
                 }
             }
         }
     }
 }
コード例 #4
0
 //UnitActionController__createNormalEffectPrefab调用
 public virtual void SetPossitionAppearanceType(NormalSkillEffect skillEffect, BasePartsData target, UnitCtrl _owner, Skill skill)
 {
 }
コード例 #5
0
 public void SetRecovery(int _value, eInhibitHealType _inhibitHealType, UnitCtrl _source, bool _isEffect = true, bool _isRevival = false, bool _isUnionBurstLifeSteal = false, bool _isRegenerate = false, bool _useNumberEffect = true, BasePartsData _target = null)
 {
     if (_target == null)
     {
         _target = GetFirstParts(true, 0);
     }
     if ((isDead || Hp <= 0) && !_isRevival)
     {
         Debug.LogError("治疗无效,目标已经死了!");
     }
     else
     {
         if (_inhibitHealType != eInhibitHealType.NO_EFFECT && IsAbnormalState(eAbnormalState.INHIBIT_HEAL))
         {
             if (GetAbnormalStateMainValue(eAbnormalStateCategory.INHIBIT_HEAL) != 0)
             {
                 DamageData damageData_0 = new DamageData();
                 damageData_0.Target     = GetFirstParts(this != null, 0);
                 damageData_0.Damage     = Mathf.FloorToInt(GetAbnormalStateMainValue(eAbnormalStateCategory.INHIBIT_HEAL) * _value);
                 damageData_0.DamageType = eDamageType.NONE;
                 AbnormalStateCategoryData abdata = abnormalStateCategoryDataDictionary[eAbnormalStateCategory.INHIBIT_HEAL];
                 damageData_0.Source         = abdata.Source;
                 damageData_0.DamageNumMagic = _inhibitHealType == eInhibitHealType.MAGIC;
                 damageData_0.ActionType     = eActionType.INHIBIT_HEAL;
                 SetDamage(damageData_0, false, abdata.ActionId, null, true, abdata.Skill, true, null, false, 1, 1, null);
             }
         }
         else
         {
             Hp += _value;
             //AppendbattleLog;
             if (Hp > BaseValues.Hp)
             {
                 Hp = BaseValues.Hp;
             }
             unitUI.SetHP(Hp / BaseValues.Hp);
             string msg = UnitName + "恢复<color=#00FF00>" + _value + "</color>生命";
             BattleUIManager.Instance.LogMessage(msg, eLogMessageType.HP_RECOVERY, IsOther);
             if (_isUnionBurstLifeSteal)
             {
                 unionburstLifeStealNum += _value;
             }
             else
             {
                 if (_useNumberEffect)
                 {
                     //特效数字
                 }
                 if (_isEffect)
                 {
                     //治疗特效
                 }
             }
         }
     }
 }
コード例 #6
0
        /// <summary>
        /// 判断目标是否在范围内(未完成)
        /// </summary>
        /// <param name="actionParameter"></param>
        /// <param name="basePosition">FIXEDPOSITION</param>
        /// <param name="considerbodywidth"></param>
        /// <param name="parentLossyScale"></param>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <param name="unitCtrl"></param>
        /// <returns></returns>
        private bool JudgeIsInTargetArea(ActionParameter actionParameter, Vector3 basePosition, bool considerbodywidth,
                                         float parentLossyScale, float start, float end, BasePartsData unitCtrl)
        {
            if (!unitCtrl.GetTargetable())
            {
                return(false);
            }
            float distance = Mathf.Abs((unitCtrl.GetPosition().x - basePosition.x) / parentLossyScale);
            float dis2     = unitCtrl.GetBodyWidth();

            if (considerbodywidth)
            {
                dis2 += Owner.BodyWidth;
            }
            if (distance >= start - 0.5f * dis2 && distance <= dis2 * 0.5f + end)
            {
                return(true);
            }
            return(actionParameter.Direction == DirectionType.ALL);
        }
コード例 #7
0
        /// <summary>
        /// 按有限度要求对目标列表进行排序
        /// </summary>
        /// <param name="actionParameter"></param>
        /// <param name="baaseTransform"></param>
        /// <param name="value"></param>
        /// <param name="quiet"></param>
        private void SortTargetListByTargetPattern(ActionParameter actionParameter, Transform baaseTransform, float value, bool quiet)
        {
            List <BasePartsData> targetList = actionParameter.TargetList;
            SortFunction         sort       = (a, b) => a.GetButtontransformPosition().x > b.GetButtontransformPosition().x ? 1 :
                                              (a.GetButtontransformPosition().x < b.GetButtontransformPosition().x ?-1:0);

            switch (actionParameter.TargetSort)
            {
            case PirorityPattern.RANDOM:
            case PirorityPattern.RANDOM_ONCE:
            case PirorityPattern.ALL_SUMMON_RANDOM:
            case PirorityPattern.OWN_SUMMON_RANDOM:
                if (targetList.Count >= 2)
                {
                    for (int i = targetList.Count - 1; i > 0; i--)
                    {
                        int           random = staticBattleManager.Random(0, i);
                        BasePartsData a      = targetList[random];
                        BasePartsData b      = targetList[i];
                        targetList[random] = b;
                        targetList[i]      = a;
                    }
                }
                return;

            case PirorityPattern.NEAR:
                sort = (a, b) => a.GetButtontransformPosition().x > b.GetButtontransformPosition().x ? 1 :
                       (a.GetButtontransformPosition().x < b.GetButtontransformPosition().x ? -1 : 0);
                break;

            case PirorityPattern.FAR:
                sort = (a, b) => a.GetButtontransformPosition().x < b.GetButtontransformPosition().x ? 1 :
                       (a.GetButtontransformPosition().x > b.GetButtontransformPosition().x ? -1 : 0);
                break;

            case PirorityPattern.HP_ASC:
                sort = ((a, b) => a.Owner.Hp > b.Owner.Hp ? 1 : (a.Owner.Hp < b.Owner.Hp ? -1 : 0));
                break;

            case PirorityPattern.HP_DEC:
                sort = ((a, b) => a.Owner.Hp < b.Owner.Hp ? 1 : (a.Owner.Hp > b.Owner.Hp ? -1 : 0));
                break;

            case PirorityPattern.OWNER:
                targetList.Clear();
                targetList.Add(Owner.GetFirstParts(Owner, -1024));
                return;

            case PirorityPattern.FORWARD:
            case PirorityPattern.BACK:
                if ((actionParameter.TargetSort == PirorityPattern.FORWARD ^ Owner.IsOther) ^ Owner.IsConfusionOrConvert)
                {
                    sort = ((a, b) => a.Owner.FixedPosition.x < b.Owner.FixedPosition.x ? 1 :
                            (a.Owner.FixedPosition.x > b.Owner.FixedPosition.x ? -1 :0));
                }
                else
                {
                    sort = ((a, b) => a.Owner.FixedPosition.x > b.Owner.FixedPosition.x ? 1 :
                            (a.Owner.FixedPosition.x < b.Owner.FixedPosition.x ? -1 : 0));
                }
                break;

            case PirorityPattern.ABSOLUTE_POSITION:
                targetList.Clear();
                targetList.Add(Owner.GetFirstParts(true, 0));
                return;

            case PirorityPattern.ENERGY_DEC_NEAR:
            case PirorityPattern.ENERGY_DEC:
                sort = ((a, b) => a.Owner.Energy < b.Owner.Energy ? 1 : (a.Owner.Energy > b.Owner.Energy ? -1 :0));
                QuichSortTargetList(targetList, sort);
                List <BasePartsData> full    = new List <BasePartsData>();
                List <BasePartsData> notfull = new List <BasePartsData>();
                foreach (BasePartsData a in targetList)
                {
                    if (a.Owner.Energy == 1000)
                    {
                        full.Add(a);
                    }
                    else
                    {
                        notfull.Add(a);
                    }
                }
                notfull.AddRange(full);
                targetList = notfull;
                return;

            case PirorityPattern.ENERGY_REDUCING:
            case PirorityPattern.ENERGY_ASC:
                sort = ((a, b) => a.Owner.Energy > b.Owner.Energy ? 1 : (a.Owner.Energy < b.Owner.Energy ? -1 : 0));
                break;

            case PirorityPattern.ATK_DEC:
                sort = ((a, b) => a.Owner.BaseValues.Atk < b.Owner.BaseValues.Atk ? 1 :
                        (a.Owner.BaseValues.Atk > b.Owner.BaseValues.Atk ? -1:0));
                break;

            case PirorityPattern.ATK_ASC:
                sort = ((a, b) => a.Owner.BaseValues.Atk > b.Owner.BaseValues.Atk ? 1 :
                        (a.Owner.BaseValues.Atk < b.Owner.BaseValues.Atk ? -1 : 0));
                break;

            case PirorityPattern.MAGIC_STR_DEC:
                sort = ((a, b) =>
                        a.Owner.BaseValues.Magic_str < b.Owner.BaseValues.Magic_str ? 1 :
                        (a.Owner.BaseValues.Magic_str > b.Owner.BaseValues.Magic_str ?-1:0));
                break;

            case PirorityPattern.MAGIC_STR_ASC:
                sort = ((a, b) =>
                        a.Owner.BaseValues.Magic_str > b.Owner.BaseValues.Magic_str ? 1 :
                        (a.Owner.BaseValues.Magic_str < b.Owner.BaseValues.Magic_str ? -1:0));
                break;

            case PirorityPattern.BOSS:
                Debug.LogError("以BOSS为优先度的排序鸽了!");
                return;

            case PirorityPattern.HP_ASC_NEAR:
                sort = ((a, b) => a.Owner.Hp > b.Owner.Hp ? 1 : (a.Owner.Hp < b.Owner.Hp ? -1 : 0));
                Debug.LogError("该排序暂时不考虑距离!");
                break;

            case PirorityPattern.HP_DEC_NEAR:
                sort = ((a, b) => a.Owner.Hp < b.Owner.Hp ? 1 : (a.Owner.Hp > b.Owner.Hp ? -1 : 0));
                break;

            case PirorityPattern.MAGIC_STR_DEC_NEAR:
                sort = ((a, b) =>
                        a.Owner.BaseValues.Magic_str < b.Owner.BaseValues.Magic_str ? 1 :
                        (a.Owner.BaseValues.Magic_str > b.Owner.BaseValues.Magic_str ? -1 : 0));
                Debug.LogError("该排序暂时不考虑距离!");
                break;

            case PirorityPattern.SHADOW:
                Debug.LogError("以SHADOW为优先度的排序鸽了!");
                return;

            case PirorityPattern.ATK_MAGIC:
                //也就新年u1有这个还是群体,不排序也无所谓
                break;



            default:
                //sort = ((a, b) => a.GetButtontransformPosition().x < b.GetButtontransformPosition().x ? 1 : -1);

                //Debug.LogError("以" + actionParameter.TargetSort.ToString() + "为优先度的排序鸽了!");
                break;
            }
            QuichSortTargetList(targetList, sort);
        }
コード例 #8
0
        /// <summary>
        /// 搜索目标单位(根据技能的assisment,area,range,考虑召唤物类型的sort),添加所有符合条件的战斗单位为目标)
        /// </summary>
        /// <param name="actionParameter"></param>
        /// <param name="basePosition"></param>
        /// <param name="skill"></param>
        /// <param name="considerBodyWidth"></param>
        private void SearchTargetUnit(ActionParameter actionParameter, Vector3 basePosition, Skill skill, bool considerBodyWidth)
        {
            actionParameter.TargetList.Clear();
            List <UnitCtrl> targetEnemyList  = (Owner.IsOther ^ Owner.IsConfusionOrConvert) ? staticBattleManager.PlayersList : staticBattleManager.EnemiesList;
            List <UnitCtrl> targetPlayetList = Owner.IsOther ? staticBattleManager.EnemiesList : staticBattleManager.PlayersList;
            List <UnitCtrl> targetList_default;

            if (actionParameter.TargetAssignment == eTargetAssignment.OTHER_SIDE)
            {
                targetList_default = targetEnemyList;
            }
            else
            {
                targetList_default = targetPlayetList;
            }
            //根据优先度先筛选一部分目标
            switch (actionParameter.TargetSort)
            {
            case PirorityPattern.ALL_SUMMON_RANDOM:
            case PirorityPattern.SUMMON:
                targetList_default = targetList_default.FindAll(a => a.SummonType == eSummonType.SUMMON || a.SummonType == eSummonType.PHANTOM);
                break;

            case PirorityPattern.ATK_PHYSICS:
                targetList_default = targetList_default.FindAll(a => a.AtkType == 1);
                break;

            case PirorityPattern.ATK_MAGIC:
                targetList_default = targetList_default.FindAll(a => a.AtkType == 2);
                break;

            case PirorityPattern.OWN_SUMMON_RANDOM:
                targetList_default.Clear();
                foreach (UnitCtrl unitCtrl in Owner.SummonUnitDictionary.Values)
                {
                    targetList_default.Add(unitCtrl);
                }
                targetList_default = targetList_default.FindAll(a => !(a.IdleOnly || a.IsDead));
                break;

            default:
                break;
            }
            if (actionParameter.TargetSort == PirorityPattern.FORWARD || actionParameter.TargetSort == PirorityPattern.BACK)
            {
                foreach (UnitCtrl unit in targetList_default)
                {
                    if (JudgeIsTarget(unit, actionParameter))
                    {
                        if (unit.IsPartsBoss)
                        {
                            Debug.LogError("咕咕咕!");
                        }
                        else
                        {
                            actionParameter.TargetList.Add(unit.GetFirstParts(false, 0));
                        }
                    }
                }
                return;
            }
            bool  dir = actionParameter.Direction == DirectionType.FRONT ? !Owner.IsLeftDir : false;
            float searchTargetWidth = actionParameter.TargetWidth;

            if (searchTargetWidth <= 0)
            {
                if (skill.SkillId == 1)
                {
                    searchTargetWidth = Owner.SearchAreaWidth;
                }
                else
                {
                    searchTargetWidth = skill.skillAreaWidth;
                }
            }
            float         start = dir ? 0 : -1 * searchTargetWidth;
            BasePartsData item  = null;

            foreach (UnitCtrl unit1 in targetList_default)
            {
                if (unit1.IsPartsBoss)
                {
                    Debug.LogError("咕咕咕!");
                }
                else
                {
                    if (JudgeIsInTargetArea(actionParameter, basePosition, considerBodyWidth,
                                            1, start, actionParameter.TargetWidth, unit1.GetFirstParts(false, 0)))
                    {
                        if (JudgeIsTarget(unit1, actionParameter))
                        {
                            actionParameter.TargetList.Add(unit1.GetFirstParts(false, 0));
                        }
                        else
                        {
                            if (unit1.Hp > 0)
                            {
                                item = unit1.GetFirstParts(false, 0);
                            }
                        }
                    }
                }
            }
            if (actionParameter.TargetSort == PirorityPattern.NEAR)
            {
                if (item != null && actionParameter.TargetList.Count == 0)
                {
                    if (!Owner.IsConfusionOrConvert)
                    {
                        actionParameter.TargetList.Add(item);
                    }
                }
            }
        }
コード例 #9
0
        private void SearchAndSortTarget(Skill skill, ActionParameter action, Vector3 basePosition, bool quiet, bool considerBodyWidth)
        {
            SearchTargetUnit(action, basePosition, skill, considerBodyWidth);
            SortTargetListByTargetPattern(action, Owner.transform, action.Value[1], false);
            int v19 = 0;
            int i;

            for (i = 0; ; i = 1)
            {
                if (v19 >= action.TargetList.Count - action.TargetNth)
                {
                    break;
                }
                action.TargetList[v19] = action.TargetList[action.TargetNth + v19];
                v19++;
            }
            if (i == 1)
            {
                int v28 = action.TargetList.Count;
                for (int j = v28; j > v28 - action.TargetNth; j--)
                {
                    action.TargetList.RemoveAt(j - 1);//移除重复目标
                }
            }
            else
            {
                if (action.TargetNth > 0)
                {
                    if (action.TargetList.Count > 0)//如果目标数量小于最小优先度,选取最接近的目标代替
                    {
                        BasePartsData target = action.TargetList[action.TargetList.Count - 1];
                        action.TargetList.Clear();
                        action.TargetList.Add(target);
                    }
                }
            }

            /*if(action.TargetAssignment == eTargetAssignment.OWNER_SIDE && action.TargetNum == 1&&action.TargetList.Count>0)
             * {//在ExecUnitActionWithDelay里会判定目标数量
             *  BasePartsData target = action.TargetList[0];
             *  action.TargetList.Clear();
             *  action.TargetList.Add(target);
             * }*/
            //如果不是对敌方的单目标技能,结束
            if (action.TargetAssignment != eTargetAssignment.OTHER_SIDE || action.TargetNum != 1)
            {
                action.isSearchAndSorted = true;
                return;
            }
            //对于对敌单目标技能,判断距离
            if (action.TargetList.Count > 1)
            {
                BasePartsData target = action.TargetList[0];
                action.TargetList.Clear();
                action.TargetList.Add(target);
            }

            /*if (!Owner.IsOther)
             * {
             *  if (Owner.IsConfusionOrConvert)
             *  {
             *      //
             *  }
             * }*/
            action.isSearchAndSorted = true;
        }
コード例 #10
0
        public void ExecAction(ActionParameter action, Skill skill, BasePartsData target, int num, float starttime)
        {
            //int index = skill.ActionParmeters.FindIndex(a => a == action)+1;
            //int index2 = skill.ActionParmeters.Count;
            //string loging = Owner.UnitName + "执行技能" + skill.SkillName  + "(" + index + "/" + index2 + ")"
            //    + ",目标"  + target.Owner.UnitName;
            //Debug.Log(loging);
            //BattleUIManager.Instance.LogMessage(loging, Owner.IsOther);
            Dictionary <int, float> valueDic = new Dictionary <int, float>
            {
                { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 }
            };

            for (int i = 1; i < 8; i++)
            {
                float addValue  = 0;
                float multValue = 1;
                float divVale   = 1;
                if (action.AdditionalValue.TryGetValue(i, out float add))
                {
                    addValue = add;
                }
                if (action.MultipleValue.TryGetValue(i, out float mult))
                {
                    multValue = mult;
                }
                if (action.DivideValue.TryGetValue(i, out float div))
                {
                    divVale = div == 0 ? 1 : div;
                }
                valueDic[i] = (((action.Value.TryGetValue(i, out float value)?value:0) + addValue) * multValue) / divVale;
            }
            bool v52 = action.JudgeLastAndNotExeced(target.Owner, num);
            int  v34 = action.AlreadyExecedData[target.Owner][num].TargetPartsNumber;
            Dictionary <int, bool> enabledChildaction = new Dictionary <int, bool>();

            if (!target.ResistStatus(action.ActionType, action.ActionDetail1, this.Owner, v52, v34 == 1, target))
            {
                if (action.JudgeIsAlreadyExeced(target.Owner, num))
                {
                    //暂时忽略子技能
                    action.ExecAction(Owner, target, num, this, skill, 0, enabledChildaction, valueDic);
                }
            }
            if (action.ActionType != eActionType.REFLEXIVE)
            {
                if (action.HitOnceDic.ContainsKey(target))
                {
                    if (action.ExecTime.Length - 1 != num)
                    {
                        return;//技能还没执行完毕,返回
                    }
                    if (!action.HitOnceDic[target])
                    {
                        foreach (int i in action.ActionChildrenIndexes)
                        {
                            skill.ActionParmeters[action.ActionChildrenIndexes[i]].OnActionEnd?.Invoke();
                        }
                        return;
                    }
                }
                ExecChildrenAction(action, skill, target, num, starttime, enabledChildaction);
            }
        }
コード例 #11
0
 protected virtual Vector3 GetHeadBonePos(BasePartsData _target)
 {
     return(_target.GetButtontransformPosition() + _target.GetFixedCenterPos());
 }