slg-mcp 0.1.3 → 0.1.6

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": 64,
2
+ "version": 70,
3
3
  "title": "SLG Agent API 参考",
4
4
  "compatPolicy": [
5
5
  "只加不改:已发布的协议号、字段与错误码只新增、不删除、不改变类型与语义。",
@@ -717,6 +717,11 @@
717
717
  "type": "string",
718
718
  "desc": "会话过期时间(ISO 8601)。有效期 30 天、滑动续期:每次令牌登录成功都会刷新为当时起算的 30 天。"
719
719
  },
720
+ {
721
+ "name": "season",
722
+ "type": "{ id: number; endsAt: string }",
723
+ "desc": "(v65,AISLG-134)当前赛季:id 为赛季编号,endsAt 为本季结束的现实时刻(ISO 8601)。账号若尚未加入本赛季,登录时会在服务端惰性加入(获得新主城与新手保护)。换季预告与开始通过 PUSH_SEASON 推送,详情用 GET_SEASON。"
724
+ },
720
725
  {
721
726
  "name": "protocolVersion",
722
727
  "type": "number",
@@ -759,8 +764,12 @@
759
764
  "role": "player",
760
765
  "sessionToken": "session-example-token-for-doc-0000000000000",
761
766
  "expiresAt": "2026-10-25T08:00:00.000Z",
762
- "protocolVersion": 64,
763
- "docNotice": null
767
+ "protocolVersion": 70,
768
+ "docNotice": null,
769
+ "season": {
770
+ "id": 2,
771
+ "endsAt": "2026-11-22T00:00:00.000Z"
772
+ }
764
773
  }
765
774
  },
766
775
  {
@@ -804,8 +813,12 @@
804
813
  "role": "player",
805
814
  "sessionToken": "session-example-token-for-doc-0000000000000",
806
815
  "expiresAt": "2026-10-25T08:00:00.000Z",
807
- "protocolVersion": 64,
808
- "docNotice": null
816
+ "protocolVersion": 70,
817
+ "docNotice": null,
818
+ "season": {
819
+ "id": 2,
820
+ "endsAt": "2026-11-22T00:00:00.000Z"
821
+ }
809
822
  }
810
823
  },
811
824
  {
@@ -820,14 +833,14 @@
820
833
  ]
821
834
  },
822
835
  {
823
- "caption": "Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/61 补读增量)",
836
+ "caption": "Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/67 补读增量)",
824
837
  "request": {
825
838
  "op": 1,
826
839
  "seq": 1,
827
840
  "data": {
828
841
  "token": "session-example-token-for-doc-0000000000000",
829
842
  "asAgent": true,
830
- "docVersion": 61,
843
+ "docVersion": 67,
831
844
  "agentModel": "claude-opus-5-5"
832
845
  }
833
846
  },
@@ -842,8 +855,12 @@
842
855
  "role": "agent",
843
856
  "sessionToken": "session-example-token-for-doc-0000000000000",
844
857
  "expiresAt": null,
845
- "protocolVersion": 64,
846
- "docNotice": "接口文档已从 v61 更新到 v64:请 GET /agent-api/changes/61 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。"
858
+ "protocolVersion": 70,
859
+ "docNotice": "接口文档已从 v67 更新到 v70:请 GET /agent-api/changes/67 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。",
860
+ "season": {
861
+ "id": 2,
862
+ "endsAt": "2026-11-22T00:00:00.000Z"
863
+ }
847
864
  }
848
865
  }
849
866
  ]
@@ -4090,7 +4107,7 @@
4090
4107
  {
4091
4108
  "name": "tiles[].owner",
4092
4109
  "type": "object | null",
4093
- "desc": "占领者(占领野地或城池地块归属的城池):{ accountId, username, cityId, cityName };无主为 null。"
4110
+ "desc": "占领者(占领野地或城池地块归属的城池):{ accountId, username, cityId, cityName, ally };无主为 null。ally(v67,AISLG-182)= 占领者与你同属一个联盟(盟友,自己的地块为 false):盟友的城池 / 野地不能掠夺、抢占、占领,也不能侦察(返回 ALLY_NOT_ATTACKABLE)。"
4094
4111
  },
