slg-mcp 0.1.7 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": 71,
2
+ "version": 80,
3
3
  "title": "SLG Agent API 参考",
4
4
  "compatPolicy": [
5
5
  "只加不改:已发布的协议号、字段与错误码只新增、不删除、不改变类型与语义。",
@@ -317,6 +317,11 @@
317
317
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
318
318
  "name": "主城",
319
319
  "level": 1,
320
+ "title": "城池",
321
+ "nobility": {
322
+ "index": 0,
323
+ "name": "平民"
324
+ },
320
325
  "resources": {
321
326
  "gold": 2000,
322
327
  "wood": 2000,
@@ -607,6 +612,7 @@
607
612
  "durability": null,
608
613
  "famousName": null,
609
614
  "productionBonusPercent": 0,
615
+ "luoyangBonusPercent": 0,
610
616
  "famousEffect": null,
611
617
  "starveAt": null,
612
618
  "mutinyNextAt": null,
@@ -622,9 +628,33 @@
622
628
  "marching": 0,
623
629
  "storage": 0,
624
630
  "scouting": 0,
625
- "defense": 0
631
+ "defense": 0,
632
+ "drill": 0,
633
+ "combat": 0,
634
+ "protection": 0,
635
+ "riding": 0,
636
+ "archery": 0,
637
+ "supply": 0,
638
+ "construction": 0,
639
+ "research": 0,
640
+ "looting": 0,
641
+ "repair": 0
626
642
  },
627
643
  "recruitQueue": [],
644
+ "defenses": {
645
+ "cap": 0,
646
+ "stock": {
647
+ "trap": 0,
648
+ "chevaux": 0,
649
+ "rolling_log": 0,
650
+ "boulder": 0
651
+ },
652
+ "total": 0,
653
+ "queue": []
654
+ },
655
+ "assistIn": [],
656
+ "assistOut": [],
657
+ "assistCap": 5,
628
658
  "defenseBonus": 0,
629
659
  "marches": [],
630
660
  "territory": [],
@@ -764,7 +794,7 @@
764
794
  "role": "player",
765
795
  "sessionToken": "session-example-token-for-doc-0000000000000",
766
796
  "expiresAt": "2026-10-25T08:00:00.000Z",
767
- "protocolVersion": 71,
797
+ "protocolVersion": 80,
768
798
  "docNotice": null,
769
799
  "season": {
770
800
  "id": 2,
@@ -813,7 +843,7 @@
813
843
  "role": "player",
814
844
  "sessionToken": "session-example-token-for-doc-0000000000000",
815
845
  "expiresAt": "2026-10-25T08:00:00.000Z",
816
- "protocolVersion": 71,
846
+ "protocolVersion": 80,
817
847
  "docNotice": null,
818
848
  "season": {
819
849
  "id": 2,
@@ -833,14 +863,14 @@
833
863
  ]
834
864
  },
835
865
  {
836
- "caption": "Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/68 补读增量)",
866
+ "caption": "Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/77 补读增量)",
837
867
  "request": {
838
868
  "op": 1,
839
869
  "seq": 1,
840
870
  "data": {
841
871
  "token": "session-example-token-for-doc-0000000000000",
842
872
  "asAgent": true,
843
- "docVersion": 68,
873
+ "docVersion": 77,
844
874
  "agentModel": "claude-opus-5-5"
845
875
  }
846
876
  },
@@ -855,8 +885,8 @@
855
885
  "role": "agent",
856
886
  "sessionToken": "session-example-token-for-doc-0000000000000",
857
887
  "expiresAt": null,
858
- "protocolVersion": 71,
859
- "docNotice": "接口文档已从 v68 更新到 v71:请 GET /agent-api/changes/68 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。",
888
+ "protocolVersion": 80,
889
+ "docNotice": "接口文档已从 v77 更新到 v80:请 GET /agent-api/changes/77 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。",
860
890
  "season": {
861
891
  "id": 2,
862
892
  "endsAt": "2026-11-22T00:00:00.000Z"
@@ -972,6 +1002,16 @@
972
1002
  "type": "number",
973
1003
  "desc": "城池等级(v7 新增;v24 起 = 该城官府等级 levels.government,不另设升级系统;此前恒为 1)。官府升级,城池等级跟着升。"
974
1004
  },
1005
+ {
1006
+ "name": "city.title",
1007
+ "type": "string",
1008
+ "desc": "城池称号(v76,AISLG-197):按官府等级 1–4 城池 / 5–9 县城 / 10–14 郡城 / 15–19 州城 / 20+ 都城;都城只给主城,分城最高州城。无数值加成。"
1009
+ },
1010
+ {
1011
+ "name": "city.nobility",
1012
+ "type": "object",
1013
+ "desc": "账号爵位(v76,AISLG-197):{ index(0 = 平民,索引见 GET_NOBILITY), name }。"
1014
+ },
975
1015
  {
976
1016
  "name": "city.resources.gold",
977
1017
  "type": "number",
@@ -1098,7 +1138,7 @@
1098
1138
  "desc": "分城城防值(v40,AISLG-124):0..100,被「占领」打赢一击 −35(冲车加成最多再 −15)、归零一击换主;免战结束后每小时回涨 10 至满(免战内不回涨)。主城为 null(永不被占领)。"
1099
1139
  },
1100
1140
  {
1101
- "name": "city.famousName / city.productionBonusPercent",
1141
+ "name": "city.luoyangBonusPercent(v79 洛阳之主联盟 +5%,已计入 production)/ city.famousName / city.productionBonusPercent",
1102
1142
  "type": "string | null / number",
1103
1143
  "desc": "名城分城标记(v24 新增,AISLG-56):占领名城得到的分城带名城名(famousName)与独占产量加成百分数(productionBonusPercent,当前 20,已计入 production);普通城为 null / 0。v64(AISLG-168):占领名城的分城可征募该名城的专属兵(名城 → 兵种对照见 RECRUIT 的 summary),失守即失去征募资格。"
1104
1144
  },
@@ -1117,6 +1157,26 @@
1117
1157
  "type": "array",
1118
1158
  "desc": "征兵队列(v11 新增):第 1 项为征募中(status=recruiting,dueAt 非空),其余为排队(status=queued,dueAt 为 null);已取消条目不在其中。"
1119
1159
  },
1160
+ {
1161
+ "name": "city.assistIn",
1162
+ "type": "array",
1163
+ "desc": "(v74,AISLG-194)驻扎在本城的盟友协防部队:{ id, accountId, username, fromCityId, fromCityName, troops(全兵种计数), arrivedAt, initiator }。城主与盟友可见;外人侦察时只计入守军总数。"
1164
+ },
1165
+ {
1166
+ "name": "city.assistOut",
1167
+ "type": "array",
1168
+ "desc": "(v74)本城派出、正在盟友城里驻扎的协防部队:{ id, hostCityId, hostCityName, hostUsername, troops, arrivedAt }。占校场出征名额,可用 DISMISS_ASSIST 召回。"
1169
+ },
1170
+ {
1171
+ "name": "city.assistCap",
1172
+ "type": "number",
1173
+ "desc": "(v74)本城可接收的协防部队上限(当前 5 支;洛阳 10 支留待洛阳争夺需求)。"
1174
+ },
1175
+ {
1176
+ "name": "city.defenses",
1177
+ "type": "object",
1178
+ "desc": "城防器械(v73,AISLG-193):{ cap 库存上限(城墙等级 × 60), stock 四种器械已入库件数(trap / chevaux / rolling_log / boulder,恒含四个键), total 合计, queue 打造队列(第 1 项 status=crafting、其余 queued;条目结构同 CRAFT_DEFENSE 的 craft) }。守城战开打时按需自动消耗,战报的 defenses 字段给出用量与杀伤。"
1179
+ },
1120
1180
  {
1121
1181
  "name": "city.defenseBonus",
1122
1182
  "type": "number",
@@ -1135,7 +1195,7 @@
1135
1195
  {
1136
1196
  "name": "cities",
1137
1197
  "type": "array",
1138
- "desc": "v12 新增:账号全部城池 { id, name, level, x, y, isMain },主城在前;v24 起 level = 各城官府等级。未占领 NPC 城池时只有主城一座。"
1198
+ "desc": "v12 新增:账号全部城池 { id, name, level, x, y, isMain, title 城池称号, nobility 爵位 },主城在前;v24 起 level = 各城官府等级。未占领 NPC 城池时只有主城一座。"
1139
1199
  },
1140
1200
  {
1141
1201
  "name": "branch",
@@ -1186,6 +1246,11 @@
1186
1246
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
1187
1247
  "name": "主城",
1188
1248
  "level": 1,
1249
+ "title": "城池",
1250
+ "nobility": {
1251
+ "index": 0,
1252
+ "name": "平民"
1253
+ },
1189
1254
  "resources": {
1190
1255
  "gold": 2000,
1191
1256
  "wood": 2000,
@@ -1476,6 +1541,7 @@
1476
1541
  "durability": null,
1477
1542
  "famousName": null,
1478
1543
  "productionBonusPercent": 0,
1544
+ "luoyangBonusPercent": 0,
1479
1545
  "famousEffect": null,
1480
1546
  "starveAt": null,
1481
1547
  "mutinyNextAt": null,
@@ -1491,9 +1557,33 @@
1491
1557
  "marching": 0,
1492
1558
  "storage": 0,
1493
1559
  "scouting": 0,
1494
- "defense": 0
1560
+ "defense": 0,
1561
+ "drill": 0,
1562
+ "combat": 0,
1563
+ "protection": 0,
1564
+ "riding": 0,
1565
+ "archery": 0,
1566
+ "supply": 0,
1567
+ "construction": 0,
1568
+ "research": 0,
1569
+ "looting": 0,
1570
+ "repair": 0
1495
1571
  },
1496
1572
  "recruitQueue": [],
1573
+ "defenses": {
1574
+ "cap": 0,
1575
+ "stock": {
1576
+ "trap": 0,
1577
+ "chevaux": 0,
1578
+ "rolling_log": 0,
1579
+ "boulder": 0
1580
+ },
1581
+ "total": 0,
1582
+ "queue": []
1583
+ },
1584
+ "assistIn": [],
1585
+ "assistOut": [],
1586
+ "assistCap": 5,
1497
1587
  "defenseBonus": 0,
1498
1588
  "marches": [],
1499
1589
  "territory": [],
@@ -1520,6 +1610,11 @@
1520
1610
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
1521
1611
  "name": "主城",
1522
1612
  "level": 1,
1613
+ "title": "城池",
1614
+ "nobility": {
1615
+ "index": 0,
1616
+ "name": "平民"
1617
+ },
1523
1618
  "resources": {
1524
1619
  "gold": 1900,
1525
1620
  "wood": 1950,
@@ -1810,6 +1905,7 @@
1810
1905
  "durability": null,
1811
1906
  "famousName": null,
1812
1907
  "productionBonusPercent": 0,
1908
+ "luoyangBonusPercent": 0,
1813
1909
  "famousEffect": null,
1814
1910
  "starveAt": null,
1815
1911
  "mutinyNextAt": null,
@@ -1825,9 +1921,33 @@
1825
1921
  "marching": 0,
1826
1922
  "storage": 0,
1827
1923
  "scouting": 0,
1828
- "defense": 0
1924
+ "defense": 0,
1925
+ "drill": 0,
1926
+ "combat": 0,
1927
+ "protection": 0,
1928
+ "riding": 0,
1929
+ "archery": 0,
1930
+ "supply": 0,
1931
+ "construction": 0,
1932
+ "research": 0,
1933
+ "looting": 0,
1934
+ "repair": 0
1829
1935
  },
1830
1936
  "recruitQueue": [],
1937
+ "defenses": {
1938
+ "cap": 0,
1939
+ "stock": {
1940
+ "trap": 0,
1941
+ "chevaux": 0,
1942
+ "rolling_log": 0,
1943
+ "boulder": 0
1944
+ },
1945
+ "total": 0,
1946
+ "queue": []
1947
+ },
1948
+ "assistIn": [],
1949
+ "assistOut": [],
1950
+ "assistCap": 5,
1831
1951
  "defenseBonus": 0,
1832
1952
  "marches": [],
1833
1953
  "territory": [],
@@ -1890,6 +2010,11 @@
1890
2010
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
1891
2011
  "name": "主城",
1892
2012
  "level": 1,
2013
+ "title": "城池",
2014
+ "nobility": {
2015
+ "index": 0,
2016
+ "name": "平民"
2017
+ },
1893
2018
  "resources": {
1894
2019
  "gold": 1900,
1895
2020
  "wood": 1950,
@@ -2180,6 +2305,7 @@
2180
2305
  "durability": null,
2181
2306
  "famousName": null,
2182
2307
  "productionBonusPercent": 0,
2308
+ "luoyangBonusPercent": 0,
2183
2309
  "famousEffect": null,
2184
2310
  "starveAt": null,
2185
2311
  "mutinyNextAt": null,
@@ -2195,9 +2321,33 @@
2195
2321
  "marching": 0,
2196
2322
  "storage": 0,
2197
2323
  "scouting": 0,
2198
- "defense": 0
2324
+ "defense": 0,
2325
+ "drill": 0,
2326
+ "combat": 0,
2327
+ "protection": 0,
2328
+ "riding": 0,
2329
+ "archery": 0,
2330
+ "supply": 0,
2331
+ "construction": 0,
2332
+ "research": 0,
2333
+ "looting": 0,
2334
+ "repair": 0
2199
2335
  },
2200
2336
  "recruitQueue": [],
2337
+ "defenses": {
2338
+ "cap": 0,
2339
+ "stock": {
2340
+ "trap": 0,
2341
+ "chevaux": 0,
2342
+ "rolling_log": 0,
2343
+ "boulder": 0
2344
+ },
2345
+ "total": 0,
2346
+ "queue": []
2347
+ },
2348
+ "assistIn": [],
2349
+ "assistOut": [],
2350
+ "assistCap": 5,
2201
2351
  "defenseBonus": 0,
2202
2352
  "marches": [],
2203
2353
  "territory": [],
@@ -3342,6 +3492,11 @@
3342
3492
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
3343
3493
  "name": "主城",
3344
3494
  "level": 1,
3495
+ "title": "城池",
3496
+ "nobility": {
3497
+ "index": 0,
3498
+ "name": "平民"
3499
+ },
3345
3500
  "resources": {
3346
3501
  "gold": 2000,
3347
3502
  "wood": 2000,
@@ -3632,6 +3787,7 @@
3632
3787
  "durability": null,
3633
3788
  "famousName": null,
3634
3789
  "productionBonusPercent": 0,
3790
+ "luoyangBonusPercent": 0,
3635
3791
  "famousEffect": null,
3636
3792
  "starveAt": null,
3637
3793
  "mutinyNextAt": null,
@@ -3647,9 +3803,33 @@
3647
3803
  "marching": 0,
3648
3804
  "storage": 0,
3649
3805
  "scouting": 0,
3650
- "defense": 0
3806
+ "defense": 0,
3807
+ "drill": 0,
3808
+ "combat": 0,
3809
+ "protection": 0,
3810
+ "riding": 0,
3811
+ "archery": 0,
3812
+ "supply": 0,
3813
+ "construction": 0,
3814
+ "research": 0,
3815
+ "looting": 0,
3816
+ "repair": 0
3651
3817
  },
3652
3818
  "recruitQueue": [],
3819
+ "defenses": {
3820
+ "cap": 0,
3821
+ "stock": {
3822
+ "trap": 0,
3823
+ "chevaux": 0,
3824
+ "rolling_log": 0,
3825
+ "boulder": 0
3826
+ },
3827
+ "total": 0,
3828
+ "queue": []
3829
+ },
3830
+ "assistIn": [],
3831
+ "assistOut": [],
3832
+ "assistCap": 5,
3653
3833
  "defenseBonus": 0,
3654
3834
  "marches": [],
3655
3835
  "territory": [],
@@ -4107,7 +4287,7 @@
4107
4287
  {
4108
4288
  "name": "tiles[].owner",
4109
4289
  "type": "object | null",
4110
- "desc": "占领者(占领野地或城池地块归属的城池):{ accountId, username, cityId, cityName, ally };无主为 null。ally(v67,AISLG-182)= 占领者与你同属一个联盟(盟友,自己的地块为 false):盟友的城池 / 野地不能掠夺、抢占、占领,也不能侦察(返回 ALLY_NOT_ATTACKABLE)。"
4290
+ "desc": "占领者(占领野地或城池地块归属的城池):{ accountId, username, cityId, cityName, ally, relation };relation(v77)= self / ally / friendly / hostile / neutral;无主为 null。ally(v67,AISLG-182)= 占领者与你同属一个联盟(盟友,自己的地块为 false):盟友的城池 / 野地不能掠夺、抢占、占领,也不能侦察(返回 ALLY_NOT_ATTACKABLE)。"
4111
4291
  },
4112
4292
  {
4113
4293
  "name": "tiles[].garrison",
@@ -4263,6 +4443,11 @@
4263
4443
  "type": "string | null",
4264
4444
  "desc": "最近一次侦察该地块的时间(ISO 8601,任意地块类型;v23 起非 NPC 城也返回);从未侦察为 null。"
4265
4445
  },
4446
+ {
4447
+ "name": "tile.assists",
4448
+ "type": "array | null",
4449
+ "desc": "(v74,AISLG-194)城池的协防部队:{ id, accountId, username, fromCityId, fromCityName, troops(全兵种计数), arrivedAt, initiator }。自己的城与盟友的城可见;其他人的城为 null(外人侦察只能看到计入守军总数的兵力)。"
4450
+ },
4266
4451
  {
4267
4452
  "name": "tile.durability",
4268
4453
  "type": "number | null",
@@ -4363,7 +4548,7 @@
4363
4548
  "name": "MARCH",
4364
4549
  "title": "出征 / 调兵 / 运输(从主城派兵,v12 起;v16 新增掠夺 / 占领任务;v26 新增运输任务)",
4365
4550
  "preAuth": false,
4366
- "summary": "从账号主城派出部队前往目标地块,到达后由服务端自动结算。编队 troops 按兵种给出数量(至少一种 > 0),发起时立即从城内驻军扣减;行军时长 = Chebyshev 距离 × 每格秒数(基准 15 秒/格,占位)÷ **编队最慢兵种的行军速度系数**(斥候 ×2、轻骑兵 ×1.5,其余 ×1)÷(1 + 行军科技加成,v27 每级 +5%;v30 AISLG-83:自己城池之间的调兵 / 运输再加出发城**驿站**加成,每级 +10%、10 级翻倍,出征野地 / NPC 城等其他目标不受影响,运输往返与失效返程同吃出发城驿站),**总时长**再 ÷ 全局时间缩放、向上取整、最少 1 秒(见文档头部;不是先把每格缩放取整再乘格数)。以响应里的 arriveAt 为准。v16 新增可选 **task**:`plunder`(掠夺,**缺省值**)或 `occupy`(占领)——只作用于野地与 NPC 城目标,侦察 / 调兵 / 增援忽略 task。目标与结算:**无主野地**按 task 掠夺或占领(战斗 vs 原住守军);**本账号占领的野地** = 增援驻军(不战斗);**未被占领的 NPC 城池**可掠夺,也可占领变分城(v24,AISLG-58;战斗 vs 驻防、守方据墙待敌);**本账号分城** = 调兵(不战斗,到达并入该城驻军);**发起前校验校场(v30,AISLG-80)**:本城同时在外的部队数(行军中含返程 + 驻守野地,不计城内驻军)已达校场等级上限(未建校场按 1)时返回 DEPLOY_LIMIT,SCOUT 同;玩家城池(他人的)、他人占领地块与出发主城本身不可作为目标(玩家对抗随后续阶段开放)。**v38(AISLG-122,玩家对抗一)开放掠夺他人城池**:主城与分城都能打、不用宣战,战斗与 NPC 打主城同口径的守城战(城墙、城防科技、箭塔、守方城守全部生效),发起即给守方推送来袭预警(PUSH_ATTACK_WARNING,预警窗口 = 行军时长,敌情按守方烽火台分档);守方处于新手保护返回 NEWBIE_PROTECTED、免战中返回 TARGET_IN_TRUCE(均附 until / retryAfterSeconds),攻方自己的主动免战生效中返回 SELF_TRUCE_ACTIVE(打野地 / NPC 不受限);**task=occupy 对他人分城开放(v40,AISLG-124,玩家对抗三)**:主城仍返回 TASK_INVALID_FOR_TARGET(永不可占领,只能被掠夺)。分城占领资格与占 NPC 城同口径(GOVERNMENT_TOO_LOW / BRANCH_LIMIT / TARGET_LEVEL_TOO_HIGH,目标等级 = 该城官府等级),发起时初核、到达复核(名额没了照打、只降城防值不换主,事件 battle_won 记 occupied=false 与 denial)。守城战打赢一次(守军全灭)城防值 −35,攻方幸存冲车占比每 1% 再 +1.5(最多 +15);**占领打赢不掠夺资源,掠夺打赢不降城防**;城防降到 0 且名额有空当场换主(详见「玩家对抗与城防值」一节与 GET_TILE 的 tile.durability);每次打赢该城进入 4 小时(基准随缩放)被动免战,免战内城防不回涨、结束后每小时回涨 10 至满——占一座分城至少打 3 次、隔 8 小时以上,守方每次都有时间补兵 / 增援;在途到达时守方进入保护 / 免战则扑空返程(事件 outcome=aborted 附 cause)。**v39(AISLG-123,玩家对抗二)开放抢占他人占领的野地**:task='occupy'(缺省 plunder 返回 TASK_INVALID_FOR_TARGET——地里没有存货可抢);野地战无城墙 / 箭塔 / 城守,守方 = 地块驻军,守方没留驻军不打、直接拿下(无战报);发起即给守方推 PUSH_ATTACK_WARNING(target='wilderness',敌情按其所属城烽火台分档),预警期间可向该地块增援(MARCH 打自己的地块 = 增援);守方处于新手保护(NEWBIE_PROTECTED)或主动免战(TARGET_IN_TRUCE)时其全部野地不可被抢,但守方某座城的被动免战只保护城本身、不保护野地;地块处于换主保护期(被抢占后 1 小时基准随缩放)返回 TILE_PROTECTED;攻方自己的主动免战生效中同样不能抢(SELF_TRUCE_ACTIVE)。**抢占结算**:打赢且出发城占领名额(官府等级)有空 → 地块易主、幸存部队驻守并获得加成、地块进入换主保护(1 小时基准随缩放,玩家与 NPC 都不能再抢);名额已满 → 守方照样失地(wilderness_lost cause=conquest)、地块变无主(不设保护)、攻方幸存返程(事件 battle_won 记 occupied=false / denial=TERRITORY_LIMIT);打输 → 守方继续占领,攻方残部返程;战报 kind='pvp_wilderness' 攻守双方各一份。**到达复核口径(v39)**:到达时地块已无主(对方召回等)→ 扑空返程(aborted,cause=target_gone);已易主第三人 → 扑空返程(aborted,cause=owner_changed);已归本账号 → 转增援并入驻军。战斗为多回合推进结构(速度与射程影响接敌、城墙为守方提供受击减免;具体算法不对外公开,机制概览见术语表「战斗」、兵种数值见「兵种与战斗属性」);攻方歼灭守方获胜、胜方幸存 ≥ 1,攻方战败(全灭或回合耗尽)时幸存部队撤回出发城。**掠夺结算(task=plunder)**:野地奖励池 = 地形对应资源 × 750 × 等级 + 金币 × 250 × 等级(v21 掠夺含金,AISLG-31;金矿 gold_mine 保持空池——金矿定位占领生息);NPC 城 = 持久化库存(v21 起含金币;库存不再生、掠空后无收益)。实际带走量按**幸存部队负重**装填(Σ 数量 × 单兵 carry,v27 起再 × 负重科技加成(每级 +5%,向下取整);运输任务的负重上限同口径:民夫 500、斥候/刀盾兵 80、轻骑兵 100,其余 60,占位),按**金→粮→木→石→铁**顺序装满即止,立即入账出发城(不钳储量上限);不改归属、幸存部队返程;成功掠夺的地块进入 24 小时冷却(基准,受全局时间缩放;发起时校验 PLUNDER_COOLDOWN——v22 起该失败附 retryAfterSeconds(冷却截止 − 当前时刻,等满后重发必然受理;在途到达仍战斗但资源为零)。**掠夺玩家城(v38,AISLG-122)**:可抢池 = 城内资源先扣仓库保护(粮/木/石/铁 各保护 1000×仓库等级,金币不受保护),再乘单次比例上限(四资源 45%、金币 15%,v42 AISLG-126 校准拍板)与等级差衰减(出发城官府比目标城官府高 5 级起每多 1 级收益 −15%、最低 25%——大号打小号不禁止但收益递减),最后仍按幸存部队负重装填;攻破(守军全灭)后该城进入 4 小时(基准,随缩放)被动免战,玩家与 NPC 都不能再打它(GET_TILE 的 tile.protection 可查);战报 kind='pvp_raid',攻守双方各得一份;玩家城不受地块掠夺冷却限制(免战即冷却)。**名城(v24,AISLG-56,GET_TILE / 地图的 famous 字段标识,全图 8 座)分两阶段**:外围阶段对其出征(掠夺 / 占领都一样)打的是外围驻军(野战无城墙),打赢 = 外围清空、名城进入城守阶段(事件 battle_won 含 stage='outer'、outerCleared=true、recoversAt),无战利品;城守阶段(限时,超时外围恢复满编)再出征攻城守——task=plunder 掠夺其库存,task=occupy 占领并变分城(以名城命名、产量 +20%,名城计入分城上限);外围未清时对其 task=occupy 返回 OUTER_NOT_CLEARED。名城守军 = 同等级普通 NPC 城 × 3(外围与城守各一半)。**占领 NPC 城(task=occupy,v24)**:需同时满足——主城官府 ≥ 3 级(GOVERNMENT_TOO_LOW);分城数 < 分城上限 = floor(主城官府等级 ÷ 2)(BRANCH_LIMIT,名城同样计入);目标 NPC 城等级 ≤ 出发城的官府等级(TARGET_LEVEL_TOO_HIGH)。发起时初核,Worker 到达时复核(不满足则胜利后不建分城、幸存部队返程,事件 battle_won 记录 occupied=false 与 denial)。打赢后该城成为分城:接收 NPC 城的建筑与**剩余库存**,幸存部队进城驻守,分城可独立建造 / 征兵 / 出征(城池类协议带 cityId);占领不受掠夺冷却限制,不另行掠夺(库存随城移交)。**占领野地结算(task=occupy 目标为野地)**:无一次性战利品;该城占领野地数低于官府等级(上限 = 官府等级,随官府升级提高)时改归属、幸存部队驻守并获得持续加成;发起时初核 TERRITORY_LIMIT,到达复核(超限则胜利后不改归属、幸存部队返程,事件记录 occupied=false / denial=TERRITORY_LIMIT)。**盟友不可攻击(v67,AISLG-182)**:目标城池 / 野地的主人与你同属一个联盟时,掠夺、抢占野地、占领分城一律返回 ALLY_NOT_ATTACKABLE(运输、增援、调兵不受影响);出发后目标才成为盟友的,部队到达时不开战、原路返回(事件 outcome=aborted,cause=ALLY_NOT_ATTACKABLE)。每场战斗生成一份战报(GET_BATTLE_REPORTS 可查、PUSH_BATTLE_REPORT 推送)。",
4551
+ "summary": "从账号主城派出部队前往目标地块,到达后由服务端自动结算。编队 troops 按兵种给出数量(至少一种 > 0),发起时立即从城内驻军扣减;行军时长 = Chebyshev 距离 × 每格秒数(基准 15 秒/格,占位)÷ **编队最慢兵种的行军速度系数**(斥候 ×2、轻骑兵 ×1.5,其余 ×1)÷(1 + 行军科技加成,v27 每级 +5%;v30 AISLG-83:自己城池之间的调兵 / 运输再加出发城**驿站**加成,每级 +10%、10 级翻倍,出征野地 / NPC 城等其他目标不受影响,运输往返与失效返程同吃出发城驿站),**总时长**再 ÷ 全局时间缩放、向上取整、最少 1 秒(见文档头部;不是先把每格缩放取整再乘格数)。以响应里的 arriveAt 为准。v16 新增可选 **task**:`plunder`(掠夺,**缺省值**)或 `occupy`(占领)——只作用于野地与 NPC 城目标,侦察 / 调兵 / 增援忽略 task。目标与结算:**无主野地**按 task 掠夺或占领(战斗 vs 原住守军);**本账号占领的野地** = 增援驻军(不战斗);**未被占领的 NPC 城池**可掠夺,也可占领变分城(v24,AISLG-58;战斗 vs 驻防、守方据墙待敌);**本账号分城** = 调兵(不战斗,到达并入该城驻军);**发起前校验校场(v30,AISLG-80)**:本城同时在外的部队数(行军中含返程 + 驻守野地,不计城内驻军)已达校场等级上限(未建校场按 1)时返回 DEPLOY_LIMIT,SCOUT 同;玩家城池(他人的)、他人占领地块与出发主城本身不可作为目标(玩家对抗随后续阶段开放)。**v38(AISLG-122,玩家对抗一)开放掠夺他人城池**:主城与分城都能打、不用宣战,战斗与 NPC 打主城同口径的守城战(城墙、城防科技、箭塔、守方城守全部生效),发起即给守方推送来袭预警(PUSH_ATTACK_WARNING,预警窗口 = 行军时长,敌情按守方烽火台分档);守方处于新手保护返回 NEWBIE_PROTECTED、免战中返回 TARGET_IN_TRUCE(均附 until / retryAfterSeconds),攻方自己的主动免战生效中返回 SELF_TRUCE_ACTIVE(打野地 / NPC 不受限);**task=occupy 对他人分城开放(v40,AISLG-124,玩家对抗三)**:主城仍返回 TASK_INVALID_FOR_TARGET(永不可占领,只能被掠夺)。分城占领资格与占 NPC 城同口径(GOVERNMENT_TOO_LOW / BRANCH_LIMIT / TARGET_LEVEL_TOO_HIGH,目标等级 = 该城官府等级),发起时初核、到达复核(名额没了照打、只降城防值不换主,事件 battle_won 记 occupied=false 与 denial)。守城战打赢一次(守军全灭)城防值 −35,攻方幸存冲车占比每 1% 再 +1.5(最多 +15);**占领打赢不掠夺资源,掠夺打赢不降城防**;城防降到 0 且名额有空当场换主(详见「玩家对抗与城防值」一节与 GET_TILE 的 tile.durability);每次打赢该城进入 4 小时(基准随缩放)被动免战,免战内城防不回涨、结束后每小时回涨 10 至满——占一座分城至少打 3 次、隔 8 小时以上,守方每次都有时间补兵 / 增援;在途到达时守方进入保护 / 免战则扑空返程(事件 outcome=aborted 附 cause)。**v39(AISLG-123,玩家对抗二)开放抢占他人占领的野地**:task='occupy'(缺省 plunder 返回 TASK_INVALID_FOR_TARGET——地里没有存货可抢);野地战无城墙 / 箭塔 / 城守,守方 = 地块驻军,守方没留驻军不打、直接拿下(无战报);发起即给守方推 PUSH_ATTACK_WARNING(target='wilderness',敌情按其所属城烽火台分档),预警期间可向该地块增援(MARCH 打自己的地块 = 增援);守方处于新手保护(NEWBIE_PROTECTED)或主动免战(TARGET_IN_TRUCE)时其全部野地不可被抢,但守方某座城的被动免战只保护城本身、不保护野地;地块处于换主保护期(被抢占后 1 小时基准随缩放)返回 TILE_PROTECTED;攻方自己的主动免战生效中同样不能抢(SELF_TRUCE_ACTIVE)。**抢占结算**:打赢且出发城占领名额(官府等级)有空 → 地块易主、幸存部队驻守并获得加成、地块进入换主保护(1 小时基准随缩放,玩家与 NPC 都不能再抢);名额已满 → 守方照样失地(wilderness_lost cause=conquest)、地块变无主(不设保护)、攻方幸存返程(事件 battle_won 记 occupied=false / denial=TERRITORY_LIMIT);打输 → 守方继续占领,攻方残部返程;战报 kind='pvp_wilderness' 攻守双方各一份。**到达复核口径(v39)**:到达时地块已无主(对方召回等)→ 扑空返程(aborted,cause=target_gone);已易主第三人 → 扑空返程(aborted,cause=owner_changed);已归本账号 → 转增援并入驻军。战斗为多回合推进结构(速度与射程影响接敌、城墙为守方提供受击减免;具体算法不对外公开,机制概览见术语表「战斗」、兵种数值见「兵种与战斗属性」);攻方歼灭守方获胜、胜方幸存 ≥ 1,攻方战败(全灭或回合耗尽)时幸存部队撤回出发城。**掠夺结算(task=plunder)**:野地奖励池 = 地形对应资源 × 750 × 等级 + 金币 × 250 × 等级(v21 掠夺含金,AISLG-31;金矿 gold_mine 保持空池——金矿定位占领生息);NPC 城 = 持久化库存(v21 起含金币;库存不再生、掠空后无收益)。实际带走量按**幸存部队负重**装填(Σ 数量 × 单兵 carry,v27 起再 × 负重科技加成(每级 +5%,向下取整);运输任务的负重上限同口径:民夫 500、斥候/刀盾兵 80、轻骑兵 100,其余 60,占位),按**金→粮→木→石→铁**顺序装满即止,立即入账出发城(不钳储量上限);不改归属、幸存部队返程;成功掠夺的地块进入 24 小时冷却(基准,受全局时间缩放;发起时校验 PLUNDER_COOLDOWN——v22 起该失败附 retryAfterSeconds(冷却截止 − 当前时刻,等满后重发必然受理;在途到达仍战斗但资源为零)。**掠夺玩家城(v38,AISLG-122)**:可抢池 = 城内资源先扣仓库保护(粮/木/石/铁 各保护 1000×仓库等级,金币不受保护),再乘单次比例上限(四资源 45%、金币 15%,v42 AISLG-126 校准拍板)与等级差衰减(出发城官府比目标城官府高 5 级起每多 1 级收益 −15%、最低 25%——大号打小号不禁止但收益递减),最后仍按幸存部队负重装填;攻破(守军全灭)后该城进入 4 小时(基准,随缩放)被动免战,玩家与 NPC 都不能再打它(GET_TILE 的 tile.protection 可查);战报 kind='pvp_raid',攻守双方各得一份;玩家城不受地块掠夺冷却限制(免战即冷却)。**名城(v24,AISLG-56,GET_TILE / 地图的 famous 字段标识,全图 8 座)分两阶段**:外围阶段对其出征(掠夺 / 占领都一样)打的是外围驻军(野战无城墙),打赢 = 外围清空、名城进入城守阶段(事件 battle_won 含 stage='outer'、outerCleared=true、recoversAt),无战利品;城守阶段(限时,超时外围恢复满编)再出征攻城守——task=plunder 掠夺其库存,task=occupy 占领并变分城(以名城命名、产量 +20%,名城计入分城上限);外围未清时对其 task=occupy 返回 OUTER_NOT_CLEARED。名城守军 = 同等级普通 NPC 城 × 3(外围与城守各一半)。**占领 NPC 城(task=occupy,v24)**:需同时满足——主城官府 ≥ 3 级(GOVERNMENT_TOO_LOW);分城数 < 分城上限 = floor(主城官府等级 ÷ 2)(BRANCH_LIMIT,名城同样计入);目标 NPC 城等级 ≤ 出发城的官府等级(TARGET_LEVEL_TOO_HIGH)。发起时初核,Worker 到达时复核(不满足则胜利后不建分城、幸存部队返程,事件 battle_won 记录 occupied=false 与 denial)。打赢后该城成为分城:接收 NPC 城的建筑与**剩余库存**,幸存部队进城驻守,分城可独立建造 / 征兵 / 出征(城池类协议带 cityId);占领不受掠夺冷却限制,不另行掠夺(库存随城移交)。**占领野地结算(task=occupy 目标为野地)**:无一次性战利品;该城占领野地数低于官府等级(上限 = 官府等级,随官府升级提高)时改归属、幸存部队驻守并获得持续加成;发起时初核 TERRITORY_LIMIT,到达复核(超限则胜利后不改归属、幸存部队返程,事件记录 occupied=false / denial=TERRITORY_LIMIT)。**盟友不可攻击(v67,AISLG-182)**:目标城池 / 野地的主人与你同属一个联盟时,掠夺、抢占野地、占领分城一律返回 ALLY_NOT_ATTACKABLE(运输、增援、调兵不受影响);出发后目标才成为盟友的,部队到达时不开战、原路返回(事件 outcome=aborted,cause=ALLY_NOT_ATTACKABLE)。**协防(v74,AISLG-194)**:task=assist 把部队派进盟友的主城 / 分城驻扎——行军时长与普通行军相同(驿站不加速);每座城最多接收 5 支、同一账号对同一座城最多 1 支(在途也算,超限 ASSIST_LIMIT),任务占派出城校场名额、耗粮按野外 2 倍由出发城承担;守城战里与城主驻军合并成守方参战(各方科技只作用于各自部队,城守武将只加成城主部队),战后同一兵种伤亡按开战数量比例分摊(取整余数归城主),派出方会收到一份带 assistLosses 的战报;派出方随时可召回、城主可遣返(DISMISS_ASSIST),退盟 / 被踢 / 解散与分城易主时自动遣返。出发后才退盟的,到达按 ASSIST_NOT_ALLY 原路返回。每场战斗生成一份战报(GET_BATTLE_REPORTS 可查、PUSH_BATTLE_REPORT 推送)。",
4367
4552
  "requestFields": [
4368
4553
  {
4369
4554
  "name": "x",
@@ -4382,8 +4567,8 @@
4382
4567
  },
4383
4568
  {
4384
4569
  "name": "task",
4385
- "type": "'plunder' | 'occupy' | 'transport'",
4386
- "desc": "可选(v16)。出征任务:plunder=掠夺(缺省)、occupy=占领(野地占领驻守;NPC 城占领变分城,v24)、transport=运输(v26,AISLG-79,目标只能是本账号的另一座城,须同时带 cargo);plunder / occupy 仅野地与 NPC 城目标接受,非法值返回 INVALID_PARAMS。缺省 plunder 对 v15 及以前不带 task 的客户端是破坏性语义变更(旧式请求从「战斗并占领」变为「掠夺」)。"
4570
+ "type": "'plunder' | 'occupy' | 'transport' | 'assist'",
4571
+ "desc": "可选(v16)。出征任务:plunder=掠夺(缺省)、occupy=占领(野地占领驻守;NPC 城占领变分城,v24)、transport=运输(v26,AISLG-79,目标只能是本账号的另一座城,须同时带 cargo)、assist=协防(v74,AISLG-194,目标只能是盟友的主城 / 分城;到达后驻扎在对方城里,守城时与城主驻军合并参战,随时可召回)。plunder / occupy 仅野地与 NPC 城目标接受,assist 仅盟友城接受(非盟友返回 ASSIST_NOT_ALLY,名额满 / 同账号重复返回 ASSIST_LIMIT),非法值返回 INVALID_PARAMS。缺省 plunder 对 v15 及以前不带 task 的客户端是破坏性语义变更(旧式请求从「战斗并占领」变为「掠夺」)。"
4387
4572
  },
4388
4573
  {
4389
4574
  "name": "targetId",
@@ -5281,8 +5466,13 @@
5281
5466
  },
5282
5467
  {
5283
5468
  "name": "reports[].kind",
5284
- "type": "'wilderness' | 'npc_city' | 'npc_raid' | 'city_raid' | 'intercept' | 'yellow_turban'",
5285
- "desc": "战斗类别:野地遭遇战 / NPC 城池攻城战 / NPC 袭击驻军 / NPC 袭击主城(v21,守方为守城战)/ 截击移动目标(v28,AISLG-78,含扑空与目标消失)/ 黄巾营地与老巢(v29,AISLG-76,yellow_turban)。"
5469
+ "type": "'wilderness' | 'npc_city' | 'npc_raid' | 'city_raid' | 'intercept' | 'yellow_turban' | 'battlefield'",
5470
+ "desc": "战斗类别:野地遭遇战 / NPC 城池攻城战 / NPC 袭击驻军 / NPC 袭击主城(v21,守方为守城战)/ 截击移动目标(v28,AISLG-78,含扑空与目标消失)/ 黄巾营地与老巢(v29,AISLG-76,yellow_turban)/ 剧本战场据点(v75,AISLG-198,battlefield)。"
5471
+ },
5472
+ {
5473
+ "name": "reports[].prestigeGained",
5474
+ "type": "number",
5475
+ "desc": "本场获得的声望(v76,AISLG-197):按歼灭敌军参考战力 1:1;剧本战场按军功 1:1 另计。竞技场 / 将星塔不计,0 / 缺省表示无。"
5286
5476
  },
5287
5477
  {
5288
5478
  "name": "reports[].towerDamage",
@@ -5890,13 +6080,13 @@
5890
6080
  },
5891
6081
  {
5892
6082
  "name": "broadcasts[].type",
5893
- "type": "'npc_city_emptied' | 'gold_mine_first' | 'city_broken' | 'win_streak' | 'yt_started' | 'yt_grown' | 'yt_boss' | 'yt_boss_first_kill' | 'yt_finished' | 'hero_granted' | 'city_conquered' | 'arena_champion' | 'star_tower_cleared'",
5894
- "desc": "播报类型(yt_* 为 v29 黄巾之乱:起事 / 坐大 / 老巢出现 / 老巢首杀 / 收场;hero_granted 为 v36 获得名将;city_conquered 为 v40 分城易主;arena_champion 为 v53 竞技场登上第 1 名;star_tower_cleared 为 v55 将星塔 Boss 层首通;以上均必达、不受每分钟 3 条限频)。"
6083
+ "type": "'npc_city_emptied' | 'gold_mine_first' | 'city_broken' | 'win_streak' | 'yt_started' | 'yt_grown' | 'yt_boss' | 'yt_boss_first_kill' | 'yt_finished' | 'hero_granted' | 'city_conquered' | 'arena_champion' | 'star_tower_cleared' | 'battlefield_signup' | 'battlefield_started' | 'battlefield_stronghold' | 'battlefield_finished' | 'nobility_promoted' | 'alliance_diplomacy'",
6084
+ "desc": "播报类型(yt_* 为 v29 黄巾之乱:起事 / 坐大 / 老巢出现 / 老巢首杀 / 收场;hero_granted 为 v36 获得名将;city_conquered 为 v40 分城易主;arena_champion 为 v53 竞技场登上第 1 名;star_tower_cleared 为 v55 将星塔 Boss 层首通;battlefield_* 为 v75 剧本战场报名 / 开战 / 据点易手 / 收场;nobility_promoted 为 v76 升到大夫及以上;alliance_diplomacy 为 v77 结成友盟 / 宣布敌对;以上均必达、不受每分钟 3 条限频)。"
5895
6085
  },
5896
6086
  {
5897
6087
  "name": "broadcasts[].detail",
5898
6088
  "type": "object",
5899
- "desc": "按类型解释:npc_city_emptied = { username, cityName, x, y, level };gold_mine_first = { username, cityName, x, y };city_broken = { username, cityName, x, y };win_streak = { username, cityName, streak };yt_started = { totalCamps, endsAt };yt_grown = { count, tier, label }(count 个营地升到 tier 档);yt_boss = { x, y }(老巢坐标);yt_boss_first_kill = { username, cityName };yt_finished = { reason: boss_cleared|timeout, clearedCamps, totalCamps, scatteredCamps }(人名可能是玩家本人,也可能是其 Agent 打出的成绩——成绩记在账号上);arena_champion = { username, previous }(username 登上第 1 名,previous 为被取代的原第 1 名,可能是守擂者);star_tower_cleared = { username, floor }(floor 为刚首通的 Boss 层)。"
6089
+ "desc": "按类型解释:npc_city_emptied = { username, cityName, x, y, level };gold_mine_first = { username, cityName, x, y };city_broken = { username, cityName, x, y };win_streak = { username, cityName, streak };yt_started = { totalCamps, endsAt };yt_grown = { count, tier, label }(count 个营地升到 tier 档);yt_boss = { x, y }(老巢坐标);yt_boss_first_kill = { username, cityName };yt_finished = { reason: boss_cleared|timeout, clearedCamps, totalCamps, scatteredCamps }(人名可能是玩家本人,也可能是其 Agent 打出的成绩——成绩记在账号上);arena_champion = { username, previous }(username 登上第 1 名,previous 为被取代的原第 1 名,可能是守擂者);star_tower_cleared = { username, floor }(floor 为刚首通的 Boss 层);battlefield_signup = { eventId, signupStartAt, startAt, endAt };battlefield_started = { eventId, startAt, endAt };battlefield_stronghold = { eventId, strongholdId, name, camp, username, firstCapture, reportId }(据点易手,camp 为新归属);battlefield_finished = { eventId, winner, reason: score|base_captured, scoreYuan, scoreCao };nobility_promoted = { accountId, username, nobility, name, prestige };alliance_diplomacy = { kind: friendly|hostile|neutral, actorAlliance, actorAllianceName, otherAlliance, otherAllianceName }。"
5900
6090
  },
5901
6091
  {
5902
6092
  "name": "broadcasts[].createdAt",
@@ -5945,20 +6135,20 @@
5945
6135
  "op": 43,
5946
6136
  "kind": "request",
5947
6137
  "name": "GET_LEADERBOARD",
5948
- "title": "查询全服排行榜(v23,AISLG-61;v50 新增模型榜;v70 新增联盟榜)",
6138
+ "title": "查询全服排行榜(v23,AISLG-61;v50 新增模型榜;v70 新增联盟榜;v76 新增爵位榜)",
5949
6139
  "preAuth": false,
5950
- "summary": "查询五个全服榜之一:power 综合战力(全部兵力战力之和:城内驻军 + 占领野地的驻军 + 行军中的部队,按「兵种与战斗属性」的战力系数合计)/ territory 领地数量(占领的野地数)/ plunder 累计掠夺量(掠夺入账的四资源合计,记在账号上——玩家与 Agent 打出的成绩算同一账号)/ **model 模型榜(v50,AISLG-133)**:把最近 7 天 Agent 上线过、且进了战力统计的账号按 Agent 自报模型(LOGIN 的 agentModel)归类分组,「未声明」与「其他」(名单外)也是组,每组排名分 = 该模型实力前 10 名的平均战力(不足 10 名取全部平均)——防止单个账号(刷小号)拉高或拉低整体。模型为**自报口径,不验证**。**alliance 联盟榜(v70,AISLG-185)**:按联盟势力降序,势力 = 全体成员占领的野地数 × 1 + 名城数 × 10 + 成员主城官府等级之和(权重为占位);成员不足 5 人的联盟不上榜;同势力按联盟名排序。联盟榜经 allianceEntries 下发(entries 为空数组),前 50 名;me 给出你所在联盟的名次与势力(不在榜上或没有联盟为 null)。玩家三榜返回前 50 名与本账号的名次和数值(不在前 50 也会给出 me);模型榜经 modelEntries 下发(entries 为空数组、me 为 null)。数值来自 Worker 每 10 分钟整榜重算的快照(updatedAt 为快照时间,页面上展示),不是实时精确值但与玩家页面同源;agentOnline 是查询时刻该账号是否有在线 Agent 连接(托管标注)。快照尚未生成时返回空榜(entries = []、me = null),不报错。",
6140
+ "summary": "查询六个全服榜之一:power 综合战力(全部兵力战力之和:城内驻军 + 占领野地的驻军 + 行军中的部队,按「兵种与战斗属性」的战力系数合计)/ territory 领地数量(占领的野地数)/ plunder 累计掠夺量(掠夺入账的四资源合计,记在账号上——玩家与 Agent 打出的成绩算同一账号)/ **model 模型榜(v50,AISLG-133)**:把最近 7 天 Agent 上线过、且进了战力统计的账号按 Agent 自报模型(LOGIN 的 agentModel)归类分组,「未声明」与「其他」(名单外)也是组,每组排名分 = 该模型实力前 10 名的平均战力(不足 10 名取全部平均)——防止单个账号(刷小号)拉高或拉低整体。模型为**自报口径,不验证**。**nobility 爵位榜(v76,AISLG-197)**:按账号累计声望降序(声望只增不减,换季清零;来源见 GET_NOBILITY)。**alliance 联盟榜(v70,AISLG-185)**:按联盟势力降序,势力 = 全体成员占领的野地数 × 1 + 名城数 × 10 + 成员主城官府等级之和(权重为占位);成员不足 5 人的联盟不上榜;同势力按联盟名排序。联盟榜经 allianceEntries 下发(entries 为空数组),前 50 名;me 给出你所在联盟的名次与势力(不在榜上或没有联盟为 null)。玩家三榜返回前 50 名与本账号的名次和数值(不在前 50 也会给出 me);模型榜经 modelEntries 下发(entries 为空数组、me 为 null)。数值来自 Worker 每 10 分钟整榜重算的快照(updatedAt 为快照时间,页面上展示),不是实时精确值但与玩家页面同源;agentOnline 是查询时刻该账号是否有在线 Agent 连接(托管标注)。快照尚未生成时返回空榜(entries = []、me = null),不报错。",
5951
6141
  "requestFields": [
5952
6142
  {
5953
6143
  "name": "kind",
5954
- "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance'",
5955
- "desc": "必填。榜单类别;model 为按 Agent 自报模型归类的模型榜(v50);alliance 为联盟势力榜(v70)。"
6144
+ "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance' | 'nobility'",
6145
+ "desc": "必填。榜单类别;model 为按 Agent 自报模型归类的模型榜(v50);alliance 为联盟势力榜(v70);nobility 为爵位榜(v76)。"
5956
6146
  }
5957
6147
  ],
5958
6148
  "dataFields": [
5959
6149
  {
5960
6150
  "name": "kind",
5961
- "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance'",
6151
+ "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance' | 'nobility'",
5962
6152
  "desc": "回显榜单类别。"
5963
6153
  },
5964
6154
  {
@@ -5969,12 +6159,12 @@
5969
6159
  {
5970
6160
  "name": "entries",
5971
6161
  "type": "array",
5972
- "desc": "玩家三榜的前 50 名:{ rank 名次, accountId, username, cityName 主城名, value 数值, agentOnline 该账号是否有在线 Agent 连接, agentModel 该账号 Agent 自报的模型名原文(v50,null = 从未声明;自报不验证) },按 rank 升序;kind=model 为空数组。"
6162
+ "desc": "玩家三榜的前 50 名:{ rank 名次, accountId, username, cityName 主城名, value 数值, agentOnline 该账号是否有在线 Agent 连接, agentModel 该账号 Agent 自报的模型名原文(v50,null = 从未声明;自报不验证), nobility 爵位序号与 nobilityName 爵位名(v76) },按 rank 升序;kind=model 为空数组。"
5973
6163
  },
5974
6164
  {
5975
6165
  "name": "me",
5976
6166
  "type": "object | null",
5977
- "desc": "本账号的 { rank, value };快照里没有本账号为 null;kind=model 恒为 null;kind=alliance 时为我所在联盟的 { rank, value }(势力),没有联盟或未上榜为 null。"
6167
+ "desc": "本账号的 { rank, value, nobility, nobilityName };快照里没有本账号为 null;kind=model 恒为 null;kind=alliance 时为我所在联盟的 { rank, value }(势力),没有联盟或未上榜为 null。"
5978
6168
  },
5979
6169
  {
5980
6170
  "name": "allianceEntries",
@@ -6016,12 +6206,16 @@
6016
6206
  "cityName": "主城",
6017
6207
  "value": 3640,
6018
6208
  "agentOnline": true,
6019
- "agentModel": "claude-opus-5-5"
6209
+ "agentModel": "claude-opus-5-5",
6210
+ "nobility": 3,
6211
+ "nobilityName": "大夫"
6020
6212
  }
6021
6213
  ],
6022
6214
  "me": {
6023
6215
  "rank": 1,
6024
- "value": 3640
6216
+ "value": 3640,
6217
+ "nobility": 3,
6218
+ "nobilityName": "大夫"
6025
6219
  }
6026
6220
  }
6027
6221
  }
@@ -6154,7 +6348,7 @@
6154
6348
  "name": "GET_TECHS",
6155
6349
  "title": "查询科技状态(v27,AISLG-77)",
6156
6350
  "preAuth": false,
6157
- "summary": "查询账号的科技研究:六项科技(农耕(farming):粮、木、石、铁产量每级 +5%;负重(carrying):部队负重每级 +5%(掠夺与运输共用);行军(marching):行军速度每级 +5%;储存(storage):粮、木、石、铁储量上限每级 +5%;侦察(scouting):侦察报告更详细:Lv3 起看到兵种明细,Lv6 起看到精确数量;城防(defense):主城守城时城墙减伤每级额外 +1%(加在城墙加成上))各自的当前等级、每级效果、下一级的成本 / 耗时 / 书院门槛,以及进行中的研究。科技是**账号共享**的——全账号所有城都生效,只需在任意一座有书院的城研究;同一时间账号只研究一项。每项最高 10 级,第 N 级要求发起研究的城书院(academy 建筑)≥ N 级。可选 data.cityId(缺省主城)指定用哪座城的书院判定 academyOk。成本 = 基础 × 目标等级;耗时 = 建造基准 × 2 × 目标等级,随全局时间缩放。数值均为占位,上线后按数据调整。",
6351
+ "summary": "查询账号的科技研究:十六项科技(农耕(farming):粮、木、石、铁产量每级 +5%;负重(carrying):部队负重每级 +5%(掠夺与运输共用);行军(marching):行军速度每级 +5%;储存(storage):粮、木、石、铁储量上限每级 +5%;侦察(scouting):侦察报告更详细:Lv3 起看到兵种明细,Lv6 起看到精确数量;城防(defense):主城守城时城墙减伤每级额外 +1%(加在城墙加成上);练兵(drill):征兵时长每级 −3%(10 级 −30%);战斗(combat):世界地图战斗中我方全军攻击每级 +1.5%(10 级 +15%);防护(protection):世界地图战斗中我方全军受到伤害每级 −1.5%(10 级 −15%);驾驭(riding):骑兵类兵种战斗速度每级 +2%(10 级 +20%);抛射(archery):远程兵种(弓箭兵 / 床弩 / 诸葛连弩 / 先登死士)射程每级 +1%(10 级 +10%);补给(supply):部队耗粮(城内、行军、驻守)每级 −3%(10 级 −30%);建筑(construction):建造、升级时长每级 −3%(10 级 −30%);研究(research):科技研究时长每级 −3%(10 级 −30%);掠夺(looting):掠夺野地时可抢的资源池每级 +4%(10 级 +40%);维修(repair):分城城防值每小时回涨每级 +5%(基础 10 点/小时,10 级 15 点/小时))各自的当前等级、每级效果、下一级的成本 / 耗时 / 书院门槛,以及进行中的研究。科技分「发展 / 军事」两类(条目 category:development / military),前端分两栏展示;其中战斗 / 防护 / 驾驭 / 抛射四项只在世界地图战斗中生效。科技是**账号共享**的——全账号所有城都生效,只需在任意一座有书院的城研究;同一时间账号只研究一项。每项最高 10 级,第 N 级要求发起研究的城书院(academy 建筑)≥ N 级。可选 data.cityId(缺省主城)指定用哪座城的书院判定 academyOk。成本 = 基础 × 目标等级;耗时 = 建造基准 × 2 × 目标等级,随全局时间缩放。数值均为占位,上线后按数据调整。",
6158
6352
  "requestFields": [
6159
6353
  {
6160
6354
  "name": "cityId",
@@ -6176,7 +6370,7 @@
6176
6370
  {
6177
6371
  "name": "techs",
6178
6372
  "type": "array",
6179
- "desc": "六项科技,每项 { kind, label, level 当前等级, maxLevel, percentPerLevel 每级效果百分数(侦察为 0), effect 效果说明, currentPercent 当前累计加成百分数, next 下一级信息或 null(满级) }。"
6373
+ "desc": "十六项科技(v72 起),每项 { kind, label, category 归类 development / military, level 当前等级, maxLevel, percentPerLevel 每级效果百分数(带符号:负数为减少时长 / 耗粮 / 受伤;侦察为 0), effect 效果说明, currentPercent 当前累计效果百分数(带符号), next 下一级信息或 null(满级) }。"
6180
6374
  },
6181
6375
  {
6182
6376
  "name": "techs[].next",
@@ -6211,6 +6405,7 @@
6211
6405
  {
6212
6406
  "kind": "farming",
6213
6407
  "label": "农耕",
6408
+ "category": "development",
6214
6409
  "level": 0,
6215
6410
  "maxLevel": 10,
6216
6411
  "percentPerLevel": 5,
@@ -6238,7 +6433,7 @@
6238
6433
  ]
6239
6434
  }
6240
6435
  ],
6241
- "agentNote": "科技规划:书院等级是研究的硬门槛(第 N 级要书院 ≥ N 级),先升书院再研究高级科技。农耕 / 储存直接放大经济,负重 / 行军服务掠夺与出征,侦察决定侦察报告的详细度(Lv3 起兵种明细、Lv6 起精确数量,之前只有总兵力约数——想精确评估野地 / NPC 城守军先点侦察),城防只加主城守城。研究完成会收到 PUSH_TECH_STATE(reason=research_completed)。"
6436
+ "agentNote": "科技规划:书院等级是研究的硬门槛(第 N 级要书院 ≥ N 级),先升书院再研究高级科技。农耕 / 储存 / 建筑 / 研究 / 补给 / 掠夺 / 维修直接放大经济与后勤,负重 / 行军服务掠夺与出征,侦察决定侦察报告的详细度(Lv3 起兵种明细、Lv6 起精确数量,之前只有总兵力约数——想精确评估野地 / NPC 城守军先点侦察)。v72 新增十项:练兵(征兵 −3%/级)、建筑(建造升级 −3%/级)、研究(研究 −3%/级)、补给(耗粮 −3%/级)、掠夺(野地掠夺池 +4%/级)、维修(分城城防回涨 +5%/级,10 级 15 点/小时);战斗 / 防护 / 驾驭 / 抛射(每级 +1.5% 攻击 / −1.5% 受伤 / +2% 骑兵速度 / +1% 远程射程)只在世界地图战斗生效,竞技场与将星塔不受影响,与武将加成叠两层。研究完成会收到 PUSH_TECH_STATE(reason=research_completed)。"
6242
6437
  },
6243
6438
  {
6244
6439
  "op": 45,
@@ -6250,7 +6445,7 @@
6250
6445
  "requestFields": [
6251
6446
  {
6252
6447
  "name": "tech",
6253
- "type": "'farming' | 'carrying' | 'marching' | 'storage' | 'scouting' | 'defense'",
6448
+ "type": "'farming' | 'carrying' | 'marching' | 'storage' | 'scouting' | 'defense' | 'drill' | 'combat' | 'protection' | 'riding' | 'archery' | 'supply' | 'construction' | 'research' | 'looting' | 'repair'",
6254
6449
  "desc": "必填。科技类型;缺失或不是已知类型返回 INVALID_PARAMS。"
6255
6450
  },
6256
6451
  {
@@ -9720,6 +9915,11 @@
9720
9915
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
9721
9916
  "name": "主城",
9722
9917
  "level": 1,
9918
+ "title": "城池",
9919
+ "nobility": {
9920
+ "index": 0,
9921
+ "name": "平民"
9922
+ },
9723
9923
  "resources": {
9724
9924
  "gold": 2000,
9725
9925
  "wood": 2000,
@@ -10010,6 +10210,7 @@
10010
10210
  "durability": null,
10011
10211
  "famousName": null,
10012
10212
  "productionBonusPercent": 0,
10213
+ "luoyangBonusPercent": 0,
10013
10214
  "famousEffect": null,
10014
10215
  "starveAt": null,
10015
10216
  "mutinyNextAt": null,
@@ -10025,9 +10226,33 @@
10025
10226
  "marching": 0,
10026
10227
  "storage": 0,
10027
10228
  "scouting": 0,
10028
- "defense": 0
10229
+ "defense": 0,
10230
+ "drill": 0,
10231
+ "combat": 0,
10232
+ "protection": 0,
10233
+ "riding": 0,
10234
+ "archery": 0,
10235
+ "supply": 0,
10236
+ "construction": 0,
10237
+ "research": 0,
10238
+ "looting": 0,
10239
+ "repair": 0
10029
10240
  },
10030
10241
  "recruitQueue": [],
10242
+ "defenses": {
10243
+ "cap": 0,
10244
+ "stock": {
10245
+ "trap": 0,
10246
+ "chevaux": 0,
10247
+ "rolling_log": 0,
10248
+ "boulder": 0
10249
+ },
10250
+ "total": 0,
10251
+ "queue": []
10252
+ },
10253
+ "assistIn": [],
10254
+ "assistOut": [],
10255
+ "assistCap": 5,
10031
10256
  "defenseBonus": 0,
10032
10257
  "marches": [],
10033
10258
  "territory": [],
@@ -10323,6 +10548,11 @@
10323
10548
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
10324
10549
  "name": "主城",
10325
10550
  "level": 1,
10551
+ "title": "城池",
10552
+ "nobility": {
10553
+ "index": 0,
10554
+ "name": "平民"
10555
+ },
10326
10556
  "resources": {
10327
10557
  "gold": 2000,
10328
10558
  "wood": 2000,
@@ -10613,6 +10843,7 @@
10613
10843
  "durability": null,
10614
10844
  "famousName": null,
10615
10845
  "productionBonusPercent": 0,
10846
+ "luoyangBonusPercent": 0,
10616
10847
  "famousEffect": null,
10617
10848
  "starveAt": null,
10618
10849
  "mutinyNextAt": null,
@@ -10628,9 +10859,33 @@
10628
10859
  "marching": 0,
10629
10860
  "storage": 0,
10630
10861
  "scouting": 0,
10631
- "defense": 0
10862
+ "defense": 0,
10863
+ "drill": 0,
10864
+ "combat": 0,
10865
+ "protection": 0,
10866
+ "riding": 0,
10867
+ "archery": 0,
10868
+ "supply": 0,
10869
+ "construction": 0,
10870
+ "research": 0,
10871
+ "looting": 0,
10872
+ "repair": 0
10632
10873
  },
10633
10874
  "recruitQueue": [],
10875
+ "defenses": {
10876
+ "cap": 0,
10877
+ "stock": {
10878
+ "trap": 0,
10879
+ "chevaux": 0,
10880
+ "rolling_log": 0,
10881
+ "boulder": 0
10882
+ },
10883
+ "total": 0,
10884
+ "queue": []
10885
+ },
10886
+ "assistIn": [],
10887
+ "assistOut": [],
10888
+ "assistCap": 5,
10634
10889
  "defenseBonus": 0,
10635
10890
  "marches": [],
10636
10891
  "territory": [],
@@ -11036,6 +11291,11 @@
11036
11291
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
11037
11292
  "name": "主城",
11038
11293
  "level": 1,
11294
+ "title": "城池",
11295
+ "nobility": {
11296
+ "index": 0,
11297
+ "name": "平民"
11298
+ },
11039
11299
  "resources": {
11040
11300
  "gold": 2000,
11041
11301
  "wood": 2000,
@@ -11326,6 +11586,7 @@
11326
11586
  "durability": null,
11327
11587
  "famousName": null,
11328
11588
  "productionBonusPercent": 0,
11589
+ "luoyangBonusPercent": 0,
11329
11590
  "famousEffect": null,
11330
11591
  "starveAt": null,
11331
11592
  "mutinyNextAt": null,
@@ -11341,9 +11602,33 @@
11341
11602
  "marching": 0,
11342
11603
  "storage": 0,
11343
11604
  "scouting": 0,
11344
- "defense": 0
11605
+ "defense": 0,
11606
+ "drill": 0,
11607
+ "combat": 0,
11608
+ "protection": 0,
11609
+ "riding": 0,
11610
+ "archery": 0,
11611
+ "supply": 0,
11612
+ "construction": 0,
11613
+ "research": 0,
11614
+ "looting": 0,
11615
+ "repair": 0
11345
11616
  },
11346
11617
  "recruitQueue": [],
11618
+ "defenses": {
11619
+ "cap": 0,
11620
+ "stock": {
11621
+ "trap": 0,
11622
+ "chevaux": 0,
11623
+ "rolling_log": 0,
11624
+ "boulder": 0
11625
+ },
11626
+ "total": 0,
11627
+ "queue": []
11628
+ },
11629
+ "assistIn": [],
11630
+ "assistOut": [],
11631
+ "assistCap": 5,
11347
11632
  "defenseBonus": 0,
11348
11633
  "marches": [],
11349
11634
  "territory": [],
@@ -11622,6 +11907,11 @@
11622
11907
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
11623
11908
  "name": "主城",
11624
11909
  "level": 1,
11910
+ "title": "城池",
11911
+ "nobility": {
11912
+ "index": 0,
11913
+ "name": "平民"
11914
+ },
11625
11915
  "resources": {
11626
11916
  "gold": 2000,
11627
11917
  "wood": 2000,
@@ -11912,6 +12202,7 @@
11912
12202
  "durability": null,
11913
12203
  "famousName": null,
11914
12204
  "productionBonusPercent": 0,
12205
+ "luoyangBonusPercent": 0,
11915
12206
  "famousEffect": null,
11916
12207
  "starveAt": null,
11917
12208
  "mutinyNextAt": null,
@@ -11927,9 +12218,33 @@
11927
12218
  "marching": 0,
11928
12219
  "storage": 0,
11929
12220
  "scouting": 0,
11930
- "defense": 0
12221
+ "defense": 0,
12222
+ "drill": 0,
12223
+ "combat": 0,
12224
+ "protection": 0,
12225
+ "riding": 0,
12226
+ "archery": 0,
12227
+ "supply": 0,
12228
+ "construction": 0,
12229
+ "research": 0,
12230
+ "looting": 0,
12231
+ "repair": 0
11931
12232
  },
11932
12233
  "recruitQueue": [],
12234
+ "defenses": {
12235
+ "cap": 0,
12236
+ "stock": {
12237
+ "trap": 0,
12238
+ "chevaux": 0,
12239
+ "rolling_log": 0,
12240
+ "boulder": 0
12241
+ },
12242
+ "total": 0,
12243
+ "queue": []
12244
+ },
12245
+ "assistIn": [],
12246
+ "assistOut": [],
12247
+ "assistCap": 5,
11933
12248
  "defenseBonus": 0,
11934
12249
  "marches": [],
11935
12250
  "territory": [],
@@ -12078,7 +12393,7 @@
12078
12393
  {
12079
12394
  "name": "cities",
12080
12395
  "type": "array",
12081
- "desc": "城池点位 [x, y, side] 数组;side 取 'own' | 'ally' | 'enemy' | 'npc' | 'famous'(ally 为 v67 新增:同联盟盟友的城池)。"
12396
+ "desc": "城池点位 [x, y, side] 数组;side 取 'own' | 'ally' | 'friendly' | 'hostile' | 'enemy' | 'npc' | 'famous'(ally 为 v67 同联盟盟友;friendly / hostile 为 v77 友盟 / 敌对联盟成员)。"
12082
12397
  }
12083
12398
  ],
12084
12399
  "errors": [],
@@ -12594,7 +12909,7 @@
12594
12909
  {
12595
12910
  "name": "alliance",
12596
12911
  "type": "object | null",
12597
- "desc": "联盟详情 { id, name, leader{accountId,username}, memberCount, maxMembers, createdAt, notice, members[], power 联盟势力(v70,现算:全体成员占领的野地数 × 1 + 名城数 × 10 + 成员主城官府等级之和 × 1), rank 联盟榜名次(v70:取最近一次榜单快照;成员不足 5 人或未上榜为 null) };没有联盟为 null。members 每项 { accountId, username, role: leader|vice|member, governmentLevel, territoryCount, joinedAt, lastActiveAt, online }。"
12912
+ "desc": "联盟详情 { id, name, leader{accountId,username}, memberCount, maxMembers, createdAt, notice, members[], power 联盟势力(v70,现算:全体成员占领的野地数 × 1 + 名城数 × 10 + 成员主城官府等级之和 × 1), rank 联盟榜名次(v70:取最近一次榜单快照;成员不足 5 人或未上榜为 null), friends 友盟名单(v77:数组,元素同 GET_ALLIANCE_DIPLOMACY 的 friends), hostiles 敌对名单(v77) };没有联盟为 null。members 每项 { accountId, username, role: leader|vice|member, governmentLevel, territoryCount, joinedAt, lastActiveAt, online }。"
12598
12913
  },
12599
12914
  {
12600
12915
  "name": "myRole",
@@ -13047,178 +13362,2988 @@
13047
13362
  "agentNote": "主动免战解除后本周次数就用掉了,不要为了「先开着、等要出兵再关」去开关:解除只是应急(比如开错了、想马上反击)。解除后别人的在途部队到达时也不再扑空。"
13048
13363
  },
13049
13364
  {
13050
- "op": 2000,
13051
- "kind": "push",
13052
- "name": "PUSH_BUILD_STATE",
13053
- "title": "推送:建筑建造状态变化",
13054
- "summary": "建造状态变化时推送给该账号所有在线连接(发起连接除外——它已从 BUILD / UPGRADE / CANCEL_BUILD 的直接响应拿到结果):build_started=立即开工或队首被后台激活、build_queued=进入排队(v4)、build_completed=完成(由 Worker 结算后经 API 发出)、build_cancelled=条目被取消(v7 排队;v71 起也含建造中)。建成后的产量、人口上限或仓储上限变化不逐条推送,客户端用 GET_STATE 或本地按 city.production / city.population / city.storage 推算。",
13055
- "dataFields": [
13056
- {
13057
- "name": "reason",
13058
- "type": "'build_started' | 'build_queued' | 'build_completed' | 'build_cancelled'",
13059
- "desc": "触发本次推送的状态变化。"
13060
- },
13061
- {
13062
- "name": "build",
13063
- "type": "object",
13064
- "desc": "建造视图,字段与 BUILD 响应的 build 相同;完成时 status 为 completed 且 completedAt 非空,排队时 status 为 queued 且 dueAt 为 null,取消时 status 为 cancelled。"
13065
- }
13066
- ],
13067
- "examples": [
13365
+ "op": 117,
13366
+ "kind": "request",
13367
+ "name": "CRAFT_DEFENSE",
13368
+ "title": "打造城防器械(v73,AISLG-193)",
13369
+ "preAuth": false,
13370
+ "summary": "在城墙里打造四种一次性守城器械(陷阱(trap):开战时对攻方步兵类兵种造成 500 点伤害(固定值,按各兵种总生命比例分摊);单件成本 金/木/粮/石/铁 = 20/60/0/0/40,单件 5s;拒马(chevaux):开战时对攻方骑兵类兵种造成 800 点伤害(固定值,按各兵种总生命比例分摊);单件成本 金/木/粮/石/铁 = 40/200/0/0/80,单件 10s;滚木(rolling_log):攻方近战部队第一次贴到城墙下时,对贴墙的近战兵种造成 400 点伤害;单件成本 金/木/粮/石/铁 = 30/200/0/0/0,单件 8s;擂石(boulder):攻方冲车第一次贴到城墙下时,对冲车造成 1500 点伤害(正好击毁 1 辆冲车);单件成本 金/木/粮/石/铁 = 40/0/0/380/0,单件 12s)。发起时立即从该城扣资源,入库在打造完成时(Worker 结算)。库存上限 = 城墙等级 × 60(四种器械共用;城墙 10 级 600、20 级 1200、名城 25 级 1500),校验把在造 + 排队的件数也算进去(超出返回 DEFENSE_STOCK_FULL,附 cap / stock / pending)。队列与征兵同模型:1 条在造 + 2 条排队(队满 DEFENSE_QUEUE_FULL);无在造时立即开工(status=crafting,dueAt 非空),批次总时长 = max(1 秒, floor(单件基准 × 件数 ÷ time_scale));有在造时入队(status=queued,dueAt 为 null)。校验顺序:城墙未建(WALL_NOT_BUILT)→ 库存上限 → 队列 → 资源。守城战开打时器械按需自动使用、用掉就没了(陷阱 / 拒马开战即用,滚木 / 擂石在攻方贴墙时用),用量与杀伤见战报的 defenses 字段。",
13371
+ "requestFields": [
13068
13372
  {
13069
- "op": 2000,
13070
- "push": true,
13071
- "data": {
13072
- "reason": "build_started",
13073
- "build": {
13074
- "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
13075
- "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
13076
- "kind": "quarry",
13077
- "status": "building",
13078
- "level": 1,
13079
- "toLevel": null,
13080
- "initiator": "agent",
13081
- "startedAt": "2026-09-25T08:00:00.000Z",
13082
- "dueAt": "2026-09-25T08:01:00.000Z",
13083
- "completedAt": null
13084
- }
13085
- }
13373
+ "name": "kind",
13374
+ "type": "'trap' | 'chevaux' | 'rolling_log' | 'boulder'",
13375
+ "desc": "必填。器械种类:trap 陷阱 / chevaux 拒马 / rolling_log 滚木 / boulder 擂石;缺失或未知返回 INVALID_PARAMS。"
13086
13376
  },
13087
13377
  {
13088
- "op": 2000,
13089
- "push": true,
13090
- "data": {
13091
- "reason": "build_queued",
13092
- "build": {
13093
- "id": "8d0f7790-8536-51ef-a5ef-f18bd2a01b8f",
13094
- "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
13095
- "kind": "lumber_mill",
13096
- "status": "queued",
13097
- "level": 1,
13098
- "toLevel": null,
13099
- "initiator": "player",
13100
- "startedAt": "2026-09-25T08:00:30.000Z",
13101
- "dueAt": null,
13102
- "completedAt": null
13103
- }
13104
- }
13378
+ "name": "count",
13379
+ "type": "number",
13380
+ "desc": "必填。件数(正整数,且与库存 + 在造 + 排队合计不超过城墙等级 × 60);成本 = 单件成本 × 件数。"
13105
13381
  },
13106
13382
  {
13107
- "op": 2000,
13108
- "push": true,
13109
- "data": {
13110
- "reason": "build_completed",
13111
- "build": {
13112
- "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
13113
- "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
13114
- "kind": "farm",
13115
- "status": "completed",
13116
- "level": 1,
13117
- "toLevel": null,
13118
- "initiator": "agent",
13119
- "startedAt": "2026-09-25T08:00:00.000Z",
13120
- "dueAt": "2026-09-25T08:01:00.000Z",
13121
- "completedAt": "2026-09-25T08:01:05.000Z"
13122
- }
13123
- }
13383
+ "name": "cityId",
13384
+ "type": "string",
13385
+ "desc": "可选。在哪座城打造(缺省主城);城墙等级、库存与扣资源都按该城。"
13124
13386
  },
13125
13387
  {
13126
- "op": 2000,
13127
- "push": true,
13128
- "data": {
13129
- "reason": "build_cancelled",
13130
- "build": {
13131
- "id": "8d0f7790-8536-51ef-a5ef-f18bd2a01b8f",
13132
- "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
13133
- "kind": "lumber_mill",
13134
- "status": "cancelled",
13135
- "level": 1,
13136
- "toLevel": null,
13137
- "initiator": "player",
13138
- "startedAt": "2026-09-25T08:00:30.000Z",
13139
- "dueAt": null,
13140
- "completedAt": null
13141
- }
13142
- }
13388
+ "name": "cityId",
13389
+ "type": "string",
13390
+ "desc": "可选(v24,AISLG-58)。要操作的城池 id(GET_STATE 响应的 cities[].id);缺省 = 主城(账号创建最早的城),旧客户端不受影响。非本账号名下的城或格式不对返回 INVALID_PARAMS。每座城的资源 / 人口 / 仓储 / 建造与征兵队列 / 驻军各自独立;出征、侦察从该城出发、扣减该城驻军。取消类协议(CANCEL_BUILD / CANCEL_RECRUIT)按条目所属城池定位,无需传 cityId。"
13143
13391
  }
13144
13392
  ],
13145
- "agentNote": "完成时间不保证精确:Worker 按到期时间结算,存在正常延迟;对时间敏感的决策用 GET_STATE 查询权威状态。"
13146
- },
13147
- {
13148
- "op": 2001,
13149
- "kind": "push",
13150
- "name": "PUSH_AGENT_STATUS",
13151
- "title": "推送:Agent 在线状态变化",
13152
- "summary": "该账号的 Agent 在线状态发生**翻转**(首个 Agent 连接上线 / 最后一个 Agent 连接离线)时,推送给账号所有在线连接(v21 起翻转才推,多开连接的增减不再逐次推送;eventId 用于多连接去重)。",
13153
13393
  "dataFields": [
13154
13394
  {
13155
- "name": "online",
13156
- "type": "boolean",
13157
- "desc": "推送时刻该账号是否存在在线的 Agent 连接(账号级聚合,非单连接)。"
13395
+ "name": "craft",
13396
+ "type": "object",
13397
+ "desc": "新建的打造条目 { id, cityId, kind, count, status, initiator, cost 成本快照, unitSeconds 单件基准秒数, startedAt, dueAt(排队为 null), completedAt }。"
13158
13398
  },
13159
13399
  {
13160
- "name": "connectionCount",
13161
- "type": "number",
13162
- "desc": "推送时刻该账号的在线连接数(v21 新增,含玩家与 Agent 连接;非翻转的连接数变化不推送,精确值以重新登录或 GET_AGENT_INFO 为准)。"
13400
+ "name": "stock",
13401
+ "type": "object",
13402
+ "desc": "发起后该城已入库的四种器械件数(不含在造 / 排队)。"
13163
13403
  },
13164
13404
  {
13165
- "name": "at",
13166
- "type": "string",
13167
- "desc": "推送时间(ISO 8601)。"
13405
+ "name": "cap",
13406
+ "type": "number",
13407
+ "desc": "该城库存上限(城墙等级 × 60)。"
13168
13408
  }
13169
13409
  ],
13410
+ "errors": [
13411
+ "INVALID_PARAMS",
13412
+ "WALL_NOT_BUILT",
13413
+ "DEFENSE_STOCK_FULL",
13414
+ "DEFENSE_QUEUE_FULL",
13415
+ "INSUFFICIENT_RESOURCES"
13416
+ ],
13170
13417
  "examples": [
13171
13418
  {
13172
- "op": 2001,
13173
- "push": true,
13174
- "data": {
13175
- "online": true,
13176
- "connectionCount": 1,
13177
- "at": "2026-09-25T08:00:10.123Z"
13178
- }
13419
+ "caption": "打造 10 件陷阱(约 50s 后完成)",
13420
+ "request": {
13421
+ "op": 117,
13422
+ "seq": 21,
13423
+ "data": {
13424
+ "kind": "trap",
13425
+ "count": 10
13426
+ }
13427
+ },
13428
+ "responses": [
13429
+ {
13430
+ "op": 117,
13431
+ "seq": 21,
13432
+ "ok": true,
13433
+ "data": {
13434
+ "craft": {
13435
+ "id": "3f7c9a1e-2d4b-4c6a-9e8f-1a2b3c4d5e6f",
13436
+ "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
13437
+ "kind": "trap",
13438
+ "count": 10,
13439
+ "status": "crafting",
13440
+ "initiator": "player",
13441
+ "cost": {
13442
+ "gold": 200,
13443
+ "wood": 600,
13444
+ "food": 0,
13445
+ "stone": 0,
13446
+ "iron": 400
13447
+ },
13448
+ "unitSeconds": 5,
13449
+ "startedAt": "2026-09-25T08:00:00.000Z",
13450
+ "dueAt": "2026-09-25T08:00:50.000Z",
13451
+ "completedAt": null
13452
+ },
13453
+ "stock": {
13454
+ "trap": 0,
13455
+ "chevaux": 0,
13456
+ "rolling_log": 0,
13457
+ "boulder": 0
13458
+ },
13459
+ "cap": 600
13460
+ }
13461
+ }
13462
+ ]
13179
13463
  },
13180
13464
  {
13181
- "op": 2001,
13182
- "push": true,
13183
- "data": {
13184
- "online": false,
13185
- "connectionCount": 0,
13186
- "at": "2026-09-25T09:00:00.000Z"
13187
- }
13465
+ "caption": "超出库存上限(城墙 10 级、已入库 590、在造 20,再下 10 件)",
13466
+ "request": {
13467
+ "op": 117,
13468
+ "seq": 22,
13469
+ "data": {
13470
+ "kind": "chevaux",
13471
+ "count": 10
13472
+ }
13473
+ },
13474
+ "responses": [
13475
+ {
13476
+ "op": 117,
13477
+ "seq": 22,
13478
+ "ok": false,
13479
+ "error": {
13480
+ "code": "DEFENSE_STOCK_FULL",
13481
+ "message": "器械库存已达上限(城墙等级 × 60,四种器械共用),先把库存用在守城或升级城墙"
13482
+ },
13483
+ "data": {
13484
+ "cap": 600,
13485
+ "stock": 590,
13486
+ "pending": 20
13487
+ }
13488
+ }
13489
+ ]
13188
13490
  }
13189
13491
  ],
13190
- "agentNote": "收到 online=false 表示该账号的全部 Agent 连接都已离线。多连接去重用帧顶层的 eventId。"
13492
+ "agentNote": "守城器械只在被攻打时自动消耗,不会被掠夺。被打前先补库存:城墙 10 级囤满 600 件约等于守军多两成战力。四种按威胁配比:对手步兵多造陷阱、骑兵多造拒马、带冲车必须备擂石、通用近战压力造滚木。队列满了(1 在造 + 2 排队)先等或取消。"
13191
13493
  },
13192
13494
  {
13193
- "op": 2002,
13194
- "kind": "push",
13195
- "name": "PUSH_CITY_STATE",
13196
- "title": "推送:城池级状态变化",
13197
- "summary": "城池级状态变化时推送给该账号所有在线连接(发起连接除外):city_renamed=城池改名(RENAME_CITY)、account_reset=账号数据被 RESET_ACCOUNT 重置(v9,重置后全部游戏数据回到开号初始状态)、city_discarded=分城被放弃(DISCARD_CITY,v57;推送只带 cityId,收到后用 GET_STATE 刷新城池列表)。建造队列相关变化走 PUSH_BUILD_STATE。推送只携带变化摘要,完整现状用 GET_STATE 查询。",
13198
- "dataFields": [
13199
- {
13200
- "name": "reason",
13201
- "type": "'city_renamed' | 'account_reset' | 'city_discarded'",
13202
- "desc": "触发本次推送的状态变化。"
13203
- },
13495
+ "op": 118,
13496
+ "kind": "request",
13497
+ "name": "CANCEL_DEFENSE_CRAFT",
13498
+ "title": "取消打造(v73,AISLG-193)",
13499
+ "preAuth": false,
13500
+ "summary": "取消排队中(queued)或打造中(crafting)的器械条目:按发起时的成本快照全额返还到该城,库存不变;该城排队的下一条立即开工(同事务激活,推送 craft_started)。与 Worker 到点完成按条件守卫并发,先翻转状态者生效。",
13501
+ "requestFields": [
13204
13502
  {
13205
- "name": "cityId",
13503
+ "name": "craftId",
13206
13504
  "type": "string",
13207
- "desc": "城池 UUID。"
13208
- },
13505
+ "desc": "必填。要取消的打造条目 id(GET_STATE 的 city.defenses.queue 中条目的 id);缺失或格式非法返回 INVALID_PARAMS。"
13506
+ }
13507
+ ],
13508
+ "dataFields": [
13209
13509
  {
13210
- "name": "name",
13211
- "type": "string",
13212
- "desc": "reason=city_renamed 时的新城池名。"
13510
+ "name": "craft",
13511
+ "type": "object",
13512
+ "desc": "被取消的打造条目(status=cancelled,completedAt 为 null)。"
13213
13513
  }
13214
13514
  ],
13515
+ "errors": [
13516
+ "INVALID_PARAMS",
13517
+ "DEFENSE_NOT_CANCELLABLE"
13518
+ ],
13215
13519
  "examples": [
13216
13520
  {
13217
- "op": 2002,
13218
- "push": true,
13219
- "data": {
13220
- "reason": "city_renamed",
13221
- "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
13521
+ "caption": "取消进行中的打造",
13522
+ "request": {
13523
+ "op": 118,
13524
+ "seq": 23,
13525
+ "data": {
13526
+ "craftId": "3f7c9a1e-2d4b-4c6a-9e8f-1a2b3c4d5e6f"
13527
+ }
13528
+ },
13529
+ "responses": [
13530
+ {
13531
+ "op": 118,
13532
+ "seq": 23,
13533
+ "ok": true,
13534
+ "data": {
13535
+ "craft": {
13536
+ "id": "3f7c9a1e-2d4b-4c6a-9e8f-1a2b3c4d5e6f",
13537
+ "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
13538
+ "kind": "trap",
13539
+ "count": 10,
13540
+ "status": "cancelled",
13541
+ "initiator": "player",
13542
+ "cost": {
13543
+ "gold": 200,
13544
+ "wood": 600,
13545
+ "food": 0,
13546
+ "stone": 0,
13547
+ "iron": 400
13548
+ },
13549
+ "unitSeconds": 5,
13550
+ "startedAt": "2026-09-25T08:00:00.000Z",
13551
+ "dueAt": null,
13552
+ "completedAt": null
13553
+ }
13554
+ }
13555
+ }
13556
+ ]
13557
+ }
13558
+ ],
13559
+ "agentNote": "取消全额返还,但会丢掉这段时间的进度;只是缺资源的话优先等完成,别反复取消重下。"
13560
+ },
13561
+ {
13562
+ "op": 119,
13563
+ "kind": "request",
13564
+ "name": "DISMISS_ASSIST",
13565
+ "title": "召回 / 遣返协防部队(v74,AISLG-194)",
13566
+ "preAuth": false,
13567
+ "summary": "让一支驻扎在盟友城里的协防部队回出发城:派出方随时可以召回,城主可以遣返任意一支驻扎在自己城里的协防部队。部队原路返回(行军时长按两地距离与编队速度计算,驿站不加速),到达后并回出发城驻军;途中可以被 RECALL_MARCH 折返(折返仍是回出发城)。每座城最多接收 5 支协防部队,同一账号对同一座城最多 1 支;退盟 / 被踢 / 解散与城主放弃分城时相关协防部队自动遣返(事件 assist_returned,cause = ally_left / city_discarded);分城被占领要求守方全灭,协防部队随城覆灭,派出方收到 assist_returned(cause = wiped,troops 为空、returning 为 null,没有返程行军)。",
13568
+ "requestFields": [
13569
+ {
13570
+ "name": "assistId",
13571
+ "type": "string",
13572
+ "desc": "必填。协防记录 id:派出方看 GET_STATE 的 city.assistOut,城主看 city.assistIn(盟友看 GET_TILE 详情的 assists)。"
13573
+ }
13574
+ ],
13575
+ "dataFields": [
13576
+ {
13577
+ "name": "marchId",
13578
+ "type": "string | null",
13579
+ "desc": "返程行军 id(可用 RECALL_MARCH 再折返);部队已不在(城 / 账号被重置)为 null。"
13580
+ },
13581
+ {
13582
+ "name": "assistId",
13583
+ "type": "string",
13584
+ "desc": "被召回 / 遣返的协防记录 id。"
13585
+ }
13586
+ ],
13587
+ "errors": [
13588
+ "INVALID_PARAMS",
13589
+ "ASSIST_NOT_FOUND"
13590
+ ],
13591
+ "examples": [
13592
+ {
13593
+ "caption": "城主遣返一支协防部队(或派出方召回)",
13594
+ "request": {
13595
+ "op": 119,
13596
+ "seq": 31,
13597
+ "data": {
13598
+ "assistId": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d"
13599
+ }
13600
+ },
13601
+ "responses": [
13602
+ {
13603
+ "op": 119,
13604
+ "seq": 31,
13605
+ "ok": true,
13606
+ "data": {
13607
+ "assistId": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d",
13608
+ "marchId": "2f1e3d4c-5b6a-4978-8c9d-0a1b2c3d4e5f"
13609
+ }
13610
+ }
13611
+ ]
13612
+ }
13613
+ ],
13614
+ "agentNote": "协防部队占派出城的校场出征名额、耗粮由派出城按野外部队 2 倍承担;守城战时与城主驻军合并参战,伤亡按开战时各兵种数量比例分摊(余数归城主)。战斗后派出方会收到一份带 assistLosses 的战报。"
13615
+ },
13616
+ {
13617
+ "op": 120,
13618
+ "kind": "request",
13619
+ "name": "GET_BATTLEFIELD",
13620
+ "title": "查询剧本战场(官渡之战,v75,AISLG-198)",
13621
+ "preAuth": false,
13622
+ "summary": "周期性的剧本战场,玩家与 Agent 通用。日程:北京时间每周二 20:00 开始报名、周三 20:00 开战、周四 20:00 结束(现实时间,不随全局时间缩放)。每周一场,剧本按周轮换:官渡之战 → 讨伐董卓 → 赤壁之战(循环),本场剧本见 event.script、下一场见 nextScript。官渡之战(script=guandu)是阵营对阵:报名要求主城官府 ≥ 5 级,选袁绍军或曹操军(一方报名人数超过另一方 1.5 倍且多 5 人以上时,人多一方暂停报名)。战场是 30×30 的独立地图,与世界地图完全隔离;中间一条河(x=15)只有 3 处渡口(y=5/15/25)能过。行军每格 60 秒现实时间,不随全局缩放。9 个据点:袁绍大营(2,15,0 分/小时,守军 ×10);曹操大营(27,15,0 分/小时,守军 ×10);白马渡口(15,5,10 分/小时,守军 ×2);延津渡口(15,15,10 分/小时,守军 ×2);官渡渡口(15,25,10 分/小时,守军 ×2);酸枣据点(7,8,10 分/小时,守军 ×2);阳武据点(7,22,10 分/小时,守军 ×2);中牟据点(22,8,10 分/小时,守军 ×2);乌巢粮仓(22,22,30 分/小时,守军 ×4)。守军 = 3 级 NPC 城守军(义兵 100 / 刀盾 30 / 弓箭 40 / 轻骑 12)× 表格倍数 × max(1, 报名人数 ÷ 20);大营按守城战(城墙 10、箭塔 10),其余按野战。报名期从主城带一支部队入场(按人口最多 3000,每人一次,开战后不能追加),入场后可拆成最多 3 队。军功 = 歼灭敌军参考战力 1:1(打 NPC 守军也算),首次打下据点额外 +200;乌巢粮仓让敌方阵营所有部队耗粮翻倍;开战时一方人数少于另一方 70% 时,人少一方据点积分 × min(1.5, 多/少)。结束时按胜负发奖(胜方 3000 金 + 四资源各 15000;败方 1000 金 + 各 5000),个人军功前 10 有额外奖励(个人军功第 1 名 6000 金 + 各 30000;第 2–3 名 4000 金 + 各 20000;第 4–10 名 2500 金 + 各 12000),军功 > 0 才能领;幸存部队回主城。战场商店(军功跨场累积、换季清零):资源包 200 军功(每场限 5);武将经验 300 军功(每场限 3);刀盾兵 600 军功(每场限 2);轻骑兵 600 军功(每场限 2)。讨伐董卓(script=dongzhuo,全服合作):只有讨董联军一方,所有报名玩家都在同一边(报名时 camp 仍要传,服务端统一记为 yuan),对手是 NPC 董卓军。一条推进线 汜水关 → 虎牢关 → 洛阳,前一关打下后下一关才开放(strongholds[].unlocked)。守军 = 3 级 NPC 城守军 × 倍数 × max(1, 报名人数 ÷ 10):汜水关 ×15(城墙 10 / 箭塔 10)、虎牢关 ×40(城墙 15 / 箭塔 15,守将吕布攻击 +20% 、减伤 −20%)、洛阳 ×30(城墙 20 / 箭塔 20)。守军伤亡保留不回血。攻下洛阳即结束(胜);时间到也结束。奖励按全服最远进度领一档(军功 > 0 才能领):破汜水关 1000 金 + 四资源各 5000;破虎牢关 2000 金 + 四资源各 10000;攻下洛阳 4000 金 + 四资源各 20000;个人军功前 10 的额外奖励与官渡相同。没有玩家对抗。 赤壁之战(script=chibi):孙刘联军(yuan)对曹操军(cao),人数限制、人少补偿、胜负判定、奖励表与官渡相同;报名要求爵位大夫及以上(NOBILITY_TOO_LOW,附 required / current)。地图同为 30×30 与河(x=15,3 处渡口),双方各 4 个据点加各 1 座大营(共 10 个,见 strongholds);大营与据点守军、积分产出与官渡对应据点相同(大营守军 ×10,城墙 / 箭塔 10)。风向:开战时随机东南风(se)或西北风(nw),之后每 6 小时交替一次,切换前 30 分钟预告;event.wind = { direction, label, bonusCamp, nextAt, noticeAt }。顺风方(se 利孙刘、nw 利曹操)的远程兵种与床弩射程 +10%(战报可见)。火攻(FIRE_BATTLEFIELD_STRONGHOLD,op 139):孙刘方、东南风期间,花 300 军功,火攻与己方据点相邻(曼哈顿距离 ≤ 10)的曹方据点,立即对守军造成总生命 20% 的伤害;同一目标每 2 小时最多一次。连锁战船(CHAIN_BATTLEFIELD_STRONGHOLD,op 140):曹方给己方据点花 200 军功连锁 6 小时:守军受到的伤害 −15%,但被火攻时伤害翻倍(20% → 40%)。赤壁商店另有铁骑兵 20(直接进主城,800 军功,每场限 1 次)。",
13623
+ "requestFields": [],
13624
+ "dataFields": [
13625
+ {
13626
+ "name": "event",
13627
+ "type": "object | null",
13628
+ "desc": "当前 / 最近一场战场:{ id, script: guandu|dongzhuo|chibi, name, status: signup|active|finished, signupStartAt, startAt, endAt, camps: { yuan: { camp, name, signups, entered, score }, cao: 同结构 }, winner: yuan|cao|null, finishReason: score|base_captured|null, underdog: { camp, multiplier } | null, wind: 赤壁专有 { direction: se|nw, label, bonusCamp, nextAt, noticeAt }(其他剧本为 null) }。从未开过为 null。"
13629
+ },
13630
+ {
13631
+ "name": "nextSignupAt",
13632
+ "type": "string",
13633
+ "desc": "下一场报名开始时刻(北京时间每周二 20:00)。"
13634
+ },
13635
+ {
13636
+ "name": "nextScript",
13637
+ "type": "'guandu' | 'dongzhuo' | 'chibi'",
13638
+ "desc": "下一场的剧本(轮换预告)。"
13639
+ },
13640
+ {
13641
+ "name": "strongholds",
13642
+ "type": "array",
13643
+ "desc": "本场据点(官渡 9 个 / 讨董 3 关 / 赤壁 10 个;讨董按推进线顺序):{ id, name, kind: base|ford|post|granary, x, y, ownerCamp: yuan|cao|null(null = 中立 NPC;讨董的董卓军也是 null), pointsPerHour, garrison(全兵种计数,NPC + 玩家据守合计), garrisonPower(参考战力), wallLevel, towerLevel, firstCaptureAvailable(首占 +200 军功还没被拿过), capturedAt, unlocked(讨董:前一关未打下为 false;其他剧本恒为 true), chainUntil(赤壁曹方连锁截止,其他 null), fireNextAt(赤壁火攻冷却截止,其他 null) }。"
13644
+ },
13645
+ {
13646
+ "name": "me",
13647
+ "type": "object | null",
13648
+ "desc": "本场我的状态:{ accountId, username, camp, merit 本场军功, rank 本场名次(未入场为 null), entered, squads: [{ id, x, y, status: marching|idle|garrison, troops, targetX, targetY, targetStrongholdId, arriveAt, originX, originY, strongholdId }], cumulativeMerit 跨场军功余额 };未报名为 null。"
13649
+ },
13650
+ {
13651
+ "name": "top",
13652
+ "type": "array",
13653
+ "desc": "本场军功榜前 10:{ rank, accountId, username, camp, merit }(同分并列,军功 0 不上榜)。"
13654
+ },
13655
+ {
13656
+ "name": "shop",
13657
+ "type": "object",
13658
+ "desc": "战场商店(赤壁多一个 iron_cavalry):{ cumulativeMerit, items: [{ item: resources|hero_exp|swordsman|cavalry|iron_cavalry, label, cost, limit, bought 本场已买, reward: { resources? , heroExp?, troop?, count? } }] }。"
13659
+ },
13660
+ {
13661
+ "name": "rewards",
13662
+ "type": "object",
13663
+ "desc": "奖励表:{ winner { label, gold, resourcesEach }, loser 同结构, rankTiers: [{ label, rank, maxRank, gold, resourcesEach }], progressTiers: [{ label, progress, gold, resourcesEach }](讨董的全服进度档;其他剧本为空数组) }。"
13664
+ }
13665
+ ],
13666
+ "errors": [],
13667
+ "examples": [
13668
+ {
13669
+ "caption": "战场进行中:我在袁绍军,一支队伍正在去延津渡口",
13670
+ "request": {
13671
+ "op": 120,
13672
+ "seq": 30,
13673
+ "data": {}
13674
+ },
13675
+ "responses": [
13676
+ {
13677
+ "op": 120,
13678
+ "seq": 30,
13679
+ "ok": true,
13680
+ "data": {
13681
+ "event": {
13682
+ "id": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
13683
+ "script": "guandu",
13684
+ "name": "官渡之战",
13685
+ "status": "active",
13686
+ "signupStartAt": "2026-09-24T08:00:00.000Z",
13687
+ "startAt": "2026-09-25T08:00:00.000Z",
13688
+ "endAt": "2026-09-26T08:00:00.000Z",
13689
+ "camps": {
13690
+ "yuan": {
13691
+ "camp": "yuan",
13692
+ "name": "袁绍军",
13693
+ "signups": 12,
13694
+ "entered": 10,
13695
+ "score": 180
13696
+ },
13697
+ "cao": {
13698
+ "camp": "cao",
13699
+ "name": "曹操军",
13700
+ "signups": 15,
13701
+ "entered": 13,
13702
+ "score": 240
13703
+ }
13704
+ },
13705
+ "winner": null,
13706
+ "finishReason": null,
13707
+ "underdog": null
13708
+ },
13709
+ "nextSignupAt": "2026-10-02T08:00:00.000Z",
13710
+ "nextScript": "dongzhuo",
13711
+ "strongholds": [
13712
+ {
13713
+ "id": "ford_yanjin",
13714
+ "name": "延津渡口",
13715
+ "kind": "ford",
13716
+ "x": 15,
13717
+ "y": 15,
13718
+ "ownerCamp": "cao",
13719
+ "pointsPerHour": 10,
13720
+ "garrison": {
13721
+ "porter": 0,
13722
+ "militia": 120,
13723
+ "scout": 0,
13724
+ "pikeman": 0,
13725
+ "swordsman": 40,
13726
+ "archer": 60,
13727
+ "cavalry": 15,
13728
+ "iron_cavalry": 0,
13729
+ "supply_wagon": 0,
13730
+ "ballista": 0,
13731
+ "siege_ram": 0,
13732
+ "yulin_guard": 0,
13733
+ "danyang_soldier": 0,
13734
+ "baimao_soldier": 0,
13735
+ "huwei_guard": 0,
13736
+ "zhuge_crossbow": 0,
13737
+ "xiandeng_warrior": 0,
13738
+ "hubao_cavalry": 0,
13739
+ "xiliang_cavalry": 0
13740
+ },
13741
+ "garrisonPower": 710,
13742
+ "wallLevel": 0,
13743
+ "towerLevel": 0,
13744
+ "firstCaptureAvailable": false,
13745
+ "capturedAt": "2026-09-25T08:00:00.000Z"
13746
+ },
13747
+ "(其余 8 个据点同结构)"
13748
+ ],
13749
+ "me": {
13750
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
13751
+ "username": "alice",
13752
+ "camp": "yuan",
13753
+ "merit": 1240,
13754
+ "rank": 3,
13755
+ "entered": true,
13756
+ "squads": [
13757
+ {
13758
+ "id": "c1d2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
13759
+ "x": 14,
13760
+ "y": 15,
13761
+ "status": "marching",
13762
+ "troops": {
13763
+ "porter": 0,
13764
+ "militia": 300,
13765
+ "scout": 0,
13766
+ "pikeman": 0,
13767
+ "swordsman": 200,
13768
+ "archer": 150,
13769
+ "cavalry": 50,
13770
+ "iron_cavalry": 0,
13771
+ "supply_wagon": 0,
13772
+ "ballista": 0,
13773
+ "siege_ram": 0,
13774
+ "yulin_guard": 0,
13775
+ "danyang_soldier": 0,
13776
+ "baimao_soldier": 0,
13777
+ "huwei_guard": 0,
13778
+ "zhuge_crossbow": 0,
13779
+ "xiandeng_warrior": 0,
13780
+ "hubao_cavalry": 0,
13781
+ "xiliang_cavalry": 0
13782
+ },
13783
+ "targetX": 15,
13784
+ "targetY": 15,
13785
+ "targetStrongholdId": "ford_yanjin",
13786
+ "arriveAt": "2026-09-25T08:01:00.000Z",
13787
+ "originX": 13,
13788
+ "originY": 15,
13789
+ "strongholdId": null
13790
+ }
13791
+ ],
13792
+ "cumulativeMerit": 3600
13793
+ },
13794
+ "top": [
13795
+ {
13796
+ "rank": 1,
13797
+ "accountId": "…",
13798
+ "username": "bob",
13799
+ "camp": "cao",
13800
+ "merit": 2200
13801
+ },
13802
+ {
13803
+ "rank": 2,
13804
+ "accountId": "…",
13805
+ "username": "carol",
13806
+ "camp": "yuan",
13807
+ "merit": 1500
13808
+ },
13809
+ {
13810
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
13811
+ "username": "alice",
13812
+ "camp": "yuan",
13813
+ "merit": 1240,
13814
+ "rank": 3,
13815
+ "entered": true,
13816
+ "squads": [
13817
+ {
13818
+ "id": "c1d2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
13819
+ "x": 14,
13820
+ "y": 15,
13821
+ "status": "marching",
13822
+ "troops": {
13823
+ "porter": 0,
13824
+ "militia": 300,
13825
+ "scout": 0,
13826
+ "pikeman": 0,
13827
+ "swordsman": 200,
13828
+ "archer": 150,
13829
+ "cavalry": 50,
13830
+ "iron_cavalry": 0,
13831
+ "supply_wagon": 0,
13832
+ "ballista": 0,
13833
+ "siege_ram": 0,
13834
+ "yulin_guard": 0,
13835
+ "danyang_soldier": 0,
13836
+ "baimao_soldier": 0,
13837
+ "huwei_guard": 0,
13838
+ "zhuge_crossbow": 0,
13839
+ "xiandeng_warrior": 0,
13840
+ "hubao_cavalry": 0,
13841
+ "xiliang_cavalry": 0
13842
+ },
13843
+ "targetX": 15,
13844
+ "targetY": 15,
13845
+ "targetStrongholdId": "ford_yanjin",
13846
+ "arriveAt": "2026-09-25T08:01:00.000Z",
13847
+ "originX": 13,
13848
+ "originY": 15,
13849
+ "strongholdId": null
13850
+ }
13851
+ ],
13852
+ "cumulativeMerit": 3600
13853
+ }
13854
+ ],
13855
+ "shop": {
13856
+ "cumulativeMerit": 3600,
13857
+ "items": [
13858
+ {
13859
+ "item": "resources",
13860
+ "label": "资源包",
13861
+ "cost": 200,
13862
+ "limit": 5,
13863
+ "bought": 0,
13864
+ "reward": {
13865
+ "resources": {
13866
+ "gold": 0,
13867
+ "wood": 10000,
13868
+ "food": 10000,
13869
+ "stone": 10000,
13870
+ "iron": 10000
13871
+ }
13872
+ }
13873
+ },
13874
+ {
13875
+ "item": "hero_exp",
13876
+ "label": "武将经验",
13877
+ "cost": 300,
13878
+ "limit": 3,
13879
+ "bought": 0,
13880
+ "reward": {
13881
+ "heroExp": 5000
13882
+ }
13883
+ },
13884
+ {
13885
+ "item": "swordsman",
13886
+ "label": "刀盾兵",
13887
+ "cost": 600,
13888
+ "limit": 2,
13889
+ "bought": 0,
13890
+ "reward": {
13891
+ "troop": "swordsman",
13892
+ "count": 100
13893
+ }
13894
+ },
13895
+ {
13896
+ "item": "cavalry",
13897
+ "label": "轻骑兵",
13898
+ "cost": 600,
13899
+ "limit": 2,
13900
+ "bought": 0,
13901
+ "reward": {
13902
+ "troop": "cavalry",
13903
+ "count": 50
13904
+ }
13905
+ }
13906
+ ]
13907
+ },
13908
+ "rewards": {
13909
+ "winner": {
13910
+ "label": "胜方每人",
13911
+ "gold": 3000,
13912
+ "resourcesEach": 15000
13913
+ },
13914
+ "loser": {
13915
+ "label": "败方每人",
13916
+ "gold": 1000,
13917
+ "resourcesEach": 5000
13918
+ },
13919
+ "rankTiers": [
13920
+ {
13921
+ "label": "个人军功第 1 名",
13922
+ "maxRank": 1,
13923
+ "gold": 6000,
13924
+ "resourcesEach": 30000
13925
+ },
13926
+ {
13927
+ "label": "第 2–3 名",
13928
+ "maxRank": 3,
13929
+ "gold": 4000,
13930
+ "resourcesEach": 20000
13931
+ },
13932
+ {
13933
+ "label": "第 4–10 名",
13934
+ "maxRank": 10,
13935
+ "gold": 2500,
13936
+ "resourcesEach": 12000
13937
+ }
13938
+ ],
13939
+ "progressTiers": []
13940
+ }
13941
+ }
13942
+ }
13943
+ ]
13944
+ }
13945
+ ],
13946
+ "agentNote": "先看 event.script 与 event.status:signup 期只能报名 / 入场,active 才能行军与攻打。行军目标用 strongholds 的 id(MARCH_BATTLEFIELD_SQUAD 会按据点坐标走最短路径);河只有 3 处渡口,先取渡口再渡河。攻打前用 garrisonPower 与自己的队伍战力对比,有城墙的据点按守城战(城墙 + 箭塔),没有把握先打渡口 / 普通据点。军功来自歼灭敌军(打 NPC 也算),首占据点 +200;乌巢(granary_wuchao)价值 30 分/小时并让敌方耗粮翻倍,适合偷袭。结束奖励自动入账,军功可立刻在战场商店换资源 / 武将经验 / 兵。讨董:只看 unlocked 为 true 的关卡,先打汜水关再虎牢关,洛阳最后;赤壁:先看 event.wind,东南风时孙刘方可以火攻,西北风时曹方可以连锁,留意预告的切换时刻。"
13947
+ },
13948
+ {
13949
+ "op": 121,
13950
+ "kind": "request",
13951
+ "name": "SIGNUP_BATTLEFIELD",
13952
+ "title": "报名剧本战场(v75,AISLG-198;v80 讨董 / 赤壁)",
13953
+ "preAuth": false,
13954
+ "summary": "在报名期(北京时间每周二 20:00 开始报名、周三 20:00 开战、周四 20:00 结束(现实时间,不随全局时间缩放))报名:主城官府 ≥ 5 级;同一场只能报一次,阵营选定后不能改。官渡 / 赤壁:一方报名人数超过另一方 1.5 倍且多出 5 人以上时,人多的一方暂停报名(返回 BATTLEFIELD_CAMP_FULL,附 count / otherCount / limit);赤壁另需爵位大夫及以上(NOBILITY_TOO_LOW,附 required / current)。讨伐董卓是单阵营合作本,所有报名玩家都记为讨董联军(yuan),不做人数失衡判断。报名只占阵营人数,不带兵;带兵用 ENTER_BATTLEFIELD(开战前)。",
13955
+ "requestFields": [
13956
+ {
13957
+ "name": "camp",
13958
+ "type": "'yuan' | 'cao'",
13959
+ "desc": "必填。袁绍军 yuan / 曹操军 cao(讨董场统一记为 yuan,此字段仍需传合法值)。"
13960
+ }
13961
+ ],
13962
+ "dataFields": [
13963
+ {
13964
+ "name": "event",
13965
+ "type": "object | null",
13966
+ "desc": "当前 / 最近一场战场:{ id, script: guandu|dongzhuo|chibi, name, status: signup|active|finished, signupStartAt, startAt, endAt, camps: { yuan: { camp, name, signups, entered, score }, cao: 同结构 }, winner: yuan|cao|null, finishReason: score|base_captured|null, underdog: { camp, multiplier } | null, wind: 赤壁专有 { direction: se|nw, label, bonusCamp, nextAt, noticeAt }(其他剧本为 null) }。从未开过为 null。"
13967
+ },
13968
+ {
13969
+ "name": "nextSignupAt",
13970
+ "type": "string",
13971
+ "desc": "下一场报名开始时刻(北京时间每周二 20:00)。"
13972
+ },
13973
+ {
13974
+ "name": "nextScript",
13975
+ "type": "'guandu' | 'dongzhuo' | 'chibi'",
13976
+ "desc": "下一场的剧本(轮换预告)。"
13977
+ },
13978
+ {
13979
+ "name": "strongholds",
13980
+ "type": "array",
13981
+ "desc": "本场据点(官渡 9 个 / 讨董 3 关 / 赤壁 10 个;讨董按推进线顺序):{ id, name, kind: base|ford|post|granary, x, y, ownerCamp: yuan|cao|null(null = 中立 NPC;讨董的董卓军也是 null), pointsPerHour, garrison(全兵种计数,NPC + 玩家据守合计), garrisonPower(参考战力), wallLevel, towerLevel, firstCaptureAvailable(首占 +200 军功还没被拿过), capturedAt, unlocked(讨董:前一关未打下为 false;其他剧本恒为 true), chainUntil(赤壁曹方连锁截止,其他 null), fireNextAt(赤壁火攻冷却截止,其他 null) }。"
13982
+ },
13983
+ {
13984
+ "name": "me",
13985
+ "type": "object | null",
13986
+ "desc": "本场我的状态:{ accountId, username, camp, merit 本场军功, rank 本场名次(未入场为 null), entered, squads: [{ id, x, y, status: marching|idle|garrison, troops, targetX, targetY, targetStrongholdId, arriveAt, originX, originY, strongholdId }], cumulativeMerit 跨场军功余额 };未报名为 null。"
13987
+ },
13988
+ {
13989
+ "name": "top",
13990
+ "type": "array",
13991
+ "desc": "本场军功榜前 10:{ rank, accountId, username, camp, merit }(同分并列,军功 0 不上榜)。"
13992
+ },
13993
+ {
13994
+ "name": "shop",
13995
+ "type": "object",
13996
+ "desc": "战场商店(赤壁多一个 iron_cavalry):{ cumulativeMerit, items: [{ item: resources|hero_exp|swordsman|cavalry|iron_cavalry, label, cost, limit, bought 本场已买, reward: { resources? , heroExp?, troop?, count? } }] }。"
13997
+ },
13998
+ {
13999
+ "name": "rewards",
14000
+ "type": "object",
14001
+ "desc": "奖励表:{ winner { label, gold, resourcesEach }, loser 同结构, rankTiers: [{ label, rank, maxRank, gold, resourcesEach }], progressTiers: [{ label, progress, gold, resourcesEach }](讨董的全服进度档;其他剧本为空数组) }。"
14002
+ }
14003
+ ],
14004
+ "errors": [
14005
+ "INVALID_PARAMS",
14006
+ "BATTLEFIELD_SIGNUP_CLOSED",
14007
+ "BATTLEFIELD_ALREADY_JOINED",
14008
+ "BATTLEFIELD_GOVERNMENT_TOO_LOW",
14009
+ "BATTLEFIELD_CAMP_FULL",
14010
+ "NOBILITY_TOO_LOW"
14011
+ ],
14012
+ "examples": [
14013
+ {
14014
+ "caption": "报名袁绍军",
14015
+ "request": {
14016
+ "op": 121,
14017
+ "seq": 31,
14018
+ "data": {
14019
+ "camp": "yuan"
14020
+ }
14021
+ },
14022
+ "responses": [
14023
+ {
14024
+ "op": 121,
14025
+ "seq": 31,
14026
+ "ok": true,
14027
+ "data": {
14028
+ "event": {
14029
+ "id": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
14030
+ "script": "guandu",
14031
+ "name": "官渡之战",
14032
+ "status": "active",
14033
+ "signupStartAt": "2026-09-24T08:00:00.000Z",
14034
+ "startAt": "2026-09-25T08:00:00.000Z",
14035
+ "endAt": "2026-09-26T08:00:00.000Z",
14036
+ "camps": {
14037
+ "yuan": {
14038
+ "camp": "yuan",
14039
+ "name": "袁绍军",
14040
+ "signups": 12,
14041
+ "entered": 10,
14042
+ "score": 180
14043
+ },
14044
+ "cao": {
14045
+ "camp": "cao",
14046
+ "name": "曹操军",
14047
+ "signups": 15,
14048
+ "entered": 13,
14049
+ "score": 240
14050
+ }
14051
+ },
14052
+ "winner": null,
14053
+ "finishReason": null,
14054
+ "underdog": null
14055
+ },
14056
+ "me": {
14057
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
14058
+ "username": "alice",
14059
+ "camp": "yuan",
14060
+ "merit": 0,
14061
+ "rank": null,
14062
+ "entered": false,
14063
+ "squads": [],
14064
+ "cumulativeMerit": 3600
14065
+ }
14066
+ }
14067
+ }
14068
+ ]
14069
+ }
14070
+ ],
14071
+ "agentNote": "报名前先 GET_BATTLEFIELD 看双方 signups,选人少的一方通常能吃到人少补偿;报名后记得在开战前 ENTER_BATTLEFIELD 带兵入场,否则开战后无法入场。"
14072
+ },
14073
+ {
14074
+ "op": 122,
14075
+ "kind": "request",
14076
+ "name": "ENTER_BATTLEFIELD",
14077
+ "title": "带部队入场(v75,AISLG-198)",
14078
+ "preAuth": false,
14079
+ "summary": "报名后、开战前,从主城带一支部队进入战场:按人口计最多 3000(铁骑兵 3、辎重车 6……),部队从主城驻军扣除,战场结束后幸存部队回到主城。每人每场只能入场一次,开战后不能追加兵力。入场后队伍出现在自己大营旁,可用 SPLIT_BATTLEFIELD_SQUAD 拆成最多 3 队。",
14080
+ "requestFields": [
14081
+ {
14082
+ "name": "troops",
14083
+ "type": "object",
14084
+ "desc": "必填。按兵种数量(非负整数,至少 1 个单位):{ militia, swordsman, archer, cavalry, ... },键集同 MARCH.troops;按人口合计 ≤ 3000。"
14085
+ }
14086
+ ],
14087
+ "dataFields": [
14088
+ {
14089
+ "name": "event",
14090
+ "type": "object | null",
14091
+ "desc": "当前 / 最近一场战场:{ id, script: guandu|dongzhuo|chibi, name, status: signup|active|finished, signupStartAt, startAt, endAt, camps: { yuan: { camp, name, signups, entered, score }, cao: 同结构 }, winner: yuan|cao|null, finishReason: score|base_captured|null, underdog: { camp, multiplier } | null, wind: 赤壁专有 { direction: se|nw, label, bonusCamp, nextAt, noticeAt }(其他剧本为 null) }。从未开过为 null。"
14092
+ },
14093
+ {
14094
+ "name": "nextSignupAt",
14095
+ "type": "string",
14096
+ "desc": "下一场报名开始时刻(北京时间每周二 20:00)。"
14097
+ },
14098
+ {
14099
+ "name": "nextScript",
14100
+ "type": "'guandu' | 'dongzhuo' | 'chibi'",
14101
+ "desc": "下一场的剧本(轮换预告)。"
14102
+ },
14103
+ {
14104
+ "name": "strongholds",
14105
+ "type": "array",
14106
+ "desc": "本场据点(官渡 9 个 / 讨董 3 关 / 赤壁 10 个;讨董按推进线顺序):{ id, name, kind: base|ford|post|granary, x, y, ownerCamp: yuan|cao|null(null = 中立 NPC;讨董的董卓军也是 null), pointsPerHour, garrison(全兵种计数,NPC + 玩家据守合计), garrisonPower(参考战力), wallLevel, towerLevel, firstCaptureAvailable(首占 +200 军功还没被拿过), capturedAt, unlocked(讨董:前一关未打下为 false;其他剧本恒为 true), chainUntil(赤壁曹方连锁截止,其他 null), fireNextAt(赤壁火攻冷却截止,其他 null) }。"
14107
+ },
14108
+ {
14109
+ "name": "me",
14110
+ "type": "object | null",
14111
+ "desc": "本场我的状态:{ accountId, username, camp, merit 本场军功, rank 本场名次(未入场为 null), entered, squads: [{ id, x, y, status: marching|idle|garrison, troops, targetX, targetY, targetStrongholdId, arriveAt, originX, originY, strongholdId }], cumulativeMerit 跨场军功余额 };未报名为 null。"
14112
+ },
14113
+ {
14114
+ "name": "top",
14115
+ "type": "array",
14116
+ "desc": "本场军功榜前 10:{ rank, accountId, username, camp, merit }(同分并列,军功 0 不上榜)。"
14117
+ },
14118
+ {
14119
+ "name": "shop",
14120
+ "type": "object",
14121
+ "desc": "战场商店(赤壁多一个 iron_cavalry):{ cumulativeMerit, items: [{ item: resources|hero_exp|swordsman|cavalry|iron_cavalry, label, cost, limit, bought 本场已买, reward: { resources? , heroExp?, troop?, count? } }] }。"
14122
+ },
14123
+ {
14124
+ "name": "rewards",
14125
+ "type": "object",
14126
+ "desc": "奖励表:{ winner { label, gold, resourcesEach }, loser 同结构, rankTiers: [{ label, rank, maxRank, gold, resourcesEach }], progressTiers: [{ label, progress, gold, resourcesEach }](讨董的全服进度档;其他剧本为空数组) }。"
14127
+ }
14128
+ ],
14129
+ "errors": [
14130
+ "INVALID_PARAMS",
14131
+ "BATTLEFIELD_NOT_JOINED",
14132
+ "BATTLEFIELD_ENTRY_CLOSED",
14133
+ "BATTLEFIELD_ALREADY_ENTERED",
14134
+ "BATTLEFIELD_POPULATION_LIMIT",
14135
+ "INSUFFICIENT_TROOPS"
14136
+ ],
14137
+ "examples": [
14138
+ {
14139
+ "caption": "带 700 单位入场",
14140
+ "request": {
14141
+ "op": 122,
14142
+ "seq": 32,
14143
+ "data": {
14144
+ "troops": {
14145
+ "militia": 300,
14146
+ "swordsman": 200,
14147
+ "archer": 150,
14148
+ "cavalry": 50
14149
+ }
14150
+ }
14151
+ },
14152
+ "responses": [
14153
+ {
14154
+ "op": 122,
14155
+ "seq": 32,
14156
+ "ok": true,
14157
+ "data": {
14158
+ "me": {
14159
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
14160
+ "username": "alice",
14161
+ "camp": "yuan",
14162
+ "merit": 1240,
14163
+ "rank": 3,
14164
+ "entered": true,
14165
+ "squads": [
14166
+ {
14167
+ "id": "c1d2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
14168
+ "x": 14,
14169
+ "y": 15,
14170
+ "status": "idle",
14171
+ "troops": {
14172
+ "porter": 0,
14173
+ "militia": 300,
14174
+ "scout": 0,
14175
+ "pikeman": 0,
14176
+ "swordsman": 200,
14177
+ "archer": 150,
14178
+ "cavalry": 50,
14179
+ "iron_cavalry": 0,
14180
+ "supply_wagon": 0,
14181
+ "ballista": 0,
14182
+ "siege_ram": 0,
14183
+ "yulin_guard": 0,
14184
+ "danyang_soldier": 0,
14185
+ "baimao_soldier": 0,
14186
+ "huwei_guard": 0,
14187
+ "zhuge_crossbow": 0,
14188
+ "xiandeng_warrior": 0,
14189
+ "hubao_cavalry": 0,
14190
+ "xiliang_cavalry": 0
14191
+ },
14192
+ "targetX": null,
14193
+ "targetY": null,
14194
+ "targetStrongholdId": null,
14195
+ "arriveAt": null,
14196
+ "originX": 13,
14197
+ "originY": 15,
14198
+ "strongholdId": null
14199
+ }
14200
+ ],
14201
+ "cumulativeMerit": 3600
14202
+ }
14203
+ }
14204
+ }
14205
+ ]
14206
+ }
14207
+ ],
14208
+ "agentNote": "入场前用 GET_STATE 的 city.army 确认兵够,并算清人口(铁骑兵 3 / 辎重车 6 / 床弩 3 / 冲车 5)。全部兵力一次性带入即可,开战后无法追加;拆队是战术选择,不影响入场上限。"
14209
+ },
14210
+ {
14211
+ "op": 123,
14212
+ "kind": "request",
14213
+ "name": "SPLIT_BATTLEFIELD_SQUAD",
14214
+ "title": "拆分战场队伍(v75,AISLG-198)",
14215
+ "preAuth": false,
14216
+ "summary": "从一支队伍里分出一支新队伍(位置相同、状态待命),每人最多 3 队;行军中不能拆。新队伍与原队伍都必须至少剩 1 个单位。",
14217
+ "requestFields": [
14218
+ {
14219
+ "name": "squadId",
14220
+ "type": "string",
14221
+ "desc": "必填。要拆分的队伍 id(GET_BATTLEFIELD 的 me.squads)。"
14222
+ },
14223
+ {
14224
+ "name": "troops",
14225
+ "type": "object",
14226
+ "desc": "必填。从原队伍分出的兵种数量,不能超过原队伍现有数量。"
14227
+ }
14228
+ ],
14229
+ "dataFields": [
14230
+ {
14231
+ "name": "event",
14232
+ "type": "object | null",
14233
+ "desc": "当前 / 最近一场战场:{ id, script: guandu|dongzhuo|chibi, name, status: signup|active|finished, signupStartAt, startAt, endAt, camps: { yuan: { camp, name, signups, entered, score }, cao: 同结构 }, winner: yuan|cao|null, finishReason: score|base_captured|null, underdog: { camp, multiplier } | null, wind: 赤壁专有 { direction: se|nw, label, bonusCamp, nextAt, noticeAt }(其他剧本为 null) }。从未开过为 null。"
14234
+ },
14235
+ {
14236
+ "name": "nextSignupAt",
14237
+ "type": "string",
14238
+ "desc": "下一场报名开始时刻(北京时间每周二 20:00)。"
14239
+ },
14240
+ {
14241
+ "name": "nextScript",
14242
+ "type": "'guandu' | 'dongzhuo' | 'chibi'",
14243
+ "desc": "下一场的剧本(轮换预告)。"
14244
+ },
14245
+ {
14246
+ "name": "strongholds",
14247
+ "type": "array",
14248
+ "desc": "本场据点(官渡 9 个 / 讨董 3 关 / 赤壁 10 个;讨董按推进线顺序):{ id, name, kind: base|ford|post|granary, x, y, ownerCamp: yuan|cao|null(null = 中立 NPC;讨董的董卓军也是 null), pointsPerHour, garrison(全兵种计数,NPC + 玩家据守合计), garrisonPower(参考战力), wallLevel, towerLevel, firstCaptureAvailable(首占 +200 军功还没被拿过), capturedAt, unlocked(讨董:前一关未打下为 false;其他剧本恒为 true), chainUntil(赤壁曹方连锁截止,其他 null), fireNextAt(赤壁火攻冷却截止,其他 null) }。"
14249
+ },
14250
+ {
14251
+ "name": "me",
14252
+ "type": "object | null",
14253
+ "desc": "本场我的状态:{ accountId, username, camp, merit 本场军功, rank 本场名次(未入场为 null), entered, squads: [{ id, x, y, status: marching|idle|garrison, troops, targetX, targetY, targetStrongholdId, arriveAt, originX, originY, strongholdId }], cumulativeMerit 跨场军功余额 };未报名为 null。"
14254
+ },
14255
+ {
14256
+ "name": "top",
14257
+ "type": "array",
14258
+ "desc": "本场军功榜前 10:{ rank, accountId, username, camp, merit }(同分并列,军功 0 不上榜)。"
14259
+ },
14260
+ {
14261
+ "name": "shop",
14262
+ "type": "object",
14263
+ "desc": "战场商店(赤壁多一个 iron_cavalry):{ cumulativeMerit, items: [{ item: resources|hero_exp|swordsman|cavalry|iron_cavalry, label, cost, limit, bought 本场已买, reward: { resources? , heroExp?, troop?, count? } }] }。"
14264
+ },
14265
+ {
14266
+ "name": "rewards",
14267
+ "type": "object",
14268
+ "desc": "奖励表:{ winner { label, gold, resourcesEach }, loser 同结构, rankTiers: [{ label, rank, maxRank, gold, resourcesEach }], progressTiers: [{ label, progress, gold, resourcesEach }](讨董的全服进度档;其他剧本为空数组) }。"
14269
+ }
14270
+ ],
14271
+ "errors": [
14272
+ "INVALID_PARAMS",
14273
+ "BATTLEFIELD_SQUAD_NOT_FOUND",
14274
+ "BATTLEFIELD_SQUAD_BUSY",
14275
+ "BATTLEFIELD_SQUAD_LIMIT",
14276
+ "INSUFFICIENT_TROOPS"
14277
+ ],
14278
+ "examples": [
14279
+ {
14280
+ "caption": "从主力里分出 100 骑兵当机动队",
14281
+ "request": {
14282
+ "op": 123,
14283
+ "seq": 33,
14284
+ "data": {
14285
+ "squadId": "c1d2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
14286
+ "troops": {
14287
+ "cavalry": 100
14288
+ }
14289
+ }
14290
+ },
14291
+ "responses": [
14292
+ {
14293
+ "op": 123,
14294
+ "seq": 33,
14295
+ "ok": true,
14296
+ "data": {
14297
+ "me": {
14298
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
14299
+ "username": "alice",
14300
+ "camp": "yuan",
14301
+ "merit": 1240,
14302
+ "rank": 3,
14303
+ "entered": true,
14304
+ "squads": [
14305
+ {
14306
+ "id": "c1d2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
14307
+ "x": 14,
14308
+ "y": 15,
14309
+ "status": "marching",
14310
+ "troops": {
14311
+ "porter": 0,
14312
+ "militia": 300,
14313
+ "scout": 0,
14314
+ "pikeman": 0,
14315
+ "swordsman": 200,
14316
+ "archer": 150,
14317
+ "cavalry": 50,
14318
+ "iron_cavalry": 0,
14319
+ "supply_wagon": 0,
14320
+ "ballista": 0,
14321
+ "siege_ram": 0,
14322
+ "yulin_guard": 0,
14323
+ "danyang_soldier": 0,
14324
+ "baimao_soldier": 0,
14325
+ "huwei_guard": 0,
14326
+ "zhuge_crossbow": 0,
14327
+ "xiandeng_warrior": 0,
14328
+ "hubao_cavalry": 0,
14329
+ "xiliang_cavalry": 0
14330
+ },
14331
+ "targetX": 15,
14332
+ "targetY": 15,
14333
+ "targetStrongholdId": "ford_yanjin",
14334
+ "arriveAt": "2026-09-25T08:01:00.000Z",
14335
+ "originX": 13,
14336
+ "originY": 15,
14337
+ "strongholdId": null
14338
+ },
14339
+ {
14340
+ "id": "…",
14341
+ "x": 14,
14342
+ "y": 15,
14343
+ "status": "marching",
14344
+ "troops": {
14345
+ "porter": 0,
14346
+ "militia": 300,
14347
+ "scout": 0,
14348
+ "pikeman": 0,
14349
+ "swordsman": 200,
14350
+ "archer": 150,
14351
+ "cavalry": 100,
14352
+ "iron_cavalry": 0,
14353
+ "supply_wagon": 0,
14354
+ "ballista": 0,
14355
+ "siege_ram": 0,
14356
+ "yulin_guard": 0,
14357
+ "danyang_soldier": 0,
14358
+ "baimao_soldier": 0,
14359
+ "huwei_guard": 0,
14360
+ "zhuge_crossbow": 0,
14361
+ "xiandeng_warrior": 0,
14362
+ "hubao_cavalry": 0,
14363
+ "xiliang_cavalry": 0
14364
+ },
14365
+ "targetX": 15,
14366
+ "targetY": 15,
14367
+ "targetStrongholdId": "ford_yanjin",
14368
+ "arriveAt": "2026-09-25T08:01:00.000Z",
14369
+ "originX": 13,
14370
+ "originY": 15,
14371
+ "strongholdId": null
14372
+ }
14373
+ ],
14374
+ "cumulativeMerit": 3600
14375
+ }
14376
+ }
14377
+ }
14378
+ ]
14379
+ }
14380
+ ],
14381
+ "agentNote": "拆队适合「主力攻据点 + 骑兵绕后抢乌巢 / 渡口」这类分兵。行军中不能拆,先等到达。"
14382
+ },
14383
+ {
14384
+ "op": 124,
14385
+ "kind": "request",
14386
+ "name": "MARCH_BATTLEFIELD_SQUAD",
14387
+ "title": "战场内行军 / 攻打据点(v75,AISLG-198)",
14388
+ "preAuth": false,
14389
+ "summary": "给一支待命 / 据守中的队伍下令:目标给 strongholdId(自动取据点坐标)或 x / y;每格 60 秒现实时间,河只能从 3 处渡口(y=5/15/25)通过。到达友方据点 = 入驻据守(合并守军);到达敌方 / 中立据点 = 自动开战(有城墙的据点按守城战),胜方幸存部队留守、据点易手。行军中不能再次下令。讨伐董卓的关卡未解锁(unlocked 为 false)时返回 BATTLEFIELD_STRONGHOLD_LOCKED(附 unlockAfter)。",
14390
+ "requestFields": [
14391
+ {
14392
+ "name": "squadId",
14393
+ "type": "string",
14394
+ "desc": "必填。队伍 id。"
14395
+ },
14396
+ {
14397
+ "name": "strongholdId",
14398
+ "type": "string",
14399
+ "desc": "可选(与 x / y 二选一)。目标据点 id;同时给 x / y 时必须与据点坐标一致,否则 BATTLEFIELD_TARGET_INVALID。"
14400
+ },
14401
+ {
14402
+ "name": "x",
14403
+ "type": "number",
14404
+ "desc": "可选。目标横坐标(0..29);只在没有 strongholdId 时使用,且必须与 y 同时给。"
14405
+ },
14406
+ {
14407
+ "name": "y",
14408
+ "type": "number",
14409
+ "desc": "可选。目标纵坐标(0..29);只在没有 strongholdId 时使用。"
14410
+ }
14411
+ ],
14412
+ "dataFields": [
14413
+ {
14414
+ "name": "event",
14415
+ "type": "object | null",
14416
+ "desc": "当前 / 最近一场战场:{ id, script: guandu|dongzhuo|chibi, name, status: signup|active|finished, signupStartAt, startAt, endAt, camps: { yuan: { camp, name, signups, entered, score }, cao: 同结构 }, winner: yuan|cao|null, finishReason: score|base_captured|null, underdog: { camp, multiplier } | null, wind: 赤壁专有 { direction: se|nw, label, bonusCamp, nextAt, noticeAt }(其他剧本为 null) }。从未开过为 null。"
14417
+ },
14418
+ {
14419
+ "name": "nextSignupAt",
14420
+ "type": "string",
14421
+ "desc": "下一场报名开始时刻(北京时间每周二 20:00)。"
14422
+ },
14423
+ {
14424
+ "name": "nextScript",
14425
+ "type": "'guandu' | 'dongzhuo' | 'chibi'",
14426
+ "desc": "下一场的剧本(轮换预告)。"
14427
+ },
14428
+ {
14429
+ "name": "strongholds",
14430
+ "type": "array",
14431
+ "desc": "本场据点(官渡 9 个 / 讨董 3 关 / 赤壁 10 个;讨董按推进线顺序):{ id, name, kind: base|ford|post|granary, x, y, ownerCamp: yuan|cao|null(null = 中立 NPC;讨董的董卓军也是 null), pointsPerHour, garrison(全兵种计数,NPC + 玩家据守合计), garrisonPower(参考战力), wallLevel, towerLevel, firstCaptureAvailable(首占 +200 军功还没被拿过), capturedAt, unlocked(讨董:前一关未打下为 false;其他剧本恒为 true), chainUntil(赤壁曹方连锁截止,其他 null), fireNextAt(赤壁火攻冷却截止,其他 null) }。"
14432
+ },
14433
+ {
14434
+ "name": "me",
14435
+ "type": "object | null",
14436
+ "desc": "本场我的状态:{ accountId, username, camp, merit 本场军功, rank 本场名次(未入场为 null), entered, squads: [{ id, x, y, status: marching|idle|garrison, troops, targetX, targetY, targetStrongholdId, arriveAt, originX, originY, strongholdId }], cumulativeMerit 跨场军功余额 };未报名为 null。"
14437
+ },
14438
+ {
14439
+ "name": "top",
14440
+ "type": "array",
14441
+ "desc": "本场军功榜前 10:{ rank, accountId, username, camp, merit }(同分并列,军功 0 不上榜)。"
14442
+ },
14443
+ {
14444
+ "name": "shop",
14445
+ "type": "object",
14446
+ "desc": "战场商店(赤壁多一个 iron_cavalry):{ cumulativeMerit, items: [{ item: resources|hero_exp|swordsman|cavalry|iron_cavalry, label, cost, limit, bought 本场已买, reward: { resources? , heroExp?, troop?, count? } }] }。"
14447
+ },
14448
+ {
14449
+ "name": "rewards",
14450
+ "type": "object",
14451
+ "desc": "奖励表:{ winner { label, gold, resourcesEach }, loser 同结构, rankTiers: [{ label, rank, maxRank, gold, resourcesEach }], progressTiers: [{ label, progress, gold, resourcesEach }](讨董的全服进度档;其他剧本为空数组) }。"
14452
+ }
14453
+ ],
14454
+ "errors": [
14455
+ "INVALID_PARAMS",
14456
+ "BATTLEFIELD_NOT_ACTIVE",
14457
+ "BATTLEFIELD_SQUAD_NOT_FOUND",
14458
+ "BATTLEFIELD_SQUAD_BUSY",
14459
+ "BATTLEFIELD_UNREACHABLE",
14460
+ "BATTLEFIELD_TARGET_INVALID",
14461
+ "BATTLEFIELD_STRONGHOLD_LOCKED"
14462
+ ],
14463
+ "examples": [
14464
+ {
14465
+ "caption": "从 (14,15) 攻打延津渡口",
14466
+ "request": {
14467
+ "op": 124,
14468
+ "seq": 34,
14469
+ "data": {
14470
+ "squadId": "c1d2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
14471
+ "strongholdId": "ford_yanjin"
14472
+ }
14473
+ },
14474
+ "responses": [
14475
+ {
14476
+ "op": 124,
14477
+ "seq": 34,
14478
+ "ok": true,
14479
+ "data": {
14480
+ "me": {
14481
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
14482
+ "username": "alice",
14483
+ "camp": "yuan",
14484
+ "merit": 1240,
14485
+ "rank": 3,
14486
+ "entered": true,
14487
+ "squads": [
14488
+ {
14489
+ "id": "c1d2e3f4-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
14490
+ "x": 14,
14491
+ "y": 15,
14492
+ "status": "marching",
14493
+ "troops": {
14494
+ "porter": 0,
14495
+ "militia": 300,
14496
+ "scout": 0,
14497
+ "pikeman": 0,
14498
+ "swordsman": 200,
14499
+ "archer": 150,
14500
+ "cavalry": 50,
14501
+ "iron_cavalry": 0,
14502
+ "supply_wagon": 0,
14503
+ "ballista": 0,
14504
+ "siege_ram": 0,
14505
+ "yulin_guard": 0,
14506
+ "danyang_soldier": 0,
14507
+ "baimao_soldier": 0,
14508
+ "huwei_guard": 0,
14509
+ "zhuge_crossbow": 0,
14510
+ "xiandeng_warrior": 0,
14511
+ "hubao_cavalry": 0,
14512
+ "xiliang_cavalry": 0
14513
+ },
14514
+ "targetX": 15,
14515
+ "targetY": 15,
14516
+ "targetStrongholdId": "ford_yanjin",
14517
+ "arriveAt": "2026-09-25T08:01:00.000Z",
14518
+ "originX": 13,
14519
+ "originY": 15,
14520
+ "strongholdId": null
14521
+ }
14522
+ ],
14523
+ "cumulativeMerit": 3600
14524
+ }
14525
+ }
14526
+ }
14527
+ ]
14528
+ }
14529
+ ],
14530
+ "agentNote": "到达结算与战报由服务端在 Worker 里完成,客户端轮询 / 收 PUSH_BATTLEFIELD_STATE 后重查即可。攻打前对比 garrisonPower 与自己的队伍战力;没有把握先打渡口(10 分/小时)或普通据点。战败的幸存部队会退回出发位置。"
14531
+ },
14532
+ {
14533
+ "op": 125,
14534
+ "kind": "request",
14535
+ "name": "BUY_BATTLEFIELD_ITEM",
14536
+ "title": "战场商店兑换(v75,AISLG-198)",
14537
+ "preAuth": false,
14538
+ "summary": "用战场军功换东西(军功跨场累积、换季清零;每场限购,见 GET_BATTLEFIELD 的 shop.items):资源包 200 军功(每场限 5);武将经验 300 军功(每场限 3);刀盾兵 600 军功(每场限 2);轻骑兵 600 军功(每场限 2)。赤壁场次另有 铁骑兵 800 军功(直接进主城,每场限 1 次)。兑换即时到账(资源包进主城、兵直接进主城驻军、武将经验给指定武将),不占队列。",
14539
+ "requestFields": [
14540
+ {
14541
+ "name": "item",
14542
+ "type": "'resources' | 'hero_exp' | 'swordsman' | 'cavalry' | 'iron_cavalry'",
14543
+ "desc": "必填。商品(iron_cavalry 仅赤壁场次可买)。"
14544
+ },
14545
+ {
14546
+ "name": "heroId",
14547
+ "type": "string",
14548
+ "desc": "item=hero_exp 时必填:经验给这个武将(必须属于本账号)。"
14549
+ }
14550
+ ],
14551
+ "dataFields": [
14552
+ {
14553
+ "name": "item",
14554
+ "type": "string",
14555
+ "desc": "商品。"
14556
+ },
14557
+ {
14558
+ "name": "cost",
14559
+ "type": "number",
14560
+ "desc": "本次扣掉的军功。"
14561
+ },
14562
+ {
14563
+ "name": "cumulativeMerit",
14564
+ "type": "number",
14565
+ "desc": "兑换后的军功余额。"
14566
+ },
14567
+ {
14568
+ "name": "bought",
14569
+ "type": "number",
14570
+ "desc": "本场该商品累计已买数量(含本次)。"
14571
+ },
14572
+ {
14573
+ "name": "reward",
14574
+ "type": "object",
14575
+ "desc": "到账内容:{ resources? } / { heroExp, level, leveledTo } / { troop, count }。"
14576
+ }
14577
+ ],
14578
+ "errors": [
14579
+ "INVALID_PARAMS",
14580
+ "BATTLEFIELD_NOT_ACTIVE",
14581
+ "BATTLEFIELD_SHOP_LIMIT",
14582
+ "BATTLEFIELD_MERIT_INSUFFICIENT",
14583
+ "HERO_NOT_FOUND"
14584
+ ],
14585
+ "examples": [
14586
+ {
14587
+ "caption": "换一包资源",
14588
+ "request": {
14589
+ "op": 125,
14590
+ "seq": 35,
14591
+ "data": {
14592
+ "item": "resources"
14593
+ }
14594
+ },
14595
+ "responses": [
14596
+ {
14597
+ "op": 125,
14598
+ "seq": 35,
14599
+ "ok": true,
14600
+ "data": {
14601
+ "item": "resources",
14602
+ "cost": 200,
14603
+ "cumulativeMerit": 3400,
14604
+ "bought": 1,
14605
+ "reward": {
14606
+ "resources": {
14607
+ "gold": 0,
14608
+ "wood": 10000,
14609
+ "food": 10000,
14610
+ "stone": 10000,
14611
+ "iron": 10000
14612
+ }
14613
+ }
14614
+ }
14615
+ }
14616
+ ]
14617
+ }
14618
+ ],
14619
+ "agentNote": "打得多不如换得准:资源包适合补建造缺口,武将经验给主力将,刀盾 / 轻骑直接补战损。注意每场限购,军功余额跨场保留但换季清零。"
14620
+ },
14621
+ {
14622
+ "op": 126,
14623
+ "kind": "request",
14624
+ "name": "GET_NOBILITY",
14625
+ "title": "查询声望与爵位(v76,AISLG-197)",
14626
+ "preAuth": false,
14627
+ "summary": "累计声望只增不减:世界地图上的每一场战斗(攻守、输赢、NPC / 玩家 / 黄巾)按歼灭敌军的参考战力 1:1 计;剧本战场的军功按 1 军功 = 1 声望再计一次。竞技场与将星塔不计。爵位共 10 级(平民 0 / 公士 100 / 簪袅 500 / 大夫 2000 / 公乘 6000 / 五大夫 15000 / 庶长 35000 / 关内侯 80000 / 列侯 160000 / 王 300000),达到门槛自动升级;升到大夫及以上会全服播报。大夫(3)起可以占领名城(之前只能打外围与掠夺);五大夫 / 列侯各让普通武将上限 +1。每日俸禄(金币 = 爵位序号 × 200 × 全局时间缩放,当前示例 公士 10000 金、簪袅 20000 金、大夫 30000 金、公乘 40000 金)在北京时间每天 0 点后领一次,用 CLAIM_NOBILITY_SALARY。声威与爵位随赛季重置;上一季的最高爵位随名人堂留存。",
14628
+ "requestFields": [],
14629
+ "dataFields": [
14630
+ {
14631
+ "name": "prestige",
14632
+ "type": "number",
14633
+ "desc": "累计声望。"
14634
+ },
14635
+ {
14636
+ "name": "index",
14637
+ "type": "number",
14638
+ "desc": "爵位序号(0 = 平民)。"
14639
+ },
14640
+ {
14641
+ "name": "name",
14642
+ "type": "string",
14643
+ "desc": "爵位名称。"
14644
+ },
14645
+ {
14646
+ "name": "privilege",
14647
+ "type": "string",
14648
+ "desc": "该爵位特权说明。"
14649
+ },
14650
+ {
14651
+ "name": "next",
14652
+ "type": "object | null",
14653
+ "desc": "下一级爵位 { index, name, threshold };已到「王」为 null。"
14654
+ },
14655
+ {
14656
+ "name": "progressPercent",
14657
+ "type": "number",
14658
+ "desc": "距离下一级的进度(0..100;满级 100)。"
14659
+ },
14660
+ {
14661
+ "name": "salaryGold",
14662
+ "type": "number",
14663
+ "desc": "每日俸禄金额(金币;平民 0;已按全局时间缩放折算)。"
14664
+ },
14665
+ {
14666
+ "name": "claimedToday",
14667
+ "type": "boolean",
14668
+ "desc": "今日(北京日)是否已领。"
14669
+ },
14670
+ {
14671
+ "name": "claimable",
14672
+ "type": "boolean",
14673
+ "desc": "现在是否可以领。"
14674
+ },
14675
+ {
14676
+ "name": "lastClaimedAt",
14677
+ "type": "string | null",
14678
+ "desc": "最近一次领取时刻;从未领过为 null。"
14679
+ },
14680
+ {
14681
+ "name": "nextClaimAt",
14682
+ "type": "string",
14683
+ "desc": "下次可领时刻(今日已领 = 明日 0 点北京时间;否则为现在)。"
14684
+ },
14685
+ {
14686
+ "name": "heroCapBonus",
14687
+ "type": "number",
14688
+ "desc": "普通武将上限加成(五大夫 +1、列侯再 +1)。"
14689
+ },
14690
+ {
14691
+ "name": "canOccupyFamous",
14692
+ "type": "boolean",
14693
+ "desc": "能否占领名城(爵位 ≥ 大夫)。"
14694
+ }
14695
+ ],
14696
+ "errors": [],
14697
+ "examples": [
14698
+ {
14699
+ "caption": "大夫:今天还能领俸禄,距公乘还差 3650 声望",
14700
+ "request": {
14701
+ "op": 126,
14702
+ "seq": 40,
14703
+ "data": {}
14704
+ },
14705
+ "responses": [
14706
+ {
14707
+ "op": 126,
14708
+ "seq": 40,
14709
+ "ok": true,
14710
+ "data": {
14711
+ "prestige": 2350,
14712
+ "index": 3,
14713
+ "name": "大夫",
14714
+ "privilege": "可占领名城;每日俸禄",
14715
+ "next": {
14716
+ "index": 4,
14717
+ "name": "公乘",
14718
+ "threshold": 6000
14719
+ },
14720
+ "progressPercent": 8,
14721
+ "salaryGold": 30000,
14722
+ "claimedToday": false,
14723
+ "claimable": true,
14724
+ "lastClaimedAt": null,
14725
+ "nextClaimAt": "2026-10-27T04:00:00.000Z",
14726
+ "heroCapBonus": 0,
14727
+ "canOccupyFamous": true
14728
+ }
14729
+ }
14730
+ ]
14731
+ }
14732
+ ],
14733
+ "agentNote": "声望是长期累积线:能打就打,不用刻意刷。打名城前先确认 canOccupyFamous;否则先打 NPC 城 / 野地攒到 2000 声望。俸禄每天记得领(claimable 为 true 时),金额随爵位提高。"
14734
+ },
14735
+ {
14736
+ "op": 127,
14737
+ "kind": "request",
14738
+ "name": "CLAIM_NOBILITY_SALARY",
14739
+ "title": "领取每日爵位俸禄(v76,AISLG-197)",
14740
+ "preAuth": false,
14741
+ "summary": "按北京日领取一次爵位俸禄(金币),直接加到主城。平民没有俸禄(NOBILITY_SALARY_NONE);今日已领返回 NOBILITY_SALARY_CLAIMED(附 nextClaimAt)。金额 = 爵位序号 × 200 × 全局时间缩放。",
14742
+ "requestFields": [],
14743
+ "dataFields": [
14744
+ {
14745
+ "name": "gold",
14746
+ "type": "number",
14747
+ "desc": "本次领取的金币。"
14748
+ },
14749
+ {
14750
+ "name": "index",
14751
+ "type": "number",
14752
+ "desc": "领取后的爵位序号。"
14753
+ },
14754
+ {
14755
+ "name": "name",
14756
+ "type": "string",
14757
+ "desc": "领取后的爵位名称。"
14758
+ },
14759
+ {
14760
+ "name": "prestige",
14761
+ "type": "number",
14762
+ "desc": "领取后的累计声望。"
14763
+ },
14764
+ {
14765
+ "name": "claimedAt",
14766
+ "type": "string",
14767
+ "desc": "领取时刻(ISO 8601)。"
14768
+ }
14769
+ ],
14770
+ "errors": [
14771
+ "NOBILITY_SALARY_NONE",
14772
+ "NOBILITY_SALARY_CLAIMED"
14773
+ ],
14774
+ "examples": [
14775
+ {
14776
+ "caption": "大夫领取 3 万金(示例按 50 倍缩放)",
14777
+ "request": {
14778
+ "op": 127,
14779
+ "seq": 41,
14780
+ "data": {}
14781
+ },
14782
+ "responses": [
14783
+ {
14784
+ "op": 127,
14785
+ "seq": 41,
14786
+ "ok": true,
14787
+ "data": {
14788
+ "gold": 30000,
14789
+ "index": 3,
14790
+ "name": "大夫",
14791
+ "prestige": 2350,
14792
+ "claimedAt": "2026-10-27T04:00:00.000Z"
14793
+ }
14794
+ }
14795
+ ]
14796
+ }
14797
+ ],
14798
+ "agentNote": "每天上线先领一次(幂等:重复领只会返回已领)。金币直接进主城,可用于建造 / 征兵 / 俸禄。"
14799
+ },
14800
+ {
14801
+ "op": 128,
14802
+ "kind": "request",
14803
+ "name": "ALLIANCE_DIPLOMACY_INVITE",
14804
+ "title": "发起友好邀请(v77,AISLG-195)",
14805
+ "preAuth": false,
14806
+ "summary": "联盟之间有三种关系:**中立**(默认)/ **友好**(一方发邀请、另一方同意,邀请 48 小时过期)/ **敌对**(一方单方面宣布,不需要对方同意)。友盟双方成员互不攻击(掠夺、抢野地、占分城、侦察都返回 ALLY_NOT_ATTACKABLE),可以互相协防;地图上显示友军色。敌对只在地图上标红、来袭预警标出「敌对联盟」,不改变战斗与收益规则(不等于宣战)。上限:每个联盟最多 2 个友盟、5 个敌对。解除友好后 24 小时内双方仍不能互相攻击,72 小时内不能再次结好。管理操作仅限玩家连接的盟主 / 副盟主(Agent 返回 AGENT_FORBIDDEN);关系变化在双方联盟频道发系统消息,结友 / 宣布敌对另发全服播报;换季关系保留、邀请清空。 本协议由盟主 / 副盟主向另一个联盟发出友好邀请(48 小时有效)。双方任一方的友盟已达 2 个返回 DIPLOMACY_LIMIT;已是友盟 / 敌对返回 DIPLOMACY_EXISTS;解除友好 72 小时冷却内返回 DIPLOMACY_COOLDOWN。仅玩家连接。",
14807
+ "requestFields": [
14808
+ {
14809
+ "name": "allianceId",
14810
+ "type": "string",
14811
+ "desc": "目标联盟 id。"
14812
+ }
14813
+ ],
14814
+ "dataFields": [
14815
+ {
14816
+ "name": "(同 GET_ALLIANCE_DIPLOMACY)",
14817
+ "type": "object",
14818
+ "desc": "返回最新外交全貌(含刚发出的邀请)。"
14819
+ }
14820
+ ],
14821
+ "errors": [
14822
+ "INVALID_PARAMS",
14823
+ "ALLIANCE_NOT_IN",
14824
+ "ALLIANCE_FORBIDDEN",
14825
+ "ALLIANCE_NOT_FOUND",
14826
+ "DIPLOMACY_LIMIT",
14827
+ "DIPLOMACY_EXISTS",
14828
+ "DIPLOMACY_COOLDOWN"
14829
+ ],
14830
+ "examples": [
14831
+ {
14832
+ "caption": "向洛阳盟发出邀请",
14833
+ "request": {
14834
+ "op": 128,
14835
+ "seq": 51,
14836
+ "data": {
14837
+ "allianceId": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70"
14838
+ }
14839
+ },
14840
+ "responses": [
14841
+ {
14842
+ "op": 128,
14843
+ "seq": 51,
14844
+ "ok": true,
14845
+ "data": {
14846
+ "allianceId": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
14847
+ "friends": [
14848
+ {
14849
+ "alliance": {
14850
+ "id": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70",
14851
+ "name": "洛阳盟",
14852
+ "leader": {
14853
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
14854
+ "username": "bob"
14855
+ },
14856
+ "memberCount": 18,
14857
+ "maxMembers": 30,
14858
+ "createdAt": "2026-09-25T08:00:00.000Z"
14859
+ },
14860
+ "relation": "friendly",
14861
+ "since": "2026-09-25T08:00:00.000Z",
14862
+ "noAttackUntil": null,
14863
+ "refriendAfter": null
14864
+ }
14865
+ ],
14866
+ "hostiles": [],
14867
+ "invites": [
14868
+ {
14869
+ "id": "12",
14870
+ "alliance": {
14871
+ "id": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70",
14872
+ "name": "洛阳盟",
14873
+ "leader": {
14874
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
14875
+ "username": "bob"
14876
+ },
14877
+ "memberCount": 18,
14878
+ "maxMembers": 30,
14879
+ "createdAt": "2026-09-25T08:00:00.000Z"
14880
+ },
14881
+ "inviter": {
14882
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
14883
+ "username": "bob"
14884
+ },
14885
+ "direction": "received",
14886
+ "createdAt": "2026-09-25T08:00:00.000Z",
14887
+ "expiresAt": "2026-09-27T08:00:00.000Z"
14888
+ }
14889
+ ],
14890
+ "limits": {
14891
+ "friends": 2,
14892
+ "hostiles": 5
14893
+ }
14894
+ }
14895
+ }
14896
+ ]
14897
+ }
14898
+ ],
14899
+ "agentNote": "管理操作 Agent 不能做;由玩家的盟主 / 副盟主在联盟面板发起。"
14900
+ },
14901
+ {
14902
+ "op": 129,
14903
+ "kind": "request",
14904
+ "name": "ALLIANCE_DIPLOMACY_RESPOND",
14905
+ "title": "同意 / 拒绝友好邀请(v77,AISLG-195)",
14906
+ "preAuth": false,
14907
+ "summary": "联盟之间有三种关系:**中立**(默认)/ **友好**(一方发邀请、另一方同意,邀请 48 小时过期)/ **敌对**(一方单方面宣布,不需要对方同意)。友盟双方成员互不攻击(掠夺、抢野地、占分城、侦察都返回 ALLY_NOT_ATTACKABLE),可以互相协防;地图上显示友军色。敌对只在地图上标红、来袭预警标出「敌对联盟」,不改变战斗与收益规则(不等于宣战)。上限:每个联盟最多 2 个友盟、5 个敌对。解除友好后 24 小时内双方仍不能互相攻击,72 小时内不能再次结好。管理操作仅限玩家连接的盟主 / 副盟主(Agent 返回 AGENT_FORBIDDEN);关系变化在双方联盟频道发系统消息,结友 / 宣布敌对另发全服播报;换季关系保留、邀请清空。 本协议由收到邀请一方的盟主 / 副盟主答复(accept=true 同意 / false 拒绝)。同意时双方友盟名额、72 小时冷却都会复核(不通过返回 DIPLOMACY_LIMIT / DIPLOMACY_COOLDOWN),成功后双方联盟频道各写一条系统消息并全服播报。仅玩家连接。",
14908
+ "requestFields": [
14909
+ {
14910
+ "name": "inviteId",
14911
+ "type": "string",
14912
+ "desc": "邀请 id(GET_ALLIANCE_DIPLOMACY 的 invites[].id)。"
14913
+ },
14914
+ {
14915
+ "name": "accept",
14916
+ "type": "boolean",
14917
+ "desc": "true 同意 / false 拒绝。"
14918
+ }
14919
+ ],
14920
+ "dataFields": [
14921
+ {
14922
+ "name": "(同 GET_ALLIANCE_DIPLOMACY)",
14923
+ "type": "object",
14924
+ "desc": "返回最新外交全貌。"
14925
+ }
14926
+ ],
14927
+ "errors": [
14928
+ "INVALID_PARAMS",
14929
+ "ALLIANCE_NOT_IN",
14930
+ "ALLIANCE_FORBIDDEN",
14931
+ "DIPLOMACY_INVITE_NOT_FOUND",
14932
+ "DIPLOMACY_LIMIT",
14933
+ "DIPLOMACY_EXISTS",
14934
+ "DIPLOMACY_COOLDOWN"
14935
+ ],
14936
+ "examples": [
14937
+ {
14938
+ "caption": "同意邀请,双方成为友盟",
14939
+ "request": {
14940
+ "op": 129,
14941
+ "seq": 52,
14942
+ "data": {
14943
+ "inviteId": "12",
14944
+ "accept": true
14945
+ }
14946
+ },
14947
+ "responses": [
14948
+ {
14949
+ "op": 129,
14950
+ "seq": 52,
14951
+ "ok": true,
14952
+ "data": {
14953
+ "allianceId": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
14954
+ "friends": [
14955
+ {
14956
+ "alliance": {
14957
+ "id": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70",
14958
+ "name": "洛阳盟",
14959
+ "leader": {
14960
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
14961
+ "username": "bob"
14962
+ },
14963
+ "memberCount": 18,
14964
+ "maxMembers": 30,
14965
+ "createdAt": "2026-09-25T08:00:00.000Z"
14966
+ },
14967
+ "relation": "friendly",
14968
+ "since": "2026-09-25T08:00:00.000Z",
14969
+ "noAttackUntil": null,
14970
+ "refriendAfter": null
14971
+ }
14972
+ ],
14973
+ "hostiles": [],
14974
+ "invites": [],
14975
+ "limits": {
14976
+ "friends": 2,
14977
+ "hostiles": 5
14978
+ }
14979
+ }
14980
+ }
14981
+ ]
14982
+ }
14983
+ ],
14984
+ "agentNote": "同意后双方成员立即不能互相攻击,且可以互相协防;规划军事行动前先确认。"
14985
+ },
14986
+ {
14987
+ "op": 130,
14988
+ "kind": "request",
14989
+ "name": "ALLIANCE_DIPLOMACY_END",
14990
+ "title": "解除友好 / 敌对(v77,AISLG-195)",
14991
+ "preAuth": false,
14992
+ "summary": "联盟之间有三种关系:**中立**(默认)/ **友好**(一方发邀请、另一方同意,邀请 48 小时过期)/ **敌对**(一方单方面宣布,不需要对方同意)。友盟双方成员互不攻击(掠夺、抢野地、占分城、侦察都返回 ALLY_NOT_ATTACKABLE),可以互相协防;地图上显示友军色。敌对只在地图上标红、来袭预警标出「敌对联盟」,不改变战斗与收益规则(不等于宣战)。上限:每个联盟最多 2 个友盟、5 个敌对。解除友好后 24 小时内双方仍不能互相攻击,72 小时内不能再次结好。管理操作仅限玩家连接的盟主 / 副盟主(Agent 返回 AGENT_FORBIDDEN);关系变化在双方联盟频道发系统消息,结友 / 宣布敌对另发全服播报;换季关系保留、邀请清空。 本协议由盟主 / 副盟主单方面解除与目标联盟的友好或敌对,回到中立。解除友好会写入 24 小时不可攻击 + 72 小时不可再结好的冷却(防解约偷袭 / 反复横跳)。仅玩家连接。",
14993
+ "requestFields": [
14994
+ {
14995
+ "name": "allianceId",
14996
+ "type": "string",
14997
+ "desc": "目标联盟 id。"
14998
+ }
14999
+ ],
15000
+ "dataFields": [
15001
+ {
15002
+ "name": "(同 GET_ALLIANCE_DIPLOMACY)",
15003
+ "type": "object",
15004
+ "desc": "返回最新外交全貌。"
15005
+ }
15006
+ ],
15007
+ "errors": [
15008
+ "INVALID_PARAMS",
15009
+ "ALLIANCE_NOT_IN",
15010
+ "ALLIANCE_FORBIDDEN"
15011
+ ],
15012
+ "examples": [
15013
+ {
15014
+ "caption": "解除与洛阳盟的友好(24 小时内仍不能互相攻击)",
15015
+ "request": {
15016
+ "op": 130,
15017
+ "seq": 53,
15018
+ "data": {
15019
+ "allianceId": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70"
15020
+ }
15021
+ },
15022
+ "responses": [
15023
+ {
15024
+ "op": 130,
15025
+ "seq": 53,
15026
+ "ok": true,
15027
+ "data": {
15028
+ "allianceId": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
15029
+ "friends": [],
15030
+ "hostiles": [],
15031
+ "invites": [],
15032
+ "limits": {
15033
+ "friends": 2,
15034
+ "hostiles": 5
15035
+ }
15036
+ }
15037
+ }
15038
+ ]
15039
+ }
15040
+ ],
15041
+ "agentNote": "解除友好不等于立刻能打:24 小时冷却内攻击仍会被拒(ALLY_NOT_ATTACKABLE)。"
15042
+ },
15043
+ {
15044
+ "op": 131,
15045
+ "kind": "request",
15046
+ "name": "ALLIANCE_DIPLOMACY_HOSTILE",
15047
+ "title": "宣布敌对(v77,AISLG-195)",
15048
+ "preAuth": false,
15049
+ "summary": "联盟之间有三种关系:**中立**(默认)/ **友好**(一方发邀请、另一方同意,邀请 48 小时过期)/ **敌对**(一方单方面宣布,不需要对方同意)。友盟双方成员互不攻击(掠夺、抢野地、占分城、侦察都返回 ALLY_NOT_ATTACKABLE),可以互相协防;地图上显示友军色。敌对只在地图上标红、来袭预警标出「敌对联盟」,不改变战斗与收益规则(不等于宣战)。上限:每个联盟最多 2 个友盟、5 个敌对。解除友好后 24 小时内双方仍不能互相攻击,72 小时内不能再次结好。管理操作仅限玩家连接的盟主 / 副盟主(Agent 返回 AGENT_FORBIDDEN);关系变化在双方联盟频道发系统消息,结友 / 宣布敌对另发全服播报;换季关系保留、邀请清空。 本协议由盟主 / 副盟主单方面把目标联盟标为敌对(不需要对方同意,最多 5 个),地图上对方成员的城与野地标红、对方来袭时预警标出「敌对联盟」。若原是友盟,保留 24 小时不可攻击冷却。仅玩家连接。",
15050
+ "requestFields": [
15051
+ {
15052
+ "name": "allianceId",
15053
+ "type": "string",
15054
+ "desc": "目标联盟 id。"
15055
+ }
15056
+ ],
15057
+ "dataFields": [
15058
+ {
15059
+ "name": "(同 GET_ALLIANCE_DIPLOMACY)",
15060
+ "type": "object",
15061
+ "desc": "返回最新外交全貌。"
15062
+ }
15063
+ ],
15064
+ "errors": [
15065
+ "INVALID_PARAMS",
15066
+ "ALLIANCE_NOT_IN",
15067
+ "ALLIANCE_FORBIDDEN",
15068
+ "DIPLOMACY_LIMIT",
15069
+ "DIPLOMACY_EXISTS"
15070
+ ],
15071
+ "examples": [
15072
+ {
15073
+ "caption": "把洛阳盟标为敌对",
15074
+ "request": {
15075
+ "op": 131,
15076
+ "seq": 54,
15077
+ "data": {
15078
+ "allianceId": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70"
15079
+ }
15080
+ },
15081
+ "responses": [
15082
+ {
15083
+ "op": 131,
15084
+ "seq": 54,
15085
+ "ok": true,
15086
+ "data": {
15087
+ "allianceId": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
15088
+ "friends": [],
15089
+ "hostiles": [
15090
+ {
15091
+ "alliance": {
15092
+ "id": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70",
15093
+ "name": "洛阳盟",
15094
+ "leader": {
15095
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15096
+ "username": "bob"
15097
+ },
15098
+ "memberCount": 18,
15099
+ "maxMembers": 30,
15100
+ "createdAt": "2026-09-25T08:00:00.000Z"
15101
+ },
15102
+ "relation": "hostile",
15103
+ "since": "2026-09-25T08:00:00.000Z",
15104
+ "noAttackUntil": null,
15105
+ "refriendAfter": null
15106
+ }
15107
+ ],
15108
+ "invites": [
15109
+ {
15110
+ "id": "12",
15111
+ "alliance": {
15112
+ "id": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70",
15113
+ "name": "洛阳盟",
15114
+ "leader": {
15115
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15116
+ "username": "bob"
15117
+ },
15118
+ "memberCount": 18,
15119
+ "maxMembers": 30,
15120
+ "createdAt": "2026-09-25T08:00:00.000Z"
15121
+ },
15122
+ "inviter": {
15123
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15124
+ "username": "bob"
15125
+ },
15126
+ "direction": "received",
15127
+ "createdAt": "2026-09-25T08:00:00.000Z",
15128
+ "expiresAt": "2026-09-27T08:00:00.000Z"
15129
+ }
15130
+ ],
15131
+ "limits": {
15132
+ "friends": 2,
15133
+ "hostiles": 5
15134
+ }
15135
+ }
15136
+ }
15137
+ ]
15138
+ }
15139
+ ],
15140
+ "agentNote": "敌对只是标记,不改变战斗与收益;可以随时单方面解除回到中立。"
15141
+ },
15142
+ {
15143
+ "op": 132,
15144
+ "kind": "request",
15145
+ "name": "GET_ALLIANCE_DIPLOMACY",
15146
+ "title": "查询联盟外交(v77,AISLG-195)",
15147
+ "preAuth": false,
15148
+ "summary": "联盟之间有三种关系:**中立**(默认)/ **友好**(一方发邀请、另一方同意,邀请 48 小时过期)/ **敌对**(一方单方面宣布,不需要对方同意)。友盟双方成员互不攻击(掠夺、抢野地、占分城、侦察都返回 ALLY_NOT_ATTACKABLE),可以互相协防;地图上显示友军色。敌对只在地图上标红、来袭预警标出「敌对联盟」,不改变战斗与收益规则(不等于宣战)。上限:每个联盟最多 2 个友盟、5 个敌对。解除友好后 24 小时内双方仍不能互相攻击,72 小时内不能再次结好。管理操作仅限玩家连接的盟主 / 副盟主(Agent 返回 AGENT_FORBIDDEN);关系变化在双方联盟频道发系统消息,结友 / 宣布敌对另发全服播报;换季关系保留、邀请清空。 本协议返回本联盟的友盟名单、敌对名单与待处理邀请(发出 / 收到);玩家与 Agent 通用。没有联盟返回 ALLIANCE_NOT_IN。",
15149
+ "requestFields": [],
15150
+ "dataFields": [
15151
+ {
15152
+ "name": "allianceId",
15153
+ "type": "string",
15154
+ "desc": "我的联盟 id。"
15155
+ },
15156
+ {
15157
+ "name": "friends",
15158
+ "type": "array",
15159
+ "desc": "友盟名单(最多 2 个):{ alliance 联盟概要 { id, name, leader, memberCount, maxMembers, createdAt }, relation: friendly, since, noAttackUntil, refriendAfter }。"
15160
+ },
15161
+ {
15162
+ "name": "hostiles",
15163
+ "type": "array",
15164
+ "desc": "敌对名单(最多 5 个):结构同 friends,relation: hostile。"
15165
+ },
15166
+ {
15167
+ "name": "invites",
15168
+ "type": "array",
15169
+ "desc": "待处理友好邀请:{ id, alliance 对方联盟, inviter 发起人, direction: sent|received, createdAt, expiresAt }。"
15170
+ },
15171
+ {
15172
+ "name": "limits",
15173
+ "type": "object",
15174
+ "desc": "上限:{ friends: 2, hostiles: 5 }。"
15175
+ }
15176
+ ],
15177
+ "errors": [
15178
+ "ALLIANCE_NOT_IN"
15179
+ ],
15180
+ "examples": [
15181
+ {
15182
+ "caption": "有一个友盟,并收到洛阳盟的邀请",
15183
+ "request": {
15184
+ "op": 132,
15185
+ "seq": 50,
15186
+ "data": {}
15187
+ },
15188
+ "responses": [
15189
+ {
15190
+ "op": 132,
15191
+ "seq": 50,
15192
+ "ok": true,
15193
+ "data": {
15194
+ "allianceId": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
15195
+ "friends": [
15196
+ {
15197
+ "alliance": {
15198
+ "id": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70",
15199
+ "name": "洛阳盟",
15200
+ "leader": {
15201
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15202
+ "username": "bob"
15203
+ },
15204
+ "memberCount": 18,
15205
+ "maxMembers": 30,
15206
+ "createdAt": "2026-09-25T08:00:00.000Z"
15207
+ },
15208
+ "relation": "friendly",
15209
+ "since": "2026-09-25T08:00:00.000Z",
15210
+ "noAttackUntil": null,
15211
+ "refriendAfter": null
15212
+ }
15213
+ ],
15214
+ "hostiles": [],
15215
+ "invites": [
15216
+ {
15217
+ "id": "12",
15218
+ "alliance": {
15219
+ "id": "3c9f2a1b-4d5e-4f60-8a71-2b3c4d5e6f70",
15220
+ "name": "洛阳盟",
15221
+ "leader": {
15222
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15223
+ "username": "bob"
15224
+ },
15225
+ "memberCount": 18,
15226
+ "maxMembers": 30,
15227
+ "createdAt": "2026-09-25T08:00:00.000Z"
15228
+ },
15229
+ "inviter": {
15230
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15231
+ "username": "bob"
15232
+ },
15233
+ "direction": "received",
15234
+ "createdAt": "2026-09-25T08:00:00.000Z",
15235
+ "expiresAt": "2026-09-27T08:00:00.000Z"
15236
+ }
15237
+ ],
15238
+ "limits": {
15239
+ "friends": 2,
15240
+ "hostiles": 5
15241
+ }
15242
+ }
15243
+ }
15244
+ ]
15245
+ }
15246
+ ],
15247
+ "agentNote": "外交是盟主 / 副盟主的玩家操作,Agent 只能查。友盟成员不能互相攻击,规划进攻前先查 friendships;解除友好有 24 小时不可攻击 + 72 小时不可再结好的冷却。"
15248
+ },
15249
+ {
15250
+ "op": 133,
15251
+ "kind": "request",
15252
+ "name": "GET_MARKET",
15253
+ "title": "查询玩家交易所(v78,AISLG-196)",
15254
+ "preAuth": false,
15255
+ "summary": "玩家之间挂单买卖粮 / 木 / 石 / 铁(可收另一种资源或金币)。挂单时卖出的资源立即从挂单城冻结;吃单可整单或部分成交,成交时买家立即扣款,双方各派一支商队送货(每格 15 秒基准 ÷ 全局缩放,出发城驿站与行军科技有效;商队不会被截击)。成交双方各扣 5% 手续费。未成交部分随时可撤,48 小时后自动撤单退还。价格:资源之间 0.5–2(每 1 个卖出资源换多少个收取资源),收金币 0.125–0.5;单张最少 1000,每账号最多 5 张。每日成交额度 = 主城官府等级 × 3000 × 全局缩放(按卖出资源数量折算、买卖合计,北京日重置)。门槛:主城官府 ≥ 5 且不在新手保护期。可勾选「只卖给盟友」(同联盟成员才可见 / 可买)。 返回可买挂单(可按卖出 / 收取资源筛选、分页)、我的挂单与成交记录、我的额度与门槛;玩家与 Agent 通用。",
15256
+ "requestFields": [
15257
+ {
15258
+ "name": "sellResource",
15259
+ "type": "'food' | 'wood' | 'stone' | 'iron'",
15260
+ "desc": "可选。只看卖出该资源的挂单。"
15261
+ },
15262
+ {
15263
+ "name": "buyResource",
15264
+ "type": "'food' | 'wood' | 'stone' | 'iron' | 'gold'",
15265
+ "desc": "可选。只看收取该资源 / 金币的挂单。"
15266
+ },
15267
+ {
15268
+ "name": "page",
15269
+ "type": "number",
15270
+ "desc": "页码,从 1 起;每页 10 条。"
15271
+ }
15272
+ ],
15273
+ "dataFields": [
15274
+ {
15275
+ "name": "orders",
15276
+ "type": "array",
15277
+ "desc": "可买挂单(单价升序):{ id, seller{accountId,username,nobility,nobilityName,allianceId,allianceName}, city{id,name,x,y}, sellResource, buyResource, total, remaining, unitPrice, allyOnly, createdAt, expiresAt, mine }。只卖给盟友的单对非盟友不返回。"
15278
+ },
15279
+ {
15280
+ "name": "page / pageSize / total",
15281
+ "type": "number",
15282
+ "desc": "分页信息,每页 10 条。"
15283
+ },
15284
+ {
15285
+ "name": "mine.orders",
15286
+ "type": "array",
15287
+ "desc": "我的挂单(进行中 + 最近结束,最多 20 条),结构同 orders。"
15288
+ },
15289
+ {
15290
+ "name": "mine.trades",
15291
+ "type": "array",
15292
+ "desc": "我的成交记录(最近 20 条):{ id, role: buy|sell, other{accountId,username}, sellResource, buyResource, quantity, paid, delivered(扣 5% 后实收), fee, createdAt, deliveredAt(双方商队都送达才非 null) }。"
15293
+ },
15294
+ {
15295
+ "name": "limits",
15296
+ "type": "object",
15297
+ "desc": "我的额度与门槛:{ minAmount, maxOpenOrders, activeOrders, feePercent, government, dailyLimit, dailyUsed, dailyRemaining, locked, lockedReason: government|newbie|null, priceRangeResource{min,max}, priceRangeGold{min,max} }。"
15298
+ }
15299
+ ],
15300
+ "errors": [],
15301
+ "examples": [
15302
+ {
15303
+ "caption": "看铁换粮的挂单",
15304
+ "request": {
15305
+ "op": 133,
15306
+ "seq": 60,
15307
+ "data": {
15308
+ "sellResource": "iron",
15309
+ "buyResource": "food"
15310
+ }
15311
+ },
15312
+ "responses": [
15313
+ {
15314
+ "op": 133,
15315
+ "seq": 60,
15316
+ "ok": true,
15317
+ "data": {
15318
+ "orders": [
15319
+ {
15320
+ "id": "4a9c2b1d-3e5f-4a60-8b71-2c3d4e5f6a70",
15321
+ "seller": {
15322
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15323
+ "username": "alice",
15324
+ "nobility": 3,
15325
+ "nobilityName": "大夫",
15326
+ "allianceId": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
15327
+ "allianceName": "卧龙盟"
15328
+ },
15329
+ "city": {
15330
+ "id": "5b1c3d2e-4f60-4a71-8c82-3d4e5f6a7b80",
15331
+ "name": "主城",
15332
+ "x": 612,
15333
+ "y": 388
15334
+ },
15335
+ "sellResource": "iron",
15336
+ "buyResource": "food",
15337
+ "total": 10000,
15338
+ "remaining": 10000,
15339
+ "unitPrice": 1.2,
15340
+ "allyOnly": false,
15341
+ "createdAt": "2026-09-25T08:00:00.000Z",
15342
+ "expiresAt": "2026-09-27T08:00:00.000Z",
15343
+ "mine": false
15344
+ }
15345
+ ],
15346
+ "page": 1,
15347
+ "pageSize": 10,
15348
+ "total": 1,
15349
+ "mine": {
15350
+ "orders": [],
15351
+ "trades": []
15352
+ },
15353
+ "limits": {
15354
+ "minAmount": 1000,
15355
+ "maxOpenOrders": 5,
15356
+ "activeOrders": 1,
15357
+ "feePercent": 5,
15358
+ "government": 10,
15359
+ "dailyLimit": 30000,
15360
+ "dailyUsed": 0,
15361
+ "dailyRemaining": 30000,
15362
+ "locked": false,
15363
+ "lockedReason": null,
15364
+ "priceRangeResource": {
15365
+ "min": 0.5,
15366
+ "max": 2
15367
+ },
15368
+ "priceRangeGold": {
15369
+ "min": 0.125,
15370
+ "max": 0.5
15371
+ }
15372
+ }
15373
+ }
15374
+ }
15375
+ ]
15376
+ }
15377
+ ],
15378
+ "agentNote": "先 GET_MARKET 看 orders 与 limits:locked 为 true 时不能交易。单价范围见 limits;吃单前确认自己 buyResource 足够。成交后商队要飞一会儿,deliveredAt 为 null 表示还在路上。"
15379
+ },
15380
+ {
15381
+ "op": 134,
15382
+ "kind": "request",
15383
+ "name": "CREATE_MARKET_ORDER",
15384
+ "title": "挂单卖出资源(v78,AISLG-196)",
15385
+ "preAuth": false,
15386
+ "summary": "玩家之间挂单买卖粮 / 木 / 石 / 铁(可收另一种资源或金币)。挂单时卖出的资源立即从挂单城冻结;吃单可整单或部分成交,成交时买家立即扣款,双方各派一支商队送货(每格 15 秒基准 ÷ 全局缩放,出发城驿站与行军科技有效;商队不会被截击)。成交双方各扣 5% 手续费。未成交部分随时可撤,48 小时后自动撤单退还。价格:资源之间 0.5–2(每 1 个卖出资源换多少个收取资源),收金币 0.125–0.5;单张最少 1000,每账号最多 5 张。每日成交额度 = 主城官府等级 × 3000 × 全局缩放(按卖出资源数量折算、买卖合计,北京日重置)。门槛:主城官府 ≥ 5 且不在新手保护期。可勾选「只卖给盟友」(同联盟成员才可见 / 可买)。 卖出资源从当前城(可带 cityId)立即冻结;挂单后可在 GET_MARKET 的 mine.orders 看到。单价超范围返回 PRICE_OUT_OF_RANGE;官府 / 保护期门槛 MARKET_LOCKED;满 5 张 ORDER_LIMIT;sellResource 与 buyResource 相同(卖什么就收什么)返回 INVALID_PARAMS。",
15387
+ "requestFields": [
15388
+ {
15389
+ "name": "sellResource",
15390
+ "type": "'food' | 'wood' | 'stone' | 'iron'",
15391
+ "desc": "必填。卖出的资源。"
15392
+ },
15393
+ {
15394
+ "name": "buyResource",
15395
+ "type": "'food' | 'wood' | 'stone' | 'iron' | 'gold'",
15396
+ "desc": "必填。收取的资源或金币;必须与 sellResource 不同(同资源挂单返回 INVALID_PARAMS)。"
15397
+ },
15398
+ {
15399
+ "name": "amount",
15400
+ "type": "number",
15401
+ "desc": "必填。卖出总量,≥ 1000,不能超过挂单城现有数量。"
15402
+ },
15403
+ {
15404
+ "name": "unitPrice",
15405
+ "type": "number",
15406
+ "desc": "必填。每 1 个卖出资源换多少个收取物;范围见 GET_MARKET 的 limits(资源 0.5–2 / 金币 0.125–0.5,最多 4 位小数)。"
15407
+ },
15408
+ {
15409
+ "name": "allyOnly",
15410
+ "type": "boolean",
15411
+ "desc": "可选。true = 只卖给同联盟成员。"
15412
+ }
15413
+ ],
15414
+ "dataFields": [
15415
+ {
15416
+ "name": "order",
15417
+ "type": "object",
15418
+ "desc": "新挂单,结构同 GET_MARKET 的 orders。"
15419
+ },
15420
+ {
15421
+ "name": "limits",
15422
+ "type": "object",
15423
+ "desc": "挂单后的额度,结构同 GET_MARKET 的 limits。"
15424
+ }
15425
+ ],
15426
+ "errors": [
15427
+ "INVALID_PARAMS",
15428
+ "MARKET_LOCKED",
15429
+ "PRICE_OUT_OF_RANGE",
15430
+ "ORDER_LIMIT",
15431
+ "INSUFFICIENT_RESOURCES"
15432
+ ],
15433
+ "examples": [
15434
+ {
15435
+ "caption": "卖 1 万铁,每 1 铁换 1.2 粮",
15436
+ "request": {
15437
+ "op": 134,
15438
+ "seq": 61,
15439
+ "data": {
15440
+ "sellResource": "iron",
15441
+ "buyResource": "food",
15442
+ "amount": 10000,
15443
+ "unitPrice": 1.2
15444
+ }
15445
+ },
15446
+ "responses": [
15447
+ {
15448
+ "op": 134,
15449
+ "seq": 61,
15450
+ "ok": true,
15451
+ "data": {
15452
+ "order": {
15453
+ "id": "4a9c2b1d-3e5f-4a60-8b71-2c3d4e5f6a70",
15454
+ "seller": {
15455
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15456
+ "username": "alice",
15457
+ "nobility": 3,
15458
+ "nobilityName": "大夫",
15459
+ "allianceId": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
15460
+ "allianceName": "卧龙盟"
15461
+ },
15462
+ "city": {
15463
+ "id": "5b1c3d2e-4f60-4a71-8c82-3d4e5f6a7b80",
15464
+ "name": "主城",
15465
+ "x": 612,
15466
+ "y": 388
15467
+ },
15468
+ "sellResource": "iron",
15469
+ "buyResource": "food",
15470
+ "total": 10000,
15471
+ "remaining": 10000,
15472
+ "unitPrice": 1.2,
15473
+ "allyOnly": false,
15474
+ "createdAt": "2026-09-25T08:00:00.000Z",
15475
+ "expiresAt": "2026-09-27T08:00:00.000Z",
15476
+ "mine": true
15477
+ },
15478
+ "limits": {
15479
+ "minAmount": 1000,
15480
+ "maxOpenOrders": 5,
15481
+ "activeOrders": 2,
15482
+ "feePercent": 5,
15483
+ "government": 10,
15484
+ "dailyLimit": 30000,
15485
+ "dailyUsed": 0,
15486
+ "dailyRemaining": 30000,
15487
+ "locked": false,
15488
+ "lockedReason": null,
15489
+ "priceRangeResource": {
15490
+ "min": 0.5,
15491
+ "max": 2
15492
+ },
15493
+ "priceRangeGold": {
15494
+ "min": 0.125,
15495
+ "max": 0.5
15496
+ }
15497
+ }
15498
+ }
15499
+ }
15500
+ ]
15501
+ }
15502
+ ],
15503
+ "agentNote": "挂单前算好单价:资源之间参考价 1:1,收金币参考价 0.25。只卖给盟友可减少被陌生人吃掉,但也少买家。"
15504
+ },
15505
+ {
15506
+ "op": 135,
15507
+ "kind": "request",
15508
+ "name": "BUY_MARKET_ORDER",
15509
+ "title": "吃单(v78,AISLG-196)",
15510
+ "preAuth": false,
15511
+ "summary": "玩家之间挂单买卖粮 / 木 / 石 / 铁(可收另一种资源或金币)。挂单时卖出的资源立即从挂单城冻结;吃单可整单或部分成交,成交时买家立即扣款,双方各派一支商队送货(每格 15 秒基准 ÷ 全局缩放,出发城驿站与行军科技有效;商队不会被截击)。成交双方各扣 5% 手续费。未成交部分随时可撤,48 小时后自动撤单退还。价格:资源之间 0.5–2(每 1 个卖出资源换多少个收取资源),收金币 0.125–0.5;单张最少 1000,每账号最多 5 张。每日成交额度 = 主城官府等级 × 3000 × 全局缩放(按卖出资源数量折算、买卖合计,北京日重置)。门槛:主城官府 ≥ 5 且不在新手保护期。可勾选「只卖给盟友」(同联盟成员才可见 / 可买)。 吃单可整单或部分(quantity ≤ remaining)。成交时锁挂单行、扣买家款、按 5% 手续费拆出双方实收并各派一支商队。挂单只卖给盟友时非盟友返回 MARKET_ALLY_ONLY;额度不足 DAILY_TRADE_LIMIT;挂单已被别人吃空返回 ORDER_NOT_FOUND。",
15512
+ "requestFields": [
15513
+ {
15514
+ "name": "orderId",
15515
+ "type": "string",
15516
+ "desc": "必填。挂单 id。"
15517
+ },
15518
+ {
15519
+ "name": "quantity",
15520
+ "type": "number",
15521
+ "desc": "必填。买入数量(正整数,≤ 挂单剩余量)。"
15522
+ }
15523
+ ],
15524
+ "dataFields": [
15525
+ {
15526
+ "name": "trade",
15527
+ "type": "object",
15528
+ "desc": "成交记录(买家视角),结构同 GET_MARKET 的 mine.trades。"
15529
+ },
15530
+ {
15531
+ "name": "remaining",
15532
+ "type": "number",
15533
+ "desc": "成交后挂单剩余量(0 = 售罄)。"
15534
+ },
15535
+ {
15536
+ "name": "limits",
15537
+ "type": "object",
15538
+ "desc": "成交后的额度,结构同 GET_MARKET 的 limits。"
15539
+ }
15540
+ ],
15541
+ "errors": [
15542
+ "INVALID_PARAMS",
15543
+ "MARKET_LOCKED",
15544
+ "MARKET_ALLY_ONLY",
15545
+ "DAILY_TRADE_LIMIT",
15546
+ "ORDER_NOT_FOUND",
15547
+ "INSUFFICIENT_RESOURCES"
15548
+ ],
15549
+ "examples": [
15550
+ {
15551
+ "caption": "买 4000 铁(付 4800 粮,实收 3800 铁)",
15552
+ "request": {
15553
+ "op": 135,
15554
+ "seq": 62,
15555
+ "data": {
15556
+ "orderId": "4a9c2b1d-3e5f-4a60-8b71-2c3d4e5f6a70",
15557
+ "quantity": 4000
15558
+ }
15559
+ },
15560
+ "responses": [
15561
+ {
15562
+ "op": 135,
15563
+ "seq": 62,
15564
+ "ok": true,
15565
+ "data": {
15566
+ "trade": {
15567
+ "id": "…",
15568
+ "role": "buy",
15569
+ "other": {
15570
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15571
+ "username": "alice"
15572
+ },
15573
+ "sellResource": "iron",
15574
+ "buyResource": "food",
15575
+ "quantity": 4000,
15576
+ "paid": 4800,
15577
+ "delivered": 3800,
15578
+ "fee": 200,
15579
+ "createdAt": "2026-09-25T08:00:00.000Z",
15580
+ "deliveredAt": null
15581
+ },
15582
+ "remaining": 6000,
15583
+ "limits": {
15584
+ "minAmount": 1000,
15585
+ "maxOpenOrders": 5,
15586
+ "activeOrders": 1,
15587
+ "feePercent": 5,
15588
+ "government": 10,
15589
+ "dailyLimit": 30000,
15590
+ "dailyUsed": 4000,
15591
+ "dailyRemaining": 30000,
15592
+ "locked": false,
15593
+ "lockedReason": null,
15594
+ "priceRangeResource": {
15595
+ "min": 0.5,
15596
+ "max": 2
15597
+ },
15598
+ "priceRangeGold": {
15599
+ "min": 0.125,
15600
+ "max": 0.5
15601
+ }
15602
+ }
15603
+ }
15604
+ }
15605
+ ]
15606
+ }
15607
+ ],
15608
+ "agentNote": "部分成交可以拆单降低一次性投入;注意 5% 手续费与商队飞行时间。额度按卖出资源数量计,买卖都占额度。"
15609
+ },
15610
+ {
15611
+ "op": 136,
15612
+ "kind": "request",
15613
+ "name": "CANCEL_MARKET_ORDER",
15614
+ "title": "撤单(v78,AISLG-196)",
15615
+ "preAuth": false,
15616
+ "summary": "玩家之间挂单买卖粮 / 木 / 石 / 铁(可收另一种资源或金币)。挂单时卖出的资源立即从挂单城冻结;吃单可整单或部分成交,成交时买家立即扣款,双方各派一支商队送货(每格 15 秒基准 ÷ 全局缩放,出发城驿站与行军科技有效;商队不会被截击)。成交双方各扣 5% 手续费。未成交部分随时可撤,48 小时后自动撤单退还。价格:资源之间 0.5–2(每 1 个卖出资源换多少个收取资源),收金币 0.125–0.5;单张最少 1000,每账号最多 5 张。每日成交额度 = 主城官府等级 × 3000 × 全局缩放(按卖出资源数量折算、买卖合计,北京日重置)。门槛:主城官府 ≥ 5 且不在新手保护期。可勾选「只卖给盟友」(同联盟成员才可见 / 可买)。 卖家可随时撤回未成交部分,冻结资源立即退还到挂单城;已售罄 / 已过期返回 ORDER_NOT_CANCELLABLE。",
15617
+ "requestFields": [
15618
+ {
15619
+ "name": "orderId",
15620
+ "type": "string",
15621
+ "desc": "必填。挂单 id(只能是自己的)。"
15622
+ }
15623
+ ],
15624
+ "dataFields": [
15625
+ {
15626
+ "name": "orderId",
15627
+ "type": "string",
15628
+ "desc": "撤单的挂单 id。"
15629
+ },
15630
+ {
15631
+ "name": "refunded",
15632
+ "type": "number",
15633
+ "desc": "退还数量。"
15634
+ },
15635
+ {
15636
+ "name": "resource",
15637
+ "type": "string",
15638
+ "desc": "退还的资源种类。"
15639
+ },
15640
+ {
15641
+ "name": "limits",
15642
+ "type": "object",
15643
+ "desc": "撤单后的额度,结构同 GET_MARKET 的 limits。"
15644
+ }
15645
+ ],
15646
+ "errors": [
15647
+ "INVALID_PARAMS",
15648
+ "ORDER_NOT_FOUND",
15649
+ "ORDER_NOT_CANCELLABLE"
15650
+ ],
15651
+ "examples": [
15652
+ {
15653
+ "caption": "撤回 6000 铁",
15654
+ "request": {
15655
+ "op": 136,
15656
+ "seq": 63,
15657
+ "data": {
15658
+ "orderId": "4a9c2b1d-3e5f-4a60-8b71-2c3d4e5f6a70"
15659
+ }
15660
+ },
15661
+ "responses": [
15662
+ {
15663
+ "op": 136,
15664
+ "seq": 63,
15665
+ "ok": true,
15666
+ "data": {
15667
+ "orderId": "4a9c2b1d-3e5f-4a60-8b71-2c3d4e5f6a70",
15668
+ "refunded": 6000,
15669
+ "resource": "iron",
15670
+ "limits": {
15671
+ "minAmount": 1000,
15672
+ "maxOpenOrders": 5,
15673
+ "activeOrders": 1,
15674
+ "feePercent": 5,
15675
+ "government": 10,
15676
+ "dailyLimit": 30000,
15677
+ "dailyUsed": 0,
15678
+ "dailyRemaining": 30000,
15679
+ "locked": false,
15680
+ "lockedReason": null,
15681
+ "priceRangeResource": {
15682
+ "min": 0.5,
15683
+ "max": 2
15684
+ },
15685
+ "priceRangeGold": {
15686
+ "min": 0.125,
15687
+ "max": 0.5
15688
+ }
15689
+ }
15690
+ }
15691
+ }
15692
+ ]
15693
+ }
15694
+ ],
15695
+ "agentNote": "挂单 48 小时会自动撤单退款,不需要手动撤;急着用资源时再撤。"
15696
+ },
15697
+ {
15698
+ "op": 137,
15699
+ "kind": "request",
15700
+ "name": "GET_LUOYANG",
15701
+ "title": "查询洛阳争夺状态(v79,AISLG-200)",
15702
+ "preAuth": false,
15703
+ "summary": "洛阳是 8 座名城之一,仍是占领者的分城;占领者所在联盟成为「洛阳之主」,占领者本人是「洛阳太守」。洛阳被玩家占领后,只在每周六 21:00–23:00(北京时间,现实时间)可以被攻打 / 侦察;窗口外返回 LUOYANG_CLOSED(附 nextOpenAt)。窗口内洛阳没有被动免战、城防值不回涨,每次打赢按现有规则扣城防,归零换主;窗口结束时城防回满并进入保护。洛阳可接收 10 支协防(普通城 5 支),盟友 / 友盟都能协防。洛阳之主联盟全员所有城的粮木石铁产量 +5%(与名城 / 科技 / 城守同一百分比池相加)。盟主每 7 天可以发布一道政令(三选一,持续 7 天):征兵时长 −15% / 行军速度 +10% / 科技研究时长 −15%;洛阳易主时旧政令立即失效。赛季结束时占有洛阳的联盟进入名人堂,结算时在盟成员每人获得 10,000 金币与四资源各 50,000。窗口预告 / 开始 / 结束、洛阳易主、政令发布都有全服播报,并在相关联盟频道发系统消息。 本协议返回洛阳占领者、争夺窗口、洛阳之主联盟加成与当前政令;玩家与 Agent 通用。",
15704
+ "requestFields": [],
15705
+ "dataFields": [
15706
+ {
15707
+ "name": "owner",
15708
+ "type": "object | null",
15709
+ "desc": "洛阳当前占领者(玩家分城):{ cityId, cityName, accountId, username, allianceId, allianceName, durability };NPC 阶段为 null。"
15710
+ },
15711
+ {
15712
+ "name": "windowOpen / windowStartAt / windowEndAt / nextOpenAt",
15713
+ "type": "boolean / string",
15714
+ "desc": "当前是否在争夺窗口、本次窗口起止、下一次开放时刻(北京时间周六 21:00–23:00)。"
15715
+ },
15716
+ {
15717
+ "name": "bonusPercent",
15718
+ "type": "number",
15719
+ "desc": "洛阳之主联盟全员的四资源产量加成(当前 5);不是洛阳之主为 0。"
15720
+ },
15721
+ {
15722
+ "name": "assistCap",
15723
+ "type": "number",
15724
+ "desc": "洛阳可接收的协防部队上限(当前 10)。"
15725
+ },
15726
+ {
15727
+ "name": "decree",
15728
+ "type": "object | null",
15729
+ "desc": "生效中的政令:{ kind: recruit|march|research, until, nextAt, canPublish, leaderName };没有为 null。"
15730
+ },
15731
+ {
15732
+ "name": "canPublishDecree / decreeNextAt / myAllianceIsHolder",
15733
+ "type": "boolean / string / boolean",
15734
+ "desc": "我是否能发政令、下次可发时刻、我所在联盟是否洛阳之主。"
15735
+ }
15736
+ ],
15737
+ "errors": [],
15738
+ "examples": [
15739
+ {
15740
+ "caption": "洛阳由卧龙盟占领,本周窗口未开,征兵政令生效中",
15741
+ "request": {
15742
+ "op": 137,
15743
+ "seq": 70,
15744
+ "data": {}
15745
+ },
15746
+ "responses": [
15747
+ {
15748
+ "op": 137,
15749
+ "seq": 70,
15750
+ "ok": true,
15751
+ "data": {
15752
+ "owner": {
15753
+ "cityId": "5b1c3d2e-4f60-4a71-8c82-3d4e5f6a7b80",
15754
+ "cityName": "洛阳",
15755
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15756
+ "username": "alice",
15757
+ "allianceId": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
15758
+ "allianceName": "卧龙盟",
15759
+ "durability": 65
15760
+ },
15761
+ "windowOpen": false,
15762
+ "windowStartAt": "2026-10-31T13:00:00.000Z",
15763
+ "windowEndAt": "2026-10-31T15:00:00.000Z",
15764
+ "nextOpenAt": "2026-10-31T13:00:00.000Z",
15765
+ "bonusPercent": 5,
15766
+ "assistCap": 10,
15767
+ "decree": {
15768
+ "kind": "recruit",
15769
+ "until": "2026-11-03T04:00:00.000Z",
15770
+ "nextAt": "2026-11-03T04:00:00.000Z",
15771
+ "canPublish": false,
15772
+ "leaderName": "alice"
15773
+ },
15774
+ "canPublishDecree": false,
15775
+ "decreeNextAt": "2026-11-03T04:00:00.000Z",
15776
+ "myAllianceIsHolder": true
15777
+ }
15778
+ }
15779
+ ]
15780
+ }
15781
+ ],
15782
+ "agentNote": "窗口外不要对洛阳发起掠夺 / 占领 / 侦察(LUOYANG_CLOSED)。窗口内洛阳无被动免战、城防不回涨;攻方要有空分城名额。洛阳之主盟员可享受 +5% 产量,盟主每 7 天可发政令。"
15783
+ },
15784
+ {
15785
+ "op": 138,
15786
+ "kind": "request",
15787
+ "name": "PUBLISH_DECREE",
15788
+ "title": "发布洛阳政令(v79,AISLG-200)",
15789
+ "preAuth": false,
15790
+ "summary": "洛阳是 8 座名城之一,仍是占领者的分城;占领者所在联盟成为「洛阳之主」,占领者本人是「洛阳太守」。洛阳被玩家占领后,只在每周六 21:00–23:00(北京时间,现实时间)可以被攻打 / 侦察;窗口外返回 LUOYANG_CLOSED(附 nextOpenAt)。窗口内洛阳没有被动免战、城防值不回涨,每次打赢按现有规则扣城防,归零换主;窗口结束时城防回满并进入保护。洛阳可接收 10 支协防(普通城 5 支),盟友 / 友盟都能协防。洛阳之主联盟全员所有城的粮木石铁产量 +5%(与名城 / 科技 / 城守同一百分比池相加)。盟主每 7 天可以发布一道政令(三选一,持续 7 天):征兵时长 −15% / 行军速度 +10% / 科技研究时长 −15%;洛阳易主时旧政令立即失效。赛季结束时占有洛阳的联盟进入名人堂,结算时在盟成员每人获得 10,000 金币与四资源各 50,000。窗口预告 / 开始 / 结束、洛阳易主、政令发布都有全服播报,并在相关联盟频道发系统消息。 仅洛阳之主联盟的盟主(玩家连接)可发布;每 7 天一次,持续 7 天,三选一(recruit / march / research)。发布后全服播报并在联盟频道发系统消息。",
15791
+ "requestFields": [
15792
+ {
15793
+ "name": "kind",
15794
+ "type": "'recruit' | 'march' | 'research'",
15795
+ "desc": "政令:征兵时长 −15% / 行军速度 +10% / 科技研究时长 −15%。"
15796
+ }
15797
+ ],
15798
+ "dataFields": [
15799
+ {
15800
+ "name": "(同 GET_LUOYANG)",
15801
+ "type": "object",
15802
+ "desc": "发布后的洛阳状态(含新政令)。"
15803
+ }
15804
+ ],
15805
+ "errors": [
15806
+ "INVALID_PARAMS",
15807
+ "AGENT_FORBIDDEN",
15808
+ "DECREE_NOT_HOLDER",
15809
+ "DECREE_COOLDOWN"
15810
+ ],
15811
+ "examples": [
15812
+ {
15813
+ "caption": "发布征兵政令",
15814
+ "request": {
15815
+ "op": 138,
15816
+ "seq": 71,
15817
+ "data": {
15818
+ "kind": "recruit"
15819
+ }
15820
+ },
15821
+ "responses": [
15822
+ {
15823
+ "op": 138,
15824
+ "seq": 71,
15825
+ "ok": true,
15826
+ "data": {
15827
+ "owner": {
15828
+ "cityId": "5b1c3d2e-4f60-4a71-8c82-3d4e5f6a7b80",
15829
+ "cityName": "洛阳",
15830
+ "accountId": "6f1e2d3c-4b5a-4978-8c6d-5e4f3a2b1c0d",
15831
+ "username": "alice",
15832
+ "allianceId": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
15833
+ "allianceName": "卧龙盟",
15834
+ "durability": 65
15835
+ },
15836
+ "windowOpen": false,
15837
+ "windowStartAt": "2026-10-31T13:00:00.000Z",
15838
+ "windowEndAt": "2026-10-31T15:00:00.000Z",
15839
+ "nextOpenAt": "2026-10-31T13:00:00.000Z",
15840
+ "bonusPercent": 5,
15841
+ "assistCap": 10,
15842
+ "decree": {
15843
+ "kind": "recruit",
15844
+ "until": "2026-11-03T04:00:00.000Z",
15845
+ "nextAt": "2026-11-03T04:00:00.000Z",
15846
+ "canPublish": false,
15847
+ "leaderName": "alice"
15848
+ },
15849
+ "canPublishDecree": false,
15850
+ "decreeNextAt": "2026-11-03T04:00:00.000Z",
15851
+ "myAllianceIsHolder": true
15852
+ }
15853
+ }
15854
+ ]
15855
+ }
15856
+ ],
15857
+ "agentNote": "管理操作需要玩家盟主本人;Agent 只能查询 GET_LUOYANG。政令到期后自动失效,冷却按发布时刻 +7 天。"
15858
+ },
15859
+ {
15860
+ "op": 139,
15861
+ "kind": "request",
15862
+ "name": "FIRE_BATTLEFIELD_STRONGHOLD",
15863
+ "title": "赤壁火攻(v80,AISLG-199)",
15864
+ "preAuth": false,
15865
+ "summary": "仅赤壁场次、孙刘方(me.camp = yuan)、已入场,并且当前风向为东南风(event.wind.direction = se)时可用:花 300 军功,火攻一座曹方据点(ownerCamp = cao)。目标必须与己方据点相邻(曼哈顿距离 ≤ 10)。效果立即结算:对守军造成总生命 20% 的伤害(目标处于连锁战船期间为 40%);伤害按各兵种生命比例写入据点余伤池,整单位折算阵亡,阵亡按 NPC 守军与据守队伍的占比分摊。同一目标每 2 小时最多被火攻一次(冷却 fireNextAt)。火攻不计军功,也不改变归属,要靠后续攻打夺下据点。",
15866
+ "requestFields": [
15867
+ {
15868
+ "name": "strongholdId",
15869
+ "type": "string",
15870
+ "desc": "必填。目标曹方据点 id。"
15871
+ }
15872
+ ],
15873
+ "dataFields": [
15874
+ {
15875
+ "name": "event",
15876
+ "type": "object | null",
15877
+ "desc": "当前 / 最近一场战场:{ id, script: guandu|dongzhuo|chibi, name, status: signup|active|finished, signupStartAt, startAt, endAt, camps: { yuan: { camp, name, signups, entered, score }, cao: 同结构 }, winner: yuan|cao|null, finishReason: score|base_captured|null, underdog: { camp, multiplier } | null, wind: 赤壁专有 { direction: se|nw, label, bonusCamp, nextAt, noticeAt }(其他剧本为 null) }。从未开过为 null。"
15878
+ },
15879
+ {
15880
+ "name": "nextSignupAt",
15881
+ "type": "string",
15882
+ "desc": "下一场报名开始时刻(北京时间每周二 20:00)。"
15883
+ },
15884
+ {
15885
+ "name": "nextScript",
15886
+ "type": "'guandu' | 'dongzhuo' | 'chibi'",
15887
+ "desc": "下一场的剧本(轮换预告)。"
15888
+ },
15889
+ {
15890
+ "name": "strongholds",
15891
+ "type": "array",
15892
+ "desc": "本场据点(官渡 9 个 / 讨董 3 关 / 赤壁 10 个;讨董按推进线顺序):{ id, name, kind: base|ford|post|granary, x, y, ownerCamp: yuan|cao|null(null = 中立 NPC;讨董的董卓军也是 null), pointsPerHour, garrison(全兵种计数,NPC + 玩家据守合计), garrisonPower(参考战力), wallLevel, towerLevel, firstCaptureAvailable(首占 +200 军功还没被拿过), capturedAt, unlocked(讨董:前一关未打下为 false;其他剧本恒为 true), chainUntil(赤壁曹方连锁截止,其他 null), fireNextAt(赤壁火攻冷却截止,其他 null) }。"
15893
+ },
15894
+ {
15895
+ "name": "me",
15896
+ "type": "object | null",
15897
+ "desc": "本场我的状态:{ accountId, username, camp, merit 本场军功, rank 本场名次(未入场为 null), entered, squads: [{ id, x, y, status: marching|idle|garrison, troops, targetX, targetY, targetStrongholdId, arriveAt, originX, originY, strongholdId }], cumulativeMerit 跨场军功余额 };未报名为 null。"
15898
+ },
15899
+ {
15900
+ "name": "top",
15901
+ "type": "array",
15902
+ "desc": "本场军功榜前 10:{ rank, accountId, username, camp, merit }(同分并列,军功 0 不上榜)。"
15903
+ },
15904
+ {
15905
+ "name": "shop",
15906
+ "type": "object",
15907
+ "desc": "战场商店(赤壁多一个 iron_cavalry):{ cumulativeMerit, items: [{ item: resources|hero_exp|swordsman|cavalry|iron_cavalry, label, cost, limit, bought 本场已买, reward: { resources? , heroExp?, troop?, count? } }] }。"
15908
+ },
15909
+ {
15910
+ "name": "rewards",
15911
+ "type": "object",
15912
+ "desc": "奖励表:{ winner { label, gold, resourcesEach }, loser 同结构, rankTiers: [{ label, rank, maxRank, gold, resourcesEach }], progressTiers: [{ label, progress, gold, resourcesEach }](讨董的全服进度档;其他剧本为空数组) }。"
15913
+ }
15914
+ ],
15915
+ "errors": [
15916
+ "INVALID_PARAMS",
15917
+ "BATTLEFIELD_NOT_ACTIVE",
15918
+ "BATTLEFIELD_SKILL_UNAVAILABLE",
15919
+ "BATTLEFIELD_NOT_JOINED",
15920
+ "BATTLEFIELD_NOT_ENTERED",
15921
+ "BATTLEFIELD_WIND_MISMATCH",
15922
+ "BATTLEFIELD_TARGET_INVALID",
15923
+ "BATTLEFIELD_FIRE_COOLDOWN",
15924
+ "BATTLEFIELD_MERIT_INSUFFICIENT"
15925
+ ],
15926
+ "examples": [
15927
+ {
15928
+ "caption": "东南风期间火攻相邻的巴丘据点",
15929
+ "request": {
15930
+ "op": 139,
15931
+ "seq": 36,
15932
+ "data": {
15933
+ "strongholdId": "cao_2"
15934
+ }
15935
+ },
15936
+ "responses": [
15937
+ {
15938
+ "op": 139,
15939
+ "seq": 36,
15940
+ "ok": true,
15941
+ "data": {
15942
+ "event": {
15943
+ "id": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
15944
+ "script": "guandu",
15945
+ "name": "官渡之战",
15946
+ "status": "active",
15947
+ "signupStartAt": "2026-09-24T08:00:00.000Z",
15948
+ "startAt": "2026-09-25T08:00:00.000Z",
15949
+ "endAt": "2026-09-26T08:00:00.000Z",
15950
+ "camps": {
15951
+ "yuan": {
15952
+ "camp": "yuan",
15953
+ "name": "袁绍军",
15954
+ "signups": 12,
15955
+ "entered": 10,
15956
+ "score": 180
15957
+ },
15958
+ "cao": {
15959
+ "camp": "cao",
15960
+ "name": "曹操军",
15961
+ "signups": 15,
15962
+ "entered": 13,
15963
+ "score": 240
15964
+ }
15965
+ },
15966
+ "winner": null,
15967
+ "finishReason": null,
15968
+ "underdog": null
15969
+ },
15970
+ "strongholds": [
15971
+ {
15972
+ "id": "cao_2",
15973
+ "name": "曹操据点·巴丘",
15974
+ "kind": "ford",
15975
+ "x": 23,
15976
+ "y": 15,
15977
+ "ownerCamp": "cao",
15978
+ "pointsPerHour": 10,
15979
+ "garrison": {
15980
+ "porter": 0,
15981
+ "militia": 96,
15982
+ "scout": 0,
15983
+ "pikeman": 0,
15984
+ "swordsman": 40,
15985
+ "archer": 48,
15986
+ "cavalry": 15,
15987
+ "iron_cavalry": 0,
15988
+ "supply_wagon": 0,
15989
+ "ballista": 0,
15990
+ "siege_ram": 0,
15991
+ "yulin_guard": 0,
15992
+ "danyang_soldier": 0,
15993
+ "baimao_soldier": 0,
15994
+ "huwei_guard": 0,
15995
+ "zhuge_crossbow": 0,
15996
+ "xiandeng_warrior": 0,
15997
+ "hubao_cavalry": 0,
15998
+ "xiliang_cavalry": 0
15999
+ },
16000
+ "garrisonPower": 560,
16001
+ "wallLevel": 0,
16002
+ "towerLevel": 0,
16003
+ "firstCaptureAvailable": false,
16004
+ "capturedAt": "2026-09-25T08:00:00.000Z",
16005
+ "chainUntil": null,
16006
+ "fireNextAt": "2026-09-25T10:00:00.000Z",
16007
+ "unlocked": true
16008
+ }
16009
+ ]
16010
+ }
16011
+ }
16012
+ ]
16013
+ }
16014
+ ],
16015
+ "agentNote": "火攻前先看 event.wind:只有东南风能用,西北风要等下一次切换(event.wind.nextAt)。挑一个 ownerCamp = cao、fireNextAt 已过的相邻据点;目标处于连锁期时伤害翻倍,所以优先挑没有连锁的目标。每次 300 军功,冷却中的目标别反复尝试。"
16016
+ },
16017
+ {
16018
+ "op": 140,
16019
+ "kind": "request",
16020
+ "name": "CHAIN_BATTLEFIELD_STRONGHOLD",
16021
+ "title": "赤壁连锁战船(v80,AISLG-199)",
16022
+ "preAuth": false,
16023
+ "summary": "仅赤壁场次、曹操军(me.camp = cao)、已入场可用:花 200 军功,给一座己方据点(ownerCamp = cao)连锁 6 小时(chainUntil):该据点守军受到的伤害 −15%,但被火攻时伤害翻倍。连锁期间不能重复连锁(BATTLEFIELD_CHAIN_ACTIVE);据点易手后连锁立即失效。",
16024
+ "requestFields": [
16025
+ {
16026
+ "name": "strongholdId",
16027
+ "type": "string",
16028
+ "desc": "必填。己方据点 id。"
16029
+ }
16030
+ ],
16031
+ "dataFields": [
16032
+ {
16033
+ "name": "event",
16034
+ "type": "object | null",
16035
+ "desc": "当前 / 最近一场战场:{ id, script: guandu|dongzhuo|chibi, name, status: signup|active|finished, signupStartAt, startAt, endAt, camps: { yuan: { camp, name, signups, entered, score }, cao: 同结构 }, winner: yuan|cao|null, finishReason: score|base_captured|null, underdog: { camp, multiplier } | null, wind: 赤壁专有 { direction: se|nw, label, bonusCamp, nextAt, noticeAt }(其他剧本为 null) }。从未开过为 null。"
16036
+ },
16037
+ {
16038
+ "name": "nextSignupAt",
16039
+ "type": "string",
16040
+ "desc": "下一场报名开始时刻(北京时间每周二 20:00)。"
16041
+ },
16042
+ {
16043
+ "name": "nextScript",
16044
+ "type": "'guandu' | 'dongzhuo' | 'chibi'",
16045
+ "desc": "下一场的剧本(轮换预告)。"
16046
+ },
16047
+ {
16048
+ "name": "strongholds",
16049
+ "type": "array",
16050
+ "desc": "本场据点(官渡 9 个 / 讨董 3 关 / 赤壁 10 个;讨董按推进线顺序):{ id, name, kind: base|ford|post|granary, x, y, ownerCamp: yuan|cao|null(null = 中立 NPC;讨董的董卓军也是 null), pointsPerHour, garrison(全兵种计数,NPC + 玩家据守合计), garrisonPower(参考战力), wallLevel, towerLevel, firstCaptureAvailable(首占 +200 军功还没被拿过), capturedAt, unlocked(讨董:前一关未打下为 false;其他剧本恒为 true), chainUntil(赤壁曹方连锁截止,其他 null), fireNextAt(赤壁火攻冷却截止,其他 null) }。"
16051
+ },
16052
+ {
16053
+ "name": "me",
16054
+ "type": "object | null",
16055
+ "desc": "本场我的状态:{ accountId, username, camp, merit 本场军功, rank 本场名次(未入场为 null), entered, squads: [{ id, x, y, status: marching|idle|garrison, troops, targetX, targetY, targetStrongholdId, arriveAt, originX, originY, strongholdId }], cumulativeMerit 跨场军功余额 };未报名为 null。"
16056
+ },
16057
+ {
16058
+ "name": "top",
16059
+ "type": "array",
16060
+ "desc": "本场军功榜前 10:{ rank, accountId, username, camp, merit }(同分并列,军功 0 不上榜)。"
16061
+ },
16062
+ {
16063
+ "name": "shop",
16064
+ "type": "object",
16065
+ "desc": "战场商店(赤壁多一个 iron_cavalry):{ cumulativeMerit, items: [{ item: resources|hero_exp|swordsman|cavalry|iron_cavalry, label, cost, limit, bought 本场已买, reward: { resources? , heroExp?, troop?, count? } }] }。"
16066
+ },
16067
+ {
16068
+ "name": "rewards",
16069
+ "type": "object",
16070
+ "desc": "奖励表:{ winner { label, gold, resourcesEach }, loser 同结构, rankTiers: [{ label, rank, maxRank, gold, resourcesEach }], progressTiers: [{ label, progress, gold, resourcesEach }](讨董的全服进度档;其他剧本为空数组) }。"
16071
+ }
16072
+ ],
16073
+ "errors": [
16074
+ "INVALID_PARAMS",
16075
+ "BATTLEFIELD_NOT_ACTIVE",
16076
+ "BATTLEFIELD_SKILL_UNAVAILABLE",
16077
+ "BATTLEFIELD_NOT_JOINED",
16078
+ "BATTLEFIELD_NOT_ENTERED",
16079
+ "BATTLEFIELD_TARGET_INVALID",
16080
+ "BATTLEFIELD_CHAIN_ACTIVE",
16081
+ "BATTLEFIELD_MERIT_INSUFFICIENT"
16082
+ ],
16083
+ "examples": [
16084
+ {
16085
+ "caption": "给江陵据点连锁战船",
16086
+ "request": {
16087
+ "op": 140,
16088
+ "seq": 37,
16089
+ "data": {
16090
+ "strongholdId": "cao_1"
16091
+ }
16092
+ },
16093
+ "responses": [
16094
+ {
16095
+ "op": 140,
16096
+ "seq": 37,
16097
+ "ok": true,
16098
+ "data": {
16099
+ "event": {
16100
+ "id": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
16101
+ "script": "guandu",
16102
+ "name": "官渡之战",
16103
+ "status": "active",
16104
+ "signupStartAt": "2026-09-24T08:00:00.000Z",
16105
+ "startAt": "2026-09-25T08:00:00.000Z",
16106
+ "endAt": "2026-09-26T08:00:00.000Z",
16107
+ "camps": {
16108
+ "yuan": {
16109
+ "camp": "yuan",
16110
+ "name": "袁绍军",
16111
+ "signups": 12,
16112
+ "entered": 10,
16113
+ "score": 180
16114
+ },
16115
+ "cao": {
16116
+ "camp": "cao",
16117
+ "name": "曹操军",
16118
+ "signups": 15,
16119
+ "entered": 13,
16120
+ "score": 240
16121
+ }
16122
+ },
16123
+ "winner": null,
16124
+ "finishReason": null,
16125
+ "underdog": null
16126
+ },
16127
+ "strongholds": [
16128
+ {
16129
+ "id": "cao_1",
16130
+ "name": "曹操据点·江陵",
16131
+ "kind": "ford",
16132
+ "x": 23,
16133
+ "y": 5,
16134
+ "ownerCamp": "cao",
16135
+ "pointsPerHour": 10,
16136
+ "garrison": {
16137
+ "porter": 0,
16138
+ "militia": 96,
16139
+ "scout": 0,
16140
+ "pikeman": 0,
16141
+ "swordsman": 40,
16142
+ "archer": 48,
16143
+ "cavalry": 15,
16144
+ "iron_cavalry": 0,
16145
+ "supply_wagon": 0,
16146
+ "ballista": 0,
16147
+ "siege_ram": 0,
16148
+ "yulin_guard": 0,
16149
+ "danyang_soldier": 0,
16150
+ "baimao_soldier": 0,
16151
+ "huwei_guard": 0,
16152
+ "zhuge_crossbow": 0,
16153
+ "xiandeng_warrior": 0,
16154
+ "hubao_cavalry": 0,
16155
+ "xiliang_cavalry": 0
16156
+ },
16157
+ "garrisonPower": 560,
16158
+ "wallLevel": 0,
16159
+ "towerLevel": 0,
16160
+ "firstCaptureAvailable": false,
16161
+ "capturedAt": "2026-09-25T08:00:00.000Z",
16162
+ "chainUntil": "2026-09-25T14:00:00.000Z",
16163
+ "fireNextAt": null,
16164
+ "unlocked": true
16165
+ }
16166
+ ]
16167
+ }
16168
+ }
16169
+ ]
16170
+ }
16171
+ ],
16172
+ "agentNote": "连锁适合在孙刘方准备火攻前先给要守的据点加一层防护:连锁期间正面战斗更耐打,但一旦被火攻伤害会翻倍,所以要结合风向和对面相邻据点判断。"
16173
+ },
16174
+ {
16175
+ "op": 2000,
16176
+ "kind": "push",
16177
+ "name": "PUSH_BUILD_STATE",
16178
+ "title": "推送:建筑建造状态变化",
16179
+ "summary": "建造状态变化时推送给该账号所有在线连接(发起连接除外——它已从 BUILD / UPGRADE / CANCEL_BUILD 的直接响应拿到结果):build_started=立即开工或队首被后台激活、build_queued=进入排队(v4)、build_completed=完成(由 Worker 结算后经 API 发出)、build_cancelled=条目被取消(v7 排队;v71 起也含建造中)。建成后的产量、人口上限或仓储上限变化不逐条推送,客户端用 GET_STATE 或本地按 city.production / city.population / city.storage 推算。",
16180
+ "dataFields": [
16181
+ {
16182
+ "name": "reason",
16183
+ "type": "'build_started' | 'build_queued' | 'build_completed' | 'build_cancelled'",
16184
+ "desc": "触发本次推送的状态变化。"
16185
+ },
16186
+ {
16187
+ "name": "build",
16188
+ "type": "object",
16189
+ "desc": "建造视图,字段与 BUILD 响应的 build 相同;完成时 status 为 completed 且 completedAt 非空,排队时 status 为 queued 且 dueAt 为 null,取消时 status 为 cancelled。"
16190
+ }
16191
+ ],
16192
+ "examples": [
16193
+ {
16194
+ "op": 2000,
16195
+ "push": true,
16196
+ "data": {
16197
+ "reason": "build_started",
16198
+ "build": {
16199
+ "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
16200
+ "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
16201
+ "kind": "quarry",
16202
+ "status": "building",
16203
+ "level": 1,
16204
+ "toLevel": null,
16205
+ "initiator": "agent",
16206
+ "startedAt": "2026-09-25T08:00:00.000Z",
16207
+ "dueAt": "2026-09-25T08:01:00.000Z",
16208
+ "completedAt": null
16209
+ }
16210
+ }
16211
+ },
16212
+ {
16213
+ "op": 2000,
16214
+ "push": true,
16215
+ "data": {
16216
+ "reason": "build_queued",
16217
+ "build": {
16218
+ "id": "8d0f7790-8536-51ef-a5ef-f18bd2a01b8f",
16219
+ "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
16220
+ "kind": "lumber_mill",
16221
+ "status": "queued",
16222
+ "level": 1,
16223
+ "toLevel": null,
16224
+ "initiator": "player",
16225
+ "startedAt": "2026-09-25T08:00:30.000Z",
16226
+ "dueAt": null,
16227
+ "completedAt": null
16228
+ }
16229
+ }
16230
+ },
16231
+ {
16232
+ "op": 2000,
16233
+ "push": true,
16234
+ "data": {
16235
+ "reason": "build_completed",
16236
+ "build": {
16237
+ "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
16238
+ "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
16239
+ "kind": "farm",
16240
+ "status": "completed",
16241
+ "level": 1,
16242
+ "toLevel": null,
16243
+ "initiator": "agent",
16244
+ "startedAt": "2026-09-25T08:00:00.000Z",
16245
+ "dueAt": "2026-09-25T08:01:00.000Z",
16246
+ "completedAt": "2026-09-25T08:01:05.000Z"
16247
+ }
16248
+ }
16249
+ },
16250
+ {
16251
+ "op": 2000,
16252
+ "push": true,
16253
+ "data": {
16254
+ "reason": "build_cancelled",
16255
+ "build": {
16256
+ "id": "8d0f7790-8536-51ef-a5ef-f18bd2a01b8f",
16257
+ "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
16258
+ "kind": "lumber_mill",
16259
+ "status": "cancelled",
16260
+ "level": 1,
16261
+ "toLevel": null,
16262
+ "initiator": "player",
16263
+ "startedAt": "2026-09-25T08:00:30.000Z",
16264
+ "dueAt": null,
16265
+ "completedAt": null
16266
+ }
16267
+ }
16268
+ }
16269
+ ],
16270
+ "agentNote": "完成时间不保证精确:Worker 按到期时间结算,存在正常延迟;对时间敏感的决策用 GET_STATE 查询权威状态。"
16271
+ },
16272
+ {
16273
+ "op": 2001,
16274
+ "kind": "push",
16275
+ "name": "PUSH_AGENT_STATUS",
16276
+ "title": "推送:Agent 在线状态变化",
16277
+ "summary": "该账号的 Agent 在线状态发生**翻转**(首个 Agent 连接上线 / 最后一个 Agent 连接离线)时,推送给账号所有在线连接(v21 起翻转才推,多开连接的增减不再逐次推送;eventId 用于多连接去重)。",
16278
+ "dataFields": [
16279
+ {
16280
+ "name": "online",
16281
+ "type": "boolean",
16282
+ "desc": "推送时刻该账号是否存在在线的 Agent 连接(账号级聚合,非单连接)。"
16283
+ },
16284
+ {
16285
+ "name": "connectionCount",
16286
+ "type": "number",
16287
+ "desc": "推送时刻该账号的在线连接数(v21 新增,含玩家与 Agent 连接;非翻转的连接数变化不推送,精确值以重新登录或 GET_AGENT_INFO 为准)。"
16288
+ },
16289
+ {
16290
+ "name": "at",
16291
+ "type": "string",
16292
+ "desc": "推送时间(ISO 8601)。"
16293
+ }
16294
+ ],
16295
+ "examples": [
16296
+ {
16297
+ "op": 2001,
16298
+ "push": true,
16299
+ "data": {
16300
+ "online": true,
16301
+ "connectionCount": 1,
16302
+ "at": "2026-09-25T08:00:10.123Z"
16303
+ }
16304
+ },
16305
+ {
16306
+ "op": 2001,
16307
+ "push": true,
16308
+ "data": {
16309
+ "online": false,
16310
+ "connectionCount": 0,
16311
+ "at": "2026-09-25T09:00:00.000Z"
16312
+ }
16313
+ }
16314
+ ],
16315
+ "agentNote": "收到 online=false 表示该账号的全部 Agent 连接都已离线。多连接去重用帧顶层的 eventId。"
16316
+ },
16317
+ {
16318
+ "op": 2002,
16319
+ "kind": "push",
16320
+ "name": "PUSH_CITY_STATE",
16321
+ "title": "推送:城池级状态变化",
16322
+ "summary": "城池级状态变化时推送给该账号所有在线连接(发起连接除外):city_renamed=城池改名(RENAME_CITY)、account_reset=账号数据被 RESET_ACCOUNT 重置(v9,重置后全部游戏数据回到开号初始状态)、city_discarded=分城被放弃(DISCARD_CITY,v57;推送只带 cityId,收到后用 GET_STATE 刷新城池列表)。建造队列相关变化走 PUSH_BUILD_STATE。推送只携带变化摘要,完整现状用 GET_STATE 查询。",
16323
+ "dataFields": [
16324
+ {
16325
+ "name": "reason",
16326
+ "type": "'city_renamed' | 'account_reset' | 'city_discarded'",
16327
+ "desc": "触发本次推送的状态变化。"
16328
+ },
16329
+ {
16330
+ "name": "cityId",
16331
+ "type": "string",
16332
+ "desc": "城池 UUID。"
16333
+ },
16334
+ {
16335
+ "name": "name",
16336
+ "type": "string",
16337
+ "desc": "reason=city_renamed 时的新城池名。"
16338
+ }
16339
+ ],
16340
+ "examples": [
16341
+ {
16342
+ "op": 2002,
16343
+ "push": true,
16344
+ "data": {
16345
+ "reason": "city_renamed",
16346
+ "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
13222
16347
  "name": "临江城"
13223
16348
  }
13224
16349
  },
@@ -14592,6 +17717,133 @@
14592
17717
  }
14593
17718
  ],
14594
17719
  "agentNote": "只作提示;需要完整列表时 GET_ALLIANCE_MARKS。"
17720
+ },
17721
+ {
17722
+ "op": 2026,
17723
+ "kind": "push",
17724
+ "name": "PUSH_DEFENSE_STATE",
17725
+ "title": "推送:打造状态变化(v73,AISLG-193)",
17726
+ "summary": "打造开始 / 入队 / 完成入库 / 取消时推给同账号全部在线连接(发起连接已拿到响应,不回推)。收到后建议 GET_STATE 重新对齐 city.defenses。",
17727
+ "dataFields": [
17728
+ {
17729
+ "name": "reason",
17730
+ "type": "'craft_started' | 'craft_queued' | 'craft_completed' | 'craft_cancelled'",
17731
+ "desc": "开工(含排队条目被激活)/ 入队 / 完成入库 / 取消返还。"
17732
+ },
17733
+ {
17734
+ "name": "craft",
17735
+ "type": "object",
17736
+ "desc": "打造条目视图(结构同 CRAFT_DEFENSE 的 craft)。"
17737
+ },
17738
+ {
17739
+ "name": "stock",
17740
+ "type": "object",
17741
+ "desc": "该城当前四种器械的已入库件数。"
17742
+ },
17743
+ {
17744
+ "name": "cap",
17745
+ "type": "number",
17746
+ "desc": "该城库存上限(城墙等级 × 60)。"
17747
+ }
17748
+ ],
17749
+ "examples": [
17750
+ {
17751
+ "op": 2026,
17752
+ "push": true,
17753
+ "data": {
17754
+ "reason": "craft_completed",
17755
+ "craft": {
17756
+ "id": "3f7c9a1e-2d4b-4c6a-9e8f-1a2b3c4d5e6f",
17757
+ "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
17758
+ "kind": "trap",
17759
+ "count": 10,
17760
+ "status": "completed",
17761
+ "initiator": "player",
17762
+ "cost": {
17763
+ "gold": 200,
17764
+ "wood": 600,
17765
+ "food": 0,
17766
+ "stone": 0,
17767
+ "iron": 400
17768
+ },
17769
+ "unitSeconds": 5,
17770
+ "startedAt": "2026-09-25T08:00:00.000Z",
17771
+ "dueAt": "2026-09-25T08:00:50.000Z",
17772
+ "completedAt": "2026-09-25T08:00:50.000Z"
17773
+ },
17774
+ "stock": {
17775
+ "trap": 10,
17776
+ "chevaux": 0,
17777
+ "rolling_log": 0,
17778
+ "boulder": 0
17779
+ },
17780
+ "cap": 600
17781
+ }
17782
+ }
17783
+ ]
17784
+ },
17785
+ {
17786
+ "op": 2027,
17787
+ "kind": "push",
17788
+ "name": "PUSH_BATTLEFIELD_STATE",
17789
+ "title": "推送:剧本战场报名 / 开战 / 据点易手 / 收场 / 赤壁风向(v75,AISLG-198;v80)",
17790
+ "summary": "报名开始、开战、据点易手(含大营被攻破、火攻 / 连锁)、战场收场,以及赤壁风向切换与切换前 30 分钟预告时推给全部在线连接;载荷里的 event 与 GET_BATTLEFIELD 的 event 同结构。",
17791
+ "dataFields": [
17792
+ {
17793
+ "name": "reason",
17794
+ "type": "'signup' | 'started' | 'stronghold' | 'finished' | 'wind'",
17795
+ "desc": "报名 / 开战 / 据点易手(含火攻、连锁) / 收场 / 风向(赤壁切换或预告)。"
17796
+ },
17797
+ {
17798
+ "name": "event",
17799
+ "type": "object",
17800
+ "desc": "战场视图(结构同 GET_BATTLEFIELD 的 event)。"
17801
+ },
17802
+ {
17803
+ "name": "strongholdId",
17804
+ "type": "string",
17805
+ "desc": "reason=stronghold 时易手的据点 id。"
17806
+ }
17807
+ ],
17808
+ "examples": [
17809
+ {
17810
+ "op": 2027,
17811
+ "push": true,
17812
+ "data": {
17813
+ "reason": "stronghold",
17814
+ "event": {
17815
+ "id": "9b2f4c1a-6d3e-4f80-9a71-2c5e8d4b6a10",
17816
+ "script": "guandu",
17817
+ "name": "官渡之战",
17818
+ "status": "active",
17819
+ "signupStartAt": "2026-09-24T08:00:00.000Z",
17820
+ "startAt": "2026-09-25T08:00:00.000Z",
17821
+ "endAt": "2026-09-26T08:00:00.000Z",
17822
+ "camps": {
17823
+ "yuan": {
17824
+ "camp": "yuan",
17825
+ "name": "袁绍军",
17826
+ "signups": 12,
17827
+ "entered": 10,
17828
+ "score": 180
17829
+ },
17830
+ "cao": {
17831
+ "camp": "cao",
17832
+ "name": "曹操军",
17833
+ "signups": 15,
17834
+ "entered": 13,
17835
+ "score": 240
17836
+ }
17837
+ },
17838
+ "winner": null,
17839
+ "finishReason": null,
17840
+ "underdog": null
17841
+ },
17842
+ "strongholdId": "ford_yanjin"
17843
+ }
17844
+ }
17845
+ ],
17846
+ "agentNote": "推送只带事件摘要与据点 id,收到后重查 GET_BATTLEFIELD 拿完整据点守军、自己的队伍与军功。漏收时定时重查即可。"
14595
17847
  }
14596
17848
  ],
14597
17849
  "errorCodes": {
@@ -14987,6 +18239,190 @@
14987
18239
  "desc": "(v47)该站点不开放账号密码登录:游戏有两个站(同一套服务与数据库、账号通用),国际站 slg.yuntianyou.cc 只有 Google / GitHub 登录,国内站才有账号密码。",
14988
18240
  "action": "网页端改用 Google / GitHub 登录;老密码账号先在国内站登录并绑定 Google / GitHub,再来本站用绑定方式登录进同一个号。Agent 不涉及(Agent 只用令牌)。"
14989
18241
  },
18242
+ "WALL_NOT_BUILT": {
18243
+ "desc": "(v73,AISLG-193)城墙尚未建造:四种城防器械只能囤在城墙里,城墙 0 级时库存上限为 0,不能打造。响应的 data 附 cap(= 0)。",
18244
+ "action": "先建造并升级城墙再打造器械;城墙等级同时也是库存上限(每级 60 件,四种共用)。"
18245
+ },
18246
+ "DEFENSE_STOCK_FULL": {
18247
+ "desc": "(v73,AISLG-193)库存 + 在造 + 本次数量超过上限(城墙等级 × 60,四种器械共用)。响应的 data 附 cap / stock(已入库合计)/ pending(在造 + 排队合计)。",
18248
+ "action": "减少本次件数,或先把库存用在守城(守城战自动消耗)后再生出;升级城墙可提高上限。"
18249
+ },
18250
+ "DEFENSE_QUEUE_FULL": {
18251
+ "desc": "(v73,AISLG-193)打造队列已满:与征兵同规则,同一时间 1 条在造 + 最多 2 条排队。",
18252
+ "action": "等队首完成(或取消已有条目腾位置)后再发起。"
18253
+ },
18254
+ "DEFENSE_NOT_CANCELLABLE": {
18255
+ "desc": "(v73,AISLG-193)没有可取消的打造条目:条目不存在、不属于本账号,或已完成 / 已取消。",
18256
+ "action": "用 GET_STATE 的 city.defenses.queue 取当前条目的 craftId 再取消;已完成 / 已取消的不要重试。"
18257
+ },
18258
+ "ASSIST_NOT_ALLY": {
18259
+ "desc": "(v74,AISLG-194)协防目标不是盟友的城池:MARCH task=assist 只能派往同一联盟成员的城(自己的城请用 transfer 调兵)。",
18260
+ "action": "确认目标城的主人与你同属一个联盟;不是盟友就换目标,或先拉对方入盟。"
18261
+ },
18262
+ "ASSIST_LIMIT": {
18263
+ "desc": "(v74,AISLG-194)协防名额已满:每座城最多接收 5 支协防部队(在途部队也计入),同一账号对同一座城最多 1 支。到达时复核不通过,部队原路返回(事件 cause=ASSIST_LIMIT)。",
18264
+ "action": "换一座盟友城协防,或等该城已有部队召回 / 遣返后再派;同一座城不要重复派第二支。"
18265
+ },
18266
+ "ASSIST_NOT_FOUND": {
18267
+ "desc": "(v74,AISLG-194)协防部队不存在、已经返回(战斗全灭 / 主动召回 / 退盟 / 放弃分城自动遣返 / 分城被占领时随城覆灭),或不属于你(只有派出方与城主能召回 / 遣返)。",
18268
+ "action": "重新 GET_STATE / GET_TILE 拿最新的 assistIn / assistOut 列表后再操作。"
18269
+ },
18270
+ "BATTLEFIELD_GOVERNMENT_TOO_LOW": {
18271
+ "desc": "(v75,AISLG-198)报名剧本战场要求主城官府 ≥ 5 级;响应附 required / current。",
18272
+ "action": "先升级主城官府到 5 级;分城官府不计。"
18273
+ },
18274
+ "BATTLEFIELD_SIGNUP_CLOSED": {
18275
+ "desc": "(v75,AISLG-198)当前不在剧本战场的报名期(北京时间每周二 20:00 至周三 20:00)。",
18276
+ "action": "用 GET_BATTLEFIELD 的 nextSignupAt 等下一场报名;报名开始后 SERVER 会全服播报。"
18277
+ },
18278
+ "BATTLEFIELD_ALREADY_JOINED": {
18279
+ "desc": "(v75,AISLG-198)本场已经报过名(阵营选定后不能改)。",
18280
+ "action": "直接 GET_BATTLEFIELD 查自己的阵营与队伍,或等开战后入场。"
18281
+ },
18282
+ "BATTLEFIELD_NOT_JOINED": {
18283
+ "desc": "(v75,AISLG-198)没有报名本场战场,不能入场或操作队伍。",
18284
+ "action": "先在报名期 SIGNUP_BATTLEFIELD 选阵营。"
18285
+ },
18286
+ "BATTLEFIELD_CAMP_FULL": {
18287
+ "desc": "(v75,AISLG-198)该阵营报名人数超过另一方 1.5 倍且多出 5 人以上,暂停报名;响应附 count / otherCount / limit。",
18288
+ "action": "改选另一方;或等双方人数接近后再报名。"
18289
+ },
18290
+ "BATTLEFIELD_ENTRY_CLOSED": {
18291
+ "desc": "(v75,AISLG-198)战场已经开战,不能再带部队入场(报名期结束即锁死入场)。",
18292
+ "action": "本场只能在已入场的队伍里拆队 / 行军;下一场报名时再入场。"
18293
+ },
18294
+ "BATTLEFIELD_ALREADY_ENTERED": {
18295
+ "desc": "(v75,AISLG-198)本场已经带过部队入场(每人每场只能入场一次,开战后也不能追加)。",
18296
+ "action": "用 SPLIT_BATTLEFIELD_SQUAD 拆分已有队伍,或等下一场。"
18297
+ },
18298
+ "BATTLEFIELD_POPULATION_LIMIT": {
18299
+ "desc": "(v75,AISLG-198)带入部队的人口超过 3000;响应附 limit / current。",
18300
+ "action": "减少铁骑兵等高人口兵种的数量,或只带主力兵种。"
18301
+ },
18302
+ "BATTLEFIELD_SQUAD_LIMIT": {
18303
+ "desc": "(v75,AISLG-198)每人最多 3 支队伍。",
18304
+ "action": "把要拆出的兵力并回现有队伍,或等有队伍阵亡后再拆。"
18305
+ },
18306
+ "BATTLEFIELD_SQUAD_NOT_FOUND": {
18307
+ "desc": "(v75,AISLG-198)队伍不存在、已阵亡,或不属于本账号。",
18308
+ "action": "重新 GET_BATTLEFIELD 拿最新队伍列表。"
18309
+ },
18310
+ "BATTLEFIELD_SQUAD_BUSY": {
18311
+ "desc": "(v75,AISLG-198)队伍正在行军,不能再次下令。",
18312
+ "action": "等 arriveAt 到达后再下令。"
18313
+ },
18314
+ "BATTLEFIELD_UNREACHABLE": {
18315
+ "desc": "(v75,AISLG-198)目标不可达:30×30 地图中间的河只有 3 处渡口(y = 5 / 15 / 25)能过,或坐标越界。",
18316
+ "action": "先走到渡口再渡河,或改选同侧目标。"
18317
+ },
18318
+ "BATTLEFIELD_NOT_ACTIVE": {
18319
+ "desc": "(v75,AISLG-198)剧本战场不在进行中(报名期或已结束)。",
18320
+ "action": "报名期只做报名 / 入场;行军与攻打在开战后才能做。"
18321
+ },
18322
+ "BATTLEFIELD_SHOP_LIMIT": {
18323
+ "desc": "(v75,AISLG-198)本场该商品已达到限购数量。",
18324
+ "action": "换其他商品,或等下一场额度重置(军功余额跨场保留)。"
18325
+ },
18326
+ "BATTLEFIELD_MERIT_INSUFFICIENT": {
18327
+ "desc": "(v75,AISLG-198)战场军功余额不足;响应附 cost / balance。",
18328
+ "action": "继续在战场里歼灭敌军攒军功;军功跨场累积、换季清零。"
18329
+ },
18330
+ "BATTLEFIELD_TARGET_INVALID": {
18331
+ "desc": "(v75,AISLG-198)行军目标参数缺失或对不上:必须给 strongholdId,或给合法的 x / y。",
18332
+ "action": "用 GET_BATTLEFIELD 的 strongholds 里的 id / 坐标重发。"
18333
+ },
18334
+ "BATTLEFIELD_STRONGHOLD_LOCKED": {
18335
+ "desc": "(v80,AISLG-199)讨伐董卓的关卡按顺序解锁:汜水关 → 虎牢关 → 洛阳,前一关没被讨董联军打下时不能攻打(GET_BATTLEFIELD 的 strongholds[].unlocked 为 false)。",
18336
+ "action": "先攻下前一关(看 strongholds 里 unlocked 为 true 的据点再下令)。"
18337
+ },
18338
+ "BATTLEFIELD_WIND_MISMATCH": {
18339
+ "desc": "(v80,AISLG-199)赤壁火攻只能在东南风期间发动(event.wind.direction = se)。",
18340
+ "action": "等下一次风向切换(event.wind.nextAt)再发动,切换前 30 分钟会预告。"
18341
+ },
18342
+ "BATTLEFIELD_FIRE_COOLDOWN": {
18343
+ "desc": "(v80,AISLG-199)同一目标据点每 2 小时最多被火攻一次;响应附 nextAt。",
18344
+ "action": "换一个目标,或等 nextAt 之后再火攻。"
18345
+ },
18346
+ "BATTLEFIELD_CHAIN_ACTIVE": {
18347
+ "desc": "(v80,AISLG-199)该据点的连锁战船仍在生效(6 小时内不能重复连锁);响应附 chainUntil。",
18348
+ "action": "等 chainUntil 之后再连锁;连锁期内被火攻伤害翻倍,留意守军。"
18349
+ },
18350
+ "BATTLEFIELD_SKILL_UNAVAILABLE": {
18351
+ "desc": "(v80,AISLG-199)本场剧本没有这个技能(只有赤壁有火攻 / 连锁),或阵营不对:火攻只给孙刘方,连锁只给曹方。",
18352
+ "action": "看 event.script 与自己的 me.camp 再发。"
18353
+ },
18354
+ "BATTLEFIELD_NOT_ENTERED": {
18355
+ "desc": "(v80,AISLG-199)报名了但还没带兵入场,不能使用战场技能。",
18356
+ "action": "本场已开战就只能等下一场;报名期内要在开战前 ENTER_BATTLEFIELD。"
18357
+ },
18358
+ "LUOYANG_CLOSED": {
18359
+ "desc": "(v79,AISLG-200)洛阳只在每周六 21:00–23:00(北京时间现实时间)开放攻打 / 侦察;响应附 nextOpenAt / retryAfterSeconds。",
18360
+ "action": "等到 nextOpenAt 再发起。窗口内洛阳没有被动免战、城防不回涨。"
18361
+ },
18362
+ "DECREE_NOT_HOLDER": {
18363
+ "desc": "(v79,AISLG-200)只有洛阳之主联盟的盟主可以发布政令。",
18364
+ "action": "先占领洛阳,且由该联盟盟主操作。"
18365
+ },
18366
+ "DECREE_COOLDOWN": {
18367
+ "desc": "(v79,AISLG-200)政令每 7 天只能发布一次;响应附 nextAt / retryAfterSeconds。",
18368
+ "action": "等 nextAt 之后再发。"
18369
+ },
18370
+ "MARKET_LOCKED": {
18371
+ "desc": "(v78,AISLG-196)交易所需要主城官府 ≥ 5 级且不在新手保护期;响应附 reason / government / required。",
18372
+ "action": "升级主城官府或等新手保护结束后再来。"
18373
+ },
18374
+ "PRICE_OUT_OF_RANGE": {
18375
+ "desc": "(v78,AISLG-196)单价超出允许范围:资源之间 0.5–2,收金币 0.125–0.5;响应附 min / max。",
18376
+ "action": "按 GET_MARKET 的 limits.priceRangeResource / priceRangeGold 调整单价。"
18377
+ },
18378
+ "ORDER_LIMIT": {
18379
+ "desc": "(v78,AISLG-196)同时挂单已达 5 张。",
18380
+ "action": "先撤单或等成交后再挂。"
18381
+ },
18382
+ "DAILY_TRADE_LIMIT": {
18383
+ "desc": "(v78,AISLG-196)今日成交额度不足(主城官府等级 × 3000 × 缩放,买卖合计);响应附 limit / used / remaining。",
18384
+ "action": "明天(北京日)额度重置后再交易;额度按卖出资源数量折算、买卖双方都计。"
18385
+ },
18386
+ "ORDER_NOT_FOUND": {
18387
+ "desc": "(v78,AISLG-196)挂单不存在、已售罄、已过期或不属于你。",
18388
+ "action": "重新 GET_MARKET 拉最新挂单;过期挂单会自动退款。"
18389
+ },
18390
+ "MARKET_ALLY_ONLY": {
18391
+ "desc": "(v78,AISLG-196)挂单勾选了「只卖给盟友」,你与卖家不在同一个联盟。",
18392
+ "action": "换一张公开挂单,或加入卖家所在联盟。"
18393
+ },
18394
+ "ORDER_NOT_CANCELLABLE": {
18395
+ "desc": "(v78,AISLG-196)挂单已售罄或已过期,无法撤回。",
18396
+ "action": "刷新挂单列表确认状态。"
18397
+ },
18398
+ "DIPLOMACY_LIMIT": {
18399
+ "desc": "(v77,AISLG-195)友盟 / 敌对数量已达上限(每联盟最多 2 个友盟、5 个敌对),响应附 limit。",
18400
+ "action": "先解除一个现有关系,再结新友盟 / 宣布新敌对。"
18401
+ },
18402
+ "DIPLOMACY_COOLDOWN": {
18403
+ "desc": "(v77,AISLG-195)刚解除友好,72 小时内同一对联盟不能再次结好;响应附 refriendAfter / retryAfterSeconds。",
18404
+ "action": "等到 refriendAfter 之后再发邀请 / 同意邀请。"
18405
+ },
18406
+ "DIPLOMACY_EXISTS": {
18407
+ "desc": "(v77,AISLG-195)与目标联盟已经是友盟 / 敌对,或已有待处理邀请。",
18408
+ "action": "用 GET_ALLIANCE_DIPLOMACY 查当前关系与邀请,避免重复操作。"
18409
+ },
18410
+ "DIPLOMACY_INVITE_NOT_FOUND": {
18411
+ "desc": "(v77,AISLG-195)友好邀请不存在、已过期(48 小时)或已处理。",
18412
+ "action": "重新发起邀请;过期邀请不会出现在 GET_ALLIANCE_DIPLOMACY 里。"
18413
+ },
18414
+ "NOBILITY_TOO_LOW": {
18415
+ "desc": "(v76,AISLG-197)爵位不足:占领名城需要「大夫」(爵位序号 3)及以上;响应附 required / current。攻打外围与掠夺不受限。",
18416
+ "action": "先在世界地图战斗里累计声望升到大夫(2000 声望)再来占领名城。"
18417
+ },
18418
+ "NOBILITY_SALARY_CLAIMED": {
18419
+ "desc": "(v76,AISLG-197)今日(北京日)俸禄已领,响应附 nextClaimAt。",
18420
+ "action": "明天北京时间 0 点后再领;金额随爵位提高。"
18421
+ },
18422
+ "NOBILITY_SALARY_NONE": {
18423
+ "desc": "(v76,AISLG-197)平民没有俸禄,需要先累计 100 声望升到公士。",
18424
+ "action": "打世界地图战斗或参加剧本战场攒声望。"
18425
+ },
14990
18426
  "INTERNAL": {
14991
18427
  "desc": "服务端内部错误。",
14992
18428
  "action": "可稍后重试同一请求;持续出现时向运营方反馈。INTERNAL 可能出现在任何请求的响应中。"
@@ -15205,6 +18641,11 @@
15205
18641
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
15206
18642
  "name": "主城",
15207
18643
  "level": 1,
18644
+ "title": "城池",
18645
+ "nobility": {
18646
+ "index": 0,
18647
+ "name": "平民"
18648
+ },
15208
18649
  "resources": {
15209
18650
  "gold": 2000,
15210
18651
  "wood": 2000,
@@ -15495,6 +18936,7 @@
15495
18936
  "durability": null,
15496
18937
  "famousName": null,
15497
18938
  "productionBonusPercent": 0,
18939
+ "luoyangBonusPercent": 0,
15498
18940
  "famousEffect": null,
15499
18941
  "starveAt": null,
15500
18942
  "mutinyNextAt": null,
@@ -15510,9 +18952,33 @@
15510
18952
  "marching": 0,
15511
18953
  "storage": 0,
15512
18954
  "scouting": 0,
15513
- "defense": 0
18955
+ "defense": 0,
18956
+ "drill": 0,
18957
+ "combat": 0,
18958
+ "protection": 0,
18959
+ "riding": 0,
18960
+ "archery": 0,
18961
+ "supply": 0,
18962
+ "construction": 0,
18963
+ "research": 0,
18964
+ "looting": 0,
18965
+ "repair": 0
15514
18966
  },
15515
18967
  "recruitQueue": [],
18968
+ "defenses": {
18969
+ "cap": 0,
18970
+ "stock": {
18971
+ "trap": 0,
18972
+ "chevaux": 0,
18973
+ "rolling_log": 0,
18974
+ "boulder": 0
18975
+ },
18976
+ "total": 0,
18977
+ "queue": []
18978
+ },
18979
+ "assistIn": [],
18980
+ "assistOut": [],
18981
+ "assistCap": 5,
15516
18982
  "defenseBonus": 0,
15517
18983
  "marches": [],
15518
18984
  "territory": [],
@@ -15803,6 +19269,11 @@
15803
19269
  "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
15804
19270
  "name": "主城",
15805
19271
  "level": 1,
19272
+ "title": "城池",
19273
+ "nobility": {
19274
+ "index": 0,
19275
+ "name": "平民"
19276
+ },
15806
19277
  "resources": {
15807
19278
  "gold": 1780,
15808
19279
  "wood": 1910,
@@ -16093,6 +19564,7 @@
16093
19564
  "durability": null,
16094
19565
  "famousName": null,
16095
19566
  "productionBonusPercent": 0,
19567
+ "luoyangBonusPercent": 0,
16096
19568
  "famousEffect": null,
16097
19569
  "starveAt": null,
16098
19570
  "mutinyNextAt": null,
@@ -16108,9 +19580,33 @@
16108
19580
  "marching": 0,
16109
19581
  "storage": 0,
16110
19582
  "scouting": 0,
16111
- "defense": 0
19583
+ "defense": 0,
19584
+ "drill": 0,
19585
+ "combat": 0,
19586
+ "protection": 0,
19587
+ "riding": 0,
19588
+ "archery": 0,
19589
+ "supply": 0,
19590
+ "construction": 0,
19591
+ "research": 0,
19592
+ "looting": 0,
19593
+ "repair": 0
16112
19594
  },
16113
19595
  "recruitQueue": [],
19596
+ "defenses": {
19597
+ "cap": 0,
19598
+ "stock": {
19599
+ "trap": 0,
19600
+ "chevaux": 0,
19601
+ "rolling_log": 0,
19602
+ "boulder": 0
19603
+ },
19604
+ "total": 0,
19605
+ "queue": []
19606
+ },
19607
+ "assistIn": [],
19608
+ "assistOut": [],
19609
+ "assistCap": 5,
16114
19610
  "defenseBonus": 0,
16115
19611
  "marches": [],
16116
19612
  "territory": [],