public void OnUpdate() { if (bTimed && FSM != null) { for (int num = 0; num < UIPortraits.Count; num++) { if (UIUnitIndex.ContainsValue(num)) { Image image = UIPortraits[num]; Text text = UINames[num]; int order = UIPortraitOrder[num]; WuxiaUnit unit = UIWuxiaUnits[order]; Vector3 targetPos = (order == 0) ? new Vector3(68f, 620f, 0f) : new Vector3(80f, 610f - (float)order * 48f, 0f); if (unit != null && unit.IsEndUnit) { targetPos += new Vector3(-20f, -20f, 0f); } image.transform.position = Vector3.Lerp(image.transform.position, targetPos, Time.deltaTime * 5f); } } if (UnitMenu != null && UnitMenu.isActiveAndEnabled && wait_button != null) { wait_button.GetComponentsInChildren <Text>(true)[1].text = "等待"; var unit = Traverse.Create(UnitMenu).Field("unit").GetValue <WuxiaUnit>(); wait_button.gameObject.SetActive(!Timed_IsWaiting(unit) && !unit.IsMoving && !unit.IsMoved && !unit.IsAction); } } }
public static async void OnEnable_Timed(BeginTurn state) { var t = Traverse.Create(state); var selected = t.Property("SelectedUnit"); WuxiaUnit wuxiaUnit = Timed_Current(); if (wuxiaUnit != null) { if (wuxiaUnit.faction != Faction.Player || autoBattle.Value) { state.SendEvent("AI"); } else { if (wuxiaUnit[BattleRestrictedState.Fear] > 0) { await FearAllyAI_Timed(state); } t.Method("FirstUnitSelect").GetValue();//state.FirstUnitSelect(); state.SendEvent("FINISHED"); } } else { BM.Time = BattleEventToggleTime.BeginTurn; BM.OnBattleEvent(BattleEventToggleTime.BeginTurn, Array.Empty <object>()); BM.OnBattleEvent(BattleEventToggleTime.BeginAITurn, Array.Empty <object>()); if (!BM.IsEvent) { await FSM.UI.battleTurn.NextTurnAsync(true); FSM.UI.battleTurn.Hide(); foreach (WuxiaUnit wuxiaUnit2 in BM.WuxiaUnits) { if (!wuxiaUnit2.IsDead) { wuxiaUnit2.OnTurnStart(); } } Timed_NextTurn(); WuxiaUnit wuxiaUnit3 = Timed_Current(); if (wuxiaUnit3 != null) { BM.Turn++; if (wuxiaUnit3.faction != Faction.Player || autoBattle.Value) { state.SendEvent("AI"); return; } if (wuxiaUnit3[BattleRestrictedState.Fear] > 0) { await FearAllyAI_Timed(state); } t.Method("FirstUnitSelect").GetValue(); //state.FirstUnitSelect(); state.SendEvent("FINISHED"); } } } UpdateTimedUI(); }
public override Status GetValue() { if (base.WuxiaBattleManager == null) { return(Status.Error); } string[] array2 = CellNumber.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); int max = (count > 0) ? Math.Min(count, Game.GameData.Party.Count) : Game.GameData.Party.Count; for (int i = 0; i < max; i++) { string text = Game.GameData.Party.GetPartyByIndex(i); int tileNumber = 0; if (i < array2.Length) { tileNumber = int.Parse(array2[i]); } else { tileNumber = (i == 0) ? -1 : -3; // 距离2格随机 } WuxiaUnit wuxiaUnit = base.WuxiaBattleManager.AddUnit(text, Faction.Player, tileNumber, !fullHealth); base.WuxiaBattleManager.FacedToNearestEnemy(wuxiaUnit); } return(Status.Success); }
public void OnUpdate() { if (Input.GetKeyDown(speedKey.Value)) { if (customTimeScale == 1f) { customTimeScale = Math.Max(0.1f, speedValue.Value); Time.timeScale *= customTimeScale; } else { Time.timeScale /= customTimeScale; customTimeScale = 1f; } } if (Input.GetKeyDown(changeAnim.Value) && Game.BattleStateMachine != null) { if (IdleAnimOverrides == null) { BuildIdleAnimOverrides(); } WuxiaUnit unit = Traverse.Create(Game.BattleStateMachine).Field("_currentUnit").GetValue <WuxiaUnit>(); if (unit != null && IdleAnimOverrides != null && IdleAnimOverrides.Count > 0) { string randomIdleAnim = IdleAnimOverrides.Random(); AnimationClip animationClip = Game.Resource.Load <AnimationClip>(GameConfig.AnimationPath + randomIdleAnim + ".anim"); if (animationClip != null) { var list = new[] { ("idle", animationClip) };
public static void TimedPatch_AddUnit(WuxiaBattleUnit __instance, WuxiaUnit __result) { if (bTimed) { Timed_AddUnit(__result); // 添加单位 } }
public static void ModPatch_BattleVoice(WuxiaUnit _unit) { if (GlobalLib.ModResource != null && modCustomVoice.Value) { PlayCvByCharacter(_unit.ExteriorId); } }
public static void SkillExpPatch_WuxiaUnit(ref WuxiaUnit __instance, ref CharacterSkillData __result) { foreach (var s in __result) { s.Value.CharacterId = null; } }
public static void ModPatch_BattleVoice(WuxiaUnit _unit) { if (modCustomVoice.Value) { PlayCvByCharacter(_unit.ExteriorId); } }
public static void TimedPatch_Color5(UIBattle __instance, WuxiaUnit unit) { if (bTimed) { UISelected = null; UpdateTimedUI(); } }
public static void TimedPatch_Color4(UIBattle __instance) { if (bTimed) { UIHeal = null; UpdateTimedUI(); } }
public static void TimedPatch_Color3(UIBattle __instance, WuxiaUnit _unit) { if (bTimed) { UIHeal = _unit; UpdateTimedUI(); } }
public static bool TimedPatch_EncourageUnit(WuxiaUnit __instance) { if (bTimed) { Timed_EncourageUnit(__instance); // 顺序提前 } return(true); }
public static void TimedPatch_Color2(UIBattle __instance) { if (bTimed) { UITarget = null; UpdateTimedUI(); } }
public static bool TimedPatch_End2(EndUnit __instance) { var t = Traverse.Create(__instance); var selected = t.Property("SelectedUnit"); BM.BattleWinLose.CheckWinLose(BattleEventToggleTime.EndTurn); if (BM.BattleWinLose.Type > WinLoseType.None) { __instance.SendEvent("ENDTURN"); } else if (bTimed) { WuxiaUnit wuxiaUnit = Timed_Current(); if (wuxiaUnit != null && wuxiaUnit.IsEndUnit) { Timed_EndUnit(wuxiaUnit.IsMoved, UnitIsRest); UpdateTimedUI(); if (__instance.CheckIsEndTurn()) { __instance.SendEvent("ENDTURN"); //base.SelectedUnit = null; selected.SetValue(null); return(false); } } wuxiaUnit = Timed_Current(); if (wuxiaUnit != null && wuxiaUnit.faction == Faction.Player) { t.Method("FirstUnitSelect").GetValue(); //base.FirstUnitSelect(); __instance.SendEvent("FINISHED"); } else { selected.SetValue(null); __instance.SendEvent("ENDTURN"); } } else if (__instance.CheckIsEndTurn()) { __instance.SendEvent("ENDTURN"); //base.SelectedUnit = null; selected.SetValue(null); } else { if (selected.GetValue <WuxiaUnit>() == null) { t.Method("FirstUnitSelect").GetValue(); //base.FirstUnitSelect(); } if (selected.GetValue <WuxiaUnit>().IsEndUnit) { //__instance.SelectedUnit = __instance.FindNext(false); selected.SetValue(Traverse.Create(__instance).Method("FindNext", false).GetValue <WuxiaUnit>()); } __instance.SendEvent("FINISHED"); } return(false); }
public static bool TimedPatch_RemoveUnit(WuxiaBattleUnit __instance, WuxiaUnit unit) { if (bTimed) { Timed_RemoveUnit(unit); // 去除单位 UpdateTimedUI(); } return(true); }
public static void Timed_AddUnit(WuxiaUnit unit) { if (unit.IsBattleEventCube) { return; } TimedActives.Insert(0, unit); Timed_EndUnit(true, false); }
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(); } } }
public static void AssessoryPatch_AttachEquipEffect2(WuxiaUnit __instance) { for (int i = 1; i <= moreAccessories.Value; ++i) { _accessoryIndex = (_accessoryIndex + 1) % (1 + moreAccessories.Value); Props equip = __instance.info.Equip.GetEquip(EquipType.Jewelry); __instance.AttachEquipEffect(equip); } _accessoryIndex = 0; }
public static void Timed_RemoveUnit(WuxiaUnit unit) { if (unit.IsBattleEventCube) { return; } TimedActives.Remove(unit); TimedWaiting.Remove(unit); TimedNext.Remove(unit); TimedValue.Remove(unit); }
public static void SkillExpPatch_AddExp(ref UnitPlayAbility __instance) { if (skillExpInBattle.Value) { Type t = Traverse.CreateWithType("UnitPlayAbilityEventArgs").GetValue <Type>(); object args = Traverse.Create(__instance).Field("args").GetValue(); WuxiaUnit attacker = t.GetField("Attacker").GetValue(args) as WuxiaUnit; SkillData skillData = t.GetField("UseSkill").GetValue(args) as SkillData; AddExpInBattle(attacker, skillData.Id); } }
public static void Timed_WaitUnit() { if (TimedActives.Count <= 0) { UnityEngine.Debug.LogError("列表为空,出错"); return; } WuxiaUnit item = TimedActives[0]; TimedActives.RemoveAt(0); TimedWaiting.Insert(0, item); }
public static bool TimedPatch_BeginUnit2(BeginUnit __instance) { var t = Traverse.Create(__instance); // base.OnEnable(); var inputInfo = typeof(InputState).GetField("InputInfos", BindingFlags.Static | BindingFlags.NonPublic); if (inputInfo.GetValue(null) == null) { var bii = new List <BattleInputInfo>(); for (int i = 0; i < 36; i++) { BattleInputInfo item = new BattleInputInfo(); bii.Add(item); } inputInfo.SetValue(null, bii); } Game.Input.Push(__instance); BM.Time = BattleEventToggleTime.BeginUnit; if (bTimed) { WuxiaUnit wuxiaUnit = Timed_Current(); if (wuxiaUnit != null && !Timed_IsWaiting(wuxiaUnit)) { if (Timed_GetBeginTurn(wuxiaUnit)) { wuxiaUnit.OnBufferEvent(BufferTiming.BeginTurn); Timed_SetBeginTurn(wuxiaUnit, false); } BM.OnBattleEvent(BattleEventToggleTime.BeginUnit, Array.Empty <object>()); WaitClick = new Action(() => { UnitWantWait = true; UnitIsRest = false; __instance.SendEvent("FINISHED"); }); } } else { BM.OnBattleEvent(BattleEventToggleTime.BeginUnit, Array.Empty <object>()); } if (!BM.IsEvent) { t.Method("InitBeginUnit").GetValue();// this.InitBeginUnit(); FSM.UI.SkillClick = new Action <SkillData>(__instance.OnSkillClick); FSM.UI.RestClick = new Action(__instance.OnRestClick); } return(false); }
public static void Timed_EncourageUnit(WuxiaUnit unit) { if (TimedActives.Contains(unit)) { TimedActives.Remove(unit); } if (TimedNext.Contains(unit)) { TimedNext.Remove(unit); } if (!TimedWaiting.Contains(unit)) { TimedActives.Insert((TimedActives.Count > 0) ? 1 : 0, unit); } }
public override async Task Process(BattleEventArgs arg) { AttackEventArgs e = arg as AttackEventArgs; string[] array = e.Skill.Item.Summonid.Split(new char[] { ',' }); e.Attacker.FaceTo(e.Point.transform.position); this.damageInfo = this.CreateDamageInfo(e.Attacker, e.Defender, e.Skill); this.damageInfo.FloorEffect = e.Point.gameObject; await 0.1f; for (int i = 0; i < array.Length; i++) { string summonid = array[i]; this.manager.GetCellNearestCamera(); WuxiaCell point = e.Point; WuxiaUnit unit = this.manager.AddUnit(summonid, e.Attacker.faction, (i == 0) ? point.CellNumber : -2, false); unit.Actor.transform.localScale = new Vector3(1.5f, 1.5f, 1.5f); unit.transform.forward = e.Attacker.transform.forward; unit.gameObject.OnTerrain(unit.transform.position); unit.gameObject.SetActive(false); this.summonUnits.Add(unit); unit.OnTurnStart(); // 半即时支持 if (HookInitiactiveBattle.bTimed) { HookInitiactiveBattle.Timed_EncourageUnit(unit); } } await 0.1f; if (GameConfig.IsSkipSkillEffect) { this.ProcessAnimationTrack(this.damageInfo); } else { Task <float> attackEventTime = this.ProcessAnimation(this.damageInfo, 0f); await attackEventTime; await attackEventTime.Result; } base.ProcessSkillMPCost(e); if (e.Attacker[BattleLiberatedState.No_CoolDown] == 0) { e.Skill.CurrentCD = e.Skill.MaxCD; } }
// 1 在PlayAbility状态时增加经验 static void AddExpInBattle(WuxiaUnit unit, string skillId) { SkillData skillDataLearned = unit.LearnedSkills[skillId]; if (skillDataLearned.Item.RequireValue > 0 && skillExpRate.Value > 0f) { int num = CalculateNurturanceExp(unit.info, skillDataLearned.Item.RequireAttribute, skillDataLearned.Item.RequireValue); num = Math.Max(1, (int)(num * skillExpRate.Value)); try { unit.info.AddSkillExp(skillId, num); } catch { Console.WriteLine("出招者的Info有问题:" + unit.CharacterInfoId); } skillDataLearned.AddExp(num); } }
public override Status GetValue() { WuxiaUnit attacker = BattleGlobalVariable.CurrentDamage.Attacker; Status result; if (attacker == null) { result = Status.Failure; } else if (attacker.CharacterInfoId == this.CharacterId == this.IsMatch) { result = Status.Success; } else { result = Status.Failure; } return(result); }
public static bool Patch_ScheduleLoad3(WuxiaBattleBuffer __instance, WuxiaUnit unit, string bufferId, bool _is_born, bool _first) { if (bufferId.IsNullOrEmpty()) { Heluo.Logger.LogError("要附加的BufferId是空值", "AddBuffer", "C:\\PathOfWuxia\\PathOfWuxia\\Assets\\Scripts\\Battle\\WuxiaBattleBuffer.cs", 119); return(false); } try { string path = string.Format(GameConfig.ButtleBufferPath, GameConfig.Language, bufferId + ".json"); Heluo.Data.Buffer buffer = ModJson.FromJsonResource <Heluo.Data.Buffer>(path, false); // buff大概不用替换id吧.. __instance.AddBuffer(unit, buffer, _is_born, _first); } catch { Heluo.Logger.LogError("附加Buffer : " + bufferId + " 失敗", "AddBuffer", "C:\\PathOfWuxia\\PathOfWuxia\\Assets\\Scripts\\Battle\\WuxiaBattleBuffer.cs", 135); } return(false); }
public static List <WuxiaUnit> TimedWaiting = new List <WuxiaUnit>(); // 等待者 public static void Timed_EndUnit(bool isMoved, bool isRest) { WuxiaUnit wuxiaUnit = Timed_Current(); if (wuxiaUnit == null) { Debug.LogError("当前行动列表为空,出错!"); } Debug.Log(string.Concat(new string[] { wuxiaUnit.name, " 行动结束, 移动=", isMoved.ToString(), " 休息=", isRest.ToString() })); (TimedActives.Contains(wuxiaUnit) ? TimedActives : TimedWaiting).RemoveAt(0); TimedNext.Add(wuxiaUnit); float num = (float)wuxiaUnit.info.GetUpgradeableProperty(CharacterUpgradableProperty.Dex); num += UnityEngine.Random.value * 0.5f * (float)wuxiaUnit.info.GetUpgradeableProperty(CharacterUpgradableProperty.Spi); if (!isMoved) { num *= 1.5f; } if (isRest) { num *= 1.5f; } if (TimedValue.ContainsKey(wuxiaUnit)) { TimedValue[wuxiaUnit].value = (int)num; } else { TimedValue.Add(wuxiaUnit, new TimeInfo() { value = num, begin = true }); } TimedNext.Sort((WuxiaUnit a, WuxiaUnit b) => TimedValue[b].value.CompareTo(TimedValue[a].value)); }
// Token: 0x06002C7B RID: 11387 RVA: 0x000F030C File Offset: 0x000EE50C public override Status GetValue() { if (WuxiaBattleManager == null) { return(Status.Error); } for (int i = 0; i < Count; i++) { string pattern = (i == 0) ? Pattern : "*"; Console.WriteLine("Random Pattern " + pattern); Npc npc = Randomizer.GetOneFromData <Npc>(pattern); if (npc == null) { return(Status.Error); } int tileNumber = (i == 0) ? CellNumber : -Range - 1; WuxiaUnit wuxiaUnit = WuxiaBattleManager.AddUnit(npc.Id, Faction, tileNumber, !FullHealth); WuxiaBattleManager.FacedToNearestEnemy(wuxiaUnit); } return(Status.Success); }
static bool ModExt_AddUnitOnBattleGround(WuxiaBattleManager __instance, string unitid, int tileNumber, Faction faction, bool isParty, ref WuxiaUnit __result) { WuxiaUnit result = null; int times = 0; while (result == null && times < 10) { int tile = tileNumber; AddUnitHelper.ProcessCellNumber(__instance, ref tile); Console.WriteLine(string.Format("元tile={0}, 新tile={1}", tileNumber, tile)); try { WuxiaUnit wuxiaUnit = __instance.UnitGenerator.CreateUnit(unitid, faction, tile, isParty); wuxiaUnit.UnitDestroyed += __instance.OnUnitDestroyed; result = wuxiaUnit; } catch (Exception e) { Debug.LogError(string.Format("AddUnit失败: id={0} faction={1} tile={2} isparty={3} error={4},再次尝试", new object[] { unitid, faction, tile, isParty, e.ToString() })); times++; result = null; } } if (result == null) { UnityEngine.Debug.LogError("尝试10次无果,请彻查地图格子设置"); } __result = result; return(false); }