Пример #1
0
        public void Init(params object[] args)
        {
            manualReleaseAnalysisor   = new BattleSkillManualReleaseAnalysisor();
            battleSkillEffectAnalysis = new BattleSkillEffectAnalysis();

            BattleManager.Instance.MgrLog("Battle calculator inited.");
        }
Пример #2
0
        //使用技能
        public void UseSkill(SO_BattleSkill battleSkill, BattleUnit targetBattleUnit = null, GridUnit targetGridUnit = null)
        {
            if (battleSkill == null)
            {
                UtilityHelper.LogError("Use skill error. Battle skill is none.");
                return;
            }

            GridUnit temp = targetGridUnit;

            if (temp == null && targetBattleUnit != null)
            {
                temp = targetBattleUnit.mapGrid;
            }
            if (temp != null && mapGrid.Distance(temp) > battleSkill.GetReleaseRadius(mapGrid))
            {
                return;
            }

            BattleSkillEffectAnalysis analysis = BattleCalculator.Instance.AnalyseBattleSkillEffect(battleSkill, this, targetBattleUnit, targetGridUnit);

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

            skillResults.Clear();

            //主要影响
            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));
            }

            //连招combo统计
            if (battleUnitAttribute.manualOperation)
            {
                UtilityHelper.Log("Check combo now");

                //返回真表示连招成立,则调用连招效果
                int comboID = battleUnitAttribute.comboJudge((int)battleSkill.damageType);
                if (comboID != -1)
                {
                    //对于即时生效的技能需要直接改变skillResult
                    ComboEffect(comboID, battleUnitAttribute);
                }
            }

            //产生使用技能的动作
            BattleUnitSkillAction skillAction = BattleUnitActionEvent.CreateEvent <BattleUnitSkillAction>(BattleUnitActionType.UseSkill, this);

            skillAction.battleSkill      = battleSkill;
            skillAction.skillResult      = skillResults.ToArray();
            skillAction.targetBattleUnit = targetBattleUnit;
            skillAction.targetGrid       = targetGridUnit;
            skillAction.selfAttribute    = BattleSkillCostEnergy(battleSkill);
            battleField.AppendBattleAction(skillAction);

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

                //产生仇恨
                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;
                        }

                        //每个战斗单位都需要知道发生了什么
                        if (!enemyTeam.battleUnits[j].battleUnitAttribute.manualOperation)
                        {
                            enemyTeam.battleUnits[j].battleBehaviourSystem.RecordSkillResult(this, skillResults[i]);
                        }
                    }
                }
            }
        }