private BattleDecision MakeAttackFirstDecision() { SO_BattleSkill[] skills = baseData.hostBattleUnit.battleUnitAttribute.battleSkills; int maxRange = 0; SO_BattleSkill targetSkill = null; foreach (SO_BattleSkill battleSkill in skills) { int range = battleSkill.GetReleaseRadius(baseData.hostBattleUnit.mapGrid); if (maxRange < range) { maxRange = range; targetSkill = battleSkill; } } BattleDecision decision = null; BattleUnit battleUnit = baseData.enemyBattleTeam.battleUnits[0]; if (battleUnit != null) { List <GridUnit> gridUnits = new List <GridUnit>(); MapNavigator.Instance.NewNavigate(baseData.hostBattleUnit, baseData.battleField.battleMap, baseData.hostBattleUnit.mapGrid, battleUnit.mapGrid, gridUnits, maxRange); decision = BattleDecision.CreateInstance(); decision.targetBattleUnit = battleUnit; decision.movePath = gridUnits.ToArray(); decision.battleSkill = targetSkill; decision.skillTargetGrid = null; decision.skillTargetBattleUnit = battleUnit; } return(decision); }
public void Reset() { targetBattleUnit = null; movePath = null; battleSkill = null; skillTargetGrid = null; skillTargetBattleUnit = null; }
public void Recycle() { battleSkill = null; targetBattleUnit = null; targetGridUnit = null; score = 0; effectedCount = 0; }
//计算单个技能释放的得分 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); } }
private BattleDecision MakePreparationDecision() { BattleDecision decision = null; BattleUnit battleUnit = baseData.hostBattleUnit; SO_BattleSkill[] skills = battleUnit.battleUnitAttribute.battleSkills; int maxRange = 0; SO_BattleSkill targetSkill = null; foreach (SO_BattleSkill battleSkill in skills) { int range = battleSkill.GetReleaseRadius(battleUnit.mapGrid); if (maxRange < range) { maxRange = range; targetSkill = battleSkill; } } if (targetSkill != null) { List <BattleUnit> battleUnits = MapNavigator.Instance.SearchBattleUnits(battleUnit.mapGrid, maxRange + battleUnit.battleUnitAttribute.mobility); foreach (BattleUnit unit in battleUnits) { if (unit.battleTeam != battleUnit.battleTeam) { List <GridUnit> gridUnits = new List <GridUnit>(); MapNavigator.Instance.NewNavigate(battleUnit, baseData.battleField.battleMap, battleUnit.mapGrid, unit.mapGrid, gridUnits, maxRange); decision = BattleDecision.CreateInstance(); decision.targetBattleUnit = unit; decision.movePath = gridUnits.ToArray(); decision.battleSkill = targetSkill; decision.skillTargetGrid = null; decision.skillTargetBattleUnit = unit; break; } } } return(decision); }
private BattleDecision MakeStandAlwayDecision() { BattleDecision decision = null; BattleUnit battleUnit = baseData.hostBattleUnit; SO_BattleSkill[] skills = battleUnit.battleUnitAttribute.battleSkills; int maxRange = 0; SO_BattleSkill targetSkill = null; foreach (SO_BattleSkill battleSkill in skills) { int range = battleSkill.GetReleaseRadius(battleUnit.mapGrid); if (maxRange < range) { maxRange = range; targetSkill = battleSkill; } } if (targetSkill != null) { List <BattleUnit> battleUnits = MapNavigator.Instance.SearchBattleUnits(battleUnit.mapGrid, maxRange); foreach (BattleUnit unit in battleUnits) { if (unit.battleTeam != battleUnit.battleTeam) { decision = BattleDecision.CreateInstance(); decision.targetBattleUnit = unit; decision.movePath = null; decision.battleSkill = targetSkill; decision.skillTargetGrid = null; decision.skillTargetBattleUnit = unit; break; } } } return(decision); }
/// <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); }