Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
863a134
feat: 式舆防卫战自动配队
kawayiYokami Jul 30, 2026
69b77be
feat(devtools): 添加配队选择
kawayiYokami Jul 30, 2026
bef1d0b
fix: 让按住滑动更加稳定
kawayiYokami Jul 30, 2026
f656e39
fix: 使用拖动翻页预备编队
kawayiYokami Jul 30, 2026
6000420
chore: 增强预备编队扫描日志
kawayiYokami Jul 30, 2026
02244b6
fix: 跳过被禁用的预备编队
kawayiYokami Jul 30, 2026
083fe9d
fix: 取消预选的预备编队
kawayiYokami Jul 30, 2026
039948c
docs: 补充预备编队选择说明
kawayiYokami Jul 30, 2026
a0d2b23
fix: 限制预备编队选中确认重试
kawayiYokami Jul 30, 2026
fc75a0f
fix: 限制扫描预备编队代理人数
kawayiYokami Jul 30, 2026
682f4fb
docs: 说明预备编队邦布处理
kawayiYokami Jul 30, 2026
a72b307
Merge remote-tracking branch 'origin/main' into feat/shiyu-defense-au…
DoctorReid Jul 31, 2026
49b1f9d
docs(combat): 补战斗系统机制与配队评分注释
DoctorReid Jul 31, 2026
7bd1652
fix(shiyu_defense): 选队改用核心技X/3判满员并容错OCR误读
DoctorReid Aug 1, 2026
b81ab37
fix: 统一预备编队名称空白
kawayiYokami Aug 1, 2026
e1f60bd
fix: 按预备编队序号定位选卡
kawayiYokami Aug 1, 2026
437fd6a
docs: 说明预备编队名称同步与序号选卡
kawayiYokami Aug 1, 2026
bd68007
fix: 延长前台拖动按住时间
kawayiYokami Aug 1, 2026
bf86701
feat: 新增预备编队坐标区域
kawayiYokami Aug 1, 2026
c6bc4c8
fix: 改进预备编队禁用识别
kawayiYokami Aug 1, 2026
39cb37c
fix: 修正预备编队禁用与选队定位
kawayiYokami Aug 1, 2026
fb2cd68
feat: 配队选择改为独立插件
kawayiYokami Aug 1, 2026
55bbe70
chore: 优化预备编队选择日志
kawayiYokami Aug 1, 2026
d02acc9
fix: 拖动前停顿改为类常量并计入拖动时长
kawayiYokami Aug 3, 2026
c96a41c
chore: 删除配队选择测试应用
kawayiYokami Aug 3, 2026
97305fd
fix: 预备编队槽位改为从0开始计数
kawayiYokami Aug 7, 2026
81eedc5
chore: 清理已删除配队选择应用的 STANDALONE 残留
kawayiYokami Aug 12, 2026
bef3370
style
ShadowLemoon Aug 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 116 additions & 0 deletions assets/game_data/screen_info/_od_merged.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10265,3 +10265,119 @@
template_match_threshold: 0.7
color_range: null
goto_list: []
- screen_id: team_select
screen_name: 编队选择
pc_alt: false
area_list:
- area_name: 编队槽位0
id_mark: false
pc_rect:
- 160
- 132
- 933
- 381
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位1
id_mark: false
pc_rect:
- 976
- 128
- 1755
- 385
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位2
id_mark: false
pc_rect:
- 162
- 414
- 944
- 672
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位3
id_mark: false
pc_rect:
- 983
- 416
- 1750
- 666
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位4
id_mark: false
pc_rect:
- 163
- 694
- 943
- 949
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位5
id_mark: false
pc_rect:
- 976
- 694
- 1757
- 949
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 选择标记左
id_mark: false
pc_rect:
- 774
- 183
- 940
- 941
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 选择标记右
id_mark: false
pc_rect:
- 1598
- 180
- 1757
- 940
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
116 changes: 116 additions & 0 deletions assets/game_data/screen_info/team_select.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
screen_id: team_select
screen_name: 编队选择
pc_alt: false
area_list:
- area_name: 编队槽位0
id_mark: false
pc_rect:
- 160
- 132
- 933
- 381
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位1
id_mark: false
pc_rect:
- 976
- 128
- 1755
- 385
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位2
id_mark: false
pc_rect:
- 162
- 414
- 944
- 672
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位3
id_mark: false
pc_rect:
- 983
- 416
- 1750
- 666
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位4
id_mark: false
pc_rect:
- 163
- 694
- 943
- 949
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 编队槽位5
id_mark: false
pc_rect:
- 976
- 694
- 1757
- 949
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 选择标记左
id_mark: false
pc_rect:
- 774
- 183
- 940
- 941
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
- area_name: 选择标记右
id_mark: false
pc_rect:
- 1598
- 180
- 1757
- 940
text: ''
lcs_percent: 0.5
template_sub_dir: ''
template_id: ''
template_match_threshold: 0.7
color_range: null
goto_list: []
95 changes: 87 additions & 8 deletions docs/game/gameplay/combat.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,94 @@
---
gameplay_name: 战斗系统
involves_screens: []
involves_screens: [战斗画面]
last_updated: 2026-07-31
---

