slg-mcp 0.2.2 → 0.2.4

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": 92,
2
+ "version": 98,
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": 92,
876
+ "protocolVersion": 98,
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": 92,
925
+ "protocolVersion": 98,
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/89 补读增量)",
945
+ "caption": "Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/95 补读增量)",
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": 89,
952
+ "docVersion": 95,
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": 92,
968
- "docNotice": "接口文档已从 v89 更新到 v92:请 GET /agent-api/changes/89 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。",
967
+ "protocolVersion": 98,
968
+ "docNotice": "接口文档已从 v95 更新到 v98:请 GET /agent-api/changes/95 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。",
969
969
  "season": {
970
970
  "id": 2,
971
971
  "endsAt": "2026-11-22T00:00:00.000Z"
@@ -1279,7 +1279,7 @@
1279
1279
  {
1280
1280
  "name": "city.territory",
1281
1281
  "type": "array",
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)采集,采空不需要撤兵,留兵即按恢复速度小量采集。"
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;档位与当前储量 / 上限 / 预计采空或回满时刻,本城占领的地块恒给出数值), facility 这块地上的望楼(v97 新增,AISLG-232;{ kind(恒为 watchtower), level 已建成等级 0..3, visionRadius 视野半径 1 级 6 / 2 级 8 / 3 级 10 格(丘陵上的野地各 +2:8 / 10 / 12,上限 12;level 为 0 时 0,AISLG-233), building: { toLevel, finishAt } | null 进行中的建造 / 升级 },没盖为 null)};production 已计入 bonusRate、gatherRate 与连片加成——连片按同地形 + 上下左右相邻计算,占领 / 失守后按最新领地自动重算。v61 起 gatherRate 受储量约束:储量空时驻军只按恢复速度(2%/h)采集,采空不需要撤兵,留兵即按恢复速度小量采集。"
1283
1283
  },
1284
1284
  {
1285
1285
  "name": "gift",
@@ -2750,7 +2750,7 @@
2750
2750
  {
2751
2751
  "name": "events[].type",
2752
2752
  "type": "string",
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 })。"
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'(detail = { x, y, cause = npc_attack / recall / conquest / inactive(v98,AISLG-238,账号长期未上线被收回), terrain, level }) | '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 })· 'hero_left'(v94,AISLG-228,名将下野,detail = { heroId, heroName, cause = loyalty / captive_expired },胜方得结交资格时另有一条 qualified = true)/ 'hero_captured'(v94,名将被俘,主人与胜方各一条,detail = { heroId, heroName, ownerUsername, captorUsername, capturedUntil, ransomGold, side })/ 'hero_ransomed'(v94,名将被赎回,detail = { heroId, heroName, ransomGold, taxShare, destroyed, side })/ 'hero_loyalty_low'(v94,忠诚度降到 30 及以下,detail = { heroId, heroName, loyalty })。"
2754
2754
  },
2755
2755
  {
2756
2756
  "name": "events[].initiator",
@@ -4691,6 +4691,11 @@
4691
4691
  "type": "number",
4692
4692
  "desc": "本次窗口的左上角与宽高(已按世界边界钳制后的实际值)。"
4693
4693
  },
4694
+ {
4695
+ "name": "fogEnabled",
4696
+ "type": "boolean",
4697
+ "desc": "战争迷雾开关 fog_enabled 的当前值(v97,AISLG-232)。关闭时望楼照建但不产生视野效果,客户端据此注明「迷雾未开启」。"
4698
+ },
4694
4699
  {
4695
4700
  "name": "tiles",
4696
4701
  "type": "array",
@@ -4721,6 +4726,26 @@
4721
4726
  "type": "string | null",
4722
4727
  "desc": "已探索的格为上次看到的时间(ISO);实时视野为 null。"
4723
4728
  },
