From 6f16dfb8bcebe67aeb95ded0d8b644af4932e690 Mon Sep 17 00:00:00 2001
From: chenxin <chenxin6991@163.com>
Date: Mon, 26 Oct 2020 21:00:32 +0800
Subject: [PATCH] 无尽模式新手步骤到水元素放置塔位完成

---
 Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs                   |    3 
 Assets/Scripts/TowerDefense/Agents/Agent.cs                               |    8 
 Assets/Scripts/Common/GameConfig.cs                                       |   14 
 Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGrid.cs        |    6 
 Assets/Resources/UI/Guide/GuidePanel.prefab                               |    2 
 Assets/Scenes/Levels/Battle/Endless.unity                                 |    4 
 Assets/Scripts/TowerDefense/Level/AgentInsManager.cs                      |   24 
 Assets/Scripts/TowerDefense/UI/HUD/EndlessRandomTower.cs                  |    8 
 Assets/Scripts/Event/EventType.cs                                         |    2 
 Assets/StreamingAssets/Table/endless_teachport.json.meta                  |    7 
 Assets/Scripts/Net/NetExtends/Game.cs                                     |  122 ++++
 Assets/Scripts/TowerDefense/Towers/Tower.cs                               |   11 
 Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs                       |   32 +
 Assets/Scripts/TowerDefense/UI/EndlessUIStart.cs                          |  221 +++++--
 Assets/Scripts/TowerDefense/Towers/Placement/IPlacementArea.cs            |  241 ++++----
 Assets/Scripts/Guide/ImageWater.cs                                        |    3 
 Assets/Scripts/TowerDefense/UI/EndlessTowerGridOpen.cs                    |    8 
 Assets/Scripts/TowerDefense/Towers/Placement/SingleTowerPlacementArea.cs  |    4 
 Assets/Scripts/Data/EndlessPortData.cs                                    |  102 +++
 Assets/Scripts/TowerDefense/Level/EndlessWave.cs                          |   12 
 Assets/Materials/Guide/RectGuidance.mat                                   |    6 
 Assets/Scripts/Net/NetExtends/Common.cs                                   |  391 ++++++--------
 Assets/StreamingAssets/Table/endless_teachport.json                       |    1 
 Assets/StreamingAssets/Table/donaterule.json.meta                         |    7 
 Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs                  |   54 +
 Assets/Scripts/TowerDefense/Level/EndlessWaveManager.cs                   |   24 
 Assets/StreamingAssets/Table/donaterule.json                              |    1 
 Assets/Scripts/Net/NetExtends/Table.cs                                    |  142 +++++
 Assets/StreamingAssets/Table/battle.json                                  |    2 
 Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGridEndless.cs |   66 ++
 30 files changed, 1,049 insertions(+), 479 deletions(-)

diff --git a/Assets/Materials/Guide/RectGuidance.mat b/Assets/Materials/Guide/RectGuidance.mat
index a80c93e..aad1323 100644
--- a/Assets/Materials/Guide/RectGuidance.mat
+++ b/Assets/Materials/Guide/RectGuidance.mat
@@ -69,8 +69,8 @@
     - _OcclusionStrength: 1
     - _Parallax: 0.02
     - _Slider: 81.39478
-    - _SliderX: 75.32526
-    - _SliderY: 80.29174
+    - _SliderX: 75.0423
+    - _SliderY: 0.045161847
     - _SmoothnessTextureChannel: 0
     - _SpecularHighlights: 1
     - _SrcBlend: 1
@@ -83,7 +83,7 @@
     - _UseUIAlphaClip: 0
     - _ZWrite: 1
     m_Colors:
-    - _Center: {r: -150, g: -198, b: 0, a: 0}
+    - _Center: {r: -150, g: -59.99974, b: 0, a: 0}
     - _Color: {r: 1, g: 1, b: 1, a: 1}
     - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
   m_BuildTextureStacks: []
diff --git a/Assets/Resources/UI/Guide/GuidePanel.prefab b/Assets/Resources/UI/Guide/GuidePanel.prefab
index a58c1ea..da516eb 100644
--- a/Assets/Resources/UI/Guide/GuidePanel.prefab
+++ b/Assets/Resources/UI/Guide/GuidePanel.prefab
@@ -109,7 +109,7 @@
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
-  m_IsActive: 1
+  m_IsActive: 0
 --- !u!224 &4359018530067976343
 RectTransform:
   m_ObjectHideFlags: 0
diff --git a/Assets/Scenes/Levels/Battle/Endless.unity b/Assets/Scenes/Levels/Battle/Endless.unity
index cc0fa9b..a120fa2 100644
--- a/Assets/Scenes/Levels/Battle/Endless.unity
+++ b/Assets/Scenes/Levels/Battle/Endless.unity
@@ -12915,6 +12915,10 @@
     x: 5
     y: 4
   gridSize: 1.109
+  towerBulletUIPrefab: {fileID: 4636030447447409971, guid: f6edf4c41f0dac54d94e67945bca23f0,
+    type: 3}
+  towerEnergyUIPrefab: {fileID: 4636030447447409971, guid: 0d97566feabc1d644862df3fb52071a3,
+    type: 3}
 --- !u!65 &1632078504
 BoxCollider:
   m_ObjectHideFlags: 2
diff --git a/Assets/Scripts/Common/GameConfig.cs b/Assets/Scripts/Common/GameConfig.cs
index aaee064..f1dfa0c 100644
--- a/Assets/Scripts/Common/GameConfig.cs
+++ b/Assets/Scripts/Common/GameConfig.cs
@@ -17,5 +17,19 @@
         public static string LoginUrl = "http://172.16.1.52:9000/user/login";
         public static bool OpenDebug = true;
 
+        /// <summary>
+        /// PVE无尽模式,是否可以点击购买新的宝石
+        /// </summary>
+        public static bool CanBuyNewTower = false;
+
+        /// <summary>
+        /// 是否可以点击金币购买新的塔位
+        /// </summary>
+        public static bool CanOpenNewTower = true;
+
+        /// <summary>
+        /// 是否是新手
+        /// </summary>
+        public static bool IsNewbie = true;
     }
 }
\ No newline at end of file
diff --git a/Assets/Scripts/Data/EndlessPortData.cs b/Assets/Scripts/Data/EndlessPortData.cs
index e117da0..cbc772f 100644
--- a/Assets/Scripts/Data/EndlessPortData.cs
+++ b/Assets/Scripts/Data/EndlessPortData.cs
@@ -33,7 +33,17 @@
         /// </summary>
         private static List<endless_port> endlessPortList;
 
+        /// <summary>
+        /// 无尽模式新手关卡配置表
+        /// </summary>
+        private static List<endless_port> endlessTeachPortList;
+
         private static List<EndlessPortConfig> portConfigList;
+
+        /// <summary>
+        /// 新手用
+        /// </summary>
+        private static List<EndlessPortConfig> teachPortConfigList;
 
         private static Random random;
 
@@ -52,11 +62,77 @@
         /// </summary>
         public static void Init()
         {
+            random = new Random();
+            InitPortConfig();
+            InitTeachPortConfig();
+            List<List<EndlessPortConfig>> list = GetLevelWaveData(1);
+        }
+
+        /// <summary>
+        /// 初始化关卡配置
+        /// </summary>
+        private static void InitPortConfig()
+        {
             endlessPortList = JsonDataCenter.GetList<endless_port>();
             portConfigList = new List<EndlessPortConfig>();
-            random = new Random();
+            InitPortList(portConfigList, endlessPortList);
+        }
 
-            foreach (endless_port data in endlessPortList)
+        /// <summary>
+        /// 初始化新手的关卡配置
+        /// </summary>
+        private static void InitTeachPortConfig()
+        {
+            List<endless_teachport> list = JsonDataCenter.GetList<endless_teachport>();
+            endlessTeachPortList = new List<endless_port>();
+
+            foreach (endless_teachport data in list)
+            {
+                endless_port newData = new endless_port();
+                newData.id = data.id;
+                newData.level = data.level;
+                newData.boss_name = data.boss_name;
+                newData.resource = data.resource;
+                newData.wave = data.wave;
+                newData.tunel = data.tunel;
+                newData.enemy_id = data.enemy_id;
+                newData.amount = data.amount;
+                newData.interval = data.interval;
+                newData.b_hp = data.b_hp;
+                newData.b_speed = data.b_speed;
+                newData.b_coin = data.b_coin;
+                newData.cooldown = data.cooldown;
+
+                List<reward> rewardList = new List<reward>();
+                foreach (reward r in rewardList)
+                {
+                    reward nr = new reward();
+                    nr.type = r.type;
+                    nr.id = r.id;
+                    nr.count = r.count;
+                    rewardList.Add(nr);
+                }
+
+                newData.drop = rewardList;
+
+                List<int> rateList = new List<int>();
+                foreach (int r in rateList)
+                {
+                    rateList.Add(r);
+                }
+
+                newData.drop_rate = rateList;
+                newData.tunel_bg = data.tunel_bg;
+                endlessTeachPortList.Add(newData);
+            }
+
+            teachPortConfigList = new List<EndlessPortConfig>();
+            InitPortList(teachPortConfigList, endlessTeachPortList);
+        }
+
+        private static void InitPortList(List<EndlessPortConfig> list, List<endless_port> srcList)
+        {
+            foreach (endless_port data in srcList)
             {
                 if (data.level > maxLevel)
                     maxLevel = data.level;
@@ -72,24 +148,8 @@
                 }
 
                 param.DropTotalWeight = totalWeight;
-                portConfigList.Add(param);
+                list.Add(param);
             }
-        }
-
-        /// <summary>
-        /// 根据关卡等级获取boss资源id
-        /// </summary>
-        /// <param name="level">关卡等级</param>
-        /// <returns>如果返回-1查找失败</returns>
-        public static int GetResIdByLevel(int level)
-        {
-            foreach (endless_port data in endlessPortList)
-            {
-                if (data.level == level)
-                    return data.resource;
-            }
-
-            return -1;
         }
 
         /// <summary>
@@ -106,7 +166,9 @@
                 ret.Add(new List<EndlessPortConfig>());
             }
 
-            foreach (EndlessPortConfig data in portConfigList)
+            List<EndlessPortConfig> list = GameConfig.IsNewbie ? teachPortConfigList : portConfigList;
+
+            foreach (EndlessPortConfig data in list)
             {
                 if (data.Config.level != level || data.Config.amount == 0) continue;
 
diff --git a/Assets/Scripts/Event/EventType.cs b/Assets/Scripts/Event/EventType.cs
index 0d5fd3d..2befada 100644
--- a/Assets/Scripts/Event/EventType.cs
+++ b/Assets/Scripts/Event/EventType.cs
@@ -35,6 +35,8 @@
         SkillRelease,
         //释放技能完毕
         SkillReleaseDone,
+        // 火元素塔充能使用结束
+        FireTowerChargeEnd,
     }
 
 }
diff --git a/Assets/Scripts/Guide/ImageWater.cs b/Assets/Scripts/Guide/ImageWater.cs
index 4ba6afb..1d72d31 100644
--- a/Assets/Scripts/Guide/ImageWater.cs
+++ b/Assets/Scripts/Guide/ImageWater.cs
@@ -51,10 +51,9 @@
         {
             //生成一个1级的水元素塔
             Debug.Log("生成一个1级的水元素塔");
-            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.CreateWaterLv1);
             gameObject.SetActive(false);
             target.GetComponent<Image>().sprite = tmpImage.sprite;
