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); } }