Compare commits

..

558 Commits

Author SHA1 Message Date
pre-commit-ci[bot]
8d434fb84c chore: Auto update by pre-commit hooks [skip changelog] 2025-05-19 14:38:02 +00:00
status102
8681039067 chore: 点剧情
bug好多,再想想
2025-05-19 22:36:33 +08:00
status102
dd36585b16 fix: 逻辑取反 2025-05-19 20:59:56 +08:00
pre-commit-ci[bot]
b58917c74b chore: Auto update by pre-commit hooks [skip changelog] 2025-05-19 06:55:01 +00:00
status102
633fe73993 feat: 自动战斗自动点击剧情 2025-05-19 14:52:16 +08:00
status102
aa46d668d1 fix: 关卡内教程降低暂停按钮亮度,导致无法识别 2025-05-19 12:45:38 +08:00
status102
f76db36364 fix: mac platform 2025-05-18 23:36:54 +08:00
status102
7f4a95280c fix: 自动战斗编队时重复选中同一干员 2025-05-18 20:57:34 +08:00
status102
711041f190 perf: 自动战斗编队时增加干员组名输出 2025-05-18 19:56:25 +08:00
status102
21086dcf68 fix: 部分情况下刷理智连战使用AUTO模式时, 吃理智药溢出理智 2025-05-18 19:56:03 +08:00
uye
2c3b6ac50a feat: 更新解决方案 2025-05-18 19:54:40 +08:00
晓丶梦丶仁
743c51a4b5 fix: 开始行动 点击过快 2025-05-18 18:58:14 +08:00
github-actions[bot]
61ce039b12 chore: Auto Update Game Resources - 2025-05-18
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/15095131924

[skip changelog]
2025-05-18 10:45:40 +00:00
晓丶梦丶仁
f6788e6029 fix: 开始行动 ocr replace 2025-05-18 18:42:09 +08:00
uye
a7ed964cb0 fix: 延迟停止按钮叠加显示 2025-05-18 17:40:28 +08:00
Constrat
a91fc84942 fix: formatting ci prettier and clang
[skip changelog]
2025-05-18 11:21:02 +02:00
萨拉托加
66ef1f0836 fix: ocr fix (#12736)
* fix: ocr fix

* fix: 还原
2025-05-18 15:24:21 +08:00
uye
f0a3bbf16a chore: 修改 not in deploy plan 提示 2025-05-18 15:05:39 +08:00
uye
529fedd95e chore: point_states 改用 unordered_map 2025-05-18 14:06:20 +08:00
uye
434932d39a fix: ci format 2025-05-18 13:35:33 +08:00
uye
6601c6621c chore: 调整截图保存逻辑 2025-05-18 12:23:26 +08:00
筱竹聽雨
7a65be5fa5 chore: 尚蜀夜市招募黑名单添加新约能天使 (#12734)
chore:优化黑名单

将新约能天使加入黑名单
2025-05-18 08:37:21 +08:00
github-actions[bot]
0ca0de9663 chore: Auto Update Game Resources - 2025-05-17
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/15085694756

[skip changelog]
2025-05-17 13:31:06 +00:00
status102
c69ce8ca7a perf: 黄票绿票商店使用特征匹配 2025-05-17 21:21:40 +08:00
status102
9bccb24654 chore: 黄绿票商店任务整理 2025-05-17 21:11:25 +08:00
status102
0d4ffca813 fix: 指定战斗次数后剩余次数小于连战次数时,可能修改到非指定连战次数 2025-05-17 20:03:22 +08:00
晓丶梦丶仁
b13e4d022b Revert "perf: 黄票绿票商店使用特征匹配 (#12718)"
This reverts commit 57888f783e.
2025-05-17 18:54:29 +08:00
晓丶梦丶仁
110847e005 fix: IS4 竣工仪式 2025-05-17 15:13:46 +08:00
Manicsteiner
772424e920 chore: YostarJP ocr fix (#12729) 2025-05-17 11:34:49 +08:00
status102
57888f783e perf: 黄票绿票商店使用特征匹配 (#12718)
* perf: 黄票绿票商店使用特征匹配

* fix: task
2025-05-16 23:52:45 +08:00
Constrat
f4ee5356d1 fix: SSSBuffChoose for YostarEN 2025-05-16 11:42:54 +02:00
Loong
035fdaa6ca chore: find OpenCV features2d and xfeatures2d components (#12714) 2025-05-16 10:17:45 +01:00
status102
2d4c556bc6 perf: 简化基建任务自定义配置路径Readonly 2025-05-16 16:13:46 +08:00
status102
58a3157bb3 fix: FeatureMatch任务无法读取roi 2025-05-16 13:37:40 +08:00
status102
848ebeb747 feat: ProcessTask支持特征匹配 (#12701)
* feat: ProcessTask支持特征匹配

* chore: test

* fix: test

* docs: task文档
2025-05-16 13:13:48 +08:00
uye
989ba7ee52 chore: 矢量突破开始行动 2025-05-16 01:45:09 +08:00
vonnoq
53e3ec8273 fix: 繁中服悖論模擬 (#12711)
* fix: 繁中服悖論模擬

繁中服悖論模擬UI更新

* fix: 繁中服悖論模擬

繁中服悖論模擬UI更新
2025-05-16 00:39:26 +08:00
MistEO
dbc1f1f6da chore: ota.maa.plus -> api.maa.plus 2025-05-15 23:19:13 +08:00
github-actions[bot]
0d57e73bb4 chore: Auto Update Game Resources - 2025-05-15
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/15043371741

[skip changelog]
2025-05-15 11:07:01 +00:00
github-actions[bot]
cf4553fa0a chore: Auto Templates Optimization
Triggered by 0af71a9f32

[skip changelog]
2025-05-15 10:08:39 +00:00
Constrat
0af71a9f32 fix: remove cachie from optimize templates
what's the issue?
2025-05-15 12:07:08 +02:00
pre-commit-ci[bot]
6ab3b6cc56 chore: Auto update by pre-commit hooks [skip changelog] 2025-05-15 18:04:31 +08:00
Constrat
ec1de48e42 fix: update-resources.yml removal from res-update-game 2025-05-15 12:01:30 +02:00
github-actions[bot]
87e43d91f0 chore: Auto Update Game Resources - 2025-05-15
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/15041077348

[skip changelog]
2025-05-15 09:09:57 +00:00
uye
6104d0602b refactor: 重构干员识别
fix #12703
2025-05-15 14:17:53 +08:00
github-actions[bot]
f04b9a6409 chore: Auto Update Game Resources - 2025-05-15
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/15037893648

[skip changelog]
2025-05-15 06:10:32 +00:00
github-actions[bot]
4fbb831c44 chore: Auto Update Game Resources - 2025-05-15
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/15037365361

[skip changelog]
2025-05-15 05:30:34 +00:00
uye
9301ea44b1 chore: 调整 prts 颜色 2025-05-15 00:24:05 +08:00
uye
7e7beabb35 chore: 添加几个专精 ocrReplace 2025-05-14 23:39:13 +08:00
uye
eb5803fef7 Release v5.16.5 (#12688) 2025-05-14 23:22:28 +08:00
github-actions[bot]
24f2cb5cbf docs: Auto Update Changelogs of v5.16.5 (#12698)
* docs: Auto Generate Changelog of Release v5.16.5

* docs: changelog

* docs: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
Co-authored-by: 晓丶梦丶仁 <74444214+Daydreamer114@users.noreply.github.com>
2025-05-14 23:21:53 +08:00
uye
fb8f3b78ad fix: 凹开局干员直升精二选项显示时机错误 2025-05-14 22:25:27 +08:00
status102
abcaf2ee06 perf: 肉鸽不期而遇退出检测加个重试 2025-05-14 20:37:46 +08:00
萨拉托加
03188824f7 Revert "feat: 在肉鸽招募中增加m3作为群奶 (#12353)"
This reverts commit 76a007501a.
2025-05-14 16:54:48 +08:00
status102
340e2798a0 docs: 任务流color_scales注释优化 2025-05-14 16:18:02 +08:00
status102
f9d468f557 perf: 指定类型 2025-05-14 16:15:09 +08:00
status102
e71eb3985d fix: 连战次数乘号匹配失败 2025-05-14 15:55:33 +08:00
uye
5adb76e377 feat: 调整连战输出 2025-05-14 15:06:18 +08:00
Hao Guan
be0ff90b8a feat(mac): 新增基建配置 2025-05-14 13:57:25 +08:00
晓丶梦丶仁
cd723f2210 perf: store loading 2025-05-14 11:29:21 +08:00
晓丶梦丶仁
93ab1cc811 fix: yellow ticket items 2025-05-14 10:25:51 +08:00
uye
92421d464c chore: 简化代码 2025-05-14 10:18:02 +08:00
Loong
260ab6e839 ci: don't check github link (#12667)
* ci: don't check github link

* ci: remove cache

* chore: readd cache

---------

Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
2025-05-13 16:39:44 +02:00
status102
7e3e43e81a fix: ocrTask text 2025-05-13 21:43:07 +08:00
status102
3b3056a65f chore: 提示补全 2025-05-13 19:56:45 +08:00
status102
5aa1d74b96 chore: NumberReplace 2025-05-13 19:56:44 +08:00
status102
b9f196c3a1 feat: 特征匹配 (#10966)
* feat: 特征匹配

* chore: 测试内容

* refactor: 根据最新版本重新迁移, 移除多模板

* chore: Auto update by pre-commit hooks [skip changelog]

* chore: 测试移除

* fix: platform

* chore: docs

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-05-13 18:24:16 +08:00
MistEO
c7a8191e03 chore: 再次调整官网细节 2025-05-13 14:27:32 +08:00
MistEO
3a87307bda chore: 调整官网标题 2025-05-13 14:21:05 +08:00
晓丶梦丶仁
f0ff035546 Revert "fix: github change string to int (#12574)"
This reverts commit 539e2b48b2.
2025-05-13 13:23:05 +08:00
晓丶梦丶仁
81504417c7 fix: Store@UnderfundedOCR 2025-05-13 11:37:09 +08:00
晓丶梦丶仁
771c3e53b7 i18n: 绿票、黄票、活动商店 (#12674)
* i18n: en

* i18n: temp

* i18n: jp

* chore: YostarJP buy items

* fix: template task

* fix: en

* i18n: kr

* i18n: tw

---------

Co-authored-by: Manicsteiner <Manicsteiner@outlook.com>
2025-05-13 11:35:54 +08:00
晓丶梦丶仁
5cc7861d5c fix: store underfunded ocr full match 2025-05-13 00:46:51 +08:00
status102
61f25c94e5 fix: 再铲一屎 2025-05-13 00:03:02 +08:00
github-actions[bot]
8da46bf991 chore: Auto Update Game Resources - 2025-05-12
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14973978510

[skip changelog]
2025-05-12 13:49:04 +00:00
晓丶梦丶仁
26f421418e feat: 绿票、黄票、活动商店 (#12586)
* feat: 绿票、黄票商店

* i18n: EN fix

* feat: 活动商店

* perf: baseTask

* perf: 非代币关联性模板

* chore: Auto update by pre-commit hooks [skip changelog]

* perf: baseTask

* chore: sub

* chore: 修改截图

* chore: Auto update by pre-commit hooks [skip changelog]

* fix: 第一页买完之后无法进行活动商店购买

* fix: 买完皮肤、干员之后的 swipe

* chore: 修改描述

* perf: 购买商品确认next优化

* perf: 模板图复用

* chore: Auto update by pre-commit hooks [skip changelog]

* perf: 合并部分task

* fix: 代币不足

* fix: 代币不足 ocr

---------

Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-05-12 21:45:19 +08:00
uye
82dbe28b5e fix: cache 移动逻辑 2025-05-12 19:42:53 +08:00
status102
cc7c740921 fix: 这回应该铲完了
[skip changelog]
2025-05-12 19:09:00 +08:00
status102
4396c71802 fix: ubuntu unused 2025-05-12 18:59:23 +08:00
status102
351529d4cf fix: 铲屎包了个try
[skip changelog]
2025-05-12 18:49:24 +08:00
status102
eeeca5aa0f fix: 铲屎 2025-05-12 18:44:47 +08:00
uye
37c712637c fix: 修复了屎遇上手动覆盖文件的大聪明爆炸的问题 2025-05-12 18:40:51 +08:00
status102
3c995514a6 chore: mark 2025-05-12 17:37:09 +08:00
uye
5038576b75 chore: 调整 UI 与 Core 版本不一致的解决方案提示 2025-05-12 17:17:15 +08:00
uye
43952444bb chore: 点击任意职业回正列表 2025-05-12 15:49:14 +08:00
uye
1848caf82a refactor: 基建先进行技能识别并返回列表首位,再清空选择
fix #12659
2025-05-12 13:36:01 +08:00
status102
baff16c024 fix: 修复MaaCore asst.log文件句柄泄露 (#12639)
* fix: 尝试修复日志文件句柄泄露

* fix: platform

* fix: platform

* fix: platform

* fix: platform

* fix: cr-lf

* chore: useless
2025-05-11 19:34:01 +08:00
uye
894d540649 Release v5.16.4 (#12655) 2025-05-11 18:11:37 +08:00
uye
aef60f179c docs: Update CHANGELOG.md 2025-05-11 18:10:47 +08:00
status102
25903aba2d fix: 修复外服基建干员选择列表无法重置 (#12652)
fix #12649
2025-05-11 18:06:32 +08:00
status102
42f57797d7 style: format
[skip changelog]
2025-05-11 13:21:18 +08:00
MistEO
30ade6e2a6 ci: add mirrorchyan link to changelog 2025-05-11 01:53:53 +08:00
uye
017147f3f6 Release v5.16.3 (#12619) 2025-05-11 00:46:57 +08:00
github-actions[bot]
4c5afa12c7 docs: Auto Update Changelogs of v5.16.3 (#12640)
* docs: Auto Generate Changelog of Release v5.16.3

* docs: changelog

* docs: changelog

* docs: changelog

* docs: Update CHANGELOG.md

* docs: remove unnecessary bot

* docs: changelog

* docs: changelog

* docs: cahgenlog

* docs: Update CHANGELOG.md

* docs: 翻译

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
2025-05-11 00:44:27 +08:00
Rbqwow
2fa5c743cc docs: 用户协议 (#11666)
* docs: 初版用户协议

* docs: 贴合AGPL-3.0修改协议(1/2)

* docs: 贴合AGPL-3.0修改协议(2/3)

* docs: 贴合AGPL-3.0修改协议(3/3)

* docs: 用户协议添加tldr

* docs: review (2/3)

Co-authored-by: AnnAngela <naganjue@vip.qq.com>

* docs: 学姐:把森空岛拆出来

* docs: tldr增加免责说明

* docs: 改个词

* docs: 赦免Mirror酱

* docs: 来点加粗

* docs: 强调一下官方账号

* docs: 成年

* docs: 企鹅物流不一定匿名

* docs: 玛

a3d81c6029

* docs: 添加超链接引用

* docs: review

玛

* docs: Update terms-of-service.md

* docs: review

玛玛

* docs: 玛说要有镜,于是丽便有了光

* docs: 写多了 但我的 git rebase -i 坏掉了 只能再推个commit

* docs: 修改文档

* docs: 客户端反作弊

* docs: no deepseek anymore

---------

Co-authored-by: AnnAngela <naganjue@vip.qq.com>
Co-authored-by: MistEO <mistereo@hotmail.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
Co-authored-by: No-Deepseek <do-not-use-deepseek-to-suck-my-ass@rbqwow.icu>
2025-05-10 23:33:43 +08:00
uye
1702372f0f chore: 统一引号 2025-05-10 23:17:51 +08:00
status102
3dc32c1368 Revert "fix: 指定连战次数允许降低"
This reverts commit d6415c301b.
2025-05-10 23:13:16 +08:00
status102
d6415c301b fix: 指定连战次数允许降低 2025-05-10 23:11:02 +08:00
eneen
9bd75e6692 perf: 添加萨卡兹肉鸽劳作的清晨关卡策略 (#12626)
* perf: 添加萨卡兹肉鸽劳作的清晨关卡策略

* fix: typo

* chore: Auto update by pre-commit hooks [skip changelog]

* perf: ew摆放

* perf: replacement_home

* perf: 调整部署位置

* perf: 遗漏

* perf: 修改站位

---------

Co-authored-by: 晓丶梦丶仁 <74444214+Daydreamer114@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: 萨拉托加 <151550168+Saratoga-Official@users.noreply.github.com>
2025-05-10 22:39:36 +08:00
神楽坂アイリス
9dc8c05a73 feat: 添加 自定义 webhook 功能 (#12602)
* feat: 添加自定义Webhook通知功能

* chore: 删除无用文件

* chore: 调整格式,修改日志输出

* chore: 调整翻译位置

* chore: 使用 EnsureSuccessStatusCode 判断状态

* chore: 动态调整输入框高度

* fix: 修改 CustomWebhookBody 时报错

* feat: body 转义

---------

Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-05-10 20:05:52 +08:00
萨拉托加
00d1f93472 feat: 肉鸽适配新干员 (#12599)
* feat: 肉鸽适配新干员

* feat: 肉鸽适配新干员

* feat: 肉鸽适配新干员

* feat: 肉鸽适配新干员

* feat: 肉鸽适配新干员

* feat: 肉鸽适配新干员

* feat: 肉鸽适配新干员

* feat: 肉鸽适配新干员

* fix: 卫士不语功站位
2025-05-10 20:00:56 +08:00
uye
639c6d711b perf: 基建使用切换职业栏返回列表最左侧 (#12594)
肉鸽用不了,没有对应职业的话是灰的,除非全部匹配一遍,反正不长,还是慢慢划吧

fix #11782
2025-05-10 19:58:38 +08:00
uye
bd6176b25f fix: 开始战斗前闪退无限循环识别,关卡名检查放宽至一分钟 (#12580) 2025-05-10 19:58:07 +08:00
晓丶梦丶仁
e60a065ba4 fix: 肉鸽招募 练度不够干员的 priority 可能为正 2025-05-10 17:08:47 +08:00
uye
41c9643b38 feat: 调整提示颜色 2025-05-10 14:31:43 +08:00
status102
1e9d9ba5a0 perf: 连战减少不必要的次数调整 2025-05-10 14:00:04 +08:00
status102
678f0bd60e docs: 连战次数文档更新
`AUTO模式`相关说明
2025-05-10 13:52:06 +08:00
status102
9bffc02d7f chore: static 2025-05-10 12:33:47 +08:00
status102
9c020dd5f9 perf: 战斗次数识别错误处理 2025-05-10 12:33:30 +08:00
BxFS
e159598dc8 chore: 日志压缩包压缩等级提升 (#12622)
chore: support payload compression level optimal -> smallest
2025-05-09 19:40:03 +08:00
uye
022b39c25a chore: 修改连接失败提示描述 2025-05-09 16:22:57 +08:00
pre-commit-ci[bot]
e94e3888bb chore: Auto update by pre-commit hooks [skip changelog] 2025-05-09 07:45:41 +00:00
晓丶梦丶仁
ed2c55e81c fix: 切换账号失败 2025-05-09 15:43:22 +08:00
pre-commit-ci[bot]
b861c544a6 chore: Auto update by pre-commit hooks [skip changelog] 2025-05-09 06:01:16 +00:00
uye
c72d99a030 fix: 模拟器路径选择功能弹窗异常
fix #12612
2025-05-09 13:52:05 +08:00
status102
4a836290b9 perf: 关卡理智识别流程通用化 2025-05-09 10:45:41 +08:00
status102
34a5bfdd3d fix: 战斗次数识别错误缓解 2025-05-09 10:08:21 +08:00
github-actions[bot]
1a072e302e chore: Auto Update Game Resources - 2025-05-08
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14914121819

[skip changelog]
2025-05-08 19:06:31 +00:00
HX3N
e2e496122a chore: YostarKR BattleStartPre add ocrReplace pattern 2025-05-08 19:22:37 +09:00
uye
6ac61f2274 fix: 截图增强显示错误 2025-05-08 18:01:32 +08:00
Manicsteiner
a68ee788e1 chore: YostarJP ocr edits (#12607) 2025-05-08 17:42:55 +08:00
E022-23093
7022a6d298 feat: 更新 333 搓玉一天三换排班表 (#12604)
* feat: 更新 333 搓玉一天三换排班表

* fix:改了id

改了id
2025-05-08 17:38:58 +08:00
uye
5cda61f8a6 style: typo
[skip changelog]
2025-05-08 17:29:06 +08:00
uye
b37afbaec1 fix: 无法进入活动 2025-05-08 17:28:39 +08:00
uye
be075ab749 style: 统一引号格式 2025-05-08 17:27:20 +08:00
github-actions[bot]
6461d6a7e2 chore: Auto Update Game Resources - 2025-05-08
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14902851289

[skip changelog]
2025-05-08 09:08:14 +00:00
status102
68130ede6d refactor: HttpService调整, Post函数追加 (#12605)
* refactor: WpfGui拆解GetAsync, 暴露Exception, 增加PostAsync

* perf: 优化自动战斗获取作业时网络问题的输出
2025-05-08 16:44:27 +08:00
status102
2f7d4a6c91 perf: 优化自动战斗获取作业时网络问题的输出 2025-05-08 16:12:40 +08:00
status102
8a6982a144 refactor: WpfGui拆解GetAsync, 暴露Exception, 增加PostAsync 2025-05-08 15:50:16 +08:00
github-actions[bot]
5a2e2f2d6a chore: Auto Update Game Resources - 2025-05-08
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14901360586

[skip changelog]
2025-05-08 07:45:07 +00:00
uye
754b4135cc style: 统一引号格式 2025-05-08 15:05:07 +08:00
status102
966ded3836 fix: 关闭连战列表点击 2025-05-08 10:07:01 +08:00
status102
b9e69dde73 perf: 减少一次不必要的连战次数变更 2025-05-08 10:02:46 +08:00
status102
f184093732 fix: 关闭连战列表 2025-05-08 09:52:25 +08:00
uye
ef844da918 fix: 刷理智结束后卡在“理智药选择”界面
fix #12601
2025-05-08 09:40:20 +08:00
uye
a3ac79d999 chore: 好像提示了也没人看 2025-05-08 00:05:25 +08:00
status102
29b25079b8 feat(breaking change): 指定次数联动连战, 修复连战导致指定次数失效 (#12592)
* feat: 指定次数联动连战

* chore: Auto update by pre-commit hooks [skip changelog]

* perf: 适配指定次数

* fix: 移除不再使用的插件

* perf: 优化回调, 解耦

* chore: Auto update by pre-commit hooks [skip changelog]

* chore: 剩余理智使用 auto 连战

* fix: 最后一轮

* perf: 移除多余的理智识别

* chore(tools): ignore template

* perf: reduceTimes

* fix: 无药可用时, 升级恢复理智后不选择最高

* perf: 移除不再使用的task

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
2025-05-07 23:43:02 +08:00
status102
7059375a2f chore: sort [skip changelog] 2025-05-07 19:10:28 +08:00
bodayw
062397669f feat: 更新 243 极限效率一天四换排班表(20250507 修订) (#12598)
让见行者和信仰搅拌机到会客室上班 / Let Enforcer and Sankta Miksaparato work in the reception room

顺便补上了之前忘记备份到 old 子目录下的旧排班表(取 custom_infrast 目录内自 commit 3f858de 之后所有 feat 类改动的前一个版本,fix/chore 就不要了)

PS. 这次是我自己做的调整,公孙长乐的排班表并没有变化(他的视频不排会客室),不过还是把视频链接也更新了一下,另外考虑到用到了最新实装的干员,所以本 commit 也还是标记为 feat 吧
2025-05-07 19:09:03 +08:00
status102
c7d1718d97 chore: 加点常用的进来 2025-05-07 18:19:09 +08:00
status102
9d875538bf fix: 移除肉鸽难度hard code (#12587)
Revert "fix: mac下选择难度 999 导致卡死 (#12235)"

This reverts commit 0dbd5ee80b.
2025-05-07 14:06:25 +08:00
Hao Guan
6a05dfa694 feat(mac): AUTO连续作战
feat(mac): 优化下载作业UI
2025-05-07 13:14:53 +08:00
uye
109d20d3fd chore: 调整超时提醒输出 2025-05-07 13:09:27 +08:00
status102
e579d2c683 rft: 理智识别 2025-05-06 23:55:37 +08:00
status102
c3a7ae0c22 perf: 移除过旧的任务参数
涉及:
自动战斗: is_raid, is_adverse, add_user_additional
肉鸽任务: investment_enter_second_floor, investment_with_more_score
2025-05-06 18:21:55 +08:00
status102
558746add6 docs: 连战次数auto 文档 2025-05-06 18:11:32 +08:00
status102
d51895af57 fix: 连战次数修复, 减少hard code 2025-05-06 18:11:31 +08:00
Constrat
512ffa55bb ci: revert all markdown checker changes
nothing worked anyway

[skip changelog]
2025-05-06 11:21:38 +02:00
Constrat
56f2b35ea7 ci: try with action token:
[skip changelog]
2025-05-06 11:20:27 +02:00
Constrat
3086cee0cc ci: duplicate env keyword github_token
[skip changelog]
2025-05-06 11:12:12 +02:00
Constrat
66577b193c ci: reimplement contents: read
[skip changelog]
2025-05-06 11:08:18 +02:00
Constrat
35f28a7c29 ci: change to force --github-token
[skip changelog]
2025-05-06 11:07:22 +02:00
Constrat
245279711d ci: lychee dead links
[skip changelog]
2025-05-06 11:04:19 +02:00
Yoake
979f6699cc Reapply "feat:实现自适应调整连战次数 (#12555)"
This reverts commit 7359653317.

移除不相关的文件修改

---------

Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-05-06 16:57:04 +08:00
status102
7359653317 Revert "feat:实现自适应调整连战次数 (#12555)"
This reverts commit 254db83bf6.

Revert "chore: 新增 AUTO 选项"

This reverts commit 722302bc28.

Revert "chore: Auto update by pre-commit hooks [skip changelog]"

This reverts commit 22f88ef718.

Revert "chore: 连战新增 -1 表示禁用切换"

This reverts commit 4debf210bd.
2025-05-06 16:55:26 +08:00
uye
f311f8525e docs: 补上之前漏改的 tasks 路径修改 2025-05-06 16:03:22 +08:00
uye
4debf210bd chore: 连战新增 -1 表示禁用切换 2025-05-06 14:27:06 +08:00
uye
1eeae5326f chore: 优化提示 2025-05-06 11:05:21 +08:00
Lucien Shaw
ce3624cfbb docs: 更正保全派驻协议文档中的拼写错误 (#12578) 2025-05-06 10:51:19 +08:00
Lucien Shaw
632447e8d3 docs: 更正主文档和中文文档中的两处错别字 (#12577)
* docs: 更正中文文档中的一处拼写错误

将docs/zh-cn/readme.md中的“高姿”改为“高资”

* docs: 更正主文档中的一处拼写错误

在README.md中,将一处“高姿”修改为“高资”
2025-05-06 09:22:51 +08:00
uye
a5917adc1c Release v5.16.2 (#12568) 2025-05-06 01:38:43 +08:00
Constrat
c86ea9fa12 docs: changelog EN tweak 2025-05-05 19:26:32 +02:00
Constrat
539e2b48b2 fix: github change string to int (#12574) 2025-05-05 19:18:29 +02:00
uye
58c2c6eccd docs: update changelog 2025-05-06 00:17:23 +08:00
uye
8eb49dc463 Revert "feat: 更新 CHANGELOG.md"
This reverts commit a47b1d427b.
2025-05-06 00:12:57 +08:00
uye
cd44b22b8c Revert "feat: 更新 CHANGELOG.md"
This reverts commit e89e3d3f35.
2025-05-06 00:12:51 +08:00
uye
1f7b675d04 fix: 无法进入中枢 2025-05-06 00:03:35 +08:00
AnnAngela
e89e3d3f35 feat: 更新 CHANGELOG.md 2025-05-05 22:31:53 +08:00
AnnAngela
a47b1d427b feat: 更新 CHANGELOG.md 2025-05-05 22:24:48 +08:00
uye
774cc6d6fe docs: Update CHANGELOG.md 2025-05-05 22:23:50 +08:00
uye
c740e71900 docs: Update CHANGELOG.md 2025-05-05 22:18:21 +08:00
uye
a73eb5d52d docs: Update CHANGELOG.md 2025-05-05 22:01:38 +08:00
uye
7dfae900f1 chore: 简化定时器判断 2025-05-05 21:20:09 +08:00
Constrat
edb5e0f7fc docs: english changelog fixes
[skip changelog]
2025-05-05 14:56:58 +02:00
AnnAngela
e9f0353d01 ci: 使用 GITHUB_TOKEN 2025-05-05 20:33:52 +08:00
AnnAngela
bc734f288b ci: 使用缓存避免429 2025-05-05 20:24:49 +08:00
AnnAngela
89f4d927a4 feat: Update CHANGELOG.md [skip changelog] 2025-05-05 19:56:27 +08:00
AnnAngela
54c434c547 feat: Update CHANGELOG.md [skip changelog] 2025-05-05 19:55:36 +08:00
AnnAngela
bb0d148fae feat: Update CHANGELOG.md [skip changelog] 2025-05-05 19:55:20 +08:00
AnnAngela
cd42686824 feat: Update CHANGELOG.md [skip changelog] 2025-05-05 19:54:20 +08:00
github-actions[bot]
7c9b12113f docs: Auto Update Changelogs of v5.16.2 (#12571)
* docs: Auto Generate Changelog of Release v5.16.2

* feat: Update CHANGELOG.md

* i18n: EN Changelog

* feat: 更新 CHANGELOG.md

* feat: 更新 CHANGELOG.md

* i18n: EN Changelog sanity update

* docs: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: AnnAngela <naganjue@vip.qq.com>
Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-05-05 19:24:51 +08:00
pre-commit-ci[bot]
22f88ef718 chore: Auto update by pre-commit hooks [skip changelog] 2025-05-05 09:05:58 +00:00
uye
722302bc28 chore: 新增 AUTO 选项 2025-05-05 17:03:35 +08:00
Constrat
188e55450a i18n: english clarification for operbox) 2025-05-05 10:22:34 +02:00
Constrat
df2edc4bd4 chore(tools): update ignore templates
[skip changelog]
2025-05-05 10:12:03 +02:00
uye
c9672599a0 perf: 优化干员识别 (#12562)
* perf: 优化干员识别

* fix: typo
2025-05-05 16:02:34 +08:00
uye
6c80f26542 chore: 修改错误提示 2025-05-05 15:54:22 +08:00
KirinBaka
7cd6873085 fix: correct variable name typo in cur_score (#12552)
Fixed typo in variable name 'cur_score' (misspelled 'cur_socre')
2025-05-05 15:45:58 +08:00
Yoake
254db83bf6 feat:实现自适应调整连战次数 (#12555)
* feat:实现自适应调整连战次数

* fix: redundant operation

* fix: 掉落物回报、理智回报失效

* chore: Auto update by pre-commit hooks [skip changelog]

* fix: typo

* feat: 添加无理智药时的识别

* chore: 删除无用 include

* chore: Auto update by pre-commit hooks [skip changelog]

* chore: 异常时返回 -1

---------

Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-05-05 15:07:38 +08:00
HX3N
6b6bed6c4d chore: YostarKR Infrast and texts (#12561)
* chore: InfrastCloseQuickFormationExpandRole

* i18n: tweak some translation and add mini game tip
2025-05-04 16:17:21 +02:00
github-actions[bot]
c11543f5a4 chore: Auto Templates Optimization
Triggered by 31cc95fb7f

[skip changelog]
2025-05-04 11:49:52 +00:00
uye
31cc95fb7f fix: 无法进入中枢 2025-05-04 19:49:28 +08:00
github-actions[bot]
457ffe67de chore: Auto Templates Optimization
Triggered by d53509ff06

[skip changelog]
2025-05-04 08:55:09 +00:00
Constrat
d53509ff06 chore: add templates for #12556 and i18n for minigame 2025-05-04 10:45:36 +02:00
Manicsteiner
6d8a4c7a5b chore: YostarJP infrast and texts (#12559) 2025-05-04 10:41:09 +02:00
uye
e2c19995c2 fix: 基建选人前收起职业栏 (#12556)
* fix: 基建选人前收起职业栏

* chore: Auto update by pre-commit hooks [skip changelog]

* fix: 赠送线索给不需要的好友

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-05-04 14:14:54 +08:00
Constrat
3f10c972cd chore: update ignore templates 2025-05-03 20:57:25 +02:00
Constrat
d3730cc0da chore: remove typos from ignore templates
[skip changelog]
2025-05-03 20:55:24 +02:00
uye
b5b357938e docs: Update CHANGELOG.md 2025-05-04 01:05:11 +08:00
uye
805b76f113 Release v5.16.1 (#12547) 2025-05-04 01:01:37 +08:00
github-actions[bot]
4c5ae67063 docs: Auto Update Changelogs of v5.16.1 (#12550)
* docs: Auto Generate Changelog of Release v5.16.1

* docs: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-05-04 01:01:07 +08:00
uye
8a97330be3 fix: 修正描述 2025-05-04 00:59:13 +08:00
Lemon-miaow
623e542f45 fix: 修复GetImageFromROI小工具以适配多文件tasks结构 2025-05-04 00:16:54 +08:00
APeng215
7350401ddd fix: 修复开发者帮助文档内的 Typo (#12549)
* 修复开发者帮助文档内的 Typo(简体中文)

* 修复开发者帮助文档内的 Typo(繁体中文)
2025-05-03 23:49:20 +08:00
Constrat
c4db21dd2b chore(tools): ignore list templates for global 2025-05-03 17:22:38 +02:00
status102
d713ca59e3 chore: 调整简中繁中一键轮换说明 2025-05-03 22:02:32 +08:00
status102
b3203ad848 perf: VC++执行安装脚本暴露错误 2025-05-03 21:52:18 +08:00
github-actions[bot]
89a42be269 chore: Auto Templates Optimization
Triggered by 218e9ec31a

[skip changelog]
2025-05-03 05:48:49 +00:00
uye
218e9ec31a fix: 无法切换连战次数 2025-05-03 13:48:31 +08:00
github-actions[bot]
ba26b64b22 chore: Auto Update Game Resources - 2025-05-03
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14808017611

[skip changelog]
2025-05-03 05:45:04 +00:00
uye
33b54e81b0 fix 不能正确选择干员CONFESS-47
fix #12543
2025-05-03 13:41:45 +08:00
uye
cb64ca4b13 fix: 修复一键轮换模式未勾选设施导致功能异常问题
fix #12542
2025-05-03 13:38:23 +08:00
uye
e6549f0bf6 chore: 添加渐变附加属性 2025-05-03 12:54:14 +08:00
uye
5466678785 chore: 移除干员识别测试说明 2025-05-03 11:56:36 +08:00
uye
8f279dc1b4 chore: 移除 depot 测试提示 2025-05-03 11:53:43 +08:00
uye
60c83e78e1 chore: depot 图片只在 debug 模式下保存 2025-05-03 11:52:19 +08:00
github-actions[bot]
e63de8df32 chore: Auto Templates Optimization
Triggered by 053e11c9ba

[skip changelog]
2025-05-02 16:29:11 +00:00
uye
053e11c9ba fix: 未展开职业分组时编队错误
fix #12529
2025-05-03 00:28:47 +08:00
Constrat
fbf48ebefd feat(resourceupdater): double int and string map lookup for infrast_data 2025-05-02 10:33:09 +02:00
uye
7ef4343f16 chore: 优化赠送单抽逻辑 2025-05-02 09:41:38 +08:00
uye
3e75ec507f chore: All mirrors are not available 时日志栏显示更新失败 2025-05-02 00:58:49 +08:00
uye
94a0a4d916 fix: 更新未切换基建模式会导致变回常规模式 2025-05-01 22:43:22 +08:00
github-actions[bot]
ca605edffd docs: Auto Update Changelogs of v5.16.0 (#12503)
* docs: Auto Generate Changelog of Release v5.16.0

* docs: Update CHANGELOG.md

* feat: Update CHANGELOG.md

* feat: Update CHANGELOG.md

Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>

* feat: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
Co-authored-by: AnnAngela <naganjue@vip.qq.com>
Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
2025-05-01 21:52:27 +08:00
uye
7177e48d5c Release v5.16.0 (#12501) 2025-05-01 21:51:08 +08:00
Constrat
14c809a9ac fix: map classifyType bypass for global (until gamedata change as well) 2025-05-01 15:43:07 +02:00
uye
ad4f4a93c0 chore: classifyType 映射 2025-05-01 21:18:00 +08:00
Constrat
5add3a5d8a fix(resourceupdater): change roomType to int for infraststructure gamedata 2025-05-01 14:49:25 +02:00
Constrat
f3f8264b53 chore: arknights tile pos resources + battle data 2025-05-01 14:17:04 +02:00
github-actions[bot]
3e30750da7 chore: Auto Templates Optimization
Triggered by 715c2c13b5

[skip changelog]
2025-05-01 11:19:42 +00:00
uye
715c2c13b5 fix: 神秘的鹰小姐修改了他的干员职业图标亮度 2025-05-01 19:19:15 +08:00
Constrat
8d02395657 chore: MT stages for Official 2025-05-01 13:14:36 +02:00
Hao Guan
824d3bfebe feat(mac): 争锋频道:青草城 2025-05-01 19:07:46 +08:00
Constrat
88a0b97224 chore: manually update version.json 2025-05-01 12:23:53 +02:00
github-actions[bot]
d6f73bc753 chore: Auto Templates Optimization
Triggered by d1c09cc01a

[skip changelog]
2025-05-01 10:20:08 +00:00
Constrat
d1c09cc01a chore: Manual update resources 2025-05-01 12:19:43 +02:00
uye
d65cde7574 fix: 适配新基建 (#12500)
* fix: 适配新基建

* chore: Auto update by pre-commit hooks [skip changelog]

* fix: 卡在会客室

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-05-01 18:08:34 +08:00
uye
afaeb011cf chore: 不启用外部通知时隐藏可选项 2025-05-01 18:05:08 +08:00
SherkeyXD
fa42a0880e fix: 修正送抽任务 2025-05-01 16:35:10 +08:00
SherkeyXD
2a32052ab0 feat: 特殊月卡扩大识别范围 2025-05-01 16:30:22 +08:00
SherkeyXD
1dba23a93e feat: 幸运墙适配六周年 2025-05-01 16:24:14 +08:00
SherkeyXD
9592b1fd40 feat: SideStory「众生行记」导航 2025-05-01 16:22:23 +08:00
uye
6deea622bd chore: 优化训练室和加工站进站逻辑 2025-05-01 15:13:43 +08:00
BxFS
503d653330 fix: CheckLevelMax too fast without delay (#12498) 2025-05-01 08:35:44 +02:00
uye
fe5744f328 fix: 构建日期显示错误 2025-05-01 14:00:47 +08:00
github-actions[bot]
abcc3ba100 chore: Auto Update Game Resources - 2025-04-30
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14763354859

[skip changelog]
2025-04-30 20:06:50 +00:00
uye
0b058bb0d9 fix: 下载源选择 MirrorChyan 时如果关闭自动下载,手动点击软件更新无提示 2025-05-01 01:16:03 +08:00
Plumess
c62d2ac4f8 feat: 更新技能识别模型,采用更全面的数据集训练 (#12490)
使用更全面的数据集对模型进行了重训练,包括了有计划的主线、SideStory、肉鸽等场景。
2025-04-30 23:12:24 +08:00
uye
9a81315b7f docs: 移除过期描述 2025-04-30 15:55:43 +08:00
BxFS
42f9b80be3 fix: EN RoutingRefreshNodeConfirm roi too small (#12491) 2025-04-30 13:45:14 +08:00
uye
57cde24e99 Release v5.16.0-beta.1 (#12488) 2025-04-29 22:27:55 +08:00
github-actions[bot]
f775b2a551 docs: Auto Update Changelogs of v5.16.0-beta.1 (#12489)
docs: Auto Generate Changelog of Release v5.16.0-beta.1

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-29 22:26:31 +08:00
uye
756f352c02 fix(BREAKING CHANGE): RecruitSupportOperator 拼写错误 2025-04-29 19:49:54 +08:00
uye
f574b14ed4 fix: vc++ 检测移动至文件检测后 2025-04-29 19:49:54 +08:00
Lemon-miaow
ef99f63311 feat: 适配基建队列轮换与干员休整 (#11252)
* feat: 创建使用游戏内基建配置换班功能 (WPF)

* feat: 基于上游更新适配游戏内基建配置换班功能 (WPF)

* feat: 适配队列轮换与干员休整(Core)

* chore: Auto update by pre-commit hooks [skip changelog]

* feat: 优化基建选项UI

* chore: Auto update by pre-commit hooks [skip changelog]

* perf: enum

* feat: 新增mode值合并infrast_rotation

* docs: 新增一键轮换字段

* rft: 同步 tasks.json 未拆分部分的修改

* perf: 合并界面

* rft: test

* fix: enum binding

搞不懂calcBinding了

* docs: update mode descriptions

* perf: 移除CustomInfrastEnabled

* perf: 简化参数设置

* chore: 添加提示

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-29 19:12:27 +08:00
github-actions[bot]
62b72b0faa chore: Auto Templates Optimization
Triggered by c988b7463d

[skip changelog]
2025-04-29 08:35:43 +00:00
BxFS
c988b7463d fix: EN RoutingRefreshNode dimension too large (#12484) 2025-04-29 10:28:54 +02:00
HX3N
ee281863ff fix: KR RoutingRefreshNode dimension too large (#12487)
* fix: KR RoutingRefreshNode dimension too large

* chore: height changed to 16px

* chore: changed template to improve recognition score
2025-04-29 10:28:49 +02:00
Constrat
08f78a3151 chore: ignore templates for global 2025-04-29 10:21:15 +02:00
Plumess
af34bb6a6f feat: 优化技能识别模型 (#11984)
* chore: 更新技能识别测试例 test_skill_ready()

1. 由于更新了技能识别为三分类模型,新增”可取消“类别,增加相关类别的测试;
2. 扩充了输出信息,便于Debug;

* feat: 调整技能识别推理函数,支持新的三分类模型

1. 新的三分类模型基于MobileNetv4训练并导出onnx,详情参考MaaAI仓库中的技能识别训练代码;
2. 新增”可取消“分类,标签为c,但暂不启用区分,与”未就绪“同样归于not ready;
3. 新增了部分前处理操作,以匹配模型的输入;

* perf: 使用 MobileNetv4 Small 重新训练了技能识别模型,改为三分类

新增”可取消“状态,即技能可能处于”可取消“,”未就绪“,”已就绪“三种状态;
新的三分类模型基于MobileNetv4 Conv Small 训练并导出,详情参考MaaAI仓库中的技能识别训练代码;

* feat: 调整技能识别自动截图,支持三分类

新增在debug模式下对”可取消“新类别的截图保存功能;

* chore: 存储截图时打印分数

* chore: 使用 ranges

* perf: 使用新训练集,基于官方mobilenetv4_conv_small的权重进行微调

16000张左右的训练集,在3000张测试集中准确率99.7%

---------

Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-29 14:30:24 +08:00
Daydreamer114
0e5ed3be50 perf: 修改小游戏描述 2025-04-29 11:48:00 +08:00
Constrat
6f3bc269d6 i18n: EN tweak
[skip ci] [skip changelog]
2025-04-28 15:24:37 +02:00
Constrat
68d7ac593b i18n: EN tweak
[skip ci] [skip changelog]
2025-04-28 14:39:58 +02:00
萨拉托加
ab664d74fb Release v5.15.6 (#12478) 2025-04-28 20:10:51 +08:00
github-actions[bot]
aba41f09c0 docs: Auto Update Changelogs of v5.15.6 (#12479)
* docs: Auto Generate Changelog of Release v5.15.6

* feat: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: AnnAngela <naganjue@vip.qq.com>
2025-04-28 19:10:22 +08:00
github-actions[bot]
2dc6745fdb chore: Auto Update Game Resources - 2025-04-28
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14705082471

[skip changelog]
2025-04-28 09:59:59 +00:00
晓丶梦丶仁
5820fb202d feat: 争锋频道:青草城 (#12470)
* feat: 争锋频道:青草城

* fix: end

* fix: 鸭宝不在

* perf: 公开 wpfgui 的自定义任务

* Revert "perf: 公开 wpfgui 的自定义任务"

This reverts commit 536864caa2.

* feat: 加一个丑爆了的界面

* chore: 修改描述

* chore: 修改描述

* chore: 统一按钮大小

* chore: 添加停止功能

* chore: 添加停止按钮

---------

Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-28 17:34:06 +08:00
uye
cba20d7835 fix: 连战次数无法保存 2025-04-28 17:19:52 +08:00
status102
81f8ad902d fix: 漏了一个 2025-04-28 15:33:45 +08:00
status102
426d76ee50 rft: Wpf长草任务添加部分解耦 2025-04-28 14:49:44 +08:00
status102
dd82fa0075 chore: meoJson update to v4.3.4 (#12460)
* chore: meoJson update to v4.3.2

* chore: meoJson update to v4.3.4
2025-04-28 14:31:12 +08:00
github-actions[bot]
91b53a4b73 chore: Auto Update Game Resources - 2025-04-28
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14699190648

[skip changelog]
2025-04-28 02:54:50 +00:00
status102
12fc5bbde3 perf: move
[skip changelog]
2025-04-27 23:42:47 +08:00
status102
6cfab2c1f0 perf: Task加载检查前重复任务 2025-04-27 23:36:55 +08:00
Constrat
730b9b2ad9 fix: move operator Flint in front of item Flint (点火石) for EN 2025-04-27 16:10:22 +02:00
Constrat
ddbf647524 feat: Sarkaz IS EN squads DLC 1 2025-04-27 15:37:26 +02:00
status102
6e9ef3c66e chore: ConfigurationHelper.GetValue增加enum, DeleteValue额外返回旧值 2025-04-27 19:43:58 +08:00
Constrat
1ad6f70b55 fix: Fang Alter EN OCR 2025-04-27 10:21:34 +02:00
Constrat
9e990c337a fix: Alter operators for EN 2025-04-27 10:15:03 +02:00
uye
8733055e83 Release v5.15.5 (#12466) 2025-04-27 03:23:17 +08:00
github-actions[bot]
e8885dc095 docs: Auto Update Changelogs of v5.15.5 (#12467)
* docs: Auto Generate Changelog of Release v5.15.5

* docs: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-27 03:21:19 +08:00
uye
0d140c1b46 fix: 无法热更 2025-04-27 03:17:01 +08:00
uye
1f29f9dc16 fix: MaaCore.vcxproj 2025-04-27 01:37:33 +08:00
uye
505ba76fea fix: DEBUG 加载错误 2025-04-27 01:37:33 +08:00
SherkeyXD
e76e95c0a4 rft: rename base stage 2025-04-27 00:11:50 +08:00
github-actions[bot]
aff4ef43fa chore: Auto Update Game Resources - 2025-04-26
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14682880925

[skip changelog]
2025-04-26 16:05:59 +00:00
SherkeyXD
e4aa506cb4 fix: BB task fix 2025-04-26 23:57:41 +08:00
Sherkey Asher
7c5fe215ac Release v5.15.4 (#12463) 2025-04-26 23:36:49 +08:00
github-actions[bot]
ced3843c4b docs: Auto Update Changelogs of v5.15.4 (#12464)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Sherkey Asher <57581480+SherkeyXD@users.noreply.github.com>
2025-04-26 23:26:26 +08:00
github-actions[bot]
5f30226d99 chore: Auto Update Game Resources - 2025-04-26
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14681959054

[skip changelog]
2025-04-26 14:05:34 +00:00
github-actions[bot]
2e30ef6169 chore: Auto Templates Optimization
Triggered by 3b0093c13c

[skip changelog]
2025-04-26 13:54:30 +00:00
SherkeyXD
3b0093c13c feat: 六周年月卡 2025-04-26 21:53:34 +08:00
HX3N
3416a47b26 fix: YostarKR OrundumActivitiesConfirm add ocrReplace 2025-04-26 17:53:19 +09:00
status102
d646af45ca chore: meojson调试增强 2025-04-26 15:27:27 +08:00
Constrat
c69fd51bc9 docs: add ADB connection tip for bluestacks and ldplayer 2025-04-25 18:12:05 +02:00
Constrat
4fb83a9bca fix: missing roguelike sami writer to json for resource updater 2025-04-25 17:26:27 +02:00
BxFS
abf69a9c63 fix: 定时执行tooltip修正 (#12453)
fix: TimerSettings CheckBox ToolTip CheckBoxesNotSaved->CheckBoxesNotSavedAsNull
2025-04-25 22:43:42 +08:00
HX3N
436643db9c chore: YostarKR IS5 squads and ocr update (#12455) 2025-04-25 16:42:38 +02:00
Constrat
1311a40126 style: resource updater 2025-04-25 16:40:17 +02:00
github-actions[bot]
dc49df6c0d chore: Auto Update Game Resources - 2025-04-25
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14666981411

[skip changelog]
2025-04-25 14:32:16 +00:00
Constrat
209902466a Revert "chore: Auto Update Game Resources - 2025-04-25"
This reverts commit 317a0d5224.
2025-04-25 16:29:23 +02:00
Constrat
6f0426b285 chore: use sami json for gain and user ocr in resource updater 2025-04-25 16:29:09 +02:00
github-actions[bot]
317a0d5224 chore: Auto Update Game Resources - 2025-04-25
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14666833323

[skip changelog]
2025-04-25 14:25:29 +00:00
Constrat
193525cacb chore: YostarKR ocr fix
------

Co-Authored-by: HX3N <scarlet7518@gmail.com>
2025-04-25 16:20:56 +02:00
Constrat
e32b526e81 fix: main.cpp post refactor merge 2025-04-25 16:13:48 +02:00
Constrat
96751335d3 chore: add big tasks refactoring to blame ignore 2025-04-25 15:42:19 +02:00
Constrat
2e6df0af8e chore: remove duplicate tasks from main json of KR and JP 2025-04-25 15:38:58 +02:00
Constrat
43d13f5aaf chore: remove debug task from IS EN
[skip ci]
2025-04-25 15:12:46 +02:00
Constrat
6c405da322 chore: YostarJP IS5 squads update
---------

Co-authored-by: Manicsteiner <63437036+Manicsteiner@users.noreply.github.com>
2025-04-25 15:00:38 +02:00
Constrat
dce6e317c8 rft: tasks (#12448)
* rft: tasks

* chore: remove older tasks.json

* rft: move some stages

* chore: Auto update by pre-commit hooks [skip changelog]

* rft: rename

---------

Co-authored-by: SherkeyXD <57581480+SherkeyXD@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-25 18:31:37 +08:00
status102
fdc76bc5b5 feat: VC++可用性检查 (#12445)
* feat: VC++可用性检查

* i18n: too low

terrain
2025-04-25 15:59:51 +08:00
uye
2f8840feac chore: to utc time 2025-04-25 15:36:07 +08:00
HX3N
f98a595620 i18n: KR translation tweak
[skip changelog]
2025-04-25 13:24:55 +09:00
Constrat
2a7729074a chore: remove dupes from resource updater I.S. stages 2025-04-24 20:31:33 +02:00
github-actions[bot]
40e607c98f chore: Auto Update Game Resources - 2025-04-24
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14648860019

[skip changelog]
2025-04-24 18:25:57 +00:00
Constrat
351395f5b9 fix: txwy resource updater recruitment 2025-04-24 20:22:55 +02:00
Constrat
3e38b59f0c chore: add more text for OrundumActivities EN 2025-04-24 19:26:15 +02:00
uye
079932e34c Release v5.15.3 (#12420) 2025-04-25 00:09:06 +08:00
uye
9666b4a42b docs: Update CHANGELOG.md 2025-04-25 00:07:51 +08:00
Manicsteiner
8779c867bf chore: YostarJP ocr fix (#12447) 2025-04-25 00:03:38 +08:00
uye
d10c90bc79 feat: 使用 mumu 网络桥接时通过填写的实例号关闭模拟器 2025-04-24 23:24:29 +08:00
萨拉托加
ac83069b99 chore: issue模板添加使用生成日志压缩包按钮提示 (#12386)
* chore: issue模板添加使用生成日志压缩包按钮提示

* chore: Update cn-ld-report.yaml

* chore: Update cn-mumu-report.yaml

* chore: Update en-bug-report.yaml
2025-04-24 22:31:32 +08:00
status102
8077d73a9b docs: changelog 2025-04-24 18:02:15 +08:00
Rbqwow
e5357e7dd7 feat: 优化官网动画效果 (#12432)
优化友链列表出现消失动画
为底部许可证文本添加动画
修复点击查看全部后按钮乱跳
整理注释
2025-04-24 17:31:59 +08:00
github-actions[bot]
f87be175e1 docs: Auto Update Changelogs of v5.15.3 (#12441)
* docs: Auto Generate Changelog of Release v5.15.3

* feat: changelog

* docs: Update CHANGELOG.md

* docs: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: AnnAngela <naganjue@vip.qq.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-24 17:26:32 +08:00
HY
316dd9a005 chore: 繁中服「太陽甩在身後」活動導航 (#12444)
* chore: 繁中服「太陽甩在身後」活動導航

* chore: 補充許願牆的 text
2025-04-24 17:11:46 +08:00
github-actions[bot]
6f07b16388 chore: Auto Update Game Resources - 2025-04-24
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14636183461

[skip changelog]
2025-04-24 07:43:55 +00:00
github-actions[bot]
b59b42345a chore: Auto Update Game Resources - 2025-04-24
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14635512901

[skip changelog]
2025-04-24 07:06:30 +00:00
uye
f80ec0b232 style: 丢失的空格
[skip changelog]
2025-04-24 14:38:23 +08:00
uye
0cab88a1fb feat: 添加任务超时提示 (#12430)
* test: 添加 block 任务

* feat: 添加任务超时提醒

* feat: 外部通知添加超时提醒

* chore: 提示时间改为四舍五入

* chore: 外部通知额外输入最后五条日志

* chore: 调整日志输出日期
2025-04-24 09:54:40 +08:00
Hao Guan
f5b8fe18e1 fix(mac): 仅公招识别配置(#12161)
feat(mac): 商店列表界面改进
2025-04-23 14:03:50 +08:00
uye
8fb76030b2 chore: 优化运行库下载脚本 2025-04-22 19:59:45 +08:00
github-actions[bot]
0234f2d274 chore: Auto Update Game Resources - 2025-04-22
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14593234281

[skip changelog]
2025-04-22 11:05:38 +00:00
github-actions[bot]
018955d010 chore: Auto Update Game Resources - 2025-04-22
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14591436939

[skip changelog]
2025-04-22 09:29:17 +00:00
Constrat
ed361efcd3 chore: YostarEN PV preload 2025-04-22 11:21:17 +02:00
uye
08665869ea chore: 员工守则 2025-04-22 17:18:46 +08:00
HX3N
2b0ad53830 chore: YostarKR PV preload (#12431) 2025-04-22 11:17:38 +02:00
Manicsteiner
f5010a3681 chore: YostarJP PV preload (#12429) 2025-04-22 14:32:07 +08:00
status102
072592c49a perf: 任务列表查副本
fix #12426
2025-04-22 11:19:08 +08:00
uye
45e55c0eaf chore: 拆分任务完成后通知 2025-04-22 10:15:17 +08:00
萨拉托加
d32ed24879 chore: 添加保全派驻作业 (#12423)
* chore: Rename

* chore: 添加保全派驻作业

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-21 22:42:49 +08:00
github-actions[bot]
8c83b5e2d2 chore: Auto Templates Optimization
Triggered by 8a33102408

[skip changelog]
2025-04-21 14:01:50 +00:00
uye
8a33102408 chore: 新增 15 章导航 2025-04-21 22:01:24 +08:00
MistEO
432a51a238 fix: 修正官网域名 2025-04-21 18:44:42 +08:00
MistEO
39dce2a0e1 docs: 移除 MaaX 相关说明 2025-04-21 18:12:05 +08:00
github-actions[bot]
c58e0a0e92 chore: Auto Update Game Resources - 2025-04-21
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14570494553

[skip changelog]
2025-04-21 08:47:29 +00:00
MistEO
5e30ffc714 ci: Delete trigger that are no longer needed 2025-04-21 13:57:57 +08:00
github-actions[bot]
68a5ef3f85 chore: Auto Update Game Resources - 2025-04-20
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14563291382

[skip changelog]
2025-04-20 21:04:59 +00:00
github-actions[bot]
d1bb221096 chore: Auto Update Game Resources - 2025-04-20
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14562878694

[skip changelog]
2025-04-20 20:05:36 +00:00
SherkeyXD
0743e1773b style: 优化部分文件排版 2025-04-20 21:27:47 +08:00
uye
fafd1970be chore: 修改存在更新时的问题反馈界面描述 2025-04-20 20:50:49 +08:00
Constrat
446ec8b8f6 style: precommit clang? 2025-04-20 11:26:52 +02:00
status102
07e561fae8 perf: wpf反馈压缩包分离日志和配置 2025-04-20 16:46:22 +08:00
status102
d42a8ba42e chore: MaaCore日志文件占用缓解, 取消大小限制 2025-04-20 16:46:15 +08:00
uye
86a861f1c1 fix: fix debug
[skip changelog]
2025-04-20 16:33:08 +08:00
uye
73801e5eae chore: 提取 helper 方法 2025-04-20 16:31:29 +08:00
uye
085444f25f chore: 修改版本更新提示逻辑 2025-04-20 15:48:04 +08:00
uye
81f6540170 chore: 添加模拟器路径为空的提示 2025-04-20 15:28:44 +08:00
Constrat
66d49a7e81 ci: bump oxi, clang, prettier, markdownlint (#12388)
* ci: bump oxi, clang, prettier, markdownlint

* chore: Auto update by pre-commit hooks [skip changelog]

* chore: 移除不再使用clang-format的JSON文件

* chore: clang-format disable

* chore: clang版本更新

* chore: Auto update by pre-commit hooks [skip changelog]

* chore: ver注释

* docs: Modify the clang-format version restriction in the documentation to match the current changes

@zzyyyl

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
2025-04-20 09:42:41 +08:00
MistEO
9982545c99 chore: 调整友链弹窗最大高度 2025-04-20 03:03:06 +08:00
github-actions[bot]
eaf3b93c8e chore: Auto Templates Optimization
Triggered by e29d506cf2

[skip changelog]
2025-04-19 17:47:45 +00:00
MistEO
e29d506cf2 perf: image size 2025-04-20 01:47:10 +08:00
github-actions[bot]
e4e9c8264c chore: Auto Templates Optimization
Triggered by 7204d0f62a

[skip changelog]
2025-04-19 16:34:48 +00:00
MistEO
7204d0f62a feat: 整理官网友链列表,添加Mirror酱友链 2025-04-20 00:33:48 +08:00
Rbqwow
60308846f3 feat: 官网友链改为按钮 (#12400)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-20 00:11:34 +08:00
status102
e8717c0936 perf: enumerable 2025-04-19 23:58:14 +08:00
status102
786518917c fix: 刷理智参数更新崩溃 2025-04-19 23:56:58 +08:00
MistEO
91195d3c02 chore: 官网使用Mirror酱新链接 2025-04-19 23:19:30 +08:00
Aliothmoon
09608430a9 fix: 移除官网的PerformanceMonitor (#12411)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Rbqwow <55343783+Rbqwow@users.noreply.github.com>
2025-04-19 23:15:22 +08:00
Aliothmoon
f09e4de87e fix: 下载状态文本适配浅色模式 (#12410)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-19 23:15:11 +08:00
uye
d306941c4f fix: 从其他界面进入仓库识别任务时可能卡在主界面 2025-04-19 21:09:44 +08:00
Rbqwow
288fa379d3 fix: 修复某些情况下官网本地开发服务器拒绝连接的问题 (#12401)
https://github.com/vercel/turborepo/issues/7279

[skip changelog]
2025-04-19 20:37:29 +08:00
github-actions[bot]
66c9e3c65c chore: Auto Templates Optimization
Triggered by f2586ec7fe

[skip changelog]
2025-04-19 10:28:45 +00:00
uye
f2586ec7fe fix: SelectClue 任务 roi 与模板图片不匹配
fix #12404
2025-04-19 18:24:29 +08:00
Constrat
63a30d96f6 fix: discord logo on website 2025-04-19 11:40:16 +02:00
HX3N
99db411ea6 chore: KR remove ocrReplace in RoguelikeChooseSupportBtnOcr
RoguelikeChooseSupportBtnOcr does not use ocrReplace
2025-04-19 17:57:53 +09:00
HX3N
b330cb465b fix: KR Recruit Support Unit regex 2025-04-19 15:53:25 +09:00
MistEO
3c76830ad5 feat: 调整官网首页按钮 2025-04-19 13:45:43 +08:00
uye
2b87578d53 chore: lastUpdateTime -> stageAndTasksUpdateTime (#12393) 2025-04-19 13:26:05 +08:00
MistEO
a4420961ce feat: web cache (#12403) 2025-04-19 13:08:56 +08:00
uye
4d76fabd77 feat: LoadResourceAndCheckRet 额外读取对应文件名_custom.json (#12382)
* feat: LoadResourceAndCheckRet 额外读取对应文件名_custom.json

* chore: 添加日志,问题反馈打包带上custom文件
2025-04-19 12:16:05 +08:00
Aliothmoon
457023106c feat: 调整按钮阴影 (#12398)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-19 00:14:23 +08:00
MistEO
e1b000631a feat: 更小杯的友情链接 2025-04-19 00:13:58 +08:00
MistEO
04531f33c7 chore: 官网友情链接更小一点 2025-04-18 23:42:20 +08:00
MistEO
d3d8e1a5cf feat: 超小杯友情链接 2025-04-18 23:37:41 +08:00
MistEO
deb5fa3044 feat: 官网按钮调整 2025-04-18 23:37:41 +08:00
status102
18a4a3fc31 docs: 自动战斗-自动编队 特别关注标记影响提示 中英文提示调整 2025-04-18 22:31:38 +08:00
Aliothmoon
3f5a7322e5 feat: 官网亮色模式 (#12396)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-18 21:29:15 +08:00
status102
fc4437183d docs: 自动战斗-自动编队 特别关注标记影响提示 中文提示特化修改 2025-04-18 19:13:53 +08:00
uye
1d8068daf0 fix: 在关闭系统通知后无法收到通知信息 2025-04-18 15:15:44 +08:00
uye
b0d14b4820 feat: MaaApiService 添加 etag 支持 2025-04-18 11:01:59 +08:00
uye
26caabb8d0 chore: 添加资源更新提示 2025-04-18 10:29:05 +08:00
uye
9443c835fa chore: 添加更新提示 2025-04-18 00:01:24 +08:00
Constrat
b981160487 chore: glt blame ignore for 9ed30c5658
[skip changelog]
2025-04-17 09:33:43 +02:00
Constrat
9ed30c5658 style: clang mass formatting 2025-04-17 09:32:58 +02:00
uye
cc7891c11d chore: 调整 include 顺序
[skip changelog]
2025-04-17 15:26:51 +08:00
uye
21f9864140 fix: 二次点击部署栏取消选中时,点击 y 坐标较小的 rect 2025-04-17 15:25:56 +08:00
status102
de2c50ec7e Revert "perf: 自动战斗待部署识别减少一次预识别"
This reverts commit 0839de2c94.
2025-04-17 12:40:47 +08:00
github-actions[bot]
c447ee3568 chore: Auto Templates Optimization
Triggered by 5727be3b3a

[skip changelog]
2025-04-17 03:25:30 +00:00
status102
5727be3b3a fix: 主线菜单导致刷理智无法吃药
fix #12364
2025-04-17 11:24:21 +08:00
status102
debcf92010 chore: 自动战斗待部署区识别未知干员已知问题标记
待部署区相同干员 (如 超重绝缘水泥) 会在关闭第一个时候, 可能错误展开第二个, 导致识别第二个时提前关闭第二个, 无法识别名字
2025-04-17 11:03:18 +08:00
status102
0839de2c94 perf: 自动战斗待部署识别减少一次预识别 2025-04-17 10:58:44 +08:00
status102
c9374383c1 rft: rename 2025-04-17 10:54:18 +08:00
status102
1c321bb313 rft: rename 2025-04-17 10:16:48 +08:00
status102
4d975a1633 fix: 自动战斗 保全水泥替换 2025-04-17 10:14:05 +08:00
uye
6137cc701b Release v5.15.2 (#12376) 2025-04-17 01:34:21 +08:00
github-actions[bot]
e15b95c084 docs: Auto Update Changelogs of v5.15.2 (#12380)
* docs: Auto Generate Changelog of Release v5.15.2

* docs: changelog

* chore: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-17 01:32:30 +08:00
uye
660bb141aa chore: 地图修完了
[skip changelog]
2025-04-17 01:11:09 +08:00
uye
d3981265bb fix: 新保全第六关地图错误 (#12381)
* chore: delete wrong file

* chore: Auto Update Game Resources - 2025-04-16

https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14497921439

[skip changelog]

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-17 00:41:43 +08:00
萨拉托加
d801be3fc1 chore: 新增 阿卡胡拉丛林 保全派驻作业 (#12375)
* chore: 新增 阿卡胡拉丛林 保全派驻作业

* chore: Auto update by pre-commit hooks [skip changelog]

* chore: 更新黑名单

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-16 23:45:19 +08:00
uye
8abff51da2 chore: 修改保全文件描述
[skip changelog]
2025-04-16 23:31:21 +08:00
Sherkey Asher
28ad1f2816 docs: 优化文档 (#12361)
Co-authored-by: Rbqwow <55343783+Rbqwow@users.noreply.github.com>
2025-04-16 22:22:29 +08:00
DL_君逸寒
6bbc15040a feat: 新增 尚蜀夜市 保全派驻作业 (#12374)
* feat: 新增 尚蜀夜市 保全派驻作业

feat: 新增 尚蜀夜市 保全派驻作业

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-16 22:22:05 +08:00
Constrat
86cbff2cab fix: EN SSS buffs regex 2025-04-16 15:26:28 +02:00
Weiyou Wang
c3dc7d3711 fix: 先取消暂停再取消选择 (#12369)
* fix: 先取消暂停再取消选择

* fix: 换个思路

* fix: 重新识别头像位置

* fix: 删除多余的判断

* fix: 保险起见加回来点东西

* fix: 第二遍点击后更新 name_image
2025-04-16 20:51:55 +08:00
status102
4e3b10ded7 perf: 基建干员选择滑动优化 2025-04-16 17:18:44 +08:00
BxFS
1a8e1bc989 feat: Background stretch modes (#12365)
* feat: Background stretch modes

* i18n: all language translations with ja-jp and ko-kr AI translated

* i18n: make thy name thy name

* chore: 优化显示效果

---------

Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-16 15:44:56 +08:00
晓丶梦丶仁
814d9a651f perf: old SSS copilot
[skip changelog]
2025-04-16 15:42:36 +08:00
DL_君逸寒
5c9a01be2a feat: 新增 尚蜀夜市、多索雷斯在建地块、荒地群兽音乐厅 保全派驻作业 (#12370)
* feat: 新增 尚蜀夜市 保全派驻作业

feat: 新增 尚蜀夜市 保全派驻作业

* feat: 新增 多索雷斯在建地块 保全派驻作业

feat: 新增 多索雷斯在建地块 保全派驻作业

* feat: 新增 荒地群兽音乐厅 保全派驻作业

feat: 新增 荒地群兽音乐厅 保全派驻作业

* feat: 新增 荒地群兽音乐厅 保全派驻作业

feat: 新增 荒地群兽音乐厅 保全派驻作业

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-16 15:36:23 +08:00
uye
13fa90a214 perf: 加快无基建技能干员选择速度,加快选择列表回正速度 (#12363)
* perf: 加快无基建技能干员选择速度,加快选择列表回正速度

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-16 15:34:07 +08:00
MistEO
ae9a1f1cf0 fix: tile resource (#12372)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2025-04-16 15:23:21 +08:00
uye
21bc191a96 fix: 导能元件界面更改 2025-04-16 14:48:55 +08:00
HX3N
aa754996f0 i18n: KR translation tweaks (#12366)
* i18n: KR translation tweaks

* chore: fix typo
2025-04-16 00:46:11 +08:00
ChingCdesu
631466cfff feat: 更新Mirror酱下载为按钮,保持动画一致 2025-04-15 23:51:37 +08:00
status102
3d64624ad4 chore: 自动战斗加点输出 2025-04-15 16:21:02 +08:00
Cerulime
76a007501a feat: 在肉鸽招募中增加m3作为群奶 (#12353)
* feat: 在肉鸽招募中增加m3作为群奶

* fix: 凯尔希和Mon3tr不同时招募(MAA无法区分召唤物)
2025-04-15 14:58:07 +08:00
hepari
cfad7fc743 docs: add glossary missing operator name (#12360) 2025-04-15 15:51:28 +09:00
github-actions[bot]
e99dcb3e10 chore: Auto Update Game Resources - 2025-04-14
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14444762975

[skip changelog]
2025-04-14 11:43:55 +00:00
github-actions[bot]
0b16a4fb26 chore: Auto Templates Optimization
Triggered by 8586c21312

[skip changelog]
2025-04-14 11:12:05 +00:00
uye
8586c21312 chore: 优化 OF-1 截图
fix #12351
2025-04-14 19:11:45 +08:00
github-actions[bot]
80aa7c3bee chore: Auto Update Game Resources - 2025-04-14
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14441778932

[skip changelog]
2025-04-14 09:06:48 +00:00
uye
3cb0a8ac08 chore: 删除多余逻辑
[skip changelog]
2025-04-14 13:48:56 +08:00
status102
40a614df0d fix: 刷理智掉落物指定参数异常检查 2025-04-14 13:42:48 +08:00
uye
30276f9c2d fix: 无法关闭线索窗口 2025-04-14 13:14:14 +08:00
uye
6c62cc373b chore: 优化界面显示 2025-04-14 12:32:57 +08:00
status102
31bf864f78 chore: blank line
[skip changelog]
2025-04-14 08:32:18 +08:00
status102
6196676eb3 fix: 移除battleHelper中的BestMatcher复用 (#12136)
* fix: 移除battleHelper中的BestMatcher复用

* fix: type

* fix: require
2025-04-14 08:29:35 +08:00
uye
856e2a140f Release v5.15.1 (#12348) 2025-04-14 00:56:42 +08:00
github-actions[bot]
d32f0c202f docs: Auto Update Changelogs of v5.15.1 (#12350)
* docs: Auto Generate Changelog of Release v5.15.1

* docs: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-14 00:56:24 +08:00
uye
cf496728a3 chore: 修改描述 2025-04-13 23:46:17 +08:00
uye
2f9c187916 chore: 新增更新源 tooltip 2025-04-13 23:38:09 +08:00
github-actions[bot]
a265d0c06b chore: Auto Templates Optimization
Triggered by 4a5c808e21

[skip changelog]
2025-04-13 11:40:50 +00:00
pre-commit-ci[bot]
4a5c808e21 chore: Auto update by pre-commit hooks [skip changelog] 2025-04-13 11:40:34 +00:00
uye
fab8731f50 chore: 优化自定义任务显示 2025-04-13 19:38:02 +08:00
uye
9eda7095e7 feat: CustomTasks 支持逗号、分号切割任务列表 (#12342)
* feat: CustomTasks 支持逗号、分号切割任务列表

* chore: Remove trailing comma

Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>

* chore: 修改描述

Co-authored-by: status102 <102887808+status102@users.noreply.github.com>

---------

Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
2025-04-13 19:26:32 +08:00
uye
ee29f65a8e fix: Connection lost 提前返回 false 2025-04-13 19:20:36 +08:00
github-actions[bot]
d2298e0105 chore: Auto Templates Optimization
Triggered by f0b318fed3

[skip changelog]
2025-04-13 11:15:23 +00:00
uye
f0b318fed3 chore: 优化线索选择逻辑 2025-04-13 19:14:58 +08:00
uye
68641758ab fix: 无法选中线索
fix #12346
2025-04-13 18:28:31 +08:00
uye
4302611bf7 chore: 支持实体机检测 2025-04-13 15:39:38 +08:00
uye
9310f2e204 chore: miss brackets 2025-04-13 14:26:24 +08:00
uye
3685dae146 fix: 雷电模拟器重新连接时误认为断开连接
fix #12345
2025-04-13 14:21:46 +08:00
github-actions[bot]
7ed3da2bee chore: Auto Templates Optimization
Triggered by edfb4ce73a

[skip changelog]
2025-04-13 05:35:09 +00:00
github-actions[bot]
edfb4ce73a chore: Auto Update Game Resources - 2025-04-13
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14426517162

[skip changelog]
2025-04-13 05:34:37 +00:00
status102
f679256612 feat: 配置增加全局键移除 & bool自动转换 2025-04-13 11:19:26 +08:00
uye
383c38831a chore: FightSeries use the same ROI for all clients 2025-04-12 23:43:50 +08:00
status102
c3dc844b9a fix: 自动战斗网络请求返回失败时,错误提示异常 2025-04-12 23:40:54 +08:00
status102
a7f909cad0 perf: wpf自动战斗增加启动失败时的log 2025-04-12 23:40:54 +08:00
bodayw
2df97627fe feat: 更新 243/153 极限效率一天四换排班表(20250412 修订) (#12337)
* feat: 更新 243 极限效率一天四换排班表(20250412 修订)

根据[公孙长乐 2025-04-12 新视频](https://www.bilibili.com/video/BV14XdXYCEqh/?t=127)制作。

Replacing Kal'tsit with Mon3tr...

* feat: 更新 153 极限效率一天四换排班表(20250412 修订)

Replacing Kal'tsit with Mon3tr
Use Thorns the Lodestar for the 2nd rotation in the Gold Factory
2025-04-12 23:07:02 +08:00
Manicsteiner
5d5492b018 fix: FightSeries for global (#12332) 2025-04-12 23:05:55 +08:00
Szzrain
741eaafee1 feat: 支持新 UI 的 OF-1 导航 (#12335)
* feat: 支持新 UI 的 OF-1 导航

* chore: Auto update by pre-commit hooks [skip changelog]

* fix: breaking for global server etc. (Hopefully)

* fix: reset roi for non-CN server

* chore: as reviewed

* chore: fix as review

* fix: adjust roi of ClickChapterNewOverview

* fix: fix roi

* chore: adjust swipe time

* chore: 简化任务逻辑,修改任务模板,同步适配 OF-F3

* chore: 模板图不带文字

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-12 23:03:26 +08:00
status102
f0d7840b51 perf: 移除无效调用 2025-04-12 22:35:48 +08:00
status102
3d62daed59 fix: 非自定义关卡名情况下,未能移除不显示的关卡
fix #12331
2025-04-12 22:35:47 +08:00
status102
d85b69632f Revert "chore: 给剩余理智加个兜底"
This reverts commit 6db893a23d.
2025-04-12 22:35:41 +08:00
uye
c64c80b7fc fix: 点击开始行动三秒未进入备战界面导致二次点击
fix #12324
2025-04-12 20:36:35 +08:00
status102
875a8dbe65 ci: issue-checker顺带加一下新的反馈包名 2025-04-12 19:47:00 +08:00
status102
c3bf90dd44 ci: issue-checker 日志上传失败提示 2025-04-12 19:43:26 +08:00
uye
6db893a23d chore: 给剩余理智加个兜底 2025-04-12 17:43:13 +08:00
Constrat
db03ab5976 fix: trade post rewards post base update
fix #12333
2025-04-12 09:02:03 +02:00
Constrat
55721e9e35 feat: Guide enable ADB (#12329)
* feat: add xaml gui

* i18n: add resources

* i18n: KR

* i18n: zh-tw

* i18n: zh-cn

* chore: 既然繁体那边用中文了那这里也用中文好了

---------

Co-authored-by: HX3N <scarlet7518@gmail.com>
Co-authored-by: momomochi987 <as99us301@gmail.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
Co-authored-by: Rbqwow <55343783+Rbqwow@users.noreply.github.com>
2025-04-12 11:03:20 +08:00
Constrat
3d7b7d5e58 chore: manual stages resources 2025-04-11 18:07:43 +02:00
Constrat
8971893e81 docs: fix punctuation for en-us 2025-04-11 17:35:39 +02:00
status102
af68ac46cf chore: file header & warning 2025-04-11 15:22:23 +08:00
HX3N
951ed330a8 chore: YostarKR InfrastReward ocr replace operator to trust
Replaced due to overlap between operator trust and operator morale
2025-04-11 12:34:35 +09:00
dependabot[bot]
3babe9d76e ci: bump apple-actions/download-provisioning-profiles from 3 to 4 in /.github/workflows in the github-actions group (#12225)
ci: bump apple-actions/download-provisioning-profiles

Bumps the github-actions group in /.github/workflows with 1 update: [apple-actions/download-provisioning-profiles](https://github.com/apple-actions/download-provisioning-profiles).


Updates `apple-actions/download-provisioning-profiles` from 3 to 4
- [Release notes](https://github.com/apple-actions/download-provisioning-profiles/releases)
- [Commits](https://github.com/apple-actions/download-provisioning-profiles/compare/v3...v4)

---
updated-dependencies:
- dependency-name: apple-actions/download-provisioning-profiles
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-11 05:35:14 +08:00
HX3N
adf6f1f80c fix: YostarKR InfrastReward ocr fix (#12317) 2025-04-10 22:34:53 +02:00
uye
ebaf3f9307 chore: 使用 MirrorChyan 进行软件更新时未处理 errorCode 显示 2025-04-11 01:57:02 +08:00
uye
60f0d56ddf chore: 顺序检查 2025-04-10 23:39:25 +08:00
uye
f94ddabeef chore: 弹窗加个文件名 2025-04-10 18:29:19 +08:00
pre-commit-ci[bot]
74f85680e8 chore: Auto update by pre-commit hooks [skip changelog] 2025-04-10 16:51:35 +08:00
status102
60f6b910cd feat: 自动战斗15章突袭难度适配 2025-04-10 16:51:35 +08:00
status102
e9bf062b55 chore: 自动战斗 战斗列表 关卡导航名允许覆盖 2025-04-10 16:51:35 +08:00
status102
4142896c82 perf: 背景图默认值修改为相对路径 2025-04-10 15:34:32 +08:00
status102
70398dda8b fix: Wpf一键长草任务栏设置按钮绑定报错 2025-04-10 15:34:31 +08:00
ChingCdesu
63bedace6e feat: mirror酱链接按照操作系统自动生成 2025-04-09 23:37:37 +08:00
Constrat
bc677b69ca fix: new Support GUI for EN
fix https://github.com/MaaAssistantArknights/MaaAssistantArknights/pull/12285#issuecomment-2788133440
2025-04-09 16:24:59 +02:00
Rbqwow
3bb0833704 build: 更新文档主题库 (#11627)
* build: 更新网站依赖

* build:更新vphope版本

* build: 怎么忘记加这个了

* fix: 修复构建错误

* chore: fix Vite CJS Node API deprecated warning

* chore: log

* perf: turbo 添加文档 cache

* perf: 注释掉新版不读取的切换语言公告内容

但公告这个属性得留着 不留着就没有切换语言的弹窗了

* fix: 修复字体问题

* build: update package version

* docs: remove root locale

* docs: add author

* ci: update node version

* build: turbo一直叫我更新,于是我更新了

* docs: update package

* docs: 再见吧牛牛今晚我就要远航

* docs: fix root locale problem

* docs: remove unused command

* feat: 牛兮归来!

* build: update turbo

* chore: 语言提醒怎么又没了 加回来

---------

Co-authored-by: SherkeyXD <57581480+SherkeyXD@users.noreply.github.com>
2025-04-09 21:09:31 +08:00
uye
29dad9ac7f fix: 修复手动关闭模拟器导致的连接状态不一致问题
fix #12309
2025-04-09 19:10:57 +08:00
uye
ea29cc2c20 fix: 连战次数 2025-04-09 17:50:59 +08:00
Weiyou Wang
934f752820 fix: update deployment (#11959)
* fix: update deployment

* fix: 把 check_in_battle 加回来

* fix: misc

* fix: 逻辑取反了

* fix: typo

* refactor: 去掉不需要的 init 参数与重复的 check_in_battle 检查

* refactor: 注释

* fix: misc

---------

Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-09 17:46:01 +08:00
status102
bd28098db9 feat: 日志包一并打包gui配置文件 (#12310)
* feat: 日志包一并打包gui配置文件 (#12310)

* perf: 复制调整

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: BxFS <15606086+BxFS@users.noreply.github.com>
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-09 17:30:56 +08:00
status102
a1ff2a522d fix: Wpf刷理智连战次数UI为空 2025-04-09 17:29:28 +08:00
status102
7a329c8647 fix: task name
[skip changelog]
2025-04-09 17:12:46 +08:00
uye
f74a04155f perf: 热更新资源改为异步加载避免启动阻塞 2025-04-09 16:58:52 +08:00
status102
e95f5f5ad7 fix: 刷理智碎石时网络卡顿造成重复点击
fix #12290
2025-04-09 16:51:28 +08:00
status102
8ffc1a253d Revert "fix: 吃药/碎石 时网络波动延迟导致二次确认时点到取消代理"
This reverts commit 4c4b56c1a8.
2025-04-09 16:38:50 +08:00
status102
b22805843b fix: task type 2025-04-09 16:27:54 +08:00
status102
0045bbcd8b fix: 修复刷理智错误识别突袭关3星结算 2025-04-09 16:27:41 +08:00
uye
90ed19b192 fix: typo
[skip changelog]
2025-04-09 16:25:11 +08:00
uye
402ececdde fix: 主线关卡未选择默认进度时无法导航 2025-04-09 16:21:04 +08:00
uye
4c4b56c1a8 fix: 吃药/碎石 时网络波动延迟导致二次确认时点到取消代理 2025-04-09 15:57:58 +08:00
uye
7277b7e8ec chore: 调整热更提示 2025-04-09 13:49:58 +08:00
uye
7f1466eeb0 fix: 15 章战斗列表 2025-04-09 13:43:13 +08:00
status102
fb8ba366ca rft: Wpf刷理智任务、基建任务序列化 (#12281) 2025-04-09 13:13:42 +08:00
uye
fd5b5cab4e Release v5.15.0 (#12285)
Release beta for overseas infrastructure changes.
- [x] JP
- [x] KR
- [x] Wait for new EN gamedata that will release in 4 hours.
- [ ] CN gamedata fix (yuanyuan repo same time as EN?)
2025-04-09 12:37:10 +08:00
github-actions[bot]
62abaf51d7 docs: Auto Update Changelogs of v5.15.0 (#12289)
* docs: Auto Generate Changelog of Release v5.15.0

* docs: Update CHANGELOG.md

* docs: Update CHANGELOG.md

* docs: changelog

* feat: changelog

* feat: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
Co-authored-by: AnnAngela <naganjue@vip.qq.com>
2025-04-09 12:35:36 +08:00
github-actions[bot]
51926cd41c chore: Auto Templates Optimization
Triggered by fef3fd4817

[skip changelog]
2025-04-09 04:29:56 +00:00
uye
fef3fd4817 chore: 手动更新新材料 2025-04-09 12:29:32 +08:00
MistEO
11a120b056 ci: MirrorChyan for macos (#12296)
* Update mirrorchyan_release_note.yml

* Update mirrorchyan.yml

* Update mirrorchyan.yml

* Update mirrorchyan_release_note.yml

* Update mirrorchyan.yml

* Update mirrorchyan.yml

* Update mirrorchyan_release_note.yml

* Update mirrorchyan.yml

* Update mirrorchyan.yml
2025-04-09 12:23:02 +08:00
Manicsteiner
86f76f71ea chore: YostarJP ocr fix (#12292) 2025-04-09 11:18:08 +08:00
BxFS
ee41f9c322 feat: 生成问题反馈压缩包&打开debug文件夹按钮 (#12282)
* feat: generate support payload and open debug folder option

* feat: zh-tw and en-us i18n, along with ai-translated ja-jp and ko-kr

* i18n: EN tweak

* fix: 移除重复的常见问题

* chore: UI 调整

* fix: 修复绑定,调整顺序

* chore: 移除不再使用的i18n内容

* perf: 调整关于界面

* fix: 文件过滤

---------

Co-authored-by: Constrat <56174894+Constrat@users.noreply.github.com>
Co-authored-by: status102 <102887808+status102@users.noreply.github.com>
2025-04-09 10:17:24 +08:00
Constrat
5ad0f1e1fc feat: EN new clue templates + optimizations 2025-04-08 20:09:21 +02:00
Constrat
e432deee2c fix: readd CN gamedata: stages + chars 2025-04-08 19:40:26 +02:00
Constrat
2b64f974ec feat: EN Siege Alter gamedata 2025-04-08 19:18:17 +02:00
status102
46d3e91483 fix: 自动战斗-战斗列表 突袭难度切换失效
fix #12286
2025-04-08 23:14:24 +08:00
uye
105bf5b865 feat: 支持新 UI 主线导航 (#12278)
* feat: 支持新 UI 主线导航

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-08 22:46:27 +08:00
uye
73be332b4d chore: 调整主任务勾选框显示 (#12283) 2025-04-08 21:33:24 +08:00
HX3N
eb69190f18 chore: YostarKR ocr and UI updates (#12284) 2025-04-08 15:12:32 +02:00
status102
3096f8e311 rft: Wpf刷理智任务序列化 2025-04-08 19:33:20 +08:00
status102
419b3ae82d rft: Wpf基建任务参数更新迁移 2025-04-08 19:28:03 +08:00
status102
563c9507d5 rft: Wpf迁移工具箱-公招识别任务 2025-04-08 19:23:26 +08:00
github-actions[bot]
13ccf1b851 chore: Auto Templates Optimization
Triggered by e312d425b8

[skip changelog]
2025-04-08 09:40:29 +00:00
Manicsteiner
e312d425b8 chore: YostarJP clue and GUI updates (#12276) 2025-04-08 11:36:03 +02:00
Constrat
517141a5f4 feat: overseas (JP & KR) data (#12274) 2025-04-08 11:30:17 +02:00
AnnAngela
433eb0aa0b fix: 友链字体 [skip changelog] 2025-04-08 16:15:08 +08:00
AnnAngela
5680895daa feat: 调整友链样式 [skip changelog] 2025-04-08 16:11:14 +08:00
github-actions[bot]
3f426ffd35 chore: Auto Templates Optimization
Triggered by 2ec5caf456

[skip changelog]
2025-04-08 07:59:09 +00:00
AnnAngela
2ec5caf456 feat: 官网添加工具箱友链 [skip changelog] 2025-04-08 15:58:52 +08:00
AnnAngela
2540ec0bc3 feat: 官网添加工具箱友链 [skip changelog] (#12272)
* feat: Update HomeLinks.tsx

* feat: arkntools.app.png

* chore: Auto update by pre-commit hooks [skip changelog]

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-04-08 15:48:22 +08:00
uye
4f81046a40 fix: 15章自动战斗 2025-04-08 12:07:22 +08:00
uye
1e6ae76a2e Revert "fix: 15章 自动战斗"
This reverts commit e2afc7a0cd.
2025-04-08 12:01:19 +08:00
uye
e2afc7a0cd fix: 15章 自动战斗 2025-04-08 11:56:41 +08:00
uye
9c30e9e83e fix: 开始作战 2025-04-08 11:56:41 +08:00
status102
b28ebf3ca9 rft: 远程控制添加任务移除反射 2025-04-08 10:53:23 +08:00
status102
a642024500 chore: 其他地图数据修复 2025-04-08 10:35:55 +08:00
status102
4b61fdf5d9 chore: 主线15章地图修复 2025-04-08 10:26:12 +08:00
uye
0e13f97b8c fix: 修复资源/肉鸽导航 (#12266) 2025-04-08 09:49:39 +08:00
Hao Guan
0475421520 fix(mac): 自动更新 2025-04-08 09:48:22 +08:00
MistEO
c7c17676e2 fix: resource 2025-04-08 09:16:27 +08:00
status102
6a85baede6 fix: wpf外服资源加载错误 2025-04-08 08:47:33 +08:00
Constrat
a935caf588 fix: prettier formatting 2025-04-07 22:11:45 +02:00
github-actions[bot]
34ac9b69f4 chore: Auto Update Game Resources - 2025-04-07
https://github.com/MaaAssistantArknights/MaaAssistantArknights/actions/runs/14318393003

[skip changelog]
2025-04-07 20:04:51 +00:00
MistEO
7174edab5a chore: fix version time 2025-04-08 02:36:11 +08:00
MistEO
6bc2c2167e fix: revert infrast.json temporary 2025-04-08 02:32:57 +08:00
github-actions[bot]
634738a24d chore: Auto Templates Optimization
Triggered by 567e62abe2

[skip changelog]
2025-04-07 18:30:01 +00:00
MistEO
567e62abe2 feat: 手动更新资源 2025-04-08 02:28:55 +08:00
status102
b508d9e306 rft: Wpf CustomTask序列化 (#12264) 2025-04-07 22:50:16 +08:00
Constrat
768c0e289a fix: warning SA1413 in Telegram notifications 2025-04-07 12:02:02 +02:00
uye
f9319906b0 fix: Debug TaskName 忘保存了 2025-04-07 17:41:25 +08:00
uye
b33d88861c Release v5.15.0-beta.2 (#12261) 2025-04-07 00:49:57 +08:00
github-actions[bot]
088be6e970 docs: Auto Update Changelogs of v5.15.0-beta.2 (#12262)
* docs: Auto Generate Changelog of Release v5.15.0-beta.2

* docs: Update CHANGELOG.md

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: uye <99072975+ABA2396@users.noreply.github.com>
2025-04-07 00:38:17 +08:00
uye
a6d52b4a44 feat: 将背景设置独立出来 (#12254)
* feat: 将背景设置独立出来

* fix: typo

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* i18n: 添加翻译

* chore: 调整持久化储存 key 值,透明度和半径得重新手动调整下

* chore: 隐藏过时提示

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-06 23:06:27 +08:00
uye
0ff82e143f chore: 添加一个临时定时 (#12243)
* chore: 添加一个临时定时

* chore: 定时器全部改成可单次执行
2025-04-06 22:56:30 +08:00
uye
977cd6c9b6 feat: 添加自定义任务,仅在 debug 模式下可见入口
fix #7407
2025-04-06 18:49:42 +08:00
uye
53b0d56209 fix: 线索翻页限制 10 次,超出次数或未识别到下一页强制给当页第一个好友送线索 2025-04-06 17:17:56 +08:00
uye
079359749d fix: 外部通知 SMTP 与 Qmsg 输入框样式错误
fix #12256
2025-04-06 14:15:37 +08:00
uye
0b92134160 chore: 将密码框样式独立出来 2025-04-06 14:07:52 +08:00
Sherkey Asher
1a7b615cf8 docs: 添加ci文档 (#11924)
* docs: 添加协议文档导航

* docs: 添加ci解析

* chore: Auto update by pre-commit hooks [skip changelog]

* docs: improve

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Rbqwow <55343783+Rbqwow@users.noreply.github.com>
2025-04-06 09:31:38 +08:00
Loong
7479b95179 chore: bump maa-cli to 0.5.4 (#12091) 2025-04-06 01:12:39 +08:00
1047 changed files with 157625 additions and 34119 deletions

View File

@@ -1,5 +1,5 @@
# https://clang.llvm.org/docs/ClangFormatStyleOptions.html
# for clang-format 17.0.1
# for clang-format 20.0.0
Language: Cpp
BasedOnStyle: "WebKit"
# AccessModifierOffset: 2
@@ -26,9 +26,9 @@ AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: Inline
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
BreakAfterReturnType: Automatic
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BreakTemplateDeclarations: Yes
# AttributeMacros:
# - __pragma
# - _Pragma
@@ -145,7 +145,7 @@ PointerAlignment: Left
# - constexpr
# - type
ReferenceAlignment: Left
ReflowComments: true
ReflowComments: Always
RemoveBracesLLVM: false
RemoveParentheses: Leave
RemoveSemicolon: false
@@ -188,3 +188,4 @@ TabWidth: 4
UseTab: Never
# VerilogBreakBetweenInstancePorts:
# WhitespaceSensitiveMacros:
RemoveEmptyLinesInUnwrappedLines: true

View File

@@ -13,6 +13,7 @@
290cc30f153a0206bd870a0a58cb6338aa16ea34
db9afdc77e85d5fc462d923fca5318be021656cd
a5daac889a55baf8895918d4964f20dad1938470
9ed30c5658c88edf1ef839771a53c7d599183b8b
# incorrect format of 3rdparty/resource/Arknights-Tile-Pos/levels.json
65d654e54b9d04d1902c9ee9f9fb2679520adafd
@@ -42,6 +43,9 @@ bc3ad67a02cb3b8e154c06955cf17091c4265000
# oxipng template optimization
e3d63894b28b2ef5e2405e144a32a6981de5e1b2
# refactor: divide tasks.json into multiple jsons
dce6e317c8e56836662b64ac4b3d1a69b4ff4dd8
# usage: add "[blame ignore]" to the commit message
# This file is managed by an automated workflow
# Do not add, remove or modify lines below this comment

View File

@@ -39,12 +39,11 @@ body:
attributes:
label: 日志和配置文件
description: |
**请在关闭 MAA 后,上传以下 5 个文件:**
1. `debug` 文件夹中的 `asst.log` `gui.log` `asst.bak.log` 和 `gui.bak.log` 日志文件,并说明问题出现的大致时间点
2. `config` 文件夹中的 `gui.json` 配置文件
**请在 MAA -> 设置 -> 问题反馈中找到生成日志压缩包按钮,点击并上传压缩包**
**请直接将完整的文件拖拽进来,而非自己裁切或复制的片段;若文件体积过大可压缩后再上传**
如果你在使用 MacBook请点击屏幕左上角的“文件”点击“打开日志文件夹”
**请直接将完整的文件拖拽进来,而非自己裁切或复制的片段;若文件体积过大可压缩后再上传**
placeholder: |
请确认上传文件前已关闭 MAA
validations:

View File

@@ -11,7 +11,7 @@ body:
required: true
- label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等
required: true
- label: 我已检查了置顶议题Pinned Issue,确认我的问题未被提及
- label: 我已检查了[公告](/MaaAssistantArknights/MaaAssistantArknights/issues/7732)、[活跃议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues)、[已关闭议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed),确认我的问题未被提及
required: true
- label: 我正在使用最新的 MAA 公测版本和最新的官版雷电 9 模拟器
required: true
@@ -44,10 +44,8 @@ body:
attributes:
label: MAA 日志和配置文件
description: |
**请在关闭 MAA 后,上传以下三个文件:**
1. `debug` 文件夹中的 `asst.log` 和 `gui.log` 日志文件,并说明问题出现的大致时间点
若 asst.log 文件小于 10 KB则需同时上传 asst.log.bak 文件
2. `config` 文件夹中的 `gui.json` 配置文件
**请在 MAA -> 设置 -> 问题反馈中找到生成日志压缩包按钮,点击并上传压缩包**
**请直接将完整的文件拖拽进来,而非自己裁切或复制的片段;若文件体积过大可压缩后再上传**
placeholder: |
请确认上传文件前已关闭 MAA

View File

@@ -11,7 +11,7 @@ body:
required: true
- label: 我填写了简短且清晰明确的标题,以便开发者在翻阅 Issue 列表时能快速确定大致问题。而不是“一个建议”、“卡住了”等
required: true
- label: 我已检查了置顶议题Pinned Issue,确认我的问题未被提及
- label: 我已检查了[公告](/MaaAssistantArknights/MaaAssistantArknights/issues/7732)、[活跃议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues)、[已关闭议题](https://github.com/MaaAssistantArknights/MaaAssistantArknights/issues?q=is%3Aissue%20state%3Aclosed),确认我的问题未被提及
required: true
- label: 我正在使用最新的 MAA 公测版本和最新的官版或方舟专版 MuMu 模拟器
required: true
@@ -44,10 +44,8 @@ body:
attributes:
label: MAA 日志和配置文件
description: |
**请在关闭 MAA 后,上传以下三个文件:**
1. `debug` 文件夹中的 `asst.log` 和 `gui.log` 日志文件,并说明问题出现的大致时间点
若 asst.log 文件小于 10 KB则需同时上传 asst.log.bak 文件
2. `config` 文件夹中的 `gui.json` 配置文件
**请在 MAA -> 设置 -> 问题反馈中找到生成日志压缩包按钮,点击并上传压缩包**
**请直接将完整的文件拖拽进来,而非自己裁切或复制的片段;若文件体积过大可压缩后再上传**
placeholder: |
请确认上传文件前已关闭 MAA

View File

@@ -44,13 +44,11 @@ body:
attributes:
label: Log and config files
description: >-
**After closing MAA, upload the following 5 files:**
1. The `asst.log` `gui.log` `asst.bak.log` and `gui.bak.log` log file in the `debug` folder, and indicate the approximate point in time when the problem occurred.
2. The `gui.json` config file in the `config` folder
**Please locate the Generate Support Payload button under MAA Settings -> Issue Report, click the button, and upload the generated zip file**
**Please drag and drop the full file in, not your own cuttings or copies; compress it before uploading if too large.**
If you are using MacBook, please click the "File" option in the top-left corner of the screen, then click "Open Log Folder".
**Please drag and drop the full file in, not your own cuttings or copies;**
**compress it before uploading if too large.**
placeholder: |
Please confirm that MAA is not running before uploading files.
validations:

View File

@@ -522,7 +522,7 @@ labels:
# `incomplete`
- name: incomplete
content: incomplete
regexes: '(?:\[Uploading asst(?:.bak|)(?: - 副本|)(?:.log|)(?:.zip|)…\]\(\))'
regexes: '(?:\[Uploading asst(?:.bak|)(?: - 副本|)(?:.log|)(?:.zip|)…\]\(\))|<!-- Uploading "(log|report)[^"]*\.zip"\.\.\. -->'
mode: add
skip-if:
- skip all
@@ -532,7 +532,7 @@ labels:
- remove incomplete
- name: complete
content:
regexes: '(?:\[asst(?:.bak|)(?: - 副本|)(?:.log|)(?:.zip|)\]\([^\)]+\))'
regexes: '(?:\[asst(?:.bak|)(?: - 副本|)(?:.log|)(?:.zip|)\]\([^\)]+\))|(log|report)[^.]*.zip'
- name: remove incomplete
content: incomplete
mode: remove
@@ -547,7 +547,7 @@ labels:
comments:
- name: Log upload failed
regexes: '\[Uploading asst(?:.bak|)(?: - 副本|)(?:.log|)(?:.zip|)…\]\(\)'
regexes: '\[Uploading asst(?:.bak|)(?: - 副本|)(?:.log|)(?:.zip|)…\]\(\)|<!-- Uploading "log[^"]*\.zip"\.\.\. -->'
content: "你的日志没有上传成功,请重新上传。\n\n\
Your log did not upload successfully, please re-upload it."
mode: add

View File

@@ -89,6 +89,8 @@ jobs:
fi
echo >> CHANGELOG.md
echo "**Full Changelog**: [$last_tag -> $this_tag](https://github.com/MaaAssistantArknights/MaaAssistantArknights/compare/${last_tag}...${this_tag})" >> CHANGELOG.md
echo >> CHANGELOG.md
echo "[已有 Mirror酱 CDK前往 Mirror酱 高速下载](https://mirrorchyan.com/zh/projects?rid=MAA)" >> CHANGELOG.md
- name: Upload changelog to Github
uses: actions/upload-artifact@v4
@@ -417,7 +419,7 @@ jobs:
- name: Download Provisioning Profiles
if: startsWith(github.ref, 'refs/tags/v')
uses: apple-actions/download-provisioning-profiles@v3
uses: apple-actions/download-provisioning-profiles@v4
with:
bundle-id: "com.hguandl.MeoAsstMac"
issuer-id: ${{ secrets.HGUANDL_APPSTORE_ISSUER }}

View File

@@ -26,22 +26,30 @@ jobs:
runs-on: ubuntu-latest
permissions:
pull-requests: write
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: Check out code
uses: actions/checkout@v4
with:
show-progress: false
- name: Cache Primes
id: cache-primes
uses: actions/cache@v4
with:
path: .lycheecache
key: lychee-cache
- name: Check dead links
uses: lycheeverse/lychee-action@v2
with:
# 仅检查内部链接和 Github 相关链接
# 仅检查内部链接,排除所有外部链接
args: >
--verbose --no-progress --cache --max-cache-age 1d
--verbose --no-progress
--cache --max-cache-age 1d --cache-exclude-status '429, 500..599'
--exclude 'https?://.*'
--include 'https?://github\.com/.*'
--include 'https?://raw\.githubusercontent\.com/.*'
--include 'https?://user-images\.githubusercontent\.com/.*'
--exclude-path 'docs/zh-tw/manual/introduction/introduction_old.md'
--exclude-path 'docs/ja-jp/manual/introduction/introduction_old.md'
--exclude 'files/MAA_Runtime_Fix_Pwsh.ps1$'

View File

@@ -8,7 +8,8 @@ jobs:
runs-on: macos-latest
steps:
- uses: MirrorChyan/uploading-action@v1
- name: Upload MAA win x64
uses: MirrorChyan/uploading-action@v1
if: always()
with:
filetype: latest-release
@@ -22,7 +23,8 @@ jobs:
os: win
arch: x64
- uses: MirrorChyan/uploading-action@v1
- name: Upload MAA win arm64
uses: MirrorChyan/uploading-action@v1
if: always()
with:
filetype: latest-release
@@ -35,3 +37,35 @@ jobs:
upload_token: ${{ secrets.MirrorChyanUploadToken }}
os: win
arch: arm64
- name: Upload MAA macos arm64
uses: MirrorChyan/uploading-action@v1
if: always()
with:
filetype: latest-release
filename: "MAA-*-macos-universal.dmg"
extra_zip: true
mirrorchyan_rid: MAA
github_token: ${{ secrets.GITHUB_TOKEN }}
owner: ${{ github.repository_owner }}
repo: ${{ github.event.repository.name }}
upload_token: ${{ secrets.MirrorChyanUploadToken }}
os: macos
arch: arm64
- name: Upload MAA macos x64
uses: MirrorChyan/uploading-action@v1
if: always()
with:
filetype: latest-release
filename: "MAA-*-macos-universal.dmg"
extra_zip: true
mirrorchyan_rid: MAA
github_token: ${{ secrets.GITHUB_TOKEN }}
owner: ${{ github.repository_owner }}
repo: ${{ github.event.repository.name }}
upload_token: ${{ secrets.MirrorChyanUploadToken }}
os: macos
arch: x64

View File

@@ -10,7 +10,7 @@ jobs:
runs-on: macos-latest
steps:
- id: uploading
- name: Release Note for MAA
uses: MirrorChyan/release-note-action@v1
with:
mirrorchyan_rid: MAA

View File

@@ -55,16 +55,17 @@ jobs:
with:
python-version: "3.11"
- name: Cache Python packages
id: cache_python
if: steps.check_push.outputs.is_pr != 'True' && always()
uses: actions/cache@v4
with:
path: ${{ env.pythonLocation }}/lib/python3.11/site-packages
key: ${{ runner.os }}-pip-optimize-templates-${{ hashFiles('./tools/OptimizeTemplates/requirements.txt') }}
# - name: Cache Python packages
# id: cache_python
# if: steps.check_push.outputs.is_pr != 'True' && always()
# uses: actions/cache@v4
# with:
# path: ${{ env.pythonLocation }}/lib/python3.11/site-packages
# key: ${{ runner.os }}-pip-optimize-templates-${{ hashFiles('./tools/OptimizeTemplates/requirements.txt') }}
- name: Install dependencies
if: steps.check_push.outputs.is_pr != 'True' && steps.cache_python.outputs.cache-hit != 'true'
# if: steps.check_push.outputs.is_pr != 'True' && steps.cache_python.outputs.cache-hit != 'true'
if: steps.check_push.outputs.is_pr != 'True'
run: |
pip install -r tools/OptimizeTemplates/requirements.txt

View File

@@ -124,47 +124,10 @@ jobs:
path: ./excel
compression-level: 0
original-json:
if: github.repository_owner == 'MaaAssistantArknights'
runs-on: ubuntu-latest
steps:
- name: Initializization
run: |
urls=(
"https://raw.githubusercontent.com/MaaAssistantArknights/MaaAssistantArknights/refs/heads/${{ github.ref_name }}/.prettierrc|.prettierrc"
"https://raw.githubusercontent.com/MaaAssistantArknights/MaaAssistantArknights/refs/heads/${{ github.ref_name }}/tools/TaskSorter/TaskSorter.py|TaskSorter.py"
"https://raw.githubusercontent.com/MaaAssistantArknights/MaaAssistantArknights/refs/heads/${{ github.ref_name }}/resource/tasks.json|tasks.json"
"https://raw.githubusercontent.com/MaaAssistantArknights/MaaAssistantArknights/refs/heads/${{ github.ref_name }}/resource/global/txwy/resource/tasks.json|original/txwy.json"
"https://raw.githubusercontent.com/MaaAssistantArknights/MaaAssistantArknights/refs/heads/${{ github.ref_name }}/resource/global/YoStarEN/resource/tasks.json|original/YoStarEN.json"
"https://raw.githubusercontent.com/MaaAssistantArknights/MaaAssistantArknights/refs/heads/${{ github.ref_name }}/resource/global/YoStarJP/resource/tasks.json|original/YoStarJP.json"
"https://raw.githubusercontent.com/MaaAssistantArknights/MaaAssistantArknights/refs/heads/${{ github.ref_name }}/resource/global/YoStarKR/resource/tasks.json|original/YoStarKR.json"
)
mkdir -p original
printf "%s\n" "${urls[@]}" | xargs -P 6 -I {} bash -c '
url=$(echo "{}" | cut -d"|" -f1)
filename=$(echo "{}" | cut -d"|" -f2)
curl -s -o "$filename" "$url" && echo "Downloaded $filename" || echo "Failed to download $filename" >&2
'
python3 TaskSorter.py --cn tasks.json --overseas EN:original/YoStarEN.json,JP:original/YoStarJP.json,KR:original/YoStarKR.json,TW:original/txwy.json
- name: Prettify original JSON
uses: Nerixyz/actionsx-prettier@v3-adj
with:
args: -w original/YoStarEN.json original/YoStarJP.json original/YoStarKR.json original/txwy.json
- name: Upload Original
uses: actions/upload-artifact@v4
with:
name: original
path: ./original
compression-level: 0
update-game-resources:
# In case of rate limitations on the runners/instances, add dependency, by removing the comment
# needs: [clone-resources-official, clone-resources-overseas, clone-resources-txwy, original-json]
# needs: [clone-resources-official, clone-resources-overseas, clone-resources-txwy]
if: github.repository_owner == 'MaaAssistantArknights'
runs-on: windows-latest
steps:
@@ -220,13 +183,6 @@ jobs:
./tools/ResourceUpdater/x64/Release/opencv_world4_maa.dll
./tools/ResourceUpdater/x64/Release/ResourceUpdater.exe
- name: Download original JSON
id: download-original
uses: actions/download-artifact@v4.1.8
with:
name: original
path: ./original
- name: Download txwy
id: download-txwy
uses: actions/download-artifact@v4.1.8
@@ -367,20 +323,12 @@ jobs:
branch: ${{ github.ref }}
github_token: ${{ secrets.MAA_RESOURCE_SYNC }}
- name: Update OTA resource
if: steps.update_version.outputs.update_resources == 'True'
env:
GH_TOKEN: ${{ secrets.MISTEOWORKFLOW }}
run: |
gh workflow --repo MaaAssistantArknights/MaaRelease run update-resource.yml
# - name: Delete cache
# if: always()
# - name: Update OTA resource
# if: steps.update_version.outputs.update_resources == 'True'
# env:
# GH_TOKEN: ${{ github.token }}
# GH_TOKEN: ${{ secrets.MISTEOWORKFLOW }}
# run: |
# echo "Deleting the cache..."
# gh cache delete
# gh workflow --repo MaaAssistantArknights/MaaRelease run update-resource.yml
- name: Add cancelled status
if: steps.update_version.outputs.changes != 'True' || steps.add_files.outputs.have_commits != 'True'

View File

@@ -49,9 +49,3 @@ jobs:
git status
git commit -m "$commit_msg" || exit 0
git push
- name: Setup resource update
env:
GH_TOKEN: ${{ secrets.MISTEOWORKFLOW }}
run: |
gh workflow --repo MaaAssistantArknights/MaaRelease run update-resource.yml

View File

@@ -41,7 +41,7 @@ jobs:
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: 20
node-version: 22
- name: Install dependencies
run: pnpm install --frozen-lockfile

View File

@@ -4,18 +4,18 @@ ci:
autofix_prs: true
repos:
- repo: https://github.com/shssoichiro/oxipng
rev: v9.1.2
rev: v9.1.4
hooks:
- id: oxipng
args: ["-q", "-o", "2", "-s", "--ng"]
- repo: https://github.com/pre-commit/mirrors-clang-format
rev: v17.0.1
rev: v20.1.0
hooks:
- id: clang-format
files: ^src/MaaCore/.*
args: ["--assume-filename", ".clang-format"]
- repo: https://github.com/rbubley/mirrors-prettier
rev: v3.5.1
rev: v3.5.3
hooks:
- id: prettier
files: ^((\.github/ISSUE_TEMPLATE|docs|resource|src|tools|website)/.*|\.pre-commit-config\.yaml|package-definition\.json)
@@ -23,7 +23,7 @@ repos:
- yaml
- json
- repo: https://github.com/DavidAnson/markdownlint-cli2
rev: v0.13.0
rev: v0.17.2
hooks:
- id: markdownlint-cli2
files: ^docs/.*|^README\.md$

View File

@@ -6,5 +6,10 @@ src/maa-cli
src/MaaMacGui
website/
docs/
resource/Arknights-Tile-Pos/
tools/OptimizeTemplates/optimize_templates.json
CITATION.cff
CHANGELOG.md

View File

@@ -1,3 +1,5 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include <initializer_list>
@@ -37,37 +39,86 @@ public:
// explicit basic_array(const basic_value<string_t>& val);
// explicit basic_array(basic_value<string_t>&& val);
template <typename collection_t,
std::enable_if_t<_utils::is_collection<collection_t> &&
std::is_constructible_v<value_type, _utils::range_value_t<collection_t>>,
bool> = true>
template <
typename collection_t,
std::enable_if_t<
_utils::is_collection<collection_t>
&& std::is_constructible_v<value_type, _utils::range_value_t<collection_t>>,
bool> = true>
basic_array(collection_t arr)
: _array_data(std::make_move_iterator(arr.begin()), std::make_move_iterator(arr.end()))
{}
template <typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_member<jsonization_t>::value, bool> = true>
basic_array(const jsonization_t& value) : basic_array(value.to_json())
{}
template <typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_templ_spec<jsonization_t>::value, bool> = true>
basic_array(const jsonization_t& value) : basic_array(ext::jsonization<jsonization_t>().to_json(value))
{}
{
}
template <
typename fixed_array_t,
std::enable_if_t<_utils::is_fixed_array<fixed_array_t>, bool> = true>
basic_array(const fixed_array_t& arr)
: _array_data(arr.begin(), arr.end())
{
}
template <
typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_member<jsonization_t>::value, bool> = true>
basic_array(const jsonization_t& value)
: basic_array(value.to_json())
{
}
template <
typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_templ_spec<jsonization_t>::value, bool> = true>
basic_array(const jsonization_t& value)
: basic_array(ext::jsonization<jsonization_t>().to_json(value))
{
}
template <typename... elem_ts>
basic_array(const std::tuple<elem_ts...>& tup)
{
foreach_tuple(tup, std::make_index_sequence<std::tuple_size_v<std::tuple<elem_ts...>>>());
}
template <typename first_t, typename second_t>
basic_array(std::pair<first_t, second_t> pair)
: _array_data({ std::move(pair.first), std::move(pair.second) })
{
}
~basic_array() noexcept = default;
bool empty() const noexcept { return _array_data.empty(); }
size_t size() const noexcept { return _array_data.size(); }
bool contains(size_t pos) const { return pos < _array_data.size(); }
bool exists(size_t pos) const { return contains(pos); }
const basic_value<string_t>& at(size_t pos) const;
string_t dumps(std::optional<size_t> indent = std::nullopt) const { return indent ? format(*indent) : to_string(); }
string_t dumps(std::optional<size_t> indent = std::nullopt) const
{
return indent ? format(*indent) : to_string();
}
string_t to_string() const;
string_t format(size_t indent = 4) const { return format(indent, 0); }
template <typename value_t>
bool all() const;
template <typename value_t, template <typename...> typename collection_t = std::vector>
collection_t<value_t> as_collection() const;
template <
typename value_t,
size_t Size,
template <typename, size_t> typename fixed_array_t = std::array>
fixed_array_t<value_t, Size> as_fixed_array() const;
template <typename... elem_ts>
std::tuple<elem_ts...> as_tuple() const;
template <typename first_t, typename second_t>
std::pair<first_t, second_t> as_pair() const;
// Usage: get(key_1, key_2, ..., default_value);
template <typename... key_then_default_value_t>
@@ -112,23 +163,54 @@ public:
basic_array<string_t>& operator=(const basic_array<string_t>&) = default;
basic_array<string_t>& operator=(basic_array<string_t>&&) noexcept = default;
template <typename value_t, std::enable_if_t<std::is_convertible_v<value_t, basic_array<string_t>>, bool> = true>
template <
typename value_t,
std::enable_if_t<std::is_convertible_v<value_t, basic_array<string_t>>, bool> = true>
basic_array<string_t>& operator=(value_t rhs)
{
return *this = basic_array<string_t>(std::move(rhs));
}
bool operator==(const basic_array<string_t>& rhs) const;
bool operator!=(const basic_array<string_t>& rhs) const { return !(*this == rhs); }
template <typename value_t, template <typename...> typename collection_t = std::vector,
std::enable_if_t<_utils::is_collection<collection_t<value_t>>, bool> = true>
template <
typename value_t,
template <typename...> typename collection_t = std::vector,
std::enable_if_t<_utils::is_collection<collection_t<value_t>>, bool> = true>
explicit operator collection_t<value_t>() const
{
return as_collection<value_t, collection_t>();
}
template <typename jsonization_t,
std::enable_if_t<_utils::has_from_json_in_member<jsonization_t, string_t>::value, bool> = true>
template <
typename value_t,
size_t Size,
template <typename, size_t> typename fixed_array_t = std::array,
std::enable_if_t<_utils::is_fixed_array<fixed_array_t<value_t, Size>>, bool> = true>
explicit operator fixed_array_t<value_t, Size>() const
{
return as_fixed_array<value_t, Size, fixed_array_t>();
}
template <typename... elem_ts>
explicit operator std::tuple<elem_ts...>() const
{
return as_tuple<elem_ts...>();
}
template <typename elem1_t, typename elem2_t>
explicit operator std::pair<elem1_t, elem2_t>() const
{
return as_pair<elem1_t, elem2_t>();
}
template <
typename jsonization_t,
std::enable_if_t<_utils::has_from_json_in_member<jsonization_t, string_t>::value, bool> =
true>
explicit operator jsonization_t() const
{
jsonization_t dst {};
@@ -137,8 +219,12 @@ public:
}
return dst;
}
template <typename jsonization_t,
std::enable_if_t<_utils::has_from_json_in_templ_spec<jsonization_t, string_t>::value, bool> = true>
template <
typename jsonization_t,
std::enable_if_t<
_utils::has_from_json_in_templ_spec<jsonization_t, string_t>::value,
bool> = true>
explicit operator jsonization_t() const
{
jsonization_t dst {};
@@ -150,13 +236,25 @@ public:
private:
template <typename... key_then_default_value_t, size_t... keys_indexes_t>
auto get(std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const;
auto
get(std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const;
template <typename value_t, typename... rest_keys_t>
auto get_helper(const value_t& default_value, size_t pos, rest_keys_t&&... rest) const;
template <typename value_t>
auto get_helper(const value_t& default_value, size_t pos) const;
template <typename tuple_t>
tuple_t as_tuple_templ() const;
template <size_t index, typename tuple_t>
void set_tuple(tuple_t& tup) const;
template <typename Tuple, std::size_t... Is>
void foreach_tuple(const Tuple& t, std::index_sequence<Is...>)
{
(_array_data.emplace_back(std::get<Is>(t)), ...);
}
string_t format(size_t indent, size_t indent_times) const;
private:
@@ -164,15 +262,20 @@ private:
};
template <typename string_t>
inline basic_array<string_t>::basic_array(std::initializer_list<value_type> init_list) : _array_data(init_list)
{}
inline basic_array<string_t>::basic_array(std::initializer_list<value_type> init_list)
: _array_data(init_list)
{
}
template <typename string_t>
inline basic_array<string_t>::basic_array(typename raw_array::size_type size) : _array_data(size)
{}
inline basic_array<string_t>::basic_array(typename raw_array::size_type size)
: _array_data(size)
{
}
// template <typename string_t>
// inline basic_array<string_t>::basic_array(const basic_value<string_t>& val) : basic_array<string_t>(val.as_array())
// inline basic_array<string_t>::basic_array(const basic_value<string_t>& val) :
// basic_array<string_t>(val.as_array())
//{}
//
// template <typename string_t>
@@ -202,8 +305,9 @@ template <typename string_t>
template <typename... args_t>
inline decltype(auto) basic_array<string_t>::emplace_back(args_t&&... args)
{
static_assert(std::is_constructible_v<value_type, args_t...>,
"Parameter can't be used to construct a raw_array::value_type");
static_assert(
std::is_constructible_v<value_type, args_t...>,
"Parameter can't be used to construct a raw_array::value_type");
return _array_data.emplace_back(std::forward<args_t>(args)...);
}
@@ -266,18 +370,18 @@ inline bool basic_array<string_t>::all() const
namespace _as_collection_helper
{
template <typename T>
class has_emplace_back
{
template <typename U>
static auto test(int) -> decltype(std::declval<U>().emplace_back(), std::true_type());
template <typename T>
class has_emplace_back
{
template <typename U>
static auto test(int) -> decltype(std::declval<U>().emplace_back(), std::true_type());
template <typename U>
static std::false_type test(...);
template <typename U>
static std::false_type test(...);
public:
static constexpr bool value = decltype(test<T>(0))::value;
};
public:
static constexpr bool value = decltype(test<T>(0))::value;
};
}
template <typename string_t>
@@ -298,31 +402,94 @@ inline collection_t<value_t> basic_array<string_t>::as_collection() const
return result;
}
template <typename string_t>
template <typename value_t, size_t Size, template <typename, size_t> typename fixed_array_t>
inline fixed_array_t<value_t, Size> basic_array<string_t>::as_fixed_array() const
{
if (size() != Size) {
throw exception("Wrong array size");
}
fixed_array_t<value_t, Size> result;
for (size_t i = 0; i < Size; ++i) {
result.at(i) = _array_data.at(i).template as<value_t>();
}
return result;
}
template <typename string_t>
template <size_t index, typename tuple_t>
inline void basic_array<string_t>::set_tuple(tuple_t& tup) const
{
using elem_t = std::tuple_element_t<index, tuple_t>;
if constexpr (index > 0) {
set_tuple<index - 1>(tup);
}
std::get<index>(tup) = static_cast<elem_t>(at(index));
}
template <typename string_t>
template <typename tuple_t>
inline tuple_t basic_array<string_t>::as_tuple_templ() const
{
constexpr size_t tuple_size = std::tuple_size_v<tuple_t>;
if (size() != tuple_size) {
throw exception("Wrong array size");
}
tuple_t result;
set_tuple<tuple_size - 1>(result);
return result;
}
template <typename string_t>
template <typename... elem_ts>
inline std::tuple<elem_ts...> basic_array<string_t>::as_tuple() const
{
return as_tuple_templ<std::tuple<elem_ts...>>();
}
template <typename string_t>
template <typename first_t, typename second_t>
inline std::pair<first_t, second_t> basic_array<string_t>::as_pair() const
{
return as_tuple_templ<std::pair<first_t, second_t>>();
}
template <typename string_t>
template <typename... key_then_default_value_t>
inline auto basic_array<string_t>::get(key_then_default_value_t&&... keys_then_default_value) const
{
return get(std::forward_as_tuple(keys_then_default_value...),
std::make_index_sequence<sizeof...(keys_then_default_value) - 1> {});
return get(
std::forward_as_tuple(keys_then_default_value...),
std::make_index_sequence<sizeof...(keys_then_default_value) - 1> {});
}
template <typename string_t>
template <typename... key_then_default_value_t, size_t... keys_indexes_t>
inline auto basic_array<string_t>::get(std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const
inline auto basic_array<string_t>::get(
std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const
{
constexpr unsigned long default_value_index = sizeof...(key_then_default_value_t) - 1;
return get_helper(std::get<default_value_index>(keys_then_default_value),
std::get<keys_indexes_t>(keys_then_default_value)...);
return get_helper(
std::get<default_value_index>(keys_then_default_value),
std::get<keys_indexes_t>(keys_then_default_value)...);
}
template <typename string_t>
template <typename value_t, typename... rest_keys_t>
inline auto basic_array<string_t>::get_helper(const value_t& default_value, size_t pos, rest_keys_t&&... rest) const
inline auto basic_array<string_t>::get_helper(
const value_t& default_value,
size_t pos,
rest_keys_t&&... rest) const
{
constexpr bool is_json = std::is_same_v<basic_value<string_t>, value_t> ||
std::is_same_v<basic_array<string_t>, value_t> ||
std::is_same_v<basic_object<string_t>, value_t>;
constexpr bool is_json = std::is_same_v<basic_value<string_t>, value_t>
|| std::is_same_v<basic_array<string_t>, value_t>
|| std::is_same_v<basic_object<string_t>, value_t>;
constexpr bool is_string = std::is_constructible_v<string_t, value_t> && !is_json;
if (!contains(pos)) {
@@ -341,9 +508,9 @@ template <typename string_t>
template <typename value_t>
inline auto basic_array<string_t>::get_helper(const value_t& default_value, size_t pos) const
{
constexpr bool is_json = std::is_same_v<basic_value<string_t>, value_t> ||
std::is_same_v<basic_array<string_t>, value_t> ||
std::is_same_v<basic_object<string_t>, value_t>;
constexpr bool is_json = std::is_same_v<basic_value<string_t>, value_t>
|| std::is_same_v<basic_array<string_t>, value_t>
|| std::is_same_v<basic_object<string_t>, value_t>;
constexpr bool is_string = std::is_constructible_v<string_t, value_t> && !is_json;
if (!contains(pos)) {
@@ -382,7 +549,8 @@ inline std::optional<value_t> basic_array<string_t>::find(size_t pos) const
return std::nullopt;
}
const auto& val = _array_data.at(pos);
return val.template is<value_t>() ? std::optional<value_t>(val.template as<value_t>()) : std::nullopt;
return val.template is<value_t>() ? std::optional<value_t>(val.template as<value_t>())
: std::nullopt;
}
template <typename string_t>
@@ -434,25 +602,29 @@ inline typename basic_array<string_t>::reverse_iterator basic_array<string_t>::r
}
template <typename string_t>
inline typename basic_array<string_t>::const_reverse_iterator basic_array<string_t>::rbegin() const noexcept
inline typename basic_array<string_t>::const_reverse_iterator
basic_array<string_t>::rbegin() const noexcept
{
return _array_data.rbegin();
}
template <typename string_t>
inline typename basic_array<string_t>::const_reverse_iterator basic_array<string_t>::rend() const noexcept
inline typename basic_array<string_t>::const_reverse_iterator
basic_array<string_t>::rend() const noexcept
{
return _array_data.rend();
}
template <typename string_t>
inline typename basic_array<string_t>::const_reverse_iterator basic_array<string_t>::crbegin() const noexcept
inline typename basic_array<string_t>::const_reverse_iterator
basic_array<string_t>::crbegin() const noexcept
{
return _array_data.crbegin();
}
template <typename string_t>
inline typename basic_array<string_t>::const_reverse_iterator basic_array<string_t>::crend() const noexcept
inline typename basic_array<string_t>::const_reverse_iterator
basic_array<string_t>::crend() const noexcept
{
return _array_data.crend();
}
@@ -470,7 +642,8 @@ inline const basic_value<string_t>& basic_array<string_t>::operator[](size_t pos
}
template <typename string_t>
inline basic_array<string_t> basic_array<string_t>::operator+(const basic_array<string_t>& rhs) const&
inline basic_array<string_t>
basic_array<string_t>::operator+(const basic_array<string_t>& rhs) const&
{
basic_array<string_t> temp = *this;
temp._array_data.insert(_array_data.end(), rhs.begin(), rhs.end());
@@ -481,8 +654,10 @@ template <typename string_t>
inline basic_array<string_t> basic_array<string_t>::operator+(basic_array<string_t>&& rhs) const&
{
basic_array<string_t> temp = *this;
temp._array_data.insert(_array_data.end(), std::make_move_iterator(rhs.begin()),
std::make_move_iterator(rhs.end()));
temp._array_data.insert(
_array_data.end(),
std::make_move_iterator(rhs.begin()),
std::make_move_iterator(rhs.end()));
return temp;
}
@@ -496,7 +671,10 @@ inline basic_array<string_t> basic_array<string_t>::operator+(const basic_array<
template <typename string_t>
inline basic_array<string_t> basic_array<string_t>::operator+(basic_array<string_t>&& rhs) &&
{
_array_data.insert(_array_data.end(), std::make_move_iterator(rhs.begin()), std::make_move_iterator(rhs.end()));
_array_data.insert(
_array_data.end(),
std::make_move_iterator(rhs.begin()),
std::make_move_iterator(rhs.end()));
return std::move(*this);
}
@@ -510,7 +688,10 @@ inline basic_array<string_t>& basic_array<string_t>::operator+=(const basic_arra
template <typename string_t>
inline basic_array<string_t>& basic_array<string_t>::operator+=(basic_array<string_t>&& rhs)
{
_array_data.insert(_array_data.end(), std::make_move_iterator(rhs.begin()), std::make_move_iterator(rhs.end()));
_array_data.insert(
_array_data.end(),
std::make_move_iterator(rhs.begin()),
std::make_move_iterator(rhs.end()));
return *this;
}
@@ -520,11 +701,14 @@ inline bool basic_array<string_t>::operator==(const basic_array<string_t>& rhs)
return _array_data == rhs._array_data;
}
template <typename ostream_t, typename string_t,
typename std_ostream_t =
std::basic_ostream<typename string_t::value_type, std::char_traits<typename string_t::value_type>>,
typename enable_t =
std::enable_if_t<std::is_same_v<std_ostream_t, ostream_t> || std::is_base_of_v<std_ostream_t, ostream_t>>>
template <
typename ostream_t,
typename string_t,
typename std_ostream_t = std::basic_ostream<
typename string_t::value_type,
std::char_traits<typename string_t::value_type>>,
typename enable_t = std::enable_if_t<
std::is_same_v<std_ostream_t, ostream_t> || std::is_base_of_v<std_ostream_t, ostream_t>>>
ostream_t& operator<<(ostream_t& out, const basic_array<string_t>& arr)
{
out << arr.format();

View File

@@ -1,3 +1,5 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include <exception>
@@ -9,7 +11,11 @@ class exception : public std::exception
{
public:
exception() = default;
exception(const std::string& msg) : _what(msg) {}
exception(const std::string& msg)
: _what(msg)
{
}
exception(const exception&) = default;
exception& operator=(const exception&) = default;
@@ -18,7 +24,10 @@ public:
virtual ~exception() noexcept override = default;
virtual const char* what() const noexcept override { return _what.empty() ? "Unknown exception" : _what.c_str(); }
virtual const char* what() const noexcept override
{
return _what.empty() ? "Unknown exception" : _what.c_str();
}
protected:
std::string _what;

View File

@@ -1,3 +1,5 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include <initializer_list>
@@ -36,31 +38,54 @@ public:
// explicit basic_object(const basic_value<string_t>& val);
// explicit basic_object(basic_value<string_t>&& val);
template <typename map_t, std::enable_if_t<_utils::is_map<map_t> &&
std::is_constructible_v<value_type, _utils::range_value_t<map_t>>,
bool> = true>
basic_object(map_t map) : _object_data(std::make_move_iterator(map.begin()), std::make_move_iterator(map.end()))
{}
template <typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_member<jsonization_t>::value, bool> = true>
basic_object(const jsonization_t& value) : basic_object(value.to_json())
{}
template <typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_templ_spec<jsonization_t>::value, bool> = true>
basic_object(const jsonization_t& value) : basic_object(ext::jsonization<jsonization_t>().to_json(value))
{}
template <
typename map_t,
std::enable_if_t<
_utils::is_map<map_t>
&& std::is_constructible_v<value_type, _utils::range_value_t<map_t>>,
bool> = true>
basic_object(map_t map)
: _object_data(std::make_move_iterator(map.begin()), std::make_move_iterator(map.end()))
{
}
template <
typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_member<jsonization_t>::value, bool> = true>
basic_object(const jsonization_t& value)
: basic_object(value.to_json())
{
}
template <
typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_templ_spec<jsonization_t>::value, bool> = true>
basic_object(const jsonization_t& value)
: basic_object(ext::jsonization<jsonization_t>().to_json(value))
{
}
~basic_object() = default;
bool empty() const noexcept { return _object_data.empty(); }
size_t size() const noexcept { return _object_data.size(); }
bool contains(const string_t& key) const;
bool exists(const string_t& key) const { return contains(key); }
const basic_value<string_t>& at(const string_t& key) const;
string_t dumps(std::optional<size_t> indent = std::nullopt) const { return indent ? format(*indent) : to_string(); }
string_t dumps(std::optional<size_t> indent = std::nullopt) const
{
return indent ? format(*indent) : to_string();
}
string_t to_string() const;
string_t format(size_t indent = 4) const { return format(indent, 0); }
template <typename value_t>
bool all() const;
template <typename value_t, template <typename...> typename map_t = std::map>
@@ -102,23 +127,32 @@ public:
basic_object<string_t>& operator=(const basic_object<string_t>&) = default;
basic_object<string_t>& operator=(basic_object<string_t>&&) = default;
template <typename value_t, std::enable_if_t<std::is_convertible_v<value_t, basic_object<string_t>>, bool> = true>
template <
typename value_t,
std::enable_if_t<std::is_convertible_v<value_t, basic_object<string_t>>, bool> = true>
basic_object<string_t>& operator=(value_t rhs)
{
return *this = basic_object<string_t>(std::move(rhs));
}
bool operator==(const basic_object<string_t>& rhs) const;
bool operator!=(const basic_object<string_t>& rhs) const { return !(*this == rhs); }
template <typename value_t, template <typename...> typename map_t = std::map,
std::enable_if_t<_utils::is_map<map_t<string_t, value_t>>, bool> = true>
template <
typename value_t,
template <typename...> typename map_t = std::map,
std::enable_if_t<_utils::is_map<map_t<string_t, value_t>>, bool> = true>
explicit operator map_t<string_t, value_t>() const
{
return as_map<value_t, map_t>();
}
template <typename jsonization_t,
std::enable_if_t<_utils::has_from_json_in_member<jsonization_t, string_t>::value, bool> = true>
template <
typename jsonization_t,
std::enable_if_t<_utils::has_from_json_in_member<jsonization_t, string_t>::value, bool> =
true>
explicit operator jsonization_t() const
{
jsonization_t dst {};
@@ -127,8 +161,12 @@ public:
}
return dst;
}
template <typename jsonization_t,
std::enable_if_t<_utils::has_from_json_in_templ_spec<jsonization_t, string_t>::value, bool> = true>
template <
typename jsonization_t,
std::enable_if_t<
_utils::has_from_json_in_templ_spec<jsonization_t, string_t>::value,
bool> = true>
explicit operator jsonization_t() const
{
jsonization_t dst {};
@@ -140,8 +178,9 @@ public:
private:
template <typename... key_then_default_value_t, size_t... keys_indexes_t>
auto get(std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const;
auto
get(std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const;
template <typename value_t, typename... rest_keys_t>
auto get_helper(const value_t& default_value, const string_t& key, rest_keys_t&&... rest) const;
template <typename value_t>
@@ -155,8 +194,11 @@ private:
template <typename string_t>
inline basic_object<string_t>::basic_object(std::initializer_list<value_type> init_list)
: _object_data(std::make_move_iterator(init_list.begin()), std::make_move_iterator(init_list.end()))
{}
: _object_data(
std::make_move_iterator(init_list.begin()),
std::make_move_iterator(init_list.end()))
{
}
// template <typename string_t>
// inline basic_object<string_t>::basic_object(const basic_value<string_t>& val) :
@@ -202,9 +244,10 @@ template <typename string_t>
template <typename... args_t>
inline decltype(auto) basic_object<string_t>::emplace(args_t&&... args)
{
static_assert(std::is_constructible_v<value_type, args_t...>,
"Parameter can't be used to construct a raw_object::value_type");
return _object_data.emplace(std::forward<args_t>(args)...);
static_assert(
std::is_constructible_v<value_type, args_t...>,
"Parameter can't be used to construct a raw_object::value_type");
return _object_data.insert_or_assign(std::forward<args_t>(args)...);
}
template <typename string_t>
@@ -220,7 +263,8 @@ inline string_t basic_object<string_t>::to_string() const
string_t str { '{' };
for (auto iter = _object_data.cbegin(); iter != _object_data.cend();) {
const auto& [key, val] = *iter;
str += char_t('"') + _utils::unescape_string(key) + string_t { '\"', ':' } + val.to_string();
str +=
char_t('"') + _utils::unescape_string(key) + string_t { '\"', ':' } + val.to_string();
if (++iter != _object_data.cend()) {
str += ',';
}
@@ -238,8 +282,8 @@ inline string_t basic_object<string_t>::format(size_t indent, size_t indent_time
string_t str { '{', '\n' };
for (auto iter = _object_data.cbegin(); iter != _object_data.cend();) {
const auto& [key, val] = *iter;
str += body_indent + char_t('"') + _utils::unescape_string(key) + string_t { '\"', ':', ' ' } +
val.format(indent, indent_times + 1);
str += body_indent + char_t('"') + _utils::unescape_string(key)
+ string_t { '\"', ':', ' ' } + val.format(indent, indent_times + 1);
if (++iter != _object_data.cend()) {
str += ',';
}
@@ -276,28 +320,33 @@ template <typename string_t>
template <typename... key_then_default_value_t>
inline auto basic_object<string_t>::get(key_then_default_value_t&&... keys_then_default_value) const
{
return get(std::forward_as_tuple(keys_then_default_value...),
std::make_index_sequence<sizeof...(keys_then_default_value) - 1> {});
return get(
std::forward_as_tuple(keys_then_default_value...),
std::make_index_sequence<sizeof...(keys_then_default_value) - 1> {});
}
template <typename string_t>
template <typename... key_then_default_value_t, size_t... keys_indexes_t>
inline auto basic_object<string_t>::get(std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const
inline auto basic_object<string_t>::get(
std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const
{
constexpr unsigned long default_value_index = sizeof...(key_then_default_value_t) - 1;
return get_helper(std::get<default_value_index>(keys_then_default_value),
std::get<keys_indexes_t>(keys_then_default_value)...);
return get_helper(
std::get<default_value_index>(keys_then_default_value),
std::get<keys_indexes_t>(keys_then_default_value)...);
}
template <typename string_t>
template <typename value_t, typename... rest_keys_t>
inline auto basic_object<string_t>::get_helper(const value_t& default_value, const string_t& key,
rest_keys_t&&... rest) const
inline auto basic_object<string_t>::get_helper(
const value_t& default_value,
const string_t& key,
rest_keys_t&&... rest) const
{
constexpr bool is_json = std::is_same_v<basic_value<string_t>, value_t> ||
std::is_same_v<basic_array<string_t>, value_t> ||
std::is_same_v<basic_object<string_t>, value_t>;
constexpr bool is_json = std::is_same_v<basic_value<string_t>, value_t>
|| std::is_same_v<basic_array<string_t>, value_t>
|| std::is_same_v<basic_object<string_t>, value_t>;
constexpr bool is_string = std::is_constructible_v<string_t, value_t> && !is_json;
if (!contains(key)) {
@@ -314,11 +363,12 @@ inline auto basic_object<string_t>::get_helper(const value_t& default_value, con
template <typename string_t>
template <typename value_t>
inline auto basic_object<string_t>::get_helper(const value_t& default_value, const string_t& key) const
inline auto
basic_object<string_t>::get_helper(const value_t& default_value, const string_t& key) const
{
constexpr bool is_json = std::is_same_v<basic_value<string_t>, value_t> ||
std::is_same_v<basic_array<string_t>, value_t> ||
std::is_same_v<basic_object<string_t>, value_t>;
constexpr bool is_json = std::is_same_v<basic_value<string_t>, value_t>
|| std::is_same_v<basic_array<string_t>, value_t>
|| std::is_same_v<basic_object<string_t>, value_t>;
constexpr bool is_string = std::is_constructible_v<string_t, value_t> && !is_json;
if (!contains(key)) {
@@ -358,7 +408,8 @@ inline std::optional<value_t> basic_object<string_t>::find(const string_t& key)
return std::nullopt;
}
const auto& val = iter->second;
return val.template is<value_t>() ? std::optional<value_t>(val.template as<value_t>()) : std::nullopt;
return val.template is<value_t>() ? std::optional<value_t>(val.template as<value_t>())
: std::nullopt;
}
template <typename string_t>
@@ -374,7 +425,8 @@ inline typename basic_object<string_t>::iterator basic_object<string_t>::end() n
}
template <typename string_t>
inline typename basic_object<string_t>::const_iterator basic_object<string_t>::begin() const noexcept
inline typename basic_object<string_t>::const_iterator
basic_object<string_t>::begin() const noexcept
{
return _object_data.begin();
}
@@ -386,7 +438,8 @@ inline typename basic_object<string_t>::const_iterator basic_object<string_t>::e
}
template <typename string_t>
inline typename basic_object<string_t>::const_iterator basic_object<string_t>::cbegin() const noexcept
inline typename basic_object<string_t>::const_iterator
basic_object<string_t>::cbegin() const noexcept
{
return _object_data.cbegin();
}
@@ -410,7 +463,8 @@ inline basic_value<string_t>& basic_object<string_t>::operator[](string_t&& key)
}
template <typename string_t>
inline basic_object<string_t> basic_object<string_t>::operator|(const basic_object<string_t>& rhs) const&
inline basic_object<string_t>
basic_object<string_t>::operator|(const basic_object<string_t>& rhs) const&
{
basic_object<string_t> temp = *this;
temp._object_data.insert(rhs.begin(), rhs.end());
@@ -422,12 +476,15 @@ inline basic_object<string_t> basic_object<string_t>::operator|(basic_object<str
{
basic_object<string_t> temp = *this;
// temp._object_data.merge(std::move(rhs._object_data));
temp._object_data.insert(std::make_move_iterator(rhs.begin()), std::make_move_iterator(rhs.end()));
temp._object_data.insert(
std::make_move_iterator(rhs.begin()),
std::make_move_iterator(rhs.end()));
return temp;
}
template <typename string_t>
inline basic_object<string_t> basic_object<string_t>::operator|(const basic_object<string_t>& rhs) &&
inline basic_object<string_t>
basic_object<string_t>::operator|(const basic_object<string_t>& rhs) &&
{
_object_data.insert(rhs.begin(), rhs.end());
return std::move(*this);
@@ -461,11 +518,14 @@ inline bool basic_object<string_t>::operator==(const basic_object<string_t>& rhs
return _object_data == rhs._object_data;
}
template <typename ostream_t, typename string_t,
typename std_ostream_t =
std::basic_ostream<typename string_t::value_type, std::char_traits<typename string_t::value_type>>,
typename enable_t =
std::enable_if_t<std::is_same_v<std_ostream_t, ostream_t> || std::is_base_of_v<std_ostream_t, ostream_t>>>
template <
typename ostream_t,
typename string_t,
typename std_ostream_t = std::basic_ostream<
typename string_t::value_type,
std::char_traits<typename string_t::value_type>>,
typename enable_t = std::enable_if_t<
std::is_same_v<std_ostream_t, ostream_t> || std::is_base_of_v<std_ostream_t, ostream_t>>>
ostream_t& operator<<(ostream_t& out, const basic_object<string_t>& obj)
{
out << obj.format();

View File

@@ -1,3 +1,5 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include <type_traits>
@@ -9,96 +11,101 @@ namespace json
{
namespace _serialization_helper
{
template <typename in_t, typename serializer_t>
class is_serializable
{
template <typename U>
static auto test(int) -> decltype(std::declval<serializer_t>()(std::declval<U>()), std::true_type());
template <typename in_t, typename serializer_t>
class is_serializable
{
template <typename U>
static auto test(int)
-> decltype(std::declval<serializer_t>()(std::declval<U>()), std::true_type());
template <typename U>
static std::false_type test(...);
template <typename U>
static std::false_type test(...);
public:
static constexpr bool value = decltype(test<in_t>(0))::value;
};
public:
static constexpr bool value = decltype(test<in_t>(0))::value;
};
struct empty_serializer
{
// sample:
// json::value operator()(const type_1&) const { return ...; }
// json::value operator()(const type_2&) const { return ...; }
// json::value operator()(const type_3&) const { return ...; }
};
struct empty_serializer
{
// sample:
// json::value operator()(const type_1&) const { return ...; }
// json::value operator()(const type_2&) const { return ...; }
// json::value operator()(const type_3&) const { return ...; }
};
template <typename T>
void unable_to_serialize()
{
static_assert(!sizeof(T), "Unable to serialize T. "
template <typename T>
void unable_to_serialize()
{
static_assert(
!sizeof(T),
"Unable to serialize T. "
#ifdef _MSC_VER
"See T below: " __FUNCSIG__
"See T below: " __FUNCSIG__
#else
// "See T below: " __PRETTY_FUNCTION__
// "See T below: " __PRETTY_FUNCTION__
#endif
);
}
);
}
}
namespace _serialization_helper
{
template <typename out_t, typename deserializer_t, typename string_t = default_string_t>
class is_deserializable
{
template <typename U>
static auto test(int)
-> decltype(std::declval<deserializer_t>()(std::declval<basic_value<string_t>>(), std::declval<U&>()),
std::true_type());
template <typename out_t, typename deserializer_t, typename string_t = default_string_t>
class is_deserializable
{
template <typename U>
static auto test(int)
-> decltype(std::declval<deserializer_t>()(std::declval<basic_value<string_t>>(), std::declval<U&>()), std::true_type());
template <typename U>
static std::false_type test(...);
template <typename U>
static std::false_type test(...);
public:
static constexpr bool value = decltype(test<out_t>(0))::value;
};
public:
static constexpr bool value = decltype(test<out_t>(0))::value;
};
struct empty_deserializer
{
// sample:
// bool operator()(const json::value&, type_1&) const { return ...; }
// bool operator()(const json::value&, type_2&) const { return ...; }
// bool operator()(const json::value&, type_3&) const { return ...; }
};
struct empty_deserializer
{
// sample:
// bool operator()(const json::value&, type_1&) const { return ...; }
// bool operator()(const json::value&, type_2&) const { return ...; }
// bool operator()(const json::value&, type_3&) const { return ...; }
};
template <typename T>
void unable_to_deserialize()
{
static_assert(!sizeof(T), "Unable to deserialize T. "
template <typename T>
void unable_to_deserialize()
{
static_assert(
!sizeof(T),
"Unable to deserialize T. "
#ifdef _MSC_VER
"See T below: " __FUNCSIG__
"See T below: " __FUNCSIG__
#else
// "See T below: " __PRETTY_FUNCTION__
// "See T below: " __PRETTY_FUNCTION__
#endif
);
}
);
}
}
template <typename in_t, typename serializer_t = _serialization_helper::empty_serializer,
typename string_t = default_string_t>
template <
typename in_t,
typename serializer_t = _serialization_helper::empty_serializer,
typename string_t = default_string_t>
basic_value<string_t> serialize(in_t&& in, const serializer_t& serializer = {})
{
if constexpr (_serialization_helper::is_serializable<in_t, serializer_t>::value) {
return serializer(std::forward<in_t>(in));
}
else if constexpr (std::is_constructible_v<basic_value<string_t>, in_t>) {
return basic_value<string_t>(std::forward<in_t>(in));
}
else if constexpr (_utils::is_collection<std::decay_t<in_t>>) {
else if constexpr (
_utils::is_collection<std::decay_t<in_t>> || _utils::is_fixed_array<std::decay_t<in_t>>) {
basic_array<string_t> arr;
for (auto&& elem : in) {
using elem_t = decltype(elem);
auto j_elem = serialize<elem_t, serializer_t, string_t>(std::forward<elem_t>(elem), serializer);
auto j_elem =
serialize<elem_t, serializer_t, string_t>(std::forward<elem_t>(elem), serializer);
arr.emplace_back(std::move(j_elem));
}
return arr;
@@ -109,27 +116,32 @@ basic_value<string_t> serialize(in_t&& in, const serializer_t& serializer = {})
using key_t = decltype(key);
using elem_t = decltype(elem);
auto j_elem = serialize<elem_t, serializer_t, string_t>(std::forward<elem_t>(elem), serializer);
auto j_elem =
serialize<elem_t, serializer_t, string_t>(std::forward<elem_t>(elem), serializer);
obj.emplace(std::forward<key_t>(key), std::move(j_elem));
}
return obj;
}
else if constexpr (std::is_constructible_v<basic_value<string_t>, in_t>) {
return basic_value<string_t>(std::forward<in_t>(in));
}
else {
_serialization_helper::unable_to_serialize<in_t>();
}
}
template <typename out_t, typename deserializer_t = _serialization_helper::empty_deserializer,
typename string_t = default_string_t>
bool deserialize(const basic_value<string_t>& in, out_t& out, const deserializer_t& deserializer = {})
template <
typename out_t,
typename deserializer_t = _serialization_helper::empty_deserializer,
typename string_t = default_string_t>
bool deserialize(
const basic_value<string_t>& in,
out_t& out,
const deserializer_t& deserializer = {})
{
if constexpr (_serialization_helper::is_deserializable<out_t, deserializer_t>::value) {
return deserializer(in, out);
}
else if constexpr (std::is_constructible_v<out_t, basic_value<string_t>>) {
out = out_t(in);
return true;
}
else if constexpr (_utils::is_collection<std::decay_t<out_t>>) {
if (!in.is_array()) {
return false;
@@ -149,20 +161,45 @@ bool deserialize(const basic_value<string_t>& in, out_t& out, const deserializer
}
return true;
}
else if constexpr (_utils::is_map<std::decay_t<out_t>>) {
if (!in.is_object()) {
else if constexpr (_utils::is_fixed_array<std::decay_t<out_t>>) {
if (!in.is_array()) {
return false;
}
for (auto&& [key, j_elem] : in.as_object()) {
auto&& in_as_arr = in.as_array();
constexpr size_t out_size = _utils::fixed_array_size<out_t>;
if (in_as_arr.size() != out_size) {
return false;
}
for (size_t i = 0; i < out_size; ++i) {
auto&& j_elem = in_as_arr.at(i);
using elem_t = typename out_t::value_type;
elem_t elem {};
if (!deserialize<elem_t, deserializer_t, string_t>(j_elem, elem, deserializer)) {
return false;
}
out.emplace(std::move(elem));
out.at(i) = std::move(elem);
}
return true;
}
else if constexpr (_utils::is_map<std::decay_t<out_t>>) {
if (!in.is_object()) {
return false;
}
for (auto&& [key, j_elem] : in.as_object()) {
using elem_t = typename out_t::mapped_type;
elem_t elem {};
if (!deserialize<elem_t, deserializer_t, string_t>(j_elem, elem, deserializer)) {
return false;
}
out.emplace(std::forward<decltype(key)>(key), std::move(elem));
}
return true;
}
else if constexpr (std::is_constructible_v<out_t, basic_value<string_t>>) {
out = out_t(in);
return true;
}
else {
_serialization_helper::unable_to_deserialize<out_t>();
}

View File

@@ -1,5 +1,7 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include "array.hpp"
#include "object.hpp"
#include "value.hpp"
#include "value.hpp"

View File

@@ -1,7 +1,14 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include <iomanip>
#include <limits>
#include <sstream>
#include <string>
#include <type_traits>
#include <utility>
#include <variant>
namespace json
{
@@ -61,12 +68,38 @@ constexpr bool is_container<T, std::void_t<typename T::value_type, range_value_t
template <typename T, typename = void>
constexpr bool is_map = false;
template <typename T>
constexpr bool is_map<T, std::void_t<typename T::key_type, typename T::mapped_type>> = is_container<T>;
constexpr bool is_map<T, std::void_t<typename T::key_type, typename T::mapped_type>> =
is_container<T>;
template <typename T, typename = void>
constexpr bool is_fixed_array = false;
template <template <typename, size_t> typename arr_t, typename value_t, size_t size>
constexpr bool is_fixed_array<arr_t<value_t, size>> = true;
template <typename T, typename = std::enable_if_t<is_fixed_array<T>>>
constexpr size_t fixed_array_size = 0;
template <template <typename, size_t> typename arr_t, typename value_t, size_t size>
constexpr size_t fixed_array_size<arr_t<value_t, size>> = size;
template <typename T, typename = void>
constexpr bool is_collection = false;
template <typename T>
constexpr bool is_collection<T> = is_container<T> && !is_map<T>;
constexpr bool is_collection<T> = is_container<T> && !is_map<T> && !is_fixed_array<T>;
template <typename T>
constexpr bool is_variant = false;
template <typename... args_t>
constexpr bool is_variant<std::variant<args_t...>> = true;
template <typename T>
constexpr bool is_tuple = false;
template <typename... args_t>
constexpr bool is_tuple<std::tuple<args_t...>> = true;
template <typename T>
constexpr bool is_pair = false;
template <typename... args_t>
constexpr bool is_pair<std::pair<args_t...>> = true;
template <typename T>
class has_to_json_in_member
@@ -85,7 +118,8 @@ template <typename T>
class has_to_json_in_templ_spec
{
template <typename U>
static auto test(int) -> decltype(std::declval<ext::jsonization<U>>().to_json(std::declval<U>()), std::true_type());
static auto test(int)
-> decltype(std::declval<ext::jsonization<U>>().to_json(std::declval<U>()), std::true_type());
template <typename U>
static std::false_type test(...);
@@ -113,8 +147,7 @@ class has_check_json_in_templ_spec
{
template <typename U>
static auto test(int)
-> decltype(std::declval<ext::jsonization<U>>().check_json(std::declval<json::basic_value<string_t>>()),
std::true_type());
-> decltype(std::declval<ext::jsonization<U>>().check_json(std::declval<json::basic_value<string_t>>()), std::true_type());
template <typename U>
static std::false_type test(...);
@@ -142,9 +175,7 @@ class has_from_json_in_templ_spec
{
template <typename U>
static auto test(int)
-> decltype(std::declval<ext::jsonization<U>>().from_json(std::declval<json::basic_value<string_t>>(),
std::declval<U&>()),
std::true_type());
-> decltype(std::declval<ext::jsonization<U>>().from_json(std::declval<json::basic_value<string_t>>(), std::declval<U&>()), std::true_type());
template <typename U>
static std::false_type test(...);
@@ -154,7 +185,7 @@ public:
};
template <typename string_t>
static constexpr string_t unescape_string(const string_t& str)
inline constexpr string_t unescape_string(const string_t& str)
{
using char_t = typename string_t::value_type;
@@ -202,26 +233,41 @@ static constexpr string_t unescape_string(const string_t& str)
}
template <typename string_t>
static constexpr string_t true_string()
inline constexpr string_t true_string()
{
return { 't', 'r', 'u', 'e' };
}
template <typename string_t>
static constexpr string_t false_string()
inline constexpr string_t false_string()
{
return { 'f', 'a', 'l', 's', 'e' };
}
template <typename string_t>
static constexpr string_t null_string()
inline constexpr string_t null_string()
{
return { 'n', 'u', 'l', 'l' };
}
template <typename string_t, typename any_t>
string_t to_basic_string(any_t&& arg)
inline string_t to_basic_string(any_t&& arg)
{
#ifdef MEOJSON_KEEP_FLOATING_PRECISION
using real_type = std::remove_reference_t<any_t>;
if constexpr (std::is_floating_point_v<real_type>) {
if constexpr (std::is_same_v<string_t, std::string>) {
std::ostringstream oss;
oss << std::setprecision(std::numeric_limits<real_type>::max_digits10) << arg;
return oss.str();
}
else if constexpr (std::is_same_v<string_t, std::wstring>) {
std::wostringstream oss;
oss << std::setprecision(std::numeric_limits<real_type>::max_digits10) << arg;
return oss.str();
}
}
#endif
if constexpr (std::is_same_v<string_t, std::string>) {
return std::to_string(std::forward<any_t>(arg));
}
@@ -232,4 +278,54 @@ string_t to_basic_string(any_t&& arg)
static_assert(!sizeof(any_t), "Unsupported type");
}
}
template <std::size_t id, typename string_t, typename variant_t>
inline bool _serialize_variant_impl(basic_value<string_t>& val, variant_t&& var)
{
if (var.index() != id) {
return false;
}
val = basic_value<string_t>(std::get<id>(std::forward<variant_t>(var)));
return true;
}
template <typename string_t, typename variant_t, std::size_t... ids>
inline basic_value<string_t> serialize_variant(variant_t&& var, std::index_sequence<ids...>)
{
basic_value<string_t> val;
(_serialize_variant_impl<ids>(val, std::forward<variant_t>(var)) || ...);
return val;
}
template <std::size_t id, typename string_t, typename variant_t>
inline bool _deserialize_variant_impl(const basic_value<string_t>& val, variant_t& var)
{
using alt_t = std::variant_alternative_t<id, variant_t>;
if (!val.template is<alt_t>()) {
return false;
}
var = val.template as<alt_t>();
return true;
}
template <typename string_t, typename variant_t, std::size_t... ids>
inline variant_t deserialize_variant(const basic_value<string_t>& val, std::index_sequence<ids...>)
{
variant_t var;
(_deserialize_variant_impl<ids>(val, var) || ...);
return var;
}
template <typename string_t, typename variant_t, std::size_t... ids>
inline bool detect_variant(const basic_value<string_t>& val, std::index_sequence<ids...>)
{
return (val.template is<std::variant_alternative_t<ids, variant_t>>() || ...);
}
template <typename string_t, typename tuple_t, std::size_t... ids>
inline bool detect_tuple(const basic_value<string_t>& val, std::index_sequence<ids...>)
{
return val.is_array() && val.as_array().size() == std::tuple_size_v<tuple_t>
&& (val.at(ids).template is<std::tuple_element_t<ids, tuple_t>>() || ...);
}
} // namespace json::_utils

View File

@@ -1,3 +1,5 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include <cstddef>
@@ -7,6 +9,8 @@
#include <ostream>
#include <string>
#include <tuple>
#include <type_traits>
#include <utility>
#include <variant>
#include "exception.hpp"
@@ -64,30 +68,87 @@ public:
template <typename... args_t>
basic_value(value_type type, args_t&&... args);
template <typename collection_t,
std::enable_if_t<_utils::is_collection<collection_t> &&
std::is_constructible_v<typename basic_array<string_t>::value_type,
_utils::range_value_t<collection_t>>,
bool> = true>
basic_value(collection_t&& collection) : basic_value(basic_array<string_t>(std::forward<collection_t>(collection)))
{}
template <typename map_t, std::enable_if_t<_utils::is_map<map_t> &&
std::is_constructible_v<typename basic_object<string_t>::value_type,
_utils::range_value_t<map_t>>,
bool> = true>
basic_value(map_t&& map) : basic_value(basic_object<string_t>(std::forward<map_t>(map)))
{}
template <
typename collection_t,
std::enable_if_t<
_utils::is_collection<collection_t>
&& std::is_constructible_v<
typename basic_array<string_t>::value_type,
_utils::range_value_t<collection_t>>,
bool> = true>
basic_value(collection_t&& collection)
: basic_value(basic_array<string_t>(std::forward<collection_t>(collection)))
{
}
template <typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_member<jsonization_t>::value, bool> = true>
basic_value(const jsonization_t& value) : basic_value(value.to_json())
{}
template <typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_templ_spec<jsonization_t>::value, bool> = true>
basic_value(const jsonization_t& value) : basic_value(ext::jsonization<jsonization_t>().to_json(value))
{}
template <
typename fixed_array_t,
std::enable_if_t<_utils::is_fixed_array<fixed_array_t>, bool> = true>
basic_value(const fixed_array_t& arr)
: basic_value(basic_array<string_t>(arr))
{
}
template <typename value_t, std::enable_if_t<!std::is_convertible_v<value_t, basic_value<string_t>>, bool> = true>
template <
typename map_t,
std::enable_if_t<
_utils::is_map<map_t>
&& std::is_constructible_v<
typename basic_object<string_t>::value_type,
_utils::range_value_t<map_t>>,
bool> = true>
basic_value(map_t&& map)
: basic_value(basic_object<string_t>(std::forward<map_t>(map)))
{
}
template <typename enum_t, std::enable_if_t<std::is_enum_v<enum_t>, bool> = true>
basic_value(enum_t e)
: basic_value(static_cast<std::underlying_type_t<enum_t>>(e))
{
}
template <
typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_member<jsonization_t>::value, bool> = true>
basic_value(const jsonization_t& value)
: basic_value(value.to_json())
{
}
template <
typename jsonization_t,
std::enable_if_t<_utils::has_to_json_in_templ_spec<jsonization_t>::value, bool> = true>
basic_value(const jsonization_t& value)
: basic_value(ext::jsonization<jsonization_t>().to_json(value))
{
}
template <typename... elem_ts>
basic_value(std::tuple<elem_ts...>&& tup)
: basic_value(basic_array<string_t>(std::forward<std::tuple<elem_ts...>>(tup)))
{
}
template <typename elem1_t, typename elem2_t>
basic_value(std::pair<elem1_t, elem2_t>&& pair)
: basic_value(basic_array<string_t>(std::pair<elem1_t, elem2_t>(pair)))
{
}
template <
typename variant_t,
std::enable_if_t<_utils::is_variant<std::decay_t<variant_t>>, bool> = true>
basic_value(variant_t&& var)
: basic_value(_utils::serialize_variant<string_t>(
std::forward<variant_t>(var),
std::make_index_sequence<std::variant_size_v<std::decay_t<variant_t>>>()))
{
}
template <
typename value_t,
std::enable_if_t<!std::is_convertible_v<value_t, basic_value<string_t>>, bool> = true>
basic_value(value_t) = delete;
// I don't know if you want to convert char to string or number, so I delete these constructors.
@@ -99,13 +160,21 @@ public:
~basic_value();
bool valid() const noexcept { return _type != value_type::invalid; }
bool empty() const noexcept { return is_null(); }
bool is_null() const noexcept { return _type == value_type::null; }
bool is_number() const noexcept { return _type == value_type::number; }
bool is_boolean() const noexcept { return _type == value_type::boolean; }
bool is_string() const noexcept { return _type == value_type::string; }
bool is_array() const noexcept { return _type == value_type::array; }
bool is_object() const noexcept { return _type == value_type::object; }
template <typename value_t>
bool is() const noexcept;
@@ -114,9 +183,13 @@ public:
bool contains(const string_t& key) const;
bool contains(size_t pos) const;
bool exists(const string_t& key) const { return contains(key); }
bool exists(size_t pos) const { return contains(pos); }
value_type type() const noexcept { return _type; }
const basic_value<string_t>& at(size_t pos) const;
const basic_value<string_t>& at(const string_t& key) const;
@@ -148,6 +221,11 @@ public:
template <typename value_t, template <typename...> typename collection_t = std::vector>
collection_t<value_t> as_collection() const;
template <
typename value_t,
size_t Size,
template <typename, size_t> typename fixed_array_t = std::array>
fixed_array_t<value_t, Size> as_fixed_array() const;
template <typename value_t, template <typename...> typename map_t = std::map>
map_t<string_t, value_t> as_map() const;
@@ -162,20 +240,29 @@ public:
void clear() noexcept;
string_t dumps(std::optional<size_t> indent = std::nullopt) const { return indent ? format(*indent) : to_string(); }
string_t dumps(std::optional<size_t> indent = std::nullopt) const
{
return indent ? format(*indent) : to_string();
}
// return raw string
string_t to_string() const;
string_t format(size_t indent = 4) const { return format(indent, 0); }
basic_value<string_t>& operator=(const basic_value<string_t>& rhs);
basic_value<string_t>& operator=(basic_value<string_t>&&) noexcept;
template <typename value_t, std::enable_if_t<std::is_convertible_v<value_t, basic_value<string_t>>, bool> = true>
template <
typename value_t,
std::enable_if_t<std::is_convertible_v<value_t, basic_value<string_t>>, bool> = true>
basic_value<string_t>& operator=(value_t rhs)
{
return *this = basic_value<string_t>(std::move(rhs));
}
bool operator==(const basic_value<string_t>& rhs) const;
bool operator!=(const basic_value<string_t>& rhs) const { return !(*this == rhs); }
const basic_value<string_t>& operator[](size_t pos) const;
@@ -200,34 +287,63 @@ public:
basic_value<string_t>& operator+=(basic_array<string_t>&& rhs);
explicit operator bool() const { return as_boolean(); }
explicit operator int() const { return as_integer(); }
explicit operator unsigned() const { return as_unsigned(); }
explicit operator long() const { return as_long(); }
explicit operator unsigned long() const { return as_unsigned_long(); }
explicit operator long long() const { return as_long_long(); }
explicit operator unsigned long long() const { return as_unsigned_long_long(); }
explicit operator float() const { return as_float(); }
explicit operator double() const { return as_double(); }
explicit operator long double() const { return as_long_double(); }
explicit operator string_t() const { return as_string(); }
explicit operator basic_array<string_t>() const { return as_array(); }
explicit operator basic_object<string_t>() const { return as_object(); }
template <typename value_t, template <typename...> typename collection_t = std::vector,
std::enable_if_t<_utils::is_collection<collection_t<value_t>>, bool> = true>
template <
typename value_t,
template <typename...> typename collection_t = std::vector,
std::enable_if_t<_utils::is_collection<collection_t<value_t>>, bool> = true>
explicit operator collection_t<value_t>() const
{
return as_collection<value_t, collection_t>();
}
template <typename value_t, template <typename...> typename map_t = std::map,
std::enable_if_t<_utils::is_map<map_t<string_t, value_t>>, bool> = true>
template <
typename value_t,
size_t Size,
template <typename, size_t> typename fixed_array_t = std::array,
std::enable_if_t<_utils::is_fixed_array<fixed_array_t<value_t, Size>>, bool> = true>
explicit operator fixed_array_t<value_t, Size>() const
{
return as_fixed_array<value_t, Size, fixed_array_t>();
}
template <
typename value_t,
template <typename...> typename map_t = std::map,
std::enable_if_t<_utils::is_map<map_t<string_t, value_t>>, bool> = true>
explicit operator map_t<string_t, value_t>() const
{
return as_map<value_t, map_t>();
}
template <typename jsonization_t,
std::enable_if_t<_utils::has_from_json_in_member<jsonization_t, string_t>::value, bool> = true>
template <
typename jsonization_t,
std::enable_if_t<_utils::has_from_json_in_member<jsonization_t, string_t>::value, bool> =
true>
explicit operator jsonization_t() const
{
jsonization_t dst {};
@@ -236,8 +352,12 @@ public:
}
return dst;
}
template <typename jsonization_t,
std::enable_if_t<_utils::has_from_json_in_templ_spec<jsonization_t, string_t>::value, bool> = true>
template <
typename jsonization_t,
std::enable_if_t<
_utils::has_from_json_in_templ_spec<jsonization_t, string_t>::value,
bool> = true>
explicit operator jsonization_t() const
{
jsonization_t dst {};
@@ -247,6 +367,32 @@ public:
return dst;
}
template <typename enum_t, std::enable_if_t<std::is_enum_v<enum_t>, bool> = true>
explicit operator enum_t() const
{
return static_cast<enum_t>(static_cast<std::underlying_type_t<enum_t>>(*this));
}
template <typename... elem_ts>
explicit operator std::tuple<elem_ts...>() const
{
return as_array().template as_tuple<elem_ts...>();
}
template <typename elem1_t, typename elem2_t>
explicit operator std::pair<elem1_t, elem2_t>() const
{
return as_array().template as_pair<elem1_t, elem2_t>();
}
template <typename... args_t>
explicit operator std::variant<args_t...>() const
{
return _utils::deserialize_variant<string_t, std::variant<args_t...>>(
*this,
std::make_index_sequence<std::variant_size_v<std::variant<args_t...>>>());
}
private:
friend class basic_array<string_t>;
friend class basic_object<string_t>;
@@ -256,8 +402,9 @@ private:
static var_t deep_copy(const var_t& src);
template <typename... key_then_default_value_t, size_t... keys_indexes_t>
auto get(std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const;
auto
get(std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const;
template <typename value_t, typename first_key_t, typename... rest_keys_t>
auto get_helper(const value_t& default_value, first_key_t&& first, rest_keys_t&&... rest) const;
@@ -276,89 +423,125 @@ inline basic_value<string_t>::basic_value() = default;
template <typename string_t>
inline basic_value<string_t>::basic_value(const basic_value<string_t>& rhs)
: _type(rhs._type), _raw_data(deep_copy(rhs._raw_data))
{}
: _type(rhs._type)
, _raw_data(deep_copy(rhs._raw_data))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(basic_value<string_t>&& rhs) noexcept = default;
template <typename string_t>
inline basic_value<string_t>::basic_value(bool b)
: _type(value_type::boolean),
_raw_data(string_t(b ? _utils::true_string<string_t>() : _utils::false_string<string_t>()))
{}
: _type(value_type::boolean)
, _raw_data(string_t(b ? _utils::true_string<string_t>() : _utils::false_string<string_t>()))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(int num)
: _type(value_type::number), _raw_data(_utils::to_basic_string<string_t>(num))
{}
: _type(value_type::number)
, _raw_data(_utils::to_basic_string<string_t>(num))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(unsigned num)
: _type(value_type::number), _raw_data(_utils::to_basic_string<string_t>(num))
{}
: _type(value_type::number)
, _raw_data(_utils::to_basic_string<string_t>(num))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(long num)
: _type(value_type::number), _raw_data(_utils::to_basic_string<string_t>(num))
{}
: _type(value_type::number)
, _raw_data(_utils::to_basic_string<string_t>(num))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(unsigned long num)
: _type(value_type::number), _raw_data(_utils::to_basic_string<string_t>(num))
{}
: _type(value_type::number)
, _raw_data(_utils::to_basic_string<string_t>(num))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(long long num)
: _type(value_type::number), _raw_data(_utils::to_basic_string<string_t>(num))
{}
: _type(value_type::number)
, _raw_data(_utils::to_basic_string<string_t>(num))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(unsigned long long num)
: _type(value_type::number), _raw_data(_utils::to_basic_string<string_t>(num))
{}
: _type(value_type::number)
, _raw_data(_utils::to_basic_string<string_t>(num))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(float num)
: _type(value_type::number), _raw_data(_utils::to_basic_string<string_t>(num))
{}
: _type(value_type::number)
, _raw_data(_utils::to_basic_string<string_t>(num))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(double num)
: _type(value_type::number), _raw_data(_utils::to_basic_string<string_t>(num))
{}
: _type(value_type::number)
, _raw_data(_utils::to_basic_string<string_t>(num))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(long double num)
: _type(value_type::number), _raw_data(_utils::to_basic_string<string_t>(num))
{}
: _type(value_type::number)
, _raw_data(_utils::to_basic_string<string_t>(num))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(const char_t* str) : _type(value_type::string), _raw_data(string_t(str))
{}
inline basic_value<string_t>::basic_value(const char_t* str)
: _type(value_type::string)
, _raw_data(string_t(str))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(string_t str) : _type(value_type::string), _raw_data(std::move(str))
{}
inline basic_value<string_t>::basic_value(string_t str)
: _type(value_type::string)
, _raw_data(std::move(str))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(std::nullptr_t) : _type(value_type::null)
{}
inline basic_value<string_t>::basic_value(std::nullptr_t)
: _type(value_type::null)
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(basic_array<string_t> arr)
: _type(value_type::array), _raw_data(std::make_unique<basic_array<string_t>>(std::move(arr)))
{}
: _type(value_type::array)
, _raw_data(std::make_unique<basic_array<string_t>>(std::move(arr)))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(basic_object<string_t> obj)
: _type(value_type::object), _raw_data(std::make_unique<basic_object<string_t>>(std::move(obj)))
{}
: _type(value_type::object)
, _raw_data(std::make_unique<basic_object<string_t>>(std::move(obj)))
{
}
template <typename string_t>
inline basic_value<string_t>::basic_value(std::initializer_list<typename basic_object<string_t>::value_type> init_list)
: _type(value_type::object), _raw_data(std::make_unique<basic_object<string_t>>(init_list))
{}
inline basic_value<string_t>::basic_value(
std::initializer_list<typename basic_object<string_t>::value_type> init_list)
: _type(value_type::object)
, _raw_data(std::make_unique<basic_object<string_t>>(init_list))
{
}
// for Pimpl
template <typename string_t>
@@ -380,7 +563,7 @@ inline bool basic_value<string_t>::is() const noexcept
else if constexpr (std::is_same_v<bool, value_t>) {
return is_boolean();
}
else if constexpr (std::is_arithmetic_v<value_t>) {
else if constexpr (std::is_arithmetic_v<value_t> || std::is_enum_v<value_t>) {
return is_number();
}
else if constexpr (std::is_constructible_v<string_t, value_t>) {
@@ -392,12 +575,31 @@ inline bool basic_value<string_t>::is() const noexcept
else if constexpr (_utils::is_collection<value_t>) {
return is_array() && all<typename value_t::value_type>();
}
else if constexpr (_utils::is_fixed_array<value_t>) {
return is_array() && all<typename value_t::value_type>()
&& as_array().size() == _utils::fixed_array_size<value_t>;
}
else if constexpr (std::is_same_v<basic_object<string_t>, value_t>) {
return is_object();
}
else if constexpr (_utils::is_map<value_t>) {
return is_object() && std::is_constructible_v<string_t, typename value_t::key_type> &&
all<typename value_t::mapped_type>();
return is_object() && std::is_constructible_v<string_t, typename value_t::key_type>
&& all<typename value_t::mapped_type>();
}
else if constexpr (_utils::is_variant<value_t>) {
return _utils::detect_variant<string_t, value_t>(
*this,
std::make_index_sequence<std::variant_size_v<value_t>>());
}
else if constexpr (_utils::is_pair<value_t>) {
return is_array() && as_array().size() == 2
&& at(0).template is<typename value_t::first_type>()
&& at(1).template is<typename value_t::second_type>();
}
else if constexpr (_utils::is_tuple<value_t>) {
return _utils::detect_tuple<string_t, value_t>(
*this,
std::make_index_sequence<std::tuple_size_v<value_t>>());
}
else {
static_assert(!sizeof(value_t), "Unsupported type");
@@ -444,33 +646,42 @@ template <typename string_t>
template <typename... key_then_default_value_t>
inline auto basic_value<string_t>::get(key_then_default_value_t&&... keys_then_default_value) const
{
return get(std::forward_as_tuple(keys_then_default_value...),
std::make_index_sequence<sizeof...(keys_then_default_value) - 1> {});
return get(
std::forward_as_tuple(keys_then_default_value...),
std::make_index_sequence<sizeof...(keys_then_default_value) - 1> {});
}
template <typename string_t>
template <typename... key_then_default_value_t, size_t... keys_indexes_t>
inline auto basic_value<string_t>::get(std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const
inline auto basic_value<string_t>::get(
std::tuple<key_then_default_value_t...> keys_then_default_value,
std::index_sequence<keys_indexes_t...>) const
{
constexpr unsigned long default_value_index = sizeof...(key_then_default_value_t) - 1;
return get_helper(std::get<default_value_index>(keys_then_default_value),
std::get<keys_indexes_t>(keys_then_default_value)...);
return get_helper(
std::get<default_value_index>(keys_then_default_value),
std::get<keys_indexes_t>(keys_then_default_value)...);
}
template <typename string_t>
template <typename value_t, typename first_key_t, typename... rest_keys_t>
inline auto basic_value<string_t>::get_helper(const value_t& default_value, first_key_t&& first,
rest_keys_t&&... rest) const
inline auto basic_value<string_t>::get_helper(
const value_t& default_value,
first_key_t&& first,
rest_keys_t&&... rest) const
{
if constexpr (std::is_constructible_v<string_t, first_key_t>) {
return is_object() ? as_object().get_helper(default_value, std::forward<first_key_t>(first),
std::forward<rest_keys_t>(rest)...)
return is_object() ? as_object().get_helper(
default_value,
std::forward<first_key_t>(first),
std::forward<rest_keys_t>(rest)...)
: default_value;
}
else if constexpr (std::is_integral_v<std::decay_t<first_key_t>>) {
return is_array() ? as_array().get_helper(default_value, std::forward<first_key_t>(first),
std::forward<rest_keys_t>(rest)...)
return is_array() ? as_array().get_helper(
default_value,
std::forward<first_key_t>(first),
std::forward<rest_keys_t>(rest)...)
: default_value;
}
else {
@@ -480,16 +691,22 @@ inline auto basic_value<string_t>::get_helper(const value_t& default_value, firs
template <typename string_t>
template <typename value_t, typename unique_key_t>
inline auto basic_value<string_t>::get_helper(const value_t& default_value, unique_key_t&& first) const
inline auto
basic_value<string_t>::get_helper(const value_t& default_value, unique_key_t&& first) const
{
if constexpr (std::is_constructible_v<string_t, unique_key_t>) {
return is_object() ? as_object().get_helper(default_value, std::forward<unique_key_t>(first)) : default_value;
return is_object()
? as_object().get_helper(default_value, std::forward<unique_key_t>(first))
: default_value;
}
else if constexpr (std::is_integral_v<std::decay_t<unique_key_t>>) {
return is_array() ? as_array().get_helper(default_value, std::forward<unique_key_t>(first)) : default_value;
return is_array() ? as_array().get_helper(default_value, std::forward<unique_key_t>(first))
: default_value;
}
else {
static_assert(!sizeof(unique_key_t), "Parameter must be integral or string_t constructible");
static_assert(
!sizeof(unique_key_t),
"Parameter must be integral or string_t constructible");
}
}
@@ -722,10 +939,14 @@ template <typename string_t>
template <typename... args_t>
inline decltype(auto) basic_value<string_t>::emplace(args_t&&... args)
{
constexpr bool is_array_args = std::is_constructible_v<typename basic_array<string_t>::value_type, args_t...>;
constexpr bool is_object_args = std::is_constructible_v<typename basic_object<string_t>::value_type, args_t...>;
constexpr bool is_array_args =
std::is_constructible_v<typename basic_array<string_t>::value_type, args_t...>;
constexpr bool is_object_args =
std::is_constructible_v<typename basic_object<string_t>::value_type, args_t...>;
static_assert(is_array_args || is_object_args, "Args can not constructure a array or object value");
static_assert(
is_array_args || is_object_args,
"Args can not constructure a array or object value");
if constexpr (is_array_args) {
return as_array().emplace_back(std::forward<args_t>(args)...);
@@ -801,6 +1022,13 @@ inline collection_t<value_t> basic_value<string_t>::as_collection() const
return as_array().template as_collection<value_t, collection_t>();
}
template <typename string_t>
template <typename value_t, size_t Size, template <typename, size_t> typename fixed_array_t>
inline fixed_array_t<value_t, Size> basic_value<string_t>::as_fixed_array() const
{
return as_array().template as_fixed_array<value_t, Size>();
}
template <typename string_t>
template <typename value_t, template <typename...> typename map_t>
inline map_t<string_t, value_t> basic_value<string_t>::as_map() const
@@ -818,12 +1046,15 @@ inline basic_value<string_t>& basic_value<string_t>::operator=(const basic_value
}
template <typename string_t>
inline basic_value<string_t>& basic_value<string_t>::operator=(basic_value<string_t>&& rhs) noexcept = default;
inline basic_value<string_t>&
basic_value<string_t>::operator=(basic_value<string_t>&& rhs) noexcept = default;
template <typename string_t>
inline bool basic_value<string_t>::operator==(const basic_value<string_t>& rhs) const
{
if (_type != rhs._type) return false;
if (_type != rhs._type) {
return false;
}
switch (_type) {
case value_type::null:
@@ -878,7 +1109,8 @@ inline basic_value<string_t>& basic_value<string_t>::operator[](string_t&& key)
}
template <typename string_t>
inline basic_value<string_t> basic_value<string_t>::operator|(const basic_object<string_t>& rhs) const&
inline basic_value<string_t>
basic_value<string_t>::operator|(const basic_object<string_t>& rhs) const&
{
return as_object() | rhs;
}
@@ -916,7 +1148,8 @@ inline basic_value<string_t>& basic_value<string_t>::operator|=(basic_object<str
}
template <typename string_t>
inline basic_value<string_t> basic_value<string_t>::operator+(const basic_array<string_t>& rhs) const&
inline basic_value<string_t>
basic_value<string_t>::operator+(const basic_array<string_t>& rhs) const&
{
return as_array() + rhs;
}
@@ -956,9 +1189,12 @@ inline basic_value<string_t>& basic_value<string_t>::operator+=(basic_array<stri
template <typename string_t>
template <typename... args_t>
inline basic_value<string_t>::basic_value(value_type type, args_t&&... args)
: _type(type), _raw_data(std::forward<args_t>(args)...)
: _type(type)
, _raw_data(std::forward<args_t>(args)...)
{
static_assert(std::is_constructible_v<var_t, args_t...>, "Parameter can't be used to construct a var_t");
static_assert(
std::is_constructible_v<var_t, args_t...>,
"Parameter can't be used to construct a var_t");
}
template <typename string_t>
@@ -981,11 +1217,14 @@ inline typename basic_value<string_t>::var_t basic_value<string_t>::deep_copy(co
return dst;
}
template <typename ostream_t, typename string_t,
typename std_ostream_t =
std::basic_ostream<typename string_t::value_type, std::char_traits<typename string_t::value_type>>,
typename =
std::enable_if_t<std::is_same_v<std_ostream_t, ostream_t> || std::is_base_of_v<std_ostream_t, ostream_t>>>
template <
typename ostream_t,
typename string_t,
typename std_ostream_t = std::basic_ostream<
typename string_t::value_type,
std::char_traits<typename string_t::value_type>>,
typename = std::enable_if_t<
std::is_same_v<std_ostream_t, ostream_t> || std::is_base_of_v<std_ostream_t, ostream_t>>>
ostream_t& operator<<(ostream_t& out, const basic_value<string_t>& val)
{
out << val.format();

View File

@@ -1,6 +1,10 @@
#pragma once
// IWYU pragma: begin_exports
#include "common/serialization.hpp"
#include "common/types.hpp"
#include "parser/parser.hpp"
#include "reflection/jsonization.hpp"
// IWYU pragma: end_exports

View File

@@ -1,4 +1,8 @@
#pragma once
// IWYU pragma: begin_exports
#include "common/types.hpp"
#include "parser5/parser5.hpp"
#include "parser5/parser5.hpp"
// IWYU pragma: end_exports

View File

@@ -1,13 +1,17 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#if __cplusplus >= 202002L || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
#include <bit>
namespace json::_bitops
{
using std::countl_one;
using std::countl_zero;
using std::countr_one;
using std::countr_zero;
inline constexpr bool is_little_endian()
{
return std::endian::native == std::endian::little;
@@ -15,25 +19,37 @@ inline constexpr bool is_little_endian()
}
#else
#include <cstdint>
namespace json::_bitops
{
#if defined(__GNUC__) || defined(__clang__)
inline constexpr int countl_zero(uint32_t x)
{
if constexpr (sizeof(uint32_t) == sizeof(unsigned int)) return x == 0 ? 32 : __builtin_clz(x);
if constexpr (sizeof(uint32_t) == sizeof(unsigned long)) return x == 0 ? 32 : __builtin_clzl(x);
if constexpr (sizeof(uint32_t) == sizeof(unsigned int)) {
return x == 0 ? 32 : __builtin_clz(x);
}
if constexpr (sizeof(uint32_t) == sizeof(unsigned long)) {
return x == 0 ? 32 : __builtin_clzl(x);
}
return x == 0 ? 32 : __builtin_clzll(x);
}
inline constexpr int countr_zero(uint32_t x)
{
if constexpr (sizeof(uint32_t) == sizeof(unsigned int)) return x == 0 ? 32 : __builtin_ctz(x);
if constexpr (sizeof(uint32_t) == sizeof(unsigned long)) return x == 0 ? 32 : __builtin_ctzl(x);
if constexpr (sizeof(uint32_t) == sizeof(unsigned int)) {
return x == 0 ? 32 : __builtin_ctz(x);
}
if constexpr (sizeof(uint32_t) == sizeof(unsigned long)) {
return x == 0 ? 32 : __builtin_ctzl(x);
}
return x == 0 ? 32 : __builtin_ctzll(x);
}
inline constexpr int countl_zero(uint64_t x)
{
return x == 0 ? 64 : __builtin_clzll(x);
}
inline constexpr int countr_zero(uint64_t x)
{
return x == 0 ? 64 : __builtin_ctzll(x);
@@ -45,14 +61,17 @@ inline int countl_zero(uint32_t x)
{
return __lzcnt(x);
}
inline int countr_zero(uint32_t x)
{
return _tzcnt_u32(x);
}
inline int countl_zero(uint64_t x)
{
return (int)__lzcnt64(x);
}
inline int countr_zero(uint64_t x)
{
return (int)_tzcnt_u64(x);
@@ -63,16 +82,19 @@ inline constexpr int countl_zero(uint32_t x)
unsigned long index = 0;
return _BitScanReverse(&index, x) ? 31 - index : 32;
}
inline constexpr int countr_zero(uint32_t x)
{
unsigned long index = 0;
return _BitScanForward(&index, x) ? index : 32;
}
inline constexpr int countl_zero(uint64_t x)
{
unsigned long index = 0;
return _BitScanReverse64(&index, x) ? 63 - index : 64;
}
inline constexpr int countr_zero(uint64_t x)
{
unsigned long index = 0;
@@ -86,14 +108,17 @@ inline int countl_one(uint32_t x)
{
return countl_zero(~x);
}
inline int countr_one(uint32_t x)
{
return countr_zero(~x);
}
inline int countl_one(uint64_t x)
{
return countl_zero(~x);
}
inline int countr_one(uint64_t x)
{
return countr_zero(~x);
@@ -102,10 +127,12 @@ inline int countr_one(uint64_t x)
// no constexpr endian awareness before C++20
inline bool is_little_endian()
{
union {
union
{
uint32_t u32;
uint8_t u8;
} u = { 0x01020304 };
return u.u8 == 4;
}
} // namespace json::_bitops

View File

@@ -1,3 +1,5 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include <cstdint>
@@ -28,11 +30,13 @@ struct packed_bytes
};
}
#ifndef MEOJSON_DISABLE_PACKED_BYTES
#if defined(__SSE2__) || defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP)
#include "packed_bytes_x86.hpp"
#elif defined(__ARM_NEON) || defined(_M_ARM) || defined(_M_ARM64)
#include "packed_bytes_arm.hpp"
#endif
#endif
namespace json::_packed_bytes
{
@@ -66,14 +70,19 @@ struct packed_bytes_trait_uint64
return is_zero_memberwise((x) ^ (UINT64_C(0x0101010101010101) * (n)));
}
__packed_bytes_strong_inline static value_type bitwise_or(value_type a, value_type b) { return a | b; }
__packed_bytes_strong_inline static value_type bitwise_or(value_type a, value_type b)
{
return a | b;
}
__packed_bytes_strong_inline static size_t first_nonzero_byte(value_type x)
{
if (_bitops::is_little_endian())
if (_bitops::is_little_endian()) {
return _bitops::countr_zero(x) / 8;
else
}
else {
return _bitops::countl_zero(x) / 8;
}
}
};
@@ -108,16 +117,22 @@ struct packed_bytes_trait_uint32
return is_zero_memberwise((x) ^ (~UINT32_C(0) / 255 * (n)));
}
__packed_bytes_strong_inline static value_type bitwise_or(value_type a, value_type b) { return a | b; }
__packed_bytes_strong_inline static value_type bitwise_or(value_type a, value_type b)
{
return a | b;
}
__packed_bytes_strong_inline static size_t first_nonzero_byte(value_type x)
{
if (_bitops::is_little_endian())
if (_bitops::is_little_endian()) {
return _bitops::countr_zero(x) / 8;
else
}
else {
return _bitops::countl_zero(x) / 8;
}
}
};
template <>
struct packed_bytes<8>
{
@@ -133,9 +148,14 @@ struct packed_bytes<4>
template <size_t N>
using packed_bytes_trait = typename packed_bytes<N>::traits;
using packed_bytes_trait_max =
std::conditional_t<packed_bytes_trait<32>::available, packed_bytes_trait<32>,
std::conditional_t<packed_bytes_trait<16>::available, packed_bytes_trait<16>,
std::conditional_t<packed_bytes_trait<8>::available, packed_bytes_trait<8>,
packed_bytes_trait<4>>>>;
using packed_bytes_trait_max = std::conditional_t<
packed_bytes_trait<32>::available,
packed_bytes_trait<32>,
std::conditional_t<
packed_bytes_trait<16>::available,
packed_bytes_trait<16>,
std::conditional_t<
packed_bytes_trait<8>::available,
packed_bytes_trait<8>,
packed_bytes_trait<4>>>>;
} // namespace json::_packed_bytes

View File

@@ -1,3 +1,5 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
// current NEON implementation doesn't outperform 64-bit scalar implementation
@@ -17,7 +19,10 @@ struct packed_bytes_trait_neon
static constexpr auto step = 16;
using value_type = uint8x16_t;
__packed_bytes_strong_inline static value_type load_unaligned(const void* ptr) { return vld1q_u8((uint8_t*)ptr); }
__packed_bytes_strong_inline static value_type load_unaligned(const void* ptr)
{
return vld1q_u8((uint8_t*)ptr);
}
__packed_bytes_strong_inline static value_type less(value_type x, uint8_t n)
{
@@ -26,19 +31,31 @@ struct packed_bytes_trait_neon
return is_less;
}
__packed_bytes_strong_inline static value_type equal(value_type x, uint8_t n) { return vceqq_u8(x, vdupq_n_u8(n)); }
__packed_bytes_strong_inline static value_type equal(value_type x, uint8_t n)
{
return vceqq_u8(x, vdupq_n_u8(n));
}
__packed_bytes_strong_inline static value_type equal(value_type x, value_type y) { return vceqq_u8(x, y); }
__packed_bytes_strong_inline static value_type equal(value_type x, value_type y)
{
return vceqq_u8(x, y);
}
__packed_bytes_strong_inline static value_type bitwise_or(value_type a, value_type b) { return vorrq_u8(a, b); }
__packed_bytes_strong_inline static value_type bitwise_or(value_type a, value_type b)
{
return vorrq_u8(a, b);
}
__packed_bytes_strong_inline static bool is_all_zero(value_type x)
{
#ifdef __packed_bytes_trait_arm64
return vmaxvq_u8(x) == 0;
#else
auto fold64 = vorr_u64(vget_high_u64(vreinterpretq_u8_u64(x), 0), vget_low_u64(vreinterpretq_u8_u64(x), 1));
auto fold32 = vget_lane_u32(vreinterpret_u64_u32(fold64), 0) | vget_lane_u32(vreinterpret_u64_u32(fold64), 1);
auto fold64 = vorr_u64(
vget_high_u64(vreinterpretq_u8_u64(x), 0),
vget_low_u64(vreinterpretq_u8_u64(x), 1));
auto fold32 = vget_lane_u32(vreinterpret_u64_u32(fold64), 0)
| vget_lane_u32(vreinterpret_u64_u32(fold64), 1);
return fold32 == 0;
#endif
}

View File

@@ -1,4 +1,7 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include "packed_bytes.hpp"
#include <emmintrin.h>
@@ -35,9 +38,15 @@ struct packed_bytes_trait_sse
return _mm_cmpeq_epi8(x, _mm_set1_epi8(static_cast<char>(n)));
}
__packed_bytes_strong_inline static value_type equal(value_type x, value_type y) { return _mm_cmpeq_epi8(x, y); }
__packed_bytes_strong_inline static value_type equal(value_type x, value_type y)
{
return _mm_cmpeq_epi8(x, y);
}
__packed_bytes_strong_inline static value_type bitwise_or(value_type a, value_type b) { return _mm_or_si128(a, b); }
__packed_bytes_strong_inline static value_type bitwise_or(value_type a, value_type b)
{
return _mm_or_si128(a, b);
}
__packed_bytes_strong_inline static bool is_all_zero(value_type x)
{
@@ -97,14 +106,20 @@ struct packed_bytes_trait_avx2
return _mm256_cmpeq_epi8(x, _mm256_set1_epi8(static_cast<char>(n)));
}
__packed_bytes_strong_inline static value_type equal(value_type x, value_type y) { return _mm256_cmpeq_epi8(x, y); }
__packed_bytes_strong_inline static value_type equal(value_type x, value_type y)
{
return _mm256_cmpeq_epi8(x, y);
}
__packed_bytes_strong_inline static value_type bitwise_or(value_type a, value_type b)
{
return _mm256_or_si256(a, b);
}
__packed_bytes_strong_inline static bool is_all_zero(value_type x) { return (bool)_mm256_testz_si256(x, x); }
__packed_bytes_strong_inline static bool is_all_zero(value_type x)
{
return (bool)_mm256_testz_si256(x, x);
}
__packed_bytes_strong_inline static size_t first_nonzero_byte(value_type x)
{

View File

@@ -1,5 +1,8 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include <cctype>
#include <fstream>
#include <optional>
#include <ostream>
@@ -15,8 +18,10 @@ namespace json
// * parser declare *
// ****************************
template <typename string_t = default_string_t, typename parsing_t = void,
typename accel_traits = _packed_bytes::packed_bytes_trait_max>
template <
typename string_t = default_string_t,
typename parsing_t = void,
typename accel_traits = _packed_bytes::packed_bytes_trait_max>
class parser
{
public:
@@ -28,7 +33,12 @@ public:
static std::optional<basic_value<string_t>> parse(const parsing_t& content);
private:
parser(parsing_iter_t cbegin, parsing_iter_t cend) noexcept : _cur(cbegin), _end(cend) { ; }
parser(parsing_iter_t cbegin, parsing_iter_t cend) noexcept
: _cur(cbegin)
, _end(cend)
{
;
}
std::optional<basic_value<string_t>> parse();
basic_value<string_t> parse_value();
@@ -47,6 +57,7 @@ private:
bool skip_string_literal_with_accel();
bool skip_whitespace() noexcept;
bool skip_digit();
bool skip_unicode_escape(uint16_t& pair_high, string_t& result);
private:
parsing_iter_t _cur;
@@ -63,8 +74,10 @@ auto parse(const parsing_t& content);
template <typename char_t>
auto parse(char_t* content);
template <typename istream_t,
typename = std::enable_if_t<std::is_base_of_v<std::basic_istream<typename istream_t::char_type>, istream_t>>>
template <
typename istream_t,
typename = std::enable_if_t<
std::is_base_of_v<std::basic_istream<typename istream_t::char_type>, istream_t>>>
auto parse(istream_t& istream, bool check_bom);
template <typename ifstream_t = std::ifstream, typename path_t = void>
@@ -72,17 +85,17 @@ auto open(const path_t& path, bool check_bom = false);
namespace literals
{
value operator""_json(const char* str, size_t len);
wvalue operator""_json(const wchar_t* str, size_t len);
value operator""_json(const char* str, size_t len);
wvalue operator""_json(const wchar_t* str, size_t len);
value operator""_jvalue(const char* str, size_t len);
wvalue operator""_jvalue(const wchar_t* str, size_t len);
value operator""_jvalue(const char* str, size_t len);
wvalue operator""_jvalue(const wchar_t* str, size_t len);
array operator""_jarray(const char* str, size_t len);
warray operator""_jarray(const wchar_t* str, size_t len);
array operator""_jarray(const char* str, size_t len);
warray operator""_jarray(const wchar_t* str, size_t len);
object operator""_jobject(const char* str, size_t len);
wobject operator""_jobject(const wchar_t* str, size_t len);
object operator""_jobject(const char* str, size_t len);
wobject operator""_jobject(const wchar_t* str, size_t len);
}
template <typename string_t = default_string_t>
@@ -93,7 +106,8 @@ const basic_value<string_t> invalid_value();
// *************************
template <typename string_t, typename parsing_t, typename accel_traits>
inline std::optional<basic_value<string_t>> parser<string_t, parsing_t, accel_traits>::parse(const parsing_t& content)
inline std::optional<basic_value<string_t>>
parser<string_t, parsing_t, accel_traits>::parse(const parsing_t& content)
{
return parser<string_t, parsing_t, accel_traits>(content.cbegin(), content.cend()).parse();
}
@@ -252,7 +266,9 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_st
if (!string_opt) {
return invalid_value<string_t>();
}
return basic_value<string_t>(basic_value<string_t>::value_type::string, std::move(string_opt).value());
return basic_value<string_t>(
basic_value<string_t>::value_type::string,
std::move(string_opt).value());
}
template <typename string_t, typename parsing_t, typename accel_traits>
@@ -350,7 +366,10 @@ inline basic_value<string_t> parser<string_t, parsing_t, accel_traits>::parse_ob
return invalid_value<string_t>();
}
result.emplace(std::move(*key_opt), std::move(val));
auto emplaced = result.emplace(std::move(*key_opt), std::move(val)).second;
if (!emplaced) {
return invalid_value<string_t>();
}
if (*_cur == ',') {
++_cur;
@@ -382,6 +401,7 @@ inline std::optional<string_t> parser<string_t, parsing_t, accel_traits>::parse_
string_t result;
auto no_escape_beg = _cur;
uint16_t pair_high = 0;
while (_cur != _end) {
if constexpr (sizeof(*_cur) == 1 && accel_traits::available) {
@@ -399,6 +419,9 @@ inline std::optional<string_t> parser<string_t, parsing_t, accel_traits>::parse_
if (_cur == _end) {
return std::nullopt;
}
if (pair_high && *_cur != 'u') {
return std::nullopt;
}
switch (*_cur) {
case '"':
result.push_back('"');
@@ -424,9 +447,11 @@ inline std::optional<string_t> parser<string_t, parsing_t, accel_traits>::parse_
case 't':
result.push_back('\t');
break;
// case 'u':
// result.push_back('\u');
// break;
case 'u':
if (!skip_unicode_escape(pair_high, result)) {
return std::nullopt;
}
break;
default:
// Illegal backslash escape
return std::nullopt;
@@ -435,10 +460,16 @@ inline std::optional<string_t> parser<string_t, parsing_t, accel_traits>::parse_
break;
}
case '"': {
if (pair_high) {
return std::nullopt;
}
result += string_t(no_escape_beg, _cur++);
return result;
}
default:
if (pair_high) {
return std::nullopt;
}
++_cur;
break;
}
@@ -446,6 +477,103 @@ inline std::optional<string_t> parser<string_t, parsing_t, accel_traits>::parse_
return std::nullopt;
}
template <typename string_t, typename parsing_t, typename accel_traits>
inline bool parser<string_t, parsing_t, accel_traits>::skip_unicode_escape(
uint16_t& pair_high,
string_t& result)
{
uint16_t cp = 0;
for (int i = 0; i < 4; ++i) {
if (++_cur == _end) {
return false;
}
if (!std::isxdigit(static_cast<unsigned char>(*_cur))) {
return false;
}
cp <<= 4;
if ('0' <= *_cur && *_cur <= '9') {
cp |= *_cur - '0';
}
else if ('a' <= *_cur && *_cur <= 'f') {
cp |= *_cur - 'a' + 10;
}
else if ('A' <= *_cur && *_cur <= 'F') {
cp |= *_cur - 'A' + 10;
}
else {
return false;
}
}
uint32_t ext_cp = cp;
uint16_t hi_cp = 0, lo_cp = 0;
if (0xD800 <= cp && cp <= 0xDBFF) {
if (pair_high) {
return false;
}
pair_high = cp;
return true;
}
if (0xDC00 <= cp && cp <= 0xDFFF) {
if (!pair_high) {
return false;
}
ext_cp = (((pair_high - 0xD800) << 10) | (cp - 0xDC00)) + 0x10000;
hi_cp = pair_high;
lo_cp = cp;
pair_high = 0;
}
if constexpr (std::is_same_v<typename string_t::value_type, char>) {
// utf8
if (ext_cp <= 0x7F) {
result.push_back(static_cast<char>(ext_cp));
}
else if (ext_cp <= 0x7FF) {
result.push_back(static_cast<char>(((ext_cp >> 6) & 0b00011111) | 0b11000000u));
result.push_back(static_cast<char>((ext_cp & 0b00111111) | 0b10000000u));
}
else if (ext_cp <= 0xFFFF) {
result.push_back(static_cast<char>(((ext_cp >> 12) & 0b00001111) | 0b11100000u));
result.push_back(static_cast<char>(((ext_cp >> 6) & 0b00111111) | 0b10000000u));
result.push_back(static_cast<char>((ext_cp & 0b00111111) | 0b10000000u));
}
else {
result.push_back(static_cast<char>(((ext_cp >> 18) & 0b00000111) | 0b11110000u));
result.push_back(static_cast<char>(((ext_cp >> 12) & 0b00111111) | 0b10000000u));
result.push_back(static_cast<char>(((ext_cp >> 6) & 0b00111111) | 0b10000000u));
result.push_back(static_cast<char>((ext_cp & 0b00111111) | 0b10000000u));
}
}
else if constexpr (std::is_same_v<typename string_t::value_type, wchar_t>) {
if constexpr (sizeof(wchar_t) == 4) {
result.push_back(static_cast<wchar_t>(ext_cp));
}
else if constexpr (sizeof(wchar_t) == 2) {
if (ext_cp <= 0xFFFF) {
result.push_back(static_cast<wchar_t>(ext_cp));
}
else {
result.push_back(static_cast<wchar_t>(hi_cp));
result.push_back(static_cast<wchar_t>(lo_cp));
}
}
else {
static_assert(!sizeof(typename string_t::value_type), "Unsupported wchar");
}
}
else {
static_assert(!sizeof(typename string_t::value_type), "Unsupported type");
}
return true;
}
template <typename string_t, typename parsing_t, typename accel_traits>
inline bool parser<string_t, parsing_t, accel_traits>::skip_string_literal_with_accel()
{
@@ -456,8 +584,10 @@ inline bool parser<string_t, parsing_t, accel_traits>::skip_string_literal_with_
while (_end - _cur >= accel_traits::step) {
auto pack = accel_traits::load_unaligned(&(*_cur));
auto result = accel_traits::less(pack, 32);
result = accel_traits::bitwise_or(result, accel_traits::equal(pack, static_cast<uint8_t>('"')));
result = accel_traits::bitwise_or(result, accel_traits::equal(pack, static_cast<uint8_t>('\\')));
result =
accel_traits::bitwise_or(result, accel_traits::equal(pack, static_cast<uint8_t>('"')));
result =
accel_traits::bitwise_or(result, accel_traits::equal(pack, static_cast<uint8_t>('\\')));
if (accel_traits::is_all_zero(result)) {
_cur += accel_traits::step;
@@ -551,8 +681,8 @@ auto parse(istream_t& ifs, bool check_bom)
static constexpr uchar Bom_1 = 0xBB;
static constexpr uchar Bom_2 = 0xBF;
if (str.size() >= 3 && static_cast<uchar>(str.at(0)) == Bom_0 && static_cast<uchar>(str.at(1)) == Bom_1 &&
static_cast<uchar>(str.at(2)) == Bom_2) {
if (str.size() >= 3 && static_cast<uchar>(str.at(0)) == Bom_0
&& static_cast<uchar>(str.at(1)) == Bom_1 && static_cast<uchar>(str.at(2)) == Bom_2) {
str.assign(str.begin() + 3, str.end());
}
}
@@ -578,50 +708,56 @@ auto open(const path_t& filepath, bool check_bom)
namespace literals
{
inline value operator""_json(const char* str, size_t len)
{
return operator""_jvalue(str, len);
}
inline wvalue operator""_json(const wchar_t* str, size_t len)
{
return operator""_jvalue(str, len);
}
inline value operator""_json(const char* str, size_t len)
{
return operator""_jvalue(str, len);
}
inline value operator""_jvalue(const char* str, size_t len)
{
return parse(std::string_view(str, len)).value_or(value());
}
inline wvalue operator""_jvalue(const wchar_t* str, size_t len)
{
return parse(std::wstring_view(str, len)).value_or(wvalue());
}
inline wvalue operator""_json(const wchar_t* str, size_t len)
{
return operator""_jvalue(str, len);
}
inline array operator""_jarray(const char* str, size_t len)
{
auto val = parse(std::string_view(str, len)).value_or(value());
return val.is_array() ? val.as_array() : array();
}
inline warray operator""_jarray(const wchar_t* str, size_t len)
{
auto val = parse(std::wstring_view(str, len)).value_or(wvalue());
return val.is_array() ? val.as_array() : warray();
}
inline value operator""_jvalue(const char* str, size_t len)
{
return parse(std::string_view(str, len)).value_or(value());
}
inline object operator""_jobject(const char* str, size_t len)
{
auto val = parse(std::string_view(str, len)).value_or(value());
return val.is_object() ? val.as_object() : object();
}
inline wobject operator""_jobject(const wchar_t* str, size_t len)
{
auto val = parse(std::wstring_view(str, len)).value_or(wvalue());
return val.is_object() ? val.as_object() : wobject();
}
inline wvalue operator""_jvalue(const wchar_t* str, size_t len)
{
return parse(std::wstring_view(str, len)).value_or(wvalue());
}
inline array operator""_jarray(const char* str, size_t len)
{
auto val = parse(std::string_view(str, len)).value_or(value());
return val.is_array() ? val.as_array() : array();
}
inline warray operator""_jarray(const wchar_t* str, size_t len)
{
auto val = parse(std::wstring_view(str, len)).value_or(wvalue());
return val.is_array() ? val.as_array() : warray();
}
inline object operator""_jobject(const char* str, size_t len)
{
auto val = parse(std::string_view(str, len)).value_or(value());
return val.is_object() ? val.as_object() : object();
}
inline wobject operator""_jobject(const wchar_t* str, size_t len)
{
auto val = parse(std::wstring_view(str, len)).value_or(wvalue());
return val.is_object() ? val.as_object() : wobject();
}
} // namespace literals
template <typename string_t>
const basic_value<string_t> invalid_value()
{
return basic_value<string_t>(basic_value<string_t>::value_type::invalid, typename basic_value<string_t>::var_t());
return basic_value<string_t>(
basic_value<string_t>::value_type::invalid,
typename basic_value<string_t>::var_t());
}
} // namespace json

View File

@@ -1,10 +1,11 @@
// IWYU pragma: private, include <meojson/json5.hpp>
#pragma once
#include <algorithm>
#include <cctype>
#include <cmath>
#include <iomanip>
#include <regex>
#include <sstream>
#include <stack>
#include <vector>
@@ -31,6 +32,7 @@ public:
{
public:
exception() = default;
exception(const std::string& type, const std::string& msg, const std::string& detail)
{
std::stringstream ss;
@@ -38,6 +40,7 @@ public:
ss << detail << std::endl;
_what = ss.str();
}
exception(const exception&) = default;
exception& operator=(const exception&) = default;
exception(exception&&) = default;
@@ -50,8 +53,12 @@ public:
{
public:
InvalidChar(u8char ch = 0, const std::string& detail = "")
: exception("Invalid Char", "Unexpected token \'" + StringFromCharCode(ch) + "\'", detail)
{}
: exception(
"Invalid Char",
"Unexpected token \'" + StringFromCharCode(ch) + "\'",
detail)
{
}
};
class InvalidIdentifier : public exception
@@ -59,14 +66,17 @@ public:
public:
InvalidIdentifier(const std::string& msg = "", const std::string& detail = "")
: exception("Invalid Identifier", msg, detail)
{}
{
}
};
class InvalidEOF : public exception
{
public:
InvalidEOF(const std::string& msg = "", const std::string& detail = "") : exception("Invalid EOF", msg, detail)
{}
InvalidEOF(const std::string& msg = "", const std::string& detail = "")
: exception("Invalid EOF", msg, detail)
{
}
};
public:
@@ -175,7 +185,13 @@ public:
static std::optional<value> parse(const string_t& content, std::string* error = nullptr);
private:
parser5(string_iter_t cbegin, string_iter_t cend) noexcept : _cur(cbegin), _end(cend), _line_begin_cur(cbegin) {}
parser5(string_iter_t cbegin, string_iter_t cend) noexcept
: _cur(cbegin)
, _end(cend)
, _line_begin_cur(cbegin)
{
}
std::optional<value> parse();
private:
@@ -272,62 +288,68 @@ inline bool parser5<string_t>::unicode::isSpaceSeparator(u8char ch)
template <typename string_t>
inline bool parser5<string_t>::unicode::isIdStartChar(u8char ch)
{
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch == '$') || (ch == '_') ||
findInRange(json::unicode::id_start, toUnicode(ch));
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch == '$') || (ch == '_')
|| findInRange(json::unicode::id_start, toUnicode(ch));
}
template <typename string_t>
inline bool parser5<string_t>::unicode::isIdContinueChar(u8char ch)
{
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || (ch == '$') ||
(ch == '_') || findInRange(json::unicode::id_continue, toUnicode(ch));
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9')
|| (ch == '$') || (ch == '_') || findInRange(json::unicode::id_continue, toUnicode(ch));
}
template <typename string_t>
inline bool parser5<string_t>::unicode::isDigit(u8char ch)
{
auto str = StringFromCharCode(ch);
return std::regex_search(str, std::regex(R"([0-9])"));
return (ch >= '0' && ch <= '9');
}
template <typename string_t>
inline bool parser5<string_t>::unicode::isHexDigit(u8char ch)
{
auto str = StringFromCharCode(ch);
return std::regex_search(str, std::regex(R"([0-9A-Fa-f])"));
return (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F') || (ch >= '0' && ch <= '9');
}
template <typename string_t>
inline uint64_t parser5<string_t>::unicode::toUnicode(u8char ch)
{
std::stack<uint8_t> coded;
if (ch == 0) {
return ch;
}
std::stack<uint8_t> coded;
while (ch > 0) {
coded.push(ch & 0xff);
ch = ch >> 8;
ch >>= 8;
}
u8char charcode = 0;
uint8_t t = coded.top();
coded.pop();
if (t < 128) {
return t;
}
uint8_t high_bit_mask = (1 << 6) - 1;
uint8_t high_bit_mask = 0b00111111;
uint8_t high_bit_shift = 0;
int total_bits = 0;
const int other_bits = 6;
while ((t & 0xC0) == 0xC0) {
t <<= 1;
t &= 0xff;
total_bits += 6;
total_bits += other_bits;
high_bit_mask >>= 1;
high_bit_shift++;
charcode <<= other_bits;
charcode |= coded.top() & ((1 << other_bits) - 1);
coded.pop();
if (!coded.empty()) {
charcode <<= other_bits;
charcode |= coded.top() & ((1 << other_bits) - 1);
coded.pop();
}
}
charcode |= static_cast<uint64_t>((t >> high_bit_shift) & high_bit_mask) << total_bits;
return charcode;
}
@@ -346,7 +368,8 @@ inline bool parser5<string_t>::unicode::findInRange(const array_t& range, u8char
return false;
}
// set 中保存的是类似于 { start1, end1, start2, end2, ... } 的形式, 区间可表示为[start, end)
// 判断lb是否位于start的位置, 如果是, 则表示codePoint在某个区间的内部, 如果不是, 则表示codePoint在两个区间中间
// 判断lb是否位于start的位置, 如果是, 则表示codePoint在某个区间的内部, 如果不是,
// 则表示codePoint在两个区间中间
return std::distance(begin, lb) % 2 == 0;
}
@@ -519,11 +542,13 @@ inline typename parser5<string_t>::u8char parser5<string_t>::unicodeEscape()
/* utf-8 reader */
template <typename string_t>
inline typename parser5<string_t>::u8char parser5<string_t>::peek(const string_iter_t& begin, const string_iter_t& end,
size_t* plen)
inline typename parser5<string_t>::u8char
parser5<string_t>::peek(const string_iter_t& begin, const string_iter_t& end, size_t* plen)
{
if (begin == end) {
if (plen) *plen = 0;
if (plen) {
*plen = 0;
}
return 0;
}
uint8_t head = *begin;
@@ -549,10 +574,12 @@ inline typename parser5<string_t>::u8char parser5<string_t>::peek(const std::str
{
return peek(str.cbegin(), str.cend());
}
inline constexpr size_t operator"" _sz(unsigned long long size)
{
return size;
}
template <typename string_t>
inline typename parser5<string_t>::u8char parser5<string_t>::read()
{
@@ -581,11 +608,15 @@ inline typename parser5<string_t>::u8char parser5<string_t>::read()
template <typename string_t>
inline std::string parser5<string_t>::StringFromCharCode(typename parser5<string_t>::u8char code)
{
if (code == 0) return "";
if (code == 0) {
return "";
}
std::string str;
for (auto i = 0; i < 8; ++i) {
auto ch = (0xff & code);
if (ch) str.insert(0, 1, static_cast<char>(ch));
if (ch) {
str.insert(0, 1, static_cast<char>(ch));
}
code >>= 8;
}
return str;
@@ -700,7 +731,8 @@ inline std::optional<typename parser5<string_t>::Token> parser5<string_t>::lex_m
}
template <typename string_t>
inline std::optional<typename parser5<string_t>::Token> parser5<string_t>::lex_multiLineCommentAsterisk()
inline std::optional<typename parser5<string_t>::Token>
parser5<string_t>::lex_multiLineCommentAsterisk()
{
switch (_current_char) {
case '*':
@@ -808,7 +840,8 @@ inline std::optional<typename parser5<string_t>::Token> parser5<string_t>::lex_v
}
template <typename string_t>
inline std::optional<typename parser5<string_t>::Token> parser5<string_t>::lex_identifierNameStartEscape()
inline std::optional<typename parser5<string_t>::Token>
parser5<string_t>::lex_identifierNameStartEscape()
{
if (_current_char != 'u') {
throw InvalidChar(_current_char, exceptionDetailInfo());
@@ -855,7 +888,8 @@ inline std::optional<typename parser5<string_t>::Token> parser5<string_t>::lex_i
}
template <typename string_t>
inline std::optional<typename parser5<string_t>::Token> parser5<string_t>::lex_identifierNameEscape()
inline std::optional<typename parser5<string_t>::Token>
parser5<string_t>::lex_identifierNameEscape()
{
if (_current_char != 'u') {
throw InvalidChar(_current_char, exceptionDetailInfo());
@@ -1047,7 +1081,8 @@ inline std::optional<typename parser5<string_t>::Token> parser5<string_t>::lex_d
}
template <typename string_t>
inline std::optional<typename parser5<string_t>::Token> parser5<string_t>::lex_decimalExponentInteger()
inline std::optional<typename parser5<string_t>::Token>
parser5<string_t>::lex_decimalExponentInteger()
{
if (unicode::isDigit(_current_char)) {
_buffer += StringFromCharCode(read());
@@ -1386,7 +1421,8 @@ inline void parser5<string_t>::parse_afterArrayValue()
template <typename string_t>
inline void parser5<string_t>::parse_end()
{}
{
}
template <typename string_t>
inline void parser5<string_t>::parseStates(ParseState state)
@@ -1417,6 +1453,7 @@ inline void parser5<string_t>::parseStates(ParseState state)
break;
}
}
/* stack operation */
template <typename string_t>
inline void parser5<string_t>::push()

View File

@@ -1,3 +1,5 @@
// IWYU pragma: private, include <meojson/json5.hpp>
// This is a generated file. Do not edit.
#pragma once
#include <array>

View File

@@ -1,3 +1,5 @@
// IWYU pragma: private, include <meojson/json.hpp>
#pragma once
#include <string>
@@ -8,9 +10,12 @@
namespace json::_jsonization_helper
{
struct next_is_optional_t
{};
{
};
struct va_arg_end
{};
{
};
struct dumper
{
@@ -21,19 +26,25 @@ struct dumper
result.emplace(key, var);
return result;
}
template <typename... rest_t>
json::value _to_json(const char*, next_is_optional_t, rest_t&&... rest) const
{
return _to_json(std::forward<rest_t>(rest)...);
}
json::value _to_json(va_arg_end) const { return {}; }
};
struct checker
{
template <typename var_t, typename... rest_t>
bool _check_json(const json::value& in, std::string& error_key, const char* key, const var_t&,
rest_t&&... rest) const
bool _check_json(
const json::value& in,
std::string& error_key,
const char* key,
const var_t&,
rest_t&&... rest) const
{
auto opt = in.find(key);
if (!opt || !opt->is<var_t>()) {
@@ -42,9 +53,16 @@ struct checker
}
return _check_json(in, error_key, std::forward<rest_t>(rest)...);
}
template <typename var_t, typename... rest_t>
bool _check_json(const json::value& in, std::string& error_key, const char*, next_is_optional_t, const char* key,
const var_t&, rest_t&&... rest) const
bool _check_json(
const json::value& in,
std::string& error_key,
const char*,
next_is_optional_t,
const char* key,
const var_t&,
rest_t&&... rest) const
{
auto opt = in.find(key);
if (opt) {
@@ -56,13 +74,19 @@ struct checker
return _check_json(in, error_key, std::forward<rest_t>(rest)...);
}
bool _check_json(const json::value&, std::string&, va_arg_end) const { return true; }
};
struct loader
{
template <typename var_t, typename... rest_t>
bool _from_json(const json::value& in, std::string& error_key, const char* key, var_t& var, rest_t&&... rest) const
bool _from_json(
const json::value& in,
std::string& error_key,
const char* key,
var_t& var,
rest_t&&... rest) const
{
auto opt = in.find(key);
if (!opt || !opt->is<var_t>()) {
@@ -73,9 +97,16 @@ struct loader
return _from_json(in, error_key, std::forward<rest_t>(rest)...);
}
template <typename var_t, typename... rest_t>
bool _from_json(const json::value& in, std::string& error_key, const char*, next_is_optional_t, const char* key,
var_t& var, rest_t&&... rest) const
bool _from_json(
const json::value& in,
std::string& error_key,
const char*,
next_is_optional_t,
const char* key,
var_t& var,
rest_t&&... rest) const
{
auto opt = in.find(key);
if (opt) {
@@ -88,6 +119,7 @@ struct loader
return _from_json(in, error_key, std::forward<rest_t>(rest)...);
}
bool _from_json(const json::value&, std::string&, va_arg_end) const { return true; }
};
} // namespace json::_jsonization_helper
@@ -111,122 +143,322 @@ namespace json::_private_macro
#define _MEOJSON_FOR_EACH_0(pred, ...)
#define _MEOJSON_FOR_EACH_1(pred, x, ...) pred(x)
#define _MEOJSON_FOR_EACH_2(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_1(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_3(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_2(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_4(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_3(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_5(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_4(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_6(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_5(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_7(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_6(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_8(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_7(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_9(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_8(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_10(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_9(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_11(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_10(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_12(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_11(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_13(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_12(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_14(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_13(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_15(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_14(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_16(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_15(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_17(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_16(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_18(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_17(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_19(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_18(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_20(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_19(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_21(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_20(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_22(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_21(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_23(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_22(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_24(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_23(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_25(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_24(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_26(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_25(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_27(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_26(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_28(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_27(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_29(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_28(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_30(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_29(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_31(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_30(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_32(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_31(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_33(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_32(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_34(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_33(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_35(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_34(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_36(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_35(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_37(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_36(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_38(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_37(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_39(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_38(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_40(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_39(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_41(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_40(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_42(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_41(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_43(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_42(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_44(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_43(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_45(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_44(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_46(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_45(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_47(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_46(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_48(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_47(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_49(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_48(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_50(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_49(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_51(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_50(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_52(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_51(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_53(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_52(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_54(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_53(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_55(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_54(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_56(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_55(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_57(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_56(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_58(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_57(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_59(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_58(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_60(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_59(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_61(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_60(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_62(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_61(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_63(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_62(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_64(pred, x, ...) pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_63(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_2(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_1(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_3(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_2(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_4(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_3(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_5(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_4(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_6(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_5(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_7(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_6(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_8(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_7(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_9(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_8(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_10(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_9(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_11(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_10(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_12(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_11(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_13(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_12(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_14(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_13(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_15(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_14(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_16(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_15(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_17(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_16(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_18(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_17(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_19(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_18(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_20(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_19(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_21(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_20(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_22(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_21(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_23(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_22(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_24(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_23(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_25(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_24(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_26(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_25(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_27(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_26(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_28(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_27(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_29(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_28(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_30(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_29(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_31(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_30(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_32(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_31(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_33(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_32(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_34(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_33(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_35(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_34(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_36(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_35(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_37(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_36(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_38(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_37(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_39(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_38(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_40(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_39(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_41(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_40(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_42(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_41(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_43(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_42(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_44(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_43(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_45(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_44(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_46(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_45(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_47(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_46(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_48(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_47(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_49(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_48(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_50(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_49(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_51(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_50(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_52(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_51(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_53(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_52(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_54(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_53(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_55(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_54(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_56(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_55(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_57(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_56(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_58(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_57(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_59(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_58(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_60(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_59(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_61(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_60(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_62(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_61(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_63(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_62(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_64(pred, x, ...) \
pred(x) _MEOJSON_EXPAND(_MEOJSON_FOR_EACH_63(pred, __VA_ARGS__))
#define _MEOJSON_ARG_COUNT(...) \
_MEOJSON_EXPAND(_MEOJSON_ARG_COUNT1(0, ##__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, \
30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, \
11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
#define _MEOJSON_ARG_COUNT1(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \
_20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, \
_38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, \
_56, _57, _58, _59, _60, _61, _62, _63, _64, N, ...) \
#define _MEOJSON_ARG_COUNT(...) \
_MEOJSON_EXPAND(_MEOJSON_ARG_COUNT1( \
0, \
##__VA_ARGS__, \
64, \
63, \
62, \
61, \
60, \
59, \
58, \
57, \
56, \
55, \
54, \
53, \
52, \
51, \
50, \
49, \
48, \
47, \
46, \
45, \
44, \
43, \
42, \
41, \
40, \
39, \
38, \
37, \
36, \
35, \
34, \
33, \
32, \
31, \
30, \
29, \
28, \
27, \
26, \
25, \
24, \
23, \
22, \
21, \
20, \
19, \
18, \
17, \
16, \
15, \
14, \
13, \
12, \
11, \
10, \
9, \
8, \
7, \
6, \
5, \
4, \
3, \
2, \
1, \
0))
#define _MEOJSON_ARG_COUNT1( \
_0, \
_1, \
_2, \
_3, \
_4, \
_5, \
_6, \
_7, \
_8, \
_9, \
_10, \
_11, \
_12, \
_13, \
_14, \
_15, \
_16, \
_17, \
_18, \
_19, \
_20, \
_21, \
_22, \
_23, \
_24, \
_25, \
_26, \
_27, \
_28, \
_29, \
_30, \
_31, \
_32, \
_33, \
_34, \
_35, \
_36, \
_37, \
_38, \
_39, \
_40, \
_41, \
_42, \
_43, \
_44, \
_45, \
_46, \
_47, \
_48, \
_49, \
_50, \
_51, \
_52, \
_53, \
_54, \
_55, \
_56, \
_57, \
_58, \
_59, \
_60, \
_61, \
_62, \
_63, \
_64, \
N, \
...) \
N
#define _MEOJSON_FOR_EACH_(N, pred, ...) _MEOJSON_EXPAND(_MEOJSON_CONCATENATE(_MEOJSON_FOR_EACH_, N)(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH_(N, pred, ...) \
_MEOJSON_EXPAND(_MEOJSON_CONCATENATE(_MEOJSON_FOR_EACH_, N)(pred, __VA_ARGS__))
#define _MEOJSON_FOR_EACH(pred, ...) \
_MEOJSON_EXPAND(_MEOJSON_FOR_EACH_(_MEOJSON_EXPAND(_MEOJSON_ARG_COUNT(__VA_ARGS__)), pred, __VA_ARGS__))
_MEOJSON_EXPAND( \
_MEOJSON_FOR_EACH_(_MEOJSON_EXPAND(_MEOJSON_ARG_COUNT(__VA_ARGS__)), pred, __VA_ARGS__))
#define _MEOJSON_VARNAME(x) _MEOJSON_CONCATENATE(_meojson_jsonization_, x)
#define _MEOJSON_KEY_VALUE(x) _MEOJSON_STRINGIZE(x), x,
} // namespace json::_private_macro
#define MEO_TOJSON(...) \
json::value to_json() const \
{ \
return json::_jsonization_helper::dumper()._to_json(_MEOJSON_EXPAND( \
_MEOJSON_FOR_EACH(_MEOJSON_KEY_VALUE, __VA_ARGS__)) json::_jsonization_helper::va_arg_end {}); \
#define MEO_TOJSON(...) \
json::value to_json() const \
{ \
return json::_jsonization_helper::dumper()._to_json( \
_MEOJSON_EXPAND(_MEOJSON_FOR_EACH(_MEOJSON_KEY_VALUE, __VA_ARGS__)) \
json::_jsonization_helper::va_arg_end {}); \
}
#define MEO_CHECKJSON(...) \
bool check_json(const json::value& _MEOJSON_VARNAME(in)) const \
{ \
std::string _MEOJSON_VARNAME(error_key); \
return check_json(_MEOJSON_VARNAME(in), _MEOJSON_VARNAME(error_key)); \
} \
bool check_json(const json::value& _MEOJSON_VARNAME(in), std::string& _MEOJSON_VARNAME(error_key)) const \
{ \
return json::_jsonization_helper::checker()._check_json( \
_MEOJSON_VARNAME(in), _MEOJSON_VARNAME(error_key), \
_MEOJSON_EXPAND(_MEOJSON_FOR_EACH(_MEOJSON_KEY_VALUE, __VA_ARGS__)) \
json::_jsonization_helper::va_arg_end {}); \
#define MEO_CHECKJSON(...) \
bool check_json(const json::value& _MEOJSON_VARNAME(in)) const \
{ \
std::string _MEOJSON_VARNAME(error_key); \
return check_json(_MEOJSON_VARNAME(in), _MEOJSON_VARNAME(error_key)); \
} \
bool check_json( \
const json::value& _MEOJSON_VARNAME(in), \
std::string& _MEOJSON_VARNAME(error_key)) const \
{ \
return json::_jsonization_helper::checker()._check_json( \
_MEOJSON_VARNAME(in), \
_MEOJSON_VARNAME(error_key), \
_MEOJSON_EXPAND(_MEOJSON_FOR_EACH(_MEOJSON_KEY_VALUE, __VA_ARGS__)) \
json::_jsonization_helper::va_arg_end {}); \
}
#define MEO_FROMJSON(...) \
bool from_json(const json::value& _MEOJSON_VARNAME(in)) \
{ \
std::string _MEOJSON_VARNAME(error_key); \
return from_json(_MEOJSON_VARNAME(in), _MEOJSON_VARNAME(error_key)); \
} \
bool from_json(const json::value& _MEOJSON_VARNAME(in), std::string& _MEOJSON_VARNAME(error_key)) \
{ \
return json::_jsonization_helper::loader()._from_json( \
_MEOJSON_VARNAME(in), _MEOJSON_VARNAME(error_key), \
_MEOJSON_EXPAND(_MEOJSON_FOR_EACH(_MEOJSON_KEY_VALUE, __VA_ARGS__)) \
json::_jsonization_helper::va_arg_end {}); \
#define MEO_FROMJSON(...) \
bool from_json(const json::value& _MEOJSON_VARNAME(in)) \
{ \
std::string _MEOJSON_VARNAME(error_key); \
return from_json(_MEOJSON_VARNAME(in), _MEOJSON_VARNAME(error_key)); \
} \
bool from_json( \
const json::value& _MEOJSON_VARNAME(in), \
std::string& _MEOJSON_VARNAME(error_key)) \
{ \
return json::_jsonization_helper::loader()._from_json( \
_MEOJSON_VARNAME(in), \
_MEOJSON_VARNAME(error_key), \
_MEOJSON_EXPAND(_MEOJSON_FOR_EACH(_MEOJSON_KEY_VALUE, __VA_ARGS__)) \
json::_jsonization_helper::va_arg_end {}); \
}
#define MEO_JSONIZATION(...) \

View File

@@ -1,59 +1,48 @@
## v5.15.0-beta.1
## v5.16.5
### 新增 | New
* 添加控件半透明背景色,新增自定义背景 (#12204) @ABA2396 @status102
* YoStarEN Sarkaz theme + JP and KR template optimization @Constrat
* 新增 MirrorChyan ErrorCode 提示 (#12202) @ABA2396
* Telegram Topic notification (#12188) @Constrat
* 任务列表支持多个开始唤醒,以实现多账号 (#12144) @hguandl
* SSS#6 for EN (#12168) @dragonheart107
* check nightly version with mirrorchyan (#12173) @MistEO
* 调整下载来源提示 (#12156) @MistEO
* Mac新增基建配置 @hguandl
* 特征匹配 (#10966) @status102
* 绿票、黄票、活动商店 (#12586) @Daydreamer114 @status102 @ABA2396
### 改进 | Improved
* 孤星搓玉关 @Daydreamer114
* 资源更新换一个解压目录 (#12153) @MistEO
* 自动战斗开始前仅移除相似的召唤物头像缓存 @status102
* 调整连战输出 @ABA2396
* 肉鸽不期而遇退出检测加个重试 @status102
### 修复 | Fix
* CheckLevelMax ocr target "-" -> digits (#12223) @BxFS
* handle leak @dantmnf
* YostarKR lower StartToVisit templThreshold (#12193) @HX3N
* 保全开始部署 点击过快导致点击无效 (#12185) @Daydreamer114
* 自动战斗在开启战斗列表时导入作业后,关闭战斗列表开始任务时作业使用错误 @status102
* SSS#6 directional EC and branches @Constrat
* 控制中枢模板mask (#12177) @Daydreamer114
* 繁中服_生息演算組裝道具後卡住 (#12182) @momomochi987 @Daydreamer114
* xaml requires &#160; @Constrat
* 钼铅识别错误 @ABA2396
* update version.json on Arknights-Tile-Pos changes fix 43c672df541bae77b484c2faeb23c4522230e3ca @Constrat
* roguelike already left encounter check and return from map screen (#12088) @BxFS
* 修复MaaCore asst.log文件句柄泄露 (#12639) @status102
* 修复了屎遇上手动覆盖文件的大聪明爆炸的问题 @ABA2396
* 凹开局干员直升精二选项显示时机错误 @ABA2396
* 连战次数乘号匹配失败 @status102
* store underfunded ocr full match @Daydreamer114
### 文档 | Docs
* add space @MistEO
* 任务流color_scales注释优化 @status102
### 其他 | Other
* 繁中服「生路」活動導航 (#12224) @momomochi987
* YostarKR Sarkaz Theme (#12220) @HX3N
* gpu 选项禁用滚轮切换 @ABA2396
* YostarJP Sarkaz Theme (#12216) @Manicsteiner
* YostarJP 琳琅诗怀雅 ocr fix (#12219) @Manicsteiner
* update wording about mirrorchyan (#12208) @MistEO
* add delay pre UnlockClues @Constrat
* YostarKR SSS#6 BuffChoose (#12191) @HX3N
* update issue_template to remove new lines for EN @Constrat
* 移除过时的重连代码 @ABA2396
* tweak SSS files for global @Constrat
* tweaked SSS copilot operators output @Constrat
* add space after `:` @Constrat
* YostarJP EnterInfrastDelicious (#12176) @Manicsteiner
* 繁中服_聲浪安保派駐_定向導能元件 (#12174) @momomochi987
* set output to UTF_8 for ResourceUpdater @Constrat
* manual update version @MistEO
* Revert "fix: roguelike already left encounter check and return from map screen (#12088)" @status102
* Wpf肉鸽任务序列化 (#12124) @status102
* yellow ticket items @Daydreamer114
* ocrTask text @status102
* Store@UnderfundedOCR @Daydreamer114
* 再铲一屎 @status102
* cache 移动逻辑 @ABA2396
* ubuntu unused @status102
* 铲屎 @status102
* 指定类型 @status102
* store loading @Daydreamer114
* Revert "feat: 在肉鸽招募中增加m3作为群奶 (#12353)" @Saratoga-Official
* 简化代码 @ABA2396
* 提示补全 @status102
* NumberReplace @status102
* 再次调整官网细节 @MistEO
* 调整官网标题 @MistEO
* Revert "fix: github change string to int (#12574)" @Daydreamer114
* 绿票、黄票、活动商店-国际服适配 (#12674) @Daydreamer114
* mark @status102
* 调整 UI 与 Core 版本不一致的解决方案提示 @ABA2396
* 点击任意职业回正列表 @ABA2396
* 基建先进行技能识别并返回列表首位,再清空选择 @ABA2396

View File

@@ -81,7 +81,8 @@ if (BUILD_TEST)
target_link_libraries(test MaaCore)
endif (BUILD_TEST)
find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs videoio)
find_package(OpenCV REQUIRED COMPONENTS core imgproc imgcodecs videoio features2d)
find_package(OpenCV QUIET COMPONENTS xfeatures2d)
find_package(ZLIB REQUIRED)
find_package(cpr CONFIG REQUIRED)

View File

@@ -2,17 +2,76 @@
chcp 65001
setlocal enabledelayedexpansion
:: 定义ANSI颜色代码
for /f %%a in ('echo prompt $E^| cmd') do set "ESC=%%a"
set "RESET=%ESC%[0m"
set "GREEN=%ESC%[32m"
set "RED=%ESC%[31m"
set "YELLOW=%ESC%[33m"
set "BLUE=%ESC%[34m"
set "CYAN=%ESC%[36m"
set "WHITE=%ESC%[37m"
set "BOLD=%ESC%[1m"
:: 初始化错误标志
set "ErrorOccurred=0"
openfiles >nul 2>&1
if %errorlevel% neq 0 (
echo 正在获取管理员权限...
echo Obtaining administrator privileges...
echo %YELLOW%正在获取管理员权限...%RESET%
echo %YELLOW%Obtaining administrator privileges...%RESET%
powershell -Command "Start-Process cmd.exe -ArgumentList '/c %~dpnx0' -Verb RunAs"
exit /b
)
winget install "Microsoft.VCRedist.2015+.x64" --override "/repair /passive /norestart" --uninstall-previous --accept-package-agreements --force
winget install "Microsoft.DotNet.DesktopRuntime.8" --override "/repair /passive /norestart" --uninstall-previous --accept-package-agreements --force
echo.
echo %BLUE%========================================%RESET%
echo %BOLD%%CYAN%正在安装 Microsoft Visual C++ Redistributable%RESET%
echo %BOLD%%CYAN%Installing Microsoft Visual C++ Redistributable%RESET%
echo %BLUE%========================================%RESET%
echo.
echo 运行库修复完成,请重启电脑后再次尝试运行 MAA。
echo The runtime library repair is complete. Please restart your computer and try running MAA again.
pause
winget install "Microsoft.VCRedist.2015+.x64" --override "/repair /passive /norestart" --uninstall-previous --accept-package-agreements --force
if %errorlevel% neq 0 (
echo.
echo %BOLD%%RED%错误: Microsoft.VCRedist.2015+.x64 安装失败%RESET%
echo %BOLD%%RED%Error: Microsoft.VCRedist.2015+.x64 installation failed%RESET%
set "ErrorOccurred=1"
)
echo.
echo %BLUE%========================================%RESET%
echo %BOLD%%CYAN%正在安装 .NET Desktop Runtime 8.0%RESET%
echo %BOLD%%CYAN%Installing .NET Desktop Runtime 8.0%RESET%
echo %BLUE%========================================%RESET%
echo.
winget install "Microsoft.DotNet.DesktopRuntime.8" --override "/repair /passive /norestart" --uninstall-previous --accept-package-agreements --force
if %errorlevel% neq 0 (
echo.
echo %BOLD%%RED%错误: Microsoft.DotNet.DesktopRuntime.8 安装失败%RESET%
echo %BOLD%%RED%Error: Microsoft.DotNet.DesktopRuntime.8 installation failed%RESET%
set "ErrorOccurred=1"
)
echo.
if %ErrorOccurred% equ 0 (
echo %BOLD%%GREEN%运行库修复完成,请重启电脑后再次尝试运行 MAA。%RESET%
echo %BOLD%%GREEN%The runtime library repair is complete. Please restart your computer and try running MAA again.%RESET%
) else (
echo %RED%========================================%RESET%
echo %BOLD%%RED%运行库修复过程中出现错误%RESET%
echo %BOLD%%RED%Errors occurred during runtime library repair%RESET%
echo.
echo %YELLOW%您可以尝试手动下载并安装以下组件:%RESET%
echo %YELLOW%You can try to manually download and install the following components:%RESET%
echo.
echo %WHITE%Microsoft Visual C++ Redistributable:%RESET%
echo %CYAN%https://aka.ms/vs/17/release/vc_redist.x64.exe%RESET%
echo.
echo %WHITE%.NET Desktop Runtime 8.0:%RESET%
echo %CYAN%https://aka.ms/dotnet/8.0/windowsdesktop-runtime-win-x64.exe%RESET%
echo %RED%========================================%RESET%
)
pause

View File

@@ -1,4 +1,4 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=EN/@EntryIndexedValue">EN</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=KR/@EntryIndexedValue">KR</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=JP/@EntryIndexedValue">JP</s:String>
@@ -31,6 +31,8 @@
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=WSA/@EntryIndexedValue">WSA</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/XamlNaming/Abbreviations/=XYAZ/@EntryIndexedValue">XYAZ</s:String>
<s:Boolean x:Key="/Default/GrammarAndSpelling/GrammarChecking/Exceptions/=Github/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/GrammarAndSpelling/GrammarChecking/Exceptions/=_4E00_9375_8F2A/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/GrammarAndSpelling/GrammarChecking/Exceptions/=_591C_95F4_6A21_5F0F/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=acast/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=acfend/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=acguad/@EntryIndexedValue">True</s:Boolean>
@@ -55,6 +57,7 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=ccast/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=cdfend/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=cguard/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Chayn/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Chyan/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=cmedic/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Collapsal/@EntryIndexedValue">True</s:Boolean>
@@ -67,6 +70,7 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=dnplayer/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Ehem/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=esource/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Eyjafjalla/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Favourite/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=filetime/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=findstr/@EntryIndexedValue">True</s:Boolean>
@@ -94,9 +98,11 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=ls_005B_0022sub/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=luestacks/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=maatouch/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=MAA_0027s/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=memuc/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Minitouch/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=mirrorc/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mirrorchyan/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mizuki/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mumu/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nemu/@EntryIndexedValue">True</s:Boolean>
@@ -148,11 +154,14 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=Stylet/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=subtask/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Suppressions/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Surtr/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=SWMINIMIZE/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=taskchain/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Todays/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=txwy/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=ucrtbase/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=vmonitor/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Webhook/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=XYAZ/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Yahei/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=yituliu/@EntryIndexedValue">True</s:Boolean>

View File

@@ -33,7 +33,7 @@ MAA 的意思是 MAA Assistant Arknights
基于图像识别技术,一键完成全部日常任务!
绝赞更新中 ✿✿ヽ(°▽°)ノ✿
绝赞更新中 ✿✿ヽ(°▽°)ノ✿
</div>
@@ -46,7 +46,7 @@ MAA 的意思是 MAA Assistant Arknights
- 刷理智,掉落识别及上传 [企鹅物流](https://penguin-stats.cn/)[一图流](https://ark.yituliu.cn/)
- 智能基建换班,自动计算干员效率,单设施内最优解;同时也支持 [自定义排班](https://maa.plus/docs/zh-cn/protocol/base-scheduling-schema.html)
- 自动公招,可选使用加急许可,一次全部刷完!公招数据自动上传 [企鹅物流](https://penguin-stats.cn/result/stage/recruit/recruit)[一图流](https://ark.yituliu.cn/survey/maarecruitdata)
- 支持手动识别公招界面,方便对高星公招做出选择 ~~(你的这个高姿回费出的是推王呢还是推王呢)~~
- 支持手动识别公招界面,方便对高星公招做出选择 ~~(你的这个高回费出的是推王呢还是推王呢)~~
- 支持识别干员列表,统计已有和未有干员及潜能,并在公招识别显示
- 支持识别养成材料,并导出至 [企鹅物流刷图规划](https://penguin-stats.cn/planner)、[明日方舟工具箱](https://arkntools.app/#/material)、[ARK-NIGHTS 干员培养表](https://ark-nights.com/settings)
- 访问好友、收取信用及购物、领取日常奖励等,一键全日常自动长草
@@ -192,7 +192,7 @@ MAA 以中文(简体)为第一语言,翻译词条均以中文(简体)
## 声明
- 本软件使用 [GNU Affero General Public License v3.0 only](https://spdx.org/licenses/AGPL-3.0-only.html) 开源。
- 本软件使用 [GNU Affero General Public License v3.0 only](https://spdx.org/licenses/AGPL-3.0-only.html) 开源,并附带额外 [用户协议](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/terms-of-service.md)
- 本软件 logo 并非使用 AGPL 3.0 协议开源,[耗毛](https://weibo.com/u/3251357314)、vie 两位画师及软件全体开发者保留所有权利。不得以 AGPL 3.0 协议已授权为由在未经授权的情况下使用本软件 logo不得在未经授权的情况下将本软件 logo 用于任何商业用途。
- 本软件开源、免费,仅供学习交流使用。若您遇到商家使用本软件进行代练并收费,可能是设备与时间等费用,产生的问题及后果与本软件无关。
@@ -202,13 +202,13 @@ MAA 以中文(简体)为第一语言,翻译词条均以中文(简体)
## 广告
用户交流 QQ 群:[MAA 使用 & 粥游交流 QQ 群](https://ota.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
用户交流 QQ 群:[MAA 使用 & 粥游交流 QQ 群](https://api.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
Discord 服务器: [邀请链接](https://discord.gg/23DfZ9uA4V)
用户交流 TG 群:[Telegram 群](https://t.me/+Mgc2Zngr-hs3ZjU1)
自动战斗 JSON 作业分享:[prts.plus](https://prts.plus)
Bilibili 直播间:[MrEO 直播间](https://live.bilibili.com/2808861) 直播敲代码 & [MAA-Official 直播间](https://live.bilibili.com/27548877) 游戏/杂谈
Bilibili 直播间:[MrEO 直播间](https://live.bilibili.com/2808861) 直播敲代码 & [MAA-Official 直播间](https://live.bilibili.com/27548877) 游戏/杂谈
技术群(舟无关、禁水):[内卷地狱!(QQ 群)](https://jq.qq.com/?_wv=1027&k=ypbzXcA2)
开发者群:[QQ 群](https://jq.qq.com/?_wv=1027&k=JM9oCk3C)
开发者群:[QQ 群](https://jq.qq.com/?_wv=1027&k=JM9oCk3C)
如果觉得软件对你有帮助,帮忙点个 Star 吧!~(网页最上方右上角的小星星),这就是对我们最大的支持了!

View File

@@ -0,0 +1,52 @@
import type { VNode } from "vue";
import { defineComponent, h } from "vue";
import NavbarDropdown from "@theme-hope/modules/navbar/components/NavbarDropdown";
import { I18nIcon } from "@theme-hope/modules/navbar/components/icons/index";
import { useNavbarLanguageDropdown } from "@theme-hope/modules/navbar/composables/index";
export default defineComponent({
name: "LanguageDropdown",
setup() {
const dropdown = useNavbarLanguageDropdown();
const filteredDropdown = () => {
if (!dropdown.value) return null;
const filteredConfig = { ...dropdown.value };
if (filteredConfig.children) {
filteredConfig.children = filteredConfig.children.filter(item => item.link !== '/');
}
return filteredConfig;
};
//console.log("OldLanguageDropdown", dropdown.value);
//console.log("NewLanguageDropdown", filteredDropdown());
return (): VNode | null =>
dropdown.value
? h(
"div",
{ class: "vp-nav-item" },
h(
NavbarDropdown,
{ config: filteredDropdown() },
{
title: () =>
h(I18nIcon, {
"aria-label": filteredDropdown()?.ariaLabel,
style: {
width: "1rem",
height: "1rem",
verticalAlign: "middle",
},
}),
},
),
)
: null;
},
});

View File

@@ -1,8 +1,11 @@
import { defineUserConfig } from "vuepress";
import { getDirname, path } from "vuepress/utils";
import { viteBundler } from "@vuepress/bundler-vite";
import { googleAnalyticsPlugin } from "@vuepress/plugin-google-analytics";
import Theme from "./theme";
const __dirname = getDirname(import.meta.url);
export default defineUserConfig({
base: "/docs/",
lang: "zh-CN",
@@ -11,24 +14,29 @@ export default defineUserConfig({
port: 3001,
locales: {
"/": {
lang: " ",
title: " ",
description: " ",
},
"/zh-cn/": {
lang: "zh-CN",
lang: "zh-cn",
description: "文档",
},
"/zh-tw/": {
lang: "zh-TW",
lang: "zh-tw",
description: "文件",
},
"/en-us/": {
lang: "en-US",
lang: "en-us",
description: "Documentation",
},
"/ja-jp/": {
lang: "ja-JP",
lang: "ja-jp",
description: "ドキュメンテーション",
},
"/ko-kr/": {
lang: "ko-KR",
lang: "ko-kr",
description: "선적 서류 비치",
},
},
@@ -41,6 +49,13 @@ export default defineUserConfig({
theme: Theme,
alias: {
"@theme-hope/modules/navbar/components/LanguageDropdown": path.resolve(
__dirname,
"./components/LanguageDropdown.ts",
),
},
plugins: [
googleAnalyticsPlugin({
id: "G-FJQDKG394Z",

View File

@@ -1,10 +1,10 @@
$sidebar-width: 16rem;
$content-width: 1000px;
$font-family: '-apple-system, BlinkMacSystemFont, "Noto Sans SC", "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", STHeiti, "Microsoft YaHei", sans-serif';
$font-family-heading: 'Georgia, -apple-system, "Nimbus Roman No9 L", "PingFang SC", "Hiragino Sans GB", "Noto Serif SC", "Microsoft Yahei", "WenQuanYi Micro Hei", "ST Heiti", sans-serif';
$font-family-mono: '"Sarasa Gothic", "Jetbrains mono", "Fira Code", "Noto Sans SC", Consolas, monospace, Menlo, "Courier New"';
$vp-font: '-apple-system, BlinkMacSystemFont, "Noto Sans SC", "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", STHeiti, "Microsoft YaHei", sans-serif';
$vp-font-heading: 'Georgia, -apple-system, "Nimbus Roman No9 L", "PingFang SC", "Hiragino Sans GB", "Noto Serif SC", "Microsoft Yahei", "WenQuanYi Micro Hei", "ST Heiti", sans-serif';
$vp-font-mono: '"Sarasa Gothic", "Jetbrains mono", "Fira Code", "Noto Sans SC", Consolas, monospace, Menlo, "Courier New"';
html[lang="ja-JP"] {
$font-family: "Helvetica Neue, Arial, Hiragino Kaku Gothic ProN, Hiragino Sans, Meiryo, sans-serif";
$vp-font: "Helvetica Neue, Arial, Hiragino Kaku Gothic ProN, Hiragino Sans, Meiryo, sans-serif";
}

View File

@@ -5,11 +5,15 @@ import { zhcnSidebar, zhtwSidebar, enusSidebar, jajpSidebar, kokrSidebar } from
export default hopeTheme({
hostname: "https://maa.plus",
iconAssets: "iconify",
author: "MaaAssistantArknights",
license: "AGPL-3.0",
repo: "MaaAssistantArknights/MaaAssistantArknights",
docsBranch: "dev",
docsDir: "/docs",
lastUpdated: false,
contributors: false,
locales: {
"/zh-cn/": {
navbar: zhcnNavbar,
@@ -23,6 +27,7 @@ export default hopeTheme({
navbar: zhtwNavbar,
sidebar: zhtwSidebar,
displayFooter: false,
title: '繁体中文',
metaLocales: {
editLink: "在 Github 上編輯此頁面",
},
@@ -53,6 +58,33 @@ export default hopeTheme({
},
},
markdown: {
align: true,
codeTabs: true,
//echarts: true,
footnote: true,
gfm: true,
hint: true,
imgLazyload: true,
imgMark: true,
imgSize: true,
//mathjax: true,
mark: true,
//mermaid: true,
tabs: true,
tasklist: true,
vPre: true,
component: true,
highlighter: {
'type': 'shiki',
themes: {
light: "light-plus",
dark: "nord",
}
},
},
plugins: {
activeHeaderLinks: false,
@@ -66,111 +98,88 @@ export default hopeTheme({
strict: true,
},
copyright: {
license: "AGPL-3.0",
},
docsearch: DocSearchConfig,
mdEnhance: {
align: true,
codetabs: true,
//echarts: true,
footnote: true,
gfm: true,
hint: true,
imgLazyload: true,
imgMark: true,
imgSize: true,
//mathjax: true,
mark: true,
//mermaid: true,
tabs: true,
tasklist: true,
vPre: true,
component: true,
},
shiki: {
themes: {
light: "light-plus",
dark: "nord",
}
icon: {
assets: "iconify",
},
sitemap: true,
seo: true,
notice: [
{
path: "/zh-tw/",
title: "翻译警告",
content: "MAA 的文檔以簡體中文為主,其他語言的文檔可能品質低或尚未翻譯,請諒解。",
fullscreen: true,
confirm: true,
showOnce: true,
actions: [
{
text: "我知道了",
type: "primary",
},
{ text: "前往簡體中文",
link: "/zh-cn/",
},
],
},
{
path: "/en-us/",
title: "Translation Warning",
content: "MAA's documents are mainly in Simplified Chinese. Documents in other languages may be of low quality or not yet translated. Please understand.",
fullscreen: true,
confirm: true,
showOnce: true,
actions: [
{
text: "Okay",
type: "primary",
},
{ text: "Take me to zh-CN",
link: "/zh-cn/",
},
],
},
{
path: "/ja-jp/",
title: "翻訳に関する警告",
content: "MAA のドキュメントは主に簡体字中国語で書かれており、他の言語のドキュメントは低品質であるか、翻訳されていない可能性がありますので、ご了承ください。",
fullscreen: true,
confirm: true,
showOnce: true,
actions: [
{
text: "OK",
type: "primary",
},
{ text: "中国語サイトへ行く",
link: "/zh-cn/",
},
],
},
{
path: "/ko-kr/",
title: "번역 경고",
content: "MAA의 문서는 주로 중국어 간체로 되어 있습니다. 다른 언어로 된 문서는 번역이 이상하거나, 번역이 되어있지 않을 수 있습니다.",
fullscreen: true,
confirm: true,
showOnce: true,
actions: [
{
text: "OK",
type: "primary",
},
{ text: "중국어 간체로 이동",
link: "/zh-cn/",
},
],
},
{
path: "/zh-tw/",
title: "翻译警告",
content: "MAA 的文檔以簡體中文為主,其他語言的文檔可能品質低或尚未翻譯,請諒解。",
fullscreen: true,
confirm: true,
showOnce: true,
actions: [
{
text: "我知道了",
type: "primary",
},
{
text: "前往簡體中文",
link: "/zh-cn/",
},
],
},
{
path: "/en-us/",
title: "Translation Warning",
content: "MAA's documents are mainly in Simplified Chinese. Documents in other languages may be of low quality or not yet translated. Please understand.",
fullscreen: true,
confirm: true,
showOnce: true,
actions: [
{
text: "Okay",
type: "primary",
},
{
text: "Take me to zh-CN",
link: "/zh-cn/",
},
],
},
{
path: "/ja-jp/",
title: "翻訳に関する警告",
content: "MAA のドキュメントは主に簡体字中国語で書かれており、他の言語のドキュメントは低品質であるか、翻訳されていない可能性がありますので、ご了承ください。",
fullscreen: true,
confirm: true,
showOnce: true,
actions: [
{
text: "OK",
type: "primary",
},
{
text: "中国語サイトへ行く",
link: "/zh-cn/",
},
],
},
{
path: "/ko-kr/",
title: "번역 경고",
content: "MAA의 문서는 주로 중국어 간체로 되어 있습니다. 다른 언어로 된 문서는 번역이 이상하거나, 번역이 되어있지 않을 수 있습니다.",
fullscreen: true,
confirm: true,
showOnce: true,
actions: [
{
text: "OK",
type: "primary",
},
{
text: "중국어 간체로 이동",
link: "/zh-cn/",
},
],
},
],
},
});
}, { custom: true });

View File

@@ -1,4 +1,17 @@
---
home: true
pageInfo: false
breadcrumb: false
navbar: false
sidebar: false
index: false
lastUpdated: false
editLink: false
contributors: false
prev: false
next: false
---
!: .7:~!.
:. :?55 ?5~::~J?:
@@ -47,7 +60,6 @@
. . . . .
7^.::?7:^: :7?:...P:. :~~~7P~~~^. :Y ^~~G!~~. :J?:^.?^^5 !! Y^ :Y.. ~~~^~Y!^~~: :P. :^^^JY .7~!.!~::5.
.:. ~^ 7? :YJ.77.P:~? Y~~7P~~J: ~7J^~!!P7!!.::JY?J:Y ?^ ^G..5~:P^!J .YJ Y7^Y Y^ :? 5 Y. P
@@ -57,6 +69,6 @@
.
<!-- markdownlint-disable-file -->

View File

@@ -124,7 +124,7 @@ The formatting tool will automatically run every time you submit to ensure that
### Enable clang-format in Visual Studio
1. Install clang-format version 17 or higher.
1. Install clang-format version 20.1.0 or higher.
```bash
python -m pip install clang-format

View File

@@ -418,6 +418,7 @@ binary = true # whether install maa-cli binary
# hot update resource configurations
[resource]
auto_update = true # whether auto update resource before running task
warn_on_update_failure = true # Whether to warn on update failure instead of panic
backend = "libgit2" # the backend of resource, can be "libgit2" or "git"
# the remote of resource

View File

@@ -96,7 +96,7 @@ maa-cli only provides an interface for MaaCore, it needs MaaCore and resources t
maa install
```
For users who installed via package managers, MaaCore can be installed via package managers:
For users who installed via package managers, MaaCore can also be installed via package managers:
- Homebrew
@@ -112,8 +112,6 @@ For users who installed via package managers, MaaCore can be installed via packa
- Nix
```bash
nix-env -iA nixpkgs.maa-assistant-arknights
```
maa-cli on Nix depends on the MaaCore package, so no additional installation is required.
**NOTE**: Only users who installed maa-cli via package managers can install MaaCore via package managers. Otherwise, please use the `maa install` command to install. In addition, the `maa install` downloads the official precompiled MaaCore, while the MaaCore installed by package managers has different compilation options and dependency versions from the official precompiled version. This does not affect the use of maa-cli but may cause differences in the functionality and performance of MaaCore. For example, the MaaCore installed by package managers uses a newer version of `fastdeploy`, while the official precompiled MaaCore uses an older version of `fastdeploy`. In the new version of `fastdeploy`, logs can be hidden, which can eliminate some unnecessary log output.
**NOTE**: Only users who installed maa-cli via package managers can install MaaCore via package managers. Otherwise, please use the `maa install` command to install. In addition, the `maa install` downloads the official precompiled MaaCore, while the MaaCore installed by package managers has different compilation options and dependency versions from the official precompiled version, potentially causing variations in behavior and performance.

View File

@@ -55,7 +55,7 @@ Fully compatible. Need to turn on `Settings` - `Advanced` - `Android Debug Bridg
### ✅ [Nox](https://www.yeshen.com/)
Fully compatible. MAAX cannot auto-detect adb port now, so you need to fill in adb port `127.0.0.1:62001` in MAA `Setting` - `Connect Setting`. Notice that port is not default `5555` , you can get more info in [Common ADB ports for popular Android emulators](../faq.md#common-adb-ports-for-popular-android-emulators)
Fully compatible.
P.S.: Nox adb bin file path in Mac is `/Applications/NoxAppPlayer.app/Contents/MacOS/adb` , in parent path `MacOS` you are able to use `adb devices` command to get adb path.

View File

@@ -27,7 +27,7 @@ const fullySupport = shuffleArray([
{
name: 'Bluestacks 5',
link: 'https://www.bluestacks.com/',
note: 'Fully compatible. Need to turn on `Allow ADB connections` in the emulator `Settings` - `Engine Settings`. Known to be compatible with Hyper-V.\n\n- Recommended to download [Offline Installer](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer) to avoid slow and bundled installation; recommend installing [Android 11](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer#:~:text=To%20install%20BlueStacks%205%20Android%2011) version; to uninstall it, please use the official [Uninstall Tool](https://support.bluestacks.com/hc/en-us/articles/360057724751-How-to-uninstall-BlueStacks-5-BlueStacks-X-and-BlueStacks-Services-completely-from-your-PC) to get rid of the residue.\n- If the adb port number keeps changing irregularly and is different every time you start it, it may be because your computer has [Hyper-V](https://support.bluestacks.com/hc/en-us/articles/4415238471053-System-requirements-for-BlueStacks-5-on-Hyper-V-enabled-Windows-10-and-11) enabled. MAA will now try to automatically read the port number within the Blue Stacker emulator configuration file, if this does not work/you have a need to multi-open/have more than one emulator kernel installed, please refer to the [Connection (TODO)](../connection.html#the-port-number-of-bluestack-emulator-hyper-v-is-different-every-time-it-is-started) to make changes. Since Hyper-V runs as administrator, operations that don\'t involve adb such as auto-shutdown of the emulator, auto-detect connection, etc. also need to run MAA as administrator.',
note: 'Fully compatible. Need to turn on ADB Connectivity in the emulator `Settings` `Advanced` → `Android Debug Bridge` → `Enable`. Known to be compatible with Hyper-V.\n\n- Recommended to download [Offline Installer](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer) to avoid slow and bundled installation; recommend installing [Android 11](https://support.bluestacks.com/hc/en-us/articles/4402611273485-BlueStacks-5-offline-installer#:~:text=To%20install%20BlueStacks%205%20Android%2011) version; to uninstall it, please use the official [Uninstall Tool](https://support.bluestacks.com/hc/en-us/articles/360057724751-How-to-uninstall-BlueStacks-5-BlueStacks-X-and-BlueStacks-Services-completely-from-your-PC) to get rid of the residue.\n- If the adb port number keeps changing irregularly and is different every time you start it, it may be because your computer has [Hyper-V](https://support.bluestacks.com/hc/en-us/articles/4415238471053-System-requirements-for-BlueStacks-5-on-Hyper-V-enabled-Windows-10-and-11) enabled. MAA will now try to automatically read the port number within the Blue Stacker emulator configuration file, if this does not work/you have a need to multi-open/have more than one emulator kernel installed, please refer to the [Connection (TODO)](../connection.html#the-port-number-of-bluestack-emulator-hyper-v-is-different-every-time-it-is-started) to make changes. Since Hyper-V runs as administrator, operations that don\'t involve adb such as auto-shutdown of the emulator, auto-detect connection, etc. also need to run MAA as administrator.',
},
{
name: 'MuMu Emulator 12',
@@ -37,7 +37,7 @@ const fullySupport = shuffleArray([
{
name: 'LDPlayer',
link: 'https://www.ldmnq.com/',
note: 'Fully compatible, with additional support for the [Screenshot Enhanced Mode](../connection.html#ld-screenshot-enhanced-mode). Known to be compatible with Hyper-V.\n\n- LDPlayer 9 installer will automatically and silently disable Hyper-V during the installation process. Please pay attention if you have related needs.',
note: 'Fully compatible, with additional support for the [Screenshot Enhanced Mode](../connection.html#ld-screenshot-enhanced-mode). Need to turn on ADB Connectivity in the emulator : `Settings``Others``ADB debugging``Enable local connection`. Known to be compatible with Hyper-V.\n\n- LDPlayer 9 installer will automatically and silently disable Hyper-V during the installation process. Please pay attention if you have related needs.',
},
{
name: 'Nox',

View File

@@ -9,7 +9,7 @@ If this is your first time using MAA, please read [Getting Started](./newbie.md)
::: warning
If MAA fails to run after an update, or if youve reached this page via an error window in MAA, its highly likely due to outdated runtime libraries.
If MAA fails to run after an update, or if you've reached this page via an error window in MAA, it's highly likely due to outdated runtime libraries.
The most frequent issue is runtime-related, yet many users ignore the documentation and ask around, so we replaced the pinned message with this. It's frustrating.
Please run `DependencySetup_依赖库安装.bat` in the MAA directory, or execute the commands below in a terminal,

View File

@@ -1,5 +1,6 @@
---
order: 3
icon: hugeicons:brain-02
---
# Combat
@@ -20,6 +21,7 @@ order: 3
- `Use Originium` will only be used after `Use Sanity Option`, because MAA will only use Originium to replenish sanity when there are no Sanity Potions left. Therefore, after checking `Use Originium`, MAA will lock the number of `Use Sanity Potion` to 999, making sure to consume all the Sanity Potions to avoid skipping the `Use Originium` judgment.
::: details Example
| Use Sanity Potion | Use Originium | Perform Battles | Material | Result |
| :------: | :----: | :------: | :------: | -------------------------------------------------------------------------------------------------------------------------------------- |
| | | | | Ends after using up the existing Sanity. |
@@ -48,7 +50,7 @@ order: 3
- Chip stages. The input must be complete with stage number, such as `PR-A-1`.
- Annihilation. The input must be `Annihilation`.
- Some side story stages, now contains `OF-1`, `OF-F3` and `GT-5`.
- The last three stages of the current SS event. This is available after downloading updates automatically from the [API](https://ota.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) when the event is on. The prompt will be shown on the main page when this is available.
- The last three stages of the current SS event. This is available after downloading updates automatically from the [API](https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) when the event is on. The prompt will be shown on the main page when this is available.
- For the SS event rerun, you can enter `SSReopen-XX` to clear XX-1 ~ XX-9 levels once. Example `SSReopen-IC`.
::: details Example
@@ -87,9 +89,19 @@ It starts after the `Combat` task ends and is not controlled by `Use Sanity Poti
### Series
- MAA currently only performs consecutive battles according to the number of times set by the user and does not yet support automatic recognition of the maximum number of consecutive battles.
- If the set number of times is too high but sanity is insufficient, MAA will directly perform the `Use Sanity Potion` or `Use Originium` operation and continue to attempt consecutive battles.
- If `Use Sanity Potion` or `Use Originium` is not set, MAA will directly consider sanity insufficient and terminate the sanity farming task. If `Remaining Sanity` is set, MAA will directly start farming the `Remaining Sanity` stages.
MAA will fight according to the number of consecutive battles set by the user:
- **AUTO mode** (0):
- Automatically identify the maximum number of consecutive battles in the level, maintain the maximum number of consecutive battles and do not overflow sanity
- Enter the `Remaining Sanity` process after completion (if set)
- **Numerical mode** (1~6):
- Perform consecutive battles according to the set number of times
- If the current sanity is not enough to complete the set number of times (such as only 5 times but set to 6 times), it will directly end the task and enter the `Remaining Sanity` process (if set)
- **Disable mode** (-1):
- Do not adjust the number of consecutive battles in the game
- If the sanity is not enough to complete the current set number of times in the game, directly end the task and enter the `Remaining Sanity` process (if set)
### Drop Recognition

View File

@@ -1,5 +1,6 @@
---
order: 9
icon: ph:sword-bold
---
# Copilot

View File

@@ -1,5 +1,6 @@
---
order: 5
icon: solar:shop-2-bold
---
# Credit Store

View File

@@ -1,5 +1,6 @@
---
order: 4
icon: material-symbols:view-quilt-rounded
---
# Base
@@ -19,7 +20,7 @@ order: 4
- The work shift strategy is based on the optimal solution within a single facility instead of multiple facilities. Combinations such as: `Shamare-Tequila`, `Vermeil-Scene` within a single facility can be recognized correctly; while combinations like `Rosmontis`, `Pinus Sylvestris` among facilities are not supported yet.
- If `Usage of Drone` is selected with the option `Trading Post-LMD`, it will recognize `Shamare` and reserve it for her.
- Operators of the corresponding faction will be selected when only one Clue is needed in the Reception Room; otherwise, general operators will be chosen.
- The reception Room will send out Clues only when your Clues are full. Three Clues will be sent out at most. If wanted, you can edit the number of sent Clues in the `SelectClue` - `maxTimes` field in `resource/tasks.json`.
- The reception Room will send out Clues only when your Clues are full. Three Clues will be sent out at most. If wanted, you can edit the number of sent Clues in the `ClueSelected` - `maxTimes` field in `resource/tasks/tasks.json`.
- If you do not want operators like `Irene` or someone else to be put into the dormitory when the training room is not in use, you can switch off `Working operator shall not be put into the dormitory` in the settings. Note that this may cause the operators with non-full fatigue to not enter the dormitory as well.
- Due to the complexity of the Control Center, only `Amiya`, `Swire`, `Kal'tsit`, `Team Rainbow` and other Morale+0.05 operators will be considered. To be improved in future.
- Some alternate operators may have conflicts in Infrastructure. Please take note if there are "Operator conflict" warnings on the UI, and double check the Infrastructure to shift manually (e.g. some facilities may not have any operator).

View File

@@ -1,5 +1,6 @@
---
order: 7
icon: ri:game-fill
---
# Integrated Strategy (I.S.)

View File

@@ -1,5 +1,6 @@
---
order: 11
icon: icon-park-solid:other
---
# Others

View File

@@ -1,5 +1,6 @@
---
order: 8
icon: solar:streets-map-point-linear
---
# Reclamation Algorithm (R.A.)

View File

@@ -1,5 +1,6 @@
---
order: 2
icon: fluent:people-24-filled
---
# Recruit

View File

@@ -1,5 +1,6 @@
---
order: 6
icon: lucide:gift
---
# Rewards

View File

@@ -1,5 +1,6 @@
---
order: 1
icon: ic:round-rocket-launch
---
# Startup

View File

@@ -1,5 +1,6 @@
---
order: 10
icon: octicon:tools-16
---
# Tools

View File

@@ -87,6 +87,7 @@ By default, only E1 Level 55 operators will be recruited
1. Introduction to existing groups
Take Phantom's I.S. as an example: operators are mainly divided in
| Group | Considerations | Class | Operators |
| :--- | :--- | :--- | :--- |
| ***Ground block*** | 站场和清杂 | 重装, 近卫 | 奶盾, 基石, 羽毛笔, 山, M3, 令和稀音的召唤物, 斑点, 重装预备干员 |
@@ -101,6 +102,7 @@ By default, only E1 Level 55 operators will be recruited
2. Groups requiring special handling
In addition to those general groups, sometimes we need more custom tweaks for some operators or types such as
| Group | Operators | Features |
| :--- | :--- | :--- |
| Thorns | Thorns, Horn | Long-range melee, many maps have good spots |

View File

@@ -76,8 +76,11 @@ Appends a task.
"medicine": int, // Maximum number Sanity Potion used, optional, by default 0
"expiring_medicine": int, // Maximum number of expired Sanity Potion within 48 hours, optional, by default 0
"stone": int, // Maximum number of Originite Prime used, optional, by default 0
"times": int, // Maximum times, optional, by default infinite
"series": int, // Number of series, optional, 1~6
"times": int, // Fight times, optional, by int32.max
"series": int, // Number of series, optional, -1~6
// -1 To disable switching series
// 0 To automatically switch to the maximum number of series currently available, if the current sanity is less than 6 times, select the minimum number of times available
// 1~6 To modify to a specified number of times
"drops": { // Specifying the number of drops, optional, no specification by default
"30011": int, // Key: item ID; value: number of items. Key refers to resource/item_index.json
"30062": int // OR combination
@@ -147,8 +150,9 @@ Supports some of the special stages,Please refer to [autoLocalization example](h
{
"enable": bool, // Whether to enable this task, optional, by default true
"mode": int, // Shift mode, optional. Editing in run-time is not supported.
// 0 - By Default, auto shift
// 0 - By Default, auto shift
// 10000 - Custom Mode, please refer 3.6-INFRASTRUCTURE_SCHEDULING_SCHEMA
// 20000 - Rotation: One-key rotation mode, skips control center, power station, dormitory and office, other facilities do not change shifts but retain basic operations (such as using drones, reception room logic)
"facility": [ // Facilities for shifting, required. Editing in run-time is not supported.
string, // Facility name: "Mfg" | "Trade" | "Power" | "Control" | "Reception" | "Office" | "Dorm"
...

View File

@@ -5,7 +5,7 @@ icon: material-symbols:task
# Task Schema
Usage of `resource/tasks.json` and description of each field
Usage of `resource/tasks` and description of each field
## Overview
@@ -100,7 +100,7 @@ Usage of `resource/tasks.json` and description of each field
// Then set "maskRange" to [ 1, 255 ], to instantly ignore the blacked-out parts when matching
"colorScales": [ // Effective and required when method is HSVCount or RGBCount, color mask range.
[ // list<array<array<int, 3>, 2> | array<int, 2>>
[ // list<array<array<int, 3>, 2>> / list<array<int, 2>>
[23, 150, 40], // Structure is [[lower1, upper1], [lower2, upper2], ...]
[25, 230, 150] // Inner layer is int if grayscale,
], //   is array<int, 3> if three-channel color, method determines whether it is RGB or HSV;
@@ -136,12 +136,28 @@ Usage of `resource/tasks.json` and description of each field
"isAscii": false, // optional, whether the text content to be recognized is ASCII characters
// default false if not filled
"withoutDet": false // Optional, whether to not use the detection model
"withoutDet": false, // Optional, whether to not use the detection model
// default false if not filled
/* The following fields are only valid when the algorithm is Hash */
// The algorithm is not mature, and is only used in some special cases, so it is not recommended for now
// Todo
/* The following fields are valid only when algorithm is FeatureMatch */
"template": "xxx.png", // Optional, the image file name to match, can be a string or a string list
// Default "taskname.png"
"count": 4, // The number of feature points to match (threshold), default value = 4
"ratio": 0.6, // The distance ratio of the KNN matching algorithm, [0 - 1.0], the larger the ratio, the looser the match and the easier it is to connect. Default 0.6
"detector": "SIFT", // Feature point detector type, optional values are SIFT, ORB, AKAZE, SURF; default value = SIFT
// SIFT: High computational complexity, scale invariance, rotation invariance. Best effect.
// ORB: Very fast computational speed, rotation invariance. But not scale invariance.
// BRISK: Very fast computational speed, scale invariance, rotation invariance.
// KAZE: Applicable to 2D and 3D images, with scale invariance and rotation invariance.
// AKAZE: Fast calculation speed, with scale invariance and rotation invariance.
}
}
```

View File

@@ -102,7 +102,7 @@ MAA supports command line interface (CLI) operation, supports Linux, macOS and W
- New Framework: [MaaFramework](https://github.com/MaaXYZ/MaaFramework)
- [Co-pilot (auto-battle) site](https://prts.plus) Frontend: [maa-copilot-frontend](https://github.com/MaaAssistantArknights/maa-copilot-frontend)
- [Co-pilot (auto-battle) site](https://prts.plus) Backend: [MaaBackendCenter](https://github.com/MaaAssistantArknights/MaaBackendCenter)
- [Website](https://www.maa.plus): [Frontend](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/website)
- [Website](https://maa.plus): [Frontend](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/website)
- Deep Learning: [MaaAI](https://github.com/MaaAssistantArknights/MaaAI)
### i18n
@@ -191,7 +191,7 @@ Thanks to all friends who contribute to development/testing for making MAA bette
## Disclaimer
- This software is open source under the [GNU Affero General Public License v3.0 only](https://spdx.org/licenses/AGPL-3.0-only.html).
- This software is open source under the [GNU Affero General Public License v3.0 only](https://spdx.org/licenses/AGPL-3.0-only.html), and comes with an additional [user agreement](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/terms-of-service.md).
- The logo of this software is NOT granted rights under AGPL 3.0 License. [耗毛](https://weibo.com/u/3251357314) and Vie, the two artists and all developers of the software reserves all rights. The logo of the software shall not be used without authorization even if the project has an AGPL 3.0 License. Nor shall the logo be used for commercial purposes without authorization.
- The software is an open-source, free of charge software only for studying and communication purposes. There is no agreement or understanding between the developers of the software and the 3rd party person who uses this software as an assistant and charges you. In that case, the developers of the software are not responsible for the problems and consequences caused.
@@ -202,7 +202,7 @@ This software supports GPU acceleration, which relies on an independent componen
## Advertisement
Discord Server: [Discord Invite](https://discord.gg/23DfZ9uA4V)
User Group: [Telegram](https://t.me/+Mgc2Zngr-hs3ZjU1), [QQ Group](https://ota.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
User Group: [Telegram](https://t.me/+Mgc2Zngr-hs3ZjU1), [QQ Group](https://api.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
Copilot JSON Sharing: [prts.plus](https://prts.plus)
Bilibili Livestreams: [MrEO Livestream](https://live.bilibili.com/2808861) Coding Sessions & [MAA-Official Livestream](https://live.bilibili.com/27548877) Gaming/Chats
[Technical Discussion (QQ Group)](https://jq.qq.com/?_wv=1027&k=ypbzXcA2)

View File

@@ -328,10 +328,19 @@
"char_381_bubble": "Bubble",
"char_385_finlpp": "Purestream",
"char_440_pinecn": "Pinecone",
"char_445_wscoot": "",
"char_452_bstalk": "Beanstalk",
"char_469_indigo": "Indigo",
"char_484_robrta": "Roberta",
"char_491_humus": "Humus",
"char_600_cpione": "",
"char_601_cguard": "",
"char_602_cdfend": "",
"char_603_csnipe": "",
"char_604_ccast": "",
"char_605_cmedic": "",
"char_606_csuppo": "",
"char_607_cspec": "",
"char_4004_pudd": "Pudding",
"char_4041_chnut": "Chestnut",
"char_4062_totter": "Totter",
@@ -339,7 +348,8 @@
"char_4067_lolxh": "Luo Xiaohei",
"char_4100_caper": "Caper",
"char_4107_vrdant": "Verdant",
"char_4130_luton": "Lutonada"
"char_4130_luton": "Lutonada",
"char_4165_ctrail": ""
},
"5": {
"char_002_amiya": "Amiya",
@@ -440,6 +450,7 @@
"char_476_blkngt": "Blacknight",
"char_478_kirara": "Kirara",
"char_486_takila": "Tequila",
"char_487_bobb": "Bobbing",
"char_488_buildr": "Poncirus",
"char_489_serum": "Corroserum",
"char_492_quercu": "Quercus",
@@ -460,7 +471,7 @@
"char_1024_hbisc2": "Hibiscus the Purifier",
"char_1027_greyy2": "Greyy the Lightningbearer",
"char_1030_noirc2": "Rathalos S Noir Corne",
"char_1036_fang2": "Fang the Fire-sharpened",
"char_1036_fang2": "Fang the Fire-Sharpened",
"char_4006_melnte": "Melanite",
"char_4013_kjera": "Kjera",
"char_4014_lunacu": "Lunacub",
@@ -476,6 +487,7 @@
"char_4043_erato": "Erato",
"char_4045_heidi": "Heidi",
"char_4047_pianst": "Czerny",
"char_4052_surfer": "",
"char_4054_malist": "Minimalist",
"char_4066_highmo": "Highmore",
"char_4071_peper": "Paprika",
@@ -503,7 +515,17 @@
"char_4143_sensi": "Senshi",
"char_4144_chilc": "Chilchuck",
"char_4147_mitm": "Mitm",
"char_4151_tinman": "Tin Man"
"char_4148_philae": "",
"char_4151_tinman": "Tin Man",
"char_4155_talr": "",
"char_4162_cathy": "Catherine",
"char_4163_rosesa": "",
"char_4164_tecno": "",
"char_4171_wulfen": "",
"char_4172_xingzh": "",
"char_4173_nowell": "",
"char_4177_brigid": "",
"char_4178_alanna": ""
},
"6": {
"char_003_kalts": "Kal'tsit",
@@ -551,15 +573,25 @@
"char_427_vigil": "Vigil",
"char_430_fartth": "Fartooth",
"char_437_mizuki": "Mizuki",
"char_450_necras": "",
"char_456_ash": "Ash",
"char_472_pasngr": "Passenger",
"char_474_glady": "Gladiia",
"char_479_sleach": "Saileach",
"char_485_pallas": "Pallas",
"char_608_acpion": "",
"char_609_acguad": "",
"char_610_acfend": "",
"char_611_acnipe": "",
"char_612_accast": "",
"char_613_acmedc": "",
"char_614_acsupo": "",
"char_615_acspec": "",
"char_1012_skadi2": "Skadi the Corrupting Heart",
"char_1013_chen2": "Ch'en the Holungday",
"char_1014_nearl2": "Nearl the Radiant Knight",
"char_1016_agoat2": "Eyjafjalla the Hvít Aska",
"char_1019_siege2": "Vina Victoria",
"char_1020_reed2": "Reed the Flame Shadow",
"char_1023_ghost2": "Specter the Unchained",
"char_1026_gvial2": "Gavial the Invincible",
@@ -570,6 +602,10 @@
"char_1033_swire2": "Swire the Elegant Wit",
"char_1034_jesca2": "Jessica the Liberated",
"char_1035_wisdel": "Wiš'adel",
"char_1038_whitw2": "",
"char_1039_thorn2": "",
"char_1040_blaze2": "",
"char_1502_crosly": "",
"char_2012_typhon": "Typhon",
"char_2013_cerber": "Ceobe",
"char_2014_nian": "Nian",
@@ -577,8 +613,11 @@
"char_2023_ling": "Ling",
"char_2024_chyue": "Chongyue",
"char_2025_shu": "Shu",
"char_2026_yu": "",
"char_4009_irene": "Irene",
"char_4010_etlchi": "",
"char_4011_lessng": "Lessing",
"char_4026_vulpis": "",
"char_4027_heyak": "Ho'olheyak",
"char_4039_horn": "Horn",
"char_4042_lumen": "Lumen",
@@ -604,7 +643,8 @@
"char_4138_narant": "Narantuya",
"char_4141_marcil": "Marcille",
"char_4145_ulpia": "Ulpianus",
"char_4146_nymph": "Nymph"
"char_4146_nymph": "Nymph",
"char_4179_monstr": ""
}
}
}

View File

@@ -328,10 +328,19 @@
"char_381_bubble": "バブル",
"char_385_finlpp": "セイリュウ",
"char_440_pinecn": "パインコーン",
"char_445_wscoot": "",
"char_452_bstalk": "ビーンストーク",
"char_469_indigo": "インディゴ",
"char_484_robrta": "ロベルタ",
"char_491_humus": "ヒューマス",
"char_600_cpione": "",
"char_601_cguard": "",
"char_602_cdfend": "",
"char_603_csnipe": "",
"char_604_ccast": "",
"char_605_cmedic": "",
"char_606_csuppo": "",
"char_607_cspec": "",
"char_4004_pudd": "プリン",
"char_4041_chnut": "チェストナット",
"char_4062_totter": "トター",
@@ -339,7 +348,8 @@
"char_4067_lolxh": "羅小黒",
"char_4100_caper": "ケイパー",
"char_4107_vrdant": "ヴァーダント",
"char_4130_luton": "ルトナダ"
"char_4130_luton": "ルトナダ",
"char_4165_ctrail": ""
},
"5": {
"char_002_amiya": "アーミヤ",
@@ -440,6 +450,7 @@
"char_476_blkngt": "ブラックナイト",
"char_478_kirara": "キララ",
"char_486_takila": "テキーラ",
"char_487_bobb": "ボビング",
"char_488_buildr": "ポンシラス",
"char_489_serum": "コロセラム",
"char_492_quercu": "クエルクス",
@@ -476,6 +487,7 @@
"char_4043_erato": "エラト",
"char_4045_heidi": "ハイディ",
"char_4047_pianst": "ツェルニー",
"char_4052_surfer": "",
"char_4054_malist": "ミニマリスト",
"char_4066_highmo": "ハイモア",
"char_4071_peper": "パプリカ",
@@ -499,11 +511,21 @@
"char_4137_udflow": "アンダーフロー",
"char_4139_papyrs": "パピルス",
"char_4140_lasher": "サンドレコナー",
"char_4142_laios": "",
"char_4143_sensi": "",
"char_4144_chilc": "",
"char_4147_mitm": "",
"char_4151_tinman": ""
"char_4142_laios": "ライオス",
"char_4143_sensi": "センシ",
"char_4144_chilc": "チルチャック",
"char_4147_mitm": "ミトム",
"char_4148_philae": "",
"char_4151_tinman": "ブリキ",
"char_4155_talr": "",
"char_4162_cathy": "キャサリン",
"char_4163_rosesa": "",
"char_4164_tecno": "",
"char_4171_wulfen": "",
"char_4172_xingzh": "",
"char_4173_nowell": "",
"char_4177_brigid": "",
"char_4178_alanna": ""
},
"6": {
"char_003_kalts": "ケルシー",
@@ -551,15 +573,25 @@
"char_427_vigil": "ヴィジェル",
"char_430_fartth": "ファートゥース",
"char_437_mizuki": "ミヅキ",
"char_450_necras": "",
"char_456_ash": "Ash",
"char_472_pasngr": "パッセンジャー",
"char_474_glady": "グレイディーア",
"char_479_sleach": "サイラッハ",
"char_485_pallas": "パラス",
"char_608_acpion": "",
"char_609_acguad": "",
"char_610_acfend": "",
"char_611_acnipe": "",
"char_612_accast": "",
"char_613_acmedc": "",
"char_614_acsupo": "",
"char_615_acspec": "",
"char_1012_skadi2": "濁心スカジ",
"char_1013_chen2": "遊龍チェン",
"char_1014_nearl2": "耀騎士ニアール",
"char_1016_agoat2": "純燼エイヤフィヤトラ",
"char_1019_siege2": "ヴィーナ・ヴィクトリア",
"char_1020_reed2": "焔影リード",
"char_1023_ghost2": "帰溟スペクター",
"char_1026_gvial2": "百錬ガヴィル",
@@ -570,6 +602,10 @@
"char_1033_swire2": "琳琅スワイヤー",
"char_1034_jesca2": "滌火ジェシカ",
"char_1035_wisdel": "ウィシャデル",
"char_1038_whitw2": "",
"char_1039_thorn2": "",
"char_1040_blaze2": "",
"char_1502_crosly": "",
"char_2012_typhon": "ティフォン",
"char_2013_cerber": "ケオベ",
"char_2014_nian": "ニェン",
@@ -577,15 +613,18 @@
"char_2023_ling": "リィン",
"char_2024_chyue": "チョンユエ",
"char_2025_shu": "シュウ",
"char_2026_yu": "",
"char_4009_irene": "アイリーニ",
"char_4010_etlchi": "",
"char_4011_lessng": "レッシング",
"char_4026_vulpis": "",
"char_4027_heyak": "ホルハイヤ",
"char_4039_horn": "ホルン",
"char_4042_lumen": "ルーメン",
"char_4046_ebnhlz": "エーベンホルツ",
"char_4048_doroth": "ドロシー",
"char_4055_bgsnow": "パゼオンカ",
"char_4058_pepe": "ぺぺ",
"char_4058_pepe": "ペペ",
"char_4064_mlynar": "ムリナール",
"char_4065_judge": "ペナンス",
"char_4072_ironmn": "ステインレス",
@@ -602,9 +641,10 @@
"char_4133_logos": "ロゴス",
"char_4134_cetsyr": "シヴィライト・エテルナ",
"char_4138_narant": "ナラントゥヤ",
"char_4141_marcil": "",
"char_4141_marcil": "マルシル",
"char_4145_ulpia": "ウルピアヌス",
"char_4146_nymph": ""
"char_4146_nymph": "ニンフ",
"char_4179_monstr": ""
}
}
}

View File

@@ -328,10 +328,19 @@
"char_381_bubble": "버블",
"char_385_finlpp": "퓨어스트림",
"char_440_pinecn": "파인콘",
"char_445_wscoot": "",
"char_452_bstalk": "빈스토크",
"char_469_indigo": "인디고",
"char_484_robrta": "로베르타",
"char_491_humus": "휴머스",
"char_600_cpione": "",
"char_601_cguard": "",
"char_602_cdfend": "",
"char_603_csnipe": "",
"char_604_ccast": "",
"char_605_cmedic": "",
"char_606_csuppo": "",
"char_607_cspec": "",
"char_4004_pudd": "푸딩",
"char_4041_chnut": "체스트넛",
"char_4062_totter": "토터",
@@ -339,7 +348,8 @@
"char_4067_lolxh": "나소흑",
"char_4100_caper": "케이퍼",
"char_4107_vrdant": "버던트",
"char_4130_luton": "루토나다"
"char_4130_luton": "루토나다",
"char_4165_ctrail": ""
},
"5": {
"char_002_amiya": "아미야",
@@ -440,6 +450,7 @@
"char_476_blkngt": "블랙나이트",
"char_478_kirara": "키라라",
"char_486_takila": "테킬라",
"char_487_bobb": "보빙",
"char_488_buildr": "폰사이러스",
"char_489_serum": "코로세럼",
"char_492_quercu": "퀘르쿠스",
@@ -476,11 +487,12 @@
"char_4043_erato": "에라토",
"char_4045_heidi": "하이디",
"char_4047_pianst": "체르니",
"char_4052_surfer": "",
"char_4054_malist": "미니멀리스트",
"char_4066_highmo": "하이모어",
"char_4071_peper": "파프리카",
"char_4078_bdhkgt": "지에윈",
"char_4079_haini": "",
"char_4079_haini": "루실라",
"char_4081_warmy": "워미",
"char_4083_chimes": "윈드차임스",
"char_4102_threye": "발라크빈",
@@ -496,14 +508,24 @@
"char_4125_rdoc": "Doc",
"char_4126_fuze": "Fuze",
"char_4131_odda": "오다",
"char_4137_udflow": "",
"char_4139_papyrs": "",
"char_4140_lasher": "",
"char_4142_laios": "",
"char_4143_sensi": "",
"char_4144_chilc": "",
"char_4147_mitm": "",
"char_4151_tinman": ""
"char_4137_udflow": "언더플로우",
"char_4139_papyrs": "파피루스",
"char_4140_lasher": "샌드레코너",
"char_4142_laios": "라이오스",
"char_4143_sensi": "센시",
"char_4144_chilc": "칠책",
"char_4147_mitm": "미틈",
"char_4148_philae": "",
"char_4151_tinman": "틴맨",
"char_4155_talr": "",
"char_4162_cathy": "캐서린",
"char_4163_rosesa": "",
"char_4164_tecno": "",
"char_4171_wulfen": "",
"char_4172_xingzh": "",
"char_4173_nowell": "",
"char_4177_brigid": "",
"char_4178_alanna": ""
},
"6": {
"char_003_kalts": "켈시",
@@ -551,15 +573,25 @@
"char_427_vigil": "비질",
"char_430_fartth": "파투스",
"char_437_mizuki": "미즈키",
"char_450_necras": "",
"char_456_ash": "Ash",
"char_472_pasngr": "패신저",
"char_474_glady": "글래디아",
"char_479_sleach": "사일라흐",
"char_485_pallas": "팔라스",
"char_608_acpion": "",
"char_609_acguad": "",
"char_610_acfend": "",
"char_611_acnipe": "",
"char_612_accast": "",
"char_613_acmedc": "",
"char_614_acsupo": "",
"char_615_acspec": "",
"char_1012_skadi2": "스카디 더 커럽팅 하트",
"char_1013_chen2": "첸 더 홀룽데이",
"char_1014_nearl2": "니어 더 래디언트 나이트",
"char_1016_agoat2": "에이야퍄들라 더 크비트 아스카",
"char_1019_siege2": "비나 빅토리아",
"char_1020_reed2": "리드 더 플레임 섀도우",
"char_1023_ghost2": "스펙터 디 언체인드",
"char_1026_gvial2": "가비알 디 인빈서블",
@@ -570,6 +602,10 @@
"char_1033_swire2": "스와이어 디 엘리건트 위트",
"char_1034_jesca2": "제시카 더 리버레이티드",
"char_1035_wisdel": "위셔델",
"char_1038_whitw2": "",
"char_1039_thorn2": "",
"char_1040_blaze2": "",
"char_1502_crosly": "",
"char_2012_typhon": "티폰",
"char_2013_cerber": "케오베",
"char_2014_nian": "니엔",
@@ -577,8 +613,11 @@
"char_2023_ling": "링",
"char_2024_chyue": "총웨",
"char_2025_shu": "슈",
"char_2026_yu": "",
"char_4009_irene": "아이린",
"char_4010_etlchi": "",
"char_4011_lessng": "레싱",
"char_4026_vulpis": "",
"char_4027_heyak": "오올헤약",
"char_4039_horn": "혼",
"char_4042_lumen": "루멘",
@@ -601,10 +640,11 @@
"char_4132_ascln": "아스카론",
"char_4133_logos": "로고스",
"char_4134_cetsyr": "시빌라이트 에테르나",
"char_4138_narant": "",
"char_4141_marcil": "",
"char_4145_ulpia": "",
"char_4146_nymph": ""
"char_4138_narant": "나란투야",
"char_4141_marcil": "마르실",
"char_4145_ulpia": "울피아누스",
"char_4146_nymph": "님프",
"char_4179_monstr": ""
}
}
}

View File

@@ -328,10 +328,19 @@
"char_381_bubble": "泡泡",
"char_385_finlpp": "清流",
"char_440_pinecn": "松果",
"char_445_wscoot": "骋风",
"char_452_bstalk": "豆苗",
"char_469_indigo": "深靛",
"char_484_robrta": "罗比菈塔",
"char_491_humus": "休谟斯",
"char_600_cpione": "预备干员-先锋",
"char_601_cguard": "预备干员-近卫",
"char_602_cdfend": "预备干员-重装",
"char_603_csnipe": "预备干员-狙击",
"char_604_ccast": "预备干员-术师",
"char_605_cmedic": "预备干员-医疗",
"char_606_csuppo": "预备干员-辅助",
"char_607_cspec": "预备干员-特种",
"char_4004_pudd": "布丁",
"char_4041_chnut": "褐果",
"char_4062_totter": "铅踝",
@@ -339,7 +348,8 @@
"char_4067_lolxh": "罗小黑",
"char_4100_caper": "跃跃",
"char_4107_vrdant": "维荻",
"char_4130_luton": "露托"
"char_4130_luton": "露托",
"char_4165_ctrail": "云迹"
},
"5": {
"char_002_amiya": "阿米娅",
@@ -440,6 +450,7 @@
"char_476_blkngt": "夜半",
"char_478_kirara": "绮良",
"char_486_takila": "龙舌兰",
"char_487_bobb": "波卜",
"char_488_buildr": "青枳",
"char_489_serum": "蚀清",
"char_492_quercu": "夏栎",
@@ -476,6 +487,7 @@
"char_4043_erato": "埃拉托",
"char_4045_heidi": "海蒂",
"char_4047_pianst": "车尔尼",
"char_4052_surfer": "寻澜",
"char_4054_malist": "至简",
"char_4066_highmo": "海沫",
"char_4071_peper": "明椒",
@@ -503,7 +515,17 @@
"char_4143_sensi": "森西",
"char_4144_chilc": "齐尔查克",
"char_4147_mitm": "渡桥",
"char_4151_tinman": "锡人"
"char_4148_philae": "菲莱",
"char_4151_tinman": "锡人",
"char_4155_talr": "裁度",
"char_4162_cathy": "凯瑟琳",
"char_4163_rosesa": "瑰盐",
"char_4164_tecno": "特克诺",
"char_4171_wulfen": "钼铅",
"char_4172_xingzh": "行箸",
"char_4173_nowell": "诺威尔",
"char_4177_brigid": "水灯心",
"char_4178_alanna": "阿兰娜"
},
"6": {
"char_003_kalts": "凯尔希",
@@ -551,15 +573,25 @@
"char_427_vigil": "伺夜",
"char_430_fartth": "远牙",
"char_437_mizuki": "水月",
"char_450_necras": "死芒",
"char_456_ash": "灰烬",
"char_472_pasngr": "异客",
"char_474_glady": "歌蕾蒂娅",
"char_479_sleach": "琴柳",
"char_485_pallas": "帕拉斯",
"char_608_acpion": "郁金香",
"char_609_acguad": "Sharp",
"char_610_acfend": "Mechanist",
"char_611_acnipe": "Stormeye",
"char_612_accast": "Pith",
"char_613_acmedc": "Touch",
"char_614_acsupo": "Raidian",
"char_615_acspec": "Misery",
"char_1012_skadi2": "浊心斯卡蒂",
"char_1013_chen2": "假日威龙陈",
"char_1014_nearl2": "耀骑士临光",
"char_1016_agoat2": "纯烬艾雅法拉",
"char_1019_siege2": "维娜·维多利亚",
"char_1020_reed2": "焰影苇草",
"char_1023_ghost2": "归溟幽灵鲨",
"char_1026_gvial2": "百炼嘉维尔",
@@ -570,6 +602,10 @@
"char_1033_swire2": "琳琅诗怀雅",
"char_1034_jesca2": "涤火杰西卡",
"char_1035_wisdel": "维什戴尔",
"char_1038_whitw2": "荒芜拉普兰德",
"char_1039_thorn2": "引星棘刺",
"char_1040_blaze2": "烛煌",
"char_1502_crosly": "弑君者",
"char_2012_typhon": "提丰",
"char_2013_cerber": "刻俄柏",
"char_2014_nian": "年",
@@ -577,8 +613,11 @@
"char_2023_ling": "令",
"char_2024_chyue": "重岳",
"char_2025_shu": "黍",
"char_2026_yu": "余",
"char_4009_irene": "艾丽妮",
"char_4010_etlchi": "隐德来希",
"char_4011_lessng": "止颂",
"char_4026_vulpis": "忍冬",
"char_4027_heyak": "霍尔海雅",
"char_4039_horn": "号角",
"char_4042_lumen": "流明",
@@ -604,7 +643,8 @@
"char_4138_narant": "娜仁图亚",
"char_4141_marcil": "玛露西尔",
"char_4145_ulpia": "乌尔比安",
"char_4146_nymph": "妮芙"
"char_4146_nymph": "妮芙",
"char_4179_monstr": "Mon3tr"
}
}
}

View File

@@ -10,26 +10,21 @@ heroFullScreen: true
actions:
- text: 简体中文
link: ./zh-cn/
icon: signs-post
type: primary
- text: 繁體中文
link: ./zh-tw/
icon: signs-post
type: primary
- text: English
icon: lightbulb
link: ./en-us/
type: primary
- text: 日本語
link: ./ja-jp/
icon: signs-post
type: primary
- text: 한국어
link: ./ko-kr/
icon: signs-post
type: primary
---

View File

@@ -101,7 +101,7 @@ Visual Studio 起動後、Git 操作は「Git 変更」画面からコマンド
## Visual Studioでclang-formatを有効にする
1. clang-format バージョン17以上をインストールします。
1. clang-format バージョン20.1.0以上をインストールします。
```bash
python -m pip install clang-format

View File

@@ -408,6 +408,7 @@ binary = true # 是否安装 maa-cli 的二进制文件,默认为 true
# 资源热更新相关配置
[resource]
auto_update = true # 是否在每次运行任务时自动更新资源,默认为 false
warn_on_update_failure = true # 是否在更新失败时发出警告而不是直接报错
backend = "libgit2" # 资源热更新后端,可选值为 "git" 或者 "libgit2",默认为 "git"
# 资源热更新远程仓库相关配置

View File

@@ -116,8 +116,6 @@ maa install
- Nix
```bash
nix-env -iA nixpkgs.maa-assistant-arknights
```
Nix 上的 maa-cli 强制依赖 MaaCore。 因此Nix 用户无需,也不应该手动安装 MaaCore。
**注意**:只有使用包管理器安装 maa-cli 的用户才能使用包管理器安装 MaaCore否则请使用 `maa install` 命令安装。此外,`maa install` 通过下载官方预编译的 MaaCore而包管理器安装的 MaaCore 的编译选项和依赖版本与官方预编译的版本不同。这不会影响 maa-cli 的使用,但可能导致 MaaCore 的功能和性能有所不同。比如,包管理器安装的 MaaCore 使用较新版本的 `fastdeploy`,而官方预编译的 MaaCore 使用较旧版本的 `fastdeploy`。而在新版本的 `fastdeploy` 中,日志可以被隐藏,这可以消除了一些不必要的日志输出
**注意**:只有使用包管理器安装 maa-cli 的用户才能使用包管理器安装 MaaCore否则请使用 `maa install` 命令安装。此外,`maa install` 通过下载官方预编译的 MaaCore而包管理器安装的 MaaCore 可能使用的编译选项和依赖版本与官方预编译的版本不同,这可能导致性能和功能上存在略微差异

View File

@@ -63,7 +63,7 @@ Mac 版の開発は人手不足のため、更新速度が比較的遅いです
### ✅ [NOX](https://www.yeshen.com/)
サポートされています。現在、 Ma cの MAAX バージョンはエミュレータの自動適応をサポートしていないため、MAAの `設定` - `接続設定` で、 `adb``127.0.0.162001`を接続する必要があり、ポートはデフォルトの` 5555 `ではないことに注意し、エミュレータポートに関する詳細な説明は[一般的なエミュレータadbポート](../faq.md#一般的なAndroidエミュレータのadbポート)を参照してください。
サポートされています。
補足mac の NOX の adb バイナリファイルの場所は `/Applications/NoxAppPlayer.app/Contents/MacOS/adb` 、親ディレクトリ `MacOS` の下で `adb devices` コマンドを使用してadbポートを表示できます。

View File

@@ -230,11 +230,6 @@ MAAはWindows UAC管理者権限なしで、すべての機能を実行できる
UACを無効にしたシステムでは、「右クリックして管理者として実行を選択しなくても、管理者権限で起動される」という問題が報告されています。意図しない権限昇格を避けるために、UACを有効にすることをお勧めします。
## ダウンロード速度が遅い、ミラーサイトにアクセスできない
[MAA ダウンロードステーション](https://ota.maa.plus/MaaAssistantArknights/MaaRelease/releases/download/) を使ってダウンロードしてください。
我々の提供サーバーでは帯域幅が狭く、トラフィックも限られています。 githubや他のミラーサイトからダウンロードできる場合は、そちらを選択することをお勧めします。
## ダウンロードが中途半端になり "ログイン"/"認証 "のプロンプトが出る
- ファイルをダウンロードするには、ブラウザ/IDM/FDM やその他の通常のダウンローダーを使用してください。**Thunderを使うな**

View File

@@ -1,5 +1,6 @@
---
order: 3
icon: hugeicons:brain-02
---
# 刷理智
@@ -21,6 +22,7 @@ This page is outdated and maybe still in Simplified Chinese. Translation is need
- `吃源石` 只会在 `吃理智药` 之后判断,因为 MAA 只有在没有理智药时才会使用源石补充理智。所以在勾选 `吃源石` 之后MAA 会将 `吃理智药` 的次数锁定为 999确保将理智药吃光以避免跳过 `吃源石` 判断。
::: details 例子
| 吃理智药 | 吃源石 | 指定次数 | 指定材料 | 结果 |
| :------: | :----: | :------: | :------: | -------------------------------------------------------------------------------------------------------------------------------------- |
| | | | | 刷完现有理智即结束。 |
@@ -49,7 +51,7 @@ This page is outdated and maybe still in Simplified Chinese. Translation is need
- 所有芯片本。必须输入完整关卡编号,如 `PR-A-1`
- 剿灭作战。必须输入 `Annihilation`
- 别传中的 `OF-1` / `OF-F3` / `GT-5`
- 当期 SS 活动 后三关。在自动访问 [API](https://ota.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) 下载更新后会在界面下方显示。
- 当期 SS 活动 后三关。在自动访问 [API](https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) 下载更新后会在界面下方显示。
- 复刻的 SS 活动。输入 `SSReopen-<关卡前缀>` ,可一次性刷完 XX-1 ~ XX-9 关,如 `SSReopen-IC`
::: details 画面例
@@ -83,11 +85,21 @@ This page is outdated and maybe still in Simplified Chinese. Translation is need
- 若剩余理智仍然不足则会结束任务(如少于 6 理智)。
- 如果剩余理智选择关卡为未开放关卡,则刷理智任务出错。
### 连战次
### 連戦回
- MAA 目前仅会按照用户设定的次数进行连战,尚未支持自动识别最大连战次数
- 若设置的次数过多但理智不足MAA 会直接进行 `吃理智药``吃源石` 操作,并继续尝试连战。
- 若未设置 `吃理智药``吃源石`MAA 会直接认为理智不足,终止刷理智任务。若设置了 `剩余理智` MAA 会直接开始刷 `剩余理智` 关卡。
MAAは、ユーザーが設定した連続戦闘回数に応じて戦闘を行います
- **自動モード** (0):
- レベル内の最大連続戦闘回数を自動で判別し、最大連続戦闘回数を維持し、正気度オーバーフローが発生しないようにします。
- 完了後、「正気度残量確認」プロセスに入ります(設定されている場合)。
- **数値モード** (16):
- 設定された回数だけ連続戦闘を行います。
- 現在の正気度が設定回数を完了するのに足りない場合例えば、5回しか完了できないのに6回に設定している場合、タスクを終了し、「正気度残量確認」プロセスに入ります設定されている場合
- **無効モード** (-1):
- ゲーム内の連続戦闘回数を調整しません。
- 現在の正気度が設定回数を完了するのに足りない場合、タスクを終了し、「正気度残量確認」プロセスに入ります(設定されている場合)。
### 掉落识别

View File

@@ -1,5 +1,6 @@
---
order: 9
icon: ph:sword-bold
---
# 自动战斗

View File

@@ -1,5 +1,6 @@
---
order: 5
icon: solar:shop-2-bold
---
# 获取信用及购物

View File

@@ -1,5 +1,6 @@
---
order: 4
icon: material-symbols:view-quilt-rounded
---
# 基建换班
@@ -22,7 +23,7 @@ This page is outdated and maybe still in Simplified Chinese. Translation is need
- 不可识别并使用的例子:`迷迭香体系``红松骑士团`
-`无人机用途` 选择 `贸易站-龙门币` ,则会额外识别 `巫恋组` 并优先为其使用。
- 会客室仅缺一个线索时,会选择对应线索倾向的干员,其余情况选择通用干员。
- 会客室仅当自有线索满时才会送出线索,并且只送三个。如需自定义单次送线索个数可修改 MAA 文件夹下 `resource/tasks.json` 中的 `SelectClue` - `maxTimes` 字段。
- 会客室仅当自有线索满时才会送出线索,并且只送三个。如需自定义单次送线索个数可修改 MAA 文件夹下 `resource/tasks/tasks.json` 中的 `ClueSelected` - `maxTimes` 字段。
- 开启 `不将已进驻的干员放入宿舍` 设置项可避免 `艾丽妮``逻各斯` 等干员在训练室未训练时被进驻到宿舍,但同时也不会将加工站中心情不满的干员进驻宿舍。
- 控制中枢策略太过复杂,目前只考虑 `阿米娅``诗怀雅``凯尔希``彩虹小队` 及其他心情 +0.05 的干员,后续逐步优化。
- 可自行选择需要 MAA 处理的设施类别,默认全选。

View File

@@ -1,5 +1,6 @@
---
order: 7
icon: ri:game-fill
---
# 自动肉鸽

View File

@@ -18,7 +18,7 @@ icon: ic:baseline-article
- SoCの場合のみ、完全なステージ番号を入力する必要があります。例 `PR-A-1`
- `Annihilation`(殲滅作戦)。
- `OF-1` / `OF-F3` / `GT-5` のみサポートされます。
- 現在のSSイベントの最後の3つのステージ。 [API](https://ota.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) で更新が自動的にダウンロードされた後、メイン画面に対応するメッセージが表示されます。
- 現在のSSイベントの最後の3つのステージ。 [API](https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json) で更新が自動的にダウンロードされた後、メイン画面に対応するメッセージが表示されます。
- 再刻印SSアクティビティは `SSReopen-XX` と入力するとXX-1XX-9ステージを一度にクリアできます。 `SSReopen-IC` など。
::: details 画面例
@@ -79,13 +79,13 @@ icon: ic:baseline-article
- `ロスモンティス``レッドパイン騎士団(フレイムテイル/ファートゥース/ワイルドメイン/アッシュロック)` などの多くの施設間で連携する組合せは一時的にサポートできません。
- `ドローンの使用``貿易所-龍門幣` を選択した場合。 `シャマレの組合せ` があるかどうかを識別し、優先的に使用します。
- 応接室の手がかりが1つだけ欠けている場合は、該当するスキルのあるオペレーターが選ばれ、そうでない場合は一般オペレーターが選ばれます。
- 応接室は自分の手がかりが溢れた際、手がかり3つのみを譲り渡します。必要な場合、`resource/tasks.json``SelectClue` - `maxTimes` フィールドを変更して、譲渡する数をカスタマイズできます。
- 応接室は自分の手がかりが溢れた際、手がかり3つのみを譲り渡します。必要な場合、`resource/tasks/tasks.json``ClueSelected` - `maxTimes` フィールドを変更して、譲渡する数をカスタマイズできます。
- 訓練所を使用していない場合 `アイリーニ` などのオペレーターを宿舎に移動させたくない場合は、設定で `作業中のオペレーターを宿舎に移動しない` にチェックしてください。 ただし、この場合、疲労が蓄積していないオペレータも宿舎に入れなくなる可能性があります。
- 制御中枢のストラテジーが複雑すぎるため。現在では `アーミヤ` `スワイヤー` `ケルシー` `レインボー小隊` および体力値が+0.05のスキルのオペレーターのみが考慮されており、今後徐々に最適化される予定です。
### カスタム基地設定(テスト中)
- [Yituliu](https://ark.yituliu.cn/)のエキスパートが、基地シフトをドキュメントでエクスポートできる[ジェネレーター](https://ark.yituliu.cn/tools/schedule)の作成に協力しました。[ドキュメント](../プロトコルドキュメント/基地シフトAPI.md)を参照して使用できます。
- [Yituliu](https://ark.yituliu.cn/)のエキスパートが、基地シフトをドキュメントでエクスポートできる[ジェネレーター](https://ark.yituliu.cn/tools/schedule)の作成に協力しました。[ドキュメント](../../protocol/base-scheduling-schema.md)を参照して使用できます。
- `/resource/custom_infrast/`のフォルダに、非常に効率的なタスクのセットがいくつか組み込まれており、参考として使用することができます。(昇進2の該当オペレーターがいれば、直接使用可能です。)
### FPと購買部
@@ -149,7 +149,7 @@ icon: ic:baseline-article
#### 攻略ファイルの作成
- [ジョブエディター](https://prts.plus/create)を使用して作成してください、[自動戦闘API](../プロトコルドキュメント/自動戦闘API.md)を参照してください。
- [ジョブエディター](https://prts.plus/create)を使用して作成してください、[自動戦闘API](../../protocol/copilot-schema.md)を参照してください。
- マップ座標の取得:
- ジョブエディターでステージ名を入力すると、ドラッグ可能な座標マップが左下隅に自動的にロードされ、クリックして現在のオペレーターの位置を設定できます。
- ステージ名を入力して JSON をエクスポートすると、直接行動開始され、座標情報で覆われたマップのスクリーンショットが MAA ディレクトリの `debug\map` ディレクトリに生成されます。
@@ -175,7 +175,7 @@ Windows MAAには `設定` タブの他に `タスク設定` もあります。
#### adbパスの取得
- [エミュレータの組み込みadb](./よくある質問.md#adbと接続アドレスが正しいことを確認する) を使用するか、 [adb](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) を自分でダウンロードして解凍します。
- [エミュレータの組み込みadb](../../manual/faq.md#adbと接続アドレスが正しいことを確認する) を使用するか、 [adb](https://dl.google.com/android/repository/platform-tools-latest-windows.zip) を自分でダウンロードして解凍します。
- ソフトウェアの `設定` - `接続設定` に進み、`adb.exe`のファイルパスを選択し、adbアドレスIP +ポートを入力する必要があります。例:`127.0.0.1:5555`)を記入し、エミュレータのタイプを選択します。
#### ポート番号の取得
@@ -213,7 +213,7 @@ Windows MAAには `設定` タブの他に `タスク設定` もあります。
### マルチインスタンスでのエミュレータの自動起動
- 複数のエミュレータを同時に操作する必要がある場合は、MAAフォルダを複製し、**別のMAA**、**同じadb.exe**、**異なる接続アドレス**を使用して接続します。
- **[BlueStacks International Version](./エミュレータのサポート/Windowsでのエミューレータ.md#✅-Bluestacks-5おすすめ👍)を例にして**、2つのマルチインスタンスでのエミュレータ起動方法を紹介します。
- **[BlueStacks International Version](../../manual/device/windows.md#-完全サポート)を例にして**、2つのマルチインスタンスでのエミュレータ起動方法を紹介します。
#### エミュレータexeにコマンドを付加することによるマルチインスタンスを実行する方法

View File

@@ -1,5 +1,6 @@
---
order: 11
icon: icon-park-solid:other
---
# 其他

View File

@@ -1,5 +1,6 @@
---
order: 8
icon: solar:streets-map-point-linear
---
# 生息演算

View File

@@ -1,5 +1,6 @@
---
order: 2
icon: fluent:people-24-filled
---
# 公开招募

View File

@@ -1,5 +1,6 @@
---
order: 6
icon: lucide:gift
---
# 领取奖励

View File

@@ -1,5 +1,6 @@
---
order: 1
icon: ic:round-rocket-launch
---
# 开始唤醒

View File

@@ -1,5 +1,6 @@
---
order: 10
icon: octicon:tools-16
---
# ツールボックス

View File

@@ -86,6 +86,7 @@ JSONファイルはコメントをサポートしていません。テキスト
1. 既存のグループの紹介
ファントムテーマを例に取ると:主にオペレーターを以下のように分類しています
| グループ | 主な考慮事項 | 主に職種を含む | オペレーターの例 |
| :--- | :--- | :--- | :--- |
| **_地面阻挡_** | 場に立つことと雑魚を清掃 | 重装、前衛 | 庇護衛士、基石、ラ・プルマ、マウンテン、M3、リィンとシーンの召喚ユニット、スポット、重装予備隊員 |
@@ -100,6 +101,7 @@ JSONファイルはコメントをサポートしていません。テキスト
2. 特別な操作が必要なグループ
上記のような一般的なグループ以外に、時折、特定のオペレーターやオペレーターの種類に対して細かいカスタマイズが必要な場合があります。例えば
| グループ | 含まれるオペレーター | 主な特徴 |
| :--- | :--- | :--- |
| 棘刺 | ソーンズ、ホルン | 地上遠隔攻撃、特定の位置に非常に適したマップがあります |

View File

@@ -84,8 +84,11 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p
"medicine": int, // 理性回復剤の最大使用数、オプション、デフォルトは 0
"expiring_medicine": int, // 48 時間以内に期限切れになった理性回復剤の最大使用数、オプション、デフォルトは 0
"stone": int, // 純正源石の最大使用数、オプション、デフォルトは 0
"times": int, // 最大周回数、オプション、デフォルトは無限
"times": int, // 最戦闘回数、オプション、デフォルトは無限
"series": int, // 連戦回数、オプション、1~6
// -1 シリーズの切り替えを無効にするには
// 0 現在利用可能なシリーズ数の最大数に自動的に切り替えるには、現在のサニティが6回未満の場合は、利用可能な最小回数を選択します.
// 1~6 指定した回数に変更するには
"drops": { // ドロップ数の指定、オプション、デフォルトは指定なし
"30011": int, // Key: item_ID; value: 素材の数。Keyは resource/item_index.json に記載されています
"30062": int // OR 組み合わせ
@@ -156,6 +159,7 @@ TaskId ASSTAPI AsstAppendTask(AsstHandle handle, const char* type, const char* p
"mode": int, // シフトモード、オプション、デフォルトは 0。
// 0 - デフォルトのシフト モード、単一施設の最適解
// 10000 - シフト変更モードをカスタマイズし、ユーザー構成を読み取り、プロトコルドキュメント/インフラストシフト.md を参照してください
// 20000 - ローテーション: ワンキーローテーションモード。コントロールセンター、発電所、寮、オフィスをスキップします。他の施設はシフトを変更しませんが、基本的な操作は保持されます (ドローンの使用、応接室のロジックなど)
"facility": [ // シフト対象施設(順序付け)、必須。動作中の編集はサポートされていません.
string, // 施設名: "Mfg" | "Trade" | "Power" | "Control" | "Reception" | "Office" | "Dorm"
...

View File

@@ -5,7 +5,7 @@ icon: material-symbols:task
# タスク フロー プロトコル
`resource/tasks.json` の使用方法と各フィールドの説明
`resource/tasks` の使用方法と各フィールドの説明
::: tip
JSONファイルはコメントをサポートしていません。テキスト内のコメントはプレゼンテーション用にのみ使用されます。直接コピーして使用しないでください。
@@ -104,7 +104,7 @@ JSONファイルはコメントをサポートしていません。テキスト
// その場合、 "maskRange" を [ 1, 255 ] に設定して、マッチング時に黒く塗りつぶされた部分を瞬時に無視できます。
"colorScales": [ // method が HSVCount または RGBCount の場合に有効で必須、色マスク範囲。
[ // list<array<array<int, 3>, 2> | array<int, 2>>
[ // list<array<array<int, 3>, 2>> / list<array<int, 2>>
[23, 150, 40], // 構造は [[lower1, upper1], [lower2, upper2], ...]
[25, 230, 150] // 内側が int の場合はグレースケール、
], //   array<int, 3> の場合は三チャネルの色で、method によって RGB または HSV かが決まります;
@@ -140,12 +140,28 @@ JSONファイルはコメントをサポートしていません。テキスト
"isAscii": false, // オプション、認識されるテキストコンテンツが ASCII 文字であるかどうか
// 指定されていない場合、デフォルトはfalse
"withoutDet": false // オプション、検出モデルを使用しない場合
"withoutDet": false, // オプション、検出モデルを使用しない場合
// 指定されていない場合、デフォルトは false
/* algorithmHash */
// アルゴリズムが未熟であり、特殊な場合にのみ使用されるため、現時点では推奨されていません
// Todo
/* FeatureMatch */
"template": "xxx.png", // オプション。マッチングする画像ファイル名。文字列または文字列リストを指定できます。
// デフォルトは "taskname.png"
"count": 4, // マッチングする特徴点の数(閾値)。デフォルト値は 4
"ratio": 0.6, // KNN マッチングアルゴリズムの距離比。[0 - 1.0]。比率が大きいほどマッチングが緩くなり、接続されやすくなります。デフォルトは 0.6
"detector": "SIFT", // 特徴点検出の種類。オプションの値は SIFT、ORB、AKAZE、SURF。デフォルト値は SIFT
// SIFT: 計算量が多い、スケール不変性、回転不変性。最も効果的。
// ORB: 計算速度が非常に速い、回転不変性。ただし、スケール不変性は保証されません。
// BRISK: 非常に高速な計算速度、スケール不変性、回転不変性を備えています。
// KAZE: 2Dおよび3D画像に適用可能、スケール不変性、回転不変性を備えています。
// AKAZE: 高速な計算速度、スケール不変性、回転不変性を備えています。
}
}
```

View File

@@ -88,7 +88,7 @@ MAA はコマンドラインインタフェースCLI操作をサポート
- 新しいFramework: [MaaFramework](https://github.com/MaaAssistantArknights/MaaFramework)
- [作業シェアサイト](https://prts.plus)[フロントエンド](https://github.com/MaaAssistantArknights/maa-copilot-frontend)
- バックエンド:[MaaBackendCenter](https://github.com/MaaAssistantArknights/MaaBackendCenter)
- [公式ウェブサイト](https://www.maa.plus): [フロントエンド](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/website)
- [公式ウェブサイト](https://maa.plus): [フロントエンド](https://github.com/MaaAssistantArknights/MaaAssistantArknights/tree/dev/website)
- Deep Learning: [MaaAI](https://github.com/MaaAssistantArknights/MaaAI)
### 多言語 (i18n)
@@ -183,7 +183,7 @@ MAAをより良くするために開発・テストに貢献してくれたす
## 免責事項
- 本ソフトウェアは [GNU Affero General Public License v3.0 only](https://spdx.org/licenses/AGPL-3.0-only.html) オープンソースライセンスを使用しています。
- 本ソフトウェアは [GNU Affero General Public License v3.0 only](https://spdx.org/licenses/AGPL-3.0-only.html) オープンソースライセンスを使用しています、また追加の [ユーザー規約](https://github.com/MaaAssistantArknights/MaaAssistantArknights/blob/dev/terms-of-service.md) が付属しています
- 本ソフトウェアのロゴはAGPL 3.0ライセンスを使用しており、オープンソースではなく、[耗毛](https://weibo.com/u/3251357314)とVie、2人のアーティストと開発者がすべての権利を留保しています。「AGPL 3.0ライセンスに基づいて許可されている」という理由で、許可がない場合に本ソフトウェアのロゴを無断で使用することは禁止しております。また、許可なく商業目的で本ソフトウェアのロゴを無断で使用することも禁止しております。
- 本ソフトウェアはオープンソースで無料であり、学習と研究のみの目的としています。販売者が本ソフトウェアの料金を請求する場合は、デバイスや時間の料金である可能性があります。発生した問題と結果は、本ソフトウェアとは一切関係ありません。
@@ -193,7 +193,7 @@ MAAをより良くするために開発・テストに貢献してくれたす
## 広告
ユーザー研究グループQQグループ[QQグループ](https://ota.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
ユーザー研究グループQQグループ[QQグループ](https://api.maa.plus/MaaAssistantArknights/api/qqgroup/index.html)
Discord サーバー: [Discord 招待リンク](https://discord.gg/23DfZ9uA4V)
ユーザー研究グループTGグループ[Telegram](https://t.me/+Mgc2Zngr-hs3ZjU1)
自動作戦JSON作業シェア[prts.plus](https://prts.plus)

View File

@@ -128,7 +128,7 @@ MAA는 리포지토리의 코드 및 리소스 파일들을 아름답고 일관
## Visual Studio에서 clang-format 사용 설정
1. clang-format 17 또는 그 이상 버전을 설치합니다.
1. clang-format 20.1.0 또는 그 이상 버전을 설치합니다.
```bash
python -m pip install clang-format

View File

@@ -401,6 +401,7 @@ binary = true # maa-cli 바이너리 파일을 설치할지 여부, 기본값은
# 리소스 핫 업데이트 관련 설정
[resource]
auto_update = true # 각 작업 실행 시 리소스를 자동 업데이트할지 여부, 기본값은 false
warn_on_update_failure = true # 업데이트 실패 시 오류를 바로 보고하지 않고 경고를 발행할지 여부
backend = "libgit2" # 리소스 핫 업데이트 백엔드, 가능한 값은 "git" 또는 "libgit2", 기본값은 "git"
[resource.remote]

View File

@@ -112,8 +112,6 @@ maa install
- Nix
```bash
nix-env -iA nixpkgs.maa-assistant-arknights
```
Nix의 maa-cli는 MaaCore에 대한 필수 종속성이 있습니다. 따라서 Nix 사용자는 MaaCore를 수동으로 설치할 필요가 없으며, 설치해서도 안 됩니다.
**주의**: 패키지 관리자를 통해 maa-cli를 설치한 경우에만 패키지 관리자를 통해 MaaCore를 설치할 수 있습니다. 그렇지 않으면 `maa install` 명령어를 사용해야 합니다. 또한, `maa install` 명령어는 공식적으로 사전 컴파일된 MaaCore를 다운로드합니다. 패키지 관리자를 통해 설치된 MaaCore는 컴파일 옵션과 종속성 버전이 공식 사전 컴파일 버전과 다를 수 있습니다. 이는 maa-cli의 사용에 영향을 미치지 않지만, MaaCore의 기능과 성능에 차이가 있을 수 있습니다. 예를 들어, 패키지 관리자를 통해 설치된 MaaCore는 최신 버전의 `fastdeploy`를 사용하고, 공식 사전 컴파일된 MaaCore는 구버전의 `fastdeploy`를 사용합니다. 최신 버전의 `fastdeploy`에서는 로그를 숨길 수 있어 불필요한 로그 출력을 줄일 수 있습니다.
**주의**: 패키지 관리자를 통해 maa-cli를 설치한 경우에만 패키지 관리자를 통해 MaaCore를 설치할 수 있습니다. 그렇지 않으면 `maa install` 명령어를 사용해야 합니다. 또한, `maa install` 명령어는 공식적으로 사전 컴파일된 MaaCore를 다운로드합니다. 패키지 관리자를 통해 설치된 MaaCore는 컴파일 옵션과 종속성 버전이 공식 사전 컴파일 버전과 다를 수 있습니다. 이는 maa-cli의 사용에 영향을 미치지 않지만, MaaCore의 기능과 성능에 차이가 있을 수 있습니다.

View File

@@ -63,7 +63,7 @@ Mac 버전 개발에 인력이 부족하여 업데이트 속도가 비교적 느
### ✅ [녹스 에뮬레이터](https://www.yeshen.com/)
완벽하게 지원됩니다. 현재 Mac의 MAAX 버전은 에뮬레이터 자동 감지 기능을 지원하지 않으므로 MAA 설정 - 연결 설정에서 adb를 사용하여 127.0.0.1:62001에 연결해야 합니다. 포트가 기본 5555가 아니라는 점에 유의하세요. 에뮬레이터 포트에 대한 자세한 설명은 [에뮬레이터 포트](../faq.md#adb-및-연결-주소-확인)를 참조하세요.
완벽하게 지원됩니다.
추가로, macOS에서 녹스 에뮬레이터의 adb 이진 파일의 위치는 `/Applications/NoxAppPlayer.app/Contents/MacOS/adb`이며 부모 디렉토리 `MacOS`에서 `adb devices` 명령을 사용하여 adb 포트를 확인할 수 있습니다.

View File

@@ -230,12 +230,6 @@ MAA는 Windows UAC 관리자 권한 없이 모든 기능을 실행할 수 있어
UAC가 비활성화된 시스템에서는 "우클릭하여 관리자 권한으로 실행을 선택하지 않아도 관리자 권한으로 실행되는" 문제가 발생할 수 있다는 보고가 있습니다. 예상치 못한 권한 상승을 방지하기 위해 UAC를 활성화하는 것이 좋습니다.
## 파일 다운로드 속도가 느립니다
[MAA 다운로드 사이트](https://ota.maa.plus/MaaAssistantArknights/MaaRelease/releases/download/)에서 다운로드 하세요.
우리의 서버는 대역폭이 낮고 트래픽이 제한됩니다. 사용하기 위해 만들어졌지만 너무 남용하지 마세요. GitHub 또는 다른 미러 사이트에서 정상적으로 다운로드할 수 있는 경우 거기에서 먼저 시도해보세요.
## 중간에 다운로드 중 "로그인"/"인증" 메시지가 표시됩니다
브라우저 / IDM / FDM 등의 다운로드 관리자를 사용하여 파일을 다운로드하세요. **위쳐를 사용하지 마세요!**

View File

@@ -1,5 +1,6 @@
---
order: 3
icon: hugeicons:brain-02
---
# 이성 사용 (Combat)
@@ -17,6 +18,7 @@ order: 3
- `순오리지늄``이성 회복제` 이후에만 판단하므로 MAA는 이성 회복제가 없는 경우에만 이성을 보충합니다. 그래서 `순오리지늄`을 선택한 경우, `이성 회복제`의 사용 횟수를 보유하고 있는 `이성 회복제`보다 더 많이 설정해야 합니다!
::: details 예시
| 이성 회복제 | 순오리지늄 | 횟수 제한 | 드롭 제한 | 결과 |
| :---------: | :--------: | :-------: | :-------: | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| | | | | 보유한 이성을 소모하고 정지합니다. |
@@ -45,7 +47,7 @@ order: 3
- 모든 칩 스테이지. 완전한 스테이지 코드를 입력해야 합니다. 예: `PR-A-1`.
- 섬멸 작전. `Annihilation`을 입력해야 합니다.
- 상시 개방 이벤트의 경우 `OF-1`/`OF-F3`/`GT-5`와 같이 입력합니다.
- 현재 개방된 사이드 스토리 이벤트의 세 개의 스테이지입니다. [API](https://ota.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json)에서 업데이트를 자동으로 다운로드 한 후 화면 하단에 표시됩니다.
- 현재 개방된 사이드 스토리 이벤트의 세 개의 스테이지입니다. [API](https://api.maa.plus/MaaAssistantArknights/api/gui/StageActivity.json)에서 업데이트를 자동으로 다운로드 한 후 화면 하단에 표시됩니다.
- 재개방된 사이드 스토리 이벤트. `SSReopen-<스테이지 접두사>`를 입력하면 XX-1~XX-9 스테이지를 한 번에 완료할 수 있습니다. 예: `SSReopen-IC`.
::: details 예시 화면
@@ -81,9 +83,19 @@ order: 3
### 연속 전투 횟수
- 현재 MAA는 사용자가 설정한 횟수만큼 연속 전투를 진행하며, 최대 연속 전투 횟수를 자동으로 인식하는 기능은 아직 지원되지 않습니다.
- 설정된 횟수가 많지만 이성이 부족한 경우, MAA는 직접적으로 `이성 회복제 사용` 또는 `순오리지늄 사용`을 수행하고 계속해서 연속 전투를 시도합니다.
- 만약 `이성 회복제 사용` 또는 `순오리지늄 사용`이 설정되어 있지 않은 경우, MAA는 이성이 부족하다고 판단하고 이성 사용을 종료합니다. 만약 `남은 이성`이 설정되어 있다면, MAA는 바로 `남은 이성` 스테이지를 시작합니다.
MAA는 사용자가 설정한 연속 전투 횟수에 따라 전투를 진행합니다.
- **자동 모드** (0):
- 레벨 내 최대 연속 전투 횟수를 자동으로 파악하고, 최대 연속 전투 횟수를 유지하며, 정신력을 초과하지 않습니다.
- 완료 후 `잔여 정신력` 프로세스 시작(설정된 경우)
- **숫자 모드** (1~6):
- 설정된 횟수에 따라 연속 전투를 진행합니다.
- 현재 정신력이 설정된 횟수를 완료하기에 충분하지 않은 경우(예: 5회만 가능하지만 6회로 설정된 경우), 작업을 바로 종료하고 `잔여 정신력` 프로세스(설정된 경우)를 시작합니다.
- **비활성 모드** (-1):
- 게임 내 연속 전투 횟수를 조정하지 않습니다.
- 정신력이 현재 설정된 횟수를 완료하기에 충분하지 않은 경우 작업을 바로 종료하고 `잔여 정신력` 프로세스(설정된 경우)를 시작합니다.
### 드롭 인식

View File

@@ -1,5 +1,6 @@
---
order: 9
icon: ph:sword-bold
---
# Copilot (자동 전투)

View File

@@ -1,5 +1,6 @@
---
order: 5
icon: solar:shop-2-bold
---
# 크레딧 상점

View File

@@ -1,5 +1,6 @@
---
order: 4
icon: material-symbols:view-quilt-rounded
---
# 기반시설
@@ -17,7 +18,7 @@ order: 4
- 만약 다중 시설간 조합을 원할 경우, `커스텀 기반시설`을 이용하세요.
- `드론 사용처``무역소-용문폐`로 지정되어 있을 경우, `샤마르`를 인식하고 드론을 아껴둘 것입니다.
- 응접실에서 단 한 종류의 단서가 부족하다면 해당 진영의 오퍼레이터가 선택됩니다. 그렇지 않은 경우 일반적인 오퍼레이터가 선택됩니다.
- 응접실이 꽉 차 있을 때만 단서를 내보낼 것입니다. 최대 3개의 단서가 전달됩니다. `resource/tasks.json`에서 `SelectClue`-`maxTimes` 필드를 수정해 단서의 전달 개수를 조절할 수 있습니다.
- 응접실이 꽉 차 있을 때만 단서를 내보낼 것입니다. 최대 3개의 단서가 전달됩니다. `resource/tasks/tasks.json`에서 `ClueSelected`-`maxTimes` 필드를 수정해 단서의 전달 개수를 조절할 수 있습니다.
- `아이린`이나 다른 오퍼레이터가 당장 업무 중이 아니라는 이유로 숙소로 보내지는 것을 원치 않는다면, `이미 배치된 오퍼레이터를 숙소에 넣지 않기` 옵션을 활성화할 수 있습니다. 단, 컨디션이 0이 아닌 한 어떤 오퍼레이터도 숙소로 들어오지 못하게 되는 문제를 불러올 수도 있습니다.
- 제어 센터의 복잡성으로 인해서, `아미야`, `스와이어`, `켈시`, `레인보우 팀`과 기타 시간당 컨디션 +0.05 오퍼레이터만이 고려됩니다. 향후 개선될 예정입니다.
- 몇몇 이격 오퍼레이터로 인한 충돌이 발생할 수 있습니다. UI에 오퍼레이터 충돌 경고가 있는지 확인하시고, 경고가 있다면 기반시설의 상태를 수동으로 확인하여 적절하게 배치해 주세요. (예시: 특정 시설이 완전히 비어 있을 수 있음)

Some files were not shown because too many files have changed in this diff Show More