public void Init(params object[] args) { manualReleaseAnalysisor = new BattleSkillManualReleaseAnalysisor(); battleSkillEffectAnalysis = new BattleSkillEffectAnalysis(); BattleManager.Instance.MgrLog("Battle calculator inited."); }
public void Init(params object[] args) { manualReleaseAnalysisor = new BattleSkillManualReleaseAnalysisor(); autoReleaseAnalysisor = new BattleSkillAutoReleaseAnalysisor(10); battleSkillEffectAnalysis = new BattleSkillEffectAnalysis(); UtilityHelper.Log("Battle calculator inited."); }
//使用技能 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); } } }
//使用技能 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); }