//释放技能时 private IEnumerator ReleaseSkill(BattleUnitSkillAction action) { //取消范围显示 if (action.battleSkill.effectRadius > 0) { BattleFieldRenderer.Instance.SetCircularRangeRenderStateActive(false, GridRenderType.SkillEffectRange); } //受到技能影响的单位还原 for (int i = 0; i < action.skillResult.Length; ++i) { action.skillResult[i].battleUnit.battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal); } yield return(EGameConstL.WaitForHalfSecond); //属性刷新 RefreshAttribute(action.selfAttribute); //展示 for (int i = 0; i < action.skillResult.Length; ++i) { //同时开启掉血特效 StartCoroutine(action.skillResult[i].battleUnit.battleUnitRenderer.OnSkillDamage(action.skillResult[i])); } }
//战斗表现生命周期 //释放技能前 private IEnumerator BeforeReleaseSkill(BattleUnitSkillAction action) { //将自己显示为行动状态~变身! UpdateRenderState(BattleUnitRenderState.Action); //仅有范围的技能显示范围呢 if (action.battleSkill.effectRadius > 0) { GridUnit centerGrid = null; switch (action.battleSkill.targetType) { case BattleSkillTargetType.BattleUnit: case BattleSkillTargetType.Self: centerGrid = action.targetBattleUnit.mapGrid; break; case BattleSkillTargetType.GridUnit: centerGrid = action.targetGrid; break; default: break; } if (centerGrid != null) { BattleFieldRenderer.Instance.SetCircularRangeRenderStateActive( true, GridRenderType.SkillEffectRange, centerGrid.row, centerGrid.column, action.battleSkill.effectRadius); } } //受到技能影响的单位高亮(暂时) for (int i = 0; i < action.skillResult.Length; ++i) { action.skillResult[i].battleUnit.battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selected); } yield return(EGameConstL.WaitForHalfSecond); }
//使用技能 private IEnumerator PlaySkillAction(BattleUnitSkillAction action) { if (action == null) { UtilityHelper.LogError("Error BattleHeroSkillAction"); yield break; } if (action.skillResult == null) { UtilityHelper.LogError("Error BattleHeroSkillAction: No skill result."); yield break; } //释放前 yield return(BeforeReleaseSkill(action)); //释放 yield return(ReleaseSkill(action)); //释放后 yield return(AfterReleaseSkill(action)); }
//释放技能后 private IEnumerator AfterReleaseSkill(BattleUnitSkillAction action) { UpdateRenderState(BattleUnitRenderState.Normal); yield return(null); }
//输出分析战报 private void OutputBattleReport(string path) { StringBuilder strBuilder = new StringBuilder(); if (!File.Exists(path)) { strBuilder.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}\n", "BattleID", "State", "SN", "AtkTeam", "FirstAction", "Attacker", "SufferTeam", "Sufferer", "SkillName", "SkillType", "Damage/HP"); } foreach (var item in battleFieldEvents) { switch (item.actionType) { case BattleFieldEventType.BattleUnitAction: BattleUnitSkillAction skillAction = item as BattleUnitSkillAction; if (skillAction != null) { foreach (var skillResult in skillAction.skillResult) { BattleTeam firstActionTeam = ((resetTimes & 1) == 0) ? teams[1] : teams[0]; strBuilder.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}\n", resetTimes, "Action", item.SN, skillAction.actionUnit.battleTeam, firstActionTeam.Equals(skillAction.actionUnit.battleTeam) ? 1 : 0, skillAction.actionUnit.battleUnitAttribute.battleUnitName, skillResult.battleUnit.battleTeam, skillResult.battleUnit.battleUnitAttribute.battleUnitName, skillAction.battleSkill.skillName, skillAction.battleSkill.damageType.ToString(), skillResult.syncAttribute.hpChanged); //统计击杀 if (skillResult.syncAttribute.currentHP <= 0) { strBuilder.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}\n", resetTimes, "Kill", item.SN, skillAction.actionUnit.battleTeam, firstActionTeam.Equals(skillAction.actionUnit.battleTeam) ? 1 : 0, skillAction.actionUnit.battleUnitAttribute.battleUnitName, skillResult.battleUnit.battleTeam, skillResult.battleUnit.battleUnitAttribute.battleUnitName, skillAction.battleSkill.skillName, skillAction.battleSkill.damageType.ToString(), skillResult.syncAttribute.hpChanged); } } } break; case BattleFieldEventType.BattleStart: break; case BattleFieldEventType.BattleEnd: break; default: break; } } foreach (var team in teams) { foreach (var bu in team.battleUnits) { BattleTeam firstActionTeam = ((resetTimes & 1) == 0) ? teams[1] : teams[0]; strBuilder.AppendFormat("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10}\n", resetTimes, "End", string.Empty, bu.battleTeam, firstActionTeam.Equals(bu.battleTeam) ? 1 : 0, bu.battleUnitAttribute.battleUnitName, string.Empty, string.Empty, string.Empty, string.Empty, bu.battleUnitAttribute.hp); } } File.AppendAllText(path, strBuilder.ToString()); }
//使用技能 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]); } } } } }