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); }
//自动搓招 private void AutoUseSkill(BattleBehaviourSystem.BattleDecision decision) { if (decision == null) { return; } if (decision.battleSkill != null) { //使用技能 switch (decision.battleSkill.targetType) { case BattleSkillTargetType.BattleUnit: UseSkill(decision.battleSkill, decision.skillTargetBattleUnit); break; case BattleSkillTargetType.GridUnit: UseSkill(decision.battleSkill, null, decision.skillTargetGrid); break; case BattleSkillTargetType.Self: UseSkill(decision.battleSkill); break; default: break; } } }
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 HeroActionState AutoAction() { BattleBehaviourSystem.BattleDecision decision = battleBehaviourSystem.Think(); if (decision == null) { BattleUnitAttributeUpdate action = BattleUnitActionEvent.CreateEvent <BattleUnitAttributeUpdate>(BattleUnitActionType.AttributeUpdate, this); action.attribute = new BattleUnitSyncAttribute(); action.attribute.hpChanged = 0; action.attribute.currentHP = battleUnitAttribute.hp; action.attribute.energyChanged = 0; action.attribute.currentEnergy = battleUnitAttribute.energy; action.attribute.currentBP = battleUnitAttribute.BP; battleField.AppendBattleAction(action); return(HeroActionState.Normal); } //判断是否切换目标 if (decision.targetBattleUnit != null && !decision.targetBattleUnit.Equals(targetBattleUnit)) { BattleUnitChangeTargetAction action = BattleUnitActionEvent.CreateEvent <BattleUnitChangeTargetAction>(BattleUnitActionType.ChangeTarget, this); action.lastTargetUnit = targetBattleUnit; action.newTargetUnit = decision.targetBattleUnit; battleField.AppendBattleAction(action); targetBattleUnit = decision.targetBattleUnit; } //需要移动 if (decision.movePath != null && decision.movePath.Length > 0) { MoveToTargetGrid(targetBattleUnit, decision.movePath[decision.movePath.Length - 1], decision.movePath); } //自动搓招儿 AutoUseSkill(decision); return(HeroActionState.Normal); }
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); }
//得出决策 private BattleDecision MakeDecision() { var skills = baseData.hostBattleUnit.battleUnitAttribute.battleSkills; if (skills.Length == 0) { return(null); } //遍历每一个行为 //尝试可释放的每一个技能 //计算释放这个技能的得分 //找到最高回报的技能和释放目标 BattleUnit target = null; List <GridUnit> movePath = new List <GridUnit>(); int currentPoints = 0; //当前得分 int highestPoints = 0; //最高分 BattleDecision decision = null; //遍历行为列表 for (int i = 0; i < behaviourItems.Count; ++i) { //这个行为的目标对象 target = behaviourItems[i].targetBattleUnit; //遍历技能列表 for (int j = 0; j < skills.Length; j++) { switch (behaviourItems[i].behaviourType) { //如果是伤害或嘲讽行为,则直接忽略治疗技能 case BattleBehaviourType.Damage: case BattleBehaviourType.Provoke: { if (skills[j].damageType == BattleSkillDamageType.Heal) { continue; } } break; //如果是治疗行为,则直接忽略伤害技能 case BattleBehaviourType.Recovery: if (skills[j].damageType != BattleSkillDamageType.Heal) { continue; } break; default: break; } movePath.Clear(); //判断当前目标是否在范围内 if (target.mapGrid.Distance(baseData.hostBattleUnit.mapGrid) > skills[j].GetMaxReleaseRadiusForCalculate(baseData.hostBattleUnit.mapGrid)) { //不在范围内 //判断是否可达 //bool canCatch = MapNavigator.Instance.Navigate( // baseData.battleField.battleMap, // baseData.hostBattleUnit.mapGrid, // target.mapGrid, // movePath, // null, // baseData.hostBattleUnit.battleUnitAttribute.mobility, // skills[j].GetMaxReleaseRadiusForCalculate(null) // ); bool canCatch = MapNavigator.Instance.NewNavigate( baseData.hostBattleUnit, baseData.battleField.battleMap, baseData.hostBattleUnit.mapGrid, target.mapGrid, movePath, skills[j].GetMaxReleaseRadiusForCalculate(null)); //别考虑这个技能了~ if (!canCatch) { continue; } } //到此表示可以释放这个技能是有戏的呢 currentPoints = 10; //假定一下移动后的位置 GridUnit virtualPosition = movePath.Count > 0 ? movePath[movePath.Count - 1] : baseData.hostBattleUnit.mapGrid; if (target.mapGrid.Distance(virtualPosition) > skills[j].GetMaxReleaseRadiusForCalculate(virtualPosition)) { //移动后仍然不在范围内 if (currentPoints > highestPoints) { if (decision == null) { decision = BattleDecision.CreateInstance(); } decision.Reset(); decision.targetBattleUnit = target; decision.movePath = movePath.Count > 0 ? movePath.ToArray() : null; //目标不在范围,因此无需保存技能 decision.battleSkill = null; decision.skillTargetGrid = null; decision.skillTargetBattleUnit = null; //记录最高分 highestPoints = currentPoints; } } else { //移动后在范围内 //计算释放技能的得分 var analysisItem = CalculateSkillScore( baseData.hostBattleUnit, virtualPosition, target, skills[j], behaviourItems[i].behaviourType); if (analysisItem == null) { continue; } currentPoints += Mathf.CeilToInt(analysisItem.score); if (currentPoints > highestPoints) { if (decision == null) { decision = BattleDecision.CreateInstance(); } decision.Reset(); decision.targetBattleUnit = target; decision.movePath = movePath.Count > 0 ? movePath.ToArray() : null; decision.battleSkill = skills[j]; decision.skillTargetGrid = analysisItem.targetGridUnit; decision.skillTargetBattleUnit = analysisItem.targetBattleUnit; #if UNITY_EDITOR if (DebugHelper.Instance.debugBBSys) { UtilityHelper.Log(string.Format("Decision:\nTarget:{0}\nSkill:{1}\nSTargetUnit:{2}\nSGridUnit:{3}\n", decision.targetBattleUnit.battleUnitAttribute.battleUnitName, decision.battleSkill.skillName, decision.skillTargetBattleUnit == null ? "None" : decision.skillTargetBattleUnit.battleUnitAttribute.battleUnitName, decision.skillTargetGrid == null ? "None" : decision.skillTargetGrid.ToString() )); } #endif //记录最高分 highestPoints = currentPoints; } } } //有一个可行决策 if (decision != null) { break; } } return(decision); }