diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d0052b4d20..6c033b28cb 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -28,7 +28,9 @@ ### 检查清单 - [ ] 我已经进行了充足的测试,且现有的测试都已通过 -- [ ] 如果此次PR中添加了新的武将/新的语音文件,则我已在`character/rank.js`中添加对应的武将强度评级/在`lib.translate`中加入语音文件的文字台词 +- [ ] 我没有把该PR提交到`master`分支 +- [ ] 如果此次PR中添加了新的武将,则我已在`character/rank.js`中添加对应的武将强度评级,并对双人武将/复姓武将添加`name:xxx`的参数 +- [ ] 如果此次PR中添加了新的语音文件,则我已在`lib.translate`中加入语音文件的文字台词 - [ ] 如果此次PR涉及到新功能的添加,我已在`PR描述`中写入详细文档 - [ ] 如果此次PR需要扩展跟进,我已在`扩展适配`中写入详细文档 - [ ] 如果这个PR解决了一个issue,我在`诱因和背景`中明确链接到该issue diff --git a/.gitignore b/.gitignore index c8875aef3e..21f89d74a8 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ package-lock.json package.json Thumbs.db bun.lockb +deno.lock diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000..5c8d3d46af --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM node:18 + +WORKDIR /app + +COPY ./docker/* ./ + +RUN npm install body-parser express minimist + +COPY . . + +EXPOSE 8080 +EXPOSE 8089 + +CMD [ "sh","./start.sh" ] \ No newline at end of file diff --git a/README.md b/README.md index e63f9a8742..8d22174bf7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -noname-server.exe的源码见以下仓库: +noname-server.exe 的源码见以下仓库: https://github.com/nonameShijian/noname-server @@ -6,15 +6,14 @@ https://github.com/nonameShijian/noname-server 贡献代码可阅读相关文档: -[Git下载安装指南](https://github.com/libccy/noname/wiki/Git%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97) +[Git 下载安装指南](https://github.com/libccy/noname/wiki/Git%E4%B8%8B%E8%BD%BD%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97) -[Github桌面版客户端使用入门](https://docs.github.com/zh/desktop/overview/getting-started-with-github-desktop) +[Github 桌面版客户端使用入门](https://docs.github.com/zh/desktop/overview/getting-started-with-github-desktop) -[如何提交代码到《无名杀》Github仓库](https://github.com/libccy/noname/wiki/%E5%A6%82%E4%BD%95%E6%8F%90%E4%BA%A4%E4%BB%A3%E7%A0%81%E5%88%B0%E3%80%8A%E6%97%A0%E5%90%8D%E6%9D%80%E3%80%8BGithub%E4%BB%93%E5%BA%93) +[如何提交代码到《无名杀》Github 仓库](https://github.com/libccy/noname/wiki/%E5%A6%82%E4%BD%95%E6%8F%90%E4%BA%A4%E4%BB%A3%E7%A0%81%E5%88%B0%E3%80%8A%E6%97%A0%E5%90%8D%E6%9D%80%E3%80%8BGithub%E4%BB%93%E5%BA%93) [《无名杀》项目 Pull Request 提交规范](https://github.com/libccy/noname/wiki/%E3%80%8A%E6%97%A0%E5%90%8D%E6%9D%80%E3%80%8B%E9%A1%B9%E7%9B%AE-Pull-Request-%E6%8F%90%E4%BA%A4%E8%A7%84%E8%8C%83) - 在线试玩: https://spmario233.github.io/noname/index.html (图片素材加载速度较慢,不推荐) @@ -23,19 +22,21 @@ https://spmario233.github.io/noname/index.html (图片素材加载速度较慢 GitHub: https://github.com/libccy/noname/releases/tag/chromium85-client -网页端推荐使用Chrome系内核浏览器游玩,不推荐使用低版本Firefox浏览器 +docker: [docker.md](./docker/docker.md) + +网页端推荐使用 Chrome 系内核浏览器游玩,不推荐使用低版本 Firefox 浏览器 -请尽量保证游玩的Chrome系浏览器或手机Webview的`内核版本大于等于77` +请尽量保证游玩的 Chrome 系浏览器或手机 Webview 的`内核版本大于等于77` -提交Pull Request时请推送到"PR-Branch"分支! +提交 Pull Request 时请推送到"PR-Branch"分支! --- -最近有一伙人号称是《无名杀十周年》的开发团队,宣称《无名杀十周年》“全新无名杀,比旧版拥有更多武将,兼容更多扩展”,实际上: +最近有一伙人号称是《无名杀十周年》的开发团队,宣称《无名杀十周年》“全新无名杀,比旧版拥有更多武将,兼容更多扩展”,实际上: -- 《无名杀十周年》(原《无名杀清瑶版》)由无名杀v1.9.124修改而来,属于无名杀的一种**Fork**,并非“全新无名杀”;且《无名杀十周年》开发团队**公然违反GPL-3.0协议**,详情请看[这里](https://github.com/github/dmca/blob/master/2023/09/2023-09-20-noname.md)、[这里](https://tieba.baidu.com/p/8623890806)以及[这里](https://tieba.baidu.com/p/8624582238)。 +- 《无名杀十周年》(原《无名杀清瑶版》)由无名杀 v1.9.124 修改而来,属于无名杀的一种**Fork**,并非“全新无名杀”;且《无名杀十周年》开发团队**公然违反 GPL-3.0 协议**,详情请看[这里](https://github.com/github/dmca/blob/master/2023/09/2023-09-20-noname.md)、[这里](https://tieba.baidu.com/p/8623890806)以及[这里](https://tieba.baidu.com/p/8624582238)。 - 《无名杀十周年》至今没有更新神典韦等新机制武将,且删除了部分无名杀的原创武将,导致《无名杀十周年》的武将数量远远不及无名杀前几个版本的武将数量;不仅如此,《无名杀十周年》自分裂后的部分武将源码依然来自无名杀和其他开发者开源的代码。 -- 《无名杀十周年》兼容扩展的方式是不更新本体数据,从而导致《无名杀十周年》仍然在用1.9.124版本的代码,无法兼容使用1.10以后功能的扩展;而且《无名杀十周年》开发团队在使用**大量**GPL-3.0开源的代码后对生成产物进行了**混淆加密**,在**违反开源精神**的同时,也导致扩展稳定性极具下降,更容易出问题。 +- 《无名杀十周年》兼容扩展的方式是不更新本体数据,从而导致《无名杀十周年》仍然在用 1.9.124 版本的代码,无法兼容使用 1.10 以后功能的扩展;而且《无名杀十周年》开发团队在使用**大量**GPL-3.0 开源的代码后对生成产物进行了**混淆加密**,在**违反开源精神**的同时,也导致扩展稳定性极具下降,更容易出问题。 《无名杀十周年》就是彻头彻尾的骗局,《无名杀十周年》的开发团队更是一群拿无名杀吸血的骗子,虽然号称“不忘初心”,却公然对最有资格论述无名杀创作初心的无名杀创始人进行侮辱谩骂,直接违背其制定的规则和开源精神,恶劣程度远超当初在多个无名杀社群“自立”的水叶之流。 diff --git a/audio/die/dc_sb_jiaxu.mp3 b/audio/die/dc_sb_jiaxu.mp3 new file mode 100644 index 0000000000..4f42cf4a25 Binary files /dev/null and b/audio/die/dc_sb_jiaxu.mp3 differ diff --git a/audio/die/dc_sb_jiaxu_shadow.mp3 b/audio/die/dc_sb_jiaxu_shadow.mp3 new file mode 100644 index 0000000000..cbd6458e76 Binary files /dev/null and b/audio/die/dc_sb_jiaxu_shadow.mp3 differ diff --git a/audio/die/dc_sb_zhangxiu.mp3 b/audio/die/dc_sb_zhangxiu.mp3 new file mode 100644 index 0000000000..d1c8ce74f9 Binary files /dev/null and b/audio/die/dc_sb_zhangxiu.mp3 differ diff --git a/audio/die/feiyao.mp3 b/audio/die/feiyao.mp3 new file mode 100644 index 0000000000..b4fc3356dc Binary files /dev/null and b/audio/die/feiyao.mp3 differ diff --git a/audio/die/gz_xusheng.mp3 b/audio/die/gz_xusheng.mp3 new file mode 100644 index 0000000000..f8dfc96400 Binary files /dev/null and b/audio/die/gz_xusheng.mp3 differ diff --git a/audio/die/huan_zhanghe.mp3 b/audio/die/huan_zhanghe.mp3 new file mode 100644 index 0000000000..7bb67d1bc9 Binary files /dev/null and b/audio/die/huan_zhanghe.mp3 differ diff --git a/audio/die/huan_zhaoyun.mp3 b/audio/die/huan_zhaoyun.mp3 new file mode 100644 index 0000000000..acd716a1de Binary files /dev/null and b/audio/die/huan_zhaoyun.mp3 differ diff --git a/audio/die/huan_zhugeliang.mp3 b/audio/die/huan_zhugeliang.mp3 new file mode 100644 index 0000000000..4ca351fbd8 Binary files /dev/null and b/audio/die/huan_zhugeliang.mp3 differ diff --git a/audio/die/huan_zhugeliang_shadow.mp3 b/audio/die/huan_zhugeliang_shadow.mp3 new file mode 100644 index 0000000000..e948c6a688 Binary files /dev/null and b/audio/die/huan_zhugeliang_shadow.mp3 differ diff --git a/audio/die/jsrg_caocao.mp3 b/audio/die/jsrg_caocao.mp3 new file mode 100644 index 0000000000..7b7d327448 Binary files /dev/null and b/audio/die/jsrg_caocao.mp3 differ diff --git a/audio/die/jsrg_liubei.mp3 b/audio/die/jsrg_liubei.mp3 new file mode 100644 index 0000000000..8ee2f507ac Binary files /dev/null and b/audio/die/jsrg_liubei.mp3 differ diff --git a/audio/die/jsrg_sunjian.mp3 b/audio/die/jsrg_sunjian.mp3 new file mode 100644 index 0000000000..921e8a5f4f Binary files /dev/null and b/audio/die/jsrg_sunjian.mp3 differ diff --git a/audio/die/mb_simafu.mp3 b/audio/die/mb_simafu.mp3 new file mode 100644 index 0000000000..0f3158b107 Binary files /dev/null and b/audio/die/mb_simafu.mp3 differ diff --git a/audio/die/mb_simazhou.mp3 b/audio/die/mb_simazhou.mp3 new file mode 100644 index 0000000000..29ec7fe87f Binary files /dev/null and b/audio/die/mb_simazhou.mp3 differ diff --git a/audio/die/mb_wangjing.mp3 b/audio/die/mb_wangjing.mp3 new file mode 100644 index 0000000000..413eacfdbb Binary files /dev/null and b/audio/die/mb_wangjing.mp3 differ diff --git a/audio/die/mb_wenqin.mp3 b/audio/die/mb_wenqin.mp3 new file mode 100644 index 0000000000..4569ea832d Binary files /dev/null and b/audio/die/mb_wenqin.mp3 differ diff --git a/audio/die/mp_wangrong.mp3 b/audio/die/mp_wangrong.mp3 new file mode 100644 index 0000000000..cf9400ecc3 Binary files /dev/null and b/audio/die/mp_wangrong.mp3 differ diff --git a/audio/die/new_simayi.mp3 b/audio/die/new_simayi.mp3 new file mode 100644 index 0000000000..fa0947c74f Binary files /dev/null and b/audio/die/new_simayi.mp3 differ diff --git a/audio/die/ol_caifuren.mp3 b/audio/die/ol_caifuren.mp3 new file mode 100644 index 0000000000..5b01e7ed73 Binary files /dev/null and b/audio/die/ol_caifuren.mp3 differ diff --git a/audio/die/ol_fazheng.mp3 b/audio/die/ol_fazheng.mp3 new file mode 100644 index 0000000000..3f9c2cb128 Binary files /dev/null and b/audio/die/ol_fazheng.mp3 differ diff --git a/audio/die/ol_jiangwan.mp3 b/audio/die/ol_jiangwan.mp3 new file mode 100644 index 0000000000..1a0b51bb02 Binary files /dev/null and b/audio/die/ol_jiangwan.mp3 differ diff --git a/audio/die/ol_sb_pangtong.mp3 b/audio/die/ol_sb_pangtong.mp3 new file mode 100644 index 0000000000..f63eb6dcd2 Binary files /dev/null and b/audio/die/ol_sb_pangtong.mp3 differ diff --git a/audio/die/ol_sb_pangtong2.mp3 b/audio/die/ol_sb_pangtong2.mp3 new file mode 100644 index 0000000000..4cd29b2fb0 Binary files /dev/null and b/audio/die/ol_sb_pangtong2.mp3 differ diff --git a/audio/die/ol_sb_pangtong3.mp3 b/audio/die/ol_sb_pangtong3.mp3 new file mode 100644 index 0000000000..0e9a085ee9 Binary files /dev/null and b/audio/die/ol_sb_pangtong3.mp3 differ diff --git a/audio/die/sb_luxun.mp3 b/audio/die/sb_luxun.mp3 new file mode 100644 index 0000000000..238fe39e34 Binary files /dev/null and b/audio/die/sb_luxun.mp3 differ diff --git a/audio/die/star_sunshangxiang.mp3 b/audio/die/star_sunshangxiang.mp3 new file mode 100644 index 0000000000..654078888b Binary files /dev/null and b/audio/die/star_sunshangxiang.mp3 differ diff --git a/audio/die/sunli.mp3 b/audio/die/sunli.mp3 new file mode 100644 index 0000000000..2f5b77d5ee Binary files /dev/null and b/audio/die/sunli.mp3 differ diff --git a/audio/die/wuhujiang.mp3 b/audio/die/wuhujiang.mp3 new file mode 100644 index 0000000000..6b7e5ba133 Binary files /dev/null and b/audio/die/wuhujiang.mp3 differ diff --git a/audio/die/wuhujiang2.mp3 b/audio/die/wuhujiang2.mp3 new file mode 100644 index 0000000000..6e7f0b6d74 Binary files /dev/null and b/audio/die/wuhujiang2.mp3 differ diff --git a/audio/die/wuhujiang3.mp3 b/audio/die/wuhujiang3.mp3 new file mode 100644 index 0000000000..6f5968af59 Binary files /dev/null and b/audio/die/wuhujiang3.mp3 differ diff --git a/audio/die/wuhujiang4.mp3 b/audio/die/wuhujiang4.mp3 new file mode 100644 index 0000000000..4d84df0b3d Binary files /dev/null and b/audio/die/wuhujiang4.mp3 differ diff --git a/audio/die/wuhujiang5.mp3 b/audio/die/wuhujiang5.mp3 new file mode 100644 index 0000000000..57a930f083 Binary files /dev/null and b/audio/die/wuhujiang5.mp3 differ diff --git a/audio/die/xinfu_yuji.mp3 b/audio/die/xinfu_yuji.mp3 deleted file mode 100644 index 4cc88e36f9..0000000000 Binary files a/audio/die/xinfu_yuji.mp3 and /dev/null differ diff --git a/audio/die/xukun.mp3 b/audio/die/xukun.mp3 new file mode 100644 index 0000000000..20d6c25863 Binary files /dev/null and b/audio/die/xukun.mp3 differ diff --git a/audio/die/zhangbu.mp3 b/audio/die/zhangbu.mp3 new file mode 100644 index 0000000000..3b2b0cf8a3 Binary files /dev/null and b/audio/die/zhangbu.mp3 differ diff --git a/audio/skill/chongzhen_huan_zhaoyun1.mp3 b/audio/skill/chongzhen_huan_zhaoyun1.mp3 new file mode 100644 index 0000000000..2a861b3677 Binary files /dev/null and b/audio/skill/chongzhen_huan_zhaoyun1.mp3 differ diff --git a/audio/skill/chongzhen_huan_zhaoyun2.mp3 b/audio/skill/chongzhen_huan_zhaoyun2.mp3 new file mode 100644 index 0000000000..a7e7de7b42 Binary files /dev/null and b/audio/skill/chongzhen_huan_zhaoyun2.mp3 differ diff --git a/audio/skill/dcsbfumou1.mp3 b/audio/skill/dcsbfumou1.mp3 new file mode 100644 index 0000000000..97ad34dd05 Binary files /dev/null and b/audio/skill/dcsbfumou1.mp3 differ diff --git a/audio/skill/dcsbfumou2.mp3 b/audio/skill/dcsbfumou2.mp3 new file mode 100644 index 0000000000..2db9beef33 Binary files /dev/null and b/audio/skill/dcsbfumou2.mp3 differ diff --git a/audio/skill/dcsbfumou_dc_sb_jiaxu_shadow1.mp3 b/audio/skill/dcsbfumou_dc_sb_jiaxu_shadow1.mp3 new file mode 100644 index 0000000000..bba5680d0c Binary files /dev/null and b/audio/skill/dcsbfumou_dc_sb_jiaxu_shadow1.mp3 differ diff --git a/audio/skill/dcsbfumou_dc_sb_jiaxu_shadow2.mp3 b/audio/skill/dcsbfumou_dc_sb_jiaxu_shadow2.mp3 new file mode 100644 index 0000000000..e6141c0b05 Binary files /dev/null and b/audio/skill/dcsbfumou_dc_sb_jiaxu_shadow2.mp3 differ diff --git a/audio/skill/dcsbfuxi1.mp3 b/audio/skill/dcsbfuxi1.mp3 new file mode 100644 index 0000000000..85eb0a5eec Binary files /dev/null and b/audio/skill/dcsbfuxi1.mp3 differ diff --git a/audio/skill/dcsbfuxi2.mp3 b/audio/skill/dcsbfuxi2.mp3 new file mode 100644 index 0000000000..bc54fa8411 Binary files /dev/null and b/audio/skill/dcsbfuxi2.mp3 differ diff --git a/audio/skill/dcsbhaoyi1.mp3 b/audio/skill/dcsbhaoyi1.mp3 new file mode 100644 index 0000000000..38e4a72d08 Binary files /dev/null and b/audio/skill/dcsbhaoyi1.mp3 differ diff --git a/audio/skill/dcsbhaoyi2.mp3 b/audio/skill/dcsbhaoyi2.mp3 new file mode 100644 index 0000000000..0d3a1b0d9c Binary files /dev/null and b/audio/skill/dcsbhaoyi2.mp3 differ diff --git a/audio/skill/dcsbrushi1.mp3 b/audio/skill/dcsbrushi1.mp3 new file mode 100644 index 0000000000..bd68df88d2 Binary files /dev/null and b/audio/skill/dcsbrushi1.mp3 differ diff --git a/audio/skill/dcsbrushi2.mp3 b/audio/skill/dcsbrushi2.mp3 new file mode 100644 index 0000000000..b04e980694 Binary files /dev/null and b/audio/skill/dcsbrushi2.mp3 differ diff --git a/audio/skill/dcsbrushi_dc_sb_jiaxu_shadow1.mp3 b/audio/skill/dcsbrushi_dc_sb_jiaxu_shadow1.mp3 new file mode 100644 index 0000000000..74c1bddd5b Binary files /dev/null and b/audio/skill/dcsbrushi_dc_sb_jiaxu_shadow1.mp3 differ diff --git a/audio/skill/dcsbrushi_dc_sb_jiaxu_shadow2.mp3 b/audio/skill/dcsbrushi_dc_sb_jiaxu_shadow2.mp3 new file mode 100644 index 0000000000..588d9fe61b Binary files /dev/null and b/audio/skill/dcsbrushi_dc_sb_jiaxu_shadow2.mp3 differ diff --git a/audio/skill/dcsbsushen1.mp3 b/audio/skill/dcsbsushen1.mp3 new file mode 100644 index 0000000000..1d6505b910 Binary files /dev/null and b/audio/skill/dcsbsushen1.mp3 differ diff --git a/audio/skill/dcsbsushen2.mp3 b/audio/skill/dcsbsushen2.mp3 new file mode 100644 index 0000000000..2b7f313b0e Binary files /dev/null and b/audio/skill/dcsbsushen2.mp3 differ diff --git a/audio/skill/dcsbsushen_dc_sb_jiaxu_shadow1.mp3 b/audio/skill/dcsbsushen_dc_sb_jiaxu_shadow1.mp3 new file mode 100644 index 0000000000..0f0ed39072 Binary files /dev/null and b/audio/skill/dcsbsushen_dc_sb_jiaxu_shadow1.mp3 differ diff --git a/audio/skill/dcsbsushen_dc_sb_jiaxu_shadow2.mp3 b/audio/skill/dcsbsushen_dc_sb_jiaxu_shadow2.mp3 new file mode 100644 index 0000000000..51e19c3529 Binary files /dev/null and b/audio/skill/dcsbsushen_dc_sb_jiaxu_shadow2.mp3 differ diff --git a/audio/skill/fazhu1.mp3 b/audio/skill/fazhu1.mp3 new file mode 100644 index 0000000000..2c214eb654 Binary files /dev/null and b/audio/skill/fazhu1.mp3 differ diff --git a/audio/skill/fazhu2.mp3 b/audio/skill/fazhu2.mp3 new file mode 100644 index 0000000000..093cddec73 Binary files /dev/null and b/audio/skill/fazhu2.mp3 differ diff --git a/audio/skill/fazhu3.mp3 b/audio/skill/fazhu3.mp3 new file mode 100644 index 0000000000..51f89690cc Binary files /dev/null and b/audio/skill/fazhu3.mp3 differ diff --git a/audio/skill/fencheng1.mp3 b/audio/skill/fencheng1.mp3 deleted file mode 100644 index 361a73c5ee..0000000000 Binary files a/audio/skill/fencheng1.mp3 and /dev/null differ diff --git a/audio/skill/fencheng2.mp3 b/audio/skill/fencheng2.mp3 deleted file mode 100644 index 6f56004399..0000000000 Binary files a/audio/skill/fencheng2.mp3 and /dev/null differ diff --git a/audio/skill/jilin1.mp3 b/audio/skill/jilin1.mp3 new file mode 100644 index 0000000000..c5757c93f9 Binary files /dev/null and b/audio/skill/jilin1.mp3 differ diff --git a/audio/skill/jilin2.mp3 b/audio/skill/jilin2.mp3 new file mode 100644 index 0000000000..1183409091 Binary files /dev/null and b/audio/skill/jilin2.mp3 differ diff --git a/audio/skill/jilin3.mp3 b/audio/skill/jilin3.mp3 new file mode 100644 index 0000000000..283c576098 Binary files /dev/null and b/audio/skill/jilin3.mp3 differ diff --git a/audio/skill/jilin4.mp3 b/audio/skill/jilin4.mp3 new file mode 100644 index 0000000000..995485f6a6 Binary files /dev/null and b/audio/skill/jilin4.mp3 differ diff --git a/audio/skill/jilin5.mp3 b/audio/skill/jilin5.mp3 new file mode 100644 index 0000000000..b94e504556 Binary files /dev/null and b/audio/skill/jilin5.mp3 differ diff --git a/audio/skill/jsrghuilie1.mp3 b/audio/skill/jsrghuilie1.mp3 new file mode 100644 index 0000000000..3e644fee16 Binary files /dev/null and b/audio/skill/jsrghuilie1.mp3 differ diff --git a/audio/skill/jsrghuilie2.mp3 b/audio/skill/jsrghuilie2.mp3 new file mode 100644 index 0000000000..f1ce76b3ca Binary files /dev/null and b/audio/skill/jsrghuilie2.mp3 differ diff --git a/audio/skill/jsrgjishan1.mp3 b/audio/skill/jsrgjishan1.mp3 new file mode 100644 index 0000000000..8ca743244e Binary files /dev/null and b/audio/skill/jsrgjishan1.mp3 differ diff --git a/audio/skill/jsrgjishan2.mp3 b/audio/skill/jsrgjishan2.mp3 new file mode 100644 index 0000000000..9e9043f6fa Binary files /dev/null and b/audio/skill/jsrgjishan2.mp3 differ diff --git a/audio/skill/jsrgjishan3.mp3 b/audio/skill/jsrgjishan3.mp3 new file mode 100644 index 0000000000..de396d671e Binary files /dev/null and b/audio/skill/jsrgjishan3.mp3 differ diff --git a/audio/skill/jsrgjishan4.mp3 b/audio/skill/jsrgjishan4.mp3 new file mode 100644 index 0000000000..105e8f19ed Binary files /dev/null and b/audio/skill/jsrgjishan4.mp3 differ diff --git a/audio/skill/jsrgjuelie1.mp3 b/audio/skill/jsrgjuelie1.mp3 new file mode 100644 index 0000000000..08e23e61ad Binary files /dev/null and b/audio/skill/jsrgjuelie1.mp3 differ diff --git a/audio/skill/jsrgjuelie2.mp3 b/audio/skill/jsrgjuelie2.mp3 new file mode 100644 index 0000000000..852ac7e9d4 Binary files /dev/null and b/audio/skill/jsrgjuelie2.mp3 differ diff --git a/audio/skill/jsrgjuelie3.mp3 b/audio/skill/jsrgjuelie3.mp3 new file mode 100644 index 0000000000..54f8c29243 Binary files /dev/null and b/audio/skill/jsrgjuelie3.mp3 differ diff --git a/audio/skill/jsrgjuelie4.mp3 b/audio/skill/jsrgjuelie4.mp3 new file mode 100644 index 0000000000..7cb16af4df Binary files /dev/null and b/audio/skill/jsrgjuelie4.mp3 differ diff --git a/audio/skill/jsrgpingrong1.mp3 b/audio/skill/jsrgpingrong1.mp3 new file mode 100644 index 0000000000..190d856f1f Binary files /dev/null and b/audio/skill/jsrgpingrong1.mp3 differ diff --git a/audio/skill/jsrgpingrong2.mp3 b/audio/skill/jsrgpingrong2.mp3 new file mode 100644 index 0000000000..07cbb291cf Binary files /dev/null and b/audio/skill/jsrgpingrong2.mp3 differ diff --git a/audio/skill/jsrgpingrong3.mp3 b/audio/skill/jsrgpingrong3.mp3 new file mode 100644 index 0000000000..ff68c5465e Binary files /dev/null and b/audio/skill/jsrgpingrong3.mp3 differ diff --git a/audio/skill/jsrgpingtao1.mp3 b/audio/skill/jsrgpingtao1.mp3 new file mode 100644 index 0000000000..773a15ec28 Binary files /dev/null and b/audio/skill/jsrgpingtao1.mp3 differ diff --git a/audio/skill/jsrgpingtao2.mp3 b/audio/skill/jsrgpingtao2.mp3 new file mode 100644 index 0000000000..6d9d5ba527 Binary files /dev/null and b/audio/skill/jsrgpingtao2.mp3 differ diff --git a/audio/skill/jsrgzhenglve1.mp3 b/audio/skill/jsrgzhenglve1.mp3 new file mode 100644 index 0000000000..407ffee10f Binary files /dev/null and b/audio/skill/jsrgzhenglve1.mp3 differ diff --git a/audio/skill/jsrgzhenglve2.mp3 b/audio/skill/jsrgzhenglve2.mp3 new file mode 100644 index 0000000000..e300994336 Binary files /dev/null and b/audio/skill/jsrgzhenglve2.mp3 differ diff --git a/audio/skill/jsrgzhenglve3.mp3 b/audio/skill/jsrgzhenglve3.mp3 new file mode 100644 index 0000000000..aa6358ff89 Binary files /dev/null and b/audio/skill/jsrgzhenglve3.mp3 differ diff --git a/audio/skill/jsrgzhenglve4.mp3 b/audio/skill/jsrgzhenglve4.mp3 new file mode 100644 index 0000000000..382d692974 Binary files /dev/null and b/audio/skill/jsrgzhenglve4.mp3 differ diff --git a/audio/skill/jsrgzhenqiao1.mp3 b/audio/skill/jsrgzhenqiao1.mp3 new file mode 100644 index 0000000000..046f9262df Binary files /dev/null and b/audio/skill/jsrgzhenqiao1.mp3 differ diff --git a/audio/skill/jsrgzhenqiao2.mp3 b/audio/skill/jsrgzhenqiao2.mp3 new file mode 100644 index 0000000000..ba65667d6e Binary files /dev/null and b/audio/skill/jsrgzhenqiao2.mp3 differ diff --git a/audio/skill/kangli1.mp3 b/audio/skill/kangli1.mp3 new file mode 100644 index 0000000000..85cec199c2 Binary files /dev/null and b/audio/skill/kangli1.mp3 differ diff --git a/audio/skill/kangli2.mp3 b/audio/skill/kangli2.mp3 new file mode 100644 index 0000000000..87d7876740 Binary files /dev/null and b/audio/skill/kangli2.mp3 differ diff --git a/audio/skill/lianpo_new_simayi1.mp3 b/audio/skill/lianpo_new_simayi1.mp3 new file mode 100644 index 0000000000..8232ba3d19 Binary files /dev/null and b/audio/skill/lianpo_new_simayi1.mp3 differ diff --git a/audio/skill/lianpo_new_simayi2.mp3 b/audio/skill/lianpo_new_simayi2.mp3 new file mode 100644 index 0000000000..ac7de314d6 Binary files /dev/null and b/audio/skill/lianpo_new_simayi2.mp3 differ diff --git a/audio/skill/longdan_sha_huan_zhaoyun1.mp3 b/audio/skill/longdan_sha_huan_zhaoyun1.mp3 new file mode 100644 index 0000000000..bf20c15797 Binary files /dev/null and b/audio/skill/longdan_sha_huan_zhaoyun1.mp3 differ diff --git a/audio/skill/longdan_sha_huan_zhaoyun2.mp3 b/audio/skill/longdan_sha_huan_zhaoyun2.mp3 new file mode 100644 index 0000000000..6753191789 Binary files /dev/null and b/audio/skill/longdan_sha_huan_zhaoyun2.mp3 differ diff --git a/audio/skill/mbbeiming1.mp3 b/audio/skill/mbbeiming1.mp3 new file mode 100644 index 0000000000..56032629e2 Binary files /dev/null and b/audio/skill/mbbeiming1.mp3 differ diff --git a/audio/skill/mbbeiming2.mp3 b/audio/skill/mbbeiming2.mp3 new file mode 100644 index 0000000000..eee341af5f Binary files /dev/null and b/audio/skill/mbbeiming2.mp3 differ diff --git a/audio/skill/mbbifeng1.mp3 b/audio/skill/mbbifeng1.mp3 new file mode 100644 index 0000000000..d4103f24cd Binary files /dev/null and b/audio/skill/mbbifeng1.mp3 differ diff --git a/audio/skill/mbbifeng2.mp3 b/audio/skill/mbbifeng2.mp3 new file mode 100644 index 0000000000..1fb3ce450f Binary files /dev/null and b/audio/skill/mbbifeng2.mp3 differ diff --git a/audio/skill/mbbifeng3.mp3 b/audio/skill/mbbifeng3.mp3 new file mode 100644 index 0000000000..36a3cd2e92 Binary files /dev/null and b/audio/skill/mbbifeng3.mp3 differ diff --git a/audio/skill/mbchengxiong1.mp3 b/audio/skill/mbchengxiong1.mp3 new file mode 100644 index 0000000000..2054bbca90 Binary files /dev/null and b/audio/skill/mbchengxiong1.mp3 differ diff --git a/audio/skill/mbchengxiong2.mp3 b/audio/skill/mbchengxiong2.mp3 new file mode 100644 index 0000000000..006059544b Binary files /dev/null and b/audio/skill/mbchengxiong2.mp3 differ diff --git a/audio/skill/mbchenjie1.mp3 b/audio/skill/mbchenjie1.mp3 new file mode 100644 index 0000000000..dc8a54a6e8 Binary files /dev/null and b/audio/skill/mbchenjie1.mp3 differ diff --git a/audio/skill/mbchenjie2.mp3 b/audio/skill/mbchenjie2.mp3 new file mode 100644 index 0000000000..bcb2ebf021 Binary files /dev/null and b/audio/skill/mbchenjie2.mp3 differ diff --git a/audio/skill/mbchoumang1.mp3 b/audio/skill/mbchoumang1.mp3 new file mode 100644 index 0000000000..f90c1cbb4f Binary files /dev/null and b/audio/skill/mbchoumang1.mp3 differ diff --git a/audio/skill/mbchoumang2.mp3 b/audio/skill/mbchoumang2.mp3 new file mode 100644 index 0000000000..04c2b2f355 Binary files /dev/null and b/audio/skill/mbchoumang2.mp3 differ diff --git a/audio/skill/mbjiejian1.mp3 b/audio/skill/mbjiejian1.mp3 new file mode 100644 index 0000000000..67c9b64c57 Binary files /dev/null and b/audio/skill/mbjiejian1.mp3 differ diff --git a/audio/skill/mbjiejian2.mp3 b/audio/skill/mbjiejian2.mp3 new file mode 100644 index 0000000000..64b948b45d Binary files /dev/null and b/audio/skill/mbjiejian2.mp3 differ diff --git a/audio/skill/mbjiejian3.mp3 b/audio/skill/mbjiejian3.mp3 new file mode 100644 index 0000000000..750dcb273d Binary files /dev/null and b/audio/skill/mbjiejian3.mp3 differ diff --git a/audio/skill/mbpanxiang1.mp3 b/audio/skill/mbpanxiang1.mp3 new file mode 100644 index 0000000000..3f04852a40 Binary files /dev/null and b/audio/skill/mbpanxiang1.mp3 differ diff --git a/audio/skill/mbpanxiang2.mp3 b/audio/skill/mbpanxiang2.mp3 new file mode 100644 index 0000000000..66a382a533 Binary files /dev/null and b/audio/skill/mbpanxiang2.mp3 differ diff --git a/audio/skill/mbpanxiang3.mp3 b/audio/skill/mbpanxiang3.mp3 new file mode 100644 index 0000000000..ee31f9a457 Binary files /dev/null and b/audio/skill/mbpanxiang3.mp3 differ diff --git a/audio/skill/mbpanxiang4.mp3 b/audio/skill/mbpanxiang4.mp3 new file mode 100644 index 0000000000..a5b6b6ff6b Binary files /dev/null and b/audio/skill/mbpanxiang4.mp3 differ diff --git a/audio/skill/mbsuwang1.mp3 b/audio/skill/mbsuwang1.mp3 new file mode 100644 index 0000000000..0b56318e27 Binary files /dev/null and b/audio/skill/mbsuwang1.mp3 differ diff --git a/audio/skill/mbsuwang2.mp3 b/audio/skill/mbsuwang2.mp3 new file mode 100644 index 0000000000..5a5acf1a90 Binary files /dev/null and b/audio/skill/mbsuwang2.mp3 differ diff --git a/audio/skill/mbwangzhuang1.mp3 b/audio/skill/mbwangzhuang1.mp3 new file mode 100644 index 0000000000..1e5948ae30 Binary files /dev/null and b/audio/skill/mbwangzhuang1.mp3 differ diff --git a/audio/skill/mbwangzhuang2.mp3 b/audio/skill/mbwangzhuang2.mp3 new file mode 100644 index 0000000000..acc449ca1a Binary files /dev/null and b/audio/skill/mbwangzhuang2.mp3 differ diff --git a/audio/skill/mbzujin1.mp3 b/audio/skill/mbzujin1.mp3 new file mode 100644 index 0000000000..04377a6d13 Binary files /dev/null and b/audio/skill/mbzujin1.mp3 differ diff --git a/audio/skill/mbzujin2.mp3 b/audio/skill/mbzujin2.mp3 new file mode 100644 index 0000000000..95712232a1 Binary files /dev/null and b/audio/skill/mbzujin2.mp3 differ diff --git a/audio/skill/mbzujin3.mp3 b/audio/skill/mbzujin3.mp3 new file mode 100644 index 0000000000..a73b0c7957 Binary files /dev/null and b/audio/skill/mbzujin3.mp3 differ diff --git a/audio/skill/mingjie2.mp3 b/audio/skill/mingjie2.mp3 new file mode 100644 index 0000000000..f1f42bfedb Binary files /dev/null and b/audio/skill/mingjie2.mp3 differ diff --git a/audio/skill/mpjianlin1.mp3 b/audio/skill/mpjianlin1.mp3 new file mode 100644 index 0000000000..c9fca919a1 Binary files /dev/null and b/audio/skill/mpjianlin1.mp3 differ diff --git a/audio/skill/mpjianlin2.mp3 b/audio/skill/mpjianlin2.mp3 new file mode 100644 index 0000000000..9dcf34d485 Binary files /dev/null and b/audio/skill/mpjianlin2.mp3 differ diff --git a/audio/skill/mpsixiao1.mp3 b/audio/skill/mpsixiao1.mp3 new file mode 100644 index 0000000000..42878c83e7 Binary files /dev/null and b/audio/skill/mpsixiao1.mp3 differ diff --git a/audio/skill/mpsixiao2.mp3 b/audio/skill/mpsixiao2.mp3 new file mode 100644 index 0000000000..386e3a634a Binary files /dev/null and b/audio/skill/mpsixiao2.mp3 differ diff --git a/audio/skill/olenyuan1.mp3 b/audio/skill/olenyuan1.mp3 new file mode 100644 index 0000000000..1a5c0c6ee8 Binary files /dev/null and b/audio/skill/olenyuan1.mp3 differ diff --git a/audio/skill/olenyuan2.mp3 b/audio/skill/olenyuan2.mp3 new file mode 100644 index 0000000000..698bed0e53 Binary files /dev/null and b/audio/skill/olenyuan2.mp3 differ diff --git a/audio/skill/olhuyi1.mp3 b/audio/skill/olhuyi1.mp3 new file mode 100644 index 0000000000..475db4af0b Binary files /dev/null and b/audio/skill/olhuyi1.mp3 differ diff --git a/audio/skill/olhuyi2.mp3 b/audio/skill/olhuyi2.mp3 new file mode 100644 index 0000000000..aa85aba399 Binary files /dev/null and b/audio/skill/olhuyi2.mp3 differ diff --git a/audio/skill/olhuyi3.mp3 b/audio/skill/olhuyi3.mp3 new file mode 100644 index 0000000000..db454d380f Binary files /dev/null and b/audio/skill/olhuyi3.mp3 differ diff --git a/audio/skill/olhuyi4.mp3 b/audio/skill/olhuyi4.mp3 new file mode 100644 index 0000000000..4e2ca5c41c Binary files /dev/null and b/audio/skill/olhuyi4.mp3 differ diff --git a/audio/skill/olhuyi5.mp3 b/audio/skill/olhuyi5.mp3 new file mode 100644 index 0000000000..83a52d3288 Binary files /dev/null and b/audio/skill/olhuyi5.mp3 differ diff --git a/audio/skill/olqieting1.mp3 b/audio/skill/olqieting1.mp3 new file mode 100644 index 0000000000..5c606ed7d9 Binary files /dev/null and b/audio/skill/olqieting1.mp3 differ diff --git a/audio/skill/olqieting2.mp3 b/audio/skill/olqieting2.mp3 new file mode 100644 index 0000000000..84602b9f4c Binary files /dev/null and b/audio/skill/olqieting2.mp3 differ diff --git a/audio/skill/olsbhongtu1.mp3 b/audio/skill/olsbhongtu1.mp3 new file mode 100644 index 0000000000..09bf1c447d Binary files /dev/null and b/audio/skill/olsbhongtu1.mp3 differ diff --git a/audio/skill/olsbhongtu2.mp3 b/audio/skill/olsbhongtu2.mp3 new file mode 100644 index 0000000000..979f46f0ff Binary files /dev/null and b/audio/skill/olsbhongtu2.mp3 differ diff --git a/audio/skill/olsbhongtu3.mp3 b/audio/skill/olsbhongtu3.mp3 new file mode 100644 index 0000000000..9e6e537785 Binary files /dev/null and b/audio/skill/olsbhongtu3.mp3 differ diff --git a/audio/skill/olsbhongtu4.mp3 b/audio/skill/olsbhongtu4.mp3 new file mode 100644 index 0000000000..3bc4ec62e8 Binary files /dev/null and b/audio/skill/olsbhongtu4.mp3 differ diff --git a/audio/skill/olsbhongtu5.mp3 b/audio/skill/olsbhongtu5.mp3 new file mode 100644 index 0000000000..5fe5843555 Binary files /dev/null and b/audio/skill/olsbhongtu5.mp3 differ diff --git a/audio/skill/olsbhongtu6.mp3 b/audio/skill/olsbhongtu6.mp3 new file mode 100644 index 0000000000..826f0ae367 Binary files /dev/null and b/audio/skill/olsbhongtu6.mp3 differ diff --git a/audio/skill/olsbqiwu1.mp3 b/audio/skill/olsbqiwu1.mp3 new file mode 100644 index 0000000000..2758dc5cc2 Binary files /dev/null and b/audio/skill/olsbqiwu1.mp3 differ diff --git a/audio/skill/olsbqiwu2.mp3 b/audio/skill/olsbqiwu2.mp3 new file mode 100644 index 0000000000..587f1db186 Binary files /dev/null and b/audio/skill/olsbqiwu2.mp3 differ diff --git a/audio/skill/olsbqiwu3.mp3 b/audio/skill/olsbqiwu3.mp3 new file mode 100644 index 0000000000..faa60adb9c Binary files /dev/null and b/audio/skill/olsbqiwu3.mp3 differ diff --git a/audio/skill/olsbqiwu4.mp3 b/audio/skill/olsbqiwu4.mp3 new file mode 100644 index 0000000000..9755d30cdb Binary files /dev/null and b/audio/skill/olsbqiwu4.mp3 differ diff --git a/audio/skill/olsbqiwu5.mp3 b/audio/skill/olsbqiwu5.mp3 new file mode 100644 index 0000000000..aa84cc8000 Binary files /dev/null and b/audio/skill/olsbqiwu5.mp3 differ diff --git a/audio/skill/olsbqiwu6.mp3 b/audio/skill/olsbqiwu6.mp3 new file mode 100644 index 0000000000..7acaa35263 Binary files /dev/null and b/audio/skill/olsbqiwu6.mp3 differ diff --git a/audio/skill/olxuanhuo1.mp3 b/audio/skill/olxuanhuo1.mp3 new file mode 100644 index 0000000000..a83def3862 Binary files /dev/null and b/audio/skill/olxuanhuo1.mp3 differ diff --git a/audio/skill/olxuanhuo2.mp3 b/audio/skill/olxuanhuo2.mp3 new file mode 100644 index 0000000000..9b6c48d2cd Binary files /dev/null and b/audio/skill/olxuanhuo2.mp3 differ diff --git a/audio/skill/olxvfa1.mp3 b/audio/skill/olxvfa1.mp3 new file mode 100644 index 0000000000..ccdedca922 Binary files /dev/null and b/audio/skill/olxvfa1.mp3 differ diff --git a/audio/skill/olxvfa2.mp3 b/audio/skill/olxvfa2.mp3 new file mode 100644 index 0000000000..042e7db9c7 Binary files /dev/null and b/audio/skill/olxvfa2.mp3 differ diff --git a/audio/skill/olziruo1.mp3 b/audio/skill/olziruo1.mp3 new file mode 100644 index 0000000000..781d3d8575 Binary files /dev/null and b/audio/skill/olziruo1.mp3 differ diff --git a/audio/skill/olziruo2.mp3 b/audio/skill/olziruo2.mp3 new file mode 100644 index 0000000000..94b5b68bbe Binary files /dev/null and b/audio/skill/olziruo2.mp3 differ diff --git a/audio/skill/qiaomeng_xin_gongsunzan1.mp3 b/audio/skill/qiaomeng_xin_gongsunzan1.mp3 new file mode 100644 index 0000000000..cf8b51ad87 Binary files /dev/null and b/audio/skill/qiaomeng_xin_gongsunzan1.mp3 differ diff --git a/audio/skill/qiaomeng_xin_gongsunzan2.mp3 b/audio/skill/qiaomeng_xin_gongsunzan2.mp3 new file mode 100644 index 0000000000..347f5ad104 Binary files /dev/null and b/audio/skill/qiaomeng_xin_gongsunzan2.mp3 differ diff --git a/audio/skill/reguicai_new_simayi1.mp3 b/audio/skill/reguicai_new_simayi1.mp3 new file mode 100644 index 0000000000..dfe356c830 Binary files /dev/null and b/audio/skill/reguicai_new_simayi1.mp3 differ diff --git a/audio/skill/reguicai_new_simayi2.mp3 b/audio/skill/reguicai_new_simayi2.mp3 new file mode 100644 index 0000000000..bd18d41f10 Binary files /dev/null and b/audio/skill/reguicai_new_simayi2.mp3 differ diff --git a/audio/skill/reyicong_dc_gongsunzan.mp3 b/audio/skill/reyicong_dc_gongsunzan.mp3 deleted file mode 100644 index 19a73d548f..0000000000 Binary files a/audio/skill/reyicong_dc_gongsunzan.mp3 and /dev/null differ diff --git a/audio/skill/reyicong_dc_gongsunzan1.mp3 b/audio/skill/reyicong_dc_gongsunzan1.mp3 deleted file mode 100644 index 374f62bfe1..0000000000 Binary files a/audio/skill/reyicong_dc_gongsunzan1.mp3 and /dev/null differ diff --git a/audio/skill/sblianying1.mp3 b/audio/skill/sblianying1.mp3 new file mode 100644 index 0000000000..6e2b62144b Binary files /dev/null and b/audio/skill/sblianying1.mp3 differ diff --git a/audio/skill/sblianying2.mp3 b/audio/skill/sblianying2.mp3 new file mode 100644 index 0000000000..fd2c2fe795 Binary files /dev/null and b/audio/skill/sblianying2.mp3 differ diff --git a/audio/skill/sbqianxun1.mp3 b/audio/skill/sbqianxun1.mp3 new file mode 100644 index 0000000000..157470324e Binary files /dev/null and b/audio/skill/sbqianxun1.mp3 differ diff --git a/audio/skill/sbqianxun2.mp3 b/audio/skill/sbqianxun2.mp3 new file mode 100644 index 0000000000..9c9a421586 Binary files /dev/null and b/audio/skill/sbqianxun2.mp3 differ diff --git a/audio/skill/starjiaohao1.mp3 b/audio/skill/starjiaohao1.mp3 new file mode 100644 index 0000000000..3b6f5df108 Binary files /dev/null and b/audio/skill/starjiaohao1.mp3 differ diff --git a/audio/skill/starjiaohao2.mp3 b/audio/skill/starjiaohao2.mp3 new file mode 100644 index 0000000000..9e9c83882b Binary files /dev/null and b/audio/skill/starjiaohao2.mp3 differ diff --git a/audio/skill/starsaying1.mp3 b/audio/skill/starsaying1.mp3 new file mode 100644 index 0000000000..67759a4550 Binary files /dev/null and b/audio/skill/starsaying1.mp3 differ diff --git a/audio/skill/starsaying2.mp3 b/audio/skill/starsaying2.mp3 new file mode 100644 index 0000000000..d5e817237b Binary files /dev/null and b/audio/skill/starsaying2.mp3 differ diff --git a/audio/skill/taoxi1.mp3 b/audio/skill/taoxi1.mp3 deleted file mode 100755 index 11b67b1736..0000000000 Binary files a/audio/skill/taoxi1.mp3 and /dev/null differ diff --git a/audio/skill/taoxi2.mp3 b/audio/skill/taoxi2.mp3 deleted file mode 100755 index c088591553..0000000000 Binary files a/audio/skill/taoxi2.mp3 and /dev/null differ diff --git a/audio/skill/twbeiding1.mp3 b/audio/skill/twbeiding1.mp3 new file mode 100644 index 0000000000..24946193b4 Binary files /dev/null and b/audio/skill/twbeiding1.mp3 differ diff --git a/audio/skill/twbeiding2.mp3 b/audio/skill/twbeiding2.mp3 new file mode 100644 index 0000000000..e2339a7826 Binary files /dev/null and b/audio/skill/twbeiding2.mp3 differ diff --git a/audio/skill/twbeidingx1.mp3 b/audio/skill/twbeidingx1.mp3 new file mode 100644 index 0000000000..86a9d5e33c Binary files /dev/null and b/audio/skill/twbeidingx1.mp3 differ diff --git a/audio/skill/twbeidingx2.mp3 b/audio/skill/twbeidingx2.mp3 new file mode 100644 index 0000000000..e4fb7e4381 Binary files /dev/null and b/audio/skill/twbeidingx2.mp3 differ diff --git a/audio/skill/twchanggui1.mp3 b/audio/skill/twchanggui1.mp3 new file mode 100644 index 0000000000..d82fa5d5ad Binary files /dev/null and b/audio/skill/twchanggui1.mp3 differ diff --git a/audio/skill/twchanggui2.mp3 b/audio/skill/twchanggui2.mp3 new file mode 100644 index 0000000000..dc91b28efd Binary files /dev/null and b/audio/skill/twchanggui2.mp3 differ diff --git a/audio/skill/twhuanji1.mp3 b/audio/skill/twhuanji1.mp3 new file mode 100644 index 0000000000..8e34d36f89 Binary files /dev/null and b/audio/skill/twhuanji1.mp3 differ diff --git a/audio/skill/twhuanji2.mp3 b/audio/skill/twhuanji2.mp3 new file mode 100644 index 0000000000..74ae314d28 Binary files /dev/null and b/audio/skill/twhuanji2.mp3 differ diff --git a/audio/skill/twhunyou1.mp3 b/audio/skill/twhunyou1.mp3 new file mode 100644 index 0000000000..bdc21a9501 Binary files /dev/null and b/audio/skill/twhunyou1.mp3 differ diff --git a/audio/skill/twhunyou2.mp3 b/audio/skill/twhunyou2.mp3 new file mode 100644 index 0000000000..cce38384d1 Binary files /dev/null and b/audio/skill/twhunyou2.mp3 differ diff --git a/audio/skill/twjielv1.mp3 b/audio/skill/twjielv1.mp3 new file mode 100644 index 0000000000..083e0d9261 Binary files /dev/null and b/audio/skill/twjielv1.mp3 differ diff --git a/audio/skill/twjielv2.mp3 b/audio/skill/twjielv2.mp3 new file mode 100644 index 0000000000..59da6970c8 Binary files /dev/null and b/audio/skill/twjielv2.mp3 differ diff --git a/audio/skill/twjielvx1.mp3 b/audio/skill/twjielvx1.mp3 new file mode 100644 index 0000000000..8e4950a876 Binary files /dev/null and b/audio/skill/twjielvx1.mp3 differ diff --git a/audio/skill/twjielvx2.mp3 b/audio/skill/twjielvx2.mp3 new file mode 100644 index 0000000000..91648fbc03 Binary files /dev/null and b/audio/skill/twjielvx2.mp3 differ diff --git a/audio/skill/twjiezhan1.mp3 b/audio/skill/twjiezhan1.mp3 new file mode 100644 index 0000000000..51d631cd8e Binary files /dev/null and b/audio/skill/twjiezhan1.mp3 differ diff --git a/audio/skill/twjiezhan2.mp3 b/audio/skill/twjiezhan2.mp3 new file mode 100644 index 0000000000..4d6c32868c Binary files /dev/null and b/audio/skill/twjiezhan2.mp3 differ diff --git a/audio/skill/twkuiduan1.mp3 b/audio/skill/twkuiduan1.mp3 new file mode 100644 index 0000000000..d34e0b4f4c Binary files /dev/null and b/audio/skill/twkuiduan1.mp3 differ diff --git a/audio/skill/twkuiduan2.mp3 b/audio/skill/twkuiduan2.mp3 new file mode 100644 index 0000000000..9b8857df31 Binary files /dev/null and b/audio/skill/twkuiduan2.mp3 differ diff --git a/audio/skill/twlongjin1.mp3 b/audio/skill/twlongjin1.mp3 new file mode 100644 index 0000000000..4ba688b70d Binary files /dev/null and b/audio/skill/twlongjin1.mp3 differ diff --git a/audio/skill/twlongjin2.mp3 b/audio/skill/twlongjin2.mp3 new file mode 100644 index 0000000000..19e9d46c6b Binary files /dev/null and b/audio/skill/twlongjin2.mp3 differ diff --git a/audio/skill/wansha_new_simayi1.mp3 b/audio/skill/wansha_new_simayi1.mp3 new file mode 100644 index 0000000000..45dc2273a1 Binary files /dev/null and b/audio/skill/wansha_new_simayi1.mp3 differ diff --git a/audio/skill/wansha_new_simayi2.mp3 b/audio/skill/wansha_new_simayi2.mp3 new file mode 100644 index 0000000000..67b857438e Binary files /dev/null and b/audio/skill/wansha_new_simayi2.mp3 differ diff --git a/audio/skill/xianzhou_ol_caifuren1.mp3 b/audio/skill/xianzhou_ol_caifuren1.mp3 new file mode 100644 index 0000000000..355719f454 Binary files /dev/null and b/audio/skill/xianzhou_ol_caifuren1.mp3 differ diff --git a/audio/skill/xianzhou_ol_caifuren2.mp3 b/audio/skill/xianzhou_ol_caifuren2.mp3 new file mode 100644 index 0000000000..539fe63545 Binary files /dev/null and b/audio/skill/xianzhou_ol_caifuren2.mp3 differ diff --git a/audio/skill/xinmieji1.mp3 b/audio/skill/xinmieji1.mp3 deleted file mode 100644 index 97bf574a9d..0000000000 Binary files a/audio/skill/xinmieji1.mp3 and /dev/null differ diff --git a/audio/skill/xinmieji2.mp3 b/audio/skill/xinmieji2.mp3 deleted file mode 100644 index b057d017b2..0000000000 Binary files a/audio/skill/xinmieji2.mp3 and /dev/null differ diff --git a/audio/skill/xinpojun1.mp3 b/audio/skill/xinpojun1.mp3 deleted file mode 100644 index a69c1a4118..0000000000 Binary files a/audio/skill/xinpojun1.mp3 and /dev/null differ diff --git a/audio/skill/xinpojun2.mp3 b/audio/skill/xinpojun2.mp3 deleted file mode 100644 index 6ba348b544..0000000000 Binary files a/audio/skill/xinpojun2.mp3 and /dev/null differ diff --git a/audio/skill/yingtian1.mp3 b/audio/skill/yingtian1.mp3 new file mode 100644 index 0000000000..40f91c8466 Binary files /dev/null and b/audio/skill/yingtian1.mp3 differ diff --git a/audio/skill/yingtian2.mp3 b/audio/skill/yingtian2.mp3 new file mode 100644 index 0000000000..711143e5c2 Binary files /dev/null and b/audio/skill/yingtian2.mp3 differ diff --git a/audio/skill/yingyou1.mp3 b/audio/skill/yingyou1.mp3 new file mode 100644 index 0000000000..e26964d152 Binary files /dev/null and b/audio/skill/yingyou1.mp3 differ diff --git a/audio/skill/yingyou2.mp3 b/audio/skill/yingyou2.mp3 new file mode 100644 index 0000000000..3270146321 Binary files /dev/null and b/audio/skill/yingyou2.mp3 differ diff --git a/audio/skill/yingyou3.mp3 b/audio/skill/yingyou3.mp3 new file mode 100644 index 0000000000..89226eb363 Binary files /dev/null and b/audio/skill/yingyou3.mp3 differ diff --git a/audio/skill/yingyou4.mp3 b/audio/skill/yingyou4.mp3 new file mode 100644 index 0000000000..ca22dffd74 Binary files /dev/null and b/audio/skill/yingyou4.mp3 differ diff --git a/audio/skill/zhenfeng1.mp3 b/audio/skill/zhenfeng1.mp3 new file mode 100644 index 0000000000..85cbf2cf4c Binary files /dev/null and b/audio/skill/zhenfeng1.mp3 differ diff --git a/audio/skill/zhenfeng2.mp3 b/audio/skill/zhenfeng2.mp3 new file mode 100644 index 0000000000..f71b5b4f75 Binary files /dev/null and b/audio/skill/zhenfeng2.mp3 differ diff --git a/card/gujian.js b/card/gujian.js index 1abf7e3b3d..0690dc8080 100644 --- a/card/gujian.js +++ b/card/gujian.js @@ -1139,7 +1139,7 @@ game.import("card", function () { intro: { content: function (storage, player) { return ( - "出牌阶段限一次,你可以弃置一张基本牌并发现一张牌,持续两回合(剩余" + + "出牌阶段限一次,你可以弃置一张基本牌并发现一张牌,持续三回合(剩余" + player.storage.luyugeng_markcount + "回合)" ); diff --git a/card/guozhan.js b/card/guozhan.js index be87848e2b..98a91d709a 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -47,7 +47,7 @@ game.import("card", function () { return target != player && !target.isMinHp(); }, async content(event, trigger, player) { - const target = event.target; + const target = event.target, judge = get.mode() == 'guozhan' ? 'identity' : 'group'; if (!target.isIn()) return; const str = get.translation(target); const card = new lib.element.VCard({ name: "sha" }); @@ -60,25 +60,25 @@ game.import("card", function () { if (!target.isIn()) return; if (!current || !current.isIn() || current.hasSkill("diaohulishan")) continue; let choiceList = [ - "弃置一张牌,视为对" + str + "使用一张【杀】", - "弃置" + str + "一张牌", - ], + "弃置一张牌,视为对" + str + "使用一张【杀】", + "弃置" + str + "一张牌", + ], choices = ["出杀", "弃牌", "cancel2"]; - if (current.identity == "wei") { + if (current[judge] == "wei") { choiceList[0] = choiceList[0].slice(6); choiceList[1] = "获得" + choiceList[1].slice(2); choices[1] = "得牌"; } if ( !current.canUse(card, target, false) || - (current.identity != "wei" && !current.countDiscardableCards(current, "he")) + (current[judge] != "wei" && !current.countDiscardableCards(current, "he")) ) { choiceList[0] = '' + choiceList[0] + ""; choices.remove("出杀"); } if (!target.countCards("he")) { choiceList[1] = '' + choiceList[1] + ""; - choices.remove(current.identity == "wei" ? "得牌" : "弃牌"); + choices.remove(current[judge] == "wei" ? "得牌" : "弃牌"); } if (choices.length > 1) { const { @@ -102,7 +102,7 @@ game.import("card", function () { if ( choices.includes("出杀") && get.effect(player, guohe, player) + get.effect(target, sha, player) > - num + num ) return "出杀"; if (choices.includes("得牌") && num > 0) return "得牌"; @@ -111,11 +111,11 @@ game.import("card", function () { }); if (control != "cancel2") { if (control == "出杀") { - if (current.identity != "wei") await current.chooseToDiscard("he", true); + if (current[judge] != "wei") await current.chooseToDiscard("he", true); await current.useCard(card, target, false); } else await current[ - current.identity == "wei" ? "gainPlayerCard" : "discardPlayerCard" + current[judge] == "wei" ? "gainPlayerCard" : "discardPlayerCard" ](target, true, "he").set("boolline", true); } } @@ -145,22 +145,23 @@ game.import("card", function () { enable: true, filterTarget: true, selectTarget: [1, Infinity], - content: function () { - "step 0"; - var p1 = "请选择【杀】的目标", + async content(event, trigger, player) { + const target = event.target, judge = get.mode() == 'guozhan' ? 'identity' : 'group'; + let p1 = "请选择【杀】的目标", p2 = "或点击「取消」摸一张牌"; - if (target.identity == "shu") { + if (target[judge] == "shu") { p1 += "(伤害+1)"; p2 = "或点击「取消」摸两张牌"; } - var next = target.chooseUseTarget("sha", p1, p2, false); - if (target.identity == "shu") + const next = target.chooseUseTarget("sha", p1, p2, false); + if (target[judge] == "shu") { next.set("oncard", function () { _status.event.baseDamage++; }); - "step 1"; + } + const result = await next.forResult(); if (!result.bool) { - target.draw(target.identity == "shu" ? 2 : 1); + target.draw(target[judge] == "shu" ? 2 : 1); } }, ai: { @@ -194,56 +195,33 @@ game.import("card", function () { return target == player; }, modTarget: true, - content: function () { - "step 0"; - target.draw(8); - "step 1"; - target.chooseToDiscard("请弃置至少六张手牌", [6, target.countCards("h")], true, "h"); - if (target.identity != "wu") event.finish(); - "step 2"; - if (!result.cards || !result.cards.length) event.finish(); - event.give_cards = result.cards; - event.given_list = []; - "step 3"; - event.give_cards = event.give_cards.filterInD("d"); - if ( - !event.give_cards.length || - !game.hasPlayer(function (current) { - return ( - current != target && - current.identity == "wu" && - !event.given_list.includes(current) - ); - }) - ) - event.finish(); - else { - target.chooseButton(["是否将弃置的牌交给其他吴势力角色?", event.give_cards], [1, 2]); - } - "step 4"; - if (result.bool) { - event.cards2 = result.links; - target - .chooseTarget( - true, - "选择获得" + get.translation(event.cards2) + "的角色", - function (card, player, target) { - return ( - target != player && - target.identity == "wu" && - !_status.event.targets.includes(target) - ); - } - ) - .set("targets", event.given_list); - } else event.finish(); - "step 5"; - if (result.bool && result.targets && result.targets.length) { - var current = result.targets[0]; - target.line(current, "green"); - current.gain(event.cards2, "gain2").giver = player; - event.given_list.push(current); - event.goto(3); + async content(event, trigger, player) { + const target = event.target, judge = get.mode() == 'guozhan' ? 'identity' : 'group'; + await target.draw(8); + const result = await target.chooseToDiscard("请弃置至少六张手牌", [6, target.countCards("h")], true, "h").forResult(); + if (target[judge] != "wu" || !result.cards || !result.cards.length) return; + const give_cards = result.cards.filterInD("d"), give_list = []; + if (!give_cards.length) return; + while (game.hasPlayer(function (current) { + return (current != target && current[judge] == "wu" && !give_list.includes(current)); + })) { + const result2 = await target.chooseButton(["是否将弃置的牌交给其他吴势力角色?", give_cards], [1, 2]).forResult(); + if (result2.bool) { + const cards2 = result2.links; + const result3 = await target.chooseTarget(true, "选择获得" + get.translation(cards2) + "的角色", function (card, player, target) { + return (target != player && target[judge] == "wu" && !_status.event.targetx.includes(target)); + }).set("targetx", give_list).forResult(); + if (result3.bool && result3.targets && result3.targets.length) { + const current = result3.targets[0]; + target.line(current, "green"); + const next = current.gain(cards2, "gain2"); + next.giver = target; + await next; + give_list.push(current); + give_cards.removeArray(cards2); + } + else break; + } else break; } }, ai: { @@ -266,15 +244,16 @@ game.import("card", function () { }, result: { target: function (player, target) { - if (target.identity != "wu") return 3; + const judge = get.mode() == 'guozhan' ? 'identity' : 'group'; + if (target[judge] != "wu") return 3; return Math.max( 3, Math.min( 8, 2 * - game.countPlayer(function (current) { - return current.identity == "wu"; - }) + game.countPlayer(function (current) { + return current[judge] == "wu"; + }) ) ); }, @@ -292,76 +271,50 @@ game.import("card", function () { ignoreTarget: function (card, player, target) { return target.countCards("h") == 0; }, - content: function () { - "step 0"; - if (!target.countCards("h") || !player.isIn()) event.finish(); + async content(event, trigger, player) { + const target = event.target, judge = get.mode() == 'guozhan' ? 'identity' : 'group'; + if (!target.countCards("h") || !player.isIn()) return; else target.showHandcards(); - "step 1"; - var str = get.translation(target); - player - .chooseControl() - .set("prompt", "文和乱武:请选择一项") - .set("choiceList", [ - "令" + str + "弃置两张类型不同的手牌", - "弃置" + str + "的一张手牌", - ]) - .set("ai", () => { - let target = _status.event.getParent().target, - hs = target.getCards("h"), - type = [], - att = get.attitude(_status.event.player, target); - if (hs.length < 2) return att > 0 ? 1 : 0; - hs.forEach((i) => { - type.add(get.type2(i, target)); - }); - if (target.identity !== "qun") { - if (Boolean(att > 0) === Boolean(type.length > 1)) return 1; - return 0; - } - if (type.length < 2 || target.hp < 3) return att > 0 ? 1 : 0; - if (hs.length === 2) return att > 0 ? 0 : 1; - return att > 0 ? 1 : 0; + const str = get.translation(target); + const result = await player.chooseControl().set("prompt", "文和乱武:请选择一项").set("choiceList", [ + "令" + str + "弃置两张类型不同的手牌", + "弃置" + str + "的一张手牌", + ]).set("ai", () => { + let target = _status.event.getParent().target, + hs = target.getCards("h"), + type = [], + att = get.attitude(_status.event.player, target); + if (hs.length < 2) return att > 0 ? 1 : 0; + hs.forEach((i) => { + type.add(get.type2(i, target)); }); - "step 2"; + if (target[judge] !== "qun") { + if (Boolean(att > 0) === Boolean(type.length > 1)) return 1; + return 0; + } + if (type.length < 2 || target.hp < 3) return att > 0 ? 1 : 0; + if (hs.length === 2) return att > 0 ? 0 : 1; + return att > 0 ? 1 : 0; + }).forResult(); + let result2; if (result.index == 0) { - var list = [], - hs = target.getCards("h"); - for (var i of hs) { + let list = [], hs = target.getCards("h"); + for (let i of hs) { if (lib.filter.cardDiscardable(i, target, "gz_wenheluanwu")) list.add(get.type2(i, target)); if (list.length > 1) break; } - if (list.length > 1) - target - .chooseToDiscard( - "h", - true, - "请弃置两张类型不同的手牌", - 2, - function (card, player) { - if (!ui.selected.cards.length) return true; - return ( - get.type2(card, target) != get.type2(ui.selected.cards[0], target) - ); - } - ) - .set("complexCard", true); - else if (list.length == 1) target.chooseToDiscard("h", true); - else event.finish(); - } else { - player.discardPlayerCard(target, "h", true, "visible"); + if (list.length > 1) { + result2 = await target.chooseToDiscard("h", true, "请弃置两张类型不同的手牌", 2, function (card, player) { + if (!ui.selected.cards.length) return true; + return (get.type2(card, target) != get.type2(ui.selected.cards[0], target)); + }).set("complexCard", true).forResult(); + } + else if (list.length == 1) result2 = await target.chooseToDiscard("h", true).forResult(); + else return; } - "step 3"; - if ( - target.identity != "qun" || - !result.bool || - !result.cards || - !result.cards.length || - target.countCards("h") > 0 || - target.hp < 1 - ) - event.finish(); - else target.draw(Math.min(5, target.hp)); + else result2 = await player.discardPlayerCard(target, "h", true, "visible").forResult(); + if (target[judge] == "qun" && target.isIn() && !target.countCards('h') && result2.bool) await target.draw(Math.min(5, target.hp)); }, ai: { order: 6, diff --git a/character/clan/skill.js b/character/clan/skill.js index 84e7cd145e..2003c6b634 100644 --- a/character/clan/skill.js +++ b/character/clan/skill.js @@ -4,9 +4,14 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; const skills = { //族钟繇 clanchengqi: { + getUsed: player => + player + .getHistory("useCard", evt => ["basic", "trick"].includes(get.type(evt.card, null, false))) + .map(evt => get.name(evt.card)) + .toUniqued(), hiddenCard(player, name) { if (get.type(name) != "basic" && get.type(name) != "trick") return false; - if (player.getStorage("clanchengqi_effect").includes(name)) return false; + if (get.info("clanchengqi").getUsed(player).includes(name)) return false; return player.countCards("hs") > 1 && lib.inpile.includes(name); }, audio: 2, @@ -17,17 +22,23 @@ const skills = { .inpileVCardList(info => { const name = info[2]; if (get.type(name) != "basic" && get.type(name) != "trick") return false; - return !player.getStorage("clanchengqi_effect").includes(name); + return !(event.clanchengqi || []).includes(name); }) .some(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); }, + onChooseToUse(event) { + if (!game.online && !event.clanchengqi) { + const player = event.player; + event.set("clanchengqi", get.info("clanchengqi").getUsed(player)); + } + }, chooseButton: { dialog(event, player) { const list = get .inpileVCardList(info => { const name = info[2]; if (get.type(name) != "basic" && get.type(name) != "trick") return false; - return !player.getStorage("clanchengqi_effect").includes(name); + return !(event.clanchengqi || []).includes(name); }) .filter(card => event.filterCard({ name: card[2], nature: card[3] }, player, event)); return ui.create.dialog("承启", [list, "vcard"]); @@ -76,7 +87,6 @@ const skills = { position: "hs", precontent() { player.addTempSkill("clanchengqi_effect"); - player.markAuto("clanchengqi_effect", [event.result.card.name]); }, }; }, @@ -91,7 +101,7 @@ const skills = { .inpileVCardList(info => { const name = info[2]; if (get.type(name) != "basic" && get.type(name) != "trick") return false; - return !player.getStorage("clanchengqi_effect").includes(name); + return !get.info("clanchengqi").getUsed(player).includes(name); }) .map(card => { return { name: card[2], nature: card[3] }; @@ -116,7 +126,6 @@ const skills = { backup: { audio: "clanchengqi" }, effect: { charlotte: true, - onremove: true, trigger: { player: "useCard" }, filter(event, player) { return ( @@ -826,10 +835,12 @@ const skills = { var target = event.targets.shift(); event.target = target; var list = []; + const nameFilter = trigger.card.name == "sha" + ? name => get.type(name) == "trick" + : name => name == "sha"; for (var name of lib.inpile) { if (name != "sha" && get.type(name) != "trick") continue; - if (trigger.card.name == "sha" && get.type(name) != "trick") continue; - if (name == "sha" && get.type(trigger.card) != "trick") continue; + if (!nameFilter(name)) continue; if (!player.canUse(get.autoViewAs({ name: name }, []), target)) continue; list.push([get.translation(get.type(name)), "", name]); } @@ -870,10 +881,18 @@ const skills = { clanjianyuan: { inherit: "clanchenya", filter(event, player) { + if (event.type != "player") return false; + var skill = event.sourceSkill || event.skill; + var info = get.info(skill); + if (info.charlotte) return false; + var translation = get.skillInfoTranslation(skill, event.player); + if (!translation) return false; + var match = get.plainText(translation).match(/“?出牌阶段限一次/g); + if (!match || match.every(value => value != "出牌阶段限一次") || !event.player.countCards("he")) return false; for (var phase of lib.phaseName) { var evt = event.getParent(phase); if (evt && evt.name == phase) { - if (event.player.getHistory("useCard", evtx => evtx.getParent(phase) == evt).length) return lib.skill.clanchenya.filter(event, player); + if (event.player.getHistory("useCard", evtx => evtx.getParent(phase) == evt).length) return true; } } return false; @@ -1346,7 +1365,7 @@ const skills = { if (info.charlotte) return false; var translation = get.skillInfoTranslation(skill, event.player); if (!translation) return false; - var match = translation.match(/“?出牌阶段限一次/g); + var match = get.plainText(translation).match(/“?出牌阶段限一次/g); if (!match || match.every(value => value != "出牌阶段限一次")) return false; return event.player.countCards("h") > 0; }, @@ -2408,7 +2427,7 @@ const skills = { event.loser.chooseUseTarget(true, card, false); } else event.goto(5); "step 4"; - if (cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i)).length) event.goto(3); + if (cards.filter(i => get.position(i, true) == "d" && event.loser.hasUseTarget(i)).length) event.goto(2); "step 5"; if (get.distance(player, target) != event.distance[0] || get.distance(target, player) != event.distance[1]) { player.restoreSkill("clanxumin"); @@ -2694,7 +2713,8 @@ const skills = { if (result.bool) { var cards = result.cards; target.give(cards, player); - game.delayx(); + if (!cards.length) event.finish(); + else game.delayx(); } else event.finish(); "step 3"; if (trigger.cards.filterInD().length) target.gain(trigger.cards.filterInD(), "gain2", "bySelf"); diff --git a/character/clan/translate.js b/character/clan/translate.js index 55a6ef3f60..b616b94b81 100644 --- a/character/clan/translate.js +++ b/character/clan/translate.js @@ -116,7 +116,7 @@ const translates = { clan_wangguang: "族王广", clan_wangguang_prefix: "族", clanlilun: "离论", - clanlilun_info: "出牌阶段限一次,你可以重铸两张手牌(不能是你本回合以此法重铸过的牌名的牌),然后使用其中的一张牌。", + clanlilun_info: "出牌阶段限一次,你可以重铸两张牌名相同的手牌(不能是你本回合以此法重铸过的牌名的牌),然后使用其中的一张牌。", clanjianji: "见机", clanjianji_info: "限定技,一名角色的结束阶段,若其上下家均未于本回合:使用过牌,则你可以与其各摸一张牌;成为过牌的目标,则你可以视为使用一张【杀】。", clan_wangmingshan: "族王明山", @@ -128,7 +128,7 @@ const translates = { clan_zhongyao: "族钟繇", clan_zhongyao_prefix: "族", clanchengqi: "承启", - clanchengqi_info: "你可以将至少两张手牌当作本回合未以此法转换过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。", + clanchengqi_info: "你可以将至少两张手牌当作本回合未使用过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。", clanjieli: "诫厉", clanjieli_info: "结束阶段,你可以选择一名角色,你观看其手牌中牌名字数最多的牌和牌堆顶的X张牌,然后你可以交换其中的任意张牌(X为你本回合使用过的牌中的牌名字数最大值)。", }; diff --git a/character/collab/character.js b/character/collab/character.js index 60b23bc808..7a253daba5 100644 --- a/character/collab/character.js +++ b/character/collab/character.js @@ -1,27 +1,30 @@ const characters = { dc_zhaoyun: ["male", "shen", 1, ["boss_juejing", "dclonghun", "dczhanjiang"], ["shu", "InitFilter:noZhuHp:noZhuSkill"]], dc_sunce: ["male", "wu", 4, ["dcshuangbi"]], - nezha: ["male", "qun", 3, ["dcsantou", "dcfaqi"], ["InitFilter:noZhuHp"]], + nezha: ["male", "qun", 3, ["dcsantou", "dcfaqi"], ["InitFilter:noZhuHp", "name:李|哪吒"]], dc_caocao: ["male", "wei", 4, ["dcjianxiong"]], dc_liubei: ["male", "shu", 4, ["dcrende"]], dc_sunquan: ["male", "wu", 4, ["dczhiheng"]], zhutiexiong: ["male", "qun", 3, ["dcbianzhuang"]], wu_zhutiexiong: ["male", "qun", 3, ["dcbianzhuang"], ["unseen"]], - xiaoyuehankehan: ["male", "qun", 3, ["dctongliao", "dcwudao"], ["die:true","die:3"]], + xiaoyuehankehan: ["male", "qun", 3, ["dctongliao", "dcwudao"], ["die:true", "die:3", "name:null|null"]], libai: ["male", "qun", 3, ["dclbjiuxian", "dcshixian"], ["die:true", "die:2"]], sunwukong: ["male", "qun", 3, ["dcjinjing", "dccibei", "dcruyi"]], - longwang: ["male", "qun", 3, ["dclonggong", "dcsitian"]], - taoshen: ["male", "qun", 3, ["dcnutao"]], + longwang: ["male", "qun", 3, ["dclonggong", "dcsitian"], ["name:敖|广"]], + taoshen: ["male", "qun", 3, ["dcnutao"], ["name:伍|子胥"]], sunyang: ["male", "wu", 4, ["clbshuijian"]], yeshiwen: ["female", "wu", 3, ["clbjisu", "clbshuiyong"]], sp_jiben: ["male", "qun", 3, ["spduanzhi", "spduyi"]], sp_fuhuanghou: ["female", "qun", 3, ["spcangni", "spmixin"]], sp_fuwan: ["male", "qun", 3, ["spfengyin", "spchizhong"]], - old_lingju: ["female", "qun", 3, ["jieyuan", "fenxin_old"]], + old_lingju: ["female", "qun", 3, ["jieyuan", "fenxin_old"], ["name:吕|null"]], sp_mushun: ["male", "qun", 4, ["moukui"]], dc_wuyi: ["male", "shu", 4, ["dcbenxi"]], - quyuan: ["male", "qun", 3, ["dcqiusuo", "dclisao"]], + quyuan: ["male", "qun", 3, ["dcqiusuo", "dclisao"], ["name:芈|原"]], xin_sunquan: ["male", "wu", 3, ["dchuiwan", "dchuanli"]], + wuhujiang: ["male", "shu", 4, ["olhuyi"], ["name:关|羽-张|飞-赵|云-马|超-黄|忠", "die:true", "die:5"]], + dc_noname: ["male", "qun", 3, ["dcchushan"], ["name:null|null"]], + dc_xunyuxunyou: ["male", "wei", 3, ["dczhinang", "dcgouzhu"], ["name:荀|彧-荀|攸"]], }; export default characters; diff --git a/character/collab/intro.js b/character/collab/intro.js index 5321c5b073..c68ee20e3d 100644 --- a/character/collab/intro.js +++ b/character/collab/intro.js @@ -1,4 +1,7 @@ const characterIntro = { + dc_noname: " ", + dc_xunyuxunyou: "请分别查看「荀彧」和「荀攸」的武将介绍。", + wuhujiang: "请分别查看「关羽」、「张飞」、「赵云」、「马超」和「黄忠」的武将介绍。", quyuan: "屈原(约前340年~前278年),芈姓(一作嬭姓),屈氏,名平,字原,又自云名正则,字灵均,出生于楚国丹阳秭归(今湖北省宜昌市),战国时期楚国诗人、政治家。楚武王熊通之子屈瑕的后代(一说屈氏的来源是西周前期的楚国人屈紃)。屈原少年时受过良好的教育,博闻强识,志向远大。早年受楚怀王信任,任左徒、三闾大夫,兼管内政外交大事。提倡“美政”,主张对内举贤任能,修明法度,对外力主联齐抗秦。因遭贵族排挤诽谤,被先后流放至汉北和沅湘流域。前278年,楚国郢都被秦军攻破后,自沉于汨罗江,以身殉楚国。屈原是中国历史上一位伟大的爱国诗人,中国浪漫主义文学的奠基人,“楚辞”的创立者和代表作家,开辟了“香草美人”的传统,被誉为“楚辞之祖”,楚国有名的辞赋家宋玉、唐勒、景差都受到屈原的影响。屈原作品的出现,标志着中国诗歌进入了一个由大雅歌唱到浪漫独创的新时代,其主要作品有《离骚》《九歌》《九章》《天问》等。以屈原作品为主体的《楚辞》是中国浪漫主义文学的源头之一,对后世诗歌产生了深远影响。成为中国文学史上的璀璨明珠,“逸响伟辞,卓绝一世”。“路漫漫其修远兮,吾将上下而求索”,屈原的“求索”精神,成为后世仁人志士所信奉和追求的一种高尚精神。", sunwukong: "孙悟空是中国古典小说《西游记》的主人公,也是中国神话中的民俗神祇之一,明代百回本《西游记》书中最为深入人心的形象之一。《西游记》中的孙悟空本是天地生成的一个石猴,率领群猴在花果山水帘洞过着逍遥自在的日子,后来为学习长生的法术而拜菩提祖师为师,学会了七十二变和筋斗云等绝技。后来他前往东海龙宫夺取如意金箍棒,又大闹地府勾了生死簿,惊动天庭,天庭两次派兵征讨花果山,仍然降他不得,只好请西天如来佛祖前来助阵。如来佛祖以五行山将悟空压在山下五百年。五百年后,悟空在观音菩萨的指点下拜唐僧为师,并跟随唐僧前往西天求取真经。路上唐僧又收了猪八戒、沙和尚两个徒弟,众人在途中斩妖除魔、历经磨难,终于取得真经,修成正果。", longwang: "东海龙王,名敖广,是中国古代神话传说中的龙族之王,为“四海龙王”之首,亦为所有水族之王。统治东海之洋,主宰着雨水、雷鸣、洪灾、海潮、海啸等。曾下陷东京、水淹陈塘关(影视设定)。在中国以东方为尊位,按周易来说东为阳,故此东海龙王排第一便是理所应当。常记载于《西游记》《封神演义》《三教搜神大全》等文学典籍。东海龙王居于东海的海底水晶宫(花果山瀑布顺流可直抵龙宫)。虽为司雨之神,但其保持着较大的特殊自由性,人间降雨由其它江河湖井龙王完成,很少需要东海龙王亲自降雨。海洋管辖之权为龙王所有,天庭一般任其自治。", diff --git a/character/collab/skill.js b/character/collab/skill.js index 8c94c3b46d..ae1ded654b 100644 --- a/character/collab/skill.js +++ b/character/collab/skill.js @@ -2,6 +2,375 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //荀彧荀攸 + dczhinang: { + getMap() { + if (!_status.dczhinang_map) { + _status.dczhinang_map = { + name: {}, + info: {}, + }; + let list; + if (_status.connectMode) { + list = get.charactersOL(); + } else { + list = get.gainableCharacters(); + } + list.forEach(name => { + if (name !== "dc_xunyuxunyou") { + const skills = get.character(name, 3); + skills.forEach(skill => { + const info = get.info(skill); + if (!info || (info.ai && info.ai.combo)) return; + if (skill in _status.dczhinang_map) return; + if (get.translation(skill).includes("谋")) _status.dczhinang_map.name[skill] = name; + const voices = game.parseSkillText(skill, name); + if (voices.some(data => data.includes("谋"))) { + _status.dczhinang_map.info[skill] = name; + } + }); + } + }); + } + return _status.dczhinang_map; + }, + trigger: { + player: "useCardAfter", + }, + filter(event, player) { + return ["trick", "equip"].includes(get.type2(event.card)); + }, + frequent: true, + async content(event, trigger, player) { + const map = lib.skill.dczhinang.getMap(), + type = get.type2(trigger.card) == "equip" ? "name" : "info", + list = Object.keys(map[type]); + if (list.length > 0) { + const skill = list.randomGet(), + voiceMap = game.parseSkillTextMap(skill, map[type][skill]); + if (type == "info") { + findaudio: for (let data of voiceMap) { + if (!data.text) continue; + if (data.text.includes("谋")) { + player.chat(data.text); + game.broadcastAll(file => game.playAudio(file), data.file); + break findaudio; + } + } + } + else player.flashAvatar("dczhinang", map[type][skill]) + player.popup(skill); + await player.addSkills(skill); + } + }, + }, + dcgouzhu: { + trigger: { + player: ["useSkillAfter", "logSkill"], + }, + filter(event, player) { + if (["global", "equip"].includes(event.type)) return false; + let skill = event.sourceSkill || event.skill; + if (!skill || skill == "dcgouzhu") return false; + let info = get.info(skill); + while (true) { + if (!info || info.charlotte || info.equipSkill) return false; + if (info && !info.sourceSkill) break; + skill = info.sourceSkill; + info = get.info(skill); + } + let list = get.skillCategoriesOf(skill, player); + return list.length && list.some(item => item in lib.skill.dcgouzhu.effectMap); + }, + frequent: true, + effectMap: { + "锁定技": async function () { + let player = _status.event.player; + if (player.isDamaged()) await player.recover(); + }, + "觉醒技": async function () { + let player = _status.event.player; + let card = get.cardPile(card => get.type(card) == "basic"); + if (card) await player.gain(card, "gain2"); + }, + "限定技": async function () { + let player = _status.event.player; + let target = game.filterPlayer(current => current != player).randomGet(); + if (target) { + player.line(target, "green"); + await target.damage(player); + } + }, + "转换技": async function () { + let player = _status.event.player; + player.addMark("dcgouzhu", 1, false); + game.log(player, '手牌上限+1'); + await game.asyncDelay(); + }, + "主公技": async function () { + let player = _status.event.player; + await player.gainMaxHp(); + }, + }, + mod: { + maxHandcard: function (player, num) { + return num + player.countMark("dcgouzhu"); + }, + }, + intro: { + content: "手牌上限+#", + }, + locked: false, + onremove: true, + async content(event, trigger, player) { + let skill = trigger.sourceSkill || trigger.skill, + info = get.info(skill); + while (true) { + if (info && !info.sourceSkill) break; + skill = info.sourceSkill; + info = get.info(skill); + } + let list = get.skillCategoriesOf(skill, player); + for (const item of list) { + if (item in lib.skill.dcgouzhu.effectMap) { + const next = game.createEvent("dcgouzhu_effect", false); + next.player = player; + next.setContent(lib.skill.dcgouzhu.effectMap[item]); + await next; + } + } + }, + }, + //五虎将 + //是的孩子们,我们意念合一 + olhuyi: { + audio: 5, + getList() { + let list, + skills = []; + if (get.mode() == "guozhan") { + list = []; + for (const i in lib.characterPack.mode_guozhan) { + if (lib.character[i]) list.push(i); + } + } else if (_status.connectMode) list = get.charactersOL(); + else { + list = []; + for (const i in lib.character) { + if (lib.filter.characterDisabled2(i) || lib.filter.characterDisabled(i)) continue; + list.push(i); + } + } + const wuhuList = list.filter(character => ["关羽", "张飞", "赵云", "马超", "黄忠"].includes(get.rawName(character))); + for (const i of wuhuList) { + skills.addArray( + (lib.character[i][3] || []).filter(skill => { + const info = get.info(skill); + return info && !info.zhuSkill && !info.hiddenSkill && !info.charlotte && !info.groupSkill && !info.limited && !info.juexingji; + }) + ); + } + return skills; + }, + getBasic(event, player) { + const name = event.card.name, + skills = get + .info("olhuyi") + .getList() + .filter(skill => { + const translation = get.skillInfoTranslation(skill, player); + if (!translation) return false; + const info = get.plainText(translation); + const reg = `【${get.translation(name)}】`; + if (name == "sha") { + for (let nature of lib.inpile_nature) { + const reg1 = `【${get.translation(nature) + get.translation(name)}】`, + reg2 = `${get.translation(nature)}【${get.translation(name)}】`; + if (info.includes(reg1) || info.includes(reg2)) return true; + } + } + return info.includes(reg); + }); + return skills; + }, + excludedskills: ["boss_juejing", "xinlonghun", "relonghun", "sbwusheng", "jsrgnianen", "jsrgguanjue", "shencai", "sbpaoxiao", "sbliegong", "pshengwu"], + trigger: { + global: "phaseBefore", + player: ["enterGame", "useCardAfter", "respondAfter"], + }, + filter(event, player) { + if (["useCard", "respond"].includes(event.name)) { + if (get.type(event.card) != "basic") return false; + if ( + !get + .info("olhuyi") + .getBasic(event, player) + .some(skill => !player.hasSkill(skill, null, null, false)) + ) + return false; + return !player.additionalSkills.olhuyi || (player.additionalSkills.olhuyi && player.additionalSkills.olhuyi.length < 5); + } + const skills = get.info("olhuyi").getList(); + return (event.name != "phase" || game.phaseNumber == 0) && skills.some(skill => !player.hasSkill(skill, null, null, false)); + }, + locked: true, + async cost(event, trigger, player) { + if (["useCard", "respond"].includes(trigger.name)) { + event.result = { + bool: true, + }; + } else { + const skills = get + .info("olhuyi") + .getList() + .filter(skill => !player.hasSkill(skill, null, null, false)) + .randomGets(3); + const list = []; + for (const skill of skills) { + list.push([skill, '"]); + } + const next = player.chooseButton(["虎翼:请选择获得其中一个技能", [list, "textbutton"]]); + next.set("forced", true); + next.set("ai", button => { + const skill = button.link, + choice = get.event("choice"); + if (get.info("olhuyi").excludedskills.includes(skill)) return 3; + if (skill == choice) return 2; + return 1; + }); + next.set( + "choice", + skills.sort((a, b) => { + return get.skillRank(b, "in") - get.skillRank(a, "in"); + })[0] + ); + const links = await next.forResultLinks(); + event.result = { + bool: true, + cost_data: links, + }; + } + }, + async content(event, trigger, player) { + const skill = ["useCard", "respond"].includes(trigger.name) + ? get + .info("olhuyi") + .getBasic(trigger, player) + .filter(skill => !player.hasSkill(skill, null, null, false)) + .randomGets(1) + : event.cost_data; + player.addAdditionalSkills("olhuyi", skill, true); + }, + group: "olhuyi_remove", + subSkill: { + remove: { + audio: "olhuyi", + trigger: { + player: "phaseEnd", + }, + filter(event, player) { + return player.additionalSkills.olhuyi && player.additionalSkills.olhuyi.length; + }, + async cost(event, trigger, player) { + const skills = player.additionalSkills.olhuyi; + const list = []; + for (const skill of skills) { + list.push([skill, '"]); + } + const next = player.chooseButton(["虎翼:你可以失去其中一个技能", [list, "textbutton"]]); + next.set("ai", button => { + const skill = button.link; + let skills = get.event("skills").slice(0); + skills.removeArray(get.info("olhuyi").excludedskills); + if (skills.length < 4) return 0; + if (skills.includes(skill)) return 2; + return Math.random(); + }); + next.set("skills", skills); + const { + result: { bool, links }, + } = await next; + event.result = { + bool: bool, + cost_data: links, + }; + }, + async content(event, trigger, player) { + player.changeSkills([], event.cost_data).set("$handle", (player, addSkills, removeSkills) => { + game.log( + player, + "失去了技能", + ...removeSkills.map(i => { + return "#g【" + get.translation(i) + "】"; + }) + ); + player.removeSkill(removeSkills); + const additionalSkills = player.additionalSkills.olhuyi; + additionalSkills.removeArray(removeSkills); + if (!additionalSkills.length) delete player.additionalSkills.olhuyi; + }); + }, + }, + }, + }, + //无名 + dcchushan: { + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + async content(event, trigger, player) { + if (!_status.characterlist) lib.skill.pingjian.initList(); + _status.characterlist.randomSort(); + const characters = _status.characterlist.randomGets(6); + const first = characters.slice(0, 3), + last = characters.slice(3, 6); + const skills1 = [], + skills2 = []; + for (let i of first) skills1.push(get.character(i, 3).randomGet()); + for (let i of last) skills2.push(get.character(i, 3).randomGet()); + const result1 = await player + .chooseControl(skills1) + .set("dialog", ["无名:请选择姓氏", [first, "character"]]) + .forResult(); + const gains = []; + let surname = first[skills1.indexOf(result1.control)]; + gains.add(result1.control); + const result2 = await player + .chooseControl(skills2) + .set("dialog", ["无名:请选择名字", [last, "character"]]) + .forResult(); + let name = last[skills2.indexOf(result2.control)]; + gains.add(result2.control); + let newname = get.characterSurname(surname).randomGet()[0] + get.characterSurname(name).randomGet()[1]; + if (newname === "某") { + newname = "无名氏"; + player.chat("终究还是落得藉藉无名..."); + } + game.broadcastAll( + (player, name, list) => { + if (player.name == "dc_noname" || player.name1 == "dc_noname") player.node.name.innerHTML = name; + if (player.name2 == "dc_noname") player.node.name2.innerHTML = name; + player.tempname.addArray( + list.map(name => { + while (get.character(name).tempname.length > 0) { + name = get.character(name).tempname[0]; + } + return name; + }) + ); + }, + player, + newname, + [surname, name] + ); + await player.addSkills(gains); + }, + }, //会玩孙权 dchuiwan: { audio: 2, @@ -350,11 +719,13 @@ const skills = { cardx.sort((a, b) => get.effect(target, b, player, player) - get.effect(target, a, player, player)); cardx = cardx.slice(Math.min(cardx.length, player.getCardUsable("sha")), cardx.length); cards.removeArray(cardx); - return cards.reduce((sum, card) => { - if (player.canUse(card, target)) return sum + get.effect(target, card, player, target); - if (player.canUse(card, target, false)) return sum + get.effect(target, card, player, target) / 10; - return 0; - }, 0) - 10; + return ( + cards.reduce((sum, card) => { + if (player.canUse(card, target)) return sum + get.effect(target, card, player, target); + if (player.canUse(card, target, false)) return sum + get.effect(target, card, player, target) / 10; + return 0; + }, 0) - 10 + ); }, }, }, diff --git a/character/collab/sort.js b/character/collab/sort.js index ea731ce76f..f189ba6d59 100644 --- a/character/collab/sort.js +++ b/character/collab/sort.js @@ -5,6 +5,8 @@ const characterSort = { collab_decade: ["libai", "xiaoyuehankehan", "zhutiexiong", "wu_zhutiexiong"], collab_remake: ["dc_caocao", "dc_liubei", "dc_sunquan", "nezha", "dc_sunce", "dc_zhaoyun", "dc_wuyi"], collab_duanwu_2024: ["quyuan", "xin_sunquan"], + collab_dcdoudizhui: ["dc_noname", "dc_xunyuxunyou"], + collab_oldoudizhu: ["wuhujiang"], }; const characterSortTranslate = { @@ -14,6 +16,8 @@ const characterSortTranslate = { collab_decade: "新服·创玩节", collab_remake: "新服·共创武将", collab_duanwu_2024: "新服·端午畅玩2024", + collab_dcdoudizhui: "新服·限时地主", + collab_oldoudizhu: "OL·限时地主", }; export { characterSort, characterSortTranslate }; diff --git a/character/collab/translate.js b/character/collab/translate.js index 168becebb1..47f17614fa 100644 --- a/character/collab/translate.js +++ b/character/collab/translate.js @@ -110,6 +110,18 @@ const translates = { dchuiwan_info: "每回合每种牌名限一次,当你摸牌时,你可以放弃摸牌并改为选择至多等同于摸牌数的基本牌或锦囊牌的牌名,然后你从牌堆中获得这些牌名的牌。", dchuanli: "唤理", dchuanli_info: "结束阶段,若你本回合:使用牌至少指定三次自己为目标,则你可以令一名其他角色的所有技能失效,然后其获得〖直谏〗和〖固政〗,直到其下回合结束;使用牌至少指定三次一名其他角色为目标,则你可以令其所有技能失效,然后其获得〖英姿〗和〖反间〗,直到其下回合结束。然后若你两项均执行,你获得〖制衡〗直到你的下个回合结束。", + dc_noname: "无名", + dcchushan: "出山", + dcchushan_info: "锁定技,游戏开始时,你获得两个武将的各一个技能,并将你的武将名改为这两个武将的名字组合。", + wuhujiang: "魂五虎", + wuhujiang_prefix: "魂", + olhuyi: "虎翼", + olhuyi_info: "①游戏开始时,你从随机三个五虎将技能中选择一个获得。②当你使用或打出一张基本牌后,若你因此技能获得的技能数小于5,你随机获得一个技能描述中包含此牌名的五虎将技能。③回合结束时,你可以失去一个以此法获得的技能。", + dc_xunyuxunyou: "荀彧荀攸", + dczhinang: "智囊", + dczhinang_info: "当你使用锦囊牌后,你可以获得一个技能台词包含“谋”的技能;当你使用装备牌后,你可以获得一个技能名包含“谋”的技能。", + dcgouzhu: "苟渚", + dcgouzhu_info: "你发动技能后,若此技能为:锁定技,回复1点体力;觉醒技,获得一张基本牌;限定技,对随机一名其他角色造成1点伤害;转换技,手牌上限+1;主公技,增加1点体力上限。", }; export default translates; diff --git a/character/collab/voices.js b/character/collab/voices.js index becfbeeb6e..5b218de7d8 100644 --- a/character/collab/voices.js +++ b/character/collab/voices.js @@ -1,4 +1,14 @@ export default { + "#olhuyi1": "青龙啸赤月,长刀行千里。", + "#olhuyi2": "谋取敌将首,声震当阳桥。", + "#olhuyi3": "游龙战长坂,可复七进七出。", + "#olhuyi4": "身跨白玉鞍,铁骑踏冰河。", + "#olhuyi5": "满弓望西北,弦惊夜行之虎。", + "#wuhujiang:die": "麦城残阳息长刀……", + "#wuhujiang2:die": "当阳空余声……", + "#wuhujiang3:die": "亢龙有悔……", + "#wuhujiang4:die": "西风寒,冷铁衣……", + "#wuhujiang5:die": "年老力衰,不复当年勇……", "#dcqiusuo1": "驾八龙之婉婉兮,载云旗之委蛇。", "#dcqiusuo2": "路漫漫其修远兮,吾将上下而求索。", "#dclisao1": "朝饮木兰之坠露,夕餐秋菊之落英。", @@ -48,8 +58,6 @@ export default { "#dcnutao3": "智勇深沉,一世之雄!", "#dcnutao4": "波涛怒天,神力无边!", "#taoshen:die": "马革裹尸,身沉江心……", - "#jieyuan_more": "我所有的努力,都是为了杀你!", - "#jieyuan_less": "我必须活下去!", "#dchuiwan1": "金珠弹黄鹂,玉带做秋千,如此游戏人间。", "#dchuiwan2": "小爷横行江东,今日走马、明日弄鹰。", "#dchuanli1": "金乌当空,汝欲与我辩日否?", diff --git a/character/ddd/character.js b/character/ddd/character.js index 8499fa79db..6198c5ff40 100644 --- a/character/ddd/character.js +++ b/character/ddd/character.js @@ -18,10 +18,10 @@ const characters = { ddd_caoshuang: ["male", "wei", 5, ["dddzhuanshe", "dddweiqiu"]], ddd_xuelingyun: ["female", "wei", 3, ["dddlianer", "dddanzhi"]], ddd_liuhong: ["male", "qun", 4, ["dddshixing", "ddddanggu", "dddfuzong"], ["zhu"]], - ddd_xiahouxuan: ["male", "wei", 3, ["dddlanghuai", "dddxuanlun"]], + ddd_xiahouxuan: ["male", "wei", 3, ["dddlanghuai", "dddxuanlun"], ["name:夏侯|玄"]], ddd_zhangkai: ["male", "qun", "3/4", ["dddjiexing", "dddbailei"]], ddd_liangxi: ["male", "wei", 4, ["dddtongyu"]], - ddd_wangkanglvkai: ["male", "shu", 4, ["dddbingjian"]], + ddd_wangkanglvkai: ["male", "shu", 4, ["dddbingjian"], ["name:王|伉-吕|凯"]], // ddd_sunliang:['male','wu',3,['ddddiedang','dddanliu','dddguiying'],['zhu']], ddd_lie: ["female", "wu", 3, ["dddyeshen", "dddqiaoduan"]], ddd_kebineng: ["male", "qun", 4, ["dddxiaoxing", "dddlangzhi", "dddfuyi"], ["zhu"]], diff --git a/character/diy/character.js b/character/diy/character.js index 801d2fdf28..f5185b7601 100644 --- a/character/diy/character.js +++ b/character/diy/character.js @@ -1,8 +1,8 @@ const characters = { - noname: ["female", "key", 3, ["noname_zhuyuan", "noname_duocai"]], + noname: ["female", "key", 3, ["noname_zhuyuan", "noname_duocai"], ["name:null|无"]], ns_huangchengyan: ["male", "shu", 3, ["nslongyue", "nszhenyin"]], - ns_sunchensunjun: ["male", "wu", 5, ["nsxianhai", "nsxingchu"]], + ns_sunchensunjun: ["male", "wu", 5, ["nsxianhai", "nsxingchu"], ["name:孙|綝-孙|峻"]], ns_yuanxi: ["male", "qun", 4, ["nsshengyan", "nsdaizhan"]], ns_caoshuang: ["male", "wei", 4, ["nsjiquan", "nsfuwei"]], ns_sunyi: ["male", "wu", 4, ["nsguolie"]], @@ -13,8 +13,8 @@ const characters = { ns_zanghong: ["male", "qun", 4, ["nsshimeng"]], ns_ruanji: ["male", "wei", 3, ["nsshizui", "nsxiaoye"]], ns_limi: ["male", "jin", 3, ["nstuilun"]], - ns_zhonglimu: ["male", "wu", 4, ["nskuanhuai", "nsdingbian"]], - prp_zhugeliang: ["male", "shu", 3, ["nsxingyun", "nshanlang"]], + ns_zhonglimu: ["male", "wu", 4, ["nskuanhuai", "nsdingbian"], ["name:钟离|牧"]], + prp_zhugeliang: ["male", "shu", 3, ["nsxingyun", "nshanlang"], ["name:诸葛|亮"]], ns_zhangwei: ["female", "shu", 3, ["nsqiyue", "nsxuezhu"]], diy_wenyang: ["male", "wei", "4/6", ["lvli", "choujue"]], @@ -26,7 +26,7 @@ const characters = { diy_yuji: ["male", "qun", 3, ["diyguhuo", "diychanyuan"]], // diy_zhouyu:['male','wu',3,['jieyan','honglian']], // diy_zhouyu:['male','wu',3,['xiongzi','yaliang']], - diy_caiwenji: ["female", "qun", 3, ["beige", "guihan"]], + diy_caiwenji: ["female", "qun", 3, ["beige", "guihan"], ["name:蔡|琰"]], diy_lukang: ["male", "wu", 4, ["luweiyan", "qianxun"]], // diy_xuhuang:['male','wei',4,['diyduanliang']], // diy_dianwei:['male','wei',4,['diyqiangxi']], @@ -37,19 +37,19 @@ const characters = { //re_huangyueying:['female','shu',3,['rejizhi','qicai']], diy_liufu: ["male", "wei", 3, ["zhucheng", "duoqi"]], - diy_xizhenxihong: ["male", "shu", 4, ["fuchou", "jinyan"]], + diy_xizhenxihong: ["male", "shu", 4, ["fuchou", "jinyan"], ["name:习|珍-习|宏"]], diy_liuzan: ["male", "wu", 4, ["kangyin"]], - diy_zaozhirenjun: ["male", "wei", 3, ["liangce", "jianbi", "diyjuntun"]], + diy_zaozhirenjun: ["male", "wei", 3, ["liangce", "jianbi", "diyjuntun"], ["name:枣|祗-任|峻"]], diy_yangyi: ["male", "shu", 3, ["choudu", "liduan"]], diy_tianyu: ["male", "wei", 4, ["chezhen", "youzhan"]], ns_zuoci: ["male", "qun", 3, ["nsxinsheng", "nsdunxing"]], - ns_lvzhi: ["female", "qun", 3, ["nsnongquan", "nsdufu"]], + ns_lvzhi: ["female", "qun", 3, ["nsnongquan", "nsdufu"], ["name:吕|雉"]], ns_wangyun: ["male", "qun", 4, ["liangji", "jugong", "chengmou"]], - ns_nanhua: ["male", "qun", 3, ["nshuanxian", "nstaiping_nh", "nsshoudao"]], - ns_nanhua_left: ["male", "qun", 2, [], ["unseen"]], - ns_nanhua_right: ["female", "qun", 2, [], ["unseen"]], - ns_huamulan: ["female", "qun", 3, ["nscongjun", "xiaoji", "gongji"]], + ns_nanhua: ["male", "qun", 3, ["nshuanxian", "nstaiping_nh", "nsshoudao"], ["name:庄|周"]], + ns_nanhua_left: ["male", "qun", 2, [], ["unseen", "name:null|null"]], + ns_nanhua_right: ["female", "qun", 2, [], ["unseen", "name:null|null"]], + ns_huamulan: ["female", "qun", 3, ["nscongjun", "xiaoji", "gongji"], ["name:null|null"]], ns_huangzu: ["male", "qun", 4, ["nsjihui", "nsmouyun"]], ns_jinke: ["male", "qun", 4, ["nspinmin", "nsshishou"]], ns_yanliang: ["male", "qun", 4, ["nsduijue", "nsshuangxiong", "dualside"], ["dualside:ns_wenchou"]], @@ -57,12 +57,12 @@ const characters = { ns_caocao: ["male", "wei", 4, ["nscaiyi", "nsgefa", "nshaoling"]], ns_caocaosp: ["male", "qun", 3, ["nsjianxiong", "nsxionglue"]], - ns_zhugeliang: ["male", "shu", 3, ["nsguanxing", "kongcheng", "nsyunxing"]], + ns_zhugeliang: ["male", "shu", 3, ["nsguanxing", "kongcheng", "nsyunxing"], ["name:诸葛|亮"]], ns_wangyue: ["male", "qun", 4, ["nsjianshu", "nscangjian"]], ns_yuji: ["male", "qun", 3, ["nsyaowang", "nshuanhuo"]], ns_xinxianying: ["female", "wei", 3, ["nsdongcha", "nscaijian", "nsgongjian"]], ns_guanlu: ["male", "wei", 3, ["nsbugua", "nstuiyan", "nstianji"]], - ns_simazhao: ["male", "wei", 3, ["nszhaoxin", "nsxiuxin", "nsshijun"]], + ns_simazhao: ["male", "wei", 3, ["nszhaoxin", "nsxiuxin", "nsshijun"], ["name:司马|昭"]], ns_sunjian: ["male", "wu", 4, ["nswulie", "nshunyou", "nscangxi"]], ns_duangui: ["male", "qun", 3, ["nscuanquan", "nsjianning", "nschangshi", "nsbaquan"]], @@ -80,7 +80,7 @@ const characters = { // ns_zhaoyunshen:['male','qun',3,[]], // ns_lisu:['male','qun',3,[]], // ns_sunhao:['male','qun',3,[]], - ns_xinnanhua: ["male", "qun", 3, ["ns_xiandao", "ns_xiuzheng", "ns_chuanshu"]], + ns_xinnanhua: ["male", "qun", 3, ["ns_xiandao", "ns_xiuzheng", "ns_chuanshu"], ["name:庄|周"]], ns_caimao: ["male", "qun", 4, ["nsdingzhou"]], ns_luyusheng: ["female", "wu", 3, ["nshuaishuang", "nsfengli"]], ns_chengpu: ["male", "wu", 4, ["decadelihuo", "decadechunlao"]], diff --git a/character/diy/skill.js b/character/diy/skill.js index 857479c825..de1180dacb 100644 --- a/character/diy/skill.js +++ b/character/diy/skill.js @@ -2814,6 +2814,15 @@ const skills = { trigger.cancel(); //event.finish(); }, + ai: { + nofire: true, + nothunder: true, + effect: { + target(card, player, target) { + if (get.tag(card, "natureDamage")) return "zerotarget"; + } + } + } }, ns_xiandao: { forced: true, @@ -3375,19 +3384,14 @@ const skills = { var check = function (list) { for (var i = 0; i < list.length; i++) { var info = lib.skill[list[i]]; - if (info && info.shaRelated) return true; + if (!info) continue; + if (info.shaRelated) return true; if (info && info.trigger) { for (var j in info.trigger) { var cond = info.trigger[j]; if (typeof cond == "string") { cond = [cond]; } - if (j == "player" || j == "global") { - if (cond.indexOf("shaBefore") != -1) return true; - if (cond.indexOf("shaBegin") != -1) return true; - if (cond.indexOf("shaEnd") != -1) return true; - if (cond.indexOf("shaAfter") != -1) return true; - } if (j == "source" || j == "global") { if (cond.indexOf("damageBefore") != -1) return true; if (cond.indexOf("damageBegin") != -1) return true; @@ -3399,6 +3403,8 @@ const skills = { } } } + if (info.shaRelated === false) return false; + if (get.skillInfoTranslation(list[i], player).includes("【杀】")) return true; } return false; }; diff --git a/character/diy/translate.js b/character/diy/translate.js index 7de0542a8c..393edec280 100644 --- a/character/diy/translate.js +++ b/character/diy/translate.js @@ -11,6 +11,7 @@ const translates = { diy_huangzhong: "黄汉升", diy_xuhuang: "徐公明", diy_dianwei: "新典韦", + diy_dianwei_prefix: "新", diy_weiyan: "魏文长", xicai: "惜才", diyjianxiong: "奸雄", @@ -317,7 +318,7 @@ const translates = { kangyin_info: "出牌阶段限一次,你可以失去1点体力并选择一名其他角色,弃置该角色的一张牌。若此牌:为基本牌,你可以令一至X名角色各摸一张牌;不为基本牌,于此回合内:你的进攻距离+X,且你使用【杀】的额外目标数上限+X。(X为你已损失的体力值)", zhucheng: "筑城", zhucheng2: "筑城", - zhucheng_info: "①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此杀的使用者弃置X张牌(X为“筑”的数量),否则杀对你无效。", + zhucheng_info: "①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此【杀】的使用者弃置X张牌(X为“筑”的数量),否则此【杀】对你无效。", duoqi: "夺气", duoqi_info: "当一名角色于除你之外的角色的出牌阶段内因弃置而失去牌后,你可以移去一张“筑”,并结束此出牌阶段。", diff --git a/character/extra/character.js b/character/extra/character.js index e22bdd9dab..130f53375c 100644 --- a/character/extra/character.js +++ b/character/extra/character.js @@ -1,4 +1,6 @@ const characters = { + new_simayi: ["male", "shen", 4, ["jilin", "yingyou", "yingtian"], ["wei", "name:司马|懿"]], + xin_simayi: ["male", "shen", 4, ["xinrenjie", "xinbaiyin", "xinlianpo"], ["tempname:shen_simayi", "wei", "name:司马|懿"]], dc_shen_huatuo: ["male", "shen", 3, ["jingyu", "lvxin", "huandao"], ["qun"]], shen_xuzhu: ["male", "shen", 5, ["zhengqing", "zhuangpo"], ["wei"]], shen_lusu: ["male", "shen", 3, ["tamo", "dingzhou", "zhimeng"], ["wu"]], @@ -16,15 +18,15 @@ const characters = { shen_sunce: ["male", "shen", "1/6", ["yingba", "scfuhai", "pinghe"], ["wu"]], shen_xunyu: ["male", "shen", 3, ["tianzuo", "lingce", "dinghan"], ["wei", "clan:颍川荀氏"]], - shen_taishici: ["male", "shen", 4, ["dulie", "tspowei"], ["wu"]], + shen_taishici: ["male", "shen", 4, ["dulie", "tspowei"], ["wu", "name:太史|慈"]], shen_guojia: ["male", "shen", 3, ["reshuishi", "stianyi", "resghuishi"], ["wei"]], - shen_diaochan: ["female", "shen", 3, ["meihun", "huoxin"], ["qun"]], + shen_diaochan: ["female", "shen", 3, ["meihun", "huoxin"], ["qun", "name:null|null"]], shen_guanyu: ["male", "shen", 5, ["wushen", "new_wuhun"], ["shu"]], shen_zhaoyun: ["male", "shen", 2, ["xinjuejing", "relonghun"], ["shu"]], - shen_zhugeliang: ["male", "shen", 3, ["qixing", "kuangfeng", "dawu"], ["shu"]], + shen_zhugeliang: ["male", "shen", 3, ["qixing", "kuangfeng", "dawu"], ["shu", "name:诸葛|亮"]], shen_lvmeng: ["male", "shen", 3, ["shelie", "gongxin"], ["wu"]], shen_zhouyu: ["male", "shen", 4, ["yeyan", "qinyin"], ["wu"]], - shen_simayi: ["male", "shen", 4, ["renjie", "sbaiyin", "lianpo"], ["wei"]], + shen_simayi: ["male", "shen", 4, ["renjie", "sbaiyin", "lianpo"], ["wei", "name:司马|懿"]], shen_caocao: ["male", "shen", 3, ["new_guixin", "feiying"], ["wei"]], shen_lvbu: ["male", "shen", 5, ["baonu", "wumou", "ol_wuqian", "ol_shenfen"], ["qun"]], diff --git a/character/extra/characterReplace.js b/character/extra/characterReplace.js index 61ebf5a036..d0f1200710 100644 --- a/character/extra/characterReplace.js +++ b/character/extra/characterReplace.js @@ -9,6 +9,7 @@ const characterReplaces = { shen_caocao: ["shen_caocao", "old_caocao"], shen_zhangjiao: ["shen_zhangjiao", "junk_zhangjiao"], shen_huatuo: ["dc_shen_huatuo", "shen_huatuo"], + shen_simayi: ["shen_simayi", "xin_simayi", "new_simayi"], }; export default characterReplaces; diff --git a/character/extra/skill.js b/character/extra/skill.js index d48d684bdf..3a19788321 100644 --- a/character/extra/skill.js +++ b/character/extra/skill.js @@ -2,6 +2,499 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //应天司马懿!肯定又要修改 + jilin: { + audio: 5, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + forced: true, + locked: false, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + async content(event, trigger, player) { + const cards = get.cards(3); + const next = player.addToExpansion(cards, "draw"); + next.gaintag.add(event.name); + await next; + }, + marktext: "志", + intro: { + markcount: "expansion", + mark(dialog, content, player) { + const cards = player.getExpansions("jilin"), + mingzhi = cards.filter(card => card.storage.jilin), + hidden = cards.removeArray(mingzhi); + if (mingzhi.length) { + dialog.addText("已明之志"); + dialog.addSmall(mingzhi); + } + if (hidden.length) { + if (player == game.me || player.isUnderControl()) { + dialog.addText("未明之志"); + dialog.addSmall(hidden); + } else { + return "共有" + get.cnNumber(hidden.length) + "张暗“志”"; + } + } + }, + content(content, player) { + const cards = player.getExpansions("jilin"), + mingzhi = cards.filter(card => card.storage.jilin), + hidden = cards.removeArray(mingzhi); + if (mingzhi.length) { + dialog.addText("已明之志"); + dialog.addSmall(mingzhi); + } + if (hidden.length) { + if (player == game.me || player.isUnderControl()) { + dialog.addText("未明之志"); + dialog.addSmall(hidden); + } else { + return "共有" + get.cnNumber(hidden.length) + "张暗“志”"; + } + } + }, + }, + group: ["jilin_kanpo", "jilin_change"], + subSkill: { + kanpo: { + audio: "jilin", + trigger: { + target: "useCardToTarget", + }, + filter(event, player) { + return event.player != player && player.getExpansions("jilin").some(card => !card.storage.jilin); + }, + async cost(event, trigger, player) { + const hidden = player.getExpansions("jilin").filter(card => !card.storage.jilin); + const goon = get.effect(player, trigger.card, trigger.player, player) < 0; + const suits = player + .getExpansions("jilin") + .filter(card => card.storage.jilin) + .map(card => get.suit(card)) + .toUniqued(); + if (hidden.length == 1) { + const bool = await player + .chooseBool("戢鳞:明置一张“志”", `令${get.translation(trigger.card)}对你无效`) + .set("choice", goon) + .forResultBool(); + event.result = { + bool: bool, + cost_data: hidden, + }; + } else { + const { + result: { bool, links }, + } = await player + .chooseButton(["戢鳞:明置一张“志”", hidden]) + .set("ai", button => { + const player = get.player(), + card = button.link, + suits = get.event("suits"); + if (!get.event("goon")) return 0; + if (!suits.includes(get.suit(card))) return 10; + return 6 - get.value(card); + }) + .set("suits", suits) + .set("goon", goon); + event.result = { + bool: bool, + cost_data: links, + }; + } + }, + async content(event, trigger, player) { + event.cost_data[0].storage.jilin = true; + trigger.getParent().excluded.add(player); + }, + }, + change: { + audio: "jilin", + trigger: { + player: "phaseBegin", + }, + filter(event, player) { + return player.countCards("h") && player.getExpansions("jilin").some(card => !card.storage.jilin); + }, + async cost(event, trigger, player) { + const hidden = player.getExpansions("jilin").filter(card => !card.storage.jilin); + const next = player.chooseToMove("戢鳞:是否交换“志”和手牌?"); + next.set("list", [ + [get.translation(player) + "(你)的未明之“志”", hidden], + ["手牌区", player.getCards("h")], + ]); + next.set("filterMove", (from, to) => { + return typeof to != "number"; + }); + next.set("processAI", list => { + let player = get.player(), + cards = list[0][1].concat(list[1][1]).sort(function (a, b) { + return get.useful(a) - get.useful(b); + }), + cards2 = cards.splice(0, player.getExpansions("jilin").length); + return [cards2, cards]; + }); + const { + result: { bool, moved }, + } = await next; + event.result = { + bool: bool, + cost_data: moved, + }; + }, + async content(event, trigger, player) { + const moved = event.cost_data; + const pushs = moved[0], + gains = moved[1]; + pushs.removeArray(player.getExpansions("jilin")); + gains.removeArray(player.getCards("h")); + if (!pushs.length || pushs.length != gains.length) return; + const next = player.addToExpansion(pushs); + next.gaintag.add("jilin"); + await next; + await player.gain(gains, "draw"); + }, + }, + }, + }, + yingyou: { + audio: 4, + trigger: { + player: "phaseUseBegin", + }, + filter(event, player) { + return player.countCards("h") && player.getExpansions("jilin").some(card => !card.storage.jilin); + }, + async cost(event, trigger, player) { + const hidden = player.getExpansions("jilin").filter(card => !card.storage.jilin); + const suits = player + .getExpansions("jilin") + .filter(card => card.storage.jilin) + .map(card => get.suit(card)) + .toUniqued(); + const { + result: { bool, links }, + } = await player + .chooseButton(["英猷:你可以明志", hidden]) + .set("ai", button => { + const player = get.player(), + card = button.link, + suits = get.event("suits"); + const getNum = player => { + var list = []; + for (var i of lib.suit) list.push(player.countCards("h", { suit: i }) + 3); + return list.sort((a, b) => b - a)[0]; + }; + if (!suits.includes(get.suit(card))) return 10; + if (get.suit(card) == getNum(player)) return 5; + return 0; + }) + .set("suits", suits); + event.result = { + bool: bool, + cost_data: links, + }; + }, + async content(event, trigger, player) { + event.cost_data[0].storage.jilin = true; + const num = player.getExpansions("jilin").filter(card => card.storage.jilin).length; + await player.draw(num); + }, + ai: { + combo: "jilin", + }, + group: "yingyou_draw", + subSkill: { + draw: { + audio: "yingyou", + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player) { + const suits = player + .getExpansions("jilin") + .filter(card => card.storage.jilin) + .map(card => get.suit(card)) + .toUniqued(); + const evt = event.getl(player); + if (!evt || !evt.cards2 || !evt.cards2.length) return false; + return evt.cards2.some(card => { + return suits.includes(get.suit(card, player)); + }); + }, + forced: true, + locked: false, + async content(event, trigger, player) { + const suits = player + .getExpansions("jilin") + .filter(card => card.storage.jilin) + .map(card => get.suit(card)) + .toUniqued(); + const num = trigger.getl(player).cards2.filter(card => { + return suits.includes(get.suit(card, player)); + }).length; + await player.draw(num); + }, + }, + }, + }, + yingtian: { + audio: 2, + trigger: { + global: "dieAfter", + }, + filter(event, player) { + return game.countGroup() < 3; + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + async content(event, trigger, player) { + const skill = event.name; + player.awakenSkill(skill); + await player.changeSkills(get.info(skill).derivation, ["yingyou"]); + player.addSkill(skill + "_effect"); + }, + derivation: ["reguicai", "rewansha", "lianpo"], + subSkill: { + effect: { + mod: { + targetInRange: () => true, + }, + }, + }, + }, + //手杀神司马? + //极略神司马! + xinrenjie: { + audio: "renjie2", + trigger: { + player: ["chooseToUseAfter", "chooseToRespondAfter"], + global: "useCardAfter", + }, + filter(event, player) { + if (player.getRoundHistory("useSkill", evt => evt.skill == "xinrenjie").length >= 4) return false; + if (event.name == "useCard") { + //...... + if (get.type(event.card) != "trick") return false; + const history = game.getGlobalHistory("everything", evt => evt.player == player && ["useCard", "respond"].includes(evt.name)); + return !history.some(evt => Array.isArray(evt.respondTo) && evt.respondTo[1] == event.card && evt.card.name == "wuxie"); + } + const evt = event.getParent(2); + if (!evt || evt.name != "useCard") return false; + return !event.result.bool; + }, + forced: true, + async content(event, trigger, player) { + player.addMark(event.name, 1); + }, + intro: { + name2: "忍", + content: "mark", + }, + marktext: "忍", + global: "xinrenjie_global", + subSkill: { + global: { + hiddenCard: () => true, + ai: { + respondSha: true, + respondShan: true, + }, + }, + }, + }, + xinbaiyin: { + audio: "sbaiyin", + inherit: "sbaiyin", + filter(event, player) { + return player.countMark("xinrenjie") >= 4; + }, + async content(event, trigger, player) { + player.awakenSkill("xinbaiyin"); + await player.loseMaxHp(); + await player.addSkills("xinjilve"); + }, + derivation: ["xinjilve", "reguicai", "fangzhu", "rejizhi", "rezhiheng", "rewansha"], + ai: { + combo: "xinrenjie", + }, + }, + xinlianpo: { + audio: "lianpo", + trigger: { + source: "dieAfter", + }, + async cost(event, trigger, player) { + const skills = get + .info("xinbaiyin") + .derivation.removeArray(["xinjilve", "reguicai"]) + .filter(skill => !player.hasSkill(skill, null, null, false)); + if (skills.length && player.hasSkill("xinjilve", null, null, false)) { + const next = player.chooseButton(["连破:请选择一项", [skills.map(i => [i, `获得【${get.translation(i)}】`]).concat(["于此回合结束后获得一个额外回合"]), "textbutton"]]); + next.set("ai", button => { + const link = button.link, + skills = get.event("skills"); + if ((skills.length <= 2 || game.countPlayer() <= 2) && !player.hasSkill("xinlianpo_mark", null, null, false) && link == "于此回合结束后获得一个额外回合") return 6; + if (link == "rezhiheng" && player.countCards("h") > 0) return 5; + if (link == "rejizhi" && (!skills.includes("rezhiheng") || player.countCards("hs", { type: "trick" }))) return 3; + if (link == "rewansha" && game.hasPlayer(current => get.attitude(player, current) < 0 && current.getHp() < 2 && (player == _status.currentPhase || player.hasSkill("xinlianpo_mark", null, null, false)))) return 2; + return 1; + }); + next.set("skills", skills); + const { + result: { bool, links }, + } = await next; + event.result = { + bool: bool, + cost_data: links, + }; + } else { + const bool = await player.chooseBool("连破:于此回合结束后获得一个额外回合?").forResultBool(); + event.result = { + bool: bool, + }; + } + }, + async content(event, trigger, player) { + const links = event.cost_data; + if (links && get.info("xinbaiyin").derivation.includes(links[0])) await player.addSkills(links[0]); + else { + player.addTempSkill("xinlianpo_mark"); + player.insertPhase(); + } + }, + subSkill: { + mark: { + charlotte: true, + mark: true, + intro: { + content: "本回合结束后执行一个额外回合", + }, + }, + }, + }, + xinjilve: { + audio: "jilue", + trigger: { + player: "phaseUseBegin", + }, + filter(event, player) { + return player.countMark("xinrenjie"); + }, + async cost(event, trigger, player) { + const limit = Math.min(3, player.countMark("xinrenjie")); + const choices = Array.from({ + length: limit, + }).map((_, i) => [i, get.cnNumber(i + 1, true)]); + const history = game.getAllGlobalHistory("everything", evt => evt.name == "xinjilve" && evt.player == player && Array.isArray(evt.cost_data) && get.info("xinbaiyin").derivation.includes(evt.cost_data[0])); + const num = history.length + 1; + const skills = get + .info("xinbaiyin") + .derivation.removeArray(["xinjilve", "reguicai"]) + .filter(skill => !player.hasSkill(skill, null, null, false)); + if (skills.length && limit >= num) { + const next = player.chooseButton(2, ["连破:请选择你要移去的“忍”标记数和相应操作", '
移去“忍”标记数
', [choices, "tdnodes"], '
执行的操作
', [skills.map(i => [i, `获得【${get.translation(i)}】`]).concat(["摸牌"]), "tdnodes"]]); + next.set("filterButton", button => { + const link = button.link; + if (!ui.selected.buttons.length && typeof link == "number") return false; + if (ui.selected.buttons.length) { + if (typeof link !== "number") return false; + return ui.selected.buttons[0].link == "摸牌" || link == get.event("num") - 1; + } + return true; + }); + next.set("ai", button => { + const link = button.link, + num = get.event("num"), + skills = get.event("skills"); + if (!ui.selected.buttons.length) { + if (num > 2 && link == "摸牌") return 10; + if (link == "rezhiheng" && player.countCards("h") > 0) return 10; + if (link == "rejizhi" && (!skills.includes("rezhiheng") || player.countCards("hs", { type: "trick" }))) return 8; + if (player.countMark("xinrenjie") <= 2) return 0; + } + return ui.selected.buttons.length && ui.selected.buttons[0].link == "摸牌" ? num - 1 : 1; + }); + next.set("num", num); + next.set("skills", skills); + const { + result: { bool, links }, + } = await next; + event.result = { + bool: bool, + cost_data: links, + }; + } else { + const draw = Array.from({ + length: limit, + }).map((_, i) => get.cnNumber(i + 1, true)); + const { result } = await player + .chooseControl(draw, "cancel2") + .set("prompt", get.prompt("xinrenjie")) + .set("prompt2", `你可以摸至多${get.cnNumber(draw.length)}张牌并移去等量枚“忍”标记`) + .set("ai", () => { + return get.event("choice"); + }) + .set( + "choice", + (function () { + if (!player.hasSkill("jizhi", null, null, false)) return "cancel2"; + return choices.length - 1; + })() + ); + event.result = { + bool: result.control != "cancel2", + cost_data: result.index, + }; + } + }, + async content(event, trigger, player) { + const choice = event.cost_data; + if (typeof choice == "number") { + player.removeMark("xinrenjie", choice + 1); + await player.draw(choice + 1); + } else if (get.info("xinbaiyin").derivation.includes(choice[0])) { + const history = game.getAllGlobalHistory("everything", evt => evt.name == "xinjilve" && evt.player == player && Array.isArray(evt.cost_data) && get.info("xinbaiyin").derivation.includes(evt.cost_data[0])); + const num = history.length; + player.removeMark("xinrenjie", num); + await player.addSkills(choice[0]); + } else { + player.removeMark("xinrenjie", choice[1] + 1); + await player.draw(choice[1] + 1); + } + }, + group: "xinjilve_gain", + subSkill: { + gain: { + trigger: { + player: "changeSkillsAfter", + }, + filter(event, player) { + return event.addSkill.includes("xinjilve"); + }, + forced: true, + async content(event, trigger, player) { + let skills = ["reguicai"]; + const groupList = new Map([ + ["wei", "fangzhu"], + ["shu", "rejizhi"], + ["wu", "rezhiheng"], + ["qun", "rewansha"], + ["key", "hiroto_zonglve"] + ]); + if (Array.from(groupList.keys()).includes(player.group)) skills.push(groupList.get(player.group)); + skills = skills.filter(skill => !player.hasSkill(skill, null, null, false)); + if (skills.length) await player.addSkills(skills); + }, + }, + }, + }, //十周年神华佗 jingyu: { audio: 2, @@ -2028,7 +2521,10 @@ const skills = { if (game.countPlayer() > 2) { if (player == trigger.player && !trigger.skill) { var evt = trigger.getParent(); - if (evt.name == "phaseLoop" && evt._isStandardLoop) evt.player = player.next; + if (evt.name == "phaseLoop" && evt._isStandardLoop) { + evt.player = player.previous; + _status.lastPhasedPlayer = player.next; + } } player .chooseTarget( @@ -2838,7 +3334,6 @@ const skills = { }, }, subSkill: { phase: { charlotte: true } }, - shaRelated: true, }, twwuhun: { audio: 2, @@ -6220,6 +6715,7 @@ const skills = { }, lianpo: { audio: 2, + audioname: ["new_simayi"], trigger: { global: "phaseAfter" }, frequent: true, filter(event, player) { @@ -6353,6 +6849,7 @@ const skills = { name2: "忍", content: "mark", }, + marktext: "忍", ai: { maixie: true, maixie_hp: true, @@ -8487,7 +8984,8 @@ const skills = { att = get.attitude(_status.event.player, target); for (let i in target.skills) { let info = get.info(i); - if (info && info.shaRelated) return Math.abs(att); + if (!info || info.shaRelated === false) continue; + if (info.shaRelated || get.skillInfoTranslation(i, target).includes("【杀】")) return Math.abs(att); } if (att > 0) { if (th > 3 && target.hp > 2) return 0.6 * th; diff --git a/character/extra/sort.js b/character/extra/sort.js index 4cf6c8b016..9cafd46f9b 100644 --- a/character/extra/sort.js +++ b/character/extra/sort.js @@ -11,6 +11,7 @@ const characterSort = { extra_mobilexin: ["shen_taishici", "shen_sunce"], extra_mobileren: ["shen_huatuo", "shen_lusu"], extra_tw: ["tw_shen_guanyu", "tw_shen_lvmeng"], + extra_mb: ["xin_simayi", "new_simayi"], extra_offline: ["shen_diaochan", "boss_zhaoyun", "shen_dianwei", "le_shen_jiaxu"], }; @@ -29,6 +30,7 @@ const characterSortTranslate = { extra_offline: "神话再临·线下", extra_decade: "神·武", extra_tw: "海外服神将", + extra_mb: "移动版神将", }; export { characterSort, characterSortTranslate }; diff --git a/character/extra/translate.js b/character/extra/translate.js index db12ec03c3..4c9cbf0da7 100644 --- a/character/extra/translate.js +++ b/character/extra/translate.js @@ -356,6 +356,26 @@ const translates = { lvxin_info: "出牌阶段限一次。你可以交给一名其他角色一张手牌并选择一项:⒈令其摸X张牌;⒉令其随机弃置X张手牌(X为游戏轮数,至多为5)。然后若其以此法得到/弃置了与你交给其的牌牌名相同的牌,其于其下次发动技能时回复/失去1点体力。", huandao: "寰道", huandao_info: "限定技。出牌阶段,你可以选择一名其他角色。你令其复原武将牌,系统随机生成一个与其同名的武将的武将牌上的一个与其拥有的技能均不同名的技能。其可以选择获得此技能,然后选择失去一个其他技能。", + xin_simayi: "极略神司马懿", + xin_simayi_ab: "手杀神司马懿", + xin_simayi_prefix: "手杀神", + xinrenjie: "忍戒", + xinrenjie_info: "锁定技,当你需要响应一张牌时,若你未响应此牌,你获得1枚“忍”标记(你每轮以此法至多获得4枚“忍”标记)。", + xinbaiyin: "拜印", + xinbaiyin_info: "觉醒技,准备阶段,若你的“忍”标记数不小于4,你减少1点体力上限,然后获得〖极略〗。", + xinlianpo: "连破", + xinlianpo_info: "当你杀死一名角色后,你可以选择一项:1.于此回合结束后获得一个额外回合;2.若你拥有〖极略〗,你获得一个你未拥有的〖极略〗技能。", + xinjilve: "极略", + xinjilve_info: "①当你获得此技能时,你获得〖鬼才〗并根据你的势力获得以下对应技能:魏:〖放逐〗;蜀:〖集智〗;吴:〖制衡〗;群:〖完杀〗。②出牌阶段开始时,你可以选择一项:1.弃置X枚“忍”标记并获得一个你未拥有的〖极略〗技能(X为你选择此项的次数+1);2.弃置至多3枚“忍”标记并摸等量张牌。", + new_simayi: "应天神司马懿", + new_simayi_ab: "手杀神司马懿", + new_simayi_prefix: "手杀神", + jilin: "戢鳞", + jilin_info: "①游戏开始时,将牌堆顶三张牌暗置于你的武将牌上,称为“志”。②当你成为其他角色使用牌的目标时,你可以明置一张暗置的“志”令此牌对你无效。③回合开始时,你可用任意张手牌替换等量暗置的“志”。", + yingyou: "英猷", + yingyou_info: "①出牌阶段开始时,你可明置一张“志”然后摸X张牌(X为明置的“志”的数量)。②当你失去与明置的“志”其中一张花色相同的牌时,你摸一张牌。", + yingtian: "应天", + yingtian_info: "觉醒技。一名角色死亡后,若场上势力数不大于2,则你获得〖鬼才〗、〖完杀〗、〖连破〗并失去〖英猷〗且你本局游戏使用牌没有距离限制。", }; export default translates; diff --git a/character/extra/voices.js b/character/extra/voices.js index f62cbd2e43..016c904851 100644 --- a/character/extra/voices.js +++ b/character/extra/voices.js @@ -1,4 +1,22 @@ export default { + "#wansha_new_simayi1": "连诛其族,剪其党羽,以夷后患!", + "#wansha_new_simayi2": "绝汝生死,断汝轮回!", + "#lianpo_new_simayi1": "能战当战,不能战当死尔!", + "#lianpo_new_simayi2": "连下诸城以筑京观,足永平辽东之患。", + "#reguicai_new_simayi1": "天地造化,不过老夫一念之间!", + "#reguicai_new_simayi2": "风雨雷电,皆由老夫决之!", + "#jilin1": "戢鳞潜翼,蓄志待时!", + "#jilin2": "老臣一心为国,还望陛下明鉴。", + "#jilin3": "年老意荒,无力朝事。", + "#jilin4": "坐观潮起潮落,笑谈云卷云舒。", + "#jilin5": "数载春去秋来,静看大江东流!", + "#yingyou1": "吞吴克蜀,老臣毕生之志也!", + "#yingyou2": "臣当总领西事,不负陛下所托!", + "#yingyou3": "积谷屯田,以为灭贼之要!", + "#yingyou4": "轻骑神速,八日足解新城之叛!", + "#yingtian1": "太白袭月知何故,天狼掩日欲吞天!", + "#yingtian2": "藏锋四十载,终昭吾亮剑之时!", + "#new_simayi:die": "洛水滔滔,难诉吾一生坎坷……", "#jingyu1": "人身疾苦,与我无异。", "#jingyu2": "医以济世,其术贵在精诚。", "#lvxin1": "医病非难,难在医人之心。", diff --git a/character/gujian.js b/character/gujian.js index afccb9967b..5637a621e7 100644 --- a/character/gujian.js +++ b/character/gujian.js @@ -3,7 +3,7 @@ game.import("character", function () { return { name: "gujian", character: { - gjqt_bailitusu: ["male", "shu", 4, ["xuelu", "fanshi", "shahun"]], + gjqt_bailitusu: ["male", "shu", 4, ["xuelu", "fanshi", "shahun"], ["name:百里|屠苏"]], gjqt_fengqingxue: ["female", "wu", 3, ["qinglan", "yuehua", "swd_wuxie"]], gjqt_xiangling: ["female", "wu", 3, ["xlqianhuan", "meihu", "xidie"]], gjqt_fanglansheng: ["male", "wu", 3, ["fanyin", "mingkong", "fumo"]], @@ -11,24 +11,20 @@ game.import("character", function () { gjqt_hongyu: ["female", "shu", 4, ["jianwu", "meiying"]], gjqt_yuewuyi: ["male", "wei", 4, ["yanjia", "xiuhua", "liuying"]], - gjqt_wenrenyu: ["female", "shu", 4, ["chizhen", "dangping"]], + gjqt_wenrenyu: ["female", "shu", 4, ["chizhen", "dangping"], ["name:闻人|羽"]], gjqt_xiayize: ["male", "qun", 3, ["xuanning", "liuguang", "yangming"]], gjqt_aruan: ["female", "wu", 3, ["zhaolu", "jiehuo", "yuling"]], gjqt_xunfang: ["female", "shu", 3, ["manwu", "xfanghua"]], - gjqt_ouyangshaogong: ["male", "shu", 3, ["yunyin", "shishui", "duhun"]], + gjqt_ouyangshaogong: ["male", "shu", 3, ["yunyin", "shishui", "duhun"], ["name:欧阳|少恭"]], gjqt_xieyi: ["male", "qun", 3, ["lingyan", "xunjian", "humeng"]], gjqt_yanjiaxieyi: ["male", "qun", 2, ["xianju"], ["unseen"]], gjqt_chuqi: ["male", "qun", 2, ["xuanci"], ["unseen"]], - // gjqt_xuange:['male','qun',4,['zhenlu','zhuixing']], gjqt_beiluo: ["male", "qun", 4, ["lingnu", "zhenying", "cihong"]], gjqt_yunwuyue: ["female", "wei", 3, ["yange", "woxue", "lianjing"]], gjqt_cenying: ["female", "shu", 3, ["yunyou", "xuanzhen", "qingshu"]], - // gjqt_changliu:['male','qun',4,['xiange']], - // gjqt_fenglishuang:['female','wei',3,[]], - // gjqt_nishang:[], }, characterIntro: { gjqt_bailitusu: @@ -1163,20 +1159,8 @@ game.import("character", function () { var info = lib.skill[list[i]]; if (!info) continue; if (info.shaRelated) return true; - if (info.trigger) { - for (var j in info.trigger) { - if (j == "player" || j == "global") { - var cond = info.trigger[j]; - if (typeof cond == "string") { - cond = [cond]; - } - if (cond.indexOf("shaBefore") != -1) return true; - if (cond.indexOf("shaBegin") != -1) return true; - if (cond.indexOf("shaEnd") != -1) return true; - if (cond.indexOf("shaAfter") != -1) return true; - } - } - } + if (info.shaRelated === false) return false; + if (get.skillInfoTranslation(list[i], player).includes("【杀】")) return true; } return false; }; @@ -2825,7 +2809,7 @@ game.import("character", function () { "锁定技,奇数游戏轮次开始时,你获得潜行直到下一轮开始;偶数游戏轮次开始时,你随机获得一张机关牌。", xuanci: "旋刺", xuanci_info: - "出牌阶段限一次,你可以将一张梅花牌当作飞镖使用;锁定技,你使用飞镖无距离限制,你使用飞镖后对目标结算后视为对目标使用一张杀。", + "出牌阶段限一次,你可以将一张梅花牌当作飞镖使用;锁定技,你使用飞镖无距离限制,你使用飞镖后对目标结算后视为对目标使用一张【杀】。", humeng: "湖梦", humeng_sub: "偃甲谢衣", humeng_info: @@ -2844,7 +2828,7 @@ game.import("character", function () { cihong: "刺鸿", cihong_bg: "鸿", cihong_info: - "每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去1点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张杀。", + "每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去1点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张【杀】。", lianjing: "莲境", lianjing_info: "每两轮限一次,回合结束后,你可以选择至多2名其他角色,将其他角色移出游戏,然后你与所选的角色依次进行一个回合。", @@ -2866,7 +2850,7 @@ game.import("character", function () { "濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并将体力值回复至与该角色相同;若你没赢,你立即死亡。", chizhen: "驰阵", chizhen_info: - "出牌阶段开始时,你可以摸X张牌并弃置X张牌,若你弃置了杀,可以视为使用一张决斗(X为你已损失的体力值且至少为1)。", + "出牌阶段开始时,你可以摸X张牌并弃置X张牌,若你弃置了【杀】,可以视为使用一张决斗(X为你已损失的体力值且至少为1)。", xidie: "戏蝶", xidie2: "戏蝶", xidie_info: @@ -2875,12 +2859,12 @@ game.import("character", function () { meihu2: "魅狐", meihu_info: "当你受到伤害后,可令伤害来源交给你一张手牌。", jianwu: "剑舞", - jianwu_info: "锁定技,攻击范围不含你的角色无法闪避你的杀。", + jianwu_info: "锁定技,攻击范围不含你的角色无法闪避你的【杀】。", meiying: "魅影", meiying_info: - "一名其他角色的回合结束时,若其未于此回合内使用过指定另一名角色为目标的牌,你可以弃置一张红色牌视为对其使用一张杀。", + "一名其他角色的回合结束时,若其未于此回合内使用过指定另一名角色为目标的牌,你可以弃置一张红色牌视为对其使用一张【杀】。", zuizhan: "乱斩", - zuizhan_info: "每当你使用一张杀,可以摸一张牌,然后此杀随机增加一个额外目标。", + zuizhan_info: "每当你使用一张【杀】,可以摸一张牌,然后此【杀】随机增加一个额外目标。", xlqianhuan: "千幻", xlqianhuan_info: "回合结束后,若你已受伤,你可以回复1点体力并将武将牌翻面。若你的武将牌背面朝上,你不能使用卡牌,也不能成为卡牌的目标。", @@ -2915,7 +2899,7 @@ game.import("character", function () { xiuhua_info: "每当一件其他角色的装备因被替换或弃置进入弃牌堆,你可以获得之。", liuying: "流影", liuying_info: - "每当你使用一张杀结算完毕后,你可以指定一名本回合未成为过你的杀的目标的角色,并亮出牌堆顶的一张牌,若为黑色,你对该角色使用一张杀。", + "每当你使用一张【杀】结算完毕后,你可以指定一名本回合未成为过你的【杀】的目标的角色,并亮出牌堆顶的一张牌,若为黑色,你对该角色使用一张【杀】。", boyun: "拨云", boyun1: "拨云", boyun2: "拨云", @@ -2923,9 +2907,9 @@ game.import("character", function () { "在你的回合内,你可以弃置一张装备牌,并展示牌堆顶的一张牌,若其为装备牌,你须将其交给任意一张角色并对其造成1点伤害,否则你摸一张牌。", jizhan: "疾战", jizhan_info: - "出牌阶段限一次,你可以将移动到任意一名角色的前一位,视为对其使用了一张不计入出杀次数的杀。", + "出牌阶段限一次,你可以移动到任意一名角色的前一位,视为对其使用了一张不计入出杀次数的【杀】。", qianjun: "千军", - qianjun_info: "每当你使用一张杀,你可以弃置一张牌,令距离目标1以内的所有角色成为额外目标。", + qianjun_info: "每当你使用一张【杀】,你可以弃置一张牌,令距离目标1以内的所有角色成为额外目标。", xuanning: "玄凝", xuanning1: "玄凝", xuanning2: "玄凝", diff --git a/character/gwent.js b/character/gwent.js index 8b94297fe7..8cd92d6f45 100644 --- a/character/gwent.js +++ b/character/gwent.js @@ -1538,7 +1538,7 @@ game.import("character", function () { trigger.cancel(); player.storage.gwchenshui++; player.updateMarks(); - if (trigger.source != trigger.player && trigger.source.isIn() && trigger.player.isIn()) { + if (trigger.source && trigger.source != trigger.player && trigger.source.isIn() && trigger.player.isIn()) { var cards = trigger.player.getCards("he"); if (cards.length) { trigger.player.give(cards.randomGet(), trigger.source); @@ -4788,15 +4788,15 @@ game.import("character", function () { gwjinli_info: "出牌阶段限一次,你可以弃置一张手牌,并将一张先祖麦酒置于一名角色的武将牌上。", gw_xianzumaijiu: "先祖麦酒", gw_xianzumaijiu_info: - "出牌阶段对自己使用,你使用下一张杀造成伤害后,令所有友方角色摸一张牌;濒死阶段,对自己使用,回复1点体力。", + "出牌阶段对自己使用,你使用下一张【杀】造成伤害后,令所有友方角色摸一张牌;濒死阶段,对自己使用,回复1点体力。", gwliaotian: "燎天", gwliaotian_info: - "出牌阶段限2次,若你有至少两张手牌且颜色均相同,你可以重铸你的全部手牌,并视为对一名随机敌方角色使用一张不计入出杀次数的杀。", + "出牌阶段限2次,若你有至少两张手牌且颜色均相同,你可以重铸你的全部手牌,并视为对一名随机敌方角色使用一张不计入出杀次数的【杀】。", gwmaoxian_yioufeisi: "伊欧菲斯", - gwmaoxian_yioufeisi_info: "选择两名角色,令目标依次视为对对方使用一张杀,然后结束出牌阶段。", + gwmaoxian_yioufeisi_info: "选择两名角色,令目标依次视为对对方使用一张【杀】,然后结束出牌阶段。", gwmaoxian_luoqi: "罗契", gwmaoxian_luoqi_info: - "选择一名角色视为对其使用一张不计入出杀次数的杀,然后所有其他角色可以对目标使用一张杀,然后结束出牌阶段。", + "选择一名角色视为对其使用一张不计入出杀次数的【杀】,然后所有其他角色可以对目标使用一张【杀】,然后结束出牌阶段。", gwmaoxian_jieluote: "杰洛特", gwmaoxian_jieluote_info: "对一名角色造成1点伤害,若目标体力值大于2且为全场最多,改为造成2点伤害,然后结束出牌阶段。", @@ -4806,7 +4806,7 @@ game.import("character", function () { gwmaoxian_telisi_info: "对至多3名随机友方角色施加一个随机正面效果,然后结束出牌阶段。", gwmaoxian_hengsaite: "亨赛特", gwmaoxian_hengsaite_info: - "视为使用一张万箭齐发,每当有一名角色因此受到伤害,你获得一张杀,然后结束出牌阶段。", + "视为使用一张万箭齐发,每当有一名角色因此受到伤害,你获得一张【杀】,然后结束出牌阶段。", gwmaoxian_fuertaisite: "弗尔泰斯特", gwmaoxian_fuertaisite_info: "令至多两名角色各获得1点护甲,然后结束出牌阶段。", gwmaoxian_laduoweide: "拉多维德", @@ -4830,7 +4830,7 @@ game.import("character", function () { gwmaoxian_gaier: "盖尔", gwmaoxian_gaier_info: "令一名角色增加或减少1点体力和体力上限,然后结束出牌阶段。", gwmaoxian_airuiting: "艾瑞汀", - gwmaoxian_airuiting_info: "令所有其他角色选择一项:使用一张杀,或失去1点体力,然后结束出牌阶段。", + gwmaoxian_airuiting_info: "令所有其他角色选择一项:使用一张【杀】,或失去1点体力,然后结束出牌阶段。", gwmaoxian_aisinie: "埃丝涅", gwmaoxian_aisinie_info: "回复1点体力并获得任意一张银卡法术,然后结束出牌阶段。", gwmaoxian_falanxisika: "法兰茜斯卡", @@ -4866,7 +4866,7 @@ game.import("character", function () { gwgouhun_info: "出牌阶段限一次,你可以交给一名有手牌的其他角色一张手牌,然后令其选择一项:1. 将手牌中与此牌花色相同的牌(至少一张)交给你;2. 弃置手牌中与此牌花色不同的牌(至少一张);3. 进入混乱状态直到下一回合结束。", gw_wuyao: "雾妖", - gw_wuyao_info: "在你行动时可当作杀使用;回合结束后,从手牌中消失。", + gw_wuyao_info: "在你行动时可当作【杀】使用;回合结束后,从手牌中消失。", gw_lang: "狼", gw_lang_info: "在你行动时可当作酒使用;回合结束后,从手牌中消失。", gwyewu: "叶舞", @@ -4884,7 +4884,7 @@ game.import("character", function () { gwchenshui: "沉睡", gwchenshui_bg: "睡", gwchenshui_info: - "锁定技,你防止即将造成或受到的伤害,改为令伤害来随机源获得对方一张牌;结束阶段,若你自上次沉睡起累计发动了至少3次沉睡效果,你解除沉睡状态,对所有敌方角色造成1点伤害,然后切换至觉醒状态。", + "锁定技,你防止即将造成或受到的伤害,然后令伤害来源随机获得对方一张牌;结束阶段,若你自上次沉睡起累计发动了至少3次沉睡效果,你解除沉睡状态,对所有敌方角色造成1点伤害,然后切换至觉醒状态。", gwliedi: "裂地", gwliedi_info: "锁定技,你造成的伤害+X,X为你到该角色距离的一半,向下取整;结束阶段,若你连续两轮未造成伤害,你切换至沉睡状态。", @@ -4936,9 +4936,9 @@ game.import("character", function () { "准备阶段,你可以令一名角色选择一项:回复1点体力,或从弃牌堆中获得一张非金法术牌(直到洗牌入牌堆前该牌不能再以此法获得)。", junchi: "骏驰", junchi_info: - "每当一名其他角色使用一张杀,若目标不是你,你可以对杀的目标使用一张牌,并摸一张牌,每回合限一次。", + "每当一名其他角色使用一张【杀】,若目标不是你,你可以对【杀】的目标使用一张牌,并摸一张牌,每回合限一次。", junchi_old_info: - "当一名其他角色使用杀对一个目标结算后,该角色可以交给你一张牌,然后你可以对杀的目标使用一张牌,若如此做,你回复1点体力,杀的使用者摸一张牌。", + "当一名其他角色使用【杀】对一个目标结算后,该角色可以交给你一张牌,然后你可以对【杀】的目标使用一张牌,若如此做,你回复1点体力,【杀】的使用者摸一张牌。", gw_dudayuanshuai1: "杜达元帅", gw_dudayuanshuai1_info: "当你成为其他角色使用牌的目标时,你可以使用此牌取消之,然后获得对你使用的牌。", @@ -4962,7 +4962,7 @@ game.import("character", function () { "出牌阶段限两次,你可以弃置一张牌对场上体力值最高(或之一)的一名角色造成1点伤害。", gwjiquan: "集权", gwjiquan_info: - "出牌阶段限一次,你可以从任意名角色处各获得一张牌,每拿一张牌,被拿牌的角色视为对你使用一张杀。", + "出牌阶段限一次,你可以从任意名角色处各获得一张牌,每拿一张牌,被拿牌的角色视为对你使用一张【杀】。", nuhou: "怒吼", nuhou_info: "每当你受到一次伤害,你可以弃置一张牌,然后对一名随机敌人造成1点伤害并随机弃置其一张牌。", @@ -4971,13 +4971,13 @@ game.import("character", function () { "出牌阶段限一次,你可以弃置至多三张牌然后摸三张牌;若你弃置了至少两张牌,你本回合使用牌无视距离;若你弃置了三张牌,你回复1点体力。", gwzhanjiang: "斩将", gwzhanjiang_info: - "每轮限一次,在一名角色的准备阶段,你可以弃置一张牌,然后所有角色可以对该角色使用一张杀,出杀的角色在响应时摸一张牌,当有至少两名角色响应后终止结算。", + "每轮限一次,在一名角色的准备阶段,你可以弃置一张牌,然后所有角色可以对该角色使用一张【杀】,出杀的角色在响应时摸一张牌,当有至少两名角色响应后终止结算。", gwchuanxin: "穿心", gwchuanxin_info: - "你的攻击范围基数为你当前体力值;每当你对一名角色使用杀结算完毕后,你可以亮出牌堆顶的一张牌,若为黑色,视为对目标再使用一张杀。", + "你的攻击范围基数为你当前体力值;每当你对一名角色使用【杀】结算完毕后,你可以亮出牌堆顶的一张牌,若为黑色,视为对目标再使用一张【杀】。", fengjian: "风剑", fengjian_info: - "每当你使用一张锦囊牌,你可以视为对一名不是此牌目标的角色使用一张雷杀,若如此做,你获得潜行直到下一回合开始。", + "每当你使用一张锦囊牌,你可以视为对一名不是此牌目标的角色使用一张雷【杀】,若如此做,你获得潜行直到下一回合开始。", huandie: "幻蝶", huandie_info: "准备阶段,你可以摸一张牌,并令任意名其他角色摸两张牌,若如此做,此回合结束时,所有手牌数大于体力值的角色需弃置两张手牌。", @@ -4986,7 +4986,7 @@ game.import("character", function () { "准备阶段,你可以选择一项效果直到下一回合开始:1. 每当一名其他角色在一个回合中首次受到伤害,该角色失去1点体力,你回复1点体力;2. 每当一名其他角色在一个回合中首次造成伤害,该角色失去1点体力,你(若不是受伤害角色)回复1点体力。", fayin: "法印", fayin_info: - "每当你使用一张杀,你可以弃置一张牌并获得一个随机法印效果:1. 目标随机弃置两张牌;2. 目标进入混乱状态直到下一回合开始;3. 对目标造成1点火属性伤害;4. 获得1点护甲;5. 令目标翻面并摸一张牌。", + "每当你使用一张【杀】,你可以弃置一张牌并获得一个随机法印效果:1. 目标随机弃置两张牌;2. 目标进入混乱状态直到下一回合开始;3. 对目标造成1点火属性伤害;4. 获得1点护甲;5. 令目标翻面并摸一张牌。", gwbaquan: "霸权", gwbaquan_info: "出牌阶段限一次,你可以获得一名其他角色的所有牌,然后还给其等量的牌,若你归还的牌均为你得到的牌且该角色体力值不小于你,你对其造成1点伤害。", diff --git a/character/hearth.js b/character/hearth.js index 239e44c88d..b314ead876 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -717,16 +717,6 @@ game.import("character", function () { }, }, }, - hsxiujian: { - trigger: { player: "useCardToAfter" }, - forced: true, - filter(event, player) { - return get.type2(event.card) == "trick" && event.target.isEnemiesOf(player); - }, - content() { - player.useCard({ name: "sha" }, trigger.target, false); - }, - }, hsxingyi: { trigger: { global: "useSkillAfter" }, forced: true, @@ -10154,10 +10144,6 @@ game.import("character", function () { tqchuanyue: "穿越", tqchuanyue_info: "锁定技,准备阶段开始时,你随机选择一个被削弱过的炉石技能,获得其未削弱的版本,替换上一个以此法获得的技能。", - // hsxiujian:'袖箭', - // hsxiujian_info:'锁定技,在你对一名敌方角色使用一张锦囊牌后,你视为对其使用一张杀。', - // hsyingzong:'影踪', - // hsyingzong_info:'', hsxingyi: "星移", hsxingyi_info: "锁定技,每当一名敌方角色于回合内使用主动技能,你获得此技能直到下一回合结束。", @@ -10211,7 +10197,7 @@ game.import("character", function () { ysjqisha_info: "锁定技,每当你造成或受到伤害,你令对方随机获得一种消极状态直到下一回合结束。", zhaochao: "招潮", zhaochao_info: - "锁定技,结束阶段,你视为对一名随机敌人使用一张杀;若此杀被闪避,你视为对另一名随机敌人使用一张杀。", + "锁定技,结束阶段,你视为对一名随机敌人使用一张【杀】;若此【杀】被闪避,你视为对另一名随机敌人使用一张【杀】。", hllingxi: "灵息", hllingxi_info: "出牌阶段,你可以令一名已受伤的其他角色弃置两张牌并回复1点体力(同阶段对一名角色限用一次);结束阶段,你可以回复1点体力。", @@ -10228,7 +10214,7 @@ game.import("character", function () { oldhuanjue: "幻觉", oldhuanjue_info: "每回合限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌。", zhziwu: "紫雾", - zhziwu_info: "每当你于回合外失去牌,你可以令当前回合角色不能使用杀直到回合结束。", + zhziwu_info: "每当你于回合外失去牌,你可以令当前回合角色不能使用【杀】直到回合结束。", huanjue_info_old: "每名角色的回合限一次,当你使用卡牌指定其他角色为惟一目标,或当其他角色使用卡牌指定你为惟一目标时,你可以发现一张牌代替此牌,然后该牌的使用者在结算后摸一张牌。", yinzong: "影踪", @@ -10272,7 +10258,7 @@ game.import("character", function () { jinhua_info: "锁定技,每当你以自己为目标使用一张非转化的锦囊牌,你发现一个技能并获得之。", hsqizhou: "祈咒", hsqizhou_feng: "风之祈咒", - hsqizhou_feng_info: "出牌阶段对自己使用,令所有目标的敌人打出一张杀或受到1点雷属性伤害。", + hsqizhou_feng_info: "出牌阶段对自己使用,令所有目标的敌人打出一张【杀】或受到1点雷属性伤害。", hsqizhou_shui: "水之祈咒", hsqizhou_shui_info: "出牌阶段对自己使用,回复2点体力。", hsqizhou_huo: "火之祈咒", @@ -10353,20 +10339,20 @@ game.import("character", function () { "出牌阶段限一次,你可以弃置一张牌并获得一张由三张随机牌组成的药水;当你因弃置而失去药水牌时,你随机获得药水的组成卡牌之一。", shouji: "收集", shouji_info: - "每当你使用一张杀,你可以获得一张目标随机手牌的复制;每当你的杀被闪避,你可以获得一张目标随机非特殊装备牌的复制;每回合限各限一次。", + "每当你使用一张【杀】,你可以获得一张目标随机手牌的复制;每当你的【杀】被闪避,你可以获得一张目标随机非特殊装备牌的复制;每回合限各限一次。", hsguimou: "鬼谋", hsguimou_info: "每当你受到一次伤害,你可以获得伤害来源的一张手牌,若此牌是黑色,你展示此牌并重复此过程。", yingxi: "影袭", yingxi_info: - "结束阶段,若你本回合未造成伤害,你可以将一张黑色牌当作杀对任意一名角色使用,若目标未受到伤害,此杀不可闪避。", + "结束阶段,若你本回合未造成伤害,你可以将一张黑色牌当作【杀】对任意一名角色使用,若目标未受到伤害,此【杀】不可闪避。", peiyu: "培育", peiyu_info: "准备阶段,你可以令一名没有图腾的角色获得一个随机图腾直到其首次受到伤害。", peiyu_old_info: "出牌阶段,你可以弃置一张牌令一名没有图腾的角色获得一个随机图腾,或令一名有图腾的角色替换一个图腾;你死亡时,其他角色失去以此法获得的图腾。", wzhanyi: "战意", wzhanyi_info: - "你可以跳过出牌阶段,改为摸三张牌并展示之,将摸到的装备牌置于装备区,然后可以使用手牌中的杀。", + "你可以跳过出牌阶段,改为摸三张牌并展示之,将摸到的装备牌置于装备区,然后可以使用手牌中的【杀】。", shengteng: "升腾", shengteng_info: "锁定技,每当你使用锦囊牌造成伤害,你增加1点体力上限并回复1点体力。", yuansu: "寂灭", @@ -10376,8 +10362,8 @@ game.import("character", function () { nuyan2: "怒焰", nuyan_backup: "怒焰", nuyan_info: - "出牌阶段限一次,你可以将一张红色牌当作任意一张能造成伤害的牌使用(不得是你本局以此法使用过的牌)。", - nuyan2_info: "出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。", + "出牌阶段限一次,你可以将一张红色牌当作任意一张具有「伤害」标签的牌使用(不得是你本局以此法使用过的牌)。", + nuyan2_info: "出牌阶段限三次,你可以失去1点体力,视为使用任意一张具有「伤害」标签的牌。", chouhuo: "仇火", chouhuo_info: "觉醒技,出牌阶段开始时,若你的怒焰技能已将可用的牌用完,你失去1点体力上限,获得2点护甲,然后将怒焰的描述改为“出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。", @@ -10414,7 +10400,7 @@ game.import("character", function () { xianji_info: "其他角色可以在其结束阶段弃置1~2张手牌并令你摸等量的牌,若如此做,直到其下一回合结束,每当你使用卡牌指定其为目标时,其摸一张牌。", xueren: "血刃", - xueren_info: "每当你使用杀造成伤害,你可以令受伤害角色与你各失去1点体力,然后你摸两张牌。", + xueren_info: "每当你使用【杀】造成伤害,你可以令受伤害角色与你各失去1点体力,然后你摸两张牌。", maoxian: "奇旅", maoxian2: "奇旅", maoxian_info: "出牌阶段限两次,你可以发现一个技能并获得之(替换此前发现的技能)。", @@ -10440,10 +10426,10 @@ game.import("character", function () { xieneng_info: "结束阶段,你可以选择一张神器牌并获得之。", fbeifa: "北伐", fbeifa_info: - "每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌,每回合最多发动3次。", + "每当你失去最后一张手牌,你可以视为使用一张无视距离的【杀】,若此【杀】造成伤害,你摸一张牌,每回合最多发动3次。", oldfbeifa: "北伐", oldfbeifa_info: - "每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌。", + "每当你失去最后一张手牌,你可以视为使用一张无视距离的【杀】,若此【杀】造成伤害,你摸一张牌。", yufa: "驭法", yufa_info: "在任意一名其他角色的结束阶段,若你于此回合内受过其伤害,你可以将一张传送门交给除此角色外的任意一名角色。", @@ -10523,7 +10509,7 @@ game.import("character", function () { jixuan_info: "锁定技,回合结束后,你摸一张牌进行一个额外的回合。", biri: "蔽日", biri_info: - "每当距离你1以内的一名其他角色成为杀的惟一目标时,若杀的使用者不是你,你可以弃置一张闪取消之。", + "每当距离你1以内的一名其他角色成为【杀】的唯一目标时,若【杀】的使用者不是你,你可以弃置一张闪取消之。", stuxi: "吐息", stuxi2: "吐息", stuxi2_bg: "息", @@ -10531,7 +10517,7 @@ game.import("character", function () { bingdong: "冰冻", bingdong_info: "锁定技,你在一个回合内首次造成伤害后,获得一个冰冻零件。", ronghuo: "熔火", - ronghuo_info: "锁定技,你的普通杀均视为火杀。", + ronghuo_info: "锁定技,你的普通【杀】均视为火【杀】。", luoshi: "落石", luoshi_info: "锁定技,每当你受到一次伤害,你与伤害来源各随机弃置一张牌。", moyao: "魔曜", @@ -10557,12 +10543,12 @@ game.import("character", function () { hszuzhou_nvwudeganguo_info: "出牌阶段对一名角色使用,目标弃置一张牌,然后随机获得一张炉石衍生牌。", hszuzhou_nvwudepingguo: "女巫的苹果", - hszuzhou_nvwudepingguo_info: "出牌阶段对一名角色使用,目标获得两张杀。", + hszuzhou_nvwudepingguo_info: "出牌阶段对一名角色使用,目标获得两张【杀】。", hszuzhou_nvwudexuetu: "女巫的学徒", hszuzhou_nvwudexuetu_info: "出牌阶段对没有咒降技能的角色使用,令目标非锁定技失效,并获得技能咒降直到下一回合结束。", hszuzhou_wushushike: "巫术时刻", - hszuzhou_wushushike_info: "出牌阶段对所有角色使用,将手牌中的闪替换为杀。", + hszuzhou_wushushike_info: "出牌阶段对所有角色使用,将手牌中的闪替换为【杀】。", hszuzhou_guhuo: "蛊惑", hszuzhou_guhuo_info: "出牌阶段对一名其他角色使用,令其交给你一张牌。", xjumo: "聚魔", @@ -10583,7 +10569,7 @@ game.import("character", function () { xshixin_info_alter: "锁定技,每当你对一名其他角色造成一次伤害,若受伤害角色体力值不小于你,其与你各失去1点体力。", xmojian: "魔箭", - xmojian_info: "每当你的武将牌翻至正面时,你可以指定一名角色视为对其使用了一张杀。", + xmojian_info: "每当你的武将牌翻至正面时,你可以指定一名角色视为对其使用了一张【杀】。", enze: "恩泽", enze_info: "出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃三张牌)。", oldenze: "恩泽", @@ -10716,7 +10702,7 @@ game.import("character", function () { tuteng5: "法潮图腾", tuteng5_info: "结束阶段,你摸一张牌。", tuteng6: "火舌图腾", - tuteng6_info: "在你的回合内,你的杀造成的首次伤害+1。", + tuteng6_info: "在你的回合内,你的【杀】造成的首次伤害+1。", tuteng7: "活力图腾", tuteng7_info: "结束阶段,你令一名其他角色回复1点体力。", tuteng8: "图腾魔像", diff --git a/character/huicui/character.js b/character/huicui/character.js index ef4a78ab28..2ed130eab8 100644 --- a/character/huicui/character.js +++ b/character/huicui/character.js @@ -1,18 +1,18 @@ const characters = { dc_sp_zhurong: ["female", "qun", 4, ["dcmanhou"]], - yue_zhugeguo: ["female", "shu", 3, ["dcxidi", "dcchengyan"]], - yue_zoushi: ["female", "qun", 3, ["dcyunzheng", "dchuoxin"]], + yue_zhugeguo: ["female", "shu", 3, ["dcxidi", "dcchengyan"], ["name:诸葛|果"]], + yue_zoushi: ["female", "qun", 3, ["dcyunzheng", "dchuoxin"], ["name:邹|null"]], yue_miheng: ["male", "qun", 3, ["dcjigu", "dcsirui"]], dc_lifeng: ["male", "shu", 3, ["dctunchu", "dcshuliang"]], wupu: ["male", "qun", 4, ["dcduanti", "dcshicao"]], zangba: ["male", "wei", 4, ["rehengjiang"]], - gongsunxiu: ["male", "qun", 4, ["dcgangu", "dckuizhen"]], + gongsunxiu: ["male", "qun", 4, ["dcgangu", "dckuizhen"], ["name:公孙|修"]], dc_liuli: ["male", "shu", 3, ["dcfuli", "dcdehua"]], - yue_daqiao: ["female", "wu", 3, ["dcqiqin", "dczixi"]], + yue_daqiao: ["female", "wu", 3, ["dcqiqin", "dczixi"], ["name:桥|null"]], dc_kongrong: ["male", "qun", 3, ["dckrmingshi", "lirang"]], dc_sp_menghuo: ["male", "qun", 4, ["dcmanwang"]], dc_lingcao: ["male", "wu", "4/5", ["dcdufeng"]], - yue_xiaoqiao: ["female", "wu", 3, ["dcqiqin", "dcweiwan"]], + yue_xiaoqiao: ["female", "wu", 3, ["dcqiqin", "dcweiwan"], ["name:桥|null"]], dc_dongzhao: ["male", "wei", 3, ["dcyijia", "dcdingji"]], kuaiqi: ["male", "wei", 3, ["dcliangxiu", "dcxunjie"]], yue_caiyong: ["male", "qun", 3, ["dcjiaowei", "dcfeibai"]], @@ -20,10 +20,10 @@ const characters = { dc_jiachong: ["male", "wei", 3, ["dcbeini", "dcshizong"]], dc_sunchen: ["male", "wu", 4, ["dczigu", "dczuowei"]], dc_zhangmancheng: ["male", "qun", 4, ["dclvecheng", "dczhongji"]], - yue_zhoufei: ["female", "wu", 3, ["dclingkong", "dcxianshu"]], + yue_zhoufei: ["female", "wu", 3, ["dclingkong", "dcxianshu"], ["name:周|null"]], dc_wuban: ["male", "shu", 4, ["dcyouzhan"], ["clan:陈留吴氏"]], yue_caiwenji: ["female", "qun", 3, ["dcshuangjia", "dcbeifen"]], - liuchongluojun: ["male", "qun", 3, ["dcminze", "dcjini"]], + liuchongluojun: ["male", "qun", 3, ["dcminze", "dcjini"], ["name:刘|宠-骆|俊"]], yuechen: ["male", "wei", 4, ["dcporui", "dcgonghu"]], zhangkai: ["male", "qun", 4, ["dcxiangshu"]], gaoxiang: ["male", "shu", 4, ["dcchiying"]], @@ -34,27 +34,27 @@ const characters = { mengjie: ["male", "qun", 3, ["dcyinlu", "dcyouqi"]], dc_huojun: ["male", "shu", 4, ["dcgue", "dcsigong"]], dc_sunhanhua: ["female", "wu", 3, ["dchuiling", "dcchongxu"]], - dc_sunziliufang: ["male", "wei", 3, ["dcqinshen", "dcweidang"]], - yuantanyuanxiyuanshang: ["male", "qun", 4, ["dcneifa"]], + dc_sunziliufang: ["male", "wei", 3, ["dcqinshen", "dcweidang"], ["name:孙|资-刘|放"]], + yuantanyuanxiyuanshang: ["male", "qun", 4, ["dcneifa"], ["name:袁|谭-袁|尚-袁|熙"]], qiaorui: ["male", "qun", 4, ["dcaishou", "dcsaowei"]], xianglang: ["male", "shu", 3, ["dckanji", "dcqianzheng"]], qinlang: ["male", "wei", 4, ["dchaochong", "dcjinjin"]], - furongfuqian: ["male", "shu", "4/6", ["dcxuewei", "dcyuguan"]], + furongfuqian: ["male", "shu", "4/6", ["dcxuewei", "dcyuguan"], ["name:傅|肜-傅|佥"]], zhenghun: ["male", "wei", 3, ["dcqiangzhi", "dcpitian"]], - dc_zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "dcqingren", "dclongyuan"]], + dc_zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "dcqingren", "dclongyuan"], ["name:赵|统-赵|广"]], dc_huanghao: ["male", "shu", 3, ["dcqinqing", "huisheng", "dccunwei"]], liupi: ["male", "qun", 4, ["dcjuying"]], dc_sp_jiaxu: ["male", "wei", 3, ["zhenlue", "dcjianshu", "dcyongdi"]], leibo: ["male", "qun", 4, ["dcsilve", "dcshuaijie"]], - gongsundu: ["male", "qun", 4, ["dczhenze", "dcanliao"]], + gongsundu: ["male", "qun", 4, ["dczhenze", "dcanliao"], ["name:公孙|度"]], panghui: ["male", "wei", 5, ["dcyiyong", "dcsuchou"]], dc_yuejiu: ["male", "qun", 4, ["dccuijin"]], chenjiao: ["male", "wei", 3, ["dcxieshou", "dcqingyan", "dcqizi"]], wanglie: ["male", "qun", 3, ["dcchongwang", "dchuagui"]], chengui: ["male", "qun", 3, ["dcyingtu", "dccongshi"]], dc_huangquan: ["male", "shu", 3, ["dcquanjian", "dctujue"]], - yinfuren: ["female", "wei", 3, ["dcyingyu", "dcyongbi"]], - dc_lvkuanglvxiang: ["male", "wei", 4, ["dcshuhe", "dcliehou"]], + yinfuren: ["female", "wei", 3, ["dcyingyu", "dcyongbi"], ["name:尹|null"]], + dc_lvkuanglvxiang: ["male", "wei", 4, ["dcshuhe", "dcliehou"], ["name:吕|旷-吕|翔"]], guanhai: ["male", "qun", 4, ["suoliang", "qinbao"]], huzhao: ["male", "qun", 3, ["midu", "xianwang"]], dc_liuba: ["male", "shu", 3, ["dczhubi", "dcliuzhuan"]], @@ -62,8 +62,8 @@ const characters = { zongyu: ["male", "shu", 3, ["zyqiao", "chengshang"]], dc_jiling: ["male", "qun", 4, ["dcshuangren"]], dc_yanghu: ["male", "wei", 3, ["dcdeshao", "dcmingfa"]], - caimaozhangyun: ["male", "wei", 4, ["lianzhou", "jinglan"]], - tenggongzhu: ["female", "wu", 3, ["xingchong", "liunian"]], + caimaozhangyun: ["male", "wei", 4, ["lianzhou", "jinglan"], ["name:蔡|瑁-张|允"]], + tenggongzhu: ["female", "wu", 3, ["xingchong", "liunian"], ["name:孙|null"]], dc_huangchengyan: ["male", "qun", 3, ["dcjiezhen", "dczecai", "dcyinshi"]], dc_gaolan: ["male", "qun", 4, ["xizhen"]], guanning: ["male", "qun", "3/7", ["dunshi"]], @@ -73,7 +73,7 @@ const characters = { fengxi: ["male", "wu", 3, ["yusui", "boyan"]], re_miheng: ["male", "qun", 3, ["rekuangcai", "reshejian"]], re_chendeng: ["male", "qun", 3, ["refuyuan", "reyingshui", "rewangzu"]], - wanniangongzhu: ["female", "qun", 3, ["zhenge", "xinghan"]], + wanniangongzhu: ["female", "qun", 3, ["zhenge", "xinghan"], ["name:刘|null"]], re_xunchen: ["male", "qun", 3, ["refenglve", "anyong"], ["clan:颍川荀氏"]], re_kanze: ["male", "wu", 3, ["xiashu", "rekuanshi"]], lvlingqi: ["female", "qun", 4, ["guowu", "zhuangrong"]], @@ -83,7 +83,7 @@ const characters = { mengyou: ["male", "qun", 5, ["manyi", "dcmanzhi"]], liuyong: ["male", "shu", 3, ["zhuning", "fengxiang"]], dc_sunru: ["female", "wu", 3, ["xiecui", "youxu"]], - xiahoulingnv: ["female", "wei", 4, ["fuping", "weilie"]], + xiahoulingnv: ["female", "wei", 4, ["fuping", "weilie"], ["name:夏侯|令女"]], zhangyao: ["female", "wu", 3, ["yuanyu", "xiyan"]], tengyin: ["male", "wu", 3, ["chenjian", "xixiu"]], zhangxuan: ["female", "wu", 4, ["tongli", "shezang"]], @@ -95,12 +95,12 @@ const characters = { re_dongbai: ["female", "qun", 3, ["relianzhu", "rexiahui"]], zhoushan: ["male", "wu", 4, ["dcmiyun", "dcdanying"]], dc_caiyang: ["male", "wei", 4, ["dcxunji", "dcjiaofeng"]], - xiahoujie: ["male", "wei", 5, ["liedan", "zhuangdan"]], + xiahoujie: ["male", "wei", 5, ["liedan", "zhuangdan"], ["name:夏侯|杰"]], caoxing: ["male", "qun", 4, ["cxliushi", "zhanwan"]], re_chunyuqiong: ["male", "qun", 4, ["recangchu", "reliangying", "reshishou"]], xingdaorong: ["male", "qun", "4/6", ["xuxie"]], re_panfeng: ["male", "qun", 4, ["xinkuangfu"]], - jiangfei: ["male", "shu", 3, ["dcshengxi", "dcshoucheng"]], + jiangfei: ["male", "shu", 3, ["dcshengxi", "dcshoucheng"], ["name:蒋|琬-费|祎"]], }; export default characters; diff --git a/character/huicui/characterReplace.js b/character/huicui/characterReplace.js index 1f982bd591..87d6e47f44 100644 --- a/character/huicui/characterReplace.js +++ b/character/huicui/characterReplace.js @@ -1,5 +1,11 @@ const characterReplaces = { lifeng: ["dc_lifeng", "lifeng"], + liuyong: ["liuyong", "jsrg_liuyong"], + qiaorui: ["qiaorui", "tw_qiaorui"], + gaoxiang: ["gaoxiang", "jsrg_gaoxiang"], + zhangchu: ["zhangchu", "jsrg_zhangchu"], + mamidi: ["mamidi", "xin_mamidi"], + re_chunyuqiong: ["re_chunyuqiong", "re_chunyuqiong", "chunyuqiong", "jsrg_chunyuqiong"], }; export default characterReplaces; diff --git a/character/huicui/skill.js b/character/huicui/skill.js index 3f4612d7c3..0120f139a3 100644 --- a/character/huicui/skill.js +++ b/character/huicui/skill.js @@ -22,7 +22,6 @@ const skills = { var list = Array.from({ length: 4, }).map((_, i) => get.cnNumber(i + 1, true)); - console.log(list); if (get.effect(player, { name: "losehp" }, player, player) > 4 || player.countCards("hs", card => player.canSaveCard(card, player)) > 0 || player.hp > 2) return "四"; return "二"; }, @@ -355,12 +354,34 @@ const skills = { }) ) return false; - return event.target != player && event.target.countCards("h"); + return event.isFirstTarget && event.targets.some(current => current != player && current.countCards("h")); + }, + locked: true, + async cost(event, trigger, player) { + if (trigger.targets.length == 1) { + event.result = { + bool: true, + targets: trigger.targets, + }; + } else { + event.result = await player + .chooseTarget( + get.prompt2("dchuoxin"), + (card, player, target) => { + return target != player && target.countCards("h") && get.event("targets").includes(target); + }, + true + ) + .set("ai", target => { + const player = get.player(); + return -get.attitude(player, target); + }) + .set("targets", trigger.targets) + .forResult(); + } }, - forced: true, - logTarget: "target", async content(event, trigger, player) { - const target = trigger.target; + const target = event.targets[0]; const result = await player.choosePlayerCard("h", target, true, "惑心:展示" + get.translation(target) + "的一张手牌").forResult(); if (result.bool) { let cards = result.cards.slice(); @@ -613,11 +634,11 @@ const skills = { audio: 2, trigger: { global: "phaseEnd" }, filter(event, player) { - return player.countCards("h") && game.hasPlayer(target => !target.countCards("h")); + return player.countCards("he") && game.hasPlayer(target => !target.countCards("h")); }, async cost(event, trigger, player) { const num = Math.min( - player.countCards("h"), + player.countCards("he"), game.countPlayer(target => !target.countCards("h")) ); let list = []; @@ -628,7 +649,7 @@ const skills = { .chooseCardTarget({ prompt: list.length ? "是否继续发动【输粮】?" : get.prompt("dcshuliang"), prompt2: lib.translate.dcshuliang_info, - position: "h", + position: "he", animate: false, filterCard(card, player) { return !get.event("list").some(list => list[1] == card); @@ -1690,7 +1711,7 @@ const skills = { usable: 1, forced: true, async content(event, trigger, player) { - await player.draw(2); + await player.draw(3); await player.loseHp(); }, ai: { @@ -1706,7 +1727,8 @@ const skills = { }); }, filterTarget(card, player, target) { - return target.countCards("h") > player.countCards("h") || target.getHp() > player.getHp(); + if (target == player) return false; + return target.countCards("h") >= player.countCards("h") || target.getHp() >= player.getHp(); }, usable: 1, forced: true, @@ -5148,18 +5170,23 @@ const skills = { filterTarget: function (card, player, target) { return target.hp <= player.hp; }, - content: function () { - "step 0"; - var targets = game.filterPlayer(current => target.inRange(current) && current != player).sortBySeat(player); - event.targets = targets; - if (!targets.length) event.finish(); - "step 1"; - var current = targets.shift(); - if (current.countCards("he")) current.chooseToDiscard("驰应:请弃置一张牌", "he", true); - if (targets.length) event.redo(); - "step 2"; + async content(event, tirgger, player) { + const target = event.target, targets = [player]; + while (game.hasPlayer(current => target.inRange(current) && !targets.includes(current))) { + const result = await target.chooseTarget("驰应:是否弃置攻击范围内一名角色一张牌?", function (card, player, target) { + return _status.event.player.inRange(target) && !_status.event.targets.includes(target); + }).set("targets", targets).set('ai', function (target) { + return get.effect(target, { name: "guohe_copy2" }, _status.event.player, _status.event.player); + }).forResult(); + if (result.bool) { + target.line(result.targets, 'green'); + await target.discardPlayerCard(result.targets[0], true, "he"); + targets.addArray(result.targets); + } + else break; + } if (target != player) { - var cards = []; + let cards = []; game.getGlobalHistory("cardMove", evt => { if (evt.getParent(3) == event) { cards.addArray(evt.cards.filter(card => get.type(card) == "basic")); @@ -6753,9 +6780,11 @@ const skills = { check: function (event, player) { var num = player.getDamagedHp() - 1; if (num <= 0) return false; - return game.hasPlayer(target => { - return get.attitude(player, target) > 0 && target.maxHp - target.countCards("h") > 1; - }); + return game.countPlayer(target => { + if (player === target) return player.maxHp - player.countCards("h") - 1; + if (get.attitude(player, target) > 0) return target.maxHp - target.countCards("h"); + return 0; + }) > 1; }, content: function () { "step 0"; @@ -6764,7 +6793,7 @@ const skills = { var num = player.getDamagedHp(); if (!player.isIn() || !num) event.finish(); else - player.chooseTarget("御关:令至多" + get.cnNumber(num) + "名角色将手牌摸至体力上限", Math.min(game.countPlayer(), [1, num]), true).set("ai", target => { + player.chooseTarget("御关:令至多" + get.cnNumber(num) + "名角色将手牌摸至体力上限", [1, Math.min(game.countPlayer(), num)], true).set("ai", target => { return get.attitude(_status.event.player, target) * Math.max(0.1, target.maxHp - target.countCards("h")); }); "step 2"; @@ -7850,21 +7879,12 @@ const skills = { .set( "choice", (() => { - var effect = 0; - if (list.length == 2) { - if (list.includes("选项一")) { - loses.forEach(i => (effect += get.effect(i, { name: "losehp" }, player, player))); - if (effect > 0) return "选项一"; - } else { - recovers.forEach(i => (effect += get.recoverEffect(i, player, player))); - if (effect > 0) return "选项二"; - } - } else { - loses.forEach(i => (effect += get.effect(i, { name: "losehp" }, player, player))); - recovers.forEach(i => (effect += get.recoverEffect(i, player, player))); - if (effect > 0) return "选项二"; - return "选项一"; - } + let eff1 = loses.reduce((prev, i) => prev + get.effect(i, { name: "losehp" }, player, player), 0), + eff2 = recovers.reduce((prev, i) => prev + get.recoverEffect(i, player, player), 0), + max = Math.max(0, eff1, eff2); + if (max === 0) return "cancel2"; + if (eff1 > eff2) return "选项一"; + return "选项二"; })() ); "step 1"; @@ -9693,7 +9713,7 @@ const skills = { charlotte: true, locked: true, skillBlocker: function (skill, player) { - return skill != "bazhen" && skill != "dcjiezhen_blocker" && !lib.skill[skill].charlotte && !info.persevereSkill && player.getStorage("dcjiezhen_blocker").includes(skill); + return skill != "bazhen" && skill != "dcjiezhen_blocker" && !lib.skill[skill].charlotte && !lib.skill[skill].persevereSkill && player.getStorage("dcjiezhen_blocker").includes(skill); }, mark: true, marktext: "阵", @@ -11250,9 +11270,7 @@ const skills = { if (att <= 0) { if ( !player.hasSkill("yaopei") || - player.hasHistory("useSkill", function (evt) { - return evt.skill == "huguan" && evt.targets.includes(target); - }) || + !player.countCards("he") || target.needsToDiscard() - target.needsToDiscard(-target.countCards("h") / 4) > (att > -2 ? 1.6 : 1) ) return "cancel2"; @@ -11329,7 +11347,7 @@ const skills = { filter: function (event, player) { if (player == event.player || !event.player.isIn()) return false; if ( - !player.hasAllHistory("useSkill", function (evt) { + !player.hasHistory("useSkill", function (evt) { return evt.skill == "huguan" && evt.targets.includes(event.player); }) ) @@ -12662,7 +12680,7 @@ const skills = { content: function () { "step 0"; var hs = player.getCards("h"); - player.showCards(hs, get.translation(player) + "发动了【帼舞】"); + player.showCards(hs, get.translation(player) + "发动了【帼武】"); var list = []; for (var i of hs) { list.add(get.type2(i, player)); @@ -12707,7 +12725,7 @@ const skills = { return !trigger.targets.includes(current) && lib.filter.targetEnabled2(trigger.card, player, current) && lib.filter.targetInRange(trigger.card, player, current); }); player - .chooseTarget("帼舞:是否为" + get.translation(trigger.card) + "增加" + (num > 1 ? "至多两个" : "一个") + "目标?", [1, Math.min(2, num)], function (card, player, target) { + .chooseTarget("帼武:是否为" + get.translation(trigger.card) + "增加" + (num > 1 ? "至多两个" : "一个") + "目标?", [1, Math.min(2, num)], function (card, player, target) { var trigger = _status.event.getTrigger(); var card = trigger.card; return !trigger.targets.includes(target) && lib.filter.targetEnabled2(card, player, target) && lib.filter.targetInRange(card, player, target); @@ -13168,28 +13186,24 @@ const skills = { }) .setHiddenSkill("wanggui") .forResult(); - else + else { event.result = await player .chooseBool("望归:是否令与你势力相同的角色各摸一张牌?") .setHiddenSkill("wanggui") - .set("logSkill", [ - "wanggui", - game.filterPlayer(current => { - return current.isFriendOf(player); - }), - ]) .forResult(); + event.result.targets = game.filterPlayer(current => { + return current.isFriendOf(player); + }); + } }, async content(event, trigger, player) { if (player.isUnseen(2)) { const target = event.targets[0]; target.damage("nocard"); } else { - const targets = game.filterPlayer(current => { - return current.isFriendOf(player); - }); + const targets = event.targets; targets.sortBySeat(); - game.asyncDraw(targets); + await game.asyncDraw(targets); } }, }, @@ -13383,7 +13397,7 @@ const skills = { player.chooseToDiscard("h", true); }, ai: { - halfneg: true, + neg: true, nokeep: true, }, }, diff --git a/character/huicui/translate.js b/character/huicui/translate.js index b2e4bd9c1c..1f029452e4 100644 --- a/character/huicui/translate.js +++ b/character/huicui/translate.js @@ -116,7 +116,7 @@ const translates = { zhtongyuan: "同援", zhtongyuan_info: "锁定技。①当你使用红色锦囊牌后,你于〖摧坚〗后增加“若其手牌中没有【闪】,则你摸两张牌”;②当你使用或打出红色基本牌后,你删除〖摧坚〗中的“,然后你交给其等量的牌”。③当你使用红色的普通锦囊牌/基本牌时,若你已发动过〖摧坚①〗和〖摧坚②〗,则此牌不可被响应/可额外增加一个目标。", lvlingqi: "吕玲绮", - guowu: "帼舞", + guowu: "帼武", guowu_info: "出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】或普通锦囊牌可以多指定至多两个目标。", guowu_info_guozhan: "出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】可以多指定至多两个目标。", zhuangrong: "妆戎", @@ -297,7 +297,7 @@ const translates = { dcqingren: "青刃", dcqingren_info: "结束阶段,你可以摸X张牌(X为你本回合发动〖翊赞〗的次数)。", dclongyuan: "龙渊", - dclongyuan_info: "锁定技。一名角色的回合结束时,若你本局游戏已发动过至少三次〖翊赞〗,你摸两张牌并回复1点体力,修改〖翊赞〗。", + dclongyuan_info: "觉醒技。一名角色的回合结束时,若你本局游戏已发动过至少三次〖翊赞〗,你摸两张牌并回复1点体力,修改〖翊赞〗。", zhenghun: "郑浑", dcqiangzhi: "强峙", dcqiangzhi_info: "出牌阶段限一次。你可以弃置你和一名其他角色的共计三张牌。然后若你与其之中有角色因此失去了三张牌,该角色对另一名角色造成1点伤害。", @@ -386,7 +386,7 @@ const translates = { dcyunjiu_info: "一名角色死亡后,你可以弃置等同于其因死亡事件的规则而弃置的牌数,将其此次弃置的牌交给一名其他角色。然后你加1点体力上限并回复1点体力。", gaoxiang: "高翔", dcchiying: "驰应", - dcchiying_info: "出牌阶段限一次。你可以选择一名体力不大于你的角色,令其攻击范围内的其他角色依次弃置一张牌。然后若你选择的角色不为你,其获得以此法弃置的牌中所有的基本牌。", + dcchiying_info: "出牌阶段限一次。你可以选择一名体力不大于你的角色,令其可以弃置其攻击范围内的任意名其他角色各一张牌。然后若该角色不为你,其获得以此法弃置的牌中所有的基本牌。", zhangkai: "张闿", dcxiangshu: "相鼠", dcxiangshu_info: "其他角色的出牌阶段开始时,若其手牌数不小于其体力值,你可以选择一个不大于5的非负整数,然后你弃置一张牌或声明此数字。若如此做,此阶段结束时,若其手牌数与你选择的数字:差值不大于1,你获得其一张牌;相等,你对其造成1点伤害。", @@ -493,9 +493,9 @@ const translates = { dcdehua_info: "锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗,然后本局游戏你的伤害牌不计手牌上限。②你的手牌上限+Y(Y为你〖德化①〗选择过的牌名数)。", gongsunxiu: "公孙修", dcgangu: "干蛊", - dcgangu_info: "锁定技。每回合限一次。当其他角色失去体力后,你摸两张牌,然后失去1点体力。", + dcgangu_info: "锁定技。每回合限一次。当其他角色失去体力后,你摸三张牌,然后失去1点体力。", dckuizhen: "溃阵", - dckuizhen_info: "出牌阶段限一次。你可以令一名手牌数或体力值大于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。", + dckuizhen_info: "出牌阶段限一次。你可以令一名手牌数或体力值不小于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。", dcshiju: "势举", dcshiju_info: "其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+X(X为你装备区里的牌数)。若你以此法替换了装备,你与其各摸两张牌。", dcyingshi: "应时", @@ -531,7 +531,7 @@ const translates = { //dctunchu_info: "锁定技。①你的起始手牌数为游戏人数的四倍。②你的手牌不能被弃置。③准备阶段,若你的手牌数大于你的体力上限,则你本回合至多使用三张牌。", dctunchu_info: "锁定技。①游戏开始时,你将手牌数摸至游戏人数的四倍。②你的手牌不能被弃置。③准备阶段,若你的手牌数大于你的体力值,则你本回合至多使用三张牌。", dcshuliang: "输粮", - dcshuliang_info: "一名角色的回合结束时,你可以将任意张手牌交给任意名没有手牌的角色各一张,然后本次获得可以指定自己为目标的牌的角色可以依次选择是否使用本次获得的牌。", + dcshuliang_info: "一名角色的回合结束时,你可以将任意张牌交给任意名没有手牌的角色各一张,然后本次获得可以指定自己为目标的牌的角色可以依次选择是否使用本次获得的牌。", yue_miheng: "乐祢衡", yue_miheng_prefix: "乐", dcjigu: "激鼓", @@ -544,7 +544,7 @@ const translates = { dcyunzheng_tag: "筝", dcyunzheng_info: "锁定技。①游戏开始时,你将所有手牌标记为“筝”。②你的“筝”牌不计入手牌上限。③手牌中有“筝”的角色的非锁定技失效。", dchuoxin: "惑心", - dchuoxin_info: "锁定技,当你使用手牌指定其他角色为目标后,你展示其一张手牌。若此牌为“筝”牌或与你使用牌花色相同,你获得之;否则你将此牌标记为“筝”。", + dchuoxin_info: "锁定技,当你使用手牌指定其他角色为目标后,你展示其中一名角色一张手牌。若此牌为“筝”牌或与你使用牌花色相同,你获得之;否则你将此牌标记为“筝”。", yue_zhugeguo: "乐诸葛果", yue_zhugeguo_prefix: "乐", dcxidi: "羲笛", diff --git a/character/huicui/voices.js b/character/huicui/voices.js index 0d8fb91e9e..c279818816 100644 --- a/character/huicui/voices.js +++ b/character/huicui/voices.js @@ -449,8 +449,6 @@ export default { "#dc_lifeng:die": "黍穗重丰,不见丞相还……", "#dcfudou1": "既作困禽,何妨铤险以覆车?", "#dcfudou2": "据将覆之巢,必作犹斗之困兽。", - "#sppanqin1": "百兽嘶鸣筋骨振,蛮王起兮万人随!", - "#sppanqin2": "呼勒格诗惹之民,召南中群雄复起!", "#dctaji1": "仙途本寂寥,结发叹长生。", "#dctaji2": "仙者不言,手执春风。", "#dcqinghuang1": "上士无争,焉生妄心。", diff --git a/character/jiange.js b/character/jiange.js index a2fd017bca..ddf8d18d6b 100644 --- a/character/jiange.js +++ b/character/jiange.js @@ -597,7 +597,7 @@ game.import("character", function () { zhinang_info: "准备阶段,你可以亮出牌堆顶的三张牌,你可以将其中锦囊或装备牌交给一名角色。", tianyu_info: "结束阶段,你可以将任意名未横置的其他角色横置。", juechen: "绝尘", - juechen_info: "每当你使用一张杀,可以弃置一名其他角色的一张牌(不能是杀的目标)。", + juechen_info: "每当你使用一张【杀】,可以弃置一名其他角色的一张牌(不能是【杀】的目标)。", chiying: "持盈", chiying_info: "每当一名角色受到多于1伤害时,你可以令其防止其余伤害,然后令伤害来源摸一张牌。", jingfan: "惊帆", diff --git a/character/jsrg/character.js b/character/jsrg/character.js index 3c74180a70..0af3481cda 100644 --- a/character/jsrg/character.js +++ b/character/jsrg/character.js @@ -6,42 +6,37 @@ const characters = { hp: 4, skills: ["jsrgchaozheng", "jsrgshenchong", "jsrgjulian"], isZhugong: true, - dieAudios: ["liuhong"], }, jsrg_hejin: { sex: "male", group: "qun", hp: 4, skills: ["jsrgzhaobing", "jsrgzhuhuan", "jsrgyanhuo"], - dieAudios: ["hejin"], }, jsrg_sunjian: { sex: "male", group: "qun", hp: 4, skills: ["jsrgpingtao", "jsrgjuelie"], - dieAudios: ["sunjian"], }, jsrg_huangfusong: { sex: "male", group: "qun", hp: 4, + names: "皇甫|嵩", skills: ["jsrgguanhuo", "jsrgjuxia"], - dieAudios: ["huangfusong"], }, jsrg_xushao: { sex: "male", group: "qun", hp: 3, skills: ["sbyingmen", "sbpingjian"], - dieAudios: ["xushao"], }, jsrg_dongbai: { sex: "female", group: "qun", hp: 3, skills: ["jsrgshichong", "jsrglianzhu"], - dieAudios: ["dongbai"], }, jsrg_qiaoxuan: { sex: "male", @@ -69,14 +64,12 @@ const characters = { group: "qun", hp: 4, skills: ["jsrgfendi", "jsrgjuxiang"], - dieAudios: ["zhujun"], }, jsrg_liubei: { sex: "male", group: "qun", hp: 4, skills: ["jsrgjishan", "jsrgzhenqiao"], - dieAudios: ["liubei"], }, jsrg_wangyun: { sex: "male", @@ -84,7 +77,6 @@ const characters = { hp: 3, skills: ["jsrgshelun", "jsrgfayi"], clans: ["太原王氏"], - dieAudios: ["wangyun"], }, jsrg_liuyan: { sex: "male", @@ -99,14 +91,13 @@ const characters = { group: "qun", hp: 4, skills: ["jsrgzhenglve", "jsrghuilie"], - dieAudios: ["caocao"], }, jsrg_nanhualaoxian: { sex: "male", group: "qun", hp: 3, + names: "庄|周", skills: ["jsrgshoushu", "jsrgxundao", "jsrglinghua"], - dieAudios: ["nanhualaoxian"], }, //承 jsrg_sunce: { @@ -115,7 +106,6 @@ const characters = { hp: 4, skills: ["jsrgduxing", "jsrgzhiheng", "jsrgzhasi", "jsrgbashi"], isZhugong: true, - dieAudios: ["sunce"], }, jsrg_xuyou: { sex: "male", @@ -123,7 +113,6 @@ const characters = { hp: 3, skills: ["jsrglipan", "jsrgqingxi", "jsrgjinmie"], doubleGroup: ["wei", "qun"], - dieAudios: ["xuyou"], }, jsrg_lvbu: { sex: "male", @@ -131,7 +120,6 @@ const characters = { hp: 5, skills: ["jsrgwuchang", "jsrgqingjiao", "jsrgchengxu"], doubleGroup: ["shu", "qun"], - dieAudios: ["lvbu"], }, jsrg_zhanghe: { sex: "male", @@ -139,14 +127,13 @@ const characters = { hp: 4, skills: ["jsrgqiongtu", "jsrgxianzhu"], doubleGroup: ["wei", "qun"], - dieAudios: ["zhanghe"], }, jsrg_zoushi: { sex: "female", group: "qun", hp: 3, + names: "邹|null", skills: ["jsrgguyin", "jsrgzhangdeng"], - dieAudios: ["re_zoushi"], }, jsrg_guanyu: { sex: "male", @@ -154,21 +141,18 @@ const characters = { hp: 5, skills: ["jsrgguanjue", "jsrgnianen"], groupBorder: "wei", - dieAudios: ["guanyu"], }, jsrg_chendeng: { sex: "male", group: "qun", hp: 3, skills: ["jsrglunshi", "jsrgguitu"], - dieAudios: ["chendeng"], }, jsrg_zhenji: { sex: "female", group: "qun", hp: 3, skills: ["jsrgjixiang", "jsrgchengxian"], - dieAudios: ["zhenji"], }, jsrg_zhangliao: { sex: "male", @@ -176,21 +160,19 @@ const characters = { hp: 4, skills: ["jsrgzhengbing", "jsrgtuwei"], doubleGroup: ["wei", "qun"], - dieAudios: ["zhangliao"], }, jsrg_xugong: { sex: "male", group: "wu", hp: 3, skills: ["jsrgbiaozhao", "jsrgyechou"], - dieAudios: ["xugong"], }, jsrg_chunyuqiong: { sex: "male", group: "qun", hp: 4, skills: ["jsrgcangchu", "jsrgshishou"], - dieAudios: ["chunyuqiong"], + dieAudios: ["re_chunyuqiong"], }, //转 jsrg_guojia: { @@ -198,21 +180,18 @@ const characters = { group: "wei", hp: 3, skills: ["jsrgqingzi", "jsrgdingce", "jsrgzhenfeng"], - dieAudios: ["guojia"], }, jsrg_zhangfei: { sex: "male", group: "shu", hp: 5, skills: ["jsrgbaohe", "jsrgxushi"], - dieAudios: ["zhangfei"], }, jsrg_machao: { sex: "male", group: "qun", hp: 4, skills: ["jsrgzhuiming", "mashu"], - dieAudios: ["machao"], }, jsrg_lougui: { sex: "male", @@ -225,19 +204,18 @@ const characters = { group: "qun", hp: 4, skills: ["jsrgfuni", "jsrgchuanxin"], - dieAudios: ["zhangren"], }, jsrg_huangzhong: { sex: "male", group: "shu", hp: 4, skills: ["jsrgcuifeng", "jsrgdengnan"], - dieAudios: ["huangzhong"], }, jsrg_xiahourong: { sex: "male", group: "wei", hp: 4, + names: "夏侯|荣", skills: ["jsrgfenjian"], }, jsrg_sunshangxiang: { @@ -245,14 +223,12 @@ const characters = { group: "wu", hp: 3, skills: ["jsrgguiji", "jsrgjiaohao"], - dieAudios: ["sunshangxiang"], }, jsrg_pangtong: { sex: "male", group: "qun", hp: 3, skills: ["jsrgmanjuan", "jsrgyangming"], - dieAudios: ["pangtong"], }, jsrg_hansui: { sex: "male", @@ -260,7 +236,6 @@ const characters = { hp: 4, skills: ["jsrgniluan", "jsrghuchou", "jsrgjiemeng"], isZhugong: true, - dieAudios: ["hansui"], }, jsrg_zhangchu: { sex: "female", @@ -273,6 +248,7 @@ const characters = { sex: "male", group: "wei", hp: 4, + names: "夏侯|恩", skills: ["jsrghujian", "jsrgshili"], dieAudios: ["tw_xiahouen"], }, @@ -280,16 +256,16 @@ const characters = { sex: "male", group: "wu", hp: 5, + names: "范|强-张|达", skills: ["jsrgfushan"], - dieAudios: ["fanjiangzhangda"], }, //合 jsrg_zhugeliang: { sex: "male", group: "shu", hp: 3, + names: "诸葛|亮", skills: ["jsrgwentian", "jsrgchushi", "jsrgyinlve"], - dieAudios: ["zhugeliang"], }, jsrg_jiangwei: { sex: "male", @@ -297,28 +273,25 @@ const characters = { hp: 4, skills: ["jsrgjinfa", "jsrgfumou", "jsrgxuanfeng"], groupBorder: "wei", - dieAudios: ["jiangwei"], }, jsrg_luxun: { sex: "male", group: "wu", hp: 3, skills: ["jsrgyoujin", "jsrgdailao", "jsrgzhubei"], - dieAudios: ["luxun"], }, jsrg_zhaoyun: { sex: "male", group: "shu", hp: 4, skills: ["jsrglonglin", "jsrgzhendan"], - dieAudios: ["zhaoyun"], }, jsrg_simayi: { sex: "male", group: "wei", hp: 4, + names: "司马|懿", skills: ["jsrgyingshi", "jsrgtuigu"], - dieAudios: ["simayi"], }, jsrg_guoxun: { sex: "male", @@ -331,6 +304,7 @@ const characters = { group: "wu", hp: 3, maxHp: 4, + names: "孙|鲁班-孙|鲁育", skills: ["jsrgdaimou", "jsrgfangjie"], }, jsrg_caofang: { @@ -340,7 +314,6 @@ const characters = { maxHp: 4, skills: ["jsrgzhaotu", "jsrgjingju", "jsrgweizhui"], isZhugong: true, - dieAudios: ["caofang"], }, jsrg_sunjun: { sex: "male", @@ -359,6 +332,7 @@ const characters = { sex: "male", group: "wu", hp: 4, + names: "卫|温-诸葛|直", skills: ["jsrgfuhai"], dieAudios: ["weiwenzhugezhi"], }, @@ -395,12 +369,14 @@ const characters = { sex: "male", group: "qun", hp: 3, + names: "曹|节-王|甫", skills: ["jsrgzonghai", "jsrgjueyin"], }, jsrg_songhuanghou: { sex: "female", group: "qun", hp: 3, + names: "宋|null", skills: ["jsrgzhongzen", "jsrgxuchong"], }, jsrg_zhangjiao: { diff --git a/character/jsrg/intro.js b/character/jsrg/intro.js index e977ec82bc..7850a6083e 100644 --- a/character/jsrg/intro.js +++ b/character/jsrg/intro.js @@ -12,7 +12,7 @@ const characterIntro = { jsrg_zhugeliang: "建兴六年春,汉丞相诸葛亮使赵云、邓芝为先锋,马谡为副将拒箕谷,牵制曹真主力。自率三十万大军攻祁山,三郡叛魏应亮,关中响震。曹叡命张郃拒亮,亮使定军山降将姜维与郃战于街亭,张郃久攻不下。后曹真强攻赵云军,赵云死战,坚守箕谷,马谡、邓芝当场战死忠勇殉国。……既克张郃,曹真溃逃,曹叡弃守长安,迁都邺城。十月,司马懿击退孙权,回援曹真。而后三年,丞相所到之处,无不望风而降,皆箪食壶浆,以迎汉军。尽收豫、徐、兖、并之地,建兴十年春,司马懿父子三人死于诸葛武侯火计,同年,孙权上表称臣,至此四海清平,大汉一统。而后诸葛亮荐蒋琬为丞相,姜维为大将军,自回隆中归隐,后主挽留再三,皆不受。魏延亦辞官相随,侍奉左右。后主时有不决之事,便往隆中拜访相父,均未得面,童子答曰外出云游,遗数锦囊,拆而视之,皆治国之良策也。", jsrg_yuanshao: "太祖圣武皇帝,汝南汝阳人也,姓袁,讳绍,字本初。太祖于黎阳梦有一神授一宝刀,及觉,果在卧所,铭日思召。解之曰:思召,绍字也。 ……灵帝崩,少帝继位。卓议欲废立,太祖拒之,卓案剑吆曰:“竖子敢然!天下之事,岂不在我/我欲为之,谁敢不从!”绍勃然曰:“天下健者,岂惟董乎!”横剑径出。世人方知太祖贤名非以权势取之。实乃英雄气也。初平元年,太祖于勃海起兵,其从弟后将军术等十余位诸侯同时俱起,兴兵讨董。是时,豪杰既多附招,州郡蜂起,莫不以袁氏为名。……太祖既得冀州,尝出猎白登山,见一白鹿口含宝剑而来,获之,剑名中兴。或曰:汉失其鹿,陈逐而获之。建安五年,太祖与曹操战于官渡,曹操欲夜袭乌巢,恰有流星如火,光长十余丈照于曹营,昼有云如坏山,当营而陨, 不及地尺而散,吏士皆以为不详,太祖并兵俱攻大破之,操自军破后,头风病发,六年夏五月死。", yangqiu: "阳球(?-179年),字方正,渔阳泉州(今天津市武清县)人。阳球出身世代豪门,能击剑,习弓马,好申不害、韩非之学。以杀人复仇知名。初举孝谦,补尚书侍郎。后出任高唐令,辟于司徙刘宠府中,举高第。当时九江郡(治阴陵,今安徽定远西北)贼起,三府推举阳球有理奸之才,遂出任九江太守。阳球上任后,设下方略,将凶贼全部歼灭,又收捕郡中奸吏尽杀之。升任平原相,因治事严苦,征诣廷尉,罪当免官。但灵帝以其在九江时有功,任命其为议郎,升任将作大匠,坐事论。不久,任尚书令,奏请罢鸿都文学,书奏不省。光和二年(179年),升任司隶校尉,遂奏收中常侍王甫等人,阳球亲自拷问,五毒备极,王甫父子皆死于杖下。既杀王甫,阳球还欲诛杀曹节等人,使权门屏气,京师震畏。不久,曹节谮毁阳球,使其转任卫尉。其冬,阳球与司徙刘郃等欲诛宦官,反为所诬,遂被收缚洛阳狱,诛死。", - zhanghuan: "张奂(104-181年),字然明,又名张焕。敦煌渊泉今甘肃省瓜州县)人,后以功移籍弘农郡(今河南灵宝),书法家张芝的父亲。中国东汉经学家、军事家、文学家,“凉州三明”之一。早年师从太尉朱宠,研习《欧阳尚书》,自行删减《牟氏章句》。汉桓帝时,举贤良出身,对策第一,授议郎,历任安定都尉、武威太守、度辽将军、护匈奴中郎将等职。多次赢得对外战争,招抚外族,促进边境和平,功勋卓著。汉灵帝即位,迁大司农,受到宦官集团利用,讨伐大将军窦武。事后,上疏为窦武等人申冤。累迁太常卿,辞官归乡,授课著书,不再出仕。光和四年(181年),张奂去世,时年七十八。", + zhanghuan: "张奂(104-181年),字然明,又名张焕。敦煌渊泉(今甘肃省瓜州县)人,后以功移籍弘农郡(今河南灵宝),书法家张芝的父亲。中国东汉经学家、军事家、文学家,“凉州三明”之一。早年师从太尉朱宠,研习《欧阳尚书》,自行删减《牟氏章句》。汉桓帝时,举贤良出身,对策第一,授议郎,历任安定都尉、武威太守、度辽将军、护匈奴中郎将等职。多次赢得对外战争,招抚外族,促进边境和平,功勋卓著。汉灵帝即位,迁大司农,受到宦官集团利用,讨伐大将军窦武。事后,上疏为窦武等人申冤。累迁太常卿,辞官归乡,授课著书,不再出仕。光和四年(181年),张奂去世,时年七十八。", chenfan: "陈蕃(?-168年),字仲举。汝南平舆(今河南省平舆北)人。东汉时期名臣,与窦武、刘淑合称“三君”。陈蕃年少时有大志,举孝廉,授郎中。因母去世,辞官居丧。后由太尉李固荐举为乐安太守。因得罪大将军梁冀,由太守降为县令。为了零陵桂阳的流民山匪得罪皇帝身边的人,被外放为豫章太守。后升任大鸿胪。延熹六年(163年),陈蕃被征为尚书仆射,转太中大夫。延熹八年(165年),陈藩代杨秉为太尉,次年,被免官。永康元年(167年),汉桓帝去世,窦皇后临朝,以陈蕃为太傅,管理尚书事宜。次年,汉灵帝即位,陈藩与大将军窦武谋诛宦官,事泄,宦官曹节劫持汉灵帝与窦太后,诛杀窦武,又率宫中卫士包围了陈蕃,陈蕃率学士80人抵抗,被害,年七十余。", zhangju: "张举(生卒年不详),渔阳人,与张纯同郡,是东汉末年起义军将领,曾在汉朝担任泰山太守。中平四年(187年),张举受张纯挑唆,联合乌桓起兵攻打郡县,部众到达了十多万;张举自称天子,张纯自称弥天将军安定王,声称自己将取代汉朝。刘虞担任幽州牧后,用怀柔之策说服乌桓罢兵,并悬赏求购张举、张纯;两人逃出塞外,后来张纯被门客王政所杀,张举则下落不明。", caojiewangfu: "曹节(?―181年),字汉丰,南阳育阳(今河南省南阳市宛城区瓦店镇)人。东汉宦官。因事入宫,累迁西园骑。汉顺帝时期,迁小黄门。汉桓帝继位,迁中常侍,加任奉车都尉。拥戴汉灵帝有功,册封长安乡侯。联合长乐五官史朱瑀等矫诏诛杀窦武、陈蕃等人,升任长乐卫尉,进封育阳县侯。建宁二年(169年),加位特进、大长秋。权倾朝野,诬害勃海王刘悝,累迁尚书令。光和四年(181年),曹节去世,获赠车骑将军。
王甫(?—179年),东汉时期宦官。前十常侍之一。灵帝初为长乐食监,受中常侍曹节等矫诏为黄门令,将兵诛杀大将军窦武等人,因迁中常侍。后与节诬奏勃海王刘悝谋反,封冠军侯。由此操纵朝政,父兄子弟皆为公卿列校、牧守令长,布满天下。光和二年 (179),与养子永乐少府萌、沛相吉并为司隶校尉阳球收捕,磔尸于城门。", diff --git a/character/jsrg/skill.js b/character/jsrg/skill.js index dcdc9d0fe3..8f009e9c1f 100644 --- a/character/jsrg/skill.js +++ b/character/jsrg/skill.js @@ -332,13 +332,19 @@ const skills = { } } else { event.result = await player - .chooseTarget(get.prompt("jsrgruzong"), "令任意名角色将手牌数摸至与你相同", (card, player, target) => { - return target.countCards("h") < player.countCards("h"); - }) + .chooseTarget( + get.prompt("jsrgruzong"), + "令任意名角色将手牌数摸至与你相同", + (card, player, target) => { + return target.countCards("h") < player.countCards("h"); + }, + [1, Infinity] + ) .set("ai", target => { const player = get.player(); return (get.attitude(player, target) * Math.sqrt(player.countCards("h") - target.countCards("h"))) / (target.hasSkillTag("nogain") ? 1 : 10); - }); + }) + .forResult(); } }, async content(event, trigger, player) { @@ -347,7 +353,7 @@ const skills = { if (num > 0) await player.draw(num); } else { const num = player.countCards("h"); - game.asyncDraw(event.targets.sortBySeat(), target => { + await game.asyncDraw(event.targets.sortBySeat(), target => { return Math.min(5, num - target.countCards("h")); }); } @@ -615,11 +621,11 @@ const skills = { order: 9, result: { player(player, target) { - let tars = _status.event.putTempCache("jsrgguanshi", "targets", targets); + let tars = _status.event.getTempCache("jsrgguanshi", "targets"); if (!tars) return lib.card.juedou.ai.result.player(player, target); }, target(player, target) { - let tars = _status.event.putTempCache("jsrgguanshi", "targets", targets); + let tars = _status.event.getTempCache("jsrgguanshi", "targets"); if (!tars) return lib.card.juedou.ai.result.target(player, target); for (let tar of tars) { if (tar[0] === target) return tar[1] / get.attitude(player, target); @@ -1804,7 +1810,7 @@ const skills = { jsrgfumou: { audio: 2, trigger: { global: "chooseToDebateAfter" }, - groupSkill: true, + groupSkill: "wei", forced: true, locked: false, filter: function (event, player) { @@ -1896,7 +1902,7 @@ const skills = { enable: "chooseToUse", filterCard: { name: "ying" }, position: "hs", - groupSkill: true, + groupSkill: "shu", locked: false, viewAs: { name: "sha", @@ -5994,7 +6000,7 @@ const skills = { if (player.group != "qun") return false; return game.hasPlayer(current => lib.skill.jsrgqingxi.filterTarget("", player, current)); }, - groupSkill: true, + groupSkill: "qun", filterTarget: function (card, player, target) { if (target.countCards("h") >= player.countCards("h")) return false; return !player.getStorage("jsrgqingxi_used").includes(target); @@ -6051,7 +6057,7 @@ const skills = { if (player.group != "wei") return false; return game.hasPlayer(current => current.countCards("h") > player.countCards("h")); }, - groupSkill: true, + groupSkill: "wei", filterTarget: function (card, player, target) { return target.countCards("h") > player.countCards("h"); }, @@ -6181,7 +6187,7 @@ const skills = { })) ); }, - groupSkill: true, + groupSkill: "qun", position: "hes", filterCard: true, selectCard: 1, @@ -6235,7 +6241,7 @@ const skills = { return current != player && current.group == player.group; }); }, - groupSkill: true, + groupSkill: "shu", content: function () { trigger.directHit.addArray( game.filterPlayer(current => { @@ -6254,7 +6260,7 @@ const skills = { jsrgqiongtu: { audio: 2, enable: "chooseToUse", - groupSkill: true, + groupSkill: "qun", viewAs: { name: "wuxie", suit: "none", @@ -6342,7 +6348,7 @@ const skills = { }, "hs") ); }, - groupSkill: true, + groupSkill: "wei", locked: false, viewAs: { name: "sha", @@ -7144,7 +7150,7 @@ const skills = { return val - get.value(card); }, position: "he", - groupSkill: true, + groupSkill: "qun", lose: false, discard: false, delay: false, @@ -7195,7 +7201,7 @@ const skills = { }) ); }, - groupSkill: true, + groupSkill: "wei", direct: true, content: function () { "step 0"; @@ -8052,7 +8058,7 @@ const skills = { }) .set("give", (att >= 0 || (target.hp == 1 && target.countCards("hs", "shan") <= 1)) && get.effect(target, { name: "sha" }, player, target) < 0) .set("att", att); - ("step 1"); + "step 1"; if (result.bool) { target.give(result.cards, player); player.addTempSkill("jsrgpingtao_sha"); @@ -8083,7 +8089,7 @@ const skills = { }, }, jsrgjuelie: { - audio: 2, + audio: 4, trigger: { player: "useCardToPlayered" }, filter: function (event, player) { return player.countCards("he") && event.card.name == "sha"; @@ -8101,7 +8107,7 @@ const skills = { .set("max", trigger.target.countDiscardableCards(player, "he")) .set("goon", get.attitude(player, trigger.target) < 0) .set("logSkill", ["jsrgjuelie", trigger.target]); - ("step 1"); + "step 1"; if (result.bool) { var num = result.cards.length; if (trigger.target.countDiscardableCards(player, "he")) player.discardPlayerCard("平讨:弃置" + get.translation(trigger.target) + get.cnNumber(num) + "张牌", num, "he", trigger.target, true); @@ -8120,7 +8126,6 @@ const skills = { } */ }, - shaRelated: true, ai: { unequip_ai: true, skillTagFilter: function (player, tag, arg) { @@ -8257,7 +8262,7 @@ const skills = { direct: true, content: function () { "step 0"; - var goon = get.effect(player, trigger.card, trigger.player, trigger.player) < 1; + var goon = get.effect(player, trigger.card, trigger.player, trigger.player) < 2 * get.effect(player, { name: "draw" }, player, trigger.player); if (goon && !event.isMine() && !event.isOnline()) game.delayx(); trigger.player .chooseBool("是否对" + get.translation(player) + "发动【居下】?", "令" + get.translation(trigger.card) + "对其无效,然后其摸两张牌") @@ -9280,7 +9285,7 @@ const skills = { }, //刘备 jsrgjishan: { - audio: 2, + audio: 4, trigger: { global: "damageBegin4" }, usable: 1, filter: function (event, player) { @@ -9298,7 +9303,7 @@ const skills = { trigger.cancel(); player.loseHp(); player.markAuto("jsrgjishan", [trigger.player]); - ("step 1"); + "step 1"; if (player.isIn() && trigger.player.isIn()) { var targets = [player, trigger.player]; targets.sortBySeat(_status.currentPhase); @@ -9328,7 +9333,7 @@ const skills = { .set("ai", target => { return get.recoverEffect(target, _status.event.player, _status.event.player); }); - ("step 1"); + "step 1"; if (result.bool) { var target = result.targets[0]; player.logSkill("jsrgjishan_recover", target); @@ -9342,7 +9347,6 @@ const skills = { audio: 2, trigger: { player: "useCardToTargeted" }, forced: true, - shaRelated: true, filter: function (event, player) { return event.isFirstTarget && event.card.name == "sha" && player.hasEmptySlot(1); }, @@ -9634,7 +9638,7 @@ const skills = { }, //404曹操 jsrgzhenglve: { - audio: 2, + audio: 4, trigger: { global: "phaseEnd" }, filter: function (event, player) { var zhu = get.zhu(player) || game.findPlayer(current => current.getSeatNum() == 1); @@ -9655,7 +9659,7 @@ const skills = { content: function () { "step 0"; player.draw(); - ("step 1"); + "step 1"; var damaged = trigger.player.getHistory("sourceDamage").length > 0; var num = damaged ? 1 : 2; var targets = game.filterPlayer(current => { @@ -9672,7 +9676,7 @@ const skills = { var att = get.attitude(_status.event.player, target); return 100 - att; }); - ("step 2"); + "step 2"; if (result.bool) { var targets = result.targets; player.line(targets); @@ -9734,7 +9738,7 @@ const skills = { "step 0"; player.awakenSkill("jsrghuilie"); player.loseMaxHp(); - ("step 1"); + "step 1"; player.addSkills(["jsrgpingrong", "feiying"]); }, ai: { diff --git a/character/jsrg/voices.js b/character/jsrg/voices.js index f0aee43611..aa4a808e4f 100644 --- a/character/jsrg/voices.js +++ b/character/jsrg/voices.js @@ -1,6 +1,26 @@ export default { - "#jsrg_zoushi:die": "年老色衰了吗?", - "#jsrg_zhangren:die": "本将军败于诸葛,无憾!", - "#jsrg_huangzhong:die": "不得不服老啦~", - "#jsrg_liuhong:die": "权利的滋味,让人沉沦……", + "#jsrgzhenglve1": "臣奉陛下之命,以伐乱臣。", + "#jsrgzhenglve2": "陛下且安坐宫中,待臣之捷报。", + "#jsrgzhenglve3": "齐桓之功,唯霸可彰王道。", + "#jsrgzhenglve4": "晋公亦霸,然亦躬奉周王。", + "#jsrghuilie1": "奉辞伐罪,旌麾南指,欲请将军会猎于吴。", + "#jsrghuilie2": "宝雕弓,金鈚箭,臣乞为陛下猎天下之不臣。", + "#jsrgpingrong1": "兵贵神速,勿失此讨贼良机。", + "#jsrgpingrong2": "以战平戎,以武止戈。", + "#jsrgpingrong3": "治世匡以仁德,乱世当用重典。", + "#jsrg_caocao:die": "本欲征西讨贼,为国效命,奈何天命……唉……", + "#jsrgjishan1": "刀兵在我,而百姓何辜耶?", + "#jsrgjishan2": "备宁愿一死,只求百姓得安。", + "#jsrgjishan3": "民若得安,则天下安矣!", + "#jsrgjishan4": "勿以恶小而为之,勿以善小而不为。", + "#jsrgzhenqiao1": "剑出鞘命,引得龙吟海内!", + "#jsrgzhenqiao2": "鲲鹏之志,志在天下苍生!", + "#jsrg_liubei:die": "楼桑羽葆,黄粱一梦……", + "#jsrgpingtao1": "今当夷汝三族,县示四海。", + "#jsrgpingtao2": "歃血为盟,誓诛此国贼。", + "#jsrgjuelie1": "传令所部兵马,定绝董贼后路。", + "#jsrgjuelie2": "董贼势败在即,诸公何故不前。", + "#jsrgjuelie3": "火势刻不容缓,全军速速进发。", + "#jsrgjuelie4": "洛阳已在眼下,莫让董贼轻逃。", + "#jsrg_sunjian:die": "若违此誓,某必为万箭穿心!", }; diff --git a/character/key/character.js b/character/key/character.js index d927201477..4b4c8721c1 100644 --- a/character/key/character.js +++ b/character/key/character.js @@ -5,6 +5,7 @@ const characters = { hp: 4, skills: ["mubing", "ziqu", "diaoling"], groupBorder: "key", + names: "仲村|由理", }, key_lucia: { sex: "female", @@ -12,12 +13,14 @@ const characters = { hp: 2, maxHp: 3, skills: ["lucia_duqu", "lucia_zhenren"], + names: "此花|露西娅", }, key_kyousuke: { sex: "male", group: "key", hp: 4, skills: ["nk_shekong", "key_huanjie"], + names: "枣|恭介", }, key_yuri: { sex: "female", @@ -25,42 +28,49 @@ const characters = { hp: 3, skills: ["yuri_xingdong", "key_huanjie", "yuri_wangxi"], isZhugong: true, + names: "仲村|由理", }, key_haruko: { sex: "female", group: "key", hp: 4, skills: ["haruko_haofang", "haruko_zhuishi"], + names: "神尾|晴子", }, key_umi: { sex: "female", group: "key", hp: 3, skills: ["umi_chaofan", "umi_lunhui", "umi_qihuan"], + names: "鹰原|羽未", }, key_umi2: { sex: "female", group: "key", hp: 3, isUnseen: true, + names: "鹰原|羽未", }, key_rei: { sex: "male", group: "key", hp: 4, skills: ["xiandeng", "shulv", "xisheng"], + names: "null|零", }, key_komari: { sex: "female", group: "key", hp: 3, skills: ["komari_tiankou", "komari_xueshang"], + names: "神北|小毬", }, key_yukine: { sex: "female", group: "key", hp: 3, skills: ["yukine_wenzhou"], + names: "宫泽|有纪宁", }, key_yusa: { sex: "female", @@ -68,6 +78,7 @@ const characters = { hp: 3, skills: ["yusa_yanyi", "yusa_misa", "dualside"], dualSideCharacter: "key_misa", + names: "黑羽|柚咲", }, key_misa: { sex: "female", @@ -75,6 +86,7 @@ const characters = { hp: 3, skills: ["misa_yehuo", "misa_yusa", "dualside"], isUnseen: true, + names: "黑羽|美砂", }, key_masato: { sex: "male", @@ -82,60 +94,70 @@ const characters = { hp: 4, maxHp: 8, skills: ["masato_baoquan"], + names: "井之原|真人", }, key_iwasawa: { sex: "female", group: "key", hp: 3, skills: ["iwasawa_yinhang", "iwasawa_mysong"], + names: "岩泽|雅美", }, key_kengo: { sex: "male", group: "key", hp: 4, skills: ["kengo_weishang", "kengo_guidui"], + names: "宫泽|谦吾", }, key_yoshino: { sex: "male", group: "key", hp: 4, skills: ["yoshino_jueyi"], + names: "吉野|晴彦", }, key_yui: { sex: "female", group: "key", hp: 3, skills: ["yui_jiang", "yui_lieyin", "yui_takaramono"], + names: "日向|由依", }, key_tsumugi: { sex: "female", group: "key", hp: 3, skills: ["tsumugi_mugyu", "tsumugi_huilang"], + names: "文德斯|紬", }, key_saya: { sex: "female", group: "key", hp: 3, skills: ["saya_shouji", "saya_powei"], + names: "朱鹭户|彩", }, key_harukakanata: { sex: "female", group: "key", hp: 3, skills: ["haruka_shuangche"], + names: "三枝|叶留佳-二木|佳奈多", }, key_inari: { sex: "female", group: "key", hp: 2, skills: ["inari_baiwei", "inari_huhun"], + names: "空门|稻荷", }, key_shiina: { sex: "female", group: "key", hp: 3, skills: ["shiina_qingshen", "shiina_feiyan"], + names: "null|椎名", }, key_sunohara: { sex: "double", @@ -143,18 +165,21 @@ const characters = { hp: 3, hujia: 2, skills: ["sunohara_chengshuang", "sunohara_tiaoyin", "sunohara_jianren"], + names: "春原|阳平-春原|芽衣", }, key_rin: { sex: "female", group: "key", hp: 3, skills: ["rin_baoqiu"], + names: "枣|铃", }, key_sasami: { sex: "female", group: "key", hp: 3, skills: ["sasami_miaobian"], + names: "笹濑川|佐佐美", }, key_akane: { sex: "female", @@ -162,114 +187,133 @@ const characters = { hp: 3, skills: ["akane_jugu", "akane_quanqing", "akane_yifu"], isZhugong: true, + names: "千里|朱音", }, key_doruji: { sex: "female", group: "key", hp: 16, skills: ["doruji_feiqu"], + names: "null|多鲁基", }, key_yuiko: { sex: "female", group: "key", hp: 3, skills: ["yuiko_fenglun", "yuiko_dilve"], + names: "来谷|唯湖", }, key_riki: { sex: "double", group: "key", hp: 3, skills: ["riki_spwenji", "riki_nvzhuang", "riki_mengzhong"], + names: "直枝|理树", }, key_hisako: { sex: "female", group: "key", hp: 3, skills: ["hisako_yinbao", "hisako_zhuanyun"], + names: "渕田|久子", }, key_hinata: { sex: "male", group: "key", hp: 4, skills: ["hinata_qiulve", "hinata_ehou"], + names: "日向|秀树", }, key_noda: { sex: "male", group: "key", hp: 4, skills: ["noda_fengcheng", "noda_xunxin"], + names: "野田|null", }, key_tomoya: { sex: "male", group: "key", hp: 4, skills: ["tomoya_shangxian", "tomoya_wangjin"], + names: "冈崎|朋也", }, key_nagisa: { sex: "female", group: "key", hp: 3, skills: ["nagisa_tiandu", "nagisa_fuxin"], + names: "古河|渚", }, key_ayato: { sex: "male", group: "key", hp: 3, skills: ["ayato_jianshen", "ayato_zonghuan"], + names: "直井|文人", }, key_ao: { sex: "female", group: "key", hp: 3, skills: ["ao_xishi", "ao_kuihun", "ao_shixin"], + names: "空门|苍", }, key_yuzuru: { sex: "male", group: "key", hp: 5, skills: ["yuzuru_wuxin", "yuzuru_deyi"], + names: "音无|结弦", }, sp_key_kanade: { sex: "female", group: "key", hp: 3, skills: ["kanade_mapo", "kanade_benzhan"], + names: "立华|奏", }, key_mio: { sex: "female", group: "key", hp: 3, skills: ["mio_tuifu", "mio_tishen"], + names: "西园|美鱼", }, key_midori: { sex: "female", group: "key", hp: 3, skills: ["midori_nonghuan", "midori_tishen"], + names: "西园|美鸟", }, key_kyoko: { sex: "female", group: "key", hp: 3, skills: ["kyoko_juwu", "kyoko_zhengyi"], + names: "岬|镜子", }, key_shizuru: { sex: "female", group: "key", hp: 3, skills: ["shizuru_nianli", "shizuru_benzhan"], + names: "中津|静流", }, key_shiorimiyuki: { sex: "female", group: "key", hp: 3, skills: ["shiorimiyuki_banyin", "shiorimiyuki_tingxian"], + names: "关根|诗织-入江|美雪", }, key_miki: { sex: "female", group: "key", hp: 3, skills: ["miki_shenqiang", "miki_huanmeng", "miki_zhiluo"], + names: "野村|美希", }, key_shiori: { sex: "female", @@ -277,6 +321,7 @@ const characters = { hp: 2, maxHp: 3, skills: ["shiori_huijuan"], + names: "美坂|栞", }, key_kaori: { sex: "female", @@ -284,78 +329,91 @@ const characters = { hp: 3, maxHp: 4, skills: ["kaori_siyuan"], + names: "美坂|香里", }, key_akiko: { sex: "female", group: "key", hp: 3, skills: ["akiko_dongcha"], + names: "水濑|秋子", }, key_abyusa: { sex: "female", group: "key", hp: 3, skills: ["abyusa_jueqing", "abyusa_dunying"], + names: "null|游佐", }, key_godan: { sex: "male", group: "key", hp: 6, skills: ["godan_yuanyi", "godan_feiqu", "godan_xiaoyuan"], + names: "松下|护驒", }, key_yuu: { sex: "male", group: "key", hp: 3, skills: ["yuu_lveduo"], + names: "乙坂|有宇", }, key_ryoichi: { sex: "male", group: "key", hp: 4, skills: ["ryoichi_baoyi", "ryoichi_tuipi"], + names: "三谷|良一", }, key_kotori: { sex: "female", group: "key", hp: 3, skills: ["kotori_yumo", "kotori_huazhan"], + names: "神户|小鸟", }, key_jojiro: { sex: "male", group: "key", hp: 4, skills: ["jojiro_shensu", "jojiro_shunying"], + names: "高城|丈士朗", }, key_shiroha: { sex: "female", group: "key", hp: 3, skills: ["shiroha_yuzhao", "shiroha_guying", "shiroha_jiezhao"], + names: "鸣濑|白羽", }, key_shizuku: { sex: "female", group: "key", hp: 3, skills: ["shizuku_sizhi", "shizuku_biyi", "shizuku_sanhua"], + names: "水织|静久", }, key_hiroto: { sex: "male", group: "key", hp: 3, skills: ["hiroto_huyu", "hiroto_tuolao"], + names: "铃木|央人", }, key_sakuya: { sex: "male", group: "key", hp: 3, skills: ["youlong", "luanfeng", "sakuya_junbu"], + names: "凤|咲夜", }, key_youta: { sex: "male", group: "key", hp: 4, skills: [], + names: "成神|阳太", }, key_rumi: { sex: "female", @@ -363,18 +421,21 @@ const characters = { hp: 3, maxHp: 4, skills: ["rumi_shuwu"], + names: "七濑|留美", }, key_chihaya: { sex: "female", group: "key", hp: 3, skills: ["chihaya_liewu", "chihaya_youfeng"], + names: "凤|千早", }, key_yukito: { sex: "male", group: "key", hp: 4, skills: ["yukito_kongwu", "yukito_yaxiang"], + names: "国崎|往人", }, key_crow: { sex: "male", @@ -382,30 +443,35 @@ const characters = { hp: 4, skills: [], isUnseen: true, + names: "null|空", }, key_asara: { sex: "female", group: "key", hp: 3, skills: ["asara_shelu", "asara_yingwei"], + names: "井上|晶", }, key_kotomi: { sex: "female", group: "key", hp: 3, skills: ["kotomi_qinji", "kotomi_chuanxiang"], + names: "一之濑|琴美", }, key_mia: { sex: "female", group: "key", hp: 3, skills: ["mia_shihui", "mia_qianmeng"], + names: "藤川|米娅", }, key_kano: { sex: "female", group: "key", hp: 3, skills: ["kano_liezhen", "kano_poyu"], + names: "雾岛|佳乃", }, db_key_liyingxia: { sex: "female", @@ -413,6 +479,7 @@ const characters = { hp: 3, skills: ["liyingxia_sanli", "liyingxia_zhenjun", "liyingxia_wumai"], doubleGroup: ["shu", "key"], + names: "李|映夏", }, key_erika: { sex: "female", @@ -420,24 +487,28 @@ const characters = { hp: 3, hujia: 2, skills: ["erika_shisong", "erika_yousheng"], + names: "苍井|绘里香", }, key_satomi: { sex: "female", group: "key", hp: 3, skills: ["satomi_luodao", "satomi_daohai"], + names: "藏|里见", }, key_iriya: { sex: "female", group: "key", hp: 3, skills: ["iriya_yinji", "iriya_haozhi"], + names: "罗杰斯特·文斯卡娅|伊莉雅", }, key_fuuko: { sex: "female", group: "key", hp: 3, skills: ["fuuko_xingdiao", "fuuko_chuanyuan"], + names: "伊吹|风子", }, key_kagari: { sex: "female", @@ -445,6 +516,7 @@ const characters = { groupInGuozhan: "key", hp: 3, skills: ["kagari_zongsi"], + names: "未来来|篝", }, key_shiki: { sex: "female", @@ -453,6 +525,7 @@ const characters = { hp: 3, maxHp: 5, skills: ["shiki_omusubi"], + names: "神山|识", }, db_key_hina: { sex: "female", @@ -461,90 +534,105 @@ const characters = { hp: 3, skills: ["hina_shenshi", "hina_xingzhi"], doubleGroup: ["key", "shen"], + names: "佐藤|雏", }, key_kud: { sex: "female", group: "key", hp: 3, skills: ["kud_qiaoshou", "kud_buhui"], + names: "能美|库特莉亚芙卡", }, key_misuzu: { sex: "female", group: "key", hp: 3, skills: ["misuzu_hengzhou", "misuzu_nongyin", "misuzu_zhongxing"], + names: "神尾|观铃", }, key_kamome: { sex: "female", group: "key", hp: 3, skills: ["kamome_yangfan", "kamome_huanmeng", "kamome_jieban"], + names: "久岛|鸥", }, key_nao: { sex: "female", group: "key", hp: 3, skills: ["nao_duyin", "nao_wanxin", "nao_shouqing"], + names: "友利|奈绪", }, key_yuuki: { sex: "female", group: "key", hp: 3, skills: ["yuuki_yicha"], + names: "冰室|忧希", }, key_kotarou: { sex: "male", group: "key", hp: 3, skills: ["kotarou_rewrite", "kotarou_aurora"], + names: "天王寺|瑚太朗", }, key_tenzen: { sex: "male", group: "key", hp: 4, skills: ["tenzen_fenghuan", "tenzen_retianquan"], + names: "加纳|天善", }, key_kyouko: { sex: "female", group: "key", hp: 3, skills: ["kyouko_rongzhu", "kyouko_gongmian"], + names: "伊座并|杏子", }, key_kyou: { sex: "female", group: "key", hp: 3, skills: ["kyou_zhidian", "kyou_duanfa"], + names: "藤林|杏", }, key_seira: { sex: "female", group: "key", hp: 3, skills: ["seira_xinghui", "seira_yuanying"], + names: "樱庭|星罗", }, key_kiyu: { sex: "female", group: "key", hp: 3, skills: ["kiyu_yuling", "kiyu_rexianyu"], + names: "天宫|希优", }, key_tomoyo: { sex: "female", group: "key", hp: 4, skills: ["tomoyo_wuwei", "tomoyo_zhengfeng"], + names: "坂上|智代", }, key_minagi: { sex: "female", group: "key", hp: 3, skills: ["minagi_peiquan", "minagi_huanliu"], + names: "远野|美凪", }, key_michiru: { sex: "female", group: "key", hp: 3, skills: ["michiru_sheyuan"], + names: "远野|小满", }, }; diff --git a/character/key/skill.js b/character/key/skill.js index 82a87a2634..70af577186 100644 --- a/character/key/skill.js +++ b/character/key/skill.js @@ -2299,7 +2299,7 @@ const skills = { }, async content(event, trigger, player) { player.addTempSkill("kiyu_rexianyu_round", "roundStart"); - const tabito = targets[0]; + const tabito = event.targets[0]; tabito.storage.kiyu_rexianyu_lastrun = event.cost_data.list; tabito.storage.amamiya_kiyu = player; tabito.addTempSkill("kiyu_rexianyu_lastrun", { @@ -2676,7 +2676,7 @@ const skills = { }, //佐藤雏 hina_shenshi: { - groupSkill: true, + groupSkill: "shen", trigger: { player: ["phaseUseBegin", "phaseUseEnd"] }, frequent: true, filter(event, player) { @@ -2721,7 +2721,7 @@ const skills = { }, }, hina_xingzhi: { - groupSkill: true, + groupSkill: "key", trigger: { player: "yingbian" }, usable: 1, filter: (event, player) => player.group == "key" && !event.card.yingbian && lib.yingbian.condition.complex.has("zhuzhan"), @@ -9323,7 +9323,6 @@ const skills = { }, shiina_retieji: { audio: 1, - shaRelated: true, trigger: { player: "useCardToPlayered" }, check(event, player) { return get.attitude(player, event.target) < 0; @@ -9792,7 +9791,6 @@ const skills = { }, //由依 yui_jiang: { - shaRelated: true, audio: 2, audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], trigger: { diff --git a/character/key/translate.js b/character/key/translate.js index d909833a95..2065545054 100644 --- a/character/key/translate.js +++ b/character/key/translate.js @@ -72,7 +72,7 @@ const translates = { key_mia: "藤川米娅", key_kano: "雾岛佳乃", db_key_liyingxia: "李映夏", - key_erika: "苍井绘梨花", + key_erika: "苍井绘里香", key_satomi: "藏里见", key_iriya: "喵呜·喵呼", key_iriya_ab: "喵呜喵呼", diff --git a/character/mobile/character.js b/character/mobile/character.js index 74f986f4e7..55eb9b7dab 100644 --- a/character/mobile/character.js +++ b/character/mobile/character.js @@ -1,12 +1,14 @@ const characters = { - mb_simafu: ["male", "wei", 3, ["mbpanxiang", "mbchenjie"]], - mb_sp_guanqiujian: ["male", "wei", 4, ["mbcuizhen", "mbkuili"]], + mb_simazhou: ["male", "wei", 4, ["mbbifeng", "mbsuwang"], ["name:司马|伷"]], + mb_wenqin: ["male", "wei", 4, ["mbbeiming", "mbchoumang"]], + mb_simafu: ["male", "wei", 3, ["mbpanxiang", "mbchenjie"], ["name:司马|孚"]], + mb_sp_guanqiujian: ["male", "wei", 4, ["mbcuizhen", "mbkuili"], ["name:毌丘|俭"]], mb_caomao: ["male", "wei", 3, ["mbqianlong", "mbweitong"], ["zhu"]], chengji: ["male", "wei", 4, ["mbkuangli", "mbxiongsi"]], - lizhaojiaobo: ["male", "wei", 4, ["mbzuoyou", "mbshishou"]], + lizhaojiaobo: ["male", "wei", 4, ["mbzuoyou", "mbshishou"], ["name:李|昭-焦|伯"]], yangfeng: ["male", "qun", 4, ["mbxuetu", "mbweiming"]], xin_huojun: ["male", "shu", 4, ["sidai", "jieyu"], ["character:tw_huojun", "die:tw_huojun"]], - muludawang: ["male", "qun", "3/3/1", ["shoufa", "zhoulin", "yuxiang"]], + muludawang: ["male", "qun", "3/3/1", ["shoufa", "zhoulin", "yuxiang"], ["name:null|null"]], mb_chengui: ["male", "qun", 3, ["guimou", "zhouxian"]], mb_huban: ["male", "wei", 4, ["mbyilie"]], mb_xianglang: ["male", "shu", 3, ["naxue", "yijie"]], @@ -21,11 +23,11 @@ const characters = { xin_guozhao: ["female", "wei", 3, ["yichong", "wufei"]], xin_zhangyi: ["male", "shu", 4, ["xinwurong", "shizhi"]], xin_sunliang: ["male", "wu", 3, ["xinzhizheng", "xinkuizhu", "xinlijun"], ["zhu"]], - re_xiaoqiao: ["female", "wu", 3, ["retianxiang", "xinhongyan"]], - shichangshi: ["male", "qun", 1, ["mbdanggu", "mbmowang"], ["sex:male_castrated"]], - re_zhangzhang: ["male", "wu", 3, ["rezhijian", "guzheng"]], + re_xiaoqiao: ["female", "wu", 3, ["retianxiang", "xinhongyan"], ["name:桥|null"]], + shichangshi: ["male", "qun", 1, ["mbdanggu", "mbmowang"], ["sex:male_castrated", "name:张|让-赵|忠-孙|璋-毕|岚-夏|恽-韩|悝-栗|嵩-段|珪-郭|胜-高|望"]], + re_zhangzhang: ["male", "wu", 3, ["rezhijian", "guzheng"], ["name:张|昭-张|纮"]], qianzhao: ["male", "wei", 4, ["mbshihe", "mbzhenfu"]], - re_yanwen: ["male", "qun", 4, ["reshuangxiong"]], + re_yanwen: ["male", "qun", 4, ["reshuangxiong"], ["name:颜|良-文|丑"]], xin_zhoutai: ["male", "wu", 4, ["buqu", "new_fenji"]], re_caozhi: ["male", "wei", 3, ["reluoying", "rejiushi", "chengzhang"]], yj_weiyan: ["male", "qun", "4/4/1", ["mbguli", "mbaosi"]], @@ -50,7 +52,7 @@ const characters = { sp_jianggan: ["male", "wei", 3, ["mbdaoshu", "spdaizui"]], peixiu: ["male", "qun", 3, ["xingtu", "juezhi"]], re_gaoshun: ["male", "qun", 4, ["rexianzhen", "rejinjiu"]], - re_wuguotai: ["female", "wu", 3, ["reganlu", "buyi"]], + re_wuguotai: ["female", "wu", 3, ["reganlu", "buyi"], ["name:丁|null"]], xin_sunxiu: ["male", "wu", 3, ["mobileyanzhu", "mobilexingxue", "zhaofu"], ["zhu"]], sp_maojie: ["male", "wei", 3, ["bingqing", "yingfeng"]], yj_huangzhong: ["male", "qun", 4, ["spshidi", "spyishi", "spqishe"]], @@ -64,28 +66,28 @@ const characters = { qiaozhou: ["male", "shu", 3, ["zhiming", "xingbu"]], xin_guyong: ["male", "wu", 3, ["xinshenxing", "xinbingyi"]], re_zhonghui: ["male", "wei", 4, ["requanji", "zili"], ["clan:颍川钟氏"]], - xin_caifuren: ["female", "qun", 3, ["xinqieting", "xianzhou"]], + xin_caifuren: ["female", "qun", 3, ["xinqieting", "xianzhou"], ["name:蔡|null"]], xin_zhoucang: ["male", "shu", 4, ["mobilezhongyong"]], ol_yujin: ["male", "wei", 4, ["rejieyue"], ["die:yujin_yujin.mp3"]], zhouqun: ["male", "shu", 3, ["tiansuan"]], re_zhurong: ["female", "shu", 4, ["juxiang", "relieren"]], re_jiangwei: ["male", "shu", 4, ["retiaoxin", "zhiji"]], - nanhualaoxian: ["male", "qun", 3, ["yufeng", "tianshu"]], + nanhualaoxian: ["male", "qun", 3, ["yufeng", "tianshu"], ["name:庄|周"]], re_handang: ["male", "wu", 4, ["regongji", "jiefan"]], re_dengai: ["male", "wei", 4, ["retuntian", "zaoxian"]], xin_fuhuanghou: ["female", "qun", 3, ["xinzhuikong", "xinqiuyuan"]], - xin_panzhangmazhong: ["male", "wu", 4, ["xinduodao", "xinanjian"]], + xin_panzhangmazhong: ["male", "wu", 4, ["xinduodao", "xinanjian"], ["name:潘|璋-马|忠"]], xin_guohuai: ["male", "wei", 4, ["mobilejingce"]], - gongsunkang: ["male", "qun", 4, ["juliao", "taomie"]], + gongsunkang: ["male", "qun", 4, ["juliao", "taomie"], ["name:公孙|康"]], xin_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "liyong"]], xin_hansui: ["male", "qun", "4/4/1", ["xinniluan", "xiaoxi_hansui"]], hucheer: ["male", "qun", 4, ["daoji"]], re_lingtong: ["male", "wu", 4, ["rexuanfeng"]], re_liubiao: ["male", "qun", 3, ["zishou", "rezongshi"]], - simashi: ["male", "wei", 4, ["baiyi", "jinglve", "shanli"]], + simashi: ["male", "wei", 4, ["baiyi", "jinglve", "shanli"], ["name:司马|师"]], yanghuiyu: ["female", "wei", 3, ["hongyi", "requanfeng"]], xin_zhuran: ["male", "wu", 4, ["mobiledanshou"]], - xin_gongsunzan: ["male", "qun", 4, ["xinyicong", "qiaomeng"]], + xin_gongsunzan: ["male", "qun", 4, ["xinyicong", "qiaomeng"], ["die:gongsunzan", "name:公孙|瓒"]], dingyuan: ["male", "qun", 4, ["beizhu"]], xin_jianyong: ["male", "shu", 3, ["xinqiaoshui", "xinjyzongshi"]], xin_caozhang: ["male", "wei", 4, ["rejiangchi"]], @@ -105,12 +107,12 @@ const characters = { yangyi: ["male", "shu", 3, ["duoduan", "gongsun"]], dongcheng: ["male", "qun", 4, ["chengzhao"]], re_pangtong: ["male", "shu", 3, ["xinlianhuan", "niepan"]], - re_guanqiujian: ["male", "wei", 4, ["rezhengrong", "rehongju"]], + re_guanqiujian: ["male", "wei", 4, ["rezhengrong", "rehongju"], ["name:毌丘|俭"]], chendeng: ["male", "qun", 3, ["zhouxuan", "fengji"]], re_heqi: ["male", "wu", 4, ["reqizhou", "reshanxi"]], yangbiao: ["male", "qun", 3, ["zhaohan", "rangjie", "yizheng"]], - re_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "rehuoji", "rekanpo"]], - xin_xiahoudun: ["male", "wei", 4, ["reganglie", "xinqingjian"]], + re_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "rehuoji", "rekanpo"], ["name:诸葛|亮"]], + xin_xiahoudun: ["male", "wei", 4, ["reganglie", "xinqingjian"], ["name:夏侯|惇"]], zhangyì: ["male", "shu", 4, ["rezhiyi"]], jiakui: ["male", "wei", 3, ["zhongzuo", "wanlan"]], re_jikang: ["male", "wei", 3, ["new_qingxian", "new_juexiang"]], @@ -122,12 +124,14 @@ const characters = { lifeng: ["male", "shu", 3, ["tunchu", "shuliang"]], zhuling: ["male", "wei", 4, ["xinzhanyi"]], liuye: ["male", "wei", 3, ["polu", "choulve"]], - zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "xinfu_longyuan"]], + zhaotongzhaoguang: ["male", "shu", 4, ["yizan_use", "xinfu_longyuan"], ["name:赵|统-赵|广"]], majun: ["male", "wei", 3, ["xinfu_jingxie1", "qiaosi"]], - simazhao: ["male", "wei", 3, ["xinfu_daigong", "xinfu_zhaoxin"]], + simazhao: ["male", "wei", 3, ["xinfu_daigong", "xinfu_zhaoxin"], ["name:司马|昭"]], wangyuanji: ["female", "wei", 3, ["xinfu_qianchong", "xinfu_shangjian"]], pangdegong: ["male", "qun", 3, ["xinfu_pingcai", "xinfu_pdgyingshi"]], old_yuanshu: ["male", "qun", 4, ["xinyongsi", "yjixi"]], + zhangbu: ["male", "wu", 4, ["mbchengxiong", "mbwangzhuang"]], + mb_wangjing: ["male", "wei", 3, ["mbzujin", "mbjiejian"]], shenpei: ["male", "qun", "2/3", ["shouye", "liezhi"]], re_wangyun: ["male", "qun", 3, ["relianji", "remoucheng"], ["clan:太原王氏"]], @@ -138,7 +142,7 @@ const characters = { re_zhanggong: ["male", "wei", 3, ["reqianxin", "rezhenxing"]], re_xugong: ["male", "qun", 3, ["rebiaozhao", "yechou"], ["doublegroup:wu:qun"]], - re_weiwenzhugezhi: ["male", "wu", 4, ["refuhai"]], + re_weiwenzhugezhi: ["male", "wu", 4, ["refuhai"], ["name:卫|温-诸葛|直"]], xin_yuanshao: ["male", "qun", 4, ["reluanji", "xueyi"], ["zhu"]], re_liushan: ["male", "shu", 3, ["xiangle", "refangquan", "ruoyu"], ["zhu"]], diff --git a/character/mobile/characterReplace.js b/character/mobile/characterReplace.js index 1bb76b62c1..30f1ee37ed 100644 --- a/character/mobile/characterReplace.js +++ b/character/mobile/characterReplace.js @@ -20,6 +20,9 @@ const characterReplaces = { xianglang: ["xianglang", "mb_xianglang"], miheng: ["yue_miheng", "re_miheng", "miheng"], peixiu: ["ol_peixiu", "peixiu"], + chendeng: ["chendeng", "re_chendeng", "ol_chendeng", "jsrg_chendeng"], + liuba: ["liuba", "ol_liuba", "dc_liuba"], + lingcao: ["lingcao", "dc_lingcao"], }; export default characterReplaces; diff --git a/character/mobile/index.js b/character/mobile/index.js index 1f1e88303b..d9ec7e98e8 100644 --- a/character/mobile/index.js +++ b/character/mobile/index.js @@ -25,6 +25,12 @@ game.import("character", function () { dynamicTranslate: { ...dynamicTranslates }, characterIntro: { ...characterIntros }, characterReplace: { ...characterReplaces }, + characterSubstitute: { + mb_caomao: [ + ["mb_caomao_shadow", ["die:mb_caomao"]], + ["mb_caomao_dead", ["die:mb_caomao"]], + ], + }, card: { ...cards }, skill: { ...skills }, perfectPair: { ...perfectPairs }, diff --git a/character/mobile/intro.js b/character/mobile/intro.js index 31df823766..09e1e52fae 100644 --- a/character/mobile/intro.js +++ b/character/mobile/intro.js @@ -47,6 +47,8 @@ const characterIntro = { jiakui: "贾逵(174年—228年),本名贾衢,字梁道,河东襄陵人(今山西临汾县)。汉末三国时期魏国名臣,西晋开国功臣贾充父亲。初为并州郡吏,迁渑池县令,拜弘农太守,历仕曹操、曹丕、曹叡三世,是曹魏政权中具有军政才干的人物,终其一生为魏国统一事业作出卓越贡献。担任豫州刺史期间,兴修水利,凿通运河二百余里,时称“贾侯渠”,便利民生。随同曹丕伐吴,进封阳里亭侯,加号建威将军。石亭之战,率军救出曹休。太和二年,去世,赠本官,谥号为肃,《唐会要》将其尊为魏晋八君子之一。", shenpei: "审配(?-204年),字正南,魏郡阴安(今河北清丰北)人。为人正直, 袁绍领冀州,审配被委以腹心之任,并总幕府。河北平定,袁绍以审配、逢纪统军事,审配恃其强盛,力主与曹操决战。曾率领弓弩手大破曹军于官渡。官渡战败,审配二子被俘,反因此受谮见疑,幸得逢纪力保。袁绍病死,审配等矫诏立袁尚为嗣,导致兄弟相争,被曹操各个击破。曹操围邺,审配死守数月,终城破被擒,拒不投降,慷慨受死。", hujinding: "胡金定,女,传说中关羽之妻。关索之母,配偶关羽,出处《花关索传》和元代《三国志评话》民间传说人物。", + zhangbu:"张布(?-264年),三国时吴国将领。张布在孙休受封为琅琊王时,为左右将督。太平三年(258年),孙休即位后,张布由长水校尉迁辅义将军,封永康侯。不久,孙休听说孙綝阴谋反叛,于是暗中和张布商量计策,孙綝被杀后,左将军张布因功加封中军督。由于孙休对张布厚加恩宠,因此张布专擅朝廷大权,多行无礼之事。永安七年(264年),孙休去世,丞相濮阳兴、左将军张布推荐孙皓为帝。同年八月初三,孙皓即皇帝位,封张布为骠骑将军,加侍中。孙皓粗暴骄盈、暴虐治国,又好酒色,濮阳兴和张布暗地里感到后悔,有人将此事报告孙皓,濮阳兴和张布二人被诛。", + mb_wangjing:"王经(?—260年),字彦纬,冀州清河郡人,三国时代曹魏大臣。《三国志》无传。王经为农民出身,因得到同乡崔林的赏识,被提拔任官。其母说他太快出头会不吉利,但他平步青云,历任江夏太守、雍州刺史。正元二年(255年),蜀将姜维攻入陇西郡时,他率军出狄道城迎击蜀军,却被击败。被包围在城中,陷入穷途末路的境况。幸亏得到大将陈泰和邓艾的援助,合力击破姜维,才脱险。此后,他被朝廷召回。不久迁司隶校尉、尚书。甘露五年(260年),魏帝曹髦召见王沈、王经、王业,提出进讨司马昭的计划。王经进谏,但曹髦不听;王沈、王业向司马昭告密,王经不从。司马昭弑君后,王经因未向司马昭告急,而和其母一同被逮捕并被处死。", }; export default characterIntro; diff --git a/character/mobile/skill.js b/character/mobile/skill.js index fd9b818735..800ff45e1d 100644 --- a/character/mobile/skill.js +++ b/character/mobile/skill.js @@ -2,9 +2,503 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //司马伷 + mbbifeng: { + audio: 3, + trigger: { + target: "useCardToTarget", + global: "useCardAfter", + }, + filter(event, player, name) { + if (name == "useCardAfter") return player.getStorage("mbbifeng").includes(event.card); + if (event.targets && event.targets.length > 4) return false; + return ["trick", "basic"].includes(get.type(event.card)); + }, + async cost(event, trigger, player) { + if (event.triggername == "useCardAfter") event.result = { bool: true }; + else { + let choice = true; + if (get.effect(player, trigger.card, trigger.player, player) >= 0) choice = false; + if (get.tag(trigger.card, 'damage') && trigger.targets.length == 1 && player.hp <= 2) choice = false; + event.result = await player.chooseBool(get.prompt2("mbbifeng")).set("choice", choice).forResult(); + } + }, + async content(event, trigger, player) { + if (event.triggername == "useCardAfter") { + player.unmarkAuto("mbbifeng", trigger.card); + if (game.hasPlayer(current => { + if (current == player) return false; + let respondEvts = []; + respondEvts.addArray(current.getHistory("useCard")).addArray(current.getHistory("respond")); + respondEvts = respondEvts.filter(i => i.respondTo).map(evt => evt.respondTo); + return respondEvts.some(list => { + return list[1] == trigger.card; + }); + })) await player.draw(2); + else await player.loseHp(); + } + else { + trigger.getParent().excluded.add(player); + player.markAuto("mbbifeng", trigger.card); + } + }, + }, + mbsuwang: { + audio: 2, + trigger: { + global: "phaseEnd", + }, + filter(event, player) { + if (player.getHistory("damage").length) return false; + return event.player.hasHistory("useCard", evt => evt.targets && evt.targets.includes(player)); + }, + frequent: true, + async content(event, trigger, player) { + await player.addToExpansion(get.cards(1), "draw").gaintag.add("mbsuwang"); + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove(player, skill) { + var cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "mbsuwang_draw", + subSkill: { + draw: { + audio: "mbsuwang", + trigger: { + player: "phaseDrawBegin1", + }, + filter(event, player) { + return player.getExpansions("mbsuwang").length; + }, + async cost(event, trigger, player) { + const cards = player.getExpansions("mbsuwang"); + event.result = await player.chooseBool(get.prompt("mbsuwang"), "放弃摸牌并获得" + get.translation(cards)).set("choice", trigger.num <= cards.length).forResult(); + }, + async content(event, trigger, player) { + const cards = player.getExpansions("mbsuwang"); + trigger.changeToZero(); + await player.gain(cards, "gain2"); + if (cards.length >= 3) { + const result = await player.chooseTarget("是否令一名其他角色摸两张牌?", lib.filter.notMe).set("ai", function (target) { + return get.effect(target, { name: "draw" }, _status.event.player, _status.event.player); + }).forResult(); + if (result.bool) { + player.line(result.targets[0], "green"); + await result.targets[0].draw(2); + } + } + }, + }, + }, + }, + //文钦 + mbbeiming:{ + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("mbbeiming"), "令至多两名角色获得武器牌", [1, 2]) + .set("ai", target => { + return get.attitude(get.player(), target); + }) + .forResult(); + }, + async content(event, trigger, player) { + const targets = event.targets; + for (const target of targets) { + const suits = []; + for (const card of target.getCards("h")) suits.add(get.suit(card)); + const equip = get.cardPile2(card => { + if (get.subtype(card) != "equip1") return false; + const info = get.info(card, false); + if (!info) return false; + if (!info.distance || typeof info.distance.attackFrom != "number") return suits.length == 1; + return 1 - info.distance.attackFrom == suits.length; + }); + if (equip) await target.gain(equip, "gain2"); + } + }, + }, + mbchoumang: { + audio: 2, + trigger: { + player: "useCardToPlayered", + target: "useCardToTargeted", + }, + usable: 1, + filter(event, player) { + return event.card.name == "sha" && event.targets.length == 1; + }, + async cost(event, trigger, player) { + const list = ["选项一", "选项二"], target = event.triggername == "useCardToPlayered" ? trigger.target : trigger.player; + if (player.getEquip(1) && target.getEquip(1)) list.push("背水!"); + list.push("cancel2"); + const result = await player.chooseControl(list).set("choiceList", [ + "令此【杀】伤害+1", + "若此【杀】被【闪】抵消,你可以获得与你距离为1以内的一名其他角色区域里的一张牌", + "背水!弃置你与其装备区的武器牌并执行所有选项", + ]).set("prompt", get.prompt("mbchoumang")).set("result", function () { + let eff = 0; + for (const targetx of trigger.targets) eff += get.effect(targetx, trigger.card, trigger.player, player); + const bool = game.hasPlayer(current => player != current && get.distance(player, current) <= 1 && get.effect(current, { name: "shunshou_copy2" }, player, player) > 0); + if (list.includes("背水!") && eff > 0 && bool) return "背水!"; + if (bool) return "选项二"; + if (eff > 0) return "选项一"; + return "cancel2"; + }()).set("ai", function () { + return _status.event.result; + }).forResult(); + event.result = { + bool: result.control != "cancel2", + targets: [target], + cost_data: result.control, + }; + }, + async content(event, trigger, player) { + const result = event.cost_data, target = event.targets[0]; + if (result == "背水!") { + const list = []; + if (player.getEquips(1).length) list.push([player, player.getEquips(1)]); + if (target.getEquips(1).length) list.push([target, target.getEquips(1)]); + await game.loseAsync({ + lose_list: list, + discarder: player, + }).setContent("discardMultiple"); + } + if (result != "选项二") { + trigger.getParent().baseDamage++; + await game.asyncDelay(); + } + if (result != "选项一") { + player.addTempSkill("mbchoumang_effect"); + player.markAuto("mbchoumang_effect", trigger.card); + } + }, + subSkill: { + effect: { + trigger: { + global: "shaMiss", + }, + filter(event, player) { + if (!player.getStorage("mbchoumang_effect").includes(event.card)) return false; + return game.hasPlayer(current => player != current && get.distance(player, current) <= 1 && current.countCards("hej")); + }, + charlotte: true, + onremove: true, + async cost(event, trigger, player) { + event.result = await player.chooseTarget("仇铓:是否获得与你距离为1以内的一名其他角色区域里的一张牌?", function (card, player, target) { + return player != target && get.distance(player, target) <= 1 && target.countCards("hej"); + }).set("ai", function (target) { + const player = _status.event.player; + return get.effect(target, { name: "shunshou_copy2" }, player, player); + }).forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + await player.gainPlayerCard(target, "hej", true); + player.unmarkAuto("mbchoumang_effect", [trigger.card]); + if (!player.getStorage("mbchoumang_effect").length) player.removeSkill("mbchoumang_effect"); + }, + }, + }, + }, + //张布 + mbchengxiong: { + audio: 2, + trigger: { + player: "useCardToTargeted", + }, + locked: false, + filter: function (event, player) { + if (get.type2(event.card) != "trick") return false; + if (!event.targets.some(current => current != player)) return false; + const num = lib.skill.mbchengxiong.phaseUsed(event, player); + return game.hasPlayer(current => current.countCards("he") >= num); + }, + phaseUsed: function (event, player) { + let phase = null; + for (let i of lib.phaseName) { + if (event.getParent(i, true)) { + phase = i; + break; + } + } + if (!phase) return 0; + return player.getHistory("useCard", evt => evt.getParent(phase) == event.getParent(phase)).length; + }, + async cost(event, trigger, player) { + const num = lib.skill.mbchengxiong.phaseUsed(trigger, player); + event.result = await player.chooseTarget(get.prompt2("mbchengxiong"), function (card, player, target) { + const num = get.event("num"); + return target.countCards("he") >= num; + }).set("num", num).set("color", get.color(trigger.card)).set("ai", function (target) { + let player = get.player(), eff = get.effect(target, { name: "guohe_copy2" }, player, player); + const color = get.event("color"); + if (target.getCards("e").some(card => get.color(card) == color)) eff += get.damageEffect(target, player, player) / 2; + return eff; + }).forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + const result = await player.discardPlayerCard("he", target, true).set("ai", function (button) { + let val = get.buttonValue(button); + if (get.attitude(_status.event.player, get.owner(button.link)) > 0) val *= -1; + if (get.position(button.link) == "e" && get.color(button.link) == get.event("color")) return val *= 2; + return val; + }).set("color", get.color(trigger.card)).forResult(); + if (result.bool && get.color(result.links[0]) == get.color(trigger.card)) await target.damage(); + }, + mod: { + aiOrder: function (player, card, num) { + if (get.type2(card) == "trick") return num + 10; + }, + }, + }, + mbwangzhuang: { + audio: 2, + trigger: { + global: "damageEnd", + }, + filter: function (event, player) { + if (event.card) return false; + return [event.source, event.player].includes(player); + }, + logTarget: function (event, player) { + return _status.currentPhase || player; + }, + async content(event, trigger, player) { + await player.draw(2); + if (_status.currentPhase) _status.currentPhase.addTempSkill("fengyin"); + }, + }, + //王经 + mbzujin: { + audio: 3, + enable: ["chooseToUse", "chooseToRespond"], + filter: function (event, player) { + if (!player.countCards("hse", card => get.type(card) == "basic")) return false; + if (player.isDamaged()) { + if (event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && !player.getStorage("mbzujin").includes("shan")) return true; + if (event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && !player.getStorage("mbzujin").includes("wuxie")) return true; + } + if (!player.isDamaged() || !player.isMinHp()) { + if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event) && !player.getStorage("mbzujin").includes("sha")) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + if (player.isDamaged()) { + if (event.filterCard(get.autoViewAs({ name: "shan" }, "unsure"), player, event) && !player.getStorage("mbzujin").includes("shan")) list.push(["基本", "", "shan"]); + if (event.filterCard(get.autoViewAs({ name: "wuxie" }, "unsure"), player, event) && !player.getStorage("mbzujin").includes("wuxie")) list.push(["锦囊", "", "wuxie"]); + } + if (!player.isDamaged() || !player.isMinHp() && !player.getStorage("mbzujin").includes("sha")) { + if (event.filterCard(get.autoViewAs({ name: "sha" }, "unsure"), player, event)) list.push(["基本", "", "sha"]); + } + return ui.create.dialog("阻进", [list, "vcard"]); + }, + check: function (button) { + if (_status.event.getParent().type != "phase") return 1; + var player = _status.event.player; + return player.getUseValue({ + name: button.link[2], + nature: button.link[3], + }); + }, + backup: function (links, player) { + return { + filterCard: card => get.type(card) == "basic", + popname: true, + check: function (card) { + return 8 - get.value(card); + }, + position: "hse", + viewAs: { name: links[0][2], nature: links[0][3] }, + precontent: function () { + player.logSkill("mbzujin"); + if (!player.storage.mbzujin) { + player.storage.mbzujin = []; + player.when({ global: "phaseEnd" }).then(() => { + delete player.storage.mbzujin; + }); + } + player.markAuto("mbzujin", [event.result.card.name]); + }, + }; + }, + prompt: function (links, player) { + return "将一张基本牌当做" + get.translation(links[0][2]) + "使用"; + }, + }, + hiddenCard: function (player, name) { + if (!player.countCards("she", card => get.type(card) == "basic")) return false; + if (player.getStorage("mbzujin").includes(name)) return false; + if (["shan", "wuxie"].includes(name)) return player.isDamaged(); + if (name == "sha") return (!player.isDamaged() || !player.isMinHp()); + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function (player, tag) { + if (!player.countCards("hse", card => get.type(card) == "basic")) return false; + if (tag == "respondSha") return (!player.isDamaged() || !player.isMinHp()) && !player.getStorage("mbzujin").includes("sha"); + return player.isDamaged() && !player.getStorage("mbzujin").includes("shan"); + }, + order: 1, + result: { + player: function (player) { + if (_status.event.dying) return get.attitude(player, _status.event.dying); + return 1; + }, + }, + }, + }, + mbjiejian: { + audio: 3, + trigger: { + player: "phaseZhunbeiBegin", + }, + filter: function (event, player) { + return player.countCards("h"); + }, + async cost(event, trigger, player) { + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + const give_map = {}; + let used = []; + do { + const result = await player.chooseCardTarget({ + filterCard: function (card) { + return get.itemtype(card) == "card" && !card.hasGaintag("mbjiejian_tag"); + }, + filterTarget: lib.filter.notMe, + selectCard: [1, Infinity], + prompt: used.length ? "是否继续分配手牌?" : get.prompt("mbjiejian"), + prompt2: "请选择要分配的卡牌和目标", + ai1: function (card) { + if (!ui.selected.cards.length) return 8 - get.value(card); + return 0; + }, + ai2: function (target) { + let player = _status.event.player, + card = ui.selected.cards[0]; + let val = get.value(card), att = get.attitude(player, target); + if (val <= 4) { + if (get.event("used").includes(target)) return 0; + return 1 / target.getUseValue(card); + } + return att * (target.getUseValue(card) + 4); + }, + }).set("used", used).forResult(); + if (result.bool && result.targets.length) { + const id = result.targets[0].playerid, + map = give_map; + if (!map[id]) map[id] = []; + map[id].addArray(result.cards); + player.addGaintag(result.cards, "mbjiejian_tag"); + used.addArray(result.targets); + } + else break; + } while (player.countCards("h")); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + const list = [], targets = []; + for (const i in give_map) { + const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.2); + targets.push(source); + list.push([source, give_map[i]]); + } + event.result = { + bool: list.length > 0, + targets: targets, + cost_data: list, + }; + }, + async content(event, trigger, player) { + const list = event.cost_data; + await game.loseAsync({ + gain_list: list, + player: player, + cards: list.map(i => i[1]).flat(), + giver: player, + animate: "giveAuto", + }).setContent("gaincardMultiple"); + for (let target of event.targets) { + let num = target.hp - target.countMark("mbjiejian_mark"); + target.addMark("mbjiejian_mark", num, false); + } + }, + group: ["mbjiejian_liuli", "mbjiejian_remove"], + subSkill: { + liuli: { + audio: "mbjiejian", + trigger: { + global: "useCardToTarget", + }, + filter: function (event, player) { + if (get.type(event.card) == "equip") return false; + if (!event.targets || event.targets.length != 1) return false; + if (!event.targets[0].hasMark("mbjiejian_mark")) return false; + return true; + }, + prompt2: "将此牌转移给自己", + check: function (event, player) { + return get.effect(player, event.card, event.player, player) >= get.effect(event.targets[0], event.card, event.player, player); + }, + logTarget: "target", + async content(event, trigger, player) { + const evt = trigger.getParent(); + evt.triggeredTargets2.removeArray(event.targets); + evt.targets.removeArray(event.targets); + if (lib.filter.targetEnabled2(trigger.card, trigger.player, player)) evt.targets.push(player); + await player.draw(); + }, + }, + remove: { + audio: "mbjiejian", + trigger: { + global: "phaseEnd", + }, + forced: true, + filter: function (event, player) { + return event.player.hasMark("mbjiejian_mark"); + }, + logTarget: "player", + async content(event, trigger, player) { + const target = event.targets[0], num = target.countMark("mbjiejian_mark"); + target.removeMark("mbjiejian_mark", num, false); + if (target.hp >= num) await player.draw(2); + }, + }, + mark: { + intro: { + content: "获得“节谏”时的体力值:$", + }, + }, + }, + }, //新司马孚 mbpanxiang: { - audio: 2, + audio: 4, trigger: { global: "damageBegin3", }, @@ -60,7 +554,7 @@ const skills = { if (att > 0) { if (trigger.num >= target.getHp()) return SUB; if ( - souce && !source.countCards("hs", card => { + source && !source.countCards("hs", card => { return source.canUse(card, target, true) && get.effect(target, card, source, player) > 0; }) ) @@ -225,17 +719,21 @@ const skills = { logTarget: "target", usable: 2, async content(event, trigger, player) { - const target = trigger.target; + const target = trigger.target, list = []; const playerCards = player.getCards("he", card => { return lib.filter.cardDiscardable(card, player, "mbkuangli"); }); - if (playerCards.length > 0) await player.discard(playerCards.randomGet()); + if (playerCards.length > 0) list.push([player, playerCards.randomGets(1)]); const targetCards = target.getCards("he", card => { return lib.filter.cardDiscardable(card, target, "mbkuangli"); }); - if (targetCards.length > 0) await target.discard(targetCards.randomGet()); + if (targetCards.length > 0) list.push([target, targetCards.randomGets(1)]); + await game.loseAsync({ + lose_list: list, + discarder: player, + }).setContent("discardMultiple"); await game.asyncDelayx(); - await player.draw(); + await player.draw(2); await game.asyncDelayx(); }, ai: { @@ -348,8 +846,9 @@ const skills = { ); }, async cost(event, trigger, player) { + const num = get.mode() === "identity" ? 3 : 2; event.result = await player - .chooseTarget(get.prompt("mbcuizhen"), "废除至多两名其他角色的武器栏", [1, 2], (card, player, target) => { + .chooseTarget(get.prompt("mbcuizhen"), "废除至多" + get.cnNumber(num) +"名其他角色的武器栏", [1, num], (card, player, target) => { return target !== player && target.hasEnabledSlot(1); }) .set("ai", target => { @@ -402,10 +901,10 @@ const skills = { }, async content(event, trigger, player) { trigger.num += Math.min( - 2, + 4, game.countPlayer(current => { return current.countDisabledSlot(1); - }) + }) + (get.mode() === "identity" ? 1 : 2) ); }, }, @@ -429,7 +928,7 @@ const skills = { neg: true, }, }, - //曹髦 史?! + //曹髦 史?! 我求你别改了 mbqianlong: { audio: 6, persevereSkill: true, @@ -444,15 +943,17 @@ const skills = { forced: true, locked: false, beginMarkCount: 20, - maxMarkCount: 100, + maxMarkCount: 99, derivation: ["mbcmqingzheng", "mbcmjiushi", "mbcmfangzhu", "mbjuejin"], addMark(player, num) { num = Math.min(num, lib.skill.mbqianlong.maxMarkCount - player.countMark("mbqianlong")); player.addMark("mbqianlong", num); }, - group: ["mbqianlong_begin", "mbqianlong_add"], + group: ["mbqianlong_begin", "mbqianlong_add", "mbqianlong_die"], async content(event, trigger, player) { - player.addAdditionalSkill("mbqianlong", lib.skill.mbqianlong.derivation.slice(0, Math.floor(player.countMark("mbqianlong") / 25))); + const derivation = lib.skill.mbqianlong.derivation, + skills = player.countMark("mbqianlong") == lib.skill.mbqianlong.maxMarkCount ? derivation : derivation.slice(0, Math.floor(player.countMark("mbqianlong") / 25)); + player.addAdditionalSkill("mbqianlong", skills); }, marktext: "道", intro: { @@ -474,7 +975,12 @@ const skills = { forced: true, locked: false, async content(event, trigger, player) { - lib.skill.mbqianlong.addMark(player, lib.skill.mbqianlong.beginMarkCount); + const num = game.hasPlayer(current => { + return current !== player && current.group === "wei" && player.hasZhuSkill("mbweitong", current); + }) + ? 60 + : lib.skill.mbqianlong.beginMarkCount; + lib.skill.mbqianlong.addMark(player, num); }, }, add: { @@ -501,35 +1007,30 @@ const skills = { lib.skill.mbqianlong.addMark(player, toAdd); }, }, + die: { + trigger: { + player: "dieBefore", + }, + charlotte: true, + firstDo: true, + forced: true, + popup: false, + forceDie: true, + async content(event, trigger, player) { + player.changeSkin({ characterName: "mb_caomao" }, "mb_caomao_dead"); + }, + }, }, }, mbweitong: { audio: 1, persevereSkill: true, + zhuSkill: true, trigger: { - global: "phaseBefore", - player: "enterGame", + player: "mbqianlong_beginBegin", }, - filter(event, player) { - return ( - (event.name != "phase" || game.phaseNumber == 0) && - game.hasPlayer(current => { - return current !== player && current.group === "wei" && player.hasZhuSkill("mbweitong", current); - }) - ); - }, - zhuSkill: true, forced: true, - locked: false, - async content(event, trigger, player) { - lib.skill.mbqianlong.addMark( - player, - 20 * - game.countPlayer(current => { - return current !== player && current.group === "wei" && player.hasZhuSkill("mbweitong", current); - }) - ); - }, + content() {}, ai: { combo: "mbqianlong", }, @@ -545,14 +1046,16 @@ const skills = { direct: true, content() { "step 0"; - var num = 2; + var num = 1; var prompt = "###" + get.prompt("sbqingzheng") + "###弃置" + get.cnNumber(num) + "种花色的所有牌"; - var next = player.chooseButton([prompt, [lib.suit.map(i => ["", "", "lukai_" + i]), "vcard"]], num); + var next = player.chooseButton([prompt, [lib.suit.map(i => ["", "", "lukai_" + i]), "vcard"]], [num, num + 1]); next.set("filterButton", button => { var player = _status.event.player; + if (ui.selected.buttons.length >= get.event().num) return false; var cards = player.getCards("h", { suit: button.link[2].slice(6) }); return cards.length > 0 && cards.filter(card => lib.filter.cardDiscardable(card, player, "sbqingzheng")).length == cards.length; }); + next.set("num", num); next.set("ai", button => { var player = _status.event.player; return ( @@ -727,7 +1230,8 @@ const skills = { persevereSkill: true, inherit: "sbfangzhu", filter(event, player) { - return game.hasPlayer(current => current !== player); + const target = player.storage.mbcmfangzhu; + return game.hasPlayer(current => current !== player && (target ? target != current : true)); }, usable: 1, chooseButton: { @@ -776,12 +1280,20 @@ const skills = { filterTarget(card, player, target) { if (target == player) return false; const num = lib.skill.mbcmfangzhu_backup.num, - storage = target.getStorage("mbcmfangzhu_ban"); + storage = target.getStorage("mbcmfangzhu_ban"), + targetx = player.storage.mbcmfangzhu; + if (target == targetx) return false; return num != 1 || !storage.length; }, async content(event, trigger, player) { const target = event.target; const num = lib.skill.mbcmfangzhu_backup.num; + player.storage.mbcmfangzhu = target; + let evt=event.getParent("phaseUse",true); + if(evt) evt.fangzhuUsed=true; + player.when("phaseUseEnd").filter(evtx=>!evtx.fangzhuUsed).then(()=>{ + player.storage.mbcmfangzhu = player; + }); switch (num) { case 1: target.addTempSkill("mbcmfangzhu_ban", { player: "phaseEnd" }); @@ -876,18 +1388,37 @@ const skills = { selectTarget: -1, multiline: true, async contentBefore(event, trigger, player) { + player.changeSkin({ characterName: "mb_caomao" }, "mb_caomao_shadow"); player.awakenSkill("mbjuejin"); }, async content(event, trigger, player) { const target = event.target; const delt = target.getHp(true) - 1, num = Math.abs(delt); - await target[delt > 0 ? "loseHp" : "recover"](num); - if (num > 0) await target.changeHujia(num, null, true); + if (delt != 0) { + if (delt > 0) { + const next = target.changeHp(-delt); + next._triggered = null; + await next; + } else await target.recover(num); + } + if (num > 0) await target.changeHujia(num + (player == target ? 2 : 0), null, true); + else if (player == target) await target.changeHujia(2, null, true); }, async contentAfter(event, trigger, player) { game.addGlobalSkill("mbjuejin_xiangsicunwei"); player.$fullscreenpop("向死存魏!", "thunder"); + const cards = ["cardPile", "discardPile"].map(pos => Array.from(ui[pos].childNodes)).flat(); + const filter = card => ["shan", "tao", "jiu"].includes(card.name); + const cardx = cards.filter(filter); + if (cardx.length) { + await game.cardsGotoSpecial(cardx); + game.log(cardx, "被移出了游戏"); + } + for (const target of game.filterPlayer()) { + const sishis = target.getCards("hej", filter); + if (sishis.length) await target.lose(sishis); + } }, ai: { order: 0.1, @@ -3653,7 +4184,6 @@ const skills = { //赵忠 scschiyan: { audio: 1, - shaRelated: true, trigger: { player: "useCardToPlayered" }, direct: true, filter: function (event, player) { @@ -3877,7 +4407,7 @@ const skills = { "step 0"; player.draw(2); "step 1"; - var num = player.countCards("he"); + var num = player.countCards("h"); if (!num) event.finish(); else if (num < 2) event._result = { index: 1 }; else @@ -3896,7 +4426,7 @@ const skills = { "step 2"; if (result.index == 0) { player.chooseCardTarget({ - position: "he", + position: "h", filterCard: true, selectCard: 2, filterTarget: function (card, player, target) { @@ -3911,11 +4441,11 @@ const skills = { if (target.hasJudge("lebu")) att /= 5; return att; }, - prompt: "选择两张牌,交给一名其他角色", + prompt: "选择两张手牌,交给一名其他角色", forced: true, }); } else { - player.chooseToDiscard(2, true, "he"); + player.chooseToDiscard(2, true, "h"); event.finish(); } "step 3"; @@ -6608,10 +7138,10 @@ const skills = { audio: "mbdaoshu1", enable: "phaseUse", filter: function (event, player) { - return game.hasPlayer(target => target != player && target.countCards("h") > 2); + return game.hasPlayer(target => target != player && target.countCards("h") >= 2); }, filterTarget: function (card, player, target) { - return target != player && target.countCards("h") > 2; + return target != player && target.countCards("h") >= 2; }, usable: 1, prompt: () => lib.translate.mbdaoshu_info, @@ -9273,7 +9803,6 @@ const skills = { }, }, relieren: { - shaRelated: true, audio: 2, audioname: ["boss_lvbu3"], trigger: { player: "useCardToPlayered" }, @@ -11399,7 +11928,7 @@ const skills = { } str += ""; event.cards = cards; - player.chooseButton(["纵适:选择要获得的牌", str, cards], true).set("ai", get.buttonValue); + player.chooseButton(["纵适:选择要获得的牌", str, cards]).set("ai", get.buttonValue); "step 1"; if (result.bool) { var draw = result.links[0] == cards[0]; @@ -12740,6 +13269,7 @@ const skills = { }, rezhengrong: { trigger: { player: "useCardAfter" }, + locked: true, direct: true, audio: "drlt_zhenrong", filter: function (event, player) { @@ -12770,7 +13300,7 @@ const skills = { content: function () { "step 0"; player - .chooseTarget(get.prompt("rezhengrong"), "将一名其他角色的随机一张牌置于你的武将牌上,成为「荣」", function (card, player, target) { + .chooseTarget(get.prompt("rezhengrong"), true, "将一名其他角色的随机一张牌置于你的武将牌上,成为「荣」", function (card, player, target) { return target != player && target.countCards("he") > 0; }) .set("ai", function (target) { @@ -13322,7 +13852,7 @@ const skills = { } } "step 3"; - var card = get.cardPile2(function (card) { + var card = get.cardPile(function (card) { return get.type(card, "trick") == result.control; }); if (card) player.gain(card, "gain2", "log"); @@ -14023,12 +14553,30 @@ const skills = { "step 1"; if (result.bool) { player.logSkill("rebiaozhao"); - player.addToExpansion(player, "give", result.cards).gaintag.add("rebiaozhao"); + player.addToExpansion(player, result.cards).gaintag.add("rebiaozhao"); } }, - onremove: function (player, skill) { - var cards = player.getExpansions(skill); - if (cards.length) player.loseToDiscardpile(cards); + intro: { + markcount: "expansion", + mark(dialog, content, player) { + var content = player.getExpansions("rebiaozhao"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { + dialog.addAuto(content); + } else { + return "共有" + get.cnNumber(content.length) + "张表"; + } + } + }, + content(content, player) { + var content = player.getExpansions("rebiaozhao"); + if (content && content.length) { + if (player == game.me || player.isUnderControl()) { + return get.translation(content); + } + return "共有" + get.cnNumber(content.length) + "张表"; + } + }, }, ai: { notemp: true }, group: ["rebiaozhao2", "rebiaozhao3"], @@ -14390,9 +14938,9 @@ const skills = { content: function () { "step 0"; player - .chooseTarget(get.prompt("meiyong"), "获得一名其他角色的一张牌,然后其摸一张牌。", function (card, player, target) { + .chooseTarget(get.prompt("meiyong"), "获得一名其他角色区域内的一张牌,然后其摸一张牌。", function (card, player, target) { if (player == target) return false; - return target.countGainableCards(player, "he") > 0; + return target.countGainableCards(player, "hej") > 0; }) .set("ai", function (target) { return 10 - get.attitude(_status.event.player, target); @@ -14402,7 +14950,7 @@ const skills = { var target = result.targets[0]; event.target = target; player.logSkill("meiyong", target); - player.gainPlayerCard(target, "he", true); + player.gainPlayerCard(target, "hej", true); } else event.finish(); "step 2"; target.draw(); @@ -14507,7 +15055,7 @@ const skills = { animationColor: "thunder", content: function () { player.awakenSkill("remoucheng"); - player.changeSkills(["jingong", "relianji"]); + player.changeSkills(["jingong"], ["relianji"]); player.gainMaxHp(); player.recover(); }, @@ -14865,13 +15413,14 @@ const skills = { usable: 1, audio: 2, filter: function (event, player) { - return player.countCards("h") > 0 && player.getExpansions("xinfu_zhaoxin").length < 3; + return player.countCards("he") > 0 && player.getExpansions("xinfu_zhaoxin").length < 3; }, filterCard: true, selectCard: function () { var player = _status.event.player; return [1, 3 - player.getExpansions("xinfu_zhaoxin").length]; }, + position: "he", discard: false, lose: false, delay: false, diff --git a/character/mobile/sort.js b/character/mobile/sort.js index 4b68e89458..9f9f271874 100644 --- a/character/mobile/sort.js +++ b/character/mobile/sort.js @@ -1,5 +1,6 @@ const characterSort = { - mobile_default: ["mb_simafu", "mb_sp_guanqiujian", "mb_caomao", "chengji", "lizhaojiaobo", "xin_huojun", "muludawang", "mb_chengui", "mb_huban", "mb_xianglang", "yanxiang", "xin_wuban", "laimin", "baoxin", "jiangji", "liwei", "xin_guozhao", "miheng", "taoqian", "lingcao", "sunru", "lifeng", "zhuling", "liuye", "zhaotongzhaoguang", "majun", "simazhao", "wangyuanji", "pangdegong", "shenpei", "hujinding", "zhangyì", "jiakui", "yangbiao", "chendeng", "dongcheng", "yangyi", "dengzhi", "zhengxuan", "sp_sufei", "furong", "dingyuan", "simashi", "yanghuiyu", "hucheer", "gongsunkang", "nanhualaoxian", "zhouqun", "qiaozhou", "fuqian", "mayuanyi", "yanpu", "sunhanhua", "sp_maojie", "peixiu", "sp_jianggan", "ruanhui", "xin_mamidi", "sp_caosong", "yangfu", "wangjun", "sp_pengyang", "qianzhao", "shichangshi", "yangfeng"], + mobile_default: ["xin_huojun", "muludawang", "mb_chengui", "mb_huban", "mb_xianglang", "yanxiang", "xin_wuban", "laimin", "baoxin", "jiangji", "liwei", "xin_guozhao", "miheng", "taoqian", "lingcao", "sunru", "lifeng", "zhuling", "liuye", "zhaotongzhaoguang", "majun", "simazhao", "wangyuanji", "pangdegong", "shenpei", "hujinding", "zhangyì", "jiakui", "yangbiao", "chendeng", "dongcheng", "yangyi", "dengzhi", "zhengxuan", "sp_sufei", "furong", "dingyuan", "simashi", "yanghuiyu", "hucheer", "gongsunkang", "nanhualaoxian", "zhouqun", "qiaozhou", "fuqian", "mayuanyi", "yanpu", "sunhanhua", "sp_maojie", "peixiu", "sp_jianggan", "ruanhui", "xin_mamidi", "sp_caosong", "yangfu", "wangjun", "sp_pengyang", "qianzhao", "shichangshi", "yangfeng", "zhangbu"], + mobile_longxue: ["mb_simafu", "mb_wenqin", "mb_simazhou", "mb_sp_guanqiujian", "mb_caomao", "chengji", "lizhaojiaobo", "mb_wangjing"], mobile_yijiang: ["yj_zhanghe", "yj_zhangliao", "yj_xuhuang", "yj_ganning", "yj_huangzhong", "yj_weiyan", "yj_zhoubuyi"], mobile_standard: ["xin_xiahoudun", "xin_zhangfei"], mobile_shenhua_feng: ["re_xiaoqiao", "xin_zhoutai"], @@ -34,6 +35,7 @@ const characterSortTranslate = { mobile_yijiang67: "手杀异构·原创设计", mobile_sp: "手杀异构·SP", mobile_default: "袖里乾坤", + mobile_longxue: "龙血玄黄", mobile_others: "其他", mobile_changshi: "十常侍单体", }; diff --git a/character/mobile/translate.js b/character/mobile/translate.js index 5cb390d590..b55a6db738 100644 --- a/character/mobile/translate.js +++ b/character/mobile/translate.js @@ -36,7 +36,7 @@ const translates = { xinfu_daigong: "怠攻", xinfu_daigong_info: "每回合限一次。当你受到伤害时,你可以展示所有手牌,然后令伤害来源选择一项:交给你一张与你所有手牌花色均不相同的一张牌,或防止此伤害。", xinfu_zhaoxin: "昭心", - xinfu_zhaoxin_info: "出牌阶段限一次,你可以将任意张手牌置于武将牌上并摸等量的牌,称之为「望」(你至多拥有三张「望」)。你或你攻击范围内的一名其他角色的摸牌阶段结束后,其可以获得一张由你选择的「望」,然后你可以对其造成1点伤害。", + xinfu_zhaoxin_info: "出牌阶段限一次,你可以将任意张牌置于武将牌上并摸等量的牌,称之为「望」(你至多拥有三张「望」)。你或你攻击范围内的一名其他角色的摸牌阶段结束后,其可以获得一张由你选择的「望」,然后你可以对其造成1点伤害。", zhaoxin_give: "昭心", zhaoxin_give_info: "", xinfu_qianchong: "谦冲", @@ -154,13 +154,13 @@ const translates = { liezhi_info: "准备阶段,你可以依次弃置至多两名其他角色区域内的各一张牌。若你受到过伤害,则〖烈直〗于你的下个回合无效。", xinzhanyi: "战意", - xinzhanyi_info: "出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作杀、酒或桃使用,且你本回合第一次以此法使用的牌的回复值/伤害值+1;锦囊牌,摸三张牌且你使用的牌不能被【无懈可击】响应;装备牌,你使用【杀】指定唯一目标后,其弃置两张牌,然后你获得其中的一张。", + xinzhanyi_info: "出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作【杀】、【酒】或【桃】使用,且你本回合第一次以此法使用的牌的回复值/伤害值+1;锦囊牌,摸三张牌且你使用的牌不能被【无懈可击】响应;装备牌,你使用【杀】指定唯一目标后,其弃置两张牌,然后你获得其中的一张。", xinzhanyi_basic_backup: "战意", xinzhanyi_basic: "战意", xinzhanyi_equip: "战意", meiyong: "姝勇", - meiyong_info: "当你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后其摸一张牌。", + meiyong_info: "当你使用或打出【杀】时,你可以获得一名其他角色区域内的一张牌,然后其摸一张牌。", rexushen: "许身", rexushen_info: "限定技,出牌阶段,你可以失去X点体力(X为场上男性角色的数量)。若你以此法进入了濒死状态,则当你因一名角色而脱离此濒死状态后,你可以令其获得技能〖武圣〗和〖当先〗。", rezhennan: "镇南", @@ -214,7 +214,7 @@ const translates = { zhaohan: "昭汉", zhaohan_info: "锁定技,你的第1-4个准备阶段开始时,你加1点体力上限并回复1点体力,你的第5-7个准备阶段开始时,你减1点体力上限。", rangjie: "让节", - rangjie_info: "当你受到1点伤害后,你可以选择一项并摸一张牌:获得牌堆里你选择的类型的一张牌,或移动场上的一张牌。", + rangjie_info: "当你受到1点伤害后,你可以选择一项并摸一张牌:获得牌堆或弃牌堆里你选择的类型的一张牌,或移动场上的一张牌。", yizheng: "义争", yizheng2: "义争", yizheng_info: "出牌阶段限一次,你可以和一名体力值不大于你的其他角色拼点。若你赢,其跳过下个摸牌阶段。若你没赢,你减1点体力上限。", @@ -238,7 +238,7 @@ const translates = { rehongju: "鸿举", reqingce: "清侧", reqingce_backup: "清侧", - rezhengrong_info: "当你于出牌阶段使用的指定了其他角色为目标的牌结算完成后,若此牌是你本局游戏内于出牌阶段使用的指定了其他角色为目标的第偶数张牌,则你可以将一名其他角色角色的随机一张牌置于你的武将牌上,称为「荣」。", + rezhengrong_info: "锁定技。当你于出牌阶段使用的指定了其他角色为目标的牌结算完成后,若此牌是你本局游戏内于出牌阶段使用的指定了其他角色为目标的第偶数张牌,则你将一名其他角色角色的随机一张牌置于你的武将牌上,称为「荣」。", rehongju_info: "觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3且有角色死亡,则你摸等同于「荣」数量的牌。然后可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。", reqingce_info: "出牌阶段,你可以将一张「荣」置入弃牌堆,然后弃置场上的一张牌。", re_pangtong: "手杀界庞统", @@ -259,7 +259,7 @@ const translates = { relihuo: "疠火", relihuo_damage: "疠火", relihuo_baigei: "疠火", - relihuo_info: "当你使用普【杀】时,你可以将此杀改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)。", + relihuo_info: "当你使用普【杀】时,你可以将此【杀】改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)。", dengzhi: "手杀邓芝", dengzhi_prefix: "手杀", jimeng: "急盟", @@ -335,7 +335,7 @@ const translates = { rejiangchi: "将驰", rejiangchi_info: "出牌阶段开始时,你可以选择一项:1、摸一张牌,若如此做,你本阶段内不能使用【杀】。 2、弃置一张牌,若如此做,此阶段你使用【杀】无距离限制且你可以额外使用一张【杀】。", rezhenxing: "镇行", - rezhenxing_info: "结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", + rezhenxing_info: "结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的三张牌,然后你获得其中与其余牌花色均不相同的一张牌,将剩余牌以原顺序放回牌堆顶。", xin_jianyong: "手杀界简雍", xin_jianyong_prefix: "手杀界", xinqiaoshui: "巧说", @@ -577,9 +577,9 @@ const translates = { spdaoshu_info_identity: "每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", spdaoshu_info_guozhan: "每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。", mbdaoshu: "盗书", - mbdaoshu_info: "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你和队友观看其手牌并猜测其伪装的手牌,猜对的角色对其造成1点伤害,猜错的角色随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", - mbdaoshu_info_identity: "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", - mbdaoshu_info_guozhan: "出牌阶段限一次,你可以选择一名手牌数大于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", + mbdaoshu_info: "出牌阶段限一次,你可以选择一名手牌数不少于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你和队友观看其手牌并猜测其伪装的手牌,猜对的角色对其造成1点伤害,猜错的角色随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", + mbdaoshu_info_identity: "出牌阶段限一次,你可以选择一名手牌数不少于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", + mbdaoshu_info_guozhan: "出牌阶段限一次,你可以选择一名手牌数不少于两张的其他角色,其随机获得三个牌名并将一张手牌的牌名伪装成其中一个与原牌名不同的牌名,然后你观看其手牌并猜测其伪装的手牌。若猜中,你对其造成1点伤害;若猜错,你随机弃置两张手牌(手牌数不足两张则改为失去1点体力)。", spdaizui: "戴罪", spdaizui2: "戴罪", spdaizui_info: "限定技。当你受到伤害值不小于体力值的伤害时,你可防止此伤害并将此伤害渠道对应的所有实体牌置于伤害来源的武将牌上,称为“释”。本回合结束时,其获得所有“释”。", @@ -714,7 +714,7 @@ const translates = { scsyaozhuo_info: "出牌阶段限一次。你可以与一名角色拼点,若你赢,其跳过下一个摸牌阶段;若你没赢,你弃置两张牌。", scs_hankui: "韩悝", scsxiaolu: "宵赂", - scsxiaolu_info: "出牌阶段限一次。你可以摸两张牌,然后选择一项:1.弃置两张牌;2.将两张牌交给一名其他角色。", + scsxiaolu_info: "出牌阶段限一次。你可以摸两张牌,然后选择一项:1.弃置两张手牌;2.将两张手牌交给一名其他角色。", scs_lisong: "栗嵩", scskuiji: "窥机", scskuiji_info: "出牌阶段限一次。你可以观看一名其他角色的手牌,然后弃置你与其的共计四张花色各不相同的手牌。", @@ -863,35 +863,59 @@ const translates = { mbshishou_info: "锁定技。当你发动〖佐佑〗后,若目标角色不为你,你执行〖佐佑〗中目标角色未执行的一项。", chengji: "成济", mbkuangli: "狂戾", - mbkuangli_info: "锁定技。①出牌阶段开始时,你随机令场上任意名其他角色获得“狂戾”标记。②出牌阶段限两次。当你使用牌指定有“狂戾”的角色为目标后,你与其各随机弃置一张牌,然后你摸一张牌。③回合结束时,你移除所有角色的“狂戾”。", + mbkuangli_info: "锁定技。①出牌阶段开始时,你随机令场上任意名其他角色获得“狂戾”标记。②出牌阶段限两次。当你使用牌指定有“狂戾”的角色为目标后,你随机弃置你与其各一张牌,然后你摸两张牌。③回合结束时,你移除所有角色的“狂戾”。", mbxiongsi: "凶肆", mbxiongsi_info: "限定技。出牌阶段,若你的手牌数不少于三张,你可以弃置所有手牌,然后令所有其他角色依次失去1点体力。", - mb_sp_guanqiujian: "SP毌丘俭", - mb_sp_guanqiujian_prefix: "SP", + mb_sp_guanqiujian: "玄毌丘俭", + mb_sp_guanqiujian_prefix: "玄", mbcuizhen: "摧阵", - mbcuizhen_info: "①游戏开始时,你可以废除至多两名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。", + mbcuizhen_info: "①游戏开始时,你可以废除至多两名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和+2,至多为4)。", + mbcuizhen_info_identity: "①游戏开始时,你可以废除至多三名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和+1,至多为4)。", mbkuili: "溃离", mbkuili_info: "锁定技。当你受到伤害后,若来源有被废除的武器栏,你令其恢复武器栏。", mb_caomao: "手杀曹髦", mb_caomao_prefix: "手杀", mbqianlong: "潜龙", - mbqianlong_info: "持恒技。①游戏开始时,你获得20枚“道心”标记。②当你得到牌后/受到1点伤害后/造成1点伤害后,你获得5/10/15枚“道心”(上限为100枚)。③若你的“道心”数不小于25/50/75/100,你视为拥有〖清正〗/〖酒诗〗/〖放逐〗/〖决进〗。", + mbqianlong_info: "持恒技。①游戏开始时,你获得20枚“道心”标记。②当你得到牌后/受到1点伤害后/造成1点伤害后,你获得5/10/15枚“道心”(上限为99枚)。③若你的“道心”数不小于25/50/75/99,你视为拥有〖清正〗/〖酒诗〗/〖放逐〗/〖决进〗。", mbcmqingzheng: "清正", - mbcmqingzheng_info: "持恒技。出牌阶段开始时,你可以弃置两种花色的所有手牌,并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。", + mbcmqingzheng_info: "持恒技。出牌阶段开始时,你可以弃置一种花色的所有手牌,并观看一名有手牌的其他角色的手牌,你弃置其中一种花色的所有牌。若其被弃置的牌数小于你以此法弃置的牌数,你对其造成1点伤害。", mbcmjiushi: "酒诗", mbcmjiushi_info: "持恒技。①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌背面向上,你可以翻面。③当你翻面后,你获得牌堆里的一张锦囊牌。", mbcmfangzhu: "放逐", - mbcmfangzhu_info: "持恒技。出牌阶段限一次,你可以选择一名其他角色,选择一项:⒈令其不能使用手牌中的非锦囊牌直到其回合结束;⒉令其所有非Charlotte技能失效直到其回合结束。", + mbcmfangzhu_info: "持恒技。出牌阶段限一次,你可以选择一名不为你上个出牌阶段发动〖放逐〗的目标的其他角色,选择一项:⒈令其不能使用手牌中的非锦囊牌直到其回合结束;⒉令其所有非Charlotte技能失效直到其回合结束。", mbjuejin: "决进", - mbjuejin_info: "持恒技,限定技。出牌阶段,你可以令所有角色依次将体力回复或失去至1并获得X点护甲(X为一名角色以此法变化的体力值)。然后你增加如下“向死存魏”的全局技能:当有牌进入弃牌堆后,系统将这些牌中的【闪】、【桃】和【酒】移出游戏。", + mbjuejin_info: "持恒技,限定技。出牌阶段,你可以令所有角色依次将体力调整至1并获得X点护甲(X为一名角色以此法变化的体力值且你以此法获得的护甲数额外+2)。然后你将牌堆、弃牌堆、场上及所有角色手牌中的【闪】、【桃】和【酒】移出游戏且增加如下“向死存魏”的全局技能:当有牌进入弃牌堆后,系统将这些牌中的【闪】、【桃】和【酒】移出游戏。", mbweitong: "卫统", - mbweitong_info: "持恒技,主公技。游戏开始时,若你有〖潜龙〗,你获得20X枚“道心”(X为其他魏势力角色数)。", + mbweitong_info: "持恒技,主公技。游戏开始时,若你有〖潜龙〗且场上有其他魏势力角色,你因“潜龙”于游戏开始时获得的“道心”标记数修改为60枚。", mb_simafu: "手杀司马孚", mb_simafu_prefix: "手杀", mbpanxiang: "蹒襄", mbpanxiang_info: "当一名角色受到伤害时,你可以选择一项(不能与上次你因其发动此技能时选择的选项相同):⒈令此伤害-1,伤害来源摸两张牌;⒉令此伤害+1,其摸三张牌。", mbchenjie: "臣节", mbchenjie_info: "锁定技。当一名角色死亡后,若你有〖蹒襄〗且其成为过你〖蹒襄〗的目标,你弃置区域里的所有牌,摸四张牌。", + zhangbu: "张布", + mbchengxiong: "惩凶", + mbchengxiong_info: "你使用锦囊牌指定其他角色为目标后,可选择一名牌数不小于X的角色,弃置其一张牌(X为你此阶段使用的牌数)。若此牌颜色与你使用的锦囊牌相同,你对其造成1点伤害。", + mbwangzhuang: "妄专", + mbwangzhuang_info: "一名角色受到非牌造成的伤害后,若你是伤害来源或受伤角色,你可以摸两张牌,令当前回合角色本回合非锁定技失效。", + mb_wangjing: "王经", + mbzujin: "阻进", + mbzujin_info: "每回合每种牌名限一次,若你未受伤或体力值不为最低,你可将一张基本牌当作【杀】使用或打出;若你已受伤,你可将一张基本牌当作【闪】或【无懈可击】使用或打出。", + mbjiejian: "节谏", + mbjiejian_info: "准备阶段,你可将任意张手牌交给任意名其他角色,并令这些角色获得“节谏”标记。“节谏”角色成为一张非装备牌的唯一目标时,你可将此牌转移给你,然后摸一张牌。“节谏”角色的回合结束时,移去其“节谏”标记,若其体力值不小于X(X为你交给其牌时其的体力值),你摸两张牌。", + mbjiejian_tag: "已分配", + mb_wenqin:"玄文钦", + mb_wenqin_prefix:"玄", + mbbeiming:"孛明", + mbbeiming_info:"游戏开始时,你可令至多两名角色获得牌堆中一张攻击范围为X的武器牌(X为其手牌中的花色数)。", + mbchoumang:"仇铓", + mbchoumang_info:"每回合限一次,你使用【杀】指定唯一目标或成为【杀】的唯一目标后,可以选择一项:①令此【杀】伤害+1;②若此【杀】被【闪】抵消,你可以获得与你距离为1以内的一名其他角色区域里的一张牌;③背水:弃置你与其装备栏里的武器牌,然后依次执行上述所有选项。", + mb_simazhou:"手杀司马伷", + mb_simazhou_prefix:"手杀", + mbbifeng:"避锋", + mbbifeng_info:"你成为一张基本牌或普通锦囊牌的目标时,若此牌目标数不大于4,你可取消之。若如此做,此牌结算完成后若没有其他角色响应此牌,你失去1点体力,否则摸两张牌。", + mbsuwang:"宿望", + mbsuwang_info:"一名角色的回合结束时,若其此回合对你使用过牌且你未受到过伤害,你可以将牌堆顶的一张牌置于武将牌上,称为宿望牌。摸牌阶段开始时,若你有宿望牌,可以改为获得之,若不小于三张,你可以令一名其他角色摸两张牌。", }; export default translates; diff --git a/character/mobile/voices.js b/character/mobile/voices.js index 22203a0e6c..dec8fef093 100644 --- a/character/mobile/voices.js +++ b/character/mobile/voices.js @@ -1,4 +1,36 @@ export default { + "#qiaomeng_xin_gongsunzan1": "夺汝兵刃战马,尔等必败无疑。", + "#qiaomeng_xin_gongsunzan2": "摧敌似折枯,荡寇如反掌。", + "#mbbifeng1": "众士暂避其锋,万不可冲撞圣驾。", + "#mbbifeng2": "陛下今日所为,实令臣民失望。", + "#mbbifeng3": "事已至此,当速禀南阙之急。", + "#mbsuwang1": "居上处事,当极绥怀之仁。", + "#mbsuwang2": "国治吏和,百姓自存怀化之心。", + "#mb_simazhou:die": "臣所求唯葬伏太妃陵次,分国封四子而已……", + "#mbbeiming1": "孛星起于吴楚,吾等应举刀兵!", + "#mbbeiming2": "尽点淮南兵马,以讨司马逆臣!", + "#mbchoumang1": "司马氏之罪,尽洛水亦难清!", + "#mbchoumang2": "汝司马氏世受魏恩,今安敢如此!", + "#mb_wenqin:die": "伺君兵败之日,必报此仇于九泉!", + "#mbpanxiang1": "殿下当以国事为重,奈何效匹夫之孝乎?", + "#mbpanxiang2": "诸君当早拜嗣君,以镇海内,而但哭邪?", + "#mbpanxiang3": "身负托孤之重,但坐谈清论,此亦可乎?", + "#mbpanxiang4": "老臣受命督军,自竭拒吴蜀于疆外。", + "#mbchenjie1": "身为魏臣,终不背魏。", + "#mbchenjie2": "杀陛下者,臣之罪也。", + "#mb_simafu:die": "生此篡逆之事,罪臣难辞其咎……", + "#mbzujin1": "蜀军远来必疲,今当先发以制。", + "#mbzujin2": "错估军情,今唯退守敌道矣。", + "#mbzujin3": "静守待援,不可中诱敌之计。", + "#mbjiejian1": "昔鲁昭公败走失国,陛下因而更宜深虑。", + "#mbjiejian2": "今权在其门,为日已久,陛下何以违抗。", + "#mbjiejian3": "陛下何急一时,今当忍而待机啊。", + "#mb_wangjing:die": "有母此言,今死之无悔……", + "#mbchengxiong1": "天子殿前,岂容不洁之臣。", + "#mbchengxiong2": "陛下有令,还不将其斩之。", + "#mbwangzhuang1": "此事若入君耳,后果汝当自知。", + "#mbwangzhuang2": "孙綝既诛,便是我一言之堂。", + "#zhangbu:die": "悔不遵先帝遗命啊……", "#mbcuizhen1": "欲活命者,还不弃兵卸甲!", "#mbcuizhen2": "全军大进,誓讨司马乱贼!", "#mbkuili1": "此犹有转胜之机,吾等切不可自乱。", @@ -578,10 +610,6 @@ export default { "#guanxing_re_jiangwei2": "欲尽人事,亦先听天命。", "#jixi_re_dengai1": "攻敌之不备,斩将夺辎!", "#jixi_re_dengai2": "奇兵正攻,敌何能为?", - "#drlt_qingce1": "感明帝之恩,清君侧之贼。", - "#drlt_qingce2": "得太后手诏,清奸佞乱臣。", - "#jingong1": "若无老夫之谋,尔等皆化为腐土也。", - "#jingong2": "董贼旧部,可尽诛之!", "#jijiang1_re_liushan1": "还望诸卿勠力同心,以保国祚。", "#jijiang1_re_liushan2": "哪位爱卿愿意报效国家?", "#reyingzi_re_sunben1": "有公瑾助我,可平天下。", diff --git a/character/offline/character.js b/character/offline/character.js index 35d025a9ad..c95751774d 100644 --- a/character/offline/character.js +++ b/character/offline/character.js @@ -1,19 +1,20 @@ const characters = { + yj_zhonghui: ["male", "wei", 4, ["psmouchuan", "pszizhong", "psjizun", "psqingsuan"], ["zhu"]], yj_ehuan: ["male", "qun", 5, ["psdiwan", "pssuiluan", "psconghan"], ["doublegroup:shu:qun"]], - yj_zhouji: ["female", "wu", 3, ["psyanmou", "pszhanyan", "psyuhuo"]], + yj_zhouji: ["female", "wu", 3, ["psyanmou", "pszhanyan", "psyuhuo"], ["name:周|null"]], drag_guanyu: ["male", "shu", 4, ["dragchaojue", "dragjunshen"]], drag_caoren: ["male", "wei", 4, ["draglizhong", "dragjuesui"]], drag_lvchang: ["male", "wei", 3, ["dragjuwu", "dragshouxiang"]], - jsp_ganfuren: ["female", "shu", 3, ["shushen", "shenzhi"], ["character:gz_ganfuren"]], + jsp_ganfuren: ["female", "shu", 3, ["shushen", "shenzhi"], ["character:gz_ganfuren", "name:甘|null"]], ol_xinxianying: ["female", "wei", 3, ["xincaishi", "xinzhongjian"]], zhangliang: ["male", "qun", 4, ["old_jijun", "old_fangtong"]], jsp_caoren: ["male", "wei", 4, ["kuiwei", "yanzheng"]], old_machao: ["male", "qun", 4, ["zhuiji", "oldcihuai"]], - vtb_xiaosha: ["female", "qun", 4, ["vtbguisha", "vtbshuli"]], - vtb_xiaoshan: ["female", "qun", 4, ["vtbshanwu", "vtbxianli"]], - vtb_xiaotao: ["female", "qun", 4, ["vtbtaoyan", "vtbyanli"]], - vtb_xiaole: ["female", "qun", 4, ["vtbleyu", "vtbyuanli"]], - vtb_xiaojiu: ["female", "qun", 4, ["vtbmeiniang", "vtbyaoli"]], + vtb_xiaosha: ["female", "qun", 4, ["vtbguisha", "vtbshuli"], ["name:null|杀"]], + vtb_xiaoshan: ["female", "qun", 4, ["vtbshanwu", "vtbxianli"], ["name:null|闪"]], + vtb_xiaotao: ["female", "qun", 4, ["vtbtaoyan", "vtbyanli"], ["name:null|桃"]], + vtb_xiaole: ["female", "qun", 4, ["vtbleyu", "vtbyuanli"], ["name:null|乐"]], + vtb_xiaojiu: ["female", "qun", 4, ["vtbmeiniang", "vtbyaoli"], ["name:null|酒"]], ps_shen_machao: ["male", "shen", 4, ["psshouli", "pshengwu"], ["qun"]], mateng: ["male", "qun", 4, ["mashu", "xiongyi"]], tianfeng: ["male", "qun", 3, ["sijian", "gzsuishi"]], @@ -24,12 +25,12 @@ const characters = { ps_lvbu: ["male", "qun", 4, ["wushuang", "pssheji"]], ps_jiaxu: ["male", "qun", 4, ["wansha", "psqupo", "psbaoquan"]], ps_machao: ["male", "shu", 4, ["mashu", "tieji", "psweihou"]], - ps2066_zhugeliang: ["male", "shu", 3, ["pszhiji", "psjiefeng", "kongcheng"]], - ps_zhugeliang: ["male", "shu", 3, ["psguanxing", "pslongyin"]], - ps_simayi: ["male", "wei", 3, ["reguicai", "pshuxiao"]], - ps2068_simayi: ["male", "wei", 3, ["refankui", "reguicai", "pszhonghu"]], + ps2066_zhugeliang: ["male", "shu", 3, ["pszhiji", "psjiefeng", "kongcheng"], ["name:诸葛|亮"]], + ps_zhugeliang: ["male", "shu", 3, ["psguanxing", "pslongyin"], ["name:诸葛|亮"]], + ps_simayi: ["male", "wei", 3, ["reguicai", "pshuxiao"], ["name:司马|懿"]], + ps2068_simayi: ["male", "wei", 3, ["refankui", "reguicai", "pszhonghu"], ["name:司马|懿"]], ps_caopi: ["male", "wei", 3, ["psjianwei", "fangzhu", "songwei"], ["zhu"]], - ps_jin_simayi: ["male", "jin", 3, ["smyyingshi", "psquanyi"]], + ps_jin_simayi: ["male", "jin", 3, ["smyyingshi", "psquanyi"], ["name:司马|懿"]], ps_caozhi: ["male", "wei", 3, ["psliushang", "psqibu"]], ps1062_zhouyu: ["male", "wu", 3, ["yingzi", "psoldshiyin"]], ps2080_zhouyu: ["male", "wu", 3, ["psshiyin", "psquwu", "psliaozou"]], @@ -57,15 +58,15 @@ const characters = { sp_liubei: ["male", "shu", 4, ["zhaolie", "shichou"], ["zhu"]], sp_zhangfei: ["male", "shu", 4, ["jie", "dahe"]], sp_lvmeng: ["male", "wu", 3, ["tanhu", "mouduan"]], - sp_xiahoudun: ["male", "wei", 4, ["fenyong", "xuehen"]], + sp_xiahoudun: ["male", "wei", 4, ["fenyong", "xuehen"], ["name:夏侯|惇"]], sp_ganning: ["male", "qun", 4, ["yinling", "junwei"]], - sp_daqiao: ["female", "wu", 3, ["yanxiao", "anxian"]], + sp_daqiao: ["female", "wu", 3, ["yanxiao", "anxian"], ["name:桥|null"]], sp_pangtong: ["male", "qun", 3, ["xinmanjuan", "zuixiang"]], - huangjinleishi: ["female", "qun", 3, ["fulu", "fuji"]], + huangjinleishi: ["female", "qun", 3, ["fulu", "fuji"], ["name:null|null-null|null"]], jsp_zhaoyun: ["male", "qun", 3, ["chixin", "reyicong", "suiren"]], - sp_xiahoushi: ["female", "shu", 3, ["xinfu_yanyu", "xinfu_xiaode"]], - sp_gongsunzan: ["male", "qun", 4, ["spyicong", "sptuji"]], - sp_simazhao: ["male", "wei", 3, ["spzhaoxin", "splanggu"]], + sp_xiahoushi: ["female", "shu", 3, ["xinfu_yanyu", "xinfu_xiaode"], ["name:夏侯|null"]], + sp_gongsunzan: ["male", "qun", 4, ["spyicong", "sptuji"], ["name:公孙|瓒"]], + sp_simazhao: ["male", "wei", 3, ["spzhaoxin", "splanggu"], ["name:司马|昭"]], sp_wangyuanji: ["female", "wei", 3, ["spfuluan", "spshude"]], sp_xinxianying: ["female", "wei", 3, ["spmingjian", "spyinzhi"]], sp_liuxie: ["male", "qun", 3, ["sphuangen", "sphantong"]], diff --git a/character/offline/skill.js b/character/offline/skill.js index 3c9e7d5bc9..3e7cd35494 100644 --- a/character/offline/skill.js +++ b/character/offline/skill.js @@ -3,6 +3,166 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { //线下E系列 + //钟会 先放着 + psmouchuan: { + audio: 2, + trigger: { + global: "roundStart", + }, + async content(event, trigger, player) { + await player.draw(2); + if (!player.countCards("he") || !game.hasPlayer(current => current != player)) return; + const [cards, targets] = await player + .chooseCardTarget({ + forced: true, + prompt: get.prompt("psmouchuan"), + prompt2: "将一张牌交给一名其他角色", + filterTarget: lib.filter.notMe, + filterCard: true, + position: "he", + ai1(card) { + return 6 - get.value(card); + }, + ai2(target) { + const player = get.player(); + return get.attitude(player, target); + }, + }) + .forResult("cards", "targets"); + if (!cards || !cards.length || !targets || !targets.length) return; + const [target] = targets; + await player.give(cards, target); + if ([player, target].some(i => !i.countCards("h"))) return; + let card1, card2; + if (player.countCards("h")) { + const cardp = await player.chooseCard("请展示一张手牌", true, "h").forResultCards(); + await player.showCards(cardp); + card1 = cardp[0]; + } + if (target.countCards("h")) { + const cardt = await target.chooseCard("请展示一张手牌", true, "h").forResultCards(); + await target.showCards(cardt); + card2 = cardt[0]; + } + if (card1 && card2) { + const skill = get.color(card1, player) == get.color(card2, target) ? "psdaohe" : "pszhiyi"; + await player.addTempSkills(skill, "roundStart"); + } + }, + derivation: ["psdaohe", "pszhiyi"], + }, + pszizhong: { + audio: 2, + mod: { + maxHandcard(player, num) { + return num + get.info("jsrgjuxia").countSkill(player); + }, + }, + trigger: { + player: "useCard", + }, + filter(event, player) { + const num = get.info("jsrgjuxia").countSkill(player) - 2; + if (!num || get.type(event.card) == "equip") return false; + return player.getRoundHistory("useCard", evt => get.name(evt.card) == get.name(event.card)).indexOf(event) == 0; + }, + forced: true, + async content(event, trigger, player) { + const num = get.info("jsrgjuxia").countSkill(player) - 2; + await player.draw(num); + }, + }, + psjizun: { + audio: 2, + trigger: { + player: "dyingAfter", + }, + filter(event, player) { + return player.isDamaged() || !player.hasSkill("psqingsuan"); + }, + forced: true, + unique: true, + juexingji: true, + skillAnimation: true, + animationColor: "orange", + async content(event, trigger, player) { + player.awakenSkill("psjizun"); + if (!player.hasSkill("psqingsuan")) await player.addSkills("psqingsuan"); + else await player.recoverTo(player.maxHp); + }, + }, + psqingsuan: { + locked: true, + zhuSkill: true, + getEnemies(player) { + const enemies = []; + player.checkAllHistory("damage", evt => { + if (evt.source && player.group != evt.source.group) enemies.add(evt.source); + }); + return enemies; + }, + mod: { + targetInRange(card, player, target) { + if (get.info("psqingsuan").getEnemies(player).includes(target)) return true; + }, + cardUsableTarget(card, player, target) { + if (get.info("psqingsuan").getEnemies(player).includes(target)) return true; + }, + }, + }, + psdaohe: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.hasPlayer(current => current != player && current.countCards("h")); + }, + filterTarget(card, player, target) { + return target != player && target.countCards("h"); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + await target.chooseToGive(player, "h", [1, Infinity], true).set("ai", card => { + const player = get.player(), + target = get.event("target"), + att = get.attitude(player, target); + if (att <= 0) { + if (ui.selected.cards.length) return 0; + return 6 - get.value(card); + } + return target.getUseValue(card); + }); + await target.recover(); + }, + ai: { + order: 6, + result: { + player(player, target) { + if (target.isHealthy()) return get.effect(target, { name: "shunshou_copy2" }, player, player); + return get.recoverEffect(target, player, player); + }, + }, + }, + }, + pszhiyi: { + audio: 2, + enable: "phaseUse", + usable: 1, + filterTarget: true, + async content(event, trigger, player) { + const target = event.targets[0]; + await target.draw(); + await target.damage(); + }, + ai: { + order: 1, + result: { + player(player, target) { + return get.effect(target, { name: "draw" }, player, player) + get.damageEffect(target, player, player); + }, + }, + }, + }, //鄂焕 psdiwan: { trigger: { player: "useCardToPlayered" }, @@ -25,7 +185,7 @@ const skills = { }) > 1 ); }, - groupSkill: true, + groupSkill: "qun", async cost(event, trigger, player) { event.result = await player .chooseTarget( @@ -92,7 +252,7 @@ const skills = { return event.source.getSeatNum() == 1 && (player.hasSha() || (_status.connectMode && player.countCards("hs"))); }, direct: true, - groupSkill: true, + groupSkill: "shu", content() { player .chooseToUse(function (card, player, event) { @@ -355,7 +515,7 @@ const skills = { charlotte: true, mod: { cardEnabled2(card, player) { - if (player.getStorage("jsrgguanjue_ban").includes(get.suit(card))) return false; + if (player.getStorage("dragchaojue_buff").includes(get.suit(card))) return false; }, }, marktext: "绝", @@ -836,7 +996,6 @@ const skills = { audio: 1, trigger: { global: "useCard" }, direct: true, - shaRelated: true, filter: function (event, player) { return event.player != player && event.card.name == "sha" && player.countCards("he") > 0 && event.player.isPhaseUsing(); }, @@ -2551,6 +2710,9 @@ const skills = { }, }, }, + ai: { + combo: "psliaozou" + }, }, psquwu: { audio: 2, @@ -4510,12 +4672,12 @@ const skills = { enable: "phaseUse", usable: 1, filter: function (event, player) { - var zhu = get.mode() == "identity" ? get.zhu(player) : game.filterPlayer(i => i.getSeatNum() == 1)[0]; + var zhu = get.zhu(player) || game.filterPlayer(i => i.getSeatNum() == 1)[0]; if (!zhu) return false; return zhu.countGainableCards(player, zhu == player ? "ej" : "hej"); }, filterTarget: function (card, player, target) { - var zhu = get.mode() == "identity" ? get.zhu(player) : game.filterPlayer(i => i.getSeatNum() == 1)[0]; + var zhu = get.zhu(player) || game.filterPlayer(i => i.getSeatNum() == 1)[0]; return target == zhu; }, selectTarget: 1, diff --git a/character/offline/sort.js b/character/offline/sort.js index 896c3fa619..91faa843d2 100644 --- a/character/offline/sort.js +++ b/character/offline/sort.js @@ -5,7 +5,7 @@ const characterSort = { offline_luanwu: ["ns_lijue", "ns_zhangji", "ns_fanchou"], offline_yongjian: ["ns_chendao", "yj_caoang", "yj_caocao", "yj_liru", "yj_caohong", "yj_zhangfei", "yongjian_ganning", "yj_dongzhuo", "yj_xuyou", "yj_jiaxu", "yj_zhenji"], offline_piracyE_zy: ["shen_jiaxu", "pe_wangyun", "pe_zhonghui", "pe_sunchen", "pe_mengda", "pe_wenqin", "ns_caoanmin", "jiangqing", "kongrong", "jiling", "tianfeng", "mateng"], - offline_piracyE: ["yj_zhouji", "yj_ehuan"], + offline_piracyE: ["yj_zhouji", "yj_ehuan", "yj_zhonghui"], offline_piracyS: ["ns_jiaxu", "longyufei", "ps_guanyu", "ps1059_guojia", "ps2070_guojia", "ps2063_zhaoyun", "ps2067_zhaoyun", "ps1062_zhouyu", "ps2080_zhouyu", "ps_caozhi", "ps_jin_simayi", "ps_caopi", "ps_simayi", "ps2068_simayi", "ps_machao", "ps_zhugeliang", "ps2066_zhugeliang", "ps_jiaxu", "ps_lvbu", "ps_shen_machao", "jsp_liubei"], offline_piracyK: ["pk_sp_duyu"], offline_vtuber: ["vtb_xiaosha", "vtb_xiaoshan", "vtb_xiaotao", "vtb_xiaole", "vtb_xiaojiu"], diff --git a/character/offline/translate.js b/character/offline/translate.js index 44baa23049..70291de424 100644 --- a/character/offline/translate.js +++ b/character/offline/translate.js @@ -431,6 +431,19 @@ const translates = { pssuiluan_info: "群势力技。你使用【杀】可以额外指定两个目标,若如此做,此牌结算完毕后,所有目标角色可依次对你使用一张【杀】,你以此法受到伤害后,将势力变更至蜀。", psconghan: "从汉", psconghan_info: "蜀势力技。一号位造成伤害后,你可以对受伤角色使用一张【杀】。", + yj_zhonghui: "钟会", + psmouchuan: "谋川", + psmouchuan_info: "每轮开始时,你可以摸两张牌并交给一名其他角色一张牌,然后你与其依次展示一张手牌,若这两张牌颜色相同/不同,你获得〖道合〗/〖志异〗直到本轮结束。", + pszizhong: "自重", + pszizhong_info: "锁定技,当你使用或打出一张你本轮未使用过的非装备牌时,你摸X-2张牌;你的手牌上限+X(X为你的技能数)。", + psjizun: "极尊", + psjizun_info: "觉醒技。当你脱离濒死状态时,若你没有〖清算〗,你获得之;否则你将体力回复至上限。", + psqingsuan: "清算", + psqingsuan_info: "主公技,锁定技。你对本局游戏对你造成过伤害且势力与你不同的角色使用牌无距离和次数限制。", + psdaohe: "道合", + psdaohe_info: "出牌阶段限一次,你可以令一名其他角色交给你至少一张手牌,然后你令其回复1点体力。", + pszhiyi: "志异", + pszhiyi_info: "出牌阶段限一次,你可以令一名角色摸一张牌并对其造成1点伤害。", }; export default translates; diff --git a/character/old/character.js b/character/old/character.js index 9a4642e1e2..149ddfda48 100644 --- a/character/old/character.js +++ b/character/old/character.js @@ -6,7 +6,7 @@ const characters = { old_caocao: ["male", "shen", 3, ["junkguixin", "feiying"], ["die:caocao"]], old_chendao: ["male", "shu", 4, ["drlt_wanglie"]], old_liyan: ["male", "shu", 3, ["duliang", "fulin"]], - old_guanzhang: ["male", "shu", 4, ["old_fuhun"]], + old_guanzhang: ["male", "shu", 4, ["old_fuhun"], ["name:关|兴-张|苞"]], new_caoren: ["male", "wei", 4, ["moon_jushou", "jiewei"], ["die:caoren"]], huangzhong: ["male", "shu", 4, ["liegong"]], junk_sunquan: ["male", "shen", 4, ["dili", "yuheng"], ["wei", "die:shen_sunquan"]], @@ -21,15 +21,15 @@ const characters = { old_yangyan: ["female", "jin", 3, ["xuanbei", "xianwan"]], madai: ["male", "shu", 4, ["mashu", "oldqianxi"]], xuhuang: ["male", "wei", 4, ["gzduanliang"]], - junk_simayi: ["male", "jin", 3, ["buchen", "smyyingshi", "xiongzhi", "quanbian"], ["hiddenSkill"]], + junk_simayi: ["male", "jin", 3, ["buchen", "smyyingshi", "xiongzhi", "quanbian"], ["hiddenSkill", "name:司马|懿"]], fazheng: ["male", "shu", 3, ["enyuan", "xuanhuo"]], ol_yuanshu: ["male", "qun", 4, ["wangzun", "tongji"]], pangde: ["male", "qun", 4, ["mashu", "mengjin"]], ol_huaxiong: ["male", "qun", 6, ["new_reyaowu"]], old_wangyun: ["male", "qun", 4, ["wylianji", "moucheng"], ["clan:太原王氏"]], - old_xiaoqiao: ["female", "wu", 3, ["tianxiang", "hongyan"]], + old_xiaoqiao: ["female", "wu", 3, ["tianxiang", "hongyan"], ["name:桥|null"]], weiyan: ["male", "shu", 4, ["kuanggu"]], - xiahouyuan: ["male", "wei", 4, ["shensu"]], + xiahouyuan: ["male", "wei", 4, ["shensu"], ["name:夏侯|渊"]], old_zhangxingcai: ["female", "shu", 3, ["oldshenxian", "qiangwu"]], old_fuhuanghou: ["female", "qun", 3, ["oldzhuikong", "oldqiuyuan"]], old_caochong: ["male", "wei", 3, ["oldrenxin", "oldchengxiang"]], @@ -57,10 +57,10 @@ const characters = { old_zhuhuan: ["male", "wu", 4, ["youdi"]], old_zhuzhi: ["male", "wu", 4, ["anguo"]], - old_zhugezhan: ["male", "shu", 3, ["old_zuilun", "old_fuyin"]], + old_zhugezhan: ["male", "shu", 3, ["old_zuilun", "old_fuyin"], ["name:诸葛|瞻"]], ol_zhangrang: ["male", "qun", 3, ["xintaoluan"], ["sex:male_castrated"]], //ol_manchong:['male','wei',3,['yuce','junxing']], - old_guanqiujian: ["male", "wei", 4, ["drlt_zhenrong", "drlt_hongju"], []], + old_guanqiujian: ["male", "wei", 4, ["drlt_zhenrong", "drlt_hongju"], ["name:毌丘|俭"]], old_wanglang: ["male", "wei", 3, ["gushe", "jici"]], old_wangyi: ["female", "wei", 3, ["oldzhenlie", "oldmiji"]], re_yujin: ["male", "wei", 4, ["yizhong"], ["die:yujin.mp3"]], diff --git a/character/old/voices.js b/character/old/voices.js index 31065734f3..028991191b 100644 --- a/character/old/voices.js +++ b/character/old/voices.js @@ -1,4 +1,11 @@ export default { + "#xiemu1": "暴戾之气,伤人害己。", + "#xiemu2": "休要再起战事!", + "#naman1": "慢着,让我来!", + "#naman2": "弃暗投明,光耀门楣。", + "#youdi1": "无名小卒,可敢再前进一步!", + "#youdi2": "予以小利,必有大获。", + "#old_zhuhuan:die": "这巍巍巨城,吾竟无力撼动……", "#xinzhan1": "吾通晓兵法,世人皆知。", "#xinzhan2": "用兵之道,攻心为上。", "#huilei1": "丞相视某如子,某以丞相为父。", diff --git a/character/onlyOL/character.js b/character/onlyOL/character.js index 898389603d..fd304778ea 100644 --- a/character/onlyOL/character.js +++ b/character/onlyOL/character.js @@ -4,16 +4,18 @@ const characters = { ol_jianyong: ["male", "shu", 3, ["olqiaoshui", "jyzongshi"], ["tempname:re_jianyong", "die:re_jianyong"]], ol_lingtong: ["male", "wu", 4, ["olxuanfeng"], ["die:re_lingtong"]], ol_sb_guanyu: ["male", "shu", 4, ["olsbweilin", "olsbduoshou"]], - ol_sb_taishici: ["male", "wu", 4, ["olsbdulie", "olsbdouchan"]], + ol_sb_taishici: ["male", "wu", 4, ["olsbdulie", "olsbdouchan"], ["name:太史|慈"]], ol_gaoshun: ["male", "qun", 4, ["olxianzhen", "decadejinjiu"], ["die:re_gaoshun"]], ol_sb_yuanshao: ["male", "qun", 4, ["olsbhetao", "olsbshenli", "olsbyufeng", "olsbshishou"], ["zhu"]], ol_yufan: ["male", "wu", 3, ["olzongxuan", "olzhiyan"], ["tempname:re_yufan", "die:re_yufan"]], ol_chengpu: ["male", "wu", 4, ["dclihuo", "olchunlao"], ["tempname:xin_chengpu", "die:xin_chengpu"]], ol_wangyi: ["female", "wei", 3, ["olzhenlie", "olmiji"]], - ol_sb_pangtong: ["male", "shu", 3, ["olsbhongtu", "olsbqiwu"]], + ol_sb_pangtong: ["male", "shu", 3, ["olsbhongtu", "olsbqiwu"], ["die:true", "die:3"]], ol_fazheng: ["male", "shu", 3, ["olxuanhuo", "olenyuan"]], - ol_caifuren: ["female", "qun", 3, ["olqieting", "xianzhou"]], + ol_caifuren: ["female", "qun", 3, ["olqieting", "xianzhou"], ["name:蔡|null"]], ol_liru: ["male", "qun", 3, ["xinjuece", "olmieji", "dcfencheng"]], + ol_liubiao: ["male", "qun", 3, ["olzishou", "olzongshi"]], + ol_wuguotai: ["female", "wu", 3, ["olganlu", "olbuyi"], ["name:丁|null"]], }; export default characters; diff --git a/character/onlyOL/skill.js b/character/onlyOL/skill.js index 4b72ed480e..3ac972902c 100644 --- a/character/onlyOL/skill.js +++ b/character/onlyOL/skill.js @@ -2,6 +2,137 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //OL界吴国太 + olganlu: { + inherit: "xinganlu", + async content(event, trigger, player) { + const num = Math.abs(event.targets[0].countCards("e") - event.targets[1].countCards("e")); + await event.targets[0].swapEquip(event.targets[1]); + await game.asyncDelayx(); + if (player.getDamagedHp() < num && player.countCards("e")) await player.chooseToDiscard("he", num, true); + }, + }, + olbuyi: { + audio: 2, + trigger: { + global: "dying", + }, + filter(event, player) { + return event.player.hp <= 0 && event.player.countCards("hej") > 0; + }, + logTarget: "player", + async cost(event, trigger, player) { + const target = trigger.player; + let check; + if (trigger.player.isUnderControl(true, player)) { + check = player.hasCard(card => { + return get.type(card) != "basic"; + }, "hej"); + } else { + check = get.attitude(player, target) > 0; + } + event.result = await player + .choosePlayerCard(target, get.prompt(event.name.slice(0, -5), target), "hej") + .set("ai", button => { + if (!get.event().check) return 0; + if (get.event().target.isUnderControl(true, get.player())) { + if (get.type(button.link) != "basic") { + return 10 - get.value(button.link); + } + return 0; + } else { + return Math.random(); + } + }) + .set("check", check) + .set("filterButton", button => { + if (get.player() == get.event().target) { + return lib.filter.cardDiscardable(button.link, get.player()); + } + return true; + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = trigger.player; + await player.showCards(event.cards, get.translation(player) + "对" + (player == target ? "自己" : get.translation(target)) + "发动了【补益】"); + if (get.type(event.cards[0]) != "basic") { + await target.recover(); + await target.discard(event.cards[0]); + } + }, + }, + //OL界刘表(袁术 + olzishou: { + audio: 2, + trigger: { + player: "phaseDrawBegin2", + }, + filter(event, player) { + return !event.numFixed; + }, + check(event, player) { + return ( + player.countCards("h") <= (player.hasSkill("olzongshi") ? player.maxHp : player.hp - 2) || + player.skipList.includes("phaseUse") || + !player.countCards("h", function (card) { + return get.tag(card, "damage") && player.hasUseTarget(card); + }) + ); + }, + async content(event, trigger, player) { + trigger.num += game.countGroup(); + player + .when("phaseJieshuBegin") + .filter(evt => evt.getParent() == trigger.getParent() && player.hasHistory("sourceDamage", evtx => evtx.player != player) && player.countCards("he")) + .then(() => { + player.chooseToDiscard("he", game.countGroup(), true); + }); + }, + ai: { + threaten: 1.5, + }, + }, + olzongshi: { + mod: { + maxHandcard(player, num) { + return num + game.countGroup(); + }, + }, + audio: 2, + trigger: { + player: "damageBegin4", + }, + filter(event, player) { + const source = event.source; + if (!source || source == player || !source.isIn()) return false; + return !player.getStorage("olzongshi_record").includes(source.group); + }, + forced: true, + logTarget: "source", + async content(event, trigger, player) { + const target = trigger.source; + await trigger.cancel(); + await target.draw(); + player.addSkill("olzongshi_record"); + player.markAuto("olzongshi_record", [target.group]); + }, + ai: { + filterDamage: true, + skillTagFilter(player, tag, arg) { + if (arg && arg.player && player.getStorage("olzongshi_record").includes(arg.player.group)) return true; + return false; + }, + }, + subSkill: { + record: { + charlotte: true, + intro: { + content: (storage, player) => `已记录势力:${get.translation(storage)}`, + }, + }, + }, + }, //OL界李儒 olmieji: { audio: 2, @@ -14,7 +145,7 @@ const skills = { }, async content(event, trigger, player) { const target = event.target; - await player.showCards(event.cards, get.translation(player) + "发动了【灭计】"); + player.$throw(event.cards.length, 1000); const result = await target.chooseToDiscard("he", true).set("prompt", "请弃置一张锦囊牌,或依次弃置两张非锦囊牌。").forResult(); if ( (!result.cards || get.type(result.cards[0], "trick", result.cards[0].original == "h" ? target : false) != "trick") && @@ -141,7 +272,7 @@ const skills = { }, //谋庞统 olsbhongtu: { - audio: 2, + audio: 6, trigger: { global: ["phaseZhunbeiEnd", "phaseJudgeEnd", "phaseDrawEnd", "phaseUseEnd", "phaseDiscardEnd", "phaseJieshuEnd"], }, @@ -170,7 +301,7 @@ const skills = { player.countCards("h", card => { return !current.hasUseTarget(card); }) >= - 2 + (player.getHp() > 1) + 2 + (player.getHp() > 1) ); }) ) @@ -293,38 +424,35 @@ const skills = { }) ) { target.addSkill("olsbhongtu_limit"); - target.addMark("olsbhongtu_limit", 2, false); + if (!target.storage.olsbhongtu_limit) target.storage.olsbhongtu_limit = [0, 0]; + target.storage.olsbhongtu_limit[0] += 2; } else { skill = "qianxi"; } - let skillName = null; if (skill) { - skillName = `olsbhongtu_${player.playerid}`; + let skillName = `olsbhongtu_${player.playerid}`; target.addAdditionalSkills(skillName, [skill]); - } - target.when({ player: "phaseBegin" }).then(() => { - player.storage.olsbhongtu_phased = true; - }); - target - .when({ player: "phaseEnd" }) - .filter(() => { - return target.storage.olsbhongtu_phased; - }) - .assign({ - firstDo: true, - priority: Infinity, - }) - .vars({ - skillName, - }) - .then(() => { - delete player.storage.olsbhongtu_phased; - if (skillName) { - player.removeAdditionalSkills(skillName); - } else { - player.removeSkill("olsbhongtu_limit"); - } + delete target.storage.olsbhongtu_phased; + target.when({ player: "phaseBegin" }).then(() => { + player.storage.olsbhongtu_phased = true; }); + target + .when({ player: "phaseEnd" }) + .filter(() => { + return target.storage.olsbhongtu_phased; + }) + .assign({ + firstDo: true, + priority: Infinity, + }) + .vars({ + skillName, + }) + .then(() => { + delete player.storage.olsbhongtu_phased; + player.removeAdditionalSkills(skillName); + }); + } } }, subSkill: { @@ -338,14 +466,23 @@ const skills = { charlotte: true, mod: { maxHandcard(player, num) { - return num + player.countMark("olsbhongtu_limit"); + return num + player.storage.olsbhongtu_limit[0]; }, }, + trigger: { + player: "phaseEnd" + }, + silent: true, + lastDo: true, + content() { + player.storage.olsbhongtu_limit = [player.storage.olsbhongtu_limit[1], 0]; + if (!player.storage.olsbhongtu_limit[0]) player.removeSkill("olsbhongtu_limit"); + } }, }, }, olsbqiwu: { - audio: 2, + audio: 6, trigger: { player: "damageBegin4", }, @@ -540,19 +677,26 @@ const skills = { effect: { charlotte: true, onremove: true, - intro: { content: "本回合的结束阶段可以发动#次〖秘计〗" }, + intro: { content: "本回合的结束阶段额外发动#次〖秘计〗" }, + trigger: { global: "phaseJieshuBegin" }, + filter(event, player) { + if (player.isHealthy()) return false; + return player.hasMark("olzhenlie_effect"); + }, + getIndex(event, player) { + return player.countMark("olzhenlie_effect"); + }, + forced: true, + inherit: "olmiji" }, }, }, olmiji: { audio: 2, - trigger: { global: "phaseJieshuBegin" }, + trigger: { player: "phaseJieshuBegin" }, filter(event, player) { if (player.isHealthy()) return false; - return event.player == player || player.hasMark("olzhenlie_effect"); - }, - getIndex(event, player) { - return player.countMark("olzhenlie_effect") + (event.player == player); + return true; }, async content(event, trigger, player) { let num = player.getDamagedHp(); @@ -931,7 +1075,7 @@ const skills = { if (bool) { const target = targets[0]; player.logSkill("olsbhetao", target); - player.changeSkin("olsbhetao", "ol_sb_yuanshao"); + player.changeSkin({ characterName: "ol_sb_yuanshao" }, "ol_sb_yuanshao"); player.discard(cards); trigger.getParent().effectCount++; trigger.getParent().excluded.addArray(game.filterPlayer(i => trigger.targets.includes(i) && target != i)); @@ -1020,7 +1164,7 @@ const skills = { return num2 + (sum > player.countCards("h") ? Math.min(5, sum) : 0) + (sum > player.getHp() ? num2 : 0) >= num1; }, async content(event, trigger, player) { - player.changeSkin("olsbshenli", "ol_sb_yuanshao_shadow"); + player.changeSkin({ characterName: "ol_sb_yuanshao" }, "ol_sb_yuanshao_shadow"); player.addTempSkill("olsbshenli_used", "phaseUseAfter"); trigger.getParent().targets.addArray( game.filterPlayer(target => { @@ -1229,7 +1373,7 @@ const skills = { async cost(event, trigger, player) { const targets = game.filterPlayer(target => { if (!player.getStorage("olxianzhen_effect").includes(target)) return false; - return trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); + return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); }); if (targets.length == 1) { const target = targets[0]; @@ -1240,7 +1384,7 @@ const skills = { .chooseTarget(get.prompt("olxianzhen_effect"), "令任意名【陷阵】拼点成功的目标角色也成为" + get.translation(trigger.card) + "的目标", (card, player, target) => { const trigger = get.event().getTrigger(); if (!player.getStorage("olxianzhen_effect").includes(target)) return false; - return trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); + return !trigger.targets.includes(target) && lib.filter.targetEnabled2(trigger.card, player, target); }) .set("ai", target => { const player = get.event("player"), @@ -1260,10 +1404,13 @@ const skills = { if (!arg || !arg.target || !player.getStorage("olxianzhen_effect").includes(arg.target)) return false; }, effect: { - player(card, player, target, current, isLink) { - if (isLink || !target) return; + player_use(card, player, target, current, isLink) { + if (isLink || !target || player._olxianzhen_effect_temp) return; if (!player.getStorage("olxianzhen_effect").includes(target) && ["sha", "guohe", "shunshou", "huogong", "juedou"].includes(card.name)) { - if (get.effect(target, card, player, player) > 0) { + player._olxianzhen_effect_temp = true; + let eff = get.effect(target, card, player, player); + delete player._olxianzhen_effect_temp; + if (eff > 0) { return [1, 2]; } } diff --git a/character/onlyOL/sort.js b/character/onlyOL/sort.js index 546b3f827a..731d42646f 100644 --- a/character/onlyOL/sort.js +++ b/character/onlyOL/sort.js @@ -1,6 +1,6 @@ const characterSort = { - onlyOL_yijiang1: ["ol_jianyong", "ol_lingtong", "ol_gaoshun", "ol_fazheng"], - onlyOL_yijiang2: ["ol_caozhang", "ol_chengpu", "ol_wangyi"], + onlyOL_yijiang1: ["ol_jianyong", "ol_lingtong", "ol_gaoshun", "ol_fazheng", "ol_wuguotai"], + onlyOL_yijiang2: ["ol_caozhang", "ol_chengpu", "ol_wangyi", "ol_liubiao"], onlyOL_yijiang3: ["ol_yufan", "ol_liru"], onlyOL_yijiang4: ["ol_caifuren"], onlyOL_sb: ["ol_sb_jiangwei", "ol_sb_guanyu", "ol_sb_taishici", "ol_sb_yuanshao", "ol_sb_pangtong"], diff --git a/character/onlyOL/translate.js b/character/onlyOL/translate.js index 13fbd17f07..bee307c804 100644 --- a/character/onlyOL/translate.js +++ b/character/onlyOL/translate.js @@ -70,6 +70,7 @@ const translates = { ol_wangyi_prefix: "OL界", olzhenlie: "贞烈", olzhenlie_info: "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后你选择一项:①获得使用者的一张牌;②于本回合的结束阶段发动一次〖秘计〗。", + olzhenlie_effect: "秘计", olmiji: "秘计", olmiji_info: "结束阶段,若你已受伤,则你可以摸X张牌,然后你可以将至多X张牌任意分配给其他角色(X为你已损失的体力值)。", ol_sb_pangtong: "OL谋庞统", @@ -94,6 +95,18 @@ const translates = { ol_liru_prefix: "OL界", olmieji: "灭计", olmieji_info: "出牌阶段限一次,你可以将一张锦囊牌置于牌堆顶,然后令一名其他角色弃置一张锦囊牌或两张非锦囊牌,然后你可以使用其弃置的一张牌。", + ol_liubiao: "OL界刘表", + ol_liubiao_prefix: "OL界", + olzishou: "自守", + olzishou_info: "摸牌阶段,你可以多摸X张牌,你以此法摸牌的结束阶段,若你本回合对其他角色造成过伤害,你弃置X张牌(X为全场势力数)。", + olzongshi: "宗室", + olzongshi_info: "锁定技。①你的手牌上限+X(X为全场势力数)。②每种势力限一次,当其他角色对你造成伤害时,你防止此伤害并令其摸一张牌。", + ol_wuguotai: "OL界吴国太", + ol_wuguotai_prefix: "OL界", + olganlu: "甘露", + olganlu_info: "出牌阶段限一次,你可以交换两名角色装备区内的牌,然后若你的已损失体力值小于X,你弃置X张牌(X为交换前两者装备区牌数之差)。", + olbuyi: "补益", + olbuyi_info: "一名角色进入濒死状态时,你可展示其区域内一张牌。若此牌不为基本牌,则其弃置此牌并回复1点体力。", }; export default translates; diff --git a/character/onlyOL/voices.js b/character/onlyOL/voices.js index dca1b6852d..dc732847a6 100644 --- a/character/onlyOL/voices.js +++ b/character/onlyOL/voices.js @@ -1,4 +1,29 @@ export default { + "#olxuanhuo1": "眩惑之术,非为迷惑,乃为明辨贤愚。", + "#olxuanhuo2": "以眩惑试人心,以真情待贤才,方能得天下。", + "#olenyuan1": "恩重如山,必报之以雷霆之势!", + "#olenyuan2": "怨深似海,必还之以烈火之怒!", + "#ol_fazheng:die": "孝直不忠,不能佑主公复汉室了……", + "#olqieting1": "好你个刘玄德,敢坏我儿大事。", + "#olqieting2": "两个大男人窃窃私语,定没有好事。", + "#xianzhou_ol_caifuren1": "今献州以降,请丞相善待我孤儿寡母。", + "#xianzhou_ol_caifuren2": "我儿志短才疏,只求方寸之地安享富贵。", + "#ol_caifuren:die": "这哪里是青州,分明是黄泉……", + "#olsbhongtu1": "当下春风正好,君可扶摇而上。", + "#olsbhongtu2": "得卧龙凤雏相助,主公大业可成。", + "#olsbhongtu3": "我有一计,管教刘璋拱手来降。", + "#olsbhongtu4": "我有一计,可定千里蜀川。", + "#olsbhongtu5": "我有一计,可使主公大展鸿图。", + "#olsbhongtu6": "我有一计,请诸位倾耳静听。", + "#olsbqiwu1": "哎~没打着~", + "#olsbqiwu2": "除了飞来的暗箭,无物可伤我。", + "#olsbqiwu3": "凤栖梧桐,不为虫蚁所伤。", + "#olsbqiwu4": "既有冲天之心,何惧风霜之寒。", + "#olsbqiwu5": "食腐鼠之狸,安敢觊觎枝上之凤?", + "#olsbqiwu6": "坐高处观月,远虫鸣之扰。", + "#ol_sb_pangtong:die": "未与孔明把酒锦官城,恨也,恨也……", + "#ol_sb_pangtong2:die": "卧龙凤雏,只可得其一……", + "#ol_sb_pangtong3:die": "主公大业未成,统如何瞑目……", "#olsbzhuri1": "效逐日之夸父,怀忠志而长存。", "#olsbzhuri2": "知天命而不顺,履穷途而强为。", "#olsbranji1": "此身为薪,炬成灰亦昭大汉长明!", diff --git a/character/ow.js b/character/ow.js index f05bbe302c..ef0242ce93 100644 --- a/character/ow.js +++ b/character/ow.js @@ -3669,13 +3669,13 @@ game.import("character", function () { woliu: "涡流", woliu2: "涡流", woliu_info: - "结束阶段,你可以选择至多两名角色,当你或目标中的任意一名角色成为杀的目标时,其余角色也将被追加为目标,直到你死亡或下一回合开始。", + "结束阶段,你可以选择至多两名角色,当你或目标中的任意一名角色成为【杀】的目标时,其余角色也将被追加为目标,直到你死亡或下一回合开始。", qianggu: "强固", qianggu_info: - "出牌阶段限一次,你可以弃置两张牌并获得2点护甲,若如此做,直到你的下个回合开始,其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效。", + "出牌阶段限一次,你可以弃置两张牌并获得2点护甲,若如此做,直到你的下个回合开始,其他角色对你使用【杀】时需要弃置一张基本牌,否则此【杀】对你无效。", qianggu2: "强固", qianggu2_bg: "固", - qianggu2_info: "其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效。", + qianggu2_info: "其他角色对你使用【杀】时需要弃置一张基本牌,否则此【杀】对你无效。", pingzhang: "屏障", pingzhang_info: "每轮各限一次,当你受到伤害时,你可以弃置一张红桃牌令伤害-1;当一名其他角色受到伤害时,你可以弃置一张黑桃牌令伤害-1。", @@ -3691,10 +3691,10 @@ game.import("character", function () { "出牌阶段开始时,你可以弃置一张牌并指定一名角色,你与该角色的距离视为1直到回合结束,然后该角色随机弃置一张牌。", bshaowei: "哨卫", bshaowei_info: - "结束阶段,你可以切换至哨卫模式。当处于此模式时,你的杀无视距离和防具、无数量限制且不可闪避;你不能闪避杀。", + "结束阶段,你可以切换至哨卫模式。当处于此模式时,你的【杀】无视距离和防具、无数量限制且不可闪避;你不能闪避【杀】。", zhencha: "侦查", zhencha_info: - "结束阶段,你可以切换至侦查模式。当处于此模式时,每当你使用一张杀,你摸一张牌或回复1点体力。", + "结束阶段,你可以切换至侦查模式。当处于此模式时,每当你使用一张【杀】,你摸一张牌或回复1点体力。", liangou: "链钩", liangou_info: "出牌阶段限一次,你可以弃置一张牌,指定一名其他角色并进行一次判定,若结果不为红桃,该角色与你距离为1且受到的首次伤害+1直到回合结束。", @@ -3702,7 +3702,7 @@ game.import("character", function () { xiyang_info: "结束阶段,若你武将牌正面朝上,你可以翻面并回复2点体力。", qinru: "侵入", qinru_info: - "每当你使用杀指定目标时,你可以令其进行一次判定,若结果不为红桃,该角色的非锁定技失效直到其下一回合结束。", + "每当你使用【杀】指定目标时,你可以令其进行一次判定,若结果不为红桃,该角色的非锁定技失效直到其下一回合结束。", yinshen: "隐身", yinshen_info: "锁定技,每当你失去最后一张基本牌,你获得潜行直到下一回合开始。", yinshen_info_old: "结束阶段,你可以弃置一张装备牌并获得潜行直到下一回合开始。", @@ -3715,7 +3715,7 @@ game.import("character", function () { lichang_info: "结束阶段,你可以弃置一张红色牌,若如此做,你可以在下个准备阶段令一名距离1以内的角色回复1点体力或摸两张牌。", mengji: "猛击", - mengji_info: "锁定技,若你已发动重盾,当你没有护甲时,你的杀造成的伤害+1。", + mengji_info: "锁定技,若你已发动重盾,当你没有护甲时,你的【杀】造成的伤害+1。", zhongdun: "重盾", zhongdun_info: "游戏开始时,你获得8点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色。", @@ -3724,7 +3724,7 @@ game.import("character", function () { paotai: "炮台", paotai2: "炮台", paotai_info: - "出牌阶段,你可以弃置一张杀布置或升级一个炮台(最高3级);结束阶段,炮台有一定机率对一名随机敌人造成1点火焰伤害;每当你受到1点伤害,炮台降低一级。", + "出牌阶段,你可以弃置一张【杀】布置或升级一个炮台(最高3级);结束阶段,炮台有一定机率对一名随机敌人造成1点火焰伤害;每当你受到1点伤害,炮台降低一级。", maoding: "铆钉", maoding2: "铆钉", maoding_info: @@ -3734,13 +3734,13 @@ game.import("character", function () { bfengshi: "风矢", bfengshi2: "风矢", bfengshi_info: - "锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加20%的概率强制命中;你的首张杀造成伤害后增加20%的概率令伤害+1。", + "锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张【杀】增加20%的概率强制命中;你的首张【杀】造成伤害后增加20%的概率令伤害+1。", bfengshi_info_alter: - "锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加15%的概率强制命中;你的首张杀造成伤害后增加15%的概率令伤害+1。", + "锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张【杀】增加15%的概率强制命中;你的首张【杀】造成伤害后增加15%的概率令伤害+1。", yinbo: "音波", yinbo_info: "出牌阶段限一次,你可以弃置一张黑桃牌,然后随机弃置三名敌人各一张牌。", liudan: "榴弹", - liudan_info: "每当你使用一张杀,你可以令所有不是此杀目标的其他角色有50%概率成为此杀的额外目标。", + liudan_info: "每当你使用一张【杀】,你可以令所有不是此【杀】目标的其他角色有50%概率成为此【杀】的额外目标。", shoujia: "兽夹", shoujia2: "兽夹", shoujia3: "兽夹", @@ -3753,9 +3753,9 @@ game.import("character", function () { "出牌阶段限一次,你可以弃置一张方片牌令攻击范围内的一名其他角色本回合内不能使用或打出卡牌。", tiandan: "填弹", tiandan_info: - "摸牌阶段开始时,你可以跳过出牌和弃牌阶段,然后获得若干张杀直到你的手牌数等于你的体值(最多为5)。", + "摸牌阶段开始时,你可以跳过出牌和弃牌阶段,然后获得若干张【杀】直到你的手牌数等于你的体值(最多为5)。", shenqiang: "神枪", - shenqiang_info: "锁定技,每当你在出牌阶段使用杀造成伤害,本阶段内出杀次数上限+1。", + shenqiang_info: "锁定技,每当你在出牌阶段使用【杀】造成伤害,本阶段内出杀次数上限+1。", mianzhen: "眠针", mianzhen2: "眠针", mianzhen_info: @@ -3772,7 +3772,7 @@ game.import("character", function () { juji2: "狙击", juji3: "狙击", juji_info: - "出牌阶段限一次,你可以弃置任意张花色不同的牌并指定一名有手牌的其他角色,若该角色的手牌中含有与你弃置的牌花色相同的牌,则本回合内你与其距离为1且该角色不能闪避你的杀。", + "出牌阶段限一次,你可以弃置任意张花色不同的牌并指定一名有手牌的其他角色,若该角色的手牌中含有与你弃置的牌花色相同的牌,则本回合内你与其距离为1且该角色不能闪避你的【杀】。", duwen: "毒吻", duwen2: "毒吻", duwen_info: "锁定技,当你造成伤害时,若你的手牌数与受伤害角色相等,此伤害+1。", @@ -3823,16 +3823,16 @@ game.import("character", function () { tuji_info: "锁定技,在你的回合内,每当你使用一张牌,你的进攻距离+1。", mujing: "目镜", mujing2: "目镜", - mujing_info: "你可以将一张黑色牌当作杀使用或打出;当你的杀被闪避后,此杀不计入出杀次数。", + mujing_info: "你可以将一张黑色牌当作【杀】使用或打出;当你的【杀】被闪避后,此【杀】不计入出杀次数。", mujing_old_info: "每当你对攻击范围不含你的角色使用一张牌,你可以弃置目标一张牌;若你的手牌数不多于目标,你摸一张牌。", feiren: "飞刃", feiren2: "飞刃", - feiren_info: "你的杀无视距离;你的黑桃杀造成的伤害+1,梅花杀可以额外指定一个目标。", - feiren_info_alter: "你的杀无视距离;你的梅花杀可以额外指定一个目标。", + feiren_info: "你的【杀】无视距离;你的黑桃【杀】造成的伤害+1,梅花【杀】可以额外指定一个目标。", + feiren_info_alter: "你的【杀】无视距离;你的梅花【杀】可以额外指定一个目标。", zhanlong: "斩龙", zhanlong_info: - "限定技,准备阶段,若你体力值为1,你可以弃置所有牌(至少一张),然后将三张杀置入你的手牌,若如此做,你本回合使用杀无次数限制。", + "限定技,准备阶段,若你体力值为1,你可以弃置所有牌(至少一张),然后将三张【杀】置入你的手牌,若如此做,你本回合使用【杀】无次数限制。", xie: "谐", xie2: "谐", xie_info: @@ -3848,13 +3848,13 @@ game.import("character", function () { "限定技,出牌阶段,你可以将你的武将牌翻面,然后令任意名角色回复1点体力,若如此做,你不能成为其他角色的卡牌目标直到下一回合开始。", xiandan: "霰弹", xiandan_info: - "每当你使用一张杀,你可以弃置一张红色牌令此杀不可闪避,或弃置一张黑色牌令此杀伤害+1。", + "每当你使用一张【杀】,你可以弃置一张红色牌令此【杀】不可闪避,或弃置一张黑色牌令此【杀】伤害+1。", yihun: "移魂", yihun_info: - "结束阶段,你可以弃置一张黑色牌并指定一名其他角色,你在该角色下一准备阶段视为对其使用一张杀;在此之前,你不能使用卡牌,也不能成为卡牌的目标。", + "结束阶段,你可以弃置一张黑色牌并指定一名其他角色,你在该角色下一准备阶段视为对其使用一张【杀】;在此之前,你不能使用卡牌,也不能成为卡牌的目标。", feidan: "飞弹", feidan_info: - "你的杀只能对距离1以外的角色使用;每当你使用杀造成伤害后,你可以弃置一张牌对距离目标1以内的其他角色各造成1点伤害。", + "你的【杀】只能对距离1以外的角色使用;每当你使用【杀】造成伤害后,你可以弃置一张牌对距离目标1以内的其他角色各造成1点伤害。", huoyu: "火雨", huoyu_info: "限定技,出牌阶段,你可以弃置两张红色牌,视为使用两张炽羽袭。", yuedong: "乐动", @@ -3871,12 +3871,12 @@ game.import("character", function () { guangshu_club: "光井", guangshu_diamond: "光流", guangshu_info: - "出牌阶段,你可以弃置一张牌,并指定一名角色,根据弃置牌的花色执行如下效果:♥该角色下次受到伤害时回复1点体力;♦︎该角色下次造成伤害时摸两张牌;♣该角色无法使用杀直到下一回合结束;♠该角色于下个结束阶段受到1点无来源的雷电伤害。", + "出牌阶段,你可以弃置一张牌,并指定一名角色,根据弃置牌的花色执行如下效果:♥该角色下次受到伤害时回复1点体力;♦︎该角色下次造成伤害时摸两张牌;♣该角色无法使用【杀】直到下一回合结束;♠该角色于下个结束阶段受到1点无来源的雷电伤害。", ziyu: "自愈", ziyu_info: "在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔四回合发动一次。", ziyu_info_alter: "在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔六回合发动一次。", shouhu: "守护", - shouhu_info: "你不能使用杀;出牌阶段,你可以弃置一张杀令一名其他角色回复1点体力。", + shouhu_info: "你不能使用【杀】;出牌阶段,你可以弃置一张【杀】令一名其他角色回复1点体力。", shanxian: "闪现", shanxian_info: "在一名其他角色的回合开始前,若你的武将牌正面朝上,你可以摸一张牌并进行一个额外回合,并在回合结束后将武将牌翻至背面。若如此做,你对其使用卡牌无视距离直到回合结束。", diff --git a/character/rank.js b/character/rank.js index 62c06d475f..e1efae3861 100644 --- a/character/rank.js +++ b/character/rank.js @@ -150,6 +150,7 @@ window.noname_character_rank = { "xukun", "ol_feiyi", "ol_jiangwan", + "bianyue", ], a: [ "star_caoren", @@ -394,13 +395,21 @@ window.noname_character_rank = { "drag_caoren", "drag_lvchang", "star_sunjian", + "star_sunshangxiang", "yj_xuangongzhu", "ol_sb_pangtong", "dc_sb_zhugejin", "matie", "dc_sb_caoang", + "dc_sb_dianwei", "dc_sb_guanping", "ol_caifuren", + "ol_liubiao", + "mp_liuling", + "mp_wangrong", + "mb_wangjing", + "zhangbu", + "licuilianzhaoquanding", ], am: [ "tw_yanliang", @@ -605,6 +614,7 @@ window.noname_character_rank = { "sp_chenzhen", "sp_wangcan", "caosong", + "caoteng", "sp_duyu", "xiahoujie", "ns_huangwudie", @@ -659,7 +669,7 @@ window.noname_character_rank = { "clan_xunchen", "chenjiao", "chengbing", - "sb_caosong", + "sp_caosong", "guyong", "tw_jiangqing", "tw_liuzhang", @@ -723,6 +733,8 @@ window.noname_character_rank = { "sb_handang", "sb_gongsunzan", "yue_zoushi", + "xin_simayi", + "new_simayi", ], bp: [ "ol_peixiu", @@ -1128,6 +1140,8 @@ window.noname_character_rank = { "ol_wangyi", "chengji", "mb_sp_guanqiujian", + "mb_wenqin", + "mb_simazhou", "jsrg_songhuanghou", "jsrg_dongzhuo", "jsrg_zhanghuan", @@ -1153,6 +1167,10 @@ window.noname_character_rank = { "huan_guojia", "huan_jiangwei", "budugen", + "jsrg_dongbai", + "yj_zhonghui", + "wuhujiang", + "dc_noname", ], b: [ "huan_zhugeliang", @@ -1488,6 +1506,7 @@ window.noname_character_rank = { "yj_simafu", "dc_wuyi", "jsrg_caojiewangfu", + "ol_wuguotai", ], bm: [ "kongrong", @@ -2001,6 +2020,9 @@ window.noname_character_rank = { "jsrg_yuanshao", ], epic: [ + "wuhujiang", + "yj_zhonghui", + "bianyue", "budugen", "huan_guojia", "huan_simayi", @@ -2169,6 +2191,7 @@ window.noname_character_rank = { "fanyufeng", "re_taoqian", "caosong", + "caoteng", "sp_duyu", "jin_yanghuiyu", "xiahoujie", @@ -2296,6 +2319,7 @@ window.noname_character_rank = { "drag_caoren", "wupu", "star_sunjian", + "star_sunshangxiang", "jsrg_zhangjiao", "ol_sb_pangtong", "dc_sb_zhugejin", @@ -2303,11 +2327,18 @@ window.noname_character_rank = { "hansong", "star_zhangzhao", "dc_sp_zhurong", + "xin_simayi", + "mb_wangjing", + "zhangbu", + "new_simayi", ], rare: [ + "dc_noname", + "ol_liubiao", "huan_weiyan", "ol_caifuren", "dc_sb_caoang", + "dc_sb_dianwei", "dc_sb_guanping", "yue_zhugeguo", "yue_zoushi", @@ -2823,6 +2854,8 @@ window.noname_character_rank = { "clan_wangmingshan", "chengji", "mb_sp_guanqiujian", + "mb_wenqin", + "mb_simazhou", "lizhaojiaobo", "jsrg_songhuanghou", "jsrg_zhangjiao", @@ -2838,6 +2871,10 @@ window.noname_character_rank = { "huan_zhaoyun", "huan_jiangwei", "huan_zhugeliang", + "ol_wuguotai", + "mp_liuling", + "mp_wangrong", + "licuilianzhaoquanding", ], junk: [ "ol_peixiu", @@ -2892,6 +2929,7 @@ window.noname_character_rank = { "re_zhongyao", "junk_zhangjiao", "zhupeilan", + "jsrg_dongbai", ], }, }; diff --git a/character/refresh/character.js b/character/refresh/character.js index 0cbd95b603..acce29a7ee 100644 --- a/character/refresh/character.js +++ b/character/refresh/character.js @@ -3,18 +3,18 @@ const characters = { re_lidian: ["male", "wei", 3, ["xunxun", "xinwangxi"]], re_zhongyao: ["male", "wei", 3, ["rehuomo", "zuoding"], ["clan:颍川钟氏"]], xin_zhangliang: ["male", "qun", 4, ["rejijun", "refangtong"]], - re_simalang: ["male", "wei", 3, ["requji", "rejunbing"]], - re_zhugedan: ["male", "wei", 4, ["regongao", "rejuyi"]], + re_simalang: ["male", "wei", 3, ["requji", "rejunbing"], ["name:司马|朗"]], + re_zhugedan: ["male", "wei", 4, ["regongao", "rejuyi"], ["name:诸葛|诞"]], re_caorui: ["male", "wei", 3, ["huituo", "remingjian", "rexingshuai"], ["zhu"]], re_caochong: ["male", "wei", 3, ["rechengxiang", "renxin"]], - ol_zhangzhang: ["male", "wu", 3, ["olzhijian", "olguzheng"]], + ol_zhangzhang: ["male", "wu", 3, ["olzhijian", "olguzheng"], ["name:张|昭-张|纮"]], re_jsp_huangyueying: ["female", "qun", 3, ["rejiqiao", "relinglong"]], re_zhangsong: ["male", "shu", 3, ["qiangzhi", "rexiantu"]], re_zhuzhi: ["male", "wu", 4, ["reanguo"]], dc_caozhi: ["male", "wei", 3, ["reluoying", "dcjiushi"]], ol_huangzhong: ["male", "shu", 4, ["xinliegong", "remoshi"]], re_wenpin: ["male", "wei", 5, ["rezhenwei"]], - re_guanzhang: ["male", "shu", 4, ["fuhun", "retongxin"]], + re_guanzhang: ["male", "shu", 4, ["fuhun", "retongxin"], ["name:关|兴-张|苞"]], re_mazhong: ["male", "shu", 4, ["refuman"]], dc_chenqun: ["male", "wei", 3, ["repindi", "dcfaen"]], re_sundeng: ["male", "wu", 4, ["rekuangbi"]], @@ -24,29 +24,29 @@ const characters = { dc_liru: ["male", "qun", 3, ["xinjuece", "dcmieji", "dcfencheng"]], re_zhuhuan: ["male", "wu", 4, ["refenli", "repingkou"]], ol_dianwei: ["male", "wei", 4, ["olqiangxi", "olningwu"]], - re_sp_taishici: ["male", "qun", 4, ["rejixu"]], + re_sp_taishici: ["male", "qun", 4, ["rejixu"], ["name:太史|慈"]], re_liufeng: ["male", "shu", 4, ["rexiansi"]], ol_xunyu: ["male", "wei", 3, ["quhu", "oljieming"], ["clan:颍川荀氏"]], re_liuchen: ["male", "shu", 4, ["rezhanjue", "reqinwang"], ["zhu"]], - dc_gongsunzan: ["male", "qun", 4, ["dcyicong", "dcqiaomeng"]], + dc_gongsunzan: ["male", "qun", 4, ["dcyicong", "dcqiaomeng"], ["name:公孙|瓒"]], re_duji: ["male", "wei", 3, ["reandong", "reyingshi"]], re_jushou: ["male", "qun", 3, ["dcjianying", "dcshibei"]], re_zhanghe: ["male", "wei", 4, ["reqiaobian"]], dc_xushu: ["male", "shu", 4, ["rezhuhai", "xsqianxin"]], xin_gaoshun: ["male", "qun", 4, ["decadexianzhen", "decadejinjiu"]], - re_guohuanghou: ["female", "wei", 3, ["rejiaozhao", "redanxin"]], - re_xiahoushi: ["female", "shu", 3, ["reqiaoshi", "reyanyu"]], + re_guohuanghou: ["female", "wei", 3, ["rejiaozhao", "redanxin"], ["name:郭|null"]], + re_xiahoushi: ["female", "shu", 3, ["reqiaoshi", "reyanyu"], ["name:夏侯|null"]], ol_lusu: ["male", "wu", 3, ["olhaoshi", "oldimeng"]], re_jiaxu: ["male", "qun", 3, ["rewansha", "reluanwu", "reweimu"]], re_guyong: ["male", "wu", 3, ["reshenxing", "rebingyi"]], xin_zhonghui: ["male", "wei", 4, ["xinquanji", "xinzili"], ["clan:颍川钟氏"]], - re_caifuren: ["female", "qun", 3, ["reqieting", "rexianzhou"]], + re_caifuren: ["female", "qun", 3, ["reqieting", "rexianzhou"], ["name:蔡|null"]], re_guanping: ["male", "shu", 4, ["relongyin", "jiezhong"]], - re_guotufengji: ["male", "qun", 3, ["rejigong", "shifei"]], + re_guotufengji: ["male", "qun", 3, ["rejigong", "shifei"], ["name:郭|图-逢|记"]], re_zhoucang: ["male", "shu", 4, ["rezhongyong"]], ol_zhurong: ["female", "shu", 4, ["juxiang", "lieren", "changbiao"]], re_zhangchunhua: ["female", "wei", 3, ["rejueqing", "reshangshi"]], - re_gongsunyuan: ["male", "qun", 4, ["rehuaiyi"]], + re_gongsunyuan: ["male", "qun", 4, ["rehuaiyi"], ["name:公孙|渊"]], re_caozhen: ["male", "wei", 4, ["residi"]], re_fuhuanghou: ["female", "qun", 3, ["rezhuikong", "reqiuyuan"]], re_fazheng: ["male", "shu", 3, ["reenyuan", "rexuanhuo"]], @@ -55,16 +55,16 @@ const characters = { re_caoxiu: ["male", "wei", 4, ["qianju", "reqingxi"]], re_sunxiu: ["male", "wu", 3, ["reyanzhu", "rexingxue", "zhaofu"], ["zhu"]], ol_dengai: ["male", "wei", 4, ["oltuntian", "olzaoxian"]], - re_gongsunzan: ["male", "qun", 4, ["reqiaomeng", "reyicong"]], + re_gongsunzan: ["male", "qun", 4, ["reqiaomeng", "reyicong"],["name:公孙|瓒"]], re_manchong: ["male", "wei", 3, ["rejunxing", "yuce"]], xin_yufan: ["male", "wu", 3, ["xinzhiyan", "xinzongxuan"]], dc_bulianshi: ["female", "wu", 3, ["dcanxu", "dczhuiyi"]], - re_hanhaoshihuan: ["male", "wei", 4, ["reshenduan", "reyonglve"]], - re_panzhangmazhong: ["male", "wu", 4, ["reduodao", "reanjian"]], + re_hanhaoshihuan: ["male", "wei", 4, ["reshenduan", "reyonglve"], ["name:韩|浩-史|涣"]], + re_panzhangmazhong: ["male", "wu", 4, ["reduodao", "reanjian"], ["name:潘|璋-马|忠"]], re_wangyi: ["female", "wei", 4, ["zhenlie", "miji"]], re_madai: ["male", "shu", 4, ["mashu", "reqianxi"]], xin_xusheng: ["male", "wu", 4, ["decadepojun"]], - re_taishici: ["male", "wu", 4, ["tianyi", "hanzhan"]], + re_taishici: ["male", "wu", 4, ["tianyi", "hanzhan"], ["name:太史|慈"]], re_masu: ["male", "shu", 3, ["resanyao", "rezhiman"]], re_sunluban: ["female", "wu", 3, ["rechanhui", "rejiaojin"]], xin_handang: ["male", "wu", 4, ["xingongji", "xinjiefan"]], @@ -78,13 +78,13 @@ const characters = { re_zhuran: ["male", "wu", 4, ["xindanshou"]], ol_pangtong: ["male", "shu", 3, ["ollianhuan", "olniepan"], []], re_zhangyi: ["male", "shu", 5, ["rewurong", "reshizhi"]], - xin_wuguotai: ["female", "wu", 3, ["xinganlu", "xinbuyi"]], + xin_wuguotai: ["female", "wu", 3, ["xinganlu", "xinbuyi"], ["name:丁|null"]], re_caocao: ["male", "wei", 4, ["new_rejianxiong", "rehujia"], ["zhu"]], - re_simayi: ["male", "wei", 3, ["refankui", "reguicai"]], + re_simayi: ["male", "wei", 3, ["refankui", "reguicai"], ["name:司马|懿"]], re_guojia: ["male", "wei", 3, ["tiandu", "new_reyiji"]], re_zhangliao: ["male", "wei", 4, ["new_retuxi"]], re_xuzhu: ["male", "wei", 4, ["new_reluoyi"]], - re_xiahoudun: ["male", "wei", 4, ["reganglie", "new_qingjian"]], + re_xiahoudun: ["male", "wei", 4, ["reganglie", "new_qingjian"], ["name:夏侯|惇"]], re_zhangfei: ["male", "shu", 4, ["olpaoxiao", "oltishen"]], re_zhaoyun: ["male", "shu", 4, ["ollongdan", "olyajiao"]], re_guanyu: ["male", "shu", 4, ["new_rewusheng", "new_yijue"]], @@ -93,32 +93,32 @@ const characters = { re_lvmeng: ["male", "wu", 4, ["keji", "qinxue", "rebotu"]], re_ganning: ["male", "wu", 4, ["qixi", "fenwei"]], re_luxun: ["male", "wu", 3, ["reqianxun", "relianying"]], - re_daqiao: ["female", "wu", 3, ["reguose", "liuli"]], + re_daqiao: ["female", "wu", 3, ["reguose", "liuli"], ["name:桥|null"]], re_huanggai: ["male", "wu", 4, ["rekurou", "zhaxiang"]], re_lvbu: ["male", "qun", 5, ["wushuang", "new_liyu"]], re_huatuo: ["male", "qun", 3, ["jijiu", "new_reqingnang"]], re_liubei: ["male", "shu", 4, ["rerende", "rejijiang"], ["zhu"]], - re_diaochan: ["female", "qun", 3, ["lijian", "rebiyue"]], + re_diaochan: ["female", "qun", 3, ["lijian", "rebiyue"], ["name:null|null"]], re_huangyueying: ["female", "shu", 3, ["rejizhi", "reqicai"]], re_sunquan: ["male", "wu", 4, ["rezhiheng", "rejiuyuan"], ["zhu"]], re_sunshangxiang: ["female", "wu", 3, ["xiaoji", "rejieyin"]], re_zhenji: ["female", "wei", 3, ["reluoshen", "reqingguo"]], - re_zhugeliang: ["male", "shu", 3, ["reguanxing", "kongcheng"]], + re_zhugeliang: ["male", "shu", 3, ["reguanxing", "kongcheng"], ["name:诸葛|亮"]], re_huaxiong: ["male", "qun", 6, ["reyaowu", "shizhan"]], re_zhangjiao: ["male", "qun", 3, ["xinleiji", "xinguidao", "xinhuangtian"], ["zhu"]], xin_yuji: ["male", "qun", 3, ["reguhuo"]], re_zuoci: ["male", "qun", 3, ["rehuashen", "rexinsheng"]], - ol_xiahouyuan: ["male", "wei", 4, ["xinshensu", "shebian"]], + ol_xiahouyuan: ["male", "wei", 4, ["xinshensu", "shebian"], ["name:夏侯|渊"]], caoren: ["male", "wei", 4, ["xinjushou", "xinjiewei"]], ol_weiyan: ["male", "shu", 4, ["xinkuanggu", "reqimou"]], - ol_xiaoqiao: ["female", "wu", 3, ["oltianxiang", "olhongyan", "piaoling"]], + ol_xiaoqiao: ["female", "wu", 3, ["oltianxiang", "olhongyan", "piaoling"], ["name:桥|null"]], zhoutai: ["male", "wu", 4, ["buqu", "fenji"]], ol_pangde: ["male", "qun", 4, ["mashu", "rejianchu"]], ol_xuhuang: ["male", "wei", 4, ["olduanliang", "oljiezi"]], - ol_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "olhuoji", "olkanpo", "cangzhuo"], []], - ol_yanwen: ["male", "qun", 4, ["olshuangxiong"], []], + ol_sp_zhugeliang: ["male", "shu", 3, ["bazhen", "olhuoji", "olkanpo", "cangzhuo"], ["name:诸葛|亮"]], + ol_yanwen: ["male", "qun", 4, ["olshuangxiong"], ["name:颜|良-文|丑"]], ol_yuanshao: ["male", "qun", 4, ["olluanji", "olxueyi"], ["zhu"]], re_menghuo: ["male", "shu", 4, ["huoshou", "rezaiqi"]], ol_dongzhuo: ["male", "qun", 8, ["oljiuchi", "roulin", "benghuai", "olbaonue"], ["zhu"]], diff --git a/character/refresh/skill.js b/character/refresh/skill.js index 378887c8ce..f36fa304ea 100644 --- a/character/refresh/skill.js +++ b/character/refresh/skill.js @@ -2187,80 +2187,66 @@ const skills = { }, }, dcfencheng: { - skillAnimation: "epic", - animationColor: "fire", audio: 2, audioname: ["ol_liru"], enable: "phaseUse", - filterTarget: function (card, player, target) { - return player != target; - }, + filterTarget: lib.filter.notMe, limited: true, line: "fire", - content: function () { - "step 0"; - player.awakenSkill("dcfencheng"); - event.num = 1; - event.targets = game.filterPlayer(current => current != player); - event.targets.sortBySeat(target); - "step 1"; - if (event.targets.length) { - var target = event.targets.shift(); - if (!target.isIn()) { - event.redo(); - return; + skillAnimation: "epic", + animationColor: "fire", + async content(event, trigger, player) { + player.awakenSkill(event.name); + let targets = game.filterPlayer(current => current != player); + targets.sortBySeat(event.target); + let num = 1; + if (targets.length) { + for (const target of targets) { + if (target.isIn()) { + player.line(target, "fire"); + const { result } = await target + .chooseToDiscard("he", "焚城:弃置至少" + get.cnNumber(num) + "张牌,或受到2点火焰伤害", [num, Infinity]) + .set("ai", card => { + if (ui.selected.cards.length >= get.event("num")) return -1; + if (get.player().hasSkillTag("nofire")) return -1; + if (get.event().res >= 0) return 6 - get.value(card); + if (get.type(card) != "basic") { + return 10 - get.value(card); + } + return 8 - get.value(card); + }) + .set("num", num) + .set("res", get.damageEffect(target, player, target, "fire")); + + if (!result.bool) { + await target.damage(2, "fire"); + num = 1; + } else num = result.cards.length + 1; + } } - event.target = target; - player.line(target, "fire"); - var res = get.damageEffect(target, player, target, "fire"); - target - .chooseToDiscard("he", "弃置至少" + get.cnNumber(event.num) + "张牌或受到2点火焰伤害", [num, Infinity]) - .set("ai", function (card) { - if (ui.selected.cards.length >= _status.event.getParent().num) return -1; - if (_status.event.player.hasSkillTag("nofire")) return -1; - if (_status.event.res >= 0) return 6 - get.value(card); - if (get.type(card) != "basic") { - return 10 - get.value(card); - } - return 8 - get.value(card); - }) - .set("res", res); - } else { - event.finish(); } - "step 2"; - if (!result.bool) { - event.target.damage(2, "fire"); - event.num = 1; - } else { - event.num = result.cards.length + 1; - event.goto(1); - } - "step 3"; - game.delayx(); - event.goto(1); }, ai: { order: 1, result: { - player: function (player, target) { + player(player, target) { if (player.hasUnknown(2)) return 0; - var num = 0, + let num = 0, eff = 0, players = game - .filterPlayer(function (current) { + .filterPlayer(current=> { return current != player; }) .sortBySeat(target); - for (var target of players) { + for (const target of players) { if (get.damageEffect(target, player, target, "fire") >= 0) { num = 0; continue; } - var shao = false; + let shao = false; num++; if ( - target.countCards("he", function (card) { + target.countCards("he", card=> { if (get.type(card) != "basic") { return get.value(card) < 10; } @@ -2392,7 +2378,8 @@ const skills = { if (result.bool) { var target = result.targets[0]; player.line(target, "green"); - player.discardPlayerCard(target, "e", true); + var card = target.getCards("e").randomGet(); + if (card) target.discard(card); } }, ai: { @@ -4738,25 +4725,22 @@ const skills = { }, //priority:-5, logTarget: "player", - content: function () { - "step 0"; - game.asyncDraw([trigger.player, player]); - "step 1"; - game.delayx(); - if (player.isIn() && trigger.player.isIn()) { - var getGainSuit = function (player) { - var last = player.getHistory("gain", function (evt) { + async content(event, trigger, player) { + while (player.isIn() && trigger.player.isIn()) { + await game.asyncDraw([trigger.player, player]); + await game.asyncDelayx(); + let getGainSuit = function (player) { + let last = player.getHistory("gain", function (evt) { return evt.getParent(2) == event; }); if (last.length) { - var evt = last.pop(); + let evt = last.pop(); if (evt.cards.length == 1 && player.getCards("h").includes(evt.cards[0])) return get.suit(evt.cards[0], player); } else return player; - }; - if (getGainSuit(player) == getGainSuit(trigger.player)) player.chooseBool("是否继续发动【樵拾】?", "和" + get.translation(trigger.player) + "各摸一张牌"); - } else event.finish(); - "step 2"; - if (result.bool) event.goto(0); + }, bool; + if (getGainSuit(player) == getGainSuit(trigger.player)) bool = await player.chooseBool("是否继续发动【樵拾】?", "和" + get.translation(trigger.player) + "各摸一张牌").forResultBool(); + if (!bool) break; + } }, ai: { expose: 0.1, @@ -5367,8 +5351,8 @@ const skills = { //贾诩 rewansha: { audio: "wansha", - audioname: ["re_jiaxu", "boss_lvbu3"], - audioname2: { shen_simayi: "jilue_wansha" }, + audioname: ["re_jiaxu", "boss_lvbu3", "new_simayi"], + audioname2: { shen_simayi: "jilue_wansha", xin_simayi: "jilue_wansha" }, global: "rewansha_global", trigger: { global: "dyingBegin" }, forced: true, @@ -5581,12 +5565,12 @@ const skills = { return true; }, async cost(event, trigger, player) { - const selfDraw = lib.skill.rebingyi.filtery(player), + const selfDraw = lib.skill.rebingyi.filterx(player) && lib.skill.rebingyi.filtery(player), asyncDraw = lib.skill.rebingyi.filterx(player); if (asyncDraw) { const num = player.countCards("h"); const result = await player - .chooseTarget(get.prompt("rebingyi"), `展示所有手牌,并选择至多${get.cnNumber(num)}名角色各摸一张牌${selfDraw ? "" : ",然后你摸一张牌"}`, [0, num]) + .chooseTarget(get.prompt("rebingyi"), `展示所有手牌,并选择至多${get.cnNumber(num)}名角色各摸一张牌${selfDraw ? ",然后你摸一张牌" : ""}`, [0, num]) .set("ai", function (target) { return get.attitude(get.player(), target); }) @@ -5602,7 +5586,7 @@ const skills = { }; } else { event.result = await player - .chooseBool(get.prompt("rebingyi"), `展示所有手牌${selfDraw ? "" : ",然后你摸一张牌"}`) + .chooseBool(get.prompt("rebingyi"), `展示所有手牌${selfDraw ? ",然后你摸一张牌" : ""}`) .set("choice", selfDraw) .set("ai", () => get.event().choice) .forResult(); @@ -6003,7 +5987,6 @@ const skills = { //界关平 relongyin: { audio: 2, - shaRelated: true, init: player => { game.addGlobalSkill("relongyin_order"); }, @@ -8712,7 +8695,6 @@ const skills = { }, }, decadepojun: { - shaRelated: true, audio: 2, trigger: { player: "useCardToPlayered" }, direct: true, @@ -8924,7 +8906,6 @@ const skills = { }, }, rejianchu: { - shaRelated: true, audio: 2, audioname: ["re_pangde"], trigger: { player: "useCardToPlayered" }, @@ -9104,7 +9085,7 @@ const skills = { }, locked: false, audio: "longdan_sha", - audioname: ["re_zhaoyun"], + audioname: ["re_zhaoyun", "huan_zhaoyun"], audioname2: { tongyuan: "longdan_tongyuan" }, hiddenCard: function (player, name) { if (name == "tao") return player.countCards("hs", "jiu") > 0; @@ -10460,7 +10441,6 @@ const skills = { }, }, repojun: { - shaRelated: true, audio: 2, trigger: { player: "useCardToPlayered" }, direct: true, @@ -11591,14 +11571,10 @@ const skills = { reguhuo_phase: {}, rechanyuan: { init: function (player, skill) { - if (player.hp <= 1) { - player.logSkill(skill); - player.addSkill("rechanyuan_log"); - } + if (player.hp <= 1) player.logSkill(skill); player.addSkillBlocker(skill); }, onremove: function (player, skill) { - player.removeSkill("rechanyuan_log"); player.removeSkillBlocker(skill); }, skillBlocker: function (skill, player) { @@ -11618,19 +11594,10 @@ const skills = { audio: 2, trigger: { player: "changeHp" }, filter: function (event, player) { - return player.hp <= 1 != player.hasSkill("rechanyuan_log"); - }, - direct: true, - locked: true, - content: function () { - if (player.hp <= 1) { - player.logSkill("rechanyuan"); - player.addSkill("rechanyuan_log"); - } else player.removeSkill("rechanyuan_log"); - }, - subSkill: { - log: { charlotte: true }, + return get.sgn(player.hp - 1.5) != get.sgn(player.hp - 1.5 - event.num); }, + forced: true, + content: function () {}, }, botu: { audio: 2, @@ -13160,7 +13127,7 @@ const skills = { }, rezhiheng: { audio: 2, - audioname2: { shen_caopi: "rezhiheng_shen_caopi" }, + audioname2: { shen_caopi: "rezhiheng_shen_caopi", xin_simayi: "jilue_zhiheng" }, mod: { aiOrder: function (player, card, num) { if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip") return num; @@ -13253,7 +13220,7 @@ const skills = { }, rejizhi: { audio: 2, - audioname2: { lukang: "rejizhi_lukang" }, + audioname2: { lukang: "rejizhi_lukang", xin_simayi: "jilue_jizhi" }, locked: false, trigger: { player: "useCard" }, frequent: true, @@ -13600,6 +13567,8 @@ const skills = { }, reguicai: { audio: 2, + audioname2: { xin_simayi: "jilue_guicai" }, + audioname: ["new_simayi"], trigger: { global: "judge" }, direct: true, filter: function (event, player) { @@ -14441,7 +14410,6 @@ const skills = { }, }, retieji: { - shaRelated: true, audio: 2, audioname: ["boss_lvbu3"], trigger: { player: "useCardToPlayered" }, @@ -14541,6 +14509,7 @@ const skills = { }, qiaomeng: { audio: 2, + audioname: ["xin_gongsunzan"], trigger: { source: "damageSource" }, direct: true, filter: function (event, player) { diff --git a/character/refresh/translate.js b/character/refresh/translate.js index aed4bb9c5b..cc798f44ea 100644 --- a/character/refresh/translate.js +++ b/character/refresh/translate.js @@ -136,7 +136,7 @@ const translates = { new_reluoyi: "裸衣", new_reluoyi_info: "摸牌阶段开始时,你亮出牌堆顶的三张牌。然后,你可以放弃摸牌。若如此做,你获得其中的基本牌、武器牌和【决斗】,且直到你的下回合开始,你使用的【杀】或【决斗】造成伤害时,此伤害+1。否则,你将这些牌置入弃牌堆。", new_rewusheng: "武圣", - new_rewusheng_info: "你可以将一张红色牌当做【杀】使用或打出。你使用的方片杀没有距离限制。", + new_rewusheng_info: "你可以将一张红色牌当做【杀】使用或打出。你使用的方片【杀】没有距离限制。", new_yijue: "义绝", new_yijue_info: "出牌阶段限一次,你可以弃置一张牌并令一名有手牌的其他角色展示一张手牌。若此牌为黑色,则该角色不能使用或打出牌,非锁定技失效且受到来自你的红桃【杀】的伤害+1直到回合结束。若此牌为红色,则你可以获得此牌,并可以令其回复1点体力。", new_yijue2: "义绝", @@ -154,7 +154,7 @@ const translates = { new_reqingnang: "青囊", new_reqingnang_info: "出牌阶段,你可以弃置一张手牌,令一名本回合内未成为过〖青囊〗的目标的角色回复1点体力。若你弃置的是黑色牌,则你本回合内不能再发动〖青囊〗。", new_reyaowu: "耀武", - new_reyaowu_info: "锁定技,当一名角色使用【杀】对你造成伤害时,若此杀为红色,该角色回复1点体力或摸一张牌。否则你摸一张牌。", + new_reyaowu_info: "锁定技,当一名角色使用【杀】对你造成伤害时,若此【杀】为红色,该角色回复1点体力或摸一张牌。否则你摸一张牌。", reyaowu: "耀武", reyaowu_info: "锁定技,当你受到牌造成的伤害时,若此牌为红色,则伤害来源摸一张牌;否则你摸一张牌。", reqingguo: "倾国", @@ -513,7 +513,7 @@ const translates = { dcfaen: "法恩", dcfaen_info: "一名角色翻至正面或横置后,你可令其摸一张牌。", reshizhi: "矢志", - reshizhi_info: "锁定技,若你的体力值为1,则你的【闪】视为【杀】,且当你使用对应的实体牌为一张【闪】的非转化普通杀造成伤害后,你回复1点体力。", + reshizhi_info: "锁定技,若你的体力值为1,则你的【闪】视为【杀】,且当你使用对应的实体牌为一张【闪】的非转化普通【杀】造成伤害后,你回复1点体力。", re_guotufengji: "界郭图逢纪", re_guotufengji_prefix: "界", rejigong: "急攻", @@ -555,7 +555,7 @@ const translates = { reshenxing: "慎行", reshenxing_info: "出牌阶段,你可以弃置X张牌(X为你本阶段内发动过〖慎行〗的次数且至少为0,至多为2),然后摸一张牌。", rebingyi: "秉壹", - rebingyi_info: "结束阶段,你可展示所有手牌。若这些牌:颜色均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数);点数均相同,则你摸一张牌。", + rebingyi_info: "结束阶段,你可展示所有手牌。若这些牌:颜色均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数);颜色点数均相同,则你摸一张牌。", re_jiaxu: "界贾诩", re_jiaxu_prefix: "界", rewansha: "完杀", @@ -691,7 +691,7 @@ const translates = { refenli_info: "若你的手牌数为全场最多,你可以跳过判定阶段和摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。", //破界石不值钱了 就逮着免费突破硬削是吧 repingkou: "平寇", - repingkou_info: "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。若你选择的角色数小于X,则你可以弃置其中一名角色装备区内的一张牌。", + repingkou_info: "回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。若你选择的角色数小于X,则你可以令其中一名角色随机弃置装备区里的一张牌。", dc_liru: "界李儒", dc_liru_prefix: "界", dcmieji: "灭计", diff --git a/character/sb/character.js b/character/sb/character.js index f1d45cc437..0de564b318 100644 --- a/character/sb/character.js +++ b/character/sb/character.js @@ -1,13 +1,13 @@ const characters = { sb_handang: ["male", "wu", 4, ["sbgongqi", "sbjiefan"]], - sb_gongsunzan: ["male", "qun", 4, ["sbyicong", "sbqiaomeng"]], + sb_gongsunzan: ["male", "qun", 4, ["sbyicong", "sbqiaomeng"], ["name:公孙|瓒"]], sb_gaoshun: ["male", "qun", 4, ["sbxianzhen", "sbjinjiu"]], - sb_xiahoudun: ["male", "wei", 4, ["sbganglie", "sbqingjian"]], + sb_xiahoudun: ["male", "wei", 4, ["sbganglie", "sbqingjian"], ["name:夏侯|惇"]], sb_xunyu: ["male", "wei", 3, ["sbquhu", "sbjieming"]], sb_caopi: ["male", "wei", 3, ["sbxingshang", "sbfangzhu", "sbsongwei"], ["zhu"]], sb_guanyu: ["male", "shu", 4, ["sbwusheng", "sbyijue"]], sb_huangyueying: ["female", "shu", 3, ["sbjizhi", "sbqicai"]], - sb_sp_zhugeliang: ["male", "shu", 3, ["sbhuoji", "sbkanpo"]], + sb_sp_zhugeliang: ["male", "shu", 3, ["sbhuoji", "sbkanpo"], ["name:诸葛|亮"]], sb_zhanghe: ["male", "wei", 4, ["sbqiaobian"]], sb_yujin: ["male", "wei", 4, ["sbxiayuan", "sbjieyue"]], sb_huaxiong: ["male", "qun", "3/4/1", ["new_reyaowu", "sbyangwei"]], @@ -20,7 +20,7 @@ const characters = { sb_huanggai: ["male", "wu", 4, ["sbkurou", "sbzhaxiang"]], sb_zhouyu: ["male", "wu", 3, ["sbyingzi", "sbfanjian"]], sb_caoren: ["male", "wei", "4/4/1", ["sbjushou", "sbjiewei"]], - sb_xiahoushi: ["female", "shu", 3, ["sbqiaoshi", "sbyanyu"]], + sb_xiahoushi: ["female", "shu", 3, ["sbqiaoshi", "sbyanyu"], ["name:夏侯|null"]], sb_zhangjiao: ["male", "qun", 3, ["sbleiji", "sbguidao", "sbhuangtian"], ["zhu"]], sb_caocao: ["male", "wei", 4, ["sbjianxiong", "sbqingzheng", "sbhujia"], ["zhu"]], sb_zhenji: ["female", "wei", 3, ["sbluoshen", "qingguo"]], @@ -33,16 +33,17 @@ const characters = { sb_jiangwei: ["male", "shu", "4/4/1", ["sbtiaoxin", "sbzhiji"]], sb_fazheng: ["male", "shu", 3, ["sbxuanhuo", "sbenyuan"]], sb_chengong: ["male", "qun", 3, ["sbmingce", "sbzhichi"]], - sb_diaochan: ["female", "qun", 3, ["sblijian", "sbbiyue"]], + sb_diaochan: ["female", "qun", 3, ["sblijian", "sbbiyue"], ["name:null|null"]], sb_yuanshao: ["male", "qun", 4, ["sbluanji", "sbxueyi"], ["zhu"]], sb_pangtong: ["male", "shu", 3, ["sblianhuan", "sbniepan"]], sb_sunce: ["male", "wu", 4, ["sbjiang", "sbhunzi", "sbzhiba"], ["zhu"]], - sb_daqiao: ["female", "wu", 3, ["sbguose", "sbliuli"]], + sb_daqiao: ["female", "wu", 3, ["sbguose", "sbliuli"], ["name:桥|null"]], sb_liubiao: ["male", "qun", 3, ["sbzishou", "sbzongshi"]], sb_zhurong: ["female", "shu", 4, ["sblieren", "sbjuxiang"]], sb_menghuo: ["male", "shu", 4, ["sbhuoshou", "sbzaiqi"]], sb_yl_luzhi: ["male", "qun", 3, ["nzry_mingren", "sbzhenliang"]], - sb_xiaoqiao: ["female", "wu", 3, ["sbtianxiang", "xinhongyan"]], + sb_xiaoqiao: ["female", "wu", 3, ["sbtianxiang", "xinhongyan"], ["name:桥|null"]], + sb_luxun: ["male", "wu", 3, ["sbqianxun", "sblianying"]], }; export default characters; diff --git a/character/sb/skill.js b/character/sb/skill.js index 38e5d77b06..a2cc4ed730 100644 --- a/character/sb/skill.js +++ b/character/sb/skill.js @@ -88,6 +88,9 @@ const skills = { lib.skill.sbgongqi.updateBlocker(current); }); }, + intro: { + content: "所有其他角色不能使用或打出不为$的手牌响应你使用的牌", + }, }, block: { trigger: { @@ -124,7 +127,17 @@ const skills = { const hs = player.getCards("h"), cards = [card]; if (Array.isArray(card.cards)) cards.addArray(card.cards); - if (cards.containsSome(...hs) && player.storage.sbgongqi_blocker.includes(color)) return false; + if (cards.containsSome(...hs) && !player.storage.sbgongqi_blocker.includes(color)) return false; + }, + cardRespondable(card, player) { + if (!player.storage.sbgongqi_blocker) return; + const color = get.color(card); + if (color == "none") return; + const hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + const evt = _status.event; + if (evt.name == "chooseToRespond" && cards.containsSome(...hs) && !player.storage.sbgongqi_blocker.includes(color)) return false; }, }, }, @@ -140,15 +153,15 @@ const skills = { const targets = game.filterPlayer(current => { return current.inRange(target); }); - const count = Math.min(2, targets.length); - if (!count) { + const count = targets.length+2; + if (count<=2) { target.chat("没人打得到我喔!"); return; } const controls = ["选项一", "选项二", "背水!"]; const control = await target .chooseControl(controls) - .set("choiceList", [`令所有攻击范围内含有你的角色依次弃置一张牌(${get.translation(targets)})`, `你摸等同于攻击范围内含有你的角色数的牌(${get.cnNumber(count)}张牌)`, `背水!令${get.translation(player)}的〖解烦〗失效直到其杀死一名角色,然后你依次执行上述所有选项`]) + .set("choiceList", [`令所有攻击范围内含有你的角色依次弃置两张牌(${get.translation(targets)})`, `你摸等同于攻击范围内含有你的角色数+2的牌(${get.cnNumber(count)}张牌)`, `背水!令${get.translation(player)}的〖解烦〗失效直到其杀死一名角色,然后你依次执行上述所有选项`]) .set("ai", () => { return get.event("choice"); }) @@ -189,6 +202,7 @@ const skills = { for (const current of targets) { target.line(current, "thunder"); await current.chooseToDiscard("解烦:请弃置一张牌", "he", true); + await current.chooseToDiscard("解烦:请弃置一张牌", "he", true); } } if (control !== "选项一") { @@ -361,6 +375,7 @@ const skills = { return distance - from.countMark("sbyicong_to"); }, }, + onremove: true, marktext: "从", intro: { content: "本轮你至其他角色的距离-#", @@ -370,9 +385,10 @@ const skills = { charlotte: true, mod: { globalTo(from, to, distance) { - return distance + to.countMark("sbyicong_to"); + return distance + to.countMark("sbyicong_from"); }, }, + onremove: true, marktext: "从", intro: { content: "本轮其他角色至你的距离+#", @@ -679,8 +695,11 @@ const skills = { filterTarget(card, player, target) { return get.event("sbganglie_enabledTargets").includes(target); }, + selectTarget: [1, Infinity], + multitarget: true, + multiline: true, async content(event, trigger, player) { - event.targets[0].damage(2); + for (const target of event.targets.sortBySeat()) await target.damage(2); }, ai: { order: 6, @@ -1215,438 +1234,408 @@ const skills = { }, //曹丕 sbxingshang: { - audio: 2, - trigger: { global: ["die", "damageEnd"] }, - filter(event, player) { - if (player.countMark("sbxingshang") >= get.info("sbxingshang").getLimit) return false; - return event.name == "die" || !player.getHistory("custom", evt => evt.sbxingshang).length; - }, - forced: true, - locked: false, - async content(event, trigger, player) { - player.addMark("sbxingshang", Math.min(2, get.info("sbxingshang").getLimit - player.countMark("sbxingshang"))); - if (trigger.name == "damage") player.getHistory("custom").push({ sbxingshang: true }); - }, + getLimit: 9, + getList: [ + { + cost: 2, + prompt: () => "令一名角色复原武将牌", + filter: () => game.hasPlayer(target => target.isLinked() || target.isTurnedOver()), + filterTarget: (card, player, target) => target.isLinked() || target.isTurnedOver(), + async content(player, target) { + if (target.isLinked()) await target.link(false); + if (target.isTurnedOver()) await target.turnOver(false); + }, + ai: { + result: { + target(player, target) { + return target.isLinked() + target.isTurnedOver(); + }, + }, + }, + }, + { + cost: 2, + prompt: () => "令一名角色摸" + get.cnNumber(Math.min(5, Math.max(2, game.dead.length))) + "张牌", + filter: () => true, + filterTarget: true, + async content(player, target) { + await target.draw(Math.min(5, Math.max(2, game.dead.length))); + }, + ai: { + result: { + target(player, target) { + return get.effect(target, { name: "draw" }, player, player) * (target == player ? 3 : 1) * get.sgn(get.attitude(player, target)); + }, + }, + }, + }, + { + cost: 5, + prompt: () => "令一名体力上限小于10的角色增加1点体力上限,回复1点体力,随机恢复一个废除的装备栏", + filter: () => game.hasPlayer(target => target.maxHp < 10), + filterTarget: true, + async content(player, target) { + await target.gainMaxHp(); + await target.recover(); + let list = Array.from({ length: 13 }).map((_, i) => "equip" + parseFloat(i + 1)); + list = list.filter(i => target.hasDisabledSlot(i)); + if (list.length) await target.enableEquip(list.randomGet()); + }, + ai: { + result: { + target(player, target) { + return ( + 1 + + Array.from({ length: 13 }) + .map((_, i) => "equip" + parseFloat(i + 1)) + .some(i => target.hasDisabledSlot(i)) + ); + }, + }, + }, + }, + { + cost: 5, + prompt: () => "获得一名已阵亡角色的武将牌上的所有技能,然后失去〖行殇〗〖放逐〗〖颂威〗", + filter: () => game.dead.some(target => target.getStockSkills(true, true).some(i => get.info(i) && !get.info(i).charlotte)), + filterTarget: false, + async content(player) { + const result = await player + .chooseTarget( + "行殇:请选择一名已阵亡角色", + (card, player, target) => { + return target.isDead() && target.getStockSkills(true, true).some(i => get.info(i) && !get.info(i).charlotte); + }, + true, + "获得一名已阵亡角色的武将牌上的所有技能,然后失去〖行殇〗〖放逐〗〖颂威〗" + ) + .set("ai", target => { + return ["name", "name1", "name2"].reduce((sum, name) => { + if (!target[name] || !lib.character[target[name]] || (name == "name1" && target.name1 == target.name)) return sum; + return sum + get.rank(target[name], true); + }, 0); + }) + .set("deadTarget", true) + .forResult(); + if (result.bool) { + const target = result.targets[0]; + player.line(target); + game.log(player, "选择了", target); + await player.changeSkills( + target.getStockSkills(true, true).filter(i => get.info(i) && !get.info(i).charlotte), + ["sbxingshang", "sbfangzhu", "sbsongwei"] + ); + } + }, + ai: {}, + }, + ], marktext: "颂", intro: { name: "颂", content: "mark", }, - ai: { threaten: 2.5 }, - getLimit: 9, - getNum(num) { - const list = [2, 2, 5, 5, 1, 2, 2, 3, 3, 2]; - if ( - typeof num != "number" || - !Array.from({ length: list.length }) - .map((_, i) => i + 1) - .includes(num) - ) - return 0; - return list[num - 1]; + audio: 2, + enable: "phaseUse", + filter(event, player) { + return get.info("sbxingshang").getList.some(effect => { + return player.countMark("sbxingshang") >= effect.cost && effect.filter(player); + }); }, - getEffect(player, num) { - if (!player || typeof num != "number") return 0; - switch (num) { - //行殇选项 - case 1: //-2,重置武将牌 - if ( - game.hasPlayer(target => { - return get.attitude(player, target) > 0 && target.isTurnedOver(); - }) - ) - return 10; - return 0; - case 2: //-2,摸min(5,max(2,阵亡角色数))的牌 - return Math.min(5, Math.max(2, game.dead.length)); - case 3: //-5,加上限加血+复原装备栏 - if ( - !game.hasPlayer(target => { - return get.attitude(player, target) > 0 && target.maxHp < 10; - }) - ) - return 0; - return ( - 5 + - (game.hasPlayer(target => { - return get.attitude(player, target) > 0 && target.hasDisabledSlot(); + usable: 2, + chooseButton: { + dialog() { + let dialog = ui.create.dialog("行殇:请选择一项", "hidden"); + const list = get.info("sbxingshang").getList.slice(); + dialog.add([ + list.map(effect => { + return [effect, "移去" + effect.cost + "个“颂”标记," + effect.prompt()]; + }), + "textbutton", + ]); + return dialog; + }, + filter(button, player) { + const effect = button.link; + return player.countMark("sbxingshang") >= effect.cost && effect.filter(player); + }, + check(button) { + const player = get.event().player, + effect = button.link; + return Math.max( + ...game + .filterPlayer(target => { + const filterTarget = effect.filterTarget; + if (!filterTarget) return target == player; + if (typeof filterTarget == "function") return filterTarget(null, player, target); + return true; }) - ? 1 - : 0) - ); - case 4: //-5,劝封/化萍 - return 0; - //放逐选项 - case 5: //-1,封印基本牌外的手牌 - if ( - game.hasPlayer(target => { - return get.attitude(player, target) < 0; + .map(target => { + game.broadcastAll(effect => (lib.skill["sbxingshang_aiSkill"].ai = effect.ai), effect); + return get.effect(target, "sbxingshang_aiSkill", player, player); }) - ) - return 1; - return 0; - case 6: //-2,白板到结束 - if ( - game.hasPlayer(target => { - if (target.hasSkill("sbfangzhu_ban") || target.hasSkill("fengyin") || target.hasSkill("baiban")) return false; - return ( - get.attitude(player, target) < 0 && - ["name", "name1", "name2"].reduce((sum, name) => { - if (target[name] && (name != "name1" || target.name != target.name1)) { - if (get.character(target[name])) sum + get.rank(target[name], true); - } - return sum; - }, 0) > 5 + ); + }, + backup(links, player) { + const effect = links[0]; + return { + effect: effect, + audio: "sbxingshang", + filterCard: () => false, + selectCard: -1, + filterTarget: effect.filterTarget, + async content(event, trigger, player) { + const target = event.targets[0], + effect = lib.skill.sbxingshang_backup.effect; + player.removeMark("sbxingshang", effect.cost); + await effect.content(player, target); + }, + ai: effect.ai, + }; + }, + prompt(links, player) { + const effect = links[0], + str = "###行殇###"; + return str + '
' + "移去" + effect.cost + "个“颂”标记," + effect.prompt() + "
"; + }, + }, + ai: { + combo: "sbxingshang", + order: 8, + result: { + player(player) { + const list = get.info("sbxingshang").getList.filter(effect => { + return player.countMark("sbxingshang") >= effect.cost && effect.filter(player); + }); + return Math.max( + ...list.map(effect => { + return Math.max( + ...game + .filterPlayer(target => { + const filterTarget = effect.filterTarget; + if (!filterTarget) return target == player; + if (typeof filterTarget == "function") return filterTarget(null, player, target); + return true; + }) + .map(target => { + game.broadcastAll(effect => (lib.skill["sbxingshang_aiSkill"].ai = effect.ai), effect); + return get.effect(target, "sbxingshang_aiSkill", player, player); + }) ); }) - ) - return 6; - return 0; - case 7: //-2,强命到结束 - return 0; - case 8: //-3,翻面 - if ( - game.hasPlayer(target => { - return get.attitude(player, target) < 0 && !target.isTurnedOver(); - }) - ) - return 8; - return 0; - case 9: //-3,封印装备牌外的手牌 - if ( - game.hasPlayer(target => { - return get.attitude(player, target) < 0; - }) - ) - return 2.5; - return 0; - case 10: //-2,封印锦囊牌外的手牌 - if ( - game.hasPlayer(target => { - return get.attitude(player, target) < 0; - }) - ) - return 1.5; - return 0; - default: //其他 - return 0; - } + ); + }, + }, }, - group: "sbxingshang_use", + group: "sbxingshang_gain", subSkill: { - use: { + aiSkill: {}, + backup: {}, + gain: { audio: "sbxingshang", - enable: "phaseUse", + trigger: { global: ["die", "damageEnd"] }, filter(event, player) { - return game.hasPlayer(target => { - if (player.countMark("sbxingshang") > 1) return true; - return player.countMark("sbxingshang") && (target.isLinked() || target.isTurnedOver()); - }); + if (player.countMark("sbxingshang") >= get.info("sbxingshang").getLimit) return false; + return event.name == "die" || !player.getHistory("custom", evt => evt.sbxingshang).length; }, - usable: 2, - chooseButton: { - dialog() { - var dialog = ui.create.dialog("行殇:请选择你要执行的一项", "hidden"); - dialog.add([ - [ - [1, "移去2个“颂”标记,复原一名角色的武将牌"], - [2, "移去2个“颂”标记,令一名角色摸" + get.cnNumber(Math.min(5, Math.max(2, game.dead.length))) + "张牌"], - [3, "移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏"], - [4, "移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去〖行殇〗〖放逐〗〖颂威〗"], - ], - "textbutton", - ]); - return dialog; - }, - filter(button, player) { - if (player.countMark("sbxingshang") < get.info("sbxingshang").getNum(button.link)) return false; - switch (button.link) { - case 1: - return game.hasPlayer(target => target.isLinked() || target.isTurnedOver()); - case 2: - return true; - case 3: - return game.hasPlayer(target => target.maxHp < 10); - case 4: - return game.dead.length; - } + forced: true, + locked: false, + async content(event, trigger, player) { + player.addMark("sbxingshang", Math.min(2, get.info("sbxingshang").getLimit - player.countMark("sbxingshang"))); + if (trigger.name == "damage") player.getHistory("custom").push({ sbxingshang: true }); + }, + }, + }, + }, + sbfangzhu: { + getList: [ + { + cost: 1, + prompt: () => "令一名其他角色于手牌中只能使用基本牌直到其回合结束", + filter: player => get.mode() != "doudizhu" && game.hasPlayer(target => target != player && !target.getStorage("sbfangzhu_ban").includes("basic")), + filterTarget: (card, player, target) => target != player && !target.getStorage("sbfangzhu_ban").includes("basic"), + async content(player, target) { + target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); + target.markAuto("sbfangzhu_ban", ["basic"]); + }, + ai: { + result: { + target(player, target) { + return -target.countCards("hs") - 1; + }, }, - check(button) { - const player = get.event("player"), - info = get.info("sbxingshang"); - let list = Array.from({ length: 4 }).map((_, i) => i + 1); - list = list.filter(num => player.countMark("sbxingshang") >= info.getNum(num)); - const num = list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a))[0]; - return button.link == num ? 10 : 0; + }, + }, + { + cost: 2, + prompt: () => "令一名其他角色于手牌中只能使用锦囊牌直到其回合结束", + filter: player => game.hasPlayer(target => target != player && !target.getStorage("sbfangzhu_ban").includes("trick")), + filterTarget: (card, player, target) => target != player && !target.getStorage("sbfangzhu_ban").includes("trick"), + async content(player, target) { + target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); + target.markAuto("sbfangzhu_ban", ["trick"]); + }, + ai: { + result: { + target(player, target) { + return -target.countCards("hs") - 2; + }, }, - backup(links, player) { - return { - num: links[0], - audio: "sbxingshang", - filterCard: () => false, - selectCard: -1, - filterTarget(card, player, target) { - switch (lib.skill.sbxingshang_use_backup.num) { - case 1: - return target => target.isLinked() || target.isTurnedOver(); - case 2: - return true; - case 3: - return target.maxHp < 10; - case 4: - return target == player; - } - }, - selectTarget: () => (lib.skill.sbxingshang_use_backup.num == 4 ? -1 : 1), - async content(event, trigger, player) { - const target = event.targets[0]; - const num = lib.skill.sbxingshang_use_backup.num; - player.removeMark("sbxingshang", get.info("sbxingshang").getNum(num)); - switch (num) { - case 1: { - if (target.isLinked()) target.link(false); - if (target.isTurnedOver()) target.turnOver(); - break; - } - case 2: { - target.draw(Math.min(5, Math.max(2, game.dead.length))); - break; - } - case 3: { - target.gainMaxHp(); - target.recover(); - let list = []; - for (let i = 1; i <= 5; i++) { - if (target.hasDisabledSlot(i)) list.push("equip" + i); - } - if (list.length) target.enableEquip(list.randomGet()); - break; - } - case 4: { - const result = await player - .chooseTarget( - "行殇:请选择一名已阵亡角色", - (card, player, target) => { - return target.isDead(); - }, - true, - "获得一名已阵亡角色的所有技能,然后失去〖行殇〗〖放逐〗〖颂威〗" - ) - .set("ai", target => { - return ["name", "name1", "name2"].reduce((sum, name) => { - if (!target[name] || !lib.character[target[name]] || (name == "name1" && target.name1 == target.name)) return sum; - return sum + get.rank(target[name], true); - }, 0); - }) - .set("deadTarget", true) - .forResult(); - if (result.bool) { - const target2 = result.targets[0]; - player.line(target2); - game.log(player, "选择了", target2); - await player.changeSkills(target2.getStockSkills(true, true), ["sbxingshang", "sbfangzhu", "sbsongwei"]); - } - } - } - }, - ai: { - result: { - target(player, target) { - switch (lib.skill.sbxingshang_use_backup.num) { - case 1: { - let num = 0; - if (target.isLinked() && !target.hasSkill("nzry_jieying")) num += 0.5; - if (target.isTurnedOver()) num += 10; - return num; - } - case 2: { - return get.effect(target, { name: "draw" }, player, player); - } - case 3: { - return Math.max(0, get.recoverEffect(target, player, player)) + get.attitude(player, target); - } - case 4: { - return 1; - } - } - }, - }, - }, - }; + }, + }, + { + cost: 3, + prompt: () => "令一名其他角色于手牌中只能使用装备牌直到其回合结束", + filter: player => get.mode() != "doudizhu" && game.hasPlayer(target => target != player && !target.getStorage("sbfangzhu_ban").includes("equip")), + filterTarget: (card, player, target) => target != player && !target.getStorage("sbfangzhu_ban").includes("equip"), + async content(player, target) { + target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); + target.markAuto("sbfangzhu_ban", ["equip"]); + }, + ai: { + result: { + target(player, target) { + return -target.countCards("hs") - 1; + }, }, - prompt(links, player) { - const str = "###行殇###"; - switch (links[0]) { - case 1: - return str + "移去2个“颂”标记,复原一名角色的武将牌"; - case 2: - return str + "移去2个“颂”标记,令一名角色摸" + get.cnNumber(Math.min(5, Math.max(2, game.dead.length))) + "张牌"; - case 3: - return str + "移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限并回复1点体力,然后随机恢复一个被废除的装备栏"; - case 4: - return str + "移去5个“颂”标记,获得一名已阵亡角色的所有技能,然后失去〖行殇〗〖放逐〗〖颂威〗"; - } + }, + }, + { + cost: 2, + prompt: () => "令一名其他角色的非Charlotte技能失效直到其回合结束", + filter: player => get.mode() != "doudizhu" && game.hasPlayer(target => target != player), + filterTarget: lib.filter.notMe, + async content(player, target) { + target.addTempSkill("baiban", { player: "phaseEnd" }); + }, + ai: { + result: { + target(player, target) { + return -target.getSkills(null, false).filter(i => get.info(i) && !get.info(i).charlotte).length; + }, }, }, + }, + { + cost: 2, + prompt: () => "令一名其他角色不能响应除其外的角色使用的牌直到其回合结束", + filter: player => get.mode() != "doudizhu" && game.hasPlayer(target => target != player && !target.hasSkill("sbfangzhu_kill")), + filterTarget: lib.filter.notMe, + async content(player, target) { + target.addTempSkill("sbfangzhu_kill", { player: "phaseEnd" }); + }, + ai: {}, + }, + { + cost: 3, + prompt: () => "令一名其他角色将武将牌翻面", + filter: player => get.mode() != "doudizhu" && game.hasPlayer(target => target != player), + filterTarget: lib.filter.notMe, + async content(player, target) { + await target.turnOver(); + }, ai: { - order(_, player) { - const info = get.info("sbxingshang"); - const goon = player.hasSkill("sbfangzhu") && (player.getStat("skill").sbfangzhu || 0) < (get.info("sbfangzhu").usable || Infinity); - let list = Array.from({ length: goon ? 10 : 4 }).map((_, i) => i + 1); - list = list.filter(num => player.countMark("sbxingshang") >= info.getNum(num)); - list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a)); - return Array.from({ length: 4 }) - .map((_, i) => i + 1) - .includes(list[0]) && info.getEffect(player, list[0]) > 0 - ? 1 - : 0; + result: { + target(player, target) { + return target.isTurnedOver() ? 1 : -1; + }, }, - result: { player: 1 }, }, }, - use_backup: {}, - }, - }, - sbfangzhu: { + ], audio: 2, audioname: ["mb_caomao"], enable: "phaseUse", filter(event, player) { - return player.hasMark("sbxingshang"); + return get.info("sbfangzhu").getList.some(effect => { + return player.countMark("sbxingshang") >= effect.cost && effect.filter(player); + }); }, usable: 1, chooseButton: { dialog() { - var dialog = ui.create.dialog("放逐:请选择你要执行的一项", "hidden"); + let dialog = ui.create.dialog("放逐:请选择一项", "hidden"); + const list = get.info("sbfangzhu").getList.slice(); dialog.add([ - [ - [1, "移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束"], - [2, "移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束"], - [3, "移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束"], - [4, "移去3个“颂”标记,令一名其他角色将武将牌翻面"], - [5, "移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束"], - [6, "移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束"], - ], + list.map(effect => { + return [effect, "移去" + effect.cost + "个“颂”标记," + effect.prompt()]; + }), "textbutton", ]); return dialog; }, filter(button, player) { - if (player.countMark("sbxingshang") < get.info("sbxingshang").getNum(button.link + 4)) return false; - return game.hasPlayer(target => { - if (target == player) return false; - const num = button.link, - storage = target.getStorage("sbfangzhu_ban"); - return !((num == 1 && storage.includes("basic")) || (num == 5 && storage.includes("equip")) || (num == 6 && storage.includes("trick"))); - }); + const effect = button.link; + return player.countMark("sbxingshang") >= effect.cost && effect.filter(player); }, check(button) { - const player = get.event("player"), - info = get.info("sbxingshang"); - let list = Array.from({ length: 6 }).map((_, i) => i + 1); - list = list.filter(num => player.countMark("sbxingshang") >= info.getNum(num + 4)); - const num = list.sort((a, b) => info.getEffect(player, b + 4) - info.getEffect(player, a + 4))[0] - 4; - return button.link == num ? 10 : 0; + const player = get.event().player, + effect = button.link; + return Math.max( + ...game + .filterPlayer(target => { + const filterTarget = effect.filterTarget; + if (!filterTarget) return target == player; + if (typeof filterTarget == "function") return filterTarget(null, player, target); + return true; + }) + .map(target => { + game.broadcastAll(effect => (lib.skill["sbxingshang_aiSkill"].ai = effect.ai), effect); + return get.effect(target, "sbxingshang_aiSkill", player, player); + }) + ); }, backup(links, player) { + const effect = links[0]; return { - num: links[0], + effect: effect, audio: "sbfangzhu", audioname: ["mb_caomao"], filterCard: () => false, selectCard: -1, - filterTarget(card, player, target) { - if (target == player) return false; - const num = lib.skill.sbfangzhu_backup.num, - storage = target.getStorage("sbfangzhu_ban"); - return !((num == 1 && storage.includes("basic")) || (num == 5 && storage.includes("equip")) || (num == 6 && storage.includes("trick"))); - }, + filterTarget: effect.filterTarget, async content(event, trigger, player) { - const target = event.target; - const num = lib.skill.sbfangzhu_backup.num; - player.removeMark("sbxingshang", get.info("sbxingshang").getNum(num + 4)); - switch (num) { - case 1: - case 5: - case 6: { - const type = ["basic", "equip", "trick"][[1, 5, 6].indexOf(num)]; - target.addTempSkill("sbfangzhu_ban", { player: "phaseEnd" }); - target.markAuto("sbfangzhu_ban", [type]); - break; - } - case 2: { - target.addTempSkill("baiban", { player: "phaseEnd" }); - break; - } - case 3: { - target.addTempSkill("sbfangzhu_kill", { player: "phaseEnd" }); - break; - } - case 4: { - target.turnOver(); - break; - } - } - }, - ai: { - result: { - target(player, target) { - switch (lib.skill.sbfangzhu_backup.num) { - case 1: - return -target.countCards("h", card => get.type(card) != "basic") - 1; - case 2: - return -target.getSkills(null, null, false).reduce((sum, skill) => { - return sum + Math.max(get.skillRank(skill, "out"), get.skillRank(skill, "in")); - }, 0); - case 3: - return 0; - case 4: - if (get.attitude(player, target) > 0 && target.isTurnedOver()) return 10 * target.countCards("hs") + 1; - if (get.attitude(player, target) < 0 && !target.isTurnedOver()) return -5 * target.countCards("hs") + 1; - return 0; - case 5: - return -target.countCards("h", card => get.type(card) != "equip") - 3; - case 6: - return -target.countCards("h", card => get.type2(card) != "trick") - 2; - } - }, - }, + const target = event.targets[0], + effect = lib.skill.sbfangzhu_backup.effect; + player.removeMark("sbxingshang", effect.cost); + await effect.content(player, target); }, + ai: effect.ai, }; }, prompt(links, player) { - const str = "###放逐###"; - switch (links[0]) { - case 1: - return str + "移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束"; - case 2: - return str + "移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束"; - case 3: - return str + "移去2个“颂”标记,令一名其他角色不能响应除其外的角色使用的牌直到其回合结束"; - case 4: - return str + "移去3个“颂”标记,令一名其他角色将武将牌翻面"; - case 5: - return str + "移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束"; - case 6: - return str + "移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束"; - } + const effect = links[0], + str = "###放逐###"; + return str + '
' + "移去" + effect.cost + "个“颂”标记," + effect.prompt() + "
"; }, }, ai: { - order(_, player) { - const info = get.info("sbxingshang"); - const goon = player.hasSkill("sbxingshang") && (player.getStat("skill").sbxingshang_use || 0) < (info.subSkill.use.usable || Infinity); - let list = Array.from({ length: goon ? 10 : 6 }).map((_, i) => i + (goon ? 1 : 5)); - list = list.filter(num => player.countMark("sbxingshang") >= info.getNum(num)); - list.sort((a, b) => info.getEffect(player, b) - info.getEffect(player, a)); - return Array.from({ length: 6 }) - .map((_, i) => i + 5) - .includes(list[0]) && info.getEffect(player, list[0]) > 0 - ? 1 - : 0; - }, - result: { player: 1 }, combo: "sbxingshang", + order: 7, + result: { + player(player) { + const list = get.info("sbfangzhu").getList.filter(effect => { + return player.countMark("sbxingshang") >= effect.cost && effect.filter(player); + }); + return Math.max( + ...list.map(effect => { + return Math.max( + ...game + .filterPlayer(target => { + const filterTarget = effect.filterTarget; + if (!filterTarget) return target == player; + if (typeof filterTarget == "function") return filterTarget(null, player, target); + return true; + }) + .map(target => { + game.broadcastAll(effect => (lib.skill["sbxingshang_aiSkill"].ai = effect.ai), effect); + return get.effect(target, "sbxingshang_aiSkill", player, player); + }) + ); + }) + ); + }, + }, }, subSkill: { backup: {}, @@ -1680,13 +1669,17 @@ const skills = { mod: { cardEnabled(card, player) { const storage = player.getStorage("sbfangzhu_ban"); - if (get.itemtype(card) == "card" && get.position(card) != "h") return; - if (storage.length > 1 || !storage.includes(get.type2(card))) return false; + const hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + if (cards.containsSome(...hs) && (storage.length > 1 || !storage.includes(get.type2(card)))) return false; }, cardSavable(card, player) { const storage = player.getStorage("sbfangzhu_ban"); - if (get.itemtype(card) == "card" && get.position(card) != "h") return; - if (storage.length > 1 || !storage.includes(get.type2(card))) return false; + const hs = player.getCards("h"), + cards = [card]; + if (Array.isArray(card.cards)) cards.addArray(card.cards); + if (cards.containsSome(...hs) && (storage.length > 1 || !storage.includes(get.type2(card)))) return false; }, }, }, @@ -1948,7 +1941,7 @@ const skills = { }, filterCardx: function (card, player) { if (player.getStorage("sbqicai").includes(card.name)) return false; - return get.type(card) == "equip" && game.hasPlayer(target => target != player && target.hasEmptySlot(get.subtype(card))); + return (get.mode() == "doudizhu" ? get.subtype(card) == "equip2" : get.type(card) == "equip") && game.hasPlayer(target => target != player && target.hasEmptySlot(get.subtype(card))); }, usable: 1, chooseButton: { @@ -2193,7 +2186,7 @@ const skills = { audio: "sbhuoji2.mp3", trigger: { player: "phaseZhunbeiBegin" }, filter: function (event, player) { - return player.getAllHistory("sourceDamage", evt => evt.hasNature("fire")).reduce((num, evt) => num + evt.num, 0) >= game.players.length + game.dead.length; + return player.getAllHistory("sourceDamage", evt => evt.hasNature("fire") && evt.player != player).reduce((num, evt) => num + evt.num, 0) >= game.players.length + game.dead.length; }, forced: true, locked: false, @@ -2229,7 +2222,7 @@ const skills = { player.addTempSkill("sbhuoji_count", { player: ["sbhuoji_achieveBegin", "sbhuoji_failBegin"], }); - player.storage.sbhuoji_count = player.getAllHistory("sourceDamage", evt => evt.hasNature("fire")).reduce((num, evt) => num + evt.num, 0); + player.storage.sbhuoji_count = player.getAllHistory("sourceDamage", evt => evt.hasNature("fire") && evt.player != player).reduce((num, evt) => num + evt.num, 0); player.markSkill("sbhuoji_count"); }, }, @@ -2720,7 +2713,7 @@ const skills = { target.removeSkill(skills); num += skills.length; }); - if (get.mode() != "identity") num += 2; + if (get.mode() == "versus" && _status.mode == "two") num += 2; player.draw(num); }, }, @@ -3031,7 +3024,6 @@ const skills = { check: function (event, player) { return get.attitude(player, event.target) <= 0 || game.hasPlayer(current => get.damageEffect(current, player, player) > 0); }, - shaRelated: true, logTarget: "target", content: function () { "step 0"; @@ -3159,7 +3151,6 @@ const skills = { player: "useCardToPlayered", target: "useCardToTargeted", }, - shaRelated: true, filter: function (event, player) { if (!(event.card.name == "juedou" || (event.card.name == "sha" && get.color(event.card) == "red"))) return false; return true; @@ -5379,7 +5370,6 @@ const skills = { else player.draw(2); } }, - shaRelated: true, ai: { ignoreSkill: true, skillTagFilter: function (player, tag, arg) { @@ -6991,7 +6981,7 @@ const skills = { filter: function (event, player) { return player.group == "shu" && game.hasPlayer(current => current != player && current.countCards("e")); }, - groupSkill: true, + groupSkill: "shu", filterTarget: function (card, player, target) { return target.countCards("e") && target != player; }, @@ -7043,7 +7033,7 @@ const skills = { }, forced: true, locked: false, - groupSkill: true, + groupSkill: "wu", filter: function (event, player) { if (player.group != "wu") return false; var evt = event.getl(player); @@ -7745,6 +7735,170 @@ const skills = { } }, }, + //陆逊 + sbqianxun: { + audio: 2, + trigger: { + target: "useCardToBegin", + player: "judgeBefore", + }, + filter: function (event, player) { + if (!event.card || player.getStorage("sbqianxun").includes(event.card.viewAs || event.card.name)) return false; + if (event.getParent().name == "phaseJudge") return true; + if (event.name == "judge") return false; + if (get.type(event.card) == "trick" && event.player != player) return true; + }, + forced: true, + locked: false, + async content(event, trigger, player) { + player.markAuto("sbqianxun", [trigger.card.viewAs || trigger.card.name]); + if (player.countCards("he")) { + const num = Math.min(5, player.getStorage("sbqianxun").length); + const result = await player.chooseCard(get.prompt(event.name), "将至多" + get.cnNumber(num) + "张牌置于武将牌上", "he", [1, num]).set("ai", function (card) { + return 4 - get.value(card); + }).forResult(); + if (result.bool) { + player.addToExpansion(result.cards, "giveAuto", player).gaintag.add("sbqianxun_gain"); + player.addSkill("sbqianxun_gain"); + } + } + }, + onremove: true, + intro: { + content: "已记录牌名:$", + }, + group: "sbqianxun_use", + subSkill: { + use: { + audio: "sbqianxun", + trigger: { + player: "phaseUseBegin", + }, + filter: function (event, player) { + return player.getStorage("sbqianxun").some(name => { + if (get.type(name) != "trick") return false; + return player.hasUseTarget(name); + }); + }, + async cost(event, trigger, player) { + const list = player.getStorage("sbqianxun").map(name => ["锦囊", "", name]); + const result = await player.chooseButton([get.prompt("sbqianxun"), "移去一个记录的牌名,若为普通锦囊牌则可以视为使用之", [list, "vcard"]]).set("ai", function (button) { + const card = { name: button.link[2], isCard: true }; + return player.getUseValue(card); + }).set("filterButton", function (button) { + return true; + }).forResult(); + event.result = { + bool: result.bool, + cost_data: result.bool ? result.links[0][2] : [], + }; + }, + async content(event, trigger, player) { + const name = event.cost_data; + player.unmarkAuto("sbqianxun", [name]); + const card = { name: name, isCard: true }; + if (get.type(card) == "trick" && player.hasUseTarget(card)) await player.chooseUseTarget(card,`是否视为使用【${get.translation(name)}】?`); + }, + }, + gain: { + trigger: { + global: "phaseEnd", + }, + forced: true, + charlotte: true, + async content(event, trigger, player) { + var cards = player.getExpansions("sbqianxun_gain"); + if (cards.length) await player.gain(cards, "draw"); + player.removeSkill("sbqianxun_gain"); + }, + intro: { + mark: function (dialog, storage, player) { + var cards = player.getExpansions("sbqianxun_gain"); + if (player.isUnderControl(true)) dialog.addAuto(cards); + else return "共有" + get.cnNumber(cards.length) + "张牌"; + }, + markcount: "expansion", + }, + }, + }, + }, + sblianying: { + audio: 2, + trigger: { + global: "phaseEnd", + }, + filter:function(event,player){ + if(player==event.player) return false; + return player.getHistory("lose",evt=>evt.cards2 && evt.cards2.length ).length; + }, + async content(event,trigger,player){ + let num = 0; + player.getHistory("lose", evt => { + if (evt.cards2) num += evt.cards2.length; + }); + num = Math.min(5, num); + const { cards } = await game.cardsGotoOrdering(get.cards(num)); + if (_status.connectMode) + game.broadcastAll(function () { + _status.noclearcountdown = true; + }); + const give_map = {}; + if (!cards.length) return; + do { + const { + result: { bool, links }, + } = + cards.length == 1 + ? { result: { links: cards.slice(0), bool: true } } + : await player.chooseCardButton("连营:请选择要分配的牌", true, cards, [1, cards.length]).set("ai", () => { + if (ui.selected.buttons.length == 0) return 1; + return 0; + }); + if (!bool) return; + cards.removeArray(links); + const togive = links.slice(0); + const { + result: { targets }, + } = await player + .chooseTarget("选择一名角色获得" + get.translation(links), true) + .set("ai", target => { + const att = get.attitude(_status.event.player, target); + if (_status.event.enemy) { + return -att; + } else if (att > 0) { + return att / (1 + target.countCards("h")); + } else { + return att / 100; + } + }) + .set("enemy", get.value(togive[0], player, "raw") < 0); + if (targets.length) { + const id = targets[0].playerid, + map = give_map; + if (!map[id]) map[id] = []; + map[id].addArray(togive); + } + } while (cards.length > 0); + if (_status.connectMode) { + game.broadcastAll(function () { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + const list = []; + for (const i in give_map) { + const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + if (player !== source && (get.mode() !== "identity" || player.identity !== "nei")) player.addExpose(0.2); + list.push([source, give_map[i]]); + } + game.loseAsync({ + gain_list: list, + giver: player, + animate: "draw", + }).setContent("gaincardMultiple"); + }, + }, }; export default skills; diff --git a/character/sb/sort.js b/character/sb/sort.js index 4566fbf89a..4430fb3b53 100644 --- a/character/sb/sort.js +++ b/character/sb/sort.js @@ -2,9 +2,9 @@ const characterSort = { sb_zhi: ["sb_sunquan", "sb_zhouyu", "sb_zhangjiao", "sb_caocao", "sb_zhenji", "sb_liubei", "sb_daqiao", "sb_liubiao", "sb_sp_zhugeliang", "sb_xunyu"], sb_shi: ["sb_xuhuang", "sb_machao", "sb_fazheng", "sb_chengong", "sb_diaochan", "sb_pangtong", "sb_zhanghe", "sb_caopi", "sb_ganning", "sb_handang"], sb_tong: ["liucheng", "sp_yangwan", "sb_xiahoushi", "sb_zhangfei", "sb_zhaoyun", "sb_sunce", "sb_zhurong", "sb_xiaoqiao", "sb_xiahoudun"], - sb_yu: ["sb_yujin", "sb_lvmeng", "sb_huangzhong", "sb_huanggai", "sb_zhouyu", "sb_caoren", "sb_yl_luzhi", "sb_huangyueying"], + sb_yu: ["sb_yujin", "sb_lvmeng", "sb_huangzhong", "sb_huanggai", "sb_zhouyu", "sb_caoren", "sb_yl_luzhi", "sb_huangyueying", "sb_luxun"], sb_neng: ["sb_huaxiong", "sb_sunshangxiang", "sb_jiangwei", "sb_yuanshao", "sb_menghuo", "sb_guanyu", "sb_gaoshun", "sb_gongsunzan"], - // sb_waitforsort:[], + sb_waitforsort: [], }; const characterSortTranslate = { diff --git a/character/sb/translate.js b/character/sb/translate.js index c5ed0dd66c..d07d355724 100644 --- a/character/sb/translate.js +++ b/character/sb/translate.js @@ -32,6 +32,7 @@ const translates = { sb_liubiao_prefix: "谋", sb_zhurong_prefix: "谋", sb_menghuo_prefix: "谋", + sb_luxun_prefix: "谋", sp_yangwan: "谋杨婉", spmingxuan: "瞑昡", spmingxuan_info: "锁定技。出牌阶段开始时,你须选择至多X张花色各不相同的手牌(X为未选择过选项一的角色),将这些牌随机交给这些角色中的等量角色。然后这些角色依次选择一项:⒈对你使用一张【杀】。⒉交给你一张牌,然后你摸一张牌。", @@ -219,7 +220,7 @@ const translates = { sb_sp_zhugeliang: "谋诸葛亮", sb_sp_zhugeliang_prefix: "谋", sbhuoji: "火计", - sbhuoji_info: "使命技。①使命:出牌阶段限一次。你可以对一名其他角色造成1点火焰伤害,然后你对所有与其势力相同的不为其的其他角色各造成1点火焰伤害。②成功:准备阶段,若你本局游戏已造成的火焰伤害不小于本局游戏总角色数,则你失去〖火计〗和〖看破〗,然后获得〖观星〗和〖空城〗。③失败:使命成功前进入濒死状态。", + sbhuoji_info: "使命技。①使命:出牌阶段限一次。你可以对一名其他角色造成1点火焰伤害,然后你对所有与其势力相同的不为其的其他角色各造成1点火焰伤害。②成功:准备阶段,若你本局游戏已对其他角色造成的火焰伤害不小于本局游戏总角色数,则你失去〖火计〗和〖看破〗,然后获得〖观星〗和〖空城〗。③失败:使命成功前进入濒死状态。", sbkanpo: "看破", sbkanpo_info: "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录4个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", sbkanpo_info_doudizhu: "①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录任意个未于上次发动〖看破①〗记录清除过的非装备牌牌名(对其他角色不可见,每局游戏至多记录2个牌名)。②其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录令此牌无效,然后你摸一张牌。", @@ -233,7 +234,7 @@ const translates = { sbqicai: "奇才", sbqicai_backup: "奇才", sbqicai_info: "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏,然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", - sbqicai_info_doudizhu: "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏(每种牌名的装备牌每局游戏限选择一次),然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", + sbqicai_info_doudizhu: "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张防具牌置于一名其他角色的对应装备栏(每种牌名的装备牌每局游戏限选择一次),然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", sbjizhi: "集智", sbjizhi_info: "锁定技,当你使用一张普通锦囊牌时,你摸一张牌,且此牌本回合不计入你的手牌上限。", sb_guanyu: "谋关羽", @@ -249,9 +250,10 @@ const translates = { sbxingshang: "行殇", sbxingshang_info: "①当一名角色受到伤害后(每回合限一次)或死亡时,你获得2个“颂”标记(你至多拥有9个“颂”标记)。②出牌阶段限两次,你可以:1.移去2个“颂”标记,令一名角色复原武将牌;2.移去2个“颂”标记,令一名角色摸X张牌(X为场上阵亡角色数,且X至少为2,至多为5);3.移去5个“颂”标记,令一名体力上限小于10的角色加1点体力上限,回复1点体力,随机恢复一个已废除的装备栏;4.移去5个“颂”标记,获得一名阵亡角色武将牌上的所有技能,然后你失去〖行殇〗〖放逐〗〖颂威〗。", sbfangzhu: "放逐", - sbfangzhu_info: "出牌阶段限一次,你可以:1.移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束;2.移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束;3.移去2个“颂”标记,令一名其他角色不能响应除其以外的角色使用的牌直到其回合结束;4.移去3个“颂”标记,令一名其他角色将武将牌翻面;5.移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束;6.移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束。", + sbfangzhu_info: "出牌阶段限一次,你可以:1.移去1个“颂”标记,令一名其他角色于手牌中只能使用基本牌直到其回合结束;2.移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束。3.移去3个“颂”标记,令一名其他角色于手牌中只能使用装备牌直到其回合结束;4.移去2个“颂”标记,令一名其他角色的非Charlotte技能失效直到其回合结束;5.移去2个“颂”标记,令一名其他角色不能响应除其以外的角色使用的牌直到其回合结束;6.移去3个“颂”标记,令一名其他角色将武将牌翻面;", + sbfangzhu_info_doudizhu: "出牌阶段限一次,你可以:1.移去2个“颂”标记,令一名其他角色于手牌中只能使用锦囊牌直到其回合结束。2.移去2个“颂”标记,令一名其他角色不能响应除其以外的角色使用的牌直到其回合结束;3.移去3个“颂”标记,令一名其他角色将武将牌翻面;", sbsongwei: "颂威", - sbsongwei_info: "主公技。①出牌阶段开始时,你获得Y个“颂”标记(Y为场上其他魏势力角色数的两倍)。②每局游戏限一次,出牌阶段,你可以令一名其他魏势力角色失去所有武将牌的技能。", + sbsongwei_info: "主公技。①出牌阶段开始时,你获得Y个“颂”标记(Y为场上其他魏势力角色数的两倍)。②每局游戏限一次,出牌阶段,你可以令一名其他魏势力角色失去所有其武将牌上的技能。", sb_xunyu: "谋荀彧", sb_xunyu_prefix: "谋", sbquhu: "驱虎", @@ -261,7 +263,7 @@ const translates = { sb_xiahoudun: "谋夏侯惇", sb_xiahoudun_prefix: "谋", sbganglie: "刚烈", - sbganglie_info: "出牌阶段限一次。你可以选择一名本局游戏对你造成过伤害且你以此法选择过其的次数小于2的角色,你对其造成1点伤害。", + sbganglie_info: "出牌阶段限一次。你可以选择任意名本局游戏对你造成过伤害且你以此法选择过其的次数小于2的角色,你对其造成2点伤害。", sbqingjian: "清俭", sbqingjian_info: "①当有一张牌不因使用而进入弃牌堆后,若你的“清俭”数小于X,你将此牌置于你的武将牌上,称为“清俭”(X为你的体力值-1,且至少为1)。②出牌阶段结束时,你将所有“清俭”分配给任意角色。", sb_gaoshun: "谋高顺", @@ -276,13 +278,18 @@ const translates = { sbgongqi: "弓骑", sbgongqi_info: "①出牌阶段开始时,你可以弃置一张牌,然后本阶段你获得如下效果:当你使用牌时,你令所有其他角色不能使用或打出与你弃置牌颜色不同的手牌响应此牌。②你的攻击范围+4。", sbjiefan: "解烦", - sbjiefan_info: "出牌阶段限一次。你可以令一名角色选择一项:⒈令所有攻击范围内含有其的角色依次弃置一张牌;⒉其摸等同于攻击范围内含有其的角色数的牌(至多两张);⒊背水:此技能失效直到你杀死一名角色,然后依次执行上述所有选项。", + sbjiefan_info: "出牌阶段限一次。你可以令一名角色选择一项:⒈令所有攻击范围内含有其的角色依次弃置两张牌;⒉其摸等同于攻击范围内含有其的角色数+2的牌;⒊背水:此技能失效直到你杀死一名角色,然后依次执行上述所有选项。", sb_gongsunzan: "谋公孙瓒", sb_gongsunzan_prefix: "谋", sbyicong: "义从", sbyicong_info: "蓄力技(2/4)。①一轮游戏开始时,你可以消耗任意点蓄力值并选择一项:⒈你于本轮内至其他角色的距离-X,令系统选择牌堆中的一张【杀】;⒉其他角色于本轮内至你的距离+X,令系统选择牌堆中的一张【闪】(X为你消耗的蓄力值)。然后若你的“扈”数小于4,你将系统选择的牌置于武将牌上,称为“扈”。②你可以将“扈”如手牌般使用或打出。", sbqiaomeng: "趫猛", sbqiaomeng_info: "当你使用【杀】造成伤害后,若你有〖义从〗,你可以选择一项:⒈弃置受伤角色区域里的一张牌并摸一张牌;⒉获得2点蓄力值。", + sb_luxun: "谋陆逊", + sbqianxun: "谦逊", + sbqianxun_info: "当一张锦囊牌对你生效时,若此牌名未记录且你不是使用者,则你记录之,然后可将至多X张牌置于你的武将牌上,此回合结束时获得(X为“谦逊”记录的牌名数且至多为5)。出牌阶段开始时,你可以移去一个记录的牌名,若为普通锦囊牌则可以视为使用此牌。", + sblianying: "连营", + sblianying_info: "其他角色的回合结束时,你可以观看牌堆顶的X张牌,然后将这些牌交给任意角色(X为你本回合失去的牌数,至多为5)。", }; export default translates; diff --git a/character/sb/voices.js b/character/sb/voices.js index 49685cb4cd..ee62dd2386 100644 --- a/character/sb/voices.js +++ b/character/sb/voices.js @@ -1,4 +1,9 @@ export default { + "#sbqianxun1": "虽有戈矛之刺,不如恭俭之利也。", + "#sbqianxun2": "贤者任重而行恭,知者功大而辞顺。", + "#sblianying1": "蜀营连绵百里,正待吾燎原一炬!", + "#sblianying2": "蜀军虚实已知,吾等不日便破也。", + "#sb_luxun:die": "心淤岂容有污,今唯以死自证……", "#sbxianzhen1": "陷阵营中,皆是以一敌百之士!", "#sbxianzhen2": "军令既出,使命必完!", "#sbjinjiu1": "军规严戒,不容稍纵形骸!", diff --git a/character/shenhua/character.js b/character/shenhua/character.js index f11aa7b2a3..a172729635 100644 --- a/character/shenhua/character.js +++ b/character/shenhua/character.js @@ -4,20 +4,20 @@ const characters = { old_caoren: ["male", "wei", 4, ["jushou"], ["die:new_caoren"]], re_xuhuang: ["male", "wei", 4, ["duanliang", "jiezi"]], re_pangde: ["male", "qun", 4, ["mashu", "jianchu"]], - re_xiahouyuan: ["male", "wei", 4, ["xinshensu"]], + re_xiahouyuan: ["male", "wei", 4, ["xinshensu"], ["name:夏侯|渊"]], re_weiyan: ["male", "shu", 4, ["xinkuanggu", "qimou"]], - xiaoqiao: ["female", "wu", 3, ["retianxiang", "hongyan"]], + xiaoqiao: ["female", "wu", 3, ["retianxiang", "hongyan"], ["name:桥|null"]], sp_zhangjiao: ["male", "qun", 3, ["releiji", "guidao", "huangtian"], ["zhu"]], re_yuji: ["male", "qun", 3, ["xinfu_guhuo"]], // yuji:['male','qun',3,['guhuo']], // xin_yuji:['male','qun',3,['guhuo']], - sp_zhugeliang: ["male", "shu", 3, ["bazhen", "huoji", "kanpo"]], + sp_zhugeliang: ["male", "shu", 3, ["bazhen", "huoji", "kanpo"], ["name:诸葛|亮"]], pangtong: ["male", "shu", 3, ["lianhuan", "oldniepan"]], xunyu: ["male", "wei", 3, ["quhu", "jieming"], ["clan:颍川荀氏"]], dianwei: ["male", "wei", 4, ["qiangxix"]], - taishici: ["male", "wu", 4, ["tianyi"]], - yanwen: ["male", "qun", 4, ["shuangxiong"]], + taishici: ["male", "wu", 4, ["tianyi"], ["name:太史|慈"]], + yanwen: ["male", "qun", 4, ["shuangxiong"], ["name:颜|良-文|丑"]], re_yuanshao: ["male", "qun", 4, ["luanji", "xueyi"], ["zhu"]], menghuo: ["male", "shu", 4, ["huoshou", "zaiqixx"]], @@ -33,7 +33,7 @@ const characters = { zhanghe: ["male", "wei", 4, ["qiaobian"]], dengai: ["male", "wei", 4, ["tuntian", "zaoxian"]], sunce: ["male", "wu", 4, ["jiang", "hunzi", "zhiba"], ["zhu"]], - zhangzhang: ["male", "wu", 3, ["zhijian", "guzheng"]], + zhangzhang: ["male", "wu", 3, ["zhijian", "guzheng"], ["name:张|昭-张|纮"]], caiwenji: ["female", "qun", 3, ["beige", "duanchang"]], zuoci: ["male", "qun", 3, ["huashen", "xinsheng"]], @@ -44,16 +44,16 @@ const characters = { sunliang: ["male", "wu", 3, ["nzry_kuizhu", "nzry_zhizheng", "nzry_lijun"], ["zhu"]], xuyou: ["male", "qun", 3, ["nzry_chenglve", "nzry_shicai", "nzry_cunmu"]], yl_luzhi: ["male", "qun", 3, ["nzry_mingren", "nzry_zhenliang"], []], - kuailiangkuaiyue: ["male", "wei", 3, ["nzry_jianxiang", "nzry_shenshi"], []], + kuailiangkuaiyue: ["male", "wei", 3, ["nzry_jianxiang", "nzry_shenshi"], ["name:蒯|良-蒯|越"]], - guanqiujian: ["male", "wei", 4, ["zhengrong", "hongju"]], + guanqiujian: ["male", "wei", 4, ["zhengrong", "hongju"], ["name:毌丘|俭"]], haozhao: ["male", "wei", 4, ["drlt_zhenggu"], []], - zhugezhan: ["male", "shu", 3, ["xinfu_zuilun", "xinfu_fuyin"], []], + zhugezhan: ["male", "shu", 3, ["xinfu_zuilun", "xinfu_fuyin"], ["name:诸葛|瞻"]], lukang: ["male", "wu", 4, ["drlt_qianjie", "drlt_jueyan", "drlt_poshi"], []], yl_yuanshu: ["male", "qun", 4, ["drlt_yongsi", "drlt_weidi"], ["zhu"]], zhangxiu: ["male", "qun", 4, ["drlt_xiongluan", "drlt_congjian", "twjuxiang"], ["zhu"]], chendao: ["male", "shu", 4, ["dcwanglie"], []], - zhoufei: ["female", "wu", 3, ["olliangyin", "olkongsheng"]], + zhoufei: ["female", "wu", 3, ["olliangyin", "olkongsheng"], ["name:周|null"]], }; export default characters; diff --git a/character/shenhua/characterReplace.js b/character/shenhua/characterReplace.js index ce19a87539..a7dd2561e3 100644 --- a/character/shenhua/characterReplace.js +++ b/character/shenhua/characterReplace.js @@ -2,13 +2,13 @@ const characterReplaces = { caoren: ["caoren", "old_caoren", "sb_caoren", "new_caoren", "star_caoren"], sp_caoren: ["sp_caoren", "jsp_caoren"], xiahouyuan: ["re_xiahouyuan", "ol_xiahouyuan", "xiahouyuan"], - huangzhong: ["re_huangzhong", "ol_huangzhong", "sb_huangzhong", "huangzhong", "jsrg_huangzhong"], + huangzhong: ["re_huangzhong", "ol_huangzhong", "sb_huangzhong", "huangzhong", "jsrg_huangzhong", "yj_huangzhong", "wuhujiang"], weiyan: ["re_weiyan", "ol_weiyan", "weiyan", "huan_weiyan"], zhoutai: ["zhoutai", "xin_zhoutai", "old_zhoutai"], xiaoqiao: ["xiaoqiao", "ol_xiaoqiao", "re_xiaoqiao", "sb_xiaoqiao", "old_xiaoqiao"], yuji: ["xin_yuji", "re_yuji", "yuji"], zhangjiao: ["sp_zhangjiao", "re_zhangjiao", "sb_zhangjiao", "jsrg_zhangjiao", "zhangjiao"], - dianwei: ["dianwei", "ol_dianwei", "re_dianwei"], + dianwei: ["dianwei", "ol_dianwei", "re_dianwei", "dc_sb_dianwei"], xunyu: ["xunyu", "ol_xunyu", "re_xunyu", "sb_xunyu"], sp_zhugeliang: ["sp_zhugeliang", "ol_sp_zhugeliang", "re_sp_zhugeliang", "sb_sp_zhugeliang"], pangtong: ["pangtong", "ol_pangtong", "re_pangtong", "ol_sb_pangtong", "sb_pangtong"], @@ -19,10 +19,10 @@ const characterReplaces = { yanwen: ["yanwen", "ol_yanwen", "re_yanwen"], caopi: ["caopi", "re_caopi", "ps_caopi", "sb_caopi"], xuhuang: ["re_xuhuang", "ol_xuhuang", "sb_xuhuang", "xuhuang"], - menghuo: ["menghuo", "re_menghuo", "sb_menghuo", "tw_menghuo"], + menghuo: ["menghuo", "re_menghuo", "sb_menghuo", "tw_menghuo", "sp_menghuo", "dc_sp_menghuo"], zhurong: ["zhurong", "ol_zhurong", "re_zhurong", "sb_zhurong"], sunjian: ["sunjian", "ol_sunjian", "re_sunjian", "tw_ol_sunjian", "star_sunjian"], - jiaxu: ["jiaxu", "re_jiaxu", "ns_jiaxu", "ps_jiaxu"], + jiaxu: ["jiaxu", "re_jiaxu", "ns_jiaxu", "ps_jiaxu", "sp_jiaxu", "dc_sp_jiaxu", "dc_sb_jiaxu"], dongzhuo: ["dongzhuo", "ol_dongzhuo", "re_dongzhuo", "star_dongzhuo", "jsrg_dongzhuo", "sp_dongzhuo", "yj_dongzhuo"], dengai: ["dengai", "ol_dengai", "re_dengai"], sp_ol_zhanghe: ["sp_ol_zhanghe", "yj_zhanghe", "sp_zhanghe", "jsrg_zhanghe", "huan_zhanghe"], @@ -36,7 +36,7 @@ const characterReplaces = { guanqiujian: ["guanqiujian", "re_guanqiujian", "tw_guanqiujian", "mb_sp_guanqiujian", "old_guanqiujian"], chendao: ["chendao", "ns_chendao", "old_chendao"], zhugezhan: ["zhugezhan", "old_zhugezhan"], - ol_lusu: ["re_lusu", "ol_lusu", "dc_sb_lusu"], + ol_lusu: ["re_lusu", "ol_lusu", "dc_sb_lusu", "xia_lusu"], zhanghe: ["zhanghe", "re_zhanghe", "sb_zhanghe"], yl_luzhi: ["yl_luzhi", "jsrg_yl_luzhi", "sb_yl_luzhi", "tw_yl_luzhi"], sunliang: ["sunliang", "xin_sunliang"], diff --git a/character/shenhua/skill.js b/character/shenhua/skill.js index a62b7a00f6..90f67bb63e 100644 --- a/character/shenhua/skill.js +++ b/character/shenhua/skill.js @@ -253,7 +253,7 @@ const skills = { .set("prompt", "良姻:是否令一名角色回复体力?") .set("ai", function () { const player = _status.event.player, - target = _status.event.getParent().target; + target = _status.event.getParent().targets[0]; let list = _status.event.controls.slice(0), eff1 = 0, eff2 = 0; @@ -354,7 +354,7 @@ const skills = { .set("prompt", "良姻:是否令一名角色回复体力?") .set("ai", function () { const player = _status.event.player, - target = _status.event.getParent().target; + target = _status.event.getParent().targets[0]; let list = _status.event.controls.slice(0), eff1 = 0, eff2 = 0; @@ -1960,7 +1960,6 @@ const skills = { combo: "nzry_huaiju", }, }, - // ----- 审查分界线喵 ----- 上面的代码已经经过了审查喵 nzry_kuizhu: { audio: 2, trigger: { @@ -2711,7 +2710,6 @@ const skills = { }, }, jianchu: { - shaRelated: true, audio: 2, audioname: ["re_pangde"], trigger: { player: "useCardToPlayered" }, @@ -3177,7 +3175,6 @@ const skills = { group: "kuanggu_check", }, xinliegong: { - shaRelated: true, mod: { aiOrder(player, card, num) { if (num > 0 && (card.name === "sha" || get.tag(card, "draw"))) return num + 6; @@ -3580,8 +3577,8 @@ const skills = { return true; }; const bool = await chooseBool.forResultBool(); - if (!bool && !event.directbool) return; - const addToExpansion = player.addToExpansion(event.card, "gain2"); + if (!bool) return; + const addToExpansion = player.addToExpansion(card, "gain2"); addToExpansion.gaintag.add("tuntian"); await addToExpansion; }, @@ -3724,7 +3721,6 @@ const skills = { }, }, jiang: { - shaRelated: true, audio: 2, preHidden: true, audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], @@ -4386,7 +4382,7 @@ const skills = { } event.dialog.close(); event.control.close(); - // game.resume(); // 不再 game.resume 防止 game.loop 被重复执行 + game.resume(); // 不再 game.resume 防止 game.loop 被重复执行 _status.imchoosing = false; resolve(result); }); @@ -4407,7 +4403,12 @@ const skills = { } else if (event.isOnline()) { const { promise, resolve } = Promise.withResolvers(); event.player.send(chooseButton, event.player, cards, event.logged); - event.player.wait(result => !!void resolve(result)); // 不再 game.resume 防止 game.loop 被重复执行 + event.player.wait(async result => { + if(result =="ai") + result = await switchToAuto(); + + resolve(result); + }); // 不再 game.resume 防止 game.loop 被重复执行 game.pause(); // 暂停 game.loop 防止 game.resume2 next = promise; } else { @@ -4611,7 +4612,6 @@ const skills = { }, }, lieren: { - shaRelated: true, audio: 2, audioname: ["boss_lvbu3", "ol_zhurong"], trigger: { source: "damageSource" }, @@ -4644,6 +4644,9 @@ const skills = { }, fangzhu: { audio: 2, + audioname2: { + xin_simayi: "jilue_fangzhu", + }, trigger: { player: "damageEnd" }, preHidden: true, async cost(event, trigger, player) { @@ -5350,7 +5353,7 @@ const skills = { locked: true, audio: 2, audioname: ["boss_lvbu3"], - audioname2: { shen_simayi: "jilue_wansha" }, + audioname2: { shen_simayi: "jilue_wansha", xin_simayi: "jilue_wansha" }, global: "wansha2", trigger: { global: "dying" }, priority: 15, @@ -5384,7 +5387,7 @@ const skills = { if (get.color(event.card) != "black") return false; return (event.card.name == "nanman" && player != event.player) || (event.card.name == "wanjian" && player != event.player) || (event.card.name == "taoyuan" && player.hp < player.maxHp) || event.card.name == "wugu"; }, - async content() {}, + async content() { }, mod: { targetEnabled(card) { if ((get.type(card) == "trick" || get.type(card) == "delay") && get.color(card) == "black") return false; @@ -6082,7 +6085,6 @@ const skills = { zhuSkill: true, }, mengjin: { - shaRelated: true, audio: 2, trigger: { player: "shaMiss" }, //priority:-1, @@ -6404,7 +6406,6 @@ const skills = { }, }, liegong: { - shaRelated: true, audio: 2, audioname: ["re_huangzhong"], trigger: { player: "useCardToPlayered" }, diff --git a/character/shiji/character.js b/character/shiji/character.js index f164abf0e9..68b274b2d3 100644 --- a/character/shiji/character.js +++ b/character/shiji/character.js @@ -1,7 +1,7 @@ const characters = { liuba: ["male", "shu", 3, ["duanbi", "tongduo"]], sp_zhujun: ["male", "qun", 4, ["xinyangjie", "xinjuxiang", "houfeng"]], - sp_huangfusong: ["male", "qun", 4, ["spzhengjun", "spshiji", "sptaoluan"]], + sp_huangfusong: ["male", "qun", 4, ["spzhengjun", "spshiji", "sptaoluan"], ["name:皇甫|嵩"]], sp_lvfan: ["male", "wu", 3, ["mbdiaodu", "mbdiancai", "spyanji"]], sp_jiangqing: ["male", "wu", 4, ["spjianyi", "spshangyi"]], sp_jiangwan: ["male", "shu", 3, ["spzhenting", "spjincui"]], @@ -13,10 +13,10 @@ const characters = { sp_wangshuang: ["male", "wei", 4, ["yiyong", "shanxie"]], sp_zongyu: ["male", "shu", 3, ["zhibian", "yuyan"]], yuanhuan: ["male", "wei", 3, ["qingjue", "fengjie"]], - sp_chendong: ["male", "wu", 4, ["spyilie", "spfenming"]], + sp_chendong: ["male", "wu", 4, ["spyilie", "spfenming"], ["name:陈|武-董|袭"]], db_wenyang: ["male", "wei", 4, ["dbquedi", "dbzhuifeng", "dbchongjian", "dbchoujue"], ["doublegroup:wei:wu"]], sp_yanghu: ["male", "qun", 3, ["mingfa", "rongbei"]], - qiaogong: ["male", "wu", 3, ["yizhu", "luanchou"]], + qiaogong: ["male", "wu", 3, ["yizhu", "luanchou"], ["name:桥|null"]], liuzhang: ["male", "qun", 3, ["jutu", "yaohu", "rehuaibi"], ["zhu"]], sp_zhangwen: ["male", "wu", 3, ["gebo", "spsongshu"]], zhangzhongjing: ["male", "qun", 3, ["jishi", "xinliaoyi", "binglun"]], @@ -26,13 +26,13 @@ const characters = { caizhenji: ["female", "wei", 3, ["sheyi", "tianyin"]], sp_kongrong: ["male", "qun", 3, ["xinlirang", "xinmingshi"]], zhouchu: ["male", "wu", 4, ["xianghai", "rechuhai"]], - wangfuzhaolei: ["male", "shu", 4, ["xunyi"]], + wangfuzhaolei: ["male", "shu", 4, ["xunyi"], ["name:王|甫-赵|累"]], wangling: ["male", "wei", 4, ["xingqi", "xinzifu", "mibei"], ["clan:太原王氏"]], wujing: ["male", "wu", 4, ["heji", "liubing"]], - sp_mifuren: ["female", "shu", 3, ["xinguixiu", "qingyu"]], + sp_mifuren: ["female", "shu", 3, ["xinguixiu", "qingyu"], ["name:糜|null"]], sp_xinpi: ["male", "wei", 3, ["spyinju", "spchijie"]], feiyi: ["male", "shu", 3, ["mjshengxi", "fyjianyu"]], - sp_bianfuren: ["female", "wei", 3, ["spwanwei", "spyuejian"]], + sp_bianfuren: ["female", "wei", 3, ["spwanwei", "spyuejian"], ["name:卞|null"]], sp_duyu: ["male", "qun", 4, ["spwuku", "spsanchen"]], luotong: ["male", "wu", 4, ["qinzheng"]], sp_wangcan: ["male", "wei", 3, ["spqiai", "spshanxi"]], diff --git a/character/shiji/skill.js b/character/shiji/skill.js index eb9873cdf9..b52c066809 100644 --- a/character/shiji/skill.js +++ b/character/shiji/skill.js @@ -2224,7 +2224,7 @@ const skills = { var num1 = player.countCards("h"), num2 = player.storage.fengjie2.hp; if (num1 > num2) player.chooseToDiscard("h", true, num1 - num2); - else player.drawTo(Math.min(num1 + 4, num2)); + else player.drawTo(Math.min(4, num2)); }, }, //陈武董袭 @@ -2643,7 +2643,7 @@ const skills = { }, dbzhuifeng: { audio: 2, - groupSkill: true, + groupSkill: "wei", enable: "chooseToUse", usable: 2, viewAsFilter: function (player) { @@ -2687,7 +2687,7 @@ const skills = { }, dbchongjian: { audio: 2, - groupSkill: true, + groupSkill: "wu", hiddenCard: function (player, name) { if ( player.group == "wu" && @@ -3279,15 +3279,15 @@ const skills = { forced: true, logTarget: "source", filter: function (event, player) { - return event.source && event.source.isIn() && player.hasMark("xinlirang") && event.source.countCards("he") > 0; + return event.source && event.source.isIn() && player.hasMark("xinlirang") && event.source.countCards("hej") > 0; }, content: function () { "step 0"; trigger.source - .chooseToDiscard("he", true) + .discardPlayerCard(trigger.source, "hej", true) .set("color", get.attitude(trigger.source, player) > 0 ? "red" : "black") .set("ai", function (card) { - return (get.color(card) == _status.event.color ? 4 : 0) - get.value(card); + return (get.color(card.link) == _status.event.color ? 4 : 0) - get.value(card.link); }); "step 1"; if (result.bool && result.cards && result.cards.length) { @@ -5542,7 +5542,7 @@ const skills = { return player.storage.xunyi2; }, content: function () { - (player == trigger.source ? player.storage.xunyi2 : player).draw(); + (player == trigger.source ? player.storage.xunyi2 : player).draw(trigger.num); }, group: "xunyi3", mark: true, @@ -5555,13 +5555,13 @@ const skills = { charlotte: true, filter: function (event, player) { var list = [player, player.storage.xunyi2]; - return list.includes(event.player) && !list.includes(event.source) && (player == event.player ? player.storage.xunyi2 : player).countCards("he") > 0; + return event.num && list.includes(event.player) && !list.includes(event.source) && (player == event.player ? player.storage.xunyi2 : player).countCards("he") > 0; }, logTarget: function (event, player) { return player.storage.xunyi2; }, content: function () { - (player == trigger.player ? player.storage.xunyi2 : player).chooseToDiscard("he", true); + (player == trigger.player ? player.storage.xunyi2 : player).chooseToDiscard("he", trigger.num, true); }, }, //狗剩 diff --git a/character/shiji/translate.js b/character/shiji/translate.js index b744e6e430..68d03371ee 100644 --- a/character/shiji/translate.js +++ b/character/shiji/translate.js @@ -102,11 +102,11 @@ const translates = { heji: "合击", heji_info: "当有角色使用的【决斗】或红色【杀】结算完成后,若此牌对应的目标数为1,则你可以对相同的目标使用一张【杀】或【决斗】(无距离和次数限制)。若你以此法使用的牌不为转化牌,则你从牌堆中随机获得一张红色牌。", liubing: "流兵", - liubing_info: "锁定技。①你于出牌阶段使用的第一张非虚拟【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。", + liubing_info: "锁定技。①你于出牌阶段使用的第一张非虚拟【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色【杀】结算结束后,若此【杀】未造成伤害,则你获得之。", sp_mifuren: "手杀糜夫人", spcunsi: "存嗣", spcunsi2: "存嗣", - spcunsi_info: "出牌阶段限一次,你可将武将牌翻至背面并选择一名其他角色。其从牌堆或弃牌堆中获得一张【杀】,且下一张杀的伤害值基数+1。", + spcunsi_info: "出牌阶段限一次,你可将武将牌翻至背面并选择一名其他角色。其从牌堆或弃牌堆中获得一张【杀】,且下一张【杀】的伤害值基数+1。", spguixiu: "闺秀", spguixiu_info: "锁定技,当你受到伤害后,若你的武将牌背面朝上,则你将武将牌翻至正面。当你的武将牌从背面翻至正面时,你摸一张牌。", qingyu: "清玉", @@ -116,7 +116,7 @@ const translates = { xinlirang: "礼让", xinlirang_info: "①其他角色的摸牌阶段开始时,若你没有“谦”标记,则你可以获得一枚“谦”标记。若如此做,其额定摸牌数+2,且本回合的弃牌阶段开始时,你可以获得其弃置的至多两张牌。②摸牌阶段开始时,若你有“谦”标记,则你跳过此摸牌阶段并移除“谦”标记。", xinmingshi: "名仕", - xinmingshi_info: "锁定技,当你受到伤害后,若你有“谦”标记,则伤害来源弃置一张牌。若此牌为:黑色:你获得之。红色,你回复1点体力。", + xinmingshi_info: "锁定技,当你受到伤害后,若你有“谦”标记,则伤害来源弃置其区域内的一张牌。若此牌为:黑色:你获得之。红色,你回复1点体力。", sp_xinpi: "手杀辛毗", spyinju: "引裾", spyinju2: "引裾", @@ -142,7 +142,7 @@ const translates = { xunyi: "殉义", xunyi2: "殉义", xunyi3: "殉义", - xunyi_info: "游戏开始时,或当上一个拥有“殉义”效果的角色死亡后,你可以选择一名角色获得如下效果:当其/你对二者之外的角色造成伤害后,你/其摸一张牌;当其/你受到二者之外的角色造成的伤害后,你/其弃置一张牌。", + xunyi_info: "游戏开始时,或当上一个拥有“殉义”效果的角色死亡后,你可以选择一名角色获得如下效果:当其/你对二者之外的角色造成1点伤害后,你/其摸一张牌;当其/你受到二者之外的角色造成的1点伤害后,你/其弃置一张牌。", zhouchu: "手杀周处", xianghai: "乡害", xianghai_info: "锁定技,其他角色的手牌上限-1。你手牌区的装备牌均视为【酒】。", @@ -241,10 +241,10 @@ const translates = { spfenming_info: "出牌阶段限一次,你可以选择一名体力值不大于你的角色。若其:未横置,其横置;已横置,你获得其一张牌。", yuanhuan: "袁涣", qingjue: "请决", - qingjue_info: "每轮限一次。当有其他角色A使用牌指定另一名体力值小于A且不处于濒死状态的其他角色B为目标时,你可以摸一张牌,然后与A拼点。若你赢,你取消此目标。若你没赢,你将此牌的目标改为自己。", + qingjue_info: "每轮限一次。当有其他角色A使用牌指定另一名体力值小于A且不处于濒死状态的其他角色B为唯一目标时,你可以摸一张牌,然后与A拼点。若你赢,你取消此目标。若你没赢,你将此牌的目标改为自己。", fengjie: "奉节", fengjie2: "奉节", - fengjie_info: "锁定技,准备阶段开始时,你选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸四张)或弃置至与其体力值相等。", + fengjie_info: "锁定技,准备阶段开始时,你选择一名其他角色并获得如下效果直到你下回合开始:一名角色的结束阶段开始时,你将手牌摸至(至多摸至四张)或弃置至与其体力值相等。", sp_zongyu: "手杀宗预", zhibian: "直辩", zhibian_info: "准备阶段,你可以和一名其他角色拼点。若你赢,你可选择:①将其装备区/判定区内的一张牌移动到你的对应区域。②回复1点体力。③背水:跳过下个摸牌阶段,然后依次执行上述所有选项;若你没赢,你失去1点体力。", diff --git a/character/sp/character.js b/character/sp/character.js index c2d8c4bce0..aa4dba014d 100644 --- a/character/sp/character.js +++ b/character/sp/character.js @@ -1,4 +1,5 @@ const characters = { + caoteng: ["male", "qun", 3, ["olyongzu", "olqingliu"]], budugen: ["male", "qun", 4, ["olkouchao"]], mawan: ["male", "qun", 4, ["mashu", "olhunjiang"]], ol_jiangwan: ["male", "shu", 3, ["olziruo", "olxvfa"]], @@ -33,7 +34,7 @@ const characters = { haopu: ["male", "shu", 4, ["olzhenying"]], ol_mengda: ["male", "shu", 4, ["olgoude"]], ol_wanglang: ["male", "wei", 3, ["gushe", "oljici"]], - lushi: ["female", "qun", 3, ["olzhuyan", "releijie"]], + lushi: ["female", "qun", 3, ["olzhuyan", "releijie"], ["name:卢|null"]], zhangshiping: ["male", "shu", 3, ["olhongji", "olxinggu"]], sunhong: ["male", "wu", 3, ["olxianbi", "olzenrun"]], luoxian: ["male", "shu", 4, ["oldaili"]], @@ -41,7 +42,7 @@ const characters = { wangguan: ["male", "wei", 3, ["olmiuyan", "olshilu"]], ol_zhangyì: ["male", "shu", 4, ["oldianjun", "olkangrui"]], ol_zhujun: ["male", "qun", 4, ["olcuipo"]], - maxiumatie: ["male", "qun", 4, ["mashu", "rekenshang"]], + maxiumatie: ["male", "qun", 4, ["mashu", "rekenshang"], ["name:马|休-马|铁"]], dongtuna: ["male", "qun", 4, ["oljianman"]], zhanghua: ["male", "jin", 3, ["olbihun", "oljianhe", "olchuanwu"]], quhuang: ["male", "wu", 3, ["olqiejian", "olnishou"]], @@ -51,21 +52,21 @@ const characters = { ol_furong: ["male", "shu", 4, ["olxiaosi"]], ahuinan: ["male", "qun", 4, ["jueman"]], jin_guohuai: ["female", "jin", 3, ["zhefu", "yidu"]], - xiahouxuan: ["male", "wei", 3, ["olhuanfu", "olqingyi", "olzeyue"]], + xiahouxuan: ["male", "wei", 3, ["olhuanfu", "olqingyi", "olzeyue"], ["name:夏侯|玄"]], dengzhong: ["male", "wei", 4, ["dzkanpo", "dzgengzhan"]], wangyan: ["male", "jin", 3, ["yangkuang", "cihuang", "sanku"]], huojun: ["male", "shu", 4, ["qiongshou", "fenrui"]], - caoxiancaohua: ["female", "qun", 3, ["huamu", "qianmeng", "liangyuan", "jisi"]], + caoxiancaohua: ["female", "qun", 3, ["huamu", "qianmeng", "liangyuan", "jisi"], ["name:曹|宪-曹|华"]], jin_zhouchu: ["male", "jin", 4, ["shanduan", "yilie"]], zhaoyǎn: ["male", "wei", 4, ["tongxie"]], ol_puyuan: ["male", "shu", 4, ["olshengong", "olqisi"]], - ruiji: ["female", "wu", 3, ["qiaoli", "qingliang"]], + ruiji: ["female", "wu", 3, ["qiaoli", "qingliang"], ["name:芮|null"]], weizi: ["male", "qun", 3, ["yuanzi", "liejie"]], tengfanglan: ["female", "wu", 3, ["luochong", "aichen"]], sp_menghuo: ["male", "qun", 4, ["spmanwang"]], jin_yanghu: ["male", "jin", 4, ["huaiyuan", "chongxin", "dezhang"]], - qinghegongzhu: ["female", "wei", 3, ["zengou", "qhzhangji"]], - fanjiangzhangda: ["male", "wu", 4, ["yuanchou", "juesheng"]], + qinghegongzhu: ["female", "wei", 3, ["zengou", "qhzhangji"], ["name:曹|null"]], + fanjiangzhangda: ["male", "wu", 4, ["yuanchou", "juesheng"], ["name:范|疆-张|达"]], tianyu: ["male", "wei", 4, ["saodi", "zhuitao"]], ol_chendeng: ["male", "qun", 4, ["olfengji", "olxuanhui"]], ol_zhuling: ["male", "wei", 4, ["jixian"]], @@ -77,13 +78,13 @@ const characters = { zuofen: ["female", "jin", 3, ["zhaosong", "lisi"]], ol_wangrong: ["female", "qun", 3, ["olfengzi", "oljizhan", "olfusong"]], ol_dengzhi: ["male", "shu", 3, ["olxiuhao", "olsujian"]], - ol_bianfuren: ["female", "wei", 3, ["fuwei", "yuejian"]], + ol_bianfuren: ["female", "wei", 3, ["fuwei", "yuejian"], ["name:卞|null"]], duxi: ["male", "wei", 3, ["quxi", "bixiong"]], gaogan: ["male", "qun", 4, ["juguan"]], huangchengyan: ["male", "qun", 3, ["guanxu", "yashi"]], huangzu: ["male", "qun", 4, ["wangong"]], panshu: ["female", "wu", 3, ["weiyi", "jinzhi"]], - wolongfengchu: ["male", "shu", 4, ["youlong", "luanfeng"]], + wolongfengchu: ["male", "shu", 4, ["youlong", "luanfeng"], ["name:诸葛|亮-庞|统"]], sp_zhangliao: ["male", "qun", 4, ["mubing", "ziqu", "diaoling"]], caoshuang: ["male", "wei", 4, ["retuogu", "shanzhuan"]], ol_zhangchangpu: ["female", "wei", 3, ["yanjiao", "olxingshen"]], @@ -91,28 +92,28 @@ const characters = { caiyang: ["male", "qun", 1, ["yinka", "zhuixi"], ["forbidai", "unseen"]], sunshao: ["male", "wu", 3, ["bizheng", "yidian"]], - huangfusong: ["male", "qun", 4, ["fenyue"]], - yuantanyuanshang: ["male", "qun", 4, ["neifa"]], + huangfusong: ["male", "qun", 4, ["fenyue"], ["name:皇甫|嵩"]], + yuantanyuanshang: ["male", "qun", 4, ["neifa"], ["name:袁|谭-袁|尚"]], xujing: ["male", "shu", 3, ["yuxu", "xjshijian"]], jianggan: ["male", "wei", 3, ["weicheng", "daoshu"]], caoying: ["female", "wei", 4, ["xinfu_lingren", "fujian"], []], - simahui: ["male", "qun", 3, ["jianjie", "xinfu_chenghao", "xinfu_yinshi"], []], + simahui: ["male", "qun", 3, ["jianjie", "xinfu_chenghao", "xinfu_yinshi"], ["name:司马|徽"]], baosanniang: ["female", "shu", 4, ["olwuniang", "olxushen"], []], yangxiu: ["male", "wei", 3, ["jilei", "danlao"]], chenlin: ["male", "wei", 3, ["bifa", "songci"]], caohong: ["male", "wei", 4, ["yuanhu"]], - xiahouba: ["male", "shu", 4, ["baobian"]], + xiahouba: ["male", "shu", 4, ["baobian"], ["name:夏侯|霸"]], yuanshu: ["male", "qun", 4, ["yongsi", "weidi"]], - sp_diaochan: ["female", "qun", 3, ["lihun", "rebiyue"]], + sp_diaochan: ["female", "qun", 3, ["lihun", "rebiyue"], ["name:null|null"]], sp_zhaoyun: ["male", "qun", 3, ["ollongdan", "chongzhen"], ["die:zhaoyun"]], liuxie: ["male", "qun", 3, ["tianming", "mizhao", "twzhuiting"], ["zhu"]], - zhugejin: ["male", "wu", 3, ["olhuanshi", "olhongyuan", "olmingzhe"]], - zhugeke: ["male", "wu", 3, ["aocai", "duwu"]], + zhugejin: ["male", "wu", 3, ["olhuanshi", "olhongyuan", "olmingzhe"], ["name:诸葛|瑾"]], + zhugeke: ["male", "wu", 3, ["aocai", "duwu"], ["name:诸葛|恪"]], guanyinping: ["female", "shu", 3, ["huxiao", "xueji", "wuji"]], - simalang: ["male", "wei", 3, ["junbing", "quji"]], + simalang: ["male", "wei", 3, ["junbing", "quji"], ["name:司马|朗"]], zhangxingcai: ["female", "shu", 3, ["shenxian", "qiangwu"]], fuwan: ["male", "qun", 4, ["dcmoukui"]], sp_sunshangxiang: ["female", "shu", 3, ["liangzhu", "fanxiang"]], @@ -120,7 +121,7 @@ const characters = { sp_caoren: ["male", "wei", 4, ["weikui", "lizhan"]], zhangbao: ["male", "qun", 3, ["rezhoufu", "reyingbing"]], maliang: ["male", "shu", 3, ["zishu", "yingyuan"]], - zhugedan: ["male", "wei", 4, ["gongao", "juyi"]], + zhugedan: ["male", "wei", 4, ["gongao", "juyi"], ["name:诸葛|诞"]], sp_jiangwei: ["male", "wei", 4, ["kunfen", "fengliang"]], sp_machao: ["male", "qun", 4, ["olzhuiji", "ol_shichou"]], sunhao: ["male", "wu", 5, ["recanshi", "rechouhai", "guiming"], ["zhu"]], @@ -129,18 +130,18 @@ const characters = { zhanglu: ["male", "qun", 3, ["yishe", "bushi", "midao", "twshijun"], ["zhu"]], wutugu: ["male", "qun", 15, ["ranshang", "hanyong"]], sp_caiwenji: ["female", "wei", 3, ["chenqing", "mozhi"]], - zhugeguo: ["female", "shu", 3, ["qirang", "yuhua"]], + zhugeguo: ["female", "shu", 3, ["qirang", "yuhua"], ["name:诸葛|果"]], - lingju: ["female", "qun", 3, ["jieyuan", "fenxin"]], + lingju: ["female", "qun", 3, ["jieyuan", "fenxin"], ["name:吕|null"]], cuiyan: ["male", "wei", 3, ["yawang", "xunzhi"]], jsp_guanyu: ["male", "wei", 4, ["new_rewusheng", "danji"]], jsp_huangyueying: ["female", "qun", 3, ["jiqiao", "linglong"]], sunluyu: ["female", "wu", 3, ["new_meibu", "new_mumu"]], - hanba: ["female", "qun", 4, ["fentian", "zhiri"]], + hanba: ["female", "qun", 4, ["fentian", "zhiri"], ["name:null|null"]], zumao: ["male", "wu", 4, ["yinbing", "juedi"]], wenpin: ["male", "wei", 4, ["zhenwei"]], - daxiaoqiao: ["female", "wu", 3, ["new_xingwu", "new_luoyan"]], + daxiaoqiao: ["female", "wu", 3, ["new_xingwu", "new_luoyan"], ["name:桥|null-桥|null"]], guansuo: ["male", "shu", 4, ["zhengnan", "xiefang"]], tadun: ["male", "qun", 4, ["reluanzhan"]], @@ -166,7 +167,7 @@ const characters = { yuejin: ["male", "wei", 4, ["xiaoguo"]], sp_dongzhuo: ["male", "qun", 5, ["hengzheng"]], - hetaihou: ["female", "qun", 3, ["zhendu", "qiluan"]], + hetaihou: ["female", "qun", 3, ["zhendu", "qiluan"], ["name:何|null"]], dingfeng: ["male", "wu", 4, ["reduanbing", "refenxun"]], shamoke: ["male", "shu", 4, ["gzjili"]], diff --git a/character/sp/characterReplace.js b/character/sp/characterReplace.js index da4e362d9e..2776141efc 100644 --- a/character/sp/characterReplace.js +++ b/character/sp/characterReplace.js @@ -61,6 +61,9 @@ const characterReplaces = { wenqin: ["ol_wenqin", "pe_wenqin"], lukai: ["ol_lukai", "lukai"], liupi: ["ol_liupi", "liupi"], + kanze: ["kanze", "re_kanze"], + lvfan: ["lvfan", "sp_lvfan"], + dongbai: ["dongbai", "re_dongbai", "jsrg_dongbai"], }; export default characterReplaces; diff --git a/character/sp/intro.js b/character/sp/intro.js index 9a99f96702..268869f651 100644 --- a/character/sp/intro.js +++ b/character/sp/intro.js @@ -1,4 +1,5 @@ const characterIntro = { + caoteng: "曹腾(生卒年不详),字季兴,沛国谯(今安徽亳县)人,曹节(曹萌)之子,东汉宦官。永宁元年(120年),顺帝做太子时,邓太后看到曹腾年纪轻,又谨慎厚道,派其侍奉皇太子读书,因此得到顺帝宠信。顺帝即位(126年)后,曹腾任小黄门,后升迁至中常侍。因策划迎立桓帝有功,迁大长秋,被封为费亭侯,加位特进。曹腾用事宫中三十多年,未有显著过失,并能推荐贤人,受到种暠弹劾,却称种暠为能吏,因此受到人们赞美。曹腾是曹魏王朝中六个拥有帝号的人物之一,在中国历史上,还是唯一一个被正式授予正统皇帝称号的宦官。", budugen: "步度根(?-约233年),檀石槐之孙,魁头之弟。中国三国时期鲜卑首领之一。步度根在其兄魁头死后,嗣为鲜卑一部之首领,据有云中、雁门、北地、代郡、太原等地之全部或一部分。建安(196年-220年)中,曾与轲比能等通过护乌桓校尉阎柔向曹操贡献。后遣使向魏文帝曹丕献马,被封为王。因兄扶罗韩被轲比能所杀,与之结怨,互相攻劫,其部众益少,力量益弱。被迫率众万余落退保太原、雁门,并联络扶罗韩子泄归泥附己,共拒轲比能。黄初五年(224年),亲诣魏廷贡献,受赏赐,与魏保持和好关系。魏明帝青龙元年(233年),受轲比能诱使,叛魏,扰掠并州,在魏将秦朗追击下,走漠北,后为轲比能所杀。", mawan: "马玩,东汉末年凉州军阀之一。建安十六年(公元211年),同韩遂、马超联合,起兵反抗曹操。同年九月,联军战败,马玩不知去向。", caimao: "蔡瑁,字德珪,生卒年不详。襄阳蔡州人,东汉末年荆州名士。少年时与曹操交好。初平元年(公元190年),刘表为荆州刺史。时宗贼猖獗,蔡瑁协助刘表诛杀宗贼,平定荆州之地,蔡瑁因此得刘表重用,并在刘表任镇南将军时担任他的军师。刘表病亡后,蔡瑁拥护刘表幼子刘琮继位,并逼迫他投降南征的曹操。蔡瑁在曹操麾下历任从事中郎、司马、长水校尉,受封汉阳亭侯。", diff --git a/character/sp/skill.js b/character/sp/skill.js index 68f3565f6b..f36af93d16 100644 --- a/character/sp/skill.js +++ b/character/sp/skill.js @@ -2,6 +2,194 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //曹腾 + olyongzu: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return game.hasPlayer(t => t != player); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("olyongzu"), lib.filter.notMe) + .set("ai", target => { + const player = get.event().player; + if (get.attitude(player, target) <= 0) return 0; + const list = get + .info("olyongzu") + .getList(player, target) + .map(listx => listx[0][1]) + .filter(effect => !effect.filter || effect.filter(player)); + return Math.max(...list.map(effect => effect.ai(player))) + Math.max(...list.map(effect => effect.ai(target))); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + let list = get.info("olyongzu").getList(player, target), + choosed; + for (const current of [player, target]) { + const result = await current + .chooseButton(["拥族:请选择一项执行", [list.filter(effect => choosed !== effect[0][0]), "textbutton"]], true) + .set("filterButton", button => { + const effect = button.link[1]; + return !effect.filter || effect.filter(current); + }) + .set("ai", button => { + const effect = button.link[1]; + return effect.ai(get.event().player); + }) + .forResult(); + if (result.bool) { + if (!choosed) choosed = result.links[0][0]; + await result.links[0][1].content(current, player); + } + } + }, + getList(player, target) { + let list = [ + [ + "摸两张牌", + { + async content(player) { + await player.draw(2); + }, + ai(player) { + return get.effect(player, { name: "wuzhong" }, player, player); + }, + }, + ], + [ + "回复1点体力", + { + async content(player) { + await player.recover(); + }, + ai(player) { + return get.recoverEffect(player, player, player); + }, + }, + ], + [ + "复原武将牌", + { + async content(player) { + if (player.isTurnedOver()) { + await player.turnOver(false); + } + if (player.isLinked()) { + await player.link(false); + } + }, + ai(player) { + return (player.isTurnedOver() ? 3 : 0) + player.isLinked(); + }, + }, + ], + ]; + if (get.mode() == "guozhan" ? target.isFriendOf(player) : target.group == player.group) { + list.addArray([ + [ + "手牌上限+1", + { + async content(player) { + player.addSkill("olyongzu_hand"); + player.addMark("olyongzu_hand", 1, false); + }, + ai: () => 1, + }, + ], + [ + "若为魏/群势力,则获得【奸雄】/【天命】", + { + async content(player, source) { + source.addTempSkill("olyongzu_skill", { player: "phaseBegin" }); + source.markAuto("olyongzu_skill", [player]); + const group = player[get.mode() == "guozhan" ? "identity" : "group"]; + const skill = group == "wei" ? "rejianxiong" : "tianming"; + player.popup(skill); + await player.addAdditionalSkills("olyongzu_skill", skill, true); + }, + filter: player => ["wei", "qun"].includes(player[get.mode() == "guozhan" ? "identity" : "group"]), + ai(player) { + return player[get.mode() == "guozhan" ? "identity" : "group"] == "wei" ? 2 : 3; + }, + }, + ], + ]); + } + return list.map(listx => [listx, listx[0]]); + }, + derivation: ["rejianxiong", "tianming"], + ai: { threaten: 3.5 }, + subSkill: { + skill: { + onremove(player, skill) { + const targets = player.getStorage(skill).sortBySeat(player); + delete player.storage[skill]; + if (targets.length) { + for (const i of targets) i.removeAdditionalSkills(skill); + } + }, + }, + hand: { + charlotte: true, + markimage: "image/card/handcard.png", + intro: { content: "手牌上限+#" }, + mod: { + maxHandcard(player, num) { + return num + player.countMark("olyongzu_hand"); + }, + }, + }, + }, + }, + olqingliu: { + audio: 2, + trigger: { + global: "phaseBefore", + player: ["enterGame", "dyingAfter"], + }, + filter(event, player) { + if (event.name == "dying") { + const group = player.storage.olqingliu; + if (!group || player.group == group) return false; + return ( + game + .getAllGlobalHistory("everything", evt => { + return ( + evt.name == "dying" && + !game.getAllGlobalHistory("everything", evtx => { + return evtx.name == "die" && evtx.getParent() == evt; + }).length + ); + }) + .indexOf(event) == 0 + ); + } + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + async content(event, trigger, player) { + if (trigger.name == "dying") await player.changeGroup(player.storage.olqingliu); + else { + const result = await player + .chooseControl("wei", "qun") + .set("ai", () => { + return get.rand(0, 1); + }) + .set("prompt", "清流:请选择你的势力") + .forResult(); + if (result.control) { + const group = result.control; + player.popup(group + "2"); + game.log(player, "选择了", "#y" + get.translation(group + "2")); + player.storage.olqingliu = group == "wei" ? "qun" : "wei"; + if (player.group != group) await player.changeGroup(group); + } + } + }, + }, //步度根 //古希腊掌管扣工资的神(bushi olkouchao: { @@ -81,7 +269,7 @@ const skills = { if (!player || get.event().type != "phase") return 1; let names = player.getStorage("olkouchao"); for (let i = 0; i < names.length; i++) { - if (player.getStorage("olkouchao_used").includes(i)) list.splice(i--, 1); + if (player.getStorage("olkouchao_used").includes(i)) names.splice(i--, 1); } names = names.map(name => { return { name: name }; @@ -89,7 +277,7 @@ const skills = { names.sort((a, b) => { return player.getUseValue(b, true, true) - player.getUseValue(a, true, true); }); - let max = get.order(list[0], player); + let max = get.order(names[0], player); if (max > 0) max += 0.3; return max; }, @@ -4537,7 +4725,7 @@ const skills = { return ( !player.getHistory("sourceDamage", evt2 => { return evt2.card && evt2.card == evt.card; - }).length && get.tag(evt.card, "damage") + }).length && get.tag(evt.card, "damage") > 0.5 ); }) .indexOf(event) >= 2 @@ -8407,7 +8595,6 @@ const skills = { }); }, direct: true, - shaRelated: true, content: function () { "step 0"; player @@ -8664,7 +8851,11 @@ const skills = { enable: "phaseUse", usable: 1, filter: function (event, player) { - return player.countCards("e") < 5 && game.hasPlayer(current => lib.skill.olshanxi.filterTarget(null, player, current)); + return ( + Array.from({ length: 5 }) + .map((_, i) => i + 1) + .some(i => player.hasEmptySlot(i)) && game.hasPlayer(current => lib.skill.olshanxi.filterTarget(null, player, current)) + ); }, filterTarget: function (card, player, target) { return target != player && player.countCards("h") + target.countCards("h") > 0 && !player.inRangeOf(target); @@ -8673,7 +8864,9 @@ const skills = { "step 0"; var cards1 = player.getCards("h"), cards2 = target.getCards("h"); - var num = 5 - player.countCards("e"); + var num = Array.from({ length: 5 }) + .map((_, i) => i + 1) + .reduce((sum, i) => sum + player.countEmptySlot(i), 0); var dialog = ["闪袭:选择展示至多" + get.cnNumber(num) + "张牌"]; if (cards1.length > 0) { dialog.push('
你的手牌
'); @@ -9637,7 +9830,6 @@ const skills = { if (event.olhuanfu_map && event.olhuanfu_map[player.playerid]) return false; return player.maxHp > 0 && player.countCards("he") > 0; }, - shaRelated: true, direct: true, content: function () { "step 0"; @@ -11395,7 +11587,6 @@ const skills = { }, }, trigger: { player: "useCardToPlayered" }, - shaRelated: true, filter: function (event, player) { return event.card.name == "sha" && event.target.countCards("he") > 0 && get.distance(player, event.target) == 1; }, @@ -13447,22 +13638,17 @@ const skills = { audio: 2, trigger: { player: "phaseZhunbeiBegin" }, filter(event, player) { - const list = ["draw", "sha"]; + if (!player.hasSkill("olfengji_sha") && !player.hasSkill("olfengji_draw")) return false; return game.hasPlayer(target => { if (target == player) return false; - const players = [player.storage["olfengji_" + list[0]] || 0, player.storage["olfengji_" + list[1]] || 0]; - const targets = [target.storage["olfengji_" + list[0]] || 0, target.storage["olfengji_" + list[1]] || 0]; - return players[0] != targets[0] || players[1] != targets[1]; + return target.hasSkill("olfengji_sha") || target.hasSkill("olfengji_draw"); }); }, async cost(event, trigger, player) { event.result = await player .chooseTarget(get.prompt("olxuanhui"), "与一名其他角色交换〖丰积〗效果", (card, player, target) => { - const list = ["draw", "sha"]; if (target == player) return false; - const players = [player.storage["olfengji_" + list[0]] || 0, player.storage["olfengji_" + list[1]] || 0]; - const targets = [target.storage["olfengji_" + list[0]] || 0, target.storage["olfengji_" + list[1]] || 0]; - return players[0] != targets[0] || players[1] != targets[1]; + return target.hasSkill("olfengji_sha") || target.hasSkill("olfengji_draw"); }) .set("ai", target => { const player = get.event().player, @@ -13608,9 +13794,13 @@ const skills = { var ph = player.countCards("h"); if (ph > 0 && targets.some(target => target.isIn() && target.countCards("h") < ph)) { player - .chooseTarget("请选择一名手牌数小于自己的目标角色,令其摸一张牌", function (card, player, target) { - return _status.event.getParent().targets.includes(target) && target.countCards("h") < player.countCards("h"); - }) + .chooseTarget( + "请选择一名手牌数小于自己的目标角色,令其摸一张牌", + function (card, player, target) { + return _status.event.getParent().targets.includes(target) && target.countCards("h") < player.countCards("h"); + }, + true + ) .set("ai", function (target) { var player = _status.event.player; return get.attitude(player, target); @@ -24438,7 +24628,6 @@ const skills = { }, }, fengpo: { - shaRelated: true, audio: 2, trigger: { player: "useCardToPlayered", @@ -25434,7 +25623,7 @@ const skills = { }, filterCard: true, filterTarget: function (card, player, target) { - return target != player && !target.getExpansions("rezhoufu2").length; + return target != player && !target.getExpansions("rezhoufu_judge").length; }, check: function (card) { return 6 - get.value(card); @@ -25444,8 +25633,7 @@ const skills = { lose: false, delay: false, content: function () { - if (!target.storage.rezhoufu2_markcount) target.storage.rezhoufu2_markcount = 0; - target.addToExpansion(cards, player, "give").gaintag.add("rezhoufu2"); + target.addToExpansion(cards, player, "give").gaintag.add("rezhoufu_judge"); target.addSkill("rezhoufu_judge"); }, ai: { @@ -25458,15 +25646,26 @@ const skills = { subSkill: { judge: { audio: "zhoufu", + init: (player) => { + player.storage.rezhoufu_judge_markcount = 0; + }, + onremove: (player) => { + delete player.storage.rezhoufu_judge_markcount; + let cards = player.getExpansions("rezhoufu_judge"); + if (cards.length) player.loseToDiscardpile(cards); + }, + intro: { + content: "expansion", + }, trigger: { player: "judgeBefore" }, forced: true, charlotte: true, filter: function (event, player) { - return !event.directresult && player.getExpansions("rezhoufu2").length; + return !event.directresult && player.getExpansions("rezhoufu_judge").length; }, content: function () { - var cards = [player.getExpansions("rezhoufu2")[0]]; - trigger.directresult = cards[0]; + trigger.directresult = player.getExpansions("rezhoufu_judge")[0]; + player.storage.rezhoufu_judge_markcount = 0; }, }, losehp: { @@ -25478,7 +25677,7 @@ const skills = { return current.hasHistory("lose", function (evt) { if (!evt || !evt.xs || !evt.xs.length) return false; for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("rezhoufu2")) return true; + if (evt.gaintag_map[i].includes("rezhoufu_judge")) return true; } return false; }); @@ -25490,7 +25689,7 @@ const skills = { return current.hasHistory("lose", function (evt) { if (!evt || !evt.xs || !evt.xs.length) return false; for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("rezhoufu2")) return true; + if (evt.gaintag_map[i].includes("rezhoufu_judge")) return true; } return false; }); @@ -25503,7 +25702,7 @@ const skills = { return current.hasHistory("lose", function (evt) { if (!evt || !evt.xs || !evt.xs.length) return false; for (var i in evt.gaintag_map) { - if (evt.gaintag_map[i].includes("rezhoufu2")) return true; + if (evt.gaintag_map[i].includes("rezhoufu_judge")) return true; } return false; }); @@ -25516,18 +25715,12 @@ const skills = { }, }, }, - rezhoufu2: { - intro: { - content: "expansion", - }, - }, - rezhoufu3: {}, reyingbing: { audio: "yingbin", trigger: { global: "useCard" }, forced: true, filter: function (event, player) { - var cards = event.player.getExpansions("rezhoufu2"); + var cards = event.player.getExpansions("rezhoufu_judge"); return cards.length && get.color(cards[0]) == get.color(event.card); }, logTarget: "player", @@ -25535,12 +25728,12 @@ const skills = { "step 0"; player.draw(); "step 1"; - trigger.player.storage.rezhoufu2_markcount++; - if (trigger.player.storage.rezhoufu2_markcount >= 2) { - delete trigger.player.storage.rezhoufu2_markcount; - var cards = trigger.player.getExpansions("rezhoufu2"); + trigger.player.storage.rezhoufu_judge_markcount++; + if (trigger.player.storage.rezhoufu_judge_markcount >= 2) { + var cards = trigger.player.getExpansions("rezhoufu_judge"); player.gain(cards, trigger.player, "give", "bySelf"); - } else trigger.player.markSkill("rezhoufu2"); + trigger.player.removeSkill("rezhoufu_judge"); + } else trigger.player.markSkill("rezhoufu_judge"); }, ai: { combo: "rezhoufu", @@ -26173,7 +26366,6 @@ const skills = { audio: 2, }, zniaoxiang: { - shaRelated: true, audio: 2, trigger: { player: "useCardToPlayered" }, forced: true, @@ -26551,7 +26743,7 @@ const skills = { .set("ai", function (card) { if (_status.event.damage > 0) return 0; if (_status.event.noe) return 12 - get.value(card); - return 2 * _status.event.damage - get.value(card); + return -_status.event.damage - get.value(card); }) .set("damage", get.damageEffect(trigger.player, player, trigger.player)) .set("noe", trigger.player.hasSkillTag("noe")); @@ -26987,7 +27179,6 @@ const skills = { }, //FW关银屏 oldhuxiao: { - shaRelated: true, audio: "huxiao", trigger: { player: "shaMiss" }, forced: true, @@ -27771,6 +27962,7 @@ const skills = { }, chongzhen: { audio: 2, + audioname: ["huan_zhaoyun"], trigger: { player: ["useCard", "respond"] }, filter: function (event, player) { if (event.card.name != "sha" && event.card.name != "shan") return false; diff --git a/character/sp/sort.js b/character/sp/sort.js index fad3ec4345..c5fd7b0588 100644 --- a/character/sp/sort.js +++ b/character/sp/sort.js @@ -7,12 +7,12 @@ const characterSort = { sp_huben: ["duanjiong", "liupan", "ol_mengda", "caohong", "xiahouba", "zhugeke", "zumao", "wenpin", "litong", "mazhong", "heqi", "quyi", "luzhi", "yuejin", "dingfeng", "wuyan", "ol_zhuling", "tianyu", "huojun", "zhaoyǎn", "dengzhong", "ol_furong", "macheng", "ol_zhangyì", "ol_zhujun", "maxiumatie", "luoxian", "ol_huban", "haopu", "ol_qianzhao", "caimao"], sp_liesi: ["lvboshe", "mizhu", "weizi", "ol_liuba", "zhangshiping"], sp_default: ["sp_diaochan", "sp_zhaoyun", "sp_sunshangxiang", "sp_caoren", "sp_jiangwei", "sp_machao", "sp_caiwenji", "jsp_guanyu", "jsp_huangyueying", "sp_pangde", "sp_jiaxu", "yuanshu", "sp_zhangliao", "sp_ol_zhanghe", "sp_menghuo", "sp_sunce"], - sp_qifu: ["ol_feiyi", "caoying", "panshu", "caochun", "yuantanyuanshang", "caoshuang", "wolongfengchu", "guansuo", "baosanniang", "fengfangnv", "jin_zhouchu"], + sp_qifu: ["ol_jiangwan", "ol_feiyi", "caoying", "panshu", "caochun", "yuantanyuanshang", "caoshuang", "wolongfengchu", "guansuo", "baosanniang", "fengfangnv", "jin_zhouchu"], sp_wanglang: ["ol_wanglang", "ol_puyuan", "ol_zhouqun"], sp_zhongdan: ["cuiyan", "huangfusong"], sp_guozhan2: ["sp_dongzhuo", "zhangren"], sp_others: ["hanba", "caiyang", "ol_peixiu"], - sp_waitforsort: ["ol_tw_zhangji", "ol_jiangwan", "mawan", "budugen"], + sp_waitforsort: ["ol_tw_zhangji", "mawan", "budugen", "caoteng"], }; const characterSortTranslate = { diff --git a/character/sp/translate.js b/character/sp/translate.js index 9c390541f0..c54f434bf3 100644 --- a/character/sp/translate.js +++ b/character/sp/translate.js @@ -567,12 +567,9 @@ const translates = { kuiwei2: "溃围", yanzheng: "严整", zhoufu: "咒缚", - zhoufu2: "咒缚", - zhoufu3: "咒缚", yingbin: "影兵", reyingbing: "影兵", rezhoufu: "咒缚", - rezhoufu2: "咒缚", fenxun: "奋迅", fenxun2: "奋迅", spmengjin: "猛进", @@ -710,7 +707,7 @@ const translates = { zlhuji_info: "锁定技,你与其他角色的距离-1,当你于回合外受到伤害后,你可进行判定,若结果为红色,视为你对伤害来源使用一张【杀】(无距离限制)。", zlshoufu: "授符", zlshoufu2: "授符", - zlshoufu_info: "出牌阶段限一次,你可摸一张牌,然后将一张手牌置于一名没有【箓】的角色的武将牌上,称为【箓】;其不能使用和打出与【箓】同类型的牌。该角色受到伤害后,或于弃牌阶段弃置至少两张与【箓】同类型的牌后,将【箓】置入弃牌堆。", + zlshoufu_info: "出牌阶段限一次,你可摸一张牌,然后将一张手牌置于一名没有“箓”的角色的武将牌上,称为“箓”;其不能使用和打出与“箓”同类型的牌。该角色受到伤害后,或于弃牌阶段弃置至少两张与“箓”同类型的牌后,将“箓”置入弃牌堆。", ol_zhangchangpu: "OL张昌蒲", ol_zhangchangpu_prefix: "OL", olxingshen: "省身", @@ -1273,6 +1270,11 @@ const translates = { budugen: "步度根", olkouchao: "寇钞", olkouchao_info: "每轮每项限一次,你可以将一张牌当作【杀】/【火攻】/【过河拆桥】使用。此牌结算完毕后,将此项改为本局游戏最后一张不因使用进入弃牌堆的基本牌或普通锦囊牌的牌名,然后若〖寇钞〗的所有项均为基本牌,则你修改〖寇钞〗的所有项为【顺手牵羊】。", + caoteng: "曹腾", + olyongzu: "拥族", + olyongzu_info: "准备阶段,你可以选择一名其他角色。你与其依次选择不同的一项执行:①摸两张牌;②回复1点体力;③复原武将牌。若你与其势力相同,则额外添加两项:④手牌上限+1;⑤若势力为魏/群,则获得技能〖奸雄〗/〖天命〗。", + olqingliu: "清流", + olqingliu_info: "锁定技。①游戏开始时,你选择魏国和群雄中的一个,将势力变更至此势力。②当你首次脱离濒死状态后,你将势力变更至〖清流①〗未选择的势力。", }; export default translates; diff --git a/character/sp/voices.js b/character/sp/voices.js index 8d9fba22d9..64ebddbb32 100644 --- a/character/sp/voices.js +++ b/character/sp/voices.js @@ -1,4 +1,9 @@ export default { + "#olziruo1": "泰山虽崩于前,我亦风清云淡。", + "#olziruo2": "诸君勿忧,一切尽在掌握。", + "#olxvfa1": "常言道,积善之家必有余庆。", + "#olxvfa2": "蓄势待发,一鸣惊天下。", + "#ol_jiangwan:die": "臣既暗弱,加婴疾疢,规方无成……", "#olsilv1": "大义同胶漆,匪石心不移。", "#olsilv2": "人谁不虑终,日月有合离。", "#ollianju1": "叹息亦何为,但恐大义亏。", @@ -455,7 +460,7 @@ export default { "#zhugeke:die": "重权震主,是我疏忽了……", "#huxiao1": "大仇未报,还不能放弃!", "#huxiao2": "虎父无犬女!", - "#xueji1": "取你首级,祭先父之灵!", + "#xueji1": "这炽热的鲜血,父亲,你可感觉得到?", "#xueji2": "取你首级,祭先父之灵!", "#wuji1": "我感受到了,父亲的力量。", "#wuji2": "我也要像父亲那样坚强。", @@ -676,7 +681,7 @@ export default { "#wangyun:die": "努力谢关东诸公,勤以国家为念!", "#qianya1": "君子不妄动,动必有道。", "#qianya2": "哎!将军过誉了!", - "#shuimeng1": "你我唇齿相依,共御外敌,何如? ", + "#shuimeng1": "你我唇齿相依,共御外敌,何如?", "#shuimeng2": "今兵薄势寡,可遣某为使往说之。", "#sunqian:die": "恨不能……得见皇叔早登大宝,咳咳咳……", "#tiandu_xizhicai1": "既是如此。", @@ -746,8 +751,6 @@ export default { "#xintan2": "人人心中都有一团欲望之火!", "#tianxiang_daxiaoqiao1": "哼,我才不怕你呢~", "#tianxiang_daxiaoqiao2": "替我挡着吧~", - "#liuli_daxiaoqiao1": "不懂得怜香惜玉么~", - "#liuli_daxiaoqiao2": "交给你了。", "#zhengnan1": "末将愿承父志,随丞相出征!", "#zhengnan2": "索全凭丞相差遣,万死不辞!", "#wusheng_guansuo1": "逆贼,可识得关氏之勇?", @@ -776,6 +779,6 @@ export default { "#olpijing2": "荆楚多锦绣,安能丧于小儿之手!", "#liupan:die": "今袍泽离散,无以为战……", "#olqingya1": "罡风从虎,威震四方!", - "#olqingya1": "铁车过处,寸草不生!", + "#olqingya2": "铁车过处,寸草不生!", "#yadan:die": "多谢丞相不杀之恩……", }; diff --git a/character/sp2/character.js b/character/sp2/character.js index 1c1b51b051..2c46de53eb 100644 --- a/character/sp2/character.js +++ b/character/sp2/character.js @@ -1,15 +1,17 @@ const characters = { + mp_wangrong: ["male", "wei", 3, ["mpjianlin", "mpsixiao"]], matie: ["male", "qun", 4, ["dczhuiwang", "dcquxian"]], hansong: ["male", "qun", 3, ["dcyinbi", "dcshuaiyan"]], chezhou: ["male", "wei", 4, ["dcshefu", "dcpigua"]], star_zhangzhao: ["male", "wu", 3, ["starzhongyan", "starjinglun"]], star_sunjian: ["male", "qun", "4/5", ["starruijun", "stargangyi"]], - liqueguosi: ["male", "qun", 4, ["xiongsuan"]], + liqueguosi: ["male", "qun", 4, ["xiongsuan"], ["name:李|傕-郭|汜"]], star_zhangchunhua: ["female", "wei", 3, ["starliangyan", "starminghui"]], star_yuanshao: ["male", "qun", 4, ["starxiaoyan", "starzongshi", "starjiaowang", "staraoshi"], ["zhu"]], star_dongzhuo: ["male", "qun", 5, ["starweilin", "starzhangrong", "starhaoshou"], ["zhu"]], star_yuanshu: ["male", "qun", 4, ["starcanxi", "starpizhi", "starzhonggu"], ["zhu"]], star_caoren: ["male", "wei", 4, ["starsujun", "starlifeng"]], + star_sunshangxiang: ["female", "wu", 3, ["starsaying", "starjiaohao"]], mp_liuling: ["male", "jin", 3, ["mpjiusong", "mpmaotao", "mpbishi"], ["doublegroup:wei:qun:jin"]], dc_jikang: ["male", "wei", 3, ["new_qingxian", "dcjuexiang"]], dc_jsp_guanyu: ["male", "wei", 4, ["new_rewusheng", "dcdanji"]], @@ -20,7 +22,7 @@ const characters = { sunlang: ["male", "shu", 4, ["dctingxian", "dcbenshi"]], shiyi: ["male", "wu", 3, ["dccuichuan", "dczhengxu"]], dc_hujinding: ["female", "shu", "3/6", ["dcdeshi", "dcwuyuan", "huaizi"]], - liyixiejing: ["male", "wu", 4, ["dcdouzhen"]], + liyixiejing: ["male", "wu", 4, ["dcdouzhen"], ["name:李|异-谢|旌"]], mushun: ["male", "qun", 4, ["dcjinjian", "dcshizhao"]], dc_zhaoyǎn: ["male", "wei", 3, ["dcfuning", "dcbingji"]], wangwei: ["male", "qun", 4, ["dcruizhan", "dcshilie"]], @@ -32,22 +34,22 @@ const characters = { yanrou: ["male", "wei", 4, ["choutao", "xiangshu"]], dc_zhuling: ["male", "wei", 4, ["dczhanyi"]], licaiwei: ["female", "wei", 3, ["yijiao", "qibie"]], - yanfuren: ["female", "qun", 3, ["channi", "nifu"]], + yanfuren: ["female", "qun", 3, ["channi", "nifu"], ["name:严|null"]], haomeng: ["male", "qun", 7, ["xiongmang"]], re_pangdegong: ["male", "qun", 3, ["heqia", "yinyi"]], hanmeng: ["male", "qun", 4, ["jieliang", "quanjiu"]], xinping: ["male", "qun", 3, ["fuyuan", "zhongjie", "yongdi"]], zhangning: ["female", "qun", 3, ["tianze", "difa"]], tongyuan: ["male", "qun", 4, ["chaofeng", "chuanshu"]], - sp_mifangfushiren: ["male", "shu", 4, ["fengshi"]], - re_nanhualaoxian: ["male", "qun", 4, ["gongxiu", "jinghe"]], - dufuren: ["female", "wei", 3, ["yise", "shunshi"]], + sp_mifangfushiren: ["male", "shu", 4, ["fengshi"], ["name:糜|芳-傅|士仁"]], + re_nanhualaoxian: ["male", "qun", 4, ["gongxiu", "jinghe"], ["name:庄|周"]], + dufuren: ["female", "wei", 3, ["yise", "shunshi"], ["name:杜|null"]], caoanmin: ["male", "wei", 4, ["xianwei"]], - re_zoushi: ["female", "qun", 3, ["rehuoshui", "reqingcheng"]], + re_zoushi: ["female", "qun", 3, ["rehuoshui", "reqingcheng"], ["name:邹|null"]], qiuliju: ["male", "qun", "4/6", ["koulve", "qljsuiren"]], re_hucheer: ["male", "qun", 4, ["redaoji", "fuzhong"]], re_dongcheng: ["male", "qun", 4, ["xuezhao"]], - tangji: ["female", "qun", 3, ["kangge", "jielie"]], + tangji: ["female", "qun", 3, ["kangge", "jielie"], ["name:唐|null"]], zhangheng: ["male", "qun", 8, ["dangzai", "liangjue"]], duanwei: ["male", "qun", 4, ["langmie"]], re_niujin: ["male", "wei", 4, ["recuorui", "reliewei"]], @@ -73,8 +75,8 @@ const characters = { guosi: ["male", "qun", 4, ["xinfu_tanbei", "xinfu_sidao"], []], lvkai: ["male", "shu", 3, ["xinfu_tunan", "xinfu_bijing"], []], zhanggong: ["male", "wei", 3, ["xinfu_zhenxing", "xinfu_qianxin"], []], - weiwenzhugezhi: ["male", "wu", 4, ["xinfu_fuhai"], []], - beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia"]], + weiwenzhugezhi: ["male", "wu", 4, ["xinfu_fuhai"], ["name:卫|温-诸葛|直"]], + beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia"], ["name:卑弥|呼"]], xurong: ["male", "qun", 4, ["xinfu_xionghuo", "xinfu_shajue"], []], zhangqiying: ["female", "qun", 3, ["xinfu_falu", "xinfu_dianhua", "xinfu_zhenyi"], []], sp_liuqi: ["male", "qun", 3, ["rewenji", "sptunjiang"]], @@ -94,7 +96,7 @@ const characters = { sp_zhanghe: ["male", "qun", 4, ["yuanlve"]], sp_xuyou: ["male", "qun", 3, ["spshicai", "spfushi"]], chunyuqiong: ["male", "qun", 5, ["cangchu", "sushou", "liangying"]], - lvkuanglvxiang: ["male", "qun", 4, ["liehou", "qigong"]], + lvkuanglvxiang: ["male", "qun", 4, ["liehou", "qigong"], ["name:吕|旷-吕|翔"]], }; export default characters; diff --git a/character/sp2/characterReplace.js b/character/sp2/characterReplace.js index 285059751b..8a8538a256 100644 --- a/character/sp2/characterReplace.js +++ b/character/sp2/characterReplace.js @@ -33,6 +33,8 @@ const characterReplaces = { wangjun: ["dc_wangjun", "wangjun"], re_zoushi: ["yue_zoushi", "re_zoushi", "jsrg_zoushi"], zhangmancheng: ["dc_zhangmancheng", "tw_zhangmancheng"], + xf_huangquan: ["xf_huangquan", "dc_huangquan"], + re_zoushi: ["re_zoushi", "jsrg_zoushi", "yue_zoushi"], }; export default characterReplaces; diff --git a/character/sp2/intro.js b/character/sp2/intro.js index 92e9b96b44..b3022764b0 100644 --- a/character/sp2/intro.js +++ b/character/sp2/intro.js @@ -68,6 +68,7 @@ const characterIntro = { chezhou: "车胄(?-199年至200年),东汉末年武将,为曹操所置徐州刺史。建安四年,左将军刘备率军出征,前往下邳,于同年或次年杀死车胄。", hansong: "韩嵩(生卒年不详),字德高,南阳人。少好学,贫不改操。不应三公辟命,与同好数人隐居郦西山中。后担任刘表手下的别驾,转为从事中郎。出使许都,被拜为侍中,迁零陵太守。建安十三年(208年),韩嵩与蒯越、傅巽劝刘琮降曹。曹操平定荆州后,拜韩嵩为大鸿胪。", matie: "马铁(?-212年),扶风茂陵(今陕西兴平)人。马腾之子,马超之弟。马腾遭韩遂进攻,乃携马铁等入京受职。马铁被封为骑都尉。后在邺城居住。因其兄马超反曹而被曹操夷灭。", + mp_wangrong: "王戎(234年-305年7月11日),字濬冲。琅玡郡临沂县(今山东省临沂市白沙埠镇诸葛村)人。祖父为三国魏幽州刺史王雄,曹魏凉州刺史王浑的儿子。三国至西晋时期名士、官员,“竹林七贤”之一。
王戎出身琅玡王氏。自少神采秀美,长于清谈,以精辟的品评与识鉴而著称,以聪颖知名,为父辈好友、名士阮籍器重,后人视之为玄学名士。初袭父爵贞陵亭侯,被大将军司马昭辟为掾属。累官豫州刺史、建威将军,参与晋灭吴之战。战后以功进封安丰县侯,故人称“王安丰”。治理荆州时,他拉拢士人,颇有成效。后历任侍中、光禄勋、吏部尚书、太子太傅、中书令、尚书左仆射等职。元康七年(296年),升任司徒,位列三公。王戎认为天下将乱,于是不理世事,以山水游玩为乐。赵王司马伦发动政变时,王戎被牵连免官。之后被起用为尚书令,再迁司徒。右将军张方劫持晋惠帝入长安后,王戎逃奔郏县。
永兴二年(305年),王戎去世,时年七十二,谥号为“元”。", }; export default characterIntro; diff --git a/character/sp2/skill.js b/character/sp2/skill.js index 104452e7b9..b85f022760 100644 --- a/character/sp2/skill.js +++ b/character/sp2/skill.js @@ -2,6 +2,190 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //王戎 + mpjianlin: { + audio: 2, + trigger: { + global: "phaseAfter", + }, + getCards(player) { + const cards = []; + game.checkGlobalHistory("cardMove", evt => { + if (evt.name == "lose") { + if (evt.position !== ui.discardPile) return false; + } else if (evt.name !== "cardsDiscard") return false; + if (get.info("mpjianlin").isUseOrRespond(evt, player)) { + cards.addArray( + evt.cards.filter(card => { + return get.type(card) == "basic" && get.position(card) === "d"; + }) + ); + } + }); + player.checkHistory("lose", evt => { + if (evt.type == "discard") { + cards.addArray( + evt.cards2.filter(card => { + return get.type(card) == "basic" && get.position(card) === "d"; + }) + ); + } + }); + return cards; + }, + isUseOrRespond(event, player) { + if (event.name !== "cardsDiscard") return false; + const evtx = event.getParent(); + if (evtx.name !== "orderingDiscard") return false; + const evt2 = evtx.relatedEvent || evtx.getParent(); + return ["useCard", "respond"].includes(evt2.name) && evt2.player == player; + }, + filter(event, player) { + return get.info("mpjianlin").getCards(player).length; + }, + async cost(event, trigger, player) { + const cards = get.info("mpjianlin").getCards(player); + const { + result: { bool, links }, + } = await player.chooseButton(["悭吝:你可以获得其中一张牌", cards]).set("ai", get.buttonValue); + event.result = { + bool: bool, + cost_data: links, + }; + }, + async content(event, trigger, player) { + player.gain(event.cost_data, "gain2"); + }, + }, + mpsixiao: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + locked: true, + filter(event, player) { + return (event.name != "phase" || game.phaseNumber == 0) && game.hasPlayer(current => current != player); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(true, lib.filter.notMe, "死孝:请选择一名角色当其孝子", "当该角色需要使用或打出除【无懈可击】外的牌时,其可以观看你的手牌并可以使用或打出其中一张牌,然后你摸一张牌") + .set("ai", target => { + return get.attitude(get.player(), target); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + game.log(player, "成为了", target, "的孝子"); + target.storage.mpsixiao_use = player; + target.addSkill("mpsixiao_use"); + }, + subSkill: { + use: { + charlotte: true, + mark: "character", + intro: { + content: "当你需要使用或打出除【无懈可击】外的牌时,你可以观看$的手牌并可以使用或打出其中一张牌,然后$摸一张牌", + }, + hiddenCard(player, name) { + if (name == "wuxie" || !lib.inpile.includes(name) || player.hasSkill("mpsixiao_used", null, null, false)) return false; + const target = player.storage.mpsixiao_use; + const cards = target.getCards("h"); + for (var i of cards) { + if (get.name(i, target) == name) return true; + } + return false; + }, + enable: ["chooseToUse", "chooseToRespond"], + filter(event, player) { + const target = player.storage.mpsixiao_use; + const cards = target.getCards("h"); + if (player.hasSkill("mpsixiao_used", null, null, false)) return false; + return cards.some(i => + event.filterCard( + { + name: get.name(i, target), + nature: get.nature(i, target), + isCard: true, + }, + player, + event + ) + ); + }, + chooseButton: { + dialog(event, player) { + const target = player.storage.mpsixiao_use; + const cards = target.getCards("h"); + return ui.create.dialog("死孝", cards); + }, + filter(button, player) { + const evt = _status.event.getParent(); + const target = player.storage.mpsixiao_use; + return evt.filterCard( + { + name: get.name(button.link, target), + nature: get.nature(button.link, target), + isCard: true, + }, + player, + evt + ); + }, + check(button) { + const player = get.player(); + const evt = _status.event.getParent(); + if (evt.dying) return get.attitude(player, evt.dying); + if (_status.event.getParent().type != "phase") return 1; + return player.getUseValue(get.autoViewAs(button.link), null, true); + }, + backup(links, player) { + const target = player.storage.mpsixiao_use; + return { + viewAs: { + name: get.name(links[0], target), + nature: get.nature(links[0], target), + isCard: true, + }, + card: links[0], + filterCard: () => false, + selectCard: -1, + log: false, + async precontent(event, trigger, player) { + const card = lib.skill.mpsixiao_use_backup.card, + target = player.storage.mpsixiao_use; + event.result.card = card; + event.result.cards = [card]; + player.addTempSkill("mpsixiao_used"); + target + .when({ global: ["useCard", "respond"] }) + .filter(evt => evt.player == player && evt.skill == "mpsixiao_use_backup") + .then(() => { + player.draw(); + }); + }, + }; + }, + ai: { + hasSha: true, + hasShan: true, + skillTagFilter(player, tag) { + const name = "s" + tag.slice(4); + return lib.skill.mpsixiao_use.hiddenCard(player, name); + }, + }, + }, + ai: { + order: 8, + result: { + player: 1, + }, + }, + }, + used: {}, + }, + }, //马铁 dczhuiwang: { mod: { @@ -364,38 +548,41 @@ const skills = { player: "useCardToPlayered", }, filter(event, player) { - if (event.targets.length > 1) return false; if ( + !player.isPhaseUsing() || player.hasHistory("useCard", evt => { if (evt === event.getParent()) return false; const targets = evt.targets; - return targets.length === 1 && targets[0] !== player; + return evt.isPhaseUsing() && targets.some(target => target !== player); }) ) return false; - const target = event.target; - if (target === player || !target.isIn()) return false; - return true; + return (event.targets || []).some(target => target !== player && target.isIn()); }, - logTarget: "target", locked: false, - check(event, player) { - return ( - get.attitude(player, event.target) <= 0 || - !player.hasCard(card => { - return game.hasPlayer(current => { - return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true); - }); - }, "hs") - ); - }, - prompt2(event, player) { - return `摸${get.cnNumber(player.getDamagedHp() + 1)}张牌,令所有除${get.translation(event.target)}外的其他角色不在你的攻击范围内,且你对其造成的伤害逐次增加。`; + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt(event.name.slice(0, -5)), `选择其中一名目标角色,摸${get.cnNumber(player.getDamagedHp() + 1)}张牌,令所有除其外的其他角色不在你的攻击范围内,且你对其造成的伤害逐次增加。`, (card, player, target) => { + return target != player && get.event().getTrigger().targets.includes(target) && target.isIn(); + }) + .set("ai", target => { + const player = get.player(); + if ( + player.hasCard(card => { + return game.hasPlayer(current => { + return get.effect(current, card, player, player) > 0 && player.canUse(card, current, true, true); + }); + }, "hs") + ) + return 0; + return -get.attitude(player, target); + }) + .forResult(); }, async content(event, trigger, player) { await player.draw(player.getDamagedHp() + 1); player.addTempSkill("starruijun_effect", "phaseChange"); - player.markAuto("starruijun_effect", trigger.target); + player.markAuto("starruijun_effect", event.targets[0]); }, subSkill: { effect: { @@ -496,6 +683,11 @@ const skills = { result: { player(player, target) { let res = 2 * get.effect(player, { name: "draw" }, player, player); + if (player.hp <= 1 && !player.hasCard(i => { + let name = get.name(i, player); + if (name != "tao" && name != "jiu") return false; + return lib.filter.cardSavable(i, player, player); + }, "hs")) res = -res / 2; if (player !== target) res += get.effect(player, { name: "losehp" }, player, player); return res; }, @@ -1093,7 +1285,9 @@ const skills = { if (event.triggername != "roundStart") { var list = game.filterPlayer().reduce((list, target) => list.add(target.group), []); list.sort((a, b) => lib.group.indexOf(a) - lib.group.indexOf(b)); + let lacks = lib.group.filter(group => group != "shen" && !list.includes(group)); list.forEach(group => lib.skill.starcanxi.create(group, player)); + if (lacks.length) player.gainMaxHp(lacks.length); event.finish(); return; } @@ -1272,6 +1466,7 @@ const skills = { trigger: { player: "phaseEnd", global: "die" }, filter: function (event, player) { if (event.name == "phase") return player.hasMark("starpizhi"); + if (!game.hasPlayer(current => current != event.player && current.group == event.player.group)) return true; if (!player.getStorage("starcanxi_wangsheng").includes(event.player.group) && !player.getStorage("starcanxi_xiangsi").includes(event.player.group)) return false; var groups = player.getSkills().filter(skill => skill.indexOf("starcanxi_") == 0); groups = groups.map(group => group.slice(10)); @@ -1286,6 +1481,8 @@ const skills = { } "step 1"; player.draw(player.countMark("starpizhi")); + "step 2" + if (player.isDamaged() && trigger.name == "die") player.recover(); }, intro: { content: "已失去#个“玺角”" }, ai: { combo: "starcanxi" }, @@ -1416,6 +1613,180 @@ const skills = { }, }, }, + //星孙尚香 + starsaying: { + audio: 2, + enable: "chooseToUse", + hiddenCard: function (player, name) { + if (player.getStorage('starsaying').includes(name)) return false; + if (['shan', 'sha'].includes(name)) return player.countCards("hs", card => get.type(card) == "equip" && player.canEquip(card, true)); + if (['tao', 'jiu'].includes(name)) return player.countCards("e"); + }, + filter: function (event, player) { + for (var name of ['shan', 'sha']) { + if (player.getStorage('starsaying').includes(name)) continue; + if (!player.countCards("hs", card => get.type(card) == "equip" && player.canEquip(card, true))) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; + } + for (var name of ['tao', 'jiu']) { + if (player.getStorage('starsaying').includes(name)) continue; + if (!player.countCards("e")) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) return true; + } + return false; + }, + chooseButton: { + dialog: function (event, player) { + var list = []; + for (var name of ['shan', 'sha']) { + if (player.getStorage('starsaying').includes(name)) continue; + if (!player.countCards("hs", card => get.type(card) == "equip" && player.canEquip(card, true))) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) list.push(['基本', '', name]); + } + for (var name of ['tao', 'jiu']) { + if (player.getStorage('starsaying').includes(name)) continue; + if (!player.countCards("e")) continue; + if (event.filterCard({ name: name, isCard: true }, player, event)) list.push(['基本', '', name]); + } + return ui.create.dialog("飒影", [list, "vcard"], "hidden"); + }, + check: function (button) { + var player = _status.event.player; + var card = { name: button.link[2], isCard: true }; + return player.getUseValue(card); + }, + backup: function (links, player) { + return { + check: function (card) { + return 1 / Math.max(0.1, get.value(card)); + }, + filterCard: function (card) { + let bool = ['sha', 'shan'].includes(links[0][2]); + if (bool) return get.position(card) != 'e' && get.type(card) == 'equip' && player.canEquip(card, true); + return get.position(card) == 'e'; + }, + position: 'hes', + viewAs: { + name: links[0][2], + nature: links[0][3], + suit: "none", + number: null, + isCard: true, + }, + popname: true, + ignoreMod: true, + precontent: function () { + player.logSkill("starsaying"); + var card = event.result.cards[0]; + player.$give(card, player, false); + if (['sha', 'shan'].includes(event.result.card.name)) player.equip(card); + else player.gain(card, 'gain2'); + var viewAs = { + name: event.result.card.name, + nature: event.result.card.nature, + }; + event.result.card = viewAs; + event.result.cards = []; + if (!player.storage.starsaying) { + player.when({ global: "roundStart" }).then(() => { + delete player.storage.starsaying; + }); + } + player.markAuto("starsaying", viewAs.name); + }, + }; + }, + prompt: function (links, player) { + var str = ['sha', 'shan'].includes(links[0][2]) ? "使用一张装备牌" : "获得装备区里的一张牌"; + return str + ",视为使用" + get.translation(links[0][3] || "") + get.translation(links[0][2]); + }, + }, + ai: { + order: function () { + var player = _status.event.player; + var event = _status.event; + if (event.filterCard({ name: "jiu" }, player, event) && get.effect(player, { name: "jiu" }) > 0) { + return 6.3; + } + return 6.1; + }, + skillTagFilter: function (player, tag, arg) { + let name = tag == 'respondSha' ? 'sha' : 'shan'; + if (player.getStorage('starsaying').includes(name)) return false; + if (!player.countCards('hs', card => get.type(card) == 'equip' && player.canEquip(card, true))) { + return false; + } + }, + result: { + player: 1, + }, + respondSha: true, + respondShan: true, + }, + }, + starjiaohao:{ + audio: 2, + enable: "phaseUse", + usable: 1, + filter: function (event, player) { + return player.countCards("h") && game.hasPlayer(current => lib.skill.starjiaohao.filterTarget(null, player, current)); + }, + filterTarget: function (card, player, target) { + return player.canCompare(target) && player.countCards('e') >= target.countCards('e'); + }, + async content(event, trigger, player) { + const target = event.target; + const result = await player.chooseToCompare(target).forResult(); + if (result.winner) { + const cards = [result.player, result.target].filterInD("d"); + const result2 = await player.chooseControl('cancel2').set('choiceList', [ + '令' + get.translation(result.winner) + '获得' + (cards.length ? get.translation(cards) : '空气'), + '令' + get.translation(result.winner) + '使用一张杀', + ]).set('ai', function () { + return _status.event.check; + }).set("check", function () { + if (get.attitude(player, result.winner) <= 0) return 'cancel2'; + if (!game.hasPlayer(current => { + return result.winner.canUse({ name: 'sha' }, current, false) && get.effect(current, { name: 'sha' }, result.winner, result.winner) > 0; + })) return '选项一'; + const eff1 = result.winner.getUseValue({ name: 'sha' }); + const eff2 = (get.value(cards[0], result.winner) + get.value(cards[1], result.winner)); + if (eff1 > eff2 * 2.5) return '选项二'; + return '选项一'; + }()).forResult(); + switch (result2.control) { + case '选项二': { + const next = result.winner.chooseToUse("是否使用一张杀?", { name: "sha" }).set("filterTarget", function (card, player, target) { + return lib.filter.filterTarget.apply(this, arguments); + }).set("addCount", false); + await next; + break; + } + case '选项一': { + await result.winner.gain(cards, 'gain2'); + break; + } + } + } + }, + ai: { + order: 5, + result: { + target: function (player, target) { + var hs = player.getCards("h").sort(function (a, b) { + return b.number - a.number; + }); + var ts = target.getCards("h").sort(function (a, b) { + return b.number - a.number; + }); + if (!hs.length || !ts.length) return 0; + if (hs[0].number <= ts[0].number) return 2; + if (player.countCards("h") >= target.countCards("h")) return -10; + return -1; + }, + }, + }, + }, //小程序刘伶 mpjiusong: { audio: 2, @@ -1841,8 +2212,11 @@ const skills = { async content(event, trigger, player) { player.awakenSkill("dcdanji"); await player.loseMaxHp(); - await player.recover(player.maxHp - player.hp); - await player.draw(player.getHp()); + const num = player.maxHp - player.hp; + if (num) { + await player.recover(num); + await player.draw(num); + } await player.addSkills(["mashu", "dcnuchen"]); }, ai: { @@ -2490,7 +2864,7 @@ const skills = { player.addTempSkill("dcmoukui_conseq"); player.markAuto("dcmoukui_conseq", [trigger.card]); } - } + } else event.finish(); "step 2"; player.discardPlayerCard(event.directtarget || result.targets[0], true, "he").boolline = true; }, @@ -4161,7 +4535,6 @@ const skills = { } }, logTarget: "player", - shaRelated: true, content: function () { "step 0"; if (player != game.me && !player.isOnline() && !player.isUnderControl()) game.delayx(); @@ -5027,7 +5400,6 @@ const skills = { tianze: { audio: 2, trigger: { global: "useCardAfter" }, - direct: true, filter: function (event, player) { return ( player != event.player && @@ -5037,41 +5409,37 @@ const skills = { return evt && evt.hs.length && evt.getParent() == event; }) && event.player.isPhaseUsing() && - !player.hasSkill("tianze_block") - ); - }, - content: function () { - "step 0"; - player.addTempSkill("tianze_block"); - if ( - !player.hasCard(function (card) { + !player.hasSkill("tianze_block") && + player.hasCard(card => { if (_status.connectMode && get.position(card) == "h") return true; return get.color(card, player) == "black"; }, "he") - ) - event.finish(); - else - player - .chooseToDiscard( - "he", - function (card, player) { - return get.color(card, player) == "black"; - }, - get.prompt("tianze", trigger.player), - "弃置一张黑色牌并对其造成1点伤害" - ) - .set("ai", function (card) { - if (!_status.event.goon) return 0; - return 8 - get.value(card); - }) - .set("goon", get.damageEffect(trigger.player, player, player) > 0).logSkill = ["tianze", trigger.player]; - "step 1"; - if (result.bool) { - if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); - trigger.player.damage(); - } else event.finish(); - "step 2"; - game.delayx(); + ); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseToDiscard( + "he", + function (card, player) { + return get.color(card, player) == "black"; + }, + get.prompt("tianze", trigger.player), + "弃置一张黑色牌并对其造成1点伤害" + ) + .set("ai", function (card) { + if (!_status.event.goon) return 0; + return 8 - get.value(card); + }) + .set("goon", get.damageEffect(trigger.player, player, player) > 0) + .set("logSkill", ["tianze", trigger.player]) + .forResult(); + }, + popup: false, + async content(event, trigger, player) { + player.addTempSkill("tianze_block"); + if (get.mode() != "identity" || player.identity != "nei") player.addExpose(0.2); + await trigger.player.damage(); + await game.asyncDelayx(); }, group: "tianze_draw", subSkill: { @@ -5092,7 +5460,7 @@ const skills = { difa: { trigger: { player: "gainAfter" }, filter: function (event, player) { - if (player != _status.currentPhase || event.getParent().name != "draw") return false; + if (player != _status.currentPhase) return false; var hs = player.getCards("h"); if (!hs.length) return false; for (var i of event.cards) { @@ -5245,7 +5613,6 @@ const skills = { chuanyun: { audio: true, trigger: { player: "useCardToPlayered" }, - shaRelated: true, filter: function (event, player) { return event.card.name == "sha" && event.target.countCards("e") > 0; }, @@ -6022,8 +6389,9 @@ const skills = { event.cardType = cardType; var num = player.countDisabledSlot(); if (num < 5) player.draw(5 - num); + if (!game.hasPlayer(current => current != player)) return; player - .chooseTarget(lib.filter.notMe, "是否令一名其他角色从牌堆中使用一张" + get.translation(cardType) + "牌?") + .chooseTarget(lib.filter.notMe, true, "令一名其他角色从牌堆中使用一张" + get.translation(cardType) + "牌") .set("ai", function (target) { var player = _status.event.player, type = _status.event.cardType; @@ -6390,6 +6758,9 @@ const skills = { player.markAuto("xuezhao_hit", [target]); } }, + contentAfter:function(){ + if(!player.getHistory('gain',evt=>evt.getParent('useSkill')==event.getParent('useSkill')).length) player.drawTo(player.maxHp); + }, ai: { threaten: 2.4, order: 3.6, @@ -6585,7 +6956,6 @@ const skills = { //张横 dangzai: { trigger: { player: "phaseUseBegin" }, - direct: true, filter: function (event, player) { return ( !player.isDisabledJudge() && @@ -6599,9 +6969,8 @@ const skills = { }) ); }, - content: function () { - "step 0"; - player.chooseTarget( + async cost(event, trigger, player) { + event.result = await player.chooseTarget( function (card, player, target) { return ( target != player && @@ -6611,27 +6980,25 @@ const skills = { ); }, get.prompt("dangzai"), - "将一名其他角色判定区内的一张牌移动到你的判定区内" - ); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.logSkill("dangzai", target); - player.choosePlayerCard(target, "j", true).set("filterButton", function (button) { - return _status.event.player.canAddJudge(button.link); - }); - } else event.finish(); - "step 2"; - if (result.bool && result.cards && result.cards.length) { - var card = result.cards[0]; - target.$give(card, player); - game.delayx(); - var name = card.viewAs || card.name; - if (card.name != name) { - player.addJudge(name, card); - } else { - player.addJudge(card); + "将一名其他角色判定区内的任意张牌移动到你的判定区内" + ).forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + const result = await player.choosePlayerCard(target, "j", true, [1, Infinity]).set("filterButton", function (button) { + return _status.event.player.canAddJudge(button.link); + }).forResult(); + if (result.bool && result.cards) { + while (result.cards.length) { + const card = result.cards.shift(); + target.$give(card, player); + await game.asyncDelay(); + const name = card.viewAs || card.name; + if (card.name != name) { + await player.addJudge(name, card); + } else { + await player.addJudge(card); + } } } }, @@ -6642,25 +7009,29 @@ const skills = { global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], }, forced: true, - filter: function (event, player) { - if (player.hp <= 1) return false; + getIndex: function (event, player, triggername) { + let num = 0; if (event.player == player) { - if (event.name == "equip" && get.color(event.card, player) == "black") return true; - if (event.name == "addJudge" && get.color(event.cards[0], player) == "black") return true; - } - var evt = event.getl(player); - if (!evt || !evt.es || !evt.js || (!evt.es.length && !evt.js.length)) return false; - for (var i of evt.es) { - if (get.color(i, player) == "black") return true; + if (event.name == "equip" && get.color(event.card, player) == "black") num++; + if (event.name == "addJudge" && get.color(event.cards[0], player) == "black") num++; + } + if (!event.getl) return num; + let evt = event.getl(player); + if (evt.es && evt.es.length) { + for (var i of evt.es) { + if (get.color(i, player) == "black") num++; + } } - for (var i of evt.js) { - if (get.color(i, player) == "black") return true; + if (evt.js && evt.js.length) { + for (var i of evt.js) { + if (get.color(i, player) == "black") num++; + } } - return false; + return num; }, - content: function () { - player.loseHp(); - player.draw(2); + async content(event, trigger, player) { + await player.draw(2); + if (player.hp > 1) await player.loseHp(); }, }, //狼灭 @@ -7047,8 +7418,10 @@ const skills = { var target = result.targets[0]; player.logSkill("reyirang", target); player.give(cards, target, "give"); - if (target.maxHp > player.maxHp) player.gainMaxHp(target.maxHp - player.maxHp, true); - player.recover(cards.length); + if (target.maxHp > player.maxHp) { + player.gainMaxHp(target.maxHp - player.maxHp, true); + player.recover(cards.length); + } } }, }, @@ -11621,25 +11994,23 @@ const skills = { trigger: { player: ["damageEnd", "phaseJieshuBegin"], }, - direct: true, - content: function () { - "step 0"; - player + async cost(event, trigger, player) { + const result = await player .chooseControl("一张", "两张", "三张", "cancel2") .set("prompt", get.prompt2("xinfu_zhenxing")) - .set("", function () { + .set("ai", function () { return 0; - }); - "step 1"; - if (result.control == "cancel2") event.finish(); - else { - player.logSkill("xinfu_zhenxing"); - event.num = { 一张: 1, 两张: 2, 三张: 3 }[result.control]; - } - "step 2"; - event.cards = get.cards(num); - player - .chooseButton(["【镇行】:请选择要获得的牌", event.cards]) + }).forResult(); + event.result = { + bool: result.control !== "cancel2", + cost_data: result.index + 1 + }; + }, + async content(event, trigger, player) { + const cards = get.cards(event.cost_data); + await game.cardsGotoOrdering(cards); + let result = await player + .chooseButton(["【镇行】:请选择要获得的牌", cards]) .set("filterButton", function (button) { var cards = _status.event.cards; for (var i = 0; i < cards.length; i++) { @@ -11650,18 +12021,9 @@ const skills = { .set("ai", function (button) { return get.value(button.link); }) - .set("cards", event.cards); - "step 3"; - var tothrow = []; - for (var i = event.cards.length - 1; i >= 0; i--) { - if (result.bool && result.links.includes(event.cards[i])) { - player.gain(event.cards[i], "gain2"); - } else { - event.cards[i].fix(); - ui.cardPile.insertBefore(event.cards[i], ui.cardPile.childNodes[0]); - } - } - game.updateRoundNumber(); + .set("cards", cards) + .forResult(); + if (result.bool) player.gain(result.links, "gain2"); }, }, xinfu_qianxin: { diff --git a/character/sp2/sort.js b/character/sp2/sort.js index 65d8f07e38..f141343c0f 100644 --- a/character/sp2/sort.js +++ b/character/sp2/sort.js @@ -15,8 +15,8 @@ const characterSort = { sp_zhongyuan: ["re_hucheer", "re_zoushi", "caoanmin", "re_dongcheng"], sp_xiaohu: ["haomeng", "yanfuren", "yanrou", "dc_zhuling"], sp_qunxiong: ["chezhou", "hansong", "matie"], - sp_star: ["star_caoren", "star_yuanshu", "star_dongzhuo", "star_yuanshao", "star_zhangchunhua", "star_sunjian", "star_zhangzhao"], - mini_qixian: ["mp_liuling"], + sp_star: ["star_caoren", "star_yuanshu", "star_dongzhuo", "star_yuanshao", "star_zhangchunhua", "star_sunjian", "star_zhangzhao", "star_sunshangxiang"], + mini_qixian: ["mp_liuling", "mp_wangrong"], sp2_waitforsort: ["caobuxing", "re_maliang", "dc_jikang"], }; diff --git a/character/sp2/translate.js b/character/sp2/translate.js index 62de742d21..fd268954d1 100644 --- a/character/sp2/translate.js +++ b/character/sp2/translate.js @@ -291,7 +291,7 @@ const translates = { csyizheng2: "翊正", csyizheng_info: "结束阶段开始时,你可以选择一名其他角色。你的下回合开始前,当该角色造成伤害或回复体力时,若其体力上限小于你,则你减1点体力上限,且令此伤害值/回复值+1。", reyirang: "揖让", - reyirang_info: "出牌阶段开始时,你可以将所有非基本牌交给一名其他角色。若其体力上限大于你,则你将体力上限调整至与其相同。然后你回复X点体力(X为你以此法交给其的牌数)。", + reyirang_info: "出牌阶段开始时,你可以将所有非基本牌交给一名其他角色。若其体力上限大于你,则你将体力上限调整至与其相同并回复X点体力(X为你以此法交给其的牌数)。", liangxing: "梁兴", lulve: "掳掠", lulve_info: "出牌阶段开始时,你可选择一名有手牌且手牌数少于你的角色。其选择一项:①将所有手牌交给你,然后你将武将牌翻面。②将武将牌翻面,然后其视为对你使用一张【杀】。", @@ -316,9 +316,9 @@ const translates = { langmie_info: "其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以摸一张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。", zhangheng: "张横", dangzai: "挡灾", - dangzai_info: "出牌阶段开始时,你可将一名其他角色判定区内的一张牌移动至你的判定区内。", + dangzai_info: "出牌阶段开始时,你可将一名其他角色判定区内的任意张牌移动至你的判定区内。", liangjue: "粮绝", - liangjue_info: "锁定技,当有黑色牌进入或者离开你的判定区或装备区后,若你的体力值大于1,你失去1点体力,然后摸两张牌。", + liangjue_info: "锁定技,一张黑色牌进入或者离开你的判定区或装备区后,你摸两张牌,然后若你的体力值大于1,你失去1点体力。", tangji: "唐姬", kangge: "抗歌", kangge_info: "你的第一个回合开始时,选择一名其他角色,该角色每次于其回合外得到牌后,你摸等量的牌(每回合至多摸三张);其进入濒死状态时,你可令其回复体力至1点(每轮限一次)。该角色死亡时,你弃置所有牌并失去1点体力。", @@ -326,7 +326,7 @@ const translates = { jielie_info: "当你受到除自己和“抗歌”角色以外的角色造成的伤害时,你可以防止此伤害并选择一种花色,然后你失去X点体力,令“抗歌”角色从弃牌堆中随机获得X张此花色的牌(X为伤害值)。", re_dongcheng: "董承", xuezhao: "血诏", - xuezhao_info: "出牌阶段限一次,你可弃置一张手牌并选择至多X名其他角色(X为你的体力上限)。这些角色依次选择是否交给你一张牌,若选择是,该角色摸一张牌且你本回合可多使用一张【杀】;若选择否,该角色本回合无法响应你使用的牌。", + xuezhao_info: "出牌阶段限一次,你可弃置一张手牌并选择至多X名其他角色(X为你的体力上限)。这些角色依次选择是否交给你一张牌,若选择是,该角色摸一张牌且你本回合可多使用一张【杀】;若选择否,该角色本回合无法响应你使用的牌。若没有角色交给你牌,你将手牌摸至体力上限。", re_hucheer: "胡车儿", redaoji: "盗戟", redaoji2: "盗戟", @@ -345,7 +345,7 @@ const translates = { reqingcheng_info: "出牌阶段限一次,你可以与一名手牌数不大于你的男性角色交换手牌。", caoanmin: "曹安民", xianwei: "险卫", - xianwei_info: "锁定技,准备阶段,你废除一个装备栏并摸X张牌(X为你未废除的装备栏数),然后你可以令一名其他角色对其自己使用一张牌堆中的一张与此装备栏副类别相同的装备牌(没有可使用的牌则改为摸一张牌)。当你废除所有装备栏后,你加2点体力上限,然后你与所有其他角色视为在彼此的攻击范围内。", + xianwei_info: "锁定技,准备阶段,你废除一个装备栏并摸X张牌(X为你未废除的装备栏数),然后你令一名其他角色对其自己使用一张牌堆中的一张与此装备栏副类别相同的装备牌(没有可使用的牌则改为摸一张牌)。当你废除所有装备栏后,你加2点体力上限,然后你与所有其他角色视为在彼此的攻击范围内。", dufuren: "杜夫人", yise: "异色", yise_info: "其他角色得到你的牌后,若这些牌中:有红色牌,你可令其回复1点体力;有黑色牌,其下次受到因执行【杀】的效果造成的伤害时,此伤害+1。", @@ -390,9 +390,9 @@ const translates = { chuanyun_info: "当你使用【杀】指定目标后,你可令目标角色随机弃置其装备区内的一张牌。", zhangning: "张宁", tianze: "天则", - tianze_info: "①每回合限触发一次。其他角色于其出牌阶段内使用的黑色手牌结算结束后,你可以弃置一张黑色牌,并对其造成1点伤害。②其他角色的判定生效后,若结果为黑色,则你摸一张牌。", + tianze_info: "①其他角色于其出牌阶段内使用的第一张黑色手牌结算结束后,你可以弃置一张黑色牌,并对其造成1点伤害。②其他角色的判定生效后,若结果为黑色,则你摸一张牌。", difa: "地法", - difa_info: "每回合限一次。当你于回合内因摸牌而得到红色牌时,你可以弃置之。然后你选择一个锦囊牌的牌名,并从牌堆中获得一张此牌名的牌。", + difa_info: "每回合限一次。当你于回合内得到红色牌时,你可以弃置之。然后你选择一个锦囊牌的牌名,并从牌堆中获得一张此牌名的牌。", xinping: "辛评", fuyuan: "辅袁", fuyuan_info: "当你于回合外使用或打出牌时,若当前回合角色的手牌数:不小于你,你可摸一张牌;小于你,你可令其摸一张牌。", @@ -513,7 +513,7 @@ const translates = { dc_jsp_guanyu: "新杀SP关羽", dc_jsp_guanyu_prefix: "新杀SP", dcdanji: "单骑", - dcdanji_info: "觉醒技。准备阶段,若你区域内的牌数大于体力值,你减1点体力上限,将体力回复至体力上限并摸等同于体力值的牌,然后获得〖马术〗和〖怒嗔〗。", + dcdanji_info: "觉醒技。准备阶段,若你区域内的牌数大于体力值,你减1点体力上限,将体力回复至体力上限并摸等量张牌,然后获得〖马术〗和〖怒嗔〗。", dcnuchen: "怒嗔", dcnuchen_info: "出牌阶段限一次。你可以展示一名其他角色的一张手牌,然后选择一项:1.弃置任意张该花色的牌,对其造成等量伤害;2.获得该角色手牌中所有此花色的牌。", dc_jikang: "新杀嵇康", @@ -541,9 +541,9 @@ const translates = { starcanxi_wangsheng: "妄生", starcanxi_xiangsi: "向死", starcanxi_cancel: "向死", - starcanxi_info: "锁定技。①游戏开始时,你获得场上所有角色的势力对应的“玺角”标记。②一轮游戏开始时,你选择一个“玺角”对应势力并选择以下一项:1.妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1;2.向死:本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。", + starcanxi_info: "锁定技。①游戏开始时,你获得场上所有角色的势力对应的“玺角”标记(初始势力中未获得的“玺角”标记改为增加等量的体力上限)。②一轮游戏开始时,你选择一个“玺角”对应势力并选择以下一项:1.妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1;2.向死:本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。", starpizhi: "圮秩", - starpizhi_info: "锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记且你本轮发动〖向死〗的势力与其相同,你失去之并摸X张牌。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)", + starpizhi_info: "锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记且你本轮发动〖向死〗的势力与其相同,或其是该势力最后一名角色,你失去之,然后摸X张牌并回复1点体力。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)", starzhonggu: "冢骨", starzhonggu_info: "主公技,锁定技。摸牌阶段,若游戏轮数大于等于场上的群势力角色数,则你额外摸两张牌,否则你少摸一张牌。", star_dongzhuo: "星董卓", @@ -571,13 +571,19 @@ const translates = { starliangyan_info: "出牌阶段限一次。你可以选择一名其他角色,你摸/弃置至多两张牌,令其弃置/摸等量的牌。然后若你与其手牌数相同,以此法摸牌的角色跳过其下一个弃牌阶段。", starminghui: "明慧", starminghui_info: "一名角色的回合结束时,若你的手牌数:最少,你可以视为使用一张无距离限制的【杀】;最多,你可以将手牌弃置至你手牌数不为最多,然后令一名角色回复1点体力。", + star_sunshangxiang: "星孙尚香", + star_sunshangxiang_prefix: "星", + starsaying: "飒影", + starsaying_info: "每轮每种牌名限一次,你需要使用【杀】或【闪】时,你可以使用一张装备牌,视为使用之;你需要使用【桃】或【酒】时,你可以收回装备区里的一张牌,视为使用之。", + starjiaohao: "骄豪", + starjiaohao_info: "出牌阶段限一次,你可以与一名装备区牌数不大于你的角色拼点,然后你可令赢的角色获得拼点牌或令其使用一张【杀】。", liqueguosi: "李傕郭汜", xiongsuan: "凶算", xiongsuan_info: "出牌阶段限一次,你可以弃置一张手牌并对一名角色造成1点伤害,然后你摸三张牌。若该角色不为你,你失去1点体力。", star_sunjian: "星孙坚", star_sunjian_prefix: "星", starruijun: "锐军", - starruijun_info: "当你于出牌阶段首次使用牌指定其他角色为目标后,若目标角色数为1,你可以摸X张牌(X为你已损失的体力值+1)。直到此阶段结束,所有不为其的其他角色均不在你的攻击范围内,且当你对其造成伤害时,此伤害值改为Y(Y为你本回合上一次对其造成过的伤害值+1,至多为5)。", + starruijun_info: "当你于出牌阶段首次使用牌指定其他角色为目标后,你可以选择其中一名目标角色并摸X张牌(X为你已损失的体力值+1)。直到此阶段结束,所有不为其的其他角色均不在你的攻击范围内,且当你对其造成伤害时,此伤害值改为Y(Y为你本回合上一次对其造成过的伤害值+1,至多为5)。", stargangyi: "刚毅", stargangyi_info: "锁定技。①你的回合内,若你本回合没有造成过伤害,你不能使用【桃】。②当你处于濒死状态时,以你为目标的【桃】或【酒】的回复值+1。", star_zhangzhao: "星张昭", @@ -600,7 +606,12 @@ const translates = { dczhuiwang: "追亡", dczhuiwang_info: "锁定技,你计算体力值小于等于你的角色的距离视为1。", dcquxian: "驱险", - dcquxian_info: "出牌阶段开始时,你可以选择一名角色,,攻击范围内包含其的其他角色可以依次对其使用一张【杀】。若其未以此法受到伤害,这些角色中未使用【杀】的角色失去X点体力(X为这些角色中使用【杀】的角色数)。", + dcquxian_info: "出牌阶段开始时,你可以选择一名角色,攻击范围内包含其的其他角色可以依次对其使用一张【杀】。若其未以此法受到伤害,这些角色中未使用【杀】的角色失去X点体力(X为这些角色中使用【杀】的角色数)。", + mp_wangrong: "王戎", + mpjianlin: "俭吝", + mpjianlin_info: "每回合结束后,若本回合你有基本牌因使用、打出或弃置而进入弃牌堆,则你可以选择其中一张牌获得之。", + mpsixiao: "死孝", + mpsixiao_info: "锁定技,游戏开始时,你选择一名其他角色。每回合限一次,当该角色需要使用或打出除【无懈可击】外的牌时,其可以观看你的手牌并可以使用或打出其中一张牌,然后你摸一张牌。", }; export default translates; diff --git a/character/sp2/voices.js b/character/sp2/voices.js index 2abd108aaa..e1337fef1c 100644 --- a/character/sp2/voices.js +++ b/character/sp2/voices.js @@ -1,4 +1,9 @@ export default { + "#mpjianlin1": "吾性至俭,不能自奉,何况遗人?", + "#mpjianlin2": "以财自污,则免清高之祸。", + "#mpsixiao1": "风木之悲,痛彻肺腑。", + "#mpsixiao2": "外容毁悴,内心神伤。", + "#mp_wangrong:die": "自阮、嵇云亡,为世所羁,实有所叹……", "#starliangyan1": "佳燕并头语,不恋雕梁而归于万里。", "#starliangyan2": "灵禽非醴泉不饮,非积善之家不栖。", "#starminghui1": "大智若愚,女子之锦绣常隐于华服。", @@ -415,4 +420,9 @@ export default { "#stargangyi1": "不见狼居胥,何妨马革裹尸。", "#stargangyi2": "既无功,不受禄。", "#star_sunjian:die": "身怀宝器,必受群狼觊觎……", + "#starjiaohao1": "倚嗅杏雨黄花,心怀西风烈马!", + "#starjiaohao2": "站住!且与本姑娘分个高下!", + "#starsaying1": "倩影映江汀,巾帼犹飒爽!", + "#starsaying2": "我有一袭红袖,欲揾英雄泪!", + "#star_sunshangxiang:die": "秋风冷,江水寒……", }; diff --git a/character/standard/character.js b/character/standard/character.js index 6851246f75..d6c36e4ad4 100644 --- a/character/standard/character.js +++ b/character/standard/character.js @@ -1,10 +1,10 @@ const characters = { old_re_lidian: ["male", "wei", 3, ["xunxun", "wangxi"], ["die:lidian"]], - ganfuren: ["female", "shu", 3, ["stdshushen", "shenzhi"]], + ganfuren: ["female", "shu", 3, ["stdshushen", "shenzhi"], ["name:甘|null"]], std_panfeng: ["male", "qun", 4, ["stdkuangfu"]], caocao: ["male", "wei", 4, ["jianxiong", "hujia"], ["zhu"]], - simayi: ["male", "wei", 3, ["fankui", "guicai"]], - xiahoudun: ["male", "wei", 4, ["ganglie"]], + simayi: ["male", "wei", 3, ["fankui", "guicai"], ["name:司马|懿"]], + xiahoudun: ["male", "wei", 4, ["ganglie"], ["name:夏侯|惇"]], zhangliao: ["male", "wei", 4, ["tuxi"]], xuzhu: ["male", "wei", 4, ["luoyi"]], guojia: ["male", "wei", 3, ["tiandu", "yiji"]], @@ -12,7 +12,7 @@ const characters = { liubei: ["male", "shu", 4, ["rende", "jijiang"], ["zhu"]], guanyu: ["male", "shu", 4, ["wusheng"]], zhangfei: ["male", "shu", 4, ["paoxiao"]], - zhugeliang: ["male", "shu", 3, ["guanxing", "kongcheng"]], + zhugeliang: ["male", "shu", 3, ["guanxing", "kongcheng"], ["name:诸葛|亮"]], zhaoyun: ["male", "shu", 4, ["longdan"]], machao: ["male", "shu", 4, ["mashu", "tieji"]], huangyueying: ["female", "shu", 3, ["jizhi", "qicai"]], @@ -21,14 +21,14 @@ const characters = { lvmeng: ["male", "wu", 4, ["keji"]], huanggai: ["male", "wu", 4, ["kurou"]], zhouyu: ["male", "wu", 3, ["yingzi", "fanjian"]], - daqiao: ["female", "wu", 3, ["guose", "liuli"]], + daqiao: ["female", "wu", 3, ["guose", "liuli"], ["name:桥|null"]], luxun: ["male", "wu", 3, ["qianxun", "lianying"]], sunshangxiang: ["female", "wu", 3, ["xiaoji", "jieyin"]], huatuo: ["male", "qun", 3, ["qingnang", "jijiu"]], lvbu: ["male", "qun", 4, ["wushuang"]], - diaochan: ["female", "qun", 3, ["lijian", "biyue"]], + diaochan: ["female", "qun", 3, ["lijian", "biyue"], ["name:null|null"]], huaxiong: ["male", "qun", 6, ["yaowu"]], - gongsunzan: ["male", "qun", 4, ["reyicong"]], + gongsunzan: ["male", "qun", 4, ["reyicong"], ["name:公孙|瓒"]], xf_yiji: ["male", "shu", 3, ["xinfu_jijie", "xinfu_jiyuan"], []], re_yuanshu: ["male", "qun", 4, ["rewangzun", "retongji"]], diff --git a/character/standard/characterReplace.js b/character/standard/characterReplace.js index 23288e5873..ff8238062f 100644 --- a/character/standard/characterReplace.js +++ b/character/standard/characterReplace.js @@ -9,21 +9,21 @@ const characterReplaces = { sp_zhangliao: ["sp_zhangliao", "yj_zhangliao", "jsrg_zhangliao"], xiahoudun: ["xiahoudun", "re_xiahoudun", "xin_xiahoudun", "sb_xiahoudun"], liubei: ["liubei", "re_liubei", "sb_liubei", "dc_liubei", "junk_liubei"], - guanyu: ["guanyu", "re_guanyu", "ol_sb_guanyu", "sb_guanyu", "ps_guanyu", "old_guanyu", "junk_guanyu"], - zhangfei: ["zhangfei", "re_zhangfei", "old_zhangfei", "xin_zhangfei", "sb_zhangfei", "tw_zhangfei", "jsrg_zhangfei", "yj_zhangfei"], - zhaoyun: ["zhaoyun", "re_zhaoyun", "old_zhaoyun", "sb_zhaoyun", "jsrg_zhaoyun", "ps2063_zhaoyun", "ps2067_zhaoyun", "huan_zhaoyun"], + guanyu: ["guanyu", "re_guanyu", "ol_sb_guanyu", "sb_guanyu", "ps_guanyu", "old_guanyu", "junk_guanyu", "wuhujiang"], + zhangfei: ["zhangfei", "re_zhangfei", "old_zhangfei", "xin_zhangfei", "sb_zhangfei", "tw_zhangfei", "jsrg_zhangfei", "yj_zhangfei", "wuhujiang"], + zhaoyun: ["zhaoyun", "re_zhaoyun", "old_zhaoyun", "sb_zhaoyun", "jsrg_zhaoyun", "ps2063_zhaoyun", "ps2067_zhaoyun", "huan_zhaoyun", "wuhujiang"], sp_zhaoyun: ["sp_zhaoyun", "jsp_zhaoyun"], - machao: ["machao", "re_machao", "sb_machao", "ps_machao"], + machao: ["machao", "re_machao", "sb_machao", "ps_machao", "wuhujiang"], sp_machao: ["sp_machao", "dc_sp_machao", "jsrg_machao", "old_machao"], zhugeliang: ["zhugeliang", "re_zhugeliang", "sb_zhugeliang", "ps2066_zhugeliang", "ps_zhugeliang", "huan_zhugeliang"], huangyueying: ["huangyueying", "re_huangyueying", "junk_huangyueying", "sb_huangyueying"], sunquan: ["sunquan", "re_sunquan", "sb_sunquan", "dc_sunquan", "xin_sunquan"], zhouyu: ["zhouyu", "re_zhouyu", "dc_sb_zhouyu", "sb_zhouyu", "ps1062_zhouyu", "ps2080_zhouyu"], - luxun: ["luxun", "re_luxun", "jsrg_luxun"], + luxun: ["luxun", "re_luxun", "jsrg_luxun", "sb_luxun"], lvmeng: ["lvmeng", "re_lvmeng", "sb_lvmeng"], huanggai: ["huanggai", "re_huanggai", "sb_huanggai"], daqiao: ["daqiao", "re_daqiao", "sb_daqiao"], - sunshangxiang: ["sunshangxiang", "re_sunshangxiang", "sb_sunshangxiang", "jsrg_sunshangxiang"], + sunshangxiang: ["sunshangxiang", "re_sunshangxiang", "sb_sunshangxiang", "jsrg_sunshangxiang", "star_sunshangxiang"], ganning: ["ganning", "re_ganning", "sb_ganning", "yongjian_ganning"], yj_ganning: ["yj_ganning", "sp_ganning"], lvbu: ["lvbu", "re_lvbu", "jsrg_lvbu", "ps_lvbu"], diff --git a/character/standard/skill.js b/character/standard/skill.js index 3ec7a99308..c025d81541 100644 --- a/character/standard/skill.js +++ b/character/standard/skill.js @@ -27,7 +27,7 @@ const skills = { trigger: { player: "useCardToPlayered" }, filter(event, player) { if (event.card.name != "sha" && get.type(event.card) != "trick") return false; - return event.target.isDamaged(); + return event.target.isDamaged() && player.countCards("he"); }, forced: true, autodelay: true, @@ -45,6 +45,8 @@ const skills = { enable: "phaseUse", filterTarget: true, selectTarget: [1, Infinity], + multitarget: true, + multiline: true, skillAnimation: true, animationColor: "thunder", async content(event, trigger, player) { @@ -213,6 +215,7 @@ const skills = { subSkill: { effect: { charlotte: true, + onremove: true, mod: { cardEnabled(card, player) { if (player.getStorage("stddaoshu_effect").includes(get.suit(card))) return false; @@ -551,7 +554,8 @@ const skills = { (card, player, target) => { return target.getHp() == player.getHp(); }, - [1, Infinity] + [1, Infinity], + true ) .set("ai", target => { const player = get.event("player"); @@ -565,6 +569,32 @@ const skills = { await i.damage(); } }, + ai: { + effect: { + target(card, player, target) { + if ( + target.hp <= 1 || + !target.hasFriend() || + !_status.currentPhase || + !get.tag(card, "damage") + ) return; + let hp = target.hp - 1; + if (game.hasPlayer(cur => { + return cur.hp > hp; + })) return; + let ori = game.countPlayer(cur => { + return cur.hp === hp + 1 && get.attitude(target, cur) <= 0; + }), now = game.countPlayer(cur => { + return cur.hp === hp && get.attitude(target, cur) <= 0; + }), seat = 1, tar = _status.currentPhase.next; + while (tar !== target) { + if (get.attitude(target, tar) <= 0) seat++; + tar = tar.next; + } + return [1, 2 * (now - ori) / seat]; + } + } + } }, //程普 stdchunlao: { @@ -633,6 +663,7 @@ const skills = { event.result = await player .chooseCardTarget({ prompt: get.prompt2("stdzhiyinmeng"), + filterTarget: lib.filter.notMe, filterCard: true, position: "he", selectCard: [1, Infinity], @@ -678,12 +709,13 @@ const skills = { (card, player, target) => { return target != player && target.countCards("h") == player.countCards("h"); }, - [1, Infinity] + [1, 2] ) .set("ai", target => { const player = get.event("player"); return get.effect(target, { name: "draw" }, player, player); - }); + }) + .forResult(); }, locked: true, async content(event, trigger, player) { @@ -900,72 +932,104 @@ const skills = { stdtiaohe: { audio: "fyjianyu", enable: "phaseUse", + usable: 1, filter(event, player) { - return game.hasPlayer(target => { - return target.getDiscardableCards(player, "e").some(card => parseInt(get.subtype(card).slice("equip".length)) <= 2); + return game.hasPlayer(tar1 => { + return tar1.countDiscardableCards(player, "e", i => get.subtype(i) == "equip2") && game.hasPlayer(tar2 => { + return tar1 !== tar2 && tar2.countDiscardableCards(player, "e"); + }); + }); + let e = 0, fj = false; + game.countPlayer(target => { + let es = target.getDiscardableCards(player, "e"), js = target.getDiscardableCards(player, "j", i => get.type(i) == "equip"); + if (es.length) e++; + e += js.length; + if (!fj && (es.some(card => get.subtype(card) == "equip2") || js.some(card => get.subtype(card) == "equip2"))) fj = true; }); + return fj && e >= 2; }, filterTarget(card, player, target) { - if (!ui.selected.targets.length) { - return target.getDiscardableCards(player, "e").some(card => parseInt(get.subtype(card).slice("equip".length)) <= 2); + if (!ui.selected.targets.length || ui.selected.targets[0].countDiscardableCards(player, "e", i => get.subtype(i) == "equip2")) { + return target.countDiscardableCards(player, "e"); } - const cards = ui.selected.targets[0] - .getDiscardableCards(player, "e") - .filter(card => parseInt(get.subtype(card).slice("equip".length)) <= 2) - .map(card => get.subtype(card)); - if (cards.length == 2) { - return target.getDiscardableCards(player, "e").some(card => parseInt(get.subtype(card).slice("equip".length)) <= 2); + return target.countDiscardableCards(player, "e", i => get.subtype(i) == "equip2"); + let e = 0; + let es = target.getDiscardableCards(player, "e"), js = target.getDiscardableCards(player, "j", i => get.type(i) == "equip"); + if (es.length) e++; + e += js.length; + if (!e) return false; + if (!ui.selected.targets.length) return true; + if (!ui.selected.targets[0].countDiscardableCards(player, "ej", i => get.subtype(i) == "equip2")) { + return es.some(card => get.subtype(card) == "equip2") || js.some(card => get.subtype(card) == "equip2"); } - let Tcards = target - .getDiscardableCards(player, "e") - .filter(card => parseInt(get.subtype(card).slice("equip".length)) <= 2) - .map(card => get.subtype(card)); - Tcards.removeArray(cards); - return Tcards.length; - }, - selectTarget: [1, 2], + return true; + }, + selectTarget: function() { + return 2; + if (!ui.selected.targets.length) return [1, 2]; + let e = 0, player = get.event("player"), target = ui.selected.targets[0]; + let es = target.getDiscardableCards(player, "e"), js = target.getDiscardableCards(player, "j", i => get.type(i) == "equip"); + if (es.length) e++; + e += js.length; + if (e >= 2 && (es.some(card => get.subtype(card) == "equip2") || js.some(card => get.subtype(card) == "equip2"))) return [1, 2]; + return 2; + }, complexTarget: true, multitarget: true, multiline: true, async content(event, trigger, player) { const targets = event.targets.slice(); if (targets.length == 1) { - await player.discardPlayerCard("e", targets[0], true); + await player.discardPlayerCard("ej", targets[0], true, 2).set("filterButton", button => { + let position = get.position(button.link), subtype = get.subtype(button.link); + if (!subtype || !subtype.startsWith("equip")) return false; + if (ui.selected.buttons.length) { + let pos = get.position(ui.selected.buttons[0].link), sub = get.subtype(ui.selected.buttons[0].link); + if (pos == "e" && position == "e") return false; + if (sub == "equip2") return true; + return subtype == "equip2"; + } + if (position == "e") { + if (!get.event("js").some(i => get.subtype(i) == "equip2")) return subtype == "equip2"; + return true; + } + if (!get.event("es").length) return subtype == "equip2"; + return true; + }).set("es", targets[0].getDiscardableCards(player, "e", i => get.subtype(i) == "equip2")).set("js", targets[0].getDiscardableCards(player, "j", i => get.type(i) == "equip")); return; } - let discardedType = []; + let canfj = targets.filter(target => { + return target.countDiscardableCards(player, "e", i => get.subtype(i) == "equip2"); + }); for (let i = 0; i < 2; i++) { - const target = targets[i], - other = targets[1 - i]; - let cards = target - .getDiscardableCards(player, "e") - .filter(card => parseInt(get.subtype(card).slice("equip".length)) <= 2) - .map(card => get.subtype(card)); - const Tcards = other - .getDiscardableCards(player, "e") - .filter(card => parseInt(get.subtype(card).slice("equip".length)) <= 2) - .map(card => get.subtype(card)); - cards.removeArray(i == 0 ? (Tcards.length == 2 ? [] : Tcards) : discardedType); - if (!cards.length) continue; + if (i && canfj.includes(targets[i]) && !targets[i].countDiscardableCards(player, "e", i => get.subtype(i) == "equip2")) break; const result = await player - .discardPlayerCard("e", target, true) + .discardPlayerCard("e", targets[i], true) .set("filterButton", button => { - return get.event("cards").includes(get.subtype(button.link)); + if (get.event("fj")) return get.subtype(button.link) == "equip2"; + return true; + return get.type(button.link) == "equip"; }) - .set("cards", cards) + .set("fj", canfj.length === 1 && canfj.includes(targets[i])) .forResult(); - if (result.bool) { - discardedType.addArray( - result.cards.reduce((list, card) => { - return list.add(get.subtype(card)); - }, []) - ); + if (result.bool && get.subtype(result.cards[0]) == "equip2") { + canfj = []; } } }, ai: { order: 10, - result: { target: -1 }, + result: { + target(player, target) { + let att = get.attitude(player, target), es = []; + target.countDiscardableCards(player, "e").forEach(i => { + es.push(get.value(i, target)); + }); + let min = Math.min(...es), max = Math.max(...es), ext = target.hasSkillTag("noe") ? 10 : 0; + if (att <= 0) return ext - max; + return ext - min; + } + }, }, }, stdqiansu: { @@ -979,6 +1043,7 @@ const skills = { player.draw(); }, ai: { + noe: true, effect: { target(card, player, target) { if (target.countCards("e")) return; @@ -1227,6 +1292,9 @@ const skills = { }, guicai: { audio: 2, + audioname2: { + xin_simayi: "jilue_guicai", + }, trigger: { global: "judge" }, preHidden: true, filter(event, player) { @@ -2194,7 +2262,6 @@ const skills = { }, tieji: { audio: 2, - shaRelated: true, trigger: { player: "useCardToPlayered" }, check(event, player) { return get.attitude(player, event.target) <= 0; @@ -2231,6 +2298,9 @@ const skills = { jizhi: { audio: 2, audioname: ["jianyong"], + audioname2: { + xin_simayi: "jilue_jizhi", + }, trigger: { player: "useCard" }, frequent: true, preHidden: true, @@ -2344,6 +2414,9 @@ const skills = { zhiheng: { audio: 2, audioname: ["gz_jun_sunquan"], + audioname2: { + xin_simayi: "jilue_zhiheng", + }, mod: { aiOrder(player, card, num) { if (num <= 0 || get.itemtype(card) !== "card" || get.type(card) !== "equip") return num; @@ -2967,7 +3040,6 @@ const skills = { }, }, wushuang: { - shaRelated: true, audio: 2, audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], forced: true, diff --git a/character/standard/translate.js b/character/standard/translate.js index 986e3dd169..ec79c84bd1 100644 --- a/character/standard/translate.js +++ b/character/standard/translate.js @@ -172,31 +172,49 @@ const translates = { rewangzun_info: "锁定技,一名其他角色的准备阶段开始时,若其体力值大于你,你摸一张牌。然后若其身份为主公/主帅/君主/地主且明置,则你摸一张牌,且其本回合的手牌上限-1。", retongji: "同疾", retongji_info: "攻击范围内包含你的角色成为【杀】的目标时,若你不是此【杀】的使用者或目标,其可弃置一张牌,然后将此【杀】转移给你。", - std_panfeng: "潘凤", + std_panfeng: "标潘凤", + std_panfeng_prefix: "标", stdkuangfu: "狂斧", stdkuangfu_info: "锁定技。出牌阶段限一次。当你使用【杀】对其他角色造成伤害后,若其体力值:小于你,你摸两张牌;不小于你,你失去1点体力。", - ganfuren: "甘夫人", + ganfuren: "标甘夫人", + ganfuren_prefix: "标", stdshushen: "淑慎", stdshushen_info: "当你回复1点体力时,你可以令一名其他角色摸一张牌(若其没有手牌则改为摸两张牌)。", old_re_lidian: "李典", - std_sunhao: "孙皓", - std_mateng: "马腾", - std_mayunlu: "马云騄", - std_jianggan: "蒋干", - std_zhouchu: "周处", - std_lvlingqi: "吕玲绮", - std_dc_yanghu: "羊祜", - std_dc_luotong: "骆统", - std_lijue: "李傕", - std_chengpu: "程普", - std_db_wenyang: "文鸯", - std_re_dengzhi: "邓芝", - std_zhangyì: "张翼", - std_chengyu: "程昱", - std_fanyufeng: "樊玉凤", - std_feiyi: "费祎", + std_sunhao: "标孙皓", + std_sunhao_prefix: "标", + std_mateng: "标马腾", + std_mateng_prefix: "标", + std_mayunlu: "标马云騄", + std_mayunlu_prefix: "标", + std_jianggan: "标蒋干", + std_jianggan_prefix: "标", + std_zhouchu: "标周处", + std_zhouchu_prefix: "标", + std_lvlingqi: "标吕玲绮", + std_lvlingqi_prefix: "标", + std_dc_yanghu: "标羊祜", + std_dc_yanghu_prefix: "标", + std_dc_luotong: "标骆统", + std_dc_luotong_prefix: "标", + std_lijue: "标李傕", + std_lijue_prefix: "标", + std_chengpu: "标程普", + std_chengpu_prefix: "标", + std_db_wenyang: "标文鸯", + std_db_wenyang_prefix: "标", + std_re_dengzhi: "标邓芝", + std_re_dengzhi_prefix: "标", + std_zhangyì: "标张翼", + std_zhangyì_prefix: "标", + std_chengyu: "标程昱", + std_chengyu_prefix: "标", + std_fanyufeng: "标樊玉凤", + std_fanyufeng_prefix: "标", + std_feiyi: "标费祎", + std_feiyi_prefix: "标", stdcanshi: "残蚀", - stdcanshi_info: "锁定技,摸牌阶段,你改为摸X张牌(X为场上的已受伤角色且X至少为1)。然后本回合你使用【杀】或普通锦囊牌指定目标后,你弃置一张牌。", + stdcanshi_info: "锁定技,摸牌阶段,你改为摸X张牌(X为场上的已受伤角色且X至少为1)。然后本回合你使用【杀】或普通锦囊牌指定目标后,若其已受伤,你弃置一张牌。", stdxiongyi: "雄异", stdxiongyi_info: "限定技,出牌阶段,你可以选择任意名角色,这些角色依次选择是否使用一张不可被响应的【杀】,然后这些角色重复此流程直至有角色不使用【杀】。", stdyouji: "游骑", @@ -238,7 +256,7 @@ const translates = { stdzhanying: "醮影", stdzhanying_info: "锁定技,你的回合内,手牌数比回合开始时多的角色不能使用红色牌且受到的伤害+1。", stdtiaohe: "调和", - stdtiaohe_info: "出牌阶段限一次,你可以弃置场上的一张装备牌和一张防具牌(不能为同一名角色装备区的牌)。", + stdtiaohe_info: "出牌阶段限一次,你可以弃置场上的一张装备牌和一张防具牌(不能为同一名角色的牌)。", stdqiansu: "谦素", stdqiansu_info: "当你成为锦囊牌的目标后,若你的装备区没有牌,则你可以摸一张牌。", }; diff --git a/character/swd.js b/character/swd.js index 6b7dd8a828..1fca7a7475 100644 --- a/character/swd.js +++ b/character/swd.js @@ -12,13 +12,13 @@ game.import("character", function () { swd_nicole: ["female", "qun", 3, ["huanjian", "lingwu", "minjing"]], swd_wangsiyue: ["female", "wei", 3, ["duishi", "biyue"]], swd_weida: ["female", "qun", 3, ["yueren", "zhenlie", "duijue"]], - swd_xuanyuanjianxian: ["male", "qun", 4, ["pozhou", "huajian", "xuanyuan"]], + swd_xuanyuanjianxian: ["male", "qun", 4, ["pozhou", "huajian", "xuanyuan"], ["name:轩辕|null"]], swd_chenjingchou: ["male", "wu", 3, ["youyin", "yihua"]], - swd_duguningke: ["female", "qun", 3, ["nlianji", "touxi"]], + swd_duguningke: ["female", "qun", 3, ["nlianji", "touxi"], ["name:独孤|宁珂"]], swd_guyue: ["male", "wei", 3, ["gtiandao", "gxianyin", "wangchen"]], - swd_tuobayuer: ["female", "shu", 4, ["swdliuhong", "poyue", "niepan"]], - swd_yuwentuo: ["male", "shu", 4, ["wushuang", "xielei", "kunlunjing"]], + swd_tuobayuer: ["female", "shu", 4, ["swdliuhong", "poyue", "niepan"], ["name:拓跋|玉儿"]], + swd_yuwentuo: ["male", "shu", 4, ["wushuang", "xielei", "kunlunjing"], ["name:宇文|拓"]], swd_yuxiaoxue: ["female", "wei", 3, ["huanhun", "daixing", "yinyue"]], swd_jiliang: ["male", "wu", 3, ["yunchou", "gongxin", "jqimou"]], @@ -27,7 +27,7 @@ game.import("character", function () { swd_xiyan: ["male", "qun", 3, ["jiefen", "datong"]], swd_cheyun: ["female", "wu", 3, ["cyxianjiang", "cyqiaoxie", "shengong"]], swd_huanyuanzhi: ["male", "qun", 3, ["swdtianshu", "lanzhi", "mufeng"]], - swd_murongshi: ["female", "shu", 4, ["duanyi", "guxing"]], + swd_murongshi: ["female", "shu", 4, ["duanyi", "guxing"], ["name:慕容|诗"]], swd_jipeng: ["male", "wu", 3, ["reyingzi", "guozao"]], swd_qi: ["male", "qun", 3, ["yaotong", "heihuo", "pojian"]], @@ -37,8 +37,8 @@ game.import("character", function () { swd_zhaoyun: ["male", "shu", 4, ["longdan", "pozhen", "tanlin"]], swd_hengai: ["female", "shu", 3, ["funiao", "ningxian", "hlingbo"]], - swd_duanmeng: ["female", "shu", 4, ["xuanying", "lieren"]], - swd_jiangwu: ["male", "shu", 4, ["yijue", "dangping"]], + swd_duanmeng: ["female", "shu", 4, ["xuanying", "lieren"], ["name:马|蕴"]], + swd_jiangwu: ["male", "shu", 4, ["yijue", "dangping"], ["name:严|鹏"]], swd_tuwei: ["male", "shu", 3, ["zhanlu", "susheng"]], swd_yeyaxi: ["female", "shu", 3, ["rexue", "huopu", "shenyan"]], @@ -56,7 +56,7 @@ game.import("character", function () { swd_zhuoshanzhu: ["male", "wu", 4, ["suiyan", "wanjun"]], swd_jiting: ["female", "wei", 4, ["guanhu", "lingshi"]], - swd_sikongyu: ["male", "wu", 4, ["sliufeng", "linyun", "hutian"]], + swd_sikongyu: ["male", "wu", 4, ["sliufeng", "linyun", "hutian"], ["name:司空|宇"]], swd_muyue: ["female", "wei", 3, ["xingzhui", "lingxian", "shouyin"]], swd_ziqiao: ["female", "shu", 3, ["guaili", "fuyan"]], swd_fengyu: ["male", "shu", 4, ["fzhenwei", "shangxi"]], @@ -72,18 +72,17 @@ game.import("character", function () { // swd_philis:['male','qun',4,['yicong','wangxi']], // swd_pepin:['male','qun',4,['rejianxiong','quhu']], swd_kangnalishi: ["male", "qun", 1, ["busi", "xuying", "yinguo"]], - swd_xuanyuanjiantong: ["male", "qun", 3, ["chengjian", "huanling"]], + swd_xuanyuanjiantong: ["male", "qun", 3, ["chengjian", "huanling"], ["name:轩辕|null"]], swd_huiyan: ["male", "qun", 4, ["hwendao", "lingfeng", "hxunzhi"]], // swd_chenfu:['male','qun',4,['xuanzhou','bingfeng']], // swd_chengyaojin:['male','qun',4,['jiuchi','jufu']], swd_shanxiaoxiao: ["female", "wu", 3, ["shehun", "xiaomoyu"]], - swd_yuchiyanhong: ["female", "shu", 3, ["huanxing", "meihuo"]], + swd_yuchiyanhong: ["female", "shu", 3, ["huanxing", "meihuo"], ["name:尉迟|嫣红"]], // swd_hanteng:['male','qun',4,['kuangfu']], // swd_heran:['male','qun',3,['yujian','guiyin','shejie']], // swd_xingtian:['male','qun',8,[]], // swd_qinshubao:['male','qun',3,['huajing','pingxu']], - // swd_tuobayueer:['female','shu',3,['shushen','biyue']], // swd_yangshuo:['male','qun',4,['longdan','luomu']], // swd_zhanglie:['male','qun',4,['huajin','poxiao']], @@ -96,9 +95,9 @@ game.import("character", function () { swd_haidapang: ["female", "wu", 3, ["bingjian", "rumeng"]], swd_shaowei: ["female", "shu", 3, ["jianji", "huangyu"]], - swd_youzhao: ["male", "shu", 4, ["longdan", "yuchen"]], - swd_shangzhang: ["male", "shu", 4, ["lianwu"]], - swd_situqiang: ["female", "shu", 3, ["fengze", "lingyue", "jinlin"]], + swd_youzhao: ["male", "shu", 4, ["longdan", "yuchen"], ["name:赵|昂"]], + swd_shangzhang: ["male", "shu", 4, ["lianwu"], ["name:马|null"]], + swd_situqiang: ["female", "shu", 3, ["fengze", "lingyue", "jinlin"], ["name:司徒|蔷"]], swd_chunyuheng: ["male", "wei", 2, ["jueqing", "shengshou", "xuying"]], swd_hanlong: ["male", "wei", 4, ["ciqiu", "siji"]], @@ -3134,6 +3133,9 @@ game.import("character", function () { trigger.player.addSkill("pingshen2"); trigger.player.storage.pingshen = player; }, + ai: { + neg: true + }, }, pingshen2: { enable: "phaseUse", @@ -4969,7 +4971,6 @@ game.import("character", function () { player.removeSkill("lianji2"); }, }, - yinmo: {}, miedao: { group: ["miedao1", "miedao2"], ai: { @@ -10299,7 +10300,6 @@ game.import("character", function () { swd_yeyaxi: "耶亚希", swd_chunyuheng: "淳于恒", swd_duguningke: "独孤宁珂", - swd_duguningke2: "魔化宁珂", swd_chenjingchou: "陈靖仇", swd_zhanglie: "张烈", swd_guyue: "古月圣", @@ -10317,7 +10317,6 @@ game.import("character", function () { swd_wangsiyue: "王思月", swd_huanglei: "黄雷", swd_tuobayuer: "拓跋玉儿", - swd_tuobayueer: "拓跋月儿", swd_chengyaojin: "程咬金", swd_qinshubao: "秦叔宝", swd_lishimin: "李世民", @@ -10422,17 +10421,17 @@ game.import("character", function () { "每当你即将装备一张牌(特殊类装备除外),若你的装备区内对应位置已有牌,你可以永久改变此牌的装备类型使其装备在装备区内的空余位置。", lingshi: "灵矢", lingshi_info: - "你的装备区内每有一张牌,你的攻击范围+2;当你的装备区内有武器牌或防具牌时,你的杀不可闪避;当你的装备区内有马时,你摸牌阶段额外摸一张牌;当你的装备内的宝物牌时,你回合内可以额外使用一张杀。", + "你的装备区内每有一张牌,你的攻击范围+2;当你的装备区内有武器牌或防具牌时,你的【杀】不可闪避;当你的装备区内有马时,你摸牌阶段额外摸一张牌;当你的装备内的宝物牌时,你回合内可以额外使用一张【杀】。", tiebi: "铁壁", tiebi_info: - "当距离你1以内的一名角色成为杀的目标时,若其没有护甲,你可以弃置一张黑色手牌使其获得1点护甲。", + "当距离你1以内的一名角色成为【杀】的目标时,若其没有护甲,你可以弃置一张黑色手牌使其获得1点护甲。", shenyan: "神炎", shenyan_bg: "炎", shenyan_info: "限定技,当你即将造成火焰伤害时,你可以令此伤害+1,并对目标距离1以内的所有其他角色各造成1点火焰伤害。", xuanying: "旋影", xuanying_info: - "你可以横置你的武将牌,视为使用一张无视距离的杀;每当你于回合外失去牌,你可以竖置你的武将牌,视为使用一张无视距离的杀。", + "你可以横置你的武将牌,视为使用一张无视距离的【杀】;每当你于回合外失去牌,你可以竖置你的武将牌,视为使用一张无视距离的【杀】。", hwendao: "问道", hwendao_info: "每当你于回合外使用或打出一张牌,你可以令当前回合角色弃置一张与之花色相同的牌,否则你获得其一张牌。", @@ -10462,24 +10461,24 @@ game.import("character", function () { fengze: "风泽", fengze_info: "出牌阶段限一次,你可以将一张黑色牌当作桃园结义使用。", lingyue: "凌月", - lingyue_info: "每当你使用一张杀,你可以令目标弃置一张牌。", + lingyue_info: "每当你使用一张【杀】,你可以令目标弃置一张牌。", jinlin: "金鳞", jinlin_info: "限定技,出牌阶段,你可以令任意名角色各获得3点护甲,获得护甲的角色于每个准备阶段失去1点护甲,直到首次失去所有护甲或累计以此法失去3点护甲。", huanxia: "幻霞", - huanxia_info: "你可以将一张红色牌当作杀使用,若此杀未造成伤害,你在结束阶段收回此牌。", + huanxia_info: "你可以将一张红色牌当作【杀】使用,若此【杀】未造成伤害,你在结束阶段收回此牌。", jingjie: "幻镜", jingjie_info: "限定技,出牌阶段,你可以令所有角色弃置所有牌,然后摸两张牌(不触发任何技能)。", kongmo: "恐魔", kongmo_info: "锁定技,你使用基本牌或普通锦囊牌后将额外结算一次卡牌效果。", jufu: "巨斧", - jufu_info: "锁定技,当你有武器牌时,杀造成的伤害+1。", + jufu_info: "锁定技,当你有武器牌时,【杀】造成的伤害+1。", huajing: "化精", huajing_info: "每当你使用锦囊牌造成伤害,可以回复1点体力并摸一张牌。", pingxu: "冯虚", pingxu_info: "锁定技,当你没有武器牌时,你的进攻距离+1;当你没有防具牌时,你的防御距离+1。", yudun: "愚钝", - yudun_info: "锁定技,你无法使用锦囊牌;你可以将两张锦囊牌当作一张不计入出杀次数的杀使用。", + yudun_info: "锁定技,你无法使用锦囊牌;你可以将两张锦囊牌当作一张不计入出杀次数的【杀】使用。", bingfeng: "冰封", bingfeng2: "冰封", bingfeng2_info: "不能使用或打出手牌。", @@ -10499,9 +10498,9 @@ game.import("character", function () { yaotong3: "妖瞳", yaotong4: "妖瞳", yaotong_info: - "当你的手牌数为奇数时,你可以将一张手牌当作杀或闪使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", + "当你的手牌数为奇数时,你可以将一张手牌当作【杀】或【闪】使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", yaotong_info_alter: - "当你的手牌数为奇数时,你可以将一张手牌当作杀使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", + "当你的手牌数为奇数时,你可以将一张手牌当作【杀】使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", pojian: "破茧", pojian_info: "每当你失去最后一张手牌,可以从牌堆中获得一张装备牌并装备之。", huajin: "化金", @@ -10509,22 +10508,22 @@ game.import("character", function () { huajin_info: "出牌阶段限一次,你可以弃置一张牌令你造成的伤害+1,直到你的下一回合开始。", poxiao: "破霄", poxiao_info: - "你可以将一张装备牌当杀使用;当你没有武器牌时,你的攻击范围+1,杀可以额外指定一个目标。", + "你可以将一张装备牌当【杀】使用;当你没有武器牌时,你的攻击范围+1,【杀】可以额外指定一个目标。", jianji: "箭疾", jianji_info: - "你可以将一张装备牌当杀使用,然后摸一张牌,此杀无视距离和防具,且不计入回合内出杀限制。", + "你可以将一张装备牌当【杀】使用,然后摸一张牌,此【杀】无视距离和防具,且不计入回合内出杀限制。", yuchen: "浴尘", yuchen_info: "每当你于回合外使用或打出一张黑色牌,你可以弃置一名角色的一张牌。", huangyu: "凰羽", huangyu_info: "出牌阶段限一次,你可以将两张红色牌当炽羽袭使用。", bingjian: "冰箭", bingjian_info: - "出牌阶段限一次,你可以弃置一张黑色的杀,令一名有手牌的其他角色展示手牌并弃置其中的所有闪,若其没有闪则受到1点雷电伤害。", + "出牌阶段限一次,你可以弃置一张黑色的【杀】,令一名有手牌的其他角色展示手牌并弃置其中的所有闪,若其没有闪则受到1点雷电伤害。", rumeng: "入梦", rumeng_info: "其他角色的出牌阶段前,你可以弃置一张非基本牌,并令其选择一项:弃置一张基本牌,或跳过出牌及弃牌阶段。", lianda: "连打", - lianda_info: "当你使用一杀结算完毕后,可以弃置一张牌视为对目标再使用一张杀。", + lianda_info: "当你使用【杀】结算完毕后,可以弃置一张牌视为对目标再使用一张【杀】。", xianghui: "祥晖", xianghui_info: "出牌阶段限一次,你可以弃置一张红色手牌,然后令场上体力值最少的角色各回复1点体力。", @@ -10537,9 +10536,9 @@ game.import("character", function () { shending_info: "锁定技,若你没有宝物牌,视为装备了蓝格怪衣。", hzhenwei: "镇卫", hzhenwei_info: - "当一名其他角色成为杀的目标后,若你在杀的使用者的攻击范围内,你可以弃置一张牌将此杀转移给自己,并在杀结算完毕后摸一张牌。", + "当一名其他角色成为【杀】的目标后,若你在【杀】的使用者的攻击范围内,你可以弃置一张牌将此【杀】转移给自己,并在【杀】结算完毕后摸一张牌。", shoulie: "狩猎", - shoulie_info: "当你使用一张杀指定目标后,可以弃置一张手牌令此杀不可闪避。", + shoulie_info: "当你使用一张【杀】指定目标后,可以弃置一张手牌令此【杀】不可闪避。", hudun: "盾甲", hudun_bg: "盾", hudun2: "盾甲", @@ -10549,9 +10548,9 @@ game.import("character", function () { zhenjiu_info: "出牌阶段限一次,你可以将一张红色手牌置于一名角色的武将牌上,该角色于下一个准备阶段回复1点体力,然后获得此牌。", ljifeng: "疾风", - ljifeng_info: "锁定技,你的攻击范围+X,杀可以额外指定X个目标,X为你已损失的体力值。", + ljifeng_info: "锁定技,你的攻击范围+X,【杀】可以额外指定X个目标,X为你已损失的体力值。", lxianglong: "翔龙", - lxianglong_info: "每当你闪避一张杀,你可以视为使用一张杀。", + lxianglong_info: "每当你闪避一张【杀】,你可以视为使用一张【杀】。", shangxi: "伤袭", shangxi_info: "准备阶段,你可以弃置一张牌,并对攻击范围内一名体力值不小于你的其他角色造成1点伤害。", @@ -10561,7 +10560,7 @@ game.import("character", function () { fuyan2: "覆岩", fuyan_info: "每当你受到一次伤害,可以令一名没有护甲的角色获得1点护甲值。", guaili: "怪力", - guaili_info: "锁定技,你的杀造成的伤害+1,造成伤害后需弃置两张手牌。", + guaili_info: "锁定技,你的【杀】造成的伤害+1,造成伤害后需弃置两张手牌。", pingshen: "凭神", pingshen2: "凭神", pingshen_info: "锁定技,受到过你的伤害的角色可在回合内对你发动一次【离魂】(每局限发动一次)。", @@ -10578,39 +10577,39 @@ game.import("character", function () { "限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色回复2点体力。", bofeng: "搏风", bofeng_info: - "锁定技,体力值不大于你的角色视为在你的攻击范围;当你使用杀指定目标时,可令目标额外打出一张闪,否则此杀不可闪避且造成的伤害+1。", + "锁定技,体力值不大于你的角色视为在你的攻击范围;当你使用【杀】指定目标时,可令目标额外打出一张闪,否则此【杀】不可闪避且造成的伤害+1。", hutian: "护天", hutian2: "护天", hutian3: "护天", hutian_info: "结束阶段,你可以将任意张牌置于一名角色的武将牌上,则该角色的体力值始终不能小于“护天”牌数;在你的下一个结束阶段,该角色获得武将牌上的“护天”牌(在此回合不能再次发动)。", linyun: "凌云", - linyun_info: "你可以将两张牌当作杀使用,此杀需要额外一张闪才能闪避。", + linyun_info: "你可以将两张牌当作【杀】使用,此【杀】需要额外一张闪才能闪避。", sliufeng: "流风", sliufeng_info: "锁定技,体力值不大于你的角色视为在你的攻击范围。", chengjian: "承剑", - chengjian_info: "每当其他角色使用杀造成一次伤害,你可以令其摸一张牌。", + chengjian_info: "每当其他角色使用【杀】造成一次伤害,你可以令其摸一张牌。", huanling: "幻灵", huanling2: "幻灵", huanling_info: "结束阶段,你可以选择一名角色与你同时翻面;翻面状态下,你防止一切伤害。", xiaozhan: "消战", - xiaozhan_info: "其他角色使用杀时,若你不是杀的目标,可以弃置一张杀取消之。", + xiaozhan_info: "其他角色使用【杀】时,若你不是【杀】的目标,可以弃置一张【杀】取消之。", xielei: "挟雷", - xielei_info: "每当你使用或打出一张杀,可以弃置一张牌并对目标以外的一名角色造成1点雷电伤害。", + xielei_info: "每当你使用或打出一张【杀】,可以弃置一张牌并对目标以外的一名角色造成1点雷电伤害。", dangping: "荡平", dangping_info: "每当你造成一次伤害,可以弃置一张手牌对其距离1以内的另一名角色造成1点伤害,每回合限一次。", guisi: "归思", - guisi_info: "每当你成为杀的目标,你可以交给对方一张手牌并取消之。", + guisi_info: "每当你成为【杀】的目标,你可以交给对方一张手牌并取消之。", duishi: "对诗", duishi_info: "出牌阶段,你可以弃置一张手牌,并指定一名有手牌的角色选择一项:1)弃置一张与之花色相同的手牌,本回合内对诗不能再次指定其为目标,2)令你获得其一张牌,对诗失效直到回合结束。", anlianying: "连营", anlianying_info: "每当你失去最后一张手牌,可摸两张牌。", lianwu: "连舞", - lianwu_info: "锁定技,你的杀可以额外指定一个目标,你的红杀不可被闪避。", + lianwu_info: "锁定技,你的【杀】可以额外指定一个目标,你的红【杀】不可被闪避。", jiying: "疾鹰", - jiying_info: "锁定技,你使用杀无视距离。", + jiying_info: "锁定技,你使用【杀】无视距离。", daofa: "道法", daofa_info: "每当有一名其他角色造成伤害,你可以令其弃置一张牌。", xiaomoyu: "魔愈", @@ -10621,7 +10620,7 @@ game.import("character", function () { youyin: "游吟", youyin_info: "每当有其他角色弃置卡牌时,若其中有非基本牌且你的手牌数不超过5,你可以摸一张牌。", rexue: "热血", - rexue_info: "任意一名角色的准备阶段,你可以对其使用一张杀,并摸一张牌。", + rexue_info: "任意一名角色的准备阶段,你可以对其使用一张【杀】,并摸一张牌。", huopu: "火瀑", huopu_info: "出牌阶段限一次,你可以将一张红桃牌当作流星火羽使用。", benlei: "奔雷", @@ -10670,9 +10669,6 @@ game.import("character", function () { "锁定技,出牌阶段结束后,你令随机X名角色各弃置一张牌,X为你已损失的体力值且至少为1。", liaochen: "撩尘", liaochen_info: "锁定技,出牌阶段结束后,所有角色需弃置一张牌。", - yinmo: "引魔", - yinmo_info: - "锁定技,当你对场上所有角色发动〖连计〗后,你立即变身为魔化宁珂,然后对所有其他角色造成1点雷电伤害。", huanxing: "幻形", huanxing2: "幻形", huanxing_info: @@ -10722,15 +10718,15 @@ game.import("character", function () { jikong: "亟空", jikong2: "亟空", jikong_info: - "准备阶段,你可以指定一名角色视为对其使用一张雷杀;每当你失去最后一张手牌,你可以指定一名角色视为对其使用一张雷杀(每回合限发动一次)。", - jikong_info_alter: "准备阶段,你可以指定一名角色视为对其使用一张雷杀。", + "准备阶段,你可以指定一名角色视为对其使用一张雷【杀】;每当你失去最后一张手牌,你可以指定一名角色视为对其使用一张雷【杀】(每回合限发动一次)。", + jikong_info_alter: "准备阶段,你可以指定一名角色视为对其使用一张雷【杀】。", xiangu: "仙骨", xiangu_info: "锁定技,你的手牌上限不会因体力值的减少而减少。", hujing: "壶境", hujing_info: "锁定技,准备阶段,若弃牌堆中有炼妖壶,你装备之;当你的装备区内有炼妖壶时,你的手牌上限+2。", huajian: "化剑", - huajian_info: "出牌阶段结束时,你可以将一张牌当作杀对任意一名角色使用。", + huajian_info: "出牌阶段结束时,你可以将一张牌当作【杀】对任意一名角色使用。", xuanyuan: "轩辕", xuanyuan_info: "锁定技,你无视【轩辕剑】的装备条件及失去体力的效果;结束阶段,你可以弃置一张黑桃牌从弃牌堆中获得【轩辕剑】并装备之。", @@ -10744,12 +10740,12 @@ game.import("character", function () { gongshen_info: "任意一名其他角色使用一张基本牌或锦囊牌指定目标后,你可以弃置一张装备牌令其失效。", swdliuhong: "流虹", - swdliuhong_info: "每当你使用一张杀,可以摸一张牌。", + swdliuhong_info: "每当你使用一张【杀】,可以摸一张牌。", poyue: "破月", - poyue_info: "锁定技,你的黑杀无视距离,红色杀不计入回合内的出杀限制且不可闪避。", - poyue_info_alter: "锁定技,你的黑杀无视距离,红色杀不可闪避。", + poyue_info: "锁定技,你的黑【杀】无视距离,红【杀】不计入回合内的出杀限制且不可闪避。", + poyue_info_alter: "锁定技,你的黑【杀】无视距离,红【杀】不可闪避。", mojian: "墨剑", - mojian_info: "每当你使用杀并指定目标后,你可以令其摸一张牌,然后你回复1点体力。", + mojian_info: "每当你使用【杀】并指定目标后,你可以令其摸一张牌,然后你回复1点体力。", duanyue: "断月", duanyue_info: "出牌阶段限一次,你可以弃置一张装备牌,对一名其他角色造成1点伤害。", tuzhen: "突阵", @@ -10757,7 +10753,7 @@ game.import("character", function () { tuzhen_info_alter: "当你造成一次伤害后,你可以弃置对方手牌中的一张非基本牌。", fengmo: "封魔", fengmo_info: - "出牌阶段限一次,你可以弃置场所有武器牌(至少两张),然后令一名未翻面的角色摸等量的牌并翻面。", + "出牌阶段限一次,你可以弃置场上所有武器牌(至少两张),然后令一名未翻面的角色摸等量的牌并翻面。", pozhou: "破咒", pozhou_bg: "破", pozhou2: "破咒", @@ -10769,13 +10765,13 @@ game.import("character", function () { ningxian: "凝霰", ningxian_info: "每当你受到一次伤害,你可以弃置任意张黑色牌并选择等量其他角色对其各造成1点伤害。", guanhu: "贯鹄", - guanhu_info: "每当你使用杀造成伤害,你可以弃置对方一张手牌和一张装备牌。", + guanhu_info: "每当你使用【杀】造成伤害,你可以弃置对方一张手牌和一张装备牌。", chuanyang: "穿杨", - chuanyang_info: "每当你使用一张杀,若你不在目标的攻击范围,你可以令此杀不可闪避。", + chuanyang_info: "每当你使用一张【杀】,若你不在目标的攻击范围,你可以令此【杀】不可闪避。", fengming: "凤鸣", fengming_info: "出牌阶段限一次,你可以弃置一张装备牌,令一名角色恢复1点体力并摸一张牌。", duanxing: "锻星", - duanxing_info: "每当你装备一张未强化的装备牌,可以视为一名角色使用一张杀。", + duanxing_info: "每当你装备一张未强化的装备牌,可以视为一名角色使用一张【杀】。", wanjun: "万钧", wanjun_info: "你可以将一张装备牌当作南蛮入侵使用。", dunxing: "遁形", @@ -10893,24 +10889,24 @@ game.import("character", function () { yinguo_info: "除你之外的任意一名角色即将受到受到伤害时,若有伤害来源,你可以弃置一张牌将伤害来源和目标对调。", yueren_info: - "每当你使用一张杀,可以进行一次判定,若结果为黑色,你弃置目标一张牌,若结果为红色,你将此杀收回,每回合限发动一次。", + "每当你使用一张【杀】,可以进行一次判定,若结果为黑色,你弃置目标一张牌,若结果为红色,你将此【杀】收回,每回合限发动一次。", duijue_info: "限定技,出牌阶段,你可以指定一名体力值大于1的其他角色,你结束出牌阶段,并在回合结束后将所有其他角色移出游戏,然后该角色与你轮流进行回合,直到有一方死亡或一共进行六个回合为止。", - wuying_info: "锁定技,你的杀和单体x锦囊目标锁定为范围内的所有角色。", + wuying_info: "锁定技,你的【杀】和单体x锦囊目标锁定为范围内的所有角色。", xiehun_info: "锁定技,受到来自你伤害的角色进入混乱状态,行为不受控制,且会攻击队友,直到你的下一回合开始。", jumo_info: "锁定技,结束阶段,你摸X-1张牌,X为未进入混乱状态的角色数与进入混乱状态的角色数之差(若为双将则改为X)。", jifeng_info: - "你的杀和单体锦囊可以额外指定任意个目标,若如此做,此卡牌有一定机率失效,指定的目标越多失效的概率越大。", + "你的【杀】和单体锦囊可以额外指定任意个目标,若如此做,此卡牌有一定机率失效,指定的目标越多失效的概率越大。", mohua_info: "锁定技,在身份局中,当你进入濒死状态时,你立即变身为撒旦,体力上限变为现存角色数(至少为4),并成为其他所有角色的共同敌人。", miles_xueyi_info: "锁定技,你防止即将受到的伤害,然后失去1点体力。", duanyi_info: - "出牌阶段限一次,你可以弃置两张杀,对一名角色造成1点伤害,然后其随机弃置X张牌,X为其已损失的体力值。", - duanyi_info_alter: "出牌阶段限一次,你可以弃置两张杀,并对一名角色造成1点伤害。", + "出牌阶段限一次,你可以弃置两张【杀】,对一名角色造成1点伤害,然后其随机弃置X张牌,X为其已损失的体力值。", + duanyi_info_alter: "出牌阶段限一次,你可以弃置两张【杀】,并对一名角色造成1点伤害。", guxing_info: - "出牌阶段,你可以将最后至多X张手牌当杀使用,此杀无视距离且可以指定至多3个目标,每造成一次伤害,你摸一张牌,X为你已损失的体力值且至少为1。", + "出牌阶段,你可以将最后至多X张手牌当【杀】使用,此【杀】无视距离且可以指定至多3个目标,每造成一次伤害,你摸一张牌,X为你已损失的体力值且至少为1。", tianlun_info: "任意一名角色的判定牌生效前,你可以弃置一张场上角色的判定牌代替之。", hlongyin_info: "出牌阶段,你可以弃置任意张颜色相同且点数不同的牌,并获得逆时针座位距离与卡牌点数相同的角色区域内的一张牌。每阶段限一次。", @@ -10923,9 +10919,9 @@ game.import("character", function () { luomu_info: "锁定技,每当你造成伤害时,受伤害角色随机弃置一张牌。", poxing_info: "锁定技,每当你即将造成伤害,若目标的体力值大于你,你令伤害+1。", liaoyuan_info: - "每当你使用一张杀指定目标后,你可以弃置任意张与此杀花色相同的牌,若如此做,目标需额外打出等量的闪,每少打出一张闪,此杀的伤害+1。", + "每当你使用一张【杀】指定目标后,你可以弃置任意张与此【杀】花色相同的牌,若如此做,目标需额外打出等量的闪,每少打出一张闪,此【杀】的伤害+1。", liaoyuan_info_alter: - "每当你使用一张杀指定目标后,你可以弃置一张与此杀花色相同的牌,若如此做,目标需额外打出一张闪,若目标没打出闪,此杀的伤害+1。", + "每当你使用一张【杀】指定目标后,你可以弃置一张与此【杀】花色相同的牌,若如此做,目标需额外打出一张闪,若目标没打出闪,此【杀】的伤害+1。", yishan_info: "每当你受到一次伤害,你可以重新获得最近失去的两张牌。", huanhun_info: "当一名角色进入濒死状态时,你可以弃置一张牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌。", @@ -10941,15 +10937,15 @@ game.import("character", function () { xianjiang_info_alter: "出牌阶段限一次,若你装备内没有牌,你可以弃置一张锦囊牌并随机装备一件装备。", shengong_info: - "每当你需要打出一张杀或闪时,你可以弃置一名其他角色装备区内的一张武器牌或防具牌,视为打出一张杀或闪,然后该角色摸一张牌,你弃一张牌。", - ningjian_info: "你可以将一张红色牌当闪、黑色牌当杀使用或打出。", + "每当你需要打出一张【杀】或【闪】时,你可以弃置一名其他角色装备区内的一张武器牌或防具牌,视为打出一张【杀】或【闪】,然后该角色摸一张牌,你弃一张牌。", + ningjian_info: "你可以将一张红色牌当【闪】、黑色牌当【杀】使用或打出。", taixu_info: - "限定技,你可以弃置你的所有牌(至少1张),并对一名体力值大于1为其他角色造成X点火焰伤害,X为你已损失的体力值且至少为1。", - duoren_info: "每当你闪避一张杀,你可以立即获得来源的武器牌。", + "限定技,你可以弃置你的所有牌(至少1张),并对一名体力值大于1的其他角色造成X点火焰伤害,X为你已损失的体力值且至少为1。", + duoren_info: "每当你闪避一张【杀】,你可以立即获得来源的武器牌。", tanlin_info: - "出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得双方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。", + "出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得双方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张【杀】直到回合结束,若你没赢,你受到该角色的1点伤害。", tanlin_info_alter: - "出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得对方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。", + "出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得对方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张【杀】直到回合结束,若你没赢,你受到该角色的1点伤害。", pozhen_info: "每当你受到一次伤害,若你的手牌数大于伤害来源,你可以弃置X张手牌对其造成1点伤害;若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。", pozhen_info_alter: @@ -10970,7 +10966,7 @@ game.import("character", function () { funiao_old_info: "出牌阶段,你可以交给一名角色一张手牌,然后观看其手牌,每个阶段对一名角色只能发动一次。", xuehuang_info: - "限定技,出牌阶段,若你没有黑色手牌,你可以展示并弃置所有手牌,每弃置一张牌视为使用一张火杀,随机指定两名敌人为目标。", + "限定技,出牌阶段,若你没有黑色手牌,你可以展示并弃置所有手牌,每弃置一张牌视为使用一张火【杀】,随机指定两名敌人为目标。", zhuyu_info: "每当一名横置的角色即将受到伤害时,你可以弃置一张红色牌令此伤害+1并变为火属性。", ningshuang_info: "每当你成为黑色牌的目标,你可以弃置一张黑色牌将其横置,并摸一张牌,若其已经模置则改为将其翻面。", diff --git a/character/tw/character.js b/character/tw/character.js index e760c17fd5..98c9fcbd00 100644 --- a/character/tw/character.js +++ b/character/tw/character.js @@ -1,13 +1,14 @@ const characters = { - huan_zhugeliang: ["male", "shu", "3/4", ["huan_zhugeliang_A", "huan_zhugeliang_B", "huan_zhugeliang_C"]], + licuilianzhaoquanding: ["double", "qun", 3, ["twciyin", "twchenglong"], ["name:李|翠莲-赵|全定"]], + huan_zhugeliang: ["male", "shu", "3/4", ["twbeiding", "twjielv", "twhunyou"], ["name:诸葛|亮"]], huan_jiangwei: ["male", "shu", 4, ["huan_jiangwei_A", "huan_jiangwei_B"]], huan_guojia: ["male", "wei", 3, ["huan_guojia_A", "huan_guojia_B"]], - huan_zhanghe: ["male", "wei", 4, ["huan_zhanghe_A"]], - huan_zhaoyun: ["male", "shu", 4, ["huan_zhaoyun_A", "huan_zhaoyun_B"]], - huan_simayi: ["male", "wei", 4, ["twzongquan", "twguimou"]], + huan_zhanghe: ["male", "wei", 4, ["twkuiduan"]], + huan_zhaoyun: ["male", "shu", 4, ["twjiezhan", "twlongjin"]], + huan_simayi: ["male", "wei", 4, ["twzongquan", "twguimou"], ["name:司马|懿"]], huan_weiyan: ["male", "shu", 4, ["twqiji", "twpiankuang"]], - tw_zhugejun: ["male", "qun", 3, ["twshouzhu", "twdaigui", "twcairu"]], - simafu: ["male", "wei", 3, ["xunde", "chenjie"]], + tw_zhugejun: ["male", "qun", 3, ["twshouzhu", "twdaigui", "twcairu"], ["name:诸葛|均"]], + simafu: ["male", "wei", 3, ["xunde", "chenjie"], ["name:司马|孚"]], tw_yanliang: ["male", "qun", 4, ["twduwang", "twylyanshi"]], tw_wenchou: ["male", "qun", 4, ["twjuexing", "twxiayong"]], tw_yuantan: ["male", "qun", 4, ["twqiaosi", "twbaizu"]], @@ -16,27 +17,27 @@ const characters = { xia_shitao: ["male", "qun", 4, ["twjieqiu", "twenchou"]], xia_guanyu: ["male", "qun", 4, ["twzhongyi", "twchue"]], xia_liubei: ["male", "shu", 4, ["twshenyi", "twxinghan"]], - xia_xiahousone: ["female", "qun", 3, ["twchengxi"]], - xia_xiahoudun: ["male", "qun", 4, ["twdanlie"]], + xia_xiahousone: ["female", "qun", 3, ["twchengxi"], ["name:夏侯|子萼"]], + xia_xiahoudun: ["male", "qun", 4, ["twdanlie"], ["name:夏侯|惇"]], xia_zhangwei: ["female", "qun", 3, ["twhuzhong", "twfenwang"]], tw_zhanghong: ["male", "wu", 3, ["twquanqian", "twrouke"]], tw_zhangzhao: ["male", "wu", 3, ["twlijian", "twchungang"]], tw_ol_sunjian: ["male", "wu", "4/5", ["gzyinghun", "wulie", "twpolu"], ["zhu"]], tw_menghuo: ["male", "qun", 4, ["huoshou", "rezaiqi", "twqiushou"], ["zhu"]], ol_liuyu: ["male", "qun", 2, ["zongzuo", "zhige", "twchongwang"], ["zhu"]], - tw_gongsunfan: ["male", "qun", 4, ["twhuiyuan", "twshoushou"]], + tw_gongsunfan: ["male", "qun", 4, ["twhuiyuan", "twshoushou"], ["name:公孙|范"]], tw_yangang: ["male", "qun", 4, ["twzhiqu", "twxianfeng"]], - xia_xiahouzie: ["female", "qun", "3/4", ["twxuechang", "twduoren"]], + xia_xiahouzie: ["female", "qun", "3/4", ["twxuechang", "twduoren"], ["name:夏侯|紫萼"]], xia_zhaoe: ["female", "qun", 3, ["twyanshi", "twrenchou"]], xia_lusu: ["male", "qun", 4, ["twkaizeng", "twyangming"]], xia_dianwei: ["male", "qun", 4, ["twliexi", "twshezhong"]], tw_bingyuan: ["male", "qun", 3, ["twbingde", "twqingtao"]], - tw_niufudongxie: ["double", "qun", 4, ["twjuntun", "twxiongxi", "twxiafeng"]], + tw_niufudongxie: ["double", "qun", 4, ["twjuntun", "twxiongxi", "twxiafeng"], ["name:牛|辅-董|翓"]], tw_jianshuo: ["male", "qun", 6, ["twkunsi"]], tw_jiangji: ["male", "wei", 3, ["twjichou", "twjilun"]], tw_mateng: ["male", "qun", 4, ["mashu", "twxiongzheng", "twluannian"], ["zhu"]], tw_baoxin: ["male", "qun", 4, ["twmutao", "twyimou"]], - tw_liufuren: ["female", "qun", 3, ["twzhuidu", "twshigong"]], + tw_liufuren: ["female", "qun", 3, ["twzhuidu", "twshigong"], ["name:刘|null"]], tw_yufuluo: ["male", "qun", 6, ["twjiekuang", "twneirao"]], tw_fengxí: ["male", "shu", 4, ["twqingkou"]], tw_zhangji: ["male", "wei", 3, ["twdingzhen", "twyouye"]], @@ -44,8 +45,8 @@ const characters = { tw_huchuquan: ["male", "qun", 4, ["twfupan"]], tw_liwei: ["male", "shu", 4, ["twjiaohua"]], tw_yanxiang: ["male", "qun", 3, ["twkujian", "twruilian"]], - tw_xiahouen: ["male", "wei", 5, ["twfujian", "twjianwei"]], - tw_xiahoushang: ["male", "wei", 4, ["twtanfeng"]], + tw_xiahouen: ["male", "wei", 5, ["twfujian", "twjianwei"], ["name:夏侯|恩"]], + tw_xiahoushang: ["male", "wei", 4, ["twtanfeng"], ["name:夏侯|尚"]], tw_qiaorui: ["male", "qun", 5, ["twxiawei", "twqiongji"]], tw_haomeng: ["male", "qun", 4, ["twgongge"]], tw_weixu: ["male", "qun", 4, ["twsuizheng", "twtuidao"]], @@ -57,7 +58,7 @@ const characters = { tw_yangyi: ["male", "shu", 3, ["duoduan", "twgongsun"]], tw_dengzhi: ["male", "shu", 3, ["twjimeng", "shuaiyan"]], tw_wangling: ["male", "wei", 4, ["twmibei", "twxingqi"], ["clan:太原王氏"]], - tw_zhugeguo: ["female", "shu", 3, ["twqirang", "twyuhua"]], + tw_zhugeguo: ["female", "shu", 3, ["twqirang", "twyuhua"], ["name:诸葛|果"]], tw_fanchou: ["male", "qun", 4, ["twxingluan"]], tw_xujing: ["male", "shu", 3, ["twboming", "twejian"]], tw_zhangfei: ["male", "shu", 4, ["new_repaoxiao", "twxuhe"]], @@ -65,26 +66,26 @@ const characters = { tw_xunchen: ["male", "qun", 3, ["twweipo", "mjchenshi", "twmouzhi"]], tw_jiangqing: ["male", "wu", 4, ["twshangyi", "twxiangyu"]], tw_guyong: ["male", "wu", 3, ["twgyshenxing", "twbingyi"]], - tw_chendong: ["male", "wu", 4, ["twyilie", "twfenming"]], + tw_chendong: ["male", "wu", 4, ["twyilie", "twfenming"], ["name:陈|武-董|袭"]], tw_handang: ["male", "wu", 4, ["twgongji", "twjiefan"]], tw_jiling: ["male", "qun", 4, ["twshuangren"]], tw_re_fazheng: ["male", "shu", 3, ["twxuanhuo", "twenyuan"]], tw_madai: ["male", "shu", 4, ["mashu", "twqianxi"]], tw_niujin: ["male", "wei", 4, ["twcuorui", "twliewei"]], - tw_guanqiujian: ["male", "wei", 3, ["twzhengrong", "twhongju"]], - tw_daxiaoqiao: ["female", "wu", 3, ["twxingwu", "twpingting"], ["tempname:daxiaoqiao"]], + tw_guanqiujian: ["male", "wei", 3, ["twzhengrong", "twhongju"], ["name:毌丘|俭"]], + tw_daxiaoqiao: ["female", "wu", 3, ["twxingwu", "twpingting"], ["tempname:daxiaoqiao", "name:桥|null-桥|null"]], tw_furong: ["male", "shu", 4, ["twxuewei", "twliechi"]], tw_yl_luzhi: ["male", "qun", 3, ["twmingren", "twzhenliang"]], tw_liuzhang: ["male", "qun", 3, ["jutu", "twyaohu", "rehuaibi"], ["zhu"]], tw_zongyu: ["male", "shu", 3, ["twzhibian", "twyuyan"]], tw_zhouchu: ["male", "wu", 4, ["twguoyi", "twchuhai"]], - tw_qiaogong: ["male", "wu", 3, ["twyizhu", "twluanchou"]], + tw_qiaogong: ["male", "wu", 3, ["twyizhu", "twluanchou"], ["name:桥|null"]], tw_feiyi: ["male", "shu", 3, ["twshengxi", "twkuanji"]], - tw_bianfuren: ["female", "wei", 3, ["twwanwei", "twyuejian"]], + tw_bianfuren: ["female", "wei", 3, ["twwanwei", "twyuejian"], ["name:卞|null"]], tw_chenzhen: ["male", "shu", 3, ["twmuyue", "twchayi"]], tw_caoxiu: ["male", "wei", 4, ["twqianju", "twqingxi"]], tw_sunyi: ["male", "wu", 4, ["twzaoli"]], - tw_puyangxing: ["male", "wu", 4, ["twzhengjian", "twzhongchi"]], + tw_puyangxing: ["male", "wu", 4, ["twzhengjian", "twzhongchi"], ["name:濮阳|兴"]], tw_tianyu: ["male", "wei", 4, ["twzhenxi", "twyangshi"]], old_quancong: ["male", "wu", 4, ["zhenshan"]], tw_wujing: ["male", "wu", 4, ["twfenghan", "twcongji"]], @@ -107,19 +108,19 @@ const characters = { tw_zhaoxiang: ["female", "shu", 4, ["refanghun", "twfuhan", "twqueshi"]], yuejiu: ["male", "qun", 4, ["cuijin"]], wuban: ["male", "shu", 4, ["jintao"], ["clan:陈留吴氏"]], - duosidawang: ["male", "qun", "4/5", ["equan", "manji"]], + duosidawang: ["male", "qun", "4/5", ["equan", "manji"], ["name:null|null"]], jiachong: ["male", "qun", 3, ["beini", "dingfa"]], tw_dongzhao: ["male", "wei", 3, ["twmiaolve", "twyingjia"]], tw_gexuan: ["male", "qun", 3, ["twdanfa", "twlingbao", "twsidao"]], - tw_beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia", "bingzhao"], ["zhu"]], - nashime: ["male", "qun", 3, ["chijie", "waishi", "renshe"]], - tw_xiahouba: ["male", "shu", 4, ["twyanqin", "twbaobian"]], + tw_beimihu: ["female", "qun", 3, ["zongkui", "guju", "baijia", "bingzhao"], ["zhu", "name:卑弥|呼"]], + nashime: ["male", "qun", 3, ["chijie", "waishi", "renshe"], ["name:难升|米"]], + tw_xiahouba: ["male", "shu", 4, ["twyanqin", "twbaobian"], ["name:夏侯|霸"]], tw_zumao: ["male", "wu", 4, ["twtijin"]], tw_caoang: ["male", "wei", 4, ["twxiaolian"]], tw_dingfeng: ["male", "wu", 4, ["twqijia", "twzhuchen"]], tw_caohong: ["male", "wei", 4, ["twhuzhu", "twliancai"]], tw_maliang: ["male", "shu", 3, ["twrangyi", "twbaimei"]], - kaisa: ["male", "western", 4, ["zhengfu"]], + kaisa: ["male", "western", 4, ["zhengfu"], ["name:尤利乌斯|盖乌斯"]], }; export default characters; diff --git a/character/tw/characterReplace.js b/character/tw/characterReplace.js index 7a40e0fc25..390af94001 100644 --- a/character/tw/characterReplace.js +++ b/character/tw/characterReplace.js @@ -6,6 +6,7 @@ const characterReplaces = { baoxin: ["tw_baoxin", "baoxin"], yanxiang: ["yanxiang", "tw_yanxiang"], liwei: ["liwei", "tw_liwei"], + tw_jiling: ["jiling", "dc_jiling", "tw_jiling"], }; export default characterReplaces; diff --git a/character/tw/intro.js b/character/tw/intro.js index 0b8d9f9e00..cc7e3219ff 100644 --- a/character/tw/intro.js +++ b/character/tw/intro.js @@ -1,4 +1,8 @@ const characterIntro = { + licuilianzhaoquanding: "李翠莲,是河北梆子《青釭剑》里赵云的妻子,性情贤惠,小家碧玉。剧中赵云长坂大战后又去阻挡追兵,结果与刘备失散,来到西川,遇到了翠莲,二人一见钟情,不久成婚。后赵云出发去找队伍,留下青釭剑作记认。李夫人在等待中生下一子,取名全定。十八年后刘备进了西川,全定带着青釭剑去认父亲,谁知赵云正与诸葛亮打赌,为了不输掉这个赌赵云不认这两母子,后来全定斩将立功,在诸葛亮与众将的劝说下,终于赵云夫妻相认,父子团圆。", + huan_zhaoyun: "赵云,字子龙,蜀国名将,以勇猛善战、忠诚义烈著称于世。其一生战功卓著,尤在建兴年间,多次随诸葛亮北伐,立下汗马功劳。
建兴六年春,诸葛亮为牵制魏军,遣赵云与邓芝领兵出斜谷,佯攻郿县。赵云与邓芝率军急行,沿途广布旗帐,擂鼓呐喊,声势浩大,成功吸引魏军主力。面对曹真大军,赵云临危不乱,凭借精妙的战术和士兵们的英勇,多次击退魏军进攻。期间,赵云更是在乱军之中单骑救主,斩杀大将王双,令魏军胆寒。双方对峙月余,直至诸葛亮成功收复陇右,赵云与邓芝方才率军撤回。
建兴八年,诸葛亮再次北伐,攻打魏国长安。赵云作为先锋大将,身先士卒,连克数城,直逼长安城下。在此战中,赵云与张郃激战数十回合,不分胜负。随后,赵云又独斗张虎、乐綝、戴陵三将,一一将其击败,展示了其超凡的武艺。最终,在和张郃的决战中,赵云以诈败之计诱敌深入,一枪刺中张郃,致其重伤身亡,为蜀军攻克长安立下大功。
然而,英雄也有迟暮时,在长安之战后不久,赵云因年事已高,体力不支,于军营中病逝。其一生忠诚于蜀汉,勇猛善战,深受士兵和百姓的爱戴。后主刘禅追封其为大将军,以表彰其卓越功勋和忠诚精神。", + huan_zhanghe: "张郃,魏国骁将,随太祖曹操征战四方,功勋卓著,以其智勇双全,成为魏国后期独当一面的大将。
时诸葛亮出祁山,闻陇右三郡叛魏归汉,魏国震动。魏明帝急召张郃,援以重兵,命其速赴街亭,以解陇右之围。张郃领命,率军疾驰,至街亭,与蜀军交战。然蜀军设伏,张郃虽勇猛,终被围困。幸得亲卫死战,张郃方得突围而出,率军退回长安。
陇右既失,长安告急。大将军曹真镇守长安,命张郃巡视各城,加固防御。张郃依令行事,使各城得以稳固。
诸葛亮于陇右发展,意图反攻。曹真遣张郃率骑兵袭扰陇右,张郃领命,分兵五路,灵活出击。然蜀军早有防备,设下重重包围,张郃骑兵活动范围渐小,终被迫退兵。
此后,诸葛亮亲率大军进逼长安,魏国上下皆惊。张郃虽奋力抵抗,然终因蜀军势大,长安城破。张郃于乱军之中,英勇战死,为国捐躯。", + huan_zhugeliang: "六年春,诸葛亮扬声取道斜谷,以赵云、邓芝为疑兵,驻守箕谷,吸引魏大将军曹真率众抵御。而诸葛亮亲率大军直攻祁山,军容严整,赏罚分明,号令如山。南安、天水、安定三郡因此叛魏归汉,关中震动。魏明帝亲赴长安坐镇,遭张郃抵御诸葛亮。
诸葛亮采纳众议,命魏延领兵在前,与张郃战于街亭。同时,诸葛亮采取里应外合之策,先取天水郡,再遣张翼分兵安定,自率大军围困南安。为诱敌深入,诸葛亮采纳马谡之计,对南安郡围三缺一,使敌派使求援。于榆中峡谷口,诸葛亮伏击金城援军,趁虚而入,攻克金城。随后,凉州刺史徐邈拒降,英勇战死。西平太守见势不妙,归降蜀汉,陇西遂平,凉州入蜀。张郃因此退守长安。
诸葛亮攻天水时,得良将姜维,如虎添翼。两年后,建兴八年春,诸葛亮两路出兵,以木牛流马运粮,再攻长安魏延领一路兵,经安定、新平至华阴,阻魏援军。诸葛亮亲率益州大军,以赵云为先锋,直逼长安。两军会战,赵云英勇、连斩数将,先登城楼,蜀军士气大振、长安告破。魏主帅曹真被俘,后送还洛阳,不久病逝。
长安既下,天下响应。东吴亦发兵合肥,攻魏新城。两年后,建兴十年春,诸葛亮挥师洛阳,魏以司马懿为主帅,两军对峙潼关。司马懿坚壁不出,蜀军难克。诸葛亮为激敌出战,送巾帼妇人衣物于司马懿,并书辱之。魏将愤慨,请战声起,司马懿笑而置之。
魏延献策,欲绕潼关奇袭洛阳,诸葛亮从之,并遣细作于洛阳散布司马懿叛国谣言,离间君臣。借此良机,蜀军克潼关。围洛阳三月,魏明帝调兵遣将,皆被蜀将张苞、关兴、赵广等击败。天下郡县,忠汉之士,纷纷响应,遥领蜀汉官职。
建兴十一年秋,蜀军发起总攻,洛阳城内士气低落,外援无望。经月余激战,洛阳终破。魏明帝自焚于宫。诸葛亮迎刘禅入主中原,蜀汉一统天下。
然诸葛亮未敢懈怠,内理朝政,外御强敌、兼及培养后继之人。日夜操劳,不辞辛劳。建兴十二年春,诸葛亮积劳成疾,病逝于洛阳。刘禅悲痛不已,追封其为琅琊王,以彰其盖世之功与无尽之忠。", zhugejun: "诸葛均(生卒年不详),琅邪阳都(今山东省沂南县)人,诸葛珪之子。三国时吴大将军诸葛瑾、蜀汉丞相诸葛亮之弟。在蜀汉官至长水校尉。", yanliang: "颜良(?~200年),字公骥,安平郡堂阳县(今河北省新河县)人。东汉末年河北将领。颜良性格促狭,虽骁勇不可独任,为一夫之勇。官渡之战,袁绍令颜良进攻白马(今河南滑县)。曹操采用军师荀攸“声东击西、轻兵掩袭”之计,大败袁军,颜良本人也被关羽亲自斩杀死,白马之围遂解。据说颜之推是其后人。", wenchou: "文丑(?~200年),东汉末年河北将领。文丑为一夫之勇。建安五年(200年),带领左将军刘备进驻延津,误中曹操军师荀攸的“饵敌”之计,其麾下“五六千骑”惨败于“不满六百”的曹军骑兵。文丑本人也死于乱军之中,葬于河南省禹州市。", diff --git a/character/tw/skill.js b/character/tw/skill.js index 4a3ca528c1..7b421804fb 100644 --- a/character/tw/skill.js +++ b/character/tw/skill.js @@ -2,8 +2,228 @@ import { lib, game, ui, get, ai, _status } from "../../noname.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //李赵 + twciyin: { + audio: 2, + global: "beOfOneHeart", + oneHeart: true, + trigger: { + global: "phaseZhunbeiBegin", + }, + filter(event, player) { + const target = event.player; + return player == target || player.getStorage("beOfOneHeartWith").includes(target); + }, + async content(event, trigger, player) { + const num = Math.min(trigger.player.getHp() * 2, 10); + const cards = get.cards(num, true); + await player.showCards(cards); + const gain = cards.filter(card => ["heart", "spade"].includes(get.suit(card))); + if (!gain.length) return; + const links = await player.chooseButton(["慈荫:你可以将其中任意张黑桃/红桃牌置于武将牌上", gain], [1, Infinity]).set("ai", get.buttonValue).forResultLinks(); + if (!links || !links.length) return; + const next = player.addToExpansion(links); + next.gaintag.add("twciyin"); + await next; + }, + marktext: "荫", + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove(player, skill) { + const cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + group: "twciyin_heart", + subSkill: { + heart: { + audio: "twciyin", + trigger: { + player: "addToExpansionAfter", + }, + filter(event, player) { + if (!event.gaintag.includes("twciyin")) return false; + const cards = player.getExpansions("twciyin"); + const history = game.getAllGlobalHistory("everything", evt => evt.name == "twciyin_heart" && evt.player == player); + const limit = history.map(evt => evt.cost_data).flat(); + return (cards.length % 3 == 0 || event.cards.length > 2) && (!limit.includes("选项一") || (!limit.includes("选项二") && player.countCards("h") < player.maxHp)); + }, + async cost(event, trigger, player) { + const goon = player.getExpansions("twciyin").length > 5; + const history = game.getAllGlobalHistory("everything", evt => evt.name == "twciyin_heart" && evt.player == player); + const limit = history.map(evt => evt.cost_data).flat(); + const choices = []; + const choiceList = ["增加1点体力上限并回复1点体力", "将手牌摸至体力上限"]; + if (!limit.includes("选项一")) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (!limit.includes("选项二") && player.countCards("h") < player.maxHp) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (goon && !history.length && choices.length == 2) { + event.result = { + bool: true, + cost_data: choices, + }; + } else { + const control = + choices.length == 1 + ? choices[0] + : await player + .chooseControl(choices) + .set("prompt", get.prompt("twciyin")) + .set("choiceList", choiceList) + .set("ai", () => { + const player = get.player(), + num = player.maxHp - player.countCards("h"); + return get.recoverEffect(player, player, player) > get.effect(player, { name: "draw" }, player, player) * num ? "选项一" : "选项二"; + }) + .forResultControl(); + event.result = { + bool: true, + cost_data: [control], + }; + } + }, + async content(event, trigger, player) { + if (event.cost_data.includes("选项一")) { + await player.gainMaxHp(); + await player.recover(); + } + if (event.cost_data.includes("选项二")) { + await player.drawTo(player.maxHp); + } + }, + }, + }, + }, + twchenglong: { + audio: 2, + trigger: { + global: "phaseJieshuBegin", + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "gray", + filter(event, player) { + return ( + game + .getAllGlobalHistory("everything", evt => evt.name == "twciyin_heart" && evt.player == player) + .map(evt => evt.cost_data) + .flat().length == 2 + ); + }, + async content(event, trigger, player) { + player.awakenSkill("twchenglong"); + const cards = player.getExpansions("twciyin"); + if (cards.length) await player.gain(cards, "gain2"); + await player.removeSkills("twciyin"); + let list = []; + if (_status.characterlist) { + for (const name of _status.characterlist) if (["shu", "qun"].includes(lib.character[name][1])) list.push(name); + } else if (_status.connectMode) { + list = get.charactersOL(name => !["shu", "qun"].includes(lib.character[name][1])); + } else { + list = get.gainableCharacters(info => ["shu", "qun"].includes(info[1])); + } + const players = game.players.concat(game.dead); + for (var i = 0; i < players.length; i++) { + list.remove(players[i].name); + list.remove(players[i].name1); + list.remove(players[i].name2); + } + const filter = skill => { + const translation = get.skillInfoTranslation(skill, player); + if (!translation) return false; + const info = get.info(skill); + return info && !info.zhuSkill && !info.limited && !info.juexingji && !info.hiddenSkill && !info.charlotte && !info.dutySkill && ["【杀】", "【闪】"].some(str => get.plainText(translation).includes(str)); + }; + list = list.filter(name => (lib.character[name][3] || []).some(filter)); + if (!list.length) return; + const skillList = {}; + for (const name of list.randomGets(4)) skillList[name] = (lib.character[name][3] || []).filter(filter); + if (Object.keys(skillList).length) { + const next = player.chooseButton(3, ["成龙:获得其中至多两个技能", [Object.keys(skillList), "character"]], true, [1, 2]); + next.set("skillList", skillList); + next.set("processAI", function () { + const map = get.event("skillList"); + return { + links: Object.values(map).flat().randomGets(2), + bool: true, + }; + }); + next.set("custom", { + replace: { + button(button) { + if (!_status.event.isMine()) return; + if (button.classList.contains("selectable") == false) return; + const dialog = get.event("dialog"); + const nodes = Array.from(dialog.content.childNodes[1].childNodes); + if (nodes.includes(button)) { + if (button.classList.contains("selected")) { + button.classList.remove("selected"); + while (dialog.content.childElementCount > 2) dialog.content.removeChild(dialog.content.lastChild); + dialog.buttons.splice(nodes.length); + ui.update(); + } else { + const node = nodes.find(node => node.classList.contains("selected")); + if (node) { + node.classList.remove("selected"); + while (dialog.content.childElementCount > 2) dialog.content.removeChild(dialog.content.lastChild); + dialog.buttons.splice(nodes.length); + ui.update(); + } + button.classList.add("selected"); + dialog.add([get.event("skillList")[button.link].map(value => [value, get.translation(value)]), "tdnodes"]); + dialog.buttons.forEach(function (button) { + if (ui.selected.buttons.some(value => value.link == button.link)) button.classList.add("selected"); + }); + game.check(); + } + } else { + if (button.classList.contains("selected")) { + ui.selected.buttons.remove(button); + button.classList.remove("selected"); + if (_status.multitarget || _status.event.complexSelect) { + game.uncheck(); + game.check(); + } + } else { + button.classList.add("selected"); + ui.selected.buttons.add(button); + } + const custom = get.event("custom"); + if (custom && custom.add && custom.add.button) custom.add.button(); + } + game.check(); + nodes.forEach(button => button.classList.add("selectable")); + }, + window() { + const dialog = get.event("dialog"); + const node = dialog.content.childNodes[1]; + const selected = Array.from(node.childNodes).find(node => node.classList.contains("selected")); + if (selected) { + selected.classList.remove("selected"); + while (dialog.content.lastChild != node) dialog.content.removeChild(dialog.content.lastChild); + dialog.buttons.splice(node.childElementCount); + } + game.uncheck(); + game.check(); + ui.update(); + }, + }, + add: next.custom.add, + }); + const links = await next.forResultLinks(); + await player.addSkills(links); + } + }, + ai: { + combo: "twciyin", + }, + }, //幻诸葛亮 - huan_zhugeliang_A: { + twbeiding: { audio: 2, trigger: { global: "phaseZhunbeiBegin", @@ -13,8 +233,10 @@ const skills = { player.getHp() > 0 && get.inpileVCardList(info => { if (!["basic", "trick"].includes(info[0])) return false; - if (info[2] == "sha" && info[3]) return false; - return !player.getStorage("huan_zhugeliang_A").includes(info[2]); + return !player + .getStorage("twbeiding") + .map(i => i[0].name) + .includes(info[2]); }).length ); }, @@ -22,31 +244,37 @@ const skills = { const num = player.getHp(), vcards = get.inpileVCardList(info => { if (!["basic", "trick"].includes(info[0])) return false; - if (info[2] == "sha" && info[3]) return false; - return !player.getStorage("huan_zhugeliang_A").includes(info[2]); + return !player + .getStorage("twbeiding") + .map(i => i[0].name) + .includes(info[2]); }); const { result: { bool, links }, - } = await player.chooseButton([`${get.translation(event.name.slice(0, -5))}:你可以声明并记录至多${get.cnNumber(num)}个未以此法记录的牌名`, [vcards, "vcard"]], [1, num]).set("ai", button => { - const player = get.player(); - return player.getUseValue({ name: button.link[2] }); - }); + } = await player + .chooseButton([`${get.translation(event.name.slice(0, -5))}:你可以声明并记录至多${get.cnNumber(num)}个未以此法记录的牌名`, [vcards, "vcard"]], [1, num]) + .set("filterButton", button => { + return !ui.selected.buttons.some(buttonx => buttonx.link[2] == "sha") || button.link[2] != "sha"; + }) + .set("ai", button => { + const player = get.player(); + return player.getUseValue({ name: button.link[2], nature: button.link[3] }); + }); event.result = { bool: bool, cost_data: links, }; }, async content(event, trigger, player) { - const names = event.cost_data.map(link => link[2]); + const names = event.cost_data.map(link => [{ name: link[2], nature: link[3] }]); game.log(player, "声明了", "#g" + get.translation(names)); player.markAuto(event.name, names); player.markAuto(event.name + "_use", names); }, - onremove: true, intro: { content: "已记录牌名:$", }, - group: "huan_zhugeliang_A_use", + group: "twbeiding_use", subSkill: { use: { trigger: { @@ -55,7 +283,7 @@ const skills = { filter(event, player) { const target = _status.currentPhase; if (!target || !target.isIn() || event.player != target) return false; - return player.getStorage("huan_zhugeliang_A_use").length; + return player.getStorage("twbeiding_use").length; }, forced: true, async content(event, trigger, player) { @@ -63,7 +291,7 @@ const skills = { storage = player.getStorage(event.name); while (storage.length) { const name = storage.shift(), - card = get.autoViewAs({ name: name, isCard: true }); + card = get.autoViewAs({ name: name[0].name, nature: name[0].nature, isCard: true }); if (!player.hasUseTarget(card, false)) continue; const targets = await player.chooseUseTarget(`请选择${get.translation(card)}的目标,若此牌的目标不包含${get.translation(target)},则其摸一张牌`, card, true, false, "nodistance").forResultTargets(); if (!targets.includes(target) && target.isIn()) await target.draw(); @@ -77,7 +305,7 @@ const skills = { }, }, }, - huan_zhugeliang_B: { + twjielv: { audio: 2, trigger: { global: "phaseEnd", @@ -89,9 +317,10 @@ const skills = { async content(event, trigger, player) { player.loseHp(); }, - group: "huan_zhugeliang_B_buff", + group: "twjielv_buff", subSkill: { buff: { + audio: "twjielv", trigger: { player: ["loseHpEnd", "damageEnd"], }, @@ -100,13 +329,13 @@ const skills = { }, forced: true, async content(event, trigger, player) { - const num = Math.min(trigger.num, player.maxHp); + const num = Math.min(trigger.num, 7 - player.maxHp); player.gainMaxHp(num); }, }, }, }, - huan_zhugeliang_C: { + twhunyou: { audio: 2, unique: true, limited: true, @@ -123,19 +352,15 @@ const skills = { if (!_status.currentPhase) return; player .when({ global: "phaseAfter" }) - .then(() => { - const num = Math.min(7, player.getStorage("huan_zhugeliang_A").length); - if (num > 0) player.draw(num); - }) .then(() => { player.insertPhase(); }) .then(() => { - player.changeSkin("huan_zhugeliang_C", "huan_zhugeliang_shadow"); - player.changeSkills(["huan_zhugeliang_D", "huan_zhugeliang_E", "huan_zhugeliang_F", "huan_zhugeliang_G"], ["huan_zhugeliang_A", "huan_zhugeliang_B", "huan_zhugeliang_C"]); + player.changeSkin("twhunyou", "huan_zhugeliang_shadow"); + player.changeSkills(get.info("twhunyou").derivation, get.info("twchanggui").derivation); }); }, - derivation:["huan_zhugeliang_D", "huan_zhugeliang_E", "huan_zhugeliang_F", "huan_zhugeliang_G"], + derivation: ["twbeidingx", "twjielvx", "twhuanji", "twchanggui"], subSkill: { buff: { trigger: { @@ -145,6 +370,7 @@ const skills = { charlotte: true, async content(event, trigger, player) { trigger.cancel(); + game.log(player, "防止此次了" + (trigger.name == "damage" ? "伤害" : "失去体力")); }, ai: { nofire: true, @@ -152,7 +378,7 @@ const skills = { nodamage: true, effect: { target(card, player, target, current) { - if (get.tag(card, "damage")) return [0, 0]; + if (get.tag(card, "damage")) return "zeroplayertarget"; }, }, }, @@ -166,17 +392,23 @@ const skills = { order: 1, save: true, skillTagFilter(player, tag, target) { - if (player != target || player.storage.huan_zhugeliang_C) return false; + if (player != target || player.storage.twhunyou) return false; }, result: { player: 1, }, }, }, - huan_zhugeliang_D: { + twbeidingx: { mod: { targetInRange(card, player, target) { - if (player.getStorage("huan_zhugeliang_A").includes(card.name)) return true; + if ( + player + .getStorage("twbeiding") + .map(i => i[0].name) + .includes(card.name) + ) + return true; }, }, audio: 2, @@ -184,7 +416,13 @@ const skills = { player: ["useCard1", "useCardAfter"], }, filter(event, player, name) { - if (!player.getStorage("huan_zhugeliang_A").includes(event.card.name)) return false; + if ( + !player + .getStorage("twbeiding") + .map(i => i[0].name) + .includes(event.card.name) + ) + return false; return name == "useCardAfter" || (name == "useCard1" && event.addCount !== false); }, forced: true, @@ -196,14 +434,17 @@ const skills = { if (typeof stat[name] == "number") stat[name]--; } else { await player.draw(); - player.unmarkAuto("huan_zhugeliang_A", [trigger.card.name]); + player.unmarkAuto( + "twbeiding", + player.getStorage("twbeiding").filter(i => i[0].name == trigger.card.name) + ); } }, ai: { - combo: "huan_zhugeliang_A", + combo: "twbeiding", }, }, - huan_zhugeliang_E: { + twjielvx: { audio: 2, trigger: { player: "loseMaxHpEnd", @@ -217,44 +458,52 @@ const skills = { player.recover(num); }, }, - huan_zhugeliang_F: { + twhuanji: { audio: 2, enable: "phaseUse", usable: 1, filter(event, player) { - return get.inpileVCardList(info => { - if (!["basic", "trick"].includes(info[0])) return false; - if (info[2] == "sha" && info[3]) return false; - return !player.getStorage("huan_zhugeliang_A").includes(info[2]); - }).length; + return ( + player.getHp() > 0 && + get.inpileVCardList(info => { + if (!["basic", "trick"].includes(info[0])) return false; + return !player + .getStorage("twbeiding") + .map(i => i[0].name) + .includes(info[2]); + }).length + ); }, chooseButton: { dialog(event, player) { - console.log(event); const list = get.inpileVCardList(info => { if (!["basic", "trick"].includes(info[0])) return false; - if (info[2] == "sha" && info[3]) return false; - return !player.getStorage("huan_zhugeliang_A").includes(info[2]); + return !player + .getStorage("twbeiding") + .map(i => i[0].name) + .includes(info[2]); }); - return ui.create.dialog(get.translation("huan_zhugeliang_F"), [list, "vcard"], "hidden"); + return ui.create.dialog(get.translation("twhuanji"), [list, "vcard"], "hidden"); + }, + filter(button) { + return !ui.selected.buttons.some(buttonx => buttonx.link[2] == "sha") || button.link[2] != "sha"; }, check(button, player) { return get.player().getUseValue({ name: button.link[2], nature: button.link[3] }); }, select() { - return [1, get.player().getHp() + 1]; + return [1, get.player().getHp()]; }, backup(links, player) { return { - names: links.map(i => i[2]), + names: links.map(i => [{ name: i[2], nature: i[3] }]), filterCard: () => false, selectCard: -1, async content(event, trigger, player) { const names = lib.skill[event.name].names; await player.loseMaxHp(); game.log(player, "声明了", "#g" + get.translation(names)); - player.markAuto("huan_zhugeliang_A", names); - player.markAuto("huan_zhugeliang_A_use", names); + player.markAuto("twbeiding", names); }, }; }, @@ -271,13 +520,13 @@ const skills = { return 0; }, }, - combo: "huan_zhugeliang_A", + combo: "twbeiding", }, subSkill: { backup: {}, }, }, - huan_zhugeliang_G: { + twchanggui: { audio: 2, trigger: { player: "phaseJieshuBegin", @@ -288,11 +537,11 @@ const skills = { forced: true, async content(event, trigger, player) { const num = player.maxHp - player.getHp(); - player[num > 0 ? "loseMaxHp" : "gainMaxHp"](Math.abs(num)); - player.changeSkin("huan_zhugeliang_G", "huan_zhugeliang"); - player.changeSkills(["huan_zhugeliang_A", "huan_zhugeliang_B", "huan_zhugeliang_C"], ["huan_zhugeliang_D", "huan_zhugeliang_E", "huan_zhugeliang_F", "huan_zhugeliang_G"]); + await player[num > 0 ? "loseMaxHp" : "gainMaxHp"](Math.abs(num)); + player.changeSkin("twchanggui", "huan_zhugeliang"); + await player.changeSkills(get.info("twchanggui").derivation, get.info("twhunyou").derivation); }, - derivation:["huan_zhugeliang_A", "huan_zhugeliang_B", "huan_zhugeliang_C"], + derivation: ["twbeiding", "twjielv", "twhunyou"], }, //幻姜维 huan_jiangwei_A: { @@ -629,7 +878,7 @@ const skills = { }, }, //幻张郃 - huan_zhanghe_A: { + twkuiduan: { audio: 2, trigger: { player: "useCardToPlayered" }, filter(event, player) { @@ -642,14 +891,14 @@ const skills = { const targets = [player, trigger.target]; for (const target of targets) { if (!target.countCards("h")) continue; - target.addSkill("huan_zhanghe_A_card"); - target.addGaintag(target.getCards("h").randomGets(2), "huan_zhanghe_A_card"); + target.addSkill("twkuiduan_card"); + target.addGaintag(target.getCards("h").randomGets(2), "twkuiduan_card"); } }, - group: "huan_zhanghe_A_damage", + group: "twkuiduan_damage", subSkill: { damage: { - audio: "huan_zhanghe_A", + audio: "twkuiduan", trigger: { global: "damageBegin1" }, filter(event, player) { if (!event.source) return false; @@ -657,13 +906,13 @@ const skills = { if ( !evtx || evtx.name != "useCard" || - !player.hasHistory("lose", evt => { + !event.source.hasHistory("lose", evt => { if (evt.getParent() != evtx) return false; - return Object.keys(evt.gaintag_map || {}).includes("huan_zhanghe_A_card"); + return Object.keys(evt.gaintag_map || {}).includes("twkuiduan_card"); }) ) return false; - return event.source.countCards("h", card => card.hasGaintag("huan_zhanghe_A_card")) > event.target.countCards("h", card => card.hasGaintag("huan_zhanghe_A_card")); + return event.source.countCards("h", card => card.hasGaintag("twkuiduan_card")) > event.player.countCards("h", card => card.hasGaintag("twkuiduan_card")); }, forced: true, logTarget: "source", @@ -675,20 +924,20 @@ const skills = { charlotte: true, mod: { aiOrder(player, card, num) { - if (get.itemtype(card) == "card" && card.hasGaintag("huan_zhanghe_A_card")) return num + 1; + if (get.itemtype(card) == "card" && card.hasGaintag("twkuiduan_card")) return num + 1; }, cardname(card, player) { - if (get.itemtype(card) == "card" && card.hasGaintag("huan_zhanghe_A_card")) return "sha"; + if (get.itemtype(card) == "card" && card.hasGaintag("twkuiduan_card")) return "sha"; }, cardnature(card, player) { - if (get.itemtype(card) == "card" && card.hasGaintag("huan_zhanghe_A_card")) return false; + if (get.itemtype(card) == "card" && card.hasGaintag("twkuiduan_card")) return false; }, }, }, }, }, //幻赵云 - huan_zhaoyun_A: { + twjiezhan: { audio: 2, trigger: { global: "phaseUseBegin", @@ -699,7 +948,7 @@ const skills = { check(event, player) { if (get.attitude(player, event.player) > 0) return false; if (player.getEquip("bagua") || player.getEquip("rw_bagua")) return true; - if (player.hasSkill("huan_zhaoyun_B", null, null, false) && !player.awakenedSkills.includes("huan_zhaoyun_B")) return true; + if (player.hasSkill("twlongjin", null, null, false) && !player.awakenedSkills.includes("twlongjin")) return true; if (player.countCards("hs", "shan") || (player.countCards("hs", "sha") && player.hasSkill("ollongdan", null, null, false))) return true; return get.effect(player, { name: "draw" }, player, player) + get.effect(event.player, { name: "sha" }, event.player, player); }, @@ -711,7 +960,7 @@ const skills = { if (target.canUse(sha, player, false, true)) await target.useCard(sha, player); }, }, - huan_zhaoyun_B: { + twlongjin: { audio: 2, trigger: { player: "dying", @@ -743,7 +992,7 @@ const skills = { global: ["phaseBefore", "phaseAfter"], }, filter(event, player, name) { - return name == "phaseBefore" || (name == "phaseAfter" && !player.countMark("huan_zhaoyun_B_buff")); + return name == "phaseBefore" || (name == "phaseAfter" && !player.countMark("twlongjin_buff")); }, forced: true, popup: false, @@ -4943,6 +5192,7 @@ const skills = { usable: 1, charlotte: true, filter: function (event, player) { + if (player.hasSkill("twkaizeng_used")) return false; return game.hasPlayer(current => { return current != player && current.hasSkill("twkaizeng"); }); @@ -5011,6 +5261,7 @@ const skills = { }, content: function () { "step 0"; + player.addTempSkill("twkaizeng_used"); var type = lib.skill.twkaizeng_want_backup.type; var isbasic = lib.card[type]; target @@ -5078,6 +5329,7 @@ const skills = { }, }, want_backup: {}, + used: {}, }, ai: { threaten: 3, @@ -8163,7 +8415,6 @@ const skills = { }, twxiangyu: { group: "twxiangyu_lose", - shaRelated: true, audio: "zniaoxiang", trigger: { player: "useCardToPlayered" }, filter: function (event, player) { @@ -14673,8 +14924,7 @@ const skills = { twlihuo3: { trigger: { player: "useCardAfter" }, filter: function (event, player) { - return (event.card.twlihuo_buffed = - true && + return (event.card.twlihuo_buffed && player.getHistory("sourceDamage", function (evt) { return evt.card == event.card && evt._dyinged; }).length > 0); diff --git a/character/tw/sort.js b/character/tw/sort.js index cdff8ad6cd..c0524dca15 100644 --- a/character/tw/sort.js +++ b/character/tw/sort.js @@ -12,6 +12,7 @@ const characterSort = { tw_mobile2: ["tw_chengpu", "tw_guohuai", "old_quancong", "tw_caoxiu", "tw_guanqiujian", "tw_re_fazheng", "tw_madai", "tw_zhangfei", "tw_guyong", "tw_handang", "tw_xuezong", "tw_yl_luzhi"], tw_yijiang: ["tw_caoang", "tw_caohong", "tw_zumao", "tw_dingfeng", "tw_maliang", "tw_xiahouba"], tw_english: ["kaisa"], + tw_waitingforsort: ["licuilianzhaoquanding"], }; const characterSortTranslate = { @@ -28,6 +29,7 @@ const characterSortTranslate = { tw_mobile2: "海外服·异构", tw_yijiang: "一将成名TW", tw_english: "英文版", + tw_waitingforsort: "等待分包", }; export { characterSort, characterSortTranslate }; diff --git a/character/tw/translate.js b/character/tw/translate.js index 542a51c43c..d195f530f7 100644 --- a/character/tw/translate.js +++ b/character/tw/translate.js @@ -623,7 +623,7 @@ const translates = { twhuzhong: "护众", twhuzhong_info: "当你于出牌阶段使用无属性【杀】指定唯一目标角色时,你可以摸一张牌并选择一项:①为此牌额外选择一个目标;②弃置其一张手牌,此牌结算完毕后,若此牌造成过伤害,则你摸一张牌且本阶段可以额外使用一张【杀】。", twfenwang: "焚亡", - twfenwang_info: "锁定技。①当你受到属性伤害时,你须弃置一张牌或令此伤害+1。②当你对其他角色造成非属性伤害时,若你的手牌数大于等于其,则此伤害+1。", + twfenwang_info: "锁定技。①当你受到属性伤害时,你须弃置一张手牌或令此伤害+1。②当你对其他角色造成非属性伤害时,若你的手牌数大于等于其,则此伤害+1。", xia_xiahousone: "夏侯子萼", twchengxi: "承袭", twchengxi_info: "出牌阶段每名角色限一次,你可以摸一张牌并与一名其他角色拼点。若你赢,你使用的下一张基本牌或非延时锦囊牌结算完毕后,你视为对原目标使用一张无次数限制的同名牌;若你没赢,其视为对你使用一张无距离限制的【杀】。", @@ -714,14 +714,14 @@ const translates = { twguimou_info: "每回合限两次,当一名角色的判定牌生效前,你可以观看牌堆底的四张牌,打出其中一张牌代替之,然后将其余牌以任意顺序置于牌堆顶。", huan_zhaoyun: "幻赵云", huan_zhaoyun_prefix: "幻", - huan_zhaoyun_A: "技一", - huan_zhaoyun_A_info: "其他角色的出牌阶段开始时,若其在你攻击范围内,你可以摸一张牌,然后其视为对你使用一张无距离限制的普通【杀】(计入【杀】的使用次数)。", - huan_zhaoyun_B: "技二", - huan_zhaoyun_B_info: "觉醒技,当你进入濒死状态时,你将体力值回复至2点,此后的五个回合,你视为拥有技能〖龙胆〗和〖冲阵〗,且你计算与其他角色的距离视为1。", + twjiezhan: "竭战", + twjiezhan_info: "其他角色的出牌阶段开始时,若其在你攻击范围内,你可以摸一张牌,然后其视为对你使用一张无距离限制的普通【杀】(计入【杀】的使用次数)。", + twlongjin: "龙烬", + twlongjin_info: "觉醒技,当你进入濒死状态时,你将体力值回复至2点,此后的五个回合,你视为拥有技能〖龙胆〗和〖冲阵〗,且你计算与其他角色的距离视为1。", huan_zhanghe: "幻张郃", huan_zhanghe_prefix: "幻", - huan_zhanghe_A: "技一", - huan_zhanghe_A_info: "锁定技。①当你使用【杀】指定唯一目标后,你与其的随机两张手牌获得“技一”标记,这些牌视为无属性【杀】。②一名角色使用含“技一”标记的牌造成伤害时,若其含“技一”标记的手牌数大于受伤角色含“技一”标记的手牌数,则此伤害+1。", + twkuiduan: "溃端", + twkuiduan_info: "锁定技。①当你使用【杀】指定唯一目标后,你与其的随机两张手牌获得“溃端”标记,这些牌视为无属性【杀】。②一名角色使用含“溃端”标记的牌造成伤害时,若其含“溃端”标记的手牌数大于受伤角色含“溃端”标记的手牌数,则此伤害+1。", huan_guojia: "幻郭嘉", huan_guojia_prefix: "幻", huan_guojia_A: "技一", @@ -736,20 +736,25 @@ const translates = { huan_jiangwei_B_info: "当你使用【杀】对目标角色造成伤害时,你可以防止此伤害并选择一项:1.获得其装备区里的一张牌;2.获得并使用一张牌堆或弃牌堆中你空置装备栏对应类别的装备牌,然后其下次使用【闪】时随机弃置两张手牌。", huan_zhugeliang: "幻诸葛亮", huan_zhugeliang_prefix: "幻", - huan_zhugeliang_A: "技一", - huan_zhugeliang_A_info: "每名角色的准备阶段,你可以声明并记录至多X个未记录的基本牌或普通锦囊牌牌名(X为你的体力值)。当前回合角色弃牌阶段结束时,你视为依次使用本回合声明的牌(无距离限制),若此牌的目标不包含其,其摸一张牌。", - huan_zhugeliang_B: "技二", - huan_zhugeliang_B_info: "锁定技。①每名角色回合结束时,若你未对其使用牌,你失去1点体力。②当你失去1点体力或受到1点伤害后,若你的体力上限小于7,你增加1点体力上限。", - huan_zhugeliang_C: "技三", - huan_zhugeliang_C_info: "限定技,当你处于濒死状态时,你可以将体力值回复至1点,若如此做,本回合当你受到伤害时或失去体力时,取消之;当前回合结束后,你入幻:摸X张牌并进行一个额外的回合(X为〖技一〗记录牌名数,且至多为7)。", - huan_zhugeliang_D: "技四", - huan_zhugeliang_D_info: "锁定技。你使用〖技一〗记录的牌无距离限制且不计入次数;当你使用〖技一〗记录的牌结算结束后,你摸一张牌,然后从〖技一〗记录中移除此牌名。", - huan_zhugeliang_E: "技五", - huan_zhugeliang_E_info: "锁定技,当你减少1点体力上限后,你回复1点体力。", - huan_zhugeliang_F: "技六", - huan_zhugeliang_F_info: "出牌阶段限一次,你可以减少1点体力上限,然后增加至多X个〖技一〗未记录过的牌名 (X为你的体力值+1)。", - huan_zhugeliang_G: "技七", - huan_zhugeliang_G_info: "锁定技,结束阶段,若你的体力值为全场最低且不等于体力上限,你须退幻:将体力上限调整为当前体力值。", + twbeiding: "北定", + twbeiding_info: "每名角色的准备阶段,你可以声明并记录至多X个未记录的基本牌或普通锦囊牌牌名(X为你的体力值)。当前回合角色弃牌阶段结束时,你视为依次使用本回合声明的牌(无距离限制),若此牌的目标不包含其,其摸一张牌。", + twjielv: "竭虑", + twjielv_info: "锁定技。①每名角色回合结束时,若你未对其使用牌,你失去1点体力。②当你失去1点体力或受到1点伤害后,若你的体力上限小于7,你增加1点体力上限。", + twhunyou: "魂游", + twhunyou_info: "限定技,当你处于濒死状态时,你可以将体力值回复至1点,若如此做,本回合当你受到伤害时或失去体力时,取消之;当前回合结束后,你入幻:进行一个额外的回合。", + twbeidingx: "北定", + twbeidingx_info: "你使用〖北定〗记录的牌无距离限制且不计入次数;当你使用〖北定〗记录的牌结算结束后,你摸一张牌,然后从〖北定〗记录中移除此牌名。", + twjielvx: "竭虑", + twjielvx_info: "锁定技,当你减少1点体力上限后,你回复1点体力。", + twhuanji: "幻计", + twhuanji_info: "出牌阶段限一次,你可以减少1点体力上限,然后增加至多X个〖北定〗未记录过的牌名 (X为你的体力值)。", + twchanggui: "怅归", + twchanggui_info: "锁定技,结束阶段,若你的体力值为全场最低且不等于体力上限,你须退幻:将体力上限调整为当前体力值。", + licuilianzhaoquanding: "李翠莲赵全定", + twciyin: "慈荫", + twciyin_info: "①你或同心角色的准备阶段,你可以亮出牌堆顶X张牌,然后将其中任意张♠或♥牌置于武将牌上,称为“荫”,然后将其余牌放回牌堆顶(X为当前回合角色的体力值的两倍,且至多为10)。②你每获得三张“荫”后,你选择本局游戏未选择的一项:1.增加1点体力上限并回复1点体力;2.将手牌补至体力上限。", + twchenglong: "成龙", + twchenglong_info: "觉醒技,一名角色的结束阶段,若你已经执行过〖慈荫〗所有选项,你获得武将牌上的所有“荫”并失去〖慈荫〗,然后你从四张蜀势力或群势力武将牌中选择至多两个技能描述中含【杀】或【闪】的技能获得之。", }; export default translates; diff --git a/character/tw/voices.js b/character/tw/voices.js index 5dcfa95d02..1168415bf6 100644 --- a/character/tw/voices.js +++ b/character/tw/voices.js @@ -1,4 +1,32 @@ export default { + "#twbeiding1": "众将同心扶汉,北伐或可功成。", + "#twbeiding2": "虽失天时地利,亦有三分胜机。", + "#twjielv1": "竭一国之材,尽万人之力。", + "#twjielv2": "穷心尽力,亮必以血补天。", + "#twhunyou1": "扶汉兴刘,夙夜沥血,忽入草堂梦中。", + "#twhunyou2": "一整山河,以明己志,昔日言犹记否?", + "#huan_zhugeliang:die": "先帝遗志未竟,吾怎可终于半途……", + "#twbeidingx1": "内外不懈如斯,长安不可日下。", + "#twbeidingx2": "先帝英灵冥鉴,此番定成夙愿。", + "#twjielvx1": "出箕谷,饮河洛,所至长安。", + "#twjielvx2": "破司马,废伪政,誓还帝都。", + "#twhuanji1": "以计中之计,调雍凉戴甲,天下备鞍。", + "#twhuanji2": "借计代兵,以一隅抗九州。", + "#twchanggui1": "隆中鱼水,永安星落,数载恍然隔世。", + "#twchanggui2": "铁马冰河,金台临望,倏醒方叹无功。", + "#huan_zhugeliang_shadow:die": "一人之愿,终难逆天命……", + "#twjiezhan1": "血尽鳞碎,不改匡汉之志!", + "#twjiezhan2": "龙胆虎威,百险千难誓相随!", + "#twlongjin1": "龙烬沙场,以全大汉之荣光!", + "#twlongjin2": "长坂龙魂犹在,吟哮万里长安!", + "#longdan_sha_huan_zhaoyun1": "进退有度,百战无伤!", + "#longdan_sha_huan_zhaoyun2": "龙魂缠身,虎威犹在!", + "#chongzhen_huan_zhaoyun1": "众将士,且随老夫再战一场!", + "#chongzhen_huan_zhaoyun2": "出入千军万马,经年横站八方!", + "#huan_zhaoyun:die": "转战一生,终得见兴汉之日……", + "#twkuiduan1": "蜀军大败,吾等岂能失此战机!", + "#twkuiduan2": "求胜心切,竟轻中贼计!", + "#huan_zhanghe:die": "老卒迟暮,恨,不能再报于国……", "#xunde1": "陛下所托,臣必尽心尽力!", "#xunde2": "纵吾荏弱难持,亦不推诿君命!", "#chenjie1": "臣心怀二心,不可事君也。", @@ -8,6 +36,8 @@ export default { "#twduwang2": "勇绝河北,吾足以一柱擎天!", "#twylyanshi1": "今破曹军,明日当直取许都!", "#twylyanshi2": "全军整肃,此战不得有失!", + "#twxiayong1_tw_yanliang": "呃啊,马失前蹄,大意了!", + "#twxiayong2_tw_yanliang": "哈哈哈,先发制人!", "#tw_yanliang:die": "哥哥,切不可轻敌!", "#twjuexing1": "阿瞒且寄汝首,待吾一骑取之!", "#twjuexing2": "杀!尽奸贼败军之众!", @@ -328,17 +358,9 @@ export default { "#twluanlve2": "联白波之众,掠河东之地。", "#tw_liwei:die": "安南重任,万不可轻之……", "#tw_yanxiang:die": "若遇明主,或可青史留名……", - "#mouli1": "澄汰王室,迎立宗子!", - "#mouli2": "僣孽为害,吾岂可谋而不行?", "#tw_fanchou:die": "唉,稚然疑心,甚重……", - "#drlt_qingce1": "感明帝之恩,清君侧之贼。", - "#drlt_qingce2": "得太后手诏,清奸佞乱臣。", - "#tianxiang_daxiaoqiao1": "哼,我才不怕你呢~", - "#tianxiang_daxiaoqiao2": "替我挡着吧~", "#liuli_daxiaoqiao1": "不懂得怜香惜玉么~", - "#liuli_daxiaoqiao2": "交给你了。", - "#gonghuan1": "曹魏势大,吴蜀当共拒之。", - "#gonghuan2": "两国得此联姻,邦交更当稳固。", + "#liuli_daxiaoqiao2": "呵呵,交给你啦~", "#twfeifu1": "此亦久矣,其能复几!", "#twfeifu2": "以侯归第?终败于其!", "#twzhian1": "此等蝼蚁不除,必溃千丈之堤!", diff --git a/character/xiake.js b/character/xiake.js index ed4caee9f5..84f5234f11 100644 --- a/character/xiake.js +++ b/character/xiake.js @@ -3,11 +3,10 @@ game.import("character", function () { return { name: "xiake", character: { - // xk_dongfangweiming:['male','shu',4,[]], xk_guyuexuan: ["male", "qun", 4, ["rouquan", "gzhenji"]], xk_jinji: ["male", "shu", 4, ["zhongzhan", "lianpo"]], // xk_shenxiangyun:['female','wei',3,['zhenjiu']], - xk_fujianhan: ["male", "qun", 4, ["zuijian", "zitong"]], + // xk_fujianhan: ["male", "qun", 4, ["zuijian", "zitong"]], }, skill: { zhongzhan: { @@ -105,7 +104,6 @@ game.import("character", function () { }, }, translate: { - xk_dongfangweiming: "东方未明", xk_guyuexuan: "谷月轩", xk_jinji: "荆棘", xk_shenxiangyun: "沈湘芸", @@ -113,9 +111,9 @@ game.import("character", function () { zhongzhan: "重斩", zhongzhan_info: "每当你即将造成伤害,你可失去1点体力令伤害+1。", gzhenji: "震击", - gzhenji_info: "你使用杀造成伤害后,可以摸一张牌,并且本回合内可以额外使用一张杀。", + gzhenji_info: "你使用【杀】造成伤害后,可以摸一张牌,并且本回合内可以额外使用一张【杀】。", rouquan: "柔拳", - rouquan_info: "你可以重铸装备区内的牌;当你没有武器牌时,你的杀可以指定任意个目标。", + rouquan_info: "你可以重铸装备区内的牌;当你没有武器牌时,你的【杀】可以指定任意个目标。", zitong: "通悟", zitong_info: "当你于自己的回合内使用第三张牌时,你可以将一张传送门置于你的手牌。", }, diff --git a/character/xianding/character.js b/character/xianding/character.js index 8b45751408..ab1f6a6751 100644 --- a/character/xianding/character.js +++ b/character/xianding/character.js @@ -1,31 +1,34 @@ const characters = { + dc_sb_guojia: ["male", "wei", 3, ["dcxianmou", "dclunshi"]], + bianyue: ["female", "wei", 3, ["dcbizu", "dcwuxie"]], zhupeilan: ["female", "wu", 3, ["dccilv", "dctongdao"]], dc_sb_zhangxiu: ["male", "qun", 4, ["dcsbfuxi", "dcsbhaoyi"]], dc_sb_guanping: ["male", "shu", 4, ["dcsbwuwei"]], dc_sb_caoang: ["male", "wei", 4, ["dcsbfengmin", "dcsbzhiwang"]], + dc_sb_dianwei: ["male", "wei", "4/5", ["dcsbkuangzhan", "dcsbkangyong"]], dc_caoshuang: ["male", "wei", 4, ["dcjianzhuan", "dcfanshi"]], - dc_simashi: ["male", "wei", 3, ["dcsanshi", "dczhenrao", "dcchenlve"]], + dc_simashi: ["male", "wei", 3, ["dcsanshi", "dczhenrao", "dcchenlve"], ["name:司马|师"]], dc_wangling: ["male", "wei", 4, ["dcjichou", "dcmouli"], ["clan:太原王氏"]], dc_jiangji: ["male", "wei", 3, ["dcshiju", "dcyingshi"]], - dc_sb_zhugejin: ["male", "wu", 3, ["dcsbtaozhou", "dcsbhoude"]], + dc_sb_zhugejin: ["male", "wu", 3, ["dcsbtaozhou", "dcsbhoude"], ["name:诸葛|瑾"]], dc_sb_jiaxu: ["male", "qun", 3, ["dcsbsushen", "dcsbfumou"]], guanyue: ["male", "shu", 4, ["dcshouzhi", "dcfenhui"]], sp_zhenji: ["female", "qun", 3, ["dcjijie", "dchuiji"]], wu_guanyu: ["male", "shu", 5, ["dcjuewu", "dcwuyou", "dcyixian"]], caofang: ["male", "wei", 4, ["dczhimin", "dcjujian"], ["zhu"]], - dc_sb_simayi: ["male", "wei", 3, ["dcsbquanmou", "dcsbpingliao"]], - chendong: ["male", "wu", 4, ["dcduanxie", "fenming"]], + dc_sb_simayi: ["male", "wei", 3, ["dcsbquanmou", "dcsbpingliao"], ["name:司马|懿"]], + chendong: ["male", "wu", 4, ["dcduanxie", "fenming"], ['name:陈|武-董|袭']], lvfan: ["male", "wu", 3, ["diaodu", "diancai"]], - cuimao: ["male", "wei", 3, ["zhengbi", "fengying"]], + cuimao: ["male", "wei", 3, ["zhengbi", "fengying"], ["name:崔|琰-毛|玠"]], huzun: ["male", "wei", 4, ["dczhantao", "dcanjing"]], - zhugemengxue: ["female", "wei", 3, ["dcjichun", "dchanying"]], + zhugemengxue: ["female", "wei", 3, ["dcjichun", "dchanying"], ["name:诸葛|梦雪"]], bailingyun: ["female", "wei", 3, ["dclinghui", "dcxiace", "dcyuxin"]], - dc_qinghegongzhu: ["female", "wei", 3, ["dczhangji", "dczengou"]], + dc_qinghegongzhu: ["female", "wei", 3, ["dczhangji", "dczengou"], ["name:曹|null"]], caoxian: ["female", "wei", 3, ["dclingxi", "dczhifou"]], dc_sb_zhouyu: ["male", "wu", 4, ["dcsbronghuo", "dcsbyingmou"]], dc_sb_lusu: ["male", "wu", 3, ["dcsbmingshi", "dcsbmengmou"]], zhangjian: ["male", "qun", 105, ["dc_zj_a", "dc_zj_b"], ["unseen"]], - zhugeruoxue: ["female", "wei", 3, ["dcqiongying", "dcnuanhui"]], + zhugeruoxue: ["female", "wei", 3, ["dcqiongying", "dcnuanhui"], ["name:诸葛|若雪"]], caoyi: ["female", "wei", 4, ["dcmiyi", "dcyinjun"]], malingli: ["female", "shu", 3, ["dclima", "dcxiaoyin", "dchuahuo"]], wu_luxun: ["male", "wu", 3, ["dcxiongmu", "dczhangcai", "dcruxian"]], @@ -35,27 +38,27 @@ const characters = { xin_baosanniang: ["female", "shu", 3, ["decadewuniang", "decadexushen"]], dc_shixie: ["male", "qun", 3, ["rebiluan", "ollixia"]], dc_sp_machao: ["male", "qun", 4, ["zhuiji", "dc_olshichou"]], - old_huangfusong: ["male", "qun", 4, ["xinfenyue"]], - dc_xiahouba: ["male", "shu", 4, ["rebaobian"]], - dc_daxiaoqiao: ["female", "wu", 3, ["dcxingwu", "dcluoyan"], ["tempname:daxiaoqiao"]], + old_huangfusong: ["male", "qun", 4, ["xinfenyue"], ["name:皇甫|嵩"]], + dc_xiahouba: ["male", "shu", 4, ["rebaobian"], ["name:夏侯|霸"]], + dc_daxiaoqiao: ["female", "wu", 3, ["dcxingwu", "dcluoyan"], ["tempname:daxiaoqiao", "name:桥|null-桥|null"]], tianshangyi: ["female", "wei", 3, ["dcposuo", "dcxiaoren"]], sunlingluan: ["female", "wu", 3, ["dclingyue", "dcpandi"]], dc_wangjun: ["male", "qun", 4, ["dctongye", "dcchangqu"]], zhoubuyi: ["male", "wei", 3, ["dcshiji", "dcsilun"]], dc_duyu: ["male", "wei", 4, ["dcjianguo", "dcdyqingshi"]], - ganfurenmifuren: ["female", "shu", 3, ["dcchanjuan", "dcxunbie"]], - dc_ganfuren: ["female", "shu", 3, ["dcshushen", "dcshenzhi"]], - dc_mifuren: ["female", "shu", 3, ["dcguixiu", "dccunsi"]], + ganfurenmifuren: ["female", "shu", 3, ["dcchanjuan", "dcxunbie"], ["name:甘|null-糜|null"]], + dc_ganfuren: ["female", "shu", 3, ["dcshushen", "dcshenzhi"], ["name:甘|null"]], + dc_mifuren: ["female", "shu", 3, ["dcguixiu", "dccunsi"], ["name:糜|null"]], wanglang: ["male", "wei", 3, ["regushe", "rejici"]], ruanji: ["male", "wei", 3, ["dczhaowen", "dcjiudun"]], - wu_zhugeliang: ["male", "shu", "4/7", ["dcjincui", "dcqingshi", "dczhizhe"]], + wu_zhugeliang: ["male", "shu", "4/7", ["dcjincui", "dcqingshi", "dczhizhe"], ['name:诸葛|亮']], duanqiaoxiao: ["female", "wei", 3, ["dccaizhuang", "dchuayi"]], zhangjinyun: ["female", "shu", 3, ["dchuizhi", "dcjijiao"]], huanfan: ["male", "wei", 3, ["dcjianzheng", "dcfumou"]], chentai: ["male", "wei", 4, ["dcctjiuxian", "dcchenyong"]], sunyu: ["male", "wu", 3, ["dcquanshou", "dcshexue"]], xizheng: ["male", "shu", 3, ["dcdanyi", "dcwencan"]], - dc_ruiji: ["female", "wu", 4, ["dcwangyuan", "dclingyin", "dcliying"]], + dc_ruiji: ["female", "wu", 4, ["dcwangyuan", "dclingyin", "dcliying"], ['name:芮|null']], zerong: ["male", "qun", 4, ["dccansi", "dcfozong"]], xielingyu: ["female", "wu", 3, ["dcyuandi", "dcxinyou"]], dc_yangbiao: ["male", "qun", 3, ["dczhaohan", "dcjinjie", "dcjue"]], @@ -65,8 +68,8 @@ const characters = { dc_wangyun: ["male", "qun", 4, ["dclianji", "dcmoucheng"], ["clan:太原王氏"]], dc_zhouxuān: ["male", "wei", 3, ["dcwumei", "dczhanmeng"]], chengbing: ["male", "wu", 3, ["dcjingzao", "dcenyu"]], - dongguiren: ["female", "qun", 3, ["dclianzhi", "dclingfang", "dcfengying"]], - yuanji: ["female", "wu", 3, ["dcfangdu", "dcjiexing"]], + dongguiren: ["female", "qun", 3, ["dclianzhi", "dclingfang", "dcfengying"], ["name:董|null"]], + yuanji: ["female", "wu", 3, ["dcfangdu", "dcjiexing"], ['name:袁|null']], zhujianping: ["male", "qun", 3, ["dcxiangmian", "dctianji"]], zhaozhi: ["male", "shu", 3, ["dctongguan", "dcmengjie"]], dc_liuye: ["male", "wei", 3, ["dcpoyuan", "dchuace"]], diff --git a/character/xianding/dynamicTranslate.js b/character/xianding/dynamicTranslate.js index 8b81687125..5dd6ec90e2 100644 --- a/character/xianding/dynamicTranslate.js +++ b/character/xianding/dynamicTranslate.js @@ -78,7 +78,7 @@ const dynamicTranslates = { }, dcsbyingmou(player) { var storage = player.storage.dcsbyingmou; - var str = "转换技,每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色:"; + var str = "转换技,每回合限一次,你对其他角色使用牌后,你可以选择其中一名目标角色:"; if (!storage) str += ''; str += "阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;"; if (!storage) str += ""; @@ -107,5 +107,16 @@ const dynamicTranslates = { if (storage) str += ""; return str; }, + dcxianmou(player) { + const storage = player.storage.dcxianmou; + var str = "转换技,你失去过牌的回合结束时,你可以:"; + if (!storage) str += ''; + str += "阴,观看牌堆顶五张牌并获得至多X张牌,若未获得X张牌则获得〖遗计〗直到再发动此项;"; + if (!storage) str += ""; + if (storage) str += ''; + str += "阳,观看一名角色手牌并弃置其中至多X张牌,若弃置X张牌则你进行一次【闪电】判定。"; + if (storage) str += ""; + return str+="(X为你本回合失去牌数)"; + }, }; export default dynamicTranslates; diff --git a/character/xianding/index.js b/character/xianding/index.js index b84cab42bd..2e67ed2a80 100644 --- a/character/xianding/index.js +++ b/character/xianding/index.js @@ -23,6 +23,8 @@ game.import("character", function () { dc_sb_simayi: [], dc_sb_zhouyu: [], dc_sb_lusu: [], + dc_sb_jiaxu: [], + dc_sb_guojia: [], }, characterFilter: { ...characterFilters }, characterTitle: { diff --git a/character/xianding/intro.js b/character/xianding/intro.js index 483ce3ee5b..34a7d32b7f 100644 --- a/character/xianding/intro.js +++ b/character/xianding/intro.js @@ -56,6 +56,7 @@ const characterIntro = { huzun: "胡遵(?~256年),安定临泾(今甘肃省镇原县)人,三国时期曹魏大臣,官至卫将军,封阴密侯。出身安定胡氏。历任征东将军、征东大将军、卫将军等职。早年由张既征辟。后追随司马懿,参与平定匈奴胡薄居姿职叛乱、抵御诸葛亮北伐、平定公孙渊叛乱。嘉平四年(252年),作为曹魏三征之一的征东将军,主持征讨东吴,被诸葛恪击败。正元元年(255年)参与平定淮南三叛的第二叛毌丘俭、文钦之乱,事后升任卫将军。甘露元年(256年)秋七月己卯去世,追赠车骑将军。", guanyue: "关樾,传说记载之人物,声称是关羽之孙,关平长子。未见载于正史,仅记载于清朝地方志以及传说。清·《江陵县志》:“娶镇东将军女赵氏。生子樾,世居江陵。”。清·《关氏宗谱·江陵县儒学册结》:“平子樾,因守祖、父陵墓遂家于荆州焉,此荆州之关氏所由来也。”", zhupeilan: "景皇后朱氏(234年―265年),吴郡吴县(今江苏省苏州市)人,吴景帝孙休的皇后,野史记载其名为朱佩兰。骠骑将军朱据与朱公主的独生女,吴末帝孙皓的表姐和叔母。出身江南四大姓之一吴郡朱氏。赤乌末年,与孙休成婚,永安元年(258年),孙休继位,封为夫人,永安五年(262年),被立为皇后。孙休去世后为太后,甘露元年秋(265年)被孙皓逼杀,葬于定陵。", + bianyue: "魏高贵乡公皇后卞氏,琅琊开阳(山东临沂县)人,曹魏高贵乡公曹髦的皇后,魏武帝曹操武宣卞皇后弟弟卞秉的曾孙女。卞皇后祖父为卞兰,卞兰之弟卞琳的女儿又为魏元帝曹奂皇后,故元帝卞皇后是高贵乡公卞皇后的堂姑。《三国志·魏书·三少帝纪第四》:“(正元二年)三月,立皇后卞氏,大赦。夏四月甲寅,封后父卞隆为列侯。”——这是《三国志》对她唯一的记载。", }; export default characterIntro; diff --git a/character/xianding/skill.js b/character/xianding/skill.js index 4f12f0bed3..86fa742ce6 100644 --- a/character/xianding/skill.js +++ b/character/xianding/skill.js @@ -3,6 +3,213 @@ import cards from "../sp2/card.js"; /** @type { importCharacterConfig['skill'] } */ const skills = { + //新谋郭嘉 + dcxianmou: { + mark: true, + marktext: "☯", + zhuanhuanji(player, skill) { + player.storage[skill] = !player.storage[skill]; + player.changeSkin({ characterName: "dc_sb_guojia" }, "dc_sb_guojia" + (player.storage[skill] ? "_shadow" : "")); + }, + intro: { + content: function (storage) { + if (!storage) return "你失去过牌的回合结束时,你可以观看牌堆顶五张牌并获得至多X张牌,若未获得X张牌则获得〖遗计〗直到再发动此项(X为你本回合失去牌数)"; + return "你失去过牌的回合结束时,你可以观看一名角色手牌并弃置其中至多X张牌,若弃置X张牌则你进行一次【闪电】判定(X为你本回合失去牌数)"; + }, + }, + audio: 2, + audioname: ["dc_sb_guojia_shadow"], + trigger: { + global: "phaseEnd", + }, + filter(event, player) { + return player.getHistory("lose", evt => evt.cards2 && evt.cards2.length).length; + }, + async cost(event, trigger, player) { + let num = 0; + player.getHistory("lose", evt => { + if (evt.cards2) num += evt.cards2.length; + }); + if (player.storage.dcxianmou) { + event.result = await player.chooseTarget(get.prompt("dcxianmou"), `观看一名角色手牌并弃置其中至多${num}张牌`, function (card, player, target) { + return target.countCards("h"); + }).set("ai", function (target) { + const player = _status.event.player; + return get.effect(target, { name: "guohe_copy2" }, player, player); + }).forResult(); + } + else { + event.result = await player.chooseBool(get.prompt("dcxianmou"), `观看牌堆顶五张牌并获得至多${num}张牌`).forResult(); + } + }, + async content(event, trigger, player) { + let num = 0; + player.getHistory("lose", evt => { + if (evt.cards2) num += evt.cards2.length; + }); + player.changeZhuanhuanji("dcxianmou"); + if (player.storage.dcxianmou) { + player.addAdditionalSkills("dcxianmou", []); + let cards = game.cardsGotoOrdering(get.cards(5)).cards; + const result = await player.chooseButton([`是否获得至多${num}张牌?`, cards], [1, num]).set("ai", function (button) { + if (ui.selected.buttons.length + 1 >= _status.event.maxNum) return 0; + return get.value(button.link); + }).set("maxNum", num).forResult(); + if (result.bool) await player.gain(result.links, "gain2"); + if (!result.bool || result.links.length < num) await player.addAdditionalSkills("dcxianmou", "new_reyiji"); + } + else { + const target = event.targets[0]; + const result = await player.discardPlayerCard(target, "h", `是否弃置${get.translation(target)}至多${num}张牌?`, [1, num], "visible").set("ai", function (button) { + if (ui.selected.buttons.length + 1 >= _status.event.maxNum) return 5 - get.value(button.link); + return get.value(button.link); + }).set("maxNum", num).forResult(); + if (result.bool && result.links.length >= num) await player.executeDelayCardEffect("shandian"); + } + }, + derivation: "new_reyiji", + group: "dcxianmou_change", + subSkill: { + change: { + audio: "dcxianmou", + audioname: ["dc_sb_guojia_shadow"], + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + prompt2(event, player) { + //无名杀先阳后阴,不要问为什么 + return "切换【先谋】为状态" + (player.storage.dcsbyingmou ? "阳" : "阴"); + }, + check: () => Math.random() > 0.5, + content() { + player.changeZhuanhuanji("dcxianmou"); + }, + }, + }, + }, + dclunshi: { + audio: 2, + position: "hs", + enable: "chooseToUse", + filter(event, player) { + if (!player.countCards("hs")) return false; + if (player.countCards("h", { color: "black" }) != player.countCards("h", { color: "red" })) return false; + if (event.type != "wuxie") return false; + let info = event.info_map; + if (!info || get.type(info.card) != "trick") return false; + return info.player != info.target; + }, + filterCard: true, + viewAs: { + name: "wuxie", + }, + viewAsFilter(player) { + if (!player.countCards("hs")) return false; + if (player.countCards("h", { color: "black" }) != player.countCards("h", { color: "red" })) return false; + return true; + }, + prompt: "将一张手牌当无懈可击使用", + check: function (card) { + return 8 - get.value(card); + }, + group: "dclunshi_nowuxie", + subSkill: { + nowuxie: { + trigger: { + player: "useCard", + }, + forced: true, + locked: false, + popup: false, + filter: function (event, player) { + return event.card.name == "wuxie" && event.skill && event.skill == "dclunshi"; + }, + content: function () { + trigger.directHit.addArray(game.players); + }, + }, + }, + }, + //卞玥 + dcbizu: { + audio: 2, + enable: "phaseUse", + filterTarget(card, player, target) { + return target.countCards("h") == player.countCards("h"); + }, + filterCard: () => false, + selectCard: [-1, -2], + prompt: () => { + const player = get.player(); + const targets = game.filterPlayer(current => current.countCards("h") == player.countCards("h")); + return "令" + get.translation(targets) + (targets.length > 1 ? "各" : "") + "摸一张牌"; + }, + selectTarget: -1, + multitarget: true, + multiline: true, + async content(event, trigger, player) { + await game.asyncDraw(event.targets.sortBySeat()); + if (game.getGlobalHistory("everything", evt => evt.name == "dcbizu" && evt.player == player && evt != event).some(evtx => evtx.targets.length == event.targets.length && evtx.targets.every(i => event.targets.includes(i)))) player.tempBanSkill("dcbizu"); + }, + ai: { + order: 4, + result: { + player(player, target) { + return game.filterPlayer(current => current.countCards("h") == player.countCards("h")).reduce((e, p) => e + get.effect(p, { name: "draw" }, player, player), 0); + }, + }, + }, + }, + dcwuxie: { + audio: 2, + trigger: { + player: "gainAfter", + global: "loseAsyncAfter", + }, + filter(event, player) { + const cards = event.getg(player).filter(i => get.owner(i) == player && get.position(i) == "h" && get.tag(i, "damage")); + return cards.length; + }, + usable: 1, + async cost(event, trigger, player) { + const cards = trigger.getg(player).filter(i => get.owner(i) == player && get.position(i) == "h" && get.tag(i, "damage")); + event.result = await player + .chooseCardTarget({ + prompt: get.prompt("dcwuxie"), + prompt2: "将获得的任意张伤害牌置于牌堆底并令一名其他角色弃置等量的牌", + filterTarget: lib.filter.notMe, + filterCard: card => get.event().cards.includes(card), + cards: cards, + selectCard: [1, cards.length], + ai1(card) { + return 3 / (Math.abs(get.value(card)) + 0.1); + }, + ai2(target) { + const player = get.player(); + return get.effect(target, { name: "guohe_copy2" }, player, player) * ui.selected.cards.length; + }, + }) + .set("cards", cards) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0], + cards = event.cards, + num = cards.length; + await player.lose(cards, ui.cardPile); + for (let i = 0; i < cards.length; i++) { + const card = cards[i]; + card.fix(); + ui.cardPile.appendChild(card); + } + await game.asyncDelayx(); + if (target.countCards("he")) await target.chooseToDiscard(num, "he", true); + }, + }, //朱佩兰 dccilv: { audio: 2, @@ -241,7 +448,7 @@ const skills = { selectCard: [1, Infinity], position: "h", filterTarget: lib.filter.notMe, - prompt: "豪意:请选择要分配的卡牌和目标", + prompt: "豪义:请选择要分配的卡牌和目标", ai1(card) { return !ui.selected.cards.length && card.name == "du" ? 1 : 0; }, @@ -392,7 +599,7 @@ const skills = { }; if (event.isMine()) func(); else if (event.isOnline()) event.player.send(func); - let types = trigger.cards.reduce((list, card) => list.add(get.type(card, player)), []); + let types = trigger.cards.reduce((list, card) => list.add(get.type2(card, player)), []); let result = await player .chooseButton(["武威:请选择" + get.cnNumber(types.length) + "次以下项", [["摸一张牌", "令目标角色本回合非锁定技失效", "令本回合〖武威〗可发动次数+1"].map((item, i) => [i, item]), "textbutton"]]) .set("forced", true) @@ -515,7 +722,7 @@ const skills = { .map((_, i) => i + 1) .reduce((sum, i) => sum + target.countEmptySlot(i), 0) ); - if (player.countMark("dcsbfengmin") > player.maxHp) { + if (player.countMark("dcsbfengmin") > player.getDamagedHp()) { player.tempBanSkill("dcsbfengmin"); } }, @@ -585,6 +792,87 @@ const skills = { }, }, }, + //典韦 + dcsbkuangzhan:{ + audio: 2, + enable:"phaseUse", + usable:1, + filter(event,player){ + return player.countCards('h'){ + if(evt.getParent(event.name)==event) num+=evt.cards.length; + }); + while(num>0&&player.countCards('h')){ + num--; + if(!game.hasPlayer(current=>player.canCompare(current))) break; + const result=await player.chooseTarget('狂战:与一名角色拼点',true,function(card,player,target){ + return target!=player&&player.canCompare(target); + }).set('ai',function(target){ + const player=get.player(); + if(target.countCards('h')>=player.countCards('h')) return 0; + return get.effect(target,{name:'sha'},player,player)+1; + }).forResult(); + const target=result.targets[0]; + const compare=await player.chooseToCompare(target).forResult(); + if(!player.storage[event.name]){ + player.storage[event.name]=[]; + player.when({global:"phaseEnd"}).then(()=>{ + delete player.storage.dcsbkuangzhan; + }); + } + if(compare.bool){ + player.storage[event.name].add(target); + let card={name:'sha',isCard:true}; + let targets=player.storage[event.name].filter(current=>current!=player&&player.canUse(card,current,false)); + await player.useCard(card,targets,false); + } + else{ + player.storage[event.name].add(player); + let card={name:'sha',isCard:true}; + if(target.canUse(card,player,false)) await target.useCard(card,player,false); + } + } + }, + ai:{ + order:1, + result:{ + player(player,target){ + let num=player.maxHp-player.countCards('h'); + for(let i of game.players){ + if(get.attitude(player,i)<=0) num-=i.countCards('h'); + } + if(num<=0) return 1; + return 0; + }, + }, + }, + }, + dcsbkangyong:{ + audio: 2, + trigger:{ + player:["phaseBegin","phaseEnd"], + }, + filter(event,player,name){ + if(name=="phaseBegin") return player.isDamaged(); + return event.kangyongRecover&&player.hp>1; + }, + forced:true, + async content(event,trigger,player){ + if(event.triggername=="phaseBegin"){ + const num=player.maxHp-player.hp; + await player.recover(num) + trigger.kangyongRecover=num; + } + else{ + const num=Math.min(player.hp-1,trigger.kangyongRecover); + if(num>0) await player.loseHp(num); + } + }, + }, //诸葛瑾 dcsbtaozhou: { audio: 2, @@ -606,7 +894,8 @@ const skills = { return list; }, check() { - const event = get.event(), player = get.player(); + const event = get.event(), + player = get.player(); if ( game.hasPlayer(current => { return current !== player && get.attitude(player, current) < 0; @@ -636,7 +925,7 @@ const skills = { .chooseToGive(`${get.translation(player)}对你发动了【讨州】`, "你可以交给其至多三张手牌", [1, 3], player) .set("ai", card => { if (get.event("att") > 0) { - if (get.event("chosenNumber") < ui.selected.cards.length + (get.event("getRand")() < 0.5)) { + if (get.event("chosenNumber") < ui.selected.cards.length + (get.event().getRand() < 0.5)) { return 5.1 - get.value(card); } return 0; @@ -700,7 +989,7 @@ const skills = { async content(event, trigger, player) { trigger.num++; player.removeMark("dcsbtaozhou_debuff", 1, false); - if (!player.countMark("dcsbtaozhou_debuff")){ + if (!player.countMark("dcsbtaozhou_debuff")) { player.removeSkill("dcsbtaozhou_debuff"); } }, @@ -976,7 +1265,10 @@ const skills = { } } }, - zhuanhuanji: true, + zhuanhuanji(player, skill) { + player.storage[skill] = !player.storage[skill]; + player.changeSkin({ characterName: "dc_sb_jiaxu" }, "dc_sb_jiaxu" + (player.storage[skill] ? "_shadow" : "")); + }, marktext: "☯", mark: true, intro: { @@ -1016,7 +1308,6 @@ const skills = { check: () => Math.random() > 0.5, content() { player.changeZhuanhuanji("dcsbfumou"); - //player.changeSkin("dcsbfumou", "dc_sb_jiaxu" + (player.storage.dcsbfumou ? "_shadow" : "")); }, }, }, @@ -2003,7 +2294,10 @@ const skills = { dcsbquanmou: { audio: 2, audioname: ["dc_sb_simayi_shadow"], - zhuanhuanji: true, + zhuanhuanji(player, skill) { + player.storage[skill] = !player.storage[skill]; + player.changeSkin({ characterName: "dc_sb_simayi" }, "dc_sb_simayi" + (player.storage[skill] ? "_shadow" : "")); + }, marktext: "☯", enable: "phaseUse", filter(event, player) { @@ -2023,7 +2317,6 @@ const skills = { async content(event, trigger, player) { const target = event.targets[0]; player.changeZhuanhuanji("dcsbquanmou"); - player.changeSkin("dcsbquanmou", "dc_sb_simayi" + (player.storage.dcsbquanmou ? "_shadow" : "")); player.markAuto("dcsbquanmou_selected", [target]); const cards = await target.chooseCard("he", true, `选择交给${get.translation(player)}一张牌`).forResultCards(); if (cards && cards.length) { @@ -2075,7 +2368,6 @@ const skills = { check: () => Math.random() > 0.5, content() { player.changeZhuanhuanji("dcsbquanmou"); - player.changeSkin("dcsbquanmou", "dc_sb_simayi" + (player.storage.dcsbquanmou ? "_shadow" : "")); }, }, true: { @@ -2334,13 +2626,8 @@ const skills = { return get.distance(player, target) <= 1 && target.countGainableCards(player, "e"); }) .set("ai", target => { - const player = get.event("player"), - att = get.attitude(player, target); - let num = 0; - if (target.hasSkill("gzxiaoji")) num += 2.5; - if (target.isDamaged() && target.getEquip("baiyin")) num += 2.5; - if (target.hasSkill("xuanlve")) num += 2; - return get.sgn(att) * num + (target == player ? 1 : 0); + const player = get.event("player"); + return get.effect(target, { name: "shunshou_copy", position: "e" }, player, player); }); if (bool) { const aim = targets[0]; @@ -2636,7 +2923,7 @@ const skills = { order: 7, result: { target(player, target) { - return target.countCards("h") < player.countCards("h") ? get.attitude(player, target) : -get.effect(target, { name: "guohe" }, player, player); + return target.countCards("h") < player.countCards("h") ? get.effect(target, { name: "draw" }, player, target) : get.effect(target, { name: "guohe" }, player, target); }, }, }, @@ -3212,18 +3499,21 @@ const skills = { dcsbyingmou: { mark: true, marktext: "☯", - zhuanhuanji: true, + zhuanhuanji(player, skill) { + player.storage[skill] = !player.storage[skill]; + player.changeSkin({ characterName: "dc_sb_zhouyu" }, "dc_sb_zhouyu" + (player.storage[skill] ? "_shadow" : "")); + }, intro: { content: function (storage) { - if (!storage) return "每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】。"; - return "每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。"; + if (!storage) return "每回合限一次,当你对其他角色使用牌后,你可以选择其中一名目标角色,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】。"; + return "每回合限一次,当你对其他角色使用牌后,你可以选择其中一名目标角色,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。"; }, }, audio: 2, audioname: ["dc_sb_zhouyu_shadow"], - trigger: { player: "useCardToPlayered" }, + trigger: { player: "useCardAfter" }, filter: function (event, player) { - return event.isFirstTarget && event.targets.some(target => target != player); + return event.targets.some(target => target != player); }, usable: 1, direct: true, @@ -3281,7 +3571,6 @@ const skills = { yield player.logSkill("dcsbyingmou", result.targets, false); player.line2(result.targets); player.changeZhuanhuanji("dcsbyingmou"); - player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : "")); var source = result.targets[1], discard = true; while (true) { @@ -3298,7 +3587,6 @@ const skills = { } else { yield player.logSkill("dcsbyingmou", target); player.changeZhuanhuanji("dcsbyingmou"); - player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : "")); if (player.countCards("h") < target.countCards("h")) player.draw(Math.min(5, target.countCards("h") - player.countCards("h"))); if (player.canUse({ name: "huogong" }, target, false)) player.useCard({ name: "huogong" }, target, false); } @@ -3323,7 +3611,6 @@ const skills = { check: () => Math.random() > 0.5, content() { player.changeZhuanhuanji("dcsbyingmou"); - player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : "")); }, }, }, @@ -3393,7 +3680,10 @@ const skills = { dcsbmengmou: { mark: true, marktext: "☯", - zhuanhuanji: true, + zhuanhuanji(player, skill) { + player.storage[skill] = !player.storage[skill]; + player.changeSkin({ characterName: "dc_sb_lusu" }, "dc_sb_lusu" + (player.storage[skill] ? "_shadow" : "")); + }, intro: { content: function (storage) { if (!storage) return "每回合限一次,当你得到其他角色的牌后,或其他角色得到你的牌后,你可以令该角色使用至多X张【杀】,且其每以此法造成1点伤害,其回复1点体力。(X为你的体力上限)"; @@ -3504,7 +3794,6 @@ const skills = { yield player.logSkill("dcsbmengmou", target); player.addTempSkill("dcsbmengmou_" + (storage || false)); player.changeZhuanhuanji("dcsbmengmou"); - player.changeSkin("dcsbmengmou", "dc_sb_lusu" + (player.storage.dcsbmengmou ? "_shadow" : "")); while (num > 0) { num--; var result2; @@ -3572,7 +3861,6 @@ const skills = { check: () => Math.random() > 0.5, content() { player.changeZhuanhuanji("dcsbmengmou"); - player.changeSkin("dcsbmengmou", "dc_sb_lusu" + (player.storage.dcsbmengmou ? "_shadow" : "")); }, }, }, @@ -4706,7 +4994,7 @@ const skills = { (function () { var cards = player.getCards("hs", card => get.name(card, player) !== "sha" && player.hasValueTarget(card)); var damage = Math.min(player.getCardUsable({ name: "sha" }), player.countCards("hs", "sha")) + cards.filter(i => get.tag(i, "damage")).length; - if (player.isPhaseUsing() || player.hp + player.hujia + player.countCards("hs", i => get.tag(card, "recover")) > 2) { + if (player.isPhaseUsing() || player.hp + player.hujia + player.countCards("hs", card => get.tag(card, "recover")) > 2) { if (damage) return Math.min(choices.length - 1, cards.length - damage); return Math.min(choices.length - 1, cards.length - 1); } @@ -6167,9 +6455,12 @@ const skills = { characters.remove("dc_mifuren"); } }); - return characters.length && [player.name1, player.name2].some(name => { - return get.character(name, 3).includes("dcxunbie"); - }); + return ( + characters.length && + [player.name1, player.name2].some(name => { + return get.character(name, 3).includes("dcxunbie"); + }) + ); }, check: () => true, skillAnimation: true, @@ -6200,12 +6491,10 @@ const skills = { if (!_status.characterlist) { lib.skill.pingjian.initList(); } - player.reinitCharacter((get.character(player.name2, 3).includes("dcxunbie") ? - player.name2 : player.name1 - ), character); + player.reinitCharacter(get.character(player.name2, 3).includes("dcxunbie") ? player.name2 : player.name1, character); "step 2"; player.recover(1 - player.hp); - player.addTempSkill("dcxunbie_muteki", { player: "phaseAfter" }); + player.addTempSkill("dcxunbie_muteki"); }, subSkill: { muteki: { @@ -6218,7 +6507,7 @@ const skills = { trigger.cancel(); }, mark: true, - intro: { content: "防止受到的所有伤害直到我的回合结束" }, + intro: { content: "防止受到的所有伤害直到本回合结束" }, ai: { nofire: true, nothunder: true, @@ -7287,8 +7576,8 @@ const skills = { } if (!cards.length) break; } - if (bool) return gains.some(card => get.type2(card, false) == "trick"); - return gains.filter(card => get.type2(card, false) == "trick"); + if (bool) return gains.some(card => get.type(card) == "trick"); + return gains.filter(card => get.type(card) == "trick"); }, isUse: function (event, player) { if (event.name != "cardsDiscard") return event.type == "discard" && event.player == player; @@ -9456,7 +9745,8 @@ const skills = { current.getStat().isSkipped = true; }); var evt = player.insertPhase(); - delete evt.skill; + if (trigger.skill) evt.skill = trigger.skill; + else delete evt.skill; game.broadcastAll(function (player) { player.classList.remove("glow_phase"); delete _status.currentPhase; @@ -11413,10 +11703,7 @@ const skills = { filter: function (event, player) { var storage1 = event.player.getStorage("dcfudao_deadmark"), storage2 = player.getStorage("dcfudao_effect"); - for (var i of storage1) { - if (storage2.includes(i)) return true; - } - return false; + return storage1.some(i => storage2.includes(i)) && get.color(event.card) == "black"; }, content: function () { trigger.player.addTempSkill("dcfudao_blocker"); @@ -13270,7 +13557,6 @@ const skills = { shawu: { audio: 2, trigger: { player: "useCardToTargeted" }, - shaRelated: true, direct: true, filter: function (event, player) { return ( @@ -15940,7 +16226,7 @@ const skills = { audio: 2, trigger: { player: "shiyuanBegin" }, filter: function (event, player) { - return _status.currentPhase.group == "qun"; + return _status.currentPhase && _status.currentPhase.group == "qun"; }, zhuSkill: true, forced: true, @@ -17590,7 +17876,7 @@ const skills = { }, }, mingjie: { - audio: 1, + audio: 2, trigger: { player: "phaseJieshuBegin" }, check: function () { return ui.cardPile.hasChildNodes() && get.color(ui.cardPile.firstChild) != "black"; diff --git a/character/xianding/sort.js b/character/xianding/sort.js index 3b6a9394d7..825bad827a 100644 --- a/character/xianding/sort.js +++ b/character/xianding/sort.js @@ -2,7 +2,7 @@ const characterSort = { sp2_huben: ["chendong", "wangshuang", "wenyang", "re_liuzan", "dc_huangzu", "wulan", "leitong", "chentai", "dc_duyu", "dc_wangjun", "dc_xiahouba", "old_huangfusong", "huzun"], sp2_shengun: ["puyuan", "guanlu", "gexuan", "wufan", "re_zhangbao", "dukui", "zhaozhi", "zhujianping", "dc_zhouxuān", "zerong"], sp2_bizhe: ["dc_luotong", "dc_wangchang", "chengbing", "dc_yangbiao", "ruanji", "cuimao"], - sp2_huangjia: ["caomao", "liubian", "dc_liuyu", "quanhuijie", "dingshangwan", "yuanji", "xielingyu", "sunyu", "ganfurenmifuren", "dc_ganfuren", "dc_mifuren", "dc_shixie", "caofang", "zhupeilan"], + sp2_huangjia: ["caomao", "liubian", "dc_liuyu", "quanhuijie", "dingshangwan", "yuanji", "xielingyu", "sunyu", "ganfurenmifuren", "dc_ganfuren", "dc_mifuren", "dc_shixie", "caofang", "zhupeilan", "bianyue"], sp2_zhangtai: ["guozhao", "fanyufeng", "ruanyu", "yangwan", "re_panshu"], sp2_jinse: ["caojinyu", "re_sunyi", "re_fengfangnv", "caohua", "laiyinger", "zhangfen", "zhugeruoxue", "caoxian", "dc_qinghegongzhu", "zhugemengxue"], sp2_yinyu: ["zhouyi", "luyi", "sunlingluan", "caoyi"], @@ -13,10 +13,10 @@ const characterSort = { sp2_qifu: ["dc_guansuo", "xin_baosanniang", "dc_zhaoxiang"], sp2_gaoshan: ["wanglang", "liuhui", "zhangjian"], sp2_wumiao: ["wu_zhugeliang", "wu_luxun", "wu_guanyu"], - sp2_mouding: ["dc_sb_jiaxu", "dc_sb_lusu", "dc_sb_zhouyu", "dc_sb_simayi"], + sp2_mouding: ["dc_sb_jiaxu", "dc_sb_lusu", "dc_sb_zhouyu", "dc_sb_simayi", "dc_sb_guojia"], sp2_zhonghu: ["dc_jiangji", "dc_wangling", "dc_simashi", "dc_caoshuang"], sp2_zijing: ["dc_sb_zhugejin", "dc_sb_guanping"], - sp2_dushi: ["dc_sb_caoang", "dc_sb_zhangxiu"], + sp2_dushi: ["dc_sb_caoang", "dc_sb_zhangxiu", "dc_sb_dianwei"], sp2_waitingforsort: [], }; diff --git a/character/xianding/translate.js b/character/xianding/translate.js index 421fbbce0e..0bce5adbfe 100644 --- a/character/xianding/translate.js +++ b/character/xianding/translate.js @@ -181,7 +181,7 @@ const translates = { shawu_info: "当你使用【杀】指定目标后,你可选择一项:⒈弃置两张手牌;⒉移去一枚“沙”并摸两张牌。然后你对目标角色造成1点伤害。", dc_huangzu: "黄祖", dcjinggong: "精弓", - dcjinggong_info: "你可以将一张装备牌当做无距离限制的【杀】使用。当你声明使用此【杀】后,你将此杀的伤害值基数改为X(X为你至此【杀】第一个目标角色的距离且至多为5)。", + dcjinggong_info: "你可以将一张装备牌当做无距离限制的【杀】使用。当你声明使用此【杀】后,你将此【杀】的伤害值基数改为X(X为你至此【杀】第一个目标角色的距离且至多为5)。", dcxiaojuan: "骁隽", dcxiaojuan_info: "当你使用牌指定其他角色为唯一目标后,你可以弃置其一半的手牌(向下取整)。若这些牌中有与你使用牌花色相同的牌,则你弃置一张手牌。", dc_liuyu: "新杀刘虞", @@ -243,7 +243,7 @@ const translates = { dcfengyan: "讽言", dcfengyan_info: "出牌阶段每项各限一次。你可以:⒈令一名体力值不大于你的其他角色交给你一张手牌。⒉视为对一名手牌数不大于你的角色使用一张【杀】(无距离和次数限制)。", dcfudao: "抚悼", - dcfudao_info: "游戏开始时,你选择一名其他角色,称为“继子”角色。当你或“继子”每回合首次使用牌指定对方为目标后,你与其各摸两张牌。当有角色杀死你或“继子”后,该角色称为“决裂”角色。当你或“继子”对“决裂”造成伤害时,此伤害+1。当你成为“决裂”角色使用牌的目标后,其本回合内不能再使用牌。", + dcfudao_info: "游戏开始时,你选择一名其他角色,称为“继子”角色。当你或“继子”每回合首次使用牌指定对方为目标后,你与其各摸两张牌。当有角色杀死你或“继子”后,该角色称为“决裂”角色。当你或“继子”对“决裂”造成伤害时,此伤害+1。当你成为“决裂”角色使用的黑色牌的目标后,其本回合内不能再使用牌。", luyi: "卢弈", dcyaoyi: "邀弈", dcyaoyi_info: "锁定技。①游戏开始时,你令所有存活且未拥有转换技的角色获得〖手谈〗。②你发动〖手谈〗时无需弃置牌,且无次数限制。③所有拥有转换技的角色不能使用牌指定其他拥有转换技且双方所有转换技状态均相同的角色为目标。", @@ -405,7 +405,7 @@ const translates = { dcchanjuan: "婵娟", dcchanjuan_info: "每种牌名限两次。当你使用手牌中仅指定单一目标的【杀】或普通锦囊牌结算结束后,你可以视为使用一张名称和属性均相同的牌。若这两张牌指定的目标完全相同,你摸一张牌。", dcxunbie: "殉别", - dcxunbie_info: "限定技。当你进入濒死状态时,你可以将此武将牌替换为“甘夫人”或“糜夫人”(不能选择已在场上的武将)。然后回复至1点体力并防止所有伤害直到你的下一个回合结束。", + dcxunbie_info: "限定技。当你进入濒死状态时,你可以将此武将牌替换为“甘夫人”或“糜夫人”(不能选择已在场上的武将)。然后回复至1点体力并防止所有伤害直到本回合结束。", dc_mifuren: "糜夫人", dcguixiu: "闺秀", dcguixiu_info: "锁定技。①回合开始时,若你于本局游戏未发动过〖闺秀①〗,你摸两张牌。②当你发动〖存嗣〗后,你回复1点体力。", @@ -511,7 +511,7 @@ const translates = { dcsbronghuo: "融火", dcsbronghuo_info: "锁定技,当你使用火【杀】或【火攻】时,此牌伤害基值改为场上势力数。", dcsbyingmou: "英谋", - dcsbyingmou_info: "转换技,每回合限一次,当你使用牌指定其他角色为目标后,你可以选择一名目标角色:阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。", + dcsbyingmou_info: "转换技,每回合限一次,当你对其他角色使用牌后,你可以选择其中一名目标角色:阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。", caoxian: "曹宪", dclingxi: "灵犀", dclingxi_info: "出牌阶段开始和结束时,你可以将至多X张牌称为“翼”置于你的武将牌上(X为你的体力上限)。当你失去武将牌上的“翼”时,你将手牌数调整至Y张(Y为你武将牌上的“翼”所含有的花色数的两倍)。", @@ -618,9 +618,15 @@ const translates = { dc_sb_caoang: "新杀谋曹昂", dc_sb_caoang_prefix: "新杀谋", dcsbfengmin: "丰愍", - dcsbfengmin_info: "锁定技,一名角色于其回合内失去装备区的牌后,你摸等同于其装备区空缺装备栏数的牌,然后若你发动〖丰愍〗的次数大于你的体力上限,〖丰愍〗于本回合失效。", + dcsbfengmin_info: "锁定技,一名角色于其回合内失去装备区的牌后,你摸等同于其装备区空缺装备栏数的牌,然后若你发动〖丰愍〗的次数大于你的已损失体力值,〖丰愍〗于本回合失效。", dcsbzhiwang: "质亡", dcsbzhiwang_info: "每回合限一次,当你因受到牌造成的伤害进入濒死状态时,你可以将此伤害改为无来源并选择一名其他角色,其于本回合结束时可以使用本回合令你进入濒死状态的牌。", + dc_sb_dianwei: "新杀谋典韦", + dc_sb_dianwei_prefix: "新杀谋", + dcsbkuangzhan:"狂战", + dcsbkuangzhan_info:"出牌阶段限一次,你可以将手牌摸至体力上限并进行X次拼点。若你赢,你视为对所有本回合拼点未赢的其他角色使用一张【杀】;若你未赢,视为其对你使用一张【杀】。(X为你以此法获得的牌数)", + dcsbkangyong:"亢勇", + dcsbkangyong_info:"锁定技,回合开始时,你回满体力;回合结束时,你失去等量体力(至少保留1点)。", dc_sb_guanping: "新杀谋关平", dc_sb_guanping_prefix: "新杀谋", dcsbwuwei: "武威", @@ -629,13 +635,24 @@ const translates = { dc_sb_zhangxiu_prefix: "新杀谋", dcsbfuxi: "附袭", dcsbfuxi_info: "其他角色的出牌阶段开始时,若其手牌数为全场最多,则你可以选择一项:①交给其一张牌,然后摸两张牌;②弃置其一张牌,然后视为对其使用一张【杀】。", - dcsbhaoyi: "豪意", + dcsbhaoyi: "豪义", dcsbhaoyi_info: "结束阶段,你可以获得本回合进入弃牌堆的所有未造成过伤害的伤害牌,然后你可以将这些牌任意分配给其他角色。", zhupeilan: "朱佩兰", dccilv: "辞虑", dccilv_info: "当你成为普通锦囊牌的目标后,你可以摸剩余选项数的牌,然后若你的手牌数大于你的体力上限,则你选择执行并移去一项:①令此牌对你无效;②防止此牌对你造成的伤害;③于此牌结算完毕后获得此牌对应的所有实体牌。", dctongdao: "痛悼", dctongdao_info: "限定技,当你进入濒死状态时,你可以选择一名角色,令其将其拥有的技能重置至游戏开始时的状态,然后若其不为你,则你将体力值回复至与其相同。", + bianyue: "卞玥", + dcbizu: "庇族", + dcbizu_info: "出牌阶段,你可以令所有手牌数与你相同的角色摸一张牌。然后若这些角色与本回合此前某次发动〖庇族〗的目标角色均相同,本回合〖庇族〗失效。", + dcwuxie: "无胁", + dcwuxie_info: "每回合限一次,当你获得牌后,你可以将其中任意张伤害牌置于牌堆底并令一名其他角色弃置等量张牌。", + dc_sb_guojia: "新杀谋郭嘉", + dc_sb_guojia_prefix: "新杀谋", + dcxianmou: "先谋", + dcxianmou_info: "转换技,你失去过牌的回合结束时,你可以:阴,观看牌堆顶五张牌并获得至多X张牌,若未获得X张牌则获得〖遗计〗直到再发动此项;阳,观看一名角色手牌并弃置其中至多X张牌,若弃置X张牌则你进行一次【闪电】判定。(X为你本回合失去牌数)", + dclunshi: "论势", + dclunshi_info: "一名角色对其以外的角色使用普通锦囊牌的结算中,若你手牌中两张颜色的牌数量相同,你可将一张手牌当作不可被响应的【无懈可击】使用。", }; export default translates; diff --git a/character/xianding/voices.js b/character/xianding/voices.js index 15900f3c62..12003108b8 100644 --- a/character/xianding/voices.js +++ b/character/xianding/voices.js @@ -1,4 +1,16 @@ export default { + "#dcsbsushen1": "谋先于行则昌,行先于谋则亡。", + "#dcsbsushen2": "天行五色,雪覆林间睡狐,独我执白。", + "#dcsbfumou1": "恩仇付浊酒,荡平劫波,且做英雄吼。", + "#dcsbfumou2": "人无恒敌,亦无恒友,唯有恒利。", + "#dcsbrushi1": "孤立川上,观逝者如东去之流水。", + "#dcsbrushi2": "九州如画,怎可空老人间?", + "#dc_sb_jiaxu:die": "辛者抱薪,妄燃烽火以戏诸侯……", + "#dcsbfuxi1": "可因势而附,亦可因势而袭。", + "#dcsbfuxi2": "仗剑在手,或亮之,或藏之。", + "#dcsbhaoyi1": "今缴丧敌之炙,且宴麾下袍泽。", + "#dcsbhaoyi2": "龙骧枯荣一体,岂曰同袍无衣。", + "#dc_sb_zhangxiu:die": "曹贼欺我太甚!", "#dctongdao1": "安定宫无一丈之长,恐难七步成诗。", "#dctongdao2": "故峻恶,皓恶甚于峻。", "#dccilv1": "妾一介女流,安知社稷之虑。", @@ -441,6 +453,7 @@ export default { "#busuan1": "喜仰视星辰,夜不肯寐。", "#busuan2": "今日一卦,便知命数。", "#mingjie1": "戒律循规,不可妄贪。", + "#mingjie2": "王道文明,何忧不平。", "#guanlu:die": "怀我好英,心非草木……", "#gxlianhua1": "草木精炼,万物化丹。", "#gxlianhua2": "白日青山,飞升化仙。", @@ -453,20 +466,8 @@ export default { "#wlcuorui1": "减辎疾行,挫敌军锐气。", "#wlcuorui2": "外物当舍,摄敌为重。", "#wulan:die": "蛮狗,尔敢杀我!", - "#tiaoxin_xiahouba1": "跪下受降,饶你不死!", - "#tiaoxin_xiahouba2": "黄口小儿,可听过将军名号?", - "#paoxiao_xiahouba1": "喝啊!", - "#paoxiao_xiahouba2": "受死吧!", - "#shensu1_xiahouba1": "冲杀敌阵,来去如电!", - "#shensu1_xiahouba2": "今日有恙在身,须得速战速决!", - "#tianxiang_daxiaoqiao1": "哼,我才不怕你呢~", - "#tianxiang_daxiaoqiao2": "替我挡着吧~", - "#liuli_daxiaoqiao1": "不懂得怜香惜玉么~", - "#liuli_daxiaoqiao2": "交给你了。", "#yongjue1": "扶幼主,成霸业!", "#yongjue2": "能救一个是一个!", - "#jingong1": "若无老夫之谋,尔等皆化为腐土也。", - "#jingong2": "董贼旧部,可尽诛之!", "#dcshouze": "白绫加之我颈,其罪何患无辞。", "#dczimu1": "既为汉吏,当遵汉律。", "#refenyin_wufan1": "奋音鼓劲,片甲不留!", diff --git a/character/xianjian.js b/character/xianjian.js index 864d78529a..29b32da9f7 100644 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -18,7 +18,7 @@ game.import("character", function () { pal_zixuan: ["female", "wei", 3, ["shuiyun", "wangyou", "changnian"]], pal_changqing: ["male", "wei", 4, ["luanjian", "ctianfu"]], - pal_nangonghuang: ["male", "wei", 3, ["zhaoyao", "sheling", "zhangmu"]], + pal_nangonghuang: ["male", "wei", 3, ["zhaoyao", "sheling", "zhangmu"], ["name:南宫|煌"]], pal_wenhui: ["female", "shu", 4, ["huxi", "longxiang"]], pal_wangpengxu: ["female", "shu", 3, ["duxinshu", "feixu"]], pal_xingxuan: ["male", "wei", 3, ["feizhua", "leiyu", "lingxue"]], @@ -27,7 +27,7 @@ game.import("character", function () { pal_yuntianhe: ["male", "wu", 4, ["longxi", "zhuyue", "guanri"]], pal_hanlingsha: ["female", "shu", 3, ["tannang", "tuoqiao"]], pal_liumengli: ["female", "wei", 3, ["tianxian", "runxin", "xjzhimeng"]], - pal_murongziying: ["male", "wei", 4, ["xuanning", "poyun", "qianfang"]], + pal_murongziying: ["male", "wei", 4, ["xuanning", "poyun", "qianfang"], ["name:慕容|紫英"]], pal_xuanxiao: ["male", "wei", 4, ["xuanyan", "ningbin", "xfenxin"]], pal_jiangyunfan: ["male", "wei", 4, ["xunying", "liefeng"]], @@ -4404,7 +4404,7 @@ game.import("character", function () { qiongguang_info: "弃牌阶段结束时,若你弃置了至少两张牌,你可以对所有敌方角色施加一个随机的负面效果。", xunying: "迅影", - xunying_info: "每当你使用杀对一名目标结算完毕后,你可以继续对目标使用杀。", + xunying_info: "每当你使用【杀】对一名目标结算完毕后,你可以继续对目标使用【杀】。", liefeng: "冽风", liefeng_info: "锁定技,当你在回合内使用第二张牌时,你本回合获得【炎斩】;当你在回合内使用第三张牌时,你本回合获得【天剑】;当你在回合内使用第四张牌时,你本回合获得【御风】。", @@ -4417,7 +4417,7 @@ game.import("character", function () { "出牌阶段,你可以弃置一张本回合与此法弃置的牌花色均不同的手牌,然后选择一名与你距离为X的角色与其各摸一张牌,X为本回合发动灵笛的次数(含此次)。", xiaoyue: "啸月", xiaoyue_info: - "锁定技,每轮开始时,若你手牌中有杀,你将手牌中的一张随机杀对一名随机敌方角色使用,然后获得1点护甲。", + "锁定技,每轮开始时,若你手牌中有【杀】,你将手牌中的一张随机【杀】对一名随机敌方角色使用,然后获得1点护甲。", minsha: "冥煞", minsha_info: "出牌阶段限一次,你可以弃置两张牌,对一名体力值大于1的其他角色造成1点雷属性伤害,然后距离目标1以内的所有其他角色随机弃置一张牌。", @@ -4473,7 +4473,7 @@ game.import("character", function () { "锁定技,你回复体力的效果改为摸两张牌;当你进入濒死状态时,你回复1点体力并失去此技能。", xjyingfeng: "影锋", xjyingfeng_info: - "锁定技,每当你使用一张杀结算完毕后,你随机对一名不是此杀目标的敌方角色使用一张杀。", + "锁定技,每当你使用一张【杀】结算完毕后,你随机对一名不是此【杀】目标的敌方角色使用一张【杀】。", fenglue: "风掠", fenglue_info: "你可以放弃出牌阶段,改为指定一名其他角色并选择任意张手牌,依次对该角色使用,若如此做,此阶段内该角色每受到1点伤害,你在结算后摸一张牌。", @@ -4497,23 +4497,23 @@ game.import("character", function () { qixia_info: "锁定技,当你累计使用或打出了4种不同花色的牌后,你于本回合结束后获得一个额外回合。", jianzhen: "剑阵", jianzhen_info: - "锁定技,当你使用杀对目标结算完毕后,其他角色可以对该目标使用一张杀,当有人选择出杀后终止此结算。", + "锁定技,当你使用【杀】对目标结算完毕后,其他角色可以对该目标使用一张【杀】,当有人选择出【杀】后终止此结算。", husha: "虎煞", husha_bg: "煞", husha_info: - "每当你于出牌阶段造成1点伤害,你获得一枚虎煞标记(标记数不超过3);结束阶段,你可以选择一项:1. 移去一枚虎煞标记,视为对任意角色使用一张杀;2. 移去两枚虎煞标记,视为使用一张南蛮入侵;3. 移去三枚虎煞标记,视为对除你之外的角色使用一张元素毁灭。", + "每当你于出牌阶段造成1点伤害,你获得一枚虎煞标记(标记数不超过3);结束阶段,你可以选择一项:1. 移去一枚虎煞标记,视为对任意角色使用一张【杀】;2. 移去两枚虎煞标记,视为使用一张南蛮入侵;3. 移去三枚虎煞标记,视为对除你之外的角色使用一张元素毁灭。", longhuo: "龙火", longhuo_info: "结束阶段,你可以对所有角色各造成1点火焰伤害。", fenshi: "焚世", fenshi_info: "觉醒技,当你解除濒死状态时,你获得2点护甲,摸两张牌,然后获得技能龙火。", yanzhan: "炎斩", yanzhan_info: - "出牌阶段限一次,你可以将一张红色牌当作火杀使用,此杀只能用与之花色相同的闪响应;若此杀造成了伤害,你本回合可以额外使用一张杀。", + "出牌阶段限一次,你可以将一张红色牌当作火【杀】使用,此【杀】只能用与之花色相同的闪响应;若此【杀】造成了伤害,你本回合可以额外使用一张【杀】。", feixia: "飞霞", - feixia_info: "出牌阶段限一次,你可以弃置一张红色牌视为对一名随机敌人使用一张不计入出杀次数的杀。", + feixia_info: "出牌阶段限一次,你可以弃置一张红色牌视为对一名随机敌人使用一张不计入出杀次数的【杀】。", lueying: "掠影", lueying_info: - "每当你使用一张杀,你可以随机获得目标的一张牌,然后目标可以指定一名其他角色,你弃置该角色一张牌(每回合限发动一次,没有弃牌目标时无法发动)。", + "每当你使用一张【杀】,你可以随机获得目标的一张牌,然后目标可以指定一名其他角色,你弃置该角色一张牌(每回合限发动一次,没有弃牌目标时无法发动)。", feng: "风", feng_info: "锁定技,当你累计摸2次牌后,你下一次摸牌时摸牌数+1。", ya: "雅", @@ -4521,9 +4521,9 @@ game.import("character", function () { song: "颂", song_info: "锁定技,当你累计造成2次伤害后,你下一次造成的伤害+1。", longxiang: "龙翔", - longxiang_info: "当你使用杀指定目标后,你可以弃置目标若干张手牌直到其手牌数与你相同。", + longxiang_info: "当你使用【杀】指定目标后,你可以弃置目标若干张手牌直到其手牌数与你相同。", huxi: "虎袭", - huxi_info: "你可以失去1点体力并获得1点护甲,视为使用一张杀。", + huxi_info: "你可以失去1点体力并获得1点护甲,视为使用一张【杀】。", xuanmo: "玄墨", xuanmo_info: "出牌阶段限一次,你可以将一张手牌置于牌堆顶并随机获得两张与之类别相同的牌。", danqing: "丹青", @@ -4535,7 +4535,7 @@ game.import("character", function () { zhangmu_info: "每回合限一次,当你需要使用或打出一张闪时,你可以展示一张闪,视为使用或打出了此闪。", feizhua: "飞爪", - feizhua_info: "当你使用一张杀时,你可以将与目标相邻的角色追加为额外目标。", + feizhua_info: "当你使用一张【杀】时,你可以将与目标相邻的角色追加为额外目标。", leiyu: "雷狱", leiyu_info: "结束阶段,你可以弃置一张黑色手牌,视为对本回合内所有成为过你的卡牌目标的角色使用一张惊雷闪。", @@ -4554,7 +4554,7 @@ game.import("character", function () { guijiang_info: "出牌阶段限一次,你可以弃置一张黑色牌,令一名其他角色无法成为回复牌的目标直到你下一回合开始。", diesha: "叠杀", - diesha_info: "锁定技,每当你使用杀造成伤害,受伤害角色失去1点体力,你回复1点体力。", + diesha_info: "锁定技,每当你使用【杀】造成伤害,受伤害角色失去1点体力,你回复1点体力。", lingyu: "灵愈", lingyu_info: "结束阶段,你可以令一名其他角色回复1点体力。", diewu: "蝶舞", @@ -4575,7 +4575,7 @@ game.import("character", function () { xfenxin_info_alter: "锁定技,每当你的体力值发生改变,你摸一张牌。", luanjian: "乱剑", luanjian_info: - "出牌阶段,你可以将两张杀当杀使用,此杀无视距离,可以指定任意名目标且有50%的机率伤害+1。", + "出牌阶段,你可以将两张【杀】当【杀】使用,此【杀】无视距离,可以指定任意名目标且有50%的机率伤害+1。", ctianfu: "天符", ctianfu2: "天符", ctianfu3: "天符", @@ -4602,7 +4602,7 @@ game.import("character", function () { jtjubao: "聚宝", jtjubao_info: "当其他角色于你的回合外首次弃置非基本牌时,你可以获得其中的随机一张。", guiyuan: "归元", - guiyuan_info: "出牌阶段限一次,你可以弃置一张杀,然后回复1点体力并摸一张牌。", + guiyuan_info: "出牌阶段限一次,你可以弃置一张【杀】,然后回复1点体力并摸一张牌。", xshuangren: "双刃", xshuangren_info: "当你的武器牌被替换时,你可以将其置于你的武将牌上,并获得此装备的武器效果(不含距离)。", @@ -4612,7 +4612,7 @@ game.import("character", function () { shenmu_info: "任意一名角色濒死时,你可以展示你的手牌并弃置其中的所有红色牌(至少一张),若如此做,该角色回复1点体力,然后摸X张牌,X为你弃置的手牌数。", qijian: "气剑", - qijian_info: "弃牌阶段结束时,你可以指定至多X名目标视为使用一张杀,X为你于此阶段弃置的卡牌数。", + qijian_info: "弃牌阶段结束时,你可以指定至多X名目标视为使用一张【杀】,X为你于此阶段弃置的卡牌数。", poyun: "破云", poyun_info: "每当你造成一次伤害,你可以弃置一枚玄凝标记,然后弃置对方两张牌。", poyun_info_alter: "每当你造成一次伤害,你可以弃置一枚玄凝标记,然后弃置对方一张牌。", @@ -4627,15 +4627,15 @@ game.import("character", function () { "锁定技,在回合外每当你需要使用或打出一张卡牌时,若牌堆顶的前两张中有可使用或打出的牌,你立即获得之。", zhuyue: "逐月", zhuyue_info: - "出牌阶段限一次,你可以弃置一张非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回合使用的杀须指定选中角色为目标。", + "出牌阶段限一次,你可以弃置一张非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回合使用的【杀】须指定选中角色为目标。", zhuyue_info_alter: - "出牌阶段限一次,你可以弃置一张黑色非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回合使用的杀须指定选中角色为目标。", + "出牌阶段限一次,你可以弃置一张黑色非基本牌并指定至多两个目标各随机弃置一张牌,若如此做,你本回合使用的【杀】须指定选中角色为目标。", guanri: "贯日", guanri_info: "限制技,你可以弃置两张红色手牌并失去1点体力,然后对一名体力值不少于你的其他角色造成2点火焰伤害并弃置其所有装备牌。", tianxian: "天弦", tianxian_info: - "锁定技,你的杀无视距离且可指定任意多个目标,目标须进行一次判定,若结果为黑色则取消之。", + "锁定技,你的【杀】无视距离且可指定任意多个目标,目标须进行一次判定,若结果为黑色则取消之。", xjzhimeng: "织梦", xjzhimeng2: "织梦", xjzhimeng3: "织梦", @@ -4651,8 +4651,8 @@ game.import("character", function () { xiaoyao: "逍遥", xiaoyao_info: "每当你成为其他角色的卡牌目标,你可以弃置一张与之花色相同的手牌取消之。", tianjian: "天剑", - tianjian_info: "出牌阶段限一次,你可以将一张杀当作万箭齐发使用,受到伤害的角色随机弃置一张牌。", - tianjian_info_alter: "出牌阶段限一次,你可以将一张杀当作万箭齐发使用。", + tianjian_info: "出牌阶段限一次,你可以将一张【杀】当作【万箭齐发】使用,受到伤害的角色随机弃置一张牌。", + tianjian_info_alter: "出牌阶段限一次,你可以将一张【杀】当作【万箭齐发】使用。", xjyufeng: "御风", xjyufeng_info: "锁定技,当你失去手牌后,若手牌数少于2,你将手牌数补至2(每回合最多发动两次)。", huimeng: "回梦", diff --git a/character/xinghuoliaoyuan/character.js b/character/xinghuoliaoyuan/character.js index 75c41c6b1d..3a388ff22b 100644 --- a/character/xinghuoliaoyuan/character.js +++ b/character/xinghuoliaoyuan/character.js @@ -1,6 +1,6 @@ const characters = { wangcan: ["male", "qun", 3, ["xinfu_sanwen", "xinfu_qiai", "xinfu_denglou"]], - sp_taishici: ["male", "qun", 4, ["xinfu_jixu"]], + sp_taishici: ["male", "qun", 4, ["xinfu_jixu"], ["name:太史|慈"]], re_jsp_pangtong: ["male", "wu", 3, ["xinfu_guolun", "xinfu_songsang"]], lvdai: ["male", "wu", 4, ["xinfu_qinguo"]], re_zhangliang: ["male", "qun", 4, ["xinfu_jijun", "xinfu_fangtong"]], diff --git a/character/yijiang/character.js b/character/yijiang/character.js index ce2531a060..b352d01260 100644 --- a/character/yijiang/character.js +++ b/character/yijiang/character.js @@ -1,5 +1,5 @@ const characters = { - xiahoumao: ["male", "wei", 4, ["tongwei", "cuguo"]], + xiahoumao: ["male", "wei", 4, ["tongwei", "cuguo"], ["name:夏侯|楙"]], chenshi: ["male", "shu", 4, ["qingbei"]], sunli: ["male", "wei", 4, ["kangli"]], feiyao: ["male", "wei", 4, ["zhenfeng"]], @@ -8,11 +8,11 @@ const characters = { yj_qiaozhou: ["male", "shu", 3, ["shiming", "jiangxi"]], yj_sufei: ["male", "wu", 4, ["shuojian"]], liwan: ["female", "wei", 3, ["liandui", "biejun"]], - zhugeshang: ["male", "shu", 3, ["sangu", "yizu"]], + zhugeshang: ["male", "shu", 3, ["sangu", "yizu"], ["name:诸葛|尚"]], kebineng: ["male", "qun", 4, ["kousheng"]], lukai: ["male", "wu", 4, ["lkbushi", "lkzhongzhuang"]], xin_fazheng: ["male", "shu", 3, ["xinxuanhuo", "xinenyuan"]], - guanzhang: ["male", "shu", 4, ["fuhun"]], + guanzhang: ["male", "shu", 4, ["fuhun"], ["name:关|兴-张|苞"]], wangyi: ["female", "wei", 3, ["zhenlie", "miji"]], caozhang: ["male", "wei", 4, ["new_jiangchi"]], guohuai: ["male", "wei", 4, ["rejingce"]], @@ -24,7 +24,7 @@ const characters = { xin_masu: ["male", "shu", 3, ["olsanyao", "rezhiman"]], zhuran: ["male", "wu", 4, ["danshou"]], xusheng: ["male", "wu", 4, ["xinpojun"]], - wuguotai: ["female", "wu", 3, ["ganlu", "buyi"]], + wuguotai: ["female", "wu", 3, ["ganlu", "buyi"], ["name:丁|null"]], lingtong: ["male", "wu", 4, ["xuanfeng"]], liubiao: ["male", "qun", 3, ["rezishou", "zongshi"]], yufan: ["male", "wu", 3, ["zhiyan", "zongxuan"]], @@ -40,13 +40,13 @@ const characters = { chenqun: ["male", "wei", 3, ["pindi", "faen"]], sunluban: ["female", "wu", 3, ["chanhui", "jiaojin"]], guyong: ["male", "wu", 3, ["shenxing", "olbingyi"]], - caifuren: ["female", "qun", 3, ["qieting", "xianzhou"]], + caifuren: ["female", "qun", 3, ["qieting", "xianzhou"], ["name:蔡|null"]], yj_jushou: ["male", "qun", 3, ["jianying", "shibei"]], zhangsong: ["male", "shu", 3, ["qiangzhi", "xiantu"]], zhuhuan: ["male", "wu", 4, ["fenli", "pingkou"]], - xiahoushi: ["female", "shu", 3, ["qiaoshi", "yanyu"]], + xiahoushi: ["female", "shu", 3, ["qiaoshi", "yanyu"], ["name:夏侯|null"]], - panzhangmazhong: ["male", "wu", 4, ["duodao", "anjian"]], + panzhangmazhong: ["male", "wu", 4, ["duodao", "anjian"], ["name:潘|璋-马|忠"]], zhoucang: ["male", "shu", 4, ["xinzhongyong"]], guanping: ["male", "shu", 4, ["longyin"]], liaohua: ["male", "shu", 4, ["dangxian", "fuli"]], @@ -54,7 +54,7 @@ const characters = { gaoshun: ["male", "qun", 4, ["xinxianzhen", "jinjiu"]], caozhen: ["male", "wei", 4, ["xinsidi"]], wuyi: ["male", "shu", 4, ["benxi"], ["clan:陈留吴氏"]], - hanhaoshihuan: ["male", "wei", 4, ["shenduan", "yonglve"]], + hanhaoshihuan: ["male", "wei", 4, ["shenduan", "yonglve"], ['name:韩|浩-史|涣']], caorui: ["male", "wei", 3, ["huituo", "mingjian", "xingshuai"], ["zhu"]], caoxiu: ["male", "wei", 4, ["qianju", "qingxi"]], @@ -64,12 +64,12 @@ const characters = { sunxiu: ["male", "wu", 3, ["yanzhu", "xingxue", "xinzhaofu"], ["zhu"]], zhuzhi: ["male", "wu", 4, ["xinanguo"]], quancong: ["male", "wu", 4, ["yaoming"]], - gongsunyuan: ["male", "qun", 4, ["huaiyi"]], - guotufengji: ["male", "qun", 3, ["jigong", "shifei"]], + gongsunyuan: ["male", "qun", 4, ["huaiyi"], ["name:公孙|渊"]], + guotufengji: ["male", "qun", 3, ["jigong", "shifei"], ["name:郭|图-逢|纪"]], xin_liru: ["male", "qun", 3, ["xinjuece", "xinmieji", "xinfencheng"]], - guohuanghou: ["female", "wei", 3, ["jiaozhao", "danxin"]], + guohuanghou: ["female", "wei", 3, ["jiaozhao", "danxin"], ["name:郭|null"]], liuyu: ["male", "qun", 2, ["xinzhige", "xinzongzuo"]], liyan: ["male", "shu", 3, ["dcduliang", "fulin"]], sundeng: ["male", "wu", 4, ["kuangbi"]], @@ -77,11 +77,11 @@ const characters = { cenhun: ["male", "wu", 4, ["jishe", "lianhuo"]], huanghao: ["male", "shu", 3, ["qinqing", "huisheng"]], zhangrang: ["male", "qun", 3, ["taoluan"], ["sex:male_castrated"]], - sunziliufang: ["male", "wei", 3, ["guizao", "jiyu"]], + sunziliufang: ["male", "wei", 3, ["guizao", "jiyu"], ['name:孙|资-刘|放']], xinxianying: ["female", "wei", 3, ["zhongjian", "caishi"]], wuxian: ["female", "shu", 3, ["fumian", "daiyan"], ["clan:陈留吴氏"]], - xushi: ["female", "wu", 3, ["wengua", "fuzhu"]], + xushi: ["female", "wu", 3, ["wengua", "fuzhu"], ["name:徐|null"]], caojie: ["female", "qun", 3, ["shouxi", "huimin"]], caiyong: ["male", "qun", 3, ["bizhuan", "tongbo"]], @@ -93,9 +93,9 @@ const characters = { yujin: ["male", "wei", 4, ["rezhenjun"], ["die:ol_yujin.mp3"]], - linghuyu: ["male", "wei", 4, ["xvzhi"]], - yj_simafu: ["male", "wei", 3, ["beiyu", "duchi"]], - yj_xuangongzhu: ["female", "wei", 3, ["yjqimei", "yjzhuiji"]], + linghuyu: ["male", "wei", 4, ["xvzhi"], ["name:令狐|愚"]], + yj_simafu: ["male", "wei", 3, ["beiyu", "duchi"], ["name:司马|孚"]], + yj_xuangongzhu: ["female", "wei", 3, ["yjqimei", "yjzhuiji"], ["name:司马|null"]], xukun: ["male", "wu", 4, ["fazhu"]], }; diff --git a/character/yijiang/characterReplace.js b/character/yijiang/characterReplace.js index be802a2673..27eb186a95 100644 --- a/character/yijiang/characterReplace.js +++ b/character/yijiang/characterReplace.js @@ -1,16 +1,16 @@ const characterReplaces = { caozhi: ["caozhi", "dc_caozhi", "re_caozhi", "ps_caozhi"], - zhangchunhua: ["zhangchunhua", "re_zhangchunhua"], + zhangchunhua: ["zhangchunhua", "re_zhangchunhua", "jin_zhangchunhua", "star_zhangchunhua"], yujin: ["yujin", "yujin_yujin", "ol_yujin", "sb_yujin", "xin_yujin", "re_yujin"], dc_xushu: ["re_xushu", "dc_xushu"], xushu: ["xin_xushu", "xushu"], fazheng: ["xin_fazheng", "ol_fazheng", "re_fazheng", "sb_fazheng", "tw_re_fazheng", "fazheng"], masu: ["xin_masu", "re_masu", "masu"], xusheng: ["xusheng", "xin_xusheng", "re_xusheng", "old_xusheng"], - wuguotai: ["wuguotai", "xin_wuguotai", "re_wuguotai"], + wuguotai: ["wuguotai", "xin_wuguotai", "re_wuguotai", "ol_wuguotai"], lingtong: ["lingtong", "xin_lingtong", "ol_lingtong", "re_lingtong", "old_lingtong"], gaoshun: ["gaoshun", "xin_gaoshun", "ol_gaoshun", "re_gaoshun", "sb_gaoshun", "old_gaoshun"], - zhonghui: ["zhonghui", "xin_zhonghui", "re_zhonghui", "old_zhonghui", "pe_zhonghui"], + zhonghui: ["zhonghui", "xin_zhonghui", "re_zhonghui", "old_zhonghui", "pe_zhonghui", "clan_zhonghui", "yj_zhonghui"], wangyi: ["wangyi", "ol_wangyi", "re_wangyi", "old_wangyi"], caozhang: ["caozhang", "ol_caozhang", "re_caozhang", "xin_caozhang"], guanzhang: ["guanzhang", "re_guanzhang", "old_guanzhang"], @@ -19,7 +19,7 @@ const characterReplaces = { bulianshi: ["bulianshi", "dc_bulianshi", "re_bulianshi", "old_bulianshi"], handang: ["handang", "xin_handang", "re_handang", "tw_handang", "sb_handang", "old_handang"], chengpu: ["chengpu", "ol_chengpu", "re_chengpu", "xin_chengpu", "tw_chengpu", "ns_chengpu", "std_chengpu"], - liubiao: ["liubiao", "xin_liubiao", "re_liubiao", "jsrg_liubiao", "sb_liubiao", "oldre_liubiao", "old_liubiao"], + liubiao: ["liubiao", "xin_liubiao", "re_liubiao", "jsrg_liubiao", "sb_liubiao", "oldre_liubiao", "old_liubiao", "ol_liubiao"], manchong: ["manchong", "re_manchong"], caochong: ["caochong", "re_caochong", "old_caochong"], guohuai: ["guohuai", "re_guohuai", "xin_guohuai", "tw_guohuai", "ol_guohuai"], @@ -65,7 +65,7 @@ const characterReplaces = { sunziliufang: ["sunziliufang", "dc_sunziliufang"], liyan: ["liyan", "old_liyan"], zhangsong: ["zhangsong", "re_zhangsong"], - zhongyao: ["zhongyao", "re_zhongyao"], + zhongyao: ["zhongyao", "re_zhongyao", "clan_zhongyao"], liwan: ["ol_liwan", "liwan"], wuxian: ["wuxian", "clan_wuxian"], simafu: ["mb_simafu", "simafu", "yj_simafu"], diff --git a/character/yijiang/dynamicTranslate.js b/character/yijiang/dynamicTranslate.js index 3f5ae03fda..db1c22a7b0 100644 --- a/character/yijiang/dynamicTranslate.js +++ b/character/yijiang/dynamicTranslate.js @@ -30,7 +30,7 @@ const dynamicTranslates = { }, diezhang(player) { var str = ""; - str += player.storage.duanwan ? "" : "①出牌阶段,你使用杀的次数上限+1。②"; + str += player.storage.duanwan ? "" : "①出牌阶段,你使用【杀】的次数上限+1。②"; str += "转换技" + (player.storage.duanwan ? ",每回合限一次" : "") + "。"; var cnNum = get.cnNumber(player.storage.duanwan ? 2 : 1); var yinStr = "阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用" + cnNum + "张【杀】"; diff --git a/character/yijiang/skill.js b/character/yijiang/skill.js index 5b72f4e838..e495e10228 100644 --- a/character/yijiang/skill.js +++ b/character/yijiang/skill.js @@ -345,14 +345,27 @@ const skills = { }, //徐琨(菜不菜我不知道) fazhu: { - audio: 2, + audio: 3, trigger: { player: "phaseZhunbeiBegin" }, filter(event, player) { return player.hasCard(card => !get.tag(card, "damage") && player.canRecast(card), "hej"); }, + async cost(event, trigger, player) { + event.result = await player + .choosePlayerCard(get.prompt(event.name.slice(0, -5)), player, "hej", [1, Infinity]) + .set("ai", button => { + const card = button.link; + if (get.position(card) == "j") return 10; + return 6 - get.value(card); + }) + .set("filterButton", button => { + const card = button.link; + return !get.tag(card, "damage") && player.canRecast(card); + }) + .forResult(); + }, async content(event, trigger, player) { - const cardx = player.getCards("hej", card => !get.tag(card, "damage") && player.canRecast(card)); - await player.recast(cardx); + await player.recast(event.cards); const cards = player .getHistory("gain", evt => evt.getParent(3) == event) .reduce((list, evt) => { @@ -3421,42 +3434,39 @@ const skills = { skillAnimation: true, animationColor: "water", derivation: ["new_canyun"], - content: function () { - "step 0"; - if (trigger.source) { - trigger.source.discard(trigger.source.getCards("e")); - trigger.source.loseHp(); + async content(event, trigger, player) { + const source = trigger.source; + if (source && source.isIn()) { + await source.discard(source.getCards("e")); + await source.loseHp(); } - "step 1"; - player - .chooseTarget("【绝响】:是否令一名其他角色获得技能〖残韵〗?", function (card, player, target) { - return target != player; - }) - .set("ai", function (target) { - var att = get.attitude(_status.event.player, target); + const targets = await player + .chooseTarget("【绝响】:是否令一名其他角色获得技能〖残韵〗?", lib.filter.notMe) + .set("ai", target => { + var att = get.attitude(get.player(), target); if (target.countCards("ej", { suit: "club" })) att = att * 2; return 10 + att; }) - .set("forceDie", true); - "step 2"; + .set("forceDie", true) + .forResultTargets(); + if (!targets || !targets.length) return; + const target = targets[0]; + player.line(target, "thunder"); + await target.addSkills("new_canyun"); + const { result } = await target + .chooseTarget("是否弃置场上的一张牌,获得技能〖绝响〗?", (card, player, target) => { + return target.getDiscardableCards(player, "ej").some(i => get.suit(i) == "club"); + }) + .set("ai", target => { + const player = get.player(); + return get.effect(target, { name: "guohe_copy2" }, player, player); + }); if (result.bool) { - var target = result.targets[0]; - event.target = target; - player.line(target, "thunder"); - target.addSkills("new_canyun"); - target - .discardPlayerCard("是否弃置自己区域内的一张梅花牌,获得技能〖绝响〗?", target, "hej") - .set("ai", function (card) { - if (get.position(card) == "j") return 100 + get.value(card); - return 100 - get.value(card); - }) - .set("visible", true) - .set("filterButton", function (card) { - return get.suit(card.link) == "club"; - }); - } else event.finish(); - "step 3"; - if (result.bool) target.addSkills("new_juexiang"); + await target.discardPlayerCard(result.targets[0], "ej", true).set("filterButton", button => { + return get.suit(button.link) == "club"; + }); + await target.addSkills("new_juexiang"); + } }, }, new_canyun: { @@ -4061,7 +4071,6 @@ const skills = { intro: { content: "已经发动过了#次" }, }, zhuandui: { - shaRelated: true, audio: 2, group: ["zhuandui_respond", "zhuandui_use"], subSkill: { @@ -6934,7 +6943,7 @@ const skills = { }, }, xinmieji: { - audio: 2, + audio: "mieji", enable: "phaseUse", usable: 1, filter: function (event, player) { @@ -7299,9 +7308,12 @@ const skills = { }, effect: { player_use(card, player, target, current, isLink) { - if (isLink || !player.storage.xinxianzhen) return; + if (isLink || !player.storage.xinxianzhen || player._xinxianzhen_effect_temp) return; if (target != player.storage.xinxianzhen && ["sha", "guohe", "shunshou", "huogong", "juedou"].includes(card.name)) { - if (get.effect(player.storage.xinxianzhen, card, player, player) > 0) { + player._xinxianzhen_effect_temp = true; + let eff = get.effect(player.storage.xinxianzhen, card, player, player); + delete player._xinxianzhen_effect_temp; + if (eff > 0) { return [1, 2]; } } @@ -8146,7 +8158,6 @@ const skills = { }, longyin: { audio: 2, - shaRelated: true, init: player => { game.addGlobalSkill("longyin_order"); }, @@ -9371,7 +9382,7 @@ const skills = { }, }, // taoxi:{ - // audio:2, + // audio: "qingxi", // trigger:{player:'useCardToPlayered'}, // filter:function(event,player){ // return _status.currentPhase==player&&event.targets.length==1&& @@ -9462,7 +9473,7 @@ const skills = { // }, // taoxi4:{}, taoxi: { - audio: 2, + audio: "qingxi", trigger: { player: "useCardToPlayered" }, check: function (event, player) { if (get.attitude(player, event.target) >= 0) return false; @@ -10012,13 +10023,12 @@ const skills = { }, }, xinpojun: { - shaRelated: true, trigger: { player: "useCardToPlayered" }, direct: true, filter: function (event, player) { return event.card.name == "sha" && player.isPhaseUsing() && event.target.hp > 0 && event.target.countCards("he") > 0; }, - audio: 2, + audio: "pojun", content: function () { "step 0"; player.choosePlayerCard(trigger.target, "he", [1, Math.min(trigger.target.countCards("he"), trigger.target.hp)], get.prompt("xinpojun", trigger.target)).set("forceAuto", true); @@ -10225,7 +10235,7 @@ const skills = { fencheng: { skillAnimation: "epic", animationColor: "gray", - audio: 2, + audio: "xinfencheng", enable: "phaseUse", filter: function (event, player) { return !player.storage.fencheng; @@ -11354,7 +11364,7 @@ const skills = { }, }, dingpin: { - audio: 2, + audio: "pindi", enable: "phaseUse", onChooseToUse: function (event) { if (event.type != "phase" || game.online) return; diff --git a/character/yijiang/translate.js b/character/yijiang/translate.js index c1c26a03e2..a820e53831 100644 --- a/character/yijiang/translate.js +++ b/character/yijiang/translate.js @@ -82,7 +82,7 @@ const translates = { new_qingxian: "清弦", new_qingxian_info: "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", new_juexiang: "绝响", - new_juexiang_info: "锁定技,当你死亡后,杀死你的角色弃置装备区内的所有牌并失去1点体力。然后,你可以令一名其他角色获得技能〖残韵〗。若该角色区域内有梅花牌,则其可以弃置其中的一张,然后其获得技能〖绝响〗。", + new_juexiang_info: "锁定技,当你死亡后,杀死你的角色弃置装备区内的所有牌并失去1点体力。然后,你可以令一名其他角色获得技能〖残韵〗。若场上有梅花牌,则其可以弃置其中的一张,然后其获得技能〖绝响〗。", new_canyun: "残韵", new_canyun_info: "出牌阶段限一次,你可以弃置至多X张牌并选择等量的其他角色(不能选择已经成为过〖残韵〗目标的角色)。这些角色中,装备区内牌数少于你的回复1点体力,等于你的摸一张牌,多于你的失去1点体力。若你以此法指定的角色数等于X,则你摸一张牌。(X为你的体力值)", qingxian_draw: "清弦", @@ -123,9 +123,9 @@ const translates = { jianzheng: "谏征", jianzheng_info: "当一名其他角色使用【杀】指定目标时,若你在其攻击范围内且你不是目标,则你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。", zhuandui: "专对", - zhuandui_info: "当你使用【杀】指定目标/成为【杀】的目标后,你可以与目标角色/此【杀】使用者拼点,若你赢,此杀不能被【闪】响应/对你无效。", - zhuandui_use_info: "当你使用【杀】指定目标后,你可以与目标角色拼点,若你赢,此杀不能被【闪】响应。", - zhuandui_respond_info: "当你成为【杀】的目标后,你可以与此【杀】使用者拼点,若你赢,此杀对你无效。", + zhuandui_info: "当你使用【杀】指定目标/成为【杀】的目标后,你可以与目标角色/此【杀】使用者拼点,若你赢,此【杀】不能被【闪】响应/对你无效。", + zhuandui_use_info: "当你使用【杀】指定目标后,你可以与目标角色拼点,若你赢,此【杀】不能被【闪】响应。", + zhuandui_respond_info: "当你成为【杀】的目标后,你可以与此【杀】使用者拼点,若你赢,此【杀】对你无效。", tianbian: "天辩", tianbian_info: "你拼点时,可以改为用牌堆顶的一张牌进行拼点;当你拼点的牌亮出后,若此牌花色为红桃,则此牌的点数视为K。", funan: "复难", @@ -317,11 +317,11 @@ const translates = { reduodao: "夺刀", reduodao_info: "当你成为【杀】的目标后,你可以弃置一张牌。然后你获得此【杀】使用者装备区里的武器牌。", reanjian: "暗箭", - reanjian_info: "锁定技,当你使用【杀】指定目标后,若你不在其攻击范围内,则此杀伤害+1且无视其防具。若其因执行此【杀】的效果受到伤害而进入濒死状态,则其不能使用【桃】直到此濒死事件结算结束。", + reanjian_info: "锁定技,当你使用【杀】指定目标后,若你不在其攻击范围内,则此【杀】伤害+1且无视其防具。若其因执行此【杀】的效果受到伤害而进入濒死状态,则其不能使用【桃】直到此濒死事件结算结束。", duodao: "夺刀", duodao_info: "当你受到【杀】造成的伤害后,你可以弃置一张牌,然后获得伤害来源装备区里的武器牌。", anjian: "暗箭", - anjian_info: "锁定技,当你使用【杀】对目标角色造成伤害时,若你不在其攻击范围内,则此杀伤害+1。", + anjian_info: "锁定技,当你使用【杀】对目标角色造成伤害时,若你不在其攻击范围内,则此【杀】伤害+1。", xinpojun: "破军", xinpojun2: "破军", xinpojun_info: "当你于出牌阶段内使用【杀】指定一个目标后,你可以将其至多X张牌扣置于该角色的武将牌旁(X为其体力值)。若如此做,当前回合结束后,该角色获得其武将牌旁的所有牌。", @@ -619,7 +619,7 @@ const translates = { cibei_info: "①当一名角色使用【杀】造成伤害且此牌对应的实体牌进入弃牌堆后,你可以将一张不为【杀】的“刺”置入弃牌堆,并将这些牌置入“刺”,然后弃置一名角色区域里的一张牌。②一名角色的回合结束时,若你的“刺”均为【杀】,你获得所有“刺”,且这些牌不能被弃置,不计入手牌上限,且当你使用对应实体牌包含这些牌的牌时无次数和距离限制。", wuanguo: "武安国", diezhang: "叠嶂", - diezhang_info: "转换技。①出牌阶段,你使用杀的次数上限+1。②阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用X张【杀】;阳:当其他角色使用牌被你抵消后,你可以摸X张牌,视为对其使用一张【杀】(X为1)。", + diezhang_info: "转换技。①出牌阶段,你使用【杀】的次数上限+1。②阴:当你使用牌被其他角色抵消后,你可以弃置一张牌,视为对其使用X张【杀】;阳:当其他角色使用牌被你抵消后,你可以摸X张牌,视为对其使用一张【杀】(X为1)。", duanwan: "断腕", duanwan_info: "限定技。当你处于濒死状态时,你可以将体力回复至2点,然后删除〖叠嶂①〗和当前转换技状态的〖叠嶂②〗分支,并将〖叠嶂〗修改为“每回合限一次”且将X修改为2。", dcduliang: "督粮", @@ -654,7 +654,7 @@ const translates = { yjzhuiji: "追姬", yjzhuiji_info: "当你死亡时,你可以令一名角色从牌堆和弃牌堆中的随机使用任意装备牌直至其没有空置的装备栏。若如此做,当其失去以此法使用的装备牌后,其废除对应的装备栏。", fazhu: "筏铸", - fazhu_info: "准备阶段,你可以重铸你的区域内的所有非伤害牌,然后将以此法获得的牌交给至多等量名角色各一张,这些角色可以依次使用一张无距离限制的【杀】。", + fazhu_info: "准备阶段,你可以重铸你的区域内任意张非伤害牌,然后将以此法获得的牌交给至多等量名角色各一张,这些角色可以依次使用一张无距离限制的【杀】。", }; export default translates; diff --git a/character/yijiang/voices.js b/character/yijiang/voices.js index 78775f7b27..4c658aff22 100644 --- a/character/yijiang/voices.js +++ b/character/yijiang/voices.js @@ -1,4 +1,15 @@ export default { + "#zhenfeng1": "河西诸贼作乱,吾当驱万里之远。", + "#zhenfeng2": "可折诸葛之锋而御者,独我其谁。", + "#feiyao:die": "姜维,你果然是蜀军内应!", + // 击、逆、泰、每,懂? + "#fazhu1": "击风雨于共济,逆流亦溯千帆。", + "#fazhu2": "泰山轻于大义,每思志士、何惧临渊。", + "#fazhu3": "大江潮起,伐苇成舟,载江南春风。", + "#xukun:die": "何处射来的流矢?", + "#kangli1": "地界纷争皋陶难断,然图藏天府,坐上可明。", + "#kangli2": "正至歉岁,难征百姓于役,望陛下明鉴。", + "#sunli:die": "国无矩不立,何谓之方圆?", "#tongwei1": "集关西诸路大军,必雪当年长坂坡之耻。", "#tongwei2": "手织天网十万尺,欲擒飞龙落彀中。", "#cuguo1": "身担父命,怎可蜷于宫阙。", @@ -95,8 +106,8 @@ export default { "#danshou1": "以胆为守,扼敌咽喉!", "#danshou2": "到此为止了!", "#zhuran:die": "何人竟有如此之胆!?", - "#xinpojun1": "大军在此!汝等休想前进一步!", - "#xinpojun2": "敬请,养精蓄锐!", + "#pojun1": "大军在此!汝等休想前进一步!", + "#pojun2": "敬请,养精蓄锐!", "#xusheng:die": "盛不能奋身出命,不亦辱乎……", "#ganlu1": "男婚女嫁,须当交换文定之物。", "#ganlu2": "此真乃吾之佳婿也。", @@ -280,8 +291,8 @@ export default { "#guotufengji:die": "大势已去,无力回天……", "#juece1": "哼!你走投无路了。", "#juece2": "无用之人,死!", - "#xinmieji1": "宁错杀,无放过!", - "#xinmieji2": "你能逃得出我的手掌心吗?", + "#mieji1": "宁错杀,无放过!", + "#mieji2": "你能逃得出我的手掌心吗?", "#xinfencheng1": "我得不到的,你们也别想得到!", "#xinfencheng2": "让这一切都灰飞烟灭吧!哼哼哼哼……", "#xin_liru:die": "如遇明主,大业必成……", diff --git a/character/yingbian/character.js b/character/yingbian/character.js index 8d85899048..097dc1f60f 100644 --- a/character/yingbian/character.js +++ b/character/yingbian/character.js @@ -1,26 +1,26 @@ const characters = { - chengjichengcui: ["male", "jin", 6, ["oltousui", "olchuming"]], + chengjichengcui: ["male", "jin", 6, ["oltousui", "olchuming"],['name:成|济-成|倅']], wangxiang: ["male", "jin", 3, ["bingxin"]], jin_jiachong: ["male", "jin", 3, ["xiongshu", "jianhui"]], - xuangongzhu: ["female", "jin", 3, ["gaoling", "qimei", "ybzhuiji"], ["hiddenSkill"]], + xuangongzhu: ["female", "jin", 3, ["gaoling", "qimei", "ybzhuiji"], ["hiddenSkill", 'name:司马|null']], xinchang: ["male", "jin", 3, ["canmou", "congjian"]], yangzhi: ["female", "jin", 3, ["xinwanyi", "maihuo"]], yangyan: ["female", "jin", 3, ["xinxuanbei", "xianwan"]], ol_huaxin: ["male", "wei", 3, ["caozhao", "olxibing"]], zhongyan: ["female", "jin", 3, ["bolan", "yifa"], ["clan:颍川钟氏"]], weiguan: ["male", "jin", 3, ["zhongyun", "shenpin"]], - cheliji: ["male", "qun", 4, ["chexuan", "qiangshou"]], - simazhou: ["male", "jin", 4, ["recaiwang", "naxiang"]], + cheliji: ["male", "qun", 4, ["chexuan", "qiangshou"], ['name:彻里|吉']], + simazhou: ["male", "jin", 4, ["recaiwang", "naxiang"], ['name:司马|伷']], ol_lisu: ["male", "qun", 3, ["qiaoyan", "xianzhu"]], jin_yanghuiyu: ["female", "jin", 3, ["huirong", "ciwei", "caiyuan"], ["hiddenSkill"]], shibao: ["male", "jin", 4, ["zhuosheng"]], jin_zhangchunhua: ["female", "jin", 3, ["huishi", "qingleng", "xuanmu"], ["hiddenSkill"]], - jin_simayi: ["male", "jin", 3, ["buchen", "smyyingshi", "xiongzhi", "xinquanbian"], ["hiddenSkill"]], + jin_simayi: ["male", "jin", 3, ["buchen", "smyyingshi", "xiongzhi", "xinquanbian"], ["hiddenSkill", "name:司马|懿"]], jin_wangyuanji: ["female", "jin", 3, ["shiren", "yanxi"], ["hiddenSkill"]], - jin_simazhao: ["male", "jin", 3, ["tuishi", "xinchoufa", "zhaoran", "chengwu"], ["zhu", "hiddenSkill"]], - jin_xiahouhui: ["female", "jin", 3, ["baoqie", "jyishi", "shiduo"], ["hiddenSkill"]], - jin_simashi: ["male", "jin", "3/4", ["taoyin", "yimie", "ruilve", "tairan"], ["hiddenSkill", "zhu"]], - zhanghuyuechen: ["male", "jin", 4, ["xijue"]], + jin_simazhao: ["male", "jin", 3, ["tuishi", "xinchoufa", "zhaoran", "chengwu"], ["zhu", "hiddenSkill", "name:司马|昭"]], + jin_xiahouhui: ["female", "jin", 3, ["baoqie", "jyishi", "shiduo"], ["hiddenSkill","name:夏侯|徽"]], + jin_simashi: ["male", "jin", "3/4", ["taoyin", "yimie", "ruilve", "tairan"], ["hiddenSkill", "zhu", "name:司马|师"]], + zhanghuyuechen: ["male", "jin", 4, ["xijue"], ['name:张|虎-乐|綝']], duyu: ["male", "jin", 4, ["sanchen", "zhaotao"]], }; diff --git a/character/yingbian/skill.js b/character/yingbian/skill.js index 25019f6ca0..2edf22d2b8 100644 --- a/character/yingbian/skill.js +++ b/character/yingbian/skill.js @@ -1750,8 +1750,8 @@ const skills = { var skill = lib.skill[j]; if (!skill || skill.juexingji || skill.hiddenSkill || skill.zhuSkill || skill.dutySkill || skill.chargeSkill || lib.skill.bolan.banned.includes(j)) continue; if (skill.init || (skill.ai && (skill.ai.combo || skill.ai.notemp || skill.ai.neg))) continue; - var info = get.plainText(lib.translate[j + "_info"]); - if (info && info.indexOf("出牌阶段限一次") != -1) skills.add(j); + var info = lib.translate[j + "_info"]; + if (info && get.plainText(info).indexOf("出牌阶段限一次") != -1) skills.add(j); } } player.storage.bolan = skills; diff --git a/character/yxs.js b/character/yxs.js index a2f606e5e7..a601bcef1d 100644 --- a/character/yxs.js +++ b/character/yxs.js @@ -4,48 +4,48 @@ game.import("character", function () { name: "yxs", character: { yxs_qinqiong: ["male", "wei", 4, ["yxs_fanji", "yxs_menshen"], []], - yxs_wuzetian: ["female", "wu", 4, ["nvquan", "qiandu", "yxsweiyi"]], + yxs_wuzetian: ["female", "wu", 4, ["nvquan", "qiandu", "yxsweiyi"], ["name:武|曌"]], yxs_caocao: ["male", "wei", 4, ["zhulu", "xieling"]], - yxs_mozi: ["male", "qun", 3, ["jieyong", "feigong", "jianai"]], - yxs_bole: ["male", "wu", 3, ["bolehuiyan", "xiangma"]], - yxs_aijiyanhou: ["female", "qun", 3, ["seyou", "sheshi"]], - yxs_diaochan: ["female", "qun", 3, ["fengyi", "wange"]], + yxs_mozi: ["male", "qun", 3, ["jieyong", "feigong", "jianai"], ["name:墨|翟"]], + yxs_bole: ["male", "wu", 3, ["bolehuiyan", "xiangma"], ["name:孙|阳"]], + yxs_aijiyanhou: ["female", "qun", 3, ["seyou", "sheshi"], ["name:null|null"]], + yxs_diaochan: ["female", "qun", 3, ["fengyi", "wange"], ["name:null|null"]], yxs_yangyuhuan: ["female", "wu", 3, ["fengyan", "nichang"]], - yxs_baosi: ["female", "wu", 3, ["jieyin", "fenghuo"]], - yxs_napolun: ["male", "wei", 4, ["tongling", "fanpu"]], - yxs_kaisa: ["male", "shu", 4, ["ducai"]], + yxs_baosi: ["female", "wu", 3, ["jieyin", "fenghuo"], ["name:姒|null"]], + yxs_napolun: ["male", "wei", 4, ["tongling", "fanpu"], ["name:波拿巴|拿破仑"]], + yxs_kaisa: ["male", "shu", 4, ["ducai"], ["name:尤利乌斯|盖乌斯"]], yxs_zhuyuanzhang: ["male", "wu", 4, ["qiangyun"]], // yxs_jinke:['male','qun',3,['cike','qiangxi']], yxs_libai: ["male", "qun", 3, ["miaobi", "zhexian"]], - yxs_luban: ["male", "wu", 3, ["guifu", "lshengong"]], + yxs_luban: ["male", "wu", 3, ["guifu", "lshengong"], ["name:公输|般"]], yxs_lvzhi: ["female", "shu", 4, ["zhensha", "xumou"]], - yxs_goujian: ["male", "wu", 3, ["keji", "tuqiang"]], + yxs_goujian: ["male", "wu", 3, ["keji", "tuqiang"], ["name:姒|鸠浅"]], yxs_lishimin: ["male", "qun", 4, ["kongju"]], - yxs_huamulan: ["female", "shu", 3, ["xiaoji", "yizhuang"]], - yxs_luobinhan: ["male", "wu", 4, ["xiadao", "sheshu", "lguiyin"]], - yxs_chengjisihan: ["male", "qun", 4, ["mashu", "qianglue"]], - yxs_mingchenghuanghou: ["female", "shu", 3, ["tiewan", "chajue"]], - yxs_wangzhaojun: ["female", "wei", 3, ["heqin", "wluoyan"]], + yxs_huamulan: ["female", "shu", 3, ["xiaoji", "yizhuang"], ["name:null|null"]], + yxs_luobinhan: ["male", "wu", 4, ["xiadao", "sheshu", "lguiyin"], ["name:null|null"]], + yxs_chengjisihan: ["male", "qun", 4, ["mashu", "qianglue"], ["name:孛儿只斤|铁木真"]], + yxs_mingchenghuanghou: ["female", "shu", 3, ["tiewan", "chajue"], ["name:闵|兹映"]], + yxs_wangzhaojun: ["female", "wei", 3, ["heqin", "wluoyan"], ["name:王|嫱"]], yxs_luocheng: ["male", "wu", 4, ["hanqiang", "biaoqi"]], yxs_direnjie: ["male", "wei", 3, ["shentan", "kanpo"]], yxs_sunwu: ["male", "wu", 3, ["bingsheng", "taolue"]], yxs_chengyaojin: ["male", "shu", 4, ["sanbanfu"]], - yxs_yujix: ["female", "shu", 3, ["ysheshen", "changnian"]], - yxs_xiangyu: ["male", "shu", 4, ["wushuang", "ciqiu"]], + yxs_yujix: ["female", "shu", 3, ["ysheshen", "changnian"], ["name:null|null"]], + yxs_xiangyu: ["male", "shu", 4, ["wushuang", "ciqiu"], ["name:项|籍"]], yxs_yingzheng: ["male", "qun", 4, ["jianxiong", "batu"]], yxs_yuefei: ["male", "qun", 4, ["longdan", "wumu"]], - yxs_fuermosi: ["male", "wei", 3, ["yanyi", "jiean"]], - yxs_guiguzi: ["male", "qun", 3, ["baihe", "yinyang", "xiushen"]], - yxs_xiaoqiao: ["female", "wu", 3, ["chujia", "zhijie"]], - yxs_luzhishen: ["male", "wei", 4, ["yxsdili", "kuangchan"]], + yxs_fuermosi: ["male", "wei", 3, ["yanyi", "jiean"], ["name:福尔摩斯|夏洛克"]], + yxs_guiguzi: ["male", "qun", 3, ["baihe", "yinyang", "xiushen"], ["name:王|诩"]], + yxs_xiaoqiao: ["female", "wu", 3, ["chujia", "zhijie"], ["name:桥|null"]], + yxs_luzhishen: ["male", "wei", 4, ["yxsdili", "kuangchan"], ["name:鲁|达"]], yxs_zhaoyong: ["male", "shu", 3, ["zyhufu", "hanbei"]], yxs_yangguang: ["male", "qun", 3, ["shiqin", "yaoyi"]], - yxs_tangbohu: ["male", "qun", 3, ["luobi", "fengliu"]], + yxs_tangbohu: ["male", "qun", 3, ["luobi", "fengliu"], ["name:唐|寅"]], yxs_zhangsanfeng: ["male", "wei", 4, ["zbudao", "taiji"]], - yxs_nandinggeer: ["female", "shu", 3, ["huli", "xianqu", "yixin"]], + yxs_nandinggeer: ["female", "shu", 3, ["huli", "xianqu", "yixin"], ["name:南丁格尔|弗洛伦斯"]], yxs_weizhongxian: ["male", "qun", 3, ["zhuxin", "wlianhuan"]], - yxs_meixi: ["female", "shu", 3, ["liebo", "yaoji"]], - yxs_lanlinwang: ["male", "shu", 4, ["guimian", "lyuxue"]], + yxs_meixi: ["female", "shu", 3, ["liebo", "yaoji"], ["name:嬉|null"]], + yxs_lanlinwang: ["male", "shu", 4, ["guimian", "lyuxue"], ["name:高|肃"]], }, characterIntro: { yxs_qinqiong: @@ -3152,7 +3152,7 @@ game.import("character", function () { yixin_info: "限定技,你可以弃置两张牌,然后令一名已受伤角色回复X点体力并摸4-X张牌(X为该角色已损失的体力值且不超过4)。", xianqu: "先驱", - xianqu_info: "锁定技,你不能成为点数小于8的杀的目标。", + xianqu_info: "锁定技,你不能成为点数小于8的【杀】的目标。", zbudao: "布道", zbudao_info: "摸牌阶段,你可以额外摸一张牌,然后将摸到的牌中的一张交给一名其他角色。", taiji: "太极", @@ -3273,7 +3273,7 @@ game.import("character", function () { "出牌阶段限一次,你可以弃置一名其他角色的一张牌,若此牌是基本牌或普通锦囊,你可以将一张手牌当此牌使用;否则你须弃置一张牌。", cike: "刺客", cike_info: - "你对别的角色出【杀】时可以选择做一次判定:若判定牌为红色花色,则此【杀】不可回避,直接命中;若判定牌为黑色花色,你可以选择弃掉对方一张牌。", + "你对其他角色出【杀】时可以选择做一次判定:若判定牌为红色花色,则此【杀】不可回避,直接命中;若判定牌为黑色花色,你可以选择弃掉对方一张牌。", qiangyun: "强运", qiangyun_info: "每当你失去最后一张手牌,可摸两张牌。", ducai: "独裁", @@ -3311,7 +3311,7 @@ game.import("character", function () { jianai_info: "每当你回复1点体力,可以令所有其他角色回复1点体力。", bolehuiyan: "慧眼", bolehuiyan_info: - "当一名有手牌的其他角色成为来源不为你的杀的目标时,你可以预言此杀能否命中,若预言正确,你摸一张牌,否则你须弃置一张牌。每回合限发动一次。", + "当一名有手牌的其他角色成为来源不为你的【杀】的目标时,你可以预言此【杀】能否命中,若预言正确,你摸一张牌,否则你须弃置一张牌。每回合限发动一次。", xiangma: "相马", xiangma_info: "锁定技,只要你的体力值大于2点,你的进攻距离+1;只要你的体力值为2点或更低,你的防御距离+1。", diff --git a/character/zhuogui.js b/character/zhuogui.js index fc6fe816e1..1aa6f7efc5 100644 --- a/character/zhuogui.js +++ b/character/zhuogui.js @@ -330,7 +330,7 @@ game.import("character", function () { qiangzheng: "强征", qiangzheng_info: "锁定技,结束阶段,你获得一名其他角色的一张手牌。", zuijiu: "醉酒", - zuijiu_info: "锁定技,你的黑杀造成的伤害+1,造成伤害后须弃置一张手牌。", + zuijiu_info: "锁定技,你的黑【杀】造成的伤害+1,造成伤害后须弃置一张手牌。", heiwuchang: "黑无常", suoling: "索令", diff --git a/deno.json b/deno.json new file mode 100644 index 0000000000..d880f17eea --- /dev/null +++ b/deno.json @@ -0,0 +1,11 @@ +{ + "imports": { + "express": "https://esm.sh/express@4.19.2", + "minimist": "https://esm.sh/minimist@1.2.8", + "body-parser": "https://esm.sh/body-parser@1.20.2" + }, + "tasks": { + "start": "deno run --allow-read --allow-net --allow-env noname-server.js", + "watch": "deno run --allow-read --allow-net --allow-env --watch noname-server.js" + } +} diff --git a/docker/docker.md b/docker/docker.md new file mode 100644 index 0000000000..1a73ed3927 --- /dev/null +++ b/docker/docker.md @@ -0,0 +1,26 @@ +### 使用 docker 运行 noname + +/docker/index.js 来自[noname-server](https://github.com/nonameShijian/noname-server) + +1.克隆存储库 + +```shell +git clone -b master --depth=1 https://github.com/libccy/noname.git +cd noname +``` + +2. 构建 + +```shell +docker build -t noname . +``` + +3. 启动 + +```shell +docker run -dit --name noname --restart=unless-stopped -p 8734:8089 -p 8324:8080 noname +``` + +web 游戏界面: `8734` +联机大厅: `8324` +端口可以自己修改 diff --git a/docker/index.js b/docker/index.js new file mode 100644 index 0000000000..39052fd8da --- /dev/null +++ b/docker/index.js @@ -0,0 +1,311 @@ +try { + const express = require("express"); + const minimist = require("minimist"); + const bodyParser = require("body-parser"); + const app = express(); + const fs = require("fs"); + const path = require("path"); + + const oneYear = 60 * 1000 * 60 * 24 * 365; + + // 解析命令行参数 + // 示例: -s --maxAge 100 + const argv = minimist(process.argv.slice(2), { + alias: { server: "s" }, + default: { maxAge: oneYear }, + }); + + app.use( + bodyParser.json({ + limit: "10240mb", + }) + ); + app.use( + bodyParser.urlencoded({ + limit: "10240mb", + extended: true, //需明确设置 + }) + ); + function join(url) { + return path.join(__dirname, url); + } + + function isInProject(url) { + return path.normalize(join(url)).startsWith(__dirname); + } + + // parse application/x-www-form-urlencoded + app.use(bodyParser.urlencoded({ extended: false })); + // parse application/json + app.use(bodyParser.json()); + + // 全局 中间件 解决所有路由的 跨域问题 + app.all("*", function (req, res, next) { + res.header("Access-Control-Allow-Origin", "*"); + res.header( + "Access-Control-Allow-Headers", + "X-Requested-With,Content-Type" + ); + res.header("Access-Control-Allow-Methods", "GET,POST,OPTIONS"); + next(); + }); + + // 根据参数设置 maxAge + const maxAge = argv.server ? argv.maxAge : 0; + + app.use(express.static(__dirname, { maxAge: maxAge })); + + app.get("/", (req, res) => { + res.send(fs.readFileSync(join("index.html"))); + }); + + app.get("/createDir", (req, res) => { + const { dir } = req.query; + if (!isInProject(dir)) { + throw new Error(`只能访问${__dirname}的文件或文件夹`); + } + if (!fs.existsSync(join(dir))) { + fs.mkdirSync(join(dir), { recursive: true }); + } else { + if (!fs.statSync(join(dir)).isDirectory()) { + throw new Error(`${join(dir)}不是文件夹`); + } + } + res.json(successfulJson(true)); + }); + + app.get("/removeDir", (req, res) => { + const { dir } = req.query; + if (!isInProject(dir)) { + throw new Error(`只能访问${__dirname}的文件或文件夹`); + } + if (fs.existsSync(join(dir))) { + if (!fs.statSync(join(dir)).isDirectory()) { + throw new Error(`${join(dir)}不是文件夹`); + } + fs.rmdirSync(join(dir), { recursive: true }); + } + res.json(successfulJson(true)); + }); + + app.get("/readFile", (req, res) => { + const { fileName } = req.query; + if (!isInProject(fileName)) { + throw new Error(`只能访问${__dirname}的文件或文件夹`); + } + if (fs.existsSync(join(fileName))) { + res.json( + successfulJson( + Array.prototype.slice.call( + new Uint8Array(fs.readFileSync(join(fileName))) + ) + ) + ); + } else { + res.json(failedJson(404, "文件不存在")); + } + }); + + app.get("/readFileAsText", (req, res) => { + const { fileName } = req.query; + if (!isInProject(fileName)) { + throw new Error(`只能访问${__dirname}的文件或文件夹`); + } + if (fs.existsSync(join(fileName))) { + res.json(successfulJson(fs.readFileSync(join(fileName), "utf-8"))); + } else { + res.json(failedJson(404, "文件不存在")); + } + }); + + app.post("/writeFile", (req, res) => { + const { path: p, data } = req.body; + if (!isInProject(p)) { + throw new Error(`只能访问${__dirname}的文件或文件夹`); + } + fs.mkdirSync(path.dirname(join(p)), { recursive: true }); + fs.writeFileSync(join(p), Buffer.from(data)); + res.json(successfulJson(true)); + }); + + app.get("/removeFile", (req, res) => { + const { fileName } = req.query; + if (!isInProject(fileName)) { + throw new Error(`只能访问${__dirname}的文件或文件夹`); + } + if (!fs.existsSync(join(fileName))) { + throw new Error(`文件不存在`); + } + const stat = fs.statSync(join(fileName)); + if (stat.isDirectory()) { + throw new Error("不能删除文件夹"); + } + fs.unlinkSync(join(fileName)); + res.json(successfulJson(true)); + }); + + app.get("/getFileList", (req, res) => { + const { dir } = req.query; + if (!isInProject(dir)) { + throw new Error(`只能访问${__dirname}的文件或文件夹`); + } + if (!fs.existsSync(join(dir))) { + throw new Error(`文件夹不存在`); + } + const stat = fs.statSync(join(dir)); + if (stat.isFile()) { + throw new Error("getFileList只适用于文件夹而不是文件"); + } + const files = [], + folders = []; + try { + fs.readdir(join(dir), (err, filelist) => { + if (err) { + res.json(failedJson(500, String(err))); + return; + } + for (let i = 0; i < filelist.length; i++) { + if (filelist[i][0] != "." && filelist[i][0] != "_") { + if ( + fs + .statSync(join(dir) + "/" + filelist[i]) + .isDirectory() + ) { + folders.push(filelist[i]); + } else { + files.push(filelist[i]); + } + } + } + res.json(successfulJson({ folders, files })); + }); + } catch (e) { + res.json(failedJson(500, String(e))); + } + }); + + app.get("/checkFile", (req, res) => { + const { fileName } = req.query; + if (!isInProject(fileName)) { + throw new Error(`只能访问${__dirname}的文件或文件夹`); + } + try { + if (fs.statSync(join(fileName)).isFile()) { + res.json(successfulJson()); + } else { + res.json(failedJson(404, "不是一个文件")); + } + } catch (error) { + res.json(failedJson(404, "文件不存在或无法访问")); + } + }); + + app.get("/checkDir", (req, res) => { + const { dir } = req.query; + if (!isInProject(dir)) { + throw new Error(`只能访问${__dirname}的文件或文件夹`); + } + try { + if (fs.statSync(join(dir)).isDirectory()) { + res.json(successfulJson()); + } else { + res.json(failedJson(404, "不是一个文件夹")); + } + } catch (error) { + res.json(failedJson(404, "文件夹不存在或无法访问")); + } + }); + + app.use((req, res, next) => { + res.status(404).send("Sorry can't find that!"); + }); + + app.use(function (err, req, res, next) { + console.log(err); + return res.json(failedJson(400, String(err))); + }); + + app.listen(8089, () => { + console.log("应用正在使用 8089 端口以提供无名杀本地服务器功能!"); + if (!process.argv[2]) + require("child_process").exec("start http://localhost:8089/"); + }); + + class ReturnData { + success; + + code; + + errorMsg; + + data; + + constructor() {} + + getSuccess() { + return this.success; + } + + setSuccess(success) { + this.success = success; + } + + getCode() { + return this.code; + } + + setCode(errorCode) { + this.code = errorCode; + } + + getErrorMsg() { + return this.errorMsg; + } + + setErrorMsg(errorMsg) { + this.errorMsg = errorMsg; + } + + getData() { + this.data; + } + + setData(data) { + this.data = data; + } + } + + /** + * Business is successful. + * + * @param data return data. + * + * @return json. + */ + function successfulJson(data) { + const returnData = new ReturnData(); + returnData.setSuccess(true); + returnData.setCode(200); + returnData.setData(data); + return returnData; + } + + /** + * Business is failed. + * + * @param code error code. + * @param message message. + * + * @return json. + */ + function failedJson(code, message) { + const returnData = new ReturnData(); + returnData.setSuccess(false); + returnData.setCode(code); + returnData.setErrorMsg(message); + return returnData; + } +} catch (e) { + console.error("本地服务器启动失败: "); + console.error(e); +} diff --git a/docker/start.sh b/docker/start.sh new file mode 100644 index 0000000000..09ed3817ed --- /dev/null +++ b/docker/start.sh @@ -0,0 +1,2 @@ +node noname-server.js --server & +(cd game && node server.js) diff --git a/game/asset.js b/game/asset.js index 9cde3a9b0d..13bb0192c9 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list = [ - "v1.10.13", + "v1.10.14", /*audio start*/ "audio/background/aozhan_chaoming.mp3", "audio/background/aozhan_online.mp3", @@ -312,10 +312,13 @@ window.noname_asset_list = [ "audio/die/dc_mengda.mp3", "audio/die/dc_ruiji.mp3", "audio/die/dc_sb_guanping.mp3", + "audio/die/dc_sb_jiaxu.mp3", + "audio/die/dc_sb_jiaxu_shadow.mp3", "audio/die/dc_sb_lusu.mp3", "audio/die/dc_sb_lusu_shadow.mp3", "audio/die/dc_sb_simayi.mp3", "audio/die/dc_sb_simayi_shadow.mp3", + "audio/die/dc_sb_zhangxiu.mp3", "audio/die/dc_sb_zhouyu.mp3", "audio/die/dc_sb_zhouyu_shadow.mp3", "audio/die/dc_sb_zhugejin.mp3", @@ -376,6 +379,7 @@ window.noname_asset_list = [ "audio/die/fanjiangzhangda.mp3", "audio/die/fanyufeng.mp3", "audio/die/fazheng.mp3", + "audio/die/feiyao.mp3", "audio/die/feiyi.mp3", "audio/die/fengfang.mp3", "audio/die/fengfangnv.mp3", @@ -443,6 +447,7 @@ window.noname_asset_list = [ "audio/die/gz_wujing.mp3", "audio/die/gz_xf_sufei.mp3", "audio/die/gz_xiahouba.mp3", + "audio/die/gz_xusheng.mp3", "audio/die/gz_xuyou.mp3", "audio/die/gz_yanbaihu.mp3", "audio/die/gz_yuji.mp3", @@ -465,6 +470,10 @@ window.noname_asset_list = [ "audio/die/hetaihou.mp3", "audio/die/heyan.mp3", "audio/die/huaman.mp3", + "audio/die/huan_zhanghe.mp3", + "audio/die/huan_zhaoyun.mp3", + "audio/die/huan_zhugeliang.mp3", + "audio/die/huan_zhugeliang_shadow.mp3", "audio/die/huanfan.mp3", "audio/die/huangchengyan.mp3", "audio/die/huangfusong.mp3", @@ -509,6 +518,9 @@ window.noname_asset_list = [ "audio/die/jsp_caoren.mp3", "audio/die/jsp_guanyu.mp3", "audio/die/jsp_huangyueying.mp3", + "audio/die/jsrg_caocao.mp3", + "audio/die/jsrg_liubei.mp3", + "audio/die/jsrg_sunjian.mp3", "audio/die/junk_guanyu.mp3", "audio/die/kanze.mp3", "audio/die/kebineng.mp3", @@ -610,7 +622,11 @@ window.noname_asset_list = [ "audio/die/mb_caomao.mp3", "audio/die/mb_chengui.mp3", "audio/die/mb_huban.mp3", + "audio/die/mb_simafu.mp3", + "audio/die/mb_simazhou.mp3", "audio/die/mb_sp_guanqiujian.mp3", + "audio/die/mb_wangjing.mp3", + "audio/die/mb_wenqin.mp3", "audio/die/mb_xianglang.mp3", "audio/die/mengda.mp3", "audio/die/menghuo.mp3", @@ -621,6 +637,7 @@ window.noname_asset_list = [ "audio/die/miheng.mp3", "audio/die/mizhu.mp3", "audio/die/mp_liuling.mp3", + "audio/die/mp_wangrong.mp3", "audio/die/muludawang.mp3", "audio/die/mushun.mp3", "audio/die/nanhualaoxian.mp3", @@ -628,10 +645,12 @@ window.noname_asset_list = [ "audio/die/neo_xuchu.mp3", "audio/die/neo_zhouyu.mp3", "audio/die/new_caoren.mp3", + "audio/die/new_simayi.mp3", "audio/die/nezha.mp3", "audio/die/niufu.mp3", "audio/die/niujin.mp3", "audio/die/ns_zanghong.mp3", + "audio/die/ol_caifuren.mp3", "audio/die/ol_caiwenji.mp3", "audio/die/ol_chendeng.mp3", "audio/die/ol_dengai.mp3", @@ -641,12 +660,14 @@ window.noname_asset_list = [ "audio/die/ol_dingyuan.mp3", "audio/die/ol_dongzhao.mp3", "audio/die/ol_dongzhuo.mp3", + "audio/die/ol_fazheng.mp3", "audio/die/ol_feiyi.mp3", "audio/die/ol_furong.mp3", "audio/die/ol_huangzhong.mp3", "audio/die/ol_huaxin.mp3", "audio/die/ol_huban.mp3", "audio/die/ol_hujinding.mp3", + "audio/die/ol_jiangwan.mp3", "audio/die/ol_jiangwei.mp3", "audio/die/ol_lisu.mp3", "audio/die/ol_liuba.mp3", @@ -664,6 +685,9 @@ window.noname_asset_list = [ "audio/die/ol_qianzhao.mp3", "audio/die/ol_sb_guanyu.mp3", "audio/die/ol_sb_jiangwei.mp3", + "audio/die/ol_sb_pangtong.mp3", + "audio/die/ol_sb_pangtong2.mp3", + "audio/die/ol_sb_pangtong3.mp3", "audio/die/ol_sb_taishici.mp3", "audio/die/ol_sb_yuanshao.mp3", "audio/die/ol_sb_yuanshao_shadow.mp3", @@ -878,6 +902,7 @@ window.noname_asset_list = [ "audio/die/sb_jiangwei.mp3", "audio/die/sb_liubei.mp3", "audio/die/sb_liubiao.mp3", + "audio/die/sb_luxun.mp3", "audio/die/sb_lvmeng.mp3", "audio/die/sb_machao.mp3", "audio/die/sb_menghuo.mp3", @@ -1011,6 +1036,7 @@ window.noname_asset_list = [ "audio/die/star_caoren.mp3", "audio/die/star_dongzhuo.mp3", "audio/die/star_sunjian.mp3", + "audio/die/star_sunshangxiang.mp3", "audio/die/star_yuanshao.mp3", "audio/die/star_yuanshu.mp3", "audio/die/star_zhangchunhua.mp3", @@ -1023,6 +1049,7 @@ window.noname_asset_list = [ "audio/die/sunhuan.mp3", "audio/die/sunjian.mp3", "audio/die/sunlang.mp3", + "audio/die/sunli.mp3", "audio/die/sunliang.mp3", "audio/die/sunlingluan.mp3", "audio/die/sunluban.mp3", @@ -1143,6 +1170,11 @@ window.noname_asset_list = [ "audio/die/wuban.mp3", "audio/die/wufan.mp3", "audio/die/wuguotai.mp3", + "audio/die/wuhujiang.mp3", + "audio/die/wuhujiang2.mp3", + "audio/die/wuhujiang3.mp3", + "audio/die/wuhujiang4.mp3", + "audio/die/wuhujiang5.mp3", "audio/die/wujing.mp3", "audio/die/wulan.mp3", "audio/die/wupu.mp3", @@ -1224,7 +1256,6 @@ window.noname_asset_list = [ "audio/die/xin_zhuran.mp3", "audio/die/xin_zhuzhi.mp3", "audio/die/xinchang.mp3", - "audio/die/xinfu_yuji.mp3", "audio/die/xingdaorong.mp3", "audio/die/xinpi.mp3", "audio/die/xinping.mp3", @@ -1238,6 +1269,7 @@ window.noname_asset_list = [ "audio/die/xugong.mp3", "audio/die/xuhuang.mp3", "audio/die/xujing.mp3", + "audio/die/xukun.mp3", "audio/die/xunchen.mp3", "audio/die/xunyou.mp3", "audio/die/xunyu.mp3", @@ -1301,6 +1333,7 @@ window.noname_asset_list = [ "audio/die/zangba.mp3", "audio/die/zerong.mp3", "audio/die/zhangbao.mp3", + "audio/die/zhangbu.mp3", "audio/die/zhangchangpu.mp3", "audio/die/zhangchu.mp3", "audio/die/zhangchunhua.mp3", @@ -1390,10 +1423,9 @@ window.noname_asset_list = [ "audio/die/zumao.mp3", "audio/die/zuoci.mp3", "audio/die/zuofen.mp3", - /*effect audio end*/ + /*dieaudio end*/ - /*skill audio begin*/ - "audio/skill/abyusa_dunying1.mp3", + /*skill audio begin*/ "audio/skill/abyusa_dunying1.mp3", "audio/skill/abyusa_dunying2.mp3", "audio/skill/abyusa_jueqing1.mp3", "audio/skill/abyusa_jueqing2.mp3", @@ -1647,6 +1679,8 @@ window.noname_asset_list = [ "audio/skill/chongxin2.mp3", "audio/skill/chongxu1.mp3", "audio/skill/chongxu2.mp3", + "audio/skill/chongzhen_huan_zhaoyun1.mp3", + "audio/skill/chongzhen_huan_zhaoyun2.mp3", "audio/skill/chongzhen1.mp3", "audio/skill/chongzhen2.mp3", "audio/skill/chouce1.mp3", @@ -2223,6 +2257,14 @@ window.noname_asset_list = [ "audio/skill/dcsantou2.mp3", "audio/skill/dcsaowei1.mp3", "audio/skill/dcsaowei2.mp3", + "audio/skill/dcsbfumou_dc_sb_jiaxu_shadow1.mp3", + "audio/skill/dcsbfumou_dc_sb_jiaxu_shadow2.mp3", + "audio/skill/dcsbfumou1.mp3", + "audio/skill/dcsbfumou2.mp3", + "audio/skill/dcsbfuxi1.mp3", + "audio/skill/dcsbfuxi2.mp3", + "audio/skill/dcsbhaoyi1.mp3", + "audio/skill/dcsbhaoyi2.mp3", "audio/skill/dcsbhoude1.mp3", "audio/skill/dcsbhoude2.mp3", "audio/skill/dcsbmengmou_dc_sb_lusu_shadow1.mp3", @@ -2245,6 +2287,14 @@ window.noname_asset_list = [ "audio/skill/dcsbronghuo_dc_sb_zhouyu_shadow2.mp3", "audio/skill/dcsbronghuo1.mp3", "audio/skill/dcsbronghuo2.mp3", + "audio/skill/dcsbrushi_dc_sb_jiaxu_shadow1.mp3", + "audio/skill/dcsbrushi_dc_sb_jiaxu_shadow2.mp3", + "audio/skill/dcsbrushi1.mp3", + "audio/skill/dcsbrushi2.mp3", + "audio/skill/dcsbsushen_dc_sb_jiaxu_shadow1.mp3", + "audio/skill/dcsbsushen_dc_sb_jiaxu_shadow2.mp3", + "audio/skill/dcsbsushen1.mp3", + "audio/skill/dcsbsushen2.mp3", "audio/skill/dcsbtaozhou1.mp3", "audio/skill/dcsbtaozhou2.mp3", "audio/skill/dcsbwuwei1.mp3", @@ -2638,8 +2688,9 @@ window.noname_asset_list = [ "audio/skill/fankui2.mp3", "audio/skill/fanxiang1.mp3", "audio/skill/fanxiang2.mp3", - "audio/skill/fencheng1.mp3", - "audio/skill/fencheng2.mp3", + "audio/skill/fazhu1.mp3", + "audio/skill/fazhu2.mp3", + "audio/skill/fazhu3.mp3", "audio/skill/fengji1.mp3", "audio/skill/fengji2.mp3", "audio/skill/fengjie1.mp3", @@ -3155,6 +3206,11 @@ window.noname_asset_list = [ "audio/skill/jilei2.mp3", "audio/skill/jili1.mp3", "audio/skill/jili2.mp3", + "audio/skill/jilin1.mp3", + "audio/skill/jilin2.mp3", + "audio/skill/jilin3.mp3", + "audio/skill/jilin4.mp3", + "audio/skill/jilin5.mp3", "audio/skill/jilue_fangzhu.mp3", "audio/skill/jilue_fangzhu1.mp3", "audio/skill/jilue_guicai.mp3", @@ -3238,6 +3294,27 @@ window.noname_asset_list = [ "audio/skill/jizhi2.mp3", "audio/skill/jspdanqi1.mp3", "audio/skill/jspdanqi2.mp3", + "audio/skill/jsrghuilie1.mp3", + "audio/skill/jsrghuilie2.mp3", + "audio/skill/jsrgjishan1.mp3", + "audio/skill/jsrgjishan2.mp3", + "audio/skill/jsrgjishan3.mp3", + "audio/skill/jsrgjishan4.mp3", + "audio/skill/jsrgjuelie1.mp3", + "audio/skill/jsrgjuelie2.mp3", + "audio/skill/jsrgjuelie3.mp3", + "audio/skill/jsrgjuelie4.mp3", + "audio/skill/jsrgpingrong1.mp3", + "audio/skill/jsrgpingrong2.mp3", + "audio/skill/jsrgpingrong3.mp3", + "audio/skill/jsrgpingtao1.mp3", + "audio/skill/jsrgpingtao2.mp3", + "audio/skill/jsrgzhenglve1.mp3", + "audio/skill/jsrgzhenglve2.mp3", + "audio/skill/jsrgzhenglve3.mp3", + "audio/skill/jsrgzhenglve4.mp3", + "audio/skill/jsrgzhenqiao1.mp3", + "audio/skill/jsrgzhenqiao2.mp3", "audio/skill/juanjia1.mp3", "audio/skill/juanjia2.mp3", "audio/skill/jubao1.mp3", @@ -3304,6 +3381,8 @@ window.noname_asset_list = [ "audio/skill/kanade_mapo2.mp3", "audio/skill/kangge1.mp3", "audio/skill/kangge2.mp3", + "audio/skill/kangli1.mp3", + "audio/skill/kangli2.mp3", "audio/skill/kanpo1.mp3", "audio/skill/kanpo2.mp3", "audio/skill/keji_re_lvmeng1.mp3", @@ -3381,6 +3460,8 @@ window.noname_asset_list = [ "audio/skill/lianhuo2.mp3", "audio/skill/lianji.mp3", "audio/skill/lianpo.mp3", + "audio/skill/lianpo_new_simayi1.mp3", + "audio/skill/lianpo_new_simayi2.mp3", "audio/skill/lianpo1.mp3", "audio/skill/lianpo2.mp3", "audio/skill/lianying1.mp3", @@ -3463,6 +3544,8 @@ window.noname_asset_list = [ "audio/skill/lkzhongzhuang2.mp3", "audio/skill/llqshenwei1.mp3", "audio/skill/llqshenwei2.mp3", + "audio/skill/longdan_sha_huan_zhaoyun1.mp3", + "audio/skill/longdan_sha_huan_zhaoyun2.mp3", "audio/skill/longdan_sha_re_zhaoyun1.mp3", "audio/skill/longdan_sha_re_zhaoyun2.mp3", "audio/skill/longdan_sha1.mp3", @@ -3528,6 +3611,17 @@ window.noname_asset_list = [ "audio/skill/mazui.mp3", "audio/skill/mbaosi1.mp3", "audio/skill/mbaosi2.mp3", + "audio/skill/mbbeiming1.mp3", + "audio/skill/mbbeiming2.mp3", + "audio/skill/mbbifeng1.mp3", + "audio/skill/mbbifeng2.mp3", + "audio/skill/mbbifeng3.mp3", + "audio/skill/mbchengxiong1.mp3", + "audio/skill/mbchengxiong2.mp3", + "audio/skill/mbchenjie1.mp3", + "audio/skill/mbchenjie2.mp3", + "audio/skill/mbchoumang1.mp3", + "audio/skill/mbchoumang2.mp3", "audio/skill/mbcuizhen1.mp3", "audio/skill/mbcuizhen2.mp3", "audio/skill/mbdaoshu1.mp3", @@ -3537,12 +3631,19 @@ window.noname_asset_list = [ "audio/skill/mbguli2.mp3", "audio/skill/mbhuiyao1.mp3", "audio/skill/mbhuiyao2.mp3", + "audio/skill/mbjiejian1.mp3", + "audio/skill/mbjiejian2.mp3", + "audio/skill/mbjiejian3.mp3", "audio/skill/mbjuejin1.mp3", "audio/skill/mbjuejin2.mp3", "audio/skill/mbkuangli1.mp3", "audio/skill/mbkuangli2.mp3", "audio/skill/mbkuili1.mp3", "audio/skill/mbkuili2.mp3", + "audio/skill/mbpanxiang1.mp3", + "audio/skill/mbpanxiang2.mp3", + "audio/skill/mbpanxiang3.mp3", + "audio/skill/mbpanxiang4.mp3", "audio/skill/mbqianlong1.mp3", "audio/skill/mbqianlong2.mp3", "audio/skill/mbqianlong3.mp3", @@ -3555,6 +3656,10 @@ window.noname_asset_list = [ "audio/skill/mbshihe2.mp3", "audio/skill/mbshishou1.mp3", "audio/skill/mbshishou2.mp3", + "audio/skill/mbsuwang1.mp3", + "audio/skill/mbsuwang2.mp3", + "audio/skill/mbwangzhuang1.mp3", + "audio/skill/mbwangzhuang2.mp3", "audio/skill/mbweiming1.mp3", "audio/skill/mbweiming2.mp3", "audio/skill/mbweiming3.mp3", @@ -3570,6 +3675,9 @@ window.noname_asset_list = [ "audio/skill/mbyilie3.mp3", "audio/skill/mbzhenfu1.mp3", "audio/skill/mbzhenfu2.mp3", + "audio/skill/mbzujin1.mp3", + "audio/skill/mbzujin2.mp3", + "audio/skill/mbzujin3.mp3", "audio/skill/mbzuoyou1.mp3", "audio/skill/mbzuoyou2.mp3", "audio/skill/meibu1.mp3", @@ -3609,6 +3717,7 @@ window.noname_asset_list = [ "audio/skill/mingjian1.mp3", "audio/skill/mingjian2.mp3", "audio/skill/mingjie1.mp3", + "audio/skill/mingjie2.mp3", "audio/skill/mingluan1.mp3", "audio/skill/mingluan2.mp3", "audio/skill/mingshi1.mp3", @@ -3656,10 +3765,14 @@ window.noname_asset_list = [ "audio/skill/mozhi2.mp3", "audio/skill/mpbishi1.mp3", "audio/skill/mpbishi2.mp3", + "audio/skill/mpjianlin1.mp3", + "audio/skill/mpjianlin2.mp3", "audio/skill/mpjiusong1.mp3", "audio/skill/mpjiusong2.mp3", "audio/skill/mpmaotao1.mp3", "audio/skill/mpmaotao2.mp3", + "audio/skill/mpsixiao1.mp3", + "audio/skill/mpsixiao2.mp3", "audio/skill/mubing1.mp3", "audio/skill/mubing2.mp3", "audio/skill/mumu1.mp3", @@ -3795,6 +3908,8 @@ window.noname_asset_list = [ "audio/skill/olduanliang2.mp3", "audio/skill/oldzhenlie1.mp3", "audio/skill/oldzhenlie2.mp3", + "audio/skill/olenyuan1.mp3", + "audio/skill/olenyuan2.mp3", "audio/skill/olfangquan_shen_caopi1.mp3", "audio/skill/olfangquan1.mp3", "audio/skill/olfangquan2.mp3", @@ -3836,6 +3951,11 @@ window.noname_asset_list = [ "audio/skill/olhunzi_re_sunyi2.mp3", "audio/skill/olhunzi1.mp3", "audio/skill/olhunzi2.mp3", + "audio/skill/olhuyi1.mp3", + "audio/skill/olhuyi2.mp3", + "audio/skill/olhuyi3.mp3", + "audio/skill/olhuyi4.mp3", + "audio/skill/olhuyi5.mp3", "audio/skill/oljiane1.mp3", "audio/skill/oljiane2.mp3", "audio/skill/oljianhe1.mp3", @@ -3885,6 +4005,8 @@ window.noname_asset_list = [ "audio/skill/olpijing2.mp3", "audio/skill/olqiejian1.mp3", "audio/skill/olqiejian2.mp3", + "audio/skill/olqieting1.mp3", + "audio/skill/olqieting2.mp3", "audio/skill/olqingya1.mp3", "audio/skill/olqingya2.mp3", "audio/skill/olqingyi1.mp3", @@ -3917,6 +4039,18 @@ window.noname_asset_list = [ "audio/skill/olsbhetao1.mp3", "audio/skill/olsbhetao2.mp3", "audio/skill/olsbhetao3.mp3", + "audio/skill/olsbhongtu1.mp3", + "audio/skill/olsbhongtu2.mp3", + "audio/skill/olsbhongtu3.mp3", + "audio/skill/olsbhongtu4.mp3", + "audio/skill/olsbhongtu5.mp3", + "audio/skill/olsbhongtu6.mp3", + "audio/skill/olsbqiwu1.mp3", + "audio/skill/olsbqiwu2.mp3", + "audio/skill/olsbqiwu3.mp3", + "audio/skill/olsbqiwu4.mp3", + "audio/skill/olsbqiwu5.mp3", + "audio/skill/olsbqiwu6.mp3", "audio/skill/olsbranji1.mp3", "audio/skill/olsbranji2.mp3", "audio/skill/olsbshenli_ol_sb_yuanshao_shadow1.mp3", @@ -3993,10 +4127,14 @@ window.noname_asset_list = [ "audio/skill/olxinggu2.mp3", "audio/skill/olxiuhao1.mp3", "audio/skill/olxiuhao2.mp3", + "audio/skill/olxuanhuo1.mp3", + "audio/skill/olxuanhuo2.mp3", "audio/skill/olxuanzhu1.mp3", "audio/skill/olxuanzhu2.mp3", "audio/skill/olxueyi1.mp3", "audio/skill/olxueyi2.mp3", + "audio/skill/olxvfa1.mp3", + "audio/skill/olxvfa2.mp3", "audio/skill/olyicheng1.mp3", "audio/skill/olyicheng2.mp3", "audio/skill/olzaowang1.mp3", @@ -4021,6 +4159,8 @@ window.noname_asset_list = [ "audio/skill/olzhubi2.mp3", "audio/skill/olzhuyan1.mp3", "audio/skill/olzhuyan2.mp3", + "audio/skill/olziruo1.mp3", + "audio/skill/olziruo2.mp3", "audio/skill/olzuolian1.mp3", "audio/skill/olzuolian2.mp3", "audio/skill/paiyi_re_zhonghui1.mp3", @@ -4102,6 +4242,8 @@ window.noname_asset_list = [ "audio/skill/qiaobian2.mp3", "audio/skill/qiaoli1.mp3", "audio/skill/qiaoli2.mp3", + "audio/skill/qiaomeng_xin_gongsunzan1.mp3", + "audio/skill/qiaomeng_xin_gongsunzan2.mp3", "audio/skill/qiaomeng1.mp3", "audio/skill/qiaomeng2.mp3", "audio/skill/qiaoshi1.mp3", @@ -4300,6 +4442,8 @@ window.noname_asset_list = [ "audio/skill/regongji2.mp3", "audio/skill/reguhuo1.mp3", "audio/skill/reguhuo2.mp3", + "audio/skill/reguicai_new_simayi1.mp3", + "audio/skill/reguicai_new_simayi2.mp3", "audio/skill/reguicai1.mp3", "audio/skill/reguicai2.mp3", "audio/skill/reguose1.mp3", @@ -4520,8 +4664,6 @@ window.noname_asset_list = [ "audio/skill/reyanyu2.mp3", "audio/skill/reyanzhu1.mp3", "audio/skill/reyanzhu2.mp3", - "audio/skill/reyicong_dc_gongsunzan.mp3", - "audio/skill/reyicong_dc_gongsunzan1.mp3", "audio/skill/reyicong1.mp3", "audio/skill/reyicong2.mp3", "audio/skill/reyiji1.mp3", @@ -4693,6 +4835,8 @@ window.noname_asset_list = [ "audio/skill/sbliangzhu2.mp3", "audio/skill/sblianhuan1.mp3", "audio/skill/sblianhuan2.mp3", + "audio/skill/sblianying1.mp3", + "audio/skill/sblianying2.mp3", "audio/skill/sbliegong1.mp3", "audio/skill/sbliegong2.mp3", "audio/skill/sblieren1.mp3", @@ -4713,6 +4857,8 @@ window.noname_asset_list = [ "audio/skill/sbniepan2.mp3", "audio/skill/sbpaoxiao1.mp3", "audio/skill/sbpaoxiao2.mp3", + "audio/skill/sbqianxun1.mp3", + "audio/skill/sbqianxun2.mp3", "audio/skill/sbqiaobian1.mp3", "audio/skill/sbqiaobian2.mp3", "audio/skill/sbqiaoshi1.mp3", @@ -5132,6 +5278,8 @@ window.noname_asset_list = [ "audio/skill/stargangyi2.mp3", "audio/skill/starhaoshou1.mp3", "audio/skill/starhaoshou2.mp3", + "audio/skill/starjiaohao1.mp3", + "audio/skill/starjiaohao2.mp3", "audio/skill/starjiaowang1.mp3", "audio/skill/starjiaowang2.mp3", "audio/skill/starliangyan1.mp3", @@ -5144,6 +5292,8 @@ window.noname_asset_list = [ "audio/skill/starpizhi2.mp3", "audio/skill/starruijun1.mp3", "audio/skill/starruijun2.mp3", + "audio/skill/starsaying1.mp3", + "audio/skill/starsaying2.mp3", "audio/skill/starsujun1.mp3", "audio/skill/starsujun2.mp3", "audio/skill/starweilin1.mp3", @@ -5181,8 +5331,6 @@ window.noname_asset_list = [ "audio/skill/taomie1.mp3", "audio/skill/taomie2.mp3", "audio/skill/taomie3.mp3", - "audio/skill/taoxi1.mp3", - "audio/skill/taoxi2.mp3", "audio/skill/taoyin1.mp3", "audio/skill/taoyin2.mp3", "audio/skill/tashui1.mp3", @@ -5295,10 +5443,16 @@ window.noname_asset_list = [ "audio/skill/tuxing2.mp3", "audio/skill/twbaizu1.mp3", "audio/skill/twbaizu2.mp3", + "audio/skill/twbeiding1.mp3", + "audio/skill/twbeiding2.mp3", + "audio/skill/twbeidingx1.mp3", + "audio/skill/twbeidingx2.mp3", "audio/skill/twbingde1.mp3", "audio/skill/twbingde2.mp3", "audio/skill/twbudao1.mp3", "audio/skill/twbudao2.mp3", + "audio/skill/twchanggui1.mp3", + "audio/skill/twchanggui2.mp3", "audio/skill/twchaofeng1.mp3", "audio/skill/twchaofeng2.mp3", "audio/skill/twchayi1.mp3", @@ -5354,8 +5508,12 @@ window.noname_asset_list = [ "audio/skill/twhanyu2.mp3", "audio/skill/twhuajing1.mp3", "audio/skill/twhuajing2.mp3", + "audio/skill/twhuanji1.mp3", + "audio/skill/twhuanji2.mp3", "audio/skill/twhuiyuan1.mp3", "audio/skill/twhuiyuan2.mp3", + "audio/skill/twhunyou1.mp3", + "audio/skill/twhunyou2.mp3", "audio/skill/twhuzhong1.mp3", "audio/skill/twhuzhong2.mp3", "audio/skill/twjiange1.mp3", @@ -5370,10 +5528,16 @@ window.noname_asset_list = [ "audio/skill/twjichou2.mp3", "audio/skill/twjiekuang1.mp3", "audio/skill/twjiekuang2.mp3", + "audio/skill/twjielv1.mp3", + "audio/skill/twjielv2.mp3", + "audio/skill/twjielvx1.mp3", + "audio/skill/twjielvx2.mp3", "audio/skill/twjieqiu1.mp3", "audio/skill/twjieqiu2.mp3", "audio/skill/twjieyu1.mp3", "audio/skill/twjieyu2.mp3", + "audio/skill/twjiezhan1.mp3", + "audio/skill/twjiezhan2.mp3", "audio/skill/twjijiang1.mp3", "audio/skill/twjijiang2.mp3", "audio/skill/twjilun1.mp3", @@ -5392,6 +5556,8 @@ window.noname_asset_list = [ "audio/skill/twkaiji2.mp3", "audio/skill/twkaizeng1.mp3", "audio/skill/twkaizeng2.mp3", + "audio/skill/twkuiduan1.mp3", + "audio/skill/twkuiduan2.mp3", "audio/skill/twkujian1.mp3", "audio/skill/twkujian2.mp3", "audio/skill/twkujian3.mp3", @@ -5406,6 +5572,8 @@ window.noname_asset_list = [ "audio/skill/twlingbao2.mp3", "audio/skill/twlingfa1.mp3", "audio/skill/twlingfa2.mp3", + "audio/skill/twlongjin1.mp3", + "audio/skill/twlongjin2.mp3", "audio/skill/twluanlve1.mp3", "audio/skill/twluanlve2.mp3", "audio/skill/twluannian1.mp3", @@ -5565,6 +5733,8 @@ window.noname_asset_list = [ "audio/skill/wanrong2.mp3", "audio/skill/wansha_boss_lvbu31.mp3", "audio/skill/wansha_boss_lvbu32.mp3", + "audio/skill/wansha_new_simayi1.mp3", + "audio/skill/wansha_new_simayi2.mp3", "audio/skill/wansha_re_jiaxu1.mp3", "audio/skill/wansha_re_jiaxu2.mp3", "audio/skill/wansha1.mp3", @@ -5700,6 +5870,8 @@ window.noname_asset_list = [ "audio/skill/xianwei2.mp3", "audio/skill/xianzhen1.mp3", "audio/skill/xianzhen2.mp3", + "audio/skill/xianzhou_ol_caifuren1.mp3", + "audio/skill/xianzhou_ol_caifuren2.mp3", "audio/skill/xianzhou_xin_caifuren1.mp3", "audio/skill/xianzhou_xin_caifuren2.mp3", "audio/skill/xianzhou1.mp3", @@ -5951,16 +6123,12 @@ window.noname_asset_list = [ "audio/skill/xinlianhuan_ol_pangtong2.mp3", "audio/skill/xinlianhuan1.mp3", "audio/skill/xinlianhuan2.mp3", - "audio/skill/xinmieji1.mp3", - "audio/skill/xinmieji2.mp3", "audio/skill/xinniluan1.mp3", "audio/skill/xinniluan2.mp3", "audio/skill/xinpaiyi1.mp3", "audio/skill/xinpaiyi2.mp3", "audio/skill/xinpingkou1.mp3", "audio/skill/xinpingkou2.mp3", - "audio/skill/xinpojun1.mp3", - "audio/skill/xinpojun2.mp3", "audio/skill/xinqiaoshui1.mp3", "audio/skill/xinqiaoshui2.mp3", "audio/skill/xinqieting1.mp3", @@ -6179,8 +6347,14 @@ window.noname_asset_list = [ "audio/skill/yinghun_sunjian2.mp3", "audio/skill/yinghun1.mp3", "audio/skill/yinghun2.mp3", + "audio/skill/yingtian1.mp3", + "audio/skill/yingtian2.mp3", "audio/skill/yingyang1.mp3", "audio/skill/yingyang2.mp3", + "audio/skill/yingyou1.mp3", + "audio/skill/yingyou2.mp3", + "audio/skill/yingyou3.mp3", + "audio/skill/yingyou4.mp3", "audio/skill/yingyuan1.mp3", "audio/skill/yingyuan2.mp3", "audio/skill/yingzi1.mp3", @@ -6362,6 +6536,8 @@ window.noname_asset_list = [ "audio/skill/zhefu2.mp3", "audio/skill/zhendu1.mp3", "audio/skill/zhendu2.mp3", + "audio/skill/zhenfeng1.mp3", + "audio/skill/zhenfeng2.mp3", "audio/skill/zhengbi1.mp3", "audio/skill/zhengbi2.mp3", "audio/skill/zhengding1.mp3", @@ -7169,6 +7345,7 @@ window.noname_asset_list = [ "image/character/caorui.jpg", "image/character/caoshuang.jpg", "image/character/caosong.jpg", + "image/character/caoteng.jpg", "image/character/caoxi.jpg", "image/character/caoxian.jpg", "image/character/caoxiancaohua.jpg", @@ -7186,6 +7363,7 @@ window.noname_asset_list = [ "image/character/chendeng.jpg", "image/character/chendong.jpg", "image/character/chengbing.jpg", + "image/character/chengji.jpg", "image/character/chengjichengcui.jpg", "image/character/chengong.jpg", "image/character/chengpu.jpg", @@ -7265,12 +7443,18 @@ window.noname_asset_list = [ "image/character/dc_lvkuanglvxiang.jpg", "image/character/dc_mengda.jpg", "image/character/dc_mifuren.jpg", + "image/character/dc_noname.jpg", "image/character/dc_ruiji.jpg", + "image/character/dc_sb_caoang.jpg", + "image/character/dc_sb_dianwei.jpg", "image/character/dc_sb_guanping.jpg", + "image/character/dc_sb_jiaxu.jpg", + "image/character/dc_sb_jiaxu_shadow.jpg", "image/character/dc_sb_lusu.jpg", "image/character/dc_sb_lusu_shadow.jpg", "image/character/dc_sb_simayi.jpg", "image/character/dc_sb_simayi_shadow.jpg", + "image/character/dc_sb_zhangxiu.jpg", "image/character/dc_sb_zhouyu.jpg", "image/character/dc_sb_zhouyu_shadow.jpg", "image/character/dc_sb_zhugejin.jpg", @@ -7719,6 +7903,10 @@ window.noname_asset_list = [ "image/character/hs_zhishigushu.jpg", "image/character/hs_zhouzhuo.jpg", "image/character/huaman.jpg", + "image/character/huan_zhanghe.jpg", + "image/character/huan_zhaoyun.jpg", + "image/character/huan_zhugeliang.jpg", + "image/character/huan_zhugeliang_shadow.jpg", "image/character/huanfan.jpg", "image/character/huangchengyan.jpg", "image/character/huangfusong.jpg", @@ -7977,6 +8165,7 @@ window.noname_asset_list = [ "image/character/liyan.jpg", "image/character/liyi.jpg", "image/character/liyixiejing.jpg", + "image/character/lizhaojiaobo.jpg", "image/character/longwang.jpg", "image/character/longyufei.jpg", "image/character/luji.jpg", @@ -8016,9 +8205,15 @@ window.noname_asset_list = [ "image/character/mayuanyi.jpg", "image/character/mayunlu.jpg", "image/character/mazhong.jpg", + "image/character/mb_caomao.jpg", + "image/character/mb_caomao_dead.jpg", + "image/character/mb_caomao_shadow.jpg", "image/character/mb_chengui.jpg", "image/character/mb_huban.jpg", + "image/character/mb_simafu.jpg", + "image/character/mb_sp_guanqiujian.jpg", "image/character/mb_sunluyu.jpg", + "image/character/mb_wangjing.jpg", "image/character/mb_xianglang.jpg", "image/character/mengda.jpg", "image/character/menghuo.jpg", @@ -8029,6 +8224,7 @@ window.noname_asset_list = [ "image/character/miheng.jpg", "image/character/mizhu.jpg", "image/character/mp_liuling.jpg", + "image/character/mp_wangrong.jpg", "image/character/mtg_ayeni.jpg", "image/character/mtg_jiding.jpg", "image/character/mtg_jiesi.jpg", @@ -8040,6 +8236,7 @@ window.noname_asset_list = [ "image/character/nanhualaoxian.jpg", "image/character/nashime.jpg", "image/character/new_caoren.jpg", + "image/character/new_simayi.jpg", "image/character/nezha.jpg", "image/character/nianshou.jpg", "image/character/niufu.jpg", @@ -8135,6 +8332,7 @@ window.noname_asset_list = [ "image/character/ol_liru.jpg", "image/character/ol_lisu.jpg", "image/character/ol_liuba.jpg", + "image/character/ol_liubiao.jpg", "image/character/ol_liupi.jpg", "image/character/ol_liushan.jpg", "image/character/ol_liuyu.jpg", @@ -8163,6 +8361,7 @@ window.noname_asset_list = [ "image/character/ol_wangyi.jpg", "image/character/ol_weiyan.jpg", "image/character/ol_wenqin.jpg", + "image/character/ol_wuguotai.jpg", "image/character/ol_xiahouyuan.jpg", "image/character/ol_xiaoqiao.jpg", "image/character/ol_xinxianying.jpg", @@ -8523,7 +8722,9 @@ window.noname_asset_list = [ "image/character/sb_fazheng.jpg", "image/character/sb_ganning.jpg", "image/character/sb_gaoshun.jpg", + "image/character/sb_gongsunzan.jpg", "image/character/sb_guanyu.jpg", + "image/character/sb_handang.jpg", "image/character/sb_huanggai.jpg", "image/character/sb_huangyueying.jpg", "image/character/sb_huangzhong.jpg", @@ -8697,6 +8898,7 @@ window.noname_asset_list = [ "image/character/star_caoren.jpg", "image/character/star_dongzhuo.jpg", "image/character/star_sunjian.jpg", + "image/character/star_sunshangxiang.jpg", "image/character/star_yuanshao.jpg", "image/character/star_yuanshu.jpg", "image/character/star_zhangchunhua.jpg", @@ -8970,6 +9172,7 @@ window.noname_asset_list = [ "image/character/wuban.jpg", "image/character/wufan.jpg", "image/character/wuguotai.jpg", + "image/character/wuhujiang.jpg", "image/character/wujing.jpg", "image/character/wulan.jpg", "image/character/wupu.jpg", @@ -9035,6 +9238,7 @@ window.noname_asset_list = [ "image/character/xin_masu.jpg", "image/character/xin_panzhangmazhong.jpg", "image/character/xin_quancong.jpg", + "image/character/xin_simayi.jpg", "image/character/xin_sunliang.jpg", "image/character/xin_sunluban.jpg", "image/character/xin_sunquan.jpg", @@ -9122,6 +9326,7 @@ window.noname_asset_list = [ "image/character/yj_zhanghe.jpg", "image/character/yj_zhangliao.jpg", "image/character/yj_zhenji.jpg", + "image/character/yj_zhonghui.jpg", "image/character/yj_zhoubuyi.jpg", "image/character/yj_zhouji.jpg", "image/character/yl_luzhi.jpg", @@ -9192,6 +9397,7 @@ window.noname_asset_list = [ "image/character/zangba.jpg", "image/character/zerong.jpg", "image/character/zhangbao.jpg", + "image/character/zhangbu.jpg", "image/character/zhangchangpu.jpg", "image/character/zhangchu.jpg", "image/character/zhangchunhua.jpg", diff --git a/game/entry.js b/game/entry.js index bb3a8d2e2c..5d2ac5a806 100644 --- a/game/entry.js +++ b/game/entry.js @@ -1,5 +1,4 @@ -import { UpdateReason } from "../noname-compatible.js"; -import { game, get, lib, boot } from "../noname.js"; +import { game, get, lib, boot, onload } from "../noname.js"; import { canUseHttpProtocol, sendUpdate } from "../noname/init/index.js"; let [core, version] = get.coreInfo(); @@ -18,158 +17,167 @@ if (core === "chrome" && !isNaN(version) && version < 85) { window.open("https://github.com/libccy/noname/releases/tag/chromium77-client"); } */ - waitUpdate = game.tryUpdateClient(UpdateReason.UNDERSUPPORT); + waitUpdate = game.tryUpdateClient(/** UpdateReason.UNDERSUPPORT **/ 4); } -waitUpdate.then(boot).then(() => { - // 判断是否从file协议切换到http/s协议 - if (canUseHttpProtocol()) { - // 保存协议的切换状态 - const saveProtocol = () => { - const url = sendUpdate(); - if (typeof url == "string") { - if (typeof window.require == "function" && typeof window.process == "object") { - // @ts-ignore - const remote = require("@electron/remote"); - const thisWindow = remote.getCurrentWindow(); - thisWindow.loadURL(url); - } else { - location.href = url; +waitUpdate + .then(boot) + .then(() => { + // 判断是否从file协议切换到http/s协议 + if (canUseHttpProtocol()) { + // 保存协议的切换状态 + const saveProtocol = () => { + const url = sendUpdate(); + if (typeof url == "string") { + if (typeof window.require == "function" && typeof window.process == "object") { + // @ts-ignore + const remote = require("@electron/remote"); + const thisWindow = remote.getCurrentWindow(); + thisWindow.loadURL(url); + } else { + location.href = url; + } } - } - }; - /* + }; + /* 升级方法: 1. 游戏启动后导出数据,然后以http/s协议重启 2. 以http/s协议导入数据 3. 保存http/s协议的状态,以后不再以file协议启动 */ - // 导出数据到根目录的noname.config.txt - if (navigator.notification) { - navigator.notification.activityStart("正在进行升级", "请稍候"); - } - let data; - let export_data = function (data) { + // 导出数据到根目录的noname.config.txt if (navigator.notification) { - navigator.notification.activityStop(); - } - game.promises - .writeFile(lib.init.encode(JSON.stringify(data)), "./", "noname.config.txt") - .then(saveProtocol) - .catch(e => { - console.error("升级失败:", e); - }); - }; - // @ts-ignore - if (!lib.db) { - data = {}; - for (let i in localStorage) { - if (i.startsWith(lib.configprefix)) { - data[i] = localStorage[i]; - } + navigator.notification.activityStart("正在进行升级", "请稍候"); } - export_data(data); - } else { - game.getDB("config", null, function (data1) { - game.getDB("data", null, function (data2) { - export_data({ - config: data1, - data: data2, - }); - }); - }); - } - } else { - let searchParams = new URLSearchParams(location.search); - for (let [key, value] of searchParams) { - // 成功导入后删除noname.config.txt - if (key === "sendUpdate" && value === "true") { + let data; + let export_data = function (data) { if (navigator.notification) { - navigator.notification.activityStart("正在导入旧版数据", "请稍候"); + navigator.notification.activityStop(); } game.promises - .readFileAsText("noname.config.txt") - .then(data => { - return /** @type {Promise} */ ( - // eslint-disable-next-line no-async-promise-executor - new Promise(async (resolve, reject) => { - if (!data) return reject("!data"); - try { - data = JSON.parse(lib.init.decode(data)); - if (!data || typeof data != "object") { - throw "err"; + .writeFile(lib.init.encode(JSON.stringify(data)), "./", "noname.config.txt") + .then(saveProtocol) + .catch(e => { + console.error("升级失败:", e); + }); + }; + // @ts-ignore + if (!lib.db) { + data = {}; + for (let i in localStorage) { + if (i.startsWith(lib.configprefix)) { + data[i] = localStorage[i]; + } + } + export_data(data); + } else { + game.getDB("config", null, function (data1) { + game.getDB("data", null, function (data2) { + export_data({ + config: data1, + data: data2, + }); + }); + }); + } + } else { + let searchParams = new URLSearchParams(location.search); + for (let [key, value] of searchParams) { + // 成功导入后删除noname.config.txt + if (key === "sendUpdate" && value === "true") { + if (navigator.notification) { + navigator.notification.activityStart("正在导入旧版数据", "请稍候"); + } + return game.promises + .readFileAsText("noname.config.txt") + .then(data => { + return /** @type {Promise} */ ( + // eslint-disable-next-line no-async-promise-executor + new Promise(async (resolve, reject) => { + if (!data) return reject("!data"); + try { + data = JSON.parse(lib.init.decode(data)); + if (!data || typeof data != "object") { + throw "err"; + } + // @ts-ignore + if (lib.db && (!data.config || !data.data)) { + throw "err"; + } + } catch (e) { + console.log(e); + if (e == "err") { + alert("导入文件格式不正确"); + reject("导入文件格式不正确"); + } else { + alert("导入失败: " + e.message); + reject("导入失败: " + e.message); + } + return; } - // @ts-ignore - if (lib.db && (!data.config || !data.data)) { - throw "err"; + if (navigator.notification) { + navigator.notification.activityStop(); } - } catch (e) { - console.log(e); - if (e == "err") { - alert("导入文件格式不正确"); - reject("导入文件格式不正确"); + alert("升级前的配置导入成功, 即将自动重启"); + // @ts-ignore + if (!lib.db) { + const noname_inited = localStorage.getItem("noname_inited"); + const onlineKey = localStorage.getItem(lib.configprefix + "key"); + localStorage.clear(); + if (noname_inited) { + localStorage.setItem("noname_inited", noname_inited); + } + if (onlineKey) { + localStorage.setItem(lib.configprefix + "key", onlineKey); + } + for (let i in data) { + localStorage.setItem(i, data[i]); + } } else { - alert("导入失败: " + e.message); - reject("导入失败: " + e.message); - } - return; - } - if (navigator.notification) { - navigator.notification.activityStop(); - } - alert("升级前的配置导入成功, 即将自动重启"); - // @ts-ignore - if (!lib.db) { - const noname_inited = localStorage.getItem("noname_inited"); - const onlineKey = localStorage.getItem(lib.configprefix + "key"); - localStorage.clear(); - if (noname_inited) { - localStorage.setItem("noname_inited", noname_inited); - } - if (onlineKey) { - localStorage.setItem(lib.configprefix + "key", onlineKey); + for (let i in data.config) { + await game.putDB("config", i, data.config[i]); + lib.config[i] = data.config[i]; + } + for (let i in data.data) { + await game.putDB("data", i, data.data[i]); + } } - for (let i in data) { - localStorage.setItem(i, data[i]); - } - } else { - for (let i in data.config) { - await game.putDB("config", i, data.config[i]); - lib.config[i] = data.config[i]; - } - for (let i in data.data) { - await game.putDB("data", i, data.data[i]); - } - } - lib.init.background(); - resolve(); - }) - ); - }) - .then(() => { - return game.promises.removeFile("noname.config.txt"); - }) - .then(() => { + lib.init.background(); + resolve(); + }) + ); + }) + .then(() => { + return game.promises.removeFile("noname.config.txt"); + }) + .then(() => { + const url = new URL(location.href); + url.searchParams.delete("sendUpdate"); + location.href = url.toString(); + }) + .catch(e => { + if (navigator.notification) { + navigator.notification.activityStop(); + } + }); + } + // 新客户端导入扩展 + else if (key === "importExtensionName") { + lib.config.extensions.add(value); + + let waitings = []; + + waitings.push(game.promises.saveConfig("extensions", lib.config.extensions)); + waitings.push(game.promises.saveConfig(`extension_${value}_enable`, true)); + alert(`扩展${value}已导入成功,点击确定重启游戏`); + + return Promise.allSettled(waitings).then(() => { const url = new URL(location.href); - url.searchParams.delete("sendUpdate"); + url.searchParams.delete("importExtensionName"); location.href = url.toString(); - }) - .catch(e => { - if (navigator.notification) { - navigator.notification.activityStop(); - } }); - } - // 新客户端导入扩展 - else if (key === "importExtensionName") { - lib.config.extensions.add(value); - game.saveConfig("extensions", lib.config.extensions); - game.saveConfig(`extension_${value}_enable`, true); - alert(`扩展${value}已导入成功,点击确定重启游戏`); - const url = new URL(location.href); - url.searchParams.delete("importExtensionName"); - location.href = url.toString(); + } } } - } -}); + }) + .then(onload); diff --git a/game/game.js b/game/game.js index 8169baea68..3be493a193 100644 --- a/game/game.js +++ b/game/game.js @@ -10,12 +10,15 @@ const minSafariVersion = [14, 5, 0]; // 获取基础变量 + /** + * @type {import("../noname-compatible.js")} + */ const { game, get, util: { nonameInitialized, assetURL, userAgent }, UpdateReason, - } = await import("../noname-compatible.js"); + } = await import("../noname-compatible.js").catch(importFallback); // 使用到的文本 const globalText = { @@ -122,8 +125,7 @@ code, { module: ts.ModuleKind.CommonJS, - //@todo: ES2019 -> ES2020 - target: ts.ScriptTarget.ES2019, + target: ts.ScriptTarget.ES2020, inlineSourceMap: true, resolveJsonModule: true, esModuleInterop: true, @@ -205,5 +207,318 @@ // 将