-
+            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.CreateWaterLv1);
         }
         else
         {
diff --git a/Assets/Scripts/Net/NetExtends/Common.cs b/Assets/Scripts/Net/NetExtends/Common.cs
index 2dd110e..9b695e6 100644
--- a/Assets/Scripts/Net/NetExtends/Common.cs
+++ b/Assets/Scripts/Net/NetExtends/Common.cs
@@ -23,81 +23,81 @@
       byte[] descriptorData = global::System.Convert.FromBase64String(
           string.Concat(
             "Cgxjb21tb24ucHJvdG8SCHByb3RvYnVmIjUKBkdlbU1zZxINCgVnZW1JZBgB",
-            "IAEoBRINCgVsZXZlbBgCIAEoBRINCgVjb3VudBgDIAEoBSKIAwoLVXNlckRh",
+            "IAEoBRINCgVsZXZlbBgCIAEoBRINCgVjb3VudBgDIAEoBSLrAgoLVXNlckRh",
             "dGFNc2cSEAoIdXNlcm5hbWUYASABKAkSEAoIbmlja25hbWUYAiABKAkSDwoH",
             "aGVhZGltZxgDIAEoBRIRCglzaW5nYXR1cmUYBCABKAkSDQoFbGV2ZWwYBSAB",
-            "KAUSDAoEcmFuaxgGIAEoBRINCgVzY29yZRgHIAEoBRILCgNleHAYCCABKAUS",
-            "DQoFbW9uZXkYCSABKAUSDAoEZ29sZBgKIAEoBRIeCgRnZW1zGAsgAygLMhAu",
-            "cHJvdG9idWYuR2VtTXNnEhAKCGdlbWRlY2sxGAwgAygFEhAKCGdlbWRlY2sy",
-            "GA0gAygFEhAKCGdlbWRlY2szGA4gAygFEg4KBmRlY2tpZBgPIAEoBRIUCgxh",
-            "Y2NlcHRmcmllbmQYECABKAgSFAoMbmFtZWRjaGFuZ2VkGBEgASgIEg8KB2Fy",
-            "ZWFleHAYEiABKAUSKAoJYXJlYWJveGVzGBMgAygLMhUucHJvdG9idWYuQXJl",
-            "bmFCb3hNc2cSDgoGZG9uYXRlGBQgASgFIp8BCglGcmllbmRNc2cSEAoIdXNl",
-            "cm5hbWUYASABKAkSEAoIbmlja25hbWUYAiABKAkSDwoHaGVhZGltZxgDIAEo",
-            "BRINCgVsZXZlbBgFIAEoBRIMCgRyYW5rGAYgASgFEg0KBXNjb3JlGAcgASgF",
-            "Eg4KBm9ubGluZRgIIAEoCBIhCgdnZW1kZWNrGAkgAygLMhAucHJvdG9idWYu",
-            "R2VtTXNnIlYKDFN0b3JlQXJlYU1zZxIKCgJpZBgBIAEoBRITCgtyZWZyZXNo",
-            "VGltZRgCIAEoBRIlCgVpdGVtcxgDIAMoCzIWLnByb3RvYnVmLlN0b3JlSXRl",
-            "bU1zZyIsCgxTdG9yZUl0ZW1Nc2cSCgoCaWQYASABKAUSEAoIYnV5Q291bnQY",
-            "AiABKAUiOAoNUmV3YXJkSXRlbU1zZxIMCgR0eXBlGAEgASgFEgoKAmlkGAIg",
-            "ASgFEg0KBWNvdW50GAMgASgFIj0KC0FyZW5hQm94TXNnEgsKA3BvcxgBIAEo",
-            "BRINCgVib3hpZBgCIAEoBRISCgpleHBpcmVUaW1lGAMgASgFItIBCg9GYW1p",
-            "bHlNZW1iZXJNc2cSEAoIdXNlcm5hbWUYASABKAkSEAoIbmlja25hbWUYAiAB",
-            "KAkSDwoHaGVhZGltZxgDIAEoBRIQCghwb3NpdGlvbhgEIAEoBRIOCgZvbmxp",
-            "bmUYBSABKAgSDQoFc2NvcmUYBiABKAUSDQoFbGV2ZWwYByABKAUSEgoKd2Vl",
-            "a0RvbmF0ZRgIIAEoBRITCgt0b3RhbERvbmF0ZRgJIAEoBRIhCgdnZW1kZWNr",
-            "GAogAygLMhAucHJvdG9idWYuR2VtTXNnIjwKE0ZhbWlseURvbmF0ZUl0ZW1N",
-            "c2cSEAoIdXNlcm5hbWUYASABKAkSEwoLZG9uYXRlQ291bnQYAiABKAUikgMK",
-            "DUZhbWlseUNoYXRNc2cSEQoJbWVzc2FnZUlkGAEgASgFEhAKCHVzZXJuYW1l",
-            "GAIgASgJEhAKCG5pY2tuYW1lGAMgASgJEg8KB2hlYWRpbWcYBCABKAUSEgoK",
-            "Y3JlYXRlVGltZRgFIAEoBRIPCgdjb250ZW50GAYgASgJEiQKCGNoYXRUeXBl",
-            "GAcgASgOMhIucHJvdG9idWYuQ2hhdFR5cGUSDQoFZ2VtSWQYCCABKAUSMQoK",
-            "ZG9uYXRlbGlzdBgJIAMoCzIdLnByb3RvYnVmLkZhbWlseURvbmF0ZUl0ZW1N",
-            "c2cSFAoMcmVjZWl2ZUNvdW50GAogASgFEhIKClRvdGFsQ291bnQYCyABKAUS",
-            "EAoIbm90aWNlSWQYDCABKAUSDgoGcGFyYW1zGA0gAygJEhMKC25ld1VzZXJu",
-            "YW1lGA4gASgJEhMKC25ld05pY2tuYW1lGA8gASgJEhIKCm5ld0hlYWRpbWcY",
-            "ECABKAUSEAoIbmV3TGV2ZWwYESABKAUSEAoIbmV3U2NvcmUYEiABKAUi0gEK",
-            "CUZhbWlseU1zZxILCgN1aWQYASABKAkSDAoEbmFtZRgCIAEoCRIMCgRkZXNj",
-            "GAMgASgJEg0KBWljb25zGAQgAygFEg0KBXNjb3JlGAUgASgFEhMKC3Njb3Jl",
-            "c2hvcElkGAYgASgFEhgKEHNjb3Jlc2hvcEV4cGlyZWQYByABKAUSEAoIZnJl",
-            "ZUpvaW4YCCABKAUSEQoJbmVlZFNjb3JlGAkgASgFEioKB21lbWJlcnMYCiAD",
-            "KAsyGS5wcm90b2J1Zi5GYW1pbHlNZW1iZXJNc2cimgEKE0ZhbWlseVNlYXJj",
-            "aEl0ZW1Nc2cSCwoDdWlkGAEgASgJEgwKBG5hbWUYAiABKAkSDQoFaWNvbnMY",
-            "AyADKAUSEwoLbWVtYmVyQ291bnQYBCABKAUSEAoIaXNBY3RpdmUYBSABKAgS",
-            "EgoKaXNGcmllbmRJbhgGIAEoCBINCgVpc05ldxgHIAEoCBIPCgdpc0FwcGx5",
-            "GAggASgIKmgKCENVUlJFTkNZEhIKDkNVUlJFTkNZX0JFR0lOEAASCQoFTU9O",
-            "RVkQARIICgRHT0xEEAISBwoDUk1CEAMSBwoDR0VNEAQSBwoDQk9YEAUSDAoI",
-            "QVJFTkFFWFAQBhIKCgZET05BVEUQByomCglDaGFubmVsSUQSEQoNQ0hBTk5F",
-            "TF9CRUdJThAAEgYKAkdNEAEqrwUKCUVycm9yQ29kZRILCgdTdWNjZXNzEAAS",
-            "FQoRQ2hhbm5lbElkX05vRXhpc3QQARIUChBVc2VyTmFtZV9JbnZhbGlkEAIS",
-            "GAoUVXNlclBhc3NXb3JkX0ludmFsaWQQAxIQCgxVbmtub3dfRXJyb3IQBBIR",
-            "Cg1JbnB1dF9JbnZhbGlkEAUSCwoHVGltZW91dBAGEhYKElNlc3Npb25LZXlf",
-            "SW52YWxpZBAHEhAKDExvZ2luX05vVXNlchAIEhMKD05vdEVub3VnaF9Nb25l",
-            "eRAJEhIKDk5vdEVub3VnaF9Hb2xkEAoSEQoNTm90RW5vdWdoX0dlbRALEhMK",
-            "D05vdEZvdW5kX0ZyaWVuZBAMEhIKDkFscmVhZHlfRnJpZW5kEA0SEgoOSW5C",
-            "bG9ja19GcmllbmQQDhIOCgpNYXhfRnJpZW5kEA8SEAoMTWF4X05pY2tOYW1l",
-            "EBASFAoQSW52YWxpZF9OaWNrTmFtZRAREhIKDk1heF9TdG9yZUxpbWl0EBIS",
-            "FgoSTm90RW5vdWdoX1N0b3JlQnV5EBMSFAoQTm90T3Blbl9QYXNzUG9ydBAU",
-            "EhQKEEFscmVhZHlfUGFzc1BvcnQQFRIcChhOZWVkVmlwX1Bhc3NQb3J0VGFr",
-            "ZUl0ZW0QFhIeChpOZWVkTGV2ZWxfUGFzc1BvcnRUYWtlSXRlbRAXEhwKGEFs",
-            "cmVhZHlfUGFzc1BvcnRUYWtlSXRlbRAYEhwKGEludmFsaWRfUGFzc1BvcnRC",
-            "dXlMZXZlbBAZEhYKEkhhc1VubG9ja19BcmVuYUJveBAaEhsKF090aGVyVW5s",
-            "b2NraW5nX0FyZW5hQm94EBsSGAoUTm90VGltZVRha2VfQXJlbmFCb3gQHBIg",
-            "ChxOb3RFbm91Z2hfTGV2ZWxfQ3JlYXRlRmFtaWx5EB0qcQoIQ2hhdFR5cGUS",
-            "EgoOQ2hhdFR5cGVfQmVnaW4QABIRCg1DaGF0VHlwZV9UZXh0EAESFgoSQ2hh",
-            "dFR5cGVfRG9uYXRlR2VtEAISEwoPQ2hhdFR5cGVfU3lzdGVtEAMSEQoNQ2hh",
-            "dFR5cGVfSm9pbhAEYgZwcm90bzM="));
+            "KAUSCwoDZXhwGAYgASgFEg0KBW1vbmV5GAcgASgFEgwKBGdvbGQYCCABKAUS",
+            "HgoEZ2VtcxgJIAMoCzIQLnByb3RvYnVmLkdlbU1zZxIQCghnZW1kZWNrMRgK",
+            "IAMoBRIQCghnZW1kZWNrMhgLIAMoBRIQCghnZW1kZWNrMxgMIAMoBRIOCgZk",
+            "ZWNraWQYDSABKAUSFAoMYWNjZXB0ZnJpZW5kGA4gASgIEhQKDG5hbWVkY2hh",
+            "bmdlZBgPIAEoCBIPCgdhcmVhZXhwGBAgASgFEigKCWFyZWFib3hlcxgRIAMo",
+            "CzIVLnByb3RvYnVmLkFyZW5hQm94TXNnEg4KBmRvbmF0ZRgSIAEoBSKhAQoJ",
+            "RnJpZW5kTXNnEhAKCHVzZXJuYW1lGAEgASgJEhAKCG5pY2tuYW1lGAIgASgJ",
+            "Eg8KB2hlYWRpbWcYAyABKAUSDQoFbGV2ZWwYBSABKAUSDAoEcmFuaxgGIAEo",
+            "BRIPCgdhcmVhZXhwGAcgASgFEg4KBm9ubGluZRgIIAEoCBIhCgdnZW1kZWNr",
+            "GAkgAygLMhAucHJvdG9idWYuR2VtTXNnIlYKDFN0b3JlQXJlYU1zZxIKCgJp",
+            "ZBgBIAEoBRITCgtyZWZyZXNoVGltZRgCIAEoBRIlCgVpdGVtcxgDIAMoCzIW",
+            "LnByb3RvYnVmLlN0b3JlSXRlbU1zZyIsCgxTdG9yZUl0ZW1Nc2cSCgoCaWQY",
+            "ASABKAUSEAoIYnV5Q291bnQYAiABKAUiOAoNUmV3YXJkSXRlbU1zZxIMCgR0",
+            "eXBlGAEgASgFEgoKAmlkGAIgASgFEg0KBWNvdW50GAMgASgFIj0KC0FyZW5h",
+            "Qm94TXNnEgsKA3BvcxgBIAEoBRINCgVib3hpZBgCIAEoBRISCgpleHBpcmVU",
+            "aW1lGAMgASgFItQBCg9GYW1pbHlNZW1iZXJNc2cSEAoIdXNlcm5hbWUYASAB",
+            "KAkSEAoIbmlja25hbWUYAiABKAkSDwoHaGVhZGltZxgDIAEoBRIQCghwb3Np",
+            "dGlvbhgEIAEoBRIOCgZvbmxpbmUYBSABKAgSDwoHYXJlYWV4cBgGIAEoBRIN",
+            "CgVsZXZlbBgIIAEoBRISCgp3ZWVrRG9uYXRlGAkgASgFEhMKC3RvdGFsRG9u",
+            "YXRlGAogASgFEiEKB2dlbWRlY2sYCyADKAsyEC5wcm90b2J1Zi5HZW1Nc2ci",
+            "PAoTRmFtaWx5RG9uYXRlSXRlbU1zZxIQCgh1c2VybmFtZRgBIAEoCRITCgtk",
+            "b25hdGVDb3VudBgCIAEoBSKSAwoNRmFtaWx5Q2hhdE1zZxIRCgltZXNzYWdl",
+            "SWQYASABKAUSEAoIdXNlcm5hbWUYAiABKAkSEAoIbmlja25hbWUYAyABKAkS",
+            "DwoHaGVhZGltZxgEIAEoBRISCgpjcmVhdGVUaW1lGAUgASgFEg8KB2NvbnRl",
+            "bnQYBiABKAkSJAoIY2hhdFR5cGUYByABKA4yEi5wcm90b2J1Zi5DaGF0VHlw",
+            "ZRINCgVnZW1JZBgIIAEoBRIxCgpkb25hdGVsaXN0GAkgAygLMh0ucHJvdG9i",
+            "dWYuRmFtaWx5RG9uYXRlSXRlbU1zZxIUCgxyZWNlaXZlQ291bnQYCiABKAUS",
+            "EgoKVG90YWxDb3VudBgLIAEoBRIQCghub3RpY2VJZBgMIAEoBRIOCgZwYXJh",
+            "bXMYDSADKAkSEwoLbmV3VXNlcm5hbWUYDiABKAkSEwoLbmV3Tmlja25hbWUY",
+            "DyABKAkSEgoKbmV3SGVhZGltZxgQIAEoBRIQCghuZXdMZXZlbBgRIAEoBRIQ",
+            "CghuZXdTY29yZRgSIAEoBSLSAQoJRmFtaWx5TXNnEgsKA3VpZBgBIAEoCRIM",
+            "CgRuYW1lGAIgASgJEgwKBGRlc2MYAyABKAkSDQoFaWNvbnMYBCADKAUSDQoF",
+            "c2NvcmUYBSABKAUSEwoLc2NvcmVzaG9wSWQYBiABKAUSGAoQc2NvcmVzaG9w",
+            "RXhwaXJlZBgHIAEoBRIQCghmcmVlSm9pbhgIIAEoBRIRCgluZWVkU2NvcmUY",
+            "CSABKAUSKgoHbWVtYmVycxgKIAMoCzIZLnByb3RvYnVmLkZhbWlseU1lbWJl",
+            "ck1zZyKaAQoTRmFtaWx5U2VhcmNoSXRlbU1zZxILCgN1aWQYASABKAkSDAoE",
+            "bmFtZRgCIAEoCRINCgVpY29ucxgDIAMoBRITCgttZW1iZXJDb3VudBgEIAEo",
+            "BRIQCghpc0FjdGl2ZRgFIAEoCBISCgppc0ZyaWVuZEluGAYgASgIEg0KBWlz",
+            "TmV3GAcgASgIEg8KB2lzQXBwbHkYCCABKAgqaAoIQ1VSUkVOQ1kSEgoOQ1VS",
+            "UkVOQ1lfQkVHSU4QABIJCgVNT05FWRABEggKBEdPTEQQAhIHCgNSTUIQAxIH",
+            "CgNHRU0QBBIHCgNCT1gQBRIMCghBUkVOQUVYUBAGEgoKBkRPTkFURRAHKiYK",
+            "CUNoYW5uZWxJRBIRCg1DSEFOTkVMX0JFR0lOEAASBgoCR00QASrNBQoJRXJy",
+            "b3JDb2RlEgsKB1N1Y2Nlc3MQABIVChFDaGFubmVsSWRfTm9FeGlzdBABEhQK",
+            "EFVzZXJOYW1lX0ludmFsaWQQAhIYChRVc2VyUGFzc1dvcmRfSW52YWxpZBAD",
+            "EhAKDFVua25vd19FcnJvchAEEhEKDUlucHV0X0ludmFsaWQQBRILCgdUaW1l",
+            "b3V0EAYSFgoSU2Vzc2lvbktleV9JbnZhbGlkEAcSEAoMTG9naW5fTm9Vc2Vy",
+            "EAgSEwoPTm90RW5vdWdoX01vbmV5EAkSEgoOTm90RW5vdWdoX0dvbGQQChIR",
+            "Cg1Ob3RFbm91Z2hfR2VtEAsSEwoPTm90Rm91bmRfRnJpZW5kEAwSEgoOQWxy",
+            "ZWFkeV9GcmllbmQQDRISCg5JbkJsb2NrX0ZyaWVuZBAOEg4KCk1heF9Gcmll",
+            "bmQQDxIQCgxNYXhfTmlja05hbWUQEBIUChBJbnZhbGlkX05pY2tOYW1lEBES",
+            "EgoOTWF4X1N0b3JlTGltaXQQEhIWChJOb3RFbm91Z2hfU3RvcmVCdXkQExIU",
+            "ChBOb3RPcGVuX1Bhc3NQb3J0EBQSFAoQQWxyZWFkeV9QYXNzUG9ydBAVEhwK",
+            "GE5lZWRWaXBfUGFzc1BvcnRUYWtlSXRlbRAWEh4KGk5lZWRMZXZlbF9QYXNz",
+            "UG9ydFRha2VJdGVtEBcSHAoYQWxyZWFkeV9QYXNzUG9ydFRha2VJdGVtEBgS",
+            "HAoYSW52YWxpZF9QYXNzUG9ydEJ1eUxldmVsEBkSFgoSSGFzVW5sb2NrX0Fy",
+            "ZW5hQm94EBoSGwoXT3RoZXJVbmxvY2tpbmdfQXJlbmFCb3gQGxIYChROb3RU",
+            "aW1lVGFrZV9BcmVuYUJveBAcEhMKD05vdEVub3VnaF9MZXZlbBAdEhQKEEFs",
+            "cmVhZHlJbl9GYW1pbHkQHhITCg9Ob3RFeGlzdF9GYW1pbHkQHypxCghDaGF0",
+            "VHlwZRISCg5DaGF0VHlwZV9CZWdpbhAAEhEKDUNoYXRUeXBlX1RleHQQARIW",
+            "ChJDaGF0VHlwZV9Eb25hdGVHZW0QAhITCg9DaGF0VHlwZV9TeXN0ZW0QAxIR",
+            "Cg1DaGF0VHlwZV9Kb2luEARiBnByb3RvMw=="));
       descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
           new pbr::FileDescriptor[] { },
           new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Protobuf.CURRENCY), typeof(global::Protobuf.ChannelID), typeof(global::Protobuf.ErrorCode), typeof(global::Protobuf.ChatType), }, new pbr::GeneratedClrTypeInfo[] {
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.GemMsg), global::Protobuf.GemMsg.Parser, new[]{ "GemId", "Level", "Count" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.UserDataMsg), global::Protobuf.UserDataMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Singature", "Level", "Rank", "Score", "Exp", "Money", "Gold", "Gems", "Gemdeck1", "Gemdeck2", "Gemdeck3", "Deckid", "Acceptfriend", "Namedchanged", "Areaexp", "Areaboxes", "Donate" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FriendMsg), global::Protobuf.FriendMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Level", "Rank", "Score", "Online", "Gemdeck" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.UserDataMsg), global::Protobuf.UserDataMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Singature", "Level", "Exp", "Money", "Gold", "Gems", "Gemdeck1", "Gemdeck2", "Gemdeck3", "Deckid", "Acceptfriend", "Namedchanged", "Areaexp", "Areaboxes", "Donate" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FriendMsg), global::Protobuf.FriendMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Level", "Rank", "Areaexp", "Online", "Gemdeck" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.StoreAreaMsg), global::Protobuf.StoreAreaMsg.Parser, new[]{ "Id", "RefreshTime", "Items" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.StoreItemMsg), global::Protobuf.StoreItemMsg.Parser, new[]{ "Id", "BuyCount" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.RewardItemMsg), global::Protobuf.RewardItemMsg.Parser, new[]{ "Type", "Id", "Count" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.ArenaBoxMsg), global::Protobuf.ArenaBoxMsg.Parser, new[]{ "Pos", "Boxid", "ExpireTime" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyMemberMsg), global::Protobuf.FamilyMemberMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Position", "Online", "Score", "Level", "WeekDonate", "TotalDonate", "Gemdeck" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyMemberMsg), global::Protobuf.FamilyMemberMsg.Parser, new[]{ "Username", "Nickname", "Headimg", "Position", "Online", "Areaexp", "Level", "WeekDonate", "TotalDonate", "Gemdeck" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyDonateItemMsg), global::Protobuf.FamilyDonateItemMsg.Parser, new[]{ "Username", "DonateCount" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyChatMsg), global::Protobuf.FamilyChatMsg.Parser, new[]{ "MessageId", "Username", "Nickname", "Headimg", "CreateTime", "Content", "ChatType", "GemId", "Donatelist", "ReceiveCount", "TotalCount", "NoticeId", "Params", "NewUsername", "NewNickname", "NewHeadimg", "NewLevel", "NewScore" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyMsg), global::Protobuf.FamilyMsg.Parser, new[]{ "Uid", "Name", "Desc", "Icons", "Score", "ScoreshopId", "ScoreshopExpired", "FreeJoin", "NeedScore", "Members" }, null, null, null),
@@ -276,9 +276,17 @@
     /// </summary>
     [pbr::OriginalName("NotTimeTake_ArenaBox")] NotTimeTakeArenaBox = 28,
     /// <summary>