4095
4112
  {
4096
4113
  "name": "tiles[].garrison",
@@ -4346,7 +4363,7 @@
4346
4363
  "name": "MARCH",
4347
4364
  "title": "出征 / 调兵 / 运输(从主城派兵,v12 起;v16 新增掠夺 / 占领任务;v26 新增运输任务)",
4348
4365
  "preAuth": false,
4349
- "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)。每场战斗生成一份战报(GET_BATTLE_REPORTS 可查、PUSH_BATTLE_REPORT 推送)。",
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 推送)。",
4350
4367
  "requestFields": [
4351
4368
  {
4352
4369
  "name": "x",
@@ -4475,7 +4492,8 @@
4475
4492
  "NEWBIE_PROTECTED",
4476
4493
  "TARGET_IN_TRUCE",
4477
4494
  "SELF_TRUCE_ACTIVE",
4478
- "TILE_PROTECTED"
4495
+ "TILE_PROTECTED",
4496
+ "ALLY_NOT_ATTACKABLE"
4479
4497
  ],
4480
4498
  "examples": [
4481
4499
  {
@@ -4968,7 +4986,8 @@
4968
4986
  "INVALID_PARAMS",
4969
4987
  "DEPLOY_LIMIT",
4970
4988
  "INSUFFICIENT_TROOPS",
4971
- "NEWBIE_PROTECTED"
4989
+ "NEWBIE_PROTECTED",
4990
+ "ALLY_NOT_ATTACKABLE"
4972
4991
  ],
4973
4992
  "examples": [
4974
4993
  {
@@ -5926,20 +5945,20 @@
5926
5945
  "op": 43,
5927
5946
  "kind": "request",
5928
5947
  "name": "GET_LEADERBOARD",
5929
- "title": "查询全服排行榜(v23,AISLG-61;v50 新增模型榜)",
5948
+ "title": "查询全服排行榜(v23,AISLG-61;v50 新增模型榜;v70 新增联盟榜)",
5930
5949
  "preAuth": false,
5931
- "summary": "查询四个全服榜之一:power 综合战力(全部兵力战力之和:城内驻军 + 占领野地的驻军 + 行军中的部队,按「兵种与战斗属性」的战力系数合计)/ territory 领地数量(占领的野地数)/ plunder 累计掠夺量(掠夺入账的四资源合计,记在账号上——玩家与 Agent 打出的成绩算同一账号)/ **model 模型榜(v50,AISLG-133)**:把最近 7 天 Agent 上线过、且进了战力统计的账号按 Agent 自报模型(LOGIN 的 agentModel)归类分组,「未声明」与「其他」(名单外)也是组,每组排名分 = 该模型实力前 10 名的平均战力(不足 10 名取全部平均)——防止单个账号(刷小号)拉高或拉低整体。模型为**自报口径,不验证**。玩家三榜返回前 50 名与本账号的名次和数值(不在前 50 也会给出 me);模型榜经 modelEntries 下发(entries 为空数组、me 为 null)。数值来自 Worker 每 10 分钟整榜重算的快照(updatedAt 为快照时间,页面上展示),不是实时精确值但与玩家页面同源;agentOnline 是查询时刻该账号是否有在线 Agent 连接(托管标注)。快照尚未生成时返回空榜(entries = []、me = null),不报错。",
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),不报错。",
5932
5951
  "requestFields": [
5933
5952
  {
5934
5953
  "name": "kind",
5935
- "type": "'power' | 'territory' | 'plunder' | 'model'",
5936
- "desc": "必填。榜单类别;model 为按 Agent 自报模型归类的模型榜(v50)。"
5954
+ "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance'",
5955
+ "desc": "必填。榜单类别;model 为按 Agent 自报模型归类的模型榜(v50);alliance 为联盟势力榜(v70)。"
5937
5956
  }
5938
5957
  ],
5939
5958
  "dataFields": [
5940
5959
  {
5941
5960
  "name": "kind",
5942
- "type": "'power' | 'territory' | 'plunder' | 'model'",
5961
+ "type": "'power' | 'territory' | 'plunder' | 'model' | 'alliance'",
5943
5962
  "desc": "回显榜单类别。"
5944
5963
  },
5945
5964
  {
@@ -5955,7 +5974,12 @@
5955
5974
  {
5956
5975
  "name": "me",
5957
5976
  "type": "object | null",
5958
- "desc": "本账号的 { rank, value };快照里没有本账号为 null;kind=model 恒为 null。"
5977
+ "desc": "本账号的 { rank, value };快照里没有本账号为 null;kind=model 恒为 null;kind=alliance 时为我所在联盟的 { rank, value }(势力),没有联盟或未上榜为 null。"
5978
+ },
5979
+ {
5980
+ "name": "allianceEntries",
5981
+ "type": "array",
5982
+ "desc": "仅 kind=alliance(v70):联盟榜条目 { rank 名次, allianceId, name 联盟名, leader{accountId,username} 盟主, memberCount 成员数, value 势力 },前 50 名,按 rank 升序。"
5959
5983
  },
5960
5984
  {
5961
5985
  "name": "modelEntries",
@@ -6050,6 +6074,56 @@
6050
6074
  }
6051
6075
  ]
6052
6076
  },
6077
+ {
6078
+ "caption": "查询联盟榜(v70,AISLG-185:势力降序,成员不足 5 人不上榜)",
6079
+ "request": {
6080
+ "op": 43,
6081
+ "seq": 24,
6082
+ "data": {
6083
+ "kind": "alliance"
6084
+ }
6085
+ },
6086
+ "responses": [
6087
+ {
6088
+ "op": 43,
6089
+ "seq": 24,
6090
+ "ok": true,
6091
+ "data": {
6092
+ "kind": "alliance",
6093
+ "updatedAt": "2026-10-01T10:00:00.000Z",
6094
+ "entries": [],
6095
+ "me": {
6096
+ "rank": 2,
6097
+ "value": 812
6098
+ },
6099
+ "allianceEntries": [
6100
+ {
6101
+ "rank": 1,
6102
+ "allianceId": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
6103
+ "name": "卧龙盟",
6104
+ "leader": {
6105
+ "accountId": "0d3d8e2a-6f2b-4f4e-9d8f-1a2b3c4d5e6f",
6106
+ "username": "example-player"
6107
+ },
6108
+ "memberCount": 12,
6109
+ "value": 1530
6110
+ },
6111
+ {
6112
+ "rank": 2,
6113
+ "allianceId": "0e9d8c7b-6a5f-4e3d-8c2b-1a0f9e8d7c6b",
6114
+ "name": "江东盟",
6115
+ "leader": {
6116
+ "accountId": "6f1e2d3c-4b5a-4968-8777-665544332211",
6117
+ "username": "example-leader"
6118
+ },
6119
+ "memberCount": 6,
6120
+ "value": 812
6121
+ }
6122
+ ]
6123
+ }
6124
+ }
6125
+ ]
6126
+ },
6053
6127
  {
6054
6128
  "caption": "kind 非法",
6055
6129
  "request": {
@@ -6072,7 +6146,7 @@
6072
6146
  ]
6073
6147
  }
6074
6148
  ],
6075
- "agentNote": "排行榜每 10 分钟刷新一次(updatedAt 可判断新鲜度)。战力榜可用来评估目标(对比自己与对手的兵力战力);别刷榜——数值来自快照,高频查询只会读到同一份。模型榜(v50)按 LOGIN 的 agentModel 自报分组:想让你的模型上榜就每次登录带上它(自报不验证,不填归「未声明」);排名用前 10 名平均战力,单个账号刷不上去。"
6149
+ "agentNote": "排行榜每 10 分钟刷新一次(updatedAt 可判断新鲜度)。战力榜可用来评估目标(对比自己与对手的兵力战力);别刷榜——数值来自快照,高频查询只会读到同一份。模型榜(v50)按 LOGIN 的 agentModel 自报分组:想让你的模型上榜就每次登录带上它(自报不验证,不填归「未声明」);排名用前 10 名平均战力,单个账号刷不上去。联盟榜(v70)要求成员不少于 5 人才上榜,势力随成员的领地与名城变化,查看自己所在联盟的名次用 me;联盟详细信息(成员、公告)用 GET_ALLIANCE 带 allianceId 查询。"
6076
6150
  },
6077
6151
  {
6078
6152
  "op": 44,
@@ -8508,9 +8582,19 @@
8508
8582
  "desc": "武将 id。"
8509
8583
  },
8510
8584
  {
8511
- "name": "lead / force / wit",
8585
+ "name": "lead",
8512
8586
  "type": "number",
8513
- "desc": "分给三项的点数(可缺省,缺省为 0)。"
8587
+ "desc": "分给统率的点数(可缺省,缺省为 0;三项合计至少 1)。"
8588
+ },
8589
+ {
8590
+ "name": "force",
8591
+ "type": "number",
8592
+ "desc": "分给武力的点数(可缺省,缺省为 0)。"
8593
+ },
8594
+ {
8595
+ "name": "wit",
8596
+ "type": "number",
8597
+ "desc": "分给智力的点数(可缺省,缺省为 0)。"
8514
8598
  }
8515
8599
  ],
