From 61eaa99fa6f02f038f05c416adfcf0a2f988a00c Mon Sep 17 00:00:00 2001 From: zhangaotian <8474238@qq.com> Date: Mon, 29 Jul 2024 16:01:29 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=BB=BA=E9=80=A0=E3=80=91=E6=9B=B4?= =?UTF-8?q?=E6=8D=A2=E8=A7=A3=E9=94=81=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Forest/Assets/Config/Build/Build_1.json | 15 ++-- .../Assets/Config/Data/guide_guideconfig.json | 2 +- .../Config/Data/stringcfg_stringconfig.json | 4 +- .../Scripts/Framework/GameBuild/BuildBoot.cs | 63 ++++++++----- .../Scripts/Framework/Manager/BuildManager.cs | 85 +++++++++++++----- .../Scripts/Gameplay/Debug/SROptions.Level.cs | 7 ++ Tool/Luban/.cache.meta | 42 ++++----- Tool/Luban/Datas/Guide.xlsx | Bin 10493 -> 10476 bytes Tool/Luban/Datas/StringConfig.xlsx | Bin 13521 -> 13506 bytes 9 files changed, 141 insertions(+), 77 deletions(-) diff --git a/Forest/Assets/Config/Build/Build_1.json b/Forest/Assets/Config/Build/Build_1.json index a428395..809a60d 100644 --- a/Forest/Assets/Config/Build/Build_1.json +++ b/Forest/Assets/Config/Build/Build_1.json @@ -7,23 +7,28 @@ "unlockInfos": [ { "condition": 1, - "conditionGroup": 5 + "conditionGroup": 5, + "preGroup": 0 }, { "condition": 25, - "conditionGroup": 1 + "conditionGroup": 1, + "preGroup": 5 }, { "condition": 50, - "conditionGroup": 3 + "conditionGroup": 3, + "preGroup": 1 }, { "condition": 75, - "conditionGroup": 4 + "conditionGroup": 4, + "preGroup": 3 }, { "condition": 95, - "conditionGroup": 2 + "conditionGroup": 2, + "preGroup": 4 } ], "nodeInfos": [ diff --git a/Forest/Assets/Config/Data/guide_guideconfig.json b/Forest/Assets/Config/Data/guide_guideconfig.json index 606edbd..f600c2e 100644 --- a/Forest/Assets/Config/Data/guide_guideconfig.json +++ b/Forest/Assets/Config/Data/guide_guideconfig.json @@ -61,7 +61,7 @@ "GuideNote": "点击岛屿", "GuideDesKey": "Guide_106", "GuideType": 0, - "GuideParams": "BuildRoot/Node5/Option1/Normal", + "GuideParams": "BuildRoot/Node5/Btn", "GuideCompleteType": 0, "GuideCompleteParams": "BuildBoot/BuildUIRoot/UIMainBuild/UI_LiuHaiBottom/Build_Bar" }, diff --git a/Forest/Assets/Config/Data/stringcfg_stringconfig.json b/Forest/Assets/Config/Data/stringcfg_stringconfig.json index c720893..5504024 100644 --- a/Forest/Assets/Config/Data/stringcfg_stringconfig.json +++ b/Forest/Assets/Config/Data/stringcfg_stringconfig.json @@ -392,8 +392,8 @@ { "ID": 166, "Key": "Guide_106", - "Value": "点击岛屿", - "Value_En": "Click island" + "Value": "点击泡泡按钮", + "Value_En": "Click bubble button" }, { "ID": 167, diff --git a/Forest/Assets/Scripts/Framework/GameBuild/BuildBoot.cs b/Forest/Assets/Scripts/Framework/GameBuild/BuildBoot.cs index 5b17888..9a94689 100644 --- a/Forest/Assets/Scripts/Framework/GameBuild/BuildBoot.cs +++ b/Forest/Assets/Scripts/Framework/GameBuild/BuildBoot.cs @@ -55,6 +55,12 @@ public class BuildBoot : MonoBehaviour /// public void OptionDisplay(Option option) { + if (option == null) + { + CloseAllOptionButBubble(true); + return; + } + foreach (var optionInfo in Options.Values) { optionInfo.SetOptionActive(option); @@ -94,6 +100,12 @@ public class BuildBoot : MonoBehaviour public void SetOptionActive(Option option) { + if (option == null) + { + OptionObj.SetActive(false); + return; + } + OptionObj.SetActive(Name.Equals(option.Name)); } @@ -314,6 +326,7 @@ public class BuildBoot : MonoBehaviour CurCondition = BuildManager.Instance.ReachCondition < 0 ? CurCondition : BuildManager.Instance.ReachCondition; + var nextLockNode = BuildManager.Instance.GetNextLockNode(CurCondition); if (string.IsNullOrEmpty(nextLockNode)) { @@ -328,28 +341,26 @@ public class BuildBoot : MonoBehaviour } else { - foreach (var chooseNode in chooseNodeInfo) + foreach (var node in _nodes) { - if (_nodes.TryGetValue(chooseNode.Key, out var node)) + if (!chooseNodeInfo.TryGetValue(node.Key, out var unlockNode)) return; + //已选择节点 + if (!string.IsNullOrEmpty(unlockNode)) { - var option = node.GetOption(chooseNode.Value); - var condition = BuildManager.Instance.GetCondition(chooseNode.Key); - if (CurCondition >= condition) - { - node.OptionDisplay(option); - } - else - { - if (node.Name.Equals(nextLockNode)) - { - _curBubble = node.BubbleObj; - node.CloseAllOptionButBubble(true); - } - else - { - node.CloseAllOptionButBubble(false); - } - } + + var option = node.Value.GetOption(unlockNode); + node.Value.OptionDisplay(option); + } + //需解锁节点 + else if (node.Key.Equals(nextLockNode) && string.IsNullOrEmpty(unlockNode)) + { + _curBubble = node.Value.BubbleObj; + node.Value.CloseAllOptionButBubble(true); + } + //未解锁 + else if (!node.Key.Equals(nextLockNode) && string.IsNullOrEmpty(unlockNode)) + { + node.Value.CloseAllOptionButBubble(false); } } } @@ -421,7 +432,7 @@ public class BuildBoot : MonoBehaviour { //选择时UI var otherRoot = GameObject.Find("OtherRoot").gameObject; - _mask =otherRoot.transform.Find("Mask").gameObject; + _mask = otherRoot.transform.Find("Mask").gameObject; _pickItem = GameObject.Find("OtherRoot/PickItem").gameObject; _pickSpriteRenderer = _pickItem.GetComponent(); @@ -491,7 +502,7 @@ public class BuildBoot : MonoBehaviour EventManager.Instance.Send(EventManager.EventName.ShowMainUI); //放弃修改 - if (_curNode == null || _curOption == null) return; + if (_curNode == null) return; _curNode.OptionDisplay(_curOption); _curNode = null; _curOption = null; @@ -507,7 +518,7 @@ public class BuildBoot : MonoBehaviour _mask.SetActive(false); _pickItem.SetActive(false); _buildBar.Close(); - + EventManager.Instance.Send(EventManager.EventName.CloseUI); EventManager.Instance.Send(EventManager.EventName.ShowMainUI); @@ -516,11 +527,13 @@ public class BuildBoot : MonoBehaviour _curBubble.SetActive(true); return; } - + + //DebugUtil.LogError("保存更改,当前节点:{0},当前选项:{1}", _curNode.Name, _newOption.Name); BuildManager.Instance.SaveNodeInfo(_curNode.Name, _newOption.Name); _curNode = null; _curOption = null; _newOption = null; + UpdateBuildDisplay(); } private void ShowUI() @@ -595,9 +608,11 @@ public class BuildBoot : MonoBehaviour obj.SetActive(false); var nodeName = obj.transform.parent.name; EventManager.Instance.Send(EventManager.EventName.HideMainUI); + if (_nodes.TryGetValue(nodeName, out var node)) { var condition = BuildManager.Instance.GetCondition(nodeName); + _curNode = node; _buildBar.Open(node, BuildIconClick, BuildLockIconClick, CurCondition, condition); EventManager.Instance.Send(EventManager.EventName.OpenUI); diff --git a/Forest/Assets/Scripts/Framework/Manager/BuildManager.cs b/Forest/Assets/Scripts/Framework/Manager/BuildManager.cs index 634d8c9..b5cd764 100644 --- a/Forest/Assets/Scripts/Framework/Manager/BuildManager.cs +++ b/Forest/Assets/Scripts/Framework/Manager/BuildManager.cs @@ -47,6 +47,8 @@ namespace Framework.Manager //主题 or 挂点 [LabelText("对应组")] public int conditionGroup; + + [LabelText("前置组")] public int preGroup; } [Serializable] @@ -84,6 +86,9 @@ namespace Framework.Manager //按挂点解锁条件 public int Condition; + //前置解锁组 + public string PreGroup; + public string IconPath; public OptionInfo GetOptionInfo(string optionID = null) @@ -104,6 +109,9 @@ namespace Framework.Manager //按主题解锁条件 public int Condition; + + //前置主题 + public string PreThematic; } /// @@ -150,6 +158,8 @@ namespace Framework.Manager public Dictionary NodeInfos; + public NodeInfo CurIUnlockNodeInfo; + public bool IsChanging = false; //玩家存盘选择信息 @@ -266,17 +276,14 @@ namespace Framework.Manager continue; } - var optionInfo = nodeInfo.Value.GetOptionInfo(); + /*var optionInfo = nodeInfo.Value.GetOptionInfo(); if (optionInfo == null) return; - _userBuildInfo.ChooseNodeInfo.TryAdd(nodeInfo.Key, optionInfo.Name); + _userBuildInfo.ChooseNodeInfo.TryAdd(nodeInfo.Key, optionInfo.Name);*/ + _userBuildInfo.ChooseNodeInfo.TryAdd(nodeInfo.Key, ""); } - //打印Debug玩家Build信息 - /*foreach (var infos in _userBuildInfo.ChooseNodeInfo) - { - DebugUtil.LogError("节点 {0} 选择的的是 {1}", infos.Key, infos.Value); - }*/ + //DebugUserChooseNode(); } catch (Exception e) { @@ -301,7 +308,9 @@ namespace Framework.Manager if (NodeInfos.TryGetValue(nodeName, out var nodeInfo)) { nodeInfo.Condition = unlockInfo.condition; - //DebugUtil.LogError("挂点解锁:节点{0}的解锁条件是:{1}", nodeInfo.Name, unlockInfo.condition); + var nextNode = string.Format(NodeName, unlockInfo.preGroup); + nodeInfo.PreGroup = nextNode; + //DebugUtil.LogError("挂点解锁:节点{0}的解锁条件是: {1}, 前置解锁组是: {2}", nodeInfo.Name, unlockInfo.condition, nextNode); } } @@ -317,8 +326,12 @@ namespace Framework.Manager if (nodeInfo.Options.TryGetValue(optionName, out var optionInfo)) { optionInfo.Condition = unlockInfo.condition; - DebugUtil.LogError("主题解锁:节点{0}的选项{1}的解锁条件是:{2}", nodeInfo.Name, optionInfo.Name, - unlockInfo.condition); + + var nextOption = string.Format(OptionName, unlockInfo.preGroup); + optionInfo.PreThematic = nextOption; + DebugUtil.LogError("主题解锁:节点{0}的选项{1}的解锁条件是:{2}, 前置解锁主题是: {3}", nodeInfo.Name, + optionInfo.Name, + unlockInfo.condition, nextOption); } } } @@ -438,33 +451,34 @@ namespace Framework.Manager StorageManager.Instance.SaveWithoutUpdate(); } + public string GetNextLockNode(int condition) { - DebugUtil.LogWarning("当前达到条件:{0}", condition); string nodeName = null; switch (_curBuildData.unlockType) { case UnlockType.ForGroup: { - var nodeList = NodeInfos.Values.Where(node => node.Condition > condition).ToList(); - - if (nodeList.Count <= 0) - return null; - - nodeName = nodeList[0].Name; - int minCondition = nodeList[0].Condition; - - foreach (var nodeInfo in nodeList) + foreach (var node in NodeInfos) { - if (nodeInfo.Condition < minCondition) + if (_userBuildInfo.ChooseNodeInfo.TryGetValue(node.Key, out var curNode) && + _userBuildInfo.ChooseNodeInfo.TryGetValue(node.Value.PreGroup, out var preNode)) { - nodeName = nodeInfo.Name; - minCondition = nodeInfo.Condition; + //当前节点位选择且前置节点已选择 + if (string.IsNullOrEmpty(curNode) && !string.IsNullOrEmpty(preNode)) + { + //DebugUtil.LogError("下一个节点是{0}", node.Key); + return node.Key; + } } } - break; + var firstNode = NodeInfos + .OrderBy(kv => kv.Value.Condition) + .FirstOrDefault(); + + return firstNode.Key; } //TODO 按主题解锁 default: @@ -491,6 +505,29 @@ namespace Framework.Manager StorageManager.Instance.SyncForce = true; } + /// + /// Debug 清楚玩家所有选择 + /// + public void ClearOption() + { + foreach (var node in NodeInfos) + { + if (_userBuildInfo.ChooseNodeInfo.TryGetValue(node.Key, out var option)) + _userBuildInfo.ChooseNodeInfo[node.Key] = ""; + } + + DebugUserChooseNode(); + StorageManager.Instance.SyncForce = true; + } + + private void DebugUserChooseNode() + { + foreach (var infos in _userBuildInfo.ChooseNodeInfo) + { + DebugUtil.LogError("节点 {0} 选择的的是 {1}", infos.Key, infos.Value); + } + } + public void Release() { } diff --git a/Forest/Assets/Scripts/Gameplay/Debug/SROptions.Level.cs b/Forest/Assets/Scripts/Gameplay/Debug/SROptions.Level.cs index d678174..3de018b 100644 --- a/Forest/Assets/Scripts/Gameplay/Debug/SROptions.Level.cs +++ b/Forest/Assets/Scripts/Gameplay/Debug/SROptions.Level.cs @@ -3,6 +3,7 @@ using Framework.Constants; using LC.Newtonsoft.Json; using Gameplay.Manager; using Framework.Event; +using Framework.Manager; using Gameplay.Level; using Framework.UI; using PhxhSDK; @@ -76,6 +77,12 @@ public partial class SROptions { LevelSelectManager.Instance.ClearFile(); } + + [Category("存档相关"), DisplayName("清除当前所有选择节点")] + public void ClearBuildOption() + { + BuildManager.Instance.ClearOption(); + } [Category("道具相关"), DisplayName("增加开孔道具")] public void AddUndoProp() diff --git a/Tool/Luban/.cache.meta b/Tool/Luban/.cache.meta index 2b5899b..68831a1 100644 --- a/Tool/Luban/.cache.meta +++ b/Tool/Luban/.cache.meta @@ -1,26 +1,26 @@ -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Config/Data/ad_adconfig.json,A36B3A44ABABA2DDE095849E3626C9,1094,1721894399796 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Config/Data/guide_guideconfig.json,1B942B12FE474D85AEF5EEA69A52434,2523,1721894399796 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Config/Data/prop_propconfig.json,7C02F583533F144939CBFF8C7E18473,880,1721894399796 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Config/Data/stringcfg_stringconfig.json,343DBBC697FCB77685E7338FC24EA1DA,8511,1721894399796 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/AD/ADConfig.cs,A4C9CBC6BD55B1C14634FD73C748ACA,1928,1721894399796 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/AD/ADType.cs,F6A7395BDA6D1E7D1EF51E344CB045,603,1721894399793 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/AD/DataAD.cs,7F68864C5AB693111C5C3250967FB782,3417,1721894399793 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/BI/Event.cs,9BC756F4D9E749FBCEF49BF6929557,6506,1721894399796 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/BI/EventFirst.cs,72E992B782D0734B64364E4777CA3B35,2964,1721894399793 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Guide/DataGuide.cs,A23BB4F3F93B395441BB83D74E59B6F,4292,1721894399796 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Guide/GuideConfig.cs,B1779443C4E6B0FD80A8B0CAE418015,2003,1721894399793 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Guide/GuideStepType.cs,BEB85D16C8FEBFBE0679C7F9C9F9A8,606,1721894399793 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Guide/StepCompleteType.cs,C360B48BE0179D52C15D41892A4B,1008,1721894399793 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Prop/DataProp.cs,B1E5165AD7B7B28F863BF25E9581BF7B,4385,1721894399796 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Prop/PropConfig.cs,263DA0E1E0FA37A6401A432E49E8,2040,1721894399796 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Prop/PropType.cs,56DDB93BC3D6491F012DAE849526897,757,1721894399793 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/StringCfg/DataString.cs,1613DCE5B077AE52BB90193DD949348,2327,1721894399793 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/StringCfg/StringConfig.cs,90AC6ED26EAF4A66498B4816B635F47,2080,1721894399793 -/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Tables.cs,16F3D2F3A20B0D35793F8A5A8194E59,2303,1721894399793 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Config/Data/ad_adconfig.json,A36B3A44ABABA2DDE095849E3626C9,1094,1722237804796 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Config/Data/guide_guideconfig.json,691B15CC18B4441293DFB6BEAE8965,2512,1722237804796 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Config/Data/prop_propconfig.json,7C02F583533F144939CBFF8C7E18473,880,1722237804796 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Config/Data/stringcfg_stringconfig.json,F8D8B4B06DC867925B8F57951291E16C,8524,1722237804796 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/AD/ADConfig.cs,A4C9CBC6BD55B1C14634FD73C748ACA,1928,1722237804796 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/AD/ADType.cs,F6A7395BDA6D1E7D1EF51E344CB045,603,1722237804795 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/AD/DataAD.cs,7F68864C5AB693111C5C3250967FB782,3417,1722237804795 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/BI/Event.cs,9BC756F4D9E749FBCEF49BF6929557,6506,1722237804796 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/BI/EventFirst.cs,72E992B782D0734B64364E4777CA3B35,2964,1722237804795 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Guide/DataGuide.cs,A23BB4F3F93B395441BB83D74E59B6F,4292,1722237804796 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Guide/GuideConfig.cs,B1779443C4E6B0FD80A8B0CAE418015,2003,1722237804795 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Guide/GuideStepType.cs,BEB85D16C8FEBFBE0679C7F9C9F9A8,606,1722237804795 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Guide/StepCompleteType.cs,C360B48BE0179D52C15D41892A4B,1008,1722237804795 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Prop/DataProp.cs,B1E5165AD7B7B28F863BF25E9581BF7B,4385,1722237804796 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Prop/PropConfig.cs,263DA0E1E0FA37A6401A432E49E8,2040,1722237804795 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Prop/PropType.cs,56DDB93BC3D6491F012DAE849526897,757,1722237804795 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/StringCfg/DataString.cs,1613DCE5B077AE52BB90193DD949348,2327,1722237804795 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/StringCfg/StringConfig.cs,90AC6ED26EAF4A66498B4816B635F47,2080,1722237804796 +/Users/zhangaotian/UnityProject/Forest_Client/Forest/Assets/Scripts/Gameplay/DataTable/Tables.cs,16F3D2F3A20B0D35793F8A5A8194E59,2303,1722237804795 /Users/zhangaotian/UnityProject/Forest_Client/Tool/Luban/Datas/__beans__.xlsx,FBF2DDFEE7FB39A727F2C3ACA7E228E,11821,1718685908733 /Users/zhangaotian/UnityProject/Forest_Client/Tool/Luban/Datas/__enums__.xlsx,BB1B7B4C814680E15D54B12E0C4BAD5,12703,1721893666572 /Users/zhangaotian/UnityProject/Forest_Client/Tool/Luban/Datas/__tables__.xlsx,CA2D48B6B6FAC5A9F046ACE375EA6A5B,11099,1721709912370 /Users/zhangaotian/UnityProject/Forest_Client/Tool/Luban/Datas/AD.xlsx,D49DD4C2226B1AED21398727B2144A9,9832,1721801067448 -/Users/zhangaotian/UnityProject/Forest_Client/Tool/Luban/Datas/Guide.xlsx,6D35E0C2CC6D8396CB1A676530EAD2,10493,1721894375600 +/Users/zhangaotian/UnityProject/Forest_Client/Tool/Luban/Datas/Guide.xlsx,6D5F7C64D1471860B08AE8329061BF22,10476,1722237740607 /Users/zhangaotian/UnityProject/Forest_Client/Tool/Luban/Datas/Prop.xlsx,518794514E27F37BF9D0B6BA712533A5,10050,1718685908733 -/Users/zhangaotian/UnityProject/Forest_Client/Tool/Luban/Datas/StringConfig.xlsx,F82F5C747CBB6CE963F76A2625312A,13521,1721893669630 +/Users/zhangaotian/UnityProject/Forest_Client/Tool/Luban/Datas/StringConfig.xlsx,62DA844EBD5C633CDE4C4826863712,13506,1722237783694 diff --git a/Tool/Luban/Datas/Guide.xlsx b/Tool/Luban/Datas/Guide.xlsx index cecfd850270726c7fe186659de5be46e6f8e6a3c..240ceb30b2685b9ce202db7f3d8c8de68f4c01ca 100644 GIT binary patch delta 2693 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 delta 2702 zcmV;93UT%9QT3#E1GWJP z0b>=5LkDA*x4YU;-^!rPr;n<%-bvdPO&!{vv#>2v=gqOGUqbua*W_kpTOG~n zV^%gb3GMHsvp;Qr{bh4)+Sl$(2(=(W-G%m<(#wPEcKMl9S%2p=7gB@e)U;Jb;b;5e zc9)i9NA6UWuD@8^xm8xwwutc1{!EPKbSiQZH~CvdYAS-Xq|7MHzdIL~PDcAU{#3kU zn_Zz+IiJxKV__NMdBJ3URgt$%*PN)6Hd#0;@cvg6XjP8(f{4CQaTt;77>wid2*;`4Yru@4&(sO99Z8`Qw zbKR5TsZ{N16?1SI0!rSwl)pD`Cz4rot1y|e3Ia7Ub&c)!q z?A_rm-2>)qil-ItEv*T+N5 zy5INiaDSKXzO(iglA!>qpUDo($|nzZS?>b;hquhG|R1y*i8|4I$}RX-0O&RidgB0 z!xXU|5H65CFbikV!$1iXsC9$tV^OxT+{fM^6Tb z5`PkJ&SaX%M^f1tAV?~E14OaL6Qu?STET+>qM~TrgS30@{n1YI$c96E#rGI*fhHLV z>$>7{I z|NISL_>&yo3Csioenc>$FcMZtFk0PMvwtFjg^m3W4csh|3=`=;f}j=N3CJwNeJ0pp zRVGwNYQXrIV*_TXD%MDb?U9oVdxA-{U>(H>1ZPSzq)sdPosG7ro!5W19agISSj~GNzBVm;cBH729 z6)`AmI)lhRk^YLF0LgSGAhQgbGJhc{rv}VqTQp%*98Hz1EYp6-$5lt8dZXSf=|r{0 zx*72~7!_H!s2dX#2KC;q$ILQnilh2d^tlOxI^VmIJ`rV6 zZx)Q+pju!#}XCi zE8^q!lD&}Mv-YK^JFA2P95|?PVDoLo;R%0+qa8j9F9pvHg|j31>kLPD1ipb64!ql* znuf|Bu)zph!Ux%YGn^4_e*lmkvqcI|5ec6IeT@MF0051Xof{p0-D(p-6uuXHhp@S} zlSE^yBq=1db+NX^G>TVYNycR8?##M7sqI}YN@|-Dkru?zVoSv$^v`+`Nii>z*(7h_ z?4&C)yQ!iOhV1#yIp6u+*~Ivgp@$ZsWg~)3E&C_LUlrx z%)lk;mrhxvVg`sSs0e2Wg|e3^7np$d1GpRr%`cn5HglSPr5SdhO@nQ~L z2#09^DZ*4Hv#G_qCQC&|BjU_bXbufx#6`VGg0#Y6*)_Y^W+xZU(Wm~G0~zZyH#*G~ zj>*8lsM~rK3^?b9{p$JYBd1p7{<~)_w!0DRgVk4^?Nc9i zTyxgm2HSOiSHH7r%Q@e3f3-LLcgM1|C~iI)iON7mM}-Ahn64nb_=pe+W=IjnL7HM& zWtMMHPL-v?Fzp(Oe>qh+$*B+dCJ711srhMCxv!x#p_CW{y?olgK7*V(&Gr7)OV;?| ze5}f3UQRI?_>U+6k0d{jOpq;DMAt))5qtsM!z31e1sQ@V#1yC$8d0DcrTjD*QoSpS zAOdu0dBbToowd5G;U#@j2L7D%FIKmo`6IqEr2I0A z^7Y~ukgq^aV~e~-w%CE481%4GJU43;Sv;i%206fu_4J{?tOcQ z9le)5dG#HW0YUMv$@67+3VrutMkhA>{S5~N_~%6GC$q60NCp8&llmk;0kD%hB{Kok zlW!%H1$3Vr@>-JzCR70rlUyc10cn$+CNKf~lg=hK0wW@mE+QN&P)h*<6aW+e000O8 zhfd-^p96i30RsR4jR*h$6aWAK000000RSKX0057ZO(#JCc$1GOIsq_~$|p7fSCauK zKmo#&LMS`|ij#jRAshi?6^ld#003wd000;O0000000031AOHXWwgi*W1R9gpC=dqV IBme*a0Iv=9>;M1& diff --git a/Tool/Luban/Datas/StringConfig.xlsx b/Tool/Luban/Datas/StringConfig.xlsx index 9e2ad163feb99860e2202f613f797e3ca0aa2e62..6b0b448448184370101a233a969536a813459ff2 100644 GIT binary patch delta 5704 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 F{|7~Dtx5m@ delta 5680 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