-    /// 创建公会失败,等级不足
+    /// 等级不足
     /// </summary>
-    [pbr::OriginalName("NotEnough_Level_CreateFamily")] NotEnoughLevelCreateFamily = 29,
+    [pbr::OriginalName("NotEnough_Level")] NotEnoughLevel = 29,
+    /// <summary>
+    /// 已经在工会中
+    /// </summary>
+    [pbr::OriginalName("AlreadyIn_Family")] AlreadyInFamily = 30,
+    /// <summary>
+    /// !工会不存在
+    /// </summary>
+    [pbr::OriginalName("NotExist_Family")] NotExistFamily = 31,
   }
 
   public enum ChatType {
@@ -521,8 +529,6 @@
       headimg_ = other.headimg_;
       singature_ = other.singature_;
       level_ = other.level_;
-      rank_ = other.rank_;
-      score_ = other.score_;
       exp_ = other.exp_;
       money_ = other.money_;
       gold_ = other.gold_;
@@ -607,38 +613,11 @@
       }
     }
 
-    /// <summary>Field number for the "rank" field.</summary>
-    public const int RankFieldNumber = 6;
-    private int rank_;
-    /// <summary>
-    /// 段位
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Rank {
-      get { return rank_; }
-      set {
-        rank_ = value;
-      }
-    }
-
-    /// <summary>Field number for the "score" field.</summary>
-    public const int ScoreFieldNumber = 7;
-    private int score_;
-    /// <summary>
-    /// 分数
-    /// </summary>
-    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Score {
-      get { return score_; }
-      set {
-        score_ = value;
-      }
-    }
-
     /// <summary>Field number for the "exp" field.</summary>
-    public const int ExpFieldNumber = 8;
+    public const int ExpFieldNumber = 6;
     private int exp_;
     /// <summary>
+    /// int32  score =7;
     /// !经验
     /// </summary>
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -650,7 +629,7 @@
     }
 
     /// <summary>Field number for the "money" field.</summary>
-    public const int MoneyFieldNumber = 9;
+    public const int MoneyFieldNumber = 7;
     private int money_;
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Money {
@@ -661,7 +640,7 @@
     }
 
     /// <summary>Field number for the "gold" field.</summary>
-    public const int GoldFieldNumber = 10;
+    public const int GoldFieldNumber = 8;
     private int gold_;
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Gold {
@@ -672,9 +651,9 @@
     }
 
     /// <summary>Field number for the "gems" field.</summary>
-    public const int GemsFieldNumber = 11;
+    public const int GemsFieldNumber = 9;
     private static readonly pb::FieldCodec<global::Protobuf.GemMsg> _repeated_gems_codec
-        = pb::FieldCodec.ForMessage(90, global::Protobuf.GemMsg.Parser);
+        = pb::FieldCodec.ForMessage(74, global::Protobuf.GemMsg.Parser);
     private readonly pbc::RepeatedField<global::Protobuf.GemMsg> gems_ = new pbc::RepeatedField<global::Protobuf.GemMsg>();
     /// <summary>
     /// *已有宝石列表
@@ -685,9 +664,9 @@
     }
 
     /// <summary>Field number for the "gemdeck1" field.</summary>
-    public const int Gemdeck1FieldNumber = 12;
+    public const int Gemdeck1FieldNumber = 10;
     private static readonly pb::FieldCodec<int> _repeated_gemdeck1_codec
-        = pb::FieldCodec.ForInt32(98);
+        = pb::FieldCodec.ForInt32(82);
     private readonly pbc::RepeatedField<int> gemdeck1_ = new pbc::RepeatedField<int>();
     /// <summary>
     /// 编队
@@ -698,9 +677,9 @@
     }
 
     /// <summary>Field number for the "gemdeck2" field.</summary>
-    public const int Gemdeck2FieldNumber = 13;
+    public const int Gemdeck2FieldNumber = 11;
     private static readonly pb::FieldCodec<int> _repeated_gemdeck2_codec
-        = pb::FieldCodec.ForInt32(106);
+        = pb::FieldCodec.ForInt32(90);
     private readonly pbc::RepeatedField<int> gemdeck2_ = new pbc::RepeatedField<int>();
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> Gemdeck2 {
@@ -708,9 +687,9 @@
     }
 
     /// <summary>Field number for the "gemdeck3" field.</summary>
-    public const int Gemdeck3FieldNumber = 14;
+    public const int Gemdeck3FieldNumber = 12;
     private static readonly pb::FieldCodec<int> _repeated_gemdeck3_codec
-        = pb::FieldCodec.ForInt32(114);
+        = pb::FieldCodec.ForInt32(98);
     private readonly pbc::RepeatedField<int> gemdeck3_ = new pbc::RepeatedField<int>();
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<int> Gemdeck3 {
@@ -718,7 +697,7 @@
     }
 
     /// <summary>Field number for the "deckid" field.</summary>
-    public const int DeckidFieldNumber = 15;
+    public const int DeckidFieldNumber = 13;
     private int deckid_;
     /// <summary>
     /// 默认编队索引0,1,2
@@ -732,7 +711,7 @@
     }
 
     /// <summary>Field number for the "acceptfriend" field.</summary>
-    public const int AcceptfriendFieldNumber = 16;
+    public const int AcceptfriendFieldNumber = 14;
     private bool acceptfriend_;
     /// <summary>
     ///  是否接受好友申请
@@ -746,7 +725,7 @@
     }
 
     /// <summary>Field number for the "namedchanged" field.</summary>
-    public const int NamedchangedFieldNumber = 17;
+    public const int NamedchangedFieldNumber = 15;
     private bool namedchanged_;
     /// <summary>
     ///  true 表示改过名字,false没有改过
@@ -760,7 +739,7 @@
     }
 
     /// <summary>Field number for the "areaexp" field.</summary>
-    public const int AreaexpFieldNumber = 18;
+    public const int AreaexpFieldNumber = 16;
     private int areaexp_;
     /// <summary>
     /// !竞技场经验
@@ -774,9 +753,9 @@
     }
 
     /// <summary>Field number for the "areaboxes" field.</summary>
-    public const int AreaboxesFieldNumber = 19;
+    public const int AreaboxesFieldNumber = 17;
     private static readonly pb::FieldCodec<global::Protobuf.ArenaBoxMsg> _repeated_areaboxes_codec
-        = pb::FieldCodec.ForMessage(154, global::Protobuf.ArenaBoxMsg.Parser);
+        = pb::FieldCodec.ForMessage(138, global::Protobuf.ArenaBoxMsg.Parser);
     private readonly pbc::RepeatedField<global::Protobuf.ArenaBoxMsg> areaboxes_ = new pbc::RepeatedField<global::Protobuf.ArenaBoxMsg>();
     /// <summary>
     /// !竞技宝箱列表
@@ -787,7 +766,7 @@
     }
 
     /// <summary>Field number for the "donate" field.</summary>
-    public const int DonateFieldNumber = 20;
+    public const int DonateFieldNumber = 18;
     private int donate_;
     /// <summary>
     /// 工会捐赠积分
@@ -818,8 +797,6 @@
       if (Headimg != other.Headimg) return false;
       if (Singature != other.Singature) return false;
       if (Level != other.Level) return false;
-      if (Rank != other.Rank) return false;
-      if (Score != other.Score) return false;
       if (Exp != other.Exp) return false;
       if (Money != other.Money) return false;
       if (Gold != other.Gold) return false;
@@ -844,8 +821,6 @@
       if (Headimg != 0) hash ^= Headimg.GetHashCode();
       if (Singature.Length != 0) hash ^= Singature.GetHashCode();
       if (Level != 0) hash ^= Level.GetHashCode();
-      if (Rank != 0) hash ^= Rank.GetHashCode();
-      if (Score != 0) hash ^= Score.GetHashCode();
       if (Exp != 0) hash ^= Exp.GetHashCode();
       if (Money != 0) hash ^= Money.GetHashCode();
       if (Gold != 0) hash ^= Gold.GetHashCode();
@@ -889,24 +864,16 @@
         output.WriteRawTag(40);
         output.WriteInt32(Level);
       }
-      if (Rank != 0) {
-        output.WriteRawTag(48);
-        output.WriteInt32(Rank);
-      }
-      if (Score != 0) {
-        output.WriteRawTag(56);
-        output.WriteInt32(Score);
-      }
       if (Exp != 0) {
-        output.WriteRawTag(64);
+        output.WriteRawTag(48);
         output.WriteInt32(Exp);
       }
       if (Money != 0) {
-        output.WriteRawTag(72);
+        output.WriteRawTag(56);
         output.WriteInt32(Money);
       }
       if (Gold != 0) {
-        output.WriteRawTag(80);
+        output.WriteRawTag(64);
         output.WriteInt32(Gold);
       }
       gems_.WriteTo(output, _repeated_gems_codec);
@@ -914,24 +881,24 @@
       gemdeck2_.WriteTo(output, _repeated_gemdeck2_codec);
       gemdeck3_.WriteTo(output, _repeated_gemdeck3_codec);
       if (Deckid != 0) {
-        output.WriteRawTag(120);
+        output.WriteRawTag(104);
         output.WriteInt32(Deckid);
       }
       if (Acceptfriend != false) {
-        output.WriteRawTag(128, 1);
+        output.WriteRawTag(112);
         output.WriteBool(Acceptfriend);
       }
       if (Namedchanged != false) {
-        output.WriteRawTag(136, 1);
+        output.WriteRawTag(120);
         output.WriteBool(Namedchanged);
       }
       if (Areaexp != 0) {
-        output.WriteRawTag(144, 1);
+        output.WriteRawTag(128, 1);
         output.WriteInt32(Areaexp);
       }
       areaboxes_.WriteTo(output, _repeated_areaboxes_codec);
       if (Donate != 0) {
-        output.WriteRawTag(160, 1);
+        output.WriteRawTag(144, 1);
         output.WriteInt32(Donate);
       }
     }
@@ -954,12 +921,6 @@
       if (Level != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
       }
-      if (Rank != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Rank);
-      }
-      if (Score != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Score);
-      }
       if (Exp != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Exp);
       }
@@ -977,10 +938,10 @@
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Deckid);
       }
       if (Acceptfriend != false) {
-        size += 2 + 1;
+        size += 1 + 1;
       }
       if (Namedchanged != false) {
-        size += 2 + 1;
+        size += 1 + 1;
       }
       if (Areaexp != 0) {
         size += 2 + pb::CodedOutputStream.ComputeInt32Size(Areaexp);
@@ -1011,12 +972,6 @@
       }
       if (other.Level != 0) {
         Level = other.Level;
-      }
-      if (other.Rank != 0) {
-        Rank = other.Rank;
-      }
-      if (other.Score != 0) {
-        Score = other.Score;
       }
       if (other.Exp != 0) {
         Exp = other.Exp;
@@ -1078,65 +1033,57 @@
             break;
           }
           case 48: {
-            Rank = input.ReadInt32();
-            break;
-          }
-          case 56: {
-            Score = input.ReadInt32();
-            break;
-          }
-          case 64: {
             Exp = input.ReadInt32();
             break;
           }
