Skip to content

Commit f68440a

Browse files
更新action
1 parent 324df31 commit f68440a

9 files changed

Lines changed: 209 additions & 316 deletions

File tree

‎.github/workflows/sync-okef-dungeons.yml‎

Lines changed: 0 additions & 52 deletions
This file was deleted.

‎.github/workflows/sync-okww-dungeons.yml‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ jobs:
4545
body: |
4646
检测到鸣潮副本数量有更新,已从 ok-wuthering-waves 的 `ForgeryTask.py`/`TacetTask.py`(`self.structure`)同步到 `config/dungeon_list.yml`。
4747
48-
- 新增数字的 display 为占位数字,**请人工改成友好名**(如 梦州-迅刀)
49-
- 移除的数字仅报告不删除(避免上游短暂回退时丢配置)
48+
- 鸣潮新增副本插在**最前方**,已有别名已自动整体后移对应位数
49+
- 最前方新增的占位 display 为数字,**请人工改成友好名**(如 梦州-迅刀)
50+
- 移除的数字仅报告不删除(无法安全重排,请人工核对)
5051
branch: auto-sync/okww-dungeons
5152
delete-branch: true

‎config/MAA一条龙.json‎

Lines changed: 0 additions & 71 deletions
This file was deleted.

‎src/config/set_config.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
| 绝区零 | 否(未接入) | `ZZZ一条龙.yml` | 同上 |
6666
| 崩铁 | 否(未接入) | `M7A一条龙.yml` | 同上 |
6767
| 异环 | 否(未接入,且无模板→no-op) | — | 同鸣潮 |
68-
| 粥 | no-op(无模板) | — | `_task_map` 固化为类属性(原由模板 `MAA一条龙.json` 推导,现不再加载模板)|
68+
| 粥 | no-op(无模板) | — | `_task_map` 固化为类属性(不再加载模板;原 `MAA一条龙.json` 模板已删除)|
6969

7070
## 设置副本流程 set_dungeon
7171

@@ -139,7 +139,7 @@ set_config("ok-ww", dungeon_name="未选择") # 跳过
139139
| `dungeon_config.py` | `dungeon_list.yml` 解析 |
140140
| `src/link.py` | 游戏/脚本链接集中管理(官网、B 站、GitHub、banner 下载);与 config 适配解耦。沿用基类 `GameLink` + 各脚本子类(`WutheringWavesLink`/`GenshinLink` 等)继承结构,`@register` 注册到 `_LINKS`,key 为 `_script_name`;本地背景图路径(`background`)仍声明在 set_config 子类,经 `_CONFIGS` 读取 |
141141
| `config/dungeon_list.yml` | 各脚本支持的副本及序列展示名,key 为 script_name |
142-
| `config/MAA一条龙.json` 等 | 各脚本 init 模板 |
142+
| `config/BGI一条龙.json` 等 | 各脚本 init 模板(粥无模板,`_task_map` 固化类属性)|
143143

144144
## 如何新增一个游戏适配
145145

‎tests/test_arknights_config_safety.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
os.path.dirname(__file__), "fixtures", "maa_gui.new.scrubbed.json"
2222
)
2323

24-
# TaskQueue 中 6 个 FightTask 的索引(与模板 MAA一条龙.json 一致)
24+
# TaskQueue 中 6 个 FightTask 的索引
2525
FIGHT_IDX = (1, 2, 3, 4, 5, 6) # 剿灭, 红票, 经验, 龙门币, 活动土, 土
2626

2727
# set_dungeon 只允许改动的字段路径集合