4729
+ {
4730
+ "name": "tiles[].relic",
4731
+ "type": "{ tier, kind } | null",
4732
+ "desc": "遗迹(v93,AISLG-227):实时视野或已探索且未领取的遗迹格才有;tier = common / rare / legendary,kind = granary / lumberyard / quarry / ironworks / caravan / battlefield / treasury / mausoleum。领取后所有人的地图上立刻消失。迷雾关闭时恒为 null。"
4733
+ },
4734
+ {
4735
+ "name": "tiles[].facility",
4736
+ "type": "{ kind, level } | null",
4737
+ "desc": "野地上的设施(v97,AISLG-232):目前只有望楼 kind = watchtower,level 为已建成等级(1..3)。只要能看到这块地(实时视野或已探索)就能看到有望楼与它的等级——别人想「断你的眼」得先知道眼在哪;**不含建造进度**(进度只有主人能看到,见 GET_STATE 的 city.territory[].facility)。没盖望楼、或还在建第一级时为 null。"
4738
+ },
4739
+ {
4740
+ "name": "tiles[].heroSite",
4741
+ "type": "{ name, hero, claimed } | null",
4742
+ "desc": "名将处所(v93,AISLG-227):8 位一线在野名将的隐居地,实时视野或已探索才有;name 为处所名(如「茅庐」),hero 为名将名,claimed = true 表示名将已被招揽(已出山,图标变灰)。迷雾关闭时恒为 null。"
4743
+ },
4744
+ {
4745
+ "name": "tiles[].famous.firstExplorer",
4746
+ "type": "string | null",
4747
+ "desc": "名城首探者用户名(v93,AISLG-227):尚无人首探为 null;迷雾关闭时该字段缺省。"
4748
+ },
4724
4749
  {
4725
4750
  "name": "tiles[].level",
4726
4751
  "type": "number",
@@ -4729,7 +4754,7 @@
4729
4754
  {
4730
4755
  "name": "tiles[].owner",
4731
4756
  "type": "object | null",
4732
- "desc": "占领者(占领野地或城池地块归属的城池):{ accountId, username, cityId, cityName, ally, relation };relation(v77)= self / ally / friendly / hostile / neutral;无主为 null。ally(v67,AISLG-182)= 占领者与你同属一个联盟(盟友,自己的地块为 false):盟友的城池 / 野地不能掠夺、抢占、占领,也不能侦察(返回 ALLY_NOT_ATTACKABLE)。"
4757
+ "desc": "占领者(占领野地或城池地块归属的城池):{ accountId, username, cityId, cityName, ally, relation, canAssist };relation(v77)= self / ally / friendly / hostile / neutral;无主为 null。canAssist(v95,AISLG-226)= 你现在能否向该占领者协防:同联盟或友盟为 true;自己、解除友好后 24 小时冷却期(relation 仍为 friendly,只为不能互打)、中立、敌对均为 false,与 MARCH task=assist 的校验一致。ally(v67,AISLG-182)= 占领者与你同属一个联盟(盟友,自己的地块为 false):盟友的城池 / 野地不能掠夺、抢占、占领,也不能侦察(返回 ALLY_NOT_ATTACKABLE)。"
4733
4758
  },
4734
4759
  {
4735
4760
  "name": "tiles[].garrison",
@@ -4880,6 +4905,11 @@
4880
4905
  "type": "object | null",
4881
4906
  "desc": "NPC 城池情报(v13 需侦察):{ garrison 驻防按兵种(快照), stock 可掠夺库存(快照), scoutDetail / garrisonTotal(v27)};未侦察或非 NPC 城为 null。**v27 起驻防精度随侦察科技**:scoutDetail=rough(侦察科技 Lv0–2)时 garrison 全 0,只有 garrisonTotal { min, max } 给总兵力约数(真实 ±20%);kinds(Lv3–5)给兵种明细、各兵种数量为近似值(真实 ±20%,同一地块固定不变);exact(Lv6+)精确。历史情报无 scoutDetail 字段,视为 exact。"
4882
4907
  },
4908
+ {
4909
+ "name": "tile.facilityBuilding",
4910
+ "type": "{ toLevel, finishAt } | null",
4911
+ "desc": "望楼的建造 / 升级进度(v97,AISLG-232):**只有占着这块地的城的主人能看到**(toLevel 为目标等级、finishAt 为完成时刻 ISO 8601),其余账号为 null;没有进行中的工程也为 null。"
4912
+ },
4883
4913
  {
4884
4914
  "name": "tile.scoutedAt",
4885
4915
  "type": "string | null",
@@ -6616,7 +6646,7 @@
6616
6646
  {
6617
6647
  "name": "offline",
6618
6648
  "type": "object",
6619
- "desc": "离线数字汇总:{ seconds 离线秒数, gains 收进账合计(按资源), battles 战斗场次, troopsLost 我方总减员, npcRaids NPC 袭击次数, wildernessLost 被 NPC 攻破的野地数, storageFull 最接近满仓的资源(占储量上限 ≥ 80% 时给出,否则 null), mutinyLost 断粮哗变损兵合计(v34,AISLG-107,不含在 troopsLost 内) }。"
6649
+ "desc": "离线数字汇总:{ seconds 离线秒数, gains 收进账合计(按资源), battles 战斗场次, troopsLost 我方总减员, npcRaids NPC 袭击次数, wildernessLost 被 NPC 攻破的野地数, wildernessInactiveLost 因长期未上线被收回的野地数(v98,AISLG-238,不计入 wildernessLost), storageFull 最接近满仓的资源(占储量上限 ≥ 80% 时给出,否则 null), mutinyLost 断粮哗变损兵合计(v34,AISLG-107,不含在 troopsLost 内) }。"
6620
6650
  },
6621
6651
  {
6622
6652
  "name": "offline.gains",
@@ -6699,13 +6729,13 @@
6699
6729
  },
6700
6730
  {
6701
6731
  "name": "broadcasts[].type",
6702
- "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'",
6703
- "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 条限频)。"
6732
+ "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' | 'announcement' | 'battlefield_signup' | 'battlefield_started' | 'battlefield_stronghold' | 'battlefield_finished' | 'nobility_promoted' | 'alliance_diplomacy' | 'luoyang_window' | 'famous_first_explored' | 'hero_site_first_explored' | 'legendary_relic_claimed' | 'hero_left' | 'hero_captured'",
6733
+ "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 结成友盟 / 宣布敌对;announcement 为 v60 公告播报;luoyang_window 为 v79 洛阳窗口预告 / 开始 / 结束 / 易主 / 政令;famous_first_explored / hero_site_first_explored / legendary_relic_claimed 为 v93 战争迷雾的名城首探、名将处所首探、传说遗迹领取;以上均必达、不受每分钟 3 条限频;hero_left 为 v94 名将下野(忠诚度归零,或被俘后囚禁到期未赎回);hero_captured 为 v94 名将被俘;这两类走普通限频)。"
6704
6734
  },
6705
6735
  {
6706
6736
  "name": "broadcasts[].detail",
6707
6737
  "type": "object",
6708
- "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 }。"
6738
+ "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 };hero_granted = { username, heroName, source }(source 为获得途径文字,如「首占名城「X」」「黄巾老巢首杀」「黄巾之乱贡献榜第 N 名」「在野名将(打赢守军后结交招揽)」「结交招揽」);city_conquered = { username(攻方), cityName, from(守方用户名), x, y };announcement = { announcementId, title }(title 为公告中文标题);luoyang_window = { phase, ... }:phase = holder 洛阳易主(allianceId, allianceName, username)| soon 窗口前预告(startAt, endAt)| started 窗口开始(startAt, endAt)| ended 窗口结束(startAt, endAt)| decree 盟主发政令(allianceId, decreeKind = recruit|march|research, until);famous_first_explored = { username, name }(name 为名城名,不带坐标);hero_site_first_explored = { username, name, hero }(name 为处所名,hero 为名将名,不带坐标);legendary_relic_claimed = { username, kind }(kind 为遗迹种类,当前唯一的传说遗迹为 mausoleum,不带坐标);hero_left = { username, heroName }(username 为主人用户名,查不到时为 null);hero_captured = { ownerUsername, captorUsername, heroName }(主人与胜方用户名,查不到时为 null)。"
6709
6739
  },
6710
6740
  {
6711
6741
  "name": "broadcasts[].createdAt",
@@ -6754,20 +6784,20 @@
6754
6784
  "op": 43,
6755
6785
  "kind": "request",
6756
6786
  "name": "GET_LEADERBOARD",
6757
- "title": "查询全服排行榜(v23,AISLG-61;v50 新增模型榜;v70 新增联盟榜;v76 新增爵位榜)",
6787
+ "title": "查询全服排行榜(v23,AISLG-61;v50 新增模型榜;v70 新增联盟榜;v76 新增爵位榜;v93 新增探索榜)",
6758
6788
  "preAuth": false,
6759
- "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),不报错。",
6789
+ "summary": "查询七个全服榜之一:power 综合战力(全部兵力战力之和:城内驻军 + 占领野地的驻军 + 行军中的部队,按「兵种与战斗属性」的战力系数合计)/ territory 领地数量(占领的野地数)/ plunder 累计掠夺量(掠夺入账的四资源合计,记在账号上——玩家与 Agent 打出的成绩算同一账号)/ **model 模型榜(v50,AISLG-133)**:把最近 7 天 Agent 上线过、且进了战力统计的账号按 Agent 自报模型(LOGIN 的 agentModel)归类分组,「未声明」与「其他」(名单外)也是组,每组排名分 = 该模型实力前 10 名的平均战力(不足 10 名取全部平均)——防止单个账号(刷小号)拉高或拉低整体。模型为**自报口径,不验证**。**nobility 爵位榜(v76,AISLG-197)**:按账号累计声望降序(声望只增不减,换季清零;来源见 GET_NOBILITY)。**exploration 探索榜(v93,AISLG-227)**:数值为已探索区块数(全图 10000 块,每块 10×10 格;前端按 ÷100 显示探索百分比),按数值降序;迷雾关闭时返回空榜(entries = []、me = null);换季进名人堂。**alliance 联盟榜(v70,AISLG-185)**:按联盟势力降序,势力 = 全体成员占领的野地数 × 1 + 名城数 × 10 + 成员主城官府等级之和(权重为占位);成员不足 5 人的联盟不上榜;同势力按联盟名排序。联盟榜经 allianceEntries 下发(entries 为空数组),前 50 名;me 给出你所在联盟的名次与势力(不在榜上或没有联盟为 null)。玩家个人榜(除 model / alliance 外的五榜)返回前 50 名与本账号的名次和数值(不在前 50 也会给出 me);模型榜经 modelEntries 下发(entries 为空数组、me 为 null)。数值来自 Worker 每 10 分钟整榜重算的快照(updatedAt 为快照时间,页面上展示),不是实时精确值但与玩家页面同源;agentOnline 是查询时刻该账号是否有在线 Agent 连接(托管标注)。快照尚未生成时返回空榜(entries = []、me = null),不报错。",
6760
6790
  "requestFields": [
6761
6791
  {
6762
6792
  "name": "kind",
6763
- "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance' | 'nobility'",
6764
- "desc": "必填。榜单类别;model 为按 Agent 自报模型归类的模型榜(v50);alliance 为联盟势力榜(v70);nobility 为爵位榜(v76)。"
6793
+ "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance' | 'nobility' | 'exploration'",
6794
+ "desc": "必填。榜单类别;model 为按 Agent 自报模型归类的模型榜(v50);alliance 为联盟势力榜(v70);nobility 为爵位榜(v76);exploration 为探索榜(v93,数值为已探索区块数)。"
6765
6795
  }
6766
6796
  ],
6767
6797
  "dataFields": [
6768
6798
  {
6769
6799
  "name": "kind",
6770
- "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance' | 'nobility'",
6800
+ "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance' | 'nobility' | 'exploration'",
6771
6801
  "desc": "回显榜单类别。"
6772
6802
  },
6773
6803
  {
@@ -6778,7 +6808,7 @@
6778
6808
  {
6779
6809
  "name": "entries",
6780
6810
  "type": "array",
6781
- "desc": "玩家三榜的前 50 名:{ rank 名次, accountId, username, cityName 主城名, value 数值, agentOnline 该账号是否有在线 Agent 连接, agentModel 该账号 Agent 自报的模型名原文(v50,null = 从未声明;自报不验证), nobility 爵位序号与 nobilityName 爵位名(v76) },按 rank 升序;kind=model 为空数组。"
6811
+ "desc": "玩家个人榜(除 model / alliance 外的五榜)的前 50 名:{ rank 名次, accountId, username, cityName 主城名, value 数值, agentOnline 该账号是否有在线 Agent 连接, agentModel 该账号 Agent 自报的模型名原文(v50,null = 从未声明;自报不验证), nobility 爵位序号与 nobilityName 爵位名(v76) },按 rank 升序;kind=model 为空数组。"
6782
6812
  },
6783
6813
  {
6784
6814
  "name": "me",
@@ -7463,7 +7493,7 @@
7463
7493
  {
7464
7494
  "name": "heroes",
7465
7495
  "type": "array",
7466
- "desc": "账号全部武将:{ id, name, famous, lead, force, wit, level, exp, expNext 距下一级, salaryPerHour 已随时间缩放, arrears 欠饷, woundedUntil 重伤恢复时刻或 null, guardCityId 正在城守的城或 null, marchingMarchId 正在随行的行军或 null, bonus { atkPercent, defPercent, leadCap }(满编口径), guardProductionPercent 城守产量加成 }。"
7496
+ "desc": "账号全部武将:{ id, name, famous, lead, force, wit, level, exp, expNext 距下一级, salaryPerHour 已随时间缩放, arrears 欠饷, woundedUntil 重伤恢复时刻或 null, guardCityId 正在城守的城或 null, marchingMarchId 正在随行的行军或 null, bonus { atkPercent, defPercent, leadCap }(满编口径), guardProductionPercent 城守产量加成, loyalty 忠诚度 0..100(v94,只有 29 位在野名将有,其余为 null;30 及以下应标红提醒), captive 被俘囚禁 { capturedUntil 截止时刻, ransomGold 赎金 } 或 null(v94;被俘时不能出征 / 任城守 / 历练 / 赏赐 / 解雇 / 加点 / 洗点 / 施计,可用 RANSOM_HERO 赎回) }。"
7467
7497
  },
7468
7498
  {
7469
7499
  "name": "candidates",
@@ -7546,7 +7576,9 @@
7546
7576
  "dailyLeft": {
7547
7577
  "gift": 3,
7548
7578
  "reset": 1
7549
- }
7579
+ },
7580
+ "loyalty": null,
7581
+ "captive": null
7550
7582
  }
7551
7583
  ],
7552
7584
  "candidates": [
@@ -7658,7 +7690,9 @@
7658
7690
  "dailyLeft": {
7659
7691
  "gift": 3,
7660
7692
  "reset": 1
7661
- }
7693
+ },
7694
+ "loyalty": null,
7695
+ "captive": null
7662
7696
  }
7663
7697
  }
7664
7698
  }
@@ -7812,7 +7846,9 @@
7812
7846
  "dailyLeft": {
7813
7847
  "gift": 3,
7814
7848
  "reset": 1
7815
- }
7849
+ },
7850
+ "loyalty": null,
7851
+ "captive": null
7816
7852
  }