-          case 72: {
+          case 56: {
             Money = input.ReadInt32();
             break;
           }
-          case 80: {
+          case 64: {
             Gold = input.ReadInt32();
             break;
           }
-          case 90: {
+          case 74: {
             gems_.AddEntriesFrom(input, _repeated_gems_codec);
+            break;
+          }
+          case 82:
+          case 80: {
+            gemdeck1_.AddEntriesFrom(input, _repeated_gemdeck1_codec);
+            break;
+          }
+          case 90:
+          case 88: {
+            gemdeck2_.AddEntriesFrom(input, _repeated_gemdeck2_codec);
             break;
           }
           case 98:
           case 96: {
-            gemdeck1_.AddEntriesFrom(input, _repeated_gemdeck1_codec);
-            break;
-          }
-          case 106:
-          case 104: {
-            gemdeck2_.AddEntriesFrom(input, _repeated_gemdeck2_codec);
-            break;
-          }
-          case 114:
-          case 112: {
             gemdeck3_.AddEntriesFrom(input, _repeated_gemdeck3_codec);
             break;
           }
-          case 120: {
+          case 104: {
             Deckid = input.ReadInt32();
             break;
           }
-          case 128: {
+          case 112: {
             Acceptfriend = input.ReadBool();
             break;
           }
-          case 136: {
+          case 120: {
             Namedchanged = input.ReadBool();
             break;
           }
-          case 144: {
+          case 128: {
             Areaexp = input.ReadInt32();
             break;
           }
-          case 154: {
+          case 138: {
             areaboxes_.AddEntriesFrom(input, _repeated_areaboxes_codec);
             break;
           }
-          case 160: {
+          case 144: {
             Donate = input.ReadInt32();
             break;
           }
@@ -1178,7 +1125,7 @@
       headimg_ = other.headimg_;
       level_ = other.level_;
       rank_ = other.rank_;
-      score_ = other.score_;
+      areaexp_ = other.areaexp_;
       online_ = other.online_;
       gemdeck_ = other.gemdeck_.Clone();
     }
@@ -1249,17 +1196,17 @@
       }
     }
 
-    /// <summary>Field number for the "score" field.</summary>
-    public const int ScoreFieldNumber = 7;
-    private int score_;
+    /// <summary>Field number for the "areaexp" field.</summary>
+    public const int AreaexpFieldNumber = 7;
+    private int areaexp_;
     /// <summary>
     /// 分数
     /// </summary>
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Score {
-      get { return score_; }
+    public int Areaexp {
+      get { return areaexp_; }
       set {
-        score_ = value;
+        areaexp_ = value;
       }
     }
 
@@ -1305,7 +1252,7 @@
       if (Headimg != other.Headimg) return false;
       if (Level != other.Level) return false;
       if (Rank != other.Rank) return false;
-      if (Score != other.Score) return false;
+      if (Areaexp != other.Areaexp) return false;
       if (Online != other.Online) return false;
       if(!gemdeck_.Equals(other.gemdeck_)) return false;
       return true;
@@ -1319,7 +1266,7 @@
       if (Headimg != 0) hash ^= Headimg.GetHashCode();
       if (Level != 0) hash ^= Level.GetHashCode();
       if (Rank != 0) hash ^= Rank.GetHashCode();
-      if (Score != 0) hash ^= Score.GetHashCode();
+      if (Areaexp != 0) hash ^= Areaexp.GetHashCode();
       if (Online != false) hash ^= Online.GetHashCode();
       hash ^= gemdeck_.GetHashCode();
       return hash;
@@ -1352,9 +1299,9 @@
         output.WriteRawTag(48);
         output.WriteInt32(Rank);
       }
-      if (Score != 0) {
+      if (Areaexp != 0) {
         output.WriteRawTag(56);
-        output.WriteInt32(Score);
+        output.WriteInt32(Areaexp);
       }
       if (Online != false) {
         output.WriteRawTag(64);
@@ -1381,8 +1328,8 @@
       if (Rank != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Rank);
       }
-      if (Score != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Score);
+      if (Areaexp != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Areaexp);
       }
       if (Online != false) {
         size += 1 + 1;
@@ -1411,8 +1358,8 @@
       if (other.Rank != 0) {
         Rank = other.Rank;
       }
-      if (other.Score != 0) {
-        Score = other.Score;
+      if (other.Areaexp != 0) {
+        Areaexp = other.Areaexp;
       }
       if (other.Online != false) {
         Online = other.Online;
@@ -1449,7 +1396,7 @@
             break;
           }
           case 56: {
-            Score = input.ReadInt32();
+            Areaexp = input.ReadInt32();
             break;
           }
           case 64: {
@@ -2196,7 +2143,7 @@
       headimg_ = other.headimg_;
       position_ = other.position_;
       online_ = other.online_;
-      score_ = other.score_;
+      areaexp_ = other.areaexp_;
       level_ = other.level_;
       weekDonate_ = other.weekDonate_;
       totalDonate_ = other.totalDonate_;
@@ -2266,22 +2213,22 @@
       }
     }
 
-    /// <summary>Field number for the "score" field.</summary>
-    public const int ScoreFieldNumber = 6;
-    private int score_;
+    /// <summary>Field number for the "areaexp" field.</summary>
+    public const int AreaexpFieldNumber = 6;
+    private int areaexp_;
     /// <summary>
     /// 分数
     /// </summary>
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
-    public int Score {
-      get { return score_; }
+    public int Areaexp {
+      get { return areaexp_; }
       set {
-        score_ = value;
+        areaexp_ = value;
       }
     }
 
     /// <summary>Field number for the "level" field.</summary>
-    public const int LevelFieldNumber = 7;
+    public const int LevelFieldNumber = 8;
     private int level_;
     /// <summary>
     /// 等级
@@ -2295,7 +2242,7 @@
     }
 
     /// <summary>Field number for the "weekDonate" field.</summary>
-    public const int WeekDonateFieldNumber = 8;
+    public const int WeekDonateFieldNumber = 9;
     private int weekDonate_;
     /// <summary>
     ///  本周和总捐献数
@@ -2309,7 +2256,7 @@
     }
 
     /// <summary>Field number for the "totalDonate" field.</summary>
-    public const int TotalDonateFieldNumber = 9;
+    public const int TotalDonateFieldNumber = 10;
     private int totalDonate_;
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int TotalDonate {
@@ -2320,9 +2267,9 @@
     }
 
     /// <summary>Field number for the "gemdeck" field.</summary>
-    public const int GemdeckFieldNumber = 10;
+    public const int GemdeckFieldNumber = 11;
     private static readonly pb::FieldCodec<global::Protobuf.GemMsg> _repeated_gemdeck_codec
-        = pb::FieldCodec.ForMessage(82, global::Protobuf.GemMsg.Parser);
+        = pb::FieldCodec.ForMessage(90, global::Protobuf.GemMsg.Parser);
     private readonly pbc::RepeatedField<global::Protobuf.GemMsg> gemdeck_ = new pbc::RepeatedField<global::Protobuf.GemMsg>();
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public pbc::RepeatedField<global::Protobuf.GemMsg> Gemdeck {
@@ -2347,7 +2294,7 @@
       if (Headimg != other.Headimg) return false;
       if (Position != other.Position) return false;
       if (Online != other.Online) return false;
-      if (Score != other.Score) return false;
+      if (Areaexp != other.Areaexp) return false;
       if (Level != other.Level) return false;
       if (WeekDonate != other.WeekDonate) return false;
       if (TotalDonate != other.TotalDonate) return false;
@@ -2363,7 +2310,7 @@
       if (Headimg != 0) hash ^= Headimg.GetHashCode();
       if (Position != 0) hash ^= Position.GetHashCode();
       if (Online != false) hash ^= Online.GetHashCode();
-      if (Score != 0) hash ^= Score.GetHashCode();
+      if (Areaexp != 0) hash ^= Areaexp.GetHashCode();
       if (Level != 0) hash ^= Level.GetHashCode();
       if (WeekDonate != 0) hash ^= WeekDonate.GetHashCode();
       if (TotalDonate != 0) hash ^= TotalDonate.GetHashCode();
@@ -2398,20 +2345,20 @@
         output.WriteRawTag(40);
         output.WriteBool(Online);
       }
-      if (Score != 0) {
+      if (Areaexp != 0) {
         output.WriteRawTag(48);
-        output.WriteInt32(Score);
+        output.WriteInt32(Areaexp);
       }
       if (Level != 0) {
-        output.WriteRawTag(56);
+        output.WriteRawTag(64);
         output.WriteInt32(Level);
       }
       if (WeekDonate != 0) {
-        output.WriteRawTag(64);
+        output.WriteRawTag(72);
         output.WriteInt32(WeekDonate);
       }
       if (TotalDonate != 0) {
-        output.WriteRawTag(72);
+        output.WriteRawTag(80);
         output.WriteInt32(TotalDonate);
       }
       gemdeck_.WriteTo(output, _repeated_gemdeck_codec);
@@ -2435,8 +2382,8 @@
       if (Online != false) {
         size += 1 + 1;
       }
-      if (Score != 0) {
-        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Score);
+      if (Areaexp != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Areaexp);
       }
       if (Level != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Level);
@@ -2471,8 +2418,8 @@
       if (other.Online != false) {
         Online = other.Online;
       }
-      if (other.Score != 0) {
-        Score = other.Score;
+      if (other.Areaexp != 0) {
+        Areaexp = other.Areaexp;
       }
       if (other.Level != 0) {
         Level = other.Level;
@@ -2515,22 +2462,22 @@
             break;
           }
           case 48: {
-            Score = input.ReadInt32();
-            break;
-          }
-          case 56: {
-            Level = input.ReadInt32();
+            Areaexp = input.ReadInt32();
             break;
           }
           case 64: {
-            WeekDonate = input.ReadInt32();
+            Level = input.ReadInt32();
             break;
           }
           case 72: {
+            WeekDonate = input.ReadInt32();
+            break;
+          }
+          case 80: {
             TotalDonate = input.ReadInt32();
             break;
           }
-          case 82: {
+          case 90: {
             gemdeck_.AddEntriesFrom(input, _repeated_gemdeck_codec);
             break;
           }
diff --git a/Assets/Scripts/Net/NetExtends/Game.cs b/Assets/Scripts/Net/NetExtends/Game.cs
index 139bdde..c6f26ea 100644
--- a/Assets/Scripts/Net/NetExtends/Game.cs
+++ b/Assets/Scripts/Net/NetExtends/Game.cs
@@ -108,12 +108,13 @@
             "bmRfUzJDEhEKCWVycm9yY29kZRgBIAEoBRIjCgZmYW1pbHkYAiABKAsyEy5w",
             "cm90b2J1Zi5GYW1pbHlNc2ciHQoORmFtaWx5Sm9pbl9DMlMSCwoDdWlkGAEg",
             "ASgJIjAKDkZhbWlseUpvaW5fUzJDEhEKCWVycm9yY29kZRgBIAEoBRILCgN1",
-            "aWQYAiABKAkiIgoRRmFtaWx5R2V0Q2hhdF9DMlMSDQoFbGltaXQYASABKAUi",
-            "ZgoRRmFtaWx5R2V0Q2hhdF9TMkMSEQoJZXJyb3Jjb2RlGAEgASgFEikKCG1l",
-            "c3NhZ2VzGAIgAygLMhcucHJvdG9idWYuRmFtaWx5Q2hhdE1zZxITCgtvbmxp",
-            "bmVDb3VudBgEIAEoBSJMChNGYW1pbHlTdGFydENoYXRfQzJTEiQKCGNoYXRU",
-            "eXBlGAEgASgOMhIucHJvdG9idWYuQ2hhdFR5cGUSDwoHY29udGVudBgCIAEo",
-            "CSJSChNGYW1pbHlTdGFydENoYXRfUzJDEhEKCWVycm9yY29kZRgBIAEoBRIo",
+            "aWQYAiABKAkiMQoRRmFtaWx5R2V0Q2hhdF9DMlMSDQoFc3RhcnQYASABKAUS",
+            "DQoFbGltaXQYAiABKAUidQoRRmFtaWx5R2V0Q2hhdF9TMkMSEQoJZXJyb3Jj",
+            "b2RlGAEgASgFEikKCG1lc3NhZ2VzGAIgAygLMhcucHJvdG9idWYuRmFtaWx5",
+            "Q2hhdE1zZxINCgV0b3RhbBgDIAEoBRITCgtvbmxpbmVDb3VudBgEIAEoBSJb",
+            "ChNGYW1pbHlTdGFydENoYXRfQzJTEiQKCGNoYXRUeXBlGAEgASgOMhIucHJv",
+            "dG9idWYuQ2hhdFR5cGUSDwoHY29udGVudBgCIAEoCRINCgVnZW1JZBgDIAEo",
+            "BSJSChNGYW1pbHlTdGFydENoYXRfUzJDEhEKCWVycm9yY29kZRgBIAEoBRIo",
             "CgdtZXNzYWdlGAIgASgLMhcucHJvdG9idWYuRmFtaWx5Q2hhdE1zZyIqChVG",
             "YW1pbHlTdGFydERvbmF0ZV9DMlMSEQoJbWVzc2FnZUlkGAEgASgFIlQKFUZh",
             "bWlseVN0YXJ0RG9uYXRlX1MyQxIRCgllcnJvcmNvZGUYASABKAUSKAoHbWVz",
@@ -202,9 +203,9 @@
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyFind_S2C), global::Protobuf.FamilyFind_S2C.Parser, new[]{ "Errorcode", "Family" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyJoin_C2S), global::Protobuf.FamilyJoin_C2S.Parser, new[]{ "Uid" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyJoin_S2C), global::Protobuf.FamilyJoin_S2C.Parser, new[]{ "Errorcode", "Uid" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyGetChat_C2S), global::Protobuf.FamilyGetChat_C2S.Parser, new[]{ "Limit" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyGetChat_S2C), global::Protobuf.FamilyGetChat_S2C.Parser, new[]{ "Errorcode", "Messages", "OnlineCount" }, null, null, null),
-            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartChat_C2S), global::Protobuf.FamilyStartChat_C2S.Parser, new[]{ "ChatType", "Content" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyGetChat_C2S), global::Protobuf.FamilyGetChat_C2S.Parser, new[]{ "Start", "Limit" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyGetChat_S2C), global::Protobuf.FamilyGetChat_S2C.Parser, new[]{ "Errorcode", "Messages", "Total", "OnlineCount" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartChat_C2S), global::Protobuf.FamilyStartChat_C2S.Parser, new[]{ "ChatType", "Content", "GemId" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartChat_S2C), global::Protobuf.FamilyStartChat_S2C.Parser, new[]{ "Errorcode", "Message" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartDonate_C2S), global::Protobuf.FamilyStartDonate_C2S.Parser, new[]{ "MessageId" }, null, null, null),
             new pbr::GeneratedClrTypeInfo(typeof(global::Protobuf.FamilyStartDonate_S2C), global::Protobuf.FamilyStartDonate_S2C.Parser, new[]{ "Errorcode", "Message" }, null, null, null),
@@ -8716,6 +8717,9 @@
     /// <summary>Field number for the "errorcode" field.</summary>
     public const int ErrorcodeFieldNumber = 1;
     private int errorcode_;
+    /// <summary>
+    /// NotEnough_Level,Input_Invalid
+    /// </summary>
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Errorcode {
       get { return errorcode_; }
@@ -8987,6 +8991,9 @@
     /// <summary>Field number for the "errorcode" field.</summary>
     public const int ErrorcodeFieldNumber = 1;
     private int errorcode_;
+    /// <summary>
+    ///  NotEnough_Level,AlreadyIn_Family
+    /// </summary>
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Errorcode {
       get { return errorcode_; }
@@ -9258,6 +9265,9 @@
     /// <summary>Field number for the "errorcode" field.</summary>
     public const int ErrorcodeFieldNumber = 1;
     private int errorcode_;
+    /// <summary>
+    ///  NotEnough_Level,AlreadyIn_Family,NotExist_Family
+    /// </summary>
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Errorcode {
       get { return errorcode_; }
@@ -9394,6 +9404,7 @@
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public FamilyGetChat_C2S(FamilyGetChat_C2S other) : this() {
+      start_ = other.start_;
       limit_ = other.limit_;
     }
 
@@ -9402,13 +9413,23 @@
       return new FamilyGetChat_C2S(this);
     }
 
-    /// <summary>Field number for the "limit" field.</summary>
-    public const int LimitFieldNumber = 1;
-    private int limit_;
+    /// <summary>Field number for the "start" field.</summary>
+    public const int StartFieldNumber = 1;
+    private int start_;
     /// <summary>
     ///  0是最后一页,1倒数第二页
-    /// int32 start = 1;
     /// </summary>
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Start {
+      get { return start_; }
+      set {
+        start_ = value;
+      }
+    }
+
+    /// <summary>Field number for the "limit" field.</summary>
+    public const int LimitFieldNumber = 2;
+    private int limit_;
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int Limit {
       get { return limit_; }
@@ -9430,6 +9451,7 @@
       if (ReferenceEquals(other, this)) {
         return true;
       }
+      if (Start != other.Start) return false;
       if (Limit != other.Limit) return false;
       return true;
     }
@@ -9437,6 +9459,7 @@
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override int GetHashCode() {
       int hash = 1;
+      if (Start != 0) hash ^= Start.GetHashCode();
       if (Limit != 0) hash ^= Limit.GetHashCode();
       return hash;
     }
@@ -9448,8 +9471,12 @@
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public void WriteTo(pb::CodedOutputStream output) {
-      if (Limit != 0) {
+      if (Start != 0) {
         output.WriteRawTag(8);
+        output.WriteInt32(Start);
+      }
+      if (Limit != 0) {
+        output.WriteRawTag(16);
         output.WriteInt32(Limit);
       }
     }
@@ -9457,6 +9484,9 @@
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public int CalculateSize() {
       int size = 0;
+      if (Start != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Start);
+      }
       if (Limit != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Limit);
       }
@@ -9467,6 +9497,9 @@
     public void MergeFrom(FamilyGetChat_C2S other) {
       if (other == null) {
         return;
+      }
+      if (other.Start != 0) {
+        Start = other.Start;
       }
       if (other.Limit != 0) {
         Limit = other.Limit;
@@ -9482,6 +9515,10 @@
             input.SkipLastField();
             break;
           case 8: {
+            Start = input.ReadInt32();
+            break;
+          }
+          case 16: {
             Limit = input.ReadInt32();
             break;
           }
@@ -9517,6 +9554,7 @@
     public FamilyGetChat_S2C(FamilyGetChat_S2C other) : this() {
       errorcode_ = other.errorcode_;
       messages_ = other.messages_.Clone();
+      total_ = other.total_;
       onlineCount_ = other.onlineCount_;
     }
 
@@ -9546,11 +9584,21 @@
       get { return messages_; }
     }
 
+    /// <summary>Field number for the "total" field.</summary>
+    public const int TotalFieldNumber = 3;
+    private int total_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int Total {
+      get { return total_; }
+      set {
+        total_ = value;
+      }
+    }
+
     /// <summary>Field number for the "onlineCount" field.</summary>
     public const int OnlineCountFieldNumber = 4;
     private int onlineCount_;
     /// <summary>
-    /// int32 total=3;
     ///  公会在线玩家数
     /// </summary>
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -9576,6 +9624,7 @@
       }
       if (Errorcode != other.Errorcode) return false;
       if(!messages_.Equals(other.messages_)) return false;
+      if (Total != other.Total) return false;
       if (OnlineCount != other.OnlineCount) return false;
       return true;
     }
@@ -9585,6 +9634,7 @@
       int hash = 1;
       if (Errorcode != 0) hash ^= Errorcode.GetHashCode();
       hash ^= messages_.GetHashCode();
+      if (Total != 0) hash ^= Total.GetHashCode();
       if (OnlineCount != 0) hash ^= OnlineCount.GetHashCode();
       return hash;
     }
@@ -9601,6 +9651,10 @@
         output.WriteInt32(Errorcode);
       }
       messages_.WriteTo(output, _repeated_messages_codec);
+      if (Total != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(Total);
+      }
       if (OnlineCount != 0) {
         output.WriteRawTag(32);
         output.WriteInt32(OnlineCount);
@@ -9614,6 +9668,9 @@
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(Errorcode);
       }
       size += messages_.CalculateSize(_repeated_messages_codec);
+      if (Total != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Total);
+      }
       if (OnlineCount != 0) {
         size += 1 + pb::CodedOutputStream.ComputeInt32Size(OnlineCount);
       }
@@ -9629,6 +9686,9 @@
         Errorcode = other.Errorcode;
       }
       messages_.Add(other.messages_);
+      if (other.Total != 0) {
+        Total = other.Total;
+      }
       if (other.OnlineCount != 0) {
         OnlineCount = other.OnlineCount;
       }
@@ -9648,6 +9708,10 @@
           }
           case 18: {
             messages_.AddEntriesFrom(input, _repeated_messages_codec);
+            break;
+          }
+          case 24: {
+            Total = input.ReadInt32();
             break;
           }
           case 32: {
@@ -9689,6 +9753,7 @@
     public FamilyStartChat_C2S(FamilyStartChat_C2S other) : this() {
       chatType_ = other.chatType_;
       content_ = other.content_;
+      gemId_ = other.gemId_;
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -9718,6 +9783,17 @@
       }
     }
 
