Example #1
0
        public static BattleBehaviourItem CreateInstance(BattleUnit target, BattleBehaviourType behaviourType)
        {
            if (target == null)
            {
                return(null);
            }

            BattleBehaviourItem item = new BattleBehaviourItem();

            item.targetBattleUnit = target;
            item.behaviourType    = behaviourType;
            item.point            = 0f;

            return(item);
        }
        public float GetWeight(BattleBehaviourType behaviourType)
        {
            switch (behaviourType)
            {
            case BattleBehaviourType.Strategy:
                return(0f);

            //愤怒将影响damage,因此算一类
            case BattleBehaviourType.Rage:
            case BattleBehaviourType.Damage:
                return(damage);

            case BattleBehaviourType.Provoke:
                return(provoke);

            case BattleBehaviourType.Recovery:
                return(recovery);

            default:
                UtilityHelper.LogError(string.Format("Get weight error, type = {0}", behaviourType));
                return(0f);
            }
        }
        /// <summary>
        /// 计算释放技能的得分
        /// </summary>
        /// <returns>The skill score.</returns>
        /// <param name="releaser">释放技能的人</param>
        /// <param name="releaserPos">释放位置</param>
        /// <param name="target">目标对象</param>
        /// <param name="skill">使用的技能</param>
        /// <param name="behaviourType">行为类型</param>
        private BattleSkillAutoReleaseAnalysisItem CalculateSkillScore(BattleUnit releaser, GridUnit releaserPos, BattleUnit target, SO_BattleSkill skill, BattleBehaviourType behaviourType)
        {
            //判断能量是否够
            if (skill.energyCost > releaser.battleUnitAttribute.energy)
            {
                return(null);
            }

            //释放这个技能的主要影响目标和次要影响目标
            BattleSkillEffectAnalysis effectAnalysis = null;
            //捎带手保存一下释放技能的地点
            GridUnit targetGridUnit = null;

            List <GridUnit> analysisTempGrids = new List <GridUnit>();

            switch (skill.targetType)
            {
            //对目标单位
            case BattleSkillTargetType.BattleUnit:
                effectAnalysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(
                    skill,
                    releaser,
                    target);
                break;

            case BattleSkillTargetType.Self:
                effectAnalysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(
                    skill,
                    releaser);
                break;

            case BattleSkillTargetType.GridUnit:
                analysisTempGrids.Clear();
                //如果目标在范围内
                if (skill.GetReleaseRadius(releaser.mapGrid) > 0 &&
                    releaser.mapGrid.Distance(target.mapGrid) <= skill.GetReleaseRadius(releaser.mapGrid))
                {
                    effectAnalysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(
                        skill,
                        releaser,
                        null,
                        target.mapGrid);

                    //以地块为目标的技能,保存一下目标地块
                    targetGridUnit = target.mapGrid;
                }
                //自身为中心
                else if (skill.GetReleaseRadius(releaser.mapGrid) <= 0 &&
                         releaser.mapGrid.Distance(target.mapGrid) <= skill.effectRadius)
                {
                    effectAnalysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(
                        skill,
                        releaser,
                        null,
                        releaser.mapGrid);

                    //以地块为目标的技能,保存一下目标地块
                    targetGridUnit = releaser.mapGrid;
                }
                else
                {
                    //这个最麻烦,对某个位置
                    target.battleField.battleMap.GetCircularGrids(
                        releaser.mapGrid.row, releaser.mapGrid.column,
                        skill.GetReleaseRadius(releaser.mapGrid), 0, true,
                        analysisTempGrids,
                        delegate(GridUnit grid)
                    {
                        return(grid.Distance(target.mapGrid) <= skill.effectRadius);
                    }
                        );
                    //如果有可以使用技能的位置
                    if (analysisTempGrids.Count > 0)
                    {
                        targetGridUnit = analysisTempGrids[Random.Range(0, analysisTempGrids.Count)];
                        //随机一个位置作为释放目标点
                        effectAnalysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(
                            skill,
                            releaser,
                            null,
                            targetGridUnit);

                        analysisTempGrids.Clear();
                    }
                }
                break;
            }

            //没有分析结果或者技能释放也不会有效果
            if (effectAnalysis == null ||
                (effectAnalysis.mainReceiver.Count == 0 && effectAnalysis.minorReceiver.Count == 0))
            {
                return(null);
            }

            //计算释放这个技能的得分
            BattleSkillAutoReleaseAnalysisItem analysisItem = BattleSkillAutoReleaseAnalysisItem.CreateInstance();

            analysisItem.score            = 0f;
            analysisItem.targetBattleUnit = target;
            analysisItem.targetGridUnit   = targetGridUnit;
            analysisItem.battleSkill      = skill;

            //主要影响
            for (int i = 0; i < effectAnalysis.mainReceiver.Count; ++i)
            {
                analysisItem.score += CalculateSkillScore(releaser, effectAnalysis.mainReceiver[i], skill, behaviourType);
            }

            //次要影响
            for (int i = 0; i < effectAnalysis.minorReceiver.Count; ++i)
            {
                analysisItem.score += CalculateSkillScore(releaser, effectAnalysis.minorReceiver[i], skill, behaviourType);
            }

            analysisItem.score = analysisItem.score / skill.energyCost;

            return(analysisItem);
        }
        //计算单个技能释放的得分
        private float CalculateSkillScore(BattleUnit releaser, BattleUnit target, SO_BattleSkill battleSkill, BattleBehaviourType battleBehaviourType)
        {
            switch (battleBehaviourType)
            {
            //伤害型
            case BattleBehaviourType.Damage:
                return(releaser.battleUnitAttribute.Atk - target.battleUnitAttribute.Def + battleSkill.mainValue);

            //仇恨型
            case BattleBehaviourType.Provoke:
                return((releaser.battleUnitAttribute.Atk - target.battleUnitAttribute.Def + battleSkill.mainValue) * battleSkill.hatredMultiple);

            //恢复型
            case BattleBehaviourType.Recovery:
                return(battleSkill.mainValue);

            default:
                UtilityHelper.LogError(string.Format("CalculateSkillScore error, unknown type:{0}", battleBehaviourType));
                return(0f);
            }
        }