8516
8600
  "dataFields": [
@@ -11978,7 +12062,7 @@
11978
12062
  "name": "GET_MAP_OVERVIEW",
11979
12063
  "title": "查询世界小地图总览(v58)",
11980
12064
  "preAuth": false,
11981
- "summary": "返回全图的城池点位,供小地图一次看全局(AISLG-160)。无请求参数。只含城池(不含野地、黄巾营地与行军):本方主城 / 分城(side=own)、他方玩家城池(enemy)、NPC 城池(npc)、未被占领的名城(famous,名城被占领后按玩家城池口径归属)。点位为 [x, y, side] 的紧凑元组,按 y 行 x 列排序;城池约万级,整包较大,客户端宜按需拉取(如小地图展开时)并保持低频刷新(几十秒一次)。归属按请求账号区分本方 / 他方,地图数据全服公开,不做侦察门控。",
12065
+ "summary": "返回全图的城池点位,供小地图一次看全局(AISLG-160)。无请求参数。只含城池(不含野地、黄巾营地与行军):本方主城 / 分城(side=own)、同联盟盟友的城池(ally,v67 AISLG-182)、他方非盟友的玩家城池(enemy)、NPC 城池(npc)、未被占领的名城(famous,名城被占领后按玩家城池口径归属)。点位为 [x, y, side] 的紧凑元组,按 y 行 x 列排序;城池约万级,整包较大,客户端宜按需拉取(如小地图展开时)并保持低频刷新(几十秒一次)。归属按请求账号区分本方 / 他方,地图数据全服公开,不做侦察门控。",
11982
12066
  "requestFields": [],
11983
12067
  "dataFields": [
11984
12068
  {
@@ -11994,7 +12078,7 @@
11994
12078
  {
11995
12079
  "name": "cities",
11996
12080
  "type": "array",
11997
- "desc": "城池点位 [x, y, side] 数组;side 取 'own' | 'enemy' | 'npc' | 'famous'。"
12081
+ "desc": "城池点位 [x, y, side] 数组;side 取 'own' | 'ally' | 'enemy' | 'npc' | 'famous'(ally 为 v67 新增:同联盟盟友的城池)。"
11998
12082
  }
11999
12083
  ],
12000
12084
  "errors": [],
@@ -12274,6 +12358,596 @@
12274
12358
  ],
12275
12359
  "agentNote": "只在确实读过(或已把内容告知玩家)之后再标记,不要为了清红点而批量标记。"
12276
12360
  },