+    /// <summary>Field number for the "gemId" field.</summary>
+    public const int GemIdFieldNumber = 3;
+    private int gemId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    public int GemId {
+      get { return gemId_; }
+      set {
+        gemId_ = value;
+      }
+    }
+
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
     public override bool Equals(object other) {
       return Equals(other as FamilyStartChat_C2S);
@@ -9733,6 +9809,7 @@
       }
       if (ChatType != other.ChatType) return false;
       if (Content != other.Content) return false;
+      if (GemId != other.GemId) return false;
       return true;
     }
 
@@ -9741,6 +9818,7 @@
       int hash = 1;
       if (ChatType != 0) hash ^= ChatType.GetHashCode();
       if (Content.Length != 0) hash ^= Content.GetHashCode();
+      if (GemId != 0) hash ^= GemId.GetHashCode();
       return hash;
     }
 
@@ -9759,6 +9837,10 @@
         output.WriteRawTag(18);
         output.WriteString(Content);
       }
+      if (GemId != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(GemId);
+      }
     }
 
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
@@ -9769,6 +9851,9 @@
       }
       if (Content.Length != 0) {
         size += 1 + pb::CodedOutputStream.ComputeStringSize(Content);
+      }
+      if (GemId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(GemId);
       }
       return size;
     }
@@ -9783,6 +9868,9 @@
       }
       if (other.Content.Length != 0) {
         Content = other.Content;
+      }
+      if (other.GemId != 0) {
+        GemId = other.GemId;
       }
     }
 
@@ -9802,6 +9890,10 @@
             Content = input.ReadString();
             break;
           }
+          case 24: {
+            GemId = input.ReadInt32();
+            break;
+          }
         }
       }
     }
diff --git a/Assets/Scripts/Net/NetExtends/Table.cs b/Assets/Scripts/Net/NetExtends/Table.cs
index 7380e41..5ba628d 100644
--- a/Assets/Scripts/Net/NetExtends/Table.cs
+++ b/Assets/Scripts/Net/NetExtends/Table.cs
@@ -42,6 +42,8 @@
             "endless_buff.json",
             "endless_enemy.json",
             "endless_port.json",
+            "endless_teachport.json",
+            "donaterule.json",
             "scoreshop.json",
             "donateshop.json",
             "gemcost.json",
@@ -197,6 +199,28 @@
                     foreach (JsonData item in data)
                     {
                         endless_port tmp = endless_port.CreateFromJson(item);
+                        allData.Add(tmp as tabledata);
+                    }
+                    JsonDataCenter.allData.Add(tablename, allData);
+                    break;
+               
+            
+                case "endless_teachport":
+                    //allData.Clear();
+                    foreach (JsonData item in data)
+                    {
+                        endless_teachport tmp = endless_teachport.CreateFromJson(item);
+                        allData.Add(tmp as tabledata);
+                    }
+                    JsonDataCenter.allData.Add(tablename, allData);
+                    break;
+               
+            
+                case "donaterule":
+                    //allData.Clear();
+                    foreach (JsonData item in data)
+                    {
+                        donaterule tmp = donaterule.CreateFromJson(item);
                         allData.Add(tmp as tabledata);
                     }
                     JsonDataCenter.allData.Add(tablename, allData);
@@ -1000,6 +1024,124 @@
 
     }
 
+    //! 生成文件 endless_teachport(无尽模式新手引导关卡).xlsx
+    public class endless_teachport : tabledata {
+        public int getid(){
+            return id;
+        }
+        
+        // id
+        public int id;
+        
+        // 关卡等级
+        public int level;
+        
+        // Boss名称
+        public string boss_name;
+        
+        // Boss资源id
+        public int resource;
+        
+        // 波次
+        public int wave;
+        
+        // 赛道
+        public int tunel;
+        
+        // 敌人id
+        public int enemy_id;
+        
+        // 本波次敌人数量
+        public int amount;
+        
+        // 本赛道出怪间隔
+        public int interval;
+        
+        // 怪物基础血量
+        public int b_hp;
+        
+        // 怪物基础速度
+        public float b_speed;
+        
+        // 掉落基础金币
+        public int b_coin;
+        
+        // 波次间隔
+        public int cooldown;
+        
+        // 怪物掉落
+        public List<reward> drop;
+        
+        // 掉落概率
+        public List<int> drop_rate;
+        
+        // 法阵图片
+        public int tunel_bg;
+        
+
+
+        public static endless_teachport CreateFromJson(JsonData item)
+        {
+            endless_teachport _endless_teachport = new endless_teachport();
+
+            int index = 0;
+            _endless_teachport.id = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.level = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.boss_name = GameUtils.GetString(item[index++].ToString()); 
+            _endless_teachport.resource = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.wave = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.tunel = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.enemy_id = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.amount = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.interval = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.b_hp = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.b_speed = float.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.b_coin = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.cooldown = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _endless_teachport.drop = GameUtils.GetRewardList(item[index++]); 
+            _endless_teachport.drop_rate = GameUtils.GetIntList(item[index++]); 
+            _endless_teachport.tunel_bg = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            
+            return _endless_teachport;
+        }
+
+    }
+
+    //! 生成文件 G_donaterule(公会捐赠卡规则).xlsx
+    public class donaterule : tabledata {
+        public int getid(){
+            return id;
+        }
+        
+        // 标识符
+        public int id;
+        
+        // 竞技场等级
+        public List<int> ranklevle;
+        
+        // 发起请求后可获得的卡牌数
+        public List<string> canreward;
+        
+        // 可捐赠给他人的卡牌数
+        public List<string> candonate;
+        
+
+
+        public static donaterule CreateFromJson(JsonData item)
+        {
+            donaterule _donaterule = new donaterule();
+
+            int index = 0;
+            _donaterule.id = int.Parse(GameUtils.GetString(item[index++].ToString())); 
+            _donaterule.ranklevle = GameUtils.GetIntList(item[index++]); 
+            _donaterule.canreward = GameUtils.GetStringList(item[index++]); 
+            _donaterule.candonate = GameUtils.GetStringList(item[index++]); 
+            
+            return _donaterule;
+        }
+
+    }
+
     //! 生成文件 G_公会积分商店.xlsx
     public class scoreshop : tabledata {
         public int getid(){
diff --git a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs b/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
index 5ed2192..762e8f6 100644
--- a/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
+++ b/Assets/Scripts/TowerDefense/Affectors/AttackAffector.cs
@@ -8,6 +8,7 @@
 using TowerDefense.Towers;
 using TowerDefense.Towers.Projectiles;
 using UnityEngine;
+using KTGMGemClient;
 
 namespace TowerDefense.Affectors
 {
@@ -112,7 +113,6 @@
         protected float energyCalTime = 0;
 		protected float fInEnergy = 0;
 		protected float fBackupTimer = 0.0f;
-
 		/// <summary>
 		/// Gets the search rate from the targetter
 		/// </summary>
@@ -274,6 +274,7 @@
 					fInEnergy -= Time.deltaTime;
 					if( fInEnergy <= 0)
                     {
+                        EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.FireTowerChargeEnd);
 						fInEnergy = 0.0f;
 						this.energyCalTime = 0.0f;	
 						towerPtr.energyCtl.SetEnergyProgress(0);
diff --git a/Assets/Scripts/TowerDefense/Agents/Agent.cs b/Assets/Scripts/TowerDefense/Agents/Agent.cs
index a9d1bf3..44df4e4 100644
--- a/Assets/Scripts/TowerDefense/Agents/Agent.cs
+++ b/Assets/Scripts/TowerDefense/Agents/Agent.cs
@@ -193,6 +193,12 @@
         protected bool bInDeathAct = false;
 
         /// <summary>
+        /// 原地罚站
+        /// </summary>
+        /// <param name="can"></param>
+        public bool CanMove { get; set; } = true;
+
+        /// <summary>
         /// Gets the attached nav mesh agent velocity
         /// </summary>
         public override Vector3 velocity
@@ -848,7 +854,7 @@
             this.UpdateAction();
 
             // 处理死亡状态了,不必再移动:
-            if (bInDeathAct) return;
+            if (bInDeathAct || !CanMove) return;
 
             m_Destination = initNode.GetNextNode();
             updateAgentPos(Time.deltaTime);
diff --git a/Assets/Scripts/TowerDefense/Level/AgentInsManager.cs b/Assets/Scripts/TowerDefense/Level/AgentInsManager.cs
index 428ed8d..f8c2d16 100644
--- a/Assets/Scripts/TowerDefense/Level/AgentInsManager.cs
+++ b/Assets/Scripts/TowerDefense/Level/AgentInsManager.cs
@@ -223,6 +223,30 @@
         return agentWaveLineArray;
     }
 
+    /// <summary>
+    /// 设置某条兵线的所有小兵的移动状态
+    /// </summary>
+    /// <param name="waveLineId">兵线id 1~5, 如果是-1则设置所有兵线的状态</param>
+    /// <param name="canMove">是否可以移动</param>
+    /// <param name="isOppo">是否是敌方</param>
+    public void SetWaveLineCanMove(int waveLineId, bool canMove, bool isOppo)
+    {
+        WaveLineAgentInsMgr[] waveLineAgents = isOppo ? getOppoWaveLineList() : GetWaveLineList();
+
+        for (int i = 0; i < waveLineAgents.Length; ++i)
+        {
+            if (i == waveLineId - 1 || waveLineId == -1)
+            {
+                List<Agent> list = waveLineAgents[i].listAgent;
+
+                for (int j = 0; j < list.Count; ++j)
+                {
+                    list[j].CanMove = canMove;
+                }
+            }
+        }
+    }
+
     public List<Agent> agentList
     {
         get { return this.agentInsList; }
diff --git a/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs b/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs
index 03d34fa..6045c3c 100644
--- a/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs
+++ b/Assets/Scripts/TowerDefense/Level/EndlessLevelManager.cs
@@ -156,6 +156,11 @@
         private bool isBuffSelectCompleted = true;
 
         /// <summary>
+        /// 新手第一关是否完成
+        /// </summary>
+        private bool isFirstLevelCompleted = false;
+
+        /// <summary>
         /// 切换基地
         /// </summary>
         /// <param name="index">列索引</param>
@@ -306,8 +311,19 @@
             // 本关卡所有波次全部生成完成 && 敌人全部被清理了,然后就去尝试进入下一关
             if (EndlessLeveltate == LevelState.SpawningEnemies && IsAllWaveCompleted && NumberOfEnemies == 0)
             {
-                if (!UpdateLevel())
-                    ChangeLevelState(LevelState.AllEnemiesSpawned);
+                // 新手的话,第一关完了暂停
+                if (!GameConfig.IsNewbie)
+                {
+                    if (!UpdateLevel())
+                        ChangeLevelState(LevelState.AllEnemiesSpawned);
+                }
+                else if (!isFirstLevelCompleted)
+                {
+                    isFirstLevelCompleted = true;
+                    EndlessUIStart.instance.Pause();
+                    // 第一关的怪全部被杀光
+                    EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.KillDone);
+                }
             }
         }
 
@@ -344,9 +360,6 @@
             ++CurrentLevel;
             IsAllWaveCompleted = false;
 
-            // 进入boss虚弱状态
-            Debug.Log("--------------------- 进入boss虚弱状态 ---------------------");
-
             // 所有关卡全部结束
             if (CurrentLevel > EndlessPortData.MaxLevel)
                 return false;
@@ -372,7 +385,14 @@
         private void BeginLevel()
         {
             if (EndlessGameUI.instance.state == EndlessGameUI.State.GameOver) return;
-            ShowSelectBuffUI();
+
+            if (!GameConfig.IsNewbie)
+                ShowSelectBuffUI();
+            else
+            {
+                EndlessUIStart.instance.Restart();
+                WaveManager.StartWaves(CurrentLevel);
+            }
         }
 
         /// <summary>
@@ -497,5 +517,27 @@
                 --WaveManager.TotalWaveLines;
             }
         }