# 战斗系统
# 战斗系统(玩法)

## 机制
(自由描述:战斗核心机制、角色切换、属性克制等。)
绝区零的核心战斗机制。本页只讲**通用共性机制**(所有战斗玩法共用),作为理解自动配队 / 自动战斗的依据。个别角色的专属机制(如某某角色的独有架势 / 染色 / 能量条)不展开——那是角色百科内容,查 [米游社 WIKI](https://baike.mihoyo.com/zzz/wiki/channel/map/66/68) 或 [萌娘百科](https://zh.moegirl.org.cn);只在**代码用到时**在本页点到。

## 流程与决策点
(自由描述:进入战斗 → 编队 → 开打 → 结算 的画面流转;关键决策点。)
战斗画面识别见 [战斗画面.md](../screens/战斗画面.md)。

## 备注
(自由记录。)
## 这是什么

战斗是绝区零绝大多数玩法(式舆防卫战 / 恶名狩猎 / 迷失之地 / 各类副本)的核心:3 人小队实时切人打怪,靠 **属性克制 + 异常积蓄 + 失衡击破** 三条机制链路输出伤害。配队围绕这三条链路 + 角色职业搭配展开。

## 三条输出链路

### 1. 属性克制(直伤队核心)

- **7 种属性**:电、以太、物理、火、冰、风(3.0 引入)、流明(对应代码 `DmgTypeEnum`)。
- **克制(弱点)**:敌人对该属性抗性 **-20%**,直伤更高(伤害数字白色)。
- **抗性**:敌人对该属性抗性 **+20%**,直伤更低(伤害数字变灰)。
- 非克制非抗性:抗性 0,正常伤害。

> **配队依据**:尽量用敌人**弱点属性**的输出角色,避开**抗性属性**。脚本据此给候选队评分(见末尾「自动配队评分」)。

来源:[NGA · 绝区零数据机制导论](https://bbs.nga.cn/read.php?tid=40893992)。

### 2. 异常积蓄 + 紊乱(异常队核心)

- **异常积蓄**:用同属性攻击持续打敌人,积累「异常值」(怪物血条右侧进度条);攒满触发该属性的**异常效果**(各属性效果不同,分持续伤害类 / 单次伤害类 / 控制类,具体查 WIKI)。
- **紊乱(Disorder)**:对已处于某异常状态的敌人,再施加**另一种属性**的异常 → 覆盖原状态,触发**紊乱**,额外结算一次伤害。
- 异常队靠快速挂多种异常反复触发紊乱打伤害(混伤,以异常为主、直伤为辅)。
- 异常伤害受「异常精通 + 攻击力 + 异常掌控」影响,**不受暴击影响**(培养方向与直伤角不同)。

> 注意游戏内正式术语是「**紊乱**」(Disorder);风属性版的紊乱叫「**乱流**」(风专属别名,见下「染色」),"紊流"则是误写。

来源:[游民星空 · 全属性异常效果一览](https://www.gamersky.com/handbook/202407/1784391.shtml)、[TapTap · 紊乱机制解读](https://www.taptap.cn/moment/591659398095440330)。

### 3. 失衡 + 连携技(击破队核心)

- 攻击积累敌人**失衡值**(血条下方进度),满后敌人进入「失衡状态」,期间受到的伤害大幅提升。
- 失衡期间触发**连携技**(角色大招演出),是爆发输出窗口。
- **击破**职业负责快速打失衡,把队伍"抬"进连携爆发期。

## 染色(风 / 流明异常的特殊机制)

风、流明是较新的特殊异常属性,有专属异常交互(代表角色:风=维琳娜、流明=蕾米埃尔,角色技能详见 WIKI),是当前版本异常队核心。

- **风属性**:异常体系为**风化**(持续伤害)→ **浸染 / 染色**(接触其他属性时提升风 + 该属性伤害)→ **乱流**(风化与其他属性异常共存时触发爆炸,风版紊乱)。乱流靠**队友的异色异常**触发。
- **流明属性**:**可变属性**——流明异常会随队友属性变化(与风属性队友 → 算风伤,与物理 → 物伤,与以太 → 以太伤)。

**风 + 流明同队**:流明因风属性队友而变风伤 → 双方都打风,**没有异色异常可触发风乱流**。配队评分据此对两者做不对称处理:

- 风异常的乱流染色源**不能是流明队友**(流明会变风,非异色)→ 评分时 `WIND` 排除 `LUMIFLUX` 队友。
- 流明可变,能吃任何队友属性(含风)→ 评分时 `LUMIFLUX` 不排除队友。

见 `shiyu_defense_team_utils.py:_calc_team_score` 染色分支。

来源:[游侠 · 维琳娜技能介绍](https://m.ali213.net/news/gl2606/1783305.html)、[4399 · 蕾米埃尔全面解析](https://www.4399.com/pcgame/topic/53681368.html)、[NGA · 蕾米埃尔绑定维琳娜讨论](https://bbs.nga.cn/read.php?tid=47024817)。

## 职业系统

每个代理人有**职业**(`AgentTypeEnum`),决定战斗定位:

| 职业 | 定位 | 配队评分角色 |
|---|---|---|
| 强攻(ATTACK) | 直伤输出主力 | 输出(按属性克制评分) |
| 命破(RUPTURE) | 直伤输出(另一套体系) | 输出 |
| 异常(ANOMALY) | 靠异常积蓄 / 紊乱打伤害 | 输出(异常倍率;风/流明走染色分支) |
| 击破(STUN) | 打失衡触发连携 | 辅助(对齐最强输出计分) |
| 支援(SUPPORT) | 增伤 / 治疗 / buff | 辅助 |
| 防护(DEFENSE) | 护盾 / 生存 | 辅助 |

## 虚狩

**虚狩**是新艾利都调查员的**最高荣誉称号**(由市长授予,表彰镇压空洞的极大贡献),**不是职业也不是属性**,而是剧情设定上的头衔。当前虚狩级代理人(对应代码 `VOID_HUNTER_AGENT_ID_LIST`):仪玄(`yixuan`)、星见雅(`hoshimi_miyabi`)、叶瞬光(`yeshunguang`)、蕾米埃尔(`remielle`)。

> 代码里 `VOID_HUNTER_*` 命名是"虚狩"的直译(早期被误称为"虚无猎人")。虚狩角色通常机制 / 数值更强,脚本配队给虚狩角色 **1.2 倍评分加权**。该列表**硬编码**,游戏新增虚狩角色时需手动补(后续可考虑下沉到 `Agent` 数据字段派生)。

来源:[萌娘百科 · 虚狩](https://zh.moegirl.org.cn/zh-cn/%E8%99%9A%E7%8B%A9)。

## 关联:自动配队评分(代码)

式舆防卫战自动配队(`shiyu_defense_team_utils.py:DefenseTeamSearcher` / `select_teams`)用上述机制给候选预备编队打分,选**总分最高且两阶段代理人不重复**的组合:

- **输出角色(强攻 / 命破 / 异常)**:按属性对弱点 / 抗性的契合度评分。代码用 `1.3 / 0.7`(异常 `1.69 / 0.49`)——**这是评分权重,不是真实 ±20% 伤害倍率**;放大克制 / 抗性的分差以便排序。
- **辅助角色(击破 / 支援 / 防护)**:按「对齐队内最强输出」计入,每个辅助贡献 = 最强输出分(`sum(output) + max(output) × 辅助数`)。
- **虚狩角色**:1.2 倍加权。
- **风 / 流明异常**:走染色分支(看队友异常属性)。
- 普通节点 2 个半场 / 多间模式全部未完成房间的队,代理人 ID 不能重复。

配队的完整玩法流程见 [式舆防卫战.md](式舆防卫战.md);扫描 / 点击选队的自动化实现见相关 application / operation 代码。
13 changes: 10 additions & 3 deletions docs/game/gameplay/式舆防卫战.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ involves_screens: [式舆防卫战, 式舆防卫战-三间选择, 快捷手册,
- **推荐属性(弱点)**:用这些属性的代理人伤害更高。
- **敌人抗性**:这些属性的代理人伤害被削,避免用。

据此为每个半场配克制队 —— 这是「配队策略」核心。脚本 `calc_teams` 就是按弱点匹配预备编队(见附录)
据此为每个半场配克制队。脚本在式舆防卫战的预备编队选择界面扫描游戏内编队并写入预备编队配置,再以角色职业、属性和本场弱点/抗性计算总分;不用手工配置队伍应对的属性

### 防线效果(Frontier Effect)
每期剧变节点有**整期共享的特殊增益**(如「冰属性伤害+10%、异常精通+40」),利用效果配队更易通关。2.5 改版后所有防线共享同一效果(来源:Game8)。
Expand All @@ -52,6 +52,13 @@ involves_screens: [式舆防卫战, 式舆防卫战-三间选择, 快捷手册,

⚠️ **这是 issue #2506 的玩法根因**:新一期可能从**中间防线**开始(上季成绩决定跳关),脚本要 OCR「剧变节点进度 X/Y」判断从哪个防线继续,不能无脑从防线 1 开始(见 [画面 doc](../screens/式舆防卫战.md)「剧变节点进度」)。

### 剧变节点进度 X/Y(脚本判下一个防线)

选关主界面显示「剧变节点进度 X/Y」(如实测 3/5,OCR 常把 X/Y 连写成 `315`):
- **Y = 总防线数**:2.5 改版后为 **5**(早期版本 7);随版本演变,**脚本不应硬假设具体数值或下限**(例如不能假设「至少 2 防线」)。
- **X = 当前 / 已挑战到的防线**,取决于上一期成绩(快速扫荡):上季防线 5 评 S → 这季从防线 4 开始(X=4);上季没挑战 → 从防线 1(X=1)。即「从哪开始」要**上一期挑战过才会有**跳关,否则默认从 1。
- 脚本 `choose_node_idx` OCR 读 X/Y,按 `current=X、total=Y、next=current+1` 定下一个防线。⚠️ OCR 易误读(实测见过 `3/5 → 2/1`),解析需校验:`total<current` 必为误读(总防线数不会小于已打到的防线),此时回退 `run_record` 避免误判「全部完成」跳过整关(代码 `shiyu_defense_app.py`)。

### 防线 5 = 多间模式(2.5 改版新增)
防线 5 拆成 **3 个独立房间(Room)**:
- 每房间**独立配队**,代理人/音擎/驱动盘**锁定不共享**(A 房用了的装备 B 房不能用)。
Expand Down Expand Up @@ -88,9 +95,9 @@ involves_screens: [式舆防卫战, 式舆防卫战-三间选择, 快捷手册,
⚠️ **只自动化剧变节点**(稳定/纷争是永久一次性,玩家手动通一次即可,不值得写脚本)。

**普通防线(1-4)节点链**:
传送(TransportByCompendium 作战/式舆防卫战/剧变节点)→ 等加载(关"前次行动最佳记录"弹窗 + 等"前哨档案")→ 选择节点(OCR 剧变节点进度 X/Y 首尾数字法判断从哪开始,#2510)→ 识别弱点算配队(`calc_teams`,2 半场弱点+抗性 → DFS 选预备编队,避代理人冲突)→ 选配队(`ChoosePredefinedTeam` 点编队名+200px)→ 出战(Deploy)→ 自动战斗(`ShiyuDefenseBattle`,每半场一次,op 内部移动+战斗+阶段切换)→ 下一节点(战斗结束-下一防线/退出)→ 所有节点完成 → 领奖(奖励入口→全部领取)→ 关闭奖励 → 返回大世界。
传送(TransportByCompendium 作战/式舆防卫战/剧变节点)→ 等加载(关"前次行动最佳记录"弹窗 + 等"前哨档案")→ 选择节点(OCR 剧变节点进度 X/Y 首尾数字法判断从哪开始,#2510)→ 识别弱点→进入预备编队选择(扫描游戏列表并按顺序写入名称、代理人到当前实例预备编队配置,首个空队结束)→自动配队(`select_teams` 为两个半场选总分最高、编队和代理人 ID 都不重复的队伍)→选配队(`ChoosePredefinedTeam` 按 `team_idx` 翻到目标页,以 OCR 找到目标编队名称后点击其右侧空白区,并确认 `SELECT` 已变为选中态)→预备出战→出战(Deploy)→自动战斗(`ShiyuDefenseBattle`,每半场一次,op 内部移动+战斗+阶段切换)→下一节点(战斗结束-下一防线/退出)→所有节点完成 → 领奖(奖励入口→全部领取)→关闭奖励 → 返回大世界。

**防线 5(多间模式)**:选节点-05 → 三间选择(`calc_teams_for_multi_room` 3 房配队)→ 循环{前往第N间 → 实战模拟室预备编队 → 出战 → `ShiyuDefenseBattle` → 战斗结束-退出}→ 返回主界面 → 领奖。
**防线 5(多间模式)**:选节点-05 → 三间选择(识别所有未完成房间的弱点、抗性并保留选择目标)→第一次进入房间时,在预备编队列表扫描并一次选出所有互斥队伍→循环{每间只按已选的 `team_idx` 点当前队 → 出战 → `ShiyuDefenseBattle` → 战斗结束-退出}→返回主界面 → 领奖。

**关键 op(`ShiyuDefenseBattle`)内部**:等战斗画面 → 检测防卫战倒计时(pipeline)→ 有倒计时=战斗中跑 auto_battle / 无倒计时按距离移动(move_w)→ 一层敌人清完(连续5秒无倒计时)→ `move_after_battle`:检测距离/传送点(防卫战空洞传送点 pipeline)/按键-交互 → 自移动 + F 交互进下一层 → 直到该半场胜利。**op 完整封装移动+战斗+阶段切换,不需外部干预**(详见 [画面 doc](../screens/式舆防卫战.md)「选配队与触发战斗」)。

Expand Down
Loading
Loading