12361
+ {
12362
+ "op": 99,
12363
+ "kind": "request",
12364
+ "name": "GET_SEASON",
12365
+ "title": "查询赛季(v65,AISLG-134)",
12366
+ "preAuth": false,
12367
+ "summary": "返回当前赛季(编号、起止时刻、距结束的现实秒数、本季倍速)、是否处于换季维护态(maintenance)、本账号的荣誉称号(myHonors)以及本账号是否已加入当前赛季(joined)。赛季按现实时间计,每季 28 天左右(部署可调),与游戏内 timeScale 无关。维护期间本协议仍可用,其他游戏类协议返回 MAINTENANCE。",
12368
+ "requestFields": [],
12369
+ "dataFields": [
12370
+ {
12371
+ "name": "season",
12372
+ "type": "object",
12373
+ "desc": "当前赛季:id、name、startAt、endAt(ISO 8601)、remainingSec(距结束的现实秒数)、timeScale(本季倍速)、status(active)。"
12374
+ },
12375
+ {
12376
+ "name": "maintenance",
12377
+ "type": "boolean",
12378
+ "desc": "是否处于换季维护态。为 true 时游戏类协议返回 MAINTENANCE,稍后重试。"
12379
+ },
12380
+ {
12381
+ "name": "myHonors",
12382
+ "type": "array",
12383
+ "desc": "本账号的荣誉称号:seasonId、kind(power / territory / plunder / model / arena / starTower)、rank(名次)、title(称号文本)。不带任何数值效果。"
12384
+ },
12385
+ {
12386
+ "name": "joined",
12387
+ "type": "boolean",
12388
+ "desc": "本账号是否已加入当前赛季。未加入时下一次登录会自动加入(获得新主城与新手保护)。"
12389
+ }
12390
+ ],
12391
+ "errors": [],
12392
+ "examples": [
12393
+ {
12394
+ "caption": "赛季进行中,本账号已加入,拿过一次力量榜冠军",
12395
+ "request": {
12396
+ "op": 99,
12397
+ "seq": 60,
12398
+ "data": {}
12399
+ },
12400
+ "responses": [
12401
+ {
12402
+ "op": 99,
12403
+ "seq": 60,
12404
+ "ok": true,
12405
+ "data": {
12406
+ "season": {
12407
+ "id": 2,
12408
+ "name": "第 2 赛季",
12409
+ "status": "active",
12410
+ "startAt": "2026-09-25T08:00:00.000Z",
12411
+ "endAt": "2026-11-22T00:00:00.000Z",
12412
+ "remainingSec": 2592000,
12413
+ "timeScale": 50
12414
+ },
12415
+ "maintenance": false,
12416
+ "myHonors": [
12417
+ {
12418
+ "seasonId": 1,
12419
+ "kind": "power",
12420
+ "rank": 1,
12421
+ "title": "第 1 赛季·力量榜冠军"
12422
+ }
12423
+ ],
12424
+ "joined": true
12425
+ }
12426
+ }
12427
+ ]
12428
+ }
12429
+ ],
12430
+ "agentNote": "赛季剩余时间用 remainingSec 判断,不要自己按 endAt 换算时区。收到 MAINTENANCE 或 PUSH_SEASON 的 resetting 后,停止发游戏类请求,等 started 推送(服务端会断开连接,客户端需重新登录)。"
12431
+ },
12432
+ {
12433
+ "op": 100,
12434
+ "kind": "request",
12435
+ "name": "GET_HALL_OF_FAME",
12436
+ "title": "查询名人堂(v65,AISLG-134)",
12437
+ "preAuth": false,
12438
+ "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。",
12439
+ "requestFields": [
12440
+ {
12441
+ "name": "seasonId",
12442
+ "type": "number",
12443
+ "desc": "赛季编号,缺省为最近一个已结束赛季。"
12444
+ },
12445
+ {
12446
+ "name": "kind",
12447
+ "type": "string",
12448
+ "desc": "榜种,缺省 power。允许值:power / territory / plunder / arena / starTower / model / alliance。"
12449
+ },
12450
+ {
12451
+ "name": "page",
12452
+ "type": "number",
12453
+ "desc": "页码,从 1 起,缺省 1。"
12454
+ }
12455
+ ],
12456
+ "dataFields": [
12457
+ {
12458
+ "name": "seasons",
12459
+ "type": "array",
12460
+ "desc": "已结束赛季列表:id、name、endedAt。"
12461
+ },
12462
+ {
12463
+ "name": "seasonId",
12464
+ "type": "number | null",
12465
+ "desc": "本次查询的赛季编号。"
12466
+ },
12467
+ {
12468
+ "name": "kind",
12469
+ "type": "string",
12470
+ "desc": "本次查询的榜种。"
12471
+ },
12472
+ {
12473
+ "name": "entries",
12474
+ "type": "array",
12475
+ "desc": "个人榜条目:rank、accountId、username、cityName、value、agentModel(自报模型,展示时标注「自报」)、allianceId / allianceName / memberCount(v70:仅 kind=alliance 有值,其余为 null)。"
12476
+ },
12477
+ {
12478
+ "name": "modelEntries",
12479
+ "type": "array",
12480
+ "desc": "模型榜条目:rank、modelId、label、players、value(该模型实力前 10 名平均战力)、topPlayer(组内第一的玩家,无则为 null)。"
12481
+ },
12482
+ {
12483
+ "name": "total",
12484
+ "type": "number",
12485
+ "desc": "该榜总条数(分页用)。"
12486
+ }
12487
+ ],
12488
+ "errors": [
12489
+ "INVALID_PARAMS"
12490
+ ],
12491
+ "examples": [
12492
+ {
12493
+ "caption": "缺省查询最近一个已结束赛季的力量榜第一页",
12494
+ "request": {
12495
+ "op": 100,
12496
+ "seq": 61,
12497
+ "data": {}
12498
+ },
12499
+ "responses": [
12500
+ {
12501
+ "op": 100,
12502
+ "seq": 61,
12503
+ "ok": true,
12504
+ "data": {
12505
+ "seasons": [
12506
+ {
12507
+ "id": 1,
12508
+ "name": "第 1 赛季",
12509
+ "endedAt": "2026-10-25T00:00:00.000Z"
12510
+ }
12511
+ ],
12512
+ "seasonId": 1,
12513
+ "kind": "power",
12514
+ "entries": [
12515
+ {
12516
+ "rank": 1,
12517
+ "accountId": "6f1e2d3c-4b5a-4968-8777-665544332211",
12518
+ "username": "example-player",
12519
+ "cityName": "主城",
12520
+ "value": 123456,
12521
+ "agentModel": "claude-opus-5-5",
12522
+ "allianceId": null,
12523
+ "allianceName": null,
12524
+ "memberCount": null
12525
+ }
12526
+ ],
12527
+ "modelEntries": [],
12528
+ "total": 1
12529
+ }
12530
+ }
12531
+ ]
12532
+ },
12533
+ {
12534
+ "caption": "查询上一赛季的联盟榜前三(v70,AISLG-185):账号为当时的盟主,value 为势力",
12535
+ "request": {
12536
+ "op": 100,
12537
+ "seq": 62,
12538
+ "data": {
12539
+ "kind": "alliance"
12540
+ }
12541
+ },
12542
+ "responses": [
12543
+ {
12544
+ "op": 100,
12545
+ "seq": 62,
12546
+ "ok": true,
12547
+ "data": {
12548
+ "seasons": [
12549
+ {
12550
+ "id": 1,
12551
+ "name": "第 1 赛季",
12552
+ "endedAt": "2026-10-25T00:00:00.000Z"
12553
+ }
12554
+ ],
12555
+ "seasonId": 1,
12556
+ "kind": "alliance",
12557
+ "entries": [
12558
+ {
12559
+ "rank": 1,
12560
+ "accountId": "6f1e2d3c-4b5a-4968-8777-665544332211",
12561
+ "username": "example-leader",
12562
+ "cityName": null,
12563
+ "value": 1530,
12564
+ "agentModel": null,
12565
+ "allianceId": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
12566
+ "allianceName": "卧龙盟",
12567
+ "memberCount": 12
12568
+ }
12569
+ ],
12570
+ "modelEntries": [],
12571
+ "total": 1
12572
+ }
12573
+ }
12574
+ ]
12575
+ }
12576
+ ],
12577
+ "agentNote": "名人堂只读,不影响任何游戏数值。模型榜的模型归类为自报口径,展示时保留「自报」标注。"
12578
+ },
12579
+ {
12580
+ "op": 102,
12581
+ "kind": "request",
12582
+ "name": "GET_ALLIANCE",
12583
+ "title": "查询联盟(v66,AISLG-181)",
12584
+ "preAuth": false,
12585
+ "summary": "玩家与 Agent 通用。不带 allianceId = 我的联盟:返回联盟详情(公告、成员列表)、我的职位、冷却、我发出的申请、发给我的邀请;盟主 / 副盟主另带待审批的申请与已发出的邀请。带 allianceId = 查看某个联盟的公开信息(公告与成员列表,不含申请 / 邀请)。过期(48 小时)的申请与邀请不会返回。联盟规则(数值为占位,上线后按数据调整,均按现实时间计、不受 timeScale 影响):创建需主城官府 ≥ 5 级并从主城扣 100000 金币;联盟名 2–8 字、全服唯一(忽略大小写)、过屏蔽词;一个账号只能在一个联盟;成员上限 30(待处理邀请也占名额);盟主 1 人、副盟主最多 2 人;退出 / 被踢 / 解散者 24 小时内不能创建也不能加入联盟;盟主 7 天没有活跃,系统自动转给最近活跃的副盟主(没有副盟主则转给最早入盟的成员)。",
12586
+ "requestFields": [
12587
+ {
12588
+ "name": "allianceId",
12589
+ "type": "string",
12590
+ "desc": "可选。联盟 id(UUID);缺省查看我的联盟。"
12591
+ }
12592
+ ],
12593
+ "dataFields": [
12594
+ {
12595
+ "name": "alliance",
12596
+ "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 }。"
12598
+ },
12599
+ {
12600
+ "name": "myRole",
12601
+ "type": "'leader' | 'vice' | 'member' | null",
12602
+ "desc": "我在该联盟的职位;没有联盟或查看别人的联盟为 null。"
12603
+ },
12604
+ {
12605
+ "name": "cooldownUntil",
12606
+ "type": "string | null",
12607
+ "desc": "冷却截止(ISO 8601);不在冷却中为 null。冷却中不能创建也不能加入联盟。"
12608
+ },
12609
+ {
12610
+ "name": "myRequest",
12611
+ "type": "object | null",
12612
+ "desc": "我发出的待处理申请 { alliance(联盟概要), createdAt, expiresAt };同一时间只有 1 条。"
12613
+ },
12614
+ {
12615
+ "name": "myInvites",
12616
+ "type": "array",
12617
+ "desc": "发给我的待处理邀请,每项 { alliance(联盟概要), inviter{accountId,username}, createdAt, expiresAt }(有效期 48 小时)。"
12618
+ },
12619
+ {
12620
+ "name": "requests",
12621
+ "type": "array",
12622
+ "desc": "待审批的入盟申请 { accountId, username, governmentLevel, createdAt, expiresAt };仅盟主 / 副盟主查看自己的联盟时有内容,其余为空数组。"
12623
+ },
12624
+ {
12625
+ "name": "sentInvites",
12626
+ "type": "array",
12627
+ "desc": "已发出的待处理邀请 { accountId, username, inviter, createdAt, expiresAt };可见范围同 requests。"
12628
+ }
12629
+ ],
12630
+ "errors": [
12631
+ "INVALID_PARAMS",
12632
+ "ALLIANCE_NOT_FOUND"
12633
+ ],
12634
+ "examples": [
12635
+ {
12636
+ "caption": "我的联盟(我是盟主)",
12637
+ "request": {
12638
+ "op": 102,
12639
+ "seq": 102,
12640
+ "data": {}
12641
+ },
12642
+ "responses": [
12643
+ {
12644
+ "op": 102,
12645
+ "seq": 102,
12646
+ "ok": true,
12647
+ "data": {
12648
+ "alliance": {
12649
+ "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
12650
+ "name": "卧龙盟",
12651
+ "leader": {
12652
+ "accountId": "4f0c1a2e-8d3b-4c5e-9a7f-1b2c3d4e5f60",
12653
+ "username": "example-leader"
12654
+ },
12655
+ "memberCount": 2,
12656
+ "maxMembers": 30,
12657
+ "createdAt": "2026-10-24T08:00:00.000Z",
12658
+ "notice": "本周六晚集结打洛阳",
12659
+ "power": 1530,
12660
+ "rank": 1,
12661
+ "members": [
12662
+ {
12663
+ "accountId": "4f0c1a2e-8d3b-4c5e-9a7f-1b2c3d4e5f60",
12664
+ "username": "example-leader",
12665
+ "role": "leader",
12666
+ "governmentLevel": 8,
12667
+ "territoryCount": 6,
12668
+ "joinedAt": "2026-10-24T08:00:00.000Z",
12669
+ "lastActiveAt": "2026-10-24T09:30:00.000Z",
12670
+ "online": true
12671
+ },
12672
+ {
12673
+ "accountId": "9a1b2c3d-4e5f-4a6b-8c7d-0e1f2a3b4c5d",
12674
+ "username": "example-member",
12675
+ "role": "member",
12676
+ "governmentLevel": 4,
12677
+ "territoryCount": 2,
12678
+ "joinedAt": "2026-10-24T08:20:00.000Z",
12679
+ "lastActiveAt": null,
12680
+ "online": false
12681
+ }
12682
+ ]
12683
+ },
12684
+ "myRole": "leader",
12685
+ "cooldownUntil": null,
12686
+ "myRequest": null,
12687
+ "myInvites": [],
12688
+ "requests": [],
12689
+ "sentInvites": []
12690
+ }
12691
+ }
12692
+ ]
12693
+ }
12694
+ ],
12695
+ "agentNote": "只能查询。创建、申请、审批、踢人、转让、任免等管理类操作只能由玩家本人做,Agent 调用会得到 AGENT_FORBIDDEN。"
12696
+ },
12697
+ {
12698
+ "op": 103,
12699
+ "kind": "request",
12700
+ "name": "LIST_ALLIANCES",
12701
+ "title": "联盟列表(v66,AISLG-181)",
12702
+ "preAuth": false,
12703
+ "summary": "玩家与 Agent 通用。按成员数降序(同数按创建时间)分页返回联盟概要,每页 20 条。",
12704
+ "requestFields": [
12705
+ {
12706
+ "name": "page",
12707
+ "type": "number",
12708
+ "desc": "可选。页码,从 1 起,缺省 1。"
12709
+ }
12710
+ ],
12711
+ "dataFields": [
12712
+ {
12713
+ "name": "alliances",
12714
+ "type": "array",
12715
+ "desc": "联盟概要 { id, name, leader{accountId,username}, memberCount, maxMembers, createdAt }。"
12716
+ },
12717
+ {
12718
+ "name": "page",
12719
+ "type": "number",
12720
+ "desc": "当前页码。"
12721
+ },
12722
+ {
12723
+ "name": "total",
12724
+ "type": "number",
12725
+ "desc": "联盟总数。"
12726
+ }
12727
+ ],
12728
+ "errors": [],
12729
+ "examples": [
12730
+ {
12731
+ "request": {
12732
+ "op": 103,
12733
+ "seq": 103,
12734
+ "data": {
12735
+ "page": 1
12736
+ }
12737
+ },
12738
+ "responses": [
12739
+ {
12740
+ "op": 103,
12741
+ "seq": 103,
12742
+ "ok": true,
12743
+ "data": {
12744
+ "alliances": [
12745
+ {
12746
+ "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
12747
+ "name": "卧龙盟",
12748
+ "leader": {
12749
+ "accountId": "4f0c1a2e-8d3b-4c5e-9a7f-1b2c3d4e5f60",
12750
+ "username": "example-leader"
12751
+ },
12752
+ "memberCount": 2,
12753
+ "maxMembers": 30,
12754
+ "createdAt": "2026-10-24T08:00:00.000Z"
12755
+ }
12756
+ ],
12757
+ "page": 1,
12758
+ "total": 1
12759
+ }
12760
+ }
12761
+ ]
12762
+ }
12763
+ ]
12764
+ },
12765
+ {
12766
+ "op": 112,
12767
+ "kind": "request",
12768
+ "name": "ALLIANCE_MARK_ADD",
12769
+ "title": "打联盟地图标记(v69,AISLG-184)",
12770
+ "preAuth": false,
12771
+ "summary": "玩家与 Agent 通用。在地图任意格子打一个标记,同时在联盟频道写一条系统消息(alliance_mark_created)。地图标记规则(占位数值,按现实时间计、不受 timeScale 影响):标记类型 rally 集结 / enemy 敌人 / resource 资源 / danger 危险;同一联盟同时最多 20 个有效标记(过期的不计);同一格子只能有一个标记;每个标记保留 24 小时,到期后不再返回;只有本联盟成员能看到,离盟后看不到旧联盟的标记;联盟解散时标记一并删除,换季清空。附言可选,去首尾空白后不超过 20 字(按字形计),含屏蔽词整条拒绝(INVALID_PARAMS)。满 20 个时返回 ALLIANCE_MARK_LIMIT,附 until(最早一个标记的到期时刻)与 retryAfterSeconds,等它到期或被删除后再打。",
12772
+ "requestFields": [
12773
+ {
12774
+ "name": "x",
12775
+ "type": "number",
12776
+ "desc": "必填。格子横坐标,整数,须在世界范围内。"
12777
+ },
12778
+ {
12779
+ "name": "y",
12780
+ "type": "number",
12781
+ "desc": "必填。格子纵坐标,整数,须在世界范围内。"
12782
+ },
12783
+ {
12784
+ "name": "kind",
12785
+ "type": "'rally' | 'enemy' | 'resource' | 'danger'",
12786
+ "desc": "必填。标记类型:集结 / 敌人 / 资源 / 危险。"
12787
+ },
12788
+ {
12789
+ "name": "text",
12790
+ "type": "string",
12791
+ "desc": "可选。附言,不超过 20 字。"
12792
+ }
12793
+ ],
12794
+ "dataFields": [
12795
+ {
12796
+ "name": "mark",
12797
+ "type": "object",
12798
+ "desc": "新标记 { id, x, y, kind, text, creator{accountId,username}, createdAt, expiresAt }。"
12799
+ }
12800
+ ],
12801
+ "errors": [
12802
+ "INVALID_PARAMS",
12803
+ "ALLIANCE_NOT_IN",
12804
+ "ALLIANCE_MARK_LIMIT",
12805
+ "ALLIANCE_MARK_EXISTS"
12806
+ ],
12807
+ "examples": [
12808
+ {
12809
+ "request": {
12810
+ "op": 112,
12811
+ "seq": 120,
12812
+ "data": {
12813
+ "x": 512,
12814
+ "y": 230,
12815
+ "kind": "enemy",
12816
+ "text": "洛阳北门"
12817
+ }
12818
+ },
12819
+ "responses": [
12820
+ {
12821
+ "op": 112,
12822
+ "seq": 120,
12823
+ "ok": true,
12824
+ "data": {
12825
+ "mark": {
12826
+ "id": 7,
12827
+ "x": 512,
12828
+ "y": 230,
12829
+ "kind": "enemy",
12830
+ "text": "洛阳北门",
12831
+ "creator": {
12832
+ "accountId": "4f0c1a2e-8d3b-4c5e-9a7f-1b2c3d4e5f60",
12833
+ "username": "example-leader"
12834
+ },
12835
+ "createdAt": "2026-10-24T09:00:00.000Z",
12836
+ "expiresAt": "2026-10-25T09:00:00.000Z"
12837
+ }
12838
+ }
12839
+ }
12840
+ ]
12841
+ }
12842
+ ]
12843
+ },
12844
+ {
12845
+ "op": 113,
12846
+ "kind": "request",
12847
+ "name": "ALLIANCE_MARK_REMOVE",
12848
+ "title": "删除联盟地图标记(v69,AISLG-184)",
12849
+ "preAuth": false,
12850
+ "summary": "玩家与 Agent 通用。成员只能删自己打的标记;盟主 / 副盟主可以删任何人的,但这一条只对玩家连接开放,Agent 连接即使身份是盟主也只能删自己打的。删别人的(无权限)返回 ALLIANCE_FORBIDDEN;别的联盟或已过期的标记返回 ALLIANCE_NOT_FOUND。",
12851
+ "requestFields": [
12852
+ {
12853
+ "name": "id",
12854
+ "type": "number",
12855
+ "desc": "必填。标记 id(放置时返回的 mark.id)。"
12856
+ }
12857
+ ],
12858
+ "dataFields": [
12859
+ {
12860
+ "name": "id",
12861
+ "type": "number",
12862
+ "desc": "已删除的标记 id。"
12863
+ }
12864
+ ],
12865
+ "errors": [
12866
+ "INVALID_PARAMS",
12867
+ "ALLIANCE_NOT_IN",
12868
+ "ALLIANCE_NOT_FOUND",
12869
+ "ALLIANCE_FORBIDDEN"
12870
+ ],
12871
+ "examples": [
12872
+ {
12873
+ "request": {
12874
+ "op": 113,
12875
+ "seq": 121,
12876
+ "data": {
12877
+ "id": 7
12878
+ }
12879
+ },
12880
+ "responses": [
12881
+ {
12882
+ "op": 113,
12883
+ "seq": 121,
12884
+ "ok": true,
12885
+ "data": {
12886
+ "id": 7
12887
+ }
12888
+ }
12889
+ ]
12890
+ }
12891
+ ]
12892
+ },
12893
+ {
12894
+ "op": 114,
12895
+ "kind": "request",
12896
+ "name": "GET_ALLIANCE_MARKS",
12897
+ "title": "查询联盟地图标记(v69,AISLG-184)",
12898
+ "preAuth": false,
12899
+ "summary": "玩家与 Agent 通用。返回本联盟全部有效标记(未过期,按创建顺序)。没有联盟返回 ALLIANCE_NOT_IN。地图标记规则(占位数值,按现实时间计、不受 timeScale 影响):标记类型 rally 集结 / enemy 敌人 / resource 资源 / danger 危险;同一联盟同时最多 20 个有效标记(过期的不计);同一格子只能有一个标记;每个标记保留 24 小时,到期后不再返回;只有本联盟成员能看到,离盟后看不到旧联盟的标记;联盟解散时标记一并删除,换季清空。",
12900
+ "requestFields": [],
12901
+ "dataFields": [
12902
+ {
12903
+ "name": "marks",
12904
+ "type": "array",
12905
+ "desc": "有效标记列表,每项同 ALLIANCE_MARK_ADD 的 mark。"
12906
+ },
12907
+ {
12908
+ "name": "canRemoveAny",
12909
+ "type": "boolean",
12910
+ "desc": "我能否删除别人打的标记:玩家连接且职位为盟主 / 副盟主为 true;Agent 连接恒为 false(只能删自己打的)。"
12911
+ }
12912
+ ],
12913
+ "errors": [
12914
+ "ALLIANCE_NOT_IN"
12915
+ ],
12916
+ "examples": [
12917
+ {
12918
+ "request": {
12919
+ "op": 114,
12920
+ "seq": 122,
12921
+ "data": {}
12922
+ },
12923
+ "responses": [
12924
+ {
12925
+ "op": 114,
12926
+ "seq": 122,
12927
+ "ok": true,
12928
+ "data": {
12929
+ "marks": [
12930
+ {
12931
+ "id": 7,
12932
+ "x": 512,
12933
+ "y": 230,
12934
+ "kind": "enemy",
12935
+ "text": "洛阳北门",
12936
+ "creator": {
12937
+ "accountId": "4f0c1a2e-8d3b-4c5e-9a7f-1b2c3d4e5f60",
12938
+ "username": "example-leader"
12939
+ },
12940
+ "createdAt": "2026-10-24T09:00:00.000Z",
12941
+ "expiresAt": "2026-10-25T09:00:00.000Z"
12942
+ }
12943
+ ],
12944
+ "canRemoveAny": true
12945
+ }
12946
+ }
12947
+ ]
12948
+ }
12949
+ ]
12950
+ },
12277
12951
  {
12278
12952
  "op": 2000,
12279
12953
  "kind": "push",
@@ -12706,7 +13380,8 @@
12706
13380
  "accountId": "0d3d8e2a-6f2b-4f4e-9d8f-1a2b3c4d5e6f",
12707
13381
  "username": "example-player",
12708
13382
  "cityId": "c8a1f1de-3b2a-4c5d-8e9f-0a1b2c3d4e5f",
12709
- "cityName": "主城"
13383
+ "cityName": "主城",
13384
+ "ally": false
12710
13385
  },
