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();
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);    // 添加单位
     }
 }
Beispiel #6
0
 public static void ModPatch_BattleVoice(WuxiaUnit _unit)
 {
     if (GlobalLib.ModResource != null && modCustomVoice.Value)
     {
         PlayCvByCharacter(_unit.ExteriorId);
     }
 }
Beispiel #7
0
 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();
                }
            }
        }
Beispiel #18
0
 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);
 }
Beispiel #20
0
 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;
            }
        }
Beispiel #25
0
        // 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);
            }
        }
Beispiel #26
0
        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);
        }