‎tests/test_sync_okww.py‎

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
"""sync_okww_dungeons 的单测:聚焦最前插入模型的重排逻辑(不触网)。
2+
3+
模块位于 tools/ 下、非 src 包,故手动将项目根加入 sys.path 后按命名空间包导入。
4+
"""
5+
6+
import os
7+
import sys
8+
import tempfile
9+
import unittest
10+
11+
_PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
12+
if _PROJECT_ROOT not in sys.path:
13+
sys.path.insert(0, _PROJECT_ROOT)
14+
15+
from ruamel.yaml import YAML # noqa: E402
16+
17+
import tools.sync_okww_dungeons as m # noqa: E402
18+
19+
_YAML = YAML()
20+
21+
22+
class TestRebaseSequences(unittest.TestCase):
23+
def test_delta_1_shifts_existing_and_prepends_placeholder(self):
24+
seqs = [
25+
{"display": "梦州-迅刀", "value": 1},
26+
{"display": "梦州-音感仪", "value": 2},
27+
]
28+
out = m._rebase_sequences(seqs, 1)
29+
self.assertEqual(
30+
out,
31+
[
32+
{"display": "1", "value": 1},
33+
{"display": "梦州-迅刀", "value": 2},
34+
{"display": "梦州-音感仪", "value": 3},
35+
],
36+
)
37+
38+
def test_delta_2_shifts_all_and_prepends_two(self):
39+
seqs = [{"display": "A", "value": 1}, {"display": "B", "value": 2}]
40+
out = m._rebase_sequences(seqs, 2)
41+
self.assertEqual(
42+
out,
43+
[
44+
{"display": "1", "value": 1},
45+
{"display": "2", "value": 2},
46+
{"display": "A", "value": 3},
47+
{"display": "B", "value": 4},
48+
],
49+
)
50+
51+
def test_result_sorted_ascending(self):
52+
seqs = [{"display": "X", "value": 5}, {"display": "Y", "value": 3}]
53+
out = m._rebase_sequences(seqs, 2)
54+
vals = [s["value"] for s in out]
55+
self.assertEqual(vals, sorted(vals))
56+
57+
58+
class TestApplyNewFrontInsert(unittest.TestCase):
59+
def _write_tmp(self, data: dict) -> str:
60+
with tempfile.NamedTemporaryFile(
61+
"w", suffix=".yml", delete=False, encoding="utf-8"
62+
) as tmp:
63+
_YAML.dump(data, tmp)
64+
return tmp.name
65+
66+
def test_apply_rebases_numeric_category_only(self):
67+
data = {
68+
"ok-ww": {
69+
"dungeons": [
70+
{
71+
"name": "凝素领域",
72+
"sequences": [
73+
{"display": "梦州-迅刀", "value": 1},
74+
{"display": "梦州-音感仪", "value": 2},
75+
],
76+
},
77+
{
78+
"name": "模拟领域",
79+
"sequences": [
80+
{"display": "共鸣者经验", "value": "共鸣者经验"}
81+
],
82+
},
83+
]
84+
}
85+
}
86+
path = self._write_tmp(data)
87+
try:
88+
m._DUNGEON_PATH = path
89+
# 生产里 upstream 只含数字分类(凝素领域/无音区),不含模拟领域
90+
upstream = {"凝素领域": 3}
91+
current = m._load_okww()
92+
m._apply_new(upstream, current)
93+
94+
with open(path, encoding="utf-8") as f:
95+
after = _YAML.load(f)
96+
dungeons = {d["name"]: d for d in after["ok-ww"]["dungeons"]}
97+
98+
seq = dungeons["凝素领域"]["sequences"]
99+
self.assertEqual(len(seq), 3)
100+
self.assertEqual(seq[0], {"display": "1", "value": 1}) # 新副本占位在最前
101+
self.assertEqual(
102+
[s["value"] for s in seq if s["display"] == "梦州-迅刀"], [2]
103+
) # 别名跟随后移
104+
self.assertEqual(
105+
[s["value"] for s in seq if s["display"] == "梦州-音感仪"], [3]
106+
)
107+
108+
# 模拟领域(value 为字符串)不在 upstream,应完全不动
109+
self.assertEqual(
110+
dungeons["模拟领域"]["sequences"],
111+
[{"display": "共鸣者经验", "value": "共鸣者经验"}],
112+
)
113+
finally:
114+
os.unlink(path)
115+
116+
def test_apply_skips_when_no_growth(self):
117+
data = {
118+
"ok-ww": {
119+
"dungeons": [
120+
{"name": "凝素领域", "sequences": [{"display": "A", "value": 1}]}
121+
]
122+
}
123+
}
124+
path = self._write_tmp(data)
125+
try:
126+
m._DUNGEON_PATH = path
127+
upstream = {"凝素领域": 1} # 无增长
128+
current = m._load_okww()
129+
with open(path, encoding="utf-8") as f:
130+
before = f.read()
131+
m._apply_new(upstream, current)
132+
with open(path, encoding="utf-8") as f:
133+
after = f.read()
134+
self.assertEqual(before, after) # 不变
135+
finally:
136+
os.unlink(path)
137+
138+
139+
if __name__ == "__main__":
140+
unittest.main()