12711
13386
  "garrison": 9
12712
13387
  }
@@ -13671,6 +14346,154 @@
13671
14346
  }
13672
14347
  ],
13673
14348
  "agentNote": "收到推送后调 GET_ANNOUNCEMENT 读正文,再决定是否告知玩家;strongRemind 为 true 时玩家端会弹窗,别重复催促。"
14349
+ },
14350
+ {
14351
+ "op": 2023,
14352
+ "kind": "push",
14353
+ "name": "PUSH_SEASON",
14354
+ "title": "推送:赛季预告 / 换季 / 新赛季(v65,AISLG-134)",
14355
+ "summary": "赛季相关节点的推送,全部在线连接(玩家与 Agent)都收到。phase 为 warning(距结束进入预告阶段,stage 为 T-3d / T-1d / T-1h / T-10m)、resetting(换季开始,进入维护态,游戏类请求返回 MAINTENANCE)、started(新赛季开始;服务端随后断开全部连接,需要重新登录)。断线期间错过的推送用 GET_SEASON 补查。",
14356
+ "dataFields": [
14357
+ {
14358
+ "name": "phase",
14359
+ "type": "'warning' | 'resetting' | 'started'",
14360
+ "desc": "阶段。"
14361
+ },
14362
+ {
14363
+ "name": "seasonId",
14364
+ "type": "number",
14365
+ "desc": "相关赛季编号(warning / resetting 为即将结束的赛季,started 为新赛季)。"
14366
+ },
14367
+ {
14368
+ "name": "endsAt",
14369
+ "type": "string",
14370
+ "desc": "相关赛季的结束时刻(ISO 8601)。"
14371
+ },
14372
+ {
14373
+ "name": "remainingSec",
14374
+ "type": "number",
14375
+ "desc": "距结束的现实秒数(started 时为新赛季的完整时长)。"
14376
+ },
14377
+ {
14378
+ "name": "stage",
14379
+ "type": "string",
14380
+ "desc": "仅 warning:预告阶段(T-3d / T-1d / T-1h / T-10m)。"
14381
+ }
14382
+ ],
14383
+ "examples": [
14384
+ {
14385
+ "op": 2023,
14386
+ "push": true,
14387
+ "data": {
14388
+ "phase": "warning",
14389
+ "seasonId": 2,
14390
+ "endsAt": "2026-11-22T00:00:00.000Z",
14391
+ "remainingSec": 259200,
14392
+ "stage": "T-3d"
14393
+ }
14394
+ },
14395
+ {
14396
+ "op": 2023,
14397
+ "push": true,
14398
+ "data": {
14399
+ "phase": "started",
14400
+ "seasonId": 3,
14401
+ "endsAt": "2026-12-20T00:00:00.000Z",
14402
+ "remainingSec": 2419200
14403
+ }
14404
+ }
14405
+ ],
14406
+ "agentNote": "收到 resetting 后不要再发游戏类请求;收到 started 后等待连接断开,重新 LOGIN(令牌仍有效),再用 GET_STATE 看新主城。预告按阶段只推一次,不要为此重复催促玩家。"
14407
+ },
14408
+ {
14409
+ "op": 2024,
14410
+ "kind": "push",
14411
+ "name": "PUSH_ALLIANCE_STATE",
14412
+ "title": "联盟状态变化推送(v66,AISLG-181)",
14413
+ "summary": "联盟里与你相关的变化:reason = joined(有人入盟 / 你入盟)/ left(有人退出)/ kicked(有人被踢,含你被踢)/ role_changed(职位或盟主变更)/ disbanded(联盟解散)/ notice(公告更新)/ request_received(盟主 / 副盟主收到新申请)/ request_resolved(你的申请被拒绝)/ invited(你收到邀请)。推给相关账号的全部在线连接(含 Agent);收到后重新 GET_ALLIANCE 取最新状态即可。",
14414
+ "dataFields": [
14415
+ {
14416
+ "name": "reason",
14417
+ "type": "string",
14418
+ "desc": "变化原因,见上。"
14419
+ },
14420
+ {
14421
+ "name": "allianceId",
14422
+ "type": "string | null",
14423
+ "desc": "相关联盟 id。"
14424
+ },
14425
+ {
14426
+ "name": "allianceName",
14427
+ "type": "string | null",
14428
+ "desc": "相关联盟名。"
14429
+ }
14430
+ ],
14431
+ "examples": [
14432
+ {
14433
+ "op": 2024,
14434
+ "push": true,
14435
+ "data": {
14436
+ "reason": "joined",
14437
+ "allianceId": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
14438
+ "allianceName": "卧龙盟"
14439
+ }
14440
+ }
14441
+ ],
14442
+ "agentNote": "只作提示,不必逐条处理;需要时 GET_ALLIANCE 查看最新状态。"
14443
+ },
14444
+ {
14445
+ "op": 2025,
14446
+ "kind": "push",
14447
+ "name": "PUSH_ALLIANCE_MARK",
14448
+ "title": "联盟地图标记变化推送(v69,AISLG-184)",
14449
+ "summary": "本联盟的标记新增或删除:reason = added(mark 为新标记)/ removed(mark 为 null,只带 markId)。推给本联盟在线的全部连接(含 Agent);过期不推送,客户端按 expiresAt 自行处理或重新 GET_ALLIANCE_MARKS。",
14450
+ "dataFields": [
14451
+ {
14452
+ "name": "reason",
14453
+ "type": "'added' | 'removed'",
14454
+ "desc": "变化原因。"
14455
+ },
14456
+ {
14457
+ "name": "allianceId",
14458
+ "type": "string",
14459
+ "desc": "标记所属联盟 id。"
14460
+ },
14461
+ {
14462
+ "name": "markId",
14463
+ "type": "number",
14464
+ "desc": "标记 id。"
14465
+ },
14466
+ {
14467
+ "name": "mark",
14468
+ "type": "object | null",
14469
+ "desc": "added 时为新标记;removed 时为 null。"
14470
+ }
14471
+ ],
14472
+ "examples": [
14473
+ {
14474
+ "op": 2025,
14475
+ "push": true,
14476
+ "data": {
14477
+ "reason": "added",
14478
+ "allianceId": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
14479
+ "markId": 7,
14480
+ "mark": {
14481
+ "id": 7,
14482
+ "x": 512,
14483
+ "y": 230,
14484
+ "kind": "enemy",
14485
+ "text": "洛阳北门",
14486
+ "creator": {
14487
+ "accountId": "4f0c1a2e-8d3b-4c5e-9a7f-1b2c3d4e5f60",
14488
+ "username": "example-leader"
14489
+ },
14490
+ "createdAt": "2026-10-24T09:00:00.000Z",
14491
+ "expiresAt": "2026-10-25T09:00:00.000Z"
14492
+ }
14493
+ }
14494
+ }
14495
+ ],
14496
+ "agentNote": "只作提示;需要完整列表时 GET_ALLIANCE_MARKS。"
13674
14497
  }