+
+        /// <summary>
+        /// 暂停波次,小怪停止移动,塔停止攻击
+        /// </summary>
+        public void PauseWave()
+        {
+            EndlessUIStart.instance.Pause();
+            AgentInsManager.instance.SetWaveLineCanMove(-1, false, false);
+            WaveManager.PauseAllWave();
+            EndlessGameUI.instance.SetAttackingTowerState(false);
+        }
+
+        /// <summary>
+        /// 恢复波次,小怪
+        /// </summary>
+        public void RestartWave()
+        {
+            EndlessUIStart.instance.Restart();
+            AgentInsManager.instance.SetWaveLineCanMove(-1, true, false);
+            WaveManager.RestartAllWave();
+            EndlessGameUI.instance.SetAttackingTowerState(true);
+        }
     }
 }
\ No newline at end of file
diff --git a/Assets/Scripts/TowerDefense/Level/EndlessWave.cs b/Assets/Scripts/TowerDefense/Level/EndlessWave.cs
index 23f760b..9f4fe7f 100644
--- a/Assets/Scripts/TowerDefense/Level/EndlessWave.cs
+++ b/Assets/Scripts/TowerDefense/Level/EndlessWave.cs
@@ -99,6 +99,18 @@
             isWaveStoped = true;
         }
 
+        public void PauseWave()
+        {
+            PauseTimer(spawnTimer);
+            isWaveStoped = true;
+        }
+
+        public void RestartWave()
+        {
+            StartTimer(spawnTimer);
+            isWaveStoped = false;
+        }
+
         /// <summary>
         /// Handles spawning the current agent and sets up the next agent for spawning
         /// 在场景内孵化出来一个Boss,这个核心函数最后被规则性的数据接管
diff --git a/Assets/Scripts/TowerDefense/Level/EndlessWaveManager.cs b/Assets/Scripts/TowerDefense/Level/EndlessWaveManager.cs
index 6ed6da1..4ddc5cb 100644
--- a/Assets/Scripts/TowerDefense/Level/EndlessWaveManager.cs
+++ b/Assets/Scripts/TowerDefense/Level/EndlessWaveManager.cs
@@ -226,6 +226,30 @@
         }
 
         /// <summary>
+        /// 暂停所有兵线出兵
+        /// </summary>
+        public void PauseAllWave()
+        {
+            foreach (EndlessPortConfig data in waveData)
+            {
+                if (waves[data.Config.tunel - 1].LineState == EndlessWaveLineState.Spawning)
+                    waves[data.Config.tunel - 1].PauseWave();
+            }
+        }
+
+        /// <summary>
+        /// 恢复所有兵线出兵
+        /// </summary>
+        public void RestartAllWave()
+        {
+            foreach (EndlessPortConfig data in waveData)
+            {
+                if (waves[data.Config.tunel - 1].LineState == EndlessWaveLineState.Spawning)
+                    waves[data.Config.tunel - 1].RestartWave();
+            }
+        }
+
+        /// <summary>
         /// 一波结束了
         /// </summary>
         private void OneWaveCompleted()
diff --git a/Assets/Scripts/TowerDefense/Towers/Placement/IPlacementArea.cs b/Assets/Scripts/TowerDefense/Towers/Placement/IPlacementArea.cs
index 30eb5cf..acfa4c6 100644
--- a/Assets/Scripts/TowerDefense/Towers/Placement/IPlacementArea.cs
+++ b/Assets/Scripts/TowerDefense/Towers/Placement/IPlacementArea.cs
@@ -3,145 +3,146 @@
 
 namespace TowerDefense.Towers.Placement
 {
-	/// <summary>
-	/// An interface for a placement area that can contain a tower
-	/// </summary>
-	public interface IPlacementArea
-	{
-		/// <summary>
-		/// Gets this object's transform
-		/// </summary>
-		Transform transform { get; }
+    /// <summary>
+    /// An interface for a placement area that can contain a tower
+    /// </summary>
+    public interface IPlacementArea
+    {
+        /// <summary>
+        /// Gets this object's transform
+        /// </summary>
+        Transform transform { get; }
 
-		/// <summary>
-		/// 获取当前PlaceMentArea的Size.
-		/// </summary>
-		IntVector2 getdimsize();
+        /// <summary>
+        /// 获取当前PlaceMentArea的Size.
+        /// </summary>
+        IntVector2 getdimsize();
 
-		/// <summary>
-		/// 获取一个可以放置塔防的位置.
-		/// </summary>
-		/// <returns></returns>
-		IntVector2 getFreePos(int xdim,int ydim,bool forceGet = false );
+        /// <summary>
+        /// 获取一个可以放置塔防的位置.
+        /// </summary>
+        /// <returns></returns>
+        IntVector2 getFreePos(int xdim, int ydim, bool forceGet = false);
 
 
-		/// <summary>
-		/// 获取对应位置的充能子弹界面指针.
-		/// </summary>
-		/// <param name="x"></param>
-		/// <returns></returns>
-		BulletUICtl GetBulletUICtl(int x);
+        /// <summary>
+        /// 获取对应位置的充能子弹界面指针.
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        BulletUICtl GetBulletUICtl(int x, int y);
 
-		/// <summary>
-		/// 获取对应位置的能量条界面指针.
-		/// </summary>
-		/// <param name="x"></param>
-		/// <returns></returns>
-		EnergyUICtl GetEnergyUICtl(int x);
+        /// <summary>
+        /// 获取对应位置的能量条界面指针.
+        /// </summary>
+        /// <param name="x"></param>
+        /// <returns></returns>
+        EnergyUICtl GetEnergyUICtl(int x, int y);
 
-		/// <summary>
-		/// 是否空置的攻击位
-		/// </summary>
-		/// <param name="x"></param>
-		/// <param name="y"></param>
-		/// <returns></returns>
-		bool isFreeAtackPos(int x, int y);
+        /// <summary>
+        /// 是否空置的攻击位
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        bool isFreeAtackPos(int x, int y);
 
-		/// <summary>
-		/// 是否有已开启的可放置攻击位置。
-		/// </summary>
-		/// <returns></returns>
-		bool hasFreeAttackPos();
+        /// <summary>
+        /// 是否有已开启的可放置攻击位置。
+        /// </summary>
+        /// <returns></returns>
+        bool hasFreeAttackPos();
 
-		/// <summary>
-		/// 是否是等待购买的攻击塔位.
-		/// </summary>
-		/// <param name="x"></param>
-		/// <param name="y"></param>
-		/// <returns></returns>
-		bool isWaitBuyGrid(int x, int y);
+        /// <summary>
+        /// 是否是等待购买的攻击塔位.
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        bool isWaitBuyGrid(int x, int y);
 
-		void startCoinGenMode();
+        void startCoinGenMode();
 
-		/// <summary>
-		/// 购买对应的待购攻击塔位.
-		/// </summary>
-		/// <param name="x"></param>
-		/// <param name="y"></param>
-		/// <returns></returns>
-		bool buyWaitBuyGrid(int x, int y);
+        /// <summary>
+        /// 购买对应的待购攻击塔位.
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        bool buyWaitBuyGrid(int x, int y);
 
-		/// <summary>
-		/// 设置某一个格子为已破坏塔位。
-		/// </summary>
-		/// <param name="x"></param>
-		/// <param name="y"></param>
-		/// <returns></returns>
-		bool SetDestroyedGrid(int x, int y );
+        /// <summary>
+        /// 设置某一个格子为已破坏塔位。
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        bool SetDestroyedGrid(int x, int y);
 
-		/// <summary>
-		/// 设置格子为合成状态。
-		/// </summary>
-		/// <param name="x"></param>
-		/// <param name="y"></param>
-		/// <returns></returns>
-		bool SetComboGrid(int x, int y);
+        /// <summary>
+        /// 设置格子为合成状态。
+        /// </summary>
+        /// <param name="x"></param>
+        /// <param name="y"></param>
+        /// <returns></returns>
+        bool SetComboGrid(int x, int y);
 
-		/// <summary>
-		/// 设置塔位的血条血量数据
-		/// </summary>
-		/// <param name="ix"></param>
-		/// <param name="health"></param>
-		void setTowerPosHealth(int ix, float health);
+        /// <summary>
+        /// 设置塔位的血条血量数据
+        /// </summary>
+        /// <param name="ix"></param>
+        /// <param name="health"></param>
+        void setTowerPosHealth(int ix, float health);
 
-		/// <summary>
-		/// Calculates the grid position from a given world position, offset to center for a specific size object
-		/// </summary>
-		IntVector2 WorldToGrid(Vector3 worldPosition, IntVector2 sizeOffset);
+        /// <summary>
+        /// Calculates the grid position from a given world position, offset to center for a specific size object
+        /// </summary>
+        IntVector2 WorldToGrid(Vector3 worldPosition, IntVector2 sizeOffset);
 
-		/// <summary>
-		/// Calculates the snapped world position from a given grid position
-		/// </summary>
-		Vector3 GridToWorld(IntVector2 gridPosition, IntVector2 sizeOffset);
+        /// <summary>
+        /// Calculates the snapped world position from a given grid position
+        /// </summary>
+        Vector3 GridToWorld(IntVector2 gridPosition, IntVector2 sizeOffset);
 
-		/// <summary>
-		/// 当前是否是反方的TowerPlacementGrid.
-		/// </summary>
-		bool isOpponent();
+        /// <summary>
+        /// 当前是否是反方的TowerPlacementGrid.
+        /// </summary>
+        bool isOpponent();
 
 
-		/// <summary>
-		/// Gets whether an object of a given size would fit on this grid at the given location
-		/// </summary>
-		/// <param name="gridPos">The grid location</param>
-		/// <param name="size">The size of the item</param>
-		/// <returns>True if the item would fit at <paramref name="gridPos"/></returns>
-		TowerFitStatus Fits(IntVector2 gridPos, IntVector2 size);
+        /// <summary>
+        /// Gets whether an object of a given size would fit on this grid at the given location
+        /// </summary>
+        /// <param name="gridPos">The grid location</param>
+        /// <param name="size">The size of the item</param>
+        /// <returns>True if the item would fit at <paramref name="gridPos"/></returns>
+        TowerFitStatus Fits(IntVector2 gridPos, IntVector2 size);
 
-		/// <summary>
-		/// Occupy the given space on this placement area
-		/// </summary>
-		/// <param name="gridPos">The grid location</param>
-		/// <param name="size">The size of the item</param>
-		void Occupy(IntVector2 gridPos, IntVector2 size);
+        /// <summary>
+        /// Occupy the given space on this placement area
+        /// </summary>
+        /// <param name="gridPos">The grid location</param>
+        /// <param name="size">The size of the item</param>
+        void Occupy(IntVector2 gridPos, IntVector2 size);
 
-		/// <summary>
-		/// Clear the given space on this placement area
-		/// </summary>
-		/// <param name="gridPos">The grid location</param>
-		/// <param name="size">The size of the item</param>
-		void Clear(IntVector2 gridPos, IntVector2 size);
-	}
+        /// <summary>
+        /// Clear the given space on this placement area
+        /// </summary>
+        /// <param name="gridPos">The grid location</param>
+        /// <param name="size">The size of the item</param>
+        void Clear(IntVector2 gridPos, IntVector2 size);
+    }
 
-	public static class PlacementAreaExtensions
-	{
-		/// <summary>
-		/// Snaps a given world positionn to this grid
-		/// </summary>
-		public static Vector3 Snap(this IPlacementArea placementArea, Vector3 worldPosition, IntVector2 sizeOffset)
-		{
-			// Calculate the nearest grid location and then change that back to world space
-			return placementArea.GridToWorld(placementArea.WorldToGrid(worldPosition, sizeOffset), sizeOffset);
-		}
-	}
+    public static class PlacementAreaExtensions
+    {
+        /// <summary>
+        /// Snaps a given world positionn to this grid
+        /// </summary>
+        public static Vector3 Snap(this IPlacementArea placementArea, Vector3 worldPosition, IntVector2 sizeOffset)
+        {
+            // Calculate the nearest grid location and then change that back to world space
+            return placementArea.GridToWorld(placementArea.WorldToGrid(worldPosition, sizeOffset), sizeOffset);
+        }
+    }
 }