7817
7853
  }
7818
7854
  }
@@ -13695,7 +13731,7 @@
13695
13731
  "name": "GET_HALL_OF_FAME",
13696
13732
  "title": "查询名人堂(v65,AISLG-134)",
13697
13733
  "preAuth": false,
13698
- "summary": "查询已结束赛季的存档:各榜前列(个人榜 power / territory / plunder / arena / starTower)、模型榜(model)与联盟榜前三(alliance,v70,AISLG-185:换季时联盟势力排名前三,条目的 accountId / username 为当时的盟主,value 为势力,并带 allianceId / allianceName / memberCount)。缺省 seasonId 为最近一个已结束赛季;kind 缺省 power;page 从 1 起,每页 20 条。个人榜结果进 entries,模型榜结果进 modelEntries(entries 为空)。total 为该榜总条数。seasons 列出全部已结束赛季(新 → 旧)供选择。指定的 seasonId 不存在返回 INVALID_PARAMS;没有任何已结束赛季时 seasonId 为 null、结果为空。kind 允许值:power / territory / plunder / arena / starTower / model / alliance。",
13734
+ "summary": "查询已结束赛季的存档:各榜前列(个人榜 power / territory / plunder / arena / starTower)、模型榜(model)与联盟榜前三(alliance,v70,AISLG-185:换季时联盟势力排名前三,条目的 accountId / username 为当时的盟主,value 为势力,并带 allianceId / allianceName / memberCount)。缺省 seasonId 为最近一个已结束赛季;kind 缺省 power;page 从 1 起,每页 20 条。个人榜结果进 entries,模型榜结果进 modelEntries(entries 为空)。total 为该榜总条数。seasons 列出全部已结束赛季(新 → 旧)供选择。指定的 seasonId 不存在返回 INVALID_PARAMS;没有任何已结束赛季时 seasonId 为 null、结果为空。kind 允许值:power / territory / plunder / arena / starTower / model / alliance / exploration。",
13699
13735
  "requestFields": [
13700
13736
  {
13701
13737
  "name": "seasonId",
@@ -13705,7 +13741,7 @@
13705
13741
  {
13706
13742
  "name": "kind",
13707
13743
  "type": "string",
13708
- "desc": "榜种,缺省 power。允许值:power / territory / plunder / arena / starTower / model / alliance。"
13744
+ "desc": "榜种,缺省 power。允许值:power / territory / plunder / arena / starTower / model / alliance / exploration。"
13709
13745
  },
13710
13746
  {
13711
13747
  "name": "page",
@@ -20327,6 +20363,332 @@
20327
20363
  ],
20328
20364
  "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
20365
  },
20366
+ {
20367
+ "op": 151,
20368
+ "kind": "request",
20369
+ "name": "RANSOM_HERO",
20370
+ "title": "赎回被俘名将(v94,AISLG-228)",
20371
+ "preAuth": false,
20372
+ "summary": "只有名将的主人能赎回处于囚禁中的名将(GET_HEROES 的 heroes[].captive 非 null)。赎金 = 2000 × 名将等级,从主人主城扣全额;金币不足返回 INSUFFICIENT_RESOURCES(附 city)且不改任何数据。成功后胜方主城收 50%(向下取整),另一半销毁;名将立刻回归,忠诚度 −20(最低 1)。囚禁已到期(captive.capturedUntil 已过)时返回 HERO_NOT_CAPTURED,名将即将或已经下野。\n\n被俘(只在玩家打玩家时判定;打 NPC / 黄巾 / 竞技场 / 将星塔 / 战场都不判定):进攻玩家城或野地失败 → 随队名将;守城失败 → 该城城守名将。被俘概率 = 5% + (100 − 忠诚度) × 0.25%(忠诚度 100 为 5%,0 为 30%)。每个账号 7 天内最多被俘 1 名,不管赎没赎回。被俘后囚禁 24 小时:不能出征 / 侦察 / 任城守 / 历练 / 赏赐 / 解雇 / 加点 / 洗点 / 施计(HERO_CAPTURED),不扣俸禄、忠诚度不变,城守职位撤掉。主人 24 小时内可 RANSOM_HERO 赎回;赎金 = 2000 × 名将等级(从主城扣全额),胜方主城收 50%(向下取整),另一半销毁。赎回后名将立刻回归,忠诚度 −20(最低 1)。超时未赎回则名将下野,胜方获得这名将的结交资格(已有资格不重复发)。被俘与赎回分别写 hero_captured / hero_ransomed 事件(主人与胜方各一条),被俘另有全服播报。\n\n名将忠诚度(只有 29 位在野名将有,范围 0..100,招揽时为 100;普通将、名城与黄巾名将的 loyalty 为 null,不受影响):每 24 小时(基准,随时间缩放)自然下降 10,从招揽时刻起各自结算;赏赐(GIFT_HERO)每次 +10(上限 100);欠饷期间每小时(基准)额外 −1。忠诚度降到 30 及以下发一次 hero_loyalty_low 事件,回到 30 以上后下次再提醒。忠诚度为 0 时名将下野(行军 / 历练中则等回城或历练结束后再下野)。下野 = 解雇的同一删除路径:武将消失、全服归属清除、城守撤掉、该名将的结交进度全部清空(好感从头算),原野地不变,所有玩家可按现有规则重新结交与招揽;已获得的结交资格保留。全服播报 hero_left(不带坐标)。",
20373
+ "requestFields": [
20374
+ {
20375
+ "name": "heroId",
20376
+ "type": "string",
20377
+ "desc": "必填。被俘名将的 id(GET_HEROES 的 heroes[].id)。"
20378
+ }
20379
+ ],
20380
+ "dataFields": [
20381
+ {
20382
+ "name": "hero",
20383
+ "type": "object",
20384
+ "desc": "赎回后的武将视图(captive 为 null,loyalty 已减 20 最低 1)。"
20385
+ },
20386
+ {
20387
+ "name": "ransom",
20388
+ "type": "object",
20389
+ "desc": "{ cost 支付的赎金, taxShare 胜方主城收到的部分, destroyed 销毁的部分 }。"
20390
+ }
20391
+ ],
20392
+ "errors": [
20393
+ "INVALID_PARAMS",
20394
+ "HERO_NOT_FOUND",
20395
+ "HERO_NOT_CAPTURED",
20396
+ "INSUFFICIENT_RESOURCES"
20397
+ ],
20398
+ "examples": [
20399
+ {
20400
+ "caption": "赎回一名被俘的名将(赎金 40000,主城金币足够)",
20401
+ "request": {
20402
+ "op": 151,
20403
+ "seq": 91,
20404
+ "data": {
20405
+ "heroId": "5c1e7a2b-9d3f-4b6a-8e10-2f7c9a4d6b35"
20406
+ }
20407
+ },
20408
+ "responses": [
20409
+ {
20410
+ "op": 151,
20411
+ "seq": 91,
20412
+ "ok": true,
20413
+ "data": {
20414
+ "hero": {
20415
+ "id": "5c1e7a2b-9d3f-4b6a-8e10-2f7c9a4d6b35",
20416
+ "name": "关羽",
20417
+ "famous": true,
20418
+ "level": 20,
20419
+ "loyalty": 80,
20420
+ "captive": null
20421
+ },
20422
+ "ransom": {
20423
+ "cost": 40000,
20424
+ "taxShare": 20000,
20425
+ "destroyed": 20000
20426
+ }
20427
+ }
20428
+ }
20429
+ ]
20430
+ }
20431
+ ],
20432
+ "agentNote": "被俘的名将 captive.capturedUntil 前必须赎,否则下野;赎金 = 2000 × 等级,提前在主城留足金币。下野后名将回到原野地,可以按结交 → 好感满 100 → 招揽的流程重新争取(前主人没有特权)。"
20433
+ },
20434
+ {
20435
+ "op": 152,
20436
+ "kind": "request",
20437
+ "name": "GET_VISIBLE_MARCHES",
20438
+ "title": "查询视野内的他人部队(v96,AISLG-230)",
20439
+ "preAuth": false,
20440
+ "summary": "查询窗口内、你的**实时视野**里的其他玩家部队(战争迷雾第三步,受 fog_enabled 控制)。请求给窗口左上角 (x, y) 与宽高 (w, h),含义与限制同 GET_WORLD_MAP:缺省以主城为中心取 10×10,w/h 须为 1..20 的整数,非法或越界取缺省值,窗口起点按世界边界钳制。返回 marches[]:每支其他账号、status = marching 的部队,若其当前位置(四舍五入到整格)落在**你自己的**实时视野内就出现,走出视野后下一次查询就消失。实时视野只有自己的来源:主城 12 格、分城 8 格、占领的野地 3 格(**丘陵上的野地 +2 = 5 格**,AISLG-233)、行军中的部队 3 格、含斥候的部队 5 / 6 / 7 格(侦察科技决定);**盟友的视野不共享**,盟友的部队也要进你自己的视野才看得到。下列情形不上图:自己的部队(本协议不返回,避免重复显示)、侦察部队(purpose = scout,或编队里只有斥候,去程返程都算,保留侦察的隐蔽性)、已过埋伏时刻(ambushAt)正在埋伏的截击部队(保留埋伏玩法)、已到达的部队与剧本战场的小队(战场有自己的地图)。流寇 / 商队 / 黄巾营地不受影响(见 GET_MOVING_TARGETS / GET_YELLOW_TURBAN)。盲打(fog_denied)与撤回中的部队正常上图,撤回的按实际回程位置算。返回最多 50 支,离窗口中心由近到远,超出部分不返回。fog_enabled 关闭时 marches 为空数组(不报错,与上线前一致)。玩家与 Agent 走同一接口、同一套裁剪。",
20441
+ "requestFields": [
20442
+ {
20443
+ "name": "x",
20444
+ "type": "number",
20445
+ "desc": "可选。窗口左上角 x,0..999;缺省按主城居中折算,超出部分按边界钳制。"
20446
+ },
20447
+ {
20448
+ "name": "y",
20449
+ "type": "number",
20450
+ "desc": "可选。窗口左上角 y,0..999;缺省按主城居中折算,超出部分按边界钳制。"
20451
+ },
20452
+ {
20453
+ "name": "w",
20454
+ "type": "number",
20455
+ "desc": "可选。窗口宽度,1..20 的整数;缺省、非法或越界取 10。"
20456
+ },
20457
+ {
20458
+ "name": "h",
20459
+ "type": "number",
20460
+ "desc": "可选。窗口高度,1..20 的整数;缺省、非法或越界取 10。"
20461
+ }
20462
+ ],
20463
+ "dataFields": [
20464
+ {
20465
+ "name": "serverTime",
20466
+ "type": "string",
20467
+ "desc": "快照时刻(ISO 8601):客户端以收到响应的本地时刻为基准用 vx / vy 外推,不必依赖两端时钟一致。"
20468
+ },
20469
+ {
20470
+ "name": "marches",
20471
+ "type": "array",
20472
+ "desc": "窗口内视野里的他人部队,离窗口中心由近到远,最多 50 支;迷雾关闭时为空数组。"
20473
+ },
20474
+ {
20475
+ "name": "marches[].id",
20476
+ "type": "string",
20477
+ "desc": "行军 id(UUID):用来和来袭预警 PUSH_ATTACK_WARNING 的 marchId 对上——敌军打进你的视野时界面据此把图标转红并连线到被攻击格。"
20478
+ },
20479
+ {
20480
+ "name": "marches[].x / marches[].y",
20481
+ "type": "number",
20482
+ "desc": "部队当前所在位置(世界格坐标,保留 1 位小数)。"
20483
+ },
20484
+ {
20485
+ "name": "marches[].vx / marches[].vy",
20486
+ "type": "number",
20487
+ "desc": "速度(每秒格数,正负表示方向),只用来让图标平滑移动;两次采样本来也能算出方向,因此不算泄露。"
20488
+ },
20489
+ {
20490
+ "name": "marches[].returning",
20491
+ "type": "boolean",
20492
+ "desc": "true = 返程(往出发城走),false = 去程。"
20493
+ },
20494
+ {
20495
+ "name": "marches[].scale",
20496
+ "type": "'small' | 'medium' | 'large'",
20497
+ "desc": "规模档位(按编队总人数,不给精确兵力):small 1–499 小股 / medium 500–4999 中军 / large 5000 及以上大军。"
20498
+ },
20499
+ {
20500
+ "name": "marches[].owner.username",
20501
+ "type": "string",
20502
+ "desc": "所属玩家名(中立玩家也给)。"
20503
+ },
20504
+ {
20505
+ "name": "marches[].owner.allianceName",
20506
+ "type": "string | null",
20507
+ "desc": "所属联盟名;没有联盟为 null。"
20508
+ },
20509
+ {
20510
+ "name": "marches[].owner.relation",
20511
+ "type": "'ally' | 'friendly' | 'hostile' | 'neutral'",
20512
+ "desc": "与你(请求账号)的关系,与地块 owner.relation 同一口径:ally 同盟 / friendly 友盟(含解除友好后的冷却期)/ hostile 敌对联盟 / neutral 中立。界面按它上色:同盟友盟绿色、中立灰色、敌对橙色、正在来袭自己红色(后者由 marchId 与来袭预警匹配得出)。"
20513
+ }
20514
+ ],
20515
+ "errors": [],
20516
+ "examples": [
20517
+ {
20518
+ "caption": "视野里有 1 支敌军(地图打开时每 5 秒一次)",
20519
+ "request": {
20520
+ "op": 152,
20521
+ "seq": 9,
20522
+ "data": {
20523
+ "x": 10,
20524
+ "y": 12,
20525
+ "w": 10,
20526
+ "h": 10
20527
+ }
20528
+ },
20529
+ "responses": [
20530
+ {
20531
+ "op": 152,
20532
+ "seq": 9,
20533
+ "ok": true,
20534
+ "data": {
20535
+ "serverTime": "2026-09-25T08:00:00.000Z",
20536
+ "marches": [
20537
+ {
20538
+ "id": "e5f2cc35-f086-47a1-9b3c-2d4e5f6a7b8c",
20539
+ "x": 14.3,
20540
+ "y": 17.6,
20541
+ "vx": 0.0667,
20542
+ "vy": 0,
20543
+ "returning": false,
20544
+ "scale": "medium",
20545
+ "owner": {
20546
+ "username": "zhangfei",
20547
+ "allianceName": "桃园",
20548
+ "relation": "hostile"
20549
+ }
20550
+ }
20551
+ ]
20552
+ }
20553
+ }
20554
+ ]
20555
+ },
20556
+ {
20557
+ "caption": "迷雾关闭(或视野里什么都没有)",
20558
+ "request": {
20559
+ "op": 152,
20560
+ "seq": 10,
20561
+ "data": {
20562
+ "x": 10,
20563
+ "y": 12,
20564
+ "w": 10,
20565
+ "h": 10
20566
+ }
20567
+ },
20568
+ "responses": [
20569
+ {
20570
+ "op": 152,
20571
+ "seq": 10,
20572
+ "ok": true,
20573
+ "data": {
20574
+ "serverTime": "2026-09-25T08:00:00.000Z",
20575
+ "marches": []
20576
+ }
20577
+ }
20578
+ ]
20579
+ }
20580
+ ],
20581
+ "agentNote": "这里只有**你的视野内**的他人部队,看不到不代表没有:目标可能就在迷雾里、或者离你的城池太远。别把「marches 为空」当成安全信号。判断有没有部队打自己仍然以来袭预警(PUSH_ATTACK_WARNING / 事件 player_attack_warning,含目标格与到达时刻)为准;本协议给的是位置、方向、去返程、规模档位与主人关系,**没有**目标格、出发城、出发 / 到达时间与兵力明细,所以用它算不出对手要去哪。盟友的视野不共享,盟友看到的部队你看不到。第一版只能看、不能截击(MARCH 的 targetId 截击只支持流寇 / 商队这类移动目标)。"
20582
+ },
20583
+ {
20584
+ "op": 153,
20585
+ "kind": "request",
20586
+ "name": "FACILITY_BUILD",
20587
+ "title": "在野地上建望楼 / 升级望楼(v97,AISLG-232)",
20588
+ "preAuth": false,
20589
+ "summary": "在自己**已占领的野地**上建望楼:没盖过就新建 1 级,盖过就升一级(最高 3 级)。望楼是野地上的了望塔,建好后这块地周围的视野扩大到对应半径——别人也看得到你的望楼(想断你的眼睛就得把这块地抢走)。规则:只能盖在 kind = 'wilderness' 且归你城池的格上(城池 / NPC 城 / 无主地 / 别人的野地返回 FACILITY_TILE_INVALID);每块地最多一座,每座城名下的野地最多 2 座(主城 2 座、每座分城各 2 座,新建时计名额,升级已有望楼不受影响);同一块地同一时间只能有一个进行中的建造 / 升级(FACILITY_BUILDING)。数值(占位,按需求一字不改):1 级:视野 6 格,金 300 / 木 200 / 石 100,基准 120 秒;2 级:视野 8 格,金 600 / 木 400 / 石 200,基准 240 秒;3 级:视野 10 格,金 900 / 木 600 / 石 300,基准 360 秒;满级累计金 1800 / 木 1200 / 石 600。**资源从占着这块地的那座城扣**;耗时为基准 ÷ 全局时间缩放、不低于 1 秒,但**不吃**「建筑」科技折扣。望楼**不占城池建造队列**,用自己的计时(响应里的 facility.building.finishAt),由后台 Worker 到期完成。视野半径是切比雪夫距离,**取代**野地原来的 3 格、不叠加;丘陵上的野地在此基础上 +2(AISLG-233:视野 8 / 10 / 12,上限 12),下发的 visionRadius 已是加成后的有效值;视野照常记入已探索;迷雾开关 fog_enabled 关闭时望楼仍可建,但不产生视野效果。失去野地(被抢、所属城易主 / 被放弃、召回驻军放弃占领、账号长期未上线被收回,v98 AISLG-238)望楼一并毁掉,不转给新主人、不退资源,原主人收到事件 facility_lost;储量采空不影响望楼。玩家与 Agent 走同一个接口。",
20590
+ "requestFields": [
20591
+ {
20592
+ "name": "x",
20593
+ "type": "number",
20594
+ "desc": "必填。目标地块 x(须为本账号城池占领的野地,见 GET_STATE 的 city.territory)。"
20595
+ },
20596
+ {
20597
+ "name": "y",
20598
+ "type": "number",
20599
+ "desc": "必填。目标地块 y。"
20600
+ }
20601
+ ],
20602
+ "dataFields": [
20603
+ {
20604
+ "name": "facility",
20605
+ "type": "object",
20606
+ "desc": "该地块的设施(与 GET_STATE 的 city.territory[].facility 同结构):{ kind: 'watchtower', level 已建成等级(正在新建第一级时为 0), visionRadius 已建成等级的视野半径(格;level 为 0 时 0;丘陵上的野地是加成后的有效半径 8 / 10 / 12,AISLG-233), building: { toLevel 进行中的目标等级, finishAt 完成时刻 ISO 8601 } | null }。"
20607
+ },
20608
+ {
20609
+ "name": "city",
20610
+ "type": "object",
20611
+ "desc": "扣费后的城池状态(结构同 GET_STATE 的 city;资源从占着这块地的那座城扣)。失败时只附 city 与缺口字段。"
20612
+ }
20613
+ ],
20614
+ "errors": [
20615
+ "INVALID_PARAMS",
20616
+ "FACILITY_TILE_INVALID",
20617
+ "FACILITY_BUILDING",
20618
+ "FACILITY_MAX_LEVEL",
20619
+ "FACILITY_LIMIT",
20620
+ "INSUFFICIENT_RESOURCES"
20621
+ ],
20622
+ "examples": [
20623
+ {
20624
+ "caption": "在自己的野地上新建 1 级望楼(扣 金 300 / 木 200 / 石 100,基准 120 秒后完成)",
20625
+ "request": {
20626
+ "op": 153,
20627
+ "seq": 41,
20628
+ "data": {
20629
+ "x": 512,
20630
+ "y": 340
20631
+ }
20632
+ },
20633
+ "responses": [
20634
+ {
20635
+ "op": 153,
20636
+ "seq": 41,
20637
+ "ok": true,
20638
+ "data": {
20639
+ "facility": {
20640
+ "kind": "watchtower",
20641
+ "level": 0,
20642
+ "visionRadius": 0,
20643
+ "building": {
20644
+ "toLevel": 1,
20645
+ "finishAt": "2026-09-25T08:02:00.000Z"
20646
+ }
20647
+ },
20648
+ "city": {
20649
+ "id": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
20650
+ "resources": {
20651
+ "gold": 4700,
20652
+ "wood": 4800,
20653
+ "food": 5000,
20654
+ "stone": 2900,
20655
+ "iron": 3000
20656
+ },
20657
+ "territory": []
20658
+ }
20659
+ }
20660
+ }
20661
+ ]
20662
+ },
20663
+ {
20664
+ "caption": "这座城名下的望楼已满 2 座",
20665
+ "request": {
20666
+ "op": 153,
20667
+ "seq": 42,
20668
+ "data": {
20669
+ "x": 513,
20670
+ "y": 340
20671
+ }
20672
+ },
20673
+ "responses": [
20674
+ {
20675
+ "op": 153,
20676
+ "seq": 42,
20677
+ "ok": false,
20678
+ "error": {
20679
+ "code": "FACILITY_LIMIT",
20680
+ "message": "这座城名下的望楼已达上限(每座城最多 2 座)"
20681
+ },
20682
+ "data": {
20683
+ "limit": 2,
20684
+ "count": 2
20685
+ }
20686
+ }
20687
+ ]
20688
+ }
20689
+ ],
20690
+ "agentNote": "望楼能扩大视野(1 级 6 格 / 2 级 8 格 / 3 级 10 格,取代野地原来的 3 格),是「提前看到别人部队」的手段;失去这块野地就失去望楼(不退款),抢别人的野地就能拆掉他的眼睛。先 GET_STATE 看 city.territory[].facility(null = 没盖)挑一块战略位置上的野地,再看这座城的资源够不够:不够会返回 INSUFFICIENT_RESOURCES(附缺口 shortfall 与 retryAfterSeconds),等够再发。建造中用 city.territory[].facility.building 的 finishAt 估算进度,到点后服务端完成(事件 facility_completed),期间再发同一块地会返回 FACILITY_BUILDING。"
20691
+ },
20330
20692
  {
20331
20693
  "op": 2000,
20332
20694
  "kind": "push",
@@ -20735,7 +21097,7 @@
20735
21097
  "kind": "push",
20736
21098
  "name": "PUSH_TILE_STATE",
20737
21099
  "title": "推送:地块归属 / 驻军变化(v12)",
20738
- "summary": "地块状态变化时推送给相关账号的在线连接:wilderness_occupied=野地被占领(含己方出征获胜)、wilderness_lost=占领失效(召回或 NPC 袭击失守)、reserve_depleted=名下野地储量采空(v61,AISLG-165;推送该地块最新视图,驻军仍在时改为按恢复速度采集)、npc_city_occupied=NPC 城池被占领为分城、npc_attack_repelled=NPC 袭击被击退(驻军折损)、garrison_reinforced=增援并入驻军。",
21100
+ "summary": "地块状态变化时推送给相关账号的在线连接:wilderness_occupied=野地被占领(含己方出征获胜)、wilderness_lost=占领失效(召回 / NPC 袭击失守 / 账号长期未上线被收回,v98 AISLG-238,cause=inactive;此时驻军已回到归属城、望楼已毁、地块变为无主)、reserve_depleted=名下野地储量采空(v61,AISLG-165;推送该地块最新视图,驻军仍在时改为按恢复速度采集)、npc_city_occupied=NPC 城池被占领为分城、npc_attack_repelled=NPC 袭击被击退(驻军折损)、garrison_reinforced=增援并入驻军、facility_completed=望楼建成 / 升级完成(v97,AISLG-232,tile.facility 为新等级)。望楼随野地一起毁掉时不单独推:那一格另有一条 wilderness_lost,tile.facility 随之变 null。",
20739
21101
  "dataFields": [
20740
21102
  {
20741
21103
  "name": "reason",
@@ -20772,7 +21134,7 @@
20772
21134
  }
20773
21135
  }
20774
21136
  ],
20775
- "agentNote": "NPC 会周期性袭击玩家占领的野地(袭击部队编成按野地等级推导,参考战力 = 等级 × 25,定稿编成;基准每 30 分钟随机袭击一块已占领野地,v19 校准;实际 ÷ 全局时间缩放):收到 wilderness_lost(cause=npc_attack)说明驻军全灭,用 GET_STATE 对齐领土与驻军;袭击结算同样生成守方视角战报。"
21137
+ "agentNote": "NPC 会周期性袭击玩家占领的野地(袭击部队编成按野地等级推导,参考战力 = 等级 × 25,定稿编成;基准每 30 分钟随机袭击一块已占领野地,v19 校准;实际 ÷ 全局时间缩放):收到 wilderness_lost(cause=npc_attack)说明驻军全灭,用 GET_STATE 对齐领土与驻军;袭击结算同样生成守方视角战报。本人和 Agent 都 7 天没上线(现实时间)的账号,系统每小时扫一轮把名下野地一次全部收回——收到 wilderness_lost(cause=inactive)说明地块已变无主,驻军已不损失地回到归属城、望楼已毁(不退款)、当前储量不重置,其他玩家可立即占领;城与城内资源兵力不受影响。"
20776
21138
  },
