//拾起道具 public void PickupItemFromGrid(GridUnit fromGrid) { if (fromGrid == null || fromGrid.gridItem == null || package == null) { return; } int itemID = fromGrid.gridItem.item.itemID; int itemCount = fromGrid.gridItem.count; int finalCount = 0; bool result = package.TryAddItem(itemID, itemCount, ref finalCount); //成功捡起道具 if (result) { //先生成道具格子的事件 if (fromGrid != null) { fromGrid.OnItemPicked(); } BattleUnitPickupItemAction action = BattleUnitActionEvent.CreateEvent <BattleUnitPickupItemAction>(BattleUnitActionType.PickupItem, this); action.itemID = itemID; action.addCount = itemCount; action.finalCount = finalCount; battleField.AppendBattleAction(action); } }
//运行英雄动作 public IEnumerator RunHeroAction(BattleUnitActionEvent heroAction) { if (heroAction == null) { yield break; } switch (heroAction.battleUnitActionType) { case BattleUnitActionType.EnterBattleField: yield return(PlayEnterBattleFieldAction(heroAction as BattleUnitEnterBattleFieldAction)); break; case BattleUnitActionType.ChangeTarget: yield return(PlayChangeTargetAction(heroAction as BattleUnitChangeTargetAction)); break; case BattleUnitActionType.MoveToTarget: yield return(PlayMotionAction(heroAction as BattleUnitMotionAction)); break; case BattleUnitActionType.UseSkill: yield return(PlaySkillAction(heroAction as BattleUnitSkillAction)); break; case BattleUnitActionType.AttributeUpdate: yield return(PlayAttributeUpdateAction(heroAction as BattleUnitAttributeUpdate)); break; case BattleUnitActionType.ManualOperate: yield return(PlayManualAction(heroAction as BattleUnitManualAction)); break; case BattleUnitActionType.PickupItem: yield return(PlayPickupItemAction(heroAction as BattleUnitPickupItemAction)); break; case BattleUnitActionType.UseItem: yield return(PlayUseItemAction(heroAction as BattleUnitUseItemAction)); break; case BattleUnitActionType.Warning: UtilityHelper.LogWarning(heroAction.ToString()); yield return(EGameConstL.WaitForTouchScreen); break; default: break; } yield return(null); }
//向目标格子移动 public void MoveToTargetGrid(BattleUnit targetUnit, GridUnit targetGrid, GridUnit[] gridPath) { BattleUnitMotionAction action = BattleUnitActionEvent.CreateEvent <BattleUnitMotionAction>(BattleUnitActionType.MoveToTarget, this); action.targetUnit = targetUnit; action.fromGrid = mapGrid; action.gridPath = gridPath; action.moveRange = battleUnitAttribute.mobility; battleField.AppendBattleAction(action); //进入格子,直接设置数据 EnterGrid(targetGrid); }
//手动操作 private HeroActionState ManualAction() { //重置手动操作状态 manualActionState |= ManualActionState.Move; manualActionState |= ManualActionState.SkillOrItem; BroadcastManualStateChanged(); //创建一个手动操作的行动用于显示 BattleUnitManualAction action = BattleUnitActionEvent.CreateEvent <BattleUnitManualAction>(BattleUnitActionType.ManualOperate, this); battleField.AppendBattleAction(action); return(HeroActionState.WaitForPlayerChoose); }
//进入战场 public void EnterBattleField(BattleField battleField, GridUnit bornGrid) { if (battleField != null && bornGrid != null) { this.battleField = battleField; //设置敌方队伍 enemyTeam = battleField.GetBattleTeam(this, false); //重置属性 battleUnitAttribute.RandomAttributes(); battleUnitAttribute.Reset(); //创建背包 if (package == null) { package = BattleUnitPackage.CreateInstance(this, 2); } package.Clear(); //进入战场 BattleUnitEnterBattleFieldAction enterBattleFieldAction = BattleUnitActionEvent.CreateEvent <BattleUnitEnterBattleFieldAction>(BattleUnitActionType.EnterBattleField, this); enterBattleFieldAction.battleField = battleField; enterBattleFieldAction.bornGrid = bornGrid; enterBattleFieldAction.attribute = new BattleUnitSyncAttribute(); enterBattleFieldAction.attribute.hpChanged = 0; enterBattleFieldAction.attribute.currentHP = battleUnitAttribute.hp; enterBattleFieldAction.attribute.energyChanged = 0; enterBattleFieldAction.attribute.currentEnergy = 0; battleField.AppendBattleAction(enterBattleFieldAction); //进入格子 EnterGrid(bornGrid); //初始化战斗行为系统 if (battleBehaviourSystem != null) { battleBehaviourSystem.Init(this, battleField); } //重置bbsys if (battleBehaviourSystem != null) { battleBehaviourSystem.ResetSystem(); } } }
//使用道具 public bool UseItem(int itemID, int itemCount) { if (package != null) { var item = PackageItemManager.Instance.GetItem(itemID); if (item == null) { return(false); } int finalCount = 0; int usedCount = package.TryUseItem(itemID, itemCount, ref finalCount); if (usedCount > 0) { BattleUnitUseItemAction action = BattleUnitActionEvent.CreateEvent <BattleUnitUseItemAction>(BattleUnitActionType.UseItem, this); action.itemID = itemID; action.useCount = usedCount; action.remainCount = finalCount; switch (item.itemType) { case PackageItemType.Recover: action.attributeUpdate = new BattleUnitSyncAttribute(); action.attributeUpdate.hpChanged = Mathf.Min(battleUnitAttribute.maxHp - battleUnitAttribute.hp, item.hpRecovery); action.attributeUpdate.energyChanged = Mathf.Min(battleUnitAttribute.maxEnergy - battleUnitAttribute.energy, item.energyRecovery); action.attributeUpdate.currentHP = battleUnitAttribute.hp + action.attributeUpdate.hpChanged; action.attributeUpdate.currentEnergy = battleUnitAttribute.energy + action.attributeUpdate.energyChanged; //自身属性更新 battleUnitAttribute.hp = action.attributeUpdate.currentHP; battleUnitAttribute.energy = action.attributeUpdate.currentEnergy; break; default: break; } battleField.AppendBattleAction(action); } return(usedCount > 0); } else { UtilityHelper.LogError(string.Format("Use item failed, no package : {0} -> {1}", battleUnitAttribute.battleUnitName, itemID)); return(false); } }
//播放战场动作 private IEnumerator PlayBattleByCoroutine(System.Action callback) { if (battleField == null || battleField.battleFieldEvents == null || battleField.battleFieldEvents.Count == 0) { UtilityHelper.LogError(string.Format("Play battle action failed. -> {0}", battleField.ID)); yield break; } //遍历所有战斗动作 while (currentActionIndex < battleField.battleFieldEvents.Count) { //一个英雄行动事件 if (battleField.battleFieldEvents[currentActionIndex] is BattleUnitActionEvent) { BattleUnitActionEvent actionEvent = (BattleUnitActionEvent)battleField.battleFieldEvents[currentActionIndex]; if (actionEvent.battleUnitActionType != BattleUnitActionType.EnterBattleField) { hotPointGridUnit = actionEvent.actionUnit.mapGrid; hotPointBattleUnit = actionEvent.actionUnit; } //有对应的战斗单位,且这个战斗单位已经连接了战斗单位渲染器 if (actionEvent.actionUnit != null && actionEvent.actionUnit.battleUnitRenderer != null) { yield return(actionEvent.actionUnit.battleUnitRenderer.RunHeroAction(actionEvent)); } } //一个格子事件 else if (battleField.battleFieldEvents[currentActionIndex] is GridUnitEvent) { GridUnitEvent gridUnitEvent = (GridUnitEvent)battleField.battleFieldEvents[currentActionIndex]; if (gridUnitEvent.grid != null && gridUnitEvent.grid.gridUnitRenderer != null) { yield return(gridUnitEvent.grid.gridUnitRenderer.RunGridEvent(gridUnitEvent)); } } ++currentActionIndex; } if (callback != null) { callback(); } }
private void RecoverEnergy() { //数值改变 battleUnitAttribute.energy += EGameConstL.EnergyRecoverPerRound; battleUnitAttribute.energy = battleUnitAttribute.energy > battleUnitAttribute.maxEnergy ? battleUnitAttribute.maxEnergy : battleUnitAttribute.energy; //创建一个Action BattleUnitAttributeUpdate action = BattleUnitActionEvent.CreateEvent <BattleUnitAttributeUpdate>(BattleUnitActionType.AttributeUpdate, this); action.attribute = new BattleUnitSyncAttribute(); action.attribute.hpChanged = 0; action.attribute.currentHP = battleUnitAttribute.hp; action.attribute.energyChanged = EGameConstL.EnergyRecoverPerRound; action.attribute.currentEnergy = battleUnitAttribute.energy; action.attribute.currentBP = battleUnitAttribute.BP; battleField.AppendBattleAction(action); }
//自动 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); }
//使用技能 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]); } } } } }