\ No newline at end of file
diff --git a/Assets/Scripts/TowerDefense/Towers/Placement/SingleTowerPlacementArea.cs b/Assets/Scripts/TowerDefense/Towers/Placement/SingleTowerPlacementArea.cs
index 55030f5..231fbf5 100644
--- a/Assets/Scripts/TowerDefense/Towers/Placement/SingleTowerPlacementArea.cs
+++ b/Assets/Scripts/TowerDefense/Towers/Placement/SingleTowerPlacementArea.cs
@@ -76,7 +76,7 @@
 		/// </summary>
 		/// <param name="x"></param>
 		/// <returns></returns>
-		public BulletUICtl GetBulletUICtl(int x)
+		public BulletUICtl GetBulletUICtl(int x, int y)
 		{
 			return null;
 		}
@@ -87,7 +87,7 @@
 		/// </summary>
 		/// <param name="x"></param>
 		/// <returns></returns>
-		public EnergyUICtl GetEnergyUICtl(int x)
+		public EnergyUICtl GetEnergyUICtl(int x, int y)
         {
 			return null;
         }
diff --git a/Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGrid.cs b/Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGrid.cs
index 3e75b17..a9a7c87 100644
--- a/Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGrid.cs
+++ b/Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGrid.cs
@@ -176,7 +176,7 @@
         /// </summary>
         /// <param name="x"></param>
         /// <returns></returns>
-        public BulletUICtl GetBulletUICtl(int x)
+        public BulletUICtl GetBulletUICtl(int x, int y)
         {
             return this.arrTowerBulletUi[x];
         }
@@ -186,7 +186,7 @@
         /// </summary>
         /// <param name="x"></param>
         /// <returns></returns>
-        public EnergyUICtl GetEnergyUICtl(int x)
+        public EnergyUICtl GetEnergyUICtl(int x, int y)
         {
             return this.arrTowerEnergyUi[x];
         }
@@ -768,7 +768,7 @@
                 img.transform.SetAsFirstSibling();
                 EnergyUICtl euc = img.GetComponent<EnergyUICtl>();
                 arrTowerEnergyUi[x] = euc;
-                euc.gameObject.SetActive(false);
+                // euc.gameObject.SetActive(false);
             }
 
             return;
diff --git a/Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGridEndless.cs b/Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGridEndless.cs
index 2376cf0..c2fed45 100644
--- a/Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGridEndless.cs
+++ b/Assets/Scripts/TowerDefense/Towers/Placement/TowerPlacementGridEndless.cs
@@ -106,6 +106,26 @@
         public int AttackRowNumbers { get; } = 2;
 
         /// <summary>
+        /// 攻击塔位对应的子弹UI位置信息.
+        /// </summary>
+        private Vector2[,] m_arrTowerBulletUIPos;
+
+        private BulletUICtl[,] arrTowerBulletUi;
+
+        private EnergyUICtl[,] arrTowerEnergyUi;
+
+        /// <summary>
+        /// 此位置上塔对应的子弹充能Prefab.塔放置到当前的塔位后,如果是对应的塔防类型,需要把
+        /// 相应的界面指针传到塔防的数据结构内。
+        /// </summary>
+        public GameObject towerBulletUIPrefab;
+
+        /// <summary>
+        /// 充能条对应的界面
+        /// </summary>
+        public GameObject towerEnergyUIPrefab;
+
+        /// <summary>
         /// Converts a location in world space into local grid coordinates.
         /// </summary>
         /// <param name="worldLocation"><see cref="Vector3"/> indicating world space coordinates to convert.</param>
@@ -147,9 +167,9 @@
 		/// </summary>
 		/// <param name="x"></param>
 		/// <returns></returns>
-		public BulletUICtl GetBulletUICtl(int x)
+		public BulletUICtl GetBulletUICtl(int x, int y)
         {
-            return null;
+            return arrTowerBulletUi[x, 3 - y];
         }
 
         /// <summary>
@@ -157,9 +177,9 @@
         /// </summary>
         /// <param name="x"></param>
         /// <returns></returns>
-        public EnergyUICtl GetEnergyUICtl(int x)
+        public EnergyUICtl GetEnergyUICtl(int x, int y)
         {
-            return null;
+            return arrTowerEnergyUi[x, 3 - y];
         }
 
 
@@ -618,12 +638,19 @@
             arrTowerBloodUi = new TowerBloodVis[dimensions.x, AttackRowNumbers];
             int dy = dimensions.y - 1;
 
+            // 处理攻击塔位对应的血条
+            m_arrTowerBulletUIPos = new Vector2[dimensions.x, AttackRowNumbers];
+            arrTowerBulletUi = new BulletUICtl[dimensions.x, AttackRowNumbers];
+            arrTowerEnergyUi = new EnergyUICtl[dimensions.x, AttackRowNumbers];
+
             for (int x = 0; x < dimensions.x; x++)
             {
                 for (int y = 0; y < AttackRowNumbers; ++y)
                 {
                     m_arrTowerBloodUIPos[x, y].x = arrGridCentPos[x, dy - y].x;
                     m_arrTowerBloodUIPos[x, y].y = arrGridCentPos[x, dy - y].y;
+                    m_arrTowerBulletUIPos[x, y].x = arrGridCentPos[x, dy - y].x;
+                    m_arrTowerBulletUIPos[x, y].y = arrGridCentPos[x, dy - y].y;
 
                     GameObject img = Instantiate(towerBloodUIPrefab);
                     GameObject container = GameObject.Find("BuyButtonContainer");
@@ -631,7 +658,7 @@
                     Vector3 tpos = img.transform.position;
                     tpos.x = m_arrTowerBloodUIPos[x, y].x;
                     tpos.z = m_arrTowerBloodUIPos[x, y].y + 4.2f - y * 1.66f;
-                    tpos.y = 30;
+                    tpos.y = 30f;
                     img.transform.position = tpos;
                     img.transform.localScale = Vector3.one;
                     img.transform.localRotation = Quaternion.identity;
@@ -639,6 +666,35 @@
                     TowerBloodVis tbv = img.GetComponent<TowerBloodVis>();
                     arrTowerBloodUi[x, y] = tbv;
                     tbv.gameObject.SetActive(false);
+
+                    img = Instantiate(towerBulletUIPrefab);
+                    img.transform.SetParent(container.transform, true);
+                    tpos = img.transform.position;
+                    tpos.x = m_arrTowerBulletUIPos[x, y].x + 4.2f;
+                    tpos.z = m_arrTowerBulletUIPos[x, y].y + 1.1f -  y * 1.66f;
+                    tpos.y = 30f;
+                    img.transform.position = tpos;
+                    img.transform.localScale = Vector3.one;
+                    img.transform.localRotation = Quaternion.identity;
+
+                    BulletUICtl buc = img.GetComponent<BulletUICtl>();
+                    arrTowerBulletUi[x, y] = buc;
+                    buc.gameObject.SetActive(false);
+
+                    // 把充能条也创建出来了.
+                    img = Instantiate(towerEnergyUIPrefab);
+                    img.transform.SetParent(container.transform);
+                    tpos = img.transform.position;
+                    tpos.x = m_arrTowerBulletUIPos[x, y].x + 4.2f;
+                    tpos.z = m_arrTowerBulletUIPos[x, y].y + 1.1f - y * 1.66f;
+                    tpos.y = 30f;
+                    img.transform.position = tpos;
+                    img.transform.localScale = Vector3.one;
+                    img.transform.localRotation = Quaternion.identity;
+
+                    EnergyUICtl euc = img.GetComponent<EnergyUICtl>();
+                    arrTowerEnergyUi[x, y] = euc;
+                    euc.gameObject.SetActive(false);
                 }
             }
         }
