示例#1
0
        public void Init(params object[] args)
        {
            manualReleaseAnalysisor   = new BattleSkillManualReleaseAnalysisor();
            battleSkillEffectAnalysis = new BattleSkillEffectAnalysis();

            BattleManager.Instance.MgrLog("Battle calculator inited.");
        }
示例#2
0
        public void Init(params object[] args)
        {
            manualReleaseAnalysisor   = new BattleSkillManualReleaseAnalysisor();
            autoReleaseAnalysisor     = new BattleSkillAutoReleaseAnalysisor(10);
            battleSkillEffectAnalysis = new BattleSkillEffectAnalysis();

            UtilityHelper.Log("Battle calculator inited.");
        }
示例#3
0
        //使用技能
        public void UseSkill(BattleUnitAction battleUnitAction, SO_BattleSkill battleSkill, BattleUnit targetBattleUnit = null, GridUnit targetGridUnit = null)
        {
            if (battleSkill == null)
            {
                UtilityHelper.LogError("Use skill error. Battle skill is none.");
                return;
            }
            BattleSkillEffectAnalysis analysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(battleSkill, this, targetBattleUnit, targetGridUnit);

            if (analysis == null)
            {
                UtilityHelper.LogError("Use skill error. Analysis failed:" + battleSkill.skillName);
                return;
            }

            List <BattleUnitSkillResult> skillResults = new List <BattleUnitSkillResult>();

            //主要影响
            for (int i = 0; i < analysis.mainReceiver.Count; ++i)
            {
                skillResults.Add(BattleCalculator.Instance.CalcSingle(this, analysis.mainReceiver[i], battleSkill, true));
            }
            //次要影响
            for (int i = 0; i < analysis.minorReceiver.Count; ++i)
            {
                skillResults.Add(BattleCalculator.Instance.CalcSingle(this, analysis.minorReceiver[i], battleSkill, false));
            }

            //产生使用技能的动作
            if (battleUnitAction != null)
            {
                battleUnitAction.skillAction                  = BattleUnitSkillAction.Get();
                battleUnitAction.skillAction.battleSkill      = battleSkill;
                battleUnitAction.skillAction.skillResult      = skillResults.ToArray();
                battleUnitAction.skillAction.targetBattleUnit = targetBattleUnit;
                battleUnitAction.skillAction.targetGrid       = targetGridUnit;
                battleUnitAction.skillAction.selfAttribute    = BattleSkillCostEnergy(battleSkill);
            }

            //伤害产生效果,计算仇恨
            for (int i = 0; i < skillResults.Count; ++i)
            {
                skillResults[i].battleUnit.AcceptSkillResult(skillResults[i].syncAttribute, battleUnitAction);
                //产生仇恨
                if (battleSkill.damageType != BattleSkillDamageType.Heal && !skillResults[i].battleUnit.Equals(this))
                {
                    skillResults[i].battleUnit.hatredRecorder.RecoredHatred(this.battleUnitID, skillResults[i].syncAttribute.hpChanged < 0 ? -skillResults[i].syncAttribute.hpChanged : skillResults[i].syncAttribute.hpChanged);
                }
            }
        }