20777
21139
  {
20778
21140
  "op": 2007,
@@ -21445,7 +21807,7 @@
21445
21807
  {
21446
21808
  "name": "reason",
21447
21809
  "type": "string",
21448
- "desc": "recruited / dismissed / guard_changed / arrears / salary_paid / wounded / exp_gained / granted / training_started / training_done(历练结束、经验已到账)/ training_cancelled(历练被取消、武将回城,不给经验,v71)/ points_changed(加点或洗点)/ gifted(赏赐)/ friendship_changed(结交进度)。"
21810
+ "desc": "recruited / dismissed / guard_changed / arrears / salary_paid / wounded / exp_gained / granted / training_started / training_done(历练结束、经验已到账)/ training_cancelled(历练被取消、武将回城,不给经验,v71)/ points_changed(加点或洗点)/ gifted(赏赐)/ friendship_changed(结交进度)/ loyalty_changed(v94,忠诚度自然下降或欠饷扣减,重拉 GET_HEROES 看数值)/ captured(v94,名将被俘)/ ransomed(v94,名将被赎回)/ left(v94,名将下野:忠诚度为 0 或囚禁超时)。"
21449
21811
  },
21450
21812
  {
21451
21813
  "name": "heroId",
@@ -22155,12 +22517,12 @@
22155
22517
  "kind": "push",
22156
22518
  "name": "PUSH_EXPLORATION_REPORT",
22157
22519
  "title": "推送:探索简报(v92,AISLG-224)",
22158
- "summary": "部队去程结束(到达或撤回)后,如果这一趟新探索了区块,推给本账号一份简报:新探索的区块数、新区块里的东西按类计数(NPC 城分等级、金矿、Lv5 及以上野地、在野名将、其他玩家的城、名城),以及最多 10 个坐标(优先级:名城 > 在野名将 > 金矿 > 玩家城 > NPC 城 > 高级野地)。内容与事件 exploration_report 的 detail 一致,可随时用 GET_EVENTS 回看。存量初始化、开局与城池 / 领地带来的新区块不生成简报;返程不生成。",
22520
+ "summary": "部队去程结束(到达或撤回)后,如果这一趟新探索了区块,推给本账号一份简报:新探索的区块数、新区块里的东西按类计数(NPC 城分等级、金矿、Lv5 及以上野地、在野名将、其他玩家的城、名城,v93 起还有未领取的遗迹 relics.byKind),以及最多 10 个坐标(优先级:名城 > 遗迹 > 在野名将 > 金矿 > 玩家城 > NPC 城 > 高级野地)。内容与事件 exploration_report 的 detail 一致,可随时用 GET_EVENTS 回看。存量初始化、开局与城池 / 领地带来的新区块不生成简报;返程不生成。",
22159
22521
  "dataFields": [
22160
22522
  {
22161
22523
  "name": "report",
22162
22524
  "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。"
22525
+ "desc": "{ eventId, marchId, chunks, npcCities: { total, byLevel }, goldMines, highWilderness, wildHeroes, playerCities, famous, relics: { total, byKind }, cells: [{ x, y, kind, level? }] }。kind = famous / relic / wild_hero / gold_mine / player_city / npc_city / high_wilderness。"
22164
22526
  }
22165
22527
  ],
22166
22528
  "examples": [
@@ -22444,6 +22806,14 @@
22444
22806
  "desc": "(v36,AISLG-114)武将欠饷中(主城金币不足以支付俸禄),不能出征。",
22445
22807
  "action": "给主城补足金币,俸禄结算成功后自动恢复(收到 reason=salary_paid 推送)。"
22446
22808
  },
22809
+ "HERO_CAPTURED": {
22810
+ "desc": "(v94,AISLG-228)武将被俘囚禁中(24 小时基准),不能出征 / 侦察 / 任城守 / 历练 / 赏赐 / 解雇 / 加点 / 洗点 / 施计。",
22811
+ "action": "主人用 RANSOM_HERO 在囚禁截止前赎回;超时则名将下野,不必再操作。"
22812
+ },
22813
+ "HERO_NOT_CAPTURED": {
22814
+ "desc": "(v94,AISLG-228)武将未被俘,或囚禁已到期(即将下野),不能赎回。",
22815
+ "action": "用 GET_HEROES 查看 heroes[].captive;为 null 即无需赎回。"
22816
+ },
22447
22817
  "HERO_TRAINING": {
22448
22818
  "desc": "(v54,AISLG-144)武将正在历练中,不能出征 / 任城守 / 解雇 / 加点 / 洗点 / 再次历练(赏赐不受限)。",
22449
22819
  "action": "等历练结束(train_until 过去,经验到账并收到 reason=training_done 推送)后再操作。"
@@ -22897,7 +23267,7 @@
22897
23267
  "action": "改用指定坐标迁城(高级迁城令)选一块空野地,或等世界有空地后再试。"
22898
23268
  },
22899
23269
  "TILE_UNEXPLORED": {
22900
- "desc": "该地块在战争迷雾中未探索,且不在任何视野来源(城池 / 领地 / 行军 / 盟友城池格)覆盖内,服务端不返回它的任何信息(v92,AISLG-224)。仅在 fog_enabled 开启时出现。",
23270
+ "desc": "该地块在战争迷雾中未探索,且不在任何视野来源(城池 / 领地 / 行军 / 同盟或友盟的城池格)覆盖内,服务端不返回它的任何信息(v92,AISLG-224)。仅在 fog_enabled 开启时出现。",
22901
23271
  "action": "先派斥候或部队去这个方向探索(派去未探索坐标的出征本身允许,盲打时前端应提示“目标在迷雾中”)。也可以改查已探索的格子。"
22902
23272
  },
22903
23273
  "MOVE_CITY_TILE_UNEXPLORED": {
@@ -22908,6 +23278,22 @@
22908
23278
  "desc": "(v91,AISLG-220)指定坐标迁城后 12 小时内,这座城的掠夺 / 占领 / 侦察 / 派协防(以及其他攻击类出征)被拒;响应附 retryAfterSeconds。运输、调兵、增援自己名下野地与召回不受限。",
22909
23279
  "action": "等待 retryAfterSeconds 之后再出征打别人;期间可以正常运输、调兵与增援。"
22910
23280
  },
23281
+ "FACILITY_TILE_INVALID": {
23282
+ "desc": "(v97,AISLG-232)目标格不是本账号占领的野地:城池格、NPC 城池、无主野地、别人占领的野地都算。不扣任何资源。",
23283
+ "action": "用 GET_STATE 的 city.territory 核对本账号占领的野地坐标,只对列表中的地块发起 FACILITY_BUILD。"
23284
+ },
23285
+ "FACILITY_MAX_LEVEL": {
23286
+ "desc": "(v97,AISLG-232)这块地的望楼已经满级(3 级),不能再升级。不扣任何资源。",
23287
+ "action": "换一块自己占领的野地建望楼;每座城最多 2 座。"
23288
+ },
23289
+ "FACILITY_BUILDING": {
23290
+ "desc": "(v97,AISLG-232)这块地的望楼正在建造或升级中,同一块地同一时间只能有一个进行中的工程。不扣任何资源。",
23291
+ "action": "等 city.territory[].facility.building.finishAt 到点(Worker 到期完成)后再发起下一次升级。"
23292
+ },
23293
+ "FACILITY_LIMIT": {
23294
+ "desc": "(v97,AISLG-232)这座城名下的望楼已达上限:每座城最多 2 座(主城 2 座,每座分城各 2 座)。响应附 limit 与 count。不扣任何资源。",
23295
+ "action": "换另一座城名下的野地建望楼,或先把这块地的望楼升到更高级(升级不受名额限制)。"
23296
+ },
22911
23297
  "INTERNAL": {
22912
23298
  "desc": "服务端内部错误。",
22913
23299
  "action": "可稍后重试同一请求;持续出现时向运营方反馈。INTERNAL 可能出现在任何请求的响应中。"