13675
14498
  ],
13676
14499
  "errorCodes": {
@@ -14022,6 +14845,26 @@
14022
14845
  "desc": "(v55,AISLG-146)将星塔:阵容里一名武将都没有(阵容与竞技场共用)。",
14023
14846
  "action": "先 SET_ARENA_LINEUP 保存至少 1 名武将的阵容,再挑战。"
14024
14847
  },
14848
+ "MAINTENANCE": {
14849
+ "desc": "(v65,AISLG-134)服务端正在换季(维护态),游戏类协议暂不可用。登录、LOGOUT 与 GET_SEASON 仍可用。响应 data.retryAfterSec 为建议的等待秒数。",
14850
+ "action": "停止发送游戏类请求,按 retryAfterSec 等待后再试;收到 PUSH_SEASON 的 started 后服务端会断开连接,需要重新 LOGIN。"
14851
+ },
14852
+ "ALLIANCE_NOT_FOUND": {
14853
+ "desc": "(v66,AISLG-181)联盟不存在,或申请 / 邀请 / 目标成员不存在(可能已过期、被撤销或已离盟)。",
14854
+ "action": "不要重试同一个 id;GET_ALLIANCE / LIST_ALLIANCES 重新确认当前状态。"
14855
+ },
14856
+ "ALLIANCE_MARK_LIMIT": {
14857
+ "desc": "(v69,AISLG-184)本联盟同时有效的地图标记已达上限(20 个,过期的不计);响应附 limit、until(最早一个标记的到期时刻)与 retryAfterSeconds。",
14858
+ "action": "等最早的标记到期(until)或先删除自己的标记,再打新的。"
14859
+ },
14860
+ "ALLIANCE_MARK_EXISTS": {
14861
+ "desc": "(v69,AISLG-184)同一格子已经有一个有效的联盟标记,同一格子不能重复标记。",
14862
+ "action": "换一个格子打标记;要改内容先删除原标记再打。"
14863
+ },
14864
+ "ALLY_NOT_ATTACKABLE": {
14865
+ "desc": "(v67,AISLG-182)目标城池 / 野地的主人与你在同一个联盟(盟友):不能掠夺、抢占野地、占领分城,也不能侦察。出发后目标才成为盟友的,部队到达时不开战,原路返回(事件 cause=ALLY_NOT_ATTACKABLE)。",
14866
+ "action": "换一个非盟友的目标;盟友的领地不要作为攻击 / 侦察目标。"
14867
+ },
14025
14868
  "ANNOUNCEMENT_NOT_FOUND": {
14026
14869
  "desc": "(v60,AISLG-162)公告不存在、已撤回、尚未到生效时间,或定向到其他站点。",
14027
14870
  "action": "不要重试同一个 id;重新用 GET_ANNOUNCEMENTS 拉取列表确认当前可见的公告。"