示例#4
0
        //使用技能
        public void UseSkill(BattleUnitAction battleUnitAction, SO_BattleSkill battleSkill, BattleUnit targetBattleUnit = null, GridUnit targetGridUnit = null)
        {
            if (battleSkill == null)
            {
                UtilityHelper.LogError("Use skill error. Battle skill is none.");
                return;
            }
            BattleSkillEffectAnalysis analysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(battleSkill, this, targetBattleUnit, targetGridUnit);

            if (analysis == null)
            {
                UtilityHelper.LogError("Use skill error. Analysis failed:" + battleSkill.skillName);
                return;
            }

            List <BattleUnitSkillResult> skillResults = new List <BattleUnitSkillResult>();

            //主要影响
            for (int i = 0; i < analysis.mainReceiver.Count; ++i)
            {
                skillResults.Add(BattleCalculator.Instance.CalcSingle(this, analysis.mainReceiver[i], battleSkill, true));
            }
            //次要影响
            for (int i = 0; i < analysis.minorReceiver.Count; ++i)
            {
                skillResults.Add(BattleCalculator.Instance.CalcSingle(this, analysis.minorReceiver[i], battleSkill, false));
            }

            //产生使用技能的动作
            if (battleUnitAction != null)
            {
                battleUnitAction.skillAction                  = BattleUnitSkillAction.Get();
                battleUnitAction.skillAction.battleSkill      = battleSkill;
                battleUnitAction.skillAction.skillResult      = skillResults.ToArray();
                battleUnitAction.skillAction.targetBattleUnit = targetBattleUnit;
                battleUnitAction.skillAction.targetGrid       = targetGridUnit;
                battleUnitAction.skillAction.selfAttribute    = BattleSkillCostEnergy(battleSkill);
            }

            //伤害产生效果,计算仇恨
            for (int i = 0; i < skillResults.Count; ++i)
            {
                //接收伤害,属性变更
                skillResults[i].battleUnit.AcceptSkillResult(skillResults[i].syncAttribute, battleUnitAction);

                //产生仇恨
                if (battleSkill.damageType != BattleSkillDamageType.Heal && !skillResults[i].battleUnit.Equals(this))
                {
                    //新仇记录
                    for (int j = 0; j < enemyTeam.battleUnits.Count; ++j)
                    {
                        if (!enemyTeam.battleUnits[j].CanAction)
                        {
                            continue;
                        }

                        //每个战斗单位都需要知道发生了什么
                        enemyTeam.battleUnits[j].battleBehaviourSystem.RecordSkillResult(this, skillResults[i]);
                    }
                }
            }
        }
        //分析结果
        public void Ananlysis(BattleUnit releaser, BattleUnit target, SO_BattleSkill[] skills)
        {
            Reset();

            if (releaser == null || target == null || skills == null)
            {
                return;
            }

            this.releaser = releaser;
            this.target   = target;

            //有效技能数
            int validSkillCount = 0;

            for (int i = 0; i < skills.Length; ++i)
            {
                //判断能量是否够
                if (skills[i].energyCost > releaser.battleUnitAttribute.energy)
                {
                    continue;
                }

                //技能都不在释放范围内,考虑你妹啊
                if (!WithInSkillReleaseRange(releaser, target, skills[i]))
                {
                    continue;
                }

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

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

                case BattleSkillTargetType.Self:
                    effectAnalysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(
                        skills[i],
                        releaser);
                    break;

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

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

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

                            analysisTempGrids.Clear();
                        }
                    }
                    break;
                }

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

                //起码可以释放
                ++validSkillCount;
                //计算释放这个技能的得分
                BattleSkillAutoReleaseAnalysisItem analysisItem = skillReleaseAnalysisItem.Get();
                analysisItem.battleSkill      = skills[i];
                analysisItem.targetBattleUnit = target;
                analysisItem.targetGridUnit   = targetGridUnit;

                //主要影响
                for (int j = 0; j < effectAnalysis.mainReceiver.Count; ++j)
                {
                    analysisItem.score += analysisItem.battleSkill.mainValue;
                    ++analysisItem.effectedCount;
                }

                //次要影响
                for (int j = 0; j < effectAnalysis.minorReceiver.Count; ++j)
                {
                    analysisItem.score += analysisItem.battleSkill.mainValue;
                    ++analysisItem.effectedCount;
                }

                analysisItem.score = Mathf.CeilToInt(1000 * analysisItem.score / analysisItem.battleSkill.energyCost);
            }

            //排序
            skillReleaseAnalysisItem.Sort(LiteSingleton <BattleSkillReleaseAnalysisItemComparer> .Instance);
        }