private BattleDecision MakeAttackFirstDecision()
        {
            SO_BattleSkill[] skills    = baseData.hostBattleUnit.battleUnitAttribute.battleSkills;
            int            maxRange    = 0;
            SO_BattleSkill targetSkill = null;

            foreach (SO_BattleSkill battleSkill in skills)
            {
                int range = battleSkill.GetReleaseRadius(baseData.hostBattleUnit.mapGrid);
                if (maxRange < range)
                {
                    maxRange    = range;
                    targetSkill = battleSkill;
                }
            }

            BattleDecision decision   = null;
            BattleUnit     battleUnit = baseData.enemyBattleTeam.battleUnits[0];

            if (battleUnit != null)
            {
                List <GridUnit> gridUnits = new List <GridUnit>();
                MapNavigator.Instance.NewNavigate(baseData.hostBattleUnit, baseData.battleField.battleMap, baseData.hostBattleUnit.mapGrid, battleUnit.mapGrid, gridUnits, maxRange);
                decision = BattleDecision.CreateInstance();
                decision.targetBattleUnit      = battleUnit;
                decision.movePath              = gridUnits.ToArray();
                decision.battleSkill           = targetSkill;
                decision.skillTargetGrid       = null;
                decision.skillTargetBattleUnit = battleUnit;
            }
            return(decision);
        }
Exemple #2
0
        //自动搓招
        private void AutoUseSkill(BattleBehaviourSystem.BattleDecision decision)
        {
            if (decision == null)
            {
                return;
            }

            if (decision.battleSkill != null)
            {
                //使用技能
                switch (decision.battleSkill.targetType)
                {
                case BattleSkillTargetType.BattleUnit:
                    UseSkill(decision.battleSkill, decision.skillTargetBattleUnit);
                    break;

                case BattleSkillTargetType.GridUnit:
                    UseSkill(decision.battleSkill, null, decision.skillTargetGrid);
                    break;

                case BattleSkillTargetType.Self:
                    UseSkill(decision.battleSkill);
                    break;

                default:
                    break;
                }
            }
        }
        private BattleDecision MakePreparationDecision()
        {
            BattleDecision decision   = null;
            BattleUnit     battleUnit = baseData.hostBattleUnit;

            SO_BattleSkill[] skills    = battleUnit.battleUnitAttribute.battleSkills;
            int            maxRange    = 0;
            SO_BattleSkill targetSkill = null;

            foreach (SO_BattleSkill battleSkill in skills)
            {
                int range = battleSkill.GetReleaseRadius(battleUnit.mapGrid);
                if (maxRange < range)
                {
                    maxRange    = range;
                    targetSkill = battleSkill;
                }
            }

            if (targetSkill != null)
            {
                List <BattleUnit> battleUnits = MapNavigator.Instance.SearchBattleUnits(battleUnit.mapGrid, maxRange + battleUnit.battleUnitAttribute.mobility);
                foreach (BattleUnit unit in battleUnits)
                {
                    if (unit.battleTeam != battleUnit.battleTeam)
                    {
                        List <GridUnit> gridUnits = new List <GridUnit>();
                        MapNavigator.Instance.NewNavigate(battleUnit, baseData.battleField.battleMap, battleUnit.mapGrid, unit.mapGrid, gridUnits, maxRange);
                        decision = BattleDecision.CreateInstance();
                        decision.targetBattleUnit      = unit;
                        decision.movePath              = gridUnits.ToArray();
                        decision.battleSkill           = targetSkill;
                        decision.skillTargetGrid       = null;
                        decision.skillTargetBattleUnit = unit;
                        break;
                    }
                }
            }
            return(decision);
        }
