diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..5c688e29 --- /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 bee0bbcb..fc7b15f3 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ 无名杀内置多种游戏模式和武将(及卡牌)包,拥有智能AI且可以实现单机、(弱)联机和局域网联机等多种游戏方式,并能通过扩展功能实现各种DIY设计,包括但不限于武将技能(含台词、配音)和卡牌设计、游戏模式设计、UI界面美化(含皮肤、特效)、功能扩展等 -主要交流平台——微信公众号:无名杀扩展交流、无名杀;百度贴吧:无名杀吧(现吧主:诗笺);无名杀QQ群和QQ频道(略);无名杀官网(略)等 +主要交流平台——无名杀GitHub官网;百度贴吧:无名杀吧(现吧主:诗笺);无名杀QQ群、QQ频道、微信公众号等 ★ 最重要的是:看教程,看教程,看教程!!! @@ -165,7 +165,7 @@ bug反馈: ## Part Ⅱ 无名杀原版README -noname-server.exe的源码见以下仓库: +noname-server.exe 的源码见以下仓库: https://github.com/nonameShijian/noname-server @@ -173,15 +173,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 (图片素材加载速度较慢,不推荐) @@ -190,8 +189,10 @@ https://spmario233.github.io/noname/index.html (图片素材加载速度较慢 GitHub: https://github.com/libccy/noname/releases/tag/chromium77-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"分支! diff --git a/audio/die/caimao.mp3 b/audio/die/caimao.mp3 new file mode 100644 index 00000000..dbf76d3a Binary files /dev/null and b/audio/die/caimao.mp3 differ diff --git a/audio/die/dc_sb_guanping.mp3 b/audio/die/dc_sb_guanping.mp3 new file mode 100644 index 00000000..a836e583 Binary files /dev/null and b/audio/die/dc_sb_guanping.mp3 differ diff --git a/audio/die/dc_sb_lusu_shadow.mp3 b/audio/die/dc_sb_lusu_shadow.mp3 new file mode 100644 index 00000000..c7411b2c Binary files /dev/null and b/audio/die/dc_sb_lusu_shadow.mp3 differ diff --git a/audio/die/dongzhuo.mp3 b/audio/die/dongzhuo.mp3 index 5c82b951..a5daa22e 100644 Binary files a/audio/die/dongzhuo.mp3 and b/audio/die/dongzhuo.mp3 differ diff --git a/audio/die/fuqian.mp3 b/audio/die/fuqian.mp3 new file mode 100644 index 00000000..58653abe Binary files /dev/null and b/audio/die/fuqian.mp3 differ diff --git a/audio/die/guanyue.mp3 b/audio/die/guanyue.mp3 new file mode 100644 index 00000000..89482cde Binary files /dev/null and b/audio/die/guanyue.mp3 differ diff --git a/audio/die/gz_jun_caocao.mp3 b/audio/die/gz_jun_caocao.mp3 index c0b5635c..59e6fc3f 100644 Binary files a/audio/die/gz_jun_caocao.mp3 and b/audio/die/gz_jun_caocao.mp3 differ diff --git a/audio/die/gz_jun_liubei.mp3 b/audio/die/gz_jun_liubei.mp3 index 7f6df894..6c640901 100644 Binary files a/audio/die/gz_jun_liubei.mp3 and b/audio/die/gz_jun_liubei.mp3 differ diff --git a/audio/die/gz_jun_sunquan.mp3 b/audio/die/gz_jun_sunquan.mp3 index d4a5a888..c908f14f 100644 Binary files a/audio/die/gz_jun_sunquan.mp3 and b/audio/die/gz_jun_sunquan.mp3 differ diff --git a/audio/die/gz_jun_zhangjiao.mp3 b/audio/die/gz_jun_zhangjiao.mp3 index 0d8718f5..86eda53f 100644 Binary files a/audio/die/gz_jun_zhangjiao.mp3 and b/audio/die/gz_jun_zhangjiao.mp3 differ diff --git a/audio/die/gz_xusheng.mp3 b/audio/die/gz_xusheng.mp3 new file mode 100644 index 00000000..f8dfc964 Binary files /dev/null and b/audio/die/gz_xusheng.mp3 differ diff --git a/audio/die/junk_sunquan.mp3 b/audio/die/junk_sunquan.mp3 deleted file mode 100644 index c2fc6e31..00000000 Binary files a/audio/die/junk_sunquan.mp3 and /dev/null differ diff --git a/audio/die/mb_simafu.mp3 b/audio/die/mb_simafu.mp3 new file mode 100644 index 00000000..0f3158b1 Binary files /dev/null and b/audio/die/mb_simafu.mp3 differ diff --git a/audio/die/mb_wangjing.mp3 b/audio/die/mb_wangjing.mp3 new file mode 100644 index 00000000..413eacfd Binary files /dev/null and b/audio/die/mb_wangjing.mp3 differ diff --git a/audio/die/mp_wangrong.mp3 b/audio/die/mp_wangrong.mp3 new file mode 100644 index 00000000..cf9400ec Binary files /dev/null and b/audio/die/mp_wangrong.mp3 differ diff --git a/audio/die/ol_caifuren.mp3 b/audio/die/ol_caifuren.mp3 new file mode 100644 index 00000000..5b01e7ed 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 00000000..3f9c2cb1 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 00000000..1a0b51bb Binary files /dev/null and b/audio/die/ol_jiangwan.mp3 differ diff --git a/audio/die/ol_liwan.mp3 b/audio/die/ol_liwan.mp3 new file mode 100644 index 00000000..2cf06d56 Binary files /dev/null and b/audio/die/ol_liwan.mp3 differ diff --git a/audio/die/ol_luyusheng.mp3 b/audio/die/ol_luyusheng.mp3 new file mode 100644 index 00000000..dbeaf975 Binary files /dev/null and b/audio/die/ol_luyusheng.mp3 differ diff --git a/audio/die/ol_pangde.mp3 b/audio/die/ol_pangde.mp3 index 346a4496..496f175f 100644 Binary files a/audio/die/ol_pangde.mp3 and b/audio/die/ol_pangde.mp3 differ diff --git a/audio/die/ol_sb_pangtong.mp3 b/audio/die/ol_sb_pangtong.mp3 new file mode 100644 index 00000000..f63eb6dc 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 00000000..4cd29b2f 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 00000000..0e9a085e Binary files /dev/null and b/audio/die/ol_sb_pangtong3.mp3 differ diff --git a/audio/die/ol_zhangliao.mp3 b/audio/die/ol_zhangliao.mp3 deleted file mode 100644 index 0aebd72a..00000000 Binary files a/audio/die/ol_zhangliao.mp3 and /dev/null differ diff --git a/audio/die/old_huaxiong.mp3 b/audio/die/old_huaxiong.mp3 new file mode 100644 index 00000000..ad106265 Binary files /dev/null and b/audio/die/old_huaxiong.mp3 differ diff --git a/audio/die/old_zhoutai.mp3 b/audio/die/old_zhoutai.mp3 new file mode 100644 index 00000000..80ff4c06 Binary files /dev/null and b/audio/die/old_zhoutai.mp3 differ diff --git a/audio/die/quyuan.mp3 b/audio/die/quyuan.mp3 new file mode 100644 index 00000000..f99a34e8 Binary files /dev/null and b/audio/die/quyuan.mp3 differ diff --git a/audio/die/re_lusu.mp3 b/audio/die/re_lusu.mp3 index af954c29..91e4d771 100644 Binary files a/audio/die/re_lusu.mp3 and b/audio/die/re_lusu.mp3 differ diff --git a/audio/die/re_yuji.mp3 b/audio/die/re_yuji.mp3 index 9546a33d..4cc88e36 100644 Binary files a/audio/die/re_yuji.mp3 and b/audio/die/re_yuji.mp3 differ diff --git a/audio/die/sb_huangyueying.mp3 b/audio/die/sb_huangyueying.mp3 index adc2bd3e..e590eae0 100644 Binary files a/audio/die/sb_huangyueying.mp3 and b/audio/die/sb_huangyueying.mp3 differ diff --git a/audio/die/sb_luxun.mp3 b/audio/die/sb_luxun.mp3 new file mode 100644 index 00000000..238fe39e Binary files /dev/null and b/audio/die/sb_luxun.mp3 differ diff --git a/audio/die/sp_wenpin.mp3 b/audio/die/sp_wenpin.mp3 index d0e4229c..fda2f67a 100644 Binary files a/audio/die/sp_wenpin.mp3 and b/audio/die/sp_wenpin.mp3 differ diff --git a/audio/die/sp_zhangjiao.mp3 b/audio/die/sp_zhangjiao.mp3 new file mode 100644 index 00000000..4c5320df Binary files /dev/null and b/audio/die/sp_zhangjiao.mp3 differ diff --git a/audio/die/star_sunshangxiang.mp3 b/audio/die/star_sunshangxiang.mp3 new file mode 100644 index 00000000..65407888 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 00000000..2f5b77d5 Binary files /dev/null and b/audio/die/sunli.mp3 differ diff --git a/audio/die/wenpin.mp3 b/audio/die/wenpin.mp3 index fda2f67a..770c3786 100644 Binary files a/audio/die/wenpin.mp3 and b/audio/die/wenpin.mp3 differ diff --git a/audio/die/wuhujiang.mp3 b/audio/die/wuhujiang.mp3 new file mode 100644 index 00000000..6b7e5ba1 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 00000000..6e7f0b6d 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 00000000..6f5968af 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 00000000..4d84df0b 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 00000000..57a930f0 Binary files /dev/null and b/audio/die/wuhujiang5.mp3 differ diff --git a/audio/die/ol_masu.mp3 b/audio/die/xin_masu.mp3 similarity index 100% rename from audio/die/ol_masu.mp3 rename to audio/die/xin_masu.mp3 diff --git a/audio/die/xin_sunquan.mp3 b/audio/die/xin_sunquan.mp3 new file mode 100644 index 00000000..cb394a8a Binary files /dev/null and b/audio/die/xin_sunquan.mp3 differ diff --git a/audio/die/xin_yujin.mp3 b/audio/die/xin_yujin.mp3 new file mode 100644 index 00000000..6c232f13 Binary files /dev/null and b/audio/die/xin_yujin.mp3 differ diff --git a/audio/die/xukun.mp3 b/audio/die/xukun.mp3 new file mode 100644 index 00000000..20d6c258 Binary files /dev/null and b/audio/die/xukun.mp3 differ diff --git a/audio/die/xunyou.mp3 b/audio/die/xunyou.mp3 index 10295821..743db8d0 100644 Binary files a/audio/die/xunyou.mp3 and b/audio/die/xunyou.mp3 differ diff --git a/audio/die/xusheng.mp3 b/audio/die/xusheng.mp3 index f3bc95b4..baa93f73 100644 Binary files a/audio/die/xusheng.mp3 and b/audio/die/xusheng.mp3 differ diff --git a/audio/die/yadan.mp3 b/audio/die/yadan.mp3 new file mode 100644 index 00000000..44086d0e Binary files /dev/null and b/audio/die/yadan.mp3 differ diff --git a/audio/die/yue_miheng.mp3 b/audio/die/yue_miheng.mp3 new file mode 100644 index 00000000..aa7d85f8 Binary files /dev/null and b/audio/die/yue_miheng.mp3 differ diff --git a/audio/die/zhangbu.mp3 b/audio/die/zhangbu.mp3 new file mode 100644 index 00000000..3b2b0cf8 Binary files /dev/null and b/audio/die/zhangbu.mp3 differ diff --git a/audio/die/zhangjiao.mp3 b/audio/die/zhangjiao.mp3 index 50bc6f7f..63d854f6 100644 Binary files a/audio/die/zhangjiao.mp3 and b/audio/die/zhangjiao.mp3 differ diff --git a/audio/die/zhangren.mp3 b/audio/die/zhangren.mp3 index 803f185c..63718afc 100644 Binary files a/audio/die/zhangren.mp3 and b/audio/die/zhangren.mp3 differ diff --git a/audio/die/zhupeilan.mp3 b/audio/die/zhupeilan.mp3 new file mode 100644 index 00000000..bbce6acb Binary files /dev/null and b/audio/die/zhupeilan.mp3 differ diff --git a/audio/skill/baonue21.mp3 b/audio/skill/baonue21.mp3 index ae0f9e6b..36060c9b 100644 Binary files a/audio/skill/baonue21.mp3 and b/audio/skill/baonue21.mp3 differ diff --git a/audio/skill/baonue22.mp3 b/audio/skill/baonue22.mp3 index 81e966de..8a75b050 100644 Binary files a/audio/skill/baonue22.mp3 and b/audio/skill/baonue22.mp3 differ diff --git a/audio/skill/boss_baonu1.mp3 b/audio/skill/boss_baonu1.mp3 deleted file mode 100644 index 84a0c133..00000000 Binary files a/audio/skill/boss_baonu1.mp3 and /dev/null differ diff --git a/audio/skill/boss_baonu2.mp3 b/audio/skill/boss_baonu2.mp3 deleted file mode 100644 index cf23ef55..00000000 Binary files a/audio/skill/boss_baonu2.mp3 and /dev/null differ diff --git a/audio/skill/dccilv1.mp3 b/audio/skill/dccilv1.mp3 new file mode 100644 index 00000000..dc41895f Binary files /dev/null and b/audio/skill/dccilv1.mp3 differ diff --git a/audio/skill/dccilv2.mp3 b/audio/skill/dccilv2.mp3 new file mode 100644 index 00000000..6359c73e Binary files /dev/null and b/audio/skill/dccilv2.mp3 differ diff --git a/audio/skill/dcfenhui1.mp3 b/audio/skill/dcfenhui1.mp3 new file mode 100644 index 00000000..c65ff24a Binary files /dev/null and b/audio/skill/dcfenhui1.mp3 differ diff --git a/audio/skill/dcfenhui2.mp3 b/audio/skill/dcfenhui2.mp3 new file mode 100644 index 00000000..934263f0 Binary files /dev/null and b/audio/skill/dcfenhui2.mp3 differ diff --git a/audio/skill/dchuanli1.mp3 b/audio/skill/dchuanli1.mp3 new file mode 100644 index 00000000..d2704120 Binary files /dev/null and b/audio/skill/dchuanli1.mp3 differ diff --git a/audio/skill/dchuanli2.mp3 b/audio/skill/dchuanli2.mp3 new file mode 100644 index 00000000..1175bb5b Binary files /dev/null and b/audio/skill/dchuanli2.mp3 differ diff --git a/audio/skill/dchuiwan1.mp3 b/audio/skill/dchuiwan1.mp3 new file mode 100644 index 00000000..68439a18 Binary files /dev/null and b/audio/skill/dchuiwan1.mp3 differ diff --git a/audio/skill/dchuiwan2.mp3 b/audio/skill/dchuiwan2.mp3 new file mode 100644 index 00000000..7f82be91 Binary files /dev/null and b/audio/skill/dchuiwan2.mp3 differ diff --git a/audio/skill/dcjieling2.mp3 b/audio/skill/dcjieling2.mp3 index 0107c8d8..52affbb8 100644 Binary files a/audio/skill/dcjieling2.mp3 and b/audio/skill/dcjieling2.mp3 differ diff --git a/audio/skill/dcjigu1.mp3 b/audio/skill/dcjigu1.mp3 new file mode 100644 index 00000000..cfebca8c Binary files /dev/null and b/audio/skill/dcjigu1.mp3 differ diff --git a/audio/skill/dcjigu2.mp3 b/audio/skill/dcjigu2.mp3 new file mode 100644 index 00000000..ef3691bc Binary files /dev/null and b/audio/skill/dcjigu2.mp3 differ diff --git a/audio/skill/dclisao1.mp3 b/audio/skill/dclisao1.mp3 new file mode 100644 index 00000000..8458daca Binary files /dev/null and b/audio/skill/dclisao1.mp3 differ diff --git a/audio/skill/dclisao2.mp3 b/audio/skill/dclisao2.mp3 new file mode 100644 index 00000000..c9a1bbbc Binary files /dev/null and b/audio/skill/dclisao2.mp3 differ diff --git a/audio/skill/dcqiusuo1.mp3 b/audio/skill/dcqiusuo1.mp3 new file mode 100644 index 00000000..8e86c90e Binary files /dev/null and b/audio/skill/dcqiusuo1.mp3 differ diff --git a/audio/skill/dcqiusuo2.mp3 b/audio/skill/dcqiusuo2.mp3 new file mode 100644 index 00000000..df2f263f Binary files /dev/null and b/audio/skill/dcqiusuo2.mp3 differ diff --git a/audio/skill/dcsbmengmou1.mp3 b/audio/skill/dcsbmengmou1.mp3 index d548d3e0..13a71dfb 100644 Binary files a/audio/skill/dcsbmengmou1.mp3 and b/audio/skill/dcsbmengmou1.mp3 differ diff --git a/audio/skill/dcsbmengmou2.mp3 b/audio/skill/dcsbmengmou2.mp3 index d5288680..17fa3ea1 100644 Binary files a/audio/skill/dcsbmengmou2.mp3 and b/audio/skill/dcsbmengmou2.mp3 differ diff --git a/audio/skill/dcsbmengmou_dc_sb_lusu_shadow1.mp3 b/audio/skill/dcsbmengmou_dc_sb_lusu_shadow1.mp3 new file mode 100644 index 00000000..d548d3e0 Binary files /dev/null and b/audio/skill/dcsbmengmou_dc_sb_lusu_shadow1.mp3 differ diff --git a/audio/skill/dcsbmengmou_dc_sb_lusu_shadow2.mp3 b/audio/skill/dcsbmengmou_dc_sb_lusu_shadow2.mp3 new file mode 100644 index 00000000..d5288680 Binary files /dev/null and b/audio/skill/dcsbmengmou_dc_sb_lusu_shadow2.mp3 differ diff --git a/audio/skill/dcsbmingshi_dc_sb_lusu_shadow1.mp3 b/audio/skill/dcsbmingshi_dc_sb_lusu_shadow1.mp3 new file mode 100644 index 00000000..88770124 Binary files /dev/null and b/audio/skill/dcsbmingshi_dc_sb_lusu_shadow1.mp3 differ diff --git a/audio/skill/dcsbmingshi_dc_sb_lusu_shadow2.mp3 b/audio/skill/dcsbmingshi_dc_sb_lusu_shadow2.mp3 new file mode 100644 index 00000000..00b5c82a Binary files /dev/null and b/audio/skill/dcsbmingshi_dc_sb_lusu_shadow2.mp3 differ diff --git a/audio/skill/dcsbwuwei1.mp3 b/audio/skill/dcsbwuwei1.mp3 new file mode 100644 index 00000000..c373df40 Binary files /dev/null and b/audio/skill/dcsbwuwei1.mp3 differ diff --git a/audio/skill/dcsbwuwei2.mp3 b/audio/skill/dcsbwuwei2.mp3 new file mode 100644 index 00000000..a280f736 Binary files /dev/null and b/audio/skill/dcsbwuwei2.mp3 differ diff --git a/audio/skill/dcshouzhi1.mp3 b/audio/skill/dcshouzhi1.mp3 new file mode 100644 index 00000000..843f7ac3 Binary files /dev/null and b/audio/skill/dcshouzhi1.mp3 differ diff --git a/audio/skill/dcshouzhi2.mp3 b/audio/skill/dcshouzhi2.mp3 new file mode 100644 index 00000000..5dafd7e4 Binary files /dev/null and b/audio/skill/dcshouzhi2.mp3 differ diff --git a/audio/skill/dcsirui1.mp3 b/audio/skill/dcsirui1.mp3 new file mode 100644 index 00000000..2e5a6b7a Binary files /dev/null and b/audio/skill/dcsirui1.mp3 differ diff --git a/audio/skill/dcsirui2.mp3 b/audio/skill/dcsirui2.mp3 new file mode 100644 index 00000000..90c80c29 Binary files /dev/null and b/audio/skill/dcsirui2.mp3 differ diff --git a/audio/skill/dcsuchou1.mp3 b/audio/skill/dcsuchou1.mp3 new file mode 100644 index 00000000..38e2db98 Binary files /dev/null and b/audio/skill/dcsuchou1.mp3 differ diff --git a/audio/skill/dcsuchou2.mp3 b/audio/skill/dcsuchou2.mp3 new file mode 100644 index 00000000..56f4aed7 Binary files /dev/null and b/audio/skill/dcsuchou2.mp3 differ diff --git a/audio/skill/dctongdao1.mp3 b/audio/skill/dctongdao1.mp3 new file mode 100644 index 00000000..e0976a9b Binary files /dev/null and b/audio/skill/dctongdao1.mp3 differ diff --git a/audio/skill/dctongdao2.mp3 b/audio/skill/dctongdao2.mp3 new file mode 100644 index 00000000..1565c0d6 Binary files /dev/null and b/audio/skill/dctongdao2.mp3 differ diff --git a/audio/skill/dcxingmen1.mp3 b/audio/skill/dcxingmen1.mp3 new file mode 100644 index 00000000..70a50546 Binary files /dev/null and b/audio/skill/dcxingmen1.mp3 differ diff --git a/audio/skill/dcxingmen2.mp3 b/audio/skill/dcxingmen2.mp3 new file mode 100644 index 00000000..f8e5e476 Binary files /dev/null and b/audio/skill/dcxingmen2.mp3 differ diff --git a/audio/skill/drlt_poshi2.mp3 b/audio/skill/drlt_poshi2.mp3 index ce078885..d07f8dc7 100644 Binary files a/audio/skill/drlt_poshi2.mp3 and b/audio/skill/drlt_poshi2.mp3 differ diff --git a/audio/skill/enyuan1.mp3 b/audio/skill/enyuan1.mp3 index c2b1784e..9223a0f0 100644 Binary files a/audio/skill/enyuan1.mp3 and b/audio/skill/enyuan1.mp3 differ diff --git a/audio/skill/enyuan2.mp3 b/audio/skill/enyuan2.mp3 index 3d6f16f8..e47bfc7a 100644 Binary files a/audio/skill/enyuan2.mp3 and b/audio/skill/enyuan2.mp3 differ diff --git a/audio/skill/enyuan3.mp3 b/audio/skill/enyuan3.mp3 new file mode 100644 index 00000000..601f6a50 Binary files /dev/null and b/audio/skill/enyuan3.mp3 differ diff --git a/audio/skill/enyuan4.mp3 b/audio/skill/enyuan4.mp3 new file mode 100644 index 00000000..1d738c52 Binary files /dev/null and b/audio/skill/enyuan4.mp3 differ diff --git a/audio/skill/fazhu1.mp3 b/audio/skill/fazhu1.mp3 new file mode 100644 index 00000000..2c214eb6 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 00000000..093cddec Binary files /dev/null and b/audio/skill/fazhu2.mp3 differ diff --git a/audio/skill/fencheng1.mp3 b/audio/skill/fencheng1.mp3 deleted file mode 100644 index 361a73c5..00000000 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 6f560043..00000000 Binary files a/audio/skill/fencheng2.mp3 and /dev/null differ diff --git a/audio/skill/gz_jun_liubei.mp3 b/audio/skill/gz_jun_liubei.mp3 deleted file mode 100644 index 4afa753a..00000000 Binary files a/audio/skill/gz_jun_liubei.mp3 and /dev/null differ diff --git a/audio/skill/gz_jun_sunquan.mp3 b/audio/skill/gz_jun_sunquan.mp3 deleted file mode 100644 index fb844789..00000000 Binary files a/audio/skill/gz_jun_sunquan.mp3 and /dev/null differ diff --git a/audio/skill/gzzongyu1.mp3 b/audio/skill/gzzongyu1.mp3 index dc10d827..fc2c5738 100644 Binary files a/audio/skill/gzzongyu1.mp3 and b/audio/skill/gzzongyu1.mp3 differ diff --git a/audio/skill/gzzongyu2.mp3 b/audio/skill/gzzongyu2.mp3 index 7e8430de..0978b501 100644 Binary files a/audio/skill/gzzongyu2.mp3 and b/audio/skill/gzzongyu2.mp3 differ diff --git a/audio/skill/hongfa1.mp3 b/audio/skill/hongfa1.mp3 index 2eb98486..28f40d4b 100644 Binary files a/audio/skill/hongfa1.mp3 and b/audio/skill/hongfa1.mp3 differ diff --git a/audio/skill/hongfa2.mp3 b/audio/skill/hongfa2.mp3 index 7e32a02b..cb39444d 100644 Binary files a/audio/skill/hongfa2.mp3 and b/audio/skill/hongfa2.mp3 differ diff --git a/audio/skill/hongfa3.mp3 b/audio/skill/hongfa3.mp3 new file mode 100644 index 00000000..9dc1b1f7 Binary files /dev/null and b/audio/skill/hongfa3.mp3 differ diff --git a/audio/skill/hongfa_hp.mp3 b/audio/skill/hongfa_hp.mp3 deleted file mode 100644 index a5d03b16..00000000 Binary files a/audio/skill/hongfa_hp.mp3 and /dev/null differ diff --git a/audio/skill/huangjintianbingfu1.mp3 b/audio/skill/huangjintianbingfu1.mp3 index 731c1cc6..3017436e 100644 Binary files a/audio/skill/huangjintianbingfu1.mp3 and b/audio/skill/huangjintianbingfu1.mp3 differ diff --git a/audio/skill/huangjintianbingfu2.mp3 b/audio/skill/huangjintianbingfu2.mp3 index 97685de6..45c55404 100644 Binary files a/audio/skill/huangjintianbingfu2.mp3 and b/audio/skill/huangjintianbingfu2.mp3 differ diff --git a/audio/skill/huangjintianbingfu3.mp3 b/audio/skill/huangjintianbingfu3.mp3 new file mode 100644 index 00000000..8b963aee Binary files /dev/null and b/audio/skill/huangjintianbingfu3.mp3 differ diff --git a/audio/skill/huibian1.mp3 b/audio/skill/huibian1.mp3 index 861317d5..5933267d 100644 Binary files a/audio/skill/huibian1.mp3 and b/audio/skill/huibian1.mp3 differ diff --git a/audio/skill/huibian2.mp3 b/audio/skill/huibian2.mp3 index f9dfa968..df26af56 100644 Binary files a/audio/skill/huibian2.mp3 and b/audio/skill/huibian2.mp3 differ diff --git a/audio/skill/jiahe.mp3 b/audio/skill/jiahe.mp3 new file mode 100644 index 00000000..c15b99f8 Binary files /dev/null and b/audio/skill/jiahe.mp3 differ diff --git a/audio/skill/jiahe1.mp3 b/audio/skill/jiahe1.mp3 deleted file mode 100644 index fa94929d..00000000 Binary files a/audio/skill/jiahe1.mp3 and /dev/null differ diff --git a/audio/skill/jiahe2.mp3 b/audio/skill/jiahe2.mp3 deleted file mode 100644 index a35b153c..00000000 Binary files a/audio/skill/jiahe2.mp3 and /dev/null differ diff --git a/audio/skill/jiahe_duoshi1.mp3 b/audio/skill/jiahe_duoshi1.mp3 new file mode 100644 index 00000000..5e1902f1 Binary files /dev/null and b/audio/skill/jiahe_duoshi1.mp3 differ diff --git a/audio/skill/jiahe_duoshi2.mp3 b/audio/skill/jiahe_duoshi2.mp3 new file mode 100644 index 00000000..afdd9d8d Binary files /dev/null and b/audio/skill/jiahe_duoshi2.mp3 differ diff --git a/audio/skill/jiahe_haoshi1.mp3 b/audio/skill/jiahe_haoshi1.mp3 new file mode 100644 index 00000000..95049ba0 Binary files /dev/null and b/audio/skill/jiahe_haoshi1.mp3 differ diff --git a/audio/skill/jiahe_haoshi2.mp3 b/audio/skill/jiahe_haoshi2.mp3 new file mode 100644 index 00000000..63d42993 Binary files /dev/null and b/audio/skill/jiahe_haoshi2.mp3 differ diff --git a/audio/skill/jiahe_put1.mp3 b/audio/skill/jiahe_put1.mp3 deleted file mode 100644 index 0d338298..00000000 Binary files a/audio/skill/jiahe_put1.mp3 and /dev/null differ diff --git a/audio/skill/jiahe_put2.mp3 b/audio/skill/jiahe_put2.mp3 deleted file mode 100644 index 84f32153..00000000 Binary files a/audio/skill/jiahe_put2.mp3 and /dev/null differ diff --git a/audio/skill/jiahe_reyingzi1.mp3 b/audio/skill/jiahe_reyingzi1.mp3 new file mode 100644 index 00000000..960f2f3b Binary files /dev/null and b/audio/skill/jiahe_reyingzi1.mp3 differ diff --git a/audio/skill/jiahe_reyingzi2.mp3 b/audio/skill/jiahe_reyingzi2.mp3 new file mode 100644 index 00000000..63af9169 Binary files /dev/null and b/audio/skill/jiahe_reyingzi2.mp3 differ diff --git a/audio/skill/jiahe_shelie1.mp3 b/audio/skill/jiahe_shelie1.mp3 new file mode 100644 index 00000000..6ebce8b8 Binary files /dev/null and b/audio/skill/jiahe_shelie1.mp3 differ diff --git a/audio/skill/jiahe_shelie2.mp3 b/audio/skill/jiahe_shelie2.mp3 new file mode 100644 index 00000000..3a82a582 Binary files /dev/null and b/audio/skill/jiahe_shelie2.mp3 differ diff --git a/audio/skill/jianan.mp3 b/audio/skill/jianan.mp3 new file mode 100644 index 00000000..28a8c67d Binary files /dev/null and b/audio/skill/jianan.mp3 differ diff --git a/audio/skill/jianan1.mp3 b/audio/skill/jianan1.mp3 deleted file mode 100644 index 72931e40..00000000 Binary files a/audio/skill/jianan1.mp3 and /dev/null differ diff --git a/audio/skill/jianan2.mp3 b/audio/skill/jianan2.mp3 deleted file mode 100644 index b44a3c31..00000000 Binary files a/audio/skill/jianan2.mp3 and /dev/null differ diff --git a/audio/skill/jianan_duanliang.mp3 b/audio/skill/jianan_duanliang.mp3 new file mode 100644 index 00000000..96655153 Binary files /dev/null and b/audio/skill/jianan_duanliang.mp3 differ diff --git a/audio/skill/jianan_jieyue.mp3 b/audio/skill/jianan_jieyue.mp3 new file mode 100644 index 00000000..899707f0 Binary files /dev/null and b/audio/skill/jianan_jieyue.mp3 differ diff --git a/audio/skill/jianan_qiaobian.mp3 b/audio/skill/jianan_qiaobian.mp3 new file mode 100644 index 00000000..e7f2946a Binary files /dev/null and b/audio/skill/jianan_qiaobian.mp3 differ diff --git a/audio/skill/jianan_tuxi.mp3 b/audio/skill/jianan_tuxi.mp3 new file mode 100644 index 00000000..779205f9 Binary files /dev/null and b/audio/skill/jianan_tuxi.mp3 differ diff --git a/audio/skill/jianan_xiaoguo.mp3 b/audio/skill/jianan_xiaoguo.mp3 new file mode 100644 index 00000000..d5377551 Binary files /dev/null and b/audio/skill/jianan_xiaoguo.mp3 differ diff --git a/audio/skill/jijiang1_liushan1.mp3 b/audio/skill/jijiang1_liushan1.mp3 index 77453e1d..5a8a4800 100644 Binary files a/audio/skill/jijiang1_liushan1.mp3 and b/audio/skill/jijiang1_liushan1.mp3 differ diff --git a/audio/skill/jijiang1_liushan2.mp3 b/audio/skill/jijiang1_liushan2.mp3 index a22276a0..c5dbd42b 100644 Binary files a/audio/skill/jijiang1_liushan2.mp3 and b/audio/skill/jijiang1_liushan2.mp3 differ diff --git a/audio/skill/jiuchi1.mp3 b/audio/skill/jiuchi1.mp3 index b977881b..e03df699 100644 Binary files a/audio/skill/jiuchi1.mp3 and b/audio/skill/jiuchi1.mp3 differ diff --git a/audio/skill/jiuchi2.mp3 b/audio/skill/jiuchi2.mp3 index cbe30c78..72994770 100644 Binary files a/audio/skill/jiuchi2.mp3 and b/audio/skill/jiuchi2.mp3 differ diff --git a/audio/skill/jizhao1.mp3 b/audio/skill/jizhao1.mp3 index be9d096a..3f32e309 100644 Binary files a/audio/skill/jizhao1.mp3 and b/audio/skill/jizhao1.mp3 differ diff --git a/audio/skill/jizhao2.mp3 b/audio/skill/jizhao2.mp3 index 5608eebc..1541ba49 100644 Binary files a/audio/skill/jizhao2.mp3 and b/audio/skill/jizhao2.mp3 differ diff --git a/audio/skill/jubao1.mp3 b/audio/skill/jubao1.mp3 index d40da57b..56b0618b 100644 Binary files a/audio/skill/jubao1.mp3 and b/audio/skill/jubao1.mp3 differ diff --git a/audio/skill/jubao2.mp3 b/audio/skill/jubao2.mp3 index cd5f425f..693162d8 100644 Binary files a/audio/skill/jubao2.mp3 and b/audio/skill/jubao2.mp3 differ diff --git a/audio/skill/kangli1.mp3 b/audio/skill/kangli1.mp3 new file mode 100644 index 00000000..85cec199 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 00000000..87d78767 Binary files /dev/null and b/audio/skill/kangli2.mp3 differ diff --git a/audio/skill/kunfen_ol_sb_jiangwei1.mp3 b/audio/skill/kunfen_ol_sb_jiangwei1.mp3 new file mode 100644 index 00000000..eba15aec Binary files /dev/null and b/audio/skill/kunfen_ol_sb_jiangwei1.mp3 differ diff --git a/audio/skill/lianzi1.mp3 b/audio/skill/lianzi1.mp3 index 2d9a6009..e37e07a2 100644 Binary files a/audio/skill/lianzi1.mp3 and b/audio/skill/lianzi1.mp3 differ diff --git a/audio/skill/lianzi2.mp3 b/audio/skill/lianzi2.mp3 index 73475b7a..453111ac 100644 Binary files a/audio/skill/lianzi2.mp3 and b/audio/skill/lianzi2.mp3 differ diff --git a/audio/skill/mbchengxiong1.mp3 b/audio/skill/mbchengxiong1.mp3 new file mode 100644 index 00000000..2054bbca 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 00000000..00605954 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 00000000..dc8a54a6 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 00000000..bcb2ebf0 Binary files /dev/null and b/audio/skill/mbchenjie2.mp3 differ diff --git a/audio/skill/mbjiejian1.mp3 b/audio/skill/mbjiejian1.mp3 new file mode 100644 index 00000000..67c9b64c 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 00000000..64b948b4 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 00000000..750dcb27 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 00000000..3f04852a 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 00000000..66a382a5 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 00000000..ee31f9a4 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 00000000..a5b6b6ff Binary files /dev/null and b/audio/skill/mbpanxiang4.mp3 differ diff --git a/audio/skill/mbwangzhuang1.mp3 b/audio/skill/mbwangzhuang1.mp3 new file mode 100644 index 00000000..1e5948ae 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 00000000..acc449ca 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 00000000..04377a6d 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 00000000..95712232 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 00000000..a73b0c79 Binary files /dev/null and b/audio/skill/mbzujin3.mp3 differ diff --git a/audio/skill/mpqianlin1.mp3 b/audio/skill/mpqianlin1.mp3 new file mode 100644 index 00000000..c9fca919 Binary files /dev/null and b/audio/skill/mpqianlin1.mp3 differ diff --git a/audio/skill/mpqianlin2.mp3 b/audio/skill/mpqianlin2.mp3 new file mode 100644 index 00000000..9dcf34d4 Binary files /dev/null and b/audio/skill/mpqianlin2.mp3 differ diff --git a/audio/skill/mpsixiao1.mp3 b/audio/skill/mpsixiao1.mp3 new file mode 100644 index 00000000..42878c83 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 00000000..386e3a63 Binary files /dev/null and b/audio/skill/mpsixiao2.mp3 differ diff --git a/audio/skill/olcangxin1.mp3 b/audio/skill/olcangxin1.mp3 new file mode 100644 index 00000000..9805cb00 Binary files /dev/null and b/audio/skill/olcangxin1.mp3 differ diff --git a/audio/skill/olcangxin2.mp3 b/audio/skill/olcangxin2.mp3 new file mode 100644 index 00000000..76a12327 Binary files /dev/null and b/audio/skill/olcangxin2.mp3 differ diff --git a/audio/skill/olenyuan1.mp3 b/audio/skill/olenyuan1.mp3 new file mode 100644 index 00000000..1a5c0c6e 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 00000000..698bed0e 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 00000000..475db4af 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 00000000..aa85aba3 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 00000000..db454d38 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 00000000..4e2ca5c4 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 00000000..83a52d32 Binary files /dev/null and b/audio/skill/olhuyi5.mp3 differ diff --git a/audio/skill/oljingzhou1.mp3 b/audio/skill/oljingzhou1.mp3 new file mode 100644 index 00000000..85900e35 Binary files /dev/null and b/audio/skill/oljingzhou1.mp3 differ diff --git a/audio/skill/oljingzhou2.mp3 b/audio/skill/oljingzhou2.mp3 new file mode 100644 index 00000000..a440cff5 Binary files /dev/null and b/audio/skill/oljingzhou2.mp3 differ diff --git a/audio/skill/ollianju1.mp3 b/audio/skill/ollianju1.mp3 new file mode 100644 index 00000000..1abab45c Binary files /dev/null and b/audio/skill/ollianju1.mp3 differ diff --git a/audio/skill/ollianju2.mp3 b/audio/skill/ollianju2.mp3 new file mode 100644 index 00000000..0875886b Binary files /dev/null and b/audio/skill/ollianju2.mp3 differ diff --git a/audio/skill/olqieting1.mp3 b/audio/skill/olqieting1.mp3 new file mode 100644 index 00000000..5c606ed7 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 00000000..84602b9f Binary files /dev/null and b/audio/skill/olqieting2.mp3 differ diff --git a/audio/skill/olqingya1.mp3 b/audio/skill/olqingya1.mp3 new file mode 100644 index 00000000..52a2f4bb Binary files /dev/null and b/audio/skill/olqingya1.mp3 differ diff --git a/audio/skill/olqingya2.mp3 b/audio/skill/olqingya2.mp3 new file mode 100644 index 00000000..c863dec1 Binary files /dev/null and b/audio/skill/olqingya2.mp3 differ diff --git a/audio/skill/olrunwei1.mp3 b/audio/skill/olrunwei1.mp3 new file mode 100644 index 00000000..c8cd914f Binary files /dev/null and b/audio/skill/olrunwei1.mp3 differ diff --git a/audio/skill/olrunwei2.mp3 b/audio/skill/olrunwei2.mp3 new file mode 100644 index 00000000..dc654d45 Binary files /dev/null and b/audio/skill/olrunwei2.mp3 differ diff --git a/audio/skill/olsbhongtu1.mp3 b/audio/skill/olsbhongtu1.mp3 new file mode 100644 index 00000000..09bf1c44 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 00000000..979f46f0 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 00000000..9e6e5377 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 00000000..3bc4ec62 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 00000000..5fe58435 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 00000000..826f0ae3 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 00000000..2758dc5c 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 00000000..587f1db1 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 00000000..faa60adb 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 00000000..9755d30c 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 00000000..aa84cc80 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 00000000..7acaa352 Binary files /dev/null and b/audio/skill/olsbqiwu6.mp3 differ diff --git a/audio/skill/olsilv1.mp3 b/audio/skill/olsilv1.mp3 new file mode 100644 index 00000000..13ca897b Binary files /dev/null and b/audio/skill/olsilv1.mp3 differ diff --git a/audio/skill/olsilv2.mp3 b/audio/skill/olsilv2.mp3 new file mode 100644 index 00000000..e39b9c82 Binary files /dev/null and b/audio/skill/olsilv2.mp3 differ diff --git a/audio/skill/olxuanhuo1.mp3 b/audio/skill/olxuanhuo1.mp3 new file mode 100644 index 00000000..a83def38 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 00000000..9b6c48d2 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 00000000..ccdedca9 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 00000000..042e7db9 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 00000000..781d3d85 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 00000000..94b5b68b Binary files /dev/null and b/audio/skill/olziruo2.mp3 differ diff --git a/audio/skill/olzuolian1.mp3 b/audio/skill/olzuolian1.mp3 new file mode 100644 index 00000000..04efdf1a Binary files /dev/null and b/audio/skill/olzuolian1.mp3 differ diff --git a/audio/skill/olzuolian2.mp3 b/audio/skill/olzuolian2.mp3 new file mode 100644 index 00000000..da915698 Binary files /dev/null and b/audio/skill/olzuolian2.mp3 differ diff --git a/audio/skill/qinguo_lose1.mp3 b/audio/skill/qinguo_lose1.mp3 deleted file mode 100644 index 4307ef0b..00000000 Binary files a/audio/skill/qinguo_lose1.mp3 and /dev/null differ diff --git a/audio/skill/qinguo_lose2.mp3 b/audio/skill/qinguo_lose2.mp3 deleted file mode 100644 index 42c39610..00000000 Binary files a/audio/skill/qinguo_lose2.mp3 and /dev/null differ diff --git a/audio/skill/rejizhi_lukang2.mp3 b/audio/skill/rejizhi_lukang2.mp3 deleted file mode 100644 index d9105b8a..00000000 Binary files a/audio/skill/rejizhi_lukang2.mp3 and /dev/null differ diff --git a/audio/skill/rerende_gz_jun_liubei1.mp3 b/audio/skill/rerende_gz_jun_liubei1.mp3 index 527bdb7d..c643840c 100644 Binary files a/audio/skill/rerende_gz_jun_liubei1.mp3 and b/audio/skill/rerende_gz_jun_liubei1.mp3 differ diff --git a/audio/skill/rerende_gz_jun_liubei2.mp3 b/audio/skill/rerende_gz_jun_liubei2.mp3 index 6231d821..36c4fa9e 100644 Binary files a/audio/skill/rerende_gz_jun_liubei2.mp3 and b/audio/skill/rerende_gz_jun_liubei2.mp3 differ diff --git a/audio/skill/roulin1.mp3 b/audio/skill/roulin1.mp3 index df559929..1aa8a32a 100644 Binary files a/audio/skill/roulin1.mp3 and b/audio/skill/roulin1.mp3 differ diff --git a/audio/skill/roulin2.mp3 b/audio/skill/roulin2.mp3 index 6c6565ad..d2920083 100644 Binary files a/audio/skill/roulin2.mp3 and b/audio/skill/roulin2.mp3 differ diff --git a/audio/skill/sbjizhi1.mp3 b/audio/skill/sbjizhi1.mp3 index 705ed678..1a311f15 100644 Binary files a/audio/skill/sbjizhi1.mp3 and b/audio/skill/sbjizhi1.mp3 differ diff --git a/audio/skill/sbjizhi2.mp3 b/audio/skill/sbjizhi2.mp3 index 87f84f94..831cceee 100644 Binary files a/audio/skill/sbjizhi2.mp3 and b/audio/skill/sbjizhi2.mp3 differ diff --git a/audio/skill/sblianying1.mp3 b/audio/skill/sblianying1.mp3 new file mode 100644 index 00000000..6e2b6214 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 00000000..fd2c2fe7 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 00000000..15747032 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 00000000..9c9a4215 Binary files /dev/null and b/audio/skill/sbqianxun2.mp3 differ diff --git a/audio/skill/sbqicai1.mp3 b/audio/skill/sbqicai1.mp3 index 8704fb06..8eb28621 100644 Binary files a/audio/skill/sbqicai1.mp3 and b/audio/skill/sbqicai1.mp3 differ diff --git a/audio/skill/sbqicai2.mp3 b/audio/skill/sbqicai2.mp3 index 0f2ab5c8..7cf81540 100644 Binary files a/audio/skill/sbqicai2.mp3 and b/audio/skill/sbqicai2.mp3 differ diff --git a/audio/skill/shouyue.mp3 b/audio/skill/shouyue.mp3 new file mode 100644 index 00000000..405922bc Binary files /dev/null and b/audio/skill/shouyue.mp3 differ diff --git a/audio/skill/shouyue_liegong1.mp3 b/audio/skill/shouyue_liegong1.mp3 new file mode 100644 index 00000000..9ebe3ff0 Binary files /dev/null and b/audio/skill/shouyue_liegong1.mp3 differ diff --git a/audio/skill/shouyue_liegong2.mp3 b/audio/skill/shouyue_liegong2.mp3 new file mode 100644 index 00000000..1d6cadb8 Binary files /dev/null and b/audio/skill/shouyue_liegong2.mp3 differ diff --git a/audio/skill/shouyue_longdan1.mp3 b/audio/skill/shouyue_longdan1.mp3 new file mode 100644 index 00000000..8fcf94e9 Binary files /dev/null and b/audio/skill/shouyue_longdan1.mp3 differ diff --git a/audio/skill/shouyue_longdan2.mp3 b/audio/skill/shouyue_longdan2.mp3 new file mode 100644 index 00000000..f9315587 Binary files /dev/null and b/audio/skill/shouyue_longdan2.mp3 differ diff --git a/audio/skill/shouyue_paoxiao1.mp3 b/audio/skill/shouyue_paoxiao1.mp3 new file mode 100644 index 00000000..fae998a1 Binary files /dev/null and b/audio/skill/shouyue_paoxiao1.mp3 differ diff --git a/audio/skill/shouyue_paoxiao2.mp3 b/audio/skill/shouyue_paoxiao2.mp3 new file mode 100644 index 00000000..da28a31e Binary files /dev/null and b/audio/skill/shouyue_paoxiao2.mp3 differ diff --git a/audio/skill/shouyue_tieji1.mp3 b/audio/skill/shouyue_tieji1.mp3 new file mode 100644 index 00000000..a568032f Binary files /dev/null and b/audio/skill/shouyue_tieji1.mp3 differ diff --git a/audio/skill/shouyue_tieji2.mp3 b/audio/skill/shouyue_tieji2.mp3 new file mode 100644 index 00000000..99bc5f5e Binary files /dev/null and b/audio/skill/shouyue_tieji2.mp3 differ diff --git a/audio/skill/shouyue_wusheng1.mp3 b/audio/skill/shouyue_wusheng1.mp3 new file mode 100644 index 00000000..6a3a39c2 Binary files /dev/null and b/audio/skill/shouyue_wusheng1.mp3 differ diff --git a/audio/skill/shouyue_wusheng2.mp3 b/audio/skill/shouyue_wusheng2.mp3 new file mode 100644 index 00000000..fee31f04 Binary files /dev/null and b/audio/skill/shouyue_wusheng2.mp3 differ diff --git a/audio/skill/starjiaohao1.mp3 b/audio/skill/starjiaohao1.mp3 new file mode 100644 index 00000000..3b6f5df1 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 00000000..9e9c8388 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 00000000..67759a45 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 00000000..d5e81723 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 100644 index 11b67b17..00000000 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 100644 index c0885915..00000000 Binary files a/audio/skill/taoxi2.mp3 and /dev/null differ diff --git a/audio/skill/twshexhong1.mp3 b/audio/skill/twshexhong1.mp3 deleted file mode 100644 index 5d48015e..00000000 Binary files a/audio/skill/twshexhong1.mp3 and /dev/null differ diff --git a/audio/skill/twshexhong2.mp3 b/audio/skill/twshexhong2.mp3 deleted file mode 100644 index 4705db87..00000000 Binary files a/audio/skill/twshexhong2.mp3 and /dev/null differ diff --git a/audio/skill/wendao1.mp3 b/audio/skill/wendao1.mp3 index 5052e5db..be108788 100644 Binary files a/audio/skill/wendao1.mp3 and b/audio/skill/wendao1.mp3 differ diff --git a/audio/skill/wendao2.mp3 b/audio/skill/wendao2.mp3 index 8ad7204e..b0868092 100644 Binary files a/audio/skill/wendao2.mp3 and b/audio/skill/wendao2.mp3 differ diff --git a/audio/skill/wuxin1.mp3 b/audio/skill/wuxin1.mp3 index a22eff2f..dc4d017b 100644 Binary files a/audio/skill/wuxin1.mp3 and b/audio/skill/wuxin1.mp3 differ diff --git a/audio/skill/wuxin2.mp3 b/audio/skill/wuxin2.mp3 index ed10c44e..23cee2e7 100644 Binary files a/audio/skill/wuxin2.mp3 and b/audio/skill/wuxin2.mp3 differ diff --git a/audio/skill/wuziliangjiangdao1.mp3 b/audio/skill/wuziliangjiangdao1.mp3 new file mode 100644 index 00000000..e3d2832d Binary files /dev/null and b/audio/skill/wuziliangjiangdao1.mp3 differ diff --git a/audio/skill/wuziliangjiangdao2.mp3 b/audio/skill/wuziliangjiangdao2.mp3 new file mode 100644 index 00000000..5fab6078 Binary files /dev/null and b/audio/skill/wuziliangjiangdao2.mp3 differ diff --git a/audio/skill/xianzhou_ol_caifuren1.mp3 b/audio/skill/xianzhou_ol_caifuren1.mp3 new file mode 100644 index 00000000..355719f4 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 00000000..539fe635 Binary files /dev/null and b/audio/skill/xianzhou_ol_caifuren2.mp3 differ diff --git a/audio/skill/xinfu_xingzhao1.mp3 b/audio/skill/xinfu_xingzhao1.mp3 new file mode 100644 index 00000000..2321cd55 Binary files /dev/null and b/audio/skill/xinfu_xingzhao1.mp3 differ diff --git a/audio/skill/xinfu_xingzhao2.mp3 b/audio/skill/xinfu_xingzhao2.mp3 index 737246af..73db5c4e 100644 Binary files a/audio/skill/xinfu_xingzhao2.mp3 and b/audio/skill/xinfu_xingzhao2.mp3 differ diff --git a/audio/skill/xinmieji1.mp3 b/audio/skill/xinmieji1.mp3 deleted file mode 100644 index 97bf574a..00000000 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 b057d017..00000000 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 a69c1a41..00000000 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 6ba348b5..00000000 Binary files a/audio/skill/xinpojun2.mp3 and /dev/null differ diff --git a/audio/skill/xz_xunxun1.mp3 b/audio/skill/xz_xunxun1.mp3 index 73db5c4e..a374db5e 100644 Binary files a/audio/skill/xz_xunxun1.mp3 and b/audio/skill/xz_xunxun1.mp3 differ diff --git a/audio/skill/xz_xunxun2.mp3 b/audio/skill/xz_xunxun2.mp3 index a374db5e..737246af 100644 Binary files a/audio/skill/xz_xunxun2.mp3 and b/audio/skill/xz_xunxun2.mp3 differ diff --git a/audio/skill/yuanjiangfenghuotu1.mp3 b/audio/skill/yuanjiangfenghuotu1.mp3 new file mode 100644 index 00000000..16775225 Binary files /dev/null and b/audio/skill/yuanjiangfenghuotu1.mp3 differ diff --git a/audio/skill/yuanjiangfenghuotu2.mp3 b/audio/skill/yuanjiangfenghuotu2.mp3 new file mode 100644 index 00000000..bf13a8f5 Binary files /dev/null and b/audio/skill/yuanjiangfenghuotu2.mp3 differ diff --git a/audio/skill/yuanjiangfenghuotu3.mp3 b/audio/skill/yuanjiangfenghuotu3.mp3 new file mode 100644 index 00000000..6c35e10b Binary files /dev/null and b/audio/skill/yuanjiangfenghuotu3.mp3 differ diff --git a/audio/skill/yuanjiangfenghuotu4.mp3 b/audio/skill/yuanjiangfenghuotu4.mp3 new file mode 100644 index 00000000..e654cc8b Binary files /dev/null and b/audio/skill/yuanjiangfenghuotu4.mp3 differ diff --git a/audio/skill/zhangwu1.mp3 b/audio/skill/zhangwu1.mp3 index b062da5a..698b0432 100644 Binary files a/audio/skill/zhangwu1.mp3 and b/audio/skill/zhangwu1.mp3 differ diff --git a/audio/skill/zhangwu2.mp3 b/audio/skill/zhangwu2.mp3 index e49c860a..e4792998 100644 Binary files a/audio/skill/zhangwu2.mp3 and b/audio/skill/zhangwu2.mp3 differ diff --git a/audio/skill/zhaxiang_ol_sb_jiangwei1.mp3 b/audio/skill/zhaxiang_ol_sb_jiangwei1.mp3 new file mode 100644 index 00000000..950713bd Binary files /dev/null and b/audio/skill/zhaxiang_ol_sb_jiangwei1.mp3 differ diff --git a/audio/skill/zhiheng_gz_jun_sunquan1.mp3 b/audio/skill/zhiheng_gz_jun_sunquan1.mp3 index bfe9aa2e..1793a625 100644 Binary files a/audio/skill/zhiheng_gz_jun_sunquan1.mp3 and b/audio/skill/zhiheng_gz_jun_sunquan1.mp3 differ diff --git a/audio/skill/zhiheng_gz_jun_sunquan2.mp3 b/audio/skill/zhiheng_gz_jun_sunquan2.mp3 index aaf4b9cf..d6cbabed 100644 Binary files a/audio/skill/zhiheng_gz_jun_sunquan2.mp3 and b/audio/skill/zhiheng_gz_jun_sunquan2.mp3 differ diff --git a/card/guozhan.js b/card/guozhan.js index eb62acee..bdbfd0fd 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -1831,7 +1831,9 @@ game.import("card", function () { mod: { maxHandcard: function (player, num) { if (get.mode() == "guozhan") { - if (player.hasSkill("huangjintianbingfu")) { + // if (player.hasSkill("hongfa")) { + // 村规 + if (player.hasSkill("hongfa", null, null, false)) { num += player.getExpansions("huangjintianbingfu").length; } return ( diff --git a/card/standard.js b/card/standard.js index 582a983f..e2324719 100644 --- a/card/standard.js +++ b/card/standard.js @@ -608,6 +608,12 @@ game.import("card", function () { if (target !== _status.event.dying) { if ( !player.isPhaseUsing() || + player.needsToDiscard(0, (i, player) => { + return ( + !player.canIgnoreHandcard(i) && + taos.includes(i) + ); + }) || player.hasSkillTag( "nokeep", true, @@ -619,7 +625,7 @@ game.import("card", function () { ) ) return 2; - let min = 7.2 - (4 * player.hp) / player.maxHp, + let min = 8.1 - (4.5 * player.hp) / player.maxHp, nd = player.needsToDiscard(0, (i, player) => { return ( !player.canIgnoreHandcard(i) && @@ -1407,7 +1413,7 @@ game.import("card", function () { return 1; }, basic: { - order: 9, + order: 7.2, useful: [5, 1], value: 5, }, @@ -1700,7 +1706,7 @@ game.import("card", function () { return 1; }, basic: { - order: 9, + order: 7.2, useful: 1, value: 5, }, @@ -1843,7 +1849,7 @@ game.import("card", function () { } }, basic: { - order: 7.2, + order: 7, useful: 4.5, value: 9.2, }, @@ -2111,12 +2117,13 @@ game.import("card", function () { pos = get.position(button.link), name = get.name(button.link); if (pos == "j") { - if (name == "lebu") { + let viewAs = button.link.viewAs; + if (viewAs == "lebu") { let needs = target.needsToDiscard(2); btv *= 1.08 + 0.2 * needs; - } else if (name == "shandian" || name == "fulei" || name == "plague") btv /= 2; + } else if (viewAs == "shandian" || viewAs == "fulei") btv /= 2; } - if (get.attitude(player, get.owner(button.link)) > 0) btv = -btv; + if (att > 0) btv = -btv; if (pos != "e") { if (pos == "h" && !player.hasSkillTag("viewHandcard", null, target, true)) return btv + 0.1; @@ -2156,6 +2163,7 @@ game.import("card", function () { return get.value(card, target) > 0 && card != target.getEquip('jinhe'); }) && !js.some(card => { var cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return true; return get.effect(target, cardj, target, player) < 0; })) return 0; } @@ -2164,6 +2172,7 @@ game.import("card", function () { return get.value(card, target) <= 0; }) || js.some(card => { var cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return false; return get.effect(target, cardj, target, player) < 0; })) ? 1.5 : 0; } @@ -2180,6 +2189,7 @@ game.import("card", function () { return get.value(card, target) > 0 && card != target.getEquip('jinhe'); }) || js.some(card => { var cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return true; return get.effect(target, cardj, target, player) < 0; })) ? -1.5 : 1.5; } @@ -2187,6 +2197,7 @@ game.import("card", function () { return get.value(card, target) <= 0; }) || js.some(card => { var cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return false; return get.effect(target, cardj, target, player) < 0; })) ? 1.5 : -1.5; }, @@ -2218,6 +2229,7 @@ game.import("card", function () { }) || js.some((card) => { var cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return true; return get.effect(target, cardj, target, player) < 0; }) ? -1.5 @@ -2228,6 +2240,7 @@ game.import("card", function () { }) || js.some((card) => { var cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return false; return get.effect(target, cardj, target, player) < 0; }) ? 1.5 @@ -2250,6 +2263,7 @@ game.import("card", function () { }) && !js.some((card) => { var cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return true; return get.effect(target, cardj, target, player) < 0; }) ) @@ -2260,6 +2274,7 @@ game.import("card", function () { }) || js.some((card) => { var cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return false; return get.effect(target, cardj, target, player) < 0; }) ? 1.5 @@ -2423,12 +2438,13 @@ game.import("card", function () { pos = get.position(button.link), name = get.name(button.link); if (pos === "j") { - if (name === "lebu") { + let viewAs = button.link.viewAs; + if (viewAs === "lebu") { let needs = target.needsToDiscard(2); val *= 1.08 + 0.2 * needs; - } else if (name == "shandian" || name == "fulei" || name == "plague") val /= 2; + } else if (viewAs == "shandian" || viewAs == "fulei") val /= 2; } - if (get.attitude(player, get.owner(button.link)) > 0) val = -val; + if (att > 0) val = -val; if (pos !== "e") return val; let sub = get.subtypes(button.link); if (sub.includes("equip1")) return (val * Math.min(3.6, target.hp)) / 3; @@ -2466,6 +2482,7 @@ game.import("card", function () { if (att > 0) { if (js.some(card => { const cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return false; return get.effect(target, cardj, target, player) < 0; })) return 3; if (target.isDamaged() && es.some(card => card.name == 'baiyin') && @@ -2485,6 +2502,7 @@ game.import("card", function () { })); const noj = (js.length == 0 || !js.some(card => { const cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return true; return get.effect(target, cardj, target, player) < 0; })) if (noh && noe2 && noj) return 1.5; @@ -2518,6 +2536,7 @@ game.import("card", function () { if ( js.some((card) => { const cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return false; return get.effect(target, cardj, target, player) < 0; }) ) @@ -2548,6 +2567,7 @@ game.import("card", function () { js.length == 0 || !js.some((card) => { const cardj = card.viewAs ? { name: card.viewAs } : card; + if (cardj.name == "xumou_jsrg") return true; return get.effect(target, cardj, target, player) < 0; }); if (noh && noe2 && noj) return 1.5; diff --git a/card/yingbian.js b/card/yingbian.js index c2edf19f..6371eee3 100644 --- a/card/yingbian.js +++ b/card/yingbian.js @@ -61,7 +61,7 @@ game.import("card", function () { var base = 0; if (get.cardtag(card, "yingbian_all")) { if ( - targets.filter(function (current) { + targets.some(function (current) { var att = get.attitude(player, current); if (att <= 0) return ( @@ -74,7 +74,7 @@ game.import("card", function () { return get.position(card) == "j" || get.value(card, current) <= 0; }) > 1 ); - }).length + }) ) base += 6; } @@ -138,13 +138,11 @@ game.import("card", function () { ? -1.5 : 1.5; var js = target.getCards("j"); - if (js.length) { - var jj = js[0].viewAs ? { name: js[0].viewAs } : js[0]; - if (js.length == 1 && get.effect(target, jj, target, player) >= 0) { - return -1.5; - } - return 3; - } + if (js.length && js.some(i => { + let cardj = i.viewAs ? { name: i.viewAs } : i; + if (cardj.name == "xumou_jsrg") return false; + return get.effect(target, cardj, target, player) < 0; + })) return 3; return -1.5; }, player: function (player, target) { @@ -159,13 +157,11 @@ game.import("card", function () { } if (get.attitude(player, target) > 1) { var js = target.getCards("j"); - if (js.length) { - var jj = js[0].viewAs ? { name: js[0].viewAs } : js[0]; - if (js.length == 1 && get.effect(target, jj, target, player) >= 0) { - return 0; - } - return 1; - } + if (js.length && js.some(i => { + let cardj = i.viewAs ? { name: i.viewAs } : i; + if (cardj.name == "xumou_jsrg") return false; + return get.effect(target, cardj, target, player) < 0; + })) return 1; return 0; } return 1; diff --git a/character/clan.js b/character/clan.js index 58c76d89..93703b2d 100644 --- a/character/clan.js +++ b/character/clan.js @@ -40,9 +40,14 @@ game.import("character", function () { skill: { //族钟繇 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, @@ -53,17 +58,23 @@ game.import("character", function () { .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"]); @@ -112,7 +123,6 @@ game.import("character", function () { position: "hs", precontent() { player.addTempSkill("clanchengqi_effect"); - player.markAuto("clanchengqi_effect", [event.result.card.name]); }, }; }, @@ -127,7 +137,7 @@ game.import("character", function () { .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] }; @@ -152,7 +162,6 @@ game.import("character", function () { backup: { audio: "clanchengqi" }, effect: { charlotte: true, - onremove: true, trigger: { player: "useCard" }, filter(event, player) { return ( @@ -862,10 +871,12 @@ game.import("character", function () { 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]); } @@ -1456,6 +1467,7 @@ game.import("character", function () { delete event.result.skill; }, ai: { + combo: "clanzhongliu", order(item, player) { player = player || _status.event.player; var storage = _status.event.player.storage.clanjiexuan; @@ -2443,7 +2455,7 @@ game.import("character", function () { 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"); @@ -3772,7 +3784,7 @@ game.import("character", function () { clan_zhongyao: "族钟繇", clan_zhongyao_prefix: "族", clanchengqi: "承启", - clanchengqi_info: "你可以将至少两张手牌当作本回合未以此法转换过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。", + clanchengqi_info: "你可以将至少两张手牌当作本回合未使用过的基本牌或普通锦囊牌使用,且你以此法转化的牌名字数须不大于以此法转化的所有实体牌牌名字数之和,若你以此法转化的牌名字数等于以此法转化的所有实体牌牌名字数之和,则你使用此牌时可以令一名角色摸一张牌。", clanjieli: "诫厉", clanjieli_info: "结束阶段,你可以选择一名角色,你观看其手牌中牌名字数最多的牌和牌堆顶的X张牌,然后你可以交换其中的任意张牌(X为你本回合使用过的牌中的牌名字数最大值)。", diff --git a/character/collab.js b/character/collab.js index 26e68f26..6966f908 100644 --- a/character/collab.js +++ b/character/collab.js @@ -31,6 +31,10 @@ game.import("character", function () { old_lingju: ["female", "qun", 3, ["jieyuan", "fenxin_old"]], sp_mushun: ["male", "qun", 4, ["moukui"]], dc_wuyi: ["male", "shu", 4, ["dcbenxi"]], + quyuan: ["male", "qun", 3, ["dcqiusuo", "dclisao"]], + xin_sunquan: ["male", "wu", 3, ["dchuiwan", "dchuanli"]], + wuhujiang: ["male", "shu", 4, ["olhuyi"], ["die_audio:wuhujiang:wuhujiang2:wuhujiang3:wuhujiang4:wuhujiang5"]], + dc_noname: ["male", "qun", 3, ["dcchushan"]], }, characterFilter: { old_lingju(mode) { @@ -47,13 +51,647 @@ game.import("character", function () { collab: { collab_olympic: ["sunyang", "yeshiwen"], collab_tongque: ["sp_fuwan", "sp_fuhuanghou", "sp_jiben", "old_lingju", "sp_mushun"], - collab_duanwu: ["sunwukong", "longwang", "taoshen"], + collab_oldoudizhu: ["wuhujiang"], + collab_duanwu_2023: ["sunwukong", "longwang", "taoshen"], + collab_duanwu_2024: ["quyuan"], + collab_liuyi_2024: ["xin_sunquan"], collab_decade: ["libai", "xiaoyuehankehan", "zhutiexiong", "wu_zhutiexiong"], - collab_remake: ["dc_caocao", "dc_liubei", "dc_sunquan", "nezha", "dc_sunce", "dc_zhaoyun", "dc_wuyi"], + collab_remake: ["dc_caocao", "dc_liubei", "dc_sunquan", "nezha", "dc_sunce", "dc_zhaoyun", "dc_wuyi", "dc_noname"], }, }, /** @type { importCharacterConfig['skill'] } */ skill: { + //五虎将 + //是的孩子们,我们意念合一 + 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 info = 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]; + // 临时修改(by 棘手怀念摧毁) + if (!get.characterSurname(surname).randomGet()[0] || !get.characterSurname(name).randomGet()[1]) { + newname = "无名"; + player.chat("终究还是落得藉藉无名……"); + } + // 先用旧版代码 + game.broadcastAll( + (player, name) => { + 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, + newname + ); + // 新版代码暂未修改 + // 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, + trigger: { player: "drawBegin" }, + filter(event, player) { + return lib.inpile.some(name => { + const type = get.type(name); + if (type != "basic" && type != "trick") return false; + return !player.getStorage("dchuiwan_used").includes(name); + }); + }, + async cost(event, trigger, player) { + let result = await player + .chooseButton( + [ + get.prompt2("dchuiwan"), + [ + lib.inpile.filter(name => { + const type = get.type(name); + if (type != "basic" && type != "trick") return false; + return !player.getStorage("dchuiwan_used").includes(name); + }), + "vcard", + ], + ], + [1, trigger.num] + ) + .set("ai", button => { + if (!get.cardPile2(button.link[2])) return 0; + return get.value({ name: button.link[2] }, get.event("player")); + }) + .forResult(); + if (result.bool) { + result.cost_data = result.links; + } + event.result = result; + }, + async content(event, trigger, player) { + trigger.cancel(); + if (!player.storage.dchuiwan_used) { + player.when({ global: "phaseAfter" }).then(() => delete player.storage.dchuiwan_used); + } + player.markAuto( + "dchuiwan_used", + event.cost_data.map(name => name[2]) + ); + let list = []; + for (const name of event.cost_data) { + const card = get.cardPile2(name[2]); + if (card) list.push(card); + } + if (list.length) await player.gain(list, "gain2"); + else player.chat("无牌可得?!"); + }, + }, + dchuanli: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return ( + player.getHistory("useCard", evt => { + return (evt.targets || []).includes(player); + }).length >= 3 || + game.hasPlayer(target => { + if (target == player) return false; + return ( + player.getHistory("useCard", evt => { + return (evt.targets || []).includes(target); + }).length >= 3 + ); + }) + ); + }, + direct: true, + async content(event, trigger, player) { + let zhangzhang = false, + zhouyu = false; + if ( + player.getHistory("useCard", evt => { + return (evt.targets || []).includes(player); + }).length >= 3 + ) { + const result = await player + .chooseTarget(get.prompt("dchuanli"), "令一名其他角色的所有技能失效,然后令其获得〖直谏〗和〖固政〗直到其回合结束", (card, player, target) => { + return target != player && !target.hasSkill("dchuanli_zhangzhang"); + }) + .set("ai", target => { + const player = get.event("player"); + return ( + get.rank("zhangzhang", true) - + ["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) + ); + }) + .forResult(); + if (result.bool) { + zhangzhang = true; + const target = result.targets[0]; + await player.logSkill("dchuanli", target); + target.addTempSkill("dchuanli_zhangzhang", { player: "phaseAfter" }); + target.markSkillCharacter("dchuanli_zhangzhang", "zhangzhang", "唤理-内事", "内事不决问张昭"); + await target.addAdditionalSkills("dchuanli_zhangzhang", ["zhijian", "guzheng"]); + } + } + const targets = game.filterPlayer(target => { + if (target == player || target.hasSkill("dchuanli_zhouyu")) return false; + return ( + player.getHistory("useCard", evt => { + return (evt.targets || []).includes(target); + }).length >= 3 + ); + }); + if (targets.length) { + const result = await player + .chooseTarget(get.prompt("dchuanli"), "令一名其他角色的所有技能失效,然后令其获得〖英姿〗和〖反间〗直到其回合结束", (card, player, target) => { + return get.event("targets").includes(target); + }) + .set("ai", target => { + const player = get.event("player"); + return ( + get.rank("re_zhouyu", true) - + ["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("targets", targets) + .forResult(); + if (result.bool) { + zhouyu = true; + const target = result.targets[0]; + await player.logSkill("dchuanli", target); + target.addTempSkill("dchuanli_zhouyu", { player: "phaseAfter" }); + target.markSkillCharacter("dchuanli_zhouyu", "re_zhouyu", "唤理-外事", "外事不决问周瑜"); + await target.addAdditionalSkills("dchuanli_zhouyu", ["reyingzi", "refanjian"]); + } + } + if (zhangzhang && zhouyu) { + await player.logSkill("dchuanli"); + if (player.storage.dchuanli_sunquan) delete player.storage.dchuanli_sunquan; + await player.addAdditionalSkills("dchuanli_sunquan", "rezhiheng"); + player.addSkill("dchuanli_sunquan"); + } + }, + subSkill: { + zhangzhang: { + init(player, skill) { + player.addSkillBlocker(skill); + }, + onremove(player, skill) { + player.removeSkillBlocker(skill); + player.removeAdditionalSkills(skill); + }, + charlotte: true, + skillBlocker(skill) { + return !["zhijian", "guzheng"].includes(skill) && skill != "dchuanli_zhangzhang" && !lib.skill[skill].charlotte; + }, + }, + zhouyu: { + init(player, skill) { + player.addSkillBlocker(skill); + }, + onremove(player, skill) { + player.removeSkillBlocker(skill); + player.removeAdditionalSkills(skill); + }, + charlotte: true, + skillBlocker(skill) { + return !["reyingzi", "refanjian"].includes(skill) && skill != "dchuanli_zhouyu" && !lib.skill[skill].charlotte; + }, + }, + sunquan: { + charlotte: true, + onremove(player, skill) { + delete player.storage[skill]; + }, + trigger: { player: "phaseAfter" }, + forced: true, + popup: false, + async content(event, trigger, player) { + if (!player.storage.dchuanli_sunquan) { + player.storage.dchuanli_sunquan = true; + } else { + await player.removeAdditionalSkills("dchuanli_sunquan"); + player.removeSkill("dchuanli_sunquan"); + } + }, + }, + }, + derivation: ["zhijian", "guzheng", "reyingzi", "refanjian", "rezhiheng"], + }, + //屈原 + dcqiusuo: { + audio: 2, + trigger: { + source: "damageSource", + player: "damageEnd", + }, + frequent: true, + async content(event, trigger, player) { + const tiesuo = get.cardPile("tiesuo"); + if (tiesuo) await player.gain(tiesuo, "gain2"); + }, + }, + dclisao: { + audio: 2, + enable: "phaseUse", + filterTarget: true, + selectTarget: [1, 2], + usable: 1, + multitarget: true, + multiline: true, + async content(event, trigger, player) { + let targets = event.targets.sortBySeat(); + //处理问题 + let answer_ok = undefined, + answered = targets.slice(), + gaifa = targets.slice(); //该罚 + let question = []; + const sentences = _status.lisao_text.randomGets(2).randomSort(); + const goon = Math.round(Math.random()); + question.addArray(["请回答《离骚》中“" + sentences[0].split(",")[goon] + "”的" + (goon ? "上" : "下") + "句", [sentences[0].split(",")[1 - goon], sentences[1].split(",")[1 - goon]].randomSort()]); + //人类和AI + //AI随机排序一下,模拟不同顺序回答 + let humans = targets.filter(current => current === game.me || current.isOnline()); + let locals = targets.slice(0).randomSort(); + locals.removeArray(humans); + const eventId = get.id(); + const send = (question, current, eventId) => { + lib.skill.dclisao.chooseControl(question, current, eventId); + game.resume(); + }; + //让读条不消失并显示读条 + event._global_waiting = true; + let time = 10000; + if (lib.configOL && lib.configOL.choose_timeout) time = parseInt(lib.configOL.choose_timeout) * 1000; + targets.forEach(current => current.showTimer(time)); + //先处理人类玩家 + if (humans.length > 0) { + const solve = function (resolve, reject) { + return function (result, player) { + if (result && result.control && !answer_ok) { + resolve(); + answered.remove(player); + if (result.control == sentences[0].split(",")[1 - goon]) { + player.popup("回答正确", "wood"); + game.log(player, "回答正确"); + answer_ok = player; + gaifa.remove(player); + } else { + player.popup("回答错误", "fire"); + game.log(player, "回答错误"); + } + } else reject(); + }; + }; + await Promise.any( + humans.map(current => { + return new Promise(async (resolve, reject) => { + if (current.isOnline()) { + current.send(send, question, current, eventId); + current.wait(solve(resolve, reject)); + } else { + const next = lib.skill.dclisao.chooseControl(question, current, eventId); + const solver = solve(resolve, reject); + if (_status.connectMode) game.me.wait(solver); + const result = await next.forResult(); + if (_status.connectMode && !answer_ok) game.me.unwait(result, current); + else solver(result, current); + } + }); + }) + ).catch(() => {}); + game.broadcastAll("cancel", eventId); + } + //再处理单机的他人控制玩家/AI玩家 + if (!answer_ok && locals.length > 0) { + for (const current of locals) { + const result = await lib.skill.dclisao.chooseControl(question, current).forResult(); + if (result && result.control) { + answered.remove(current); + if (result.control == sentences[0].split(",")[1 - goon]) { + current.popup("回答正确", "wood"); + game.log(current, "回答正确"); + answer_ok = current; + gaifa.remove(current); + break; + } else { + current.popup("回答错误", "fire"); + game.log(current, "回答错误"); + } + } + } + } + //清除读条 + delete event._global_waiting; + for (const i of targets) { + i.hideTimer(); + if (answered.includes(i)) { + i.popup("未回答"); + game.log(i, "未进行回答"); + } + } + await game.asyncDelay(); + //处理结果 + if (answer_ok && answer_ok.countCards("h")) await answer_ok.showHandcards(); + if (gaifa.length) { + for (const i of gaifa) { + i.addTempSkill("dclisao_gaifa"); + i.markAuto("dclisao_gaifa", [player]); + } + await game.asyncDelay(); + } + }, + chooseControl(question, current, eventId) { + const next = current.chooseControl(question[1]); + next.set("prompt", question[0]); + next.set("id", eventId); + next.set("_global_waiting", true); + next.set("ai", () => Math.round(Math.random())); + return next; + }, + init() { + //《离骚》(高中节选) + if (!_status.lisao_text) { + let text = "长太息以掩涕兮,哀民生之多艰。余虽好修姱以鞿羁兮,謇朝谇而夕替。既替余以蕙纕兮,又申之以揽茝。亦余心之所善兮,虽九死其犹未悔。怨灵修之浩荡兮,终不察夫民心。众女嫉余之蛾眉兮,谣诼谓余以善淫。固时俗之工巧兮,偭规矩而改错。背绳墨以追曲兮,竞周容以为度。忳郁邑余侘傺兮,吾独穷困乎此时也。宁溘死以流亡兮,余不忍为此态也。鸷鸟之不群兮,自前世而固然。何方圜之能周兮,夫孰异道而相安。屈心而抑志兮,忍尤而攘诟。伏清白以死直兮,固前圣之所厚。悔相道之不察兮,延伫乎吾将反。回朕车以复路兮,及行迷之未远。步余马于兰皋兮,驰椒丘且焉止息。进不入以离尤兮,退将复修吾初服。制芰荷以为衣兮,集芙蓉以为裳。不吾知其亦已兮,苟余情其信芳。高余冠之岌岌兮,长余佩之陆离。芳与泽其杂糅兮,唯昭质其犹未亏。忽反顾以游目兮,将往观乎四荒。佩缤纷其繁饰兮,芳菲菲其弥章。民生各有所乐兮,余独好修以为常。虽体解吾犹未变兮,岂余心之可惩。"; + _status.lisao_text = text.slice(0, -1).split("。"); + } + }, + ai: { + order: 10, + result: { + target(player, target) { + if (player === target) { + if (ui.selected.targets.length) return 8; + return 0; + } + if (target.getStorage("dclisao_gaifa").includes(player)) return 0; + if (get.damageEffect(target, player, player) < 0 && get.attitude(player, target) > 0) return 0; + let cards = player.getCards("hs", card => get.tag(card, "damage") && get.effect(target, card, player, player) > 0); + if (!cards.length) return 0; + let cardx = cards.filter(card => get.name(card) == "sha"); + 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 + ); + }, + }, + }, + subSkill: { + gaifa: { + charlotte: true, + onremove: true, + trigger: { + global: "useCard", + player: "damageBegin3", + }, + filter(event, player) { + const targets = player.getStorage("dclisao_gaifa"); + return event.name != "useCard" || targets.includes(event.player); + }, + forced: true, + popup: false, + async content(event, trigger, player) { + const targets = player.getStorage("dclisao_gaifa"); + if (trigger.name == "useCard") trigger.directHit.add(player); + else trigger.num = trigger.num * (targets.length + 1); + }, + mark: true, + marktext: "江", + intro: { + markcount: () => 0, + content(storage) { + return "
  • 无法响应" + get.translation(storage) + "使用的牌
  • 受到的伤害翻" + storage.length + "倍"; + }, + }, + }, + }, + }, //名将吴懿 dcbenxi: { trigger: { @@ -856,7 +1494,7 @@ game.import("character", function () { }, subSkill: { add: { - audio: 2, + audio: "rezhiheng", trigger: { source: "damageSource", }, @@ -1688,6 +2326,7 @@ game.import("character", function () { }, dcruyi: { audio: 2, + derivation: "ruyijingubang", trigger: { global: "phaseBefore", player: "enterGame", @@ -2361,6 +3000,9 @@ game.import("character", function () { }, }, characterIntro: { + dc_noname: " ", + wuhujiang: "请分别查看「关羽」、「张飞」、「赵云」、「马超」和「黄忠」的武将介绍。", + quyuan: "屈原(约前340年~前278年),芈姓(一作嬭姓),屈氏,名平,字原,又自云名正则,字灵均,出生于楚国丹阳秭归(今湖北省宜昌市),战国时期楚国诗人、政治家。楚武王熊通之子屈瑕的后代(一说屈氏的来源是西周前期的楚国人屈紃)。屈原少年时受过良好的教育,博闻强识,志向远大。早年受楚怀王信任,任左徒、三闾大夫,兼管内政外交大事。提倡“美政”,主张对内举贤任能,修明法度,对外力主联齐抗秦。因遭贵族排挤诽谤,被先后流放至汉北和沅湘流域。前278年,楚国郢都被秦军攻破后,自沉于汨罗江,以身殉楚国。屈原是中国历史上一位伟大的爱国诗人,中国浪漫主义文学的奠基人,“楚辞”的创立者和代表作家,开辟了“香草美人”的传统,被誉为“楚辞之祖”,楚国有名的辞赋家宋玉、唐勒、景差都受到屈原的影响。屈原作品的出现,标志着中国诗歌进入了一个由大雅歌唱到浪漫独创的新时代,其主要作品有《离骚》《九歌》《九章》《天问》等。以屈原作品为主体的《楚辞》是中国浪漫主义文学的源头之一,对后世诗歌产生了深远影响。成为中国文学史上的璀璨明珠,“逸响伟辞,卓绝一世”。“路漫漫其修远兮,吾将上下而求索”,屈原的“求索”精神,成为后世仁人志士所信奉和追求的一种高尚精神。", sunwukong: "孙悟空是中国古典小说《西游记》的主人公,也是中国神话中的民俗神祇之一,明代百回本《西游记》书中最为深入人心的形象之一。《西游记》中的孙悟空本是天地生成的一个石猴,率领群猴在花果山水帘洞过着逍遥自在的日子,后来为学习长生的法术而拜菩提祖师为师,学会了七十二变和筋斗云等绝技。后来他前往东海龙宫夺取如意金箍棒,又大闹地府勾了生死簿,惊动天庭,天庭两次派兵征讨花果山,仍然降他不得,只好请西天如来佛祖前来助阵。如来佛祖以五行山将悟空压在山下五百年。五百年后,悟空在观音菩萨的指点下拜唐僧为师,并跟随唐僧前往西天求取真经。路上唐僧又收了猪八戒、沙和尚两个徒弟,众人在途中斩妖除魔、历经磨难,终于取得真经,修成正果。", longwang: @@ -2536,10 +3178,31 @@ game.import("character", function () { dc_wuyi_prefix: "经典", dcbenxi: "奔袭", dcbenxi_info: "转换技,锁定技。当你失去手牌后,阴:系统随机检索出一句转换为拼音后包含“wu,yi”的技能台词,然后你念出此台词。阳:你获得上次所念出的台词对应的技能;若你已拥有该技能,则改为对其他角色各造成1点伤害。", - + quyuan: "屈原", + dcqiusuo: "求索", + dcqiusuo_info: "当你造成或受到伤害后,你可以从牌堆或弃牌堆中获得一张【铁索连环】。", + dclisao: "离骚", + dclisao_info: "出牌阶段限一次,你可以选择至多两名角色,这些角色须同时回答《离骚》的句段填空(抢答题,一名角色回答正确后结束答题)。回答正确的角色展示所有手牌,其余角色本回合不能响应你使用的牌且受到的伤害翻倍。", + xin_sunquan: "会玩孙权", + xin_sunquan_prefix: "会玩", + dchuiwan: "会玩", + dchuiwan_info: "每回合每种牌名限一次,当你摸牌时,你可以放弃摸牌并改为选择至多等同于摸牌数的基本牌或锦囊牌的牌名,然后你从牌堆中获得这些牌名的牌。", + dchuanli: "唤理", + dchuanli_info: "结束阶段,若你本回合:使用牌至少指定三次自己为目标,则你可以令一名其他角色的所有技能失效,然后其获得〖直谏〗和〖固政〗,直到其下回合结束;使用牌至少指定三次一名其他角色为目标,则你可以令其所有技能失效,然后其获得〖英姿〗和〖反间〗,直到其下回合结束。然后若你两项均执行,你获得〖制衡〗直到你的下个回合结束。", + dc_noname: "无名", + dcchushan: "出山", + dcchushan_info: "锁定技,游戏开始时,你获得两个武将的各一个技能,并将你的武将名改为这两个武将的名字组合。", + wuhujiang: "魂五虎", + wuhujiang_prefix: "魂", + olhuyi: "虎翼", + olhuyi_info: "①游戏开始时,你从随机三个五虎将技能中选择一个获得。②当你使用或打出一张基本牌后,若你因此技能获得的技能数小于5,你随机获得一个技能描述中包含此牌名的五虎将技能。③回合结束时,你可以失去一个以此法获得的技能。", + collab_olympic: "OL·伦敦奥运会", collab_tongque: "OL·铜雀台", - collab_duanwu: "新服·端午畅玩", + collab_oldoudizhu: "OL·限时地主", + collab_duanwu_2023: "新服·端午畅玩2023", + collab_duanwu_2024: "新服·端午畅玩2024", + collab_liuyi_2024: "新服·六一限时地主", collab_decade: "新服·创玩节", collab_remake: "新服·共创武将", @@ -2693,6 +3356,21 @@ game.import("character", function () { "#qice_clan_xunyou2": "穷寇宜追,需防死蛇之不僵。", // collab + "#olhuyi1": "青龙啸赤月,长刀行千里。", + "#olhuyi2": "谋取敌将首,声震当阳桥。", + "#olhuyi3": "游龙战长坂,可复七进七出。", + "#olhuyi4": "身跨白玉鞍,铁骑踏冰河。", + "#olhuyi5": "满弓望西北,弦惊夜行之虎。", + "#wuhujiang:die": "麦城残阳息长刀……", + "#wuhujiang2:die": "当阳空余声……", + "#wuhujiang3:die": "亢龙有悔……", + "#wuhujiang4:die": "西风寒,冷铁衣……", + "#wuhujiang5:die": "年老力衰,不复当年勇……", + "#dcqiusuo1": "驾八龙之婉婉兮,载云旗之委蛇。", + "#dcqiusuo2": "路漫漫其修远兮,吾将上下而求索。", + "#dclisao1": "朝饮木兰之坠露兮,夕餐秋菊之落英。", + "#dclisao2": "惟草木之零落兮,恐美人之迟暮。", + "#quyuan:die": "伏清白以死直兮,固前圣之所厚……", "#dcjuejing1": "龙翔九天,曳日月于天地,换旧符于新岁。", "#dcjuejing2": "御风万里,辟邪祟于宇外,映祥瑞于神州。", "#dclonghun1": "龙诞新岁,普天同庆,魂佑宇内,裔泽炎黄。", @@ -2737,8 +3415,11 @@ game.import("character", function () { "#dcnutao3": "智勇深沉,一世之雄!", "#dcnutao4": "波涛怒天,神力无边!", "#taoshen:die": "马革裹尸,身沉江心……", - "#jieyuan_more": "我所有的努力,都是为了杀你!", - "#jieyuan_less": "我必须活下去!", + "#dchuiwan1": "金珠弹黄鹂,玉带做秋千,如此游戏人间。", + "#dchuiwan2": "小爷横行江东,今日走马、明日弄鹰。", + "#dchuanli1": "金乌当空,汝欲与我辩日否?", + "#dchuanli2": "童言无忌,童言有理!", + "#xin_sunquan:die": "阿娘,大哥抢我糖人!", // ddd @@ -3165,7 +3846,9 @@ game.import("character", function () { "#dcanliao2": "水草丰沛,当展宏图。", "#gongsundu:die": "为何都不愿出仕!", "#dcyiyong1": "关氏鼠辈,庞令明之子来邪!", - "#dcyiyong2": "凭一腔勇力,父仇定可报还。", + "#dcyiyong2": "凭一腔勇力,父仇定可报还!", + "#dcsuchou1": "关家人我杀定了,谁也保不住!", + "#dcsuchou2": "身陷仇海,谁知道我是怎么过的!", "#panghui:die": "大仇虽报,奈何心有余创……", "#dccuijin1": "军令如山,诸君焉敢不前?", "#dccuijin2": "前攻者赏之,后靡斩之!", @@ -3417,8 +4100,6 @@ game.import("character", function () { "#dc_lifeng:die": "黍穗重丰,不见丞相还……", "#dcfudou1": "既作困禽,何妨铤险以覆车?", "#dcfudou2": "据将覆之巢,必作犹斗之困兽。", - "#sppanqin1": "百兽嘶鸣筋骨振,蛮王起兮万人随!", - "#sppanqin2": "呼勒格诗惹之民,召南中群雄复起!", "#dctaji1": "仙途本寂寥,结发叹长生。", "#dctaji2": "仙者不言,手执春风。", "#dcqinghuang1": "上士无争,焉生妄心。", @@ -3429,10 +4110,15 @@ game.import("character", function () { "#llqshenwei2": "红妆非我愿,学武觅封侯。", "#wushuang_lvlingqi1": "猛将策良骥,长戟破敌营。", "#wushuang_lvlingqi2": "杀气腾剑戟,严风卷戎装。", + "#dcjigu1": "我接着奏乐,诸公接着舞。", + "#dcjigu2": "这不是鼓,而是曹公的脸面!", + "#dcsirui1": "暑气可借酒气消,此间艳阳最佐酒。", + "#dcsirui2": "诸君饮泥而醉,举世唯我独醒!", + "#yue_miheng:die": "映日荷花今犹在,不见当年采荷人……", // jsrg "#jsrg_zoushi:die": "年老色衰了吗?", - "#jsrg_zhangren:die": "老臣,绝不事二主!", + "#jsrg_zhangren:die": "本将军败于诸葛,无憾!", "#jsrg_huangzhong:die": "不得不服老啦~", "#jsrg_liuhong:die": "权利的滋味,让人沉沦……", @@ -3495,6 +4181,25 @@ game.import("character", function () { "#key_saya:die": "砰——", // mobile + "#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": "此犹有转胜之机,吾等切不可自乱。", @@ -3741,6 +4446,7 @@ game.import("character", function () { "#jueyong2": "身陷敌阵,战而弥勇!", "#poxiang1": "王瓘既然假降,吾等可将计就计。", "#poxiang2": "佥率已降两千魏兵,便可大破魏军主力。", + "#fuqian:die": "生为蜀臣,死……亦当为蜀!", "#disordersidi1": "司敌之动,先发而制。", "#disordersidi2": "料敌之行,伏兵灭之。", "#xin_caozhen:die": "雍凉动乱,皆吾之过也……", @@ -4073,10 +4779,6 @@ game.import("character", function () { "#guanxing_re_jiangwei2": "欲尽人事,亦先听天命。", "#jixi_re_dengai1": "攻敌之不备,斩将夺辎!", "#jixi_re_dengai2": "奇兵正攻,敌何能为?", - "#drlt_qingce1": "感明帝之恩,清君侧之贼。", - "#drlt_qingce2": "得太后手诏,清奸佞乱臣。", - "#jingong1": "若无老夫之谋,尔等皆化为腐土也。", - "#jingong2": "董贼旧部,可尽诛之!", "#jijiang1_re_liushan1": "还望诸卿勠力同心,以保国祚。", "#jijiang1_re_liushan2": "哪位爱卿愿意报效国家?", "#reyingzi_re_sunben1": "有公瑾助我,可平天下。", @@ -4153,16 +4855,89 @@ game.import("character", function () { "#ns_fanchou:die": "唉,稚然疑心,甚重……", // old + "#xiemu1": "暴戾之气,伤人害己。", + "#xiemu2": "休要再起战事!", + "#naman1": "慢着,让我来!", + "#naman2": "弃暗投明,光耀门楣。", + "#youdi1": "无名小卒,可敢再前进一步!", + "#youdi2": "予以小利,必有大获。", + "#old_zhuhuan:die": "这巍巍巨城,吾竟无力撼动……", + "#xinzhan1": "吾通晓兵法,世人皆知。", + "#xinzhan2": "用兵之道,攻心为上。", + "#huilei1": "丞相视某如子,某以丞相为父。", + "#huilei2": "谡愿以死安大局。", + "#oldzhenlie1": "我,绝不屈服!", + "#oldzhenlie2": "休要小看妇人志气!", + "#oldmiji1": "我将尽我所能!", + "#oldmiji2": "奇谋,只在绝境中诞生!", + "#old_wangyi:die": "忠义已尽,死又何妨?", + "#oldqianxi1": "伤其十指,不如断其一指!", + "#oldqianxi2": "斩草除根,除恶务尽!", + "#madai:die": "反骨贼已除,丞相放心……", + "#mengjin1": "你,可敢挡我?", + "#mengjin2": "我要杀你们个片甲不留!", + "#pangde:die": "四面都是水,我命休矣……", + "#enyuan1": "滴水之恩,涌泉以报。", + "#enyuan2": "得人恩果千年记。", + "#enyuan3": "睚眦之怨,无不报复。", + "#enyuan4": "谁敢得罪我?", + "#xuanhuo1": "给你的,十倍奉还给我。", + "#xuanhuo2": "重用许靖,以眩远近。", + "#fazheng:die": "蜀翼既折,蜀汉哀矣……", + "#yizhong1": "不先为备,何以待敌?", + "#yizhong2": "稳重行军,百战不殆!", + "#xin_yujin:die": "呃,晚节不保……", + "#xiahouyuan:die": "竟然……比我还……快……", + "#weiyan:die": "谁敢杀我?!呃啊……", + "#xuhuang:die": "一顿不吃,饿得慌……", + "#huangtian2_zhangjiao1": "岁在甲子,天下大吉!", + "#huangtian2_zhangjiao2": "苍天已死,黄天当立!", + "#zhangjiao:die": "黄天,也死了……", + "#wuyan1": "唉,一切尽在不言中。", + "#wuyan2": "嘘,言多必失啊。", + "#jujian1": "将军岂愿抓牌乎?", + "#jujian2": "我看好你!", + "#xushu:die": "娘……孩儿不孝……向您……请罪……", + "#old_guhuo1": "你信吗?", + "#old_guhuo2": "猜猜看哪~", + "#yuji:die": "竟然……被猜到了……", "#old_fuhun1": "呐喊破敌,锐不可挡!", "#old_fuhun2": "匹夫之勇,插标卖首!", "#old_guanzhang:die": "父亲,我来了……", "#huangzhong:die": "不得不服老啦~", // onlyOL + "#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": "此身为薪,炬成灰亦昭大汉长明!", "#olsbranji2": "维之一腔骨血,可驱驰来北马否?", + "#kunfen_ol_sb_jiangwei1": "虽千万人,吾往矣!", + "#zhaxiang_ol_sb_jiangwei1": "亡国之将姜维,请明公驱驰。", "#ol_sb_jiangwei:die": "姜维姜维……又将何为?", "#xuanfeng_re_lingtong1": "短兵相接,让敌人丢盔弃甲!", "#xuanfeng_re_lingtong2": "攻敌不备,看他们闻风而逃!", @@ -4606,7 +5381,7 @@ game.import("character", function () { "#liuli_re_daqiao2": "帮帮人家嘛~", "#re_daqiao:die": "伯符,再也没人能欺负我了……", "#rekurou1": "我这把老骨头,不算什么!", - "#rekurou2": "为成大业,死不足惜!", + "#rekurou2": "为成大义,死不足惜!", "#zhaxiang1": "铁锁连舟而行,东吴水师可破!", "#zhaxiang2": "两军阵前,不斩降将!", "#re_huanggai:die": "盖,有负公瑾重托……", @@ -4698,7 +5473,7 @@ game.import("character", function () { "#zhoutai:die": "敌众我寡,无力回天……", "#rejianchu1": "你这身躯,怎么能快过我?", "#rejianchu2": "这些怎么能挡住我的威力!", - "#ol_pangde:die": "水漫城池,不得不降……", + "#ol_pangde:die": "人亡马倒,命之所归……", "#olduanliang1": "兵行无常,计行断粮。", "#olduanliang2": "焚其粮营,断其粮道。", "#oljiezi1": "剪径截辎,馈泽同袍。", @@ -4813,6 +5588,11 @@ game.import("character", function () { "#yinghun_re_sunce2": "父亲,吾定不负你期望!", // sb + "#sbqianxun1": "虽有戈矛之刺,不如恭俭之利也。", + "#sbqianxun2": "贤者任重而行恭,知者功大而辞顺。", + "#sblianying1": "蜀营连绵百里,正待吾燎原一炬!", + "#sblianying2": "蜀军虚实已知,吾等不日便破也。", + "#sb_luxun:die": "心淤岂容有污,今唯以死自证……", "#sbxianzhen1": "陷阵营中,皆是以一敌百之士!", "#sbxianzhen2": "军令既出,使命必完!", "#sbjinjiu1": "军规严戒,不容稍纵形骸!", @@ -5052,8 +5832,10 @@ game.import("character", function () { "#re_huangzhong:die": "真哉,老将无用矣……", "#gzbuqu1": "还不够!", "#gzbuqu2": "我绝不会倒下!", + "#old_zhoutai:die": "已经,尽力了……", "#jushou1": "我先休息一会!", "#jushou2": "尽管来吧!", + "#new_caoren:die": "实在是守不住了……", "#duanliang1_re_xuhuang1": "粮不三载,敌军已犯行军大忌。", "#duanliang1_re_xuhuang2": "断敌粮秣,此战可胜。", "#jiezi1": "因粮于敌,故军食可足也。", @@ -5076,14 +5858,14 @@ game.import("character", function () { "#xiaoqiao:die": "公瑾……我先走一步……", "#releiji1": "成为黄天之世的祭品吧!", "#releiji2": "呼风唤雨,驱雷策电!", - "#guidao_sp_zhangjiao1": "道士所向,皆由我控。", - "#guidao_sp_zhangjiao2": "天意如此。", - "#huangtian21": "苍天不覆,黄天交替!", + "#guidao_sp_zhangjiao1": "道施所向,皆由我控。", + "#guidao_sp_zhangjiao2": "哼哼,天意如此。", + "#huangtian21": "苍天不覆,黄天将替!", "#huangtian22": "黄天立,民心顺,天下平。", "#sp_zhangjiao:die": "黄天既覆……苍生何存?", "#guhuo_guess1": "道法玄机,变幻莫测。", "#guhuo_guess2": "如真似幻,扑朔迷离。", - "#re_yuji:die": "幻化之物,终是算不得真呐……", + "#re_yuji:die": "道法玄机,竟被参破……", "#bazhen1": "你可识得此阵?", "#bazhen2": "太极生两仪,两仪生四象,四象生八卦。", "#huoji1": "此火可助我军大获全胜。", @@ -5134,19 +5916,19 @@ game.import("character", function () { "#haoshi2": "拿去拿去,莫跟哥哥客气!", "#dimeng1": "合纵连横,方能以弱胜强。", "#dimeng2": "以和为贵,以和为贵。", - "#re_lusu:die": "一生为国,纵死无憾……", + "#re_lusu:die": "此联盟已破,吴蜀休矣……", "#yinghun1": "不诛此贼三族,则吾死不瞑目!", "#yinghun2": "以吾魂魄,保佑吾儿之基业。", "#sunjian:die": "有埋伏!呃……啊!!", - "#jiuchi1": "呃……再来……一壶……", - "#jiuchi2": "好酒!好酒!", - "#roulin1": "美人儿,来,香一个~~", - "#roulin2": "食色,性也~~", - "#benghuai1": "呃……", - "#benghuai2": "我是不是该减肥了?", - "#baonue21": "杀得好,大大有赏!", - "#baonue22": "哈哈哈哈哈哈~不愧是我的好部下!", - "#dongzhuo:die": "为何人人……皆与我为敌?", + "#jiuchi1": "呃呵呵呵呵,好酒好酒!", + "#jiuchi2": "呃……再来……一壶……", + "#roulin1": "食色,性也~~", + "#roulin2": "美人儿,来,香一个~~", + "#benghuai1": "嗯呃~", + "#benghuai2": "哎,我是不是该减肥了?", + "#baonue21": "呵哈哈哈哈哈哈哈哈!", + "#baonue22": "顺我者昌,逆我者亡!", + "#dongzhuo:die": "汉室衰落,非我一人之罪……", "#luanwu1": "哭喊吧,哀求吧,挣扎吧,然后,死吧!", "#luanwu2": "哼哼哼……坐山观虎斗!", "#wansha1": "神仙难救,神仙难救啊。", @@ -5301,7 +6083,6 @@ game.import("character", function () { "#drlt_qingce1": "感明帝之恩,清君侧之贼。", "#drlt_qingce2": "得太后手诏,清奸佞乱臣。", "#rejizhi_lukang1": "智父安能有愚子乎?", - "#rejizhi_lukang2": "智父安能有愚子乎?", "#drlt_huairou1": "各保分界,无求细利。", "#drlt_huairou2": "胸怀千万,彰其德,包其柔。", "#shensu11": "吾善于千里袭人!", @@ -5538,6 +6319,26 @@ game.import("character", function () { "#spmiewu2": "吾军势如破竹,江东六郡唾手可得。", // sp + "#olziruo1": "泰山虽崩于前,我亦风清云淡。", + "#olziruo2": "诸君勿忧,一切尽在掌握。", + "#olxvfa1": "常言道,积善之家必有余庆。", + "#olxvfa2": "蓄势待发,一鸣惊天下。", + "#ol_jiangwan:die": "臣既暗弱,加婴疾疢,规方无成……", + "#olsilv1": "大义同胶漆,匪石心不移。", + "#olsilv2": "人谁不虑终,日月有合离。", + "#ollianju1": "叹息亦何为,但恐大义亏。", + "#ollianju2": "室中是阿谁,叹息声正悲。", + "#ol_liwan:die": "及尔偕老,老使我怨……", + "#oljingzhou1": "艨艟连江,敌必不战自退。", + "#oljingzhou2": "精舟锐进,直捣孙家老巢。", + "#olzuolian1": "有我操练水军,曹公大可放心!", + "#olzuolian2": "好!儿郎们很有精神!", + "#caimao:die": "丞相,末将忠心耿耿呀……", + "#olrunwei1": "流水不言,泽德万物。", + "#olrunwei2": "生如春雨,润物无声。", + "#olcangxin1": "世间百味,品在唇而味在心。", + "#olcangxin2": "我藏风雨于心,故而衣不沾雨。", + "#ol_luyusheng:die": "郁生既为张妇,誓不再许!", "#olliantao1": "沙场百战疾,争衡天下间。", "#olliantao2": "征战无休,决胜千里。", "#sp_sunce:die": "身受百创,力难从心……", @@ -5979,7 +6780,7 @@ game.import("character", function () { "#zhugeke:die": "重权震主,是我疏忽了……", "#huxiao1": "大仇未报,还不能放弃!", "#huxiao2": "虎父无犬女!", - "#xueji1": "取你首级,祭先父之灵!", + "#xueji1": "这炽热的鲜血,父亲,你可感觉得到?", "#xueji2": "取你首级,祭先父之灵!", "#wuji1": "我感受到了,父亲的力量。", "#wuji2": "我也要像父亲那样坚强。", @@ -6106,7 +6907,7 @@ game.import("character", function () { "#zumao:die": "孙将军,已经,安全了吧……", "#zhenwei1": "江夏防线,固若金汤!", "#zhenwei2": "再敢来犯,仍叫你无功而返!", - "#wenpin:die": "魏王知遇之恩,今以死相报……", + "#wenpin:die": "终于,也守不住了……", "#xingwu1": "哼,不要小瞧女孩子哦!", "#xingwu2": "姐妹齐心,其利断金。", "#daxiaoqiao:die": "伯符,公瑾,请一定要守住我们的江东啊!", @@ -6192,7 +6993,7 @@ game.import("character", function () { "#chuanxin2": "穿心之痛,细细品吧,哈哈哈哈!", "#zfengshi1": "大军压境,还不卸甲受降!", "#zfengshi2": "放下兵器,饶你不死!", - "#zhangren:die": "老臣,绝不事二主!", + "#zhangren:die": "本将军败于诸葛,无憾!", "#wylianji1": "两计扣用,以催强势。", "#wylianji2": "容老夫细细思量。", "#moucheng1": "董贼伏诛,天下太平!", @@ -6270,8 +7071,6 @@ game.import("character", function () { "#xintan2": "人人心中都有一团欲望之火!", "#tianxiang_daxiaoqiao1": "哼,我才不怕你呢~", "#tianxiang_daxiaoqiao2": "替我挡着吧~", - "#liuli_daxiaoqiao1": "不懂得怜香惜玉么~", - "#liuli_daxiaoqiao2": "交给你了。", "#zhengnan1": "末将愿承父志,随丞相出征!", "#zhengnan2": "索全凭丞相差遣,万死不辞!", "#wusheng_guansuo1": "逆贼,可识得关氏之勇?", @@ -6299,8 +7098,16 @@ game.import("character", function () { "#olpijing1": "今青锋在手,必破敌军于域外。", "#olpijing2": "荆楚多锦绣,安能丧于小儿之手!", "#liupan:die": "今袍泽离散,无以为战……", + "#olqingya1": "罡风从虎,威震四方!", + "#olqingya2": "铁车过处,寸草不生!", + "#yadan:die": "多谢丞相不杀之恩……", // sp2 + "#mpqianlin1": "吾性至俭,不能自奉,何况遗人?", + "#mpqianlin2": "以财自污,则免清高之祸。", + "#mpsixiao1": "风木之悲,痛彻肺腑。", + "#mpsixiao2": "外容毁悴,内心神伤。", + "#mp_wangrong:die": "自阮、嵇云亡,为世所羁,实有所叹……", "#starliangyan1": "佳燕并头语,不恋雕梁而归于万里。", "#starliangyan2": "灵禽非醴泉不饮,非积善之家不栖。", "#starminghui1": "大智若愚,女子之锦绣常隐于华服。", @@ -6627,7 +7434,10 @@ game.import("character", function () { "#sptunjiang1": "江夏冲要之地,孩儿愿往守之。", "#sptunjiang2": "皇叔勿惊,吾与关将军已到。", "#sp_liuqi:die": "父亲,孩儿来,见你了……", - "#xinfu_xingzhao": "拿些上好的木料来。", + "#xinfu_xingzhao1": "拿些上好的木料来。", + "#xinfu_xingzhao2": "精挑细选,方能成百年之计。", + "#xz_xunxun1": "让我先探他一探。", + "#xz_xunxun2": "船,也不是一天就能造出来的。", "#xf_tangzi:die": "偷工减料,要不得啊……", "#xinfu_dianhu1": "就用你,给我军祭旗!", "#xinfu_dianhu2": "预则立,不预则废!", @@ -6709,14 +7519,16 @@ game.import("character", function () { "#zhangu2": "雄狮搏兔,何须援乎?", "#bmcanshi1": "是你,在召唤我吗?", "#bmcanshi2": "这片土地的人,真是太有趣了。", - "#xz_xunxun1": "精挑细选,方能成百年之计。", - "#xz_xunxun2": "让我先探他一探。", - "#xinfu_xingzhao2": "船,也不是一天就能造出来的。", "#starruijun1": "三军夺锐,势不可挡。", "#starruijun2": "士如钢锋,可破三属之甲。", "#stargangyi1": "不见狼居胥,何妨马革裹尸。", "#stargangyi2": "既无功,不受禄。", "#star_sunjian:die": "身怀宝器,必受群狼觊觎……", + "#starjiaohao1": "倚嗅杏雨黄花,心怀西风烈马!", + "#starjiaohao2": "站住!且与本姑娘分个高下!", + "#starsaying1": "倩影映江汀,巾帼犹飒爽!", + "#starsaying2": "我有一袭红袖,欲揾英雄泪!", + "#star_sunshangxiang:die": "秋风冷,江水寒……", // standard "#ganfuren:die": "请替我照顾好阿斗……", @@ -6849,6 +7661,8 @@ game.import("character", function () { "#twduwang2": "勇绝河北,吾足以一柱擎天!", "#twylyanshi1": "今破曹军,明日当直取许都!", "#twylyanshi2": "全军整肃,此战不得有失!", + "#twxiayong1_tw_yanliang": "呃啊,马失前蹄,大意了!", + "#twxiayong2_tw_yanliang": "哈哈哈,先发制人!", "#tw_yanliang:die": "哥哥,切不可轻敌!", "#twjuexing1": "阿瞒且寄汝首,待吾一骑取之!", "#twjuexing2": "杀!尽奸贼败军之众!", @@ -6856,7 +7670,7 @@ game.import("character", function () { "#twxiayong2": "这般身手,也敢来战我?", "#tw_wenchou:die": "黄泉路上,你我兄弟亦不可独行……", "#twqiaosi1": "身居长位,犹处峭崖之巅。", - "#twqiaosi2": "为长而不得承嗣,岂有善种乎?", + "#twqiaosi2": "为长而不得承嗣,岂有善终乎?", "#twbaizu1": "今袁氏之事,岂独因我?", "#twbaizu2": "长幼之序不明,何惜操戈以正!", "#tw_yuantan:die": "咄,儿过我,必使富贵。呃……!", @@ -7119,7 +7933,7 @@ game.import("character", function () { "#twjuezhu2": "天下可无洪,不可无君。", "#xinzhenjun1": "将怀其威,则镇其军。", "#xinzhenjun2": "治军之道,得之于严。", - "#tw_yujin:die": "命归九泉,何颜面对……", + "#tw_yujin:die": "今即命归九泉,何颜……", "#cuijin1": "诸军速行,违者军法论处!", "#cuijin2": "快!贻误军机者,定斩不赦!", "#yuejiu:die": "哼,动手吧!", @@ -7169,17 +7983,9 @@ game.import("character", function () { "#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": "两国得此联姻,邦交更当稳固。", "#twfeifu1": "此亦久矣,其能复几!", "#twfeifu2": "以侯归第?终败于其!", "#twzhian1": "此等蝼蚁不除,必溃千丈之堤!", @@ -7188,6 +7994,21 @@ game.import("character", function () { "#bmcanshi_tw_beimihu2": "小则蚕食,大则溃坝。", // xianding + "#dctongdao1": "安定宫无一丈之长,恐难七步成诗。", + "#dctongdao2": "故峻恶,皓恶甚于峻。", + "#dccilv1": "妾一介女流,安知社稷之虑。", + "#dccilv2": "家国无损、宗庙得续,我无异议。", + "#zhupeilan:die": "生如浮萍,随波而逝……", + "#dcsbwuwei1": "残阳洗长刀,漫卷天下帜。", + "#dcsbwuwei2": "武效万人敌,复行千里路。", + "#dc_sb_guanping:die": "生未屈刀兵,死罢战黄泉……", + "#dcxingmen1": "尔等,休道我关氏无人!", + "#dcxingmen2": "义在人心,人人皆可成关公。", + "#dcfenhui1": "国仇家恨,不共戴天!", + "#dcfenhui2": "手中虽无青龙吟,心有长刀仍啸月。", + "#dcshouzhi1": "日暮且眠岗上松,散尽千金买东风。", + "#dcshouzhi2": "这沽来的酒,哪有赊的有味道。", + "#guanyue:die": "提履无处归,举目山河冷……", "#dcsbtaozhou1": "皇叔借荆州久矣,瑾特来讨要。", "#dcsbtaozhou2": "荆州弹丸之地,诸君岂可食言而肥?", "#dcsbhoude1": "君子有德,可以载天下之重。", @@ -7254,8 +8075,12 @@ game.import("character", function () { "#dc_sb_zhouyu:die": "人生之艰难,犹如不息之长河……", "#dcsbmingshi1": "联刘以抗曹,此可行之大势。", "#dcsbmingshi2": "强敌在北,唯协力可御之。", - "#dcsbmengmou1": "合左抑右,定两家之盟。", - "#dcsbmengmou2": "求同存异,邀英雄问鼎。", + "#dcsbmingshi_dc_sb_lusu_shadow1": "今天下春秋已定,君不见南北沟壑乎?", + "#dcsbmingshi_dc_sb_lusu_shadow2": "善谋者借势而为,其化万物为己用。", + "#dcsbmengmou1": "南北同仇,请皇叔移驾江东,共观花火。", + "#dcsbmengmou2": "孙刘一家,慕英雄之意,忾窃汉之敌。", + "#dcsbmengmou_dc_sb_lusu_shadow1": "合左抑右,定两家之盟。", + "#dcsbmengmou_dc_sb_lusu_shadow2": "求同存异,邀英雄问鼎。", "#dc_sb_lusu:die": "虎可为之用,亦可为之伤……", "#dcqiongying1": "冰心碎玉壶,光转琼英灿。", "#dcqiongying2": "玉心玲珑意,撷英倚西楼。", @@ -7623,20 +8448,8 @@ game.import("character", function () { "#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": "奋音鼓劲,片甲不留!", @@ -7719,6 +8532,13 @@ game.import("character", function () { "#xinfu_zhanji2": "功曹之恩,吾必有展骥之机。", // yijiang + // 击、逆、泰、每,懂? + "#fazhu1": "击风雨于共济,逆流亦溯千帆。", + "#fazhu2": "泰山轻于大义,每思志士、何惧临渊。", + "#xukun:die": "何处射来的流矢?", + "#kangli1": "地界纷争皋陶难断,然图藏天府,坐上可明。", + "#kangli2": "正至歉岁,难征百姓于役,望陛下明鉴。", + "#sunli:die": "国无矩不立,何谓之方圆?", "#tongwei1": "集关西诸路大军,必雪当年长坂坡之耻。", "#tongwei2": "手织天网十万尺,欲擒飞龙落彀中。", "#cuguo1": "身担父命,怎可蜷于宫阙。", @@ -7801,22 +8621,23 @@ game.import("character", function () { "#qice2": "倾力为国,算无遗策。", "#zhiyu1": "大勇若怯,大智如愚。", "#zhiyu2": "愚者既出,智者何存?", - "#xunyou:die": "主公何日再得无忧?", + "#xunyou:die": "主公,臣下先行告退……", "#xinwuyan1": "汝有良策,何必问我!", "#xinwuyan2": "吾,誓不为汉贼献一策!", - "#xinjujian1": "卧龙之才,远胜于我。", + "#xinjujian1": "卧龙之才,远胜于吾。", "#xinjujian2": "天下大任,望君莫辞!", "#xin_xushu:die": "忠孝不能两全,孩儿……", "#sanyao1": "三人成虎,事多有。", "#sanyao2": "散谣惑敌,不攻自破!", "#zhiman1": "丞相多虑,且看我的!", "#zhiman2": "兵法谙熟于心,取胜千里之外!", + "#xin_masu:die": "败军之罪,万死难赎!", "#danshou1": "以胆为守,扼敌咽喉!", "#danshou2": "到此为止了!", "#zhuran:die": "何人竟有如此之胆!?", - "#xinpojun1": "大军在此!汝等休想前进一步!", - "#xinpojun2": "敬请,养精蓄锐!", - "#xusheng:die": "可怜一身胆略,尽随一抔黄土……", + "#pojun1": "大军在此!汝等休想前进一步!", + "#pojun2": "敬请,养精蓄锐!", + "#xusheng:die": "盛不能奋身出命,不亦辱乎……", "#ganlu1": "男婚女嫁,须当交换文定之物。", "#ganlu2": "此真乃吾之佳婿也。", "#buyi1": "吾乃吴国之母,何人敢放肆?", @@ -7999,8 +8820,8 @@ game.import("character", function () { "#guotufengji:die": "大势已去,无力回天……", "#juece1": "哼!你走投无路了。", "#juece2": "无用之人,死!", - "#xinmieji1": "宁错杀,无放过!", - "#xinmieji2": "你能逃得出我的手掌心吗?", + "#mieji1": "宁错杀,无放过!", + "#mieji2": "你能逃得出我的手掌心吗?", "#xinfencheng1": "我得不到的,你们也别想得到!", "#xinfencheng2": "让这一切都灰飞烟灭吧!哼哼哼哼……", "#xin_liru:die": "如遇明主,大业必成……", @@ -8084,6 +8905,7 @@ game.import("character", function () { "#xuezong:die": "尔等,竟做如此有辱斯文之事……", "#shiyong1": "好大一股杀气啊!", "#shiyong2": "好大一股酒气啊!", + "#old_huaxiong:die": "皮厚,不挡刀啊……", "#jieyue1": "安营驻寨,严守城防。", "#jieyue2": "诸军严整,敌军自乱。", "#yujin:die": "我,无颜面对丞相了……", @@ -8359,7 +9181,7 @@ game.import("character", function () { "#gz_guanyu:die": "什么?此地名叫麦城?", "#gz_zhangfei:die": "实在是杀不动了……", "#gz_zhugeliang:die": "将星陨落,天命难违……", - "#gz_zhaoyun:die": "这……就是失败的滋味吗……", + "#gz_zhaoyun:die": "这,就是失败的滋味吗……", "#gz_machao:die": "(马蹄声远去……)", "#gz_huangyueying:die": "亮……", "#liegong1": "百步穿杨!", @@ -8367,7 +9189,7 @@ game.import("character", function () { "#gz_huangzhong:die": "不得不服老啦~", "#kuanggu1": "我会怕你吗!", "#kuanggu2": "真是美味啊!", - "#gz_weiyan:die": "谁敢杀我!呃啊!", + "#gz_weiyan:die": "谁敢杀我?!呃啊……", "#gz_pangtong:die": "看来我命中注定将丧命于此……", "#gz_liushan:die": "别……别打脸,我投降还不行吗?", "#gz_menghuo:die": "七纵之恩……来世……再报了……", @@ -8391,7 +9213,6 @@ game.import("character", function () { "#gz_sunjian:die": "有埋伏!呃……啊!!", "#gz_xiaoqiao:die": "公瑾,我先走一步……", "#gz_re_taishici:die": "无妄之灾,难以避免……", - "#buqu1": "哼,这点小伤算什么!", "#gz_zhoutai:die": "敌众我寡,无力回天……", "#guzheng2": "固国安邦,居当如是!", "#gz_zhangzhang:die": "竭力尽智,死而无憾……", @@ -8413,7 +9234,7 @@ game.import("character", function () { "#leiji2": "以我之真气,合天地之造化!", "#guidao1": "哼哼哼哼~", "#guidao2": "天下大势,为我所控。", - "#gz_zhangjiao:die": "黄天既覆,苍生何存……", + "#gz_zhangjiao:die": "黄天,也死了……", "#gz_caiwenji:die": "人生几何时,怀忧终年岁……", "#gz_mateng:die": "儿子,为爹报仇啊!", "#gz_kongrong:die": "覆巢之下,岂有完卵……", @@ -8466,21 +9287,46 @@ game.import("character", function () { "#jizhao2": "王业不偏安,起师再兴汉!", "#rerende_gz_jun_liubei1": "勿以恶小而为之,勿以善小而不为。", "#rerende_gz_jun_liubei2": "君才十倍于丕,必能安国成事。", - "#gz_jun_liubei:die": "若嗣子可辅,辅之。如其不才,君可自取……", + "#shouyue": "布德而昭仁,见旗如见朕!", + "#shouyue_wusheng1": "关将军雄姿,由你再现!", + "#shouyue_wusheng2": "再次威震华雄,必成汉兴佳话!", + "#shouyue_paoxiao1": "杀!把他捅成马蜂窝!", + "#shouyue_paoxiao2": "昔日长坂坡,今日再咆哮!", + "#shouyue_longdan1": "请收好,此乃子龙枪法。", + "#shouyue_longdan2": "子龙将助你一臂之力。", + "#shouyue_tieji1": "西凉的马蹄声,真好听。", + "#shouyue_tieji2": "马家军风采何在?!", + "#shouyue_liegong1": "当年老将军冲锋,也是这时机。", + "#shouyue_liegong2": "百步穿杨,立功拜将!", + "#gz_jun_liubei:die": "若嗣子可辅,辅之;如其不才,君可自取……", "#wuxin1": "冀悟迷惑之心。", "#wuxin2": "吾已明此救世之术矣。", - "#hongfa1": "汝等安心,吾乃大贤良师矣。", - "#hongfa2": "此法可助汝等脱离苦海。", + "#hongfa1": "苍天已死,黄天当立!", + "#hongfa2": "汝等安心,吾乃大贤良师也。", + "#hongfa3": "此法可助汝等脱离苦海。", "#huangjintianbingfu1": "此乃天将天兵,尔等妖孽看着!", "#huangjintianbingfu2": "且作一法,召唤神力!", - "#hongfa_hp": "吾有天神护体!", + "#huangjintianbingfu3": "吾有天神护体!", "#wendao1": "诚心求天地之道,救世之法。", "#wendao2": "求太平之法以安天下。", "#gz_jun_zhangjiao:die": "天,真要灭我……", - "#jiahe1": "有敌来犯,速速御敌。", - "#jiahe2": "来,扶孤上马迎敌!", + "#jiahe": "嘉禾生,大吴兴!", + "#yuanjiangfenghuotu1": "保卫国家,人人有责!", + "#yuanjiangfenghuotu2": "连绵的烽火,就是对敌人最好的震慑!", + "#yuanjiangfenghuotu3": "有敌来犯,速速御敌!", + "#yuanjiangfenghuotu4": "来,扶孤上马迎敌!", + "#jiahe_reyingzi1": "大吴江山,儒将辈出。", + "#jiahe_reyingzi2": "千夫奉儒将,百兽伏麒麟。", + "#jiahe_haoshi1": "朋友有难,当倾囊相助。", + "#jiahe_haoshi2": "好东西,就要跟朋友分享。", + "#jiahe_shelie1": "军中多务,亦当涉猎。", + "#jiahe_shelie2": "少说话,多看书。", + "#jiahe_duoshi1": "广施方略,以观其变。", + "#jiahe_duoshi2": "莫慌,观察好局势再做行动。", "#lianzi1": "税以足食,赋以足兵。", "#lianzi2": "府库充盈,国家方能强盛!", + "#zhiheng_gz_jun_sunquan1": "二宫并阙,孤之所愿。", + "#zhiheng_gz_jun_sunquan2": "鲁王才兼文武,堪比太子。", "#jubao1": "四海之宝,孤之所爱。", "#jubao2": "夷洲,扶南,辽东,皆大吴臣邦也!", "#gz_jun_sunquan:die": "朕的江山,要倒下了么……", @@ -8491,7 +9337,7 @@ game.import("character", function () { "#jihun2": "魂羽化游,以辅四方。", "#gz_zuoci:die": "腾云跨风,飞升太虚……", "#gz_bianfuren:die": "心肝涂地,惊愕断绝……", - "#gz_xunyou:die": "主公何日再得无忧?", + "#gz_xunyou:die": "主公,臣下先行告退……", "#xuanlve1": "强敌破阵,斩将于须臾!", "#xuanlve2": "轻装急袭,破敌于千里!", "#yongjin1": "冲啊,扬我东吴之勇!", @@ -8526,11 +9372,15 @@ game.import("character", function () { "#gz_lvlingqi:die": "父亲,女儿好累……", "#gz_dc_yanghu:die": "臣死之后,杜元凯可继之……", "#gz_cuimao:die": "为世所痛惜,冤哉……", - "#gz_yujin:die": "我,无颜面对丞相了……", "#jianglue1": "奇谋为短,将略为要。", "#jianglue2": "为将者,需有谋略。", "#gz_wangping:die": "无当飞军,也有困于深林之时……", - "#gz_fazheng:die": "辅翼既折,蜀汉衰矣……", + "#fz_wusheng": "武节不减,圣德加身。", + "#fz_new_paoxiao": "刚勇奋战,绝不退缩!", + "#fz_new_longdan": "盘龙卧旋,攻防无解。", + "#fz_new_tieji": "战骑铁甲,撼动踏阵。", + "#fz_liegong": "挽弓箭出,流火漫天。", + "#fz_xinkuanggu": "猎战沙场,我的乐趣。", "#gz_wuguotai:die": "卿等,务必用心辅佐仲谋……", "#keshou1": "仁以待民,自处不败之势。", "#keshou2": "宽济百姓,则得战前养备之机。", @@ -8540,12 +9390,18 @@ game.import("character", function () { "#gzfudi2": "绣虽有降心,奈何贵营难容。", "#drlt_congjian1": "听君谏言,去危亡,保宗祀!", "#gz_zhangxiu:die": "若失文和,吾将何归?", - "#jianan1": "行为军锋,还为后拒!", - "#jianan2": "行为军锋,还为后拒!", + "#jianan": "设使天下无孤,不知几人称帝,几人称王?", + "#wuziliangjiangdao1": "行为军锋,还为后拒!", + "#wuziliangjiangdao2": "国之良将,五子为先。", + "#jianan_tuxi": "以百破万,让孤再看一次!", + "#jianan_qiaobian": "孤之兵道,此一时,彼一时。", + "#jianan_xiaoguo": "使孤梦回辽东者,卿之雄风也!", + "#jianan_jieyue": "孤之股肱,谁敢不从?嗯?", + "#jianan_duanliang": "孤以为断粮如断肠,卿意下如何?", "#huibian1": "吾任天下之智力,以道御之,无所不可。", - "#huibian2": "青青子衿,悠悠我心,但为君故,沉吟至今。", + "#huibian2": "青青子衿,悠悠我心。但为君故,沉吟至今。", "#gzzongyu1": "驾六龙,乘风而行。行四海,路下之八邦。", - "#gzzongyu2": "齐桓之功,为霸之首,九合诸侯,一匡天下。", + "#gzzongyu2": "齐桓之功,为霸之首。九合诸侯,一匡天下!",//配音错误?,应为:齐桓之功,为霸之道 "#gz_jun_caocao:die": "神龟虽寿,犹有竟时。腾蛇乘雾,终为土灰……", "#sanchen1": "陈书弼国,当一而再、再而三。", "#gz_duyu:die": "金瓯尚缺,死难瞑目……", @@ -8577,6 +9433,29 @@ game.import("character", function () { "#mobiledanshou1": "此诚危难,我定当竭尽全力!", "#gz_gaoshun:die": "生死有命……", "#weishu2": "吴人来犯,当用心戒备。", + + // boss + "#boss_lvbu1:die": "虎牢关,失守了……", + "#xiuluo1": "准备受死吧!", + "#xiuluo2": "鼠辈!螳臂当车!", + "#shenwei1": "萤烛之火,也敢与日月争辉?", + "#shenwei2": "我不会输给任何人!", + "#shenji1": "杂鱼们!都去死吧!", + "#shenji2": "竟想赢我?痴人说梦!", + "#boss_lvbu2:die": "虎牢关,失守了……", + "#shenqu1": "别心怀侥幸了,你们不可能赢!", + "#shenqu2": "虎牢关,我一人镇守足矣!", + "#jiwu1": "我,是不可战胜的!", + "#jiwu2": "今天,就让你们感受一下真正的绝望!", + "#qiangxi_boss_lvbu31": "这么想死,那我就成全你!", + "#qiangxi_boss_lvbu32": "项上人头,待我来取!", + "#retieji_boss_lvbu31": "哈哈哈,破绽百出!", + "#retieji_boss_lvbu32": "我要让这虎牢关下,血流成河!", + "#xuanfeng_boss_lvbu31": "千钧之势,力贯苍穹!", + "#xuanfeng_boss_lvbu32": "横扫六合,威震八荒!", + "#wansha_boss_lvbu31": "蝼蚁,怎容偷生?", + "#wansha_boss_lvbu32": "沉沦吧,在这无边的恐惧!", + "#boss_lvbu3:die": "你们的项上人头,我改日再取!", /*--------------------------------台词因名将吴懿而更新,所以都放这里很合理吧(结束)--------------------------------*/ }, diff --git a/character/diy.js b/character/diy.js index cb30008c..69c0932f 100644 --- a/character/diy.js +++ b/character/diy.js @@ -127,6 +127,7 @@ game.import("character", function () { ["qun", "die_audio:shen_zhangjiao"], ], junk_guanyu: ["male", "shu", 4, ["olsbfumeng", "olsbguidao"]], + junk_liuyan: ["male", "qun", "4/6", ["olpianan", "olyinji", "olkuisi"]], }, characterFilter: { ns_duangui(mode) { @@ -213,20 +214,7 @@ game.import("character", function () { ], diy_default: ["diy_yuji", "diy_caiwenji", "diy_lukang", "diy_zhenji", "old_majun"], diy_noname: ["noname"], - diy_trashbin: [ - "junk_guanyu", - "junk_zhangjiao", - "old_jiakui", - "ol_guohuai", - "junk_zhangrang", - "old_bulianshi", - "ol_maliang", - "junk_liubei", - "junk_huangyueying", - "junk_lidian", - "junk_duanwei", - "junk_xuyou", - ], + diy_trashbin: ["junk_guanyu", "junk_zhangjiao", "old_jiakui", "ol_guohuai", "junk_zhangrang", "old_bulianshi", "ol_maliang", "junk_liubei", "junk_huangyueying", "junk_lidian", "junk_duanwei", "junk_xuyou", "junk_liuyan"], }, }, characterIntro: { @@ -1233,6 +1221,7 @@ game.import("character", function () { }, noname_duocai2: { charlotte: true }, nsbizhao: { + unique: true, trigger: { player: "showCharacterAfter" }, forced: true, hiddenSkill: true, @@ -1587,6 +1576,9 @@ game.import("character", function () { ) player.storage.nsfuzhou_draw = true; }, + ai: { + combo: "nsfuzhou", + }, derivation: ["nsfuzhou_damage", "nsfuzhou_draw"], }, nsweiyuan: { @@ -4049,19 +4041,14 @@ game.import("character", function () { 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; @@ -4073,6 +4060,8 @@ game.import("character", function () { } } } + if (info.shaRelated === false) return false; + if (get.skillInfoTranslation(list[i], player).includes("【杀】")) return true; } return false; }; @@ -4524,6 +4513,7 @@ game.import("character", function () { }, }, nschangshi: { + mode: ["identity"], enable: "phaseUse", usable: 1, filter(event, player) { @@ -4539,17 +4529,24 @@ game.import("character", function () { multitarget: true, selectTarget: 2, content() { - var tmp = targets[0].hp; - targets[0].hp = targets[1].hp; - targets[1].hp = tmp; - targets[0].update(); - targets[1].update(); - if (Math.abs(targets[0].hp - targets[1].hp) == 1) { - player.loseHp(); - } - //else{ - //player.die(); - //} + game.broadcastAll( + function (player, targets) { + player.showIdentity(); + var tmp = targets[0].hp; + targets[0].hp = targets[1].hp; + targets[1].hp = tmp; + targets[0].update(); + targets[1].update(); + if (Math.abs(targets[0].hp - targets[1].hp) == 1) { + player.loseHp(); + } + //else{ + //player.die(); + //} + }, + player, + targets + ); }, ai: { order: 10, @@ -4573,6 +4570,7 @@ game.import("character", function () { }, }, nsjianning: { + mode: ["identity"], enable: "phaseUse", usable: 1, filter(event, player) { @@ -4583,6 +4581,11 @@ game.import("character", function () { }, content() { "step 0"; + if (!player.identityShown) { + game.broadcastAll(function (player) { + player.showIdentity(); + }, player); + } player.swapHandcards(target); "step 1"; target.damage(); @@ -4612,6 +4615,7 @@ game.import("character", function () { }, }, nscuanquan: { + mode: ["identity"], init(player) { player.storage.nscuanquan = 0; }, @@ -4622,12 +4626,7 @@ game.import("character", function () { animationColor: "thunder", trigger: { player: "damageAfter" }, filter(event, player) { - return ( - player.identity == "zhong" && - player.storage.nscuanquan == 3 && - game.zhu && - game.zhu.isZhu - ); + return player.identity == "zhong" && player.storage.nscuanquan == 3 && game.zhu && game.zhu.isZhu; }, group: "nscuanquan_count", subSkill: { @@ -4644,16 +4643,19 @@ game.import("character", function () { }, content() { player.awakenSkill("nscuanquan"); - var tmp = player.maxHp; - player.identity = "zhu"; - player.maxHp = game.zhu.hp; - player.showIdentity(); - player.update(); - game.zhu.identity = "zhong"; - game.zhu.maxHp = tmp; - game.zhu.showIdentity(); - game.zhu.update(); - game.zhu = player; + game.broadcastAll(function (player) { + var tmp = player.maxHp; + player.identity = "zhu"; + player.maxHp = game.zhu.hp; + player.showIdentity(); + player.update(); + game.zhu.identity = "zhong"; + game.zhu.maxHp = tmp; + game.zhu.showIdentity(); + game.zhu.update(); + game.zhu = player; + }, player); + event.trigger("zhuUpdate"); }, }, nstianji: { @@ -4928,6 +4930,9 @@ game.import("character", function () { }, }, group: "nsshijun_hp", + ai: { + halfneg: true, + }, }, nszhaoxin: { mark: true, @@ -4949,6 +4954,9 @@ game.import("character", function () { } }, }, + ai: { + neg: true, + }, }, nsxiuxin: { mod: { @@ -5998,6 +6006,19 @@ game.import("character", function () { subSkill: { used: {}, }, + ai: { + effect: { + target(card, player, target) { + if (get.tag(card, "save")) { + if (_status.currentPhase == player) return 0; + if (target.maxHp > 1 && player != target) return 0; + } + if (get.tag(card, "recover")) { + if (_status.currentPhase == player) return 0; + } + }, + }, + } }, nsshishou: { trigger: { player: "loseEnd" }, @@ -6029,17 +6050,7 @@ game.import("character", function () { }, }, ai: { - effect: { - target(card, player, target) { - if (get.tag(card, "save")) { - if (_status.currentPhase == player) return 0; - if (target.maxHp > 1 && player != target) return 0; - } - if (get.tag(card, "recover")) { - if (_status.currentPhase == player) return 0; - } - }, - }, + neg: true, }, }, nsduijue: { @@ -6106,6 +6117,7 @@ game.import("character", function () { }, }, nsshuangxiong: { + unique: true, trigger: { player: "juedouBegin", target: "juedouBegin" }, check(event, player) { return player.isTurnedOver(); @@ -6113,6 +6125,9 @@ game.import("character", function () { content() { player.turnOver(); }, + ai: { + combo: "nsduijue" + }, }, nsguanyong: { enable: "chooseToRespond", @@ -6254,10 +6269,6 @@ game.import("character", function () { }, direct: true, priority: -0.1, - ai: { - maixie: true, - maixie_hp: true, - }, content() { "step 0"; event.num = trigger.num; @@ -6339,7 +6350,9 @@ game.import("character", function () { } }, ai: { - combo: "nshuanxian" + maixie: true, + maixie_hp: true, + combo: "nshuanxian", }, }, nsshoudao: { @@ -6938,6 +6951,9 @@ game.import("character", function () { "step 2"; trigger.cancel(); }, + ai: { + combo: "jugong", + }, }, nsxinsheng: { trigger: { source: "damageEnd" }, @@ -7501,6 +7517,7 @@ game.import("character", function () { }, ai: { expose: 0.2, + combo: "zhucheng", }, }, zhucheng: { @@ -8031,16 +8048,31 @@ game.import("character", function () { inherit: "jianxiong", }, diyjianxiong: { - mode: ["identity"], + mode: ["identity", "guozhan"], trigger: { global: "dieBefore" }, forced: true, filter(event, player) { - return event.player != game.zhu && _status.currentPhase == player; + if (_status.currentPhase !== player) return false; + if (get.mode() === "identity") return event.player != game.zhu; + return get.mode() === "guozhan" && event.player.isFriendOf(player); }, content() { - trigger.player.identity = "fan"; - trigger.player.setIdentity("fan"); - trigger.player.identityShown = true; + game.broadcastAll( + function (target, group) { + if (get.mode() === "identity") { + target.identity = group; + target.setIdentity(group); + target.identityShown = true; + } else { + target.trueIdentity = lib.group + .slice(0) + .filter(i => group !== i) + .randomGet(); + } + }, + trigger.player, + get.mode() === "identity" ? "fan" : player.getGuozhanGroup() + ); }, }, nsshuaiyan: { @@ -8691,6 +8723,7 @@ game.import("character", function () { diy_huangzhong: "黄汉升", diy_xuhuang: "徐公明", diy_dianwei: "新典韦", + diy_dianwei_prefix: "新", diy_weiyan: "魏文长", xicai: "惜才", diyjianxiong: "奸雄", @@ -9077,8 +9110,7 @@ game.import("character", function () { "出牌阶段限一次,你可以失去1点体力并选择一名其他角色,弃置该角色的一张牌。若此牌:为基本牌,你可以令一至X名角色各摸一张牌;不为基本牌,于此回合内:你的进攻距离+X,且你使用【杀】的额外目标数上限+X。(X为你已损失的体力值)", zhucheng: "筑城", zhucheng2: "筑城", - zhucheng_info: - "①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此杀的使用者弃置X张牌(X为“筑”的数量),否则杀对你无效。", + zhucheng_info: "①结束阶段开始时,若没有“筑”,你可以将牌堆顶的X张牌置于你的武将牌上〔称为“筑”〕(X为你已损失的体力值与1中的较大值),否则你可以获取所有“筑”。②当你成为【杀】的目标时,若有“筑”,你可以令此【杀】的使用者弃置X张牌(X为“筑”的数量),否则此【杀】对你无效。", duoqi: "夺气", duoqi_info: "当一名角色于除你之外的角色的出牌阶段内因弃置而失去牌后,你可以移去一张“筑”,并结束此出牌阶段。", @@ -9262,6 +9294,8 @@ game.import("character", function () { "准备阶段,若“黄”数大于牌堆的牌数,你可以移去所有“黄”,然后从牌堆中随机获得任意张点数之和为36的牌(若牌堆没有点数和为36的组合则获得牌堆顶点数和刚好超过36的牌组)。", junk_guanyu: "旧谋关羽", junk_guanyu_prefix: "旧谋", + junk_liuyan: "OL刘焉", + junk_liuyan_prefix: "OL", diy_tieba: "吧友设计", diy_xushi: "玩点论杀·虚实篇", diff --git a/character/extra.js b/character/extra.js index 3c9dafdf..e3b62e59 100644 --- a/character/extra.js +++ b/character/extra.js @@ -26,10 +26,12 @@ game.import("character", function () { extra_mobilexin: ["shen_taishici", "shen_sunce"], extra_mobileren: ["shen_huatuo", "shen_lusu"], extra_tw: ["tw_shen_guanyu", "tw_shen_lvmeng"], + extra_mb: ["xin_simayi"], extra_offline: ["shen_diaochan", "boss_zhaoyun", "shen_dianwei", "le_shen_jiaxu"], }, }, character: { + xin_simayi: ["male", "shen", 4, ["xinrenjie", "xinbaiyin", "xinlianpo"], ["tempname:shen_simayi", "wei"]], 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"]], @@ -63,7 +65,7 @@ game.import("character", function () { shen_luxun: ["male", "shen", 4, ["nzry_junlve", "nzry_cuike", "nzry_dinghuo"], ["wu"]], shen_zhangliao: ["male", "shen", 4, ["drlt_duorui", "drlt_zhiti"], ["wei"]], shen_ganning: ["male", "shen", "3/6", ["drlt_poxi", "drlt_jieying"], ["wu"]], - ol_zhangliao: ["male", "shen", 4, ["olduorui", "olzhiti"], ["wei"]], + ol_zhangliao: ["male", "shen", 4, ["olduorui", "olzhiti"], ["wei", "die_audio:shen_zhangliao"]], shen_caopi: ["male", "shen", 5, ["chuyuan", "dengji"], ["wei"]], shen_zhenji: ["female", "shen", 3, ["shenfu", "qixian"], ["wei"]], boss_zhaoyun: ["male", "shen", 1, ["boss_juejing", "xinlonghun", "zhanjiang"], ["shu"]], @@ -89,6 +91,7 @@ game.import("character", function () { 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"], }, characterFilter: { shen_diaochan(mode) { @@ -110,6 +113,214 @@ game.import("character", function () { }, /** @type { importCharacterConfig['skill'] } */ skill: { + //手杀神司马? + xinrenjie: { + audio: "renjie2", + trigger: { + global: ["shaDamage", "useCardToEnd"], + }, + filter(event, player, name) { + if (player.getRoundHistory("useSkill", evt => evt.skill == "xinrenjie").length >= 4) return false; + if (event.type != "card" || !event.target || event.target != player || event.player == player) return false; + if (player.hasHistory("useCard", evt => evt.respondTo && evt.respondTo[1] == event.card) || player.hasHistory("respond", evt => evt.respondTo && evt.respondTo[1] == event.card)) return false; + if (name == "shaDamage") return true; + return event.card.name != "sha" && !event.getParent()._neutralized; + }, + forced: true, + async content(event, trigger, player) { + player.addMark(event.name, 1); + }, + intro: { + name2: "忍", + content: "mark", + }, + marktext: "忍", + }, + 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"], + ]); + 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, @@ -229,6 +440,7 @@ game.import("character", function () { }, filter(event, player) { if (["global", "equip"].includes(event.type)) return false; + if ((get.info(event.skill) || {}).charlotte) return false; const skill = event.sourceSkill || event.skill; const info = get.info(skill); return info && !info.charlotte && !info.equipSkill; @@ -250,6 +462,7 @@ game.import("character", function () { }, filter(event, player) { if (["global", "equip"].includes(event.type)) return false; + if ((get.info(event.skill) || {}).charlotte) return false; const skill = event.sourceSkill || event.skill; const info = get.info(skill); return info && !info.charlotte && !info.equipSkill; @@ -1745,7 +1958,7 @@ game.import("character", function () { info[3].some(function (skill) { var info = get.skillInfoTranslation(skill); if (!info.includes("【杀】")) return false; - var list = get.skillCategoriesOf(skill); + var list = get.skillCategoriesOf(skill, player); list.remove("锁定技"); return list.length == 0; }) @@ -1786,7 +1999,7 @@ game.import("character", function () { var skills = info[3].filter(function (skill) { var info = get.skillInfoTranslation(skill); if (!info.includes("【杀】")) return false; - var list = get.skillCategoriesOf(skill); + var list = get.skillCategoriesOf(skill, get.player()); list.remove("锁定技"); return list.length == 0; }); @@ -1829,7 +2042,7 @@ game.import("character", function () { const skills = info[3].filter(function (skill) { var info = get.skillInfoTranslation(skill); if (!info.includes("【杀】")) return false; - var list = get.skillCategoriesOf(skill); + var list = get.skillCategoriesOf(skill, get.player()); list.remove("锁定技"); return list.length == 0; }); @@ -1932,7 +2145,7 @@ game.import("character", function () { var skills = info[3].filter(function (skill) { var info = get.skillInfoTranslation(skill); if (!info.includes("【杀】")) return false; - var list = get.skillCategoriesOf(skill); + var list = get.skillCategoriesOf(skill, get.player()); list.remove("锁定技"); return list.length == 0; }); @@ -2351,7 +2564,17 @@ game.import("character", function () { }, }, ai: { - combo: "dctuoyu", + effect: { + player(card, player, target) { + if ( + !get.tag(card, "damage") || + player.countMark("dcxianjin") % 2 || + !player.hasSkillTag("jueqing", false, target) + ) return; + if (player.isMaxHandcard()) return [1, 1]; + return [1, Math.min(3, 1 + player.getStorage("dctuoyu").length)]; + } + } }, }, dcqijing: { @@ -3277,7 +3500,6 @@ game.import("character", function () { }, }, subSkill: { phase: { charlotte: true } }, - shaRelated: true, }, twwuhun: { audio: 2, @@ -4326,6 +4548,9 @@ game.import("character", function () { }, }, }, + ai: { + combo: "yuheng" + }, }, yuheng: { audio: 2, @@ -4651,6 +4876,7 @@ game.import("character", function () { return 0; }, }, + combo: "tianren" }, subSkill: { effect: { @@ -6463,7 +6689,7 @@ game.import("character", function () { listm = listm.concat(listv); var func = function (skill) { var info = get.info(skill); - if (!info || info.charlotte) return false; + if (!info || info.charlotte || info.persevereSkill) return false; return true; }; for (var i = 0; i < listm.length; i++) { @@ -6496,7 +6722,7 @@ game.import("character", function () { listm = listm.concat(listv); var func = function (skill) { var info = get.info(skill); - if (!info || info.charlotte) return false; + if (!info || info.charlotte || info.persevereSkill) return false; return true; }; for (var i = 0; i < listm.length; i++) { @@ -6563,7 +6789,7 @@ game.import("character", function () { effect: { target: (card, player, target) => { if (!get.tag(card, "damage") || !target.hasFriend()) return; - if (player.hasSkillTag("jueqing", null, target)) return 1.7; + if (player.hasSkillTag("jueqing", false, target)) return 1.7; let die = [null, 1], temp; game.filterPlayer((i) => { @@ -7205,6 +7431,7 @@ game.import("character", function () { name2: "忍", content: "mark", }, + marktext: "忍", ai: { maixie: true, maixie_hp: true, @@ -9259,18 +9486,7 @@ game.import("character", function () { listm = listm.concat(listv); var func = function (skill) { var info = get.info(skill); - if ( - !info || - info.charlotte || - info.hiddenSkill || - info.zhuSkill || - info.juexingji || - info.limited || - info.dutySkill || - (info.unique && !info.gainable) || - lib.skill.drlt_duorui.bannedList.includes(skill) - ) - return false; + if (!info || info.charlotte || info.persevereSkill || info.hiddenSkill || info.zhuSkill || info.juexingji || info.limited || info.dutySkill || (info.unique && !info.gainable) || lib.skill.drlt_duorui.bannedList.includes(skill)) return false; return true; }; for (var i = 0; i < listm.length; i++) { @@ -9646,7 +9862,8 @@ game.import("character", function () { 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; @@ -10566,6 +10783,16 @@ game.import("character", function () { huandao: "寰道", huandao_info: "限定技。出牌阶段,你可以选择一名其他角色。你令其复原武将牌,系统随机生成一个与其同名的武将的武将牌上的一个与其拥有的技能均不同名的技能。其可以选择获得此技能,然后选择失去一个其他技能。", + xin_simayi: "手杀神司马懿", + 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枚“忍”标记并摸等量张牌。", extra_feng: "神话再临·风", extra_huo: "神话再临·火", @@ -10580,6 +10807,7 @@ game.import("character", function () { extra_offline: "神话再临·线下", extra_decade: "神·武", extra_tw: "海外服神将", + extra_mb: "移动版神将", }, }; }); diff --git a/character/gujian.js b/character/gujian.js index 4585eab0..02924540 100644 --- a/character/gujian.js +++ b/character/gujian.js @@ -1163,20 +1163,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 +2813,7 @@ game.import("character", function () { "锁定技,奇数游戏轮次开始时,你获得潜行直到下一轮开始;偶数游戏轮次开始时,你随机获得一张机关牌。", xuanci: "旋刺", xuanci_info: - "出牌阶段限一次,你可以将一张梅花牌当作飞镖使用;锁定技,你使用飞镖无距离限制,你使用飞镖后对目标结算后视为对目标使用一张杀。", + "出牌阶段限一次,你可以将一张梅花牌当作飞镖使用;锁定技,你使用飞镖无距离限制,你使用飞镖后对目标结算后视为对目标使用一张【杀】。", humeng: "湖梦", humeng_sub: "偃甲谢衣", humeng_info: @@ -2844,7 +2832,7 @@ game.import("character", function () { cihong: "刺鸿", cihong_bg: "鸿", cihong_info: - "每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去1点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张杀。", + "每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去1点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张【杀】。", lianjing: "莲境", lianjing_info: "每两轮限一次,回合结束后,你可以选择至多2名其他角色,将其他角色移出游戏,然后你与所选的角色依次进行一个回合。", @@ -2866,7 +2854,7 @@ game.import("character", function () { "濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并将体力值回复至与该角色相同;若你没赢,你立即死亡。", chizhen: "驰阵", chizhen_info: - "出牌阶段开始时,你可以摸X张牌并弃置X张牌,若你弃置了杀,可以视为使用一张决斗(X为你已损失的体力值且至少为1)。", + "出牌阶段开始时,你可以摸X张牌并弃置X张牌,若你弃置了【杀】,可以视为使用一张决斗(X为你已损失的体力值且至少为1)。", xidie: "戏蝶", xidie2: "戏蝶", xidie_info: @@ -2875,12 +2863,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 +2903,7 @@ game.import("character", function () { xiuhua_info: "每当一件其他角色的装备因被替换或弃置进入弃牌堆,你可以获得之。", liuying: "流影", liuying_info: - "每当你使用一张杀结算完毕后,你可以指定一名本回合未成为过你的杀的目标的角色,并亮出牌堆顶的一张牌,若为黑色,你对该角色使用一张杀。", + "每当你使用一张【杀】结算完毕后,你可以指定一名本回合未成为过你的【杀】的目标的角色,并亮出牌堆顶的一张牌,若为黑色,你对该角色使用一张【杀】。", boyun: "拨云", boyun1: "拨云", boyun2: "拨云", @@ -2923,9 +2911,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 8b94297f..156f6692 100644 --- a/character/gwent.js +++ b/character/gwent.js @@ -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: "叶舞", @@ -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 99a82bd9..46eefa01 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -2200,17 +2200,6 @@ game.import("character", function () { content() { trigger.num++; }, - }, - qingtian_old: { - trigger: { player: "recoverBefore" }, - forced: true, - filter(event, player) { - return player.hp > 0 && event.num > 0; - }, - content() { - trigger.cancel(); - player.changeHujia(trigger.num); - }, ai: { neg: true, }, @@ -2382,7 +2371,7 @@ game.import("character", function () { trigger: { player: "phaseBefore" }, unique: true, skillAnimation: true, - forceunique: true, + //forceunique: true, filter() { return game.roundNumber >= 3; }, @@ -10222,7 +10211,7 @@ game.import("character", function () { ysjqisha_info: "锁定技,每当你造成或受到伤害,你令对方随机获得一种消极状态直到下一回合结束。", zhaochao: "招潮", zhaochao_info: - "锁定技,结束阶段,你视为对一名随机敌人使用一张杀;若此杀被闪避,你视为对另一名随机敌人使用一张杀。", + "锁定技,结束阶段,你视为对一名随机敌人使用一张【杀】;若此【杀】被闪避,你视为对另一名随机敌人使用一张【杀】。", hllingxi: "灵息", hllingxi_info: "出牌阶段,你可以令一名已受伤的其他角色弃置两张牌并回复1点体力(同阶段对一名角色限用一次);结束阶段,你可以回复1点体力。", @@ -10239,7 +10228,7 @@ game.import("character", function () { oldhuanjue: "幻觉", oldhuanjue_info: "每回合限一次,当你成为一名其他角色的卡牌惟一目标时,你可以发现一张牌代替此牌。", zhziwu: "紫雾", - zhziwu_info: "每当你于回合外失去牌,你可以令当前回合角色不能使用杀直到回合结束。", + zhziwu_info: "每当你于回合外失去牌,你可以令当前回合角色不能使用【杀】直到回合结束。", huanjue_info_old: "每名角色的回合限一次,当你使用卡牌指定其他角色为惟一目标,或当其他角色使用卡牌指定你为惟一目标时,你可以发现一张牌代替此牌,然后该牌的使用者在结算后摸一张牌。", yinzong: "影踪", @@ -10283,7 +10272,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: "火之祈咒", @@ -10364,20 +10353,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: "寂灭", @@ -10387,8 +10376,8 @@ game.import("character", function () { nuyan2: "怒焰", nuyan_backup: "怒焰", nuyan_info: - "出牌阶段限一次,你可以将一张红色牌当作任意一张能造成伤害的牌使用(不得是你本局以此法使用过的牌)。", - nuyan2_info: "出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。", + "出牌阶段限一次,你可以将一张红色牌当作任意一张具有「伤害」标签的牌使用(不得是你本局以此法使用过的牌)。", + nuyan2_info: "出牌阶段限三次,你可以失去1点体力,视为使用任意一张具有「伤害」标签的牌。", chouhuo: "仇火", chouhuo_info: "觉醒技,出牌阶段开始时,若你的怒焰技能已将可用的牌用完,你失去1点体力上限,获得2点护甲,然后将怒焰的描述改为“出牌阶段限三次,你可以失去1点体力,视为使用任意一张能造成伤害的牌”。", @@ -10425,7 +10414,7 @@ game.import("character", function () { xianji_info: "其他角色可以在其结束阶段弃置1~2张手牌并令你摸等量的牌,若如此做,直到其下一回合结束,每当你使用卡牌指定其为目标时,其摸一张牌。", xueren: "血刃", - xueren_info: "每当你使用杀造成伤害,你可以令受伤害角色与你各失去1点体力,然后你摸两张牌。", + xueren_info: "每当你使用【杀】造成伤害,你可以令受伤害角色与你各失去1点体力,然后你摸两张牌。", maoxian: "奇旅", maoxian2: "奇旅", maoxian_info: "出牌阶段限两次,你可以发现一个技能并获得之(替换此前发现的技能)。", @@ -10451,10 +10440,10 @@ game.import("character", function () { xieneng_info: "结束阶段,你可以选择一张神器牌并获得之。", fbeifa: "北伐", fbeifa_info: - "每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌,每回合最多发动3次。", + "每当你失去最后一张手牌,你可以视为使用一张无视距离的【杀】,若此【杀】造成伤害,你摸一张牌,每回合最多发动3次。", oldfbeifa: "北伐", oldfbeifa_info: - "每当你失去最后一张手牌,你可以视为使用一张无视距离的杀,若此杀造成伤害,你摸一张牌。", + "每当你失去最后一张手牌,你可以视为使用一张无视距离的【杀】,若此【杀】造成伤害,你摸一张牌。", yufa: "驭法", yufa_info: "在任意一名其他角色的结束阶段,若你于此回合内受过其伤害,你可以将一张传送门交给除此角色外的任意一名角色。", @@ -10534,7 +10523,7 @@ game.import("character", function () { jixuan_info: "锁定技,回合结束后,你摸一张牌进行一个额外的回合。", biri: "蔽日", biri_info: - "每当距离你1以内的一名其他角色成为杀的惟一目标时,若杀的使用者不是你,你可以弃置一张闪取消之。", + "每当距离你1以内的一名其他角色成为【杀】的唯一目标时,若【杀】的使用者不是你,你可以弃置一张闪取消之。", stuxi: "吐息", stuxi2: "吐息", stuxi2_bg: "息", @@ -10542,7 +10531,7 @@ game.import("character", function () { bingdong: "冰冻", bingdong_info: "锁定技,你在一个回合内首次造成伤害后,获得一个冰冻零件。", ronghuo: "熔火", - ronghuo_info: "锁定技,你的普通杀均视为火杀。", + ronghuo_info: "锁定技,你的普通【杀】均视为火【杀】。", luoshi: "落石", luoshi_info: "锁定技,每当你受到一次伤害,你与伤害来源各随机弃置一张牌。", moyao: "魔曜", @@ -10568,12 +10557,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: "聚魔", @@ -10594,7 +10583,7 @@ game.import("character", function () { xshixin_info_alter: "锁定技,每当你对一名其他角色造成一次伤害,若受伤害角色体力值不小于你,其与你各失去1点体力。", xmojian: "魔箭", - xmojian_info: "每当你的武将牌翻至正面时,你可以指定一名角色视为对其使用了一张杀。", + xmojian_info: "每当你的武将牌翻至正面时,你可以指定一名角色视为对其使用了一张【杀】。", enze: "恩泽", enze_info: "出牌阶段限一次,你可以指定一名角色令其手牌数与你相等(最多摸或弃三张牌)。", oldenze: "恩泽", @@ -10727,7 +10716,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.js b/character/huicui.js index 116aa466..7d8d3b74 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -4,13 +4,13 @@ game.import("character", function () { name: "huicui", connect: true, character: { + dc_sp_zhurong: ["female", "qun", 4, ["dcmanhou"]], + yue_zhugeguo: ["female", "shu", 3, ["dcxidi", "dcchengyan"]], + yue_zoushi: ["female", "qun", 3, ["dcyunzheng", "dchuoxin"]], + yue_miheng: ["male", "qun", 3, ["dcjigu", "dcsirui"]], dc_lifeng: ["male", "shu", 3, ["dctunchu", "dcshuliang"]], wupu: ["male", "qun", 4, ["dcduanti", "dcshicao"]], - dc_caoshuang: ["male", "wei", 4, ["dcjianzhuan", "dcfanshi"]], zangba: ["male", "wei", 4, ["rehengjiang"]], - dc_simashi: ["male", "wei", 3, ["dcsanshi", "dczhenrao", "dcchenlve"]], - dc_wangling: ["male", "wei", 4, ["dcjichou", "dcmouli"], ["clan:太原王氏"]], - dc_jiangji: ["male", "wei", 3, ["dcshiju", "dcyingshi"]], gongsunxiu: ["male", "qun", 4, ["dcgangu", "dckuizhen"]], dc_liuli: ["male", "shu", 3, ["dcfuli", "dcdehua"]], yue_daqiao: ["female", "wu", 3, ["dcqiqin", "dczixi"]], @@ -52,7 +52,7 @@ game.import("character", function () { dc_sp_jiaxu: ["male", "wei", 3, ["zhenlue", "dcjianshu", "dcyongdi"]], leibo: ["male", "qun", 4, ["dcsilve", "dcshuaijie"]], gongsundu: ["male", "qun", 4, ["dczhenze", "dcanliao"]], - panghui: ["male", "wei", 5, ["dcyiyong"]], + 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"]], @@ -186,13 +186,557 @@ game.import("character", function () { sp_yanhan: ["dc_lifeng", "dc_liuba", "dc_huangquan", "furongfuqian", "xianglang", "dc_huojun", "gaoxiang", "dc_wuban", "jiangfei"], sp_jishi: ["dc_jiben", "zhenghun", "dc_sunhanhua", "liuchongluojun", "wupu"], sp_raoting: ["dc_huanghao", "dc_sunziliufang", "dc_sunchen", "dc_jiachong"], - sp_yijun: ["gongsundu", "mengyou", "dc_sp_menghuo", "gongsunxiu"], - sp_zhengyin: ["yue_caiwenji", "yue_zhoufei", "yue_caiyong", "yue_xiaoqiao", "yue_daqiao"], - sp_zhonghu: ["dc_jiangji", "dc_wangling", "dc_simashi", "dc_caoshuang"], + sp_yijun: ["gongsundu", "mengyou", "dc_sp_menghuo", "gongsunxiu", "dc_sp_zhurong"], + sp_zhengyin: ["yue_caiwenji", "yue_zhoufei", "yue_caiyong", "yue_xiaoqiao", "yue_daqiao", "yue_miheng", "yue_zoushi", "yue_zhugeguo"], + // huicui_waitforsort: [], }, }, /** @type { importCharacterConfig['skill'] } */ skill: { + //群祝融 + dcmanhou: { + audio: 2, + enable: "phaseUse", + usable: 1, + chooseButton: { + dialog(event, player) { + return ui.create.dialog("###蛮后###选择一个数字,你可以摸等量张牌并执行等量项"); + }, + chooseControl(event, player) { + var list = Array.from({ + length: 4, + }).map((_, i) => get.cnNumber(i + 1, true)); + list.push("cancel2"); + return list; + }, + check(event, player) { + var list = Array.from({ + length: 4, + }).map((_, i) => get.cnNumber(i + 1, true)); + if (get.effect(player, { name: "losehp" }, player, player) > 4 || player.countCards("hs", card => player.canSaveCard(card, player)) > 0 || player.hp > 2) return "四"; + return "二"; + }, + backup(result, player) { + return { + num: result.control, + audio: "dcmanhou", + filterCard: () => false, + selectCard: -1, + async content(event, trigger, player) { + var num = + Array.from({ + length: 4, + }) + .map((_, i) => get.cnNumber(i + 1, true)) + .indexOf(lib.skill.dcmanhou_backup.num) + 1; + await player.draw(num); + if (num >= 1) await player.removeSkills("dctanluan"); + if (num >= 2 && player.countCards("h")) await player.chooseToDiscard("h", true); + if (num >= 3) await player.loseHp(); + if (num >= 4) { + if (player.countCards("he")) await player.chooseToDiscard("he", true); + await player.addSkills("dctanluan"); + } + }, + }; + }, + }, + ai: { + order: 8, + result: { + player: 1, + }, + }, + derivation: "dctanluan", + subSkill: { + backup: {}, + }, + }, + dctanluan: { + audio: 2, + trigger: { + player: "useCardToPlayered", + }, + filter(event, player) { + return event.isFirstTarget; + }, + locked: true, + async cost(event, trigger, player) { + const num = trigger.targets.length, + num1 = game.filterPlayer(current => !trigger.targets.includes(current)).length; + if (num >= num1 && trigger.targets.some(current => current.countDiscardableCards(player, "ej"))) { + event.result = await player + .chooseTarget(get.prompt("dctanluan"), (card, player, target) => { + const evt = _status.event.getTrigger(); + return evt.targets.includes(target) && target.countDiscardableCards(player, "ej"); + }) + .set("ai", target => { + const player = get.player(); + const att = get.attitude(player, target); + if ( + att > 0 && + (target.countCards("j") > 0 || + target.countCards("e", card => { + return get.value(card, target) < 0; + })) + ) + return 2; + if (att < 0 && target.countCards("e") > 0 && !target.hasSkillTag("noe")) return -1; + return 0; + }) + .forResult(); + } else { + event.result = { + bool: true, + }; + } + }, + async content(event, trigger, player) { + if (event.targets && event.targets.length) await player.discardPlayerCard(event.targets[0], "ej", `弃置${get.translation(event.targets[0])}场上的一张牌`, true); + else player.addTempSkill("dctanluan_add"); + }, + subSkill: { + add: { + trigger: { + player: "useCard2", + }, + async cost(event, trigger, player) { + player.removeSkill("dctanluan_add"); + var goon = false; + var info = get.info(trigger.card); + if (!["basic", "trick"].includes(get.type(trigger.card))) return; + if (trigger.targets && !info.multitarget) { + if ( + game.hasPlayer(function (current) { + return !trigger.targets.includes(current) && lib.filter.targetEnabled2(trigger.card, player, current); + }) + ) { + goon = true; + } + } + if (!goon) return; + event.result = await player + .chooseTarget("是否发动【探乱】?", `为${get.translation(trigger.card)}添加一个目标`, (card, player, target) => { + const evt = _status.event.getTrigger(); + return !evt.targets.includes(target) && lib.filter.targetEnabled2(evt.card, player, target); + }) + .set("ai", target => { + return get.effect(target, _status.event.getTrigger().card, get.player()); + }) + .forResult(); + }, + async content(event, trigger, player) { + const targets = event.targets; + player.line(targets, "green"); + trigger.targets.addArray(targets); + }, + }, + }, + }, + //乐诸葛果 + dcxidi: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + content() { + const cards = player.getCards("h"); + player.addGaintag(cards, "dcxidi_tag"); + }, + mod: { + ignoredHandcard(card) { + if (card.hasGaintag("dcxidi_tag")) return true; + }, + cardDiscardable(card, _, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcxidi_tag")) return false; + }, + }, + group: "dcxidi_guanxing", + subSkill: { + guanxing: { + audio: "dcxidi", + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + return player.hasCard(card => card.hasGaintag("dcxidi_tag"), "h"); + }, + forced: true, + locked: false, + preHidden: true, + async content(event, trigger, player) { + const num = player.countCards("h", card => card.hasGaintag("dcxidi_tag")); + const cards = get.cards(Math.min(num, 5)); + await game.cardsGotoOrdering(cards); + const next = player.chooseToMove(); + next.set("list", [["牌堆顶", cards], ["牌堆底"]]); + next.set("prompt", "羲笛:点击将牌移动到牌堆顶或牌堆底"); + next.processAI = list => { + const cards = list[0][1], + player = _status.event.player; + const top = []; + const judges = player.getCards("j"); + let stopped = false; + if (!player.hasWuxie()) { + for (let i = 0; i < judges.length; i++) { + const judge = get.judge(judges[i]); + cards.sort((a, b) => judge(b) - judge(a)); + if (judge(cards[0]) < 0) { + stopped = true; + break; + } else { + top.unshift(cards.shift()); + } + } + } + let bottom; + if (!stopped) { + cards.sort((a, b) => get.value(b, player) - get.value(a, player)); + while (cards.length) { + if (get.value(cards[0], player) <= 5) break; + top.unshift(cards.shift()); + } + } + bottom = cards; + return [top, bottom]; + }; + const { + result: { moved }, + } = await next; + const top = moved[0]; + const bottom = moved[1]; + top.reverse(); + await game.cardsGotoPile(top.concat(bottom), ["top_cards", top], (event, card) => { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + player.popup(get.cnNumber(top.length) + "上" + get.cnNumber(bottom.length) + "下"); + game.log(player, "将" + get.cnNumber(top.length) + "张牌置于牌堆顶"); + await game.asyncDelayx(); + }, + }, + }, + }, + dcchengyan: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (!player.isPhaseUsing()) return false; + if (event.card.name != "sha" && get.type(event.card) != "trick") return false; + return event.target != player; + }, + logTarget: "target", + async content(event, trigger, player) { + const target = trigger.target; + const cards = get.cards(); + await game.cardsGotoOrdering(cards); + await player.showCards(cards, get.translation(player) + "发动了【乘烟】"); + const card = cards[0]; + if (card.name == "sha" || (get.type(card) == "trick" && get.info(card).filterTarget)) { + player.addTempSkill("dcchengyan_effect"); + player.markAuto("dcchengyan_effect", [[trigger.card, card, target]]); + } + if (card.name != "sha" && get.type(card) != "trick") { + await player.gain(card, "gain2").set("gaintag", ["dcxidi_tag"]); + } + else await game.cardsDiscard(cards); + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + trigger: { player: "useCardToBegin" }, + filter(event, player) { + const storage = player.getStorage("dcchengyan_effect"); + return storage.some(list => list[0] == event.card && list[2] == event.target); + }, + forced: true, + popup: false, + firstDo: true, + async content(event, trigger, player) { + const list = player.getStorage("dcchengyan_effect").find(list => list[0] == trigger.card && list[2] == trigger.target); + trigger.setContent(lib.card[list[1].name].content); + }, + }, + }, + }, + //乐邹氏 + dcyunzheng: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + content() { + const cards = player.getCards("h"); + player.addGaintag(cards, "dcyunzheng_tag"); + }, + mod: { + ignoredHandcard(card) { + if (card.hasGaintag("dcyunzheng_tag")) return true; + }, + cardDiscardable(card, _, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcyunzheng_tag")) return false; + }, + }, + group: "dcyunzheng_fengyin", + subSkill: { + fengyin: { + audio: "dcyunzheng", + trigger: { + global: ["phaseBefore", "loseAfter", "loseAsyncAfter", "gainAfter", "equipAfter", "addJudgeAfter", "addToExpansionAfter"], + player: ["dchuoxin_update", "enterGame"], + }, + filter(event, player) { + if ( + ["lose", "loseAsync", "gain", "equip", "addJudge", "addToExpansion"].includes(event.name) && + !game.hasPlayer(target => { + const evt = event.getl(target); + return evt && (evt.hs || []).length; + }) + ) + return false; + return game.hasPlayer(target => { + return target.hasCard(card => card.hasGaintag("dcyunzheng_tag"), "h") == !target.hasSkill("dcyunzheng_block"); + }); + }, + logTarget(event, player) { + return game + .filterPlayer(target => { + return target.hasCard(card => card.hasGaintag("dcyunzheng_tag"), "h") == !target.hasSkill("dcyunzheng_block"); + }) + .sortBySeat(); + }, + forced: true, + content() { + const targets = game + .filterPlayer(target => { + return target.hasCard(card => card.hasGaintag("dcyunzheng_tag"), "h") == !target.hasSkill("dcyunzheng_block"); + }) + .sortBySeat(); + for (const target of targets) { + target[target.hasSkill("dcyunzheng_block") ? "removeSkill" : "addSkill"]("dcyunzheng_block"); + } + }, + }, + block: { + inherit: "fengyin", + }, + }, + ai: { + combo: "dchuoxin" + }, + }, + dchuoxin: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if ( + !player.hasHistory("lose", evt => { + if (evt.getParent() != event.getParent()) return false; + return event.cards.some(card => (evt.hs || []).includes(card)); + }) + ) + return false; + 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(); + } + }, + async content(event, trigger, player) { + 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(); + await player.showCards(cards, get.translation(player) + "发动了【惑心】"); + const cardx = cards.filter(card => card.hasGaintag("dcyunzheng_tag") || get.suit(card) == get.suit(trigger.card)); + if (cardx.length) { + cards.removeArray(cardx); + await player.gain(cardx, target, "give"); + await event.trigger("dchuoxin_update"); + } + if (cards.some(card => !card.hasGaintag("dcyunzheng_tag"))) { + target.addGaintag( + cards.filter(card => !card.hasGaintag("dcyunzheng_tag")), + "dcyunzheng_tag" + ); + await event.trigger("dchuoxin_update"); + } + } + }, + }, + //乐祢衡 + dcjigu: { + audio: 2, + trigger: { + global: "phaseBefore", + player: "enterGame", + }, + filter(event, player) { + return event.name != "phase" || game.phaseNumber == 0; + }, + forced: true, + content() { + const cards = player.getCards("h"); + player.addGaintag(cards, "dcjigu"); + }, + mod: { + ignoredHandcard(card) { + if (card.hasGaintag("dcjigu")) return true; + }, + cardDiscardable(card, _, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcjigu")) return false; + }, + }, + group: "dcjigu_temp", + subSkill: { + temp: { + audio: "dcjigu", + trigger: { + player: "damageEnd", + source: "damageSource", + }, + filter(event, player) { + return player.countCards("e") == player.countCards("h", card => card.hasGaintag("dcjigu")) && player.getRoundHistory("useSkill", evt => evt.skill == "dcjigu_temp").length < game.roundNumber; + }, + prompt2(event, player) { + return ( + "摸" + + get.cnNumber( + Array.from({ length: 5 }) + .map((_, i) => i + 1) + .reduce((sum, i) => sum + player.countEmptySlot(i), 0) + ) + + "张牌" + ); + }, + content() { + player.draw( + Array.from({ length: 5 }) + .map((_, i) => i + 1) + .reduce((sum, i) => sum + player.countEmptySlot(i), 0) + ); + }, + }, + }, + }, + dcsirui: { + audio: 2, + mod: { + targetInRange(card) { + if (card.storage && card.storage.dcsirui) return true; + }, + cardUsable(card, player, num) { + if (card.storage && card.storage.dcsirui) return Infinity; + }, + }, + enable: "phaseUse", + filter(event, player) { + if (!player.countCards("hes")) return false; + return get + .inpileVCardList(info => { + const name = info[2]; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + return true; + }) + .some(card => player.hasCard(cardx => get.cardNameLength(cardx) == get.cardNameLength(card[2]) && player.hasUseTarget(get.autoViewAs({ name: card[2], nature: card[3], storage: { dcsirui: true } }, [cardx]), false, false), "hes")); + }, + usable: 1, + locked: false, + 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 true; + }) + .filter(card => player.hasCard(cardx => get.cardNameLength(cardx) == get.cardNameLength(card[2]) && player.hasUseTarget(get.autoViewAs({ name: card[2], nature: card[3], storage: { dcsirui: true } }, [cardx]), false, false), "hes")); + return ui.create.dialog("思锐", [list, "vcard"]); + }, + check(button) { + return get.event("player").getUseValue({ + name: button.link[2], + nature: button.link[3], + storage: { dcsirui: true }, + }); + }, + backup(links, player) { + return { + audio: "dcsirui", + filterCard(card, player) { + return get.cardNameLength(card) == get.cardNameLength(lib.skill.dcsirui_backup.viewAs.name); + }, + popname: true, + viewAs: { + name: links[0][2], + nature: links[0][3], + storage: { dcsirui: true }, + }, + check(card) { + return 7 - get.value(card); + }, + position: "hes", + precontent() { + event.getParent().addCount = false; + }, + }; + }, + prompt(links, player) { + return "将一张字数为" + get.cardNameLength(links[0][2]) + "的牌当作" + get.translation(links[0][3] || "") + "【" + get.translation(links[0][2]) + "】使用"; + }, + }, + ai: { + order(item, player) { + let list = get + .inpileVCardList(info => { + const name = info[2]; + if (get.type(name) != "basic" && get.type(name) != "trick") return false; + return true; + }) + .filter(card => player.hasCard(cardx => get.cardNameLength(cardx) == get.cardNameLength(card[2]) && player.hasUseTarget(get.autoViewAs({ name: card[2], nature: card[3] }, [cardx]), false, false), "hes")) + .map(card => { + return { name: card[2], nature: card[3] }; + }) + .filter(card => player.getUseValue(card, true, true) > 0); + if (!list.length) return 0; + list.sort((a, b) => (player.getUseValue(b, true, true) || 0) - (player.getUseValue(a, true, true) || 0)); + return get.order(list[0], player) * 0.99; + }, + result: { player: 1 }, + }, + subSkill: { + backup: { audio: "dcsirui" }, + }, + }, //李丰 dctunchu: { audio: 2, @@ -281,11 +825,11 @@ game.import("character", function () { 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 = []; @@ -296,7 +840,7 @@ game.import("character", function () { .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); @@ -1365,84 +1909,62 @@ game.import("character", function () { filter(event, player) { if (!event.isFirstTarget) return false; if (get.type(event.card) !== "trick") return false; - return true; + if (!player.hasSkill(`dcyingshi_choice1`)) return true; + return !player.hasSkill(`dcyingshi_choice2`) && player.countCards("e"); }, - direct: true, - async content(event, trigger, player) { - const result = await player + async cost(event, trigger, player) { + let prompt2 = "令一名目标角色", + str = get.translation(trigger.card); + const goon1 = !player.hasSkill(`dcyingshi_choice1`), + goon2 = !player.hasSkill(`dcyingshi_choice2`) && player.countCards("e"); + if (goon1 && goon2) prompt2 += "选择一项:①"; + if (goon2) { + prompt2 += "弃置" + get.cnNumber(player.countCards("e")) + "张牌,令" + str + "对其无效"; + prompt2 += goon1 ? ";②" : "。"; + } + if (goon1) prompt2 += "于此牌结算完毕后视为其使用一张同名牌。"; + event.result = await player .chooseTarget() .set("prompt", get.prompt("dcyingshi")) - .set( - "prompt2", - `令其中一名角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation( - trigger.card.name - )};⒉弃置${get.cnNumber(player.countCards("e"))}张牌,此牌对其无效。` - ) + .set("prompt2", prompt2) .set("filterTarget", (card, player, target) => { - return get.event("targets").includes(target); + return get.event().getTrigger().targets.includes(target); }) - .set("targets", trigger.targets) - .set( - "toFriends", - (() => { - const isPositive = trigger.targets.some((current) => { - return get.effect(current, trigger.card, trigger.player, player) > 0; - }), - isNegative = trigger.targets.some((current) => { - return get.effect(current, trigger.card, trigger.player, player) < -5; - }); - if ( - (player.hasSkill("dcyingshi_choice1") || player.countCards("e") < 2) && - isNegative - ) - return true; - if ( - !player.hasSkill("dcyingshi_choice1") && - ((get.tag(trigger.card, "norepeat") && isNegative) || isPositive) - ) - return true; - return false; - })() - ) .set("ai", (target) => { const player = get.player(), - count = player.countCards("e"), + trigger = get.event().getTrigger(), att = get.attitude(player, target); - if (att > 0 && get.event("toFriends")) { - if (target.countCards("he", (card) => get.value(card) < 5) < count) return 0; - return att; + const goon1 = !player.hasSkill(`dcyingshi_choice1`), + goon2 = !player.hasSkill(`dcyingshi_choice2`) && player.countCards("e"); + const effect = get.effect(target, trigger.card, player, player); + if (effect == 0 || att == 0) return 0; + if (effect > 0) { + if (att > 0 && goon1) return att; + return 0; } - if (player.hasSkill("dcyingshi_choice1") && !count) return 0; - return -get.attitude(player, target); + if (att < 0 && !goon1) return -att; + if (att > 0 && !goon2) return att; + return 0; }) .forResult(); - if (!result.bool) return; - const target = result.targets[0]; - player.logSkill("dcyingshi", target); + }, + async content(event, trigger, player) { + const target = event.targets[0], + count = player.countCards("e"); + const goon1 = !player.hasSkill(`dcyingshi_choice1`), + goon2 = !player.hasSkill(`dcyingshi_choice2`) && count > 0; let bool; - if (!player.hasSkill(`dcyingshi_choice2`)) { - const count = player.countCards("e"), - forced = player.hasSkill("dcyingshi_choice1"); - if (count > 0) { - const prompt = `###${get.translation(player)}对你发动了【应时】###${ - forced ? "请" : "是否" - }弃置${get.cnNumber(count)}张牌,令${get.translation(trigger.card)}对你无效${ - forced ? "。" : "?或点击“取消”,令其与此牌结算后视为对你使用一张同名牌。" - }`; - bool = await target - .chooseToDiscard(prompt, count, forced, "he") - .set("ai", (card) => { - if (get.event("goon")) return 5.5 - get.value(card); - return 0; - }) - .set( - "goon", - !get.tag(trigger.card, "norepeat") && - get.effect(target, trigger.card, trigger.player, target) < -5 - ) - .forResultBool(); - } else bool = false; - } else bool = player.hasSkill("dcyingshi_choice1"); + if (goon2) { + const prompt = `###${get.translation(player)}对你发动了【应时】###${!goon1 ? "请" : "是否"}弃置${get.cnNumber(count)}张牌,令${get.translation(trigger.card)}对你无效${!goon1 ? "。" : "?或点击“取消”,令其与此牌结算后视为对你使用一张同名牌。"}`; + bool = await target + .chooseToDiscard(prompt, count, !goon1, "he") + .set("ai", card => { + if (get.event("goon")) return 15 - get.value(card); + return 0; + }) + .set("goon", !get.tag(trigger.card, "norepeat") && get.effect(target, trigger.card, trigger.player, target) < 0) + .forResultBool(); + } else bool = false; if (bool) { trigger.excluded.add(target); } else { @@ -1482,7 +2004,7 @@ game.import("character", function () { usable: 1, forced: true, async content(event, trigger, player) { - await player.draw(2); + await player.draw(3); await player.loseHp(); }, ai: { @@ -1498,7 +2020,8 @@ game.import("character", function () { }); }, 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, @@ -1638,33 +2161,35 @@ game.import("character", function () { cards.reduce((sum, card) => sum + get.cardNameLength(card), 0) ); if (num) await player.draw(num); - if (cards.some((card) => card.name != "shandian" && get.tag(card, "damage"))) { - const { - result: { bool, targets }, - } = await player - .chooseTarget("抚黎:是否令一名角色的攻击范围-1直到你的下个回合开始?") - .set("ai", (target) => { - const player = get.event("player"), - num = target.getAttackRange(); - return ( - -get.sgn(get.attitude(player, target)) * - (target.getAttackRange() + (num <= 0 ? -num + 0.5 : num)) - ); - }); - if (bool) { - const target = targets[0]; - player.line(target); - target.addSkill("dcfuli_range"); - target.addMark("dcfuli_range", 1, false); - player - .when(["phaseBegin", "dieBegin"]) - .then(() => { - target.removeMark("dcfuli_range", 1, false); - if (!target.hasMark("dcfuli_range")) - target.removeSkill("dcfuli_range"); - }) - .vars({ target: target }); - } + const goon = cards.some(card => card.name != "shandian" && get.tag(card, "damage")); + const { + result: { bool, targets }, + } = await player + .chooseTarget("抚黎:是否令一名角色的攻击范围" + (goon ? "减至0" : "-1") + "直到你的下个回合开始?", (card, player, target) => { + return !get.event("goon") || target.getAttackRange() > 0; + }) + .set("ai", target => { + const player = get.event("player"), + num = target.getAttackRange(); + if (get.event("goon")) return -num; + return ( + -get.sgn(get.attitude(player, target)) * + (target.getAttackRange() + (num <= 0 ? -num + 0.5 : num)) + ); + }) + .set("goon", goon); + if (bool) { + const target = targets[0]; + player.line(target); + target.addSkill("dcfuli_range"); + target.addMark("dcfuli_range", goon ? target.getAttackRange() : 1, false); + player + .when(["phaseBegin", "dieBegin"]) + .then(() => { + target.removeMark("dcfuli_range", 1, false); + if (!target.hasMark("dcfuli_range")) target.removeSkill("dcfuli_range"); + }) + .vars({ target: target }); } } } @@ -1765,8 +2290,10 @@ game.import("character", function () { const card = new lib.element.VCard({ name: name }); return get.tag(card, "damage") && !player.getStorage("dcdehua").includes(name); }) - ) - player.removeSkills("dcdehua"); + ) { + await player.removeSkills("dcdehua"); + player.addSkill("dcdehua_hand"); + } }, mod: { maxHandcard(player, num) { @@ -1805,6 +2332,21 @@ game.import("character", function () { ); }, }, + subSkill: { + hand: { + charlotte: true, + mark: true, + intro: { content: "伤害牌不计入手牌上限" }, + mod: { + ignoredHandcard(card) { + if (get.tag(card, "damage")) return true; + }, + cardDiscardable(card, _, name) { + if (name == "phaseDiscard" && get.tag(card, "damage")) return false; + }, + }, + }, + }, }, //蒋琬费祎 dcshengxi: { @@ -1965,26 +2507,12 @@ game.import("character", function () { const card = player .getCards("h", (card) => { if (get.value(card) >= 7) return false; - return ( - card.hasGaintag("dcqiqin_tag") && - game.hasPlayer((target) => - target.canAddJudge( - get.autoViewAs({ name: "dczixi_" + name }, [card]) - ) - ) - ); + return card.hasGaintag("dcqiqin_tag") && game.hasPlayer(target => target.canAddJudge(get.autoViewAs({ name: "dczixi_" + button.link }, [card]))); }) .sort((a, b) => get.value(a) - get.value(b))[0]; if ( game.hasPlayer((current) => { - return ( - get.attitude(player, current) < 0 && - lib.skill.dczixi.zixiList.some((name) => - current.canAddJudge( - get.autoViewAs({ name: "dczixi_" + name }, [card]) - ) - ) - ); + return get.attitude(player, current) < 0 && lib.skill.dczixi.zixiList.some(name => current.canAddJudge(get.autoViewAs({ name: "dczixi_" + button.link }, [card]))); }) ) return list.indexOf(button.link) + 1; @@ -2647,7 +3175,7 @@ game.import("character", function () { onremove: true, content: function* (event, map) { const player = map.player; - const cards = []; + let cards = []; const bannedTypes = []; bannedTypes.addArray(event.cards.map((card) => get.type2(card, player))); bannedTypes.addArray(player.getStorage("dcliangxiu")); @@ -2664,25 +3192,60 @@ game.import("character", function () { } if (cards.length >= 2) break; } - let result; if (!cards.length) { player.chat("没牌了…"); game.log("但是哪里都找不到没有符合条件的牌!"); event.finish(); return; - } else if (cards.length == 1) result = { bool: true, links: cards }; - else - result = yield player - .chooseButton(["良秀:获得一张牌", cards], true) - .set("ai", get.buttonValue); - if (result.bool) { - const toGain = result.links; - player.markAuto("dcliangxiu", get.type2(toGain[0], false)); - player.when({ global: "phaseChange" }).then(() => { - player.unmarkSkill("dcliangxiu"); - }); - player.gain(toGain, "gain2"); } + player.markAuto("dcliangxiu", cards.map(card => get.type2(card, false)).toUniqued()); + player.when({ global: "phaseChange" }).then(() => { + player.unmarkSkill("dcliangxiu"); + }); + if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); + let given_map = {}; + while (cards.length) { + let result; + if (cards.length == 1) result = { bool: true, links: cards.slice() }; + else { + result = yield player.chooseCardButton("良秀:请选择要分配的牌", cards, [1, cards.length], true).set("ai", button => { + if (!ui.selected.buttons.length) return get.buttonValue(button); + return 0; + }); + } + const gives = result.links; + const result2 = yield player + .chooseTarget("选择获得" + get.translation(gives) + "的角色", cards.length == 1) + .set("ai", target => { + return get.attitude(get.event("player"), target) * get.sgn(get.sgn(get.event("goon")) + 0.5); + }) + .set( + "goon", + gives.reduce((sum, card) => sum + get.value(card), 0) + ); + if (result2.bool) { + cards.removeArray(gives); + const id = result2.targets[0].playerid; + if (!given_map[id]) given_map[id] = []; + given_map[id].addArray(gives); + } + } + if (_status.connectMode) game.broadcastAll(() => delete _status.noclearcountdown); + let list = []; + for (const i in given_map) { + const source = (_status.connectMode ? lib.playerOL : game.playerMap)[i]; + player.line(source, "green"); + game.log(source, "获得了", given_map[i]); + list.push([source, given_map[i]]); + } + yield game + .loseAsync({ + gain_list: list, + giver: player, + animate: "gain2", + }) + .setContent("gaincardMultiple"); + game.delayx(); }, intro: { content: "已因此技能获得过$牌", @@ -2940,7 +3503,7 @@ game.import("character", function () { return get.type(event.card) == "basic" && _status.currentPhase; }, prompt2: function (event, player) { - const num = player.countMark("dccaisi_more") + 1; + const num = Math.pow(2, player.countMark("dccaisi_more")); return `从${player == _status.currentPhase ? "牌堆" : "弃牌"}堆中随机获得${get.cnNumber( num )}张非基本牌`; @@ -2950,7 +3513,7 @@ game.import("character", function () { trigger = map.trigger; const position = player == _status.currentPhase ? "cardPile" : "discardPile"; let cards = [], - num = player.countMark("dccaisi_more") + 1; + num = Math.pow(2, player.countMark("dccaisi_more")); while (num > 0) { num--; let card = get[position]( @@ -2965,7 +3528,7 @@ game.import("character", function () { game.log(`但是${position == "discardPile" ? "弃" : ""}牌堆里没有非基本牌!`); } const sum = player.getHistory("useSkill", (evt) => evt.skill == "dccaisi").length; - if (sum < player.maxHp) { + if (sum <= player.maxHp) { player.addTempSkill("dccaisi_more"); player.addMark("dccaisi_more", 1, false); } else player.tempBanSkill("dccaisi"); @@ -4675,12 +5238,6 @@ game.import("character", function () { //裴元绍 dcmoyu: { audio: 2, - init() { - game.addGlobalSkill("dcmoyu_ai"); - }, - onremove() { - if (!game.hasPlayer(i => i.hasSkill("dcmoyu"), true)) game.removeGlobalSkill("dcmoyu_ai"); - }, enable: "phaseUse", filter(event, player) { return game.hasPlayer((current) => lib.skill.dcmoyu.filterTarget(null, player, current)); @@ -4690,7 +5247,7 @@ game.import("character", function () { }, async content(event, trigger, player) { const target = event.target; - player.addTempSkill("dcmoyu_clear"); + player.addTempSkill("dcmoyu_clear", "phaseUseAfter"); player.markAuto("dcmoyu_clear", [target]); await player.gainPlayerCard(target, "hej", true, 1 + player.hasSkill("dcmoyu_add")); player.removeSkill("dcmoyu_add"); @@ -4707,10 +5264,6 @@ game.import("character", function () { return lib.filter.targetEnabled.apply(this, arguments); }) .set("sourcex", player) - .set("num", num) - .set("oncard", card => { - _status.event.baseDamage = _status.event.getParent().num; - }) .forResult(); if (result.bool) { if ( @@ -4719,11 +5272,13 @@ game.import("character", function () { }) ) { player.tempBanSkill("dcmoyu"); + player.addTempSkill("dcmoyu_ban"); } else { player.addTempSkill("dcmoyu_add", "phaseChange"); } } }, + global: "dcmoyu_ai", subSkill: { clear: { charlotte: true, @@ -4732,7 +5287,7 @@ game.import("character", function () { ban: { charlotte: true, mark: true, - marktext: "欲", + marktext: '', intro: { content: "偷马贼被反打了!" }, }, add: { @@ -4742,15 +5297,6 @@ game.import("character", function () { intro: { content: "欲望加速,下次抢两张!" }, }, ai: { - trigger: { player: "dieAfter" }, - filter: () => { - return !game.hasPlayer((i) => i.hasSkill("dcmoyu"), true); - }, - silent: true, - forceDie: true, - content: () => { - game.removeGlobalSkill("dcmoyu_ai"); - }, ai: { effect: { target: function (card, player, target, current) { @@ -5046,11 +5592,7 @@ game.import("character", function () { var card = event.card; var target = event.targets[0]; var marked = target.hasMark("dcjizhong"); - return ( - (get.type(card) == "trick" || - (get.color(card) == "black" && get.type(card) == "basic")) && - (marked || (!marked && game.hasPlayer((current) => current.hasMark("dcjizhong")))) - ); + return (get.type(card) == "trick" || (get.color(card) == "black" && get.type(card) == "basic")) && ((marked && target.countGainableCards(player, "hej")) || (!marked && game.hasPlayer(current => current.hasMark("dcjizhong")))); }, logTarget: (event) => event.targets[0], prompt2(event, player) { @@ -5380,20 +5922,23 @@ game.import("character", function () { 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")); @@ -7266,9 +7811,11 @@ game.import("character", function () { 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"; @@ -7277,18 +7824,12 @@ game.import("character", function () { 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) => { - return ( - get.attitude(_status.event.player, target) * - Math.max(0.1, target.maxHp - target.countCards("h")) - ); - }); + 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"; if (result.bool) { var targets = result.targets.sortBySeat(_status.currentPhase); @@ -8212,13 +8753,62 @@ game.import("character", function () { var num0 = getn(event.cards0), num1 = getn(event.cards1); if (num0 <= num1) { - player.draw(event.cards1.length); + player.draw(event.cards1.length + 1); } if (num0 >= num1) { trigger.num++; } }, }, + dcsuchou: { + audio: 2, + trigger: { player: "phaseUseBegin" }, + forced: true, + async content(event, trigger, player) { + const index = await player + .chooseControl() + .set("prompt", "夙仇:请选择一项") + .set("choiceList", ["失去1点体力,本阶段使用牌不可被响应", "减1点体力上限,本阶段使用牌不可被响应", "失去〖夙仇〗"]) + .set("ai", () => { + const player = get.event("player"); + if (player.isHealthy()) return player.maxHp <= 2 ? 3 : 0; + return 2; + }) + .forResult("index"); + switch (index) { + case 0: + await player.loseHp(); + player.addTempSkill("dcsuchou_effect", "phaseUseAfter"); + break; + case 1: + await player.loseMaxHp(); + player.addTempSkill("dcsuchou_effect", "phaseUseAfter"); + break; + case 2: + await player.removeSkills("dcsuchou"); + break; + } + }, + subSkill: { + effect: { + charlotte: true, + mark: true, + marktext: "仇", + intro: { content: "使用牌不可被响应" }, + audio: "dcsuchou", + trigger: { player: "useCard" }, + filter(event, player) { + return event.card.name == "sha" || get.type(event.card) == "trick"; + }, + forced: true, + content() { + trigger.directHit.addArray(game.players); + game.log(trigger.card, "不可被响应"); + }, + ai: { directHit_ai: true }, + }, + }, + }, //乐就 dccuijin: { audio: 2, @@ -8502,28 +9092,12 @@ game.import("character", function () { .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"; @@ -10533,14 +11107,7 @@ game.import("character", function () { var skills = target.getSkills(null, false, false).filter(function (i) { if (i == "bazhen") return; var info = get.info(i); - return ( - info && - !get.is.locked(i) && - !info.limited && - !info.juexingji && - !info.zhuSkill && - !info.charlotte - ); + return info && !get.is.locked(i) && !info.limited && !info.juexingji && !info.zhuSkill && !info.charlotte && !info.persevereSkill; }); target.addAdditionalSkills("dcjiezhen_blocker", "bazhen"); target.addSkill("dcjiezhen_blocker"); @@ -10555,14 +11122,7 @@ game.import("character", function () { var skills = target.getSkills(null, false, false).filter(function (i) { if (i == "bazhen") return; var info = get.info(i); - return ( - info && - !get.is.locked(i) && - !info.limited && - !info.juexingji && - !info.zhuSkill && - !info.charlotte - ); + return info && !get.is.locked(i) && !info.limited && !info.juexingji && !info.zhuSkill && !info.charlotte && !info.persevereSkill; }); if (!skills.length && target.hasEmptySlot(2)) return 1; return -0.5 * skills.length; @@ -10582,12 +11142,7 @@ game.import("character", function () { charlotte: true, locked: true, skillBlocker: function (skill, player) { - return ( - skill != "bazhen" && - skill != "dcjiezhen_blocker" && - !lib.skill[skill].charlotte && - 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: "阵", @@ -11261,6 +11816,9 @@ game.import("character", function () { }, }, }, + ai: { + combo: "zhishi" + }, }, zhishi: { audio: 2, @@ -12370,9 +12928,7 @@ game.import("character", function () { 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) @@ -12463,7 +13019,7 @@ game.import("character", function () { 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); }) ) @@ -13968,7 +14524,7 @@ game.import("character", function () { 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)); @@ -14023,7 +14579,7 @@ game.import("character", function () { }); player .chooseTarget( - "帼舞:是否为" + + "帼武:是否为" + get.translation(trigger.card) + "增加" + (num > 1 ? "至多两个" : "一个") + @@ -14832,8 +15388,8 @@ game.import("character", function () { player.chooseToDiscard("h", true); }, ai: { - halfneg: true, - nokeep: true + neg: true, + nokeep: true, }, }, //董白 @@ -16028,28 +16584,22 @@ game.import("character", function () { perfectPair: {}, characterReplace: { lifeng: ["dc_lifeng", "lifeng"], - dongbai: ["dongbai", "re_dongbai", "jsrg_dongbai"], + liuyong: ["liuyong", "jsrg_liuyong"], + qiaorui: ["qiaorui", "tw_qiaorui"], + gaoxiang: ["gaoxiang", "jsrg_gaoxiang"], + zhangchu: ["zhangchu", "jsrg_zhangchu"], + mamidi: ["mamidi", "xin_mamidi"], chunyuqiong: ["chunyuqiong", "re_chunyuqiong", "jsrg_chunyuqiong"], - kanze: ["kanze", "re_kanze"], - chendeng: ["ol_chendeng", "re_chendeng", "chendeng", "jsrg_chendeng"], - miheng: ["re_miheng", "miheng"], - liuba: ["ol_liuba", "dc_liuba", "liuba"], + + sp_jiaxu: ["sp_jiaxu", "dc_sp_jiaxu", "yj_jiaxu"], + sp_menghuo: ["sp_menghuo", "dc_sp_menghuo", "tw_menghuo"], + lvkuanglvxiang: ["lvkuanglvxiang", "dc_lvkuanglvxiang"], dc_huangquan: ["xf_huangquan", "dc_huangquan"], yuejiu: ["dc_yuejiu", "yuejiu"], - jiling: ["dc_jiling", "tw_jiling", "jiling"], - sp_jiaxu: ["sp_jiaxu", "dc_sp_jiaxu", "yj_jiaxu"], - qiaorui: ["qiaorui", "tw_qiaorui"], - mamidi: ["mamidi", "xin_mamidi"], mengyou: ["mengyou", "ns_mengyou"], - zhangchu: ["zhangchu", "jsrg_zhangchu"], - xianglang: ["xianglang", "mb_xianglang"], chengui: ["chengui", "mb_chengui"], - liuyong: ["liuyong", "jsrg_liuyong"], zhangxuan: ["zhangxuan", "jsrg_zhangxuan"], - gaoxiang: ["gaoxiang", "jsrg_gaoxiang"], - lingcao: ["lingcao", "dc_lingcao"], - sp_menghuo: ["sp_menghuo", "dc_sp_menghuo"], sunchen: ["dc_sunchen", "pe_sunchen"], }, translate: { @@ -16213,7 +16763,7 @@ game.import("character", function () { zhtongyuan_info: "锁定技。①当你使用红色锦囊牌后,你于〖摧坚〗后增加“若其手牌中没有【闪】,则你摸两张牌”;②当你使用或打出红色基本牌后,你删除〖摧坚〗中的“,然后你交给其等量的牌”。③当你使用红色的普通锦囊牌/基本牌时,若你已发动过〖摧坚①〗和〖摧坚②〗,则此牌不可被响应/可额外增加一个目标。", lvlingqi: "吕玲绮", - guowu: "帼舞", + guowu: "帼武", guowu_info: "出牌阶段开始时,你可以展示全部手牌,根据你展示的类型数,你获得对应效果:至少一类,从弃牌堆获得一张【杀】;至少两类,此阶段使用牌无距离限制;至少三类,此阶段使用【杀】或普通锦囊牌可以多指定至多两个目标。", guowu_info_guozhan: @@ -16410,8 +16960,9 @@ game.import("character", function () { "当你或你攻击范围内的角色使用【杀】或【决斗】时,你可以弃置一张牌,令此牌的伤害基数+1。然后当此牌被目标角色抵消或无效或防止伤害后,你摸两张牌并对使用者造成1点伤害。", panghui: "庞会", dcyiyong: "异勇", - dcyiyong_info: - "当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。", + dcyiyong_info: "当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X+1张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。", + dcsuchou: "夙仇", + dcsuchou_info: "锁定技,出牌阶段开始时,你选择一项:①失去1点体力或减1点体力上限,本阶段使用牌不可被响应;②失去〖夙仇〗。", chenjiao: "陈矫", dcxieshoux: "协守/清严", dcxieshou: "协守", @@ -16454,8 +17005,7 @@ game.import("character", function () { dcqingren: "青刃", dcqingren_info: "结束阶段,你可以摸X张牌(X为你本回合发动〖翊赞〗的次数)。", dclongyuan: "龙渊", - dclongyuan_info: - "锁定技。一名角色的回合结束时,若你本局游戏已发动过至少三次〖翊赞〗,你摸两张牌并回复1点体力,修改〖翊赞〗。", + dclongyuan_info: "觉醒技。一名角色的回合结束时,若你本局游戏已发动过至少三次〖翊赞〗,你摸两张牌并回复1点体力,修改〖翊赞〗。", zhenghun: "郑浑", dcqiangzhi: "强峙", dcqiangzhi_info: @@ -16573,8 +17123,7 @@ game.import("character", function () { "一名角色死亡后,你可以弃置等同于其因死亡事件的规则而弃置的牌数,将其此次弃置的牌交给一名其他角色。然后你加1点体力上限并回复1点体力。", gaoxiang: "高翔", dcchiying: "驰应", - dcchiying_info: - "出牌阶段限一次。你可以选择一名体力不大于你的角色,令其攻击范围内的其他角色依次弃置一张牌。然后若你选择的角色不为你,其获得以此法弃置的牌中所有的基本牌。", + dcchiying_info: "出牌阶段限一次。你可以选择一名体力不大于你的角色,令其可以弃置其攻击范围内的任意名其他角色各一张牌。然后若该角色不为你,其获得以此法弃置的牌中所有的基本牌。", zhangkai: "张闿", dcxiangshu: "相鼠", dcxiangshu_info: @@ -16642,8 +17191,7 @@ game.import("character", function () { "当你需要使用一张基本牌时,你可以交给一名其他角色X张牌,然后其可以将一张牌置于牌堆底,视为你使用之。若其不为当前回合角色,此技能失效直到回合结束(X为你本回合发动〖恃纵〗的次数)。", pangshanmin: "庞山民", dccaisi: "才思", - dccaisi_info: - "当你于回合内/回合外使用基本牌结算结束后,你可以从牌堆/弃牌堆随机获得一张非基本牌,然后若你本回合发动此技能的次数:小于你的体力上限,本回合你发动此技能获得的牌数+1;大于等于你的体力上限,本回合此技能失效。", + dccaisi_info: "当你于回合内/回合外使用基本牌结算结束后,你可以从牌堆/弃牌堆随机获得一张非基本牌,然后若你本回合发动此技能的次数:小于等于你的体力上限,本回合你发动此技能获得的牌数翻倍;大于你的体力上限,本回合此技能失效。", dczhuoli: "擢吏", dczhuoli_info: "锁定技。一名角色的回合结束时,若你本回合使用或获得的牌数大于体力值,你加1点体力上限(不能超过游戏人数),回复1点体力。", @@ -16658,8 +17206,7 @@ game.import("character", function () { "每回合限一次。当你使用牌结算结束后,若你本回合使用过至少两张牌,你可以随机获得一张字数为X的牌。若你的“弦”数不大于X,你重置〖飞白〗(X为此牌与你使用的上一张牌的字数之和)。", kuaiqi: "蒯祺", dcliangxiu: "良秀", - dcliangxiu_info: - "出牌阶段,你可以弃置两张不同类型的牌,然后从两张与你弃置的牌类型均不同的牌中选择一张获得之(每阶段每种类型限一次)。", + dcliangxiu_info: "出牌阶段每种类型限一次,你可以弃置两张不同类型的牌,然后你将牌堆或弃牌堆中的两张与你弃置的牌类型均不同的牌分配给任意角色。", dcxunjie: "殉节", dcxunjie_info: "每轮每项限一次。一名角色的回合结束时,若你本回合于摸牌阶段外得到过牌,你可以选择一项:1.令一名角色将手牌数摸或弃置至与其体力值相同;2.令一名角色将体力回复或失去至与其手牌数相同。", @@ -16708,25 +17255,20 @@ game.import("character", function () { dcshoucheng_info: "每回合限一次,当一名角色于其回合外失去手牌后,若其没有手牌,你可令其摸两张牌。", dc_liuli: "刘理", dcfuli: "抚黎", - dcfuli_info: - "出牌阶段限一次,你可以展示手牌并弃置一种类别的所有手牌,然后摸X张牌(X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数)。若你因此弃置了伤害类卡牌,则你可以选择一名角色,令其攻击范围-1直到你的下个回合开始。", + dcfuli_info: "出牌阶段限一次,你可以展示手牌并弃置一种类别的所有手牌,然后摸X张牌(X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数)。然后你可以选择一名角色,令其攻击范围-X直到你的下个回合开始(X为1,若你因此弃置了伤害类卡牌,则X改为减其攻击范围)。", dcdehua: "德化", - dcdehua_info: - "锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗。②你的手牌上限+Y(Y为你〖德化①〗选择过的牌名数)。", + dcdehua_info: "锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗,然后本局游戏你的伤害牌不计手牌上限。②你的手牌上限+Y(Y为你〖德化①〗选择过的牌名数)。", gongsunxiu: "公孙修", dcgangu: "干蛊", - dcgangu_info: "锁定技。每回合限一次。当其他角色失去体力后,你摸两张牌,然后失去1点体力。", + dcgangu_info: "锁定技。每回合限一次。当其他角色失去体力后,你摸三张牌,然后失去1点体力。", dckuizhen: "溃阵", - dckuizhen_info: - "出牌阶段限一次。你可以令一名手牌数或体力值大于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。", - dc_jiangji: "蒋济", + dckuizhen_info: "出牌阶段限一次。你可以令一名手牌数或体力值不小于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。", dcshiju: "势举", dcshiju_info: "其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+X(X为你装备区里的牌数)。若你以此法替换了装备,你与其各摸两张牌。", dcyingshi: "应时", dcyingshi_info: "每回合每项各限一次。当你使用普通锦囊牌指定目标后,你可令其中一个目标选择一项:⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌;⒉弃置X张牌,此牌对其无效(X为你装备区里的牌数)。", - dc_wangling: "王淩", dcjichou: "集筹", dcjichou_info: "出牌阶段结束时,若你于此阶段使用过牌且这些牌的牌名均不同,你可以观看位于弃牌堆中的这些牌,选择任意张牌并选择等量角色,将这些牌交给这些角色各一张,然后你摸X张牌(X为你本局游戏首次发动〖集筹〗给出的牌数)。", @@ -16736,7 +17278,6 @@ game.import("character", function () { dczifu: "自缚", dczifu_info: "锁定技。出牌阶段开始时,你将手牌摸至体力上限(至多摸至五张)。若你以此法得到牌,你须选择手牌中不同牌名的牌各一张,然后弃置其余的手牌。", - dc_simashi: "司马师", dcsanshi: "散士", dcsanshi_tag: "死士", dcsanshi_info: @@ -16747,8 +17288,6 @@ game.import("character", function () { dcchenlve: "沉略", dcchenlve_info: "限定技。出牌阶段,你可以将牌堆、弃牌堆、场上及其他角色的手牌区里的所有“死士”置入处理区,然后你获得这些牌。若如此做,你获得如下效果:1.此回合结束时,你将这些牌移出游戏;2.当你死亡时,你将所有以此法移出游戏的“死士”置入弃牌堆。", - dc_caoshuang: "新杀曹爽", - dc_caoshuang_prefix: "新杀", dcjianzhuan: "渐专", dcjianzhuan_info: "锁定技。①当你于出牌阶段使用牌时,你选择此阶段未执行过的一项执行:⒈令一名角色弃置X张牌;⒉摸X张牌;⒊重铸X张牌;⒋弃置X张牌(X为此技能于本阶段的发动次数)。②出牌阶段结束时,若你本阶段执行过〖渐专①〗的所有选项,则你随机移除〖渐专①〗的一项。", @@ -16771,7 +17310,33 @@ game.import("character", function () { //dctunchu_info: "锁定技。①你的起始手牌数为游戏人数的四倍。②你的手牌不能被弃置。③准备阶段,若你的手牌数大于你的体力上限,则你本回合至多使用三张牌。", dctunchu_info: "锁定技。①游戏开始时,你将手牌数摸至游戏人数的四倍。②你的手牌不能被弃置。③准备阶段,若你的手牌数大于你的体力值,则你本回合至多使用三张牌。", dcshuliang: "输粮", - dcshuliang_info: "一名角色的回合结束时,你可以将任意张手牌交给任意名没有手牌的角色各一张,然后本次获得可以指定自己为目标的牌的角色可以依次选择是否使用本次获得的牌。", + dcshuliang_info: "一名角色的回合结束时,你可以将任意张牌交给任意名没有手牌的角色各一张,然后本次获得可以指定自己为目标的牌的角色可以依次选择是否使用本次获得的牌。", + yue_miheng: "乐祢衡", + yue_miheng_prefix: "乐", + dcjigu: "激鼓", + dcjigu_info: "锁定技。①游戏开始时,你将所有手牌标记为“激鼓”。②你的“激鼓”牌不计入手牌上限。③当你造成或受到伤害后,若你的“激鼓”牌数等于你的装备区牌数且你本轮〖激鼓〗发动次数小于游戏轮数,则你可以摸X张牌(X为你的空缺装备栏数)。", + dcsirui: "思锐", + dcsirui_info: "出牌阶段限一次,你可以将一张牌当作与其字数相同的一张无距离和次数限制的基本牌或普通锦囊牌使用。", + yue_zoushi: "乐邹氏", + yue_zoushi_prefix: "乐", + dcyunzheng: "韵筝", + dcyunzheng_tag: "筝", + dcyunzheng_info: "锁定技。①游戏开始时,你将所有手牌标记为“筝”。②你的“筝”牌不计入手牌上限。③手牌中有“筝”的角色的非锁定技失效。", + dchuoxin: "惑心", + dchuoxin_info: "锁定技,当你使用手牌指定其他角色为目标后,你展示其中一名角色一张手牌。若此牌为“筝”牌或与你使用牌花色相同,你获得之;否则你将此牌标记为“筝”。", + yue_zhugeguo: "乐诸葛果", + yue_zhugeguo_prefix: "乐", + dcxidi: "羲笛", + dcxidi_tag: "笛", + dcxidi_info: "锁定技。①游戏开始时,你将所有手牌标记为“笛”。②你的“笛”牌不计入手牌上限。③准备阶段,若你的手牌中有“笛”,则你观看牌堆顶X张牌,然后将这些牌以任意顺序置于牌堆顶和牌堆底(X为你手牌中的“笛”数,且X至多为5)。", + dcchengyan: "乘烟", + dcchengyan_info: "当你于出牌阶段使用【杀】或普通锦囊牌指定其他角色为目标后,你可以亮出牌堆顶的一张牌,若此牌为【杀】或可指定目标的普通锦囊牌,你将此牌对其的结算方式改为此牌牌名的结算方式;若此牌不为【杀】和普通锦囊牌,你获得此牌并将此牌标记为“笛”。", + dc_sp_zhurong: "新杀SP祝融", + dc_sp_zhurong_prefix: "新杀SP", + dcmanhou: "蛮后", + dcmanhou_info: "出牌阶段限一次,你可以摸任意张牌并依次执行以下等量项(至多为4) :1:失去〖探乱〗;2:弃置一张手牌; 3:失去1点体力; 4:弃置一张牌并获得〖探乱〗。", + dctanluan: "探乱", + dctanluan_info: "锁定技,你使用牌指定目标后,若目标角色数大于等于非目标角色数,你可以弃置其中一个目标角色场上的一张牌;若目标角色数小于非目标角色数,则本回合你使用下一张牌的目标数+1。", sp_baigei: "无双上将", sp_caizijiaren: "才子佳人", @@ -16786,7 +17351,7 @@ game.import("character", function () { sp_raoting: "绕庭之鸦", sp_yijun: "异军突起", sp_zhengyin: "正音雅乐", - sp_zhonghu: "冢虎狼顾", + huicui_waitforsort: "等待分包", }, }; }); diff --git a/character/jsrg.js b/character/jsrg.js index d6a46521..628af2c1 100644 --- a/character/jsrg.js +++ b/character/jsrg.js @@ -177,6 +177,8 @@ game.import("character", function () { zhanghuan: "张奂(104-181年),字然明,又名张焕。敦煌渊泉今甘肃省瓜州县)人,后以功移籍弘农郡(今河南灵宝),书法家张芝的父亲。中国东汉经学家、军事家、文学家,“凉州三明”之一。早年师从太尉朱宠,研习《欧阳尚书》,自行删减《牟氏章句》。汉桓帝时,举贤良出身,对策第一,授议郎,历任安定都尉、武威太守、度辽将军、护匈奴中郎将等职。多次赢得对外战争,招抚外族,促进边境和平,功勋卓著。汉灵帝即位,迁大司农,受到宦官集团利用,讨伐大将军窦武。事后,上疏为窦武等人申冤。累迁太常卿,辞官归乡,授课著书,不再出仕。光和四年(181年),张奂去世,时年七十八。", chenfan: "陈蕃(?-168年),字仲举。汝南平舆(今河南省平舆北)人。东汉时期名臣,与窦武、刘淑合称“三君”。陈蕃年少时有大志,举孝廉,授郎中。因母去世,辞官居丧。后由太尉李固荐举为乐安太守。因得罪大将军梁冀,由太守降为县令。为了零陵桂阳的流民山匪得罪皇帝身边的人,被外放为豫章太守。后升任大鸿胪。延熹六年(163年),陈蕃被征为尚书仆射,转太中大夫。延熹八年(165年),陈藩代杨秉为太尉,次年,被免官。永康元年(167年),汉桓帝去世,窦皇后临朝,以陈蕃为太傅,管理尚书事宜。次年,汉灵帝即位,陈藩与大将军窦武谋诛宦官,事泄,宦官曹节劫持汉灵帝与窦太后,诛杀窦武,又率宫中卫士包围了陈蕃,陈蕃率学士80人抵抗,被害,年七十余。", zhangju: "张举(生卒年不详),渔阳人,与张纯同郡,是东汉末年起义军将领,曾在汉朝担任泰山太守。中平四年(187年),张举受张纯挑唆,联合乌桓起兵攻打郡县,部众到达了十多万;张举自称天子,张纯自称弥天将军安定王,声称自己将取代汉朝。刘虞担任幽州牧后,用怀柔之策说服乌桓罢兵,并悬赏求购张举、张纯;两人逃出塞外,后来张纯被门客王政所杀,张举则下落不明。", + caojiewangfu: "曹节(?―181年),字汉丰,南阳育阳(今河南省南阳市宛城区瓦店镇)人。东汉宦官。因事入宫,累迁西园骑。汉顺帝时期,迁小黄门。汉桓帝继位,迁中常侍,加任奉车都尉。拥戴汉灵帝有功,册封长安乡侯。联合长乐五官史朱瑀等矫诏诛杀窦武、陈蕃等人,升任长乐卫尉,进封育阳县侯。建宁二年(169年),加位特进、大长秋。权倾朝野,诬害勃海王刘悝,累迁尚书令。光和四年(181年),曹节去世,获赠车骑将军。
    王甫(?—179年),东汉时期宦官。前十常侍之一。灵帝初为长乐食监,受中常侍曹节等矫诏为黄门令,将兵诛杀大将军窦武等人,因迁中常侍。后与节诬奏勃海王刘悝谋反,封冠军侯。由此操纵朝政,父兄子弟皆为公卿列校、牧守令长,布满天下。光和二年 (179),与养子永乐少府萌、沛相吉并为司隶校尉阳球收捕,磔尸于城门。", + songhuanghou: "孝灵宋皇后(?―178年),宋氏,名不详,世称“宋孝灵”,扶风平陵人,汉章帝刘炟妃子宋贵人堂曾孙女,执金吾宋酆之女。建宁三年(170年),宋氏入选掖庭,封为贵人。建宁四年(171年),汉灵帝立宋氏为皇后。宋皇后无宠,却正位中宫,后宫得宠的姬妾们便共同谮恶宋皇后,诬陷宋皇后行祝诅之事。汉灵帝听信其言,于光和元年(178年)策收宋氏的皇后玺绶。宋皇后自行前往暴室狱,忧死,其父、兄弟皆伏诛。各个常侍、小黄门在宫中的,都怜悯宋氏无辜,一同筹钱安葬宋皇后及宋酆父子于皋门亭宋氏旧茔。", }, characterTitle: {}, perfectPair: {}, @@ -572,13 +574,19 @@ game.import("character", function () { } } 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) { @@ -587,7 +595,7 @@ game.import("character", function () { 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")); }); } @@ -778,6 +786,7 @@ game.import("character", function () { }, jsrgyangge: { global: "jsrgyangge_mizhao", + derivation: "mizhao", subSkill: { mizhao: { //直接继承mizhao @@ -814,11 +823,59 @@ game.import("character", function () { player.addTempSkill("jsrgguanshi_effect"); }, position: "hs", - //这个AI难写,交给157了! - check() { - return -1; + selectTargetAi(card) { + let cache = _status.event.getTempCache("jsrgguanshi", "targets"); + if (Array.isArray(cache)) return cache.length; + let player = _status.event.player, + targets = [], + shas = player.mayHaveSha(player, "respond", player.getCards("h", i => { + return card === i; + })); + game.countPlayer(tar => { + if (player === tar) return; + let eff = get.effect(tar, get.autoViewAs({ name: "juedou" }, [card]), player, player); + if (eff <= 0) return; + if (get.attitude(player, tar) > 0) targets.push([tar, eff, 0]); + else targets.push([tar, eff, tar.mayHaveSha(player, "respond", null, "count")]); + }); + targets.sort((a, b) => { + if (!a[2]) return -1; + if (!b[2]) return 1; + return b[1] / b[2] - a[1] / a[2]; + }); + for (let i = 0; i < targets.length; i++) { + if (targets[i][2] > shas) { + targets = targets.slice(0, i); + break; + } + else shas -= targets[i][2]; + } + _status.event.putTempCache("jsrgguanshi", "targets", targets); + return targets.length; + }, + check(card) { + let num = lib.skill.jsrgguanshi.selectTargetAi(card); + if (!num) return -1; + if (num === 1) return 4 - get.value(card); + return num + 5 - get.value(card); + }, + ai: { + order: 9, + result: { + player(player, target) { + 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.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); + } + return 0; + } + } }, - ai: {}, subSkill: { effect: { trigger: { @@ -928,6 +985,7 @@ game.import("character", function () { ); }, async content(event, trigger, player) { + player.awakenSkill("jsrgjiebing"); await player.gainMaxHp(2); await player.recover(2); await player.addSkills("jsrgbaowei"); @@ -988,8 +1046,11 @@ game.import("character", function () { jsrgsaojian: { enable: "phaseUse", usable: 1, + filter(event, player) { + return game.hasPlayer(current => current != player && current.countCards("h") > 0); + }, filterTarget(card, player, target) { - return target.countCards("h") > 0; + return target != player && target.countCards("h") > 0; }, async content(event, trigger, player) { const target = event.target; @@ -1227,7 +1288,7 @@ game.import("character", function () { sources.sortBySeat(); player.line(sources, "thunder"); for (let source of sources) { - if (!source.isIn() || !target.isIn()) break; + if (!source.isIn() || !target.isIn()) continue; target.damage(source, "thunder"); } }, @@ -2143,6 +2204,9 @@ game.import("character", function () { }, }, }, + ai: { + combo: "jsrgjinfa" + }, }, jsrgxuanfeng: { audio: 2, @@ -2175,6 +2239,7 @@ game.import("character", function () { }, ai: { order: 2, + combo: "jsrgjinfa" }, }, //陆逊 @@ -3348,6 +3413,9 @@ game.import("character", function () { } player.logSkill("jsrgbazheng", dissident); }, + ai: { + combo: "jsrgyaoyan" + }, }, //刘永 jsrgdanxin: { @@ -9073,7 +9141,7 @@ game.import("character", function () { }) .set("max", trigger.target.countDiscardableCards(player, "he")) .set("goon", get.attitude(player, trigger.target) < 0) - .set("logSkill", ["jsrgjuelie_discard", trigger.target]); + .set("logSkill", ["jsrgjuelie", trigger.target]); "step 1"; if (result.bool) { var num = result.cards.length; @@ -9100,7 +9168,6 @@ game.import("character", function () { } */ }, - shaRelated: true, ai: { unequip_ai: true, skillTagFilter: function (player, tag, arg) { @@ -10503,7 +10570,6 @@ game.import("character", function () { audio: 2, trigger: { player: "useCardToTargeted" }, forced: true, - shaRelated: true, filter: function (event, player) { return event.isFirstTarget && event.card.name == "sha" && player.hasEmptySlot(1); }, @@ -10544,7 +10610,7 @@ game.import("character", function () { ) return 0.01 * num; }, - aiUseful: () => { + aiUseful: function () { return lib.skill.jsrgzhenqiao.mod.aiValue.apply(this, arguments); }, }, @@ -10643,6 +10709,9 @@ game.import("character", function () { target.damage(); } }, + ai: { + combo: "jsrgshelun" + }, }, jsrgtushe: { audio: "xinfu_tushe", @@ -11777,9 +11846,9 @@ game.import("character", function () { jsrg_caojiewangfu: "衰曹节王甫", jsrg_caojiewangfu_prefix: "衰", jsrgzonghai: "纵害", - jsrgzonghai_info: "每轮限一次。当有其他角色进入濒死状态时,你可以令其选择至多两名角色。未被选择的角色不能于此次濒死结算中使用牌,且此次濒死状态结算结束后,你对其选择的角色各造成1点伤害。", + jsrgzonghai_info: "每轮限一次。当有其他角色进入濒死状态时,你可以令其选择至多两名角色。未被选择的角色不能于此次濒死结算中使用牌,且此次濒死状态结算结束后,你对其选择的角色各造成1点伤害。", jsrgjueyin: "绝禋", - jsrgjueyin_info: "当你于一回合内首次收到伤害后,你可以摸三张牌,然后本回合内所有角色受到的伤害+1。", + jsrgjueyin_info: "当你于一回合内首次受到伤害后,你可以摸三张牌,然后本回合内所有角色受到的伤害+1。", jsrg_songhuanghou: "衰宋皇后", jsrg_songhuanghou_prefix: "衰", jsrgzhongzen: "众谮", diff --git a/character/key.js b/character/key.js index 9a98d8e5..3cc64618 100644 --- a/character/key.js +++ b/character/key.js @@ -2258,7 +2258,7 @@ game.import("character", function () { }, 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", { @@ -2818,6 +2818,7 @@ game.import("character", function () { } }, }, + //藏里见 satomi_luodao: { trigger: { player: "useCardToPlayered" }, logTarget: "target", @@ -2900,6 +2901,7 @@ game.import("character", function () { } }, }, + //苍井绘梨花 erika_shisong: { trigger: { player: "useCard" }, forced: true, @@ -3068,6 +3070,7 @@ game.import("character", function () { }, }, }, + //李映夏 liyingxia_sanli: { trigger: { target: "useCardToTargeted" }, forced: true, @@ -3207,6 +3210,7 @@ game.import("character", function () { }, derivation: ["bazhen", "rejizhi", "reguanxing", "youlong"], }, + //雾岛佳乃 kano_liezhen: { trigger: { player: "phaseJieshuBegin" }, filter(event, player) { @@ -3327,6 +3331,7 @@ game.import("character", function () { player.storage.renku = true; }, }, + //藤川米亚 mia_shihui: { trigger: { player: "phaseDrawBegin1" }, forced: true, @@ -4606,6 +4611,7 @@ game.import("character", function () { }, }, }, + //井上晶 asara_shelu: { enable: "phaseUse", usable: 1, @@ -4665,6 +4671,7 @@ game.import("character", function () { combo: "asara_shelu" }, }, + //国崎往人 yukito_kongwu: { enable: "phaseUse", usable: 1, @@ -4889,6 +4896,8 @@ game.import("character", function () { }, }, yukito_yaxiang: { + unique: true, + forceunique: true, enable: "chooseToUse", limited: true, filter(event, player) { @@ -5106,6 +5115,7 @@ game.import("character", function () { event.getParent("arrangeTrigger").finish(); }, }, + //凤千早 chihaya_liewu: { derivation: "chihaya_huairou", mod: { @@ -5443,6 +5453,7 @@ game.import("character", function () { }, chihaya_youfeng_true: { charlotte: true }, chihaya_youfeng_false: { charlotte: true }, + //七濑留美 rumi_shuwu: { mod: { cardUsable(card) { @@ -5555,6 +5566,7 @@ game.import("character", function () { }, onremove: true, }, + //凤咲夜 sakuya_junbu: { mod: { targetInRange(card, player) { @@ -5646,6 +5658,7 @@ game.import("character", function () { }, }, }, + //铃木央人 hiroto_huyu: { trigger: { global: "phaseUseEnd" }, noHidden: true, @@ -5790,6 +5803,7 @@ game.import("character", function () { player.changeSkills(["hiroto_zonglve"], ["hiroto_huyu"]); }, }, + //水织静久 shizuku_sizhi: { audio: 2, enable: "phaseUse", @@ -5995,6 +6009,7 @@ game.import("character", function () { if (cards.length) await target.gain(cards, "gain2"); }, }, + //鸣濑白羽 shiroha_yuzhao: { trigger: { global: "phaseBefore", @@ -6211,6 +6226,7 @@ game.import("character", function () { }, derivation: ["umi_chaofan", "ao_xishi", "tsumugi_mugyu", "kamome_jieban"], }, + //高城丈士朗 jojiro_shensu: { group: ["jojiro_shensu1", "jojiro_shensu2", "jojiro_shensu4"], charlotte: true, @@ -6329,6 +6345,7 @@ game.import("character", function () { else player.draw(num); }, }, + //神户小鸟 kotori_yumo: { trigger: { global: "phaseBefore", @@ -6339,6 +6356,7 @@ game.import("character", function () { filter(event, player) { return event.name != "phase" || game.phaseNumber == 0; }, + derivation: ["kotori_skill_wei", "kotori_skill_shu", "kotori_skill_wu", "kotori_skill_qun", "kotori_skill_jin", "kotori_skill_key"], content() { var list = ["wei", "shu", "wu", "qun", "jin"]; for (var i of list) { @@ -6753,9 +6771,11 @@ game.import("character", function () { return player.getUseValue({ name: "kaihua" }); }, }, + combo: "kotori_yumo", }, }, - kotori_huazhan2: { onremove: true }, + kotori_huazhan2: { onremove: true, charlotte: true }, + //三谷良一 ryoichi_baoyi: { trigger: { player: "loseAfter", @@ -6846,7 +6866,11 @@ game.import("character", function () { "step 2"; event.cards = result.cards; }, + ai: { + halfneg: true + }, }, + //乙坂有宇 yuu_lveduo: { mod: { cardEnabled(card, player) { @@ -6964,6 +6988,7 @@ game.import("character", function () { }, }, yuu_lveduo4: { charlotte: true }, + //松下五段 godan_yuanyi: { trigger: { player: "phaseBegin" }, forced: true, @@ -6993,7 +7018,12 @@ game.import("character", function () { player.draw(3); player.removeSkills("godan_feiqu"); }, + ai: { + combo: "godan_feiqu", + halfneg: true + }, }, + //游佐 abyusa_jueqing: { audio: 2, trigger: { source: "damageBegin2" }, @@ -7059,6 +7089,7 @@ game.import("character", function () { }, }, }, + //水濑秋子 akiko_dongcha: { trigger: { global: "phaseBefore" }, forced: true, @@ -7099,6 +7130,7 @@ game.import("character", function () { }, }, }, + //美坂香里 kaori_siyuan: { enable: "phaseUse", filter(event, player) { @@ -7168,6 +7200,7 @@ game.import("character", function () { }, }, }, + //美坂栞 shiori_huijuan: { trigger: { global: "phaseJieshuBegin" }, locked: true, @@ -7259,6 +7292,7 @@ game.import("character", function () { if (!result.bool) player.skip("phaseUse"); }, }, + //野村美希 miki_shenqiang: { trigger: { global: "phaseBefore", @@ -8264,6 +8298,7 @@ game.import("character", function () { player.removeGaintag("shiorimiyuki_tingxian"); }, }, + //中津静流 shizuru_nianli: { enable: "chooseToUse", charlotte: true, @@ -8516,6 +8551,7 @@ game.import("character", function () { } }, }, + //岬镜子 kyoko_juwu: { trigger: { global: ["loseAfter", "cardsDiscardAfter", "loseAsyncAfter", "equipAfter"], @@ -8715,6 +8751,7 @@ game.import("character", function () { }, }, }, + //音无结弦(3v3) yuzuru_bujin: { global: "yuzuru_bujin2", trigger: { global: "phaseDrawBegin" }, @@ -8743,6 +8780,7 @@ game.import("character", function () { }, }, }, + //西园美鱼 mio_tuifu: { trigger: { global: "damageBegin1" }, forced: true, @@ -8757,6 +8795,7 @@ game.import("character", function () { trigger: { player: "phaseZhunbeiBegin" }, limited: true, unique: true, + forceunique: true, charlotte: true, skillAnimation: true, animationColor: "water", @@ -8764,6 +8803,7 @@ game.import("character", function () { return player.isDamaged(); }, check(event, player) { + if (![player.name1, player.name2].includes("key_mio")) return false; return player.hp <= 1 || player.getDamagedHp() > 1; }, content() { @@ -8776,6 +8816,7 @@ game.import("character", function () { } }, }, + //西园美鸟 midori_nonghuan: { enable: "phaseUse", charlotte: true, @@ -8836,12 +8877,14 @@ game.import("character", function () { limited: true, charlotte: true, unique: true, + forceunique: true, skillAnimation: true, animationColor: "water", filter(event, player) { return player.isDamaged(); }, check(event, player) { + if (![player.name1, player.name2].includes("key_midori")) return false; return player.hp <= 1 || player.getDamagedHp() > 1; }, content() { @@ -8854,6 +8897,7 @@ game.import("character", function () { } }, }, + //立华奏 kanade_mapo: { audio: 2, derivation: "mapodoufu", @@ -8957,6 +9001,7 @@ game.import("character", function () { } }, }, + //音无结弦 yuzuru_wuxin: { trigger: { player: "phaseJieshuBegin" }, async cost(event, trigger, player) { @@ -9159,6 +9204,7 @@ game.import("character", function () { if (player.hp < 2) player.recover(2 - player.hp); }, }, + //空门苍 ao_xishi: { trigger: { player: ["useCard", "respond"], @@ -9317,6 +9363,7 @@ game.import("character", function () { }, ai: { order: 1, result: { player: 1 } }, }, + //直井文人 ayato_jianshen: { mod: { cardnature(card, player) { @@ -9446,6 +9493,7 @@ game.import("character", function () { }, ai: { order: 10, result: { target: -1 } }, }, + //古河渚 nagisa_tiandu: { trigger: { player: "judgeEnd" }, charlotte: true, @@ -9566,6 +9614,7 @@ game.import("character", function () { }, ai: { expose: 0.2 }, }, + //冈崎朋也 tomoya_shangxian: { trigger: { player: "phaseUseBegin" }, mark: true, @@ -9666,6 +9715,7 @@ game.import("character", function () { }, ai: { expose: 0.2 }, }, + //野田 noda_fengcheng: { audio: 2, trigger: { @@ -9717,6 +9767,7 @@ game.import("character", function () { event.giver.give(result.cards, event.gainner); }, }, + //日向秀树 hinata_qiulve: { audio: 2, enable: ["chooseToUse", "chooseToRespond"], @@ -9812,6 +9863,7 @@ game.import("character", function () { player.draw(); }, }, + //高桥久子 hisako_yinbao: { audio: 2, trigger: { player: ["damageEnd", "recoverAfter"] }, @@ -9861,6 +9913,7 @@ game.import("character", function () { }, ai: { luckyStar: true }, }, + //直枝理树 riki_spwenji: { audio: 2, trigger: { player: "phaseUseBegin" }, @@ -9917,6 +9970,16 @@ game.import("character", function () { }, }, riki_nvzhuang: { + init(player) { + if (get.character(player.name1, 3).includes("riki_nvzhuang")) { + player.storage.riki_nvzhuang = player.sex; + if (player.sex === "male") player.sex = "double"; + else player.sex = "female"; + } + }, + onremove(player) { + if (player.storage.riki_nvzhuang) player.sex = player.storage.riki_nvzhuang; + }, trigger: { player: "phaseJieshuBegin" }, forced: true, content() { @@ -10000,6 +10063,7 @@ game.import("character", function () { }, ai: { expose: 0.2 }, }, + //来谷唯湖 yuiko_fenglun: { enable: "phaseUse", usable: 1, @@ -10066,6 +10130,7 @@ game.import("character", function () { }, }, }, + //多鲁基 doruji_feiqu: { trigger: { player: "useCard", @@ -10080,6 +10145,7 @@ game.import("character", function () { else trigger.directHit.add(player); }, ai: { + halfneg: true, directHit_ai: true, skillTagFilter(player, tag, arg) { return arg.card.name == "sha"; @@ -10098,6 +10164,7 @@ game.import("character", function () { }, }, }, + //千里朱音 akane_jugu: { audio: 2, mod: { @@ -10250,6 +10317,7 @@ game.import("character", function () { }, }, akane_yifu3: { charlotte: true }, + //笹濑川佐佐美 sasami_miaobian: { derivation: ["sasami_gongqing", "sasami_funan", "sasami_baoqiu"], init2(player) { @@ -10340,6 +10408,7 @@ game.import("character", function () { }, }, }, + //枣铃 rin_baoqiu: { mod: { attackRange(rin, ball) { @@ -10385,6 +10454,7 @@ game.import("character", function () { } }, }, + //春原阳平&春原芽衣 sunohara_chengshuang: { trigger: { global: "phaseBefore", @@ -10539,6 +10609,7 @@ game.import("character", function () { target.draw(num); }, }, + //椎名 shiina_qingshen: { audio: 1, trigger: { @@ -10631,7 +10702,6 @@ game.import("character", function () { }, shiina_retieji: { audio: 1, - shaRelated: true, trigger: { player: "useCardToPlayered" }, check(event, player) { return get.attitude(player, event.target) < 0; @@ -10674,6 +10744,7 @@ game.import("character", function () { } }, }, + //稻荷 inari_baiwei: { enable: ["chooseToUse", "chooseToRespond"], hiddenCard(player, name) { @@ -10802,6 +10873,7 @@ game.import("character", function () { }, }, }, + //朱鹭户沙耶 saya_powei: { audio: 2, trigger: { player: "phaseAfter" }, @@ -10955,6 +11027,7 @@ game.import("character", function () { if (result.bool) player.draw(); }, }, + //三枝叶留佳&二木佳奈多 haruka_shuangche: { audio: 2, enable: "phaseUse", @@ -11072,6 +11145,7 @@ game.import("character", function () { }, }, haruka_kanata: { charlotte: true }, + //紬文德斯 tsumugi_mugyu: { audio: 5, trigger: { target: "useCardToTargeted" }, @@ -11141,8 +11215,8 @@ game.import("character", function () { game.delay(); }, }, + //由依 yui_jiang: { - shaRelated: true, audio: 2, audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], trigger: { @@ -11294,6 +11368,7 @@ game.import("character", function () { game.asyncDraw(targets); }, }, + //吉野晴彦 yoshino_jueyi: { trigger: { player: "phaseUseBegin" }, async cost(event, trigger, player) { @@ -11337,6 +11412,7 @@ game.import("character", function () { }, }, }, + //宫泽谦吾 kengo_weishang: { locked: false, mod: { @@ -11451,6 +11527,7 @@ game.import("character", function () { }, }, kengo_guidui2: { onremove: true }, + //岩泽雅美 iwasawa_yinhang: { trigger: { player: "changeHp" }, locked: true, @@ -11603,6 +11680,7 @@ game.import("character", function () { }, }, }, + //井之原真人 masato_baoquan: { trigger: { source: "damageBefore" }, forced: true, @@ -11635,6 +11713,7 @@ game.import("character", function () { }, }, }, + //西森柚咲&黑羽美砂 yusa_yanyi: { enable: "phaseUse", usable: 1, @@ -11702,6 +11781,9 @@ game.import("character", function () { content() { player.turnOver(); }, + ai: { + combo: "yusa_yanyi", + }, }, misa_yusa: { charlotte: true, @@ -11796,6 +11878,7 @@ game.import("character", function () { return !event.player.isTurnedOver() || get.attitude(player, event.player) > 0; }, }, + //宫泽有纪宁 yukine_wenzhou: { trigger: { global: "phaseUseBegin" }, filter(event, player) { @@ -11902,6 +11985,7 @@ game.import("character", function () { }, }, }, + //神北小毬 komari_tiankou: { trigger: { player: "useCard2", @@ -12013,6 +12097,7 @@ game.import("character", function () { player.recover(); }, }, + //鹰原羽未 umi_chaofan: { enable: "phaseUse", usable: 1, @@ -12082,9 +12167,15 @@ game.import("character", function () { }, }, umi_qihuan: { + unique: true, + forceunique: true, enable: "chooseToUse", filter(summer, umi) { - return summer.type == "dying" && umi.isDying(); + return ( + summer.type == "dying" && + umi.isDying() && + [umi.name1, umi.name2].includes("key_umi") + ); }, limited: true, skillAnimation: true, @@ -12164,6 +12255,7 @@ game.import("character", function () { }, }, }, + //神尾晴子 haruko_haofang: { mod: { cardname(card, player, name) { @@ -12353,7 +12445,11 @@ game.import("character", function () { await trigger.player.changeGroup(player.group); await trigger.player.draw(); }, + ai: { + combo: "yuri_xingdong", + }, }, + //枣恭介 nk_shekong: { enable: "phaseUse", usable: 1, @@ -12457,6 +12553,7 @@ game.import("character", function () { } else trigger.directresult = get.bottomCards()[0]; }, }, + //此花露西娅 lucia_duqu: { trigger: { player: ["damage", "loseHpBefore", "useCardBefore"], @@ -12678,7 +12775,7 @@ game.import("character", function () { key_mia: "藤川米娅", key_kano: "雾岛佳乃", db_key_liyingxia: "李映夏", - key_erika: "苍井绘梨花", + key_erika: "苍井绘里香", key_satomi: "藏里见", key_iriya: "喵呜·喵呼", key_iriya_ab: "喵呜喵呼", @@ -13095,8 +13192,7 @@ game.import("character", function () { hiroto_zonglve_info: "锁定技,你的手牌上限+3。出牌阶段限一次,你可以将一张手牌背面朝下放置,并展示一名其他角色的一张手牌。若这两张牌:颜色相同,你对其造成1点伤害并弃置其展示的牌。颜色不同,你获得该角色区域内的两张牌。", hiroto_tuolao: "脱牢", - hiroto_tuolao_info: - "觉醒技,回合结束后,若此回合不是你的第一个回合且你本轮内未因〖虎驭〗失去过牌,则你摸三张牌,失去〖虎驭〗并获得〖纵略〗。", + hiroto_tuolao_info: "觉醒技,回合结束后,若此回合不是你的第一个回合且你此回合未因〖虎驭〗失去过牌,则你摸三张牌,失去〖虎驭〗并获得〖纵略〗。", sakuya_junbu: "均步", sakuya_junbu_info: "锁定技,若你已废除的装备栏数量:≥1,你使用牌无距离限制。≥2,你使用牌无次数限制。≥3,你使用牌时可以多指定一个目标。≥4,你使用的牌不可被响应。≥5,你使用牌造成伤害时失去1点体力,令此伤害+1。", diff --git a/character/mobile.js b/character/mobile.js index 831b5d7b..448503ad 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -6,7 +6,7 @@ game.import("character", function () { connect: true, characterSort: { mobile: { - 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: ["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", "mb_wangjing", "zhangbu"], 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"], @@ -29,7 +29,7 @@ game.import("character", function () { mb_simafu: ["male", "wei", 3, ["mbpanxiang", "mbchenjie"]], mb_sp_guanqiujian: ["male", "wei", 4, ["mbcuizhen", "mbkuili"]], mb_caomao: ["male", "wei", 3, ["mbqianlong", "mbweitong"], ["zhu"]], - chengji: ["male", "wei", 4, ["mbkuangli", "mbxiongsi"]], + chengji: ["male", "jin", 4, ["mbkuangli", "mbxiongsi"]], lizhaojiaobo: ["male", "wei", 4, ["mbzuoyou", "mbshishou"]], yangfeng: ["male", "qun", 4, ["mbxuetu", "mbweiming"]], xin_huojun: ["male", "shu", 4, ["sidai", "jieyu"], ["character:tw_huojun", "die_audio:tw_huojun"]], @@ -55,7 +55,7 @@ game.import("character", function () { re_yanwen: ["male", "qun", 4, ["reshuangxiong"]], xin_zhoutai: ["male", "wu", 4, ["buqu", "new_fenji"]], re_caozhi: ["male", "wei", 3, ["reluoying", "rejiushi", "chengzhang"]], - yj_weiyan: ["male", "qun", 5, ["mbguli", "mbaosi"]], + yj_weiyan: ["male", "qun", "4/4/1", ["mbguli", "mbaosi"]], re_chenqun: ["male", "wei", 3, ["redingpin", "refaen"]], xin_caoxiu: ["male", "wei", 4, ["qianju", "xinqingxi"]], xin_zhuhuan: ["male", "wu", 4, ["fenli", "xinpingkou"]], @@ -93,7 +93,7 @@ game.import("character", function () { re_zhonghui: ["male", "wei", 4, ["requanji", "zili"], ["clan:颍川钟氏"]], xin_caifuren: ["female", "qun", 3, ["xinqieting", "xianzhou"]], xin_zhoucang: ["male", "shu", 4, ["mobilezhongyong"]], - ol_yujin: ["male", "wei", 4, ["rejieyue"]], + ol_yujin: ["male", "wei", 4, ["rejieyue"], ["die_audio:yujin_yujin"]], zhouqun: ["male", "shu", 3, ["tiansuan"]], re_zhurong: ["female", "shu", 4, ["juxiang", "relieren"]], re_jiangwei: ["male", "shu", 4, ["retiaoxin", "zhiji"]], @@ -155,6 +155,8 @@ game.import("character", function () { 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:太原王氏"]], @@ -231,6 +233,8 @@ game.import("character", function () { jiakui: "贾逵(174年—228年),本名贾衢,字梁道,河东襄陵人(今山西临汾县)。汉末三国时期魏国名臣,西晋开国功臣贾充父亲。初为并州郡吏,迁渑池县令,拜弘农太守,历仕曹操、曹丕、曹叡三世,是曹魏政权中具有军政才干的人物,终其一生为魏国统一事业作出卓越贡献。担任豫州刺史期间,兴修水利,凿通运河二百余里,时称“贾侯渠”,便利民生。随同曹丕伐吴,进封阳里亭侯,加号建威将军。石亭之战,率军救出曹休。太和二年,去世,赠本官,谥号为肃,《唐会要》将其尊为魏晋八君子之一。", shenpei: "审配(?-204年),字正南,魏郡阴安(今河北清丰北)人。为人正直, 袁绍领冀州,审配被委以腹心之任,并总幕府。河北平定,袁绍以审配、逢纪统军事,审配恃其强盛,力主与曹操决战。曾率领弓弩手大破曹军于官渡。官渡战败,审配二子被俘,反因此受谮见疑,幸得逢纪力保。袁绍病死,审配等矫诏立袁尚为嗣,导致兄弟相争,被曹操各个击破。曹操围邺,审配死守数月,终城破被擒,拒不投降,慷慨受死。", hujinding: "胡金定,女,传说中关羽之妻。关索之母,配偶关羽,出处《花关索传》和元代《三国志评话》民间传说人物。", + zhangbu:"张布(?-264年),三国时吴国将领。张布在孙休受封为琅琊王时,为左右将督。太平三年(258年),孙休即位后,张布由长水校尉迁辅义将军,封永康侯。不久,孙休听说孙綝阴谋反叛,于是暗中和张布商量计策,孙綝被杀后,左将军张布因功加封中军督。由于孙休对张布厚加恩宠,因此张布专擅朝廷大权,多行无礼之事。永安七年(264年),孙休去世,丞相濮阳兴、左将军张布推荐孙皓为帝。同年八月初三,孙皓即皇帝位,封张布为骠骑将军,加侍中。孙皓粗暴骄盈、暴虐治国,又好酒色,濮阳兴和张布暗地里感到后悔,有人将此事报告孙皓,濮阳兴和张布二人被诛。", + mb_wangjing:"王经(?—260年),字彦纬,冀州清河郡人,三国时代曹魏大臣。《三国志》无传。王经为农民出身,因得到同乡崔林的赏识,被提拔任官。其母说他太快出头会不吉利,但他平步青云,历任江夏太守、雍州刺史。正元二年(255年),蜀将姜维攻入陇西郡时,他率军出狄道城迎击蜀军,却被击败。被包围在城中,陷入穷途末路的境况。幸亏得到大将陈泰和邓艾的援助,合力击破姜维,才脱险。此后,他被朝廷召回。不久迁司隶校尉、尚书。甘露五年(260年),魏帝曹髦召见王沈、王经、王业,提出进讨司马昭的计划。王经进谏,但曹髦不听;王沈、王业向司马昭告密,王经不从。司马昭弑君后,王经因未向司马昭告急,而和其母一同被逮捕并被处死。", }, characterTitle: {}, card: { @@ -405,9 +409,293 @@ game.import("character", function () { }, }, skill: { + //张布 + 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", }, @@ -455,7 +743,7 @@ game.import("character", function () { } } if (list.includes(SUB)) { - if (att > 0 && attSource > 0) return SUB; + if (att > 0 && attSource >= 0) return SUB; if (canFilterDamage && att > 0) return "cancel2"; if (damageEff > 0) { if (target.getHp() > trigger.num && attSource > 0 && source.countCards("h") + source.getHp() <= 4) return SUB; @@ -463,13 +751,13 @@ game.import("character", function () { if (att > 0) { if (trigger.num >= target.getHp()) return SUB; if ( - !source.countCards("hs", card => { + source && !source.countCards("hs", card => { return source.canUse(card, target, true) && get.effect(target, card, source, player) > 0; }) ) return Math.random() < 0.7 ? ADD : "cancel2"; } else { - if (attSource > 0) return SUB; + if (attSource >= 0) return SUB; if (target.hasSkillTag("maixie") && trigger.num === 1 && damageEff < -20) return SUB; } } @@ -522,6 +810,9 @@ game.import("character", function () { if (cards.length) await player.discard(cards); await player.draw(4); }, + ai: { + combo: "mbpanxiang" + }, }, //李昭焦伯 mbzuoyou: { @@ -530,7 +821,7 @@ game.import("character", function () { usable: 1, zhuanhuanji: true, filterTarget(card, player, target) { - if (player.storage.mbzuoyou) return target.countCards("h") >= 2; + if (player.storage.mbzuoyou) return get.mode() == "versus" && _status.mode == "two" ? true : target.countCards("h"); return true; }, async content(event, trigger, player) { @@ -538,10 +829,10 @@ game.import("character", function () { target = event.target; if (event.name === "mbzuoyou") player.changeZhuanhuanji("mbzuoyou"); if (!storage) { - await target.draw(2); - await target.chooseToDiscard(1, true, "h"); + await target.draw(3); + await target.chooseToDiscard(2, true, "h"); } else { - await target.chooseToDiscard(target === player ? "佐佑" : `${get.translation(player)}对你发动了【佐佑】`, "请弃置两张手牌,然后获得1点护甲", 2, true); + if ((get.mode() != "versus" || _status.mode != "two") && target.countCards("h")) await target.chooseToDiscard(target === player ? "佐佑" : `${get.translation(player)}对你发动了【佐佑】`, "请弃置一张手牌,然后获得1点护甲", 1, true); await target.changeHujia(1, null, true); } }, @@ -549,8 +840,8 @@ game.import("character", function () { marktext: "☯", intro: { content(storage, player) { - if (!storage) return "转换技。出牌阶段限一次,你可以令一名角色摸两张牌,然后其弃置一张手牌。"; - return "转换技。出牌阶段限一次,你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。"; + if (!storage) return "转换技。出牌阶段限一次,你可以令一名角色摸三张牌,然后其弃置两张手牌。"; + return "转换技。出牌阶段限一次,你可以令一名有手牌的角色弃置一张手牌,然后其获得1点护甲。"; }, }, ai: { @@ -625,17 +916,21 @@ game.import("character", function () { 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: { @@ -744,13 +1039,13 @@ game.import("character", function () { (event.name != "phase" || game.phaseNumber == 0) && game.hasPlayer(current => { return current !== player && current.hasEnabledSlot(1); - }) && - get.mode() == "identity" + }) ); }, 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 => { @@ -803,10 +1098,10 @@ game.import("character", function () { }, async content(event, trigger, player) { trigger.num += Math.min( - 2, + 4, game.countPlayer(current => { return current.countDisabledSlot(1); - }) + }) + (get.mode() === "identity" ? 1 : 2) ); }, }, @@ -818,26 +1113,22 @@ game.import("character", function () { player: "damageEnd", }, filter(event, player) { - return player.countCards("h") > 0 || (event.source && event.source.isIn() && event.source.hasDisabledSlot(1)); + return event.source && event.source.isIn() && event.source.hasDisabledSlot(1); }, forced: true, async content(event, trigger, player) { - if (player.countCards("h") > 0) { - await player.chooseToDiscard(`溃离:请弃置${get.cnNumber(trigger.num)}张手牌`, trigger.num, true); - } const source = trigger.source; - if (source && source.isIn() && source.hasDisabledSlot(1)) { - player.line(source, "green"); - await source.enableEquip(1, player); - } + player.line(source, "green"); + await source.enableEquip(1, player); }, ai: { neg: true, }, }, - //曹髦 史?! + //曹髦 史?! 我求你别改了 mbqianlong: { audio: 6, + persevereSkill: true, trigger: { player: ["mbqianlong_beginAfter", "mbqianlong_addAfter", "mbweitongAfter"], }, @@ -849,15 +1140,17 @@ game.import("character", function () { 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: { @@ -868,6 +1161,7 @@ game.import("character", function () { subSkill: { begin: { audio: "mbqianlong", + persevereSkill: true, trigger: { global: "phaseBefore", player: "enterGame", @@ -878,11 +1172,17 @@ game.import("character", function () { 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: { audio: "mbqianlong", + persevereSkill: true, trigger: { player: ["gainAfter", "damageEnd"], source: "damageSource", @@ -904,34 +1204,30 @@ game.import("character", function () { 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", }, @@ -939,6 +1235,7 @@ game.import("character", function () { mbcmqingzheng: { audio: "sbqingzheng", audioname: ["mb_caomao"], + persevereSkill: true, trigger: { player: "phaseUseBegin" }, filter(event, player) { return player.countCards("h") > 0; @@ -946,14 +1243,16 @@ game.import("character", function () { 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 ( @@ -1073,6 +1372,7 @@ game.import("character", function () { mbcmjiushi: { audio: "rejiushi", inherit: "rejiushi", + persevereSkill: true, group: ["rejiushi1", "mbcmjiushi_check", "mbcmjiushi_turnback", "mbcmjiushi_gain"], subSkill: { check: { @@ -1089,6 +1389,7 @@ game.import("character", function () { turnback: { audio: "rejiushi", audioname: ["mb_caomao"], + persevereSkill: true, trigger: { player: "damageEnd" }, check(event, player) { return player.isTurnedOver(); @@ -1107,6 +1408,7 @@ game.import("character", function () { gain: { audio: "rejiushi", audioname: ["mb_caomao"], + persevereSkill: true, trigger: { player: "turnOverAfter" }, frequent: true, prompt: "是否发动【酒诗】,获得牌堆中的一张锦囊牌?", @@ -1122,9 +1424,11 @@ game.import("character", function () { mbcmfangzhu: { audio: "sbfangzhu", audioname: ["mb_caomao"], + 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: { @@ -1173,12 +1477,15 @@ game.import("character", function () { 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; switch (num) { case 1: target.addTempSkill("mbcmfangzhu_ban", { player: "phaseEnd" }); @@ -1262,6 +1569,7 @@ game.import("character", function () { }, mbjuejin: { audio: 2, + persevereSkill: true, enable: "phaseUse", limited: true, skillAnimation: true, @@ -1272,18 +1580,37 @@ game.import("character", function () { 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, @@ -1336,7 +1663,7 @@ game.import("character", function () { return true; }, zhuanhuanji2(skill, player) { - return player.countMark("mbxuetu_status") !== 1; + return player && player.countMark("mbxuetu_status") !== 1; }, position: "he", onremove: ["mbxuetu", "mbxuetu_status"], @@ -1774,6 +2101,9 @@ game.import("character", function () { async content(event, trigger, player) { trigger.num++; }, + ai: { + combo: "zhoulin" + }, }, zhoulin: { audio: 2, @@ -4041,7 +4371,6 @@ game.import("character", function () { //赵忠 scschiyan: { audio: 1, - shaRelated: true, trigger: { player: "useCardToPlayered" }, direct: true, filter: function (event, player) { @@ -4265,7 +4594,7 @@ game.import("character", function () { "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 @@ -4284,7 +4613,7 @@ game.import("character", function () { "step 2"; if (result.index == 0) { player.chooseCardTarget({ - position: "he", + position: "h", filterCard: true, selectCard: 2, filterTarget: function (card, player, target) { @@ -4299,11 +4628,11 @@ game.import("character", function () { 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"; @@ -4444,7 +4773,6 @@ game.import("character", function () { }, ai: { threaten: 2.5, - halfneg: true, }, subSkill: { block: { @@ -5167,7 +5495,6 @@ game.import("character", function () { if (card) player.gain(card, "gain2"); }, ai: { - combo: "fenli", effect: { target: function (card) { if (card.name == "lebu" || card.name == "bingliang") return 0.5; @@ -6998,10 +7325,10 @@ game.import("character", function () { 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, @@ -7484,38 +7811,46 @@ game.import("character", function () { bingqing: { audio: 2, trigger: { player: "useCardAfter" }, - direct: true, - filter: function (event, player) { - var suit = get.suit(event.card); + filter(event, player) { + const evt = event.getParent("phaseUse"); + if (!evt || !evt.player || evt.player != player) return false; + const suit = get.suit(event.card); if (!lib.suit.includes(suit)) return false; - var evt = event.getParent("phaseUse"); - if (!evt || player != evt.player) return false; - var list = [], - history = player.getHistory("useCard"); - if (history.length < 2) return false; - for (var i of history) { - if (i.getParent("phaseUse") != evt) continue; - var suit2 = get.suit(i.card); - if (!lib.suit.includes(suit2)) continue; - if (i != event && suit2 == suit) return false; - if (i.finished) list.add(suit2); - } - return list.length > 1 && list.length < 5; + if ( + player + .getHistory("useCard", evtx => { + return evtx.getParent("phaseUse") == evt && get.suit(evtx.card) == suit; + }) + .indexOf(event) != 0 + ) + return false; + return Array.from({ length: 3 }) + .map((_, i) => i + 2) + .includes( + player + .getHistory( + "useCard", + evtx => { + return evtx.getParent("phaseUse") == evt && lib.suit.includes(get.suit(evtx.card)); + }, + event + ) + .reduce((list, evtx) => list.add(get.suit(evtx.card)), []).length + ); }, - content: function () { - "step 0"; - var suit = get.suit(trigger.card); - var evt = event.getParent("phaseUse"); - var list = [], - history = player.getHistory("useCard"); - for (var i of history) { - if (i.getParent("phaseUse") != evt) continue; - var suit2 = get.suit(i.card); - if (!lib.suit.includes(suit2)) continue; - if (i.finished) list.add(suit2); - } - var prompt, filterTarget, ai; - switch (list.length) { + async cost(event, trigger, player) { + const evt = trigger.getParent("phaseUse"); + const num = player + .getHistory( + "useCard", + evtx => { + return evtx.getParent("phaseUse") == evt && lib.suit.includes(get.suit(evtx.card)); + }, + trigger + ) + .reduce((list, evtx) => list.add(get.suit(evtx.card)), []).length; + let prompt, filterTarget, ai; + switch (num) { case 2: prompt = "令一名角色摸两张牌"; filterTarget = function (card, player, target) { @@ -7537,7 +7872,7 @@ game.import("character", function () { }; ai = function (target) { var player = _status.event.player; - return get.effect(target, { name: "guohe_copy" }, player, player); + return get.effect(target, { name: "guohe" }, player, player); }; break; case 4: @@ -7551,29 +7886,30 @@ game.import("character", function () { }; break; default: - event.finish(); + event.result = { bool: false }; return; } - event.num = list.length; - player.chooseTarget(get.prompt("bingqing"), prompt, filterTarget).set("ai", ai); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("bingqing", target); - event.target = target; - event.goto(num); - } else event.finish(); - "step 2"; - target.draw(2); - event.finish(); - "step 3"; - player.discardPlayerCard(target, true, "hej"); - event.finish(); - "step 4"; - target.damage(); + let result = await player.chooseTarget(get.prompt("bingqing"), prompt, filterTarget).set("ai", ai).forResult(); + result.cost_data = num; + event.result = result; + }, + async content(event, trigger, player) { + const target = event.targets[0]; + switch (event.cost_data) { + case 2: + await target.draw(2); + break; + case 3: + await player.discardPlayerCard(target, true, "hej"); + break; + case 4: + await target.damage(); + break; + } }, }, yingfeng: { + audio: 2, trigger: { player: "phaseZhunbeiBegin" }, direct: true, content: function () { @@ -8783,62 +9119,6 @@ game.import("character", function () { } }, }, - //新华歆 - yuanqing: { - audio: 2, - trigger: { player: "phaseUseEnd" }, - forced: true, - filter: function (event, player) { - return player.hasHistory("useCard", function (evt) { - return evt.getParent("phaseUse") == event; - }); - }, - content: function () { - var map = {}, - cards = []; - player.getHistory("useCard", function (evt) { - if (evt.getParent("phaseUse") == trigger) { - var type = get.type2(evt.card, false); - if (!map[type]) map[type] = []; - } - }); - for (var i = 0; i < ui.discardPile.childNodes.length; i++) { - var card = ui.discardPile.childNodes[i], - type = get.type2(card, false); - if (map[type]) map[type].push(card); - } - for (var i in map) { - if (map[i].length) cards.push(map[i].randomGet()); - } - if (cards.length) { - player.$gain2(cards, false); - game.cardsGotoSpecial(cards, "toRenku"); - game.log(player, "将", cards, "置入了仁库"); - game.delayx(); - } - }, - init: function (player) { - player.storage.renku = true; - }, - }, - shuchen: { - audio: 2, - init: function (player) { - player.storage.renku = true; - }, - trigger: { global: "dying" }, - forced: true, - filter: function (event, player) { - return _status.renku.length > 3; - }, - logTarget: "player", - content: function () { - player.gain(_status.renku, "gain2", "fromRenku"); - _status.renku.length = 0; - game.updateRenku(); - trigger.player.recover(); - }, - }, //谯周 zhiming: { audio: 2, @@ -8886,16 +9166,11 @@ game.import("character", function () { xingbu: { audio: 2, trigger: { player: "phaseJieshuBegin" }, - prompt2: "亮出牌堆顶的三张牌,并可以根据其中红色牌的数量,令一名其他角色获得一种效果", + prompt2: "展示牌堆顶的三张牌,并可以根据其中红色牌的数量,令一名其他角色获得一种效果", content: function () { "step 0"; - var cards = get.cards(3); - //for(var i=cards.length-1;i--;i>=0){ - // ui.cardPile.insertBefore(cards[i],ui.cardPile.firstChild); - //} - game.updateRoundNumber(); + var cards = get.cards(3, true); event.cards = cards; - //game.cardsGotoOrdering(cards); player.showCards(cards, get.translation(player) + "发动了【星卜】"); "step 1"; var num = 0; @@ -9715,7 +9990,6 @@ game.import("character", function () { }, }, relieren: { - shaRelated: true, audio: 2, audioname: ["boss_lvbu3"], trigger: { player: "useCardToPlayered" }, @@ -11838,7 +12112,7 @@ game.import("character", function () { } 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]; @@ -13179,6 +13453,7 @@ game.import("character", function () { }, rezhengrong: { trigger: { player: "useCardAfter" }, + locked: true, direct: true, audio: "drlt_zhenrong", filter: function (event, player) { @@ -13209,7 +13484,7 @@ game.import("character", function () { 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) { @@ -13761,7 +14036,7 @@ game.import("character", function () { } } "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"); @@ -14462,12 +14737,30 @@ game.import("character", function () { "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"], @@ -14829,9 +15122,9 @@ game.import("character", function () { 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); @@ -14841,7 +15134,7 @@ game.import("character", function () { 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(); @@ -14946,7 +15239,7 @@ game.import("character", function () { animationColor: "thunder", content: function () { player.awakenSkill("remoucheng"); - player.changeSkills(["jingong", "relianji"]); + player.changeSkills(["jingong"], ["relianji"]); player.gainMaxHp(); player.recover(); }, @@ -15169,6 +15462,7 @@ game.import("character", function () { return 5; case "jiu": { if (player.countCards("hs", { type: "basic" }) >= 2) return 3; + return 0; } case "sha": if (button.link[3] == "fire") return 2.95; @@ -15303,13 +15597,14 @@ game.import("character", function () { 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, @@ -16250,6 +16545,7 @@ game.import("character", function () { return 5; case "jiu": { if (player.storage.yizan && player.countCards("hs", { type: "basic" }) > 2) return 3; + return 0; } case "sha": if (button.link[3] == "fire") return 2.95; @@ -16523,7 +16819,7 @@ game.import("character", function () { player.draw(event.num); }, ai: { - halfneg: true + neg: true, }, }, yixiang: { @@ -17583,6 +17879,7 @@ game.import("character", function () { charlotte: true, firstDo: true, popup: false, + forceLoad:true, filter: function (event, player) { return get.mode() != "guozhan" && get.is.double(player.name1) && !player._groupChosen; }, @@ -17635,9 +17932,10 @@ game.import("character", function () { } }, mbzuoyou(player) { - const mbzuoyou = player.storage.mbzuoyou; - if (mbzuoyou) return '转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。'; - return '转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。'; + const mbzuoyou = player.storage.mbzuoyou, + versus = get.mode() == "versus" && _status.mode == "two" ? "角色" : "有手牌的角色弃置一张手牌,然后其"; + if (mbzuoyou) return '转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名' + versus + "获得1点护甲。"; + return '转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张牌;阳:你可以令一名' + versus + "获得1点护甲。"; }, }, perfectPair: { @@ -17664,8 +17962,17 @@ game.import("character", function () { sunhanhua: ["dc_sunhanhua", "sunhanhua"], zhoubuyi: ["zhoubuyi", "yj_zhoubuyi"], xianglang: ["xianglang", "mb_xianglang"], - miheng: ["re_miheng", "miheng"], + 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"], + }, + characterSubstitute: { + mb_caomao: [ + ["mb_caomao_shadow", ["die_audio:mb_caomao"]], + ["mb_caomao_dead", ["die_audio:mb_caomao"]], + ], }, translate: { liuzan: "手杀留赞", @@ -17699,11 +18006,11 @@ game.import("character", function () { kuangcai: "狂才", kuangcai_info: "出牌阶段开始时,你可以令你此阶段内的主动出牌时间变为5秒。若如此做,你于此阶段内使用牌没距离和次数限制,且每当你于此阶段内使用牌时,你摸一张牌且主动出牌时间-1秒。若主动出牌时间减至0,则你结束出牌阶段。", shejian: "舌剑", - shejian_info: "弃牌阶段结束时,若你于此阶段弃置的所有牌花色均不相同,则你可以弃置一名其他角色的一张牌。", + shejian_info: "弃牌阶段结束时,若你于此阶段弃置过至少两张牌且这些牌花色均不相同,则你可以弃置一名其他角色的一张牌。", xinfu_daigong: "怠攻", xinfu_daigong_info: "每回合限一次。当你受到伤害时,你可以展示所有手牌,然后令伤害来源选择一项:交给你一张与你所有手牌花色均不相同的一张牌,或防止此伤害。", xinfu_zhaoxin: "昭心", - xinfu_zhaoxin_info: "出牌阶段限一次,你可以将任意张手牌置于武将牌上并摸等量的牌,称之为「望」(你至多拥有三张「望」)。你或你攻击范围内的一名其他角色的摸牌阶段结束后,其可以获得一张由你选择的「望」,然后你可以对其造成1点伤害。", + xinfu_zhaoxin_info: "出牌阶段限一次,你可以将任意张牌置于武将牌上并摸等量的牌,称之为「望」(你至多拥有三张「望」)。你或你攻击范围内的一名其他角色的摸牌阶段结束后,其可以获得一张由你选择的「望」,然后你可以对其造成1点伤害。", zhaoxin_give: "昭心", zhaoxin_give_info: "", xinfu_qianchong: "谦冲", @@ -17821,13 +18128,13 @@ game.import("character", function () { 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: "镇南", @@ -17881,7 +18188,7 @@ game.import("character", function () { zhaohan: "昭汉", zhaohan_info: "锁定技,你的第1-4个准备阶段开始时,你加1点体力上限并回复1点体力,你的第5-7个准备阶段开始时,你减1点体力上限。", rangjie: "让节", - rangjie_info: "当你受到1点伤害后,你可以选择一项并摸一张牌:获得牌堆里你选择的类型的一张牌,或移动场上的一张牌。", + rangjie_info: "当你受到1点伤害后,你可以选择一项并摸一张牌:获得牌堆或弃牌堆里你选择的类型的一张牌,或移动场上的一张牌。", yizheng: "义争", yizheng2: "义争", yizheng_info: "出牌阶段限一次,你可以和一名体力值不大于你的其他角色拼点。若你赢,其跳过下个摸牌阶段。若你没赢,你减1点体力上限。", @@ -17905,7 +18212,7 @@ game.import("character", function () { rehongju: "鸿举", reqingce: "清侧", reqingce_backup: "清侧", - rezhengrong_info: "当你于出牌阶段使用的指定了其他角色为目标的牌结算完成后,若此牌是你本局游戏内于出牌阶段使用的指定了其他角色为目标的第偶数张牌,则你可以将一名其他角色角色的随机一张牌置于你的武将牌上,称为「荣」。", + rezhengrong_info: "锁定技。当你于出牌阶段使用的指定了其他角色为目标的牌结算完成后,若此牌是你本局游戏内于出牌阶段使用的指定了其他角色为目标的第偶数张牌,则你将一名其他角色角色的随机一张牌置于你的武将牌上,称为「荣」。", rehongju_info: "觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3且有角色死亡,则你摸等同于「荣」数量的牌。然后可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。", reqingce_info: "出牌阶段,你可以将一张「荣」置入弃牌堆,然后弃置场上的一张牌。", re_pangtong: "手杀界庞统", @@ -17917,7 +18224,7 @@ game.import("character", function () { yangyi: "手杀杨仪", yangyi_prefix: "手杀", duoduan: "度断", - duoduan_info: "每回合限一次,当你成为【杀】的目标后,你可以重铸一张牌。若如此做,你选择一项:①令使用者摸两张牌,且此【杀】无效。②令使用弃置一张牌,且你不能响应此【杀】。", + duoduan_info: "每回合限一次,当你成为【杀】的目标后,你可以重铸一张牌。若如此做,你选择一项:①令使用者摸两张牌,且此【杀】无效。②令使用者弃置一张牌,且你不能响应此【杀】。", gongsun: "共损", gongsun_info: "出牌阶段开始时,你可以弃置两张牌并指定一名其他角色。你选择一个基本牌或普通锦囊牌的牌名。直到你的下回合开始或你死亡,你与其不能使用或打出或弃置此名称的牌。", gongsun_shadow: "共损", @@ -17926,7 +18233,7 @@ game.import("character", function () { relihuo: "疠火", relihuo_damage: "疠火", relihuo_baigei: "疠火", - relihuo_info: "当你使用普【杀】时,你可以将此杀改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)。", + relihuo_info: "当你使用普【杀】时,你可以将此【杀】改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)。", dengzhi: "手杀邓芝", dengzhi_prefix: "手杀", jimeng: "急盟", @@ -18027,8 +18334,7 @@ game.import("character", function () { requanfeng_info: "限定技。①其他角色死亡时,你可失去〖弘仪〗,然后获得其武将牌上的所有非主公技,非隐匿技和非Charlotte技,加1点体力上限并回复1点体力。②当你处于濒死状态时,你可以加2点体力上限,然后回复4点体力。", quanfeng: "劝封", quanfeng_info: "锁定技,限定技,一名角色死亡时,你选择获得其的一个技能(主公技,限定技,觉醒技,隐匿技,使命技,带有Charlotte标签的技能除外),然后加1点体力上限并回复1点体力。", - simashi: "手杀司马师", - simashi_prefix: "手杀", + simashi: "司马师", baiyi: "败移", baiyi_info: "限定技,出牌阶段,若你已受伤,你可以交换两名其他角色的座次。", jinglve: "景略", @@ -18146,7 +18452,7 @@ game.import("character", function () { zhiming: "知命", zhiming_info: "准备阶段开始时或弃牌阶段结束时,你摸一张牌,然后可以将一张牌置于牌堆顶。", xingbu: "星卜", - xingbu_info: "结束阶段,你可以亮出牌堆顶的三张牌,然后你可以根据X值(X为这三张牌中红色牌的数量),令一名其他角色获得对应的效果直到其下回合结束:①三张:其摸牌阶段多摸两张牌,使用【杀】的次数上限+1。②两张:其使用【杀】的次数上限-1,跳过弃牌阶段。③小于两张:其于准备阶段开始时弃置一张手牌。", + xingbu_info: "结束阶段,你可以展示牌堆顶的三张牌,然后你可以根据X值(X为这三张牌中红色牌的数量),令一名其他角色获得对应的效果直到其下回合结束:①三张:其摸牌阶段多摸两张牌,使用【杀】的次数上限+1。②两张:其使用【杀】的次数上限-1,跳过弃牌阶段。③小于两张:其于准备阶段开始时弃置一张手牌。", xin_sunluban: "手杀界孙鲁班", xin_sunluban_prefix: "手杀界", xinzenhui: "谮毁", @@ -18209,7 +18515,7 @@ game.import("character", function () { spqishe_info: "你可以将一张装备牌当做【酒】使用。你的手牌上限+X(X为你装备区内的牌数)。", sp_maojie: "毛玠", bingqing: "秉清", - bingqing_info: "当你于出牌阶段内使用的牌结算结束后,若你于本阶段内使用的所有已结算结束的其他牌与此牌花色均不相同,则你可根据X的值执行对应效果:为2,你令一名角色摸两张牌;为3,你弃置一名角色区域内的一张牌;为4,你对一名其他角色造成1点伤害。(X为你本阶段内使用过的已结算结束的牌中包含的花色数)", + bingqing_info: "当你于出牌阶段内使用的牌结算完毕后,若你于本阶段内此前使用的所有牌的花色与此牌花色均不相同,则你可根据X的值执行对应效果:为2,你令一名角色摸两张牌;为3,你弃置一名角色区域内的一张牌;为4,你对一名其他角色造成1点伤害。(X为你于本阶段内此前使用的所有牌包含的花色数+1)", yingfeng: "迎奉", yingfeng_info: "准备阶段,你可以令一名角色获得“奉”标记并移除场上所有其他的“奉”标记。有“奉”标记的角色使用牌没有距离限制。", xin_sunxiu: "手杀界孙休", @@ -18245,9 +18551,9 @@ game.import("character", function () { 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: "限定技。当你受到伤害值不小于体力值的伤害时,你可防止此伤害并将此伤害渠道对应的所有实体牌置于伤害来源的武将牌上,称为“释”。本回合结束时,其获得所有“释”。", @@ -18382,7 +18688,7 @@ game.import("character", function () { scsyaozhuo_info: "出牌阶段限一次。你可以与一名角色拼点,若你赢,其跳过下一个摸牌阶段;若你没赢,你弃置两张牌。", scs_hankui: "韩悝", scsxiaolu: "宵赂", - scsxiaolu_info: "出牌阶段限一次。你可以摸两张牌,然后选择一项:1.弃置两张牌;2.将两张牌交给一名其他角色。", + scsxiaolu_info: "出牌阶段限一次。你可以摸两张牌,然后选择一项:1.弃置两张手牌;2.将两张手牌交给一名其他角色。", scs_lisong: "栗嵩", scskuiji: "窥机", scskuiji_info: "出牌阶段限一次。你可以观看一名其他角色的手牌,然后弃置你与其的共计四张花色各不相同的手牌。", @@ -18454,8 +18760,7 @@ game.import("character", function () { mutao_info: "出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】置于武将牌上,然后将这些牌依次随机交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。", yimou: "毅谋", yimou_info: "当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色,然后摸一张牌。", - jiangji: "手杀蒋济", - jiangji_prefix: "手杀", + jiangji: "蒋济", jilun: "机论", jilun_info: "①当你受到伤害后,若你拥有技能〖急筹〗,则你可以一项:1.摸两张牌。2.获得1枚“机论”标记。②一名角色的结束阶段,若你拥有“机论”,则重复选择执行以下项直到你没有“机论”标记:1.失去1枚“机论”标记,视为使用一张〖急筹①〗记录过且未被〖机论②〗记录过的普通锦囊牌并记录此牌牌名。2.失去所有“机论”标记。", liwei: "李遗", @@ -18527,41 +18832,52 @@ game.import("character", function () { mbweiming_info: "使命技,锁定技。①出牌阶段开始时,你记录一名未以此法记录过的角色。②成功:当你杀死一名未被〖威命①〗记录过的角色后,修改〖血途〗为成功版本。③失败:当一名被〖威命①〗记录过的角色死亡后,你修改〖血途〗为失败版本。", lizhaojiaobo: "李昭焦伯", mbzuoyou: "佐佑", - mbzuoyou_info: "转换技。出牌阶段限一次,阴:你可以令一名角色摸两张牌,然后其弃置一张手牌;阳:你可以令一名手牌数不少于二的角色弃置两张手牌,然后其获得1点护甲。", + mbzuoyou_info: "转换技。出牌阶段限一次,阴:你可以令一名角色摸三张牌,然后其弃置两张手牌;阳:你可以令一名有手牌的角色弃置一张手牌,然后其获得1点护甲。", mbshishou: "侍守", mbshishou_info: "锁定技。当你发动〖佐佑〗后,若目标角色不为你,你执行〖佐佑〗中目标角色未执行的一项。", chengji: "成济", mbkuangli: "狂戾", - mbkuangli_info: "锁定技。①出牌阶段开始时,你随机令场上任意名其他角色获得“狂戾”标记。②出牌阶段限两次。当你使用牌指定有“狂戾”的角色为目标后,你与其各随机弃置一张牌,然后你摸一张牌。③回合结束时,你移除所有角色的“狂戾”。", + mbkuangli_info: "锁定技。①出牌阶段开始时,你随机令场上任意名其他角色获得“狂戾”标记。②出牌阶段限两次。当你使用牌指定有“狂戾”的角色为目标后,你随机弃置你与其各一张牌,然后你摸两张牌。③回合结束时,你移除所有角色的“狂戾”。", mbxiongsi: "凶肆", mbxiongsi_info: "限定技。出牌阶段,若你的手牌数不少于三张,你可以弃置所有手牌,然后令所有其他角色依次失去1点体力。", mb_sp_guanqiujian: "SP毌丘俭", mb_sp_guanqiujian_prefix: "SP", mbcuizhen: "摧阵", - mbcuizhen_info_identity: "①游戏开始时,你可以废除至多两名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。", - mbcuizhen_info: "①当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。②摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和,至多为2)。", + mbcuizhen_info: "①游戏开始时,你可以废除至多两名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和+2,至多为4)。", + mbcuizhen_info_identity: "①游戏开始时,你可以废除至多三名其他角色的武器栏。②当你于出牌阶段使用伤害类牌指定其他角色为目标后,若目标角色的手牌数不小于体力值,你可以废除其武器栏。③摸牌阶段,你令额定摸牌数+X(X为所有角色被废除的武器栏数之和+1,至多为4)。", mbkuili: "溃离", - mbkuili_info: "锁定技。当你受到伤害后,你弃置等同于伤害值的手牌;若来源有被废除的武器栏,你令其恢复武器栏。", + 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: "①当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。②当你受到伤害后,若你的武将牌背面向上,你可以翻面。③当你翻面后,你获得牌堆里的一张锦囊牌。", + 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: "已分配", mobile_standard: "手杀异构·标准包", mobile_shenhua_feng: "手杀异构·其疾如风", diff --git a/character/offline.js b/character/offline.js index 642ba3ab..35fde2f2 100644 --- a/character/offline.js +++ b/character/offline.js @@ -45,7 +45,7 @@ game.import("character", function () { "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", @@ -76,7 +76,8 @@ game.import("character", function () { }, }, character: { - yj_ehuan: ["male", "qun", 4, ["psdiwan", "pssuiluan", "psconghan"], ["doublegroup:shu:qun"]], + 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"]], drag_guanyu: ["male", "shu", 4, ["dragchaojue", "dragjunshen"]], drag_caoren: ["male", "wei", 4, ["draglizhong", "dragjuesui"]], @@ -222,6 +223,166 @@ game.import("character", function () { characterFilter: {}, skill: { //线下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" }, @@ -334,7 +495,7 @@ game.import("character", function () { let cards = []; if (event.name == "cardsDiscard") { const evt = event.getParent().relatedEvent; - if (evt && evt.name == "judge" && evt.player == player) { + if (evt && evt.name == "judge" && evt.player != player) { cards.addArray(event.cards.filter(i => get.position(i, true) == "d")); } } else { @@ -453,7 +614,7 @@ game.import("character", function () { puts++; const card = result.links[0]; target.$throw([card], 1000); - if (get.owner(card)) await get.owner(card).lose([card], ui.special); + if (get.owner(card)) await get.owner(card).lose([card], ui.cardPile); else ui.discardPile.removeChild(card); ui.cardPile.insertBefore(card, ui.cardPile.firstChild); game.updateRoundNumber(); @@ -588,8 +749,7 @@ game.import("character", function () { 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: "绝", @@ -1109,7 +1269,6 @@ game.import("character", function () { audio: 1, trigger: { global: "useCard" }, direct: true, - shaRelated: true, filter: function (event, player) { return ( event.player != player && @@ -1123,9 +1282,6 @@ game.import("character", function () { var go = false, d1 = false; if (get.attitude(player, trigger.player) > 0) { - d1 = true; - if (trigger.player.hasSkill("jueqing") || trigger.player.hasSkill("gangzhi")) - d1 = false; for (var target of trigger.targets) { if ( !target.mayHaveShan( @@ -1145,15 +1301,17 @@ game.import("character", function () { true ) ) { - if (!target.hasSkill("gangzhi")) d1 = false; if ( - target.hasSkillTag("filterDamage", null, { + get.attitude(player, target) < 0 && + !trigger.player.hasSkillTag("jueqing", false, target) && + !target.hasSkillTag("filterDamage", null, { player: trigger.player, card: trigger.card, - }) || - get.attitude(player, target) >= 0 - ) - d1 = false; + }) + ) { + d1 = true; + break; + } } } if (trigger.addCount === false || !trigger.player.isPhaseUsing()) go = false; @@ -3084,6 +3242,9 @@ game.import("character", function () { }, }, }, + ai: { + combo: "psliaozou" + }, }, psquwu: { audio: 2, @@ -5122,65 +5283,46 @@ game.import("character", function () { intro: { content: "limited", }, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("yjyongdi"), function (card, player, target) { - return target.hasSex("male") || target.name == "key_yuri"; - }) - .set("ai", function (target) { + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt2("yjyongdi"), + (card, player, target) => { + return target.hasSex("male") || target.name == "key_yuri"; + } + ) + .set("ai", target => { if (!_status.event.goon) return 0; var player = _status.event.player; var att = get.attitude(player, target); if (att <= 1) return 0; var mode = get.mode(); if (mode == "identity" || (mode == "versus" && _status.mode == "four")) { - if (target.name && lib.character[target.name]) { - for (var i = 0; i < lib.character[target.name][3].length; i++) { - if (lib.skill[lib.character[target.name][3][i]].zhuSkill) { - return att * 2; - } - } - } + if (target.getStockSkills(true, true).some(i => { + if (target.hasSkill(i)) return false; + let info = get.info(i); + return info && info.zhuSkill; + })) return att * 2; } return att; }) - .set("goon", !player.hasUnknown()); - "step 1"; - if (result.bool) { - player.awakenSkill("yjyongdi"); - player.logSkill("yjyongdi", result.targets); - var target = result.targets[0]; - target.gainMaxHp(true); - target.recover(); - var mode = get.mode(); - if ( - mode == "identity" || - (mode == "versus" && _status.mode == "four") || - mode == "doudizhu" - ) { - if (target.name && lib.character[target.name]) { - var skills = lib.character[target.name][3]; - target.storage.zhuSkill_yjyongdi = []; - for (var i = 0; i < skills.length; i++) { - var info = lib.skill[skills[i]]; - if (info.zhuSkill) { - target.storage.zhuSkill_yjyongdi.push(skills[i]); - if (info.init) { - info.init(target); - } - if (info.init2) { - info.init2(target); - } - } - } - } - } - } + .set("goon", !player.hasUnknown()) + .forResult(); }, - ai: { - expose: 0.2, + async content(event, trigger, player) { + player.awakenSkill("yjyongdi"); + let target = event.targets[0], mode = get.mode(); + if (player !== target && (mode !== "identity" || player.identity !== "nei")) player.addExpose(0.3); + target.gainMaxHp(true); + target.recover(); + if (mode == "identity" || (mode == "versus" && _status.mode == "four") || mode == "doudizhu") { + let skills = target.getStockSkills(true, true).filter(i => { + if (target.hasSkill(i)) return false; + let info = get.info(i); + return info && info.zhuSkill; + }); + if (skills.length) target.addSkills(skills); + } }, }, //用间篇豪华版盒子许攸 @@ -5283,18 +5425,12 @@ game.import("character", function () { 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, @@ -5361,12 +5497,18 @@ game.import("character", function () { .set("targetprompt", ["打人", "被打"]) .set("complexSelect", true) .set("ai", (target) => { + if (!get.event("check")) return -1; var player = _status.event.player; if (!ui.selected.targets.length) return get.effect(target, { name: "guohe_copy2" }, player, player); var targetx = ui.selected.targets[0]; return get.effect(target, { name: "sha" }, targetx, player) + 5; - }); + }).set("check", function(){ + if (player.maxHp < 2) return false; + if (player.hasSkill("yjshicha") && !player.hasHistory("useSkill", evt => evt.skill == "yjtuicheng")) return true; + if (player.maxHp > 2 && player.getDamagedHp() > 1) return true; + return false; + }()); "step 1"; if (result.bool) { var targets = result.targets; @@ -5856,6 +5998,9 @@ game.import("character", function () { player.gift(result.cards, target); } }, + ai: { + combo: "yixiandao" + }, }, yjyibing: { trigger: { @@ -6510,7 +6655,7 @@ game.import("character", function () { if (event.lose && event.lose.loseHp) player.draw(); }, ai: { - halfneg: true, + neg: true, filterDamage: true, skillTagFilter: function (player, tag, arg) { if (tag === "filterDamage" && arg && arg.player) { @@ -9259,6 +9404,19 @@ game.import("character", function () { 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点伤害。", offline_star: "桌游志·SP", offline_sticker: "桌游志·贴纸", diff --git a/character/old.js b/character/old.js index aaf9d071..341dcdbc 100644 --- a/character/old.js +++ b/character/old.js @@ -70,9 +70,9 @@ game.import("character", function () { old_chendao: ["male", "shu", 4, ["drlt_wanglie"]], old_liyan: ["male", "shu", 3, ["duliang", "fulin"]], old_guanzhang: ["male", "shu", 4, ["old_fuhun"]], - new_caoren: ["male", "wei", 4, ["moon_jushou", "jiewei"]], + new_caoren: ["male", "wei", 4, ["moon_jushou", "jiewei"], ["die_audio:caoren"]], huangzhong: ["male", "shu", 4, ["liegong"]], - junk_sunquan: ["male", "shen", 4, ["dili", "yuheng"], ["wei"]], + junk_sunquan: ["male", "shen", 4, ["dili", "yuheng"], ["wei", "die_audio:shen_sunquan"]], old_dingfeng: ["male", "wu", 4, ["fenxun", "duanbing"]], old_huanghao: ["male", "shu", 3, ["oldqinqing", "oldhuisheng"]], oldre_liubiao: ["male", "qun", 3, ["zishou", "zongshi"]], @@ -112,7 +112,7 @@ game.import("character", function () { masu: ["male", "shu", 3, ["xinzhan", "huilei"]], xushu: ["male", "shu", 3, ["xswuyan", "jujian"], ["border:wei"]], liru: ["male", "qun", 3, ["juece", "mieji", "fencheng"]], - xin_yujin: ["male", "wei", 4, ["jieyue"]], + xin_yujin: ["male", "wei", 4, ["jieyue"], ["die_audio:yujin"]], //lusu:['male','wu',3,['haoshi','dimeng']], //yuanshao:['male','qun',4,['luanji','xueyi'],['zhu']], old_zhonghui: ["male", "wei", 3, ["zzhenggong", "zquanji", "zbaijiang"], ["clan:颍川钟氏"]], @@ -132,7 +132,7 @@ game.import("character", function () { old_guanqiujian: ["male", "wei", 4, ["drlt_zhenrong", "drlt_hongju"], []], old_wanglang: ["male", "wei", 3, ["gushe", "jici"]], old_wangyi: ["female", "wei", 3, ["oldzhenlie", "oldmiji"]], - re_yujin: ["male", "wei", 4, ["yizhong"]], + re_yujin: ["male", "wei", 4, ["yizhong"], ["die_audio:yujin"]], }, skill: { //山包初版神赵 diff --git a/character/onlyOL.js b/character/onlyOL.js index b2248e64..bec900e0 100644 --- a/character/onlyOL.js +++ b/character/onlyOL.js @@ -39,14 +39,19 @@ game.import("character", function () { ["tempname:xin_chengpu", "die_audio: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_audio:ol_sb_pangtong:ol_sb_pangtong2:ol_sb_pangtong3"]], ol_fazheng: ["male", "shu", 3, ["olxuanhuo", "olenyuan"]], + ol_caifuren: ["female", "qun", 3, ["olqieting", "xianzhou"]], + ol_liru: ["male", "qun", 3, ["xinjuece", "olmieji", "dcfencheng"]], + ol_liubiao: ["male", "qun", 3, ["olzishou", "olzongshi"]], + ol_wuguotai: ["female", "wu", 3, ["olganlu", "olbuyi"]], }, characterSort: { onlyOL: { - onlyOL_yijiang1: ["ol_jianyong", "ol_lingtong", "ol_gaoshun", "ol_fazheng"], - onlyOL_yijiang2: ["ol_caozhang", "ol_chengpu", "ol_wangyi"], - onlyOL_yijiang3: ["ol_yufan"], + 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"], }, }, @@ -76,9 +81,277 @@ game.import("character", function () { }, }, skill: { + //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, + inherit: "xinmieji", + filter(event, player) { + return player.countCards("h", { type: ["trick", "delay"] }); + }, + filterCard(card) { + return get.type2(card) == "trick"; + }, + async content(event, trigger, player) { + const target = event.target; + 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") && + target.countCards("he", function (card) { + return get.type(card, "trick") != "trick"; + }) + ) { + await target + .chooseToDiscard("he", true, function (card) { + return get.type(card, "trick") != "trick"; + }) + .set("prompt", "请弃置第二张非锦囊牌"); + } + const cards = game + .getGlobalHistory("everything", evt => { + return evt.name == "lose" && evt.getParent(3) == event; + }) + .reduce((list, evt) => { + return list.add(evt.cards[0]); + }, []) + .filterInD("d"); + if (cards.some(card => player.hasUseTarget(card, true, false))) { + const result = await player + .chooseButton(["灭计:是否使用其中的一张牌?", cards]) + .set("filterButton", button => { + return get.event().player.hasUseTarget(button.link, true, false); + }) + .set("ai", button => { + return get.event().player.getUseValue(button.link); + }) + .forResult(); + if (result.bool) { + const card = result.links[0]; + player.$gain2(card, false); + await game.asyncDelayx(); + await player.chooseUseTarget(true, card, false); + } + } + }, + }, + //OL界蔡夫人 + olqieting: { + audio: 2, + trigger: { + global: "phaseEnd", + }, + filter(event, player) { + const target = event.player; + if (target == player || !target.isIn()) return false; + return !target.hasHistory("useCard", evt => evt.targets && evt.targets.some(i => i != target)) || !target.hasHistory("sourceDamage", evt => evt.player != target); + }, + async cost(event, trigger, player) { + const target = trigger.player; + let num = 0; + if (!target.hasHistory("useCard", evt => evt.targets && evt.targets.some(i => i != target))) num++; + if (!target.hasHistory("sourceDamage", evt => evt.player != target)) num++; + const next = player.chooseButton([ + "窃听:请选择" + (num > 1 ? "一至两" : "一") + "项", + [ + [ + ["move", "将" + get.translation(target) + "装备区的一张牌置于你的装备区"], + ["draw", "摸一张牌"], + ], + "textbutton", + ], + ]); + next.set("selectButton", [1, num]); + next.set("filterButton", button => { + if ( + button.link == "move" && + !get + .event() + .getTrigger() + .player.countCards("e", card => { + return player.canEquip(card); + }) + ) + return false; + return true; + }); + next.set("ai", button => { + const target = get.event().getTrigger().player, + val = target.hasSkillTag("noe") ? 6 : 0; + if ( + button.link == "move" && + (get.attitude(player, target) > 0 || + !target.countCards("e", function (card) { + return player.canEquip(card) && get.value(card, target) > val && get.effect(player, card, player, player) > 0; + })) + ) + return 0; + return 1; + }); + const { + result: { bool, links }, + } = await next; + event.result = { + bool: bool, + cost_data: links, + }; + }, + logTarget: "player", + async content(event, trigger, player) { + const target = trigger.player, + choices = event.cost_data; + if (choices.includes("move")) { + const cards = await player + .choosePlayerCard(target, "e", true) + .set("filterButton", button => { + return get.player().canEquip(button.link); + }) + .set("ai", button => { + const player = get.player(); + return get.effect(player, button.link, player, player); + }) + .forResultCards(); + const card = cards[0]; + target.$give(card, player, false); + await game.asyncDelay(0.5); + await player.equip(card); + } + if (choices.includes("draw")) await player.draw(); + }, + }, //谋庞统 olsbhongtu: { - audio: 2, + audio: 6, trigger: { global: ["phaseZhunbeiEnd", "phaseJudgeEnd", "phaseDrawEnd", "phaseUseEnd", "phaseDiscardEnd", "phaseJieshuEnd"], }, @@ -230,38 +503,35 @@ game.import("character", function () { }) ) { 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: { @@ -275,14 +545,23 @@ game.import("character", function () { 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", }, @@ -458,10 +737,7 @@ game.import("character", function () { if (goon && player.isDamaged()) result = await player .chooseControl() - .set("choiceList", [ - "获得" + get.translation(target) + "的一张牌", - "发动一次〖秘计〗", - ]) + .set("choiceList", ["获得" + get.translation(target) + "的一张牌", "于本回合的结束阶段发动一次〖秘计〗"]) .set("ai", () => { const player = get.event("player"), target = get.event().getTrigger().player; @@ -476,16 +752,35 @@ game.import("character", function () { if (result.index == 0) { await player.gainPlayerCard(target, "he", true); } else { - await player.useSkill("olmiji"); + player.addTempSkill("olzhenlie_effect"); + player.addMark("olzhenlie_effect", 1, false); } } }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + 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: { player: "phaseJieshuBegin" }, filter(event, player) { - return player.isDamaged(); + if (player.isHealthy()) return false; + return true; }, async content(event, trigger, player) { let num = player.getDamagedHp(); @@ -951,7 +1246,7 @@ game.import("character", function () { (i, j) => i + get.effect(j, trigger.card, trigger.player, player), 0 ); - return get.sgn(att) * (eff * 2 - sum); + return eff * 2 - sum; }, }) .set( @@ -965,7 +1260,7 @@ game.import("character", function () { 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 @@ -1060,7 +1355,7 @@ game.import("character", function () { true ) ) { - if (player.hasSkill("jueqing") || target.hasSkill("gangzhi")) extra_num--; + if (player.hasSkillTag("jueqing", false, target)) extra_num--; else if ( target.hasSkillTag("filterDamage", null, { player: event.player, @@ -1079,7 +1374,7 @@ game.import("character", function () { ); }, 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) => { @@ -1275,7 +1570,6 @@ game.import("character", function () { } } }, - ai: { combo: "olsbyufeng" }, }, //界高顺 olxianzhen: { @@ -1319,7 +1613,7 @@ game.import("character", function () { 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]; @@ -1330,7 +1624,7 @@ game.import("character", function () { .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"), @@ -1351,9 +1645,12 @@ game.import("character", function () { }, effect: { player(card, player, target, current, isLink) { - if (isLink || !target) return; + 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]; } } @@ -2100,8 +2397,10 @@ game.import("character", function () { }, kunfenx: { audio: "kunfen", - audioname: ["ol_sb_jiangwei"], + audioname2: { ol_sb_jiangwei: "kunfen_ol_sb_jiangwei" }, }, + kunfen_ol_sb_jiangwei: { audio: 1 }, + zhaxiang_ol_sb_jiangwei: { audio: 1 }, //界曹彰 oljiangchi: { audio: "rejiangchi", @@ -2330,8 +2629,7 @@ game.import("character", function () { ol_sb_yuanshao: "OL谋袁绍", ol_sb_yuanshao_prefix: "OL谋", olsbhetao: "合讨", - olsbhetao_info: - "其他角色使用牌执行第一个目标后,若此牌指定的目标数大于1,则你可以弃置一张与此牌颜色相同的牌并令此牌改为对其中一名目标角色结算两次。", + olsbhetao_info: "其他角色使用牌指定第一个目标后,若此牌指定的目标数大于1,则你可以弃置一张与此牌颜色相同的牌并令此牌改为对其中一名目标角色结算两次。", olsbshenli: "神离", olsbshenli_info: "出牌阶段限一次,当你使用【杀】指定目标后,你可以令所有可成为此牌目标的其他角色均成为此牌目标,此牌结算完毕后,若你因此牌造成的伤害值X:大于你的手牌数,你摸X张牌(至多摸五张);大于你的体力值,你再次对所有目标角色中可以成为此牌目标的角色使用此牌。", @@ -2365,8 +2663,8 @@ game.import("character", function () { ol_wangyi: "OL界王异", ol_wangyi_prefix: "OL界", olzhenlie: "贞烈", - olzhenlie_info: - "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后你选择一项:①获得使用者的一张牌;②发动一次〖秘计〗。", + olzhenlie_info: "当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后你选择一项:①获得使用者的一张牌;②于本回合的结束阶段发动一次〖秘计〗。", + olzhenlie_effect: "秘计", olmiji: "秘计", olmiji_info: "结束阶段,若你已受伤,则你可以摸X张牌,然后你可以将至多X张牌任意分配给其他角色(X为你已损失的体力值)。", @@ -2376,18 +2674,39 @@ game.import("character", function () { olsbhongtu_info: "一名角色的阶段结束时,若你于此阶段得到过至少两张牌,你可以摸三张牌,展示三张手牌,令一名其他角色选择是否使用其中一张牌并令你随机弃置其中另一张牌。若使用牌的点数于三张牌中满足以下条件,其获得如下技能或效果直到其下一个回合的回合结束:唯一最大,其获得〖飞军〗;不为唯一最大且不为唯一最小,其获得〖潜袭〗;唯一最小,其手牌上限+2。若其未以此法使用牌,你对其与你各造成1点火焰伤害。", olsbqiwu: "栖梧", olsbqiwu_info: "当你每回合首次受到伤害时,若伤害来源为你或在你的攻击范围内,你可以弃置一张红色牌,防止此伤害。", - ol_fazheng:'OL界法正', - ol_fazheng_prefix:'OL界', - olxuanhuo:'眩惑', - olxuanhuo_info:'摸牌阶段结束时,你可以交给一名其他角色两张牌,然后其选择一项:1.视为对你选择的另一名其他角色使用一张【杀】,2.令你观看并获得其两张牌。', - olenyuan:'恩怨', - olenyuan1:'恩怨', - olenyuan2:'恩怨', - olxuanhuo_info:'摸牌阶段结束时,你可以交给一名其他角色两张牌,然后其选择一项:1.对你选择的另一名其他角色使用一张【杀】,2.令你观看并获得其两张牌。', + ol_fazheng: "OL界法正", + ol_fazheng_prefix: "OL界", + olxuanhuo: "眩惑", + olxuanhuo_info: "摸牌阶段结束时,你可以交给一名其他角色两张牌,然后其选择一项:1.对你选择的另一名其他角色使用一张【杀】,2.令你观看并获得其两张牌。", + olenyuan: "恩怨", + olenyuan1: "恩怨", + olenyuan2: "恩怨", + olenyuan_info: "①当你一次性获得一名其他角色超过一张牌后,你可以令其摸一张牌。②当你受到1点伤害后,你可以令伤害来源选择一项:1.将一张红色手牌交给你;2.失去1点体力。", + ol_caifuren: "OL界蔡夫人", + ol_caifuren_prefix: "OL界", + olqieting: "窃听", + olqieting_info: "其他角色的回合结束后,你可以选择X项:1.将其装备区的一张牌置入你的装备区;2.摸一张牌(X为以下条件中其本回合满足的项数:未对其他角色造成伤害、未对其他角色使用过牌)。", + ol_liru: "OL界李儒", + 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点体力。", onlyOL_yijiang1: "OL专属·将1", onlyOL_yijiang2: "OL专属·将2", onlyOL_yijiang3: "OL专属·将3", + onlyOL_yijiang4: "OL专属·将4", onlyOL_sb: "OL专属·上兵伐谋", }, }; diff --git a/character/ow.js b/character/ow.js index c84ae460..cd0461f5 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 37865c32..250f4cbe 100644 --- a/character/rank.js +++ b/character/rank.js @@ -139,6 +139,7 @@ window.noname_character_rank = { "dc_simashi", "dc_sb_simayi", "dc_sb_jiaxu", + "dc_sb_zhangxiu", "caofang", "dc_shen_huatuo", "sp_zhenji", @@ -147,6 +148,9 @@ window.noname_character_rank = { "guanyue", "wupu", "xukun", + "ol_feiyi", + "ol_jiangwan", + "bianyue", ], a: [ "star_caoren", @@ -285,6 +289,9 @@ window.noname_character_rank = { "zhangqiying", "wangyuanji", "miheng", + "yue_miheng", + "chezhou", + "zhupeilan", "re_guojia", "re_sunquan", "re_zhangjiao", @@ -388,9 +395,20 @@ 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", ], am: [ "tw_yanliang", @@ -712,6 +730,8 @@ window.noname_character_rank = { "jsrg_yuanshao", "sb_handang", "sb_gongsunzan", + "yue_zoushi", + "xin_simayi", ], bp: [ "ol_peixiu", @@ -867,6 +887,7 @@ window.noname_character_rank = { "re_liubiao", "xin_liubiao", "re_liru", + "ol_liru", "re_manchong", "re_jianyong", "re_yufan", @@ -965,6 +986,7 @@ window.noname_character_rank = { "liqueguosi", "re_chendeng", "wuyan", + "mawan", "wangyue", "xin_sunxiu", "sp_maojie", @@ -1061,6 +1083,8 @@ window.noname_character_rank = { "xiaoyuehankehan", "zhutiexiong", "shen_dengai", + "quyuan", + "xin_sunquan", "libai", "tw_gongsunfan", "yue_caiwenji", @@ -1092,7 +1116,7 @@ window.noname_character_rank = { "xin_zhangliang", "liwei", "xin_wuban", - "ol_liuyan", + "junk_liuyan", "sunhuan", "yue_caiyong", "sb_huangyueying", @@ -1132,8 +1156,24 @@ window.noname_character_rank = { "std_feiyi", "tw_zhugejun", "mb_simafu", + "huan_weiyan", + "huan_simayi", + "huan_zhaoyun", + "huan_guojia", + "huan_jiangwei", + "budugen", + "jsrg_dongbai", + "yj_zhonghui", + "wuhujiang", + "dc_noname", ], b: [ + "huan_zhugeliang", + "huan_zhanghe", + "star_zhangzhao", + "dc_sp_zhurong", + "hansong", + "yue_zhugeguo", "std_dc_yanghu", "std_re_dengzhi", "std_mateng", @@ -1461,6 +1501,7 @@ window.noname_character_rank = { "yj_simafu", "dc_wuyi", "jsrg_caojiewangfu", + "ol_wuguotai", ], bm: [ "kongrong", @@ -1771,6 +1812,7 @@ window.noname_character_rank = { ], rarity: { legend: [ + "ol_feiyi", "dc_wuyi", "sp_sunce", "star_caoren", @@ -1924,6 +1966,8 @@ window.noname_character_rank = { "tw_shen_lvmeng", "zhangjinyun", "sunwukong", + "quyuan", + "xin_sunquan", "libai", "old_lingju", "wu_zhugeliang", @@ -1971,6 +2015,14 @@ window.noname_character_rank = { "jsrg_yuanshao", ], epic: [ + "wuhujiang", + "yj_zhonghui", + "bianyue", + "budugen", + "huan_guojia", + "huan_simayi", + "dc_sb_zhangxiu", + "ol_jiangwan", "xukun", "clan_zhongyao", "dc_caoshuang", @@ -2261,11 +2313,29 @@ window.noname_character_rank = { "drag_caoren", "wupu", "star_sunjian", + "star_sunshangxiang", "jsrg_zhangjiao", "ol_sb_pangtong", "dc_sb_zhugejin", + "yue_miheng", + "hansong", + "star_zhangzhao", + "dc_sp_zhurong", + "xin_simayi", + "mb_wangjing", + "zhangbu", ], rare: [ + "dc_noname", + "ol_liubiao", + "huan_weiyan", + "ol_caifuren", + "dc_sb_caoang", + "dc_sb_dianwei", + "dc_sb_guanping", + "yue_zhugeguo", + "yue_zoushi", + "chezhou", "std_sunhao", "std_chengpu", "std_mayunlu", @@ -2532,6 +2602,7 @@ window.noname_character_rank = { "re_manchong", "re_yufan", "re_liru", + "ol_liru", "re_jianyong", "re_sunluban", "re_sunxiu", @@ -2648,6 +2719,7 @@ window.noname_character_rank = { "re_chendeng", "xin_sunxiu", "wuyan", + "mawan", "sp_maojie", "sp_zhujun", "ol_chendeng", @@ -2785,6 +2857,14 @@ window.noname_character_rank = { "mb_simafu", "sb_handang", "sb_gongsunzan", + "matie", + "huan_weiyan", + "huan_zhaoyun", + "huan_jiangwei", + "huan_zhugeliang", + "ol_wuguotai", + "mp_liuling", + "mp_wangrong", ], junk: [ "ol_peixiu", @@ -2838,6 +2918,8 @@ window.noname_character_rank = { "junk_xuyou", "re_zhongyao", "junk_zhangjiao", + "zhupeilan", + "jsrg_dongbai", ], }, }; diff --git a/character/refresh.js b/character/refresh.js index 58c2e2e1..7543f180 100644 --- a/character/refresh.js +++ b/character/refresh.js @@ -226,7 +226,7 @@ game.import("character", function () { re_masu: ["male", "shu", 3, ["resanyao", "rezhiman"]], re_sunluban: ["female", "wu", 3, ["rechanhui", "rejiaojin"]], xin_handang: ["male", "wu", 4, ["xingongji", "xinjiefan"]], - yujin_yujin: ["male", "wei", 4, ["decadezhenjun"]], + yujin_yujin: ["male", "wei", 4, ["decadezhenjun"], ["die_audio:xin_yujin"]], re_caozhang: ["male", "wei", 4, ["xinjiangchi"]], re_chengpu: ["male", "wu", 4, ["ollihuo", "rechunlao"]], re_quancong: ["male", "wu", 4, ["xinyaoming"]], @@ -697,7 +697,6 @@ game.import("character", function () { } return bool; }, - ai: { combo: "rejijun" }, }, //界司马朗 requji: { @@ -1663,7 +1662,7 @@ game.import("character", function () { //OL界火诸葛 olhuoji: { audio: "rehuoji", - audioname: ["ol_sp_zhugeliang"], + audioname: ["ol_sp_zhugeliang", "ol_pangtong"], trigger: { player: "huogongBegin" }, forced: true, locked: false, @@ -2168,10 +2167,12 @@ game.import("character", function () { return target.countCards("he") > 0 && target != player; }) .set("ai", (target) => { - var player = _status.event.player; - if (_status.event.goon) - return get.attitude(player, target) * Math.sqrt(target.countCards("he")); - return (-get.attitude(player, target) / (target.countCards("he") + 1)) * 10; + var player = _status.event.player, att = get.attitude(player, target); + if (_status.event.goon) { + if (att > 0) return att * Math.sqrt(target.countCards("he")); + return (1 - att) / (target.countCards("he") + 1); + } + return -10 * att / (target.countCards("he") + 1); }) .set("goon", player.countCards("hs", (card) => player.hasValueTarget(card)) >= 2); "step 1"; @@ -2204,6 +2205,14 @@ game.import("character", function () { }, subSkill: { effect: { + mod: { + aiOrder(player, card, num) { + if (num <= 0 || !player.getExpansions("rekuangbi_effect").length) return; + let suit = get.suit(card); + if (player.getExpansions("rekuangbi_effect").some(i => get.suit(i) == suit)) return num + 10; + return num / 4; + } + }, trigger: { player: "useCard" }, charlotte: true, forced: true, @@ -2791,6 +2800,7 @@ game.import("character", function () { skillAnimation: "epic", animationColor: "fire", audio: 2, + audioname: ["ol_liru"], enable: "phaseUse", filterTarget: function (card, player, target) { return player != target; @@ -2898,7 +2908,7 @@ game.import("character", function () { }, check: function (event, player) { if (player.hasJudge("lebu") || player.hasJudge("bingliang")) return true; - if (player.getHistory("skipped").length > 0) return false; + if (!player.hasSkill("repingkou") || player.getHistory("skipped").length > 0) return false; return game.hasPlayer(function (current) { return ( get.attitude(player, current) < 0 && @@ -2920,6 +2930,7 @@ game.import("character", function () { return player.isMaxHp(); }, check: function (event, player) { + if (!player.hasSkill("repingkou")) return false; if (!player.needsToDiscard() || (player.countCards("e") && player.isMaxEquip())) return true; if (player.getHistory("skipped").length > 0) return false; @@ -2948,9 +2959,6 @@ game.import("character", function () { }, }, }, - ai: { - combo: "repingkou", - }, }, repingkou: { audio: 2, @@ -3021,7 +3029,6 @@ game.import("character", function () { } }, ai: { - combo: "fenli", effect: { target: function (card) { if (card.name == "lebu" || card.name == "bingliang") return 0.5; @@ -3897,7 +3904,7 @@ game.import("character", function () { threaten: 0.9, effect: { target: function (card, player, target) { - if (player.hasSkillTag("jueqing")) return; + if (player.hasSkillTag("jueqing", false, target)) return; if (target.hujia) return; if (player._shibei_tmp) return; if (target.hasSkill("shibei_ai")) return; @@ -6441,7 +6448,7 @@ game.import("character", function () { rewansha: { audio: "wansha", audioname: ["re_jiaxu", "boss_lvbu3"], - audioname2: { shen_simayi: "jilue_wansha" }, + audioname2: { shen_simayi: "jilue_wansha", xin_simayi: "jilue_wansha" }, global: "rewansha_global", trigger: { global: "dyingBegin" }, forced: true, @@ -6673,18 +6680,12 @@ game.import("character", function () { 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); }) @@ -6700,10 +6701,7 @@ game.import("character", function () { }; } else { event.result = await player - .chooseBool( - get.prompt("rebingyi"), - `展示所有手牌${selfDraw ? "" : ",然后你摸一张牌"}` - ) + .chooseBool(get.prompt("rebingyi"), `展示所有手牌${selfDraw ? ",然后你摸一张牌" : ""}`) .set("choice", selfDraw) .set("ai", () => get.event().choice) .forResult(); @@ -7126,7 +7124,6 @@ game.import("character", function () { //界关平 relongyin: { audio: 2, - shaRelated: true, init: (player) => { game.addGlobalSkill("relongyin_order"); }, @@ -10217,7 +10214,6 @@ game.import("character", function () { }, }, decadepojun: { - shaRelated: true, audio: 2, trigger: { player: "useCardToPlayered" }, direct: true, @@ -10452,7 +10448,6 @@ game.import("character", function () { }, }, rejianchu: { - shaRelated: true, audio: 2, audioname: ["re_pangde"], trigger: { player: "useCardToPlayered" }, @@ -11447,6 +11442,9 @@ game.import("character", function () { player.recover(); player.draw(); }, + ai: { + combo: "rejiushi" + }, }, rejiushi: { audio: 2, @@ -12153,7 +12151,6 @@ game.import("character", function () { }, }, repojun: { - shaRelated: true, audio: 2, trigger: { player: "useCardToPlayered" }, direct: true, @@ -12885,7 +12882,7 @@ game.import("character", function () { function (player, character, old) { player.tempname.remove(old); player.tempname.add(character); - player.sex = lib.character[event.card][0]; + player.sex = lib.character[character][0]; }, player, event.card, @@ -12967,7 +12964,7 @@ game.import("character", function () { ) continue; let skills = lib.character[name][3].filter((skill) => { - const categories = get.skillCategoriesOf(skill); + const categories = get.skillCategoriesOf(skill, player); return !categories.some((type) => lib.skill.rehuashen.bannedType.includes(type)); }); if (skills.length) { @@ -13021,7 +13018,7 @@ game.import("character", function () { node = ui.create.buttonPresets.character(item, "character", position, noclick); const info = lib.character[item]; const skills = info[3].filter(function (skill) { - const categories = get.skillCategoriesOf(skill); + const categories = get.skillCategoriesOf(skill, get.player()); return !categories.some((type) => lib.skill.rehuashen.bannedType.includes(type)); }); if (skills.length) { @@ -14281,6 +14278,7 @@ game.import("character", function () { }, new_retuxi: { audio: "retuxi", + audioname2: { gz_jun_caocao: "jianan_tuxi" }, trigger: { player: "phaseDrawBegin2", }, @@ -14540,6 +14538,7 @@ game.import("character", function () { dc_guansuo: "wusheng_guansuo", guanzhang: "wusheng_guanzhang", guansuo: "wusheng_guansuo", + gz_jun_liubei: "shouyue_wusheng" }, enable: ["chooseToRespond", "chooseToUse"], filterCard: function (card, player) { @@ -14924,13 +14923,8 @@ game.import("character", function () { ai: { effect: { target: (card, player, target) => { - if ( - typeof card !== "object" || - !get.tag(card, "damage") || - target.hasSkill("gangzhi") - ) - return; - if (player.hasSkillTag("jueqing", null, true)) return; + if (typeof card !== "object" || !get.tag(card, "damage")) return; + if (player.hasSkillTag("jueqing", false, target)) return; if (get.color(card) === "red") return [1, 0, 1, 0.6]; return [1, 0.6]; }, @@ -15276,7 +15270,7 @@ game.import("character", function () { }, 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") @@ -15382,7 +15376,7 @@ game.import("character", function () { }, rejizhi: { audio: 2, - audioname: ["lukang"], + audioname2: { lukang: "rejizhi_lukang", xin_simayi: "jilue_jizhi" }, locked: false, trigger: { player: "useCard" }, frequent: true, @@ -15791,6 +15785,7 @@ game.import("character", function () { }, reguicai: { audio: 2, + audioname2: { xin_simayi: "jilue_guicai" }, trigger: { global: "judge" }, direct: true, filter: function (event, player) { @@ -16088,7 +16083,8 @@ game.import("character", function () { audioname2: { re_sunyi: "reyingzi_re_sunyi", heqi: "reyingzi_heqi", - re_heqi: "reyingzi_heqi" + re_heqi: "reyingzi_heqi", + boss_sunce: "reyingzi_sunce" }, trigger: { player: "phaseDrawBegin2" }, forced: true, @@ -16691,7 +16687,6 @@ game.import("character", function () { }, }, retieji: { - shaRelated: true, audio: 2, audioname: ["boss_lvbu3"], trigger: { player: "useCardToPlayered" }, @@ -16743,14 +16738,7 @@ game.import("character", function () { } if (!arg || arg.isLink || !arg.card || arg.card.name != "sha") return false; if (!arg.target || get.attitude(player, arg.target) >= 0) return false; - if ( - !arg.skill || - !lib.skill[arg.skill] || - lib.skill[arg.skill].charlotte || - get.is.locked(arg.skill) || - !arg.target.getSkills(true, false).includes(arg.skill) - ) - return false; + if (!arg.skill || !lib.skill[arg.skill] || lib.skill[arg.skill].charlotte || lib.skill[arg.skill].persevereSkill || get.is.locked(arg.skill) || !arg.target.getSkills(true, false).includes(arg.skill)) return false; }, directHit_ai: true, }, @@ -16868,7 +16856,7 @@ game.import("character", function () { }, zhaxiang: { audio: 2, - audioname: ["ol_sb_jiangwei"], + audioname2: { ol_sb_jiangwei: "zhaxiang_ol_sb_jiangwei" }, trigger: { player: "loseHpEnd" }, forced: true, content: function () { @@ -16933,7 +16921,7 @@ game.import("character", function () { charlotte: true, onremove: true, audio: "zhaxiang", - audioname: ["ol_sb_jiangwei"], + audioname2: { ol_sb_jiangwei: "zhaxiang_ol_sb_jiangwei" }, trigger: { player: "useCard" }, filter: function (event, player) { return event.card && event.card.name == "sha" && get.color(event.card) == "red"; @@ -17998,7 +17986,7 @@ game.import("character", function () { new_reluoyi_info: "摸牌阶段开始时,你亮出牌堆顶的三张牌。然后,你可以放弃摸牌。若如此做,你获得其中的基本牌、武器牌和【决斗】,且直到你的下回合开始,你使用的【杀】或【决斗】造成伤害时,此伤害+1。否则,你将这些牌置入弃牌堆。", new_rewusheng: "武圣", - new_rewusheng_info: "你可以将一张红色牌当做【杀】使用或打出。你使用的方片杀没有距离限制。", + new_rewusheng_info: "你可以将一张红色牌当做【杀】使用或打出。你使用的方片【杀】没有距离限制。", new_yijue: "义绝", new_yijue_info: "出牌阶段限一次,你可以弃置一张牌并令一名有手牌的其他角色展示一张手牌。若此牌为黑色,则该角色不能使用或打出牌,非锁定技失效且受到来自你的红桃【杀】的伤害+1直到回合结束。若此牌为红色,则你可以获得此牌,并可以令其回复1点体力。", @@ -18021,8 +18009,7 @@ game.import("character", function () { new_reqingnang_info: "出牌阶段,你可以弃置一张手牌,令一名本回合内未成为过〖青囊〗的目标的角色回复1点体力。若你弃置的是黑色牌,则你本回合内不能再发动〖青囊〗。", new_reyaowu: "耀武", - new_reyaowu_info: - "锁定技,当一名角色使用【杀】对你造成伤害时,若此杀为红色,该角色回复1点体力或摸一张牌。否则你摸一张牌。", + new_reyaowu_info: "锁定技,当一名角色使用【杀】对你造成伤害时,若此【杀】为红色,该角色回复1点体力或摸一张牌。否则你摸一张牌。", reyaowu: "耀武", reyaowu_info: "锁定技,当你受到牌造成的伤害时,若此牌为红色,则伤害来源摸一张牌;否则你摸一张牌。", @@ -18471,8 +18458,7 @@ game.import("character", function () { dcfaen: "法恩", dcfaen_info: "一名角色翻至正面或横置后,你可令其摸一张牌。", reshizhi: "矢志", - reshizhi_info: - "锁定技,若你的体力值为1,则你的【闪】视为【杀】,且当你使用对应的实体牌为一张【闪】的非转化普通杀造成伤害后,你回复1点体力。", + reshizhi_info: "锁定技,若你的体力值为1,则你的【闪】视为【杀】,且当你使用对应的实体牌为一张【闪】的非转化普通【杀】造成伤害后,你回复1点体力。", re_guotufengji: "界郭图逢纪", re_guotufengji_prefix: "界", rejigong: "急攻", @@ -18526,8 +18512,7 @@ game.import("character", function () { reshenxing_info: "出牌阶段,你可以弃置X张牌(X为你本阶段内发动过〖慎行〗的次数且至少为0,至多为2),然后摸一张牌。", rebingyi: "秉壹", - rebingyi_info: - "结束阶段,你可展示所有手牌。若这些牌:颜色均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数);点数均相同,则你摸一张牌。", + rebingyi_info: "结束阶段,你可展示所有手牌。若这些牌:颜色均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数);颜色点数均相同,则你摸一张牌。", re_jiaxu: "界贾诩", re_jiaxu_prefix: "界", rewansha: "完杀", diff --git a/character/sb.js b/character/sb.js index ba610b94..9392563d 100644 --- a/character/sb.js +++ b/character/sb.js @@ -49,6 +49,7 @@ game.import("character", function () { sb_menghuo: ["male", "shu", 4, ["sbhuoshou", "sbzaiqi"]], sb_yl_luzhi: ["male", "qun", 3, ["nzry_mingren", "sbzhenliang"]], sb_xiaoqiao: ["female", "wu", 3, ["sbtianxiang", "xinhongyan"]], + sb_luxun: ["male", "wu", 3, ["sbqianxun", "sblianying"]], }, characterSort: { sb: { @@ -76,18 +77,9 @@ game.import("character", function () { "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: [], }, }, characterSubstitute: { @@ -180,6 +172,9 @@ game.import("character", function () { lib.skill.sbgongqi.updateBlocker(current); }); }, + intro: { + content: "所有其他角色不能使用或打出不为$的手牌响应你使用的牌", + }, }, block: { trigger: { @@ -216,7 +211,17 @@ game.import("character", function () { 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; }, }, }, @@ -462,15 +467,18 @@ game.import("character", function () { charlotte: true, mod: { globalTo(from, to, distance) { - return distance - to.countMark("sbyicong_to"); + return distance + to.countMark("sbyicong_from"); }, }, marktext: "从", intro: { - content: "本轮其他角色至你的距离-#", + content: "本轮其他角色至你的距离+#", }, }, }, + ai: { + combo: "sbqiaomeng" + }, }, sbqiaomeng: { audio: 2, @@ -526,6 +534,9 @@ game.import("character", function () { if (num > 0) player.addMark("charge", num); } }, + ai: { + combo: "sbyicong" + }, }, //高顺 sbxianzhen: { @@ -790,8 +801,11 @@ game.import("character", function () { 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, @@ -1303,18 +1317,10 @@ game.import("character", function () { trigger: { player: "damageEnd", }, - direct: true, - async content(event, trigger, player) { - let num = Math.max(1, player.getDamagedHp()); - const { - result: { bool, targets }, - } = await player - .chooseTarget( - get.prompt("sbjieming"), - `令一名角色摸四张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于${get.cnNumber( - num - )}张,你失去1点体力。` - ) + async cost(event, trigger, player) { + const num = Math.max(1, player.getDamagedHp()); + event.result = await player + .chooseTarget(get.prompt("sbjieming"), `令一名角色摸四张牌,然后其可以弃置任意张牌。若其弃置的牌数小于${get.cnNumber(num)}张,你失去1点体力。`) .set("ai", (target) => { if (get.event("nope")) return 0; const player = get.player(), @@ -1333,31 +1339,20 @@ game.import("character", function () { } return att / 3; }) - .set( - "nope", - player.getHp() + - player.countCards("hs", (card) => player.canSaveCard(card, player)) <= - 1 && num > 2 - ); - if (!bool) return; - const target = targets[0]; - player.logSkill("sbjieming", target); + .set("nope", player.getHp() + player.countCards("hs", card => player.canSaveCard(card, player)) <= 1 && num > 2) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; await target.draw(4); - num = Math.max(1, player.getDamagedHp()); + const num = Math.max(1, player.getDamagedHp()); const { - result: { bool: bool2, cards }, + result: { bool: bool, cards }, } = await target - .chooseToDiscard( - "节命:是否弃置任意张牌?", - `若你本次弃置的牌数不大于${get.cnNumber(num)}张,${get.translation( - player - )}失去1点体力。`, - [1, Infinity], - "he" - ) + .chooseToDiscard("节命:是否弃置任意张牌?", `若你本次弃置的牌数小于${get.cnNumber(num)}张,${get.translation(player)}失去1点体力。`, [1, Infinity], "he") .set("ai", (card) => { if (get.event("nope")) return 0; - if (ui.selected.cards.length > get.event("num")) return 0; + if (ui.selected.cards.length >= get.event("num")) return 0; return 6 - get.value(card); }) .set( @@ -1367,7 +1362,7 @@ game.import("character", function () { 0 ) .set("num", num); - if (!bool2 || cards.length <= num) player.loseHp(); + if (!bool || cards.length < num) player.loseHp(); }, ai: { maixie: true, @@ -1400,572 +1395,408 @@ game.import("character", function () { }, //曹丕 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); + }, + }, + }, + }, + { + 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: - let map = {}; - game.dead.forEach( - (target) => - (map[target.playerid] = get.translation(target)) - ); - const { - result: { control }, - } = await player - .chooseControl(Object.values(map)) - .set("ai", () => { - const getNum = (target) => { - let num = 0; - if (target.name && lib.character[target.name]) - num += get.rank(target.name, true); - if (target.name2 && lib.character[target.name2]) - num += get.rank(target.name2, true); - return num; - }; - let controls = _status.event.controls.slice(); - controls = controls.map((name) => [ - name, - game.dead.find( - (target) => - _status.event.map[target.playerid] == name - ), - ]); - controls.sort((a, b) => getNum(b[1]) - getNum(a[1])); - return controls[0][0]; - }) - .set("prompt", "获得一名已阵亡角色的所有技能") - .set("map", map); - if (control) { - const target2 = game.dead.find( - (targetx) => map[targetx.playerid] == control - ); - player.line(target2); - game.log(player, "选择了", target2); - const skills = target2.getStockSkills(true, true); - const skills2 = ["sbxingshang", "sbfangzhu", "sbsongwei"]; - player.changeSkills(skills, skills2); - } - } - }, - 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: {}, @@ -1999,13 +1830,17 @@ game.import("character", function () { 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; }, }, }, @@ -2016,19 +1851,13 @@ game.import("character", function () { trigger: { player: "phaseUseBegin" }, filter(event, player) { if (player.countMark("sbxingshang") >= get.info("sbxingshang").getLimit) return false; - return game.hasPlayer((target) => target.group == "wei" && target != player); + return game.hasPlayer(target => target.group == "wei" && target != player); }, zhuSkill: true, forced: true, locked: false, async content(event, trigger, player) { - player.addMark( - "sbxingshang", - Math.min( - get.info("sbxingshang").getLimit - player.countMark("sbxingshang"), - 2 * game.countPlayer((target) => target.group == "wei" && target != player) - ) - ); + player.addMark("sbxingshang", Math.min(get.info("sbxingshang").getLimit - player.countMark("sbxingshang"), 2 * game.countPlayer(target => target.group == "wei" && target != player))); }, group: "sbsongwei_delete", subSkill: { @@ -2037,16 +1866,10 @@ game.import("character", function () { enable: "phaseUse", filter(event, player) { if (player.storage.sbsongwei_delete) return false; - return game.hasPlayer((target) => - lib.skill.sbsongwei.subSkill.delete.filterTarget(null, player, target) - ); + return game.hasPlayer(target => lib.skill.sbsongwei.subSkill.delete.filterTarget(null, player, target)); }, filterTarget(card, player, target) { - return ( - target != player && - target.group == "wei" && - target.getStockSkills(false, true).length - ); + return target != player && target.group == "wei" && target.getStockSkills(false, true).length; }, skillAnimation: true, animationColor: "thunder", @@ -2281,7 +2104,7 @@ game.import("character", function () { player.markAuto("sbyijue_effect", [trigger.player]); }, ai: { - halfneg: true + neg: true, }, marktext: "绝", intro: { content: "已放$一马" }, @@ -2340,10 +2163,7 @@ game.import("character", function () { }, 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: { @@ -3244,7 +3064,7 @@ game.import("character", function () { target.removeSkill(skills); num += skills.length; }); - if (get.mode() != "identity") num += 2; + if (get.mode() == "versus" && _status.mode == "two") num += 2; player.draw(num); }, }, @@ -3644,7 +3464,6 @@ game.import("character", function () { game.hasPlayer((current) => get.damageEffect(current, player, player) > 0) ); }, - shaRelated: true, logTarget: "target", content: function () { "step 0"; @@ -3797,7 +3616,6 @@ game.import("character", function () { player: "useCardToPlayered", target: "useCardToTargeted", }, - shaRelated: true, filter: function (event, player) { if ( !( @@ -6340,7 +6158,6 @@ game.import("character", function () { else player.draw(2); } }, - shaRelated: true, ai: { ignoreSkill: true, skillTagFilter: function (player, tag, arg) { @@ -6349,14 +6166,7 @@ game.import("character", function () { } if (!arg || arg.isLink || !arg.card || arg.card.name != "sha") return false; if (!arg.target || get.attitude(player, arg.target) >= 0) return false; - if ( - !arg.skill || - !lib.skill[arg.skill] || - lib.skill[arg.skill].charlotte || - get.is.locked(arg.skill) || - !arg.target.getSkills(true, false).includes(arg.skill) - ) - return false; + if (!arg.skill || !lib.skill[arg.skill] || lib.skill[arg.skill].charlotte || lib.skill[arg.skill].persevereSkill || get.is.locked(arg.skill) || !arg.target.getSkills(true, false).includes(arg.skill)) return false; }, directHit_ai: true, }, @@ -7044,7 +6854,7 @@ game.import("character", function () { }, content: function () { var num = 2; - if (trigger.name != "damage") num += 2; + if (trigger.name == "damage" && get.mode() == "identity") num --; num = Math.min(8 - player.countMark("sbguidao"), num); player.addMark("sbguidao", num); }, @@ -7100,7 +6910,7 @@ game.import("character", function () { }, content: function () { "step 0"; - if (!lib.inpile.contains("taipingyaoshu")) { + if (!lib.inpile.includes("taipingyaoshu")) { lib.inpile.push("taipingyaoshu"); } event.card = game.createCard2("taipingyaoshu", "heart", 3); @@ -7366,6 +7176,7 @@ game.import("character", function () { }); }, ai: { + combo: "sbjushou", order: 8, result: { target: -1, @@ -8174,6 +7985,9 @@ game.import("character", function () { }, }, }, + ai: { + combo: "sbliangzhu" + }, }, sbliangzhu: { audio: 2, @@ -8390,6 +8204,9 @@ game.import("character", function () { player.addSkills("sbduojing"); player.storage.sbkeji = true; }, + ai: { + combo: "sbkeji" + }, }, sbduojing: { audio: 2, @@ -8483,7 +8300,10 @@ game.import("character", function () { } else player.removeSkill("sbxiayuan_round"); }, subSkill: { round: { charlotte: true } }, - ai: { expose: 0.2 }, + ai: { + combo: "sbjieyue", + expose: 0.2 + }, }, sbjieyue: { audio: 4, @@ -8654,7 +8474,6 @@ game.import("character", function () { ai: { threaten: 3.5, directHit_ai: true, - halfneg: true, skillTagFilter: function (player, tag, arg) { if (arg && arg.card && arg.card.name == "sha") { var storage = player.getStorage("sbliegong"); @@ -9030,6 +8849,171 @@ game.import("character", function () { } }, }, + //陆逊 + 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").filter(name => get.type(name) == "trick").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) { + const card = { name: button.link[2], isCard: true }; + return player.hasUseTarget(card); + }).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 }; + await player.chooseUseTarget(card, true); + }, + }, + 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"); + }, + }, }, dynamicTranslate: { sbkeji: function (player) { @@ -9111,6 +9095,7 @@ game.import("character", function () { sb_liubiao_prefix: "谋", sb_zhurong_prefix: "谋", sb_menghuo_prefix: "谋", + sb_luxun_prefix: "谋", sp_yangwan: "谋杨婉", spmingxuan: "瞑昡", spmingxuan_info: @@ -9200,8 +9185,8 @@ game.import("character", function () { sbleiji: "雷击", sbleiji_info: "出牌阶段,你可以选择一名其他角色并弃4枚“道兵”,对其造成1点雷电伤害。", sbguidao: "鬼道", - sbguidao_info: - "①游戏开始时/一名角色受到属性伤害后,你获得4/2枚“道兵”。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。③“道兵”上限为8。", + sbguidao_info: "①游戏开始时/一名角色受到属性伤害后,你获得2枚“道兵”(标记上限为8)。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。", + sbguidao_info_identity: "①游戏开始时/一名角色受到属性伤害后,你获得2/1枚“道兵”(标记上限为8)。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。", sbhuangtian: "黄天", sbhuangtian_info: "主公技,锁定技。①回合开始时,若本回合为你的第一个回合且游戏轮数为1,且游戏内没有【太平要术】,你装备【太平要术】。②其他群势力角色造成伤害后,若你拥有〖鬼道〗,你获得2枚“道兵”(每轮你至多以此法获得4枚“道兵”)。", @@ -9384,10 +9369,8 @@ game.import("character", function () { sb_huangyueying_prefix: "谋", sbqicai: "奇才", sbqicai_backup: "奇才", - sbqicai_info: - "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏,然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", - sbqicai_info_doudizhu: - "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏(每种牌名的装备牌每局游戏限选择一次),然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", + sbqicai_info: "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张装备牌置于一名其他角色的对应装备栏,然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", + sbqicai_info_doudizhu: "①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张防具牌置于一名其他角色的对应装备栏(每种牌名的装备牌每局游戏限选择一次),然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。", sbjizhi: "集智", sbjizhi_info: "锁定技,当你使用一张普通锦囊牌时,你摸一张牌,且此牌本回合不计入你的手牌上限。", sb_guanyu: "谋关羽", @@ -9407,23 +9390,21 @@ game.import("character", function () { 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: "驱虎", sbquhu_info: "出牌阶段限一次。你可以选择两名有牌的其他角色,你与这些角色同时将任意张牌扣置于武将牌上。若你以此法扣置的牌唯一最少,则扣置牌最多的其他角色获得你扣置的牌,且这些角色获得各自扣置的牌;否则这两名角色中扣置牌较多的角色对较少的角色造成1点伤害,获得你扣置的牌,然后这些角色将各自扣置的牌置入弃牌堆(若这两名角色扣置的牌数相同,视为与你逆时针最近座次的角色扣置牌较多)。", sbjieming: "节命", - sbjieming_info: - "当你受到伤害后,你可以令一名角色摸四张牌,然后其可以弃置任意张牌。若其弃置的牌数不大于X,你失去1点体力(X为你已损失的体力值,至少为1)。", + sbjieming_info: "当你受到伤害后,你可以令一名角色摸四张牌,然后其可以弃置任意张牌。若其弃置的牌数小于X,你失去1点体力(X为你已损失的体力值,至少为1)。", sb_xiahoudun: "谋夏侯惇", sb_xiahoudun_prefix: "谋", sbganglie: "刚烈", - sbganglie_info: "出牌阶段限一次。你可以选择一名本局游戏对你造成过伤害且你以此法选择过其的次数小于2的角色,你对其造成1点伤害。", + sbganglie_info: "出牌阶段限一次。你可以选择任意名本局游戏对你造成过伤害且你以此法选择过其的次数小于2的角色,你对其造成2点伤害。", sbqingjian: "清俭", sbqingjian_info: "①当有一张牌不因使用而进入弃牌堆后,若你的“清俭”数小于X,你将此牌置于你的武将牌上,称为“清俭”(X为你的体力值-1,且至少为1)。②出牌阶段结束时,你将所有“清俭”分配给任意角色。", @@ -9447,6 +9428,11 @@ game.import("character", function () { 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)。", sb_zhi: "谋攻篇·知", sb_shi: "谋攻篇·识", diff --git a/character/shenhua.js b/character/shenhua.js index 7d6e66dc..303eb627 100644 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -70,7 +70,7 @@ game.import("character", function () { character: { re_huangzhong: ["male", "shu", 4, ["xinliegong"]], old_zhoutai: ["male", "wu", 4, ["gzbuqu"]], - old_caoren: ["male", "wei", 4, ["jushou"]], + old_caoren: ["male", "wei", 4, ["jushou"], ["die_audio:new_caoren"]], re_xuhuang: ["male", "wei", 4, ["duanliang", "jiezi"]], re_pangde: ["male", "qun", 4, ["mashu", "jianchu"]], re_xiahouyuan: ["male", "wei", 4, ["xinshensu"]], @@ -1463,6 +1463,7 @@ game.import("character", function () { }, derivation: "rejizhi", }, + rejizhi_lukang: { audio: 1 }, drlt_jueyan1: { mod: { cardUsable(card, player, num) { @@ -3337,7 +3338,6 @@ game.import("character", function () { }, }, jianchu: { - shaRelated: true, audio: 2, audioname: ["re_pangde"], trigger: { player: "useCardToPlayered" }, @@ -3863,7 +3863,6 @@ game.import("character", function () { group: "kuanggu_check", }, xinliegong: { - shaRelated: true, mod: { aiOrder(player, card, num) { if (num > 0 && (card.name === "sha" || get.tag(card, "draw"))) return num + 6; @@ -4173,6 +4172,7 @@ game.import("character", function () { }, qiaobian: { audio: 2, + audioname2: { gz_jun_caocao: "jianan_qiaobian" }, trigger: { player: ["phaseJudgeBefore", "phaseDrawBefore", "phaseUseBefore", "phaseDiscardBefore"], }, @@ -4501,7 +4501,6 @@ game.import("character", function () { }, }, jiang: { - shaRelated: true, audio: 2, preHidden: true, audioname: ["sp_lvmeng", "re_sunben", "re_sunce"], @@ -5078,7 +5077,7 @@ game.import("character", function () { ) continue; let skills = lib.character[name][3].filter((skill) => { - const categories = get.skillCategoriesOf(skill); + const categories = get.skillCategoriesOf(skill, player); return !categories.some((type) => lib.skill.rehuashen.bannedType.includes(type)); }); if (skills.length) { @@ -5484,7 +5483,6 @@ game.import("character", function () { }, }, lieren: { - shaRelated: true, audio: 2, audioname: ["boss_lvbu3", "ol_zhurong"], trigger: { source: "damageSource" }, @@ -5526,6 +5524,9 @@ game.import("character", function () { }, fangzhu: { audio: 2, + audioname2: { + xin_simayi: "jilue_fangzhu", + }, trigger: { player: "damageEnd" }, direct: true, preHidden: true, @@ -5900,6 +5901,7 @@ game.import("character", function () { audioname2: { re_sunyi: "gzyinghun_re_sunyi", tw_ol_sunjian: "yinghun_ol_sunjian", + boss_sunce: "yinghun_sunce" }, mod: { aiOrder(player, card, num) { @@ -6320,7 +6322,7 @@ game.import("character", function () { 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, @@ -7124,7 +7126,6 @@ game.import("character", function () { zhuSkill: true, }, mengjin: { - shaRelated: true, audio: 2, trigger: { player: "shaMiss" }, //priority:-1, @@ -7501,7 +7502,6 @@ game.import("character", function () { }, }, liegong: { - shaRelated: true, audio: 2, audioname: ["re_huangzhong"], trigger: { player: "useCardToPlayered" }, @@ -8652,16 +8652,10 @@ game.import("character", function () { var type = get.type(i); if (type == "basic" || type == "trick") list.push([type, "", i]); if (i == "sha") { - if (event.type != "phase") - if ( - !event.filterCard( - get.autoViewAs({ name: i, nature: j }, "unsure"), - player, - event - ) - ) - continue; - for (var j of lib.inpile_nature) list.push(["基本", "", "sha", j]); + for (const j of lib.inpile_nature) { + if (event.type != "phase") if (!event.filterCard(get.autoViewAs({ name: i, nature: j }, "unsure"), player, event)) continue; + list.push(["基本", "", "sha", j]); + } } } return ui.create.dialog("蛊惑", [list, "vcard"]); @@ -9003,13 +8997,13 @@ game.import("character", function () { 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"], - weiyan: ["re_weiyan", "ol_weiyan", "weiyan"], + 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"], @@ -9027,24 +9021,17 @@ game.import("character", function () { 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"], zhurong: ["zhurong", "ol_zhurong", "re_zhurong", "sb_zhurong"], - sunjian: ["sunjian", "ol_sunjian", "re_sunjian", "tw_ol_sunjian"], - jiaxu: ["jiaxu", "re_jiaxu", "ns_jiaxu", "ps_jiaxu"], + sunjian: ["sunjian", "ol_sunjian", "re_sunjian", "tw_ol_sunjian", "star_sunjian"], + jiaxu: ["jiaxu", "re_jiaxu", "ns_jiaxu", "ps_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"], - jiangwei: [ - "jiangwei", - "ol_jiangwei", - "re_jiangwei", - "ol_sb_jiangwei", - "sb_jiangwei", - "jsrg_jiangwei", - ], + sp_ol_zhanghe: ["sp_ol_zhanghe", "yj_zhanghe", "sp_zhanghe", "jsrg_zhanghe", "huan_zhanghe"], + jiangwei: ["jiangwei", "ol_jiangwei", "re_jiangwei", "ol_sb_jiangwei", "sb_jiangwei", "jsrg_jiangwei", "huan_jiangwei"], liushan: ["liushan", "ol_liushan", "re_liushan"], sunce: ["sunce", "re_sunce", "re_sunben", "sb_sunce", "dc_sunce"], - zhangzhang: ["zhangzhang", "ol_zhangzhang", "re_zhangzhang"], + zhangzhang: ["zhangzhang", "ol_zhangzhang", "re_zhangzhang", "tw_zhangzhao", "tw_zhanghong", "star_zhangzhao"], zuoci: ["zuoci", "re_zuoci"], caiwenji: ["caiwenji", "ol_caiwenji", "re_caiwenji"], xuyou: ["xuyou", "sp_xuyou", "jsrg_xuyou", "yj_xuyou", "junk_xuyou"], @@ -9057,7 +9044,7 @@ game.import("character", function () { ], 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/shiji.js b/character/shiji.js index 5c750b56..d5d8f843 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -1245,6 +1245,7 @@ game.import("character", function () { audio: 2, enable: "phaseUse", usable: 1, + changeSeat: true, limited: true, skillAnimation: true, animationColor: "orange", @@ -2675,7 +2676,7 @@ game.import("character", function () { 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)); }, }, //陈武董袭 @@ -3852,20 +3853,15 @@ game.import("character", function () { 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) { @@ -4649,6 +4645,9 @@ game.import("character", function () { content: function () { game.cardsGotoSpecial(get.cards(), "toRenku"); }, + ai: { + combo: "spsongshu" + }, }, spsongshu: { audio: 2, @@ -4699,6 +4698,9 @@ game.import("character", function () { intro: { content: "不能对其他角色使用牌" }, }, }, + ai: { + combo: "gebo" + }, }, //张机 jishi: { @@ -4736,6 +4738,9 @@ game.import("character", function () { }, }, }, + ai: { + combo: "binglun" + }, }, xinliaoyi: { audio: "liaoyi", @@ -4977,6 +4982,7 @@ game.import("character", function () { }, }, ai: { + combo: "jishi", order: 2, result: { player: 1, @@ -5822,6 +5828,64 @@ game.import("character", function () { onremove: true, intro: { content: "已对$发动过此技能" }, }, + yuanqing: { + audio: 2, + trigger: { player: "phaseUseEnd" }, + forced: true, + filter: function (event, player) { + return player.hasHistory("useCard", function (evt) { + return evt.getParent("phaseUse") == event; + }); + }, + content: function () { + var map = {}, + cards = []; + player.getHistory("useCard", function (evt) { + if (evt.getParent("phaseUse") == trigger) { + var type = get.type2(evt.card, false); + if (!map[type]) map[type] = []; + } + }); + for (var i = 0; i < ui.discardPile.childNodes.length; i++) { + var card = ui.discardPile.childNodes[i], + type = get.type2(card, false); + if (map[type]) map[type].push(card); + } + for (var i in map) { + if (map[i].length) cards.push(map[i].randomGet()); + } + if (cards.length) { + player.$gain2(cards, false); + game.cardsGotoSpecial(cards, "toRenku"); + game.log(player, "将", cards, "置入了仁库"); + game.delayx(); + } + }, + init: function (player) { + player.storage.renku = true; + }, + }, + shuchen: { + audio: 2, + init: function (player) { + player.storage.renku = true; + }, + trigger: { global: "dying" }, + forced: true, + filter: function (event, player) { + return _status.renku.length > 3; + }, + logTarget: "player", + content: function () { + player.gain(_status.renku, "gain2", "fromRenku"); + _status.renku.length = 0; + game.updateRenku(); + trigger.player.recover(); + }, + ai: { + combo: "yuanqing" + }, + }, hxrenshi: { audio: 2, enable: "phaseUse", @@ -6283,7 +6347,7 @@ game.import("character", function () { 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, @@ -6296,17 +6360,13 @@ game.import("character", function () { 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); }, }, //狗剩 @@ -7989,6 +8049,7 @@ game.import("character", function () { sp_jiangqing: ["sp_jiangqing", "tw_jiangqing", "jiangqing"], kongrong: ["dc_kongrong", "sp_kongrong", "jsrg_kongrong", "kongrong"], dc_mifuren: ["dc_mifuren", "sp_mifuren"], + sp_jiangwan: ["ol_jiangwan", "sp_jiangwan"], }, translate: { liuba_prefix: "手杀", @@ -8053,8 +8114,7 @@ game.import("character", function () { mjchenshi: "陈势", mjchenshi_player: "陈势", mjchenshi_target: "陈势", - mjchenshi_info: - "当有角色使用【兵临城下】指定第一个目标后,其可交给你一张牌,并将牌堆的顶三张牌中所有不为【杀】的牌置入弃牌堆;当有角色成为【兵临城下】的目标后,其可交给你一张牌,然后将牌堆顶三张牌中所有的【杀】置入弃牌堆。", + mjchenshi_info: "当有角色使用【兵临城下】指定第一个目标后,其可交给你一张牌,并将牌堆顶三张牌中所有不为【杀】的牌置入弃牌堆;当有角色成为【兵临城下】的目标后,其可交给你一张牌,然后将牌堆顶三张牌中所有的【杀】置入弃牌堆。", mjmouzhi: "谋识", mjmouzhi_info: "锁定技,当你受到伤害时,若伤害渠道对应的牌和你上次受到的伤害花色相同,则你防止此伤害。", @@ -8119,13 +8179,11 @@ game.import("character", function () { heji_info: "当有角色使用的【决斗】或红色【杀】结算完成后,若此牌对应的目标数为1,则你可以对相同的目标使用一张【杀】或【决斗】(无距离和次数限制)。若你以此法使用的牌不为转化牌,则你从牌堆中随机获得一张红色牌。", liubing: "流兵", - liubing_info: - "锁定技。①你于出牌阶段使用的第一张非虚拟【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。", + liubing_info: "锁定技。①你于出牌阶段使用的第一张非虚拟【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色【杀】结算结束后,若此【杀】未造成伤害,则你获得之。", sp_mifuren: "手杀糜夫人", spcunsi: "存嗣", spcunsi2: "存嗣", - spcunsi_info: - "出牌阶段限一次,你可将武将牌翻至背面并选择一名其他角色。其从牌堆或弃牌堆中获得一张【杀】,且下一张杀的伤害值基数+1。", + spcunsi_info: "出牌阶段限一次,你可将武将牌翻至背面并选择一名其他角色。其从牌堆或弃牌堆中获得一张【杀】,且下一张【杀】的伤害值基数+1。", spguixiu: "闺秀", spguixiu_info: "锁定技,当你受到伤害后,若你的武将牌背面朝上,则你将武将牌翻至正面。当你的武将牌从背面翻至正面时,你摸一张牌。", @@ -8139,8 +8197,7 @@ game.import("character", function () { xinlirang_info: "①其他角色的摸牌阶段开始时,若你没有“谦”标记,则你可以获得一枚“谦”标记。若如此做,其额定摸牌数+2,且本回合的弃牌阶段开始时,你可以获得其弃置的至多两张牌。②摸牌阶段开始时,若你有“谦”标记,则你跳过此摸牌阶段并移除“谦”标记。", xinmingshi: "名仕", - xinmingshi_info: - "锁定技,当你受到伤害后,若你有“谦”标记,则伤害来源弃置一张牌。若此牌为:黑色:你获得之。红色,你回复1点体力。", + xinmingshi_info: "锁定技,当你受到伤害后,若你有“谦”标记,则伤害来源弃置其区域内的一张牌。若此牌为:黑色:你获得之。红色,你回复1点体力。", sp_xinpi: "手杀辛毗", spyinju: "引裾", spyinju2: "引裾", @@ -8152,8 +8209,7 @@ game.import("character", function () { reduoji: "夺冀", reduoji_info: "出牌阶段限一次,你可将一张牌置于其他角色的武将牌上,称为“冀”。当有装备牌因使用而进入一名角色的装备区后,若该角色有“冀”且其为使用者,则你获得此装备牌,其移去一个“冀”并摸一张牌。一名其他角色的回合结束后,若其有“冀”,则你获得其的所有“冀”。", - wangling: "手杀王淩", - wangling_prefix: "手杀", + wangling: "王淩", mouli: "谋立", mouli_info: "出牌阶段限一次,你可以将一张手牌交给一名其他角色,其获得如下效果直到你的下回合开始:其可以将黑色牌当做【杀】,红色牌当做【闪】使用。其第一次触发“使用【杀】/【闪】结算完成后”的时机时,你摸三张牌。", @@ -8175,8 +8231,7 @@ game.import("character", function () { xunyi: "殉义", xunyi2: "殉义", xunyi3: "殉义", - xunyi_info: - "游戏开始时,或当上一个拥有“殉义”效果的角色死亡后,你可以选择一名角色获得如下效果:当其/你对二者之外的角色造成伤害后,你/其摸一张牌;当其/你受到二者之外的角色造成的伤害后,你/其弃置一张牌。", + xunyi_info: "游戏开始时,或当上一个拥有“殉义”效果的角色死亡后,你可以选择一名角色获得如下效果:当其/你对二者之外的角色造成1点伤害后,你/其摸一张牌;当其/你受到二者之外的角色造成的1点伤害后,你/其弃置一张牌。", zhouchu: "手杀周处", xianghai: "乡害", xianghai_info: "锁定技,其他角色的手牌上限-1。你手牌区的装备牌均视为【酒】。", @@ -8308,12 +8363,10 @@ game.import("character", function () { "出牌阶段限一次,你可以选择一名体力值不大于你的角色。若其:未横置,其横置;已横置,你获得其一张牌。", 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: @@ -8365,7 +8418,8 @@ game.import("character", function () { spyanjiao: "严教", spyanjiao_info: "出牌阶段限一次。你可以将手牌中一种花色的所有牌交给一名其他角色,对其造成1点伤害。然后你于自己的下回合开始时摸等量的牌。", - sp_jiangwan: "蒋琬", + sp_jiangwan: "手杀蒋琬", + sp_jiangwan_prefix: "手杀", spzhenting: "镇庭", spzhenting_info: "每回合限一次。当你攻击范围内的角色成为【杀】或延时锦囊的目标时,若你不是此牌的使用者且不是此牌的目标,则你可以将此目标改为自己。然后你选择一项:①弃置使用者的一张手牌。②摸一张牌。", diff --git a/character/sp.js b/character/sp.js index 91c03c4e..c567c37d 100644 --- a/character/sp.js +++ b/character/sp.js @@ -8,17 +8,17 @@ game.import("character", function () { sp_tianji: ["sunhao", "liuxie", "caoang", "hetaihou", "sunluyu", "ol_wangrong", "zuofen", "ol_bianfuren", "qinghegongzhu", "tengfanglan", "ruiji", "caoxiancaohua", "caoyu"], sp_sibi: ["ol_lukai", "yangxiu", "guotu", "chenlin", "chengyu", "shixie", "fuwan", "wangyun", "zhugejin", "simalang", "maliang", "buzhi", "dongyun", "kanze", "sunqian", "xizhicai", "sunshao", "duxi", "jianggan", "ol_dengzhi", "ol_yangyi", "ol_dongzhao", "ol_chendeng", "jin_yanghu", "wangyan", "xiahouxuan", "quhuang", "zhanghua", "wangguan", "sunhong", "caoxi", "tianchou"], sp_tianzhu: ["ol_liupi", "yadan", "liyi", "zhangyan", "niujin", "hejin", "hansui", "wutugu", "yanbaihu", "shamoke", "zhugedan", "huangzu", "gaogan", "tadun", "fanjiangzhangda", "ahuinan", "dongtuna", "ol_wenqin"], - sp_nvshi: ["ol_dingshangwan", "lingju", "guanyinping", "zhangxingcai", "mayunlu", "dongbai", "zhaoxiang", "ol_zhangchangpu", "daxiaoqiao", "jin_guohuai", "ol_hujinding"], + sp_nvshi: ["ol_dingshangwan", "lingju", "guanyinping", "zhangxingcai", "mayunlu", "dongbai", "zhaoxiang", "ol_zhangchangpu", "daxiaoqiao", "jin_guohuai", "ol_hujinding", "ol_luyusheng", "ol_liwan"], sp_shaowei: ["ol_pengyang", "simahui", "zhangbao", "zhanglu", "zhugeguo", "xujing", "zhangling", "huangchengyan", "zhangzhi", "lushi"], - 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"], + 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_wanglang: ["ol_wanglang", "ol_puyuan", "ol_zhouqun"], sp_zhongdan: ["cuiyan", "huangfusong"], - sp_guozhan2: ["sp_dongzhuo", "liqueguosi", "zhangren"], + sp_guozhan2: ["sp_dongzhuo", "zhangren"], sp_others: ["hanba", "caiyang"], - sp_waitforsort: ["ol_luyusheng", "ol_tw_zhangji", "ol_liwan", "ol_liuyan", "ol_peixiu", "caimao"], + sp_waitforsort: ["ol_peixiu", "ol_tw_zhangji", "ol_jiangwan", "mawan", "budugen"], }, }, characterFilter: { @@ -33,10 +33,13 @@ game.import("character", function () { }, }, character: { + budugen: ["male", "qun", 4, ["olkouchao"]], + mawan: ["male", "qun", 4, ["mashu", "olhunjiang"]], + ol_jiangwan: ["male", "shu", 3, ["olziruo", "olxvfa"]], caimao: ["male", "wei", 4, ["olzuolian", "oljingzhou"]], - ol_peixiu: ["male", "wei", 3, ["olmaozhu", "oljinlan"]], + ol_peixiu: ["male", "jin", 4, ["olmaozhu", "oljinlan"]], yadan: ["male", "qun", 4, ["olqingya", "oltielun"]], - sp_sunce: ["male", "qun", 4, ["olliantao"]], + sp_sunce: ["male", "qun", 4, ["junkliantao"]], ol_liupi: ["male", "qun", 4, ["olyicheng"]], ol_lukai: ["male", "wu", 3, ["olxuanzhu", "oljiane"]], liupan: ["male", "qun", 4, ["olpijing"]], @@ -45,10 +48,10 @@ game.import("character", function () { tianchou: ["male", "qun", 4, ["olshandao"]], liyi: ["male", "wu", 4, ["olchanshuang", "olzhanjin"]], caoyu: ["male", "wei", 3, ["olgongjie", "olxiangxv", "olxiangzuo"]], - ol_liwan: ["female", "wei", 3, ["ollianju", "olsilv"]], + ol_liwan: ["female", "wei", 3, ["relianju", "resilv"]], ol_dingshangwan: ["female", "wei", 3, ["olfudao", "olfengyan"]], zhangyan: ["male", "qun", 4, ["olsuji", "ollangdao"]], - ol_tw_zhangji: ["male", "wei", 3, ["skill_zhangji_A", "skill_zhangji_B"], ["unseen"]], + ol_tw_zhangji: ["male", "wei", 3, ["skill_zhangji_A", "skill_zhangji_B"]], ol_feiyi: ["male", "shu", 3, ["yanru", "hezhong"]], lvboshe: ["male", "qun", 4, ["olfushi", "oldongdao"]], ol_luyusheng: ["female", "wu", 3, ["olcangxin", "olrunwei"]], @@ -64,7 +67,6 @@ game.import("character", function () { haopu: ["male", "shu", 4, ["olzhenying"]], ol_mengda: ["male", "shu", 4, ["olgoude"]], ol_wanglang: ["male", "wei", 3, ["gushe", "oljici"]], - ol_liuyan: ["male", "qun", "4/6", ["olpianan", "olyinji", "olkuisi"]], lushi: ["female", "qun", 3, ["olzhuyan", "releijie"]], zhangshiping: ["male", "shu", 3, ["olhongji", "olxinggu"]], sunhong: ["male", "wu", 3, ["olxianbi", "olzenrun"]], @@ -99,7 +101,7 @@ game.import("character", function () { qinghegongzhu: ["female", "wei", 3, ["zengou", "qhzhangji"]], fanjiangzhangda: ["male", "wu", 4, ["yuanchou", "juesheng"]], tianyu: ["male", "wei", 4, ["saodi", "zhuitao"]], - ol_chendeng: ["male", "qun", 4, ["olfengji"]], + ol_chendeng: ["male", "qun", 4, ["olfengji", "olxuanhui"]], ol_zhuling: ["male", "wei", 4, ["jixian"]], wuyan: ["male", "wu", 4, ["lanjiang"]], sp_ol_zhanghe: ["male", "qun", 4, ["spolzhouxuan"]], @@ -139,7 +141,7 @@ game.import("character", function () { xiahouba: ["male", "shu", 4, ["baobian"]], yuanshu: ["male", "qun", 4, ["yongsi", "weidi"]], sp_diaochan: ["female", "qun", 3, ["lihun", "rebiyue"]], - sp_zhaoyun: ["male", "qun", 3, ["ollongdan", "chongzhen"]], + sp_zhaoyun: ["male", "qun", 3, ["ollongdan", "chongzhen"], ["die_audio:zhaoyun"]], liuxie: ["male", "qun", 3, ["tianming", "mizhao", "twzhuiting"], ["zhu"]], zhugejin: ["male", "wu", 3, ["olhuanshi", "olhongyuan", "olmingzhe"]], zhugeke: ["male", "wu", 3, ["aocai", "duwu"]], @@ -212,6 +214,8 @@ game.import("character", function () { luzhi: ["male", "wei", 3, ["qingzhong", "weijing"]], }, characterIntro: { + budugen: "步度根(?-约233年),檀石槐之孙,魁头之弟。中国三国时期鲜卑首领之一。步度根在其兄魁头死后,嗣为鲜卑一部之首领,据有云中、雁门、北地、代郡、太原等地之全部或一部分。建安(196年-220年)中,曾与轲比能等通过护乌桓校尉阎柔向曹操贡献。后遣使向魏文帝曹丕献马,被封为王。因兄扶罗韩被轲比能所杀,与之结怨,互相攻劫,其部众益少,力量益弱。被迫率众万余落退保太原、雁门,并联络扶罗韩子泄归泥附己,共拒轲比能。黄初五年(224年),亲诣魏廷贡献,受赏赐,与魏保持和好关系。魏明帝青龙元年(233年),受轲比能诱使,叛魏,扰掠并州,在魏将秦朗追击下,走漠北,后为轲比能所杀。", + mawan: "马玩,东汉末年凉州军阀之一。建安十六年(公元211年),同韩遂、马超联合,起兵反抗曹操。同年九月,联军战败,马玩不知去向。", caimao: "蔡瑁,字德珪,生卒年不详。襄阳蔡州人,东汉末年荆州名士。少年时与曹操交好。初平元年(公元190年),刘表为荆州刺史。时宗贼猖獗,蔡瑁协助刘表诛杀宗贼,平定荆州之地,蔡瑁因此得刘表重用,并在刘表任镇南将军时担任他的军师。刘表病亡后,蔡瑁拥护刘表幼子刘琮继位,并逼迫他投降南征的曹操。蔡瑁在曹操麾下历任从事中郎、司马、长水校尉,受封汉阳亭侯。", yadan: "雅丹,《三国演义》虚构人物,西羌丞相。诸葛亮伐魏时,魏大都督曹真驰书赴羌,西羌国王彻里吉任命雅丹与元帅越吉起兵15万前去增援,中了诸葛亮之计,被伏兵所困。", liupan: "刘磐(生卒年不详),山阳高平人,荆州牧刘表从子。与南阳人黄忠共守长沙攸县。为人骁勇,数次为寇于艾、西安诸县。江东孙策于是分海昏、建昌为左右六县,以东莱太史慈为建昌都尉,治海昏,并督诸将共拒刘磐。于是刘磐绝迹不复为寇。", @@ -297,7 +301,6 @@ game.import("character", function () { bianfuren: "武宣皇后卞氏(159年12月30日-230年7月9日),琅邪开阳(今山东临沂)人,魏武帝曹操的正妻(继室),魏文帝曹丕、任城威王曹彰、陈思王曹植、萧怀王曹熊的母亲。原本是倡家,即汉代专门从事音乐歌舞的乐人家庭,后来与曹操成婚,建安初年,原配丁夫人被废,卞夫人成为曹操的正妻。曹丕继位后尊其为皇太后,曹叡继位后尊其为太皇太后。卞后在太和四年去世,与魏武帝曹操合葬高陵。", shamoke: "沙摩柯(?-222年),东汉末三国时期五溪蛮首领。汉章武元年(221年)初,为报关羽被东吴杀害之仇,刘备亲自领兵攻孙权,以金锦爵赏诱沙摩柯助战。章武二年(222年),吴大都督陆逊以火攻破刘备,率诸军齐击,汉军四十多个营寨被攻破,沙摩柯在大乱中匹马奔逃,被乱军杀死。", lvfan: "吕范(?-228年),字子衡。汝南郡细阳县(今安徽太和)人。汉末至三国时期吴国重臣。吕范年轻为汝南县吏,后避难寿春,结识孙策。此后随孙策、孙权征伐四方,对稳固孙氏在江东的统治做出了杰出的贡献,孙权将其比之于东汉开国元勋吴汉。吴国建立后,吕范累官至前将军、假节、扬州牧,封南昌侯。黄武七年(228年),吕范被拜为大司马,未得授官,便已病逝。孙权悲痛不已,遣使赠其大司马印绶。孙权还都建业后,以太牢礼祭祀吕范。", - liqueguosi: "请分别查看「李傕」和「郭汜」的武将介绍。", maojie: "毛玠(?—216年),字孝先,陈留平丘(今河南封丘)人。东汉末年大臣。年少时为县吏,以清廉公正著称。因战乱而打算到荆州避乱,但中途知道刘表政令不严明,因而改往鲁阳。后来投靠曹操,提出“奉天子以令不臣,脩耕植,畜军资”的战略规划,得到曹操的欣赏。
    毛玠与崔琰主持选举,所举用的都是清廉正直之士。而毛玠为人廉洁,激起天下廉洁之风,一改朝中奢华风气。曹操大为赞赏,曹丕也亲自去拜访他。
    曹操获封魏公后,毛玠改任尚书仆射,再典选举。又密谏曹操应该立嫡长子曹丕为魏国太子。崔琰被杀后,毛玠十分不快。后来有人诬告毛玠,曹操大怒,将毛玠收于狱中。及后在桓阶、和洽营救下,只被免职,不久逝世于家中。曹操在他死后赐他棺材和钱帛。", huangfusong: "字义真。安定郡朝那县(今宁夏彭阳)人。于黄巾起义时,以中郎将身份讨伐黄巾,用火攻大破张梁、张宝。后接替董卓进攻张梁,连胜七阵。掘张角墓,拜左车骑将军、冀州牧,因拒绝贿赂宦官而被免职。 董卓死,王允命其与吕布等共至郿坞抄籍董卓家产、人口,皇甫嵩将坞中所藏良家子女,尽行释放。", @@ -735,6 +738,579 @@ game.import("character", function () { }, }, skill: { + //步度根 + //古希腊掌管扣工资的神(bushi + olkouchao: { + audio: 2, + init(player, skill) { + if (!player.storage[skill]) { + player.storage[skill] = ["sha", "huogong", "guohe"]; + } + }, + hiddenCard(player, name) { + const storage = player.getStorage("olkouchao"); + for (let i = 0; i < storage.length; i++) { + if (!player.getStorage("olkouchao_used").includes(i) && name == storage[i]) return true; + } + return false; + }, + enable: "chooseToUse", + filter(event, player) { + if (!player.countCards("hes")) return false; + const storage = player.getStorage("olkouchao"); + for (let i = 0; i < storage.length; i++) { + if (player.getStorage("olkouchao_used").includes(i)) continue; + if (event.filterCard(get.autoViewAs({ name: storage[i] }, "unsure"), player, event)) return true; + } + return false; + }, + chooseButton: { + dialog(event, player) { + const storage = player.getStorage("olkouchao"); + let list = []; + for (let i = 0; i < storage.length; i++) { + const name = storage[i]; + list.push([get.translation(get.type(name)), "", name, undefined, i]); + } + return ui.create.dialog("寇钞", [list, "vcard"]); + }, + filter(button, player) { + const evt = get.event().getParent(); + return evt.filterCard(get.autoViewAs({ name: button.link[2] }, "unsure"), player, evt) && !player.getStorage("olkouchao_used").includes(button.link[4]); + }, + check(button) { + const evt = get.event().getParent(); + const player = get.event().player; + if (evt.type != "phase") return 1; + if (button.link[2] == "jiu") { + if (player.getUseValue({ name: "jiu" }) <= 0) return 0; + if (player.countCards("h", "sha")) return player.getUseValue({ name: "jiu" }); + return 0; + } + return player.getUseValue({ name: button.link[2] }) / 4; + }, + backup(links, player) { + return { + filterCard: true, + position: "hes", + viewAs: { + name: links[0][2], + storage: { olkouchao: links[0][4] + 1 }, + }, + precontent() { + if (!player.storage.olkouchao_used) { + player.when({ global: "roundStart" }).then(() => delete player.storage.olkouchao_used); + } + player.markAuto("olkouchao_used", [lib.skill.olkouchao_backup.viewAs.storage.olkouchao - 1]); + player.addTempSkill("olkouchao_effect"); + }, + }; + }, + prompt(links, player) { + const name = links[0][2], + index = links[0][4] + 1; + return '###寇钞###
    将一张牌当作【' + get.translation(name) + "】使用,然后修改【寇钞】的第" + get.cnNumber(index, true) + "项
    "; + }, + }, + ai: { + order(_, player) { + 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)) names.splice(i--, 1); + } + names = names.map(name => { + return { name: name }; + }); + names.sort((a, b) => { + return player.getUseValue(b, true, true) - player.getUseValue(a, true, true); + }); + let max = get.order(names[0], player); + if (max > 0) max += 0.3; + return max; + }, + respondShan: true, + respondSha: true, + skillTagFilter(player, tag, arg) { + if (arg == "respond") return false; + if (!player.countCards("hes")) return false; + return player.getStorage("olkouchao").includes(tag == "respondSha" ? "sha" : "shan"); + }, + result: { + player(player) { + const dying = get.event().dying; + return dying ? get.attitude(player, dying) : 1; + }, + }, + }, + subSkill: { + backup: {}, + effect: { + charlotte: true, + trigger: { player: "useCardAfter" }, + filter(event, player) { + return (event.card.storage || {}).olkouchao; + }, + forced: true, + popup: false, + async content(event, trigger, player) { + const cards = game + .getAllGlobalHistory("everything", evt => { + if (!evt.cards || !evt.cards.someInD("d")) return false; + if (evt.name == "lose") return evt.position == ui.discardPile; + if (evt.name != "cardsDiscard") return false; + const evtx = evt.getParent(); + if (evtx.name != "orderingDiscard") return false; + const evt2 = evtx.relatedEvent || evtx.getParent(); + return evt2 && evt2.name != "useCard"; + }) + .map(evt => evt.cards.filterInD("d")) + .flat() + .reverse(); + const card = cards.find(card => ["basic", "trick"].includes(get.type(card))); + if (card) { + const index = (trigger.card.storage || {}).olkouchao; + player.storage.olkouchao[index - 1] = card.name; + game.log(player, "修改", "#g【寇钞】", "的", "#y第" + get.cnNumber(index, true) + "项", "为", "#g【" + get.translation(card.name) + "】"); + if (player.storage.olkouchao.every(name => get.type(name) == "basic")) { + player.storage.olkouchao = ["shunshou", "shunshou", "shunshou"]; + game.log(player, "修改", "#g【寇钞】", "的", "#y所有项", "为", "#g【顺手牵羊】"); + } + } + }, + }, + }, + }, + //马玩 + olhunjiang: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return game.hasPlayer(target => lib.skill.olhunjiang.filterTarget(null, player, target)); + }, + filterTarget(card, player, target) { + return target != player && player.inRange(target); + }, + usable: 1, + selectTarget: [1, Infinity], + multitarget: true, + multiline: true, + async content(event, trigger, player) { + const targets = event.targets.sortBySeat(); + let answer_result = [[], []]; + let humans = targets.filter(current => current === game.me || current.isOnline()); + let locals = targets.slice(0).randomSort(); + locals.removeArray(humans); + const eventId = get.id(); + const send = (question, current, eventId) => { + lib.skill.dclisao.chooseControl(question, current, eventId); + game.resume(); + }; + event._global_waiting = true; + let time = 10000; + if (lib.configOL && lib.configOL.choose_timeout) time = parseInt(lib.configOL.choose_timeout) * 1000; + targets.forEach(current => current.showTimer(time)); + if (humans.length > 0) { + const solve = function (resolve, reject) { + return function (result, player) { + if (result && typeof result.index == "number") { + resolve(); + answer_result[result.index].push(player); + } else reject(); + }; + }; + await Promise.any( + humans.map(current => { + return new Promise(async (resolve, reject) => { + if (current.isOnline()) { + current.send(send, question, current, eventId); + current.wait(solve(resolve, reject)); + } else { + const next = lib.skill.olhunjiang.chooseControl(current, player, eventId); + const solver = solve(resolve, reject); + if (_status.connectMode) game.me.wait(solver); + const result = await next.forResult(); + if (_status.connectMode) game.me.unwait(result, current); + else solver(result, current); + } + }); + }) + ).catch(() => {}); + game.broadcastAll("cancel", eventId); + } + if (locals.length > 0) { + for (const current of locals) { + const result = await lib.skill.olhunjiang.chooseControl(current, player).forResult(); + if (result && typeof result.index == "number") { + answer_result[result.index].push(current); + } + } + } + delete event._global_waiting; + for (const i of targets) { + i.hideTimer(); + i.addExpose(0.05); + i.popup(answer_result[0].includes(i) ? "成为目标" : "令其摸牌"); + game.log(i, "选择了", "#y" + (answer_result[0].includes(i) ? "成为目标" : "令其摸牌")); + } + await game.asyncDelay(); + if (answer_result[0].length) { + answer_result[0].sortBySeat(); + player.addTempSkill("olhunjiang_addTarget"); + player.markAuto("olhunjiang_addTarget", answer_result[0]); + if (!answer_result[1].length) { + await player.draw(answer_result[0].length); + } + } + if (answer_result[1].length) { + answer_result[1].sortBySeat(); + await player.draw(answer_result[1].length); + if (!answer_result[0].length) { + player.addTempSkill("olhunjiang_addTarget"); + player.markAuto("olhunjiang_addTarget", answer_result[1]); + } + } + }, + ai: { + order(_, player) { + return get.order({ name: "sha" }, player) + 1; + }, + result: { + target(player, target) { + return get.sgn(get.sgn(get.attitude(player, target)) + 0.5); + }, + }, + }, + chooseControl(player, source, eventId) { + const str = get.translation(source); + return player + .chooseControl("成为目标", "令其摸牌") + .set("prompt", "###" + str + "对你发动了【浑疆】,请选择一项" + '###
    若所有角色选择了同一项,则所有角色也执行另一项
    ') + .set("choiceList", ["令" + str + "本阶段使用【杀】可以额外指定你为目标", "令" + str + "摸一张牌"]) + .set("source", source) + .set("id", eventId) + .set("_global_waiting", true) + .set("ai", () => Math.max(0, get.sgn(get.attitude(get.event().player, get.event().source)))); + }, + subSkill: { + addTarget: { + charlotte: true, + onremove: true, + intro: { content: "本阶段使用【杀】可以额外指定$为目标" }, + trigger: { player: "useCard2" }, + filter(event, player) { + if (event.card.name != "sha") return false; + return game.hasPlayer(target => { + if (!player.getStorage("olhunjiang_addTarget").includes(target)) return false; + return !event.targets.includes(target) && lib.filter.targetEnabled2(event.card, player, target) && lib.filter.targetInRange(event.card, player, target); + }); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget( + get.prompt("olhunjiang_addTarget"), + "令任意名【浑疆】选择成为额外目标的角色成为" + get.translation(trigger.card) + "的目标", + (card, player, target) => { + if (!player.getStorage("olhunjiang_addTarget").includes(target)) return false; + const event = get.event().getTrigger(); + return !event.targets.includes(target) && lib.filter.targetEnabled2(event.card, player, target) && lib.filter.targetInRange(event.card, player, target); + }, + [1, Infinity] + ) + .set("ai", target => { + const player = get.event("player"), + event = get.event().getTrigger(); + return get.effect(target, event.card, player); + }) + .forResult(); + }, + async content(event, trigger, player) { + trigger.targets.addArray(event.targets); + game.log(event.targets, "成为了", trigger.card, "的额外目标"); + }, + }, + }, + }, + //蒋琬 + olziruo: { + audio: 2, + trigger: { player: "useCard" }, + filter(event, player) { + if (!event.olziruo || !event.olziruo[player.playerid]) return false; + return event.olziruo[player.playerid][Boolean(player.storage.olziruo) ? 1 : 0]; + }, + forced: true, + async content(event, trigger, player) { + player.changeZhuanhuanji("olziruo"); + await player.draw(); + }, + mark: true, + marktext: "☯", + zhuanhuanji: true, + intro: { content: storage => "当你使用最" + (storage ? "右" : "左") + "侧的卡牌时,你摸一张牌。你以此法摸牌后本回合不能整理手牌。" }, + global: "olziruo_mark", + mod: { + aiOrder(player, card, num) { + if (typeof card == "object") { + const cards = player.getCards("h"); + if (cards.indexOf(card) == (player.storage.olziruo ? cards.length - 1 : 0)) return num + 10; + } + }, + }, + group: ["olziruo_gain", "olziruo_sort"], + subSkill: { + mark: { + charlotte: true, + trigger: { player: "useCardBegin" }, + filter(event, player) { + const cards = player.getCards("h"); + if (!cards.length) return false; + return (event.cards || []).some(card => cards[0] == card || cards[cards.length - 1] == card); + }, + forced: true, + popup: false, + content() { + const cards = player.getCards("h"); + if (!trigger.olziruo) trigger.olziruo = {}; + trigger.olziruo[player.playerid] = [trigger.cards.some(card => cards[0] == card), trigger.cards.some(card => cards[cards.length - 1] == card)]; + }, + }, + gain: { + trigger: { + player: "gainAfter", + }, + filter(event, player) { + if (player.hasSkill("olziruo_ban", null, null, false)) return false; + return event.getParent().name == "draw" && event.getParent(2).name == "olziruo"; + }, + forced: true, + popup: false, + async content(event, trigger, player) { + player.addTempSkill("olziruo_ban"); + }, + }, + ban: { + charlotte: true, + mark: true, + intro: { + content: "本回合不能整理手牌", + }, + ai: { noSortCard: true }, + }, + sort: { + enable: "chooseToUse", + filter(event, player) { + return player.countCards("h") > 1 && !player.hasSkillTag("noSortCard"); + }, + filterCard: true, + selectCard: 2, + position: "h", + direct: true, + lose: false, + discard: false, + delay: 0, + prompt: "选择两张手牌,更换这两张手牌的顺序", + content() { + let h = player.getCards("h"), + hs = h.slice(); + const list = [hs.indexOf(cards[0]), hs.indexOf(cards[1])]; + hs[list[0]] = cards[1]; + hs[list[1]] = cards[0]; + hs.reverse(); + game.addVideo("lose", player, [get.cardsInfo(hs), [], [], []]); + h.forEach(i => i.goto(ui.special)); + player.directgain(hs, false); + event.getParent(2).goto(0); + }, + }, + }, + }, + olxvfa: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + return (!player.hasSkill("olxvfa_0") && player.countCards("h")) || (!player.hasSkill("olxvfa_1") && player.getExpansions("olxvfa").length); + }, + chooseButton: { + dialog(_, player) { + let dialog = ui.create.dialog("蓄发:请选择一项", "hidden"); + const list = [ + ["0", "将至少一半手牌称为“蓄发”置于武将牌上,然后可以将一张牌当作“蓄发”牌中的一张普通锦囊牌使用"], + ["1", "移去至少一半“蓄发”牌,然后可以将一张牌当作其中一张普通锦囊牌使用"], + ].filter(listx => { + if (listx[0] == "0") return !player.hasSkill("olxvfa_0") && player.countCards("h"); + return !player.hasSkill("olxvfa_1") && player.getExpansions("olxvfa").length; + }); + dialog.add([list, "textbutton"]); + if (list.length == 1) dialog.direct = true; + return dialog; + }, + filter(button, player) { + if (button.link == "0") return !player.hasSkill("olxvfa_0") && player.countCards("h"); + return !player.hasSkill("olxvfa_1") && player.getExpansions("olxvfa").length; + }, + check: () => 1 + Math.random(), + backup: links => get.copy(lib.skill["olxvfa_" + ["put", "remove"][parseInt(links[0])]]), + prompt(links) { + if (links[0] == "0") return "###蓄发###将至少一半手牌称为“蓄发”置于武将牌上,然后可以将一张牌当作“蓄发”牌中的一张普通锦囊牌使用"; + return "###蓄发###移去一半“蓄发”牌,然后可以将一张牌当作其中一张普通锦囊牌使用"; + }, + }, + intro: { + content: "expansion", + markcount: "expansion", + }, + onremove(player, skill) { + const cards = player.getExpansions(skill); + if (cards.length) player.loseToDiscardpile(cards); + }, + subSkill: { + backup: {}, + 0: { charlotte: true }, + 1: { charlotte: true }, + put: { + audio: "olxvfa", + filterCard: true, + selectCard: () => [Math.ceil(get.event("player").countCards("h") / 2), Infinity], + position: "h", + check(card) { + const player = get.event("player"), + value = player.getUseValue(card, true); + if (value > 0) return get.type(card) == "trick" ? 20 + value : 0; + return 15 - get.value(card) - get.useful(card); + }, + lose: false, + discard: false, + delay: 0, + async content(event, trigger, player) { + player.addTempSkill("olxvfa_0", "phaseUseAfter"); + await player.addToExpansion(event.cards, player, "give").set("gaintag", ["olxvfa"]); + const cards = player.getExpansions("olxvfa"); + if (cards.some(card => get.type(card) == "trick" && player.hasCard(cardx => player.hasUseTarget(get.autoViewAs({ name: card.name }, [cardx]), true), "hes"))) { + const result = await player + .chooseButton(['###蓄发###
    是否将一张牌当作一张“蓄发”牌使用?
    ', cards]) + .set("filterButton", button => { + const player = get.event("player"), + card = button.link; + return get.type(card) == "trick" && player.hasCard(cardx => player.hasUseTarget(get.autoViewAs({ name: card.name }, [cardx]), true), "hes"); + }) + .set("ai", button => { + const player = get.event("player"), + card = button.link; + return player.getUseValue({ name: card.name, isCard: true }, true); + }) + .forResult(); + if (result.bool) { + const card = result.links[0]; + game.broadcastAll(function (card) { + lib.skill.olxvfa_backupx.viewAs = { name: card.name }; + }, card); + await player + .chooseToUse() + .set("openskilldialog", "###蓄发###将一张牌当作【" + get.translation(card.name) + "】使用") + .set("norestore", true) + .set("addCount", false) + .set("_backupevent", "olxvfa_backupx") + .set("custom", { + add: {}, + replace: { window: function () {} }, + }) + .backup("olxvfa_backupx"); + } + } + }, + }, + remove: { + audio: "olxvfa", + filterCard: () => false, + selectCard: -1, + delay: 0, + async content(event, trigger, player) { + player.addTempSkill("olxvfa_1", "phaseUseAfter"); + const cards = player.getExpansions("olxvfa"), + num = Math.ceil(cards.length / 2); + const result = await player + .chooseButton(['###蓄发###
    请移去至少' + get.cnNumber(num) + "张“蓄发”牌
    ", cards], [num, Infinity], true) + .set("ai", button => { + const player = get.event("player"), + value = player.getUseValue(button.link, true); + if (value > 0 && get.type(button.link) == "trick") { + if ( + !ui.selected.buttons.some(but => { + return get.type(but.link) == "trick" && player.getUseValue(but.link, true) > 0; + }) + ) + return 20 + value; + return 0; + } + return 1 / (get.useful(button.link) || 0.5); + }) + .forResult(); + if (result.bool) { + const cardx = result.links; + await player.loseToDiscardpile(cardx); + if (cardx.some(card => get.type(card) == "trick" && player.hasCard(cardxx => player.hasUseTarget(get.autoViewAs({ name: card.name }, [cardxx]), true), "hes"))) { + const result2 = await player + .chooseButton(['###蓄发###
    是否将一张牌当作一张移去的“蓄发”牌使用?
    ', cardx]) + .set("filterButton", button => { + const player = get.event("player"), + card = button.link; + return get.type(card) == "trick" && player.hasCard(cardx => player.hasUseTarget(get.autoViewAs({ name: card.name }, [cardx]), true), "hes"); + }) + .set("ai", button => { + const player = get.event("player"), + card = button.link; + return player.getUseValue({ name: card.name, isCard: true }, true); + }) + .forResult(); + if (result2.bool) { + const card = result2.links[0]; + game.broadcastAll(function (card) { + lib.skill.olxvfa_backupx.viewAs = { name: card.name }; + }, card); + await player + .chooseToUse() + .set("openskilldialog", "###蓄发###将一张牌当作【" + get.translation(card.name) + "】使用") + .set("norestore", true) + .set("addCount", false) + .set("_backupevent", "olxvfa_backupx") + .set("custom", { + add: {}, + replace: { window: function () {} }, + }) + .backup("olxvfa_backupx"); + } + } + } + }, + }, + backupx: { + filterCard(card) { + return get.itemtype(card) == "card"; + }, + position: "hes", + check(card) { + const player = get.event("player"); + if (player.hasValueTarget(card, true, true)) return 0; + if (player.hasSkill("olziruo")) { + const cards = player.getCards("h"); + if (cards.indexOf(card) == (player.storage.olziruo ? cards.length - 1 : 0)) { + return 15 - get.value(card); + } + } + return 5 - get.value(card); + }, + log: false, + precontent() { + delete event.result.skill; + }, + }, + }, + ai: { + order: 1, + result: { player: 1 }, + }, + }, //蔡瑁 olzuolian: { audio: 2, @@ -801,10 +1377,13 @@ game.import("character", function () { ) .set("filterMove", (from, to, moved) => { if (typeof to == "number") return false; - const cards=get.event("cards"); - if(cards.includes(from.link)==cards.includes(to.link)) return false; - for(const pl of [[from.link,to.link],[to.link,from.link]]){ - if(cards.includes(pl[0])&&moved[0].includes(pl[1])&&cards.indexOf(pl[0])!=moved[0].indexOf(pl[1])) return false; + const cards = get.event("cards"); + if (cards.includes(from.link) == cards.includes(to.link)) return false; + for (const pl of [ + [from.link, to.link], + [to.link, from.link], + ]) { + if (cards.includes(pl[0]) && moved[0].includes(pl[1]) && cards.indexOf(pl[0]) != moved[0].indexOf(pl[1])) return false; } return true; }) @@ -889,7 +1468,13 @@ game.import("character", function () { trigger.increase("num"); }, countSkill(player) { + //飞扬跋扈,OL你无敌了 + const list = [ + ["feiyang", "飞扬"], + ["bahu", "跋扈"], + ]; return player.getSkills(null, false, false).filter(i => { + if (list.some(text => i.includes(text[0]) && get.translation(i) == text[1])) return true; const info = get.info(i); return !info || !info.charlotte; }).length; @@ -1178,7 +1763,7 @@ game.import("character", function () { }, async cost(event, trigger, player) { event.result = await player - .chooseTarget(get.prompt2("olliantao"), lib.filter.notMe) + .chooseTarget(get.prompt2(event.name.slice(0, -"_cost".length)), lib.filter.notMe) .set("ai", target => { const player = get.event("player"), att = get.attitude(player, target); @@ -1288,6 +1873,7 @@ game.import("character", function () { .reduce((sum, evt) => sum + evt.num, 0); if (num) await player.draw(num); if ( + event.name == "olliantao" && !game.hasPlayer2(current => { return current.getHistory("damage", evt => { return evt.getParent(4) == event; @@ -1298,6 +1884,16 @@ game.import("character", function () { player.addTempSkill("olliantao_buff"); player.addMark("olliantao_buff", 3, false); } + if ( + event.name == "junkliantao" && + !target.getHistory("damage", evt => { + return evt.getParent(4) == event; + }).length + ) { + await player.draw(); + player.addTempSkill("olliantao_buff"); + player.addMark("olliantao_buff", 1, false); + } }, subSkill: { backup: { @@ -1323,6 +1919,11 @@ game.import("character", function () { }, }, }, + //王战孙策,但是通渠 + junkliantao: { + audio: "olliantao", + inherit: "olliantao", + }, //刘辟 olyicheng: { audio: 2, @@ -1395,7 +1996,7 @@ game.import("character", function () { cards = moved[0].slice(); if (cards.length) { await game.cardsGotoOrdering(cards); - for (let i = cards.length - 1; i--; i >= 0) { + for (let i = cards.length - 1; i >= 0; i--) { ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); } game.log(cards, "被放回了牌堆顶"); @@ -1419,7 +2020,7 @@ game.import("character", function () { cards = hs.slice(); if (cards.length) { await game.cardsGotoOrdering(cards); - for (let i = cards.length - 1; i--; i >= 0) { + for (let i = cards.length - 1; i >= 0; i--) { ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); } game.log(cards, "被放回了牌堆顶"); @@ -1857,18 +2458,30 @@ game.import("character", function () { const cards = player.getExpansions("olqushi_effect"); if (cards.length) { await player.loseToDiscardpile(cards); - const targets = player.getStorage("olqushi_effect").filter(i => { - return i.isIn(); - }).sortBySeat(); - const num = Math.min(player.getHistory("useCard", evt => { - return evt.targets && evt.targets.length; - }).reduce((targets, evt) => { - targets.addArray(evt.targets); - return targets; - }, []).length, 5); - if (targets.length && num>0 && player.getHistory("useCard", evt => { - return cards.some(card => get.type2(card) == get.type2(evt.card)); - }).length) { + const targets = player + .getStorage("olqushi_effect") + .filter(i => { + return i.isIn(); + }) + .sortBySeat(); + const num = Math.min( + player + .getHistory("useCard", evt => { + return evt.targets && evt.targets.length; + }) + .reduce((targets, evt) => { + targets.addArray(evt.targets); + return targets; + }, []).length, + 5 + ); + if ( + targets.length && + num > 0 && + player.getHistory("useCard", evt => { + return cards.some(card => get.type2(card) == get.type2(evt.card)); + }).length + ) { for (const target of targets) await target.draw(num); } } @@ -2589,6 +3202,9 @@ game.import("character", function () { ) await player.recover(cards.length); }, + ai: { + combo: "olgongjie", + }, }, //OL飞扬 olfeiyang: { @@ -2766,6 +3382,163 @@ game.import("character", function () { lose: { charlotte: true }, }, }, + relianju: { + audio: "ollianju", + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return player.hasHistory("useCard", evt => { + return (evt.cards || []).some(card => get.position(card, true) == "d"); + }); + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("relianju"), "令一名其他角色获得你本回合使用的且进入弃牌堆的至多两张颜色相同的牌", lib.filter.notMe) + .set("ai", target => { + const player = get.event("player"); + let att = get.attitude(_status.event.player, target); + if (target.hasJudge("lebu")) att /= 2; + if (target.hasSkillTag("nogain")) att /= 10; + return att / (1 + get.distance(player, target, "absolute")); + }) + .forResult(); + }, + async content(event, trigger, player) { + const cards = player + .getHistory("useCard", evt => { + return (evt.cards || []).some(card => get.position(card, true) == "d"); + }) + .reduce((sum, evt) => { + return sum.addArray(evt.cards.filter(card => get.position(card, true) == "d")); + }, []), + target = event.targets[0]; + const result = await player + .chooseButton(["联句:选择令" + get.translation(target) + "获得的牌", cards], [1, 2], true) + .set("filterButton", button => { + return !ui.selected.buttons.some(but => get.color(but.link) != get.color(button.link)); + }) + .set("ai", button => { + return get.value(button.link, get.event("target")); + }) + .set("target", target) + .forResult(); + if (result.bool) { + const color = get.color(result.links[0], false); + await target.gain(result.links, "gain2").set("gaintag", ["resilv"]); + player + .when({ global: "phaseJieshuBegin" }) + .filter( + evt => + evt.player == target && + target.hasHistory("useCard", evt => { + return (evt.cards || []).some(card => get.position(card, true) == "d" && get.color(card) != color); + }) + ) + .then(() => { + const cards = trigger.player + .getHistory("useCard", evt => { + return (evt.cards || []).some(card => get.position(card, true) == "d" && get.color(card) != color); + }) + .reduce((sum, evt) => { + return sum.addArray(evt.cards.filter(card => get.position(card, true) == "d" && get.color(card) != color)); + }, []); + player + .chooseButton(["联句:请选择获得的牌", cards], [1, 2], true) + .set("filterButton", button => { + return !ui.selected.buttons.some(but => get.color(but.link) != get.color(button.link)); + }) + .set("ai", button => { + return get.value(button.link, get.event("target")); + }); + }) + .then(() => { + if (result.bool) { + player.gain(result.links, "gain2").gaintag.add("resilv"); + } + }) + .vars({ color: color }); + } + }, + }, + resilv: { + audio: "olsilv", + trigger: { player: "damageEnd" }, + forced: true, + content() { + player.draw().gaintag = ["resilv"]; + }, + group: "resilv_restore", + subSkill: { + restore: { + audio: "olsilv", + trigger: { global: ["loseAfter", "loseAsyncAfter"] }, + filter(event, player) { + if (event.type != "discard" || event.getlx === false) return false; + if (event.name == "lose") { + if (!event.player.isIn()) return false; + return event.cards2.some(card => { + return (event.gaintag_map[card.cardid] || []).includes("resilv") && get.position(card, true) == "d"; + }); + } + return game.hasPlayer(target => { + return target.hasHistory("lose", evt => { + if (evt.getParent() != event || evt.position != ui.discardPile) return false; + return evt.cards2.some(card => { + if (get.position(card, true) != "d") return false; + return (evt.gaintag_map[card.cardid] || []).includes("resilv"); + }); + }); + }); + }, + forced: true, + logTarget(event, player) { + if (event.name == "lose") return event.player; + return game + .filterPlayer(target => { + return target.hasHistory("lose", evt => { + if (evt.getParent() != event || evt.position != ui.discardPile) return false; + return evt.cards2.some(card => { + if (get.position(card, true) != "d") return false; + return evt.gaintag_map[card.cardid] && evt.gaintag_map[card.cardid].includes("resilv"); + }); + }); + }) + .sortBySeat(); + }, + async content(event, trigger, player) { + if (trigger.name == "lose") { + await trigger.player.gain( + trigger.cards2.filter(card => { + return (trigger.gaintag_map[card.cardid] || []).includes("resilv") && get.position(card, true) == "d"; + }), + "gain2" + ); + } else { + for (const target of lib.skill.resilv_restore.logTarget(trigger, player)) { + await target.gain( + target + .getHistory("lose", evt => { + if (evt.getParent() != trigger || evt.position != ui.discardPile) return false; + return evt.cards2.some(card => { + if (get.position(card, true) != "d") return false; + return (evt.gaintag_map[card.cardid] || []).includes("resilv"); + }); + }) + .reduce((sum, evt) => { + return sum.addArray( + evt.cards2.filter(card => { + if (get.position(card, true) != "d") return false; + return (evt.gaintag_map[card.cardid] || []).includes("resilv"); + }) + ); + }, []), + "gain2" + ); + } + } + }, + }, + }, + }, //丁尚涴 olfudao: { audio: 2, @@ -4580,23 +5353,26 @@ game.import("character", function () { }, content: function () { "step 0"; - player.judge(card => { - var evt = get.event().getParent("olweifu"); - if (evt.name !== "olweifu") return 0; - var cardx = evt.cards[0]; - if (get.type2(card) == get.type2(cardx)) return 0.5; - return 0.1; - }).set("callback", function () { - var card = event.judgeResult.card; - player.addTempSkill("olweifu_clear"); - player.addTempSkill("olweifu_add"); - if (!get.is.object(player.storage.olweifu_add)) player.storage.olweifu_add = {}; - var type = get.type2(card, player); - if (typeof player.storage.olweifu_add[type] != "number") player.storage.olweifu_add[type] = 0; - player.storage.olweifu_add[type]++; - player.markSkill("olweifu_add"); - if (type == get.type2(event.getParent(2).cards[0], player)) player.draw(); - }).set("judge2", result => result.bool); + player + .judge(card => { + var evt = get.event().getParent("olweifu"); + if (evt.name !== "olweifu") return 0; + var cardx = evt.cards[0]; + if (get.type2(card) == get.type2(cardx)) return 0.5; + return 0.1; + }) + .set("callback", function () { + var card = event.judgeResult.card; + player.addTempSkill("olweifu_clear"); + player.addTempSkill("olweifu_add"); + if (!get.is.object(player.storage.olweifu_add)) player.storage.olweifu_add = {}; + var type = get.type2(card, player); + if (typeof player.storage.olweifu_add[type] != "number") player.storage.olweifu_add[type] = 0; + player.storage.olweifu_add[type]++; + player.markSkill("olweifu_add"); + if (type == get.type2(event.getParent(2).cards[0], player)) player.draw(); + }) + .set("judge2", result => result.bool); }, ai: { order: 7, @@ -7959,7 +8735,7 @@ game.import("character", function () { }, ai: { threaten: 0.8, - halfneg: true, + neg: true, effect: { player: function (card, player, target) { if ((!card.isCard || !card.cards) && get.itemtype(card) != "card") return; @@ -8034,7 +8810,13 @@ game.import("character", function () { return player.getAttackRange() > 0; }, content: function () { - var skills = game.filterSkills(player.getStockSkills(true, true), player); + var skills = game.filterSkills( + player.getStockSkills(true, true).filter(skill => { + const info = get.info(skill); + return !info.persevereSkill || !info.charlotte; + }), + player + ); var num = Math.min(player.getAttackRange(), skills.length); skills = skills.slice(0, num); player.disableSkill("olchuanwu", skills); @@ -8311,7 +9093,7 @@ game.import("character", function () { } }, ai: { - halfneg: true + neg: true, }, subSkill: { swap: { @@ -8358,7 +9140,6 @@ game.import("character", function () { }); }, direct: true, - shaRelated: true, content: function () { "step 0"; player @@ -8615,7 +9396,11 @@ game.import("character", function () { 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); @@ -8624,7 +9409,9 @@ game.import("character", function () { "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('
    你的手牌
    '); @@ -9588,7 +10375,6 @@ game.import("character", function () { 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"; @@ -9851,7 +10637,7 @@ game.import("character", function () { var skills = source.getStockSkills("一!", "五!"); for (var skill of skills) { var info = get.info(skill); - if (info && !info.charlotte && !get.is.locked(skill, source) && source.hasSkill(skill, null, null, false)) return true; + if (info && !info.persevereSkill && !info.charlotte && !get.is.locked(skill, source) && source.hasSkill(skill, null, null, false)) return true; } } return false; @@ -9870,7 +10656,7 @@ game.import("character", function () { var skills = source.getStockSkills("一!", "五!"); for (var skill of skills) { var info = get.info(skill); - if (info && !info.charlotte && !get.is.locked(skill, source) && source.hasSkill(skill, null, null, false)) return true; + if (info && !info.persevereSkill && !info.charlotte && !get.is.locked(skill, source) && source.hasSkill(skill, null, null, false)) return true; } return false; }); @@ -10260,7 +11046,6 @@ game.import("character", function () { }, ai: { halfneg: true, - combo: "fenrui", threaten: 3.2, }, }, @@ -11347,7 +12132,6 @@ game.import("character", function () { }, }, 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; }, @@ -13041,10 +13825,10 @@ game.import("character", function () { ai: { result: { player: function (player, target) { - return target.getAllHistory("useCard", evt => evt.card.name == "sha").length * lib.card.juedou.ai.result.player.apply(this, arguments); + return (target.getAllHistory("useCard", evt => evt.card.name == "sha").length + 1) * lib.card.juedou.ai.result.player.apply(this, arguments); }, target: function (player, target) { - var num = target.getAllHistory("useCard", evt => evt.card.name == "sha").length; + var num = target.getAllHistory("useCard", evt => evt.card.name == "sha").length + 1; if (num < target.hp) return 0; return num * lib.card.juedou.ai.result.target; }, @@ -13061,7 +13845,7 @@ game.import("character", function () { }, content: function () { var target = trigger.getParent().target; - trigger.num = Math.max(1, target.getAllHistory("useCard", evt => evt.card.name == "sha").length); + trigger.num = (1 + target.getAllHistory("useCard", evt => evt.card.name == "sha").length); target.addTempSkills("juesheng", { player: "phaseAfter" }); }, }, @@ -13281,31 +14065,39 @@ game.import("character", function () { //生鱼片 olfengji: { audio: 2, - trigger: { player: "phaseDrawBegin2" }, + trigger: { global: "roundStart" }, forced: true, locked: false, - filter: function (event, player) { - return !player.numFixed; - }, content: function () { "step 0"; player - .chooseTarget("丰积:请选择增加摸牌的目标", "令自己本回合的额定摸牌数-1,且目标下回合的额定摸牌数+2。或者点击「取消」,令自己的额定摸牌数+1", lib.filter.notMe) + .chooseTarget("丰积:请选择增加摸牌的目标", "令自己本轮摸牌阶段的额定摸牌数-1,且目标本轮摸牌阶段的额定摸牌数+2。或者点击「取消」,令自己本轮摸牌阶段的额定摸牌数+1", lib.filter.notMe) .set("ai", function (target) { var player = _status.event.player; - if (target.hasJudge("lebu") || target.hasJudge("bingliang")) return 0; var att = get.attitude(player, target), dist = get.distance(player, target, "absolute"); - if (_status.event.goon) { + if (att > 0) { + if (target.hasJudge("lebu") || target.hasJudge("bingliang")) return 0; + if (_status.event.goon) { + return att / dist; + } + if ( + game.countPlayer(function (current) { + return current != player && current != target && get.attitude(player, current) < 0 && get.distance(player, current, "absolute") < dist; + }) >= target.hp + ) + return 0; return att / dist; } - if ( - game.countPlayer(function (current) { - return current != player && current != target && get.attitude(player, current) < 0 && get.distance(player, current, "absolute") < dist; - }) >= target.hp - ) - return 0; - return att / dist; + if (player.hasSkill("olxuanhui", null, null, false) && !player.isTempBanned("olxuanhui") && att < 0) { + const first = get.event().getTrigger().player, + list = ["draw", "sha"]; + if (first == player || get.distance(player, first, "absolute") > dist) { + const targets = [target.storage["olfengji_" + list[0]] || 0, target.storage["olfengji_" + list[1]] || 0]; + return 1 + targets.reduce((sum, num) => sum + num, 0); + } + } + return 0; }) .set("goon", player.skipList.includes("lebu")); "step 1"; @@ -13316,17 +14108,25 @@ game.import("character", function () { player.storage.olfengji_draw--; if (!target.storage.olfengji_draw) target.storage.olfengji_draw = 0; target.storage.olfengji_draw += 2; - target.addTempSkill("olfengji_draw", { player: "phaseAfter" }); + target.addTempSkill("olfengji_draw", "roundStart"); target.markSkill("olfengji_draw"); } else { player.storage.olfengji_draw++; } - player.addTempSkill("olfengji_draw"); + player.addTempSkill("olfengji_draw", "roundStart"); player.markSkill("olfengji_draw"); "step 2"; - player.chooseTarget("丰积:请选择增加使用杀次数的目标", "令自己本回合使用杀的次数上限-1,且目标下回合使用杀的次数上限+2。或者点击「取消」,令自己使用杀的次数上限+1", lib.filter.notMe).set("ai", function (target) { + player.chooseTarget("丰积:请选择增加使用杀次数的目标", "令自己本轮使用杀的次数上限-1,且目标本轮使用杀的次数上限+2。或者点击「取消」,令自己本轮使用杀的次数上限+1", lib.filter.notMe).set("ai", function (target) { var player = _status.event.player; - if (target.countMark("olfengji_draw") > 0 && target.getCardUsable("sha") < 2) return get.attitude(player, target); + if (target.countMark("olfengji_draw") > 0 && target.getCardUsable("sha") < 2 && get.attitude(player, target) > 0) return get.attitude(player, target); + if (player.hasSkill("olxuanhui", null, null, false) && !player.isTempBanned("olxuanhui") && get.attitude(player, target) < 0) { + const first = get.event().getTrigger().player, + list = ["draw", "sha"]; + if (first == player || get.distance(player, first, "absolute") > get.distance(player, target, "absolute")) { + const targets = [target.storage["olfengji_" + list[0]] || 0, target.storage["olfengji_" + list[1]] || 0]; + return 1 + targets.reduce((sum, num) => sum + num, 0); + } + } return 0; }); "step 3"; @@ -13337,12 +14137,12 @@ game.import("character", function () { player.storage.olfengji_sha--; if (!target.storage.olfengji_sha) target.storage.olfengji_sha = 0; target.storage.olfengji_sha += 2; - target.addTempSkill("olfengji_sha", { player: "phaseAfter" }); + target.addTempSkill("olfengji_sha", "roundStart"); target.markSkill("olfengji_sha"); } else { player.storage.olfengji_sha++; } - player.addTempSkill("olfengji_sha"); + player.addTempSkill("olfengji_sha", "roundStart"); player.markSkill("olfengji_sha"); }, subSkill: { @@ -13379,6 +14179,63 @@ game.import("character", function () { }, }, }, + olxuanhui: { + audio: 2, + trigger: { player: "phaseZhunbeiBegin" }, + filter(event, player) { + if (!player.hasSkill("olfengji_sha") && !player.hasSkill("olfengji_draw")) return false; + return game.hasPlayer(target => { + if (target == player) return false; + 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) => { + if (target == player) return false; + return target.hasSkill("olfengji_sha") || target.hasSkill("olfengji_draw"); + }) + .set("ai", target => { + const player = get.event().player, + list = ["draw", "sha"]; + return ( + get.sgn(get.attitude(player, target)) * + (list.reduce((sum, skill) => { + if (typeof player.storage["olfengji_" + skill] == "number") sum += player.storage["olfengji_" + skill]; + return sum; + }, 0) - + list.reduce((sum, skill) => { + if (typeof target.storage["olfengji_" + skill] == "number") sum += target.storage["olfengji_" + skill]; + return sum; + }, 0)) + ); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0], + list = ["draw", "sha"]; + 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]; + for (let i = 0; i <= 1; i++) { + const skill = "olfengji_" + list[i]; + if (!players[i]) target.removeSkill(skill); + else { + target.addTempSkill(skill, "roundStart"); + target.storage[skill] = players[i]; + target.markSkill(skill); + } + if (!targets[i]) player.removeSkill(skill); + else { + player.addTempSkill(skill, "roundStart"); + player.storage[skill] = targets[i]; + player.markSkill(skill); + } + } + game.log(player, "与", target, "交换了", "#g【丰积】", "的数值"); + player.tempBanSkill("olxuanhui", "dieAfter"); + }, + }, //朱灵 jixian: { audio: 2, @@ -13482,9 +14339,13 @@ game.import("character", function () { 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); @@ -17356,17 +18217,6 @@ game.import("character", function () { } }, group: "neifa_use", - ai: { - reverseOrder: true, - skillTagFilter: function (player) { - if (player.storage.counttrigger && player.storage.counttrigger.neifa_use >= 2) return false; - }, - effect: { - target: function (card, player, target) { - if ((!player.storage.counttrigger || !player.storage.counttrigger.neifa_use || player.storage.counttrigger.neifa_use < 2) && player == target && get.type(card) == "equip") return [1, 3]; - }, - }, - }, }, neifa_use: { audio: "neifa", @@ -17379,6 +18229,17 @@ game.import("character", function () { content: function () { player.draw(player.countMark("neifa_nobasic")); }, + ai: { + reverseOrder: true, + skillTagFilter: function (player) { + if (player.storage.counttrigger && player.storage.counttrigger.neifa_use >= 2) return false; + }, + effect: { + target: function (card, player, target) { + if ((!player.storage.counttrigger || !player.storage.counttrigger.neifa_use || player.storage.counttrigger.neifa_use < 2) && player == target && get.type(card) == "equip") return [1, 3]; + }, + }, + }, }, //许靖 yuxu: { @@ -20489,7 +21350,7 @@ game.import("character", function () { limited: true, skillAnimation: true, animationColor: "orange", - forceunique: true, + // forceunique: true, filter: function (event, player) { return player.storage.fanghun2 > 0; }, @@ -20565,7 +21426,7 @@ game.import("character", function () { limited: true, skillAnimation: true, animationColor: "orange", - forceunique: true, + // forceunique: true, filter: function (event, player) { return player.countMark("fanghun") > 0; }, @@ -21535,7 +22396,7 @@ game.import("character", function () { }, weidi: { available(mode) { - return mode == "identity" || mode == "versus" && _status.mode == "four"; + return mode == "identity" || (mode == "versus" && _status.mode == "four"); }, init(player) { const list = []; @@ -21674,49 +22535,46 @@ game.import("character", function () { animationColor: "thunder", skillAnimation: "legend", mark: true, - direct: true, - content: function () { - "step 0"; - player - .chooseTarget(get.prompt2("yongdi"), function (card, player, target) { - return (target.hasSex("male") || target.name == "key_yuri") && target != player; + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("yongdi"), (card, player, target) => { + if (player === target) return false; + return target.hasSex("male") || target.name == "key_yuri"; }) - .set("ai", function (target) { + .set("ai", target => { if (!_status.event.goon) return 0; - var player = _status.event.player; - var att = get.attitude(player, target); + let player = _status.event.player; + let att = get.attitude(player, target); if (att <= 1) return 0; - var mode = get.mode(); + let mode = get.mode(); if (mode == "identity" || (mode == "versus" && (_status.mode == "four" || _status.mode == "guandu"))) { - if (target.name && lib.character[target.name]) { - for (var i = 0; i < lib.character[target.name][3].length; i++) { - if (lib.skill[lib.character[target.name][3][i]].zhuSkill) { - return att * 2; - } - } - } + if ( + target.getStockSkills(true, true).some(i => { + if (target.hasSkill(i)) return false; + let info = get.info(i); + return info && info.zhuSkill; + }) + ) + return att * 2; } return att; }) - .set("goon", !player.hasUnknown()); - "step 1"; - if (result.bool) { - var target = result.targets[0]; - player.logSkill("yongdi", target); - player.awakenSkill("yongdi"); - target.gainMaxHp(); - target.recover(); - var skills = target.getStockSkills(true, true).filter(skill => { - if (target.hasSkill(skill)) return false; - var info = get.info(skill); - return info && info.zhuSkill; - }); - if (skills.length) { - target.addSkills(skills); - } - } + .set("goon", !player.hasUnknown()) + .forResult(); + }, + async content(event, trigger, player) { + player.awakenSkill("yongdi"); + let target = event.targets[0], mode = get.mode(); + if (mode !== "identity" || player.identity !== "nei") player.addExpose(0.25); + target.gainMaxHp(); + target.recover(); + let skills = target.getStockSkills(true, true).filter(skill => { + if (target.hasSkill(skill)) return false; + let info = get.info(skill); + return info && info.zhuSkill; + }); + if (skills.length) target.addSkills(skills); }, - ai: { expose: 0.2 }, }, regushe: { audio: "gushe", @@ -23467,6 +24325,9 @@ game.import("character", function () { player.stat[player.stat.length - 1].card.sha--; } }, + ai: { + combo: "wusheng" + }, group: "nuzhan2", }, nuzhan2: { @@ -24313,7 +25174,6 @@ game.import("character", function () { }, }, fengpo: { - shaRelated: true, audio: 2, trigger: { player: "useCardToPlayered", @@ -24452,6 +25312,9 @@ game.import("character", function () { player.markSkill("rebiluan2"); game.addVideo("storage", player, ["biluan", player.storage.rebiluan2]); }, + ai: { + combo: "biluan" + }, }, olbiluan: { audio: "biluan", @@ -24529,6 +25392,9 @@ game.import("character", function () { player.markSkill("rebiluan2"); game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan]); }, + ai: { + combo: "rebiluan" + }, }, rebiluan2: { mark: true, @@ -24667,6 +25533,9 @@ game.import("character", function () { player.markSkill("rebiluan2"); game.addVideo("storage", player, ["rebiluan2", player.storage.rebiluan2]); }, + ai: { + combo: "olbiluan" + }, }, guiming: { unique: true, @@ -24824,7 +25693,7 @@ game.import("character", function () { }, kunfen: { audio: 2, - audioname: ["ol_sb_jiangwei"], + audioname2: { ol_sb_jiangwei: "kunfen_ol_sb_jiangwei" }, trigger: { player: "phaseJieshuBegin" }, locked: function (skill, player) { if (!player || !player.storage.kunfen) return true; @@ -25489,6 +26358,9 @@ game.import("character", function () { return event.targets.includes(player) && player != event.player && event.card.name == "sha" && player.hp < player.countCards("h"); }, content: function () {}, + ai: { + neg: true + }, unique: true, gainable: true, subSkill: { @@ -25654,7 +26526,7 @@ game.import("character", function () { audio: 2, unique: true, juexingji: true, - forceunique: true, + // forceunique: true, derivation: "xiaoji", trigger: { player: "phaseZhunbeiBegin" }, filter: function (event, player) { @@ -25901,7 +26773,12 @@ game.import("character", function () { usable: 1, content: function () { "step 0"; - player.judge(); + player.judge(card => { + if (game.hasPlayer(cur => { + return get.event("player").canUse("sha", cur); + })) return get.number(card); + return 1 / get.number(card); + }); "step 1"; player.storage.qiangwu = result.number; player.addTempSkill("qiangwu3", "phaseUseEnd"); @@ -26028,7 +26905,6 @@ game.import("character", function () { audio: 2, }, zniaoxiang: { - shaRelated: true, audio: 2, trigger: { player: "useCardToPlayered" }, forced: true, @@ -26842,7 +27718,6 @@ game.import("character", function () { }, //FW关银屏 oldhuxiao: { - shaRelated: true, audio: "huxiao", trigger: { player: "shaMiss" }, forced: true, @@ -29314,6 +30189,15 @@ game.import("character", function () { if (player.storage.olxuanzhu) return '转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; return '转换技,每回合限一次,你可以将一张牌称为“玄”置于武将牌上,然后视为使用:阴,任意基本牌;阳,任意普通锦囊牌(须指定目标且仅指定一个目标)。若此次置于武将牌上的“玄”:不为装备牌,你弃置一张牌;为装备牌,你将所有“玄”置入弃牌堆,然后摸等量的牌。'; }, + olziruo(player) { + if (player.storage.olziruo) return '转换技,锁定技。①当你使用最{阴:左;阳:右}侧的手牌时,你摸一张牌。②你以此法摸牌后本回合不能整理手牌。'; + return '转换技,锁定技。①当你使用最{阴:左;阳:右}侧的手牌时,你摸一张牌。②你以此法摸牌后本回合不能整理手牌。'; + }, + olkouchao(player) { + const nameList = player.storage.olkouchao || ["sha", "huogong", "guohe"]; + const str = nameList.map(i => "【" + get.translation(i) + "】").join("/"); + return "每轮每项限一次,你可以将一张牌当作" + str + "使用。此牌结算完毕后,将此项改为本局游戏最后一张不因使用进入弃牌堆的基本牌或普通锦囊牌的牌名,然后若〖寇钞〗的所有项均为基本牌,则你修改〖寇钞〗的所有项为【顺手牵羊】。"; + }, }, characterReplace: { guanyinping: ["guanyinping", "old_guanyinping"], @@ -29359,7 +30243,7 @@ game.import("character", function () { zhaoyǎn: ["zhaoyǎn", "dc_zhaoyǎn"], furong: ["ol_furong", "furong", "tw_furong"], daxiaoqiao: ["daxiaoqiao", "dc_daxiaoqiao", "tw_daxiaoqiao"], - zhugeguo: ["zhugeguo", "tw_zhugeguo"], + zhugeguo: ["zhugeguo", "tw_zhugeguo", "yue_zhugeguo"], wanglang: ["ol_wanglang", "wanglang", "old_wanglang"], tengfanglan: ["tengfanglan", "dc_tengfanglan"], zhangyì: ["ol_zhangyì", "zhangyì", "std_zhangyì"], @@ -29378,6 +30262,9 @@ game.import("character", function () { 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"], }, translate: { xinfu_lingren: "凌人", @@ -30091,7 +30978,7 @@ game.import("character", function () { zlhuji_info: "锁定技,你与其他角色的距离-1,当你于回合外受到伤害后,你可进行判定,若结果为红色,视为你对伤害来源使用一张【杀】(无距离限制)。", zlshoufu: "授符", zlshoufu2: "授符", - zlshoufu_info: "出牌阶段限一次,你可摸一张牌,然后将一张手牌置于一名没有【箓】的角色的武将牌上,称为【箓】;其不能使用和打出与【箓】同类型的牌。该角色受到伤害后,或于弃牌阶段弃置至少两张与【箓】同类型的牌后,将【箓】置入弃牌堆。", + zlshoufu_info: "出牌阶段限一次,你可摸一张牌,然后将一张手牌置于一名没有“箓”的角色的武将牌上,称为“箓”;其不能使用和打出与“箓”同类型的牌。该角色受到伤害后,或于弃牌阶段弃置至少两张与“箓”同类型的牌后,将“箓”置入弃牌堆。", ol_zhangchangpu: "OL张昌蒲", ol_zhangchangpu_prefix: "OL", olxingshen: "省身", @@ -30243,7 +31130,9 @@ game.import("character", function () { ol_chendeng: "OL陈登", ol_chendeng_prefix: "OL", olfengji: "丰积", - olfengji_info: "摸牌阶段开始时,你选择:⒈本回合摸牌阶段的额定摸牌数-1,且令一名其他角色下回合摸牌阶段的额定摸牌数+2;⒉本回合摸牌阶段的额定摸牌数+1。然后你选择:⒈本回合使用【杀】的次数上限-1,且令一名其他角色下回合使用【杀】的次数上限+2;⒉本回合使用【杀】的次数上限+1。", + olfengji_info: "一轮游戏开始时,你选择:⒈本轮摸牌阶段的额定摸牌数-1,且令一名其他角色本轮摸牌阶段的额定摸牌数+2;⒉本轮摸牌阶段的额定摸牌数+1。然后你选择:⒈本轮使用【杀】的次数上限-1,且令一名其他角色本轮使用【杀】的次数上限+2;⒉本轮使用【杀】的次数上限+1。", + olxuanhui: "旋回", + olxuanhui_info: "准备阶段,若你有〖丰积〗效果,你可以选择一名拥有〖丰积〗效果的其他角色。若如此做,你与其交换〖丰积〗效果,且〖旋回〗失效直到有角色死亡。", tianyu: "田豫", saodi: "扫狄", saodi_info: "当你使用【杀】或普通锦囊牌指定唯一其他角色为目标时,你可从逆时针方向和顺时针方向中选择一个你与其之间角色最少的方向。你令该方向下你与其之间的所有能成为此牌额外目标的角色均成为此牌的目标。", @@ -30254,7 +31143,7 @@ game.import("character", function () { yuanchou: "怨仇", yuanchou_info: "锁定技。当你使用黑色【杀】指定目标角色后或成为黑色【杀】的目标角色后,你令目标角色的防具技能无效直到此【杀】被抵消或造成伤害。", juesheng: "决生", - juesheng_info: "限定技。出牌阶段,你可视为使用一张【决斗】。当你因此【决斗】造成伤害时,你将伤害值改为X(X为目标角色本局游戏内使用过【杀】的数量且至少为1)且令目标角色获得此技能直到其下回合结束。", + juesheng_info: "限定技。出牌阶段,你可视为使用一张【决斗】。当你因此【决斗】造成伤害时,你将伤害值改为X(X为目标角色本局游戏内使用过【杀】的数量+1)且令目标角色获得此技能直到其下回合结束。", qinghegongzhu: "清河公主", zengou: "谮构", zengou_info: "当有角色使用【闪】时,若其在你的攻击范围内,则你可以弃置一张非基本牌或失去1点体力,然后取消此【闪】的目标并获得其对应的实体牌。", @@ -30464,8 +31353,6 @@ game.import("character", function () { olleijie_info: "准备阶段,你可以令一名角色判定,若结果为♠2~9,其受到2点雷电伤害,否则其摸两张牌。", releijie: "雷劫", releijie_info: "出牌阶段限一次,你可以令一名角色判定,若结果为黑桃2~9,则你视为依次对其使用两张雷【杀】,否则其摸两张牌。", - ol_liuyan: "OL刘焉", - ol_liuyan_prefix: "OL", olpianan: "偏安", olpianan_info: "锁定技。游戏开始或弃牌阶段结束时,你弃置所有不为【闪】的手牌(没有则不弃)。若你的手牌数小于体力值,你获得牌堆或弃牌堆中的前X张【闪】(X为你的体力值与手牌数的差)。", olyinji: "殷积", @@ -30539,9 +31426,9 @@ game.import("character", function () { oltuishi: "侻失", oltuishi_info: "锁定技。①你不能使用【无懈可击】。②当你使用点数为字母的牌时,你令此牌无效并摸一张牌,且你对手牌数小于你的角色使用的下一张牌无距离和次数限制。③当你使用伤害类卡牌结算完毕后,若此牌为你本回合使用的第三张或以上未造成伤害的卡牌,则你令〖器翻〗于本回合失效。", ol_tw_zhangji: "张既", - skill_zhangji_A: "技能", + skill_zhangji_A: "技一", skill_zhangji_A_info: "出牌阶段限X次(X为你的体力值),当你使用牌指定一名其他角色为目标后,你可以观看其手牌,然后你选择一项:
    1.弃置其一张牌,然后若弃置的牌是能造成火焰伤害的牌,你摸一张牌。
    2.重铸其手牌中的所有【杀】和【决斗】。
    3.若其没有【闪】,你与其互相对对方造成1点伤害。", - skill_zhangji_B: "技能", + skill_zhangji_B: "技二", skill_zhangji_B_info: "当你受到1点伤害后,你可令一名手牌数小于体力上限的角色摸三张牌,然后其将手牌数弃置至其体力上限数;当你进入濒死状态时,你可令一名其他角色观看五张魏势力武将牌,其可以选择其中一张代替自己的武将牌(体力和体力上限不变)。", ol_feiyi: "费祎", yanru: "宴如", @@ -30570,6 +31457,10 @@ game.import("character", function () { ollianju_info: "结束阶段,你可以令一名其他角色获得你本回合使用的最后一张牌A对应的所有位于弃牌堆的实体牌并记录A的牌名,然后其下个结束阶段可以令你获得其本回合使用的最后一张牌B对应的所有位于弃牌堆的实体牌,然后若A与B的牌名相同,则你失去1点体力;若A与B的牌名不同,则你可以视为使用A。", olsilv: "思闾", olsilv_info: "锁定技,每回合每项限一次,当你获得或失去你发动〖联句〗记录的最后一次牌名的同名牌后,你展示这些牌,然后摸一张牌。", + relianju: "联句", + relianju_info: "结束阶段,你可以令一名其他角色获得你本回合使用的至多两张位于弃牌堆且颜色相同的牌,称为“思闾”,然后你于其下个结束阶段获得其本回合使用的至多两张的位于弃牌堆且颜色相同且颜色不同于你本次获得的牌的颜色的牌,称为“思闾”。", + resilv: "思闾", + resilv_info: "锁定技。①当你受到伤害后,你摸一张牌,称为“思闾”。②一名角色因弃置“思闾”牌使“思闾”牌进入弃牌堆后,其获得之。", xueji_old: "血祭", xueji_old_info: "出牌阶段限一次,你可以弃置一张红色牌并对攻击范围内的至多X名角色各造成1点伤害(X为你已损失的体力值),然后这些角色各摸一张牌。", oldhuxiao: "虎啸", @@ -30620,6 +31511,8 @@ game.import("character", function () { sp_sunce_prefix: "SP", olliantao: "连讨", olliantao_info: "出牌阶段开始时,你可以令一名其他角色选择一个颜色,然后你依次将此颜色的所有手牌当作【决斗】对其使用直到有一方进入濒死状态,然后你摸X张牌(X为你本次以此法造成的伤害数)。若没有角色因本次技能结算受到伤害,你摸三张牌,本回合手牌上限+3且本回合你不能使用【杀】。", + junkliantao: "连讨", + junkliantao_info: "出牌阶段开始时,你可以令一名其他角色选择一个颜色,然后你依次将此颜色的所有手牌当作【决斗】对其使用直到有一方进入濒死状态,然后你摸X张牌(X为你本次以此法造成的伤害数)。若其未因本次技能结算受到伤害,你摸一张牌,本回合手牌上限+1且本回合你不能使用【杀】。", yadan: "雅丹", olqingya: "倾轧", olqingya_info: "当你使用【杀】指定唯一目标后,你可从逆时针方向和顺时针方向中选择一个你与其之间角色最少的方向。你弃置该方向下你与其之间的角色各一张手牌,然后你可以于本回合下个阶段结束时使用其中一张牌。", @@ -30630,12 +31523,24 @@ game.import("character", function () { olmaozhu_info: "锁定技。①你的手牌上限和使用【杀】的额定次数+X(X为你拥有的技能数)。②当你于出牌阶段首次对技能数小于你的角色造成伤害时,此伤害+1。", oljinlan: "尽览", oljinlan_info: "出牌阶段限一次,你可以将手牌数摸至Y张(Y为场上技能数最多的角色的技能数)。", + oljinlan_append: '
  • 注意事项:
    〖飞扬〗〖跋扈〗计入〖茂著〗〖尽览〗的技能数计算', caimao: "蔡瑁", olzuolian: "佐练", olzuolian_tag: "展示牌", olzuolian_info: "出牌阶段限一次,你可以选择至多X名有牌的角色(X为你的体力值),你随机展示这些角色的各一张牌,然后你可以将这些牌与牌堆和弃牌堆中的属性【杀】进行交换。", oljingzhou: "精舟", oljingzhou_info: "当你受到伤害时,你可以选择至多X名角色(X为你的体力值)这些角色中处于/未处于连环状态的角色重置/横置武将牌。", + ol_jiangwan: "蒋琬", + olziruo: "自若", + olziruo_info: "转换技,锁定技。①当你使用最{阴:左;阳:右}侧的手牌时,你摸一张牌。②你以此法摸牌后本回合不能整理手牌。", + olxvfa: "蓄发", + olxvfa_info: "出牌阶段各限一次,你可以:①将至少一半手牌称为“蓄发”置于武将牌上,然后你可以将一张牌当作“蓄发”牌中的一张普通锦囊牌使用;②移去至少一半“蓄发”牌,然后你可以将一张牌当作其中一张普通锦囊牌使用。", + mawan: "马玩", + olhunjiang: "浑疆", + olhunjiang_info: "出牌阶段限一次,你可以选择攻击范围内的任意名其他角色,令这些角色同时选择一项:①令你本阶段使用【杀】可以选择其为额外目标;②令你摸一张牌。若所有角色均选择了同一项,则也执行另一项。", + budugen: "步度根", + olkouchao: "寇钞", + olkouchao_info: "每轮每项限一次,你可以将一张牌当作【杀】/【火攻】/【过河拆桥】使用。此牌结算完毕后,将此项改为本局游戏最后一张不因使用进入弃牌堆的基本牌或普通锦囊牌的牌名,然后若〖寇钞〗的所有项均为基本牌,则你修改〖寇钞〗的所有项为【顺手牵羊】。", sp_tianji: "天极·皇室宗亲", sp_sibi: "四弼·辅国文曲", diff --git a/character/sp2.js b/character/sp2.js index 51608d6a..32711e90 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,6 +4,11 @@ game.import("character", function () { name: "sp2", connect: true, character: { + mp_wangrong: ["male", "wei", 3, ["mpqianlin", "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"]], star_zhangchunhua: ["female", "wei", 3, ["starliangyan", "starminghui"]], @@ -17,6 +22,7 @@ game.import("character", function () { 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"]], @@ -163,19 +169,552 @@ game.import("character", function () { sp_xuzhou: ["re_taoqian", "caosong", "zhangmiao", "qiuliju"], sp_zhongyuan: ["re_hucheer", "re_zoushi", "caoanmin", "re_dongcheng"], sp_xiaohu: ["haomeng", "yanfuren", "yanrou", "dc_zhuling"], - sp_star: [ - "star_caoren", - "star_yuanshu", - "star_dongzhuo", - "star_yuanshao", - "star_zhangchunhua", - "star_sunjian", - ], - mini_qixian: ["mp_liuling"], + sp_qunxiong: ["chezhou", "hansong", "matie"], + 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"], }, }, skill: { + //王戎 + mpqianlin: { + 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("mpqianlin").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("mpqianlin").getCards(player).length; + }, + async cost(event, trigger, player) { + const cards = get.info("mpqianlin").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: { + globalFrom(from, to) { + if (from.hp >= to.hp) return -Infinity; + }, + }, + }, + dcquxian: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("dcquxian"), "选择一名角色,攻击范围内包含其的角色可以对其使用【杀】") + .set("ai", target => { + const player = get.player(); + return -get.attitude(player, target); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0], + targets = game.filterPlayer(current => current != player && current.inRange(target)).sortBySeat(); + if (!targets.length) return; + const sha = [], + nosha = []; + while (targets.length) { + const current = targets.shift(); + const bool = await current + .chooseToUse(function (card, player, event) { + if (get.name(card) != "sha") return false; + return lib.filter.filterCard.apply(this, arguments); + }, "驱险:是否对" + get.translation(target) + "使用一张杀?") + .set("targetRequired", true) + .set("complexSelect", true) + .set("filterTarget", function (card, player, target) { + if (target != _status.event.sourcex && !ui.selected.targets.includes(_status.event.sourcex)) return false; + return lib.filter.targetEnabled.apply(this, arguments); + }) + .set("sourcex", target) + .set("addCount", false) + .forResultBool(); + if (bool) sha.push(current); + else nosha.push(current); + } + if (!target.hasHistory("damage", evt => evt.getParent().type == "card" && evt.getParent(4) == event) && sha.length && nosha.length) { + for (const i of nosha) await i.loseHp(sha.length); + } + }, + }, + //韩嵩 + dcyinbi: { + mod: { + targetInRange(card, player) { + if (!game.hasPlayer(current => current != player && current.countCards("h") == player.countCards("h"))) return true; + }, + cardUsable(card, player) { + if (!game.hasPlayer(current => current != player && current.countCards("h") == player.countCards("h"))) return Infinity; + }, + maxHandcardBase(player) { + if (_status.dcyinbi) return; + _status.dcyinbi = true; + const num = Math.max(...game.filterPlayer().map(target => target.getHandcardLimit())); + delete _status.dcyinbi; + return num; + }, + }, + }, + dcshuaiyan: { + audio: 2, + trigger: { + global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + filter(event, player, name, target) { + return target && target.countCards("h") == player.countCards("h"); + }, + getIndex(event, player) { + return game + .filterPlayer(target => { + if (target == player) return false; + if (event.getg && event.getg(target) && event.getg(target).length && target.countCards("h") == player.countCards("h")) return true; + const evt = event.getl(target); + if (evt && evt.hs && evt.hs.length && target.countCards("h") == player.countCards("h")) return true; + return false; + }) + .sortBySeat(); + }, + logTarget(event, player, triggername, target) { + return target; + }, + forced: true, + async content(event, trigger, player) { + const target = event.targets[0], + goon = target.countDiscardableCards(player, "he"); + let result; + if (goon) + result = await player + .chooseControl() + .set("choiceList", ["弃置" + get.translation(target) + "的一张牌", "摸一张牌"]) + .set("ai", () => { + const player = get.player(); + const eff1 = get.effect(get.event("target"), { name: "guohe_copy2" }, player, player); + const eff2 = get.effect(player, { name: "draw" }, player, player); + return eff1 > eff2 ? 0 : 1; + }) + .set("target", target) + .forResult(); + else result = { index: 1 }; + if (result.index == 0) player.discardPlayerCard(target, "he", true); + else player.draw(); + }, + }, + //侧肘 + dcshefu: { + audio: 2, + trigger: { + player: "damageBegin2", + source: "damageBegin1", + }, + filter(event, player) { + if (!event.source || event.source == event.player) return false; + const evt = event.getParent(2); + return evt && evt.name == "useCard"; + }, + forced: true, + logTarget(event, player) { + return event.source == player ? event.player : event.source; + }, + content() { + const evt = trigger.getParent(2); + const cards = evt.cards.filter(card => { + if (trigger.source._start_cards.includes(card)) return true; + return trigger.source.getAllHistory("gain", evt => { + return evt.cards.includes(card); + }).length; + }); + trigger.num = + cards.length + + cards.reduce((sum, card) => { + let num = 0, + history = trigger.source.actionHistory; + for (let i = history.length - 1; i >= 0; i--) { + if (history[i].gain.some(evtx => evtx.cards.includes(card))) break; + if (history[i].isRound) num++; + if (i == 0 && trigger.source._start_cards.includes(card)) num--; + } + return sum + num; + }, 0); + }, + ai: { + effect: { + target(card, player, target) { + if (target == player || !get.tag(card, "damage")) return; + if (!(card.cards || []).length) return "zeroplayertarget"; + }, + player: function () { + return lib.skill.dcshefu.ai.effect.target.apply(this, arguments); + }, + }, + }, + }, + dcpigua: { + audio: 2, + trigger: { source: "damageSource" }, + filter(event, player) { + if (event.player == player) return false; + return event.num > 1 && event.player.isIn() && event.player.countCards("he") && game.roundNumber > 0; + }, + async cost(event, trigger, player) { + const target = trigger.player; + let result = await player.gainPlayerCard(target, "he", [1, game.roundNumber]).set("prompt", get.prompt2("dcpigua", target)).set("logSkill", ["dcpigua", target]).forResult(); + result.bool = Boolean((result.cards || []).length); + event.result = result; + }, + popup: false, + async content(event, trigger, player) { + player.addTempSkill("dcpigua_effect"); + player.addGaintag(event.cards, "dcpigua_effect"); + }, + subSkill: { + effect: { + charlotte: true, + onremove(player, skill) { + player.removeGaintag(skill); + }, + mod: { + ignoredHandcard(card) { + if (card.hasGaintag("dcpigua_effect")) return true; + }, + cardDiscardable(card, _, name) { + if (name == "phaseDiscard" && card.hasGaintag("dcpigua_effect")) return false; + }, + }, + }, + }, + }, + //星张昭 + starzhongyan: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return game.hasPlayer(current => get.info("starzhongyan").filterTarget(null, player, current)); + }, + filterTarget(card, player, target) { + return target.countCards("h"); + }, + async content(event, trigger, player) { + const target = event.targets[0], + topCards = get.cards(3); + await game.cardsGotoOrdering(topCards); + await player.showCards(topCards, get.translation(player) + "发动了【忠言】"); + if (!target.countCards("h")) return; + const result = await target + .chooseToMove("忠言:交换其中一张牌") + .set("list", [ + ["牌堆顶", topCards], + ["你的手牌", target.getCards("h")], + ]) + .set("filterMove", (from, to, moved) => { + if (typeof to == "number") return false; + var player = _status.event.player; + var hs = player.getCards("h"); + var changed = hs.filter(function (card) { + return !moved[1].includes(card); + }); + var changed2 = moved[1].filter(function (card) { + return !hs.includes(card); + }); + if (changed.length < 1) return true; + var pos1 = moved[0].includes(from.link) ? 0 : 1, + pos2 = moved[0].includes(to.link) ? 0 : 1; + if (pos1 == pos2) return true; + if (pos1 == 0) { + if (changed.includes(from.link)) return true; + return changed2.includes(to.link); + } + if (changed2.includes(from.link)) return true; + return changed.includes(to.link); + }) + .set("filterOk", moved => { + return moved[0].filter(card => get.owner(card)).length == 1; + }) + .set("processAI", function (list) { + var cards1 = list[0][1].slice(), + cards2 = list[1][1].slice(); + var card1 = cards1.sort((a, b) => get.value(b) - get.value(a))[0]; + var card2 = cards2.sort((a, b) => get.value(a) - get.value(b))[0]; + if (card1 && card2 && get.value(card1) > get.value(card2)) { + cards1.remove(card1); + cards2.remove(card2); + cards1.push(card2); + cards2.push(card1); + } + return [cards1, cards2]; + }) + .forResult(); + if (result.bool) { + const lose = result.moved[0].slice(); + const gain = result.moved[1].slice().filter(i => !get.owner(i)); + if (lose.some(i => get.owner(i))) + await target.lose( + lose.filter(i => get.owner(i)), + ui.special + ); + for (let i = lose.length - 1; i--; i >= 0) { + ui.cardPile.insertBefore(lose[i], ui.cardPile.firstChild); + } + game.updateRoundNumber(); + if (gain.length) await target.gain(gain, "draw"); + if (lose.map(card => get.color(card)).toUniqued().length == 1) { + const chosen = [], + list = player != target ? [target, player] : [target]; + for (const current of list) { + const goon = game.hasPlayer(i => i.countGainableCards(current, "ej")); + const choices = []; + const choiceList = ["回复1点体力", "获得场上一张牌"]; + if (current.isDamaged() && !chosen.includes("选项一")) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if (goon && !chosen.includes("选项二")) choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + if (!choices.length) continue; + const control = + choices.length == 1 + ? choices[0] + : await current + .chooseControl(choices) + .set("choiceList", choiceList) + .set("prompt", "忠言:请选择一项") + .set("ai", () => { + const player = get.player(); + const eff2 = get.recoverEffect(player, player, player); + return eff2 ? 0 : 1; + }) + .forResultControl(); + chosen.push(control); + if (control == "选项一") { + await current.recover(); + } else { + const targets = await current + .chooseTarget("获得一名角色场上的一张牌", true, (card, player, target) => { + const targetx = get.event("targetx"); + return target.countGainableCards(targetx, "ej") > 0; + }) + .set("ai", target => { + const player = get.player(); + let att = get.attitude(player, target); + if (att < 0) att = -Math.sqrt(-att); + else att = Math.sqrt(att); + return att * lib.card.shunshou.ai.result.target(player, target); + }) + .set("targetx", current) + .forResultTargets(); + await current.gainPlayerCard(targets[0], "ej", true); + } + } + } + } else { + for (let i = topCards.length - 1; i--; i >= 0) { + ui.cardPile.insertBefore(topCards[i], ui.cardPile.firstChild); + } + game.updateRoundNumber(); + } + }, + ai: { + order: 8, + result: { + player: 1, + target: 1, + }, + }, + }, + starjinglun: { + audio: 2, + trigger: { + global: "damageSource", + }, + filter(event, player) { + const target = event.source; + return target && target.isIn() && get.distance(player, target) <= 1; + }, + check(event, player) { + return get.attitude(player, event.source) > 0; + }, + usable:1, + logTarget: "source", + async content(event, trigger, player) { + const target = trigger.source, + num = target.countCards("e"); + if (num) await target.draw(num); + await player.useSkill("starzhongyan", [target]); + }, + }, //星孙坚 starruijun: { audio: 2, @@ -183,38 +722,41 @@ game.import("character", function () { 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: { @@ -1094,7 +1636,9 @@ game.import("character", function () { 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; } @@ -1323,11 +1867,8 @@ game.import("character", function () { trigger: { player: "phaseEnd", global: "die" }, filter: function (event, player) { if (event.name == "phase") return player.hasMark("starpizhi"); - if ( - !player.getStorage("starcanxi_wangsheng").includes(event.player.group) && - !player.getStorage("starcanxi_xiangsi").includes(event.player.group) - ) - return false; + 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)); return groups.includes(event.player.group); @@ -1347,6 +1888,8 @@ game.import("character", function () { } "step 1"; player.draw(player.countMark("starpizhi")); + "step 2" + if (player.isDamaged() && trigger.name == "die") player.recover(); }, intro: { content: "已失去#个“玺角”" }, ai: { combo: "starcanxi" }, @@ -1498,6 +2041,180 @@ game.import("character", function () { }, }, }, + //星孙尚香 + 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, @@ -1963,8 +2680,11 @@ game.import("character", function () { 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: { @@ -2705,7 +3425,7 @@ game.import("character", function () { player.addTempSkill("dcmoukui_conseq"); player.markAuto("dcmoukui_conseq", [trigger.card]); } - } + } else event.finish(); "step 2"; player.discardPlayerCard( event.directtarget || result.targets[0], @@ -2820,11 +3540,13 @@ game.import("character", function () { event.getParent().triggeredTargets3.length == event.targets.length ); }, + /* check: function (event, player) { return event.targets.some( (target) => get.effect(target, event.card, player, player) <= 0 ); }, + */ content: function () { "step 0"; var num = player.countCards("e") + 1; @@ -2833,11 +3555,7 @@ game.import("character", function () { "step 1"; var num = Math.min(trigger.targets.length, num); player - .chooseTarget( - "铤险:令此杀对其中至多" + get.cnNumber(num) + "个目标无效", - [1, num], - true, - (card, player, target) => { + .chooseTarget("铤险:是否令此杀对其中至多" + get.cnNumber(num) + "个目标无效?", [1, num], (card, player, target) => { return _status.event.getTrigger().targets.includes(target); } ) @@ -2858,6 +3576,7 @@ game.import("character", function () { trigger.getParent().excluded.addArray(result.targets); } }, + /* ai: { effect: { player: function (card, player, target) { @@ -2886,6 +3605,7 @@ game.import("character", function () { }, }, }, + */ }, dcbenshi: { audio: 2, @@ -2907,6 +3627,7 @@ game.import("character", function () { }, content: function () {}, mod: { + /* attackRangeBase: function (player, num) { if (num !== "unchanged") return num; var range = 1; @@ -2925,8 +3646,9 @@ game.import("character", function () { } return range; }, + */ attackRange: function (player, num) { - return num + 1; + if (!player.getEquips(1).length) return num + 1; }, selectTarget: function (card, player, range) { if (card.name == "sha") { @@ -4104,7 +4826,7 @@ game.import("character", function () { } }, ai: { - halfneg: true + neg: true, }, }, xiongrao: { @@ -4145,13 +4867,7 @@ game.import("character", function () { locked: true, skillBlocker: function (skill, player) { var info = get.info(skill); - return ( - info && - !info.charlotte && - !get.is.locked(skill) && - !info.limited && - !info.juexingji - ); + return info && !info.charlotte && !info.persevereSkill && !get.is.locked(skill) && !info.limited && !info.juexingji; }, mark: true, marktext: "扰", @@ -4639,7 +5355,6 @@ game.import("character", function () { } }, logTarget: "player", - shaRelated: true, content: function () { "step 0"; if (player != game.me && !player.isOnline() && !player.isUnderControl()) game.delayx(); @@ -5692,7 +6407,7 @@ game.import("character", function () { 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) { @@ -5872,7 +6587,6 @@ game.import("character", function () { chuanyun: { audio: true, trigger: { player: "useCardToPlayered" }, - shaRelated: true, filter: function (event, player) { return event.card.name == "sha" && event.target.countCards("e") > 0; }, @@ -6777,11 +7491,9 @@ game.import("character", function () { 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; @@ -6865,26 +7577,27 @@ game.import("character", function () { player.logSkill("rehuoshui", targets); event.targets = targets; targets[0].addTempSkill("fengyin"); - if (targets.length < 2) event.goto(5); + if (targets.length < 2) event.goto(6); } else event.finish(); "step 2"; - if (targets[1].countCards("h") == 0) event.goto(targets.length > 2 ? 4 : 5); + if (targets[1].countCards("h") == 0) event.goto(targets.length > 2 ? 4 : 6); else targets[1].chooseCard("h", true, "交给" + get.translation(player) + "一张手牌"); "step 3"; if (result.bool) { targets[1].give(result.cards, player); } + "step 4"; if (targets.length < 3) { - event.goto(5); + event.goto(6); } else { targets.splice(0, 2); } - "step 4"; + "step 5"; var target = targets.shift(); var num = target.countCards("e"); if (num > 0) target.chooseToDiscard("e", true, num); if (targets.length > 0) event.redo(); - "step 5"; + "step 6"; game.delayx(); }, }, @@ -7194,6 +7907,9 @@ game.import("character", function () { 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, @@ -7422,7 +8138,6 @@ game.import("character", function () { //张横 dangzai: { trigger: { player: "phaseUseBegin" }, - direct: true, filter: function (event, player) { return ( !player.isDisabledJudge() && @@ -7436,9 +8151,8 @@ game.import("character", function () { }) ); }, - content: function () { - "step 0"; - player.chooseTarget( + async cost(event, trigger, player) { + event.result = await player.chooseTarget( function (card, player, target) { return ( target != player && @@ -7448,27 +8162,25 @@ game.import("character", function () { ); }, 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); + } } } }, @@ -7486,7 +8198,6 @@ game.import("character", function () { }, forced: true, filter: function (event, player) { - if (player.hp <= 1) return false; 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") @@ -7502,9 +8213,23 @@ game.import("character", function () { } return false; }, - content: function () { - player.loseHp(); - player.draw(2); + getIndex: function (event, player, triggername) { + if (event.player == player) { + if (event.name == "equip" && get.color(event.card, player) == "black") return 1; + if (event.name == "addJudge" && get.color(event.cards[0], player) == "black") return 1; + } + let evt = event.getl(player), num = 0; + 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") num++; + } + return num + }, + async content(event, trigger, player) { + await player.draw(2); + if (player.hp > 1) await player.loseHp(); }, }, //狼灭 @@ -7922,8 +8647,10 @@ game.import("character", function () { 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); + } } }, }, @@ -8037,6 +8764,9 @@ game.import("character", function () { player.addTempSkill("csyizheng2", { player: "phaseBegin" }); } }, + ai: { + combo: "cslilu" + }, }, csyizheng2: { audio: "csyizheng", @@ -10091,6 +10821,31 @@ game.import("character", function () { ai: { jueqing: true, }, + init(player) { + game.addGlobalSkill("gangzhi_jueqing"); + }, + onremove(player) { + game.removeGlobalSkill("gangzhi_jueqing"); + }, + subSkill: { + jueqing: { + trigger: {player: "dieAfter"}, + filter(event, player) { + return !game.hasPlayer(cur => cur.hasSkill("gangzhi")); + }, + silent: true, + forceDie: true, + content() { + game.removeGlobalSkill("gangzhi_jueqing"); + }, + ai: { + jueqing: true, + skillTagFilter(player, tag, arg) { + if (tag === "jueqing") return arg && arg.hasSkill("gangzhi"); + } + } + } + }, }, beizhan: { trigger: { player: "phaseJieshuBegin" }, @@ -13297,47 +14052,58 @@ game.import("character", function () { }, }, xinfu_xingzhao: { - audio: true, + audio: 2, group: ["xz_xunxun", "xinfu_xingzhao2", "xinfu_xingzhao3"], + trigger: { + player: "loseAfter", + global: ["equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], + }, + forced: true, + filter: function (event, player) { + if ( + game.countPlayer(function (current) { + return current.isDamaged(); + }) < 2 + ) + return false; + const evt = event.getl(player); + if (event.name == "equip" && event.player == player) return true; + return evt && evt.es.length; + }, + getIndex(event, player) { + const evt = event.getl(player); + if (event.name == "equip" && event.player == player && evt && evt.es.length) return 2; + return 1; + }, + content: function () { + player.draw(); + }, + derivation: "xz_xunxun", mark: true, intro: { content: function (storage, player) { var num = game.countPlayer(function (current) { return current.isDamaged(); }); - var str = "暂无任何效果"; + var str = "
  • 造成的伤害+1"; if (num >= 1) { str = "
  • 视为拥有技能“恂恂”"; } if (num >= 2) { - str += ";使用装备牌时摸一张牌"; + str += "
  • 装备牌进入或离开你的装备区时摸一张牌"; } if (num >= 3) { - str += ";始终跳过弃牌阶段"; + str += "
  • 始终跳过弃牌阶段"; } - if (num == 0 || num >= 4) { - str += ";造成的伤害+1"; + if (num >= 4) { + str += "
  • 造成的伤害+1"; } return str; }, }, - trigger: { - player: "useCard", - }, - forced: true, - filter: function (event, player) { - if (get.type(event.card) != "equip") return false; - var num = game.countPlayer(function (current) { - return current.isDamaged(); - }); - return num >= 2; - }, - content: function () { - player.draw(); - }, }, xinfu_xingzhao2: { - audio: true, + audio: "xinfu_xingzhao", trigger: { player: ["phaseJudgeBefore", "phaseDiscardBefore"], }, @@ -13786,6 +14552,7 @@ game.import("character", function () { }, card: {}, characterIntro: { + liqueguosi: "请分别查看「李傕」和「郭汜」的武将介绍。", tangji: "唐姬,会稽太守唐瑁女,弘农怀王刘辩的妃子。刘辩死后,唐姬回归故里,因节烈不愿改嫁他人,后被汉献帝下诏封为弘农王妃。", lijue: "李傕(一说“傕”读音“què”)(?—198年),字稚然。北地郡泥阳县(今陕西省耀县)人,汉末群雄之一。东汉末年汉献帝时的军阀、权臣,官至大司马、车骑将军、开府、领司隶校尉、假节。
    李傕本为董卓部将,后被董卓的女婿牛辅派遣至中牟与朱儁交战,大破朱儁,进而至陈留、颍川等地劫掠。初平三年(192年)董卓和牛辅被杀后,李傕归无所依,于是采用贾诩之谋,伙同郭汜、张济、樊稠等原董卓部曲将攻向长安。击败吕布,杀死王允等人,占领长安,把持朝廷大权。后诸将不和,李傕在会议上杀死了樊稠,又与郭汜分别劫持了汉献帝和众臣,相互交战,张济率兵赶来和解,于是二人罢兵,李傕出屯池阳黄白城,郭汜、张济等人随汉献帝东归前往弘农。
    后来,李傕、郭汜、张济反悔,联合起来追击汉献帝,与杨奉、董承等人几番交战。汉献帝一路逃亡,狼狈不堪,到达安邑,与李傕等人讲和。不久,汉献帝被曹操迎往许都。建安三年(198年),曹操派谒者仆射裴茂召集关西诸将段煨等人征讨李傕,灭其三族。", zhangji: @@ -13891,6 +14658,10 @@ game.import("character", function () { "关羽,字云长。曾水淹七军、擒于禁、斩庞德、威震华夏,吓得曹操差点迁都躲避,但是东吴偷袭荆州,关羽兵败被害。后传说吕蒙因关羽之魂索命而死。", liuling: "刘伶(约221年-约300年),字伯伦,西晋沛国(治今安徽濉溪县西北)人,竹林七贤之一,中国魏晋时期作家,名士。
    刘伶自幼便失去了父爱,因其父亲身材矮小,及至长大成人后,刘伶身高也不过六尺。魏齐王曹芳正始之末(249年),刘伶已成为当世名重一时的名士,并且常与嵇康、阮籍、阮咸集会于山阳竹林之下,饮酒赋诗,弹琴作歌。晋武帝司马炎泰始初年(265年)前后,曾做过一段时间的建威参军,不久朝廷下诏,入宫中策问。他大谈老庄,强调无为而治,非但没有得到重用,反而连参军之职也被罢免了,从此再无仕进。晋惠帝司马衷永康元年(300年)前后,以寿而终。
    刘伶有“品酒第一人”的美称,也被酒行业传颂至今,后人以古瀑河边上的井水酿酒,还取刘伶墓地的黄土垒成窖池酿酒,为了纪念刘伶,当地百姓也将“润泉涌”更名为“刘伶醉”。其传世作品仅有《酒德颂》《北芒客舍》两篇,其中《酒德颂》所表现出的藐视一切存在的气概,敌视礼教之士的反抗精神,既高扬了人格的力量,批判了当时的黑暗政治,同时也抒发了压抑的愤世之情,充满了浪漫色彩,气魄豪迈,用辞又骈偶间行,有无意追求而自至的特点,对后代影响极大。", + chezhou: "车胄(?-199年至200年),东汉末年武将,为曹操所置徐州刺史。建安四年,左将军刘备率军出征,前往下邳,于同年或次年杀死车胄。", + hansong: "韩嵩(生卒年不详),字德高,南阳人。少好学,贫不改操。不应三公辟命,与同好数人隐居郦西山中。后担任刘表手下的别驾,转为从事中郎。出使许都,被拜为侍中,迁零陵太守。建安十三年(208年),韩嵩与蒯越、傅巽劝刘琮降曹。曹操平定荆州后,拜韩嵩为大鸿胪。", + matie: "马铁(?-212年),扶风茂陵(今陕西兴平)人。马腾之子,马超之弟。马腾遭韩遂进攻,乃携马铁等入京受职。马铁被封为骑都尉。后在邺城居住。因其兄马超反曹而被曹操夷灭。", + mp_wangrong: "王戎(234年-305年7月11日),字濬冲。琅玡郡临沂县(今山东省临沂市白沙埠镇诸葛村)人。祖父为三国魏幽州刺史王雄,曹魏凉州刺史王浑的儿子。三国至西晋时期名士、官员,“竹林七贤”之一。
    王戎出身琅玡王氏。自少神采秀美,长于清谈,以精辟的品评与识鉴而著称,以聪颖知名,为父辈好友、名士阮籍器重,后人视之为玄学名士。初袭父爵贞陵亭侯,被大将军司马昭辟为掾属。累官豫州刺史、建威将军,参与晋灭吴之战。战后以功进封安丰县侯,故人称“王安丰”。治理荆州时,他拉拢士人,颇有成效。后历任侍中、光禄勋、吏部尚书、太子太傅、中书令、尚书左仆射等职。元康七年(296年),升任司徒,位列三公。王戎认为天下将乱,于是不理世事,以山水游玩为乐。赵王司马伦发动政变时,王戎被牵连免官。之后被起用为尚书令,再迁司徒。右将军张方劫持晋惠帝入长安后,王戎逃奔郏县。
    永兴二年(305年),王戎去世,时年七十二,谥号为“元”。", }, characterTitle: { chunyuqiong: "#b对决限定武将", @@ -13970,8 +14741,9 @@ game.import("character", function () { jsp_guanyu: ["jsp_guanyu", "dc_jsp_guanyu", "jsrg_guanyu"], mushun: ["mushun", "sp_mushun"], wangjun: ["dc_wangjun", "wangjun"], - zoushi: ["re_zoushi", "jsrg_zoushi"], + re_zoushi: ["re_zoushi", "jsrg_zoushi", "yue_zoushi"], zhangmancheng: ["dc_zhangmancheng", "tw_zhangmancheng"], + xf_huangquan: ["xf_huangquan", "dc_huangquan"], }, translate: { lijue: "李傕", @@ -14044,8 +14816,7 @@ game.import("character", function () { xz_xunxun_info: "摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", xinfu_xingzhao: "兴棹", - xinfu_xingzhao_info: - "锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,判定阶段或弃牌阶段开始时,你跳过此阶段。若X=0或X≥4,当你造成伤害时,此伤害+1(X为场上已受伤的角色数)。", + xinfu_xingzhao_info: "锁定技。若场上已受伤的角色数:≥1,你视为拥有技能〖恂恂〗;X≥2,有装备牌进入或离开你的装备区时,你摸一张牌;X≥3,判定阶段或弃牌阶段开始时,你跳过此阶段;为0或≥4,当你造成伤害时,此伤害+1。", xinfu_xingzhao2: "兴棹", xinfu_xingzhao2_info: "", xinfu_xingzhao3: "兴棹", @@ -14341,8 +15112,7 @@ game.import("character", function () { csyizheng_info: "结束阶段开始时,你可以选择一名其他角色。你的下回合开始前,当该角色造成伤害或回复体力时,若其体力上限小于你,则你减1点体力上限,且令此伤害值/回复值+1。", reyirang: "揖让", - reyirang_info: - "出牌阶段开始时,你可以将所有非基本牌交给一名其他角色。若其体力上限大于你,则你将体力上限调整至与其相同。然后你回复X点体力(X为你以此法交给其的牌数)。", + reyirang_info: "出牌阶段开始时,你可以将所有非基本牌交给一名其他角色。若其体力上限大于你,则你将体力上限调整至与其相同并回复X点体力(X为你以此法交给其的牌数)。", liangxing: "梁兴", lulve: "掳掠", lulve_info: @@ -14374,10 +15144,9 @@ game.import("character", function () { "其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以摸一张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。", zhangheng: "张横", dangzai: "挡灾", - dangzai_info: "出牌阶段开始时,你可将一名其他角色判定区内的一张牌移动至你的判定区内。", + dangzai_info: "出牌阶段开始时,你可将一名其他角色判定区内的任意张牌移动至你的判定区内。", liangjue: "粮绝", - liangjue_info: - "锁定技,当有黑色牌进入或者离开你的判定区或装备区后,若你的体力值大于1,你失去1点体力,然后摸两张牌。", + liangjue_info: "锁定技,每有1张黑色牌进入或者离开你的判定区或装备区后,你摸两张牌,然后若你的体力值大于1,你失去1点体力。", tangji: "唐姬", kangge: "抗歌", kangge_info: @@ -14387,8 +15156,7 @@ game.import("character", function () { "当你受到除自己和“抗歌”角色以外的角色造成的伤害时,你可以防止此伤害并选择一种花色,然后你失去X点体力,令“抗歌”角色从弃牌堆中随机获得X张此花色的牌(X为伤害值)。", re_dongcheng: "董承", xuezhao: "血诏", - xuezhao_info: - "出牌阶段限一次,你可弃置一张手牌并选择至多X名其他角色(X为你的体力上限)。这些角色依次选择是否交给你一张牌,若选择是,该角色摸一张牌且你本回合可多使用一张【杀】;若选择否,该角色本回合无法响应你使用的牌。", + xuezhao_info: "出牌阶段限一次,你可弃置一张手牌并选择至多X名其他角色(X为你的体力上限)。这些角色依次选择是否交给你一张牌,若选择是,该角色摸一张牌且你本回合可多使用一张【杀】;若选择否,该角色本回合无法响应你使用的牌。若没有角色交给你牌,你将手牌摸至体力上限。", re_hucheer: "胡车儿", redaoji: "盗戟", redaoji2: "盗戟", @@ -14411,8 +15179,7 @@ game.import("character", function () { reqingcheng_info: "出牌阶段限一次,你可以与一名手牌数不大于你的男性角色交换手牌。", caoanmin: "曹安民", xianwei: "险卫", - xianwei_info: - "锁定技,准备阶段,你废除一个装备栏并摸X张牌(X为你未废除的装备栏数),然后你可以令一名其他角色对其自己使用一张牌堆中的一张与此装备栏副类别相同的装备牌(没有可使用的牌则改为摸一张牌)。当你废除所有装备栏后,你加2点体力上限,然后你与所有其他角色视为在彼此的攻击范围内。", + xianwei_info: "锁定技,准备阶段,你废除一个装备栏并摸X张牌(X为你未废除的装备栏数),然后你令一名其他角色对其自己使用一张牌堆中的一张与此装备栏副类别相同的装备牌(没有可使用的牌则改为摸一张牌)。当你废除所有装备栏后,你加2点体力上限,然后你与所有其他角色视为在彼此的攻击范围内。", dufuren: "杜夫人", yise: "异色", yise_info: @@ -14471,11 +15238,9 @@ game.import("character", function () { chuanyun_info: "当你使用【杀】指定目标后,你可令目标角色随机弃置其装备区内的一张牌。", zhangning: "张宁", tianze: "天则", - tianze_info: - "①每回合限触发一次。其他角色于其出牌阶段内使用的黑色手牌结算结束后,你可以弃置一张黑色牌,并对其造成1点伤害。②其他角色的判定生效后,若结果为黑色,则你摸一张牌。", + tianze_info: "①其他角色于其出牌阶段内使用的第一张黑色手牌结算结束后,你可以弃置一张黑色牌,并对其造成1点伤害。②其他角色的判定生效后,若结果为黑色,则你摸一张牌。", difa: "地法", - difa_info: - "每回合限一次。当你于回合内因摸牌而得到红色牌时,你可以弃置之。然后你选择一个锦囊牌的牌名,并从牌堆中获得一张此牌名的牌。", + difa_info: "每回合限一次。当你于回合内得到红色牌时,你可以弃置之。然后你选择一个锦囊牌的牌名,并从牌堆中获得一张此牌名的牌。", xinping: "辛评", fuyuan: "辅袁", fuyuan_info: @@ -14601,11 +15366,9 @@ game.import("character", function () { "出牌阶段结束时,若你于此阶段使用过的牌数不小于体力值,你可以选择一项:1.令装备区牌数多于你的角色各摸一张牌;2.弃置装备区牌数少于你的角色各一张手牌。", sunlang: "孙狼", dctingxian: "铤险", - dctingxian_info: - "每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后令此【杀】对其中至多X个目标无效(X为你装备区的牌数+1)。", + dctingxian_info: "每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后可以令此【杀】对其中至多X个目标无效(X为你装备区的牌数+1)。", dcbenshi: "奔矢", - dcbenshi_info: - "锁定技。①你的攻击范围+1。②你的攻击范围基数不受装备区内武器牌的影响。③由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。", + dcbenshi_info: "锁定技。①若你未装备武器牌,则你的攻击范围+1。②由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。", sunhuan: "孙桓", dcniji: "逆击", dcniji_info: @@ -14638,8 +15401,7 @@ game.import("character", function () { dc_jsp_guanyu: "新杀SP关羽", dc_jsp_guanyu_prefix: "新杀SP", dcdanji: "单骑", - dcdanji_info: - "觉醒技。准备阶段,若你区域内的牌数大于体力值,你减1点体力上限,将体力回复至体力上限并摸等同于体力值的牌,然后获得〖马术〗和〖怒嗔〗。", + dcdanji_info: "觉醒技。准备阶段,若你区域内的牌数大于体力值,你减1点体力上限,将体力回复至体力上限并摸等量张牌,然后获得〖马术〗和〖怒嗔〗。", dcnuchen: "怒嗔", dcnuchen_info: "出牌阶段限一次。你可以展示一名其他角色的一张手牌,然后选择一项:1.弃置任意张该花色的牌,对其造成等量伤害;2.获得该角色手牌中所有此花色的牌。", @@ -14673,11 +15435,9 @@ game.import("character", function () { starcanxi_wangsheng: "妄生", starcanxi_xiangsi: "向死", starcanxi_cancel: "向死", - starcanxi_info: - "锁定技。①游戏开始时,你获得场上所有角色的势力对应的“玺角”标记。②一轮游戏开始时,你选择一个“玺角”对应势力并选择以下一项:1.妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1;2.向死:本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。", + starcanxi_info: "锁定技。①游戏开始时,你获得场上所有角色的势力对应的“玺角”标记(每少一个“玺角”则增加1点体力上限)。②一轮游戏开始时,你选择一个“玺角”对应势力并选择以下一项:1.妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1;2.向死:本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。", starpizhi: "圮秩", - starpizhi_info: - "锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记且你本轮发动〖向死〗的势力与其相同,你失去之并摸X张牌。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)", + starpizhi_info: "锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记且你本轮发动〖向死〗的势力与其相同,或其是该势力最后一名角色,你失去之,然后摸X张牌并回复1点体力。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)", starzhonggu: "冢骨", starzhonggu_info: "主公技,锁定技。摸牌阶段,若游戏轮数大于等于场上的群势力角色数,则你额外摸两张牌,否则你少摸一张牌。", @@ -14714,6 +15474,12 @@ game.import("character", function () { starminghui: "明慧", starminghui_info: "一名角色的回合结束时,若你的手牌数:最少,你可以视为使用一张无距离限制的【杀】;最多,你可以将手牌弃置至你手牌数不为最多,然后令一名角色回复1点体力。", + star_sunshangxiang: "星孙尚香", + star_sunshangxiang_prefix: "星", + starsaying: "飒影", + starsaying_info: "每轮每种牌名限一次,你需要使用【杀】或【闪】时,你可以使用一张装备牌,视为使用之;你需要使用【桃】或【酒】时,你可以收回装备区里的一张牌,视为使用之。", + starjiaohao: "骄豪", + starjiaohao_info: "出牌阶段限一次,你可以与一名装备区牌数不大于你的角色拼点,然后你可令赢的角色获得拼点牌或令其使用一张【杀】。", liqueguosi: "李傕郭汜", xiongsuan: "凶算", xiongsuan_info: @@ -14721,9 +15487,35 @@ game.import("character", function () { 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: "星张昭", + star_zhangzhao_prefix: "星", + starzhongyan: "忠言", + starzhongyan_info: "出牌阶段限一次,你可展示牌堆顶三张牌,然后令一名角色将一张手牌与其中一张牌交换。然后若这些牌颜色相同,其回复1点体力或获得场上一张牌。然后若该角色不为你,你执行其未执行的一项。", + starjinglun: "经纶", + starjinglun_info: "每回合限一次,当你距离1以内的角色造成伤害后,你可以令其摸X张牌并对其发动〖忠言〗(X为其装备区的牌数)。", + chezhou: "车胄", + dcshefu: "慑伏", + dcshefu_info: "锁定技。你对其他角色/其他角色对你使用牌造成的伤害改为X(X为此牌对应的所有实体牌最近一次被伤害来源获得后至现在经过的轮次数之和)。", + dcpigua: "披挂", + dcpigua_info: "当你对一名其他角色造成超过1点伤害后,你可以获得其至多等同于游戏轮次的牌,这些牌本回合不计入你的手牌上限。", + hansong: "韩嵩", + dcyinbi: "隐避", + dcyinbi_info: "锁定技。①你的手牌上限与场上手牌上限最多的角色相同。②若没有其他角色的手牌数与你相等,则你使用牌无距离和次数限制。", + dcshuaiyan: "率言", + dcshuaiyan_info: "锁定技,其他角色手牌数变化后,若与你相等,你弃置其一张牌或摸一张牌。", + matie: "马铁", + dczhuiwang: "追亡", + dczhuiwang_info: "锁定技,你计算体力值小于等于你的角色的距离视为1。", + dcquxian: "驱险", + dcquxian_info: "出牌阶段开始时,你可以选择一名角色,攻击范围内包含其的其他角色可以依次对其使用一张【杀】。若其未以此法受到伤害,这些角色中未使用【杀】的角色失去X点体力(X为这些角色中使用【杀】的角色数)。", + mp_wangrong: "王戎", + mpqianlin: "俭吝", + mpqianlin_info: "每回合结束后,若本回合你有基本牌因使用、打出或弃置而进入弃牌堆,则你可以选择其中一张牌获得之。", + mpsixiao: "死孝", + mpsixiao_info: "锁定技,游戏开始时,你选择一名其他角色。每回合限一次,当该角色需要使用或打出除【无懈可击】外的牌时,其可以观看你的手牌并可以使用或打出其中一张牌,然后你摸一张牌。", sp_whlw: "文和乱武", sp_zlzy: "逐鹿中原", @@ -14739,6 +15531,7 @@ game.import("character", function () { sp_zhongyuan: "列传·中原狼烟", sp_binglin: "兵临城下", sp_xiaohu: "列传·虓虎悲歌", + sp_qunxiong: "列传·群雄伺动", sp_fenghuo: "烽火连天", sp_danqi: "千里单骑", sp_star: "将星系列", diff --git a/character/standard.js b/character/standard.js index 27451196..8871eedf 100644 --- a/character/standard.js +++ b/character/standard.js @@ -174,7 +174,7 @@ game.import("character", function () { 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, @@ -189,8 +189,11 @@ game.import("character", function () { unique: true, limited: true, audio: "xiongyi", + enable: "phaseUse", filterTarget: true, selectTarget: [1, Infinity], + multitarget: true, + multiline: true, skillAnimation: true, animationColor: "thunder", async content(event, trigger, player) { @@ -198,6 +201,7 @@ game.import("character", function () { const targets = event.targets.sortBySeat(); let keep = true; while (true) { + let stop = false; for (const target of targets) { let next = target .chooseToUse(function (card) { @@ -210,9 +214,13 @@ game.import("character", function () { }); if (!keep) next.set("prompt2", "若你不使用,则结束此流程"); const result = await next.forResult(); - if (!result.bool && !keep) break; - if (targets[targets.length - 1] == target && !keep) keep = true; + if (!result.bool && !keep) { + stop = true; + break; + } } + if (keep) keep = false; + if (stop) break; } }, ai: { @@ -354,6 +362,7 @@ game.import("character", function () { subSkill: { effect: { charlotte: true, + onremove: true, mod: { cardEnabled(card, player) { if (player.getStorage("stddaoshu_effect").includes(get.suit(card))) return false; @@ -378,6 +387,9 @@ game.import("character", function () { player.popup("盗书"); game.log(player, "重置了技能", "#g【盗书】"); }, + ai: { + combo: "stddaoshu" + }, }, //周处 stdxiongxia: { @@ -387,6 +399,7 @@ game.import("character", function () { selectCard: 2, position: "hes", viewAs: { name: "juedou" }, + selectTarget: 2, viewAsFilter(player) { if (player.countCards("hes") < 2) return false; }, @@ -473,6 +486,7 @@ game.import("character", function () { .sortBySeat(); if (targets.length) { for (const target of targets) { + if (!target.isIn()) continue; const next = target.chooseToUse("挥战:是否替" + get.translation(trigger.player) + "使用一张【闪】?", { name: "shan" }); next.set("ai", () => { const event = _status.event; @@ -633,7 +647,7 @@ game.import("character", function () { threaten: 0.9, effect: { target: function (card, player, target) { - if (player.hasSkillTag("jueqing")) return; + if (player.hasSkillTag("jueqing", false, target)) return; if (player._stdjinjian_tmp) return; const count = player.storage.counttrigger; if (count && count.stdjinjian_player && count.stdjinjian_player > 0) return; @@ -687,7 +701,8 @@ game.import("character", function () { (card, player, target) => { return target.getHp() == player.getHp(); }, - [1, Infinity] + [1, Infinity], + true ) .set("ai", target => { const player = get.event("player"); @@ -701,6 +716,32 @@ game.import("character", function () { 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: { @@ -732,7 +773,10 @@ game.import("character", function () { await target.loseToDiscardpile(target.getCards("h")); await target.gain(cards, "gain2").set("giver", player); if (player.isDamaged()) { - const bool = await target.chooseBool("是否令" + get.translation(player) + "回复1点体力?").forResult("bool"); + const bool = await target + .chooseBool("是否令" + get.translation(player) + "回复1点体力?") + .set("choice", get.recoverEffect(player, target, target) > 0) + .forResult("bool"); if (bool) { target.line(player); await player.recover(); @@ -766,6 +810,7 @@ game.import("character", function () { event.result = await player .chooseCardTarget({ prompt: get.prompt2("stdzhiyinmeng"), + filterTarget: lib.filter.notMe, filterCard: true, position: "he", selectCard: [1, Infinity], @@ -811,12 +856,13 @@ game.import("character", function () { (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) { @@ -1033,72 +1079,104 @@ game.import("character", function () { 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: { @@ -1112,6 +1190,7 @@ game.import("character", function () { player.draw(); }, ai: { + noe: true, effect: { target(card, player, target) { if (target.countCards("e")) return; @@ -1391,6 +1470,9 @@ game.import("character", function () { }, guicai: { audio: 2, + audioname2: { + xin_simayi: "jilue_guicai", + }, trigger: { global: "judge" }, preHidden: true, filter(event, player) { @@ -2457,7 +2539,6 @@ game.import("character", function () { }, tieji: { audio: 2, - shaRelated: true, trigger: { player: "useCardToPlayered" }, check(event, player) { return get.attitude(player, event.target) <= 0; @@ -2500,6 +2581,9 @@ game.import("character", function () { jizhi: { audio: 2, audioname: ["jianyong"], + audioname2: { + xin_simayi: "jilue_jizhi", + }, trigger: { player: "useCard" }, frequent: true, preHidden: true, @@ -2629,6 +2713,9 @@ game.import("character", function () { 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") @@ -3304,7 +3391,6 @@ game.import("character", function () { }, }, wushuang: { - shaRelated: true, audio: 2, audioname: ["re_lvbu", "shen_lvbu", "lvlingqi"], forced: true, @@ -3488,7 +3574,7 @@ game.import("character", function () { trigger.source.chooseDrawRecover(true); }, ai: { - halfneg: true, + neg: true, effect: { target(card, player, target, current) { if (card.name == "sha" && get.color(card) == "red") { @@ -3633,8 +3719,8 @@ game.import("character", function () { }, characterReplace: { caocao: ["caocao", "re_caocao", "sb_caocao", "dc_caocao"], - guojia: ["guojia", "re_guojia", "ps1059_guojia", "ps2070_guojia"], - simayi: ["simayi", "re_simayi", "jsrg_simayi", "ps_simayi", "ps2068_simayi"], + guojia: ["guojia", "re_guojia", "ps1059_guojia", "ps2070_guojia", "huan_guojia"], + simayi: ["simayi", "re_simayi", "jsrg_simayi", "ps_simayi", "ps2068_simayi", "huan_simayi"], jin_simayi: ["jin_simayi", "junk_simayi", "ps_jin_simayi"], zhenji: ["zhenji", "re_zhenji", "sb_zhenji", "yj_zhenji"], xuzhu: ["xuzhu", "re_xuzhu"], @@ -3642,52 +3728,21 @@ game.import("character", function () { 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", - ], + 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", - ], + 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"], + 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"], @@ -3846,8 +3901,7 @@ game.import("character", function () { xinjiuyuan_info_alter: "主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,其可以令你回复1点体力,然后其摸一张牌。", qixi_info: "你可以将一张黑色牌当做【过河拆桥】使用。", - keji_info: - "弃牌阶段开始时,若你于本回合的出牌阶段内没有过使用或打出过【杀】,则你可以跳过此阶段。", + keji_info: "弃牌阶段开始时,若你于本回合的出牌阶段内没有使用或打出过【杀】,则你可以跳过此阶段。", kurou_info: "出牌阶段,你可以失去1点体力,然后摸两张牌。", yingzi_info: "摸牌阶段,你可以多摸一张牌。", fanjian_info: @@ -3905,50 +3959,52 @@ game.import("character", function () { 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_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_chengyu_prefix: "少阴", std_db_wenyang: "少阴文鸯", + std_db_wenyang_prefix: "少阴", std_re_dengzhi: "少阴邓芝", + std_re_dengzhi_prefix: "少阴", std_zhangyì: "少阴张翼", + std_zhangyì_prefix: "少阴", std_chengyu: "少阴程昱", - std_fanyufeng: "少阴樊玉凤", - std_feiyi: "少阴费祎", - std_sunhao_prefix: "少阴", - std_mateng_prefix: "少阴", - std_mayunlu_prefix: "少阴", - std_jianggan_prefix: "少阴", - std_zhouchu_prefix: "少阴", - std_lvlingqi_prefix: "少阴", - std_dc_yanghu_prefix: "少阴", - std_dc_luotong_prefix: "少阴", - std_lijue_prefix: "少阴", std_chengpu_prefix: "少阴", - std_db_wenyang_prefix: "少阴", - std_re_dengzhi_prefix: "少阴", - std_zhangyì_prefix: "少阴", - 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: "游骑", @@ -3960,8 +4016,8 @@ game.import("character", function () { stddaizui: "戴罪", stddaizui_info: "锁定技,当你受到伤害后,你视为本轮未发动过〖盗书〗。", stdxiongxia: "凶侠", - stdxiongxia_info: "你可以将两张牌当作【决斗】使用。你以此法使用的【决斗】结算完毕后,若所有目标角色都受到了此牌造成的伤害,则〖凶侠〗于本回合失效。", - stdhuizhan: "挥战", + stdxiongxia_info: "你可以将两张牌当作【决斗】对两名其他角色使用。你以此法使用的【决斗】结算完毕后,若所有目标角色都受到了此牌造成的伤害,则〖凶侠〗于本回合失效。", + stdhuizhan: "挥戟", stdhuizhan_info: "你使用【杀】可以额外指定至多两个目标。若如此做,目标角色响应此【杀】时,其他目标角色可以代替其使用【闪】。", stdmingfa: "明伐", stdmingfa_info: "出牌阶段,你可以对一名体力值大于1的角色造成1点伤害,然后此技能失效直至其死亡或回复体力。", @@ -3990,7 +4046,7 @@ game.import("character", function () { stdzhanying: "醮影", stdzhanying_info: "锁定技,你的回合内,手牌数比回合开始时多的角色不能使用红色牌且受到的伤害+1。", stdtiaohe: "调和", - stdtiaohe_info: "出牌阶段限一次,你可以弃置场上的一张装备牌和一张防具牌(不能为同一名角色装备区的牌)。", + stdtiaohe_info: "出牌阶段限一次,你可以弃置场上的一张装备牌和一张防具牌(不能为同一名角色的牌)。", stdqiansu: "谦素", stdqiansu_info: "当你成为锦囊牌的目标后,若你的装备区没有牌,则你可以摸一张牌。", diff --git a/character/swd.js b/character/swd.js index ab743772..1e91d979 100644 --- a/character/swd.js +++ b/character/swd.js @@ -3134,6 +3134,9 @@ game.import("character", function () { trigger.player.addSkill("pingshen2"); trigger.player.storage.pingshen = player; }, + ai: { + neg: true + }, }, pingshen2: { enable: "phaseUse", @@ -10420,17 +10423,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: "每当你于回合外使用或打出一张牌,你可以令当前回合角色弃置一张与之花色相同的牌,否则你获得其一张牌。", @@ -10460,24 +10463,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: "不能使用或打出手牌。", @@ -10497,9 +10500,9 @@ game.import("character", function () { yaotong3: "妖瞳", yaotong4: "妖瞳", yaotong_info: - "当你的手牌数为奇数时,你可以将一张手牌当作杀或闪使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", + "当你的手牌数为奇数时,你可以将一张手牌当作【杀】或【闪】使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", yaotong_info_alter: - "当你的手牌数为奇数时,你可以将一张手牌当作杀使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", + "当你的手牌数为奇数时,你可以将一张手牌当作【杀】使用或打出,当你的手牌数为偶数时,你可以将一张手牌当作无懈可击使用。", pojian: "破茧", pojian_info: "每当你失去最后一张手牌,可以从牌堆中获得一张装备牌并装备之。", huajin: "化金", @@ -10507,22 +10510,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点体力。", @@ -10535,9 +10538,9 @@ game.import("character", function () { shending_info: "锁定技,若你没有宝物牌,视为装备了蓝格怪衣。", hzhenwei: "镇卫", hzhenwei_info: - "当一名其他角色成为杀的目标后,若你在杀的使用者的攻击范围内,你可以弃置一张牌将此杀转移给自己,并在杀结算完毕后摸一张牌。", + "当一名其他角色成为【杀】的目标后,若你在【杀】的使用者的攻击范围内,你可以弃置一张牌将此【杀】转移给自己,并在【杀】结算完毕后摸一张牌。", shoulie: "狩猎", - shoulie_info: "当你使用一张杀指定目标后,可以弃置一张手牌令此杀不可闪避。", + shoulie_info: "当你使用一张【杀】指定目标后,可以弃置一张手牌令此【杀】不可闪避。", hudun: "盾甲", hudun_bg: "盾", hudun2: "盾甲", @@ -10547,9 +10550,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点伤害。", @@ -10559,7 +10562,7 @@ game.import("character", function () { fuyan2: "覆岩", fuyan_info: "每当你受到一次伤害,可以令一名没有护甲的角色获得1点护甲值。", guaili: "怪力", - guaili_info: "锁定技,你的杀造成的伤害+1,造成伤害后需弃置两张手牌。", + guaili_info: "锁定技,你的【杀】造成的伤害+1,造成伤害后需弃置两张手牌。", pingshen: "凭神", pingshen2: "凭神", pingshen_info: "锁定技,受到过你的伤害的角色可在回合内对你发动一次【离魂】(每局限发动一次)。", @@ -10576,39 +10579,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: "魔愈", @@ -10619,7 +10622,7 @@ game.import("character", function () { youyin: "游吟", youyin_info: "每当有其他角色弃置卡牌时,若其中有非基本牌且你的手牌数不超过5,你可以摸一张牌。", rexue: "热血", - rexue_info: "任意一名角色的准备阶段,你可以对其使用一张杀,并摸一张牌。", + rexue_info: "任意一名角色的准备阶段,你可以对其使用一张【杀】,并摸一张牌。", huopu: "火瀑", huopu_info: "出牌阶段限一次,你可以将一张红桃牌当作流星火羽使用。", benlei: "奔雷", @@ -10720,15 +10723,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: "锁定技,你无视【轩辕剑】的装备条件及失去体力的效果;结束阶段,你可以弃置一张黑桃牌从弃牌堆中获得【轩辕剑】并装备之。", @@ -10742,12 +10745,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: "突阵", @@ -10755,7 +10758,7 @@ game.import("character", function () { tuzhen_info_alter: "当你造成一次伤害后,你可以弃置对方手牌中的一张非基本牌。", fengmo: "封魔", fengmo_info: - "出牌阶段限一次,你可以弃置场所有武器牌(至少两张),然后令一名未翻面的角色摸等量的牌并翻面。", + "出牌阶段限一次,你可以弃置场上所有武器牌(至少两张),然后令一名未翻面的角色摸等量的牌并翻面。", pozhou: "破咒", pozhou_bg: "破", pozhou2: "破咒", @@ -10767,13 +10770,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: "遁形", @@ -10891,24 +10894,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: "出牌阶段,你可以弃置任意张颜色相同且点数不同的牌,并获得逆时针座位距离与卡牌点数相同的角色区域内的一张牌。每阶段限一次。", @@ -10921,9 +10924,9 @@ game.import("character", function () { luomu_info: "锁定技,每当你造成伤害时,受伤害角色随机弃置一张牌。", poxing_info: "锁定技,每当你即将造成伤害,若目标的体力值大于你,你令伤害+1。", liaoyuan_info: - "每当你使用一张杀指定目标后,你可以弃置任意张与此杀花色相同的牌,若如此做,目标需额外打出等量的闪,每少打出一张闪,此杀的伤害+1。", + "每当你使用一张【杀】指定目标后,你可以弃置任意张与此【杀】花色相同的牌,若如此做,目标需额外打出等量的闪,每少打出一张闪,此【杀】的伤害+1。", liaoyuan_info_alter: - "每当你使用一张杀指定目标后,你可以弃置一张与此杀花色相同的牌,若如此做,目标需额外打出一张闪,若目标没打出闪,此杀的伤害+1。", + "每当你使用一张【杀】指定目标后,你可以弃置一张与此【杀】花色相同的牌,若如此做,目标需额外打出一张闪,若目标没打出闪,此【杀】的伤害+1。", yishan_info: "每当你受到一次伤害,你可以重新获得最近失去的两张牌。", huanhun_info: "当一名角色进入濒死状态时,你可以弃置一张牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌。", @@ -10939,15 +10942,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: @@ -10968,7 +10971,7 @@ game.import("character", function () { funiao_old_info: "出牌阶段,你可以交给一名角色一张手牌,然后观看其手牌,每个阶段对一名角色只能发动一次。", xuehuang_info: - "限定技,出牌阶段,若你没有黑色手牌,你可以展示并弃置所有手牌,每弃置一张牌视为使用一张火杀,随机指定两名敌人为目标。", + "限定技,出牌阶段,若你没有黑色手牌,你可以展示并弃置所有手牌,每弃置一张牌视为使用一张火【杀】,随机指定两名敌人为目标。", zhuyu_info: "每当一名横置的角色即将受到伤害时,你可以弃置一张红色牌令此伤害+1并变为火属性。", ningshuang_info: "每当你成为黑色牌的目标,你可以弃置一张黑色牌将其横置,并摸一张牌,若其已经模置则改为将其翻面。", diff --git a/character/tw.js b/character/tw.js index 28fb2c77..7bf857d4 100644 --- a/character/tw.js +++ b/character/tw.js @@ -37,6 +37,7 @@ game.import("character", function () { "xia_zhaoe", "xia_xiahouzie", ], + tw_beidingzhongyuan: ["huan_zhugeliang","huan_jiangwei","huan_zhanghe", "huan_guojia", "huan_weiyan", "huan_simayi", "huan_zhaoyun"], tw_mobile: ["nashime", "tw_gexuan", "tw_zhugeguo"], tw_mobile2: [ "tw_chengpu", @@ -64,6 +65,13 @@ game.import("character", function () { }, }, character: { + huan_zhugeliang: ["male", "shu", "3/4", ["twbeiding", "twjielv", "twhunyou"]], + 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_weiyan: ["male", "shu", 4, ["twqiji", "twpiankuang"]], tw_zhugejun: ["male", "qun", 3, ["twshouzhu", "twdaigui", "twcairu"]], simafu: ["male", "wei", 3, ["xunde", "chenjie"]], tw_yanliang: ["male", "qun", 4, ["twduwang", "twylyanshi"]], @@ -388,6 +396,1026 @@ game.import("character", function () { }, }, skill: { + //幻诸葛亮 + twbeiding: { + audio: 2, + trigger: { + global: "phaseZhunbeiBegin", + }, + filter(event, player) { + return ( + 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("twbeiding").includes(info[2]); + }).length + ); + }, + async cost(event, trigger, player) { + 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("twbeiding").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] }); + }); + event.result = { + bool: bool, + cost_data: links, + }; + }, + async content(event, trigger, player) { + const names = event.cost_data.map(link => link[2]); + game.log(player, "声明了", "#g" + get.translation(names)); + player.markAuto(event.name, names); + player.markAuto(event.name + "_use", names); + }, + onremove: true, + intro: { + content: "已记录牌名:$", + }, + group: "twbeiding_use", + subSkill: { + use: { + trigger: { + global: "phaseDiscardEnd", + }, + filter(event, player) { + const target = _status.currentPhase; + if (!target || !target.isIn() || event.player != target) return false; + return player.getStorage("twbeiding_use").length; + }, + forced: true, + async content(event, trigger, player) { + const target = _status.currentPhase, + storage = player.getStorage(event.name); + while (storage.length) { + const name = storage.shift(), + card = get.autoViewAs({ name: name, 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(); + } + player.storage[event.name] = []; + player.unmarkSkill(event.name); + }, + intro: { + content: "本回合新增牌名:$", + }, + }, + }, + }, + twjielv: { + audio: 2, + trigger: { + global: "phaseEnd", + }, + filter(event, player) { + return !player.hasHistory("useCard", evt => evt.targets && evt.targets.some(i => i == event.player)); + }, + forced: true, + async content(event, trigger, player) { + player.loseHp(); + }, + group: "twjielv_buff", + subSkill: { + buff: { + trigger: { + player: ["loseHpEnd", "damageEnd"], + }, + filter(event, player) { + return player.maxHp < 7 && event.num > 0; + }, + forced: true, + async content(event, trigger, player) { + const num = Math.min(trigger.num, 7 - player.maxHp); + player.gainMaxHp(num); + }, + }, + }, + }, + twhunyou: { + audio: 2, + unique: true, + limited: true, + enable: "chooseToUse", + filter(event, player) { + return event.type == "dying" && event.dying == player; + }, + skillAnimation: true, + animationColor: "orange", + async content(event, trigger, player) { + player.awakenSkill(event.name); + await player.recoverTo(1); + player.addTempSkill(event.name + "_buff"); + if (!_status.currentPhase) return; + player + .when({ global: "phaseAfter" }) + .then(() => { + const num = Math.min(7, player.getStorage("twbeiding").length); + if (num > 0) player.draw(num); + }) + .then(() => { + player.insertPhase(); + }) + .then(() => { + player.changeSkin("twhunyou", "huan_zhugeliang_shadow"); + player.changeSkills(["twbeidingx", "twjielvx", "twhuanji", "twchanggui"], ["twbeiding", "twjielv", "twhunyou"]); + }); + }, + derivation:["twbeidingx", "twjielvx", "twhuanji", "twchanggui"], + subSkill: { + buff: { + trigger: { + player: ["damageBefore", "loseHpBefore"], + }, + forced: true, + charlotte: true, + async content(event, trigger, player) { + trigger.cancel(); + }, + ai: { + nofire: true, + nothunder: true, + nodamage: true, + effect: { + target(card, player, target, current) { + if (get.tag(card, "damage")) return [0, 0]; + }, + }, + }, + mark: true, + intro: { + content: "我是无敌的", + }, + }, + }, + ai: { + order: 1, + save: true, + skillTagFilter(player, tag, target) { + if (player != target || player.storage.twhunyou) return false; + }, + result: { + player: 1, + }, + }, + }, + twbeidingx: { + mod: { + targetInRange(card, player, target) { + if (player.getStorage("twbeiding").includes(card.name)) return true; + }, + }, + audio: 2, + trigger: { + player: ["useCard1", "useCardAfter"], + }, + filter(event, player, name) { + if (!player.getStorage("twbeiding").includes(event.card.name)) return false; + return name == "useCardAfter" || (name == "useCard1" && event.addCount !== false); + }, + forced: true, + async content(event, trigger, player) { + if (event.triggername == "useCard1") { + trigger.addCount = false; + const stat = player.getStat().card, + name = trigger.card.name; + if (typeof stat[name] == "number") stat[name]--; + } else { + await player.draw(); + player.unmarkAuto("twbeiding", [trigger.card.name]); + } + }, + ai: { + combo: "twbeiding", + }, + }, + twjielvx: { + audio: 2, + trigger: { + player: "loseMaxHpEnd", + }, + filter(event, player) { + return event.num > 0 && player.isDamaged(); + }, + forced: true, + async content(event, trigger, player) { + const num = Math.min(player.getDamagedHp(), trigger.num); + player.recover(num); + }, + }, + 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("twbeiding").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("twbeiding").includes(info[2]); + }); + return ui.create.dialog(get.translation("twhuanji"), [list, "vcard"], "hidden"); + }, + check(button, player) { + return get.player().getUseValue({ name: button.link[2], nature: button.link[3] }); + }, + select() { + return [1, get.player().getHp() + 1]; + }, + backup(links, player) { + return { + names: links.map(i => i[2]), + 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("twbeiding", names); + player.markAuto("twbeiding_use", names); + }, + }; + }, + prompt(links, player) { + const names = links.map(i => i[2]); + return `减少1点体力上上限并记录${get.translation(names)}`; + }, + }, + ai: { + order: 10, + result: { + player(player) { + if (player.maxHp > 2) return 1; + return 0; + }, + }, + combo: "twbeiding", + }, + subSkill: { + backup: {}, + }, + }, + twchanggui: { + audio: 2, + trigger: { + player: "phaseJieshuBegin", + }, + filter(event, player) { + return player.isMinHp() && player.maxHp != player.getHp(); + }, + forced: true, + async content(event, trigger, player) { + const num = player.maxHp - player.getHp(); + await player[num > 0 ? "loseMaxHp" : "gainMaxHp"](Math.abs(num)); + player.changeSkin("twchanggui", "huan_zhugeliang"); + await player.changeSkills(["twbeiding", "twjielv", "twhunyou"], ["twbeidingx", "twjielvx", "twhuanji", "twchanggui"]); + }, + derivation:["twbeiding", "twjielv", "twhunyou"], + }, + //幻姜维 + huan_jiangwei_A: { + audio: 2, + enable: "phaseUse", + usable: 1, + filter(event, player) { + return player.countCards("he", { type: "equip" }) && game.hasPlayer(current => player.canCompare(current)); + }, + filterTarget(card, player, target) { + return player.canCompare(target); + }, + filterCard: { type: "equip" }, + position: "he", + discard: false, + lose: false, + delay: 0, + check(card) { + if (get.position(card) != "e") return 10; + return Math.min(13, get.number(card) + 2) / Math.pow(Math.min(2, get.value(card)), 0.25); + }, + async content(event, trigger, player) { + const card = event.cards[0], + target = event.target; + const { result } = await player.chooseToCompare(target).set("fixedResult", { [player.playerid]: card }); + const cards = get.inpileVCardList(info => { + if (info[0] != "trick") return false; + return player.canUse({ name: info[2] }, target, false); + }); + if (result.bool && cards.length) { + const links = await player + .chooseButton([`请选择你要对${get.translation(target)}使用的牌`, [cards, "vcard"]]) + .set("ai", button => { + const player = get.player(), + target = get.event("target"); + return get.effect(target, { name: button.link[2] }, player, player); + }) + .set("target", target) + .forResultLinks(); + if (links && links.length) await player.useCard({ name: links[0][2] }, target, false); + } + const card1 = result.player, + card2 = result.target; + if (get.color(card1, player) == get.color(card2, target)) { + if (get.position(card1) == "d") await target.gain(card1, "gain2"); + if (get.position(card2) == "d") await player.gain(card2, "gain2"); + } + }, + ai: { + order: 4, + result: { + target(player, target) { + var hs = player.getCards("he", { type: "equip" }).sort(function (a, b) { + return a.number - b.number; + }); + var ts = target.getCards("h").sort(function (a, b) { + return a.number - b.number; + }); + if (!hs.length || !ts.length) return 0; + if (hs[0].number <= ts[0].number) return -3; + if (player.countCards("h") >= target.countCards("h")) return -10; + return -1; + }, + }, + }, + group: "huan_jiangwei_A_compare", + subSkill: { + compare: { + trigger: { + player: "compare", + target: "compare", + }, + filter(event, player) { + if (!player.countCards("e")) return false; + if (event.player == player) return !event.iwhile; + return true; + }, + forced: true, + async content(event, trigger, player) { + const num = player.countCards("e") * 2; + if (player == trigger.player) { + trigger.num1 += num; + if (trigger.num1 > 13) trigger.num1 = 13; + } else { + trigger.num2 += num; + if (trigger.num2 > 13) trigger.num2 = 13; + } + game.log(player, "的拼点牌点数+", "#g", num); + }, + }, + }, + }, + huan_jiangwei_B: { + audio: 2, + trigger: { + source: "damageBegin2", + }, + filter(event, player) { + return ( + event.card && + event.card.name == "sha" && + event.getParent().type == "card" && + (event.player.countGainableCards(player, "e") || + Array.from({ length: 5 }) + .map((_, i) => i + 1) + .some(i => player.hasEmptySlot(i))) + ); + }, + logTarget: "player", + async cost(event, trigger, player) { + const target = trigger.player; + const choices = []; + const choiceList = [`获得${get.translation(target)}装备区一张牌`, `获得并使用一张牌堆或弃牌堆中空置装备栏对应类别的装备牌`]; + if (trigger.player.countGainableCards(player, "e")) choices.push("选项一"); + else choiceList[0] = '' + choiceList[0] + ""; + if ( + Array.from({ length: 5 }) + .map((_, i) => i + 1) + .some(i => player.hasEmptySlot(i)) + ) + choices.push("选项二"); + else choiceList[1] = '' + choiceList[1] + ""; + const control = await player + .chooseControl(choices, "cancel2") + .set("prompt", get.prompt("huan_jiangwei_B")) + .set("choiceList", choiceList) + .set("ai", () => { + const choices = get.event("controls").slice(); + const player = get.player(), + evt = get.event().getTrigger(), + target = evt.player; + const eff = get.damageEffect(target, player, player, evt.nature), + att = get.attitude(player, target); + if (att > 0) { + if (eff >= 0) return "cancel2"; + return "选项二"; + } + if (eff <= 0) { + if (choices.includes("选项一")) return "选项一"; + return "选项二"; + } + if ((target.hp == 1 && att < 0) || evt.num > 1 || player.hasSkill("tianxianjiu") || player.hasSkill("luoyi2") || player.hasSkill("reluoyi2")) return "cancel2"; + if ( + choices.includes("选项一") && + target.countCards("e", card => { + return get.effect(player, card, player, player) > 0; + }) + ) + return "选项一"; + return "选项二"; + }) + .forResultControl(); + event.result = { + bool: control != "cancel2", + cost_data: control, + }; + }, + async content(event, trigger, player) { + await trigger.cancel(); + if (event.cost_data == "选项一") await player.gainPlayerCard(trigger.player, "e", true); + else { + for (let i = 1; i < 7; i++) { + if (player.hasEmptySlot(i)) { + const sub = "equip" + i, + equip = get.cardPile(card => get.subtype(card, false) == sub && player.hasUseTarget(card)); + if (equip) { + player.$gain2(equip); + await game.asyncDelayx(); + await player.chooseUseTarget(equip, "nothrow", "nopopup", true); + break; + } + } + } + trigger.player + .when("useCard") + .filter(evt => evt.card.name == "shan") + .then(() => { + let hs = player.getCards("h"); + if (hs.length) player.discard(hs.randomGets(2)); + }); + } + }, + }, + //幻郭嘉 + huan_guojia_A: { + audio: 2, + enable: "phaseUse", + onChooseToUse(event) { + if (!game.online && event.type == "phase" && !event.huan_guojia_A) { + const player = event.player; + event.set( + "huan_guojia_A", + player + .getRoundHistory("useSkill", evt => { + return evt.skill == "huan_guojia_A"; + }) + .reduce((list, evt) => { + return list.add(evt.targets[0]); + }, []) + ); + } + }, + filter(event, player) { + return player.countCards("he") && game.hasPlayer(target => lib.skill.huan_guojia_A.filterTarget(null, player, target)); + }, + filterTarget(card, player, target) { + return player != target && !get.event().huan_guojia_A.includes(target); + }, + filterCard: true, + selectCard: [1, 2], + position: "he", + check(card) { + return 5 - get.value(card); + }, + usable: 3, + lose: false, + discard: false, + delay: 0, + prompt: "将至多两张牌标记为“技一”并交给一名本轮未以此法交给其牌的角色", + content() { + const ID = player.playerid; + const skill = "huan_guojia_A_effect", + skillID = "huan_guojia_A_" + ID; + if (!lib.skill[skillID]) { + game.broadcastAll(skillID => { + lib.skill[skillID] = { charlotte: true }; + lib.translate[skillID] = "技一"; + }, skillID); + } + if (!target.storage[skill]) { + target.storage[skill] = {}; + } + if (!target.storage[skill][player.playerid]) { + target.storage[skill][player.playerid] = 0; + } + target.storage[skill][player.playerid] += cards.length; + player.give(cards, target).gaintag.add(skillID); + }, + ai: { + order: 1, + result: { + target(player, target) { + const att = get.attitude(player, target); + return att * (att > 0 ? 2 : 1); + }, + }, + }, + group: ["huan_guojia_A_effect", "huan_guojia_A_remove"], + subSkill: { + effect: { + audio: "huan_guojia_A", + trigger: { global: "phaseUseBegin" }, + filter(event, player) { + return event.player.hasCard(card => card.hasGaintag("huan_guojia_A_" + player.playerid), "h"); + }, + prompt2(event, player) { + const num = event.player.storage["huan_guojia_A_effect"][player.playerid]; + return "观看其手牌并将其中至多" + get.cnNumber(num) + "张牌以任意顺序置于牌堆顶"; + }, + check(event, player) { + return get.attitude(player, event.player) < 0; + }, + logTarget: "player", + async content(event, trigger, player) { + const target = trigger.player, + num = target.storage["huan_guojia_A_effect"][player.playerid]; + const result = await player + .chooseToMove("技一:将" + get.translation(target) + "的至多" + get.cnNumber(num) + "张牌以任意顺序置于牌堆顶", true) + .set("list", [[get.translation(target) + "的手牌", target.getCards("h"), "dcsushou_tag"], ["牌堆顶"]]) + .set("filterOk", moved => { + const num = get.event().num; + return moved[1].length >= 1 && moved[1].length <= num; + }) + .set("num", num) + .set("processAI", list => { + const num = get.event().num; + let cards = list[0][1], + sgn = get.attitude(get.event().player, get.event().getTrigger().player) > 0 ? 1 : -1; + cards.sort((a, b) => get.value(a) * sgn - get.value(b) * sgn); + return [cards.slice(sgn > 0 ? 1 : num, cards.length), cards.slice(0, sgn > 0 ? 1 : num)]; + }) + .forResult(); + if (result.bool) { + const cards = result.moved[1]; + target.$throw(cards.length, 1000); + await target.lose(cards, ui.cardPile); + game.log(target, "的" + get.cnNumber(cards.length) + "张牌被置入了", "#y牌堆顶"); + for (let i = cards.length - 1; i--; i >= 0) { + ui.cardPile.insertBefore(cards[i], ui.cardPile.firstChild); + } + game.updateRoundNumber(); + } + }, + }, + remove: { + audio: "huan_guojia_A", + trigger: { player: "phaseBegin" }, + filter(event, player) { + return game.hasPlayer(target => target.hasCard(card => card.hasGaintag("huan_guojia_A_" + player.playerid), "h")); + }, + forced: true, + locked: false, + async content(event, trigger, player) { + const targets = game.filterPlayer(target => target.hasCard(card => card.hasGaintag("huan_guojia_A_" + player.playerid), "h")); + const sum = targets.reduce((num, target) => num + target.countCards("h", card => card.hasGaintag("huan_guojia_A_" + player.playerid)), 0); + for (const target of targets) target.removeGaintag("huan_guojia_A_" + player.playerid); + await player.draw(sum); + }, + }, + }, + }, + huan_guojia_B: { + audio: 2, + trigger: { target: "useCardToTarget" }, + filter(event, player) { + return get.type(event.card) == "trick"; + }, + async content(event, trigger, player) { + const cards = get.cards(1, true), + card = cards[0]; + await player.showCards(cards, get.translation(player) + "发动了【技二】"); + if (get.color(card) == get.color(trigger.card)) { + await player.gain(cards, "gain2"); + } + if (get.suit(card) == get.suit(trigger.card)) { + trigger.getParent().excluded.add(player); + game.log(trigger.card, "对", player, "无效"); + } + if (get.color(card) != get.color(trigger.card)) { + await game.cardsDiscard(cards); + player.$throw(cards); + game.log(cards, "被置入了弃牌堆"); + } + }, + }, + //幻张郃 + huan_zhanghe_A: { + audio: 2, + trigger: { player: "useCardToPlayered" }, + filter(event, player) { + if (event.card.name != "sha" || event.targets.length != 1) return false; + return player.countCards("h") + event.target.countCards("h") > 0; + }, + forced: true, + logTarget: "target", + content() { + 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"); + } + }, + group: "huan_zhanghe_A_damage", + subSkill: { + damage: { + audio: "huan_zhanghe_A", + trigger: { global: "damageBegin1" }, + filter(event, player) { + if (!event.source) return false; + const evtx = event.getParent(2); + if ( + !evtx || + evtx.name != "useCard" || + !event.source.hasHistory("lose", evt => { + if (evt.getParent() != evtx) return false; + return Object.keys(evt.gaintag_map || {}).includes("huan_zhanghe_A_card"); + }) + ) + return false; + return event.source.countCards("h", card => card.hasGaintag("huan_zhanghe_A_card")) > event.player.countCards("h", card => card.hasGaintag("huan_zhanghe_A_card")); + }, + forced: true, + logTarget: "source", + content() { + trigger.num++; + }, + }, + card: { + charlotte: true, + mod: { + aiOrder(player, card, num) { + if (get.itemtype(card) == "card" && card.hasGaintag("huan_zhanghe_A_card")) return num + 1; + }, + cardname(card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("huan_zhanghe_A_card")) return "sha"; + }, + cardnature(card, player) { + if (get.itemtype(card) == "card" && card.hasGaintag("huan_zhanghe_A_card")) return false; + }, + }, + }, + }, + }, + //幻赵云 + huan_zhaoyun_A: { + audio: 2, + trigger: { + global: "phaseUseBegin", + }, + filter(event, player) { + return event.player != player && player.inRange(event.player); + }, + 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.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); + }, + logTarget: "player", + async content(event, trigger, player) { + await player.draw(); + const target = trigger.player, + sha = get.autoViewAs({ name: "sha", isCard: true }); + if (target.canUse(sha, player, false, true)) await target.useCard(sha, player); + }, + }, + huan_zhaoyun_B: { + audio: 2, + trigger: { + player: "dying", + }, + forced: true, + juexingji: true, + skillAnimation: true, + animationColor: "fire", + async content(event, trigger, player) { + player.awakenSkill(event.name); + await player.recoverTo(2); + const skill = event.name + "_buff"; + player.addSkill(skill); + await player.addAdditionalSkills(skill, get.info(event.name).derivation); + player.addMark(skill, 5, false); + }, + subSkill: { + buff: { + mod: { + globalFrom(from, to) { + return -Infinity; + }, + }, + charlotte: true, + intro: { + content: "剩余#回合失去〖龙胆〗和〖冲阵〗", + }, + trigger: { + global: ["phaseBefore", "phaseAfter"], + }, + filter(event, player, name) { + return name == "phaseBefore" || (name == "phaseAfter" && !player.countMark("huan_zhaoyun_B_buff")); + }, + forced: true, + popup: false, + firstDo: true, + async content(event, trigger, player) { + if (event.triggername == "phaseBefore") player.removeMark(event.name, 1, false); + if (event.triggername == "phaseAfter" && !player.countMark(event.name)) await player.removeAdditionalSkills(event.name); + }, + }, + }, + derivation: ["ollongdan", "chongzhen"], + }, + //幻司马懿 + twzongquan: { + audio: 2, + trigger: { + player: ["phaseZhunbeiBegin", "phaseJieshuBegin"], + }, + async cost(event, trigger, player) { + const history = player.getAllHistory("useSkill", evt => evt.skill == "twzongquan"), + judgeEvent = game.getAllGlobalHistory("everything", evt => evt.name == "judge" && evt.player == player && evt.getParent().name == "twzongquan"); + event.result = await player + .chooseTarget(get.prompt("twzongquan"), `选择一名角色,然后你进行判定,并令其执行相应效果` + (history.length > 0 ? `(上次选择的目标:${get.translation(history.at(-1).targets[0])}` : ``) + (judgeEvent.length > 0 ? `;上次判定的结果:${get.translation(judgeEvent.at(-1).result.color)})` : ``)) + .set("ai", target => { + const player = get.player(), + att = get.attitude(player, target); + if (player.getAllHistory("useSkill", evt => evt.skill == "twzongquan").length) { + const history = game.getAllGlobalHistory("everything", evt => { + if (evt.name != "judge") return false; + const evtx = evt.getParent(); + return evtx.name == "twguimou" && evtx.player == player && evtx != trigger.getParent(); + }); + const evt = history[history.length - 1]; + if (evt && evt.getParent().targets[0] == target) { + const color = evt.color; + if (color == "black" && att > 0) return 1919810; + if (color == "red" && att < 0) return 114514; + } + } + return Math.abs(att); + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + const next = player.judge(card => { + return get.color(card) == "black" ? -2 : 2; + }); + next.judge2 = result => result.bool; + const result = await next.forResult(); + const history = player.getAllHistory("useSkill", evt => evt.skill == "twzongquan"), + judgeEvent = game.getAllGlobalHistory("everything", evt => evt.name == "judge" && evt.player == player && evt.getParent().name == "twzongquan"); + let num; + if (history.length > 1 && judgeEvent.length > 1 && target == history.at(-2).targets[0] && result.color != judgeEvent.at(-2).result.color) { + num = 3; + } else num = 1; + if (result.color == "red") await target.draw(num); + else if (result.color == "black" && target.countCards("he")) await target.chooseToDiscard("he", num, true); + const card = result.card; + if (get.position(card) != "d") return; + const targets = await player + .chooseTarget(`令一名角色获得${get.translation(card)}`) + .set("ai", target => { + const player = get.player(); + let att = get.attitude(player, target); + if (target.hasSkillTag("nogain")) att /= 10; + return att; + }) + .forResultTargets(); + if (!targets || !targets.length) return; + await targets[0].gain(card, "gain2"); + }, + }, + twguimou: { + audio: 2, + trigger: { + global: "judge", + }, + usable: 2, + popup: false, + async content(event, trigger, player) { + const cards = get.bottomCards(4, true); + const links = await player + .chooseButton([get.translation(trigger.player) + "的" + (trigger.judgestr || "") + "判定为" + get.translation(trigger.player.judging[0]) + "," + get.prompt("twguimou"), cards], true) + .set("filterButton", button => { + const player = get.player(), + card = button.link; + const mod2 = game.checkMod(card, player, "unchanged", "cardEnabled2", player); + if (mod2 != "unchanged") return mod2; + const mod = game.checkMod(card, player, "unchanged", "cardRespondable", player); + if (mod != "unchanged") return mod; + return true; + }) + .set("ai", button => { + const card = button.link, + trigger = get.event().getTrigger(); + const player = get.player(), + judging = get.event("judging"); + const result = trigger.judge(card) - trigger.judge(judging) + 0.00001; + const attitude = get.attitude(player, trigger.player); + const name = trigger.getParent().name; + if (name == "twzongquan") { + const target = trigger.getParent().targets[0]; + const history = game.getAllGlobalHistory("everything", evt => { + if (evt.name != "judge") return false; + const evtx = evt.getParent(); + return evtx.name == "twzongquan" && evtx.player == player && evtx != trigger.getParent(); + }); + const evt = history[history.length - 1]; + if (evt && evt.getParent().targets[0] == target) { + if (get.color(card) != evt.color) return 114514 * result * attitude; + } + } + return result * attitude; + }) + .set("judging", trigger.player.judging[0]) + .forResultLinks(); + if (!links || !links.length) return; + cards.removeArray(links); + await player.respond(links, "twguimou", "highlight", "noOrdering"); + if (trigger.player.judging[0].clone) { + trigger.player.judging[0].clone.classList.remove("thrownhighlight"); + game.broadcast(function (card) { + if (card.clone) { + card.clone.classList.remove("thrownhighlight"); + } + }, trigger.player.judging[0]); + game.addVideo("deletenode", player, get.cardsInfo([trigger.player.judging[0].clone])); + } + await game.cardsDiscard(trigger.player.judging[0]); + trigger.player.judging[0] = links[0]; + trigger.orderingCards.addArray(links); + game.log(trigger.player, "的判定牌改为", links[0]); + await game.asyncDelay(2); + const next = player.chooseToMove("鬼谋:将卡牌以任意顺序置于牌堆顶"); + next.set("list", [["牌堆顶", cards]]); + next.set("processAI", function (list) { + const player = get.player(), + target = get.event().getTrigger().name == "phaseZhunbei" ? player : player.next; + const att = get.sgn(get.attitude(player, target)); + const check = function (card) { + const judge = player.getCards("j")[cards.length]; + if (judge) return get.judge(judge)(card) * att; + return player.getUseValue(card) * att; + }; + const cards = list[0][1].slice(0); + cards.sort(function (a, b) { + return check(b) * att - check(a) * att; + }); + return [cards]; + }); + next.set("namex", event.triggername); + const { + result: { moved }, + } = await next; + const top = moved[0].reverse(); + await game.cardsGotoPile(top, ["top_cards", top], (event, card) => { + if (event.top_cards.includes(card)) return ui.cardPile.firstChild; + return null; + }); + }, + }, + //幻魏延 + twqiji: { + audio: 2, + trigger: { + player: "phaseUseBegin", + }, + filter(event, player) { + return player.countCards("h") && game.hasPlayer(current => player.canUse({ name: "sha", isCard: true }, current, false)); + }, + async cost(event, trigger, player) { + const num = player + .getCards("h") + .map(card => get.type2(card)) + .toUniqued().length; + event.result = await player + .chooseTarget(get.prompt("twqiji"), `选择一名角色其他角色视为对其使用${get.cnNumber(num)}张无距离限制且不计入次数的【杀】`, (card, player, target) => { + return player.canUse({ name: "sha", isCard: true }, target, false); + }) + .set("ai", target => { + const player = get.player(); + const eff = get.effect(target, { name: "sha", isCard: true }, player, player); + if (target.hasSkill("bagua_skill") || target.hasSkill("rw_bagua_skill") || target.hasSkill("bazhen")) return 0; + return eff; + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0], + sha = get.autoViewAs({ name: "sha", isCard: true, storage: { twqiji: true } }); + let num = player + .getCards("h") + .map(card => get.type2(card)) + .toUniqued().length; + target.addTempSkill("twqiji_buff", "phaseUseAfter"); + while (target.isIn() && num--) { + await player.useCard(sha, target, false); + } + }, + subSkill: { + buff: { + trigger: { + global: "useCardToPlayer", + }, + filter(event, player) { + if (!event.card.storage || !event.card.storage.twqiji || !event.targets.includes(player)) return false; + const chosen = player.storage.twqiji_buff || []; + return event.isFirstTarget && event.targets.includes(player) && game.hasPlayer(current => current != player && current != event.player && !chosen.includes(current)); + }, + async cost(event, trigger, player) { + const chosen = player.storage.twqiji_buff || []; + event.result = await player + .chooseTarget("令一名本回合未以此法选择的角色摸一张牌,然后其可以将此杀转移给自己", (card, player, target) => { + const evt = get.event().getTrigger(); + if (chosen.includes(target)) return false; + return target != evt.player && target != player; + }) + .set("ai", target => { + const player = get.player(), + trigger = get.event().getTrigger(); + if (get.attitude(player, target) <= 0 || get.effect(player, trigger.card, trigger.player, player) > 0) return 0; + if (target.countCards("h", "shan") || target.getEquip(2) || target.hp > player.hp + 1) return 10; + return get.effect(target, { name: "draw" }, player, player); + }) + .forResult(); + }, + popup: false, + onremove: true, + charlotte: true, + async content(event, trigger, player) { + const target = event.targets[0]; + if (!player.storage.twqiji_buff) { + player.when({ global: "phaseAfter" }).then(() => { + player.unmarkSkill("twqiji_buff"); + }); + } + player.markAuto("twqiji_buff", target); + await target.draw(); + const bool = await target + .chooseBool(`是否将${get.translation(trigger.card)}转移给自己`) + .set("ai", () => get.event("bool")) + .set("bool", () => { + let save = false; + if (target.countCards("h", "shan") || target.getEquip(2) || player.hp == 1 || target.hp > player.hp + 1) { + if (!player.countCards("h", "shan") || target.countCards("h") < player.countCards("h")) { + save = true; + } + } + return save; + }) + .forResultBool(); + if (!bool) return; + const evt = trigger.getParent(); + evt.triggeredTargets1.remove(player); + evt.targets.remove(player); + evt.targets.push(target); + }, + intro: { + content: "已选择过$", + }, + }, + }, + }, + twpiankuang: { + audio: 2, + getNum: (event, player) => Math.min(3, player.getHistory("sourceDamage", evt => evt.card && evt.card.name == event.card.name && evt.card != event.card).length), + trigger: { + source: "damageBegin1", + }, + filter(event, player) { + return event.card && event.getParent().type == "card" && get.info("twpiankuang").getNum(event, player) > 0; + }, + forced: true, + async content(event, trigger, player) { + trigger.num += get.info("twpiankuang").getNum(trigger, player); + }, + }, //诸葛均 twshouzhu: { audio: 2, @@ -416,7 +1444,7 @@ game.import("character", function () { for (const current of targets) { if (!current.isIn()) continue; const cards = await current - .chooseToGive(`${get.translation(player)}对你发动了【受嘱】`, "作为其的同心角色,是否交给其至多三张牌?", player, "he", [1, 3]) + .chooseToGive(`${get.translation(player)}对你发动了【受嘱】`, "作为其的同心角色,是否交给其至多四张牌?", player, "he", [1, 4]) .set("ai", card => { if (!get.event("goon")) return -get.value(card); if (ui.selected.cards.length < 2) return 4.5 + ui.selected.cards.length - get.value(card) + get.player().getUseValue(card) / 5; @@ -427,7 +1455,7 @@ game.import("character", function () { if (cards && cards.length) count += cards.length; } if (count < 2) return; - await game.asyncDraw(targets); + await game.asyncDraw(targets, 2); await game.asyncDelay(); targets.unshift(player); for (const current of targets) { @@ -478,7 +1506,17 @@ game.import("character", function () { forced: true, ruleSkill: true, async content(event, trigger, player) { - const targets = await player.chooseTarget("请选择你的“同心”角色", lib.filter.notMe).forResultTargets(); + const beOfOneHeartLimit = player.storage.beOfOneHeartLimit || 1; + const targets = await player.chooseTarget("请选择你的“同心”角色", lib.filter.notMe, [1, beOfOneHeartLimit]).set("ai", function (target) { + const aiCheck = lib.skill.beOfOneHeart.aiCheck.slice(); + let eff = 0; + while (aiCheck.length) { + const func = aiCheck.shift(); + if (typeof func !== "function") continue; + eff += func.apply(this, arguments); + } + return eff; + }).forResultTargets(); if (!targets || !targets.length) return; player.line(targets, "green"); game.log(player, "选择了", targets, "作为自己的同心角色"); @@ -495,6 +1533,11 @@ game.import("character", function () { await game.asyncDelayx(); }, marktext: "❤", + aiCheck: [ + target => { + return get.attitude(get.player(), target); + }, + ], intro: { name: "同心", content(_, player) { @@ -604,7 +1647,7 @@ game.import("character", function () { enable: ["chooseToUse", "chooseToRespond"], filter(event, player) { return ["huogong", "tiesuo", "wuzhong"].some(name => { - if (player.getStorage("twcairu_used").includes(name)) return false; + if (player.getStorage("twcairu_used").filter(namex => namex == name).length > 1) return false; return event.filterCard({ name }, player, event); }); }, @@ -612,7 +1655,7 @@ game.import("character", function () { dialog(event, player) { const list = ["huogong", "tiesuo", "wuzhong"] .filter(name => { - if (player.getStorage("twcairu_used").includes(name)) return false; + if (player.getStorage("twcairu_used").filter(namex => namex == name).length > 1) return false; return event.filterCard({ name }, player, event); }) .map(name => [get.translation(get.type(name)), "", name]); @@ -645,7 +1688,7 @@ game.import("character", function () { delete player.storage.twcairu_used; }); } - player.storage.twcairu_used.add(event.result.card.name); + player.storage.twcairu_used.push(event.result.card.name); }, }; }, @@ -660,7 +1703,7 @@ game.import("character", function () { let max = 0, names = ["huogong", "tiesuo", "wuzhong"].filter(name => { if (player.getStorage("twcairu_used").includes(name)) return false; - return player.hasValueTarget(name ,true, true); + return player.hasValueTarget(name, true, true); }); if (!names.length) return 0; names = names.map(namex => ({ name: namex })); @@ -2672,8 +3715,7 @@ game.import("character", function () { .set( "goon", (function () { - var d1 = true; - if (player.hasSkill("jueqing") || player.hasSkill("gangzhi")) d1 = false; + var d1 = false; if ( !target.mayHaveShan( player, @@ -2692,15 +3734,7 @@ game.import("character", function () { true ) ) { - if (!target.hasSkill("gangzhi")) d1 = false; - if ( - !target.hasSkillTag("filterDamage", null, { - player: player, - card: trigger.card, - }) && - get.attitude(player, target) < 0 - ) - return true; + if (get.attitude(player, target) < 0 && !player.hasSkillTag("jueqing", false, target)) return true; } if (d1) return get.damageEffect(player, player, player) > 0; return false; @@ -4176,7 +5210,7 @@ game.import("character", function () { player.addMark("twshoushou_plus", 1, false); }, ai: { - halfneg: true, + neg: true, }, subSkill: { damage: { @@ -4930,6 +5964,7 @@ game.import("character", function () { 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"); }); @@ -5006,6 +6041,7 @@ game.import("character", function () { }, content: function () { "step 0"; + player.addTempSkill("twkaizeng_used"); var type = lib.skill.twkaizeng_want_backup.type; var isbasic = lib.card[type]; target @@ -5089,6 +6125,7 @@ game.import("character", function () { }, }, want_backup: {}, + used: {}, }, ai: { threaten: 3, @@ -5418,6 +6455,7 @@ game.import("character", function () { target.damage(); }, ai: { + combo: "twjuntun", expose: 0.25, order: 8, result: { @@ -5515,6 +6553,9 @@ game.import("character", function () { }, }, }, + ai: { + combo: "twjuntun" + }, }, //蒋济 twjichou: { @@ -8556,7 +9597,6 @@ game.import("character", function () { }, twxiangyu: { group: "twxiangyu_lose", - shaRelated: true, audio: "zniaoxiang", trigger: { player: "useCardToPlayered" }, filter: function (event, player) { @@ -9917,6 +10957,7 @@ game.import("character", function () { forced: true, content: function () { trigger.directHit.addArray(game.players); + game.log(trigger.card, "不可被响应"); }, ai: { directHit_ai: true }, }, @@ -16043,8 +17084,7 @@ game.import("character", function () { 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); @@ -16131,12 +17171,6 @@ game.import("character", function () { "goon", (function () { if (get.attitude(target, player) < 0) return false; - var d1 = true; - if ( - trigger.player.hasSkill("jueqing") || - trigger.player.hasSkill("gangzhi") - ) - d1 = false; for (var target of trigger.targets) { if ( !target.mayHaveShan( @@ -16156,18 +17190,18 @@ game.import("character", function () { true ) ) { - if (!target.hasSkill("gangzhi")) d1 = false; if ( + get.attitude(player, target) < 0 && + !trigger.player.hasSkillTag("jueqing", false, target) && !target.hasSkillTag("filterDamage", null, { player: trigger.player, card: trigger.card, - }) && - get.attitude(player, target) < 0 + }) ) return true; } } - return d1; + return false; })() ); if (!event.target.isUnderControl(true) && !event.target.isOnline()) game.delayx(); @@ -18888,9 +19922,8 @@ game.import("character", function () { ); }, checkx(event, player) { - let d1 = true, + let d1 = false, e = false; - if (event.player.hasSkill("jueqing") || event.player.hasSkill("gangzhi")) d1 = false; for (let tar of event.targets) { if (event.card.name == "sha") { if ( @@ -18911,13 +19944,14 @@ game.import("character", function () { true ) ) { - if (!tar.hasSkill("gangzhi")) d1 = false; if ( + !event.player.hasSkillTag("jueqing", false, tar) && !tar.hasSkillTag("filterDamage", null, { player: event.player, card: event.card, }) ) { + d1 = true; let att = get.attitude(_status.event.player, tar); if (att > 0) return false; if (att < 0) e = true; @@ -20478,6 +21512,10 @@ game.import("character", function () { baoxin: ["tw_baoxin", "baoxin"], yanxiang: ["yanxiang", "tw_yanxiang"], liwei: ["liwei", "tw_liwei"], + tw_jiling: ["jiling", "dc_jiling", "tw_jiling"], + }, + characterSubstitute: { + huan_zhugeliang: [], }, dynamicTranslate: { twfeifu: function (player) { @@ -20961,7 +21999,8 @@ game.import("character", function () { twqingkou: "轻寇", twqingkou_info: "准备阶段,你可以视为对一名其他角色使用一张【决斗】。然后此牌的伤害来源摸一张牌,若伤害来源包括你,你跳过本回合的判定阶段和弃牌阶段。", - tw_zhangji: "张既", + tw_zhangji: "TW张既", + tw_zhangji_prefix: "TW", twdingzhen: "定镇", //丁真 twdingzhen_info: "一轮游戏开始时,你可以选择任意名你至其距离不大于X的角色(X为你的体力值),这些角色选择一项:1.弃置一张【杀】;2.本轮其于回合内使用的第一张牌不能指定你为目标。", @@ -21362,8 +22401,7 @@ game.import("character", function () { twzhongyi_info: "锁定技。①你使用【杀】无距离限制。②当你使用【杀】结算完毕后,你选择一项:⒈摸X张牌;⒉回复X点体力;⒊背水:失去Y点体力,依次执行以上两项(X为受到此牌造成的伤害的角色数,Y为你本局游戏选择此项的次数)。", twchue: "除恶", - twchue_info: - "①当你使用【杀】指定唯一目标时,若场上存在可称为此【杀】目标的非目标角色,则你可以失去1点体力,为此牌额外指定Z个目标。②当你受到伤害或失去体力后,你摸一张牌并获得1个“勇”标记。③回合结束时,若你的“勇”标记数大于等于Z,则你可以失去Z个“勇”标记,视为使用一张伤害+1且可以额外指定Z个目标的【杀】。(Z为你的体力值)", + twchue_info: "①当你使用【杀】指定唯一目标时,若场上存在可成为此【杀】目标的非目标角色,则你可以失去1点体力,为此牌额外指定Z个目标。②当你受到伤害或失去体力后,你摸一张牌并获得1个“勇”标记。③回合结束时,若你的“勇”标记数大于等于Z,则你可以失去Z个“勇”标记,视为使用一张伤害+1且可以额外指定Z个目标的【杀】。(Z为你的体力值)", xia_shitao: "石韬", twjieqiu: "劫囚", twjieqiu_info: @@ -21425,17 +22463,67 @@ game.import("character", function () { "锁定技。结束阶段,若你已受伤且你有手牌,则你须选择X名有手牌的其他角色(X为你的体力值),你与这些角色同时弃置一张手牌,然后你对与你弃置牌类别相同的所有其他角色各造成1点伤害。历战:〖败族〗目标选择数+1。", tw_zhugejun: "诸葛均", twshouzhu: "受嘱", - twshouzhu_info: "出牌阶段开始时,你的同心角色可交给你至多三张牌。若你以此法得到的牌数X不小于2,其摸一张牌,然后执行同心:观看牌堆顶X张牌,然后将其中任意张牌以任意顺序置于牌堆底,将其余的牌置入弃牌堆。", + twshouzhu_info: "出牌阶段开始时,你的同心角色可交给你至多四张牌。若你以此法得到的牌数X不小于2,其摸两张牌,然后执行同心:观看牌堆顶X张牌,然后将其中任意张牌以任意顺序置于牌堆底,将其余的牌置入弃牌堆。", twdaigui: "待归", twdaigui_info: "出牌阶段结束时,若你手牌的颜色均相同,你可以选择至多Y名角色并亮出牌堆底等量的牌,然后这些角色依次选择并获得其中一张(Y为你的手牌数)。", twcairu: "才濡", - twcairu_info: "每回合每种牌名限一次。你可以将两张颜色不同的牌当【火攻】、【铁索连环】或【无中生有】使用。", + twcairu_info: "每回合每种牌名限两次。你可以将两张颜色不同的牌当【火攻】、【铁索连环】或【无中生有】使用。", simafu: "TW司马孚", simafu_prefix: "TW", xunde: "勋德", xunde_info: "一名角色受到伤害后,若你至其的距离不大于1,则你可判定。若判定结果:大于5,你令该角色获得判定牌;小于7,你令伤害来源弃置一张手牌。", chenjie: "臣节", chenjie_info: "一名角色的判定牌生效前,你可打出一张花色相同的牌。系统将你打出的牌作为新判定牌,将原判定牌置入弃牌堆。然后你摸两张牌。", + huan_weiyan: "幻魏延", + huan_weiyan_prefix: "幻", + twqiji: "奇计", + twqiji_info: "出牌阶段开始时,你可以视为对一名其他角色使用X张无距离限制且不计入次数的【杀】,此【杀】指定目标时,其可以选择一名本回合未以此法选择的其他角色,被选择的角色摸一张牌,然后其可以将此【杀】的目标转移给自己(X为出牌阶段开始时你手牌的类型数)。", + twpiankuang: "偏狂", + twpiankuang_info: "锁定技,你使用的牌造成的伤害+Y(Y为你本回合使用过的且造成过伤害的相同牌名的牌的数量,且至多为3)。", + huan_simayi: "幻司马懿", + huan_simayi_prefix: "幻", + twzongquan: "纵权", + twzongquan_info: "准备阶段或结束阶段,你可以选择一名角色,然后你进行判定:若为红色:你令其摸一张牌;若为黑色:你令其弃置一张牌。 若你本次选择的目标与上次相同但判定结果不同,则摸或弃置的牌数改为三。然后你令一名角色获得判定牌。", + twguimou: "鬼谋", + twguimou_info: "每回合限两次,当一名角色的判定牌生效前,你可以观看牌堆底的四张牌,打出其中一张牌代替之,然后将其余牌以任意顺序置于牌堆顶。", + huan_zhaoyun: "幻赵云", + huan_zhaoyun_prefix: "幻", + huan_zhaoyun_A: "技一", + huan_zhaoyun_A_info: "其他角色的出牌阶段开始时,若其在你攻击范围内,你可以摸一张牌,然后其视为对你使用一张无距离限制的普通【杀】(计入【杀】的使用次数)。", + huan_zhaoyun_B: "技二", + huan_zhaoyun_B_info: "觉醒技,当你进入濒死状态时,你将体力值回复至2点,此后的五个回合,你视为拥有技能〖龙胆〗和〖冲阵〗,且你计算与其他角色的距离视为1。", + huan_zhanghe: "幻张郃", + huan_zhanghe_prefix: "幻", + huan_zhanghe_A: "技一", + huan_zhanghe_A_info: "锁定技。①当你使用【杀】指定唯一目标后,你与其的随机两张手牌获得“技一”标记,这些牌视为无属性【杀】。②一名角色使用含“技一”标记的牌造成伤害时,若其含“技一”标记的手牌数大于受伤角色含“技一”标记的手牌数,则此伤害+1。", + huan_guojia: "幻郭嘉", + huan_guojia_prefix: "幻", + huan_guojia_A: "技一", + huan_guojia_A_info: "①出牌阶段限三次,你可以将至多两张牌标记为“技一”并交给一名本轮未以此法交给其牌的角色。②拥有“技一”标记牌的角色的出牌阶段开始时,你可以观看其手牌并将其中至多X张牌以任意顺序置于牌堆顶(X为你本局游戏发动〖技一〗交给其的牌数)。③回合开始时,你移去所有角色手牌中的“技一”标记,然后摸等量的牌。", + huan_guojia_B: "技二", + huan_guojia_B_info: "当你成为普通锦囊牌的目标时,你可以展示牌堆顶的一张牌,若此牌与使用的牌的:颜色相同,你获得此牌;花色相同,你令此牌对你无效;颜色不同,你将此牌置入弃牌堆。", + huan_jiangwei: "幻姜维", + huan_jiangwei_prefix: "幻", + huan_jiangwei_A: "技一", + huan_jiangwei_A_info: "①出牌阶段限一次,你可使用一张装备牌与一名其他角色拼点,若你赢,你可视为对其使用一张以其为唯一目标的普通锦囊牌;若两张拼点牌颜色相同,你与其获得对方的拼点牌。②你的拼点牌点数+X(X为你装备区牌数的两倍)。", + huan_jiangwei_B: "技二", + huan_jiangwei_B_info: "当你使用【杀】对目标角色造成伤害时,你可以防止此伤害并选择一项:1.获得其装备区里的一张牌;2.获得并使用一张牌堆或弃牌堆中你空置装备栏对应类别的装备牌,然后其下次使用【闪】时随机弃置两张手牌。", + huan_zhugeliang: "幻诸葛亮", + huan_zhugeliang_prefix: "幻", + twbeiding: "北定", + twbeiding_info: "每名角色的准备阶段,你可以声明并记录至多X个未记录的基本牌或普通锦囊牌牌名(X为你的体力值)。当前回合角色弃牌阶段结束时,你视为依次使用本回合声明的牌(无距离限制),若此牌的目标不包含其,其摸一张牌。", + twjielv: "竭虑", + twjielv_info: "锁定技。①每名角色回合结束时,若你未对其使用牌,你失去1点体力。②当你失去1点体力或受到1点伤害后,若你的体力上限小于7,你增加1点体力上限。", + twhunyou: "魂游", + twhunyou_info: "限定技,当你处于濒死状态时,你可以将体力值回复至1点,若如此做,本回合当你受到伤害时或失去体力时,取消之;当前回合结束后,你入幻:摸X张牌并进行一个额外的回合(X为〖北定〗记录牌名数,且至多为7)。", + twbeidingx: "北定", + twbeidingx_info: "你使用〖北定〗记录的牌无距离限制且不计入次数;当你使用〖北定〗记录的牌结算结束后,你摸一张牌,然后从〖北定〗记录中移除此牌名。", + twjielvx: "竭虑", + twjielvx_info: "锁定技,当你减少1点体力上限后,你回复1点体力。", + twhuanji: "幻计", + twhuanji_info: "出牌阶段限一次,你可以减少1点体力上限,然后增加至多X个〖北定〗未记录过的牌名 (X为你的体力值+1)。", + twchanggui: "长归", + twchanggui_info: "锁定技,结束阶段,若你的体力值为全场最低且不等于体力上限,你须退幻:将体力上限调整为当前体力值。", tw_mobile: "海外服·稀有专属", tw_yunchouzhi: "运筹帷幄·智", @@ -21446,6 +22534,7 @@ game.import("character", function () { tw_zhu: "海外服·主公", tw_sp: "海外服·SP", tw_swordsman: "海外服·武侠篇", + tw_beidingzhongyuan: "海外服·北定中原", tw_mobile2: "海外服·异构", tw_yijiang: "一将成名TW", tw_english: "英文版", diff --git a/character/xianding.js b/character/xianding.js index 71e214ae..514dc906 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4,6 +4,16 @@ game.import("character", function () { name: "xianding", connect: true, character: { + 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_wangling: ["male", "wei", 4, ["dcjichou", "dcmouli"], ["clan:太原王氏"]], + dc_jiangji: ["male", "wei", 3, ["dcshiju", "dcyingshi"]], dc_sb_zhugejin: ["male", "wu", 3, ["dcsbtaozhou", "dcsbhoude"]], dc_sb_jiaxu: ["male", "qun", 3, ["dcsbsushen", "dcsbfumou"]], guanyue: ["male", "shu", 4, ["dcshouzhi", "dcfenhui"]], @@ -109,7 +119,7 @@ game.import("character", function () { 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"], + 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"], @@ -121,15 +131,758 @@ game.import("character", function () { 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_zijing: ["dc_sb_zhugejin"], + 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", "dc_sb_dianwei"], + // xianding_waitforsort: [], }, }, characterSubstitute: { dc_sb_simayi: [], dc_sb_zhouyu: [], - //dc_sb_lusu: [], + dc_sb_lusu: [], + dc_sb_jiaxu: [], }, skill: { + //卞玥 + 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, + trigger: { target: "useCardToTargeted" }, + filter(event, player) { + return get.type(event.card) == "trick" && player.getStorage("dccilv").length < 3; + }, + async content(event, trigger, player) { + await player.draw(3 - player.getStorage("dccilv").length); + if (player.countCards("h") > player.maxHp) { + let result, + list = ["无效", "防伤", "获得"].filter(i => !player.getStorage("dccilv").includes(i)); + if (list.length == 1) result = { control: list[0] }; + else + result = await player + .chooseControl(list) + .set("prompt", "辞虑:选择执行并移去一项") + .set("ai", () => { + const player = get.event("player"), + trigger = get.event().getTrigger(), + card = trigger.card; + let controls = get.event("controls").slice(); + if (controls.includes("防伤")) { + if (get.tag(card, "damage")) return "防伤"; + else controls.remove("防伤"); + } + if (get.effect(player, trigger.card, trigger.player, player) < 0 && controls.includes("无效")) return "无效"; + return controls[controls.length - 1]; + }) + .forResult(); + const choice = result.control; + player.popup(choice); + game.log(player, "选择了", "#y" + choice); + switch (choice) { + case "无效": + trigger.getParent().excluded.add(player); + game.log(trigger.card, "对", player, "无效"); + break; + case "防伤": + player.addTempSkill("dccilv_effect"); + player.markAuto("dccilv_effect", [trigger.card]); + break; + case "获得": + player + .when({ global: "useCardAfter" }) + .filter(evt => evt == trigger.getParent()) + .then(() => { + const cards = (trigger.cards || []).filterInD(); + if (cards.length) player.gain(cards, "gain2"); + }); + break; + } + player.markAuto("dccilv", [choice]); + } + }, + mark: true, + intro: { + markcount: storage => 3 - (storage || []).length, + content: storage => ((storage || []).length ? ("已移去了" + storage + "项") : "暂未移去任何项"), + }, + subSkill: { + effect: { + charlotte: true, + trigger: { player: "damageBegin4" }, + filter(event, player) { + const evt = event.getParent(2); + return evt && evt.name == "useCard" && player.getStorage("dccilv_effect").includes(evt.card); + }, + forced: true, + content() { + trigger.cancel(); + }, + ai: { + effect: { + target(card, player, target) { + if (player.getStorage("dccilv_effect").includes(card)) return "zeroplayertarget"; + }, + }, + }, + }, + }, + }, + dctongdao: { + unique: true, + limited: true, + trigger: { player: "dying" }, + skillAnimation: true, + animationColor: "fire", + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt2("dctongdao")) + .set("ai", target => { + const player = get.event("player"); + if (player.hp + player.countCards("hs", card => player.canSaveCard(card, player)) > 0) return target == player ? 1 : 0; + return target.hp + 114514; + }) + .forResult(); + }, + async content(event, trigger, player) { + const target = event.targets[0]; + player.awakenSkill("dctongdao"); + const removeSkills = target.getSkills(null, false, false).filter(i => { + const info = get.info(i); + return !info || !info.charlotte; + }); + if (removeSkills.length) target.removeSkill(removeSkills); + const gainSkills = target.getStockSkills(true, true).filter(i => { + const info = get.info(i); + if (info && info.zhuSkill && !player.isZhu2()) return false; + return !info || !info.charlotte; + }); + if (gainSkills.length) { + //抽象 + //混沌初开——牢戏 + Object.keys(target.storage) + .filter(i => gainSkills.some(skill => i.startsWith(skill))) + .forEach(storage => delete target.storage[storage]); + target.addSkill(gainSkills); + const suffixs = ["used", "round", "block", "blocker"]; + for (const skill of gainSkills) { + const info = get.info(skill); + if (typeof info.usable == "number") { + if (target.hasSkill("counttrigger") && target.storage.counttrigger[skill] && target.storage.counttrigger[skill] >= 1) { + delete target.storage.counttrigger[skill]; + } + if (typeof get.skillCount(skill) == "number" && get.skillCount(skill) >= 1) { + delete target.getStat("skill")[skill]; + } + } + if (info.round && target.storage[skill + "_roundcount"]) { + delete target.storage[skill + "_roundcount"]; + } + if (target.storage[`temp_ban_${skill}`]) { + delete target.storage[`temp_ban_${skill}`]; + } + if (target.awakenedSkills.includes(skill)) { + target.restoreSkill(skill); + } + for (const suffix of suffixs) { + if (target.hasSkill(skill + "_" + suffix)) { + target.removeSkill(skill + "_" + suffix); + } + } + } + } + if (target != player && target.hp > player.hp) { + await player.recoverTo(target.hp); + } + }, + }, + //张绣 + dcsbfuxi: { + audio: 2, + trigger: { global: "phaseUseBegin" }, + filter(event, player) { + const target = event.player; + if (!player.countCards("he") && !target.countCards("he") && !player.canUse(new lib.element.VCard({ name: "sha" }), target, false)) return false; + return event.player != player && event.player.isMaxHandcard(); + }, + async cost(event, trigger, player) { + const target = trigger.player, + str = get.translation(target); + let result; + if (!player.countCards("he")) { + result = await player + .chooseBool(get.prompt("dcsbfuxi", target), "弃置" + str + "的一张牌,然后视为对其使用一张【杀】") + .set("choice", get.effect(target, { name: "guohe_copy2" }, player, player) + get.effect(target, new lib.element.VCard({ name: "sha" }), player, player) > 0) + .forResult(); + result.index = 1; + } else if (!target.countCards("he") && !player.canUse(new lib.element.VCard({ name: "sha" }), target, false)) { + result = await player + .chooseBool(get.prompt("dcsbfuxi", target), "交给" + str + "一张牌,然后摸两张牌") + .set("choice", get.attitude(player, target) > 0 || player.hasCard(card => card.name == "du", "h")) + .forResult(); + result.index = 0; + } else { + result = await player + .chooseControl("给牌", "出杀", "cancel2") + .set("choiceList", ["交给" + str + "一张牌,然后摸两张牌", "弃置" + str + "的一张牌,然后视为对其使用一张【杀】"]) + .set("ai", () => { + const player = get.event("player"), + target = get.event("target"); + const num = get.effect(target, { name: "guohe_copy2" }, player, player) + get.effect(target, new lib.element.VCard({ name: "sha" }), player, player); + if (num <= 0 && get.attitude(player, target) < 0) return "cancel2"; + return get.attitude(player, target) >= 0 ? 0 : 1; + }) + .set("target", target) + .forResult(); + result.bool = result.control != "cancel2"; + } + if (result.bool) { + result.targets = [target]; + result.cost_data = result.index; + } + event.result = result; + }, + async content(event, trigger, player) { + const target = trigger.player; + if (event.cost_data == 0) { + await player.chooseToGive(target, "he", true); + await player.draw(2); + } else { + await player.discardPlayerCard(target, "he", true); + const sha = new lib.element.VCard({ name: "sha" }); + if (player.canUse(sha, target, false)) { + await player.useCard(sha, target, false); + } + } + }, + }, + dcsbhaoyi: { + audio: 2, + trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return lib.skill.dcsbhaoyi.getCards().length; + }, + frequent: true, + prompt(event, player) { + return get.prompt("dcsbhaoyi") + "(可获得" + get.translation(lib.skill.dcsbhaoyi.getCards()) + ")"; + }, + async content(event, trigger, player) { + let cardx = lib.skill.dcsbhaoyi.getCards(); + await player.gain(cardx, "gain2"); + cardx = cardx.filter(i => get.owner(i) == player && get.position(i) == "h"); + if (!cardx.length) return; + if (_status.connectMode) game.broadcastAll(() => (_status.noclearcountdown = true)); + let given_map = []; + while (player.hasCard(card => cardx.includes(card) && !card.hasGaintag("olsujian_given"), "h")) { + const { + result: { bool, cards, targets }, + } = await player + .chooseCardTarget({ + filterCard(card, player) { + return get.event("cards").includes(card) && !card.hasGaintag("olsujian_given"); + }, + selectCard: [1, Infinity], + position: "h", + filterTarget: lib.filter.notMe, + prompt: "豪义:请选择要分配的卡牌和目标", + ai1(card) { + return !ui.selected.cards.length && card.name == "du" ? 1 : 0; + }, + ai2(target) { + const player = get.event("player"); + const card = ui.selected.cards[0]; + if (card) return get.value(card, target) * get.attitude(player, target); + return 0; + }, + }) + .set("cards", cardx); + if (bool) { + const target = targets[0]; + if (given_map.some(i => i[0] == target)) { + given_map[given_map.indexOf(given_map.find(i => i[0] == target))][1].addArray(cards); + } else given_map.push([target, cards]); + player.addGaintag(cards, "olsujian_given"); + } else break; + } + if (_status.connectMode) { + game.broadcastAll(() => { + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if (given_map.length) { + await game + .loseAsync({ + gain_list: given_map, + player: player, + cards: given_map.slice().map(list => list[1]), + giver: player, + animate: "giveAuto", + }) + .setContent("gaincardMultiple"); + } + }, + getCards() { + let cards = [], + targets = game.players.slice().concat(game.dead.slice()); + for (const target of targets) { + const history = target.getHistory("lose", evt => evt.position == ui.discardPile); + if (history.length) { + for (const evt of history) cards.addArray(evt.cards2.filterInD("d")); + } + } + const historyx = game.getGlobalHistory("cardMove", evt => evt.name == "cardsDiscard"); + if (historyx.length) { + for (const evtx of historyx) cards.addArray(evtx.cards.filterInD("d")); + } + for (const target of targets) { + const history = target.getHistory( + "useCard", + evt => + (evt.cards || []).length && + target.getHistory("sourceDamage", evtx => { + return evtx.card && evtx.card == evt.card; + }).length + ); + if (history.length) { + for (const evt of history) cards.removeArray(evt.cards.filterInD("d")); + } + } + return cards.filter(card => get.tag(card, "damage")); + }, + }, + //关平 + dcsbwuwei: { + audio: 2, + enable: "phaseUse", + filter(event, player) { + const count = player.getStat("skill").dcsbwuwei; + if (count && count > player.countMark("dcsbwuwei_count")) return false; + const colors = player.getCards("h").reduce((list, card) => list.add(get.color(card)), []); + return colors.some(color => event.filterCard(get.autoViewAs(lib.skill.dcsbwuwei.viewAs, player.getCards("h", { color: color })), player, event)); + }, + viewAs: { name: "sha", storage: { dcsbwuwei: true } }, + locked: false, + mod: { + targetInRange(card) { + if (card.storage && card.storage.dcsbwuwei) return true; + }, + cardUsable(card, player, num) { + if (card.storage && card.storage.dcsbwuwei) return Infinity; + }, + }, + filterCard: () => false, + selectCard: -1, + async precontent(event, _, player) { + let colors = player.getCards("h").reduce((list, card) => list.add(get.color(card)), []), + evt = event.getParent(); + colors = colors.filter(color => evt.filterCard(get.autoViewAs(lib.skill.dcsbwuwei.viewAs, player.getCards("h", { color: color })), player, evt)); + colors = colors.map(color => (color == "none" ? "none2" : color)); + const result = await player.chooseControl(colors, "cancel2").set("prompt", "武威:将一种颜色的所有手牌当作【杀】使用").set("ai", () => { + const player = get.event().player; + let controls = get.event().controls.slice(); + controls.remove("cancel2"); + return controls.sort((a, b) => { + return player.countCards("h", { color: a == "none2" ? "none" : a }) - player.countCards("h", { color: b == "none2" ? "none" : b }); + })[0]; + }).forResult(); + const color = result.control == "none2" ? "none" : result.control; + if (color == "cancel2") { + evt.goto(0); + return; + } + player.addTempSkill("dcsbwuwei_effect"); + event.result.cards = player.getCards("h", { color: color }); + event.result.card.cards = player.getCards("h", { color: color }); + }, + ai: { + order(item, player) { + return get.order({ name: "sha" }, player) - 0.001; + }, + }, + subSkill: { + effect: { + charlotte: true, + trigger: { player: "useCard" }, + filter(event, player) { + return (event.card.storage || {}).dcsbwuwei && (event.cards || []).length; + }, + forced: true, + popup: false, + async content(event, trigger, player) { + const func = () => { + const event = get.event(); + const controls = [ + link => { + const evt = get.event(); + if (evt.dialog && evt.dialog.buttons) { + for (let i = 0; i < evt.dialog.buttons.length; i++) { + const button = evt.dialog.buttons[i]; + button.classList.remove("selectable"); + button.classList.remove("selected"); + const counterNode = button.querySelector(".caption"); + if (counterNode) { + counterNode.childNodes[0].innerHTML = ``; + } + } + ui.selected.buttons.length = 0; + game.check(); + } + return; + }, + ]; + event.controls = [ui.create.control(controls.concat(["清除选择", "stayleft"]))]; + }; + if (event.isMine()) func(); + else if (event.isOnline()) event.player.send(func); + 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) + .set("selectButton", [types.length, types.length + 1]) + .set("filterButton", button => { + const selected = ui.selected.buttons.slice().map(i => i.link); + if (selected.length >= get.event().selectButton[0]) return false; + return button.link !=1 || !selected.includes(1); + }) + .set("ai", button => { + const selected = ui.selected.buttons.slice().map(i => i.link); + if (get.event().selectButton >= 3) return selected.includes(button.link) ? 0 : 1; + return [0, 2, 1].slice(0, get.event("selectButton")).includes(button.link) ? 1 : 0; + }) + .set("custom", { + add: { + confirm(bool) { + if (bool != true) return; + const event = get.event().parent; + if (event.controls) event.controls.forEach(i => i.close()); + if (ui.confirm) ui.confirm.close(); + game.uncheck(); + }, + button() { + if (ui.selected.buttons.length) return; + const event = get.event(); + if (event.dialog && event.dialog.buttons) { + for (let i = 0; i < event.dialog.buttons.length; i++) { + const button = event.dialog.buttons[i]; + const counterNode = button.querySelector(".caption"); + if (counterNode) { + counterNode.childNodes[0].innerHTML = ``; + } + } + } + if (!ui.selected.buttons.length) { + const evt = event.parent; + if (evt.controls) evt.controls[0].classList.add("disabled"); + } + }, + }, + replace: { + button(button) { + const event = get.event(); + if (!event.isMine() || !event.filterButton(button)) return; + if (button.classList.contains("selectable") == false) return; + button.classList.add("selected"); + ui.selected.buttons.push(button); + let counterNode = button.querySelector(".caption"); + const count = ui.selected.buttons.filter(i => i == button).length; + if (counterNode) { + counterNode = counterNode.childNodes[0]; + counterNode.innerHTML = `×${count}`; + } else { + counterNode = ui.create.caption(`×${count}`, button); + } + const evt = event.parent; + if (evt.controls) evt.controls[0].classList.remove("disabled"); + game.check(); + }, + }, + }) + .forResult(); + if (result.bool) { + result.links.sort((a, b) => a - b); + for (const i of result.links) { + game.log(player, "选择了", "#g【武威】", "的", "#y第" + get.cnNumber(i + 1, true) + "项"); + } + if (result.links.includes(0)) await player.draw(result.links.filter(count => count == 0).length); + if (result.links.includes(1)) { + for (const target of trigger.targets || []) { + target.addTempSkill("dcsbwuwei_fengyin"); + } + } + if (result.links.includes(2)) { + player.addTempSkill("dcsbwuwei_count"); + player.addMark("dcsbwuwei_count", result.links.filter(count => count == 2).length, false); + } + if ( Array.from({length:3}).map( (_,i) => i).every(i => result.links.includes(i))) { + trigger.baseDamage++; + game.log(trigger.card, "造成的伤害", "#y+1"); + } + } + }, + }, + count: { + charlotte: true, + onremove: true, + intro: { content: "本回合〖武威〗可发动次数+#" }, + }, + fengyin: { + inherit: "fengyin", + }, + }, + }, + //曹昂 + dcsbfengmin: { + audio: 2, + trigger: { global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"] }, + filter(event, player) { + const target = _status.currentPhase; + if ( + !target || + !target.isIn() || + !Array.from({ length: 5 }) + .map((_, i) => i + 1) + .reduce((sum, i) => sum + target.countEmptySlot(i), 0) + ) + return false; + const evt = event.getl(target); + return evt && evt.player == target && (evt.es || []).length; + }, + forced: true, + logTarget: () => _status.currentPhase, + async content(event, trigger, player) { + player.addMark("dcsbfengmin", 1, false); + const target = _status.currentPhase; + await player.draw( + Array.from({ length: 5 }) + .map((_, i) => i + 1) + .reduce((sum, i) => sum + target.countEmptySlot(i), 0) + ); + if (player.countMark("dcsbfengmin") > player.getDamagedHp()) { + player.tempBanSkill("dcsbfengmin"); + } + }, + intro: { content: "本局游戏已发动过#次此技能" }, + }, + dcsbzhiwang: { + audio: 2, + trigger: { player: "dying" }, + filter(event, player) { + const evt = event.getParent(), + evtx = event.getParent(3); + if (!evt || evt.name != "damage" || !evtx || evtx.name != "useCard") return false; + return game.hasPlayer(target => target != player); + }, + usable: 1, + async cost(event, trigger, player) { + event.result = await player + .chooseTarget(get.prompt("dcsbzhiwang"), lib.filter.notMe) + .set("ai", target => { + return get.attitude(get.event("player"), target); + }) + .forResult(); + }, + async content(event, trigger, player) { + if (trigger.source) delete trigger.source; + if (trigger.getParent().source) delete trigger.getParent().source; + event.targets[0].addTempSkill("dcsbzhiwang_effect"); + event.targets[0].markAuto("dcsbzhiwang_effect", [player]); + }, + subSkill: { + effect: { + charlotte: true, + onremove: true, + trigger: { global: "phaseEnd" }, + forced: true, + popup: false, + async content(event, trigger, player) { + let cards = game + .getGlobalHistory("everything", evt => { + if (evt.name != "dying") return false; + if (!player.getStorage("dcsbzhiwang_effect").includes(evt.player)) return false; + const evtx = evt.getParent(3); + return (evtx.cards || []).someInD("d"); + }) + .reduce((cards, evt) => cards.addArray(evt.getParent(3).cards.filterInD("d")), []); + while (cards.length) { + const result = await player + .chooseButton(["质亡:是否使用其中的一张牌?", cards]) + .set("filterButton", button => { + return get.event("player").hasUseTarget(button.link, false); + }) + .set("ai", button => { + if (button.link.name == "jiu") return 10; + return get.event("player").getUseValue(button.link); + }) + .forResult(); + if (result.bool) { + const card = result.links[0]; + cards.remove(card); + player.$gain2(card, false); + await game.asyncDelayx(); + await player.chooseUseTarget(true, card, false); + } + } + }, + intro: { content: "本回合结束时,可以使用令$进入濒死的牌" }, + }, + }, + }, + //典韦 + 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, @@ -151,7 +904,8 @@ game.import("character", function () { 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; @@ -181,7 +935,7 @@ game.import("character", function () { .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; @@ -245,7 +999,7 @@ game.import("character", function () { 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"); } }, @@ -521,7 +1275,10 @@ game.import("character", function () { } } }, - 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: { @@ -561,7 +1318,6 @@ game.import("character", function () { check: () => Math.random() > 0.5, content() { player.changeZhuanhuanji("dcsbfumou"); - //player.changeSkin("dcsbfumou", "dc_sb_jiaxu" + (player.storage.dcsbfumou ? "_shadow" : "")); }, }, }, @@ -583,7 +1339,7 @@ game.import("character", function () { return delt < 0 || (delt > 0 && player.countCards("h")); }, locked(skill, player) { - return player && player.storage.dcshouzhi_modified; + return !(player && player.storage.dcshouzhi_modified); }, derivation: ["dcshouzhi_modified"], onremove: ["dcshouzhi_modified"], @@ -636,7 +1392,7 @@ game.import("character", function () { if (game.online) return; const player = event.player; const evts = player.getAllHistory("useCard", evt => { - return get.color(evt.card, player) === "black" && evt.targets && evt.targets.length; + return evt.targets && evt.targets.length; }); event.set( "dcfenhui_enabled", @@ -652,17 +1408,17 @@ game.import("character", function () { player.awakenSkill("dcfenhui"); const target = event.target; const count = player.getAllHistory("useCard", evt => { - return get.color(evt.card, player) === "black" && evt.targets && evt.targets.includes(target); + return evt.targets && evt.targets.includes(target); }).length; target.addMark("dcfenhui_mark", Math.min(5, count)); + await player.draw(Math.min(5, count)); player.addSkill("dcfenhui_effect"); }, subSkill: { effect: { audio: "dcfenhui", trigger: { - source: "damageBegin1", - global: "die", + global: ["damageBegin1","die"], }, filter(event, player) { return event.player.hasMark("dcfenhui_mark"); @@ -703,7 +1459,7 @@ game.import("character", function () { const count = Math.min( 5, player.getAllHistory("useCard", evt => { - return get.color(evt.card, player) === "black" && evt.targets && evt.targets.includes(target); + return evt.targets && evt.targets.includes(target); }).length ); let value = Math.max(player.getHp(true), 3) - count; @@ -749,13 +1505,16 @@ game.import("character", function () { player: "gainAfter", }, filter(event, player) { - return event.getParent().name === "draw" && event.cards.length >= 2 && event.cards.every(card => get.color(card) === "red"); + return event.getParent().name === "draw" && event.cards.length >= 2 && event.cards.some(card => get.color(card) === "red"); }, forced: true, locked: false, popup: false, async content(event, trigger, player) { - player.addGaintag(trigger.cards, "dcxingmen"); + player.addGaintag( + trigger.cards.filter(card => get.color(card) === "red"), + "dcxingmen" + ); player.addSkill("dcxingmen_directHit"); }, }, @@ -925,6 +1684,7 @@ game.import("character", function () { subSkill: { g: { audio: "dcwuyou", + forceaudio: true, enable: "phaseUse", usable: 1, filter(event, player) { @@ -1057,6 +1817,10 @@ game.import("character", function () { if (!card.cards) return; if (card.cards.some(card => card.hasGaintag("dcwuyou_transfer"))) return Infinity; }, + targetInRange(card, player) { + if (!card.cards) return; + if (card.cards.some(card => card.hasGaintag("dcwuyou_transfer"))) return true; + }, }, }, }, @@ -1172,7 +1936,7 @@ game.import("character", function () { result: { player(player) { const enemies = game.filterPlayer(current => { - return get.rawAttitude(player, current) < 0 && get.attitude(player, current) >= 0; + return (!get.rawAttitude || get.rawAttitude(player, current) < 0) && get.attitude(player, current) >= 0; }), knownEnemies = game.filterPlayer(current => { return get.attitude(player, current) < 0; @@ -1536,7 +2300,10 @@ game.import("character", function () { 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) { @@ -1556,7 +2323,6 @@ game.import("character", function () { 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) { @@ -1608,7 +2374,6 @@ game.import("character", function () { check: () => Math.random() > 0.5, content() { player.changeZhuanhuanji("dcsbquanmou"); - player.changeSkin("dcsbquanmou", "dc_sb_simayi" + (player.storage.dcsbquanmou ? "_shadow" : "")); }, }, true: { @@ -2745,18 +3510,21 @@ game.import("character", function () { 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, @@ -2814,7 +3582,6 @@ game.import("character", function () { 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) { @@ -2831,7 +3598,6 @@ game.import("character", function () { } 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); } @@ -2856,7 +3622,6 @@ game.import("character", function () { check: () => Math.random() > 0.5, content() { player.changeZhuanhuanji("dcsbyingmou"); - player.changeSkin("dcsbyingmou", "dc_sb_zhouyu" + (player.storage.dcsbyingmou ? "_shadow" : "")); }, }, }, @@ -2926,7 +3691,10 @@ game.import("character", function () { 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为你的体力上限)"; @@ -3037,8 +3805,6 @@ game.import("character", function () { 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; @@ -3106,8 +3872,6 @@ game.import("character", function () { check: () => Math.random() > 0.5, content() { player.changeZhuanhuanji("dcsbmengmou"); - //鲁肃暂时没有另一张原画(悲 - //player.changeSkin("dcsbmengmou", "dc_sb_lusu" + (player.storage.dcsbmengmou ? "_shadow" : "")); }, }, }, @@ -3231,11 +3995,16 @@ game.import("character", function () { dcnuanhui: { audio: 2, trigger: { player: "phaseJieshuBegin" }, + filter(event, player) { + return game.hasPlayer(current => current.countCards("e") > 0); + }, direct: true, content: function* (event, map) { const player = map.player; let result = yield player - .chooseTarget(get.prompt("dcnuanhui"), "选择一名装备区有牌的角色,该角色可以依次使用X张基本牌(X为其装备区牌数且至少为1)") + .chooseTarget(get.prompt("dcnuanhui"), "选择一名装备区有牌的角色,该角色可以依次使用X张基本牌(X为其装备区牌数且至少为1)", (card, player, target) => { + return target.countCards("e") > 0; + }) .set("ai", target => { return get.event("aiTarget") == target ? 10 : 0; }) @@ -3823,7 +4592,7 @@ game.import("character", function () { ai: { effect: { target: function (card, player, target) { - if (target.countCards("h") > target.getHp() || player.hasSkillTag("jueqing")) return; + if (target.countCards("h") > target.getHp() || player.hasSkillTag("jueqing", false, target)) return; if (player._dcxiongmu_temp) return; if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return; if (get.tag(card, "damage")) { @@ -3995,6 +4764,12 @@ game.import("character", function () { //新杀许靖 dcshangyu: { audio: 2, + init: () => { + game.addGlobalSkill("dcshangyu_ai"); + }, + onremove: () => { + if (!game.hasPlayer(i => i.hasSkill("dcshangyu"), true)) game.removeGlobalSkill("dcshangyu_ai"); + }, trigger: { global: "phaseBefore", player: "enterGame", @@ -4050,6 +4825,46 @@ game.import("character", function () { player.addSkill("dcshangyu_effect"); }, subSkill: { + ai: { + mod: { + aiOrder(player, card, num) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("dcshangyu_tag") && + game.hasPlayer(current => { + return current.hasSkill("dcshangyu") && get.attitude(player, current) >= 0; + }) + ) + return num + 0.1; + }, + aiValue(player, card, num) { + if ( + get.itemtype(card) == "card" && + card.hasGaintag("dcshangyu_tag") && + game.hasPlayer(current => { + return current.hasSkill("dcshangyu") && get.attitude(player, current) >= 0; + }) + ) + return num / 10; + }, + aiUseful: function () { + return lib.skill.dcshangyu_ai.mod.aiValue.apply(this, arguments); + }, + }, + trigger: { + player: "dieAfter", + }, + filter: () => { + return !game.hasPlayer(i => i.hasSkill("dcshangyu"), true); + }, + silent: true, + forceDie: true, + forced: true, + popup: false, + content: () => { + game.removeGlobalSkill("dcshangyu_ai"); + }, + }, effect: { audio: "dcshangyu", trigger: { @@ -4190,7 +5005,7 @@ game.import("character", function () { (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); } @@ -5687,7 +6502,7 @@ game.import("character", function () { player.reinitCharacter("ganfurenmifuren", character); "step 2"; player.recover(1 - player.hp); - player.addTempSkill("dcxunbie_muteki", { player: "phaseAfter" }); + player.addTempSkill("dcxunbie_muteki"); }, subSkill: { muteki: { @@ -5700,7 +6515,7 @@ game.import("character", function () { trigger.cancel(); }, mark: true, - intro: { content: "防止受到的所有伤害直到我的回合结束" }, + intro: { content: "防止受到的所有伤害直到本回合结束" }, ai: { nofire: true, nothunder: true, @@ -6769,8 +7584,8 @@ game.import("character", function () { } 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; @@ -7512,7 +8327,7 @@ game.import("character", function () { filter: function (event, player, name) { if (player == _status.currentPhase) return name == "logSkill" && event.skill == "dcliying" && player.getExpansions("dcwangyuan").length < game.countPlayer2(); if (name == "logSkill") return false; - if (player.getExpansions("dcwangyuan").length >= game.countPlayer()) return false; + if (player.getExpansions("dcwangyuan").length >= game.countPlayer2()) return false; if (event.name == "gain" && event.player == player) return false; var evt = event.getl(player); return evt && evt.cards2 && evt.cards2.length > 0; @@ -10895,10 +11710,7 @@ game.import("character", function () { 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"); @@ -12752,7 +13564,6 @@ game.import("character", function () { shawu: { audio: 2, trigger: { player: "useCardToTargeted" }, - shaRelated: true, direct: true, filter: function (event, player) { return ( @@ -13115,7 +13926,7 @@ game.import("character", function () { threaten: 0.9, effect: { target: function (card, player, target) { - if (player.hasSkillTag("jueqing")) return; + if (player.hasSkillTag("jueqing", false, target)) return; //if(target.hujia) return; if (player._jinjian_tmp) return; if (_status.event.getParent("useCard", true) || _status.event.getParent("_wuxie", true)) return; @@ -17333,7 +18144,7 @@ game.import("character", function () { duanqiaoxiao: "段巧笑,三国时代魏国魏文帝时的宫人,甚受到魏文帝的宠爱。传说她以原有的化妆品中的米粉和胡粉,再加入葵花子汁,发明了女性化妆用的脂粉。", ruanji: "阮籍(公元210年~263年),字嗣宗,陈留尉氏(今河南省开封市)人,三国时期魏国诗人、竹林七贤之一。阮瑀之子,门荫入仕,累迁步兵校尉,世称阮步兵。崇奉老庄之学,政治上则采取谨慎避祸的态度。景元四年(公元263年),阮籍去世,享年五十三岁。作为“正始之音”的代表,著有《咏怀八十二首》、《大人先生传》等,其著作收录在《阮籍集》中。", ganfurenmifuren: "甘夫人,刘备起兵后于沛城娶之为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。
    糜夫人,刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。", - sunlingluan: "孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。", + sunlingluan: "孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎鸾年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。", zhoubuyi: "周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。", tianshangyi: "田尚衣,一作陈尚衣,魏文帝曹丕宫中著名宫人。能歌善舞,一时冠绝于世,私以为比之汉宫飞燕也不遑多让。", malingli: "马伶俐,游卡桌游原创角色,设定上为,马超之女,其身形虽娇小,却继承了马超英勇略带冲动的个性,活泼阳光,调皮伶俐,爱摆弄爆竹烟花一类的小器具,包包里经常放置用五色彩纸包装的小炸弹球。马伶俐从小跟随马超和马云騄学习战斗技巧,战斗力超强,坚强的意志和勇气也得到了提升,同时擅长马术,有一匹可爱的小白马伴随其身边。后马伶俐成年,嫁与刘备之子刘理,获封梁王妃。两人琴瑟相和,极为恩爱,常结伴出游,被人誉为天作之合。", @@ -17342,6 +18153,7 @@ game.import("character", function () { caoyi: "曹轶,游卡桌游旗下产品《三国杀》原创角色。设定上为曹纯所收养的孙女,从小受到曹纯的教导,在军营中长大,性情坚毅有担当,军事谋略丰富,战斗能力超强。曹轶喜欢美食,特别是甜食,并且擅长制作各种点心。她身边跟随的雪白小老虎是曹纯在她及笄时送的生辰礼物,希望她如小老虎一样,英勇无畏。曹轶与曹婴交好,两人以姐妹相称。曹轶成年后继承祖父衣钵,接手精锐部队“虎豹骑”,成为新的虎豹骑的统领者。", huzun: "胡遵(?~256年),安定临泾(今甘肃省镇原县)人,三国时期曹魏大臣,官至卫将军,封阴密侯。出身安定胡氏。历任征东将军、征东大将军、卫将军等职。早年由张既征辟。后追随司马懿,参与平定匈奴胡薄居姿职叛乱、抵御诸葛亮北伐、平定公孙渊叛乱。嘉平四年(252年),作为曹魏三征之一的征东将军,主持征讨东吴,被诸葛恪击败。正元元年(255年)参与平定淮南三叛的第二叛毌丘俭、文钦之乱,事后升任卫将军。甘露元年(256年)秋七月己卯去世,追赠车骑将军。", guanyue: "关樾,传说记载之人物,声称是关羽之孙,关平长子。未见载于正史,仅记载于清朝地方志以及传说。清·《江陵县志》:“娶镇东将军女赵氏。生子樾,世居江陵。”。清·《关氏宗谱·江陵县儒学册结》:“平子樾,因守祖、父陵墓遂家于荆州焉,此荆州之关氏所由来也。”", + zhupeilan: "景皇后朱氏(234年―265年),吴郡吴县(今江苏省苏州市)人,吴景帝孙休的皇后,野史记载其名为朱佩兰。骠骑将军朱据与朱公主的独生女,吴末帝孙皓的表姐和叔母。出身江南四大姓之一吴郡朱氏。赤乌末年,与孙休成婚,永安元年(258年),孙休继位,封为夫人,永安五年(262年),被立为皇后。孙休去世后为太后,甘露元年秋(265年)被孙皓逼杀,葬于定陵。", }, characterTitle: { // wulan:'#b对决限定武将', @@ -17434,7 +18246,7 @@ game.import("character", function () { }, dcsbyingmou: function (player) { var storage = player.storage.dcsbyingmou; - var str = "转换技,每回合限一次,当你使用牌指定第一个目标后,你可以选择一名目标角色:"; + var str = "转换技,每回合限一次,你对其他角色使用牌后,你可以选择其中一名目标角色:"; if (!storage) str += ''; str += "阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;"; if (!storage) str += ""; @@ -17480,6 +18292,8 @@ game.import("character", function () { caomao: ["caomao", "mb_caomao"], sp_zhenji: ["sp_zhenji", "jsrg_zhenji"], zhugejin: ["zhugejin", "dc_sb_zhugejin"], + caoang: ["caoang", "dc_sb_caoang"], + zhangxiu: ["zhangxiu", "dc_sb_zhangxiu"], }, translate: { puyuan: "蒲元", @@ -17664,7 +18478,7 @@ game.import("character", function () { shawu_info: "当你使用【杀】指定目标后,你可选择一项:⒈弃置两张手牌;⒉移去一枚“沙”并摸两张牌。然后你对目标角色造成1点伤害。", dc_huangzu: "黄祖", dcjinggong: "精弓", - dcjinggong_info: "你可以将一张装备牌当做无距离限制的【杀】使用。当你声明使用此【杀】后,你将此杀的伤害值基数改为X(X为你至此【杀】第一个目标角色的距离且至多为5)。", + dcjinggong_info: "你可以将一张装备牌当做无距离限制的【杀】使用。当你声明使用此【杀】后,你将此【杀】的伤害值基数改为X(X为你至此【杀】第一个目标角色的距离且至多为5)。", dcxiaojuan: "骁隽", dcxiaojuan_info: "当你使用牌指定其他角色为唯一目标后,你可以弃置其一半的手牌(向下取整)。若这些牌中有与你使用牌花色相同的牌,则你弃置一张手牌。", dc_liuyu: "新杀刘虞", @@ -17726,7 +18540,7 @@ game.import("character", function () { dcfengyan: "讽言", dcfengyan_info: "出牌阶段每项各限一次。你可以:⒈令一名体力值不大于你的其他角色交给你一张手牌。⒉视为对一名手牌数不大于你的角色使用一张【杀】(无距离和次数限制)。", dcfudao: "抚悼", - dcfudao_info: "游戏开始时,你选择一名其他角色,称为“继子”角色。当你或“继子”每回合首次使用牌指定对方为目标后,你与其各摸两张牌。当有角色杀死你或“继子”后,该角色称为“决裂”角色。当你或“继子”对“决裂”造成伤害时,此伤害+1。当你成为“决裂”角色使用牌的目标后,其本回合内不能再使用牌。", + dcfudao_info: "游戏开始时,你选择一名其他角色,称为“继子”角色。当你或“继子”每回合首次使用牌指定对方为目标后,你与其各摸两张牌。当有角色杀死你或“继子”后,该角色称为“决裂”角色。当你或“继子”对“决裂”造成伤害时,此伤害+1。当你成为“决裂”角色使用的黑色牌的目标后,其本回合内不能再使用牌。", luyi: "卢弈", dcyaoyi: "邀弈", dcyaoyi_info: "锁定技。①游戏开始时,你令所有存活且未拥有转换技的角色获得〖手谈〗。②你发动〖手谈〗时无需弃置牌,且无次数限制。③所有拥有转换技的角色不能使用牌指定其他拥有转换技且双方所有转换技状态均相同的角色为目标。", @@ -17888,7 +18702,7 @@ game.import("character", function () { dcchanjuan: "婵娟", dcchanjuan_info: "每种牌名限两次。当你使用手牌中仅指定单一目标的【杀】或普通锦囊牌结算结束后,你可以视为使用一张名称和属性均相同的牌。若这两张牌指定的目标完全相同,你摸一张牌。", dcxunbie: "殉别", - dcxunbie_info: "限定技。当你进入濒死状态时,你可以将此武将牌替换为“甘夫人”或“糜夫人”(不能选择已在场上的武将)。然后回复至1点体力并防止所有伤害直到你的下一个回合结束。", + dcxunbie_info: "限定技。当你进入濒死状态时,你可以将此武将牌替换为“甘夫人”或“糜夫人”(不能选择已在场上的武将)。然后回复至1点体力并防止所有伤害直到本回合结束。", dc_mifuren: "糜夫人", dcguixiu: "闺秀", dcguixiu_info: "锁定技。①回合开始时,若你于本局游戏未发动过〖闺秀①〗,你摸两张牌。②当你发动〖存嗣〗后,你回复1点体力。", @@ -17994,7 +18808,7 @@ game.import("character", function () { dcsbronghuo: "融火", dcsbronghuo_info: "锁定技,当你使用火【杀】或【火攻】时,此牌伤害基值改为场上势力数。", dcsbyingmou: "英谋", - dcsbyingmou_info: "转换技,每回合限一次,当你使用牌指定其他角色为目标后,你可以选择一名目标角色:阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。", + dcsbyingmou_info: "转换技,每回合限一次,当你对其他角色使用牌后,你可以选择其中一名目标角色:阴,你将手牌数摸至与其相同(至多摸五张),然后视为对其使用一张【火攻】;阳,令一名手牌数为全场最大的角色对其使用手牌中所有的【杀】和伤害类锦囊牌(若其没有可使用的牌则将手牌数弃至与你相同)。", caoxian: "曹宪", dclingxi: "灵犀", dclingxi_info: "出牌阶段开始和结束时,你可以将至多X张牌称为“翼”置于你的武将牌上(X为你的体力上限)。当你失去武将牌上的“翼”时,你将手牌数调整至Y张(Y为你武将牌上的“翼”所含有的花色数的两倍)。", @@ -18071,9 +18885,9 @@ game.import("character", function () { dcshouzhi_modified: "守执·改", dcshouzhi_modified_info: "一名角色的回合结束时,若你的手牌数:大于本回合开始时的手牌数,你可以弃置一张手牌;小于本回合开始时的手牌数,你可以摸两张牌。", dcfenhui: "奋恚", - dcfenhui_info: "限定技。出牌阶段,你可以令一名角色获得X枚“恨”标记,你摸等量的牌(X为本局游戏你使用黑色牌指定其为目标的次数,至多为5)。你获得如下效果:⒈当你对其造成伤害时,你移去其1枚“恨”,令此伤害+1;⒉当其死亡时,若其有“恨”,你减1点体力上限,修改〖守执〗并获得〖兴门〗。", + dcfenhui_info: "限定技。出牌阶段,你可以令一名角色获得X枚“恨”标记,你摸等量的牌(X为本局游戏你使用牌指定其为目标的次数,至多为5)。你获得如下效果:⒈当其受到伤害时,你移去其1枚“恨”,令此伤害+1;⒉当其死亡时,若其有“恨”,你减1点体力上限,修改〖守执〗并获得〖兴门〗。", dcxingmen: "兴门", - dcxingmen_info: "①当你因〖守执〗弃置而失去牌后,你可以回复1点体力。②当你因摸牌而得到牌后,若这些牌均为红色且牌数不小于2,则你使用这些牌时不能被响应。", + dcxingmen_info: "①当你因〖守执〗弃置而失去牌后,你可以回复1点体力。②当你因摸牌而得到牌后,若牌数不小于2且其中有红色牌,则你使用其中的红色牌时不能被响应。", dc_sb_jiaxu: "新杀谋贾诩", dc_sb_jiaxu_prefix: "新杀谋", dcsbsushen: "肃身", @@ -18090,6 +18904,46 @@ game.import("character", function () { dcsbhoude_info: "当你于其他角色的出牌阶段内首次成为红色【杀】/黑色普通锦囊牌的目标后,你可以弃置你/其的一张牌,令此牌对你无效。", dcsbzijin: "自矜", dcsbzijin_info: "锁定技。①你不能成为〖讨州〗的目标。②当你使用牌结算结束后,若此牌未造成过伤害,你须弃置一张牌或失去1点体力。", + dc_wangling: "新杀谋王淩", + dc_wangling_prefix: "新杀谋", + dc_simashi: "新杀谋司马师", + dc_simashi_prefix: "新杀谋", + dc_caoshuang: "新杀谋曹爽", + dc_caoshuang_prefix: "新杀谋", + dc_jiangji: "新杀谋蒋济", + dc_jiangji_prefix: "新杀谋", + dc_sb_caoang: "新杀谋曹昂", + dc_sb_caoang_prefix: "新杀谋", + dcsbfengmin: "丰愍", + 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: "武威", + dcsbwuwei_info: "出牌阶段限一次,你可以将一种颜色的所有手牌当作无距离和次数限制的【杀】使用,然后你选择X次执行以下项(X为转化为此【杀】的牌的类别数):①摸一张牌;②令目标角色本回合非锁定技失效;③令本回合〖武威〗可发动次数+1。然后若你选择了所有项,则此【杀】造成的伤害+1。", + dc_sb_zhangxiu: "新杀谋张绣", + dc_sb_zhangxiu_prefix: "新杀谋", + dcsbfuxi: "附袭", + dcsbfuxi_info: "其他角色的出牌阶段开始时,若其手牌数为全场最多,则你可以选择一项:①交给其一张牌,然后摸两张牌;②弃置其一张牌,然后视为对其使用一张【杀】。", + dcsbhaoyi: "豪义", + dcsbhaoyi_info: "结束阶段,你可以获得本回合进入弃牌堆的所有未造成过伤害的伤害牌,然后你可以将这些牌任意分配给其他角色。", + zhupeilan: "朱佩兰", + dccilv: "辞虑", + dccilv_info: "当你成为普通锦囊牌的目标后,你可以摸剩余选项数的牌,然后若你的手牌数大于你的体力上限,则你选择执行并移去一项:①令此牌对你无效;②防止此牌对你造成的伤害;③于此牌结算完毕后获得此牌对应的所有实体牌。", + dctongdao: "痛悼", + dctongdao_info: "限定技,当你进入濒死状态时,你可以选择一名角色,令其将其拥有的技能重置至游戏开始时的状态,然后若其不为你,则你将体力值回复至与其相同。", + bianyue: "卞玥", + dcbizu: "庇族", + dcbizu_info: "出牌阶段,你可以令所有手牌数与你相同的角色摸一张牌。然后若这些角色与本回合此前某次发动〖庇族〗的目标角色均相同,本回合〖庇族〗失效。", + dcwuxie: "无胁", + dcwuxie_info: "每回合限一次,当你获得牌后,你可以将其中任意张伤害牌置于牌堆底并令一名其他角色弃置等量张牌。", sp2_yinyu: "隐山之玉", sp2_huben: "百战虎贲", @@ -18106,7 +18960,10 @@ game.import("character", function () { sp2_gaoshan: "高山仰止", sp2_qifu: "祈福", sp2_mouding: "谋定天下", + sp2_zhonghu: "冢虎狼顾", sp2_zijing: "子敬邀刀", + sp2_dushi: "毒士鸩计", + xianding_waitforsort: "等待分包", }, }; }); diff --git a/character/xianjian.js b/character/xianjian.js index f039adbb..d17e7bd1 100644 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -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.js b/character/xinghuoliaoyuan.js index 5d523ad0..68dcf593 100644 --- a/character/xinghuoliaoyuan.js +++ b/character/xinghuoliaoyuan.js @@ -1891,7 +1891,7 @@ game.import("character", function () { sp_taishici: ["sp_taishici", "re_sp_taishici"], mazhong: ["mazhong", "re_mazhong"], wenpin: ["wenpin", "re_wenpin"], - liuyan: ["liuyan", "jsrg_liuyan", "ol_liuyan"], + liuyan: ["liuyan", "jsrg_liuyan", "junk_liuyan"], }, translate: { xinghuoliaoyuan: "星火燎原", diff --git a/character/yijiang.js b/character/yijiang.js index 8a9c92f7..8002f0e1 100644 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -14,8 +14,8 @@ game.import("character", function () { yijiang_2016: ["guohuanghou", "sunziliufang", "huanghao", "liyan", "sundeng", "cenhun", "zhangrang", "liuyu"], yijiang_2017: ["xinxianying", "jikang", "wuxian", "qinmi", "xuezong", "xushi", "caiyong", "caojie"], yijiang_2022: ["lukai", "kebineng", "zhugeshang", "liwan", "wuanguo", "hanlong", "yj_sufei", "yj_qiaozhou"], - yijiang_2023: ["xiahoumao", "chenshi", "sunli", "feiyao"], - yijiang_2024: ["linghuyu", "yj_simafu", "yj_xuangongzhu", "xukun"], + yijiang_2023: ["xiahoumao", "chenshi", "sunli", "feiyao", "linghuyu", "yj_simafu", "yj_xuangongzhu", "xukun"], + // yijiang_2024: [], }, }, character: { @@ -111,7 +111,7 @@ game.import("character", function () { old_huaxiong: ["male", "qun", 6, ["shiyong"]], - yujin: ["male", "wei", 4, ["rezhenjun"], []], + yujin: ["male", "wei", 4, ["rezhenjun"], ["die_audio:ol_yujin"]], linghuyu: ["male", "wei", 4, ["xvzhi"]], yj_simafu: ["male", "wei", 3, ["beiyu", "duchi"]], @@ -571,9 +571,22 @@ game.import("character", function () { 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) => { @@ -3648,42 +3661,39 @@ game.import("character", function () { 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: { @@ -3904,7 +3914,7 @@ game.import("character", function () { return player.isMaxHandcard(); }, check: function (event, player) { - if (player.getHistory("skipped").length > 0) return false; + if (!player.hasSkill("pingkou") && !player.hasSkill("xinpingkou") || player.getHistory("skipped").length > 0) return false; return game.hasPlayer(function (current) { return get.attitude(player, current) < 0 && current.hp == 1 && get.damageEffect(current, player, player) > 0; }); @@ -3922,6 +3932,7 @@ game.import("character", function () { return player.isMaxHp(); }, check: function (event, player) { + if (!player.hasSkill("pingkou") && !player.hasSkill("xinpingkou")) return false; if (!player.needsToDiscard() || (player.countCards("e") && player.isMaxEquip())) return true; if (player.getHistory("skipped").length > 0) return false; return game.hasPlayer(function (current) { @@ -3946,9 +3957,6 @@ game.import("character", function () { }, }, }, - ai: { - combo: "pingkou", - }, }, pingkou: { audio: 2, @@ -3981,7 +3989,6 @@ game.import("character", function () { } }, ai: { - combo: "fenli", effect: { target: function (card) { if (card.name == "lebu" || card.name == "bingliang") return 0.5; @@ -4291,7 +4298,6 @@ game.import("character", function () { intro: { content: "已经发动过了#次" }, }, zhuandui: { - shaRelated: true, audio: 2, group: ["zhuandui_respond", "zhuandui_use"], subSkill: { @@ -6190,7 +6196,7 @@ game.import("character", function () { trigger.num++; }, ai: { - halfneg: true, + neg: true, }, }, huisheng: { @@ -7138,7 +7144,7 @@ game.import("character", function () { }, xinjuece: { audio: "juece", - audioname: ["dc_liru"], + audioname: ["dc_liru", "ol_liru"], trigger: { player: "phaseJieshuBegin" }, direct: true, filter: function (event, player) { @@ -7164,7 +7170,7 @@ game.import("character", function () { }, }, xinmieji: { - audio: 2, + audio: "mieji", enable: "phaseUse", usable: 1, filter: function (event, player) { @@ -7529,9 +7535,12 @@ game.import("character", function () { }, effect: { player: function (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]; } } @@ -8376,7 +8385,6 @@ game.import("character", function () { }, longyin: { audio: 2, - shaRelated: true, init: player => { game.addGlobalSkill("longyin_order"); }, @@ -8993,7 +9001,7 @@ game.import("character", function () { if (player.hp != 1) return false; }, respondSha: true, - halfneg: true, + neg: true, }, audio: 2, audioname: ["xin_zhangyi"], @@ -9591,7 +9599,7 @@ game.import("character", function () { }, }, // taoxi:{ - // audio:2, + // audio: "qingxi", // trigger:{player:'useCardToPlayered'}, // filter:function(event,player){ // return _status.currentPhase==player&&event.targets.length==1&& @@ -9682,7 +9690,7 @@ game.import("character", function () { // }, // taoxi4:{}, taoxi: { - audio: 2, + audio: "qingxi", trigger: { player: "useCardToPlayered" }, check: function (event, player) { if (get.attitude(player, event.target) >= 0) return false; @@ -10232,13 +10240,12 @@ game.import("character", function () { }, }, 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); @@ -10445,7 +10452,7 @@ game.import("character", function () { fencheng: { skillAnimation: "epic", animationColor: "gray", - audio: 2, + audio: "xinfencheng", enable: "phaseUse", filter: function (event, player) { return !player.storage.fencheng; @@ -10615,6 +10622,7 @@ game.import("character", function () { }, juece: { audio: 2, + audioname: ["dc_liru", "ol_liru"], trigger: { global: ["loseAfter", "equipAfter", "addJudgeAfter", "gainAfter", "loseAsyncAfter", "addToExpansionAfter"], }, @@ -11571,7 +11579,7 @@ game.import("character", function () { }, }, dingpin: { - audio: 2, + audio: "pindi", enable: "phaseUse", onChooseToUse: function (event) { if (event.type != "phase" || game.online) return; @@ -11888,7 +11896,7 @@ game.import("character", function () { threaten: 0.8, effect: { target: function (card, player, target) { - if (get.tag(card, "damage")) { + if (get.tag(card, "damage") && (player.hasSkill("paiyi") || player.hasSkill("zili"))) { if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; if (!target.hasFriend()) return; if (target.hp >= 4) return [0.5, get.tag(card, "damage") * 2]; @@ -11991,7 +11999,7 @@ game.import("character", function () { skillAnimation: true, animationColor: "gray", audio: 2, - audioname: ["xin_caifuren"], + audioname: ["xin_caifuren", "ol_caifuren"], unique: true, limited: true, enable: "phaseUse", @@ -13954,12 +13962,12 @@ game.import("character", function () { }, }, enyuan: { - audio: 2, + audio: 4, locked: true, group: ["enyuan1", "enyuan2"], }, enyuan1: { - audio: true, + audio: ["enyuan3.mp3", "enyuan4.mp3"], trigger: { player: "damageEnd" }, forced: true, filter: function (event, player) { @@ -13998,7 +14006,7 @@ game.import("character", function () { }, }, enyuan2: { - audio: true, + audio: ["enyuan1.mp3", "enyuan2.mp3"], trigger: { player: "recoverEnd" }, forced: true, logTarget: "source", @@ -14317,7 +14325,7 @@ game.import("character", function () { maixie_hp: true, effect: { target: function (card, player, target) { - if (get.tag(card, "damage") && (player.hasSkill("paiyi") || player.hasSkill("zili"))) { + if (get.tag(card, "damage")) { if (player.hasSkillTag("jueqing", false, target)) return [1, -2]; if (!target.hasFriend()) return; if (target.hp >= 4) return [1, 2]; @@ -14388,7 +14396,7 @@ game.import("character", function () { trigger: { player: "damageEnd" }, direct: true, filter: function (event, player) { - return player.countCards("h") > 0 && player.isDamaged(); + return player.countCards("h") > 0; }, content: function () { "step 0"; @@ -14421,11 +14429,7 @@ game.import("character", function () { event.finish(); } "step 2"; - if (event.recover) { - player.recover(); - } else if (result.bool) { - //player.draw(); - } else { + if (event.recover || !result.bool) { player.recover(); } }, @@ -14598,7 +14602,7 @@ game.import("character", function () { threaten: 0.9, effect: { target: function (card, player, target) { - if (player.hasSkillTag("jueqing")) return; + if (player.hasSkillTag("jueqing", false, target)) return; if (target.hujia) return; if (player._shibei_tmp) return; if (target.hasSkill("shibei_ai")) return; @@ -15017,7 +15021,7 @@ game.import("character", function () { }, diezhang: function (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 + "张【杀】"; @@ -15034,17 +15038,17 @@ game.import("character", function () { }, characterReplace: { 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"], @@ -15053,7 +15057,7 @@ game.import("character", function () { 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"], @@ -15061,7 +15065,7 @@ game.import("character", function () { panzhangmazhong: ["panzhangmazhong", "re_panzhangmazhong", "xin_panzhangmazhong"], yufan: ["yufan", "ol_yufan", "xin_yufan", "re_yufan"], zhuran: ["zhuran", "re_zhuran", "xin_zhuran", "old_zhuran"], - liru: ["xin_liru", "dc_liru", "re_liru", "yj_liru", "+liru"], + liru: ["xin_liru", "liru", "dc_liru", "re_liru", "yj_liru", "ol_liru"], fuhuanghou: ["fuhuanghou", "re_fuhuanghou", "xin_fuhuanghou", "old_fuhuanghou"], chenqun: ["chenqun", "dc_chenqun", "re_chenqun", "old_chenqun"], hanhaoshihuan: ["hanhaoshihuan", "re_hanhaoshihuan"], @@ -15082,8 +15086,8 @@ game.import("character", function () { gongsunyuan: ["gongsunyuan", "re_gongsunyuan"], zhoucang: ["zhoucang", "re_zhoucang", "xin_zhoucang"], guotufengji: ["guotufengji", "re_guotufengji"], - guanping: ["guanping", "re_guanping"], - caifuren: ["caifuren", "re_caifuren", "xin_caifuren"], + guanping: ["guanping", "re_guanping", "dc_sb_guanping"], + caifuren: ["caifuren", "re_caifuren", "xin_caifuren", "ol_caifuren"], guyong: ["guyong", "re_guyong", "xin_guyong", "tw_guyong"], yj_jushou: ["yj_jushou", "re_jushou", "xin_jushou"], guohuanghou: ["guohuanghou", "re_guohuanghou"], @@ -15099,7 +15103,7 @@ game.import("character", function () { 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"], @@ -15189,7 +15193,7 @@ game.import("character", function () { 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: "清弦", @@ -15230,9 +15234,9 @@ game.import("character", function () { 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: "复难", @@ -15424,11 +15428,11 @@ game.import("character", function () { 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为其体力值)。若如此做,当前回合结束后,该角色获得其武将牌旁的所有牌。", @@ -15726,7 +15730,7 @@ game.import("character", function () { 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: "督粮", @@ -15761,7 +15765,7 @@ game.import("character", function () { yjzhuiji: "追姬", yjzhuiji_info: "当你死亡时,你可以令一名角色从牌堆和弃牌堆中的随机使用任意装备牌直至其没有空置的装备栏。若如此做,当其失去以此法使用的装备牌后,其废除对应的装备栏。", fazhu: "筏铸", - fazhu_info: "准备阶段,你可以重铸你的区域内的所有非伤害牌,然后将以此法获得的牌交给至多等量名角色各一张,这些角色可以依次使用一张无距离限制的【杀】。", + fazhu_info: "准备阶段,你可以重铸你的区域内任意张非伤害牌,然后将以此法获得的牌交给至多等量名角色各一张,这些角色可以依次使用一张无距离限制的【杀】。", yijiang_2011: "一将成名2011", yijiang_2012: "一将成名2012", diff --git a/character/yingbian.js b/character/yingbian.js index 4e81e94d..22862092 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -2343,6 +2343,9 @@ game.import("character", function () { if (player.getEquips(5).length) return distance - 1; }, }, + ai: { + combo: "chexuan" + }, }, cheliji_sichengliangyu: { trigger: { global: "phaseJieshuBegin" }, diff --git a/character/yxs.js b/character/yxs.js index 65860cbd..0b940b9e 100644 --- a/character/yxs.js +++ b/character/yxs.js @@ -3120,7 +3120,7 @@ game.import("character", function () { yxs_nandinggeer: "南丁格尔", yxs_weizhongxian: "魏忠贤", yxs_lanlinwang: "兰陵王", - yxs_meixi: "妹喜", + yxs_meixi: "妺喜", yxs_qinqiong: "秦琼", yxs_fanji: "反击", @@ -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/docker/docker.md b/docker/docker.md new file mode 100644 index 00000000..4256bf72 --- /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 00000000..a4a1c4ce --- /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 00000000..bbdf0e96 --- /dev/null +++ b/docker/start.sh @@ -0,0 +1,2 @@ +node index & +(cd game && node server.js) diff --git a/docs/async-guide.md b/docs/async-guide.md new file mode 100644 index 00000000..86ce6a3a --- /dev/null +++ b/docs/async-guide.md @@ -0,0 +1,691 @@ +# Async 章节 + +无名杀在v1.10.6的时候由 @nonameShijian 引入了一种全新的技能效果代码写法,这种写法与原有写法最大的区别在于,这种写法的content函数是一个带有`async`标识符的函数,而不是原来存在`step`字样的普通函数。 + +比如原来的写法是: + +```javascript +let skill = { + content: function () { + "step 0" + player.draw(2); + "step 1" + player.chooseToDiscard(2, true); + } +} +``` + +而新的写法是: + +```javascript +let skill = { + content: async function (event, trigger, player) { + await player.draw(2); + await player.chooseToDiscard(2, true); + } +} +``` + +我们称这种新的写法叫做`Async Content`;为了区分,我们将原来那种写法称作`Step Content` + +相比于原来的`Step Content`,`Async Content`在设计上更加贴近原有的Javascript语法,并且能很方便的实现之前`Step Content`无法做到或很难做到的事情,故无名杀未来更新武将的技能代码中将主要使用这种形式,这也将成为无名杀未来的开发方向 + +本章节将简单的介绍: + +- 了解`async`函数 +- `Async Content`的形式与使用 +- `Async Content`相比原有形式的优势 + +> 此章节面向于JavaScript基础稍微薄弱的,对于async函数相关用法不熟悉的开发者,所以本章节在编写时偏向于技能写法,而不是专业的JavaScript异步编程讲解,如果想要了解更加详细的JavaScript异步编程,请参考[JavaScript异步编程指南](https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Asynchronous) + +## 一、了解`async`函数 + +一般来说,async函数只需要在函数的声明前加上`async`标识符即可,如: + +```javascript +// 命名函数 +async function named() { ... } + +// 匿名函数 +let anonymous = async function () { ... } +``` + +被标记为async的函数拥有以下特性: + +- 必然返回一个Promise对象 +- 可以在async函数中使用`await`来等待一个Promise对象 + +此时我们就又引入了两个概念:`Promise`和`await` + +### `Promise` + +Promise是JavaScript中的一种异步编程解决方案,它允许你以一种更优雅的方式处理异步操作 + +在最初的Javascript异步编程中,我们通常使用回调函数来处理异步操作,但是这种方式存在一些问题,比如回调地狱和难以阅读 + +我们会在后文需要用到`Promise`的地方再介绍这个概念,这里仅作提出 + +由于无名杀编写技能并不会出现回调地狱的情况,所以这里我们不会对Promise进行过多的介绍,如果你对Promise感兴趣,可以参考[Promise对象](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise) + +### `await` + +`await`是JavaScript中的一个关键字,它允许你在async函数中等待一个Promise对象的状态发生变化 + +`await`与`async`共同组成了新的异步形态,使`Javascript`的异步能像同步代码般编写 + +事实上,`await`不仅会等待一个`Promise`事件,它还能等待别的符合要求的东西,这类东西我们称作可`await`的东西;我们将在后文再次介绍这个概念 + +如果你对`await`感兴趣,可以参考[async 和 await](https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Asynchronous/Promises#async_%E5%92%8C_await),本章节仅针对无名杀技能中使用的`await`进行介绍 + +## 二、`Async Content`的形式与使用 + +### 1. `Async Content`怎么用 + +我们先来看看一个`Step Content`的技能: + +```javascript +let skill = { + trigger: { + player: "phaseBegin", + }, + content: function () { + "step 0" + player.draw(2); + }, +}; +``` + +这个技能对应的描述是: `当你回合开始时,你摸两张牌` + +然后我们再来看一个`Async Content`的技能: + +```javascript +let skill = { + trigger: { + player: "phaseBegin", + }, + content: async function (event, trigger, player) { + await player.draw(2); + }, +}; +``` + +这两处代码有下面几处变化: + +1. 添加了`async`在函数前面 +2. 添加了三个参数: `event`,`trigger`,`player` +3. 函数里面的`"step 0"`被删除了 +4. `player.draw`之前添加了`await` + +接下来我们来具体聊聊这些改变究竟带来了什么 + +### 2. `Async Content`相对于`Step Content`的有啥变化 + +`Async Content`可以让`content`这类step写法的函数贴近普通的函数 + +例如,函数`filter`要求你写出`(event, player, name)`参数,然后你才可以用`event`/`player`/`name`三个变量 + +而`Async Content`也是如此,你需要写出`(event, trigger, player)`三个由无名杀提供的参数才能使用`event`/`trigger`/`player`三个变量 + +这样的好处是统一规范了函数写法,减少了新开发者的疑惑,你所使用的`event`/`trigger`/`player`都是你看得到的 + +到这里你可能会反应过来,平常在`step`写法中经常直接使用`card`/`target`/`num`等变量,现在参数里面没有这些变量,要怎么样引用这些变量呢? + +如果你稍微了解过Javascript的语法,你应该明白`Step Content`的`step x`本应该没任何作用,而无名杀中则通过动态编译使`step x`转换成了普通的Javascript代码,而这一过程中同时将`card`/`target`/`num`等变量注入在函数参数内,使得我们能直接调用 + +而`card`/`target`/`num`等变量,均为`event`的属性;换言之,我们用`event.card`/`event.target`/`event.num`就可以代替原本的`card`/`target`/`num`这些变量了 + +你或许已经注意到了,`Async Content`省去了编译过程。在原有的`Step Content`中,如果函数出现报错,会发现提示的报错位置是一个`VM xx`,这个标识就是Javascript引擎存储动态编译代码的地方,但这种情况下我们的调试问题将受到影响。而`Async Content`不会经过动态编译,故报错/调试代码将会变得更加简单 + +值得注意的是,`event.step`变量在async函数中不再有意义,因为没有了`step`标注,本体也无法确定async函数执行到了哪一步,自然`event.step`的值也就没有了意义 + +### 3. 那么`Async Content`如何写出分步的效果呢? + +上文已经提到过,`Step Content`会经过动态编译 + +我们看看这个例子: + +```javascript +let skill = { + trigger: { + player: "phaseBegin", + }, + content() { + "step 0" + player.addTempSkill("jiang"); + player.draw(2); + "step 1" + if (player.countCards("h") > 5) { + player.chooseToDiscard(2, true); + } + player.addMark("jiang"); + }, +}; +``` + +> 技能描述: 出牌阶段限一次,你可以于本回合获得【激昂】并摸两张牌,然后若手牌数量超过五张,你弃置两张牌;若如此做,你获得一枚【激昂】 + +> 激昂没有标记,但为了好理解,我们假设存在这种标记。 + +很明显,我们这里至少需要分为两步,因为我们要在摸牌之后计算手牌数量,也就是说,我们需要等待“摸牌”这个动作 + +而分步的作用正是等待这一步所有结算完成,再执行下一步 + +如果不分步就执行`countCards`,会导致我们读取的是摸牌前的手牌数量(因为此时摸牌还没开始),从而导致效果与描述不一致 + +在经过动态编译后,content函数会变成这样: + +```javascript +let skill = { + trigger: { + player: "phaseBegin" + }, + // 添加的参数在此省略 + content: function (...) { + if (event.step >= 2) return event.finish(); + + switch (event.step) { + case 0: + player.addTempSkill("jiang"); + player.draw(2); + break;case 1: + if (player.countCards("h") > 5) { + player.chooseToDiscard(2, true); + } + player.addMark("jiang"); + } + } +} +``` + +很抱歉我在此处使用了很丑陋的代码,但这确实是编译后理应拥有的结果。 + +我们发现,编译后的`content`函数,在`event.step == 0`时,会只执行到`player.draw(2);`,然后结束函数的执行;无名杀引擎会自动让`event.step++`,然后等待摸牌结束后,再次执行这个函数。此时我们的`event.step == 1`,就会开始检查手牌是否大于5,然后根据情况决定是否执行弃牌。 + +此时如果我们要在弃牌后才开始获得标记,就需要在选择弃牌和获得标记间添加新的`step`,这样就会变成下面的情况: + +```javascript +function (...) { + if (event.step >= 3) return event.finish(); + + switch (event.step) { + case 0: + player.addTempSkill("jiang"); + player.draw(2); + break;case 1: + if (player.countCards("h") > 5) { + player.chooseToDiscard(2, true); + } + break;case 2: + player.addMark("jiang"); + } +} +``` + +这样我们就会在`player.chooseToDiscard`后才开始获得标记 + +综上所述,我们已经明白了`Step Content`的基本原理。而不难发现,`Step Content`所作的一切,大部分情况下,是为了**等事件运行完**。 + +虽然我们并未详细讲过什么是“异步”,但你大概能反应过来,上面所说的“等事件运行完”,就是异步。 + +既然如此,那么async函数自然就能达成这一目的,因为async函数就是现阶段下,符合逻辑的异步的最佳实践。 + +那么我们来看看async写法: + +```javascript +let skill = { + trigger: { + player: "phaseBegin", + }, + content: async function (event, trigger, player) { + player.addTempSkill("jiang"); + await player.draw(2); + if (player.countCards("h") > 5) { + await player.chooseToDiscard(2, true); + } + player.addMark("jiang"); + }, +}; +``` + +我们可以看到分步没有了,取而代之的是每次操作前面附加了一个`await`;这个`await`表示的是,会等待后面的代码运行完毕,再执行后续的代码 + +而此时,你可能会有疑惑:如果我现在需要获得所摸的牌,我该怎么办? + +原先分步情况下你可以在下一步中用`result`变量来获取上一步事件的结果,而现在,当我们`await`之后,我们可以这样做: + +```javascript +let drawEvent = await player.draw(2); +``` + +你或许也发现了,无论是无名杀的分步,还是Javascript原来的回调异步,都会存在“结果”。就好比你做一件事,就算最后没有因为这件事得到任何东西,此时的情况也是一种“结果” + +而`await`也同理,在等待事件结束后,便会得到这个“结果”。而对于`player.draw(2)`这种常见的,需要分步得到`result`的,我们称之为“事件“的东西,`await`后返回的,是事件本身;而事件的结果,则是该事件的`result`属性 + +我们把“`await`后会等待后续事物执行完毕,并返回新的东西”的东西,简单的称作能`await`的东西;在后文中我们会再次讨论这块的内容 + +换句话说,摸牌函数返回的`drawEvent`事件,是一个可`await`的东西;而`await`一个事件,就是等待一个事件运行结束,并获取这个事件本身 + +故我们接下来就能这样获取我们所摸的牌: + +```javascript +let cards = drawEvent.result; +``` + +如果你不需要事件,只需要对应的结果,无名杀提供了对应的方法,你可以使用`forResult`函数: + +```javascript +let cards = await player.draw(2).forResult(); +``` + +当然,Javascript也有对应的语法帮助我们,那就是[解构赋值](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment): + +```javascript +let { result: cards } = await player.draw(2); +``` + +两种方法都能得到结果,只要不混用就行;如果你对Javascript的新语法不熟悉,只需要简单的使用`forResult`就行 + +实际上`await`没有那么死板,你完全可以把`await`放在任何你想要的地方,只有能`await`的情况才会等待,反之会原封不动的将值返回过来 + +就比如,你可以: + +```javascript +await player.addTempSkill("jiang"); +``` + +`player.addTempSkill`并不需要等待,但你等待也不会出啥问题,此时`await`后的返回值仍然是`player.addTempSkill`原有的返回值;`await`只会处理需要等待的东西 + +### 4. 一些原有操作的代替品 + +如果你了解无名杀的技能代码,你一定会知道下面三个函数: + +- `event.goto`: 跳转到指定步 +- `event.redo`: 重新执行当前步 +- `event.finish`: 结束当前事件 + +如果要使用`Async Content`,那么这些函数自然需要替换,因为已经不再需要`step`这个概念了;至于`event.finish`,因为`Async Content`的机制很复杂,故将`event.finish`的操作交给无名杀会是个更好的选择 + +#### 代替`event.finish` + +我们先从`event.finish`开始,它的作用是结束当前事件,那么如何替代它呢? + +`Async Content`的核心就是使用async函数,而且我们只会执行一遍async函数;也就是说,如果我们要结束一个事件,只需要结束这个函数的执行就行。那如果要退出一个函数,你会使用什么呢? + +我们知道,`return`语句会中断函数的执行,并将后面的值作为函数的返回值。那么,对于`Async Content`,我们只需要在需要结束的时候提前`return`,就能达到效果。 + +也就是说你可以把 + +```javascript +if (!result.bool) event.finish(); +``` + +直接写成 + +```javascript +if (!result.bool) return; +``` + +同时,如果你在分步中使用`event.finish()`结束事件,代码并不会立刻停止执行,当前步后面的代码依旧会继续执行,直到当前步结束为止。如果你要阻止后续代码的执行,你还需要额外进行处理才能不继续执行后续代码 + +而`return`会立刻停止函数执行,不需要你再额外进行处理 + +当然你可能会问,`Async Content`需不需要确切的返回值?不需要,甚至不应该要,因为实现的复杂性,如果你返回了一个可`await`的东西,那么无名杀也会等后面的东西执行完毕才认为这个函数执行完毕,而这可能会导致这个函数循环等待而永远无法执行完毕;故在任何情况下,`Async Content`的`return`后面都不应该跟任何东西 + +就比如,如果你尝试`return event.finish()`这条在`Step Content`中非常常见的代码,由于`event.finish()`会返回被结束的事件,故`event`的函数就会等待`event`的结束——而在`event`的函数执行完前,`event`都不会结束,故此时`event`将永远无法执行完成,这也是非常经典的循环引用 + +如果你因为一些操作必须得有,请使用`void`语句,这个语句会无视后面的值,一律返回`undefined`,比如: + +```javascript +return void await player.draw(2); +``` + +我们不但等待了`player.draw`,而且返回的内容也是`undefined` + +> 实际上,我们现在所提到的事件,比如`player.draw`所返回的东西,实际上并不是`GameEvent`,而是`GameEventPromise`,前者并不是可`await`的东西,而后者是。`GameEventPromise`的诞生就是为了使无名杀的事件成为一个可`await`的东西,这里面涉及到一些复杂的实现,本章节不在此阐述。你可以对一个`GameEventPromise`使用`toEvent`函数来获取本身的事件,如`player.draw(2).toEvent()`;你也可以对一个事件本身调用`toPromise`函数来获取对应的`GameEventPromise` + +#### 代替`event.goto`与`event.redo` + +如果你曾看过远古计算机代码,你或许会发现,`Step Content`的`evnet.goto`和`event.redo`,很有当年的循环风格。但事实证明,这种风格在代码复杂起来时,会变得难以维护,故我们必然会寻找方法替代——故我们发明了循环语句 + +比如下面这段代码使用了`event.redo`: + +```javascript +let target = event.targets.shift(); +target.draw(1); +if (event.targets.length) event.redo(); +``` + +你可以改成 + +```javascript +while (event.targets.length) { + let target = event.targets.shift(); + await target.draw(1); +} +``` + +这样写出来的代码也更加清晰,你可以一眼看出来这是一个循环,对吧? + +当然,因为我们已经用上了循环,不再需要通过`event.targets.length`来区分有没有遍历完,所以我们甚至能直接这样写: + +```javascript +for (let target of event.targets) { + await target.draw(1); +} +``` + +而`event.goto`也是同理,你可以用`if`、`while`、`for`、`break`、`continue`等语句来代替它,从而达到更好的可读性 + +这块的内容由于因具体情况会变得异常复杂,故本章节将本块内容当成附加内容,将在后文补充一些个人的方法和习惯;本体的标准包代码已全面换成`Async Content`的形式,可前往学习。 + +### 5. async使用的一些细节补充 + +看到这里,你对于`Async Content`的大致特点已经掌握,那接下来我们就来对一些实战中可能遇到的问题进行补充吧 + +#### 1. 什么情况下必须要使用`await`? + +我们都知道,在Javascript中,`await`一个不需要`await`的东西不会有任何问题,故你可以在任何操作下都尝试`await`。但这会让代码的无用`await`变得很多,所以我们需要判断什么时候该用`await` + +非常幸运,在无名杀中,你可以查看操作是否有以下情况: + +1. 会触发时机。触发时机意味着可能进行插入结算,你需要等待所有插入结算的完成,故而使用`await`(包括使用`event.trigger`来主动触发时机也需要`await`) +2. 等待玩家确认。如果有个操作需要玩家点击确认,或者会弹出窗口给玩家查看时,你需要等待玩家确认完毕,所以也使用`await` +3. `asyncDelay`/`asyncDelayx`等带`async`字符的函数,这些操作一般都会返回一个可`await`的东西,故我们需要`await`来保证函数执行完毕 + +顺带一提,有些异步的情况不能用`await`来等待,或者说使用`await`并不会起到效果。这类情况基本上都是无名杀的古老异步代码,因为在那个时代并不存在`Promise`,且没人尝试在后来适配这些异步代码,所以你只能通过原先给定的特殊方式来等待,比如说回调函数 + +#### 2. delay与delayx + +需要注意的是,在`Async Content`里面,我们不能再使用`game.delay`/`game.delayx`/`game.resume`这三样了,我们需要替代方案 + +本体对于这种情况已经准备好了,来看看这两个新函数: + +```javascript +await game.asyncDelay(); +await game.asyncDelayx(); +``` + +请注意哦,他们必须加上`await`,否则是不会产生任何效果的 + +那么有了这两个函数,你在编写代码时就可以进行替换了哦 + +将`game.delay()`替换为`await game.asyncDelay()`、`game.delayx()`替换为`await game.asyncDelayx()`,即可在async函数中实现类似的效果 + +#### 3. Promise的使用 + +上面我们提到了`game.resume`不能在async函数中使用,但是我们没有给出解决方案——这是因为使用`game.resume`需要我们会使用`Promise` + +**Promise的概念** + +在之前介绍async函数的时候,我们就稍微提到过这个概念;我们当时说`Promise`是无名杀的一种异步解决方案;这里我们不得不简单说明下`Promise`的历史,来理解`Promise`的诞生 + +当时人们为了解决回调地狱,就开始着手设计新的异步形态,同时要比较方便的兼容原有异步;此时就有人尝试提出了这样的概念: + +```javascript +// 回调写法 +someAsyncFunction(callback); +// 回调地狱 +someAsyncFunction(a => { + someAsyncFunctionToo(b, c => { + someAsyncFunctionAgain(c, d => { + ... + }) + }) +}) + +// 新的写法 +someAsyncFunction().then(callback); +// 链式调用 +someAsyncFunction().then(a => { + return someAsyncFunctionToo(b); +}).then(c => { + return someAsyncFunctionAgain(c); +}).then(d => { + ... +}) +// 或者因为刚好就是后面需要调用函数的第一个参数,故还能再次简化 +someAsyncFunction() + .then(someAsyncFunctionToo) + .then(someAsyncFunctionAgain) + .then(...) +``` + +而要实现链式调用,就需要一个对象来承载:这就是`Promise`的诞生,它将原本的回调地狱变成了链式调用,让代码变得清晰易懂 + +`Promise`类似于一个通知,比如你点了一份外卖,如果你要知道外卖有没有完成,你肯定是查看外卖app是否显示已送达 而不是跑到楼下去看看外卖员有没有到对吧? + +`Promise`此时充当了一个外卖app的作用,当你对它使用`await`时,你的代码会暂停执行,等待`Promise`提供者确认任务完成之后,`Promise`就会结束你代码的等待,并继续向下执行 + +> 我们前文说过,可`await`的东西不一定是`Promise`,实际上满足[Promise A+](https://promisesaplus.com/)标准的都是可`await`的东西,感兴趣的可以了解一下 + +**Promise的语法** + +我们来看看`Promise`的创建: + +```javascript +let promise = new Promise((resolve, reject) => { ... }); +``` + +和其他对象一样,`Promise`也是通过构造函数构建的,而构造函数则接收一个回调函数——毕竟要取代原来的回调函数,你也必须提供一个回调函数 + +而回调函数则接收两个参数,这两个参数分别对应`resolve`与`reject`,这两个参数都是`Promise`提供的回调函数,其中`resolve`则表示,一切顺利后,使用这个回调函数,而`reject`则表示出问题后使用这个回调函数 + +这两个回调函数都可以接收一个参数,这个参数将会被`Promise`储存下来,而你可以通过`await`这个`Promise`来获取这个值(当然如果`reject`了就改为报错) + +在最新的Javascript中,提供了一个函数`Promise.withResolvers`,这个函数会将`Promise`本身和其`resolve`和`reject`包含在一个对象中返回;当你代码中的`resolve`和`reject`需要和`Promise`对象同一作用域时,就能使用这个函数,如下面所示: + +```javascript +let { promise, resolve, reject } = Promise.withResolvers(); +``` + +在后文中,为了防止演示代码的层级过多,我们将统一使用`Promise.withResolvers`来创建`Promise`,尽管大部分例子下直接用构造函数创建`Promise`会更简洁 + +**代码演示** + +接下来我们来看看如何用`Promise`演示外卖送达的流程 + +```javascript +// 外卖平台部分 +// 我们要提供dian_can()函数来接受外卖任务 +let { promise, resolve } = Promise.withResolvers() // 创建一个新的Promise,由于我们现在能保证外面必然送到,故不需要reject + +function dianCan() { + return promise // 返回我们创建的promise +} + +// 外卖员部分 +// 当外卖员送达时需要通知用户取餐 +... // 送餐流程省略 +resolve() // 执行promise创建时提供的通知函数,告诉正在等待这个promise的代码任务已经完成 + +// 用餐人部分 +// 我们执行dian_can()函数来发起一个外卖任务 +let waimaiPromise = dianCan() // 调用并获取promise +await waimaiPromise // 等待外卖送达 +``` + +从上面可以看出,如果要使用`Promise`,我们需要三个部分: + +1. 创建`Promise` +2. 等待`Promise` +3. 通知`Promise` + +**使用示例** + +那么我们来实现一个简单的效果,用`await`暂停代码5秒: + +我们的思路应该是这样的,首先我们肯定要创建一个`Promise`,这样才可以使用`await` + +然后我们要在5秒后执行`resolve`函数,让`await`结束等待 + +```javascript +var { promise, resolve } = Promise.withResolvers(); // 创建promise +setTimeout(resolve, 5000); // 将resolve传递给setTimeout,setTimeout是一个系统函数,会在指定时间后执行你传入的函数,这里填写的时间是5000毫秒即5秒 +await promise; // 等待直到resolve在5秒后被调用 +``` + +你有没有发现,我们已经实现了类似`game.asyncDelay`的功能了;而事实上无名杀本体的`game.asyncDelay`也就是使用这种方式实现的功能 + +当你掌握了`Promise`的使用时,你就可以进入下面的一节了 + +#### 4. pause与resume + +`game.pause`与`game.resume`是一对游戏内暂停函数,与玩家暂停不同,它们用于`等待游戏动画`/`等待玩家确定`这类耗时的操作时使用 + +在分步中,如果你要等待玩家按下确定再执行下一步,你需要先执行`game.pause`,这将启动游戏内暂停,直到你执行`game.resume`之前,下一步都不会执行 + +而到了async函数里面,`game.resume`不再可以使用,这会导致事件被重复执行,出现不可预料的问题 + +那么如果要实现原来的效果要如何做呢? + +这就要用到我们的`Promise`了,假设`button`是一个按钮,我们要等待按钮按下再继续执行,这种代码应该这样写: + +```javascript +// 创建一个Promise来等待 +let { promise, resolve } = Promise.withResolvers(); + +// 监听按钮点击,当按钮点击时执行大括号里面的代码 +button.listen(() => { + _status.paused = false; // 手动关闭游戏内暂停,而不是执行`game.resume` + resolve(); // 结束await的等待 + game.log("玩家点击了按钮"); +}); + +// 启动游戏内暂停 +game.pause(); +// 暂停代码的执行并等待点击 +await promise; +``` + +这里可能会有人疑惑,为什么已经用了`Promise`还要追加`game.pause`? + +这是因为`Promise`只是暂停了当前代码的执行,并没有启动`游戏内暂停`,这会导致游戏其他部分并不知道已经暂停了,我们需要补充`game.pause`来告诉游戏已经暂停 + +在v1.10.13后,`Async Content`中已经不再需要`game.pause`,故你可以这样写: + +```javascript +// 创建一个Promise来等待 +let { promise, resolve } = Promise.withResolvers(); + +// 监听按钮点击,当按钮点击时执行大括号里面的代码 +button.listen(() => { + resolve(); // 结束await的等待 + game.log("玩家点击了按钮"); +}); + +// 暂停代码的执行并等待点击 +await promise; +``` + +当然,你为了兼容旧版本,你也可以继续使用`game.pause`,这在新版本中只是没有效果,但并不会造成错误或者其他影响 + +#### 5. async的其他优势 + +**支持闭包访问** + +什么是闭包? + +闭包是指一种变量的访问,当一个函数访问外层代码声明的变量就叫做闭包访问,而那个变量成为闭包变量 + +```javascript +let v1 = 1; + +function funA() { + let v2 = 2; + function funB() { + return v1 + v2; // 访问了两个闭包变量 + } +} +``` + +在上面的代码中,对于`funB`函数来说,无论`v1`还是`v2`变量都不是它声明的,但是它可以通过闭包访问来获取这些变量 + +在`Step Content`中,因为代码被动态编译了,导致无法使用闭包;这种情况下,你如果要访问你其他地方定义的变量,必须将这个变量暴露为公共变量,不利于扩展对自身数据的封闭管理 + +而在`Async Content`中,你可以直接在里面访问到你外层定义的变量,这是`Step Content`不具备的优势 + +**更好的调试** + +`Async Content`支持电脑上的开发者工具进行断点调试 + +在电脑上可以按`Ctrl+Shift+I`打开开发工具,然后在`源代码`/`Sources`里面找到你觉得有问题的代码,在编辑器左边的行数点击一下,会出现一个蓝色的箭头,代表此行已经被打上断点 + +断点被打上后,当代码执行到此行时,开发工具会暂停代码的执行,此时你可以在开发工具里面观察各个变量的值,或者执行额外的代码 + +另外使用`Async Content`的技能出现错误时,不会出现报错信息不正确的问题`Async Content`同样也是因为没有二次编译,不会丢失错误信息,增加你的错误排查效率 + +## 三、`Async Content`相比原有形式的优势 + +`Async Content`相比`Step Content`的优势上文已经说明,但无名杀实际还存在其他的content形式,故我们再看看其他的content形式与`Async Content`的对比 + +### `Array Content` + +为了解决不再动态编译,实际上无名杀可以使用一种很原始的分步方法;就比如之前的技能,可以这么写: + +```javascript +{ + content: [ + (event, { player }) => { + player.addTempSkill("jiang"); + return player.draw(2); + }, + (event, { player }, result) => { + // result就是player.draw摸的牌 + if (player.countCards("h") > 5) + return player.chooseToDiscard(2, true); + }, + (event, { player }) => { + player.addMark("jiang"); + } + ] +} +``` + +你应该能看明白,就是将`Step Content`中的`content`属性换成了一个数组,数组中每个函数都是一个`step`,返回需要等待的事件,其中第一个参数则是当前事件,第二个参数是所有`Step Content`给出的参数,没用上的第三个参数则是需要等待事件的结果——这种参数形式被标记为“旧参数格式”,目前已被`Async Content`的参数形式取代 + +这种写法具有`Step Content`的所有优势,也具备调试功能,但由于过于丑陋,且现阶段并未支持异步功能,故被抛弃 + +当然你或许听到过一个幽灵... + +### `Async Contents` + +和`Async Content`仅差了一个单词的`Async Contents`,从名字看就明白这个形式拥有`Async Content`的特点,并提供分步功能,但你却从来没看到有人使用过,只有不知道什么人在一遍遍传递这个幽灵的名号 + +因为`Async Contents`目前还是“废弃中”的状态 + +回到v1.10.6,当`Async Content`出来之后,我们就希望将无名杀本体的`Step Content`全部用新的写法代替;但`Async Content`有个缺点:并不支持跳步,这使得一些必须要跳步的情况无法用`Async Content`代替。因此,`Async Contents`被提上了议程 + +但在实现过程中,出了个差错:`Async Content`在v1.10.6时存在一个不明显的Bug,这个Bug不会对普通的`Async Content`造成任何影响,但对基于`Async Content`的`Async Contents`造成了非常大的影响,使得`Async Contents`完全无法发挥原有的功能。故`Async Contents`最终遭到了废弃,且为了防止错误使用`Async Contents`,相关代码已被删除 + +现在导致`Async Contents`的Bug已被修复,但`Asnyc Contents`目前已经没人去实现了,本体的残留代码也无法直接使用。现在`Async Contents`就像个幽灵一样,徘徊在无名杀的代码群中,或许有一天我们还能再次看到这玩意 + +### `Generator Content` + +`Generator Content`和`Asnyc Content`很像,这个形式通过“生成器”来等待事件结束,使用的是旧函数格式,就比如之前演示的技能,就可以这样写: + +```javascript +{ + content: function * (event, { player }) { + let cards = yield player.draw(2); + + if (player.countCards("h") > 5) { + yield player.chooseToDiscard(2, true); + } + + player.addMark("jiang"); + } +} +``` + +你会发现,这很像`Async Content`。实际上,当时`Generator Content`或许会代替现在`Async Content`的地位,因为两者的优缺点一致,`Generator Content`也能轻松实现异步功能;但时至今日,我们庆幸最终采用了`Async Content`,并将事件改成了可`await`的东西——这使得等待归一,从而使代码能实现更多功能,而`Generator Content`的`yield`却无法简单的实现 + +只不过这一点过于复杂,本章节不会阐述,但额外章节会考虑讲述这一方面的内容 + +--- + +好了,到此你就已经彻底的把`Async Content`的关键知识浏览了一遍,如果要更好的巩固它,可以试着把你之前的技能改成`Async Content`试试 + +未来可以遇见的是,`Asnyc Content`必将慢慢成为主流,而无名杀的代码环境也会逐渐使用async函数——这是Javascript的选择,也将是无名杀的选择 + +感谢你的阅读,希望你能通过本章节来创作出更好的扩展 diff --git "a/extension/\345\215\201\345\221\250\345\271\264UI/extension.js" "b/extension/\345\215\201\345\221\250\345\271\264UI/extension.js" index 6edfadb4..087287f4 100644 --- "a/extension/\345\215\201\345\221\250\345\271\264UI/extension.js" +++ "b/extension/\345\215\201\345\221\250\345\271\264UI/extension.js" @@ -35,7 +35,7 @@ content:function(config, pack){ '
    无名杀简介
    '+ '
    关于无名杀官方