diff --git a/Assets/Scripts/TowerDefense/Towers/Tower.cs b/Assets/Scripts/TowerDefense/Towers/Tower.cs
index 3709139..2c836dd 100644
--- a/Assets/Scripts/TowerDefense/Towers/Tower.cs
+++ b/Assets/Scripts/TowerDefense/Towers/Tower.cs
@@ -140,7 +140,7 @@
         {
             if (!materialTowerAttackSelf) return;
 
-            if( opponentSide)
+            if (opponentSide)
             {
                 if (attack && (this.curActionState != 2))
                 {
@@ -150,7 +150,7 @@
 
                 if ((!attack) && (this.curActionState != 1))
                 {
-                    currentTowerLevel.SetTowerMonsterMat( materialTowerWaitOppo );
+                    currentTowerLevel.SetTowerMonsterMat(materialTowerWaitOppo);
                     this.curActionState = 1;
                 }
             }
@@ -224,9 +224,8 @@
 
         protected void OnTowerUICtrl()
         {
-            // 
             // 根据是否是子弹塔防来决定是否显示相应的界面
-            BulletUICtl buc = this.placementArea.GetBulletUICtl(gridPosition.x);
+            BulletUICtl buc = this.placementArea.GetBulletUICtl(gridPosition.x, gridPosition.y);
 
             if (buc == null) return;
 
@@ -245,8 +244,8 @@
             }
 
             // 根据是否是能量充能来决定是否显示相应的界面.
-            EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x);
-            if( (eTowerFuntion == ETowerFuntion.ENERGY) &&(euc != null ))
+            EnergyUICtl euc = placementArea.GetEnergyUICtl(gridPosition.x, gridPosition.y);
+            if ((eTowerFuntion == ETowerFuntion.ENERGY) && (euc != null))
             {
                 // 设置数据
                 euc.gameObject.SetActive(true);
diff --git a/Assets/Scripts/TowerDefense/UI/EndlessTowerGridOpen.cs b/Assets/Scripts/TowerDefense/UI/EndlessTowerGridOpen.cs
index 38543b2..7a663da 100644
--- a/Assets/Scripts/TowerDefense/UI/EndlessTowerGridOpen.cs
+++ b/Assets/Scripts/TowerDefense/UI/EndlessTowerGridOpen.cs
@@ -52,6 +52,14 @@
     {
         if (bWaitOpen) return;
 
+        if (GameConfig.IsNewbie)
+        {
+            if (!GameConfig.CanOpenNewTower) return;
+
+            EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.GetOneTowerPos);
+        }
+
+
         if (towerGrid != null)
         {
             float cashToOpen = TowerPlacementGridEndless.GRID_OPENCASH;
diff --git a/Assets/Scripts/TowerDefense/UI/EndlessUIStart.cs b/Assets/Scripts/TowerDefense/UI/EndlessUIStart.cs
index ca518d0..ba0b749 100644
--- a/Assets/Scripts/TowerDefense/UI/EndlessUIStart.cs
+++ b/Assets/Scripts/TowerDefense/UI/EndlessUIStart.cs
@@ -1,4 +1,5 @@
-using Core.Utilities;
+using TowerDefense.Towers;
+using Core.Utilities;
 using System;
 using TMPro;
 using UnityEngine;
@@ -6,6 +7,7 @@
 using MoreMountains.NiceVibrations;
 using TowerDefense.Level;
 using KTGMGemClient;
+using TowerDefense.UI.HUD;
 
 /// <summary>
 /// 无尽模式用自己的EndlessUIStart
@@ -63,25 +65,89 @@
 
         //查询是否已经做过了新手引导
         int guide = PlayerPrefs.GetInt("GemBattleGuide");
-        // if (guide == 0)
-        // {
-        //     Debug.Log("需要进行新手引导");
-        //     Pause();
+        GameConfig.IsNewbie = guide == 0;
 
-        //     uiStartMssk.gameObject.SetActive(false);
-        //     countDownTextNew.text = "";
-        //     countDownTextNew.gameObject.SetActive(false);
+        if (guide == 0)
+        {
+            Pause();
+            uiStartMssk.gameObject.SetActive(false);
+            countDownTextNew.text = "";
+            countDownTextNew.gameObject.SetActive(false);
 
-        //     Instantiate(Resources.Load<GameObject>("UI/Guide/GuidePanel"), this.transform);
-        //     //bGameStart = true;
-        //     // 开始关卡
-        //     //EndlessLevelManager.instance.StartLevel();
-        //     //timeTextNew.gameObject.SetActive(true);
+            Instantiate(Resources.Load<GameObject>("UI/Guide/GuidePanel"), this.transform);
+            AddGuideEvent();
+            //bGameStart = true;
+            // 开始关卡
+            //EndlessLevelManager.instance.StartLevel();
+            //timeTextNew.gameObject.SetActive(true);
 
-        //     // 开始播放背景音乐.
-        //     // if (bgMusic != null)
-        //     //     bgMusic.Play();
-        // }
+            // 开始播放背景音乐.
+            // if (bgMusic != null)
+            //     bgMusic.Play();
+        }
+    }
+
+    /// <summary>
+    /// 添加新手引导事件
+    /// </summary>
+    private void AddGuideEvent()
+    {
+        EventCenter.Ins.Add((int)KTGMGemClient.EventType.CreateFireLv2, CreateFireLv2);
+        EventCenter.Ins.Add((int)KTGMGemClient.EventType.CreateFirstWave, CreateFirstWave);
+        EventCenter.Ins.Add((int)KTGMGemClient.EventType.RestartWave, RestartWave);
+        EventCenter.Ins.Add<int>((int)KTGMGemClient.EventType.AddGold, AddGold);
+        EventCenter.Ins.Add((int)KTGMGemClient.EventType.CreateWaterLv1, CreateWaterLv1);
+        EventCenter.Ins.Add((int)KTGMGemClient.EventType.CreateSecondWave, CreateSecondWave);
+        EventCenter.Ins.Add((int)KTGMGemClient.EventType.SkillRelease, SkillRelease);
+    }
+
+    /// <summary>
+    /// 在(2,3)位置放置一个火元素的塔
+    /// </summary>
+    private void CreateFireLv2()
+    {
+        Tower aTower = EndlessRandomTower.instance.getTowerByName("GrowUpTower");
+        EndlessGameUI.instance.PlaceTowerForce(aTower, new IntVector2(2, 3), 2);
+    }
+
+    private void CreateFirstWave()
+    {
+        Restart();
+        EventCenter.Ins.Add((int)KTGMGemClient.EventType.FireTowerChargeEnd, OnFireTowerChargeEnd);
+    }
+
+    private void OnFireTowerChargeEnd()
+    {
+        Pause();
+        EndlessLevelManager.instance.PauseWave();
+        EventCenter.Ins.Remove((int)KTGMGemClient.EventType.FireTowerChargeEnd, OnFireTowerChargeEnd);
+        EventCenter.Ins.BroadCast((int)KTGMGemClient.EventType.ChargingEnd);
+    }
+
+    private void RestartWave()
+    {
+        Restart();
+        EndlessLevelManager.instance.RestartWave();
+    }
+
+    private void AddGold(int gold)
+    {
+        EndlessLevelManager.instance.Currency.AddCurrency(gold);
+    }
+
+    private void CreateWaterLv1()
+    {
+        Tower aTower = EndlessRandomTower.instance.getTowerByName("CopyCatTower");
+        EndlessGameUI.instance.PlaceTowerForce(aTower, new IntVector2(1, 3), 1);
+    }
+
+    private void CreateSecondWave()
+    {
+
+    }
+
+    private void SkillRelease()
+    {
 
     }
 
@@ -149,66 +215,85 @@
             timeTextNew.text = ConvertTime((float)Math.Ceiling(startTime));
         }
 
-        if (!bFirstLoaded && !bGameStart)
+        if (!GameConfig.IsNewbie)
         {
-            bFirstLoaded = true;
-            secToDo = 4;
+            if (!bFirstLoaded && !bGameStart)
+            {
+                bFirstLoaded = true;
+                secToDo = 4;
+            }
+
+            if (bFirstLoaded && !bGameStart)
+            {
+                secToDo -= Time.deltaTime;
+                countDownTextNew.gameObject.SetActive(true);
+
+                if (secToDo >= 3)
+                {
+                    countDownTextNew.text = "3";
+                    if (!bVibrate[3])
+                    {
+                        bVibrate[3] = true;
+                        MMVibrationManager.Haptic(HapticTypes.SoftImpact);
+                    }
+                }
+                else if (secToDo >= 2)
+                {
+                    countDownTextNew.text = "2";
+                    if (!bVibrate[2])
+                    {
+                        bVibrate[2] = true;
+                        MMVibrationManager.Haptic(HapticTypes.MediumImpact);
+                    }
+                }
+                else if (secToDo >= 1)
+                {
+                    countDownTextNew.text = "1";
+                    if (!bVibrate[1])
+                    {
+                        bVibrate[1] = true;
+                        MMVibrationManager.Haptic(HapticTypes.HeavyImpact);
+                    }
+                }
+                else if (secToDo < 1)
+                {
+                    countDownTextNew.text = "GO!";
+                    if (!bVibrate[0])
+                    {
+                        bVibrate[0] = true;
+                        MMVibrationManager.Haptic(HapticTypes.HeavyImpact);
+                    }
+                }
+
+                // 开启游戏,且隐藏中间的数字.
+                if (secToDo <= 0)
+                {
+                    uiStartMssk.gameObject.SetActive(false);
+                    countDownTextNew.text = "";
+                    countDownTextNew.gameObject.SetActive(false);
+                    bGameStart = true;
+                    // 开始关卡
+                    EndlessLevelManager.instance.StartLevel();
+                    timeTextNew.gameObject.SetActive(true);
+
+                    // 开始播放背景音乐.
+                    if (bgMusic != null)
+                        bgMusic.Play();
+                }
+            }
         }
-
-        if (bFirstLoaded && !bGameStart)
+        else
         {
-            secToDo -= Time.deltaTime;
-            countDownTextNew.gameObject.SetActive(true);
+            // 新手走的流程
+            if (!bFirstLoaded && !bGameStart)
+                bFirstLoaded = true;
 
-            if (secToDo >= 3)
+            if (bFirstLoaded && !bGameStart)
             {
-                countDownTextNew.text = "3";
-                if (!bVibrate[3])
-                {
-                    bVibrate[3] = true;
-                    MMVibrationManager.Haptic(HapticTypes.SoftImpact);
-                }
-            }
-            else if (secToDo >= 2)
-            {
-                countDownTextNew.text = "2";
-                if (!bVibrate[2])
-                {
-                    bVibrate[2] = true;
-                    MMVibrationManager.Haptic(HapticTypes.MediumImpact);
-                }
-            }
-            else if (secToDo >= 1)
-            {
-                countDownTextNew.text = "1";
-                if (!bVibrate[1])
-                {
-                    bVibrate[1] = true;
-                    MMVibrationManager.Haptic(HapticTypes.HeavyImpact);
-                }
-            }
-            else if (secToDo < 1)
-            {
-                countDownTextNew.text = "GO!";
-                if (!bVibrate[0])
-                {
-                    bVibrate[0] = true;
-                    MMVibrationManager.Haptic(HapticTypes.HeavyImpact);
-                }
-            }
-
-            // 开启游戏,且隐藏中间的数字.
-            if (secToDo <= 0)
-            {
-                uiStartMssk.gameObject.SetActive(false);
-                countDownTextNew.text = "";
-                countDownTextNew.gameObject.SetActive(false);
                 bGameStart = true;
-                // 开始关卡
                 EndlessLevelManager.instance.StartLevel();
                 timeTextNew.gameObject.SetActive(true);
 
-                // 开始播放背景音乐.
                 if (bgMusic != null)
                     bgMusic.Play();
             }
diff --git a/Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs b/Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs
index 6644d77..0dfc835 100644
--- a/Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs
+++ b/Assets/Scripts/TowerDefense/UI/HUD/EndlessGameUI.cs
@@ -14,6 +14,7 @@
 using UnityEngine.EventSystems;
 using UnityEngine.UI;
 using TowerDefense.Nodes;
+using TowerDefense.Affectors;
 
 namespace TowerDefense.UI.HUD
 {
@@ -284,6 +285,18 @@
         public bool towerInList(Tower t)
         {
             return m_listTower.Contains(t);
+        }
+
+        /// <summary>
+        /// 设置已经上阵的所有塔的攻击状态,是否可以攻击
+        /// </summary>
+        /// <param name="canAttack"></param>
+        public void SetAttackingTowerState(bool canAttack)
+        {
+            foreach (Tower tower in m_listTower)
+            {
+                tower.bInAttackMode = canAttack;
+            }
         }
 
         public void delTower(Tower t)
@@ -801,6 +814,25 @@
                 CancelPlaceTower(pointerInfo);
         }
 
+        /// <summary>
+        /// 强制放置塔,主要是用于新手
+        /// </summary>
+        /// <param name="newTower"></param>
+        /// <param name="pos"></param>
+        /// <param name="level">塔的等级</param>
+        public void PlaceTowerForce(Tower newTower, IntVector2 pos, int level)
+        {
+            TowerPlacementGhost currentTower = Instantiate(newTower.towerGhostPrefab);
+            currentTower.Initialize(newTower);
+            Tower controller = currentTower.controller;
+            Tower createdTower = Instantiate(controller);
+            createdTower.Initialize(m_CurrentArea, pos);
+            createdTower.SetLevel(level - 1);
+
+            addTower(createdTower);
+            Destroy(currentTower.gameObject);
+        }
+
         protected bool SkillPlayEndDrag(PointerInfo pointer)
         {
             // 我操,终于可以了!ATTENTION TO OPP:
diff --git a/Assets/Scripts/TowerDefense/UI/HUD/EndlessRandomTower.cs b/Assets/Scripts/TowerDefense/UI/HUD/EndlessRandomTower.cs
index 35e5645..428c776 100644
--- a/Assets/Scripts/TowerDefense/UI/HUD/EndlessRandomTower.cs
+++ b/Assets/Scripts/TowerDefense/UI/HUD/EndlessRandomTower.cs
@@ -282,6 +282,8 @@
     /// </summary>
     public void onClick()
     {
+        if (GameConfig.IsNewbie && !GameConfig.CanBuyNewTower) return;
+
         // 还没到技能时间,忽略掉技能宝石
         Tower newTower = GetRandomTower(EndlessUIStart.instance.GameStartTime <= SKILL_TOWER_TIME);
 
@@ -295,7 +297,7 @@
     /// 随机找一个空白位置放置塔防
     /// </summary>
     /// <param name="tower"></param>
-    public bool RandomPlaceTower(Tower tower, int level = -1, int cost = -1)
+    public bool RandomPlaceTower(Tower tower, int level = -1, int cost = -1, int posx = - 1, int posy = -1)
     {
         EndlessGameUI gameUI = EndlessGameUI.instance;
 
@@ -303,9 +305,9 @@
             gameUI.CancelGhostPlacement();
 
         if (EndlessUIStart.instance.GameStartTime >= LEVELUP_TOWER_TIME)
-            return gameUI.RandomPlaceTower(tower, -1, -1, level == -1 ? 1 : level, cost);
+            return gameUI.RandomPlaceTower(tower, posx, posy, level == -1 ? 1 : level, cost);
         else
-            return gameUI.RandomPlaceTower(tower, -1, -1, level == -1 ? 0 : level, cost);
+            return gameUI.RandomPlaceTower(tower, posx, posy, level == -1 ? 0 : level, cost);
     }
 
     /// <summary>
diff --git a/Assets/StreamingAssets/Table/battle.json b/Assets/StreamingAssets/Table/battle.json
index a521429..f1ee002 100644
--- a/Assets/StreamingAssets/Table/battle.json
+++ b/Assets/StreamingAssets/Table/battle.json
@@ -1 +1 @@
-[[1,"skilltime",30,[],"","生成技能宝石的时间(秒)"],[2,"initialgold",100,[],"","战斗内初始金币"],[3,"doublegem",180,[],"","购买宝石直接获得2级宝石的时间(秒)"],[4,"initialmoney",5000,[],"","初始金币"],[5,"initialgems","",["101:1:100","102:3:200","103:6:200","104:9:200","105:1:200","106:3:200","107:9:200","109:1:200"],"","宝石id:等级:个数 三个一组,每组用逗号分隔"],[6,"initialdeck","",["101","102","103","105","109"],"","上阵的宝石id列表.必须是初始宝石里面的"],[7,"buildtime",10,[],"","解锁塔位所需时间(秒)"],[8,"gemcountdown",10,[],"","购买获得2级宝石倒计时(秒)"],[9,"skillchance",20,[],"","购买获得技能宝石的概率(百分比)"],[10,"changenameprice",100,[],"","非首次改名的花费(100钻石)"],[11,"gemlevelup",30,[],"","塔防区宝石升级时变换类型的概率"],[12,"familymaxcount",50,[],"","工会最大人数"],[13,"scoreShopRefreshTime",7,[],"","工会积分商城刷新时间7天,从创建开始算"],[14,"SpeedUpFrist","",["180:0.75:1.5"],"","第一次提速时间,间隔倍率,移速倍率"],[15,"SpeedUpSecond","",["300:0.5:2"],"","第二次提速时间,间隔倍率,移速倍率"],[16,"donateShopRefreshTime",7,[],"","工会捐赠商城刷新时间7天,从创建开始算"],[17,"guildRankRequest","",["0","300","600","900","1200","1500","1800","2100","2400","2700","3000"],"","加入公会的排位分数限制(超过该值才能进入)"],[18,"guildNameDay",7,[],"","修改公会名:间隔7天1次"],[19,"guildNameCost",500,[],"","修改公会名:每次花费500金币(money)"],[20,"guildicon",30,[],"","修改公会图标:间隔30天1次"],[21,"guildCreateMinLevel",5,[],"","工会创建最小等级"]]
\ No newline at end of file
+[[1,"skilltime",30,[],"","生成技能宝石的时间(秒)"],[2,"initialgold",100,[],"","战斗内初始金币"],[3,"doublegem",180,[],"","购买宝石直接获得2级宝石的时间(秒)"],[4,"initialmoney",5000,[],"","初始金币"],[5,"initialgems","",["101:1:100","102:3:200","103:6:200","104:9:200","105:1:200","106:3:200","107:9:200","109:1:200"],"","宝石id:等级:个数 三个一组,每组用逗号分隔"],[6,"initialdeck","",["101","102","103","105","109"],"","上阵的宝石id列表.必须是初始宝石里面的"],[7,"buildtime",0,[],"","解锁塔位所需时间(秒)"],[8,"gemcountdown",10,[],"","购买获得2级宝石倒计时(秒)"],[9,"skillchance",20,[],"","购买获得技能宝石的概率(百分比)"],[10,"changenameprice",100,[],"","非首次改名的花费(100钻石)"],[11,"gemlevelup",30,[],"","塔防区宝石升级时变换类型的概率"],[12,"familymaxcount",50,[],"","工会最大人数"],[13,"scoreShopRefreshTime",7,[],"","工会积分商城刷新时间7天,从创建开始算"],[14,"SpeedUpFrist","",["180:0.75:1.5"],"","第一次提速时间,间隔倍率,移速倍率"],[15,"SpeedUpSecond","",["300:0.5:2"],"","第二次提速时间,间隔倍率,移速倍率"],[16,"donateShopRefreshTime",7,[],"","工会捐赠商城刷新时间7天,从创建开始算"],[17,"guildRankRequest","",["0","300","600","900","1200","1500","1800","2100","2400","2700","3000"],"","加入公会的排位分数限制(超过该值才能进入)"],[18,"guildNameDay",7,[],"","修改公会名:间隔7天1次"],[19,"guildNameCost",500,[],"","修改公会名:每次花费500金币(money)"],[20,"guildicon",30,[],"","修改公会图标:间隔30天1次"],[21,"guildCreateMinLevel",5,[],"","工会创建最小等级"]]
\ No newline at end of file
diff --git a/Assets/StreamingAssets/Table/donaterule.json b/Assets/StreamingAssets/Table/donaterule.json
new file mode 100644
index 0000000..b5b7a05
--- /dev/null
+++ b/Assets/StreamingAssets/Table/donaterule.json
@@ -0,0 +1 @@
+[[1,[1,2,3],["10:1","1:2"],["2:1","1:2"]],[2,[4,5,6],["20:1","2:2"],["4:1","1:2"]],[3,[7,8,9],["30:1","3:2"],["6:1","2:2"]],[4,[10,11,12,13],["40:1","4:2"],["8:1","2:2"]]]
\ No newline at end of file
diff --git a/Assets/StreamingAssets/Table/donaterule.json.meta b/Assets/StreamingAssets/Table/donaterule.json.meta
new file mode 100644
index 0000000..a3de763
--- /dev/null
+++ b/Assets/StreamingAssets/Table/donaterule.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 92ca1981883b916439a7239e6e562e5c
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/StreamingAssets/Table/endless_teachport.json b/Assets/StreamingAssets/Table/endless_teachport.json
new file mode 100644
index 0000000..1cf3390
--- /dev/null
+++ b/Assets/StreamingAssets/Table/endless_teachport.json
@@ -0,0 +1 @@
+[[1,1,"史莱姆大王",1,1,1,0,0,0,200,1.5,2,3000,["0"],[0],0],[2,1,"史莱姆大王",1,1,2,0,0,0,200,1.5,2,3000,["0"],[0],0],[3,1,"史莱姆大王",1,1,3,1,10,1800,200,1.5,2,3000,["0"],[0],1],[4,1,"史莱姆大王",1,1,4,0,0,0,200,1.5,2,3000,["0"],[0],0],[5,1,"史莱姆大王",1,1,5,0,0,0,200,1.5,2,3000,["0"],[0],0],[6,1,"史莱姆大王",1,2,1,0,0,0,350,1.5,2,3000,["0"],[0],0],[7,1,"史莱姆大王",1,2,2,0,0,0,350,1.5,2,3000,["0"],[0],0],[8,1,"史莱姆大王",1,2,3,3,6,3000,350,1.5,2,3000,["0"],[0],3],[9,1,"史莱姆大王",1,2,4,0,0,0,350,1.5,2,3000,["0"],[0],0],[10,1,"史莱姆大王",1,2,5,0,0,0,350,1.5,2,3000,["0"],[0],0]]
\ No newline at end of file
diff --git a/Assets/StreamingAssets/Table/endless_teachport.json.meta b/Assets/StreamingAssets/Table/endless_teachport.json.meta
new file mode 100644
index 0000000..dc23311
--- /dev/null
+++ b/Assets/StreamingAssets/Table/endless_teachport.json.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 557946068ebd0464e88cf9958a2485d9
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.9.1