Exemple #4
0
        //自动
        private HeroActionState AutoAction()
        {
            BattleBehaviourSystem.BattleDecision decision = battleBehaviourSystem.Think();

            if (decision == null)
            {
                BattleUnitAttributeUpdate action = BattleUnitActionEvent.CreateEvent <BattleUnitAttributeUpdate>(BattleUnitActionType.AttributeUpdate, this);
                action.attribute               = new BattleUnitSyncAttribute();
                action.attribute.hpChanged     = 0;
                action.attribute.currentHP     = battleUnitAttribute.hp;
                action.attribute.energyChanged = 0;
                action.attribute.currentEnergy = battleUnitAttribute.energy;
                action.attribute.currentBP     = battleUnitAttribute.BP;
                battleField.AppendBattleAction(action);
                return(HeroActionState.Normal);
            }

            //判断是否切换目标
            if (decision.targetBattleUnit != null && !decision.targetBattleUnit.Equals(targetBattleUnit))
            {
                BattleUnitChangeTargetAction action = BattleUnitActionEvent.CreateEvent <BattleUnitChangeTargetAction>(BattleUnitActionType.ChangeTarget, this);
                action.lastTargetUnit = targetBattleUnit;
                action.newTargetUnit  = decision.targetBattleUnit;
                battleField.AppendBattleAction(action);

                targetBattleUnit = decision.targetBattleUnit;
            }

            //需要移动
            if (decision.movePath != null && decision.movePath.Length > 0)
            {
                MoveToTargetGrid(targetBattleUnit, decision.movePath[decision.movePath.Length - 1], decision.movePath);
            }

            //自动搓招儿
            AutoUseSkill(decision);

            return(HeroActionState.Normal);
        }
        private BattleDecision MakeStandAlwayDecision()
        {
            BattleDecision decision   = null;
            BattleUnit     battleUnit = baseData.hostBattleUnit;

            SO_BattleSkill[] skills    = battleUnit.battleUnitAttribute.battleSkills;
            int            maxRange    = 0;
            SO_BattleSkill targetSkill = null;

            foreach (SO_BattleSkill battleSkill in skills)
            {
                int range = battleSkill.GetReleaseRadius(battleUnit.mapGrid);
                if (maxRange < range)
                {
                    maxRange    = range;
                    targetSkill = battleSkill;
                }
            }

            if (targetSkill != null)
            {
                List <BattleUnit> battleUnits = MapNavigator.Instance.SearchBattleUnits(battleUnit.mapGrid, maxRange);
                foreach (BattleUnit unit in battleUnits)
                {
                    if (unit.battleTeam != battleUnit.battleTeam)
                    {
                        decision = BattleDecision.CreateInstance();
                        decision.targetBattleUnit      = unit;
                        decision.movePath              = null;
                        decision.battleSkill           = targetSkill;
                        decision.skillTargetGrid       = null;
                        decision.skillTargetBattleUnit = unit;
                        break;
                    }
                }
            }
            return(decision);
        }
        //得出决策
        private BattleDecision MakeDecision()
        {
            var skills = baseData.hostBattleUnit.battleUnitAttribute.battleSkills;

            if (skills.Length == 0)
            {
                return(null);
            }

            //遍历每一个行为
            //尝试可释放的每一个技能
            //计算释放这个技能的得分
            //找到最高回报的技能和释放目标
            BattleUnit      target        = null;
            List <GridUnit> movePath      = new List <GridUnit>();
            int             currentPoints = 0; //当前得分
            int             highestPoints = 0; //最高分
            BattleDecision  decision      = null;

            //遍历行为列表
            for (int i = 0; i < behaviourItems.Count; ++i)
            {
                //这个行为的目标对象
                target = behaviourItems[i].targetBattleUnit;
                //遍历技能列表
                for (int j = 0; j < skills.Length; j++)
                {
                    switch (behaviourItems[i].behaviourType)
                    {
                    //如果是伤害或嘲讽行为,则直接忽略治疗技能
                    case BattleBehaviourType.Damage:
                    case BattleBehaviourType.Provoke:
                    {
                        if (skills[j].damageType == BattleSkillDamageType.Heal)
                        {
                            continue;
                        }
                    }
                    break;

                    //如果是治疗行为,则直接忽略伤害技能
                    case BattleBehaviourType.Recovery:
                        if (skills[j].damageType != BattleSkillDamageType.Heal)
                        {
                            continue;
                        }
                        break;

                    default:
                        break;
                    }

                    movePath.Clear();
                    //判断当前目标是否在范围内
                    if (target.mapGrid.Distance(baseData.hostBattleUnit.mapGrid) > skills[j].GetMaxReleaseRadiusForCalculate(baseData.hostBattleUnit.mapGrid))
                    {
                        //不在范围内
                        //判断是否可达
                        //bool canCatch = MapNavigator.Instance.Navigate(
                        //    baseData.battleField.battleMap,
                        //    baseData.hostBattleUnit.mapGrid,
                        //    target.mapGrid,
                        //    movePath,
                        //    null,
                        //    baseData.hostBattleUnit.battleUnitAttribute.mobility,
                        //    skills[j].GetMaxReleaseRadiusForCalculate(null)
                        //    );

                        bool canCatch = MapNavigator.Instance.NewNavigate(
                            baseData.hostBattleUnit,
                            baseData.battleField.battleMap,
                            baseData.hostBattleUnit.mapGrid,
                            target.mapGrid,
                            movePath,
                            skills[j].GetMaxReleaseRadiusForCalculate(null));

                        //别考虑这个技能了~
                        if (!canCatch)
                        {
                            continue;
                        }
                    }

                    //到此表示可以释放这个技能是有戏的呢
                    currentPoints = 10;

                    //假定一下移动后的位置
                    GridUnit virtualPosition = movePath.Count > 0 ? movePath[movePath.Count - 1] : baseData.hostBattleUnit.mapGrid;
                    if (target.mapGrid.Distance(virtualPosition) > skills[j].GetMaxReleaseRadiusForCalculate(virtualPosition))
                    {
                        //移动后仍然不在范围内
                        if (currentPoints > highestPoints)
                        {
                            if (decision == null)
                            {
                                decision = BattleDecision.CreateInstance();
                            }

                            decision.Reset();
                            decision.targetBattleUnit = target;
                            decision.movePath         = movePath.Count > 0 ? movePath.ToArray() : null;
                            //目标不在范围,因此无需保存技能
                            decision.battleSkill           = null;
                            decision.skillTargetGrid       = null;
                            decision.skillTargetBattleUnit = null;


                            //记录最高分
                            highestPoints = currentPoints;
                        }
                    }
                    else
                    {
                        //移动后在范围内
                        //计算释放技能的得分
                        var analysisItem = CalculateSkillScore(
                            baseData.hostBattleUnit,
                            virtualPosition,
                            target,
                            skills[j],
                            behaviourItems[i].behaviourType);

                        if (analysisItem == null)
                        {
                            continue;
                        }

                        currentPoints += Mathf.CeilToInt(analysisItem.score);

                        if (currentPoints > highestPoints)
                        {
                            if (decision == null)
                            {
                                decision = BattleDecision.CreateInstance();
                            }

                            decision.Reset();
                            decision.targetBattleUnit      = target;
                            decision.movePath              = movePath.Count > 0 ? movePath.ToArray() : null;
                            decision.battleSkill           = skills[j];
                            decision.skillTargetGrid       = analysisItem.targetGridUnit;
                            decision.skillTargetBattleUnit = analysisItem.targetBattleUnit;

#if UNITY_EDITOR
                            if (DebugHelper.Instance.debugBBSys)
                            {
                                UtilityHelper.Log(string.Format("Decision:\nTarget:{0}\nSkill:{1}\nSTargetUnit:{2}\nSGridUnit:{3}\n",
                                                                decision.targetBattleUnit.battleUnitAttribute.battleUnitName,
                                                                decision.battleSkill.skillName,
                                                                decision.skillTargetBattleUnit == null ? "None" : decision.skillTargetBattleUnit.battleUnitAttribute.battleUnitName,
                                                                decision.skillTargetGrid == null ? "None" : decision.skillTargetGrid.ToString()
                                                                ));
                            }
#endif

                            //记录最高分
                            highestPoints = currentPoints;
                        }
                    }
                }
                //有一个可行决策
                if (decision != null)
                {
                    break;
                }
            }

            return(decision);
        }