‎tools/README.md‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
# tools/ 副本同步脚本
22

3-
config/dungeon_list.yml 各游戏副本列表维护总览。除原神外均可自动更新,GitHub Actions 每周六检测并开 PR;原神因 display 需人工套装配对走手动流程。本目录是开发/CI 工具,区别于 scripts/ 的实际运行脚本。
3+
config/dungeon_list.yml 各游戏副本列表维护总览。鸣潮/异环经 GitHub Actions 每周六检测并开 PR;终末地经 dungeons_source 运行期读取游戏自身配置、无需 Action;原神因 display 需人工套装配对走手动流程。本目录是开发/CI 工具,区别于 scripts/ 的实际运行脚本。
44

55
## 各游戏副本更新方式
66

77
| 游戏 | yml key | 副本数据源 | 更新方式 | 人工环节 |
88
|---|---|---|---|---|
9-
| 终末地 | ok-ef | ok-end-field assets/data/world_map.json 的 stages_dict | sync_okef_dungeons.py + Action 自动 | 无 |
10-
| 鸣潮 | ok-ww | ok-wuthering-waves ForgeryTask.py/TacetTask.py 的 self.structure | sync_okww_dungeons.py + Action 自动补数字 | 新数字改友好名 |
9+
| 终末地 | ok-ef | ok-ef 自身 world_map.json(dungeons_source 本地读取) | dungeons_source 运行期读取,无需 Action | 无 |
10+
| 鸣潮 | ok-ww | ok-wuthering-waves ForgeryTask.py/TacetTask.py 的 self.structure | sync_okww_dungeons.py + Action 自动重排(最前插入,已有别名后移) | 最前新增占位改友好名 |
1111
| 异环 | ok-nte | ok-nte AnomalyTask.py 的 _ID_RANGE | sync_oknte_dungeons.py + Action 自动补数字 | 新数字改友好名 |
1212
| 原神 | BetterGI | better-genshin-impact AutoTrackPath/Assets/tp.json | 手动 skill: sync-bgi-dungeons | 分类 + display 套装配对 |
1313
| 明日方舟 | MAA | 固定 | 无需更新 | — |
@@ -18,14 +18,13 @@ config/dungeon_list.yml 各游戏副本列表维护总览。除原神外均可
1818

1919
- 数据源可靠性:以脚本仓库自身代码/数据为准;bettergi-scripts-list 的 JS 层滞后不可作来源;AI 生成的 JSON 不可信。
2020
- 退出码:0 = 无差异,1 = 有差异未应用供 CI 判断,2 = 抓取/解析失败 CI 跳过。
21-
- --apply:自动补齐新增条目;移除仅报告不删除,防上游短暂回退丢配置。
21+
- --apply:鸣潮按最前插入模型重排——新增 delta 个时已有别名 value 整体 +delta、最前补占位;移除仅报告不删除(无法安全重排),防上游短暂回退丢配置。
2222
- yml 格式:由 yaml 统一管理,无注释、sort_keys=False 幂等,diff 只含真实增量。
23-
- Action 产物:自动更新开 PR,占位 display 需人工改友好名后合并;终末地无占位可直合。
23+
- Action 产物:自动更新开 PR,最前新增的占位 display 需人工改友好名、已有别名已被自动后移,核对后合并。
2424

2525
## 脚本用法
2626

2727
```bash
28-
python tools/sync_okef_dungeons.py
2928
python tools/sync_okww_dungeons.py --apply
3029
python tools/sync_oknte_dungeons.py
3130
```

0 commit comments

Comments
 (0)