public static async Task FearAllyAI_Timed(BeginTurn state) { var t = Traverse.Create(state); var selected = t.Property("SelectedUnit"); while (Timed_Current() != null && Timed_Current()[BattleRestrictedState.Fear] > 0) { await 0.25f; WuxiaUnit unit = Timed_Current(); unit.OnBufferEvent(BufferTiming.BeginUnit); BM.CameraLookAt = unit.Cell.transform.position; List <WuxiaCell> moveInRange = t.Method("ShowMoveRange", unit).GetValue <List <WuxiaCell> >();//state.ShowMoveRange(unit); var ai = Traverse.Create(t.Property("FearAI").GetValue()); ai.Field("Current").SetValue(unit); await 0.1f; AIActionInfo aiactionInfo = ai.Method("Evaluate", moveInRange).GetValue <AIActionInfo>();//state.FearAI.Evaluate(moveInRange); List <WuxiaCell> list = aiactionInfo?.path; List <WuxiaCell> shortestPath = new List <WuxiaCell>(); int num = unit[BattleProperty.Move]; foreach (WuxiaCell wuxiaCell in moveInRange) { wuxiaCell.UnMark(); } if (list.HasData <WuxiaCell>()) { foreach (WuxiaCell wuxiaCell2 in list) { shortestPath.Add(wuxiaCell2); if (num == 0) { break; } wuxiaCell2.Mark(CellMarkType.WalkPath); num--; } unit.Move(shortestPath[0], shortestPath); while (unit.IsMoving) { await 0; } foreach (WuxiaCell wuxiaCell3 in shortestPath) { wuxiaCell3.UnMark(); } unit.Actor.Move = false; } unit.OnUnitEnd(); if (!unit.IsDead) { unit.OnBufferEvent(BufferTiming.EndUnit); Timed_EndUnit(unit.IsMoved, !unit.IsMoved); UpdateTimedUI(); } } }
// 6 AI!! public static async void SimpleAIAsync_Timed(AITurn state) { var t = Traverse.Create(state); BM.Time = BattleEventToggleTime.BeginAITurn; while (Timed_Current() != null && (Timed_Current().faction != Faction.Player || autoBattle.Value)) { WuxiaUnit unit = Timed_Current(); List <WuxiaUnit> second = (from u in BM.WuxiaUnits where u.faction == unit.faction select u).ToList <WuxiaUnit>(); BM.WuxiaUnits.Except(second).ToList <WuxiaUnit>(); if (Timed_GetBeginTurn(unit)) { unit.OnBufferEvent(BufferTiming.BeginTurn); unit.CalculationNumber_Of_Movements(); Timed_SetBeginTurn(unit, false); } BM.OnBattleEvent(BattleEventToggleTime.BeginUnit, Array.Empty <object>()); if (BM.IsEvent) { Debug.Log("AI回合,等待事件結束"); } else { await 0.25f; bool isMove = false; bool isRest = true; if (unit.IsBattleEventCube) { Timed_EndUnit(false, true); continue; } unit.OnBufferEvent(BufferTiming.BeginUnit); if (!t.Field("disable").GetValue <bool>()) //*state.disable*/ { BM.CameraLookAt = unit.Cell.transform.position; List <WuxiaCell> moveInRange = t.Method("ShowMoveRange", unit).GetValue <List <WuxiaCell> >(); //state.ShowMoveRange(unit); await 0.1f; AIActionInfo useinfo = Traverse.Create(t.Method("GetBattleAI", unit).GetValue()).Method("Evaluate", moveInRange).GetValue <AIActionInfo>(); //state.GetBattleAI(unit).Evaluate(moveInRange); if (useinfo == null) { foreach (WuxiaCell wuxiaCell in moveInRange) { wuxiaCell.UnMark(); } Timed_EndUnit(isMove, isRest); UpdateTimedUI(); unit.ReCover(); BM.OnBattleEvent(BattleEventToggleTime.EndUnit, Array.Empty <object>()); unit.OnBufferEvent(BufferTiming.EndUnit); continue; } if (useinfo.skill != null && useinfo.attackCell == unit.Cell) { useinfo.attackCell = useinfo.moveEnd; } AIActionInfo aiactionInfo = useinfo; List <WuxiaCell> list = aiactionInfo?.path; List <WuxiaCell> shortestPath = new List <WuxiaCell>(); int num = unit[BattleProperty.Move]; foreach (WuxiaCell wuxiaCell2 in moveInRange) { wuxiaCell2.UnMark(); } if (list.HasData <WuxiaCell>()) { foreach (WuxiaCell wuxiaCell3 in list) { shortestPath.Add(wuxiaCell3); if (num == 0) { break; } wuxiaCell3.Mark(CellMarkType.WalkPath); num--; } unit.Move(shortestPath[0], shortestPath); while (unit.IsMoving) { isMove = true; await 0; } foreach (WuxiaCell wuxiaCell4 in shortestPath) { wuxiaCell4.UnMark(); } unit.Actor.Move = false; } if (unit[BattleRestrictedState.Daze] > 0 || unit[BattleRestrictedState.Seal] > 0 || unit.IsAction) { unit.OnUnitEnd(); } else if (useinfo.attackCell != null) { WuxiaCell point = useinfo.attackCell; List <WuxiaCell> attackInRange = t.Method("ShowAttackRange", useinfo.skill, unit.Cell).GetValue <List <WuxiaCell> >();//state.ShowAttackRange(useinfo.skill, unit.Cell); await 0.1f; foreach (WuxiaCell wuxiaCell5 in attackInRange) { wuxiaCell5.UnMark(); } List <WuxiaCell> targetInRange = state.GetTargetInRange(useinfo.skill, attackInRange, unit.Cell, point); await 0.1f; foreach (WuxiaCell wuxiaCell6 in targetInRange) { wuxiaCell6.UnMark(); } List <WuxiaUnit> list2 = new List <WuxiaUnit>(); for (int i = 0; i < targetInRange.Count; i++) { if (targetInRange[i].Unit != null && Traverse.Create(BM).Method("CheckSkillUnit", targetInRange[i], useinfo.skill, unit).GetValue <bool>() /*BM.CheckSkillUnit(targetInRange[i], useinfo.skill, unit)*/ && !list2.Contains(targetInRange[i].Unit)) { list2.Add(targetInRange[i].Unit); } } if (list2.Count > 0 || useinfo.skill.Item.DamageType == DamageType.Summon) { if (unit.SpecialSkill == "specialskill0101" && list2.Count > 0 && useinfo.skill.Item.DamageType == DamageType.Damage) { t.Method("PlayChangeElement", unit.LearnedSkills["specialskill0101"], unit, list2).GetValue(); //state.PlayChangeElement(unit.LearnedSkills["specialskill0101"], unit, list2); } t.Method("PlayAbility", useinfo.skill, point, unit, list2).GetValue(); //state.PlayAbility(useinfo.skill, point, unit, list2); } while (t.Field("isPlayAbility").GetValue <bool>()) //state.isPlayAbility) { BattleGlobalVariable.AddUsedSkill(unit.UnitID, useinfo.skill.Item.Id); isRest = false; await 0; } if (!(unit.SpecialSkill == useinfo.skill.Id)) { unit.OnUnitEnd(); } } else { unit.OnUnitEnd(); } if (unit.IsEndUnit) { if (!unit.IsDead) { Timed_EndUnit(isMove, isRest); UpdateTimedUI(); } BM.OnBattleEvent(BattleEventToggleTime.EndUnit, Array.Empty <object>()); } if (!unit.IsDead) { unit.OnBufferEvent(BufferTiming.EndUnit); continue; } continue; } } return; } await 0.1f; while (BM.IsEvent) { Debug.Log("AI回合,等待事件結束"); await 0.1f; } if (Timed_Current() != null) { t.Method("FirstUnitSelect").GetValue();//state.FirstUnitSelect(); } FSM.SendEvent("ENDTURN"); }
public static bool TimedPatch_End1(EndUnit __instance) { Console.WriteLine("EndUnit.OnEnable()"); var t = Traverse.Create(__instance); var selected = t.Property("SelectedUnit"); if (bTimed && UnitWantWait) // 处理等待 { UnitWantWait = false; // 重置等待 Timed_WaitUnit(); UpdateTimedUI(); FSM.UI.CloseMenu(); FSM.UI.CloseUnitInfo(); WuxiaUnit wuxiaUnit = Timed_Current(); if (wuxiaUnit != null && wuxiaUnit.faction == Faction.Player) { t.Method("FirstUnitSelect").GetValue();//__instance.FirstUnitSelect(); __instance.SendEvent("FINISHED"); return(false); } //__instance.SelectedUnit = null; selected.SetValue(null); __instance.SendEvent("ENDTURN"); return(false); } BM.Time = BattleEventToggleTime.EndUnit; BM.OnBattleEvent(BattleEventToggleTime.EndUnit, Array.Empty <object>()); FSM.UI.CloseMenu(); FSM.UI.CloseUnitInfo(); if (!BM.IsEvent) { if (selected.GetValue <WuxiaUnit>() != null) { WuxiaUnit selectedUnit = selected.GetValue <WuxiaUnit>(); if (selectedUnit != null) { selectedUnit.OnUnitEnd(); } WuxiaUnit selectedUnit2 = selected.GetValue <WuxiaUnit>(); if (selectedUnit2 != null) { selectedUnit2.OnTurnEnd(); } if (selected.GetValue <WuxiaUnit>()[BattleLiberatedState.InfiniteAction] > 0) { WuxiaUnit selectedUnit3 = selected.GetValue <WuxiaUnit>(); if (selectedUnit3 != null) { selectedUnit3.OnTurnStart(); } } if (selected.GetValue <WuxiaUnit>()[BattleLiberatedState.Encourage] > 0) { WuxiaUnit selectedUnit4 = selected.GetValue <WuxiaUnit>(); if (selectedUnit4 != null) { selectedUnit4.OnTurnStart(); } } selected.GetValue <WuxiaUnit>().OnBufferEvent(BufferTiming.EndUnit); } t.Method("OnUnitEnd").GetValue();//this.OnUnitEnd(); } return(false); }