hw 3 months ago
parent
commit
cf1d2ee40a
100 changed files with 2466 additions and 1828 deletions
  1. 22 0
      sr/.gitignore
  2. 12 6
      sr/_proto/battle.proto
  3. 4 2
      sr/_proto/equip.json
  4. 0 2
      sr/_proto/hero.proto
  5. 9 2
      sr/_proto/league.json
  6. 12 0
      sr/_proto/league.proto
  7. 16 1
      sr/_proto/map.json
  8. 49 17
      sr/_proto/map.proto
  9. BIN
      sr/docs/git-flow/xy3-git-cn.docx
  10. 0 744
      sr/docs/git-flow/版本流程.md
  11. 1 1
      sr/etc/data/area.json
  12. 6 6
      sr/etc/data/arm_level.json
  13. 18 18
      sr/etc/data/arm_type.json
  14. 12 2
      sr/etc/data/const.json
  15. 121 1
      sr/etc/data/drop_pool.json
  16. 132 132
      sr/etc/data/equip.json
  17. 162 135
      sr/etc/data/equip_attr_extra.json
  18. 13 2
      sr/etc/data/game_debug.json
  19. 1 1
      sr/etc/data/gm.json
  20. 30 30
      sr/etc/data/hero.json
  21. 36 5
      sr/etc/data/item.json
  22. 2 1
      sr/etc/data/item_chest.json
  23. 2 1
      sr/etc/data/league_log.json
  24. 0 1
      sr/etc/data/map_build.json
  25. 95 95
      sr/etc/data/map_build_upgrade.json
  26. 0 0
      sr/etc/data/map_castle.json
  27. 3 1
      sr/etc/data/map_id.json
  28. 36 20
      sr/etc/data/map_res.json
  29. 31 1
      sr/etc/data/proto_route.json
  30. 1 1
      sr/etc/data/rank.json
  31. 3 3
      sr/etc/data/shop_goods.json
  32. 50 0
      sr/etc/data/skill.json
  33. 50 0
      sr/etc/data/skill_level.json
  34. 63 1
      sr/etc/data/skill_pool.json
  35. 1 1
      sr/etc/data_embed/area.json
  36. 4 1
      sr/etc/data_embed/game_debug.json
  37. 67 9
      sr/etc/inner_pb/actor.proto
  38. 1 1
      sr/etc/profile/lcs.json
  39. 1 1
      sr/go.mod
  40. 2 2
      sr/go.sum
  41. 2 3
      sr/internal/actor_remote/map_player.go
  42. 21 12
      sr/internal/battle/battle.go
  43. 1 0
      sr/internal/code/status_code.go
  44. 3 5
      sr/internal/component/db/queue/table_queue.go
  45. 2 0
      sr/internal/constant/mail.go
  46. 45 9
      sr/internal/constant/map.go
  47. 20 17
      sr/internal/constant/test.go
  48. 9 1
      sr/internal/constant/time.go
  49. 21 2
      sr/internal/data/arm_level.go
  50. 10 0
      sr/internal/data/const.go
  51. 64 2
      sr/internal/data/extend_const.go
  52. 9 0
      sr/internal/data/extend_facility_level.go
  53. 5 0
      sr/internal/data/extend_map_build.go
  54. 5 0
      sr/internal/data/extend_map_castle.go
  55. 27 0
      sr/internal/data/extend_map_id.go
  56. 22 19
      sr/internal/data/hero.go
  57. 1 0
      sr/internal/data/map_build.go
  58. 7 6
      sr/internal/data/map_build_upgrade.go
  59. 20 2
      sr/internal/data/map_id.go
  60. 17 2
      sr/internal/enum/item.go
  61. 37 30
      sr/internal/enum/league.go
  62. 56 18
      sr/internal/enum/map.go
  63. 1 1
      sr/internal/enum/scout.go
  64. 17 11
      sr/internal/event/league_castle_update.go
  65. 8 3
      sr/internal/event/player_castle_success.go
  66. 17 0
      sr/internal/event/vip_status.go
  67. 33 0
      sr/internal/extend/math/math.go
  68. 18 0
      sr/internal/extend/math/math_test.go
  69. 7 6
      sr/internal/name/actor/map.go
  70. 1 0
      sr/internal/name/event/event.go
  71. 20 11
      sr/internal/name/remote/map.go
  72. 1 0
      sr/internal/name/remote/rank.go
  73. 3 0
      sr/internal/name/route/push.go
  74. 102 179
      sr/internal/pb/actor.pb.go
  75. 91 41
      sr/internal/pb/base_type.pb.go
  76. 42 8
      sr/internal/pb/battle.pb.go
  77. 118 38
      sr/internal/pb/league.pb.go
  78. 232 49
      sr/internal/pb/map.pb.go
  79. 5 1
      sr/internal/types/currency_map.go
  80. 1 1
      sr/nodes/game/internal/db/data/lineup/lineups.go
  81. 17 6
      sr/nodes/game/internal/db/data/player/stats.go
  82. 1 1
      sr/nodes/game/internal/db/data/quest/quest.go
  83. 9 8
      sr/nodes/game/internal/facade/define.go
  84. 6 0
      sr/nodes/game/internal/facade/facade.go
  85. 1 0
      sr/nodes/game/internal/facade/init/init.go
  86. 1 1
      sr/nodes/game/order/actor_deliver.go
  87. 2 2
      sr/nodes/game/player/actor.go
  88. 41 8
      sr/nodes/game/player/currency/service.go
  89. 53 0
      sr/nodes/game/player/currency/service_type.go
  90. 16 0
      sr/nodes/game/player/currency/type/base.go
  91. 24 0
      sr/nodes/game/player/currency/type/stamina.go
  92. 24 0
      sr/nodes/game/player/currency/type/temp_stamina.go
  93. 0 25
      sr/nodes/game/player/gm/service.go
  94. 61 33
      sr/nodes/game/player/gm/type/gm_time.go
  95. 1 1
      sr/nodes/game/player/lineup/service.go
  96. 1 1
      sr/nodes/game/player/main_quest/service.go
  97. 13 0
      sr/nodes/game/player/player_asset.go
  98. 0 13
      sr/nodes/game/player/player_gm.go
  99. 5 4
      sr/nodes/game/player/player_lord.go
  100. 1 1
      sr/nodes/game/player/player_minigame.go

+ 22 - 0
sr/.gitignore

@@ -0,0 +1,22 @@
+.idea/
+.vscode/
+bin/
+logs/
+*.exe
+publish/
+**go.work
+**go.work.sum
+config/data-client/
+log-post.exe
+__debug*
+debug/
+cherry
+!protoc.exe
+_cherry/
+_excel/
+_proto/
+battle_record/
+_link/
+debug.log
+# test PR1 test
+.opencode/

+ 12 - 6
sr/_proto/battle.proto

@@ -23,19 +23,19 @@ import "base_type.proto";
 
 // enum BattleType {
 //   // 测试
-//   Test = 1; 
+//   Test = 1;
 //   // 探险
 //   Exploration = 2;
-//   // 
-//   PVP = 3; 
+//   //
+//   PVP = 3;
 //   //
 //   SLG = 4,
 // }
 
 message BattleReplay {
-  int32 errorCode = 1;
-  string errorText = 2;
-  BattleResult result = 3;
+  int32        errorCode = 1;
+  string       errorText = 2;
+  BattleResult result    = 3;
 }
 
 // 战斗参数
@@ -50,6 +50,10 @@ message BattleParam {
   bool isGenerateVerificationInfo = 4;
   // 战斗类型  BattleType 1:测试 2:探险 3:PVP 4:SLG
   int32 battleType = 5;
+  // 配置数据
+  bytes configData = 6;
+  // 是否生成配置数据
+  bool generateConfigData = 7;
 }
 
 // // 领主信息
@@ -180,6 +184,8 @@ message BattleResult {
   repeated BattleCampResult campResult = 3;
   // 详细校验结果
   repeated BattleVerifyInfo verifyInfos = 4;
+  // 配置数据
+  bytes configData = 6;
 }
 
 // 校验详细信息

+ 4 - 2
sr/_proto/equip.json

@@ -25,7 +25,8 @@
         "enable": true,
         "name": "[请求]装备打造",
         "route": "game.player.equipCraft",
-        "request": "I32",
+        "request": "I32I32",
+        "@request": "key:打造装备ID Z-装备表装备ID, value:打造次数",
         "response": "AssetList",
         "@response": "展示新获得的装备列表",
         "desc": "打造后通过equipChangePush推送"
@@ -34,7 +35,8 @@
         "enable": true,
         "name": "[请求]装备随机打造",
         "route": "game.player.equipRandomCraft",
-        "request": "None",
+        "request": "I32",
+        "@request": "打造次数",
         "response": "AssetList",
         "@response": "展示新获得的装备列表",
         "desc": "打造后通过equipChangePush推送"

+ 0 - 2
sr/_proto/hero.proto

@@ -32,8 +32,6 @@ message Hero {
 message HeroStarRequest {
   // 英雄唯一 ID
   int64 heroGUID = 1;
-  // 作为素材的英雄唯一 ID 列表
-  repeated int64 removeHeroGUIDs = 2;
 }
 
 // [响应] 英雄技能升级

+ 9 - 2
sr/_proto/league.json

@@ -122,8 +122,8 @@
     "name": "[请求]联盟升级",
     "route": "map.league.upgrade",
     "request": "None",
-    "response": "I32I32",
-    "@response": "key 联盟当前等级 value 联盟当前经验",
+    "response": "I32",
+    "@response": "返回状态码",
     "desc": ""
   },
   {
@@ -552,5 +552,12 @@
     "route": "map.league.unionRelievePush",
     "push": "LeagueUnion",
     "desc": ""
+  },
+  {
+    "enable": true,
+    "name": "[推送]联盟升级推送",
+    "route": "map.league.upgradePush",
+    "push": "LeagueUpgradeNotice",
+    "desc": "联盟升级时推送给所有在线成员"
   }
 ]

+ 12 - 0
sr/_proto/league.proto

@@ -475,4 +475,16 @@ message LeagueUnion {
   int64 unionLeagueID = 2;
   // 联邦解除时间戳 0未解除 单位秒
   int64 unionRelieveTime = 3;
+}
+
+// 联盟升级通知
+message LeagueUpgradeNotice {
+  // 联盟ID
+  int64 leagueID = 1;
+  // 当前等级
+  int32 level = 2;
+  // 当前经验值
+  int32 exp = 3;
+  // 联盟属性
+  Attrs attrs = 4;
 }

+ 16 - 1
sr/_proto/map.json

@@ -521,5 +521,20 @@
     "response": "MapScout",
     "@response": "地图侦察数据",
     "desc": ""
-  }
+  },
+  {
+    "enable": true,
+    "name": "[推送]军情线",
+    "route": "map.pusher.mapArmyLines",
+    "push": "MapArmyLines",
+    "desc": "如果客户端本地军情线已存在则更新"
+  },
+  {
+    "enable": true,
+    "name": "[推送]军情线删除",
+    "route": "map.pusher.mapArmyLineDel",
+    "push": "I64List",
+    "@push": "军情线对象id列表",
+    "desc": "军情线删除"
+  }     
 ]

+ 49 - 17
sr/_proto/map.proto

@@ -655,8 +655,10 @@ message MapFindPathRequest {
 message ComebackResponse {
   // 新的坐标点
   Point point = 1;
-  // 冷却结束时间(毫秒)
+  // 再起冷却结束时间(毫秒)
   int64 comebackEndTime = 2;
+  // 选州再起冷却结束时间(毫秒)
+  int64 rechooseComebackEndTime = 3;
 }
 
 // 重新出生推送
@@ -681,23 +683,25 @@ message MapUIMarch {
   int32 configID = 2;
   // 行军状态
   // 见 map.go -> MarchState 行军状态
-  int32 marchState = 3;  
+  int32 marchState = 3;
   // 行军展示信息
-  MarchView marchView = 4; 
+  MarchView marchView = 4;
   // 寻路信息(运用于行军/军团等可移动对象)
-  MapPath path = 5;   
+  MapPath path = 5;
   // 对象所在坐标点
-  Point point = 6;  
+  Point point = 6;
   // 所有者的玩家ID
   int64 playerID = 7;
   // 所有者的联盟ID
-  int64 leagueID = 8;  
+  int64 leagueID = 8;
+  // 调动对象ID
+  int64 redeployObjectID = 9;
 }
 
 // 地图ui层-系统城对象列表
 message MapUICastles {
   // 对象列表
-  repeated MapUICastle list = 1; 
+  repeated MapUICastle list = 1;
 }
 
 // 地图ui层-系统城对象列表
@@ -705,19 +709,19 @@ message MapUICastle {
   // 对象唯一id
   int64 objectID = 1;
   // 对象所在坐标点
-  Point point = 2;  
+  Point point = 2;
   // 对象配置ID
-  int32 configID = 3;  
+  int32 configID = 3;
   // 占领的联盟ID
-  int64 leagueID = 4;  
+  int64 leagueID = 4;
   // 占领的联盟名称
-  string leagueName = 5;   
+  string leagueName = 5;
   // 占领的联盟简称
-  string leagueAbbName = 6;  
+  string leagueAbbName = 6;
   // 旗帜背景ID L-联盟-旗帜表旗帜ID
   int32 flagBg = 7;
   // 旗帜图标ID L-联盟-旗帜表旗帜ID
-  int32 flagIcon = 8;  
+  int32 flagIcon = 8;
 }
 
 // 获取指定对象的坐标
@@ -737,8 +741,36 @@ message MapScoutList {
 message MapScout {
   // 侦察队列ID
   int32 queueID = 1;
+  // 侦察状态 0空闲 1行军 2侦察中
+  int32 scoutStatus = 2;
   // 侦察坐标 如果为空,则为空闲
-  Point point = 2;
-  // 侦察结束时间戳(行军+侦察时间) 单位毫秒 0表示空闲
-  int64 endTime = 3;
-}
+  Point point = 3;
+  // 状态结束时间戳 单位毫秒
+  int64 endTime = 4;
+}
+
+// 军情线列表
+message MapArmyLines {
+  repeated MapArmyLine list = 1;
+}
+
+// 军情线
+message MapArmyLine {
+  // 对象唯一id
+  int64 objectID = 1;
+  // 所有者的玩家ID
+  int64 playerID = 2;
+  // 所有者的联盟ID
+  int64 leagueID = 3;
+  // 对象类型,用来读取下面对应的配置ID和结构
+  // 见 map.go -> ObjectType 地块对象类型 
+  int32 objectType = 4;  
+  // 速度
+  int64 speed = 5;   
+  // 路径列表
+  repeated Point points = 6;
+  // 终点坐标
+  Point targetPoint = 7;    
+  // 目标对象ID
+  int64 targetObjectID = 8;      
+}

BIN
sr/docs/git-flow/xy3-git-cn.docx


+ 0 - 744
sr/docs/git-flow/版本流程.md

@@ -1,744 +0,0 @@
-# 版本控制
-
-在游戏中,版本控制将按照以下规则进行格式化:
-
-## 命名规则 
-
-### UAT
-
-对游戏影响较大的**主要版本发布**。示例如下:
-
-#### Client
-
-更新无法通过热修复完成,必须经过 **Google Play Store / App Store
-审核流程** 的内容。
-
-#### Server
-
-更新涉及**不兼容的改动**,需要进行补丁或数据迁移。
-
-#### 其他
-
--   大型新功能变更
--   现有功能的完全重构
--   架构级变更
-
-------------------------------------------------------------------------
-
-### Hotfix
-
-标准的**小版本更新**,仅包含较小的改动,例如:
-
--   新的小功能
--   对现有功能的修改
--   Bug 修复
--   每周维护更新
-
-------------------------------------------------------------------------
-
-### Urgent
-
-需要**尽快发布的紧急更新**,例如:
-
--   修复游戏崩溃问题
--   修复损坏的功能
--   修复严重 Bug
--   修复破坏游戏平衡的漏洞
-
-------------------------------------------------------------------------
-
-## 版本号格式 
-
-游戏版本号将根据游戏中的改动进行更新。
-版本号格式如下:
-
-    xx.yy.zz
-
-不同类型更新对版本号的影响如下:
-
-### UAT
-
--   xx +1
--   yy 和 zz 重置为 0
-
-示例:
-
-    2.5.2 → 3.0.0
-
-### Hotfix
-
--   xx 不变
--   yy +1
--   zz 重置为 0
-
-示例:
-
-    2.5.2 → 2.6.0
-
-### Urgent
-
--   xx 和 yy 不变
--   zz +1
-
-示例:
-
-    2.5.2 → 2.5.3
-
-
-### 图示
-
-版本号升级规则:
-```mermaid
-flowchart LR
-  A["当前版本 xx.yy.zz"]
-
-  A -->|"UAT:xx + 1
-yy=0, zz=0"| B["新版本 (xx+1).0.0"]
-  A -->|"Hotfix:yy + 1
-zz=0"| C["新版本 xx.(yy+1).0"]
-  A -->|"Urgent:zz + 1"| D["新版本 xx.yy.(zz+1)"]
-```
-
-
-------------------------------------------------------------------------
-
-# Git 控制
-
-Git 访问需要严格规则,以确保项目稳定性。
-
-------------------------------------------------------------------------
-
-# 分支创建与规则
-
-在版本规划确认后,由**负责人(Project Manager)**创建一些标准分支。
-
-## Main / Master
-
-仓库中最重要的分支。
-
-该分支必须**完全对应当前对外发布的版本**。
-
-规则:
-
--   只有负责人可以合并到该分支
--   每个版本发布后进行合并
--   **不允许直接提交 commit**
--   只允许从以下分支合并:
-    -   Review
-    -   UAT
-    -   Hotfix
-    -   Urgent
-
-------------------------------------------------------------------------
-
-## Review
-
-用于存储**等待审核的最新主要版本**。
-
-目的:
-
-防止在应用仍处于审核状态时出现紧急问题。
-(如果审核期间合并到 master,将无法获取干净的公开版本)
-
-规则:
-
--   只有负责人可以合并到此分支
--   发布到 Play Store 和 App Store 后立即合并到 **Master**
--   **不允许直接 commit**
--   只允许从 **UAT 分支**合并
-
-如果审核失败:
-
--   修改需要在对应的 **UAT 分支**完成
--   再重新合并到 Review
-
-------------------------------------------------------------------------
-
-## UAT
-
-用于存储**即将发布的主要版本**。
-
-命名格式:
-
-    UAT/版本号
-    例如:UAT/2.0.0
-
-规则:
-
--   不允许直接 commit
--   所有修改必须通过 **Pull Request / Merge Request**
--   必须获得负责人批准
-
-------------------------------------------------------------------------
-
-## Hotfix
-
-用于存储**即将发布的小版本更新**。
-
-命名格式:
-
-    Hotfix/版本号
-    例如:Hotfix/1.2.0
-
-规则:
-
--   所有修改必须通过 **Pull Request / Merge Request**
--   必须获得负责人批准
-
-------------------------------------------------------------------------
-
-## Urgent
-
-用于存储**紧急版本更新**。
-
-命名格式:
-
-    Urgent/版本号
-    例如:Urgent/1.1.2
-
-规则:
-
--   所有修改必须通过 **Pull Request / Merge Request**
--   必须获得负责人批准
-
-------------------------------------------------------------------------
-
-## Develop
-
-用于在功能本地开发完成后进行**集成测试**。
-
-规则:
-
--   所有修改通过 **Pull Request / Merge Request**
--   需要团队成员批准
-
-说明:
-
-由于该分支不是由负责人严格维护,如果仓库出现问题:
-
-负责人可以:
-
--   从最新版本重新拉取
-    或
--   手动修复
-
-------------------------------------------------------------------------
-
-## Local
-
-用于开发的**短生命周期分支**。
-
-命名方式:
-
-团队可自行决定,只要清晰易懂。
-
-规则:
-
--   从对应的 **UAT / Hotfix / Urgent** 分支创建
--   根据功能要进入的版本决定
-
-开发流程:
-
--   所有 commit 在此分支完成
--   功能完成后合并回对应版本分支
--   需要定期从 UAT / Hotfix / Urgent 同步更新以避免冲突
-
-------------------------------------------------------------------------
-
-# 合并流程 
-
-每次发布新版本后,需要进行分支合并以避免改动被覆盖。
-
-一般规则:
-
-将改动合并到**所有更高版本的分支**
-
-例如:
-
-    1.1.2 < 1.2.0 < 2.0.0 < 3.0.0
-
-Master / Review / Develop 的规则略有不同。
-
-## Main / Master
-
--   不会被合并到其他分支
--   只接受其他分支的合并
-
-## Review
-
-当 Google Play Store 和 App Store 审核通过并正式发布后:
-
-    Review → Master
-
-## UAT
-
-测试通过后:
-
-如果不需要审核:
-
-    UAT → Master
-
-如果需要审核:
-
-    UAT → Review
-
-同时需要合并到**更高版本的 UAT 分支**
-
-示例:
-
-    UAT/2.0.0 → UAT/3.0.0
-
-## Hotfix
-
-测试通过后:
-
-    Hotfix → Master
-
-同时需要合并到:
-
--   所有 **UAT 分支**
--   所有更高版本 **Hotfix 分支**
-
-示例:
-
-    Hotfix/1.1.0 → Hotfix/1.2.0
-
-## Urgent
-
-测试通过后:
-
-    Urgent → Master
-
-同时需要合并到:
-
--   所有 **UAT 分支**
--   所有 **Hotfix 分支**
--   所有更高版本 **Urgent 分支**
-
-示例:
-
-    Urgent/1.1.1 → Urgent/1.1.2
-
-## Develop
-
--   不会合并到其他分支
--   仅用于开发人员进行集成测试
-
-## Local
-
-短生命周期开发分支。
-
-流程:
-
-    Local → UAT / Hotfix / Urgent
-
-取决于该功能要进入哪个版本。
-
-维护建议:
-
--   定期从对应版本分支同步更新
--   避免冲突
-
-## 图示
-
-版本发布后的合并顺序
-
-```mermaid
-flowchart LR
-    A[Urgent/1.1.2] --> B[更高版本 Urgent 分支]
-    A --> C[所有 Hotfix 分支]
-    A --> D[所有 UAT 分支]
-    A --> E[Master]
-
-    F[Hotfix/1.2.0] --> G[更高版本 Hotfix 分支]
-    F --> H[所有 UAT 分支]
-    F --> I[Master]
-
-    J[UAT/2.0.0] --> K[更高版本 UAT 分支]
-    J --> L[Review(若需要审核)]
-    J --> M[Master(若无需审核)]
-```
-
-
-分支体系概览
-
-```mermaid
-flowchart TB
-  Master["Main / Master
-线上公开版本"]
-  Review["Review
-审核中的主要版本(可选)"]
-
-  subgraph ReleaseBranches["发布分支(按类型)"]
-    direction TB
-    UAT["UAT/x.y.z
-主要版本候选"]
-    Hotfix["Hotfix/x.y.z
-小版本候选"]
-    Urgent["Urgent/x.y.z
-紧急版本候选"]
-  end
-
-  Develop["Develop
-集成测试(可选)"]
-  Local["Local/*
-短生命周期开发分支"]
-
-  UAT -->|"拉出开发分支"| Local
-  Hotfix -->|"拉出开发分支"| Local
-  Urgent -->|"拉出开发分支"| Local
-
-  Local -->|"PR/MR 合并"| UAT
-  Local -->|"PR/MR 合并"| Hotfix
-  Local -->|"PR/MR 合并"| Urgent
-
-  Urgent -->|"同步版本"| Hotfix
-  Urgent -->|"同步版本"| UAT
-  Hotfix -->|"同步版本"| UAT
-  
-  UAT -->|"可选:同步/合并到"| Develop
-  Hotfix -->|"可选:同步/合并到"| Develop
-  Urgent -->|"可选:同步/合并到"| Develop
-
-  UAT -->|"无需审核:测试通过后合并"| Master
-  UAT -->|"需要审核:测试通过后合并"| Review
-  Review -->|"审核通过并发布后合并"| Master
-
-  Hotfix -->|"测试通过后合并"| Master
-  Urgent -->|"测试通过后合并"| Master
-```
-
-
-------------------------------------------------------------------------
-
-# 冲突解决
-
-当在合并过程中遇到冲突时:
-
-1.  通知相关人员:
-    -   冲突另一侧的作者
-    -   项目负责人
-2.  如果是小问题且有信心解决:
-    -   可以尝试自行解决
-    -   但仍需要通知相关人员
-3.  如果是复杂问题:
-    -   与另一侧作者协作解决
-    -   确保不会破坏任何一方的功能
-4.  如果无法找到解决方案:
-
-由 **负责人最终决定处理方式**
-
-### 图示
-
-冲突处理流程
-
-```mermaid
-flowchart TD
-    A[发生合并冲突] --> B[通知相关人员<br/>冲突另一侧作者 + 负责人]
-    B --> C{冲突是否简单<br/>且你有把握?}
-    C -->|是| D[自行解决冲突]
-    D --> E[通知相关人员:已解决方案与原因]
-    C -->|否| F[与另一侧作者协作解决]
-    F --> G{能否达成可行方案?}
-    G -->|是| E
-    G -->|否| H[由负责人最终决策解决方案]
-```
-
-
-------------------------------------------------------------------------
-
-# 潜在问题
-
-### 1. 本地开发环境版本不同步
-
-在使用 **Local 分支**进行开发时,开发者需要确保从各个仓库拉取的版本是**同步的**。
-
-例如:
-
-如果 **config 仓库**是在 **server 仓库之后一周才拉取**,则数据可能无法保持一致,从而导致一些**不可预期的错误**。
-
-为了确保本地测试不会出现问题:
-
-在进行测试之前,请确保**所有相关仓库都已经合并到最新版本**。
-
----
-
-### 2. Git 无法自动解决的冲突
-
-对于 **Git 无法自动解决的冲突**,需要由**负责人**来处理冲突。
-
-如果在开发过程中遇到问题,可以将情况提出来讨论,以寻找**最合适的解决方案**。
-
----
-
-# 不同仓库可能遇到的问题
-
-不同类型的仓库,遇到冲突的概率和类型可能不同。
-
----
-
-## Art
-
-发生冲突的可能性**较低**。
-
-通常情况下不会遇到严重的合并问题。
-
----
-
-## Config
-
-**问题 1 和问题 2 都比较容易出现。**
-
-需要注意:
-
-- **问题 1**:确保不同仓库之间的版本保持同步,以避免不必要的问题。
-    
-- **问题 2**:可以将一些在不同功能开发中**经常需要修改的公共配置文件**单独提取出来,并存放在**文件存储服务器**中统一管理。
-    
-
-当发生冲突时,负责人可以:
-
-- 从服务器拉取**最新版本的文件**
-    
-- 用该版本来解决冲突
-    
-
-这样可以确保**所有必要的修改仍然会保留在游戏中**,同时减少配置冲突带来的问题。
-
-如果这种方法在实际操作中存在困难,也可以再寻找其他方式来解决配置文件的冲突问题。
-
----
-
-## Client
-
-**问题 1 和问题 2 都可能发生。**
-
-需要注意:
-
-- **问题 1**:确保仓库版本同步,避免不必要的问题
-    
-- **问题 2**:比较容易发生冲突的部分包括:
-    
-    - **Scenes**
-        
-    - **Effects**
-        
-
-这些问题可以通过**提前规划修改内容**来降低风险,避免多人同时修改相同内容。
-
----
-
-## Server
-
-通常情况下:
-
-- **问题 1**(版本不同步)较容易发生,需要注意避免。
-    
-
-对于 **问题 2**:
-
-大多数情况下冲突可以通过以下方式解决:
-
-- Git 自动合并
-    
-- 或者在稍微复杂的情况下,由负责人进行少量干预即可解决。
-    
-
----
-
-## Proto
-
-**问题 1 和问题 2 都比较容易出现。**
-
-需要注意:
-
-- **问题 1**:确保仓库版本同步,避免不必要的问题
-    
-- **问题 2**:大多数情况下冲突比较容易解决
-    
-
-但必须确保解决方式是正确的。
-
-例如:
-
-如果在 **Resource enum** 中:
-
-Silver = 3  
-Gold = 3
-
-那么相关开发人员需要**协商决定哪一个需要修改为 4**,以避免枚举值冲突。
-
-
-### 典型工作流程:从规划到发布
-
-#### 规划阶段
-
-1. 各负责人之间进行讨论
-    
-2. 规划项目时间线
-    
-3. 项目经理创建新的 **Milestone**
-    
-4. 项目经理将新的 **Ticket** 加入到该 Milestone 中
-    
-5. 项目经理尽可能详细地填写 Ticket 的描述内容
-    
-
----
-
-#### 开发阶段
-
-1. 策划开始进行功能设计  
-    **更改 Ticket 状态为:Designer WIP**
-    
-2. 策划与开发人员和美术一起讨论该功能,以确认具体细节
-    
-3. 策划整理并最终确认设计文档,并发布设计文档  
-    **更改 Ticket 状态为:Designer Completed**
-    
-4. 美术根据设计文档开始制作相关资源  
-    **更改 Ticket 状态为:Artist WIP**
-    
-5. 美术完成该功能所需的所有美术资源  
-    **更改 Ticket 状态为:Artist Completed**
-    
-6. 开发人员根据设计文档和美术资源开始开发该功能  
-    **更改 Ticket 状态为:Dev WIP**
-    
-7. 开发人员完成该功能的全部开发,包括美术资源与配置  
-    **更改 Ticket 状态为:Dev Completed**
-    
-8. 策划确认该功能是否符合设计文档  
-    **更改 Ticket 状态为:Designer Verified**
-    
-9. 美术确认该功能是否符合提供的美术样例  
-    **更改 Ticket 状态为:Artist Verified**
-    
-10. 准备所有必要的 **Merge Request**,并等待所有相关仓库完成合并  
-    **更改 Ticket 状态为:Ready To Test**
-    
-11. QA 开始对该功能进行测试  
-    **更改 Ticket 状态为:Test In Progress**
-    
-12. QA 根据发现的问题创建新的 **Bug Ticket**  
-    **更改 Ticket 状态为:Test Failed**  
-    _(如果没有问题则跳过此步骤)_
-    
-13. QA 确认该功能已完全完成并符合要求  
-    **更改 Ticket 状态为:Test Completed**
-    
-14. 项目经理将改动部署到 **生产环境
-    **更改 Ticket 状态为:Deployed**
-
-
-### 图示
-
-功能生命周期概览
-
-```mermaid
-flowchart LR
-  A[规划阶段] --> B[设计阶段]
-  B --> C[制作阶段]
-  C --> D[集成阶段]
-  D --> E[测试阶段]
-  E --> F[发布阶段]
-
-  E -->|发现问题| C
-```
-
-
-按角色划分的详细工作流程
-
-```mermaid
-flowchart LR
-
-  subgraph PM[项目经理]
-    A[负责人讨论]
-    B[规划时间线]
-    C[创建 Milestone]
-    D[创建 Ticket 并填写描述]
-    Z[部署到生产环境 - 状态:Deployed]
-  end
-
-  subgraph Designer[策划]
-    E[开始功能设计 - 状态:Designer WIP]
-    F[与开发人员和美术讨论细节]
-    G[完成设计文档 - 状态:Designer Completed]
-    H[根据设计文档验证功能 - 状态:Designer Verified]
-  end
-
-  subgraph Artist[美术]
-    I[开始制作美术资源 - 状态:Artist WIP]
-    J[完成所有美术资源 - 状态:Artist Completed]
-    K[验证美术实现是否正确 - 状态:Artist Verified]
-  end
-
-  subgraph Developer[开发者]
-    L[开始功能开发 - 状态:Dev WIP]
-    M[完成包含美术与配置的功能 - 状态:Dev Completed]
-  end
-
-  subgraph QA[测试]
-    N[准备 Merge Requests - 状态:Ready To Test]
-    O[开始测试功能 - 状态:Test In Progress]
-    P{是否发现问题?}
-    Q[创建 Bug Ticket - 状态:Test Failed]
-    R[确认功能完成 - 状态:Test Completed]
-  end
-
-  A --> B
-  B --> C
-  C --> D
-  D --> E
-  E --> F
-  F --> G
-  G --> I
-  I --> J
-  J --> L
-  L --> M
-  M --> H
-  H --> K
-  K --> N
-  N --> O
-  O --> P
-  P -->|是| Q
-  Q --> L
-  P -->|否| R
-  R --> Z
-```
-
-典型工作流:从 Local 到发布
-
-```mermaid
-sequenceDiagram
-  participant Dev as 开发者(Dev)
-  participant Local as Local/*
-  participant Rel as UAT/Hotfix/Urgent
-  participant Review as Review(可选)
-  participant Master as Master
-
-  alt 开发
-    Dev->>Local: 开发 & 提交 commits(只在 Local)
-    Local->>Rel: 发起 PR/MR(Local -> 目标版本分支)
-    Rel-->>Dev: Code Review / 修改建议
-    Dev->>Local: 提交修复 commits(只在 Local)
-    Local->>Rel: 更新 PR/MR(Local -> 目标版本分支)
-  end
-
-  alt 测试
-    Rel-->>Rel: 测试
-    Rel-->>Dev: 反馈问题(测试未通过)
-    Dev->>Local: 回到 Local 修复并继续提交
-    Local->>Rel: 推送更新(更新同一个 PR/MR)
-    Rel->>Rel: 重新测试
-  end
-
-  alt 发布
-    Rel->>Review: 合并(UAT -> Review)
-    Review->>Master: 审核通过并发布后合并(Review -> Master)
-  else 不需要审核(或 Hotfix/Urgent)
-    Rel->>Master: 测试通过后合并(目标分支 -> Master)
-  end
-```
-
-

+ 1 - 1
sr/etc/data/area.json

@@ -6,7 +6,7 @@
     {"Pid":2188005,"AreaID":5,"AreaName":"LCS测试服","Gate":"192.168.1.38:30001"},
     {"Pid":2188006,"AreaID":6,"AreaName":"AZW测试服","Gate":"192.168.1.41:30001"},
     {"Pid":2188007,"AreaID":7,"AreaName":"yanjian测试服","Gate":"192.168.1.48:30001"},
-    {"Pid":2188008,"AreaID":8,"AreaName":"hw测试服","Gate":"192.168.1.29:30001"},
+    {"Pid":2188008,"AreaID":8,"AreaName":"HW测试服","Gate":"192.168.1.29:30001"},
     {"Pid":2188099,"AreaID":99,"AreaName":"local区","Gate":"127.0.0.1:30001"},
     {"Pid":2188100,"AreaID":100,"AreaName":"[CBT]1区","Gate":"47.238.143.20:30001"}
 ]

+ 6 - 6
sr/etc/data/arm_level.json

@@ -1,8 +1,8 @@
 [
-    {"ID":201,"Level":0,"ConscriptNumSecond":50,"ConscriptCostItems":[[104,4]],"OutsideConscriptCosts":[[104,8]],"UpgradeCostItems":[],"UpArmID":0,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[]},
-    {"ID":202,"Level":1,"ConscriptNumSecond":45,"ConscriptCostItems":[[102,30],[104,4]],"OutsideConscriptCosts":[[102,60],[104,8]],"UpgradeCostItems":[[102,30],[104,2]],"UpArmID":103043,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[]},
-    {"ID":203,"Level":2,"ConscriptNumSecond":40,"ConscriptCostItems":[[102,50],[104,4]],"OutsideConscriptCosts":[[102,100],[104,8]],"UpgradeCostItems":[[102,30],[104,2]],"UpArmID":103044,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[]},
-    {"ID":204,"Level":3,"ConscriptNumSecond":35,"ConscriptCostItems":[[102,70],[104,4]],"OutsideConscriptCosts":[[102,140],[104,8]],"UpgradeCostItems":[[102,30],[104,2]],"UpArmID":103045,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[]},
-    {"ID":205,"Level":4,"ConscriptNumSecond":30,"ConscriptCostItems":[[102,90],[104,8]],"OutsideConscriptCosts":[[102,180],[104,16]],"UpgradeCostItems":[[102,30],[104,2]],"UpArmID":103046,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[]},
-    {"ID":206,"Level":5,"ConscriptNumSecond":25,"ConscriptCostItems":[[102,130],[104,8]],"OutsideConscriptCosts":[[102,260],[104,16]],"UpgradeCostItems":[],"UpArmID":0,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[]}
+    {"ID":201,"Level":0,"ConscriptNumSecond":50,"ConscriptCostItems":[[104,4]],"OutsideConscriptCosts":[[104,8]],"UpgradeCostItems":[],"UpArmID":0,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[],"BaseFeat":10,"FeatRatio":1000},
+    {"ID":202,"Level":1,"ConscriptNumSecond":45,"ConscriptCostItems":[[102,30],[104,4]],"OutsideConscriptCosts":[[102,60],[104,8]],"UpgradeCostItems":[[102,30],[104,2]],"UpArmID":103043,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[],"BaseFeat":20,"FeatRatio":2000},
+    {"ID":203,"Level":2,"ConscriptNumSecond":40,"ConscriptCostItems":[[102,50],[104,4]],"OutsideConscriptCosts":[[102,100],[104,8]],"UpgradeCostItems":[[102,30],[104,2]],"UpArmID":103044,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[],"BaseFeat":30,"FeatRatio":3000},
+    {"ID":204,"Level":3,"ConscriptNumSecond":35,"ConscriptCostItems":[[102,70],[104,4]],"OutsideConscriptCosts":[[102,140],[104,8]],"UpgradeCostItems":[[102,30],[104,2]],"UpArmID":103045,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[],"BaseFeat":40,"FeatRatio":4000},
+    {"ID":205,"Level":4,"ConscriptNumSecond":30,"ConscriptCostItems":[[102,90],[104,8]],"OutsideConscriptCosts":[[102,180],[104,16]],"UpgradeCostItems":[[102,30],[104,2]],"UpArmID":103046,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[],"BaseFeat":50,"FeatRatio":5000},
+    {"ID":206,"Level":5,"ConscriptNumSecond":25,"ConscriptCostItems":[[102,130],[104,8]],"OutsideConscriptCosts":[[102,260],[104,16]],"UpgradeCostItems":[],"UpArmID":0,"InfantryAttr":[],"CavalryAttr":[],"ArcherAttr":[],"BaseFeat":60,"FeatRatio":6000}
 ]

+ 18 - 18
sr/etc/data/arm_type.json

@@ -1,20 +1,20 @@
 [
-    {"ID":101,"Level":0,"Job":1,"Skills":[40101],"FightLevel":10,"Attack":72,"Def":100,"Hp":60,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":102,"Level":1,"Job":1,"Skills":[40101],"FightLevel":10,"Attack":216,"Def":300,"Hp":180,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":103,"Level":2,"Job":1,"Skills":[40101],"FightLevel":20,"Attack":432,"Def":600,"Hp":360,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":104,"Level":3,"Job":1,"Skills":[40101],"FightLevel":30,"Attack":792,"Def":1100,"Hp":660,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":105,"Level":4,"Job":1,"Skills":[40101],"FightLevel":40,"Attack":1080,"Def":1500,"Hp":900,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":106,"Level":5,"Job":1,"Skills":[40101],"FightLevel":50,"Attack":1440,"Def":2000,"Hp":1200,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":201,"Level":0,"Job":2,"Skills":[40201],"FightLevel":10,"Attack":112,"Def":90,"Hp":58,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
-    {"ID":202,"Level":1,"Job":2,"Skills":[40201],"FightLevel":10,"Attack":336,"Def":270,"Hp":173,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
-    {"ID":203,"Level":2,"Job":2,"Skills":[40201],"FightLevel":20,"Attack":672,"Def":540,"Hp":346,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
-    {"ID":204,"Level":3,"Job":2,"Skills":[40201],"FightLevel":30,"Attack":1232,"Def":990,"Hp":634,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
-    {"ID":205,"Level":4,"Job":2,"Skills":[40201],"FightLevel":40,"Attack":1680,"Def":1350,"Hp":864,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
-    {"ID":206,"Level":5,"Job":2,"Skills":[40201],"FightLevel":50,"Attack":2240,"Def":1800,"Hp":1152,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
-    {"ID":301,"Level":0,"Job":3,"Skills":[40301],"FightLevel":10,"Attack":88,"Def":80,"Hp":54,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":302,"Level":1,"Job":3,"Skills":[40301],"FightLevel":10,"Attack":264,"Def":240,"Hp":162,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":303,"Level":2,"Job":3,"Skills":[40301],"FightLevel":20,"Attack":528,"Def":480,"Hp":324,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":304,"Level":3,"Job":3,"Skills":[40301],"FightLevel":30,"Attack":968,"Def":880,"Hp":594,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":305,"Level":4,"Job":3,"Skills":[40301],"FightLevel":40,"Attack":1320,"Def":1200,"Hp":810,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
-    {"ID":306,"Level":5,"Job":3,"Skills":[40301],"FightLevel":50,"Attack":1760,"Def":1600,"Hp":1080,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000}
+    {"ID":101,"Level":0,"Job":1,"Skills":[40101],"FightLevel":10,"Attack":76,"Def":80,"Hp":60,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":102,"Level":1,"Job":1,"Skills":[40101],"FightLevel":10,"Attack":228,"Def":240,"Hp":180,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":103,"Level":2,"Job":1,"Skills":[40101],"FightLevel":20,"Attack":456,"Def":480,"Hp":360,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":104,"Level":3,"Job":1,"Skills":[40101],"FightLevel":30,"Attack":836,"Def":880,"Hp":660,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":105,"Level":4,"Job":1,"Skills":[40101],"FightLevel":40,"Attack":1140,"Def":1200,"Hp":900,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":106,"Level":5,"Job":1,"Skills":[40101],"FightLevel":50,"Attack":1520,"Def":1600,"Hp":1200,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":201,"Level":0,"Job":2,"Skills":[40201],"FightLevel":10,"Attack":112,"Def":72,"Hp":56,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
+    {"ID":202,"Level":1,"Job":2,"Skills":[40201],"FightLevel":10,"Attack":336,"Def":216,"Hp":168,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
+    {"ID":203,"Level":2,"Job":2,"Skills":[40201],"FightLevel":20,"Attack":672,"Def":432,"Hp":336,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
+    {"ID":204,"Level":3,"Job":2,"Skills":[40201],"FightLevel":30,"Attack":1232,"Def":792,"Hp":616,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
+    {"ID":205,"Level":4,"Job":2,"Skills":[40201],"FightLevel":40,"Attack":1680,"Def":1080,"Hp":840,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
+    {"ID":206,"Level":5,"Job":2,"Skills":[40201],"FightLevel":50,"Attack":2240,"Def":1440,"Hp":1120,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":2000},
+    {"ID":301,"Level":0,"Job":3,"Skills":[40301],"FightLevel":10,"Attack":88,"Def":56,"Hp":52,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":302,"Level":1,"Job":3,"Skills":[40301],"FightLevel":10,"Attack":264,"Def":168,"Hp":156,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":303,"Level":2,"Job":3,"Skills":[40301],"FightLevel":20,"Attack":528,"Def":336,"Hp":312,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":304,"Level":3,"Job":3,"Skills":[40301],"FightLevel":30,"Attack":968,"Def":616,"Hp":572,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":305,"Level":4,"Job":3,"Skills":[40301],"FightLevel":40,"Attack":1320,"Def":840,"Hp":780,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000},
+    {"ID":306,"Level":5,"Job":3,"Skills":[40301],"FightLevel":50,"Attack":1760,"Def":1120,"Hp":1040,"AttackSpeed":10000,"MoveSpeed":600,"Weight":10,"AggValue":1000}
 ]

+ 12 - 2
sr/etc/data/const.json

@@ -7,7 +7,7 @@
 	"PlayerNameMinLength": 2,
 	"PlayerNameMaxLength": 7,
 	"PlayerCheckName": true,
-	"PlayerInitItems": [],
+	"PlayerInitItems": [[5,16]],
 	"PlayerInitHeros": [[200108,1]],
 	"PlayerInitEquips": [],
 	"PlayerInitCurrencies": [[1,0],[2,1000],[101,10000],[102,10000],[103,10000],[104,50000],[201,40000]],
@@ -115,6 +115,7 @@
 	"MapBattleLossTroops": 8000,
 	"MapBattleReportPVPLimit": 100,
 	"MapBattleReportPVELimit": 100,
+	"MapBattleReportScoutLimit": 100,
 	"MapBattleReportLikeLimit": 20,
 	"MapBattleReportPage": 10,
 	"MapSiegeWaitTime": 180,
@@ -176,5 +177,14 @@
 	"MapScoutMarchTime": 5,
 	"MapScoutTime": 60,
 	"MapScoutCosts": [[2,1]],
-	"EquipSingleGetLimit": 100
+	"EquipSingleGetLimit": 100,
+	"CrystalMineToConRatio": 800,
+	"TileSiegeToConRatio": 1000,
+	"FacilityPrestigeToConRatio": 600,
+	"ConToLeagueExpRatio": 10000,
+	"FeatToLeagueExpRatio": 1000,
+	"FeatToSeasonScoreRatio": 1000,
+	"FeatToSeasonScoreLimit": 1000,
+	"ConToSeasonScoreRatio": 1000,
+	"ConToSeasonScoreLimit": 1000
 }

+ 121 - 1
sr/etc/data/drop_pool.json

@@ -1740,5 +1740,125 @@
     {"ID":50005,"ItemID":10003,"Num":1000,"Weight":1000},
     {"ID":51001,"ItemID":10004,"Num":1,"Weight":1000},
     {"ID":51002,"ItemID":10004,"Num":7,"Weight":1000},
-    {"ID":51003,"ItemID":10004,"Num":30,"Weight":1000}
+    {"ID":51003,"ItemID":10004,"Num":30,"Weight":1000},
+    {"ID":51004,"ItemID":361011,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361012,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361013,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361014,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361021,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361022,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361023,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361024,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361031,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361032,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361033,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361034,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361041,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361042,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361043,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361044,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361051,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361052,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361053,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361054,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361061,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361062,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361063,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361064,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361071,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361072,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361073,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361074,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361081,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361082,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361083,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361084,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361091,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361092,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361093,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361094,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361101,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361102,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361103,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":361104,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362011,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362012,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362013,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362014,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362021,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362022,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362023,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362024,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362031,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362032,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362033,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362034,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362041,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362042,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362043,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362044,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362051,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362052,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362053,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362054,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362061,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362062,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362063,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362064,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362071,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362072,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362073,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362074,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362081,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362082,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362083,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362084,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362091,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362092,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362093,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362094,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362101,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362102,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362103,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":362104,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363011,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363012,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363013,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363014,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363021,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363022,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363023,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363024,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363031,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363032,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363033,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363034,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363041,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363042,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363043,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363044,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363051,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363052,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363053,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363054,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363061,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363062,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363063,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363064,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363071,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363072,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363073,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363074,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363081,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363082,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363083,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363084,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363091,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363092,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363093,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363094,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363101,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363102,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363103,"Num":1,"Weight":1},
+    {"ID":51004,"ItemID":363104,"Num":1,"Weight":1}
 ]

+ 132 - 132
sr/etc/data/equip.json

@@ -47,136 +47,136 @@
     {"ID":343002,"Quality":4,"Job":3,"EquipType":2,"NeedLevel":20,"CraftCosts":[[100022,1],[100102,3],[1,10000]],"BaseAttrRange":[[10021,1372,2058]],"RandomAttrNumRange":[[1,3000],[2,5000],[3,2000]],"ExtraAttrPool":12,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
     {"ID":343003,"Quality":4,"Job":3,"EquipType":3,"NeedLevel":20,"CraftCosts":[[100023,1],[100102,3],[1,10000]],"BaseAttrRange":[[10021,1372,2058]],"RandomAttrNumRange":[[1,3000],[2,5000],[3,2000]],"ExtraAttrPool":12,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
     {"ID":343004,"Quality":4,"Job":3,"EquipType":4,"NeedLevel":20,"CraftCosts":[[100024,1],[100102,3],[1,10000]],"BaseAttrRange":[[10061,245,343],[10071,375,562]],"RandomAttrNumRange":[[1,3000],[2,5000],[3,2000]],"ExtraAttrPool":12,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":351001,"Quality":5,"Job":1,"EquipType":1,"NeedLevel":30,"CraftCosts":[[100031,1],[100103,6],[1,80000]],"BaseAttrRange":[[10031,465,651],[10041,713,1070]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":13,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":351002,"Quality":5,"Job":1,"EquipType":2,"NeedLevel":30,"CraftCosts":[[100032,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2500,3750]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":13,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":351003,"Quality":5,"Job":1,"EquipType":3,"NeedLevel":30,"CraftCosts":[[100033,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2500,3750]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":13,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":351004,"Quality":5,"Job":1,"EquipType":4,"NeedLevel":30,"CraftCosts":[[100034,1],[100103,3],[1,50000]],"BaseAttrRange":[[10061,521,730],[10071,799,1199]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":13,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":352001,"Quality":5,"Job":2,"EquipType":1,"NeedLevel":30,"CraftCosts":[[100031,1],[100103,6],[1,80000]],"BaseAttrRange":[[10031,497,696],[10041,763,1144]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":14,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":352002,"Quality":5,"Job":2,"EquipType":2,"NeedLevel":30,"CraftCosts":[[100032,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2400,3600]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":14,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":352003,"Quality":5,"Job":2,"EquipType":3,"NeedLevel":30,"CraftCosts":[[100033,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2400,3600]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":14,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":352004,"Quality":5,"Job":2,"EquipType":4,"NeedLevel":30,"CraftCosts":[[100034,1],[100103,3],[1,50000]],"BaseAttrRange":[[10061,465,651],[10071,713,1070]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":14,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":353001,"Quality":5,"Job":3,"EquipType":1,"NeedLevel":30,"CraftCosts":[[100031,1],[100103,6],[1,80000]],"BaseAttrRange":[[10031,529,741],[10041,812,1218]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":353002,"Quality":5,"Job":3,"EquipType":2,"NeedLevel":30,"CraftCosts":[[100032,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2250,3375]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":353003,"Quality":5,"Job":3,"EquipType":3,"NeedLevel":30,"CraftCosts":[[100033,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2250,3375]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":353004,"Quality":5,"Job":3,"EquipType":4,"NeedLevel":30,"CraftCosts":[[100034,1],[100103,3],[1,50000]],"BaseAttrRange":[[10061,401,562],[10071,615,922]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
-    {"ID":361011,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100601,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":1000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[101100,1],"RareSkillPool":0,"EquipHeroID":200101,"NeedActiveSkill":true},
-    {"ID":361012,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100602,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":1000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":2001012,"EquipHeroID":200101,"NeedActiveSkill":false},
-    {"ID":361013,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100603,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":1000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":2001013,"EquipHeroID":200101,"NeedActiveSkill":false},
-    {"ID":361014,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100604,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":1000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":2001014,"EquipHeroID":200101,"NeedActiveSkill":false},
-    {"ID":361021,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100605,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200102,"NeedActiveSkill":false},
-    {"ID":361022,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100606,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200102,"NeedActiveSkill":false},
-    {"ID":361023,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100607,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200102,"NeedActiveSkill":false},
-    {"ID":361024,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100608,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200102,"NeedActiveSkill":false},
-    {"ID":361031,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100609,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200103,"NeedActiveSkill":false},
-    {"ID":361032,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100610,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200103,"NeedActiveSkill":false},
-    {"ID":361033,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100611,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200103,"NeedActiveSkill":false},
-    {"ID":361034,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100612,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200103,"NeedActiveSkill":false},
-    {"ID":361041,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100613,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200104,"NeedActiveSkill":false},
-    {"ID":361042,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100614,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200104,"NeedActiveSkill":false},
-    {"ID":361043,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100615,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200104,"NeedActiveSkill":false},
-    {"ID":361044,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100616,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200104,"NeedActiveSkill":false},
-    {"ID":361051,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100617,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200105,"NeedActiveSkill":false},
-    {"ID":361052,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100618,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200105,"NeedActiveSkill":false},
-    {"ID":361053,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100619,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200105,"NeedActiveSkill":false},
-    {"ID":361054,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100620,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200105,"NeedActiveSkill":false},
-    {"ID":361061,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100621,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200106,"NeedActiveSkill":false},
-    {"ID":361062,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100622,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200106,"NeedActiveSkill":false},
-    {"ID":361063,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100623,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200106,"NeedActiveSkill":false},
-    {"ID":361064,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100624,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200106,"NeedActiveSkill":false},
-    {"ID":361071,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100625,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200107,"NeedActiveSkill":false},
-    {"ID":361072,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100626,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200107,"NeedActiveSkill":false},
-    {"ID":361073,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100627,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200107,"NeedActiveSkill":false},
-    {"ID":361074,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100628,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200107,"NeedActiveSkill":false},
-    {"ID":361081,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100629,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200108,"NeedActiveSkill":false},
-    {"ID":361082,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100630,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200108,"NeedActiveSkill":false},
-    {"ID":361083,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100631,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200108,"NeedActiveSkill":false},
-    {"ID":361084,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100632,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200108,"NeedActiveSkill":false},
-    {"ID":361091,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100633,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200109,"NeedActiveSkill":false},
-    {"ID":361092,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100634,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200109,"NeedActiveSkill":false},
-    {"ID":361093,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100635,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200109,"NeedActiveSkill":false},
-    {"ID":361094,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100636,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200109,"NeedActiveSkill":false},
-    {"ID":361101,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100637,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200110,"NeedActiveSkill":false},
-    {"ID":361102,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100638,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200110,"NeedActiveSkill":false},
-    {"ID":361103,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100639,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200110,"NeedActiveSkill":false},
-    {"ID":361104,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100640,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200110,"NeedActiveSkill":false},
-    {"ID":362011,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100641,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200201,"NeedActiveSkill":false},
-    {"ID":362012,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100642,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200201,"NeedActiveSkill":false},
-    {"ID":362013,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100643,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200201,"NeedActiveSkill":false},
-    {"ID":362014,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100644,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200201,"NeedActiveSkill":false},
-    {"ID":362021,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100645,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200202,"NeedActiveSkill":false},
-    {"ID":362022,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100646,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200202,"NeedActiveSkill":false},
-    {"ID":362023,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100647,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200202,"NeedActiveSkill":false},
-    {"ID":362024,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100648,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200202,"NeedActiveSkill":false},
-    {"ID":362031,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100649,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200203,"NeedActiveSkill":false},
-    {"ID":362032,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100650,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200203,"NeedActiveSkill":false},
-    {"ID":362033,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100651,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200203,"NeedActiveSkill":false},
-    {"ID":362034,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100652,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200203,"NeedActiveSkill":false},
-    {"ID":362041,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100653,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200204,"NeedActiveSkill":false},
-    {"ID":362042,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100654,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200204,"NeedActiveSkill":false},
-    {"ID":362043,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100655,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200204,"NeedActiveSkill":false},
-    {"ID":362044,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100656,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200204,"NeedActiveSkill":false},
-    {"ID":362051,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100657,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200205,"NeedActiveSkill":false},
-    {"ID":362052,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100658,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200205,"NeedActiveSkill":false},
-    {"ID":362053,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100659,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200205,"NeedActiveSkill":false},
-    {"ID":362054,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100660,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200205,"NeedActiveSkill":false},
-    {"ID":362061,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100661,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200206,"NeedActiveSkill":false},
-    {"ID":362062,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100662,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200206,"NeedActiveSkill":false},
-    {"ID":362063,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100663,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200206,"NeedActiveSkill":false},
-    {"ID":362064,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100664,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200206,"NeedActiveSkill":false},
-    {"ID":362071,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100665,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200207,"NeedActiveSkill":false},
-    {"ID":362072,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100666,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200207,"NeedActiveSkill":false},
-    {"ID":362073,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100667,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200207,"NeedActiveSkill":false},
-    {"ID":362074,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100668,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200207,"NeedActiveSkill":false},
-    {"ID":362081,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100669,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200208,"NeedActiveSkill":false},
-    {"ID":362082,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100670,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200208,"NeedActiveSkill":false},
-    {"ID":362083,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100671,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200208,"NeedActiveSkill":false},
-    {"ID":362084,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100672,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200208,"NeedActiveSkill":false},
-    {"ID":362091,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100673,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200209,"NeedActiveSkill":false},
-    {"ID":362092,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100674,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200209,"NeedActiveSkill":false},
-    {"ID":362093,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100675,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200209,"NeedActiveSkill":false},
-    {"ID":362094,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100676,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200209,"NeedActiveSkill":false},
-    {"ID":362101,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100677,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200210,"NeedActiveSkill":false},
-    {"ID":362102,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100678,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200210,"NeedActiveSkill":false},
-    {"ID":362103,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100679,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200210,"NeedActiveSkill":false},
-    {"ID":362104,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100680,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200210,"NeedActiveSkill":false},
-    {"ID":363011,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100681,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200301,"NeedActiveSkill":false},
-    {"ID":363012,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100682,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200301,"NeedActiveSkill":false},
-    {"ID":363013,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100683,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200301,"NeedActiveSkill":false},
-    {"ID":363014,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100684,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200301,"NeedActiveSkill":false},
-    {"ID":363021,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100685,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200302,"NeedActiveSkill":false},
-    {"ID":363022,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100686,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200302,"NeedActiveSkill":false},
-    {"ID":363023,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100687,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200302,"NeedActiveSkill":false},
-    {"ID":363024,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100688,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200302,"NeedActiveSkill":false},
-    {"ID":363031,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100689,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200303,"NeedActiveSkill":false},
-    {"ID":363032,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100690,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200303,"NeedActiveSkill":false},
-    {"ID":363033,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100691,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200303,"NeedActiveSkill":false},
-    {"ID":363034,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100692,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200303,"NeedActiveSkill":false},
-    {"ID":363041,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100693,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200304,"NeedActiveSkill":false},
-    {"ID":363042,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100694,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200304,"NeedActiveSkill":false},
-    {"ID":363043,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100695,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200304,"NeedActiveSkill":false},
-    {"ID":363044,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100696,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200304,"NeedActiveSkill":false},
-    {"ID":363051,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100697,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200305,"NeedActiveSkill":false},
-    {"ID":363052,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100698,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200305,"NeedActiveSkill":false},
-    {"ID":363053,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100699,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200305,"NeedActiveSkill":false},
-    {"ID":363054,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100700,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200305,"NeedActiveSkill":false},
-    {"ID":363061,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100701,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200306,"NeedActiveSkill":false},
-    {"ID":363062,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100702,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200306,"NeedActiveSkill":false},
-    {"ID":363063,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100703,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200306,"NeedActiveSkill":false},
-    {"ID":363064,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100704,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200306,"NeedActiveSkill":false},
-    {"ID":363071,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100705,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200307,"NeedActiveSkill":false},
-    {"ID":363072,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100706,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200307,"NeedActiveSkill":false},
-    {"ID":363073,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100707,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200307,"NeedActiveSkill":false},
-    {"ID":363074,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100708,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200307,"NeedActiveSkill":false},
-    {"ID":363081,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100709,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200308,"NeedActiveSkill":false},
-    {"ID":363082,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100710,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200308,"NeedActiveSkill":false},
-    {"ID":363083,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100711,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200308,"NeedActiveSkill":false},
-    {"ID":363084,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100712,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200308,"NeedActiveSkill":false},
-    {"ID":363091,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100713,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200309,"NeedActiveSkill":false},
-    {"ID":363092,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100714,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200309,"NeedActiveSkill":false},
-    {"ID":363093,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100715,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200309,"NeedActiveSkill":false},
-    {"ID":363094,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100716,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200309,"NeedActiveSkill":false},
-    {"ID":363101,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":40,"CraftCosts":[[100717,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200310,"NeedActiveSkill":false},
-    {"ID":363102,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":40,"CraftCosts":[[100718,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200310,"NeedActiveSkill":false},
-    {"ID":363103,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":40,"CraftCosts":[[100719,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200310,"NeedActiveSkill":false},
-    {"ID":363104,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":40,"CraftCosts":[[100720,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[2,5000],[3,5000]],"ExtraAttrPool":15,"RareSkillProb":0,"RandomSkillPools":[],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200310,"NeedActiveSkill":false}
+    {"ID":351001,"Quality":5,"Job":1,"EquipType":1,"NeedLevel":30,"CraftCosts":[[100031,1],[100103,6],[1,80000]],"BaseAttrRange":[[10031,465,651],[10041,713,1070]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":13,"RareSkillProb":5000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":351002,"Quality":5,"Job":1,"EquipType":2,"NeedLevel":30,"CraftCosts":[[100032,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2500,3750]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":13,"RareSkillProb":5000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":351003,"Quality":5,"Job":1,"EquipType":3,"NeedLevel":30,"CraftCosts":[[100033,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2500,3750]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":13,"RareSkillProb":5000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":351004,"Quality":5,"Job":1,"EquipType":4,"NeedLevel":30,"CraftCosts":[[100034,1],[100103,3],[1,50000]],"BaseAttrRange":[[10061,521,730],[10071,799,1199]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":13,"RareSkillProb":5000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":352001,"Quality":5,"Job":2,"EquipType":1,"NeedLevel":30,"CraftCosts":[[100031,1],[100103,6],[1,80000]],"BaseAttrRange":[[10031,497,696],[10041,763,1144]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":14,"RareSkillProb":5000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":352002,"Quality":5,"Job":2,"EquipType":2,"NeedLevel":30,"CraftCosts":[[100032,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2400,3600]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":14,"RareSkillProb":5000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":352003,"Quality":5,"Job":2,"EquipType":3,"NeedLevel":30,"CraftCosts":[[100033,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2400,3600]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":14,"RareSkillProb":5000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":352004,"Quality":5,"Job":2,"EquipType":4,"NeedLevel":30,"CraftCosts":[[100034,1],[100103,3],[1,50000]],"BaseAttrRange":[[10061,465,651],[10071,713,1070]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":14,"RareSkillProb":5000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":353001,"Quality":5,"Job":3,"EquipType":1,"NeedLevel":30,"CraftCosts":[[100031,1],[100103,6],[1,80000]],"BaseAttrRange":[[10031,529,741],[10041,812,1218]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":15,"RareSkillProb":5000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":353002,"Quality":5,"Job":3,"EquipType":2,"NeedLevel":30,"CraftCosts":[[100032,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2250,3375]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":15,"RareSkillProb":5000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":353003,"Quality":5,"Job":3,"EquipType":3,"NeedLevel":30,"CraftCosts":[[100033,1],[100103,3],[1,50000]],"BaseAttrRange":[[10021,2250,3375]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":15,"RareSkillProb":5000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":353004,"Quality":5,"Job":3,"EquipType":4,"NeedLevel":30,"CraftCosts":[[100034,1],[100103,3],[1,50000]],"BaseAttrRange":[[10061,401,562],[10071,615,922]],"RandomAttrNumRange":[[2,7000],[3,3000]],"ExtraAttrPool":15,"RareSkillProb":5000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":0,"NeedActiveSkill":false},
+    {"ID":361011,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100601,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[101100,1],"RareSkillPool":0,"EquipHeroID":200101,"NeedActiveSkill":false},
+    {"ID":361012,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100602,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":2001012,"EquipHeroID":200101,"NeedActiveSkill":false},
+    {"ID":361013,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100603,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":2001013,"EquipHeroID":200101,"NeedActiveSkill":false},
+    {"ID":361014,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100604,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":2001014,"EquipHeroID":200101,"NeedActiveSkill":false},
+    {"ID":361021,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100605,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200102,"NeedActiveSkill":false},
+    {"ID":361022,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100606,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200102,"NeedActiveSkill":false},
+    {"ID":361023,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100607,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200102,"NeedActiveSkill":false},
+    {"ID":361024,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100608,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200102,"NeedActiveSkill":false},
+    {"ID":361031,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100609,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200103,"NeedActiveSkill":false},
+    {"ID":361032,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100610,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200103,"NeedActiveSkill":false},
+    {"ID":361033,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100611,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200103,"NeedActiveSkill":false},
+    {"ID":361034,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100612,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200103,"NeedActiveSkill":false},
+    {"ID":361041,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100613,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200104,"NeedActiveSkill":false},
+    {"ID":361042,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100614,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200104,"NeedActiveSkill":false},
+    {"ID":361043,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100615,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200104,"NeedActiveSkill":false},
+    {"ID":361044,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100616,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200104,"NeedActiveSkill":false},
+    {"ID":361051,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100617,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200105,"NeedActiveSkill":false},
+    {"ID":361052,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100618,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200105,"NeedActiveSkill":false},
+    {"ID":361053,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100619,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200105,"NeedActiveSkill":false},
+    {"ID":361054,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100620,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200105,"NeedActiveSkill":false},
+    {"ID":361061,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100621,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200106,"NeedActiveSkill":false},
+    {"ID":361062,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100622,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200106,"NeedActiveSkill":false},
+    {"ID":361063,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100623,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200106,"NeedActiveSkill":false},
+    {"ID":361064,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100624,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200106,"NeedActiveSkill":false},
+    {"ID":361071,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100625,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200107,"NeedActiveSkill":false},
+    {"ID":361072,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100626,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200107,"NeedActiveSkill":false},
+    {"ID":361073,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100627,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200107,"NeedActiveSkill":false},
+    {"ID":361074,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100628,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200107,"NeedActiveSkill":false},
+    {"ID":361081,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100629,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200108,"NeedActiveSkill":false},
+    {"ID":361082,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100630,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200108,"NeedActiveSkill":false},
+    {"ID":361083,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100631,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200108,"NeedActiveSkill":false},
+    {"ID":361084,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100632,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200108,"NeedActiveSkill":false},
+    {"ID":361091,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100633,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200109,"NeedActiveSkill":false},
+    {"ID":361092,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100634,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200109,"NeedActiveSkill":false},
+    {"ID":361093,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100635,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200109,"NeedActiveSkill":false},
+    {"ID":361094,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100636,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200109,"NeedActiveSkill":false},
+    {"ID":361101,"Quality":6,"Job":1,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100637,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,558,651],[10041,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200110,"NeedActiveSkill":false},
+    {"ID":361102,"Quality":6,"Job":1,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100638,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200110,"NeedActiveSkill":false},
+    {"ID":361103,"Quality":6,"Job":1,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100639,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,3000,3750]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200110,"NeedActiveSkill":false},
+    {"ID":361104,"Quality":6,"Job":1,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100640,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,625,730],[10071,959,1199]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":16,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200110,"NeedActiveSkill":false},
+    {"ID":362011,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100641,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200201,"NeedActiveSkill":false},
+    {"ID":362012,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100642,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200201,"NeedActiveSkill":false},
+    {"ID":362013,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100643,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200201,"NeedActiveSkill":false},
+    {"ID":362014,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100644,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200201,"NeedActiveSkill":false},
+    {"ID":362021,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100645,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200202,"NeedActiveSkill":false},
+    {"ID":362022,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100646,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200202,"NeedActiveSkill":false},
+    {"ID":362023,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100647,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200202,"NeedActiveSkill":false},
+    {"ID":362024,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100648,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200202,"NeedActiveSkill":false},
+    {"ID":362031,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100649,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200203,"NeedActiveSkill":false},
+    {"ID":362032,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100650,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200203,"NeedActiveSkill":false},
+    {"ID":362033,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100651,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200203,"NeedActiveSkill":false},
+    {"ID":362034,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100652,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200203,"NeedActiveSkill":false},
+    {"ID":362041,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100653,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200204,"NeedActiveSkill":false},
+    {"ID":362042,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100654,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200204,"NeedActiveSkill":false},
+    {"ID":362043,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100655,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200204,"NeedActiveSkill":false},
+    {"ID":362044,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100656,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200204,"NeedActiveSkill":false},
+    {"ID":362051,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100657,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200205,"NeedActiveSkill":false},
+    {"ID":362052,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100658,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200205,"NeedActiveSkill":false},
+    {"ID":362053,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100659,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200205,"NeedActiveSkill":false},
+    {"ID":362054,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100660,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200205,"NeedActiveSkill":false},
+    {"ID":362061,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100661,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200206,"NeedActiveSkill":false},
+    {"ID":362062,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100662,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200206,"NeedActiveSkill":false},
+    {"ID":362063,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100663,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200206,"NeedActiveSkill":false},
+    {"ID":362064,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100664,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200206,"NeedActiveSkill":false},
+    {"ID":362071,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100665,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200207,"NeedActiveSkill":false},
+    {"ID":362072,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100666,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200207,"NeedActiveSkill":false},
+    {"ID":362073,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100667,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200207,"NeedActiveSkill":false},
+    {"ID":362074,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100668,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200207,"NeedActiveSkill":false},
+    {"ID":362081,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100669,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200208,"NeedActiveSkill":false},
+    {"ID":362082,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100670,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200208,"NeedActiveSkill":false},
+    {"ID":362083,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100671,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200208,"NeedActiveSkill":false},
+    {"ID":362084,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100672,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200208,"NeedActiveSkill":false},
+    {"ID":362091,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100673,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200209,"NeedActiveSkill":false},
+    {"ID":362092,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100674,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200209,"NeedActiveSkill":false},
+    {"ID":362093,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100675,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200209,"NeedActiveSkill":false},
+    {"ID":362094,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100676,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200209,"NeedActiveSkill":false},
+    {"ID":362101,"Quality":6,"Job":2,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100677,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,596,696],[10041,916,1144]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200210,"NeedActiveSkill":false},
+    {"ID":362102,"Quality":6,"Job":2,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100678,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200210,"NeedActiveSkill":false},
+    {"ID":362103,"Quality":6,"Job":2,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100679,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2880,3600]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200210,"NeedActiveSkill":false},
+    {"ID":362104,"Quality":6,"Job":2,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100680,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,558,651],[10071,856,1070]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":17,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200210,"NeedActiveSkill":false},
+    {"ID":363011,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100681,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200301,"NeedActiveSkill":false},
+    {"ID":363012,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100682,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200301,"NeedActiveSkill":false},
+    {"ID":363013,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100683,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200301,"NeedActiveSkill":false},
+    {"ID":363014,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100684,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200301,"NeedActiveSkill":false},
+    {"ID":363021,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100685,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200302,"NeedActiveSkill":false},
+    {"ID":363022,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100686,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200302,"NeedActiveSkill":false},
+    {"ID":363023,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100687,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200302,"NeedActiveSkill":false},
+    {"ID":363024,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100688,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200302,"NeedActiveSkill":false},
+    {"ID":363031,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100689,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200303,"NeedActiveSkill":false},
+    {"ID":363032,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100690,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200303,"NeedActiveSkill":false},
+    {"ID":363033,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100691,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200303,"NeedActiveSkill":false},
+    {"ID":363034,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100692,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200303,"NeedActiveSkill":false},
+    {"ID":363041,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100693,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200304,"NeedActiveSkill":false},
+    {"ID":363042,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100694,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200304,"NeedActiveSkill":false},
+    {"ID":363043,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100695,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200304,"NeedActiveSkill":false},
+    {"ID":363044,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100696,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200304,"NeedActiveSkill":false},
+    {"ID":363051,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100697,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200305,"NeedActiveSkill":false},
+    {"ID":363052,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100698,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200305,"NeedActiveSkill":false},
+    {"ID":363053,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100699,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200305,"NeedActiveSkill":false},
+    {"ID":363054,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100700,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200305,"NeedActiveSkill":false},
+    {"ID":363061,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100701,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200306,"NeedActiveSkill":false},
+    {"ID":363062,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100702,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200306,"NeedActiveSkill":false},
+    {"ID":363063,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100703,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200306,"NeedActiveSkill":false},
+    {"ID":363064,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100704,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200306,"NeedActiveSkill":false},
+    {"ID":363071,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100705,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200307,"NeedActiveSkill":false},
+    {"ID":363072,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100706,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200307,"NeedActiveSkill":false},
+    {"ID":363073,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100707,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200307,"NeedActiveSkill":false},
+    {"ID":363074,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100708,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200307,"NeedActiveSkill":false},
+    {"ID":363081,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100709,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200308,"NeedActiveSkill":false},
+    {"ID":363082,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100710,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200308,"NeedActiveSkill":false},
+    {"ID":363083,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100711,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200308,"NeedActiveSkill":false},
+    {"ID":363084,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100712,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200308,"NeedActiveSkill":false},
+    {"ID":363091,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100713,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200309,"NeedActiveSkill":false},
+    {"ID":363092,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100714,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200309,"NeedActiveSkill":false},
+    {"ID":363093,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100715,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200309,"NeedActiveSkill":false},
+    {"ID":363094,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100716,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200309,"NeedActiveSkill":false},
+    {"ID":363101,"Quality":6,"Job":3,"EquipType":1,"NeedLevel":35,"CraftCosts":[[100717,1],[100103,20],[100104,10]],"BaseAttrRange":[[10031,635,741],[10041,974,1218]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001011,1000],[2001012,9000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200310,"NeedActiveSkill":false},
+    {"ID":363102,"Quality":6,"Job":3,"EquipType":2,"NeedLevel":35,"CraftCosts":[[100718,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200310,"NeedActiveSkill":false},
+    {"ID":363103,"Quality":6,"Job":3,"EquipType":3,"NeedLevel":35,"CraftCosts":[[100719,1],[100103,10],[100104,5]],"BaseAttrRange":[[10021,2700,3375]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200310,"NeedActiveSkill":false},
+    {"ID":363104,"Quality":6,"Job":3,"EquipType":4,"NeedLevel":35,"CraftCosts":[[100720,1],[100103,10],[100104,5]],"BaseAttrRange":[[10061,481,562],[10071,738,922]],"RandomAttrNumRange":[[3,10000]],"ExtraAttrPool":18,"RareSkillProb":10000,"RandomSkillPools":[[2001012,10000]],"SkillID":[],"RareSkillPool":0,"EquipHeroID":200310,"NeedActiveSkill":false}
 ]

+ 162 - 135
sr/etc/data/equip_attr_extra.json

@@ -1,137 +1,164 @@
 [
-    {"PoolID":1,"No":1,"Key":10031,"MinValue":19,"MaxValue":27,"Weight":1500},
-    {"PoolID":1,"No":2,"Key":10041,"MinValue":27,"MaxValue":41,"Weight":1500},
-    {"PoolID":1,"No":3,"Key":10021,"MinValue":103,"MaxValue":154,"Weight":2000},
-    {"PoolID":1,"No":4,"Key":10061,"MinValue":22,"MaxValue":32,"Weight":1500},
-    {"PoolID":1,"No":5,"Key":10071,"MinValue":32,"MaxValue":49,"Weight":1500},
-    {"PoolID":1,"No":6,"Key":10081,"MinValue":250,"MaxValue":375,"Weight":500},
-    {"PoolID":1,"No":7,"Key":10091,"MinValue":250,"MaxValue":375,"Weight":500},
-    {"PoolID":1,"No":8,"Key":10101,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":1,"No":9,"Key":10111,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":2,"No":1,"Key":10031,"MinValue":21,"MaxValue":30,"Weight":1500},
-    {"PoolID":2,"No":2,"Key":10041,"MinValue":31,"MaxValue":46,"Weight":1500},
-    {"PoolID":2,"No":3,"Key":10021,"MinValue":99,"MaxValue":148,"Weight":2000},
-    {"PoolID":2,"No":4,"Key":10061,"MinValue":20,"MaxValue":28,"Weight":1500},
-    {"PoolID":2,"No":5,"Key":10071,"MinValue":29,"MaxValue":43,"Weight":1500},
-    {"PoolID":2,"No":6,"Key":10081,"MinValue":250,"MaxValue":375,"Weight":500},
-    {"PoolID":2,"No":7,"Key":10091,"MinValue":250,"MaxValue":375,"Weight":500},
-    {"PoolID":2,"No":8,"Key":10101,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":2,"No":9,"Key":10111,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":3,"No":1,"Key":10031,"MinValue":22,"MaxValue":32,"Weight":1500},
-    {"PoolID":3,"No":2,"Key":10041,"MinValue":33,"MaxValue":49,"Weight":1500},
-    {"PoolID":3,"No":3,"Key":10021,"MinValue":93,"MaxValue":139,"Weight":2000},
-    {"PoolID":3,"No":4,"Key":10061,"MinValue":17,"MaxValue":24,"Weight":1500},
-    {"PoolID":3,"No":5,"Key":10071,"MinValue":25,"MaxValue":37,"Weight":1500},
-    {"PoolID":3,"No":6,"Key":10081,"MinValue":250,"MaxValue":375,"Weight":500},
-    {"PoolID":3,"No":7,"Key":10091,"MinValue":250,"MaxValue":375,"Weight":500},
-    {"PoolID":3,"No":8,"Key":10101,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":3,"No":9,"Key":10111,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":4,"No":1,"Key":10031,"MinValue":37,"MaxValue":53,"Weight":1500},
-    {"PoolID":4,"No":2,"Key":10041,"MinValue":54,"MaxValue":82,"Weight":1500},
-    {"PoolID":4,"No":3,"Key":10021,"MinValue":205,"MaxValue":308,"Weight":2000},
-    {"PoolID":4,"No":4,"Key":10061,"MinValue":43,"MaxValue":63,"Weight":1500},
-    {"PoolID":4,"No":5,"Key":10071,"MinValue":64,"MaxValue":97,"Weight":1500},
-    {"PoolID":4,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":4,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":4,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":4,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":5,"No":1,"Key":10031,"MinValue":41,"MaxValue":60,"Weight":1500},
-    {"PoolID":5,"No":2,"Key":10041,"MinValue":61,"MaxValue":92,"Weight":1500},
-    {"PoolID":5,"No":3,"Key":10021,"MinValue":197,"MaxValue":296,"Weight":2000},
-    {"PoolID":5,"No":4,"Key":10061,"MinValue":39,"MaxValue":56,"Weight":1500},
-    {"PoolID":5,"No":5,"Key":10071,"MinValue":57,"MaxValue":86,"Weight":1500},
-    {"PoolID":5,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":5,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":5,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":5,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":6,"No":1,"Key":10031,"MinValue":44,"MaxValue":63,"Weight":1500},
-    {"PoolID":6,"No":2,"Key":10041,"MinValue":65,"MaxValue":98,"Weight":1500},
-    {"PoolID":6,"No":3,"Key":10021,"MinValue":185,"MaxValue":277,"Weight":2000},
-    {"PoolID":6,"No":4,"Key":10061,"MinValue":33,"MaxValue":48,"Weight":1500},
-    {"PoolID":6,"No":5,"Key":10071,"MinValue":49,"MaxValue":74,"Weight":1500},
-    {"PoolID":6,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":6,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":6,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":6,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":7,"No":1,"Key":10031,"MinValue":81,"MaxValue":116,"Weight":1500},
-    {"PoolID":7,"No":2,"Key":10041,"MinValue":121,"MaxValue":182,"Weight":1500},
-    {"PoolID":7,"No":3,"Key":10021,"MinValue":454,"MaxValue":681,"Weight":2000},
-    {"PoolID":7,"No":4,"Key":10061,"MinValue":95,"MaxValue":137,"Weight":1500},
-    {"PoolID":7,"No":5,"Key":10071,"MinValue":143,"MaxValue":215,"Weight":1500},
-    {"PoolID":7,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":7,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":7,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":7,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":8,"No":1,"Key":10031,"MinValue":91,"MaxValue":131,"Weight":1500},
-    {"PoolID":8,"No":2,"Key":10041,"MinValue":137,"MaxValue":205,"Weight":1500},
-    {"PoolID":8,"No":3,"Key":10021,"MinValue":436,"MaxValue":654,"Weight":2000},
-    {"PoolID":8,"No":4,"Key":10061,"MinValue":85,"MaxValue":122,"Weight":1500},
-    {"PoolID":8,"No":5,"Key":10071,"MinValue":128,"MaxValue":192,"Weight":1500},
-    {"PoolID":8,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":8,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":8,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":8,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":9,"No":1,"Key":10031,"MinValue":97,"MaxValue":139,"Weight":1500},
-    {"PoolID":9,"No":2,"Key":10041,"MinValue":145,"MaxValue":218,"Weight":1500},
-    {"PoolID":9,"No":3,"Key":10021,"MinValue":409,"MaxValue":613,"Weight":2000},
-    {"PoolID":9,"No":4,"Key":10061,"MinValue":73,"MaxValue":105,"Weight":1500},
-    {"PoolID":9,"No":5,"Key":10071,"MinValue":110,"MaxValue":165,"Weight":1500},
-    {"PoolID":9,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":9,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":9,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":9,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":10,"No":1,"Key":10031,"MinValue":142,"MaxValue":204,"Weight":1500},
-    {"PoolID":10,"No":2,"Key":10041,"MinValue":215,"MaxValue":322,"Weight":1500},
-    {"PoolID":10,"No":3,"Key":10021,"MinValue":802,"MaxValue":1203,"Weight":2000},
-    {"PoolID":10,"No":4,"Key":10061,"MinValue":168,"MaxValue":241,"Weight":1500},
-    {"PoolID":10,"No":5,"Key":10071,"MinValue":254,"MaxValue":380,"Weight":1500},
-    {"PoolID":10,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":10,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":10,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":10,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":11,"No":1,"Key":10031,"MinValue":160,"MaxValue":230,"Weight":1500},
-    {"PoolID":11,"No":2,"Key":10041,"MinValue":242,"MaxValue":363,"Weight":1500},
-    {"PoolID":11,"No":3,"Key":10021,"MinValue":770,"MaxValue":1155,"Weight":2000},
-    {"PoolID":11,"No":4,"Key":10061,"MinValue":150,"MaxValue":215,"Weight":1500},
-    {"PoolID":11,"No":5,"Key":10071,"MinValue":226,"MaxValue":339,"Weight":1500},
-    {"PoolID":11,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":11,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":11,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":11,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":12,"No":1,"Key":10031,"MinValue":170,"MaxValue":245,"Weight":1500},
-    {"PoolID":12,"No":2,"Key":10041,"MinValue":257,"MaxValue":386,"Weight":1500},
-    {"PoolID":12,"No":3,"Key":10021,"MinValue":722,"MaxValue":1083,"Weight":2000},
-    {"PoolID":12,"No":4,"Key":10061,"MinValue":129,"MaxValue":186,"Weight":1500},
-    {"PoolID":12,"No":5,"Key":10071,"MinValue":195,"MaxValue":293,"Weight":1500},
-    {"PoolID":12,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":12,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":12,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":12,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":13,"No":1,"Key":10031,"MinValue":221,"MaxValue":318,"Weight":1500},
-    {"PoolID":13,"No":2,"Key":10041,"MinValue":335,"MaxValue":502,"Weight":1500},
-    {"PoolID":13,"No":3,"Key":10021,"MinValue":1250,"MaxValue":1875,"Weight":2000},
-    {"PoolID":13,"No":4,"Key":10061,"MinValue":261,"MaxValue":375,"Weight":1500},
-    {"PoolID":13,"No":5,"Key":10071,"MinValue":396,"MaxValue":593,"Weight":1500},
-    {"PoolID":13,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":13,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":13,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":13,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":14,"No":1,"Key":10031,"MinValue":249,"MaxValue":358,"Weight":1500},
-    {"PoolID":14,"No":2,"Key":10041,"MinValue":377,"MaxValue":566,"Weight":1500},
-    {"PoolID":14,"No":3,"Key":10021,"MinValue":1200,"MaxValue":1800,"Weight":2000},
-    {"PoolID":14,"No":4,"Key":10061,"MinValue":233,"MaxValue":335,"Weight":1500},
-    {"PoolID":14,"No":5,"Key":10071,"MinValue":353,"MaxValue":529,"Weight":1500},
-    {"PoolID":14,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":14,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":14,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":14,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":15,"No":1,"Key":10031,"MinValue":265,"MaxValue":381,"Weight":1500},
-    {"PoolID":15,"No":2,"Key":10041,"MinValue":402,"MaxValue":602,"Weight":1500},
-    {"PoolID":15,"No":3,"Key":10021,"MinValue":1125,"MaxValue":1688,"Weight":2000},
-    {"PoolID":15,"No":4,"Key":10061,"MinValue":201,"MaxValue":289,"Weight":1500},
-    {"PoolID":15,"No":5,"Key":10071,"MinValue":304,"MaxValue":456,"Weight":1500},
-    {"PoolID":15,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":15,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":500},
-    {"PoolID":15,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":500},
-    {"PoolID":15,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":500}
+    {"PoolID":1,"No":1,"Key":10031,"MinValue":48,"MaxValue":72,"Weight":1250},
+    {"PoolID":1,"No":2,"Key":10041,"MinValue":48,"MaxValue":72,"Weight":1250},
+    {"PoolID":1,"No":3,"Key":10021,"MinValue":103,"MaxValue":154,"Weight":2500},
+    {"PoolID":1,"No":4,"Key":10061,"MinValue":54,"MaxValue":80,"Weight":1250},
+    {"PoolID":1,"No":5,"Key":10071,"MinValue":54,"MaxValue":80,"Weight":1250},
+    {"PoolID":1,"No":6,"Key":10081,"MinValue":150,"MaxValue":225,"Weight":625},
+    {"PoolID":1,"No":7,"Key":10091,"MinValue":150,"MaxValue":225,"Weight":625},
+    {"PoolID":1,"No":8,"Key":10101,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":1,"No":9,"Key":10111,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":2,"No":1,"Key":10031,"MinValue":51,"MaxValue":77,"Weight":1250},
+    {"PoolID":2,"No":2,"Key":10041,"MinValue":51,"MaxValue":77,"Weight":1250},
+    {"PoolID":2,"No":3,"Key":10021,"MinValue":99,"MaxValue":148,"Weight":2500},
+    {"PoolID":2,"No":4,"Key":10061,"MinValue":48,"MaxValue":72,"Weight":1250},
+    {"PoolID":2,"No":5,"Key":10071,"MinValue":48,"MaxValue":72,"Weight":1250},
+    {"PoolID":2,"No":6,"Key":10081,"MinValue":150,"MaxValue":225,"Weight":625},
+    {"PoolID":2,"No":7,"Key":10091,"MinValue":150,"MaxValue":225,"Weight":625},
+    {"PoolID":2,"No":8,"Key":10101,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":2,"No":9,"Key":10111,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":3,"No":1,"Key":10031,"MinValue":54,"MaxValue":82,"Weight":1250},
+    {"PoolID":3,"No":2,"Key":10041,"MinValue":54,"MaxValue":82,"Weight":1250},
+    {"PoolID":3,"No":3,"Key":10021,"MinValue":93,"MaxValue":139,"Weight":2500},
+    {"PoolID":3,"No":4,"Key":10061,"MinValue":41,"MaxValue":62,"Weight":1250},
+    {"PoolID":3,"No":5,"Key":10071,"MinValue":41,"MaxValue":62,"Weight":1250},
+    {"PoolID":3,"No":6,"Key":10081,"MinValue":150,"MaxValue":225,"Weight":625},
+    {"PoolID":3,"No":7,"Key":10091,"MinValue":150,"MaxValue":225,"Weight":625},
+    {"PoolID":3,"No":8,"Key":10101,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":3,"No":9,"Key":10111,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":4,"No":1,"Key":10031,"MinValue":95,"MaxValue":143,"Weight":1250},
+    {"PoolID":4,"No":2,"Key":10041,"MinValue":95,"MaxValue":143,"Weight":1250},
+    {"PoolID":4,"No":3,"Key":10021,"MinValue":205,"MaxValue":308,"Weight":2500},
+    {"PoolID":4,"No":4,"Key":10061,"MinValue":107,"MaxValue":160,"Weight":1250},
+    {"PoolID":4,"No":5,"Key":10071,"MinValue":107,"MaxValue":160,"Weight":1250},
+    {"PoolID":4,"No":6,"Key":10081,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":4,"No":7,"Key":10091,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":4,"No":8,"Key":10101,"MinValue":600,"MaxValue":900,"Weight":625},
+    {"PoolID":4,"No":9,"Key":10111,"MinValue":600,"MaxValue":900,"Weight":625},
+    {"PoolID":5,"No":1,"Key":10031,"MinValue":102,"MaxValue":153,"Weight":1250},
+    {"PoolID":5,"No":2,"Key":10041,"MinValue":102,"MaxValue":153,"Weight":1250},
+    {"PoolID":5,"No":3,"Key":10021,"MinValue":197,"MaxValue":296,"Weight":2500},
+    {"PoolID":5,"No":4,"Key":10061,"MinValue":95,"MaxValue":143,"Weight":1250},
+    {"PoolID":5,"No":5,"Key":10071,"MinValue":95,"MaxValue":143,"Weight":1250},
+    {"PoolID":5,"No":6,"Key":10081,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":5,"No":7,"Key":10091,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":5,"No":8,"Key":10101,"MinValue":600,"MaxValue":900,"Weight":625},
+    {"PoolID":5,"No":9,"Key":10111,"MinValue":600,"MaxValue":900,"Weight":625},
+    {"PoolID":6,"No":1,"Key":10031,"MinValue":108,"MaxValue":163,"Weight":1250},
+    {"PoolID":6,"No":2,"Key":10041,"MinValue":108,"MaxValue":163,"Weight":1250},
+    {"PoolID":6,"No":3,"Key":10021,"MinValue":185,"MaxValue":277,"Weight":2500},
+    {"PoolID":6,"No":4,"Key":10061,"MinValue":82,"MaxValue":123,"Weight":1250},
+    {"PoolID":6,"No":5,"Key":10071,"MinValue":82,"MaxValue":123,"Weight":1250},
+    {"PoolID":6,"No":6,"Key":10081,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":6,"No":7,"Key":10091,"MinValue":300,"MaxValue":450,"Weight":625},
+    {"PoolID":6,"No":8,"Key":10101,"MinValue":600,"MaxValue":900,"Weight":625},
+    {"PoolID":6,"No":9,"Key":10111,"MinValue":600,"MaxValue":900,"Weight":625},
+    {"PoolID":7,"No":1,"Key":10031,"MinValue":190,"MaxValue":284,"Weight":1250},
+    {"PoolID":7,"No":2,"Key":10041,"MinValue":190,"MaxValue":284,"Weight":1250},
+    {"PoolID":7,"No":3,"Key":10021,"MinValue":409,"MaxValue":613,"Weight":2500},
+    {"PoolID":7,"No":4,"Key":10061,"MinValue":212,"MaxValue":319,"Weight":1250},
+    {"PoolID":7,"No":5,"Key":10071,"MinValue":212,"MaxValue":319,"Weight":1250},
+    {"PoolID":7,"No":6,"Key":10081,"MinValue":350,"MaxValue":525,"Weight":625},
+    {"PoolID":7,"No":7,"Key":10091,"MinValue":350,"MaxValue":525,"Weight":625},
+    {"PoolID":7,"No":8,"Key":10101,"MinValue":700,"MaxValue":1050,"Weight":625},
+    {"PoolID":7,"No":9,"Key":10111,"MinValue":700,"MaxValue":1050,"Weight":625},
+    {"PoolID":8,"No":1,"Key":10031,"MinValue":203,"MaxValue":304,"Weight":1250},
+    {"PoolID":8,"No":2,"Key":10041,"MinValue":203,"MaxValue":304,"Weight":1250},
+    {"PoolID":8,"No":3,"Key":10021,"MinValue":392,"MaxValue":588,"Weight":2500},
+    {"PoolID":8,"No":4,"Key":10061,"MinValue":190,"MaxValue":284,"Weight":1250},
+    {"PoolID":8,"No":5,"Key":10071,"MinValue":190,"MaxValue":284,"Weight":1250},
+    {"PoolID":8,"No":6,"Key":10081,"MinValue":350,"MaxValue":525,"Weight":625},
+    {"PoolID":8,"No":7,"Key":10091,"MinValue":350,"MaxValue":525,"Weight":625},
+    {"PoolID":8,"No":8,"Key":10101,"MinValue":700,"MaxValue":1050,"Weight":625},
+    {"PoolID":8,"No":9,"Key":10111,"MinValue":700,"MaxValue":1050,"Weight":625},
+    {"PoolID":9,"No":1,"Key":10031,"MinValue":216,"MaxValue":324,"Weight":1250},
+    {"PoolID":9,"No":2,"Key":10041,"MinValue":216,"MaxValue":324,"Weight":1250},
+    {"PoolID":9,"No":3,"Key":10021,"MinValue":368,"MaxValue":552,"Weight":2500},
+    {"PoolID":9,"No":4,"Key":10061,"MinValue":163,"MaxValue":245,"Weight":1250},
+    {"PoolID":9,"No":5,"Key":10071,"MinValue":163,"MaxValue":245,"Weight":1250},
+    {"PoolID":9,"No":6,"Key":10081,"MinValue":350,"MaxValue":525,"Weight":625},
+    {"PoolID":9,"No":7,"Key":10091,"MinValue":350,"MaxValue":525,"Weight":625},
+    {"PoolID":9,"No":8,"Key":10101,"MinValue":700,"MaxValue":1050,"Weight":625},
+    {"PoolID":9,"No":9,"Key":10111,"MinValue":700,"MaxValue":1050,"Weight":625},
+    {"PoolID":10,"No":1,"Key":10031,"MinValue":354,"MaxValue":530,"Weight":1250},
+    {"PoolID":10,"No":2,"Key":10041,"MinValue":354,"MaxValue":530,"Weight":1250},
+    {"PoolID":10,"No":3,"Key":10021,"MinValue":762,"MaxValue":1143,"Weight":2500},
+    {"PoolID":10,"No":4,"Key":10061,"MinValue":396,"MaxValue":594,"Weight":1250},
+    {"PoolID":10,"No":5,"Key":10071,"MinValue":396,"MaxValue":594,"Weight":1250},
+    {"PoolID":10,"No":6,"Key":10081,"MinValue":400,"MaxValue":600,"Weight":625},
+    {"PoolID":10,"No":7,"Key":10091,"MinValue":400,"MaxValue":600,"Weight":625},
+    {"PoolID":10,"No":8,"Key":10101,"MinValue":800,"MaxValue":1200,"Weight":625},
+    {"PoolID":10,"No":9,"Key":10111,"MinValue":800,"MaxValue":1200,"Weight":625},
+    {"PoolID":11,"No":1,"Key":10031,"MinValue":378,"MaxValue":567,"Weight":1250},
+    {"PoolID":11,"No":2,"Key":10041,"MinValue":378,"MaxValue":567,"Weight":1250},
+    {"PoolID":11,"No":3,"Key":10021,"MinValue":732,"MaxValue":1097,"Weight":2500},
+    {"PoolID":11,"No":4,"Key":10061,"MinValue":354,"MaxValue":530,"Weight":1250},
+    {"PoolID":11,"No":5,"Key":10071,"MinValue":354,"MaxValue":530,"Weight":1250},
+    {"PoolID":11,"No":6,"Key":10081,"MinValue":400,"MaxValue":600,"Weight":625},
+    {"PoolID":11,"No":7,"Key":10091,"MinValue":400,"MaxValue":600,"Weight":625},
+    {"PoolID":11,"No":8,"Key":10101,"MinValue":800,"MaxValue":1200,"Weight":625},
+    {"PoolID":11,"No":9,"Key":10111,"MinValue":800,"MaxValue":1200,"Weight":625},
+    {"PoolID":12,"No":1,"Key":10031,"MinValue":402,"MaxValue":604,"Weight":1250},
+    {"PoolID":12,"No":2,"Key":10041,"MinValue":402,"MaxValue":604,"Weight":1250},
+    {"PoolID":12,"No":3,"Key":10021,"MinValue":686,"MaxValue":1029,"Weight":2500},
+    {"PoolID":12,"No":4,"Key":10061,"MinValue":305,"MaxValue":457,"Weight":1250},
+    {"PoolID":12,"No":5,"Key":10071,"MinValue":305,"MaxValue":457,"Weight":1250},
+    {"PoolID":12,"No":6,"Key":10081,"MinValue":400,"MaxValue":600,"Weight":625},
+    {"PoolID":12,"No":7,"Key":10091,"MinValue":400,"MaxValue":600,"Weight":625},
+    {"PoolID":12,"No":8,"Key":10101,"MinValue":800,"MaxValue":1200,"Weight":625},
+    {"PoolID":12,"No":9,"Key":10111,"MinValue":800,"MaxValue":1200,"Weight":625},
+    {"PoolID":13,"No":1,"Key":10031,"MinValue":580,"MaxValue":870,"Weight":1250},
+    {"PoolID":13,"No":2,"Key":10041,"MinValue":580,"MaxValue":870,"Weight":1250},
+    {"PoolID":13,"No":3,"Key":10021,"MinValue":1250,"MaxValue":1875,"Weight":2500},
+    {"PoolID":13,"No":4,"Key":10061,"MinValue":650,"MaxValue":975,"Weight":1250},
+    {"PoolID":13,"No":5,"Key":10071,"MinValue":650,"MaxValue":975,"Weight":1250},
+    {"PoolID":13,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":625},
+    {"PoolID":13,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":625},
+    {"PoolID":13,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":625},
+    {"PoolID":13,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":625},
+    {"PoolID":14,"No":1,"Key":10031,"MinValue":620,"MaxValue":930,"Weight":1250},
+    {"PoolID":14,"No":2,"Key":10041,"MinValue":620,"MaxValue":930,"Weight":1250},
+    {"PoolID":14,"No":3,"Key":10021,"MinValue":1200,"MaxValue":1800,"Weight":2500},
+    {"PoolID":14,"No":4,"Key":10061,"MinValue":580,"MaxValue":870,"Weight":1250},
+    {"PoolID":14,"No":5,"Key":10071,"MinValue":580,"MaxValue":870,"Weight":1250},
+    {"PoolID":14,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":625},
+    {"PoolID":14,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":625},
+    {"PoolID":14,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":625},
+    {"PoolID":14,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":625},
+    {"PoolID":15,"No":1,"Key":10031,"MinValue":660,"MaxValue":990,"Weight":1250},
+    {"PoolID":15,"No":2,"Key":10041,"MinValue":660,"MaxValue":990,"Weight":1250},
+    {"PoolID":15,"No":3,"Key":10021,"MinValue":1125,"MaxValue":1688,"Weight":2500},
+    {"PoolID":15,"No":4,"Key":10061,"MinValue":500,"MaxValue":750,"Weight":1250},
+    {"PoolID":15,"No":5,"Key":10071,"MinValue":500,"MaxValue":750,"Weight":1250},
+    {"PoolID":15,"No":6,"Key":10081,"MinValue":500,"MaxValue":750,"Weight":625},
+    {"PoolID":15,"No":7,"Key":10091,"MinValue":500,"MaxValue":750,"Weight":625},
+    {"PoolID":15,"No":8,"Key":10101,"MinValue":1000,"MaxValue":1500,"Weight":625},
+    {"PoolID":15,"No":9,"Key":10111,"MinValue":1000,"MaxValue":1500,"Weight":625},
+    {"PoolID":16,"No":1,"Key":10031,"MinValue":696,"MaxValue":870,"Weight":1250},
+    {"PoolID":16,"No":2,"Key":10041,"MinValue":696,"MaxValue":870,"Weight":1250},
+    {"PoolID":16,"No":3,"Key":10021,"MinValue":1500,"MaxValue":1875,"Weight":2500},
+    {"PoolID":16,"No":4,"Key":10061,"MinValue":780,"MaxValue":975,"Weight":1250},
+    {"PoolID":16,"No":5,"Key":10071,"MinValue":780,"MaxValue":975,"Weight":1250},
+    {"PoolID":16,"No":6,"Key":10081,"MinValue":600,"MaxValue":750,"Weight":625},
+    {"PoolID":16,"No":7,"Key":10091,"MinValue":600,"MaxValue":750,"Weight":625},
+    {"PoolID":16,"No":8,"Key":10101,"MinValue":1200,"MaxValue":1500,"Weight":625},
+    {"PoolID":16,"No":9,"Key":10111,"MinValue":1200,"MaxValue":1500,"Weight":625},
+    {"PoolID":17,"No":1,"Key":10031,"MinValue":744,"MaxValue":930,"Weight":1250},
+    {"PoolID":17,"No":2,"Key":10041,"MinValue":744,"MaxValue":930,"Weight":1250},
+    {"PoolID":17,"No":3,"Key":10021,"MinValue":1440,"MaxValue":1800,"Weight":2500},
+    {"PoolID":17,"No":4,"Key":10061,"MinValue":696,"MaxValue":870,"Weight":1250},
+    {"PoolID":17,"No":5,"Key":10071,"MinValue":696,"MaxValue":870,"Weight":1250},
+    {"PoolID":17,"No":6,"Key":10081,"MinValue":600,"MaxValue":750,"Weight":625},
+    {"PoolID":17,"No":7,"Key":10091,"MinValue":600,"MaxValue":750,"Weight":625},
+    {"PoolID":17,"No":8,"Key":10101,"MinValue":1200,"MaxValue":1500,"Weight":625},
+    {"PoolID":17,"No":9,"Key":10111,"MinValue":1200,"MaxValue":1500,"Weight":625},
+    {"PoolID":18,"No":1,"Key":10031,"MinValue":792,"MaxValue":990,"Weight":1250},
+    {"PoolID":18,"No":2,"Key":10041,"MinValue":792,"MaxValue":990,"Weight":1250},
+    {"PoolID":18,"No":3,"Key":10021,"MinValue":1350,"MaxValue":1688,"Weight":2500},
+    {"PoolID":18,"No":4,"Key":10061,"MinValue":600,"MaxValue":750,"Weight":1250},
+    {"PoolID":18,"No":5,"Key":10071,"MinValue":600,"MaxValue":750,"Weight":1250},
+    {"PoolID":18,"No":6,"Key":10081,"MinValue":600,"MaxValue":750,"Weight":625},
+    {"PoolID":18,"No":7,"Key":10091,"MinValue":600,"MaxValue":750,"Weight":625},
+    {"PoolID":18,"No":8,"Key":10101,"MinValue":1200,"MaxValue":1500,"Weight":625},
+    {"PoolID":18,"No":9,"Key":10111,"MinValue":1200,"MaxValue":1500,"Weight":625}
 ]

+ 13 - 2
sr/etc/data/game_debug.json

@@ -8,7 +8,7 @@
             "MapCityBaseCooldown":10000,
             "MapComebackCooldown":10000,
             "MapRechooseComebackCooldown":10000,
-            "SiegeValue":1,
+            "SiegeValue":100,
             "MapSiegeWaitTime":10000,
             "MapSnatchWaitTime":10000,
             "MapDiscardWaitTime":10000,
@@ -19,7 +19,10 @@
             "MapReinforceCooldown": 10000,
             "BeginerInvincibleTime": 60000,
             "ComebackInvincibleTime": 60000,
-            "ResOccupyInvincibleTime": 10000
+            "ResOccupyInvincibleTime": 10000,
+            "FacilityUpgradeTime": 0,
+            "HeroInjureTime": 15,
+            "MapCastleSiegeTime": 60000
         }
     },
     {
@@ -85,5 +88,13 @@
             "MapOccupyWaitTime":10000,
             "MapMarchSpeedUp": 2
         }
+    },
+    {
+        "Env":"hw",
+        "Debug":true,
+        "Values": {
+            "MapBuildTime":10000,
+            "SiegeValue":600
+        }
     }
 ]

+ 1 - 1
sr/etc/data/gm.json

@@ -1,3 +1,3 @@
 [
-    {"GmID":1,"Gm":"/gm player level 50;/gm asset add 200101 1;/gm asset add 200102 1;/gm asset add 200103 1;/gm asset add 200104 1;/gm asset add 200105 1;/gm asset add 200106 1;/gm asset add 200107 1;/gm asset add 200108 1;/gm asset add 200109 1;/gm asset add 200110 1;/gm asset add 200201 1;/gm asset add 200202 1;/gm asset add 200203 1;/gm asset add 200204 1;/gm asset add 200205 1;/gm asset add 200206 1;/gm asset add 200207 1;/gm asset add 200208 1;/gm asset add 200209 1;/gm asset add 200210 1;/gm asset add 200301 1;/gm asset add 200302 1;/gm asset add 200303 1;/gm asset add 200304 1;/gm asset add 200305 1;/gm asset add 200306 1;/gm asset add 200307 1;/gm asset add 200308 1;/gm asset add 200309 1;/gm asset add 200310 1;/gm asset add 1 100000;/gm asset add 2 100000;/gm asset add 101 5000000;/gm asset add 102 5000000;/gm asset add 103 5000000;/gm asset add 104 5000000;/gm asset add 202 80000;/gm asset add 203 80000;/gm asset add 204 80000;/gm asset add 205 80000;/gm asset add 206 180000;/gm asset add 119003 100;/gm asset add 119004 100;/gm asset add 100501 100;/gm asset add 10002 50000;/gm asset add 119017 1000;/gm asset add 100104 10000;/gm asset add 100206 20000"}
+    {"GmID":1,"Gm":"/gm player level 50;/gm asset add 200101 10;/gm asset add 200102 10;/gm asset add 200103 10;/gm asset add 200104 10;/gm asset add 200105 10;/gm asset add 200106 10;/gm asset add 200107 10;/gm asset add 200108 10;/gm asset add 200109 10;/gm asset add 200110 10;/gm asset add 200201 10;/gm asset add 200202 10;/gm asset add 200203 10;/gm asset add 200204 10;/gm asset add 200205 10;/gm asset add 200206 10;/gm asset add 200207 10;/gm asset add 200208 10;/gm asset add 200209 10;/gm asset add 200210 10;/gm asset add 200301 10;/gm asset add 200302 10;/gm asset add 200303 10;/gm asset add 200304 10;/gm asset add 200305 10;/gm asset add 200306 10;/gm asset add 200307 10;/gm asset add 200308 10;/gm asset add 200309 10;/gm asset add 200310 10;/gm asset add 1 100000;/gm asset add 2 100000;/gm asset add 101 5000000;/gm asset add 102 5000000;/gm asset add 103 5000000;/gm asset add 104 5000000;/gm asset add 111 2000000;/gm asset add 112 2000000;/gm asset add 113 2000000;/gm asset add 114 2000000;/gm asset add 202 80000;/gm asset add 203 80000;/gm asset add 204 80000;/gm asset add 205 80000;/gm asset add 206 180000;/gm asset add 119003 100;/gm asset add 119004 100;/gm asset add 100501 100;/gm asset add 10002 50000;/gm asset add 119017 100;/gm asset add 119021 100;/gm asset add 100103 10000;/gm asset add 100104 10000;/gm asset add 100205 20000;/gm asset add 100206 20000"}
 ]

+ 30 - 30
sr/etc/data/hero.json

@@ -1,32 +1,32 @@
 [
-    {"ID":200101,"Camp":1,"Quality":5,"BasicAttack":101000,"Talent":101300,"ActiveSkill":101100,"PassiveSkill":101200,"SpecialSkill":101400,"Job":1,"InitTroop":0,"InitHealth":298,"HealthGrow":2189273,"InitAttack":35,"AttackGrow":253956,"InitDefense":41,"DefenseGrow":302030,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200102,"Camp":1,"Quality":5,"BasicAttack":102000,"Talent":102300,"ActiveSkill":102100,"PassiveSkill":102200,"SpecialSkill":102400,"Job":1,"InitTroop":0,"InitHealth":313,"HealthGrow":2300970,"InitAttack":35,"AttackGrow":256547,"InitDefense":39,"DefenseGrow":284605,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200103,"Camp":1,"Quality":5,"BasicAttack":103000,"Talent":103300,"ActiveSkill":103100,"PassiveSkill":103200,"SpecialSkill":103400,"Job":1,"InitTroop":0,"InitHealth":304,"HealthGrow":2233952,"InitAttack":35,"AttackGrow":259138,"InitDefense":39,"DefenseGrow":290414,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200104,"Camp":1,"Quality":5,"BasicAttack":104000,"Talent":104300,"ActiveSkill":104100,"PassiveSkill":104200,"SpecialSkill":104400,"Job":1,"InitTroop":0,"InitHealth":316,"HealthGrow":2323310,"InitAttack":35,"AttackGrow":253956,"InitDefense":39,"DefenseGrow":284605,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200105,"Camp":1,"Quality":5,"BasicAttack":105000,"Talent":105300,"ActiveSkill":105100,"PassiveSkill":105200,"SpecialSkill":105400,"Job":1,"InitTroop":0,"InitHealth":313,"HealthGrow":2300970,"InitAttack":35,"AttackGrow":256547,"InitDefense":39,"DefenseGrow":284605,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200106,"Camp":1,"Quality":5,"BasicAttack":106000,"Talent":106300,"ActiveSkill":106100,"PassiveSkill":106200,"SpecialSkill":106400,"Job":1,"InitTroop":0,"InitHealth":304,"HealthGrow":2233952,"InitAttack":34,"AttackGrow":251364,"InitDefense":41,"DefenseGrow":299126,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200107,"Camp":1,"Quality":5,"BasicAttack":107000,"Talent":107300,"ActiveSkill":107100,"PassiveSkill":107200,"SpecialSkill":107400,"Job":1,"InitTroop":0,"InitHealth":310,"HealthGrow":2278631,"InitAttack":34,"AttackGrow":251364,"InitDefense":40,"DefenseGrow":293318,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200108,"Camp":1,"Quality":5,"BasicAttack":108000,"Talent":108300,"ActiveSkill":108100,"PassiveSkill":108200,"SpecialSkill":108400,"Job":1,"InitTroop":0,"InitHealth":301,"HealthGrow":2211612,"InitAttack":36,"AttackGrow":266913,"InitDefense":39,"DefenseGrow":284605,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200109,"Camp":1,"Quality":5,"BasicAttack":109000,"Talent":109300,"ActiveSkill":109100,"PassiveSkill":109200,"SpecialSkill":109400,"Job":1,"InitTroop":0,"InitHealth":301,"HealthGrow":2211612,"InitAttack":36,"AttackGrow":264321,"InitDefense":39,"DefenseGrow":287510,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200110,"Camp":1,"Quality":5,"BasicAttack":110000,"Talent":110300,"ActiveSkill":110100,"PassiveSkill":110200,"SpecialSkill":110400,"Job":1,"InitTroop":0,"InitHealth":310,"HealthGrow":2278631,"InitAttack":35,"AttackGrow":256547,"InitDefense":39,"DefenseGrow":287510,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
-    {"ID":200201,"Camp":1,"Quality":5,"BasicAttack":201000,"Talent":201300,"ActiveSkill":201100,"PassiveSkill":201200,"SpecialSkill":201400,"Job":2,"InitTroop":0,"InitHealth":289,"HealthGrow":2123148,"InitAttack":38,"AttackGrow":282550,"InitDefense":35,"DefenseGrow":256547,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200202,"Camp":1,"Quality":5,"BasicAttack":202000,"Talent":202300,"ActiveSkill":202100,"PassiveSkill":202200,"SpecialSkill":202400,"Job":2,"InitTroop":0,"InitHealth":289,"HealthGrow":2123148,"InitAttack":38,"AttackGrow":279780,"InitDefense":35,"DefenseGrow":259138,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200203,"Camp":1,"Quality":5,"BasicAttack":203000,"Talent":203300,"ActiveSkill":203100,"PassiveSkill":203200,"SpecialSkill":203400,"Job":2,"InitTroop":0,"InitHealth":291,"HealthGrow":2144593,"InitAttack":37,"AttackGrow":271470,"InitDefense":36,"DefenseGrow":264321,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200204,"Camp":1,"Quality":5,"BasicAttack":204000,"Talent":204300,"ActiveSkill":204100,"PassiveSkill":204200,"SpecialSkill":204400,"Job":2,"InitTroop":0,"InitHealth":300,"HealthGrow":2208931,"InitAttack":38,"AttackGrow":277010,"InitDefense":34,"DefenseGrow":251364,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200205,"Camp":1,"Quality":5,"BasicAttack":205000,"Talent":205300,"ActiveSkill":205100,"PassiveSkill":205200,"SpecialSkill":205400,"Job":2,"InitTroop":0,"InitHealth":291,"HealthGrow":2144593,"InitAttack":38,"AttackGrow":277010,"InitDefense":35,"DefenseGrow":259138,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200206,"Camp":1,"Quality":5,"BasicAttack":206000,"Talent":206300,"ActiveSkill":206100,"PassiveSkill":206200,"SpecialSkill":206400,"Job":2,"InitTroop":0,"InitHealth":300,"HealthGrow":2208931,"InitAttack":37,"AttackGrow":271470,"InitDefense":35,"DefenseGrow":256547,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200207,"Camp":1,"Quality":5,"BasicAttack":207000,"Talent":207300,"ActiveSkill":207100,"PassiveSkill":207200,"SpecialSkill":207400,"Job":2,"InitTroop":0,"InitHealth":297,"HealthGrow":2187485,"InitAttack":38,"AttackGrow":279780,"InitDefense":34,"DefenseGrow":251364,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200208,"Camp":1,"Quality":5,"BasicAttack":208000,"Talent":208300,"ActiveSkill":208100,"PassiveSkill":208200,"SpecialSkill":208400,"Job":2,"InitTroop":0,"InitHealth":286,"HealthGrow":2101702,"InitAttack":39,"AttackGrow":288090,"InitDefense":35,"DefenseGrow":253956,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200209,"Camp":1,"Quality":5,"BasicAttack":209000,"Talent":209300,"ActiveSkill":209100,"PassiveSkill":209200,"SpecialSkill":209400,"Job":2,"InitTroop":0,"InitHealth":300,"HealthGrow":2208931,"InitAttack":37,"AttackGrow":268700,"InitDefense":35,"DefenseGrow":259138,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200210,"Camp":1,"Quality":5,"BasicAttack":210000,"Talent":210300,"ActiveSkill":210100,"PassiveSkill":210200,"SpecialSkill":210400,"Job":2,"InitTroop":0,"InitHealth":297,"HealthGrow":2187485,"InitAttack":37,"AttackGrow":271470,"InitDefense":35,"DefenseGrow":259138,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
-    {"ID":200301,"Camp":1,"Quality":5,"BasicAttack":301000,"Talent":301300,"ActiveSkill":301100,"PassiveSkill":301200,"SpecialSkill":301400,"Job":3,"InitTroop":0,"InitHealth":276,"HealthGrow":2030662,"InitAttack":39,"AttackGrow":288984,"InitDefense":31,"DefenseGrow":225629,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
-    {"ID":200302,"Camp":1,"Quality":5,"BasicAttack":302000,"Talent":302300,"ActiveSkill":302100,"PassiveSkill":302200,"SpecialSkill":302400,"Job":3,"InitTroop":0,"InitHealth":273,"HealthGrow":2010556,"InitAttack":40,"AttackGrow":294882,"InitDefense":30,"DefenseGrow":223395,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
-    {"ID":200303,"Camp":1,"Quality":5,"BasicAttack":303000,"Talent":303300,"ActiveSkill":303100,"PassiveSkill":303200,"SpecialSkill":303400,"Job":3,"InitTroop":0,"InitHealth":273,"HealthGrow":2010556,"InitAttack":40,"AttackGrow":297830,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
-    {"ID":200304,"Camp":1,"Quality":5,"BasicAttack":304000,"Talent":304300,"ActiveSkill":304100,"PassiveSkill":304200,"SpecialSkill":304400,"Job":3,"InitTroop":0,"InitHealth":271,"HealthGrow":1990451,"InitAttack":41,"AttackGrow":300779,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
-    {"ID":200305,"Camp":1,"Quality":5,"BasicAttack":305000,"Talent":305300,"ActiveSkill":305100,"PassiveSkill":305200,"SpecialSkill":305400,"Job":3,"InitTroop":0,"InitHealth":265,"HealthGrow":1950240,"InitAttack":42,"AttackGrow":306677,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
-    {"ID":200306,"Camp":1,"Quality":5,"BasicAttack":306000,"Talent":306300,"ActiveSkill":306100,"PassiveSkill":306200,"SpecialSkill":306400,"Job":3,"InitTroop":0,"InitHealth":271,"HealthGrow":1990451,"InitAttack":40,"AttackGrow":297830,"InitDefense":30,"DefenseGrow":223395,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
-    {"ID":200307,"Camp":1,"Quality":5,"BasicAttack":307000,"Talent":307300,"ActiveSkill":307100,"PassiveSkill":307200,"SpecialSkill":307400,"Job":3,"InitTroop":0,"InitHealth":273,"HealthGrow":2010556,"InitAttack":41,"AttackGrow":300779,"InitDefense":30,"DefenseGrow":218927,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
-    {"ID":200308,"Camp":1,"Quality":5,"BasicAttack":308000,"Talent":308300,"ActiveSkill":308100,"PassiveSkill":308200,"SpecialSkill":308400,"Job":3,"InitTroop":0,"InitHealth":271,"HealthGrow":1990451,"InitAttack":41,"AttackGrow":303728,"InitDefense":30,"DefenseGrow":218927,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
-    {"ID":200309,"Camp":1,"Quality":5,"BasicAttack":309000,"Talent":309300,"ActiveSkill":309100,"PassiveSkill":309200,"SpecialSkill":309400,"Job":3,"InitTroop":0,"InitHealth":276,"HealthGrow":2030662,"InitAttack":40,"AttackGrow":294882,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
-    {"ID":200310,"Camp":1,"Quality":5,"BasicAttack":310000,"Talent":310300,"ActiveSkill":310100,"PassiveSkill":310200,"SpecialSkill":310400,"Job":3,"InitTroop":0,"InitHealth":279,"HealthGrow":2050768,"InitAttack":40,"AttackGrow":291933,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10}
+    {"ID":200101,"Camp":1,"Quality":5,"BasicAttack":101000,"Talent":101300,"ActiveSkill":101100,"PassiveSkill":101200,"SpecialSkill":101400,"Job":1,"InitTroop":0,"DecomposeItemID":400101,"DecomposeItemNum":10,"InitHealth":298,"HealthGrow":2189273,"InitAttack":35,"AttackGrow":253956,"InitDefense":41,"DefenseGrow":302030,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200102,"Camp":1,"Quality":5,"BasicAttack":102000,"Talent":102300,"ActiveSkill":102100,"PassiveSkill":102200,"SpecialSkill":102400,"Job":1,"InitTroop":0,"DecomposeItemID":400102,"DecomposeItemNum":10,"InitHealth":313,"HealthGrow":2300970,"InitAttack":35,"AttackGrow":256547,"InitDefense":39,"DefenseGrow":284605,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200103,"Camp":1,"Quality":5,"BasicAttack":103000,"Talent":103300,"ActiveSkill":103100,"PassiveSkill":103200,"SpecialSkill":103400,"Job":1,"InitTroop":0,"DecomposeItemID":400103,"DecomposeItemNum":10,"InitHealth":304,"HealthGrow":2233952,"InitAttack":35,"AttackGrow":259138,"InitDefense":39,"DefenseGrow":290414,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200104,"Camp":1,"Quality":5,"BasicAttack":104000,"Talent":104300,"ActiveSkill":104100,"PassiveSkill":104200,"SpecialSkill":104400,"Job":1,"InitTroop":0,"DecomposeItemID":400104,"DecomposeItemNum":10,"InitHealth":316,"HealthGrow":2323310,"InitAttack":35,"AttackGrow":253956,"InitDefense":39,"DefenseGrow":284605,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200105,"Camp":1,"Quality":5,"BasicAttack":105000,"Talent":105300,"ActiveSkill":105100,"PassiveSkill":105200,"SpecialSkill":105400,"Job":1,"InitTroop":0,"DecomposeItemID":400105,"DecomposeItemNum":10,"InitHealth":313,"HealthGrow":2300970,"InitAttack":35,"AttackGrow":256547,"InitDefense":39,"DefenseGrow":284605,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200106,"Camp":1,"Quality":5,"BasicAttack":106000,"Talent":106300,"ActiveSkill":106100,"PassiveSkill":106200,"SpecialSkill":106400,"Job":1,"InitTroop":0,"DecomposeItemID":400106,"DecomposeItemNum":10,"InitHealth":304,"HealthGrow":2233952,"InitAttack":34,"AttackGrow":251364,"InitDefense":41,"DefenseGrow":299126,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200107,"Camp":1,"Quality":5,"BasicAttack":107000,"Talent":107300,"ActiveSkill":107100,"PassiveSkill":107200,"SpecialSkill":107400,"Job":1,"InitTroop":0,"DecomposeItemID":400107,"DecomposeItemNum":10,"InitHealth":310,"HealthGrow":2278631,"InitAttack":34,"AttackGrow":251364,"InitDefense":40,"DefenseGrow":293318,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200108,"Camp":1,"Quality":5,"BasicAttack":108000,"Talent":108300,"ActiveSkill":108100,"PassiveSkill":108200,"SpecialSkill":108400,"Job":1,"InitTroop":0,"DecomposeItemID":400108,"DecomposeItemNum":10,"InitHealth":301,"HealthGrow":2211612,"InitAttack":36,"AttackGrow":266913,"InitDefense":39,"DefenseGrow":284605,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200109,"Camp":1,"Quality":5,"BasicAttack":109000,"Talent":109300,"ActiveSkill":109100,"PassiveSkill":109200,"SpecialSkill":109400,"Job":1,"InitTroop":0,"DecomposeItemID":400109,"DecomposeItemNum":10,"InitHealth":301,"HealthGrow":2211612,"InitAttack":36,"AttackGrow":264321,"InitDefense":39,"DefenseGrow":287510,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200110,"Camp":1,"Quality":5,"BasicAttack":110000,"Talent":110300,"ActiveSkill":110100,"PassiveSkill":110200,"SpecialSkill":110400,"Job":1,"InitTroop":0,"DecomposeItemID":400110,"DecomposeItemNum":10,"InitHealth":310,"HealthGrow":2278631,"InitAttack":35,"AttackGrow":256547,"InitDefense":39,"DefenseGrow":287510,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":2},
+    {"ID":200201,"Camp":1,"Quality":5,"BasicAttack":201000,"Talent":201300,"ActiveSkill":201100,"PassiveSkill":201200,"SpecialSkill":201400,"Job":2,"InitTroop":0,"DecomposeItemID":400201,"DecomposeItemNum":10,"InitHealth":289,"HealthGrow":2123148,"InitAttack":38,"AttackGrow":282550,"InitDefense":35,"DefenseGrow":256547,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200202,"Camp":1,"Quality":5,"BasicAttack":202000,"Talent":202300,"ActiveSkill":202100,"PassiveSkill":202200,"SpecialSkill":202400,"Job":2,"InitTroop":0,"DecomposeItemID":400202,"DecomposeItemNum":10,"InitHealth":289,"HealthGrow":2123148,"InitAttack":38,"AttackGrow":279780,"InitDefense":35,"DefenseGrow":259138,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200203,"Camp":1,"Quality":5,"BasicAttack":203000,"Talent":203300,"ActiveSkill":203100,"PassiveSkill":203200,"SpecialSkill":203400,"Job":2,"InitTroop":0,"DecomposeItemID":400203,"DecomposeItemNum":10,"InitHealth":291,"HealthGrow":2144593,"InitAttack":37,"AttackGrow":271470,"InitDefense":36,"DefenseGrow":264321,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200204,"Camp":1,"Quality":5,"BasicAttack":204000,"Talent":204300,"ActiveSkill":204100,"PassiveSkill":204200,"SpecialSkill":204400,"Job":2,"InitTroop":0,"DecomposeItemID":400204,"DecomposeItemNum":10,"InitHealth":300,"HealthGrow":2208931,"InitAttack":38,"AttackGrow":277010,"InitDefense":34,"DefenseGrow":251364,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200205,"Camp":1,"Quality":5,"BasicAttack":205000,"Talent":205300,"ActiveSkill":205100,"PassiveSkill":205200,"SpecialSkill":205400,"Job":2,"InitTroop":0,"DecomposeItemID":400205,"DecomposeItemNum":10,"InitHealth":291,"HealthGrow":2144593,"InitAttack":38,"AttackGrow":277010,"InitDefense":35,"DefenseGrow":259138,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200206,"Camp":1,"Quality":5,"BasicAttack":206000,"Talent":206300,"ActiveSkill":206100,"PassiveSkill":206200,"SpecialSkill":206400,"Job":2,"InitTroop":0,"DecomposeItemID":400206,"DecomposeItemNum":10,"InitHealth":300,"HealthGrow":2208931,"InitAttack":37,"AttackGrow":271470,"InitDefense":35,"DefenseGrow":256547,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200207,"Camp":1,"Quality":5,"BasicAttack":207000,"Talent":207300,"ActiveSkill":207100,"PassiveSkill":207200,"SpecialSkill":207400,"Job":2,"InitTroop":0,"DecomposeItemID":400207,"DecomposeItemNum":10,"InitHealth":297,"HealthGrow":2187485,"InitAttack":38,"AttackGrow":279780,"InitDefense":34,"DefenseGrow":251364,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200208,"Camp":1,"Quality":5,"BasicAttack":208000,"Talent":208300,"ActiveSkill":208100,"PassiveSkill":208200,"SpecialSkill":208400,"Job":2,"InitTroop":0,"DecomposeItemID":400208,"DecomposeItemNum":10,"InitHealth":286,"HealthGrow":2101702,"InitAttack":39,"AttackGrow":288090,"InitDefense":35,"DefenseGrow":253956,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200209,"Camp":1,"Quality":5,"BasicAttack":209000,"Talent":209300,"ActiveSkill":209100,"PassiveSkill":209200,"SpecialSkill":209400,"Job":2,"InitTroop":0,"DecomposeItemID":400209,"DecomposeItemNum":10,"InitHealth":300,"HealthGrow":2208931,"InitAttack":37,"AttackGrow":268700,"InitDefense":35,"DefenseGrow":259138,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200210,"Camp":1,"Quality":5,"BasicAttack":210000,"Talent":210300,"ActiveSkill":210100,"PassiveSkill":210200,"SpecialSkill":210400,"Job":2,"InitTroop":0,"DecomposeItemID":400210,"DecomposeItemNum":10,"InitHealth":297,"HealthGrow":2187485,"InitAttack":37,"AttackGrow":271470,"InitDefense":35,"DefenseGrow":259138,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":5},
+    {"ID":200301,"Camp":1,"Quality":5,"BasicAttack":301000,"Talent":301300,"ActiveSkill":301100,"PassiveSkill":301200,"SpecialSkill":301400,"Job":3,"InitTroop":0,"DecomposeItemID":400301,"DecomposeItemNum":10,"InitHealth":276,"HealthGrow":2030662,"InitAttack":39,"AttackGrow":288984,"InitDefense":31,"DefenseGrow":225629,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
+    {"ID":200302,"Camp":1,"Quality":5,"BasicAttack":302000,"Talent":302300,"ActiveSkill":302100,"PassiveSkill":302200,"SpecialSkill":302400,"Job":3,"InitTroop":0,"DecomposeItemID":400302,"DecomposeItemNum":10,"InitHealth":273,"HealthGrow":2010556,"InitAttack":40,"AttackGrow":294882,"InitDefense":30,"DefenseGrow":223395,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
+    {"ID":200303,"Camp":1,"Quality":5,"BasicAttack":303000,"Talent":303300,"ActiveSkill":303100,"PassiveSkill":303200,"SpecialSkill":303400,"Job":3,"InitTroop":0,"DecomposeItemID":400303,"DecomposeItemNum":10,"InitHealth":273,"HealthGrow":2010556,"InitAttack":40,"AttackGrow":297830,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
+    {"ID":200304,"Camp":1,"Quality":5,"BasicAttack":304000,"Talent":304300,"ActiveSkill":304100,"PassiveSkill":304200,"SpecialSkill":304400,"Job":3,"InitTroop":0,"DecomposeItemID":400304,"DecomposeItemNum":10,"InitHealth":271,"HealthGrow":1990451,"InitAttack":41,"AttackGrow":300779,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
+    {"ID":200305,"Camp":1,"Quality":5,"BasicAttack":305000,"Talent":305300,"ActiveSkill":305100,"PassiveSkill":305200,"SpecialSkill":305400,"Job":3,"InitTroop":0,"DecomposeItemID":400305,"DecomposeItemNum":10,"InitHealth":265,"HealthGrow":1950240,"InitAttack":42,"AttackGrow":306677,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
+    {"ID":200306,"Camp":1,"Quality":5,"BasicAttack":306000,"Talent":306300,"ActiveSkill":306100,"PassiveSkill":306200,"SpecialSkill":306400,"Job":3,"InitTroop":0,"DecomposeItemID":400306,"DecomposeItemNum":10,"InitHealth":271,"HealthGrow":1990451,"InitAttack":40,"AttackGrow":297830,"InitDefense":30,"DefenseGrow":223395,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
+    {"ID":200307,"Camp":1,"Quality":5,"BasicAttack":307000,"Talent":307300,"ActiveSkill":307100,"PassiveSkill":307200,"SpecialSkill":307400,"Job":3,"InitTroop":0,"DecomposeItemID":400307,"DecomposeItemNum":10,"InitHealth":273,"HealthGrow":2010556,"InitAttack":41,"AttackGrow":300779,"InitDefense":30,"DefenseGrow":218927,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
+    {"ID":200308,"Camp":1,"Quality":5,"BasicAttack":308000,"Talent":308300,"ActiveSkill":308100,"PassiveSkill":308200,"SpecialSkill":308400,"Job":3,"InitTroop":0,"DecomposeItemID":400308,"DecomposeItemNum":10,"InitHealth":271,"HealthGrow":1990451,"InitAttack":41,"AttackGrow":303728,"InitDefense":30,"DefenseGrow":218927,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
+    {"ID":200309,"Camp":1,"Quality":5,"BasicAttack":309000,"Talent":309300,"ActiveSkill":309100,"PassiveSkill":309200,"SpecialSkill":309400,"Job":3,"InitTroop":0,"DecomposeItemID":400309,"DecomposeItemNum":10,"InitHealth":276,"HealthGrow":2030662,"InitAttack":40,"AttackGrow":294882,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10},
+    {"ID":200310,"Camp":1,"Quality":5,"BasicAttack":310000,"Talent":310300,"ActiveSkill":310100,"PassiveSkill":310200,"SpecialSkill":310400,"Job":3,"InitTroop":0,"DecomposeItemID":400310,"DecomposeItemNum":10,"InitHealth":279,"HealthGrow":2050768,"InitAttack":40,"AttackGrow":291933,"InitDefense":30,"DefenseGrow":221161,"InitAttackSpeed":10000,"InitSpeed":600,"InitAttackRange":10}
 ]

+ 36 - 5
sr/etc/data/item.json

@@ -6,10 +6,10 @@
     {"ID":5,"ParseType":0,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":3,"IsBind":false,"IsMarquee":false},
     {"ID":6,"ParseType":0,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":3,"IsBind":false,"IsMarquee":false},
     {"ID":7,"ParseType":0,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":3,"IsBind":false,"IsMarquee":false},
-    {"ID":101,"ParseType":0,"ItemSubType":1,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":false,"IsMarquee":false},
-    {"ID":102,"ParseType":0,"ItemSubType":2,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":false,"IsMarquee":false},
-    {"ID":103,"ParseType":0,"ItemSubType":3,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":false,"IsMarquee":false},
-    {"ID":104,"ParseType":0,"ItemSubType":4,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":false,"IsMarquee":false},
+    {"ID":101,"ParseType":0,"ItemSubType":1,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":true,"IsMarquee":false},
+    {"ID":102,"ParseType":0,"ItemSubType":2,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":true,"IsMarquee":false},
+    {"ID":103,"ParseType":0,"ItemSubType":3,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":true,"IsMarquee":false},
+    {"ID":104,"ParseType":0,"ItemSubType":4,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":true,"IsMarquee":false},
     {"ID":111,"ParseType":0,"ItemSubType":1,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":false,"IsMarquee":false},
     {"ID":112,"ParseType":0,"ItemSubType":2,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":false,"IsMarquee":false},
     {"ID":113,"ParseType":0,"ItemSubType":3,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":1,"IsBind":false,"IsMarquee":false},
@@ -221,6 +221,7 @@
     {"ID":119018,"ParseType":1,"ItemSubType":0,"CanUse":true,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":false},
     {"ID":119019,"ParseType":1,"ItemSubType":0,"CanUse":true,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":false},
     {"ID":119020,"ParseType":1,"ItemSubType":0,"CanUse":true,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":false},
+    {"ID":119021,"ParseType":1,"ItemSubType":0,"CanUse":true,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":false},
     {"ID":119997,"ParseType":1,"ItemSubType":0,"CanUse":true,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":false},
     {"ID":119998,"ParseType":1,"ItemSubType":0,"CanUse":true,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":false},
     {"ID":119999,"ParseType":1,"ItemSubType":0,"CanUse":true,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":false},
@@ -451,5 +452,35 @@
     {"ID":363101,"ParseType":3,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":true},
     {"ID":363102,"ParseType":3,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":true},
     {"ID":363103,"ParseType":3,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":true},
-    {"ID":363104,"ParseType":3,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":true}
+    {"ID":363104,"ParseType":3,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":6,"IsBind":false,"IsMarquee":true},
+    {"ID":400101,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400102,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400103,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400104,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400105,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400106,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400107,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400108,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400109,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400110,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400201,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400202,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400203,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400204,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400205,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400206,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400207,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400208,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400209,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400210,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400301,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400302,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400303,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400304,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400305,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400306,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400307,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400308,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400309,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false},
+    {"ID":400310,"ParseType":1,"ItemSubType":0,"CanUse":false,"CanSale":false,"SalePrice":[],"Quality":5,"IsBind":false,"IsMarquee":false}
 ]

+ 2 - 1
sr/etc/data/item_chest.json

@@ -35,5 +35,6 @@
     {"ID":140005,"DropPoolID":50005,"UseType":2},
     {"ID":150001,"DropPoolID":51001,"UseType":2},
     {"ID":150002,"DropPoolID":51002,"UseType":2},
-    {"ID":150003,"DropPoolID":51003,"UseType":2}
+    {"ID":150003,"DropPoolID":51003,"UseType":2},
+    {"ID":119021,"DropPoolID":51004,"UseType":1}
 ]

+ 2 - 1
sr/etc/data/league_log.json

@@ -7,11 +7,12 @@
     {"LogID":106,"LogType":1},
     {"LogID":107,"LogType":1},
     {"LogID":108,"LogType":1},
+    {"LogID":109,"LogType":1},
+    {"LogID":110,"LogType":1},
     {"LogID":201,"LogType":2},
     {"LogID":202,"LogType":2},
     {"LogID":203,"LogType":2},
     {"LogID":204,"LogType":2},
-    {"LogID":205,"LogType":2},
     {"LogID":301,"LogType":3},
     {"LogID":302,"LogType":3},
     {"LogID":401,"LogType":4},

File diff suppressed because it is too large
+ 0 - 1
sr/etc/data/map_build.json


+ 95 - 95
sr/etc/data/map_build_upgrade.json

@@ -1,97 +1,97 @@
 [
-    {"ConfigID":201001,"Level":1,"UpgradeCost":[],"UpgradeTime":0,"Durability":50000,"ViewRange":0},
-    {"ConfigID":201001,"Level":2,"UpgradeCost":[],"UpgradeTime":0,"Durability":52000,"ViewRange":0},
-    {"ConfigID":201001,"Level":3,"UpgradeCost":[],"UpgradeTime":0,"Durability":54000,"ViewRange":0},
-    {"ConfigID":201001,"Level":4,"UpgradeCost":[],"UpgradeTime":0,"Durability":56000,"ViewRange":0},
-    {"ConfigID":201001,"Level":5,"UpgradeCost":[],"UpgradeTime":0,"Durability":58000,"ViewRange":0},
-    {"ConfigID":201001,"Level":6,"UpgradeCost":[],"UpgradeTime":0,"Durability":60000,"ViewRange":0},
-    {"ConfigID":201001,"Level":7,"UpgradeCost":[],"UpgradeTime":0,"Durability":62000,"ViewRange":0},
-    {"ConfigID":201001,"Level":8,"UpgradeCost":[],"UpgradeTime":0,"Durability":64000,"ViewRange":0},
-    {"ConfigID":201001,"Level":9,"UpgradeCost":[],"UpgradeTime":0,"Durability":66000,"ViewRange":0},
-    {"ConfigID":201001,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":68000,"ViewRange":0},
-    {"ConfigID":201001,"Level":11,"UpgradeCost":[],"UpgradeTime":0,"Durability":70000,"ViewRange":0},
-    {"ConfigID":201001,"Level":12,"UpgradeCost":[],"UpgradeTime":0,"Durability":72000,"ViewRange":0},
-    {"ConfigID":201001,"Level":13,"UpgradeCost":[],"UpgradeTime":0,"Durability":74000,"ViewRange":0},
-    {"ConfigID":201001,"Level":14,"UpgradeCost":[],"UpgradeTime":0,"Durability":76000,"ViewRange":0},
-    {"ConfigID":201001,"Level":15,"UpgradeCost":[],"UpgradeTime":0,"Durability":78000,"ViewRange":0},
-    {"ConfigID":201001,"Level":16,"UpgradeCost":[],"UpgradeTime":0,"Durability":80000,"ViewRange":0},
-    {"ConfigID":201001,"Level":17,"UpgradeCost":[],"UpgradeTime":0,"Durability":82000,"ViewRange":0},
-    {"ConfigID":201001,"Level":18,"UpgradeCost":[],"UpgradeTime":0,"Durability":84000,"ViewRange":0},
-    {"ConfigID":201001,"Level":19,"UpgradeCost":[],"UpgradeTime":0,"Durability":86000,"ViewRange":0},
-    {"ConfigID":201001,"Level":20,"UpgradeCost":[],"UpgradeTime":0,"Durability":88000,"ViewRange":0},
-    {"ConfigID":201006,"Level":0,"UpgradeCost":[[20201,800],[20203,800]],"UpgradeTime":1200,"Durability":300,"ViewRange":0},
-    {"ConfigID":201006,"Level":1,"UpgradeCost":[[20201,5000],[20203,5000]],"UpgradeTime":7700,"Durability":400,"ViewRange":0},
-    {"ConfigID":201006,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":12900,"Durability":500,"ViewRange":0},
-    {"ConfigID":201006,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":18100,"Durability":600,"ViewRange":0},
-    {"ConfigID":201006,"Level":4,"UpgradeCost":[[20201,50000],[20203,50000]],"UpgradeTime":25900,"Durability":700,"ViewRange":0},
-    {"ConfigID":201006,"Level":5,"UpgradeCost":[[20201,70000],[20203,70000]],"UpgradeTime":41400,"Durability":800,"ViewRange":0},
-    {"ConfigID":201006,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":67300,"Durability":900,"ViewRange":0},
-    {"ConfigID":201006,"Level":7,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":93300,"Durability":1000,"ViewRange":0},
-    {"ConfigID":201006,"Level":8,"UpgradeCost":[],"UpgradeTime":0,"Durability":1100,"ViewRange":0},
-    {"ConfigID":201007,"Level":0,"UpgradeCost":[[20201,800],[20203,800]],"UpgradeTime":1200,"Durability":1500,"ViewRange":0},
-    {"ConfigID":201007,"Level":1,"UpgradeCost":[[20201,5000],[20203,5000]],"UpgradeTime":7700,"Durability":2000,"ViewRange":0},
-    {"ConfigID":201007,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":12900,"Durability":2500,"ViewRange":0},
-    {"ConfigID":201007,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":18100,"Durability":3000,"ViewRange":0},
-    {"ConfigID":201007,"Level":4,"UpgradeCost":[[20201,50000],[20203,50000]],"UpgradeTime":25900,"Durability":3500,"ViewRange":0},
-    {"ConfigID":201007,"Level":5,"UpgradeCost":[[20201,70000],[20203,70000]],"UpgradeTime":41400,"Durability":4000,"ViewRange":0},
-    {"ConfigID":201007,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":67300,"Durability":4500,"ViewRange":0},
-    {"ConfigID":201007,"Level":7,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":93300,"Durability":5000,"ViewRange":0},
-    {"ConfigID":201007,"Level":8,"UpgradeCost":[],"UpgradeTime":0,"Durability":5500,"ViewRange":0},
-    {"ConfigID":201003,"Level":0,"UpgradeCost":[[20201,2000],[20203,2000]],"UpgradeTime":1700,"Durability":1500,"ViewRange":0},
-    {"ConfigID":201003,"Level":1,"UpgradeCost":[[20201,15000],[20203,15000]],"UpgradeTime":10300,"Durability":2000,"ViewRange":0},
-    {"ConfigID":201003,"Level":2,"UpgradeCost":[[20201,40000],[20203,40000]],"UpgradeTime":20700,"Durability":2500,"ViewRange":0},
-    {"ConfigID":201003,"Level":3,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":34500,"Durability":3000,"ViewRange":0},
-    {"ConfigID":201003,"Level":4,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":58700,"Durability":3500,"ViewRange":0},
-    {"ConfigID":201003,"Level":5,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":93300,"Durability":4000,"ViewRange":0},
-    {"ConfigID":201003,"Level":6,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":126100,"Durability":4500,"ViewRange":0},
-    {"ConfigID":201003,"Level":7,"UpgradeCost":[],"UpgradeTime":0,"Durability":5000,"ViewRange":0},
-    {"ConfigID":201008,"Level":0,"UpgradeCost":[[20201,1000],[20203,1000]],"UpgradeTime":400,"Durability":1500,"ViewRange":0},
-    {"ConfigID":201008,"Level":1,"UpgradeCost":[[20201,3000],[20203,3000]],"UpgradeTime":2000,"Durability":2000,"ViewRange":0},
-    {"ConfigID":201008,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":4100,"Durability":2500,"ViewRange":0},
-    {"ConfigID":201008,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":8200,"Durability":3000,"ViewRange":0},
-    {"ConfigID":201008,"Level":4,"UpgradeCost":[[20201,60000],[20203,60000]],"UpgradeTime":12400,"Durability":3500,"ViewRange":0},
-    {"ConfigID":201008,"Level":5,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":16500,"Durability":4000,"ViewRange":0},
-    {"ConfigID":201008,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":20700,"Durability":4500,"ViewRange":0},
-    {"ConfigID":201008,"Level":7,"UpgradeCost":[[20201,120000],[20203,120000]],"UpgradeTime":31100,"Durability":5000,"ViewRange":0},
-    {"ConfigID":201008,"Level":8,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":45600,"Durability":5500,"ViewRange":0},
-    {"ConfigID":201008,"Level":9,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":65900,"Durability":6000,"ViewRange":0},
-    {"ConfigID":201008,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":6500,"ViewRange":0},
-    {"ConfigID":201009,"Level":0,"UpgradeCost":[[20201,1000],[20203,1000]],"UpgradeTime":400,"Durability":1500,"ViewRange":0},
-    {"ConfigID":201009,"Level":1,"UpgradeCost":[[20201,3000],[20203,3000]],"UpgradeTime":2000,"Durability":2000,"ViewRange":0},
-    {"ConfigID":201009,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":4100,"Durability":2500,"ViewRange":0},
-    {"ConfigID":201009,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":8200,"Durability":3000,"ViewRange":0},
-    {"ConfigID":201009,"Level":4,"UpgradeCost":[[20201,60000],[20203,60000]],"UpgradeTime":12400,"Durability":3500,"ViewRange":0},
-    {"ConfigID":201009,"Level":5,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":16500,"Durability":4000,"ViewRange":0},
-    {"ConfigID":201009,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":20700,"Durability":4500,"ViewRange":0},
-    {"ConfigID":201009,"Level":7,"UpgradeCost":[[20201,120000],[20203,120000]],"UpgradeTime":31100,"Durability":5000,"ViewRange":0},
-    {"ConfigID":201009,"Level":8,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":45600,"Durability":5500,"ViewRange":0},
-    {"ConfigID":201009,"Level":9,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":65900,"Durability":6000,"ViewRange":0},
-    {"ConfigID":201009,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":6500,"ViewRange":0},
-    {"ConfigID":201010,"Level":0,"UpgradeCost":[[20201,1000],[20203,1000]],"UpgradeTime":400,"Durability":1500,"ViewRange":0},
-    {"ConfigID":201010,"Level":1,"UpgradeCost":[[20201,3000],[20203,3000]],"UpgradeTime":2000,"Durability":2000,"ViewRange":0},
-    {"ConfigID":201010,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":4100,"Durability":2500,"ViewRange":0},
-    {"ConfigID":201010,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":8200,"Durability":3000,"ViewRange":0},
-    {"ConfigID":201010,"Level":4,"UpgradeCost":[[20201,60000],[20203,60000]],"UpgradeTime":12400,"Durability":3500,"ViewRange":0},
-    {"ConfigID":201010,"Level":5,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":16500,"Durability":4000,"ViewRange":0},
-    {"ConfigID":201010,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":20700,"Durability":4500,"ViewRange":0},
-    {"ConfigID":201010,"Level":7,"UpgradeCost":[[20201,120000],[20203,120000]],"UpgradeTime":31100,"Durability":5000,"ViewRange":0},
-    {"ConfigID":201010,"Level":8,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":45600,"Durability":5500,"ViewRange":0},
-    {"ConfigID":201010,"Level":9,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":65900,"Durability":6000,"ViewRange":0},
-    {"ConfigID":201010,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":6500,"ViewRange":0},
-    {"ConfigID":201011,"Level":0,"UpgradeCost":[[20201,1000],[20203,1000]],"UpgradeTime":400,"Durability":1500,"ViewRange":0},
-    {"ConfigID":201011,"Level":1,"UpgradeCost":[[20201,3000],[20203,3000]],"UpgradeTime":2000,"Durability":2000,"ViewRange":0},
-    {"ConfigID":201011,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":4100,"Durability":2500,"ViewRange":0},
-    {"ConfigID":201011,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":8200,"Durability":3000,"ViewRange":0},
-    {"ConfigID":201011,"Level":4,"UpgradeCost":[[20201,60000],[20203,60000]],"UpgradeTime":12400,"Durability":3500,"ViewRange":0},
-    {"ConfigID":201011,"Level":5,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":16500,"Durability":4000,"ViewRange":0},
-    {"ConfigID":201011,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":20700,"Durability":4500,"ViewRange":0},
-    {"ConfigID":201011,"Level":7,"UpgradeCost":[[20201,120000],[20203,120000]],"UpgradeTime":31100,"Durability":5000,"ViewRange":0},
-    {"ConfigID":201011,"Level":8,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":45600,"Durability":5500,"ViewRange":0},
-    {"ConfigID":201011,"Level":9,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":65900,"Durability":6000,"ViewRange":0},
-    {"ConfigID":201011,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":6500,"ViewRange":0},
-    {"ConfigID":202003,"Level":1,"UpgradeCost":[[101,200],[102,200]],"UpgradeTime":15,"Durability":800,"ViewRange":0},
-    {"ConfigID":202003,"Level":2,"UpgradeCost":[[101,300],[102,300]],"UpgradeTime":30,"Durability":1100,"ViewRange":0},
-    {"ConfigID":202003,"Level":3,"UpgradeCost":[[101,400],[102,400]],"UpgradeTime":45,"Durability":1400,"ViewRange":0},
-    {"ConfigID":202003,"Level":4,"UpgradeCost":[[101,500],[102,500]],"UpgradeTime":60,"Durability":1700,"ViewRange":0},
-    {"ConfigID":202003,"Level":5,"UpgradeCost":[[101,600],[102,600]],"UpgradeTime":0,"Durability":2000,"ViewRange":0}
+    {"ConfigID":201001,"Level":1,"UpgradeCost":[],"UpgradeTime":0,"Durability":50000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":2,"UpgradeCost":[],"UpgradeTime":0,"Durability":52000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":3,"UpgradeCost":[],"UpgradeTime":0,"Durability":54000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":4,"UpgradeCost":[],"UpgradeTime":0,"Durability":56000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":5,"UpgradeCost":[],"UpgradeTime":0,"Durability":58000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":6,"UpgradeCost":[],"UpgradeTime":0,"Durability":60000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":7,"UpgradeCost":[],"UpgradeTime":0,"Durability":62000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":8,"UpgradeCost":[],"UpgradeTime":0,"Durability":64000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":9,"UpgradeCost":[],"UpgradeTime":0,"Durability":66000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":68000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":11,"UpgradeCost":[],"UpgradeTime":0,"Durability":70000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":12,"UpgradeCost":[],"UpgradeTime":0,"Durability":72000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":13,"UpgradeCost":[],"UpgradeTime":0,"Durability":74000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":14,"UpgradeCost":[],"UpgradeTime":0,"Durability":76000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":15,"UpgradeCost":[],"UpgradeTime":0,"Durability":78000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":16,"UpgradeCost":[],"UpgradeTime":0,"Durability":80000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":17,"UpgradeCost":[],"UpgradeTime":0,"Durability":82000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":18,"UpgradeCost":[],"UpgradeTime":0,"Durability":84000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":19,"UpgradeCost":[],"UpgradeTime":0,"Durability":86000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201001,"Level":20,"UpgradeCost":[],"UpgradeTime":0,"Durability":88000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201006,"Level":0,"UpgradeCost":[[20201,800],[20203,800]],"UpgradeTime":1200,"Durability":300,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201006,"Level":1,"UpgradeCost":[[20201,5000],[20203,5000]],"UpgradeTime":7700,"Durability":400,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201006,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":12900,"Durability":500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201006,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":18100,"Durability":600,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201006,"Level":4,"UpgradeCost":[[20201,50000],[20203,50000]],"UpgradeTime":25900,"Durability":700,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201006,"Level":5,"UpgradeCost":[[20201,70000],[20203,70000]],"UpgradeTime":41400,"Durability":800,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201006,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":67300,"Durability":900,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201006,"Level":7,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":93300,"Durability":1000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201006,"Level":8,"UpgradeCost":[],"UpgradeTime":0,"Durability":1100,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201007,"Level":0,"UpgradeCost":[[20201,800],[20203,800]],"UpgradeTime":1200,"Durability":1500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201007,"Level":1,"UpgradeCost":[[20201,5000],[20203,5000]],"UpgradeTime":7700,"Durability":2000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201007,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":12900,"Durability":2500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201007,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":18100,"Durability":3000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201007,"Level":4,"UpgradeCost":[[20201,50000],[20203,50000]],"UpgradeTime":25900,"Durability":3500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201007,"Level":5,"UpgradeCost":[[20201,70000],[20203,70000]],"UpgradeTime":41400,"Durability":4000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201007,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":67300,"Durability":4500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201007,"Level":7,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":93300,"Durability":5000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201007,"Level":8,"UpgradeCost":[],"UpgradeTime":0,"Durability":5500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201003,"Level":0,"UpgradeCost":[[20201,2000],[20203,2000]],"UpgradeTime":1700,"Durability":1500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201003,"Level":1,"UpgradeCost":[[20201,15000],[20203,15000]],"UpgradeTime":10300,"Durability":2000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201003,"Level":2,"UpgradeCost":[[20201,40000],[20203,40000]],"UpgradeTime":20700,"Durability":2500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201003,"Level":3,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":34500,"Durability":3000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201003,"Level":4,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":58700,"Durability":3500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201003,"Level":5,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":93300,"Durability":4000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201003,"Level":6,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":126100,"Durability":4500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201003,"Level":7,"UpgradeCost":[],"UpgradeTime":0,"Durability":5000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201008,"Level":0,"UpgradeCost":[[20201,1000],[20203,1000]],"UpgradeTime":400,"Durability":1500,"ViewRange":0,"LeagueBuildAttrs":[[901,1000]]},
+    {"ConfigID":201008,"Level":1,"UpgradeCost":[[20201,3000],[20203,3000]],"UpgradeTime":2000,"Durability":2000,"ViewRange":0,"LeagueBuildAttrs":[[901,1001]]},
+    {"ConfigID":201008,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":4100,"Durability":2500,"ViewRange":0,"LeagueBuildAttrs":[[901,1002]]},
+    {"ConfigID":201008,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":8200,"Durability":3000,"ViewRange":0,"LeagueBuildAttrs":[[901,1003]]},
+    {"ConfigID":201008,"Level":4,"UpgradeCost":[[20201,60000],[20203,60000]],"UpgradeTime":12400,"Durability":3500,"ViewRange":0,"LeagueBuildAttrs":[[901,1004]]},
+    {"ConfigID":201008,"Level":5,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":16500,"Durability":4000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201008,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":20700,"Durability":4500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201008,"Level":7,"UpgradeCost":[[20201,120000],[20203,120000]],"UpgradeTime":31100,"Durability":5000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201008,"Level":8,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":45600,"Durability":5500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201008,"Level":9,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":65900,"Durability":6000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201008,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":6500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":0,"UpgradeCost":[[20201,1000],[20203,1000]],"UpgradeTime":400,"Durability":1500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":1,"UpgradeCost":[[20201,3000],[20203,3000]],"UpgradeTime":2000,"Durability":2000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":4100,"Durability":2500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":8200,"Durability":3000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":4,"UpgradeCost":[[20201,60000],[20203,60000]],"UpgradeTime":12400,"Durability":3500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":5,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":16500,"Durability":4000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":20700,"Durability":4500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":7,"UpgradeCost":[[20201,120000],[20203,120000]],"UpgradeTime":31100,"Durability":5000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":8,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":45600,"Durability":5500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":9,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":65900,"Durability":6000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201009,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":6500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":0,"UpgradeCost":[[20201,1000],[20203,1000]],"UpgradeTime":400,"Durability":1500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":1,"UpgradeCost":[[20201,3000],[20203,3000]],"UpgradeTime":2000,"Durability":2000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":4100,"Durability":2500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":8200,"Durability":3000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":4,"UpgradeCost":[[20201,60000],[20203,60000]],"UpgradeTime":12400,"Durability":3500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":5,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":16500,"Durability":4000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":20700,"Durability":4500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":7,"UpgradeCost":[[20201,120000],[20203,120000]],"UpgradeTime":31100,"Durability":5000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":8,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":45600,"Durability":5500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":9,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":65900,"Durability":6000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201010,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":6500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":0,"UpgradeCost":[[20201,1000],[20203,1000]],"UpgradeTime":400,"Durability":1500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":1,"UpgradeCost":[[20201,3000],[20203,3000]],"UpgradeTime":2000,"Durability":2000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":2,"UpgradeCost":[[20201,10000],[20203,10000]],"UpgradeTime":4100,"Durability":2500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":3,"UpgradeCost":[[20201,30000],[20203,30000]],"UpgradeTime":8200,"Durability":3000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":4,"UpgradeCost":[[20201,60000],[20203,60000]],"UpgradeTime":12400,"Durability":3500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":5,"UpgradeCost":[[20201,80000],[20203,80000]],"UpgradeTime":16500,"Durability":4000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":6,"UpgradeCost":[[20201,100000],[20203,100000]],"UpgradeTime":20700,"Durability":4500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":7,"UpgradeCost":[[20201,120000],[20203,120000]],"UpgradeTime":31100,"Durability":5000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":8,"UpgradeCost":[[20201,150000],[20203,150000]],"UpgradeTime":45600,"Durability":5500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":9,"UpgradeCost":[[20201,200000],[20203,200000]],"UpgradeTime":65900,"Durability":6000,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":201011,"Level":10,"UpgradeCost":[],"UpgradeTime":0,"Durability":6500,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":202003,"Level":1,"UpgradeCost":[[101,200],[102,200]],"UpgradeTime":15,"Durability":800,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":202003,"Level":2,"UpgradeCost":[[101,300],[102,300]],"UpgradeTime":30,"Durability":1100,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":202003,"Level":3,"UpgradeCost":[[101,400],[102,400]],"UpgradeTime":45,"Durability":1400,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":202003,"Level":4,"UpgradeCost":[[101,500],[102,500]],"UpgradeTime":60,"Durability":1700,"ViewRange":0,"LeagueBuildAttrs":[]},
+    {"ConfigID":202003,"Level":5,"UpgradeCost":[[101,600],[102,600]],"UpgradeTime":0,"Durability":2000,"ViewRange":0,"LeagueBuildAttrs":[]}
 ]

File diff suppressed because it is too large
+ 0 - 0
sr/etc/data/map_castle.json


+ 3 - 1
sr/etc/data/map_id.json

@@ -1,3 +1,5 @@
 [
-    {"MapID":1,"MapGroup":"s1","MapDataFilepath":"map_static_data.pb","MapDataExtFilepath":"area_data.pb","InnerSceneFilepath":"inner_scene.pb","SeasonID":1}
+    {"MapID":1,"MapNodeID":"map-1","MapGroup":"s1","MapDataFilepath":"map_static_data.pb","MapDataExtFilepath":"area_data.pb","InnerSceneFilepath":"inner_scene.pb","SeasonID":1},
+    {"MapID":10001,"MapNodeID":"map-10001","MapGroup":"s1","MapDataFilepath":"map_static_data.pb","MapDataExtFilepath":"area_data.pb","InnerSceneFilepath":"inner_scene.pb","SeasonID":2},
+    {"MapID":20001,"MapNodeID":"map-20001","MapGroup":"s1","MapDataFilepath":"map_static_data.pb","MapDataExtFilepath":"area_data.pb","InnerSceneFilepath":"inner_scene.pb","SeasonID":3}
 ]

+ 36 - 20
sr/etc/data/map_res.json

@@ -1,22 +1,38 @@
 [
-    {"ConfigID":301001,"Level":1,"ItemID":111,"Yield":12000,"Armies":[1001,1]},
-    {"ConfigID":301002,"Level":2,"ItemID":111,"Yield":30000,"Armies":[1002,1]},
-    {"ConfigID":301003,"Level":3,"ItemID":111,"Yield":48000,"Armies":[1003,1]},
-    {"ConfigID":301004,"Level":4,"ItemID":111,"Yield":66000,"Armies":[1004,1]},
-    {"ConfigID":301005,"Level":5,"ItemID":111,"Yield":90000,"Armies":[1005,1]},
-    {"ConfigID":302001,"Level":1,"ItemID":112,"Yield":12000,"Armies":[1001,1]},
-    {"ConfigID":302002,"Level":2,"ItemID":112,"Yield":30000,"Armies":[1002,1]},
-    {"ConfigID":302003,"Level":3,"ItemID":112,"Yield":48000,"Armies":[1003,1]},
-    {"ConfigID":302004,"Level":4,"ItemID":112,"Yield":66000,"Armies":[1004,1]},
-    {"ConfigID":302005,"Level":5,"ItemID":112,"Yield":90000,"Armies":[1005,1]},
-    {"ConfigID":303001,"Level":1,"ItemID":113,"Yield":12000,"Armies":[1001,1]},
-    {"ConfigID":303002,"Level":2,"ItemID":113,"Yield":30000,"Armies":[1002,1]},
-    {"ConfigID":303003,"Level":3,"ItemID":113,"Yield":48000,"Armies":[1003,1]},
-    {"ConfigID":303004,"Level":4,"ItemID":113,"Yield":66000,"Armies":[1004,1]},
-    {"ConfigID":303005,"Level":5,"ItemID":113,"Yield":90000,"Armies":[1005,1]},
-    {"ConfigID":304001,"Level":1,"ItemID":114,"Yield":12000,"Armies":[1001,1]},
-    {"ConfigID":304002,"Level":2,"ItemID":114,"Yield":30000,"Armies":[1002,1]},
-    {"ConfigID":304003,"Level":3,"ItemID":114,"Yield":48000,"Armies":[1003,1]},
-    {"ConfigID":304004,"Level":4,"ItemID":114,"Yield":66000,"Armies":[1004,1]},
-    {"ConfigID":304005,"Level":5,"ItemID":114,"Yield":90000,"Armies":[1005,1]}
+    {"ConfigID":301001,"Level":1,"ItemID":111,"Yield":600,"Armies":[1001,1]},
+    {"ConfigID":301002,"Level":2,"ItemID":111,"Yield":900,"Armies":[1002,1]},
+    {"ConfigID":301003,"Level":3,"ItemID":111,"Yield":1500,"Armies":[1003,1]},
+    {"ConfigID":301004,"Level":4,"ItemID":111,"Yield":2500,"Armies":[1004,1]},
+    {"ConfigID":301005,"Level":5,"ItemID":111,"Yield":5000,"Armies":[1005,1]},
+    {"ConfigID":301006,"Level":6,"ItemID":111,"Yield":6000,"Armies":[1005,1]},
+    {"ConfigID":301007,"Level":7,"ItemID":111,"Yield":7000,"Armies":[1005,1]},
+    {"ConfigID":301008,"Level":8,"ItemID":111,"Yield":8000,"Armies":[1005,1]},
+    {"ConfigID":301009,"Level":9,"ItemID":111,"Yield":12000,"Armies":[1005,1]},
+    {"ConfigID":302001,"Level":1,"ItemID":112,"Yield":600,"Armies":[1001,1]},
+    {"ConfigID":302002,"Level":2,"ItemID":112,"Yield":900,"Armies":[1002,1]},
+    {"ConfigID":302003,"Level":3,"ItemID":112,"Yield":1500,"Armies":[1003,1]},
+    {"ConfigID":302004,"Level":4,"ItemID":112,"Yield":2500,"Armies":[1004,1]},
+    {"ConfigID":302005,"Level":5,"ItemID":112,"Yield":5000,"Armies":[1005,1]},
+    {"ConfigID":302006,"Level":6,"ItemID":112,"Yield":6000,"Armies":[1005,1]},
+    {"ConfigID":302007,"Level":7,"ItemID":112,"Yield":7000,"Armies":[1005,1]},
+    {"ConfigID":302008,"Level":8,"ItemID":112,"Yield":8000,"Armies":[1005,1]},
+    {"ConfigID":302009,"Level":9,"ItemID":112,"Yield":12000,"Armies":[1005,1]},
+    {"ConfigID":303001,"Level":1,"ItemID":113,"Yield":600,"Armies":[1001,1]},
+    {"ConfigID":303002,"Level":2,"ItemID":113,"Yield":900,"Armies":[1002,1]},
+    {"ConfigID":303003,"Level":3,"ItemID":113,"Yield":1500,"Armies":[1003,1]},
+    {"ConfigID":303004,"Level":4,"ItemID":113,"Yield":2500,"Armies":[1004,1]},
+    {"ConfigID":303005,"Level":5,"ItemID":113,"Yield":5000,"Armies":[1004,1]},
+    {"ConfigID":303006,"Level":6,"ItemID":113,"Yield":6000,"Armies":[1004,1]},
+    {"ConfigID":303007,"Level":7,"ItemID":113,"Yield":7000,"Armies":[1004,1]},
+    {"ConfigID":303008,"Level":8,"ItemID":113,"Yield":8000,"Armies":[1004,1]},
+    {"ConfigID":303009,"Level":9,"ItemID":113,"Yield":12000,"Armies":[1004,1]},
+    {"ConfigID":304001,"Level":1,"ItemID":114,"Yield":600,"Armies":[1001,1]},
+    {"ConfigID":304002,"Level":2,"ItemID":114,"Yield":900,"Armies":[1002,1]},
+    {"ConfigID":304003,"Level":3,"ItemID":114,"Yield":1500,"Armies":[1003,1]},
+    {"ConfigID":304004,"Level":4,"ItemID":114,"Yield":2500,"Armies":[1004,1]},
+    {"ConfigID":304005,"Level":5,"ItemID":114,"Yield":5000,"Armies":[1005,1]},
+    {"ConfigID":304006,"Level":6,"ItemID":114,"Yield":6000,"Armies":[1005,1]},
+    {"ConfigID":304007,"Level":7,"ItemID":114,"Yield":7000,"Armies":[1005,1]},
+    {"ConfigID":304008,"Level":8,"ItemID":114,"Yield":8000,"Armies":[1005,1]},
+    {"ConfigID":304009,"Level":9,"ItemID":114,"Yield":12000,"Armies":[1005,1]}
 ]

+ 31 - 1
sr/etc/data/proto_route.json

@@ -1164,7 +1164,7 @@
         "name": "[请求]联盟升级",
         "route": "map.league.upgrade",
         "request": "None",
-        "response": "I32I32",
+        "response": "I32",
         "push": "",
         "notify": "",
         "desc": ""
@@ -1649,6 +1649,16 @@
         "notify": "",
         "desc": ""
     },
+    {
+        "enable": true,
+        "name": "[推送]联盟升级推送",
+        "route": "map.league.upgradePush",
+        "request": "",
+        "response": "",
+        "push": "LeagueUpgradeNotice",
+        "notify": "",
+        "desc": "联盟升级时推送给所有在线成员"
+    },
     {
         "enable": true,
         "name": "[推送] 阵容阵容推送",
@@ -2639,6 +2649,26 @@
         "notify": "",
         "desc": ""
     },
+    {
+        "enable": true,
+        "name": "[推送]军情线",
+        "route": "map.pusher.mapArmyLines",
+        "request": "",
+        "response": "",
+        "push": "MapArmyLines",
+        "notify": "",
+        "desc": "如果客户端本地军情线已存在则更新"
+    },
+    {
+        "enable": true,
+        "name": "[推送]军情线删除",
+        "route": "map.pusher.mapArmyLineDel",
+        "request": "",
+        "response": "",
+        "push": "I64List",
+        "notify": "",
+        "desc": "军情线删除"
+    },
     {
         "enable": true,
         "name": "[推送]跑马灯列表",

+ 1 - 1
sr/etc/data/rank.json

@@ -2,6 +2,6 @@
     {"RankID":101,"RankType":1,"ShowCount":100,"MaxRankCount":200,"MinRankValue":600},
     {"RankID":102,"RankType":1,"ShowCount":100,"MaxRankCount":200,"MinRankValue":0},
     {"RankID":103,"RankType":1,"ShowCount":100,"MaxRankCount":200,"MinRankValue":0},
-    {"RankID":201,"RankType":2,"ShowCount":100,"MaxRankCount":200,"MinRankValue":0},
+    {"RankID":201,"RankType":2,"ShowCount":100,"MaxRankCount":200,"MinRankValue":1000},
     {"RankID":202,"RankType":2,"ShowCount":100,"MaxRankCount":200,"MinRankValue":0}
 ]

+ 3 - 3
sr/etc/data/shop_goods.json

@@ -104,7 +104,7 @@
     {"ShopPoolID":20101,"GoodsID":3,"BuyCost":[2,100],"BuyCondition":[],"BuyLimit":5,"Rewards":[140003,1]},
     {"ShopPoolID":20101,"GoodsID":4,"BuyCost":[2,500],"BuyCondition":[],"BuyLimit":3,"Rewards":[140004,1]},
     {"ShopPoolID":20101,"GoodsID":5,"BuyCost":[2,1000],"BuyCondition":[],"BuyLimit":2,"Rewards":[140005,1]},
-    {"ShopPoolID":20201,"GoodsID":1,"BuyCost":[2,100],"BuyCondition":[],"BuyLimit":0,"Rewards":[150001,1]},
-    {"ShopPoolID":20201,"GoodsID":2,"BuyCost":[2,700],"BuyCondition":[],"BuyLimit":0,"Rewards":[150002,1]},
-    {"ShopPoolID":20201,"GoodsID":3,"BuyCost":[2,3000],"BuyCondition":[],"BuyLimit":0,"Rewards":[150003,2]}
+    {"ShopPoolID":20201,"GoodsID":1,"BuyCost":[2,100],"BuyCondition":[],"BuyLimit":999,"Rewards":[150001,1]},
+    {"ShopPoolID":20201,"GoodsID":2,"BuyCost":[2,700],"BuyCondition":[],"BuyLimit":999,"Rewards":[150002,1]},
+    {"ShopPoolID":20201,"GoodsID":3,"BuyCost":[2,3000],"BuyCondition":[],"BuyLimit":999,"Rewards":[150003,2]}
 ]

+ 50 - 0
sr/etc/data/skill.json

@@ -161,6 +161,56 @@
     {"ID":301621,"Type":3,"MaxLv":1,"UnlockStar":0},
     {"ID":301622,"Type":3,"MaxLv":1,"UnlockStar":0},
     {"ID":301623,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410000,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410010,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410020,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410030,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410040,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410050,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410060,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410070,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410080,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410090,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410100,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410110,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410120,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410130,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410140,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410150,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410160,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410170,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410180,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410190,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410200,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410210,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410220,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":410230,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420000,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420010,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420020,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420030,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420040,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420050,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420060,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420070,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420080,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420090,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420100,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420110,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420120,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420130,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420140,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420150,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420160,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420170,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420180,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420190,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420200,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420210,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420220,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420230,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420240,"Type":3,"MaxLv":1,"UnlockStar":0},
+    {"ID":420250,"Type":3,"MaxLv":1,"UnlockStar":0},
     {"ID":10010110,"Type":2,"MaxLv":1,"UnlockStar":0},
     {"ID":10020110,"Type":2,"MaxLv":1,"UnlockStar":0},
     {"ID":10030110,"Type":2,"MaxLv":1,"UnlockStar":0},

+ 50 - 0
sr/etc/data/skill_level.json

@@ -641,6 +641,56 @@
     {"SkillID":301621,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
     {"SkillID":301622,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
     {"SkillID":301623,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410000,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410010,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410020,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410030,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410040,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410050,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410060,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410070,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410080,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410090,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410100,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410110,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410120,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410130,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410140,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410150,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410160,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410170,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410180,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410190,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410200,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410210,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410220,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":410230,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420000,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420010,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420020,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420030,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420040,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420050,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420060,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420070,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420080,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420090,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420100,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420110,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420120,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420130,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420140,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420150,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420160,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420170,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420180,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420190,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420200,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420210,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420220,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420230,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420240,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
+    {"SkillID":420250,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
     {"SkillID":10010110,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
     {"SkillID":10020110,"Level":1,"UnlockStar":0,"UpgradeCost":[]},
     {"SkillID":10030110,"Level":1,"UnlockStar":0,"UpgradeCost":[]},

+ 63 - 1
sr/etc/data/skill_pool.json

@@ -11,5 +11,67 @@
     {"PoolID":2001014,"SkillID":301620,"Weight":100},
     {"PoolID":2001014,"SkillID":301621,"Weight":100},
     {"PoolID":2001014,"SkillID":301622,"Weight":100},
-    {"PoolID":2001014,"SkillID":301623,"Weight":100}
+    {"PoolID":2001014,"SkillID":301623,"Weight":100},
+    {"PoolID":5001001,"SkillID":301612,"Weight":100},
+    {"PoolID":5001001,"SkillID":301613,"Weight":100},
+    {"PoolID":5001001,"SkillID":301614,"Weight":100},
+    {"PoolID":5001001,"SkillID":301615,"Weight":100},
+    {"PoolID":5001001,"SkillID":301616,"Weight":100},
+    {"PoolID":5001001,"SkillID":301617,"Weight":100},
+    {"PoolID":5001001,"SkillID":301618,"Weight":100},
+    {"PoolID":5001001,"SkillID":301619,"Weight":100},
+    {"PoolID":5001001,"SkillID":301620,"Weight":100},
+    {"PoolID":5001001,"SkillID":301621,"Weight":100},
+    {"PoolID":5001001,"SkillID":301622,"Weight":100},
+    {"PoolID":5001001,"SkillID":301623,"Weight":100},
+    {"PoolID":3000001,"SkillID":410001,"Weight":100},
+    {"PoolID":3000001,"SkillID":410011,"Weight":100},
+    {"PoolID":3000001,"SkillID":410021,"Weight":100},
+    {"PoolID":3000001,"SkillID":410031,"Weight":100},
+    {"PoolID":3000001,"SkillID":410041,"Weight":100},
+    {"PoolID":3000001,"SkillID":410051,"Weight":100},
+    {"PoolID":3000001,"SkillID":410061,"Weight":100},
+    {"PoolID":3000001,"SkillID":410071,"Weight":100},
+    {"PoolID":3000001,"SkillID":410081,"Weight":100},
+    {"PoolID":3000001,"SkillID":410091,"Weight":100},
+    {"PoolID":3000001,"SkillID":410101,"Weight":100},
+    {"PoolID":3000001,"SkillID":410111,"Weight":100},
+    {"PoolID":3000001,"SkillID":410121,"Weight":100},
+    {"PoolID":3000001,"SkillID":410131,"Weight":100},
+    {"PoolID":3000001,"SkillID":410141,"Weight":100},
+    {"PoolID":3000001,"SkillID":410151,"Weight":100},
+    {"PoolID":3000001,"SkillID":410161,"Weight":100},
+    {"PoolID":3000001,"SkillID":410171,"Weight":100},
+    {"PoolID":3000001,"SkillID":410181,"Weight":100},
+    {"PoolID":3000001,"SkillID":410191,"Weight":100},
+    {"PoolID":3000001,"SkillID":410201,"Weight":100},
+    {"PoolID":3000001,"SkillID":410211,"Weight":100},
+    {"PoolID":3000001,"SkillID":410221,"Weight":100},
+    {"PoolID":3000001,"SkillID":410231,"Weight":100},
+    {"PoolID":3000002,"SkillID":420001,"Weight":100},
+    {"PoolID":3000002,"SkillID":420011,"Weight":100},
+    {"PoolID":3000002,"SkillID":420021,"Weight":100},
+    {"PoolID":3000002,"SkillID":420031,"Weight":100},
+    {"PoolID":3000002,"SkillID":420041,"Weight":100},
+    {"PoolID":3000002,"SkillID":420051,"Weight":100},
+    {"PoolID":3000002,"SkillID":420061,"Weight":100},
+    {"PoolID":3000002,"SkillID":420071,"Weight":100},
+    {"PoolID":3000002,"SkillID":420081,"Weight":100},
+    {"PoolID":3000002,"SkillID":420091,"Weight":100},
+    {"PoolID":3000002,"SkillID":420101,"Weight":100},
+    {"PoolID":3000002,"SkillID":420111,"Weight":100},
+    {"PoolID":3000002,"SkillID":420121,"Weight":100},
+    {"PoolID":3000002,"SkillID":420131,"Weight":100},
+    {"PoolID":3000002,"SkillID":420141,"Weight":100},
+    {"PoolID":3000002,"SkillID":420151,"Weight":100},
+    {"PoolID":3000002,"SkillID":420161,"Weight":100},
+    {"PoolID":3000002,"SkillID":420171,"Weight":100},
+    {"PoolID":3000002,"SkillID":420181,"Weight":100},
+    {"PoolID":3000002,"SkillID":420191,"Weight":100},
+    {"PoolID":3000002,"SkillID":420201,"Weight":100},
+    {"PoolID":3000002,"SkillID":420211,"Weight":100},
+    {"PoolID":3000002,"SkillID":420221,"Weight":100},
+    {"PoolID":3000002,"SkillID":420231,"Weight":100},
+    {"PoolID":3000002,"SkillID":420241,"Weight":100},
+    {"PoolID":3000002,"SkillID":420251,"Weight":100}
 ]

+ 1 - 1
sr/etc/data_embed/area.json

@@ -6,7 +6,7 @@
     {"Pid":2188005,"AreaID":5,"AreaName":"LCS测试服","Gate":"192.168.1.38:30001"},
     {"Pid":2188006,"AreaID":6,"AreaName":"AZW测试服","Gate":"192.168.1.41:30001"},
     {"Pid":2188007,"AreaID":7,"AreaName":"yanjian测试服","Gate":"192.168.1.48:30001"},
-    {"Pid":2188008,"AreaID":8,"AreaName":"hw测试服","Gate":"192.168.1.29:30001"},
+    {"Pid":2188008,"AreaID":8,"AreaName":"HW测试服","Gate":"192.168.1.29:30001"},
     {"Pid":2188099,"AreaID":99,"AreaName":"local区","Gate":"127.0.0.1:30001"},
     {"Pid":2188100,"AreaID":100,"AreaName":"[CBT]1区","Gate":"47.238.143.20:30001"}
 ]

+ 4 - 1
sr/etc/data_embed/game_debug.json

@@ -19,7 +19,10 @@
             "MapReinforceCooldown": 10000,
             "BeginerInvincibleTime": 60000,
             "ComebackInvincibleTime": 60000,
-            "ResOccupyInvincibleTime": 10000
+            "ResOccupyInvincibleTime": 10000,
+            "FacilityUpgradeTime": 0,
+            "HeroInjureTime": 15,
+            "MapCastleSiegeTime": 60000
         }
     },
     {

+ 67 - 9
sr/etc/inner_pb/actor.proto

@@ -430,15 +430,6 @@ message MarchRequest {
   MarchSync marchSync  = 20; // 行军同步
 }
 
-// 自动行军请求
-message AutoMarchRequest {
-  int32 teamID        = 1; // 队伍ID
-  int64 objectID      = 2; // 对象ID
-  int32 marchType     = 3; // 行军类型
-  Point start         = 4; // 起始坐标
-  Point end           = 5; // 终点坐标
-}
-
 // 集结请求
 message AssembleRequest {
 	int64 playerID         =  1; // 发起集结的玩家ID
@@ -991,6 +982,14 @@ message FindPathRequest {
   int32 marchType = 20;
 }
 
+// 多重寻路请求
+message FindMultiPathRequest {
+  // 所有请求
+  repeated FindPathRequest requests = 1;
+  // 寻路类型:0=所有请求成功返回,1=任意寻路成功返回,2=只返回成功路径
+  int32 findType = 2;
+}
+
 // 自动防守请求
 message AutoDefendRequest {
   // 建筑对象ID
@@ -1041,4 +1040,63 @@ message ScoutSearchResult {
   string targetPlayerName = 3;
   // 侦察结果 资源列表
   AssetList assets = 4;
+}
+
+message LeagueJoinNotice {
+  // 联盟ID
+  int64 leagueID = 1;
+  // 联盟名称
+  string leagueName = 2;
+  // 占领的城池ID列表
+  repeated int32 castleConfigIDs = 3;
+}
+
+// 自动行军请求
+message AutoMarchRequest {
+  // 自动行军列表
+  repeated AutoMarchReqestData list = 1;
+  // 玩家ID
+  int64 playerID = 2;
+  // 队伍ID
+  int64 ObjectID = 3;
+  // 联盟ID
+  int64 leagueID = 4;
+}
+
+// 自动行军
+message AutoMarchReqestData {
+  // 行军类型
+  int32 marchType = 1;
+  // 起点
+  Point start = 2;
+  // 终点
+  Point end = 3;
+}
+
+// 自动行军请求
+message AutoMarchResult {
+  // 自动行军列表
+  repeated AutoMarchResultData list = 1;
+  // 玩家ID
+  int64 playerID = 2;
+  // 队伍ID
+  int64 ObjectID = 3;
+}
+
+// 自动行军
+message AutoMarchResultData {
+  // 行军类型
+  int32 marchType = 1;
+  // 路径
+  repeated Point path = 2;
+}
+
+// 建筑攻城点
+message BuildSiegePoint {
+  // 攻城点
+  repeated Point points = 1;
+  // 最小距离
+  int32 minDistance = 2;
+  // 最大距离
+  int32 maxDistance = 3;
 }

+ 1 - 1
sr/etc/profile/lcs.json

@@ -40,7 +40,7 @@
                 "node_id": "gate-1",
                 "address": ":30001",
                 "__settings__": {
-                    "heartbeat": 120,
+                    "heartbeat": 30,
                     "ref_logger": "debug_console_log",
                     "redis_id_list": {
                         "guid_redis_id": "redis-lcs",

+ 1 - 1
sr/go.mod

@@ -3,7 +3,7 @@ module f1-game
 go 1.24
 
 require (
-	github.com/cherry-game/cherry v1.4.18
+	github.com/cherry-game/cherry v1.4.19
 	github.com/cherry-game/components/data-config v1.4.1
 	github.com/cherry-game/components/gin v1.4.1
 	github.com/cherry-game/components/mongo v1.4.1

+ 2 - 2
sr/go.sum

@@ -8,8 +8,8 @@ github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
 github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
 github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams=
 github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
-github.com/cherry-game/cherry v1.4.18 h1:TotNOPs1ggV1oBZpSUiAciggYKJNncR2ZU1ccYV9Jmg=
-github.com/cherry-game/cherry v1.4.18/go.mod h1:TP8NL8jrNHBx+X8GzPKcTG4XD9Ee8PBqjysUrc8Gosc=
+github.com/cherry-game/cherry v1.4.19 h1:jc86D+t/jdOyzR2HjguBnftzl97yJfg7kQNp0V196JY=
+github.com/cherry-game/cherry v1.4.19/go.mod h1:TP8NL8jrNHBx+X8GzPKcTG4XD9Ee8PBqjysUrc8Gosc=
 github.com/cherry-game/components/data-config v1.4.1 h1:7CixOrcXorq0J9ZPOEmFD/IWbdpkhaYTDguOuBSAuo0=
 github.com/cherry-game/components/data-config v1.4.1/go.mod h1:bor8ptaWGTYplRdVSpGTwJU6AAcM9x9q60IGDfUJAuU=
 github.com/cherry-game/components/gin v1.4.1 h1:TD1lH+xgXLPaVUKOnZ3u2OpKtQU1urChGLEwMa3F25E=

+ 2 - 3
sr/internal/actor_remote/map_player.go

@@ -35,9 +35,8 @@ func (p *mapPlayer) AddAssets(mapNodeID string, playerID int64, addAssets types.
 	return code.OK
 }
 
-func (p *mapPlayer) LeagueJoin(playerID, leagueID int64, leagueName string) int32 {
-	joinReq := &pb.I64Str{Key: leagueID, Value: leagueName}
+func (p *mapPlayer) LeagueJoin(playerID int64, req *pb.LeagueJoinNotice) int32 {
 	// 通知map_player 玩家加入联盟
 	targetPath := cfacade.NewChildPath(capp.NodeID(), nameActor.Map_Player, playerID)
-	return capp.CallWait(targetPath, nameRemote.MapLeague_JoinNotice, joinReq, nil)
+	return capp.CallWait(targetPath, nameRemote.MapLeague_JoinNotice, req, nil)
 }

+ 21 - 12
sr/internal/battle/battle.go

@@ -1,7 +1,7 @@
 package battle
 
 import (
-	cherryApp "f1-game/internal/cherry_app"
+	capp "f1-game/internal/cherry_app"
 	"f1-game/internal/code"
 	"f1-game/internal/component/redis"
 	"f1-game/internal/constant"
@@ -29,14 +29,8 @@ const (
 
 // 战斗验证
 func Validation(recordID string, battleParam *pb.BattleParam) *pb.BattleResult {
-	reqData, err := cherryApp.Serializer().Marshal(battleParam)
-	if err != nil {
-		clog.Warnf("[BattleValidation] Marshal battleParam error. err = %v", err)
-		return nil
-	}
-
 	start := time.Now()
-	ret := validationRequest(recordID, reqData)
+	ret := validationRequest(recordID, battleParam)
 
 	cost := time.Since(start)
 	// 打印耗时
@@ -47,7 +41,13 @@ func Validation(recordID string, battleParam *pb.BattleParam) *pb.BattleResult {
 	return ret
 }
 
-func validationRequest(recordID string, reqData []byte) *pb.BattleResult {
+func validationRequest(recordID string, battleParam *pb.BattleParam) *pb.BattleResult {
+	reqData, err := capp.Serializer().Marshal(battleParam)
+	if err != nil {
+		clog.Warnf("[BattleValidation] Marshal battleParam error. err = %v", err)
+		return nil
+	}
+
 	conn := cnats.GetConnect()
 	if conn == nil {
 		clog.Errorf("[BattleValidation] nats connect is nil")
@@ -62,7 +62,7 @@ func validationRequest(recordID string, reqData []byte) *pb.BattleResult {
 	}
 
 	reply := &pb.BattleReplay{}
-	err = cherryApp.Serializer().Unmarshal(replyData, reply)
+	err = capp.Serializer().Unmarshal(replyData, reply)
 	if err != nil {
 		clog.Warnf("[BattleValidation] Unmarshal replyData error. err = %v", err)
 		return nil
@@ -78,6 +78,15 @@ func validationRequest(recordID string, reqData []byte) *pb.BattleResult {
 		return nil
 	}
 
+	// 如果设置生成配置数据,则给录像赋值配置数据
+	if battleParam.GenerateConfigData && len(reply.Result.ConfigData) > 0 {
+		battleParam.ConfigData = reply.Result.ConfigData
+		if reqData, err = capp.Serializer().Marshal(battleParam); err != nil {
+			clog.Warnf("[BattleValidation] Marshal GenerateConfigData battleParam error. err = %v", err)
+			return nil
+		}
+	}
+
 	// 保存成功的请求数据
 	sendBattleRecord(recordID, reqData, false)
 	return reply.Result
@@ -94,14 +103,14 @@ func sendBattleRecord(recordID string, reqData []byte, isFail bool) {
 	)
 
 	// 随机一个record节点
-	randRecord, found := cherryApp.Discovery().Random(constant.NodeRecord)
+	randRecord, found := capp.Discovery().Random(constant.NodeRecord)
 	if !found {
 		clog.Warnf("[sendBattleRecord] random record node error. node = %s", constant.NodeRecord)
 		return
 	}
 
 	target := cfacade.NewPath(randRecord.GetNodeID(), nameActor.Record)
-	cherryApp.Call(target, nameRemote.Map_BattleRecord, req)
+	capp.Call(target, nameRemote.Map_BattleRecord, req)
 }
 
 // 获取最大血量

+ 1 - 0
sr/internal/code/status_code.go

@@ -636,6 +636,7 @@ const (
 	MapSiege_NoLink                int32 = 118117 // 攻城:不接壤
 	MapBuild_RedeployLimit         int32 = 118118 // 调动数已达上限
 	MapPoint_OutOfBound            int32 = 118119 // 坐标点超出地图边界
+	MapBuild_NotInSameLeague       int32 = 118120 // 当前建筑为非同盟建筑
 )
 
 // 探险

+ 3 - 5
sr/internal/component/db/queue/table_queue.go

@@ -13,8 +13,6 @@ import (
 	"go.mongodb.org/mongo-driver/v2/mongo"
 	mopts "go.mongodb.org/mongo-driver/v2/mongo/options"
 
-	ctime "github.com/cherry-game/cherry/extend/time"
-
 	dbFacade "f1-game/internal/component/db/facade"
 
 	cstring "github.com/cherry-game/cherry/extend/string"
@@ -182,7 +180,7 @@ func (p *TableQueue) InQueue(table dbFacade.Table) {
 	}
 
 	// flush update time
-	table.FlushUpdateTime(ctime.Now().ToMillisecond())
+	table.FlushUpdateTime(time.Now().UnixMilli())
 	table.CheckField()
 
 	// marshal to bytes
@@ -243,7 +241,7 @@ func (p *tableWorker) run(wg *sync.WaitGroup) {
 	checkTicker := time.NewTicker(100 * time.Millisecond)
 	defer checkTicker.Stop()
 
-	lastTicker := ctime.Now()
+	lastTicker := time.Now()
 
 	for {
 		select {
@@ -251,7 +249,7 @@ func (p *tableWorker) run(wg *sync.WaitGroup) {
 			return
 		case t := <-checkTicker.C:
 			if t.Unix() >= lastTicker.Add(p.saveTicker).Unix() {
-				lastTicker = ctime.Now()
+				lastTicker = time.Now()
 
 				// Use PopBatch to get multiple items at once
 				list := p.dataMaps.PopBatch(p.saveCount)

+ 2 - 0
sr/internal/constant/mail.go

@@ -4,7 +4,9 @@ package constant
 const (
 	MailID_LeagueJobSet       = 1001 // 联盟职位变更
 	MailID_LeagueJobResigned  = 1002 // 联盟职位卸任
+	MailID_LeagueStartWar     = 1003 // 发起人:{玩家名} 进攻时间:{时间} 进攻地点:{系统城} 联盟攻城需要每一位成员积极参与。点击{卫城}{城池坐标}使用集结指令即可参与攻城。
 	MailID_LeagueJoinSuccess  = 1007 // 你已成功加入{0}联盟
+	MailID_LeagueStopWar      = 1009 // {玩家名}取消了对{城池名}{城池坐标}的攻击
 	MailID_LeagueBuild        = 1101 // 联盟建筑建成
 	MailID_LeagueBuildDiscard = 1102 // 联盟建筑被拆除
 	MailID_LeagueUnionSuccess = 1201 // 恭喜,您所在联盟已与{0}成为联邦

+ 45 - 9
sr/internal/constant/map.go

@@ -1,6 +1,8 @@
 package constant
 
 import (
+	"f1-game/internal/enum"
+
 	ctime "github.com/cherry-game/cherry/extend/time"
 )
 
@@ -10,7 +12,8 @@ const (
 	MapTileMeetBattleCount  = 5                                // 单次触发遭遇战的数量
 	MapLeastStartWarMinite  = 1                                // 最少宣战时间
 	MapInitObjectID         = 10000                            // 初始化对象ID
-	MapCastleSiegeTime      = 10 * ctime.MillisecondsPerMinute // 攻城持续时间
+	MapCastleSiegeTime      = 60 * ctime.MillisecondsPerMinute // 攻城持续时间
+	MapLeastCastleSiegeTime = 1 * ctime.MillisecondsPerMinute  // 最少攻城持续时间
 	MapMaxTileRetreat       = 30                               // 最大撤退数
 	MapDefaultStateID       = 1                                // 默认出生州
 	MapLeastSiegeWaitTime   = 10 * ctime.MillisecondsPerSecond // 最少攻城等待时间
@@ -22,11 +25,11 @@ const (
 )
 
 const (
-	MapMainForceWaitTimePart1  = ctime.MillisecondsPerSecond     // 主力出击第一阶段等待时间
-	MapMainForceWaitTimePart2  = 5 * ctime.MillisecondsPerSecond // 主力出击第二阶段等待时间
-	MapSiegeSquadWaitTimePart1 = ctime.MillisecondsPerSecond     // 拆迁队出击第一阶段等待时间
-	MapSiegeSquadWaitTimePart2 = 5 * ctime.MillisecondsPerSecond // 拆迁队出击第二阶段等待时间
-	MapAutoSiegeWaitTimePart3  = ctime.MillisecondsPerSecond     // 自动攻城第三阶段等待时间
+	MapMainForceWaitTimePart1  = ctime.MillisecondsPerSecond      // 主力出击第一阶段等待时间
+	MapMainForceWaitTimePart2  = 10 * ctime.MillisecondsPerSecond // 主力出击第二阶段等待时间
+	MapSiegeSquadWaitTimePart1 = 5 * ctime.MillisecondsPerSecond  // 拆迁队出击第一阶段等待时间
+	MapSiegeSquadWaitTimePart2 = 60 * ctime.MillisecondsPerSecond // 拆迁队出击第二阶段等待时间
+	MapAutoSiegeWaitTimePart3  = ctime.MillisecondsPerSecond      // 自动攻城第三阶段等待时间
 )
 
 const (
@@ -47,8 +50,10 @@ const (
 	MapTowerHeight_Castle int32 = 50
 	MapTowerWidth_Castle  int32 = 50
 
-	MapTowerWidth_March  int32 = 20
-	MapTowerHeight_March int32 = 20
+	MapTowerWidth_March     int32 = 20
+	MapTowerHeight_March    int32 = 20
+	MapTowerWidth_ArmyLine  int32 = 20
+	MapTowerHeight_ArmyLine int32 = 20
 )
 
 const (
@@ -124,10 +129,12 @@ const (
 	MapBuild_Start             = 200001
 	MapBuild_SiegeBase   int32 = 200001 // 攻城地基
 	MapBuild_LeaguePoint int32 = 201001 // 联盟驻地
-	MapBuild_LeagueCamp  int32 = 201003 // 同盟大营
+	MapBuild_SiegeCamp   int32 = 201002 // 攻城大营
+	MapBuild_LeagueCamp  int32 = 201003 // 联盟大营
 	MapBuild_LeagueFlag  int32 = 201005 // 联盟旗帜
 	MapBuild_ArrowTower  int32 = 201006 // 箭塔
 	MapBuild_Barricade   int32 = 201007 // 拒马
+	MapBuild_ResTown     int32 = 201010 // 联盟农田
 	MapBuild_MainCity    int32 = 202001 // 玩家主城
 	MapBuild_CityBase    int32 = 202002 // 玩家地基
 	MapBuild_Camp        int32 = 202003 // 营账
@@ -139,6 +146,35 @@ const (
 	MapRes_End   = 400000
 )
 
+var (
+	// 联盟建筑-建筑数量上限属性ID映射
+	LeagueMapBuildCountLimitAttrIDMap = map[int32]int32{
+		MapBuild_LeaguePoint: enum.LeagueAttrResidenceCountLimit,
+		MapBuild_SiegeCamp:   enum.LeagueAttrSiegeCampLimit,
+		MapBuild_LeagueCamp:  enum.LeagueAttrCampCountLimit,
+		MapBuild_LeagueFlag:  enum.LeagueAttrFlagCountLimit,
+		MapBuild_Barricade:   enum.LeagueAttrBarricadeCountLimit,
+		MapBuild_ArrowTower:  enum.LeagueAttrArrowTowerCountLimit,
+		MapBuild_ResTown:     enum.LeagueAttrResTownCountLimit,
+	}
+
+	// 联盟建筑-建筑等级上限属性ID映射
+	LeagueMapBuildLevelLimitAttrIDMap = map[int32]int32{
+		MapBuild_LeagueCamp: enum.LeagueAttrCampLevelLimit,
+		MapBuild_LeagueFlag: enum.LeagueAttrFlagCountLimit,
+		MapBuild_Barricade:  enum.LeagueAttrBarricadeLevelLimit,
+		MapBuild_ArrowTower: enum.LeagueAttrArrowTowerLevelLimit,
+		MapBuild_ResTown:    enum.LeagueAttrResTownLevelLimit,
+	}
+)
+
+const (
+	ArmyLine_AffectMinDistance = 200 // 军情线影响最小距离
+	ArmyLine_UpdateInterval    = 5   // 军情线更新间隔时间
+	ArmyLine_SyncMinStepLen    = 20  // 军情线增量同步最小步长
+	ArmyLine_OneBatchStepLen   = 100 // 军情线一批同步多少步
+)
+
 func IsMapTile(configID int32) bool {
 	return configID >= MapTile_Start && configID <= MapTile_End
 }

+ 20 - 17
sr/internal/constant/test.go

@@ -1,21 +1,24 @@
 package constant
 
 const (
-	GameDebug_MapRelocateCooldown         = "MapRelocateCooldown"
-	GameDebug_MapBuildTime                = "MapBuildTime"
-	GameDebug_MapCityBaseCooldown         = "MapCityBaseCooldown"
-	GameDebug_MapComebackCooldown         = "MapComebackCooldown"
-	GameDebug_MapRechooseComebackCooldown = "MapRechooseComebackCooldown"
-	GameDebug_SiegeValue                  = "SiegeValue"
-	GameDebug_MapSiegeWaitTime            = "MapSiegeWaitTime"
-	GameDebug_MapSnatchWaitTime           = "MapSnatchWaitTime"
-	GameDebug_MapDiscardWaitTime          = "MapDiscardWaitTime"
-	GameDebug_MapOccupyWaitTime           = "MapOccupyWaitTime"
-	GameDebug_MapMarchSpeedUp             = "MapMarchSpeedUp"
-	GameDebug_MapReinforcePrepareTime     = "MapReinforcePrepareTime"
-	GameDebug_MapReinforceEffectTime      = "MapReinforceEffectTime"
-	GameDebug_MapReinforceCooldown        = "MapReinforceCooldown"
-	GameDebug_BeginerInvincibleTime       = "BeginerInvincibleTime"
-	GameDebug_ComebackInvincibleTime      = "ComebackInvincibleTime"
-	GameDebug_ResOccupyInvincibleTime     = "ResOccupyInvincibleTime"
+	GameDebug_MapRelocateCooldown         = "MapRelocateCooldown"         // 迁城冷却时间
+	GameDebug_MapBuildTime                = "MapBuildTime"                // 建筑建造时间
+	GameDebug_MapCityBaseCooldown         = "MapCityBaseCooldown"         // 地基建造冷却时间
+	GameDebug_MapComebackCooldown         = "MapComebackCooldown"         // 再起冷却时间
+	GameDebug_MapRechooseComebackCooldown = "MapRechooseComebackCooldown" // 选州再起冷却时间
+	GameDebug_SiegeValue                  = "SiegeValue"                  // 攻城值
+	GameDebug_MapSiegeWaitTime            = "MapSiegeWaitTime"            // 攻城等待时间
+	GameDebug_MapSnatchWaitTime           = "MapSnatchWaitTime"           // 掠夺等待时间
+	GameDebug_MapDiscardWaitTime          = "MapDiscardWaitTime"          // 放弃等待时间
+	GameDebug_MapOccupyWaitTime           = "MapOccupyWaitTime"           // 占领等待时间
+	GameDebug_MapMarchSpeedUp             = "MapMarchSpeedUp"             // 是否开启行军加速
+	GameDebug_MapReinforcePrepareTime     = "MapReinforcePrepareTime"     // 加固准备时间
+	GameDebug_MapReinforceEffectTime      = "MapReinforceEffectTime"      // 加固生效时间
+	GameDebug_MapReinforceCooldown        = "MapReinforceCooldown"        // 加固冷却时间
+	GameDebug_BeginerInvincibleTime       = "BeginerInvincibleTime"       // 新手免战时间
+	GameDebug_ComebackInvincibleTime      = "ComebackInvincibleTime"      // 再起免战时间
+	GameDebug_ResOccupyInvincibleTime     = "ResOccupyInvincibleTime"     // 资源占领免战时间
+	GameDebug_FacilityUpgradeTime         = "FacilityUpgradeTime"         // 城建升级时间
+	GameDebug_HeroInjureTime              = "HeroInjureTime"              // 英雄重伤时间
+	GameDebug_MapCastleSiegeTime          = "MapCastleSiegeTime"          // 攻城持续时间
 )

+ 9 - 1
sr/internal/constant/time.go

@@ -1,6 +1,10 @@
 package constant
 
-import "time"
+import (
+	"time"
+
+	ctime "github.com/cherry-game/cherry/extend/time"
+)
 
 const (
 	Duration_March     = 500 * time.Millisecond // 行军定时器时长
@@ -16,3 +20,7 @@ const (
 	TickOffset_March      = 500 // 行军定时器偏移
 	Aoi_WatcherLeaveDelay = 30  // aoi灯塔watcher离开延迟删除时间(单位秒)
 )
+
+const (
+	AutoMarchWaitTimeout = 3 * ctime.MillisecondsPerSecond
+)

+ 21 - 2
sr/internal/data/arm_level.go

@@ -23,12 +23,15 @@ type (
 		InfantryAttr          types.Attrs  `json:"InfantryAttr"`          // 步兵加成
 		CavalryAttr           types.Attrs  `json:"CavalryAttr"`           // 骑兵加成
 		ArcherAttr            types.Attrs  `json:"ArcherAttr"`            // 弓兵加成
+		BaseFeat              int64        `json:"BaseFeat"`              // 基础功勋
+		FeatRatio             int64        `json:"FeatRatio"`             // 获得功勋系数
 	}
 
 	armLevelConfig struct {
 		baseConfig
-		list      []*ArmLevelRow         // all list
-		idUniMaps map[int32]*ArmLevelRow // key:id
+		list         []*ArmLevelRow         // all list
+		idUniMaps    map[int32]*ArmLevelRow // key:id
+		levelUniMaps map[int32]*ArmLevelRow // key:level
 	}
 )
 
@@ -38,6 +41,7 @@ func (p *armLevelConfig) Name() string {
 
 func (p *armLevelConfig) Init() {
 	p.idUniMaps = map[int32]*ArmLevelRow{}
+	p.levelUniMaps = map[int32]*ArmLevelRow{}
 }
 
 func (p *armLevelConfig) OnLoad(maps interface{}, reload bool) (int, error) {
@@ -57,6 +61,12 @@ func (p *armLevelConfig) OnLoad(maps interface{}, reload bool) (int, error) {
 	}
 	p.idUniMaps = idUniMaps
 
+	levelUniMaps := map[int32]*ArmLevelRow{}
+	for _, row := range list {
+		levelUniMaps[row.Level] = row
+	}
+	p.levelUniMaps = levelUniMaps
+
 	return len(list), nil
 }
 
@@ -75,3 +85,12 @@ func (p *armLevelConfig) ContainID(id int32) bool {
 	_, found := p.idUniMaps[id]
 	return found
 }
+func (p *armLevelConfig) GetByLevel(level int32) (*ArmLevelRow, bool) {
+	value, found := p.levelUniMaps[level]
+	return value, found
+}
+
+func (p *armLevelConfig) ContainLevel(level int32) bool {
+	_, found := p.levelUniMaps[level]
+	return found
+}

+ 10 - 0
sr/internal/data/const.go

@@ -129,6 +129,7 @@ type (
 		MapBattleLossTroops           int32                        `json:"MapBattleLossTroops"`           // 战斗损兵比例(单位:万分比)
 		MapBattleReportPVPLimit       int                          `json:"MapBattleReportPVPLimit"`       // 战报PVP交战记录上限
 		MapBattleReportPVELimit       int                          `json:"MapBattleReportPVELimit"`       // 战报PVE开拓记录上限
+		MapBattleReportScoutLimit     int                          `json:"MapBattleReportScoutLimit"`     // 战报侦察记录上限
 		MapBattleReportLikeLimit      int                          `json:"MapBattleReportLikeLimit"`      // 战报个人收藏上限
 		MapBattleReportPage           int                          `json:"MapBattleReportPage"`           // 战报每页拉取10条
 		MapSiegeWaitTime              int64                        `json:"MapSiegeWaitTime"`              // 攻城等待时间(秒)
@@ -191,6 +192,15 @@ type (
 		MapScoutTime                  int64                        `json:"MapScoutTime"`                  // 地图侦察时间 单位秒
 		MapScoutCosts                 types.Assets                 `json:"MapScoutCosts"`                 // 地图侦察消耗
 		EquipSingleGetLimit           int64                        `json:"EquipSingleGetLimit"`           // 单次获得装备数量上限
+		CrystalMineToConRatio         int64                        `json:"CrystalMineToConRatio"`         // 沙盘经验转联盟贡献比例 万分比
+		TileSiegeToConRatio           int64                        `json:"TileSiegeToConRatio"`           // 攻城值转联盟贡献比例 万分比
+		FacilityPrestigeToConRatio    int64                        `json:"FacilityPrestigeToConRatio"`    // 城建繁荣度转联盟贡献比例 万分比
+		ConToLeagueExpRatio           int64                        `json:"ConToLeagueExpRatio"`           // 联盟贡献转联盟经验比例 万分比
+		FeatToLeagueExpRatio          int64                        `json:"FeatToLeagueExpRatio"`          // 功勋转联盟经验比例 万分比
+		FeatToSeasonScoreRatio        int64                        `json:"FeatToSeasonScoreRatio"`        // 功勋转赛季积分比例 万分比
+		FeatToSeasonScoreLimit        int32                        `json:"FeatToSeasonScoreLimit"`        // 功勋转赛季积分上限 赛季
+		ConToSeasonScoreRatio         int64                        `json:"ConToSeasonScoreRatio"`         // 联盟贡献转赛季积分比例 万分比
+		ConToSeasonScoreLimit         int32                        `json:"ConToSeasonScoreLimit"`         // 联盟贡献转赛季积分上限 赛季
 	}
 
 	constConfig struct {

+ 64 - 2
sr/internal/data/extend_const.go

@@ -3,6 +3,7 @@ package data
 import (
 	"f1-game/internal/constant"
 	"f1-game/internal/enum"
+	"f1-game/internal/extend/math"
 	"f1-game/internal/extend/rand"
 	"f1-game/internal/extend/utils"
 	"f1-game/internal/types"
@@ -236,8 +237,8 @@ func (p *constConfig) GetMapScoutMarchTime() int64 {
 	return ctime.Now().ToMillisecond() + p.MapScoutMarchTime*ctime.MillisecondsPerSecond
 }
 
-func (p *constConfig) GetMapScoutTime() int64 {
-	return ctime.Now().ToMillisecond() + p.MapScoutTime*ctime.MillisecondsPerSecond
+func (p *constConfig) GetMapScoutTime(startTime int64) int64 {
+	return startTime + p.MapScoutTime*ctime.MillisecondsPerSecond
 }
 
 func (p *constConfig) GetMapReinforcePrepareTime() int64 {
@@ -300,3 +301,64 @@ func (p *constConfig) GetResOccupyInvincibleTime() int64 {
 
 	return p.MapResProtectTime * ctime.MillisecondsPerSecond
 }
+
+func (p *constConfig) GetHeroInjureTime() int64 {
+	if value, ok := GameDebug.GetDebugValue(constant.GameDebug_HeroInjureTime); ok {
+		return value
+	}
+
+	return p.HeroInjureTime
+}
+
+// 获得帝国晶矿转联盟贡献
+func (p *constConfig) CalCrystalMineToLeagueCon(addCrystalMine int64) int64 {
+	return p.CalValueToNum(addCrystalMine, p.CrystalMineToConRatio)
+}
+
+// 攻城值转联盟贡献
+func (p *constConfig) CalSiegeToLeagueCon(siegeValue int64) int64 {
+	return p.CalValueToNum(siegeValue, p.TileSiegeToConRatio)
+}
+
+// 城建声望转联盟贡献
+func (p *constConfig) CalFacilityToLeagueCon(diffPrestige int64) int64 {
+	return p.CalValueToNum(diffPrestige, p.FacilityPrestigeToConRatio)
+}
+
+// 联盟贡献转联盟经验
+func (p *constConfig) CalLeagueConToLeagueExp(leagueConValue int64) int64 {
+	return p.CalValueToNum(leagueConValue, p.ConToLeagueExpRatio)
+}
+
+// 功勋转联盟经验
+func (p *constConfig) CalFeatValueToLeagueExp(featValue int64) int64 {
+	return p.CalValueToNum(featValue, p.FeatToLeagueExpRatio)
+}
+
+// 功勋转赛季积分
+func (p *constConfig) CalFeatValueToSeasonScore(featValue int64) int64 {
+	return p.CalValueToNum(featValue, p.FeatToSeasonScoreRatio)
+}
+
+// 联盟贡献转赛季积分
+func (p *constConfig) CalConValueToSeasonScore(leagueConValue int64) int64 {
+	return p.CalValueToNum(leagueConValue, p.ConToSeasonScoreRatio)
+}
+
+// value转化为num
+func (p *constConfig) CalValueToNum(value, ratio int64) int64 {
+	if value <= 0 {
+		return 0
+	}
+
+	return math.Floor[float64, int64](float64(value*ratio) / constant.FRatioBase)
+}
+
+func (p *constConfig) GetMapCastleSiegeTime() int64 {
+	value, ok := GameDebug.GetDebugValue(constant.GameDebug_MapCastleSiegeTime)
+	if !ok {
+		value = constant.MapCastleSiegeTime
+	}
+
+	return max(value, constant.MapLeastCastleSiegeTime)
+}

+ 9 - 0
sr/internal/data/extend_facility_level.go

@@ -1,6 +1,7 @@
 package data
 
 import (
+	"f1-game/internal/constant"
 	"f1-game/internal/extend/math"
 	"f1-game/internal/types"
 )
@@ -50,3 +51,11 @@ func (p *facilityLevelConfig) GetRefundAssets(facilityID int32, level int32) (ty
 
 	return assets, true
 }
+
+func (p *FacilityLevelRow) GetUpgradeTime(nowSec int64) int64 {
+	if value, ok := GameDebug.GetDebugValue(constant.GameDebug_FacilityUpgradeTime); ok {
+		return nowSec + value
+	}
+
+	return nowSec + p.UpgradeDuration
+}

+ 5 - 0
sr/internal/data/extend_map_build.go

@@ -18,6 +18,11 @@ func (p *MapBuildRow) GetAffectEdgePoints(x, y int32) types.Points {
 	return p.getPoints(x, y, p.AffectEdgeOddOffsets, p.AffectEdgeEvenOffsets, false)
 }
 
+// 获取攻城点坐标点
+func (p *MapBuildRow) GetSiegePoints(x, y int32) types.Points {
+	return p.getPoints(x, y, p.SiegeOddOffsets, p.SiegeEvenOffsets, false)
+}
+
 func (p *MapBuildRow) getPoints(x, y int32, odds, evens types.Points, includeCenter bool) types.Points {
 	points := GetOffsetPoints(x, y, odds, evens)
 	if includeCenter {

+ 5 - 0
sr/internal/data/extend_map_castle.go

@@ -19,6 +19,11 @@ func (p *MapCastleRow) GetAffectEdgePoints(x, y int32) types.Points {
 	return p.getPoints(x, y, p.AffectEdgeOddOffsets, p.AffectEdgeEvenOffsets, false)
 }
 
+// 获取攻城点坐标点
+func (p *MapCastleRow) GetSiegePoints(x, y int32) types.Points {
+	return p.getPoints(x, y, p.SiegeOddOffsets, p.SiegeEvenOffsets, false)
+}
+
 func (p *MapCastleRow) getPoints(x, y int32, odds, evens types.Points, includeCenter bool) types.Points {
 	points := GetOffsetPoints(x, y, odds, evens)
 	if includeCenter {

+ 27 - 0
sr/internal/data/extend_map_id.go

@@ -1,8 +1,10 @@
 package data
 
 import (
+	maths "f1-game/internal/extend/math"
 	"f1-game/internal/pb"
 	"f1-game/internal/types"
+	"math"
 	"os"
 
 	cfile "github.com/cherry-game/cherry/extend/file"
@@ -241,3 +243,28 @@ func GetOffsetPoints(x, y int32, odd, even types.Points) types.Points {
 
 	return points
 }
+
+func GetPointDistanceRange(x, y int32, points types.Points) (min int32, max int32) {
+	min = math.MaxInt32
+	max = math.MinInt32
+	for _, pt := range points {
+		distance := maths.GetPointDistance(x, y, pt.X, pt.Y)
+		if distance < min {
+			min = distance
+		}
+		if distance > max {
+			max = distance
+		}
+	}
+
+	// 没有点,距离为0
+	if min == math.MaxInt32 {
+		min = 0
+	}
+
+	if max == math.MinInt32 {
+		max = 0
+	}
+
+	return
+}

+ 22 - 19
sr/internal/data/hero.go

@@ -9,25 +9,28 @@ func init() {
 
 type (
 	HeroRow struct {
-		ID              int32 `json:"ID"`              // ID
-		Camp            int32 `json:"Camp"`            // 阵营
-		Quality         int32 `json:"Quality"`         // 品质
-		BasicAttack     int32 `json:"BasicAttack"`     // 普攻
-		Talent          int32 `json:"Talent"`          // 天赋
-		ActiveSkill     int32 `json:"ActiveSkill"`     // 主动技能
-		PassiveSkill    int32 `json:"PassiveSkill"`    // 被动技能
-		SpecialSkill    int32 `json:"SpecialSkill"`    // 专属技能
-		Job             int32 `json:"Job"`             // 职业
-		InitTroop       int32 `json:"InitTroop"`       // 统兵数量
-		InitHealth      int64 `json:"InitHealth"`      // 初始血量
-		HealthGrow      int64 `json:"HealthGrow"`      // 血量成长
-		InitAttack      int64 `json:"InitAttack"`      // 初始攻击
-		AttackGrow      int64 `json:"AttackGrow"`      // 攻击成长
-		InitDefense     int64 `json:"InitDefense"`     // 初始防御
-		DefenseGrow     int64 `json:"DefenseGrow"`     // 防御成长
-		InitAttackSpeed int64 `json:"InitAttackSpeed"` // 初始攻速
-		InitSpeed       int64 `json:"InitSpeed"`       // 初始移速
-		InitAttackRange int64 `json:"InitAttackRange"` // 初始攻击距离
+		ID               int32 `json:"ID"`               // ID
+		Camp             int32 `json:"Camp"`             // 阵营
+		Quality          int32 `json:"Quality"`          // 品质
+		BasicAttack      int32 `json:"BasicAttack"`      // 普攻
+		Talent           int32 `json:"Talent"`           // 天赋
+		ActiveSkill      int32 `json:"ActiveSkill"`      // 主动技能
+		PassiveSkill     int32 `json:"PassiveSkill"`     // 被动技能
+		SpecialSkill     int32 `json:"SpecialSkill"`     // 专属技能
+		Job              int32 `json:"Job"`              // 职业
+		InitTroop        int32 `json:"InitTroop"`        // 统兵数量
+		DecomposeItemID  int32 `json:"DecomposeItemID"`  // 碎片id
+		DecomposeItemNum int32 `json:"DecomposeItemNum"` // 分解碎片数量
+		InitHealth       int64 `json:"InitHealth"`       // 初始血量
+		HealthGrow       int64 `json:"HealthGrow"`       // 血量成长
+		InitAttack       int64 `json:"InitAttack"`       // 初始攻击
+		AttackGrow       int64 `json:"AttackGrow"`       // 攻击成长
+		InitDefense      int64 `json:"InitDefense"`      // 初始防御
+		DefenseGrow      int64 `json:"DefenseGrow"`      // 防御成长
+		InitAttackSpeed  int64 `json:"InitAttackSpeed"`  // 初始攻速
+		InitSpeed        int64 `json:"InitSpeed"`        // 初始移速
+		InitAttackRange  int64 `json:"InitAttackRange"`  // 初始攻击距离
+		SiegeValue       int32 `json:"SiegeValue"`       // 攻城值
 	}
 
 	heroConfig struct {

+ 1 - 0
sr/internal/data/map_build.go

@@ -15,6 +15,7 @@ func init() {
 type (
 	MapBuildRow struct {
 		ConfigID              int32                  `json:"ConfigID"`              // 建筑配置ID
+		BuildingCategory      int32                  `json:"BuildingCategory"`      // 建筑大类
 		BuildCost             types.Assets           `json:"BuildCost"`             // 建造消耗
 		BuildTime             int64                  `json:"BuildTime"`             // 建造时间
 		ProtectTime           int64                  `json:"ProtectTime"`           // 保护时间

+ 7 - 6
sr/internal/data/map_build_upgrade.go

@@ -13,12 +13,13 @@ func init() {
 
 type (
 	MapBuildUpgradeRow struct {
-		ConfigID    int32        `json:"ConfigID"`    // 建筑配置ID
-		Level       int32        `json:"Level"`       // 等级
-		UpgradeCost types.Assets `json:"UpgradeCost"` // 升级消耗
-		UpgradeTime int64        `json:"UpgradeTime"` // 升级时间
-		Durability  int32        `json:"Durability"`  // 耐久
-		ViewRange   int32        `json:"ViewRange"`   // 视野范围
+		ConfigID         int32        `json:"ConfigID"`         // 建筑配置ID
+		Level            int32        `json:"Level"`            // 等级
+		UpgradeCost      types.Assets `json:"UpgradeCost"`      // 升级消耗
+		UpgradeTime      int64        `json:"UpgradeTime"`      // 升级时间
+		Durability       int32        `json:"Durability"`       // 耐久
+		ViewRange        int32        `json:"ViewRange"`        // 视野范围
+		LeagueBuildAttrs types.Attrs  `json:"LeagueBuildAttrs"` // 联盟建筑属性
 	}
 
 	mapBuildUpgradeConfig struct {

+ 20 - 2
sr/internal/data/map_id.go

@@ -10,6 +10,7 @@ func init() {
 type (
 	MapIDRow struct {
 		MapID              int32  `json:"MapID"`              // 地图ID
+		MapNodeID          string `json:"MapNodeID"`          // 节点ID
 		MapGroup           string `json:"MapGroup"`           // 地图分组
 		MapDataFilepath    string `json:"MapDataFilepath"`    // 地图数据文件
 		MapDataExtFilepath string `json:"MapDataExtFilepath"` // 地图扩展数据文件
@@ -19,8 +20,9 @@ type (
 
 	mapIDConfig struct {
 		baseConfig
-		list         []*MapIDRow         // all list
-		mapIDUniMaps map[int32]*MapIDRow // key:mapID
+		list             []*MapIDRow          // all list
+		mapIDUniMaps     map[int32]*MapIDRow  // key:mapID
+		mapNodeIDUniMaps map[string]*MapIDRow // key:mapNodeID
 	}
 )
 
@@ -30,6 +32,7 @@ func (p *mapIDConfig) Name() string {
 
 func (p *mapIDConfig) Init() {
 	p.mapIDUniMaps = map[int32]*MapIDRow{}
+	p.mapNodeIDUniMaps = map[string]*MapIDRow{}
 }
 
 func (p *mapIDConfig) OnLoad(maps interface{}, reload bool) (int, error) {
@@ -49,6 +52,12 @@ func (p *mapIDConfig) OnLoad(maps interface{}, reload bool) (int, error) {
 	}
 	p.mapIDUniMaps = mapIDUniMaps
 
+	mapNodeIDUniMaps := map[string]*MapIDRow{}
+	for _, row := range list {
+		mapNodeIDUniMaps[row.MapNodeID] = row
+	}
+	p.mapNodeIDUniMaps = mapNodeIDUniMaps
+
 	return len(list), nil
 }
 
@@ -67,3 +76,12 @@ func (p *mapIDConfig) ContainMapID(mapID int32) bool {
 	_, found := p.mapIDUniMaps[mapID]
 	return found
 }
+func (p *mapIDConfig) GetByMapNodeID(mapNodeID string) (*MapIDRow, bool) {
+	value, found := p.mapNodeIDUniMaps[mapNodeID]
+	return value, found
+}
+
+func (p *mapIDConfig) ContainMapNodeID(mapNodeID string) bool {
+	_, found := p.mapNodeIDUniMaps[mapNodeID]
+	return found
+}

+ 17 - 2
sr/internal/enum/item.go

@@ -36,8 +36,10 @@ const (
 	ItemIDArm205 int32 = 205 // 精锐兵4
 	ItemIDArm206 int32 = 206 // 精锐兵5
 
-	ItemIDLordExp int32 = 10001 // 领主经验
-	ItemIDFeat    int32 = 10104 // 个人功勋
+	ItemIDLordExp      int32 = 10001 // 领主经验
+	ItemIDCrystalMine  int32 = 10002 // 帝国晶矿
+	ItemIDContribution int32 = 10102 // 个人贡献
+	ItemIDFeat         int32 = 10104 // 个人功勋
 )
 
 var (
@@ -54,6 +56,19 @@ var (
 		ItemIDGrain,
 	}
 
+	// 有上限的game货币
+	GameItemMaxNumList = []int32{
+		ItemIDStamina,
+		ItemIDTempStamina,
+	}
+
+	ItemResUnboundList = []int32{
+		ItemIDWoodUnBound,
+		ItemIDIronUnBound,
+		ItemIDStoneUnBound,
+		ItemIDGrainUnBound,
+	}
+
 	// 后台需要展示的道具ID列表
 	OpsItemInfoList = []int32{
 		ItemIDSilver,

+ 37 - 30
sr/internal/enum/league.go

@@ -29,15 +29,17 @@ const (
 	Log_LeagueJobRegined        int32 = 105 // {0}的{1}职位被撤销
 	Log_LeagueCityAppoint       int32 = 106 // {0}的城池{1}城主职位被任命
 	Log_LeagueCityRevoke        int32 = 107 // {0}的城池{1}城主职位被撤销
-	Log_LeagueDeclareWar        int32 = 201 // {0}对地区的城池宣战
-	Log_LeagueDeclareCancel     int32 = 202 // {0}终止了对地区的城池宣战
-	Log_LeagueCaptureCity       int32 = 203 // 我方攻占了地区的{0}城池
-	Log_LeagueCaptureCity_Enemy int32 = 204 // {0}联盟攻占了我方的{1}城池
-	Log_LeagueRobbery_Enemy     int32 = 205 // {0}联盟掠夺了我方驻地{1}
-	Log_LeagueBuildBuilding     int32 = 301 // 联盟{0}建造了建筑{1}
-	Log_LeagueGiveUpBuilding    int32 = 302 // 联盟管理{0}成功放弃了建筑{1}
-	Log_LeagueRelationChange    int32 = 401 // 和联盟{0}的关系已成为{1}
-	Log_LeagueRelationBreak     int32 = 402 // 和联盟{0}的{1}关系已解除
+	Log_LeagueJobSet            int32 = 108 // 盟主.{0}委任{1}为{2} 服务端:{0}玩家名称 {1}被任命玩家名称 {2}职位ID L-联盟-职位表职位ID
+	Log_LeagueLeaderTransfer    int32 = 109 // 盟主职位{0}已转让给{1} 服务端: {0}原盟主玩家名称 {1}新盟主玩家名称
+	Log_LeagueLeaderImpeach     int32 = 110 // 盟主{0}已被弹劾,新盟主变更为{1} 服务端: {0}原盟主玩家名称 {1}新盟主玩家名称
+	Log_LeagueDeclareWar        int32 = 201 // {0}对{1}的{2}{3}宣战 服务端:{0}玩家名称 {1}城池ID D-地图-城池表城池配置ID
+	Log_LeagueDeclareCancel     int32 = 202 // {0}终止了对{1}的{2}{3}宣战 服务端:{0}玩家名称 {1}城池ID D-地图-城池表城池配置ID
+	Log_LeagueCaptureCity       int32 = 203 // 我方攻占了{0}的{1}{2} 服务端:{0}城池ID D-地图-城池表城池配置ID
+	Log_LeagueCaptureCity_Enemy int32 = 204 // {0}联盟攻占了我方的{1}{2} 服务端:{0}攻占联盟名称 {1}城池ID D-地图-城池表城池配置ID
+	Log_LeagueBuildBuilding     int32 = 301 // {0}{1}建造了建筑{2} 服务端:{0}职位ID L-联盟-职位表职位ID {1}玩家名称 {2}建筑ID D-建筑-建筑表建筑配置ID
+	Log_LeagueGiveUpBuilding    int32 = 302 // {0}{1}成功放弃了建筑{2} 服务端:{0}职位ID L-联盟-职位表职位ID {1}玩家名称 {2}建筑ID D-建筑-建筑表建筑配置ID
+	Log_LeagueRelationChange    int32 = 401 // 和联盟{0}的关系已成为{1} 服务端:{0}联盟名称 {1}关系类型ID 0联邦 1友盟
+	Log_LeagueRelationBreak     int32 = 402 // 和联盟{0}的{1}关系已解除 服务端:{0}联盟名称 {1}关系类型ID 0联邦 1友盟
 	Log_LeagueRateUpdate        int32 = 501 // {0}调整了{1}税率{2}->{3}
 	Log_LeagueCollectResource   int32 = 502 // {0}采集了{1}x{2},入库:{3}
 	Log_LeagueTechUpgradeCost   int32 = 503 // {0}消耗{1}x{2},学习了科技{3}
@@ -124,27 +126,28 @@ var (
 )
 
 const (
-	LeagueAttrMemberCountLimit      int32 = 101  // 成员人数上限
-	LeagueAttrCastleCountLimit      int32 = 201  // 城池上限
-	LeagueAttrCampCountLimit        int32 = 301  // 联盟大营数量上限
-	LeagueAttrCampLevelLimit        int32 = 302  // 联盟大营等级上限
-	LeagueAttrFlagCountLimit        int32 = 401  // 旗帜数量上限
-	LeagueAttrRejectMarchCountLimit int32 = 501  // 拒马数量上限
-	LeagueAttrRejectMarchLevelLimit int32 = 502  // 拒马等级上限
-	LeagueAttrArrowTowerCountLimit  int32 = 601  // 箭塔数量上限
-	LeagueAttrArrowTowerLevelLimit  int32 = 602  // 箭塔等级上限
-	LeagueAttrResTownCountLimit     int32 = 701  // 联盟资源田数量上限
-	LeagueAttrResTownLevelLimit     int32 = 702  // 联盟资源田等级上限
-	LeagueAttrResCapacity           int32 = 801  // 联盟仓库资源存储上限(木石粮铁)
-	LeagueAttrResCapacityProtect    int32 = 802  // 联盟仓库资源保护上限
-	LeagueAttrWoodYield             int32 = 901  // 联盟木材产量 (每小时)
-	LeagueAttrStoneYield            int32 = 902  // 联盟石料产量 (每小时)
-	LeagueAttrGrainYield            int32 = 903  // 联盟粮食产量 (每小时)
-	LeagueAttrIronYield             int32 = 904  // 联盟铁矿产量 (每小时)
-	LeagueAttrResidenceCountLimit   int32 = 1000 // 可建筑驻地
-	LeagueAttrResTownHp             int32 = 1001 // 驻地耐久
-	LeagueAttrResTownDefense        int32 = 1002 // 驻地城防部队数量
-	LeagueAttrBossLevelLimit        int32 = 1101 // 联盟boss等级上限
+	LeagueAttrMemberCountLimit     int32 = 101  // 成员人数上限
+	LeagueAttrCastleCountLimit     int32 = 201  // 城池上限
+	LeagueAttrCampCountLimit       int32 = 301  // 联盟大营数量上限
+	LeagueAttrCampLevelLimit       int32 = 302  // 联盟大营等级上限
+	LeagueAttrFlagCountLimit       int32 = 401  // 旗帜数量上限
+	LeagueAttrBarricadeCountLimit  int32 = 501  // 拒马数量上限
+	LeagueAttrBarricadeLevelLimit  int32 = 502  // 拒马等级上限
+	LeagueAttrArrowTowerCountLimit int32 = 601  // 箭塔数量上限
+	LeagueAttrArrowTowerLevelLimit int32 = 602  // 箭塔等级上限
+	LeagueAttrResTownCountLimit    int32 = 701  // 联盟资源田数量上限
+	LeagueAttrResTownLevelLimit    int32 = 702  // 联盟资源田等级上限
+	LeagueAttrResCapacity          int32 = 801  // 联盟仓库资源存储上限(木石粮铁)
+	LeagueAttrResCapacityProtect   int32 = 802  // 联盟仓库资源保护上限
+	LeagueAttrWoodYield            int32 = 901  // 联盟木材产量 (每小时)
+	LeagueAttrStoneYield           int32 = 902  // 联盟石料产量 (每小时)
+	LeagueAttrGrainYield           int32 = 903  // 联盟粮食产量 (每小时)
+	LeagueAttrIronYield            int32 = 904  // 联盟铁矿产量 (每小时)
+	LeagueAttrResidenceCountLimit  int32 = 1000 // 可建筑驻地
+	LeagueAttrResTownHp            int32 = 1001 // 驻地耐久
+	LeagueAttrResTownDefense       int32 = 1002 // 驻地城防部队数量
+	LeagueAttrBossLevelLimit       int32 = 1101 // 联盟boss等级上限
+	LeagueAttrSiegeCampLimit       int32 = 1201 // 攻城大营数量上限
 )
 
 func IsLeagueCurrency(id int32) bool {
@@ -166,3 +169,7 @@ func IsNotLeagueDiplomacyType(applyType int32) bool {
 
 	return true
 }
+
+const (
+	LeagueMapBuildType_Res = 5 // 资源田类型
+)

+ 56 - 18
sr/internal/enum/map.go

@@ -6,15 +6,16 @@ import "f1-game/internal/pb"
 type ObjectType int32
 
 const (
-	ObjectType_Player  ObjectType = 0 // 玩家(作为观察者,不会出现在地图上)
-	ObjectType_Tile    ObjectType = 1 // 地块
-	ObjectType_Castle  ObjectType = 2 // 城池
-	ObjectType_Build   ObjectType = 3 // 建筑
-	ObjectType_March   ObjectType = 4 // 行军对象
-	ObjectType_Monster ObjectType = 5 // 怪物
-	ObjectType_Res     ObjectType = 6 // 资源
-	ObjectType_Legion  ObjectType = 7 // 军团
-	ObjectType_Machine ObjectType = 8 // 器械
+	ObjectType_Player   ObjectType = 0 // 玩家(作为观察者,不会出现在地图上)
+	ObjectType_Tile     ObjectType = 1 // 地块
+	ObjectType_Castle   ObjectType = 2 // 城池
+	ObjectType_Build    ObjectType = 3 // 建筑
+	ObjectType_March    ObjectType = 4 // 行军对象
+	ObjectType_Monster  ObjectType = 5 // 怪物
+	ObjectType_Res      ObjectType = 6 // 资源
+	ObjectType_Legion   ObjectType = 7 // 军团
+	ObjectType_Machine  ObjectType = 8 // 器械
+	ObjectType_ArmyLine ObjectType = 9 // 军情线
 )
 
 const (
@@ -23,15 +24,16 @@ const (
 
 var (
 	objectTypeName = map[ObjectType]string{
-		ObjectType_Player:  "Player",
-		ObjectType_Tile:    "Tile",
-		ObjectType_Castle:  "Castle",
-		ObjectType_Build:   "Build",
-		ObjectType_March:   "March",
-		ObjectType_Monster: "Monster",
-		ObjectType_Res:     "Res",
-		ObjectType_Legion:  "Legion",
-		ObjectType_Machine: "Machine",
+		ObjectType_Player:   "Player",
+		ObjectType_Tile:     "Tile",
+		ObjectType_Castle:   "Castle",
+		ObjectType_Build:    "Build",
+		ObjectType_March:    "March",
+		ObjectType_Monster:  "Monster",
+		ObjectType_Res:      "Res",
+		ObjectType_Legion:   "Legion",
+		ObjectType_Machine:  "Machine",
+		ObjectType_ArmyLine: "ArmyLine",
 	}
 
 	marchTypeName = map[MarchType]string{
@@ -232,3 +234,39 @@ var ReinforceStageNames = map[ReinforceStage]string{
 func GetReinforceStageName(stage ReinforceStage) string {
 	return ReinforceStageNames[stage]
 }
+
+type AutoMarchStage int32
+
+const (
+	AutoMarch_None    AutoMarchStage = 0 // 无
+	AutoMarch_Start   AutoMarchStage = 1 // 开始
+	AutoMarch_Wait    AutoMarchStage = 2 // 等待
+	AutoMarch_Process AutoMarchStage = 3 // 进行中
+)
+
+var autoMarchStageNames = map[AutoMarchStage]string{
+	AutoMarch_None:    "None",
+	AutoMarch_Start:   "Start",
+	AutoMarch_Wait:    "Wait",
+	AutoMarch_Process: "Process",
+}
+
+func GetAutoMarchStageName(stage AutoMarchStage) string {
+	return autoMarchStageNames[stage]
+}
+
+// 多重寻路类型
+type FindMultiPathType int32
+
+const (
+	FindMultiPath_AllSuccess  FindMultiPathType = 0 // 所有请求成功返回
+	FindMultiPath_AnySuccess  FindMultiPathType = 1 // 任意寻路成功返回
+	FindMultiPath_SuccessOnly FindMultiPathType = 2 // 只返回成功路径
+)
+
+type AutoMarchType int32
+
+const (
+	AutoMarch_WaitTimeout       AutoMarchType = 0 // 等待超时
+	AutoMarch_WaitGarrisionZero AutoMarchType = 1 // 等待驻城部队为空时
+)

+ 1 - 1
sr/internal/enum/scout.go

@@ -11,6 +11,6 @@ const (
 	ScoutState_Lost      int32 = 2 // 侦察失败 已丢失侦察目标
 )
 
-func CheckScoutType(scoutType int32) bool {
+func CheckNotScoutType(scoutType int32) bool {
 	return scoutType != ScoutType_March && scoutType != ScoutType_Start
 }

+ 17 - 11
sr/internal/event/league_castle_update.go

@@ -12,22 +12,24 @@ type (
 	}
 
 	castleInfo struct {
-		leagueID int64       // 联盟ID
-		objectID int64       // 对象ID
-		configID int32       // 配置ID
-		point    types.Point // 位置
-		isDel    bool        // 是否是移除 true=移除 false=添加
+		leagueID      int64       // 联盟ID
+		newLeagueName string      // 新联盟名称
+		objectID      int64       // 对象ID
+		configID      int32       // 配置ID
+		point         types.Point // 位置
+		isDel         bool        // 是否是移除 true=移除 false=添加
 	}
 )
 
-func NewLeagueCastleUpdate(leagueID int64, objectID int64, configID int32, point types.Point, isDel bool) *LeagueCastleUpdate {
+func NewLeagueCastleUpdate(leagueID int64, newLeagueName string, objectID int64, configID int32, point types.Point, isDel bool) *LeagueCastleUpdate {
 	return &LeagueCastleUpdate{
 		DataEvent: eventBase.NewDataEvent(leagueID, nameEvent.League_CastleUpdate, &castleInfo{
-			leagueID: leagueID,
-			objectID: objectID,
-			configID: configID,
-			point:    point,
-			isDel:    isDel,
+			leagueID:      leagueID,
+			newLeagueName: newLeagueName,
+			objectID:      objectID,
+			configID:      configID,
+			point:         point,
+			isDel:         isDel,
 		}),
 	}
 }
@@ -36,6 +38,10 @@ func (p LeagueCastleUpdate) GetLeagueID() int64 {
 	return p.Data().leagueID
 }
 
+func (p LeagueCastleUpdate) GetNewLeagueName() string {
+	return p.Data().newLeagueName
+}
+
 func (p LeagueCastleUpdate) GetObjectID() int64 {
 	return p.Data().objectID
 }

+ 8 - 3
sr/internal/event/player_castle_success.go

@@ -8,17 +8,22 @@ import (
 
 // 攻城成功事件
 type PlayerCastleSuccess struct {
-	eventBase.DataEvent[*pb.I32]
+	eventBase.DataEvent[*pb.I64I32]
 }
 
-func NewPlayerCastleSuccess(playerID int64, configID int32) *PlayerCastleSuccess {
+func NewPlayerCastleSuccess(playerID, leagueID int64, configID int32) *PlayerCastleSuccess {
 	return &PlayerCastleSuccess{
-		DataEvent: eventBase.NewDataEvent(playerID, string(nameEvent.Map_PlayerCastleSuccess), &pb.I32{
+		DataEvent: eventBase.NewDataEvent(playerID, string(nameEvent.Map_PlayerCastleSuccess), &pb.I64I32{
+			Key:   leagueID,
 			Value: configID,
 		}),
 	}
 }
 
+func (p *PlayerCastleSuccess) LeagueID() int64 {
+	return p.Data().Key
+}
+
 func (p *PlayerCastleSuccess) ConfigID() int32 {
 	return p.Data().Value
 }

+ 17 - 0
sr/internal/event/vip_status.go

@@ -0,0 +1,17 @@
+package event
+
+import (
+	eventBase "f1-game/internal/event/base"
+	nameEvent "f1-game/internal/name/event"
+)
+
+// vip状态更新事件
+type VipStatus struct {
+	eventBase.EmptyEvent
+}
+
+func NewVipStatus(playerID int64) *VipStatus {
+	return &VipStatus{
+		EmptyEvent: eventBase.NewEmptyEvent(playerID, nameEvent.Vip_Status),
+	}
+}

+ 33 - 0
sr/internal/extend/math/math.go

@@ -36,3 +36,36 @@ func Ceil[E types.FloatType, T types.Number](val E) T {
 func Floor[E types.FloatType, T types.Number](val E) T {
 	return T(math.Floor(float64(val)))
 }
+
+// GetPointDistance 获取两点之间的距离(格子数)
+// 采用odd-q offset坐标系(奇数列向下偏移)
+// 使用cube坐标计算六边形网格距离
+func GetPointDistance(x1, y1, x2, y2 int32) int32 {
+	// 转换为cube坐标
+	// cube.x = offset.x
+	// cube.z = offset.y - (offset.x + (offset.x&1)) / 2
+	// cube.y = -cube.x - cube.z
+	c1x := x1
+	c1z := y1 - (x1+(x1&1))/2
+	c1y := -c1x - c1z
+
+	c2x := x2
+	c2z := y2 - (x2+(x2&1))/2
+	c2y := -c2x - c2z
+
+	// cube坐标下的距离公式: (|dx| + |dy| + |dz|) / 2
+	dx := c1x - c2x
+	dy := c1y - c2y
+	dz := c1z - c2z
+	if dx < 0 {
+		dx = -dx
+	}
+	if dy < 0 {
+		dy = -dy
+	}
+	if dz < 0 {
+		dz = -dz
+	}
+
+	return (dx + dy + dz) / 2
+}

+ 18 - 0
sr/internal/extend/math/math_test.go

@@ -0,0 +1,18 @@
+package math
+
+import (
+	"fmt"
+	"testing"
+)
+
+func TestGetHexDistance(t *testing.T) {
+	var points = [][4]int32{
+		{269, 148, 275, 148},
+		{269, 148, 275, 151},
+	}
+
+	for _, p := range points {
+		distance := GetPointDistance(p[0], p[1], p[2], p[3])
+		fmt.Printf("(%d, %d) -> (%d, %d) distance: %d\n", p[0], p[1], p[2], p[3], distance)
+	}
+}

+ 7 - 6
sr/internal/name/actor/map.go

@@ -19,12 +19,13 @@ const (
 	Map_Scout           = "scout"    // 地图.侦察,path = {map}.scout
 )
 const (
-	MapAOI_Build   = "build"   // 地图.aoi.建筑, path = {map}.aoi.build
-	MapAOI_Castle  = "castle"  // 地图.aoi.城市, path = {map}.aoi.castle
-	MapAOI_March   = "march"   // 地图.aoi.行军, path = {map}.aoi.march
-	MapAOI_Res     = "res"     // 地图.aoi.资源, path = {map}.aoi.res
-	MapAOI_Monster = "monster" // 地图.aoi.怪物, path = {map}.aoi.monster
-	MapAOI_Legion  = "legion"  // 地图.aoi.军团, path = {map}.aoi.legion
+	MapAOI_Build    = "build"    // 地图.aoi.建筑, path = {map}.aoi.build
+	MapAOI_Castle   = "castle"   // 地图.aoi.城市, path = {map}.aoi.castle
+	MapAOI_March    = "march"    // 地图.aoi.行军, path = {map}.aoi.march
+	MapAOI_Res      = "res"      // 地图.aoi.资源, path = {map}.aoi.res
+	MapAOI_Monster  = "monster"  // 地图.aoi.怪物, path = {map}.aoi.monster
+	MapAOI_Legion   = "legion"   // 地图.aoi.军团, path = {map}.aoi.legion
+	MapAOI_ArmyLine = "armyline" // 地图.aoi.军情线, path = {map}.aoi.armyline
 )
 
 // 排行榜

+ 1 - 0
sr/internal/name/event/event.go

@@ -14,6 +14,7 @@ const (
 const (
 	Vip_LevelUp = "vip_level_up"
 	Vip_Active  = "vip_active"
+	Vip_Status  = "vip_status"
 )
 
 const (

+ 20 - 11
sr/internal/name/remote/map.go

@@ -9,13 +9,14 @@ const (
 
 const (
 	MapPathFind_Find           = "find"
+	MapPathFind_FindMulti      = "findMulti"
 	MapPathFind_SetBarriers    = "setBarriers"
 	MapPathFind_RemoveBarriers = "removeBarriers"
-	MapPathFind_SiegePath      = "siegePath"
 )
 
 const (
 	MapLogic_Enter                   = "enter"                   // 玩家进入地图
+	MapLogic_Quit                    = "quit"                    // 玩家退出地图
 	MapLogic_March                   = "march"                   // 行军
 	MapLogic_Retreat                 = "retreat"                 // 回城
 	MapLogic_MarchStop               = "marchStop"               // 行军中止
@@ -31,11 +32,11 @@ const (
 	MapLogic_RelocateBack            = "relocateBack"            // 玩家回迁
 	MapLogic_StartWar                = "startWar"                // 宣战
 	MapLogic_StopWar                 = "stopWar"                 // 取消宣战
-	MapLogic_SetSiegePath            = "setSiegePath"            // 设置攻城路径
 	MapLogic_AutoDefend              = "autoDefend"              // 自动防守
 	MapLogic_MarchSyncTroops         = "marchSyncTroops"         // 行军同步兵力
 	MapLogic_MarchSyncInjure         = "marchSyncInjure"         // 行军重伤同步
 	MapLogic_GetObjectPoints         = "getObjectPoints"         // 获取对象坐标
+	MapLogic_GetSiegePoints          = "getSiegePoints"          // 获取攻城点坐标
 	MapLogic_Assemble                = "assemble"                // 发起集结
 	MapLogic_AssembleJoin            = "assembleJoin"            // 加入集结
 	MapLogic_AssembleStop            = "assembleStop"            // 集结取消
@@ -59,6 +60,7 @@ const (
 	MapLogic_Reinforce               = "reinforce"               // 主城加固
 	MapLogic_ReinforceCancel         = "reinforceCancel"         // 主城加固取消
 	MapLogic_ResArmies               = "resArmies"               // 资源守军
+	MapLogic_AutoMarchResult         = "autoMarchResult"         // 自动行军结果
 )
 
 const (
@@ -72,6 +74,7 @@ const (
 	MapPlayer_UpdateTeam         = "updateTeam"         // 更新部队
 	MapPlayer_AutoDefendRequest  = "autoDefendRequest"  // 自动防守请求
 	MapPlayer_NotifyRebornPush   = "notifyRebornPush"   // 通知玩家被击飞
+	MapPlayer_AutoMarchRequest   = "autoMarchRequest"   // 自动行军
 )
 
 const (
@@ -105,6 +108,7 @@ const (
 	MapLeague_UnionRelieve         = "unionRelieve"         // 联盟外交-联邦关系解除申请
 	MapLeague_UnionRelieveCheck    = "unionRelieveCheck"    // 联盟外交-联邦关系解除检测
 	MapLeague_DiplomacyInfos       = "diplomacyInfos"       // 联盟外交-列表
+	MapLeague_MemberPrestigeUpdate = "memberPrestigeUpdate" // 联盟成员声望更新
 )
 
 const (
@@ -112,15 +116,16 @@ const (
 )
 
 const (
-	MapPlayer_HeroDelete       = "heroDelete"       // 英雄删除
-	MapPlayer_HeroCheckBusy    = "heroCheckBusy"    // 检测英雄是否出征中
-	MapPlayer_UseMedicine      = "useMedicine"      // 药品使用
-	MapPlayer_SubTeamTroopsNum = "subTeamTroopsNum" // 战斗后扣除兵损后的兵力
-	MapPlayer_UpdateTeamState  = "updateTeamState"  // 更新队伍状态
-	MapPlayer_SetTeamInjury    = "setTeamInjury"    // 设置队伍受伤状态
-	MapPlayer_MarchArrive      = "marchArrive"      // 行军到达
-	MapPlayer_ResOccupy        = "resOccupy"        // 资源占领
-	MapPlayer_ResUpdate        = "resUpdate"        // 资源点更新
+	MapPlayer_HeroDelete           = "heroDelete"           // 英雄删除
+	MapPlayer_HeroCheckBusy        = "heroCheckBusy"        // 检测英雄是否出征中
+	MapPlayer_UseMedicine          = "useMedicine"          // 药品使用
+	MapPlayer_SubTeamTroopsNum     = "subTeamTroopsNum"     // 战斗后扣除兵损后的兵力
+	MapPlayer_UpdateTeamState      = "updateTeamState"      // 更新队伍状态
+	MapPlayer_SetTeamInjury        = "setTeamInjury"        // 设置队伍受伤状态
+	MapPlayer_MarchArrive          = "marchArrive"          // 行军到达
+	MapPlayer_ResOccupy            = "resOccupy"            // 资源占领
+	MapPlayer_ResUpdate            = "resUpdate"            // 资源点更新
+	MapPlayer_UpdateCastleResYield = "updateCastleResYield" // 更新系统城资源产量
 )
 
 const (
@@ -183,3 +188,7 @@ const (
 	MapScout_Seach        = "scoutSearch"       // 侦察查询 map player -> target map player
 	MapScout_SeachResult  = "scoutSearchResult" // 侦察查询结果 target map player -> map player
 )
+
+const (
+	Game_UpdateTimeOffset = "updateTimeOffset" // 更新时间偏移
+)

+ 1 - 0
sr/internal/name/remote/rank.go

@@ -2,4 +2,5 @@ package nameRemote
 
 const (
 	UpdateRank = "update_rank"
+	GetRank    = "get_rank"
 )

+ 3 - 0
sr/internal/name/route/push.go

@@ -52,6 +52,8 @@ const (
 	PushMapPusher_Battle          = "map.pusher.battle"          // 推送 地图战斗信息
 	PushMapPusher_TowerUpdate     = "map.pusher.towerUpdate"     // 推送 灯塔全量更新
 	PushMapPusher_MapUIMarchState = "map.pusher.mapUIMarchState" // 推送 地图ui层-行军状态推送
+	PushMapPusher_ArmyLines       = "map.pusher.armyLines"       // 推送 军情线(upsert)
+	PushMapPusher_ArmyLineDel     = "map.pusher.armyLineDel"     // 推送 军情线删除
 )
 
 const (
@@ -141,4 +143,5 @@ const (
 	PushMapLeague_UmengRelieve         = "map.league.umengRelievePush"         // 推送 友盟关系解除
 	PushMapLeague_UnionRelieve         = "map.league.unionRelievePush"         // 推送 联邦关系解除
 	PushMapLeague_WarUpdate            = "map.league.warUpdatePush"            // 推送 联盟战争更新
+	PushMapLeague_Upgrade              = "map.league.upgradePush"              // 推送 联盟升级
 )

File diff suppressed because it is too large
+ 102 - 179
sr/internal/pb/actor.pb.go


+ 91 - 41
sr/internal/pb/base_type.pb.go

@@ -1656,6 +1656,50 @@ func (x *Points) GetList() []*Point {
 	return nil
 }
 
+type PointsList struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	List          []*Points              `protobuf:"bytes,1,rep,name=list,proto3" json:"list,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *PointsList) Reset() {
+	*x = PointsList{}
+	mi := &file_base_type_proto_msgTypes[34]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *PointsList) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*PointsList) ProtoMessage() {}
+
+func (x *PointsList) ProtoReflect() protoreflect.Message {
+	mi := &file_base_type_proto_msgTypes[34]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use PointsList.ProtoReflect.Descriptor instead.
+func (*PointsList) Descriptor() ([]byte, []int) {
+	return file_base_type_proto_rawDescGZIP(), []int{34}
+}
+
+func (x *PointsList) GetList() []*Points {
+	if x != nil {
+		return x.List
+	}
+	return nil
+}
+
 // 属性
 type Attrs struct {
 	state         protoimpl.MessageState `protogen:"open.v1"`
@@ -1666,7 +1710,7 @@ type Attrs struct {
 
 func (x *Attrs) Reset() {
 	*x = Attrs{}
-	mi := &file_base_type_proto_msgTypes[34]
+	mi := &file_base_type_proto_msgTypes[35]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -1678,7 +1722,7 @@ func (x *Attrs) String() string {
 func (*Attrs) ProtoMessage() {}
 
 func (x *Attrs) ProtoReflect() protoreflect.Message {
-	mi := &file_base_type_proto_msgTypes[34]
+	mi := &file_base_type_proto_msgTypes[35]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1691,7 +1735,7 @@ func (x *Attrs) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Attrs.ProtoReflect.Descriptor instead.
 func (*Attrs) Descriptor() ([]byte, []int) {
-	return file_base_type_proto_rawDescGZIP(), []int{34}
+	return file_base_type_proto_rawDescGZIP(), []int{35}
 }
 
 func (x *Attrs) GetList() []*I32I64 {
@@ -1720,7 +1764,7 @@ type BaseAttrs struct {
 
 func (x *BaseAttrs) Reset() {
 	*x = BaseAttrs{}
-	mi := &file_base_type_proto_msgTypes[35]
+	mi := &file_base_type_proto_msgTypes[36]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -1732,7 +1776,7 @@ func (x *BaseAttrs) String() string {
 func (*BaseAttrs) ProtoMessage() {}
 
 func (x *BaseAttrs) ProtoReflect() protoreflect.Message {
-	mi := &file_base_type_proto_msgTypes[35]
+	mi := &file_base_type_proto_msgTypes[36]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1745,7 +1789,7 @@ func (x *BaseAttrs) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use BaseAttrs.ProtoReflect.Descriptor instead.
 func (*BaseAttrs) Descriptor() ([]byte, []int) {
-	return file_base_type_proto_rawDescGZIP(), []int{35}
+	return file_base_type_proto_rawDescGZIP(), []int{36}
 }
 
 func (x *BaseAttrs) GetHealth() int64 {
@@ -1800,7 +1844,7 @@ type ParamsTemplate struct {
 
 func (x *ParamsTemplate) Reset() {
 	*x = ParamsTemplate{}
-	mi := &file_base_type_proto_msgTypes[36]
+	mi := &file_base_type_proto_msgTypes[37]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -1812,7 +1856,7 @@ func (x *ParamsTemplate) String() string {
 func (*ParamsTemplate) ProtoMessage() {}
 
 func (x *ParamsTemplate) ProtoReflect() protoreflect.Message {
-	mi := &file_base_type_proto_msgTypes[36]
+	mi := &file_base_type_proto_msgTypes[37]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1825,7 +1869,7 @@ func (x *ParamsTemplate) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ParamsTemplate.ProtoReflect.Descriptor instead.
 func (*ParamsTemplate) Descriptor() ([]byte, []int) {
-	return file_base_type_proto_rawDescGZIP(), []int{36}
+	return file_base_type_proto_rawDescGZIP(), []int{37}
 }
 
 func (x *ParamsTemplate) GetType() int32 {
@@ -1867,7 +1911,7 @@ type I64I64I32 struct {
 
 func (x *I64I64I32) Reset() {
 	*x = I64I64I32{}
-	mi := &file_base_type_proto_msgTypes[37]
+	mi := &file_base_type_proto_msgTypes[38]
 	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 	ms.StoreMessageInfo(mi)
 }
@@ -1879,7 +1923,7 @@ func (x *I64I64I32) String() string {
 func (*I64I64I32) ProtoMessage() {}
 
 func (x *I64I64I32) ProtoReflect() protoreflect.Message {
-	mi := &file_base_type_proto_msgTypes[37]
+	mi := &file_base_type_proto_msgTypes[38]
 	if x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1892,7 +1936,7 @@ func (x *I64I64I32) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use I64I64I32.ProtoReflect.Descriptor instead.
 func (*I64I64I32) Descriptor() ([]byte, []int) {
-	return file_base_type_proto_rawDescGZIP(), []int{37}
+	return file_base_type_proto_rawDescGZIP(), []int{38}
 }
 
 func (x *I64I64I32) GetKey1() int64 {
@@ -2039,7 +2083,11 @@ const file_base_type_proto_rawDesc = "" +
 	"\x05Start\x18\x01 \x01(\v2\t.pb.PointR\x05Start\x12\x1b\n" +
 	"\x03End\x18\x02 \x01(\v2\t.pb.PointR\x03End\"'\n" +
 	"\x06Points\x12\x1d\n" +
-	"\x04list\x18\x01 \x03(\v2\t.pb.PointR\x04list\"'\n" +
+	"\x04list\x18\x01 \x03(\v2\t.pb.PointR\x04list\",\n" +
+	"\n" +
+	"PointsList\x12\x1e\n" +
+	"\x04list\x18\x01 \x03(\v2\n" +
+	".pb.PointsR\x04list\"'\n" +
 	"\x05Attrs\x12\x1e\n" +
 	"\x04list\x18\x01 \x03(\v2\n" +
 	".pb.I32I64R\x04list\"\x9f\x01\n" +
@@ -2076,7 +2124,7 @@ func file_base_type_proto_rawDescGZIP() []byte {
 	return file_base_type_proto_rawDescData
 }
 
-var file_base_type_proto_msgTypes = make([]protoimpl.MessageInfo, 45)
+var file_base_type_proto_msgTypes = make([]protoimpl.MessageInfo, 46)
 var file_base_type_proto_goTypes = []any{
 	(*None)(nil),           // 0: pb.None
 	(*Bool)(nil),           // 1: pb.Bool
@@ -2112,42 +2160,44 @@ var file_base_type_proto_goTypes = []any{
 	(*Point)(nil),          // 31: pb.Point
 	(*Point2)(nil),         // 32: pb.Point2
 	(*Points)(nil),         // 33: pb.Points
-	(*Attrs)(nil),          // 34: pb.Attrs
-	(*BaseAttrs)(nil),      // 35: pb.BaseAttrs
-	(*ParamsTemplate)(nil), // 36: pb.ParamsTemplate
-	(*I64I64I32)(nil),      // 37: pb.I64I64I32
-	nil,                    // 38: pb.I32Map.ValueEntry
-	nil,                    // 39: pb.I64Map.ValueEntry
-	nil,                    // 40: pb.I32I64Map.ValueEntry
-	nil,                    // 41: pb.I64I32Map.ValueEntry
-	nil,                    // 42: pb.KeyMap.Int32MapsEntry
-	nil,                    // 43: pb.KeyMap.Int64MapsEntry
-	nil,                    // 44: pb.KeyMap.StringMapsEntry
+	(*PointsList)(nil),     // 34: pb.PointsList
+	(*Attrs)(nil),          // 35: pb.Attrs
+	(*BaseAttrs)(nil),      // 36: pb.BaseAttrs
+	(*ParamsTemplate)(nil), // 37: pb.ParamsTemplate
+	(*I64I64I32)(nil),      // 38: pb.I64I64I32
+	nil,                    // 39: pb.I32Map.ValueEntry
+	nil,                    // 40: pb.I64Map.ValueEntry
+	nil,                    // 41: pb.I32I64Map.ValueEntry
+	nil,                    // 42: pb.I64I32Map.ValueEntry
+	nil,                    // 43: pb.KeyMap.Int32MapsEntry
+	nil,                    // 44: pb.KeyMap.Int64MapsEntry
+	nil,                    // 45: pb.KeyMap.StringMapsEntry
 }
 var file_base_type_proto_depIdxs = []int32{
 	7,  // 0: pb.StrStrList.list:type_name -> pb.StrStr
 	11, // 1: pb.I64I32List.list:type_name -> pb.I64I32
 	13, // 2: pb.I64I64List.list:type_name -> pb.I64I64
 	15, // 3: pb.I32I32List.list:type_name -> pb.I32I32
-	38, // 4: pb.I32Map.value:type_name -> pb.I32Map.ValueEntry
-	39, // 5: pb.I64Map.value:type_name -> pb.I64Map.ValueEntry
-	40, // 6: pb.I32I64Map.value:type_name -> pb.I32I64Map.ValueEntry
-	41, // 7: pb.I64I32Map.value:type_name -> pb.I64I32Map.ValueEntry
+	39, // 4: pb.I32Map.value:type_name -> pb.I32Map.ValueEntry
+	40, // 5: pb.I64Map.value:type_name -> pb.I64Map.ValueEntry
+	41, // 6: pb.I32I64Map.value:type_name -> pb.I32I64Map.ValueEntry
+	42, // 7: pb.I64I32Map.value:type_name -> pb.I64I32Map.ValueEntry
 	26, // 8: pb.AssetList.list:type_name -> pb.Asset
-	42, // 9: pb.KeyMap.int32Maps:type_name -> pb.KeyMap.Int32MapsEntry
-	43, // 10: pb.KeyMap.int64Maps:type_name -> pb.KeyMap.Int64MapsEntry
-	44, // 11: pb.KeyMap.stringMaps:type_name -> pb.KeyMap.StringMapsEntry
+	43, // 9: pb.KeyMap.int32Maps:type_name -> pb.KeyMap.Int32MapsEntry
+	44, // 10: pb.KeyMap.int64Maps:type_name -> pb.KeyMap.Int64MapsEntry
+	45, // 11: pb.KeyMap.stringMaps:type_name -> pb.KeyMap.StringMapsEntry
 	31, // 12: pb.Point2.Start:type_name -> pb.Point
 	31, // 13: pb.Point2.End:type_name -> pb.Point
 	31, // 14: pb.Points.list:type_name -> pb.Point
-	18, // 15: pb.Attrs.list:type_name -> pb.I32I64
-	27, // 16: pb.ParamsTemplate.assets:type_name -> pb.AssetList
-	33, // 17: pb.ParamsTemplate.points:type_name -> pb.Points
-	18, // [18:18] is the sub-list for method output_type
-	18, // [18:18] is the sub-list for method input_type
-	18, // [18:18] is the sub-list for extension type_name
-	18, // [18:18] is the sub-list for extension extendee
-	0,  // [0:18] is the sub-list for field type_name
+	33, // 15: pb.PointsList.list:type_name -> pb.Points
+	18, // 16: pb.Attrs.list:type_name -> pb.I32I64
+	27, // 17: pb.ParamsTemplate.assets:type_name -> pb.AssetList
+	33, // 18: pb.ParamsTemplate.points:type_name -> pb.Points
+	19, // [19:19] is the sub-list for method output_type
+	19, // [19:19] is the sub-list for method input_type
+	19, // [19:19] is the sub-list for extension type_name
+	19, // [19:19] is the sub-list for extension extendee
+	0,  // [0:19] is the sub-list for field type_name
 }
 
 func init() { file_base_type_proto_init() }
@@ -2161,7 +2211,7 @@ func file_base_type_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: unsafe.Slice(unsafe.StringData(file_base_type_proto_rawDesc), len(file_base_type_proto_rawDesc)),
 			NumEnums:      0,
-			NumMessages:   45,
+			NumMessages:   46,
 			NumExtensions: 0,
 			NumServices:   0,
 		},

+ 42 - 8
sr/internal/pb/battle.pb.go

@@ -95,9 +95,13 @@ type BattleParam struct {
 	// 是否需要生成详细校验数据
 	IsGenerateVerificationInfo bool `protobuf:"varint,4,opt,name=isGenerateVerificationInfo,proto3" json:"isGenerateVerificationInfo,omitempty"`
 	// 战斗类型  BattleType 1:测试 2:探险 3:PVP 4:SLG
-	BattleType    int32 `protobuf:"varint,5,opt,name=battleType,proto3" json:"battleType,omitempty"`
-	unknownFields protoimpl.UnknownFields
-	sizeCache     protoimpl.SizeCache
+	BattleType int32 `protobuf:"varint,5,opt,name=battleType,proto3" json:"battleType,omitempty"`
+	// 配置数据
+	ConfigData []byte `protobuf:"bytes,6,opt,name=configData,proto3" json:"configData,omitempty"`
+	// 是否生成配置数据
+	GenerateConfigData bool `protobuf:"varint,7,opt,name=generateConfigData,proto3" json:"generateConfigData,omitempty"`
+	unknownFields      protoimpl.UnknownFields
+	sizeCache          protoimpl.SizeCache
 }
 
 func (x *BattleParam) Reset() {
@@ -165,6 +169,20 @@ func (x *BattleParam) GetBattleType() int32 {
 	return 0
 }
 
+func (x *BattleParam) GetConfigData() []byte {
+	if x != nil {
+		return x.ConfigData
+	}
+	return nil
+}
+
+func (x *BattleParam) GetGenerateConfigData() bool {
+	if x != nil {
+		return x.GenerateConfigData
+	}
+	return false
+}
+
 // 阵营参数
 type BattleCampParam struct {
 	state protoimpl.MessageState `protogen:"open.v1"`
@@ -767,7 +785,9 @@ type BattleResult struct {
 	// 阵营结果
 	CampResult []*BattleCampResult `protobuf:"bytes,3,rep,name=campResult,proto3" json:"campResult,omitempty"`
 	// 详细校验结果
-	VerifyInfos   []*BattleVerifyInfo `protobuf:"bytes,4,rep,name=verifyInfos,proto3" json:"verifyInfos,omitempty"`
+	VerifyInfos []*BattleVerifyInfo `protobuf:"bytes,4,rep,name=verifyInfos,proto3" json:"verifyInfos,omitempty"`
+	// 配置数据
+	ConfigData    []byte `protobuf:"bytes,6,opt,name=configData,proto3" json:"configData,omitempty"`
 	unknownFields protoimpl.UnknownFields
 	sizeCache     protoimpl.SizeCache
 }
@@ -830,6 +850,13 @@ func (x *BattleResult) GetVerifyInfos() []*BattleVerifyInfo {
 	return nil
 }
 
+func (x *BattleResult) GetConfigData() []byte {
+	if x != nil {
+		return x.ConfigData
+	}
+	return nil
+}
+
 // 校验详细信息
 type BattleVerifyInfo struct {
 	state protoimpl.MessageState `protogen:"open.v1"`
@@ -911,7 +938,7 @@ const file_battle_proto_rawDesc = "" +
 	"\fBattleReplay\x12\x1c\n" +
 	"\terrorCode\x18\x01 \x01(\x05R\terrorCode\x12\x1c\n" +
 	"\terrorText\x18\x02 \x01(\tR\terrorText\x12(\n" +
-	"\x06result\x18\x03 \x01(\v2\x10.pb.BattleResultR\x06result\"\xce\x01\n" +
+	"\x06result\x18\x03 \x01(\v2\x10.pb.BattleResultR\x06result\"\x9e\x02\n" +
 	"\vBattleParam\x12\x1e\n" +
 	"\n" +
 	"randomSeed\x18\x01 \x01(\x04R\n" +
@@ -921,7 +948,11 @@ const file_battle_proto_rawDesc = "" +
 	"\x1aisGenerateVerificationInfo\x18\x04 \x01(\bR\x1aisGenerateVerificationInfo\x12\x1e\n" +
 	"\n" +
 	"battleType\x18\x05 \x01(\x05R\n" +
-	"battleType\"\x85\x01\n" +
+	"battleType\x12\x1e\n" +
+	"\n" +
+	"configData\x18\x06 \x01(\fR\n" +
+	"configData\x12.\n" +
+	"\x12generateConfigData\x18\a \x01(\bR\x12generateConfigData\"\x85\x01\n" +
 	"\x0fBattleCampParam\x12\x12\n" +
 	"\x04camp\x18\x01 \x01(\x05R\x04camp\x12\x14\n" +
 	"\x05power\x18\x02 \x01(\x03R\x05power\x12,\n" +
@@ -968,14 +999,17 @@ const file_battle_proto_rawDesc = "" +
 	"\rbattleObjType\x18\x02 \x01(\x05R\rbattleObjType\x12\x1a\n" +
 	"\bconfigID\x18\x03 \x01(\x05R\bconfigID\x12\x16\n" +
 	"\x06isDead\x18\x04 \x01(\bR\x06isDead\x12\x0e\n" +
-	"\x02hp\x18\x05 \x01(\x05R\x02hp\"\xc0\x01\n" +
+	"\x02hp\x18\x05 \x01(\x05R\x02hp\"\xe0\x01\n" +
 	"\fBattleResult\x12&\n" +
 	"\x0evictoriousCamp\x18\x01 \x01(\x05R\x0evictoriousCamp\x12\x1a\n" +
 	"\bchecksum\x18\x02 \x01(\x03R\bchecksum\x124\n" +
 	"\n" +
 	"campResult\x18\x03 \x03(\v2\x14.pb.BattleCampResultR\n" +
 	"campResult\x126\n" +
-	"\vverifyInfos\x18\x04 \x03(\v2\x14.pb.BattleVerifyInfoR\vverifyInfos\"\xce\x02\n" +
+	"\vverifyInfos\x18\x04 \x03(\v2\x14.pb.BattleVerifyInfoR\vverifyInfos\x12\x1e\n" +
+	"\n" +
+	"configData\x18\x06 \x01(\fR\n" +
+	"configData\"\xce\x02\n" +
 	"\x10BattleVerifyInfo\x12\x12\n" +
 	"\x04name\x18\x01 \x01(\tR\x04name\x12\x1a\n" +
 	"\bchecksum\x18\x02 \x01(\x03R\bchecksum\x12;\n" +

+ 118 - 38
sr/internal/pb/league.pb.go

@@ -2946,6 +2946,79 @@ func (x *LeagueUnion) GetUnionRelieveTime() int64 {
 	return 0
 }
 
+// 联盟升级通知
+type LeagueUpgradeNotice struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// 联盟ID
+	LeagueID int64 `protobuf:"varint,1,opt,name=leagueID,proto3" json:"leagueID,omitempty"`
+	// 当前等级
+	Level int32 `protobuf:"varint,2,opt,name=level,proto3" json:"level,omitempty"`
+	// 当前经验值
+	Exp int32 `protobuf:"varint,3,opt,name=exp,proto3" json:"exp,omitempty"`
+	// 联盟属性
+	Attrs         *Attrs `protobuf:"bytes,4,opt,name=attrs,proto3" json:"attrs,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *LeagueUpgradeNotice) Reset() {
+	*x = LeagueUpgradeNotice{}
+	mi := &file_league_proto_msgTypes[41]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *LeagueUpgradeNotice) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*LeagueUpgradeNotice) ProtoMessage() {}
+
+func (x *LeagueUpgradeNotice) ProtoReflect() protoreflect.Message {
+	mi := &file_league_proto_msgTypes[41]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use LeagueUpgradeNotice.ProtoReflect.Descriptor instead.
+func (*LeagueUpgradeNotice) Descriptor() ([]byte, []int) {
+	return file_league_proto_rawDescGZIP(), []int{41}
+}
+
+func (x *LeagueUpgradeNotice) GetLeagueID() int64 {
+	if x != nil {
+		return x.LeagueID
+	}
+	return 0
+}
+
+func (x *LeagueUpgradeNotice) GetLevel() int32 {
+	if x != nil {
+		return x.Level
+	}
+	return 0
+}
+
+func (x *LeagueUpgradeNotice) GetExp() int32 {
+	if x != nil {
+		return x.Exp
+	}
+	return 0
+}
+
+func (x *LeagueUpgradeNotice) GetAttrs() *Attrs {
+	if x != nil {
+		return x.Attrs
+	}
+	return nil
+}
+
 var File_league_proto protoreflect.FileDescriptor
 
 const file_league_proto_rawDesc = "" +
@@ -3233,7 +3306,12 @@ const file_league_proto_rawDesc = "" +
 	"\vLeagueUnion\x12\x18\n" +
 	"\aunionID\x18\x01 \x01(\x03R\aunionID\x12$\n" +
 	"\runionLeagueID\x18\x02 \x01(\x03R\runionLeagueID\x12*\n" +
-	"\x10unionRelieveTime\x18\x03 \x01(\x03R\x10unionRelieveTimeB\x05Z\x03/pbb\x06proto3"
+	"\x10unionRelieveTime\x18\x03 \x01(\x03R\x10unionRelieveTime\"z\n" +
+	"\x13LeagueUpgradeNotice\x12\x1a\n" +
+	"\bleagueID\x18\x01 \x01(\x03R\bleagueID\x12\x14\n" +
+	"\x05level\x18\x02 \x01(\x05R\x05level\x12\x10\n" +
+	"\x03exp\x18\x03 \x01(\x05R\x03exp\x12\x1f\n" +
+	"\x05attrs\x18\x04 \x01(\v2\t.pb.AttrsR\x05attrsB\x05Z\x03/pbb\x06proto3"
 
 var (
 	file_league_proto_rawDescOnce sync.Once
@@ -3247,7 +3325,7 @@ func file_league_proto_rawDescGZIP() []byte {
 	return file_league_proto_rawDescData
 }
 
-var file_league_proto_msgTypes = make([]protoimpl.MessageInfo, 46)
+var file_league_proto_msgTypes = make([]protoimpl.MessageInfo, 47)
 var file_league_proto_goTypes = []any{
 	(*LeagueList)(nil),                 // 0: pb.LeagueList
 	(*LeagueSearch)(nil),               // 1: pb.LeagueSearch
@@ -3290,59 +3368,61 @@ var file_league_proto_goTypes = []any{
 	(*LeagueDiplomacyApply)(nil),       // 38: pb.LeagueDiplomacyApply
 	(*LeagueUmengChange)(nil),          // 39: pb.LeagueUmengChange
 	(*LeagueUnion)(nil),                // 40: pb.LeagueUnion
-	nil,                                // 41: pb.LeagueMemberRecordInfo.RecordsEntry
-	nil,                                // 42: pb.LeagueMemberRecord.WeekDatasEntry
-	nil,                                // 43: pb.LeagueStorage.CurrenciesEntry
-	nil,                                // 44: pb.LeagueStorage.RatiosEntry
-	nil,                                // 45: pb.LeagueDiplomacy.UmengsEntry
-	(*Point)(nil),                      // 46: pb.Point
-	(*Attrs)(nil),                      // 47: pb.Attrs
-	(*I32I64)(nil),                     // 48: pb.I32I64
-	(*I32I32)(nil),                     // 49: pb.I32I32
-	(*I64I32)(nil),                     // 50: pb.I64I32
-	(*Currency)(nil),                   // 51: pb.Currency
+	(*LeagueUpgradeNotice)(nil),        // 41: pb.LeagueUpgradeNotice
+	nil,                                // 42: pb.LeagueMemberRecordInfo.RecordsEntry
+	nil,                                // 43: pb.LeagueMemberRecord.WeekDatasEntry
+	nil,                                // 44: pb.LeagueStorage.CurrenciesEntry
+	nil,                                // 45: pb.LeagueStorage.RatiosEntry
+	nil,                                // 46: pb.LeagueDiplomacy.UmengsEntry
+	(*Point)(nil),                      // 47: pb.Point
+	(*Attrs)(nil),                      // 48: pb.Attrs
+	(*I32I64)(nil),                     // 49: pb.I32I64
+	(*I32I32)(nil),                     // 50: pb.I32I32
+	(*I64I32)(nil),                     // 51: pb.I64I32
+	(*Currency)(nil),                   // 52: pb.Currency
 }
 var file_league_proto_depIdxs = []int32{
 	1,  // 0: pb.LeagueList.list:type_name -> pb.LeagueSearch
-	46, // 1: pb.LeagueSearch.location:type_name -> pb.Point
-	46, // 2: pb.LeagueBase.location:type_name -> pb.Point
-	47, // 3: pb.LeagueBase.attrs:type_name -> pb.Attrs
+	47, // 1: pb.LeagueSearch.location:type_name -> pb.Point
+	47, // 2: pb.LeagueBase.location:type_name -> pb.Point
+	48, // 3: pb.LeagueBase.attrs:type_name -> pb.Attrs
 	3,  // 4: pb.League.leagueBase:type_name -> pb.LeagueBase
 	36, // 5: pb.League.diplomacy:type_name -> pb.LeagueDiplomacy
 	6,  // 6: pb.LeagueMembers.list:type_name -> pb.LeagueMember
 	18, // 7: pb.LeagueMembers.transfer:type_name -> pb.LeagueTransfer
-	46, // 8: pb.LeagueMember.point:type_name -> pb.Point
-	48, // 9: pb.LeagueJobRequest.jobs:type_name -> pb.I32I64
-	49, // 10: pb.LeagueTechList.techs:type_name -> pb.I32I32
+	47, // 8: pb.LeagueMember.point:type_name -> pb.Point
+	49, // 9: pb.LeagueJobRequest.jobs:type_name -> pb.I32I64
+	50, // 10: pb.LeagueTechList.techs:type_name -> pb.I32I32
 	10, // 11: pb.LeagueBuildList.list:type_name -> pb.LeagueBuild
-	46, // 12: pb.LeagueBuild.point:type_name -> pb.Point
+	47, // 12: pb.LeagueBuild.point:type_name -> pb.Point
 	12, // 13: pb.LeagueCastleList.list:type_name -> pb.LeagueCastle
-	46, // 14: pb.LeagueCastle.point:type_name -> pb.Point
+	47, // 14: pb.LeagueCastle.point:type_name -> pb.Point
 	14, // 15: pb.LeaguePermissionRequest.jobs:type_name -> pb.LeaguePermission
 	17, // 16: pb.LeagueLogList.list:type_name -> pb.LeagueLog
 	20, // 17: pb.LeagueJobList.list:type_name -> pb.LeagueJobInfo
 	22, // 18: pb.LeagueApplyList.list:type_name -> pb.LeagueApply
-	46, // 19: pb.LeagueApply.location:type_name -> pb.Point
+	47, // 19: pb.LeagueApply.location:type_name -> pb.Point
 	27, // 20: pb.LeagueResidenceList.list:type_name -> pb.LeagueResidence
-	41, // 21: pb.LeagueMemberRecordInfo.records:type_name -> pb.LeagueMemberRecordInfo.RecordsEntry
-	42, // 22: pb.LeagueMemberRecord.weekDatas:type_name -> pb.LeagueMemberRecord.WeekDatasEntry
-	43, // 23: pb.LeagueStorage.currencies:type_name -> pb.LeagueStorage.CurrenciesEntry
-	44, // 24: pb.LeagueStorage.ratios:type_name -> pb.LeagueStorage.RatiosEntry
+	42, // 21: pb.LeagueMemberRecordInfo.records:type_name -> pb.LeagueMemberRecordInfo.RecordsEntry
+	43, // 22: pb.LeagueMemberRecord.weekDatas:type_name -> pb.LeagueMemberRecord.WeekDatasEntry
+	44, // 23: pb.LeagueStorage.currencies:type_name -> pb.LeagueStorage.CurrenciesEntry
+	45, // 24: pb.LeagueStorage.ratios:type_name -> pb.LeagueStorage.RatiosEntry
 	35, // 25: pb.LeagueDiplomacyInfos.list:type_name -> pb.LeagueDiplomacyInfo
-	46, // 26: pb.LeagueDiplomacyInfo.location:type_name -> pb.Point
+	47, // 26: pb.LeagueDiplomacyInfo.location:type_name -> pb.Point
 	40, // 27: pb.LeagueDiplomacy.union:type_name -> pb.LeagueUnion
-	45, // 28: pb.LeagueDiplomacy.umengs:type_name -> pb.LeagueDiplomacy.UmengsEntry
+	46, // 28: pb.LeagueDiplomacy.umengs:type_name -> pb.LeagueDiplomacy.UmengsEntry
 	38, // 29: pb.LeagueDiplomacy.applys:type_name -> pb.LeagueDiplomacyApply
-	50, // 30: pb.LeagueDiplomacy.sendApplys:type_name -> pb.I64I32
+	51, // 30: pb.LeagueDiplomacy.sendApplys:type_name -> pb.I64I32
 	38, // 31: pb.LeagueDiplomacyApplyChange.apply:type_name -> pb.LeagueDiplomacyApply
-	29, // 32: pb.LeagueMemberRecordInfo.RecordsEntry.value:type_name -> pb.LeagueMemberRecord
-	51, // 33: pb.LeagueStorage.CurrenciesEntry.value:type_name -> pb.Currency
-	31, // 34: pb.LeagueStorage.RatiosEntry.value:type_name -> pb.StorageRatio
-	35, // [35:35] is the sub-list for method output_type
-	35, // [35:35] is the sub-list for method input_type
-	35, // [35:35] is the sub-list for extension type_name
-	35, // [35:35] is the sub-list for extension extendee
-	0,  // [0:35] is the sub-list for field type_name
+	48, // 32: pb.LeagueUpgradeNotice.attrs:type_name -> pb.Attrs
+	29, // 33: pb.LeagueMemberRecordInfo.RecordsEntry.value:type_name -> pb.LeagueMemberRecord
+	52, // 34: pb.LeagueStorage.CurrenciesEntry.value:type_name -> pb.Currency
+	31, // 35: pb.LeagueStorage.RatiosEntry.value:type_name -> pb.StorageRatio
+	36, // [36:36] is the sub-list for method output_type
+	36, // [36:36] is the sub-list for method input_type
+	36, // [36:36] is the sub-list for extension type_name
+	36, // [36:36] is the sub-list for extension extendee
+	0,  // [0:36] is the sub-list for field type_name
 }
 
 func init() { file_league_proto_init() }
@@ -3358,7 +3438,7 @@ func file_league_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: unsafe.Slice(unsafe.StringData(file_league_proto_rawDesc), len(file_league_proto_rawDesc)),
 			NumEnums:      0,
-			NumMessages:   46,
+			NumMessages:   47,
 			NumExtensions: 0,
 			NumServices:   0,
 		},

+ 232 - 49
sr/internal/pb/map.pb.go

@@ -3991,9 +3991,11 @@ type MapUIMarch struct {
 	// 所有者的玩家ID
 	PlayerID int64 `protobuf:"varint,7,opt,name=playerID,proto3" json:"playerID,omitempty"`
 	// 所有者的联盟ID
-	LeagueID      int64 `protobuf:"varint,8,opt,name=leagueID,proto3" json:"leagueID,omitempty"`
-	unknownFields protoimpl.UnknownFields
-	sizeCache     protoimpl.SizeCache
+	LeagueID int64 `protobuf:"varint,8,opt,name=leagueID,proto3" json:"leagueID,omitempty"`
+	// 调动对象ID
+	RedeployObjectID int64 `protobuf:"varint,9,opt,name=redeployObjectID,proto3" json:"redeployObjectID,omitempty"`
+	unknownFields    protoimpl.UnknownFields
+	sizeCache        protoimpl.SizeCache
 }
 
 func (x *MapUIMarch) Reset() {
@@ -4082,6 +4084,13 @@ func (x *MapUIMarch) GetLeagueID() int64 {
 	return 0
 }
 
+func (x *MapUIMarch) GetRedeployObjectID() int64 {
+	if x != nil {
+		return x.RedeployObjectID
+	}
+	return 0
+}
+
 // 地图ui层-系统城对象列表
 type MapUICastles struct {
 	state protoimpl.MessageState `protogen:"open.v1"`
@@ -4342,10 +4351,12 @@ type MapScout struct {
 	state protoimpl.MessageState `protogen:"open.v1"`
 	// 侦察队列ID
 	QueueID int32 `protobuf:"varint,1,opt,name=queueID,proto3" json:"queueID,omitempty"`
+	// 侦察状态 0空闲 1行军 2侦察中
+	ScoutStatus int32 `protobuf:"varint,2,opt,name=scoutStatus,proto3" json:"scoutStatus,omitempty"`
 	// 侦察坐标 如果为空,则为空闲
-	Point *Point `protobuf:"bytes,2,opt,name=point,proto3" json:"point,omitempty"`
-	// 侦察结束时间戳(行军+侦察时间) 单位毫秒 0表示空闲
-	EndTime       int64 `protobuf:"varint,3,opt,name=endTime,proto3" json:"endTime,omitempty"`
+	Point *Point `protobuf:"bytes,3,opt,name=point,proto3" json:"point,omitempty"`
+	// 状态结束时间戳 单位毫秒
+	EndTime       int64 `protobuf:"varint,4,opt,name=endTime,proto3" json:"endTime,omitempty"`
 	unknownFields protoimpl.UnknownFields
 	sizeCache     protoimpl.SizeCache
 }
@@ -4387,6 +4398,13 @@ func (x *MapScout) GetQueueID() int32 {
 	return 0
 }
 
+func (x *MapScout) GetScoutStatus() int32 {
+	if x != nil {
+		return x.ScoutStatus
+	}
+	return 0
+}
+
 func (x *MapScout) GetPoint() *Point {
 	if x != nil {
 		return x.Point
@@ -4401,6 +4419,152 @@ func (x *MapScout) GetEndTime() int64 {
 	return 0
 }
 
+// 军情线列表
+type MapArmyLines struct {
+	state         protoimpl.MessageState `protogen:"open.v1"`
+	List          []*MapArmyLine         `protobuf:"bytes,1,rep,name=list,proto3" json:"list,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *MapArmyLines) Reset() {
+	*x = MapArmyLines{}
+	mi := &file_map_proto_msgTypes[54]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *MapArmyLines) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MapArmyLines) ProtoMessage() {}
+
+func (x *MapArmyLines) ProtoReflect() protoreflect.Message {
+	mi := &file_map_proto_msgTypes[54]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MapArmyLines.ProtoReflect.Descriptor instead.
+func (*MapArmyLines) Descriptor() ([]byte, []int) {
+	return file_map_proto_rawDescGZIP(), []int{54}
+}
+
+func (x *MapArmyLines) GetList() []*MapArmyLine {
+	if x != nil {
+		return x.List
+	}
+	return nil
+}
+
+// 军情线
+type MapArmyLine struct {
+	state protoimpl.MessageState `protogen:"open.v1"`
+	// 对象唯一id
+	ObjectID int64 `protobuf:"varint,1,opt,name=objectID,proto3" json:"objectID,omitempty"`
+	// 所有者的玩家ID
+	PlayerID int64 `protobuf:"varint,2,opt,name=playerID,proto3" json:"playerID,omitempty"`
+	// 所有者的联盟ID
+	LeagueID int64 `protobuf:"varint,3,opt,name=leagueID,proto3" json:"leagueID,omitempty"`
+	// 对象类型,用来读取下面对应的配置ID和结构
+	// 见 map.go -> ObjectType 地块对象类型
+	ObjectType int32 `protobuf:"varint,4,opt,name=objectType,proto3" json:"objectType,omitempty"`
+	// 速度
+	Speed int64 `protobuf:"varint,5,opt,name=speed,proto3" json:"speed,omitempty"`
+	// 路径列表
+	Points []*Point `protobuf:"bytes,6,rep,name=points,proto3" json:"points,omitempty"`
+	// 终点坐标
+	TargetPoint   *Point `protobuf:"bytes,7,opt,name=targetPoint,proto3" json:"targetPoint,omitempty"`
+	unknownFields protoimpl.UnknownFields
+	sizeCache     protoimpl.SizeCache
+}
+
+func (x *MapArmyLine) Reset() {
+	*x = MapArmyLine{}
+	mi := &file_map_proto_msgTypes[55]
+	ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+	ms.StoreMessageInfo(mi)
+}
+
+func (x *MapArmyLine) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MapArmyLine) ProtoMessage() {}
+
+func (x *MapArmyLine) ProtoReflect() protoreflect.Message {
+	mi := &file_map_proto_msgTypes[55]
+	if x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MapArmyLine.ProtoReflect.Descriptor instead.
+func (*MapArmyLine) Descriptor() ([]byte, []int) {
+	return file_map_proto_rawDescGZIP(), []int{55}
+}
+
+func (x *MapArmyLine) GetObjectID() int64 {
+	if x != nil {
+		return x.ObjectID
+	}
+	return 0
+}
+
+func (x *MapArmyLine) GetPlayerID() int64 {
+	if x != nil {
+		return x.PlayerID
+	}
+	return 0
+}
+
+func (x *MapArmyLine) GetLeagueID() int64 {
+	if x != nil {
+		return x.LeagueID
+	}
+	return 0
+}
+
+func (x *MapArmyLine) GetObjectType() int32 {
+	if x != nil {
+		return x.ObjectType
+	}
+	return 0
+}
+
+func (x *MapArmyLine) GetSpeed() int64 {
+	if x != nil {
+		return x.Speed
+	}
+	return 0
+}
+
+func (x *MapArmyLine) GetPoints() []*Point {
+	if x != nil {
+		return x.Points
+	}
+	return nil
+}
+
+func (x *MapArmyLine) GetTargetPoint() *Point {
+	if x != nil {
+		return x.TargetPoint
+	}
+	return nil
+}
+
 var File_map_proto protoreflect.FileDescriptor
 
 const file_map_proto_rawDesc = "" +
@@ -4757,7 +4921,7 @@ const file_map_proto_rawDesc = "" +
 	"\x05point\x18\x01 \x01(\v2\t.pb.PointR\x05point\x12\x1a\n" +
 	"\bisFailed\x18\x02 \x01(\bR\bisFailed\"1\n" +
 	"\vMapUIMarchs\x12\"\n" +
-	"\x04list\x18\x01 \x03(\v2\x0e.pb.MapUIMarchR\x04list\"\x8b\x02\n" +
+	"\x04list\x18\x01 \x03(\v2\x0e.pb.MapUIMarchR\x04list\"\xb7\x02\n" +
 	"\n" +
 	"MapUIMarch\x12\x1a\n" +
 	"\bobjectID\x18\x01 \x01(\x03R\bobjectID\x12\x1a\n" +
@@ -4769,7 +4933,8 @@ const file_map_proto_rawDesc = "" +
 	"\x04path\x18\x05 \x01(\v2\v.pb.MapPathR\x04path\x12\x1f\n" +
 	"\x05point\x18\x06 \x01(\v2\t.pb.PointR\x05point\x12\x1a\n" +
 	"\bplayerID\x18\a \x01(\x03R\bplayerID\x12\x1a\n" +
-	"\bleagueID\x18\b \x01(\x03R\bleagueID\"3\n" +
+	"\bleagueID\x18\b \x01(\x03R\bleagueID\x12*\n" +
+	"\x10redeployObjectID\x18\t \x01(\x03R\x10redeployObjectID\"3\n" +
 	"\fMapUICastles\x12#\n" +
 	"\x04list\x18\x01 \x03(\v2\x0f.pb.MapUICastleR\x04list\"\xfc\x01\n" +
 	"\vMapUICastle\x12\x1a\n" +
@@ -4789,11 +4954,24 @@ const file_map_proto_rawDesc = "" +
 	"objectType\x18\x02 \x01(\x05R\n" +
 	"objectType\"0\n" +
 	"\fMapScoutList\x12 \n" +
-	"\x04list\x18\x01 \x03(\v2\f.pb.MapScoutR\x04list\"_\n" +
+	"\x04list\x18\x01 \x03(\v2\f.pb.MapScoutR\x04list\"\x81\x01\n" +
 	"\bMapScout\x12\x18\n" +
-	"\aqueueID\x18\x01 \x01(\x05R\aqueueID\x12\x1f\n" +
-	"\x05point\x18\x02 \x01(\v2\t.pb.PointR\x05point\x12\x18\n" +
-	"\aendTime\x18\x03 \x01(\x03R\aendTimeB\x05Z\x03/pbb\x06proto3"
+	"\aqueueID\x18\x01 \x01(\x05R\aqueueID\x12 \n" +
+	"\vscoutStatus\x18\x02 \x01(\x05R\vscoutStatus\x12\x1f\n" +
+	"\x05point\x18\x03 \x01(\v2\t.pb.PointR\x05point\x12\x18\n" +
+	"\aendTime\x18\x04 \x01(\x03R\aendTime\"3\n" +
+	"\fMapArmyLines\x12#\n" +
+	"\x04list\x18\x01 \x03(\v2\x0f.pb.MapArmyLineR\x04list\"\xe7\x01\n" +
+	"\vMapArmyLine\x12\x1a\n" +
+	"\bobjectID\x18\x01 \x01(\x03R\bobjectID\x12\x1a\n" +
+	"\bplayerID\x18\x02 \x01(\x03R\bplayerID\x12\x1a\n" +
+	"\bleagueID\x18\x03 \x01(\x03R\bleagueID\x12\x1e\n" +
+	"\n" +
+	"objectType\x18\x04 \x01(\x05R\n" +
+	"objectType\x12\x14\n" +
+	"\x05speed\x18\x05 \x01(\x03R\x05speed\x12!\n" +
+	"\x06points\x18\x06 \x03(\v2\t.pb.PointR\x06points\x12+\n" +
+	"\vtargetPoint\x18\a \x01(\v2\t.pb.PointR\vtargetPointB\x05Z\x03/pbb\x06proto3"
 
 var (
 	file_map_proto_rawDescOnce sync.Once
@@ -4807,7 +4985,7 @@ func file_map_proto_rawDescGZIP() []byte {
 	return file_map_proto_rawDescData
 }
 
-var file_map_proto_msgTypes = make([]protoimpl.MessageInfo, 54)
+var file_map_proto_msgTypes = make([]protoimpl.MessageInfo, 56)
 var file_map_proto_goTypes = []any{
 	(*OwnerMapObjects)(nil),          // 0: pb.OwnerMapObjects
 	(*OwnerMapObject)(nil),           // 1: pb.OwnerMapObject
@@ -4863,75 +5041,80 @@ var file_map_proto_goTypes = []any{
 	(*MapObjectPositionRequest)(nil), // 51: pb.MapObjectPositionRequest
 	(*MapScoutList)(nil),             // 52: pb.MapScoutList
 	(*MapScout)(nil),                 // 53: pb.MapScout
-	(*Point)(nil),                    // 54: pb.Point
-	(*Point2)(nil),                   // 55: pb.Point2
-	(*I64Map)(nil),                   // 56: pb.I64Map
-	(*I32Str)(nil),                   // 57: pb.I32Str
+	(*MapArmyLines)(nil),             // 54: pb.MapArmyLines
+	(*MapArmyLine)(nil),              // 55: pb.MapArmyLine
+	(*Point)(nil),                    // 56: pb.Point
+	(*Point2)(nil),                   // 57: pb.Point2
+	(*I64Map)(nil),                   // 58: pb.I64Map
+	(*I32Str)(nil),                   // 59: pb.I32Str
 }
 var file_map_proto_depIdxs = []int32{
 	1,  // 0: pb.OwnerMapObjects.list:type_name -> pb.OwnerMapObject
-	54, // 1: pb.OwnerMapObject.point:type_name -> pb.Point
+	56, // 1: pb.OwnerMapObject.point:type_name -> pb.Point
 	3,  // 2: pb.OwnerMapObject.build:type_name -> pb.OwnerMapObjectBuild
 	2,  // 3: pb.OwnerMapObject.res:type_name -> pb.OwnerMapObjectRes
 	9,  // 4: pb.MapObjects.objectList:type_name -> pb.MapObject
 	15, // 5: pb.MapObjects.legionList:type_name -> pb.MapLegion
 	7,  // 6: pb.MapPlayers.list:type_name -> pb.MapPlayer
 	8,  // 7: pb.MapLeagues.list:type_name -> pb.MapLeague
-	54, // 8: pb.MapObject.point:type_name -> pb.Point
+	56, // 8: pb.MapObject.point:type_name -> pb.Point
 	10, // 9: pb.MapObject.path:type_name -> pb.MapPath
 	11, // 10: pb.MapObject.castle:type_name -> pb.MapCastle
 	12, // 11: pb.MapObject.build:type_name -> pb.MapBuild
 	13, // 12: pb.MapObject.monster:type_name -> pb.MapMonster
 	14, // 13: pb.MapObject.res:type_name -> pb.MapRes
 	16, // 14: pb.MapObject.march:type_name -> pb.MapMarch
-	55, // 15: pb.MapPath.fromTo:type_name -> pb.Point2
-	54, // 16: pb.MapPath.points:type_name -> pb.Point
-	54, // 17: pb.MapLegion.point:type_name -> pb.Point
+	57, // 15: pb.MapPath.fromTo:type_name -> pb.Point2
+	56, // 16: pb.MapPath.points:type_name -> pb.Point
+	56, // 17: pb.MapLegion.point:type_name -> pb.Point
 	10, // 18: pb.MapLegion.path:type_name -> pb.MapPath
 	9,  // 19: pb.MapLegion.marchList:type_name -> pb.MapObject
 	43, // 20: pb.MapMarch.marchView:type_name -> pb.MarchView
-	54, // 21: pb.MapMarchRequest.point:type_name -> pb.Point
-	54, // 22: pb.MapBuildRequest.point:type_name -> pb.Point
+	56, // 21: pb.MapMarchRequest.point:type_name -> pb.Point
+	56, // 22: pb.MapBuildRequest.point:type_name -> pb.Point
 	21, // 23: pb.MapObjectsUpdate.list:type_name -> pb.MapObjectUpdate
-	54, // 24: pb.MapObjectUpdate.point:type_name -> pb.Point
-	54, // 25: pb.MapMarchState.point:type_name -> pb.Point
-	56, // 26: pb.MapEnterResponse.resDefends:type_name -> pb.I64Map
-	54, // 27: pb.MapAssembleRequest.point:type_name -> pb.Point
+	56, // 24: pb.MapObjectUpdate.point:type_name -> pb.Point
+	56, // 25: pb.MapMarchState.point:type_name -> pb.Point
+	58, // 26: pb.MapEnterResponse.resDefends:type_name -> pb.I64Map
+	56, // 27: pb.MapAssembleRequest.point:type_name -> pb.Point
 	29, // 28: pb.MapAssembleList.list:type_name -> pb.MapAssemble
-	54, // 29: pb.MapAssemble.startPoint:type_name -> pb.Point
+	56, // 29: pb.MapAssemble.startPoint:type_name -> pb.Point
 	30, // 30: pb.MapAssemble.marchList:type_name -> pb.MapAssembleMarch
-	54, // 31: pb.MapAssemble.targetPoint:type_name -> pb.Point
+	56, // 31: pb.MapAssemble.targetPoint:type_name -> pb.Point
 	32, // 32: pb.MapMarkList.list:type_name -> pb.MapMark
-	54, // 33: pb.MapMark.point:type_name -> pb.Point
-	54, // 34: pb.MapMarkRequest.point:type_name -> pb.Point
+	56, // 33: pb.MapMark.point:type_name -> pb.Point
+	56, // 34: pb.MapMarkRequest.point:type_name -> pb.Point
 	43, // 35: pb.MapBattlePush.attackMarchView:type_name -> pb.MarchView
 	43, // 36: pb.MapBattlePush.defendMarchView:type_name -> pb.MarchView
-	54, // 37: pb.MapBattlePush.point:type_name -> pb.Point
-	54, // 38: pb.War.castlePoint:type_name -> pb.Point
-	54, // 39: pb.War.siegeBasePoint:type_name -> pb.Point
+	56, // 37: pb.MapBattlePush.point:type_name -> pb.Point
+	56, // 38: pb.War.castlePoint:type_name -> pb.Point
+	56, // 39: pb.War.siegeBasePoint:type_name -> pb.Point
 	37, // 40: pb.WarList.list:type_name -> pb.War
-	57, // 41: pb.SiegeRank.killRank:type_name -> pb.I32Str
-	57, // 42: pb.SiegeRank.durabilityRank:type_name -> pb.I32Str
+	59, // 41: pb.SiegeRank.killRank:type_name -> pb.I32Str
+	59, // 42: pb.SiegeRank.durabilityRank:type_name -> pb.I32Str
 	41, // 43: pb.SiegeResult.killData:type_name -> pb.SiegeData
 	41, // 44: pb.SiegeResult.siegeData:type_name -> pb.SiegeData
 	42, // 45: pb.SiegeResult.lastKill:type_name -> pb.SiegePlayer
 	42, // 46: pb.SiegeData.player:type_name -> pb.SiegePlayer
-	54, // 47: pb.MapFindPathRequest.point:type_name -> pb.Point
-	54, // 48: pb.ComebackResponse.point:type_name -> pb.Point
-	54, // 49: pb.RebornPush.point:type_name -> pb.Point
+	56, // 47: pb.MapFindPathRequest.point:type_name -> pb.Point
+	56, // 48: pb.ComebackResponse.point:type_name -> pb.Point
+	56, // 49: pb.RebornPush.point:type_name -> pb.Point
 	48, // 50: pb.MapUIMarchs.list:type_name -> pb.MapUIMarch
 	43, // 51: pb.MapUIMarch.marchView:type_name -> pb.MarchView
 	10, // 52: pb.MapUIMarch.path:type_name -> pb.MapPath
-	54, // 53: pb.MapUIMarch.point:type_name -> pb.Point
+	56, // 53: pb.MapUIMarch.point:type_name -> pb.Point
 	50, // 54: pb.MapUICastles.list:type_name -> pb.MapUICastle
-	54, // 55: pb.MapUICastle.point:type_name -> pb.Point
+	56, // 55: pb.MapUICastle.point:type_name -> pb.Point
 	53, // 56: pb.MapScoutList.list:type_name -> pb.MapScout
-	54, // 57: pb.MapScout.point:type_name -> pb.Point
-	58, // [58:58] is the sub-list for method output_type
-	58, // [58:58] is the sub-list for method input_type
-	58, // [58:58] is the sub-list for extension type_name
-	58, // [58:58] is the sub-list for extension extendee
-	0,  // [0:58] is the sub-list for field type_name
+	56, // 57: pb.MapScout.point:type_name -> pb.Point
+	55, // 58: pb.MapArmyLines.list:type_name -> pb.MapArmyLine
+	56, // 59: pb.MapArmyLine.points:type_name -> pb.Point
+	56, // 60: pb.MapArmyLine.targetPoint:type_name -> pb.Point
+	61, // [61:61] is the sub-list for method output_type
+	61, // [61:61] is the sub-list for method input_type
+	61, // [61:61] is the sub-list for extension type_name
+	61, // [61:61] is the sub-list for extension extendee
+	0,  // [0:61] is the sub-list for field type_name
 }
 
 func init() { file_map_proto_init() }
@@ -4946,7 +5129,7 @@ func file_map_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: unsafe.Slice(unsafe.StringData(file_map_proto_rawDesc), len(file_map_proto_rawDesc)),
 			NumEnums:      0,
-			NumMessages:   54,
+			NumMessages:   56,
 			NumExtensions: 0,
 			NumServices:   0,
 		},

+ 5 - 1
sr/internal/types/currency_map.go

@@ -156,8 +156,12 @@ func (p CurrencyMap) Check(maxNum int64, itemList []int32) bool {
 }
 
 func (p CurrencyMap) CheckAdd(id int32, num, maxNum int64) bool {
+	if id <= 0 {
+		return false
+	}
+
 	if c, found := p[id]; found {
-		if c.MaxNum < maxNum {
+		if c.MaxNum != maxNum {
 			if p.IsFull(id) {
 				c.UpdateTime = ctime.Now().ToSecond()
 			}

+ 1 - 1
sr/nodes/game/internal/db/data/lineup/lineups.go

@@ -67,7 +67,7 @@ func (p LineupMap) RemoveHeroClearLineup(removeHeroGUIDs ...int64) map[int32][]i
 
 	for lineupType, lineups := range p {
 		for _, lineup := range lineups {
-			if ok := lineup.RemoveHeroClearLineup(removeHeroGUIDs...); ok {
+			if lineup.RemoveHeroClearLineup(removeHeroGUIDs...) {
 				updateLineupMap[lineupType] = append(updateLineupMap[lineupType], lineup.LineupID)
 			}
 		}

+ 17 - 6
sr/nodes/game/internal/db/data/player/stats.go

@@ -1,6 +1,8 @@
 package dbPlayer
 
 import (
+	"f1-game/internal/data"
+
 	ctime "github.com/cherry-game/cherry/extend/time"
 )
 
@@ -50,10 +52,14 @@ func (p *Stats) CheckReset(now *ctime.CherryTime) {
 
 // CalcDailyReset 是否可每日重置
 func (p *Stats) calcDayReset(now *ctime.CherryTime) {
-	startDayTime := now.StartOfDay().UnixMilli() //本日开始的时间(秒)
-	if p.LastDayResetTime <= 0 || p.LastDayResetTime < startDayTime {
+	var (
+		resetHourTime = int64(data.Const.ResetTime * ctime.MillisecondsPerHour)
+		startDayTime  = now.StartOfDay().UnixMilli() + resetHourTime //本日开始的时间(毫秒)
+	)
+
+	if p.LastDayResetTime <= 0 || p.LastDayResetTime != startDayTime {
 		p.IsDayReset = true
-		p.LastDayResetTime = now.ToMillisecond()
+		p.LastDayResetTime = startDayTime
 	} else {
 		p.IsDayReset = false
 	}
@@ -61,10 +67,15 @@ func (p *Stats) calcDayReset(now *ctime.CherryTime) {
 
 // CalcWeeklyReset 是否可每周重置
 func (p *Stats) calcWeekReset(now *ctime.CherryTime) {
-	startWeekTime := now.StartOfWeek().UnixMilli() //本周开始的时间(秒)
-	if p.LastWeekResetTime <= 0 || p.LastWeekResetTime < startWeekTime {
+	var (
+		// 重置时间 = 当前0点时间戳 + 重置时间(小时) * 1小时(毫秒)
+		resetHourTime = int64(data.Const.ResetTime * ctime.MillisecondsPerHour)
+		startWeekTime = now.StartOfWeek().UnixMilli() + resetHourTime //本周开始的时间(毫秒)
+	)
+
+	if p.LastWeekResetTime <= 0 || p.LastWeekResetTime != startWeekTime {
 		p.IsWeekReset = true
-		p.LastWeekResetTime = now.ToMillisecond()
+		p.LastWeekResetTime = startWeekTime
 	} else {
 		p.IsWeekReset = false
 	}

+ 1 - 1
sr/nodes/game/internal/db/data/quest/quest.go

@@ -147,7 +147,7 @@ func (p *Quests) DeleteQuestWithQuestList(questIDs []int32) bool {
 
 	isDelete := false
 	for _, questID := range questIDs {
-		if ok := p.DeleteQuest(questID); ok {
+		if p.DeleteQuest(questID) {
 			isDelete = true
 		}
 	}

+ 9 - 8
sr/nodes/game/internal/facade/define.go

@@ -11,14 +11,15 @@ import (
 var (
 	// Currency currency // 货币
 	// Item     item     // 道具
-	Asset  asset  // 资产
-	Hero   hero   // 英雄
-	Lord   lord   // 领主
-	Equip  equip  // 装备
-	Chat   chat   // 聊天
-	Lineup lineup // 部队
-	Vip    vip    // 会员
-	Charge charge // 充值
+	Asset   asset   // 资产
+	Hero    hero    // 英雄
+	Lord    lord    // 领主
+	Equip   equip   // 装备
+	Chat    chat    // 聊天
+	Lineup  lineup  // 部队
+	Vip     vip     // 会员
+	Charge  charge  // 充值
+	Chapter chapter // 探险
 )
 var (
 	playerServiceList []facade.IPlayerService[*db.PlayerTable]

+ 6 - 0
sr/nodes/game/internal/facade/facade.go

@@ -74,3 +74,9 @@ type charge interface {
 	facade.IPlayerService[*db.PlayerTable]
 	ChargePush(playerID int64)
 }
+
+type chapter interface {
+	facade.IPlayerService[*db.PlayerTable]
+	GetStaminaLimit(playerID int64) int64
+	GetStaminaPoolLimit(playerID int64) int64
+}

+ 1 - 0
sr/nodes/game/internal/facade/init/init.go

@@ -38,6 +38,7 @@ func onLoad() {
 	gameFacade.Lineup = lineup.Service()
 	gameFacade.Vip = vip.Service()
 	gameFacade.Charge = charge.Service()
+	gameFacade.Chapter = chapter.Service()
 }
 
 func onRegister() {

+ 1 - 1
sr/nodes/game/order/actor_deliver.go

@@ -36,7 +36,7 @@ func (p *actorDeliver) deliver(table *db.OrderTable) {
 		return
 	}
 
-	if ok := p.chargeDeliver(table); !ok {
+	if !p.chargeDeliver(table) {
 		return
 	}
 

+ 2 - 2
sr/nodes/game/player/actor.go

@@ -8,7 +8,6 @@ import (
 	"time"
 
 	cstring "github.com/cherry-game/cherry/extend/string"
-	ctime "github.com/cherry-game/cherry/extend/time"
 	cfacade "github.com/cherry-game/cherry/facade"
 	clog "github.com/cherry-game/cherry/logger"
 	cactor "github.com/cherry-game/cherry/net/actor"
@@ -93,7 +92,8 @@ func (p *actor) OnFindChild(m *cfacade.Message) (cfacade.IActor, bool) {
 // cleanChildTimer 定期清理actorPlayer
 func (p *actor) cleanChildTimer() {
 	// 玩家已下线,并且超过childExitTime时间没有收发消息,则退出actor
-	deadline := ctime.Now().Add(-p.cleanChildTime).Unix()
+	//deadline := ctime.Now().Add(-p.cleanChildTime).Unix()
+	deadline := time.Now().Add(-p.cleanChildTime).Unix()
 
 	p.Child().Each(func(iActor cfacade.IActor) {
 		if iActor.LastAt() < deadline {

+ 41 - 8
sr/nodes/game/player/currency/service.go

@@ -11,6 +11,8 @@ import (
 	"f1-game/internal/types"
 	"f1-game/nodes/game/internal/db"
 	ao "f1-game/nodes/game/player/asset/origin"
+
+	cproto "github.com/cherry-game/cherry/net/proto"
 )
 
 var (
@@ -18,10 +20,9 @@ var (
 )
 
 func newService() *service {
-	instance := &service{}
-	instance.load()
-
-	return instance
+	return &service{
+		typ: newServiceType(),
+	}
 }
 
 func Service() *service {
@@ -29,15 +30,15 @@ func Service() *service {
 }
 
 type service struct {
+	typ serviceType // 资源上限
 	facade.PlayerServiceBase[*db.PlayerTable]
 }
 
-func (p *service) load() {
+func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) {
+	// 登录检测货币上限
+	p.RefreshCurrencyMax(playerTable.PlayerID, false, p.typ.getAssetIDs()...)
 }
 
-// func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session) {
-// }
-
 // func (p *service) OnLogined(playerTable *db.PlayerTable, session *cproto.Session) {
 // }
 
@@ -175,3 +176,35 @@ func (p *service) Sub(playerID int64, id int32, num int64, origin ao.Origin, sav
 
 	return code.OK
 }
+
+// 刷新货币上限值
+func (p *service) RefreshCurrencyMax(playerID int64, changePush bool, assetIDs ...int32) {
+	if len(assetIDs) <= 0 {
+		return
+	}
+
+	var (
+		itemTable    = db.GetItemTable(playerID)
+		changeIDList = []int32{}
+	)
+
+	for _, assetID := range assetIDs {
+		parser, errCode := p.typ.get(assetID)
+		if code.IsFail(errCode) {
+			continue
+		}
+
+		if parser.CheckAndRefreshCurrencyMax(itemTable) {
+			changeIDList = append(changeIDList, assetID)
+		}
+	}
+
+	if len(changeIDList) > 0 {
+		itemTable.Save2Queue()
+
+		if changePush {
+			// 推送通知客户端
+			p.ChangePush(playerID, changeIDList...)
+		}
+	}
+}

+ 53 - 0
sr/nodes/game/player/currency/service_type.go

@@ -0,0 +1,53 @@
+package currency
+
+import (
+	"f1-game/internal/code"
+	"f1-game/nodes/game/internal/db"
+	currencyType "f1-game/nodes/game/player/currency/type"
+)
+
+type (
+	// TypeParser 货币上限刷新
+	typeParser interface {
+		// Type 资源类型
+		AssetID() int32
+		// Add 添加一个资源
+		CheckAndRefreshCurrencyMax(itemTable *db.ItemTable) bool
+	}
+
+	serviceType map[int32]typeParser
+)
+
+func newServiceType() serviceType {
+	instance := serviceType{}
+	instance.load()
+
+	return instance
+}
+
+func (p serviceType) register(typeParser typeParser) {
+	p[typeParser.AssetID()] = typeParser
+}
+
+func (p serviceType) get(currencyID int32) (typeParser, int32) {
+	parser, found := p[currencyID]
+	if !found {
+		return nil, code.ConfigNotFound_Item
+	}
+	return parser, code.OK
+}
+
+func (p serviceType) getAssetIDs() []int32 {
+	ret := make([]int32, 0, len(p))
+
+	for _, v := range p {
+		ret = append(ret, v.AssetID())
+	}
+
+	return ret
+}
+
+func (p serviceType) load() {
+	p.register(currencyType.NewStamina())
+	p.register(currencyType.NewTempStamina())
+}

+ 16 - 0
sr/nodes/game/player/currency/type/base.go

@@ -0,0 +1,16 @@
+package currencyType
+
+import (
+	"f1-game/nodes/game/internal/db"
+)
+
+type base struct {
+}
+
+func (p base) AssetID() int32 {
+	return 0
+}
+
+func (p base) CheckAndRefreshCurrencyMax(itemTable *db.ItemTable) bool {
+	return false
+}

+ 24 - 0
sr/nodes/game/player/currency/type/stamina.go

@@ -0,0 +1,24 @@
+package currencyType
+
+import (
+	"f1-game/internal/enum"
+	"f1-game/nodes/game/internal/db"
+	gameFacade "f1-game/nodes/game/internal/facade"
+)
+
+type Stamina struct {
+	base
+}
+
+func NewStamina() *Stamina {
+	return &Stamina{}
+}
+
+func (p *Stamina) AssetID() int32 {
+	return enum.ItemIDStamina
+}
+
+func (p *Stamina) CheckAndRefreshCurrencyMax(itemTable *db.ItemTable) bool {
+	staminaLimit := gameFacade.Chapter.GetStaminaLimit(itemTable.PlayerID)
+	return itemTable.CurrencyMap.CheckAdd(p.AssetID(), 0, staminaLimit)
+}

+ 24 - 0
sr/nodes/game/player/currency/type/temp_stamina.go

@@ -0,0 +1,24 @@
+package currencyType
+
+import (
+	"f1-game/internal/enum"
+	"f1-game/nodes/game/internal/db"
+	gameFacade "f1-game/nodes/game/internal/facade"
+)
+
+type TempStamina struct {
+	base
+}
+
+func NewTempStamina() *TempStamina {
+	return &TempStamina{}
+}
+
+func (p *TempStamina) AssetID() int32 {
+	return enum.ItemIDTempStamina
+}
+
+func (p *TempStamina) CheckAndRefreshCurrencyMax(itemTable *db.ItemTable) bool {
+	staminaPoolLimit := gameFacade.Chapter.GetStaminaPoolLimit(itemTable.PlayerID)
+	return itemTable.CurrencyMap.CheckAdd(p.AssetID(), 0, staminaPoolLimit)
+}

+ 0 - 25
sr/nodes/game/player/gm/service.go

@@ -6,10 +6,8 @@ import (
 	gameFacade "f1-game/nodes/game/internal/facade"
 	ao "f1-game/nodes/game/player/asset/origin"
 	"strings"
-	"time"
 
 	cstring "github.com/cherry-game/cherry/extend/string"
-	ctime "github.com/cherry-game/cherry/extend/time"
 	clog "github.com/cherry-game/cherry/logger"
 	cprofile "github.com/cherry-game/cherry/profile"
 )
@@ -33,29 +31,6 @@ func (*service) AddAssets(playerID int64, itemID int32, itemNum int64) int32 {
 	return statusCode
 }
 
-func (*service) TimeOffset(offset int64) {
-	if offset == 0 {
-		return
-	}
-
-	timeOffsetLimit := int64(ctime.SecondsPerDay)
-	clog.Debugf("Current time: %v", ctime.Now())
-
-	if offset > timeOffsetLimit {
-		offset = timeOffsetLimit
-	} else if offset < -timeOffsetLimit {
-		offset = -timeOffsetLimit
-	}
-
-	if offset > 0 {
-		ctime.AddOffsetTime(time.Duration(offset) * time.Second)
-	} else {
-		ctime.SubOffsetTime(time.Duration(-offset) * time.Second)
-	}
-
-	clog.Debugf("After offset time: %v", ctime.Now())
-}
-
 // 执行gm指令
 func (p *service) SendGM(playerID int64, gm string) int32 {
 	// 判断是否是debug模式 如果不是直接返回

+ 61 - 33
sr/nodes/game/player/gm/type/gm_time.go

@@ -1,11 +1,18 @@
 package gm
 
 import (
+	capp "f1-game/internal/cherry_app"
 	"f1-game/internal/code"
+	nameActor "f1-game/internal/name/actor"
+	nameRemote "f1-game/internal/name/remote"
+	"f1-game/internal/pb"
+	"f1-game/internal/sessions"
+	"f1-game/nodes/game/internal/db"
 	"time"
 
-	cherryString "github.com/cherry-game/cherry/extend/string"
+	cstring "github.com/cherry-game/cherry/extend/string"
 	ctime "github.com/cherry-game/cherry/extend/time"
+	cfacade "github.com/cherry-game/cherry/facade"
 	clog "github.com/cherry-game/cherry/logger"
 )
 
@@ -45,7 +52,7 @@ func (p *TimeGm) Handle(playerID int64, params []string) int32 {
 	return errCode
 }
 
-func (p *TimeGm) setDate(_ int64, params []string) int32 {
+func (p *TimeGm) setDate(playerID int64, params []string) int32 {
 	// 获取当前设置的时间
 	timeStr := "00:00:00"
 	if len(params) > 4 {
@@ -54,7 +61,7 @@ func (p *TimeGm) setDate(_ int64, params []string) int32 {
 
 	dateStr := params[3] + " " + timeStr
 	// 解析为时间对象
-	tt, err := time.Parse("2006-01-02 15:04:05", dateStr)
+	tt, err := time.ParseInLocation("2006-01-02 15:04:05", dateStr, time.Local)
 	if err != nil {
 		clog.Errorf("gm time set date error. dateStr = %s, err = %v", dateStr, err)
 		return code.RequestParamsError
@@ -62,14 +69,15 @@ func (p *TimeGm) setDate(_ int64, params []string) int32 {
 
 	// 计算与真实时间的偏移量
 	offset := tt.Unix() - time.Now().Unix()
+	clog.Warnf("update date tt:%d, time:%d", tt.Unix(), time.Now().Unix())
 
 	// 设置时间偏移量
-	p.timeOffset(offset)
+	p.timeOffset(playerID, offset)
 
 	return code.OK
 }
 
-func (p *TimeGm) setTime(_ int64, params []string) int32 {
+func (p *TimeGm) setTime(playerID int64, params []string) int32 {
 	if len(params) < 4 {
 		return code.RequestParamsError
 	}
@@ -87,54 +95,74 @@ func (p *TimeGm) setTime(_ int64, params []string) int32 {
 	// 计算设置时间与真实时间的偏移量
 	offset := newTime.Unix() - time.Now().Unix()
 
-	p.timeOffset(offset)
-
-	return code.OK
+	return p.timeOffset(playerID, offset)
 }
 
 // /gm time offset 150
-func (p *TimeGm) setOffset(_ int64, params []string) int32 {
-	offestValue, ok := cherryString.ToInt64(params[3])
+func (p *TimeGm) setOffset(playerID int64, params []string) int32 {
+	offestValue, ok := cstring.ToInt64(params[3])
 	if !ok {
 		return code.RequestParamsError
 	}
 
-	p.timeOffset(offestValue)
-
-	return code.OK
+	return p.timeOffset(playerID, offestValue)
 }
 
 // /gm time reset
-func (p *TimeGm) resetOffset(_ int64, _ []string) int32 {
-	p.timeOffset(0)
-
-	return code.OK
+func (p *TimeGm) resetOffset(playerID int64, _ []string) int32 {
+	return p.timeOffset(playerID, 0)
 }
 
 // 测试方法暂时不做处理 后面把下面的Final去掉即可
-func (*TimeGm) timeOffset(offset int64) {
-
+func (*TimeGm) timeOffsetOld(offset int64) int32 {
+	return code.OK
 }
 
-func (*TimeGm) timeOffsetFinal(offset int64) {
-	if offset == 0 {
-		return
+func (*TimeGm) timeOffset(playerID, offset int64) int32 {
+	playerTable, found := db.GetPlayerTable(playerID)
+	if !found {
+		return code.PlayerNotFound
+	}
+
+	mapNodeID := playerTable.Map.MapNodeID
+	if len(mapNodeID) <= 0 {
+		return code.NodeMapNodeIDIsEmpty
 	}
 
-	timeOffsetLimit := int64(ctime.SecondsPerDay)
-	clog.Debugf("Current time: %v", ctime.Now())
+	session, found := sessions.GetSession(playerID)
+	if !found {
+		return code.PlayerNotLogin
+	}
 
-	if offset > timeOffsetLimit {
-		offset = timeOffsetLimit
-	} else if offset < -timeOffsetLimit {
-		offset = -timeOffsetLimit
+	// 通知map节点更新时间偏移
+	target := cfacade.NewChildPath(mapNodeID, nameActor.Map_Player, playerID)
+	errCode := capp.CallWait(target, nameRemote.Game_UpdateTimeOffset, &pb.I64{
+		Value: offset,
+	}, nil)
+	if code.IsFail(errCode) {
+		clog.Warnf("[timeOffset] map update time offset fail, playerID=%d, errCode = %d", playerID, errCode)
+		return errCode
 	}
 
-	if offset > 0 {
-		ctime.AddOffsetTime(time.Duration(offset) * time.Second)
-	} else {
-		ctime.SubOffsetTime(time.Duration(-offset) * time.Second)
+	// 更新网关时间便宜
+	errCode = capp.CallWait(session.ActorPath(), nameRemote.Game_UpdateTimeOffset, &pb.I64{
+		Value: offset,
+	}, nil)
+	if code.IsFail(errCode) {
+		// 重置地图的时间偏移
+		target := cfacade.NewChildPath(mapNodeID, nameActor.Map_Player, playerID)
+		returnErrCode := capp.CallWait(target, nameRemote.Game_UpdateTimeOffset, &pb.I64{
+			Value: ctime.Now().ToSecond() - time.Now().Unix(),
+		}, nil)
+
+		clog.Warnf("[timeOffset] gate update time offset fail, playerID=%d, errCode = %d, returnErrCode = %d", playerID, errCode, returnErrCode)
+		return errCode
 	}
 
-	clog.Debugf("After offset time: %v", ctime.Now())
+	// 更新本地时间偏移
+	ctime.AddOffsetTime(time.Duration(offset) * time.Second)
+
+	clog.Warnf("[timeOffset] playerID=%d, offset = %d, time = %d", playerID, offset, ctime.Now().ToSecond())
+
+	return code.OK
 }

+ 1 - 1
sr/nodes/game/player/lineup/service.go

@@ -30,7 +30,7 @@ func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session)
 	lineupTable := db.GetLineupTable(playerTable.PlayerID)
 
 	// 检测阵容队伍变化 // TODO 暂时默认一个队伍
-	if success := lineupTable.LineupMap.AddLineups(constant.Adventure_Type, 1); success {
+	if lineupTable.LineupMap.AddLineups(constant.Adventure_Type, 1) {
 		lineupTable.Save2Queue()
 	}
 }

+ 1 - 1
sr/nodes/game/player/main_quest/service.go

@@ -32,7 +32,7 @@ func (p *service) OnLogin(playerTable *db.PlayerTable, session *cproto.Session)
 
 		first := list[0]
 		// 添加任务组
-		if success := quest.Service().TriggerOpenGroup(playerTable.PlayerID, first.QuestGroupID); success {
+		if quest.Service().TriggerOpenGroup(playerTable.PlayerID, first.QuestGroupID) {
 			playerTable.MainQuest.MainChapterID = first.ChapterID
 			playerTable.MainQuest.IsMainReward = false
 

+ 13 - 0
sr/nodes/game/player/player_asset.go

@@ -2,17 +2,25 @@ package player
 
 import (
 	"f1-game/internal/code"
+	"f1-game/internal/enum"
+	nameEvent "f1-game/internal/name/event"
 	nameRemote "f1-game/internal/name/remote"
 	"f1-game/internal/pb"
 	"f1-game/internal/types"
 	"f1-game/nodes/game/player/asset"
 	assetOrigin "f1-game/nodes/game/player/asset/origin"
+	"f1-game/nodes/game/player/currency"
+
+	cfacade "github.com/cherry-game/cherry/facade"
 )
 
 func (p *actorPlayer) initAsset() {
 	p.Remote().Register(nameRemote.Player_AssetAdd, p.assetAdd)
 	p.Remote().Register(nameRemote.Player_AssetSub, p.assetSub)
 	p.Remote().Register(nameRemote.Player_AssetCheck, p.assetCheck)
+
+	p.EventRegister(nameEvent.Vip_LevelUp, p.refreshItemLimit)
+	p.EventRegister(nameEvent.Vip_Status, p.refreshItemLimit)
 }
 
 // assetAdd 添加资产
@@ -55,3 +63,8 @@ func (p *actorPlayer) assetCheck(req *pb.AssetList) int32 {
 	assets.FillProto(req.List)
 	return asset.Service().IsAllEnough(p.playerID, assets)
 }
+
+// 刷新货币上限
+func (p *actorPlayer) refreshItemLimit(e cfacade.IEventData) {
+	currency.Service().RefreshCurrencyMax(p.playerID, true, enum.GameItemMaxNumList...)
+}

+ 0 - 13
sr/nodes/game/player/player_gm.go

@@ -2,33 +2,20 @@ package player
 
 import (
 	"f1-game/internal/code"
-	"f1-game/internal/data"
 	"f1-game/internal/enum"
 	nameRemote "f1-game/internal/name/remote"
 	"f1-game/internal/pb"
 	"f1-game/nodes/game/player/asset"
 	"f1-game/nodes/game/player/gm"
 	"strings"
-
-	cprofile "github.com/cherry-game/cherry/profile"
 )
 
 func (p *actorPlayer) initGM() {
-	p.Remote().Register(nameRemote.Player_GMTimeOffset, p.gmTimeOffset)
 	p.Remote().Register(nameRemote.Player_SendGM, p.sendGM)
 
 	p.Remote().Register(nameRemote.Player_GetInfo, p.getPlayerInfo)
 }
 
-// gmTimeOffset 设置时间偏移
-func (p *actorPlayer) gmTimeOffset(req *pb.I64) {
-	if !cprofile.Debug() || !data.NodeState.GmEnable {
-		return
-	}
-
-	gm.Service().TimeOffset(req.Value)
-}
-
 // gm操作
 func (p *actorPlayer) sendGM(req *pb.Str) int32 {
 	gmStr := req.Value

+ 5 - 4
sr/nodes/game/player/player_lord.go

@@ -42,12 +42,13 @@ func (p *actorPlayer) initLord() {
 
 // 获取领主信息
 func (p *actorPlayer) lordInfo(session *cproto.Session, req *pb.I64) {
-	if req.Value < 1 {
+	targetPlayerID := req.Value
+	if targetPlayerID < 1 {
 		p.ResponseCode(session, code.IllegalArgument)
 		return
 	}
 
-	playerData := redis.Game.GetPlayerData(req.Value, nameRedis.PlayerDetailFields...)
+	playerData := redis.Game.GetPlayerData(targetPlayerID, nameRedis.PlayerDetailFields...)
 	if playerData == nil {
 		p.ResponseCode(session, code.PlayerDetailNotFound)
 		return
@@ -73,7 +74,7 @@ func (p *actorPlayer) lordInfo(session *cproto.Session, req *pb.I64) {
 	}
 
 	// 玩家数据展示
-	showDatas := redis.Game.GetPlayerSetting(p.playerID)
+	showDatas := redis.Game.GetPlayerSetting(targetPlayerID)
 	if showDatas != nil {
 		rsp.ShowDatas = showDatas
 	}
@@ -104,7 +105,7 @@ func (p *actorPlayer) lordChangeName(session *cproto.Session, req *pb.Str) {
 	}
 
 	// 长度不符
-	if ok := data.Const.CheckPlayerNameLen(newPlayerName); !ok {
+	if !data.Const.CheckPlayerNameLen(newPlayerName) {
 		p.ResponseCode(session, code.PlayerNameLimit)
 		return
 	}

+ 1 - 1
sr/nodes/game/player/player_minigame.go

@@ -94,7 +94,7 @@ func (p *actorPlayer) miniGameSettle(session *cproto.Session, req *pb.I64I64I32)
 		LevelID: playerTable.MiniGame.LevelId,
 	}
 	if !nextLevelRow.Reward.IsEmpty() {
-		_, errCode := asset.Service().Adds(p.playerID, nextLevelRow.Reward, ao.MiniGameReward, false)
+		_, errCode := asset.Service().Adds(p.playerID, nextLevelRow.Reward, ao.MiniGameReward, true)
 		if code.IsFail(errCode) {
 			p.ResponseCode(session, errCode)
 			return

Some files were not shown because too many files changed in this diff