slg-mcp 0.1.9 → 0.2.1

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": 88,
2
+ "version": 92,
3
3
  "title": "SLG Agent API 参考",
4
4
  "compatPolicy": [
5
5
  "只加不改:已发布的协议号、字段与错误码只新增、不删除、不改变类型与语义。",
@@ -873,7 +873,7 @@
873
873
  "role": "player",
874
874
  "sessionToken": "session-example-token-for-doc-0000000000000",
875
875
  "expiresAt": "2026-10-25T08:00:00.000Z",
876
- "protocolVersion": 88,
876
+ "protocolVersion": 92,
877
877
  "docNotice": null,
878
878
  "season": {
879
879
  "id": 2,
@@ -922,7 +922,7 @@
922
922
  "role": "player",
923
923
  "sessionToken": "session-example-token-for-doc-0000000000000",
924
924
  "expiresAt": "2026-10-25T08:00:00.000Z",
925
- "protocolVersion": 88,
925
+ "protocolVersion": 92,
926
926
  "docNotice": null,
927
927
  "season": {
928
928
  "id": 2,
@@ -942,14 +942,14 @@
942
942
  ]
943
943
  },
944
944
  {
945
- "caption": "Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/85 补读增量)",
945
+ "caption": "Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/89 补读增量)",
946
946
  "request": {
947
947
  "op": 1,
948
948
  "seq": 1,
949
949
  "data": {
950
950
  "token": "session-example-token-for-doc-0000000000000",
951
951
  "asAgent": true,
952
- "docVersion": 85,
952
+ "docVersion": 89,
953
953
  "agentModel": "claude-opus-5-5"
954
954
  }
955
955
  },
@@ -964,8 +964,8 @@
964
964
  "role": "agent",
965
965
  "sessionToken": "session-example-token-for-doc-0000000000000",
966
966
  "expiresAt": null,
967
- "protocolVersion": 88,
968
- "docNotice": "接口文档已从 v85 更新到 v88:请 GET /agent-api/changes/85 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。",
967
+ "protocolVersion": 92,
968
+ "docNotice": "接口文档已从 v89 更新到 v92:请 GET /agent-api/changes/89 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。",
969
969
  "season": {
970
970
  "id": 2,
971
971
  "endsAt": "2026-11-22T00:00:00.000Z"
@@ -1281,6 +1281,26 @@
1281
1281
  "type": "array",
1282
1282
  "desc": "本城占领的野地(v12 新增):{ x, y, terrain, level, resource, bonusRate 占领加成/小时, gatherRate 驻军采集/小时, garrison 驻军总数, clusterSize 连片块数(v23 新增,AISLG-59), clusterBonusPercent 连片产量加成百分数(v23 新增:3–4 块 10 / ≥5 块 20,不足 3 块为 0), reserve 野地储量(v61 新增,AISLG-165;档位与当前储量 / 上限 / 预计采空或回满时刻,本城占领的地块恒给出数值)};production 已计入 bonusRate、gatherRate 与连片加成——连片按同地形 + 上下左右相邻计算,占领 / 失守后按最新领地自动重算。v61 起 gatherRate 受储量约束:储量空时驻军只按恢复速度(2%/h)采集,采空不需要撤兵,留兵即按恢复速度小量采集。"
1283
1283
  },
1284
+ {
1285
+ "name": "gift",
1286
+ "type": "number",
1287
+ "desc": "(v89,AISLG-221)账号礼金当前余额(账号级,不分城)。每个赛季开始固定发 1000(登录时惰性发放,同赛季不重复发),换季清零;不能转让、赠送、兑换成金币或任何资源。只用于服务端标明的便利功能,扣除时事件流写 gift_spent(detail = { reason, amount, balance })。"
1288
+ },
1289
+ {
1290
+ "name": "giftSeasonGrant",
1291
+ "type": "number",
1292
+ "desc": "(v89)每个赛季每个账号发放的礼金额度(当前为 1000)。界面与 Agent 用它显示“礼金 gift / giftSeasonGrant”,不要写死数值。"
1293
+ },
1294
+ {
1295
+ "name": "items",
1296
+ "type": "object",
1297
+ "desc": "(v90,AISLG-222)账号道具背包:{ [itemId]: count },每种已定义道具都有键(缺省 0)。与 GET_ITEMS 的 items 同口径。道具随换季清空。"
1298
+ },
1299
+ {
1300
+ "name": "moveCity",
1301
+ "type": "object",
1302
+ "desc": "(v91,AISLG-220)城池迁移视图:cities[] 逐城给出 { cityId, reasons(不可迁原因,全部列出:MOVE_CITY_FAMOUS / ARMY_OUTSIDE / HAS_ALLY_FORCE / IN_BATTLE,空数组 = 前四条都通过), moveLockUntil(指定坐标迁后的出征限制截止时刻,仅未结束时给出) };items.random = { itemId: 'city_order', count }(迁城令持有数),items.pointing = { itemId: 'city_order_adv', count }(高级迁城令持有数)。目标格与近邻条件不在此视图内,以 MOVE_CITY 的 preview 为准。"
1303
+ },
1284
1304
  {
1285
1305
  "name": "cities",
1286
1306
  "type": "array",
@@ -2730,7 +2750,7 @@
2730
2750
  {
2731
2751
  "name": "events[].type",
2732
2752
  "type": "string",
2733
- "desc": "事件类型:'build_started' | 'build_queued' | 'build_completed' | 'build_cancelled'(v7) | 'recruit_started' | 'recruit_queued' | 'recruit_completed' | 'recruit_cancelled'(v11) | 'march_started' | 'march_completed' | 'wilderness_occupied' | 'wilderness_lost' | 'npc_city_occupied' | 'npc_raid'(v12) | 'city_renamed'(v7) | 'account_reset'(v9,重置后事件流只剩这一条) | 'agent_connected' | 'agent_disconnected' | 'resource_exchanged'(v22,集市兑换成交,detail = { resource, amount, gold, rate }) | 'npc_attack_warning'(v23,NPC 袭击预警,detail = { x, y, target, terrain, level, armyMin, armyMax, arriveAt, attackId }) | 'starvation_warning' / 'mutiny'(v34,断粮预警 / 哗变) | 'hero_recruited' / 'hero_dismissed' / 'hero_arrears' / 'hero_wounded' / 'hero_level_up' / 'hero_granted' / 'guard_changed'(v36,AISLG-114/115/116,武将:招募 / 解雇 / 欠饷 / 重伤 / 升级 / 获得名将 / 城守任命)· 'wilderness_depleted'(v61,AISLG-165,名下野地储量采空,detail = { x, y, terrain, level, at })· 'truce_cancelled'(v71,AISLG-190,主动免战提前解除,detail = { until, cancelledAt })· 'troops_disbanded'(v84,AISLG-209,遣散城内驻军,detail = { cityId, troops, refunded })。"
2753
+ "desc": "事件类型:'build_started' | 'build_queued' | 'build_completed' | 'build_cancelled'(v7) | 'recruit_started' | 'recruit_queued' | 'recruit_completed' | 'recruit_cancelled'(v11) | 'march_started' | 'march_completed' | 'wilderness_occupied' | 'wilderness_lost' | 'npc_city_occupied' | 'npc_raid'(v12) | 'city_renamed'(v7) | 'account_reset'(v9,重置后事件流只剩这一条) | 'agent_connected' | 'agent_disconnected' | 'gift_spent'(v89,礼金扣除,detail = { reason, amount, balance })· 'item_granted' / 'item_used' / 'item_bought'(v90,AISLG-222,道具发放 { itemId, requested, granted, reason } / 消耗 { itemId, amount, left, reason } / 礼金购买 { itemId, count, price, cost, owned, gift }) | 'resource_exchanged'(v22,集市兑换成交,detail = { resource, amount, gold, rate }) | 'npc_attack_warning'(v23,NPC 袭击预警,detail = { x, y, target, terrain, level, armyMin, armyMax, arriveAt, attackId }) | 'starvation_warning' / 'mutiny'(v34,断粮预警 / 哗变) | 'hero_recruited' / 'hero_dismissed' / 'hero_arrears' / 'hero_wounded' / 'hero_level_up' / 'hero_granted' / 'guard_changed'(v36,AISLG-114/115/116,武将:招募 / 解雇 / 欠饷 / 重伤 / 升级 / 获得名将 / 城守任命)· 'wilderness_depleted'(v61,AISLG-165,名下野地储量采空,detail = { x, y, terrain, level, at })· 'truce_cancelled'(v71,AISLG-190,主动免战提前解除,detail = { until, cancelledAt })· 'troops_disbanded'(v84,AISLG-209,遣散城内驻军,detail = { cityId, troops, refunded })。"
2734
2754
  },
2735
2755
  {
2736
2756
  "name": "events[].initiator",
@@ -4637,7 +4657,7 @@
4637
4657
  "name": "GET_WORLD_MAP",
4638
4658
  "title": "查询世界地图窗口(v12)",
4639
4659
  "preAuth": false,
4640
- "summary": "以窗口方式查询世界地图(世界为 1000×1000 的方格,服务端启动时一次性生成)。请求给窗口左上角 (x, y) 与宽高 (w, h);缺省以账号主城为中心取 10×10。窗口起点 (x, y) 按世界边界钳制;w/h 须为 1..20 的整数,非法或越界(0、负数、超过上限、非整数)视为未提供、取缺省 10,不做钳制放大(v17 明确)。每个地块返回地形(plain 平原 / grass 草原 / forest 森林 / hill 丘陵 / desert 荒漠 / marsh 沼泽 / lake 湖泊 / gold_mine 金矿——v19 新增,占领产金、不可掠夺)、类别(wilderness 野地 / npc_city NPC 城池 / city 玩家城池)、野地或 NPC 城池等级、占领者(玩家名与城池)与驻军总数。大地图用多次窗口拼接;服务端不推送整图变化,地块级变化走 PUSH_TILE_STATE(漏推由按需重查覆盖)。",
4660
+ "summary": "以窗口方式查询世界地图(世界为 1000×1000 的方格,服务端启动时一次性生成)。请求给窗口左上角 (x, y) 与宽高 (w, h);缺省以账号主城为中心取 10×10。窗口起点 (x, y) 按世界边界钳制;w/h 须为 1..20 的整数,非法或越界(0、负数、超过上限、非整数)视为未提供、取缺省 10,不做钳制放大(v17 明确)。每个地块返回地形(plain 平原 / grass 草原 / forest 森林 / hill 丘陵 / desert 荒漠 / marsh 沼泽 / lake 湖泊 / gold_mine 金矿——v19 新增,占领产金、不可掠夺)、类别(wilderness 野地 / npc_city NPC 城池 / city 玩家城池)、野地或 NPC 城池等级、占领者(玩家名与城池)与驻军总数。大地图用多次窗口拼接;服务端不推送整图变化,地块级变化走 PUSH_TILE_STATE(漏推由按需重查覆盖)。 迷雾(v92,AISLG-224):开关 fog_enabled 开启时,本协议只返回实时视野与已探索区块内的地块;未探索的格不出现在 tiles[] 里(前端按缺失格画黑雾),唯一例外是黄巾营地所在的格:未探索也返回最小视图(坐标、地形、camp,fog = explored,seenAt = null,其余字段为空)。已探索的格 fog = explored,只给地形、等级与上次看到的占领者(seenAt 为看到的时间),驻军、库存 / 储量档位、保护、城防、协防、掠夺冷却等动态字段为 null 或 0;实时视野格 fog = visible,与开启前完全一致。关闭时所有格 fog = visible。",
4641
4661
  "requestFields": [
4642
4662
  {
4643
4663
  "name": "x",
@@ -4691,6 +4711,16 @@
4691
4711
  "type": "'wilderness' | 'npc_city' | 'city'",
4692
4712
  "desc": "地块类别:野地 / NPC 城池 / 玩家城池(主城与分城)。"
4693
4713
  },
4714
+ {
4715
+ "name": "tiles[].fog",
4716
+ "type": "'explored' | 'visible'",
4717
+ "desc": "战争迷雾(v92,AISLG-224):visible = 实时视野(与未开迷雾一致);explored = 已探索但不在视野内(动态字段清空,见 summary)。未探索的格不返回。"
4718
+ },
4719
+ {
4720
+ "name": "tiles[].seenAt",
4721
+ "type": "string | null",
4722
+ "desc": "已探索的格为上次看到的时间(ISO);实时视野为 null。"
4723
+ },
4694
4724
  {
4695
4725
  "name": "tiles[].level",
4696
4726
  "type": "number",
@@ -4887,7 +4917,8 @@
4887
4917
  }
4888
4918
  ],
4889
4919
  "errors": [
4890
- "INVALID_PARAMS"
4920
+ "INVALID_PARAMS",
4921
+ "TILE_UNEXPLORED"
4891
4922
  ],
4892
4923
  "examples": [
4893
4924
  {
@@ -4960,7 +4991,7 @@
4960
4991
  "name": "MARCH",
4961
4992
  "title": "出征 / 调兵 / 运输(从主城派兵,v12 起;v16 新增掠夺 / 占领任务;v26 新增运输任务)",
4962
4993
  "preAuth": false,
4963
- "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 推送)。",
4994
+ "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 推送)。 迷雾(v92,AISLG-224):目标未探索且不在视野内时(只限 task = plunder / occupy),目标相关的校验(保护、免战、占领资格等)被拒绝也不报错:照常建立行军,响应结构与校验通过时完全一致,且不会向守方发来袭预警、不破除新手保护;到达后由服务端复核——守方仍受保护或目标已不是可打的对象时原路返回(aborted),否则按现有规则结算。兵力不足、出征上限、迁城后的攻击限制(MOVE_CITY_ATTACK_LOCK)等与目标无关的校验照旧报错。",
4964
4995
  "requestFields": [
4965
4996
  {
4966
4997
  "name": "x",
@@ -7390,7 +7421,7 @@
7390
7421
  "name": "GET_HEROES",
7391
7422
  "title": "查询武将(账号武将 / 酒馆候选 / 名将归属,v36,AISLG-114/115/116)",
7392
7423
  "preAuth": false,
7393
- "summary": "返回账号全部武将(含属性、等级 / 经验、自由点数、俸禄、欠饷 / 重伤 / 历练状态、占用关系、今日剩余次数)、当前(或指定)城酒馆的候选(v87 AISLG-217 起:酒馆只在主城建造、候选账号只有一份,固定为主城那座,每 4 小时基准随时间缩放刷新 3 名)、普通将 / 名将数量与上限、全部 40 名名将的全服归属(famousClaims,未被获得的 ownerUsername 为 null,在野名将附 wildAt 落位),以及在野名将的结交进度(friendships)与结交资格(unlocks)。武将规则(数值均为占位):**普通将**从酒馆招募,三项属性(统率 lead / 武力 force / 智力 wit)各 10–40 随机;招募费 = 500 + 三项合计 × 20(金币,从主城扣)。**名将**(三项各 45–65)只从 PvE 获得、全服唯一(见 famousClaims)。带兵加成:全军攻击 + 武力 × 0.3%、全军受到伤害 − 智力 × 0.3%,各自封顶 20%;能吃到加成的兵数 = 统率 × 20,部队超出时按比例摊薄(统率是带大军的关键)。俸禄每小时从主城扣(普通将 20 × 等级、名将 100 × 等级金币,随全局时间缩放),主城金币不够即「欠饷」(arrears=true,不能出征),扣款成功自动恢复。带队战败(攻方失败或全灭)武将重伤 2 小时(随缩放),期间不能出征、不会死亡。经验(v36 AISLG-116):带队参战(含城守守城)获得经验 = 本场歼灭敌军的参考战力,战败减半;升到 L+1 级需 100 × L²,每升一级获得自由点数(普通将 3、名将 5,由玩家分到三项属性,v54 起升级不再自动加属性),上限 40 级——加成仍受 20% 封顶,高等级的主要收益是统率提高(带更多兵吃满加成)。在野名将(v54,AISLG-144):29 名名将隐居在 Lv3 以上的野地里(开服时分配,之后不变)。地图上该野地带 wildFamous 标记;派部队打赢它的原住守军(守军为同级野地的 2 倍)即获得该名将的结交资格(GET_HEROES 的 unlocks)。结交(BEFRIEND_HERO)花主城金币 500 × 野地等级,好感 +10,每个名将每游戏日最多 5 次,同时结交(好感未满、未被招揽)最多 2 名。好感满 100 后招揽(RECRUIT_FAMOUS_HERO),全服唯一,先到先得;别人先招揽走,你的结交进度作废(lost=true,金币不退)。名将解雇后回到可获得状态。",
7424
+ "summary": "返回账号全部武将(含属性、等级 / 经验、自由点数、俸禄、欠饷 / 重伤 / 历练状态、占用关系、今日剩余次数)、当前(或指定)城酒馆的候选(v87 AISLG-217 起:酒馆只在主城建造、候选账号只有一份,固定为主城那座,每 4 小时基准随时间缩放刷新 3 名)、普通将 / 名将数量与上限、全部 40 名名将的全服归属(famousClaims,未被获得的 ownerUsername 为 null;在野名将未被获得时 wildAt 为 null,被获得后才给出落位 wildAt),以及在野名将的结交进度(friendships)与结交资格(unlocks)。武将规则(数值均为占位):**普通将**从酒馆招募,三项属性(统率 lead / 武力 force / 智力 wit)各 10–40 随机;招募费 = 500 + 三项合计 × 20(金币,从主城扣)。**名将**(三项各 45–65)只从 PvE 获得、全服唯一(见 famousClaims)。带兵加成:全军攻击 + 武力 × 0.3%、全军受到伤害 − 智力 × 0.3%,各自封顶 20%;能吃到加成的兵数 = 统率 × 20,部队超出时按比例摊薄(统率是带大军的关键)。俸禄每小时从主城扣(普通将 20 × 等级、名将 100 × 等级金币,随全局时间缩放),主城金币不够即「欠饷」(arrears=true,不能出征),扣款成功自动恢复。带队战败(攻方失败或全灭)武将重伤 2 小时(随缩放),期间不能出征、不会死亡。经验(v36 AISLG-116):带队参战(含城守守城)获得经验 = 本场歼灭敌军的参考战力,战败减半;升到 L+1 级需 100 × L²,每升一级获得自由点数(普通将 3、名将 5,由玩家分到三项属性,v54 起升级不再自动加属性),上限 40 级——加成仍受 20% 封顶,高等级的主要收益是统率提高(带更多兵吃满加成)。在野名将(v54,AISLG-144):29 名名将隐居在 Lv3 以上的野地里(开服时分配,之后不变)。地图上该野地带 wildFamous 标记;派部队打赢它的原住守军(守军为同级野地的 2 倍)即获得该名将的结交资格(GET_HEROES 的 unlocks)。结交(BEFRIEND_HERO)花主城金币 500 × 野地等级,好感 +10,每个名将每游戏日最多 5 次,同时结交(好感未满、未被招揽)最多 2 名。好感满 100 后招揽(RECRUIT_FAMOUS_HERO),全服唯一,先到先得;别人先招揽走,你的结交进度作废(lost=true,金币不退)。名将解雇后回到可获得状态。",
7394
7425
  "requestFields": [
7395
7426
  {
7396
7427
  "name": "cityId",
@@ -7442,7 +7473,7 @@
7442
7473
  {
7443
7474
  "name": "famousClaims",
7444
7475
  "type": "array",
7445
- "desc": "全部名将归属:{ name, sourceLabel 来源人读描述, ownerUsername 当前主人或 null, grantedAt, wildAt 在野名将的落位 { x, y, level } 或 null }。"
7476
+ "desc": "全部名将归属:{ name, sourceLabel 来源人读描述, ownerUsername 当前主人或 null, grantedAt, wildAt 在野名将被获得后的落位 { x, y, level };未被获得的在野名将与名城 / 黄巾名将为 null(未被获得时不泄露藏身位置)}。"
7446
7477
  },
7447
7478
  {
7448
7479
  "name": "friendships",
@@ -13281,7 +13312,7 @@
13281
13312
  "name": "GET_MAP_OVERVIEW",
13282
13313
  "title": "查询世界小地图总览(v58)",
13283
13314
  "preAuth": false,
13284
- "summary": "返回全图的城池点位,供小地图一次看全局(AISLG-160)。无请求参数。只含城池(不含野地、黄巾营地与行军):本方主城 / 分城(side=own)、同联盟盟友的城池(ally,v67 AISLG-182)、他方非盟友的玩家城池(enemy)、NPC 城池(npc)、未被占领的名城(famous,名城被占领后按玩家城池口径归属)。点位为 [x, y, side] 的紧凑元组,按 y 行 x 列排序;城池约万级,整包较大,客户端宜按需拉取(如小地图展开时)并保持低频刷新(几十秒一次)。归属按请求账号区分本方 / 他方,地图数据全服公开,不做侦察门控。",
13315
+ "summary": "返回全图的城池点位,供小地图一次看全局(AISLG-160)。无请求参数。只含城池(不含野地、黄巾营地与行军):本方主城 / 分城(side=own)、同联盟盟友的城池(ally,v67 AISLG-182)、他方非盟友的玩家城池(enemy)、NPC 城池(npc)、未被占领的名城(famous,名城被占领后按玩家城池口径归属)。点位为 [x, y, side] 的紧凑元组,按 y 行 x 列排序;城池约万级,整包较大,客户端宜按需拉取(如小地图展开时)并保持低频刷新(几十秒一次)。归属按请求账号区分本方 / 他方,地图数据全服公开,不做侦察门控。 迷雾开启时(v92):实时视野内的城与战力榜前 20 名的主城始终显示;已探索的城按上次看到的归属显示;未探索的城不显示,8 座名城未探索时在锚点显示 side = famous_rumor(大致方位,不是真实坐标)。响应多出 exploredChunks(10,000 位 base64,1250 字节,区块下标 floor(y/10)*100+floor(x/10),第 i 位在字节 i>>3、掩码 1<<(i&7))与 exploredPercent(探索进度 %)。关闭时响应与之前完全一致(无这两个字段,全图城池)。",
13285
13316
  "requestFields": [],
13286
13317
  "dataFields": [
13287
13318
  {
@@ -13294,6 +13325,16 @@
13294
13325
  "type": "string",
13295
13326
  "desc": "统计时刻(ISO 8601)。"
13296
13327
  },
13328
+ {
13329
+ "name": "exploredChunks",
13330
+ "type": "string",
13331
+ "desc": "迷雾开启时才有(v92):已探索区块位图,base64(1250 字节)。"
13332
+ },
13333
+ {
13334
+ "name": "exploredPercent",
13335
+ "type": "number",
13336
+ "desc": "迷雾开启时才有(v92):已探索区块占全图的百分比,保留 1 位小数。"
13337
+ },
13297
13338
  {
13298
13339
  "name": "cities",
13299
13340
  "type": "array",
@@ -19894,6 +19935,398 @@
19894
19935
  ],
19895
19936
  "agentNote": "想看全账号的伤兵营就用这一条,**不要对每座城轮询 GET_STATE**(城多时轮次很贵)。处理仍按城发:对每座城的 cityId 调 RESTORE_TROOPS(治疗 50% / 招降 60% 另扣人口 / 劝回 50%)或 RELEASE_TROOPS(免费,放弃 / 释放);服务端不提供批量协议,逐城调的顺序与取舍由你决定(推荐按 earliestExpireAt 从早到晚,先救快过期的)。earliestExpireAt 距现在不足 6 小时就该动手。starveAt 已到(不为 null 且已过去)的城正在断粮,劝回逃兵会返回 CITY_STARVING,先运粮。"
19896
19937
  },
19938
+ {
19939
+ "op": 148,
19940
+ "kind": "request",
19941
+ "name": "GET_ITEMS",
19942
+ "title": "查询道具背包、道具目录与礼金余额(v90,AISLG-222)",
19943
+ "preAuth": false,
19944
+ "summary": "返回账号的道具背包 items(每种道具的数量)、全部道具定义 catalog(名称、说明、礼金单价 shopPrice,null 表示不卖,堆叠上限 stackMax)与礼金余额 gift。商店出售的是 shopPrice 非 null 的道具:迁城令(city_order,礼金 50,堆叠上限 99);高级迁城令(city_order_adv,礼金 100,堆叠上限 99)。道具随换季清空,礼金见 GET_STATE 的 gift。",
19945
+ "requestFields": [],
19946
+ "dataFields": [
19947
+ {
19948
+ "name": "items",
19949
+ "type": "object",
19950
+ "desc": "背包:{ [itemId]: count },每种已定义道具都有键(缺省 0)。"
19951
+ },
19952
+ {
19953
+ "name": "catalog",
19954
+ "type": "object[]",
19955
+ "desc": "道具定义:id、name、nameEn、desc、descEn、kind(目前只有 order)、shopPrice(礼金单价,null = 不卖)、stackMax(堆叠上限)。"
19956
+ },
19957
+ {
19958
+ "name": "gift",
19959
+ "type": "number",
19960
+ "desc": "礼金余额(见 GET_STATE 的 gift)。"
19961
+ }
19962
+ ],
19963
+ "errors": [],
19964
+ "examples": [
19965
+ {
19966
+ "caption": "查询背包与商店目录",
19967
+ "request": {
19968
+ "op": 148,
19969
+ "seq": 61,
19970
+ "data": {}
19971
+ },
19972
+ "responses": [
19973
+ {
19974
+ "op": 148,
19975
+ "seq": 61,
19976
+ "ok": true,
19977
+ "data": {
19978
+ "items": {
19979
+ "city_order": 2,
19980
+ "city_order_adv": 0
19981
+ },
19982
+ "catalog": [
19983
+ {
19984
+ "id": "city_order",
19985
+ "name": "迁城令",
19986
+ "nameEn": "City Move Order",
19987
+ "desc": "消耗 1 张,随机迁城一次。",
19988
+ "descEn": "Uses 1 order to relocate the city once to a random spot.",
19989
+ "kind": "order",
19990
+ "shopPrice": 200,
19991
+ "stackMax": 99
19992
+ },
19993
+ {
19994
+ "id": "city_order_adv",
19995
+ "name": "高级迁城令",
19996
+ "nameEn": "Advanced City Move Order",
19997
+ "desc": "消耗 1 张,指定坐标迁城一次。",
19998
+ "descEn": "Uses 1 order to relocate the city once to chosen coordinates.",
19999
+ "kind": "order",
20000
+ "shopPrice": 500,
20001
+ "stackMax": 99
20002
+ }
20003
+ ],
20004
+ "gift": 600
20005
+ }
20006
+ }
20007
+ ]
20008
+ }
20009
+ ],
20010
+ "agentNote": "买道具前先用本协议看 shopPrice 与 gift,BUY_ITEM 必须带上你看到的单价(expectedPrice)。"
20011
+ },
20012
+ {
20013
+ "op": 149,
20014
+ "kind": "request",
20015
+ "name": "BUY_ITEM",
20016
+ "title": "礼金购买道具(v90,AISLG-222)",
20017
+ "preAuth": false,
20018
+ "summary": "用礼金购买道具:礼金按 单价 × 数量 扣除,道具数量按数量增加,写事件 item_bought。校验顺序:itemId 必须在目录里且可卖(未知或 shopPrice 为 null → INVALID_PARAMS)→ count 为 1..99 的整数 → expectedPrice 必填(缺失或非整数 → INVALID_PARAMS)→ expectedPrice 必须等于当前 shopPrice(不等 → ITEM_PRICE_CHANGED,附当前 price,不扣不改,客户端刷新目录后让玩家重新确认,不自动重试)→ 购买后不超过 stackMax(超出 → ITEM_STACK_FULL,附 stackMax / have / canBuy)→ 礼金不足 → INSUFFICIENT_GIFT(附 balance / cost)。全部在一个事务里,任何一步失败都不扣礼金、不加道具。成功后向该账号其他在线连接推送 PUSH_ACCOUNT_STATE(reason = items_changed)。已买到的道具不因调价而补差价或退款。",
20019
+ "requestFields": [
20020
+ {
20021
+ "name": "itemId",
20022
+ "type": "string",
20023
+ "desc": "必填。道具 id(见 GET_ITEMS 的 catalog)。"
20024
+ },
20025
+ {
20026
+ "name": "count",
20027
+ "type": "number",
20028
+ "desc": "必填。购买数量,1..99 的整数。购买后不能超过该道具的堆叠上限。"
20029
+ },
20030
+ {
20031
+ "name": "expectedPrice",
20032
+ "type": "number",
20033
+ "desc": "必填。你看到的单价(礼金),必须等于当前 shopPrice;不一致返回 ITEM_PRICE_CHANGED。"
20034
+ }
20035
+ ],
20036
+ "dataFields": [
20037
+ {
20038
+ "name": "itemId",
20039
+ "type": "string",
20040
+ "desc": "购买的道具 id。"
20041
+ },
20042
+ {
20043
+ "name": "bought",
20044
+ "type": "number",
20045
+ "desc": "本次买入数量。"
20046
+ },
20047
+ {
20048
+ "name": "count",
20049
+ "type": "number",
20050
+ "desc": "购买后该道具的总数量。"
20051
+ },
20052
+ {
20053
+ "name": "price",
20054
+ "type": "number",
20055
+ "desc": "本次单价(礼金)。"
20056
+ },
20057
+ {
20058
+ "name": "cost",
20059
+ "type": "number",
20060
+ "desc": "本次花费的礼金(price × bought)。"
20061
+ },
20062
+ {
20063
+ "name": "gift",
20064
+ "type": "number",
20065
+ "desc": "购买后的礼金余额。"
20066
+ }
20067
+ ],
20068
+ "errors": [
20069
+ "INVALID_PARAMS",
20070
+ "ITEM_PRICE_CHANGED",
20071
+ "ITEM_STACK_FULL",
20072
+ "INSUFFICIENT_GIFT"
20073
+ ],
20074
+ "examples": [
20075
+ {
20076
+ "caption": "买 2 张迁城令(单价 50)",
20077
+ "request": {
20078
+ "op": 149,
20079
+ "seq": 62,
20080
+ "data": {
20081
+ "itemId": "city_order",
20082
+ "count": 2,
20083
+ "expectedPrice": 50
20084
+ }
20085
+ },
20086
+ "responses": [
20087
+ {
20088
+ "op": 149,
20089
+ "seq": 62,
20090
+ "ok": true,
20091
+ "data": {
20092
+ "itemId": "city_order",
20093
+ "bought": 2,
20094
+ "count": 4,
20095
+ "price": 50,
20096
+ "cost": 100,
20097
+ "gift": 900
20098
+ }
20099
+ }
20100
+ ]
20101
+ },
20102
+ {
20103
+ "caption": "单价已变:返回当前单价,不扣不改",
20104
+ "request": {
20105
+ "op": 149,
20106
+ "seq": 63,
20107
+ "data": {
20108
+ "itemId": "city_order",
20109
+ "count": 1,
20110
+ "expectedPrice": 50
20111
+ }
20112
+ },
20113
+ "responses": [
20114
+ {
20115
+ "op": 149,
20116
+ "seq": 63,
20117
+ "ok": false,
20118
+ "error": {
20119
+ "code": "ITEM_PRICE_CHANGED",
20120
+ "message": "道具单价已变化,请刷新后重新确认"
20121
+ },
20122
+ "data": {
20123
+ "price": 250
20124
+ }
20125
+ }
20126
+ ]
20127
+ }
20128
+ ],
20129
+ "agentNote": "只在玩家明确要买时调用。收到 ITEM_PRICE_CHANGED 时先 GET_ITEMS 刷新目录,把新单价告诉玩家,等他确认后再带新单价重发,不要用旧价自动重试。"
20130
+ },
20131
+ {
20132
+ "op": 150,
20133
+ "kind": "request",
20134
+ "name": "MOVE_CITY",
20135
+ "title": "迁城(v91,AISLG-220)",
20136
+ "preAuth": false,
20137
+ "summary": "把账号名下的一座城(主城或分城,名城除外)迁到地图上的一块空野地。mode = random 随机迁:消耗 1 张迁城令(city_order),系统按注册落位同一算法选址,不需要坐标;mode = pointing 指定坐标迁:消耗 1 张高级迁城令(city_order_adv),x / y 必填,目标须为无主、无 NPC 的空野地,且离其他账号的城池格(分城、名城含在内)至少 3 格(Chebyshev 距离)。道具用 BUY_ITEM 以礼金购买,GET_ITEMS 查看持有数。\n\n拦截顺序(前四条即 GET_STATE moveCity 的 reasons):名城 MOVE_CITY_FAMOUS → 本城有部队在外(本城发出的行军含返程 / 运输 / 调兵,或派去别人城里的协防)MOVE_CITY_ARMY_OUTSIDE(附 count)→ 盟友协防本城 MOVE_CITY_HAS_ALLY_FORCE(附 count;迁城不会自动遣返,须对方召回或城主 DISMISS_ASSIST)→ 本城或其名下野地有敌情 MOVE_CITY_IN_BATTLE(只看这一座城)→ 目标格不合法 MOVE_CITY_TILE_INVALID / 太近 MOVE_CITY_TOO_CLOSE / 随机选址无空地 MOVE_CITY_NO_SPACE → 道具不足 INSUFFICIENT_ITEM(附 itemId、count)→ 执行时目标被抢先 MOVE_CITY_TILE_TAKEN。以上任何一条失败都不扣道具、不改任何数据。\n\n迁后:新格变成本城(等级 0,同注册落位);城的建筑、驻军、资源、武将、科技、队列、名下野地与城防 / 免战、联盟、爵位、保护状态全部保留。旧格:主城变回空野地(地形不变,等级按世界生成同口径重新抽取);分城回归 NPC 城池(等级 = 来源等级,并写入与放弃分城同口径的占回冷却,冷却内不能再占这一格的 NPC 城)。\n\n指定坐标迁(pointing)后 12 小时内(按时间缩放),这座城只能运输、调兵、召回、增援自己名下的野地;掠夺、占领、侦察、派协防以及其他攻击类出征都返回 MOVE_CITY_ATTACK_LOCK(附 retryAfterSeconds)。随机迁没有这个限制。迁城不中断也不延长新手保护 / 免战,迁后没有额外保护期。\n\n预览:preview = true 时不改任何数据,返回要消耗的道具、已有数量、目标格、距离、旧格去向与出征限制时长;条件不满足时预览同样返回对应错误码(附原因数据),不会只返回 ok。执行必须携带 confirm = true。",
20138
+ "requestFields": [
20139
+ {
20140
+ "name": "cityId",
20141
+ "type": "string",
20142
+ "desc": "必填。要迁的城 UUID(GET_STATE 的 cities[].id,主城或分城,名城除外)。非本账号名下的城或格式不对返回 INVALID_PARAMS。"
20143
+ },
20144
+ {
20145
+ "name": "mode",
20146
+ "type": "string",
20147
+ "desc": "必填。random(随机迁,消耗迁城令)或 pointing(指定坐标迁,消耗高级迁城令);其他值返回 INVALID_PARAMS。"
20148
+ },
20149
+ {
20150
+ "name": "x",
20151
+ "type": "number",
20152
+ "desc": "mode = pointing 时必填的目标 x 坐标(整数,0..999,越界返回 INVALID_PARAMS);random 时忽略。"
20153
+ },
20154
+ {
20155
+ "name": "y",
20156
+ "type": "number",
20157
+ "desc": "mode = pointing 时必填的目标 y 坐标(整数,0..999,越界返回 INVALID_PARAMS);random 时忽略。"
20158
+ },
20159
+ {
20160
+ "name": "confirm",
20161
+ "type": "boolean",
20162
+ "desc": "执行时必填,必须为 true(缺失或不为 true 返回 INVALID_PARAMS);preview = true 时不需要。"
20163
+ },
20164
+ {
20165
+ "name": "preview",
20166
+ "type": "boolean",
20167
+ "desc": "可选。true = 只预览,不改任何数据(见 summary)。"
20168
+ }
20169
+ ],
20170
+ "dataFields": [
20171
+ {
20172
+ "name": "cityId",
20173
+ "type": "string",
20174
+ "desc": "迁走的城 UUID。"
20175
+ },
20176
+ {
20177
+ "name": "mode",
20178
+ "type": "string",
20179
+ "desc": "random 或 pointing。"
20180
+ },
20181
+ {
20182
+ "name": "from / to",
20183
+ "type": "object",
20184
+ "desc": "旧坐标与新坐标 { x, y }。"
20185
+ },
20186
+ {
20187
+ "name": "distance",
20188
+ "type": "number",
20189
+ "desc": "旧坐标到新坐标的 Chebyshev 距离(不影响消耗,供参考)。"
20190
+ },
20191
+ {
20192
+ "name": "itemId",
20193
+ "type": "string",
20194
+ "desc": "消耗的道具 id(city_order 或 city_order_adv)。"
20195
+ },
20196
+ {
20197
+ "name": "left",
20198
+ "type": "number",
20199
+ "desc": "消耗后该道具的剩余数量。"
20200
+ },
20201
+ {
20202
+ "name": "oldTile",
20203
+ "type": "string",
20204
+ "desc": "旧格去向:wilderness(主城,变空野地)或 npc_city(分城,回归 NPC 城)。"
20205
+ },
20206
+ {
20207
+ "name": "moveLockUntil",
20208
+ "type": "string | null",
20209
+ "desc": "pointing 迁后的出征限制截止时刻(ISO 8601);random 为 null。"
20210
+ }
20211
+ ],
20212
+ "errors": [
20213
+ "INVALID_PARAMS",
20214
+ "MOVE_CITY_FAMOUS",
20215
+ "MOVE_CITY_ARMY_OUTSIDE",
20216
+ "MOVE_CITY_HAS_ALLY_FORCE",
20217
+ "MOVE_CITY_IN_BATTLE",
20218
+ "MOVE_CITY_TILE_UNEXPLORED",
20219
+ "MOVE_CITY_TILE_INVALID",
20220
+ "MOVE_CITY_TILE_TAKEN",
20221
+ "MOVE_CITY_TOO_CLOSE",
20222
+ "MOVE_CITY_NO_SPACE",
20223
+ "INSUFFICIENT_ITEM"
20224
+ ],
20225
+ "examples": [
20226
+ {
20227
+ "caption": "预览指定坐标迁城(主城迁到 (420, 388),有 1 张高级迁城令)",
20228
+ "request": {
20229
+ "op": 150,
20230
+ "seq": 70,
20231
+ "data": {
20232
+ "cityId": "0b7e5c1a-3d2f-4e8a-9c61-2f4a8d9e1b07",
20233
+ "mode": "pointing",
20234
+ "x": 420,
20235
+ "y": 388,
20236
+ "preview": true
20237
+ }
20238
+ },
20239
+ "responses": [
20240
+ {
20241
+ "op": 150,
20242
+ "seq": 70,
20243
+ "ok": true,
20244
+ "data": {
20245
+ "preview": true,
20246
+ "cityId": "0b7e5c1a-3d2f-4e8a-9c61-2f4a8d9e1b07",
20247
+ "mode": "pointing",
20248
+ "itemId": "city_order_adv",
20249
+ "count": 1,
20250
+ "need": 1,
20251
+ "from": {
20252
+ "x": 512,
20253
+ "y": 300
20254
+ },
20255
+ "to": {
20256
+ "x": 420,
20257
+ "y": 388
20258
+ },
20259
+ "distance": 92,
20260
+ "oldTile": "wilderness",
20261
+ "attackLockSeconds": 43200
20262
+ }
20263
+ }
20264
+ ]
20265
+ },
20266
+ {
20267
+ "caption": "执行随机迁城(分城回归 NPC 城)",
20268
+ "request": {
20269
+ "op": 150,
20270
+ "seq": 71,
20271
+ "data": {
20272
+ "cityId": "5d1f0c2e-8a6b-4f3d-b7e9-0c2a1d4e6f81",
20273
+ "mode": "random",
20274
+ "confirm": true
20275
+ }
20276
+ },
20277
+ "responses": [
20278
+ {
20279
+ "op": 150,
20280
+ "seq": 71,
20281
+ "ok": true,
20282
+ "data": {
20283
+ "cityId": "5d1f0c2e-8a6b-4f3d-b7e9-0c2a1d4e6f81",
20284
+ "mode": "random",
20285
+ "from": {
20286
+ "x": 300,
20287
+ "y": 512
20288
+ },
20289
+ "to": {
20290
+ "x": 745,
20291
+ "y": 129
20292
+ },
20293
+ "distance": 445,
20294
+ "itemId": "city_order",
20295
+ "left": 4,
20296
+ "oldTile": "npc_city",
20297
+ "moveLockUntil": null
20298
+ }
20299
+ }
20300
+ ]
20301
+ },
20302
+ {
20303
+ "caption": "离他人城池太近:拒绝,不扣令",
20304
+ "request": {
20305
+ "op": 150,
20306
+ "seq": 72,
20307
+ "data": {
20308
+ "cityId": "0b7e5c1a-3d2f-4e8a-9c61-2f4a8d9e1b07",
20309
+ "mode": "pointing",
20310
+ "x": 421,
20311
+ "y": 390,
20312
+ "confirm": true
20313
+ }
20314
+ },
20315
+ "responses": [
20316
+ {
20317
+ "op": 150,
20318
+ "seq": 72,
20319
+ "ok": false,
20320
+ "error": {
20321
+ "code": "MOVE_CITY_TOO_CLOSE",
20322
+ "message": "离其他玩家城池太近(需至少间隔 3 格)"
20323
+ }
20324
+ }
20325
+ ]
20326
+ }
20327
+ ],
20328
+ "agentNote": "先 GET_STATE 看 moveCity:reasons 为空且对应道具持有数 ≥ 1 才可迁。指定坐标前先 GET_WORLD_MAP 找空野地(迷雾开启时须是已探索或实时视野内的格,否则返回 MOVE_CITY_TILE_UNEXPLORED),再用 preview = true 预览(看 to、distance、attackLockSeconds),玩家确认后才带 confirm = true 执行。收到 INSUFFICIENT_ITEM 时先 GET_ITEMS,由玩家决定是否 BUY_ITEM。pointing 迁后 12 小时内不要派攻击类部队(会返回 MOVE_CITY_ATTACK_LOCK);运输、调兵与增援自己的野地不受限。"
20329
+ },
19897
20330
  {
19898
20331
  "op": 2000,
19899
20332
  "kind": "push",
@@ -20042,7 +20475,7 @@
20042
20475
  "kind": "push",
20043
20476
  "name": "PUSH_CITY_STATE",
20044
20477
  "title": "推送:城池级状态变化",
20045
- "summary": "城池级状态变化时推送给该账号所有在线连接(发起连接除外):city_renamed=城池改名(RENAME_CITY)、account_reset=账号数据被 RESET_ACCOUNT 重置(v9,重置后全部游戏数据回到开号初始状态)、city_discarded=分城被放弃(DISCARD_CITY,v57;推送只带 cityId,收到后用 GET_STATE 刷新城池列表)、capital_changed=设为主城(SET_CAPITAL,v82,AISLG-205;cityId 为新主城,formerCapitalId 为原主城,收到后用 GET_STATE 刷新)、troops_disbanded=城内驻军被遣散(DISBAND_TROOPS,v84,AISLG-209;只带 cityId,收到后用 GET_STATE 刷新驻军与资源)。建造队列相关变化走 PUSH_BUILD_STATE。推送只携带变化摘要,完整现状用 GET_STATE 查询。",
20478
+ "summary": "城池级状态变化时推送给该账号所有在线连接(发起连接除外):city_renamed=城池改名(RENAME_CITY)、account_reset=账号数据被 RESET_ACCOUNT 重置(v9,重置后全部游戏数据回到开号初始状态)、city_discarded=分城被放弃(DISCARD_CITY,v57;推送只带 cityId,收到后用 GET_STATE 刷新城池列表)、capital_changed=设为主城(SET_CAPITAL,v82,AISLG-205;cityId 为新主城,formerCapitalId 为原主城,收到后用 GET_STATE 刷新)、troops_disbanded=城内驻军被遣散(DISBAND_TROOPS,v84,AISLG-209;只带 cityId,收到后用 GET_STATE 刷新驻军与资源)。city_moved=城池迁移(MOVE_CITY,v91,AISLG-220;带 cityId 与 from / to 新旧坐标,收到后用 GET_STATE 刷新,新旧两格另有 PUSH_TILE_STATE reason = city_moved)。建造队列相关变化走 PUSH_BUILD_STATE。推送只携带变化摘要,完整现状用 GET_STATE 查询。",
20046
20479
  "dataFields": [
20047
20480
  {
20048
20481
  "name": "reason",
@@ -21234,13 +21667,13 @@
21234
21667
  "dataFields": [
21235
21668
  {
21236
21669
  "name": "reason",
21237
- "type": "'account_renamed'",
21238
- "desc": "触发本次推送的状态变化。"
21670
+ "type": "'account_renamed' | 'items_changed'",
21671
+ "desc": "触发本次推送的状态变化。items_changed(v90,AISLG-222):道具背包或礼金余额变化,data 另带 items(每种道具的数量)与 gift(礼金余额)。"
21239
21672
  },
21240
21673
  {
21241
21674
  "name": "username",
21242
21675
  "type": "string",
21243
- "desc": "账号的新昵称(即新 username)。"
21676
+ "desc": "账号的新昵称(即新 username);reason = items_changed 时无此字段。"
21244
21677
  }
21245
21678
  ],
21246
21679
  "examples": [
@@ -21716,6 +22149,54 @@
21716
22149
  }
21717
22150
  ],
21718
22151
  "agentNote": "收到后按 stratagem 应对:焚烧粮草 → 检查粮食并考虑补产;趁火打劫 → 1 小时内可能被掠夺,优先把资源用掉或堆高仓库保护;十面埋伏 → 这段时间派不出兵,用在外部队召回与协防应对;八门金锁 → 自己的行军到达时间被延后(PUSH_MARCH_STATE 里有新时刻);蛛丝马迹 → 对方已知你所有城池坐标与在外部队去向。"
22152
+ },
22153
+ {
22154
+ "op": 2029,
22155
+ "kind": "push",
22156
+ "name": "PUSH_EXPLORATION_REPORT",
22157
+ "title": "推送:探索简报(v92,AISLG-224)",
22158
+ "summary": "部队去程结束(到达或撤回)后,如果这一趟新探索了区块,推给本账号一份简报:新探索的区块数、新区块里的东西按类计数(NPC 城分等级、金矿、Lv5 及以上野地、在野名将、其他玩家的城、名城),以及最多 10 个坐标(优先级:名城 > 在野名将 > 金矿 > 玩家城 > NPC 城 > 高级野地)。内容与事件 exploration_report 的 detail 一致,可随时用 GET_EVENTS 回看。存量初始化、开局与城池 / 领地带来的新区块不生成简报;返程不生成。",
22159
+ "dataFields": [
22160
+ {
22161
+ "name": "report",
22162
+ "type": "object",
22163
+ "desc": "{ eventId, marchId, chunks, npcCities: { total, byLevel }, goldMines, highWilderness, wildHeroes, playerCities, famous, cells: [{ x, y, kind, level? }] }。kind = famous / wild_hero / gold_mine / player_city / npc_city / high_wilderness。"
22164
+ }
22165
+ ],
22166
+ "examples": [
22167
+ {
22168
+ "op": 2029,
22169
+ "push": true,
22170
+ "data": {
22171
+ "report": {
22172
+ "eventId": 1024,
22173
+ "marchId": "6f1d2c3e-0000-4000-8000-000000000001",
22174
+ "chunks": 3,
22175
+ "npcCities": {
22176
+ "total": 2,
22177
+ "byLevel": {
22178
+ "3": 1,
22179
+ "5": 1
22180
+ }
22181
+ },
22182
+ "goldMines": 1,
22183
+ "highWilderness": 0,
22184
+ "wildHeroes": 0,
22185
+ "playerCities": 0,
22186
+ "famous": 0,
22187
+ "cells": [
22188
+ {
22189
+ "x": 512,
22190
+ "y": 340,
22191
+ "kind": "gold_mine",
22192
+ "level": 2
22193
+ }
22194
+ ]
22195
+ }
22196
+ }
22197
+ }
22198
+ ],
22199
+ "agentNote": "收到后可按 cells 坐标用 GET_TILE 查看(已探索的地块返回上次看到的情况,带 seenAt)。"
21719
22200
  }
21720
22201
  ],
21721
22202
  "errorCodes": {
@@ -22367,6 +22848,66 @@
22367
22848
  "desc": "(v86,AISLG-211)这座城中了十面埋伏,期间不能派出任何部队(MARCH 的各用途、侦察、协防出发、交易所商队、剧本战场入场都被拒);响应附 retryAfterSeconds。已经在外的部队照常行动、照常可以召回。",
22368
22849
  "action": "等到 retryAfterSeconds 之后再派兵;已在外的部队用 RECALL_MARCH 召回不受影响。"
22369
22850
  },
22851
+ "INSUFFICIENT_GIFT": {
22852
+ "desc": "(v89,AISLG-221)礼金余额不足,扣除被拒;响应附 balance(当前余额)。不扣、不写事件,其他数据不变。礼金每赛季固定发 1000,换季清零,不能转让或兑换。",
22853
+ "action": "等下一个赛季(换季后重新登录即回到 1000)或改用金币等其他方式;用 GET_STATE 的 gift 查看当前余额。"
22854
+ },
22855
+ "INSUFFICIENT_ITEM": {
22856
+ "desc": "(v90,AISLG-222)道具数量不足,消耗被拒;响应附 itemId 与 count(当前数量)。不扣、不写事件,其他数据不变。",
22857
+ "action": "先用 GET_ITEMS 确认数量;不够时用 BUY_ITEM 用礼金买,或等获得途径(任务 / 活动)发放。"
22858
+ },
22859
+ "ITEM_STACK_FULL": {
22860
+ "desc": "(v90,AISLG-222)购买后会超过该道具的堆叠上限,购买被拒;响应附 stackMax、have(当前数量)、canBuy(还能买几张,已满为 0)。礼金与道具都不变。",
22861
+ "action": "把购买数量降到 canBuy 以内;已满时先用掉道具再买。"
22862
+ },
22863
+ "ITEM_PRICE_CHANGED": {
22864
+ "desc": "(v90,AISLG-222)BUY_ITEM 的 expectedPrice 与当前单价不一致(道具调价过);响应附 price(当前单价)。不扣礼金、不加道具。",
22865
+ "action": "用 GET_ITEMS 刷新目录,把新单价告诉玩家,让玩家重新确认后带新单价重发;不要自动用新价重试。"
22866
+ },
22867
+ "MOVE_CITY_FAMOUS": {
22868
+ "desc": "(v91,AISLG-220)名城(特殊城池)不能迁移;不扣令、不改任何数据。",
22869
+ "action": "换一座非名城的城迁移;名城只能靠攻占 / 经营保有。"
22870
+ },
22871
+ "MOVE_CITY_ARMY_OUTSIDE": {
22872
+ "desc": "(v91,AISLG-220)这座城有部队在外:本城发出的行军(出征 / 返程 / 运输 / 调兵)或派去别人城里的协防。响应附 count。",
22873
+ "action": "等部队回到本城(或用 RECALL_MARCH 召回、DISMISS_ASSIST 撤回协防)后再迁。驻守自己野地的部队不算在外。"
22874
+ },
22875
+ "MOVE_CITY_HAS_ALLY_FORCE": {
22876
+ "desc": "(v91,AISLG-220)盟友的部队正在协防这座城;响应附 count。迁城时不会自动遣返。",
22877
+ "action": "请盟友召回协防,或城主用 DISMISS_ASSIST 遣返后再迁。"
22878
+ },
22879
+ "MOVE_CITY_IN_BATTLE": {
22880
+ "desc": "(v91,AISLG-220)这座城或其名下野地正有行军指向,或有未结的 NPC 来袭(与放弃分城、遣散士兵同一口径)。只看这一座城。",
22881
+ "action": "等战斗结算或来袭结束后再迁;若是自己的行军,可用 RECALL_MARCH 撤回。"
22882
+ },
22883
+ "MOVE_CITY_TILE_INVALID": {
22884
+ "desc": "(v91,AISLG-220)指定坐标不是无主、无 NPC 的空野地(NPC 城、他人城池、已被占领的野地、城池格等一切非空野地的格都算)。不扣令。",
22885
+ "action": "用 GET_MAP_OVERVIEW / GET_WORLD_MAP 找一块空野地(kind=wilderness 且无归属)后重试。"
22886
+ },
22887
+ "MOVE_CITY_TILE_TAKEN": {
22888
+ "desc": "(v91,AISLG-220)目标格在判定与落库之间被别人抢先占走(并发)。令与坐标都未改动。",
22889
+ "action": "重新 GET_WORLD_MAP 选一块空野地后再发起迁城。"
22890
+ },
22891
+ "MOVE_CITY_TOO_CLOSE": {
22892
+ "desc": "(v91,AISLG-220)目标离其他账号的城池格(分城、名城含在内)不足 3 格(Chebyshev 距离)。自己的城不受此限。",
22893
+ "action": "选离他人城池至少 3 格的空野地;随机迁不受此限。"
22894
+ },
22895
+ "MOVE_CITY_NO_SPACE": {
22896
+ "desc": "(v91,AISLG-220)随机迁城时世界中已没有可选的空野地。",
22897
+ "action": "改用指定坐标迁城(高级迁城令)选一块空野地,或等世界有空地后再试。"
22898
+ },
22899
+ "TILE_UNEXPLORED": {
22900
+ "desc": "该地块在战争迷雾中未探索,且不在任何视野来源(城池 / 领地 / 行军 / 盟友城池格)覆盖内,服务端不返回它的任何信息(v92,AISLG-224)。仅在 fog_enabled 开启时出现。",
22901
+ "action": "先派斥候或部队去这个方向探索(派去未探索坐标的出征本身允许,盲打时前端应提示“目标在迷雾中”)。也可以改查已探索的格子。"
22902
+ },
22903
+ "MOVE_CITY_TILE_UNEXPLORED": {
22904
+ "desc": "高级迁城令(指定坐标)的目标格未探索,也不在实时视野内,无法指定为迁城目标(v92,AISLG-224)。随机迁城令不受影响。",
22905
+ "action": "先探索目标区域(派斥候或部队去那里),或改用随机迁城令。"
22906
+ },
22907
+ "MOVE_CITY_ATTACK_LOCK": {
22908
+ "desc": "(v91,AISLG-220)指定坐标迁城后 12 小时内,这座城的掠夺 / 占领 / 侦察 / 派协防(以及其他攻击类出征)被拒;响应附 retryAfterSeconds。运输、调兵、增援自己名下野地与召回不受限。",
22909
+ "action": "等待 retryAfterSeconds 之后再出征打别人;期间可以正常运输、调兵与增援。"
22910
+ },
22370
22911
  "INTERNAL": {
22371
22912
  "desc": "服务端内部错误。",
22372
22913
  "action": "可稍后重试同一请求;持续出现时向运营方反馈。INTERNAL 可能出现在任何请求的响应中。"