diff --git a/.eslintrc.json b/.eslintrc.json index 8d79549ec..88229aedd 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,5 +1,5 @@ { - "extends": "chrome 46", + "extends": "chrome 46", "env": { "browser": true, "node": true, diff --git a/audio/die/caoxi.mp3 b/audio/die/caoxi.mp3 new file mode 100644 index 000000000..bc942b30f Binary files /dev/null and b/audio/die/caoxi.mp3 differ diff --git a/audio/die/clan_wanglun.mp3 b/audio/die/clan_wanglun.mp3 new file mode 100644 index 000000000..8b74c3a51 Binary files /dev/null and b/audio/die/clan_wanglun.mp3 differ diff --git a/audio/die/dc_zhangmancheng.mp3 b/audio/die/dc_zhangmancheng.mp3 new file mode 100644 index 000000000..74e8f41f7 Binary files /dev/null and b/audio/die/dc_zhangmancheng.mp3 differ diff --git a/audio/die/hanlong.mp3 b/audio/die/hanlong.mp3 new file mode 100644 index 000000000..00b135b2e Binary files /dev/null and b/audio/die/hanlong.mp3 differ diff --git a/audio/die/laimin.mp3 b/audio/die/laimin.mp3 new file mode 100644 index 000000000..151b374fd Binary files /dev/null and b/audio/die/laimin.mp3 differ diff --git a/audio/die/lvboshe.mp3 b/audio/die/lvboshe.mp3 new file mode 100644 index 000000000..1f7cf0f6e Binary files /dev/null and b/audio/die/lvboshe.mp3 differ diff --git a/audio/die/mengyou.mp3 b/audio/die/mengyou.mp3 new file mode 100644 index 000000000..7e9278161 Binary files /dev/null and b/audio/die/mengyou.mp3 differ diff --git a/audio/die/ol_huban.mp3 b/audio/die/ol_huban.mp3 new file mode 100644 index 000000000..31bc5f60a Binary files /dev/null and b/audio/die/ol_huban.mp3 differ diff --git a/audio/die/ol_zhangzhang.mp3 b/audio/die/ol_zhangzhang.mp3 new file mode 100644 index 000000000..03d811cd2 Binary files /dev/null and b/audio/die/ol_zhangzhang.mp3 differ diff --git a/audio/die/re_caoxiu.mp3 b/audio/die/re_caoxiu.mp3 index 67bfe9400..b879a0ad4 100644 Binary files a/audio/die/re_caoxiu.mp3 and b/audio/die/re_caoxiu.mp3 differ diff --git a/audio/die/re_caozhang.mp3 b/audio/die/re_caozhang.mp3 index ca916b4a5..cd793fc67 100644 Binary files a/audio/die/re_caozhang.mp3 and b/audio/die/re_caozhang.mp3 differ diff --git a/audio/die/re_chengpu.mp3 b/audio/die/re_chengpu.mp3 index 90b9991d0..6ce1e9558 100644 Binary files a/audio/die/re_chengpu.mp3 and b/audio/die/re_chengpu.mp3 differ diff --git a/audio/die/re_hanhaoshihuan.mp3 b/audio/die/re_hanhaoshihuan.mp3 index b11d67925..0fd524df6 100644 Binary files a/audio/die/re_hanhaoshihuan.mp3 and b/audio/die/re_hanhaoshihuan.mp3 differ diff --git a/audio/die/re_jianyong.mp3 b/audio/die/re_jianyong.mp3 index 6dac0aa9c..5d79b1e88 100644 Binary files a/audio/die/re_jianyong.mp3 and b/audio/die/re_jianyong.mp3 differ diff --git a/audio/die/re_jsp_huangyueying.mp3 b/audio/die/re_jsp_huangyueying.mp3 index 3dbd0bc46..58d731ab2 100644 Binary files a/audio/die/re_jsp_huangyueying.mp3 and b/audio/die/re_jsp_huangyueying.mp3 differ diff --git a/audio/die/re_sunxiu.mp3 b/audio/die/re_sunxiu.mp3 index 8e8d6722d..d87aaeac7 100644 Binary files a/audio/die/re_sunxiu.mp3 and b/audio/die/re_sunxiu.mp3 differ diff --git a/audio/die/re_wangyi.mp3 b/audio/die/re_wangyi.mp3 new file mode 100644 index 000000000..da624213f Binary files /dev/null and b/audio/die/re_wangyi.mp3 differ diff --git a/audio/die/re_zuoci.mp3 b/audio/die/re_zuoci.mp3 index ae2e82ccf..2ecaf0abe 100644 Binary files a/audio/die/re_zuoci.mp3 and b/audio/die/re_zuoci.mp3 differ diff --git a/audio/die/sb_xiaoqiao.mp3 b/audio/die/sb_xiaoqiao.mp3 new file mode 100644 index 000000000..8aad99390 Binary files /dev/null and b/audio/die/sb_xiaoqiao.mp3 differ diff --git a/audio/die/sb_yl_luzhi.mp3 b/audio/die/sb_yl_luzhi.mp3 new file mode 100644 index 000000000..39d41ae09 Binary files /dev/null and b/audio/die/sb_yl_luzhi.mp3 differ diff --git a/audio/die/tw_zhanghong.mp3 b/audio/die/tw_zhanghong.mp3 new file mode 100644 index 000000000..5697300a6 Binary files /dev/null and b/audio/die/tw_zhanghong.mp3 differ diff --git a/audio/die/tw_zhangzhao.mp3 b/audio/die/tw_zhangzhao.mp3 new file mode 100644 index 000000000..1fadfce0b Binary files /dev/null and b/audio/die/tw_zhangzhao.mp3 differ diff --git a/audio/die/xin_liubiao.mp3 b/audio/die/xin_liubiao.mp3 index 90654b0b6..4446db23f 100644 Binary files a/audio/die/xin_liubiao.mp3 and b/audio/die/xin_liubiao.mp3 differ diff --git a/audio/die/yj_qiaozhou.mp3 b/audio/die/yj_qiaozhou.mp3 new file mode 100644 index 000000000..59ec3e9ef Binary files /dev/null and b/audio/die/yj_qiaozhou.mp3 differ diff --git a/audio/die/yj_zhoubuyi.mp3 b/audio/die/yj_zhoubuyi.mp3 new file mode 100644 index 000000000..e21da9492 Binary files /dev/null and b/audio/die/yj_zhoubuyi.mp3 differ diff --git a/audio/die/zhangyan.mp3 b/audio/die/zhangyan.mp3 new file mode 100644 index 000000000..1bbfe249d Binary files /dev/null and b/audio/die/zhangyan.mp3 differ diff --git a/audio/skill/cibei1.mp3 b/audio/skill/cibei1.mp3 new file mode 100644 index 000000000..d86c853f2 Binary files /dev/null and b/audio/skill/cibei1.mp3 differ diff --git a/audio/skill/cibei2.mp3 b/audio/skill/cibei2.mp3 new file mode 100644 index 000000000..94fc84aa0 Binary files /dev/null and b/audio/skill/cibei2.mp3 differ diff --git a/audio/skill/clanjianyuan1.mp3 b/audio/skill/clanjianyuan1.mp3 new file mode 100644 index 000000000..36ab3df51 Binary files /dev/null and b/audio/skill/clanjianyuan1.mp3 differ diff --git a/audio/skill/clanjianyuan2.mp3 b/audio/skill/clanjianyuan2.mp3 new file mode 100644 index 000000000..50b09a5a1 Binary files /dev/null and b/audio/skill/clanjianyuan2.mp3 differ diff --git a/audio/skill/clanqiuxin1.mp3 b/audio/skill/clanqiuxin1.mp3 new file mode 100644 index 000000000..8b4935b11 Binary files /dev/null and b/audio/skill/clanqiuxin1.mp3 differ diff --git a/audio/skill/clanqiuxin2.mp3 b/audio/skill/clanqiuxin2.mp3 new file mode 100644 index 000000000..2995ffffe Binary files /dev/null and b/audio/skill/clanqiuxin2.mp3 differ diff --git a/audio/skill/clanzhongliu_clan_wanglun1.mp3 b/audio/skill/clanzhongliu_clan_wanglun1.mp3 new file mode 100644 index 000000000..b9cf06f98 Binary files /dev/null and b/audio/skill/clanzhongliu_clan_wanglun1.mp3 differ diff --git a/audio/skill/clanzhongliu_clan_wanglun2.mp3 b/audio/skill/clanzhongliu_clan_wanglun2.mp3 new file mode 100644 index 000000000..76d14960e Binary files /dev/null and b/audio/skill/clanzhongliu_clan_wanglun2.mp3 differ diff --git a/audio/skill/dclvecheng1.mp3 b/audio/skill/dclvecheng1.mp3 new file mode 100644 index 000000000..a671a3b22 Binary files /dev/null and b/audio/skill/dclvecheng1.mp3 differ diff --git a/audio/skill/dclvecheng2.mp3 b/audio/skill/dclvecheng2.mp3 new file mode 100644 index 000000000..a882a477b Binary files /dev/null and b/audio/skill/dclvecheng2.mp3 differ diff --git a/audio/skill/dcmanzhi1.mp3 b/audio/skill/dcmanzhi1.mp3 new file mode 100644 index 000000000..b01a2cd86 Binary files /dev/null and b/audio/skill/dcmanzhi1.mp3 differ diff --git a/audio/skill/dcmanzhi2.mp3 b/audio/skill/dcmanzhi2.mp3 new file mode 100644 index 000000000..8feb07f86 Binary files /dev/null and b/audio/skill/dcmanzhi2.mp3 differ diff --git a/audio/skill/dczhongji1.mp3 b/audio/skill/dczhongji1.mp3 new file mode 100644 index 000000000..5f588f974 Binary files /dev/null and b/audio/skill/dczhongji1.mp3 differ diff --git a/audio/skill/dczhongji2.mp3 b/audio/skill/dczhongji2.mp3 new file mode 100644 index 000000000..42ce5cf52 Binary files /dev/null and b/audio/skill/dczhongji2.mp3 differ diff --git a/audio/skill/decadezishou1.mp3 b/audio/skill/decadezishou1.mp3 index 8905ca791..644471ce0 100644 Binary files a/audio/skill/decadezishou1.mp3 and b/audio/skill/decadezishou1.mp3 differ diff --git a/audio/skill/decadezishou2.mp3 b/audio/skill/decadezishou2.mp3 index 4989a7501..2462e87e5 100644 Binary files a/audio/skill/decadezishou2.mp3 and b/audio/skill/decadezishou2.mp3 differ diff --git a/audio/skill/decadezongshi1.mp3 b/audio/skill/decadezongshi1.mp3 index c07dc27a1..05a3fa1c1 100644 Binary files a/audio/skill/decadezongshi1.mp3 and b/audio/skill/decadezongshi1.mp3 differ diff --git a/audio/skill/decadezongshi2.mp3 b/audio/skill/decadezongshi2.mp3 index 91f591a70..a6b636524 100644 Binary files a/audio/skill/decadezongshi2.mp3 and b/audio/skill/decadezongshi2.mp3 differ diff --git a/audio/skill/duwang1.mp3 b/audio/skill/duwang1.mp3 new file mode 100644 index 000000000..611210c1f Binary files /dev/null and b/audio/skill/duwang1.mp3 differ diff --git a/audio/skill/duwang2.mp3 b/audio/skill/duwang2.mp3 new file mode 100644 index 000000000..2ab5cca92 Binary files /dev/null and b/audio/skill/duwang2.mp3 differ diff --git a/audio/skill/jiangxi1.mp3 b/audio/skill/jiangxi1.mp3 new file mode 100644 index 000000000..e05383eec Binary files /dev/null and b/audio/skill/jiangxi1.mp3 differ diff --git a/audio/skill/jiangxi2.mp3 b/audio/skill/jiangxi2.mp3 new file mode 100644 index 000000000..30c04db63 Binary files /dev/null and b/audio/skill/jiangxi2.mp3 differ diff --git a/audio/skill/juyi.mp3 b/audio/skill/juyi.mp3 deleted file mode 100644 index 1b956d9f0..000000000 Binary files a/audio/skill/juyi.mp3 and /dev/null differ diff --git a/audio/skill/jyzongshi_re_jianyong1.mp3 b/audio/skill/jyzongshi_re_jianyong1.mp3 index f7f2ddf0b..96f7d26e9 100644 Binary files a/audio/skill/jyzongshi_re_jianyong1.mp3 and b/audio/skill/jyzongshi_re_jianyong1.mp3 differ diff --git a/audio/skill/jyzongshi_re_jianyong2.mp3 b/audio/skill/jyzongshi_re_jianyong2.mp3 index 11c3310d2..4a22f3f60 100644 Binary files a/audio/skill/jyzongshi_re_jianyong2.mp3 and b/audio/skill/jyzongshi_re_jianyong2.mp3 differ diff --git a/audio/skill/laishou1.mp3 b/audio/skill/laishou1.mp3 new file mode 100644 index 000000000..36cca78a1 Binary files /dev/null and b/audio/skill/laishou1.mp3 differ diff --git a/audio/skill/laishou2.mp3 b/audio/skill/laishou2.mp3 new file mode 100644 index 000000000..ded0373cf Binary files /dev/null and b/audio/skill/laishou2.mp3 differ diff --git a/audio/skill/laishou3.mp3 b/audio/skill/laishou3.mp3 new file mode 100644 index 000000000..dfaf670f3 Binary files /dev/null and b/audio/skill/laishou3.mp3 differ diff --git a/audio/skill/lihuo_re_chengpu1.mp3 b/audio/skill/lihuo_re_chengpu1.mp3 index a3cb83ef3..5b839b79f 100644 Binary files a/audio/skill/lihuo_re_chengpu1.mp3 and b/audio/skill/lihuo_re_chengpu1.mp3 differ diff --git a/audio/skill/lihuo_re_chengpu2.mp3 b/audio/skill/lihuo_re_chengpu2.mp3 index 26e2cb585..0ae13ab1d 100644 Binary files a/audio/skill/lihuo_re_chengpu2.mp3 and b/audio/skill/lihuo_re_chengpu2.mp3 differ diff --git a/audio/skill/luanqun1.mp3 b/audio/skill/luanqun1.mp3 new file mode 100644 index 000000000..5de13336b Binary files /dev/null and b/audio/skill/luanqun1.mp3 differ diff --git a/audio/skill/luanqun2.mp3 b/audio/skill/luanqun2.mp3 new file mode 100644 index 000000000..f30474e6c Binary files /dev/null and b/audio/skill/luanqun2.mp3 differ diff --git a/audio/skill/manyi_mengyou1.mp3 b/audio/skill/manyi_mengyou1.mp3 new file mode 100644 index 000000000..22c46d3ab Binary files /dev/null and b/audio/skill/manyi_mengyou1.mp3 differ diff --git a/audio/skill/manyi_mengyou2.mp3 b/audio/skill/manyi_mengyou2.mp3 new file mode 100644 index 000000000..a7fac3deb Binary files /dev/null and b/audio/skill/manyi_mengyou2.mp3 differ diff --git a/audio/skill/mbhuiyao1.mp3 b/audio/skill/mbhuiyao1.mp3 new file mode 100644 index 000000000..6daad9211 Binary files /dev/null and b/audio/skill/mbhuiyao1.mp3 differ diff --git a/audio/skill/mbhuiyao2.mp3 b/audio/skill/mbhuiyao2.mp3 new file mode 100644 index 000000000..1c73e2c78 Binary files /dev/null and b/audio/skill/mbhuiyao2.mp3 differ diff --git a/audio/skill/mbquesong1.mp3 b/audio/skill/mbquesong1.mp3 new file mode 100644 index 000000000..16a0eff2f Binary files /dev/null and b/audio/skill/mbquesong1.mp3 differ diff --git a/audio/skill/mbquesong2.mp3 b/audio/skill/mbquesong2.mp3 new file mode 100644 index 000000000..ce915f07a Binary files /dev/null and b/audio/skill/mbquesong2.mp3 differ diff --git a/audio/skill/miji_re_wangyi1.mp3 b/audio/skill/miji_re_wangyi1.mp3 new file mode 100644 index 000000000..12e4a54fc Binary files /dev/null and b/audio/skill/miji_re_wangyi1.mp3 differ diff --git a/audio/skill/miji_re_wangyi2.mp3 b/audio/skill/miji_re_wangyi2.mp3 new file mode 100644 index 000000000..8dadc02d7 Binary files /dev/null and b/audio/skill/miji_re_wangyi2.mp3 differ diff --git a/audio/skill/nzry_mingren_1_sb_yl_luzhi1.mp3 b/audio/skill/nzry_mingren_1_sb_yl_luzhi1.mp3 new file mode 100644 index 000000000..9ac05aece Binary files /dev/null and b/audio/skill/nzry_mingren_1_sb_yl_luzhi1.mp3 differ diff --git a/audio/skill/nzry_mingren_1_sb_yl_luzhi2.mp3 b/audio/skill/nzry_mingren_1_sb_yl_luzhi2.mp3 new file mode 100644 index 000000000..feafead5b Binary files /dev/null and b/audio/skill/nzry_mingren_1_sb_yl_luzhi2.mp3 differ diff --git a/audio/skill/oldongdao1.mp3 b/audio/skill/oldongdao1.mp3 new file mode 100644 index 000000000..ea0b58bab Binary files /dev/null and b/audio/skill/oldongdao1.mp3 differ diff --git a/audio/skill/oldongdao2.mp3 b/audio/skill/oldongdao2.mp3 new file mode 100644 index 000000000..3d10429ea Binary files /dev/null and b/audio/skill/oldongdao2.mp3 differ diff --git a/audio/skill/olfushi1.mp3 b/audio/skill/olfushi1.mp3 new file mode 100644 index 000000000..51c93da32 Binary files /dev/null and b/audio/skill/olfushi1.mp3 differ diff --git a/audio/skill/olfushi2.mp3 b/audio/skill/olfushi2.mp3 new file mode 100644 index 000000000..0f6697ecf Binary files /dev/null and b/audio/skill/olfushi2.mp3 differ diff --git a/audio/skill/olgangshu1.mp3 b/audio/skill/olgangshu1.mp3 new file mode 100644 index 000000000..116f207f3 Binary files /dev/null and b/audio/skill/olgangshu1.mp3 differ diff --git a/audio/skill/olgangshu2.mp3 b/audio/skill/olgangshu2.mp3 new file mode 100644 index 000000000..ec3be9199 Binary files /dev/null and b/audio/skill/olgangshu2.mp3 differ diff --git a/audio/skill/olguzheng1.mp3 b/audio/skill/olguzheng1.mp3 new file mode 100644 index 000000000..ad52616e1 Binary files /dev/null and b/audio/skill/olguzheng1.mp3 differ diff --git a/audio/skill/olguzheng2.mp3 b/audio/skill/olguzheng2.mp3 new file mode 100644 index 000000000..8e0348ae3 Binary files /dev/null and b/audio/skill/olguzheng2.mp3 differ diff --git a/audio/skill/olhuiyun1.mp3 b/audio/skill/olhuiyun1.mp3 new file mode 100644 index 000000000..baf47075a Binary files /dev/null and b/audio/skill/olhuiyun1.mp3 differ diff --git a/audio/skill/olhuiyun2.mp3 b/audio/skill/olhuiyun2.mp3 new file mode 100644 index 000000000..654f1c6a7 Binary files /dev/null and b/audio/skill/olhuiyun2.mp3 differ diff --git a/audio/skill/oljianxuan1.mp3 b/audio/skill/oljianxuan1.mp3 new file mode 100644 index 000000000..309a8fa3c Binary files /dev/null and b/audio/skill/oljianxuan1.mp3 differ diff --git a/audio/skill/oljianxuan2.mp3 b/audio/skill/oljianxuan2.mp3 new file mode 100644 index 000000000..a027f36b7 Binary files /dev/null and b/audio/skill/oljianxuan2.mp3 differ diff --git a/audio/skill/ollangdao1.mp3 b/audio/skill/ollangdao1.mp3 new file mode 100644 index 000000000..5156a993f Binary files /dev/null and b/audio/skill/ollangdao1.mp3 differ diff --git a/audio/skill/ollangdao2.mp3 b/audio/skill/ollangdao2.mp3 new file mode 100644 index 000000000..4854177ad Binary files /dev/null and b/audio/skill/ollangdao2.mp3 differ diff --git a/audio/skill/olsuji1.mp3 b/audio/skill/olsuji1.mp3 new file mode 100644 index 000000000..1958d30e8 Binary files /dev/null and b/audio/skill/olsuji1.mp3 differ diff --git a/audio/skill/olsuji2.mp3 b/audio/skill/olsuji2.mp3 new file mode 100644 index 000000000..f8b108f08 Binary files /dev/null and b/audio/skill/olsuji2.mp3 differ diff --git a/audio/skill/olzhijian1.mp3 b/audio/skill/olzhijian1.mp3 new file mode 100644 index 000000000..e32c47e09 Binary files /dev/null and b/audio/skill/olzhijian1.mp3 differ diff --git a/audio/skill/olzhijian2.mp3 b/audio/skill/olzhijian2.mp3 new file mode 100644 index 000000000..5b0619a60 Binary files /dev/null and b/audio/skill/olzhijian2.mp3 differ diff --git a/audio/skill/qice_backup1.mp3 b/audio/skill/qice_backup1.mp3 deleted file mode 100644 index 983385f69..000000000 Binary files a/audio/skill/qice_backup1.mp3 and /dev/null differ diff --git a/audio/skill/qice_backup2.mp3 b/audio/skill/qice_backup2.mp3 deleted file mode 100644 index 7e04abeb8..000000000 Binary files a/audio/skill/qice_backup2.mp3 and /dev/null differ diff --git a/audio/skill/rechunlao1.mp3 b/audio/skill/rechunlao1.mp3 index 9891715fc..d3ba2b8dd 100644 Binary files a/audio/skill/rechunlao1.mp3 and b/audio/skill/rechunlao1.mp3 differ diff --git a/audio/skill/rechunlao2.mp3 b/audio/skill/rechunlao2.mp3 index 244e041fb..376715241 100644 Binary files a/audio/skill/rechunlao2.mp3 and b/audio/skill/rechunlao2.mp3 differ diff --git a/audio/skill/rehuashen1.mp3 b/audio/skill/rehuashen1.mp3 index fddb08acf..e718e513f 100644 Binary files a/audio/skill/rehuashen1.mp3 and b/audio/skill/rehuashen1.mp3 differ diff --git a/audio/skill/rehuashen2.mp3 b/audio/skill/rehuashen2.mp3 index 161c99857..872d79264 100644 Binary files a/audio/skill/rehuashen2.mp3 and b/audio/skill/rehuashen2.mp3 differ diff --git a/audio/skill/rejiqiao1.mp3 b/audio/skill/rejiqiao1.mp3 index 1b09d9d74..0bbb8d212 100644 Binary files a/audio/skill/rejiqiao1.mp3 and b/audio/skill/rejiqiao1.mp3 differ diff --git a/audio/skill/rejiqiao2.mp3 b/audio/skill/rejiqiao2.mp3 index cd3fc396d..3a12fc601 100644 Binary files a/audio/skill/rejiqiao2.mp3 and b/audio/skill/rejiqiao2.mp3 differ diff --git a/audio/skill/rejizhi_lukang1.mp3 b/audio/skill/rejizhi_lukang1.mp3 index 932a10e21..d9105b8a8 100644 Binary files a/audio/skill/rejizhi_lukang1.mp3 and b/audio/skill/rejizhi_lukang1.mp3 differ diff --git a/audio/skill/rejizhi_lukang2.mp3 b/audio/skill/rejizhi_lukang2.mp3 index 932a10e21..d9105b8a8 100644 Binary files a/audio/skill/rejizhi_lukang2.mp3 and b/audio/skill/rejizhi_lukang2.mp3 differ diff --git a/audio/skill/relinglong1.mp3 b/audio/skill/relinglong1.mp3 index c03677525..074bb5201 100644 Binary files a/audio/skill/relinglong1.mp3 and b/audio/skill/relinglong1.mp3 differ diff --git a/audio/skill/relinglong2.mp3 b/audio/skill/relinglong2.mp3 index 08d47aade..81c658f34 100644 Binary files a/audio/skill/relinglong2.mp3 and b/audio/skill/relinglong2.mp3 differ diff --git a/audio/skill/reqiaoshui1.mp3 b/audio/skill/reqiaoshui1.mp3 index 5fbe25630..9e18c31bd 100644 Binary files a/audio/skill/reqiaoshui1.mp3 and b/audio/skill/reqiaoshui1.mp3 differ diff --git a/audio/skill/reqiaoshui2.mp3 b/audio/skill/reqiaoshui2.mp3 index 7a95b1e8b..936d55530 100644 Binary files a/audio/skill/reqiaoshui2.mp3 and b/audio/skill/reqiaoshui2.mp3 differ diff --git a/audio/skill/reqingxi1.mp3 b/audio/skill/reqingxi1.mp3 index fcaf8cbaf..cb353cbea 100644 Binary files a/audio/skill/reqingxi1.mp3 and b/audio/skill/reqingxi1.mp3 differ diff --git a/audio/skill/reqingxi2.mp3 b/audio/skill/reqingxi2.mp3 index 07b695ae0..62531ec91 100644 Binary files a/audio/skill/reqingxi2.mp3 and b/audio/skill/reqingxi2.mp3 differ diff --git a/audio/skill/reshenduan1.mp3 b/audio/skill/reshenduan1.mp3 index c34aefa4c..13ddba401 100644 Binary files a/audio/skill/reshenduan1.mp3 and b/audio/skill/reshenduan1.mp3 differ diff --git a/audio/skill/reshenduan2.mp3 b/audio/skill/reshenduan2.mp3 index 2f96cd4e7..8c33513ac 100644 Binary files a/audio/skill/reshenduan2.mp3 and b/audio/skill/reshenduan2.mp3 differ diff --git a/audio/skill/rexingxue1.mp3 b/audio/skill/rexingxue1.mp3 index a6e688014..7bade19a9 100644 Binary files a/audio/skill/rexingxue1.mp3 and b/audio/skill/rexingxue1.mp3 differ diff --git a/audio/skill/rexingxue2.mp3 b/audio/skill/rexingxue2.mp3 index 96bd69fdb..c9616b926 100644 Binary files a/audio/skill/rexingxue2.mp3 and b/audio/skill/rexingxue2.mp3 differ diff --git a/audio/skill/rexinsheng1.mp3 b/audio/skill/rexinsheng1.mp3 new file mode 100644 index 000000000..8b3a299fd Binary files /dev/null and b/audio/skill/rexinsheng1.mp3 differ diff --git a/audio/skill/rexinsheng2.mp3 b/audio/skill/rexinsheng2.mp3 new file mode 100644 index 000000000..7ad1e41b9 Binary files /dev/null and b/audio/skill/rexinsheng2.mp3 differ diff --git a/audio/skill/reyanzhu1.mp3 b/audio/skill/reyanzhu1.mp3 index b768c2df0..4e82f5014 100644 Binary files a/audio/skill/reyanzhu1.mp3 and b/audio/skill/reyanzhu1.mp3 differ diff --git a/audio/skill/reyanzhu2.mp3 b/audio/skill/reyanzhu2.mp3 index 5397533b9..3eff5eb79 100644 Binary files a/audio/skill/reyanzhu2.mp3 and b/audio/skill/reyanzhu2.mp3 differ diff --git a/audio/skill/reyonglve1.mp3 b/audio/skill/reyonglve1.mp3 index d025a26f9..a3f28184c 100644 Binary files a/audio/skill/reyonglve1.mp3 and b/audio/skill/reyonglve1.mp3 differ diff --git a/audio/skill/reyonglve2.mp3 b/audio/skill/reyonglve2.mp3 index df7d98f2e..e8f3cc5b8 100644 Binary files a/audio/skill/reyonglve2.mp3 and b/audio/skill/reyonglve2.mp3 differ diff --git a/audio/skill/sbtianxiang1.mp3 b/audio/skill/sbtianxiang1.mp3 new file mode 100644 index 000000000..b7682eb62 Binary files /dev/null and b/audio/skill/sbtianxiang1.mp3 differ diff --git a/audio/skill/sbtianxiang2.mp3 b/audio/skill/sbtianxiang2.mp3 new file mode 100644 index 000000000..5dc838f2e Binary files /dev/null and b/audio/skill/sbtianxiang2.mp3 differ diff --git a/audio/skill/sbzhenliang1.mp3 b/audio/skill/sbzhenliang1.mp3 new file mode 100644 index 000000000..c399afffa Binary files /dev/null and b/audio/skill/sbzhenliang1.mp3 differ diff --git a/audio/skill/sbzhenliang2.mp3 b/audio/skill/sbzhenliang2.mp3 new file mode 100644 index 000000000..459a227ae Binary files /dev/null and b/audio/skill/sbzhenliang2.mp3 differ diff --git a/audio/skill/shiming1.mp3 b/audio/skill/shiming1.mp3 new file mode 100644 index 000000000..79bb1c83e Binary files /dev/null and b/audio/skill/shiming1.mp3 differ diff --git a/audio/skill/shiming2.mp3 b/audio/skill/shiming2.mp3 new file mode 100644 index 000000000..3bd876756 Binary files /dev/null and b/audio/skill/shiming2.mp3 differ diff --git a/audio/skill/twchungang1.mp3 b/audio/skill/twchungang1.mp3 new file mode 100644 index 000000000..300517a85 Binary files /dev/null and b/audio/skill/twchungang1.mp3 differ diff --git a/audio/skill/twchungang2.mp3 b/audio/skill/twchungang2.mp3 new file mode 100644 index 000000000..14a26e9bc Binary files /dev/null and b/audio/skill/twchungang2.mp3 differ diff --git a/audio/skill/twlijian1.mp3 b/audio/skill/twlijian1.mp3 new file mode 100644 index 000000000..b57e06c26 Binary files /dev/null and b/audio/skill/twlijian1.mp3 differ diff --git a/audio/skill/twlijian2.mp3 b/audio/skill/twlijian2.mp3 new file mode 100644 index 000000000..e67097e3f Binary files /dev/null and b/audio/skill/twlijian2.mp3 differ diff --git a/audio/skill/twquanqian1.mp3 b/audio/skill/twquanqian1.mp3 new file mode 100644 index 000000000..ccb9c6229 Binary files /dev/null and b/audio/skill/twquanqian1.mp3 differ diff --git a/audio/skill/twquanqian2.mp3 b/audio/skill/twquanqian2.mp3 new file mode 100644 index 000000000..ed3184c45 Binary files /dev/null and b/audio/skill/twquanqian2.mp3 differ diff --git a/audio/skill/twrouke1.mp3 b/audio/skill/twrouke1.mp3 new file mode 100644 index 000000000..85dc9a94d Binary files /dev/null and b/audio/skill/twrouke1.mp3 differ diff --git a/audio/skill/twrouke2.mp3 b/audio/skill/twrouke2.mp3 new file mode 100644 index 000000000..f8fbc480d Binary files /dev/null and b/audio/skill/twrouke2.mp3 differ diff --git a/audio/skill/weizhong.mp3 b/audio/skill/weizhong.mp3 deleted file mode 100644 index 5db1df8c5..000000000 Binary files a/audio/skill/weizhong.mp3 and /dev/null differ diff --git a/audio/skill/xinjiangchi1.mp3 b/audio/skill/xinjiangchi1.mp3 new file mode 100644 index 000000000..dcef12ef5 Binary files /dev/null and b/audio/skill/xinjiangchi1.mp3 differ diff --git a/audio/skill/xinjiangchi2.mp3 b/audio/skill/xinjiangchi2.mp3 new file mode 100644 index 000000000..23222b9db Binary files /dev/null and b/audio/skill/xinjiangchi2.mp3 differ diff --git a/audio/skill/zhengnan2.mp3 b/audio/skill/zhengnan2.mp3 index a73880663..9d6c1e4a6 100755 Binary files a/audio/skill/zhengnan2.mp3 and b/audio/skill/zhengnan2.mp3 differ diff --git a/audio/skill/zhenlie_re_wangyi1.mp3 b/audio/skill/zhenlie_re_wangyi1.mp3 new file mode 100644 index 000000000..bfa7e392f Binary files /dev/null and b/audio/skill/zhenlie_re_wangyi1.mp3 differ diff --git a/audio/skill/zhenlie_re_wangyi2.mp3 b/audio/skill/zhenlie_re_wangyi2.mp3 new file mode 100644 index 000000000..073ce8fa1 Binary files /dev/null and b/audio/skill/zhenlie_re_wangyi2.mp3 differ diff --git a/card/extra.js b/card/extra.js index 80ad18299..1fb1be66d 100644 --- a/card/extra.js +++ b/card/extra.js @@ -99,69 +99,62 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, ai:{ basic:{ - useful:function(card,i){ + useful:(card,i)=>{ if(_status.event.player.hp>1){ - if(i==0) return 4; + if(i===0) return 4; return 1; } - if(i==0) return 7.3; + if(i===0) return 7.3; return 3; }, - value:function(card,player,i){ + value:(card,player,i)=>{ if(player.hp>1){ - if(i==0) return 5; + if(i===0) return 5; return 1; } - if(i==0) return 7.3; + if(i===0) return 7.3; return 3; - }, + } }, - order:function(){ - return get.order({name:'sha'})+0.2; + order:()=>{ + if(_status.event.dying) return 9; + let sha=get.order({name:'sha'}); + if(sha>0) return sha+0.2; + return 0; }, result:{ - target:function(player,target){ + target:(player,target)=>{ if(target&&target.isDying()) return 2; - if(target&&!target.isPhaseUsing()) return 0; - if(lib.config.mode=='stone'&&!player.isMin()){ - if(player.getActCount()+1>=player.actcount) return 0; - } - var shas=player.getCards('h','sha'); - if(shas.length>1&&(player.getCardUsable('sha')>1||player.countCards('h','zhuge'))){ - return 0; - } - shas.sort(function(a,b){ - return get.order(b)-get.order(a); - }) - var card; - if(shas.length){ - for(var i=0;i0); - })){ + if(!target || target._jiu_temp || !target.isPhaseUsing()) return 0; + if(!target.getCardUsable('sha') || lib.config.mode==='stone'&&!player.isMin()&&player.getActCount()+1>=player.actcount) return 0; + let shas = player.getCards('hs',card=>get.name(card)==='sha'&&!ui.selected.cards.includes(card)), card; + if(!shas.length || !target.hasSha() || shas.length>1&&(target.getCardUsable('sha')>1 || target.countCards('hs','zhuge'))) return 0; + target._jiu_temp = true; + shas.sort((a,b)=>get.order(b)-get.order(a)); + for(let i=0; i{ + return get.attitude(target,current)<0&&target.canUse(shas[i],current,null,true)&&!current.hasSkillTag('filterDamage',null,{ + player:target, + card:shas[i], + jiu:true + })&&get.effect(current,shas[i],target)>0; + }); + if(!tars.length) continue; + tars.sort((a,b)=>{ + return get.effect(b,shas[i],target)-get.effect(a,shas[i],target); + }); + if(!tars[0].mayHaveShan(player,'use') || target.hasSkillTag('directHit_ai',true,{ + target:tars[0], + card:shas[i] + },true) || target.needsToDiscard()>Math.max(0,3-target.hp)){ + delete target._jiu_temp; return 1; } } + delete target._jiu_temp; return 0; - }, + } }, tag:{ save:1, @@ -203,7 +196,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ player.chooseToDiscard({suit:get.suit(event.card2)},function(card){ var evt=_status.event.getParent(); if(get.damageEffect(evt.target,evt.player,evt.player,'fire')>0){ - return 7-get.value(card,evt.player); + return 6.2+Math.min(4,evt.player.hp)-get.value(card,evt.player); } return -1; }).set('prompt',false); @@ -225,8 +218,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ value:[3,1], useful:1, }, - wuxie:function(target,card,player,current,state){ - if(get.attitude(current,player)>=0&&state>0) return false; + wuxie:function(target,card,player,viewer,state){ + let att=get.attitude(viewer,target), eff=get.effect(target,card,player,target); + if(status*get.attitude(viewer,player)>0&&!player.isMad() || status*eff*att>=0) return 0; + if(get.attitude(viewer,player)>=0 || _status.event.getRand('huogong_wuxie')*4>player.countCards('h')) return 0; }, result:{ player:function(player){ @@ -247,6 +242,17 @@ game.import('card',function(lib,game,ui,get,ai,_status){ target:function(player,target){ if(target.hasSkill('huogong2')||target.countCards('h')==0) return 0; if(player.countCards('h')<=1) return 0; + if(_status.event.player == player){ + if(target.isAllCardsKnown(player)){ + if(!target.countCards('h',card=>{ + return player.countCards('h',card2=>{ + return get.suit(card2) == get.suit(card); + }); + })){ + return 0; + } + } + } if(target==player){ if(typeof _status.event.filterCard=='function'&& _status.event.filterCard({name:'huogong'},player,_status.event)){ @@ -961,7 +967,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ bingliang_bg:'粮', bingliang_info:'出牌阶段,对一名距离为1的其他角色使用。目标角色于其判定阶段进行判定:若判定结果不为梅花,则其跳过下一个摸牌阶段。', hualiu_bg:'+马', - hualiu_info:'你的防御距离+1', + hualiu_info:'锁定技,其他角色计算与你的距离+1。', zhuque_bg:'扇', zhuque_skill:'朱雀羽扇', zhuque_info:'当你声明使用普【杀】后,你可以为此【杀】赋予火属性。', diff --git a/card/gujian.js b/card/gujian.js index e05198c0c..e4127e0b5 100644 --- a/card/gujian.js +++ b/card/gujian.js @@ -668,7 +668,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ var value=get.value(card); if(value>=8) return -100; return num-value; - }).set('rand', Math.random()<0.5).prompt2='若与'+get.translation(target)+'展示的牌相同,你弃置展示的牌,'+get.translation(target)+'失去一点体力'; + }).set('rand', Math.random()<0.5).prompt2='若与'+get.translation(target)+'展示的牌相同,你弃置展示的牌,'+get.translation(target)+'失去1点体力'; "step 1" event.card1=result.cards[0]; target.chooseCard('请展示一张手牌',true).set('ai',function(card){ @@ -683,7 +683,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ var value=get.value(card); if(value>=8) return -100; return num-value; - }).set('rand', Math.random()<0.5).prompt2='若与'+get.translation(player)+'展示的牌相同,'+get.translation(player)+'弃置展示的牌,你失去一点体力'; + }).set('rand', Math.random()<0.5).prompt2='若与'+get.translation(player)+'展示的牌相同,'+get.translation(player)+'弃置展示的牌,你失去1点体力'; "step 2" event.card2=result.cards[0]; ui.arena.classList.add('thrownhighlight'); @@ -767,7 +767,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ event.finish(); } else{ - target.chooseToDiscard({color:'black'},'弃置一张黑色手牌或受流失一点体力').ai=function(card){ + target.chooseToDiscard({color:'black'},'弃置一张黑色手牌或受失去1点体力').ai=function(card){ return 8-get.value(card); }; } @@ -1351,7 +1351,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ nopop:true, intro:{ content:function(storage,player){ - return '结束阶段,若你的体力值为全场最少或之一,你获得一点护甲(剩余'+player.storage.liyutang_markcount+'回合)' + return '结束阶段,若你的体力值为全场最少或之一,你获得1点护甲(剩余'+player.storage.liyutang_markcount+'回合)' } }, content:function(){ @@ -1378,7 +1378,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ nopop:true, intro:{ content:function(storage,player){ - return '准备阶段,若你的体力值为全场最少或之一,你回复一点体力(剩余'+player.storage.yougeng_markcount+'回合)' + return '准备阶段,若你的体力值为全场最少或之一,你回复1点体力(剩余'+player.storage.yougeng_markcount+'回合)' } }, content:function(){ @@ -1529,7 +1529,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ yunvyuanshen_skill:{ mark:'card', intro:{ - content:'下一进入濒死状态时回复一点体力' + content:'下一进入濒死状态时回复1点体力' }, trigger:{player:'dying'}, forced:true, @@ -1546,7 +1546,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ dinvxuanshuang_skill:{ mark:'card', intro:{ - content:'下个结束阶段获得一点护甲,若你体力值为全场最少之一,你摸一张牌' + content:'下个结束阶段获得1点护甲,若你体力值为全场最少之一,你摸一张牌' }, trigger:{player:'phaseEnd'}, forced:true, @@ -1803,9 +1803,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ longxugou:'龙须钩', longxugou_info:'出牌阶段对一名装备区内有牌的其他角色使用,获得其装备区内的一张牌并装备之', mianlijinzhen:'棉里针', - mianlijinzhen_info:'出牌阶段对一名体力值不小于你的角色使用,目标摸一张牌然后失去一点体力', + mianlijinzhen_info:'出牌阶段对一名体力值不小于你的角色使用,目标摸一张牌然后失去1点体力', shenhuofeiya:'神火飞鸦', - shenhuofeiya_info:'出牌阶段对一名其他角色和其相邻角色使用,目标需打出一张闪,否则受到一点火属性伤害', + shenhuofeiya_info:'出牌阶段对一名其他角色和其相邻角色使用,目标需打出一张闪,否则受到1点火属性伤害', // tuhunsha:'土魂砂', // tuhunsha_info:'土魂砂', // wenhuangsan:'瘟癀伞', @@ -1815,16 +1815,16 @@ game.import('card',function(lib,game,ui,get,ai,_status){ bingpotong:'天女散花', bingpotong_ab:'散花', - bingpotong_info:'出牌阶段对至多3名角色使用,你与每个目标依次同时展示一张手牌,若颜色相同,你弃置展示的手牌,目标失去一点体力并终止结算', + bingpotong_info:'出牌阶段对至多3名角色使用,你与每个目标依次同时展示一张手牌,若颜色相同,你弃置展示的手牌,目标失去1点体力并终止结算', feibiao:'飞镖', - feibiao_info:'出牌阶段,对一名距离1以外的角色使用,令其弃置一张黑色手牌或流失一点体力', + feibiao_info:'出牌阶段,对一名距离1以外的角色使用,令其弃置一张黑色手牌或失去1点体力', dinvxuanshuang:'帝女玄霜', dinvxuanshuang_skill:'帝女玄霜', - dinvxuanshuang_info:'对一名濒死状态的角色使用,目标回复一点体力,然后可以弃置任意张牌并摸等量的牌', + dinvxuanshuang_info:'对一名濒死状态的角色使用,目标回复1点体力,然后可以弃置任意张牌并摸等量的牌', yunvyuanshen:'玉女元参', yunvyuanshen_skill:'玉女元参', - yunvyuanshen_info:'出牌阶段对一名角色使用,目标在下一次进入濒死状态时回复一点体力', + yunvyuanshen_info:'出牌阶段对一名角色使用,目标在下一次进入濒死状态时回复1点体力', ziyangdan:'紫阳丹', ziyangdan_info:'出牌阶段对一名角色使用,目标获得3点护甲,此后每个准备阶段失去1点护甲,直到首次失去所有护甲或累计以此法失去3点护甲', gjyuheng:'玉衡', @@ -1846,9 +1846,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ mutoumianju_skill:'木杀', mutoumianju_skill_info:'出牌阶段限一次,你可以将一张手牌当作杀使用', heilonglinpian:'黑龙鳞片', - heilonglinpian_info:'出牌阶段对自己使用,获得一点护甲,直到下一回合开始,你的防御距离+1', + heilonglinpian_info:'出牌阶段对自己使用,获得1点护甲,直到下一回合开始,你的防御距离+1', shatang:'沙棠', - shatang_info:'出牌阶段对一名角色使用,对目标造成一点火焰伤害,然后目标获得一点护甲', + shatang_info:'出牌阶段对一名角色使用,对目标造成1点火焰伤害,然后目标获得1点护甲', food:'食物', chunbing:'春饼', @@ -1856,9 +1856,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ gudonggeng:'骨董羹', gudonggeng_info:'当你下一次受到杀造成的伤害时,令伤害-1,持续三回合', yougeng:'酉羹', - yougeng_info:'准备阶段,若你的体力值为全场最少或之一,你回复一点体力,持续两回合', + yougeng_info:'准备阶段,若你的体力值为全场最少或之一,你回复1点体力,持续两回合', liyutang:'鲤鱼汤', - liyutang_info:'结束阶段,若你的体力值为全场最少或之一,你获得一点护甲,持续两回合', + liyutang_info:'结束阶段,若你的体力值为全场最少或之一,你获得1点护甲,持续两回合', mizhilianou:'蜜汁藕', mizhilianou_info:'你可以将一张红桃牌当作桃使用,持续四回合', xiajiao:'虾饺', diff --git a/card/guozhan.js b/card/guozhan.js index 6f2f715bb..e087fc6a0 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -696,7 +696,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }); }, mode:['guozhan'], - global:['g_chiling1','g_chiling2','g_chiling3'], + //global:['g_chiling1','g_chiling2','g_chiling3'], filterTarget:function(card,player,target){ return target.isUnseen(); }, @@ -754,6 +754,27 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } target.draw(); }, + destroy:function(card,targetPosition,player,event){ + if(event.name!='lose'||event.name!='cardsDiscard'||targetPosition!='discardPile') return false; + var evt=event.getParent().relatedEvent; + if(evt&&evt.name=='useCard') return false; + + return true; + }, + onDestroy:function(){ + var currentPhase=_status.currentPhase; + if(currentPhase){ + _status.chiling=true; + currentPhase.addTempSkill('g_chiling3'); + } + if(!lib.inpile.contains('zhaoshu')){ + lib.inpile.push('zhaoshu'); + var card=game.createCard2('zhaoshu','club',3); + game.log(card,'被置于了牌堆底'); + ui.cardPile.appendChild(card); + game.updateRoundNumber(); + } + }, ai:{ order:6, result:{ @@ -1570,50 +1591,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } }, }, - g_chiling1:{ - mode:['guozhan'], - trigger:{ - player:'loseEnd', - global:'cardsDiscardEnd', - }, - filter:function(event,player){ - var evt=event.getParent().relatedEvent; - if(evt&&evt.name=='useCard') return false; - for(var i=0;i0) return -1; @@ -187,40 +187,40 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, equipSkill:true, direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('xuelunyang'),function(card,player,target){ - var names=[]; - if(target.name&&!target.isUnseen(0)) names.add(target.name); - if(target.name1&&!target.isUnseen(0)) names.add(target.name1); - if(target.name2&&!target.isUnseen(1)) names.add(target.name2); - var pss=player.getSkills(); - for(var i=0;i锁定技 你的武将牌不能被翻面", + "mianju_info":"锁定技 你的武将牌不能被翻面。", "shoulijian":"手里剑", - "shoulijian_info":"出牌阶段,对一名距离1以外的角色使用,令其弃置一张装备牌或受到一点伤害", + "shoulijian_info":"出牌阶段,对一名距离1以外的角色使用,令其弃置一张装备牌或受到1点伤害。", "kuwu":"苦无", - "kuwu_info":"锁定技 每当你使用【杀】造成一次伤害,受伤角色须弃置一张牌", + "kuwu_info":"锁定技 每当你使用【杀】造成一次伤害,受伤角色须弃置一张牌。", "xuelunyang":"写轮眼", - "xuelunyang_info":"回合开始阶段,你可以选择一名角色,然后获得其一项技能,直到回合结束", + "xuelunyang_info":"回合开始阶段,你可以选择一名角色,然后获得其一项技能,直到回合结束。", "jiuwei":"九尾", - "jiuwei_info":"(收集查克拉)回合结束时,若你已受伤,你可回复一点体力,否则摸一张牌", + "jiuwei_info":"(收集查克拉)回合结束时,若你已受伤,你可回复1点体力,否则摸一张牌。", }, list:[ ["diamond","5","monkey"], diff --git a/card/mtg.js b/card/mtg.js index 6914b720c..511dd76d9 100644 --- a/card/mtg.js +++ b/card/mtg.js @@ -233,7 +233,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ player._temp_mtg_haidao=true; player.chooseToDiscard('he','海岛').set('ai',function(card){ return 5-get.value(card); - }).set('prompt2','弃置一张牌并回复一点体力,或取消并获得一点护甲'); + }).set('prompt2','弃置一张牌并回复1点体力,或取消并获得1点护甲'); } 'step 1' if(result.bool){ @@ -653,53 +653,53 @@ game.import('card',function(lib,game,ui,get,ai,_status){ land:'地图', mtg_yixialan:'依夏兰', mtg_yixialan_skill:'依夏兰', - mtg_yixialan_info:'选项一:随机获得一张基本牌;选项二:随机获得一张锦囊牌。地图效果:出牌阶段限一次,你可以将一张基本牌重铸为锦囊牌', - mtg_yixialan_skill_info:'出牌阶段限一次,你可以将一张基本牌重铸为锦囊牌', + mtg_yixialan_info:'选项一:随机获得一张基本牌;选项二:随机获得一张锦囊牌。地图效果:出牌阶段限一次,你可以将一张基本牌重铸为锦囊牌。', + mtg_yixialan_skill_info:'出牌阶段限一次,你可以将一张基本牌重铸为锦囊牌。', mtg_shuimomuxue:'水没墓穴', mtg_shuimomuxue_skill:'水没墓穴', - mtg_shuimomuxue_info:'你可以弃置一张牌并摸两张牌。地图效果:锁定技,你的手牌上限-1;若弃牌阶段弃置了至少一张牌,则在此阶段结束时摸一张牌', - mtg_shuimomuxue_skill_info:'锁定技,你的手牌上限-1;若弃牌阶段弃置了至少一张牌,则在此阶段结束时摸一张牌', + mtg_shuimomuxue_info:'你可以弃置一张牌并摸两张牌。地图效果:锁定技,你的手牌上限-1;若弃牌阶段弃置了至少一张牌,则在此阶段结束时摸一张牌。', + mtg_shuimomuxue_skill_info:'锁定技,你的手牌上限-1;若弃牌阶段弃置了至少一张牌,则在此阶段结束时摸一张牌。', mtg_feixu:'废墟', mtg_feixu_skill:'废墟', - mtg_feixu_info:'从弃牌堆中发现一张牌。地图效果:准备阶段,随机将弃牌堆的一张牌置于牌堆顶', - mtg_feixu_skill_info:'准备阶段,随机将弃牌堆的一张牌置于牌堆顶', + mtg_feixu_info:'从弃牌堆中发现一张牌。地图效果:准备阶段,随机将弃牌堆的一张牌置于牌堆顶。', + mtg_feixu_skill_info:'准备阶段,随机将弃牌堆的一张牌置于牌堆顶。', mtg_haidao:'海岛', mtg_haidao_skill:'海岛', - mtg_haidao_info:'选项一:获得一点护甲(无视地图效果);选项二:弃置一张牌并回复一点体力。地图效果:锁定技,当你获得护甲时,若你已受伤,改为回复等量体力', - mtg_haidao_skill_info:'锁定技,当你获得护甲时,若你已受伤,改为回复等量体力', + mtg_haidao_info:'选项一:获得1点护甲(无视地图效果);选项二:弃置一张牌并回复1点体力。地图效果:锁定技,当你获得护甲时,若你已受伤,改为回复等量体力。', + mtg_haidao_skill_info:'锁定技,当你获得护甲时,若你已受伤,改为回复等量体力。', mtg_youlin:'幽林', mtg_youlin_skill:'幽林', - mtg_youlin_info:'随机使用一张普通锦囊牌,随机指定一个具有正收益的目标。地图效果:出牌阶段限一次,你可以弃置一张锦囊牌并发现一张牌', - mtg_youlin_skill_info:'出牌阶段限一次,你可以弃置一张锦囊牌并发现一张牌', + mtg_youlin_info:'随机使用一张普通锦囊牌,随机指定一个具有正收益的目标。地图效果:出牌阶段限一次,你可以弃置一张锦囊牌并发现一张牌。', + mtg_youlin_skill_info:'出牌阶段限一次,你可以弃置一张锦囊牌并发现一张牌。', mtg_shamolvzhou:'沙漠绿洲', mtg_shamolvzhou_skill:'沙漠绿洲', - mtg_shamolvzhou_info:'发现一张基本牌。地图效果:你的基本牌不计入手牌上限', - mtg_shamolvzhou_skill_info:'你的基本牌不计入手牌上限', + mtg_shamolvzhou_info:'发现一张基本牌。地图效果:你的基本牌不计入手牌上限。', + mtg_shamolvzhou_skill_info:'你的基本牌不计入手牌上限。', mtg_duzhao:'毒沼', mtg_duzhao_skill:'毒沼', - mtg_duzhao_info:'选择一名角色令其获得一张毒。地图效果:结束阶段,你获得一张毒', - mtg_duzhao_skill_info:'结束阶段,你获得一张毒', + mtg_duzhao_info:'选择一名角色令其获得一张毒。地图效果:结束阶段,你获得一张毒。', + mtg_duzhao_skill_info:'结束阶段,你获得一张毒。', mtg_linzhongjianta:'林中尖塔', mtg_linzhongjianta_skill:'林中尖塔', - mtg_linzhongjianta_info:'发现一张武器牌并装备之。地图效果:若你装备区内有武器牌,你可以将一张基本牌当作杀使用', - mtg_linzhongjianta_skill_info:'若你装备区内有武器牌,你可以将一张基本牌当作杀使用', + mtg_linzhongjianta_info:'发现一张武器牌并装备之。地图效果:若你装备区内有武器牌,你可以将一张基本牌当作杀使用。', + mtg_linzhongjianta_skill_info:'若你装备区内有武器牌,你可以将一张基本牌当作杀使用。', mtg_cangbaohaiwan:'藏宝海湾', mtg_cangbaohaiwan_skill:'藏宝海湾', - mtg_cangbaohaiwan_info:'选择一个护展包,随机获得来自该扩展包的一张衍生牌。地图效果:你在摸牌时有可能摸到衍生牌', - mtg_cangbaohaiwan_skill_info:'你在摸牌时有可能摸到衍生牌', + mtg_cangbaohaiwan_info:'选择一个护展包,随机获得来自该扩展包的一张衍生牌。地图效果:你在摸牌时有可能摸到衍生牌。', + mtg_cangbaohaiwan_skill_info:'你在摸牌时有可能摸到衍生牌。', mtg_longlushanfeng:'龙颅山峰', mtg_longlushanfeng_skill:'龙颅山峰', - mtg_longlushanfeng_info:'选项一:获得一张杀;选项二:获得一张闪。地图效果:你出杀的次数上限+1', - mtg_longlushanfeng_skill_info:'你出杀的次数上限+1', + mtg_longlushanfeng_info:'选项一:获得一张杀;选项二:获得一张闪。地图效果:你出杀的次数上限+1。', + mtg_longlushanfeng_skill_info:'你出杀的次数上限+1。', mtg_bingheyaosai:'冰河要塞', mtg_bingheyaosai_skill:'冰河要塞', - mtg_bingheyaosai_info:'摸两张牌,然后弃置两张牌。地图效果:锁定技,每当你使用一张杀,若你有牌,则需弃置一张牌', - mtg_bingheyaosai_skill_info:'锁定技,每当你使用一张杀,若你有牌,则需弃置一张牌', + mtg_bingheyaosai_info:'摸两张牌,然后弃置两张牌。地图效果:锁定技,每当你使用一张杀,若你有牌,则需弃置一张牌。', + mtg_bingheyaosai_skill_info:'锁定技,每当你使用一张杀,若你有牌,则需弃置一张牌。', mtg_lindixiliu:'林地溪流', mtg_lindixiliu_skill:'林地溪流', - mtg_lindixiliu_info:'从牌堆中摸一张红桃牌,然后弃置任意张红桃牌,每弃置一张牌,将一张延时锦囊牌置入一名随机敌方角色的判定区;。地图效果:准备阶段,你可以弃置一张红桃牌,然后弃置判定区内的一张牌', - mtg_lindixiliu_skill_info:'准备阶段,你可以弃置一张红桃牌,然后弃置判定区内的一张牌', + mtg_lindixiliu_info:'从牌堆中摸一张红桃牌,然后弃置任意张红桃牌,每弃置一张牌,将一张延时锦囊牌置入一名随机敌方角色的判定区。地图效果:准备阶段,你可以弃置一张红桃牌,然后弃置判定区内的一张牌。', + mtg_lindixiliu_skill_info:'准备阶段,你可以弃置一张红桃牌,然后弃置判定区内的一张牌。', }, help:{ '万智牌':'
  • 地图牌可于出牌阶段使用,每阶段最多使用一张地图牌
  • '+ diff --git a/card/sp.js b/card/sp.js index fc62bb820..12a809800 100644 --- a/card/sp.js +++ b/card/sp.js @@ -632,25 +632,25 @@ game.import('card',function(lib,game,ui,get,ai,_status){ qijia_info:'出牌阶段,对一名装备区里有牌的其他角色使用。该角色选择一项:1.弃置手牌区和装备区里所有的武器和-1坐骑;2.弃置手牌区和装备区里所有的防具和+1坐骑。', jinchan:'金蝉脱壳', g_jinchan2:'金蝉脱壳', - g_jinchan2_info:'当你因弃置而失去【金蝉脱壳】时,你摸一张牌', + g_jinchan2_info:'当你因弃置而失去【金蝉脱壳】时,你摸一张牌。', jinchan_info:'其他角色使用的基本牌或普通牌对你生效时,若你的所有手牌均为【金蝉脱壳】,则你可以使用此牌。你令此牌对你无效并摸两张牌。当你因弃置而失去【金蝉脱壳】时,你摸一张牌。', fulei:'浮雷', fulei_info:'出牌阶段,对你使用。你将【浮雷】置入判定区。若判定结果为♠,则目标角色受到X点雷电伤害(X为此牌判定结果为♠的次数)。判定完成后,将此牌移动到下家的判定区里。', qibaodao:'七宝刀', - qibaodao_info:'攻击范围2;锁定技,你使用【杀】无视目标防具,若目标角色未损失体力值,此【杀】伤害+1', + qibaodao_info:'攻击范围2;锁定技,你使用【杀】无视目标防具,若目标角色未损失体力值,此【杀】伤害+1。', qibaodao2:'七宝刀', zhungangshuo:'衠钢槊', - zhungangshuo_info:'当你使用【杀】指定一名角色为目标后,你可令该角色弃置你的一张手牌,然后你弃置其一张手牌', + zhungangshuo_info:'当你使用【杀】指定一名角色为目标后,你可令该角色弃置你的一张手牌,然后你弃置其一张手牌。', lanyinjia:'烂银甲', lanyinjia_info:'你可以将一张手牌当做【闪】使用或打出。锁定技,【烂银甲】不会无效化;当你受到【杀】造成的伤害时,弃置【烂银甲】。', yinyueqiang:'银月枪', - yinyueqiang_info:'你的回合外,每当你使用或打出了一张黑色手牌(若为使用则在它结算之前),你可以立即对你攻击范围内的任意一名角色使用一张【杀】', + yinyueqiang_info:'你的回合外,每当你使用或打出了一张黑色手牌(若为使用则在它结算之前),你可以立即对你攻击范围内的任意一名角色使用一张【杀】。', shengdong:'声东击西', - shengdong_info:'出牌阶段,对一名其他角色使用。你交给目标角色一张手牌,若如此做,其将两张牌交给另一名由你选择的其他角色(不足则全给,存活角色不超过2时可重铸)', + shengdong_info:'出牌阶段,对一名其他角色使用。你交给目标角色一张手牌,若如此做,其将两张牌交给另一名由你选择的其他角色(不足则全给,存活角色不超过2时可重铸)。', zengbin:'增兵减灶', - zengbin_info:'出牌阶段,对一名角色使用。目标角色摸三张牌,然后选择一项:1.弃置一张非基本牌;2.弃置两张牌', + zengbin_info:'出牌阶段,对一名角色使用。目标角色摸三张牌,然后选择一项:1.弃置一张非基本牌;2.弃置两张牌。', caomu:'草木皆兵', - caomu_info:'出牌阶段,对一名其他角色使用。将【草木皆兵】放置于该角色的判定区里,若判定结果不为梅花:摸牌阶段,目标角色少摸一张牌;摸牌阶段结束时,与其距离为1的角色各摸一张牌', + caomu_info:'出牌阶段,对一名其他角色使用。将【草木皆兵】放置于该角色的判定区里,若判定结果不为梅花:摸牌阶段,目标角色少摸一张牌;摸牌阶段结束时,与其距离为1的角色各摸一张牌。', }, list:[ ['spade',1,'caomu'], diff --git a/card/standard.js b/card/standard.js index 31930207f..6c5c4b117 100644 --- a/card/standard.js +++ b/card/standard.js @@ -141,7 +141,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ var target=_status.event.player; var evt=_status.event.getParent(); var bool=true; - if(_status.event.shanRequired>1&&!get.is.object(card)&&target.countCards('h','shan')<_status.event.shanRequired){ + if(_status.event.shanRequired>1&&!get.is.object(card)&&target.countCards('h','shan')<_status.event.shanRequired-(_status.event.shanIgnored||0)){ bool=false; } else if(target.hasSkillTag('useShan')){ @@ -399,112 +399,122 @@ game.import('card',function(lib,game,ui,get,ai,_status){ target.recover(); }, ai:{ - basic: { - order: function (card, player) { - if (player.hasSkillTag('pretao')) return 9; + basic:{ + order:(card,player)=>{ + if(player.hasSkillTag('pretao')) return 9; return 2; }, - useful: function (card, i) { + useful:(card,i)=>{ let player = _status.event.player; - if (player.isDamaged() && !game.checkMod(card, player, 'unchanged', 'cardEnabled2', player)) return 2 / (1 + i); - let fs = game.filterPlayer(function (current) { - return get.attitude(player, current) > 0 && current.hp <= 2; + if(player.isDamaged()&&!game.checkMod(card,player,'unchanged','cardEnabled2',player)) return 2/(1+i); + let fs = game.filterPlayer(current=>{ + return get.attitude(player,current)>0&¤t.hp<=2; }), damaged = 0, needs = 0; - for (let f of fs) { - if (!lib.filter.cardSavable(card, player, f)) continue; - if (f.hp > 1) damaged++; + fs.forEach(f=>{ + if(!lib.filter.cardSavable(card,player,f)) return; + if(f.hp>1) damaged++; else needs++; - } - if (needs && damaged) return 5 * needs + 3 * damaged; - if (needs + damaged > 1 || player.hasSkillTag('maixie')) return 8; - if (player.hp / player.maxHp < 0.7) return 7 + Math.abs(player.hp / player.maxHp - 0.5); - if (needs) return 7; - if (damaged) return Math.max(3, 6.4 - i); - return 6.8 - Math.min(5, player.hp); + }); + if(needs&&damaged) return 5*needs+3*damaged; + if(needs+damaged>1 || player.hasSkillTag('maixie')) return 8; + if(player.hp/player.maxHp<0.7) return 7+Math.abs(player.hp/player.maxHp-0.5); + if(needs) return 7; + if(damaged) return Math.max(3,6.4-i); + return 6.8-Math.min(5,player.hp); }, - value: function (card, player, i) { - let fs = game.filterPlayer(function (current) { - return get.attitude(_status.event.player, current) > 0; + value:(card,player,i)=>{ + let fs = game.filterPlayer(current=>{ + return get.attitude(_status.event.player,current)>0; }), damaged = 0, needs = 0; - for (let i of fs) { - if (!player.canUse('tao', i)) continue; - if (i.hp <= 1) needs++; - else if (i.hp == 2) damaged++; - } - if (needs > 2) return 11; - if (needs > 1) return 10; - if ((needs && damaged) || player.hasSkillTag('maixie')) return 9; - if (needs || damaged > 1) return 8; - if (damaged) return 7.5; - return Math.max(1, 9.2 - player.hp); + fs.forEach(f=>{ + if(!player.canUse('tao',f)) return; + if(f.hp<=1) needs++; + else if(f.hp==2) damaged++; + }); + if(needs>2) return 11; + if(needs>1) return 10; + if(needs&&damaged || player.hasSkillTag('maixie')) return 9; + if(needs || damaged>1) return 8; + if(damaged) return 7.5; + return Math.max(1,9.2-player.hp); } }, - result: { - target: function (player, target) { - if (target.hasSkillTag('maixie')) return 3; + result:{ + target:(player,target)=>{ + if(target.hasSkillTag('maixie')) return 3; return 2; }, - target_use: function (player, target, card) { - if (player === _status.currentPhase && player.hasSkillTag('nokeep', true, {card:card,target:target}, true)) return 2; - let mode = get.mode(); - if (target.hp > 0) { - let nd = player.needsToDiscard(); - let keep = false; - if (player.isPhaseUsing()) { - if (nd <= 0 || (nd === 1 && target.hp >= 2 && player.countCards('hs', 'tao') <= 1)) keep = true; + target_use:(player,target,card)=>{ + if(player===_status.currentPhase&&player.hasSkillTag('nokeep',true,{ + card:card, + target:target + },true)) return 2; + let mode = get.mode(), + taos = player.getCards('hs',i=>get.name(i)==='tao'&&lib.filter.cardEnabled(i,target,'forceEnable')); + if(target.hp>0){ + let min = 7.2-1.2*Math.min(3,player.hp), + nd = player.needsToDiscard(-player.countCards('h',i=>!taos.includes(i)&&get.value(i)1&&(nd>1||nd&&player.hp<1+taos.length) || target.identity==='zhu'&&target.hp<3&&(mode==='identity'||mode==='versus'||mode==='chess')) return 2; + if(nd<3&&game.hasPlayer(current=>{ + return player!==current&¤t.identity==='zhu'&¤t.hp<3&&(mode==='identity'||mode==='versus'||mode==='chess')&&get.attitude(player,current)>0; + })){ + nd=0; + keep=3; } - if (keep) { - if (!nd || nd < 2 && game.hasPlayer(function (current) { - if (current.hp <= 2 && player !== current && get.attitude(player, current) > 2) { - if(target.hp >= 2 && current.identity === 'zhu' && (mode === 'identity' || mode === 'versus' || mode === 'chess')){ - keep=2; - return true; - } - if (player.hp > current.hp) return true; + else if(nd<2 || !player.isPhaseUsing()){ + if(nd<1) keep = 3; + else if(target.hp>=2&&taos.length<=target.hp/2) keep = 1; + } + if(keep){ + if(!nd || game.countPlayer(current=>{ + if(player!==current&¤t.hp<3&&player.hp>current.hp&&get.attitude(player,current)>2){ + keep += player.hp-current.hp; + return true; } return false; })){ - if(keep>1) return 0; + if(keep>2) return 0; } } } if(target.isZhu2() || target===game.boss) return 2; - if(player !== target){ - if (target.hp < 0 && player.countCards('hs', 'tao') + target.hp <= 0) return 0; - if (Math.abs(get.attitude(player, target)) < 1.2) return 0; + if(player!==target){ + if(target.hp<0&&taos.length+target.hp<=0) return 0; + if(Math.abs(get.attitude(player,target))<1) return 0; } - if (!player.getFriends().length) return 2; + if(!player.getFriends().length) return 2; let tri = _status.event.getTrigger(), - num = game.countPlayer(function (current) { - if (get.attitude(current, target) > 0) return current.countCards('hs', 'tao'); + num = game.countPlayer(current=>{ + if(get.attitude(current,target)>0) return current.countCards('hs',i=>get.name(i)==='tao'&&lib.filter.cardEnabled(i,target,'forceEnable')); }), dis = 1, - t = _status.currentPhase; - while (t !== target) { - let att = get.attitude(player, t); - if (Math.abs(att) < 2) dis += 0.45; - else if (att < 0) dis++; + t = _status.currentPhase||game.me; + while(t!==target){ + let att = get.attitude(player,t); + if(att<-2) dis++; + else if(att<1) dis += 0.45; t = t.next; } - if (mode === 'identity') { - if (tri && tri.name === 'dying') { - if (target.identity === 'fan') { - if (!tri.source && player !== target || tri.source && tri.source !== target && player.getFriends().includes(tri.source.identity)) { - if (num > dis || (player === target && player.countCards('hs', {type: 'basic'}) > 1.6 * dis)) return 2; + if(mode==='identity'){ + if(tri&&tri.name==='dying'){ + if(target.identity==='fan') { + if(!tri.source&&player!==target || tri.source&&tri.source!==target&&player.getFriends().includes(tri.source.identity)){ + if(num>dis || player===target&&player.countCards('hs',{type:'basic'})>1.6*dis) return 2; return 0; } } else if(tri.source&&tri.source.isZhu&&(target.identity==='zhong'||target.identity==='mingzhong')&& - (tri.source.countCards('he')>2||player===tri.source&&player.hasCard((i)=>i.name!='tao','he'))) return 2; + (tri.source.countCards('he')>2||player===tri.source&&player.hasCard((i)=>i.name!=='tao','he'))) return 2; //if(player!==target&&!target.isZhu&&target.countCards('hs'){ + return current.identity==='fan'; }))) return 0; } } - else if (mode === 'stone' && target.isMin() && player !== target && tri && tri.name === 'dying' && player.side === target.side && tri.source !== target.getEnemy()) return 0; + else if(mode==='stone'&&target.isMin()&&player!==target&&tri&&tri.name==='dying'&&player.side===target.side&&tri.source!==target.getEnemy()) return 0; return 2; } }, @@ -904,8 +914,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, ai:{ basic:{ - order:function(){ - return 11; + order:(item,player)=>{ + if(game.hasPlayer(current=>current.hp<=1&&get.recoverEffect(current,player,_status.event.player)<0)) return 1; + return 10; }, useful:[3,1], value:0, @@ -1169,14 +1180,14 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(event.shaRequired>1&&player.countCards('h','sha')get.damageEffect(player,target,event.player)){ return get.order(card); } return -1; @@ -1481,6 +1492,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ player.discardPlayerCard(target,pos,true,'visible'); }, ai:{ + wuxie:(target,card,player,viewer,status)=>{ + if(status*get.attitude(viewer,player)>0&&!player.isMad() || target.hp>2&&!target.hasCard(i=>{ + return get.value(i,target)>3+Math.min(5,target.hp); + },'e')&&target.countCards('h')*_status.event.getRand('guohe_wuxie')>1.57) return 0; + }, basic:{ order:9, useful:5, @@ -3234,10 +3250,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ renwang_skill:'仁王盾', hanbing_info:'当你因执行【杀】的效果而造成伤害时,若目标角色有能被弃置的牌,则你可以防止此伤害,然后依次弃置目标角色的两张牌。', hanbing_skill_info:'当你因执行【杀】的效果而造成伤害时,若目标角色有能被弃置的牌,则你可以防止此伤害,然后依次弃置目标角色的两张牌。', - renwang_info:'锁定技,黑色【杀】对你无效', - renwang_skill_info:'锁定技,黑色【杀】对你无效', + renwang_info:'锁定技,黑色【杀】对你无效。', + renwang_skill_info:'锁定技,黑色【杀】对你无效。', sha_info:'出牌阶段,对你攻击范围内的一名角色使用。其须使用一张【闪】,否则你对其造成1点伤害。', - shan_info:'抵消一张【杀】', + shan_info:'抵消一张【杀】。', tao_info:'①出牌阶段,对自己使用,目标角色回复1点体力。②当有角色处于濒死状态时,对该角色使用。目标角色回复1点体力。', bagua_info:'当你需要使用或打出一张【闪】时,你可以进行判定。若结果为红色,则你视为使用或打出一张【闪】。', bagua_skill_info:'当你需要使用或打出一张【闪】时,你可以进行判定。若结果为红色,则你视为使用或打出一张【闪】。', diff --git a/card/swd.js b/card/swd.js index 2a10fa52d..e70ce821e 100644 --- a/card/swd.js +++ b/card/swd.js @@ -679,7 +679,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" if(target.countCards('h')){ - var next=target.chooseToDiscard('机关火筒:弃置一张手牌或受到一点火焰伤害'); + var next=target.chooseToDiscard('机关火筒:弃置一张手牌或受到1点火焰伤害'); next.set('ai',function(card){ var evt=_status.event.getParent(); if(get.damageEffect(evt.target,evt.player,evt.target,'fire')>=0) return 0; @@ -1654,7 +1654,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ event.finish(); } else{ - target.chooseToDiscard({color:'black'},'弃置一张黑色手牌或受流失一点体力').ai=function(card){ + target.chooseToDiscard({color:'black'},'弃置一张黑色手牌或受失去1点体力').ai=function(card){ return 8-get.value(card); }; } @@ -2617,9 +2617,9 @@ game.import('card',function(lib,game,ui,get,ai,_status){ intro:{ content:function(storage,player){ if(storage==1){ - '在'+get.translation(player.storage.gouhunluo2)+'的下个准备阶段失去一点体力并弃置所有手牌' + '在'+get.translation(player.storage.gouhunluo2)+'的下个准备阶段失去1点体力并弃置所有手牌' } - return '在'+storage+'轮后'+get.translation(player.storage.gouhunluo2)+'的准备阶段失去一点体力并弃置所有手牌' + return '在'+storage+'轮后'+get.translation(player.storage.gouhunluo2)+'的准备阶段失去1点体力并弃置所有手牌' } }, nopop:true, @@ -4956,7 +4956,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ // yihuajiemu:'移花接木', // yihuajiemu_info:'对一名装备区内有宝物的角色使用,将其宝物牌转移至另一名角色', liuxinghuoyu:'流星火羽', - liuxinghuoyu_info:'出牌阶段,对一名角色使用,令目标弃置2张牌,或受到一点火焰伤害', + liuxinghuoyu_info:'出牌阶段,对一名角色使用,令目标弃置两张牌,或受到1点火焰伤害', g_yuchan_equip:'玉蝉', yuchanqian_duanzao:'玉蝉', yuchanqian_equip1_info:'出牌阶段限一次,你可以弃置任意张基本牌并摸等量的牌', @@ -5025,7 +5025,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ yangpijuan:'羊皮卷', yangpijuan_info:'出牌阶段对自己使用,选择一种卡牌类别,发现一张该类别的卡牌', // pantao:'蟠桃', - // pantao_info:'出牌阶段对自己使用,或对濒死角色使用,目标回复两点体力并获得一点护甲', + // pantao_info:'出牌阶段对自己使用,或对濒死角色使用,目标回复2点体力并获得1点护甲', shencaojie:'神草结', shencaojie_info:'你的锦囊牌即将造成伤害时对目标使用,令此伤害+1;你即将受到锦囊牌伤害时对自己使用,令此伤害-1', yuruyi:'玉如意', @@ -5063,31 +5063,31 @@ game.import('card',function(lib,game,ui,get,ai,_status){ baishouzhihu_equip5_info:'结束阶段,你可以弃置一名其他角色的一张随机牌', zhuquezhizhang:'朱雀之璋', g_zhuquezhizhang:'朱雀之璋', - zhuquezhizhang_info:'可用于煅造装备;此牌在你手牌中时,每当你受到其他角色造成的伤害,你对伤害来源造成一点火属性伤害', + zhuquezhizhang_info:'可用于煅造装备;此牌在你手牌中时,每当你受到其他角色造成的伤害,你对伤害来源造成1点火属性伤害', zhuquezhizhang_duanzao:'炽翎', - zhuquezhizhang_equip1_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成一点火属性伤害', - zhuquezhizhang_equip2_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成一点火属性伤害', - zhuquezhizhang_equip3_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成一点火属性伤害', - zhuquezhizhang_equip4_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成一点火属性伤害', - zhuquezhizhang_equip5_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成一点火属性伤害', + zhuquezhizhang_equip1_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成1点火属性伤害', + zhuquezhizhang_equip2_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成1点火属性伤害', + zhuquezhizhang_equip3_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成1点火属性伤害', + zhuquezhizhang_equip4_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成1点火属性伤害', + zhuquezhizhang_equip5_info:'结束阶段,你可以弃置一张红色牌并对一名体力值不小于你的角色造成1点火属性伤害', xuanwuzhihuang:'玄武之璜', g_xuanwuzhihuang:'玄武之璜', xuanwuzhihuang_duanzao:'寒晶', xuanwuzhihuang_info:'可用于煅造装备;此牌在你手牌中时,每当你造成伤害,你回复等量的体力', - xuanwuzhihuang_equip1_info:'结束阶段,你可以弃置一张红色牌并回复一点体力', - xuanwuzhihuang_equip2_info:'结束阶段,你可以弃置一张红色牌并回复一点体力', - xuanwuzhihuang_equip3_info:'结束阶段,你可以弃置一张红色牌并回复一点体力', - xuanwuzhihuang_equip4_info:'结束阶段,你可以弃置一张红色牌并回复一点体力', - xuanwuzhihuang_equip5_info:'结束阶段,你可以弃置一张红色牌并回复一点体力', + xuanwuzhihuang_equip1_info:'结束阶段,你可以弃置一张红色牌并回复1点体力', + xuanwuzhihuang_equip2_info:'结束阶段,你可以弃置一张红色牌并回复1点体力', + xuanwuzhihuang_equip3_info:'结束阶段,你可以弃置一张红色牌并回复1点体力', + xuanwuzhihuang_equip4_info:'结束阶段,你可以弃置一张红色牌并回复1点体力', + xuanwuzhihuang_equip5_info:'结束阶段,你可以弃置一张红色牌并回复1点体力', huanglinzhicong:'黄麟之琮', g_huanglinzhicong:'黄麟之琮', huanglinzhicong_duanzao:'玄甲', - huanglinzhicong_info:'可用于煅造装备;此牌在你手牌中时,准备阶段,若你没有护甲,你获得一点护甲', - huanglinzhicong_equip1_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得一点护甲', - huanglinzhicong_equip2_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得一点护甲', - huanglinzhicong_equip3_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得一点护甲', - huanglinzhicong_equip4_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得一点护甲', - huanglinzhicong_equip5_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得一点护甲', + huanglinzhicong_info:'可用于煅造装备;此牌在你手牌中时,准备阶段,若你没有护甲,你获得1点护甲', + huanglinzhicong_equip1_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得1点护甲', + huanglinzhicong_equip2_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得1点护甲', + huanglinzhicong_equip3_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得1点护甲', + huanglinzhicong_equip4_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得1点护甲', + huanglinzhicong_equip5_info:'结束阶段,若你没有护甲,你可以弃置一张黑色牌并获得1点护甲', cangchizhibi:'苍螭之璧', g_cangchizhibi:'苍螭之璧', cangchizhibi_duanzao:'灵枢', @@ -5099,14 +5099,14 @@ game.import('card',function(lib,game,ui,get,ai,_status){ cangchizhibi_equip5_info:'结束阶段,你可以横置或重置一名角色', guisheqi:'龟蛇旗', - guisheqi_info:'出牌阶段对一名角色使用,目标获得一点护甲', + guisheqi_info:'出牌阶段对一名角色使用,目标获得1点护甲', jiguanfeng:'机关蜂', - jiguanfeng_info:'出牌阶段对一名其他角色使用,目标需打出一张闪,否则非锁定技失效直到下一回合开始,并受到一点伤害', + jiguanfeng_info:'出牌阶段对一名其他角色使用,目标需打出一张闪,否则非锁定技失效直到下一回合开始,并受到1点伤害', jiguanyuan:'机关鸢', jiguanyuan_info:'出牌阶段对一名其他角色使用,你将此牌和一张其它牌置于一名其他角色的武将牌上,然后摸一张牌;该角色于下一结束阶段获得武将牌上的牌', jiguantong:'机关火筒', jiguantong_ab:'火筒', - jiguantong_info:'出牌阶段对所有其他角色使用,目标弃置一张手牌,或受到一点火焰伤害;若没有人选择受到伤害,使用者摸一张牌', + jiguantong_info:'出牌阶段对所有其他角色使用,目标弃置一张手牌,或受到1点火焰伤害;若没有人选择受到伤害,使用者摸一张牌', jiutiansuanchi:'九天算尺', jiutiansuanchi_info:'每当你使用杀造成伤害,你可以弃置一张牌并展示受伤害角色的一张手牌,若此牌与你弃置的牌花色或点数相同,此杀的伤害+2', shenmiguo:'神秘果', @@ -5181,7 +5181,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ hslingjian_zhongxinghujia_info:'可用于煅造装备;令一名角色装备一件随机防具,然后随机弃置其一张手牌', hslingjian_jinjilengdong:'紧急冷冻', hslingjian_jinjilengdong_bg:'冻', - hslingjian_jinjilengdong_info:'可用于煅造装备;令一名武将牌正面朝上的其他角色获得两点护甲并翻面,该角色不能使用卡牌,也不能成为卡牌的目标直到武将牌翻回正面', + hslingjian_jinjilengdong_info:'可用于煅造装备;令一名武将牌正面朝上的其他角色获得2点护甲并翻面,该角色不能使用卡牌,也不能成为卡牌的目标直到武将牌翻回正面', hslingjian_yinmilichang:'隐秘力场', hslingjian_yinmilichang_info:'可用于煅造装备;令一名其他角色获得技能潜行,直到其下一回合开始', hslingjian_xingtigaizao:'型体改造', @@ -5199,12 +5199,12 @@ game.import('card',function(lib,game,ui,get,ai,_status){ xingjunyan_info:'你的杀造成的伤害+1;杀对你造成的伤害+1', guiyanfadao:'鬼眼法刀', guiyanfadao_bg:'眼', - guiyanfadao_info:'每当你使用杀命中目标,你可以防止伤害,改为令目标失去一点体力', + guiyanfadao_info:'每当你使用杀命中目标,你可以防止伤害,改为令目标失去1点体力', tianxianjiu:'天仙酒', tianxianjiu_bg:'仙', tianxianjiu_info:'出牌阶段对自己使用,你使用的下一张杀造成伤害后可以摸两张牌;濒死阶段,对自己使用,回复1点体力', // xiangyuye:'翔羽叶', - // xiangyuye_info:'出牌阶段,对一名攻击范围外的角色使用,令其弃置一张黑色手牌或流失一点体力', + // xiangyuye_info:'出牌阶段,对一名攻击范围外的角色使用,令其弃置一张黑色手牌或失去1点体力', // huanpodan:'还魄丹', // huanpodan_bg:'魄', // huanpodan_info:'出牌阶段对一名角色使用,在目标即将死亡时防止其死亡,改为令其弃置所有牌,将体力值回复至1并摸一张牌', @@ -5228,11 +5228,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ nigong2:'逆攻', nigong3:'逆攻', nigong4:'逆攻', - guilingzhitao_info:'每当你受到一点伤害,你获得一个逆攻标记,标记数不能超过4。出牌阶段,你可以弃置所有逆攻标记并令对一名其他角色造成标记数一半的伤害(若非整数则向下取整并摸一张牌)', - nigong_info:'每当你受到一点伤害,你获得一个逆攻标记,标记数不能超过4。出牌阶段,你可以弃置所有逆攻标记并令对一名其他角色造成标记数一半的伤害(若非整数则向下取整并摸一张牌)', + guilingzhitao_info:'每当你受到1点伤害,你获得一个逆攻标记,标记数不能超过4。出牌阶段,你可以弃置所有逆攻标记并令对一名其他角色造成标记数一半的伤害(若非整数则向下取整并摸一张牌)', + nigong_info:'每当你受到1点伤害,你获得一个逆攻标记,标记数不能超过4。出牌阶段,你可以弃置所有逆攻标记并令对一名其他角色造成标记数一半的伤害(若非整数则向下取整并摸一张牌)', baihupifeng:'白狐披风', baihupifeng_bg:'狐', - baihupifeng_info:'结束阶段,若你的体力值是全场最小的之一,你可以回复一点体力', + baihupifeng_info:'结束阶段,若你的体力值是全场最小的之一,你可以回复1点体力', fengxueren:'封雪刃', fengxueren_bg:'雪', fengxueren_info:'你使用杀击中目标后,若目标武将牌正面朝上,你可以防止伤害,然后令目标摸一张牌并翻面', @@ -5252,27 +5252,27 @@ game.import('card',function(lib,game,ui,get,ai,_status){ shentou:'神偷', shentou_info:'出牌阶段,你可以进行一次判定,若结果不为梅花,你获得任意一名角色的一张手牌', xianluhui:'仙炉灰', - xianluhui_info:'令所有已受伤角色获得一点护甲', + xianluhui_info:'令所有已受伤角色获得1点护甲', caoyao:'草药', - caoyao_info:'出牌阶段,对距离为1以内的角色使用,回复一点体力。', + caoyao_info:'出牌阶段,对距离为1以内的角色使用,回复1点体力。', langeguaiyi:'蓝格怪衣', langeguaiyi_bg:'格', - langeguaiyi_info:'出牌阶段限一次,你可以进行一次判定,然后按花色执行以下效果。红桃:你回复一点体力;方片:你摸一张牌;梅花:你令一名随机敌方角色随机弃置一张牌;黑桃:无事发生', + langeguaiyi_info:'出牌阶段限一次,你可以进行一次判定,然后按花色执行以下效果。红桃:你回复1点体力;方片:你摸一张牌;梅花:你令一名随机敌方角色随机弃置一张牌;黑桃:无事发生', longfan:'龙帆', - longfan_info:'出牌阶段限一次,你可以进行一次判定,然后按花色执行以下效果。红桃:你回复一点体力;方片:你摸一张牌;梅花:你令一名随机敌方角色随机弃置一张牌;黑桃:无事发生', - // longfan_info:'0000:翻面;1111:弃手牌;2222:弃装备牌;3333:受伤害;4444:流失体力;5555:连环;6666:摸牌;7777:回复体力;8888:弃置判定牌;9999:置衡', + longfan_info:'出牌阶段限一次,你可以进行一次判定,然后按花色执行以下效果。红桃:你回复1点体力;方片:你摸一张牌;梅花:你令一名随机敌方角色随机弃置一张牌;黑桃:无事发生', + // longfan_info:'0000:翻面;1111:弃手牌;2222:弃装备牌;3333:受伤害;4444:失去体力;5555:连环;6666:摸牌;7777:回复体力;8888:弃置判定牌;9999:置衡', guiyoujie:'鬼幽结', guiyoujie_bg:'结', - guiyoujie_info:'出牌阶段,对一名其他角色使用。若判定结果为黑色,其失去一点体力并随机弃置一张牌', + guiyoujie_info:'出牌阶段,对一名其他角色使用。若判定结果为黑色,其失去1点体力并随机弃置一张牌', yufulu:'御夫录', - yufulu_info:'出牌阶段,可弃置一张武器牌令一名角色受到一点伤害,然后该角色获得此武器牌', + yufulu_info:'出牌阶段,可弃置一张武器牌令一名角色受到1点伤害,然后该角色获得此武器牌', touzhi:'投掷', - touzhi_info:'出牌阶段,可弃置一张武器牌令一名角色受到一点伤害,然后该角色获得此武器牌', + touzhi_info:'出牌阶段,可弃置一张武器牌令一名角色受到1点伤害,然后该角色获得此武器牌', xixueguizhihuan:'吸血鬼指环', xixueguizhihuan_ab:'血环', - xixueguizhihuan_info:'锁定技,每当你使用杀造成一点伤害,你回复一点体力', + xixueguizhihuan_info:'锁定技,每当你使用杀造成1点伤害,你回复1点体力', xixue:'吸血', - xixue_info:'锁定技,每当你使用杀造成一点伤害,你回复一点体力', + xixue_info:'锁定技,每当你使用杀造成1点伤害,你回复1点体力', zhufangshenshi:'祠符', zhufangshenshi_info:'出牌阶段,对一名其他角色使用,本回合内对其使用卡牌无视距离,结算后摸一张牌', jingleishan:'惊雷闪', @@ -5310,18 +5310,18 @@ game.import('card',function(lib,game,ui,get,ai,_status){ kongxin:'控心', lianhua:'炼化', // dujian:'毒箭', - // dujian_info:'出牌阶段,对一名有手牌或装备牌的角色使用,令其展示一张手牌,若与你选择的手牌颜色相同,其流失一点体力', + // dujian_info:'出牌阶段,对一名有手牌或装备牌的角色使用,令其展示一张手牌,若与你选择的手牌颜色相同,其失去1点体力', lianhua_info:'出牌阶段限一次,你可以弃置两张炼妖壶中的牌,从牌堆中获得一张与弃置的牌类别均不相同的牌', shouna:'收纳', shouna_info:'出牌阶段限一次,你可以弃置一张手牌,并将一名其他角色的一张手牌置入炼妖壶', donghuangzhong_info:'结束阶段,你可以弃置一张红色手牌,并选择一名角色将一张随机单体延时锦囊置入其判定区', - xuanyuanjian_info:'装备时获得一点护甲;每当你即将造成一次伤害,你令此伤害加一并变为雷属性,并在伤害结算后流失一点体力。任何时候,若你体力值不超过2,则立即失去轩辕剑', + xuanyuanjian_info:'装备时获得1点护甲;每当你即将造成一次伤害,你令此伤害加一并变为雷属性,并在伤害结算后失去1点体力。任何时候,若你体力值不超过2,则立即失去轩辕剑', pangufu_info:'锁定技,每当你造成一次伤害,受伤角色须弃置一张牌', haotianta_info:'锁定技,任意一名角色进行判定前,你观看牌堆顶的2张牌,并选择一张作为判定结果,此结果不可被更改,也不能触发技能', - shennongding_info:'出牌阶段,你可以弃置两张手牌,然后回复一点体力。每阶段限一次', + shennongding_info:'出牌阶段,你可以弃置两张手牌,然后回复1点体力。每阶段限一次', kongdongyin_info:'令你抵挡一次死亡,将体力回复至1,并摸一张牌,发动后进入弃牌堆', kunlunjingc_info:'出牌阶段限一次,你可以观看牌堆顶的三张牌,然后用一张手牌替换其中的一张', - nvwashi_info:'当一名角色濒死时,若你的体力值大于1,你可以失去一点体力并令其回复一点体力', + nvwashi_info:'当一名角色濒死时,若你的体力值大于1,你可以失去1点体力并令其回复1点体力', kongxin_info:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你可以指定另一名角色视为对方对该角色使用一张杀,否则对方可弃置你一张牌', fuxiqin_info:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你可以指定另一名角色视为对方对该角色使用一张杀,否则对方可弃置你一张牌', lianyaohu_info:'出牌阶段各限一次,你可以选择一项:1.弃置一张手牌,并将一名其他角色的一张手牌置入炼妖壶;2.弃置两张炼妖壶中的牌,从牌堆中获得一张与弃置的牌类别均不相同的牌', diff --git a/card/yongjian.js b/card/yongjian.js index 73b94e365..f37ec87f7 100644 --- a/card/yongjian.js +++ b/card/yongjian.js @@ -561,10 +561,13 @@ game.import('card',function(lib,game,ui,get,ai,_status){ prompt:'是否发动【赠毒】?', prompt2:'将本次获得的【毒】交给其他角色', ai1:function(card){ + var player = _status.event.player; + if(player.hasSkillTag("usedu")||get.effect(player,{name: "losehp"}, player, player)>0) return 0; if(!ui.selected.cards.length) return 1; return 0; }, ai2:function(target){ + if (target.hasSkillTag("usedu")) return get.attitude(_status.event.player,target)-0.01; return -get.attitude(_status.event.player,target)+0.01; }, }); diff --git a/card/yunchou.js b/card/yunchou.js index ca76a5e3c..60b18712e 100644 --- a/card/yunchou.js +++ b/card/yunchou.js @@ -268,7 +268,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return target.countCards('h')>0&&game.hasPlayer(function(current){ return target.canCompare(current); }); - return ui.selected.targets[0].canCompare(target); + //return ui.selected.targets[0].canCompare(target); }, filterAddedTarget:function(card,player,target,preTarget){ return target!=player&&preTarget.canCompare(target); @@ -441,7 +441,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ event.source.storage.youdishenru=player; event.source.addSkill('youdishenru'); 'step 1' - var next=event.source.chooseToUse({name:'sha'},player,-1,'对'+get.translation(player)+'使用一张杀,或受到一点伤害').set('addCount',false); + var next=event.source.chooseToUse({name:'sha'},player,-1,'对'+get.translation(player)+'使用一张杀,或受到1点伤害').set('addCount',false); next.ai2=function(){ return 1; }; @@ -903,35 +903,35 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, translate:{ diaobingqianjiang:'调兵遣将', - diaobingqianjiang_info:'出牌阶段,对你及其他有手牌的角色使用。你摸一张牌,然后亮出牌堆顶的X张牌(X为存活角色数的一半,向上取整),目标可以用一张手牌替换其中的一张牌。结算后,你可以将剩余的牌中的任意张以任意顺序置于牌堆顶', + diaobingqianjiang_info:'出牌阶段,对你及其他有手牌的角色使用。你摸一张牌,然后亮出牌堆顶的X张牌(X为存活角色数的一半,向上取整),目标可以用一张手牌替换其中的一张牌。结算后,你可以将剩余的牌中的任意张以任意顺序置于牌堆顶。', caochuanjiejian:'草船借箭', - caochuanjiejian_info:'出牌阶段对一名有手牌的其他角色使用,目标选择一项:将手牌中的所有杀(至少1张)交给你,并视为对你使用一张杀;或展示手牌并令你弃置任意张', + caochuanjiejian_info:'出牌阶段对一名有手牌的其他角色使用,目标选择一项:将手牌中的所有杀(至少1张)交给你,并视为对你使用一张杀;或展示手牌并令你弃置任意张。', // xiaolicangdao:'笑里藏刀', - // xiaolicangdao_info:'出牌阶段,对一名其他角色使用。你将此【笑里藏刀】交给目标,然后弃置其一张手牌,若这两张牌牌名相同,你对其造成1点伤害', + // xiaolicangdao_info:'出牌阶段,对一名其他角色使用。你将此【笑里藏刀】交给目标,然后弃置其一张手牌,若这两张牌牌名相同,你对其造成1点伤害。', shezhanqunru:'舌战群儒', - shezhanqunru_info:'出牌阶段,对你使用。你请求所有有手牌的其他角色响应,然后同时与响应的角色拼点。若有角色响应且结果中你赢的次数更多,或若没有角色响应,你摸三张牌', + shezhanqunru_info:'出牌阶段,对你使用。你请求所有有手牌的其他角色响应,然后同时与响应的角色拼点。若有角色响应且结果中你赢的次数更多,或若没有角色响应,你摸三张牌。', youdishenru:'诱敌深入', - youdishenru_info:'当以你为目标的【杀】生效前,对此【杀】使用。抵消此【杀】,然后此【杀】的使用者需对你使用【杀】(在此【杀】结算结束之后,若此【杀】未对你造成伤害,其重复此流程),否则受到你造成的1点伤害', + youdishenru_info:'当以你为目标的【杀】生效前,对此【杀】使用。抵消此【杀】,然后此【杀】的使用者需对你使用【杀】(在此【杀】结算结束之后,若此【杀】未对你造成伤害,其重复此流程),否则受到你造成的1点伤害。', suolianjia:'锁链甲', - suolianjia_info:'锁定技,你防止即将受到的属性伤害,当装备时进入连环状态,当卸下时解除连环状态', + suolianjia_info:'锁定技,你防止即将受到的属性伤害,当装备时进入连环状态,当卸下时解除连环状态。', suolianjia_bg:'链', geanguanhuo:'隔岸观火', - geanguanhuo_info:'出牌阶段对一名其他角色使用,令目标与一名你指定的另一名角色拼点,赢的角色获得对方的一张牌;若点数相同,目标可弃置你一张牌(存活角色不超过2时可重铸)', + geanguanhuo_info:'出牌阶段对一名其他角色使用,令目标与一名你指定的另一名角色拼点,赢的角色获得对方的一张牌;若点数相同,目标可弃置你一张牌(存活角色不超过2时可重铸)。', toulianghuanzhu:'偷梁换柱', - toulianghuanzhu_info:'出牌阶段对一名其他角色使用,你观看其手牌,然后可以用一张手牌替牌其中的一张;若两张牌颜色相同,你摸一张牌', + toulianghuanzhu_info:'出牌阶段对一名其他角色使用,你观看其手牌,然后可以用一张手牌替牌其中的一张;若两张牌颜色相同,你摸一张牌。', toulianghuanzhu_bg:'柱', fudichouxin:'釜底抽薪', - fudichouxin_info:'与一名角色进行拼点,若成功则获得双方拼点牌', + fudichouxin_info:'与一名角色进行拼点,若成功则获得双方拼点牌。', shuiyanqijun:'水攻', - shuiyanqijun_info:'令所有有装备的角色各弃置一张装备牌', + shuiyanqijun_info:'令所有有装备的角色各弃置一张装备牌。', wangmeizhike:'望梅止渴', - wangmeizhike_info:'出牌阶段对一名角色使用,若没有角色体力比目标少,目标回复一点体力;若没有角色手牌比目标少,目标摸两张牌(若因此牌回复了体力则改为摸一张)', + wangmeizhike_info:'出牌阶段对一名角色使用,若没有角色体力比目标少,目标回复1点体力;若没有角色手牌比目标少,目标摸两张牌(若因此牌回复了体力则改为摸一张)。', chenhuodajie:'趁火打劫', - chenhuodajie_info:'任意一名其他角色受到伤害时对其使用,获得其一张牌', + chenhuodajie_info:'任意一名其他角色受到伤害时对其使用,获得其一张牌。', huoshan:'火山', huoshan_info:'出牌阶段,对自己使用。若判定结果为红桃2~9,则目标角色受到2点火焰伤害,距离目标1以内的其他角色受到1点火焰伤害。若判定不为红桃2~9,将之移动到下家的判定区里。', hongshui:'洪水', - hongshui_info:'出牌阶段,对自己使用。若判定结果为梅花2~9,该角色随机弃置3张牌,距离该角色为X的角色随机弃置3-X张牌,若没有牌则失去一点体力', + hongshui_info:'出牌阶段,对自己使用。若判定结果为梅花2~9,该角色随机弃置三张牌,距离该角色为X的角色随机弃置3-X张牌,若没有牌则失去1点体力。', }, list:[ ['heart',6,'huoshan','fire'], diff --git a/card/zhenfa.js b/card/zhenfa.js index 3a363ddc2..5443a26be 100644 --- a/card/zhenfa.js +++ b/card/zhenfa.js @@ -365,17 +365,17 @@ game.import('card',function(lib,game,ui,get,ai,_status){ longfeizhen:'龙飞阵', huyizhen:'虎翼阵', niaoxiangzhen:'鸟翔阵', - niaoxiangzhen_info:'令所有非你阵营的队列的角色今次打出一张闪,或者受到一点伤害', - qixingzhen_info:'弃置所有围攻你的角色各一张牌,然后视为对所有你围攻的角色使用一张不计入出杀次数的杀', - // longfeizhen_info:'弃置围攻你的角色各一张牌,然后摸一张牌', - // qixingzhen_info:'令我方所有角色进入围攻状态', - // shepanzhen_info:'令我方所有角色进入队列状态', - // yunchuizhen_info:'令所有围攻角色获得技能【无双】,直到其首次造成伤害', - // fengyangzhen_info:'令所有被围攻角色获得技能【飞影】,直到其首次受到伤害', - dizaizhen_info:'所有小势力角色摸一张牌', - changshezhen_info:'若你处于队列中,与你同一队列的所有角色摸一张牌,否则将与你逆时针距离最近的同势力角色移至你下家', - // pozhenjue_info:'将所有角色的顺序随机重排', - tianfuzhen_info:'所有大势力角色弃置一张牌' + niaoxiangzhen_info:'令所有非你阵营的队列的角色今次打出一张闪,或者受到1点伤害。', + qixingzhen_info:'弃置所有围攻你的角色各一张牌,然后视为对所有你围攻的角色使用一张不计入出杀次数的杀。', + // longfeizhen_info:'弃置围攻你的角色各一张牌,然后摸一张牌。', + // qixingzhen_info:'令我方所有角色进入围攻状态。', + // shepanzhen_info:'令我方所有角色进入队列状态。', + // yunchuizhen_info:'令所有围攻角色获得技能〖无双〗,直到其首次造成伤害。', + // fengyangzhen_info:'令所有被围攻角色获得技能〖飞影〗,直到其首次受到伤害。', + dizaizhen_info:'所有小势力角色摸一张牌。', + changshezhen_info:'若你处于队列中,与你同一队列的所有角色摸一张牌,否则将与你逆时针距离最近的同势力角色移至你下家。', + // pozhenjue_info:'将所有角色的顺序随机重排。', + tianfuzhen_info:'所有大势力角色弃置一张牌。' }, list:[ ["diamond",1,'changshezhen'], diff --git a/character/clan.js b/character/clan.js index 2ba7634dd..61c3cbe2f 100644 --- a/character/clan.js +++ b/character/clan.js @@ -20,17 +20,254 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clan_wanghun:['male','jin',3,['clanfuxun','clanchenya','clanzhongliu'],['clan:太原王氏']], clan_zhonghui:['male','wei','3/4',['clanyuzhi','clanxieshu','clanbaozu'],['clan:颍川钟氏']], clan_zhongyu:['male','wei',3,['clanjiejian','clanhuanghan','clanbaozu'],['clan:颍川钟氏']], + clan_wanglun:['male','wei',3,['clanqiuxin','clanjianyuan','clanzhongliu'],['clan:太原王氏']], + clan_xunyou:['male','wei',3,['clanbaichu','clandaojie'],['clan:颍川荀氏']], }, characterSort:{ clan:{ clan_wu:['clan_wuxian','clan_wuban','clan_wukuang'], - clan_xun:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan'], + clan_xun:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan','clan_xunyou'], clan_han:['clan_hanshao','clan_hanrong'], - clan_wang:['clan_wangling','clan_wangyun','clan_wanghun'], + clan_wang:['clan_wangling','clan_wangyun','clan_wanghun','clan_wanglun'], clan_zhong:['clan_zhongyan','clan_zhonghui','clan_zhongyu'], }, }, skill:{ + //族荀攸 + clanbaichu:{ + derivation:'qice', + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + const storage=player.storage.clanbaichu||{}; + if(Object.values(storage).contains(event.card.name)) return true; + const suit=get.suit(event.card); + if(suit=='none') return false; + if(!player.hasSkill('qice')) return true; + const key=`${suit}+${get.type2(event.card)}`; + return !(key in storage) + }, + forced:true, + content:function(){ + 'step 0' + var storage=player.storage.clanbaichu||{},suit=get.suit(trigger.card); + if(suit!='none'){ + var key=`${suit}+${get.type2(trigger.card)}`; + if(key in storage){ + if(!player.hasSkill('qice')){ + player.addTempSkill('qice','roundStart'); + player.popup('奇策'); + game.log(player,'获得了技能','#g【奇策】'); + } + event.goto(2); + } + else{ + var list=lib.inpile.filter(name=>get.type(name)=='trick'); + list.removeArray(Object.values(storage)); + if(list.length>0){ + var dialog=['百出:选择记录一种普通锦囊牌',[list,'vcard']]; + player.chooseButton(dialog,true).set('ai',function(button){ + var player=_status.event.player,name=button.link[2]; + if(name==_status.event.getTrigger().card.name) return 1919810; + if(name=='wuxie') return 114514; + return get.effect(player,{name:name},player,player)*(1+player.countCards('hs',name)); + }); + } + else event.goto(2); + } + } + else event.goto(2); + 'step 1' + if(result.bool){ + var key=`${get.suit(trigger.card)}+${get.type2(trigger.card)}`,name=result.links[0][2]; + if(!player.storage.clanbaichu) player.storage.clanbaichu={}; + player.storage.clanbaichu[key]=name; + player.markSkill('clanbaichu'); + game.log(player,'记录了','#y'+get.translation(name)); + game.delayx(); + } + 'step 2' + if(Object.values(player.getStorage('clanbaichu')).contains(trigger.card.name)){ + player.chooseDrawRecover(true); + } + }, + intro:{ + markcount:(storage)=>{ + return Object.keys(storage).length; + }, + content:function(storage){ + if(!storage) return '当前暂无记录'; + const keys=Object.keys(storage).map(i=>i.split('+')); + keys.sort((a,b)=>{ + if(a[0]!=b[0]) return lib.suit.indexOf(b[0])-lib.suit.indexOf(a[0]); + return lib.sort.name(a[1],b[1]); + }); + return keys.map(item=>{ + return `
  • ${get.translation(item[0])}+${get.translation(item[1])}:【${get.translation(storage[item.join('+')])}】`; + }).join('
    '); + }, + }, + }, + //族王沦 + clanqiuxin:{ + audio:2, + enable:'phaseUse', + filterTarget:lib.filter.notMe, + usable:1, + content:function(){ + 'step 0' + var str=get.translation(player); + target.chooseControl().set('choiceList',[ + str+'下次对你使用【杀】后,其视为对你使用任意普通锦囊牌', + str+'下次对你使用任意普通锦囊牌后,其视为对你使用【杀】', + ]).set('ai',function(){ + var target=_status.event.player; + var player=_status.event.target; + var num1=get.effect(target,get.autoViewAs({name:'sha'},[]),player,player); + if(!player.canUse(get.autoViewAs({name:'sha'},[]),target)) num1=0; + var num2=0; + for(var name of lib.inpile){ + if(get.type(name)!='trick') continue; + if(!player.canUse(get.autoViewAs({name:name},[]),target)) continue; + if(num2=num2?1:0; + }).set('target',player); + 'step 1' + player.addSkill('clanqiuxin_effect'); + player.markAuto('clanqiuxin_effect',[[target,result.index]]); + }, + ai:{ + order:9, + result:{ + target:function(player,target){ + var cards=player.getCards('hs',card=>{ + if(get.name(card,player)!='sha'&&get.type(card,player)!='trick') return false; + return player.hasValueTarget(card); + }); + if(cards.some(card=>player.canUse(card,target)&&get.effect(target,card,player,player)>0)){ + var att=get.attitude(player,target); + if(att>0) return 9; + if(att<0) return -6; + return 0; + } + else{ + var att=get.attitude(player,target); + if(att<0) return -3; + if(att>0) return 1; + return 2; + } + }, + }, + }, + subSkill:{ + effect:{ + charlotte:true, + onremove:true, + intro:{ + content:function(storage,player){ + var str=''; + for(var i=0;i{ + return player.getStorage('clanqiuxin_effect').some(list=>list[0]==target&&list[1]==0); + }); + if(get.type(event.card)=='trick') return event.targets.some(target=>{ + return player.getStorage('clanqiuxin_effect').some(list=>list[0]==target&&list[1]==1); + }); + return false; + }, + forced:true, + popup:false, + content:function(){ + 'step 0' + var list; + if(trigger.card.name=='sha') list=player.getStorage('clanqiuxin_effect').filter(listx=>trigger.targets.contains(listx[0])&&listx[1]==0); + if(get.type(trigger.card)=='trick') list=player.getStorage('clanqiuxin_effect').filter(listx=>trigger.targets.contains(listx[0])&&listx[1]==1); + player.unmarkAuto('clanqiuxin_effect',list); + var targets=list.map(listx=>listx[0]); + event.targets=targets; + 'step 1' + var target=event.targets.shift(); + event.target=target; + var list=[]; + for(var name of lib.inpile){ + if(trigger.card.name=='sha'&&get.type(name)!='trick') continue; + if(name=='sha'&&get.type(trigger.card.name)!='trick') continue; + if(!player.canUse(get.autoViewAs({name:name},[]),target)) continue; + list.push([get.translation(get.type(name)),'',name]); + if(name=='sha'){ + for(var nature of lib.inpile_nature){ + if(!player.canUse(get.autoViewAs({name:name,nature,nature},[]),target)) continue; + list.push([get.translation(get.type(name)),'',name,nature]); + } + } + } + if(!list.length) event.goto(3); + else{ + player.chooseButton(['求心:视为对'+get.translation(target)+'使用一张牌',[list,'vcard']],true).set('ai',function(button){ + var player=_status.event.player; + var target=_status.event.target; + return get.effect(target,{name:button.link[2],nature:button.link[3]},player,player); + }).set('target',target); + } + 'step 2' + if(result.bool){ + var card={ + name:result.links[0][2], + nature:result.links[0][3], + }; + player.useCard(card,target,false); + } + 'step 3' + if(event.targets.length) event.goto(1); + else if(!player.getStorage('clanqiuxin_effect').length) player.removeSkill('clanqiuxin_effect'); + }, + }, + }, + }, + clanjianyuan:{ + inherit:'clanchenya', + filter:function(event,player){ + for(var phase of lib.phaseName){ + var evt=event.getParent(phase); + if(evt&&evt.name==phase){ + if(event.player.getHistory('useCard',evtx=>evtx.getParent(phase)==evt).length) return lib.skill.clanchenya.filter(event,player); + } + } + return false; + }, + content:function(){ + 'step 0' + var num=0; + for(var phase of lib.phaseName){ + var evt=trigger.getParent(phase); + if(evt&&evt.name==phase){ + num+=trigger.player.getHistory('useCard',evtx=>evtx.getParent(phase)==evt).length; + } + } + trigger.player.chooseCard('是否重铸任意张牌名字数为'+num+'的牌?',[1,Infinity],'he',(card,player)=>_status.event.cards.contains(card)&&player.canRecast(card)).set('ai',card=>{ + var val=get.value(card); + return 6-val; + }).set('cards',trigger.player.getCards('he',card=>{ + return get.cardNameLength(card)==num; + })); + 'step 1' + if(result.bool) trigger.player.recast(result.cards); + }, + }, //族钟毓 clanjiejian:{ audio:2, @@ -188,6 +425,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, //族王浑 clanfuxun:{ + mod:{ + aiOrder:function(player,card,num){ + if(player.isPhaseUsing()&&get.type(card)=='equip'&&get.equipValue(card,player)>0) return num+3; + }, + }, + locked:false, audio:2, enable:'phaseUse', usable:1, @@ -206,6 +449,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!ui.selected.cards.length) return target.countGainableCards(player,'h')>0; return true; }, + check:function(card){ + var player=_status.event.player; + var evtx=_status.event.getParent('phaseUse'); + var targets=game.filterPlayer(target=>target!=player&&lib.skill.clanfuxun.ai.result.target(player,target)!=0); + targets.sort((a,b)=>Math.abs(lib.skill.clanfuxun.ai.result.target(player,b))-Math.abs(lib.skill.clanfuxun.ai.result.target(player,a))); + if(evtx&&targets.length){ + var target=targets[0]; + if(!target.hasHistory('lose',evt=>{ + return evt.getParent(3).name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards2.length; + })&&!target.hasHistory('gain',evt=>{ + return evt.getParent().name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards.length; + })&&Math.abs(player.countCards('h')-target.countCards('h'))==2){ + if(player.countCards('h')>target.countCards('h')) return 1/(get.value(card)||0.5); + return -1; + } + if(card.name=='du') return 20; + return -1; + } + if(card.name=='du') return 20; + return -1; + }, content:function(){ 'step 0' if(cards.length){ @@ -261,9 +525,36 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, ai:{ - order:2, + order:function(item,player){ + var evtx=_status.event.getParent('phaseUse'); + if(game.hasPlayer(current=>{ + if(current==player||!evtx||get.attitude(player,current)==0) return false; + return !current.hasHistory('lose',evt=>{ + return evt.getParent(3).name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards2.length; + })&&!current.hasHistory('gain',evt=>{ + return evt.getParent().name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards.length; + })&&Math.abs(player.countCards('h')-current.countCards('h'))==2; + })) return 10; + return 2; + }, result:{ - target:-1, + target:function(player,target){ + var evtx=_status.event.getParent('phaseUse'); + var num=get.sgn(get.attitude(player,target)); + var targets=game.filterPlayer(current=>{ + if(current==player||!evtx||get.attitude(player,current)==0) return false; + return !current.hasHistory('lose',evt=>{ + return evt.getParent(3).name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards2.length; + })&&!current.hasHistory('gain',evt=>{ + return evt.getParent().name!='clanfuxun'&&evt.getParent('phaseUse')==evtx&&evt.cards.length; + })&&Math.abs(player.countCards('h')-current.countCards('h'))==2; + }); + if(targets.contains(target)){ + if(player.countCards('h')6-get.value(card), + check:function(card){ + var player=_status.event.player; + if(player.hasSkill('clanzhongliu')&&get.position(card)!='h') return 10-get.value(card); + return 5-get.value(card); + }, log:false, precontent:function(){ delete event.result.skill; @@ -848,7 +1143,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, clanzhongliu:{ audio:2, - audioname:['clan_wangling','clan_wangyun','clan_wanghun'], + audioname:['clan_wangling','clan_wangyun','clan_wanghun','clan_wanglun'], trigger:{player:'useCard'}, forced:true, clanSkill:true, @@ -1582,7 +1877,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ names.push(namex); } list.sort((a,b)=>{ - return 100*(lib.inpile.indexOf(a[2])-lib.inpile.indexOf(b[2]))+lib.inpile_nature.indexOf(a[3][0])-lib.inpile_nature.indexOf(b[3][0]); + var del1=lib.inpile.indexOf(a[2])-lib.inpile.indexOf(b[2]); + if(del1!=0) return del1; + var a1=0,a2=0; + if(a.length>3) a1=(lib.nature.get(a)||0); + if(b.length>3) b1=(lib.nature.get(b)||0); + return a1-b1; }) player.chooseButton(['是否将'+get.cnNumber(cards.length)+'张牌当下列一张牌使用?',[list,'vcard']]).set('ai',function(button){ return _status.event.player.getUseValue({name:button.link[2],nature:button.link[3]}); @@ -1893,7 +2193,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else list.push('选项'+get.cnNumber(ind+1,true)); return link; }); - if(!list.length){event.finish(); return;} + if(!list.length){ + game.log(target, "没有能执行的选项"); + event.finish(); + return; + } target.chooseControl(list).set('choiceList',choiceList).set('ai',()=>{ var controls=_status.event.controls.slice(),player=_status.event.player,user=_status.event.getParent().player; if(controls.length==1) return controls[0]; @@ -1963,7 +2267,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, clandaojie:{ audio:2, - audioname:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan'], + audioname:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan','clan_xunyou'], trigger:{player:'useCardAfter'}, filter:function(event,player){ return get.type(event.card,null,false)=='trick'&&!get.tag(event.card,'damage')&&event.cards.filterInD().length>0&&player.getHistory('useCard',evt=>{ @@ -2106,7 +2410,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ str+=('摸'+get.cnNumber(Math.min(8,num2-num1))+'张牌,然后手牌上限-1。'); } str+=('
    ※当前手牌上限:'+num2); - var num3=player.countMark('clanguixiang_count'); + var num3=((_status.event.getParent().phaseIndex||0)+1); if(num3>0){ str+=(';阶段数:'+num3) } @@ -2128,7 +2432,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ order:function(item,player){ - var num=player.getHandcardLimit(),numx=player.countMark('clanguixiang_count'); + var num=player.getHandcardLimit(),numx=((_status.event.getParent().phaseIndex||0)+1); if(num==5&&numx==4&&player.getStat('skill').clanyirong) return 0; if(player.countCards('h')==num+1&&num!=2&&(num<=4||num>4&&numx>4)) return 10; return 0.5; @@ -2139,56 +2443,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, clanguixiang:{ audio:2, - init:function(player){ - player.addSkill('clanguixiang_count'); - }, - onremove:function(player){ - player.removeSkill('clanguixiang_count'); - var event=_status.event.getParent('phase'); - if(event) delete event._clanguixiang; - }, trigger:{ - player:['phaseZhunbeiBefore','phaseJudgeBefore','phaseDrawBefore','phaseDiscardBefore','phaseJieshuBefore'], + player:'phaseChange', }, forced:true, filter:function(event,player){ - var evt=event.getParent('phase'); - if(!evt||!evt._clanguixiang) return false; - var num1=player.getHandcardLimit()-1,num2=player.countMark('clanguixiang_count'); + if(event.phaseList[event.num].startsWith('phaseUse')) return false; + var num1=player.getHandcardLimit()-1,num2=event.num; return num1==num2; }, content:function(){ - trigger.cancel(null,null,'notrigger'); - var next=player.phaseUse(); - event.next.remove(next); - trigger.getParent().next.unshift(next); - }, - subSkill:{ - count:{ - trigger:{ - player:['phaseZhunbeiBegin','phaseJudgeBegin','phaseDrawBegin','phaseDiscardBegin','phaseJieshuBegin','phaseUseBegin'], - }, - forced:true, - popup:false, - lastDo:true, - priority:-Infinity, - content:function(){ - player.addMark('clanguixiang_count',1,false); - }, - group:'clanguixiang_clear', - }, - clear:{ - trigger:{player:'phaseBefore'}, - forced:true, - charlotte:true, - popup:false, - firstDo:true, - priority:Infinity, - content:function(){ - delete player.storage.clanguixiang_count; - trigger._clanguixiang=true; - }, - }, + trigger.phaseList[trigger.num]='phaseUse|clanguixiang'; + game.delayx(); }, }, clanmuyin:{ @@ -2256,7 +2522,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, characterReplace:{ - wuban:['clan_wuban','dc_wuban','wuban'], + wuban:['clan_wuban','dc_wuban','wuban','xin_wuban'], }, characterIntro:{ xunshu:'荀淑(83年~149年),字季和,为郎陵侯相,颍川颍阴人(今河南省许昌市)人。汉和帝至汉桓帝时人物,以品行高洁著称。有子八人,号八龙。年轻时有高尚的德行,学问渊博,不喜欢雕章琢句,徒在文字上用功,不注重实际的学识。因此,常常被俗儒看不起。但州里却称他有知人之明。安帝时,征召任为郎中,后来再升当涂长。离职还乡里。他的孙子荀彧是曹操部下著名的谋士。', @@ -2267,6 +2533,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wukuang:'吴匡(生卒年不详),兖州陈留(今河南开封市)人。东汉末年大臣,大将军何进部将。光熹元年(公元189年),汉灵帝死后,十常侍干预朝政,大将军何进谋诛宦官,但失败被杀,吴匡联合曹操、袁绍等杀尽宦官,攻杀车骑将军何苗。兴平二年(公元195年)十月,李傕、郭汜后悔放汉献帝东归洛阳,于是联合起来追击,曹操遂起兵平乱,但在回朝后,曹操挟天子以令诸侯,实行专权,但遭到吴匡反对。', wanghun:'王浑(223年~297年),字玄冲,太原郡晋阳县(今山西省太原市)人。魏晋时期名臣,曹魏司空王昶的儿子。王浑早年为大将军曹爽的掾吏,高平陵政变后,循例免官,出任怀县县令、散骑侍郎等职,袭封京陵县侯。西晋王朝建立后,加号扬烈将军,历任征虏将军、东中郎将、豫州刺史等职,积极筹划伐吴方略。咸宁五年(279年),配合镇南将军杜预灭亡吴国,迁征东大将军、左仆射、司徒公,晋爵京陵县公。晋惠帝司马衷即位,加任侍中衔。楚王司马玮发动政变,有意寻求支持,遭到严词拒绝。楚王司马玮死后,复任司徒、录尚书事。元康七年(297年),王浑去世,享年七十五岁,谥号为元。《唐会要》尊为“魏晋八君子”之一。', zhongyu:'钟毓(?-263年),字稚叔,颍川长社(今河南长葛市)人。三国时期魏国大臣,太傅钟繇之子、司徒钟会之兄。出身颍川钟氏,机灵敏捷,有其父之遗风。十四岁时,起家散骑侍郎。太和初年,迁黄门侍郎,袭封定陵县侯。正始年间,拜散骑常侍,迁魏郡太守,入为侍中、御史中丞、廷尉 [5] 。随平诸葛诞的淮南叛乱,拜青州刺史、后将军,都督徐州、荆州诸军事。景元四年(263年),去世,追赠车骑将军,谥号为惠,著有文集五卷(见《隋书·经籍志》及《两唐书·经籍志》),传于世。', + wanglun:'王沦(233年-257年)字太冲,出身太原晋阳王姓世族(今山西省太原市),王昶三子,王浑、王深之弟,王湛之兄。醇粹简远,崇尚老庄之学,心思平淡。二十多时被举荐为孝廉,没有前往,后任大将军参军。257年,诸葛诞不满司马氏篡权而在寿春起义,王沦跟随司马昭征讨,遭遇疾疫去世,时年二十五,时人惜之,司马昭为他流泪。其兄著诔文《表德论》,表述其德行,说“因为畏惧帝王的典章制度,不能写墓志铭,于是撰写过往的事迹,刻在墓的背面。”', }, dynamicTranslate:{ clanlianzhu:function(player){ @@ -2298,6 +2565,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clan_wanghun_prefix:'族', clan_zhonghui_prefix:'族', clan_zhongyu_prefix:'族', + clan_wanglun_prefix:'族', + clan_xunyou_prefix:'族', clan_wuxian:'族吴苋', clanyirong:'移荣', @@ -2383,6 +2652,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clanjiejian_info:'当你于一回合使用第X张牌指定第一个目标后,若此牌不为装备牌,则你可以令一名目标角色摸X张牌。(X为此牌牌名字数)', clanhuanghan:'惶汗', clanhuanghan_info:'当你受到牌造成的伤害后,你可以摸X张牌并弃置Y张牌(X为此牌牌名字数,Y为你已损失的体力值),然后若此次技能发动不为你本回合首次发动此技能,你重置技能〖保族〗。', + clan_wanglun:'族王沦', + clanqiuxin:'求心', + clanqiuxin_info:'出牌阶段限一次,你可以令一名其他角色选择一项:①你对其使用【杀】;②你对其使用任意普通锦囊牌。当你执行其选择的选项后,你视为执行另一项。', + clanjianyuan:'简远', + clanjianyuan_info:'当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其本阶段的使用牌数)。', + clan_xunyou:'族荀攸', + clanbaichu:'百出', + clanbaichu_info:'锁定技,当你使用一张牌结算完毕后,若你:未记录过此牌的花色和类型组合,则你记录此组合并记录一个普通锦囊牌名,否则你于本轮获得技能〖奇策〗;已记录此牌牌名,你回复1点体力或摸一张牌。', clan_wu:'陈留·吴氏', clan_xun:'颍川·荀氏', diff --git a/character/collab.js b/character/collab.js index c968ed6a1..d159b30ea 100644 --- a/character/collab.js +++ b/character/collab.js @@ -1156,8 +1156,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ player:function(card,player,target){ - if(ui.selected.targets.length) return; - if(player!=target&&get.type2(card)=='trick') return [1,0,1,-2]; + if(player!==target&&get.type2(card)==='trick'){ + let tars=[target]; + if(ui.selected.targets.length) tars.addArray(ui.selected.targets.filter(i=>i!==player&&i!==target)); + if(tars.length<2) return [1,0,1,-2]; + return [1,0,1,-2/tars.length]; + } }, }, }, @@ -1584,7 +1588,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcsitian_info:'出牌阶段,你可以弃置两张颜色不同的手牌。系统从所有天气中随机选择两个,你观看这些天气并选择一个执行。
  • 烈日:你对其他角色依次造成1点火属性伤害。
  • 雷电:你令其他角色各进行一次判定。若结果为♠2~9,则其受到3点无来源雷属性伤害。
  • 大浪:你弃置其他角色装备区内的所有牌(装备区内没有牌的角色改为失去1点体力)。
  • 暴雨:你弃置一名角色的所有手牌。若其没有手牌,则改为令其失去1点体力。
  • 大雾:你令所有其他角色获得如下效果:当其使用下一张锦囊牌时,取消之。', sunyang:'孙杨', clbshuijian:'水箭', - clbshuijian_info:'摸牌阶段开始时,你可以令额定摸牌数+X(X为你装备区内牌数的一半+1,且向下取整)', + clbshuijian_info:'摸牌阶段开始时,你可以令额定摸牌数+X(X为你装备区内牌数的一半+1,且向下取整)。', yeshiwen:'叶诗文', clbjisu:'急速', clbjisu_info:'判定阶段开始前,你可以跳过本回合的判定阶段和摸牌阶段,视为对一名其他角色使用一张【杀】。', diff --git a/character/ddd.js b/character/ddd.js index 53dbc276e..cb630b754 100644 --- a/character/ddd.js +++ b/character/ddd.js @@ -1637,6 +1637,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, order:10, result:{player:1}, + effect:{ + target:(card,player,target)=>{ + if(card.name==='sha'&&target.getExpansions('ddddongcha_effect').length<2&&lib.skill['dddzhijie'].hiddenCard(target,'shan')) return [1,1,1,-get.sgn(get.attitude(player,_status.currentPhase))]; + } + } }, subSkill:{ draw:{ @@ -3304,14 +3309,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddduanbing:{ enable:'phaseUse', filter:function(event,player){ - return player.canAddJudge('bingliang')&&player.hasCard((card)=>lib.skill['dddduanbing'].filterCard(card,player),'h'); + return player.canAddJudge('bingliang')&&player.hasCard((card)=>lib.skill['dddduanbing'].filterCard(card,player),'he'); }, filterCard:function(card,player){ if(get.color(card)!='black'||get.type2(card)=='trick') return false; return player.canAddJudge(get.autoViewAs({name:'bingliang'},[card])); }, check:function(card){ - return 6-get.value(card); + return 8.2-get.value(card); }, discard:false, lose:false, diff --git a/character/diy.js b/character/diy.js index ceeba6270..21af540ec 100755 --- a/character/diy.js +++ b/character/diy.js @@ -178,7 +178,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ns_chengpu:['male','wu',4,['decadelihuo','decadechunlao']], ns_sundeng:['male','wu',4,['xinkuangbi']], ns_duji:['male','wei',3,['xinfu_andong','xinyingshi']], - old_majun:["male","wei",3,["xinfu_jingxie1","xinfu_qiaosi"],[]], + old_majun:["male","wei",3,["xinfu_jingxie1","xinfu_qiaosi"]], + ns_mengyou:['male','qun',4,['nsmanzhi']], old_jiakui:['male','wei',4,['tongqu','xinwanlan']], ol_guohuai:['male','wei',3,['rejingce']], @@ -219,7 +220,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "ns_chentai","ns_huangwudie","ns_sunyi","ns_zhangning","ns_yanghu"], diy_yijiang3:['ns_ruanji','ns_zanghong','ns_limi','ns_zhonglimu','prp_zhugeliang','key_seira','key_kiyu','key_tomoyo','key_minagi','key_michiru'], diy_tieba:["ns_zuoci","ns_lvzhi","ns_wangyun","ns_nanhua","ns_nanhua_left","ns_nanhua_right","ns_huamulan","ns_huangzu","ns_jinke","ns_yanliang","ns_wenchou","ns_caocao","ns_caocaosp","ns_zhugeliang","ns_wangyue","ns_yuji","ns_xinxianying","ns_guanlu","ns_simazhao","ns_sunjian","ns_duangui","ns_zhangbao","ns_masu","ns_zhangxiu","ns_lvmeng","ns_shenpei","ns_yujisp","ns_yangyi","ns_liuzhang","ns_xinnanhua","ns_luyusheng"], - diy_fakenews:["diy_wenyang","ns_zhangwei","ns_caimao","ns_chengpu",'ns_sundeng','ns_duji'], + diy_fakenews:["diy_wenyang","ns_zhangwei","ns_caimao","ns_chengpu",'ns_sundeng','ns_duji','ns_mengyou'], diy_xushi:["diy_feishi","diy_hanlong","diy_liufu","diy_liuyan","diy_liuzan","diy_tianyu","diy_xizhenxihong","diy_yangyi","diy_zaozhirenjun"], diy_default:["diy_yuji","diy_caiwenji","diy_lukang","diy_zhenji","old_majun"], diy_noname:['noname'], @@ -373,6 +374,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ns_zhangxiu:'#p本因坊神策', ns_yangyi:'#p本因坊神策', ns_liuzhang:'#r矮子剑薄荷糖', + ns_mengyou:'#g残昼厄夜', }, card:{ kano_paibingbuzhen:{ @@ -678,7 +680,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(evt.gaintag_map[i].includes('fuuko_chuanyuan')) return true; } }); - return false; + //return false; }, content:function(){ trigger.addCount=false; @@ -2599,7 +2601,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else game.delayx(); 'step 3' - player.addTempSkill('nstuilun_effect',{player:'phaseBegin'}); + player.addTempSkill('nstuilun_effect',{player:'phaseBeginStart'}); }, subSkill:{ effect:{ @@ -2874,7 +2876,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ prompt2:'你可失去1点体力或弃置一张牌,展示牌堆顶的三张牌(若你的体力值小于体力上限的50%,则改为展示五张牌)。每有一张基本牌,其所需使用的【闪】的数量便+1。然后若此牌造成过伤害,则你获得展示牌中的所有非基本牌。', content:function(){ 'step 0' - player.chooseToDiscard('弃置一张牌,或点「取消」失去一点体力','he').set('goon',(player.hp>player.maxHp/2)).set('ai',function(card){ + player.chooseToDiscard('弃置一张牌,或点「取消」失去1点体力','he').set('goon',(player.hp>player.maxHp/2)).set('ai',function(card){ var val=get.value(card); if(_status.event.goon) return 0.1-val; return 6-val; @@ -3560,7 +3562,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.countCards('h')>0) player.chooseToDiscard('h',true,player.countCards('h')); player.recover(); trigger.cancel(); - player.addTempSkill('kyou_duanfa_draw',{player:'phaseBegin'}); + player.addTempSkill('kyou_duanfa_draw',{player:'phaseBeginStart'}); }, subSkill:{ draw:{ @@ -3608,9 +3610,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseControl().set('choiceList',[ '视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌', '移动场上的一张牌', - '增加一点体力上限并失去1点体力', + '增加1点体力上限并失去1点体力', '本回合内下一次造成的伤害+1', - '本回合内下一次回复体力时,额外回复一点体力', + '本回合内下一次回复体力时,额外回复1点体力', '本回合内手牌上限和【杀】的使用次数+1                         ', ]).set('ai',function(){ var player=_status.event.player; @@ -4481,37 +4483,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(list.length>=result.score) list=list.randomGets(result.score); else list.addArray(list2.randomGets(result.score-list.length)); list.sort(); - event.videoId=lib.status.videoId++; - var func=function(id,list){ - var choiceList=ui.create.dialog('控物:请选择一项','forcebutton'); - choiceList.videoId=id; - for(var ii=0;ii{ + return [i,lib.skill.yukito_kongwu.moves[i].prompt]; + }),'textbutton'], + ]); next.set('forced',true); next.set('filterButton',function(button){ return lib.skill.yukito_kongwu.moves[button.link].filter(_status.event.player); @@ -4521,10 +4498,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return Math.random(); }); "step 2" - if(player.isOnline2()){ - player.send('closeDialog',event.videoId); - } - event.dialog.close(); var num=result.links[0]; switch(num){ case 0:event.goto(3);break; @@ -4942,35 +4915,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, chooseButton:{ dialog:function(event,player){ - var dialog=ui.create.dialog('游凤','hidden'); + const dialog=ui.create.dialog('游凤','hidden'); + const equips=[]; if(player.storage.chihaya_youfeng){ - var table=document.createElement('div'); - table.classList.add('add-setting'); - table.style.margin='0'; - table.style.width='100%'; - table.style.position='relative'; - for(var i=1;i<6;i++){ + for(let i=1;i<6;i++){ if(!player.hasEnabledSlot(i)) continue; - var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode'); - td.innerHTML=''+get.translation('equip'+i)+''; - td.link=i; - td.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.button); - for(var j in lib.element.button){ - td[j]=lib.element.button[i]; - } - table.appendChild(td); - dialog.buttons.add(td); + equips.push([i,get.translation('equip'+i)]); } - dialog.content.appendChild(table); + if(equips.length>0) dialog.add([equips,'tdnodes']) } - var type=player.storage.chihaya_youfeng?'basic':'trick'; - var list=[]; - for(var name of lib.inpile){ + const type=player.storage.chihaya_youfeng?'basic':'trick'; + const list=[]; + for(const name of lib.inpile){ if(get.type(name)!=type) continue; if(event.filterCard({name:name,isCard:true},player,event)){ list.push([type,'',name]); if(name=='sha'){ - for(var j of lib.inpile_nature) list.push([type,'',name,j]); + for(let j of lib.inpile_nature) list.push([type,'',name,j]); } } } @@ -5073,7 +5034,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, prompt:function(links,player){ - if(links.length==1) return '增加一点体力上限,视为使用'+(get.translation(links[0][3])||'')+get.translation(links[0][2]); + if(links.length==1) return '增加1点体力上限,视为使用'+(get.translation(links[0][3])||'')+get.translation(links[0][2]); if(typeof links[1]=='number') links.reverse(); var equip='equip'+links[0]; var name=links[1][2]; @@ -6370,9 +6331,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=game.roundNumber; if(num&&typeof num=='number') player.draw(Math.min(3,num)); 'step 1' - var next=player.phaseUse(); - event.next.remove(next); - trigger.next.push(next); + trigger.phaseList.splice(trigger.num,0,'phaseUse|godan_yuanyi'); }, }, godan_feiqu:{ @@ -10512,7 +10471,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ var name=get.translation(trigger.player); player.chooseControl().set('choiceList',[ - '对'+name+'造成一点火属性伤害', + '对'+name+'造成1点火属性伤害', '令'+name+'此出牌阶段的额定摸牌数改为0' ]); } @@ -11660,7 +11619,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=result.targets[0]; event.target=target; player.logSkill('nsweiyuan',target); - target.chooseCard('he','交给'+get.translation(trigger.target)+'一张牌并受到一点伤害,或令'+get.translation(player)+'摸一张牌且可以重复使用牌').set('ai',function(card){ + target.chooseCard('he','交给'+get.translation(trigger.target)+'一张牌并受到1点伤害,或令'+get.translation(player)+'摸一张牌且可以重复使用牌').set('ai',function(card){ if(_status.event.goon) return Math.random(); return 0; }).set('goon',function(){ @@ -15827,21 +15786,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var maxleft=0; if(left&&player.hasSkill(left)){ if(player.storage[left].hp0){ return 7-get.value(card); } @@ -16810,7 +16769,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.isAlive()){ player.draw(); if(player.canUse('sha',target,false)&&player.hasSha()){ - player.chooseToUse({name:'sha'},target,-1,'对'+get.translation(target)+'使用一张杀,或失去一点体力'); + player.chooseToUse({name:'sha'},target,-1,'对'+get.translation(target)+'使用一张杀,或失去1点体力'); } else{ player.loseHp(); @@ -17953,6 +17912,96 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + nsmanzhi:{ + audio:'dcmanzhi', + trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, + direct:true, + filter:function(event,player){ + var nums=[]; + game.countPlayer(current=>{ + nums.add(current.hp); + nums.add(current.maxHp); + nums.add(current.countCards('h')); + nums.add(current.countCards('e')); + nums.add(current.countCards('j')); + }); + for(var a of nums){ + for(var b of nums){ + if((0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer()) return true; + } + } + return false; + }, + content:function(){ + 'step 0' + var nums=[]; + game.countPlayer(current=>{ + nums.add(current.hp); + nums.add(current.maxHp); + nums.add(current.countCards('h')); + nums.add(current.countCards('e')); + nums.add(current.countCards('j')); + }); + nums.sort((a,b)=>a-b); + var a=null,b=null,goon=false; + for(a of nums){ + for(b of nums){ + if((0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer()){ + goon=true; + break; + } + } + if(goon) break; + } + player.chooseButton(2,[ + '蛮智:请选择让下列等式成立的A与B的值', + '
    目标等式
    ', + `0.5 × A² + 2.5 × B - ${game.roundNumber} = ${game.countPlayer()}`, + '
    A的可选值
    ', + [nums.map(i=>{ + return [ + `A|${i}`, + i==a?(`${i}`):i, + ] + }),'tdnodes'], + '
    B的可选值
    ', + [nums.map(i=>{ + return [ + `B|${i}`, + i==b?(`${i}`):i, + ] + }),'tdnodes'], + ]).set('filterButton',function(button){ + if(!ui.selected.buttons.length) return true; + return button.link[0]!=ui.selected.buttons[0].link[0]; + }).set('filterOk',function(){ + if(ui.selected.buttons.length!=2) return false; + var a,b; + for(var i of ui.selected.buttons){ + if(i.link[0]=='A') a=parseInt(i.link.slice(2)); + else b=parseInt(i.link.slice(2)); + } + return (0.5*a*a)+(2.5*b)-game.roundNumber==game.countPlayer(); + }).set('choice',[a,b]).set('ai',(button)=>{ + var choice=_status.event.choice; + if(button.link==`A|${choice[0]}`||button.link==`B|${choice[1]}`) return 1; + return 0; + }); + 'step 1' + if(result.bool){ + var a,b; + for(var i of result.links){ + if(i[0]=='A') a=parseInt(i.slice(2)); + else b=parseInt(i.slice(2)); + } + equals=`0.5×${a}²+2.5×${b}-${game.roundNumber}=${game.countPlayer()}`; + player.logSkill('nsmanzhi'); + player.chat(equals); + game.log(player,'的计算结果为',equals); + player.draw(game.countPlayer()); + } + }, + }, }, dynamicTranslate:{ nsjiquan:function(player){ @@ -18208,7 +18257,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ iwasawa_fenyin_info:'你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。', iwasawa_refenyin:'奋音', iwasawa_refenyin_info:'锁定技,你的回合内,当一张牌进入弃牌堆后,若本回合内没有过与此牌花色相同的卡牌进入过弃牌堆,则你摸一张牌。', - //卡牌花色的计算不受【红颜】等技能的影响 + //卡牌花色的计算不受〖红颜〗等技能的影响 kengo_weishang:'伪伤', kengo_weishang_sha:'伪伤', kengo_weishang_shan:'伪伤', @@ -18223,7 +18272,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yui_lieyin_info:'锁定技,出牌阶段开始时,你选择一项:①本阶段内的红色牌均视为【杀】;②本阶段内的【杀】均视为【决斗】。', yui_takaramono:'珍宝', yui_takaramono_info:'觉醒技,准备阶段,若你满足以下条件中的至少两个:①体力值不大于1;②场上有已死亡的角色;③已因〖激昂〗累计获得过至少三张牌;则你获得技能〖引吭〗,将〖烈音〗描述中的「你选择」改为「你可选择」,然后加1点体力上限并回复1点体力。', - //ユイ/孙笨双将组合时,孙笨的【激昂】不计入【珍宝】的次数统计 + //ユイ/孙笨双将组合时,孙笨的〖激昂〗不计入〖珍宝〗的次数统计 yui_yinhang:'引吭', yui_yinhang_info:'锁定技,当你的体力值变化1点时,你可以令至多两名角色摸一张牌。', tsumugi_mugyu:'姆啾', @@ -18236,7 +18285,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kanata_shuangche:'双掣', haruka_shuangche_backup:'双掣', haruka_shuangche_info:'出牌阶段,你可以视为使用任意基本牌或普通锦囊牌。此牌结算完成后,你选择一项:1.弃置X张牌。2.失去1点体力且本回合内不能再发动〖双掣〗。(X为你于此回合内发动过〖双掣〗的次数)', - //你不能以此法使用【回魂】 + //你不能以此法使用〖回魂〗 saya_shouji:'授计', saya_shouji_info:'每回合限一次,当你使用的牌结算完成后,你可以将此牌对应的所有实体牌交给一名其他角色。其可以使用这些牌中的一张,若如此做,你摸一张牌。', saya_powei:'破围', @@ -18256,9 +18305,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shiina_qingshen:'轻身', shiina_qingshen_info:'当你受到或造成伤害后,你可以获得此次伤害的渠道对应的实体牌,然后将等量的牌置于你的武将牌上,称为「轻」。锁定技,你的手牌上限和攻击范围+X(X为「轻」数)。', shiina_feiyan:'飞燕', - shiina_feiyan_info:'一名其他角色的回合开始时,若其在你的攻击范围内,则你可以将一张「轻」置于弃牌堆,然后视为对其使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。你于此【杀】的结算流程中视为拥有技能【铁骑】。', + shiina_feiyan_info:'一名其他角色的回合开始时,若其在你的攻击范围内,则你可以将一张「轻」置于弃牌堆,然后视为对其使用一张【杀】。若此【杀】未造成伤害,你摸一张牌。你于此【杀】的结算流程中视为拥有技能〖铁骑〗。', shiina_retieji:'铁骑', - //你不能对稻荷和多鲁基发动【飞燕】 + //你不能对稻荷和多鲁基发动〖飞燕〗 sunohara_chengshuang:'成双', sunohara_chengshuang_phase:'成双', sunohara_chengshuang_info:'锁定技,游戏开始时,你选择你的性别。回合开始时,你可以切换你的性别。', @@ -18605,7 +18654,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kotarou_rewrite_recover:'改写', kotarou_rewrite_sha:'改写', kotarou_rewrite_block:'改写', - kotarou_rewrite_info:'出牌阶段,你可选择:①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌;②移动场上的一张牌;③增加一点体力上限并失去1点体力(体力上限至多为5);④下一次造成的伤害+1;⑤下一次回复的体力值+1;⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次,则你令此技能失效,且于回合结束后将体力上限降至3点,失去〖丝刃〗和〖改写〗。', + kotarou_rewrite_info:'出牌阶段,你可选择:①视为使用一张本局游戏没有以此法使用过的基本牌或普通锦囊牌;②移动场上的一张牌;③增加1点体力上限并失去1点体力(体力上限至多为5);④下一次造成的伤害+1;⑤下一次回复的体力值+1;⑥本回合内的手牌上限和使用【杀】的使用次数+1。若你于本回合内发动过〖改写〗的次数超过两次,则你令此技能失效,且于回合结束后将体力上限降至3点,失去〖丝刃〗和〖改写〗。', key_kyou:'藤林杏', kyou_zhidian:'掷典', kyou_zhidian_info:'你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。', @@ -18671,7 +18720,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nsfuwei:'附位', nsfuwei_info:'觉醒技,结束阶段开始时,若“威”数大于4,则你加2点体力上限,获得〖喋谋〗和〖制皇〗,并将〖集权〗改为锁定技。', nsdiemou:'喋谋', - nsdiemou_info:'锁定技,出牌阶段开始时,若“威”大于全场角色数,你移去所有“威”,减一点体力上限并摸X张牌。若X大于4,你翻面。(X为移去的“威”数)', + nsdiemou_info:'锁定技,出牌阶段开始时,若“威”大于全场角色数,你移去所有“威”,减1点体力上限并摸X张牌。若X大于4,你翻面。(X为移去的“威”数)', nszhihuang:'制皇', nszhihuang_damage:'制皇', nszhihuang_info:'每回合限一次,当主公使用牌时,你可以移去一张“威”,然后获得此牌。锁定技,若你的手牌数大于主公,则你使用牌造成的伤害+1。', @@ -18679,7 +18728,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nsweiyuan:'围援', nsweiyuan_use:'围援', nsweiyuan_use_backup:'围援', - nsweiyuan_info:'出牌阶段限一次,当你使用牌指定其他角色A为唯一目标后,你可以令一名除该角色外的其他角色B选择一项:①交给A一张牌:然后你对B造成一点伤害;②你摸一张牌,且可以将一张手牌当做本回合使用过的一张基本牌/普通锦囊牌使用(无次数距离限制)。', + nsweiyuan_info:'出牌阶段限一次,当你使用牌指定其他角色A为唯一目标后,你可以令一名除该角色外的其他角色B选择一项:①交给A一张牌:然后你对B造成1点伤害;②你摸一张牌,且可以将一张手牌当做本回合使用过的一张基本牌/普通锦囊牌使用(无次数距离限制)。', nsjuxian:'据险', nsjuxian2:'据险', nsjuxian_info:'当你受到伤害时,你可以摸两张并跳过下一个摸牌阶段,且在此之前不能再次发动〖据险〗。然后若你的手牌数不小于体力上限,则伤害来源弃置一张牌。', @@ -18699,21 +18748,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nsfuzhou_card:'符咒', nsfuzhou_card_info:'此牌不可被【无懈可击】响应。若判定结果为:黑色,你受到使用者造成的1点雷属性伤害且弃置一张牌;红色,使用者摸两张牌,且你本回合的手牌上限-1。', nsfuzhou_num:'符咒', - nsfuzhou_info:'出牌阶段限一次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到一点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限减1。', + nsfuzhou_info:'出牌阶段限一次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限减1。', nsguidao:'鬼道', nsguidao_info:'一名角色的判定牌生效前,你可以打出一张黑色牌替换之。', nstaiping:'太平', nstaiping_info:'觉醒技。准备阶段,若你:已因〖符咒〗造成了两次或更多的伤害,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·邪〗;若你已因〖符咒〗摸了两次或更多的牌,则你将〖鬼道〗中的“黑色牌”修改为“牌”,将〖符咒〗修改为〖符咒·正〗。', nsfuzhou_damage:'符咒·邪', - nsfuzhou_damage_info:'出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到一点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限-1。', + nsfuzhou_damage_info:'出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,且该角色本回合手牌上限-1。', nsfuzhou_draw:'符咒·正', - nsfuzhou_draw_info:'出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到一点雷属性伤害并弃置一张牌;红色,你摸两张牌,该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。', + nsfuzhou_draw_info:'出牌阶段限两次。你可以将一张黑色牌置于一名角色的判定区内,称为“符”。其于判定阶段进行“符”判定,若判定结果为:黑色,其受到1点雷属性伤害并弃置一张牌;红色,你摸两张牌,该角色回复1点体力并摸一张牌,且本回合的手牌上限+1。', ns_yanghu:'羊祜', nsbizhao:'避召', nsbizhao2:'避召', nsbizhao_info:'隐匿技,锁定技,当你于回合外明置此武将牌后,其他角色计算与你的距离+1直至你的回合开始。', nsqingde:'清德', - nsqingde_info:'每回合限一次,当你使用【杀】或普通锦囊牌对其他角色造成伤害后,你可使用该牌与受到伤害的角色拼点。你可令输的角色摸两张牌;当你受到其他角色使用【杀】或普通锦囊牌造成的伤害后,可使用该牌与伤害来源拼点。你可令赢的角色回复一点体力。', + nsqingde_info:'每回合限一次,当你使用【杀】或普通锦囊牌对其他角色造成伤害后,你可使用该牌与受到伤害的角色拼点。你可令输的角色摸两张牌;当你受到其他角色使用【杀】或普通锦囊牌造成的伤害后,可使用该牌与伤害来源拼点。你可令赢的角色回复1点体力。', nsyidi:'遗敌', nsyidi_info:'出牌阶段限一次,你可展示一张手牌,然后将其交给一名其他角色。若为基本牌,该角色可使用此牌;若不为基本牌,你摸一张牌。', @@ -18733,25 +18782,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nsxuezhu:'血逐', nsxuezhu_info:'当你受到伤害或造成伤害后,你可以令受到伤害的角色摸两张牌并翻面。', ns_chuanshu:'传术', - ns_chuanshu_info:'限定技 当一名其他角色进入濒死状态时,你可以令其选择获得技能【雷击】或【鬼道】,其回复体力至1并摸两张牌。当该被【传术】的角色造成或受到一次伤害后,你摸一张牌。其阵亡后,你重置技能【传术】', + ns_chuanshu_info:'限定技 当一名其他角色进入濒死状态时,你可以令其选择获得技能〖雷击〗或〖鬼道〗,其回复体力至1并摸两张牌。当该被【传术】的角色造成或受到一次伤害后,你摸一张牌。其阵亡后,你重置技能〖传术〗。', ns_xiandao1:'仙道', - ns_xiandao1_info:'锁定技 游戏开始和回合结束阶段,你随机获得技能【雷击】或【鬼道】,直到下个出牌阶段开始', + ns_xiandao1_info:'锁定技 游戏开始和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段开始。', ns_xiandao2:'仙道', - ns_xiandao2_info:'锁定技 你防止受到任何属性伤害', + ns_xiandao2_info:'锁定技 你防止受到任何属性伤害。', ns_xiandao:'仙道', - ns_xiandao_info:'锁定技 游戏开始、你进入游戏时和回合结束阶段,你随机获得技能【雷击】或【鬼道】,直到下个出牌阶段阶段开始。你防止受到任何属性伤害', + ns_xiandao_info:'锁定技 游戏开始、你进入游戏时和回合结束阶段,你随机获得技能〖雷击〗或〖鬼道〗,直到下个出牌阶段阶段开始。你防止受到任何属性伤害。', ns_chuanshu2:'术', - ns_chuanshu2_info:'锁定技 当你造成或受到一次伤害后,南华老仙摸一张牌', + ns_chuanshu2_info:'锁定技 当你造成或受到一次伤害后,南华老仙摸一张牌。', ns_chuanshu3:'术', - ns_chuanshu3_info:'锁定技 当你【传术】的角色阵亡后,你重置技能【传术】', + ns_chuanshu3_info:'锁定技 当你【传术】的角色阵亡后,你重置技能〖传术〗。', ns_xiuzheng:'修真', - ns_xiuzheng_info:'出牌阶段限一次,你可选择一名其他角色,然后展示牌堆顶的两张牌,若同为红色,则其受到一点火焰伤害;若同为黑色,其受到一点雷电伤害;若颜色不相同,你弃置其一张牌。然后你获得这两张展示的牌后再弃置两张牌', + ns_xiuzheng_info:'出牌阶段限一次,你可选择一名其他角色,然后展示牌堆顶的两张牌,若同为红色,则其受到1点火焰伤害;若同为黑色,其受到1点雷电伤害;若颜色不相同,你弃置其一张牌。然后你获得这两张展示的牌后再弃置两张牌。', nsanruo:'暗弱', - nsanruo_info:'锁定技,你手牌中的【杀】和普通锦囊牌(借刀杀人等带有指向目标的锦囊除外)均对你不可见。但你可以正常使用之', + nsanruo_info:'锁定技,你手牌中的【杀】和普通锦囊牌(借刀杀人等带有指向目标的锦囊除外)均对你不可见。但你可以正常使用之。', nsxunshan:'循善', - nsxunshan_info:'锁定技,你使用【暗弱】牌可以为其指定任意名合法目标(托管无效)', + nsxunshan_info:'锁定技,你使用【暗弱】牌可以为其指定任意名合法目标(托管无效)。', nskaicheng:'开城', - nskaicheng_info:'主公技,你的回合内,你可以将一张【暗弱】牌交给一名群势力其他角色观看,其可以选择是否告诉你此牌的名字。然后你选择一项:使用这张牌并摸一张牌;或结束此回合', + nskaicheng_info:'主公技,你的回合内,你可以将一张【暗弱】牌交给一名群势力其他角色观看,其可以选择是否告诉你此牌的名字。然后你选择一项:使用这张牌并摸一张牌;或结束此回合。', nsjuanli:'狷戾', nsjuanli_info:'出牌阶段限一次,你可以和一名有手牌的其他角色进行赌牌,若你赢,目标角色失去1点体力且该角色与你距离-1直到与你下次赌牌,若你没赢,目标角色回复1点体力,且该角色与你距离+1直到与你的下次赌牌。(赌牌:赌牌的两名角色分别亮开一张手牌,若花色相同则赌牌平局,若花色不同,则依次展示牌堆顶的牌直到翻开的牌与其中一人亮出牌的花色相同,则该角色获得赌牌的胜利)', nsyuanchou:'远筹', @@ -18769,7 +18818,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nstanbing:'谈兵', nstanbing_info:'摸牌阶段开始时,你可弃置一张手牌,然后摸X张牌(X为你弃置牌的名称字数),若如此做,本回合你不可使用或打出【杀】', nsxinzhan:'心战', - nsxinzhan_info:'出牌阶段限一次,你可将任意张手牌交给一名其他角色,若如此做,该角色失去X点体力(X为你交给其的牌张数的一半,向下取整),若你给的牌达到六张,则改为该角色失去一点体力上限', + nsxinzhan_info:'出牌阶段限一次,你可将任意张手牌交给一名其他角色,若如此做,该角色失去X点体力(X为你交给其的牌张数的一半,向下取整),若你给的牌达到六张,则改为该角色失去1点体力上限', nsfuhuo:'符火', nsfuhuo2:'符火', nsfuhuo_info:'出牌阶段限一次,你可将一张手牌置于一名武将牌上没有“符”的角色的武将牌上,称为“符”,若如此做,其回合外使用或打出【闪】时,你可令其判定,若结果为:红桃,你对其造成2点火焰伤害;方块,你弃置其一张手牌,然后对其造成1点火焰伤害。你的下个回合开始时,你获得其武将牌上的“符”', @@ -18780,9 +18829,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nscuanquan:'篡权', nscuanquan_info:'锁定技,如果你的身份为忠臣,则在受伤三次后与主公,互换身份和体力上限', nsjianning:'奸佞', - nsjianning_info:'出牌阶段限一次,如果你的身份为内奸,你可以与一名手牌数比你少的角色交换手牌,并对其造成一点伤害', + nsjianning_info:'出牌阶段限一次,如果你的身份为内奸,你可以与一名手牌数比你少的角色交换手牌,并对其造成1点伤害', nschangshi:'常仕', - nschangshi_info:'出牌阶段限一次,如果你的身份为反贼,你可以指定两名其他角色互换体力;如果两名角色体力之差等于1,你失去一点体力', + nschangshi_info:'出牌阶段限一次,如果你的身份为反贼,你可以指定两名其他角色互换体力;如果两名角色体力之差等于1,你失去1点体力', nsbaquan:'霸权', nsbaquan_info:'回合结束时,你可以弃置所有手牌,并获得相应点数的护甲,你的新一回合开始时清除所有护甲', nsbugua:'卜卦', @@ -18791,13 +18840,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nstuiyan:'推演', nstuiyan_info:'出牌阶段,若你使用的牌点数比上一张使用的牌点数大,你可以摸一张牌,反之你本回合不能再以此法摸牌;当你使用的牌点数首次达到8的倍数时,你可以在结算后立即发动一次【卜卦】', nstianji:'天机', - nstianji_info:'限定技,当一名其他角色进入濒死状态,你可自减一点体力上限,令其回复体力至1并增加一点体力上限', + nstianji_info:'限定技,当一名其他角色进入濒死状态,你可自减1点体力上限,令其回复体力至1并增加1点体力上限', nszhaoxin:'昭心', nszhaoxin_info:'锁定技,你始终展示手牌', nsxiuxin:'修穆', nsxiuxin_info:'锁定技,若你没有某种花色的手牌,你不能成为这种花色的牌的目标', nsshijun:'弑君', - nsshijun_info:'锁定技,你造成伤害时,你令此伤害+1,并在结算后失去一点体力', + nsshijun_info:'锁定技,你造成伤害时,你令此伤害+1,并在结算后失去1点体力', nshunyou:'魂佑', nshunyou_info:'出阶段限一次,你可以弃置一张基本牌,获得弃牌堆底的一张装备牌和一张锦囊牌,然后你可以将那张装备牌装备给一名角色(允许替换)。如果弃牌堆没有装备以及锦囊牌,则改为摸X张牌,X为损失的体力加一(最多3张)', nswulie:'武烈', @@ -18818,13 +18867,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nsyaowang:'妖妄', nsyaowang_info:'回合开始阶段你可以选择一名角色然后获得其其中一项技能直到回合结束,然后该角色随机获得一项未上场武将的其中一项技能直到其回合结束', nshuanhuo:'幻惑', - nshuanhuo_info:'每当你流失一点体力或受到一次大于2的伤害时,你可以交换除你之外的两名角色的武将牌(体力及体力上限不变)', + nshuanhuo_info:'每当你失去1点体力或受到一次大于2的伤害时,你可以交换除你之外的两名角色的武将牌(体力及体力上限不变)', nsjianshu:'剑术', nsjianshu_info:'锁定技:每当你的装备区有武器时,你使用【杀】指定一个目标后,该角色需要依次使用两张【闪】才能抵消此【杀】', nscangjian:'藏剑', nscangjian_info:'每当你对一名角色造成伤害,你可以获得其装备区一张牌', nsyunxing:'陨星', - nsyunxing_info:'锁定技,当场上一名角色死亡,若为蜀,你失去一点体力;若为吴,你回复一点体力;若为魏,你摸一张牌并弃置一名角色的手牌;若为群,你强制结束当前回合;若为你,你可以使一名角色翻面', + nsyunxing_info:'锁定技,当场上一名角色死亡,若为蜀,你失去1点体力;若为吴,你回复1点体力;若为魏,你摸一张牌并弃置一名角色的手牌;若为群,你强制结束当前回合;若为你,你可以使一名角色翻面', nsguanxing:'观星', nsguanxing_info:'锁定技,准备阶段,你观看牌堆的X张牌(X为场上存活人数)并且任意移动Y张牌(Y为你当前体力值)', nscaiyi:'猜疑', @@ -18834,9 +18883,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nshaoling:'号令', nshaoling_info:'限定技,出牌阶段,你可以指定一名其他角色,令另外所有其他角色角色选择一项:1、对该角色使用一张【杀】;2、交给你一张牌,然后视为你对其使用一张【杀】', nspinmin:'拼命', - nspinmin_info:'锁定技,当你于回合内死亡时,你不死亡并增加一点体力上限(每回合最多增加1点且不能超过4);当你于回合外死亡时,你不死亡并减少一点体力上限(体力上限为0会导致你死亡)', + nspinmin_info:'锁定技,当你于回合内死亡时,你不死亡并增加1点体力上限(每回合最多增加1点且不能超过4);当你于回合外死亡时,你不死亡并减少1点体力上限(体力上限为0会导致你死亡)', nsshishou:'失手', - nsshishou_info:'锁定技,当你于回合内失去手牌时,你失去一点体力并摸一张牌;你回合内使用的牌数不能超过4', + nsshishou_info:'锁定技,当你于回合内失去手牌时,你失去1点体力并摸一张牌;你回合内使用的牌数不能超过4', nsduijue:'对决', nsduijue_info:'出牌阶段开始时,你可以弃置一张手牌,若如此做,此阶段你可以将一张与此牌颜色不同的手牌当作[决斗]使用(限2次)', nsshuangxiong:'双雄', @@ -18853,7 +18902,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nshuanxian:'幻仙', nshuanxian_info:'锁定技,游戏开始时,你获得随从“幻身·右”,当你首次受到伤害时,你获得随从“幻身·左”(体力上限2,初始手牌2);你与幻身在摸牌阶段均少摸一张牌;在你的回合中(如果有对应幻身),你以【幻身·左-本体-幻身·右】的顺序进行3个连续回合', nstaiping_nh:'太平', - nstaiping_nh_info:'当你受到一点伤害后(首次伤害除外),你可以选择一项: ①令一个“幻身”增加一点体力上限。②令一个“幻身”回复一点体力。', + nstaiping_nh_info:'当你受到1点伤害后(首次伤害除外),你可以选择一项: ①令一个“幻身”增加1点体力上限。②令一个“幻身”回复1点体力。', nsshoudao:'授道', nsshoudao_info:'当左右“幻身”全部死亡时,你获得技能“雷击”和“鬼道”。当你死亡时,若此时有两个“幻身”,你可以令一名其他角色获得技能“雷击”和“鬼道”。若有一个“幻身”,你可以令一名其他角色获得技能“雷击”或“鬼道”。(杀死你的角色除外)', nsnongquan:'弄权', @@ -18863,9 +18912,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yiesheng:'回雪', yiesheng_info:'出牌阶段,你可以弃置任意数量的黑色手牌,然后摸等量的牌。', liangji:'环计', - liangji_info:'出牌阶段限一次,你可以选择一名未以此法放置牌的其他角色并将一张手牌置于其武将牌上。目标角色于摸牌阶段开始时,获得此牌。若其为男性角色,则获得技能【无双】,若其为女性角色,则获得技能【离间】,直到回合结束。', + liangji_info:'出牌阶段限一次,你可以选择一名未以此法放置牌的其他角色并将一张手牌置于其武将牌上。目标角色于摸牌阶段开始时,获得此牌。若其为男性角色,则获得技能〖无双〗,若其为女性角色,则获得技能〖离间〗,直到回合结束。', chengmou:'逞谋', - chengmou_info:'摸牌阶段开始时,若你有“功”牌,你获得之并跳过摸牌阶段,若你所获得的“功”牌多于两张,你须失去一点体力。', + chengmou_info:'摸牌阶段开始时,若你有“功”牌,你获得之并跳过摸牌阶段,若你所获得的“功”牌多于两张,你须失去1点体力。', jugong:'居功', jugong_info:'回合外每名角色的回合限一次,每当场上有角色因受到【杀】或【决斗】造成的伤害,你可以摸一张牌并且将一张手牌置于你的武将牌上,称之为“功”。在你即将受到伤害时,你可以弃置两张“功”,防止此伤害。', nsxinsheng:'新生', @@ -18930,18 +18979,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zaiqix_info:'摸牌阶段,若你已受伤,你可以改为展示牌堆顶的X+1张牌,X为你已损失的体力值,其中每有一张♥牌,你回复1点体力,然后弃掉这些♥牌,将其余的牌收入手牌。', batu_info:'结束阶段,你可以将手牌数补至X,X为现存的势力数', diyzaiqi_info:'锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值', - diykuanggu_info:'锁定技,每当你造成一点伤害,你在其攻击范围内,你回复一点体力,否则你摸一张牌', - diyqiangxi_info:'出牌阶段,你可以自减一点体力或弃一张武器牌,然后你对你攻击范围内的一名角色造成一点伤害并弃置其一张牌,每回合限一次。', + diykuanggu_info:'锁定技,每当你造成1点伤害,你在其攻击范围内,你回复1点体力,否则你摸一张牌', + diyqiangxi_info:'出牌阶段,你可以自减1点体力或弃一张武器牌,然后你对你攻击范围内的一名角色造成1点伤害并弃置其一张牌,每回合限一次。', diyduanliang_info:'出牌阶段限一次,你可以将一张黑色的基本牌当兵粮寸断对一名角色使用,然后摸一张牌。你的兵粮寸断可以指定距离2以内的角色作为目标', - guihan_info:'限定技,当你进入濒死状态时,可以指定一名男性角色与其各回复一点体力并摸两张牌', + guihan_info:'限定技,当你进入濒死状态时,可以指定一名男性角色与其各回复1点体力并摸两张牌', luweiyan_info:'出牌阶段限一次,你可以将一张非基本牌当作水攻使用;结算后你可以视为对其中一个目标使用一张不计入出杀次数的杀', xiongzi_info:'锁定技,你于摸牌阶段额外摸X+1张牌,X为你装备区牌数的一半,向下取整', honglian_info:'每当你受到来自其他角色的伤害,可以弃置伤害来源的所有红色牌', - jieyan_info:'出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到一点火焰伤害', + jieyan_info:'出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到1点火焰伤害', diyguhuo_info:'锁定技,准备阶段,你摸两张牌,然后弃置区域内的两张牌', - diychanyuan_info:'锁定技,杀死你的角色失去一点体力上限', + diychanyuan_info:'锁定技,杀死你的角色失去1点体力上限', zonghuo_info:'你可弃置一张牌将你即将造成的伤害变为火焰伤害', - shaoying_info:'每当你造成一次火焰伤害,可指定距离受伤害角色1以内的另一名角色,并展示牌堆顶的一张牌,若此牌为红色,该角色受到一点火焰伤害', + shaoying_info:'每当你造成一次火焰伤害,可指定距离受伤害角色1以内的另一名角色,并展示牌堆顶的一张牌,若此牌为红色,该角色受到1点火焰伤害', juedao_info:'出牌阶段,你可以弃置一张手牌,横置你的武将牌;锁定技,若你的武将牌横置,则你计算至其他角色的距离和其他角色计算至你的距离均+1。', geju_info:'准备阶段开始时,你可以摸X张牌(X为攻击范围内不含有你的势力数)。', siji_info:'弃牌阶段结束后,你可以摸2X张牌(X为你于此阶段内弃置的【杀】的数量)。', @@ -19030,6 +19079,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ junk_huangyueying_prefix:'旧界', old_majun:'骰子马钧', old_majun_prefix:'骰子', + ns_mengyou:'数学孟优', + ns_mengyou_prefix:'数学', + ns_mengyou_ab:'孟优', + nsmanzhi:'蛮智', + nsmanzhi_info:'准备阶段或结束阶段开始时,你可以将场上出现的数字代入等式中的A和B。若此等式成立,你摸Y张牌。(等式为Y=0.5A²+2.5B-X,其中X为游戏轮数,Y为存活人数)', + ns_chengpu:'铁索程普', + ns_chengpu_prefix:'铁索', + ns_chengpu_ab:'程普', + ns_sundeng:'画饼孙登', + ns_sundeng_prefix:'画饼', + ns_sundeng_ab:'孙登', + ns_duji:'画饼杜畿', + ns_duji_prefix:'画饼', + ns_duji_ab:'杜畿', diy_tieba:'吧友设计', diy_xushi:'玩点论杀·虚实篇', @@ -19041,12 +19104,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ diy_yijiang3:'设计比赛2022', diy_fakenews:'杀海流言', diy_trashbin:'垃圾桶', - ns_chengpu:'铁索程普', - ns_chengpu_ab:'程普', - ns_sundeng:'画饼孙登', - ns_sundeng_ab:'孙登', - ns_duji:'画饼杜畿', - ns_duji_ab:'杜畿', }, pinyins:{ 加藤うみ:['Kato','Umi'], @@ -19128,7 +19185,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 伊座并杏子:['Izanami','Kyouko'], 加纳天善:['Kano','Tenzen'], 冰室忧希:['Himuro','Yuuki'], - 露娜Q:['Lunar','Q'], + 露娜Q:['Lunar','Q'], 远野小满:['Toono','Michiru'], 远野美凪:['Toono','Minagi'], 樱庭星罗:['Sakuraba','Seira'], diff --git a/character/extra.js b/character/extra.js index 61cc31fe8..6059245a1 100755 --- a/character/extra.js +++ b/character/extra.js @@ -18,10 +18,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ extra_mobilezhi:['shen_guojia','shen_xunyu'], extra_mobilexin:['shen_taishici','shen_sunce'], extra_tw:['tw_shen_guanyu','tw_shen_lvmeng'], - extra_offline:['shen_diaochan','boss_zhaoyun','shen_dianwei'], + extra_offline:['shen_diaochan','boss_zhaoyun','shen_dianwei','le_shen_jiaxu'], }, }, character:{ + le_shen_jiaxu:['male','shen',4,['jxlianpo','jxzhaoluan'],['qun']], shen_dianwei:['male','shen',4,['juanjia','qiexie','cuijue'],['wei']], shen_dengai:['male','shen',4,['dctuoyu','dcxianjin','dcqijing'],['wei']], tw_shen_lvmeng:['male','shen',3,['twshelie','twgongxin'],['wu']], @@ -66,11 +67,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, characterReplace:{ shen_zhangliao:['ol_zhangliao','shen_zhangliao'], - shen_zhaoyun:['shen_zhaoyun','boss_zhaoyun'], + shen_zhaoyun:['shen_zhaoyun','old_shen_zhaoyun','boss_zhaoyun'], shen_guanyu:['shen_guanyu','tw_shen_guanyu'], shen_sunquan:['shen_sunquan','junk_sunquan'], shen_lvmeng:['shen_lvmeng','tw_shen_lvmeng'], shen_machao:['shen_machao','ps_shen_machao'], + shen_jiaxu:['le_shen_jiaxu','shen_jiaxu'], }, characterFilter:{ shen_diaochan:function(mode){ @@ -81,8 +83,274 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(mode=='versus') return _status.mode!='three'; return true; }, + le_shen_jiaxu:function(mode){ + return mode=='identity'&&_status.mode!='purple'; + }, }, skill:{ + //神贾诩 + jxlianpo:{ + audio:2, + trigger:{global:'dieAfter'}, + filter:function(event,player){ + if(lib.skill.jxlianpo.getMax().length<=1) return false; + return event.source&&event.source.isIn(); + }, + forced:true, + logTarget:'source', + global:'jxlianpo_global', + getMax:()=>{ + const map={ + zhu:game.countPlayer(current=>{ + const identity=current.identity; + let num=0; + if(identity=='zhu'||identity=='zhong'||identity=='mingzhong') num++; + num+=current.countMark('jxlianpo_mark_zhong'); + return num; + }), + fan:game.countPlayer(current=>{ + let num=0; + if(current.identity=='fan') num++; + num+=current.countMark('jxlianpo_mark_fan'); + return num; + }), + nei:(game.hasPlayer(current=>current.identity=='nei')?0:1)+game.countPlayer(current=>{ + return current.countMark('jxlianpo_mark_nei'); + }), + }; + let population=0,identities=[]; + for(let i in map){ + let curPopulation=map[i] + if(curPopulation>=population){ + if(curPopulation>population) identities=[]; + identities.add(i); + population=curPopulation; + } + }; + return identities; + }, + group:'jxlianpo_show', + content:function*(event,map){ + var source=map.trigger.source; + source.draw(2); + source.recover(); + }, + mark:true, + intro:{ + content:()=>`场上最大阵营为${lib.skill.jxlianpo.getMax().map(i=>{ + if(i=='zhu') return '主忠'; + if(i=='fan') return '反贼'; + if(i=='nei') return '内奸'; + return ''; + }).join('、')}`, + }, + $createButton:function(item,type,position,noclick,node){ + node=ui.create.identityCard(item,position,noclick); + node.link=item; + return node; + }, + subSkill:{ + show:{ + audio:'jxlianpo', + trigger:{global:'roundStart'}, + filter:function(event,player){ + var list=lib.config.mode_config.identity.identity.lastItem.slice(); + list.removeArray(game.filterPlayer().map(i=>{ + let identity=i.identity; + if(identity=='mingzhong') identity='zhong'; + return identity; + })); + return list.length; + }, + forced:true, + content:function(){ + 'step 0' + var list=lib.config.mode_config.identity.identity.lastItem.slice(); + list.removeArray(game.filterPlayer().map(i=>{ + var identity=i.identity; + return identity=='mingzhong'?'zhong':identity; + })).unique(); + player.chooseButton([ + '###炼魄:请选择一个身份###
    你选择的身份对应的阵营角色数于本轮内视为+1
    ', + [list,function(item,type,position,noclick,node){ + return lib.skill.jxlianpo.$createButton(item,type,position,noclick,node); + }], + ],true); + 'step 1' + var choice=result.links[0],mark=`jxlianpo_mark_${choice}`; + player.when({global:'roundStart'}) + .assign({ + firstDo:true, + }) + .filter(evt=>evt!=trigger) + .then(()=>{ + for(var i in player.storage){ + if(i.startsWith('jxlianpo_mark_')){ + player.clearMark(i); + } + } + }); + player.addMark(mark,1,false); + event.videoId=lib.status.videoId++; + var createDialog=function(player,identity,id){ + var dialog=ui.create.dialog(`${get.translation(player)}展示了“${get.translation(identity+'2')}”的身份牌
    `,'forcebutton'); + dialog.videoId=id; + ui.create.spinningIdentityCard(identity,dialog); + }; + game.broadcastAll(createDialog,player,choice,event.videoId); + var color=''; + if(choice=='zhong') color='#y'; + else if(choice=='fan') color='#g'; + else if(choice=='nei') color='#b'; + game.log(player,'展示了',`${color}${get.translation(choice+'2')}`,'的身份牌'); + game.delay(3); + 'step 2' + game.broadcastAll('closeDialog',event.videoId); + } + }, + global:{ + mod:{ + maxHandcard:function(player,num){ + if(!lib.skill.jxlianpo.getMax().includes('fan')) return; + return num-game.countPlayer(current=>{ + return current!=player&¤t.hasSkill('jxlianpo'); + }); + }, + cardUsable:function(card,player,num){ + if(card.name=='sha'){ + if(!lib.skill.jxlianpo.getMax().includes('fan')) return; + return num+game.countPlayer(current=>{ + return current.hasSkill('jxlianpo'); + }); + } + }, + attackRange:function(player,num){ + if(!lib.skill.jxlianpo.getMax().includes('fan')) return; + return num+game.countPlayer(current=>{ + return current.hasSkill('jxlianpo'); + }); + }, + cardSavable:function(card,player,target){ + if(card.name=='tao'){ + if(!lib.skill.jxlianpo.getMax().includes('zhu')) return; + if(player==target) return; + return false; + } + }, + playerEnabled:function(card,player,target){ + if(card.name=='tao'){ + if(!lib.skill.jxlianpo.getMax().includes('zhu')) return; + if(player==target) return; + return false; + } + } + }, + }, + }, + }, + jxzhaoluan:{ + audio:2, + trigger:{global:'dieBegin'}, + filter:function(event,player){ + return event.getParent().name=='dying'&&event.player.isIn(); + }, + limited:true, + skillAnimation:true, + animationColor:'metal', + logTarget:'player', + check:function(event,player){ + if(event.source&&event.source.isIn()&&get.attitude(player,event.source)>0&&player.identity=='fan') return false; + return get.attitude(player,event.player)>3.5; + }, + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + var target=trigger.player; + player.awakenSkill('jxzhaoluan'); + trigger.cancel(); + target.getSkills(null,false,false).forEach(skill=>{ + var info=get.info(skill); + if(info&&!info.charlotte&&!get.is.locked(skill)){ + target.removeSkill(skill); + } + }); + yield target.gainMaxHp(3); + var num=3-target.getHp(true); + if(num>0) yield target.recover(num); + target.draw(4); + player.addSkill('jxzhaoluan_effect'); + player.markAuto('jxzhaoluan_effect',target); + }, + ai:{ + expose:0.5, + threaten:3, + }, + subSkill:{ + effect:{ + audio:'jxzhaoluan', + enable:'phaseUse', + filter:function(event,player){ + return player.getStorage('jxzhaoluan_effect').some(i=>i.isIn()); + }, + filterTarget:function(card,player,target){ + return !player.getStorage('jxzhaoluan_hit').includes(target); + }, + line:false, + locked:true, + charlotte:true, + promptfunc:function(){ + var bodies=_status.event.player.getStorage('jxzhaoluan_effect').filter(i=>i.isIn()); + return `选择一名角色,你令${get.translation(bodies)}${bodies.length>1?'中的一人':''}减1点体力上限,然后你对选择的角色造成1点伤害。`; + }, + delay:false, + content:function(){ + 'step 0' + var bodies=player.getStorage('jxzhaoluan_effect').filter(i=>i.isIn()); + if(bodies.length==1) event._result={bool:true,targets:bodies}; + else{ + player.chooseTarget('兆乱:请选择被减上限的傀儡',true,(card,player,target)=>{ + return _status.event.targets.includes(target); + }).set('targets',bodies).set('ai',target=>{ + return 8-get.attitude(_status.event.player,target); + }); + } + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.line(target); + target.loseMaxHp(); + game.delayex(); + } + else event.finish(); + 'step 2' + player.line(target); + target.damage(); + if(!player.storage.jxzhaoluan_hit){ + player.when('phaseUseAfter') + .then(()=>{ + delete player.storage.jxzhaoluan_hit; + }); + } + player.markAuto('jxzhaoluan_hit',target); + }, + ai:{ + order:9, + result:{ + player:function(player){ + var bodies=player.getStorage('jxzhaoluan_effect').filter(i=>i.isIn()); + var body; + if(bodies.length==1) body=bodies[0]; + else body=bodies.sort((a,b)=>get.attitude(player,a)-get.attitude(player,b))[0]; + if(get.attitude(player,body)>4&&!body.isDamaged()&&body.getHp()<=2) return -10; + return 0; + }, + target:function(player,target){ + return Math.sign(get.damageEffect(target,player,target)); + } + } + } + }, + }, + }, //神典韦 juanjia:{ trigger:{ @@ -2453,6 +2721,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.needsToDiscard()) return num/3; return 0; } + }, + targetInRange:function(card,player,target){ + if(target.hasMark('yingba_mark')) return true; } }, enable:'phaseUse', @@ -2468,15 +2739,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, locked:false, //global:'yingba_mark', - mod:{ - targetInRange:function(card,player,target){ - if(target.hasMark('yingba_mark')) return true; - }, - }, ai:{ combo:'scfuhai', threaten:3, - order:9, + order:11, result:{ player:function(player,target){ if(player.maxHp==1) return -2.5; @@ -2631,12 +2897,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ game.addGlobalSkill('tianzuo_global'); + var cards=[]; for(var i=2;i<10;i++){ - var card=game.createCard2('qizhengxiangsheng',i%2?'club':'spade',i); - ui.cardPile.insertBefore(card,ui.cardPile.childNodes[get.rand(0,ui.cardPile.childNodes.length)]); + cards.push(game.createCard2('qizhengxiangsheng',i%2?'club':'spade',i)); } game.broadcastAll(function(){lib.inpile.add('qizhengxiangsheng')}); - game.updateRoundNumber(); + game.cardsGotoPile(cards,()=>{ + return ui.cardPile.childNodes[get.rand(0,ui.cardPile.childNodes.length-1)]; + }) }, group:'tianzuo_remove', subSkill:{ @@ -3588,7 +3856,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huoxin2:{ trigger:{ player:['phaseAfter','dieAfter'], - global:'phaseBefore', + global:'phaseBeforeStart', }, lastDo:true, charlotte:true, @@ -4212,7 +4480,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }; "step 3" if(!result.bool){ - lib.element.player.die.apply(target,[]); + lib.element.Player.prototype.die.apply(target,[]); } }, sub:true, @@ -4874,6 +5142,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.removeMark('renjie',1); player.addTempSkill('rewansha'); + }, + ai:{ + order:()=>{ + let player=_status.event.player; + if(game.hasPlayer(current=>{ + if(player===current||current.hp>1||get.attitude(player,current)>=0) return false; + return player.inRange(current)&&player.countCards('hs','sha')&&player.getCardUsable('sha')|| + player.countCards('hs',card=>get.name(card)!=='sha'&&get.tag(card,'damage'))>1; + })) return 9.2; + return 0; + }, + result:{ + player:1 + }, + effect:{ + player:(card,player,target)=>{ + if(player.hasSkill('rewansha')&&target.hp<=1&&get.tag(card,'damage')) return [1,0,1.5,-1.5]; + } + } } }, jilue_zhiheng:{ @@ -5414,7 +5701,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget(get.prompt('dawu'),'令至多'+get.cnNumber(num)+'名角色获得“大雾”标记', [1,num]).set('ai',function(target){ if(target.isMin()) return 0; - if(target.hasSkill('biantian2')) return 0; + if(target.hasSkill('biantian2')||target.hasSkill('dawu2')) return 0; var att=get.attitude(player,target); if(att>=4){ if(_status.event.allUse) return att; @@ -5428,13 +5715,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })*2); "step 1" if(result.bool){ - player.logSkill('dawu',result.targets,'thunder'); - var length=result.targets.length; - for(var i=0;i{ + target.addAdditionalSkill(`dawu_${player.playerid}`,'dawu2'); + target.markAuto('dawu2',[player]); + }); + player.addTempSkill('dawu3',{player:'phaseBeginStart'}) player.chooseCardButton('选择弃置'+get.cnNumber(length)+'张“星”',length,player.getExpansions('qixing'),true); - player.addSkill('dawu3'); } else{ event.finish(); @@ -5445,46 +5734,41 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{combo:'qixing'}, }, dawu2:{ - trigger:{player:'damageBegin4'}, - filter:function(event){ - if(!event.hasNature('thunder')) return true; - return false; - }, - mark:true, - forced:true, charlotte:true, - content:function(){ - trigger.cancel(); - }, ai:{ nofire:true, nodamage:true, effect:{ target:function(card,player,target,current){ - if(get.tag(card,'damage')&&!get.tag(card,'thunderDamage')) return [0,0]; + if(get.tag(card,'damage')&&!get.tag(card,'thunderDamage')) return 'zeroplayertarget'; } }, }, intro:{ - markcount:()=>1, - content:'共有1个标记', + content:function(storage){ + return `共有${storage.length}枚标记`; + }, } }, dawu3:{ - trigger:{player:['phaseBegin','dieBegin']}, - silent:true, + trigger:{global:'damageBegin4'}, + filter:function(event,player){ + return !event.hasNature('thunder')&&event.player.getStorage('dawu2').includes(player); + }, + forced:true, charlotte:true, + logTarget:'player', content:function(){ - for(var i=0;i{ + if(current.getStorage('dawu2').includes(player)){ + current.unmarkAuto('dawu2',player); + current.removeAdditionalSkill(`dawu_${player.playerid}`); } - if(game.players[i].hasSkill('kuangfeng2')){ - game.players[i].removeSkill('kuangfeng2'); - } - } - player.removeSkill('dawu3'); - } + },true); + }, }, kuangfeng:{ unique:true, @@ -5501,13 +5785,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } "step 1" if(result.bool){ - var length=result.targets.length; - for(var i=0;i{ + target.addAdditionalSkill(`kuangfeng_${player.playerid}`,'kuangfeng2'); + target.markAuto('kuangfeng2',[player]); + }); + player.addTempSkill('kuangfeng3',{player:'phaseBeginStart'}) + player.chooseCardButton('选择弃置'+get.cnNumber(length)+'张“星”',length,player.getExpansions('qixing'),true); } else{ event.finish(); @@ -5518,28 +5804,40 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{combo:'qixing'}, }, kuangfeng2:{ - trigger:{player:'damageBegin3'}, - filter:function(event){ - if(event.hasNature('fire')) return true; - return false; - }, - mark:true, + charlotte:true, intro:{ - markcount:()=>1, - content:'共有1个标记' - }, - forced:true, - content:function(){ - trigger.num++; + content:function(storage){ + return `共有${storage.length}枚标记`; + }, }, ai:{ effect:{ target:function(card,player,target,current){ - if(get.tag(card,'fireDamage')) return 1.5; + if(get.tag(card,'fireDamage')&¤t<0) return 1.5; } } } }, + kuangfeng3:{ + trigger:{global:'damageBegin3'}, + filter:function(event){ + return event.hasNature('fire')&&event.player.getStorage('kuangfeng2').includes(player); + }, + charlotte:true, + forced:true, + logTarget:'player', + content:function(){ + trigger.num++; + }, + onremove:function(player){ + game.countPlayer2(current=>{ + if(current.getStorage('kuangfeng2').includes(player)){ + current.unmarkAuto('kuangfeng2',player); + current.removeAdditionalSkill(`kuangfeng_${player.playerid}`); + } + },true); + }, + }, yeyan:{ unique:true, forceDie:true, @@ -5563,7 +5861,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ selectCard:[0,4], line:'fire', check:function (){return -1}, - selectTarget:function (){ + selectTarget:function(){ if(ui.selected.cards.length==4) return [1,2]; if(ui.selected.cards.length==0) return [1,3]; game.uncheck('target'); @@ -5571,9 +5869,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, multitarget:true, multiline:true, - content:function (){ - "step 0" + contentBefore:function(){ player.awakenSkill('yeyan'); + }, + content:function(){ + "step 0" event.num=0; targets.sortBySeat(); "step 1" @@ -6156,7 +6456,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{ content:function(storage,player,skill){ if(player.storage.nzry_longnu==true) return '锁定技,出牌阶段开始时,你减1点体力上限并摸一张牌,然后本阶段内你的锦囊牌均视为雷杀且无使用次数限制'; - return '锁定技,出牌阶段开始时,你流失一点体力并摸一张牌,然后本阶段内你的红色手牌均视为火杀且无距离限制'; + return '锁定技,出牌阶段开始时,你失去1点体力并摸一张牌,然后本阶段内你的红色手牌均视为火杀且无距离限制'; }, }, audio:2, @@ -6323,7 +6623,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' if(player.countMark('nzry_junlve')%2==1){ - player.chooseTarget('是否发动【摧克】,对一名角色造成一点伤害?').ai=function(target){ + player.chooseTarget('是否发动【摧克】,对一名角色造成1点伤害?').ai=function(target){ return -get.attitude(player,target); }; } @@ -6347,7 +6647,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.countMark('nzry_junlve')>7){ player.chooseBool().set('ai',function(){ return true; - }).set('prompt','是否弃置所有“军略”标记并对所有其他角色造成一点伤害?'); + }).set('prompt','是否弃置所有“军略”标记并对所有其他角色造成1点伤害?'); }else{ event.finish(); }; @@ -7127,9 +7427,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "shen_luxun":"神陆逊", shen_luxun_prefix:'神', "nzry_junlve":"军略", - "nzry_junlve_info":"锁定技,当你受到或造成伤害后,你获得X个“军略”标记(X为伤害点数)", + "nzry_junlve_info":"锁定技,当你受到或造成伤害后,你获得X个“军略”标记(X为伤害点数)。", "nzry_cuike":"摧克", - "nzry_cuike_info":"出牌阶段开始时,若“军略”标记的数量为奇数,你可以对一名角色造成一点伤害;若“军略”标记的数量为偶数,你可以横置一名角色并弃置其区域内的一张牌。然后,若“军略”标记的数量超过7个,你可以移去全部“军略”标记并对所有其他角色造成一点伤害", + "nzry_cuike_info":"出牌阶段开始时,若“军略”标记的数量为奇数,你可以对一名角色造成1点伤害;若“军略”标记的数量为偶数,你可以横置一名角色并弃置其区域内的一张牌。然后,若“军略”标记的数量超过7个,你可以移去全部“军略”标记并对所有其他角色造成1点伤害。", "nzry_dinghuo":"绽火", "nzry_dinghuo_info":"限定技,出牌阶段,你可以移去全部“军略”标记,令至多等量的已横置角色弃置所有装备区内的牌。然后,你对其中一名角色造成1点火焰伤害。", "shen_liubei":"神刘备", @@ -7145,7 +7445,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shen_zhangliao_prefix:'神', "drlt_poxi":"魄袭", - "drlt_poxi_info":"出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可以弃置你与其手牌中的四张花色不同的牌。若如此做,根据此次弃置你的牌的数量执行以下效果:零张,扣减一点体力上限;一张,你结束出牌阶段且本回合手牌上限-1;三张,你回复一点体力;四张,你摸四张牌", + "drlt_poxi_info":"出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可以弃置你与其手牌中的四张花色不同的牌。若如此做,根据此次弃置你的牌的数量执行以下效果:零张,扣减1点体力上限;一张,你结束出牌阶段且本回合手牌上限-1;三张,你回复1点体力;四张,你摸四张牌。", "drlt_jieying":"劫营", "drlt_jieying_info":"回合开始时,若场上没有拥有“营”标记的角色,你获得1个“营”标记;结束阶段,你可以将你的一个“营”标记交给一名角色;有“营”标记的角色摸牌阶段多摸一张牌,出牌阶段使用【杀】的次数上限+1,手牌上限+1。有“营”的其他角色回合结束时,其移去“营”标记,然后你获得其所有手牌。", drlt_jieying_mark:"劫营", @@ -7154,7 +7454,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "drlt_duorui":"夺锐", "drlt_duorui_info":"当你于出牌阶段内对一名其他角色造成伤害后,你可以废除你装备区内的一个装备栏(若已全部废除则可以跳过此步骤),然后获得该角色的一个技能直到其的下回合结束或其死亡(觉醒技,限定技,主公技,隐匿技,使命技等特殊技能除外)。若如此做,该角色该技能失效且你不能再发动〖夺锐〗直到你失去以此法获得的技能。", "drlt_zhiti":"止啼", - "drlt_zhiti_info":"锁定技,你攻击范围内已受伤的其他角色手牌上限-1;当你拼点或【决斗】胜利,或受到伤害后,你恢复一个装备栏", + "drlt_zhiti_info":"锁定技,你攻击范围内已受伤的其他角色手牌上限-1;当你拼点或【决斗】胜利,或受到伤害后,你恢复一个装备栏。", shen_zhaoyun:'神赵云', shen_zhaoyun_prefix:'神', @@ -7173,7 +7473,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shen_lvbu:'神吕布', shen_lvbu_prefix:'神', xinjuejing:'绝境', - xinjuejing_info:'锁定技,你的手牌上限+2;当你进入或脱离濒死状态时,你摸一张牌。', + xinjuejing_info:'锁定技。①你的手牌上限+2。②当你进入或脱离濒死状态时,你摸一张牌。', relonghun:'龙魂', relonghun_info:'你可以将同花色的一至两张牌按下列规则使用或打出:红桃当【桃】,方块当火【杀】,梅花当【闪】,黑桃当普【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。', xinlonghun:'龙魂', @@ -7184,8 +7484,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ longhun3:'龙魂♠︎', longhun4:'龙魂♣︎', juejing:'绝境', - longhun_info:'你可以将同花色的X张牌按下列规则使用或打出:红桃当【桃】,方块当具火焰伤害的【杀】,梅花当【闪】,黑桃当【无懈可击】(X为你当前的体力值且至少为1)', - juejing_info:'锁定技,摸牌阶段,你摸牌的数量改为你已损失的体力值+2;你的手牌上限+2。', + longhun_info:'你可以将同花色的X张牌按下列规则使用或打出:红桃当【桃】,方块当具火焰伤害的【杀】,梅花当【闪】,黑桃当【无懈可击】(X为你当前的体力值且至少为1)。', + juejing_info:'锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。', wushen:'武神', wushen_info:'锁定技,你的红桃手牌均视为【杀】;锁定技,你使用红桃【杀】无距离和次数限制且不可被响应。', wuhun:'武魂', @@ -7193,9 +7493,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wuhun22:'武魂', wuhun23:'武魂', wuhun2:'武魂', - wuhun3:'武魂', + wuhun3:'武魂', wuhun_info_alter:'锁定技,当你受到1点伤害后,你令伤害来源获得1枚“梦魇”标记;当你死亡时,你令拥有最多“梦魇”标记的一名其他角色判定,若结果不为【桃】或【桃园结义】,则该角色死亡。', - wuhun_info:'锁定技,杀死你的角色立即进入濒死状态', + wuhun_info:'锁定技,杀死你的角色立即进入濒死状态。', shelie:'涉猎', gongxin:'攻心', gongxin_discard:'弃置', @@ -7204,7 +7504,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ renjie2:'忍戒', renjie_info:'锁定技,当你受到1点伤害后,你获得一枚“忍”标记;锁定技,当你于弃牌阶段内弃置牌后,你获得等同于失去的牌数量的“忍”标记。', sbaiyin:'拜印', - sbaiyin_info:'觉醒技,准备阶段开始时,若你的“忍”标记数不小于4,你减1点体力上限,然后获得〖极略〗', + sbaiyin_info:'觉醒技,准备阶段开始时,若你的“忍”标记数不小于4,你减1点体力上限,然后获得〖极略〗。', jilue:'极略', jilue_info:'当一名角色的判定牌生效前,你可以弃1枚“忍”标记并发动〖鬼才〗;每当你受到伤害后,你可以弃1枚“忍”标记并发动〖放逐〗;当你使用锦囊牌时,你可以弃1枚“忍”标记并发动〖集智〗;出牌阶段限一次,你可以弃1枚“忍”标记并发动〖制衡〗;出牌阶段,你可以弃1枚“忍”标记并获得〖完杀〗直到回合结束。', jilue_guicai:'鬼才', @@ -7219,8 +7519,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yeyan:'业炎', shelie_info:'摸牌阶段,你可以改为从牌堆顶亮出五张牌,然后选择获得不同花色的牌各一张。', gongxin_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,并可以展示其中一张红桃牌,然后将其弃置或置于牌堆顶。', - guixin_info:'当你受到1点伤害后,你可以获得每名其他角色区域里的一张牌,然后你翻面', - guixin_info_alter:'当你受到1点伤害后,你可以随机获得每名其他角色区域里的一张牌,然后你翻面', + guixin_info:'当你受到1点伤害后,你可以获得每名其他角色区域里的一张牌,然后你翻面。', + guixin_info_alter:'当你受到1点伤害后,你可以随机获得每名其他角色区域里的一张牌,然后你翻面。', qinyin_info:'弃牌阶段结束时,若你于此阶段内弃置过两张或更多的牌,则你可以选择一项:1. 令所有角色各回复1点体力;2. 令所有角色各失去1点体力。', // qinyin_info:'每当你于弃牌阶段内因你的弃置而失去第X张手牌时(X至少为2),你可以选择一项:1.令所有角色各回复1点体力;2.令所有角色各失去1点体力。每阶段限一次。', yeyan_info:'限定技,出牌阶段,你可以对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。', @@ -7245,9 +7545,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ baonu_bg:'暴', baonu_info:'锁定技,游戏开始时,你获得两枚“暴怒”标记;锁定技,当你造成/受到1点伤害后,你获得1枚“暴怒”标记。', shenfen:'神愤', - shenfen_info:'限定技,出牌阶段,你可以弃置6枚暴怒标记,对场上所有其他角色造成一点伤害,然后令其弃置4张牌', + shenfen_info:'限定技,出牌阶段,你可以弃置6枚暴怒标记,对场上所有其他角色造成1点伤害,然后令其弃置四张牌。', wuqian:'无前', - wuqian_info:'出牌阶段,你可以弃置两枚暴怒标记并获得技能【无双】直到回合结束', + wuqian_info:'出牌阶段,你可以弃置两枚暴怒标记并获得技能〖无双〗直到回合结束。', wumou:'无谋', wumou_info:'锁定技,当你使用普通锦囊牌时,你选择一项:1.弃置1枚“暴怒”标记;2.失去1点体力。', ol_wuqian:'无前', @@ -7271,9 +7571,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ chuyuan_info:'一名角色受到伤害后,若你武将牌上「储」的数量小于体力上限,你可以令其摸一张牌。然后其将一张手牌置于你的武将牌上,称为「储」。', //chuyuan_info:'一名角色受到伤害后,你可以令其摸一张牌。然后其将一张手牌置于你的武将牌上,称为「储」。你的手牌上限+X(X为你武将牌上的「储」数)。', dengji:'登极', - dengji_info:'觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后获得技能〖天行〗和〖奸雄〗', + dengji_info:'觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后获得技能〖天行〗和〖奸雄〗。', tianxing:'天行', - tianxing_info:'觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后失去技能〖储元〗,选择获得以下技能中的一个:〖仁德〗/〖制衡〗/〖乱击〗/〖行动〗', + tianxing_info:'觉醒技,准备阶段,若你武将牌上的「储」数不小于3,则你减1点体力上限并获得所有「储」,然后失去技能〖储元〗,选择获得以下技能中的一个:〖仁德〗/〖制衡〗/〖乱击〗/〖行动〗。', shen_zhenji:'神甄宓', shen_zhenji_prefix:'神', shenfu:'神赋', @@ -7296,7 +7596,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ boss_juejing2:'绝境', boss_juejing_info:'锁定技,摸牌阶段开始前,你跳过此阶段。当你得到牌/失去手牌后,若你的手牌数大于4/小于4,则你将手牌摸至4张/弃置至4张。', zhanjiang:'斩将', - zhanjiang_info:'准备阶段开始时,如果其他角色的装备区内有【青釭剑】,你可以获得之', + zhanjiang_info:'准备阶段开始时,如果其他角色的装备区内有【青釭剑】,你可以获得之。', shen_guojia:'神郭嘉', shen_guojia_prefix:'神', shuishi:'慧识', @@ -7339,7 +7639,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ scfuhai:'覆海', scfuhai_info:'锁定技。①当你使用牌指定目标后,若目标角色有“平定”标记,则其不可响应此牌。若你本回合内以此法得到的牌数小于2,则你摸一张牌。②拥有“平定”标记的角色死亡时,你增加X点体力上限并摸X张牌。(X为其拥有的“平定”标记数)。', pinghe:'冯河', - pinghe_info:'锁定技。①你的手牌上限基数等于你已损失的体力值。②当你受到其他角色造成的伤害时,若你有牌且你的体力上限大于1,则你防止此伤害,减一点体力上限并将一张手牌交给一名其他角色。然后若你拥有〖英霸〗,则伤害来源获得一个“平定”标记。', + pinghe_info:'锁定技。①你的手牌上限基数等于你已损失的体力值。②当你受到其他角色造成的伤害时,若你有牌且你的体力上限大于1,则你防止此伤害,减1点体力上限并将一张手牌交给一名其他角色。然后若你拥有〖英霸〗,则伤害来源获得一个“平定”标记。', shen_jiangwei:'神姜维', shen_jiangwei_prefix:'神', jiufa:'九伐', @@ -7384,7 +7684,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shen_machao_prefix:'神', shouli:'狩骊', shouli_backup:'狩骊', - shouli_info:'①游戏开始时,你令场上所有角色从你的下家起,依次使用牌堆中的一张不为赠物的坐骑牌。②你可以将场上的一张进攻坐骑牌当做【杀】(无任何次数限制),防御坐骑牌当做【闪】使用或打出。若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。', + shouli_info:'①锁定技,游戏开始时,你令场上所有角色从你的下家起,依次使用牌堆中的一张不为赠物的坐骑牌。②你可以将场上的一张进攻坐骑牌当做【杀】(无任何次数限制),防御坐骑牌当做【闪】使用或打出。若此坐骑牌的拥有者不为你,则其非锁定技于本回合内失效。且当你或其于本回合内受到伤害时,此伤害+1且改为雷属性。', hengwu:'横骛', hengwu_info:'当你使用或打出有花色的牌时,若你的手牌区内没有与此牌花色相同的牌,则你可以摸X张牌(X为场上装备区内花色与此牌相同的牌数)。', hengwu_append:'棘手,怀念,摧毁!', @@ -7456,6 +7756,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qiexie_info:'锁定技。准备阶段,你在剩余武将牌堆中随机观看五张牌,选择其中的任意张,将其按照如下规则转化为武器牌置入你的武器栏:{⒈此牌不具有花色,且其攻击范围和点数等于此武将牌的体力上限。⒉此武器牌的技能为该武将牌上所有描述中包含“【杀】”且不具有锁定技以外的标签的技能。⒊此武器牌离开你的装备区时,改为放回武将牌堆。}', cuijue:'摧决', cuijue_info:'每回合每名角色限一次。出牌阶段,你可以弃置一张牌,然后对攻击范围内距离最远的一名其他角色造成1点伤害(没有则不选)。', + le_shen_jiaxu:'神贾诩', + le_shen_jiaxu_prefix:'神', + jxlianpo:'炼魄', + jxlianpo_info:'锁定技。①若场上最大阵营为:反贼,其他角色的手牌上限-1,所有角色使用【杀】的次数上限和攻击范围+1;主忠,其他角色不能对其以外的角色使用【桃】。其他角色死亡后,若有多个最大阵营,来源摸两张牌并回复1点体力。②一轮游戏开始时,你展示一张未加入游戏或已死亡角色的身份牌,本轮视为该身份对应阵营的角色数+1。', + jxzhaoluan:'兆乱', + jxzhaoluan_info:'限定技。一名角色死亡前,若其此次进入过濒死状态,你可以取消之,令其加3点体力上限并失去所有非锁定技,回复体力至3点,摸四张牌。然后你获得如下效果:出牌阶段,你可以令一名成为过你〖兆乱〗目标的角色减1点体力上限,然后对一名此阶段未以此法选择过的角色造成1点伤害。', extra_feng:'神话再临·风', extra_huo:'神话再临·火', diff --git a/character/gujian.js b/character/gujian.js index 7db7e72b1..55264de28 100644 --- a/character/gujian.js +++ b/character/gujian.js @@ -949,7 +949,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 4' if(event.target.isAlive()){ - player.chooseBool('是否失去一点体力并视为对'+get.translation(event.target)+'使用一张杀?').set('choice', + player.chooseBool('是否失去1点体力并视为对'+get.translation(event.target)+'使用一张杀?').set('choice', player.hp>event.target.hp&&player.hp>1&&event.target.hp>0 ); } @@ -2338,7 +2338,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "step 2" if(event.targets.length){ var target=event.targets.shift(); - var next=target.chooseToDiscard('流光:弃置一张牌或受到一点伤害','he'); + var next=target.chooseToDiscard('流光:弃置一张牌或受到1点伤害','he'); next.ai=function(card){ if(get.damageEffect(_status.event.player,player,_status.event.player)>=0) return -1; if(_status.event.player.hp==1) return 9-get.value(card); @@ -2663,7 +2663,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lingyan_info:'出牌阶段限一次,你可以将一张点数与武将牌上的牌均不同的手牌置于武将牌上,然后获得与其花色对应的一枚偃甲蛋', xunjian:'寻剑', xunjian_info:'锁定技,每当你使用或打出一张牌,若牌堆中有同名牌,你有X的机率获得之,X为你的“灵偃”牌数/13', - xunjian_old_info:'觉醒技,结束阶段,若你武将牌上有13张牌,你失去技能灵偃并获得技能通天', + xunjian_old_info:'觉醒技,结束阶段,若你武将牌上有十三张牌,你失去技能灵偃并获得技能通天', tongtian:'通天', tongtian_info:'锁定技,在你使用或打出一张牌后,若敌方角色手中有同名牌,你随机获得其中一张', xianju:'仙居', @@ -2678,12 +2678,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ woxue:'卧雪', woxue_info:'每当你于回合外使用或打出一张牌,你可以视为对当前回合角色使用【白霜】', lingnu:'灵怒', - lingnu_info:'锁定技,每当你造成一点伤害,你随机获得一个与杀相关的技能,技能在你行动3回合后消失(同一时间最多拥有3个以此法获得的技能)', + lingnu_info:'锁定技,每当你造成1点伤害,你随机获得一个与杀相关的技能,技能在你行动3回合后消失(同一时间最多拥有3个以此法获得的技能)', zhenying:'振影', zhenying_info:'每当你使用或打出一张非转化的黑色牌(装备或延时锦囊牌除外),你可以获得一张此牌的“替身”;你使用或打出“替身”牌后需弃置一张牌(没有则不弃);当前回合结束后,“替身”牌消失', cihong:'刺鸿', cihong_bg:'鸿', - cihong_info:'每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去一点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张杀', + cihong_info:'每三轮限一次,结束阶段,你可以指定一名其他角色并可以依次选择:1. 弃置一张红色牌;2. 失去1点体力;3. 将武将牌翻至背面;每选择一项,视为对目标使用一张杀', lianjing:'莲境', lianjing_info:'每两轮限一次,回合结束后,你可以选择至多2名其他角色,将其他角色移出游戏,然后你与所选的角色依次进行一个回合', zuiji:'醉饮', @@ -2691,14 +2691,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ manwu:'曼舞', manwu_info:'在一名角色的结束阶段,若其手牌数为全场最少或之一,你可以令其摸一张牌', xfanghua:'芳华', - xfanghua_info:'在你成为红色牌的目标后,你可以回复一点体力', + xfanghua_info:'在你成为红色牌的目标后,你可以回复1点体力', yunyin:'云音', yunyin_info:'结束阶段,你可以弃置一张与本回合使用过的卡牌花色均不相同的手牌,视为使用一张基本牌或普通锦囊牌', shishui:'逝水', - shishui_info:'锁定技,每当你使用一张红色牌,你令目标流失一点体力', + shishui_info:'锁定技,每当你使用一张红色牌,你令目标失去1点体力', duhun:'渡魂', - duhun_info:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去一点体力上限并与该角色交换体力值;若你没赢,你立即死亡', - duhun_info_alter:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去一点体力上限并将体力值回复至与该角色相同;若你没赢,你立即死亡', + duhun_info:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并与该角色交换体力值;若你没赢,你立即死亡', + duhun_info_alter:'濒死阶段,你可以与一名体力值不超过你的体力上限的角色拼点,若你赢,你失去1点体力上限并将体力值回复至与该角色相同;若你没赢,你立即死亡', chizhen:'驰阵', chizhen_info:'出牌阶段开始时,你可以摸X张牌并弃置X张牌,若你弃置了杀,可以视为使用一张决斗(X为你已损失的体力值且至少为1)', xidie:'戏蝶', @@ -2714,26 +2714,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zuizhan:'乱斩', zuizhan_info:'每当你使用一张杀,可以摸一张牌,然后此杀随机增加一个额外目标', xlqianhuan:'千幻', - xlqianhuan_info:'回合结束后,若你已受伤,你可以回复一点体力并将武将牌翻面。若你的武将牌背面朝上,你不能使用卡牌,也不能成为卡牌的目标', + xlqianhuan_info:'回合结束后,若你已受伤,你可以回复1点体力并将武将牌翻面。若你的武将牌背面朝上,你不能使用卡牌,也不能成为卡牌的目标', fumo:'伏魔', - fumo_info:'每当你受到一次伤害,可以弃置两张颜色相同的手牌并对伤害来源造成一点雷电伤害', + fumo_info:'每当你受到一次伤害,可以弃置两张颜色相同的手牌并对伤害来源造成1点雷电伤害', fanyin:'梵音', - fanyin_info:'结束阶段,你可以令一名角色复原武将牌并移除判定区内的牌;若其体力值是全场最少的之一,其回复一点体力', + fanyin_info:'结束阶段,你可以令一名角色复原武将牌并移除判定区内的牌;若其体力值是全场最少的之一,其回复1点体力', mingkong:'明空', mingkong_info:'锁定技,若你没有手牌,你受到的伤害-1,然后伤害来源摸一张牌', qinglan:'晴岚', - qinglan_info:'每当有一名角色即将受到属性伤害,你可以弃置一张牌令其防止此伤害,然后伤害来源摸一张牌并回复一点体力', + qinglan_info:'每当有一名角色即将受到属性伤害,你可以弃置一张牌令其防止此伤害,然后伤害来源摸一张牌并回复1点体力', yuehua:'月华', yuehua_info:'每当你于回合外使用、打出或弃置红色牌,你可以摸一张牌', xuelu:'血戮', - xuelu_info:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成一点火焰伤害;若你已损失体力值不少于3,改为造成两点火焰伤害', - xuelu_info_alter:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成一点火焰伤害', + xuelu_info:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害;若你已损失体力值不少于3,改为造成2点火焰伤害', + xuelu_info_alter:'结束阶段,若你已受伤,你可以弃置一张红色牌并对一名其他角色造成1点火焰伤害', fanshi:'反噬', - fanshi_info:'锁定技,弃牌阶段结束时,若你本回合内造成过伤害,你流失一点体力并摸一张牌', + fanshi_info:'锁定技,弃牌阶段结束时,若你本回合内造成过伤害,你失去1点体力并摸一张牌', shahun:'煞魂', shahun2:'煞魂', - shahun_info:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能【反噬】,获得技能【绝境】,并于两回合后立即死亡', - shahun_info_alter:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能【反噬】,获得技能【绝境】,并于两回合后立即死亡', + shahun_info:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡', + shahun_info_alter:'限定技,濒死阶段,你可以复原武将牌,弃置所有牌并摸三张牌,然后将体力回复至1;若如此做,你失去技能〖反噬〗,获得技能〖绝境〗,并于两回合后立即死亡', yanjia:'偃甲', yanjia_info:'出牌阶段,你可以将两张非特殊装备牌合成为一张强化装备', @@ -2744,7 +2744,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ boyun:'拨云', boyun1:'拨云', boyun2:'拨云', - boyun_info:'在你的回合内,你可以弃置一张装备牌,并展示牌堆顶的一张牌,若其为装备牌,你须将其交给任意一张角色并对其造成一点伤害,否则你摸一张牌', + boyun_info:'在你的回合内,你可以弃置一张装备牌,并展示牌堆顶的一张牌,若其为装备牌,你须将其交给任意一张角色并对其造成1点伤害,否则你摸一张牌', jizhan:'疾战', jizhan_info:'出牌阶段限一次,你可以将移动到任意一名角色的前一位,视为对其使用了一张不计入出杀次数的杀', qianjun:'千军', @@ -2756,8 +2756,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yangming:'养命', yangming2:'养命', xuanning_info:'出牌阶段,你可以弃置一基本牌,获得至多3个玄凝标记。当你受到伤害时,你失去一枚玄凝标记,伤害来源随机弃置一张牌', - liuguang_info:'准备阶段,若你有玄凝标记,你可以弃置一枚玄凝标记,选择至多三名角色依次令其选择一项:弃置一张牌,或受到一点伤害,并终止流光结算', - yangming_info:'出牌阶段,你可以弃置一张红色牌,并在下个出牌阶段结束时令距离1以内的任意名角色回复一点体力,在此之前不可再次发动', + liuguang_info:'准备阶段,若你有玄凝标记,你可以弃置一枚玄凝标记,选择至多三名角色依次令其选择一项:弃置一张牌,或受到1点伤害,并终止流光结算', + yangming_info:'出牌阶段,你可以弃置一张红色牌,并在下个出牌阶段结束时令距离1以内的任意名角色回复1点体力,在此之前不可再次发动', zhaolu:'朝露', jiehuo:'劫火', yuling:'御灵', @@ -2765,8 +2765,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yuling2:'御灵', yuling3:'御灵', yuling4:'御灵', - zhaolu_info:'锁定技,每隔X回合,你流失一点体力上限,每当你受到一点伤害或有人死亡,视为减少两个回合,X为现存角色数且至多为5', - jiehuo_info:'限定技,出牌阶段,你可以对一名其他角色造成两点火焰伤害,然后死亡', + zhaolu_info:'锁定技,每隔X回合,你失去1点体力上限,每当你受到1点伤害或有人死亡,视为减少两个回合,X为现存角色数且至多为5', + jiehuo_info:'限定技,出牌阶段,你可以对一名其他角色造成2点火焰伤害,然后死亡', yuling_info:'锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+2张牌,X为你的体力上限', yuling_info_alter:'锁定技,你没有摸牌和弃牌阶段,你的手牌数始终为5,你在一个出牌阶段最多使用X+1张牌,X为你的体力上限', }, diff --git a/character/gwent.js b/character/gwent.js index 5c0dd04ef..2768393e2 100644 --- a/character/gwent.js +++ b/character/gwent.js @@ -128,7 +128,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return card!=result.card&&card.name==result.card.name; })){ event.current=result.card; - player.chooseTarget('是否改为对一名角色造成一点火属性伤害?').set('ai',function(target){ + player.chooseTarget('是否改为对一名角色造成1点火属性伤害?').set('ai',function(target){ return get.damageEffect(target,null,player,player,'fire'); }); } @@ -1915,7 +1915,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var i=0;i0) return 0; return 1; @@ -4229,7 +4229,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ selectTarget:-1, content:function(){ 'step 0' - target.chooseToUse({name:'sha'},'使用一张杀,或失去一点体力'); + target.chooseToUse({name:'sha'},'使用一张杀,或失去1点体力'); 'step 1' if(!result.bool){ target.loseHp(); @@ -4519,13 +4519,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ // sqlongyin:'龙影', // sqlongyin_info:'', sqlongnu:'龙怒', - sqlongnu_info:'准备阶段,你可以发现一张牌堆中的牌,若你手牌中有同名牌,你可以改为造成一点火属性伤害锁定技。准备阶段开始时,你随机切换至一种形态', + sqlongnu_info:'准备阶段,你可以发现一张牌堆中的牌,若你手牌中有同名牌,你可以改为造成1点火属性伤害锁定技。准备阶段开始时,你随机切换至一种形态', sqlonghuo:'龙火', sqlonghuo_info:'出牌阶段限一次,你可以弃置所有手牌并摸等量的牌,若敌方角色手牌中与你弃置的牌同名的牌,则随机弃置其中一张。准备阶段开始时,你随机切换至一种形态', sqlongwu:'龙舞', sqlongwu_info:'结束阶段,你可以摸X张牌,然后可以使用一张牌,X为手牌中同名牌数最多的牌的数量。准备阶段开始时,你随机切换至一种形态', kuanglie:'狂猎', - kuanglie_info:'锁定技,每当你使用黑色牌指定其他角色为目标后,目标随机弃置一张牌;每当你以此法累计弃置2张牌后,你摸一张牌', + kuanglie_info:'锁定技,每当你使用黑色牌指定其他角色为目标后,目标随机弃置一张牌;每当你以此法累计弃置两张牌后,你摸一张牌', // kuanglie_info:'锁定技,每当一名敌方角色成为你的黑色牌的目标,你视为对其使用【刺骨寒霜】;在一名角色受到【刺骨寒霜】的影响后,你随机获得一张【狂猎】牌', lingshuang:'凛霜', lingshuang_info:'每当你失去最后一张基本牌,你可以视为对距离2以内的所有敌方角色使用【刺骨寒霜】;在一名角色受到【刺骨寒霜】影响时,你可以弃置一张手牌将其效果改为“摸牌数-2”', @@ -4545,7 +4545,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gwmaoxian_luoqi:'罗契', gwmaoxian_luoqi_info:'选择一名角色视为对其使用一张不计入出杀次数的杀,然后所有其他角色可以对目标使用一张杀,然后结束出牌阶段', gwmaoxian_jieluote:'杰洛特', - gwmaoxian_jieluote_info:'对一名角色造成一点伤害,若目标体力值大于2且为全场最多,改为造成2点伤害,然后结束出牌阶段', + gwmaoxian_jieluote_info:'对一名角色造成1点伤害,若目标体力值大于2且为全场最多,改为造成2点伤害,然后结束出牌阶段', gwmaoxian_yenaifa:'叶奈法', gwmaoxian_yenaifa_info:'对至多3名随机敌方角色施加一个随机负面效果,然后结束出牌阶段', gwmaoxian_telisi:'特丽斯', @@ -4553,9 +4553,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gwmaoxian_hengsaite:'亨赛特', gwmaoxian_hengsaite_info:'视为使用一张万箭齐发,每当有一名角色因此受到伤害,你获得一张杀,然后结束出牌阶段', gwmaoxian_fuertaisite:'弗尔泰斯特', - gwmaoxian_fuertaisite_info:'令至多两名角色各获得一点护甲,然后结束出牌阶段', + gwmaoxian_fuertaisite_info:'令至多两名角色各获得1点护甲,然后结束出牌阶段', gwmaoxian_laduoweide:'拉多维德', - gwmaoxian_laduoweide_info:'令一名角色的非锁定技失效直到其下一回合结束,并对其造成一点伤害,然后结束出牌阶段', + gwmaoxian_laduoweide_info:'令一名角色的非锁定技失效直到其下一回合结束,并对其造成1点伤害,然后结束出牌阶段', gwmaoxian_enxier:'恩希尔', gwmaoxian_enxier_info:'与一名手牌并不超过1的其他角色交换手牌,然后结束出牌阶段', gwmaoxian_fulisi:'符里斯', @@ -4563,23 +4563,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gwmaoxian_kaerweite:'卡尔维特', gwmaoxian_kaerweite_info:'获得至多两名角色各一张手牌,然后结束出牌阶段', gwmaoxian_bulanwang:'布兰王', - gwmaoxian_bulanwang_info:'弃置至多2张牌并摸数量等于弃牌数2倍的牌,跳过弃牌阶段,然后结束出牌阶段', + gwmaoxian_bulanwang_info:'弃置至多两张牌并摸数量等于弃牌数2倍的牌,跳过弃牌阶段,然后结束出牌阶段', gwmaoxian_kuite:'奎特', gwmaoxian_kuite_info:'视为对一名手牌数不小于你的角色连续使用2张决斗,然后结束出牌阶段', gwmaoxian_haluo:'哈洛', - gwmaoxian_haluo_info:'对所有体力值全场最少的角色造成一点伤害,然后结束出牌阶段', + gwmaoxian_haluo_info:'对所有体力值全场最少的角色造成1点伤害,然后结束出牌阶段', gwmaoxian_dagong:'达贡', gwmaoxian_dagong_info:'视为同时使用刺骨寒霜、蔽日浓雾和倾盆大雨,然后结束出牌阶段', gwmaoxian_gaier:'盖尔', - gwmaoxian_gaier_info:'令一名角色增加或减少一点体力和体力上限,然后结束出牌阶段', + gwmaoxian_gaier_info:'令一名角色增加或减少1点体力和体力上限,然后结束出牌阶段', gwmaoxian_airuiting:'艾瑞汀', - gwmaoxian_airuiting_info:'令所有其他角色选择一项:使用一张杀,或失去一点体力,然后结束出牌阶段', + gwmaoxian_airuiting_info:'令所有其他角色选择一项:使用一张杀,或失去1点体力,然后结束出牌阶段', gwmaoxian_aisinie:'埃丝涅', - gwmaoxian_aisinie_info:'回复一点体力并获得任意一张银卡法术,然后结束出牌阶段', + gwmaoxian_aisinie_info:'回复1点体力并获得任意一张银卡法术,然后结束出牌阶段', gwmaoxian_falanxisika:'法兰茜斯卡', gwmaoxian_falanxisika_info:'随机观看3张金卡法术并使用其中一张,然后结束出牌阶段', gwmaoxian_huoge:'霍格', - gwmaoxian_huoge_info:'观看牌堆顶的6张牌,使用至多2张,然后弃掉其余的牌,然后结束出牌阶段', + gwmaoxian_huoge_info:'观看牌堆顶的六张牌,使用至多两张,然后弃掉其余的牌,然后结束出牌阶段', gwmaoxian:'冒险', gwhuanbi:'幻笔', gwhuanbi_info:'出牌阶段限一次,你可以弃置一张牌,并创造一张冒险牌,然后随机选择一名有手牌的角色,被选中的角色可以交给你一张手牌并获得一张该牌的复制', @@ -4587,13 +4587,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gwminxiang_old_info:'结束阶段,你可以选择一张本回合使用过的基本牌或普通锦囊牌并选择两名其他角色,令目标分别视为对对方使用一张此牌的复制', gwminxiang_info:'出牌阶段限一次,你可以弃置一张基本牌或普通锦囊牌并摸一张牌,然后选择其他两名角色,令目标分别视为对对方使用一张你弃置的牌的同名牌', gwlangshi:'狼噬', - gwlangshi_info:'每当你造成一次伤害,你可以对一名体力值不小于受伤害角色的其他角色造一点伤害', + gwlangshi_info:'每当你造成一次伤害,你可以对一名体力值不小于受伤害角色的其他角色造1点伤害', gwjingshi:'血契', gwjingshi_info:'出牌阶段限一次,你可以猜测手牌中黑色牌最多的角色是谁,若猜对,你可以观看所有其他角色的手牌并获得任意一张', gwjingtian:'经天', - gwjingtian_info:'锁定技,牌堆顶的9张牌对你始终可见;你始终跳过摸牌阶段,改为获得3枚“经天”标记;每名角色的回合限一次,你可以在任意时间点移去一枚“经天”标记,然后获得牌堆顶的一张牌', + gwjingtian_info:'锁定技,牌堆顶的九张牌对你始终可见;你始终跳过摸牌阶段,改为获得3枚“经天”标记;每名角色的回合限一次,你可以在任意时间点移去一枚“经天”标记,然后获得牌堆顶的一张牌', gwweitu:'卫土', - gwweitu_info:'锁定技,每当你弃置牌,若你的护甲数小于3,你获得一点护甲;每当你的护甲为你累计抵消3次伤害,你获得一张随机银卡法术', + gwweitu_info:'锁定技,每当你弃置牌,若你的护甲数小于3,你获得1点护甲;每当你的护甲为你累计抵消3次伤害,你获得一张随机银卡法术', gwzhongmo:'终末', gwzhongmo_info:'锁定技,你跳过摸牌阶段,改为获得两张随机的稀有度不同的法术牌', gwfutian:'覆天', @@ -4614,16 +4614,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yangfan_info:'锁定技,每当你使用一张非装备牌,你随机重铸一张与其花色相同的手牌;若没有花色相同的手牌,改为随机重铸一张与其颜色相同的手牌', gwchenshui:'沉睡', gwchenshui_bg:'睡', - gwchenshui_info:'锁定技,你防止即将造成或受到的伤害,改为令伤害来随机源获得对方一张牌;结束阶段,若你自上次沉睡起累计发动了至少3次沉睡效果,你解除沉睡状态,对所有敌方角色造成一点伤害,然后切换至觉醒状态', + gwchenshui_info:'锁定技,你防止即将造成或受到的伤害,改为令伤害来随机源获得对方一张牌;结束阶段,若你自上次沉睡起累计发动了至少3次沉睡效果,你解除沉睡状态,对所有敌方角色造成1点伤害,然后切换至觉醒状态', gwliedi:'裂地', gwliedi_info:'锁定技,你造成的伤害+X,X为你到该角色距离的一半,向下取整;结束阶段,若你连续两轮未造成伤害,你切换至沉睡状态', julian:'巨敛', julian_info:'出牌阶段开始时,你可以摸若干张牌直到你的手牌数为全场最多或之一', gwfusheng:'复生', - gwfusheng_info:'当一名未翻面的角色进入濒死状态时,你可以令其翻面并回复一点体力,然后你与其各摸一张牌', + gwfusheng_info:'当一名未翻面的角色进入濒死状态时,你可以令其翻面并回复1点体力,然后你与其各摸一张牌', gwqinwu:'琴舞', gwqinwu2:'琴舞', - gwqinwu_info:'出牌阶段限一次,每当你使用一张基本牌,你可以令一名角色摸一张牌并获得技能【琴舞】直到其下一回合结束', + gwqinwu_info:'出牌阶段限一次,每当你使用一张基本牌,你可以令一名角色摸一张牌并获得技能〖琴舞〗直到其下一回合结束', huanshu:'幻术', huanshu2:'幻术', huanshu3:'幻术', @@ -4631,7 +4631,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gwjieyin:'结印', gwjieyin_info:'出牌阶段,你可以视为使用瘟疫、燕子药水或昆恩法印(不能重复使用同一法术),技能两轮重置一次', zhengjun:'整军', - zhengjun_info:'锁定技,每当你使用或打出一张卡牌,若这是你在本局游戏中使用或打出的第二张与之同名的牌,你增加一点体力和体力上限;结束阶段,你可以观看牌堆顶的X张牌并获得其中一张,X为你以此法增加的体力上限数', + zhengjun_info:'锁定技,每当你使用或打出一张卡牌,若这是你在本局游戏中使用或打出的第二张与之同名的牌,你增加1点体力和体力上限;结束阶段,你可以观看牌堆顶的X张牌并获得其中一张,X为你以此法增加的体力上限数', gwxuezhan:'血战', gwxuezhan_info:'准备阶段,若你的手牌数为全场最少或之一,你可以获得一张十字召唤', jielue:'劫掠', @@ -4643,16 +4643,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gwjushi2:'巨噬', gwjushi_info:'出牌阶段限一次,你可以将一名距离1以内的其他角色的一张随机牌置于你的武将牌上;当你受到伤害后,令“巨噬”牌回到原来的位置;准备阶段,你获得武将牌上的“巨噬”牌', bolang:'搏浪', - bolang_info:'准备阶段,你可以观看牌堆顶的6张牌,然后将其中至多3张移入弃牌堆;每当你造成一次伤害,你可以从弃牌堆中获得一张以此法移入弃牌堆的牌(每回合限发动一次)', + bolang_info:'准备阶段,你可以观看牌堆顶的六张牌,然后将其中至多3张移入弃牌堆;每当你造成一次伤害,你可以从弃牌堆中获得一张以此法移入弃牌堆的牌(每回合限发动一次)', lingji:'灵计', lingji_info:'出牌阶段限一次,你可以摸两张牌并弃置两张牌,若弃置的牌花色相同,你获得一张随机铜卡并展示;若弃置的牌点数相同,你获得一张随机银卡并展示', gwjinyan:'金焰', gwjinyan_info:'锁定技,准备阶段,若游戏轮数为3的倍数,你获得一张随机金卡;当游戏轮数不是3的倍数时,你防止所有伤害', gwshenyu:'神愈', - gwshenyu_info:'准备阶段,你可以令一名角色选择一项:回复一点体力,或从弃牌堆中获得一张非金法术牌(直到洗牌入牌堆前该牌不能再以此法获得)', + gwshenyu_info:'准备阶段,你可以令一名角色选择一项:回复1点体力,或从弃牌堆中获得一张非金法术牌(直到洗牌入牌堆前该牌不能再以此法获得)', junchi:'骏驰', junchi_info:'每当一名其他角色使用一张杀,若目标不是你,你可以对杀的目标使用一张牌,并摸一张牌,每回合限一次', - junchi_old_info:'当一名其他角色使用杀对一个目标结算后,该角色可以交给你一张牌,然后你可以对杀的目标使用一张牌,若如此做,你回复一点体力,杀的使用者摸一张牌', + junchi_old_info:'当一名其他角色使用杀对一个目标结算后,该角色可以交给你一张牌,然后你可以对杀的目标使用一张牌,若如此做,你回复1点体力,杀的使用者摸一张牌', gw_dudayuanshuai1:'杜达元帅', gw_dudayuanshuai1_info:'当你成为其他角色使用牌的目标时,你可以使用此牌取消之,然后获得对你使用的牌', gw_dudayuanshuai2:'杜达元帅', @@ -4662,19 +4662,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shuijian:'水箭', shuijian_info:'准备阶段,你可以弃置一张手牌视为对所有敌方角色使用一张万箭齐发', yunhuo:'陨火', - yunhuo_info:'锁定技,准备阶段,若游戏轮数为4的倍数,你令所有敌方角色随机弃置一张手牌(若没有手牌改为受到一点火焰伤害),然后在此回合结束后获得一个额外回合', + yunhuo_info:'锁定技,准备阶段,若游戏轮数为4的倍数,你令所有敌方角色随机弃置一张手牌(若没有手牌改为受到1点火焰伤害),然后在此回合结束后获得一个额外回合', yinzhang:'银杖', yinzhang_info:'出牌阶段限一次,你可以弃置一张牌,然后发现一张银卡法术', gwtianbian:'天变', gwtianbian_info:'出牌阶段开始时,你可以选择一项:随机使用一张对全场有正面效果的牌;或随机使用一张对全场有负面效果的牌', gwxiaoshou:'枭首', - gwxiaoshou_info:'出牌阶段限两次,你可以弃置一张牌对场上体力值最高(或之一)的一名角色造成一点伤害', + gwxiaoshou_info:'出牌阶段限两次,你可以弃置一张牌对场上体力值最高(或之一)的一名角色造成1点伤害', gwjiquan:'集权', gwjiquan_info:'出牌阶段限一次,你可以从任意名角色处各获得一张牌,每拿一张牌,被拿牌的角色视为对你使用一张杀', nuhou:'怒吼', - nuhou_info:'每当你受到一次伤害,你可以弃置一张牌,然后对一名随机敌人造成一点伤害并随机弃置其一张牌', + nuhou_info:'每当你受到一次伤害,你可以弃置一张牌,然后对一名随机敌人造成1点伤害并随机弃置其一张牌', shewu:'蛇舞', - shewu_info:'出牌阶段限一次,你可以弃置1至3张牌然后摸3张牌;若你弃置了至少2张牌,你本回合使用卡牌无视距离;若你弃置了3张牌,你回复一点体力', + shewu_info:'出牌阶段限一次,你可以弃置至多三张牌然后摸三张牌;若你弃置了至少两张牌,你本回合使用牌无视距离;若你弃置了三张牌,你回复1点体力', gwzhanjiang:'斩将', gwzhanjiang_info:'每轮限一次,在一名角色的准备阶段,你可以弃置一张牌,然后所有角色可以对该角色使用一张杀,出杀的角色在响应时摸一张牌,当有至少两名角色响应后终止结算', gwchuanxin:'穿心', @@ -4684,18 +4684,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huandie:'幻蝶', huandie_info:'准备阶段,你可以摸一张牌,并令任意名其他角色摸两张牌,若如此做,此回合结束时,所有手牌数大于体力值的角色需弃置两张手牌', xuezhou:'血咒', - xuezhou_info:'准备阶段,你可以选择一项效果直到下一回合开始:1. 每当一名其他角色在一个回合中首次受到伤害,该角色失去一点体力,你回复一点体力;2. 每当一名其他角色在一个回合中首次造成伤害,该角色失去一点体力,你(若不是受伤害角色)回复一点体力', + xuezhou_info:'准备阶段,你可以选择一项效果直到下一回合开始:1. 每当一名其他角色在一个回合中首次受到伤害,该角色失去1点体力,你回复1点体力;2. 每当一名其他角色在一个回合中首次造成伤害,该角色失去1点体力,你(若不是受伤害角色)回复1点体力', fayin:'法印', - fayin_info:'每当你使用一张杀,你可以弃置一张牌并获得一个随机法印效果:1. 目标随机弃置两张牌;2. 目标进入混乱状态直到下一回合开始;3. 对目标造成一点火属性伤害;4. 获得一点护甲;5. 令目标翻面并摸一张牌', + fayin_info:'每当你使用一张杀,你可以弃置一张牌并获得一个随机法印效果:1. 目标随机弃置两张牌;2. 目标进入混乱状态直到下一回合开始;3. 对目标造成1点火属性伤害;4. 获得1点护甲;5. 令目标翻面并摸一张牌', gwbaquan:'霸权', - gwbaquan_info:'出牌阶段限一次,你可以获得一名其他角色的所有牌,然后还给其等量的牌,若你归还的牌均为你得到的牌且该角色体力值不小于你,你对其造成一点伤害', + gwbaquan_info:'出牌阶段限一次,你可以获得一名其他角色的所有牌,然后还给其等量的牌,若你归还的牌均为你得到的牌且该角色体力值不小于你,你对其造成1点伤害', hunmo:'魂墨', hunmo_info:'出牌阶段,若你手牌数少于2,你可以选择一名手牌数小于2的其他角色,观看牌堆顶的两张牌,你获得一张并交给其另一张;若你手牌数不少2,你可以选择一名手牌数不少于2的其他角色,你弃置一张手牌,然后观看并弃置其一张手牌。每回合对同一名角色最多发动一次', huihun:'回魂', huihun_info:'结束阶段,你可以从弃牌堆中获得本回合使用的前两张红色牌', lanquan:'远略', lanquan_backup:'远略', - lanquan_info:'出牌阶段限一次,你可以观看牌堆顶的6张牌,并选择一张使用', + lanquan_info:'出牌阶段限一次,你可以观看牌堆顶的六张牌,并选择一张使用', chaoyong:'潮涌', chaoyong_info:'准备阶段,你可以弃置一张牌,视为对所有敌方角色使用一张南蛮入侵或万箭齐发', diff --git a/character/hearth.js b/character/hearth.js index bbd02ebd9..51dd45b0e 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -1592,7 +1592,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hen:{ mark:true, intro:{ - content:'锁定技,每当一名敌方角色回复一点体力,你失去一点体力' + content:'锁定技,每当一名敌方角色回复1点体力,你失去1点体力' }, trigger:{global:'recoverAfter'}, forced:true, @@ -2822,7 +2822,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.targets.length){ event.target=event.targets.shift(); if(event.target.countCards('he',{color:'black'})){ - event.target.chooseCard('he','交给'+get.translation(player)+'一张黑色牌,或失去一点体力',{color:'black'}).ai=function(card){ + event.target.chooseCard('he','交给'+get.translation(player)+'一张黑色牌,或失去1点体力',{color:'black'}).ai=function(card){ if(get.attitude(event.target,player)>0) return 10-get.value(card); return 7-get.value(card); } @@ -4040,7 +4040,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, prompt:function(links,player){ - return '失去一点体力,视为使用一张'+get.translation(links[0][2]); + return '失去1点体力,视为使用一张'+get.translation(links[0][2]); } }, ai:{ @@ -5353,7 +5353,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(storage,player){ if(storage){ if(player.hasSkill('byuhuo2')){ - return '不能成为其他角色卡牌的目标;在下一准备阶段,对所有其他角色造成两点火焰伤害'; + return '不能成为其他角色卡牌的目标;在下一准备阶段,对所有其他角色造成2点火焰伤害'; } return '已发动'; } @@ -8260,7 +8260,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mark:'image', nopop:true, intro:{ - content:'结束阶段,你回复一点体力' + content:'结束阶段,你回复1点体力' }, trigger:{player:'phaseEnd'}, forced:true, @@ -8347,7 +8347,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mark:'image', nopop:true, intro:{ - content:'结束阶段,你令一名其他角色回复一点体力' + content:'结束阶段,你令一名其他角色回复1点体力' }, trigger:{player:'phaseEnd'}, direct:true, @@ -8358,7 +8358,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseTarget('活力图腾:令一名其他角色回复一点体力',function(card,player,target){ + player.chooseTarget('活力图腾:令一名其他角色回复1点体力',function(card,player,target){ return target!=player&&target.hp{ + if(!player.canUse(card,target)) return false; + return get.name(card)=='sha'&&get.effect(target,card,player,player)>0; + }); + var ts=target.hp; + if(hs>=ts&&ts>1) return -2; + return -1; + } + } + }, + subSkill:{ + xiongluan:{ + trigger:{player:'phaseEnd'}, + charlotte:true, + forced:true, + popup:false, + onremove:function(player,skill){ + player.removeGaintag('dclvecheng_xiongluan'); + delete player.storage[skill]; + }, + filter:function(event,player){ + return player.getStorage('dclvecheng_xiongluan').some(i=>i.isIn()); + }, + content:function(){ + 'step 0' + event.targets=player.getStorage('dclvecheng_xiongluan').slice(); + event.targets.sortBySeat(); + 'step 1' + if(!event.targets.length){ + event.finish(); + return; + } + var target=event.targets.shift(); + event.target=target; + target.showHandcards(); + var cards=target.getCards('h','sha'); + if(!cards.length) event.redo(); + else event.forced=false; + 'step 2' + var forced=event.forced; + var prompt2=forced?'掠城:选择对'+get.translation(player)+'使用的【杀】':'掠城:是否依次对'+get.translation(player)+'使用所有的【杀】?'; + target.chooseToUse(forced,function(card,player,event){ + if(get.itemtype(card)!='card'||get.name(card)!='sha') return false; + return lib.filter.filterCard.apply(this,arguments); + },prompt2).set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ + if(target!=_status.event.sourcex&&!ui.selected.targets.contains(_status.event.sourcex)) return false; + return lib.filter.targetEnabled.apply(this,arguments); + }).set('sourcex',player); + 'step 3' + if(result.bool){ + if(target.countCards('h','sha')){ + event.forced=true; + event.goto(2); + return; + } + } + event.forced=false; + event.goto(1); + }, + intro:{ + content:'对$使用“掠城”【杀】无任何次数限制', + }, + mod:{ + cardUsableTarget:function(card,player,target){ + if(!card.cards||card.cards.length!=1) return; + if(card.name=='sha'&&card.cards[0].hasGaintag('dclvecheng_xiongluan')&&player.getStorage('dclvecheng_xiongluan').contains(target)) return true; + }, + } + } + } + }, + dczhongji:{ + audio:2, + trigger:{player:'useCard'}, + filter:function(event,player){ + if(player.countCards('h')>=player.maxHp) return false; + var suit=get.suit(event.card); + return !lib.suit.contains(suit)||!player.countCards('h',{suit:suit}); + }, + check:function(event,player){ + var num=Math.min(20,player.maxHp-player.countCards('h')); + if(num<=0) return false; + var numx=player.getHistory('useSkill',evt=>{ + return evt.skill=='dczhongji'; + }).length+1; + if(numx>num) return false; + if(_status.currentPhase!=player) return true; + if(player.hasCard(card=>{ + var suit=get.suit(card); + return player.hasValueTarget(card)&&!player.hasCard(cardx=>{ + return cardx!=card&&get.suit(cardx)==suit; + }); + })) return false; + return true; + }, + prompt2:function(event,player){ + var num=Math.min(20,player.maxHp-player.countCards('h')); + var str=num>0?'摸'+get.cnNumber(num)+'张牌,然后':''; + return str+'弃置'+get.cnNumber(1+player.getHistory('useSkill',evt=>{ + return evt.skill=='dczhongji'; + }).length)+'张牌'; + }, + content:function(){ + 'step 0' + var num=Math.min(20,player.maxHp-player.countCards('h')); + if(num>0) player.draw(num); + 'step 1' + var num=player.getHistory('useSkill',evt=>{ + return evt.skill=='dczhongji'; + }).length; + player.chooseToDiscard('螽集:请弃置'+get.cnNumber(num)+'张牌','he',true,num).set('ai',get.unuseful); + }, + ai:{ + threaten:3.2, + } + }, //乐周妃 dclingkong:{ audio:2, @@ -2264,7 +2401,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, forced:true, content:function(){ - if(Math.random()<1.25-0.25*get.distance(player,trigger.player)){ + if(Math.random()<1.25-0.25*get.distance(player,trigger.player)||get.isLuckyStar(player)){ player.logSkill('dcyouqi'); player.gain(trigger.cards.filterInD('d'),'gain2'); } @@ -2627,7 +2764,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=trigger.cards.filterInD(); if(cards.length>0) player.gain(cards,'gain2'); } - }) + }); } }, }, @@ -3397,7 +3534,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target:function(player,target){ var val=0; var bool1=!game.hasPlayer(current=>current.maxHp2&&card.name=='tao'&&target==_status.event.dying) return false; }, } @@ -4348,7 +4485,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ backup:{audio:'dcquanjian'}, damage:{ audio:'dcquanjian', - charlotte:true, selectTarget:2, filterTarget:function(card,player,target){ if(!ui.selected.targets.length) return target!=player; @@ -4393,7 +4529,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, draw:{ audio:'dcquanjian', - charlotte:true, filterTarget:function(card,player,target){ if(target==player) return false; var num=target.countCards('h'); @@ -4863,23 +4998,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } (player.isDisabledJudge()?list2:list1).push(-1); var addTable=function(list,bool){ - var table=document.createElement('div'); - table.classList.add('add-setting'); - table.style.margin='0'; - table.style.width='100%'; - table.style.position='relative'; + const adds=[]; for(var i of list){ - var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode'); - td.innerHTML=''+(i>0?get.translation('equip'+i)+'栏':'判定区')+''; - td.link=[i,bool]; - td.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.button); - for(var j in lib.element.button){ - td[j]=lib.element.button[j]; - } - table.appendChild(td); - dialog.buttons.add(td); + adds.push([[i,bool],(i>0?get.translation('equip'+i)+'栏':'判定区')]); } - dialog.content.appendChild(table); + dialog.add([adds,'tdnodes']) } if(list1.length){ dialog.addText('未废除'); @@ -4997,10 +5120,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; }, prompt2:'检索一张【无中生有】并置于牌堆顶', - check:function(event,player){ - if(!_status.currentPhase) return false; - return get.attitude(player,_status.currentPhase.next)>0; - }, content:function(){ var card=get.cardPile(function(card){ return card.name=='wuzhong'&&get.suit(card)!='diamond'; @@ -5048,7 +5167,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(evtx3.gaintag_map[i].contains('dcliuzhuan_tag')) return true; } }); - return false; + //return false; } else if(event.name=='lose'){ if(event.player!=current||event.position!=ui.discardPile) return false; @@ -5272,7 +5391,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.group!=current.group) return false; if(!ui.selected.targets.length) return true; return ui.selected.targets[0]==current; - return current==target; + //return current==target; }).set('ai',function(target){ var player=_status.event.player; return get.effect(target,{name:'sha'},player,player); @@ -6065,38 +6184,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.cardname=player.storage.dunshi_damage; player.removeSkill('dunshi_damage'); event.target=trigger.source; - event.videoId=lib.status.videoId++; - var func=function(card,id,card2,card3){ - var list=[ - '防止即将对'+card3+'造成的伤害,并令'+card+'获得一个技能名中包含“仁/义/礼/智/信”的技能', - '从〖遁世〗中删除【'+card2+'】并获得一枚“席”', - '减1点体力上限,然后摸等同于“席”数的牌', - ]; - var choiceList=ui.create.dialog('遁世:请选择两项'); - choiceList.videoId=id; - for(var i=0;i{ + return [i,item]; + }),'textbutton'] + ]); next.set('forced',true); next.set('selectButton',2); next.set('ai',function(button){ @@ -6117,10 +6216,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }); 'step 1' - if(player.isOnline2()){ - player.send('closeDialog',event.videoId); - } - event.dialog.close(); event.links=result.links.sort(); for(var i of event.links){ game.log(player,'选择了','#g【遁世】','的','#y选项'+get.cnNumber(i+1,true)); @@ -6402,6 +6497,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.directHit.push(trigger.target); } }, + ai:{ + effect:{ + player:function(card,player,target){ + if(player!==target&&get.itemtype(target)==='player'&&(card.name==='sha'||get.type(card,false)==='trick')&& + target.countCards('he')&&!target.hasSkillTag('noh')) return [1,0,1,-1]; + } + } + } }, }, }, @@ -6505,25 +6608,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.choosePlayerCard(trigger.player,true,'h'); } 'step 1' - var card=result.cards[0]; - event.card=card; - var str=get.translation(player); - if(player!=trigger.player) str+=('对'+get.translation(trigger.player)); - str+='发动了【忧恤】'; - player.showCards(card,str); - player.chooseTarget('令一名角色获得'+get.translation(card),'若其体力值为全场最少,则其回复1点体力',function(card,player,target){ - return target!=_status.event.getTrigger().player; - }).set('ai',function(target){ - var player=_status.event.player,att=get.attitude(player,target); - if(att<0) return 0; - if(target.isDamaged()&&target.isMinHp&&get.recoverEffect(target,player,player)>0) return 4*att; - return att; - }); + if(result.bool){ + var card=result.cards[0]; + event.card=card; + var str=get.translation(player); + if(player!=trigger.player) str+=('对'+get.translation(trigger.player)); + str+='发动了【忧恤】'; + player.showCards(card,str); + player.chooseTarget('令一名角色获得'+get.translation(card),'若其体力值为全场最少,则其回复1点体力',function(card,player,target){ + return target!=_status.event.getTrigger().player; + }).set('ai',function(target){ + var player=_status.event.player,att=get.attitude(player,target); + if(att<0) return 0; + if(target.isDamaged()&&target.isMinHp&&get.recoverEffect(target,player,player)>0) return 4*att; + return att; + }); + } + else event.finish(); 'step 2' - var target=result.targets[0]; - event.target=target; - player.line(target,'green'); - target.gain(card,trigger.player,'give').giver=player; + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.line(target,'green'); + target.gain(card,trigger.player,'give').giver=player; + } + else event.finish(); 'step 3' if(target.isMinHp()) target.recover(); }, @@ -7631,9 +7740,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ list.push(suit); } } - if(list.length){ - player.chooseControl(list,'cancel2').set('dialog',dialog); - } + if(list.length) player.chooseControl(list,'cancel2').set('dialog',dialog).set('list',list).set('map',map).set('ai',function(){ + let max=0,res='cancel2'; + for(let s of _status.event.list){ + let temp=0; + for(let i of _status.event.map[s]){ + temp+=get.value(i,_status.event.player)+get.sgn(get.attitude(_status.event.player,get.owner(i)))*(6-get.value(i,get.owner(i))); + } + for(let i in _status.event.map){ + if(i===s) continue; + for(let j of _status.event.map[i]){ + temp-=get.sgn(get.attitude(_status.event.player,get.owner(j)))*get.value(j,get.owner(j)); + } + } + if(temp>max){ + res=s; + max=temp; + } + } + return res; + }); else event.finish(); 'step 3' if(result.control!='cancel2'){ @@ -8390,6 +8516,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ subSkill:{ effect:{ audio:'kuanshi', + mark:true, + intro:{ + content:'每回合限一次,当$于一回合内受到第2点伤害后,其回复1点体力。' + }, trigger:{global:'damageEnd'}, forced:true, charlotte:true, @@ -9359,6 +9489,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dcdanying:{ audio:2, + mod:{ + aiOrder:function(player,card,num){ + if(num<=0 || card.name!=='sha'&&card.name!=='shan' || !player.hasCard(i=>i.hasGaintag('dcmiyun_tag'),'h')) return; + return Math.max(0.12,num/25); + } + }, + locked:false, enable:['chooseToUse','chooseToRespond'], usable:1, hiddenCard:function(player,name){ @@ -9435,11 +9572,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target:function(card,player,target){ if(_status._dcdanying_aiChecking) return; _status._dcdanying_aiChecking=true; - var eff=get.effect(target,{name:'guohe_copy2'},player,player); + let eff=get.effect(target,{name:'guohe_copy2'},player,player); delete _status._dcdanying_aiChecking; - if(eff>0) eff=-1; - else eff=1; - return [1,eff]; + return [1,get.sgn(eff)]; } } } @@ -10046,7 +10181,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ str+=strx; if(i!='jiu') str+='/'; } - str+=',然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“赂”。⒊减1点体力上限并摸X张牌(X为你的“赂”数)。'; + str+=',然后当前回合角色于本回合内下一次造成伤害时,你选择两项:⒈防止此伤害。系统从技能名中包含“仁/义/礼/智/信”字样的技能中随机选择三个其未拥有的技能,然后你令当前回合角色获得其中一个技能。⒉从〖遁世〗中删除你本次使用或打出的牌并获得一个“席”。⒊减1点体力上限并摸X张牌(X为你的“席”数)。'; return str; }, dcporui:function(player){ @@ -10068,6 +10203,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 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'], }, translate:{ re_panfeng:'潘凤', @@ -10118,7 +10255,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ remumu_info:'出牌阶段开始时,你可以选择一项:1.弃置一名其他角色装备区里的一张牌,然后你本回合可使用【杀】的次数+1;2.获得一名角色装备区里的一张牌,然后你本回合可使用【杀】的次数-1。', re_dongbai:'董白', relianzhu:'连诛', - relianzhu_info:'出牌阶段限一次,你可将一张牌正面朝上交给一名其他角色。若此牌为:红色,你摸一张牌;黑色,对方弃置两张牌或令你摸两张牌。’', + relianzhu_info:'出牌阶段限一次,你可将一张牌正面朝上交给一名其他角色。若此牌为:红色,你摸一张牌;黑色,对方弃置两张牌或令你摸两张牌。', rexiahui:'黠慧', rexiahui_info:'锁定技,①你的黑色牌不计入手牌上限。②当有其他角色获得你的黑色牌后,其于下次扣减体力前不能使用,打出,弃置这些牌。③一名其他角色的回合结束时,若其本回合失去过其所有“黠慧”牌,则其失去1点体力。', heyan:'何晏', @@ -10176,12 +10313,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ luyusheng:'陆郁生', zhente:'贞特', zhente2:'贞特', - zhente_info:'每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用与此牌颜色相同的牌;2.此牌对你无效。 ', - zhente_info_guozhan:'每回合限一次,当你成为其他角色使用黑色基本牌或黑色普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用黑色牌;2.此牌对你无效。 ', + zhente_info:'每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用与此牌颜色相同的牌;2.此牌对你无效。', + zhente_info_guozhan:'每回合限一次,当你成为其他角色使用黑色基本牌或黑色普通锦囊牌的目标后,你可令使用者选择一项:1.本回合不能再使用黑色牌;2.此牌对你无效。', zhiwei:'至微', zhiwei2:'至微', zhiwei_info:'游戏开始时/你的回合开始时,若场上没有因此法被选择过的角色存活,则你选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。', - zhiwei_info_guozhan:'你明置此武将牌时,选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。该角色死亡时,若你的两个武将牌均明置,你暗置此武将牌。 ', + zhiwei_info_guozhan:'你明置此武将牌时,选择一名其他角色。该角色造成伤害后,你摸一张牌,该角色受到伤害后,你随机弃置一张手牌。你弃牌阶段弃置的牌均被该角色获得。该角色死亡时,若你的两个武将牌均明置,你暗置此武将牌。', zhanghu:'张虎', cuijian:'摧坚', cuijian_info:'出牌阶段限一次,你可以选择一名有手牌的其他角色。若其手牌中有【闪】,则其将所有【闪】和防具牌交给你,然后你交给其等量的牌。', @@ -10228,7 +10365,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ reshejian_info:'当你成为其他角色使用牌的唯一目标后,你可以弃置至少两张手牌。若如此做,你选择一项:⒈弃置其等量的牌。⒉对其造成1点伤害。', fengxi:'冯熙', yusui:'玉碎', - yusui_info:'当你成为其他角色使用黑色牌的目标后,你可以失去1点体力,然后选择一项:⒈令其将手牌数弃置至与你相同;⒉令其失去Y点体力(Y为其的体力值减去你的体力值,不为正时不可选择)', + yusui_info:'当你成为其他角色使用黑色牌的目标后,你可以失去1点体力,然后选择一项:⒈令其将手牌数弃置至与你相同;⒉令其失去Y点体力(Y为其的体力值减去你的体力值,不为正时不可选择)。', boyan:'驳言', boyan_info:'出牌阶段限一次,你可选择一名其他角色。其将手牌摸至体力上限(至多摸至五张),然后其本回合不能使用或打出手牌。', re_dengzhi:'邓芝', @@ -10416,7 +10553,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcyouqi:'幽栖', dcyouqi_info:'锁定技。当其他角色因〖引路〗标记弃置牌后,你有一定概率获得此牌。', dcyouqi_faq:'〖幽栖〗概率
    ', - dcyouqi_faq_info:'当满足〖幽栖〗条件时,系统生成一个随机数X∈[0,1)。若X小于(1.25-0.25Y),你获得此牌(Y为你至该角色的距离)。', + dcyouqi_faq_info:'当满足〖幽栖〗条件时,系统生成一个随机数X∈[0,1)。若X小于(1.25-0.25Y),或幸运星模式已开启,你获得此牌(Y为你至该角色的距离)。', dc_sunhanhua:'孙寒华', dchuiling:'汇灵', dchuiling_info:'锁定技。当你使用牌时,若此牌颜色为弃牌堆中数量较少的颜色,你获得1枚“灵”标记。若弃牌堆中:红色牌数大于黑色牌数,你回复1点体力;黑色牌数大于红色牌数,你可以弃置一名其他角色的一张牌。', @@ -10467,7 +10604,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dczuowei_info:'当你于回合内使用牌时,你可以根据你的手牌数执行对应效果:大于X,令此牌不可被响应;等于X,对一名其他角色造成1点伤害;小于X,摸两张牌并令此技能于本回合失效(X为你装备区里牌的数量且至少为1)。', liuchongluojun:'刘宠骆俊', dcminze:'悯泽', - dcminze_info:'①出牌阶段每名角色限一次。你可以将至多两张牌名不同的牌交给一名手牌数小于你的角色,若其因此手牌数大于你,〖悯泽①〗于此阶段失效。②结束阶段,你将手牌摸至X张(X为你本回合因〖悯泽①〗失去过的牌的牌名数且至多为5)', + dcminze_info:'①出牌阶段每名角色限一次。你可以将至多两张牌名不同的牌交给一名手牌数小于你的角色,若其因此手牌数大于你,〖悯泽①〗于此阶段失效。②结束阶段,你将手牌摸至X张(X为你本回合因〖悯泽①〗失去过的牌的牌名数且至多为5)。', dcjini:'击逆', dcjini_info:'当你受到伤害后,你可以重铸至多Y张手牌(Y为你的体力上限减本回合你以此法重铸过的牌数)。若你以此法获得了【杀】,你可以对伤害来源使用一张无视距离且不可被响应的【杀】。', yuechen:'乐綝', @@ -10492,6 +10629,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dclingkong_info:'锁定技。①游戏开始时,你将所有手牌标记为“箜篌”。②你的“箜篌”牌不计入手牌上限。③当你于回合外获得牌后,系统随机将其中的一张牌标记为“箜篌”。', dcxianshu:'贤淑', dcxianshu_info:'出牌阶段,你可以将一张“箜篌”正面向上交给一名其他角色。若此牌为红色,且该角色的体力值不大于你,则其回复1点体力;若此牌为黑色,且该角色的体力值不小于你,则其失去1点体力。此技能结算完成后,你摸X张牌(X为你与其的体力值之差且至多为5)。', + dc_zhangmancheng:'张曼成', + dclvecheng:'掠城', + dclvecheng_info:'出牌阶段限一次。你可以选择一名其他角色,你于本回合对其使用当前手牌中的【杀】无任何次数限制。然后回合结束时,其展示所有手牌,若其中有【杀】,其可以选择对你依次使用其中所有的【杀】。', + dczhongji:'螽集', + dczhongji_info:'当你使用牌时,若此牌无花色或你手牌区里没有与此牌花色相同的手牌,你可以将手牌摸至体力上限并弃置X张牌(X为本回合发动〖螽集〗的次数)。', sp_baigei:'无双上将', sp_caizijiaren:'才子佳人', diff --git a/character/jiange.js b/character/jiange.js index cad3400b3..c6827d46b 100644 --- a/character/jiange.js +++ b/character/jiange.js @@ -201,7 +201,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, chiying:{ - trigger:{global:'damageBegin'}, + trigger:{global:'damageBegin2'}, check:function(event,player){ return get.attitude(player,event.player)>0; }, @@ -209,7 +209,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.num<=1) return false; return true; }, - priority:-11, content:function(){ trigger.num=1; if(trigger.source){ @@ -547,31 +546,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){ biantian3:'狂风', jizhen:'激阵', xuanlei:'玄雷', - xuanlei_info:'锁定技,准备阶段,你令所有判定区内有牌的其他角色受到1点雷电伤害', + xuanlei_info:'锁定技,准备阶段,你令所有判定区内有牌的其他角色受到1点雷电伤害。', sfanshi:'反噬', - sfanshi_info:'锁定技,结束阶段,你失去1点体力', + sfanshi_info:'锁定技,结束阶段,你失去1点体力。', konghun:'控魂', - konghun_info:'出牌阶段开始时,若你的体力值不大于1(场上存活角色数不小于6时改为2),你可以对至多X名角色各造成1点雷电伤害,然后你恢复等量体力,X为场上其他存活角色数的一半(向下取整且至多为4)', - jizhen_info:'结束阶段,你可以令所至多两名已受伤角色摸一张牌', + konghun_info:'出牌阶段开始时,若你的体力值不大于1(场上存活角色数不小于6时改为2),你可以对至多X名角色各造成1点雷电伤害,然后你恢复等量体力,X为场上其他存活角色数的一半(向下取整且至多为4)。', + jizhen_info:'结束阶段,你可以令所至多两名已受伤角色摸一张牌。', // biantian2_info:'已获得大雾标记', // biantian3_info:'已获得狂风标记', lingfeng:'灵锋', jueji:'绝汲', huodi:'惑敌', - huodi_info:'结束阶段,若你本回合内没有使用过指定其他角色为目标的卡牌,你可以弃置一名其他角色的一张牌', - jueji_info:'其他角色的摸牌阶段开始时,若其已受伤,你可以弃置一张牌令其摸牌数-1', - lingfeng_info:'摸牌阶段,你可以弃置摸牌,改为亮出牌堆顶的两张牌并获得之,若两张牌颜色不同,你可以弃置一名角色的一张牌', - biantian_info:'锁定技,准备阶段,你进行一次判定,若为红色,你可以选择至多三名角色进入“狂风”状态直到你的下一回合开始,若为黑桃,直到下个回合开始前,你处于“大雾”状态', - jingmiao_info:'每当有一名其他角色使用无懈可击,你可以弃置其一张牌', - zhinang_info:'准备阶段,你可以亮出牌堆顶的三张牌,你可以将其中锦囊或装备牌交给一名角色', - tianyu_info:'结束阶段,你可以将任意名未横置的其他角色横置', + huodi_info:'结束阶段,若你本回合内没有使用过指定其他角色为目标的卡牌,你可以弃置一名其他角色的一张牌。', + jueji_info:'其他角色的摸牌阶段开始时,若其已受伤,你可以弃置一张牌令其摸牌数-1。', + lingfeng_info:'摸牌阶段,你可以弃置摸牌,改为亮出牌堆顶的两张牌并获得之,若两张牌颜色不同,你可以弃置一名角色的一张牌。', + biantian_info:'锁定技,准备阶段,你进行一次判定,若为红色,你可以选择至多三名角色进入“狂风”状态直到你的下一回合开始,若为黑桃,直到下个回合开始前,你处于“大雾”状态。', + jingmiao_info:'每当有一名其他角色使用无懈可击,你可以弃置其一张牌。', + zhinang_info:'准备阶段,你可以亮出牌堆顶的三张牌,你可以将其中锦囊或装备牌交给一名角色。', + tianyu_info:'结束阶段,你可以将任意名未横置的其他角色横置。', juechen:'绝尘', - juechen_info:'每当你使用一张杀,可以弃置一名其他角色的一张牌(不能是杀的目标)', + juechen_info:'每当你使用一张杀,可以弃置一名其他角色的一张牌(不能是杀的目标)。', chiying:'持盈', - chiying_info:'每当一名角色受到多于1伤害时,你可以令其防止其余伤害,然后令伤害来源摸一张牌', + chiying_info:'每当一名角色受到多于1伤害时,你可以令其防止其余伤害,然后令伤害来源摸一张牌。', jingfan:'惊帆', jingfan2:'惊帆', - jingfan_info:'回合内,每当你使用一张卡牌,你的进攻距离+1;出牌阶段结束时,你可以将手牌数补至X,并指定至多X名角色令其进攻距离+1直到其下一回合结束,X为你回合内使用的卡牌数', + jingfan_info:'回合内,每当你使用一张卡牌,你的进攻距离+1;出牌阶段结束时,你可以将手牌数补至X,并指定至多X名角色令其进攻距离+1直到其下一回合结束,X为你回合内使用的卡牌数。', }, }; diff --git a/character/jsrg.js b/character/jsrg.js index 6c54f87aa..a9b05cd16 100644 --- a/character/jsrg.js +++ b/character/jsrg.js @@ -7,6 +7,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jsrg:{ jiangshanrugu_qi:['jsrg_liuhong','jsrg_hejin','jsrg_sunjian','jsrg_huangfusong','jsrg_xushao','jsrg_dongbai','jsrg_qiaoxuan','jsrg_yangbiao','jsrg_kongrong','jsrg_zhujun','jsrg_liubei','jsrg_wangyun','jsrg_liuyan','jsrg_caocao','jsrg_nanhualaoxian'], jiangshanrugu_cheng:['jsrg_sunce','jsrg_xuyou','jsrg_lvbu','jsrg_zhanghe','jsrg_zoushi','jsrg_guanyu','jsrg_chendeng','jsrg_zhenji','jsrg_zhangliao','jsrg_xugong','jsrg_chunyuqiong'], + jiangshanrugu_zhuan:['jsrg_guojia','jsrg_zhangfei','jsrg_machao','jsrg_lougui','jsrg_zhangren','jsrg_huangzhong','jsrg_xiahourong','jsrg_sunshangxiang','jsrg_pangtong','jsrg_hansui','jsrg_zhangchu','jsrg_xiahouen','jsrg_fanjiangzhangda'], }, }, character:{ @@ -38,16 +39,55 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jsrg_zhangliao:['male','qun',4,['jsrgzhengbing','jsrgtuwei'],['doublegroup:wei:qun']], jsrg_xugong:['male','wu',3,['jsrgbiaozhao','jsrgyechou']], jsrg_chunyuqiong:['male','qun',4,['jsrgcangchu','jsrgshishou']], + //转 + jsrg_guojia:['male','wei',3,['jsrgqingzi','jsrgdingce','jsrgzhenfeng']], + jsrg_zhangfei:['male','shu',5,['jsrgbaohe','jsrgxushi']], + jsrg_machao:['male','qun',4,['jsrgzhuiming','mashu']], + jsrg_lougui:['male','wei',3,['jsrgshacheng','jsrgninghan']], + jsrg_zhangren:['male','qun',4,['jsrgfuni','jsrgchuanxin']], + jsrg_huangzhong:['male','shu',4,['jsrgcuifeng','jsrgdengnan']], + jsrg_xiahourong:['male','wei',4,['jsrgfenjian']], + jsrg_sunshangxiang:['female','wu',3,['jsrgguiji','jsrgjiaohao']], + jsrg_pangtong:['male','qun',3,['jsrgmanjuan','jsrgyangming']], + jsrg_hansui:['male','qun',4,['jsrgniluan','jsrghuchou','jsrgjiemeng'],['zhu']], + jsrg_zhangchu:['female','qun',3,['jsrghuozhong','jsrgrihui']], + jsrg_xiahouen:['male','wei',4,['jsrghujian','jsrgshili'],['die_audio:tw_xiahouen']], + jsrg_fanjiangzhangda:['male','wu',5,['jsrgfushan']], }, characterIntro:{ qiaoxuan:'桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。', + lougui:'娄圭,字子伯,荆州南阳郡(治今河南南阳)人。曹魏时期著名谋士、将军,娄圭年轻时与曹操有交情,曾经随曹操平定冀州,南征刘表,击破马超,立有功劳,连曹操都感叹他的计谋。 后来曹操和他的儿子们一起出去游玩,娄圭当时也一起随行。因言语不当,被南郡(治今湖北荆州)人习授举报,曹操认为有意诽谤,遭杀害。在小说《三国演义》里,娄圭被设定为京兆人(今陕西西安),隐居终南山,道号“梦梅居士”。于第59回登场。', + xiahourong:'夏侯荣(207年—219年) ,字幼权,名将夏侯渊之子。建安二十四年(219年)汉中之战,父亲夏侯渊战死后,夏侯荣不愿逃跑,随后拔剑冲入敌阵,战死。', jsrg_caocao:'初平元年二月,董卓徙天子都长安,焚洛阳宫室,众诸侯畏卓兵强,莫敢进。操怒斥众人:“为人臣而临此境,当举义兵以诛暴乱,大众已合,诸君何疑?此一战而天下定矣!”遂引兵汴水,遇卓将徐荣,大破之。操迎天子,攻吕布,伐袁术,安汉室,拜为征西将军。是时,袁绍兼四州之地,将攻许都。操欲扫清寰宇,兴复汉室,遂屯兵官渡。既克绍,操曰:“若天命在吾,吾为周文王矣。”', jsrg_sunce:'建安五年,操、绍相拒于官渡,孙策欲阴袭许昌,迎汉帝,遂密治兵,部署诸将。未发,会为许贡门客所刺,将计就计,尽托江东于权,诈死以待天时。八月,操、绍决战,孙策亲冒矢石,斩将刈旗,得扬、豫之地。曹操败走冀、青,刘备远遁荆、益。而后历时七年,孙策三分天下已有其二,帝于洛阳,建霸王未竟之功业。权表求吴王,封为仲帝,共治天下。', + jsrg_guojia:'初平元年二月,郭嘉拜见袁绍,闻曹操怒斥众诸侯,乃对曰:“董卓于汴水或有埋伏,慎之!”曹操未从,果败于徐荣。三月,曹操与郭嘉论天下事:“使孤成大业者,必此人也。”郭嘉从破袁绍,讨谭、尚,连战数克,计定辽东。时年三十八,征乌桓归途郭嘉因劳染疾,命悬之际竟意外饮下柳皮醋水而愈。建安十三年,曹操屯兵赤壁,郭嘉识破连环之计,议上中下三策,可胜刘备。尚未献策,曹操便决意采纳上策,“奉孝之才,足胜孤百倍,卿言上策,如何不取?”由此,赤壁战后曹操尽得天下。' }, characterTitle:{ }, perfectPair:{}, card:{ + ying:{ + audio:true, + fullskin:true, + type:'basic', + enable:false, + destroy:'discardPile', + getYing:function(count){ + var cards=[]; + if(typeof count!='number') count=1; + while(count--){ + let card=game.createCard('ying','spade',1); + cards.push(card); + } + return cards; + }, + ai:{ + basic:{ + useful:0, + value:0, + }, + }, + }, }, characterFilter:{ jsrg_xushao:function(mode){ @@ -55,6 +95,1785 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //江山如故·转 + //404郭嘉 + jsrgqingzi:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return game.hasPlayer(current=>{ + if(current==player) return false; + return current.hasCard(card=>{ + return lib.filter.canBeDiscarded(card,player,current); + },'e'); + }) + }, + derivation:'xinshensu', + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrgqingzi'),'弃置任意名其他角色装备区里的一张牌,然后令这些角色获得〖神速〗直到你的下回合开始',[1,Infinity],(card,player,target)=>{ + return target!=player&&target.hasCard(card=>{ + return lib.filter.canBeDiscarded(card,player,target); + },'e'); + }).set('ai',target=>{ + var player=_status.event.player; + return target.hasCard(card=>{ + return lib.filter.canBeDiscarded(card,player,target)&&get.value(card,target)>3||target.hp==1&&get.value(card,target)>0; + }); + }); + 'step 1' + if(result.bool){ + var targets=result.targets.slice(); + targets.sortBySeat(); + event.targets=targets; + event.num=0; + player.logSkill('jsrgqingzi',targets); + player.addSkill('jsrgqingzi_clear'); + } + else event.finish(); + 'step 2' + var target=targets[num]; + if(target.hasCard(card=>{ + return lib.filter.canBeDiscarded(card,player,target); + },'e')){ + player.discardPlayerCard(target,'e',true); + target.addAdditionalSkill('jsrgqingzi_'+player.playerid,'xinshensu'); + player.markAuto('jsrgqingzi_clear',[target]); + } + event.num++; + if(event.num0; + }, + content:function(){ + 'step 0' + var targets=player.getStorage('jsrgqingzi_clear'); + if(trigger.name=='die'&&player==trigger.player){ + for(var target of targets){ + target.removeAdditionalSkill(`jsrgqingzi_${player.playerid}`); + } + player.removeSkill('jsrgqingzi_clear'); + event.finish(); + return; + } + if(trigger.name=='phase') event.targets=targets.slice(0).sortBySeat(); + else event.targets=[trigger.player]; + 'step 1' + var target=targets.shift(); + var storage=player.getStorage('jsrgqingzi_clear'); + if(storage.contains(target)){ + storage.remove(target); + target.removeAdditionalSkill(`jsrgqingzi_${player.playerid}`); + } + if(targets.length>0){ + event.redo(); + } + else if(!storage.length){ + player.removeSkill('jsrgqingzi_clear'); + } + }, + }, + }, + }, + jsrgdingce:{ + audio:2, + trigger:{player:'damageEnd'}, + filter:function(event,player){ + if(!event.source||!event.source.isIn()) return false; + return player.hasCard(card=>{ + return lib.filter.cardDiscardable(card,player,'jsrgdingce'); + }); + }, + direct:true, + content:function(){ + 'step 0' + var target=trigger.source; + event.target=target; + player.chooseToDiscard(get.prompt('jsrgdingce',target),'弃置你与其的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。').set('ai',card=>{ + if(_status.event.goon) return 6-get.value(card); + return 0; + }).set('goon',get.attitude(player,target)<0||player.getCards('h').concat(target.getCards('h')).filter(card=>{ + return get.value(card)<5.5; + }).length>=2).set('logSkill',['jsrgdingce',target]); + 'step 1' + if(result.bool){ + event.card=result.cards[0]; + if(target.countDiscardableCards(player,'h')){ + var next=player.discardPlayerCard(target,'h',true); + if(target==player) next.set('ai',button=>{ + var card=button.link; + return (get.color(card,false)==_status.event.color?7.5:5)-get.value(card); + }).set('color',get.color(event.card,false)); + } + else event.finish(); + } + else event.finish(); + 'step 2' + if(result.bool){ + var card=result.cards[0]; + if(get.color(event.card,false)==get.color(card,false)){ + game.delayex(); + player.chooseUseTarget('dongzhuxianji',true); + } + } + }, + + }, + jsrgzhenfeng:{ + audio:2, + enable:'phaseUse', + locked:false, + filter:function(event,player){ + if(!event.jsrgzhenfeng) return false; + return event.jsrgzhenfeng.some(info=>event.filterCard({ + name:info[2], + nature:info[3], + storage:{jsrgzhenfeng:true}, + isCard:true, + },player,event)); + }, + onChooseToUse:function(event){ + if(!event.jsrgzhenfeng&&!game.online){ + var str=''; + game.countPlayer(current=>{ + current.getSkills(null,false,false).forEach(skill=>{ + var info=get.info(skill); + if(!info||info.charlotte) return; + var translation=get.skillInfoTranslation(skill,current); + str+=translation; + }); + }); + event.set('jsrgzhenfeng',lib.skill.jsrgzhenfeng.getInclusion(str,null,event.player)); + } + }, + getInclusion:function(str,checkCard,player){ + let list=[]; + const names=Object.keys(lib.card); + for(const name of names){ + let type=get.type(name); + if(!['basic','trick'].includes(type)) continue; + if(player&&player.getStorage('jsrgzhenfeng_effect').includes(type)) continue; + const reg=`【${get.translation(name)}】`; + if(name=='sha'){ + if(str.includes(reg)){ + if(checkCard&&checkCard.name==name) return true; + list.push([type,'',name]); + } + for(let nature of lib.inpile_nature){ + const reg1=`【${get.translation(nature)+get.translation(name)}】`,reg2=`${get.translation(nature)}【${get.translation(name)}】`; + if(str.includes(reg1)||str.includes(reg2)){ + if(checkCard&&checkCard.name==name&&checkCard.nature==nature) return true; + list.push([type,'',name,nature]); + } + } + } + else{ + if(!str.includes(reg)) continue; + if(checkCard&&checkCard.name==name) return true; + list.push([type,'',name]); + } + } + if(checkCard) return false; + return list; + }, + chooseButton:{ + dialog:function(event,player){ + var list=event.jsrgzhenfeng.filter(info=>{ + return event.filterCard({ + name:info[2], + nature:info[3], + storage:{jsrgzhenfeng:true}, + isCard:true, + },player,event); + }); + return ui.create.dialog('针锋',[list,'vcard']); + }, + filter:function(button,player){ + return _status.event.getParent().filterCard({ + name:button.link[2], + nature:button.link[3], + storage:{jsrgzhenfeng:true}, + isCard:true, + },player,_status.event.getParent()); + }, + check:function(button){ + var player=_status.event.player; + var card={ + name:button.link[2], + nature:button.link[3], + storage:{jsrgzhenfeng:true}, + isCard:true, + }; + var eff=player.getUseValue(card); + if(['wugu','zhulu_card','yiyi','lulitongxin','lianjunshengyan','diaohulishan'].includes(button.link[2])) eff/=5; + var info=get.info(card); + if(info.toself){ + var str=player.getSkills(null,false,false).map(skill=>{ + var info=get.info(skill); + if(!info||info.charlotte) return; + return get.skillInfoTranslation(skill,player); + }).join('\n'); + if(lib.skill.jsrgzhenfeng.getInclusion(str,card)) eff+=get.damageEffect(player,player,player); + } + return eff; + }, + backup:function(links,player){ + return { + audio:'jsrgzhenfeng', + filterCard:()=>false, + selectCard:-1, + popname:true, + viewAs:{ + name:links[0][2], + nature:links[0][3], + storage:{jsrgzhenfeng:true}, + isCard:true, + }, + precontent:function(){ + delete event.result.skill; + player.logSkill('jsrgzhenfeng'); + event.getParent().addCount=false; + player.addTempSkill('jsrgzhenfeng_effect','phaseUseAfter'); + player.markAuto('jsrgzhenfeng_effect',[get.type(event.result.card)]); + }, + } + }, + prompt:function(links,player){ + return '视为使用一张'+(get.translation(links[0][3])||'')+get.translation(links[0][2]); + } + }, + mod:{ + cardUsable:function(card){ + if(card.storage&&card.storage.jsrgzhenfeng) return Infinity; + }, + targetInRange:function(card){ + if(card.storage&&card.storage.jsrgzhenfeng) return true; + }, + }, + ai:{ + order:1, + result:{ + player:1, + }, + }, + subSkill:{ + effect:{ + audio:'jsrgzhenfeng', + trigger:{ + global:'useCardToBegin', + }, + charlotte:true, + forced:true, + onremove:true, + filter:function(event,player){ + if(!event.card.storage||!event.card.storage.jsrgzhenfeng) return false; + debugger + var str=event.target.getSkills(null,false,false).map(skill=>{ + var info=get.info(skill); + if(!info||info.charlotte) return; + return get.skillInfoTranslation(skill,event.target); + }).join('\n'); + return lib.skill.jsrgzhenfeng.getInclusion(str,event.card); + }, + logTarget:'target', + content:function(){ + trigger.target.damage(); + } + }, + }, + }, + //张飞 + jsrgbaohe:{ + audio:2, + trigger:{global:'phaseUseEnd'}, + filter:function(event,player){ + return player.countCards('he')>=2&&game.hasPlayer(current=>{ + return current.inRange(event.player)&&player.canUse('sha',current,false); + }); + }, + direct:true, + content:function(){ + 'step 0' + player.chooseToDiscard(get.prompt2('jsrgbaohe'),2,'he').set('ai',card=>{ + var val=_status.event.val; + if(val>20) return 6-get.value(card); + if(val>0) return 4-get.value(card); + return 0; + }).set('val',game.filterPlayer(current=>{ + return current.inRange(trigger.player)&&player.canUse('sha',current,false); + }).map(i=>get.effect(i,{name:'sha'},player,player)).reduce((p,c)=>{ + return p+c; + },0)).set('logSkill','jsrgbaohe'); + 'step 1' + if(result.bool){ + var targets=game.filterPlayer(current=>{ + return current.inRange(trigger.player)&&player.canUse('sha',current,false); + }); + if(targets.length){ + game.delayex(); + player.useCard({name:'sha',isCard:true,storage:{jsrgbaohe:true}},targets,false); + player.addTempSkill('jsrgbaohe_add'); + } + } + }, + subSkill:{ + add:{ + audio:'jsrgbaohe', + trigger:{ + global:'useCard', + }, + charlotte:true, + forced:true, + filter:function(event,player){ + let evt=event.getParent(3),respondTo=event.respondTo; + if(evt.name!='useCard'||!Array.isArray(respondTo)||!respondTo[1].storage||!respondTo[1].storage.jsrgbaohe) return false; + return evt.targets.length>evt.num+1; + }, + logTarget:function(event){ + let evt=event.getParent(3); + return evt.targets.slice(evt.num+1); + }, + content:function(){ + 'step 0' + var evt=trigger.getParent(3); + var targets=evt.targets.slice(evt.num+1); + var map=evt.customArgs; + for(var target of targets){ + var id=target.playerid; + if(!map[id]) map[id]={}; + if(typeof map[id].extraDamage!='number'){ + map[id].extraDamage=0; + } + map[id].extraDamage++; + } + game.delayx(); + }, + } + }, + }, + jsrgxushi:{ + audio:2, + enable:'phaseUse', + usable:1, + filterCard:true, + filterTarget:lib.filter.notMe, + selectCard:[1,Infinity], + selectTarget:[1,Infinity], + position:'he', + filterOk:function(){ + return ui.selected.cards.length==ui.selected.targets.length; + }, + check:function(card){ + var player=get.player(); + if(ui.selected.cards.length>=game.countPlayer(current=>{ + return current!=player&&get.attitude(player,current)>0; + })) return 0; + return 5-get.value(card); + }, + prompt:'按顺序选择卡牌和角色,并将卡牌交给对应顺序的角色。然后你获得两倍数量的【影】。', + complexSelect:true, + multitarget:true, + multiline:true, + discard:false, + lose:false, + delay:false, + contentBefore:function(){ + event.getParent()._jsrgxushi_targets=targets.slice(); + }, + content:function(){ + 'step 0' + var targets=event.getParent()._jsrgxushi_targets; + var list=[]; + for(var i=0;i{ + var player=get.player(),target=get.event('target'),att=get.attitude(player,target)>0?1:-1; + var list=get.event('controls').map(i=>[i,target.getCards('he').map(get.value).reduce((p,c)=>p+c,0)]).sort((a,b)=>{ + return att*(a[1]-b[1]); + }); + return list[0][0]; + }).set('target',target); + var color=result.control; + if(color=='cancel2'){ + event.finish(); + return; + } + player.logSkill('jsrgzhuiming',target); + player.popup(color,color=='red'?'fire':'thunder'); + game.log(player,'声明了',color); + var prompt=`追命:${get.translation(player)}声明了${get.translation(color)}`,prompt2=`请弃置任意张牌,然后其展示你一张牌,若此牌颜色为${get.translation(color)},此【杀】不计入次数限制、不可被响应且伤害+1` + yield target.chooseToDiscard(prompt,prompt2,[1,Infinity],'he',true).set('ai',card=>{ + var color=get.event('color'),player=get.player(); + if(get.position(card)=='e'&&get.color(card)==color) return 2; + if(player.getHp()<=2&&get.color(card)==color) return Math.random()<0.5; + return 0; + }).set('color',color); + if(target.countCards('he')) result=yield player.choosePlayerCard(target,'he',true).set('ai',button=>{ + var color=get.event('color'),att=get.event('att'); + if(get.position(button.link)=='e'&&get.color(button.link)==color){ + return 100*att; + } + return 1+Math.random(); + }).set('color',color).set('att',get.attitude(player,target)>0?1:-1); + else{ + event.finish(); + return; + } + var card=result.cards[0]; + player.showCards(card,`${get.translation(target)}因【追命】被展示`); + if(get.color(card)==color){ + trigger.directHit.addArray(game.players); + var evt=trigger.getParent(); + if(evt.addCount!==false){ + evt.addCount=false; + player.getStat().card.sha--; + } + var map=trigger.getParent().customArgs; + var id=target.playerid; + if(!map[id]) map[id]={}; + if(typeof map[id].extraDamage!='number'){ + map[id].extraDamage=0; + } + map[id].extraDamage++; + game.log(trigger.card,'不计入次数限制、不可被响应、伤害+1'); + } + } + }, + //娄圭 + jsrgshacheng:{ + audio:2, + trigger:{global:'useCardAfter'}, + filter:function(event,player){ + if(event.card.name!='sha') return false; + return event.targets.some(i=>i.isIn()&&i.hasHistory('lose',evt=>evt.cards2.length))&&player.getExpansions('jsrgshacheng').length; + }, + direct:true, + group:'jsrgshacheng_build', + content:function(){ + 'step 0' + if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); + var targets=trigger.targets.filter(i=>i.isIn()&&i.hasHistory('lose',evt=>evt.cards2.length)); + player.chooseTarget(get.prompt('jsrgshacheng'),'令一名目标角色摸X张牌,然后移去一张“城”(X为对应角色本回合失去过的牌数且至多为5)',(card,player,target)=>{ + return get.event('targets').includes(target); + }).set('targets',targets).set('ai',target=>{ + return target==get.event('targetx')?1:0; + }).set('targetx',(()=>{ + var info=targets.map(target=>{ + var att=get.attitude(player,target); + return [target,att*Math.sqrt(target.getHistory('lose').map(evt=>evt.cards2.length).reduce((p,c)=>p+c,0))]; + }).sort((a,b)=>{ + return b[1]-a[1]; + })[0]; + if(info[1]<0) return null; + return info[0]; + })()); + 'step 1' + if(result.bool){ + event.target=result.targets[0]; + var cards=player.getExpansions('jsrgshacheng'); + if(cards.length==1) event._result={bool:true,links:cards}; + else player.chooseButton([`沙城:移去一张“城”`,cards],true); + } + else{ + if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} + event.finish(); + } + 'step 2' + if(_status.connectMode){game.broadcastAll(function(){delete _status.noclearcountdown;game.stopCountChoose()});} + if(result.bool){ + player.logSkill('jsrgshacheng',target); + player.loseToDiscardpile(result.links); + target.draw(Math.min(5,target.getHistory('lose').map(evt=>evt.cards2.length).reduce((p,c)=>p+c,0))); + } + }, + marktext:'城', + intro:{ + content:'expansion', + markcount:'expansion', + }, + onremove:function(player,skill){ + var cards=player.getExpansions(skill); + if(cards.length) player.loseToDiscardpile(cards); + }, + subSkill:{ + build:{ + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + locked:false, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, + content:function(){ + var cards=get.cards(2); + player.addToExpansion(cards,'gain2').gaintag.add('jsrgshacheng'); + }, + } + } + }, + jsrgninghan:{ + audio:2, + trigger:{global:'damageEnd'}, + filter:function(event,player){ + if(!event.hasNature('ice')) return false; + return event.cards&&event.cards.filterInD().length; + }, + forced:true, + global:'jsrgninghan_frozen', + content:function(){ + var cards=trigger.cards.filterInD(); + player.addToExpansion(cards,'gain2').gaintag.add('jsrgshacheng'); + }, + subSkill:{ + frozen:{ + mod:{ + cardnature:function(card,player){ + if(get.suit(card)=='club'&&card.name=='sha') return 'ice'; + }, + } + }, + }, + }, + //张任 + jsrgfuni:{ + audio:2, + trigger:{global:'roundStart'}, + group:['jsrgfuni_unlimit','jsrgfuni_zero'], + forced:true, + direct:true, + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + var count=Math.ceil(game.countPlayer()/2); + var result=yield player.chooseTarget(`伏匿:请选择至多${get.cnNumber(count)}名角色`,`令这些角色获得共计${get.cnNumber(count)}张【影】`,true,[1,count]).set('ai',target=>{ + return get.attitude(get.player(),target)+get.event().getRand(target.playerid); + }); + if(result.bool){ + var targets=result.targets.slice().sortBySeat(_status.currentPhase); + player.logSkill('jsrgfuni',targets); + } + else event.finish(); + yield null; + var num=count/targets.length; + if(num==1||num==count){ + result={ + bool:true, + links:targets.map(current=>{ + return `${num}|${current.playerid}`; + }), + }; + } + else{ + var dialog=[ + '伏匿:选择每名角色要获得的【影】数', + ]; + var len=count-targets.length+1; + for(var target of targets){ + dialog.addArray([ + `
    ${get.translation(target)}
    `, + [Array.from({length:len}).map((_,i)=>{ + return [`${i+1}|${target.playerid}`,get.cnNumber(i+1,true)]; + }),'tdnodes'], + ]); + } + result=yield player.chooseButton(dialog,true).set('filterButton',button=>{ + var total=0,info=button.link.split('|'); + var numFix=0; + for(var buttonx of ui.selected.buttons){ + var infox=buttonx.link.split('|'); + var num=parseInt(infox[0]); + total+=num; + if(infox[1]==info[1]) numFix=num; + } + return total+parseInt(info[0])-numFix<=get.event('count'); + }).set('count',count).set('filterOk',()=>{ + var total=0; + for(var buttonx of ui.selected.buttons){ + total+=parseInt(buttonx.link.split('|')[0]); + } + return total==get.event('count'); + }).set('selectButton',()=>{ + return [get.event('len'),Math.max(get.event('len'),ui.selected.buttons.length)+1]; + }).set('len',targets.length).set('custom',{ + add:{}, + replace:{ + button:function(button){ + if(!_status.event.isMine()) return; + if(button.classList.contains('selectable')==false) return; + if(button.classList.contains('selected')){ + ui.selected.buttons.remove(button); + button.classList.remove('selected'); + if(_status.multitarget||_status.event.complexSelect){ + game.uncheck(); + game.check(); + } + } + else{ + var current=button.parentNode.querySelector('.selected'); + if(current){ + ui.selected.buttons.remove(current); + current.classList.remove('selected'); + } + button.classList.add('selected'); + ui.selected.buttons.add(button); + } + game.check(); + }, + } + }).set('processAI',()=>{ + return get.event('aiResult'); + }).set('aiResult',(()=>{ + var result=targets.map(i=>{ + return [i==player?2:1,i.playerid]; + }); + var rest=count-targets.length-1; + while(rest--) result[Math.floor(Math.random()*result.length)][0]++; + return { + bool:true, + links:result.map(i=>`${i[0]}|${i[1]}`), + }; + })()); + } + if(result.bool){ + var links=result.links; + var list=[]; + for(var link of links){ + var info=link.split('|'); + var id=info[1]; + var target=(_status.connectMode?lib.playerOL:game.playerMap)[id]; + player.line(target); + var yings=lib.card.ying.getYing(parseInt(info[0])); + list.push([target,yings]); + game.log(target,'获得了',yings); + } + game.loseAsync({ + gain_list:list, + animate:'gain2', + }).setContent('gaincardMultiple'); + } + + }, + subSkill:{ + zero:{ + priority:Infinity, + mod:{ + attackRange:()=>0, + }, + }, + unlimit:{ + audio:'jsrgfuni', + trigger:{ + global:['loseAfter','loseAsyncAfter','cardsDiscardAfter'], + }, + filter:function(event,player){ + return event.getd().some(i=>get.name(i,false)=='ying'); + }, + forced:true, + content:function(){ + player.addTempSkill('jsrgfuni_buff'); + }, + }, + buff:{ + charlotte:true, + trigger:{player:'useCard1'}, + forced:true, + popup:false, + content:function(){ + trigger.directHit.addArray(game.players); + game.log(trigger.card,'不可被响应'); + }, + mark:true, + intro:{ + content:'使用牌无距离限制且不能被响应', + }, + mod:{ + targetInRange:()=>true, + }, + }, + }, + ai:{ + expose:0.15, + }, + }, + jsrgchuanxin:{ + audio:2, + trigger:{global:'phaseJieshuBegin'}, + filter:function(event,player){ + return player.countCards('hes')&&game.hasPlayer(current=>player.canUse({ + name:'sha', + storage:{jsrgchuanxin:true}, + },current)); + }, + direct:true, + content:function(){ + var next=player.chooseToUse(); + next.set('openskilldialog',`###${get.prompt('jsrgchuanxin')}###将一张牌当【杀】使用,且当一名角色受到此【杀】伤害时,此伤害+X(X为其本回合回复过的体力值)。`); + next.set('norestore',true); + next.set('_backupevent','jsrgchuanxin_backup'); + next.set('addCount',false); + next.set('logSkill','jsrgchuanxin'); + next.set('custom',{ + add:{}, + replace:{window:function(){}} + }); + next.backup('jsrgchuanxin_backup'); + }, + subSkill:{ + backup:{ + filterCard:function(card){ + return get.itemtype(card)=='card'; + }, + viewAs:{ + name:'sha', + storage:{jsrgchuanxin:true}, + }, + selectCard:1, + position:'hes', + ai1:function(card){ + var player=get.player(); + var maxVal=5.5; + if(get.name(card,false)=='ying'&&player.hasSkill('jsrgchuaxin')) maxVal-=3; + return maxVal-get.value(card); + }, + precontent:function(){ + delete event.result.skill; + player.addTempSkill('jsrgchuanxin_add'); + }, + }, + add:{ + trigger:{global:'damageBegin3'}, + filter:function(event,player){ + if(!event.card||!event.card.storage||!event.card.storage.jsrgchuanxin) return false; + if(event.getParent().type!='card') return false; + return game.hasGlobalHistory('changeHp',evt=>{ + return evt.getParent().name=='recover'&&evt.player==event.player; + }); + }, + forced:true, + charlotte:true, + content:function(){ + var num=game.getGlobalHistory('changeHp',evt=>{ + return evt.getParent().name=='recover'&&evt.player==trigger.player; + }).map(evt=>evt.num).reduce((p,c)=>p+c,0); + trigger.num+=num; + game.log(trigger.card,'的伤害+'+num); + }, + }, + }, + }, + //黄忠 + jsrgcuifeng:{ + audio:2, + enable:'phaseUse', + limited:true, + skillAnimation:true, + animationColor:'orange', + chooseButton:{ + dialog:function(event,player){ + var list=[]; + for(var name of lib.inpile){ + var info=lib.card[name]; + if(!info||info.notarget||(info.selectTarget&&info.selectTarget!=1)||!get.tag({name:name},'damage')) continue; + if(name=='sha'){ + list.push(['基本','','sha']); + for(var nature of lib.inpile_nature) list.push(['基本','',name,nature]); + } + else if(get.type(name)=='trick') list.push(['锦囊','',name]); + else if(get.type(name)=='basic') list.push(['基本','',name]); + } + return ui.create.dialog('摧锋',[list,'vcard']); + }, + filter:function(button,player){ + return _status.event.getParent().filterCard({name:button.link[2],nature:button.link[3],isCard:true,storage:{jsrgcuifeng:true},},player,_status.event.getParent()); + }, + check:function(button){ + var player=_status.event.player; + var effect=player.getUseValue({name:button.link[2],nature:button.link[3],storage:{jsrgcuifeng:true}}); + if(effect>0) return effect; + return 0; + }, + backup:function(links,player){ + return { + audio:'jsrgcuifeng', + selectCard:-1, + filterCard:()=>false, + popname:true, + viewAs:{ + name:links[0][2], + nature:links[0][3], + isCard:true, + storage:{jsrgcuifeng:true}, + }, + precontent:function(){ + player.logSkill('jsrgcuifeng'); + player.awakenSkill('jsrgcuifeng'); + delete event.result.skill; + if(!player.storage.jsrgcuifeng_check) player.when('phaseEnd').then(()=>{ + var num=0; + player.checkHistory('sourceDamage',evt=>{ + if(evt.card.storage.jsrgcuifeng) num+=evt.num; + }); + if(num==0||num>1){ + player.restoreSkill('jsrgcuifeng'); + game.log(player,'重置了','#g【摧锋】'); + } + delete player.storage.jsrgcuifeng_check; + }).translation('摧锋'); + player.setStorage('jsrgcuifeng_check',true); + } + } + }, + prompt:function(links,player){ + return '请选择'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'的目标'; + } + }, + mod:{ + targetInRange:card=>{ + if(card.storage&&card.storage.jsrgcuifeng) return true; + }, + }, + ai:{ + order:1.9, + result:{ + player:1, + }, + }, + }, + jsrgdengnan:{ + audio:2, + enable:'phaseUse', + limited:true, + skillAnimation:true, + animationColor:'orange', + chooseButton:{ + dialog:function(event,player){ + var list=[]; + for(var name of lib.inpile){ + var info=lib.card[name]; + if(!info||info.type!='trick'||info.notarget||get.tag({name:name},'damage')) continue; + list.push(['锦囊','',name]); + } + return ui.create.dialog('登难',[list,'vcard']); + }, + filter:function(button,player){ + return _status.event.getParent().filterCard({name:button.link[2],isCard:true},player,_status.event.getParent()); + }, + check:function(button){ + var player=_status.event.player; + return player.getUseValue(button.link[2]); + }, + backup:function(links,player){ + return { + audio:'jsrgdengnan', + selectCard:-1, + filterCard:()=>false, + popname:true, + viewAs:{ + name:links[0][2], + isCard:true, + storage:{jsrgdengnan:true}, + }, + precontent:function(){ + player.logSkill('jsrgdengnan'); + player.awakenSkill('jsrgdengnan'); + delete event.result.skill; + if(!player.storage.jsrgdengnan_check) player.when('phaseEnd').then(()=>{ + var targets=[]; + player.checkHistory('useCard',evt=>{ + if(evt.card.storage.jsrgdengnan) targets.addArray(evt.targets); + }); + if(targets.every(current=>{ + return current.hasHistory('damage'); + })){ + player.restoreSkill('jsrgdengnan'); + game.log(player,'重置了','#g【登难】'); + } + delete player.storage.jsrgdengnan_check; + }).translation('登难'); + player.setStorage('jsrgdengnan_check',true); + } + } + }, + prompt:function(links,player){ + return '请选择'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'的目标'; + } + }, + ai:{ + order:2, + result:{ + player:1, + }, + }, + }, + //夏侯荣 + jsrgfenjian:{ + audio:2, + enable:'chooseToUse', + locked:false, + filter:function(event,player){ + return ['juedou','tao'].some(name=>{ + return !player.getStorage('jsrgfenjian_used').includes(name)&&event.filterCard({ + name:name, + isCard:true, + storage:{jsrgfenjian:true}, + },player,event); + }); + }, + hiddenCard:function(player,name){ + if(['juedou','tao'].some(i=>i==name&&!player.getStorage('jsrgfenjian_used').includes(name))) return true; + return false; + }, + chooseButton:{ + dialog:function(event,player){ + var dialog=ui.create.dialog('奋剑',[['juedou','tao'].filter(name=>!player.getStorage('jsrgfenjian_used').includes(name)),'vcard']); + dialog.direct=true; + return dialog; + }, + filter:function(button,player){ + var evt=_status.event.getParent(); + return evt.filterCard({ + name:button.link[2], + isCard:true, + storage:{jsrgfenjian:true}, + },player,evt); + }, + check:function(button){ + return _status.event.player.getUseValue({ + name:button.link[2], + isCard:true, + storage:{jsrgfenjian:true}, + }); + }, + backup:function(links){ + return { + audio:'jsrgfenjian', + viewAs:{ + name:links[0][2], + isCard:true, + storage:{jsrgfenjian:true}, + }, + filterCard:()=>false, + selectCard:-1, + precontent:function(){ + player.logSkill('jsrgfenjian'); + delete event.result.skill; + player.addTempSkill('jsrgfenjian_effect'); + player.addMark('jsrgfenjian_effect',1,false); + if(!player.storage.jsrgfenjian_used) player.when({global:'phaseAfter'}).then(()=>{ + delete player.storage.jsrgfenjian_used; + }); + player.markAuto('jsrgfenjian_used',[event.result.card.name]); + }, + } + }, + prompt:function(links){ + return '奋剑:令你本回合受到的伤害+1,视为使用'+get.translation(links[0][2]); + }, + }, + mod:{ + targetEnabled:function(card,player,target){ + if(player==target&&card.storage&&card.storage.jsrgfenjian) return false; + }, + }, + ai:{ + order:function(item,player){ + return Math.max(get.order({name:'juedou'}),get.order({name:'tao'}))+0.2; + }, + result:{player:1}, + }, + subSkill:{ + effect:{ + audio:'jsrgfenjian', + charlotte:true, + trigger:{player:'damageBegin1'}, + forced:true, + onremove:true, + content:function(){ + trigger.num+=player.countMark('jsrgfenjian_effect'); + }, + intro:{content:'本回合受到的伤害+#'}, + }, + }, + }, + //孙尚香 + jsrgguiji:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + if(player.hasSkill('jsrgguiji_used')) return false; + return game.hasPlayer(current=>lib.skill.jsrgguiji.filterTarget('keiki',player,current)); + }, + filterTarget:function(card,player,target){ + return target.countCards('h')get.value(i)).reduce((p,c)=>p+c,0); + var val2=target.getCards('h').map(i=>get.value(i)).reduce((p,c)=>p+c,0); + return val-val2; + } + } + }, + subSkill:{ + used:{charlotte:true}, + swapback:{ + audio:'jsrgguiji', + trigger:{ + global:['phaseUseEnd','dieAfter'], + }, + filter:function(event,player){ + return player.getStorage('jsrgguiji_swapback').includes(event.player); + }, + charlotte:true, + direct:true, + check:function(event,player){ + return player.getCards('h').map(i=>get.value(i)).reduce((p,c)=>p+c,0)get.value(i)).reduce((p,c)=>p+c,0)+4*Math.random(); + }, + content:function(){ + 'step 0' + if(trigger.name=='phaseUse'){ + player.chooseBool(get.prompt('jsrgguiji_swapback',trigger.player),'与其交换手牌。').set('ai',()=>{ + return get.event('bool'); + }).set('bool',lib.skill.jsrgguiji_swapback.check(trigger,player)>0); + } + else{ + player.unmarkAuto('jsrgguiji_swapback',[trigger.player]); + event.finish(); + } + 'step 1' + if(result.bool){ + player.logSkill('jsrgguiji_swapback',trigger.player); + player.swapHandcards(trigger.player); + player.unmarkAuto('jsrgguiji_swapback',[trigger.player]); + } + }, + intro:{ + content:'$的下个出牌阶段结束时,你可以与其交换手牌' + }, + }, + }, + }, + jsrgjiaohao:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return [1,2,3,4,5].some(i=>player.countEmptySlot(i)); + }, + forced:true, + locked:false, + global:'jsrgjiaohao_g', + content:function(){ + 'step 0' + var count=Math.ceil([1,2,3,4,5].map(i=>player.countEmptySlot(i)).reduce((p,c)=>p+c,0)/2); + player.gain(lib.card.ying.getYing(count),'gain2'); + }, + subSkill:{ + g:{ + audio:'jsrgjiaohao', + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return game.hasPlayer(current=>{ + if(current==player||!current.hasSkill('jsrgjiaohao')) return false; + return player.hasCard(card=>{ + return get.type(card)=='equip'&¤t.canEquip(card); + }); + }); + }, + filterTarget:function(card,player,target){ + if(target.isMin()) return false; + return target!=player&&target.hasSkill('jsrgjiaohao')&&target.canEquip(card); + }, + selectTarget:function(){ + var num=game.countPlayer(current=>{ + return current.hasSkill('jsrgjiaohao'); + }); + return num>1?1:-1; + }, + filterCard:function(card){ + return get.type(card)=='equip'; + }, + check:function(card){ + var player=get.player(); + if(player.countCards('he',{subtype:get.subtype(card)})>1){ + return 11-get.equipValue(card); + } + return 6-get.value(card); + }, + prompt:function(){ + var list=game.filterPlayer(current=>{ + return current.hasSkill('jsrgjiaohao'); + }); + return `将一张装备牌置于${get.translation(list)}${list.length>1?'中的一人':''}的装备区`; + }, + discard:false, + lose:false, + prepare:function(cards,player,targets){ + player.$give(cards,targets[0],false); + }, + content:function(){ + target.equip(cards[0]); + }, + ai:{ + order:10, + result:{ + target:function(player,target){ + var card=ui.selected.cards[0]; + if(card) return get.effect(target,card,target,target); + return 0; + }, + }, + }, + }, + } + }, + //庞统 + jsrgmanjuan:{ + audio:2, + trigger:{ + player:'loseEnd', + global:['equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], + }, + filter:function(event,player){ + return (player.countCards('h')==0)^player.hasSkill('jsrgmanjuan_in'); + }, + forced:true, + firstDo:true, + silent:true, + content:function(){ + 'step 0' + if(!player.countCards('h')){ + var cards=[]; + game.checkGlobalHistory('cardMove',evt=>{ + if(evt.name=='lose'&&evt.position==ui.discardPile||evt.name=='cardsDiscard'){ + cards.addArray(evt.cards.filterInD('d')); + } + }); + var cardsx=cards.map(card=>{ + var cardx=ui.create.card(); + cardx.init(get.cardInfo(card)); + cardx._cardid=card.cardid; + return cardx; + }); + player.directgains(cardsx,null,'jsrgmanjuan'); + player.addSkill('jsrgmanjuan_in'); + } + else{ + player.removeSkill('jsrgmanjuan_in'); + } + }, + subSkill:{ + in:{ + audio:'jsrgmanjuan', + trigger:{ + global:['loseAfter','loseAsyncAfter','cardsDiscardAfter','equipAfter'], + }, + forced:true, + locked:false, + silent:true, + filter:function(event,player){ + var cards=event.getd(); + return cards.length; + }, + onremove:function(player){ + var cards2=player.getCards('s',card=>{ + return card.hasGaintag('jsrgmanjuan'); + }); + if(player.isOnline2()){ + player.send(function(cards,player){ + cards.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + },cards2,player); + } + cards2.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + }, + group:['jsrgmanjuan_use','jsrgmanjuan_lose'], + content:function(){ + var cards=[]; + var idList=player.getCards('s',card=>card.hasGaintag('jsrgmanjuan')).map(i=>i._cardid); + game.checkGlobalHistory('cardMove',evt=>{ + if(evt.name=='lose'&&evt.position==ui.discardPile||evt.name=='cardsDiscard'){ + cards.addArray(evt.cards.filter(i=>get.position(i,true)=='d'&&!idList.includes(i.cardid))); + } + }); + var cards2=cards.map(card=>{ + var cardx=ui.create.card(); + cardx.init(get.cardInfo(card)); + cardx._cardid=card.cardid; + return cardx; + }); + player.directgains(cards2,null,'jsrgmanjuan'); + }, + mod:{ + cardEnabled2:function(card,player){ + if(get.itemtype(card)=='card'&&card.hasGaintag('jsrgmanjuan')&&player.getStorage('jsrgmanjuan_used').includes(get.number(card,false))) return false; + }, + }, + }, + use:{ + trigger:{ + player:['useCardBefore','respondBefore'], + }, + charlotte:true, + forced:true, + popup:false, + firstDo:true, + filter:function(event,player){ + var cards=player.getCards('s',card=>card.hasGaintag('jsrgmanjuan')&&card._cardid); + return event.cards&&event.cards.some(card=>{ + return cards.includes(card); + }); + }, + content:function(){ + var idList=player.getCards('s',card=>card.hasGaintag('jsrgmanjuan')).map(i=>i._cardid); + var cards=[]; + game.checkGlobalHistory('cardMove',evt=>{ + if(evt.name=='lose'&&evt.position==ui.discardPile||evt.name=='cardsDiscard'){ + cards.addArray(evt.cards.filter(i=>idList.includes(i.cardid))); + } + }); + var cards2=[]; + for(var card of trigger.cards){ + var cardx=cards.find(cardx=>cardx.cardid==card._cardid); + if(cardx) cards2.push(cardx); + } + var cards3=trigger.cards.slice(); + trigger.cards=cards2; + trigger.card.cards=cards2; + if(player.isOnline2()){ + player.send(function(cards,player){ + cards.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + },cards3,player); + } + cards3.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + if(!player.storage.jsrgmanjuan_used){ + player.when({global:'phaseAfter'}) + .then(()=>{ + delete player.storage.jsrgmanjuan_used; + }) + } + player.markAuto('jsrgmanjuan_used',cards3.map(card=>get.number(card,false))); + }, + }, + lose:{ + trigger:{ + global:['loseEnd','equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd','cardsGotoOrderingBegin','phaseAfter'], + }, + charlotte:true, + forced:true, + popup:false, + firstDo:true, + filter:function(event,player){ + if(event.name=='phase') return true; + var idList=player.getCards('s',card=>card.hasGaintag('jsrgmanjuan')).map(i=>i._cardid); + return event.cards&&event.cards.some(card=>{ + return idList.includes(card.cardid); + }); + }, + content:function(){ + var cards2; + if(trigger.name=='phase'){ + cards2=player.getCards('s',card=>{ + return card.hasGaintag('jsrgmanjuan'); + }) + } + else{ + var idList=[]; + game.checkGlobalHistory('cardMove',evt=>{ + if(evt.name=='lose'&&evt.position==ui.discardPile||evt.name=='cardsDiscard'){ + idList.addArray(evt.cards.filter(i=>get.position(i,true)=='d').map(i=>i.cardid)); + } + }); + cards2=player.getCards('s',card=>{ + return card.hasGaintag('jsrgmanjuan')&&!idList.includes(card._cardid); + }); + } + if(player.isOnline2()){ + player.send(function(cards,player){ + cards.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + },cards2,player); + } + cards2.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + } + }, + } + }, + jsrgyangming:{ + audio:2, + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return game.hasPlayer(current=>{ + return player.canCompare(current); + }); + }, + filterTarget:function(card,player,current){ + return player.canCompare(current); + }, + content:function(){ + 'step 0' + event.num=0; + 'step 1' + player.chooseToCompare(target).set('small',get.attitude(player,target)>0&&(player.countCards('h',card=>{ + return get.value(card)<6; + })<=1||target.countCards('h',card=>{ + return get.value(card)<6; + })<=1)); + 'step 2' + if(result.winner!=target){ + if(!player.canCompare(target)) event._result={bool:false}; + else player.chooseBool('是否与其重复此拼点流程?').set('ai',()=>get.event('bool')).set('bool',get.effect(target,'jsrgyangming',player,player)>0); + event.num++; + } + else{ + if(event.num) target.draw(event.num); + player.recover(); + event.finish(); + } + 'step 3' + if(result.bool){ + event.goto(1); + } + }, + ai:{ + order:1, + expose:0.15, + result:{ + target:function(player,target){ + var maxnum=0; + var cards2=target.getCards('h'); + for(var i=0;imaxnum){ + maxnum=get.number(cards2[i]); + } + } + if(maxnum>10) maxnum=10; + if(maxnum<5&&cards2.length>1) maxnum=5; + var cards=player.getCards('h'); + for(var i=0;i{ + return current.hasAllHistory('sourceDamage',evt=>evt.player==player); + }); + var undamaged=game.filterPlayer().removeArray(damaged); + player.chooseCardTarget({ + prompt:get.prompt('jsrgniluan'), + prompt2:`${undamaged.length?'选择一张牌弃置并选择一名未对你造成过伤害的角色,你对其造成1点伤害':''}${undamaged.length&&damaged.length?';
    或':''}${damaged.length?'仅选择一名对你造成过伤害的角色,你令其摸两张牌':''}。`, + damaged:damaged, + aiTarget:(()=>{ + var info=game.filterPlayer().map(current=>{ + var damage=undamaged.includes(current); + var card={name:damage?'damage':'wuzhong'}; + return [current,get.effect(current,card,player,player)/(damage?1.5:1)]; + }).sort((a,b)=>b[1]-a[1])[0]; + if(info[1]>0) return info[0]; + return null; + })(), + filterCard:lib.filter.cardDiscardable, + selectCard:function(){ + if(get.event('damaged').length==0) return 1; + if(get.event('damaged').length==game.countPlayer()) return 0; + return [0,1]; + }, + position:'he', + filterTarget:function(card,player,target){ + var damaged=get.event('damaged'); + return damaged.includes(target)^(ui.selected.cards.length>0); + }, + selectTarget:1, + ai1:function(card){ + if(get.event('damaged').includes(get.event('aiTarget'))) return 0; + return 6-get.value(card); + }, + ai2:function(target){ + return target==get.event('aiTarget')?10:0; + }, + }); + 'step 1' + if(result.bool){ + var cards=result.cards,target=result.targets[0]; + player.logSkill('jsrgniluan',target); + if(cards&&cards.length){ + player.discard(cards); + game.delayex(); + target.damage(); + } + else{ + target.draw(2); + } + } + }, + }, + jsrghuchou:{ + audio:2, + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + const history=_status.globalHistory; + for(let i=history.length-1;i>=0;i--){ + let evts=history[i]['useCard']; + for(let j=evts.length-1;j>=0;j--){ + var evt=evts[j]; + let card=evt.card,targets=evt.targets; + if(!get.tag(card,'damage')||!targets.includes(player)) continue; + return event.player==evt.player; + } + } + return false; + }, + forced:true, + content:function(){ + trigger.num++; + }, + }, + jsrgjiemeng:{ + audio:2, + zhuSkill:true, + forced:true, + global:'jsrgjiemeng_effect', + subSkill:{ + effect:{ + mod:{ + globalFrom:function(from,to,distance){ + if(from.group!='qun') return; + if(to.hasZhuSkill('jsrgjiemeng')) return; + return distance-game.countPlayer(current=>current.group=='qun'); + }, + }, + }, + }, + }, + //张楚 + jsrghuozhong:{ + audio:'dcjizhong', + global:'jsrghuozhong_g', + subSkill:{ + g:{ + audio:'dcjizhong', + enable:'phaseUse', + usable:1, + filter:function (event,player){ + if(player.hasJudge('bingliang')) return false; + if(!game.hasPlayer(current=>current.hasSkill('jsrghuozhong'))) return false; + return player.countCards('hes',card=>get.color(card)=='black'&&get.type2(card)!='trick')>0; + }, + viewAs:{name:'bingliang'}, + position:'hes', + discard:false, + prompt:function(){ + var list=game.filterPlayer(target=>{ + return target.hasSkill('jsrghuozhong'); + }); + return `将一张黑色非锦囊牌当【兵粮寸断】置于自己的判定区,然后令${get.translation(list)}${list.length>1?'中的一人':''}摸两张牌。`; + }, + filterCard:function(card,player,event){ + return get.color(card)=='black'&&get.type2(card)!='trick'&&player.canAddJudge({name:'bingliang',cards:[card]}); + }, + selectTarget:-1, + filterTarget:function (card,player,target){ + return player==target; + }, + check:function(card){ + return 6-get.value(card); + }, + precontent:function*(event,map){ + var player=map.player; + var targets=game.filterPlayer(current=>current.hasSkill('jsrghuozhong')); + var result; + if(targets.length) result={bool:true,targets:targets}; + else result=yield player.chooseTarget('请选择一名传教士,发动其的【惑众】',true,(card,player,target)=>{ + return get.event('targets').includes(target); + }).set('targets',targets); + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrghuozhong',target); + var next=game.createEvent('jsrghuozhong_draw',false); + next.set('player',player); + next.set('target',target); + event.next.remove(next); + event.getParent().after.push(next); + next.setContent(function(){ + target.draw(2); + }); + } + }, + ai:{ + result:{ + player:function(player){ + if(game.hasPlayer(current=>get.attitude(player,current)>2&¤t.hasSkill('jsrghuozhong'))) return 1; + return 0; + }, + }, + order:9, + }, + }, + }, + }, + jsrgrihui:{ + audio:'dcrihui', + trigger:{source:'damageSource'}, + filter:function(event,player){ + return event.getParent().type=='card'&&event.card&&event.card.name=='sha'&&game.hasPlayer(current=>{ + return current!=player&¤t.countCards('j'); + }); + }, + prompt:'是否发动【日彗】?', + prompt2:function(event,player){ + var list=game.filterPlayer(current=>{ + return current!=player&¤t.countCards('j'); + }); + return `令${get.translation(list)}${list.length>1?'各':''}摸一张牌。`; + }, + logTarget:function(event,player){ + return game.filterPlayer(current=>{ + return current!=player&¤t.countCards('j'); + }); + }, + group:'jsrgrihui_sha', + content:function(){ + game.asyncDraw(lib.skill.jsrgrihui.logTarget(trigger,player)); + }, + mod:{ + cardUsableTarget:function(card,player,target){ + if(card.name=='sha'&&!player.getStorage('jsrgrihui_targeted').includes(target)) return true; + }, + }, + subSkill:{ + sha:{ + trigger:{player:'useCardToPlayered'}, + forced:true, + silent:true, + firstDo:true, + content:function(){ + player.addTempSkill('jsrgrihui_targeted'); + player.markAuto('jsrgrihui_targeted',trigger.target); + } + }, + targeted:{ + charlotte:true, + onremove:true, + }, + }, + }, + //夏侯恩 + jsrghujian:{ + audio:'twfujian', + trigger:{ + global:'phaseEnd', + }, + filter:function(event,player){ + if(!Array.from(ui.discardPile.childNodes).some(i=>i.name=='chixueqingfeng')) return false; + return game.hasGlobalHistory('everything',evt=>['useCard','respond'].includes(evt.name)&&evt.player.isIn()); + }, + popup:false, + forced:true, + locked:false, + group:'jsrghujian_begin', + content:function(){ + 'step 0' + var cards=Array.from(ui.discardPile.childNodes).filter(i=>i.name=='chixueqingfeng'); + if(cards.length){ + event.cards=cards; + var history=_status.globalHistory,target=null; + for(var i=history.length-1;i>=0&&!target;i--){ + var evts=history[i]['everything']; + for(var j=evts.length-1;j>=0;j--){ + var evt=evts[j]; + if(!['useCard','respond'].includes(evt.name)) continue; + target=evt.player; + break; + } + } + if(target&&target.isIn()){ + event.target=target; + target.chooseBool(`是否响应${get.translation(player)}的【护剑】?`,'获得弃牌堆里的【赤血青锋】。'); + } + else event.finish(); + } + else event.finish(); + 'step 1' + if(result.bool){ + player.logSkill('jsrghujian'); + player.line(target); + target.gain(cards,'gain2'); + } + }, + subSkill:{ + begin:{ + audio:'twfujian', + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + locked:false, + filter:function(event,player){ + return event.name!='phase'||game.phaseNumber==0; + }, + content:function(){ + player.gain(game.createCard2('chixueqingfeng','spade',6),'gain2'); + } + }, + }, + }, + jsrgshili:{ + audio:'twjianwei', + enable:'phaseUse', + usable:1, + viewAs:{ + name:'juedou', + }, + filterCard:{type:'equip'}, + position:'hs', + viewAsFilter:function(player){ + return player.hasCard({type:'equip'},'hs'); + }, + check:function(card){ + return (get.name(card,false)=='chixueqingfeng'?20:12)-_status.event.player.getUseValue(card); + }, + ai:{ + order:0.001, + }, + }, + //范疆张达 + jsrgfushan:{ + audio:2, + trigger:{player:'phaseUseBegin'}, + forced:true, + locked:false, + filter:function(event,player){ + return game.hasPlayer(i=>i!=player); + }, + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + var targets=game.filterPlayer(i=>i!=player); + for(var target of targets){ + var att=get.attitude(target,player); + var result=yield target.chooseCard('he',`负山:是否交给${get.translation(player)}一张牌?`,`若如此做,其此阶段使用【杀】的次数上限+1`).set('att',att).set('ai',card=>{ + if(!get.event('goon')) return -get.value(card); + var isSha=get.name(card,get.event('target'))=='sha'; + if(get.event('att')<0) return (isSha?0:5)-get.value(card); + return (isSha?10:5.5)-get.value(card); + }).set('goon',att>0&&player.countCards('sha')>player.getCardUsable('sha',true)||att<0&&!player.hasSkill('jsrgfushan_sha')).set('target',player); + if(result.bool){ + target.give(result.cards,player); + target.line(player); + player.addTempSkill('jsrgfushan_sha','phaseAfter'); + player.addMark('jsrgfushan_sha',1,false); + player.markAuto('jsrgfushan_given',target); + } + } + player.when('phaseUseAfter').filter((evt=>evt==trigger)).then(()=>{ + player.logSkill('jsrgfushan'); + if(player.getCardUsable('sha',true)>player.getHistory('useCard',evt=>{ + return evt.getParent('phaseUse')==trigger&&evt.card.name=='sha'&&evt.addCount!==false; + }).length&&player.storage.jsrgfushan_given&&player.storage.jsrgfushan_given.every(i=>i.isIn())){ + player.loseHp(2); + } + else{ + player.drawTo(player.maxHp); + } + delete player.storage.jsrgfushan_given; + }); + }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + marktext:'负', + intro:{content:'使用【杀】的次数上限+#'}, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('jsrgfushan_sha'); + }, + }, + }, + }, + }, //江山如故·承 //404孙策 jsrgduxing:{ @@ -227,7 +2046,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.isOnline()){ player.storage.jsrgbashiing=true; var list=['sha','shan'].filter(name=>trigger.filterCard({name:name},player,trigger)); - var names=list.map(i=>'【'+i+'】').join('或'); + var names=list.map(i=>'【'+get.translation(i)+'】').join('或'); var next=target.chooseToRespond('是否替'+get.translation(player)+'打出一张'+names+'?',{name:list}); next.set('ai',function(){ var event=_status.event; @@ -633,9 +2452,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ isCard:true, }, filter:function(event,player){ + if(!player.countCards('he',card=>_status.connectMode||get.type(card)!='basic')) return false; return player.group=='qun'&&!player.hasSkill('jsrgqiongtu_check'); }, viewAsFilter:function(player){ + if(!player.countCards('he',card=>_status.connectMode||get.type(card)!='basic')) return false; return player.group=='qun'&&!player.hasSkill('jsrgqiongtu_check'); }, filterCard:function(card){ @@ -2168,14 +3989,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ prompt2:'你可以获得其他所有群势力角色的各一张牌', logTarget:function(event,player){ return game.filterPlayer(current=>{ - return current.group=='qun'&¤t.countGainableCards(player,'h')>0&¤t!=player; + return current.group=='qun'&¤t.countGainableCards(player,'he')>0&¤t!=player; }) }, content:function(){ game.filterPlayer(current=>{ return current.group=='qun'&¤t!=player; }).sortBySeat().forEach(i=>{ - player.gainPlayerCard(i,'h',true); + player.gainPlayerCard(i,'he',true); }); }, group:'jsrgjulian_draw', @@ -2810,7 +4631,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); var eff=targets.reduce((p,c)=>{ return p+get.effect(c,{name:'guohe'},player,player); - }) + },0) if(ui.selected.cards.length) eff+=get.value(ui.selected.cards[0],target); return eff; } @@ -4183,8 +6004,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jsrgtushe_info:'当你使用非装备牌指定目标后,你可以展示所有手牌(无牌则不展示)。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。', jsrgtongjue:'通绝', jsrgtongjue_info:'主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。', - jsrg_caocao:'起曹操', - jsrg_caocao_prefix:'起', + jsrg_caocao:'梦曹操', + jsrg_caocao_prefix:'梦', jsrgzhenglve:'政略', jsrgzhenglve_info:'①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为至多两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。', jsrghuilie:'会猎', @@ -4204,8 +6025,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbpingjian:'评鉴', sbpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,则你于此技能结算结束时摸一张牌。', //江山如故·承 - jsrg_sunce:'承孙策', - jsrg_sunce_prefix:'承', + jsrg_sunce:'梦孙策', + jsrg_sunce_prefix:'梦', jsrgduxing:'独行', jsrgduxing_info:'出牌阶段限一次。你可以视为使用一张可以指定任意名目标角色的【决斗】,且所有目标角色的手牌均视为【杀】直到此牌结算结束。', jsrgzhiheng:'猘横', @@ -4278,9 +6099,90 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jsrgcangchu_info:'一名角色的结束阶段,你可以令至多X名角色各摸一张牌,若X大于存活角色数,则改为各摸两张牌(X为你于此回合得到的牌数)。', jsrgshishou:'失守', jsrgshishou_info:'锁定技。①当你使用【酒】时,你摸三张牌,然后你本回合不能再使用牌。②当你受到火焰伤害后,你令〖仓储〗失效直到你的下回合结束后。', + //江山如故·转 + ying:'影', + ying_info:'当此牌进入弃牌堆后,系统将此牌移出游戏。', + jsrg_guojia:'梦郭嘉', + jsrg_guojia_prefix:'梦', + jsrgqingzi:'轻辎', + jsrgqingzi_info:'准备阶段,你可以弃置任意名其他角色装备区里的各一张牌,然后令这些角色获得〖神速〗直到你的下回合开始。', + jsrgdingce:'定策', + jsrgdingce_info:'当你受到伤害后,你可以依次弃置你与伤害来源的各一张手牌。若这两张牌颜色相同,你视为使用一张【洞烛先机】。', + jsrgzhenfeng:'针锋', + jsrgzhenfeng_info:'出牌阶段每种类别各限一次。你可以视为使用一张存活角色的技能描述中包含的基本牌或普通锦囊牌(无距离和次数限制)。当此牌对技能描述中包含此牌的角色生效时,你对其造成1点伤害。', + jsrg_zhangfei:'转张飞', + jsrg_zhangfei_prefix:'转', + jsrgbaohe:'暴喝', + jsrgbaohe_info:'一名角色的出牌阶段结束时,你可以弃置两张牌,然后视为你对攻击范围内包含其的所有角色使用一张【杀】。当一名角色使用牌响应此【杀】后,此【杀】对后续目标角色造成的伤害+1。', + jsrgxushi:'虚势', + jsrgxushi_info:'出牌阶段限一次。你可以交给任意名角色各一张牌,然后你获得两倍数量的【影】。', + jsrg_machao:'转马超', + jsrg_machao_prefix:'转', + jsrgzhuiming:'追命', + jsrgzhuiming_info:'当你使用【杀】指定唯一目标后,你可以声明一种颜色并令目标角色弃置任意张牌,然后你展示目标角色一张牌。若此牌颜色与你声明的颜色相同,则此【杀】不计入次数限制、不可被响应且伤害+1。', + jsrg_lougui:'转娄圭', + jsrg_lougui_prefix:'转', + jsrgshacheng:'沙城', + jsrgshacheng_info:'①游戏开始时,你将牌堆顶的两张牌置于武将牌上,称为“城”。②当一名角色使用【杀】结算结束后,你可以移去一张“城”,令此牌的其中一名目标角色摸X张牌(X为该角色本回合失去过的牌数且至多为5)。', + jsrgninghan:'凝寒', + jsrgninghan_info:'锁定技。①所有角色手牌中的♣【杀】均视为冰【杀】。②当一名角色受到冰冻伤害后,你将造成此伤害的牌对应的实体牌置入“城”。', + jsrg_zhangren:'转张任', + jsrg_zhangren_prefix:'转', + jsrgfuni:'伏匿', + jsrgfuni_info:'锁定技。①你的攻击范围终值为0。②一轮游戏开始时,你令任意名角色获得共计X张【影】(X为存活角色数的一半,向上取整)。③当有牌进入弃牌堆后,若其中有【影】,你于本回合使用牌无距离限制且不能被响应。', + jsrgchuanxin:'穿心', + jsrgchuanxin_info:'一名角色的结束阶段,你可以将一张牌当【杀】使用。当一名角色受到渠道为此【杀】的伤害时,此伤害+Y(Y为其本回合回复过的体力值)。', + jsrg_huangzhong:'转黄忠', + jsrg_huangzhong_prefix:'转', + jsrgcuifeng:'摧锋', + jsrgcuifeng_info:'限定技。出牌阶段,你可以视为使用一张单目标的伤害类牌(无距离限制)。此回合结束时,若此牌未造成伤害或造成的伤害值大于1,你重置〖摧锋〗。', + jsrgdengnan:'登难', + jsrgdengnan_info:'限定技。出牌阶段,你可以视为使用一张非伤害类普通锦囊牌。此回合结束时,若此牌的目标均于此回合受到过伤害,你重置〖登难〗。', + jsrg_xiahourong:'转夏侯荣', + jsrg_xiahourong_prefix:'转', + jsrgfenjian:'奋剑', + jsrgfenjian_info:'每回合各限一次。当你需要对其他角色使用【决斗】或【桃】时,你可以令你本回合受到的伤害+1,视为使用之。', + jsrg_sunshangxiang:'转孙尚香', + jsrg_sunshangxiang_prefix:'转', + jsrgguiji:'闺忌', + jsrgguiji_info:'每回合限一次。出牌阶段,你可以与一名手牌数小于你的男性角色交换手牌。然后其下个出牌阶段结束时,你可以与其交换手牌。', + jsrgjiaohao:'骄豪', + jsrgjiaohao_info:'①其他角色的出牌阶段限一次。其可以将手牌中的一张装备牌置于你的装备区。②准备阶段,你获得X张【影】(X为你空置装备栏数的一半,向上取整)。', + jsrg_pangtong:'转庞统', + jsrg_pangtong_prefix:'转', + jsrgmanjuan:'漫卷', + jsrgmanjuan_info:'若你没有手牌,你可以如手牌般使用或打出于本回合进入弃牌堆的牌(每种点数每回合限一次)。', + jsrgyangming:'养名', + jsrgyangming_info:'出牌阶段限一次。你可以与一名角色拼点,若其:没赢,你可以与其重复此流程;赢,其摸X张牌,然后你回复1点体力(X为其此阶段没赢的次数)。', + jsrg_hansui:'转韩遂', + jsrg_hansui_prefix:'转', + jsrgniluan:'逆乱', + jsrgniluan_info:'准备阶段,你可以选择一项:1.弃置一张牌,对一名未对你造成过伤害的角色造成1点伤害;2.令一名对你造成过伤害的角色摸两张牌。', + jsrghuchou:'互雠', + jsrghuchou_info:'锁定技。当你对最后对你使用伤害类牌的角色造成伤害时,此伤害+1。', + jsrgjiemeng:'皆盟', + jsrgjiemeng_info:'主公技,锁定技。所有群势力角色至其他角色的距离-X(X为群势力角色数)。', + jsrg_zhangchu:'转张楚', + jsrg_zhangchu_prefix:'转', + jsrghuozhong:'惑众', + jsrghuozhong_info:'所有角色出牌阶段限一次。其可以将一张黑色非锦囊牌当【兵粮寸断】置于其判定区,然后令你摸两张牌。', + jsrgrihui:'日彗', + jsrgrihui_info:'①当你使用【杀】对目标角色造成伤害后,你可以令判定区有牌的其他角色各摸一张牌。②你于一回合内对判定区没有牌的角色使用的第一张【杀】无任何次数限制。', + jsrg_xiahouen:'转夏侯恩', + jsrg_xiahouen_prefix:'转', + jsrghujian:'护剑', + jsrghujian_info:'①游戏开始时,你从游戏外获得一张【赤血青锋】。②一名角色的回合结束时,此回合最后一名使用或打出牌的角色可以获得弃牌堆中的【赤血青锋】。', + jsrgshili:'恃力', + jsrgshili_info:'出牌阶段限一次。你可以将一张手牌中的装备牌当【决斗】使用。', + jsrg_fanjiangzhangda:'转范强张达', + jsrg_fanjiangzhangda_ab:'转范疆张达', + jsrg_fanjiangzhangda_prefix:'转', + jsrgfushan:'负山', + jsrgfushan_info:'出牌阶段开始时,所有其他角色可以依次交给你一张牌并令你此阶段使用【杀】的次数上限+1。此阶段结束时,若你使用【杀】的次数未达到上限且此阶段以此法交给你牌的角色均存活,你失去2点体力,否则你将手牌摸至体力上限。', jiangshanrugu_qi:'江山如故·起', jiangshanrugu_cheng:'江山如故·承', + jiangshanrugu_zhuan:'江山如故·转', }, }; }); diff --git a/character/mobile.js b/character/mobile.js index facdb4b6a..175af643b 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -6,7 +6,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connect:true, characterSort:{ mobile:{ - mobile_default:['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","simafu","mayuanyi","yanpu","sunhanhua","sp_maojie","peixiu","sp_jianggan","ruanhui","xin_mamidi","sp_caosong","yangfu","wangjun","sp_pengyang","qianzhao",'shichangshi'], + mobile_default:['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","simafu","mayuanyi","yanpu","sunhanhua","sp_maojie","peixiu","sp_jianggan","ruanhui","xin_mamidi","sp_caosong","yangfu","wangjun","sp_pengyang","qianzhao",'shichangshi'], 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"], @@ -22,10 +22,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mobile_yijiang5:['xin_zhangyi','xin_sunxiu','xin_quancong','xin_zhuzhi','xin_caoxiu'], mobile_yijiang67:["re_jikang"], mobile_changshi:['scs_zhangrang','scs_zhaozhong','scs_sunzhang','scs_bilan','scs_xiayun','scs_hankui','scs_lisong','scs_duangui','scs_guosheng','scs_gaowang'], - mobile_sp:["old_yuanshu","re_wangyun","re_baosanniang","re_weiwenzhugezhi","re_zhanggong","re_xugong","re_heqi","liuzan","xin_hansui"], + mobile_sp:["old_yuanshu","re_wangyun","re_baosanniang","re_weiwenzhugezhi","re_zhanggong","re_xugong","re_heqi","liuzan","xin_hansui",'mb_sunluyu'], }, }, character:{ + yanxiang:['male','qun',3,['kujian','twruilian'],['character:tw_yanxiang','die_audio:tw_yanxiang']], + mb_sunluyu:['female','wu',3,['mbmeibu','mbmumu']], + xin_wuban:['male','shu',4,['xinjintao'],['clan:陈留吴氏','character:wuban']], + baoxin:['male','qun',4,['mutao','yimou'],['character:tw_baoxin','die_audio:tw_baoxin']], + jiangji:['male','wei',3,['twjichou','jilun'],['character:tw_jiangji','die_audio:tw_jiangji']], + liwei:['male','shu',4,['jiaohua'],['character:tw_liwei','die:tw_liwei']], + laimin:['male','shu',3,['laishou','luanqun'],['unseen']], yj_zhoubuyi:['male','wei',3,['mbhuiyao','mbquesong']], xin_guozhao:['female','wei',3,['yichong','wufei']], xin_zhangyi:['male','shu',4,['xinwurong','shizhi']], @@ -88,7 +95,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xin_guohuai:['male','wei',4,['mobilejingce']], gongsunkang:['male','qun',4,['juliao','taomie']], xin_zhangfei:['male','shu',4,['new_repaoxiao','liyong']], - xin_hansui:['male','qun',4,['xinniluan','xiaoxi_hansui']], + xin_hansui:['male','qun','4/4/1',['xinniluan','xiaoxi_hansui']], hucheer:['male','qun',4,['daoji']], re_lingtong:['male','wu',4,['rexuanfeng']], re_liubiao:['male','qun',3,['zishou','rezongshi']], @@ -166,6 +173,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ scs_gaowang:['male','qun','',['scsmiaoyu'],['unseen','sex:male_castrated']], }, characterIntro:{ + laimin:'来敏(165年—261年),字敬达,义阳新野人,东汉太中大夫来歙之后,司空来艳之子,三国时期蜀汉官员。东汉末年,逢董卓之乱,来敏跟随姐夫黄琬到荆州避难,黄琬是刘璋祖母的侄子,来敏又与姐姐来氏入蜀,被刘璋引为宾客。来敏喜欢读书,尤其喜欢《左氏春秋》。刘备平定益州后,以来敏为典学校尉,后立太子,来敏为家令。刘禅继位后,任命来敏为虎贲中郎将,诸葛亮驻汉中,请来敏为军祭酒、辅军将军。却因其口出狂言而被罢官,诸葛亮死后,来敏历任大长秋、光禄大夫、执慎将军等职,期间多次因说错话而被免官,蜀汉景耀年间,来敏去世,时年九十七岁。', shichangshi:'十常侍,指中国东汉(公元25年—220年)灵帝时期(168年-189年)操纵政权的十二个宦官:张让、赵忠、夏恽、郭胜、孙璋、毕岚、栗嵩、段珪、高望、张恭、韩悝、宋典(在小说《三国演义》里,十常侍指的是指张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人),他们都任职中常侍。玩弄小皇帝于股掌之中,以至灵帝称“张常侍是我父,赵常侍是我母”。十常侍自己横征暴敛,卖官鬻爵,他们的父兄子弟遍布天下,横行乡里,祸害百姓,无官敢管。人民不堪剥削、压迫,纷纷起来反抗。当时一些比较清醒的官吏,已看出宦官集团的黑暗腐败,导致大规模农民起义的形势。郎中张钧在给皇帝的奏章中明确指出,黄巾起义是外戚宦官专权逼出来的,他说:“张角所以能兴兵作乱,万人所以乐附之者,其源皆由十常侍多放父兄、子弟、婚宗、宾客典据州郡,辜确财利,侵略百姓,百姓之怨无所告诉,故谋议不轨,聚为‘盗贼’。”后被曹操、袁绍所歼。', sunzhang:'孙璋(?-189年?)东汉末期汉灵帝的宦官,官居中常侍,为十常侍之一,在张让、赵忠之下位居第三。光熹元年(189年),张让、赵忠、段珪等诛杀何进,袁绍率军入宫,诛杀孙璋。', bilan:'毕岚(?—189),东汉宦官,十常侍之一。十常侍朋比为奸,祸乱朝纲,制造出党锢之祸,后被袁绍诛杀。另外,毕岚曾制造翻车,用于取河水洒路。', @@ -380,6 +388,583 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //阎象 + kujian:{ + audio:'twkujian', + inherit:'twkujian', + selectCard:[1,2], + content:function(){ + player.give(cards,target).gaintag.add('twkujianx'); + player.addSkill('kujian_draw'); + player.addSkill('twkujian_discard'); + }, + subSkill:{ + draw:{ + charlotte:true, + audio:'twkujian', + trigger:{global:['useCardAfter','respondAfter']}, + filter:function(event,player){ + return event.player.hasHistory('lose',evt=>{ + if(event!=evt.getParent()) return false; + for(var i in evt.gaintag_map){ + if(evt.gaintag_map[i].contains('twkujianx')) return true; + } + }); + }, + forced:true, + logTarget:'player', + content:function(){ + 'step 0' + game.asyncDraw([player,trigger.player],2); + 'step 1' + game.delayx(); + }, + }, + }, + }, + //手杀差异化孙鲁育 + mbmumu:{ + audio:'mumu', + inherit:'new_mumu', + filter:function(event,player){ + return game.hasPlayer(current=>{ + return current.countCards('e')>0; + }); + }, + content:function (){ + 'step 0' + player.chooseTarget(get.prompt('mbmumu'),'弃置场上的一张装备牌,或者获得场上的一张防具牌。',function(card,player,target){ + return target.countCards('e')>0; + }).set('ai',function(target){ + var player=_status.event.player; + var att=get.attitude(player,target) + if(target.getEquip(2)&&player.hasEmptySlot(2)){ + return -2*att; + } + return -att; + }); + 'step 1' + if(result.bool&&result.targets&&result.targets.length){ + event.target=result.targets[0]; + player.logSkill('mbmumu',event.target); + player.line(event.target,'green'); + var e=event.target.getEquips(2); + event.e=e; + if(e.length>0){ + player.chooseControl('弃置一张装备牌','获得一张防具牌').set('ai',function(){ + if(_status.event.player.getEquips(2).length>0){ + return '弃置一张装备牌'; + } + return '获得一张防具牌'; + }); + } + else{ + event.choice='弃置一张装备牌'; + } + } + else event.finish(); + 'step 2' + var choice=event.choice||result.control; + if(choice=='弃置一张装备牌'){ + player.discardPlayerCard(event.target,'e',true); + } + else{ + if(event.e){ + player.gain(event.e,event.target,'give','bySelf'); + player.addTempSkill('new_mumu2'); + } + } + }, + }, + mbmeibu:{ + inherit:'new_meibu', + derivation:['mbzhixi'], + content:function (){ + "step 0" + var check=lib.skill.new_meibu.checkx(trigger,player); + player.chooseToDiscard(get.prompt2('mbmeibu',trigger.player),'he').set('ai',function(card){ + if(_status.event.check) return 6-get.value(card); + return 0; + }).set('check',check).set('logSkill',['mbmeibu',trigger.player]); + "step 1" + if(result.bool){ + var target=trigger.player; + var card=result.cards[0]; + player.line(target,'green'); + target.addTempSkill('mbzhixi','phaseUseAfter'); + if(card.name!='sha'&&get.type(card)!='trick'&&get.color(card)!='black'){ + target.addTempSkill('new_meibu_range','phaseUseAfter'); + target.markAuto('new_meibu_range',player); + } + target.markSkillCharacter('mbmeibu',player,'魅步','锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。'); + } + }, + }, + mbzhixi:{ + mod:{ + cardEnabled:function(card,player){ + if(player.countMark('mbzhixi')>=player.hp) return false; + }, + cardUsable:function(card,player){ + if(player.countMark('mbzhixi')>=player.hp) return false; + }, + cardRespondable:function(card,player){ + if(player.countMark('mbzhixi')>=player.hp) return false; + }, + cardSavable:function(card,player){ + if(player.countMark('mbzhixi')>=player.hp) return false; + }, + }, + trigger:{ + player:"useCard1", + }, + forced:true, + popup:false, + onremove:true, + firstDo:true, + init:function(player,skill){ + player.storage[skill]=0; + var evt=_status.event.getParent('phaseUse'); + if(evt&&evt.player==player){ + player.getHistory('useCard',function(evtx){ + if(evtx.getParent('phaseUse')==evt){ + player.storage[skill]++; + } + }) + } + }, + onremove:function(player){ + player.unmarkSkill('mbmeibu'); + delete player.storage.mbzhixi; + }, + content:function(){ + player.addMark('mbzhixi',1,false); + if(get.type2(trigger.card)=='trick'){ + var evt=trigger.getParent('phaseUse'); + if(evt&&evt.player==player){ + evt.skipped=true; + game.log(player,'结束了出牌阶段'); + } + } + }, + ai:{presha:true,pretao:true,nokeep:true}, + }, + //庞统 + xinlianhuan:{ + audio:2, + audioname:['ol_pangtong'], + inherit:'lianhuan', + group:'xinlianhuan_add', + subSkill:{ + add:{ + audio:'xinlianhuan', + audioname:['ol_pangtong'], + trigger:{player:'useCard2'}, + filter:function(event,player){ + if(event.card.name!='tiesuo') return false; + var info=get.info(event.card); + if(info.allowMultiple==false) return false; + if(event.targets&&!info.multitarget){ + if(game.hasPlayer(current=>{ + return !event.targets.contains(current)&&lib.filter.targetEnabled2(event.card,player,current); + })) return true; + } + return false; + }, + charlotte:true, + forced:true, + popup:false, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('xinlianhuan'),'为'+get.translation(trigger.card)+'额外指定一个目标',(card,player,target)=>{ + return !_status.event.sourcex.contains(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); + }).set('sourcex',trigger.targets).set('ai',function(target){ + var player=_status.event.player; + return get.effect(target,_status.event.card,player,player); + }).set('card',trigger.card); + 'step 1' + if(result.bool){ + if(!event.isMine()&&!event.isOnline()) game.delayex(); + } + else event.finish(); + 'step 2' + if(result.bool){ + var targets=result.targets; + player.logSkill('xinlianhuan_add',targets); + trigger.targets.addArray(targets); + game.log(targets,'也成为了',trigger.card,'的目标'); + } + }, + }, + }, + }, + //吴班 + xinjintao:{ + audio:'jintao', + inherit:'jintao', + content:function(){ + var evt=trigger.getParent('phaseUse'); + var index=player.getHistory('useCard',function(evtx){ + return evtx.card.name=='sha'&&evtx.getParent('phaseUse')==evt; + }).indexOf(trigger); + if(index==0){ + game.log(trigger.card,'不可被响应'); + trigger.directHit.addArray(game.players); + } + else{ + game.log(trigger.card,'伤害+1'); + if(typeof trigger.baseDamage!='number') trigger.baseDamage=1; + trigger.baseDamage++; + } + }, + }, + //鲍信 + mutao:{ + audio:'twmutao', + inherit:'twmutao', + content:function(){ + 'step 0' + event.togive=target.getNext(); + var cards=target.getCards('h',{name:'sha'}); + if(!cards.length){ + game.log('但',target,'没有','#y杀','!'); + event.finish(); + } + else target.addToExpansion(cards,target,'give').gaintag.add('mutao'); + 'step 1' + var card=target.getExpansions('mutao').randomGet(); + target.give(card,event.togive); + 'step 2' + if(target.getExpansions('mutao').length){ + event.togive=event.togive.getNext(); + event.goto(1); + } + else{ + target.line(event.togive); + event.togive.damage(Math.min(3,event.togive.countCards('h',{name:'sha'})),target); + } + }, + intro:{ + content:'expansion', + markcount:'expansion', + }, + }, + yimou:{ + audio:'twyimou', + inherit:'twyimou', + content:function(){ + 'step 0' + if(trigger.player!=player) player.addExpose(0.3); + var target=get.translation(trigger.player); + var choiceList=[ + '令'+target+'获得牌堆里的一张【杀】', + '令'+target+'将一张牌交给另一名角色,然后'+target+'摸一张牌', + ]; + var list=['选项一']; + if(trigger.player.countCards('h')) list.push('选项二'); + else choiceList[1]=''+choiceList[1]+''; + player.chooseControl(list).set('prompt','毅谋:请选择一项').set('choiceList',choiceList).set('ai',function(){ + var evt=_status.event.getTrigger(),list=_status.event.list; + var player=_status.event.player; + var target=evt.player; + if(target.countCards('h')&&list.contains('选项二')) return '选项二'; + return '选项一'; + }).set('list',list); + 'step 1' + event.choice=result.control; + 'step 2' + if(event.choice!='选项二'){ + var card=get.cardPile2(function(card){ + return card.name=='sha'; + }); + if(card) trigger.player.gain(card,'gain2'); + else game.log('但牌堆里已经没有','#y杀','了!'); + if(event.choice=='选项一') event.finish(); + } + 'step 3' + if(event.choice!='选项一'){ + if(trigger.player.countCards('h')) trigger.player.chooseCardTarget({ + prompt:'毅谋:将一张手牌交给另一名其他角色', + filterCard:true, + forced:true, + filterTarget:lib.filter.notMe, + ai1:function(card){ + return 1/Math.max(0.1,get.value(card)); + }, + ai2:function(target){ + var player=_status.event.player,att=get.attitude(player,target); + if(target.hasSkillTag('nogain')) att/=9; + return 4+att; + }, + }); + else event.finish(); + } + 'step 4' + var target=result.targets[0]; + trigger.player.line(target); + trigger.player.give(result.cards,target); + trigger.player.draw(); + }, + }, + //蒋济 + jilun:{ + audio:'twjilun', + inherit:'twjilun', + filter:function(event,player){ + return player.hasSkill('twjichou'); + }, + content:function(){ + 'step 0' + var num=Math.min(Math.max(1,player.getStorage('twjichou').length),5); + event.num=num; + var choices=['选项一']; + var choiceList=[ + '摸'+get.cnNumber(num)+'张牌', + '获得一个“机论”标记', + ]; + if(!player.getStorage('twjichou').length||!player.getStorage('twjichou').filter(function(name){ + return !player.getStorage('jilun').contains(name)&&player.hasUseTarget({name:name}); + }).length) choiceList[1]=''+choiceList[1]+''; + else choices.push('选项二'); + player.chooseControl(choices,'cancel2').set('choiceList',choiceList).set('prompt',get.prompt('jilun')).set('ai',()=>{ + if(_status.event.choiceList.length==1||!player.getStorage('twjichou').length) return 0; + var val=_status.event.num>3?Math.min(1.5,1+(_status.event.num-3)*0.1):1; + for(var name of player.getStorage('twjichou')){ + if(player.getStorage('jilun').contains(name)) continue; + if(player.getUseValue({name:name})>4*val) return 1; + } + return 0; + }).set('num',num); + 'step 1' + if(result.control!='cancel2'){ + player.logSkill('jilun'); + if(result.control=='选项一') player.draw(num); + else player.addMark('jilun_mark',1); + } + }, + group:'jilun_effect', + subSkill:{ + mark:{ + intro:{content:'mark'}, + }, + effect:{ + audio:'twjilun', + trigger:{global:'phaseJieshuBegin'}, + filter:function(event,player){ + return player.hasMark('jilun_mark'); + }, + forced:true, + content:function(){ + 'step 0' + if(!player.getStorage('twjichou').length||!player.getStorage('twjichou').filter(function(name){ + return !player.getStorage('jilun').contains(name)&&player.hasUseTarget({name:name}); + }).length){ + if(player.hasMark('jilun_mark')) player.removeMark('jilun_mark',player.countMark('jilun_mark')); + event.finish(); + return; + } + var list=[]; + for(var name of player.getStorage('twjichou')){ + if(!player.getStorage('jilun').contains(name)){ + list.push(['锦囊','',name]); + } + } + player.chooseButton(['###机论:请选择你要执行的选项###
  • 失去1枚“机论”标记,视为使用一张〖急筹〗已记录但〖机论〗未记录的普通锦囊牌
  • 失去所有“机论”标记',[list,'vcard']]).set('filterButton',function(button){ + return _status.event.player.hasUseTarget({name:button.link[2]}); + }).set('ai',function(button){ + return _status.event.getParent().player.getUseValue({name:button.link[2]},null,true); + }); + 'step 1' + if(result.bool){ + player.removeMark('jilun_mark',1); + var card={name:result.links[0][2],isCard:true}; + player.chooseUseTarget(card,true); + player.markAuto('jilun',[card.name]); + player.syncStorage('jilun'); + } + else{ + player.removeMark('jilun_mark',player.countMark('jilun_mark')); + event.finish(); + } + 'step 2' + if(player.hasMark('jilun_mark')) event.goto(0); + }, + }, + }, + }, + //李遗 + jiaohua:{ + onremove:true, + audio:'twjiaohua', + enable:'phaseUse', + usable:3, + chooseButton:{ + dialog:function(event,player){ + return ui.create.dialog('###教化###选择一种牌的类型,令一名角色从牌堆获得此类型的一张牌'); + }, + chooseControl:function(event,player){ + var list=['basic','trick','equip'].filter(type=>!player.getStorage('jiaohua').contains(type)); + list.push('cancel2'); + return list; + }, + check:function(event,player){ + var list=['trick','equip','basic'].filter(type=>!player.getStorage('jiaohua').contains(type)); + return list[0]; + }, + backup:function(result,player){ + return{ + type:result.control, + audio:'twjiaohua', + filterTarget:true, + content:function(){ + 'step 0' + var type=lib.skill.jiaohua_backup.type; + var card=get.cardPile2(card=>get.type2(card)==type); + if(card) target.gain(card,'gain2'); + else game.log('但牌堆里已经没有','#y'+get.translation(type)+'牌','了!'); + 'step 1' + player.markAuto('jiaohua',[lib.skill.jiaohua_backup.type]); + 'step 2' + if(!['basic','trick','equip'].some(type=>!player.getStorage('jiaohua').contains(type))){ + player.popup('教化'); + player.unmarkAuto('jiaohua',player.getStorage('jiaohua')); + game.log(player,'清空了','#g【教化】','记录'); + } + }, + ai:{ + result:{target:1}, + }, + } + }, + prompt:function(result,player){ + return '令一名角色从牌堆中获得一张'+get.translation(result.control)+'牌'; + }, + }, + ai:{ + order:7, + result:{player:1}, + }, + intro:{content:'已记录$牌'}, + }, + //来敏 + laishou:{ + audio:3, + trigger:{player:['damageBegin4','phaseZhunbeiBegin']}, + filter:function(event,player){ + var num=9; + if(event.name=='damage') return event.num>=player.getHp()&&player.maxHp=num; + }, + forced:true, + content:function(){ + if(trigger.name=='damage'){ + player.gainMaxHp(trigger.num); + trigger.cancel(); + } + else player.die(); + }, + }, + luanqun:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + return player.countCards('h'); + }, + usable:1, + content:function(){ + 'step 0' + var targets=game.filterPlayer(current=>current.countCards('h')).sortBySeat(); + event.targets=targets; + var next=player.chooseCardOL(targets,'乱群:请选择要展示的牌',true).set('ai',function(card){ + return -get.value(card); + }).set('source',player); + next.aiCard=function(target){ + var hs=target.getCards('h'); + return {bool:true,cards:[hs.randomGet()]}; + }; + next._args.remove('glow_result'); + 'step 1' + var cards=[]; + event.videoId=lib.status.videoId++; + for(var i=0;icardy!=card&&get.color(cardy,targets[cards.indexOf(cardy)])==get.color(card,player)); + if(cardx.length){ + player.chooseButton(['乱群:是否获得其中的一张牌',cardx]).set('forceAuto',true).set('ai',function(button){ + var cards=_status.event.list[0]; + var targets=_status.event.list[1]; + var player=_status.event.player; + if(get.attitude(player,targets[cards.indexOf(button.link)])) return 0; + return get.value(button.link,player); + }).set('list',[cards,targets]); + } + else event.goto(4); + 'step 3' + if(result.bool){ + var card=result.links[0]; + player.gain(card,get.owner(card),'give'); + } + 'step 4' + var card=cards[targets.indexOf(player)]; + targets=targets.filter(target=>get.color(cards[targets.indexOf(target)],target)!=get.color(card,player)); + if(targets.length){ + player.line(targets); + targets.forEach(target=>{ + target.addTempSkill('luanqun_effect',{player:'phaseUseAfter'}); + target.markAuto('luanqun_effect',[player]); + }); + } + }, + ai:{ + order:9, + result:{ + player:function(player,target){ + if(player.hasSkill('laishou')) return 1; + return player.hp>=2?1:0; + }, + }, + }, + subSkill:{ + effect:{ + charlotte:true, + onremove:true, + intro:{content:'出牌阶段第一张【杀】只能指定$为目标,且此牌不可被响应'}, + mod:{ + playerEnabled:function(card,player,target){ + if(!player.isPhaseUsing()) return; + if(card.name=='sha'&&!player.getStorage('luanqun_effect').contains(target)) return false; + }, + }, + trigger:{player:'useCard1'}, + filter:function(event,player){ + return player.isPhaseUsing()&&event.card.name=='sha'; + }, + forced:true, + content:function(){ + trigger.directHit.addArray(player.getStorage('luanqun_effect')); + player.removeSkill('luanqun_effect'); + }, + }, + }, + }, //☆周不疑 mbhuiyao:{ audio:2, @@ -497,6 +1082,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lib.translate['yichong_'+player.playerid+'_bg']='雀'; } }, + getLimit:1, audio:2, trigger:{player:'phaseZhunbeiBegin'}, direct:true, @@ -535,14 +1121,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else event.finish(); 'step 2' var suit=result.control; + event.suit=suit; player.chat(get.translation(suit+2)); game.log(player,'选择了','#y'+get.translation(suit+2)); + if(target.countCards('e',{suit:suit})) player.gain(target.getCards('e',{suit:suit}),target,'giveAuto'); + 'step 3' + var suit=event.suit; + if(target.countCards('h',{suit:suit})){ + player.chooseButton(['选择获得其中一张牌',target.getCards('h',{suit:suit})],true).set('ai',button=>get.value(button.link)); + } + else event.goto(5); + 'step 4' + if(result.bool){ + var card=result.links[0]; + if(lib.filter.canBeGained(card,player,target)) player.gain(card,target,'giveAuto','bySelf'); + else game.log('但',card,'不能被',player,'获得!'); + } + 'step 5' + var suit=event.suit; player.storage.yichong=suit; player.markSkill('yichong'); game.broadcastAll(function(player,suit){ if(player.marks.yichong) player.marks.yichong.firstChild.innerHTML=get.translation(suit); - },player,suit) - if(target.countCards('he',{suit:suit})) player.gain(target.getCards('he',{suit:suit}),target,'giveAuto'); + },player,suit); game.countPlayer(function(current){ current.removeSkill('yichong_'+player.playerid); if(current==target) target.addSkill('yichong_'+player.playerid); @@ -560,7 +1161,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!player.storage.yichong) return false; return game.hasPlayer(function(current){ if(!event.getg(current).length||!current.hasSkill('yichong_'+player.playerid)) return false; - if(current.countMark('yichong_'+player.playerid)>=5) return false; + if(current.countMark('yichong_'+player.playerid)>=lib.skill.yichong.getLimit) return false; return event.getg(current).some(card=>get.suit(card,current)==player.storage.yichong&&lib.filter.canBeGained(card,current,player)); }); }, @@ -569,14 +1170,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var target=game.findPlayer(function(current){ if(!trigger.getg(current).length||!current.hasSkill('yichong_'+player.playerid)) return false; - if(current.countMark('yichong_'+player.playerid)>=5) return false; + if(current.countMark('yichong_'+player.playerid)>=lib.skill.yichong.getLimit) return false; return trigger.getg(current).some(card=>get.suit(card,current)==player.storage.yichong&&lib.filter.canBeGained(card,current,player)); }); event.target=target; var cards=trigger.getg(target).filter(card=>get.suit(card,target)==player.storage.yichong&&lib.filter.canBeGained(card,target,player)); - if(cards.length<=5-target.countMark('yichong_'+player.playerid)) event._result={bool:true,links:cards}; + if(cards.length<=lib.skill.yichong.getLimit-target.countMark('yichong_'+player.playerid)) event._result={bool:true,links:cards}; else{ - var num=(5-target.countMark('yichong_'+player.playerid)); + var num=(lib.skill.yichong.getLimit-target.countMark('yichong_'+player.playerid)); player.chooseButton(['易宠:获得其中的'+get.cnNumber(num)+'张牌',cards],num,true).set('ai',function(button){ return get.value(button.link); }); @@ -604,7 +1205,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ var target=game.findPlayer(current=>current.hasSkill('yichong_'+player.playerid)); if(!target) return false; - if(event.name=='damage') return target.hp>Math.max(1,player.hp); + if(event.name=='damage') return target.hp>3; return event.isFirstTarget&&(event.card.name=='sha'||(get.type(event.card)=='trick'&&get.tag(event.card,'damage'))); }, direct:true, @@ -613,7 +1214,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=game.findPlayer(current=>current.hasSkill('yichong_'+player.playerid)); event.target=target; if(trigger.name=='damage'){ - player.chooseBool(get.prompt('wufei',target),'对'+get.translation(target)+'造成1点伤害').set('choice',get.damageEffect(target,player,player)>0); + player.chooseBool(get.prompt('wufei',target),'令'+get.translation(target)+'受到1点无来源伤害').set('choice',get.damageEffect(target,player,player)>0); } else{ player.logSkill('wufei',target); @@ -625,7 +1226,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(result.bool){ player.logSkill('wufei',target); - target.damage(); + target.damage('nosource'); } }, subSkill:{ @@ -891,7 +1492,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ['scs_guosheng','scsniqu'], ['scs_gaowang','scsmiaoyu'] ], - conflictMap:function(){ + conflictMap:function(player){ if(!_status.changshiMap){ _status.changshiMap={ scs_zhangrang:[], @@ -905,10 +1506,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ scs_guosheng:['scs_duangui'], scs_gaowang:[], }; - var list=lib.skill.mbdanggu.changshi.map(i=>i[0]); - for(var i of list){ - var select=list.filter(scs=>scs!=i&&!_status.changshiMap[i].contains(i)); - _status.changshiMap[i].addArray(select.randomGets(get.rand(0,select.length))); + if(!get.isLuckyStar(player)){ + var list=lib.skill.mbdanggu.changshi.map(i=>i[0]); + for(var i of list){ + var select=list.filter(scs=>scs!=i&&!_status.changshiMap[i].contains(i)); + _status.changshiMap[i].addArray(select.randomGets(get.rand(0,select.length))); + } } } return _status.changshiMap; @@ -945,7 +1548,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(others.length==1) event._result={bool:true,links:others}; else{ var conflictList=others.filter(changshi=>{ - var map=lib.skill.mbdanggu.conflictMap(); + var map=lib.skill.mbdanggu.conflictMap(player); var names=map[first]; return names.contains(changshi); }),list=others.slice(); @@ -1010,7 +1613,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, isSingleShichangshi:function(player){ - var map=lib.skill.mbdanggu.conflictMap(); + var map=lib.skill.mbdanggu.conflictMap(player); return player.name=='shichangshi'&&(map[player.name1]&&map[player.name2]||map[player.name1]&&!player.name2||!player.name1&&!player.name2||player.name==player.name1&&!player.name2); }, mod:{ @@ -2759,36 +3362,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=1-trigger.player.hp; if(num>0) trigger.player.recover(num); 'step 1' - if(player.hp==1&&player.maxHp==1){ - event.finish(); return; - } var hp=player.hp-1,maxhp=player.maxHp-1; - var choiceList=['失去'+hp+'点体力,令'+get.translation(trigger.player)+'获得'+hp+'点护甲','减'+maxhp+'点体力上限,令'+get.translation(trigger.player)+'获得'+maxhp+'点护甲']; - var choices=[]; - if(hp>0) choices.push('选项一'); - else choiceList[0]=''+choiceList[0]+''; - if(maxhp>0) choices.push('选项二'); - else choiceList[1]=''+choiceList[1]+''; - player.chooseControl(choices).set('prompt','安国:请选择一项').set('choiceList',choiceList).set('ai',()=>{ - var player=_status.event.player; - if(player.hp<=1||get.attitude(player,_status.event.getTrigger().player)>=4&&player.hp-1<0.4*(player.maxHp-1)&&player.maxHp>1) return '选项二'; - return '选项一'; - }); + if(hp>0&&maxhp>0){ + player.chooseControl(choices).set('prompt','安国:请选择一项').set('choiceList',[ + '失去'+hp+'点体力,令'+get.translation(trigger.player)+'获得1点护甲', + '减'+maxhp+'点体力上限,令'+get.translation(trigger.player)+'获得1点护甲' + ]).set('ai',()=>'选项一'); + } + else if(hp>0) event._result={control:'选项一'}; + else if(maxhp>0) event._result={control:'选项二'}; + else event.finish(); 'step 2' if(result.control=='选项一'){ var num=player.hp-1; - if(num>0){ - player.loseHp(num); - trigger.player.changeHujia(num); - } + if(num>0) player.loseHp(num); } - else { + else{ var num=player.maxHp-1; - if(num>0){ - player.loseMaxHp(num); - trigger.player.changeHujia(num); - } + if(num>0) player.loseMaxHp(num); } + trigger.player.changeHujia(1,null,true); } } } @@ -3053,7 +3646,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, group:['yijin_upstart','yijin_die'], filter:function(event,player){ - if(!game.hasPlayer(current=>current!=player)) return false; + if(!game.hasPlayer(current=>current!=player && !lib.skill.yijin.getKane(current).length)) return false; return lib.skill.yijin.getKane(player).length; }, getKane:function(player){ @@ -3766,7 +4359,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, - //手杀荀彧 + //手杀界荀彧 rejieming:{ audio:2, trigger:{ @@ -3832,7 +4425,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinjianying:{ audio:2, subfrequent:['draw'], - group:['xinjianying_draw'], enable:'phaseUse', usable:1, filter:function(event,player){ @@ -3880,8 +4472,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, backup:function(links,player){ var next={ - audio:'jianying', - audioname:['xin_jushou'], + audio:'xinjianying', filterCard:true, popname:true, position:'he', @@ -3892,16 +4483,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai1:function(card){ return 7-_status.event.player.getUseValue(card,null,true); }, - precontent:function(){ - event.getParent().addCount=false; - var evtx=event.getParent(2); - if(player.hasHistory('useCard',function(evt){ - return evt.skill=='xinjianying_backup'&&evt.getParent(2)==evtx; - })){ - alert('检测到您安装了十周年UI等具有出牌特效的扩展。该扩展会导致【渐营】出现无视次数限制发动的bug。为避免无限循环,即将重启游戏。请卸载相关扩展以解决此问题。'); - game.reload(); - } - }, }; if(_status.event.xinjianying_suit) next.viewAs.suit=_status.event.xinjianying_suit; return next; @@ -3915,7 +4496,32 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(_status.event.xinjianying_suit) return 16; return 3; }, - result:{player:1}, + result:{player:7}, + }, + group:['xinjianying_draw','jianying_mark'], + init:function(player){ + if(player.isPhaseUsing()){ + var evt=_status.event.getParent('phaseUse'); + var history=player.getHistory('useCard',function(evt2){ + return evt2.getParent('phaseUse')==evt; + }); + if(history.length){ + var trigger=history[history.length-1]; + player.storage.jianying_mark=trigger.card; + player.markSkill('jianying_mark'); + game.broadcastAll(function(player,suit){ + if(player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML=get.translation(suit); + },player,get.suit(trigger.card,player)); + player.when('phaseUseAfter').then(()=>{ + player.unmarkSkill('jianying_mark'); + delete player.storage.jianying_mark; + }); + } + } + }, + onremove:function(player){ + player.unmarkSkill('jianying_mark'); + delete player.storage.jianying_mark; }, subSkill:{ draw:{inherit:'jianying',audio:'xinjianying'}, @@ -4255,13 +4861,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mobilexingxue:{ audio:2, trigger:{player:'phaseJieshuBegin'}, + filter:function(event,player){ + var num=player.storage.mobileyanzhu?player.maxHp:player.hp; + return num>0; + }, direct:true, content:function(){ 'step 0' - var num=player.hp; - if(!player.hasSkill('mobileyanzhu')){ - num=player.maxHp; - } + var num=player.storage.mobileyanzhu?player.maxHp:player.hp; player.chooseTarget([1,num],get.prompt2('mobilexingxue')).set('ai',function(target){ var att=get.attitude(_status.event.player,target); if(target.countCards('he')) return att; @@ -4288,7 +4895,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 3' if(event.current&&event.current.countCards('he')){ - if(player.hasSkill('mobileyanzhu')||event.targets2.length==1) event.current.chooseCard('选择一张牌置于牌堆顶','he',true); + if(player.storage.mobileyanzhu||event.targets2.length==1) event.current.chooseCard('选择一张牌置于牌堆顶','he',true); else event.current.chooseCardTarget({ prompt:'将一张牌置于牌堆顶,或交给其他目标角色', filterCard:true, @@ -4326,22 +4933,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 5' event.goto(2); - } + }, + derivation:'mobilexingxuex', }, mobileyanzhu:{ audio:2, enable:'phaseUse', usable:1, filterTarget:function(card,player,target){ - return target.countCards('he')>0&&target!=player; + return target.countCards('hej')>0&&target!=player; }, content:function(){ 'step 0' if(target.countCards('e')){ - target.chooseBool('是否将装备区内的所有牌交给'+get.translation(player)+'?','若选择“取消”,则其将获得你的一张牌').set('ai',function(){ + target.chooseBool('是否将装备区内的所有牌交给'+get.translation(player)+'?','若选择“取消”,则其将获得你区域里的一张牌').set('ai',function(){ + if(_status.event.effect>0) return false; if(_status.event.player.countCards('e')>=3) return false; return true; - }); + }).set('effect',get.effect(target,{name:'shunshou'},player,target)); } else{ player.gainPlayerCard(target,true,'he'); @@ -4352,22 +4961,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var es=target.getCards('e'); target.give(es,player,'give'); player.removeSkill('mobileyanzhu'); + player.storage.mobileyanzhu=true; + player.popup('兴学'); + game.log(player,'修改了技能','【兴学】'); } else{ - player.gainPlayerCard(target,true,'he'); + player.gainPlayerCard(target,true,'hej'); } }, ai:{ order:6, result:{ target:function(player,target){ - var ne=target.countCards('e'); + var ne=target.countCards('e'),nj=target.countCards('j'); + if(nj) return 2.5; if(!ne) return -2; if(ne>=2) return -ne; return 0; - } - } - } + }, + }, + }, }, //毛玠 bingqing:{ @@ -4594,7 +5207,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ viewAsFilter:function(player){ return player.hasCard({type:'equip'},'ehs'); }, - check:(card)=>5-get.value(card), + check:function(card){ + if(_status.event.type=='dying') return 1/(get.value(card)||0.5); + return 5-get.value(card); + }, locked:false, mod:{ maxHandcard:function(player,num){ @@ -5083,24 +5699,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var dialog=ui.create.dialog('集兵','hidden'); if(event.filterCard({name:'sha'},player,event)&&event.filterCard({name:'shan'},player,event)){ dialog._chooseButton=2; - var table=document.createElement('div'); - table.classList.add('add-setting'); - table.style.margin='0'; - table.style.width='100%'; - table.style.position='relative'; var list=['sha','shan']; - for(var i of list){ - var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode'); - td.innerHTML=''+get.translation(i)+''; - td.link=i; - td.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.button); - for(var j in lib.element.button){ - td[j]=lib.element.button[j]; - } - table.appendChild(td); - dialog.buttons.add(td); - } - dialog.content.appendChild(table); + dialog.add([list.map(i=>{ + return [i,get.translation(i)]; + }),'tdnodes']); } else dialog._cardName=event.filterCard({name:'sha'},player,event)?'sha':'shan'; dialog.add(player.getExpansions('jibing')); @@ -5295,9 +5897,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(result.number<7){ var source=trigger.source; - if(source&&source.isIn()&&source.countCards('h')>0){ + if(source&&source.isIn()&&source.countCards('he')>0){ player.line(source); - source.chooseToDiscard('h',true); + source.chooseToDiscard('he',true); } } }, @@ -8396,7 +8998,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.recover(); }, }, - //手杀朱然 + //手杀界朱然 //设计师你改技能有瘾🐴 mobiledanshou:{ trigger:{global:'phaseJieshuBegin'}, @@ -8672,7 +9274,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.updateRoundNumber(); }, }, - //芙蓉,手杀廖化,手杀曹彰 + //芙蓉,手杀界廖化,手杀界曹彰 rejiangchi:{ audio:2, trigger:{ @@ -9476,10 +10078,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var att=get.attitude(player,target); return -att; //if(cards.length==1) return -att; - if(player==target) att/=2; - if(target.hasSkill('pingkou')) att*=1.4; - att*=(1+target.countCards('j')/2); - return att; + // if(player==target) att/=2; + // if(target.hasSkill('pingkou')) att*=1.4; + // att*=(1+target.countCards('j')/2); + // return att; }); "step 3" if(result.bool){ @@ -12164,7 +12766,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:"linkBefore", }, forced:true, - priority:20, + //priority:20, filter:function(event,player){ return !player.isLinked(); }, @@ -13178,7 +13780,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, cancel:{ trigger:{player:'phaseUseEnd'}, - priority:50, + firstDo:true, silent:true, charlotte:true, content:function(){ @@ -13525,21 +14127,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ '摸一张牌并视为使用一张【杀】', ]; var choiceList=ui.create.dialog('知略:失去1点体力并...','forcebutton','hidden'); - for(var i=0;i{ + return [i,item]; + }),'textbutton']); return choiceList; }, filter:function(button,player){ @@ -14026,7 +14616,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ try{ card.gnsheque_tag=true; }catch(e){ - alert('发生了一个导致【射却】无法正常触发无视防具效果的错误。请关闭十周年UI/手杀UI等扩展以解决'); + alert('发生了一个导致【射却】无法正常触发无视防具效果的错误。请关闭十周年UI/手杀ui等扩展以解决'); } }); }, @@ -14085,6 +14675,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.countMark('spshidi')%2==0) return '转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。'; return '转换技,锁定技。①准备阶段/结束阶段开始时,若你发动此分支的累计次数为奇数/偶数,则你获得一个“☯”。②若你的“☯”数为偶数,则你至其他角色的距离-1,且你使用的黑色【杀】不可被响应。③若你的“☯”数为奇数,则其他角色至你的距离+1,且你不可响应红色【杀】。'; }, + mobilexingxue:function(player){ + return lib.translate[(player.storage.mobileyanzhu?'mobilexingxuex':'mobilexingxue')+'_info']; + }, }, perfectPair:{ simazhao:['simayi','jin_simayi','jin_wangyuanji'], @@ -14113,8 +14706,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ translate:{ liuzan:'手杀留赞', liuzan_prefix:'手杀', - re_sp_zhugeliang:'手杀卧龙', - re_sp_zhugeliang_prefix:'手杀', + re_sp_zhugeliang:'手杀界卧龙', + re_sp_zhugeliang_prefix:'手杀界', ly_piliche:'霹雳车', ly_piliche_info:'当你对其他角色造成伤害后,你可以弃置其装备区内的所有牌。', polu:'破橹', @@ -14122,9 +14715,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ choulve:'筹略', choulve_info:'出牌阶段开始时,你可以令一名其他角色交给你一张牌,若其如此做,视为你使用上一张对你过造成伤害且不为延时锦囊牌的牌。', tunchu:'屯储', - tunchu_info:'摸牌阶段,若你没有「粮」,你可以多摸两张牌。若如此做,摸牌阶段结束时,你可以将任意张手牌置于你的武将上,称为「粮」,只要你的武将牌上有「粮」,你便不能使用【杀】', + tunchu_info:'摸牌阶段,若你没有「粮」,你可以多摸两张牌。若如此做,摸牌阶段结束时,你可以将任意张手牌置于你的武将上,称为「粮」,只要你的武将牌上有「粮」,你便不能使用【杀】。', shuliang:'输粮', - shuliang_info:'一名角色的结束阶段开始时,若其手牌数少于体力值,你可以移去一张「粮」,然后该角色摸两张牌', + shuliang_info:'一名角色的结束阶段开始时,若其手牌数少于体力值,你可以移去一张「粮」,然后该角色摸两张牌。', fenyin:'奋音', yingjian:'影箭', fenyin_info:'你的回合内,当你使用牌时,若此牌与你于此回合内使用的上一张牌的颜色不同,则你可以摸一张牌。', @@ -14200,7 +14793,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xuanjian_card":"玄剑", "xuanjian_card_info":"令一名角色摸一张牌并回复1点体力。若场上有存活的徐庶(将/界),则改为令一名角色摸一张牌并回复1点体力,然后你摸一张牌。", "shuijing_card":"水镜", - "shuijing_card_info":"将一名角色装备区内的防具牌移动到另一名角色对应区域。若场上有存活的司马徽,则改为将1名角色装备区内的1件装备移动到另1角色对应区域。","xinfu_pingcai":"评才", + "shuijing_card_info":"将一名角色装备区内的防具牌移动到另一名角色对应区域。若场上有存活的司马徽,则改为将1名角色装备区内的1件装备移动到另1角色对应区域。", + "xinfu_pingcai":"评才", "xinfu_pingcai_info":"出牌阶段限一次,你可以挑选一个宝物并擦拭掉其上面的灰尘。然后,你可以根据宝物类型执行对应的效果。", "xinfu_pdgyingshi":"隐世", "xinfu_pdgyingshi2":"隐世", @@ -14232,8 +14826,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xinfu_jingxie2_info":"", "xinfu_qiaosi":"巧思", "xinfu_qiaosi_info":"出牌阶段限一次,你可以投掷一枚六面骰子,展示牌堆顶的X张牌并获得之。然后,你选择一项:1.交给一名其他角色X张牌。2.弃置X张牌。(X为骰子的点数)", - xin_xiahoudun:'手杀夏侯惇', - xin_xiahoudun_prefix:'手杀', + xin_xiahoudun:'手杀界夏侯惇', + xin_xiahoudun_prefix:'手杀界', xinqingjian:'清俭', xinqingjian2:'清俭', xinqingjian_info:'每回合限一次。当你不因摸牌阶段的额定摸牌而得到牌后,你可以将任意张牌扣置于武将牌上。回合结束时,你将这些牌交给一名其他角色。若这些牌的数量大于1,你摸一张牌。', @@ -14350,8 +14944,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rezhengrong_info:'当你于出牌阶段使用的指定了其他角色为目标的牌结算完成后,若此牌是你本局游戏内于出牌阶段使用的指定了其他角色为目标的第偶数张牌,则你可以将一名其他角色角色的随机一张牌置于你的武将牌上,称为「荣」。', rehongju_info:'觉醒技,准备阶段,若你武将牌上「荣」的数量不小于3且有角色死亡,则你摸等同于「荣」数量的牌。然后可以用任意数量的手牌交换等量的「荣」。你减1点体力上限并获得技能〖清侧〗。', reqingce_info:'出牌阶段,你可以将一张「荣」置入弃牌堆,然后弃置场上的一张牌。', - re_pangtong:'手杀庞统', - re_pangtong_prefix:'手杀', + re_pangtong:'手杀界庞统', + re_pangtong_prefix:'手杀界', dongcheng:'手杀董承', dongcheng_prefix:'手杀', chengzhao:'承诏', @@ -14363,12 +14957,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gongsun:'共损', gongsun_info:'出牌阶段开始时,你可以弃置两张牌并指定一名其他角色。你选择一个基本牌或普通锦囊牌的牌名。直到你的下回合开始或你死亡,你与其不能使用或打出或弃置此名称的牌。', gongsun_shadow:'共损', - xin_chengpu:'手杀程普', - xin_chengpu_prefix:'手杀', + xin_chengpu:'手杀界程普', + xin_chengpu_prefix:'手杀界', relihuo:'疠火', relihuo_damage:'疠火', relihuo_baigei:'疠火', - relihuo_info:'当你使用普【杀】时,你可以将此杀改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)', + relihuo_info:'当你使用普【杀】时,你可以将此杀改为火属性。若如此做,当你因执行此【杀】的效果而对横置角色造成伤害时,此伤害+1;当你使用的火【杀】结算完成后,你失去X点体力(X为你因此【杀】造成的伤害总点数的一半且向下取整)。', dengzhi:'手杀邓芝', dengzhi_prefix:'手杀', jimeng:'急盟', @@ -14421,10 +15015,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tongqu_info:'游戏开始时,你拥有一个“渠”标记。准备阶段,你可以失去1点体力令一名没有“渠”标记的角色获得“渠”标记。有“渠”的角色摸牌阶段额外摸一张牌,然后将一张牌交给其他有“渠”的角色或弃置。若以此法给出的是装备牌则使用之。当有“渠”的角色进入濒死状态时,移除其“渠”标记。', xinwanlan:'挽澜', xinwanlan_info:'当一名角色受到伤害值不小于体力值的伤害时,你可以弃置装备区中的所有牌(至少一张) 防止此伤害。', - re_xusheng:'手杀徐盛', - re_xusheng_prefix:'手杀', - re_dongzhuo:'手杀董卓', - re_dongzhuo_prefix:'手杀', + re_xusheng:'手杀界徐盛', + re_xusheng_prefix:'手杀界', + re_dongzhuo:'手杀界董卓', + re_dongzhuo_prefix:'手杀界', rejiuchi:'酒池', rejiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。锁定技,当你于回合内使用带有【酒】效果的【杀】造成伤害时,你令你的【崩坏】失效直到回合结束。', furong:'手杀傅肜', @@ -14433,20 +15027,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xuewei_info:'准备阶段,你可以选择一名其他角色(仅自己可见)。若如此做,直到你的下回合开始前,当其第一次受到伤害时,你防止此伤害,改为由你受到等量的伤害并对伤害来源造成等量同属性的伤害。', liechi:'烈斥', liechi_info:'锁定技,当你进入濒死状态时,伤害来源弃置一张牌。', - xin_liaohua:'手杀廖化', - xin_liaohua_prefix:'手杀', + xin_liaohua:'手杀界廖化', + xin_liaohua_prefix:'手杀界', redangxian:'当先', redangxian_info:'锁定技,回合开始时,你从弃牌堆中获得一张【杀】并进行一个额外的出牌阶段。', refuli:'伏枥', refuli_info:'限定技,当你处于濒死状态时,你可以将体力值回复至X点(X为势力数)。然后若你的体力值为全场唯一最多,你翻面。', - xin_caozhang:'手杀曹彰', - xin_caozhang_prefix:'手杀', + xin_caozhang:'手杀界曹彰', + xin_caozhang_prefix:'手杀界', "rejiangchi":"将驰", "rejiangchi_info":"出牌阶段开始时,你可以选择一项:1、摸一张牌,若如此做,你本阶段内不能使用【杀】。 2、弃置一张牌,若如此做,此阶段你使用【杀】无距离限制且你可以额外使用一张【杀】。", rezhenxing:"镇行", rezhenxing_info:"结束阶段开始时或当你受到伤害后,你可以观看牌堆顶的三张牌,然后你获得其中与其余牌花色均不相同的一张牌。", - xin_jianyong:'手杀简雍', - xin_jianyong_prefix:'手杀', + xin_jianyong:'手杀界简雍', + xin_jianyong_prefix:'手杀界', xinqiaoshui:'巧说', xinqiaoshui_info:'出牌阶段限一次,你可以和一名其他角色拼点。若你赢,则你本阶段内使用的下一张基本牌或普通锦囊牌可以增加减少一个目标。若你没赢,你本阶段内不能使用锦囊牌。', xinjyzongshi:'纵适', @@ -14456,10 +15050,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ beizhu:'备诛', beizhu_draw:'备诛', beizhu_info:'出牌阶段限一次,你可以观看一名其他角色的手牌。若其中:没有【杀】,你弃置其一张牌,然后你可令其获得牌堆中的一张【杀】;有【杀】,其依次对你使用这些【杀】,当你因此受到1点伤害后,你摸一张牌。', - xin_zhuran:'手杀朱然', - xin_zhuran_prefix:'手杀', + xin_zhuran:'手杀界朱然', + xin_zhuran_prefix:'手杀界', mobiledanshou:'胆守', - mobiledanshou_info:'一名其他角色的结束阶段开始时,若X:为0,你摸一张牌;不等于0,你可弃置X张牌并对其造成1点伤害(X为其本回合内使用的目标包含你的牌的数量)', + mobiledanshou_info:'一名其他角色的结束阶段开始时,若X:为0,你摸一张牌;不等于0,你可弃置X张牌并对其造成1点伤害(X为其本回合内使用的目标包含你的牌的数量)。', yanghuiyu:'羊徽瑜', hongyi:'弘仪', hongyi2:'弘仪', @@ -14478,10 +15072,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jinglve_info:'出牌阶段限一次,若场上没有与你对应的「死士」牌,则你可以观看一名其他角色的手牌,将其中一张牌标记为「死士」。当其使用对应的实体牌中包含「死士」的牌时,你取消此牌的所有目标。当「死士」牌不因使用而进入弃牌堆,或其回合结束后,若「死士」牌仍在其区域内,则你获得此牌。', shanli:'擅立', shanli_info:'觉醒技,准备阶段,若你已发动过〖败移〗且对至少两名角色发动过〖景略〗,则你减1点体力上限并选择一名角色。系统随机选择三个不为〖忘隙(仲村由理)〗的主公技,然后你选择其中一个技能,令其获得之。其将交互表情中的【拖鞋】和【酒杯】替换为【枷锁】和【玉玺】。', - re_lingtong:'手杀凌统', - re_lingtong_prefix:'手杀', - re_liubiao:'手杀刘表', - re_liubiao_prefix:'手杀', + re_lingtong:'手杀界凌统', + re_lingtong_prefix:'手杀界', + re_liubiao:'手杀界刘表', + re_liubiao_prefix:'手杀界', hucheer:'手杀胡车儿', hucheer_prefix:'手杀', daoji:'盗戟', @@ -14492,8 +15086,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinniluan_info:'其他角色的结束阶段,若其本回合对除其以外的角色使用过牌,则你可以对其使用一张【杀】。若以此法使用的【杀】造成伤害,则你弃置其一张牌。', xiaoxi_hansui:'骁袭', xiaoxi_hansui_info:'你可以将一张黑色牌当做【杀】使用或打出。', - xin_zhangfei:'手杀张飞', - xin_zhangfei_prefix:'手杀', + xin_zhangfei:'手杀界张飞', + xin_zhangfei_prefix:'手杀界', liyong:'厉勇', liyong2:'厉勇', liyong3:'厉勇', @@ -14507,30 +15101,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ taomie3:'讨灭', taomie4:'讨灭', taomie_info:'当你受到伤害后或当你造成伤害后,你可以令伤害来源或受伤角色获得“讨灭”标记(如场上已有标记则转移给该角色);你和拥有“讨灭”标记的角色视为在彼此的攻击范围内,且当你对该角色造成伤害时,选择一项:1. 此伤害+1;2. 你获得其区域内的一张牌并可将之交给另一名角色;3. 依次执行前两项并于伤害结算后弃置其“讨灭”标记。', - xin_guohuai:'手杀郭淮', - xin_guohuai_prefix:'手杀', + xin_guohuai:'手杀界郭淮', + xin_guohuai_prefix:'手杀界', mobilejingce:'精策', mobilejingce_info:'结束阶段,若此回合因使用或打出而置入弃牌堆的牌的数量不小于你的体力值,则你可以摸两张牌。', - xin_panzhangmazhong:'手杀潘璋马忠', - xin_panzhangmazhong_prefix:'手杀', + xin_panzhangmazhong:'手杀界潘璋马忠', + xin_panzhangmazhong_prefix:'手杀界', xinduodao:'夺刀', xinduodao_info:'当你受到伤害后,你可以获得伤害来源装备区里的武器牌。', xinanjian:'暗箭', xinanjian_info:'锁定技,当你使用【杀】指定目标后,若你不在目标角色攻击范围内,你选择一项:1. 令其无法响应此【杀】;2. 其受到此【杀】造成的伤害+1。', - xin_fuhuanghou:'手杀伏寿', - xin_fuhuanghou_prefix:'手杀', + xin_fuhuanghou:'手杀界伏寿', + xin_fuhuanghou_prefix:'手杀界', xinzhuikong:'惴恐', xinzhuikong_info:'每轮限一次,其他角色的回合开始时,若其体力值不小于你,你可与其拼点。若你赢,其本回合无法使用牌指定除其以外的角色为目标;若你没赢,你获得其拼点的牌,然后其视为对你使用一张【杀】。', xinqiuyuan:'求援', xinqiuyuan_info:'当你成为【杀】的目标时,你可以令另一名其他角色交给你一张除【杀】以外的基本牌,否则其也成为此【杀】的目标。', - xin_gongsunzan:'手杀公孙瓒', - xin_gongsunzan_prefix:'手杀', - re_dengai:'手杀邓艾', - re_dengai_prefix:'手杀', + xin_gongsunzan:'手杀界公孙瓒', + xin_gongsunzan_prefix:'手杀界', + re_dengai:'手杀界邓艾', + re_dengai_prefix:'手杀界', flappybird:'飞鸟', flappybird_info:'出牌阶段,你可游玩一局Flappy Bird。', - re_handang:'手杀韩当', - re_handang_prefix:'手杀', + re_handang:'手杀界韩当', + re_handang_prefix:'手杀界', nanhualaoxian:'手杀南华老仙', nanhualaoxian_prefix:'手杀', yufeng:'御风', @@ -14538,12 +15132,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yufeng_info:'出牌阶段限一次,你可以表演“御风飞行”。若表演失败,则你摸X张牌。若表演成功,则你可以选择至多X名其他角色获得“御风”效果,然后摸X-Y张牌(准备阶段开始时,你进行判定。若结果为:红色,你跳过摸牌阶段;黑色,你跳过出牌阶段和弃牌阶段。X为你的得分。Y为你选择的角色数)。', tianshu:'天书', tianshu_info:'出牌阶段开始时,若场上没有【太平要术】,则你可以弃置一张牌并选择一名角色。该角色获得并使用【太平要术】。', - re_jiangwei:'手杀姜维', - re_jiangwei_prefix:'手杀', + re_jiangwei:'手杀界姜维', + re_jiangwei_prefix:'手杀界', retiaoxin:'挑衅', retiaoxin_info:'出牌阶段限一次,你可以指定一名有牌的其他角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。', - re_zhurong:'手杀祝融', - re_zhurong_prefix:'手杀', + re_zhurong:'手杀界祝融', + re_zhurong_prefix:'手杀界', relieren:'烈刃', relieren_info:'当你使用【杀】指定目标后,你可以和目标角色进行拼点。若你赢,你获得其一张牌。若你没赢,你获得对方的拼点牌,其获得你的拼点牌。', zhouqun:'周群', @@ -14558,26 +15152,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tiansuan2_fire:'命运签', tiansuan2_3:'命运签', tiansuan2_4:'命运签', - ol_yujin:'手杀于禁', - ol_yujin_prefix:'手杀', + ol_yujin:'手杀界于禁', + ol_yujin_prefix:'手杀界', rejieyue:'节钺', rejieyue_info:'结束阶段开始时,你可以将一张牌交给一名其他角色。然后其选择一项:令你摸三张牌:或其保留一张手牌和装备区的牌,然后弃置其余的牌。', - xin_zhoucang:'手杀周仓', - xin_zhoucang_prefix:'手杀', + xin_zhoucang:'手杀界周仓', + xin_zhoucang_prefix:'手杀界', mobilezhongyong:'忠勇', mobilezhongyong_info:'当你于出牌阶段内使用的【杀】结算结束后,若没有目标角色使用【闪】响应过此【杀】,则你可获得此【杀】;否则你可选择一项:①获得目标角色使用的【闪】,然后可将此【杀】交给另一名其他角色。②将目标角色使用的【闪】交给另一名其他角色,然后你本回合使用【杀】的次数上限+1且下一张【杀】的伤害值基数+1。(你不能使用本回合因执行〖忠勇〗的效果得到的牌)', - xin_caifuren:'手杀蔡夫人', - xin_caifuren_prefix:'手杀', + xin_caifuren:'手杀界蔡夫人', + xin_caifuren_prefix:'手杀界', xinqieting:'窃听', xinqieting_info:'其他角色的回合结束时,若其本回合内未对其他角色造成过伤害,则你可选择一项:①摸一张牌。②观看其两张手牌并获得其中的一张。③将其装备区内的一张牌移动至你的装备区。', xinguixiu:'闺秀', xinguixiu_info:'锁定技。结束阶段,若你的体力值为:奇数,你摸一张牌;偶数,你回复1点体力。', - re_zhonghui:'手杀钟会', - re_zhonghui_prefix:'手杀', + re_zhonghui:'手杀界钟会', + re_zhonghui_prefix:'手杀界', requanji:'权计', requanji_info:'出牌阶段结束时,若你的手牌数大于体力值,或当你受到1点伤害后,你可以摸一张牌,然后将一张手牌置于武将牌上,称为“权”;你的手牌上限+X(X为“权”的数量)。', - xin_guyong:'手杀顾雍', - xin_guyong_prefix:'手杀', + xin_guyong:'手杀界顾雍', + xin_guyong_prefix:'手杀界', xinshenxing:'慎行', xinshenxing_info:'出牌阶段限X次(X为你的体力值),你可以弃置两张牌,然后摸一张牌。若这两张牌颜色不同,则改为摸两张牌。', xinbingyi:'秉壹', @@ -14588,14 +15182,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhiming_info:'准备阶段开始时或弃牌阶段结束时,你摸一张牌,然后可以将一张牌置于牌堆顶。', xingbu:'星卜', xingbu_info:'结束阶段,你可以展示牌堆顶的三张牌,然后你可以根据X值(X为这三张牌中红色牌的数量),令一名其他角色获得对应的效果直到其下回合结束:①三张:其摸牌阶段多摸两张牌,使用【杀】的次数上限+1。②两张:其使用【杀】的次数上限-1,跳过弃牌阶段。③小于两张:其于准备阶段开始时弃置一张手牌。', - xin_sunluban:'手杀孙鲁班', - xin_sunluban_prefix:'手杀', + xin_sunluban:'手杀界孙鲁班', + xin_sunluban_prefix:'手杀界', xinzenhui:'谮毁', xinzenhui_info:'出牌阶段限一次。当你使用【杀】或黑色普通锦囊牌指定目标时,你可选择另一名能成为此牌目标的其他角色并选择一项:①令其也成为此牌的目标。②获得其一张牌,然后将此牌的使用者改为该角色。', xinjiaojin:'骄矜', xinjiaojin_info:'当你受到男性角色造成的伤害时,你可以弃置一张装备牌并防止此伤害。', - xin_caozhen:'手杀曹真', - xin_caozhen_prefix:'手杀', + xin_caozhen:'手杀界曹真', + xin_caozhen_prefix:'手杀界', discretesidi:'司敌', discretesidi_info:'①当你使用的不为延时锦囊牌的牌结算结束后,你可选择一名R内不存在以a为第一序偶的二元序偶的其他角色a,并选择一名角色b,在关系R内建立二元序偶<a,b>(b对其他角色不可见)。②一名角色a使用不为延时锦囊牌的牌指定b为目标时,若(aRb)∧(此牌目标数为1)为真,则{你从R内移除<a,b>,且:若b为你,你摸一张牌;若b不为你,你可选择:⒈取消此牌的目标,然后若场上没有处于濒死状态的角色,则你对a造成1点伤害。⒉摸两张牌};否则{你清除R内以a为第一元素的二元序偶}。', fuqian:'傅佥', @@ -14640,8 +15234,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shhlianhua1_info:'当你成为【杀】的目标后,你摸一张牌。然后你进行判定,若结果为黑桃,则此【杀】对你无效。', shhlianhua2:'莲华·极', shhlianhua2_info:'当你成为【杀】的目标后,你摸一张牌。然后此【杀】的使用者选择一项:①弃置一张牌。②令此【杀】对你无效。', - re_yufan:'手杀虞翻', - re_yufan_prefix:'手杀', + re_yufan:'手杀界虞翻', + re_yufan_prefix:'手杀界', rezongxuan:'纵玄', rezongxuan_place:'纵玄', rezongxuan_info:'当你的牌因弃置而进入弃牌堆后,你可以将其以任意顺序置于牌堆顶。出牌阶段限一次,你可以摸一张牌,然后将一张牌置于牌堆顶。', @@ -14658,22 +15252,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bingqing_info:'当你于出牌阶段内使用的牌结算结束后,若你于本阶段内使用的所有已结算结束的其他牌与此牌花色均不相同,则你可根据X的值执行对应效果:为2,你令一名角色摸两张牌;为3,你弃置一名角色区域内的一张牌;为4,你对一名其他角色造成1点伤害。(X为你本阶段内使用过的已结算结束的牌中包含的花色数)', yingfeng:'迎奉', yingfeng_info:'准备阶段,你可以令一名角色获得“奉”标记并移除场上所有其他的“奉”标记。有“奉”标记的角色使用牌没有距离限制。', - xin_sunxiu:'手杀孙休', - xin_sunxiu_prefix:'手杀', + xin_sunxiu:'手杀界孙休', + xin_sunxiu_prefix:'手杀界', mobileyanzhu:'宴诛', - mobileyanzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色选择一项:①你获得其装备区里所有的牌,然后你失去技能〖宴诛〗。②你获得其一张牌。', + mobileyanzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色选择一项:①你获得其装备区里所有的牌,然后你失去技能〖宴诛〗并修改技能〖兴学〗。②你获得其区域里的一张牌。', mobilexingxue:'兴学', - mobilexingxue_info:'结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值,若你未拥有〖宴诛〗,则将X改为你的体力上限,且其可以改为将一张牌交给一名其他目标角色)。', - re_wuguotai:'手杀吴国太', - re_wuguotai_prefix:'手杀', + mobilexingxue_info:'结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值)。', + mobilexingxuex:'兴学·改', + mobilexingxuex_info:'结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶或交给一名其他目标角色(X为你的体力上限)。', + re_wuguotai:'手杀界吴国太', + re_wuguotai_prefix:'手杀界', reganlu:'甘露', reganlu_info:'出牌阶段限一次,你可以选择装备区牌数之差的绝对值不大于X的两名角色或包含你在内的两名角色,然后交换这两名角色装备区内的牌。(X为你已损失的体力值)', taoqian:'手杀陶谦', taoqian_prefix:'手杀', miheng:'手杀祢衡', miheng_prefix:'手杀', - re_gaoshun:'手杀高顺', - re_gaoshun_prefix:'手杀', + re_gaoshun:'手杀界高顺', + re_gaoshun_prefix:'手杀界', peixiu:'裴秀', xingtu:'行图', xingtu_info:'锁定技。①当你使用有点数的牌结算结束后,你将此牌点数记录为X。②当你使用牌时,若X÷Y的余数为0,则你摸一张牌(Y为此牌的点数)。③你使用Y÷X的余数为0的牌无次数限制(Y为此牌的点数)。', @@ -14688,22 +15284,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spdaizui:'戴罪', spdaizui2:'戴罪', spdaizui_info:'限定技。当你受到伤害值不小于体力值的伤害时,你可防止此伤害并将此伤害渠道对应的所有实体牌置于伤害来源的武将牌上,称为“释”。本回合结束时,其获得所有“释”。', - re_caiwenji:'手杀蔡琰', - re_caiwenji_prefix:'手杀', - re_bulianshi:'手杀步练师', - re_bulianshi_prefix:'手杀', + re_caiwenji:'手杀界蔡琰', + re_caiwenji_prefix:'手杀界', + re_bulianshi:'手杀界步练师', + re_bulianshi_prefix:'手杀界', reanxu:'安恤', reanxu_info:'出牌阶段限一次,你可以选择两名其他角色,令其中一名角色获得另一名角色的一张牌。若以此法移动的牌不来自装备区,则你摸一张牌。然后你可以令二者中手牌数较少的一名角色摸一张牌。', - xin_jushou:'手杀沮授', - xin_jushou_prefix:'手杀', + xin_jushou:'手杀界沮授', + xin_jushou_prefix:'手杀界', xinjianying:'渐营', - xinjianying_info:'①当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。②出牌阶段限一次,你可以将一张牌当做任意基本牌使用(不计入次数限制)。若你于此阶段内使用的上一张牌有花色,则此牌的花色视为上一张牌的花色。', - re_xunyu:'手杀荀彧', - re_xunyu_prefix:'手杀', + xinjianying_info:'①当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。②出牌阶段限一次,你可以将一张牌当做任意基本牌使用。若你于此阶段内使用的上一张牌有花色,则此牌的花色视为上一张牌的花色。', + re_xunyu:'手杀界荀彧', + re_xunyu_prefix:'手杀界', rejieming:"节命", rejieming_info:"当你受到1点伤害后,你可以令一名角色摸两张牌。然后若其手牌数小于体力上限,则你摸一张牌。", - xin_quancong:'手杀全琮', - xin_quancong_prefix:'手杀', + xin_quancong:'手杀界全琮', + xin_quancong_prefix:'手杀界', sbyaoming:'邀名', sbyaoming_info:'蓄力技(2/4)。①当你受到1点伤害后,你可以获得1点蓄力值。②出牌阶段或当你受到伤害后,你可消耗1点蓄力值并选择一项:⒈弃置一名手牌数不小于你的角色的一张牌。⒉令一名手牌数不大于你的角色摸一张牌。若你上次发动〖邀名②〗时未获得过蓄力值且你选择的选项和上次不同,则你获得1点蓄力值。', ruanhui:'阮慧', @@ -14719,8 +15315,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ buxu:'补叙', buxu_backup:'补叙', buxu_info:'出牌阶段,若你的“六经”中有空缺的位置,则你可以弃置X+1张牌并选择一种空缺的“六经”(X为你本阶段内发动过〖补叙〗的次数)。系统从牌堆或弃牌堆中检索一张对应的牌,然后你将此牌置于你武将牌上,填补“六经”的对应位置。', - re_dianwei:'手杀典韦', - re_dianwei_prefix:'手杀', + re_dianwei:'手杀界典韦', + re_dianwei_prefix:'手杀界', liuye:'手杀刘晔', liuye_prefix:'手杀', sp_caosong:'手杀曹嵩', @@ -14746,14 +15342,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jiebing_info:'锁定技。当你受到伤害后,你选择来源外的一名其他角色,随机获得其一张牌并展示。若此牌为装备牌,你使用之。', hannan:'扞难', hannan_info:'出牌阶段限一次。你可以与一名角色拼点,赢的角色对没赢的角色造成2点伤害。', - xin_wuyi:'手杀吴懿', - xin_wuyi_prefix:'手杀', + xin_wuyi:'手杀界吴懿', + xin_wuyi_prefix:'手杀界', sbbenxi:'奔袭', sbbenxi_info:'出牌阶段开始时,你可以弃置至少一张牌,然后你于此阶段获得如下效果:①你至其他角色距离-X;②当你使用的下一张基本牌或普通锦囊牌A选择目标后,你可以额外指定X名距离为1的角色为目标;③牌A结算结束后,若此牌造成过伤害,你摸五张牌(X为你以此法弃置的牌数)。', - xin_zhuzhi:'手杀朱治', - xin_zhuzhi_prefix:'手杀', + xin_zhuzhi:'手杀界朱治', + xin_zhuzhi_prefix:'手杀界', sbanguo:'安国', - sbanguo_info:'①游戏开始时,你令一名其他角色获得1枚“安国”标记(有“安国”的角色手牌上限基数等于体力上限)。②出牌阶段开始时,你可以将一名有“安国”的角色的所有“安国”移动给一名本局游戏未获得过“安国”的其他角色。③当你受到伤害时,若有有“安国”的角色且伤害值不小于你的体力值且此伤害没有来源或来源没有“安国”,防止此伤害。④一名角色进入濒死状态时,若其有你因〖安国①〗获得的“安国”,你移去其该“安国”,令其将体力回复至1点。然后你选择一项:1.若你的体力值大于1,你失去体力至1点;2.若你的体力上限大于1,你将体力上限减至1。最后你令其获得X点护甲(X为你以此法失去的体力值或减少的体力上限)。', + sbanguo_info:'①游戏开始时,你令一名其他角色获得1枚“安国”标记(有“安国”的角色手牌上限基数等于体力上限)。②出牌阶段开始时,你可以将一名有“安国”的角色的所有“安国”移动给一名本局游戏未获得过“安国”的其他角色。③当你受到伤害时,若有有“安国”的角色且伤害值不小于你的体力值且此伤害没有来源或来源没有“安国”,防止此伤害。④一名角色进入濒死状态时,若其有你因〖安国①〗获得的“安国”,你移去其该“安国”,令其将体力回复至1点。然后你选择一项:1.若你的体力值大于1,你失去体力至1点;2.若你的体力上限大于1,你将体力上限减至1。最后你令其获得1点护甲。', wangjun:'手杀王濬', wangjun_prefix:'手杀', zhujian:'筑舰', @@ -14766,12 +15362,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spdaming_info:'①游戏开始时,你获得1点“达命”值。②其他角色A的出牌阶段限一次。其可以交给你一张牌,然后你选择另一名其他角色B。若B有与此牌相同类型的牌,其将一张该类型的牌交给A,你获得1点“达命”值;否则你将此牌交给A。', spxiaoni:'嚣逆', spxiaoni_info:'①出牌阶段限一次。若你的“达命”值大于0,你可以将一张牌当任意一种【杀】或伤害类锦囊牌使用。然后你减少等同于此牌指定目标数的“达命”值。②你的手牌上限基数为X(X为“达命”值,且至多为你的体力值,至少为0)。', - xin_zhuhuan:'手杀朱桓', - xin_zhuhuan_prefix:'手杀', + xin_zhuhuan:'手杀界朱桓', + xin_zhuhuan_prefix:'手杀界', xinpingkou:'平寇', xinpingkou_info:'回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。然后你从牌堆中获得一张装备牌。', - xin_caoxiu:'手杀曹休', - xin_caoxiu_prefix:'手杀', + xin_caoxiu:'手杀界曹休', + xin_caoxiu_prefix:'手杀界', xinqingxi:'倾袭', xinqingxi_info:'每回合限一次。当你对其他角色造成伤害时,你可以令其选择一项:1.弃置X张手牌(X为4减去你至其的距离,至少为1);2.令此伤害+1。', yj_weiyan:'☆魏延', @@ -14780,10 +15376,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mbguli_info:'出牌阶段限一次。你可以将所有手牌当做一张无视防具的【杀】使用。此牌结算结束后,若此牌造成过伤害,你可以失去1点体力并将手牌摸至X张(X为你的体力上限)。', mbaosi:'骜肆', mbaosi_info:'锁定技。当你于出牌阶段对一名攻击范围内的角色造成伤害后,你于此阶段对其使用牌无次数限制。', - xin_zhoutai:'手杀周泰', - xin_zhoutai_prefix:'手杀', - re_yanwen:'手杀颜良文丑', - re_yanwen_prefix:'手杀', + xin_zhoutai:'手杀界周泰', + xin_zhoutai_prefix:'手杀界', + re_yanwen:'手杀界颜良文丑', + re_yanwen_prefix:'手杀界', qianzhao:'手杀牵招', qianzhao_prefix:'手杀', mbshihe:'势吓', @@ -14834,8 +15430,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ scsanruo_info:'你可以将一张♥牌当【桃】、♦牌当火【杀】、♣牌当【闪】、♠牌当【无懈可击】使用。当你以此法使用或打出【杀】或【闪】时,你可以获得对方的一张牌;当你以此法使用【桃】时,你可以获得一名其他角色的一张牌;当你以此法使用【无懈可击】时,你可以获得此牌响应的普通锦囊牌的使用者的一张牌。', scsmiaoyu:'妙语', scsmiaoyu_info:'你可以将至多两张相同花色的牌按照以下规则使用或打出:♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。', - re_xiaoqiao:'手杀小乔', - re_xiaoqiao_prefix:'手杀', + re_xiaoqiao:'手杀界小乔', + re_xiaoqiao_prefix:'手杀界', xin_sunliang:'手杀孙亮', xin_sunliang_prefix:'手杀', xinkuizhu:'溃诛', @@ -14844,48 +15440,87 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinzhizheng_info:'锁定技,你的出牌阶段内,攻击范围内不包含你的其他角色不能成为你使用牌的目标。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。', xinlijun:'立军', xinlijun_info:'主公技,其他吴势力角色于其回合内使用【杀】结算完毕后,其可以将此【杀】对应的实体牌交给你,然后你可以令其摸一张牌。', - xin_zhangyi:'手杀张嶷', - xin_zhangyi_prefix:'手杀', + xin_zhangyi:'手杀界张嶷', + xin_zhangyi_prefix:'手杀界', xinwurong:'怃戎', xinwurong_info:'出牌阶段限一次,你可以与一名其他角色进行谋弈:
  • 若你选择“镇压”且其选择“反抗”,你对其造成1点伤害,然后你摸一张牌。
  • 若你选择“安抚”且其选择“归顺”,其须交给你两张牌(若其手牌数不足两张,则改为令其跳过其下个摸牌阶段)。
  • 若你选择“镇压”且其选择“归顺”,你获得其一张牌,然后你交给其两张牌。
  • 若你选择“安抚”且其选择“反抗”,你受到1点伤害,然后你摸两张牌。', xin_guozhao:'手杀郭照', xin_guozhao_prefix:'手杀', yichong:'易宠', - yichong_info:'①准备阶段,你可以选择一名其他角色并选择一个花色,然后你获得其所有此花色的牌,移除场上的所有“雀”标记,令其获得“雀”标记直到你的下个回合开始。②拥有“雀”标记的角色获得你最后一次发动〖易宠①〗选择的花色的牌后,你获得这些牌(你至多通过每个“雀”得到五张牌)。', + yichong_info:'①准备阶段,你可以选择一名其他角色并选择一个花色,然后你获得其所有此花色的装备牌和其一张此花色的手牌,移除场上的所有“雀”标记,令其获得“雀”标记直到你的下个回合开始。②拥有“雀”标记的角色获得你最后一次发动〖易宠①〗选择的花色的牌后,你获得这些牌(你至多通过每个“雀”得到一张牌)。', wufei:'诬诽', - wufei_info:'若场上存在拥有“雀”标记的角色A,则:①当你使用【杀】或伤害类锦囊牌指定第一个目标后,你令A成为此牌伤害来源。②当你受到伤害后,若A的体力值大于1且A的体力值大于你,则你可以对A造成1点伤害。', + wufei_info:'若场上存在拥有“雀”标记的角色A,则:①当你使用【杀】或伤害类锦囊牌指定第一个目标后,你令A成为此牌伤害来源。②当你受到伤害后,若A的体力值大于3,则你可以令A受到1点无来源伤害。', yj_zhoubuyi:'☆周不疑', yj_zhoubuyi_prefix:'☆', mbhuiyao:'慧夭', mbhuiyao_info:'出牌阶段限一次。你可以受到1点无来源伤害,视为对一名其他角色造成过1点伤害。', mbquesong:'雀颂', mbquesong_info:'一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸等同于其装备区中空栏的数量的牌并复原武将牌;2.弃置等同于其体力值的手牌并回复1点体力。', - xin_yuanshao:'手杀袁绍', - xin_yuanshao_prefix:'手杀', + xin_yuanshao:'手杀界袁绍', + xin_yuanshao_prefix:'手杀界', re_baosanniang:'手杀鲍三娘', re_baosanniang_prefix:'手杀', - re_liushan:'手杀刘禅', - re_liushan_prefix:'手杀', + re_liushan:'手杀界刘禅', + re_liushan_prefix:'手杀界', re_sunben:'界孙笨', re_sunben_prefix:'界', - re_zhangzhang:'手杀张昭张纮', - re_zhangzhang_prefix:'手杀', - re_caozhi:'手杀曹植', - re_caozhi_prefix:'手杀', - re_sunjian:'手杀孙坚', - re_sunjian_prefix:'手杀', + re_zhangzhang:'手杀界张昭张纮', + re_zhangzhang_prefix:'手杀界', + re_caozhi:'手杀界曹植', + re_caozhi_prefix:'手杀界', + re_sunjian:'手杀界孙坚', + re_sunjian_prefix:'手杀界', sunru:'手杀孙茹', sunru_prefix:'手杀', pangdegong:"手杀庞德公", pangdegong_prefix:'手杀', zhaotongzhaoguang:"手杀赵统赵广", zhaotongzhaoguang_prefix:'手杀', - re_liru:'手杀李儒', - re_liru_prefix:'手杀', - re_chenqun:'手杀陈群', - re_chenqun_prefix:'手杀', + re_liru:'手杀界李儒', + re_liru_prefix:'手杀界', + re_chenqun:'手杀界陈群', + re_chenqun_prefix:'手杀界', + old_yuanshu:'手杀界袁术', + old_yuanshu_prefix:'手杀界', + re_liru:'手杀界李儒', + re_liru_prefix:'手杀界', + re_chenqun:'手杀界陈群', + re_chenqun_prefix:'手杀界', old_yuanshu:'手杀袁术', old_yuanshu_prefix:'手杀', + baoxin:'鲍信', + mutao:'募讨', + mutao_info:'出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】置于武将牌上,然后将这些牌依次随机交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为3)。', + yimou:'毅谋', + yimou_info:'当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色,然后摸一张牌。', + jiangji:'蒋济', + jilun:'机论', + jilun_info:'①当你受到伤害后,若你拥有技能〖急筹〗,则你可以一项:1.摸X张牌(X为〖急筹①〗记录数,且X且至少为1,至多为5)。2.获得1枚“机论”标记。②一名角色的结束阶段,若你拥有“机论”,则重复选择执行以下项直到你没有“机论”标记:1.失去1枚“机论”标记,视为使用一张〖急筹①〗记录过且未被〖机论②〗记录过的普通锦囊牌并记录此牌牌名。2.失去所有“机论”标记。', + liwei:'李遗', + jiaohua:'教化', + jiaohua_backup:'教化', + jiaohua_info:'出牌阶段限三次,你可以选择一个未被〖教化〗记录过的牌的类型,令一名角色从牌堆中获得一张此类型的牌,然后记录此类型,若基本、锦囊、装备均已被你发动〖教化〗记录,则你清空〖教化〗记录。', + laimin:'来敏', + laishou:'来寿', + laishou_info:'锁定技。①当你受到伤害值大于等于你的体力值的伤害时,若你的体力上限小于9,你防止此伤害并增加等量体力上限。②准备阶段,若你的体力上限不小于9,你死亡。', + luanqun:'乱群', + luanqun_info:'出牌阶段限一次,若你有手牌,则你可以令所有有手牌的角色同时展示一张手牌,然后你可以获得其中一张与你展示的牌颜色相同的展示牌,所有本次展示牌颜色与你展示的牌颜色不同的角色的下个出牌阶段使用的第一张【杀】只能对你使用,且此【杀】不可被响应。', + xin_wuban:'吴班', + xinjintao:'进讨', + xinjintao_info:'锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】不可被响应,第二张【杀】伤害+1。', + xinlianhuan:'连环', + xinlianhuan_info:'你可以将一张♣手牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。', + mb_sunluyu:'手杀孙鲁育', + mb_sunluyu_prefix:'手杀', + mbmumu:'穆穆', + mbmumu_info:'出牌阶段开始时,你可以选择一项:1.弃置场上的一张装备牌;2.获得场上的一张防具牌,然后你本回合不能使用或打出【杀】。', + mbmeibu:'魅步', + mbmeibu_info:'其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。', + mbzhixi:'止息', + mbzhixi_info:'锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。', + yanxiang:'阎象', + kujian:'苦谏', + kujian_info:'出牌阶段限一次,你可以将至多两张手牌称为“谏”并交给一名其他角色,然后你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸两张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。', mobile_standard:'手杀异构·标准包', mobile_shenhua_feng:'手杀异构·其疾如风', diff --git a/character/mtg.js b/character/mtg.js index 0dc27c9aa..0e3ef6aef 100644 --- a/character/mtg.js +++ b/character/mtg.js @@ -470,23 +470,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mtg_ayeni:'阿耶尼', mduohun:'夺魂', - mduohun_info:'锁定技,当你解除濒死状态后,令你进入濒死状态的角色失去一点体力', + mduohun_info:'锁定技,当你解除濒死状态后,令你进入濒死状态的角色失去1点体力。', lingyong:'灵俑', lingyong2:'灵俑', lingyong3:'灵俑', lingyong3_bg:'俑', - lingyong_info:'锁定技,每当一名其他角色死亡,你获得一个与该角色同名且体力上限为1、初始手牌为2的随从;出牌阶段,你可以调遣以此法获得的随从(直到随从死亡不可再次切换)', + lingyong_info:'锁定技,每当一名其他角色死亡,你获得一个与该角色同名且体力上限为1、初始手牌为2的随从;出牌阶段,你可以调遣以此法获得的随从(直到随从死亡不可再次切换)。', mbaizhan:'百战', - mbaizhan_info:'锁定技,每当你造成一点伤害,你获得一点护甲', + mbaizhan_info:'锁定技,每当你造成1点伤害,你获得1点护甲。', msilian:'祀炼', - msilian_info:'结束阶段,若你有护甲,你可以移去全部护甲,然后进行一个额外回合;在额外回合中,你的摸牌阶段摸牌基数为你移去的护甲数;额外回合结束后,若你未造成伤害,你失去一点体力', + msilian_info:'结束阶段,若你有护甲,你可以移去全部护甲,然后进行一个额外回合;在额外回合中,你的摸牌阶段摸牌基数为你移去的护甲数;额外回合结束后,若你未造成伤害,你失去1点体力。', mtongnian:'通念', - mtongnian_info:'锁定技,出牌阶段开始时,你获得一张替身牌,此牌对应一名随机敌人的一张随机手牌;每当你使用一张非替身牌,随机更换替身牌对应的牌;当你使用替身牌时,改为使用替身牌对应的牌;当出牌阶段结束,或替身牌离开手牌区,或敌方角色没有手牌时,销毁替身牌', + mtongnian_info:'锁定技,出牌阶段开始时,你获得一张替身牌,此牌对应一名随机敌人的一张随机手牌;每当你使用一张非替身牌,随机更换替身牌对应的牌;当你使用替身牌时,改为使用替身牌对应的牌;当出牌阶段结束,或替身牌离开手牌区,或敌方角色没有手牌时,销毁替身牌。', msuoling:'塑灵', - msuoling_info:'每轮限一次,当一名其他角色使用一张非转化的普通锦囊牌时,你可以弃置一张与之花色相同的牌取消之,然后你视为使用该锦囊牌', - msuoling_old_info:'出牌阶段限一次,若你手牌中有替身牌且手牌数不超过5,你可以展示手牌,若其中的非替身手牌能通过四则运算得到你的替身牌的点数,你将替身牌转化为非替身牌,然后获得一张新的替身牌(此技能托管无效)', + msuoling_info:'每轮限一次,当一名其他角色使用一张非转化的普通锦囊牌时,你可以弃置一张与之花色相同的牌取消之,然后你视为使用该锦囊牌。', + msuoling_old_info:'出牌阶段限一次,若你手牌中有替身牌且手牌数不超过5,你可以展示手牌,若其中的非替身手牌能通过四则运算得到你的替身牌的点数,你将替身牌转化为非替身牌,然后获得一张新的替身牌(此技能托管无效)。', mhuanyi:'幻逸', - mhuanyi_info:'每两轮限一次,结束阶段,你可以选择一名其他角色和一种卡牌类型(选择结果对其他角色不可见),直到下一回合开始,当你首次成为该类型卡牌的惟一目标时,你将目标转移给你指定的角色(目标须合法)', + mhuanyi_info:'每两轮限一次,结束阶段,你可以选择一名其他角色和一种卡牌类型(选择结果对其他角色不可见),直到下一回合开始,当你首次成为该类型卡牌的惟一目标时,你将目标转移给你指定的角色(目标须合法)。', }, }; }); diff --git a/character/offline.js b/character/offline.js index c9005b9ac..ffc9fc00c 100644 --- a/character/offline.js +++ b/character/offline.js @@ -6,7 +6,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connectBanned:['zhangliang'], characterSort:{ offline:{ - offline_star:["sp_xiahoushi","jsp_zhaoyun","huangjinleishi","sp_pangtong","sp_daqiao","sp_ganning","sp_xiahoudun","sp_lvmeng","sp_zhangfei","sp_liubei","old_machao","zhangliang","jsp_caoren"], + offline_star:['jsp_ganfuren',"sp_xiahoushi","jsp_zhaoyun","huangjinleishi","sp_pangtong","sp_daqiao","sp_ganning","sp_xiahoudun","sp_lvmeng","sp_zhangfei","sp_liubei","old_machao","zhangliang","jsp_caoren"], offline_sticker:['sp_gongsunzan','sp_simazhao','sp_wangyuanji','sp_xinxianying','sp_liuxie'], offline_yijiang:['ol_xinxianying'], offline_luanwu:["ns_lijue","ns_zhangji","ns_fanchou"], @@ -19,6 +19,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + jsp_ganfuren:['female','shu',3,['shushen','shenzhi'],['character:gz_ganfuren']], ol_xinxianying:['female','wei',3,['xincaishi','xinzhongjian']], zhangliang:["male","qun",4,["old_jijun","old_fangtong"]], jsp_caoren:['male','wei',4,['kuiwei','yanzheng']], @@ -944,6 +945,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ trigger.cancel(); + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(card.name==='sha'&&!game.hasNature(card)&&target.hasEmptySlot(2)) return 'zeroplayertarget'; + if(get.subtype(card)=='equip2'&&target.isEmpty(2)) return [0.6,-0.8]; + } + } } }, //战役篇蒋钦 @@ -983,9 +992,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ preHidden:true, filter:function(event,player){ if(get.type(event.card)!='equip') return false; - var gz=get.mode()=='guozhan'; - if(gz&&event.player.isFriendOf(player)) return false; - return player.countMark('pkwuku')<(gz?2:3); + return player.countMark('pkwuku')<3; }, content:function(){ player.addMark('pkwuku',1); @@ -1978,7 +1985,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ skip:{ - trigger:{player:'phaseBefore'}, + trigger:{player:'phaseBeforeStart'}, forced:true, priority:Infinity, popup:false, @@ -5578,7 +5585,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.directfalse=true; } else{ - target.chooseCard('交给'+get.translation(player)+'一张【闪】,或失去一点体力',function(card){ + target.chooseCard('交给'+get.translation(player)+'一张【闪】,或失去1点体力',function(card){ return card.name=='shan'; }).set('ai',function(card){ if(_status.event.nshan>1) return 1; @@ -6317,7 +6324,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ splanggu_rewrite:'狼顾', splanggu_info:'当你受到有来源的伤害后,你可以进行判定(此判定结果生效前,你可以打出一张手牌替换判定牌)。然后你可以观看伤害来源的手牌并弃置其中的任意张与判定结果花色相同的牌。', spfuluan:'扶乱', - spfuluan_info:'出牌阶段限一次,你可以弃置三张花色相同的牌并选择攻击范围内的一名角色。若如此做,该角色翻面且你不能使用【杀】直到回合结束', + spfuluan_info:'出牌阶段限一次,你可以弃置三张花色相同的牌并选择攻击范围内的一名角色。若如此做,该角色翻面且你不能使用【杀】直到回合结束。', spshude:'淑德', spshude_info:'结束阶段开始时,你可以将手牌补至体力上限。', spmingjian:'明鉴', @@ -6343,7 +6350,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nsfeixiong:'飞熊', nsfeixiong_info:'出牌阶段开始时,你可以和一名其他角色拼点。赢的角色对没赢的角色造成1点伤害。', nscesuan:'策算', - nscesuan_info:'锁定技,当你受到伤害时,你防止此伤害并失去一点体力上限。若你因以此法失去体力上限导致体力值减少,则你摸一张牌。', + nscesuan_info:'锁定技,当你受到伤害时,你防止此伤害并失去1点体力上限。若你因以此法失去体力上限导致体力值减少,则你摸一张牌。', nslulve:'掳掠', nslulve_info:'出牌阶段限一次,你可以弃置X张牌并选择一名装备区内有牌的其他角色,然后对其造成1点伤害(X为其装备区内的牌数)。', ns_fanchou:'SP樊稠', @@ -6365,8 +6372,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinfu_yanyu2:"燕语", xinfu_xiaode:"孝德", xinfu_xiaode_info:"其他角色死亡后,你可以声明该角色武将牌上的一个技能(主公技、觉醒技、隐匿技、使命技除外)。若如此做,你获得此技能且不能再发动〖孝德〗直到你的回合结束。", - jsp_zhaoyun:'★SP赵云', - jsp_zhaoyun_prefix:'★SP', + jsp_zhaoyun:'J.SP赵云', + jsp_zhaoyun_prefix:'J.SP', chixin:'赤心', chixin1:'赤心', chixin2:'赤心', @@ -6378,55 +6385,55 @@ game.import('character',function(lib,game,ui,get,ai,_status){ fulu_info:'当你声明使用普通【杀】后,你可以将此【杀】改为雷【杀】。', fuji:'助祭', fuji_info:'当一名角色造成雷属性伤害时,你可以令其进行判定,若结果为黑色,此伤害+1;若结果为红色,该角色获得判定牌。', - sp_pangtong:'SP庞统', - sp_pangtong_prefix:'SP', + sp_pangtong:'☆SP庞统', + sp_pangtong_prefix:'☆SP', manjuan:'漫卷', manjuan_info:'其他角色的牌因弃置而进入弃牌堆后,你可以弃置一张花色与之不同的牌,然后获得此牌。', xinmanjuan:'漫卷', xinmanjuan_info:'锁定技,当你不因〖漫卷〗或〖醉乡〗而得到牌时,你将此牌置入弃牌堆。然后若此时处于你的回合内,则你可以从弃牌堆中选择获得一张与此牌点数相同的其他牌。', zuixiang:'醉乡', zuixiang2:'醉乡', - zuixiang_info:'限定技,准备阶段开始时,你可以展示牌堆顶的3张牌并置于你的武将牌上。你不能使用或打出与该些牌同类的牌,所有同类牌对你无效。之后的每个准备阶段,你须重复展示一次,直到这些牌中任意两张点数相同。然后,你获得这些牌。', - sp_daqiao:'★SP大乔', - sp_daqiao_prefix:'★SP', + zuixiang_info:'限定技。准备阶段开始时,你可以展示牌堆顶的三张牌并置于你的武将牌上。你不能使用或打出与该些牌同类的牌,所有同类牌对你无效。之后的每个准备阶段,你须重复展示一次,直到这些牌中任意两张点数相同。然后,你获得这些牌。', + sp_daqiao:'☆SP大乔', + sp_daqiao_prefix:'☆SP', yanxiao:'言笑', yanxiao_info:'出牌阶段,你可以将一张♦牌置于一名角色的判定区内。判定区内有〖言笑〗牌的角色下个判定阶段开始时,其获得判定区里的所有牌。', anxian:'安娴', anxian_info:'当你使用【杀】对目标角色造成伤害时,你可以防止此伤害,令其弃置一张手牌,然后你摸一张牌;当你成为【杀】的目标后,你可以弃置一张手牌,令此【杀】对你无效,然后此【杀】的使用者摸一张牌。', - sp_ganning:'★SP甘宁', - sp_ganning_prefix:'★SP', + sp_ganning:'☆SP甘宁', + sp_ganning_prefix:'☆SP', yinling:'银铃', yinling_bg:'锦', yinling_info:'出牌阶段,若你的“锦”小于四张,你可以弃置一张黑色牌并指定一名其他角色。若如此做,你将其的一张牌置于你的武将牌上,称为“锦”。', junwei:'军威', junwei2:'军威', junwei_info:'结束阶段开始时,你可以移去三张“锦”。若如此做,你须指定一名角色并令其选择一项:1.展示一张【闪】,然后你将此【闪】交给一名其他角色。2.该角色失去1点体力,然后你将其装备区内的一张牌移出游戏。该角色的回合结束后,将以此法移出游戏的装备牌移回原处。', - sp_xiahoudun:'★SP夏侯惇', - sp_xiahoudun_prefix:'★SP', + sp_xiahoudun:'☆SP夏侯惇', + sp_xiahoudun_prefix:'☆SP', fenyong:'愤勇', fenyong2:'愤勇', fenyong2_bg:'勇', fenyong_info:'每当你受到一次伤害后,你可以获得一枚「愤勇」标记;当你拥有「愤勇」标记时,防止你受到的所有伤害。', xuehen:'雪恨', xuehen_info:'每个角色的结束阶段开始时,若你有愤勇标记,你弃置之,然后选择一项:1.弃置当前回合角色X张牌(X为你已损失的体力值);2.视为对一名任意角色使用一张【杀】。', - sp_lvmeng:'★SP吕蒙', - sp_lvmeng_prefix:'★SP', + sp_lvmeng:'☆SP吕蒙', + sp_lvmeng_prefix:'☆SP', tanhu:'探虎', tanhu2:'探虎', tanhu3:'探虎', tanhu_info:'出牌阶段限一次,你可以与一名其他角色拼点。若你赢,你获得以下效果直到回合结束:你与该角色的距离为1,你对该角色使用的普通锦囊牌不能被【无懈可击】响应。', mouduan:'谋断', mouduan_info:'游戏开始时,你获得标记“武”并获得技能〖激昂〗和〖谦逊〗。当你失去手牌后,若手牌数不大于2,你须将你的标记变为“文”,将这两项技能改为〖英姿〗和〖克己〗。一名角色的回合开始前,你可弃一张牌将标记翻回。', - sp_zhangfei:'★SP张飞', - sp_zhangfei_prefix:'★SP', + sp_zhangfei:'☆SP张飞', + sp_zhangfei_prefix:'☆SP', jie:'嫉恶', jie_info:'锁定技,当你使用红色【杀】造成伤害时,此伤害+1。', dahe:'大喝', dahe2:'大喝', dahe2_bg:'喝', dahe_info:'出牌阶段限一次,你可以与一名其他角色拼点。若你赢,该角色不能使用或打出不为♥花色的【闪】直到回合结束,且你可将该角色拼点的牌交给场上一名体力不多于你的角色。若你没赢,你须展示手牌并弃置其中的一张。', - sp_liubei:'★SP刘备', - sp_liubei_prefix:'★SP', + sp_liubei:'☆SP刘备', + sp_liubei_prefix:'☆SP', zhaolie:'昭烈', zhaolie_info:'摸牌阶段摸牌时,你可以少摸一张牌并指定攻击范围内的一名角色。你展示牌堆顶的三张牌,将其中的非基本牌和【桃】置于弃牌堆,然后该角色选择一项:1.你对其造成X点伤害,然后其获得这些基本牌;2.其弃置X张牌,然后你获得这些基本牌。(X为其中非基本牌的数量)', shichou:'誓仇', @@ -6500,8 +6507,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yjluoshen:'洛神', yjluoshen_info:'准备阶段,你可以判定并获得判定牌,且可重复此流程直到结果的颜色不同。', //线下E系列 一战成名 战役篇官盗 - shen_jiaxu:'神贾诩', - shen_jiaxu_prefix:'神', + shen_jiaxu:'战役篇神贾诩', + shen_jiaxu_prefix:'战役篇神', zybishi:'避世', zybishi_info:'当你成为【杀】的目标后,你可以令使用者摸一张牌,然后令此【杀】无效。', zyjianbing:'谏兵', @@ -6673,10 +6680,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ vtbmeiniang_info:'其他角色的出牌阶段开始时,你可以令其视为使用一张无次数限制且不计入次数的【酒】。', vtbyaoli:'媱丽', vtbyaoli_info:'其他角色于其出牌阶段内使用【酒】后,你可以令其于本回合内使用的下一张【杀】不能被响应且可以额外指定一个目标。', - old_machao:'★SP马超', - old_machao_prefix:'★SP', - jsp_caoren:'★SP曹仁', - jsp_caoren_prefix:'★SP', + old_machao:'J.SP马超', + old_machao_prefix:'J.SP', + jsp_caoren:'☆SP曹仁', + jsp_caoren_prefix:'☆SP', + jsp_ganfuren:'SP甘夫人', + jsp_ganfuren_prefix:'SP', zhangliang:'SP张梁', zhangliang_prefix:'SP', ol_xinxianying:'将辛宪英', diff --git a/character/old.js b/character/old.js index ce1b929f0..c03f2c07a 100755 --- a/character/old.js +++ b/character/old.js @@ -6,26 +6,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterSort:{ old:{ old_standard:['ol_yuanshu'], - old_shenhua:['old_caocao',"yuji","zhangjiao","old_zhugezhan","old_guanqiujian","xiahouyuan","weiyan","old_xiaoqiao","pangde","xuhuang",'junk_sunquan',"huangzhong","new_caoren",'old_chendao'], - old_refresh:["old_zhangfei","old_huatuo","old_zhaoyun","ol_huaxiong",'old_re_lidian'], + old_shenhua:['old_shen_zhaoyun','old_caocao',"yuji","zhangjiao","old_zhugezhan","old_guanqiujian","xiahouyuan","weiyan","old_xiaoqiao","pangde","xuhuang",'junk_sunquan',"huangzhong","new_caoren",'old_chendao'], + old_refresh:["old_zhangfei","old_huatuo","old_zhaoyun","ol_huaxiong",'old_guanyu'], old_yijiang1:["masu","xushu","xin_yujin","old_xusheng","old_lingtong","fazheng",'old_gaoshun','re_yujin'], old_yijiang2:["old_zhonghui","madai",'old_handang','old_liubiao','oldre_liubiao','old_guanzhang','old_wangyi'], old_yijiang3:["liru","old_zhuran","old_fuhuanghou","old_caochong"], old_yijiang4:["old_caozhen","old_chenqun","old_zhuhuan",'old_caorui'], old_yijiang5:["old_caoxiu","old_zhuzhi"], old_yijiang67:["ol_zhangrang",'old_huanghao','old_liyan'], - old_sp:["old_wanglang","old_maliang","old_zhangxingcai","old_wangyun",'old_dingfeng'], + old_sp:['old_shixie',"panfeng","old_wanglang","old_maliang","old_zhangxingcai","old_wangyun",'old_dingfeng','old_guanyinping'], old_yingbian:['junk_simayi','old_yangyan','old_yangzhi'], old_mobile:["old_caochun"], }, }, character:{ + old_shixie:['male','qun',3,['biluan','lixia']], + panfeng:['male','qun',4,['kuangfu']], + old_shen_zhaoyun:['male','shen',2,['oldjuejing','oldlonghun'],['shu']], + old_guanyinping:['female','shu',3,['xueji_old','oldhuxiao','oldwuji']], old_caocao:['male','shen',3,['junkguixin','feiying'],['die_audio']], old_chendao:['male','shu',4,['drlt_wanglie']], old_liyan:['male','shu',3,['duliang','fulin']], - old_re_lidian:['male','wei',3,['xunxun','wangxi']], old_guanzhang:['male','shu',4,['old_fuhun']], - new_caoren:['male','wei',4,['jushou']], + new_caoren:['male','wei',4,['moon_jushou','jiewei']], huangzhong:['male','shu',4,['liegong']], junk_sunquan:['male','shen',4,['dili','yuheng'],['wei']], old_dingfeng:['male','wu',4,['fenxun','duanbing']], @@ -56,6 +59,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ old_zhangfei:['male','shu',4,['new_repaoxiao','new_tishen']], old_zhaoyun:['male','shu',4,['longdan','new_yajiao']], old_huatuo:['male','qun',3,['jijiu','chulao']], + old_guanyu:['male','shu',4,['wusheng','yijue']], old_caochun:['male','wei',4,['shanjia']], masu:['male','shu',3,['xinzhan','huilei']], xushu:['male','shu',3,['xswuyan','jujian'],['border:wei']], @@ -83,19 +87,79 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_yujin:['male','wei',4,['yizhong']], }, skill:{ + //山包初版神赵 + oldjuejing:{ + audio:'xinjuejing', + trigger:{player:'phaseDrawBegin2'}, + filter:function(event,player){ + return !event.numFixed&&player.getHp()num+2, + }, + }, + oldlonghun:{ + audio:'relonghun', + inherit:'xinlonghun', + prompt:()=>`将${get.cnNumber(Math.max(1,get.player().getHp()))}张♦牌当做杀,♥牌当做桃,♣牌当做闪,♠牌当做无懈可击使用或打出`, + selectCard:()=>Math.max(1,get.player().getHp()), + complexCard:true, + precontent:function(){ + delete event.result.skill; + player.logSkill('oldlonghun'); + }, + ai:{ + respondSha:true, + respondShan:true, + skillTagFilter:function(player,tag){ + var name; + switch(tag){ + case 'respondSha':name='diamond';break; + case 'respondShan':name='club';break; + case 'save':name='heart';break; + } + if(!player.countCards('hes',{suit:name})) return false; + }, + order:function(item,player){ + if(player&&_status.event.type=='phase'){ + var max=0; + var list=['sha','tao']; + var map={sha:'diamond',tao:'heart'} + for(var i=0;i=Math.max(1,player.getHp())&&player.getUseValue({name:name,nature:name=='sha'?'fire':null})>0){ + var temp=get.order({name:name,nature:name=='sha'?'fire':null}); + if(temp>max) max=temp; + } + } + max/=1.1; + return max; + } + return 2; + }, + }, + hiddenCard:function(player,name){ + if(name=='wuxie'&&_status.connectMode&&player.countCards('hes')>0) return true; + if(name=='wuxie') return player.countCards('hes',{suit:'spade'})>=Math.max(1,get.player().getHp()); + if(name=='tao') return player.countCards('hes',{suit:'heart'})>=Math.max(1,get.player().getHp()); + }, + }, //魏武帝 junkguixin:{ init:function(){ if(!_status.junkguixin){ _status.junkguixin=[]; - for(var name in lib.character){ + if(!_status.characterlist){ + lib.skill.pingjian.initList(); + } + for(const name of _status.characterlist){ if(!lib.character[name][3]) continue; - if(game.players.some(target=>{ - if(target.name&&target.name==name) return true; - if(target.name1&&target.name1==name) return true; - if(target.name2&&target.name2==name) return true; - return false; - })) continue; _status.junkguixin.addArray(lib.character[name][3].filter(skill=>{ var info=get.info(skill); return info&&info.zhuSkill&&(!info.ai||!info.ai.combo); @@ -1037,6 +1101,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ old_zhangfei_prefix:'新杀', old_huatuo:'OL华佗', old_huatuo_prefix:'OL', + old_guanyu:'旧关羽', + old_guanyu_prefix:'旧', ol_zhangrang:'旧张让', ol_zhangrang_prefix:'旧', ol_liaohua:'OL廖化', @@ -1120,15 +1186,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ oldqinqing:'寝情', oldqinqing_info:'结束阶段,你可以选择一名攻击范围内含有主公的其他角色,然后你弃置该角色的一张牌(无牌则不弃),并令其摸一张牌。若该角色的手牌数大于主公,你摸一张牌。', oldhuisheng:'贿生', - oldhuisheng_info:'每名角色限一次。当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张并防止此伤害;2.弃置等量的牌', + oldhuisheng_info:'每名角色限一次。当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张并防止此伤害;2.弃置等量的牌。', old_dingfeng:'旧丁奉', old_dingfeng_prefix:'旧', junk_sunquan:'旧神孙权', junk_sunquan_prefix:'旧神', new_caoren:'旧曹仁', new_caoren_prefix:'旧', - old_re_lidian:'旧李典', - old_re_lidian_prefix:'旧', old_liyan:'旧李严', old_liyan_prefix:'旧', old_chendao:'旧陈到', @@ -1139,6 +1203,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ junkguixin_info:'回合结束时,你可以选择一项:①获得剩余武将牌堆的所有主公技的其中一个技能;②更改一名其他角色的势力。', old_caochun:'旧曹纯', old_caochun_prefix:'旧', + old_guanyinping:'旧关银屏', + old_guanyinping_prefix:'旧', + old_shen_zhaoyun:'旧神赵云', + old_shen_zhaoyun_prefix:'旧神', + oldjuejing:'绝境', + oldjuejing_info:'锁定技。①摸牌阶段,你令额定摸牌数+X(X为你已损失的体力值)。②你的手牌上限+2。', + oldlonghun:'龙魂', + oldlonghun_info:'你可以将花色相同的Y张牌按下列规则使用或打出:♥当【桃】,♦当火【杀】,♣当【闪】,♠当普【无懈可击】(Y为你的体力值且至少为1)。', + panfeng:'旧潘凤', + panfeng_prefix:'旧', + old_shixie:'旧士燮', + old_shixie_prefix:'旧', old_standard:'标准包', old_shenhua:'神话再临', diff --git a/character/ow.js b/character/ow.js index 8718c9596..63077e350 100644 --- a/character/ow.js +++ b/character/ow.js @@ -334,7 +334,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{ content:function(storage,player){ if(storage){ - return '每当你使用一张杀,你摸一张牌或回复一点体力'; + return '每当你使用一张杀,你摸一张牌或回复1点体力'; } else if(player.hasSkill('bshaowei')&&player.storage.bshaowei){ return '你的杀无视距离和防具、无数量限制且不可闪避;你不能闪避杀'; @@ -961,7 +961,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ case 2:num=60;break; case 3:num=100;break; } - return '结束阶段,有'+num+'%机率对一名随机敌人造成一点火焰伤害'; + return '结束阶段,有'+num+'%机率对一名随机敌人造成1点火焰伤害'; } }, init:function(player){ @@ -2399,7 +2399,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, mark:true, intro:{ - content:'下个准备阶段令一名距离1以内的角色回复一点体力或摸两张牌' + content:'下个准备阶段令一名距离1以内的角色回复1点体力或摸两张牌' }, content:function(){ 'step 0' @@ -2600,7 +2600,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, intro:{ content:function(storage,player){ - var str='每隔六回合回复一点体力,直到'+get.translation(storage)+'死亡'; + var str='每隔六回合回复1点体力,直到'+get.translation(storage)+'死亡'; if(typeof player.storage.xie=='number'){ var num=game.phaseNumber-player.storage.xie; num=num%6; @@ -2691,7 +2691,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ luan2:{ mark:true, intro:{ - content:'受到的伤害后流失一点体力,直到首次进入濒死状态' + content:'受到的伤害后失去1点体力,直到首次进入濒死状态' }, trigger:{player:'damageEnd'}, forced:true, @@ -2731,7 +2731,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, intro:{ content:function(storage,player){ - var str='每隔六回合失去一点体力,直到'+get.translation(storage)+'死亡'; + var str='每隔六回合失去1点体力,直到'+get.translation(storage)+'死亡'; if(typeof player.storage.luan=='number'){ var num=game.phaseNumber-player.storage.luan; num=num%6; @@ -3226,7 +3226,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ guangshu_heart:{ mark:true, intro:{ - content:'下次受到伤害时回复一点体力' + content:'下次受到伤害时回复1点体力' }, trigger:{player:'damageEnd'}, priority:6, @@ -3256,7 +3256,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ guangshu_spade:{ mark:true, intro:{ - content:'下个结束阶段受到一点无来源的雷电伤害' + content:'下个结束阶段受到1点无来源的雷电伤害' }, trigger:{player:'phaseEnd'}, forced:true, @@ -3466,7 +3466,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ woliu2:'涡流', woliu_info:'结束阶段,你可以选择至多两名角色,当你或目标中的任意一名角色成为杀的目标时,其余角色也将被追加为目标,直到你死亡或下一回合开始', qianggu:'强固', - qianggu_info:'出牌阶段限一次,你可以弃置两张牌并获得两点护甲,若如此做,直到你的下个回合开始,其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效', + qianggu_info:'出牌阶段限一次,你可以弃置两张牌并获得2点护甲,若如此做,直到你的下个回合开始,其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效', qianggu2:'强固', qianggu2_bg:'固', qianggu2_info:'其他角色对你使用杀时需要弃置一张基本牌,否则杀对你无效', @@ -3483,11 +3483,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bshaowei:'哨卫', bshaowei_info:'结束阶段,你可以切换至哨卫模式。当处于此模式时,你的杀无视距离和防具、无数量限制且不可闪避;你不能闪避杀', zhencha:'侦查', - zhencha_info:'结束阶段,你可以切换至侦查模式。当处于此模式时,每当你使用一张杀,你摸一张牌或回复一点体力', + zhencha_info:'结束阶段,你可以切换至侦查模式。当处于此模式时,每当你使用一张杀,你摸一张牌或回复1点体力', liangou:'链钩', liangou_info:'出牌阶段限一次,你可以弃置一张牌,指定一名其他角色并进行一次判定,若结果不为红桃,该角色与你距离为1且受到的首次伤害+1直到回合结束', xiyang:'吸氧', - xiyang_info:'结束阶段,若你武将牌正面朝上,你可以翻面并回复两点体力', + xiyang_info:'结束阶段,若你武将牌正面朝上,你可以翻面并回复2点体力', qinru:'侵入', qinru_info:'每当你使用杀指定目标时,你可以令其进行一次判定,若结果不为红桃,该角色的非锁定技失效直到其下一回合结束', yinshen:'隐身', @@ -3498,19 +3498,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ maichong_info_alter:'准备阶段,你可以令最近两名被你侵入的角色各随机弃置一张牌', lichang:'力场', lichang2:'力场', - lichang_info:'结束阶段,你可以弃置一张红色牌,若如此做,你可以在下个准备阶段令一名距离1以内的角色回复一点体力或摸两张牌', + lichang_info:'结束阶段,你可以弃置一张红色牌,若如此做,你可以在下个准备阶段令一名距离1以内的角色回复1点体力或摸两张牌', mengji:'猛击', mengji_info:'锁定技,若你已发动重盾,当你没有护甲时,你的杀造成的伤害+1', zhongdun:'重盾', - zhongdun_info:'游戏开始时,你获得8点护甲;出牌阶段限一次,你可以弃置一张牌并将一点护甲分给一名没有护甲的其他角色', - zhongdun_info_alter:'游戏开始时,你获得6点护甲;出牌阶段限一次,你可以弃置一张牌并将一点护甲分给一名没有护甲的其他角色', + zhongdun_info:'游戏开始时,你获得8点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色', + zhongdun_info_alter:'游戏开始时,你获得6点护甲;出牌阶段限一次,你可以弃置一张牌并将1点护甲分给一名没有护甲的其他角色', paotai:'炮台', paotai2:'炮台', - paotai_info:'出牌阶段,你可以弃置一张杀布置或升级一个炮台(最高3级);结束阶段,炮台有一定机率对一名随机敌人造成一点火焰伤害;每当你受到一点伤害,炮台降低一级', + paotai_info:'出牌阶段,你可以弃置一张杀布置或升级一个炮台(最高3级);结束阶段,炮台有一定机率对一名随机敌人造成1点火焰伤害;每当你受到1点伤害,炮台降低一级', maoding:'铆钉', maoding2:'铆钉', - maoding_info:'每当你造成或受到一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得一点护甲', - maoding_info_alter:'每当你造成一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得一点护甲', + maoding_info:'每当你造成或受到一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲', + maoding_info_alter:'每当你造成一次伤害,你可以获得一个零件;出牌阶段,你可以弃置两张零件牌令一名没有护甲的角色获得1点护甲', bfengshi:'风矢', bfengshi2:'风矢', bfengshi_info:'锁定技,在一合内每当你使用一张牌,你的攻击范围+1;你的首张杀增加20%的概率强制命中;你的首张杀造成伤害后增加20%的概率令伤害+1', @@ -3536,7 +3536,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mianzhen_info:'出牌阶段限一次,你可以弃置一张牌并令一名其他角色打出一张闪,否则该角色不能使用或打出卡牌直到其受到伤害或下一回合结束', aqianghua:'强化', aqianghua2:'强化', - aqianghua_info:'出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色获得一点护甲且下一次造成的伤害+1', + aqianghua_info:'出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色获得1点护甲且下一次造成的伤害+1', aqianghua_info_alter:'出牌阶段限一次,你可以将你的全部手牌(至少一张)交给一名其他角色,该角色下一次造成的伤害+1', zhiyuan:'支援', zhiyuan_info:'每当你即将造成伤害,你可以防止此伤害,改为令目标回复等量的体力', @@ -3551,7 +3551,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhuagou_info:'出牌阶段限一次,你可以弃置一张手牌并将你的座位移到任意位置', dulei:'诡雷', dulei2:'诡雷', - dulei_info:'出牌阶段,若你武将牌上没有牌,你可以将一张牌背面朝上置于你的武将牌上,当一名角色使用与该牌花色相同的牌指定你为目标时,你展示并移去此牌,然后该角色失去一点体力并随机弃置一张牌', + dulei_info:'出牌阶段,若你武将牌上没有牌,你可以将一张牌背面朝上置于你的武将牌上,当一名角色使用与该牌花色相同的牌指定你为目标时,你展示并移去此牌,然后该角色失去1点体力并随机弃置一张牌', shuangqiang:'霜枪', shuangqiang_info:'每当你对一名未翻面的角色造成伤害,你可以令伤害-1,然后令受伤害角色翻面', baoxue:'暴雪', @@ -3568,8 +3568,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bingqiang5_bg:'障', bingqiang_info:'出牌阶段,你可以弃置X张红色牌令一名角色和其相邻角色的防御离+X,或弃置X张黑色牌令一名角色和其相邻角色的进攻离-X,效果持续到你的下个回合开始', jidong:'急冻', - jidong_info:'在一名角色的结束阶段,若你的体力值为1且未翻面,你可以翻面并回复两点体力,在你的武将牌翻至正面前,你防止所有伤害,也不能成为其他角色卡牌的目标', - jidong_info_alter:'在一名角色的结束阶段,若你的体力值为1,你可以翻面并回复两点体力', + jidong_info:'在一名角色的结束阶段,若你的体力值为1且未翻面,你可以翻面并回复2点体力,在你的武将牌翻至正面前,你防止所有伤害,也不能成为其他角色卡牌的目标', + jidong_info_alter:'在一名角色的结束阶段,若你的体力值为1,你可以翻面并回复2点体力', jijia:'机甲', jijia_info:'锁定技,游戏开始时,你获得一个体力为4的机甲;你的手牌上限为你和机甲的体力之和;你受到的伤害由机甲承担', zihui:'自毁', @@ -3596,19 +3596,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhanlong_info:'限定技,准备阶段,若你体力值为1,你可以弃置所有牌(至少一张),然后将三张杀置入你的手牌,若如此做,你本回合使用杀无次数限制', xie:'谐', xie2:'谐', - xie_info:'出牌阶段,你可以弃置一张红桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合回复一点体力,直到你死亡。同一时间只能对一人发动', + xie_info:'出牌阶段,你可以弃置一张红桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合回复1点体力,直到你死亡。同一时间只能对一人发动', luan:'乱', luan2:'乱', - luan_old_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合失去一点体力,直到你死亡。同一时间只能对一人发动', - luan_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色受到伤害后流失一点体力,直到你死亡或其首次进入濒死状态。同一时间只能对一人发动', + luan_old_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色自其下一回合开始每隔六回合失去1点体力,直到你死亡。同一时间只能对一人发动', + luan_info:'出牌阶段,你可以弃置一张黑桃手牌并指定一名角色,该角色受到伤害后失去1点体力,直到你死亡或其首次进入濒死状态。同一时间只能对一人发动', sheng:'圣', - sheng_info:'限定技,出牌阶段,你可以将你的武将牌翻面,然后令任意名角色回复一点体力,若如此做,你不能成为其他角色的卡牌目标直到下一回合开始', + sheng_info:'限定技,出牌阶段,你可以将你的武将牌翻面,然后令任意名角色回复1点体力,若如此做,你不能成为其他角色的卡牌目标直到下一回合开始', xiandan:'霰弹', xiandan_info:'每当你使用一张杀,你可以弃置一张红色牌令此杀不可闪避,或弃置一张黑色牌令此杀伤害+1', yihun:'移魂', yihun_info:'结束阶段,你可以弃置一张黑色牌并指定一名其他角色,你在该角色下一准备阶段视为对其使用一张杀;在此之前,你不能使用卡牌,也不能成为卡牌的目标', feidan:'飞弹', - feidan_info:'你的杀只能对距离1以外的角色使用;每当你使用杀造成伤害后,你可以弃置一张牌对距离目标1以内的其他角色各造成一点伤害', + feidan_info:'你的杀只能对距离1以外的角色使用;每当你使用杀造成伤害后,你可以弃置一张牌对距离目标1以内的其他角色各造成1点伤害', huoyu:'火雨', huoyu_info:'限定技,出牌阶段,你可以弃置两张红色牌,视为使用两张炽羽袭', yuedong:'乐动', @@ -3623,17 +3623,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ guangshu_spade:'光塔', guangshu_club:'光井', guangshu_diamond:'光流', - guangshu_info:'出牌阶段,你可以弃置一张牌,并指定一名角色,根据弃置牌的花色执行如下效果:♥该角色下次受到伤害时回复一点体力;♦︎该角色下次造成伤害时摸两张牌;♣该角色无法使用杀直到下一回合结束;♠该角色于下个结束阶段受到一点无来源的雷电伤害', + guangshu_info:'出牌阶段,你可以弃置一张牌,并指定一名角色,根据弃置牌的花色执行如下效果:♥该角色下次受到伤害时回复1点体力;♦︎该角色下次造成伤害时摸两张牌;♣该角色无法使用杀直到下一回合结束;♠该角色于下个结束阶段受到1点无来源的雷电伤害', ziyu:'自愈', - ziyu_info:'在一名角色的结束阶段,你可以回复一点体力或摸一张牌,每隔四回合发动一次', - ziyu_info_alter:'在一名角色的结束阶段,你可以回复一点体力或摸一张牌,每隔六回合发动一次', + ziyu_info:'在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔四回合发动一次', + ziyu_info_alter:'在一名角色的结束阶段,你可以回复1点体力或摸一张牌,每隔六回合发动一次', shouhu:'守护', - shouhu_info:'你不能使用杀;出牌阶段,你可以弃置一张杀令一名其他角色回复一点体力', + shouhu_info:'你不能使用杀;出牌阶段,你可以弃置一张杀令一名其他角色回复1点体力', shanxian:'闪现', shanxian_info:'在一名其他角色的回合开始前,若你的武将牌正面朝上,你可以摸一张牌并进行一个额外回合,并在回合结束后将武将牌翻至背面。若如此做,你对其使用卡牌无视距离直到回合结束。', shanxian_info_alter:'在一名其他角色的回合开始前,若你的武将牌正面朝上,你可以进行一个额外回合,并在回合结束后将武将牌翻至背面。若如此做,你对其使用卡牌无视距离直到回合结束。', shanhui:'闪回', - shanhui_info:'当你造成或受到伤害后,你可以将你的牌重置为上次发动闪现时的状态,若你的牌数因此而减少,你回复一点体力', + shanhui_info:'当你造成或受到伤害后,你可以将你的牌重置为上次发动闪现时的状态,若你的牌数因此而减少,你回复1点体力', ow_liekong:'猎空', ow_sishen:'死神', ow_tianshi:'天使', diff --git a/character/rank.js b/character/rank.js index 46186010d..09b861aa5 100644 --- a/character/rank.js +++ b/character/rank.js @@ -123,6 +123,7 @@ window.noname_character_rank={ 'key_yuuki', 'db_key_liyingxia', 'key_kiyu', + 'jsrg_pangtong', ], a:[ 'diy_zaozhirenjun', @@ -313,6 +314,13 @@ window.noname_character_rank={ 'dc_sunquan', 'yuechen', 'sunli', + 'dc_zhangmancheng', + 'jsrg_guojia', + 'jsrg_lougui', + 'jsrg_zhangfei', + 'jsrg_fanjiangzhangda', + 'jsrg_hansui', + 'jsrg_zhangren', 'key_misuzu', 'key_sunohara', 'key_umi', @@ -606,6 +614,10 @@ window.noname_character_rank={ 'chenshi', 'xiahoumao', 'dc_xujing', + 'le_shen_jiaxu', + 'jsrg_xiahourong', + 'jsrg_sunshangxiang', + 'jsrg_machao', ], bp:[ 'chess_diaochan', @@ -960,6 +972,10 @@ window.noname_character_rank={ 'mengyou', 're_wenpin', 'yue_zhoufei', + 'ns_mengyou', + 'zhangyan', + 'jsrg_huangzhong', + 'jsrg_zhangchu', ], b:[ 'diy_feishi', @@ -1090,6 +1106,7 @@ window.noname_character_rank={ 're_caoxiu', 'xin _caoxiu', 'sunluyu', + 'mb_sunluyu', 'sp_diaochan', 'liuxie', 'zhugejin', @@ -1264,6 +1281,8 @@ window.noname_character_rank={ 'ol_qianzhao', 'yj_zhoubuyi', 'feiyao', + 'jsrg_xiahouen', + 'old_shen_zhaoyun', ], bm:[ 'diy_xizhenxihong', @@ -1969,6 +1988,7 @@ window.noname_character_rank={ 'clan_zhonghui', 'zhoubuyi', 'dc_wangjun', + 'ns_mengyou', 'key_kano', 'key_haruko', 'key_akiko', diff --git a/character/refresh.js b/character/refresh.js index 2b6570733..2998b3e37 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -4,7 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'refresh', characterSort:{ refresh:{ - refresh_standard:["re_caocao","re_simayi","re_guojia","re_zhangliao","re_xuzhu","re_xiahoudun","re_zhangfei","re_zhaoyun","re_guanyu","re_machao","re_zhouyu","re_lvmeng","re_ganning","re_luxun","re_daqiao","re_huanggai","re_lvbu","re_huatuo","re_liubei","re_diaochan","re_huangyueying","re_sunquan","re_sunshangxiang","re_zhenji","re_zhugeliang","re_huaxiong",'re_gongsunzan'], + refresh_standard:["re_caocao","re_simayi","re_guojia","re_zhangliao","re_xuzhu","re_xiahoudun","re_zhangfei","re_zhaoyun","re_guanyu","re_machao","re_zhouyu","re_lvmeng","re_ganning","re_luxun","re_daqiao","re_huanggai","re_lvbu","re_huatuo","re_liubei","re_diaochan","re_huangyueying","re_sunquan","re_sunshangxiang","re_zhenji","re_zhugeliang","re_huaxiong",'re_gongsunzan',"re_lidian","re_xushu"], refresh_feng:['caoren','ol_xiahouyuan','ol_weiyan','ol_xiaoqiao','zhoutai','re_zhangjiao','xin_yuji','ol_huangzhong'], refresh_huo:["ol_sp_zhugeliang","ol_xunyu","ol_dianwei","ol_yanwen","ol_pangtong","ol_yuanshao","ol_pangde","re_taishici"], refresh_lin:['re_menghuo','ol_sunjian','re_caopi','ol_xuhuang','ol_dongzhuo','ol_zhurong','re_jiaxu','ol_lusu'], @@ -20,6 +20,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, connect:true, character:{ + re_xushu:['male','shu',4,['zhuhai','qianxin']], + re_lidian:['male','wei',3,['xunxun','xinwangxi']], re_zhongyao:['male','wei',3,['rehuomo','zuoding'],['clan:颍川钟氏']], xin_zhangliang:['male','qun',4,['rejijun','refangtong'],['unseen']], re_simalang:['male','wei',3,['requji','rejunbing'],['unseen']], @@ -72,7 +74,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xin_lingtong:['male','wu',4,['decadexuanfeng','yongjin']], xin_liubiao:['male','qun',3,['decadezishou','decadezongshi']], re_caoxiu:['male','wei',4,['qianju','reqingxi']], - re_sunxiu:['male','wu',3,['reyanzhu','rexingxue','xinzhaofu'],['zhu']], + re_sunxiu:['male','wu',3,['reyanzhu','rexingxue','zhaofu'],['zhu']], ol_dengai:['male','wei',4,['oltuntian','olzaoxian']], re_gongsunzan:['male','qun',4,['reqiaomeng','reyicong']], re_manchong:['male','wei',3,['rejunxing','yuce']], @@ -167,6 +169,112 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_guohuai:['xiahouyuan','zhanghe'], }, skill:{ + //界凌统 + olxuanfeng:{ + audio:2, + audioname2:{ + lingtong:'xuanfeng', + }, + trigger:{ + player:['loseAfter'], + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + filter:function(event,player){ + var evt=event.getl(player); + return evt&&(evt.es.length||evt.cards2.length>1); + }, + direct:true, + content:function(){ + 'step 0' + event.count=2; + event.logged=false; + 'step 1' + player.chooseTarget(get.prompt('olxuanfeng'),'弃置一名其他角色的一张牌',function(card,player,target){ + if(player==target) return false; + return target.countDiscardableCards(player,'he'); + }).set('ai',function(target){ + return -get.attitude(_status.event.player,target); + }); + 'step 2' + if(result.bool){ + if(!event.logged){ + player.logSkill('olxuanfeng',result.targets); + event.logged=true; + } + else player.line(result.targets[0],'green'); + player.discardPlayerCard(result.targets[0],'he',true); + event.count--; + } + else event.finish(); + 'step 3' + if(event.count) event.goto(1); + }, + ai:{ + effect:{ + target:function(card,player,target,current){ + if(get.type(card)=='equip'&&!get.cardtag(card,'gifts')) return [1,3]; + } + }, + reverseEquip:true, + noe:true + }, + }, + ollianhuan:{ + audio:'xinlianhuan', + audioname:['ol_pangtong'], + hiddenCard:(player,name)=>{ + return name=='tiesuo'&&player.hasCard(card=>get.suit(card)=='club','she'); + }, + filter:function(event,player){ + if(!player.hasCard(card=>get.suit(card)=='club','she')) return false; + return (event.type=='phase'||event.filterCard({name:'tiesuo'},player,event)); + }, + position:'hes', + inherit:'lianhuan', + group:'ollianhuan_add', + subSkill:{ + add:{ + audio:'xinlianhuan', + audioname:['ol_pangtong'], + trigger:{player:'useCard2'}, + filter:function(event,player){ + if(event.card.name!='tiesuo') return false; + var info=get.info(event.card); + if(info.allowMultiple==false) return false; + if(event.targets&&!info.multitarget){ + if(game.hasPlayer(current=>{ + return !event.targets.contains(current)&&lib.filter.targetEnabled2(event.card,player,current); + })) return true; + } + return false; + }, + charlotte:true, + forced:true, + popup:false, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('ollianhuan'),'为'+get.translation(trigger.card)+'额外指定一个目标',(card,player,target)=>{ + return !_status.event.sourcex.contains(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); + }).set('sourcex',trigger.targets).set('ai',function(target){ + var player=_status.event.player; + return get.effect(target,_status.event.card,player,player); + }).set('card',trigger.card); + 'step 1' + if(result.bool){ + if(!event.isMine()&&!event.isOnline()) game.delayex(); + } + else event.finish(); + 'step 2' + if(result.bool){ + var targets=result.targets; + player.logSkill('ollianhuan_add',targets); + trigger.targets.addArray(targets); + game.log(targets,'也成为了',trigger.card,'的目标'); + } + }, + }, + }, + }, rehuomo:{ audio:'huomo', audioname:['huzhao','re_zhongyao'], @@ -542,7 +650,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.targets.length){ var current=event.targets.shift(); if(current.group=='wei'){ - current.chooseBool('是否令'+get.translation(player)+'回复一点体力?').set('ai',function(){ + current.chooseBool('是否令'+get.translation(player)+'回复1点体力?').set('ai',function(){ return get.attitude(_status.event.player,_status.event.target)>2; }).set('target',player); event.current=current; @@ -558,7 +666,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ event.damages.push(event.current); event.current.line(player,'green'); - game.log(event.current,'令',player,'回复一点体力'); + game.log(event.current,'令',player,'回复1点体力'); player.recover(); } if(event.targets.length){ @@ -829,6 +937,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var skills=player.additionalSkills['relinglong']; return (skills&&skills.length>0)!=player.hasEmptySlot(5); }, + direct:true, content:function(){ player.removeAdditionalSkill('relinglong'); if(player.hasEmptySlot(5)){ @@ -880,15 +989,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, logTarget:'player', check:function(event,player){ - if(get.attitude(player,event.player)<5) return false; - if(player.maxHp-player.hp>=2) return false; - if(player.hp==1) return false; - if(player.hp==2&&player.countCards('h')<2) return false; - if(event.player.countCards('h')>=event.player.hp) return false; - return true; + if(get.attitude(_status.event.player,event.player)<1) return false; + return player.hp>1||player.hasCard(card=>(get.name(card)==='tao'||get.name(card)==='jiu')&&lib.filter.cardEnabled(card,player),'hs'); }, content:function(){ 'step 0' + if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.2); player.draw(2); 'step 1' var cards=player.getCards('he'); @@ -906,7 +1012,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.player.markAuto('rexiantu_check',[player]); }, ai:{ - threaten:1.1, + threaten:function(player,target){ + return 1+game.countPlayer((current)=>{ + if(current!=target&&get.attitude(target,current)>0) return 0.5; + return 0; + }); + }, expose:0.3 }, subSkill:{ @@ -1921,14 +2032,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', filter:function(event,player){ - var hs=player.getCards('h'); + const hs=player.getCards('h'); if(!hs.length) return false; if((player.getStat('skill').reqice||0)>=player.countMark('reqice_mark')+1) return false; - for(var i=0; i{ + const mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); + return (mod2===false) + })) return false; + return lib.inpile.some(name=>{ + if(get.type(name)!='trick') return false; + const card=get.autoViewAs({name},hs); + return event.filterCard(card,player,event); + }); }, chooseButton:{ dialog:function(event,player){ @@ -1939,7 +2054,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return ui.create.dialog(get.translation('reqice'),[list,'vcard']); }, filter:function(button,player){ - return lib.filter.filterCard({name:button.link[2]},player,_status.event.getParent()); + const event=_status.event.getParent(),card=get.autoViewAs({ + name:button.link[2], + },player.getCards('h')); + return event.filterCard(card,player,event); }, check:function(button){ var player=_status.event.player; @@ -1981,6 +2099,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 13-num; } }, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat('skill').reqice&&player.hasCard((card)=>get.name(card)!='tao','h'); + }, threaten:1.7, }, subSkill:{ @@ -2416,6 +2538,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ targets[event.num].chooseBool("是否押杀?").ai=function(event,player){ var evt=_status.event.getParent(); if(get.attitude(targets[event.num],evt.player)>0) return evt.player.countCards('h','sha')?false:true; + if(evt.player.hasKnownCards(targets[event.num],c=>{return c.name == 'sha';})){ + return true; + } return Math.random()<0.5; }; "step 2" @@ -2725,6 +2850,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return -0.5; } + }, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&player.countSkill('rezhanjue_draw')<3&&player.hasCard((card)=>get.name(card)!='tao'&&!card.hasGaintag('reqinwang'),'h'); } }, }, @@ -3146,6 +3275,60 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.draw(); }, + group:'dcjianying_mark', + init:function(player){ + var history=player.getAllHistory('useCard'); + if(history.length){ + var trigger=history[history.length-1]; + if(get.suit(trigger.card,player)=='none'||typeof get.number(trigger.card,player)!='number') return; + player.storage.dcjianying_mark=trigger.card; + player.markSkill('dcjianying_mark'); + game.broadcastAll(function(player,suit){ + if(player.marks.dcjianying_mark) player.marks.dcjianying_mark.firstChild.innerHTML=get.translation(suit); + },player,get.suit(trigger.card,player)); + } + }, + onremove:function(player){ + player.unmarkSkill('dcjianying_mark'); + delete player.storage.dcjianying_mark; + }, + subSkill:{ + mark:{ + charlotte:true, + trigger:{player:'useCard1'}, + forced:true, + popup:false, + firstDo:true, + content:function(){ + if(get.suit(trigger.card,player)=='none'||typeof get.number(trigger.card,player)!='number') player.unmarkSkill('dcjianying_mark'); + else{ + player.storage.dcjianying_mark=trigger.card; + player.markSkill('dcjianying_mark'); + game.broadcastAll(function(player,suit){ + if(player.marks.dcjianying_mark) player.marks.dcjianying_mark.firstChild.innerHTML=get.translation(suit); + },player,get.suit(trigger.card,player)); + } + }, + intro:{ + markcount:function(card,player){ + var num=get.number(card,player); + var list=[1,11,12,13]; + if(list.contains(num)) return ['A','J','Q','K'][list.indexOf(num)]; + return parseFloat(num); + }, + content:function(card,player){ + var suit=get.suit(card,player); + var num=get.number(card,player); + var str='
  • 上一张牌的花色:'+get.translation(suit); + str+='
  • 上一张牌的点数:'; + var list=[1,11,12,13]; + if(list.contains(num)) str+=['A(1)','J(11)','Q(12)','K(13)'][list.indexOf(num)]; + else str+=parseFloat(num); + return str; + }, + }, + }, + }, }, //十周年步练师 dcanxu:{ @@ -4858,8 +5041,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, check:function(event,player){ return (player.countCards('h')+2+event.num)<=5||game.hasPlayer(function(target){ - return !game.hasPlayer(function(current){ - return current!=player&¤t!=target&¤t.countCards('h')0; }); }, @@ -5095,7 +5278,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ "step 0" - target.chooseToUse('乱武:使用一张杀或失去一点体力',function(card){ + target.chooseToUse('乱武:使用一张杀或失去1点体力',function(card){ if(get.name(card)!='sha') return false; return lib.filter.filterCard.apply(this,arguments) },function(card,player,target){ @@ -5400,19 +5583,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ table.style.width='100%'; table.style.position='relative'; var list=['摸牌','造成伤害']; - for(var i=0;i'; - td.link=i; - td.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.button); - for(var j in lib.element.button){ - td[j]=lib.element.button[j]; - } - table.appendChild(td); - dialog.buttons.add(td); - } - dialog.content.appendChild(table); + dialog.add([list.map((item,i)=>{ + return [i,item]; + }),'tdnodes']); dialog.add(player.getExpansions('xinquanji')); return dialog; }, @@ -6039,7 +6212,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, //界曹彰 xinjiangchi:{ - audio:'new_jiangchi', + audio:2, trigger:{player:'phaseUseBegin'}, direct:true, content:function(){ @@ -6258,22 +6431,34 @@ game.import('character',function(lib,game,ui,get,ai,_status){ selectCard:[1,Infinity], position:'hs', check:function(card){ - var player=_status.event.player; - if(ui.selected.cards.length){ - var list=game.filterPlayer(function(current){ - return current!=player&&player.canUse('sha',current,false)&&get.effect(current,{name:'sha'},player,player)>0; - }).sort(function(a,b){ - return get.effect(b,{name:'sha'},player,player)-get.effect(a,{name:'sha'},player,player); + let player = _status.event.player; + if (ui.selected.cards.length) { + let list = game.filterPlayer(function (current) { + return current !== player && player.canUse('sha', current, false) && get.effect(current, {name: 'sha'}, player, player) > 0; + }).sort(function (a, b) { + return get.effect(b, {name: 'sha'}, player, player) - get.effect(a, {name: 'sha'}, player, player); }); - if(!list.length) return 0; - var target=list[0]; - if(target.mayHaveShan()&&!player.hasSkillTag('directHit_ai',true,{ - target:target, - card:card, - },true)) return 0; - return 6.5-get.value(card); + if (!list.length) return 0; + let target = list[0], + cards = ui.selected.cards.concat([card]), + color = []; + for (let i of cards) { + if (!color.includes(get.color(i, player))) color.add(get.color(i, player)); + } + if (color.length !== 1) color[0] = 'none'; + if (player.hasSkillTag( + 'directHit_ai', + true, + { + target: target, + card: {name: 'sha', suit: 'none', color: color[0], cards: cards, isCard: true} + }, + true + )) return 6.5 - get.value(card, player); + if (Math.random() * target.countCards('hs') < 1 || player.needsToDiscard(-ui.selected.cards.length)) return 6 - get.value(card, player); + return 0; } - return 6.3-get.value(card); + return 6.3 - get.value(card); }, onuse:function(result,player){ player.addTempSkill('changbiao_draw'); @@ -6305,6 +6490,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return card.name!='sha'&&get.value(card,player)<6.3; },'hs')?1:0)>1?-1:1); }, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep'){ + let num=0; + if(arg&&(!arg.card||get.name(arg.card)!=='tao')) return false; + player.getHistory('sourceDamage',function(evxt){ + let evt=evxt.getParent(); + if(evt&&evt.name=='sha'&&evt.skill=='changbiao') num+=evt.cards.length; + }); + return player.needsToDiscard(num)>0; + } + } }, }, //国钟会 @@ -7492,9 +7689,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" target.chooseToDiscard(cards.length,'弃置'+get.cnNumber(cards.length)+'张牌并失去1点体力,或点取消将武将牌翻面并摸'+get.cnNumber(cards.length)+'张牌','he').set('ai',function(card){ - var player=_status.event.player; - if(player.isTurnedOver()) return -1; - return (player.hp*player.hp)-get.value(card); + if(cards.length>3||target.hasSkillTag('noturn')||target.isTurnedOver()||(get.name(card)=='tao'||get.name(card)=='jiu')&&lib.filter.cardSavable(card,target,target)) return -1; + if(target.hp<=1){ + if(cards.length{ + return (get.name(cardx)=='tao'||get.name(cardx)=='jiu')&&lib.filter.cardSavable(cardx,target,target); + },'hs')) return 7-get.value(card); + return -1; + } + return 24-5*cards.length-2*Math.min(4,target.hp)-get.value(card); }); "step 1" if(!result.bool){ @@ -7505,7 +7707,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ order:2, - expose:0.3, threaten:1.8, result:{ target:function(player,target){ @@ -10438,11 +10639,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ next.setContent(lib.skill.rehuashen.content); }, }, - rexingsheng:{audio:2}, rexinsheng:{ - //mode:['identity','single','doudizhu'], unique:true, - audio:'rexingsheng', + audio:2, trigger:{player:'damageEnd'}, frequent:true, content:function(){ @@ -10847,34 +11046,40 @@ game.import('character',function(lib,game,ui,get,ai,_status){ useShan:true, effect:{ target:function(card,player,target,current){ - if(get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{ - target:target, - card:card, - },true)){ - var hastarget=game.hasPlayer(function(current){ - return get.attitude(target,current)<0; - }); - var be=target.countCards('e',{color:'black'}); - if(target.countCards('h','shan')&&be){ - if(!target.hasSkill('xinguidao')) return 0; - return [0,hastarget?target.countCards('he')/2:0]; - } - if(target.countCards('h','shan')&&target.countCards('h')>2){ - if(!target.hasSkill('xinguidao')) return 0; - return [0,hastarget?target.countCards('h')/4:0]; - } - if(target.countCards('h')>3||(be&&target.countCards('h')>=2)){ - return [0,0]; - } - if(target.countCards('h')==0){ - return [1.5,0]; - } - if(target.countCards('h')==1&&!be){ - return [1.2,0]; - } - if(!target.hasSkill('xinguidao')) return [1,0.05]; - return [1,Math.min(0.5,(target.countCards('h')+be)/4)]; + let name='sha'; + if(typeof card=='object'){ + if(card.viewAs) name=card.viewAs; + else name=get.name(card); } + if(name=='shandian'||get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{ + target: target, + card: card + },true)){ + let club=0,spade=0; + if(game.hasPlayer(function(current){ + return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0; + })){ + club=2; + spade=4; + } + if(!target.isHealthy()) club+=2; + if(!club&&!spade) return 1; + if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs')); + if(!target.hasSkillTag('rejudge')) return [1,(club+spade)/4]; + let pos=(player==target||player.hasSkillTag('viewHandcard',null,target,true))?'hes':'e',better=club>spade?'club':'spade',max=0; + target.hasCard(function(cardx){ + if(get.suit(cardx)==better){ + max=2; + return true; + } + if(spade&&get.color(cardx)=='black') max=1; + },pos); + if(max==2) return [1,Math.max(club,spade)]; + if(max==1) return [1,Math.min(club,spade)]; + if(pos=='e') return [1,Math.min(Math.max(1,target.countCards('hs'))*(club+spade)/4,Math.max(club,spade))]; + return [1,(club+spade)/4]; + } + if(name=='lebu'||name=='bingliang') return [target.hasSkillTag('rejudge')?0.4:1,2,target.hasSkillTag('rejudge')?0.4:1,0]; } } } @@ -10896,7 +11101,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.logSkill('xinleiji'); player.recover(); } - player.chooseTarget('雷击:是否对一名角色造成'+event.num+'点雷电伤害?',lib.filter.notMe).ai=function(target){ + player.chooseTarget('雷击:是否对一名角色造成'+event.num+'点雷电伤害?').ai=function(target){ var player=_status.event.player; return get.damageEffect(target,player,player,'thunder'); }; @@ -10910,6 +11115,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, xinguidao:{ audio:2, + mod:{ + aiOrder:function(player,card,num){ + if(num>0&&get.itemtype(card)=='card'&&get.color(card)=='black'&&get.type(card)=='equip') num*1.35; + }, + aiValue:function(player,card,num){ + if(num>0&&get.itemtype(card)=='card'&&get.color(card)=='black') return num*1.15; + }, + aiUseful:function(player,card,num){ + if(num>0&&get.itemtype(card)=='card'&&get.color(card)=='black') return num*1.35; + } + }, + locked:false, trigger:{global:'judge'}, filter:function(event,player){ return player.countCards('hes',{color:'black'})>0; @@ -11087,7 +11304,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, prompt:"将一张红色牌当火攻使用", check:function (card){ - var player=_status.currentPhase; + var player=get.player(); if(player.countCards('h')>player.hp){ return 6-get.value(card); } @@ -11568,7 +11785,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:"wusheng", audioname:['re_guanyu','guanzhang','jsp_guanyu','guansuo','re_guanzhang','dc_jsp_guanyu'], audioname2:{ - ol_guansuo:'wusheng_guansuo', + dc_guansuo:'wusheng_guansuo', }, enable:["chooseToRespond","chooseToUse"], filterCard:function(card,player){ @@ -11642,7 +11859,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else if(get.color(event.card2)=='red'){ player.gain(event.card2,target,'give','bySelf'); if(target.hp0; }; } @@ -12239,6 +12456,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rezhiheng:{ audio:2, audioname:['shen_caopi'], + mod:{ + aiOrder:function(player,card,num){ + if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; + let eq=player.getEquip(get.subtype(card)); + if(eq&&get.equipValue(card)-get.equipValue(eq)get.value(i)>Math.max(6,9-player.hp),'he')) return 1; + return 10; + }, result:{ player:1 }, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat().skill.rezhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); + }, threaten:1.55 }, }, @@ -13415,7 +13647,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.finish(); } else if(target.hp0; }; } @@ -14205,7 +14437,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player; if(player.isTurnedOver()||_status.event.getTrigger().player.getDamagedHp()>2) return -1; return (player.hp*player.hp)-get.value(card); - }).set('prompt','弃置'+get.cnNumber(player.getDamagedHp())+'张牌并失去一点体力;或选择不弃置,将武将牌翻面并摸'+get.cnNumber(player.getDamagedHp())+'张牌。'); + }).set('prompt','弃置'+get.cnNumber(player.getDamagedHp())+'张牌并失去1点体力;或选择不弃置,将武将牌翻面并摸'+get.cnNumber(player.getDamagedHp())+'张牌。'); } else event.finish(); "step 2" @@ -14399,7 +14631,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.isHealthy()) event._result={index:0}; else event.current.chooseControl().set('choiceList',[ '摸一张牌', - '令'+get.translation(player)+'回复一点体力', + '令'+get.translation(player)+'回复1点体力', ]).set('ai',function(){ if(get.attitude(event.current,player)>0) return 1; return 0; @@ -14510,7 +14742,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinleiji:'雷击', xinleiji_misa:'雷击', xinguidao:'鬼道', - xinleiji_info:'①当你使用【闪】或【闪电】,或打出【闪】时,你可以进行判定。②当你的判定的判定牌生效后,若结果为:黑桃,你可对一名其他角色造成2点雷电伤害;梅花:你回复1点体力并可对一名其他其他角色造成1点雷电伤害。', + xinleiji_info:'①当你使用【闪】或【闪电】,或打出【闪】时,你可以进行判定。②当你的判定的判定牌生效后,若结果为:黑桃,你可对一名角色造成2点雷电伤害;梅花:你回复1点体力并可对一名角色造成1点雷电伤害。', xinleiji_append:'不能触发〖雷击〗的判定:〖暴虐〗、〖助祭〗、
    〖弘仪〗、〖孤影〗。
    ', xinleiji_faq:'不能触发〖雷击〗的判定', xinleiji_faq_info:'
    董卓/界董卓〖暴虐〗
    黄巾雷使〖助祭〗
    羊徽瑜〖弘仪〗
    鸣濑白羽〖孤影〗', @@ -14519,18 +14751,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinhuangtian2:'黄天', xinhuangtian_info:'主公技。其他群势力角色的出牌阶段限一次,该角色可以交给一张【闪】或黑桃手牌。', reqiangxi:"强袭", - "reqiangxi_info":"出牌阶段对每名其他角色限一次,你可以选择一项:1. 失去一点体力并对你攻击范围内的一名其他角色造成一点伤害;2. 弃置一张武器牌并对你攻击范围内的一名其他角色造成一点伤害。", + "reqiangxi_info":"出牌阶段对每名其他角色限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张武器牌并对你攻击范围内的一名其他角色造成1点伤害。", rehuoji:"火计", - rehuoji_info:"出牌阶段,你可一张红色牌当作【火攻】使用。", + rehuoji_info:"你可一张红色牌当作【火攻】使用。", rekanpo:"看破", rekanpo_info:"你可以将一张黑色牌当作【无懈可击】使用。", reshuangxiong:"双雄", - "reshuangxiong_info":"摸牌阶段,你可以放弃摸牌。若如此做,你展示牌堆顶的两张牌并选择获得其中的一张。然后,你本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用。当你受到【决斗】造成的伤害时,你可以获得对方于此决斗中打出的所有【杀】", + "reshuangxiong_info":"摸牌阶段,你可以放弃摸牌。若如此做,你展示牌堆顶的两张牌并选择获得其中的一张。然后,你本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用。当你受到【决斗】造成的伤害时,你可以获得对方于此决斗中打出的所有【杀】。", "reshuangxiong2":"双雄", "reshuangxiong2_info":"", reguanxing:'观星', - reguanxing_info:'准备阶段,你可以观看牌堆顶的5张牌(存活角色小于4时改为3张),并将其以任意顺序置于牌堆项或牌堆底,若你将〖观星〗的牌都放在了牌堆底,则你可以在结束阶段再次发动〖观星〗。', + reguanxing_info:'准备阶段,你可以观看牌堆顶的五张牌(存活角色小于4时改为三张),并将其以任意顺序置于牌堆项或牌堆底,若你将〖观星〗的牌都放在了牌堆底,则你可以在结束阶段再次发动〖观星〗。', reluoshen:'洛神', reluoshen_info:'准备阶段,你可以进行判定,若结果为黑色则获得此判定牌,且可重复此流程直到出现红色的判定结果。你通过〖洛神〗得到的牌不计入当前回合的手牌上限。', reluoshen_info_guozhan:'准备阶段,你可以进行判定,若为黑色则可以继续判定,直到出现红色。然后你获得所有黑色的判定牌。你通过〖洛神〗得到的牌不计入当前回合的手牌上限(结果为黑色的判定牌于此过程中不会进入弃牌堆)。', @@ -14545,7 +14777,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rezhiheng:'制衡', rezhiheng_info:'出牌阶段限一次,你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。', rejiuyuan:'救援', - rejiuyuan_info:'主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,则其可以选择令你回复1点体力,然后其摸1张牌。', + rejiuyuan_info:'主公技,其他吴势力角色对自己使用【桃】时,若其体力值大于你,则其可以选择令你回复1点体力,然后其摸一张牌。', "new_yajiao":"涯角", "new_yajiao_info":"每当你于回合外使用或打出牌时,你可以亮出牌堆顶的一张牌,并将其交给一名角色。若此牌与你此次使用或打出的牌类别不同,则你弃置一张牌。", @@ -14564,7 +14796,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "new_rewusheng":"武圣", "new_rewusheng_info":"你可以将一张红色牌当做【杀】使用或打出。你使用的方片杀没有距离限制。", "new_yijue":"义绝", - "new_yijue_info":"出牌阶段限一次,你可以弃置一张牌并令一名有手牌的其他角色展示一张手牌。若此牌为黑色,则该角色不能使用或打出牌,非锁定技失效且受到来自你的红桃【杀】的伤害+1直到回合结束。若此牌为红色,则你可以获得此牌,并可以令其回复一点体力。", + "new_yijue_info":"出牌阶段限一次,你可以弃置一张牌并令一名有手牌的其他角色展示一张手牌。若此牌为黑色,则该角色不能使用或打出牌,非锁定技失效且受到来自你的红桃【杀】的伤害+1直到回合结束。若此牌为红色,则你可以获得此牌,并可以令其回复1点体力。", "new_yijue2":"义绝", "new_yijue2_info":"", "new_repaoxiao":"咆哮", @@ -14578,7 +14810,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "qingjian_add":"清俭", "qingjian_add_info":"", "new_reqingnang":"青囊", - "new_reqingnang_info":"出牌阶段,你可以弃置一张手牌,令一名本回合内未成为过〖青囊〗的目标的角色回复一点体力。若你弃置的是黑色牌,则你本回合内不能再发动〖青囊〗。", + "new_reqingnang_info":"出牌阶段,你可以弃置一张手牌,令一名本回合内未成为过〖青囊〗的目标的角色回复1点体力。若你弃置的是黑色牌,则你本回合内不能再发动〖青囊〗。", "new_reyaowu":"耀武", "new_reyaowu_info":"锁定技,当一名角色使用【杀】对你造成伤害时,若此杀为红色,该角色回复1点体力或摸一张牌。否则你摸一张牌。", reyaowu:'耀武', @@ -14595,7 +14827,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ reyingzi:'英姿', refanjian:'反间', refanjian_card:'弃牌', - refanjian_hp:'流失体力', + refanjian_hp:'失去体力', reqianxun:'谦逊', reqianxun2:'谦逊', relianying:'连营', @@ -14627,24 +14859,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ chulao:'除疠', liyu:'利驭', rerende:'仁德', - rerende_info:'出牌阶段,你可以将至少一张手牌交给其他角色,然后你于此阶段内不能再以此法交给该角色牌;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌', - liyu_info:'当你使用【杀】对一名其他角色造成伤害后,该角色可令你获得其一张牌,若如此做,则视为你对其选择的另一名角色使用一张【决斗】', + rerende_info:'出牌阶段,你可以将至少一张手牌交给其他角色,然后你于此阶段内不能再以此法交给该角色牌;若你于此阶段内给出的牌首次达到两张,你可以视为使用一张基本牌。', + liyu_info:'当你使用【杀】对一名其他角色造成伤害后,该角色可令你获得其一张牌,若如此做,则视为你对其选择的另一名角色使用一张【决斗】。', xunxun_info:'摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。', wangxi_info:'每当你对其他角色造成1点伤害后,或受到其他角色造成的1点伤害后,你可与该角色各摸一张牌。', reguose_info:'出牌阶段限一次,你可以选择一项:将一张方片花色牌当做【乐不思蜀】使用;或弃置一张方片花色牌并弃置场上的一张【乐不思蜀】。选择完成后,你摸一张牌。', fenwei_info:'限定技,当一名角色使用的锦囊牌指定了至少两名角色为目标时,你可以令此牌对其中任意名角色无效。', chulao_info:'出牌阶段限一次,若你有牌,你可以选择任意名势力各不相同的其他角色,你弃置你和这些角色的各一张牌。然后以此法弃置黑桃牌的角色各摸一张牌。', - reguicai_info:'在任意角色的判定牌生效前,你可以打出一张牌代替之', + reguicai_info:'在任意角色的判定牌生效前,你可以打出一张牌代替之。', zhuhai_info:'一名其他角色的结束阶段开始时,若该角色本回合造成过伤害,你可以对其使用一张【杀】。', qianxin_info:'觉醒技,当你造成一次伤害后,若你已受伤,你须减1点体力上限,并获得技能“荐言”。', - jianyan_info:'出牌阶段限一次,你可以声明一种牌的类别或颜色,并亮出牌库中第一张符合你声明的牌,然后你令一名男性角色获得此牌', + jianyan_info:'出牌阶段限一次,你可以声明一种牌的类别或颜色,并亮出牌库中第一张符合你声明的牌,然后你令一名男性角色获得此牌。', rekurou_info:'出牌阶段限一次,你可以弃置一张牌,然后失去1点体力。', - zhaxiang_info:'锁定技 每当你失去1点体力后,你摸三张牌。然后若此时是你的出牌阶段,则直到回合结束,你使用红色【杀】无距离限制且不能被【闪】响应,你可以额外使用一张【杀】。', + zhaxiang_info:'锁定技,每当你失去1点体力后,你摸三张牌。然后若此时是你的出牌阶段,则直到回合结束,你使用红色【杀】无距离限制且不能被【闪】响应,你可以额外使用一张【杀】。', qiaomeng_info:'当你使用黑色【杀】对一名角色造成伤害后,你可以弃置该角色装备区里的一张牌,若此牌是坐骑牌,你于此牌置入弃牌堆后获得之。', reyicong_info:'锁定技,你计算与其他角色的距离时-1。若你的体力值不大于2,则其他角色计算与你的距离时+1。', refankui_info:'每当你受到1点伤害后,你可以获得伤害来源的一张牌。', retieji_info:'当你使用【杀】指定一名角色为目标后,你可以进行一次判定并令该角色的非锁定技失效直到回合结束,除非该角色弃置一张与判定结果花色相同的牌,否则不能使用【闪】抵消此【杀】。', - yijue_info:'出牌阶段限一次,你可以与一名其他角色拼点,若你赢,则直到回合结束,该角色不能使用或打出手牌且其非锁定技失效,若你没赢,你可令该角色回复一点体力。', + yijue_info:'出牌阶段限一次,你可以与一名其他角色拼点,若你赢,则直到回合结束,该角色不能使用或打出手牌且其非锁定技失效,若你没赢,你可令该角色回复1点体力。', reyiji_info:'每当你受到1点伤害后,你可以摸两张牌。然后你可以在至多两名角色的武将牌旁边分别扣置至多两张手牌,这些角色的下个摸牌阶段开始时,该角色获得其武将牌旁的这些牌。', rejianxiong_info:'每当你受到伤害后,你可以获得对你造成伤害的牌,然后摸一张牌。', reyajiao_info:'每当你于回合外使用或打出一张手牌时,你可以亮出牌堆顶的一张牌,若此牌与你此次使用或打出的牌类别相同,你可以将之交给任意一名角色;若不同则你可以将之置入弃牌堆。', @@ -14652,9 +14884,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ reqianxun_info:'每当一张延时类锦囊牌或其他角色使用的普通锦囊牌生效时,若你是此牌的唯一目标,你可以将所有手牌置于你的武将牌上,若如此做,此回合结束时,你获得你武将牌上的所有牌。', relianying_info:'当你失去最后的手牌时,你可以令至多X名角色各摸一张牌(X为你此次失去的手牌数)。', reyingzi_info:'锁定技,摸牌阶段摸牌时,你额外摸一张牌;你的手牌上限为你的体力上限。', - refanjian_info:'出牌阶段限一次,你可以展示一张手牌并将此牌交给一名其他角色。然后该角色选择一项:展示其手牌并弃置所有与此牌花色相同的牌,或失去一点体力。', - qingjian_info:'每当你于摸牌阶段外得到牌时,你可以将其中任意牌以任意顺序交给其他角色,每回合最多发动四次', - qinxue_info:'觉醒技。准备阶段或结束阶段开始时,若你的手牌数减体力值大于1,则你减一点体力上限,回复1点体力或摸两张牌,获得技能【攻心】。', + refanjian_info:'出牌阶段限一次,你可以展示一张手牌并将此牌交给一名其他角色。然后该角色选择一项:展示其手牌并弃置所有与此牌花色相同的牌,或失去1点体力。', + qingjian_info:'每当你于摸牌阶段外得到牌时,你可以将其中任意牌以任意顺序交给其他角色,每回合最多发动四次。', + qinxue_info:'觉醒技。准备阶段或结束阶段开始时,若你的手牌数减体力值大于1,则你减1点体力上限,回复1点体力或摸两张牌,获得技能〖攻心〗。', retuxi_info:'摸牌阶段摸牌时,你可以少摸任意张牌,然后选择等量的手牌数大于或等于你的其他角色,获得这些角色的各一张手牌。', reluoyi_info:'你可以跳过摸牌阶段,然后展示牌堆顶的三张牌,获得其中的基本牌、武器牌和【决斗】,若如此做,直到你的下回合开始,你为伤害来源的【杀】或【决斗】造成的伤害+1。', reganglie_info:'当你受到1点伤害后,你可进行判定,若结果为:红色,你对伤害来源造成1点伤害,;黑色,你弃置伤害来源一张牌。', @@ -14690,15 +14922,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_caopi:'界曹丕', re_caopi_prefix:'界', oljiuchi:'酒池', - oljiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。锁定技,你使用【酒】无次数限制,且当你于回合内使用带有【酒】效果的【杀】造成伤害后,你令你的【崩坏】失效直到回合结束。', + oljiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。锁定技,你使用【酒】无次数限制,且当你于回合内使用带有【酒】效果的【杀】造成伤害后,你令你的〖崩坏〗失效直到回合结束。', repolu:'破虏', - repolu_info:'当你杀死一名角色/死亡时,你可以令任意名角色摸X+1张牌。(X为你此前发动过【破虏】的次数)', + repolu_info:'当你杀死一名角色/死亡时,你可以令任意名角色摸X+1张牌。(X为你此前发动过〖破虏〗的次数)', rexingshang:'行殇', rexingshang_info:'当其他角色死亡后,你可以选择一项:回复1点体力,或获得其所有牌。', refangzhu:'放逐', refangzhu_info:'当你受到伤害后,你可以令一名其他角色选择一项:摸X张牌并将武将牌翻面,或弃置X张牌并失去1点体力。(X为你已损失的体力值)', rezaiqi:'再起', - rezaiqi_info:'结束阶段开始时,你可以令至多X名角色选择一项:1.摸一张牌,2.令你回复1点体力(X为本回合进入弃牌堆的红色牌数)', + rezaiqi_info:'结束阶段开始时,你可以令至多X名角色选择一项:1.摸一张牌,2.令你回复1点体力(X为本回合进入弃牌堆的红色牌数)。', ol_jiangwei:'界姜维', ol_jiangwei_prefix:'界', ol_caiwenji:'界蔡琰', @@ -14706,7 +14938,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ retuntian:'屯田', rebeige:'悲歌', retuntian_info:'①当你于回合外失去牌后,你可以判定。若判定结果为♥,你获得此判定牌。否则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。', - rebeige_info:'当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复X点体力(X为伤害点数);♦︎该角色摸三张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面', + rebeige_info:'当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复X点体力(X为伤害点数);♦︎该角色摸三张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。', rehunzi:'魂姿', rehunzi_info:'觉醒技,准备阶段,若你的体力值不大于2,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。', rezhijian:'直谏', @@ -14722,7 +14954,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rexianzhen:'陷阵', rexianzhen_info:'出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你本回合内对其使用牌没有次数和距离限制且无视其防具。若你没赢,你本回合内不能使用【杀】。若你以此法失去的拼点牌为【杀】,则你的【杀】不计入本回合的手牌上限。', rejinjiu:'禁酒', - rejinjiu_info:'锁定技,你的【酒】均视为【杀】。其他角色不能于你的回合内使用【酒】。当你受到酒【杀】的伤害时,你令此伤害-X(X为影响过此【杀】的伤害值的【酒】的数量)', + rejinjiu_info:'锁定技,你的【酒】均视为【杀】。其他角色不能于你的回合内使用【酒】。当你受到酒【杀】的伤害时,你令此伤害-X(X为影响过此【杀】的伤害值的【酒】的数量)。', rejinjiu2:'禁酒', rejinjiu3:'禁酒', ol_xiahouyuan:'界夏侯渊', @@ -14734,15 +14966,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_zhangyi:'界张嶷', re_zhangyi_prefix:'界', rewurong:'怃戎', - rewurong_info:'出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你获得其一张牌', + rewurong_info:'出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你获得其一张牌。', ol_pangtong:'界庞统', ol_pangtong_prefix:'界', olniepan:'涅槃', - olniepan_info:'限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。然后你选择获得以下技能中的一个:〖八阵〗/〖火计〗/〖看破〗', + olniepan_info:'限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。然后你选择获得以下技能中的一个:〖八阵〗/〖火计〗/〖看破〗。', ol_weiyan:'界魏延', ol_weiyan_prefix:'界', reqimou:'奇谋', - reqimou_info:'限定技,出牌阶段,你可以失去任意点体力并摸等量的牌,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)', + reqimou_info:'限定技,出牌阶段,你可以失去任意点体力并摸等量的牌,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。', ol_xiaoqiao:'界小乔', ol_xiaoqiao_prefix:'界', rehongyan:'红颜', @@ -14758,7 +14990,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rejiushi_mark:'酒诗·改', rejiushi_mark_info:'当你需要使用【酒】时,若你的武将牌正面向上,你可以翻面,视为使用一张【酒】。当你受到伤害后,若你的武将牌背面向上,你可以翻面。当你翻面时,你获得牌堆中的一张随机锦囊。', chengzhang:'成章', - chengzhang_info:'觉醒技,准备阶段开始时,若你造成伤害与受到伤害值之和累计7点或以上,则你回复1点体力并摸1张牌,然后改写〖酒诗〗。', + chengzhang_info:'觉醒技,准备阶段开始时,若你造成伤害与受到伤害值之和累计7点或以上,则你回复1点体力并摸一张牌,然后改写〖酒诗〗。', re_wuyi:'界吴懿', re_wuyi_prefix:'界', re_zhuran:'界朱然', @@ -14803,7 +15035,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_pangde:'界庞德', ol_pangde_prefix:'界', rejianchu:'鞬出', - rejianchu_info:'当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌不为基本牌,此【杀】不可被【闪】响应且你本回合使用【杀】的次数上限+1,为基本牌,该角色获得此【杀】', + rejianchu_info:'当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌不为基本牌,此【杀】不可被【闪】响应且你本回合使用【杀】的次数上限+1,为基本牌,该角色获得此【杀】。', re_taishici:'界太史慈', re_taishici_prefix:'界', hanzhan:'酣战', @@ -14953,7 +15185,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_jiangwei:'界姜维', ol_jiangwei_prefix:'界', oltiaoxin:'挑衅', - oltiaoxin_info:'出牌阶段限一次,你可以选择一名攻击范围内包含你的角色。然后除非该角色对你使用一张【杀】且此【杀】对你造成伤害,否则你弃置其一张牌,然后将此技能于此出牌阶段内修改为出牌阶段限两次。 ', + oltiaoxin_info:'出牌阶段限一次,你可以选择一名攻击范围内包含你的角色。然后除非该角色对你使用一张【杀】且此【杀】对你造成伤害,否则你弃置其一张牌,然后将此技能于此出牌阶段内修改为出牌阶段限两次。', olzhiji:'志继', olzhiji_info:'觉醒技,准备阶段或结束阶段,若你没有手牌,你回复1点体力或摸两张牌,然后减1点体力上限,获得〖观星〗。', decadezhenjun:'镇军', @@ -15000,7 +15232,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olhaoshi:'好施', olhaoshi_info:'摸牌阶段开始时,你可以多摸两张牌。然后摸牌阶段结束时,若你的手牌数大于5,则你将手牌数的一半(向下取整)交给一名手牌最少其他角色并获得如下效果直到你下回合开始:当你成为【杀】或普通锦囊牌的目标后,其可以交给你一张手牌。', oldimeng:'缔盟', - oldimeng_info:'出牌阶段限一次,你可令两名满足X≤Y的其他角色交换手牌并获得如下效果:出牌阶段结束时,你弃置X张牌(X为这两名角色手牌数之差的绝对值;Y为你的手牌数)。', + oldimeng_info:'出牌阶段限一次,你可令两名满足X≤Y的其他角色交换手牌并获得如下效果:出牌阶段结束时,你弃置X张牌(X为这两名角色手牌数之差的绝对值;Y为你的牌数)。', rejijiang:'激将', rejijiang1:'激将', @@ -15052,8 +15284,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ decadexianzhen_info:'每回合限一次。出牌阶段,你可以和一名其他角色拼点。若你赢:本回合你无视该角色的防具,且对其使用牌没有次数和距离限制,且本回合对其使用牌造成伤害时,此伤害+1(每种牌名每回合限一次);若你没赢:你本回合内不能使用【杀】,且【杀】不计入手牌上限。', decadejinjiu:'禁酒', decadejinjiu_info:'锁定技。你的【酒】的牌名均视为【杀】且点数视为K;你的回合内,其他角色不能使用【酒】。', - dc_xushu:'界徐庶', - dc_xushu_prefix:'界', + dc_xushu:'新杀徐庶', + dc_xushu_prefix:'新杀', rezhuhai:'诛害', rezhuhai_info:'其他角色的回合结束时,若其本回合内造成过伤害,则你可以选择一项:⒈将一张手牌当做【杀】对其使用。⒉视为对其使用一张【过河拆桥】。', xsqianxin:'潜心', @@ -15122,7 +15354,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refenli_info:'若你的手牌数为全场最多,你可以跳过判定阶段和摸牌阶段;若你的体力值为全场最多,你可以跳过出牌阶段;若你的装备区里有牌且数量为全场最多,你可以跳过弃牌阶段。', //破界石不值钱了 就逮着免费突破硬削是吧 repingkou:'平寇', - repingkou_info:'回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。若你选择的角色数小于X,则你可以弃置其中一名角色装备区内的一张牌', + repingkou_info:'回合结束时,你可以对至多X名其他角色各造成1点伤害(X为你本回合跳过的阶段数)。若你选择的角色数小于X,则你可以弃置其中一名角色装备区内的一张牌。', dc_liru:'界李儒', dc_liru_prefix:'界', dcmieji:'灭计', @@ -15244,6 +15476,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhoutai_prefix:'界', caoren:'界曹仁', caoren_prefix:'界', + ollianhuan:'连环', + ollianhuan_info:'你可以将一张♣牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标后,可以给此牌增加一个目标。', + ol_lingtong:'OL界凌统', + ol_lingtong_prefix:'OL界', + olxuanfeng:'旋风', + olxuanfeng_info:'当你一次性失去至少两张牌后,或失去装备区的牌后,你可以依次弃置一至两名其他角色的共计两张牌。', + re_lidian:'界李典', + re_lidian_prefix:'界', + re_xushu:'界徐庶', + re_xushu_prefix:'界', refresh_standard:'界限突破·标', refresh_feng:'界限突破·风', diff --git a/character/sb.js b/character/sb.js index f11ea3c0b..dae7a25e7 100644 --- a/character/sb.js +++ b/character/sb.js @@ -38,6 +38,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sb_liubiao:['male','qun',3,['sbzishou','sbzongshi']], sb_zhurong:['female','shu',4,['sblieren','sbjuxiang']], sb_menghuo:['male','shu',4,['sbhuoshou','sbzaiqi']], + sb_yl_luzhi:['male','qun',3,['nzry_mingren','sbzhenliang'],['unseen']], + sb_xiaoqiao:['female','wu',3,['sbtianxiang','xinhongyan'],['unseen']], }, characterSort:{ sb:{ @@ -49,6 +51,185 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, skill:{ + //卢植 + sbzhenliang:{ + mark:true, + locked:false, + zhuanhuanji:true, + marktext:'☯', + intro:{ + content:function(storage,player){ + if(storage) return '你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸一张牌。'; + return '出牌阶段限一次,你可以弃置一张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害。'; + }, + }, + audio:2, + enable:'phaseUse', + filter:function(event,player){ + if(player.storage.sbzhenliang) return false; + var storage=player.getExpansions('nzry_mingren'); + if(!storage.length) return false; + var color=get.color(storage[0]); + return game.hasPlayer(function(current){ + return player.inRange(current)&&player.countCards('he',function(card){ + return get.color(card)==color; + })>=Math.max(1,Math.abs(player.getHp()-current.getHp())); + }); + }, + filterCard:function(card,player){ + return get.color(card)==get.color(player.getExpansions('nzry_mingren')[0]); + }, + selectCard:[1,Infinity], + complexSelect:true, + complexCard:true, + position:'he', + filterTarget:function(card,player,target){ + return player.inRange(target)&&ui.selected.cards.length==Math.max(1,Math.abs(player.getHp()-target.getHp())); + }, + check:function(card){ + return 6.5-get.value(card); + }, + prompt:'弃置与攻击范围内的一名角色体力值之差(至少为1)张与“任”颜色相同的牌,对其造成1点伤害。', + content:function(){ + player.changeZhuanhuanji('sbzhenliang'); + target.damage('nocard'); + }, + ai:{ + order:5, + result:{ + player:function(player,target){ + return get.damageEffect(target,player,player); + }, + }, + }, + group:'sbzhenliang_draw', + subSkill:{ + draw:{ + trigger:{global:['useCardAfter','respondAfter']}, + filter:function(event,player){ + if(_status.currentPhase==player||!player.storage.sbzhenliang) return false; + var card=player.getExpansions('nzry_mingren')[0]; + return card&&get.type2(event.card)==get.type2(card); + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('sbzhenliang'),'令一名角色摸一张牌').set('ai',function(target){ + if(target.hasSkillTag('nogain')) return 0.1; + var att=get.attitude(player,target); + return att*(Math.max(5-target.countCards('h'),2)+3); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.changeZhuanhuanji('sbzhenliang'); + player.logSkill('sbzhenliang',target); + target.draw(); + } + }, + }, + }, + ai:{combo:'nzry_mingren'}, + }, + //小乔 + sbtianxiang:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + return player.countCards('he',card=>lib.skill.sbtianxiang.filterCard(card,player))&&game.hasPlayer(target=>lib.skill.sbtianxiang.filterTarget(null,player,target)); + }, + filterCard:function(card,player){ + return get.color(card,player)=='red'; + }, + filterTarget:function(card,player,target){ + return target!=player&&!target.getSkills().some(skill=>skill.indexOf('sbtianxiang_')==0); + }, + discard:false, + lose:false, + delay:0, + usable:3, + prompt:'将一张红色牌交给一名角色并令其获得此花色的“天香”标记', + content:function(){ + player.give(cards,target); + var suit=get.suit(cards[0],player); + target.addSkill('sbtianxiang_'+suit); + }, + ai:{ + order:5, + result:{target:-1}, + }, + group:['sbtianxiang_draw','sbtianxiang_effect'], + subSkill:{ + heart:{ + charlotte:true, + mark:true, + marktext:'♥︎', + intro:{content:'伤害转移术'}, + }, + diamond:{ + charlotte:true, + mark:true, + marktext:'♦︎', + intro:{content:'掳掠大法'}, + }, + draw:{ + audio:'sbtianxiang', + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return game.hasPlayer(target=>target.getSkills().some(skill=>skill.indexOf('sbtianxiang_')==0)); + }, + forced:true, + locked:false, + content:function(){ + var num=0; + game.countPlayer(target=>{ + var skills=target.getSkills().filter(skill=>skill.indexOf('sbtianxiang_')==0); + target.removeSkill(skills); + num+=skills.length; + }); + player.draw(num); + }, + }, + effect:{ + trigger:{player:'damageBegin3'}, + filter:function(event,player){ + return game.hasPlayer(target=>target.getSkills().some(skill=>skill.indexOf('sbtianxiang_')==0)); + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('sbtianxiang'),'移去一名角色的“天香”标记并执行相应效果',function(card,player,target){ + return target.getSkills().some(skill=>skill.indexOf('sbtianxiang_')==0); + }).set('ai',target=>{ + var player=_status.event.player; + return -get.attitude(player,target)*target.getSkills().filter(skill=>skill.indexOf('sbtianxiang_')==0).length; + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('sbtianxiang',target); + var skills=target.getSkills().filter(skill=>skill.indexOf('sbtianxiang_')==0); + target.removeSkill(skills); + if(skills.contains('sbtianxiang_heart')){ + target.damage(trigger.source?trigger.source:'nosource'); + trigger.cancel(); + } + if(skills.contains('sbtianxiang_diamond')){ + var cards=target.getCards('he'); + if(!cards.length) event.finish(); + else if(cards.length<=2) event._result={bool:true,cards:cards}; + else target.chooseCard('he',2,'天香:交给'+get.translation(player)+'两张牌',true); + } + else event.finish(); + } + else event.finish(); + 'step 2' + if(result.bool) player.gain(result.cards,target,'giveAuto'); + }, + }, + }, + }, //张郃 sbqiaobian:{ audio:2, @@ -82,7 +263,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).setHiddenSkill('sbqiaobian'); break; case 'phaseDraw': - player.chooseBool(get.prompt('sbqiaobian'),'跳过摸牌阶段,于下个准备阶段摸两张牌并回复1点体力').setHiddenSkill('sbqiaobian'); + player.chooseBool(get.prompt('sbqiaobian'),'跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力').setHiddenSkill('sbqiaobian'); break; case 'phaseUse': var num=(player.countCards('h')-6); @@ -132,13 +313,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ draw:{ charlotte:true, mark:true, - intro:{content:'准备阶段摸两张牌并回复1点体力'}, + intro:{content:'准备阶段摸五张牌并回复1点体力'}, audio:'sbqiaobian', trigger:{player:'phaseZhunbeiBegin'}, forced:true, content:function(){ player.removeSkill('sbqiaobian_draw'); - player.draw(2); + player.draw(5); player.recover(); }, }, @@ -240,7 +421,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' player.chooseTarget(get.prompt('sbzaiqi'),'选择任意名角色并消耗等量蓄力值,令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力',[1,player.countMark('charge')]).set('ai',function(target){ var player=_status.event.player; - return get.attitude(player,target)+player.getDamagedHp()*3.5; + var att=get.attitude(player,target); + return 3-get.sgn(att)+Math.abs(att/1000); }); 'step 1' if(result.bool){ @@ -275,19 +457,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ backflow:{ audio:'sbzaiqi', trigger:{ - player:'enterGame', + //player:'enterGame', source:'damageSource', - global:'phaseBefore', + //global:'phaseBefore', }, usable:1, - forced:true, - locked:false, filter:function(event,player){ if(event.name=='damage') return true; return (event.name!='phase'||game.phaseNumber==0); }, + forced:true, + locked:false, content:function(){ - player.addMark('charge',1); + player.addMark('charge',trigger.name=='damage'?1:3); } } } @@ -333,7 +515,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=trigger.card.storage.sblieren[1]; player.chooseTarget('烈刃:是否对除'+get.translation(target)+'外的一名其他角色造成1点伤害?',(card,player,target)=>{ return target!=_status.event.targeted&&target!=player; - }).set('targeted',target); + }).set('targeted',target).set('ai',targetx=>get.damageEffect(targetx,_status.event.player,_status.event.player)); 'step 1' if(result.bool){ var target=result.targets[0]; @@ -518,7 +700,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return event.filterCard(get.autoViewAs({name:'juedou'},hs)); }, - ai:{order:0.001}, + ai:{ + order:0.001, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep'){ + if(arg&&(!arg.card||get.name(arg.card)!=='tao')) return false; + let limit=player.hasMark('sbjiang')?(game.countPlayer(current=>{ + return current.group=='wu'&¤t!=player; + })+1):1; + return player.isPhaseUsing()&&(player.getStat('skill').sbjiang_qiben||0)get.name(card)!='tao','h'); + } + } + }, } }, }, @@ -794,55 +988,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){ selectTargetAi:function(event,player){ let cache=_status.event.getTempCache('sblijian','targets'); if(Array.isArray(cache)) return cache.length; - let id=[null,0],players=game.filterPlayer(current=>current!==player),temp; - for(let i of players){ - temp=get.attitude(event.player,i); - if(temp{ + return current.getHistory('damage').length>0; + })):0,alter=[null,1,1],temp; + for(let i of game.players){ + if(player===i) continue; + temp=get.effect(i,new lib.element.VCard({name:'juedou',isCard:true}),get.copy(i),i); + if(temp){ + let att=get.attitude(event.player,i); + if(!att&&sbbiyue||att*temp>0) targets.push([i,temp,att]); + else if(!alter[2]) continue; + else if(!att||att>0&&temp>-15&&i.hp>2||att<0&&temp<15) alter=[i,temp,att]; + } } - if(id[0]) id=id[0].identity; - else{ + targets.sort((a,b)=>{ + if(Boolean(a[2])!==Boolean(b[2])) return Math.abs(b[2])-Math.abs(a[2]); + return Math.abs(b[1])-Math.abs(a[1]); + }); + if(targets.length<2&&alter[0]) targets.push(alter); + targets=targets.slice(0,1+player.countCards('he',card=>{ + if(lib.filter.cardDiscardable(card,player,'sblijian')){ + cards.push(get.value(card)); + return true; + } + return false; + })); + cards.sort((a,b)=>a-b); + for(let i=0;i1){ - let list=[game.createCard('sha'),game.createCard('shan')]; - vp=ui.create.player().init('sunce'); - vp.hp=2; - vp.skills=[]; - game.players.push(vp); - if(typeof id==='string'){ - if(id.endsWith('zhu')||id.endsWith('Zhu')) id=id.slice(0,-1)+'ong'; - vp.identity=id; - vp.showIdentity(); - } - else vp.side=id[0].side; - vp.directgain(list,false); - for(let i of players){ - temp=get.effect(i,{name:'juedou',isCard:true},vp,event.player)+get.effect(vp,{name:'juedou',isCard:true},i,event.player); - if(temp>=0) targets.push([i,temp]); - } - game.cardsGotoSpecial(list); - game.players.remove(vp); - } - else{ - vp=vp[0]; - for(let i of players){ - temp=get.effect(i,{name:'juedou',isCard:true},vp,event.player)+get.effect(vp,{name:'juedou',isCard:true},i,event.player); - if(temp>=0) targets.push([i,temp]); - } - } - for(let i=0;i0&&targets[i][1]<2.5*temp&&targets.length>2) targets.splice(i--,1); - else targets[i].push(temp); - } - targets.sort((a,b)=>{ - let att1=get.sgn(get.attitude(event.player,a[0])),att2=get.sgn(get.attitude(event.player,b[0])); - if(att1!==att2) return att1-att2; - return b[1]-a[1]; - }); - targets=targets.slice(0,player.countCards('he')+1); event.putTempCache('sblijian','targets',targets); return targets.length; }, @@ -858,34 +1039,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ result:{ player:function(player,target){ let targets=_status.event.getTempCache('sblijian','targets'); - if(!Array.isArray(targets)) return 0; - if(targets.length>2&&!player.hasSkill('sbbiyue')) return 0; - for(let i=0;i0) return targets[i][1]/5; - return -targets[i][1]; - } - } - return 0; - } - if(ui.selected.targets.length){ - let tars=ui.selected.targets.concat([target]).sortBySeat(); - for(let i=0;i0&&_status.event&&_status.event.type=='phase'&&get.tag(card,'recover')) return num/5; + } + }, trigger:{player:'phaseDrawBegin2'}, forced:true, filter:function(event,player){ @@ -3637,7 +3814,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target){ - if(get.tag(card,'recover')&&target.hp>=target.maxHp-1&&target.maxHp>1) return [0,0]; + if(get.tag(card,'recover')&&target.hp>0&&target.needsToDiscard()<1) return [0,0]; } } } @@ -3648,6 +3825,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbzhiheng:{ audio:2, audioname:['shen_caopi'], + mod:{ + aiOrder:function(player,card,num){ + if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; + let eq=player.getEquip(get.subtype(card)); + if(eq&&get.equipValue(card)-get.equipValue(eq)get.value(i)>Math.max(6,9-player.hp),'he')) return 1; + return 10; + }, result:{ player:1 }, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat().skill.sbzhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); + }, threaten:1.56 }, }, @@ -3703,7 +3894,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ onremove:true, content:function(){ 'step 0' - player.chooseControl('变化','不变').set('prompt','统业:猜测场上装备数是否于你下回合准备阶段前发生变化').set('ai',()=>Number((game.countPlayer()<=4?Math.random():1)<0.4)); + player.chooseControl('变化','不变').set('prompt','统业:猜测场上装备数是否于你下回合准备阶段前发生变化').set('ai',()=>{ + let player = _status.event.player; + if(game.countPlayer() > 3) return '变化'; + if(game.countPlayer(function (current){ + return current.hasCard({type: 'equip'}, 'e'); + }) < game.countPlayer()) return '变化'; + if(game.countPlayer() == 2 && game.countPlayer(function (current){ + if (current != player) return current.countCards('e', {type: 'equip'}) + current.countDisabledSlot(); + }) >= 5) return '不变'; + if(Math.random() < 0.3) return '变化'; + return '不变'; + }); 'step 1' if(result.control=='变化'){ player.addSkill('sbtongye_change',1); @@ -4242,7 +4444,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, //华雄 sbyangwei:{ - audio:2, + audio:3, enable:'phaseUse', filter:function(event,player){ return !player.hasSkill('sbyangwei_counter',null,null,false); @@ -4779,9 +4981,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbleiji:'雷击', sbleiji_info:'出牌阶段,你可以选择一名其他角色并弃4枚“道兵”,对其造成1点雷电伤害。', sbguidao:'鬼道', - sbguidao_info:'①游戏开始时,你获得4枚“道兵”标记(“道兵”上限为8)。②一名角色受到属性伤害后,你获得2枚“道兵”。③当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道②〗于你下回合开始前无效。', + sbguidao_info:'①游戏开始时/一名角色受到属性伤害后,你获得4/2枚“道兵”。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。③“道兵”上限为8。', sbhuangtian:'黄天', - sbhuangtian_info:'主公技,锁定技。①回合开始时,若本回合为你的第一个回合且游戏轮数为1,且游戏内没有【太平要术】,你装备【太平要术】。②其他群势力角色造成伤害后,若你拥有〖鬼道〗,你获得1枚“道兵”(每轮你至多以此法获得4枚“道兵”)。', + sbhuangtian_info:'主公技,锁定技。①回合开始时,若本回合为你的第一个回合且游戏轮数为1,且游戏内没有【太平要术】,你装备【太平要术】。②其他群势力角色造成伤害后,若你拥有〖鬼道〗,你获得2枚“道兵”(每轮你至多以此法获得4枚“道兵”)。', sb_caocao:'谋曹操', sbjianxiong:'奸雄', sbjianxiong_info:'①游戏开始时,你可获得至多2枚“治世”标记。②当你受到伤害后,你可获得伤害牌,摸1-X张牌(X为“治世”数),然后你可弃1枚“治世”。', @@ -4882,10 +5084,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbhuoshou:'祸首', sbhuoshou_info:'锁定技。①【南蛮入侵】对你无效。②当其他角色使用【南蛮入侵】指定第一个目标后,你代替其成为此牌的伤害来源。③出牌阶段开始时,你随机获得弃牌堆中的一张【南蛮入侵】。④出牌阶段,若你于此阶段使用过【南蛮入侵】,你不能使用【南蛮入侵】。', sbzaiqi:'再起', - sbzaiqi_info:'蓄力技(1/7)。①弃牌阶段结束时,你可以消耗任意点蓄力值并选择等量名角色,然后令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力。②每回合限一次。当你造成伤害后,你获得1点蓄力值。', + sbzaiqi_info:'蓄力技(0/7)。①弃牌阶段结束时,你可以消耗任意点蓄力值并选择等量名角色,然后令这些角色选择一项:1.令你摸一张牌;2.弃置一张牌,然后你回复1点体力。②每回合限一次。当你造成伤害后,你获得1点蓄力值。', sb_zhanghe:'谋张郃', sbqiaobian:'巧变', - sbqiaobian_info:'每回合限一次。①你可以失去1点体力并跳过判定阶段,将判定区的所有牌移动给一名其他角色(无法置入其判定区的牌改为弃置之)。②你可以跳过摸牌阶段,于下个准备阶段摸两张牌并回复1点体力。③你可以将手牌数弃置至六张(若手牌数少于六张则跳过之)并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌。', + sbqiaobian_info:'每回合限一次。①你可以失去1点体力并跳过判定阶段,将判定区的所有牌移动给一名其他角色(无法置入其判定区的牌改为弃置之)。②你可以跳过摸牌阶段,于下个准备阶段摸五张牌并回复1点体力。③你可以将手牌数弃置至六张(若手牌数少于六张则跳过之)并跳过出牌阶段和弃牌阶段,然后移动场上的一张牌。', + sb_yl_luzhi:'谋卢植', + sb_yl_luzhi_prefix:'谋', + sbzhenliang:'贞良', + sbzhenliang_info:'转换技。阴:出牌阶段限一次,你可以弃置X张与“任”颜色相同的牌并对攻击范围内的一名角色造成1点伤害(X为你与其体力值值差且X至少为1)。阳:你的回合外,一名角色使用或打出牌结算完成后,若此牌与“任”类别相同,则你可以令一名角色摸一张牌。', + sb_xiaoqiao:'谋小乔', + sb_xiaoqiao_prefix:'谋', + sbtianxiang:'天香', + sbtianxiang_info:'①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸等量的牌。', sb_zhi:'谋攻篇·知', sb_shi:'谋攻篇·识', diff --git a/character/shenhua.js b/character/shenhua.js index 2921d8533..0f7d6b7f1 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -16,7 +16,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ character:{ re_huangzhong:['male','shu',4,['xinliegong']], old_zhoutai:['male','wu',4,['gzbuqu']], - old_caoren:['male','wei',4,['moon_jushou','jiewei']], + old_caoren:['male','wei',4,['jushou']], re_xuhuang:['male','wei',4,['duanliang','jiezi']], re_pangde:['male','qun',4,['mashu','jianchu']], re_xiahouyuan:['male','wei',4,['xinshensu']], @@ -141,6 +141,82 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "chendao":"陈到,字叔至,生卒年不详,豫州汝南(今河南驻马店平舆县)人。三国时期蜀汉将领,刘备帐下白毦兵统领,名位常亚于赵云,以忠勇著称。蜀汉建兴年间,任征西将军、永安都督,封亭侯。在任期间去世。", }, skill:{ + //庞统写法修改 + lianhuan:{ + audio:'lianhuan1', + hiddenCard:(player,name)=>{ + return name=='tiesuo'&&player.hasCard(card=>get.suit(card)=='club','sh'); + }, + enable:'chooseToUse', + filter:function(event,player){ + if(!player.hasCard(card=>get.suit(card)=='club','sh')) return false; + return (event.type=='phase'||event.filterCard({name:'tiesuo'},player,event)); + }, + position:'hs', + filterCard:function(card,player,event){ + if(!event) event=_status.event; + if(get.suit(card)!='club') return false; + if(event.type=='phase'&&get.position(card)!='s'&&player.canRecast(card)){ + return true; + } + else{ + if(game.checkMod(card,player,'unchanged','cardEnabled2',player)===false) return false; + const cardx=get.autoViewAs({name:'tiesuo'},[card]); + return event._backup.filterCard(cardx,player,target); + } + }, + filterTarget:function(fuck,player,target){ + const card=ui.selected.cards[0],event=_status.event,backup=event._backup; + if(!card||game.checkMod(card,player,'unchanged','cardEnabled2',player)===false) return false; + const cardx=get.autoViewAs({name:'tiesuo'},[card]); + return (backup.filterCard(cardx,player,event)&&backup.filterTarget(cardx,player,target)); + }, + selectTarget:function(){ + const card=ui.selected.cards[0],event=_status.event,player=event.player,backup=event._backup; + let recast=false,use=false; + const cardx=get.autoViewAs({name:'tiesuo'},[card]); + if(event.type=='phase'&&player.canRecast(card)) recast=true; + if(game.checkMod(card,player,'unchanged','cardEnabled2',player)!==false){ + if(backup.filterCard(cardx,player,event)) use=true; + } + if(!use) return [0,0]; + else{ + const select=backup.selectTarget(cardx,player); + if(recast&&select[0]>0) select[0]=0; + return select; + } + }, + filterOk:function(){ + const card=ui.selected.cards[0],event=_status.event,player=event.player,backup=event._backup; + const selected=ui.selected.targets.length; + let recast=false,use=false; + const cardx=get.autoViewAs({name:'tiesuo'},[card]); + if(event.type=='phase'&&player.canRecast(card)) recast=true; + if(game.checkMod(card,player,'unchanged','cardEnabled2',player)!==false){ + if(backup.filterCard(cardx,player,event)) use=true; + } + if(recast&&selected==0){ + return true; + } + else if(use){ + const select=backup.selectTarget(cardx,player); + if(select[0]<=-1) return true; + return selected>=select[0]&&selected<=select[1]; + } + }, + discard:false, + lose:false, + delay:false, + precontent:function(){ + var result=event.result; + if(result.targets.length>0) result.card=get.autoViewAs({name:'tiesuo'},result.cards); + }, + content:function(){ + player.recast(cards); + }, + }, + lianhuan1:{audio:2}, + lianhuan2:{audio:2}, //新杀小加强 陈到 dcwanglie:{ audio:'drlt_wanglie', @@ -1306,13 +1382,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ order:13, result:{ - target:function(player,target){ + target:(player,target)=>{ if(target.getEquip('bagua')||target.getEquip('rewrite_bagua')) return 0; - var hs=player.countCards('h',function(card){ - return ['sha','juedou'].contains(card.name)&&get.effect(target,card,player,player)!=0; + let hs=player.countCards('h',card=>{ + if(!get.tag(card,'damage')||get.effect(target,card,player,player)<=0) return 0; + if(get.name(card,player)==='sha'){ + if(target.getEquip('bagua')) return 0.5; + if(target.getEquip('rewrite_bagua')) return 0.25; + } + return 1; + }),ts=target.hp+target.hujia+game.countPlayer(current=>{ + if(get.attitude(current,target)>0) return current.countCards('hs')/8; + return 0; }); - var ts=target.hp; - if(hs>=ts&&ts>1) return -1; + if(hs>=ts) return -hs; return 0; }, }, @@ -1867,7 +1950,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ event.target=result.targets[0]; if(player.hasMark('nzry_huaiju')){ - player.chooseControl().set('choiceList',['流失一点体力','移去一个“橘”']).set('ai',function(){ + player.chooseControl().set('choiceList',['失去1点体力','移去一个“橘”']).set('ai',function(){ if(player.hp>2) return 0; return 1; }); @@ -1924,7 +2007,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); event.num=cards.length; event.str1='令至多'+event.num+'名角色摸一张牌'; - event.str2='对任意名体力值之和为'+event.num+'的角色造成一点伤害'; + event.str2='对任意名体力值之和为'+event.num+'的角色造成1点伤害'; player.chooseControl('cancel2').set('ai',function(){ if(game.countPlayer(function(current){return get.attitude(player,current)<0&¤t.hp==event.num})>0&&event.num<=3) return 1; return 0; @@ -2270,6 +2353,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, nzry_mingren:{ audio:"nzry_mingren_1", + audioname:['sb_yl_luzhi'], marktext:"任", intro:{ content:'expansion', @@ -2283,6 +2367,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ subSkill:{ 1:{ audio:2, + audioname:['sb_yl_luzhi'], trigger:{ global:'phaseBefore', player:'enterGame', @@ -2307,7 +2392,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, 2:{ - audio:2, trigger:{ player:'phaseJieshuBegin', }, @@ -2317,7 +2401,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - player.chooseCard('h','是否用一张手牌替换“任”('+get.translation(player.getExpansions('nzry_mingren')[0])+')?').set('ai',function(card){ + player.chooseCard('h',get.prompt('nzry_mingren'),'选择一张手牌替换“任”('+get.translation(player.getExpansions('nzry_mingren')[0])+')').set('ai',function(card){ var player=_status.event.player; var color=get.color(card); if(color==get.color(player.getExpansions('nzry_mingren')[0])) return false; @@ -2465,14 +2549,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{ content:function(storage,player,skill){ if(player.storage.nzry_shenshi==true) return '其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张'; - return '出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成一点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张'; + return '出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张'; }, }, group:["nzry_shenshi_1","nzry_shenshi_2"], subSkill:{ '1':{ audio:2, - prompt:'出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成一点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张', + prompt:'出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张', enable:'phaseUse', usable:1, filter:function(event,player){ @@ -2901,62 +2985,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, - ollianhuan:{ - audio:'xinlianhuan', - audioname:['ol_pangtong'], - group:['ollianhuan3','ollianhuan5','lianhuan4'], - }, - ollianhuan5:{ - inherit:'lianhuan2', - audioname:['ol_pangtong'], - audio:['xinlianhuan',2], - position:'he', - filter:function(event,player){ - return player.countCards('he',{suit:'club'})>0; - }, - }, - ollianhuan3:{ - audio:['xinlianhuan',1], - audioname:['ol_pangtong'], - enable:'chooseToUse', - filter:function(event,player){ - return player.countCards('hes',{suit:'club'})>0; - }, - filterCard:{suit:'club'}, - viewAs:{name:'tiesuo'}, - prompt:'将一张梅花牌当铁锁连环使用', - check:function(card){return 6-get.value(card)}, - position:'hes', - }, - xinlianhuan:{ - audio:2, - audioname:['ol_pangtong'], - group:['lianhuan3','lianhuan5','lianhuan4'], - }, - lianhuan5:{ - inherit:'lianhuan2', - audioname:['ol_pangtong'], - audio:['xinlianhuan',2], - }, - lianhuan3:{ - audio:['xinlianhuan',1], - audioname:['ol_pangtong'], - enable:'chooseToUse', - filter:function(event,player){ - return player.countCards('hs',{suit:'club'})>0; - }, - filterCard:{suit:'club'}, - viewAs:{name:'tiesuo'}, - prompt:'将一张梅花牌当铁锁连环使用', - check:function(card){return 6-get.value(card)}, - }, - lianhuan4:{ - mod:{ - selectTarget:function(card,player,range){ - if(card.name=='tiesuo'&&range[1]!=-1) range[1]++; - }, - }, - }, reluanji:{ audio:2, enable:'phaseUse', @@ -3156,13 +3184,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, xinkuanggu:{ - trigger:{source:'damageSource'}, - filter:function(event,player){ - return get.distance(player,event.player)<=1&&event.num>0; - }, - direct:true, audio:'kuanggu', audioname:['re_weiyan','ol_weiyan'], + trigger:{source:'damageSource'}, + filter:function(event,player){ + return event.kuangguCheck&&event.num>0; + }, + direct:true, preHidden:true, content:function(){ 'step 0' @@ -3177,7 +3205,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ choice='draw_card'; } - var next=player.chooseDrawRecover(get.prompt(event.name)).set('logSkill',event.name).set('prompt2','摸一张牌或回复1点体力'); + var next=player.chooseDrawRecover('###'+get.prompt(event.name)+'###摸一张牌或回复1点体力').set('logSkill',event.name); next.set('choice',choice); next.set('ai',function(){ return _status.event.getParent().choice; @@ -3190,7 +3218,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.goto(1); } } - } + }, + group:'kuanggu_check', }, xinliegong:{ shaRelated:true, @@ -3803,6 +3832,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, preHidden:true, audioname:['sp_lvmeng','re_sunben','re_sunce'], + mod:{ + aiOrder:function(player,card,num){ + if(get.color(card)==='red'&&get.name(card)==='sha') return get.order({name: 'sha'})+0.15; + } + }, trigger:{ player:'useCardToPlayered', target:'useCardToTargeted', @@ -3811,6 +3845,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!(event.card.name=='juedou'||(event.card.name=='sha'&&get.color(event.card)=='red'))) return false; return player==event.target||event.getParent().triggeredTargets3.length==1; }, + locked:false, frequent:true, content:function(){ player.draw(); @@ -4122,7 +4157,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, beige:{ audio:2, - audioname:['re_caiwenji'], + audioname:['re_caiwenji','ol_caiwenji'], trigger:{global:'damageEnd'}, filter:function(event,player){ return (event.card&&event.card.name=='sha'&&event.source&& @@ -4871,9 +4906,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, preHidden:true, check:function(event,player){ - if(player.countCards('h')<=1) return true; - return game.hasPlayer(function(current){ - return current!=player&¤t.isMinHandcard()&&get.attitude(player,current)>0; + return (player.countCards('h')+2+event.num)<=5||game.hasPlayer(function(target){ + return player!==target&&!game.hasPlayer(function(current){ + return current!==player&¤t!==target&¤t.countCards('h')0; }); }, content:function(){ @@ -5030,6 +5066,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_sunyi:'gzyinghun_re_sunyi', tw_ol_sunjian:'yinghun_ol_sunjian', }, + mod:{ + aiOrder:function(player,card,num){ + if(num>0&&_status.event&&_status.event.type=='phase'&&get.tag(card,'recover')){ + if(player.needsToDiscard()) return num/3; + return 0; + } + } + }, + locked:false, trigger:{player:'phaseZhunbeiBegin'}, direct:true, preHidden:true, @@ -5081,6 +5126,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.num>0) event.target.chooseToDiscard(event.num,true,'he'); } }, + ai:{ + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')&&get.itemtype(player)==='player'&&target.hp>(player.hasSkillTag('damageBonus',true,{ + target:target, + card:card + })?2:1)) return [1,1]; + } + }, + threaten:function(player,target){ + return Math.max(0.5,target.getDamagedHp()/2); + }, + maixie:true + } }, gzyinghun:{ audio:'yinghun', @@ -5089,6 +5148,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_sunyi:'gzyinghun_re_sunyi', tw_ol_sunjian:'yinghun_ol_sunjian', }, + mod:{ + aiOrder:function(player,card,num){ + if(num>0&&_status.event&&_status.event.type=='phase'&&get.tag(card,'recover')){ + if(player.needsToDiscard()) return num/3; + return 0; + } + } + }, + locked:false, trigger:{player:'phaseZhunbeiBegin'}, filter:function(event,player){ return player.getDamagedHp()>0; @@ -5143,13 +5211,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, ai:{ - threaten:function(player,target){ - if(target.hp==target.maxHp) return 0.5; - if(target.hp==1) return 2; - if(target.hp==2) return 1.5; - return 0.5; + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')&&get.itemtype(player)==='player'&&target.hp>(player.hasSkillTag('damageBonus',true,{ + target:target, + card:card + })?2:1)) return [1,1]; + } }, - maixie:true, + threaten:function(player,target){ + return Math.max(0.5,target.getDamagedHp()/2); + }, + maixie:true } }, yinghun_ol_sunjian:{audio:2}, @@ -5300,7 +5373,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "step 1" event.currented.push(event.current); event.current.animate('target'); - event.current.chooseToUse('乱武:使用一张杀或失去一点体力',function(card){ + event.current.chooseToUse('乱武:使用一张杀或失去1点体力',function(card){ if(get.name(card)!='sha') return false; return lib.filter.cardEnabled.apply(this,arguments) },function(card,player,target){ @@ -5405,7 +5478,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, huoji:{ audio:2, - enable:'phaseUse', + enable:'chooseToUse', filterCard:function(card){ return get.color(card)=='red'; }, @@ -5416,7 +5489,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ position:'hs', prompt:'将一张红色牌当火攻使用', check:function(card){ - var player=_status.currentPhase; + var player=get.player(); if(player.countCards('h')>player.hp){ return 6-get.value(card); } @@ -5498,50 +5571,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, threaten:1.2 }, - lianhuan:{ - audio:'lianhuan1', - group:['lianhuan1','lianhuan2'] - }, - lianhuan1:{ - audio:2, - audioname:['re_pangtong'], - enable:'chooseToUse', - filter:function(event,player){ - return player.countCards('hs',{suit:'club'})>0; - }, - position:'hs', - filterCard:function(card){ - return get.suit(card)=='club'; - }, - viewAs:{name:'tiesuo'}, - prompt:'将一张梅花牌当铁锁连环使用', - check:function(card){return 4.5-get.value(card)} - }, - lianhuan2:{ - audio:2, - popup:'lianhuan', - enable:'phaseUse', - filter:(event,player)=>player.hasCard(card=>lib.skill.lianhuan2.filterCard(card,player),'h'), - filterCard:(card,player)=>get.suit(card)=='club'&&player.canRecast(card), - check:function(card){ - return 5-get.useful(card); - }, - content:function(){ - player.recast(cards); - }, - discard:false, - lose:false, - delay:false, - prompt:'将一张梅花牌置入弃牌堆并摸一张牌', - ai:{ - basic:{ - order:1 - }, - result:{ - player:1 - } - } - }, niepan:{ audio:2, audioname:['re_pangtong'], @@ -6238,30 +6267,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){ useShan:true, effect:{ target:function(card,player,target,current){ - if(get.tag(card,'respondShan')){ - var hastarget=game.hasPlayer(function(current){ - return get.attitude(target,current)<0; - }); - var be=target.countCards('e',{color:'black'}); - if(target.countCards('h','shan')&&be){ - if(!target.hasSkill('guidao')) return 0; - return [0,hastarget?target.countCards('he')/2:0]; + if(get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{ + target: target, + card: card + },true)){ + let club=0,spade=0; + if(game.hasPlayer(function(current){ + return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0; + })){ + club=2; + spade=4; } - if(target.countCards('h','shan')&&target.countCards('h')>2){ - if(!target.hasSkill('guidao')) return 0; - return [0,hastarget?target.countCards('h')/4:0]; - } - if(target.countCards('h')>3||(be&&target.countCards('h')>=2)){ - return [0,0]; - } - if(target.countCards('h')==0){ - return [1.5,0]; - } - if(target.countCards('h')==1&&!be){ - return [1.2,0]; - } - if(!target.hasSkill('guidao')) return [1,0.05]; - return [1,Math.min(0.5,(target.countCards('h')+be)/4)]; + if(!target.isHealthy()) club+=2; + if(!club&&!spade) return 1; + if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs')); + if(!target.hasSkillTag('rejudge')) return [1,(club+spade)/4]; + let pos=player.hasSkillTag('viewHandcard',null,target,true)?'hes':'e',better=club>spade?'club':'spade',max=0; + target.hasCard(function(cardx){ + if(get.suit(cardx)===better){ + max=2; + return true; + } + if(spade&&get.color(cardx)==='black') max=1; + },pos); + if(max===2) return [1,Math.max(club,spade)]; + if(max===1) return [1,Math.min(club,spade)]; + if(pos==='e') return [1,Math.min(Math.max(1,target.countCards('hs'))*(club+spade)/4,Math.max(club,spade))]; + return [1,(club+spade)/4]; } } } @@ -6458,11 +6490,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{source:'damageSource'}, forced:true, filter:function(event,player){ - return get.distance(player,event.player)<=1&&player.isDamaged(); + return event.kuangguCheck&&player.isDamaged(); }, content:function(){ player.recover(trigger.num); - } + }, + group:'kuanggu_check', + subSkill:{ + check:{ + charlotte:true, + trigger:{source:'damage'}, + filter:function(event,player){ + return get.distance(player,event.player)<=1; + }, + firstDo:true, + silent:true, + content:function(){ + trigger.kuangguCheck=true; + }, + }, + }, }, tianxiang:{ audio:2, @@ -6859,6 +6906,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, xinhongyan:{ audio:2, + audioname:['sb_xiaoqiao'], mod:{ suit:function(card,suit){ if(suit=='spade') return 'heart'; @@ -7206,17 +7254,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ useShan:true, effect:{ target:function(card,player,target,current){ - if(get.tag(card,'respondShan')){ - var hastarget=game.hasPlayer(function(current){ - return get.attitude(target,current)<0; - }); - if(target.countCards('h','shan')&&target.countCards('e',{suit:'spade'})){ - return [0,hastarget?target.countCards('he')/2:0]; - } - if(target.countCards('h','shan')){ - return [1,hastarget?target.countCards('he')/2:0]; - } - return [1,target.countCards('h')/4]; + if(get.tag(card,'respondShan')&&!player.hasSkillTag('directHit_ai',true,{ + target: target, + card: card + },true)&&game.hasPlayer(function(current){ + return get.attitude(target,current)<0&&get.damageEffect(current,target,target,'thunder')>0; + })){ + if(!target.mayHaveShan(player)) return 1-0.1*Math.min(5,target.countCards('hs')); + if(!target.hasSkillTag('rejudge')) return [1,1]; + let pos=player.hasSkillTag('viewHandcard',null,target,true)?'hes':'e'; + if(target.hasCard(function(cardx){ + return get.suit(cardx)==='spade'; + },pos)) return [1,4]; + if(pos==='e') return [1,Math.min(4,1+0.75*Math.max(1,target.countCards('hs')))]; + return [1,1]; } } } @@ -7703,15 +7754,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return '转换技,出牌阶段限一次,阴:你可以摸一张牌,然后弃置两张手牌。阳:你可以摸两张牌,然后弃置一张手牌。若如此做,直到本回合结束,你使用与弃置牌花色相同的牌无距离和次数限制。'; }, nzry_shenshi:function(player){ - if(player.storage.nzry_shenshi==true) return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成一点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; - return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成一点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; + if(player.storage.nzry_shenshi==true) return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; + return '转换技,阴:出牌阶段限一次,你可以将一张牌交给一名手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。'; }, }, characterReplace:{ caoren:['caoren','old_caoren','sb_caoren','new_caoren'], sp_caoren:['sp_caoren','jsp_caoren'], xiahouyuan:['re_xiahouyuan','ol_xiahouyuan','xiahouyuan'], - huangzhong:['re_huangzhong','ol_huangzhong','sb_huangzhong','huangzhong'], + huangzhong:['re_huangzhong','ol_huangzhong','sb_huangzhong','huangzhong','jsrg_huangzhong'], weiyan:['re_weiyan','ol_weiyan','weiyan'], zhoutai:['zhoutai','xin_zhoutai','old_zhoutai'], xiaoqiao:['xiaoqiao','ol_xiaoqiao','re_xiaoqiao','old_xiaoqiao'], @@ -7721,7 +7772,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xunyu:['xunyu','ol_xunyu','re_xunyu'], sp_zhugeliang:['sp_zhugeliang','ol_sp_zhugeliang','re_sp_zhugeliang'], pangtong:['pangtong','ol_pangtong','re_pangtong','sb_pangtong'], - re_jsp_pangtong:['re_jsp_pangtong','sp_pangtong'], + re_jsp_pangtong:['re_jsp_pangtong','jsrg_pangtong','sp_pangtong'], taishici:['taishici','re_taishici'], re_yuanshao:['re_yuanshao','ol_yuanshao','xin_yuanshao','sb_yuanshao'], pangde:['re_pangde','ol_pangde','pangde'], @@ -7777,7 +7828,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "nzry_jianxiang_info":"当你成为其他角色使用牌的目标时,你可令手牌数最少的一名角色摸一张牌。", "nzry_shenshi1":"审时", "nzry_shenshi":"审时", - "nzry_shenshi_info":"转换技,阴:出牌阶段限一次,你可以将一张牌交给一名除你外手牌数最多的角色,然后对其造成一点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。", + "nzry_shenshi_info":"转换技,阴:出牌阶段限一次,你可以将一张牌交给一名除你外手牌数最多的角色,然后对其造成1点伤害,若该角色因此死亡,则你可以令一名角色将手牌摸至四张。阳:其他角色对你造成伤害后,你可以观看该角色的手牌,然后交给其一张牌,当前角色回合结束时,若此牌仍在该角色的区域内,你将手牌摸至四张。", "nzry_mingren":"明任", "nzry_mingren_info":"游戏开始时,你摸两张牌,然后将一张手牌置于你的武将牌上,称为“任”。结束阶段,你可以用一张手牌替换“任”。", "nzry_zhenliang":"贞良", @@ -7788,7 +7839,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "nzry_cunmu":"寸目", "nzry_cunmu_info":"锁定技,当你摸牌时,改为从牌堆底摸牌。", "nzry_kuizhu":"溃诛", - "nzry_kuizhu_info":"弃牌阶段结束后,你可以选择一项:①令至多X名角色各摸一张牌。②对任意名体力值之和为X的角色造成一点伤害。(X为你此阶段弃置的牌数)", + "nzry_kuizhu_info":"弃牌阶段结束后,你可以选择一项:①令至多X名角色各摸一张牌。②对任意名体力值之和为X的角色造成1点伤害。(X为你此阶段弃置的牌数)", "nzry_zhizheng":"掣政", rechezheng:'掣政', "nzry_zhizheng_info":"锁定技,你的出牌阶段内,当你对攻击范围内不包含你的其他角色造成伤害时,防止此伤害。出牌阶段结束时,若你本阶段内使用的牌数小于这些角色的数量,则你弃置其中一名角色的一张牌。", @@ -7799,35 +7850,35 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "nzry_huaiju_info":"锁定技,游戏开始时,你获得3个“橘”标记。(有“橘”的角色受到伤害时,防止此伤害,然后移去一个“橘”;有“橘”的角色摸牌阶段额外摸一张牌)", "tachibana_effect":"怀橘", "nzry_yili":"遗礼", - "nzry_yili_info":"出牌阶段开始时,你可以失去一点体力或移去一个“橘”,然后令一名其他角色获得一个“橘”", + "nzry_yili_info":"出牌阶段开始时,你可以失去1点体力或移去一个“橘”,然后令一名其他角色获得一个“橘”。", "nzry_zhenglun":"整论", - "nzry_zhenglun_info":"若你没有“橘”,你可以跳过摸牌阶段然后获得一个“橘”", + "nzry_zhenglun_info":"若你没有“橘”,你可以跳过摸牌阶段然后获得一个“橘”。", "nzry_feijun":"飞军", "nzry_feijun_info":"出牌阶段限一次。你可以弃置一张牌,然后选择一项:⒈令一名手牌数大于你的角色交给你一张牌;⒉令一名装备区里牌数大于你的角色弃置一张装备牌。", "nzry_binglve":"兵略", - "nzry_binglve_info":"锁定技,当你发动“飞军”时,若目标与你之前指定的目标均不相同,则你摸两张牌", + "nzry_binglve_info":"锁定技,当你发动“飞军”时,若目标与你之前指定的目标均不相同,则你摸两张牌。", "nzry_juzhan1":"拒战", "nzry_juzhan":"拒战", "nzry_juzhan_info":"转换技,阴:当你成为其他角色【杀】的目标后,你可以与其各摸一张牌,然后其本回合内不能再对你使用牌。阳:当你使用【杀】指定一名角色为目标后,你可以获得其一张牌,然后你本回合内不能再对其使用牌。", liangyin:"良姻", - "liangyin_info":"当有牌移至游戏外时,你可以令手牌数大于你的一名角色摸一张牌;当有牌从游戏外加入任意角色的手牌时,你可以令手牌数小于你的一名角色弃置一张牌", + "liangyin_info":"当有牌移至游戏外时,你可以令手牌数大于你的一名角色摸一张牌;当有牌从游戏外加入任意角色的手牌时,你可以令手牌数小于你的一名角色弃置一张牌。", kongsheng:"箜声", - "kongsheng_info":"准备阶段,你可以将任意张牌置于你的武将牌上;结束阶段,你使用武将牌上的装备牌,并获得武将牌上的其他牌", + "kongsheng_info":"准备阶段,你可以将任意张牌置于你的武将牌上;结束阶段,你使用武将牌上的装备牌,并获得武将牌上的其他牌。", "kongsheng2":"箜声", "kongsheng2_info":"", "xinfu_zuilun":"罪论", - "xinfu_zuilun_info":"结束阶段,你可以观看牌堆顶三张牌,你每满足以下一项便保留一张,然后以任意顺序放回其余的牌:1.你于此回合内造成过伤害;2.你于此回合内未弃置过牌;3.手牌数为全场最少。若均不满足,你与一名其他角色失去一点体力。", + "xinfu_zuilun_info":"结束阶段,你可以观看牌堆顶三张牌,你每满足以下一项便保留一张,然后以任意顺序放回其余的牌:1.你于此回合内造成过伤害;2.你于此回合内未弃置过牌;3.手牌数为全场最少。若均不满足,你与一名其他角色失去1点体力。", "xinfu_fuyin":"父荫", "xinfu_fuyin_info":"锁定技,你每回合第一次成为【杀】或【决斗】的目标后,若你的手牌数小于等于该角色,此牌对你无效。", drlt_wanglie:"往烈", - drlt_wanglie_info:"①出牌阶段,你使用的第一张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能再使用牌", + drlt_wanglie_info:"①出牌阶段,你使用的第一张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能再使用牌。", "drlt_xiongluan":"雄乱", - "drlt_xiongluan_info":"限定技,出牌阶段,你可以废除你的判定区和装备区,然后指定一名其他角色。直到回合结束,你对其使用牌无距离和次数限制,其不能使用和打出手牌", + "drlt_xiongluan_info":"限定技,出牌阶段,你可以废除你的判定区和装备区,然后指定一名其他角色。直到回合结束,你对其使用牌无距离和次数限制,其不能使用和打出手牌。", "drlt_congjian":"从谏", - "drlt_congjian_info":"当你成为锦囊牌的目标时,若此牌的目标数大于1,则你可以交给其中一名其他目标角色一张牌,然后摸一张牌,若你给出的是装备牌,改为摸两张牌", + "drlt_congjian_info":"当你成为锦囊牌的目标时,若此牌的目标数大于1,则你可以交给其中一名其他目标角色一张牌,然后摸一张牌,若你给出的是装备牌,改为摸两张牌。", "drlt_yongsi":"庸肆", - "drlt_yongsi_info":"锁定技,摸牌阶段,你改为摸X张牌(X为存活势力数);出牌阶段结束时,若你本回合:1.没有造成伤害,将手牌摸至当前体力值;2.造成的伤害超过1点,本回合手牌上限改为已损失体力值", + "drlt_yongsi_info":"锁定技,摸牌阶段,你改为摸X张牌(X为存活势力数);出牌阶段结束时,若你本回合:1.没有造成伤害,将手牌摸至当前体力值;2.造成的伤害超过1点,本回合手牌上限改为已损失体力值。", "drlt_weidi":"伪帝", weidi_tag:'伪帝', "drlt_weidi_info":"主公技,弃牌阶段开始时,若你的手牌数大于手牌上限,则你可以将至多X张手牌分别交给等量的其他群雄角色(X为你的手牌数与手牌上限之差)。", @@ -7836,7 +7887,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "drlt_jueyan":"决堰", "drlt_jueyan_info":"出牌阶段限一次,你可以废除一种装备栏,然后执行对应一项:武器栏,你本回合内使用【杀】的次数上限+3;防具栏,你摸三张牌,且本回合手牌上限+3;坐骑栏,你本回合内使用牌无距离限制;宝物栏,你获得〖集智〗直到回合结束。", "drlt_poshi":"破势", - "drlt_poshi_info":"觉醒技,准备阶段开始时,若你的装备栏均已被废除或体力值为1,则你减一点体力上限,将手牌摸至体力上限,失去〖决堰〗并获得〖怀柔〗。", + "drlt_poshi_info":"觉醒技,准备阶段开始时,若你的装备栏均已被废除或体力值为1,则你减1点体力上限,将手牌摸至体力上限,失去〖决堰〗并获得〖怀柔〗。", "drlt_huairou":"怀柔", "drlt_huairou_info":"出牌阶段,你可以重铸装备牌。", "drlt_zhenggu":"镇骨", @@ -7858,9 +7909,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qingce_info:'出牌阶段,你可以获得一张「荣」并弃置一张手牌,然后弃置场上的一张牌。', jianchu:'鞬出', - jianchu_info:'当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌为装备牌,此【杀】不可被【闪】响应,若不为装备牌,该角色获得此【杀】', + jianchu_info:'当你使用【杀】指定一名角色为目标后,你可以弃置其一张牌,若以此法弃置的牌为装备牌,此【杀】不可被【闪】响应,若不为装备牌,该角色获得此【杀】。', redimeng:'缔盟', - redimeng_info:'出牌阶段限一次,你可以弃置X张牌选择两名其他角色(X为这两名角色的手牌差),你混合他们的手牌,然后令其中一名角色获得其中的一张牌,并令另一名角色获得其中的一张牌,然后重复此流程,直到这些牌均被获得为止', + redimeng_info:'出牌阶段限一次,你可以弃置X张牌选择两名其他角色(X为这两名角色的手牌差),你混合他们的手牌,然后令其中一名角色获得其中的一张牌,并令另一名角色获得其中的一张牌,然后重复此流程,直到这些牌均被获得为止。', reluanji:'乱击', reluanji_info:'你可以将两张与你本回合以此法转化的花色均不相同的手牌当【万箭齐发】使用,然后当一名角色因响应此牌而打出【闪】时,该角色摸一张牌。若你以此法使用的【万箭齐发】未造成伤害,则你可以在此牌结算完成后摸X张牌。(X为此牌的目标数)', xintianxiang:'天香', @@ -7868,13 +7919,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xintianxiang3:'天香', xintianxiang4:'天香', xintianxiang_bg:'香', - xintianxiang_info:'当你受到伤害时,你可以弃置一张♥牌,将此伤害转移给一名其他角色,然后你选择一项:令该角色摸X张牌(X为其已损失的体力值);或防止其造成与受到的所有伤害,且此技能失效直到你的下回合开始', + xintianxiang_info:'当你受到伤害时,你可以弃置一张♥牌,将此伤害转移给一名其他角色,然后你选择一项:令该角色摸X张牌(X为其已损失的体力值);或防止其造成与受到的所有伤害,且此技能失效直到你的下回合开始。', xinshensu:'神速', - xinshensu_info:'你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】', + xinshensu_info:'你可以选择一至三项:1. 跳过判定阶段和摸牌阶段;2. 跳过出牌阶段并弃置一张装备牌;3. 跳过弃牌阶段并将你的武将牌翻面。你每选择一项,视为你对一名其他角色使用一张没有距离限制的【杀】。', yinghun:'英魂', - yinghun_info:'准备阶段开始时,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)', + yinghun_info:'准备阶段开始时,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。', gzyinghun:'英魂', - gzyinghun_info:'准备阶段开始时,若你已受伤,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)', + gzyinghun_info:'准备阶段开始时,若你已受伤,你可令一名其他角色执行一项:摸X张牌,然后弃置一张牌;或摸一张牌,然后弃置X张牌(X为你已损失的体力值)。', tiaoxin:'挑衅', zhiji:'志继', @@ -7911,27 +7962,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinjiewei:'解围', retianxiang:'天香', retianxiang_info:'当你受到伤害时,你可以弃置一张红桃手牌,防止此次伤害并选择一名其他角色,然后你选择一项:1.令其受到伤害来源对其造成的1点伤害,然后摸X张牌(X为其已损失体力值且至多为5);2.令其失去1点体力,然后获得你弃置的牌。', - xinjiewei_info:'你可以将装备区里的牌当【无懈可击】使用;当你的武将牌从背面翻至正面时,你可以弃置一张牌,然后移动场上的一张牌', - xinjushou_info:'结束阶段,你可以翻面并摸四张牌,然后弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之', - jixi_info:'出牌阶段,你可以将任意一张“田”当作【顺手牵羊】使用', - xinqiangxi_info:'出牌阶段各限一次,你可以选择一项:1. 失去一点体力并对你攻击范围内的一名其他角色造成一点伤害;2. 弃置一张装备牌并对你攻击范围内的一名其他角色造成一点伤害 ', - qimou_info:'限定技,出牌阶段,你可以失去任意点体力,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)', + xinjiewei_info:'你可以将装备区里的牌当【无懈可击】使用;当你的武将牌从背面翻至正面时,你可以弃置一张牌,然后移动场上的一张牌。', + xinjushou_info:'结束阶段,你可以翻面并摸四张牌,然后弃置一张手牌,若以此法弃置的是装备牌,则你改为使用之。', + jixi_info:'出牌阶段,你可以将任意一张“田”当作【顺手牵羊】使用。', + xinqiangxi_info:'出牌阶段各限一次,你可以选择一项:1. 失去1点体力并对你攻击范围内的一名其他角色造成1点伤害;2. 弃置一张装备牌并对你攻击范围内的一名其他角色造成1点伤害。', + qimou_info:'限定技,出牌阶段,你可以失去任意点体力,然后直到回合结束,你计算与其他角色的距离时-X,且你可以多使用X张【杀】(X为你失去的体力值)。', tiaoxin_info:'出牌阶段限一次,你可以指定一名攻击范围内包含你的角色,该角色需对你使用一张【杀】,否则你弃置其一张牌。', zhiji_info:'觉醒技,准备阶段,若你没有手牌,你须回复1点体力或摸两张牌,然后减1点体力上限,并获得技能〖观星〗。', xiangle_info:'锁定技,当其他角色使用【杀】指定你为目标时,其需弃置一张基本牌,否则此【杀】对你无效。', fangquan_info:'你可跳过你的出牌阶段,若如此做,回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。', ruoyu_info:'主公技,觉醒技,准备阶段,若你的体力是全场最少的(或之一),你须增加1点体力上限并回复1点体力,然后获得技能〖激将〗。', qiaobian_info:'你可以弃置一张手牌并跳过自己的一个阶段(准备阶段和结束阶段除外);若你以此法跳过了摸牌阶段,则你可以获得至多两名其他角色的各一张手牌;若你以此法跳过了出牌阶段,则你可以移动场上的一张牌。', - tuntian_info:'①当你于回合外失去牌后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)', - zaoxian_info:'觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗', + tuntian_info:'①当你于回合外失去牌后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。', + zaoxian_info:'觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。', jiang_info:'每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。', hunzi_info:'觉醒技,准备阶段,若你的体力值为1,你减1点体力上限,并获得技能〖英姿〗和〖英魂〗。', zhiba_info:'主公技,其他吴势力角色的出牌阶段限一次,其可与你进行一次拼点。若该角色没赢,你可以获得双方拼点的牌。若你已发动过〖魂姿〗,你可以拒绝此拼点。', zhijian_info:'出牌阶段,你可以将手牌中的一张装备牌置于一名其他角色装备区里(不得替换原装备),然后摸一张牌。', guzheng_info:'其他角色的弃牌阶段结束时,你可以令其获得本阶段内进入弃牌堆的牌中的一张,然后你获得其余的牌。', - beige_info:'当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复1点体力;♦︎该角色摸两张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面', + beige_info:'当有角色受到【杀】造成的伤害后,你可以弃一张牌,并令其进行一次判定,若判定结果为:♥该角色回复1点体力;♦︎该角色摸两张牌;♣伤害来源弃两张牌;♠伤害来源将其武将牌翻面。', duanchang_info:'锁定技,杀死你的角色失去当前的所有技能。', - // fushen_info:'回合开始前,你可以选择与任意一名角色交换控制权,该角色可选择在下一个回合开始前与你换回', + // fushen_info:'回合开始前,你可以选择与任意一名角色交换控制权,该角色可选择在下一个回合开始前与你换回。', huashen_info:'①游戏开始时,你随机将武将牌堆中的两张牌扣置于武将牌上(均称为“化身牌”),选择并亮出一张“化身牌”并声明该武将牌上的一个技能,你拥有该技能且同时将性别和势力属性变成与该武将相同直到该化身被替换(你不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能)。②回合开始时或回合结束时,你重新可以选择一张“化身牌”并声明该武将牌上的一个技能。', xinsheng_info:'当你受到1点伤害后,你可以获得一张“化身牌”。', jiangwei:'姜维', @@ -8013,14 +8064,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huoji:'火计', bazhen:'八阵', kanpo:'看破', - xinlianhuan:'连环', - ollianhuan:'连环', - lianhuan:'连环', - lianhuan1:'连环', - lianhuan3:'连环', - lianhuan2:'连铸', - lianhuan5:'连铸', - ollianhuan3:'连环', niepan:'涅槃', oldniepan:'涅槃', quhu:'驱虎', @@ -8033,18 +8076,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ luanji:'乱击', xueyi:'血裔', mengjin:'猛进', - xinlianhuan_info:' 你可以将一张♣手牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标的上限数+1。', - ollianhuan_info:' 你可以将一张♣牌当【铁索连环】使用或重铸。你使用【铁索连环】选择目标的上限数+1。', - huoji_info:'出牌阶段,你可以将你的任意一张红色手牌当作【火攻】使用。', + huoji_info:'你可以将一张红色手牌当作【火攻】使用。', bazhen_info:'锁定技,若你的防具栏内没有牌且没有被废除,则你视为装备着【八卦阵】。', kanpo_info:'你可以将你的任意一张黑色手牌当做【无懈可击】使用。', - lianhuan_info:'出牌阶段,你可以将一张♣手牌当做【铁索连环】使用或重铸。', niepan_info:'限定技,出牌阶段或当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。', oldniepan_info:'限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。', - quhu_info:'出牌阶段限一次,你可以与一名体力值大于你的角色拼点,若你赢,则该角色对其攻击范围内另一名由你指定的角色造成1点伤害。若你没赢,该角色对你造成一点伤害。', + quhu_info:'出牌阶段限一次,你可以与一名体力值大于你的角色拼点,若你赢,则该角色对其攻击范围内另一名由你指定的角色造成1点伤害。若你没赢,该角色对你造成1点伤害。', jieming_info:'当你受到1点伤害后,你可令一名角色将手牌摸至X张(X为其体力上限且至多为5)。', - qiangxi_info:'出牌阶段限一次,你可以失去一点体力或弃置一张武器牌,然后对你攻击范围内的一名其他角色造成一点伤害。', - qiangxix_info:'出牌阶段限两次,你可以失去一点体力或弃置一张武器牌,然后一名本阶段内未成为过〖强袭〗的目标的其他角色造成一点伤害。', + qiangxi_info:'出牌阶段限一次,你可以失去1点体力或弃置一张武器牌,然后对你攻击范围内的一名其他角色造成1点伤害。', + qiangxix_info:'出牌阶段限两次,你可以失去1点体力或弃置一张武器牌,然后一名本阶段内未成为过〖强袭〗的目标的其他角色造成1点伤害。', tianyi_info:'出牌阶段限一次,你可以和一名其他角色拼点。若你赢,你获得以下技能效果直到回合结束:你使用【杀】没有距离限制;可额外使用一张【杀】;使用【杀】时可额外指定一个目标。若你没赢,你不能使用【杀】直到回合结束。', shuangxiong_info:'摸牌阶段,你可以改为进行一次判定:你获得此判定牌,且你可以于此回合内将任意一张与此判定牌不同颜色的手牌当做【决斗】使用。', luanji_info:'出牌阶段,你可以将任意两张相同花色的手牌当做【万箭齐发】使用。', @@ -8106,30 +8146,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinkuanggu:'狂骨', gzbuqu:'不屈', gzbuqu_info:'①当你扣减1点体力时,若你的体力值小于1,你可以将牌堆顶的一张牌置于你的武将牌上,称为“创”。②当你回复1点体力时,你移去一张“创”。③若你有“创”且点数均不相同,则你不结算濒死流程。', - xinkuanggu_info:'当你对距离1以内的一名角色造成1点伤害后,你可以回复1点体力或摸一张牌。', + xinkuanggu_info:'当你造成1点伤害后,若受伤角色受到此伤害时你与其的距离不大于1,则你可以回复1点体力或摸一张牌。', xinliegong_info:'①你使用【杀】可以选择你距离不大于此【杀】点数的角色为目标。②当你使用【杀】指定一个目标后,你可以根据下列条件执行相应的效果:1.其手牌数小于等于你的手牌数,此【杀】不可被响应,2.其体力值大于等于你的体力值,此【杀】伤害+1。', - jiewei_info:'当你的武将牌翻面后,你可以摸一张牌。然后你可以使用一张锦囊牌或装备牌,并可以在此牌结算后弃置场上一张同类型的牌', - releiji_info:'当你使用或打出一张【闪】时,你可令一名其他角色进行一次判定:若结果为梅花,其受到一点雷电伤害,然后你回复一点体力;若结果为黑桃,其受到两点雷电伤害。', + jiewei_info:'当你的武将牌翻面后,你可以摸一张牌。然后你可以使用一张锦囊牌或装备牌,并可以在此牌结算后弃置场上一张同类型的牌。', + releiji_info:'当你使用或打出一张【闪】时,你可令一名其他角色进行一次判定:若结果为梅花,其受到1点雷电伤害,然后你回复1点体力;若结果为黑桃,其受到2点雷电伤害。', tiangong_info:'锁定技,你防止即将受到的雷电伤害。每当你造成雷电伤害时,你摸一张牌。', - shensu_info:'你可以跳过判定阶段和摸牌阶段,或跳过出牌阶段并弃置一张装备牌。若如此做,则你可以视为对任意一名角色使用一张无距离限制的【杀】', - jushou_info:'结束阶段,你可以摸3张牌,并将武将牌翻面。', - moon_jushou_info:'结束阶段,你可以摸一张牌,并将武将牌翻面。', + shensu_info:'你可以跳过判定阶段和摸牌阶段,或跳过出牌阶段并弃置一张装备牌。若如此做,则你可以视为对任意一名角色使用一张无距离限制的【杀】。', + jushou_info:'结束阶段,你可以摸三张牌并翻面。', + moon_jushou_info:'结束阶段,你可以摸一张牌并翻面。', liegong_info:'当你使用【杀】时,若目标的手牌数大于等于你的体力值,或小于等于你的攻击范围,你可令此【杀】不能被响应。', - kuanggu_info:'锁定技,当你造成伤害后,若受伤角色与你的距离不大于1,你回复X点体力(X为伤害值)。', + kuanggu_info:'锁定技,当你造成伤害后,若受伤角色受到此伤害时你与其的距离不大于1,你回复X点体力(X为伤害值)。', tianxiang_info:'当你即将受到伤害时,你可以弃置一张♥手牌,将伤害转移给一名其他角色,然后该角色摸X张牌(X为其已损失的体力值)。', hongyan_info:'锁定技,你区域内的黑桃牌和黑桃判定牌均视为红桃。', buqu_info:'锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。只要你的武将牌上有“创”,你的手牌上限便与“创”的数量相等。', buqu_info_guozhan:'锁定技,当你处于濒死状态时,你亮出牌堆顶的一张牌并置于你的武将牌上,称之为“创”。若此牌的点数与你武将牌上已有的“创”点数均不同,则你回复至1体力。若点数相同,则将此牌置入弃牌堆。', - leiji_info:'当你使用或打出一张【闪】时,你可令任意一名角色进行一次判定。若结果为黑桃,其受到两点雷电伤害', + leiji_info:'当你使用或打出一张【闪】时,你可令任意一名角色进行一次判定。若结果为黑桃,其受到2点雷电伤害。', guidao_info:'一名角色的判定牌生效前,你可以打出一张黑色牌替换之。', huangtian_info:'主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张【闪】或【闪电】。', - guhuo_info:'每名角色的回合限一次,你可以扣置一张手牌当一张基本牌或普通锦囊牌使用或打出。其他角色依次选择是否质疑。一旦有其他角色质疑则翻开此牌:若为假则此牌作废,若为真,则质疑角色获得技能“缠怨”(锁定技,你不能质疑于吉,只要你的体力值为1,你失去你的武将技能)', + guhuo_info:'每名角色的回合限一次,你可以扣置一张手牌当一张基本牌或普通锦囊牌使用或打出。其他角色依次选择是否质疑。一旦有其他角色质疑则翻开此牌:若为假则此牌作废,若为真,则质疑角色获得技能“缠怨”(锁定技,你不能质疑于吉,只要你的体力值为1,你失去你的武将技能)。', fenji_info:'当一名角色的手牌不因赠予或交给而被另一名角色得到后,或一名角色的手牌被另一名角色弃置后,你可以失去1点体力,令其摸两张牌。', new_fenji:"奋激", new_fenji_info:"一名角色的结束阶段开始时,若其没有手牌,你可以令其摸两张牌,然后你失去1点体力。", gzduanliang:'断粮', - gzduanliang_info:'你可以将一张黑色基本牌或黑色装备牌当【兵粮寸断】使用;你可以对距离为2的角色使用【兵粮寸断】', + gzduanliang_info:'你可以将一张黑色基本牌或黑色装备牌当【兵粮寸断】使用;你可以对距离为2的角色使用【兵粮寸断】。', xinfu_guhuo:"蛊惑", xinfu_guhuo_info:"每回合限一次。你可以扣置一张手牌当做一张基本牌或普通锦囊牌使用或打出,其他角色依次选择是否质疑。当有角色质疑时,你终止质疑流程并展示此牌:若为假,此牌作废;若为真,该角色获得〖缠怨〗。", guhuo_guess:"蛊惑", @@ -8145,13 +8185,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinhongyan:'红颜', xinhongyan_info:'锁定技,你的♠牌和♠判定牌的花色视为♥。一名角色的判定结果生效前,若判定结果为♥,则你将其改为一种花色。', olliangyin:'良姻', - olliangyin_info:'当有牌发生移动后,若此移动事件是本回合内你拥有〖良姻〗期间的首个有牌移出游戏/移入游戏的事件,则你可以选择一名其他角色。你与其各摸一张牌/弃置一张牌,然后你可以选择你或其中的一名手牌数为X的角色,该角色回复1点体力(X为你的“箜”数)', + olliangyin_info:'当有牌发生移动后,若此移动事件是本回合内你拥有〖良姻〗期间的首个有牌移出游戏/移入游戏的事件,则你可以选择一名其他角色。你与其各摸一张牌/弃置一张牌,然后你可以选择你或其中的一名手牌数为X的角色,该角色回复1点体力(X为你的“箜”数)。', olkongsheng:'箜声', olkongsheng_info:'①准备阶段开始时,你可以将任意张牌置于你的武将牌上,称为“箜”。②结束阶段开始时,若你有不为装备牌的“箜”,则你获得“箜”中的非装备牌,然后令一名角色依次使用“箜”中的装备牌并失去1点体力。', dcwanglie:"往烈", dcwanglie_info:"①出牌阶段,你对其他角色使用的前两张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能使用牌指定其他角色为目标。", nzry_shicai:"恃才", nzry_shicai_info:"当你使用非装备牌结算结束后,或成为自己使用装备牌的目标后,若此牌与你本回合使用的牌类型均不同,则你可以将此牌置于牌堆顶,然后摸一张牌。", + lianhuan:'连环', + lianhuan_info:'你可以将♣手牌当作【铁索连环】使用或重铸。', shenhua_feng:'神话再临·风', shenhua_huo:'神话再临·火', diff --git a/character/shiji.js b/character/shiji.js index fabf6e632..5c17188f5 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -1464,8 +1464,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCard1'}, forced:true, filter:function(event,player){ - return event.card.name=='sha'&&event.cards.length==1&&player.getHistory('useCard',function(evt){ - return evt.card.name=='sha'&&evt.cards.length==1; + if(event.card.name!='sha'||!event.cards||event.cards.length!=1) return false; + var evt=event.getParent('phaseUse'); + return evt&&evt.player==player&&player.getHistory('useCard',function(evt2){ + return evt2.card.name=='sha'&&evt.cards&&evt.cards.length==1&&evt2.getParent('phaseUse')==evt; }).indexOf(event)==0; }, content:function(){ @@ -3241,7 +3243,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, }, - group:['yizhu_use','yizhu_discard'], + group:'yizhu_use', subSkill:{ use:{ audio:'yizhu', @@ -3258,7 +3260,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return get.effect(event.targets[0],event.card,event.player,player)<0; }, prompt2:function(event,player){ - return '令'+get.translation(event.card)+'无效并可重新使用'; + return '令'+get.translation(event.card)+'无效'; }, content:function(){ trigger.cancel(); @@ -3269,26 +3271,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); player.unmarkAuto('yizhu',list); game.delayx(); - player.chooseUseTarget(trigger.card,trigger.cards,false,'nothrow'); - }, - }, - discard:{ - trigger:{ - global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter'], - }, - forced:true, - locked:false, - filter:function(event,player){ - return player.storage.yizhu&&player.storage.yizhu.length&&event.getd().filter(function(i){ - return player.storage.yizhu.contains(i); - }).length>0; - }, - content:function(){ - var list=trigger.getd().filter(function(i){ - return player.storage.yizhu.contains(i); - }); - player.unmarkAuto('yizhu',list); - player.draw(); }, }, }, @@ -3349,16 +3331,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ effect:{ target:function(card,player,target){ if(_status.luanchou_judging) return; - _status.luanchou_judging=true; if(get.tag(card,'damage')&&target.hasMark('luanchou')){ var other=game.findPlayer(function(current){ return current!=target&¤t.hasMark('luanchou')&¤t.hp>target.hp&&(!current.storage.counttrigger||!current.storage.counttrigger.gonghuan); }); - if(!other){ - delete _status.luanchou_judging; - return; - }; - var eff=[0,0,0,get.damageEffect(other,player,target,get.nature(card))]; + if(!other) return; + _status.luanchou_judging=true; + var eff=[0,0,0,get.damageEffect(other,player,player,get.nature(card))/get.attitude(player,player)]; delete _status.luanchou_judging; return eff; } @@ -4715,7 +4694,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player,evt=_status.event.getParent(); if(get.value(evt.card,evt.player)*get.attitude(player,evt.player)>0) return 0; return Math.random()>(get.value(evt.card,evt.player)/6)?1:0; - return 1; + //return 1; }); 'step 2' if(result.index+event.addIndex==0){ @@ -4765,21 +4744,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ '将两张牌交给一名其他角色并获得其装备区内的一张牌', ]; var choiceList=ui.create.dialog('睦阵:请选择一项','hidden'); - for(var i=0;i{ + return [i,item]; + }),'textbutton']); return choiceList; }, filter:function(button,player){ @@ -6499,7 +6466,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ heji:'合击', heji_info:'当有角色使用的【决斗】或红色【杀】结算完成后,若此牌对应的目标数为1,则你可以对相同的目标使用一张【杀】或【决斗】(无距离和次数限制)。若你以此法使用的牌不为转化牌,则你从牌堆中随机获得一张红色牌。', liubing:'流兵', - liubing_info:'锁定技。①当你声明使用【杀】后,若此牌是你本回合使用的第一张有唯一对应实体牌的【杀】,则你将此牌的花色改为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。', + liubing_info:'锁定技。①你于出牌阶段使用的第一张有唯一对应实体牌的【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。', sp_mifuren:'手杀糜夫人', spcunsi:'存嗣', spcunsi2:'存嗣', @@ -6509,7 +6476,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qingyu:'清玉', qingyu_info:'使命技。①当你受到伤害时,你弃置两张牌,然后防止此伤害。②使命:准备阶段,若你的体力值等于体力上限且你没有手牌,则你获得〖悬存〗。③失败:当你进入濒死状态时,你减1点体力上限。', xuancun:'悬存', - xuancun_info:'其他角色的回合结束时,若你的手牌数小于体力值,则你可以令其摸X张牌(X为你的体力值与手牌数之差且至多为2)', + xuancun_info:'其他角色的回合结束时,若你的手牌数小于体力值,则你可以令其摸X张牌(X为你的体力值与手牌数之差且至多为2)。', xinlirang:'礼让', xinlirang_info:'①其他角色的摸牌阶段开始时,若你没有“谦”标记,则你可以获得一枚“谦”标记。若如此做,其额定摸牌数+2,且本回合的弃牌阶段开始时,你可以获得其弃置的至多两张牌。②摸牌阶段开始时,若你有“谦”标记,则你跳过此摸牌阶段并移除“谦”标记。', xinmingshi:'名仕', @@ -6610,7 +6577,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rehuaibi_info:'主公技,锁定技,你的手牌上限+X(X为你因〖邀虎〗选择势力的角色数量)。', qiaogong:'桥公', yizhu:'遗珠', - yizhu_info:'①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中(X为角色数,选择牌的牌名对其他角色可见)。②当有其他角色使用“遗珠”牌指定唯一目标时,你可清除对应的“遗珠”标记并取消此目标,然后你可使用此牌。③当有“遗珠”牌进入弃牌堆后,你摸一张牌并清除对应的“遗珠”标记。', + yizhu_info:'①结束阶段,你摸两张牌,然后将两张牌随机插入牌堆前2X张牌的位置中(X为角色数,选择牌的牌名对其他角色可见)。②其他角色使用“遗珠”牌指定唯一目标时,你可以取消此目标,然后你清除对应的“遗珠”标记。', luanchou:'鸾俦', luanchou_info:'出牌阶段限一次,你可令两名角色获得“姻”标记并清除原有标记。拥有“姻”标记的角色视为拥有技能〖共患〗。', gonghuan:'共患', @@ -6664,7 +6631,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spxiangzhen:'象阵', spxiangzhen_info:'锁定技。①【南蛮入侵】对你无效。②当有角色使用的【南蛮入侵】结算结束后,若有角色因此牌受到过伤害,则你和使用者各摸一张牌。', spfangzong:'芳踪', - spfangzong_info:'锁定技。①你不能于回合内使用具有伤害标签的牌指定攻击范围内的角色为目标。②攻击范围内包含你的角色不能使用具有伤害标签的牌指定你为目标。③结束阶段,你将手牌摸至X张(X为场上存活人数且至多为8)', + spfangzong_info:'锁定技。①你不能于回合内使用具有伤害标签的牌指定攻击范围内的角色为目标。②攻击范围内包含你的角色不能使用具有伤害标签的牌指定你为目标。③结束阶段,你将手牌摸至X张(X为场上存活人数且至多为8)。', spxizhan:'嬉战', spxizhan_info:'其他角色的回合开始时,你须选择一项:①失去1点体力。②弃置一张牌并令〖芳踪〗于本回合失效,然后若此牌的花色为:♠,其视为使用一张【酒】;♥,你视为使用一张【无中生有】;♣,你视为对其使用【铁索连环】;♦:你视为对其使用火【杀】(无距离限制)。', sp_cuiyan:'手杀崔琰', @@ -6700,7 +6667,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spshiji:'势击', spshiji_info:'当你对其他角色造成属性伤害时,若你的手牌数不为全场唯一最多,则你可以观看其手牌。你令其弃置其中的所有红色牌,然后摸等量的牌。', sptaoluan:'讨乱', - sptaoluan_info:'每回合限一次。一名角色的判定结果确定时,若结果的花色为♠,则你可以终止导致此判定发生的上级事件。然后选择一项:①获得判定牌对应的实体牌。②视为对判定角色使用一张火【杀】(无距离和次数限制)', + sptaoluan_info:'每回合限一次。一名角色的判定结果确定时,若结果的花色为♠,则你可以终止导致此判定发生的上级事件。然后选择一项:①获得判定牌对应的实体牌。②视为对判定角色使用一张火【杀】(无距离和次数限制)。', sp_zhujun:'手杀朱儁', yangjie:'佯解', yangjie_info:'出牌阶段限一次,你可以摸一张牌并和一名其他角色A拼点。当你以此法展示你的拼点牌时,你令此牌点数-X(X为你已损失的体力值)。若你没赢,则你可以令另一名其他角色B获得两张拼点牌,然后其视为对A使用一张火【杀】。', diff --git a/character/sp.js b/character/sp.js index 061f6739f..26b77f536 100755 --- a/character/sp.js +++ b/character/sp.js @@ -5,20 +5,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connect:true, characterSort:{ sp:{ - sp_tianji:["sunhao","liuxie","caoang","hetaihou","sunluyu",'ol_wangrong',"zuofen","ganfuren","ol_bianfuren","qinghegongzhu","tengfanglan","ruiji",'caoxiancaohua'], + sp_tianji:["sunhao","liuxie","caoang","hetaihou","sunluyu",'ol_wangrong',"zuofen","ol_bianfuren","qinghegongzhu","tengfanglan","ruiji",'caoxiancaohua'], sp_sibi:["yangxiu","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'], - sp_tianzhu:['niujin','hejin','hansui',"wutugu","yanbaihu","shamoke","panfeng","zhugedan",'huangzu','gaogan',"tadun","fanjiangzhangda","ahuinan","dongtuna",'ol_wenqin'], + sp_tianzhu:['zhangyan','niujin','hejin','hansui',"wutugu","yanbaihu","shamoke","zhugedan",'huangzu','gaogan',"tadun","fanjiangzhangda","ahuinan","dongtuna",'ol_wenqin'], sp_nvshi:["lingju","guanyinping","zhangxingcai","mayunlu","dongbai","zhaoxiang",'ol_zhangchangpu',"daxiaoqiao","jin_guohuai"], sp_shaowei:["simahui","zhangbao","zhanglu","zhugeguo","xujing","zhangling",'huangchengyan','zhangzhi','lushi'], sp_huben:['duanjiong','ol_mengda',"caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","zangba","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_liesi:['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_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_feiyi','ol_lvboshe'], sp_qifu:["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_others:["hanba","caiyang"], + sp_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_feiyi','lvboshe','ol_dingshangwan','ol_liwan'], }, }, characterFilter:{ @@ -28,14 +28,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_dongzhao:function(mode){ return mode=='identity'&&['normal','zhong'].contains(_status.mode); }, - ol_lvboshe:function(mode){ - return mode=='doudizhu'; - }, }, character:{ + ol_liwan:['female','wei',3,['ollianju','olsilv']], + 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_feiyi:['male','shu',3,['skill_feiyi_A','skill_feiyi_B'],['unseen']], - ol_lvboshe:['male','qun',4,['skill_lvboshe'],['unseen']], + lvboshe:['male','qun',4,['olfushi','oldongdao']], ol_luyusheng:['female','wu',3,['olcangxin','olrunwei']], caoxi:['male','wei',3,['olgangshu','oljianxuan']], ol_pengyang:['male','shu',3,['olqifan','oltuishi','nzry_cunmu']], @@ -106,7 +106,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_zhangchangpu:['female','wei',3,['yanjiao','olxingshen']], zhangling:['male','qun',3,['zlhuji','zlshoufu']], caiyang:['male','qun',1,['yinka','zhuixi'],['forbidai','unseen']], - panfeng:['male','qun',4,['kuangfu']], sunshao:['male','wu',3,['bizheng','yidian']], huangfusong:['male','qun',4,['fenyue']], @@ -116,7 +115,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jianggan:["male","wei",3,["weicheng","daoshu"]], caoying:["female","wei",4,["xinfu_lingren","xinfu_fujian"],[]], - simahui:["male","qun",3,["xinfu_jianjie","xinfu_chenghao","xinfu_yinshi"],[]], + simahui:["male","qun",3,["jianjie","xinfu_chenghao","xinfu_yinshi"],[]], baosanniang:["female","shu",4,["olwuniang","olxushen"],[]], yangxiu:['male','wei',3,['jilei','danlao']], @@ -182,7 +181,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kanze:['male','wu',3,['xiashu','kuanshi']], heqi:['male','wu',4,['olqizhou','olshanxi']], - ganfuren:['female','shu',3,['shushen','shenzhi']], //mifuren:['female','shu',3,['guixiu','cunsi']], yuejin:['male','wei',4,['xiaoguo']], sp_dongzhuo:['male','qun',5,['hengzheng']], @@ -203,6 +201,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ luzhi:['male','wei',3,['qingzhong','weijing']] }, characterIntro:{ + zhangyan:'张燕,本姓褚,生卒年不详,常山真定(今河北正定南)人,东汉末年黑山军首领。张燕剽捍,敏捷过人,军中称为“飞燕”。官渡之战时投降曹操,被任命为平北将军,封安国亭侯。死后其子张方袭爵。', lushi:'卢氏,五斗米教主张衡妻,张鲁母,擅长驻颜之术,常年令自己保持少女的容颜。常拜访刘焉,与其交好。', lvboshe:'吕伯奢,东汉成皋(今河南荥阳)人,曹操父亲曹嵩的故友。曹操与陈宫在逃离董卓避祸,返回乡里的途中借宿于吕伯奢家,未伤其人,有贼八人欲捉曹操,曹操杀之,明罗贯中在历史小说《三国演义》中将这段历史进行了丑化加工,也成为小说中曹操名言“宁教我负天下人,休教天下人负我”的出处。', caoxi:'曹羲(?-249年),字昭叔。曹真之子,曹爽之弟。为人有学识,明律法。司马懿曾组织朝议改革九品中正制废除九品而留中正,曹羲认为此举并无区别,最终都是决定于人的人治。曹爽掌权后,受封中领军,掌握禁兵,封安乡侯。曹爽及诸兄弟轻视司马懿,恣意妄为,经常外出狩猎,曹羲屡次劝谏,不被采纳。249年,司马懿发动高平陵政变,被夷三族。', @@ -704,6 +703,492 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //李婉 + ollianju:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + filter:function(event,player){ + var history=player.getHistory('useCard'); + if(!history.length) return false; + var evt=history[history.length-1]; + return evt.cards&&evt.cards.filterInD('d').length; + }, + direct:true, + content:function(){ + 'step 0' + var history=player.getHistory('useCard'); + var evt=history[history.length-1]; + event.evt=evt; + player.chooseTarget(get.prompt('ollianju'),'令一名角色获得'+get.translation(evt.cards.filterInD('d'))+'并记录'+get.translation(evt.card.name),lib.filter.notMe).set('ai',target=>{ + var player=_status.event.player,att=get.attitude(player,target); + var cards=_status.event.cards; + if(cards.filter(card=>get.name(card,false)=='du').length>=Math.ceil(cards.length/2)) att*=-1; + if(target.skipList.contains('phaseUse')||target.hasJudge('lebu')) return att/20; + return att; + }).set('cards',evt.cards.filterInD('d')); + 'step 1' + if(result.bool){ + var evt=event.evt; + var target=result.targets[0]; + player.logSkill('oliandui',target); + target.gain(evt.cards.filterInD('d'),'gain2'); + player.addSkill('ollianju_effect'); + player.storage.ollianju=evt.card.name; + player.markSkill('ollianju'); + if(!player.storage.ollianju_effect[target.playerid]) player.storage.ollianju_effect[target.playerid]=[]; + player.storage.ollianju_effect[target.playerid].add(evt.card.name); + } + }, + onunmark:true, + intro:{ + content:function(storage,player){ + var str='当前最后一次记录牌名:'+get.translation(storage); + if(player.storage.ollianju_effect){ + for(var i in player.storage.ollianju_effect){ + var target=game.findPlayer(target=>target.playerid==i); + if(!i) continue; + str+='
    '; + str+=get.translation(target)+'的下个结束阶段,其可令你获得其本回合使用的最后一张牌对应的所有位于弃牌堆的实体牌'; + str+=',然后若此牌名为'+get.translation(player.storage.ollianju_effect[i])+',则你失去1点体力'; + } + } + return str; + }, + }, + subSkill:{ + effect:{ + init:function(player){ + if(!player.storage.ollianju_effect) player.storage.ollianju_effect={}; + }, + charlotte:true, + trigger:{global:['phaseJieshuBegin','die']}, + filter:function(event,player){ + return player.storage.ollianju_effect[event.player.playerid]; + }, + direct:true, + content:function(){ + 'step 0' + if(trigger.name=='phaseJieshu') event.list=player.storage.ollianju_effect[trigger.player.playerid]; + delete player.storage.ollianju_effect[trigger.player.playerid]; + var history=trigger.player.getHistory('useCard'); + var evt=history[history.length-1]; + event.evt=evt; + if(trigger.name=='die'||!history.length||!evt.cards||!evt.cards.filterInD('d').length) event.finish(); + 'step 1' + var evt=event.evt; + trigger.player.chooseBool(get.prompt('ollianju',player),'令'+get.translation(player)+'获得'+get.translation(evt.cards.filterInD('d'))+(event.list.contains(evt.card.name)?',然后'+get.translation(player)+'失去1点体力':'')).set('choice',get.attitude(trigger.player,player)>0&&(!event.list.contains(evt.card.name)||player.getHp()>1)); + 'step 2' + if(result.bool){ + var evt=event.evt; + trigger.player.line(player); + player.gain(evt.cards.filterInD('d'),'gain2'); + if(event.list.contains(evt.card.name)) player.loseHp(); + } + }, + }, + }, + }, + olsilv:{ + audio:2, + trigger:{ + player:['loseAfter','gainAfter'], + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + filter:function(event,player){ + var name=player.storage.ollianju; + if(!name) return false; + if(event.getg) return event.getg(player).some(card=>card.name==name); + return event.getl(player).cards2.some(card=>card.name==name); + }, + forced:true, + usable:1, + content:function(){ + 'step 0' + if(!trigger.visible){ + var cards,name=player.storage.ollianju; + if(trigger.getg) cards=trigger.getg(player).filter(card=>card.name==name); + else cards=trigger.getl(player).cards2.filter(card=>card.name==name); + if(cards.length) player.showCards(cards,get.translation(player)+'发动了【思闾】'); + } + 'step 1' + player.draw(); + }, + ai:{combo:'ollianju'}, + }, + //丁尚涴 + olfudao:{ + audio:2, + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + filter:function(event,player){ + return event.name!='phase'||game.phaseNumber==0; + }, + forced:true, + locked:false, + content:function(){ + 'step 0' + var list=[],num=player.countCards('he'); + for(var i=-4;i<=4;i++){ + if(num+i<0||i==0) continue; + list.push(i); + } + player.chooseControl(list).set('prompt','讽言:请选择一个数字').set('prompt2','令此数值作为调整的手牌数值').set('ai',function(){ + var list=[],num=_status.event.player.countCards('he'); + for(var i=-4;i<=4;i++){ + if(num+i<0||i==0) continue; + if(i>0&&i!=4) continue; + list.push(i); + } + return list.randomGet(); + }); + 'step 1' + var num=result.control + player.popup(num); + if(num>0) player.draw(num); + else player.chooseToDiscard('he',true,-num); + 'step 2' + player.storage.olfudao=player.countCards('he'); + player.markSkill('olfudao'); + }, + intro:{ + content:'一名角色的回合结束时,若其手牌数等于#,你可以与其各摸一张牌。', + }, + group:'olfudao_qiaoshi', + subSkill:{ + qiaoshi:{ + audio:'olfudao', + trigger:{global:'phaseEnd'}, + filter:function(event,player){ + if(typeof player.storage.olfudao!='number') return false; + return event.player.countCards('h')==player.storage.olfudao&&event.player.isIn(); + }, + check:function(event,player){ + return get.attitude(player,event.player)>=0; + }, + logTarget:'player', + prompt2:function(event,player){ + return '与'+get.translation(event.player)+'各摸一张牌'; + }, + content:function(){ + game.asyncDraw([trigger.player,player]); + }, + }, + }, + }, + olfengyan:{ + audio:2, + trigger:{player:['damageEnd','useCard','respond']}, + filter:function(event,player){ + if(event.name=='damage') return event.source&&event.source.isIn()&&event.source!=player; + return Array.isArray(event.respondTo)&&event.respondTo[0]!=player; + }, + logTarget:function(event,player){ + if(event.name=='damage') return event.source; + return event.respondTo[0]; + }, + forced:true, + content:function(){ + 'step 0' + var target=lib.skill.olfengyan.logTarget(trigger,player); + if(trigger.name=='damage'){ + event.target=target; + player.draw(); + } + else{ + target.draw(); + target.chooseToDiscard(2,'he',true); + event.finish(); + } + 'step 1' + var num=player.countCards('he'); + if(!num) event.finish(); + else if(num==1) event._result={bool:true,cards:player.getCards('he')}; + else player.chooseCard('he',true,'交给'+get.translation(target)+'一张牌'); + 'step 2' + if(result.bool) target.gain(result.cards,player,'giveAuto'); + }, + }, + //张燕 + olsuji:{ + audio:2, + trigger:{global:'phaseUseBegin'}, + filter:function(event,player){ + if(!event.player.isDamaged()) return false; + return _status.connectMode&&player.countCards('hes')||!_status.connectMode&&player.hasCard(card=>{ + return get.color(card)=='black'; + },'hes'); + }, + direct:true, + content:[ + (event,map)=>{ + var player=map.player,trigger=map.trigger; + var next=player.chooseToUse(); + next.set('openskilldialog',`###${get.prompt('olsuji')}###将一张黑色牌当【杀】使用${ + player==trigger.player?'':`。若${get.translation(trigger.player)}受到了此【杀】的伤害,你获得其一张牌。` + }`); + next.set('norestore',true); + next.set('_backupevent','olsuji_backup'); + next.set('addCount',false); + next.set('logSkill','olsuji'); + next.set('custom',{ + add:{}, + replace:{window:function(){}} + }); + next.backup('olsuji_backup'); + }, + (event,map)=>{ + if(map.result.bool){ + var player=map.player,trigger=map.trigger; + if(trigger.player.isIn()&&trigger.player.hasHistory('damage',evt=>{ + return evt.card&&evt.card.storage&&evt.card.storage.olsuji; + })&&trigger.player.countGainableCards(player,'he')) player.gainPlayerCard(trigger.player,'he',true); + } + }, + ], + subSkill:{ + backup:{ + filterCard:function(card){ + return get.itemtype(card)=='card'&&get.color(card)=='black'; + }, + viewAs:{ + name:'sha', + storage:{olsuji:true}, + }, + selectCard:1, + position:'hes', + ai1:function(card){ + return 5-get.value(card); + }, + precontent:function(){ + delete event.result.skill; + }, + }, + }, + }, + ollangdao:{ + audio:2, + trigger:{player:'useCardToPlayer'}, + filter:function(event,player){ + if(event.card.name!='sha') return false; + return event.isFirstTarget&&event.targets.length==1&&player.getStorage('ollangdao').length<3; + }, + logTarget:'target', + onremove:true, + check:function(event,player){ + if(get.attitude(player,event.target)>0){ + if(player.getStorage('ollangdao').includes(1)&&game.hasPlayer(current=>{ + return player.canUse(event.card,current)&&get.effect(current,event.card,player,player)>0; + })) return event.getRand()<0.5; + return false; + } + return event.target.getHp()<=2||player.getDamagedHp()>1||!player.hasCard({color:'black'},'hes'); + }, + content:function*(event,map){ + var player=map.player,trigger=map.trigger,result=map.result; + var target=trigger.target; + var send=function(card,list){ + var next=game.createEvent('ollangdao_choose',false); + next.setContent(lib.skill.ollangdao.contentx); + next.set('card',card); + next.set('list',list); + game.resume(); + }; + var sendback=function(result,player){ + if(!result) result={}; + if(typeof result.index!=='number'||result.index<0){ + result.index=[0,1,2].find(i=>!event.player.getStorage('ollangdao').includes(i)); + } + results.push([player,result]); + }; + var ai_targets=[]; + var results=[]; + var players=[player,target]; + var withme=false,withol=false,withai=false; + for(var i=0;i{ + return !trigger.targets.includes(current)&&player.canUse(trigger.card,current)&&get.effect(current,trigger.card,player,target)<0; + })) list.removeArray([0,2]); + if(player.getStorage('ollangdao').includes(2)) list.remove(0); + } + else{ + if(!game.hasPlayer(current=>{ + return !trigger.targets.includes(current)&&player.canUse(trigger.card,current)&&get.effect(current,trigger.card,player,target)>0; + })) list.remove(1); + if(!list.includes(1)) list.remove(0); + } + if(list.length) index=list.randomGet(); + sendback({index:index},target); + ai_targets.splice(i--,1); + } + } + if(ai_targets.length){ + ai_targets.randomSort(); + setTimeout(function(){ + event.interval=setInterval(function(){ + var target=ai_targets.shift(); + var list=[0,1,2].removeArray(player.getStorage('ollangdao')); + var index=list[0]; + if(get.attitude(target,player)<0){ + if(!game.hasPlayer(current=>{ + return !trigger.targets.includes(current)&&player.canUse(trigger.card,current)&&get.effect(current,trigger.card,player,target)<0; + })) list.removeArray([0,2]); + if(player.getStorage('ollangdao').includes(2)) list.remove(0); + } + else{ + if(!game.hasPlayer(current=>{ + return !trigger.targets.includes(current)&&player.canUse(trigger.card,current)&&get.effect(current,trigger.card,player,target)>0; + })) list.remove(1); + if(!list.includes(1)) list.remove(0); + } + if(list.length) index=list.randomGet(); + sendback({index:index},target); + if(!ai_targets.length){ + clearInterval(event.interval); + if(withai) game.resume(); + } + },_status.connectMode?750:75); + },500); + } + } + if(withme){ + result=yield next; + if(_status.connectMode){ + game.me.unwait(result,game.me); + } + else{ + if(!result) result={}; + if(typeof result.index!=='number'||result.index<0){ + result.index=[0,1,2].find(i=>!event.player.getStorage('ollangdao').includes(i)); + } + results.push([player,result]); + } + } + if(withol&&!event.resultOL){ + game.pause(); + yield null; + } + if(ai_targets.length>0){ + withai=true; + game.pause(); + yield null; + } + if(_status.connectMode){ + for(var i of [player,target]) i.hideTimer(); + } + var chosenCount=[0,0,0]; + results.sort((a,b)=>lib.sort.seat(a[0],b[0])); + player.when('useCardAfter') + .assign({ + card:trigger.card + }) + .then(()=>{ + var card=get.info(event.name).card; + var dieEvts=game.getGlobalHistory('everything',evt=>evt.name=='die'); + if(trigger.card==card&&!game.hasPlayer2(current=>{ + for(var evt of dieEvts){ + if(evt.player!=current) continue; + var evtx=evt.getParent(2); + if(evtx.name!='damage') continue; + if(evtx.card&&evtx.card==card) return true; + } + return false; + },true)){ + var toRemove=card.storage.ollangdao_remove; + var list=[0,1,2].filter(i=>(toRemove>>i)&1); + if(!list.length) return; + player.markAuto('ollangdao',list); + game.log(player,'移去了','#g【狼蹈】','的','#y选项'+list.map(i=>{ + return get.cnNumber(i+1,true); + }).join('、')); + } + }); + if(!trigger.card.storage) trigger.card.storage={}; + if(!trigger.card.storage.ollangdao_remove) trigger.card.storage.ollangdao_remove=0; + var config=[['伤害+1','fire'],['目标+1','wood'],['不能响应','water']]; + for(var res of results){ + var target=res[0],result=res[1]; + if(!target||!result) continue; + var ind=result.index; + var conf=config[ind]; + trigger.card.storage.ollangdao_remove|=1<{ + return !_status.event.targets.includes(target)&&player.canUse(_status.event.card,target); + }).set('targets',trigger.targets).set('ai',target=>{ + var player=_status.event.player; + return get.effect(target,_status.event.card,player,player); + }).set('card',trigger.card); + if(result.bool){ + if(!event.isMine()&&!event.isOnline()) game.delayex(); + var targets=result.targets; + player.line(targets); + trigger.targets.addArray(targets); + game.log(targets,'也成为了',trigger.card,'的目标'); + } + }, + contentx:function(){ + 'step 0' + var name=get.translation(card); + var choices=[],choiceList=[ + `令${name}伤害基数+1`, + `令${name}可以多选择一个目标`, + `令${name}不可被响应` + ]; + [0,1,2].forEach((item,index)=>{ + if(event.list.includes(item)){ + choiceList[index]=`${choiceList[index]}` + } + else choices.push(`选项${get.cnNumber(index+1,true)}`); + }); + game.me.chooseControl(choices).set('prompt','狼蹈:请选择一项').set('choiceList',choiceList).set('ai',()=>{ + return _status.event.controls.randomGet(); + }); + 'step 1' + event.result={index:['选项一','选项二','选项三'].indexOf(result.control)}; + }, + intro:{ + content:(storage,player)=>`已移除选项${storage.map(i=>get.cnNumber(i+1,true)).join('、')}`, + }, + }, //张既 skill_zhangji_A:{ audio:2, @@ -1058,14 +1543,307 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, //吕伯奢 - skill_lvboshe:{ + olfushi:{ + audio:2, + trigger:{global:'useCardAfter'}, + filter:function(event,player){ + return event.player.isIn()&&event.card.name=='sha'&&event.cards&&event.cards.filterInD().length&&get.distance(player,event.player)<=1; + }, + forced:true, + locked:false, + logTarget:'player', + content:function(){ + player.addToExpansion(trigger.cards.filterInD(),'gain2').gaintag.add('olfushi'); + }, + marktext:'豕', + intro:{ + content:'expansion', + markcount:'expansion', + }, + onremove:function(player,skill){ + var cards=player.getExpansions(skill); + if(cards.length) player.loseToDiscardpile(cards); + }, + group:'olfushi_wusheng', + subSkill:{ + wusheng:{ + enable:'chooseToUse', + filter:function(event,player){ + return player.getExpansions('olfushi').length&&event.filterCard({name:'sha',isCard:true},player,event); + }, + chooseButton:{ + dialog:function(event,player){ + return ui.create.dialog( + '###缚豕###
    重铸任意“缚豕”牌,视为使用一张【杀】并执行等量项
    ', + player.getExpansions('olfushi'), + [['额外目标','伤害-1','伤害+1'],'tdnodes'], + 'hidden' + ); + }, + filter:function(button){ + const cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); + if(cards.length>=3&&typeof button.link=='string') return false; + return true; + }, + select:[2,Infinity], + filterOk:()=>{ + if(!ui.selected.buttons.length) return false; + const controls=ui.selected.buttons.filter(button=>typeof button.link=='string'); + const cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); + if(cards.length>=3){ + const dialog=get.event().dialog; + if(dialog&&dialog.buttons){ + dialog.buttons.forEach(button=>{ + if(typeof button.link!='string') return; + button.classList.remove('selectable'); + button.classList.remove('selected'); + ui.selected.buttons.remove(button); + }); + } + return true; + } + return cards.length==controls.length; + }, + check:function(button){ + const player=get.player(); + const card=new lib.element.VCard({name:'sha',isCard:true}); + const targets=game.filterPlayer(target=>{ + return player.canUse(card,target); + }); + const num0=targets.filter(target=>get.effect(target,card,player,player)>0).length; + if(num0<=0) return 0; + const num1=Math.max(0,num0-1); + const num2=targets.length-num1; + const num3=player.getExpansions('olfushi').length; + let list; + if((num1>0&&num2>0)||(num1==0&&num2==0)){ + switch(num3){ + case 1: + list=[['额外目标','伤害+1'].randomGet()]; + break; + case 2: + list=[['额外目标','伤害+1'].randomGet(),'伤害-1']; + break; + default: + list=['额外目标','伤害-1','伤害+1']; + break; + } + } + else if(num2==0){ + switch(num3){ + case 1: + list=['伤害+1']; + break; + case 2: + list=['额外目标','伤害+1']; + break; + default: + list=['额外目标','伤害-1','伤害+1']; + break; + } + } + else if(num1==0){ + switch(num3){ + case 1: + list=['伤害+1']; + break; + default: + list=['伤害-1','伤害+1']; + break; + } + } + if(typeof button.link=='string'){ + if(list.includes(button.link)) return 114514; + return -1; + } + else{ + const cards=ui.selected.buttons.filter(button=>typeof button.link=='object'); + if(list.length==3&&(player.getHp()<=2||cards.lengthtypeof button=='object'); + var controls=links.filter(button=>typeof button=='string'); + if(!controls.length) controls=['额外目标','伤害-1','伤害+1']; + return { + audio:'olfushi', + selectCard:-1, + position:'x', + cards:cards, + controls:controls, + filterCard:function(card){ + return lib.skill.olfushi_wusheng_backup.cards.includes(card); + }, + viewAs:{ + name:'sha', + isCard:true, + }, + precontent:function(){ + var cards=lib.skill.olfushi_wusheng_backup.cards.slice(); + var controls=lib.skill.olfushi_wusheng_backup.controls.slice(); + player.logSkill('olfushi'); + delete event.result.skill; + event.result.card=new lib.element.VCard(lib.skill.olfushi_wusheng_backup.viewAs); + event.result.cards=[]; + player.recast(cards); + event.result.card.storage.olfushi_buff=controls; + player.addTempSkill('olfushi_buff'); + } + } + }, + prompt:function(links,player){ + let controls=links.filter(button=>typeof button=='string'); + if(!controls.length) controls=['额外目标','伤害-1','伤害+1']; + return `选择【杀】的目标(${controls.join('、')})`; + } + }, + ai:{ + order:function(item,player){ + return get.order({name:'sha'})+0.1; + }, + result:{player:1}, + respondSha:true, + skillTagFilter:function(player,tag,arg){ + if(arg=='respond') return false; + if(!player.getExpansions('olfushi').length) return false; + }, + }, + }, + buff:{ + charlotte:true, + trigger:{player:['useCard2','useCardToPlayered']}, + filter:function(event,player,name){ + if(!event.card.storage||!event.card.storage.olfushi_buff) return false; + if(name=='useCard2') return true; + return event.getParent().triggeredTargets3.length==event.targets.length&&event.card.storage.olfushi_buff.length>1&&event.card.storage.olfushi_buff.includes('伤害-1')&&!event.targets.some(target=>!event.targets.includes(target.getPrevious())&&!event.targets.includes(target.getNext())); + }, + forced:true, + popup:false, + content:function(){ + 'step 0' + if(event.triggername=='useCardToPlayered'){ + if(trigger.getParent().addCount!==false){ + trigger.getParent().addCount=false; + if(player.stat[player.stat.length-1].card.sha>0){ + player.stat[player.stat.length-1].card.sha--; + } + } + game.log(trigger.card,'不计入次数'); + event.finish(); + return; + } + var list=trigger.card.storage.olfushi_buff; + event.list=list; + var canBeAddedTargets=game.filterPlayer(target=>{ + return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); + }); + if(!list.includes('额外目标')||!canBeAddedTargets.length) event._result={bool:false}; + else if(canBeAddedTargets.length==1) event._result={bool:true,targets:canBeAddedTargets}; + else player.chooseTarget('请选择'+get.translation(trigger.card)+'的额外目标',function(card,player,target){ + var trigger=_status.event.getTrigger(); + return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); + },true).set('ai',function(target){ + var player=_status.event.player; + return get.attitude(player,target); + }); + 'step 1' + if(result.bool){ + var targets=result.targets.sortBySeat(); + player.line(targets); + trigger.targets.addArray(targets); + game.log(targets,'成为了',trigger.card,'的额外目标'); + } + 'step 2' + if(!event.list.includes('伤害-1')) event._result={bool:false}; + else if(trigger.targets.length==1) event._result={bool:true,targets:trigger.targets.slice()}; + else player.chooseTarget('请选择'+get.translation(trigger.card)+'伤害-1的目标',function(card,player,target){ + var trigger=_status.event.getTrigger(); + return trigger.targets.contains(target); + },true).set('ai',function(target){ + var player=_status.event.player; + return get.attitude(player,target); + }); + 'step 3' + if(result.bool){ + var target=result.targets[0]; + player.line(target); + game.log(trigger.card,'对',target,'的伤害-1'); + player.addTempSkill('olfushi_buff2'); + player.initStorage('olfushi_buff2',[]); + player.getStorage('olfushi_buff2').push([target,trigger.card]); + } + 'step 4' + if(!event.list.contains('伤害+1')) event.finish(); + else if(trigger.targets.length==1) event._result={bool:true,targets:trigger.targets.slice()}; + else player.chooseTarget('请选择'+get.translation(trigger.card)+'伤害+1的目标',function(card,player,target){ + var trigger=_status.event.getTrigger(); + return trigger.targets.contains(target); + },true).set('ai',function(target){ + var player=_status.event.player; + return get.damageEffect(target,player,player); + }); + 'step 5' + if(result.bool){ + var target=result.targets[0]; + player.line(target); + game.log(trigger.card,'对',target,'的伤害+1'); + player.addTempSkill('olfushi_buff3'); + player.initStorage('olfushi_buff3',[]); + player.getStorage('olfushi_buff3').push([target,trigger.card]); + } + }, + }, + buff2:{ + charlotte:true, + onremove:true, + trigger:{source:'damageBegin2'}, + filter:function(event,player){ + return event.card&&player.getStorage('olfushi_buff2').some(info=>info[0]==event.player&&info[1]==event.card); + }, + forced:true, + popup:false, + content:function(){ + trigger.num--; + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(player.hasSkillTag('jueqing',false,target)) return; + if(!card||!player.getStorage('olfushi_buff2').contains(card)) return; + var num=get.tag(card,'damage'); + if(num){ + if(num>1) return 0.5; + return 0; + } + }, + }, + }, + }, + buff3:{ + charlotte:true, + onremove:true, + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + return event.card&&player.getStorage('olfushi_buff3').some(info=>info[0]==event.player&&info[1]==event.card); + }, + forced:true, + popup:false, + content:function(){ + trigger.num++; + }, + }, + wusheng_backup:{}, + }, + }, + oldongdao:{ mode:['doudizhu'], zhuanhuanji:true, mark:true, - markcount:'☯', + marktext:'☯', intro:{ content:function(storage){ - if(storage) return '农民的回合结束时,你可以令其进行一个额外回合'; + if(storage) return '农民的回合结束时,其可以进行一个额外回合'; return '农民的回合结束时,你可以令地主进行一个额外回合'; }, }, @@ -1074,17 +1852,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ return event.player.identity=='fan'; }, - prompt2:function(event,player){ - return '令'+get.translation(lib.skill.skill_lvboshe.logTarget(event,player))+'进行一个额外回合'; - }, - logTarget:function(event,player){ - var storage=player.storage.skill_lvboshe; - return storage?event.player:game.zhu; - }, + direct:true, content:function(){ - var target=lib.skill.skill_lvboshe.logTarget(trigger,player); - player.changeZhuanhuanji('skill_lvboshe'); - target.insertPhase(); + 'step 0' + var target=(player.storage.oldongdao?trigger.player:game.zhu); + event.target=target; + var target2=(player.storage.oldongdao?trigger.player:player); + event.target2=target2; + target2.chooseBool(get.prompt('oldongdao'),'令'+get.translation(target)+'进行一个额外回合').set('ai',()=>{ + var event=_status.event.getParent(); + return get.attitude(event.target2,event.target)>0; + }) + 'step 1' + if(result.bool){ + player.logSkill('oldongdao'); + event.target2.line(target); + player.changeZhuanhuanji('oldongdao'); + target.insertPhase(); + } }, }, //OL陆郁生 @@ -1124,7 +1909,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ var cards=get.bottomCards(3,true); player.showCards(cards,get.translation(player)+'发动了【藏心】'); - trigger.num+=cards.filter(card=>get.suit(card,false)=='heart').length; + var num=cards.filter(card=>get.suit(card,false)=='heart').length; + if(num) player.draw(num); }, }, }, @@ -1225,29 +2011,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' var info=lib.skill.olgangshu.getInfo(player); - player.chooseControl('攻击范围('+info[0]+')','摸牌数('+info[1]+')','使用【杀】的上限('+info[2]+')','cancel2').set('prompt',get.prompt('olgangshu')).set('prompt2','
    令以下一个数值+1(每项至多+5):
    1.攻击范围;
    2.下个摸牌阶段的摸牌数;
    3.使用【杀】的次数上限。
    ').set('ai',()=>{ + player.chooseControl('攻击范围('+info[0]+')','摸牌数('+info[1]+')','使用杀的上限('+info[2]+')','cancel2').set('prompt',get.prompt('olgangshu')).set('prompt2','
    令以下一个数值+1(每项至多+5):
    1.攻击范围;
    2.下个摸牌阶段的摸牌数;
    3.使用【杀】的次数上限。
    ').set('ai',()=>{ return _status.event.choice; }).set('choice',function(){ var info=lib.skill.olgangshu.getInfo(player); if(info[1]==0) return 1; - if(player.hasCard(card=>{ + if(info[2]<5&&player.hasCard(card=>{ return get.name(card)=='sha'&&player.hasValueTarget(card); },'hs')&&!player.getCardUsable('sha')) return 2; - if(!game.hasPlayer(current=>{ + if(info[0]<5&&!game.hasPlayer(current=>{ return player.inRange(current)&&get.effect(current,{name:'sha'},player,player)>0; })) return 0; var rand=Math.random(); - if(rand<0.2) return 0; - if(rand<0.7) return 1; - if(rand<1.0) return 2; - return get.rand(0,2); + var list=[0,1,2].filter(i=>info[i]<5); + if(!list.length) return 'cancel2'; + if(rand<0.2&&list.includes(0)) return 0; + if(rand<0.7&&list.includes(1)) return 1; + if(rand<1.0&&list.includes(2)) return 2; + return list.randomGet(); }()); 'step 1' if(result.control!='cancel2'){ player.logSkill('olgangshu'); player.addSkill('olgangshu_buff'); var info=lib.skill.olgangshu.getInfo(player); - info[result.index]=info[result.index]+1; + info[result.index]=Math.min(5,info[result.index]+1); game.log(player,'的',result.control.slice(0,result.control.indexOf('(')),'#y+1'); player.markSkill('olgangshu_buff'); } @@ -1285,7 +2073,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mark:true, intro:{ - markcount:()=>0, + markcount:function(storage,player){ + var info=lib.skill.olgangshu.getInfo(player); + var str=''; + info.forEach(num=>str+=parseFloat(num)); + return str; + }, content:function(storage,player){ var info=lib.skill.olgangshu.getInfo(player); var str=''; @@ -1699,6 +2492,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return event.isFirstTarget&&event.targets.length>player.getHp(); }, direct:true, + usable:1, content:function(){ 'step 0' player.chooseTarget(get.prompt('olkuansai'),'令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。',(card,player,target)=>{ @@ -1746,7 +2540,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return true; }()); } - else event.finish(); + else{ + player.storage.counttrigger.olkuansai--; + event.finish(); + } 'step 2' if(result.bool){ target.give(result.cards,player); @@ -2149,7 +2946,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.cardsGotoOrdering(card); 'step 1' if(player.countCards('he')>0){ - player.chooseCard('he','天候:是否用一张牌交换牌堆顶的'+get.translation(card)+'?').set('promptx',[[card]]).set('ai',()=>-1) + player.chooseCard('he','天候:是否用一张牌交换牌堆顶的'+get.translation(card)+'?').set('promptx',[[card]]).set('card',card).set('ai',cardx=>{ + let card=_status.event.card,val=get.value(card,player)-get.value(cardx,player); + if(val<0) return -val; + let suit=get.suit(card); + if(suit==='heart') return val+game.countPlayer((current)=>{ + if(player!==current&&!game.hasPlayer((tar)=>tar.hp-current.hp>1)) return get.sgn(get.attitude(player,current)); + return 0; + }); + if(suit=='club') return val+game.countPlayer((current)=>{ + if(player!==current&&(current.hp<2||!game.hasPlayer((tar)=>current.hp-tar.hp>1))) return get.sgn(get.attitude(player,current)); + return 0; + }); + return val+0.1; + }); } else{ event._result={bool:false}; @@ -2206,6 +3016,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var current of players){ current.removeAdditionalSkill(key); } + game.removeGlobalSkill('oltianhou_'+player.playerid+'_ai'); game.broadcastAll(function(){ delete _status.tempBackground; game.updateBackground(); @@ -2241,20 +3052,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ global:'oltianhou_spade_ai', }, spade_ai:{ - effect:{ - player:function(card,player,target,current){ - if(get.tag(card,'fireDamage')&&!player.hasSkill('oltianhou_spade')){ - return 'zerotarget'; + ai:{ + effect:{ + player:function(card,player,target,current){ + if((typeof card=='object'&&game.hasNature(card,'fire')||get.tag(card,'fireDamage'))&&!player.hasSkill('oltianhou_spade')) return 'zeroplayertarget'; + if((typeof card=='object'&&game.hasNature(card,'thunder')||get.tag(card,'thunderDamage'))){ + var list=lib.skill.oltianhou_spade.logTarget({player:target}); + var eff=list.reduce(function(eff,current){ + eff+=get.effect(current,{name:'losehp'},player,player)/get.attitude(player,player); + },0); + return [1,eff]; + } } - else if(get.tag(card,'thunderDamage')){ - var list=lib.skill.oltianhou_spade.logTarget({player:target}); - var eff=list.reduce(function(eff,current){ - eff+=get.effect(current,{name:'losehp'},player,player) - },0); - return [1,eff]; - } - }, - }, + } + } }, miehuo:{ audio:'oltianhou_spade', @@ -2284,6 +3095,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ trigger.player.loseHp(); }, + global:'oltianhou_heart_ai' + }, + heart_ai:{ + mod:{ + aiOrder:function(player,card,num){ + if(num>0&&_status.event&&_status.event.type=='phase'&&!player.hasSkill('oltianhou_heart')&&get.tag(card,'recover')&&!player.isMaxHp()&&player.needsToDiscard()<=1&&!game.hasPlayer(function(current){ + return current.hp-player.hp>1; + })&&get.effect(player,{name:'losehp'},player,player)<0) return 0; + } + } }, club:{ audio:true, @@ -2301,6 +3122,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ trigger.player.loseHp(); }, + global:'oltianhou_club_ai' + }, + club_ai:{ + ai:{ + nokeep:true, + skillTagFilter:function(player,tag,arg){ + return _status.event&&_status.event.type=='phase'&&(!arg||arg.card&&get.name(arg.card)==='tao')&&!player.hasSkill('oltianhou_club')&&player.isMinHp()&&get.effect(player,{name:'losehp'},player,player)<0; + } + } }, diamond:{ audio:true, @@ -2336,13 +3166,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ global:'oltianhou_diamond_ai', }, diamond_ai:{ - effect:{ - target:function(card,player,target,current){ - if(card.name=='sha'&&!player.hasSkill('oltianhou_diamond')){ - if(target!=player.getNext()&&target!=player.getPrevious()) return 0.7; + ai:{ + effect:{ + player:function(card,player,target){ + if(get.name(card)=='sha'&&!player.hasSkill('oltianhou_diamond')&&target!=player.getNext()&&target!=player.getPrevious()){ + let num=get.number(card),max=_status.aiyh_MAXNUM||13; + return [num/max,0,num/max,0]; + } } - }, - }, + } + } }, } }, @@ -3650,15 +4483,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mod:{ aiValue:function(player,card,num){ - if(get.itemtype(card)!='card'||!card.hasGaintag('oldaili_tag')) return; - if(get.distance(_status.currentPhase,player,'absolute')==1&&!player.isTurnedOver()) return; - if(player.countCards('h',card=>{ + if(num < 0 ||get.itemtype(card) != 'card' || !card.hasGaintag('oldaili_tag')) return; + if(get.distance(_status.currentPhase, player, 'absolute') == 1 && !player.isTurnedOver()) return; + let dai = player.countCards('h', (card) => { return card.hasGaintag('oldaili_tag'); - })%2==0&&!ui.selected.cards.some(card=>{ + }); + if(ui.selected.cards && ui.selected.cards.length) dai += ui.selected.cards.filter((card) => { return card.hasGaintag('oldaili_tag'); - })){ - return num/10; - } + }).length; + if(dai % 2) return Math.sqrt(num); + return num + 6; }, aiUseful:function(){ return lib.skill.oldaili.mod.aiValue.apply(this,arguments); @@ -4017,9 +4851,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' player.damage('nosource'); 'step 1' - var next=player.phaseUse(); - event.next.remove(next); - trigger.next.push(next); + trigger.phaseList.splice(trigger.num,0,'phaseUse|oldianjun'); }, }, olkangrui:{ @@ -6077,9 +6909,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ threaten:1.2, - order:9, + order:9.1, result:{ - target:-1, + player:function(player){ + let min=24; + player.countCards('he',function(card){ + min=Math.min(min,get.value(card)); + }); + if(ui.selected.targets.length==1) return 1-min/6; + return 0.75-min/48; + }, + target:function(player,target){ + if(target.hasCard(function(card){ + return lib.filter.cardDiscardable(card,player,'olqingyi'); + },'he')) return -1; + return 0; + } }, }, group:'olqingyi_gain', @@ -8492,13 +9337,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player!=event.player&&event.player.isIn()&&player.countCards('h')>0&&!player.hasSkill('yuanzi_round',null,null,false); }, check:function(event,player){ - if(get.attitude(player,event.player)<=4) return false; - if(event.player.hasJudge('lebu')) return false; + if(event.player.hasJudge('lebu')||get.attitude(player,event.player)<2) return false; return game.hasPlayer(function(current){ - return event.player!=player&&game.hasPlayer(function(current){ - return current!=player&¤t!=event.player&&event.player.inRange(current)&&get.attitude(event.player,current)<0; - }); - }) + return current!==player&¤t!==event.player&&event.player.inRange(current)&&get.attitude(event.player,current)<0; + }); }, content:function(){ var cards=player.getCards('h'); @@ -8890,7 +9732,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' trigger.all_excluded=true; var str='弃置一张非基本牌'; - if(player.hp>0) str+=',或点「取消」失去一点体力'; + if(player.hp>0) str+=',或点「取消」失去1点体力'; var next=player.chooseToDiscard(str,function(card){ return get.type(card)!='basic'; },'he').set('ai',function(card){ @@ -10417,13 +11259,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //邓芝 olxiuhao:{ audio:2, - trigger:{ - player:'damageBegin4', - source:'damageBegin2', - }, + trigger:{global:'damageBegin4'}, usable:1, filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source!=event.player; + return event.source&&event.source.isIn()&&[event.source,event.player].contains(player)&&event.source!=event.player; }, logTarget:function(event,player){ return player==event.player?event.source:event.player; @@ -11814,24 +12653,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ chooseButton:{ dialog:function(event,player){ var dialog=ui.create.dialog('游龙','hidden'); - var table=document.createElement('div'); - table.classList.add('add-setting'); - table.style.margin='0'; - table.style.width='100%'; - table.style.position='relative'; - for(var i=1;i<6;i++){ + const equips=[]; + for(let i=1;i<6;i++){ if(!player.hasEnabledSlot(i)) continue; - var td=ui.create.div('.shadowed.reduce_radius.pointerdiv.tdnode'); - td.innerHTML=''+get.translation('equip'+i)+''; - td.link=i; - td.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.button); - for(var j in lib.element.button){ - td[j]=lib.element.button[j]; - } - table.appendChild(td); - dialog.buttons.add(td); + equips.push([i,get.translation('equip'+i)]); } - dialog.content.appendChild(table); + if(equips.length>0) dialog.add([equips,'tdnodes']) var type=player.storage.youlong?'basic':'trick'; var list=[]; for(var name of lib.inpile){ @@ -13715,7 +14542,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseToDiscard(true,'h',2); player.turnOver(); 'step 6' - player.chooseTarget('请选择【星舞】的目标','弃置其装备区内的所有牌。然后对其造成两点伤害(目标为女性角色则改为1点)',true,lib.filter.notMe).set('ai',function(target){ + player.chooseTarget('请选择【星舞】的目标','弃置其装备区内的所有牌。然后对其造成2点伤害(目标为女性角色则改为1点)',true,lib.filter.notMe).set('ai',function(target){ return -get.attitude(_status.event.player,target)*Math.sqrt(4+target.countCards('e',function(card){ return get.value(card,target)>0; }))*(target.hasSex('female')?1:2); @@ -13769,7 +14596,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseToDiscard(get.prompt2('new_meibu',trigger.player),'he').set('ai',function(card){ if(_status.event.check) return 6-get.value(card); return 0; - }).set('check',check).set('logSkill','new_meibu'); + }).set('check',check).set('logSkill',['new_meibu',trigger.player]); "step 1" if(result.bool){ var target=trigger.player; @@ -13777,8 +14604,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.line(target,'green'); target.addTempSkill('new_zhixi','phaseUseAfter'); if(card.name!='sha'&&get.type(card)!='trick'&&get.color(card)!='black'){ - target.addTempSkill('new_meibu_range','phaseUseEnd'); - target.storage.meibu=player; + target.addTempSkill('new_meibu_range','phaseUseAfter'); + target.markAuto('new_meibu_range',player); } target.markSkillCharacter('new_meibu',player,'魅步','锁定技,出牌阶段,你至多可使用X张牌,你使用了锦囊牌后不能再使用牌(X为你的体力值)。'); } @@ -13788,9 +14615,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ range:{ + onremove:true, + charlotte:true, mod:{ globalFrom:function (from,to,num){ - if(to==from.storage.meibu){ + if(from.getStorage('new_meibu_range').includes(to)){ return -Infinity; } }, @@ -13804,10 +14633,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{ player:"phaseUseBegin", }, + filter:function(event,player){ + return game.hasPlayer(current=>{ + if(current==player) return current.getEquips(2).length>0; + return current.countCards('e')>0; + }); + }, direct:true, content:function (){ 'step 0' - player.chooseTarget(get.prompt('new_mumu'),'弃置一名角色装备区内的一张牌,或者获得一名角色装备区内的防具牌',function(card,player,target){ + player.chooseTarget(get.prompt('new_mumu'),'弃置一名其他角色装备区内的一张牌,或者获得一名角色装备区内的防具牌',function(card,player,target){ if(target==player) return target.getEquips(2).length>0; return target.countCards('e')>0; }).set('ai',function(target){ @@ -13898,6 +14733,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{presha:true,pretao:true,nokeep:true}, }, "new_mumu2":{ + charlotte:true, mod:{ cardEnabled:function(card){ if(card.name=='sha') return false; @@ -15094,7 +15930,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.hp==1) return 1; if(player.hp==2&&player.countCards('e')>=2) return 1; return 0; - }).set('choiceList',['弃置装备区内的所有牌并失去一点体力',get.mode()=='guozhan'?'移除副将牌':'随机移除武将牌上的一个技能']); + }).set('choiceList',['弃置装备区内的所有牌并失去1点体力',get.mode()=='guozhan'?'移除副将牌':'随机移除武将牌上的一个技能']); } else{ event._result={index:1}; @@ -16325,10 +17161,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, yjixi:{ derivation:'rewangzun', + audio:'weidi', trigger:{player:'phaseJieshuBegin'}, forced:true, filter:function(event,player){ - return player.countMark('yjixi')>=3; + if(player.phaseNumber<3) return false; + var num=0; + for(var i=player.actionHistory.length-1;i>=0;i--){ + if(!player.actionHistory[i].isMe) continue; + if(_status.globalHistory[i].changeHp.some(evt=>evt.player==player&&evt.getParent().name=='loseHp')) return false; + else{ + num++; + if(num>=3) break; + } + } + return true; }, skillAnimation:true, animationColor:'gray', @@ -16384,6 +17231,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, xinyongsi:{ + audio:'yongsi1', group:['xinyongsi1','xinyongsi2'], locked:true, }, @@ -16397,7 +17245,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.draw(game.countGroup()); trigger.changeToZero(); - } + }, }, xinyongsi2:{ audio:'yongsi2', @@ -16408,17 +17256,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseToDiscard('he','庸肆').set('prompt2','弃置一张牌,或取消并失去一点体力').ai=function(card){ + player.chooseToDiscard('he','庸肆').set('prompt2','弃置一张牌,或取消并失去1点体力').ai=function(card){ return 8-get.value(card); }; 'step 1' - if(!result.bool){ - player.loseHp(); - var num=player.countMark('yjixi'); - if(num) player.removeMark('yjixi',num,false); - } - else player.addMark('yjixi',1,false); - } + if(!result.bool) player.loseHp(); + }, }, lianzhu:{ audio:2, @@ -16772,7 +17615,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.chooseControl(function(){ if(_status.event.goon) return '选项二'; return '选项一'; - }).set('goon',goon).set('prompt','定叛').set('choiceList',['令'+get.translation(player)+'弃置你装备区里的一张牌','获得你装备区内的所有牌并受到一点伤害']); + }).set('goon',goon).set('prompt','定叛').set('choiceList',['令'+get.translation(player)+'弃置你装备区里的一张牌','获得你装备区内的所有牌并受到1点伤害']); 'step 2' if(result.control=='选项一'){ player.discardPlayerCard(target,true,'e'); @@ -17713,6 +18556,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, zhidao:{ audio:2, + mod:{ + aiOrder:function(player,card,num){ + if(num>0&&!player.hasSkill('zhidao2')&&!get.tag(card,'damage')&&(!lib.filter.targetEnabled(card,player,player)||get.effect(player,card,player)<=0)) return num+10; + } + }, trigger:{source:'damageSource'}, filter:function(event,player){ if(event._notrigger.contains(event.player)) return false; @@ -17877,16 +18725,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.draw(3); + 'step 1' var list=lib.skill.zhengnan.derivation.filter(skill=>!player.hasSkill(skill)); if(list.length==1) event._result={control:list[0]}; - else if(list.length){ + else if(list.length>0){ player.chooseControl(list).set('prompt','选择获得一项技能').set('ai',function(){ if(_status.event.controls.contains('dangxian')) return 'dangxian'; return _status.event.controls[0]; }); } else event.finish(); - 'step 1' + 'step 2' if(result.control){ player.addSkillLog(result.control); player.popup(result.control); @@ -18363,7 +19212,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.unmarkSkill('xingwu'); player.chooseTarget(function(card,player,target){ return target!=player&&target.hasSex('male'); - },'对一名男性角色造成两点伤害并弃置其装备区内的牌').set('ai',function(target){ + },'对一名男性角色造成2点伤害并弃置其装备区内的牌').set('ai',function(target){ var player=_status.event.player; if(get.attitude(player,target)>0) return -1; return get.damageEffect(target,player,player)+target.countCards('e')/2; @@ -18741,10 +19590,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player.getExpansions('fentian').length>=2; }, filterTarget:true, - prompt:'移去两张“焚”并令一名角色失去一点体力', + prompt:'移去两张“焚”并令一名角色失去1点体力', content:function(){ 'step 0' - player.chooseCardButton(2,'移去两张“焚”并令'+get.translation(target)+'失去一点体力',player.getExpansions('fentian'),true); + player.chooseCardButton(2,'移去两张“焚”并令'+get.translation(target)+'失去1点体力',player.getExpansions('fentian'),true); 'step 1' if(result.bool){ player.loseToDiscardpile(result.links); @@ -19856,40 +20705,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event._result={bool:true,links:[0]}; return; } - event.videoId=lib.status.videoId++; - var func=function(card,id,bool){ - var list=[ - '令自己摸一张牌', - '令XXX摸两张牌', - '令XXX回复1点体力', - ]; - var choiceList=ui.create.dialog('【礼下】:请选择一至两项','forcebutton'); - choiceList.videoId=id; - for(var i=0;i{ + return [index,item.replace(/XXX/g,card)] + }),'textbutton'] + ],true,[1,2]); next.set('dialog',event.videoId); next.set('filterButton',function(button){ if(button.link==2){ @@ -19905,12 +20732,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return button.link*Math.random(); }); "step 1" - if(event.videoId!=undefined){ - if(player.isOnline2()){ - player.send('closeDialog',event.videoId); - } - event.dialog.close(); - } var map=[ function(trigger,player,event){ player.draw(); @@ -21594,7 +22415,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "step 1" if(result.bool){ var nono=(get.damageEffect(trigger.player,player,trigger.player)>=0); - trigger.player.chooseToDiscard('he','弃置一张装备牌并令'+get.translation(player)+'摸一张牌,或受到一点伤害',{type:'equip'}).set('ai',function(card){ + if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.15); + trigger.player.chooseToDiscard('he','弃置一张装备牌并令'+get.translation(player)+'摸一张牌,或受到1点伤害',{type:'equip'}).set('ai',function(card){ if(_status.event.nono){ return 0; } @@ -21612,10 +22434,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ trigger.player.damage(); } - }, - ai:{ - expose:0.3, - threaten:1.3 } }, suishi:{ @@ -21665,10 +22483,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var str; if(trigger.source==player){ - str='随势:是否流失一点体力?'; + str='随势:是否失去1点体力?'; } else{ - str='随势:是否令'+get.translation(player)+'流失一点体力?' + str='随势:是否令'+get.translation(player)+'失去1点体力?' } trigger.source.chooseBool(str).set('ai',function(){ return get.attitude(_status.event.player,_status.event.target)<0; @@ -21815,19 +22633,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ if(get.mode()=='guozhan'){ if(player==target) return true; - if(player.identity=='ye') return false; if(player.identity=='unknown'){ - if(_status.yeidentity.contains(player._group)){ - return false; - } - else if(get.zhu(player)||get.population(player._group)+1<=get.population()/2){ - return player._group==target.identity; - } - else{ - return false; - } + if(!player.wontYe('qun')) return false; + return target.identity=='qun'; } - return player.identity==target.identity; + return target.isFriendOf(player); } else{ return true; @@ -21984,7 +22794,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, xueji_old:{ - audio:2, + audio:'xueji', enable:'phaseUse', usable:1, filter:function(event,player){ @@ -22032,6 +22842,38 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, + //FW关银屏 + oldhuxiao:{ + shaRelated:true, + audio:'huxiao', + trigger:{player:'shaMiss'}, + forced:true, + content:function(){ + if(player.stat[player.stat.length-1].card.sha>0){ + player.stat[player.stat.length-1].card.sha--; + } + }, + }, + oldwuji:{ + unique:true, + audio:'wuji', + trigger:{player:'phaseJieshuBegin'}, + filter:function(event,player){ + return player.getStat('damage')>=3&&!player.storage.oldwuji; + }, + forced:true, + juexingji:true, + skillAnimation:true, + animationColor:'orange', + content:function(){ + 'step 0' + player.removeSkill('oldhuxiao'); + player.gainMaxHp(); + 'step 1' + player.recover(); + player.awakenSkill('oldwuji'); + }, + }, xueji:{ audio:2, enable:'phaseUse', @@ -23465,356 +24307,301 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addMark('xionghuo',1); }, }, - "xinfu_jianjie":{ - derivation:["jianjie_faq"], - group:["xinfu_jianjie1","xinfu_jianjie2"], + xinfu_jianjie:{ audio:3, + }, + jianjie:{ + group:["jianjie_use","jianjie_die"], + derivation:['jianjie_huoji','jianjie_lianhuan','jianjie_yeyan'], + audio:'xinfu_jianjie', trigger:{ player:"phaseZhunbeiBegin", }, - direct:true, + forced:true, + locked:false, filter:function(event,player){ - if(player.phaseNumber>1) return false; - return !game.hasPlayer(function(current){ - return current.hasSkill('smh_huoji')||current.hasSkill('smh_lianhuan'); - }); + return player.phaseNumber<=1&&game.hasPlayer(current=>current!=player); }, content:function(){ - "step 0" - player.chooseTarget('请将「龙印」交给一名角色',true,function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - var player=_status.event.player; - return 10+get.attitude(player,target); + 'step 0' + player.chooseTarget('荐杰:选择一名其他角色获得“龙印”',lib.filter.notMe,true).set('ai',(target)=>{ + return get.attitude(get.player(),target); }); - "step 1" - if(result.bool&&result.targets&&result.targets.length){ + 'step 1' + if(result.bool){ var target=result.targets[0]; - player.logSkill('xinfu_jianjie',target); player.line(target,'fire'); - target.addSkill('smh_huoji'); - game.delay(); + lib.skill.jianjie.addMark('huoji',player,target); + event.target=target; + game.delayx(); } - if(game.hasPlayer(function(current){ - return !current.hasSkill('smh_huoji')&¤t!=player + else event.finish(); + 'step 2' + if(game.hasPlayer((current)=>{ + return current!=player&¤t!=target; })){ - player.chooseTarget('请将「凤印」交给一名角色',true,function(card,player,target){ - return target!=player&&!target.hasSkill('smh_huoji'); - }).set('ai',function(target){ - var player=_status.event.player; - return 10+get.attitude(player,target); + player.chooseTarget('荐杰:选择一名其他角色获得“凤印”',function(card,player,target){ + return target!=player&&target!=_status.event.getParent().target; + },true).set('ai',(target)=>{ + return get.attitude(get.player(),target); }); } else event.finish(); - "step 2" - if(result.bool&&result.targets&&result.targets.length){ + 'step 3' + if(result.bool){ var target=result.targets[0]; - player.logSkill('xinfu_jianjie',target); - player.line(target,'green'); - target.addSkill('smh_lianhuan'); - game.delay(); + player.line(target,'thunder'); + lib.skill.jianjie.addMark('lianhuan',player,target); + game.delayx(); } }, - }, - "xinfu_jianjie1":{ - audio:3, - prompt:"你的第一个准备阶段,你令两名不同的角色分别获得龙印与凤印;出牌阶段限一次(你的第一个回合除外),或当拥有龙印、凤印的角色死亡时,你可以转移龙印、凤印。", - enable:"phaseUse", - usable:1, - filter:function (event,player){ - if(player.phaseNumber==1) return false; - if(!game.hasPlayer(function(current){ - return current.hasSkill('smh_huoji')||current.hasSkill('smh_lianhuan'); - })) return false; - return true; + hasMark:(mark,player,target)=>{ + if(!target) return player.getStorage('jianjie_'+mark).length>0; + return target.getStorage('jianjie_'+mark).contains(player); }, - filterTarget:function (card,player,target){ - if(ui.selected.targets.length==1){ - return true; - }else{ - return target.hasSkill('smh_huoji')||target.hasSkill('smh_lianhuan'); + addMark:(mark,player,target)=>{ + mark='jianjie_'+mark; + target.addAdditionalSkill(`${mark}_${player.playerid}`,mark); + target.markAuto(mark,[player]); + game.log(player,'令',target,'获得了',`#g“${mark=='jianjie_huoji'?'龙印':'凤印'}”`); + }, + removeMark:(mark,player,target,log)=>{ + if(lib.skill.jianjie.hasMark(mark,player,target,log)){ + mark='jianjie_'+mark; + target.removeAdditionalSkill(`${mark}_${player.playerid}`); + target.unmarkAuto(mark,[player]); + if(log) game.log(target,'移去了',player,'给予的',`#g“${mark=='jianjie_huoji'?'龙印':'凤印'}”`); + else game.log(player,'移去了',target,'的',`#g“${mark=='jianjie_huoji'?'龙印':'凤印'}”`); } }, - targetprompt:["移走印","得到印"], - selectTarget:2, - multitarget:true, - content:function (){ - 'step 0' - if(targets[0].hasSkill('smh_huoji')&&targets[0].hasSkill('smh_lianhuan')){ - player.chooseControl('龙印','凤印').set('prompt','请选择要移动的印'); - } - else{ - if(targets[0].hasSkill('smh_huoji')) event._result={control:'龙印'}; - else event._result={control:'凤印'}; - } - 'step 1' - if(result.control=='龙印'){ - targets[0].removeSkill('smh_huoji'); - targets[1].addSkill('smh_huoji'); - } - else{ - targets[0].removeSkill('smh_lianhuan'); - targets[1].addSkill('smh_lianhuan'); - } - }, - ai:{ - order:8, - result:{ - target:function (player,target){ + subSkill:{ + use:{ + audio:'xinfu_jianjie', + enable:'phaseUse', + usable:1, + filter:function(event,player){ + if(player.phaseNumber<=1) return false; + const skill=lib.skill.jianjie; + return game.hasPlayer(function(current){ + return skill.hasMark('huoji',player,current)||skill.hasMark('lianhuan',player,current); + }); + }, + filterTarget:function(card,player,target){ if(ui.selected.targets.length==0){ - return get.attitude(player,target)<0?-999:-3; + const skill=lib.skill.jianjie; + return skill.hasMark('huoji',player,target)||skill.hasMark('lianhuan',player,target); + } + return true; + }, + selectTarget:2, + complexSelect:true, + complexTarget:true, + multitarget:true, + prompt:'移动场上的“龙印”或“凤印”', + targetprompt:['失去印','获得印'], + content:function(){ + 'step 0' + var skill=lib.skill.jianjie; + var bool1=skill.hasMark('huoji',player,targets[0]),bool2=skill.hasMark('lianhuan',player,targets[0]); + if(bool1&&bool2){ + player.chooseControl('龙印','凤印').set('prompt','选择要移动的“印”'); } else{ - return target.countCards('h')+1; + event._result={control:(bool1?'龙印':'凤印')} + } + 'step 1' + var skill=lib.skill.jianjie,mark=(result.control=='龙印'?'huoji':'lianhuan'); + skill.removeMark(mark,player,targets[0]); + skill.addMark(mark,player,targets[1]); + game.delayx(); + }, + ai:{ + order:8, + result:{ + target:function(player,target){ + if(ui.selected.targets.length==0){ + return get.attitude(player,target)<0?-999:-3; + } + else{ + return target.countCards('h')+1; + } + }, + }, + expose:0.4, + threaten:3, + }, + }, + die:{ + audio:'xinfu_jianjie', + trigger:{global:'die'}, + forced:true, + filter:function(event,player){ + const skill=lib.skill.jianjie; + return skill.hasMark('huoji',player,event.player)||skill.hasMark('lianhuan',player,event.player); + }, + content:function(){ + 'step 0' + if(lib.skill.jianjie.hasMark('huoji',player,trigger.player)){ + player.chooseTarget('荐杰:选择一名角色获得“龙印”',true).set('ai',(target)=>{ + return get.attitude(get.player(),target); + }); + } + else event.goto(3); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'fire'); + lib.skill.jianjie.addMark('huoji',player,target); + event.target=target; + game.delayx(); + } + else event.finish(); + 'step 2' + if(lib.skill.jianjie.hasMark('lianhuan',player,trigger.player)){ + player.chooseTarget('荐杰:选择一名角色获得“凤印”',true).set('ai',(target)=>{ + return get.attitude(get.player(),target); + }); + } + else event.finish(); + 'step 3' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'thunder'); + lib.skill.jianjie.addMark('lianhuan',player,target); + game.delayx(); + } + }, + logTarget:'player', + }, + huoji:{ + marktext:'龙', + intro:{ + name:"龙印", + content:"
  • 出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。
  • 若你同时拥有“凤印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", + }, + inherit:'rehuoji', + usable:3, + charlotte:true, + viewAsFilter:function(player){ + const storage=player.getStorage('jianjie_huoji'); + if(!storage.some(source=>{ + return source.isIn()&&source.hasSkill('jianjie'); + })) return false; + return player.hasCard(card=>get.color(card)=='red','she'); + }, + group:['jianjie_yeyan','jianjie_huoji_effect'], + }, + huoji_effect:{ + trigger:{player:'huogongBegin'}, + forced:true, + popup:false, + charlotte:true, + filter:function(event,player){ + return event.skill=='jianjie_huoji' + }, + content:function(){ + trigger.setContent(lib.skill.olhuoji.huogongContent); + }, + }, + lianhuan:{ + marktext:'凤', + intro:{ + name:"凤印", + content:"
  • 出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。
  • 若你同时拥有“龙印”,则你视为拥有技能〖业炎〗。(发动〖业炎〗时,弃置所有“龙印”和“凤印”)", + }, + charlotte:true, + usable:3, + filter:function(event,player){ + const storage=player.getStorage('jianjie_lianhuan'); + if(!storage.some(source=>{ + return source.isIn()&&source.hasSkill('jianjie'); + })) return false; + if(!player.hasCard(card=>get.suit(card)=='club','she')) return false; + return (event.type=='phase'||event.filterCard({name:'tiesuo'},player,event)); + }, + inherit:'ollianhuan', + group:['jianjie_yeyan','jianjie_lianhuan_effect'], + }, + lianhuan_effect:{ + trigger:{player:'useCard2'}, + filter:function(event,player){ + if(event.skill!='jianjie_lianhuan') return false; + var info=get.info(event.card); + if(info.allowMultiple==false) return false; + if(event.targets&&!info.multitarget){ + if(game.hasPlayer(current=>{ + return !event.targets.contains(current)&&lib.filter.targetEnabled2(event.card,player,current); + })) return true; + } + return false; + }, + charlotte:true, + forced:true, + popup:false, + content:function(){ + 'step 0' + player.chooseTarget('是否为'+get.translation(trigger.card)+'额外指定一个目标?',(card,player,target)=>{ + return !_status.event.sourcex.contains(target)&&lib.filter.targetEnabled2(_status.event.card,player,target); + }).set('sourcex',trigger.targets).set('ai',function(target){ + var player=_status.event.player; + return get.effect(target,_status.event.card,player,player); + }).set('card',trigger.card); + 'step 1' + if(result.bool){ + if(!event.isMine()&&!event.isOnline()) game.delayex(); + } + else event.finish(); + 'step 2' + if(result.bool){ + var targets=result.targets; + player.line(targets,'thunder'); + trigger.targets.addArray(targets); + game.log(targets,'也成为了',trigger.card,'的目标'); } }, }, - expose:0.4, - threaten:3, - }, - }, - "smh_huoji":{ - charlotte:true, - group:["smh_yeyan"], - mark:true, - marktext:"龙", - intro:{ - name:"龙印", - content:"
  • 出牌阶段限三次,你可以将一张红色牌当【火攻】使用。
  • 若你同时拥有「凤印」,则你视为拥有技能〖业炎〗。(发动〖业炎〗后,弃置龙印和凤印)", - }, - usable:3, - audio:2, - enable:"chooseToUse", - position:"hes", - filterCard:function(card){ - return get.color(card)=='red'; - }, - viewAs:{ - name:"huogong", - }, - viewAsFilter:function (player){ - if(player.hasSkill('huoji')) return false; - if(!game.hasPlayer(function(current){ - return current.hasSkill('xinfu_jianjie'); - })) return false; - if(!player.countCards('hes',{color:'red'})) return false; - }, - prompt:"将一张红色牌当火攻使用", - check:function (card){ - var player=_status.currentPhase; - if(player.countCards('h')>player.hp){ - return 6-get.value(card); - } - return 4-get.value(card) - }, - ai:{ - fireAttack:true, - }, - }, - "smh_lianhuan":{ - audio:2, - charlotte:true, - enable:"phaseUse", - filter:function (event,player){ - if(player.hasSkill('lianhuan')||player.hasSkill('xinlianhuan')) return false; - if(!game.hasPlayer(function(current){ - return current.hasSkill('xinfu_jianjie'); - })) return false; - if((player.getStat().skill.smh_lianhuan||0)+(player.getStat().skill.smh_lianhuan1||0)>=3) return false; - return player.countCards('hs',{suit:'club'})>0; - }, - filterCard:function (card){ - return get.suit(card)=='club'; - }, - viewAs:{ - name:"tiesuo", - }, - position:'hs', - prompt:"将一张梅花牌当铁锁连环使用", - check:function (card){return 6-get.value(card)}, - mark:true, - marktext:"凤", - intro:{ - name:"凤印", - content:"
  • 出牌阶段限三次,你可以将你的任意一张梅花手牌当作【铁索连环】使用或重铸。", - }, - group:["smh_lianhuan1"], - }, - "xinfu_jianjie2":{ - trigger:{ - global:"dieAfter", - }, - forced:true, - direct:true, - silent:true, - popup:false, - filter:function (event,player){ - return event.player.hasSkill('smh_huoji')||event.player.hasSkill('smh_lianhuan'); - }, - content:function (){ - "step 0" - player.logSkill('xinfu_jianjie'); - "step 1" - if(trigger.player.hasSkill('smh_huoji')){ - player.chooseTarget('请将'+get.translation(trigger.player)+'的「龙印」交给一名角色',true).set('ai',function(target){ - var player=_status.event.player; - return 10+get.attitude(player,target); - }); - }else event.goto(2); - "step 2" - if(result.bool&&result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(target,'fire'); - target.addSkill('smh_huoji'); - game.delay(); - } - "step 3" - if(trigger.player.hasSkill('smh_lianhuan')){ - player.chooseTarget('请将'+get.translation(trigger.player)+'的「凤印」交给一名角色',true).set('ai',function(target){ - var player=_status.event.player; - return 10+get.attitude(player,target); - }); - }else event.finish(); - "step 4" - if(result.bool&&result.targets&&result.targets.length){ - var target=result.targets[0]; - player.line(target,'green'); - target.addSkill('smh_lianhuan'); - game.delay(); - } - }, - }, - "smh_lianhuan1":{ - enable:"phaseUse", - filter:function (event,player){ - if(player.hasSkill('lianhuan')||player.hasSkill('xinlianhuan')) return false; - if(!game.hasPlayer(function(current){ - return current.hasSkill('xinfu_jianjie'); - })) return false; - if((player.getStat().skill.smh_lianhuan||0)+(player.getStat().skill.smh_lianhuan1||0)>=3) return false; - return player.hasCard(card=>lib.skill.smh_lianhuan1.filterCard(card,player),'h'); - }, - filterCard:(card,player)=>get.suit(card)=='club'&&player.canRecast(card), - check:function(card){ - return -1; - }, - content:function(){ - player.recast(cards); - }, - discard:false, - lose:false, - delay:false, - prompt:"将一张梅花牌置入弃牌堆并摸一张牌", - ai:{ - basic:{ - order:1, - }, - result:{ - player:1 - } - }, - forced:true - }, - "smh_yeyan":{ - unique:true, - enable:"phaseUse", - audio:3, - skillAnimation:true, - animationColor:'gray', - prompt:"限定技,出牌阶段,你可以对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。", - filter:function (event,player){ - if(!game.hasPlayer(function(current){ - return current.hasSkill('xinfu_jianjie'); - })) return false; - return player.hasSkill('smh_lianhuan'); - }, - filterTarget:function (card,player,target){ - var length=ui.selected.cards.length; - return (length==0||length==4); - }, - filterCard:function (card){ - var suit=get.suit(card); - for(var i=0;i0&&lianhuan.some(source=>{ + return huoji.includes(source)&&source.isIn()&&source.hasSkill('jianjie'); + }) + }, + contentBefore:function(){ + player.awakenSkill('jianjie_yeyan'); + var skill=lib.skill.jianjie; + var huoji=player.getStorage('jianjie_huoji').slice(0),lianhuan=player.getStorage('jianjie_lianhuan').slice(0); + huoji.forEach(source=>{ + skill.removeMark('huoji',source,player,true); + }); + lianhuan.forEach(source=>{ + skill.removeMark('lianhuan',source,player,true); + }); + }, + ai:{ + order:1, + fireAttack:true, + result:{ + //等PZ157来写 + /*target:function(player,target){ + if(target.hasSkillTag('nofire')) return 0; + if(lib.config.mode=='versus') return -1; + if(player.hasUnknown()) return 0; + return get.damageEffect(target,player); + }*/ + } + } }, }, }, - "xinfu_yinshi":{ + xinfu_yinshi:{ audio:2, - trigger:{ - player:"damageBegin4", - }, + trigger:{player:'damageBegin4'}, forced:true, - //priority:15, filter:function (event,player){ - if(player.hasSkill('smh_huoji')||player.hasSkill('smh_lianhuan')) return false; + const skill=lib.skill.jianjie; + if(skill.hasMark('huoji',player)||skill.hasMark('lianhuan',player)) return false; if(!player.hasEmptySlot(2)) return false; if(event.hasNature()) return true; return get.type(event.card,'trick')=='trick'; @@ -23828,7 +24615,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nothunder:true, effect:{ target:function (card,player,target,current){ - if(target.hasSkill('smh_huoji')||target.hasSkill('smh_lianhuan')) return; + const skill=lib.skill.jianjie; + if(skill.hasMark('huoji',target)||skill.hasMark('lianhuan',target)) return false; if(player==target&&get.subtype(card)=='equip2'){ if(get.equipValue(card)<=8) return 0; } @@ -23911,7 +24699,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).setContent('gaincardMultiple'); }, }, - "jianjie_faq":{}, "xinfu_wuniang":{ trigger:{ player:["useCard","respond"], @@ -24325,6 +25112,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, dynamicTranslate:{ + shanduan:function(player){ + if(player.storage.shanduan) return '锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=['+get.translation(player.storage.shanduan)+']中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。'; + return '锁定技。①摸牌/出牌/弃牌阶段开始时,你为本回合摸牌阶段摸牌数/攻击范围和使用【杀】的限制次数/手牌上限的默认值从数组R=[1,2,3,4]中分配数值。②当你于回合外受到伤害后,你令下回合〖善断①〗以此法分配的数值集合R中的最小值+1。'; + }, kunfen:function(player){ if(player.storage.kunfen) return '结束阶段开始时,你可以失去1点体力,然后摸两张牌。'; return '锁定技,结束阶段开始时,你失去1点体力,然后摸两张牌。'; @@ -24397,13 +25188,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.storage.olsaogu) return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。'; return '转换技。①出牌阶段,你可以。阴:弃置两张牌(不能包含你本阶段弃置过的花色),然后使用其中的【杀】;阳:摸一张牌。②结束阶段,你可以弃置一张牌,令一名其他角色执行你当前〖扫谷①〗的分支。'; }, - skill_lvboshe:function(player){ - if(player.storage.skill_lvboshe) return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,你可以令其进行一个额外回合。'; - return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,你可以令其进行一个额外回合。'; + oldongdao:function(player){ + if(player.storage.oldongdao) return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。'; + return '农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。'; + }, + ollangdao:function(player){ + var str='当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:'; + var list=[ + '1.令此【杀】伤害基数+1;', + '2.令你可以为此【杀】多选择一个目标;', + '3.令此【杀】不可被响应。' + ]; + var storage=player.getStorage('ollangdao'); + list.forEach((item,index)=>{ + if(storage.includes(index)){ + str+=`${item}`; + } + else str+=item; + }) + str+='然后若没有角色因此【杀】死亡,你移除本次被选择的项。'; + return str; }, }, characterReplace:{ - shixie:['shixie','dc_shixie'], + guanyinping:['guanyinping','old_guanyinping'], + shixie:['shixie','dc_shixie','old_shixie'], caoshuang:['caoshuang','ns_caoshuang'], caoang:['caoang','yj_caoang','tw_caoang'], caohong:['caohong','tw_re_caohong','tw_caohong','yj_caohong'], @@ -24413,13 +25222,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zumao:['zumao','tw_zumao'], tw_beimihu:['beimihu','tw_beimihu'], panfeng:['panfeng','re_panfeng','std_panfeng'], - sunluyu:['sunluyu','re_sunluyu'], + sunluyu:['sunluyu','re_sunluyu','mb_sunluyu'], jin_simazhao:['jin_simazhao','simazhao','sp_simazhao'], jin_wangyuanji:['jin_wangyuanji','wangyuanji','sp_wangyuanji'], wangyun:['wangyun','dc_wangyun','re_wangyun','jsrg_wangyun','old_wangyun','pe_wangyun'], zhangliang:['re_zhangliang','zhangliang'], lingju:['lingju','old_lingju'], - guansuo:['guansuo','ol_guansuo'], + guansuo:['guansuo','dc_guansuo'], zhangxingcai:['zhangxingcai','old_zhangxingcai'], lisu:['ol_lisu','lisu'], fuwan:['fuwan','tw_fuwan','sp_fuwan'], @@ -24452,12 +25261,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yuantanyuanshang:['yuantanyuanshang','yuantanyuanxiyuanshang'], ruiji:['ruiji','dc_ruiji'], jsp_huangyueying:['jsp_huangyueying','re_jsp_huangyueying'], - ganfuren:['ganfuren','dc_ganfuren'], + ganfuren:['ganfuren','dc_ganfuren','jsp_ganfuren'], wenqin:['wenqin','pe_wenqin'], zhouqun:['ol_zhouqun','zhouqun'], qianzhao:['ol_qianzhao','qianzhao'], ol_pengyang:['ol_pengyang','sp_pengyang'], ol_luyusheng:['ol_luyusheng','luyusheng'], + fanjiangzhangda:['fanjiangzhangda','jsrg_fanjiangzhangda'], }, translate:{ "xinfu_lingren":"凌人", @@ -24467,7 +25277,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "lingren_jianxiong":"奸雄", "lingren_jianxiong_info":"当你受到伤害后,你可以获得对你造成伤害的牌并摸一张牌。", "lingren_xingshang":"行殇", - "lingren_xingshang_info":"当有角色死亡后,你可以选择一项:1.回复一点体力。2.获得该角色的所有牌。", + "lingren_xingshang_info":"当有角色死亡后,你可以选择一项:1.回复1点体力。2.获得该角色的所有牌。", "xinfu_fujian":"伏间", "xinfu_fujian_info":"锁定技,结束阶段开始时,你观看一名随机的其他角色的随机X张手牌。(X为场上手牌最少的角色的手牌数)", "xinfu_xionghuo":"凶镬", @@ -24480,30 +25290,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xionghuo_low_info":"", "xinfu_shajue":"杀绝", "xinfu_shajue_info":"锁定技,其他角色进入濒死状态时,若其体力值小于0,则你获得一个“暴戾”标记,并获得使其进入濒死状态的牌。", - "xinfu_jianjie":"荐杰", - "xinfu_jianjie_info":"你的第一个准备阶段,你令两名其他角色分别获得龙印与凤印;出牌阶段限一次(你的第一个回合除外),或当拥有龙印、凤印的角色死亡时,你可以转移龙印、凤印。", - "xinfu_jianjie1":"荐杰", - "xinfu_jianjie1_info":"", - "smh_huoji":"火计", - "smh_huoji_info":"", - "smh_lianhuan":"连环", - "smh_lianhuan_info":"", - "xinfu_jianjie2":"荐杰", - "xinfu_jianjie2_info":"", - "smh_lianhuan1":"连铸", - "smh_lianhuan1_info":"", - "smh_yeyan":"业炎", - "smh_yeyan_info":"", - "xinfu_yinshi":"隐士", - "xinfu_yinshi_info":"锁定技,若你没有龙印、凤印且防具栏为空,则当你受到属性伤害或锦囊牌造成的伤害时,防止此伤害。", - "xinfu_chenghao":"称好", - "xinfu_chenghao_info":"当一名角色受到属性伤害后,若其存活且其武将牌横置且是伤害传导的起点,则你可以观看牌堆顶的X张牌并分配给任意角色。(X为横置的角色数量且包含该角色)", + xinfu_jianjie:"荐杰", + jianjie:'荐杰', + jianjie_info:'①你的第一个准备阶段开始时,你令一名其他角色获得“龙印”,然后令另一名其他角色获得“凤印”。②出牌阶段限一次。若当前回合不是你的第一个回合,则你可以移动场上的“龙印”或“凤印”。③拥有“龙印”或“凤印”的其他角色死亡时,你转移该角色的“龙印”和“凤印”。④拥有“龙印”/“凤印”的角色视为拥有〖火计〗/〖连环〗,且同时拥有这两种标记的角色视为拥有〖业炎〗。', + jianjie_huoji:'火计', + jianjie_huoji_effect:'火计', + jianjie_huoji_info:'出牌阶段限三次。你可以将一张红色牌当作【火攻】使用,且你以此法使用【火攻】的作用效果改为“目标角色随机展示一张手牌A,然后你可以弃置一张与A颜色相同的牌,对目标造成1点火属性伤害”。', + jianjie_lianhuan:'连环', + jianjie_lianhuan_effect:'连环', + jianjie_lianhuan_info:'出牌阶段限三次。你可以将一张♣牌当作【铁索连环】使用或重铸,且你以此法使用【铁索连环】的目标数上限+1。', + jianjie_yeyan:'业炎', + jianjie_yeyan_info:'限定技。出牌阶段,你可以移去你所有的“龙印”和“凤印”,对一至三名角色造成至多共3点火焰伤害(你可以任意分配每名目标角色受到的伤害点数),若你将对一名角色分配2点或更多的火焰伤害,你须先弃置四张不同花色的手牌再失去3点体力。', + xinfu_yinshi:"隐士", + xinfu_yinshi_info:"锁定技,若你没有“龙印”和“凤印”且防具栏为空,则当你受到属性伤害或锦囊牌造成的伤害时,防止此伤害。", + xinfu_chenghao:"称好", + xinfu_chenghao_info:"当一名角色受到属性伤害后,若其存活且其武将牌横置且是伤害传导的起点,则你可以观看牌堆顶的X张牌并分配给任意角色。(X为横置的角色数量且包含该角色)", "jianjie_faq":"关于龙凤印", "jianjie_faq_info":"龙印效果:视为拥有〖火计〗。凤印效果:视为拥有〖连环〗。(均一回合限使用三次) 龙凤印齐全:视为拥有〖业炎〗,〖业炎〗发动后移除龙凤印。", "xinfu_wuniang":"武娘", "xinfu_wuniang_info":"当你使用或打出【杀】时,你可以获得一名其他角色的一张牌。若如此做,该角色和场上所有的“关索”各摸一张牌。", "xinfu_xushen":"许身", - "xinfu_xushen_info":"限定技,当一名男性角色使用【桃】令你脱离濒死状态时,若场上没有“关索”,则其可以将自己的一张武将牌变更为“关索”。然后你回复一点体力,并获得技能〖镇南〗。", + "xinfu_xushen_info":"限定技,当一名男性角色使用【桃】令你脱离濒死状态时,若场上没有“关索”,则其可以将自己的一张武将牌变更为“关索”。然后你回复1点体力,并获得技能〖镇南〗。", "xinfu_zhennan":"镇南", "xinfu_zhennan_info":"当你成为【南蛮入侵】的目标时,你可以对一名其他角色造成1-3点随机伤害。", "xinfu_falu":"法箓", @@ -24542,9 +25349,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhugejin:'诸葛瑾', zhugeke:'诸葛恪', guanyinping:'关银屏', - gz_ganfuren:'甘夫人', - ganfuren:'SP甘夫人', - ganfuren_prefix:'SP', sunhao:'孙皓', chengyu:'程昱', simalang:'司马朗', @@ -24595,8 +25399,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sunluyu:'OL孙鲁育', sunluyu_prefix:'OL', hanba:'旱魃', - panfeng:'OL潘凤', - panfeng_prefix:'OL', gz_panfeng:'潘凤', zumao:'祖茂', daxiaoqiao:'大乔小乔', @@ -24701,27 +25503,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "huanshi_three_info":"一名友方角色的判定牌生效前,你可打出一张牌代替之。", yizan:"翊赞", - yizan_info:"你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用", + yizan_info:"你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", yizan0:"翊赞", - yizan0_info:"你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用", + yizan0_info:"你可以将两张牌(其中至少一张是基本牌)当任意基本牌牌使用。", yizan1:"翊赞", - yizan1_info:"你可以将两张牌(其中至少一张是基本牌)当【闪】打出", + yizan1_info:"你可以将两张牌(其中至少一张是基本牌)当【闪】打出。", yizan2:"翊赞", - yizan2_info:"你可以将一张基本牌当任意基本牌牌使用", + yizan2_info:"你可以将一张基本牌当任意基本牌牌使用。", yizan3:"翊赞", - yizan3_info:"你可以将一张基本牌当【闪】打出 ", + yizan3_info:"你可以将一张基本牌当【闪】打出。", yizan5:"翊赞", - yizan5_info:"你可以将两张牌(其中至少一张是基本牌)当【杀】打出", + yizan5_info:"你可以将两张牌(其中至少一张是基本牌)当【杀】打出。", yizan6:"翊赞", - yizan6_info:"你可以将一张基本牌当【杀】打出", + yizan6_info:"你可以将一张基本牌当【杀】打出。", longyuan:"龙渊", - longyuan_info:"觉醒技 当你使用或打出基本牌时,若你已经已累计发动过3次【翊赞】,你将【翊赞】改为“你可以将一张基本牌当任意基本牌牌使用或打出”。", + longyuan_info:"觉醒技 当你使用或打出基本牌时,若你已经已累计发动过3次〖翊赞〗,你将〖翊赞〗改为“你可以将一张基本牌当任意基本牌牌使用或打出”。", wuniang:"武娘", - wuniang_info:"你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后该角色摸一张牌;若“关索”在场,你可令“关索”也摸一张牌", + wuniang_info:"你使用或打出【杀】时,你可以获得一名其他角色的一张牌,然后该角色摸一张牌;若“关索”在场,你可令“关索”也摸一张牌。", zhennan:"镇南", - zhennan_info:"当你成为【南蛮入侵】的目标时,你可令一名其他角色随机受到一至三点伤害", + zhennan_info:"当你成为【南蛮入侵】的目标时,你可令一名其他角色随机受到1至3点伤害。", xushen:"许身", - xushen_info:"当其他男性角色令你脱离濒死状态时,若“关索”不在场,其可以选择是否用“关索”替换其武将牌,然后你回复一点体力并获得技能【镇南】", + xushen_info:"当其他男性角色令你脱离濒死状态时,若“关索”不在场,其可以选择是否用“关索”替换其武将牌,然后你回复1点体力并获得技能〖镇南〗。", wanwei:'挽危', wanwei_info:'当你因被其他角色获得或弃置而失去牌时,你可以改为自己选择失去的牌。', @@ -24775,11 +25577,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wylianji_info:'出牌阶段限一次,你可以展示一张【杀】或黑色锦囊牌,并令一名其他角色将牌堆中的随机一张武器牌置入装备区(可替换原装备)。然后该角色选择一项:1.对除你以外的角色使用该牌,并将装备区里的武器牌交给该牌的一个目标角色;2.令你对其使用此牌,然后获得此牌,并将装备区内的武器牌交给你。', // from here moucheng:'谋逞', - moucheng_info:'觉醒技,当其他角色使用因〖连计〗交给其的牌累计造成伤害达到3点后,你失去技能〖连计〗,然后获得技能〖矜功〗', + moucheng_info:'觉醒技,当其他角色使用因〖连计〗交给其的牌累计造成伤害达到3点后,你失去技能〖连计〗,然后获得技能〖矜功〗。', jingong:'矜功', jingong2:'矜功', jingong_backup:'矜功', - jingong_info:'出牌阶段限一次,你可以将一张装备牌或【杀】当做一张随机锦囊牌使用(三选一,其中一张为【美人计】或【笑里藏刀】),然后本回合的结束阶段,若你于本回合内未造成过伤害,你失去1点体力', + jingong_info:'出牌阶段限一次,你可以将一张装备牌或【杀】当做一张随机锦囊牌使用(三选一,其中一张为【美人计】或【笑里藏刀】),然后本回合的结束阶段,若你于本回合内未造成过伤害,你失去1点体力。', fenyue:'奋钺', fenyue2:'奋钺', fenyue2_bg:'钺', @@ -24827,7 +25629,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refuhan:'扶汉', refuhan_info:'限定技,回合开始时,你可以移去所有"梅影"标记并摸等量的牌,然后从X张蜀势力武将牌中选择并获得至多两个技能(限定技、觉醒技、隐匿技、使命技、主公技除外)。若此时你是体力值最低的角色,你回复1点体力(X为场上角色数,且X∈[4,+∞))。', yjixi:'觊玺', - yjixi_info:'觉醒技,结束阶段,若你连续三回合没有因〖庸肆〗而失去过体力,则你增加1点体力上限并回复1点体力,然后选择一项:获得技能〖妄尊〗;摸两张牌并获得当前主公的主公技。', + yjixi_info:'觉醒技,结束阶段,若你已连续三个自己回合未失去过体力,则你增加1点体力上限并回复1点体力,然后选择一项:获得技能〖妄尊〗;摸两张牌并获得当前主公的主公技。', xinyongsi:'庸肆', xinyongsi1:'庸肆', xinyongsi2:'庸肆', @@ -24836,7 +25638,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xiehui2:'黠慧', xiehui_info:'锁定技,你的黑色牌不计入手牌上限;其他角色获得你的黑色牌时,其不能使用、打出、弃置这些牌直到其体力值扣减为止。', lianzhu:'连诛', - lianzhu_info:'出牌阶段限一次,你可以展示并交给一名其他角色一张牌,若此牌为黑色,其选择一项:1.你摸两张牌;2.弃置两张牌', + lianzhu_info:'出牌阶段限一次,你可以展示并交给一名其他角色一张牌,若此牌为黑色,其选择一项:1.你摸两张牌;2.弃置两张牌。', shanjia:'缮甲', shanjia_info:'出牌阶段开始时,你可以摸X张牌,然后弃置等量的牌。若你以此法弃置了装备区内的牌,则你可以视为使用一张【杀】。(X为你于本局游戏内使用过的装备牌数且最大为7)', tuifeng:'推锋', @@ -24845,7 +25647,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ziyuan:'资援', ziyuan_info:'出牌阶段限一次,你可以将任意张点数之和为13的手牌交给一名其他角色,然后该角色回复1点体力。', jugu:'巨贾', - jugu_info:'锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)', + jugu_info:'锁定技,1.你的手牌上限+X。2.游戏开始时,你摸X张牌(X为你的体力上限)。', hongde:'弘德', hongde_info:'当你一次获得或失去至少两张牌后,你可以令一名其他角色摸一张牌。', dingpan:'定叛', @@ -24859,9 +25661,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhenlue:'缜略', zhenlue_info:'锁定技,你使用的普通锦囊牌不能被【无懈可击】响应;你不能成为延时锦囊牌的目标。', jianshu:'间书', - jianshu_info:'限定技,出牌阶段,你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,然后令这两名角色拼点。赢的角色弃置两张牌,没赢的角色失去一点体力。', + jianshu_info:'限定技,出牌阶段,你可以将一张黑色手牌交给一名其他角色,并选择另一名其他角色,然后令这两名角色拼点。赢的角色弃置两张牌,没赢的角色失去1点体力。', yongdi:'拥嫡', - yongdi_info:'限定技,准备阶段开始时,你可令一名其他男性角色增加一点体力上限并回复1点体力,然后若该角色的武将牌上有主公技且其不为主公,其获得此主公技。', + yongdi_info:'限定技,准备阶段开始时,你可令一名其他男性角色增加1点体力上限并回复1点体力,然后若该角色的武将牌上有主公技且其不为主公,其获得此主公技。', regushe:'鼓舌', regushe_info:'出牌阶段,若X小于7,则你可以用一张手牌与至多三名角色同时拼点,然后依次结算拼点结果,没赢的角色选择一项:1.弃置一张牌;2.令你摸一张牌。若你没赢,你获得一个“饶舌”标记。当你获得第7个“饶舌”标记时,你死亡。(X为你的“饶舌”标记数与本回合因“鼓舌”拼点而胜利的次数之和)', rejici:'激词', @@ -24903,21 +25705,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhenwei2:'镇卫', zhenwei_info:'当一名其他角色成为【杀】或黑色锦囊牌的目标时(使用者不是你),若该角色的体力值小于你且此牌的目标角色数为1,你可以弃置一张牌。若如此做,你选择一项:1、摸一张牌,然后将此【杀】或黑色锦囊牌转移给你;2、令此【杀】或黑色锦囊牌无效,然后将此【杀】或黑色锦囊牌置于使用者的武将牌旁,若如此做,当前回合结束后,使用者获得使用者武将牌旁的这些牌。', xingwu:'星舞', - xingwu_info:'弃牌阶段开始时,你可以将一张与你本回合使用的牌颜色均不同的手牌置于武将牌上:若你有至少三张“星舞”牌,你移去“星舞”牌并选择一名男性角色,该角色受到2点伤害并弃置其装备区的所有牌', + xingwu_info:'弃牌阶段开始时,你可以将一张与你本回合使用的牌颜色均不同的手牌置于武将牌上:若你有至少三张“星舞”牌,你移去“星舞”牌并选择一名男性角色,该角色受到2点伤害并弃置其装备区的所有牌。', luoyan:'落雁', - luoyan_info:'锁定技。若你的武将牌上有“星舞牌”,你拥有“天香”和“流离”', + luoyan_info:'锁定技。若你的武将牌上有“星舞牌”,你拥有“天香”和“流离”。', yinbing:'引兵', yinbing_info:'结束阶段开始时,你可以将至少一张非基本牌置于武将牌上。每当你受到【杀】或【决斗】的伤害后,你移去一张「引兵」牌。', juedi:'绝地', juedi_info:'锁定技,准备阶段,若你的武将牌上有「引兵」牌,你选择一项:1.移去「引兵」牌,将手牌补至体力上限数;2.将「引兵」牌交给一名体力值不大于你的其他角色,其回复1点体力并摸等量的牌。', kuangfu:'狂斧', - kuangfu_info:'当你使用【杀】造成伤害时,你可以选择一项:弃置其装备区内的一张牌,或将其装备区内的一张牌移动到你的装备区内。', + kuangfu_info:'当你使用【杀】造成伤害后,你可以选择一项:弃置其装备区内的一张牌,或将其装备区内的一张牌移动到你的装备区内。', xintan:'心惔', - xintan_info:'出牌阶段限一次,你可以移去两张「焚」并选择一名角色,该角色失去一点体力。', + xintan_info:'出牌阶段限一次,你可以移去两张「焚」并选择一名角色,该角色失去1点体力。', fentian:'焚天', - fentian_info:'锁定技,结束阶段开始时,若你的手牌数少于体力值,你须选择一名攻击范围内的角色,将其一张牌置于你的武将牌上,称为「焚」。锁定技,你的攻击范围+X(X为「焚」的数量)', + fentian_info:'锁定技,结束阶段开始时,若你的手牌数少于体力值,你须选择一名攻击范围内的角色,将其一张牌置于你的武将牌上,称为「焚」。锁定技,你的攻击范围+X(X为「焚」的数量)。', zhiri:'炙日', - zhiri_info:'觉醒技,准备阶段开始时,若你的「焚」的数量不小于3,你减1点体力上限,然后获得技能〖心惔〗', + zhiri_info:'觉醒技,准备阶段开始时,若你的「焚」的数量不小于3,你减1点体力上限,然后获得技能〖心惔〗。', meibu:'魅步', meibu_info:'其他角色的出牌阶段开始时,若你不在其攻击范围内,你可以令该角色的锦囊牌均视为【杀】,直到该角色以此法使用了一张【杀】或回合结束。若如此做,则直到回合结束,视为你在其攻击范围内。', mumu:'穆穆', @@ -24929,7 +25731,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhanyi_info:'出牌阶段限一次,你可以弃置一张牌并失去1点体力,然后根据你弃置的牌获得以下效果直到回合结束:基本牌,你可以将一张基本牌当作【杀】、【酒】或【桃】使用;锦囊牌,摸两张牌且你使用的牌无距离限制;装备牌,你使用【杀】指定目标角色后,其弃置两张牌。', nuzhan:'怒斩', nuzhan2:'怒斩', - nuzhan_info:'锁定技,你使用的由一张锦囊牌转化的【杀】不计入出牌阶段的次数限制;锁定技,你使用的由一张装备牌转化的【杀】的伤害值基数+1', + nuzhan_info:'锁定技,你使用的由一张锦囊牌转化的【杀】不计入出牌阶段的次数限制;锁定技,你使用的由一张装备牌转化的【杀】的伤害值基数+1。', danji:'单骑', danji_info:'觉醒技,准备阶段开始时,若你的手牌数大于你的体力值且本局游戏的主公不为刘备,你减1点体力上限,然后获得〖马术〗和〖怒斩〗。', jieyuan:'竭缘', @@ -24970,7 +25772,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yishe_info:'结束阶段开始时,若你的武将牌上没有「米」,则你可以摸两张牌。若如此做,你将两张牌置于武将牌上,称为「米」;当有「米」移至其他区域后,若你的武将牌上没有「米」,则你回复1点体力。', bushi:'布施', midao:'米道', - bushi_info:'当你受到1点伤害后,或其他角色受到你造成的1点伤害后,受到伤害的角色可以获得你的一张「米」', + bushi_info:'当你受到1点伤害后,或其他角色受到你造成的1点伤害后,受到伤害的角色可以获得你的一张「米」。', midao_info:'一名角色的判定牌生效前,你可以打出一张「米」代替之。', fengpo:'凤魄', fengpo_info:'每种牌名各限一次。当你每回合使用的第一张【杀】或【决斗】指定目标后,若目标角色数为1,你可以选择一项:1.摸X张牌,令此牌的伤害值基数+1;2.摸一张牌,令此牌的伤害值基数+X(X为其♦牌的数量)。', @@ -25072,9 +25874,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yawang:'雅望', xunzhi:'殉志', fanxiang:'返乡', - fanxiang_info:'觉醒技,准备阶段开始时,若场上有已受伤且你发动过〖良助〗的选项二的角色,则你加1点体力上限并回复1点体力,失去技能〖良助〗并获得技能〖枭姬〗', + fanxiang_info:'觉醒技,准备阶段开始时,若场上有已受伤且你发动过〖良助〗的选项二的角色,则你加1点体力上限并回复1点体力,失去技能〖良助〗并获得技能〖枭姬〗。', xunzhi_info:'准备阶段开始时,若你的上家和下家与你的体力值均不相等,你可以失去1点体力。若如此做,你本局内手牌上限+2。', - yawang_info:'锁定技,摸牌阶段开始时,你改为摸X张牌,然后你于本回合的出牌阶段内至多使用X张牌(X为与你体力值相等的角色数)', + yawang_info:'锁定技,摸牌阶段开始时,你改为摸X张牌,然后你于本回合的出牌阶段内至多使用X张牌(X为与你体力值相等的角色数)。', jilei_info:'当你受到有来源的伤害后,你可以声明一种牌的类别。若如此做,你令伤害来源不能使用、打出或弃置此类别的手牌直到其下个回合开始。', danlao:'啖酪', danlao_info:'当你成为【杀】或普通锦囊牌的目标后,若此牌的目标数大于1,则你可以摸一张牌,令此牌对你无效。', @@ -25085,7 +25887,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rechouhai:'仇海', rechouhai_info:'锁定技,当你受到渠道为【杀】的伤害时,若你没有手牌,此伤害+1。', guiming:'归命', - guiming_info:'主公技,锁定技,你将残蚀描述中的“已受伤角色”改为“已受伤角色或其他吴势力角色”', + guiming_info:'主公技,锁定技,你将残蚀描述中的“已受伤角色”改为“已受伤角色或其他吴势力角色”。', canshi:'残蚀', canshi2:'残蚀', canshi_info:'摸牌阶段开始时,你可以改为摸X张牌(X为已受伤的角色数),若如此做,当你于此回合内使用基本牌或锦囊牌时,你弃置一张牌。', @@ -25102,7 +25904,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ oldcihuai_info:'出牌阶段开始时,你可以展示手牌。若其中没有【杀】,则当你于此阶段内手牌数变化之前/有角色死亡之前需要使用【杀】时,你可以使用无对应实体牌的【杀】。', cihuai:'刺槐', cihuai_info:'出牌阶段开始时,若你的手牌中没有【杀】,则你可以展示你的手牌,视为对一名角色使用一张【杀】。', - gongao_info:'锁定技,当一名角色死亡后,你增加一点体力上限,回复一点体力。', + gongao_info:'锁定技,当一名角色死亡后,你增加1点体力上限,回复1点体力。', juyi:'举义', juyi_info:'觉醒技,准备阶段开始时,若你的体力上限大于存活角色数,你摸等同于体力上限张数的牌,然后获得技能〖崩坏〗和〖威重〗。', weizhong:'威重', @@ -25125,34 +25927,34 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liangzhu_info:'当一名角色于其出牌阶段内回复体力时,你可以选择一项:1、摸一张牌;2、令该角色摸两张牌。', mingshi_info:'当你受到伤害时,若伤害来源的体力值大于你,你可以弃置一张黑色手牌,令伤害值-1。', lirang_info:'当你的牌因弃置而置入弃牌堆后,你可以将其中的任意张牌交给其他角色。', - moukui_info:'当你使用【杀】指定目标后,你可以选择一项:摸一张牌,或弃置其一张牌。若如此做,当此【杀】被【闪】抵消时,目标角色弃置你的一张牌。 ', + moukui_info:'当你使用【杀】指定目标后,你可以选择一项:摸一张牌,或弃置其一张牌。若如此做,当此【杀】被【闪】抵消时,目标角色弃置你的一张牌。', qiangwu_info:'出牌阶段,你可以进行判定。若如此做,直到回合结束,你使用点数小于判定结果的【杀】时不受距离限制,且你使用点数大于判定结果的【杀】时无使用次数限制。', shenxian_info:'每名角色的回合限一次,你的回合外,当有其他角色因弃置而失去基本牌时,你可以摸一张牌。', oldshenxian_info:'你的回合外,每当有其他角色因弃置而失去基本牌时,你可以摸一张牌。', qiluan_info:'一名角色的回合结束时,你可以摸3X+Y张牌。(X为你本回合内杀死过的角色数,Y为本回合内其他角色杀死过的角色数)', //qiluan_info_guozhan:'一名角色的回合结束时,若你于回合内杀死过角色,则你可以摸三张牌。', - zhendu_info:'一名角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若该角色不是你,你对其造成一点伤害。', - //zhendu_info_guozhan:'其他角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若如此做,你对其造成一点伤害。', + zhendu_info:'一名角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若该角色不是你,你对其造成1点伤害。', + //zhendu_info_guozhan:'其他角色的出牌阶段开始时,你可以弃置一张手牌,视为该角色使用了一张【酒】。若如此做,你对其造成1点伤害。', shangyi_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后弃置其中的一张黑色牌。', zniaoxiang_info:'锁定技,当你使用【杀】指定目标后,你令目标角色响应此【杀】所需要使用的【闪】的数目+1。', shoucheng_info:'当一名角色于其回合外失去手牌时,若其没有手牌,则你可令该角色摸一张牌。', shengxi_info:'弃牌阶段开始时,若你本回合内未造成过伤害,则你可以摸两张牌。', hengzheng_info:'摸牌阶段开始时,若你的体力值为1或你没有手牌,则你可以放弃摸牌,改为获得每名其他角色区域内的一张牌。', - cunsi_info:'限定技,出牌阶段,你可以将所有手牌交给一名男性角色。该角色获得技能【勇决】,然后你将武将牌翻面。', + cunsi_info:'限定技,出牌阶段,你可以将所有手牌交给一名男性角色。该角色获得技能〖勇决〗,然后你将武将牌翻面。', yongjue_info:'每回合限一次。当其他角色于回合内使用的【杀】结算完成后,若你不是此【杀】的目标角色,则你可以获得之。', guixiu_info:'当你成为【杀】的目标后,若你的手牌数小于体力值,则你可以摸一张牌。', fenming_info:'结束阶段开始时,若你处于横置状态,你可以弃置所有处于横置状态的角色的各一张牌。', duanxie_info:'出牌阶段限一次,你可以令至多X名其他角色横置(X为你已损失的体力值且至少为1),然后你横置。', xiaoguo_info:'其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。', sijian_info:'当你失去最后的手牌时,你可以弃置一名其他角色的一张牌。', - suishi_info:'当其他角色进入濒死状态时,伤害来源可以令你摸一张牌;当其他角色死亡时,伤害来源可以令你失去1点体力', - quji_info:'出牌阶段限一次,你可以弃置X张牌(X为你已损失的体力值),然后令至多X名已受伤的角色各回复1点体力。若你以此法弃置的牌中有黑色牌,你失去一点体力。', + suishi_info:'当其他角色进入濒死状态时,伤害来源可以令你摸一张牌;当其他角色死亡时,伤害来源可以令你失去1点体力。', + quji_info:'出牌阶段限一次,你可以弃置X张牌(X为你已损失的体力值),然后令至多X名已受伤的角色各回复1点体力。若你以此法弃置的牌中有黑色牌,你失去1点体力。', junbing_info:'一名角色的结束阶段开始时,若其手牌数不大于1,该角色可以摸一张牌。若如此做,该角色将所有手牌交给你,然后你交给其等量的牌。', xiongyi_info:'限定技,出牌阶段,你可以选择任意名角色,这些角色各摸三张牌。然后若你的体力值最小,你回复1点体力。', xiongyi_info_guozhan:'限定技,出牌阶段,你可以令与你势力相同的所有角色各摸三张牌,然后若你的势力是角色最少的势力(或之一),则你回复1点体力。', shenzhi_info:'准备阶段开始时,你可以弃置所有手牌。若你以此法弃置的牌数不小于X,你回复1点体力(X为你的体力值)。', shushen_info:'当你回复1点体力时,你可以令一名其他角色选择回复1点体力或摸两张牌。', - wuji_info:'觉醒技,结束阶段开始时,若你于此回合内造成过3点或更多伤害,你加1点体力上限并回复1点体力,失去〖虎啸〗,然后从场上、牌堆或弃牌堆中获得【青龙偃月刀】', + wuji_info:'觉醒技,结束阶段开始时,若你于此回合内造成过3点或更多伤害,你加1点体力上限并回复1点体力,失去〖虎啸〗,然后从场上、牌堆或弃牌堆中获得【青龙偃月刀】。', xueji_info:'出牌阶段限一次,你可以弃置一张红色牌,然后选择至多X名角色,横置这些角色并对其中一名角色造成1点火焰伤害。(X为你已损失的体力值且至少为1)', huxiao_info:'锁定技,当你造成火焰伤害后,你令受伤角色摸一张牌,然后你于此回合内对其使用牌没有次数限制。', aocai_info:'当你于回合外需要使用或打出一张基本牌时,你可以观看牌堆顶的两张牌(若你没有手牌则改为四张)。若你观看的牌中有此牌,你可以使用打出之。', @@ -25206,7 +26008,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ retuogu:'托孤', retuogu_info:'一名角色死亡时,你可以令其选择其武将牌上的一个技能(主公技,限定技,觉醒技,隐匿技、使命技等特殊技能除外),然后你获得其选择的技能并失去上次因〖托孤〗获得的技能。', shanzhuan:'擅专', - shanzhuan_info:'当你对其他角色造成伤害后,若其判定区没有牌,则你你可以将其的一张牌置于其的判定区。若此牌不为延时锦囊牌且此牌为:红色,此牌视为【乐不思蜀】;黑色,此牌视为【兵粮寸断】。回合结束时,若你本回合内未造成伤害,你可摸一张牌。', + shanzhuan_info:'当你对其他角色造成伤害后,若其判定区没有牌,则你可以将其的一张牌置于其的判定区。若此牌不为延时锦囊牌且此牌为:红色,此牌视为【乐不思蜀】;黑色,此牌视为【兵粮寸断】。回合结束时,若你本回合内未造成伤害,你可摸一张牌。', spniluan:'逆乱', spniluan_info:'出牌阶段,你可以将一张黑色牌当做【杀】使用。此【杀】使用结算完成后,若你未因此【杀】造成过伤害,则你令此【杀】不计入使用次数。', spweiwu:'违忤', @@ -25262,7 +26064,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huangchengyan:'OL黄承彦', huangchengyan_prefix:'OL', guanxu:'观虚', - guanxu_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可将其中一张手牌与牌堆顶5张牌中的一张交换。若如此做,你弃置其手牌中3张花色相同的牌。', + guanxu_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可将其中一张手牌与牌堆顶五张牌中的一张交换。若如此做,你弃置其手牌中三张花色相同的牌。', yashi:'雅士', yashi_info:'当你受到一次伤害后,你可选择一项:1. 令伤害来源的非锁定技无效直到其下个回合开始;2. 对一名其他角色发动〖观虚〗。', olwuniang:'武娘', @@ -25289,7 +26091,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_dengzhi:'OL邓芝', ol_dengzhi_prefix:'OL', olxiuhao:'修好', - olxiuhao_info:'每回合限一次。当你受到其他角色造成的伤害时,或对其他角色造成伤害时,你可防止此伤害,然后令伤害来源摸两张牌。', + olxiuhao_info:'每回合限一次。当你受到其他角色造成的伤害时,或其他角色受到你造成的伤害时,你可防止此伤害,然后令伤害来源摸两张牌。', olsujian:'素俭', olsujian_given:'已分配', olsujian_info:'锁定技。弃牌阶段开始前,你将此阶段的规则改为:{你选择一项:①将所有不为本回合得到的手牌分配给其他角色。②弃置这些手牌,然后弃置一名其他角色等量的牌}。', @@ -25303,7 +26105,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olfusong_info:'当你死亡时,你可以选择一名体力上限大于你的其他角色。其选择获得〖吉占〗或〖丰姿〗。', zuofen:'左棻', zhaosong:'诏颂', - zhaosong_info:'一名其他角色的摸牌阶段结束时,若其没有因〖诏颂〗而获得的标记,则你可令其正面向上交给你一张手牌。根据此牌的类型,该角色获得对应的标记和效果:
    锦囊牌:“诔”标记。当拥有者进入濒死状态时,其可弃置所有“诔”,将体力回复至1点并摸1张牌。
    装备牌:“赋”标记。拥有者的出牌阶段开始时,其可弃置所有“赋”,弃置一名角色区域内的至多两张牌。
    基本牌:“颂”标记。当使用者使用仅指定一个目标的【杀】时,其可弃置“颂”,为此【杀】增加至多两个目标。', + zhaosong_info:'一名其他角色的摸牌阶段结束时,若其没有因〖诏颂〗而获得的标记,则你可令其正面向上交给你一张手牌。根据此牌的类型,该角色获得对应的标记和效果:
    锦囊牌:“诔”标记。当拥有者进入濒死状态时,其可弃置所有“诔”,将体力回复至1点并摸一张牌。
    装备牌:“赋”标记。拥有者的出牌阶段开始时,其可弃置所有“赋”,弃置一名角色区域内的至多两张牌。
    基本牌:“颂”标记。当使用者使用仅指定一个目标的【杀】时,其可弃置“颂”,为此【杀】增加至多两个目标。', lisi:'离思', lisi_info:'当你于回合外使用的牌结算结束后,你可将其交给一名手牌数不大于你的其他角色。', ol_yangyi:'杨仪', @@ -25440,7 +26242,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huamu:'化木', huamu_info:'当你使用手牌后,若此牌和本回合内上一张被使用的牌颜色不同,则你可以将此牌对应的所有{位于处理区或装备区}的实体牌置于你的武将牌上。这些牌中的黑色牌称为“灵杉”,红色牌称为“玉树”。', qianmeng:'前盟', - qianmeng_info:'锁定技。当有牌移动事件结算结束后,若有角色的“灵杉”和“玉树”数量发生了变化,且二者数量相等或有一项为0,则你摸一张牌', + qianmeng_info:'锁定技。当有牌移动事件结算结束后,若有角色的“灵杉”和“玉树”数量发生了变化,且二者数量相等或有一项为0,则你摸一张牌。', liangyuan:'良缘', liangyuan_info:'每轮每项各限一次。你可以将场上所有的“灵杉”/“玉树”置于处理区,然后将这些牌当做【酒】/【桃】使用。', jisi:'羁肆', @@ -25514,7 +26316,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olbihun:'弼昏', olbihun_info:'锁定技。当你使用牌指定其他角色为目标时,若你的手牌数大于手牌上限且若此牌的目标数:大于1,取消此目标;为1,其获得此牌。', olchuanwu:'穿屋', - olchuanwu_info:'锁定技。当你造成或受到伤害后,你令武将牌上的前X个技能失效直到回合结束。然后你摸等同于你此次失效的技能数张牌(X为你的攻击范围)。', + olchuanwu_info:'锁定技。当你造成或受到伤害后,你令武将牌上的前X个未失效的技能失效直到回合结束。然后你摸等同于你此次失效的技能数张牌(X为你的攻击范围)。', oljianhe:'剑合', oljianhe_info:'出牌阶段每名角色限一次。你可以重铸至少两张同名牌或至少两张装备牌,然后令一名角色选择一项:1.重铸等量张与你以此法重铸的牌类型相同的牌;2.受到你造成的1点雷电伤害。', dongtuna:'董荼那', @@ -25622,7 +26424,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olweifu:'威抚', olweifu_info:'出牌阶段,你可以弃置一张牌并判定。你本回合下次使用与结果类型相同的牌无距离限制,且可以额外指定一个目标。若你弃置的牌与判定牌类型相同,你摸一张牌。', olkuansai:'款塞', - olkuansai_info:'当一张牌指定第一个目标后,若目标数大于你的体力值,你可以令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。', + olkuansai_info:'每回合限一次,当一张牌指定第一个目标后,若目标数大于你的体力值,你可以令其中一个目标选择一项:1.交给你一张牌;2.令你回复1点体力。', ol_luyusheng:'OL陆郁生', ol_luyusheng_prefix:'OL', olcangxin:'藏心', @@ -25631,7 +26433,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olrunwei_info:'其他角色的弃牌阶段开始时,若其已受伤,则你可以选择一项:①令其弃置一张牌,其本回合手牌上限+1;②令其摸一张牌,其本回合手牌上限-1。', caoxi:'曹羲', olgangshu:'刚述', - olgangshu_info:'①当你使用非基本牌结算结束后,你可以令以下一项数值+1:1.攻击范围;2.受〖刚述〗影响的下个摸牌阶段摸牌数;3.使用【杀】的次数上限。②当有牌被你抵消后,重置你〖刚述①〗增加的所有数值。', + olgangshu_info:'①当你使用非基本牌结算结束后,你可以令以下一项数值+1(每项至多加至5):1.攻击范围;2.受〖刚述〗影响的下个摸牌阶段摸牌数;3.使用【杀】的次数上限。②当有牌被你抵消后,重置你〖刚述①〗增加的所有数值。', oljianxuan:'谏旋', oljianxuan_info:'当你受到伤害后,你可以令一名角色摸一张牌,然后若其手牌数等于你〖刚述①〗中的任意一项对应的数值,其重复此流程。', ol_pengyang:'OL彭羕', @@ -25650,9 +26452,34 @@ game.import('character',function(lib,game,ui,get,ai,_status){ skill_feiyi_A_info:'出牌阶段各限一次,若你的手牌数为:①奇数,你可以摸三张牌,然后弃置至少一半手牌(向下取整);②偶数,你可以弃置至少一半手牌,然后摸三张牌。', skill_feiyi_B:'技能', skill_feiyi_B_info:'每回合每项限一次,当你的手牌数变为1后,你可以展示此唯一手牌A并摸一张牌,然后你选择一项:①本回合使用点数大于A的点数的牌额外结算一次;②本回合使用点数小于A的点数的牌额外结算一次。', - ol_lvboshe:'吕伯奢', - skill_lvboshe:'技能', - skill_lvboshe_info:'农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,你可以令其进行一个额外回合。', + lvboshe:'吕伯奢', + olfushi:'缚豕', + olfushi_info:'①一名角色使用【杀】结算结束后,若你至其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时,你可以重铸任意张“缚豕”牌,视为使用一张【杀】并选择X项(X为你以此法重铸的牌数且至多为3):1.你为此【杀】额外指定一个目标;2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-1;3.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后,若此牌被选择的效果选项相邻且此牌的目标角色座位连续,则此【杀】不计入次数限制。', + oldongdao:'东道', + oldongdao_info:'农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。', + zhangyan:'张燕', + olsuji:'肃疾', + olsuji_info:'一名角色的出牌阶段开始时,若其已受伤,你可以将一张黑色牌当【杀】使用。若其受到此【杀】的伤害,你获得其一张牌。', + ollangdao:'狼蹈', + ollangdao_info:'当你使用【杀】指定唯一目标时,你可以与该目标角色同时选择一项:1.令此【杀】伤害基数+1;2.令你可以为此【杀】多选择一个目标;3.令此【杀】不可被响应。然后若没有角色因此【杀】死亡,你移除本次被选择的项。', + ol_dingshangwan:'OL丁尚涴', + ol_dingshangwan_prefix:'OL', + olfudao:'抚悼', + olfudao_info:'①游戏开始时,你选择弃置或摸至多四张牌,然后记录你的手牌数。②一名角色的回合结束时,若其手牌数和你发动〖抚悼①〗记录的数值相同,则你可以与其各摸一张牌。', + olfengyan:'讽言', + olfengyan_info:'锁定技。①当你受到其他角色造成的伤害后,你摸一张牌,然后交给其一张牌。②当你响应其他角色使用的牌时,其摸一张牌,然后弃置两张牌。', + ol_liwan:'OL李婉', + ol_liwan_prefix:'OL', + ollianju:'联句', + ollianju_info:'结束阶段,你可以令一名其他角色获得你本回合使用的最后一张牌A对应的所有位于弃牌堆的实体牌并记录A的牌名,然后其下个结束阶段可以令你获得其本回合使用的最后一张牌B对应的所有位于弃牌堆的实体牌,且若A与B的牌名相同,则你失去1点体力。', + olsilv:'思闾', + olsilv_info:'锁定技,每回合限一次,当你获得或失去你发动〖联句〗记录的最后一次牌名的同名牌后,你展示这些牌,然后摸一张牌。', + xueji_old:'血祭', + xueji_old_info:'出牌阶段限一次,你可以弃置一张红色牌并对攻击范围内的至多X名角色各造成1点伤害(X为你已损失的体力值),然后这些角色各摸一张牌。', + oldhuxiao:'虎啸', + oldhuxiao_info:'锁定技,当你使用的【杀】被【闪】抵消后,你令此【杀】不计入使用次数。', + oldwuji:'武继', + oldwuji_info:'觉醒技,结束阶段,若你本回合造成了3点或更多伤害,你加1点体力上限并回复1点体力,并失去技能〖虎啸〗。', sp_tianji:'天极·皇室宗亲', diff --git a/character/sp2.js b/character/sp2.js index cf89bfea1..69e5f4095 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,10 +4,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sp2', connect:true, character:{ + star_caoren:['male','wei',4,['starsujun','starlifeng']], dc_jikang:['male','wei',3,['new_qingxian','dcjuexiang']], dc_jsp_guanyu:['male','wei',4,['new_rewusheng','dcdanji']], dc_mengda:['male','wei',4,['dclibang','dcwujie']], - dc_zhangmancheng:['male','qun',4,['dclvecheng','dczhongji'],['unseen']], //dc_fuwan:['male','qun',4,['dcmoukui']], guānning:['male','shu',3,['dcxiuwen','dclongsong']], sunhuan:['male','wu',4,['dcniji'],['unseen']], @@ -41,7 +41,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qiuliju:['male','qun','4/6',['koulve','qljsuiren']], re_hucheer:['male','qun',4,['redaoji','fuzhong']], re_dongcheng:['male','qun',4,['xuezhao']], - tangji:['female','qun',3,['jielie','kangge']], + tangji:['female','qun',3,['kangge','jielie']], zhangheng:['male','qun',8,['dangzai','liangjue']], duanwei:['male','qun',4,['langmie']], re_niujin:['male','wei',4,['recuorui','reliewei']], @@ -108,10 +108,120 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 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'], sp_decade:['caobuxing','re_maliang','xin_baosanniang','dc_jikang'], } }, skill:{ + //星曹仁 + starsujun:{ + audio:2, + trigger:{player:'useCard'}, + filter:function(event,player){ + return player.countCards('h',{type:'basic'})*2==player.countCards('h'); + }, + frequent:true, + locked:false, + content:function(){ + player.draw(2); + }, + mod:{ + aiOrder:function(player,card,num){ + var num=player.countCards('h')-2*player.countCards('h',{type:'basic'}); + if(Math.abs(num)!=1) return; + if(num==1&&get.type(card)!='basic') return num+10; + if(num==-1&&get.type(card)=='basic') return num+10; + }, + }, + }, + starlifeng:{ + audio:2, + enable:'chooseToUse', + filter:function(event,player){ + if(!event.filterCard({name:'sha'},player,event)&&!event.filterCard({name:'wuxie'},player,event)) return false; + return player.countCards('h',card=>{ + return !player.getStorage('starlifeng_count').contains(get.color(card,player))||_status.connectMode; + }); + }, + chooseButton:{ + dialog:function(event,player){ + var list=[]; + if(event.filterCard({name:'sha'},player,event)) list.push(['基本','','sha']); + if(event.filterCard({name:'wuxie'},player,event)) list.push(['锦囊','','wuxie']); + return ui.create.dialog('砺锋',[list,'vcard']); + }, + check:function(button){ + var player=_status.event.player; + return _status.event.getParent().type=='phase'?player.getUseValue({name:button.link[2]}):1 + }, + backup:function(links,player){ + return { + filterCard:function(card,player){ + return !player.getStorage('starlifeng_count').contains(get.color(card,player)); + }, + precontent:function(){ + delete event.result.skill; + player.logSkill('starlifeng'); + event.getParent().addCount=false; + }, + popname:true, + position:'h', + viewAs:{ + name:links[0][2], + }, + ai1:function(card){ + var player=_status.event.player; + var num=player.countCards('h')-2*player.countCards('h',{type:'basic'}); + if(player.hasSkill('starsujin')&&Math.abs(num)==1){ + if(num==1&&get.type(card)!='basic') return 15-get.value(card); + if(num==-1&&get.type(card)=='basic') return 15-get.value(card); + } + return 7-get.value(card); + }, + }; + }, + prompt:function(links){ + return '将一张本回合未使用过的颜色的手牌当做【'+get.translation(links[0][2])+'】使用'; + }, + }, + hiddenCard:function(player,name){ + if(name=='wuxie') return player.countCards('h',card=>{ + return !player.getStorage('starlifeng_count').contains(get.color(card,player))||_status.connectMode; + }); + }, + ai:{ + respondSha:true, + skillTagFilter:function(player,tag,arg){ + if(arg=='respond') return false; + if(!player.countCards('h',card=>{ + return !player.getStorage('starlifeng_count').contains(get.color(card,player))||_status.connectMode; + })) return false; + }, + order:10, + result:{player:1}, + }, + group:'starlifeng_mark', + subSkill:{ + mark:{ + charlotte:true, + trigger:{global:'useCard1'}, + filter:function(event,player){ + return !player.getStorage('starlifeng_count').contains(get.color(event.card)); + }, + forced:true, + popup:false, + firstDo:true, + content:function(){ + player.addTempSkill('starlifeng_count'); + player.markAuto('starlifeng_count',[get.color(trigger.card)]); + }, + }, + count:{ + charlotte:true, + onremove:true, + }, + }, + }, //十周年嵇康 dcjuexiang: { derivation: 'dccanyun', @@ -599,134 +709,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, } }, - //张曼成 - dclvecheng:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - player.addTempSkill('dclvecheng_xiongluan'); - player.markAuto('dclvecheng_xiongluan',[target]); - }, - ai:{ - threaten:2.1, - order:9, - expose:0.2, - result:{ - target:function(player,target){ - if(player.getStorage('dclvecheng_xiongluan').contains(target)) return 0; - if(target.getEquip('bagua')||target.getEquip('rewrite_bagua')) return -0.6; - var hs=player.countCards('h',card=>{ - return get.name(card)=='sha'&&get.effect(target,card,player,player)!=0; - }); - var ts=target.hp; - if(hs>=ts&&ts>1) return -2; - return -1; - } - } - }, - subSkill:{ - xiongluan:{ - trigger:{player:'phaseEnd'}, - charlotte:true, - forced:true, - popup:false, - onremove:true, - filter:function(event,player){ - return player.getStorage('dclvecheng_xiongluan').some(i=>i.isIn()); - }, - content:function(){ - 'step 0' - event.targets=player.getStorage('dclvecheng_xiongluan').slice(); - event.targets.sortBySeat(); - 'step 1' - if(!event.targets.length){ - event.finish(); - return; - } - var target=event.targets.shift(); - event.target=target; - target.showHandcards(); - var cards=target.getCards('h','sha'); - if(!cards.length) event.redo(); - else event.forced=false; - 'step 2' - var forced=event.forced; - var prompt2=forced?'掠城:选择对'+get.translation(player)+'使用的【杀】':'掠城:是否依次对'+get.translation(player)+'使用所有的【杀】?'; - target.chooseToUse(forced,function(card,player,event){ - if(get.itemtype(card)!='card'||get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },prompt2).set('targetRequired',true).set('complexSelect',true).set('filterTarget',function(card,player,target){ - if(target!=_status.event.sourcex&&!ui.selected.targets.contains(_status.event.sourcex)) return false; - return lib.filter.targetEnabled.apply(this,arguments); - }).set('sourcex',player); - 'step 3' - if(result.bool){ - if(target.countCards('h','sha')){ - event.forced=true; - event.goto(2); - return; - } - } - event.forced=false; - event.goto(1); - }, - intro:{ - content:'可以对$随意大喊大叫' - }, - mod:{ - cardUsableTarget:function(card,player,target){ - if(card.name=='sha'&&player.getStorage('dclvecheng_xiongluan').contains(target)) return true; - }, - } - } - } - }, - dczhongji:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - var suit=get.suit(event.card); - return !lib.suit.contains(suit)||!player.countCards('h',{suit:suit}); - }, - check:function(event,player){ - var num=Math.min(20,player.maxHp-player.countCards('h')); - if(num<=0) return false; - var numx=player.getHistory('useSkill',evt=>{ - return evt.skill=='dczhongji'; - }).length+1; - if(numx>num) return false; - if(_status.currentPhase!=player) return true; - if(player.hasCard(card=>{ - var suit=get.suit(card); - return player.hasValueTarget(card)&&!player.hasCard(cardx=>{ - return cardx!=card&&get.suit(cardx)==suit; - }); - })) return false; - return true; - }, - prompt2:function(event,player){ - var num=Math.min(20,player.maxHp-player.countCards('h')); - var str=num>0?'摸'+get.cnNumber(num)+'张牌,然后':''; - return str+'弃置'+get.cnNumber(1+player.getHistory('useSkill',evt=>{ - return evt.skill=='dczhongji'; - }).length)+'张牌'; - }, - content:function(){ - 'step 0' - var num=Math.min(20,player.maxHp-player.countCards('h')); - if(num>0) player.draw(num); - 'step 1' - var num=player.getHistory('useSkill',evt=>{ - return evt.skill=='dczhongji'; - }).length; - player.chooseToDiscard('螽集:请弃置'+get.cnNumber(num)+'张牌','he',true,num).set('ai',get.unuseful); - }, - ai:{ - threaten:3.2, - } - }, //关宁 dcxiuwen:{ audio:2, @@ -1771,7 +1753,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ onremove:function(player,skill){ var cards=player.getExpansions(skill); if(cards.length) player.loseToDiscardpile(cards); - delete player.storage.dcmingfa_info; }, group:'dcshilie_die', ai:{ @@ -1808,7 +1789,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 3' var cards=player.getExpansions('dcshilie'); if(cards.length>game.countPlayer()){ - player.loseToDiscardpile(cards.slice(0,cards.length-game.countPlayer())); + player.loseToDiscardpile(cards.slice(game.countPlayer())); } }, }, @@ -2082,14 +2063,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //卞喜 dunxi:{ audio:2, - trigger:{player:'useCardAfter'}, + trigger:{player:'useCard'}, direct:true, filter:function(event,player){ if(!get.tag(event.card,'damage')) return false; - for(var i of event.targets){ - if(i!=player&&i.isIn()) return true; - } - return false; + return event.targets.some(target=>target!=player&&target.isIn()); }, content:function(){ 'step 0' @@ -2814,9 +2792,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterCard:true, selectCard:[1,Infinity], check:function(card){ - var player=_status.event.player; - if(ui.selected.cards.length<=Math.max(1,player.needsToDiscard(),player.countCards('h')-4)) return 6-get.value(card); - return 4-get.value(card); + let player=_status.event.player,num=player.hasSkill('nifu')?15:8; + if(ui.selected.cards.length<=Math.max(1,player.needsToDiscard(),player.countCards('h')-4)) return num-get.value(card); + return num/2-get.value(card); }, position:'h', discard:false, @@ -2870,7 +2848,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ viewAs:{name:'juedou'}, position:'h', filterTarget:lib.filter.targetEnabled, - check:(card)=>get.name(card)=='sha'?7:5.5-get.value(card), + check:(card)=>get.name(card)=='sha'?0:5.5-get.value(card), log:false, precontent:function(){ delete event.result.skill; @@ -4545,12 +4523,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, //唐姬 - jielie:{ + kangge:{ audio:2, trigger:{player:'phaseBegin'}, direct:true, filter:function(event,player){ - return player.phaseNumber==1&&!player.storage.jielie&&game.hasPlayer(current=>current!=player); + return player.phaseNumber==1&&!player.storage.kangge&&game.hasPlayer(current=>current!=player); }, content:function(){ 'step 0' @@ -4560,31 +4538,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(result.bool){ var target=result.targets[0]; - player.logSkill('jielie',target); - player.addSkill('jielie_clear'); - player.storage.jielie=target; - player.markSkill('jielie'); + player.logSkill('kangge',target); + player.addSkill('kangge_clear'); + player.storage.kangge=target; + player.markSkill('kangge'); game.delayx(); } }, intro:{content:'已指定$为目标'}, - group:['jielie_draw','jielie_dying','jielie_die'], + group:['kangge_draw','kangge_dying','kangge_die'], subSkill:{ draw:{ - audio:'jielie', + audio:'kangge', trigger:{ global:['gainAfter','loseAsyncAfter'], }, forced:true, filter:function(event,player){ - if(player.countMark('jielie_draw')>=3) return false; - var target=player.storage.jielie; + if(player.countMark('kangge_draw')>=3) return false; + var target=player.storage.kangge; return target&&target!=_status.currentPhase&&event.getg(target).length>0; }, logTarget:'player', content:function(){ - var num=Math.min(3-player.countMark('jielie_draw'),trigger.getg(player.storage.jielie).length); - player.addMark('jielie_draw',num,false); + var num=Math.min(3-player.countMark('kangge_draw'),trigger.getg(player.storage.kangge).length); + player.addMark('kangge_draw',num,false); player.draw(num); }, }, @@ -4595,18 +4573,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ popup:false, charlotte:true, filter:function(event,player){ - return player.countMark('jielie_draw')>0; + return player.countMark('kangge_draw')>0; }, content:function(){ - player.removeMark('jielie_draw',player.countMark('jielie_draw'),false); + player.removeMark('kangge_draw',player.countMark('kangge_draw'),false); }, }, dying:{ - audio:'jielie', + audio:'kangge', trigger:{global:'dying'}, logTarget:'player', filter:function(event,player){ - return event.player==player.storage.jielie&&event.player.hp<1&&!player.hasSkill('jielie_temp'); + return event.player==player.storage.kangge&&event.player.hp<1&&!player.hasSkill('kangge_temp'); }, check:function(event,player){ return get.attitude(player,event.player)>0; @@ -4614,15 +4592,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ prompt2:'令其将体力值回复至1点', content:function(){ trigger.player.recover(1-trigger.player.hp); - player.addTempSkill('jielie_temp','roundStart'); + player.addTempSkill('kangge_temp','roundStart'); }, }, temp:{}, die:{ - audio:'jielie', + audio:'kangge', trigger:{global:'dieAfter'}, filter:function(event,player){ - return event.player==player.storage.jielie; + return event.player==player.storage.kangge; }, forced:true, content:function(){ @@ -4636,24 +4614,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ threaten:2, }, }, - kangge:{ + jielie:{ audio:2, trigger:{player:'damageBegin4'}, direct:true, filter:function(event,player){ - return ((!event.source)||(event.source!=player&&event.source!=player.storage.jielie))&&player.storage.jielie&&player.storage.jielie.isIn(); + return ((!event.source)||(event.source!=player&&event.source!=player.storage.kangge))&&player.storage.kangge&&player.storage.kangge.isIn(); }, content:function(){ 'step 0' - player.chooseControl(lib.suit.slice(0),'cancel2').set('prompt',get.prompt('kangge')).set('prompt2','防止伤害并改为失去等量体力,且令'+get.translation(player.storage.jielie)+'从弃牌堆中获得等量的花色牌').set('ai',function(){ + player.chooseControl(lib.suit.slice(0),'cancel2').set('prompt',get.prompt('jielie')).set('prompt2','防止伤害并改为失去等量体力,且令'+get.translation(player.storage.kangge)+'从弃牌堆中获得等量的花色牌').set('ai',function(){ var player=_status.event.player; - if(get.attitude(player,player.storage.jielie)<=0) return 'cancel2'; + if(get.attitude(player,player.storage.kangge)<=0) return 'cancel2'; return lib.suit.randomGet(); }); 'step 1' if(result.control!='cancel2'){ event.suit=result.control; - player.logSkill('kangge',player.storage.jielie); + player.logSkill('jielie',player.storage.kangge); trigger.cancel(); player.loseHp(trigger.num); } @@ -4667,7 +4645,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(card) cards.push(card); else break; } - if(cards.length) player.storage.jielie.gain(cards,'gain2'); + if(cards.length) player.storage.kangge.gain(cards,'gain2'); }, }, //张横 @@ -4757,12 +4735,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else return true; } }, - direct:true, + frequent:true, content:function(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('langmie'),'弃置一张牌并摸两张牌').set('ai',(card)=>8-get.value(card)).logSkill='langmie'; - 'step 1' - if(result.bool) player.draw(2); + player.draw(); }, group:'langmie_damage', }, @@ -5538,7 +5513,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else event.finish(); 'step 2' var list=game.filterPlayer(function(current){ - return current.name=='ol_guansuo'||current.name2=='ol_guansuo'; + return current.name=='dc_guansuo'||current.name2=='dc_guansuo'; }); if(list.length) game.asyncDraw(list); else event.finish(); @@ -5860,7 +5835,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, filter:function(event,player){ return event.decadexushen==true&&!game.hasPlayer(function(current){ - return current.name=='ol_guansuo'||current.name2=='ol_guansuo'; + return current.name=='dc_guansuo'||current.name2=='dc_guansuo'; }); }, content:function(){ @@ -5886,11 +5861,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else event.goto(4); 'step 3' - target.reinit(result.control,'ol_guansuo'); - if(target.name=='ol_guansuo'&&target.group!='shu') target.changeGroup('shu'); + target.reinit(result.control,'dc_guansuo'); + if(target.name=='dc_guansuo'&&target.group!='shu') target.changeGroup('shu'); if(_status.characterlist){ _status.characterlist.add(result.control); - _status.characterlist.remove('ol_guansuo'); + _status.characterlist.remove('dc_guansuo'); } 'step 4' target.draw(3); @@ -7808,34 +7783,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.control=="手动分配"){ event.goto(8); } - else if(!_status.connectMode){ - var choiceList=ui.create.dialog('请选择一种方案','hidden','forcebutton'); - for(var i=0;i1&&player.hasSkill('stdshushen')){ + event.num--; + event.goto(1); + } + } + }, + ai:{threaten:0.8,expose:0.1}, + }, stdkuangfu:{ audio:'xinkuangfu', trigger:{source:'damageSource'}, @@ -1013,7 +1038,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, wusheng:{ audio:2, - audioname2:{old_guanzhang:'old_fuhun'}, + audioname2:{ + old_guanzhang:'old_fuhun', + old_guanyu:'wusheng_re_guanyu', + }, audioname:['re_guanyu','guanzhang','jsp_guanyu','guansuo','re_guanzhang','dc_jsp_guanyu'], enable:['chooseToRespond','chooseToUse'], filterCard:function(card,player){ @@ -1048,6 +1076,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ respondSha:true, } }, + wusheng_re_guanyu:{audio:2}, zhongyi:{ audio:2, enable:'phaseUse', @@ -1459,6 +1488,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, xinzhiheng:{ audio:'zhiheng', + mod:{ + aiOrder:function(player,card,num){ + if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; + let eq=player.getEquip(get.subtype(card)); + if(eq&&get.equipValue(card)-get.equipValue(eq)get.value(i)>Math.max(6,9-player.hp),'he')) return 1; + return 10; + }, result:{ player:1 }, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep') return (!arg||arg&&arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat().skill.xinzhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); + }, threaten:1.55 }, }, zhiheng:{ audio:2, audioname:['gz_jun_sunquan'], + mod:{ + aiOrder:function(player,card,num){ + if(num<=0||get.itemtype(card)!=='card'||get.type(card)!=='equip') return num; + let eq=player.getEquip(get.subtype(card)); + if(eq&&get.equipValue(card)-get.equipValue(eq)0) return 1; return 0; }).set('choiceList',[ - '对'+get.translation(target)+'造成一点伤害', - '令'+get.translation(target)+'回复一点体力', + '对'+get.translation(target)+'造成1点伤害', + '令'+get.translation(target)+'回复1点体力', ]) } else{ @@ -1028,7 +1028,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 5' if(event.suits.contains('spade')){ - player.chooseTarget('令一名角色受到一点无来源的雷属性伤害').ai=function(target){ + player.chooseTarget('令一名角色受到1点无来源的雷属性伤害').ai=function(target){ return get.damageEffect(target,target,player,'thunder'); } } @@ -1480,7 +1480,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' player.chooseTarget('凌锋',function(card,player,target){ return player!=target&&get.distance(player,target,'attack')<=1; - }).set('prompt2','造成一点伤害,或取消并获得一点护甲').ai=function(target){ + }).set('prompt2','造成1点伤害,或取消并获得1点护甲').ai=function(target){ if(player.hp==1) return 0; if(player.hp==2&&target.hp>=3) return 0; return get.damageEffect(target,player,player); @@ -2689,7 +2689,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ targets.push(players[i]); } } - return '令'+get.translation(targets)+'回复一点体力'; + return '令'+get.translation(targets)+'回复1点体力'; }, check:function(card){ return 8-get.value(card); @@ -6801,7 +6801,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=player.countCards('h')-trigger.source.countCards('h'); event.num=num; if(num>0){ - var next=player.chooseToDiscard(num,get.prompt('pozhen',trigger.source),'弃置'+num+'张手牌,并对'+get.translation(trigger.source)+'造成一点伤害'); + var next=player.chooseToDiscard(num,get.prompt('pozhen',trigger.source),'弃置'+num+'张手牌,并对'+get.translation(trigger.source)+'造成1点伤害'); next.logSkill=['pozhen',trigger.source]; next.ai=function(card){ if(get.damageEffect(trigger.source,player,player)>0&&num<=2){ @@ -8958,7 +8958,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', usable:1, intro:{ - content:'濒死时回复一点体力并失去鬼眼' + content:'濒死时回复1点体力并失去鬼眼' }, mark:true, filterTarget:function(card,player,target){ @@ -9103,8 +9103,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, effects:[ - '减少一点体力并增加一点体力上限', - '增加一点体力并减少一点体力上限', + '减少1点体力并增加1点体力上限', + '增加1点体力并减少1点体力上限', '令你即将造成和即将受到的首次伤害-1', '令你即将造成和即将受到的首次伤害+1', '少摸一张牌并令手牌上限+1', @@ -9770,9 +9770,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ cyliuzi:'流紫', cyliuzi_info:'摸牌阶段,你可以额外摸一张牌;每当你失去此技能,你可以摸一张牌', cyyijin:'异金', - cyyijin_info:'出牌阶段,你可以对一名体力值为全场最多的角色造成一点伤害;每当你失去此技能,你可以对一名体力值为全场最多的角色造成一点伤害', + cyyijin_info:'出牌阶段,你可以对一名体力值为全场最多的角色造成1点伤害;每当你失去此技能,你可以对一名体力值为全场最多的角色造成1点伤害', cyqingling:'青凌', - cyqingling_info:'弃牌阶段,若你弃置了至少一张牌,你可以获得一点护甲;每当你失去此技能,你可以获得一点护甲', + cyqingling_info:'弃牌阶段,若你弃置了至少一张牌,你可以获得1点护甲;每当你失去此技能,你可以获得1点护甲', cyqiandian:'千靛', cyqiandian_info:'结束阶段,你可以视为使用一张惊雷闪;每当你失去此技能,你可以视为使用一张惊雷闪', gxianyin:'仙音', @@ -9788,15 +9788,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ cylingjia:'灵甲', cylingjia_info:'出牌阶段限一次,你可以弃置一张装备牌,然后令云狐随机装备一件装备(不替换现有装备)并将其强化', cyqiaobo:'巧补', - cyqiaobo_info:'出牌阶段限一次,你可以弃置一张锦囊牌,然后令云狐回复一点体力', + cyqiaobo_info:'出牌阶段限一次,你可以弃置一张锦囊牌,然后令云狐回复1点体力', cqiaoxie:'巧械', - cqiaoxie_info:'出牌阶段限一次,你可以将一张锦囊牌当作零件袋使用;每当你使用一张零件牌,你获得一点技能点数', + cqiaoxie_info:'出牌阶段限一次,你可以将一张锦囊牌当作零件袋使用;每当你使用一张零件牌,你获得1点技能点数', xiufu:'修复', - xiufu_info:'出牌阶段,你可以弃置一张装备牌或机关牌,令云狐回复一点体力', + xiufu_info:'出牌阶段,你可以弃置一张装备牌或机关牌,令云狐回复1点体力', yhshengong:'神工', - yhshengong_info:'游戏开始时,你获得3点技能点数;每当你造成一点伤害,你获得一点技能点数;出牌阶段,你可以通过消耗技能点令云狐获得新的技能(云狐体力为0时无法学习或发动技能)', + yhshengong_info:'游戏开始时,你获得3点技能点数;每当你造成1点伤害,你获得1点技能点数;出牌阶段,你可以通过消耗技能点令云狐获得新的技能(云狐体力为0时无法学习或发动技能)', juxi:'聚息', - juxi_info:'锁定技,每当一名角色于其回合外弃置牌,你获得一枚聚息标记;出牌阶段限一次,你可以移去X枚聚息标记,然后选择一项:对一名角造成一点伤害,或令一名角色回复一点体力,X为存活角色数', + juxi_info:'锁定技,每当一名角色于其回合外弃置牌,你获得一枚聚息标记;出牌阶段限一次,你可以移去X枚聚息标记,然后选择一项:对一名角造成1点伤害,或令一名角色回复1点体力,X为存活角色数', yeying:'曳影', yeying_info:'出牌阶段限一次,你可以将一张黑色牌当作乾坤镖使用', jiefen:'解纷', @@ -9804,13 +9804,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ datong:'大同', datong_info:'任意一名角色的结束阶段,若全场手牌数最多和最少的角色手牌数之差不超过1,你摸两张牌', huodan:'火丹', - huodan_info:'出牌阶段限一次,你可以弃置一张红色牌并失去一点体力,然后将两点火属性伤害分配给1~2名角色', - huodan_info_alter:'出牌阶段限一次,你可以弃置一张红色牌并失去一点体力,然后将两点火属性伤害分配给1~2名角色;若你只分配了一名角色,该角色在结算后摸一张牌', + huodan_info:'出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色', + huodan_info_alter:'出牌阶段限一次,你可以弃置一张红色牌并失去1点体力,然后将2点火属性伤害分配给1~2名角色;若你只分配了一名角色,该角色在结算后摸一张牌', sxianjing:'陷阱', sxianjing_bg:'阱', sxianjing_info:'出牌阶段,你可以将一张手牌背面朝上置于你的武将牌上(不能与已有花色相同)。当一名其他角色使用与一张“陷阱”牌花色相同的牌指定你为目标时,你移去对应的“陷阱”牌,然后随机获得该角色的一张牌。每当你受到一次伤害,你随机将一张“陷阱”牌返回手牌', zhanxing:'占星', - zhanxing_info:'出牌阶段限一次,你可以弃置任意张牌,并亮出牌堆顶的等量的牌,并根据亮出的牌包含的花色执行以下效果:♦︎摸两张牌;♥回复一点体力(若未损失体力改为获得一点护甲);♣令所有敌人随机弃置一张牌;♠令一名角色受到一点无来源的雷属性伤害', + zhanxing_info:'出牌阶段限一次,你可以弃置任意张牌,并亮出牌堆顶的等量的牌,并根据亮出的牌包含的花色执行以下效果:♦︎摸两张牌;♥回复1点体力(若未损失体力改为获得1点护甲);♣令所有敌人随机弃置一张牌;♠令一名角色受到1点无来源的雷属性伤害', kbolan:'博览', kbolan_info:'每当你摸牌时,你可以额外摸一张牌,然后摸牌结束时将一张手牌置于牌堆顶', gaizao:'改造', @@ -9818,16 +9818,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lingshi:'灵矢', lingshi_info:'你的装备区内每有一张牌,你的攻击范围+2;当你的装备区内有武器牌或防具牌时,你的杀不可闪避;当你的装备区内有马时,你摸牌阶段额外摸一张牌;当你的装备内的宝物牌时,你回合内可以额外使用一张杀', tiebi:'铁壁', - tiebi_info:'当距离你1以内的一名角色成为杀的目标时,若其没有护甲,你可以弃置一张黑色手牌使其获得一点护甲', + tiebi_info:'当距离你1以内的一名角色成为杀的目标时,若其没有护甲,你可以弃置一张黑色手牌使其获得1点护甲', shenyan:'神炎', shenyan_bg:'炎', - shenyan_info:'限定技,当你即将造成火焰伤害时,你可以令此伤害+1,并对目标距离1以内的所有其他角色各造成一点火焰伤害', + shenyan_info:'限定技,当你即将造成火焰伤害时,你可以令此伤害+1,并对目标距离1以内的所有其他角色各造成1点火焰伤害', xuanying:'旋影', xuanying_info:'你可以横置你的武将牌,视为使用一张无视距离的杀;每当你于回合外失去牌,你可以竖置你的武将牌,视为使用一张无视距离的杀', hwendao:'问道', hwendao_info:'每当你于回合外使用或打出一张牌,你可以令当前回合角色弃置一张与之花色相同的牌,否则你获得其一张牌', lingfeng:'凌锋', - lingfeng_info:'结束阶段,若你本回合内使用了至少X张牌,你可以选择一项:获得一点护甲,或对攻击范围内的一名角色造成一点伤害(X为你当前的体力值且最多为3)', + lingfeng_info:'结束阶段,若你本回合内使用了至少X张牌,你可以选择一项:获得1点护甲,或对攻击范围内的一名角色造成1点伤害(X为你当前的体力值且最多为3)', hxunzhi:'殉志', hxunzhi_info:'限定技,出牌阶段,你可以视为使用一张万箭齐发并获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡', hxunzhi_info_alter:'限定技,出牌阶段,你可以获得技能武圣、咆哮,若如此做,你在此阶段结束时死亡', @@ -9842,7 +9842,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ gtiandao:'天道', gtiandao_info:'任意一名角色的判定生效前,你可以打出一张牌替换之', nlianji:'连计', - nlianji_info:'出牌阶段限一次,你可以选择一张手牌并指定两名角色进行拼点。若拼点结果不为平局,拼点赢的角色获得此牌,并对没赢的角色造成一点伤害。', + nlianji_info:'出牌阶段限一次,你可以选择一张手牌并指定两名角色进行拼点。若拼点结果不为平局,拼点赢的角色获得此牌,并对没赢的角色造成1点伤害。', fengze:'风泽', fengze_info:'出牌阶段限一次,你可以将一张黑色牌当作桃园结义使用', lingyue:'凌月', @@ -9852,14 +9852,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huanxia:'幻霞', huanxia_info:'你可以将一张红色牌当作杀使用,若此杀未造成伤害,你在结束阶段收回此牌', jingjie:'幻镜', - jingjie_info:'准备阶段,你可以流失一点体力,并', + jingjie_info:'准备阶段,你可以失去1点体力,并', jingjie_old_info:'限定技,出牌阶段,你可以令所有角色弃置所有牌,然后摸两张牌(不触发任何技能)', kongmo:'恐魔', kongmo_info:'锁定技,你使用基本牌或普通锦囊牌后将额外结算一次卡牌效果', jufu:'巨斧', jufu_info:'锁定技,当你有武器牌时,杀造成的伤害+1', huajing:'化精', - huajing_info:'每当你使用锦囊牌造成伤害,可以回复一点体力并摸一张牌', + huajing_info:'每当你使用锦囊牌造成伤害,可以回复1点体力并摸一张牌', pingxu:'冯虚', pingxu_info:'锁定技,当你没有武器牌时,你的进攻距离+1;当你没有防具牌时,你的防御距离+1', yudun:'愚钝', @@ -9867,7 +9867,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bingfeng:'冰封', bingfeng2:'冰封', bingfeng2_info:'不能使用或打出手牌', - bingfeng_info:'限定技,出牌阶段,你可以指定至多三个目标与其一同翻面,且处于翻面状态时不能使用或打出手牌;若如此做,你失去技能玄咒并减少一点体力上限', + bingfeng_info:'限定技,出牌阶段,你可以指定至多三个目标与其一同翻面,且处于翻面状态时不能使用或打出手牌;若如此做,你失去技能玄咒并减少1点体力上限', guozao:'聒噪', guozao_info:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离2以内的一名有手牌角色将手牌与这些牌交换', guozao_info_alter:'锁定技,每当距离你1以内的角色受到一次伤害,若伤害来源不你,你须观看牌堆顶的三张牌,然后指定距离1以内的一名有手牌角色将手牌与这些牌交换', @@ -9894,17 +9894,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huangyu:'凰羽', huangyu_info:'出牌阶段限一次,你可以将两张红色牌当炽羽袭使用', bingjian:'冰箭', - bingjian_info:'出牌阶段限一次,你可以弃置一张黑色的杀,令一名有手牌的其他角色展示手牌并弃置其中的所有闪,若其没有闪则受到一点雷电伤害', + bingjian_info:'出牌阶段限一次,你可以弃置一张黑色的杀,令一名有手牌的其他角色展示手牌并弃置其中的所有闪,若其没有闪则受到1点雷电伤害', rumeng:'入梦', rumeng_info:'其他角色的出牌阶段前,你可以弃置一张非基本牌,并令其选择一项:弃置一张基本牌,或跳过出牌及弃牌阶段', lianda:'连打', lianda_info:'当你使用一杀结算完毕后,可以弃置一张牌视为对目标再使用一张杀', xianghui:'祥晖', - xianghui_info:'出牌阶段限一次,你可以弃置一张红色手牌,然后令场上体力值最少的角色各回复一点体力', + xianghui_info:'出牌阶段限一次,你可以弃置一张红色手牌,然后令场上体力值最少的角色各回复1点体力', huiqi:'回气', huiqi_info:'每当你受到一次伤害,可令一名其他角色摸X张牌,X为你已损失的体力值', toudan:'投弹', - toudan_info:'出牌阶段限一次,你可以弃置一张黑桃牌对一名其他角色造成一点火焰伤害,然后你与距离该角色1以内的所有角色各弃置一张牌', + toudan_info:'出牌阶段限一次,你可以弃置一张黑桃牌对一名其他角色造成1点火焰伤害,然后你与距离该角色1以内的所有角色各弃置一张牌', shending:'神丁', shending_info:'锁定技,若你没有宝物牌,视为装备了蓝格怪衣', hzhenwei:'镇卫', @@ -9914,33 +9914,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hudun:'盾甲', hudun_bg:'盾', hudun2:'盾甲', - hudun_info:'锁定技,当你对其他角色造成伤害后,若你没有护甲,你获得一点护甲值', + hudun_info:'锁定技,当你对其他角色造成伤害后,若你没有护甲,你获得1点护甲值', zhenjiu:'针灸', zhenjiu2:'针灸', - zhenjiu_info:'出牌阶段限一次,你可以将一张红色手牌置于一名角色的武将牌上,该角色于下一个准备阶段回复一点体力,然后获得此牌', + zhenjiu_info:'出牌阶段限一次,你可以将一张红色手牌置于一名角色的武将牌上,该角色于下一个准备阶段回复1点体力,然后获得此牌', ljifeng:'疾风', ljifeng_info:'锁定技,你的攻击范围+X,杀可以额外指定X个目标,X为你已损失的体力值', lxianglong:'翔龙', lxianglong_info:'每当你闪避一张杀,你可以视为使用一张杀', shangxi:'伤袭', - shangxi_info:'准备阶段,你可以弃置一张牌,并对攻击范围内一名体力值不小于你的其他角色造成一点伤害', + shangxi_info:'准备阶段,你可以弃置一张牌,并对攻击范围内一名体力值不小于你的其他角色造成1点伤害', fzhenwei:'镇威', fzhenwei_info:'在你的回合内,你可以将其他角色打出的卡牌交给除该角色外的任意一名角色', fuyan:'覆岩', fuyan2:'覆岩', - fuyan_info:'每当你受到一次伤害,可以令一名没有护甲的角色获得一点护甲值', + fuyan_info:'每当你受到一次伤害,可以令一名没有护甲的角色获得1点护甲值', guaili:'怪力', guaili_info:'锁定技,你的杀造成的伤害+1,造成伤害后需弃置两张手牌', pingshen:'凭神', pingshen2:'凭神', pingshen_info:'锁定技,受到过你的伤害的角色可在回合内对你发动一次【离魂】(每局限发动一次)', xingzhui:'星坠', - xingzhui_info:'出牌阶段限一次,你可以弃置一张牌,并令一名有牌的其他角色弃置一张类别相同的牌,若则受到一点伤害', + xingzhui_info:'出牌阶段限一次,你可以弃置一张牌,并令一名有牌的其他角色弃置一张类别相同的牌,若则受到1点伤害', lingxian:'凌仙', lingxian_info:'每当你于回合外使用或打出一张手牌,你可以选择攻击范围外的一名其他角色与你各摸一张牌', shouyin:'守印', shouyin_info:'限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色将体力回复至体力上限', - shouyin_info_alter:'限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色回复两点体力', + shouyin_info_alter:'限定技,当任意一名角色处于濒死状态时,若你的武将牌正朝上,可以将武将牌翻面,然后令场上所有存活角色回复2点体力', bofeng:'搏风', bofeng_info:'锁定技,体力值不大于你的角色视为在你的攻击范围;当你使用杀指定目标时,可令目标额外打出一张闪,否则此杀不可闪避且造成的伤害+1', hutian:'护天', @@ -9959,9 +9959,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xiaozhan:'消战', xiaozhan_info:'其他角色使用杀时,若你不是杀的目标,可以弃置一张杀取消之', xielei:'挟雷', - xielei_info:'每当你使用或打出一张杀,可以弃置一张牌并对目标以外的一名角色造成一点雷电伤害', + xielei_info:'每当你使用或打出一张杀,可以弃置一张牌并对目标以外的一名角色造成1点雷电伤害', dangping:'荡平', - dangping_info:'每当你造成一次伤害,可以弃置一张手牌对其距离1以内的另一名角色造成一点伤害,每回合限一次', + dangping_info:'每当你造成一次伤害,可以弃置一张手牌对其距离1以内的另一名角色造成1点伤害,每回合限一次', guisi:'归思', guisi_info:'每当你成为杀的目标,你可以交给对方一张手牌并取消之', duishi:'对诗', @@ -9975,7 +9975,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ daofa:'道法', daofa_info:'每当有一名其他角色造成伤害,你可以令其弃置一张牌', xiaomoyu:'魔愈', - xiaomoyu_info:'锁定技,每当你于一个回合内首次造成伤害,你回复一点体力,若你没有受伤,则改为摸一张牌', + xiaomoyu_info:'锁定技,每当你于一个回合内首次造成伤害,你回复1点体力,若你没有受伤,则改为摸一张牌', yihua:'移花', yihua_info:'每当你成为其他角色的某张卡牌的惟一目标时,你可以弃置两张手牌,将使用者与目标对调', youyin:'游吟', @@ -9986,19 +9986,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huopu_info:'出牌阶段限一次,你可以将一张红桃牌当作流星火羽使用', benlei:'奔雷', benlei2:'奔雷', - benlei_info:'你可以将三张牌当惊雷闪使用;每当你造成一次雷属性伤害,你回复一点体力', + benlei_info:'你可以将三张牌当惊雷闪使用;每当你造成一次雷属性伤害,你回复1点体力', lingwu:'灵舞', lingwu_info:'回合结束后,若你在本回合内使用的牌数不少于当前体力值,你可以进行一个额外的回合(不可重复发动)', miejing:'灭境', - miejing_info:'限制技,你可以弃置所有黑色牌,然后令所有其他角色受到一点雷电伤害', + miejing_info:'限制技,你可以弃置所有黑色牌,然后令所有其他角色受到1点雷电伤害', lingxin:'灵心', lingxin_info:'结束阶段,你可以亮出牌堆顶的三张牌,然后获得其中的红桃牌', fushen:'附身', - fushen_info:'回合开始前,你可以将自己移出游戏,并代替另一名角色进行一回合,然后流失一点体力', + fushen_info:'回合开始前,你可以将自己移出游戏,并代替另一名角色进行一回合,然后失去1点体力', fushen2:'附身', wangchen:'忘尘', wangchen_info:'弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面', - wangchen_info_alter:'弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面并获得一点护甲', + wangchen_info_alter:'弃牌阶段结束时,若你于此阶段弃置了基本牌,你可以令一名角色翻面并获得1点护甲', // wangchen_info:'若你于弃牌阶段弃置了基本牌,可令一名角色翻面', // wangchen_info:'弃牌阶段结束时,若你于此阶段弃置了基本牌,可将一名其他角色移出游戏直到你死亡或下一回合开始', guiyin:'归隐', @@ -10017,15 +10017,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ swdxueyi:'血裔', swdxueyi_info:'锁定技,你摸牌阶段额外摸X张牌,X为你已损失的体力值', moyan:'血焰', - moyan_info:'出牌阶段,你可以弃置X张红色手牌,然后对至多X名角色各造成一点火焰伤害,X为你已损失的体力值。每阶段限一次', + moyan_info:'出牌阶段,你可以弃置X张红色手牌,然后对至多X名角色各造成1点火焰伤害,X为你已损失的体力值。每阶段限一次', aojian:'傲剑', - aojian_info:'出牌阶段,你可以弃置X张手牌,然后对攻击范围内至多X名角色各造成一点伤害,X为你已损失的体力值。每阶段限一次', + aojian_info:'出牌阶段,你可以弃置X张手牌,然后对攻击范围内至多X名角色各造成1点伤害,X为你已损失的体力值。每阶段限一次', milesxiehun:'邪魂', milesxiehun_info:'锁定技,出牌阶段结束后,你令随机X名角色各弃置一张牌,X为你已损失的体力值且至少为1 ', liaochen:'撩尘', liaochen_info:'锁定技,出牌阶段结束后,所有角色需弃置一张牌', yinmo:'引魔', - yinmo_info:'锁定技,当你对场上所有角色发动「连计」后,你立即变身为魔化宁珂,然后对所有其他角色造成一点雷电伤害', + yinmo_info:'锁定技,当你对场上所有角色发动「连计」后,你立即变身为魔化宁珂,然后对所有其他角色造成1点雷电伤害', huanxing:'幻形', huanxing2:'幻形', huanxing_info:'准备阶段,你可以弃置一张牌并选择一名男性角色,获得其所有技能,直到你首次受到伤害', @@ -10033,8 +10033,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ meihuo_info:'每当你失去最后一张装备牌,你可以获得一名其他角色的一张牌,若此牌来自装备区,你立即装备之', touxi:'偷袭', - touxi_info:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成一点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以弃置你的一张牌', - touxi_info_alter:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成一点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以获得你的一张牌', + touxi_info:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以弃置你的一张牌', + touxi_info_alter:'在其他角色的结束阶段,你可以进行一次判定,若结果为黑色,你对其造成1点雷电伤害,且直到下一回合开始不能再次发动偷袭;若结果为红色,对方可以获得你的一张牌', minjing:'明镜', minjing_info:'若你没有防具牌,你视为装备了光纱天衣', jqimou:'奇谋', @@ -10073,7 +10073,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huajian:'化剑', huajian_info:'出牌阶段结束时,你可以将一张牌当作杀对任意一名角色使用', xuanyuan:'轩辕', - xuanyuan_info:'锁定技,你无视【轩辕剑】的装备条件及流失体力的效果;结束阶段,你可以弃置一张黑桃牌从弃牌堆中获得【轩辕剑】并装备之', + xuanyuan_info:'锁定技,你无视【轩辕剑】的装备条件及失去体力的效果;结束阶段,你可以弃置一张黑桃牌从弃牌堆中获得【轩辕剑】并装备之', jilve:'极略', jilve_backup:'极略', jilve2:'极略', @@ -10088,9 +10088,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ poyue_info:'锁定技,你的黑杀无视距离,红色杀不计入回合内的出杀限制且不可闪避', poyue_info_alter:'锁定技,你的黑杀无视距离,红色杀不可闪避', mojian:'墨剑', - mojian_info:'每当你使用杀并指定目标后,你可以令其摸一张牌,然后你回复一点体力', + mojian_info:'每当你使用杀并指定目标后,你可以令其摸一张牌,然后你回复1点体力', duanyue:'断月', - duanyue_info:'出牌阶段限一次,你可以弃置一张装备牌,对一名其他角色造成一点伤害', + duanyue_info:'出牌阶段限一次,你可以弃置一张装备牌,对一名其他角色造成1点伤害', tuzhen:'突阵', tuzhen_info:'当你造成一次伤害后,你可以弃置对方手牌中的非基本牌', tuzhen_info_alter:'当你造成一次伤害后,你可以弃置对方手牌中的一张非基本牌', @@ -10103,13 +10103,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xuanzhou:'玄咒', xuanzhou_info:'出牌阶段限一次,你可以将一张普通锦囊牌当作任意一张延时锦囊,对任意一名角色使用(无视锦囊使用范围限制)', ningxian:'凝霰', - ningxian_info:'每当你受到一次伤害,你可以弃置任意张黑色牌并选择等量其他角色对其各造成一点伤害', + ningxian_info:'每当你受到一次伤害,你可以弃置任意张黑色牌并选择等量其他角色对其各造成1点伤害', guanhu:'贯鹄', guanhu_info:'每当你使用杀造成伤害,你可以弃置对方一张手牌和一张装备牌', chuanyang:'穿杨', chuanyang_info:'每当你使用一张杀,若你不在目标的攻击范围,你可以令此杀不可闪避', fengming:'凤鸣', - fengming_info:'出牌阶段限一次,你可以弃置一张装备牌,令一名角色恢复一点体力并摸一张牌', + fengming_info:'出牌阶段限一次,你可以弃置一张装备牌,令一名角色恢复1点体力并摸一张牌', duanxing:'锻星', duanxing_info:'每当你装备一张未强化的装备牌,可以视为一名角色使用一张杀', wanjun:'万钧', @@ -10119,7 +10119,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ guiying:'鬼影', guiying_info:'你可以将一张黑色牌当偷梁换柱使用', shehun:'摄魂', - shehun_info:'出牌阶段限一次,你可以弃置任意张花色不同的牌,另一名其他角色弃置等量的牌,若其弃置的牌中有牌的花色与你弃置的牌相同,你对其造成一点伤害', + shehun_info:'出牌阶段限一次,你可以弃置任意张花色不同的牌,另一名其他角色弃置等量的牌,若其弃置的牌中有牌的花色与你弃置的牌相同,你对其造成1点伤害', zhanlu:'沾露', @@ -10208,16 +10208,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shengshou_info:'你可以将一张黑色手牌当作草药使用', susheng_info:'在任意一名角色即将死亡时,你可以弃置一张手牌防止其死亡,并将其体力回复至1,每回合限发动一次', susheng_info_alter:'在任意一名角色即将死亡时,你可以弃置一张红色手牌防止其死亡,并将其体力回复至1,每回合限发动一次', - zhanlu_info:'出牌阶段限一次,你可以弃置一张黑桃牌令至多3名角色各回复一点体力', + zhanlu_info:'出牌阶段限一次,你可以弃置一张黑桃牌令至多3名角色各回复1点体力', kunlunjing_info:'准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置', - kunlunjing_info_alter:'准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置,然后流失一点体力', + kunlunjing_info_alter:'准备阶段,若你的体力值小于上回合结束时的体力值,你可以将场上所有牌还原到你上一回合结束时的位置,然后失去1点体力', swd_xiuluo_info:'准备阶段,你可以弃一张手牌来弃置你判断区里的一张延时类锦囊(必须花色相同)', xianyin_info:'出牌阶段,你可以令所有判定区内有牌的角色弃置判定区内的牌,然后交给你一张手牌', qiaoxie_info:'每当你装备一张牌,可摸一张牌;每当你失去一张装备牌(不含替换),你可以弃置其他角色的一张牌', mailun_info:'准备阶段,你可以选择一个脉轮效果直到下一回合开始', - guiyan_info:'出牌阶段,你可以观看一名角色的手牌,并获得其中一张梅花牌,每阶段限一次。当你首次进入濒死状态时,你须回复一点体力并失去技能鬼眼', + guiyan_info:'出牌阶段,你可以观看一名角色的手牌,并获得其中一张梅花牌,每阶段限一次。当你首次进入濒死状态时,你须回复1点体力并失去技能鬼眼', busi_info:'锁定技,当你进入濒死状态时,你进行一次判定,若结果不为黑桃,你将体力回复至1并将武将牌翻至背面', - xuying_info:'锁定技,每当你即将受到伤害,你防止此伤害,若你此时有手牌,你流失一点体力', + xuying_info:'锁定技,每当你即将受到伤害,你防止此伤害,若你此时有手牌,你失去1点体力', yinguo_info:'除你之外的任意一名角色即将受到受到伤害时,若有伤害来源,你可以弃置一张牌将伤害来源和目标对调', yueren_info:'每当你使用一张杀,可以进行一次判定,若结果为黑色,你弃置目标一张牌,若结果为红色,你将此杀收回,每回合限发动一次', duijue_info:'限定技,出牌阶段,你可以指定一名体力值大于1的其他角色,你结束出牌阶段,并在回合结束后将所有其他角色移出游戏,然后该角色与你轮流进行回合,直到有一方死亡或一共进行六个回合为止', @@ -10226,13 +10226,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jumo_info:'锁定技,结束阶段,你摸X-1张牌,X为未进入混乱状态的角色数与进入混乱状态的角色数之差(若为双将则改为X)', jifeng_info:'你的杀和单体锦囊可以额外指定任意个目标,若如此做,此卡牌有一定机率失效,指定的目标越多失效的概率越大', mohua_info:'锁定技,在身份局中,当你进入濒死状态时,你立即变身为撒旦,体力上限变为现存角色数(至少为4),并成为其他所有角色的共同敌人', - miles_xueyi_info:'锁定技,你防止即将受到的伤害,然后流失一点体力', - duanyi_info:'出牌阶段限一次,你可以弃置两张杀,对一名角色造成一点伤害,然后其随机弃置X张牌,X为其已损失的体力值', - duanyi_info_alter:'出牌阶段限一次,你可以弃置两张杀,并对一名角色造成一点伤害', + miles_xueyi_info:'锁定技,你防止即将受到的伤害,然后失去1点体力', + duanyi_info:'出牌阶段限一次,你可以弃置两张杀,对一名角色造成1点伤害,然后其随机弃置X张牌,X为其已损失的体力值', + duanyi_info_alter:'出牌阶段限一次,你可以弃置两张杀,并对一名角色造成1点伤害', guxing_info:'出牌阶段,你可以将最后至多X张手牌当杀使用,此杀无视距离且可以指定至多3个目标,每造成一次伤害,你摸一张牌,X为你已损失的体力值且至少为1。', tianlun_info:'任意一名角色的判定牌生效前,你可以弃置一张场上角色的判定牌代替之', hlongyin_info:'出牌阶段,你可以弃置任意张颜色相同且点数不同的牌,并获得逆时针座位距离与卡牌点数相同的角色区域内的一张牌。每阶段限一次', - lanzhi_info:'每当你使用一张梅花牌,你可以令所有体力值不大于你的角色回复一点体力', + lanzhi_info:'每当你使用一张梅花牌,你可以令所有体力值不大于你的角色回复1点体力', lanzhi_old_info:'每当你即将造成伤害,可以防止此伤害,然后摸两张牌。每回合限发动一次。', tianhuo_info:'出牌阶段,你可以令所有角色弃置其判定区域内的牌,并受到没有来源的等量火焰伤害,每阶段限一次', huanyin_info:'锁定技,每当你成为其他角色的卡牌的目标时,你进行一次判定,若为黑桃则取消之,若为红桃你摸一张牌', @@ -10241,8 +10241,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liaoyuan_info:'每当你使用一张杀指定目标后,你可以弃置任意张与此杀花色相同的牌,若如此做,目标需额外打出等量的闪,每少打出一张闪,此杀的伤害+1', liaoyuan_info_alter:'每当你使用一张杀指定目标后,你可以弃置一张与此杀花色相同的牌,若如此做,目标需额外打出一张闪,若目标没打出闪,此杀的伤害+1', yishan_info:'每当你受到一次伤害,你可以重新获得最近失去的两张牌', - huanhun_info:'当一名角色进入濒死状态时,你可以弃置一张牌并令其进行一次判定,若结果为红色,其回复一点体力,否则其获得你弃置的牌', - huanhun_info_alter:'当一名角色进入濒死状态时,你可以弃置一张红色手牌并令其进行一次判定,若结果为红色,其回复一点体力,否则其获得你弃置的牌', + huanhun_info:'当一名角色进入濒死状态时,你可以弃置一张牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌', + huanhun_info_alter:'当一名角色进入濒死状态时,你可以弃置一张红色手牌并令其进行一次判定,若结果为红色,其回复1点体力,否则其获得你弃置的牌', daixing_info:'结束阶段,你可以弃置任意张牌并获得等量的护甲;这些护甲将在你的下个准备阶段消失', swd_wuxie_info:'锁定技,你不能成为其他角色的延时锦囊的目标', lqingcheng_info:'结束阶段,你可以进行判定,若为红色则可以继续判定,最多判定3次,判定结束后将判定成功的牌收入手牌', @@ -10253,9 +10253,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ningjian_info:'你可以将一张红色牌当闪、黑色牌当杀使用或打出', taixu_info:'限定技,你可以弃置你的所有牌(至少1张),并对一名体力值大于1为其他角色造成X点火焰伤害,X为你已损失的体力值且至少为1', duoren_info:'每当你闪避一张杀,你可以立即获得来源的武器牌', - tanlin_info:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得双方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的一点伤害。', - tanlin_info_alter:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得对方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的一点伤害。', - pozhen_info:'每当你受到一次伤害,若你的手牌数大于伤害来源,你可以弃置X张手牌对其造成一点伤害;若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。', + tanlin_info:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得双方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。', + tanlin_info_alter:'出牌阶段限一次,你可以与一名其他角色进行拼点,若你赢,你获得对方拼点牌、对该角色使用卡牌无视距离且可以额外使用一张杀直到回合结束,若你没赢,你受到该角色的1点伤害。', + pozhen_info:'每当你受到一次伤害,若你的手牌数大于伤害来源,你可以弃置X张手牌对其造成1点伤害;若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。', pozhen_info_alter:'每当你受到一次伤害,若你的手牌数小于伤害来源,你可以弃置其X张手牌。X为你与伤害来源的手牌数之差。', yunchou_info:'出牌阶段限一次,你可以弃置一张手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌', yunchou_info_alter:'出牌阶段限一次,你可以弃置一张非基本手牌,并弃置一名其他角色的一张手牌,若两张牌颜色相同,你摸一张牌,否则对方摸一张牌', @@ -10271,7 +10271,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhuyu_info:'每当一名横置的角色即将受到伤害时,你可以弃置一张红色牌令此伤害+1并变为火属性', ningshuang_info:'每当你成为黑色牌的目标,你可以弃置一张黑色牌将其横置,并摸一张牌,若其已经模置则改为将其翻面', zaowu_old_info:'出牌阶段,你可以弃置三张不同类型的牌,创造任意两张牌并获得之', - xielv_info:'弃牌阶段结束后,若你的所有手牌(至少两张)颜色均相同,你可以展示所有手牌,然后回复一点体力并弃置场上的所有判定牌', + xielv_info:'弃牌阶段结束后,若你的所有手牌(至少两张)颜色均相同,你可以展示所有手牌,然后回复1点体力并弃置场上的所有判定牌', }, }; }); diff --git a/character/tw.js b/character/tw.js index 3634b39ed..90a6f4b75 100644 --- a/character/tw.js +++ b/character/tw.js @@ -1100,20 +1100,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, logTarget:'player', check:function(event,player){ - var att=get.attitude(event.player,player); - if(player.hasSkill('twzhiqu')){ - var cnt=game.countPlayer(current=>get.distance(player,current)==2&&!player.inRange(current)); - if(cnt>=2){ - if(att<0) return true; - return false; - } - if(att<0&&cnt>=2||att>0&&!cnt) return true; - return false; - } - else{ - if(att<0) return false; - return true; - } + let att=get.attitude(player,event.player); + if(att>0) return true; + if(!player.hasSkill('twzhiqu')) return false; + let cnt=game.countPlayer(current=>get.distance(player,current)===2); + if(cnt>2||cnt===2&&Math.abs(att)<2||cnt&&Math.abs(att)<1) return true; + return false; }, content:function(){ 'step 0' @@ -1126,20 +1118,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return _status.event.choice; }).set('choice',function(){ var att=get.attitude(target,player); - if(att==0) return 0; + if(att===0) return 0; if(player.hasSkill('twzhiqu')){ - var cnt=game.countPlayer(current=>get.distance(player,current)==2&&!player.inRange(current)); - if(cnt>=2){ - if(att<0) return 1; - return 0; + var cnt=game.countPlayer(current=>get.distance(player,current)===2); + if(att>0){ + if(cnt||player.needsToDiscard(1)) return 0; + return 1; } - if(att<0&&cnt>=2||att>0&&!cnt) return 1; + if(!cnt) return 0; + if(cnt>=2||get.distance(target,player,'attack')===2||get.distance(target,player)===2) return 1; return 0; } - else{ - if(att<0) return 0; - return [0,1].randomGet(); - } + if(att<0||player.needsToDiscard(1)&&game.hasPlayer(function(current){ + return current!==player&¤t!==target&&!player.inRange(current); + })) return 0; + return [0,1].randomGet(); }()); 'step 1' if(result.index==0){ @@ -1360,6 +1353,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ locked:false, direct:true, onremove:true, + intro:{ + content:'players' + }, filter:function(event,player){ return game.hasPlayer(current=>current!=player)&&(event.name!='phase'||game.phaseNumber==0); }, @@ -4570,6 +4566,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, logTarget:'target', init:function(player){ + var target=_status.currentPhase; + if(!target||!target!=player) return; if(!player.getStorage('twxiangyu_range').length){ var targets=game.filterPlayer(current=>{ return current.getHistory('lose').length; @@ -4591,7 +4589,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mod:{ attackRange:function(player,num){ - return num+player.getStorage('twxiangyu_range').length; + return num+Math.min(5,player.getStorage('twxiangyu_range').length); }, }, subSkill:{ @@ -4622,7 +4620,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ marktext:'羽', intro:{ content:function(storage,player){ - var num=storage?storage.length:0; + var num=Math.min(5,storage?storage.length:0); return '攻击范围+'+num; }, }, @@ -5687,7 +5685,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool) player.loseToDiscardpile(result.links); else event.finish(); 'step 5' - player.chooseTarget('星舞:选择一名其他角色','弃置其装备区内的所有牌。然后对其造成两点伤害(若其性别包含女性则改为1点)',true,lib.filter.notMe).set('ai',function(target){ + player.chooseTarget('星舞:选择一名其他角色','弃置其装备区内的所有牌。然后对其造成2点伤害(若其性别包含女性则改为1点)',true,lib.filter.notMe).set('ai',function(target){ return get.damageEffect(target,player,player)*Math.sqrt(4+target.countCards('e',function(card){ return get.value(card,target)>0; }))*(target.hasSex('female')?1:2); @@ -8220,7 +8218,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return names.length>0&&player.hasCard(function(card){ return names.includes(get.name(card)); },'hs'); - return false; + //return false; }, group:'twchaofeng_compare', chooseButton:{ @@ -10352,7 +10350,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:"mark", }, audio:2, - trigger:{player:"useCard"}, + trigger:{player:"useCardAfter"}, filter:function(event,player){ var evt=event.getParent('phaseUse'); if(!evt||evt.player!=player) return false; @@ -10383,13 +10381,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' var choiceList=['令'+get.translation(trigger.source)+'本回合不能再使用或打出牌']; - if (trigger.source.countCards('h')) choiceList.push('令'+get.translation(trigger.source)+'弃置两张牌'); + if (trigger.source.countCards('he')) choiceList.push('令'+get.translation(trigger.source)+'弃置两张牌'); player.chooseControl('cancel2').set('prompt2',get.prompt2('yuzhang')).set('choiceList',choiceList).set('ai',function(){ var player=_status.event.player,source=_status.event.source; - if(get.attitude(player,event.source)>0) return 'cancel2'; + if(get.attitude(player,event.source)>=0) return 'cancel2'; if(source.hasSkillTag('noh')||source.hasSkillTag('noe')||source.countCards('h')>=4) return 0; - if(source.hp>1&&source.countCards('h')>1) return 1; - return 'cancel2'; + if(source.hp>1&&source.countCards('he')>1) return 1; + return [0,1].randomGet(); }).set('source',trigger.source); 'step 1' if(result.control!='cancel2'){ @@ -10404,17 +10402,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ skip:{ audio:'yuzhang', trigger:{ - player:["phaseJudgeBefore","phaseDrawBefore","phaseUseBefore","phaseDiscardBefore"], + player:['phaseZhunbeiBefore',"phaseJudgeBefore","phaseDrawBefore","phaseUseBefore","phaseDiscardBefore",'phaseJieshuBefore'], }, filter:function(event,player){ return player.hasMark('twjingce'); }, - "prompt2":function(event,player){ - var str='弃置一枚“策”并跳过' - if(event.name=='phaseJudge') str+='判定'; - if(event.name=='phaseDraw') str+='摸牌'; - if(event.name=='phaseUse') str+='出牌'; - if(event.name=='phaseDiscard') str+='弃牌'; + prompt2:function(event,player){ + var str='弃置一枚“策”并跳过'; + var list=lib.skill.yuzhang.subSkill.skip.trigger.player.slice(); + list=list.map(i=>i.slice(0,-6)); + str+=['准备','判定','摸牌','出牌','弃牌','结束'][list.indexOf(event.name)]; str+='阶段'; return str; }, @@ -10426,26 +10423,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.removeMark('twjingce',1); trigger.cancel(); }, - sub:true, }, dontuse:{ charlotte:true, mark:true, mod:{ - cardEnabled:function(card){ - return false; - }, - cardRespondable:function(card){ - return false; - }, - cardSavable:function(card){ + cardEnabled2:function(card){ return false; }, }, intro:{ content:"不能使用或打出牌", }, - sub:true, }, }, }, @@ -10800,7 +10789,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget(lib.filter.notMe,'是否令一名其他角色也获得【'+get.translation(skill)+'】?').set('ai',function(target){ var player=_status.event.player; if(player.identity=='nei') return 0; - return get.attitude(player,target)-6; + return get.attitude(player,target); }); 'step 2' if(result.bool){ @@ -11389,6 +11378,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, twzhian:{ audio:2, + init:function(player){ + game.addGlobalSkill('twzhian_ai'); + }, + onremove:function(player){ + game.removeGlobalSkill('twzhian_ai'); + }, usable:1, trigger:{global:'useCardAfter'}, direct:true, @@ -11468,6 +11463,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 2' if(result.bool&&target.getCards('ej').contains(trigger.cards[0])) player.gain(trigger.cards,target,'give','bySelf'); }, + subSkill:{ + ai:{ + trigger:{player:'dieAfter'}, + filter:function(event,player){ + return !game.hasPlayer((current)=>current.hasSkill('twzhian'),true); + }, + silent:true, + forceDie:true, + content:function(){ + game.removeGlobalSkill('twzhian_ai'); + }, + ai:{ + effect:{ + player:function(card,player,target){ + if(get.type(card)!=='delay'&&get.type(card)!=='equip') return 1; + let za=game.findPlayer((cur)=>cur.hasSkill('twzhian')&&(!cur.storage.counttrigger||!cur.storage.counttrigger.twzhian)&&get.attitude(player,cur)<=0); + if(za) return [0.5,-0.8]; + } + } + } + } + } }, twyujue:{ audio:2, @@ -11505,7 +11522,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=2; if(target.hasSkill('twyujue_effect0')) num--; if(target.hasSkill('twyujue_effect1')) num--; - num=Math.min(num,trigger.getl(target).cards2.length); + var cards=trigger.getg(player); + num=Math.min(num,trigger.getl(target).cards2.filter(i=>cards.includes(i)).length); if(num>0) event.count=num; else if(targets.length>0) event.redo(); else event.finish(); @@ -13167,6 +13185,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ trigger.num--; }, + ai:{ + effect:{ + target:function(card,player,target){ + if(typeof card=='object'&&target.storage.gx_chongyingshenfu_effect&&target.getStorage('gx_chongyingshenfu_effect').includes(card.name)&&!target.hasSkillTag('unequip2')&& + get.itemtype(player)!=='player'||!player.hasSkillTag('jueqing',false,target)&&!player.hasSkillTag('unequip',false,{ + name:card.name, + target:target, + card:card, + })){ + if(player&&player.hasSkillTag('damageBonus',true,{ + target:target, + card:card + })) return 0.5; + return 'zeroplayertarget'; + } + } + } + }, onremove:true, intro:{ content:'受到$造成的伤害-1', @@ -13452,7 +13488,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.addTempSkill('twrangyi2'); 'step 1' target.chooseToUse({ - prompt:'请使用得到的一张牌,或者受到来自'+get.translation(player)+'的一点伤害', + prompt:'请使用得到的一张牌,或者受到来自'+get.translation(player)+'的1点伤害', filterCard:function(card,player){ if(get.itemtype(card)!='card'||!card.hasGaintag('twrangyi')) return false; return lib.filter.filterCard(card,player,event); @@ -13517,7 +13553,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ effect:{ target:function(card,player,target,current){ if(target.countCards('h')) return; - if(get.tag(card,'natureDamage')) return 'zerotarget'; + if(get.tag(card,'natureDamage')) return 'zeroplayertarget'; if(get.type(card)=='trick'&&get.tag(card,'damage')){ return 'zeroplayertarget'; } @@ -14017,6 +14053,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterReplace:{ tw_caocao:['tw_caocao','jsrg_caocao','yj_caocao'], mateng:['tw_mateng','mateng'], + xiahouen:['tw_xiahouen','jsrg_xiahouen'], + jiangji:['tw_jiangji','jiangji'], + baoxin:['tw_baoxin','baoxin'], + yanxiang:['yanxiang','tw_yanxiang'], }, dynamicTranslate:{ twfeifu:function(player){ @@ -14081,7 +14121,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twbaimei:'白眉', twbaimei_info:'锁定技,若你没有手牌,则防止你受到的所有属性伤害和锦囊牌造成的伤害。', chijie:'持节', - chijie_info:' 游戏开始时,你可以选择一个现存势力,你的势力视为该势力。 ', + chijie_info:' 游戏开始时,你可以选择一个现存势力,你的势力视为该势力。', waishi:'外使', waishi_info:' 出牌阶段限一次,你可以用至多X张牌交换一名其他角色等量的手牌(X为现存势力数),然后若其与你势力相同或手牌多于你,你摸一张牌。', renshe:'忍涉', @@ -14113,13 +14153,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ beini:'悖逆', beini_info:'出牌阶段限一次,你可以选择一名体力值不小于你的角色,令你或其摸两张牌,然后未摸牌的角色视为对摸牌的角色使用一张【杀】。', dingfa:'定法', - dingfa_info:'弃牌阶段结束时,若本回合你失去的牌数不小于你的体力值,你可以选择一项:1、回复1点体力;2、对一名其他角色造成1点伤害。 ', + dingfa_info:'弃牌阶段结束时,若本回合你失去的牌数不小于你的体力值,你可以选择一项:1、回复1点体力;2、对一名其他角色造成1点伤害。', duosidawang:'朵思大王', equan:'恶泉', equan_info:'锁定技。①当有角色于你的回合内受到伤害后,其获得X枚“毒”(X为伤害值)。②准备阶段,你令所有拥有“毒”标记的角色移去所有“毒”标记并失去等量的体力。③当有角色因〖恶泉②〗进入濒死状态时,你令其所有技能失效直到回合结束。', manji:'蛮汲', manji_info:'锁定技。其他角色失去体力后,若你的体力值:不大于该角色,你回复1点体力;不小于该角色,你摸一张牌。', - wuban:'吴班', + wuban:'TW吴班', + wuban_prefix:'TW', jintao:'进讨', jintao_info:'锁定技,你使用【杀】无距离限制且次数上限+1。你于出牌阶段内使用的第一张【杀】伤害+1,第二张【杀】不可被响应。', yuejiu:'TW乐就', @@ -14191,7 +14232,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twlingfa_info:'①第一轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【杀】时,若其有牌,则其需弃置一张牌,否则受到你造成的1点伤害。②第二轮游戏开始时,你可选择获得如下效果直到本轮结束:其他角色使用【桃】结算结束后,若其有牌,则其需交给你一张牌,否则受到你造成的1点伤害。③第三轮游戏开始时,你失去〖令法〗并获得〖治暗〗。', twzhian:'治暗', twzhian_info:'每回合限一次。一名角色使用装备牌或延时锦囊牌后,你可选择:⒈弃置位于场上的此牌。⒉弃置一张手牌并获得位于场上的此牌。⒊对其造成1点伤害。', - tw_zhangmancheng:'张曼成', + tw_zhangmancheng:'TW张曼成', + tw_zhangmancheng_prefix:'TW', twfengji:'蜂集', twfengji_info:'出牌阶段开始时,若你没有“示”,则你可以将一张牌作为“示”置于武将牌上并施法:从牌堆中获得X张与“示”牌名相同的牌,然后移去“示”。', twyiju:'蚁聚', @@ -14223,7 +14265,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tw_guohuai:'TW郭淮', tw_guohuai_prefix:'TW', twjingce:"精策", - twjingce_info:"当你于出牌阶段使用第X张牌时,你可以摸两张牌(X为你的体力值)。若此阶段你此前摸过牌或本回合造成过伤害,你获得一枚“策”标记。", + twjingce_info:"当你于出牌阶段使用第X张牌结算完毕后,你可以摸两张牌(X为你的体力值)。若此阶段你此前已摸过牌或本回合造成过伤害,你获得一枚“策”标记。", yuzhang:"御嶂", yuzhang_info:"你可以弃置一枚“策”标记,然后跳过一个阶段。当你受到伤害后,你可弃置一枚“策”标记,然后选择一项:⒈令伤害来源弃置两张牌;⒉令伤害来源本回合不能再使用或打出牌。", tw_caozhao:'曹肇', @@ -14275,7 +14317,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twbingde_info:'出牌阶段限一次。你可以选择一个本阶段未选择过的花色并弃置一张牌,你摸等同于本阶段你使用此花色的牌数,然后若你以此法弃置的牌的花色与你选择的花色相同,你令你〖秉德〗于此阶段发动的次数上限+1。', twqingtao:'清滔', twqingtao_info:'①摸牌阶段结束时,你可以重铸一张牌。若此牌为【酒】或非基本牌,你摸一张牌。②结束阶段,若你本回合未发动〖清滔①〗,你可以发动〖清滔①〗。', - tw_jiangji:'蒋济', + tw_jiangji:'TW蒋济', + tw_jiangji_prefix:'TW', twjichou:'急筹', twjichou_info:'①每回合限一次。你可以视为使用一张未被〖急筹①〗记录过的普通锦囊牌并记录此牌。②你无法响应或{使用对应实体牌包含你的手牌的}〖急筹①〗记录过的锦囊牌。③出牌阶段限一次。你可将手牌中的一张〖急筹①〗记录过的锦囊牌交给其他角色。', twjilun:'机论', @@ -14308,7 +14351,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twxiongzheng_info:'一轮游戏开始时,①若你上一轮发动过〖雄争〗且选择过“雄争”角色,你可以选择一项:1.视为对任意名上一轮内未对“雄争”角色造成过伤害的角色依次使用一张【杀】;2.令任意名上一轮对“雄争”角色造成过伤害的角色摸两张牌。②你可以选择一名未以此法选择过的角色,称为“雄争”角色。', twluannian:'乱年', twluannian_info:'主公技。其他群势力角色的出牌阶段限一次。其可以弃置X张牌并对“雄争”角色造成1点伤害(X为所有角色于本轮发动〖乱年〗的次数+1)。', - tw_baoxin:'鲍信', + tw_baoxin:'TW鲍信', + tw_baoxin_prefix:'TW', twmutao:'募讨', twmutao_info:'出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】依次交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。', twyimou:'毅谋', @@ -14473,10 +14517,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tw_liuzhang_prefix:'TW', twyaohu:'邀虎', twyaohu_info:'每轮限一次。回合开始时,你须选择场上的一个势力。该势力的角色的出牌阶段开始时,其获得你的一张“生”,然后其须选择一项:1.对你指定的另一名的其他角色使用一张【杀】(无距离限制);2.本回合其使用伤害牌指定你为目标时须交给你两张牌,否则取消此目标。', - tw_liwei:'李遗', + tw_liwei:'TW李遗', + tw_liwei_prefix:'TW', twjiaohua:'教化', twjiaohua_info:'当你或体力值最小的其他角色因摸牌而得到牌后,你可以令该角色从牌堆或弃牌堆中获得一张本次未获得的类别的牌(每种类别每回合限一次)。', - tw_yanxiang:'阎象', + tw_yanxiang:'TW阎象', + tw_yanxiang_prefix:'TW', twkujian:'苦谏', twkujianx:'谏', twkujian_info:'出牌阶段限一次。你可以将至多三张手牌交给一名其他角色,称为“谏”,你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸一张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。', diff --git a/character/xiake.js b/character/xiake.js index 298b82e5d..b6e8a387d 100644 --- a/character/xiake.js +++ b/character/xiake.js @@ -106,13 +106,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xk_shenxiangyun:'沈湘芸', xk_fujianhan:'傅剑寒', zhongzhan:'重斩', - zhongzhan_info:'每当你即将造成伤害,你可流失一点体力令伤害+1', + zhongzhan_info:'每当你即将造成伤害,你可失去1点体力令伤害+1。', gzhenji:'震击', - gzhenji_info:'你使用杀造成伤害后,可以摸一张牌,并且本回合内可以额外使用一张杀', + gzhenji_info:'你使用杀造成伤害后,可以摸一张牌,并且本回合内可以额外使用一张杀。', rouquan:'柔拳', - rouquan_info:'你可以重铸装备区内的牌;当你没有武器牌时,你的杀可以指定任意个目标', + rouquan_info:'你可以重铸装备区内的牌;当你没有武器牌时,你的杀可以指定任意个目标。', zitong:'通悟', - zitong_info:'当你于自己的回合内使用第三张牌时,你可以将一张传送门置于你的手牌', + zitong_info:'当你于自己的回合内使用第三张牌时,你可以将一张传送门置于你的手牌。', }, }; }); diff --git a/character/xianding.js b/character/xianding.js index 9e66a7107..ff7c6b997 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -7,7 +7,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wu_luxun:['male','wu',3,['dcxiongmu','dczhangcai','dcruxian']], dc_xujing:['male','shu',3,['dcshangyu','dccaixia']], dc_zhaoxiang:['female','shu',4,['refanghun','refuhan']], - ol_guansuo:['male','shu',4,['xinzhengnan','xiefang']], + dc_guansuo:['male','shu',4,['xinzhengnan','xiefang']], dc_shixie:['male','qun',3,['rebiluan','ollixia']], dc_sp_machao:['male','qun',4,['zhuiji','dc_olshichou']], old_huangfusong:['male','qun',4,['xinfenyue']], @@ -94,8 +94,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp2_wangzhe:['dc_daxiaoqiao','dc_sp_machao'], sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi'], sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng'], - sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi'], - sp2_qifu:['ol_guansuo','dc_zhaoxiang','dc_xujing'], + sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi','dc_xujing'], + sp2_qifu:['dc_guansuo','dc_zhaoxiang'], sp2_gaoshan:['wanglang','liuhui'], sp2_wumiao:['wu_zhugeliang','wu_luxun'], } @@ -381,11 +381,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var cards=trigger.getd().filter(card=>{ return get.position(card)=='d'&&player.getStorage('dcshangyu').includes(card); - }); + }),targets=game.filterPlayer(current=>{ + return !player.getStorage('dcshangyu_transfer').includes(current); + }).sortBySeat(_status.currentPhase); event.cards=cards; player.chooseTarget(`赏誉:将${get.translation(cards)}交给一名可选角色`,(card,player,target)=>{ return !player.getStorage('dcshangyu_transfer').includes(target); - },true); + },true).set('ai',target=>{ + let att=get.sgn(get.attitude(_status.event.player,target)),idx=1+_status.event.targets.indexOf(target); + if(att<0) return -idx; + return att+1/idx; + }).set('targets',targets); 'step 1' if(result.bool){ var target=result.targets[0]; @@ -447,17 +453,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseControl(choices,'cancel2').set('prompt',get.prompt('dccaixia')).set('prompt2','你可以摸至多'+get.cnNumber(choices.length)+'张牌,但是你此后需要再使用等量的牌才可再发动本技能。').set('ai',()=>{ return _status.event.choice; }).set('choice',function(){ - if(player.isPhaseUsing()){ - if(!player.hasCard(card=>{ - return get.tag(card,'damage')&&player.hasValueTarget(card); - },'hs')) return 0; - var cards=player.getCards('hs',card=>{ - return player.hasValueTarget(card); - }); - if(!cards.some(card=>get.tag(card,'damage'))) return 0; - return Math.min(choices.length,cards.filter(card=>!get.tag(card,'damage')).length+1); + 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(damage) return Math.min(choices.length-1,cards.length-damage); + return Math.min(choices.length-1,cards.length-1); } - return choices.length; + return choices.length-1; }()); 'step 1' if(result.control!='cancel2'){ @@ -471,7 +473,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mod:{ aiOrder:function(player,card,num){ if(!get.tag(card,'damage')) return; - if(player.countMark('dccaixia_clear')>1) return num/2; + if(player.countMark('dccaixia_clear')>1) return num/3; return num+6; }, }, @@ -2358,22 +2360,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('choice',(()=>{ var choicesx=choices.slice(); var cards=player.getCards('hs'); - var bool1=get.tag(trigger.card,'damage')&&choicesx.contains('选项一')&&trigger.targets.some(current=>{ + var bool1=get.tag(trigger.card,'damage')&&choicesx.includes('选项一')&&trigger.targets.some(current=>{ return get.attitude(player,current)<0; - }),bool2=choicesx.contains('选项二')&&game.countPlayer(current=>get.attitude(player,current)>0)>=1; - if(!bool1&&!bool2){ + }),bool2=choicesx.includes('选项二'); + if(bool2) bool2=game.countPlayer(function(current){ + return player!=current&&get.attitude(player,current)>0; + }); + else bool2=0; + if(bool1||bool2){ for(var i=0;i2) return '选项二'; + if(choicesx.includes('选项三')) return '选项三'; + if(bool2===2) return '选项二'; if(bool1) return '选项一'; if(bool2) return '选项二'; return 'cancel2'; @@ -2486,6 +2494,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ effect:{ + mod:{ + aiOrder:function(player,card,num){ + if(num>0&&get.itemtype(card)==='card'&&card.hasGaintag('dczhizhe')) return num+0.16; + }, + aiValue:function(player,card,num){ + if(num>0&&get.itemtype(card)==='card'&&card.hasGaintag('dczhizhe')) return 2*num; + }, + aiUseful:function(player,card,num){ + if(num>0&&!player._dczhizhe_mod&&get.itemtype(card)==='card'&&card.hasGaintag('dczhizhe')){ + if(player.canIgnoreHandcard(card)) return Infinity; + player._dczhizhe_mod=true; + if(player.hp<3&&player.needsToDiscard(player.countCards('h',(cardx)=>{ + if(player.canIgnoreHandcard(cardx)||get.useful(cardx)>6) return true; + return false; + }))) return num*1.5; + return num*10; + } + } + }, trigger:{player:['useCardAfter','respondAfter']}, charlotte:true, forced:true, @@ -2778,7 +2805,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ order:1, result:{ target:function(player,target){ - if(game.roundNumber==1&&ui.cardPile.childNodes.length>game.countPlayer()*5&&!game.hasPlayer(current=>current.hp<=2)&&!player.hasSkill('dcjijiao_risutoa')) return 0; + if(ui.cardPile.childNodes.length>game.players.length*5&&!player.hasSkill('dcjijiao_risutoa')&& + !game.hasPlayer(current=>current.hp<=1)&&game.countPlayer(current=>current.hp===2&¤t.countCards('hes')<3)<=1) return 0; return 5; } } @@ -3028,8 +3056,43 @@ game.import('character',function(lib,game,ui,get,ai,_status){ },true); }, ai:{ - order:5.5, - result:{player:1} + order:function(){ + return 0.9*get.order({name:'juedou'}); + }, + tag:{ + respond:2, + respondSha:2, + damage:1, + }, + result:{ + player:function(player){ + let target=null, maxval=0; + for(let i of game.players){ + let jdeff=get.effect(i,{ + name:'juedou', + isCard:true, + cards:ui.selected.cards, + storage:{dcctjiuxian:true} + },player,player); + if(i===player||!player.canUse({ + name:'juedou', + isCard:true, + cards:ui.selected.cards, + storage:{dcctjiuxian:true} + },i)||jdeff<0) continue; + let receff=0; + game.filterPlayer(function(current){ + if(player!=current&&i.inRange(current)&¤t.isDamaged()) receff=Math.max(receff,get.recoverEffect(current,i,i)); + }); + if(jdeff+receff/5>maxval){ + target=i; + maxval=jdeff+receff/5; + } + } + if(target) return maxval/80; + return 0; + } + } }, subSkill:{ help:{ @@ -3484,6 +3547,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cardsx=player.getExpansions('dcwangyuan').removeArray(cards); if(cardsx.length<=1||get.color(cardsx)!='none'){ player.addTempSkill('dclingyin_effect'); + player.addMark('dclingyin_effect',1,false); game.log(player,'获得了','#g【铃音】','的后续效果'); } } @@ -3500,6 +3564,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ viewAs:{name:'juedou'}, charlotte:true, forced:true, + onremove:true, prompt:'将一张武器牌或防具牌当【决斗】使用', filterCard:function(card){ return get.subtype(card)=='equip1'||get.subtype(card)=='equip2'; @@ -3510,7 +3575,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return event.player!=player; }, content:function(){ - trigger.num++; + trigger.num+=player.countMark('dclingyin_effect'); }, ai:{ damageBonus:true, @@ -3609,6 +3674,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.logSkill('dcyuandi',target); if(result.control=='选项一'){ player.discardPlayerCard(target,'h',true); + if(get.mode()!=='identity'||player.identity!=='nei') player.addExpose(0.15); } else game.asyncDraw([target,player]); } @@ -3863,6 +3929,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dcaichen:{ audio:2, + init:function(player){ + game.addGlobalSkill('dcaichen_hit'); + }, + onremove:function(player){ + game.removeGlobalSkill('dcaichen_hit'); + }, trigger:{ player:['loseAfter','phaseDiscardBefore'], global:'loseAsyncAfter', @@ -3886,6 +3958,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.directHit.add(player); game.log(player,'不可响应',trigger.card); } + }, + subSkill:{ + hit:{ + trigger:{player:'dieAfter'}, + filter:function(event,player){ + return !game.hasPlayer(current=>current.hasSkill('dcaichen')); + }, + silent:true, + forceDie:true, + content:function(){ + game.removeGlobalSkill('dcaichen_hit'); + }, + ai:{ + directHit_ai:true, + skillTagFilter:function(player,tag,arg){ + return arg&&arg.card&&arg.target&&arg.target.hasSkill('dcaichen')&&ui.cardPile.childNodes.length<40&&get.suit(arg.card)==='spade'; + } + } + } } }, //杨彪 @@ -4348,7 +4439,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(cards.length){ player.chooseButton(['暗织:选择令'+get.translation(target)+'获得的牌',cards],true,Math.min(cards.length,2)).set('ai',button=>{ var player=_status.event.player,target=_status.event.getParent().target; - return get.sgnAttitude(player,target)*get.buttonValue(button); + return get.sgnAttitude(player,target)*get.value(button.link,target); }); } }else event.finish(); @@ -4498,11 +4589,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //周宣 dcwumei:{ audio:2, - trigger:{player:'phaseBegin'}, + trigger:{player:'phaseBeginStart'}, filter:function(event,player){ return !player.hasSkill('dcwumei_used'); }, - priority:10,//离谱的优先机制 direct:true, content:function(){ 'step 0' @@ -4529,17 +4619,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger._triggered=5; var evt=player.insertPhase(); delete evt.skill; + game.broadcastAll(function(player){ + player.classList.remove('glow_phase'); + delete _status.currentPhase; + },player); } } }, subSkill:{ used:{charlotte:true}, wake:{ + init:function(player){ + game.addGlobalSkill('dcwumei_all'); + }, + onremove:function(player){ + game.removeGlobalSkill('dcwumei_all'); + delete player.storage.dcwumei_wake; + }, trigger:{player:'phaseJieshuBegin'}, charlotte:true, popup:false, forced:true, - onremove:true, filter:function(event,player){ return player.storage.dcwumei_wake&&player.storage.dcwumei_wake.length; }, @@ -4572,17 +4672,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return str; } + } + }, + all:{ + trigger:{player:'dieAfter'}, + filter:function(event,player){ + return !game.hasPlayer(current=>current.hasSkill('dcwumei_wake')); + }, + silent:true, + forceDie:true, + content:function(){ + game.removeGlobalSkill('dcwumei_all'); }, ai:{ effect:{ player_use:function(card,player,target){ + if(get.tag(card,'recover')&&target.hp>0) return 0; if(get.tag(card,'damage')) return 0.5; - }, - target:function(card,player,target){ - if(_status.event.type!='phase') return; - if (get.tag(card,'recover')){ - return [1,1-target.hp]; - } } } } @@ -6151,7 +6257,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filterCard:()=>false, selectCard:-1, - charlotte:true, content:function(){ 'step 0' player.addTempSkill('dcfengyan_gain','phaseUseAfter'); @@ -6177,7 +6282,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filterCard:()=>false, selectCard:-1, - charlotte:true, content:function(){ player.addTempSkill('dcfengyan_sha','phaseUseAfter'); player.useCard({ @@ -7086,6 +7190,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var number=get.number(card,false); game.log(player,'将','#y'+get.strNumber(number),'记录为','#g“圆环之弧”'); player.markAuto('dcgeyuan_homura',[number]); + player.markSkill('dcgeyuan'); if(player.getStorage('dcgeyuan').length>player.getStorage('dcgeyuan_homura').length){ if(cards.length>0) event.redo(); else event.finish() @@ -7133,6 +7238,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num1=list[0],num2=list[list.length-1]; player.storage.dcgeyuan_homura=[]; game.log(player,'清空了','#g“圆环之弧”'); + player.markSkill('dcgeyuan'); if(player.getStorage('dcgeyuan').length>3){ player.unmarkAuto('dcgeyuan',[num1,num2]); game.log(player,'从','#g“圆环之理”','中移除了','#y'+get.strNumber(num1),'和','#y'+get.strNumber(num2)); @@ -7206,6 +7312,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, intro:{ name:'圆环之理', + markcount:function(storage,player){ + if(!player.storage.dcgeyuan||!player.getStorage('dcgeyuan_homura').length) return 0; + var list=player.storage.dcgeyuan.filter(i=>lib.skill.dcgeyuan.filterNumber(player,i)); + if(!list.length) return 0; + list=list.map(num=>{ + var list=[1,10,11,12,13]; + if(list.contains(num)) return ['A','X','J','Q','K'][list.indexOf(num)]; + return parseFloat(num); + }); + return list.reduce((str,num)=>{ + return str+num; + },''); + }, mark:function(dialog,storage,player){ dialog.content.style['overflow-x']='visible'; var list=storage; @@ -7722,6 +7841,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ onremove:true, subSkill:{ insert:{ + mark:true, + intro:{ + content:'players' + }, trigger:{global:'phaseAfter'}, forced:true, charlotte:true, @@ -9112,39 +9235,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.index==1) player.loseMaxHp(); else player.loseHp(); 'step 2' - event.videoId=lib.status.videoId++; - var func=function(player,id){ - var list=[ - '选项一:摸两张牌', - '选项二:对一名其他角色造成1点伤害,且本回合对其使用【杀】无距离和次数限制', - '选项三:本回合手牌上限视为无限', - '选项四:获得一名其他角色区域内的一张牌', - '选项五:令一名其他角色将手牌数摸至体力上限(至多摸至五张)', - ]; - var choiceList=ui.create.dialog('玉陨:请选择一'+(player.getDamagedHp()>0?('至'+get.cnNumber(player.getDamagedHp()+1)):'')+'项'); - choiceList.videoId=id; - for(var i=0;i0?('至'+get.cnNumber(player.getDamagedHp()+1)):'')+'项', + [list.map((item,i)=>{ + return [i,item]; + }),'textbutton'] + ]); next.set('dialog',event.videoId); next.set('forced',true); next.set('ai',function(button){ @@ -9187,10 +9290,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); if(player.getDamagedHp()>0) next.set('selectButton',[1,1+player.getDamagedHp()]); 'step 3' - if(player.isOnline2()){ - player.send('closeDialog',event.videoId); - } - event.dialog.close(); result.links.sort(); for(var i of result.links) game.log(player,'选择了','#g【玉陨】','的','#y选项'+get.cnNumber(1+i,true)) event.links=result.links; @@ -9916,7 +10015,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var list=[]; event.addIndex=0; var str=get.translation(target); - if(target.isDamaged()) list.push('令'+str+'回复一点体力'); + if(target.isDamaged()) list.push('令'+str+'回复1点体力'); else event.addIndex++; if(target.isLinked()||target.isTurnedOver()) list.push('令'+get.translation(target)+'复原武将牌'); if(!list.length) event.finish(); @@ -10140,26 +10239,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ '选择手牌数大于你的一名角色', '选择装备数大于你的一名角色', ]; - var choiceList=ui.create.dialog('尊位:清选择一项','forcebutton','hidden'); - for(var i=0;i{ + return [i,item]; + }),'textbutton']) return choiceList; }, filter:function(button){ @@ -10447,6 +10530,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.draw(2+get.sgn(trigger.player.hp-player.hp)); }, + ai:{ + effect:{ + target:function(card,player,target){ + if(get.itemtype(player)!=='player'||player===target) return 1; + let num=1,ds=2+get.sgn(player.hp-target.hp); + if(player===_status.currentPhase&&_status.currentPhase.group==='qun'&&target.hasZhuSkill('yuwei',player)) num=2; + if(target.getHistory('gain',function(evt){ + return evt.getParent(2).name==='shiyuan'&&evt.cards.length===ds; + }).length>=num) return 1; + let name=get.name(card); + if(get.tag(card,'lose')||name==='huogong'||name==='juedou'||name==='tiesuo') return [1,ds]; + if(!target.hasFriend()) return 1; + return [1,0.8*ds]; + } + } + } }, dushi:{ audio:2, @@ -10483,8 +10582,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, yuwei:{ + audio:2, + trigger:{player:'shiyuanBegin'}, + filter:function(event,player){ + return _status.currentPhase.group=='qun'; + }, zhuSkill:true, - locked:true, + forced:true, + content:function(){}, ai:{combo:'shiyuan'}, }, @@ -10505,14 +10610,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ list.add(get.suit(card,false)); } game.getGlobalHistory('cardMove',function(evt){ - if(evt==event||evt.getParent()==event||(evt.name!='lose'&&evt.name!='cardsDiscard')) return false; + if(evt.name!='lose'&&evt.name!='cardsDiscard') return false; if(evt.name=='lose'&&evt.position!=ui.discardPile) return false; + if(evt==event||evt.getParent()==event) return false; num+=evt.cards.length; for(var i=0;i0; }, @@ -10522,20 +10628,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=trigger.getd(); for(var i=0;iget.name(card)!=='tao','h'); + } + }, }, souying:{ audio:2, @@ -11496,7 +11609,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 7-get.value(card); }, content:function(){ - player.addSkill('pyzhuren_destroy'); + //player.addSkill('pyzhuren_destroy'); if(!_status.pyzhuren) _status.pyzhuren={}; var rand=0.85; var num=get.number(cards[0]); @@ -11514,7 +11627,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ _status.pyzhuren[name]=true; - player.gain(game.createCard(name,cards[0].name=='shandian'?'spade':cards[0].suit,1),'gain2') + var card=game.createCard(name,cards[0].name=='shandian'?'spade':cards[0].suit,1); + card.destroyed='discardPile'; + player.gain(card,'gain2') } }, ai:{ @@ -11524,32 +11639,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, - pyzhuren_destroy:{ - trigger:{global:['loseEnd','cardsDiscardEnd']}, - forced:true, - charlotte:true, - filter:function(event,player){ - var cs=event.cards; - for(var i=0;i0); next.logSkill=[event.name,trigger.player]; 'step 1' if(result.bool) trigger.num++; @@ -11690,10 +11777,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jueqing:true, unequip_ai:true, skillTagFilter:function(player,tag,arg){ - if(tag=='unequip_ai'){ - if(arg&&arg.name=='sha'&&get.color(arg.card)=='black') return true; - return false; - } + if(tag=='unequip_ai') return arg&&arg.name==='sha'; } }, }, @@ -12136,7 +12220,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yuanji:'袁氏(生卒年不详),汝南郡汝阳县(今河南商水)人,袁术之女,孙权妃嫔。袁夫人出身世家大族汝南袁氏,其父袁术败亡后,入吴宫拜为夫人,以节操品行着称。', chengbing:'程秉(生卒年不详),字德枢,汝南南顿(今河南项城西)人。三国时期吴国官员、儒学家。起初跟随郑玄,后来北方荒乱而到交州避难,期间与刘熙考究五经大义,因此通绕五经。后来交趾太守士燮任命程秉为长史。吴大帝孙权听闻程秉的名声,于是以礼征召他,程秉到后,被任命为太子太傅。黄武四年(225年),孙权为太子孙登娶周瑜之女为妃,程秉以太常身份于吴郡迎候,孙权亲身上程秉的船,可见孙权对他的极为礼待。程秉又教诲孙登对婚后相处要尊重儒家礼教。后来因病在任职期间逝世。著有《周易摘》、《尚书驳》、《论语弼》,凡三万余言。', dc_zhouxuān:'周宣,生卒年不详,字孔和,乐安(治今山东高苑西北)人,擅长解梦,在郡做官时曾为太守解过梦,后又给曹丕解梦,都灵验。官至中郎,死于魏明帝末年。', - xuelingyun:'薛灵芸,东晋王嘉志怪小说《拾遗记》中的人物,魏文帝曹丕的宫人,妙于针工,虽处于深帷之内,不用灯烛之光,裁制立成。凡不是薛灵芸缝制的衣服,文帝一概不穿,宫中号为针神。薛灵芸的故事在正史中虽无记载,却由于许多野史笔记偶尔提及,如《拾遗记》、《太平广记》、《艳异编》等,渐于后世成为中国古代著名美女形象。,', + xuelingyun:'薛灵芸,东晋王嘉志怪小说《拾遗记》中的人物,魏文帝曹丕的宫人,妙于针工,虽处于深帷之内,不用灯烛之光,裁制立成。凡不是薛灵芸缝制的衣服,文帝一概不穿,宫中号为针神。薛灵芸的故事在正史中虽无记载,却由于许多野史笔记偶尔提及,如《拾遗记》、《太平广记》、《艳异编》等,渐于后世成为中国古代著名美女形象。', yanghong:'杨弘,东汉末年袁术部将。袁术死后,杨弘等将其众欲归孙策,后庐江太守刘勋截击,转归于勋。', xielingyu:'谢夫人,会稽山阴(今浙江省绍兴市)人,东汉尚书郎、徐令谢煚之女,吴大帝孙权的原配发妻,又称谢妃。深受孙权宠爱,爱幸有宠。后来孙权为了巩固江东政权,又纳徐氏,欲让谢夫人屈居其下。谢夫人不同意,失志早卒。谢夫人的弟弟是三国著名史学家、武陵太守谢承。豫章太守谢斐与谢夫人同宗同族。', zerong:'笮融(?—195年),丹杨(治今安徽宣城)人,东汉末年豪强,生性残暴却笃信佛教,为佛教在中国的发展做出了很大贡献。东汉末年投奔徐州刺史陶谦,督管下邳、彭城、广陵三郡运粮。将其中大量物资占为己有累积财力,遂在徐州一带大规模崇佛,修建豪华佛寺,铸造金铜大佛,衣以锦彩,并举行浴佛节,招揽信徒万余人。其崇佛活动奠定了中国大型佛事活动的基础。后又投奔赵昱、薛礼、朱皓并将他们杀害,扬州牧刘繇因此兴兵讨伐笮融。笮融兵败后逃入深山,由于当地山民同样对他恨之入骨,便联手搜捕、杀死笮融,并将他的首级献给刘繇。', @@ -12235,6 +12319,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ luotong:['dc_luotong','luotong'], dc_wangchang:['dc_wangchang','tw_wangchang'], guozhao:['guozhao','xin_guozhao'], + dingshangwan:['dingshangwan','ol_dingshangwan'], }, translate:{ puyuan:'蒲元', @@ -12286,7 +12371,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ souying:'薮影', souying_info:'每回合限一次,当你对其他角色(或其他角色对你)使用【杀】或普通锦囊牌指定唯一目标后,若此牌不是本回合你对其(或其对你)使用的第一张【杀】或普通锦囊牌,你可以弃置一张牌,获得此牌对应的所有实体牌(或令此牌对你无效)。', zhanyuan:'战缘', - zhanyuan_info:'觉醒技,准备阶段,若你已因蛮嗣累计获得超过7张牌,你加一点体力上限并回复1点体力,并可以选择一名男性角色,你与其获得技能〖系力〗,然后你失去技能〖蛮嗣〗', + zhanyuan_info:'觉醒技,准备阶段,若你已因蛮嗣累计获得超过七张牌,你加1点体力上限并回复1点体力,并可以选择一名男性角色,你与其获得技能〖系力〗,然后你失去技能〖蛮嗣〗。', hmxili:'系力', hmxili_info:'每回合限一次,你的回合外,当其他拥有【系力】技能的角色在其回合内对没有【系力】技能的角色造成伤害时,你可以弃置一张牌,令此伤害+1,然后你与其各摸两张牌。', wangshuang:'王双', @@ -12299,7 +12384,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lvli:'膂力', lvli4:'膂力', lvli5:'膂力', - lvli_info:'每名角色的回合限一次,你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)', + lvli_info:'每名角色的回合限一次,你可以声明一个基本牌或普通锦囊牌的牌名,有随机概率视为使用之(装备区里的牌数越多,成功概率越大)。', choujue:'仇决', choujue_info:'觉醒技,一名角色的回合结束时,若你的手牌数和体力值相差3或更多,你减1点体力上限并获得技能〖背水〗,然后将〖膂力〗改为“在自己的回合时每回合限两次”。', beishui:'背水', @@ -12692,8 +12777,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dc_sp_machao_prefix:'群', dc_shixie:'新杀士燮', dc_shixie_prefix:'新杀', - ol_guansuo:'新杀关索', - ol_guansuo_prefix:'新杀', + dc_guansuo:'新杀关索', + dc_guansuo_prefix:'新杀', dc_zhaoxiang:'新杀赵襄', dc_zhaoxiang_prefix:'新杀', dc_xujing:'许靖', diff --git a/character/xianjian.js b/character/xianjian.js index 0c04e9db4..29824d23c 100644 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -2061,7 +2061,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filterCard:function(){return false}, selectCard:-1, - prompt:'失去一点体力并获得一点护甲,视为使用一张杀', + prompt:'失去1点体力并获得1点护甲,视为使用一张杀', ai:{ order:function(){ var player=_status.event.player; @@ -2193,7 +2193,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.finish(); } else{ - player.chooseTarget('令一名角色获得一点护甲',function(card,player,target){ + player.chooseTarget('令一名角色获得1点护甲',function(card,player,target){ return !event.targets.contains(target); }).ai=function(target){ var att=get.attitude(player,target); @@ -2693,7 +2693,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseTarget('灵愈:令一名其他角色回复一点体力',function(card,player,target){ + player.chooseTarget('灵愈:令一名其他角色回复1点体力',function(card,player,target){ return target!=player&&target.hpget.type2(card)==type); + var knownNum = trigger.player.countKnownCards(_status.event.player,card=>get.type2(card)==type); + if(trigger.player.isAllCardsKnown(_status.event.player)){ + return knownNum; + } + var restNum = num - knownNum; var numx; - if(type=='basic') numx=num+(Math.random()<0.2?(Math.random()>0.5?1:-1):0); + if(type=='basic') numx=num+Math.floor(Math.random()*restNum+1); else if(type=='trick'){ if(num>2) numx=2; else numx=1; @@ -478,8 +483,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ numx=[0,1].randomGet(); } - if(numx<0) numx=0; - else if(numx>choices.length) numx=choices.length; + if(numx=choices.length) numx=choices.length-1; return numx; }()); 'step 1' @@ -754,11 +759,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mod:{ globalFrom:function(from,to,distance){ - return distance+from.getExpansions('duwang').filter(i=>i.name!='sha').length; + return distance+Math.min(1,from.getExpansions('duwang').filter(i=>i.name!='sha').length); }, globalTo:function(from,to,distance){ - return distance+to.getExpansions('duwang').filter(i=>i.name!='sha').length; - } + return distance+Math.min(1,to.getExpansions('duwang').filter(i=>i.name!='sha').length); + }, }, }, cibei:{ @@ -2420,13 +2425,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var player=_status.event.player; var target=_status.event.target; var controls=_status.event.controls.slice(); - controls.sort(function(a,b){ - return [ - get.effect(target,{name:'wuzhong'},player,player)/2, - get.effect(target,{name:'guohe_copy2'},player,player), - get.effect(target,{name:'kaihua'},player,player), - ][['摸牌','弃牌','制衡'].indexOf(b)-['摸牌','弃牌','制衡'].indexOf(a)]; - }); + var map={ + '摸牌':get.effect(target,{name:'wuzhong'},player,player)/2, + '弃牌':get.effect(target,{name:'guohe_copy2'},player,player), + '制衡':get.effect(target,{name:'kaihua'},player,player), + }; + controls.sort((a,b)=>map[b]-map[a]); return controls[0]; }).set('target',target); } @@ -2506,13 +2510,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'dangxian', audioname:['guansuo','xin_liaohua','re_liaohua'], audioname2:{ - ol_guansuo:'dangxian_guansuo', + dc_guansuo:'dangxian_guansuo', }, content:function(){ - var next=player.phaseUse(); - next.xindangxian=true; - event.next.remove(next); - trigger.next.push(next); + trigger.phaseList.splice(trigger.num,0,'phaseUse|xindangxian'); }, group:'xindangxian_rewrite', subSkill:{ @@ -2521,7 +2522,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, popup:false, filter:function(kagari){ - return kagari.xindangxian==true; + return kagari._extraPhaseReason=='xindangxian'; }, content:function(){ 'step 0' @@ -5781,7 +5782,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; }, content:function(){ - player.chooseDrawRecover(get.prompt('guizao'),'摸一张牌或回复一点体力').logSkill='guizao'; + player.chooseDrawRecover(get.prompt('guizao'),'摸一张牌或回复1点体力').logSkill='guizao'; }, }, jiyu:{ @@ -7665,9 +7666,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, audioname:['guansuo'], content:function(){ - var next=player.phaseUse(); - event.next.remove(next); - trigger.next.push(next); + trigger.phaseList.splice(trigger.num,0,'phaseUse|dangxian'); } }, longyin:{ @@ -8484,6 +8483,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.countCards('h','sha')>1) return 'zeroplayertarget'; } } + }, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&player.countSkill('zhanjue_draw')<2&&player.hasCard((card)=>get.name(card)!='tao','h'); } } }, @@ -9109,7 +9112,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.targets.length){ var current=event.targets.shift(); if(current.group=='wei'){ - current.chooseBool('是否令'+get.translation(player)+'回复一点体力?').set('ai',function(){ + current.chooseBool('是否令'+get.translation(player)+'回复1点体力?').set('ai',function(){ return get.attitude(_status.event.player,_status.event.target)>2; }).set('target',player); event.current=current; @@ -9125,7 +9128,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ event.damages.push(event.current); event.current.line(player,'green'); - game.log(event.current,'令',player,'回复一点体力'); + game.log(event.current,'令',player,'回复1点体力'); player.recover(); } if(event.targets.length){ @@ -10096,21 +10099,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ '选择体力值最大的一名角色', ]; var choiceList=ui.create.dialog('散谣:请选择一项','forcebutton','hidden'); - for(var i=0;i{ + return [i,item]; + }),'textbutton']); return choiceList; }, filter:function(button,player){ @@ -10180,7 +10171,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'zhiman', audioname:['guansuo','re_masu'], audioname2:{ - ol_guansuo:'zhiman_guansuo', + dc_guansuo:'zhiman_guansuo', }, trigger:{source:'damageBegin2'}, filter:function(event,player){ @@ -10319,6 +10310,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, qiaoshui:{ audio:2, + audioname2:{ + re_jianyong:'reqiaoshui', + xin_jianyong:'xinqiaoshui', + }, trigger:{player:'phaseUseBegin'}, direct:true, filter:function(event,player){ @@ -10359,12 +10354,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, qiaoshui3:{ + charlotte:true, + audio:'qiaoshui', + audioname2:{ + re_jianyong:'reqiaoshui', + xin_jianyong:'xinqiaoshui', + }, trigger:{player:'useCard2'}, - direct:true, filter:function(event,player){ var type=get.type(event.card); return type=='basic'||type=='trick'; }, + direct:true, content:function(){ 'step 0' player.removeSkill('qiaoshui3'); @@ -10404,7 +10405,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 2' if(event.target){ - player.logSkill('qiaoshui',event.target); + player.logSkill('qiaoshui3',event.target); trigger.targets.add(event.target); } event.finish(); @@ -10419,7 +10420,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ event.targets=result.targets; if(event.isMine()){ - player.logSkill('qiaoshui',event.targets); + player.logSkill('qiaoshui3',event.targets); event.finish(); } for(var i=0;i0&&_status.event&&_status.event.type==='phase'&&get.tag(card,'recover')){ @@ -11958,6 +11960,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, zhenlie:{ audio:2, + audioname:['re_wangyi'], filter:function(event,player){ return event.player!=player&&event.card&&(event.card.name=='sha'||get.type(event.card)=='trick'); }, @@ -12563,18 +12566,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, qice:{ + audio:2, + audioname:['clan_xunyou'], enable:'phaseUse', - usable:1, - audio:'qice_backup', filter:function(event,player){ - var hs=player.getCards('h'); + const hs=player.getCards('h'); if(!hs.length) return false; - for(var i=0;i{ + const mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); + return (mod2===false) + })) return false; + return lib.inpile.some(name=>{ + if(get.type(name)!='trick') return false; + const card=get.autoViewAs({name},hs); + return event.filterCard(card,player,event); + }); }, + usable:1, chooseButton:{ dialog:function(player){ var list=[]; @@ -12584,7 +12592,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return ui.create.dialog(get.translation('qice'),[list,'vcard']); }, filter:function(button,player){ - return lib.filter.filterCard({name:button.link[2]},player,_status.event.getParent()); + const event=_status.event.getParent(),card=get.autoViewAs({ + name:button.link[2], + },player.getCards('h')); + return event.filterCard(card,player,event); }, check:function(button){ var player=_status.event.player; @@ -12628,10 +12639,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, backup:function(links,player){ return { + audio:'qice', + audioname:['clan_xunyou'], filterCard:true, selectCard:-1, position:'h', - audio:2, popname:true, viewAs:{name:links[0][2]}, } @@ -12655,10 +12667,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 12-num; } }, + nokeep:true, + skillTagFilter:function(player,tag,arg){ + if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&!player.getStat('skill').qice&&player.hasCard((card)=>get.name(card)!='tao','h'); + }, threaten:1.6, } }, - qice_backup:{audio:2}, zhiyu:{ audio:2, trigger:{player:'damageEnd'}, @@ -12793,7 +12808,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', filter:function(event,player){ - return true;//player.countCards('h')>player.maxHp; + return player.countCards('h')>player.maxHp; }, usable:1, content:function(){ @@ -13334,7 +13349,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.showCards(result.cards); var type=get.type(result.cards[0],'trick'); if(trigger.source){ - trigger.source.chooseToDiscard('弃置一张不为'+get.translation(type)+'牌的牌或令'+get.translation(player)+'回复一点体力',function(card){ + trigger.source.chooseToDiscard('弃置一张不为'+get.translation(type)+'牌的牌或令'+get.translation(player)+'回复1点体力',function(card){ return get.type(card,'trick')!=_status.event.type; }).set('ai',function(card){ if(get.recoverEffect(_status.event.getParent().player,_status.event.player,_status.event.player)<0){ @@ -13630,6 +13645,76 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.draw(); }, + group:'jianying_mark', + init:function(player){ + if(player.isPhaseUsing()){ + var evt=_status.event.getParent('phaseUse'); + var history=player.getHistory('useCard',function(evt2){ + return evt2.getParent('phaseUse')==evt; + }); + if(history.length){ + var trigger=history[history.length-1]; + if(get.suit(trigger.card,player)=='none'||typeof get.number(trigger.card,player)!='number') return; + player.storage.jianying_mark=trigger.card; + player.markSkill('jianying_mark'); + game.broadcastAll(function(player,suit){ + if(player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML=get.translation(suit); + },player,get.suit(trigger.card,player)); + player.when('phaseUseAfter').then(()=>{ + player.unmarkSkill('jianying_mark'); + delete player.storage.jianying_mark; + }); + } + } + }, + onremove:function(player){ + player.unmarkSkill('jianying_mark'); + delete player.storage.jianying_mark; + }, + subSkill:{ + mark:{ + charlotte:true, + trigger:{player:'useCard1'}, + filter:function(event,player){ + return player.isPhaseUsing(); + }, + forced:true, + popup:false, + firstDo:true, + content:function(){ + if(get.suit(trigger.card,player)=='none'||typeof get.number(trigger.card,player)!='number') player.unmarkSkill('jianying_mark'); + else{ + player.storage.jianying_mark=trigger.card; + player.markSkill('jianying_mark'); + game.broadcastAll(function(player,suit){ + if(player.marks.jianying_mark) player.marks.jianying_mark.firstChild.innerHTML=get.translation(suit); + },player,get.suit(trigger.card,player)); + player.when('phaseUseAfter').then(()=>{ + player.unmarkSkill('jianying_mark'); + delete player.storage.jianying_mark; + }); + } + }, + intro:{ + markcount:function(card,player){ + var num=get.number(card,player); + var list=[1,11,12,13]; + if(list.contains(num)) return ['A','J','Q','K'][list.indexOf(num)]; + return parseFloat(num); + }, + content:function(card,player){ + var suit=get.suit(card,player); + var num=get.number(card,player); + var str='
  • 上一张牌的花色:'+get.translation(suit); + str+='
  • 上一张牌的点数:'; + var list=[1,11,12,13]; + if(list.contains(num)) str+=['A(1)','J(11)','Q(12)','K(13)'][list.indexOf(num)]; + else str+=parseFloat(num); + return str; + }, + }, + }, + }, }, zzhenggong:{ trigger:{player:'damageEnd'}, @@ -13956,6 +14041,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liyan:['liyan','old_liyan'], zhangsong:['zhangsong','re_zhangsong'], zhongyao:['zhongyao','re_zhongyao'], + liwan:['ol_liwan','liwan'], }, translate:{ old_huaxiong:'将华雄', @@ -14061,51 +14147,51 @@ game.import('character',function(lib,game,ui,get,ai,_status){ funan_jiexun:'诫训', bizhuan:'辟撰', bizhuan_bg:'书', - bizhuan_info:'当你使用黑桃牌后,或你成为其他角色使用黑桃牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”;你至多拥有四张“书”,你每有一张“书” ,手牌上限+1', + bizhuan_info:'当你使用黑桃牌后,或你成为其他角色使用黑桃牌的目标后,你可以将牌堆顶的一张牌置于武将牌上,称为“书”;你至多拥有四张“书”,你每有一张“书” ,手牌上限+1。', tongbo:'通博', - tongbo_info:'摸牌阶段摸牌后,你可以用任意张牌替换等量的“书”,然后若你的“书”包含四种花色,你将所有“书”交给任意名其他角色', + tongbo_info:'摸牌阶段摸牌后,你可以用任意张牌替换等量的“书”,然后若你的“书”包含四种花色,你将所有“书”交给任意名其他角色。', qingxian:'清弦', qingxian_info:'当你受到伤害/回复体力后,你可以令伤害来源/一名其他角色执行一项:失去1点体力,随机使用一张装备牌;回复1点体力,弃置一张装备牌。若其以此法使用或弃置的牌为梅花,你摸一张牌。', juexiang:'绝响', - juexiang_info:'当你死亡后,你可以令一名角色随机获得“清弦残谱”其中一个技能,然后直到其下回合开始,其不能被选择为其他角色使用梅花牌的目标', + juexiang_info:'当你死亡后,你可以令一名角色随机获得“清弦残谱”其中一个技能,然后直到其下回合开始,其不能被选择为其他角色使用梅花牌的目标。', juexiang_ji:'激弦', - juexiang_ji_info:'当你受到伤害后,你可以令伤害来源失去1点体力,随机使用一张装备', + juexiang_ji_info:'当你受到伤害后,你可以令伤害来源失去1点体力,随机使用一张装备。', juexiang_lie:'烈弦', - juexiang_lie_info:'当你回复体力后,你可以令一名其他角色失去1点体力,随机使用一张装备', + juexiang_lie_info:'当你回复体力后,你可以令一名其他角色失去1点体力,随机使用一张装备。', juexiang_rou:'柔弦', - juexiang_rou_info:'当你受到伤害后,你可以令伤害来源回复1点体力,弃置一张装备', + juexiang_rou_info:'当你受到伤害后,你可以令伤害来源回复1点体力,弃置一张装备。', juexiang_he:'和弦', - juexiang_he_info:'当你回复体力后,你可以令一名其他角色回复1点体力,弃置一张装备', + juexiang_he_info:'当你回复体力后,你可以令一名其他角色回复1点体力,弃置一张装备。', juexiang_club:'绝响', juexiang_club_bg:'响', - juexiang_club_info:'直到下回合开始,不能被选择为其他角色使用梅花牌的目标', + juexiang_club_info:'直到下回合开始,不能被选择为其他角色使用梅花牌的目标。', jianzheng:'谏征', - jianzheng_info:'当一名其他角色使用【杀】指定目标时,若你在其攻击范围内且你不是目标,则你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标', + jianzheng_info:'当一名其他角色使用【杀】指定目标时,若你在其攻击范围内且你不是目标,则你可以将一张手牌置于牌堆顶,取消所有目标,然后若此【杀】不为黑色,你成为目标。', zhuandui:'专对', - zhuandui_info:'当你使用【杀】指定目标/成为【杀】的目标后,你可以与目标角色/此【杀】使用者拼点,若你赢,此杀不能被【闪】响应/对你无效', - zhuandui_use_info:'当你使用【杀】指定目标后,你可以与目标角色拼点,若你赢,此杀不能被【闪】响应', - zhuandui_respond_info:'当你成为【杀】的目标后,你可以与此【杀】使用者拼点,若你赢,此杀对你无效', + zhuandui_info:'当你使用【杀】指定目标/成为【杀】的目标后,你可以与目标角色/此【杀】使用者拼点,若你赢,此杀不能被【闪】响应/对你无效。', + zhuandui_use_info:'当你使用【杀】指定目标后,你可以与目标角色拼点,若你赢,此杀不能被【闪】响应。', + zhuandui_respond_info:'当你成为【杀】的目标后,你可以与此【杀】使用者拼点,若你赢,此杀对你无效。', tianbian:'天辩', tianbian_info:'你拼点时,可以改为用牌堆顶的一张牌进行拼点;当你拼点的牌亮出后,若此牌花色为红桃,则此牌的点数视为K。', funan:'复难', funan_info:'其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。', jiexun:'诫训', - jiexun_info:'结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你失去〖诫训〗,然后你发动〖复难〗时,无须令对方获得你使用的牌', + jiexun_info:'结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你失去〖诫训〗,然后你发动〖复难〗时,无须令对方获得你使用的牌。', xinjiexun:'诫训', - xinjiexun_info:'结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你将X归零,然后你发动〖复难〗时,无须令对方获得你使用的牌', + xinjiexun_info:'结束阶段,你可令一名其他角色摸等同于场上方块牌数的牌,然后弃置X张牌(X为此前该技能发动过的次数)。若有角色因此法弃置了所有牌,则你将X归零,然后你发动〖复难〗时,无须令对方获得你使用的牌。', shouxi:'守玺', - shouxi_info:'当你成为【杀】的目标后,你可声明一种未以此法声明过的基本牌或锦囊牌的牌名。若使用者弃置一张你声明的牌,其获得你的一张牌;若否,则此【杀】对你无效', + shouxi_info:'当你成为【杀】的目标后,你可声明一种未以此法声明过的基本牌或锦囊牌的牌名。若使用者弃置一张你声明的牌,其获得你的一张牌;若否,则此【杀】对你无效。', huimin:'惠民', - huimin_info:'结束阶段,你可以摸X张牌并展示等量手牌(X为手牌数小于其体力值的角色数),然后从你指定的一名角色开始这些角色依次选择并获得其中一张', + huimin_info:'结束阶段,你可以摸X张牌并展示等量手牌(X为手牌数小于其体力值的角色数),然后从你指定的一名角色开始这些角色依次选择并获得其中一张。', wengua:'问卦', wengua2:'问卦', - wengua_info:'其他角色/你的出牌阶段限一次,其可以交给你一张牌,(若当前回合角色为你,则跳过此步骤),你可以将此牌/一张牌置于牌堆顶或牌堆底,然后你与其/你从另一端摸一张牌', + wengua_info:'其他角色/你的出牌阶段限一次,其可以交给你一张牌,(若当前回合角色为你,则跳过此步骤),你可以将此牌/一张牌置于牌堆顶或牌堆底,然后你与其/你从另一端摸一张牌。', fuzhu:'伏诛', - fuzhu_info:'一名男性角色的结束阶段,若牌堆剩余牌数不大于你体力值的十倍,则你可以依次对其使用牌堆中所有的【杀】(不能超过游戏人数),然后洗牌', + fuzhu_info:'一名男性角色的结束阶段,若牌堆剩余牌数不大于你体力值的十倍,则你可以依次对其使用牌堆中所有的【杀】(不能超过游戏人数),然后洗牌。', fumian:'福绵', - fumian_info:'准备阶段,你可以选择一项:1.摸牌阶段多摸一张牌;2.使用红色牌可以多选择一个目标(限一次)。若与你上回合选择的选项不同,则该选项数值+1并复原此技能', + fumian_info:'准备阶段,你可以选择一项:1.摸牌阶段多摸一张牌;2.使用红色牌可以多选择一个目标(限一次)。若与你上回合选择的选项不同,则该选项数值+1并复原此技能。', daiyan:'怠宴', - daiyan_info:'结束阶段,你可以令一名其他角色从牌堆中获得一张红桃基本牌,然后若其于上回合成为过该技能目标,则其失去1点体力', + daiyan_info:'结束阶段,你可以令一名其他角色从牌堆中获得一张红桃基本牌,然后若其于上回合成为过该技能目标,则其失去1点体力。', xinzhongjian:'忠鉴', xinzhongjian_info:'出牌阶段限一次,你可以展示自己的一张手牌,然后展示一名其他角色的至多三张手牌。其展示的牌中:每有一张花色相同,你摸一张牌;点数相同,你对其造成1点伤害;均不同,你弃置一张手牌。', zhongjian:'忠鉴', @@ -14119,7 +14205,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xincaishi:'才识', xincaishi_info:'摸牌阶段,你可以选择一项:1.少摸一张牌,然后本回合发动〖忠鉴〗时可以多展示自己的一张牌;2.本回合手牌上限-1,然后本回合发动〖忠鉴〗时可以多展示对方的一张牌;3.多摸两张牌,本回合不能发动〖忠鉴〗。', guizao:'瑰藻', - guizao_info:'弃牌阶段结束时,若你于此阶段弃置牌的数量不小于2且它们的花色各不相同,你可以回复1点体力或摸一张牌', + guizao_info:'弃牌阶段结束时,若你于此阶段弃置牌的数量不小于2且它们的花色各不相同,你可以回复1点体力或摸一张牌。', jiyu:'讥谀', jiyu_info:'出牌阶段限一次,你可以令一名角色弃置一张手牌。若如此做,你不能使用与之相同花色的牌,直到回合结束。若其以此法弃置的牌为黑桃,你翻面并令其失去1点体力。若你有未被〖讥谀〗限制的手牌,则你可以继续发动此技能,但不能选择本回合已经选择过的目标。', qinqing:'寝情', @@ -14128,19 +14214,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huisheng_info:'当你受到其他角色对你造成的伤害时,你可以令其观看你任意数量的牌并令其选择一项:1.获得这些牌中的一张,防止此伤害,然后你不能再对其发动〖贿生〗;2.弃置等量的牌。', jishe:'极奢', jishe2:'极奢', - jishe_info:'①出牌阶段限20次,若你的手牌上限大于0,你可以摸一张牌,然后你本回合的手牌上限-1。②结束阶段开始时,若你没有手牌,则你可以横置至多X名角色的武将牌(X为你的体力值)', + jishe_info:'①出牌阶段限20次,若你的手牌上限大于0,你可以摸一张牌,然后你本回合的手牌上限-1。②结束阶段开始时,若你没有手牌,则你可以横置至多X名角色的武将牌(X为你的体力值)。', lianhuo:'链祸', - lianhuo_info:'锁定技,当你受到火焰伤害时,若你的武将牌处于横置状态且此伤害不为连环伤害,则此伤害+1', + lianhuo_info:'锁定技,当你受到火焰伤害时,若你的武将牌处于横置状态且此伤害不为连环伤害,则此伤害+1。', taoluan:'滔乱', taoluan4:'滔乱', taoluan5:'滔乱', taoluan_backup:'滔乱', - taoluan_info:'你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你于回合结束时失去1点体力且〖滔乱〗无效直到回合结束', + taoluan_info:'你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你于回合结束时失去1点体力且〖滔乱〗无效直到回合结束。', xintaoluan:'滔乱', xintaoluan4:'滔乱', xintaoluan5:'滔乱', xintaoluan_backup:'滔乱', - xintaoluan_info:'若场上没有濒死的角色,则你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本回合内你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你X张与你以此法使用的牌类别不同的牌;2.你失去X点体力且滔乱无效直到回合结束(X为你本回合内发动过〖滔乱〗的次数且至多为3)', + xintaoluan_info:'若场上没有濒死的角色,则你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本回合内你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你X张与你以此法使用的牌类别不同的牌;2.你失去X点体力且滔乱无效直到回合结束(X为你本回合内发动过〖滔乱〗的次数且至多为3)。', jiaozhao:'矫诏', jiaozhao3:'矫诏', jiaozhao3_backup:'矫诏', @@ -14149,7 +14235,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ danxin:'殚心', danxin_info:'当你受到伤害后,你可以摸一张牌,或对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。', xindanxin:'殚心', - xindanxin_info:'当你受到伤害后,你可以摸一张牌,并对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。3.将“出牌阶段限一次”改为“出牌阶段限两次”', + xindanxin_info:'当你受到伤害后,你可以摸一张牌,并对“矫诏”的描述依次执行下列一项修改:1.将“基本牌”改为“基本牌或普通锦囊牌”;2.将“选择距离最近的一名其他角色,该角色”改为“你”。3.将“出牌阶段限一次”改为“出牌阶段限两次”。', duliang:'督粮', duliang2:'督粮', duliang_info:'出牌阶段限一次,你可以获得一名其他角色的一张手牌,然后选择一项:1.令其观看牌堆顶的两张牌,然后获得其中的基本牌;2.令其于下个摸牌阶段额外摸一张牌。', @@ -14174,7 +14260,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qianju:'千驹', qianju_info:'锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值)。', qingxi:'倾袭', - qingxi_info:'当你使用【杀】对目标角色造成伤害时,若你的装备区里有武器牌,你可以令其选择一项:1、弃置X张手牌(X为此武器牌的攻击范围),若如此做,其弃置你的此武器牌;2、令伤害值+1', + qingxi_info:'当你使用【杀】对目标角色造成伤害时,若你的装备区里有武器牌,你可以令其选择一项:1、弃置X张手牌(X为此武器牌的攻击范围),若如此做,其弃置你的此武器牌;2、令伤害值+1。', reqianju:'千驹', reqianju_info:'锁定技,若你已受伤,你计算与其他角色的距离时-X(X为你已损失的体力值且至少为1)。', reqingxi:'倾袭', @@ -14194,7 +14280,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jinjiu_info:'锁定技,你的【酒】均视为【杀】。', chunlao:'醇醪', chunlao2:'醇醪', - chunlao_info:'结束阶段开始时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】', + chunlao_info:'结束阶段开始时,若你没有“醇”,你可以将至少一张【杀】置于你的武将牌上,称为“醇”。当一名角色处于濒死状态时,你可以移去一张“醇”,视为该角色使用一张【酒】。', lihuo:'疠火', lihuo_info:'当你声明使用普通【杀】后,你可以将此【杀】改为火【杀】。若以此法使用的【杀】造成了伤害,则此【杀】结算后你失去1点体力;你使用火【杀】选择目标后,可以额外指定一个目标。', shenduan:'慎断', @@ -14206,7 +14292,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ reyonglve:'勇略', reyonglve_info:'其他角色的判定阶段开始时,你可以弃置其判定区里的一张牌。然后若该角色在你攻击范围内,你摸一张牌。若其在你攻击范围外,视为你对其使用一张【杀】。', benxi:'奔袭', - benxi_info:'锁定技,你的回合内,你每使用一次牌后,你的进攻距离+1直到回合结束;你的回合内,若你与所有角色的距离均为1,你无视其他角色的防具,且你使用的【杀】可额外指定一个目标', + benxi_info:'锁定技,你的回合内,你每使用一次牌后,你的进攻距离+1直到回合结束;你的回合内,若你与所有角色的距离均为1,你无视其他角色的防具,且你使用的【杀】可额外指定一个目标。', xinbenxi:'奔袭', xinbenxi_info:'锁定技,当你于回合内使用牌时,你本回合计算与其他角色的距离-1。你的回合内,若你至场上所有其他角色的距离均不大于1,则当你使用【杀】或普通锦囊牌选择唯一目标后,你选择至多两项:1.为此牌多指定一个目标;2.令此牌无视防具;3.令此牌不可被抵消;4.此牌造成伤害时摸一张牌。', sidi:'司敌', @@ -14225,7 +14311,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhongyong:'忠勇', zhongyong_info:'当你于出牌阶段内使用的【杀】被目标角色使用的【闪】抵消时,你可以将此【闪】交给除该角色外的一名角色。若获得此【闪】的角色不是你,你可以对相同的目标再使用一张【杀】。', xinzhongyong:'忠勇', - xinzhongyong_info:'当你使用的【杀】结算完毕后,你可以将此【杀】或目标角色使用的【闪】交给一名该角色以外的其他角色,以此法得到红色牌的角色可以对你攻击范围内的角色使用一张【杀】', + xinzhongyong_info:'当你使用的【杀】结算完毕后,你可以将此【杀】或目标角色使用的【闪】交给一名该角色以外的其他角色,以此法得到红色牌的角色可以对你攻击范围内的角色使用一张【杀】。', jigong:'急攻', jigong_info:'出牌阶段开始时,你可以摸两张牌。若如此做,你本回合的手牌上限改为X(X为你此阶段造成的伤害点数之和)。', shifei:'饰非', @@ -14233,13 +14319,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huaiyi:'怀异', huaiyi_info:'出牌阶段限一次,你可以展示所有手牌,若这些牌的颜色不全部相同,则你选择一种颜色并弃置该颜色的所有手牌,然后你可以获得至多X名角色的各一张牌(X为你以此法弃置的手牌数)。若你以此法得到的牌不少于两张,则你失去1点体力。', yaoming:'邀名', - yaoming_info:'每回合限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置手牌数大于你的一名角色的一张手牌;2. 令手牌数小于你的一名角色摸一张牌', + yaoming_info:'每回合限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置手牌数大于你的一名角色的一张手牌;2. 令手牌数小于你的一名角色摸一张牌。', xinyaoming:'邀名', xinyaoming_info:'每回合每个选项限一次,当你造成或受到伤害后,你可以选择一项:1. 弃置一名其他角色的一张手牌;2. 令一名其他角色摸一张牌;3.令一名角色弃置至多两张牌,然后摸等量的牌。', anguo:'安国', anguo_info:'出牌阶段限一次,你可以选择一名其他角色装备区里的一张牌,令其获得此牌。然后若该角色攻击范围内的角色数因此减少,则你摸一张牌。', yanzhu:'宴诛', - yanzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色选择一项:令你获得其装备区里所有的牌,然后你失去技能〖宴诛〗;或弃置一张牌', + yanzhu_info:'出牌阶段限一次,你可以令一名有牌的其他角色选择一项:令你获得其装备区里所有的牌,然后你失去技能〖宴诛〗;或弃置一张牌。', xingxue:'兴学', xingxue_info:'结束阶段开始时,你可以令至多X名角色依次摸一张牌并将一张牌置于牌堆顶(X为你的体力值,若你已失去技能〖宴诛〗,则将X改为你的体力上限)。', zhaofu:'诏缚', @@ -14256,11 +14342,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rezhaofu:'诏缚', rezhaofu_info:'主公技,锁定技,你攻击范围内的角色视为在其他吴势力角色的攻击范围内。', wurong:'怃戎', - wurong_info:'出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你弃置此【杀】并对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你弃置你展示的牌并获得其一张牌', + wurong_info:'出牌阶段限一次,你可以令一名其他角色与你同时展示一张手牌:若你展示的是【杀】且该角色展示的不是【闪】,则你弃置此【杀】并对其造成1点伤害;若你展示的不是【杀】且该角色展示的是【闪】,则你弃置你展示的牌并获得其一张牌。', shizhi:'矢志', - shizhi_info:'锁定技,当你的体力值为1时,你的【闪】均视为【杀】', + shizhi_info:'锁定技,当你的体力值为1时,你的【闪】均视为【杀】。', zhanjue:'战绝', - zhanjue_info:'出牌阶段,你可以将所有手牌当作【决斗】使用。此【决斗】结算后,你与以此法受到伤害的角色各摸一张牌。若你在同一阶段内以此法摸了两张或更多的牌,则此技能失效直到回合结束', + zhanjue_info:'出牌阶段,你可以将所有手牌当作【决斗】使用。此【决斗】结算后,你与以此法受到伤害的角色各摸一张牌。若你在同一阶段内以此法摸了两张或更多的牌,则此技能失效直到回合结束。', qinwang:'勤王', qinwang1:'勤王', qinwang2:'勤王', @@ -14268,16 +14354,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huomo:'活墨', huomo_info:'当你需要使用一张本回合内未使用过的基本牌时,你可以将一张黑色非基本牌置于牌堆顶,视为使用此基本牌。', zuoding:'佐定', - zuoding_info:'当其他角色于其回合内使用♠牌指定目标后,若本回合内没有角色受到过伤害,则你可以令其中一名目标角色摸一张牌', + zuoding_info:'当其他角色于其回合内使用♠牌指定目标后,若本回合内没有角色受到过伤害,则你可以令其中一名目标角色摸一张牌。', taoxi:'讨袭', taoxi2:'讨袭', taoxi3:'讨袭', taoxi_info:'出牌阶段限一次。当你使用牌指定一名其他角色为唯一目标后,你可以亮出其一张手牌直到回合结束,并且你于此回合内可以将此牌如手牌般使用。回合结束时,若此牌仍在该角色手牌区里,你失去1点体力。', huituo:'恢拓', - huituo_info:'当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害点数)', + huituo_info:'当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害点数)。', mingjian:'明鉴', mingjian2:'明鉴', - mingjian_info:'出牌阶段限一次,你可以将所有手牌交给一名其他角色,若如此做,该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1', + mingjian_info:'出牌阶段限一次,你可以将所有手牌交给一名其他角色,若如此做,该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。', xingshuai:'兴衰', xingshuai_info:'主公技,限定技,当你进入濒死状态时,其他魏势力角色可依次令你回复1点体力,然后这些角色依次受到1点伤害。', reduodao:'夺刀', @@ -14285,7 +14371,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ reanjian:'暗箭', reanjian_info:'锁定技,当你使用【杀】指定目标后,若你不在其攻击范围内,则此杀伤害+1且无视其防具。若其因执行此【杀】的效果受到伤害而进入濒死状态,则其不能使用【桃】直到此濒死事件结算结束。', duodao:'夺刀', - duodao_info:'当你受到【杀】造成的伤害后,你可以弃置一张牌,然后获得伤害来源装备区里的武器牌', + duodao_info:'当你受到【杀】造成的伤害后,你可以弃置一张牌,然后获得伤害来源装备区里的武器牌。', anjian:'暗箭', anjian_info:'锁定技,当你使用【杀】对目标角色造成伤害时,若你不在其攻击范围内,则此杀伤害+1。', xinpojun:'破军', @@ -14324,7 +14410,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ fuhun2:'父魂', fuhun_info:'你可以将两张手牌当做【杀】使用或打出;出牌阶段,若你以此法使用的【杀】造成了伤害,你获得技能〖武圣〗和〖咆哮〗直到回合结束。', yuce:'御策', - yuce_info:'当你受到伤害后,你可以展示一张手牌,并令伤害来源选择一项:弃置一张与此牌类型不同的手牌,或令你回复一点体力。', + yuce_info:'当你受到伤害后,你可以展示一张手牌,并令伤害来源选择一项:弃置一张与此牌类型不同的手牌,或令你回复1点体力。', xiansi:'陷嗣', xiansix:'陷嗣', xiansi_bg:'逆', @@ -14356,7 +14442,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jyzongshi:'纵适', jyzongshi_info:'当你拼点赢时,你可以获得对方此次拼点的牌;当你拼点没赢时,你可以收回你此次拼点的牌。', qiaoshui:'巧说', - qiaoshui_info:'出牌阶段开始时,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你不能使用锦囊牌直到回合结束', + qiaoshui3:'巧说', + qiaoshui_info:'出牌阶段开始时,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你不能使用锦囊牌直到回合结束。', reqiaoshui:'巧说', reqiaoshui_info:'出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你结束出牌阶段且本回合内锦囊牌不计入手牌上限。', junxing:'峻刑', @@ -14450,7 +14537,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mieji_info:'当你使用黑色普通锦囊牌选择目标后,若目标数为1,则你可以额外指定一个目标。', juece_info:'当其他角色在你回合内失去最后的手牌后,你可以对其造成1点伤害。', jiefan_info:'限定技,出牌阶段,你可以选择一名角色,令攻击范围内含有该角色的所有角色依次选择一项:1.弃置一张武器牌;2.令其摸一张牌。', - fuli_info:'限定技,当你处于濒死状态时,你可以将体力回复至与场上势力数相同,然后翻面', + fuli_info:'限定技,当你处于濒死状态时,你可以将体力回复至与场上势力数相同,然后翻面。', xinfuli_info:'限定技,当你处于濒死状态时,可以将体力回复至X点并将手牌摸至X张(X为场上势力数)。若X大于2,你翻面。', qianxi_info:'准备阶段,你可以摸一张牌,并弃置一张牌,然后令一名距离为1的角色不能使用或打出与你弃置的牌颜色相同的手牌直到回合结束。', zhiman_info:'当你对一名其他角色造成伤害时,你可以防止此伤害,然后获得其装备区或判定区的一张牌。', @@ -14469,12 +14556,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ oldqiuyuan_info:'当你成为【杀】的目标时,你可以令一名有手牌的其他角色正面朝上交给你一张牌。若此牌不为【闪】,则该角色也成为此【杀】的额外目标。', gongji_info:'出牌阶段限一次,你可以弃置一张牌,然后你的攻击范围视为无限直到回合结束。若你以此法弃置的牌为装备牌,则你可以弃置一名其他角色的一张牌。', zhuiyi_info:'当你死亡时,你可以令一名其他角色(杀死你的角色除外)摸三张牌,然后其回复1点体力。', - anxu_info:'出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌多的角色将一张手牌交给手牌少的角色,然后若这两名角色手牌数相等,你摸一张牌或回复1点体力', + anxu_info:'出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌多的角色将一张手牌交给手牌少的角色,然后若这两名角色手牌数相等,你摸一张牌或回复1点体力。', old_anxu_info:'出牌阶段限一次,你可以选择两名手牌数不同的其他角色,令其中手牌少的角色获得手牌多的角色的一张手牌并展示之。然后若此牌不为黑桃,则你摸一张牌。', - zongxuan_info:'当你的牌因弃置而进入弃牌堆后,你可以将其按任意顺序置于牌堆顶', - zhiyan_info:'结束阶段,你可以令一名角色摸一张牌并展示之,若为装备牌,其使用此牌并回复一点体力。', + zongxuan_info:'当你的牌因弃置而进入弃牌堆后,你可以将其按任意顺序置于牌堆顶。', + zhiyan_info:'结束阶段,你可以令一名角色摸一张牌并展示之,若为装备牌,其使用此牌并回复1点体力。', miji_info:'结束阶段,若你已受伤,则可以摸X张牌,然后可以将等量的牌交给一名其他角色(X为你已损失的体力值)。', - zhenlie_info:'当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去一点体力并令此牌对你无效,然后弃置对方一张牌。', + zhenlie_info:'当你成为其他角色使用【杀】或普通锦囊牌的目标后,你可以失去1点体力并令此牌对你无效,然后弃置对方一张牌。', chengxiang_info:'当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。', oldchengxiang_info:'当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于12的牌。', renxin_info:'当体力值为1的一名其他角色受到伤害时,你可以将武将牌翻面并弃置一张装备牌,然后防止此伤害。', @@ -14488,7 +14575,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ luoying_info:'当其他角色的梅花牌因弃置或判定而进入弃牌堆后,你可以获得之。', jiushi_info:'当你需要使用一张【酒】时,若你的武将牌正面朝上,则你可以将武将牌翻面并视为使用了一张【酒】;当你受到伤害时,若你的武将牌背面朝上,则你可在此伤害结算后将武将牌翻回正面。', jueqing_info:'锁定技,你即将造成的伤害均视为失去体力。', - shangshi_info:'当你的手牌数小于X时,你可以将手牌摸至X张(X为你已损失的体力值)', + shangshi_info:'当你的手牌数小于X时,你可以将手牌摸至X张(X为你已损失的体力值)。', xuanfeng_info:'当你失去装备区内的牌时,或于弃牌阶段弃置了两张或更多的手牌后,你可以依次弃置一至两名其他角色的共计两张牌。', zhiyu_info:'当你受到伤害后,你可以摸一张牌,然后展示所有手牌。若颜色均相同,你令伤害来源弃置一张手牌。', qice_info:'出牌阶段限一次,你可以将所有的手牌(至少一张)当做任意一张普通锦囊牌使用。', @@ -14498,11 +14585,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ danshou_info:'出牌阶段,你可以选择你攻击范围内的一名其他角色,然后弃置X张牌(X为此前你于此阶段你发动“胆守”的次数+1)。若X:为1,你弃置该角色的一张牌;为2,令该角色交给你一张牌;为3,你对该角色造成1点伤害;不小于4,你与该角色各摸两张牌。', olddanshou_info:'当你造成伤害后,你可以摸一张牌。若如此做,终止一切结算,当前回合结束。', xindanshou_info:'①每回合限一次,当你成为基本牌或锦囊牌的目标后,你可以摸X张牌(X为你本回合内成为过基本牌或锦囊牌的目标的次数)。②一名其他角色的结束阶段,若你本回合内没有发动过〖胆守①〗,则你可以弃置X张牌并对其造成1点伤害(X为其手牌数,无牌则不弃)。', - yizhong_info:'锁定技,当你的防具栏为空时,黑色的【杀】对你无效', - xinzhan_info:'出牌阶段限一次,你可以观看牌堆顶的3张牌,然后展示其中任意数量♥的牌并获得之。', + yizhong_info:'锁定技,当你的防具栏为空时,黑色的【杀】对你无效。', + xinzhan_info:'出牌阶段限一次,若你的手牌数大于你的体力上限,你可以观看牌堆顶的三张牌,然后展示其中任意红桃牌并获得之。', huilei_info:'锁定技,当你死亡时,杀死你的角色弃置所有的牌。', enyuan_info:'锁定技。①当其他角色令你回复1点体力后,该角色摸一张牌。②当其他角色对你造成伤害后,其须交给你一张♥手牌,否则失去1点体力。', - xuanhuo_info:'出牌阶段限一次,你可以将一张红桃手牌交给一名其他角色,获得该角色的一张牌,然后交给除该角色外的一名其他角色', + xuanhuo_info:'出牌阶段限一次,你可以将一张红桃手牌交给一名其他角色,获得该角色的一张牌,然后交给除该角色外的一名其他角色。', ganlu_info:'出牌阶段限一次,你可以选择两名装备区内装备数之差不大于X的角色,令其交换装备区内的牌(X为你已损失的体力值)。', buyi_info:'当有角色进入濒死状态时,你可以展示该角色的一张手牌:若此牌不为基本牌,则该角色弃置此牌并回复1点体力。', mingce_info:'出牌阶段,你可以交给一名其他角色一张装备牌或【杀】,然后令该角色选择一项:1. 视为对其攻击范围内的另一名由你指定的角色使用一张【杀】。2. 摸一张牌。每回合限一次。', @@ -14510,16 +14597,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhichi2_info:'智迟已发动', pojun_info:'当你使用【杀】造成伤害后,你可以令受伤角色摸X张牌,然后其翻面(X为该角色的体力值且至多为5)。', shiyong:'恃勇', - shiyong_info:'锁定技,当你受到一次红色【杀】或【酒】【杀】造成的伤害后,须减1点体力上限', + shiyong_info:'锁定技,当你受到一次红色【杀】或【酒】【杀】造成的伤害后,须减1点体力上限。', old_guanzhang:'旧关兴张苞', old_guanzhang_prefix:'旧', wangyi:'王异', oldqianxi:'潜袭', - oldqianxi_info:'当你使用【杀】对距离为1的目标角色造成伤害时,你可以进行一次判定,若判定结果不为红桃,你防止此伤害,令其减1点体力上限', + oldqianxi_info:'当你使用【杀】对距离为1的目标角色造成伤害时,你可以进行一次判定,若判定结果不为红桃,你防止此伤害,令其减1点体力上限。', oldzhenlie:'贞烈', - oldzhenlie_info:'在你的判定牌生效前,你可以亮出牌堆顶的一张牌代替之', + oldzhenlie_info:'在你的判定牌生效前,你可以亮出牌堆顶的一张牌代替之。', oldmiji:'秘计', - oldmiji_info:'准备/结束阶段开始时,若你已受伤,你可以判定,若判定结果为黑色,你观看牌堆顶的X张牌(X为你已损失的体力值),然后将这些牌交给一名角色', + oldmiji_info:'准备/结束阶段开始时,若你已受伤,你可以判定,若判定结果为黑色,你观看牌堆顶的X张牌(X为你已损失的体力值),然后将这些牌交给一名角色。', old_fuhun:'父魂', old_fuhun_info:'摸牌阶段开始时,你可以放弃摸牌,改为从牌堆顶亮出两张牌并获得之,若亮出的牌颜色不同,你获得技能“武圣”、“咆哮”,直到回合结束。', rejueqing:'绝情', @@ -14576,7 +14663,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jiangxi_info:'一名角色的回合结束时,若一号位于此回合内进入过濒死状态或未受到过伤害,你可以重置〖识命〗;若所有角色均未受到过伤害,你可以与当前回合角色各摸一张牌。', hanlong:'韩龙', duwang:'独往', - duwang_info:'锁定技。①游戏开始时,你从牌堆顶将五张不为【杀】的牌置于武将牌上,称为“刺”。②你至其他角色或其他角色至你的距离+X(X为不为【杀】的“刺”数)。', + duwang_info:'锁定技。①游戏开始时,你从牌堆顶将五张不为【杀】的牌置于武将牌上,称为“刺”。②若你有牌名不为【杀】“刺”,你至其他角色或其他角色至你的距离+1。', cibei:'刺北', cibei_info:'①当一名角色使用【杀】造成伤害且此牌对应的实体牌进入弃牌堆后,你可以将一张不为【杀】的“刺”置入弃牌堆,并将这些牌置入“刺”,然后弃置一名角色区域里的一张牌。②一名角色的回合结束时,若你的“刺”均为【杀】,你获得所有“刺”,且这些牌不能被弃置,且当你使用对应实体牌包含这些牌的牌时无次数和距离限制。', wuanguo:'武安国', diff --git a/character/yingbian.js b/character/yingbian.js index e6f489f3c..30de75455 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -2592,10 +2592,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player!=event.player&&event.num-2) return false; - if(player.hp>2) return true; - if(player.hp==2&&event.player.hp<3) return false; - return player.hp>1; + if(event.player.hasSkillTag('nodamage')) return false; + let tj = player.countCards('hs', function (card) { + return get.name(card) === 'tao' || get.name(card) === 'jiu'; + }), + att = get.attitude(_status.event.player, event.player), + eff = get.damageEffect(event.player, player, _status.event.player, get.natureList(event)), + fd = event.player.hasSkillTag('filterDamage', null, { + player: player, + card: event.card + }), + hp = player.hp + tj; + if(player.storage.tairan2) hp -= player.storage.tairan2; + if(eff <= 0 || fd || att >= -2 || Math.abs(hp) <= 1) return false; + if(hp > 2 || eff > 0 && event.player.isLinked() && event.hasNature()) return true; + return !event.player.countCards('hs') || event.player.hp > 2 * event.num && !event.player.hasSkillTag('maixie'); }, logTarget:'player', content:function(){ @@ -2604,6 +2615,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.yimie_num=trigger.player.hp-trigger.num; trigger.num=trigger.player.hp; }, + ai:{ + damageBonus:true, + skillTagFilter:function(player,tag,arg){ + return arg && arg.target && arg.target.hp > 1 && player.hp > 1 && get.attitude(player, arg.target) < -2; + } + } }, yimie2:{ trigger:{player:'damageEnd'}, @@ -2872,7 +2889,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 2' target.chooseToUse({ preTarget:event.target2, - prompt:'请对'+get.translation(event.target2)+'使用一张【杀】,或受到来自'+get.translation(player)+'的一点伤害', + prompt:'请对'+get.translation(event.target2)+'使用一张【杀】,或受到来自'+get.translation(player)+'的1点伤害', filterCard:function(card,player){ return get.name(card)=='sha'&&lib.filter.filterCard.apply(this,arguments); }, @@ -3389,7 +3406,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ player.removeMark('xijue',1); var nono=(get.damageEffect(trigger.player,player,trigger.player)>=0); - trigger.player.chooseToDiscard('he','弃置一张装备牌并令'+get.translation(player)+'摸一张牌,或受到一点伤害',{type:'equip'}).set('ai',function(card){ + trigger.player.chooseToDiscard('he','弃置一张装备牌并令'+get.translation(player)+'摸一张牌,或受到1点伤害',{type:'equip'}).set('ai',function(card){ if(_status.event.nono){ return 0; } @@ -3711,7 +3728,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ weiguan:'卫瓘', zhongyun:'忠允', zhongyun2:'忠允', - zhongyun_info:'锁定技。每名角色的回合限一次,你受伤/回复体力后,若你的体力值与手牌数相等,你回复一点体力或对你攻击范围内的一名角色造成1点伤害;每名角色的回合限一次,你获得手牌或失去手牌后,若你的体力值与手牌数相等,你摸一张牌或弃置一名其他角色一张牌。', + zhongyun_info:'锁定技。每名角色的回合限一次,你受伤/回复体力后,若你的体力值与手牌数相等,你回复1点体力或对你攻击范围内的一名角色造成1点伤害;每名角色的回合限一次,你获得手牌或失去手牌后,若你的体力值与手牌数相等,你摸一张牌或弃置一名其他角色一张牌。', shenpin:'神品', shenpin_info:'当一名角色的判定牌生效前,你可以打出一张与判定牌颜色不同的牌代替之。', zhongyan:'钟琰', diff --git a/character/yxs.js b/character/yxs.js index cb0cc5364..eb2c86eed 100644 --- a/character/yxs.js +++ b/character/yxs.js @@ -92,40 +92,39 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yxs_meixi:'妺喜,姓嬉(喜),生卒年不详,亦作妺嬉、末喜、末嬉,有施氏之女,夏朝最后一位君主夏桀的王后。根据先秦时代记述女子名时所用的全称和简称方式,妺喜应姓喜,即嬉(也作僖)。由于其名字的“妺”字与“妹妹”的“妹”字字形相似,且在《庄子》等作中也有以妺为妹的用法,因此常误作"妹喜"。', yxs_lanlinwang:'高长恭(541年―573年),又名高孝瓘、高肃,祖籍渤海调蓨(今河北省景县),神武帝高欢之孙,文襄帝高澄第四子,生母不详,南北朝时期北齐宗室、将领,封爵兰陵郡王。高长恭貌柔心壮,音容兼美。为将躬勤细事,每得甘美,虽一瓜数果,必与将士分享。累次升任至并州刺史。突厥攻入晋阳,高长恭奋力将其击退。邙山之战,高长恭为中军,率领五百骑兵再入周军包围圈,直至金墉城下,因高长恭戴着头盔,城中的人不确定是敌军或是我军,直到高长恭把头盔脱下来城上的人才知道是高长恭,派弓箭手开始放箭保护他,之后高长恭成功替金墉解围,高长恭在此次战中威名大振,士兵们为此战而讴歌他,即后来知名的《兰陵王入阵曲》。', }, - characterTitle:{ - "yxs_qinqiong":"Sukincen", - }, + characterTitle:{ + yxs_qinqiong:"Sukincen", + }, skill:{ yxs_fanji:{ - audio:2, - trigger:{ - player:"damageEnd", - }, - direct:true, - priority:12, - filter:function (event,player){ - if(!player.countCards('h',{name:'sha'})) return false; - return event.card.name=='sha'||event.card.name=='juedou'; - }, - content:function (){ - player.addTempSkill('yxs_fanji2','shaAfter'); - player.chooseToUse({name:'sha'},trigger.source,'反击:是否对'+get.translation(trigger.source)+'使用一张杀?').logSkill='yxs_fanji'; - }, - }, - yxs_fanji2:{ - audio:2, - trigger:{ - player:"shaBegin", - }, - direct:true, - filter:function (event,player){ - return event.card&&event.card.name=='sha'&&get.color(event.card)=='red'; - }, - content:function (){ - trigger.directHit=true; - }, - }, - + audio:2, + trigger:{ + player:"damageEnd", + }, + direct:true, + priority:12, + filter:function (event,player){ + if(!player.countCards('h',{name:'sha'})) return false; + return event.card&&(event.card.name=='sha'||event.card.name=='juedou'); + }, + content:function(){ + player.addTempSkill('yxs_fanji2','shaAfter'); + player.chooseToUse({name:'sha'},trigger.source,'反击:是否对'+get.translation(trigger.source)+'使用一张杀?').logSkill='yxs_fanji'; + }, + }, + yxs_fanji2:{ + audio:2, + trigger:{ + player:"shaBegin", + }, + direct:true, + filter:function (event,player){ + return event.card&&event.card.name=='sha'&&get.color(event.card)=='red'; + }, + content:function (){ + trigger.directHit=true; + }, + }, yxs_menshen3:{ trigger:{ player:['phaseBegin','dieBegin'], @@ -133,78 +132,75 @@ game.import('character',function(lib,game,ui,get,ai,_status){ silent:true, filter:function(event,player){ return game.hasPlayer(function(current){ - return current.hasSkill('yxs_menshen2'); - }); + return current.hasSkill('yxs_menshen2'); + }); }, content:function(){ - for(var i=0;i1; - }, - content:function (){ - "step 0" - player.chooseTarget('选择【门神】的目标',lib.translate.yxs_menshen_info,true,function(card,player,target){ - return target!=player; - }).set('ai',function(target){ - return get.attitude(player,target); - }); - "step 1" - if(result.bool){ - var target=result.targets[0]; + }, + yxs_menshen:{ + audio:2, + trigger:{ + player:"phaseEnd", + }, + priority:15, + group:'yxs_menshen3', + onremove:true, + filter:function (event,player){ + return game.players.length>1; + }, + content:function(){ + "step 0" + player.chooseTarget('选择【门神】的目标',lib.translate.yxs_menshen_info,true,function(card,player,target){ + return target!=player; + }).set('ai',function(target){ + return get.attitude(player,target); + }); + "step 1" + if(result.bool){ + var target=result.targets[0]; player.line(target,'green'); game.log(target,'成为了','【门神】','的目标'); target.storage.yxs_menshen2=player; target.addSkill('yxs_menshen2'); - } - else { - event.finish(); - } - }, - ai:{ - expose:0.5, - }, - }, - - yxs_menshen2:{ - audio:2, - mark:'character', + } + else{ + event.finish(); + } + }, + ai:{ + expose:0.5, + }, + }, + yxs_menshen2:{ + audio:2, + mark:'character', intro:{ content:'当你成为【杀】或【决斗】的目标后,改为$成为目标' }, nopop:true, - priority:15, - trigger:{ - target:["shaBegin","juedouBegin"], - }, - forced:true, + priority:15, + trigger:{ + target:["shaBegin","juedouBegin"], + }, + forced:true, popup:false, filter:function(event,player){ return player.isAlive(); }, - content:function (){ - var target=player.storage.yxs_menshen2; - trigger.player.line(target,'green'); - trigger.targets.remove(player); - trigger.targets.push(target); - trigger.target = target; - }, - }, - + content:function (){ + var target=player.storage.yxs_menshen2; + trigger.player.line(target,'green'); + trigger.targets.remove(player); + trigger.targets.push(target); + trigger.target = target; + }, + }, guimian:{ trigger:{source:'damageEnd'}, forced:true, @@ -2465,7 +2461,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ "step 0" - trigger.source.chooseCard('交出一张红桃牌或流失一点体力',function(card){ + trigger.source.chooseCard('交出一张红桃牌或失去1点体力',function(card){ return get.suit(card)=='heart'; }).ai=function(card){ return 6-get.value(card); @@ -2938,169 +2934,169 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yxs_qinqiong:"秦琼", yxs_fanji:"反击", - yxs_fanji2:"反击", - yxs_fanji_info:"当你受到【杀】或【决斗】造成的伤害后,你可以对伤害来源使用一张【杀】。若此【杀】为红色,其不可闪避", - yxs_menshen:"门神", - yxs_menshen2:"门神", - yxs_menshen3:"门神", - yxs_menshen_info:"回合结束阶段,你可选择一名其他角色,若如此做,直到你的下回合开始,所有角色对该角色使用的【杀】或【决斗】均视为对你使用", + yxs_fanji2:"反击", + yxs_fanji_info:"当你受到【杀】或【决斗】造成的伤害后,你可以对伤害来源使用一张【杀】。若此【杀】为红色,其不可闪避。", + yxs_menshen:"门神", + yxs_menshen2:"门神", + yxs_menshen3:"门神", + yxs_menshen_info:"回合结束阶段,你可选择一名其他角色,若如此做,直到你的下回合开始,所有角色对该角色使用的【杀】或【决斗】均视为对你使用。", zhuxin:'诛心', - zhuxin_info:'出牌阶段限一次,你可以与一名其他角色拼点,若你赢,你对其造成一点伤害', + zhuxin_info:'出牌阶段限一次,你可以与一名其他角色拼点,若你赢,你对其造成1点伤害。', wlianhuan:'连环', - wlianhuan_info:'你使用杀造成伤害时,可以弃置一张装备区内的牌并令伤害+1', + wlianhuan_info:'你使用【杀】造成伤害时,可以弃置一张装备区内的牌并令伤害+1。', liebo:'裂帛', - liebo_info:'出牌阶段限一次,你可以将你的手牌与一名其他角色交换(手牌数之差不能多于1)', + liebo_info:'出牌阶段限一次,你可以将你的手牌与一名其他角色交换(手牌数之差不能多于1)。', yaoji:'妖姬', - yaoji_info:'每当你受到一次伤害,你可以将一张乐不思蜀置入伤害来源的判定区', + yaoji_info:'每当你受到一次伤害,你可以将一张【乐不思蜀】置入伤害来源的判定区。', guimian:'鬼面', - guimian_info:'锁定技,每当你在出牌阶段使用杀造成伤害,本阶段内出杀次数上限+1', + guimian_info:'锁定技,每当你在出牌阶段使用【杀】造成伤害,本阶段内出【杀】次数上限+1。', lyuxue:'浴血', lyuxue2:'浴血', - lyuxue_info:'锁定技,每当你造成一次伤害,若目标没有浴血标记,你令其获得一个浴血标记;当一名角色失去浴血标记时,其流失一点体力;准备阶段,若场上浴血标记的数量不少于存活角色数的一半(向下取整),你清空浴血标记;当你即将死亡时,你清空浴血标记', + lyuxue_info:'锁定技,每当你造成一次伤害,若目标没有浴血标记,你令其获得一个浴血标记;当一名角色失去浴血标记时,其失去1点体力;准备阶段,若场上浴血标记的数量不少于存活角色数的一半(向下取整),你清空浴血标记;当你即将死亡时,你清空浴血标记。', huli:'护理', - huli_info:'出牌阶段,你可以将一张红桃手牌当作桃对距离1以内的角色使用', + huli_info:'出牌阶段,你可以将一张红桃手牌当作【桃】对距离1以内的角色使用。', yixin:'医心', - yixin_info:'限定技,你可以弃置两张牌,然后令一名已受伤角色回复X点体力并摸4-X张牌(X为该角色已损失的体力值且不超过4)', + yixin_info:'限定技,你可以弃置两张牌,然后令一名已受伤角色回复X点体力并摸4-X张牌(X为该角色已损失的体力值且不超过4)。', xianqu:'先驱', - xianqu_info:'锁定技,你不能成为点数小于8的杀的目标', + xianqu_info:'锁定技,你不能成为点数小于8的杀的目标。', zbudao:'布道', - zbudao_info:'摸牌阶段,你可以额外摸一张牌,然后将摸到的牌中的一张交给一名其他角色', + zbudao_info:'摸牌阶段,你可以额外摸一张牌,然后将摸到的牌中的一张交给一名其他角色。', taiji:'太极', - taiji_info:'每当你使用或打出一张闪,你可以使用一张杀', + taiji_info:'每当你使用或打出一张【闪】,你可以使用一张【杀】。', luobi:'落笔', - luobi_info:'结束阶段,可以摸数量等同于已损失体力值的牌,并以任意方式分配给任意角色', + luobi_info:'结束阶段,可以摸数量等同于已损失体力值的牌,并以任意方式分配给任意角色。', fengliu:'风流', - fengliu_info:'锁定技,摸牌阶段,你额外摸X张牌,X为存活女性角色数且不超过2', + fengliu_info:'锁定技,摸牌阶段,你额外摸X张牌,X为存活女性角色数且不超过2。', shiqin:'弑亲', - shiqin_info:'锁定技,其他群势力角色濒死时,你令其立即死亡', + shiqin_info:'锁定技,其他群势力角色濒死时,你令其立即死亡。', yjujian:'拒谏', - yjujian_info:'出牌阶段限一次,你可以交给一名其他角色一张牌,该角色的锦囊牌不能指定你为目标直到你的下一回合开始', + yjujian_info:'出牌阶段限一次,你可以交给一名其他角色一张牌,该角色的锦囊牌不能指定你为目标直到你的下一回合开始。', yaoyi:'徭役', - yaoyi_info:'每当你受到一次伤害,你可以令至多2名非群势力角色交给你一张手牌', + yaoyi_info:'每当你受到一次伤害,你可以令至多2名非群势力角色交给你一张手牌。', zyhufu:'胡服', - zyhufu_info:'锁定技,当你的装备区内没有防具牌时,你摸牌阶段额外摸一张牌;当你装备区内有防具牌时,你的手牌上限+5', + zyhufu_info:'锁定技,当你的装备区内没有防具牌时,你摸牌阶段额外摸一张牌;当你装备区内有防具牌时,你的手牌上限+5。', hanbei:'捍北', - hanbei_info:'锁定技,你的装备区有马时,你的杀不可闪避', + hanbei_info:'锁定技,你的装备区有马时,你的【杀】不可闪避。', kuangchan:'狂禅', - kuangchan_info:'锁定技,你做主公时,不增加体力上限', + kuangchan_info:'锁定技,你做主公时,不增加体力上限。', yxsdili:'底力', - // yxsdili_info:'锁定技,摸牌阶段,你额外摸X张牌,X为你已损失的体力值', - yxsdili_info:'锁定技,摸牌阶段,你额外摸X张牌,X为你已损失的体力值的一半,向上取整且最多为2', + // yxsdili_info:'锁定技,摸牌阶段,你额外摸X张牌,X为你已损失的体力值。', + yxsdili_info:'锁定技,摸牌阶段,你额外摸X张牌,X为你已损失的体力值的一半,向上取整且最多为2。', chujia:'初嫁', - chujia_info:'出牌阶段限一次,你可以弃置两张相同颜色的手牌,指定任意一名角色摸X张牌。(X为该角色已损失的体力值) ', + chujia_info:'出牌阶段限一次,你可以弃置两张相同颜色的手牌,指定任意一名角色摸X张牌。(X为该角色已损失的体力值)', zhijie:'知节', - zhijie_info:'出牌阶段限一次,你的红桃手牌可以当做无中生有使用', + zhijie_info:'出牌阶段限一次,你的红桃手牌可以当做【无中生有】使用。', baihe:'捭阖', - baihe_info:'出牌阶段限一次,你可以弃置一张牌,选择以下1项执行:(1)横置1名未横置角色,该角色摸一张牌;(2)重置一名已横置角色,该角色弃置一张手牌', + baihe_info:'出牌阶段限一次,你可以弃置一张牌,选择以下1项执行:(1)横置1名未横置角色,该角色摸一张牌;(2)重置一名已横置角色,该角色弃置一张手牌。', yinyang:'阴阳', - yinyang_info:'出牌阶段限一次,你可以弃置两张手牌并选择3名角色,分别横置或重置这些角色', + yinyang_info:'出牌阶段限一次,你可以弃置两张手牌并选择3名角色,分别横置或重置这些角色。', xiushen:'修身', - // xiushen_info:'锁定技,结束阶段,若场上有横置角色,你摸两张牌', - xiushen_info:'锁定技,出牌阶段结束时,若场上有横置角色,你摸两张牌', + // xiushen_info:'锁定技,结束阶段,若场上有横置角色,你摸两张牌。', + xiushen_info:'锁定技,出牌阶段结束时,若场上有横置角色,你摸两张牌。', yanyi:'演绎', - yanyi_info:'出牌阶段限一次,你可以弃置一张黑色牌,指定1名角色和1种花色,若被指定角色的手牌中含有此花色,则受到1点伤害', + yanyi_info:'出牌阶段限一次,你可以弃置一张黑色牌,指定1名角色和1种花色,若被指定角色的手牌中含有此花色,则受到1点伤害。', jiean:'结案', jiean_info:'每当【演绎】造成伤害时,你可以摸X张牌,并以任意数量分配给任意角色(X为被【演绎】造成伤害角色的已损失体力值)。', wumu:'武穆', - wumu_info:'锁定技,你的黑杀无视距离,红色不计入回合内的出杀限制', + wumu_info:'锁定技,你的黑色【杀】无视距离,红色【杀】不计入回合内的出杀限制。', ysheshen:'舍身', - ysheshen_info:'每当你受到一点伤害,可以观看牌堆顶的两张牌,并将其交给任意1~2名角色', + ysheshen_info:'每当你受到1点伤害,可以观看牌堆顶的两张牌,并将其交给任意1~2名角色。', sanbanfu:'三板斧', - sanbanfu_info:'当你对其他角色使用杀时,你可以使此杀有如下效果:若对方没有出闪,其受到2点伤害;若对方打出了一张闪,你与其各受到1点伤害;若对方打出了两张闪,你受到一点伤害', + sanbanfu_info:'当你对其他角色使用【杀】时,你可以使此【杀】有如下效果:若对方没有出【闪】,其受到2点伤害;若对方打出了一张【闪】,你与其各受到1点伤害;若对方打出了两张【闪】,你受到1点伤害。', bingsheng:'兵圣', - bingsheng_info:'出牌阶段限一次,你可以弃置两张花色不同的手牌,指定一名其他角色使其体力值与你相同(体力最多变化2点)', + bingsheng_info:'出牌阶段限一次,你可以弃置两张花色不同的手牌,指定一名其他角色使其体力值与你相同(体力最多变化2点)。', taolue:'韬略', - taolue_info:'锁定技,你的手牌上限+1', + taolue_info:'锁定技,你的手牌上限+1。', shentan:'神探', - shentan_info:'出牌阶段限一次,你可以弃置一张牌,获得距离2以内的一名角色的手牌,并可以将其交给任意一名角色', + shentan_info:'出牌阶段限一次,你可以弃置一张牌,获得距离2以内的一名角色的手牌,并可以将其交给任意一名角色。', hanqiang:'寒枪', - hanqiang_info:'锁定技,当你没装备武器时,攻击范围+1', + hanqiang_info:'锁定技,当你没装备武器时,攻击范围+1。', biaoqi:'骠骑', - biaoqi_info:'锁定技,当你出杀指定目标后,若你的攻击范围大于目标体力值,则此杀不可闪避;若你的攻击范围小于目标体力值,你摸一张牌', + biaoqi_info:'锁定技,当你出【杀】指定目标后,若你的攻击范围大于目标体力值,则此【杀】不可闪避;若你的攻击范围小于目标体力值,你摸一张牌。', wluoyan:'落雁', - wluoyan_info:'锁定技,你防止即将受到的伤害,改为流失一点体力', + wluoyan_info:'锁定技,你防止即将受到的伤害,改为失去1点体力。', heqin:'和亲', heqin2:'和亲', heqin3:'和亲', - heqin_info:'限定技,你可以与场上一名男性角色形成【和亲】状态,你与该男性角色于摸牌阶段摸牌数+1。你或者男性角色阵亡时,【和亲】状态消失', + heqin_info:'限定技,你可以与场上一名男性角色形成【和亲】状态,你与该男性角色于摸牌阶段摸牌数+1。你或者男性角色阵亡时,【和亲】状态消失。', chajue:'察觉', chajue2:'察觉', - chajue_info:'锁定技,你的回合外,你每受到一次伤害,任何【杀】或普通锦囊牌均对你无效,直到你的回合开始', + chajue_info:'锁定技,你的回合外,你每受到一次伤害,任何【杀】或普通锦囊牌均对你无效,直到你的回合开始。', tiewan:'铁腕', - tiewan_info:'每当其他角色使用延时类锦囊牌时,你可以立即将一张红色牌当作乐不思蜀使用', + tiewan_info:'每当其他角色使用延时类锦囊牌时,你可以立即将一张红色牌当作【乐不思蜀】使用。', qianglue:'强掠', - qianglue_info:'每当你的杀被闪避时,你可以进行一次判定,若结果为黑色,你可以获得对方的一张牌', + qianglue_info:'每当你的【杀】被闪避时,你可以进行一次判定,若结果为黑色,你可以获得对方的一张牌。', xiadao:'侠盗', - xiadao_info:'每当你造成一次伤害,你可以令一名手牌数不少于受伤害角色的另一名角色获得其一张手牌', + xiadao_info:'每当你造成一次伤害,你可以令一名手牌数不少于受伤害角色的另一名角色获得其一张手牌。', jimin:'机敏', - jimin_info:'当你的装备区内没有牌时,你可以将一张手牌当作闪使用或打出', + jimin_info:'当你的装备区内没有牌时,你可以将一张手牌当作【闪】使用或打出。', sheshu:'射术', - sheshu_info:'锁定技,你的杀无视距离;体力值不小于3的角色不能闪避你的杀', + sheshu_info:'锁定技,你的【杀】无视距离;体力值不小于3的角色不能闪避你的【杀】。', tongyu:'统御', - tongyu_info:'出牌阶段,你可以弃置一张牌,并转变为罗宾汉(每回合只能转变一次)', + tongyu_info:'出牌阶段,你可以弃置一张牌,并转变为罗宾汉(每回合只能转变一次)。', lguiyin:'归隐', - lguiyin_info:'出牌阶段,若你本回合内未造成伤害,你可以摸一张牌,并转变为汉丁顿伯爵(每回合只能转变一次)', + lguiyin_info:'出牌阶段,若你本回合内未造成伤害,你可以摸一张牌,并转变为汉丁顿伯爵(每回合只能转变一次)。', lzhangyi:'仗义', - lzhangyi_info:'你可以将你弃置的卡牌交给一名其他角色', + lzhangyi_info:'你可以将你弃置的卡牌交给一名其他角色。', yizhuang:'易装', yizhuang2:'易装', - yizhuang_info:'准备阶段,你可以弃置一张牌并选择一名男性角色,获得其所有技能,直到你首次受到伤害', + yizhuang_info:'准备阶段,你可以弃置一张牌并选择一名男性角色,获得其所有技能,直到你首次受到伤害。', kongju:'控局', - kongju_info:'锁定技,你的手牌上限为你的体力上限;当你的手牌数小于体力上限时,你不能成为过河拆桥或顺手牵羊的目标;当你的手牌数大于体力上限时,你不能成为乐不思蜀的目标', + kongju_info:'锁定技,你的手牌上限为你的体力上限;当你的手牌数小于体力上限时,你不能成为过河拆桥或顺手牵羊的目标;当你的手牌数大于体力上限时,你不能成为乐不思蜀的目标。', tuqiang:'图强', - tuqiang_info:'每当你使用或打出一张闪,你可以摸一张牌', + tuqiang_info:'每当你使用或打出一张【闪】,你可以摸一张牌。', zhensha:'鸩杀', - zhensha_info:'当场上有角色进入濒死状态时,你可以弃置一张酒或两张黑色手牌,则该角色立即死亡。', + zhensha_info:'当场上有角色进入濒死状态时,你可以弃置一张【酒】或两张黑色手牌,则该角色立即死亡。', xumou:'蓄谋', - xumou_info:'结束阶段,你可以将武将牌翻面并摸3张牌', + xumou_info:'结束阶段,你可以将武将牌翻面并摸三张牌。', guifu:'鬼斧', - guifu_info:'出牌阶段限一次,你可以指定一名角色装备区内的一张牌,将其弃掉,自己和对方同时摸取一张牌', + guifu_info:'出牌阶段限一次,你可以指定一名角色装备区内的一张牌,将其弃掉,自己和对方同时摸取一张牌。', lshengong:'神工', - lshengong_info:'出牌阶段限一次,你可以选定场上任意一名角色的装备区的非特殊牌,出自己的一张手牌复制该装备,然后可以选择装备上自己或者别的角色的装备区', + lshengong_info:'出牌阶段限一次,你可以选定场上任意一名角色的装备区的非特殊牌,出自己的一张手牌复制该装备,然后可以选择装备上自己或者别的角色的装备区。', zhexian:'谪仙', - zhexian_info:'当你于一名其他角色的回合内首次失去牌时,你可以摸一张牌', + zhexian_info:'当你于一名其他角色的回合内首次失去牌时,你可以摸一张牌。', miaobi:'妙笔', - miaobi_info:'出牌阶段限一次,你可以弃置一名其他角色的一张牌,若此牌是基本牌或普通锦囊,你可以将一张手牌当此牌使用;否则你须弃置一张牌', + miaobi_info:'出牌阶段限一次,你可以弃置一名其他角色的一张牌,若此牌是基本牌或普通锦囊,你可以将一张手牌当此牌使用;否则你须弃置一张牌。', cike:'刺客', cike_info:'你对别的角色出【杀】时可以选择做一次判定:若判定牌为红色花色,则此【杀】不可回避,直接命中;若判定牌为黑色花色,你可以选择弃掉对方一张牌。', qiangyun:'强运', - qiangyun_info:'每当你失去最后一张手牌,可摸两张牌', + qiangyun_info:'每当你失去最后一张手牌,可摸两张牌。', ducai:'独裁', ducai2:'独裁', ducai3:'独裁', - ducai_info:'出牌阶段限一次,你可以弃置一张牌,则本轮内除你外的角色不能使用或打出与该手牌花色相同的手牌', + ducai_info:'出牌阶段限一次,你可以弃置一张牌,则本轮内除你外的角色不能使用或打出与该手牌花色相同的手牌。', tongling:'统领', - tongling_info:'锁定技,每当一名友方角色造成一次伤害,你获得1个统领标记(标记上限为3)', + tongling_info:'锁定技,每当一名友方角色造成一次伤害,你获得1个统领标记(标记上限为3)。', fanpu:'反扑', - fanpu_info:'出牌阶段限一次,你可以移去3枚统领标记并视为对攻击范围内的至多3名角色使用一张杀', + fanpu_info:'出牌阶段限一次,你可以移去3枚统领标记并视为对攻击范围内的至多3名角色使用一张【杀】。', fenghuo:'烽火', - fenghuo_info:'你可以将一张装备区内的牌当作南蛮入侵使用', + fenghuo_info:'你可以将一张装备区内的牌当作【南蛮入侵】使用。', yxsweiyi:'威仪', - yxsweiyi_info:'每当你受到一次伤害,可以令伤害来源弃置两张牌', + yxsweiyi_info:'每当你受到一次伤害,可以令伤害来源弃置两张牌。', xieling:'挟令', - xieling_info:'出牌阶段,弃掉两张手牌,将任意一名角色装备区或判定区的牌移动到另一名角色对应的区域', + xieling_info:'出牌阶段,弃掉两张手牌,将任意一名角色装备区或判定区的牌移动到另一名角色对应的区域。', baye:'霸业', baye_info:'出牌阶段,你可以将一张牌当做本回合内前一张使用的牌来使用。每回合限用一次。', nvquan:'女权', nvquan1:'女权', nvquan2:'女权', - nvquan_info:'你对男性角色使用【杀】或【决斗】时,对方需连续打出两张【闪】或【杀】响应;你不能成为男性角色的决斗目标', + nvquan_info:'你对男性角色使用【杀】或【决斗】时,对方需连续打出两张【闪】或【杀】响应;你不能成为男性角色的决斗目标。', qiandu:'迁都', qiandu_info:'出牌阶段,你可以弃一张黑色手牌,和一名存活的玩家与其交换位置。每回合限一次。', budao:'补刀', budao_info:'你的回合外,你的攻击范围的一名角色受到【杀】的伤害时,你可以对其使用一张【杀】,只要你的【杀】对目标角色造成了伤害,你就可以继续对其使用【杀】。', feigong:'非攻', - feigong_info:'其他角色使用杀时,若你不是杀的目标,可以弃置一张杀取消之', + feigong_info:'其他角色使用【杀】时,若你不是【杀】的目标,可以弃置一张【杀】取消之。', jianai:'兼爱', - jianai_info:'每当你回复一点体力,可以令所有其他角色回复一点体力', + jianai_info:'每当你回复1点体力,可以令所有其他角色回复1点体力。', bolehuiyan:'慧眼', - bolehuiyan_info:'当一名有手牌的其他角色成为来源不为你的杀的目标时,你可以预言此杀能否命中,若预言正确,你摸一张牌,否则你须弃置一张牌。每回合限发动一次', + bolehuiyan_info:'当一名有手牌的其他角色成为来源不为你的杀的目标时,你可以预言此杀能否命中,若预言正确,你摸一张牌,否则你须弃置一张牌。每回合限发动一次。', xiangma:'相马', - xiangma_info:'锁定技,只要你的体力值大于2点,你的进攻距离+1;只要你的体力值为2点或更低,你的防御距离+1', + xiangma_info:'锁定技,只要你的体力值大于2点,你的进攻距离+1;只要你的体力值为2点或更低,你的防御距离+1。', seyou:'色诱', seyou_info:'限定技,出牌阶段,你可以指定任意1名角色,其他所有男性角色需选择1项执行:(1)对你指定的角色出【杀】;(2)令你获得其一张牌。', sheshi:'蛇噬', - sheshi_info:'每受到1次伤害,可以指定1种花色,依次展示牌堆顶的牌,直到出现指定花色的牌为止,你获得与指定花色不同花色的所有牌(最多展示4张牌)。', + sheshi_info:'每受到1次伤害,可以指定1种花色,依次展示牌堆顶的牌,直到出现指定花色的牌为止,你获得与指定花色不同花色的所有牌(最多展示四张牌)。', fengyi:'凤仪', @@ -3109,7 +3105,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wange_info:'摸牌时,你可以少摸一张牌,则结束阶段你可以抽取一名其他角色的手牌,至少1张,至多X张(X为你当前的掉血量)。', nichang:'霓裳', nichang2:'霓裳', - nichang_info:'摸牌时,你可以选择不摸牌,并在结束阶段展示手牌,每少一种花色摸一张牌', + nichang_info:'摸牌时,你可以选择不摸牌,并在结束阶段展示手牌,每少一种花色摸一张牌。', fengyan:'丰艳', fengyan_info:'你可以获得其他男性角色的红色判定牌。', zhulu:'逐鹿', @@ -3118,17 +3114,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jieyong2:'节用', jieyong_info:'你使用的卡牌结算完成后,你可以弃置一张黑色牌并重新获得之。(每回合限一次)', shangtong:'尚同', - shangtong_info:'每当你令其他角色恢复1点血量或掉1点血量时,你可以摸1张牌(摸牌上限为4)', + shangtong_info:'每当你令其他角色恢复1点血量或掉1点血量时,你可以摸一张牌(摸牌上限为4)。', feiming:'非命', - feiming_info:'其他角色对你造成伤害时,你可以令该角色须选择1项执行:1,将1张红桃花色手牌交给你;2,流失1点血量', + feiming_info:'其他角色对你造成伤害时,你可以令该角色须选择1项执行:1,将1张红桃花色手牌交给你;2,失去1点血量。', yxsrenwang:'人望', - yxsrenwang_info:'出牌阶段,你可以弃掉2张牌并指定一名手牌数大于你的角色,你摸牌至与该角色手牌数相等,每阶段限一次。', + yxsrenwang_info:'出牌阶段,你可以弃置两张牌并指定一名手牌数大于你的角色,你摸牌至与该角色手牌数相等,每阶段限一次。', shiwei:'施威', shiwei_info:'当其他角色失去最后一张手牌时,你可以将牌堆顶的一张牌背面朝上置于该角色面前,该角色回合,跳过出牌阶段并弃掉这张牌。', yxswushuang:'无双', - yxswushuang_info:'出牌阶段,你使用【杀】时可同时打出两张【杀】,则该【杀】具有以下效果之一:1,伤害+1;2,额外指定两个目标', + yxswushuang_info:'出牌阶段,你使用【杀】时可同时打出两张【杀】,则该【杀】具有以下效果之一:1,伤害+1;2,额外指定两个目标。', xiaoyong:'骁勇', - xiaoyong_info:'你可以将黑色手牌当作【杀】来使用', + xiaoyong_info:'你可以将黑色手牌当作【杀】来使用。', yxsqinzheng:'亲征', yxsqinzheng_info:'出牌阶段,你对其他角色造成伤害时,可以令场上任意角色摸一张牌。', juma:'拒马', diff --git a/character/zhuogui.js b/character/zhuogui.js index 6504fdb64..e85e7d38c 100644 --- a/character/zhuogui.js +++ b/character/zhuogui.js @@ -173,7 +173,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ players.sort(function(a,b){ return b.hp-a.hp; }); - return '枭首:是否对'+get.translation(players[0])+'造成一点火焰伤害?'; + return '枭首:是否对'+get.translation(players[0])+'造成1点火焰伤害?'; }, content:function(){ var players=game.players.slice(0); @@ -309,34 +309,34 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qixiang:'祺祥', qixiang1:'祺祥', qixiang2:'祺祥', - nianrui_info:'准备阶段和结束阶段,你可以进行一次判定,若结果为红色则摸一张牌', - qixiang_info:'乐不思蜀判定时,你的方块判定牌视为红桃;兵粮寸断判定时,你的黑桃判定牌视为草花', + nianrui_info:'准备阶段和结束阶段,你可以进行一次判定,若结果为红色则摸一张牌。', + qixiang_info:'乐不思蜀判定时,你的方块判定牌视为红桃;兵粮寸断判定时,你的黑桃判定牌视为草花。', mamian:'马面', lianyu:'炼狱', - lianyu_info:'出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到一点火焰伤害', + lianyu_info:'出牌阶段限一次,你可以弃置一张红色手牌令场上所有角色受到1点火焰伤害。', niutou:'牛头', manjia:'蛮甲', manjia1:'蛮甲', manjia2:'蛮甲', - manjia_info:'锁定技,若你的装备区内没有防具牌,则你视为装备了[藤甲]', + manjia_info:'锁定技,若你的装备区内没有防具牌,则你视为装备了【藤甲】。', xiaoshou:'枭首', - xiaoshou_info:'结束阶段,若场上体力值最多的角色只有一个,你可以对其造成一点火焰伤害', + xiaoshou_info:'结束阶段,若场上体力值最多的角色只有一个,你可以对其造成1点火焰伤害。', guiji:'诡计', - guiji_info:'锁定技,准备阶段结束时,若你的判定区内有牌,你随机弃置其中一张牌', + guiji_info:'锁定技,准备阶段结束时,若你的判定区内有牌,你随机弃置其中一张牌。', baiwuchang:'白无常', qiangzheng:'强征', - qiangzheng_info:'锁定技,结束阶段,你获得一名其他角色的一张手牌', + qiangzheng_info:'锁定技,结束阶段,你获得一名其他角色的一张手牌。', zuijiu:'醉酒', - zuijiu_info:'锁定技,你的黑杀造成的伤害+1,造成伤害后须弃置一张手牌', + zuijiu_info:'锁定技,你的黑杀造成的伤害+1,造成伤害后须弃置一张手牌。', heiwuchang:'黑无常', suoling:'索令', - suoling_info:'锁定技,结束阶段,你解除横置状态,除你之外的所有角色进入横置状态', + suoling_info:'锁定技,结束阶段,你解除横置状态,除你之外的所有角色进入横置状态。', xixing:'吸星', - xixing_info:'出牌阶段限一次,你可以弃置三张不同类别的牌,对一名其他角色造成一点伤害,然后回复一点体力', + xixing_info:'出牌阶段限一次,你可以弃置三张不同类别的牌,对一名其他角色造成1点伤害,然后回复1点体力。', }, }; }); diff --git a/game/asset.js b/game/asset.js index c76553139..4918f2049 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.10.3.1', + 'v1.10.4', /*audio start*/ 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', @@ -213,6 +213,7 @@ window.noname_asset_list=[ 'audio/die/caorui.mp3', 'audio/die/caoshuang.mp3', 'audio/die/caosong.mp3', + 'audio/die/caoxi.mp3', 'audio/die/caoxiancaohua.mp3', 'audio/die/caoxing.mp3', 'audio/die/caoxiu.mp3', @@ -240,6 +241,7 @@ window.noname_asset_list=[ 'audio/die/clan_hanshao.mp3', 'audio/die/clan_wanghun.mp3', 'audio/die/clan_wangling.mp3', + 'audio/die/clan_wanglun.mp3', 'audio/die/clan_wangyun.mp3', 'audio/die/clan_wuban.mp3', 'audio/die/clan_wukuang.mp3', @@ -293,6 +295,7 @@ window.noname_asset_list=[ 'audio/die/dc_yangbiao.mp3', 'audio/die/dc_yanghu.mp3', 'audio/die/dc_yuejiu.mp3', + 'audio/die/dc_zhangmancheng.mp3', 'audio/die/dc_zhaotongzhaoguang.mp3', 'audio/die/dc_zhaoyǎn.mp3', 'audio/die/dc_zhouxuān.mp3', @@ -401,6 +404,7 @@ window.noname_asset_list=[ 'audio/die/handang.mp3', 'audio/die/hanfu.mp3', 'audio/die/hanhaoshihuan.mp3', + 'audio/die/hanlong.mp3', 'audio/die/hanmeng.mp3', 'audio/die/hansui.mp3', 'audio/die/haomeng.mp3', @@ -468,6 +472,7 @@ window.noname_asset_list=[ 'audio/die/key_yuri.mp3', 'audio/die/kongrong.mp3', 'audio/die/kuailiangkuaiyue.mp3', + 'audio/die/laimin.mp3', 'audio/die/laiyinger.mp3', 'audio/die/leibo.mp3', 'audio/die/leitong.mp3', @@ -522,6 +527,7 @@ window.noname_asset_list=[ 'audio/die/luyi.mp3', 'audio/die/luyusheng.mp3', 'audio/die/luzhi.mp3', + 'audio/die/lvboshe.mp3', 'audio/die/lvbu.mp3', 'audio/die/lvdai.mp3', 'audio/die/lvfan.mp3', @@ -546,6 +552,7 @@ window.noname_asset_list=[ 'audio/die/mengda.mp3', 'audio/die/menghuo.mp3', 'audio/die/mengjie.mp3', + 'audio/die/mengyou.mp3', 'audio/die/mifangfushiren.mp3', 'audio/die/mifuren.mp3', 'audio/die/miheng.mp3', @@ -570,6 +577,7 @@ window.noname_asset_list=[ 'audio/die/ol_furong.mp3', 'audio/die/ol_huangzhong.mp3', 'audio/die/ol_huaxin.mp3', + 'audio/die/ol_huban.mp3', 'audio/die/ol_jiangwei.mp3', 'audio/die/ol_lisu.mp3', 'audio/die/ol_liuba.mp3', @@ -594,6 +602,7 @@ window.noname_asset_list=[ 'audio/die/ol_yuanshao.mp3', 'audio/die/ol_yujin.mp3', 'audio/die/ol_zhangyì.mp3', + 'audio/die/ol_zhangzhang.mp3', 'audio/die/ol_zhouqun.mp3', 'audio/die/ol_zhujun.mp3', 'audio/die/ol_zhuling.mp3', @@ -723,6 +732,7 @@ window.noname_asset_list=[ 'audio/die/re_sunyi.mp3', 'audio/die/re_taishici.mp3', 'audio/die/re_taoqian.mp3', + 'audio/die/re_wangyi.mp3', 'audio/die/re_weiyan.mp3', 'audio/die/re_wenpin.mp3', 'audio/die/re_wuguotai.mp3', @@ -789,7 +799,9 @@ window.noname_asset_list=[ 'audio/die/sb_sunquan.mp3', 'audio/die/sb_sunshangxiang.mp3', 'audio/die/sb_xiahoushi.mp3', + 'audio/die/sb_xiaoqiao.mp3', 'audio/die/sb_xuhuang.mp3', + 'audio/die/sb_yl_luzhi.mp3', 'audio/die/sb_yuanshao.mp3', 'audio/die/sb_yujin.mp3', 'audio/die/sb_zhangfei.mp3', @@ -965,9 +977,11 @@ window.noname_asset_list=[ 'audio/die/tw_yanxiang.mp3', 'audio/die/tw_yufuluo.mp3', 'audio/die/tw_yujin.mp3', + 'audio/die/tw_zhanghong.mp3', 'audio/die/tw_zhangji.mp3', 'audio/die/tw_zhangnan.mp3', 'audio/die/tw_zhangning.mp3', + 'audio/die/tw_zhangzhao.mp3', 'audio/die/vtb_xiaojiu.mp3', 'audio/die/vtb_xiaole.mp3', 'audio/die/vtb_xiaosha.mp3', @@ -1124,10 +1138,12 @@ window.noname_asset_list=[ 'audio/die/yj_ganning.mp3', 'audio/die/yj_huangzhong.mp3', 'audio/die/yj_jushou.mp3', + 'audio/die/yj_qiaozhou.mp3', 'audio/die/yj_weiyan.mp3', 'audio/die/yj_xuhuang.mp3', 'audio/die/yj_zhanghe.mp3', 'audio/die/yj_zhangliao.mp3', + 'audio/die/yj_zhoubuyi.mp3', 'audio/die/yl_luzhi.mp3', 'audio/die/yl_yuanshu.mp3', 'audio/die/yuanhuan.mp3', @@ -1181,6 +1197,7 @@ window.noname_asset_list=[ 'audio/die/zhangxiu.mp3', 'audio/die/zhangxuan.mp3', 'audio/die/zhangxun.mp3', + 'audio/die/zhangyan.mp3', 'audio/die/zhangyao.mp3', 'audio/die/zhangyi.mp3', 'audio/die/zhangyì.mp3', @@ -1233,65 +1250,6 @@ window.noname_asset_list=[ 'audio/die/zumao.mp3', 'audio/die/zuoci.mp3', 'audio/die/zuofen.mp3', - /*dieaudio end*/ - - /*effect audio begin*/ - 'audio/effect/chicken_you_are_so_beautiful.mp3', - 'audio/effect/chickun.wav', - 'audio/effect/croatian_rhapsody.mp3', - 'audio/effect/damage.mp3', - 'audio/effect/damage_female.mp3', - 'audio/effect/damage_fire.mp3', - 'audio/effect/damage_fire2.mp3', - 'audio/effect/damage_ice.mp3', - 'audio/effect/damage_ice2.mp3', - 'audio/effect/damage_male.mp3', - 'audio/effect/damage_thunder.mp3', - 'audio/effect/damage_thunder2.mp3', - 'audio/effect/damage2.mp3', - 'audio/effect/die_female.mp3', - 'audio/effect/die_male.mp3', - 'audio/effect/discard.mp3', - 'audio/effect/draw.mp3', - 'audio/effect/drawx.mp3', - 'audio/effect/equip1.mp3', - 'audio/effect/equip2.mp3', - 'audio/effect/equip3.mp3', - 'audio/effect/equip4.mp3', - 'audio/effect/equip5.mp3', - 'audio/effect/flappybird_die.wav', - 'audio/effect/flappybird_flap.wav', - 'audio/effect/flappybird_hit.wav', - 'audio/effect/flappybird_score.wav', - 'audio/effect/flappybird_start.wav', - 'audio/effect/hitsound.wav', - 'audio/effect/hujia_damage.mp3', - 'audio/effect/hujia_damage_fire.mp3', - 'audio/effect/hujia_damage_fire2.mp3', - 'audio/effect/hujia_damage_thunder.mp3', - 'audio/effect/hujia_damage_thunder2.mp3', - 'audio/effect/hujia_damage2.mp3', - 'audio/effect/ignotus.mp3', - 'audio/effect/judge.mp3', - 'audio/effect/link.mp3', - 'audio/effect/lose.mp3', - 'audio/effect/loseHp.mp3', - 'audio/effect/pigstep.mp3', - 'audio/effect/rakshasa_sea_city.mp3', - 'audio/effect/recover.mp3', - 'audio/effect/sm3dw_overworld.mp3', - 'audio/effect/taketori_hishou.mp3', - 'audio/effect/throw_egg1.mp3', - 'audio/effect/throw_egg2.mp3', - 'audio/effect/throw_flower1.mp3', - 'audio/effect/throw_flower2.mp3', - 'audio/effect/throw_shoe1.mp3', - 'audio/effect/throw_shoe2.mp3', - 'audio/effect/throw_wine1.mp3', - 'audio/effect/throw_wine2.mp3', - 'audio/effect/tie.mp3', - 'audio/effect/tori_no_uta.mp3', - 'audio/effect/win.mp3', /*effect audio end*/ /*skill audio begin*/ @@ -1590,6 +1548,8 @@ window.noname_asset_list=[ 'audio/skill/chunlao3.mp3', 'audio/skill/chuyuan1.mp3', 'audio/skill/chuyuan2.mp3', + 'audio/skill/cibei1.mp3', + 'audio/skill/cibei2.mp3', 'audio/skill/cihuang1.mp3', 'audio/skill/cihuang2.mp3', 'audio/skill/ciwei1.mp3', @@ -1633,6 +1593,8 @@ window.noname_asset_list=[ 'audio/skill/clanhuanjia2.mp3', 'audio/skill/clanhuanyin1.mp3', 'audio/skill/clanhuanyin2.mp3', + 'audio/skill/clanjianyuan1.mp3', + 'audio/skill/clanjianyuan2.mp3', 'audio/skill/clanjiexuan1.mp3', 'audio/skill/clanjiexuan2.mp3', 'audio/skill/clanlianhe1.mp3', @@ -1651,6 +1613,8 @@ window.noname_asset_list=[ 'audio/skill/clanmuyin_clan_wukuang2.mp3', 'audio/skill/clanmuyin_clan_wuxian1.mp3', 'audio/skill/clanmuyin_clan_wuxian2.mp3', + 'audio/skill/clanqiuxin1.mp3', + 'audio/skill/clanqiuxin2.mp3', 'audio/skill/clansankuang1.mp3', 'audio/skill/clansankuang2.mp3', 'audio/skill/clanshangshen1.mp3', @@ -1677,6 +1641,8 @@ window.noname_asset_list=[ 'audio/skill/clanzhongliu_clan_wanghun2.mp3', 'audio/skill/clanzhongliu_clan_wangling1.mp3', 'audio/skill/clanzhongliu_clan_wangling2.mp3', + 'audio/skill/clanzhongliu_clan_wanglun1.mp3', + 'audio/skill/clanzhongliu_clan_wanglun2.mp3', 'audio/skill/clanzhongliu_clan_wangyun1.mp3', 'audio/skill/clanzhongliu_clan_wangyun2.mp3', 'audio/skill/congjian1.mp3', @@ -1932,6 +1898,10 @@ window.noname_asset_list=[ 'audio/skill/dclongsong2.mp3', 'audio/skill/dcluochong1.mp3', 'audio/skill/dcluochong2.mp3', + 'audio/skill/dclvecheng1.mp3', + 'audio/skill/dclvecheng2.mp3', + 'audio/skill/dcmanzhi1.mp3', + 'audio/skill/dcmanzhi2.mp3', 'audio/skill/dcmengjie1.mp3', 'audio/skill/dcmengjie2.mp3', 'audio/skill/dcmieji1.mp3', @@ -2140,6 +2110,8 @@ window.noname_asset_list=[ 'audio/skill/dczhenze2.mp3', 'audio/skill/dczhizhe1.mp3', 'audio/skill/dczhizhe2.mp3', + 'audio/skill/dczhongji1.mp3', + 'audio/skill/dczhongji2.mp3', 'audio/skill/dczhongjie1.mp3', 'audio/skill/dczhongjie2.mp3', 'audio/skill/dczhubi1.mp3', @@ -2287,6 +2259,8 @@ window.noname_asset_list=[ 'audio/skill/duoshi2.mp3', 'audio/skill/dushi1.mp3', 'audio/skill/dushi2.mp3', + 'audio/skill/duwang1.mp3', + 'audio/skill/duwang2.mp3', 'audio/skill/duwu1.mp3', 'audio/skill/duwu2.mp3', 'audio/skill/dzgengzhan1.mp3', @@ -2723,6 +2697,8 @@ window.noname_asset_list=[ 'audio/skill/jiangchi2.mp3', 'audio/skill/jianglue1.mp3', 'audio/skill/jianglue2.mp3', + 'audio/skill/jiangxi1.mp3', + 'audio/skill/jiangxi2.mp3', 'audio/skill/jianhui1.mp3', 'audio/skill/jianhui2.mp3', 'audio/skill/jianliang1.mp3', @@ -2937,7 +2913,6 @@ window.noname_asset_list=[ 'audio/skill/juxiang1_re_zhurong2.mp3', 'audio/skill/juxiang11.mp3', 'audio/skill/juxiang12.mp3', - 'audio/skill/juyi.mp3', 'audio/skill/juyi1.mp3', 'audio/skill/juyi2.mp3', 'audio/skill/jyishi1.mp3', @@ -3004,6 +2979,9 @@ window.noname_asset_list=[ 'audio/skill/kurou3.mp3', 'audio/skill/kurou4.mp3', 'audio/skill/kuwu.mp3', + 'audio/skill/laishou1.mp3', + 'audio/skill/laishou2.mp3', + 'audio/skill/laishou3.mp3', 'audio/skill/langmie1.mp3', 'audio/skill/langmie2.mp3', 'audio/skill/lanjiang1.mp3', @@ -3137,6 +3115,8 @@ window.noname_asset_list=[ 'audio/skill/luanfeng2.mp3', 'audio/skill/luanji1.mp3', 'audio/skill/luanji2.mp3', + 'audio/skill/luanqun1.mp3', + 'audio/skill/luanqun2.mp3', 'audio/skill/luanwu_re_jiaxu1.mp3', 'audio/skill/luanwu_re_jiaxu2.mp3', 'audio/skill/luanwu1.mp3', @@ -3172,6 +3152,8 @@ window.noname_asset_list=[ 'audio/skill/manjuan.mp3', 'audio/skill/mansi1.mp3', 'audio/skill/mansi2.mp3', + 'audio/skill/manyi_mengyou1.mp3', + 'audio/skill/manyi_mengyou2.mp3', 'audio/skill/manyi1.mp3', 'audio/skill/manyi2.mp3', 'audio/skill/mazui.mp3', @@ -3179,6 +3161,10 @@ window.noname_asset_list=[ 'audio/skill/mbaosi2.mp3', 'audio/skill/mbguli1.mp3', 'audio/skill/mbguli2.mp3', + 'audio/skill/mbhuiyao1.mp3', + 'audio/skill/mbhuiyao2.mp3', + 'audio/skill/mbquesong1.mp3', + 'audio/skill/mbquesong2.mp3', 'audio/skill/mbshihe1.mp3', 'audio/skill/mbshihe2.mp3', 'audio/skill/mbzhenfu1.mp3', @@ -3207,6 +3193,8 @@ window.noname_asset_list=[ 'audio/skill/midu2.mp3', 'audio/skill/mieji1.mp3', 'audio/skill/mieji2.mp3', + 'audio/skill/miji_re_wangyi1.mp3', + 'audio/skill/miji_re_wangyi2.mp3', 'audio/skill/miji1.mp3', 'audio/skill/miji2.mp3', 'audio/skill/mingce1.mp3', @@ -3331,6 +3319,8 @@ window.noname_asset_list=[ 'audio/skill/nzry_lijun12.mp3', 'audio/skill/nzry_longnu1.mp3', 'audio/skill/nzry_longnu2.mp3', + 'audio/skill/nzry_mingren_1_sb_yl_luzhi1.mp3', + 'audio/skill/nzry_mingren_1_sb_yl_luzhi2.mp3', 'audio/skill/nzry_mingren_11.mp3', 'audio/skill/nzry_mingren_12.mp3', 'audio/skill/nzry_mingren_21.mp3', @@ -3390,6 +3380,8 @@ window.noname_asset_list=[ 'audio/skill/oldingcuo2.mp3', 'audio/skill/oldmiji1.mp3', 'audio/skill/oldmiji2.mp3', + 'audio/skill/oldongdao1.mp3', + 'audio/skill/oldongdao2.mp3', 'audio/skill/oldqianxi1.mp3', 'audio/skill/oldqianxi2.mp3', 'audio/skill/olduanliang1.mp3', @@ -3406,12 +3398,18 @@ window.noname_asset_list=[ 'audio/skill/olfengji2.mp3', 'audio/skill/olfengzi1.mp3', 'audio/skill/olfengzi2.mp3', + 'audio/skill/olfushi1.mp3', + 'audio/skill/olfushi2.mp3', 'audio/skill/olfusong1.mp3', 'audio/skill/olfusong2.mp3', + 'audio/skill/olgangshu1.mp3', + 'audio/skill/olgangshu2.mp3', 'audio/skill/olgoude1.mp3', 'audio/skill/olgoude2.mp3', 'audio/skill/olguangao1.mp3', 'audio/skill/olguangao2.mp3', + 'audio/skill/olguzheng1.mp3', + 'audio/skill/olguzheng2.mp3', 'audio/skill/olhaoshi1.mp3', 'audio/skill/olhaoshi2.mp3', 'audio/skill/olhongji1.mp3', @@ -3420,6 +3418,8 @@ window.noname_asset_list=[ 'audio/skill/olhuanfu2.mp3', 'audio/skill/olhuiqi1.mp3', 'audio/skill/olhuiqi2.mp3', + 'audio/skill/olhuiyun1.mp3', + 'audio/skill/olhuiyun2.mp3', 'audio/skill/olhunzi_re_sunyi1.mp3', 'audio/skill/olhunzi_re_sunyi2.mp3', 'audio/skill/olhunzi1.mp3', @@ -3428,6 +3428,8 @@ window.noname_asset_list=[ 'audio/skill/oljianhe2.mp3', 'audio/skill/oljianman1.mp3', 'audio/skill/oljianman2.mp3', + 'audio/skill/oljianxuan1.mp3', + 'audio/skill/oljianxuan2.mp3', 'audio/skill/oljieming1.mp3', 'audio/skill/oljieming2.mp3', 'audio/skill/oljiezi1.mp3', @@ -3442,6 +3444,8 @@ window.noname_asset_list=[ 'audio/skill/olkangrui2.mp3', 'audio/skill/olkenshang1.mp3', 'audio/skill/olkenshang2.mp3', + 'audio/skill/ollangdao1.mp3', + 'audio/skill/ollangdao2.mp3', 'audio/skill/olleijie1.mp3', 'audio/skill/olleijie2.mp3', 'audio/skill/olluanji_shen_caopi1.mp3', @@ -3472,6 +3476,8 @@ window.noname_asset_list=[ 'audio/skill/olshilu2.mp3', 'audio/skill/olshuangxiong1.mp3', 'audio/skill/olshuangxiong2.mp3', + 'audio/skill/olsuji1.mp3', + 'audio/skill/olsuji2.mp3', 'audio/skill/olsujian1.mp3', 'audio/skill/olsujian2.mp3', 'audio/skill/oltianhou_club.mp3', @@ -3517,6 +3523,8 @@ window.noname_asset_list=[ 'audio/skill/olzhiba2.mp3', 'audio/skill/olzhiji1.mp3', 'audio/skill/olzhiji2.mp3', + 'audio/skill/olzhijian1.mp3', + 'audio/skill/olzhijian2.mp3', 'audio/skill/olzhubi1.mp3', 'audio/skill/olzhubi2.mp3', 'audio/skill/olzhuyan1.mp3', @@ -3620,8 +3628,6 @@ window.noname_asset_list=[ 'audio/skill/qibaodao2.mp3', 'audio/skill/qibie1.mp3', 'audio/skill/qibie2.mp3', - 'audio/skill/qice_backup1.mp3', - 'audio/skill/qice_backup2.mp3', 'audio/skill/qice1.mp3', 'audio/skill/qice2.mp3', 'audio/skill/qieting1.mp3', @@ -4019,6 +4025,8 @@ window.noname_asset_list=[ 'audio/skill/rexingsheng2.mp3', 'audio/skill/rexingxue1.mp3', 'audio/skill/rexingxue2.mp3', + 'audio/skill/rexinsheng1.mp3', + 'audio/skill/rexinsheng2.mp3', 'audio/skill/rexuanhuo1.mp3', 'audio/skill/rexuanhuo2.mp3', 'audio/skill/reyajiao1.mp3', @@ -4216,6 +4224,8 @@ window.noname_asset_list=[ 'audio/skill/sbrende3.mp3', 'audio/skill/sbshipo1.mp3', 'audio/skill/sbshipo2.mp3', + 'audio/skill/sbtianxiang1.mp3', + 'audio/skill/sbtianxiang2.mp3', 'audio/skill/sbtiaoxin1.mp3', 'audio/skill/sbtiaoxin2.mp3', 'audio/skill/sbtieji_false.mp3', @@ -4251,6 +4261,8 @@ window.noname_asset_list=[ 'audio/skill/sbzhangwu2.mp3', 'audio/skill/sbzhaxiang1.mp3', 'audio/skill/sbzhaxiang2.mp3', + 'audio/skill/sbzhenliang1.mp3', + 'audio/skill/sbzhenliang2.mp3', 'audio/skill/sbzhiba1.mp3', 'audio/skill/sbzhiba2.mp3', 'audio/skill/sbzhichi1.mp3', @@ -4384,6 +4396,8 @@ window.noname_asset_list=[ 'audio/skill/shiina_retieji1.mp3', 'audio/skill/shiki_omusubi1.mp3', 'audio/skill/shiki_omusubi2.mp3', + 'audio/skill/shiming1.mp3', + 'audio/skill/shiming2.mp3', 'audio/skill/shiorimiyuki_banyin1.mp3', 'audio/skill/shiorimiyuki_banyin2.mp3', 'audio/skill/shiorimiyuki_tingxian1.mp3', @@ -4720,6 +4734,8 @@ window.noname_asset_list=[ 'audio/skill/twchongqi2.mp3', 'audio/skill/twchuanshu1.mp3', 'audio/skill/twchuanshu2.mp3', + 'audio/skill/twchungang1.mp3', + 'audio/skill/twchungang2.mp3', 'audio/skill/twdanfa1.mp3', 'audio/skill/twdanfa2.mp3', 'audio/skill/twdianyi1.mp3', @@ -4788,6 +4804,8 @@ window.noname_asset_list=[ 'audio/skill/twlanjiang.mp3', 'audio/skill/twliexi1.mp3', 'audio/skill/twliexi2.mp3', + 'audio/skill/twlijian1.mp3', + 'audio/skill/twlijian2.mp3', 'audio/skill/twlingbao1.mp3', 'audio/skill/twlingbao2.mp3', 'audio/skill/twlingfa1.mp3', @@ -4813,11 +4831,15 @@ window.noname_asset_list=[ 'audio/skill/twqingtao2.mp3', 'audio/skill/twqiongji1.mp3', 'audio/skill/twqiongji2.mp3', + 'audio/skill/twquanqian1.mp3', + 'audio/skill/twquanqian2.mp3', 'audio/skill/twrenchou1.mp3', 'audio/skill/twrenchou2.mp3', 'audio/skill/twrende1.mp3', 'audio/skill/twrende2.mp3', 'audio/skill/twrende3.mp3', + 'audio/skill/twrouke1.mp3', + 'audio/skill/twrouke2.mp3', 'audio/skill/twruilian1.mp3', 'audio/skill/twruilian2.mp3', 'audio/skill/twshanghe1.mp3', @@ -4956,7 +4978,6 @@ window.noname_asset_list=[ 'audio/skill/weishu2.mp3', 'audio/skill/weiyi1.mp3', 'audio/skill/weiyi2.mp3', - 'audio/skill/weizhong.mp3', 'audio/skill/weizhong1.mp3', 'audio/skill/weizhong2.mp3', 'audio/skill/wendao1.mp3', @@ -5286,6 +5307,8 @@ window.noname_asset_list=[ 'audio/skill/xingzuo2.mp3', 'audio/skill/xinhuangtian2_re_zhangjiao1.mp3', 'audio/skill/xinhuangtian2_re_zhangjiao2.mp3', + 'audio/skill/xinjiangchi1.mp3', + 'audio/skill/xinjiangchi2.mp3', 'audio/skill/xinjianying1.mp3', 'audio/skill/xinjianying2.mp3', 'audio/skill/xinjiaojin1.mp3', @@ -5732,6 +5755,8 @@ window.noname_asset_list=[ 'audio/skill/zhengjing2.mp3', 'audio/skill/zhengnan1.mp3', 'audio/skill/zhengnan2.mp3', + 'audio/skill/zhenlie_re_wangyi1.mp3', + 'audio/skill/zhenlie_re_wangyi2.mp3', 'audio/skill/zhenlie1.mp3', 'audio/skill/zhenlie2.mp3', 'audio/skill/zhenshan1.mp3', @@ -6078,6 +6103,7 @@ window.noname_asset_list=[ 'image/card/group_wei.png', 'image/card/group_western.png', 'image/card/group_wu.png', + 'image/card/group_ye.png', 'image/card/guaguliaodu.png', 'image/card/guangshatianyi.png', 'image/card/guanshi.png', @@ -6197,6 +6223,12 @@ window.noname_asset_list=[ 'image/card/huoshan.png', 'image/card/huoshaolianying.png', 'image/card/huxinjing.png', + 'image/card/identity_enemy.jpg', + 'image/card/identity_fan.jpg', + 'image/card/identity_friend.jpg', + 'image/card/identity_nei.jpg', + 'image/card/identity_zhong.jpg', + 'image/card/identity_zhu.jpg', 'image/card/jiedao.png', 'image/card/jiejia.png', 'image/card/jiguanfeng.png', @@ -6413,6 +6445,7 @@ window.noname_asset_list=[ 'image/card/yihuajiemu.png', 'image/card/yinfengjia.png', 'image/card/yinfengyi.png', + 'image/card/ying.png', 'image/card/yinyueqiang.png', 'image/card/yitianjian.png', 'image/card/yiyi.png', @@ -6523,6 +6556,7 @@ window.noname_asset_list=[ 'image/character/clan_hanshao.jpg', 'image/character/clan_wanghun.jpg', 'image/character/clan_wangling.jpg', + 'image/character/clan_wanglun.jpg', 'image/character/clan_wangyun.jpg', 'image/character/clan_wuban.jpg', 'image/character/clan_wukuang.jpg', @@ -6531,6 +6565,7 @@ window.noname_asset_list=[ 'image/character/clan_xuncan.jpg', 'image/character/clan_xunchen.jpg', 'image/character/clan_xunshu.jpg', + 'image/character/clan_xunyou.jpg', 'image/character/clan_zhonghui.jpg', 'image/character/clan_zhongyan.jpg', 'image/character/clan_zhongyu.jpg', @@ -6552,6 +6587,7 @@ window.noname_asset_list=[ 'image/character/dc_ganfuren.jpg', 'image/character/dc_gaolan.jpg', 'image/character/dc_gongsunzan.jpg', + 'image/character/dc_guansuo.jpg', 'image/character/dc_huangchengyan.jpg', 'image/character/dc_huanghao.jpg', 'image/character/dc_huangquan.jpg', @@ -6590,6 +6626,7 @@ window.noname_asset_list=[ 'image/character/dc_yangbiao.jpg', 'image/character/dc_yanghu.jpg', 'image/character/dc_yuejiu.jpg', + 'image/character/dc_zhangmancheng.jpg', 'image/character/dc_zhaotongzhaoguang.jpg', 'image/character/dc_zhaoxiang.jpg', 'image/character/dc_zhaoyǎn.jpg', @@ -7044,25 +7081,38 @@ window.noname_asset_list=[ 'image/character/jsrg_chendeng.jpg', 'image/character/jsrg_chunyuqiong.jpg', 'image/character/jsrg_dongbai.jpg', + 'image/character/jsrg_fanjiangzhangda.jpg', 'image/character/jsrg_guanyu.jpg', + 'image/character/jsrg_guojia.jpg', + 'image/character/jsrg_hansui.jpg', 'image/character/jsrg_hejin.jpg', 'image/character/jsrg_huangfusong.jpg', + 'image/character/jsrg_huangzhong.jpg', 'image/character/jsrg_kongrong.jpg', 'image/character/jsrg_liubei.jpg', 'image/character/jsrg_liuhong.jpg', 'image/character/jsrg_liuyan.jpg', + 'image/character/jsrg_lougui.jpg', 'image/character/jsrg_lvbu.jpg', + 'image/character/jsrg_machao.jpg', 'image/character/jsrg_nanhualaoxian.jpg', + 'image/character/jsrg_pangtong.jpg', 'image/character/jsrg_qiaoxuan.jpg', 'image/character/jsrg_sunce.jpg', 'image/character/jsrg_sunjian.jpg', + 'image/character/jsrg_sunshangxiang.jpg', 'image/character/jsrg_wangyun.jpg', + 'image/character/jsrg_xiahouen.jpg', + 'image/character/jsrg_xiahourong.jpg', 'image/character/jsrg_xugong.jpg', 'image/character/jsrg_xushao.jpg', 'image/character/jsrg_xuyou.jpg', 'image/character/jsrg_yangbiao.jpg', + 'image/character/jsrg_zhangchu.jpg', + 'image/character/jsrg_zhangfei.jpg', 'image/character/jsrg_zhanghe.jpg', 'image/character/jsrg_zhangliao.jpg', + 'image/character/jsrg_zhangren.jpg', 'image/character/jsrg_zhenji.jpg', 'image/character/jsrg_zhujun.jpg', 'image/character/jsrg_zoushi.jpg', @@ -7168,6 +7218,7 @@ window.noname_asset_list=[ 'image/character/kongrong.jpg', 'image/character/kuailiangkuaiyue.jpg', 'image/character/laiyinger.jpg', + 'image/character/le_shen_jiaxu.jpg', 'image/character/leibo.jpg', 'image/character/leitong.jpg', 'image/character/liangxing.jpg', @@ -7215,11 +7266,11 @@ window.noname_asset_list=[ 'image/character/luotong.jpg', 'image/character/luoxian.jpg', 'image/character/lushi.jpg', - 'image/character/lusu.jpg', 'image/character/luxun.jpg', 'image/character/luyi.jpg', 'image/character/luyusheng.jpg', 'image/character/luzhi.jpg', + 'image/character/lvboshe.jpg', 'image/character/lvbu.jpg', 'image/character/lvdai.jpg', 'image/character/lvfan.jpg', @@ -7243,6 +7294,7 @@ window.noname_asset_list=[ 'image/character/mayuanyi.jpg', 'image/character/mayunlu.jpg', 'image/character/mazhong.jpg', + 'image/character/mb_sunluyu.jpg', 'image/character/mengda.jpg', 'image/character/menghuo.jpg', 'image/character/mengjie.jpg', @@ -7294,6 +7346,7 @@ window.noname_asset_list=[ 'image/character/ns_lvmeng.jpg', 'image/character/ns_lvzhi.jpg', 'image/character/ns_masu.jpg', + 'image/character/ns_mengyou.jpg', 'image/character/ns_nanhua.jpg', 'image/character/ns_nanhua_left.jpg', 'image/character/ns_nanhua_right.jpg', @@ -7330,26 +7383,26 @@ window.noname_asset_list=[ 'image/character/ol_dengai.jpg', 'image/character/ol_dengzhi.jpg', 'image/character/ol_dianwei.jpg', + 'image/character/ol_dingshangwan.jpg', 'image/character/ol_dingyuan.jpg', 'image/character/ol_dongzhao.jpg', 'image/character/ol_dongzhuo.jpg', 'image/character/ol_furong.jpg', - 'image/character/ol_guansuo.jpg', 'image/character/ol_guohuai.jpg', 'image/character/ol_huangzhong.jpg', 'image/character/ol_huaxin.jpg', 'image/character/ol_huaxiong.jpg', 'image/character/ol_huban.jpg', 'image/character/ol_jiangwei.jpg', - 'image/character/ol_liaohua.jpg', + 'image/character/ol_lingtong.jpg', 'image/character/ol_lisu.jpg', 'image/character/ol_liuba.jpg', 'image/character/ol_liushan.jpg', 'image/character/ol_liuyu.jpg', + 'image/character/ol_liwan.jpg', 'image/character/ol_lusu.jpg', 'image/character/ol_luyusheng.jpg', 'image/character/ol_maliang.jpg', - 'image/character/ol_manchong.jpg', 'image/character/ol_mengda.jpg', 'image/character/ol_pangde.jpg', 'image/character/ol_pangtong.jpg', @@ -7362,7 +7415,6 @@ window.noname_asset_list=[ 'image/character/ol_wangrong.jpg', 'image/character/ol_weiyan.jpg', 'image/character/ol_wenqin.jpg', - 'image/character/ol_wuyi.jpg', 'image/character/ol_xiahouyuan.jpg', 'image/character/ol_xiaoqiao.jpg', 'image/character/ol_xinxianying.jpg', @@ -7381,7 +7433,6 @@ window.noname_asset_list=[ 'image/character/ol_zhouqun.jpg', 'image/character/ol_zhujun.jpg', 'image/character/ol_zhuling.jpg', - 'image/character/ol_zhuran.jpg', 'image/character/ol_zhurong.jpg', 'image/character/old_bulianshi.jpg', 'image/character/old_caocao.jpg', @@ -7397,6 +7448,8 @@ window.noname_asset_list=[ 'image/character/old_fuhuanghou.jpg', 'image/character/old_gaoshun.jpg', 'image/character/old_guanqiujian.jpg', + 'image/character/old_guanyinping.jpg', + 'image/character/old_guanyu.jpg', 'image/character/old_guanzhang.jpg', 'image/character/old_handang.jpg', 'image/character/old_huangfusong.jpg', @@ -7407,7 +7460,6 @@ window.noname_asset_list=[ 'image/character/old_lingju.jpg', 'image/character/old_lingtong.jpg', 'image/character/old_liubiao.jpg', - 'image/character/old_liushan.jpg', 'image/character/old_liuzan.jpg', 'image/character/old_liyan.jpg', 'image/character/old_machao.jpg', @@ -7416,6 +7468,8 @@ window.noname_asset_list=[ 'image/character/old_maliang.jpg', 'image/character/old_quancong.jpg', 'image/character/old_re_lidian.jpg', + 'image/character/old_shen_zhaoyun.jpg', + 'image/character/old_shixie.jpg', 'image/character/old_wanglang.jpg', 'image/character/old_wangyi.jpg', 'image/character/old_wangyun.jpg', @@ -7423,7 +7477,6 @@ window.noname_asset_list=[ 'image/character/old_xusheng.jpg', 'image/character/old_yangyan.jpg', 'image/character/old_yangzhi.jpg', - 'image/character/old_yuanshao.jpg', 'image/character/old_yuanshu.jpg', 'image/character/old_zhangfei.jpg', 'image/character/old_zhangxingcai.jpg', @@ -7874,6 +7927,7 @@ window.noname_asset_list=[ 'image/character/sp_zhugeliang.jpg', 'image/character/sp_zhujun.jpg', 'image/character/sp_zongyu.jpg', + 'image/character/star_caoren.jpg', 'image/character/std_panfeng.jpg', 'image/character/sunce.jpg', 'image/character/sunchen.jpg', @@ -8260,7 +8314,6 @@ window.noname_asset_list=[ 'image/character/yongjian_ganning.jpg', 'image/character/yuanhuan.jpg', 'image/character/yuanji.jpg', - 'image/character/yuanshao.jpg', 'image/character/yuanshu.jpg', 'image/character/yuantanyuanshang.jpg', 'image/character/yuantanyuanxiyuanshang.jpg', @@ -8351,6 +8404,7 @@ window.noname_asset_list=[ 'image/character/zhangxiu.jpg', 'image/character/zhangxuan.jpg', 'image/character/zhangxun.jpg', + 'image/character/zhangyan.jpg', 'image/character/zhangyao.jpg', 'image/character/zhangyi.jpg', 'image/character/zhangyì.jpg', diff --git a/game/config.js b/game/config.js index d33b563fc..62c0c8735 100644 --- a/game/config.js +++ b/game/config.js @@ -169,6 +169,8 @@ window.config={ ['zhu','zhong','nei','fan','fan','fan'], ['zhu','zhong','zhong','nei','fan','fan','fan'], ['zhu','zhong','zhong','nei','fan','fan','fan','fan'], + ['zhu','zhong','zhong','zhong','nei','fan','fan','fan','fan'], + ['zhu','zhong','zhong','zhong','nei','nei','fan','fan','fan','fan'], ], choice:{ zhu:3, diff --git a/game/game.js b/game/game.js index 583cc86ae..7fc6f30da 100644 --- a/game/game.js +++ b/game/game.js @@ -1,12 +1,19 @@ "use strict"; { + /** + * @typedef {InstanceType} Player + * @typedef {InstanceType} Card + * @typedef {InstanceType} VCard + * @typedef {InstanceType} GameEvent + * @typedef {InstanceType} NodeWS + */ + const userAgent=navigator.userAgent.toLowerCase(); if(!localStorage.getItem('gplv3_noname_alerted')){ if(confirm('①无名杀是一款基于GPLv3协议的开源软件!\n你可以在遵守GPLv3协议的基础上任意使用,修改并转发《无名杀》,以及所有基于《无名杀》开发的拓展。\n点击“确定”即代表您认可并接受GPLv3协议↓️\nhttps://www.gnu.org/licenses/gpl-3.0.html\n②无名杀官方发布地址仅有GitHub仓库!\n其他所有的所谓“无名杀”社群(包括但不限于绝大多数“官方”QQ群、QQ频道等)均为玩家自发组织,与无名杀官方无关!')){ localStorage.setItem('gplv3_noname_alerted',true); } else{ - const ua=navigator.userAgent.toLowerCase(); - const ios=ua.includes('iphone')||ua.includes('ipad')||ua.includes('macintosh'); + const ios=userAgent.includes('iphone')||userAgent.includes('ipad')||userAgent.includes('macintosh'); //electron if(typeof window.process=='object'&&typeof window.require=='function'){ const versions=window.process.versions; @@ -77,11 +84,10 @@ over:false, clicked:false, auto:false, - event:{ - finished:true, - next:[], - after:[] - }, + /** + * @type {GameEvent} + */ + event:null, ai:{}, lastdragchange:[], skillaudio:[], @@ -117,6 +123,7 @@ mirrorURL:'https://raw.fgit.cf/libccy/noname', hallURL:'47.99.105.222', assetURL:typeof nonameInitialized!='string'||nonameInitialized=='nodejs'?'':nonameInitialized, + userAgent:userAgent, compatibleEdition:Boolean(typeof nonameInitialized=='string'&&nonameInitialized.match(/\/(?:com\.widget|yuri\.nakamura)\.noname\//)), changeLog:[], updates:[], @@ -282,6 +289,17 @@ if(lineColor.length) lib.lineColor.set(nature,lineColor); lib.nature.set(nature,order); if(background.length>0) lib.natureBg.set(nature,background); + if(config.audio){ + for(let key in config.audio){ + if(!lib.natureAudio[key]){ + lib.natureAudio[key] = config.audio[key]; + }else{ + for(let key2 in config.audio[key]){ + lib.natureAudio[key][key2] = config.audio[key][key2]; + } + } + } + } let color1,color2; if (typeof config.color=="string"&&/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/.test(config.color)){ @@ -414,8 +432,11 @@ }, } }, - //Yingbian - //应变 + /** + * Yingbian + * + * 应变 + */ yingbian:{ condition:{ color:new Map([ @@ -587,8 +608,101 @@ ['all','无视条件执行所有选项'] ]) }, - //The actual card name - //实际的卡牌名称 + /** + * Stratagem buff + * + * 谋攻强化 + */ + stratagemBuff:{ + cost:new Map([ + ['sha',1], + ['shan',1], + ['juedou',2], + ['huogong',2], + ['tao',3] + ]), + effect:new Map([ + ['sha',(event,option)=>{ + if(event.step!=0||option.state!='end') return; + game.log(event.player,'触发了强化效果'); + game.log(event.card,'抵消所需要的',new lib.element.VCard({ + name:'shan' + }),'数+1'); + const map=event.customArgs; + game.players.concat(game.dead).forEach(current=>{ + const id=current.playerid; + if(!map[id]) map[id]={}; + if(typeof map[id].shanRequired=='number') map[id].shanRequired++; + else map[id].shanRequired=2; + }); + }], + ['shan',(event,option)=>{ + if(event.step!=0||option.state!='end') return; + game.log(event.player,'触发了强化效果'); + game.log('使用',event.card,'时视为两张',new lib.element.VCard({ + name:'shan' + }),'的效果'); + event.player.when('useCard').filter(evt=>evt==event).then(()=>{ + trigger.getParent(2).decrease('shanRequired',1); + }); + }], + ['juedou',(event,option)=>{ + if(event.step!=0||option.state!='end') return; + game.log(event.player,'触发了强化效果'); + game.log('对',event.card,'的目标造成伤害时,伤害+1'); + event.player.when({ + source:'damageBegin1' + }).filter(evt=>evt.getParent(2)==event&&event.targets.includes(evt.player)).then(()=>{ + trigger.increase('num'); + }); + }], + ['huogong',(event,option)=>{ + if(event.step!=0||option.state!='end') return; + game.log(event.player,'触发了强化效果'); + game.log(event.card,'造成的伤害+1'); + event.increase('baseDamage',1); + }], + ['tao',(event,option)=>{ + if(event.step!=0||option.state!='end') return; + game.log(event.player,'触发了强化效果'); + game.log(event.card,'回复的体力+1'); + event.increase('baseDamage',1); + }] + ]), + prompt:new Map([ + [ + 'sha', + /** + * @type {() => string} + */ + ()=>`抵消所需要的【${get.translation('shan')}】数+1。` + ], + [ + 'shan', + /** + * @type {() => string} + */ + ()=>`使用时视为两张【${get.translation('shan')}】的效果。` + ], + [ + 'juedou', + ()=>'对此牌的目标造成伤害时,伤害+1。' + ], + [ + 'huogong', + ()=>'造成的伤害+1。' + ], + [ + 'tao', + ()=>'回复的体力+1。' + ] + ]) + }, + /** + * The actual card name + * + * 实际的卡牌名称 + */ actualCardName:new Map([ ['挟令','挟天子以令诸侯'], ['霹雳投石车','霹雳车'] @@ -621,6 +735,12 @@ general:{ name:'通用', config:{ + mount_combine:{ + name:'合并坐骑栏', + init:false, + intro:'
  • 将进攻坐骑栏和防御坐骑栏合并为同一个位置(重启后生效)。', + restart:true, + }, low_performance:{ name:'流畅模式', init:false, @@ -4851,6 +4971,12 @@ name:'身份', connect:{ update:function(config,map){ + if(config.connect_identity_mode=='stratagem'){ + map.connect_round_one_use_fury.show(); + } + else{ + map.connect_round_one_use_fury.hide(); + } if(config.connect_identity_mode=='zhong'){ map.connect_player_number.hide(); map.connect_limit_zhu.hide(); @@ -4860,6 +4986,15 @@ map.connect_special_identity.hide(); map.connect_double_character.show(); } + else if(config.connect_identity_mode=='stratagem'){ + map.connect_double_character.show(); + map.connect_player_number.show(); + map.connect_limit_zhu.hide(); + map.connect_enhance_zhu.hide(); + map.connect_double_nei.hide(); + map.connect_zhong_card.hide(); + map.connect_special_identity.hide(); + } else if(config.connect_identity_mode=='purple'){ map.connect_player_number.hide(); map.connect_limit_zhu.hide(); @@ -4896,6 +5031,7 @@ item:{ normal:'标准', zhong:'明忠', + stratagem:'谋攻', purple:'3v3v2', }, restart:true, @@ -4905,14 +5041,8 @@ connect_player_number:{ name:'游戏人数', init:'8', - item:{ - '2':'两人', - '3':'三人', - '4':'四人', - '5':'五人', - '6':'六人', - '7':'七人', - '8':'八人' + get item(){ + return lib.mode.identity.config.player_number.item; }, frequent:true, restart:true, @@ -4940,7 +5070,9 @@ init:false, restart:true, // frequent:true, - intro:'开启后游戏中将有两个内奸(内奸胜利条件仍为主内1v1时击杀主公)' + get intro(){ + return lib.mode.identity.config.double_nei.intro; + } }, connect_double_character:{ name:'双将模式', @@ -4961,6 +5093,13 @@ frequent:true, intro:'开启后游戏中将增加军师、大将、贼首三个身份' }, + connect_round_one_use_fury:{ + name:'开启首轮强化卡牌', + init:false, + frequent:false, + restart:true, + intro:'谋攻篇规则为第二轮开始才可使用怒气强化卡牌,开启此选项从游戏开始即可强化卡牌。' + }, // connect_ban_weak:{ // name:'屏蔽弱将', // init:true, @@ -4980,6 +5119,14 @@ }, config:{ update:function(config,map){ + if(config.identity_mode=='stratagem'){ + map.round_one_use_fury.show(); + map.nei_auto_mark_camouflage.show(); + } + else{ + map.round_one_use_fury.hide(); + map.nei_auto_mark_camouflage.hide(); + } if(config.identity_mode=='zhong'){ map.player_number.hide(); map.enhance_zhu.hide(); @@ -5009,6 +5156,50 @@ } map.continue_game.show(); } + else if(config.identity_mode=='stratagem'){ + map.continue_game.show(); + map.player_number.show(); + map.enhance_zhu.hide(); + map.auto_identity.hide(); + if(config.player_number!='2'){ + map.double_nei.show(); + } + else{ + map.double_nei.hide(); + } + map.choice_zhu.show(); + map.limit_zhu.hide(); + map.choice_zhong.show(); + map.choice_nei.show(); + map.choice_fan.show(); + map.ban_identity.show(); + if(config.ban_identity=='off'){ + map.ban_identity2.hide(); + } + else{ + map.ban_identity2.show(); + } + if(config.ban_identity=='off'||config.ban_identity2=='off'){ + map.ban_identity3.hide(); + } + else{ + map.ban_identity3.show(); + } + map.zhong_card.hide(); + map.choose_group.show(); + map.auto_mark_identity.hide(); + map.change_choice.show(); + map.free_choose.show(); + map.change_identity.show(); + map.special_identity.hide(); + map.double_character.show(); + if(config.double_character){ + map.double_hp.show(); + } + else{ + map.double_hp.hide(); + } + } else if(config.identity_mode=='purple'){ map.player_number.hide(); map.enhance_zhu.hide(); @@ -5089,23 +5280,22 @@ item:{ normal:'标准', zhong:'明忠', + stratagem:'谋攻', purple:'3v3v2', }, restart:true, frequent:true, - intro:'明忠模式详见帮助' + intro:'明忠模式与谋攻模式详见帮助' }, player_number:{ name:'游戏人数', init:'8', - item:{ - '2':'两人', - '3':'三人', - '4':'四人', - '5':'五人', - '6':'六人', - '7':'七人', - '8':'八人' + get item(){ + const minimumNumberOfPlayers=2,maximumNumberOfPlayers=Math.max(_status.maximumNumberOfPlayers||10,minimumNumberOfPlayers),item={}; + for(let playerNumber=minimumNumberOfPlayers;playerNumber<=maximumNumberOfPlayers;playerNumber++){ + item[playerNumber]=`${get.cnNumber(playerNumber)}人`; + } + return item; }, frequent:true, restart:true, @@ -5115,7 +5305,7 @@ init:false, restart:true, frequent:true, - intro:'开启后游戏中将有两个内奸(内奸胜利条件仍为主内1v1时击杀主公)' + intro:'若游戏人数不大于8,则开启后游戏中将有两个内奸(内奸胜利条件仍为主内1v1时击杀主公)' }, choose_group:{ name:'神武将选择势力', @@ -5261,6 +5451,19 @@ unlimited:'无限', }, }, + round_one_use_fury:{ + name:'开启首轮强化卡牌', + init:false, + frequent:false, + restart:true, + intro:'谋攻篇规则为第二轮开始才可使用怒气强化卡牌,开启此选项从游戏开始即可强化卡牌。' + }, + nei_auto_mark_camouflage:{ + name:'内奸自动标记伪装反贼', + intro:'玩家内奸在游戏开始洞察结束后,自动将被洞察角色标记为反贼。', + init:false, + unfrequent:true, + }, continue_game:{ name:'显示再战', init:false, @@ -5449,17 +5652,22 @@ connect_player_number:{ name:'游戏人数', init:'8', - item:{ - '3':'三人', - '4':'四人', - '5':'五人', - '6':'六人', - '7':'七人', - '8':'八人' + get item(){ + return lib.mode.guozhan.config.player_number.item; }, frequent:true, restart:true, }, + connect_aozhan:{ + name:'鏖战模式', + init:true, + intro:'若开启此选项,则将在游戏中引入“鏖战模式”的规则:
    当游戏中仅剩四名或更少角色时(七人以下游戏时改为三名或更少),若此时全场没有超过一名势力相同的角色,则从一个新的回合开始,游戏进入鏖战模式直至游戏结束。
    ◇在鏖战模式下,【桃】只能当做【杀】或【闪】使用或打出,不能用来回复体力。
    注:进入鏖战模式后,即使之后有两名或者更多势力相同的角色出现,仍然不会取消鏖战模式。', + frequent:true, + restart:true, + }, + get connect_separatism(){ + return lib.mode.guozhan.config.separatism; + }, connect_initshow_draw:{ name:'首亮奖励', item:{ @@ -5471,13 +5679,6 @@ frequent:true, intro:'第一个明置武将牌的角色可获得首亮奖励' }, - connect_aozhan:{ - name:'鏖战模式', - init:true, - intro:'若开启此选项,则将在游戏中引入“鏖战模式”的规则:
    当游戏中仅剩四名或更少角色时(七人以下游戏时改为三名或更少),若此时全场没有超过一名势力相同的角色,则从一个新的回合开始,游戏进入鏖战模式直至游戏结束。
    ◇在鏖战模式下,【桃】只能当做【杀】或【闪】使用或打出,不能用来回复体力。
    注:进入鏖战模式后,即使之后有两名或者更多势力相同的角色出现,仍然不会取消鏖战模式。', - frequent:true, - restart:true, - }, connect_viewnext:{ name:'观看下家副将', init:false, @@ -5540,17 +5741,30 @@ player_number:{ name:'游戏人数', init:'8', - item:{ - '3':'三人', - '4':'四人', - '5':'五人', - '6':'六人', - '7':'七人', - '8':'八人' + get item(){ + const minimumNumberOfPlayers=2,maximumNumberOfPlayers=Math.max(_status.maximumNumberOfPlayers||12,minimumNumberOfPlayers),item={}; + for(let playerNumber=minimumNumberOfPlayers;playerNumber<=maximumNumberOfPlayers;playerNumber++){ + item[playerNumber]=`${get.cnNumber(playerNumber)}人`; + } + return item; }, frequent:true, restart:true, }, + aozhan:{ + name:'鏖战模式', + init:true, + frequent:true, + restart:true, + intro:'若开启此选项,则将在游戏中引入“鏖战模式”的规则:
    当游戏中仅剩四名或更少角色时(七人以下游戏时改为三名或更少),若此时全场没有超过一名势力相同的角色,则从一个新的回合开始,游戏进入鏖战模式直至游戏结束。
    ◇在鏖战模式下,【桃】只能当做【杀】或【闪】使用或打出,不能用来回复体力。
    注:进入鏖战模式后,即使之后有两名或者更多势力相同的角色出现,仍然不会取消鏖战模式。', + }, + separatism:{ + name:'群雄割据', + init:false, + frequent:true, + restart:true, + intro:'开放不同势力组合,以优先亮出的武将牌作为自己的势力,双势力武将则使用列表的第一个势力' + }, initshow_draw:{ name:'首亮奖励', item:{ @@ -5562,13 +5776,6 @@ frequent:true, intro:'第一个明置身份牌的角色可获得摸牌奖励' }, - aozhan:{ - name:'鏖战模式', - init:true, - frequent:true, - restart:true, - intro:'若开启此选项,则将在游戏中引入“鏖战模式”的规则:
    当游戏中仅剩四名或更少角色时(七人以下游戏时改为三名或更少),若此时全场没有超过一名势力相同的角色,则从一个新的回合开始,游戏进入鏖战模式直至游戏结束。
    ◇在鏖战模式下,【桃】只能当做【杀】或【闪】使用或打出,不能用来回复体力。
    注:进入鏖战模式后,即使之后有两名或者更多势力相同的角色出现,仍然不会取消鏖战模式。', - }, viewnext:{ name:'观看下家副将', init:false, @@ -7130,11 +7337,6 @@ init:true, frequent:true }, - qunxionggeju:{ - name:'群雄割据', - init:true, - frequent:true - }, duzhansanguo:{ name:'毒战三国', init:true, @@ -7364,7 +7566,7 @@ '
  • 角色资料
    lib.character
  • 卡牌资料
    lib.card
', '游戏名词':'
  • 智囊:无名杀默认为过河拆桥/无懈可击/无中生有/洞烛先机。牌堆中没有的智囊牌会被过滤。可在卡牌设置中自行增减。若没有可用的智囊,则改为随机选取的三种锦囊牌的牌名。'+ '
  • 仁库:部分武将使用的游戏外共通区域。至多包含六张牌。当有新牌注入后,若牌数超过上限,则将最早进入仁库的溢出牌置入弃牌堆。'+ - '
  • 护甲:和体力类似,每点护甲可抵挡一点伤害,但不影响手牌上限。'+ + '
  • 护甲:和体力类似,每点护甲可抵挡1点伤害,但不影响手牌上限。'+ '
  • 随从:通过技能获得,拥有独立的技能、手牌区和装备区(共享判定区),出场时替代主武将的位置;随从死亡时自动切换回主武将。'+ '
  • 发现:从三张随机亮出的牌中选择一张,若无特殊说明,则获得此牌。'+ '
  • 蓄能技:发动时可以增大黄色的数字。若如此做,红色数字于技能的结算过程中改为原来的两倍。'+ @@ -7378,6 +7580,9 @@ '
  • 激昂:一名角色发动“昂扬技”标签技能后,此技能失效,直至从此刻至满足此技能“激昂”条件后。'+ '' }, + /** + * @type {import('path')} + */ path:{}, getErrorTip:msg=>{ if(typeof msg!='string'){ @@ -7446,8 +7651,6 @@ }else if(newMessage.includes("has already been declared")){ messageName=newMessage.replace('SyntaxError: Identifier ', '').replace(' has already been declared', ''); newMessage=messageName +"变量已经被声明过,不能被重新声明"; - }else if(newMessage.includes("Invalid or unexpected token")){ - newMessage="查询无效或意外的标记,可能是字符串的引号不成对,错误使用了转义序列,字符串在多行中解析异常"; }else if(newMessage.includes("Duplicate parameter name not allowed in this context")) { newMessage="参数名不允许重复"; }else if(newMessage.includes("Unexpected reserved word")||newMessage.includes( @@ -7837,7 +8040,7 @@ setScroll:function(node){ node.ontouchstart=ui.click.touchStart; node.ontouchmove=ui.click.touchScroll; - node.style.WebkitOverflowScrolling='touch'; + node.style.webkitOverflowScrolling='touch'; return node; }, setMousewheel:function(node){ @@ -8127,9 +8330,7 @@ lib.ui=ui; lib.ai=ai; lib.game=game; - for(let i in lib.element.event){ - _status.event[i]=lib.element.event[i]; - } + _status.event=lib.element.GameEvent.initialGameEvent(); HTMLDivElement.prototype.animate=function(name,time){ var that; @@ -8194,7 +8395,7 @@ var that=this; this.timeout=setTimeout(function(){ - if(!that.destroyed){ + if(!that._selfDestroyed){ position.appendChild(that); } that.classList.remove('removing'); @@ -8417,7 +8618,7 @@ } }); /*Map prototype end*/ - Object.defineProperty(Array.prototype, "filterInD", { + Object.defineProperty(Array.prototype,"filterInD",{ configurable:true, enumerable:false, writable:true, @@ -8426,7 +8627,7 @@ return this.filter(card=>pos.includes(get.position(card,true))); } }); - Object.defineProperty(Array.prototype, "someInD", { + Object.defineProperty(Array.prototype,"someInD",{ configurable:true, enumerable:false, writable:true, @@ -8435,132 +8636,161 @@ return this.some(card=>pos.includes(get.position(card,true))); } }); + Object.defineProperty(Array.prototype,"everyInD",{ + configurable:true, + enumerable:false, + writable:true, + value:function(pos){ + if(typeof pos!='string') pos='o'; + return this.every(card=>pos.includes(get.position(card,true))); + } + }); /** - * @legacy Use `Array.prototype.includes(searchElement)` instead. + *@legacy Use {@link Array#includes} instead. */ - Object.defineProperty(Array.prototype, "contains", { + Object.defineProperty(Array.prototype,"contains",{ configurable:true, enumerable:false, writable:true, value:Array.prototype.includes }); - Object.defineProperty(Array.prototype, "add", { + Object.defineProperty(Array.prototype,"containsSome",{ configurable:true, enumerable:false, writable:true, value:function(){ - for(var i=0;ithis.includes(i)); } }); - Object.defineProperty(Array.prototype, "addArray", { - configurable:true, - enumerable:false, - writable:true, - value:function(arr){ - for(var i=0;ithis.includes(i)); + } + }); + + Object.defineProperty(Array.prototype,"add",{ + configurable:true, + enumerable:false, + writable:true, + value:function(){ + for(const arg of arguments){ + if(this.contains(arg)) continue; + this.push(arg); + } + return this; + } + }); + Object.defineProperty(Array.prototype,"addArray",{ + configurable:true, + enumerable:false, + writable:true, + value:function(){ + for(const arr of arguments){ + for(const item of arr) this.add(item); + } + return this; + } + }); + Object.defineProperty(Array.prototype,"remove",{ + configurable:true, + enumerable:false, + writable:true, + value:function(){ + for(const item of arguments){ + const pos=this.indexOf(item); + if(pos==-1) continue; + this.splice(pos,1); + } + return this; + } + }); + Object.defineProperty(Array.prototype,"removeArray",{ + configurable:true, + enumerable:false, + writable:true, + value:function(){ + for(const i of Array.from(arguments)) this.remove(...i); + return this; + } + }); + Object.defineProperty(Array.prototype,"unique",{ + configurable:true, + enumerable:false, + writable:true, + value:function(){ + let uniqueArray=[...new Set(this)]; + this.length=uniqueArray.length; + for(let i=0;ithis.length){ - num=this.length; - } - var arr=this.slice(0); - var list=[]; - for(var i=0;ithis.length) num=this.length; + let arr=this.slice(0); + let list=[]; + for(let i=0;i0; - if(nature=='linked') return natures.some(n=>lib.linked.includes(n)); - return get.is.sameNature(natures,nature); + value:function(sortBy,filter){ + let list=this.filter(filter||(()=>true)); + if(sortBy&&typeof sortBy=='function') list.sort((a,b)=>sortBy(a)-sortBy(b)); + else list.sort(); + return list[list.length-1]; + } + }); + Object.defineProperty(Array.prototype,"minBy",{ + configurable:true, + enumerable:false, + writable:true, + value:function(sortBy,filter){ + let list=this.filter(filter||(()=>true)); + if(sortBy&&typeof sortBy=='function') list.sort((a,b)=>sortBy(a)-sortBy(b)); + else list.sort(); + return list[0]; } }); window.onkeydown=function(e){ @@ -8810,7 +9052,7 @@ } var noname_inited=localStorage.getItem('noname_inited'); if(noname_inited&&noname_inited!=='nodejs'){ - var ua=navigator.userAgent.toLowerCase(); + var ua=userAgent; if(ua.includes('android')){ lib.device='android'; } @@ -8819,7 +9061,7 @@ } } - if(lib.assetURL.includes('com.widget.noname.qingyao')){ + if(lib.assetURL.includes('com.widget.noname.qingyao')||lib.assetURL.includes('online.nonamekill.android')){ alert('您正在一个不受信任的闭源客户端上运行《无名杀》。建议您更换为其他开源的无名杀客户端,避免给您带来不必要的损失。'); } @@ -8976,7 +9218,7 @@ appearenceConfig.global_font.item.default='默认'; } - var ua=navigator.userAgent.toLowerCase(); + var ua=userAgent; if('ontouchstart' in document){ if(!lib.config.totouched){ game.saveConfig('totouched',true); @@ -9185,7 +9427,6 @@ delete _status.htmlbg; window.game=game; - game.dynamicStyle.init(); lib.announce.init(); // node:path library alternative if (typeof module!="object"||typeof module.exports!="object") lib.init.js(`${lib.assetURL}game`,"path",()=>{ @@ -10455,7 +10696,8 @@ game.addSkill(j,lib.extensions[i][4].skill.skill[j], lib.extensions[i][4].skill.translate[j], lib.extensions[i][4].skill.translate[j+'_info'], - lib.extensions[i][4].skill.translate[j+'_append']); + lib.extensions[i][4].skill.translate[j+'_append'], + lib.extensions[i][4].skill.translate[j+'_ab']); } } } @@ -10658,15 +10900,8 @@ } }, connection:function(ws){ - var client={ - ws:ws, - id:ws.wsid||get.id(), - closed:false - }; + const client=new lib.element.Client(ws); lib.node.clients.push(client); - for(var i in lib.element.client){ - client[i]=lib.element.client[i]; - } if(window.isNonameServer){ document.querySelector('#server_count').innerHTML=lib.node.clients.length; } @@ -10784,7 +11019,7 @@ return; } if(Array.isArray(file)){ - return file.forEach(value=>lib.init.js(path,value,onLoad,onError)); + return file.forEach(value=>lib.init.jsSync(path,value,onLoad,onError)); } let scriptSource; if(!file) scriptSource=path; @@ -10932,11 +11167,15 @@ } }, layout:function(layout,nosave){ + const loadingScreen=ui.create.div('.loading-screen',document.body),loadingScreenStyle=loadingScreen.style; + loadingScreenStyle.animationDuration='1s'; + loadingScreenStyle.animationFillMode='forwards'; + loadingScreenStyle.animationName='opacity-0-1'; if(layout=='default') layout='mobile'; if(!nosave) game.saveConfig('layout',layout); game.layout=layout; ui.arena.hide(); - setTimeout(function(){ + new Promise(resolve=>setTimeout(resolve,500)).then(()=>{ if(game.layout=='default'){ ui.css.layout.href=''; } @@ -11031,17 +11270,20 @@ } ui.updatej(); ui.updatem(); - setTimeout(function(){ - ui.arena.show(); - if(game.me) game.me.update(); - setTimeout(function(){ - ui.updatex(); - },500); - setTimeout(function(){ - ui.updatec(); - },1000); - },100); - },500); + return new Promise(resolve=>setTimeout(resolve,100)); + }).then(()=>{ + ui.arena.show(); + if(game.me) game.me.update(); + return new Promise(resolve=>setTimeout(resolve,500)); + }).then(()=>{ + ui.updatex(); + ui.updatePlayerPositions(); + return new Promise(resolve=>setTimeout(resolve,500)); + }).then(()=>{ + ui.updatec(); + loadingScreenStyle.animationName='opacity-1-0'; + loadingScreen.addEventListener('animationend',animationEvent=>animationEvent.target.remove()); + }); }, background:function(){ if(lib.config.image_background_random){ @@ -11065,44 +11307,65 @@ }, parsex:function(item){ //by 诗笺、Tipx-L + /** + * @param {Function} func + */ function Legacy(func){ //Remove all comments //移除所有注释 - var str=func.toString().replace(/((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/))|(?=\r?\n))))+)|("(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|(?:\r?\n|[\s\S])[^\/"'\\\s]*)/mg,'$2').trim(); + let str=func.toString().replace(/((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/))|(?=\r?\n))))+)|("(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|(?:\r?\n|[\s\S])[^\/"'\\\s]*)/mg,'$2').trim(); //获取第一个 { 后的所有字符 str=str.slice(str.indexOf('{')+1); + //判断代码中是否有debugger + let regex=/event\.debugger\(\)/; + let hasDebugger=false; + let insertDebugger=`yield code=>eval(code);`; + let debuggerSkip=0; + let debuggerResult; + while((debuggerResult=str.slice(debuggerSkip).match(regex))!=null){ + let debuggerCopy=str; + debuggerCopy=debuggerCopy.slice(0,debuggerSkip+debuggerResult.index)+insertDebugger+debuggerCopy.slice(debuggerSkip+debuggerResult.index+debuggerResult[0].length,-1); + //测试是否有错误 + try { + new GeneratorFunction(debuggerCopy); + str=debuggerCopy+'}'; + debuggerSkip+=debuggerResult.index+insertDebugger.length; + hasDebugger=true; + }catch(error){ + debuggerSkip+=debuggerResult.index+debuggerResult[0].length; + } + } //func中要写步骤的话,必须要写step 0 if(str.indexOf('step 0')==-1){ str='{if(event.step==1) {event.finish();return;}\n'+str; }else{ - var skip=0; - //每层最多找99个step - for (var k=0;k<99;k++) { - //正则表达式 - var reg=new RegExp(`['"]step ${k}['"]`); - var result=str.slice(skip).match(reg); - if(result==null) break; - var insertStr; + let skip=0; + let k=0; + let result; + //去除99个step的限制 + while((result=str.slice(skip).match(new RegExp(`['"]step ${k}['"]`)))!=null){ + let insertStr; if(k==0){ insertStr=`switch(step){case 0:`; }else{ insertStr=`break;case ${k}:`; } - var copy=str; + let copy=str; copy=copy.slice(0,skip+result.index)+insertStr+copy.slice(skip+result.index+result[0].length); //测试是否有错误 try{ - new Function(copy); + new (hasDebugger?GeneratorFunction:Function)(copy); str=copy; skip+=result.index+insertStr.length; }catch(error){ k--; skip+=result.index+result[0].length; } + k++; } str=`if(event.step==${k}){event.finish();return;}`+str; } - return (new Function('event','step','source','player','target','targets', + return (new (hasDebugger?GeneratorFunction:Function)('event','step','source','player','target','targets', 'card','cards','skill','forced','num','trigger','result', '_status','lib','game','ui','get','ai',str)); } @@ -11110,10 +11373,11 @@ case "object": if(Array.isArray(item)){ let lastEvent=null; - return (event,step,source,player,target,targets,card,cards,skill,forced,num,trigger,result,_status,lib,game,ui,get,ai)=>{ + return function*(event,step,source,player,target,targets,card,cards,skill,forced,num,trigger,result,_status,lib,game,ui,get,ai){ if(step>=item.length) return event.finish(); var current=item[step]; - lastEvent=current(event,{ + if(typeof current!="function") throw new Error(`content ${step} of ${event.name} is not vaild: ${current}`); + var currentResult=current(event,{ event:event, step:step, source:source, @@ -11128,11 +11392,14 @@ trigger:trigger, result:result },(lastEvent&&("result" in lastEvent))?lastEvent.result:null); + // TODO: use `event.debugger` to replace source + if(gnc.is.generator(currentResult)) lastEvent=yield* currentResult; + else lastEvent=currentResult; } } else{ if(Symbol.iterator in item) return lib.init.parsex(Array.from(item)); - if("toString" in item) return lib.init.parsex(item.toString()); + if(item.toString !== Object.prototype.toString) return lib.init.parsex(item.toString()); if("render" in item) { // TODO: Object Render Parse throw new Error("NYI: Object Render Parse"); @@ -11143,7 +11410,8 @@ case "function": if (gnc.is.generatorFunc(item)) { let gen,lastEvent; - return (event,step,source,player,target,targets,card,cards,skill,forced,num,trigger,result,_status,lib,game,ui,get,ai)=>{ + return function*(event,step,source,player,target,targets,card,cards,skill,forced,num,trigger,result,_status,lib,game,ui,get,ai){ + event.step=NaN; if(!gen)gen=item(event,{ event:event, step:step, @@ -11161,7 +11429,12 @@ }); var res=gen.next((lastEvent&&("result" in lastEvent))?lastEvent.result:null); if(res.done) event.finish(); - else lastEvent=res.value; + else { + var currentResult=res.value; + // TODO: use `event.debugger` to replace source + if(typeof currentResult=="function") yield currentResult; + else lastEvent=currentResult; + } } } default: @@ -11977,7 +12250,7 @@ take_damage:'受伤害', reset_character:'复原武将牌', recover_hp:'回复体力', - lose_hp:'流失体力', + lose_hp:'失去体力', get_damage:'受伤害', weiColor:"#b0d0e2", shuColor:"#ffddb9", @@ -12044,6 +12317,10 @@ unknown5:'六号位', unknown6:'七号位', unknown7:'八号位', + unknown8:'九号位', + unknown9:'十号位', + unknown10:'十一号位', + unknown11:'十二号位', feichu_equip1:"已废除", feichu_equip1_info:"武器栏已废除", @@ -12099,13 +12376,15 @@ cooperation_damage:'同仇', cooperation_damage_info:'双方累计造成至少4点伤害', cooperation_draw:'并进', - cooperation_draw_info:'双方累计摸至少8张牌', + cooperation_draw_info:'双方累计摸至少八张牌', cooperation_discard:'疏财', cooperation_discard_info:'双方累计弃置至少4种花色的牌', cooperation_use:'戮力', cooperation_use_info:'双方累计使用至少4种花色的牌', charge:'蓄力值', expandedSlots:'扩展装备栏', + stratagem_fury:'怒气', + _stratagem_add_buff:'强化' }, element:{ content:{ @@ -12267,17 +12546,33 @@ 'step 0' event.cards=[]; event.num=0; - event.slotsx=[...new Set(event.slots)].sort(); + event.slotsx=[]; + if(get.is.mountCombined()){ + event.slots.forEach(type=>{ + if(type=='equip3'||type=='equip4') event.slotsx.add('equip3_4'); + else event.slotsx.add(type) + }); + } + else{ + event.slotsx.addArray(event.slots); + } + event.slotsx.sort(); if(!event.slots.length) event.finish(); 'step 1' var slot=event.slotsx[event.num]; - var left=player.countEnabledSlot(slot),lose=Math.min(left,get.numOf(event.slots,slot)); + var slot_key=slot; + var left=player.countEnabledSlot(slot),lose; + if(slot=='equip3_4'){ + lose=Math.min(left,Math.max(get.numOf(event.slots,'equip3'),get.numOf(event.slots,'equip4'))); + slot_key='equip3'; + } + else lose=Math.min(left,get.numOf(event.slots,slot)); if(lose<=0) event.goto(3); else{ game.log(player,'废除了'+get.cnNumber(lose)+'个','#g'+get.translation(slot)+'栏'); if(!player.disabledSlots) player.disabledSlots={}; - if(!player.disabledSlots[slot]) player.disabledSlots[slot]=0; - player.disabledSlots[slot]+=lose; + if(!player.disabledSlots[slot_key]) player.disabledSlots[slot_key]=0; + player.disabledSlots[slot_key]+=lose; var cards=player.getEquips(slot).filter(card=>!event.cards.contains(card)); if(cards.length>0){ if(lose>=left){ @@ -12292,6 +12587,7 @@ ],true,[1,num]).set('filterOk',function(){ var evt=_status.event; return ui.selected.buttons.reduce(function(num,button){ + if(evt.slot=='equip3_4') return num+Math.max(get.numOf(get.subtypes(button.link,false),'equip3'),get.numOf(get.subtypes(button.link,false),'equip4')); return num+get.numOf(get.subtypes(button.link,false),evt.slot) },0)==evt.required; }).set('required',num).set('slot',slot) @@ -12327,13 +12623,27 @@ }, expandEquip:function(){ if(!event.slots.length) return; - var slotsx=[...new Set(event.slots)].sort(); + var slotsx=[]; + if(get.is.mountCombined()){ + event.slots.forEach(type=>{ + if(type=='equip3'||type=='equip4') slotsx.add('equip3_4'); + else slotsx.add(type) + }); + } + else{ + slotsx.addArray(event.slots); + } + slotsx.sort(); for(var slot of slotsx){ - var expand=get.numOf(event.slots,slot); + var expand=get.numOf(event.slots,slot),slot_key=slot; + if(slot=='equip3_4'){ + expand=Math.max(get.numOf(event.slots,'equip3'),get.numOf(event.slots,'equip4')); + slot_key='equip3'; + } game.log(player,'获得了'+get.cnNumber(expand)+'个额外的','#g'+get.translation(slot)+'栏'); if(!player.expandedSlots) player.expandedSlots={}; - if(!player.expandedSlots[slot]) player.expandedSlots[slot]=0; - player.expandedSlots[slot]+=expand; + if(!player.expandedSlots[slot_key]) player.expandedSlots[slot_key]=0; + player.expandedSlots[slot_key]+=expand; } player.$syncExpand(); }, @@ -12353,13 +12663,25 @@ else{ event.num=0; event.slots=types; - event.slotsx=[...new Set(event.slots)].sort(); + event.slotsx=[]; + if(get.is.mountCombined()){ + event.slots.forEach(type=>{ + if(type=='equip3'||type=='equip4') event.slotsx.add('equip3_4'); + else event.slotsx.add(type) + }); + } + else{ + event.slotsx.addArray(event.slots); + } + event.slotsx.sort(); } } else event.goto(4); 'step 1' var slot=event.slotsx[event.num]; - var left=player.countEquipableSlot(slot),lose=Math.min(left,get.numOf(event.slots,slot)); + var left=player.countEquipableSlot(slot),lose; + if(slot=='equip3_4') lose=Math.min(left,Math.max(get.numOf(event.slots,'equip3'),get.numOf(event.slots,'equip4'))); + else lose=Math.min(left,get.numOf(event.slots,slot)); if(lose<=0) event.goto(3); else{ var cards=player.getEquips(slot).filter(card=>{ @@ -12378,6 +12700,7 @@ ],true,[1,num]).set('filterOk',function(){ var evt=_status.event; return ui.selected.buttons.reduce(function(num,button){ + if(evt.slot=='equip3_4') return num+Math.max(get.numOf(get.subtypes(button.link,false),'equip3'),get.numOf(get.subtypes(button.link,false),'equip4')); return num+get.numOf(get.subtypes(button.link,false),evt.slot) },0)==evt.required; }).set('required',num).set('slot',slot) @@ -12408,14 +12731,10 @@ event.finish(); return; } - if(card.destroyed){ - if(player.hasSkill(card.destroyed)){ - delete card.destroyed; - } - else{ - event.finish(); - return; - } + if(card.willBeDestroyed('equip',player,event)){ + card.selfDestroy(event); + event.finish(); + return; } else if(event.owner){ if(event.owner.getCards('hejsx').contains(card)){ @@ -12447,7 +12766,7 @@ "step 4" var info=get.info(card,false); if(get.itemtype(result)=='cards'){ - player.lose(result,false,'visible').set('type','equip').set('getlx',false).swapEquip=true; + player.lose(result,'visible').set('type','equip').set('getlx',false).swapEquip=true; if(info.loseThrow){ player.$throw(result,1000); } @@ -13387,6 +13706,10 @@ game.getGlobalHistory().cardMove.push(event); var withPile=false; for(var i=0;i0){ + game.players[i].outCount--; + if(game.players[i].outCount==0&&!game.players[i].outSkills){ + game.players[i].in(); + } + } + } + event.trigger('roundStart'); + } + } + _status.globalHistory.push({ + cardMove:[], + custom:[], + useCard:[], + changeHp:[], + everything:[], + }); + var players=game.players.slice(0).concat(game.dead); + for(var i=0;igame.players.length*num&&game.showIdentity){ + if(!_status.video) player.popup('显示身份'); + _status.identityShown=true; + game.showIdentity(false); + } + } + player.ai.tempIgnore=[]; + if(ui.land&&ui.land.player==player){ + game.addVideo('destroyLand'); + ui.land.destroy(); + } + 'step 6' + //规则集中的“回合开始后⑦”,国战武将明置武将牌 + event.trigger('phaseBeginStart'); + 'step 7' + //规则集中的“回合开始后⑨”,进行当先,化身等操作 + //没有⑧ 因为⑧用不到 + event.trigger('phaseBegin'); + //阶段部分 + 'step 8' + if(num1){ + next._extraPhaseReason=phase[1]; + } + if(event.currentPhase=='phaseDraw'||event.currentPhase=='phaseDiscard'){ + if(!player.noPhaseDelay){ + if(player==game.me){ + game.delay(); + } + else{ + game.delayx(); + } + } + } + } + 'step 10' + if(event.currentPhase=='phaseUse'){ + game.broadcastAll(function(){ + if(ui.tempnowuxie){ + ui.tempnowuxie.close(); + delete ui.tempnowuxie; + } + }); + delete player._noSkill; + } + event.num++; + 'step 11' + if(event.numtrue)); if(event.id) next._parent_id=event.id; next.type='chooseToUse_button'; } @@ -15155,6 +15683,7 @@ next.set('ai',info.chooseButton.check||function(){return 1;}); next.set('filterButton',info.chooseButton.filter||function(){return true;}); next.set('selectButton',info.chooseButton.select||1); + next.set('filterOk',info.chooseButton.filterOk||(()=>true)); } event.buttoned=event.result.skill; } @@ -16359,14 +16888,14 @@ }, chooseButtonOL:function(){ 'step 0' - ui.arena.classList.add('markhidden'); + //ui.arena.classList.add('markhidden'); for(var i=0;i=cs.length){ + if(directFilter&&select[0]>=cs.length){ event.result={ bool:true, buttons:event.dialog.buttons, links:cs } } - else if(event.forced&&directh&&!event.isOnline()&&select[0]==select[1]){ + else if(directFilter&&directh&&!event.isOnline()&&select[0]==select[1]){ event.result={ bool:true, buttons:event.dialog.buttons.randomGets(select[0]), @@ -17173,16 +17702,17 @@ event.finish(); return; } + var directFilter=(event.forced&&typeof event.filterOk!='function'&&typeof event.selectButton!='function'&&event.filterButton==lib.filter.all); var cs=target.getCards(event.position); var select=get.select(event.selectButton); - if(event.forced&&select[0]>=cs.length){ + if(directFilter&&select[0]>=cs.length){ event.result={ bool:true, buttons:event.dialog.buttons, links:cs } } - else if(event.forced&&directh&&!event.isOnline()&&select[0]==select[1]){ + else if(directFilter&&directh&&!event.isOnline()&&select[0]==select[1]){ event.result={ bool:true, buttons:event.dialog.buttons.randomGets(select[0]), @@ -17355,14 +17885,15 @@ } var cs=target.getCards(event.position); var select=get.select(event.selectButton); - if(event.forced&&select[0]>=cs.length){ + var directFilter=(event.forced&&typeof event.filterOk!='function'&&typeof event.selectButton!='function'&&event.filterButton==lib.filter.all); + if(directFilter&&select[0]>=cs.length){ event.result={ bool:true, buttons:event.dialog.buttons, links:cs } } - else if(event.forced&&directh&&!event.isOnline()&&select[0]==select[1]){ + else if(directFilter&&directh&&!event.isOnline()&&select[0]==select[1]){ event.result={ bool:true, buttons:event.dialog.buttons.randomGets(select[0]), @@ -17507,6 +18038,7 @@ else{ game.log(player,'展示了',cards); } + game.addCardKnower(cards,'everyone'); game.delayx(event.delay_time||2.5); game.addVideo('showCards',player,[event.str,get.cardsInfo(cards)]); "step 1" @@ -17515,6 +18047,7 @@ }, viewCards:function(){ "step 0" + game.addCardKnower(event.cards,player); if(player==game.me){ event.dialog=ui.create.dialog(event.str,event.cards); if(event.isMine()){ @@ -17729,6 +18262,8 @@ cardaudio=false; } if(cardaudio) game.broadcastAll((player,card)=>{ + game.playCardAudio(card,player); + /* if(!lib.config.background_audio||get.type(card)=='equip'&&!lib.config.equip_audio) return; const sex=player.sex=='female'?'female':'male'; var nature=get.natureList(card)[0]; @@ -17743,7 +18278,7 @@ else if(audio.startsWith('ext:')) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${card.name}_${sex}.${audioInfo[2]||'mp3'}`); else game.playAudio('card',sex,`${audioInfo[0]}.${audioInfo[1]||'mp3'}`); } - else game.playAudio('card',sex,card.name); + else game.playAudio('card',sex,card.name);*/ },player,card); if(event.animate!=false&&event.line!=false){ if(card.name=='wuxie'&&event.getParent()._info_map){ @@ -18553,6 +19088,8 @@ } else if(!event.nopopup) player.tryCardAnimate(card,card.name,'wood'); if(cardaudio&&event.getParent(3).name=='useCard') game.broadcastAll((player,card)=>{ + game.playCardAudio(card,player); + /* if(!lib.config.background_audio) return; const sex=player.sex=='female'?'female':'male',audio=lib.card[card.name].audio; if(typeof audio=='string'){ @@ -18561,7 +19098,7 @@ else if(audio.startsWith('ext:')) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${card.name}_${sex}.${audioInfo[2]||'mp3'}`); else game.playAudio('card',sex,`${audioInfo[0]}.${audioInfo[1]||'mp3'}`); } - else game.playAudio('card',sex,card.name); + else game.playAudio('card',sex,card.name);*/ },player,card); if(event.skill){ if(player.stat[player.stat.length-1].skill[event.skill]==undefined){ @@ -18709,7 +19246,9 @@ for(var i in map){ var owner=(_status.connectMode?lib.playerOL:game.playerMap)[i]; var next=owner.lose(map[i][0],ui.special).set('type','gain').set('forceDie',true).set('getlx',false); - if(event.visible==true) next.visible=true; + if(event.visible==true){ + next.visible=true; + } event.relatedLose=next; } } @@ -18718,13 +19257,9 @@ } "step 1" for(var i=0;i{hcard.clearKnowers();}); + } "step 2" if(num6){ var cards=_status.renku.splice(0,_status.renku.length-6); @@ -19289,7 +19846,7 @@ damage:function(){ "step 0" event.forceDie=true; - if(event.unreal) event.goto(4) + if(event.unreal){event.goto(4); return;} event.trigger('damageBegin1'); "step 1" event.trigger('damageBegin2'); @@ -19299,29 +19856,30 @@ event.trigger('damageBegin4'); "step 4" //moved changeHujia to changeHp - if(['fire','thunder','ice'].contains(event.nature)){ - if(player.hujia>0&&!player.hasSkillTag('nohujia')&&event.nature!='ice'){ - game.broadcastAll(function(num){ - if(lib.config.background_audio) game.playAudio('effect','hujia_damage_'+event.nature+(num>1?'2':'')); - },num); + if(player.hujia>0 && !player.hasSkillTag('nohujia')){ + var damageAudioInfo = lib.natureAudio.hujia_damage[event.nature]; + if(!damageAudioInfo || damageAudioInfo == 'normal'){ + damageAudioInfo = 'effect/hujia_damage'+(num>1?'2':'')+'.mp3'; + }else if(damageAudioInfo == 'default'){ + damageAudioInfo = 'effect/hujia_damage_'+event.nature+(num>1?'2':'')+'.mp3'; + }else{ + damageAudioInfo = damageAudioInfo[num >1 ?2:1]; } - else{ - game.broadcastAll(function(num){ - if(lib.config.background_audio) game.playAudio('effect','damage_'+event.nature+(num>1?'2':'')); - },num); - } - } - else{ - if(player.hujia>0&&!player.hasSkillTag('nohujia')){ - game.broadcastAll(function(num){ - if(lib.config.background_audio) game.playAudio('effect','hujia_damage'+(num>1?'2':'')); - },num); - } - else{ - game.broadcastAll(function(num){ - if(lib.config.background_audio) game.playAudio('effect','damage'+(num>1?'2':'')); - },num); + game.broadcastAll(function(damageAudioInfo){ + if(lib.config.background_audio) game.playAudio(damageAudioInfo); + },damageAudioInfo); + }else{ + var damageAudioInfo = lib.natureAudio.damage[event.nature]; + if(!damageAudioInfo || damageAudioInfo == 'normal'){ + damageAudioInfo = 'effect/damage'+(num>1?'2':'')+'.mp3'; + }else if(damageAudioInfo == 'default'){ + damageAudioInfo = 'effect/damage_'+event.nature+(num>1?'2':'')+'.mp3'; + }else{ + damageAudioInfo = damageAudioInfo[num >1 ?2:1]; } + game.broadcastAll(function(damageAudioInfo){ + if(lib.config.background_audio) game.playAudio(damageAudioInfo); + },damageAudioInfo); } var str=event.unreal?'视为受到了':'受到了'; if(source) str+='来自'+(source==player?'自己':get.translation(source))+'的'; @@ -19366,7 +19924,7 @@ } } },natures,player); - var numx=Math.max(0,num-player.hujia); + var numx=player.hasSkillTag('nohujia')?num:Math.max(0,num-player.hujia); player.$damagepop(-numx,natures[0]); } if(event.unreal) event.goto(6) @@ -19504,7 +20062,8 @@ event.hujia=Math.min(-num,player.hujia); event.getParent().hujia=event.hujia; event.num+=event.hujia; - game.log(player,'的护甲抵挡了'+get.cnNumber(event.hujia)+'点伤害'); + //log moved to changeHujia + //game.log(player,'的护甲抵挡了'+get.cnNumber(event.hujia)+'点伤害'); player.changeHujia(-event.hujia).type='damage'; } //old part @@ -19529,13 +20088,27 @@ event.trigger('changeHp'); }, changeHujia:function(){ - player.hujia+=num; if(num>0){ game.log(player,'获得了'+get.cnNumber(num)+'点护甲'); } - if(player.hujia<0){ - player.hujia=0; + else if(num<0){ + if(-num>player.hujia){ + num=-player.hujia; + event.num=num; + } + switch(event.type){ //log moved here + case 'damage': + game.log(player,'的护甲抵挡了'+get.cnNumber(-num)+'点伤害'); + break; + case 'lose': + game.log(player,'失去了'+get.cnNumber(-num)+'点护甲'); + break; + } } + player.hujia+=num; + //if(player.hujia<0){ + // player.hujia=0; + //} player.update(); }, dying:function(){ @@ -19652,8 +20225,10 @@ game.playAudio(path); } } - else if(lib.character[player.name]&&lib.character[player.name][4].contains('die_audio')){ - game.playAudio('die',player.name); + else if(lib.character[player.name]&&lib.character[player.name][4].some(tag=>tag.startsWith('die_audio'))){ + var tag=lib.character[player.name][4].find(tag=>tag.startsWith('die_audio')); + var list=tag.split(':').slice(1); + game.playAudio('die',list.length?list[0]:player.name); } else{ game.playAudio('die',player.name,function(){ @@ -19780,14 +20355,10 @@ else if(get.position(cards[0])=='c') event.updatePile=true; } "step 1" - if(cards[0].destroyed){ - if(player.hasSkill(cards[0].destroyed)){ - delete cards[0].destroyed; - } - else{ - event.finish(); - return; - } + if(cards[0].willBeDestroyed('judge',player,event)){ + cards[0].selfDestroy(event); + event.finish(); + return; } else if(event.relatedLose){ var owner=event.relatedLose.player; @@ -20044,22 +20615,152 @@ for(i=0;i翻面
    ',player), + framebg:ui.create.div('.framebg',player), + intro:ui.create.div('.intro',player), + identity:ui.create.div('.identity',player), + hp:ui.create.div('.hp',player), + name:ui.create.div('.name',player), + name2:ui.create.div('.name.name2',player), + nameol:ui.create.div('.nameol',player), + count:ui.create.div('.count',player).hide(), + equips:ui.create.div('.equips',player).hide(), + judges:ui.create.div('.judges',player), + marks:ui.create.div('.marks',player), + chain:ui.create.div('.chain','
    ',player), + handcards1:ui.create.div('.handcards'), + handcards2:ui.create.div('.handcards'), + expansions:ui.create.div('.expansions') + }; + node.expansions.style.display='none'; + const chainLength=game.layout=='default'?64:40; + for(let repetition=0;repetition0?'获得了':'失去了',get.cnNumber(Math.abs(difference)),'点','#r怒气'); + this.markSkill('stratagem_fury'); + } + /** + * version 1.6 * * 链式创建一次性技能的api。 * * 使用者只需要关注技能的效果,而不是技能的本身。 */ - when:function(){ + when(){ if(!_status.postReconnect.player_when) _status.postReconnect.player_when=[ function(map){ "use strict"; @@ -20091,7 +20792,7 @@ //triggerNames = [ 'xxAfter', 'yyBegin' ] if(triggerNames.every(t=>typeof t=='string')) trigger={player:triggerNames}; //triggerNames = [ {player: 'xxAfter'}, {global: 'yyBegin'} ] - //此处不做特殊的合并处理,由使用者自行把握 + //此处不做特殊的合并处理,由使用者自行把握,同名属性后者覆盖前者 else if(triggerNames.every(t=>get.is.object(t))) trigger=triggerNames.reduce((pre,cur)=>Object.assign(pre,cur)); } if(!trigger) throw 'player.when传参数类型错误:'+triggerNames; @@ -20099,12 +20800,13 @@ do{ skillName='player_when_'+Math.random().toString(36).slice(-8); }while(lib.skill[skillName]!=null); - let after=`${skillName}After`; + const after=`${skillName}After`; if(!trigger.player) trigger.player=after; else if(Array.isArray(trigger.player)) trigger.player.add(after); else if(typeof trigger.player=='string') trigger.player=[trigger.player,after]; + const vars={}; let skill={ - trigger, + trigger:trigger, forced:true, charlotte:true, popup:false, @@ -20113,6 +20815,10 @@ //充分条件 filter2Funs:[], contentFuns:[], + //外部变量 + get vars() { + return vars; + }, get filter(){ return (event,player,name)=>{ if(name==`${skillName}After`){ @@ -20130,6 +20836,35 @@ }; } }; + const warnVars=['event','step','source','player','target','targets', + 'card','cards','skill','forced','num','trigger','result']; + const errVars=['_status','lib','game','ui','get','ai']; + const createContent=()=>{ + let varstr=''; + for (const key in vars) { + if(warnVars.includes(key)) console.warn(`Variable '${key}' should not be referenced by vars objects`); + if(errVars.includes(key)) throw new Error(`Variable '${key}' should not be referenced by vars objects`); + varstr+=`var ${key}=lib.skill['${skillName}'].vars['${key}'];\n`; + } + let str=` + function content(){ + ${varstr}if(event.triggername=='${skillName}After'){ + player.removeSkill('${skillName}'); + delete lib.skill['${skillName}']; + delete lib.translate['${skillName}']; + return event.finish(); + } + `; + for(let i=0;ixxx的情况 + const begin=a.indexOf("{")==a.indexOf("}")&&a.indexOf("{")==-1?a.indexOf("=>")+2:a.indexOf("{")+1; + const str2=a.slice(begin,a.lastIndexOf("}")!=-1?a.lastIndexOf("}"):undefined).trim(); + str+=`'step ${i}'\n\t${str2}\n\t`; + } + skill.content=eval(str+`\n};content;`); + }; Object.defineProperty(lib.skill,skillName,{ configurable:true, //这类技能不需要被遍历到 @@ -20146,6 +20881,7 @@ forced:true, charlotte:true, popup:false, + vars:{}, } }); },skillName); @@ -20175,23 +20911,7 @@ then(fun){ if(lib.skill[skillName]!=skill) throw `This skill has been destroyed`; skill.contentFuns.push(fun); - let str=` - function content(){ - if(event.triggername=='${skillName}After'){ - player.removeSkill('${skillName}'); - delete lib.skill['${skillName}']; - delete lib.translate['${skillName}']; - return event.finish(); - } - `; - for(let i=0;i{return true}; + return this.getCards('h',function(card){ + return card.isKnownBy(other) && filter(card); + }); + } + //判断此角色的手牌是否已经被看光了。 + isAllCardsKnown(other){ + if(!other)other = _status.event.player; + if(!other)other = this; + return this.countCards('h',function(card){ + return !card.isKnownBy(other); + }) == 0; + } + //判断此角色是否有被知的牌。 + hasKnownCards(other,filter){ + if(!other)other = _status.event.player; + if(!other)other = this; + if(!filter)filter = (card)=>{return true}; + return this.countCards('h',function(card){ + return card.isKnownBy(other) && filter(card); + }) > 0; + } + //数此角色被知道的牌。 + countKnownCards(other,filter){ + return this.getKnownCards(other,filter).length; + } //Execute the delay card effect //执行延时锦囊牌效果 - executeDelayCardEffect:function(card,target,judge,judge2){ + executeDelayCardEffect(card,target,judge,judge2){ const executeDelayCardEffect=game.createEvent('executeDelayCardEffect'); executeDelayCardEffect.player=this; executeDelayCardEffect.target=target||this; @@ -20273,15 +21030,15 @@ executeDelayCardEffect.setContent('executeDelayCardEffect'); executeDelayCardEffect._args=Array.from(arguments); return executeDelayCardEffect; - }, + } //Check if the card does not count toward hand limit //检测此牌是否不计入手牌上限 - canIgnoreHandcard:function(card){ + canIgnoreHandcard(card){ return lib.filter.ignoredHandcard(card,this); - }, + } //Gift //赠予 - gift:function(cards,target){ + gift(cards,target){ const gift=game.createEvent('gift'); gift.player=this; gift.target=target; @@ -20293,35 +21050,35 @@ gift.setContent('gift'); gift._args=Array.from(arguments); return gift; - }, + } //Check if the player can gift the card //检测角色是否能赠予此牌 - canGift:function(card,target,strict){ + canGift(card,target,strict){ return lib.filter.cardGiftable(card,this,target,strict); - }, + } //Check if the player refuses gifts //检测角色是否拒绝赠予 - refuseGifts:function(card,player){ + refuseGifts(card,player){ return this.hasSkillTag('refuseGifts',null,{ player:player, card:card }); - }, + } //Gift AI related //赠予AI相关 - getGiftAIResultTarget:function(card,target){ + getGiftAIResultTarget(card,target){ if(!card||target.refuseGifts(card,this)) return 0; if(get.type(card,false)=='equip') return get.effect(target,card,target,target); if(card.name=='du') return this.hp>target.hp?-1:0; if(target.hasSkillTag('nogain')) return 0; return Math.max(1,get.value(card,this)-get.value(card,target)); - }, - getGiftEffect:function(card,target){ + } + getGiftEffect(card,target){ return this.getGiftAIResultTarget(card,target)*get.attitude(this,target); - }, + } //Recast //重铸 - recast:function(cards,recastingLose,recastingGain){ + recast(cards,recastingLose,recastingGain){ const recast=game.createEvent('recast'); recast.player=this; const isArray=Array.isArray(cards); @@ -20337,23 +21094,28 @@ recast.setContent('recast'); recast._args=Array.from(arguments); return recast; - }, + } //Check if the player can recast the card //检测角色是否能重铸此牌 - canRecast:function(card,source,strict){ + canRecast(card,source,strict){ return lib.filter.cardRecastable(card,this,source,strict); - }, + } //装备栏相关 //判断一名角色的某个区域是否被废除 //type为要判断的区域 若为空 则判断玩家是否有任意一个被废除的区域 - hasDisabledSlot:function(type){ + hasDisabledSlot(type){ var player=this; - if(type=='horse') return player.hasDisabledSlot(3)&&player.hasDisabledSlot(4); + if(type=='horse'||type=='equip3_4'){ + return player.hasDisabledSlot(3)&&(get.is.mountCombined()||player.hasDisabledSlot(4)); + } + else if(get.is.mountCombined()&&type=='equip4'){ + return false; + } return player.countDisabledSlot(type)>0; - }, + } //判断一名角色的某个区域被废除的数量 //用法同上 - countDisabledSlot:function(type){ + countDisabledSlot(type){ var player=this; var map=(player.disabledSlots||{}); if(type==undefined){ @@ -20365,54 +21127,79 @@ } else{ if(typeof type=='number') type=('equip'+type); + if(get.is.mountCombined()&&type=='equip4'){ + return 0; + } var num=map[type]; if(typeof num=='number'&&num>0) return num; return 0; } - }, + } //判断一名角色是否有某个装备栏空着 - hasEmptySlot:function(type){ + hasEmptySlot(type){ var player=this; - if(type=='horse') return player.hasEmptySlot(3)&&player.hasEmptySlot(4); + if(type=='horse'||type=='equip3_4'){ + return player.hasEmptySlot(3)&&(get.is.mountCombined()||player.hasEmptySlot(4)); + } + else if(get.is.mountCombined()&&type=='equip4'){ + return false; + } return player.countEmptySlot(type)>0; - }, + } //判断一名角色的某个装备栏空位的数量 - countEmptySlot:function(type){ + countEmptySlot(type){ if(!type) return 0; var player=this; if(typeof type=='number') type=('equip'+type); + else if(type=='equip3_4'){ + type='equip3'; + } return Math.max(0,player.countEnabledSlot(type)-player.getEquips(type).reduce(function(num,card){ var types=get.subtypes(card,false); return num+get.numOf(types,type); },0)) - }, + } //判断一名角色是否有可以用于装备新装备牌的区域(排除金箍棒和六龙等“不可被替换装备”) //用法同下 - hasEquipableSlot:function(type){ + hasEquipableSlot(type){ return this.countEquipableSlot(type)>0; - }, + } //统计一名角色有多少个可以用于装备新的装备牌的区域 //用法同下 - countEquipableSlot:function(type){ + countEquipableSlot(type){ if(!type) return 0; var player=this; if(typeof type=='number') type=('equip'+type); + else if(type=='equip3_4'){ + type='equip3'; + } + else if(get.is.mountCombined()&&type=='equip4'){ + return 0; + } return Math.max(0,player.countEnabledSlot(type)-player.getEquips(type).reduce(function(num,card){ var types=get.subtypes(card,false); if(!lib.filter.canBeReplaced(card,player)) num+=get.numOf(types,type); return num; },0)) - }, + } //判断一名角色是否拥有未被废除的某个区域 //type为要判断的区域 若为空 则判断玩家是否有任意一个未被废除的区域 - hasEnabledSlot:function(type){ + hasEnabledSlot(type){ var player=this; - if(type=='horse') return player.hasEnabledSlot(3)&&player.hasEnabledSlot(4); + if(type=='horse'||type=='equip3_4'){ + return player.hasEnabledSlot(3)&&(get.is.mountCombined()||player.hasEnabledSlot(4)); + } + else if(type=='equip3_4'){ + type='equip3'; + } + else if(get.is.mountCombined()&&type=='equip4'){ + return false; + } return player.countEnabledSlot(type)>0; - }, + } //判断一名角色的某个区域未被废除的数量 //用法同上 - countEnabledSlot:function(type){ + countEnabledSlot(type){ var player=this; var map=(player.expandedSlots||{}); if(!type){ @@ -20424,20 +21211,29 @@ } else{ if(typeof type=='number') type=('equip'+type); + if(get.is.mountCombined()&&type=='equip4'){ + return 0; + } var slots=1; var num=map[type]; if(typeof num=='number'&&num>0) slots+=num; slots-=player.countDisabledSlot(type); return slots; } - }, + } //获取一名角色装备区内某种类型的装备牌 //参数可以为数字/区域字符串/实体牌/虚拟牌/牌名 - getEquips:function(subtype){ + getEquips(subtype){ var type=(typeof subtype); switch(type){ case 'string': - if(subtype.startsWith('equip')&&parseInt(subtype.slice(5))>0){ + if(subtype=='equip3_4'){ + const cards=[]; + cards.addArray(this.getEquips(3)); + cards.addArray(this.getEquips(4)); + return cards; + } + else if(subtype.startsWith('equip')&&parseInt(subtype.slice(5))>0){ break; } else if(lib.card[subtype]){ @@ -20457,10 +21253,10 @@ return this.getCards('e',function(card){ return get.subtypes(card,false).contains(subtype); }) - }, + } //新的废除装备区/恢复装备区/扩展装备区 //参数:废除来源角色(不写默认当前事件角色),废除区域(数字/区域字符串/数组,可以写多个,重复废除) - disableEquip:function(){ + disableEquip(){ var next=game.createEvent('disableEquip'); next.player=this; next.slots=[]; @@ -20491,8 +21287,8 @@ } next.setContent('disableEquip'); return next; - }, - enableEquip:function(){ + } + enableEquip(){ var next=game.createEvent('enableEquip'); next.player=this; next.slots=[]; @@ -20523,8 +21319,8 @@ } next.setContent('enableEquip'); return next; - }, - expandEquip:function(){ + } + expandEquip(){ var next=game.createEvent('expandEquip'); next.player=this; next.slots=[]; @@ -20555,13 +21351,13 @@ } next.setContent('expandEquip'); return next; - }, + } //判断判定区是否被废除 - isDisabledJudge:function(){ + isDisabledJudge(){ return Boolean(this.storage._disableJudge); - }, + } //同步显示扩展装备区状态 - $syncExpand:function(map){ + $syncExpand(map){ var player=this; if(!map){ map=(player.expandedSlots||{}); @@ -20572,11 +21368,12 @@ player.$syncExpand(map); },player,map); player.markSkill('expandedSlots'); - }, + } //同步装备区废除牌显示状态 - $syncDisable:function(map){ - var player=this; - var suits={equip3:'+1马栏',equip4:'-1马栏',equip6:'特殊栏'}; + $syncDisable(map){ + const player=this; + const suits={equip3:'+1马栏',equip4:'-1马栏',equip6:'特殊栏'}; + if(get.is.mountCombined()) suits.equip3='坐骑栏'; if(!map){ map=(player.disabledSlots||{}); } @@ -20585,29 +21382,29 @@ player.disabledSlots=map; player.$syncDisable(map); },player,map) - var map2=get.copy(map); - var cards=Array.from(player.node.equips.childNodes); - for(var card of cards){ + const map2=get.copy(map); + const cards=Array.from(player.node.equips.childNodes); + for(const card of cards){ if(card.name.startsWith('feichu_')){ - var index=card.name.slice(7); + const index=card.name.slice(7); if(!map2[index]) map2[index]=0; map2[index]--; } } - for(var index in map2){ + for(const index in map2){ if(!index.startsWith('equip')||!(parseInt(index.slice(5))>0)) continue; - var num=map2[index]; + const num=map2[index]; if(num>0){ - for(var i=0;i=equipNum){ player.node.equips.insertBefore(card,player.node.equips.childNodes[j]); equipped=true; @@ -20623,8 +21420,8 @@ } } else if(num<0){ - for(var i=0;i>num;i--){ - var card=cards.find(card=>card.name=='feichu_'+index); + for(let i=0;i>num;i--){ + const card=cards.find(card=>card.name=='feichu_'+index); if(card){ player.node.equips.removeChild(card); cards.remove(card); @@ -20632,33 +21429,42 @@ } } } - }, + } //以下函数涉及到本次更新内容而进行修改 - canEquip:function(name,replace){ - var ranges=get.subtypes(name),rangex=[...new Set(ranges)],player=this; - for(var range of rangex){ - var num=this.countEquipableSlot(range); - var num2=get.numOf(rangex,range); + canEquip(name,replace){ + const ranges=get.subtypes(name),rangex=[],player=this,combined=get.is.mountCombined(); + if(combined){ + ranges.forEach(type=>{ + if(type=='equip3'||type=='equip4') rangex.add('equip3_4'); + else rangex.add(type) + }) + } + else{ + rangex.push(...new Set(ranges)); + } + for(let range of rangex){ + let num=this.countEquipableSlot(range); + let num2=get.numOf(rangex,range); if(!replace) num-=this.getEquips(range).filter(card=>lib.filter.canBeReplaced(card,player)).length; if(numthis.getEquips(num).length; - }, + } //以下函数将被废弃 - $disableEquip:function(){}, - $enableEquip:function(){}, + $disableEquip(){} + $enableEquip(){} //装备区End - chooseToDebate:function(){ + chooseToDebate(){ var next=game.createEvent('chooseToDebate'); next.player=this; next._args=[]; @@ -20672,8 +21478,8 @@ } next.setContent('chooseToDebate'); return next; - }, - cooperationWith:function(target,type,reason){ + } + cooperationWith(target,type,reason){ var player=this; if(!player.storage.cooperation) player.storage.cooperation=[]; var info={ @@ -20685,8 +21491,8 @@ player.addTempSkill('cooperation',{player:'dieAfter'}); player.addSkill('cooperation_'+type,{player:'dieAfter'}); game.log(player,'向',target,'发起了“协力”,合作类型是','#g'+get.translation('cooperation_'+type)); - }, - chooseCooperationFor:function(){ + } + chooseCooperationFor(){ var next=game.createEvent('chooseCooperationFor'); next.player=this; for(var i=0;i
    '); @@ -21023,16 +21840,16 @@ emotion.delete(); },1200); },600); - }, - tryJudgeAnimate:function(bool){ + } + tryJudgeAnimate(bool){ var player=this; game.broadcast(function(player,bool){ player.trySkillAnimate(bool); },player,bool); if(bool) this.popup('判定生效','wood',false); else this.popup('判定失效','fire',false); - }, - trySkillAnimate:function(name,popname,checkShow){ + } + trySkillAnimate(name,popname,checkShow){ if(!game.online&&lib.config.skill_animation_type!='off'&&lib.skill[name]&&lib.skill[name].skillAnimation){ if(lib.config.skill_animation_type=='default'){ checkShow=checkShow||'main'; @@ -21055,8 +21872,8 @@ if(popname!=name) this.popup(popname,'water',false); else this.popup(get.skillTranslation(name,this),'water',false); } - }, - tryCardAnimate:function(card,name,nature,popname){ + } + tryCardAnimate(card,name,nature,popname){ var player=this; game.broadcast(function(player,card,name,nature,popname){ player.tryCardAnimate(card,name,nature,popname); @@ -21069,8 +21886,8 @@ if(popname) player.popup({name:card.name,nature:card.nature},nature,false); else player.popup(name,nature,false); } - }, - hasUsableCard:function(name){ + } + hasUsableCard(name){ var player=this; if(player.countCards('hs',name)) return true; var skills=player.getSkills('invisible').concat(lib.skill.global); @@ -21089,8 +21906,8 @@ } } } - }, - inRange:function(to){ + } + inRange(to){ var from=this; if(from==to||from.hasSkill('undist')||to.hasSkill('undist')) return false; if(!game.players.contains(from)&&!game.dead.contains(from)) return false; @@ -21161,21 +21978,21 @@ } } return m<=range; - }, - inRangeOf:function(source){ + } + inRangeOf(source){ return source.inRange(this); - }, + } //Get the player's HP not less than 0. Set “raw” to true to get the player's raw HP instead. //获取角色的体力值。设置“raw”为true以获取角色的体力。 - getHp:function(raw){ + getHp(raw){ return raw?this.hp:Math.max(0,this.hp); - }, + } //Set “raw” to true to get the player's raw damaged HP instead. //设置“raw”为true以获取角色已损失的体力。 - getDamagedHp:function(raw){ + getDamagedHp(raw){ return this.maxHp-this.getHp(raw); - }, - changeGroup:function(group,log,broadcast){ + } + changeGroup(group,log,broadcast){ var next=game.createEvent('changeGroup'); next.player=this; next.log=true; @@ -21193,52 +22010,52 @@ } next.setContent('changeGroup'); return next; - }, - chooseToDuiben:function(target){ + } + chooseToDuiben(target){ var next=game.createEvent('chooseToDuiben'); next.player=this; next.target=target; next.setContent('chooseToDuiben'); return next; - }, - chooseToPSS:function(target){ + } + chooseToPSS(target){ var next=game.createEvent('chooseToPSS'); next.player=this; next.target=target; next.setContent('chooseToPSS'); return next; - }, - chooseToEnable:function(){ + } + chooseToEnable(){ var next=game.createEvent('chooseToEnable'); next.player=this; next.setContent('chooseToEnable'); return next; - }, - chooseToDisable:function(horse){ + } + chooseToDisable(horse){ var next=game.createEvent('chooseToDisable'); next.player=this; if(horse) next.horse=true; next.setContent('chooseToDisable'); return next; - }, - isPhaseUsing:function(notmeisok){ + } + isPhaseUsing(notmeisok){ if(!notmeisok&&_status.currentPhase!=this) return false; return _status.event.name=='phaseUse'||_status.event.getParent('phaseUse').name=='phaseUse'; - }, - swapEquip:function(target){ + } + swapEquip(target){ var next=game.createEvent('swapEquip'); next.player=this; next.target=target; next.setContent('swapEquip'); return next; - }, - canCompare:function(target){ + } + canCompare(target){ if(this==target) return false; if(!this.countCards('h')||!target.countCards('h')) return false; if(this.hasSkillTag('noCompareSource')||target.hasSkillTag('noCompareTarget')) return false; return true; - }, - $disableJudge:function(){ + } + $disableJudge(){ var player=this; game.addVideo('$disableJudge',player); player.storage._disableJudge=true; @@ -21249,8 +22066,8 @@ card.classList.add('drawinghidden'); player.node.judges.insertBefore(card,player.node.judges.firstChild); ui.updatej(player); - }, - $enableJudge:function(){ + } + $enableJudge(){ var player=this; game.addVideo('$enableJudge',player); player.storage._disableJudge=false; @@ -21260,23 +22077,23 @@ break; } } - }, - disableJudge:function(){ + } + disableJudge(){ var next=game.createEvent('disableJudge'); next.player=this; next.source=_status.event.player; next.setContent('disableJudge'); return next; - }, - enableJudge:function(){ + } + enableJudge(){ var next=game.createEvent('enableJudge'); next.player=this; next.source=_status.event.player; next.setContent('enableJudge'); return next; - }, + } //原有函数 - init:function(character,character2,skill,update){ + init(character,character2,skill,update){ if(typeof character=='string'&&!lib.character[character]){ lib.character[character]=get.character(character); } @@ -21302,31 +22119,11 @@ } var skills=info[3].slice(0); this.clearSkills(true); - this.classList.add('fullskin'); - if(!game.minskin&&get.is.newLayout()&&!info[4].contains('minskin')){ - this.classList.remove('minskin'); - this.node.avatar.setBackground(character,'character'); - } - else{ - this.node.avatar.setBackground(character,'character'); - if(info[4].contains('minskin')){ - this.classList.add('minskin'); - } - else if(game.minskin){ - this.classList.add('minskin'); - } - else{ - this.classList.remove('minskin'); - } - } var hp1=get.infoHp(info[2]); var maxHp1=get.infoMaxHp(info[2]); var hujia1=get.infoHujia(info[2]); - this.node.avatar.show(); - this.node.count.show(); - this.node.equips.show(); this.name=character; this.name1=character; this.sex=info[0]; @@ -21345,14 +22142,8 @@ if(!this.hiddenSkills) this.hiddenSkills=[]; this.hiddenSkills.addArray(skills); skills=[]; - this.classList.add(_status.video?'unseen_v':'unseen'); this.name='unknown'; - if(!this.node.name_seat&&!_status.video){ - this.node.name_seat=ui.create.div('.name.name_seat',get.verticalStr(get.translation(this.name)),this); - this.node.name_seat.dataset.nature=get.groupnature(this.group); - } this.sex='male'; - //this.group='unknown'; this.storage.nohp=true; skills.add('g_hidden_ai'); } @@ -21364,10 +22155,7 @@ if(!info2[4]){ info2[4]=[]; } - this.classList.add('fullskin2'); - this.node.avatar2.setBackground(character2,'character'); - this.node.avatar2.show(); this.name2=character2; var hp2=get.infoHp(info2[2]); var maxHp2=get.infoMaxHp(info2[2]); @@ -21407,17 +22195,13 @@ this.hp=hp1+hp2-3; }; } - this.node.count.classList.add('p2'); if(info2[4].contains('hiddenSkill')&&!this.noclick){ if(!this.hiddenSkills) this.hiddenSkills=[]; this.hiddenSkills.addArray(info2[3]); - this.classList.add(_status.video?'unseen2_v':'unseen2'); this.storage.nohp=true; skills.add('g_hidden_ai'); } else skills=skills.concat(info2[3]); - - this.node.name2.innerHTML=get.slimName(character2); } if(this.storage.nohp){ this.storage.rawHp=this.hp; @@ -21433,14 +22217,17 @@ return true; }); for(var i=0;i=4){ + this.node.name.classList.add('long'); + } + if(info[4].contains('hiddenSkill')&&!this.noclick){ + this.classList.add(_status.video?'unseen_v':'unseen'); + if(!this.node.name_seat&&!_status.video){ + this.node.name_seat=ui.create.div('.name.name_seat',get.verticalStr(get.translation(this.name)),this); + this.node.name_seat.dataset.nature=get.groupnature(this.group); + } + } + if(character2&&lib.character[character2]){ + var info2=lib.character[character2]; + if(!info2){ + info2=['','',1,[],[]]; + } + if(!info2[4]){ + info2[4]=[]; + } + this.classList.add('fullskin2'); + this.node.avatar2.setBackground(character2,'character'); + this.node.avatar2.show(); + this.name2=character2; + + this.node.count.classList.add('p2'); + if(info2[4].contains('hiddenSkill')&&!this.noclick){ + this.classList.add(_status.video?'unseen2_v':'unseen2'); + } + this.node.name2.innerHTML=get.slimName(character2); + } + if(this.storage.nohp){ + this.node.hp.hide(); + } + + return this; + } + initOL(name,character){ this.node.avatar.setBackground(character,'character'); this.node.avatar.show(); this.node.name.innerHTML=get.verticalStr(name); @@ -21459,16 +22316,16 @@ this.avatar=character; this.node.nameol.innerHTML=''; if(lib.character[character]) this.sex=lib.character[character][0]; - }, - uninitOL:function(){ + } + uninitOL(){ this.node.avatar.hide(); this.node.name.innerHTML=''; this.node.identity.firstChild.innerHTML=''; delete this.nickname; delete this.avatar; delete this.sex; - }, - initRoom:function(info,info2){ + } + initRoom(info,info2){ var str=''; this.serving=false; if(!info||info=='server'){ @@ -21537,40 +22394,26 @@ } this.firstChild.innerHTML=str; return this; - }, - reinit:function(from,to,maxHp,online){ + } + reinit(from,to,maxHp,online){ var info1=lib.character[from]; var info2=lib.character[to]; - var smooth=true; + var smooth=true,replaced=null; if(maxHp=='nosmooth'){ smooth=false; maxHp=null; } if(this.name2==from){ this.name2=to; - if(this.isUnseen(0)&&!this.isUnseen(1)){ - this.sex=info2[0]; - this.name=to; - } - if(smooth) this.smoothAvatar(true); - this.node.avatar2.setBackground(to,'character'); - this.node.name2.innerHTML=get.slimName(to); } else if(this.name==from||this.name1==from){ if(this.name1==from){ this.name1=to; } - if(!this.classList.contains('unseen2')){ + if(!this.isUnseen(1)){ this.name=to; this.sex=info2[0]; } - if(smooth) this.smoothAvatar(false); - this.node.avatar.setBackground(to,'character'); - this.node.name.innerHTML=get.slimName(to); - - if(this==game.me&&ui.fakeme){ - ui.fakeme.style.backgroundImage=this.node.avatar.style.backgroundImage; - } } else{ return this; @@ -21633,11 +22476,75 @@ hp:this.maxHp, avatar2:this.name2==to }); + + this.$reinit(from,to,maxHp,online); this.update(); - }, - uninit:function(){ + } + $reinit(from,to,maxHp,online){ + var smooth=true; + if(maxHp=='nosmooth'){ + smooth=false; + maxHp=null; + } + if(this.name2==to){ + if(smooth) this.smoothAvatar(true); + this.node.avatar2.setBackground(to,'character'); + this.node.name2.innerHTML=get.slimName(to); + } + else if(this.name==to||this.name1==to){ + if(smooth) this.smoothAvatar(false); + this.node.avatar.setBackground(to,'character'); + this.node.name.innerHTML=get.slimName(to); + + if(this==game.me&&ui.fakeme){ + ui.fakeme.style.backgroundImage=this.node.avatar.style.backgroundImage; + } + } + } + uninit(){ this.expandedSlots={}; this.disabledSlots={}; + + delete this.name; + delete this.name1; + delete this.sex; + delete this.group; + delete this.hp; + delete this.maxHp; + delete this.hujia; + this.clearSkills(true); + + if(this.name2){ + delete this.singleHp; + delete this.name2; + } + for(var mark in this.marks){ + this.marks[mark].remove(); + } + ui.updatem(this); + + this.skipList=[]; + this.skills=this.skills.filter(skill=>{ + return lib.skill[skill]&&lib.skill[skill].superCharlotte; + }); + this.initedSkills=[]; + this.additionalSkills={}; + this.disabledSkills={}; + this.hiddenSkills=[]; + this.awakenedSkills=[]; + this.forbiddenSkills={}; + this.phaseNumber=0; + this.stat=[{card:{},skill:{}}]; + this.tempSkills={}; + this.storage={}; + this.marks={}; + this.ai={friend:[],enemy:[],neutral:[]}; + + this.$uninit(); + + return this; + } + $uninit(){ this.$syncDisable(); if(this.isDisabledJudge()){ game.broadcastAll(function(player){ @@ -21659,59 +22566,33 @@ this.node.name_seat.remove(); delete this.node.name_seat; } - if(this.storage.nohp) this.node.hp.show(); + this.node.hp.show(); this.classList.remove('unseen'); this.classList.remove('unseen2'); - delete this.name; - delete this.name1; - delete this.sex; - delete this.group; - delete this.hp; - delete this.maxHp; - delete this.hujia; - this.clearSkills(true); + this.node.identity.style.backgroundColor=''; this.node.intro.innerHTML=''; this.node.name.innerHTML=''; this.node.hp.innerHTML=''; this.node.count.innerHTML='0'; - if(this.name2){ - delete this.singleHp; - this.node.avatar2.hide(); - this.node.name2.innerHTML=''; - this.classList.remove('fullskin2') - delete this.name2; - this.node.count.classList.remove('p2'); - } + + this.node.avatar2.hide(); + this.node.name2.innerHTML=''; + this.classList.remove('fullskin2'); + this.node.count.classList.remove('p2'); + for(var mark in this.marks){ this.marks[mark].remove(); } ui.updatem(this); - - this.skipList=[]; - this.skills=this.skills.contains('cangji_yozuru')?['cangji_yozuru']:[]; - this.initedSkills=[]; - this.additionalSkills={}; - this.disabledSkills={}; - this.hiddenSkills=[]; - this.awakenedSkills=[]; - this.forbiddenSkills={}; - this.phaseNumber=0; - this.stat=[{card:{},skill:{}}]; - this.tempSkills={}; - this.storage={}; - this.marks={}; - this.ai={friend:[],enemy:[],neutral:[]}; - - return this; - }, - getLeft:function(){ + } + getLeft(){ return this.offsetLeft; - }, - getTop:function(){ + } + getTop(){ return this.offsetTop; - }, - smoothAvatar:function(vice,video){ + } + smoothAvatar(vice,video){ var div=ui.create.div('.fullsize'); if(vice){ div.style.background=getComputedStyle(this.node.avatar2).background; @@ -21732,8 +22613,8 @@ if(video!=false){ game.addVideo('smoothAvatar',this,vice); } - }, - changeSeat:function(position,video){ + } + changeSeat(position,video){ var player=this; if(video!==false) game.addVideo('changeSeat',player,position); var rect1=player.getBoundingClientRect(); @@ -21754,13 +22635,13 @@ ui.refresh(player); player.style.transform=''; },100); - }, - send:function(){ + } + send(){ if(!this.ws||this.ws.closed) return this; this.ws.send.apply(this.ws,arguments); return this; - }, - getId:function(){ + } + getId(){ if(_status.video||_status.connectMode) return this; if(this.playerid){ delete game.playerMap[this.playerid]; @@ -21768,15 +22649,15 @@ this.playerid=get.id(); game.playerMap[this.playerid]=this; return this; - }, - throwEmotion:function(target,emotion){ - game.broadcastAll(function(player,target,emotion){ - player.$throwEmotion(target,emotion); - },this,target,emotion); - }, - emotion:function(pack,id){ + } + throwEmotion(target,emotion,rotate){ + game.broadcastAll(function(player,target,emotion,rotate){ + player.$throwEmotion(target,emotion,rotate); + },this,target,emotion,rotate); + } + emotion(pack,id){ var str=''; - lib.element.player.say.call(this,str); + this.say(str); game.broadcast(function(id,str){ if(lib.playerOL[id]){ lib.playerOL[id].say(str); @@ -21784,16 +22665,16 @@ else if(game.connectPlayers){ for(var i=0;i=this.maxHp) this.hp=this.maxHp; - var hp=this.node.hp; - hp.style.transition='none'; game.broadcast(function(player,hp,maxHp,hujia){ player.hp=hp; player.maxHp=maxHp; player.hujia=hujia; - player.update(); + player.$update(); },this,this.hp,this.maxHp,this.hujia); + this.$update(...arguments); + } + $update(){ + if(this.hp>=this.maxHp) this.hp=this.maxHp; + var hp=this.node.hp; + hp.style.transition='none'; if(!_status.video){ if(this.hujia){ this.markSkill('ghujia'); @@ -22142,8 +23027,8 @@ this.node.count.innerHTML=numh; } if(this.updates){ - for(var i=0;i0) this.removeMark(i,num,log) - }, - removeMark:function(i,num,log){ + } + removeMark(i,num,log){ if(typeof num!='number'||!num) num=1; if(typeof this.storage[i]!='number'||!this.storage[i]) return; if(num>this.storage[i]) num=this.storage[i]; @@ -22170,8 +23055,8 @@ } this.syncStorage(i); this[(this.storage[i]||(lib.skill[i]&&lib.skill[i].mark))?'markSkill':'unmarkSkill'](i); - }, - addMark:function(i,num,log){ + } + addMark(i,num,log){ if(typeof num!='number'||!num) num=1; if(typeof this.storage[i]!='number') this.storage[i]=0; this.storage[i]+=num; @@ -22184,22 +23069,22 @@ } this.syncStorage(i); this.markSkill(i); - }, - setMark:function(name,num,log){ + } + setMark(name,num,log){ const count=this.countMark(name); if(count>num)this.removeMark(name,count-num,log); else if(count0; - }, - updateMark:function(i,storage){ + } + updateMark(i,storage){ if(!this.marks[i]){ if(lib.skill[i]&&lib.skill[i].intro&&(this.storage[i]||lib.skill[i].intro.markcount)){ this.markSkill(i); @@ -22256,8 +23141,8 @@ } } return this; - }, - updateMarks:function(connect){ + } + updateMarks(connect){ if(typeof connect=='string'&&_status.connectMode&&!game.online){ game.broadcast(function(player,storage,skill){ player.storage[skill]=storage; @@ -22267,8 +23152,8 @@ for(var i in this.marks){ this.updateMark(i); } - }, - num:function(arg1,arg2,arg3){ + } + num(arg1,arg2,arg3){ if(get.itemtype(arg1)=='position'){ return this.get(arg1,arg2,arg3).length; } @@ -22280,8 +23165,8 @@ return game.expandSkills(this.getSkills().concat(lib.skill.global)).contains(arg2); } } - }, - line:function(target,config){ + } + line(target,config){ if(get.itemtype(target)=='players'){ for(var i=0;i | (card: Card) => boolean} [arg2] + * @returns {Card[]} + */ + getCards(arg1,arg2){ if(typeof arg1!='string'){ arg1='h'; } @@ -22495,8 +23385,8 @@ } } return cards; - }, - getDiscardableCards:function(player,arg1,arg2){ + } + getDiscardableCards(player,arg1,arg2){ var cards=this.getCards(arg1,arg2); for(var i=0;iparseInt(limit)){ - var numx=parseInt(limit)-this.hujia; - if(numx>0) next.num=numx; - else _status.event.next.remove(next); + num=Math.max(0, parseInt(limit)-this.hujia); } + if(typeof type!='string'){ + if(num>0) type='gain'; + else if(num<0) type='lose'; + else type='null'; + } + next.num=num; + next.player=this; + next.type=type; + next.setContent('changeHujia'); return next; - }, - getBuff:function(){ + } + getBuff(){ var list=[1,2,3,4,5,6]; var nodelay=false; for(var i=0;i0||this.isDying()) return; var next=game.createEvent('dying'); next.player=this; @@ -24895,16 +25774,16 @@ } }; return next; - }, - die:function(reason){ + } + die(reason){ var next=game.createEvent('die'); next.player=this; next.reason=reason; if(reason) next.source=reason.source; next.setContent('die'); return next; - }, - revive:function(hp,log){ + } + revive(hp,log){ if(log!==false) game.log(this,'复活'); if(this.maxHp<1) this.maxHp=1; if(hp) this.hp=hp; @@ -24955,11 +25834,11 @@ delete ui.continue_game; } } - }, - isMad:function(){ + } + isMad(){ return this.hasSkill('mad'); - }, - goMad:function(end){ + } + goMad(end){ if(end){ this.addTempSkill('mad',end); } @@ -24967,14 +25846,14 @@ this.addSkill('mad'); } game.log(this,'进入混乱状态'); - }, - unMad:function(){ + } + unMad(){ this.removeSkill('mad'); - }, - tempHide:function(){ - this.addTempSkill('qianxing',{player:'phaseBegin'}); - }, - addExpose:function(num){ + } + tempHide(){ + this.addTempSkill('qianxing',{player:'phaseBeginStart'}); + } + addExpose(num){ if(typeof this.ai.shown=='number'&&!this.identityShown&&this.ai.shown<1){ this.ai.shown+=num; if(this.ai.shown>0.95){ @@ -24982,8 +25861,8 @@ } } return this; - }, - equip:function(card,draw){ + } + equip(card,draw){ var next=game.createEvent('equip'); next.card=card; next.player=this; @@ -25035,8 +25914,8 @@ return map; }; return next; - }, - addJudge:function(card,cards){ + } + addJudge(card,cards){ var next=game.createEvent('addJudge'); if(get.itemtype(card)=='card'){ next.card=card; @@ -25094,8 +25973,8 @@ return map; }; return next; - }, - canAddJudge:function(card){ + } + canAddJudge(card){ if(this.isDisabledJudge()) return false; var name; if(typeof card=='string'){ @@ -25110,8 +25989,8 @@ var mod=game.checkMod(card,this,this,'unchanged','targetEnabled',this); if(mod!='unchanged') return mod; return true; - }, - addJudgeNext:function(card,unlimited){ + } + addJudgeNext(card,unlimited){ if(!card.expired){ let target=this.next; const name=card.viewAs||card.name; @@ -25146,8 +26025,8 @@ else{ card.expired=false; } - }, - judge:function(){ + } + judge(){ var next=game.createEvent('judge'); next.player=this; for(var i=0;i0?'markSkill':'unmarkSkill'](name); } } - }, - unmarkAuto:function(name,info){ + } + unmarkAuto(name,info){ var storage=this.storage[name] if(Array.isArray(info)&&Array.isArray(storage)){ storage.removeArray(info.slice(0)); this.markAuto(name); } - }, - getExpansions:function(tag){ + } + getExpansions(tag){ return this.getCards('x',(card)=>card.hasGaintag(tag)); - }, - countExpansions:function(tag){ + } + countExpansions(tag){ return this.getExpansions(tag).length; - }, - hasExpansions:function(tag){ + } + hasExpansions(tag){ return this.countExpansions(tag)>0; - }, - setStorage:function(name,value,mark){ + } + setStorage(name,value,mark){ this.storage[name]=value; if(mark) this.markAuto(name); return value; - }, - getStorage:function(name){ + } + getStorage(name){ return this.storage[name]||[]; - }, - hasStorage:function(name,value){ + } + hasStorage(name,value){ if(!(name in this.storage)) return false; if(typeof value=="undefined") return true; const storage=this.storage[name]; if(storage===value) return true; return Array.isArray(storage) && storage.includes(value); - }, - hasStorageAny:function(name,values){ + } + hasStorageAny(name,values){ const storage=this.storage[name]; if(!Array.isArray(values)) values=Array.from(arguments).slice(1); if(!storage) return false; if (!Array.isArray(storage)) return values.contains(storage); return values.some(item => storage.contains(item)); - }, - hasStorageAll:function(name,values){ + } + hasStorageAll(name,values){ const storage=this.storage[name]; if(!Array.isArray(values)) values=Array.from(arguments).slice(1); if(!storage) return false; if (!Array.isArray(storage)) return false; return values.every(item => storage.contains(item)); - }, - initStorage:function(name,value,mark){ + } + initStorage(name,value,mark){ return this.hasStorage(name)?this.getStorage(name):this.setStorage(name,value,mark); - }, - updateStorage:function(name,operation,mark){ + } + updateStorage(name,operation,mark){ return this.setStorage(name,operation(this.getStorage(name)),mark); - }, - updateStorageAsync:function(name,operation,mark){ + } + updateStorageAsync(name,operation,mark){ return Promise.resolve(this.getStorage(name)) .then(value=>operation(value)) .then(value=>this.setStorage(name,value,mark)); - }, - removeStorage:function(name,mark){ + } + removeStorage(name,mark){ if(!this.hasStorage(name)) return false; delete this.storage[name] if(mark){ this.unmarkSkill(name); } return true; - }, - markSkill:function(name,info,card){ + } + markSkill(name,info,card,nobroadcast){ if(info===true){ this.syncStorage(name); info=null; @@ -25708,10 +26587,8 @@ else{ game.addVideo('markSkill',this,[name]); } - game.broadcastAll(function(storage,player,name,info,card){ - if(storage!=undefined){ - player.storage[name]=storage; - } + const func=function(storage,player,name,info,card){ + player.storage[name]=storage; if(!info){ if(player.marks[name]){ player.updateMarks(); @@ -25736,12 +26613,14 @@ } } player.updateMarks(); - },this.storage[name],this,name,info,card); + }; + func(this.storage[name],this,name,info,card); + if(!nobroadcast) game.broadcast(func,this.storage[name],this,name,info,card); return this; - }, - unmarkSkill:function(name){ + } + unmarkSkill(name,nobroadcast){ game.addVideo('unmarkSkill',this,name); - game.broadcast(function(player,name){ + if(!nobroadcast) game.broadcast(function(player,name){ if(player.marks[name]){ player.marks[name].delete(); player.marks[name].style.transform+=' scale(0.2)'; @@ -25755,7 +26634,7 @@ delete this.marks[name]; ui.updatem(this); var info=lib.skill[name]; - if(info&&info.intro&&info.intro.onunmark){ + if(!game.online&&info&&info.intro&&info.intro.onunmark){ if(info.intro.onunmark=='throw'){ if(get.itemtype(this.storage[name])=='cards'){ this.$throw(this.storage[name],1000); @@ -25771,12 +26650,12 @@ } } return this; - }, - markSkillCharacter:function(id,target,name,content){ + } + markSkillCharacter(id,target,name,content,nobroadcast){ if(typeof target=='object'){ target=target.name; } - game.broadcastAll(function(player,target,name,content,id){ + const func=function(player,target,name,content,id){ if(player.marks[id]){ player.marks[id].name=name+'_charactermark'; player.marks[id]._name=target; @@ -25807,10 +26686,12 @@ target:target }); } - },this,target,name,content,id); + } + func(this,target,name,content,id); + if(!nobroadcast) game.broadcast(func,this,target,name,content,id); return this; - }, - markCharacter:function(name,info,learn,learn2){ + } + markCharacter(name,info,learn,learn2){ if(typeof name=='object'){ name=name.name; } @@ -25846,8 +26727,8 @@ } ui.updatem(this); return node; - }, - mark:function(name,info,skill){ + } + mark(name,info,skill){ if(get.itemtype(name)=='cards'){ var marks=[]; for(var i=0;i0; - }, - getUseValue:function(card,distance,includecard){ + } + getUseValue(card,distance,includecard){ if(typeof(card)=='string'){ card={name:card,isCard:true}; } @@ -26011,8 +26892,8 @@ min+=value[i]; } return min; - }, - addSubPlayer:function(cfg){ + } + addSubPlayer(cfg){ var skill='subplayer_'+cfg.name+'_'+get.id(); game.log(this,'获得了随从','#g'+get.translation(cfg.name)) cfg.hs=cfg.hs||[]; @@ -26050,8 +26931,8 @@ game.addVideo('addSubPlayer',this,[skill,lib.skill[skill],lib.character[skill],lib.translate[skill],{name:cfg.name}]); this.addSkill(skill); return skill; - }, - removeSubPlayer:function(name){ + } + removeSubPlayer(name){ if(this.hasSkill('subplayer')&&this.name==name){ this.exitSubPlayer(true); } @@ -26064,8 +26945,8 @@ game.log(player,'牺牲了随从','#g'+name); _status.event.trigger('removeSubPlayer'); } - }, - callSubPlayer:function(){ + } + callSubPlayer(){ if(this.hasSkill('subplayer')) return; var next=game.createEvent('callSubPlayer'); next.player=this; @@ -26076,8 +26957,8 @@ } next.setContent('callSubPlayer'); return next; - }, - toggleSubPlayer:function(){ + } + toggleSubPlayer(){ if(!this.hasSkill('subplayer')) return; var next=game.createEvent('toggleSubPlayer'); next.player=this; @@ -26088,16 +26969,16 @@ } next.setContent('toggleSubPlayer'); return next; - }, - exitSubPlayer:function(remove){ + } + exitSubPlayer(remove){ if(!this.hasSkill('subplayer')) return; var next=game.createEvent('exitSubPlayer'); next.player=this; next.remove=remove; next.setContent('exitSubPlayer'); return next; - }, - getSubPlayers:function(tag){ + } + getSubPlayers(tag){ var skills=this.getSkills(); var list=[]; for(var i=0;i{ + if(key===skillkey) return false; + if(Array.isArray(player.additionalSkills[key])) return player.additionalSkills[key].includes(skill); + return player.additionalSkills[key]==skill; + })) + } if(Array.isArray(additionalSkills)&&typeof target=='string'){ if(additionalSkills.contains(target)){ additionalSkills.remove(target); - if(!this.skills.contains(target)&&!this.tempSkills[target]) this.removeSkill(target); + if(!hasAnotherSKill(skill,target)) this.removeSkill(target); } } else{ delete this.additionalSkills[skill]; if(typeof additionalSkills=='string'){ - if(!this.skills.contains(additionalSkills)&&!this.tempSkills[additionalSkills]) this.removeSkill(additionalSkills); + if(!hasAnotherSKill(skill,additionalSkills)) this.removeSkill(additionalSkills); } else if(Array.isArray(additionalSkills)){ - for(var i=0;i!hasAnotherSKill(skill,target)) + this.removeSkill(skillsToRemove); } } } _status.event.clearStepCache(); return this; - }, - awakenSkill:function(skill,nounmark){ + } + awakenSkill(skill,nounmark){ if(!nounmark) this.unmarkSkill(skill); this.disableSkill(skill+'_awake',skill); this.awakenedSkills.add(skill); if(this.storage[skill]===false) this.storage[skill]=true; _status.event.clearStepCache(); return this; - }, - restoreSkill:function(skill,nomark){ + } + restoreSkill(skill,nomark){ if(this.storage[skill]===true) this.storage[skill]=false; this.awakenedSkills.remove(skill); this.enableSkill(skill+'_awake',skill); if(!nomark) this.markSkill(skill); _status.event.clearStepCache(); return this; - }, - disableSkill:function(skill,skills){ + } + disableSkill(skill,skills){ if(typeof skills=='string'){ if(!this.disabledSkills[skills]){ this.disabledSkills[skills]=[]; @@ -26410,8 +27298,8 @@ } _status.event.clearStepCache(); return this; - }, - enableSkill:function(skill){ + } + enableSkill(skill){ for(var i in this.disabledSkills){ this.disabledSkills[i].remove(skill); if(this.disabledSkills[i].length==0){ @@ -26420,8 +27308,8 @@ } _status.event.clearStepCache(); return this; - }, - checkMarks:function(){ + } + checkMarks(){ var skills=this.getSkills(); game.expandSkills(skills); for(var i in this.marks){ @@ -26430,8 +27318,8 @@ } } return this; - }, - addEquipTrigger:function(card){ + } + addEquipTrigger(card){ if(card){ var info=get.info(card); if(info.skills){ @@ -26446,9 +27334,10 @@ this.addEquipTrigger(es[i]); } } + _status.event.clearStepCache(); return this; - }, - removeEquipTrigger:function(card){ + } + removeEquipTrigger(card){ if(card){ var info=get.info(card); var skills=this.getSkills(null,false); @@ -26471,9 +27360,10 @@ this.removeEquipTrigger(es[i]); } } + _status.event.clearStepCache(); return this; - }, - removeSkillTrigger:function(skill,triggeronly){ + } + removeSkillTrigger(skill,triggeronly){ var info=lib.skill[skill]; if(!info) return; if(typeof info.group=='string'){ @@ -26530,10 +27420,13 @@ } } } + if(_status.event&&_status.event.removeTrigger) _status.event.removeTrigger(skill,this); + _status.event.clearStepCache(); return this; - }, - removeSkill:function(skill){ + } + removeSkill(skill){ if(!skill) return; + _status.event.clearStepCache(); if(Array.isArray(skill)){ for(var i=0;i{ @@ -26755,8 +27649,8 @@ }) } return history.some(filter); - }, - getLastHistory:function(key,filter,last){ + } + getLastHistory(key,filter,last){ let history=false; for(let i=this.actionHistory.length-1;i>=0;i--){ if(this.actionHistory[i].isMe){ @@ -26776,8 +27670,8 @@ } return history.filter(filter); } - }, - checkAllHistory:function(key,filter,last){ + } + checkAllHistory(key,filter,last){ if(!key||!filter) return; this.actionHistory.forEach((value)=>{ let history=value[key]; @@ -26792,8 +27686,8 @@ history.forEach(filter); } }); - }, - getAllHistory:function(key,filter,last){ + } + getAllHistory(key,filter,last){ const history=[]; this.actionHistory.forEach((value)=>{ if(!key||!value[key]){ @@ -26814,8 +27708,8 @@ return history.filter(filter); } return history; - }, - hasAllHistory:function(key,filter,last){ + } + hasAllHistory(key,filter,last){ return this.actionHistory.some((value)=>{ let history=value[key]; if(last&&history.includes(last)){ @@ -26830,18 +27724,18 @@ } return false; }) - }, - getLastUsed:function(num){ + } + getLastUsed(num){ if(typeof num!='number') num=0; var history=this.getHistory('useCard'); if(history.length<=num) return null; return history[history.length-num-1]; - }, - getStat:function(key){ + } + getStat(key){ if(!key) return this.stat[this.stat.length-1]; return this.stat[this.stat.length-1][key]; - }, - getLastStat:function(key){ + } + getLastStat(key){ var stat=false; for(var i=this.stat.length-1;i>=0;i--){ if(this.stat[i].isMe){ @@ -26851,8 +27745,8 @@ if(!stat) return null if(!key) return stat; return stat[key]; - }, - queue:function(time){ + } + queue(time){ if(time==false){ clearTimeout(this.queueTimeout); this.queueCount=0; @@ -26873,8 +27767,8 @@ if(player==game.me) ui.me.removeAttribute('style'); } },time) - }, - getCardUsable:function(card,pure){ + } + getCardUsable(card,pure){ var player=this; if(typeof card=='string'){ card={name:card}; @@ -26888,8 +27782,8 @@ return num-player.countUsed(card); } return num; - }, - getAttackRange:function(raw){ + } + getAttackRange(raw){ const player=this; let range=0; if(raw){ @@ -26915,8 +27809,8 @@ } range=game.checkMod(player,range,'attackRange',player); return range; - }, - getEquipRange:function(cards){ + } + getEquipRange(cards){ const player=this; if(!cards) cards=player.getCards('e',function(card){ return !ui.selected.cards||!ui.selected.cards.contains(card); @@ -26940,8 +27834,8 @@ else return (isN1?range:newRange); },false); return (typeof range=='number')?range:1; - }, - getGlobalFrom:function(){ + } + getGlobalFrom(){ var player=this; var range=0; range=game.checkMod(player,player,range,'globalFrom',player); @@ -26956,8 +27850,8 @@ } } return (-range); - }, - getGlobalTo:function(){ + } + getGlobalTo(){ var player=this; var range=0; range=game.checkMod(player,player,range,'globalTo',player); @@ -26972,15 +27866,15 @@ } } return (range); - }, - getHandcardLimit:function(){ + } + getHandcardLimit(){ var num=Math.max(this.hp,0); num=game.checkMod(this,num,'maxHandcardBase',this); num=game.checkMod(this,num,'maxHandcard',this); num=game.checkMod(this,num,'maxHandcardFinal',this); return Math.max(0,num); - }, - getEnemies:function(func){ + } + getEnemies(func){ var player=this; var targets; var mode=get.mode(); @@ -27051,8 +27945,8 @@ } targets.remove(player); return targets; - }, - getFriends:function(func){ + } + getFriends(func){ var player=this; var targets; var mode=get.mode(); @@ -27123,11 +28017,11 @@ targets.remove(player); } return targets; - }, - isEnemyOf:function(){ + } + isEnemyOf(){ return !this.isFriendOf.apply(this,arguments); - }, - isFriendOf:function(player){ + } + isFriendOf(player){ if(get.mode()=='guozhan'){ if(this==player) return true; if(this.getStorage('yexinjia_friend').includes(player)||player.getStorage('yexinjia_friend').includes(this)) return true; @@ -27142,111 +28036,111 @@ return this.side==player.side; } return this==player; - }, - isFriendsOf:function(player){ + } + isFriendsOf(player){ return player.getFriends(true).contains(this); - }, - isEnemiesOf:function(player){ + } + isEnemiesOf(player){ return player.getEnemies().contains(this); - }, - isAlive:function(){ + } + isAlive(){ return this.classList.contains('dead')==false; - }, - isDead:function(){ + } + isDead(){ return this.classList.contains('dead'); - }, - isDying:function(){ + } + isDying(){ return _status.dying.contains(this)&&this.hp<=0&&this.isAlive(); - }, - isDamaged:function(){ + } + isDamaged(){ return this.hp=this.maxHp||this.storage.nohp; - }, - isMaxHp:function(only,raw){ + } + isMaxHp(only,raw){ return game.players.every(value=>{ if(value.isOut()||value==this) return true; return only?value.getHp(raw){ if(value.isOut()||value==this) return true; return only?value.getHp(raw)>this.getHp(raw):value.getHp(raw)>=this.getHp(raw); }); - }, - isMaxCard:function(only){ + } + isMaxCard(only){ const numberOfCards=this.countCards('he'); return game.players.every(value=>{ if(value.isOut()||value==this) return true; return only?value.countCards('he'){ if(value.isOut()||value==this) return true; return only?value.countCards('he')>numberOfCards:value.countCards('he')>=numberOfCards; }); - }, - isMaxHandcard:function(only){ + } + isMaxHandcard(only){ const numberOfHandCards=this.countCards('h'); return game.players.every(value=>{ if(value.isOut()||value==this) return true; return only?value.countCards('h'){ if(value.isOut()||value==this) return true; return only?value.countCards('h')>numberOfHandCards:value.countCards('h')>=numberOfHandCards; }); - }, - isMaxEquip:function(only){ + } + isMaxEquip(only){ const numberOfEquipAreaCards=this.countCards('e'); return game.players.every(value=>{ if(value.isOut()||value==this) return true; return only?value.countCards('e'){ if(value.isOut()||value==this) return true; return only?value.countCards('e')>numberOfEquipAreaCards:value.countCards('e')>=numberOfEquipAreaCards; }); - }, - isLinked:function(){ + } + isLinked(){ if(get.is.linked2(this)){ return this.classList.contains('linked2'); } return this.classList.contains('linked'); - }, - isTurnedOver:function(){ + } + isTurnedOver(){ return this.classList.contains('turnedover'); - }, - isOut:function(){ + } + isOut(){ return this.classList.contains('out'); - }, - isMin:function(distance){ + } + isMin(distance){ if(distance&&lib.config.mode!='stone') return false; if(this.forcemin) return true; return this.classList.contains('minskin')&&!game.chess; - }, - isIn:function(){ + } + isIn(){ return this.classList.contains('dead')==false&&this.classList.contains('out')==false&&!this.removed; - }, - isUnseen:function(num){ + } + isUnseen(num){ switch(num){ case 0:return this.classList.contains('unseen'); case 1:return this.classList.contains('unseen2'); case 2:return this.classList.contains('unseen')||this.classList.contains('unseen2'); default:return this.classList.contains('unseen')&&(!this.name2||this.classList.contains('unseen2')); } - }, - isUnderControl:function(self,me){ + } + isUnderControl(self,me){ me=(me||game.me); var that=this._trueMe||this; if(that.isMad()||game.notMe) return false; @@ -27274,26 +28168,26 @@ return this.side==me.side; } return false; - }, - isOnline:function(){ + } + isOnline(){ if(this.ws&&lib.node&&!this.ws.closed&&this.ws.inited&&!this.isAuto){ return true; } return false; - }, - isOnline2:function(){ + } + isOnline2(){ if(this.ws&&lib.node&&!this.ws.closed){ return true; } return false; - }, - isOffline:function(){ + } + isOffline(){ if(this.ws&&lib.node&&this.ws.closed){ return true; } return false; - }, - checkShow:function(skill,showonly){ + } + checkShow(skill,showonly){ var sourceSkill=get.info(skill); var noshow=false; if(sourceSkill&&sourceSkill.sourceSkill){ @@ -27327,31 +28221,34 @@ } } return false; - }, - needsToDiscard:function(num){ + } + needsToDiscard(num){ if(typeof num!='number') num=0; return Math.max(0,num+this.countCards('h',card=>!this.canIgnoreHandcard(card))-this.getHandcardLimit()); - }, - distanceTo:function(target,method){ + } + distanceTo(target,method){ return get.distance(this,target,method); - }, - distanceFrom:function(target,method){ + } + distanceFrom(target,method){ return get.distance(target,this,method); - }, - hasSkill:function(skill,arg2,arg3,arg4){ + } + hasSkill(skill,arg2,arg3,arg4){ return game.expandSkills(this.getSkills(arg2,arg3,arg4)).contains(skill); - }, - hasStockSkill:function(skill,arg1,arg2,arg3){ + } + hasStockSkill(skill,arg1,arg2,arg3){ return game.expandSkills(this.getStockSkills(arg1,arg2,arg3)).contains(skill); - }, - isZhu2:function(){ + } + isZhu2(){ var player=this,mode=get.mode(); if(!this.isZhu) return false; - if(mode=='identity') return true; + if(mode=='identity'){ + if(_status.mode=='stratagem'&&!this.identityShown) return false; + return true; + } if(mode=='versus'&&(_status.mode=='four'||_status.mode=='guandu')) return true; return false; - }, - hasZhuSkill:function(skill,player){ + } + hasZhuSkill(skill,player){ if(!this.hasSkill(skill)) return false; if(player){ var mode=get.mode(); @@ -27363,8 +28260,8 @@ } } return true; - }, - hasGlobalTag:function(tag,arg){ + } + hasGlobalTag(tag,arg){ var skills=lib.skill.global.slice(0); game.expandSkills(skills); for(var i=0;i0){ @@ -27423,8 +28320,8 @@ } } return false; - }, - hasUnknown:function(num){ + } + hasUnknown(num){ var mode=get.mode(); if(typeof num!='number'){ num=0; @@ -27440,8 +28337,8 @@ } } return false; - }, - isUnknown:function(player){ + } + isUnknown(player){ var mode=get.mode(); if(mode=='identity'||mode=='guozhan'){ if(this.ai.shown==0&&this!=player){ @@ -27449,8 +28346,8 @@ } } return false; - }, - hasWuxie:function(info){ + } + hasWuxie(info){ if(this.countCards('hs','wuxie')) return true; var skills=this.getSkills('invisible').concat(lib.skill.global); game.expandSkills(skills); @@ -27474,27 +28371,35 @@ } } return false; - }, - hasSha:function(respond,noauto){ + } + hasSha(respond,noauto){ if(this.countCards('hs','sha')) return true; if(this.countCards('hs','hufu')) return true; if(!noauto&&this.countCards('hs','yuchanqian')) return true; if(this.hasSkillTag('respondSha',true,respond?'respond':'use',true)) return true; return this.hasUsableCard('sha'); - }, - hasShan:function(){ + } + hasShan(){ if(this.countCards('hs','shan')) return true; if(this.countCards('hs','hufu')) return true; if(this.hasSkillTag('respondShan',true,null,true)) return true; return this.hasUsableCard('shan'); - }, - mayHaveSha:function(viewer,type){ + } + mayHaveSha(viewer,type,ignore){ if((this.hp>2||!this.isZhu&&this.hp>1)&&this.hasSkillTag('respondSha',true,type,true)) return true; if(get.itemtype(viewer)!=='player') viewer=_status.event.player; - let cards; - if(this===viewer||get.itemtype(viewer)==='player'&&viewer.hasSkillTag('viewHandcard',null,this,true)) cards=this.getCards('h'); - else cards=this.getShownCards(); + let cards,selected=get.copy(ui.selected.cards); + if(get.itemtype(ignore)==='cards') selected.addArray(ignore); + else if(get.itemtype(ignore)==='card') selected.add(ignore); + /*if(this===viewer||get.itemtype(viewer)==='player'&&viewer.hasSkillTag('viewHandcard',null,this,true)) cards=this.getCards('h'); + else cards=this.getShownCards();*/ + if(this === viewer || get.itemtype(viewer) == 'player'){ + cards = this.getKnownCards(viewer); + }else{ + cards = this.getShownCards(); + } if(cards.some(card=>{ + if(selected.includes(card)) return false; let name=get.name(card,this); if(name=='sha'||name=='hufu'||name=='yuchanqian'){ if(type==='use') return lib.filter.cardEnabled(card,this); @@ -27503,17 +28408,25 @@ } return false; })) return true; - let hs=this.getCards('hs').removeArray(cards).length; + let hs=this.getCards('hs').filter(i=>!cards.includes(i)&&!selected.includes(i)).length; if(hs===0) return false; return Math.pow(hs+(this.isPhaseUsing()?6:4),2)>100*_status.event.getRand('mayHaveSha'); - }, - mayHaveShan:function(viewer,type){ + } + mayHaveShan(viewer,type,ignore){ if((this.hp>2||!this.isZhu&&this.hp>1)&&this.hasSkillTag('respondShan',true,type,true)) return true; if(get.itemtype(viewer)!=='player') viewer=_status.event.player; - let cards; - if(this===viewer||get.itemtype(viewer)==='player'&&viewer.hasSkillTag('viewHandcard',null,this,true)) cards=this.getCards('h'); - else cards=this.getShownCards(); + let cards,selected=get.copy(ui.selected.cards); + if(get.itemtype(ignore)==='cards') selected.addArray(ignore); + else if(get.itemtype(ignore)==='card') selected.add(ignore); + /*if(this===viewer||get.itemtype(viewer)==='player'&&viewer.hasSkillTag('viewHandcard',null,this,true)) cards=this.getCards('h'); + else cards=this.getShownCards();*/ + if(this === viewer || get.itemtype(viewer) == 'player'){ + cards = this.getKnownCards(viewer); + }else{ + cards = this.getShownCards(); + } if(cards.some(card=>{ + if(selected.includes(card)) return false; let name=get.name(card,this); if(name==='shan'||name==='hufu'){ if(type==='use') return lib.filter.cardEnabled(card,this); @@ -27522,11 +28435,11 @@ } return false; })) return true; - let hs=this.getCards('hs').removeArray(cards).length; + let hs=this.getCards('hs').filter(i=>!cards.includes(i)&&!selected.includes(i)).length; if(hs===0) return false; return Math.pow(hs+(this.isPhaseUsing()?3:5),2)>100*_status.event.getRand('mayHaveShan'); - }, - hasCard:function(name,position){ + } + hasCard(name,position){ if(typeof name=='function'){ var hs=this.getCards(position); for(var i=0;i0&&cardnum<14){ - cardnum=['A','2','3','4','5','6','7','8','9','10','J','Q','K'][cardnum-1]; - } + if(!lib.card[card[2]]){ lib.card[card[2]]={}; } @@ -29204,13 +30200,50 @@ } delete info.global; } + this.suit=card[0]; + this.number=parseInt(card[1])||0; + this.name=card[2]; + + if(info.destroy&&(typeof info.destroy!='boolean'&&!lib.skill[info.destroy])){ + this.destroyed=info.destroy; + } + + if(_status.connectMode&&!game.online&&lib.cardOL&&!this.cardid){ + this.cardid=get.id(); + lib.cardOL[this.cardid]=this; + } + if(!_status.connectMode&&!_status.video){ + this.cardid=get.id(); + } + + this.$init(card); + + if(this.inits){ + for(var i=0;i0&&cardnum<14){ + cardnum=['A','2','3','4','5','6','7','8','9','10','J','Q','K'][cardnum-1]; + } if(this.name){ this.classList.remove('epic'); this.classList.remove('legend'); this.classList.remove('gold'); this.classList.remove('unique'); this.style.background=''; - var subtype=get.subtype(this); + var subtype=get.subtype(this,false); if(subtype){ this.classList.remove(subtype); } @@ -29442,9 +30475,6 @@ } } this.node.name2.innerHTML=get.translation(card[0])+cardnum+' '+name; - this.suit=card[0]; - this.number=parseInt(card[1])||0; - this.name=card[2]; this.classList.add('card'); if(card[3]){ let natures=get.natureList(card[3]); @@ -29456,14 +30486,8 @@ delete this.nature; } if(info.subtype) this.classList.add(info.subtype); - if(this.inits){ - for(var i=0;ithis._knowers.add(p.playerid)); + } + } + } + removeKnower(player){ + if(!this._knowers){ + return; + } + if(typeof player == 'string'){ + this._knowers.remove(player); + }else{ + let type = get.itemtype(player); + if(type == 'player'){ + this._knowers.remove(player.playerid); + }else if(type == 'players'){ + player.forEach(p=>this._knowers.remove(p.playerid)); + } + } + } + //清除此牌的知情者。 + clearKnowers(){ + if(this._knowers)delete this._knowers; + } + //判断玩家对此牌是否知情。 + isKnownBy(player){ + if(['e','j'].includes(get.position(this)))return true;//装备区或者判定区的牌,必知情。 + let owner = get.owner(this); + if(owner){ + if(owner == player)return true;//是牌主,必知情。 + if(player.hasSkillTag('viewHandcard',null,owner,true))return true;//有viewHandcard标签,必知情。 + if(owner.isUnderControl(true,player))return true;//被操控,必知情。 + } + if(get.is.shownCard(this))return true;//此牌是明置牌,必知情。 + if(this._knowers){ + return this._knowers.includes('everyone') || this._knowers.includes(player.playerid); + } + return false; + } + getSource(name){ if(this.name==name) return true; var info=lib.card[this.name]; if(info&&Array.isArray(info.source)){ return info.source.contains(name); } return false; - }, - moveDelete:function(player){ + } + moveDelete(player){ this.fixed=true; if(!this._listeningEnd||this._transitionEnded){ this.moveTo(player); @@ -29572,8 +30639,8 @@ else{ this._onEndMoveDelete=player; } - }, - moveTo:function(player){ + } + moveTo(player){ this.fixed=true; var dx,dy; if(this.classList.contains('center')){ @@ -29606,13 +30673,17 @@ this.style.transform='translate('+dx+'px,'+dy+'px)'; } return this; - }, - copy:function(){ + } + copy(){ + /** + * @type {Card} + */ var node=this.cloneNode(true); node.style.transform=''; node.name=this.name; node.suit=this.suit; node.number=this.number; + node.nature=this.nature; node.classList.remove('hidden'); node.classList.remove('start'); node.classList.remove('thrown'); @@ -29637,26 +30708,26 @@ else if(get.objtype(arguments[i])=='div') position=arguments[i]; else if(typeof arguments[i]=='boolean') clone=arguments[i]; } - node.moveTo=lib.element.card.moveTo; - node.moveDelete=lib.element.card.moveDelete; + node.moveTo=lib.element.Card.prototype.moveTo; + node.moveDelete=lib.element.Card.prototype.moveDelete; if(clone) this.clone=node; if(position) position.appendChild(node); return node; - }, - uncheck:function(skill){ + } + uncheck(skill){ if(skill) this._uncheck.add(skill); this.classList.add('uncheck'); - }, - recheck:function(skill){ + } + recheck(skill){ if(skill) this._uncheck.remove(skill); else this._uncheck.length=0; if(this._uncheck.length==0) this.classList.remove('uncheck'); - }, - discard:function(bool){ - if(!this.destroyed){ + } + discard(bool){ + if(!this._selfDestroyed){ + this.fix(); ui.discardPile.appendChild(this); } - this.fix(); this.classList.remove('glow'); if(bool===false){ ui.cardPile.insertBefore(this,ui.cardPile.childNodes[Math.floor(Math.random()*ui.cardPile.childNodes.length)]); @@ -29666,74 +30737,345 @@ _status.discarded.add(this); } } - }, - hasTag:function(tag){ + } + hasTag(tag){ if(this.cardid&&_status.cardtag&&_status.cardtag[tag]&&_status.cardtag[tag].contains(this.cardid)){ return true; } return false; - }, - hasPosition:function(){ + } + hasPosition(){ return ['h','e','j','s','x'].contains(get.position(this)); - }, - isInPile:function(){ + } + isInPile(){ return ['c','d'].contains(get.position(this)); } }, - button:{ - exclude:function(){ + VCard:class{ + /** + * @param {any} [suitOrCard] + * @param {number | Card[]} [numberOrCards] + * @param {string} [name] + * @param {string} [nature] + */ + constructor(suitOrCard,numberOrCards,name,nature){ + if(Array.isArray(suitOrCard)){ + /** + * @type {string} + */ + this.suit=suitOrCard[0]; + /** + * @type {number} + */ + this.number=suitOrCard[1]; + /** + * @type {string} + */ + this.name=suitOrCard[2]; + /** + * @type {string} + */ + this.nature=suitOrCard[3]; + } + else if(get.itemtype(suitOrCard)=='card'){ + this.name=get.name(suitOrCard); + this.suit=get.suit(suitOrCard); + this.color=get.color(suitOrCard); + this.number=get.number(suitOrCard); + this.nature=get.nature(suitOrCard); + this.isCard=true; + this.cardid=suitOrCard.cardid; + this.wunature=suitOrCard.wunature; + /** + * @type {Record} + */ + this.storage=get.copy(suitOrCard.storage); + if(Array.isArray(numberOrCards)) this.cards=numberOrCards.slice(); + else this.cards=[suitOrCard]; + const info=get.info(this,false); + if(info){ + const autoViewAs=info.autoViewAs; + if(typeof autoViewAs=='string') this.name=autoViewAs; + } + } + else if(suitOrCard&&typeof suitOrCard!='string'){ + Object.keys(suitOrCard).forEach(key=>{ + const propertyDescriptor=Object.getOwnPropertyDescriptor(suitOrCard,key),value=propertyDescriptor.value; + if(Array.isArray(value)) this[key]=value.slice(); + else Object.defineProperty(this,key,propertyDescriptor); + }); + if(Array.isArray(numberOrCards)){ + const noCards=!this.cards; + /** + * @type {Card[]} + */ + this.cards=numberOrCards.slice(); + if(noCards){ + if(!lib.suits.includes(this.suit)) this.suit=get.suit(this); + if(!Object.keys(lib.color).includes(this.color)) this.color=get.color(this); + if(typeof this.number!='number') this.number=get.number(this); + if(!this.nature) this.nature=get.nature(this); + } + } + const info=get.info(this,false); + if(info){ + const autoViewAs=info.autoViewAs; + if(typeof autoViewAs=='string') this.name=autoViewAs; + } + } + if(typeof suitOrCard=='string') this.suit=suitOrCard; + if(typeof numberOrCards=='number') this.number=numberOrCards; + if(typeof name=='string') this.name=name; + if(typeof nature=='string') this.nature=nature; + if(!this.storage) this.storage={}; + if(!this.cards) this.cards=[]; + } + sameSuitAs(card){ + return get.suit(this)==get.suit(card); + } + differentSuitFrom(card){ + return get.suit(this)!=get.suit(card); + } + sameNumberAs(card){ + return get.number(this)==get.number(card); + } + differentNumberFrom(card){ + return get.number(this)!=get.number(card); + } + sameNameAs(card){ + return get.name(this)==get.name(card); + } + differentNameFrom(card){ + return get.name(this)!=get.name(card); + } + /** + * @param {Player} player + */ + hasNature(nature,player){ + const natures=get.natureList(this,player); + if(!nature) return natures.length>0; + if(nature=='linked') return natures.some(n=>lib.linked.includes(n)); + return get.is.sameNature(natures,nature); + } + }, + Button:class extends HTMLDivElement{ + /** + * @param {{}} item + * @param {keyof typeof ui.create.buttonPresets | (item: {}, type: Function, position?: HTMLDivElement, noClick?: true, button?: HTMLDivElement) => HTMLDivElement} type + * @param {HTMLDivElement} [position] + * @param {true} [noClick] + * @param {HTMLDivElement} [button] + */ + constructor(item,type,position,noClick,button){ + if(ui.create.buttonPresets[type]) button=ui.create.buttonPresets[type](item,type,position,noClick,button); + else if(typeof type=='function') button=type(item,type,position,noClick,button); + Object.setPrototypeOf(button,lib.element.Button.prototype); + if(!noClick) button.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.button); + else{ + button.classList.add('noclick'); + const intro=button.querySelector('.intro'); + if(intro) intro.remove(); + } + return button; + } + exclude(){ if(_status.event.excludeButton==undefined){ _status.event.excludeButton=[]; } _status.event.excludeButton.add(this); } + get updateTransform(){ + return lib.element.Card.prototype.updateTransform; + } }, - event:{ - changeToZero:function(){ + GameEvent:class{ + /** + * @param {string} [name] + * @param {false} [trigger] + */ + constructor(name,trigger){ + if(typeof name=='string'){ + this.name=name; + const gameEvent=get.event(); + if(gameEvent){ + const type=`onNext${name[0].toUpperCase()}${name.slice(1)}`; + if(gameEvent.hasHandler(type)) this.pushHandler(...gameEvent.getHandler(type)); + } + } + this.step=0; + this.finished=false; + /** + * @type {GameEvent[]} + */ + this.next=[]; + /** + * @type {GameEvent[]} + */ + this.after=[]; + this.custom={ + add:{}, + replace:{} + }; + this._aiexclude=[]; + this._notrigger=[]; + this._result={}; + this._set=[]; + if(trigger!==false&&!game.online) this._triggered=0; + } + static initialGameEvent(){ + return new lib.element.GameEvent().finish(); + } + /** + * @param {keyof this} key + * @param {number} [value] + * @param {number} [baseValue] + */ + addNumber(key,value,baseValue){ + if(typeof value!='number') value=0; + if(typeof this[key]=='number') this[key]+=value; + else{ + if(typeof baseValue!='number') baseValue=0; + this[key]=baseValue+value; + } + return this; + } + /** + * @param {keyof this} key + * @param {number} [baseValue] + */ + decrease(key,baseValue){ + if(typeof this[key]=='number') this[key]--; + else this.subtractNumber(key,1,baseValue); + return this; + } + /** + * @param {keyof this} key + * @param {number} [baseValue] + */ + increase(key,baseValue){ + if(typeof this[key]=='number') this[key]++; + else this.addNumber(key,1,baseValue); + return this; + } + /** + * @param {keyof this} key + * @param {number} [value] + * @param {number} [baseValue] + */ + subtractNumber(key,value,baseValue){ + if(typeof value!='number') value=0; + if(typeof this[key]=='number') this[key]-=value; + else{ + if(typeof baseValue!='number') baseValue=0; + this[key]=baseValue-value; + } + return this; + } + /** + * @param {Parameters[0]} type + * @param {GameEvent} event + * @param {{ + * state?: 'begin' | 'end'; + * }} option + * @returns {this} + */ + callHandler(type,event,option){ + if(this.hasHandler(type)) this.getHandler(type).forEach(handler=>{ + if(typeof handler=='function') handler(event,option); + }); + return this; + } + getDefaultHandlerType(){ + const eventName=this.name; + if(eventName) return `on${eventName[0].toUpperCase()}${eventName.slice(1)}`; + } + /** + * @param {Parameters[0]} [type] + * @returns {((event: GameEvent, option: { + * state?: 'begin' | 'end'; + * }) => void)[]} + */ + getHandler(type){ + if(!type) type=this.getDefaultHandlerType(); + const currentHandler=this[type]; + if(!currentHandler) this[type]=[]; + else if(!Array.isArray(currentHandler)) this[type]=[currentHandler]; + return this[type]; + } + /** + * @param {`on${Capitalize}`} [type] + */ + hasHandler(type){ + if(!type) type=this.getDefaultHandlerType(); + return Boolean(this[type]&&this.getHandler(type).length); + } + /** + * @overload + * @param {...((event: GameEvent, option: { + * state?: 'begin' | 'end'; + * }) => void)[]} handlers + * @returns {number} + */ + /** + * @overload + * @param {Parameters[0]} type + * @param {...((event: GameEvent, option: { + * state?: 'begin' | 'end'; + * }) => void)[]} handlers + * @returns {number} + */ + pushHandler(type){ + return typeof type=='string'?this.getHandler(type).push(...Array.from(arguments).slice(1)):this.getHandler().push(...arguments); + } + changeToZero(){ this.num=0; this.numFixed=true; - }, - finish:function(){ + return this; + } + finish(){ this.finished=true; - }, - putStepCache:function(key,value){ + return this; + } + putStepCache(key,value){ if(!this._stepCache){ - this._stepCache = {}; + this._stepCache={}; } - this._stepCache[key] = value; - }, - getStepCache:function(key){ - if(!this._stepCache)return undefined; + this._stepCache[key]=value; + return this; + } + getStepCache(key){ + if(!this._stepCache) return undefined; return this._stepCache[key]; - }, - clearStepCache:function(key){ - if(key !== undefined && key !== null){ + } + clearStepCache(key){ + if(key!==undefined&&key!==null){ delete this._stepCache[key]; } delete this._stepCache; - }, - callFuncUseStepCache:function(prefix,func,params){ - if(typeof func != 'function')return; - if(_status.closeStepCache)return func.apply(null,params); - var cacheKey = "["+prefix+"]"+get.paramToCacheKey.apply(null,params); - var ret = this.getStepCache(cacheKey); - if(ret === undefined || ret === null){ - ret = func.apply(null,params); + return this; + } + callFuncUseStepCache(prefix,func,params){ + if(typeof func!='function') return; + if(_status.closeStepCache) return func.apply(null,params); + var cacheKey="["+prefix+"]"+get.paramToCacheKey.apply(null,params); + var ret=this.getStepCache(cacheKey); + if(ret===undefined||ret===null){ + ret=func.apply(null,params); this.putStepCache(cacheKey,ret); } return ret; - }, - putTempCache:function(key1,key2,value){ + } + putTempCache(key1,key2,value){ if(!this._tempCache){ - this._tempCache = {}; + this._tempCache={}; } if(!this._tempCache[key1]){ - this._tempCache[key1] = {}; + this._tempCache[key1]={}; } - this._tempCache[key1][key2] = value; + this._tempCache[key1][key2]=value; return value; - }, - getTempCache:function(key1,key2){ + } + getTempCache(key1,key2){ if(!this._tempCache){ return undefined; } @@ -29741,41 +31083,47 @@ return undefined; } return this._tempCache[key1][key2]; - }, - cancel:function(arg1,arg2,notrigger){ + } + cancel(arg1,arg2,notrigger){ this.untrigger(arg1,arg2); this.finish(); if(notrigger!='notrigger'){ this.trigger(this.name+'Cancelled'); - if(this.player&&lib.phaseName.contains(this.name)) this.player.getHistory('skipped').add(this.name)} - }, - neutralize:function(event){ + if(this.player&&lib.phaseName.contains(this.name)) this.player.getHistory('skipped').add(this.name); + } + return this; + } + neutralize(event){ this.untrigger(); this.finish(); this._neutralized=true; this.trigger('eventNeutralized'); this._neutralize_event=event||_status.event; - }, - unneutralize:function(){ + return this; + } + unneutralize(){ this.untrigger(); delete this._neutralized; delete this.finished; if(this.type=='card'&&this.card&&this.name=='sha') this.directHit=true; - }, - goto:function(step){ + return this; + } + goto(step){ this.step=step-1; - }, - redo:function(){ + return this; + } + redo(){ this.step--; - }, - setHiddenSkill:function(skill){ + return this; + } + setHiddenSkill(skill){ if(!this.player) return this; var hidden=this.player.hiddenSkills.slice(0); game.expandSkills(hidden); if(hidden.contains(skill)) this.set('hsskill',skill); return this; - }, - set:function(key,value){ + } + set(key,value){ if(arguments.length==1&&Array.isArray(arguments[0])){ for(var i=0;i | Function | keyof typeof lib.element.content} item + */ + setContent(item){ switch(typeof item){ case "object": case "function": @@ -29814,15 +31165,15 @@ break; } return this; - }, - getLogv:function(){ + } + getLogv(){ for(var i=1;i<=3;i++){ var event=this.getParent(i); if(event&&event.logvid) return event.logvid; } return null; - }, - send:function(){ + } + send(){ this.player.send(function(name,args,set,event,skills){ game.me.applySkills(skills); var next=game.me[name].apply(game.me,args); @@ -29838,13 +31189,15 @@ get.stringifiedResult(this.parent),get.skillState(this.player)); this.player.wait(); game.pause(); - }, - resume:function(){ + return this; + } + resume(){ delete this._cardChoice; delete this._targetChoice; delete this._skillChoice; - }, - getParent:function(level,forced){ + return this; + } + getParent(level,forced){ var parent,historys=[]; if(this._modparent&&game.online){ parent=this._modparent; @@ -29877,11 +31230,11 @@ return null; } return parent; - }, - getTrigger:function(){ + } + getTrigger(){ return this.getParent()._trigger; - }, - getRand:function(name){ + } + getRand(name){ if(name){ if(!this._rand_map) this._rand_map={}; if(!this._rand_map[name]) this._rand_map[name]=Math.random(); @@ -29889,25 +31242,22 @@ } if(!this._rand) this._rand=Math.random(); return this._rand; - }, - insert:function(func,map){ - var next=game.createEvent(this.name+'Inserted',false,this); - next.setContent(func); - for(var i in map){ - next.set(i,map[i]); - } + } + insert(content,map){ + const next=new lib.element.GameEvent(`${this.name}Inserted`,false); + this.next.push(next); + next.setContent(content); + Object.entries(map).forEach(entry=>next.set(entry[0],entry[1])); return next; - }, - insertAfter:function(func,map){ - var next=game.createEvent(this.name+'Inserted',false,{next:[]}); + } + insertAfter(content,map){ + const next=new lib.element.GameEvent(`${this.name}Inserted`,false); this.after.push(next); - next.setContent(func); - for(var i in map){ - next.set(i,map[i]); - } + next.setContent(content); + Object.entries(map).forEach(entry=>next.set(entry[0],entry[1])); return next; - }, - backup:function(skill){ + } + backup(skill){ this._backup={ filterButton:this.filterButton, selectButton:this.selectButton, @@ -30028,8 +31378,9 @@ delete this._cardChoice; delete this._targetChoice; delete this._skillChoice; - }, - restore:function(){ + return this; + } + restore(){ if(this._backup){ this.filterButton=this._backup.filterButton; this.selectButton=this._backup.selectButton; @@ -30054,29 +31405,30 @@ delete this.skill; delete this.ignoreMod; delete this.filterCard2; - }, - isMine:function(){ + return this; + } + isMine(){ return (this.player&&this.player==game.me&&!_status.auto&&!this.player.isMad()&&!game.notMe); - }, - isOnline:function(){ + } + isOnline(){ return (this.player&&this.player.isOnline()); - }, - notLink:function(){ + } + notLink(){ return this.getParent().name!='_lianhuan'&&this.getParent().name!='_lianhuan2'; - }, - isPhaseUsing:function(player){ + } + isPhaseUsing(player){ var evt=this.getParent('phaseUse'); if(!evt||evt.name!='phaseUse') return false; return !player||player==evt.player; - }, - addTrigger:function(skill,player){ - if(!player) return; + } + addTrigger(skill,player){ + if(!player||!skill) return this; var evt=this; + if(typeof skill=='string') skill=[skill]; + game.expandSkills(skill); while(true){ var evt=evt.getParent('arrangeTrigger'); - if(!evt||evt.name!='arrangeTrigger'||!evt.map) return; - if(typeof skill=='string') skill=[skill]; - game.expandSkills(skill); + if(!evt||evt.name!='arrangeTrigger'||!evt.map) return this; var filter=function(content){ if(typeof content=='string') return content==triggername; return content.contains(triggername); @@ -30090,7 +31442,7 @@ if(evt.map[i].player==player){map=evt.map[i];break;} } } - if(!map) return; + if(!map) return this; var func=function(skillx){ var info=lib.skill[skillx]; var bool=false; @@ -30117,10 +31469,83 @@ func(skill[j]); } } - }, - trigger:function(name){ - if(_status.video) return; - if((this.name==='gain'||this.name==='lose')&&!_status.gameDrawed) return; + return this; + } + removeTrigger(skill,player){ + if(!player||!skill) return; + var evt=this; + if(typeof skill=='string') skill=[skill]; + game.expandSkills(skill); + while(true){ + var evt=evt.getParent('arrangeTrigger'); + if(!evt||evt.name!='arrangeTrigger'||!evt.map) return; + var filter=function(content){ + if(typeof content=='string') return content==triggername; + return content.contains(triggername); + }; + var trigger=evt._trigger; + var triggername=evt.triggername; + var map=false; + if(evt.doing&&evt.doing.player==player) map=evt.doing; + else{ + for(var i=0;i{ + return i[0]==skillx&&i[1]==player; + }); + if(toremove.length>0) map.list.removeArray(toremove); + } + for(var j=0;j{ + return i[0]==skillx&&i[1]==player; + }); + if(toremove.length>0) map.list.removeArray(toremove); + } + for(var j=0;j} + */ + this._result; + /** + * @type {number} + */ + this.baseDamage; + /** + * @type {Player} + */ + this.customSource; + /** + * @type {number} + */ + this.extraDamage; + /** + * @type {string} + */ + this.nature; + /** + * @type {boolean} + */ + this.notrigger; + /** + * @type {number} + */ + this.original_num; + /** + * @type {boolean} + */ + this.unreal; + throw new Error('Do not call this method'); } }, - dialog:{ - add:function(item,noclick,zoom){ + Dialog:class extends HTMLDivElement{ + constructor(){ + let hidden=false; + let noTouchScroll=false; + let forceButton=false; + let noForceButton=false; + const dialog=ui.create.div('.dialog'); + Object.setPrototypeOf(dialog,lib.element.Dialog.prototype); + dialog.contentContainer=ui.create.div('.content-container',dialog); + dialog.content=ui.create.div('.content',dialog.contentContainer); + dialog.bar1=ui.create.div('.bar.top',dialog); + dialog.bar2=ui.create.div('.bar.bottom',dialog); + dialog.buttons=[]; + Array.from(arguments).forEach(argument=>{ + if(typeof argument=='boolean') dialog.static=argument; + else if(argument=='hidden') hidden=true; + else if(argument=='notouchscroll') noTouchScroll=true; + else if(argument=='forcebutton') forceButton=true; + else if(argument=='noforcebutton') noForceButton=true; + else dialog.add(argument); + }); + if(!hidden) dialog.open(); + if(!lib.config.touchscreen) dialog.contentContainer.onscroll=ui.update; + if(!noTouchScroll){ + dialog.contentContainer.ontouchstart=ui.click.dialogtouchStart; + dialog.contentContainer.ontouchmove=ui.click.touchScroll; + dialog.contentContainer.style.webkitOverflowScrolling='touch'; + dialog.ontouchstart=ui.click.dragtouchdialog; + } + if(noForceButton) dialog.noforcebutton=true; + else if(forceButton){ + dialog.forcebutton=true; + dialog.classList.add('forcebutton'); + } + return dialog; + } + add(item,noclick,zoom){ if(typeof item=='string'){ if(item.startsWith('###')){ var items=item.slice(3).split('###'); @@ -30386,8 +31924,8 @@ } ui.update(); return item; - }, - addText:function(str,center){ + } + addText(str,center){ if(str&&str.startsWith(''+str+''); @@ -30396,19 +31934,19 @@ this.add('
    '+str+'
    '); } return this; - }, - addSmall:function(item,noclick){ + } + addSmall(item,noclick){ return this.add(item,noclick,true); - }, - addAuto:function(content){ + } + addAuto(content){ if(content&&content.length>4&&!this._hovercustomed){ this.addSmall(content); } else{ this.add(content); } - }, - open:function(){ + } + open(){ if(this.noopen) return; for(var i=0;i0){ @@ -30464,14 +32002,58 @@ // ui.arenalog.classList.remove('withdialog'); // } return this; - }, - setCaption:function(str){ + } + setCaption(str){ this.querySelector('.caption').innerHTML=str; return this; } }, - control:{ - open:function(){ + Control:class extends HTMLDivElement{ + constructor(){ + const nc=!ui.control.querySelector('div:not(.removing):not(.stayleft)'); + const controls=Array.isArray(arguments[0])?arguments[0]:Array.from(arguments); + const control=ui.create.div('.control'); + Object.setPrototypeOf(control,lib.element.Control.prototype); + ui.control.insertBefore(control,_status.createControl||ui.confirm); + controls.forEach(argument=>{ + if(argument=='nozoom') return; + if(typeof argument=='function') control.custom=argument; + else if(argument=='stayleft'){ + control.stayleft=true; + control.classList.add('stayleft'); + } + else control.add(argument); + }); + ui.controls.unshift(control); + if(nc) ui.control.animate('nozoom',100); + if(control.childNodes.length){ + control.style.transition='opacity 0.5s'; + control.animate('controlpressdownx',500); + ui.refresh(control); + if(!control.stayleft) control.style.transform=`translateX(-${control.offsetWidth/2}px)`; + control.style.opacity=1; + ui.refresh(control); + control.style.transition=''; + } + + control.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.control2); + + if(lib.config.button_press){ + control.addEventListener(lib.config.touchscreen?'touchstart':'mousedown',function(){ + if(this.classList.contains('disabled')) return; + this.classList.add('controlpressdown'); + if(typeof this._offset=='number') this.style.transform=`translateX(${this._offset}px) scale(0.97)`; + }); + control.addEventListener(lib.config.touchscreen?'touchend':'mouseup',function(){ + this.classList.remove('controlpressdown'); + if(typeof this._offset=='number') this.style.transform=`translateX(${this._offset}px)`; + }); + } + + ui.updatec(); + return control; + } + open(){ ui.control.insertBefore(this,_status.createControl||ui.confirm); ui.controls.unshift(this); if(this.childNodes.length){ @@ -30487,15 +32069,15 @@ } ui.updatec(); return this; - }, - add:function(item){ + } + add(item){ var node=document.createElement('div'); this.appendChild(node); node.link=item; node.innerHTML=get.translation(item); node.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.control); - }, - close:function(){ + } + close(){ this.animate('controlpressdownx',500); ui.controls.remove(this); @@ -30508,8 +32090,8 @@ if(ui.skills==this) delete ui.skills; if(ui.skills2==this) delete ui.skills2; if(ui.skills3==this) delete ui.skills3; - }, - replace:function(){ + } + replace(){ // this.animate('controlpressdownx',500); if(this.replaceTransition===false){ this.style.transitionProperty='none'; @@ -30545,8 +32127,16 @@ return this; } }, - client:{ - send:function(){ + Client:class{ + /** + * @param {NodeWS | InstanceType} ws + */ + constructor(ws){ + this.ws=ws; + this.id=ws.wsid||get.id(); + this.closed=false; + } + send(){ if(this.closed) return this; var args=Array.from(arguments); if(typeof args[0]=='function'){ @@ -30562,8 +32152,8 @@ this.ws.close(); } return this; - }, - close:function(){ + } + close(){ lib.node.clients.remove(this); lib.node.observing.remove(this); if(ui.removeObserve&&!lib.node.observing.length){ @@ -30598,14 +32188,20 @@ return this; } }, - nodews:{ - send:function(message){ + NodeWS:class{ + /** + * @param {string} id + */ + constructor(id){ + this.wsid=id; + } + send(message){ game.send('server','send',this.wsid,message); - }, - on:function(type,func){ + } + on(type,func){ this['on'+type]=func; - }, - close:function(){ + } + close(){ game.send('server','close',this.wsid); } }, @@ -30670,6 +32266,54 @@ game.online=false; game.ws=null; } + }, + /** + * @legacy Use {@link lib.element.Player.prototype} instead. + */ + get player(){ + return this.Player.prototype; + }, + /** + * @legacy Use {@link lib.element.Card.prototype} instead. + */ + get card(){ + return this.Card.prototype; + }, + /** + * @legacy Use {@link lib.element.Button.prototype} instead. + */ + get button(){ + return this.Button.prototype; + }, + /** + * @legacy Use {@link lib.element.GameEvent.prototype} instead. + */ + get event(){ + return this.GameEvent.prototype; + }, + /** + * @legacy Use {@link lib.element.Dialog.prototype} instead. + */ + get dialog(){ + return this.Dialog.prototype; + }, + /** + * @legacy Use {@link lib.element.Control.prototype} instead. + */ + get control(){ + return this.Control.prototype; + }, + /** + * @legacy Use {@link lib.element.Client.prototype} instead. + */ + get client(){ + return this.Client.prototype; + }, + /** + * @legacy Use {@link lib.element.NodeWS.prototype} instead. + */ + get nodews(){ + return this.NodeWS.prototype; } }, card:{ @@ -30812,7 +32456,8 @@ } var fullskills=game.expandSkills(player.getSkills(false).concat(lib.skill.global)); var info=get.info(skill); - if((info.noHidden||get.mode()!='guozhan')&&!fullskills.contains(skill)){ + if(!info) console.log('缺少info的技能:',skill); + if(((info&&info.noHidden)||get.mode()!='guozhan')&&!fullskills.contains(skill)){ return false; } if(!info.trigger) return false; @@ -31052,6 +32697,7 @@ }, targetEnabledx:function(card,player,target){ if(!card) return false; + if(!target||!target.isIn()) return false; var event=_status.event; if(event._backup&&event._backup.filterCard==lib.filter.filterCard&&(!lib.filter.cardEnabled(card,player,event)||!lib.filter.cardUsable(card,player,event))) return false; if(event.addCount_extra){ @@ -31063,6 +32709,7 @@ }, targetEnabled:function(card,player,target){ if(!card) return false; + if(!target||!target.isIn()) return false; var info=get.info(card); var filter=info.filterTarget; if(!info.singleCard||ui.selected.targets.length==0){ @@ -31075,8 +32722,9 @@ if(typeof filter=='function') return Boolean(filter(card,player,target)); }, targetEnabled2:function(card,player,target){ - if(lib.filter.targetEnabled(card,player,target)) return true; if(!card) return false; + if(!target||!target.isIn()) return false; + if(lib.filter.targetEnabled(card,player,target)) return true; if(game.checkMod(card,player,target,'unchanged','playerEnabled',player)==false) return false; if(game.checkMod(card,player,target,'unchanged','targetEnabled',target)==false) return false; @@ -31088,6 +32736,7 @@ }, targetEnabled3:function(card,player,target){ if(!card) return false; + if(!target||!target.isIn()) return false; var info=get.info(card); if(info.filterTarget==true) return true; @@ -31272,7 +32921,7 @@ if(type=='trick') return 0; if(type=='delay') return 1; if(type=='equip'){ - var type2=get.subtype(name); + var type2=get.subtype(name,false); if(type2&&type2.slice) return 1+parseInt(type2.slice(5)||7); return 8.5 } @@ -31344,6 +32993,143 @@ } }, skill:{ + stratagem_fury:{ + marktext:'🔥', + intro:{ + name:'怒气', + content:(storage,player)=>{ + const stratagemFuryMax=_status.stratagemFuryMax,fury=storage||0; + return `当前怒气值:${typeof stratagemFuryMax=='number'?`${fury}/${stratagemFuryMax}`:fury}`; + } + } + }, + _stratagem_add_buff:{ + log:false, + enable:'chooseToUse', + filter:(event,player)=>{ + const fury=player.storage.stratagem_fury; + if(!fury) return false; + const stratagemSettings=event.stratagemSettings; + if(!stratagemSettings||!stratagemSettings.roundOneUseFury&&game.roundNumber<2) return false; + const cards=player.getCards('hs'); + if(!cards.length) return false; + const cost=lib.stratagemBuff.cost,names=Array.from(cost.keys()); + if(!names.length) return false; + return cards.some(card=>game.checkMod(card,player,'unchanged','cardEnabled2',player)&&names.some(availableName=>availableName==get.name(card,player)&&event.filterCard(new lib.element.VCard({ + name:availableName, + nature:get.nature(card,player), + isCard:true, + cards:[card] + }),player,event)&&fury>=cost.get(availableName))); + }, + onChooseToUse:event=>{ + const player=_status.event.player,fury=player.storage.stratagem_fury; + if(!fury) return; + if(!event.stratagemSettings&&!game.online) event.set('stratagemSettings',{ + roundOneUseFury:_status.connectMode?lib.configOL.round_one_use_fury:get.config('round_one_use_fury') + }); + const cost=lib.stratagemBuff.cost.get('shan'); + if(typeof cost!='number'||!event.shanRequired) return; + event.addNumber('shanIgnored',Math.min(player.countCards(lib.skill._stratagem_add_buff.position,{ + name:'shan' + }),Math.floor(fury/cost))); + }, + check:card=>{ + const player=_status.event.player; + if(_status.event.type=='phase'){ + const cardName=get.name(card,player); + if(cardName=='sha'){ + if(game.hasPlayer(current=>{ + if(!player.canUse(card,current)) return false; + const storage=player.storage,zhibi=storage.zhibi; + return (zhibi&&!zhibi.includes(current)||(get.effect(current,card,player,player)>=2-Math.max(0,(storage.stratagem_fury||0)-1)))&¤t.mayHaveShan()&&player.hasSkill('jiu'); + })) return 1; + return 0; + } + if(cardName=='tao'){ + if(player.hp<=2&&player.getDamagedHp()>=2) return 1; + return 0; + } + return 1; + } + if(_status.event.type=='dying') return get.attitude(player,_status.event.dying)>3?1:0; + return (_status.event.getParent().shanRequired||1)>1&&get.damageEffect(player,_status.event.getParent().player||player,player)<0?1:0; + }, + position:'hs', + filterCard:(card,player,event)=>{ + if(!event) event=_status.event; + const filterCard=event._backup.filterCard; + const cost=lib.stratagemBuff.cost; + return Array.from(cost.keys()).some(availableName=>availableName==get.name(card,player)&&filterCard(new lib.element.VCard({ + name:availableName, + nature:get.nature(card,player), + isCard:true, + cards:[card] + }),player,_status.event)&&player.storage.stratagem_fury>=cost.get(availableName)); + }, + viewAs:(cards,player)=>{ + const cardName=get.name(cards[0],player); + return cardName?new lib.element.VCard({ + name:cardName, + nature:get.nature(cards[0],player), + suit:get.suit(cards[0],player), + number:get.number(cards[0],player), + isCard:true, + cards:[cards[0]], + storage:{ + stratagem_buffed:1 + } + }):new lib.element.VCard(); + }, + prompt:()=>{ + const span=document.createElement('span'); + span.classList.add('text'); + span.style.fontFamily='yuanli'; + const stratagemBuff=lib.stratagemBuff,cost=stratagemBuff.cost; + stratagemBuff.prompt.forEach((prompt,cardName)=>{ + const li=document.createElement('li'); + li.innerHTML=`【${get.translation(cardName)}】:${cost.get(cardName)}点怒气。${prompt()}`; + span.appendChild(li); + }); + return `当你需要使用位于“强化表”内的非虚拟卡牌时,你可以消耗对应数量的怒气将其强化并使用。${document.createElement('hr').outerHTML}${span.outerHTML}`; + }, + onuse:(result,player)=>{ + player.logSkill(result.skill); + const stratagemBuff=lib.stratagemBuff,cardName=result.card.name; + player.changeFury(-stratagemBuff.cost.get(cardName),true); + const gameEvent=get.event(),effect=stratagemBuff.effect.get(cardName); + if(typeof effect=='function') gameEvent.pushHandler('onNextUseCard',effect); + gameEvent.pushHandler('onNextUseCard',(event,option)=>{ + if(event.step==0&&option.state=='end') game.broadcastAll(cards=>cards.forEach(card=>card.clone.classList.add('stratagem-fury-glow')),event.cards); + }); + }, + ai:{ + order:(item,player)=>{ + if(!player) player=_status.event.player; + if(_status.event.type=='phase') for(const card of player.getCards('hs')){ + if(!game.checkMod(card,player,'unchanged','cardEnabled2',player)) continue; + const cardName=get.name(card,player); + if(cardName=='sha'){ + if(game.hasPlayer(current=>{ + if(!player.canUse(card,current)) return false; + const storage=player.storage,zhibi=storage.zhibi; + return (zhibi&&!zhibi.contains(current)||(get.effect(current,card,player,player)>=2-Math.max(0,(storage.stratagem_fury||0)-1)))&¤t.mayHaveShan(); + })) return get.order(card,player)+0.5; + } + else if(cardName=='tao'&&player.hp<=2&&player.getDamagedHp()>=2) return get.order(card,player)+0.5; + return 8; + } + return 3.5; + }, + directHit_ai:true, + skillTagFilter:(player,tag,arg)=>{ + const card=get.autoViewAs(arg.card); + if(card.name!='sha'||!card.storage.stratagem_buffed) return false; + const target=arg.target; + if(target.countCards('h','shan')>=1&&!target.storage.stratagem_fury) return false; + } + } + }, expandedSlots:{ markimage:'image/card/expandedSlots.png', intro:{ @@ -31361,12 +33147,14 @@ content:function(storage,player){ storage=player.expandedSlots; if(!storage) return '当前没有扩展装备栏'; - var keys=Object.keys(storage).sort(); - var str=''; - for(var key of keys){ - var num=storage[key]; + const keys=Object.keys(storage).sort(),combined=get.is.mountCombined(); + let str=''; + for(const key of keys){ + const num=storage[key]; if(typeof num=='number'&&num>0){ - str+='
  • '+get.translation(key)+'栏:'+num+'个
    ' + let trans=get.translation(key); + if(combined&&key=='equip3') trans='坐骑'; + str+='
  • '+trans+'栏:'+num+'个
    ' } } if(str.length) return str.slice(0,str.length-4); @@ -32209,6 +33997,7 @@ silent:true, charlotte:true, priority:-100, + lastDo:true, content:function(){ player.removeSkill('counttrigger'); delete player.storage.counttrigger; @@ -32216,9 +34005,10 @@ group:'counttrigger_2', subSkill:{ 2:{ - trigger:{global:'phaseBefore'}, + trigger:{global:['phaseBeforeStart','roundStart']}, silent:true, charlotte:true, + firstDo:true, priority:100, content:function(){ player.removeSkill('counttrigger'); @@ -32240,7 +34030,10 @@ trigger.cancel(); }, }, - _turnover:{ + /** + * @deprecated + */ + /*_turnover:{ trigger:{player:'phaseBefore'}, forced:true, forceOut:true, @@ -32311,7 +34104,7 @@ game.getGlobalHistory().isRound=true; } }, - }, + },*/ _usecard:{ trigger:{global:'useCardAfter'}, forced:true, @@ -32724,11 +34517,11 @@ } } }, - throwEmotion:function(target,emotion){ + throwEmotion:function(target,emotion,rotate){ if(lib.node.observing.contains(this)) return; var player=lib.playerOL[this.id]; if(player){ - player.throwEmotion(target,emotion); + player.throwEmotion(target,emotion,rotate); } }, emotion:function(id,pack,emotion){ @@ -32753,7 +34546,7 @@ } } } - if(player) lib.element.player.emotion.apply(player,[pack,emotion]); + if(player) player.emotion(pack,emotion); }, chat:function(id,str){ if(lib.node.observing.contains(this)) return; @@ -32777,7 +34570,7 @@ } } } - if(player) lib.element.player.chat.call(player,str); + if(player) player.chat(str); }, giveup:function(player){ if(lib.node.observing.contains(this)||!player||!player._giveUp) return; @@ -32849,14 +34642,7 @@ ui.connecting.firstChild.innerHTML='重连成功'; } }, - onconnection:function(id){ - var ws={wsid:id}; - for(var i in lib.element.nodews){ - ws[i]=lib.element.nodews[i]; - } - lib.wsOL[id]=ws; - lib.init.connection(ws); - }, + onconnection:id=>lib.init.connection(lib.wsOL[id]=new lib.element.NodeWS(id)), onmessage:function(id,message){ if(lib.wsOL[id]){ lib.wsOL[id].onmessage(message); @@ -33069,7 +34855,7 @@ if(!map2[i[4]]){ var player=ui.roombase.add(''); player.roomindex=i; - player.initRoom=lib.element.player.initRoom; + player.initRoom=lib.element.Player.prototype.initRoom; player.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.connectroom); player.initRoom(i); ui.rooms.push(player); @@ -33188,9 +34974,7 @@ game.getRoomInfo=mode.game.getRoomInfo; } if(mode.element&&mode.element.player){ - for(var i in mode.element.player){ - lib.element.player[i]=mode.element.player[i]; - } + Object.defineProperties(lib.element.Player.prototype,Object.getOwnPropertyDescriptors(mode.element.player)); } if(mode.skill){ for(var i in mode.skill){ @@ -33208,11 +34992,7 @@ lib.characterPack[i]=mode.characterPack[i]; } } - _status.event={ - finished:true, - next:[], - after:[] - }; + _status.event=lib.element.GameEvent.initialGameEvent(); _status.paused=false; game.createEvent('game',false).setContent(lib.init.startOnline); game.loop(); @@ -33296,9 +35076,7 @@ game.showIdentity=mode.game.showIdentity; } if(mode.element&&mode.element.player){ - for(var i in mode.element.player){ - lib.element.player[i]=mode.element.player[i]; - } + Object.defineProperties(lib.element.Player.prototype,Object.getOwnPropertyDescriptors(mode.element.player)); } if(mode.skill){ for(var i in mode.skill){ @@ -33400,8 +35178,8 @@ if(lib.config.die_move){ player.$dieflip(); } - if(lib.element.player.$dieAfter){ - lib.element.player.$dieAfter.call(player); + if(player.$dieAfter){ + player.$dieAfter(); } game.dead.push(player); } @@ -33475,11 +35253,7 @@ game.arrangePlayers(); ui.create.me(true); - _status.event={ - finished:true, - next:[], - after:[] - }; + _status.event=lib.element.GameEvent.initialGameEvent(); _status.paused=false; _status.dying=get.parsedResult(state.dying)||[]; @@ -33677,6 +35451,45 @@ ['stab',10], ['poison',50] ]), + natureAudio:{ + damage:{ + 'fire':'default',//默认,即语音放置在audio/effect下,以damage_fire.mp3 damage_fire2.mp3命名。 + 'thunder':'default', + 'ice':'default', + 'stab':'normal',//正常,即与普通伤害音效相同。 + /* + 'example':{ + 1:'../extension/XXX/damage_example.mp3',//1点伤害。 + 2:'../extension/XXX/damage_example2.mp3',//2点及以上伤害 + } + */ + }, + hujia_damage:{ + 'fire':'default',//默认,即语音放置在audio/effect下,以hujia_damage_fire.mp3 hujia_damage_fire2.mp3命名。 + 'thunder':'default', + 'ice':'normal',//正常,即与普通伤害音效相同。 + /* + 'example':{ + 1:'../extension/XXX/damage_example.mp3',//1点伤害。 + 2:'../extension/XXX/damage_example2.mp3',//2点及以上伤害 + } + */ + }, + sha:{ + 'fire':'default',//默认,即语音放置在audio/card/male与audio/card/female下,命名为sha_fire.mp3 + 'thunder':'default', + 'ice':'default', + 'stab':'default', + 'poison':'normal',//正常,即播放“杀”的音效。 + 'kami':'normal', + /* + 'example':{ + 'male':'../extension/XXXX/sha_example_male.mp3', + 'female':'../extension/XXXX/sha_example_female.mp3' + } + */ + } + }, linked:['fire','thunder','kami','ice'], natureBg:new Map([ ['stab','image/card/cisha.png'] @@ -33723,6 +35536,14 @@ color:'#c3f9ff', nature:'thundermm', }], + ['转',{ + color:'#c3f9ff', + nature:'thundermm', + }], + ['梦',{ + color:'#6affe2', + nature:'watermm', + }], ['用间',{ color:'#c3f9ff', nature:'thundermm', @@ -33762,7 +35583,22 @@ nature:'black', }], ['★SP',{ - showName:'★', + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('SP')}` + }], + ['☆SP',{ + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('SP')}` + }], + ['J.SP',{ + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('SP')}` }], ['K系列',{ showName:'K', @@ -33776,86 +35612,139 @@ }], ['骰子',{ getSpan:()=>{ - return `🎲`; + const span=document.createElement('span'); + span.style.fontFamily='NonameSuits'; + span.textContent='🎲'; + return span.outerHTML; } }], ['SP',{ - getSpan:(prefix,name)=>{ - return `SP`; + getSpan:()=>{ + const span=document.createElement('span'),style=span.style; + style.writingMode=style.webkitWritingMode='horizontal-tb'; + style.fontFamily='MotoyaLMaru'; + style.transform='scaleY(0.85)'; + span.textContent='SP'; + return span.outerHTML; }, }], ['OL',{ - getSpan:(prefix,name)=>{ - return `OL`; + getSpan:()=>{ + const span=document.createElement('span'),style=span.style; + style.writingMode=style.webkitWritingMode='horizontal-tb'; + style.fontFamily='MotoyaLMaru'; + style.transform='scaleY(0.85)'; + span.textContent='OL'; + return span.outerHTML; }, }], ['RE',{ - getSpan:(prefix,name)=>{ - return `RE`; + getSpan:()=>{ + const span=document.createElement('span'),style=span.style; + style.writingMode=style.webkitWritingMode='horizontal-tb'; + style.fontFamily='MotoyaLMaru'; + style.transform='scaleY(0.85)'; + span.textContent='RE'; + return span.outerHTML; }, }], ['手杀',{ getSpan:(prefix,name)=>{ - const simple=(lib.config.buttoncharacter_prefix=='simple'); + const simple=lib.config.buttoncharacter_prefix=='simple',span=document.createElement('span'); if(lib.characterPack.shiji&&name in lib.characterPack.shiji){ - for(let i in lib.characterSort.shiji){ - if(lib.characterSort.shiji[i].includes(name)){ - prefix=get.translation(i).slice(-1); - break; - } + for(const entry of Object.entries(lib.characterSort.shiji)){ + if(!entry[1].includes(name)) continue; + prefix=get.translation(entry[0]).slice(-1); + break; } - if(simple) return `${prefix}`; - return `${prefix}`; + if(!simple){ + span.style.color='#def7ca'; + span.dataset.nature='watermm'; + } + span.innerHTML=prefix; } - if(simple) return '手杀'; - return `📱`; + else if(simple) span.textContent='手杀'; + else{ + span.style.fontFamily='NonameSuits'; + span.textContent='📱'; + } + return span.outerHTML; }, }], ['TW',{ - getSpan:(prefix,name)=>{ - return `TW`; + getSpan:()=>{ + const span=document.createElement('span'),style=span.style; + style.writingMode=style.webkitWritingMode='horizontal-tb'; + style.fontFamily='MotoyaLMaru'; + style.transform='scaleY(0.85)'; + span.textContent='TW'; + return span.outerHTML; }, }], ['TW神',{ - getSpan:(prefix,name)=>{ - return `${get.prefixSpan('TW')}${get.prefixSpan('神')}` - }, + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('TW')}${get.prefixSpan('神')}` }], ['TW将',{ - getSpan:(prefix,name)=>{ - return `${get.prefixSpan('TW')}${get.prefixSpan('将')}` - }, + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('TW')}${get.prefixSpan('将')}` }], ['OL神',{ - getSpan:(prefix,name)=>{ - return `${get.prefixSpan('OL')}${get.prefixSpan('神')}` - }, + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('OL')}${get.prefixSpan('神')}` }], ['旧神',{ - getSpan:(prefix,name)=>{ - return `${get.prefixSpan('旧')}${get.prefixSpan('神')}` - }, + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('旧')}${get.prefixSpan('神')}` }], ['旧晋',{ - getSpan:(prefix,name)=>{ - return `${get.prefixSpan('旧')}${get.prefixSpan('晋')}` - }, + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('旧')}${get.prefixSpan('晋')}` }], ['新杀SP',{ - getSpan:(prefix,name)=>{ - return `${get.prefixSpan('新杀')}${get.prefixSpan('SP')}` - }, + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('新杀')}${get.prefixSpan('SP')}` }], ['界SP',{ - getSpan:(prefix,name)=>{ - return `${get.prefixSpan('界')}${get.prefixSpan('SP')}` - }, + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('界')}${get.prefixSpan('SP')}` }], ['S特神',{ - getSpan:(prefix,name)=>{ - return `${get.prefixSpan('★')}${get.prefixSpan('神')}` - }, + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('★')}${get.prefixSpan('神')}` }], + ['手杀界',{ + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('手杀')}${get.prefixSpan('界')}` + }], + ['战役篇神',{ + /** + * @returns {string} + */ + getSpan:()=>`${get.prefixSpan('战役篇')}${get.prefixSpan('神')}` + }], + ['星',{ + color:'#ffd700', + nature:'glodenmm', + }] ]), groupnature:{ shen:'shen', @@ -33912,6 +35801,11 @@ } }; const game={ + //Stratagem + //谋攻 + setStratagemBuffCost:(cardName,cost)=>game.broadcastAll((clientCardName,clientCost)=>lib.stratagemBuff.cost.set(clientCardName,clientCost),cardName,cost), + setStratagemBuffEffect:(cardName,effect)=>game.broadcastAll((clientCardName,clientEffect)=>lib.stratagemBuff.cost.set(clientCardName,clientEffect),cardName,effect), + setStratagemBuffPrompt:(cardName,prompt)=>game.broadcastAll((clientCardName,clientPrompt)=>lib.stratagemBuff.cost.set(clientCardName,clientPrompt),cardName,prompt), //添加新的属性杀 addNature:(nature,translation,config)=>{ if(!nature) throw new TypeError(); @@ -33964,6 +35858,7 @@ for(let i=0;igame.broadcastAll((yingbianCondition,condition)=>lib.yingbian.condition.simple.set(yingbianCondition,condition),yingbianCondition,condition), setYingbianEffect:(yingbianEffect,effect)=>game.broadcastAll((yingbianEffect,effect)=>lib.yingbian.effect.set(yingbianEffect,effect),yingbianEffect,effect), setYingbianPrompt:(yingbian,prompt)=>game.broadcastAll((yingbian,prompt)=>lib.yingbian.prompt.set(yingbian,prompt),yingbian,prompt), - //动态CSS from libnodiz - dynamicStyle:{ - init:()=>{ - const that=game.dynamicStyle; - that._cache={}; - that._cache.rules=[]; - that._cache.style=document.createElement("style"); - that._cache.style.id="game.dynamicStyle"; - document.head.appendChild(that._cache.style); - that._cache.sheet = that._cache.style.sheet; - delete game.dynamicStyle.init; - return true; - }, - translate:style=>{ - let result=[]; - for(const name in style){ - result.push(`${name.replace(/([A-Z])/g, match => `-${match.toLowerCase()}`)}: ${style[name]};`); - } - return result.join(" "); - }, - generate:(name, style)=>[`${name} {`, game.dynamicStyle.translate(style), "}"].join(" "), - has:name=>game.dynamicStyle._cache.rules.some(item=>item[0]==name), - get:name=>game.dynamicStyle.find(item=>item[0]==name)[1], - find:fn=>game.dynamicStyle._cache.rules.find(fn), - size:()=>game.dynamicStyle._cache.rules.length, - indexOf:name=>{ - for (let i=0;i No idea to write, it's just a tool to handle css. + * > 暂时不知道写啥,反正就是个管CSS的工具 + * + * @example + * // 为符合".content"的元素增加"text-align: center"的样式 + * game.dynamicStyle.add(".content", { + * textAlign: "center" + * }); + * + * // 在上一条的基础上,再为".content"增加"color: #FFFFFF"的样式 + * game.dynamicStyle.add(".content", { + * color: "#FFFFFF" + * }); + * + * @example + * // 批量添加符合对应选择器元素的样式 + * game.dynamicStyle.addObject({ + * ".content": { + * textAlign: "center" + * }, + * ".ansory": { + * fontSize: "16px" + * } + * }); + * + * @example + * // 移除".content"元素的样式 + * game.dynamicStyle.remove(".content"); + * + * @example + * // 移除".content"元素的"textAlign"样式 + * game.dynamicStyle.removeStyles(".content", ["textAligh"]); + * + * @example + * // 如果".content"元素的样式存在,则将".content"的样式修改为给定的样式 + * // 反之效果同`game.dynamicStyle.add` + * game.dynamicStyle.update(".content", { + * textAlign: "center" + * }); + */ + dynamicStyle:new class{ + /** + * Object of style + * 表示样式的对象 + * + * @typedef {Record} StyleObject + */ + /** + * Rule to record style info. + * 用于记录样式信息的规则 + * + * @typedef {[string, StyleObject]} Rule + */ + /** + * Type used to declare the place to store css info. + * 用来存CSS信息的空间的类型 + * + * @typedef {object} DynamicStyleCache + * @property {Rule[]} rules 记录的规则 + * @property {HTMLStyleElement} style 全局Style标签 + * @property {CSSStyleSheet} sheet Style标签的Sheet + */ + + /** + * Initialize dynamicStyle. + * 初始化数据 + */ + constructor(){ + /** + * @type {DynamicStyleCache} + */ + let cache=Object.create(null); + cache.rules=new Array; + cache.style=document.createElement("style"); + cache.style.id="game.dynamicStyle"; + document.head.appendChild(cache.style); + cache.sheet=cache.style.sheet; + /** + * Place to store css info. + * 存CSS信息的空间 + * + * @type {DynamicStyleCache} + */ + this._cache=cache; + } + + /** + * Turn the Object Style to string format. + * 将给定的对象样式转换成字符串的形式 + * + * @param {StyleObject} style 给定的对象样式 + * @returns {string} 样式的字符串形式 + */ + translate(style){ + return Object.entries(style).map(item => + `${item[0].replace(/([A-Z])/g, match => + `-${match.toLowerCase()}`)}: ${item[1]};`).join(" "); + } + + /** + * Generate the common css selector. + * 生成标准的CSS样式 + * + * @param {string} name 选择器 + * @param {StyleObject} style 对象样式 + * @returns {string} 标准的CSS样式 + */ + generate(name, style){ + return `${name} { ${this.translate(style)} }`; + } + + /** + * Determine the selector is in rules. + * 检查是否存在对应选择器的规则 + * + * @param {string} name 选择器 + * @returns {boolean} + */ + has(name){ + return this._cache.rules.some(item=>item[0]==name); + } + + /** + * Get the style of given selector, or return null. + * 获得对应选择器的样式对象,若不存在,则返回`null` + * + * @param {string} name 选择器 + * @returns {?StyleObject} + */ + get(name){ + const result = this.find(item=>item[0]==name); + return result ? result[1] : null; + } + + /** + * Callback of `DynamicStyle#find`, getting the rule wanted. + * `DynamicStyle#find`的回调函数,用于获取符合要求的规则 + * + * @callback FindCallback + * @param {Rule} rule 样式规则 + * @param {number} index 样式编号 + * @param {Rule[]} rules 规则集 + * @returns {boolean} + */ + + /** + * Get the rule wanted by given function. + * 通过给定的函数,获取符合要求的规则 + * + * @param {FindCallback} fn 用于检查的函数 + * @returns {?StyleObject} + */ + find(fn){ + return this._cache.rules.find(fn); + } + + /** + * Length of rules. + * 规则集的长度 + * + * @returns {number} + */ + size(){ + return this._cache.rules.length; + } + + /** + * Get the index of given selector, or return `-1`. + * 获得对应选择器的位置,若不存在,则返回`-1` + * + * @param {string} name 选择器 + * @returns {number} + */ + indexOf(name){ + for (let i=0;i{ - const that=game.dynamicStyle; - return that.update(name,that.has(name)?Object.assign({},that.get(name),style):style); - }, - addObject:object=>{ - const that=game.dynamicStyle; - let result=[]; - for(const name in object){ - result.push(that.add(name, object[name])); - } - return result; - }, - remove:name=>{ - const that=game.dynamicStyle; - if(!that.has(name)) return false; - const index=that.indexOf(name); - that._cache.rules.splice(index,1); - that._cache.sheet.deleteRule(index); - return true; - }, - update:(name,style)=>{ - const that=game.dynamicStyle; + } + + // 后面部分就不说明了,可以顾名思义 + /** + * @param {string} name 选择器 + * @param {StyleObject} style 要添加的样式对象 + * @returns {boolean} 添加的结果,为`true`则添加成功,为`false`则添加失败 + */ + add(name,style){ + return this.update(name,this.has(name)?Object.assign({},this.get(name),style):style); + } + + /** + * @param {Record} object 以`name: style`存储的映射 + * @returns {boolean} 添加的结果,为`true`则添加成功,为`false`则添加失败 + */ + addObject(object){ + return Object.entries(object).map(item => this.add(item[0],item[1])); + } + + /** + * @param {string} name 要移除规则的选择器 + * @returns {boolean} 移除的结果,为`true`则移除成功,为`false`则移除失败 + */ + remove(name){ + if(!this.has(name)) return false; try{ - if(that.has(name)){ - const index=that.indexOf(name); - that._cache.sheet.deleteRule(index); - that._cache.sheet.insertRule(that.generate(name,style),index); - that._cache.rules[index] = [name, style]; + const index=this.indexOf(name); + this._cache.rules.splice(index,1); + this._cache.sheet.deleteRule(index); + return true; + } + catch(e){ + console.log(e); + return false; + } + } + + /** + * @param {string} name 要移除规则的选择器 + * @param {string[]} styles 要移除的样式 + * @returns {boolean} 移除的结果,为`true`则移除成功,为`false`则移除失败 + */ + removeStyles(name,styles){ + if(!this.has(name)) return false; + const style=this.get(name); + styles.forEach(styleName=>{ + delete style[styleName]; + }); + return this.update(name,style); + } + + /** + * 添加或修改一个规则所对应的样式 + * + * @param {string} name 要变更规则的选择器 + * @param {StyleObject} style 变更规则的样式 + * @returns {boolean} 更新的结果,为`true`则更新成功,为`false`则更新失败 + */ + update(name,style){ + try{ + if(this.has(name)){ + const index=this.indexOf(name); + this._cache.sheet.deleteRule(index); + this._cache.sheet.insertRule(this.generate(name,style),index); + this._cache.rules[index] = [name, style]; }else{ - const index=that._cache.rules.length; - that._cache.rules.push([name,style]); - that._cache.sheet.insertRule(that.generate(name,style),index); + const index=this._cache.rules.length; + this._cache.rules.push([name,style]); + this._cache.sheet.insertRule(this.generate(name,style),index); } return true; } @@ -34169,6 +36253,20 @@ if(i.storage.renku) i.markSkill('renku'); } }, + //为牌添加知情者。 + addCardKnower:function(cards,players){ + if(get.itemtype(cards) == 'card'){ + cards = [cards]; + } + cards.forEach(card=>card.addKnower(players)); + }, + //移除牌的所有知情者。 + clearCardKnowers:function(cards){ + if(get.itemtype(cards) == 'card'){ + cards = [cards]; + } + cards.forEach(card=>card.clearKnowers()); + }, loseAsync:function(arg){ var next=game.createEvent('loseAsync'); next.forceDie=true; @@ -34298,7 +36396,7 @@ }, hasAllGlobalHistory:function(key,filter,last){ if(!key||!filter) return; - const stopped=false; + let stopped=false; _status.globalHistory.forEach(value=>{ if(value[key]){ if(last&&value[key].includes(last)&&!stopped){ @@ -34317,7 +36415,7 @@ }, checkAllGlobalHistory:function(key,filter,last){ if(!key||!filter) return; - const stopped=false; + let stopped=false; _status.globalHistory.forEach(value=>{ if(value[key]){ if(last&&value[key].includes(last)&&!stopped){ @@ -34422,6 +36520,10 @@ const cards=event.cards; const pile=ui.cardPile; for(let i=0;i{ const node=ui.create.div('.background.upper.land'); node.setBackgroundImage(formattedPath); @@ -34508,7 +36611,7 @@ return uiIntro; },200); game.addGlobalSkill(skill); - },lib.path.format(parsedPath),parsedPath.name,`${name}_skill`,player); + },lib.path.format(parsedPath),fileName,`${fileName}_skill`,player); }, checkFileList:function(updates,proceed){ var n=updates.length; @@ -34675,6 +36778,12 @@ delete ui.currentpopped; } }, + /** + * @type {{ + * (func: T, ...args: Parameters) => void; + * (func: (...args: T) => void, ...args: T) => void; + * }} + */ broadcast:function(){ if(!lib.node||!lib.node.clients||game.online) return; for(var i=0;i(func: T, ...args: Parameters) => void; + * (func: (...args: T) => void, ...args: T) => void; + * }} + */ broadcastAll:function(){ if(game.online) return; var argc=arguments.length; @@ -34912,21 +37027,7 @@ game.ws.send(JSON.stringify(get.stringifiedResult(args))); } }, - sendTo:function(id,message){ - var ws={wsid:id}; - for(var i in lib.element.nodews){ - ws[i]=lib.element.nodews[i]; - } - var client={ - ws:ws, - id:ws.wsid, - closed:false - }; - for(var i in lib.element.client){ - client[i]=lib.element.client[i]; - } - client.send(message); - }, + sendTo:(id,message)=>new lib.element.Client(new lib.element.NodeWS(id)).send(message), createServer:function(){ lib.node.clients=[]; lib.node.banned=[]; @@ -34952,25 +37053,30 @@ } }, playAudio:function(){ - if(_status.video&&arguments[1]!='video') return; let path='',emptyPath=true,notCheckDBPath=true,onError=null; - for(const argument of arguments){ - if(typeof argument==='string'||typeof argument=='number'){ - if(emptyPath) emptyPath=false; - else if(notCheckDBPath){ - notCheckDBPath=false; - if(/^db:extension-[^:]*$/.test(path)) path+=':'; - else path+='/'; - } - else path+='/'; - path+=argument; - } - else if(typeof argument=='function') onError=argument; - if(_status.video) break; + if(_status.video){ + if(arguments[1]!='video') return; + path=arguments[0]; + } + else{ + for(const argument of arguments){ + if(typeof argument==='string'||typeof argument=='number'){ + if(emptyPath) emptyPath=false; + else if(notCheckDBPath){ + notCheckDBPath=false; + if(/^db:extension-[^:]*$/.test(path)) path+=':'; + else path+='/'; + } + else path+='/'; + path+=argument; + } + else if(typeof argument=='function') onError=argument; + if(_status.video) break; + } + if(path.startsWith('ext:')) path=path.replace(/^ext:/,'extension/'); + else if(!path.startsWith('db:')) path=`audio/${path}`; + if(!lib.config.repeat_audio&&_status.skillaudio.contains(path)) return; } - if(path.startsWith('ext:')) path=path.replace(/^ext:/,'extension/'); - else if(!path.startsWith('db:')) path=`audio/${path}`; - if(!lib.config.repeat_audio&&_status.skillaudio.contains(path)) return; _status.skillaudio.add(path); game.addVideo('playAudio',null,path); setTimeout(()=>_status.skillaudio.remove(path),1000); @@ -34994,83 +37100,116 @@ }); return audio; }, - trySkillAudio:function(skill,player,directaudio){ - game.broadcast(game.trySkillAudio,skill,player,directaudio); + /** + * 根据skill中的audio,audioname,audioname2和player来获取音频地址列表 + * @param {String} skill 技能名 + * @param {Player|String} player 角色/角色名 + * @returns {Array} 分析完的语音地址列表 + */ + parseSkillAudio:function(skill,player){ + if(typeof player=='string') player={name:player}; + else if(get.itemtype(player)!='player') player={}; + + /** + * 处理 audioInfo 外的参数 + * @param {String} skill 技能名 + * @param {Player|{name:string}} player 角色 + * @param {Array} audioname audioname历史 + * @param {Array} history 判断deadlock + * @param {Number} fixedNum [audioname, number] 中的第二个参数,用来限制语音数 + * @returns {Array} 音频地址数组(有需要playSkillAudio的为[skillname]) + */ + function getAudioList(skill,player,audioname,history,fixedNum){ + let info=lib.skill[skill]; + if(!info) return []; + if(!history) history=[]; + if(history.includes(skill)){//判断deadlock + console.trace(`${skill} in ${history} forms a deadlock`); + if(info.audio!==false) return [[skill]]; + return []; + } + history.push(skill); + + let audioInfo=info.audio; + if(info.audioname2){ + if(info.audioname2[player.name]) audioInfo=info.audioname2[player.name]; + else if(info.audioname2[player.name1]) audioInfo=info.audioname2[player.name1]; + else if(info.audioname2[player.name2]) audioInfo=info.audioname2[player.name2]; + } + if(typeof audioInfo=='function') audioInfo=audioInfo(player); + + if(!audioname) audioname=[]; + if(Array.isArray(info.audioname)) audioname.addArray(info.audioname); + + let audioList=parseAudio(skill,audioInfo,audioname,player,history,fixedNum); + if(fixedNum&&fixedNum} audioname 要判断的audioname + * @param {Player|{name:string}} player 角色 + * @param {Array} history 判断deadlock + * @param {Number} fixedNum [audioname, number] 中的第二个参数,用来限制语音数 + * @returns {Array} 音频地址数组(有需要playSkillAudio的为[skillname]) + */ + function parseAudio(skill,audioInfo,audioname,player,history,fixedNum){ + if(Array.isArray(audioInfo)){ + if(typeof audioInfo[0]=='string'&&typeof audioInfo[1]=='number'){// [audioname, number] + if(lib.skill[audioInfo[0]]) return getAudioList(audioInfo[0],player,audioname,history,fixedNum||audioInfo[1]); + return parseAudio(audioInfo[0],audioInfo[1],audioname,player,history,fixedNum||audioInfo[1]); + } + return audioInfo.reduce((total,i)=>total.addArray(parseAudio(skill,i,audioname,player,history,fixedNum)),[]); + } + + if(!['string','number','boolean'].includes(typeof audioInfo)) return []; + if(audioInfo===false) return []; + if(typeof audioInfo=='string'&&lib.skill[audioInfo]) return getAudioList(audioInfo,player,audioname,history,fixedNum); + + let audioList=[]; + audioInfo=String(audioInfo); + let list=audioInfo.match(/(?:(.*):|^)(true|\d*)(?::(.*)|$)/); + if(list&&list[2]){ + let _audioname=''; + if(audioname.includes(player.name)) _audioname=`_${player.name}`; + else if(audioname.includes(player.name1)) _audioname=`_${player.name1}`; + else if(audioname.includes(player.name2)) _audioname=`_${player.name2}`; + + list=list.slice(1);//[路径,number/true,格式] + if(list[1]=='true') audioList.add(`${list[0]||'skill'}/${skill}${_audioname}.${list[2]||'mp3'}`); + else{ + list[1]=parseInt(list[1]); + for(let i=1;i<=list[1];i++){ + audioList.add(`${list[0]||'skill'}/${skill}${_audioname}${i}.${list[2]||'mp3'}`); + } + } + } + else audioList.add(`${/(?:^db:|^ext:|\/)/.test(audioInfo)?'':'skill/'}${audioInfo}`); + return audioList; + } + + return getAudioList(skill,player); + }, + trySkillAudio:function(skill,player,directaudio,nobroadcast/*,index*/){ + if(!nobroadcast) game.broadcast(game.trySkillAudio,skill,player,directaudio,nobroadcast/*,index*/); var info=get.info(skill); if(!info) return; if(!lib.config.background_speak) return; - if(typeof player=='string') player={name:player}; - else{ - if(info.direct&&!directaudio) return; - if(lib.skill.global.includes(skill)&&!lib.skill[skill].forceaudio) return; - } - var audioName=skill; - var audioInfo=info.audio; - var fixedNum; - if(info.audioname2){ - if(info.audioname2[player.name]){ - audioName+='_'+player.name; - audioInfo=info.audioname2[player.name]; - } - else if(info.audioname2[player.name1]){ - audioName+='_'+player.name1; - audioInfo=info.audioname2[player.name1]; - } - else if(info.audioname2[player.name2]){ - audioName+='_'+player.name2; - audioInfo=info.audioname2[player.name2]; - } - } - var history=[]; - while(true){//可以嵌套引用了 - if(history.includes(audioName)) break; - history.push(audioName); - if(typeof audioInfo=='string'&&lib.skill[audioInfo]){ - audioName=audioInfo; - audioInfo=lib.skill[audioName].audio; - continue; - } - if(Array.isArray(audioInfo)){ - audioName=audioInfo[0]; - if(!fixedNum) fixedNum=audioInfo[1];//数组会取第一个指定语音数 - audioInfo=lib.skill[audioName].audio; - continue; - } - break; - } - if(Array.isArray(info.audioname)&&player){ - if(info.audioname.includes(player.name)&&(!info.audioname2||!info.audioname2[player.name])) audioName+='_'+player.name; - else if(info.audioname.includes(player.name1)&&(!info.audioname2||!info.audioname2[player.name1])) audioName+='_'+player.name1; - else if(info.audioname.includes(player.name2)&&(!info.audioname2||!info.audioname2[player.name2])) audioName+='_'+player.name2; - } - if(typeof audioInfo=='string'){ - if(audioInfo.startsWith('db:')){ - audioInfo=audioInfo.split(':'); - if(audioInfo.length<4) return; - if(audioInfo[3]=='true') game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,audioInfo[2],`${audioName}.${audioInfo[4]||'mp3'}`); - else{ - audioInfo[3]=fixedNum?Math.min(parseInt(audioInfo[3]),fixedNum):parseInt(audioInfo[3]); - if(!audioInfo[3]) return; - game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,audioInfo[2],`${audioName}${Math.floor(audioInfo[3]*Math.random())+1}.${audioInfo[4]||'mp3'}`); - } - } - else if(audioInfo.startsWith('ext:')){ - audioInfo=audioInfo.split(':'); - if(audioInfo.length<3) return; - if(audioInfo[2]=='true') game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${audioName}.${audioInfo[3]||'mp3'}`); - else{ - audioInfo[2]=fixedNum?Math.min(parseInt(audioInfo[2]),fixedNum):parseInt(audioInfo[2]); - if(!audioInfo[2]) return; - game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${audioName}${Math.floor(audioInfo[2]*Math.random())+1}.${audioInfo[3]||'mp3'}`); - } - } - } - else if(typeof audioInfo=='number'){ - if(fixedNum) audioInfo=Math.min(audioInfo, fixedNum); - game.playAudio('skill',`${audioName}${Math.floor(audioInfo*Math.random())+1}`); - } - else if(audioInfo) game.playAudio('skill',audioName); - else if(info.audio!==false) game.playSkillAudio(audioName); + if(info.direct&&!directaudio) return; + if(lib.skill.global.includes(skill)&&!lib.skill[skill].forceaudio) return; + + let list=game.parseSkillAudio(skill,player); + if(!list.length) return; + // if(index) index=index%list.length||list.length; + // let audio=list[index?index-1:Math.floor(Math.random()*list.length)]; + let audio=list[Math.floor(Math.random()*list.length)]; + if(Array.isArray(audio)) return game.playSkillAudio(audio[0]); + return game.playAudio(audio); }, playSkillAudio:function(name,index){ if(_status.video&&arguments[1]!='video') return; @@ -35123,6 +37262,36 @@ }; ui.window.appendChild(audio); }, + playCardAudio:function(card,sex){ + if(typeof card === 'string'){ + card = {name:card}; + } + if(get.itemtype(sex) === 'player'){ + sex = (sex.sex == 'female'?'female':'male'); + }else if(typeof sex == 'string'){ + sex = (sex == 'female'?'female':'male'); + } + if(!lib.config.background_audio||get.type(card)=='equip'&&!lib.config.equip_audio) return; + var nature=get.natureList(card)[0]; + if(lib.natureAudio[card.name]){ + let useAudio = lib.natureAudio[card.name][nature]; + if(useAudio === 'default'){ + game.playAudio('card',sex,`${card.name}_${nature}`); + return; + }else if(useAudio && useAudio[sex]){ + game.playAudio(useAudio[sex]); + return; + } + } + const audio=lib.card[card.name].audio; + if(typeof audio=='string'){ + const audioInfo=audio.split(':'); + if(audio.startsWith('db:')) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,audioInfo[2],`${card.name}_${sex}.${audioInfo[3]||'mp3'}`); + else if(audio.startsWith('ext:')) game.playAudio(`${audioInfo[0]}:${audioInfo[1]}`,`${card.name}_${sex}.${audioInfo[2]||'mp3'}`); + else game.playAudio('card',sex,`${audioInfo[0]}.${audioInfo[1]||'mp3'}`); + } + else game.playAudio('card',sex,card.name); + }, playBackgroundMusic:()=>{ if(lib.config.background_music=='music_off'){ ui.backgroundMusic.src=''; @@ -35683,8 +37852,17 @@ ui.updatehl(); for(var i=0;i{ + const next=new lib.element.GameEvent(name,trigger); + (triggerEvent||_status.event).next.push(next); return next; }, addCharacter:(name,information)=>{ @@ -37777,7 +39951,7 @@ } } }, - addSkill:function(name,info,translate,description,appendInfo){ + addSkill:function(name,info,translate,description,appendInfo,abInfo){ if(lib.skill[name]){ return false; } @@ -37788,6 +39962,7 @@ lib.translate[name]=translate; lib.translate[name+'_info']=description; lib.translate[name+'_append']=appendInfo; + lib.translate[`${name}_ab`]=abInfo; return true; }, addMode:function(name,info,info2){ @@ -38248,7 +40423,7 @@ for(i=0;ieval(code)'){ + //触发debugger + var inputCallback=inputResult=>{ + if(inputResult===false){ + event.debugging=true; + game.resume2(); + }else{ + alert(get.stringify(next.value(inputResult))); + game.prompt('','debugger调试',inputCallback); + } + } + game.prompt('','debugger调试',inputCallback); + return game.pause2(); + } + if(event.finished) event.generatorContent.return(); + }else{ + event.content(event,step,source,player,target,targets, + card,cards,skill,forced,num,trigger,result, + _status,lib,game,ui,get,ai); + } } catch(e){ game.print('游戏出错:'+event.name); @@ -38760,12 +40967,42 @@ } } else{ - event.content(event,step,source,player,target,targets, - card,cards,skill,forced,num,trigger,result, - _status,lib,game,ui,get,ai); + if(event.content instanceof GeneratorFunction){ + if(!event.debugging){ + if(event.generatorContent) event.generatorContent.return(); + event.generatorContent=event.content(event,step,source,player,target,targets, + card,cards,skill,forced,num,trigger,result, + _status,lib,game,ui,get,ai); + }else{ + delete event.debugging; + } + var next=event.generatorContent.next(); + if(typeof next.value=='function'&&next.value.toString()=='code=>eval(code)'){ + //触发debugger + var inputCallback=inputResult=>{ + if(inputResult===false){ + event.debugging=true; + game.resume2(); + }else{ + alert(get.stringify(next.value(inputResult))); + game.prompt('','debugger调试',inputCallback); + } + } + game.prompt('','debugger调试',inputCallback); + return game.pause2(); + } + if(event.finished) event.generatorContent.return(); + }else{ + event.content(event,step,source,player,target,targets, + card,cards,skill,forced,num,trigger,result, + _status,lib,game,ui,get,ai); + } } } event.clearStepCache(); + event.callHandler(event.getDefaultHandlerType(),event,{ + state:'end' + }); event.step++; } } @@ -39602,11 +41839,7 @@ // lib.config.addedpile=pilecfg[1]||{}; // } - _status.event={ - finished:true, - next:[], - after:[] - }; + _status.event=lib.element.GameEvent.initialGameEvent(); _status.paused=false; if(_status.connectMode&&lib.mode[name].connect){ @@ -40247,10 +42480,13 @@ } }); }, - updateRoundNumber:()=>game.broadcastAll((num1,num2,top)=>{ - if(ui.cardPileNumber) ui.cardPileNumber.innerHTML=`${num1}轮 剩余牌: ${num2}`; - _status.pileTop=top; - },game.roundNumber,ui.cardPile.childNodes.length,ui.cardPile.firstChild), + updateRoundNumber:()=>{ + game.broadcastAll((roundNumber,pileTop,pileNumber)=>{ + if(game.roundNumber!=roundNumber) game.roundNumber=roundNumber; + if(_status.pileTop!=pileTop) _status.pileTop=pileTop; + ui.updateRoundNumber(roundNumber,pileNumber); + },game.roundNumber,ui.cardPile.firstChild,ui.cardPile.childElementCount); + }, asyncDraw:(players,num,drawDeck,bottom)=>players.forEach((value,index)=>{ let num2=1; if(typeof num=='number') num2=num; @@ -40284,16 +42520,19 @@ if(info.forbid&&info.forbid.contains(mode)){ lib.skill[i]={}; if(lib.translate[iInfo]) lib.translate[iInfo]='此模式下不可用'; + if(lib.dynamicTranslate[i]) lib.dynamicTranslate[i]=()=>'此模式下不可用'; return; } if(info.mode&&info.mode.contains(mode)==false){ lib.skill[i]={}; if(lib.translate[iInfo]) lib.translate[iInfo]='此模式下不可用'; + if(lib.dynamicTranslate[i]) lib.dynamicTranslate[i]=()=>'此模式下不可用'; return; } if(info.available&&info.available(mode)==false){ lib.skill[i]={}; if(lib.translate[iInfo]) lib.translate[iInfo]='此模式下不可用'; + if(lib.dynamicTranslate[i]) lib.dynamicTranslate[i]=()=>'此模式下不可用'; return; } if(info.viewAs&&typeof info.viewAs!='function'){ @@ -40466,7 +42705,17 @@ checkMod:function(){ const argumentArray=Array.from(arguments),name=argumentArray[argumentArray.length-2]; let skills=argumentArray[argumentArray.length-1]; - if(skills.getSkills) skills=skills.getModableSkills(_status.event.useCache === true); + if(typeof skills.getModableSkills == 'function'){ + skills=skills.getModableSkills(_status.event.useCache === true); + }else if(typeof skills.getSkills == 'function'){ + skills=skills.getSkills().concat(lib.skill.global); + game.expandSkills(skills); + skills = skills.filter(function(skill){ + var info = get.info(skill); + return info && info.mod; + }); + skills.sort((a,b)=>get.priority(a)-get.priority(b)); + } const arg=argumentArray.slice(0,-2); skills.forEach(value=>{ var mod = get.info(value).mod[name]; @@ -40554,9 +42803,10 @@ log:function(){ let str='',str2='',logvid=null; const color=new Map([ - ['b','blue'], + ['r','fire'], ['y','yellow'], - ['g','green'] + ['g','green'], + ['b','blue'] ]); Array.from(arguments).forEach(value=>{ const itemtype=get.itemtype(value); @@ -41183,13 +43433,13 @@ player2.previousSeat=player.previousSeat; player2.nextSeat.previousSeat=player2; player2.previousSeat.nextSeat=player2; - const player3=player2.nextSeat; + let player3=player2.nextSeat; while(player3.isDead()){ player3=player3.nextSeat; } player3.previous=player2; player2.next=player3; - const player4=player2.previousSeat; + let player4=player2.previousSeat; while(player4.isDead()){ player4=player4.previousSeat; } @@ -41303,7 +43553,13 @@ return true; }); }, + /** + * @type {Player[]} + */ players:[], + /** + * @type {Player[]} + */ dead:[], imported:[], playerMap:{}, @@ -41317,10 +43573,75 @@ thrown:[], touchlines:[], todiscard:{}, + /** + * @type {HTMLStyleElement[]} + */ + playerPositions:[], refresh:function(node){ void window.getComputedStyle(node, null).getPropertyValue("opacity"); }, create:{ + //创建身份牌实例 + identityCard:function(identity,position,noclick){ + const card=ui.create.card(position,'noclick',noclick); + card.removeEventListener(lib.config.touchscreen?'touchend':'click',ui.click.card); + card.classList.add('button'); + card._customintro=uiintro=>uiintro.add(`${get.translation(`${identity}${2}`)}的身份牌`); + const fileName=`image/card/identity_${identity}.jpg`; + new Promise((resolve,reject)=>{ + const image=new Image(); + image.onload=resolve; + image.onerror=reject; + image.src=`${lib.assetURL}${fileName}`; + }).then(()=>{ + card.classList.add('fullskin'); + card.node.image.setBackgroundImage(fileName); + },()=>card.node.background.innerHTML=get.translation(identity)[0]); + return card; + }, + //让卡牌旋转 + cardSpinning:function(card){ + if(lib.config.cardback_style!='default'){ + card.style.transitionProperty='none'; + ui.refresh(card); + card.classList.add('infohidden'); + ui.refresh(card); + card.style.transitionProperty=''; + } + else{ + card.classList.add('infohidden'); + } + card.style.transition='all 0s'; + card.style.transform='perspective(600px) rotateY(180deg) translateX(0)'; + const onEnd01=function(){ + setTimeout(function(){ + card.style.transition='all ease-in 0.3s'; + card.style.transform='perspective(600px) rotateY(270deg) translateX(52px)'; + var onEnd=function(){ + card.classList.remove('infohidden'); + card.style.transition='all 0s'; + ui.refresh(card); + card.style.transform='perspective(600px) rotateY(-90deg) translateX(52px)'; + ui.refresh(card); + card.style.transition=''; + ui.refresh(card); + card.style.transform=''; + } + card.listenTransition(onEnd); + },300); + }; + onEnd01(); + }, + //旋转的身份牌! + spinningIdentityCard:function(identity,dialog){ + const card=ui.create.identityCard(identity); + const buttons=ui.create.div('.buttons',dialog.content); + setTimeout(()=>{ + buttons.appendChild(card); + dialog.open(); + ui.create.cardSpinning(card); + },50); + }, /** * 创建codemirror编辑器 * @param {HTMLDivElement} container @@ -41661,7 +43982,7 @@ for(var i=0;i空房间'); player.roomindex=i; - player.initRoom=lib.element.player.initRoom; + player.initRoom=lib.element.Player.prototype.initRoom; player.addEventListener(lib.config.touchscreen?'touchend':'click',ui.click.connectroom); player.initRoom(list[i]); ui.rooms.push(player); @@ -42581,6 +44902,11 @@ init:false, connect:true }; + infoconfig.connect_mount_combine={ + name:'合并坐骑栏', + init:false, + connect:true + }; } for(var j in infoconfig){ if(j==='update'){ @@ -43945,7 +46271,7 @@ var cfgnode=createConfig({ name:'开启', _name:mode, - init:lib.config.characters.contains(mode), + init:connectMenu?(!lib.config.connect_characters.contains(mode)):(lib.config.characters.contains(mode)), onclick:togglePack }); var cfgnodeAI=createConfig({ @@ -48689,7 +51015,10 @@ var node=ui.create.div('.menubutton.large','录像',start.firstChild,clickMode); node.type='video'; lib.videos=[]; - ui.create.videoNode=(video,before)=>lib.videos[before===true?'unshift':'push'](video); + ui.create.videoNode=(video,before)=>{ + lib.videos.remove(video); + lib.videos[before===true?'unshift':'push'](video); + }; node._initLink=function(){ node.link=page; var store=lib.db.transaction(['video'],'readwrite').objectStore('video'); @@ -49807,46 +52136,7 @@ return dialog; }, dialog:function(){ - var i; - var hidden=false; - var notouchscroll=false; - var forcebutton=false; - var noforcebutton=false; - var dialog=ui.create.div('.dialog'); - dialog.contentContainer=ui.create.div('.content-container',dialog); - dialog.content=ui.create.div('.content',dialog.contentContainer); - dialog.bar1=ui.create.div('.bar.top',dialog); - dialog.bar2=ui.create.div('.bar.bottom',dialog); - dialog.buttons=[]; - for(i in lib.element.dialog){ - dialog[i]=lib.element.dialog[i]; - } - for(i=0;i
  • 选陆逊左慈张春华于吉蒋费孔融自动变孙笨', + boss_newhuanren_info_boss:'第一关:挑战秦广王
    第二关:挑战楚江王,宋帝王,五官王,阎罗王中的一个
    第三关:挑战卞城王,泰山王,都市王,平等王中的一个
    第四关:挑战转轮王
    注:孟婆将在每局前三个阶段随机一个阶段登场
    地藏王登场规则为,50回合内通过第三关,并且在前三关中成功击杀孟婆。
  • 选陆逊左慈张春华于吉蒋费孔融自动变孙笨', lingsheji:'灵蛇髻', lingsheji2:'灵蛇髻', shanrangzhaoshu:'禅让诏书', @@ -9460,12 +9460,12 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ jinwuluorigong_info:'当你于出牌阶段内一次性失去了两张以上的手牌后,你可以弃置一名其他角色等量的牌。', TheDayIBecomeAGod:'神杀', thedayibecomeagod:'传承', - thedayibecomeagod_info:'选择一名其他己方角色。若其势力非神,则改为神势力;若其势力为神,则将武将牌翻至正面,回复体力至体力上限,并将手牌摸至5 ', + thedayibecomeagod_info:'选择一名其他己方角色。若其势力非神,则改为神势力;若其势力为神,则将武将牌翻至正面,回复体力至体力上限,并将手牌摸至5。', gubuzifeng:'故步自封', gubuzifeng_disable:'故步自封', gubuzifeng_info:'出牌阶段,对一名其他角色使用。其的一个随机技能失效直到其下个回合结束。', goujiangdesidai:'篝酱的丝带', - goujiangdesidai_info:'锁定技,若你未拥有技能【纵丝】,则你视为拥有技能【纵丝】;若你拥有技能【纵丝】,则你将此技能改为「出牌阶段限两次」', + goujiangdesidai_info:'锁定技,若你未拥有技能〖纵丝〗,则你视为拥有技能〖纵丝〗;若你拥有技能〖纵丝〗,则你将此技能改为「出牌阶段限两次」。', goujiangdesidai_skill:'纵丝', niaobaidaowenha:'鸟白岛文蛤', niaobaidaowenha_skill:'鸟白岛文蛤', diff --git a/mode/brawl.js b/mode/brawl.js index 493536c68..8c80048b5 100644 --- a/mode/brawl.js +++ b/mode/brawl.js @@ -885,7 +885,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ hhzz_fudichouxin_info:'出牌阶段,对一名角色使用,随机弃置其一个技能。', nei:' ', nei2:' ', - 刷新_info:'消耗1点灵力值,刷新上述技能', + 刷新_info:'消耗1点灵力值,刷新上述技能。', }, }, get:{ @@ -1119,10 +1119,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ hhzz_kanade:'立华奏', hhzz_takaramono1:'坚实宝箱', hhzz_takaramono2:'普通宝箱', - hhzz_toulianghuanzhu:'偷梁换柱', - hhzz_fudichouxin:'釜底抽薪', - hhzz_toulianghuanzhu_info:'出牌阶段,对一名角色使用,随机更换其一个技能。可重铸。', - hhzz_fudichouxin_info:'出牌阶段,对一名角色使用,随机弃置其一个技能。', + hhzz_toulianghuanzhu:'偷梁换柱', + hhzz_fudichouxin:'釜底抽薪', + hhzz_toulianghuanzhu_info:'出牌阶段,对一名角色使用,随机更换其一个技能。可重铸。', + hhzz_fudichouxin_info:'出牌阶段,对一名角色使用,随机弃置其一个技能。', }, }); }); @@ -1143,377 +1143,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, }, }, - qunxionggeju:{ - name:'群雄割据', - mode:'guozhan', - intro:[ - '开放不同势力组合,以优先亮出的武将牌作为自己的势力,双势力武将则使用列表的第一个势力', - ], - showcase:function(init){ - var node=this; - var list=[ - ['re_yuanshao','re_lidian'], - ['zhangliao','sunquan'], - ['xin_fazheng','sp_lvfan'], - ['sunjian','lvbu'], - ['jin_simashi','re_weiyan'], - ['guanyu','sunce'], - ['zhenji','sp_zhangjiao'], - ['guojia','sp_zhugeliang'], - ]; - list.randomSort(); - var func=function(){ - var card=ui.create.player(null,true); - var name=list.shift(); - card.init(name[0],name[1]); - card.node.marks.remove(); - card.node.count.remove(); - card.node.hp.remove(); - card.classList.remove('unseen'); - node.nodes.push(card); - card.style.position='absolute'; - card.style.zIndex=2; - card.style.transition='all 2s'; - var rand1=Math.round(Math.random()*100); - var rand2=Math.round(Math.random()*100); - var rand3=Math.round(Math.random()*40)-20; - card.style.left='calc('+rand1+'% - '+(rand1*1.5)+'px)'; - card.style.top='calc('+rand2+'% - '+(rand2*1.8)+'px)'; - card.style.transform='scale(0.8) rotate('+rand3+'deg)'; - node.appendChild(card); - ui.refresh(card); - }; - - var list2=['feilongduofeng','taipingyaoshu','dinglanyemingzhu']; - var func2=function(){ - var card=game.createCard(list2.shift(),'noclick'); - node.nodes.push(card); - card.style.position='absolute'; - card.style.zIndex=2; - card.style.transition='all 2s'; - var rand1=Math.round(Math.random()*100); - var rand2=Math.round(Math.random()*100); - var rand3=Math.round(Math.random()*40)-20; - card.style.left='calc('+rand1+'% - '+rand1+'px)'; - card.style.top='calc('+rand2+'% - '+rand2+'px)'; - card.style.transform='rotate('+rand3+'deg)'; - node.appendChild(card); - ui.refresh(card); - }; - if(init){ - node.nodes=[]; - } - else{ - while(node.nodes.length){ - node.nodes.shift().remove(); - } - } - for(var i=0;i<5;i++){ - func(); - } - for(var i=0;i<3;i++){ - func2(); - func(); - } - }, - init:function(){}, - content:{ - chooseCharacterBefore:function(){ - game.chooseCharacter=function(){ - var next=game.createEvent('chooseCharacter'); - next.showConfig=true; - next.addPlayer=true; - next.ai=function(player,list,back){ - var mainx=list[0]; - var vicex=list[1]; - if(get.guozhanReverse(mainx,vicex)){ - mainx=list[1]; - vicex=list[0]; - } - player.init(mainx,vicex,false); - if(back){ - list.remove(player.name1); - list.remove(player.name2); - for(var i=0;i'; - td.link=i-1; - seats.appendChild(td); - td.addEventListener(lib.config.touchscreen?'touchend':'click',function(){ - if(_status.dragged) return; - if(_status.justdragged) return; - if(_status.cheat_seat){ - _status.cheat_seat.classList.remove('bluebg'); - if(_status.cheat_seat==this){ - delete _status.cheat_seat; - return; - } - } - this.classList.add('bluebg'); - _status.cheat_seat=this; - }); - } - dialog.content.appendChild(seats); - if(game.me==game.zhu){ - seats.previousSibling.style.display='none'; - seats.style.display='none'; - } - - dialog.add(ui.create.div('.placeholder.add-setting')); - dialog.add(ui.create.div('.placeholder.add-setting')); - if(get.is.phoneLayout()) dialog.add(ui.create.div('.placeholder.add-setting')); - }; - var removeSetting=function(){ - var dialog=_status.event.dialog; - if(dialog){ - dialog.style.height=''; - delete dialog._scrollset; - var list=Array.from(dialog.querySelectorAll('.add-setting')); - while(list.length){ - list.shift().remove(); - } - ui.update(); - } - }; - event.addSetting=addSetting; - event.removeSetting=removeSetting; - - var chosen=lib.config.continue_name||[]; - game.saveConfig('continue_name'); - event.chosen=chosen; - - var i; - event.list=[]; - for(i in lib.character){ - if(i.indexOf('gz_shibing')==0) continue; - if(chosen.contains(i)) continue; - if(lib.filter.characterDisabled(i)) continue; - if(get.config('onlyguozhan')){ - if(!lib.characterPack.mode_guozhan[i]) continue; - if(get.is.jun(i)) continue; - } - if(lib.character[i][4].contains('hiddenSkill')) continue; - if(lib.character[i][2]==3||lib.character[i][2]==4||lib.character[i][2]==5) - event.list.push(i); - } - _status.characterlist=event.list.slice(0); - _status.yeidentity=[]; - event.list.randomSort(); - // var list=event.list.splice(0,parseInt(get.config('choice_num'))); - var list=event.list.randomRemove(parseInt(get.config('choice_num'))); - if(_status.auto){ - event.ai(game.me,list); - lib.init.onfree(); - } - else if(chosen.length){ - game.me.init(chosen[0],chosen[1],false); - lib.init.onfree(); - } - else{ - var dialog=ui.create.dialog('选择角色','hidden',[list,'character']); - if(get.config('change_identity')){ - addSetting(dialog); - } - var next=game.me.chooseButton(dialog,true,2).set('onfree',true); - next.filterButton=function(button){ - if(ui.dialog.buttons.length<=10){ - for(var i=0;i{ + return [i,``]; + }),'textbutton']) + game.me.chooseButton(true).set('dialog',id).set('onfree',true); 'step 1' var pack=game.liangjunduilei[result.links[0]]; game.versusVideoName=pack.name; @@ -4213,7 +3833,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ },style); var editPile=ui.create.node('button','场景选项',line1,function(){ resetCharacter(); - addCharacter.disabled=true; // editCode.disabled=true; saveButton.disabled=true; // exportButton.disabled=true; @@ -4645,14 +4264,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ player.listen(function(){ if(confirm('是否删除此角色?')){ this.remove(); - if(line7.childElementCount<8){ - addCharacter.disabled=false; - } } }); - if(line7.childElementCount>=8){ - addCharacter.disabled=true; - } return player; }; @@ -4720,12 +4333,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ line9.style.display='none'; line9.style.marginTop='20px'; var resetStatus=function(all){ - if(line7.childElementCount>=8){ - addCharacter.disabled=true; - } - else{ - addCharacter.disabled=false; - } // editCode.disabled=false; saveButton.disabled=false; // exportButton.disabled=false; diff --git a/mode/chess.js b/mode/chess.js index 7910d0442..771b036ec 100644 --- a/mode/chess.js +++ b/mode/chess.js @@ -5611,17 +5611,17 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ treasure_wuyashenxiang:'乌鸦神像', dubiaoxianjing:'飞刃', - dubiaoxianjing_info:'距离两格体力值大于1的角色在回合结束后受到一点伤害,然后摸两张牌', + dubiaoxianjing_info:'距离两格体力值大于1的角色在回合结束后受到1点伤害,然后摸两张牌。', jiqishi:'集气', - jiqishi_info:'距离两格以内的已受伤角色在回合结束后回复一点体力,然后弃置两张牌', + jiqishi_info:'距离两格以内的已受伤角色在回合结束后回复1点体力,然后弃置两张牌。', shenmidiaoxiang:'秘咒', - shenmidiaoxiang_info:'距离三格以外的所有角色在回合结束后强制向此处移动一格', + shenmidiaoxiang_info:'距离三格以外的所有角色在回合结束后强制向此处移动一格。', shenpanxianjing:'审判', - shenpanxianjing_info:'在任意一名角色回合结束后,若没有其他角色手牌数比其多,随机弃置其一张手牌', + shenpanxianjing_info:'在任意一名角色回合结束后,若没有其他角色手牌数比其多,随机弃置其一张手牌。', shiyuansu:'护体', - shiyuansu_info:'任意一名角色一次性受到不少于两点伤害后,使其获得一点护甲', + shiyuansu_info:'任意一名角色一次性受到不少于2点伤害后,使其获得1点护甲。', wuyashenxiang:'厄音', - wuyashenxiang_info:'距离3格以内的角色在其回合结束后,若体力值不大于1,令其回复一点体力,然后将牌堆中的一张延时锦囊牌置于其判定区', + wuyashenxiang_info:'距离3格以内的角色在其回合结束后,若体力值不大于1,令其回复1点体力,然后将牌堆中的一张延时锦囊牌置于其判定区。', leader_caocao:'曹操', leader_liubei:'刘备', @@ -5637,9 +5637,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ leader_zhenlve_info:'友方角色使用的普通锦囊牌不可被【无懈可击】响应。', tongshuai:'统率', - tongshuai_info:'准备阶段和结束阶段,你可以选择一名未上场的已方武将的一个技能作为你的技能', + tongshuai_info:'准备阶段和结束阶段,你可以选择一名未上场的已方武将的一个技能作为你的技能。', leader_zhaoxiang:'招降', - leader_zhaoxiang_info:'出牌阶段限一次,你可以尝试对相邻敌方武将进行招降,若成功,你获得该武将并立即结束本局游戏,若失败,你受到一点伤害。每发动一次消耗10招募令。', + leader_zhaoxiang_info:'出牌阶段限一次,你可以尝试对相邻敌方武将进行招降,若成功,你获得该武将并立即结束本局游戏,若失败,你受到1点伤害。每发动一次消耗10招募令。', common:'普通', rare:'精品', @@ -5681,7 +5681,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ boss_bfengxing:'风行', boss_bfengxing_info:'锁定技,摸牌阶段,你多摸两张牌;你的攻击范围+2;你回合内的移动距离+2。', boss_chiyu:'炽羽', - boss_chiyu_info:'出牌阶段限一次,你可以弃置一张红色牌,对距离5以内的所有其他角色各造成一点火焰伤害。', + boss_chiyu_info:'出牌阶段限一次,你可以弃置一张红色牌,对距离5以内的所有其他角色各造成1点火焰伤害。', boss_tenglong:'腾龙八齐', boss_tenglong_info:'锁定技,你废除你的装备区;出牌阶段限一次,你可以弃置一张装备牌并对一名距离你2以内的其他角色造成3点火焰伤害。', boss_wushang:'神天并地', diff --git a/mode/connect.js b/mode/connect.js index 4ad1013f7..928aed2c0 100644 --- a/mode/connect.js +++ b/mode/connect.js @@ -35,21 +35,26 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ node.style.left='calc(50% - 210px)'; node.style.top='calc(50% - 20px)'; node.style.whiteSpace='nowrap'; - node.innerHTML=lib.config.last_ip||lib.hallURL; + node.textContent=lib.config.last_ip||lib.hallURL; node.contentEditable=true; node.style.webkitUserSelect='text'; node.style.textAlign='center'; node.style.overflow='hidden'; var connect=function(e){ - event.textnode.innerHTML='正在连接...'; + const info=lib.config.reconnect_info; + if(info&&info[0]==node.textContent){ + game.onlineID=info[1]; + if(typeof (game.roomId=info[2])=='string') game.roomIdServer=true; + } + event.textnode.textContent='正在连接...'; clearTimeout(event.timeout); if(e) e.preventDefault(); - game.saveConfig('last_ip',node.innerHTML); - game.connect(node.innerHTML,function(success){ + game.saveConfig('last_ip',node.textContent=node.textContent); + game.connect(node.textContent,function(success){ if(!success&&event.textnode){ alert('连接失败'); - event.textnode.innerHTML='输入联机地址'; + event.textnode.textContent='输入联机地址'; } }); }; @@ -82,7 +87,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ ui.ipbutton=button; ui.hall_button=ui.create.system('联机大厅',function(){ - node.innerHTML=get.config('hall_ip')||lib.hallURL; + node.textContent=get.config('hall_ip')||lib.hallURL; connect(); },true); if(!get.config('hall_button')){ @@ -90,7 +95,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } ui.recentIP=ui.create.system('最近连接',null,true); var clickLink=function(){ - node.innerHTML=this.innerHTML; + node.textContent=this.textContent; connect(); }; lib.setPopped(ui.recentIP,function(){ @@ -101,7 +106,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }); var list=ui.create.div('.caption'); for(var i=0;i清除'); @@ -119,29 +124,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ if(window.isNonameServer){ game.connect(window.isNonameServerIp||'localhost'); } - else if(lib.config.reconnect_info){ - var info=lib.config.reconnect_info; - game.onlineID=info[1]; - game.roomId=info[2]; - if(typeof game.roomId=='string'){ - game.roomIdServer=true; - } - var n=5; - var connect=function(){ - event.textnode.innerHTML='正在连接...'; - game.connect(info[0],function(success){ - if(!success&&n--){ - createNode(); - event.timeout=setTimeout(connect,1000); - } - else{ - event.textnode.innerHTML='输入联机地址'; - } - }); - }; - event.timeout=setTimeout(connect,500); - _status.createNodeTimeout=setTimeout(createNode,2000); - } else{ createNode(); } @@ -153,13 +135,6 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } } _status.connectDenied=createNode; - for(var i in lib.element.event){ - event.parent[i]=lib.element.event[i]; - } - event.parent.custom={ - add:{}, - replace:{} - }; setTimeout(lib.init.onfree,1000); } }; diff --git a/mode/doudizhu.js b/mode/doudizhu.js index 9a8a6c125..951f7dc65 100644 --- a/mode/doudizhu.js +++ b/mode/doudizhu.js @@ -685,8 +685,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ var next=game.createEvent('chooseCharacter'); next.showConfig=true; next.addPlayer=function(player){ - var list=lib.config.mode_config.identity.identity[game.players.length-3].slice(0); - var list2=lib.config.mode_config.identity.identity[game.players.length-2].slice(0); + var list=get.identityList(game.players.length-1); + var list2=get.identityList(game.players.length); for(var i=0;i游戏规则
    • 游戏人数
      游戏人数为3人(地主x1 + 农民x2)。
    • 胜利条件
      农民:地主死亡。
      地主:所有农民死亡且自己存活。'+ - '
    • 死亡奖惩
      当有农民死亡时,若另一名农民存活,则其可以选择摸两张牌或回复一点体力。
    • 地主专属技能
      地主可以使用专属技能【飞扬】和【跋扈】。
      【飞扬】判定阶段开始时,若你的判定区有牌,则你可以弃置两张手牌,然后弃置你判定区的一张牌。每回合限一次。
      【跋扈】锁定技,准备阶段开始时,你摸一张牌。出牌阶段,你可以多使用一张【杀】。
    ', + '
  • 死亡奖惩
    当有农民死亡时,若另一名农民存活,则其可以选择摸两张牌或回复1点体力。
  • 地主专属技能
    地主可以使用专属技能〖飞扬〗和〖跋扈〗。
    〖飞扬〗判定阶段开始时,若你的判定区有牌,则你可以弃置两张手牌,然后弃置你判定区的一张牌。每回合限一次。
    〖跋扈〗锁定技,准备阶段开始时,你摸一张牌。出牌阶段,你可以多使用一张【杀】。
', } }; }); diff --git a/mode/guozhan.js b/mode/guozhan.js index 773636147..0ac45de59 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -99,11 +99,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ if(_status.brawl&&_status.brawl.submode){ _status.mode=_status.brawl.submode; } + if(get.config('separatism')) _status.separatism=true; } "step 1" if(_status.connectMode){ _status.mode=lib.configOL.guozhan_mode; if(!['normal','yingbian','old'].contains(_status.mode)) _status.mode='normal'; + if(lib.configOL.separatism) _status.separatism=true; //决定牌堆 switch(_status.mode){ case 'old':lib.card.list=lib.guozhanPile_old.slice(0);break; @@ -115,8 +117,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ default:lib.card.list=lib.guozhanPile.slice(0);break; } game.fixedPile=true; - game.broadcastAll(function(mode){ + game.broadcastAll((mode,separatism)=>{ _status.mode=mode; + if(separatism) _status.separatism=true; if(mode=='yingbian'){ delete lib.translate.shuiyanqijunx_info_guozhan; } @@ -145,7 +148,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } } lib.characterReplace={}; - },_status.mode); + },_status.mode,_status.separatism); game.randomMapOL(); } else{ @@ -189,8 +192,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ game.gameDraw(event.playerx); game.broadcastAll(function(player){ for(var i=0;i0) return 1; return (get.attitude(trigger.source,trigger.player)<0&&get.junlingEffect(player,result.junling,trigger.source,result.targets,trigger.source)>=-2)?1:0; @@ -8675,7 +8679,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ if(num0) return 11-get.value(card); return 7-get.value(card); }); @@ -12931,7 +12935,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ "step 1" if(result.bool){ var nono=(get.damageEffect(trigger.player,player,trigger.player)>=0); - trigger.player.chooseToDiscard('弃置一张装备牌,或受到一点伤害','he',{type:'equip'}).set('ai',function(card){ + trigger.player.chooseToDiscard('弃置一张装备牌,或受到1点伤害','he',{type:'equip'}).set('ai',function(card){ if(_status.event.nono){ return 0; } @@ -12950,7 +12954,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, _mingzhi1:{ trigger:{player:'phaseBeginStart'}, - priority:19, + //priority:19, + ruleSkill:true, forced:true, popup:false, filter:function(event,player){ @@ -13503,6 +13508,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ else{ num={mark:'标记',draw:'摸牌'}[lib.configOL.initshow_draw]; } + uiintro.add('
群雄割据:'+(lib.configOL.separatism?'开启':'关闭')); uiintro.add('
首亮奖励:'+num); uiintro.add('
珠联璧合:'+(lib.configOL.zhulian?'开启':'关闭')); uiintro.add('
出牌时限:'+lib.configOL.choose_timeout+'秒'); @@ -13584,7 +13590,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, getVideoName:function(){ var str=get.translation(game.me.name1)+'/'+get.translation(game.me.name2); - var str2=get.cnNumber(parseInt(get.config('player_number')))+'人'+ + var str2=_status.separatism?get.modetrans({ + mode:lib.config.mode, + separatism:true + }):get.cnNumber(parseInt(get.config('player_number')))+'人'+ get.translation(lib.config.mode); if(game.me.identity=='ye'){ str2+=' - 野心家'; @@ -13688,6 +13697,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } } var filterChoice=function(name1,name2){ + if(_status.separatism) return true; var group1=lib.character[name1][1]; var group2=lib.character[name2][1]; var doublex=get.is.double(name1,true); @@ -13848,6 +13858,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } if(lib.character[button.link][4].contains('hiddenSkill')) return false; var filterChoice=function(name1,name2){ + if(_status.separatism) return true; var group1=lib.character[name1][1]; var group2=lib.character[name2][1]; var doublex=get.is.double(name1,true); @@ -14036,6 +14047,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ 'step 0' game.broadcastAll(function(){ ui.arena.classList.add('choose-character'); + for(var i=0;idouble.contains(group)); + return doublex.contains(group2); + } + else{ + if(group1=='ye') return group2!='ye'; + var double=get.is.double(name2,true); + if(double) return double.contains(group1); + return group1==group2; + } }; for(var i=0;iget.is.double(name1,true).contains(group)).randomGet(); - if(lib.character[name1][1]=='ye') return get.is.double(name2,true).randomGet(); - }(); - } - game.broadcast(function(result,result2){ - for(var i in result){ - if(!lib.playerOL[i].name){ - lib.playerOL[i].init(result[i][0],result[i][1],false); - } - if(result2[i]&&result2[i].length) lib.playerOL[i].trueIdentity=result2[i]; - } - setTimeout(function(){ - ui.arena.classList.remove('choose-character'); - },500); - },result2,result); - for(var i in result2){ - if(!lib.playerOL[i].name){ - lib.playerOL[i].init(result2[i][0],result2[i][1],false); - } - if(result[i]&&result[i].length) lib.playerOL[i].trueIdentity=result[i]; - } - for(var i=0;i当你失去体力时,你可改为将一张“天兵”置入弃牌堆。
与你势力相同的角色可将一张“天兵”当作【杀】使用或打出。', + huangjintianbingfu_info:'锁定技,当你计算群势力角色数时,每一张“天兵”均可视为一名群势力角色。
当你失去体力时,你可改为将一张“天兵”置入弃牌堆。
与你势力相同的角色可将一张“天兵”当作【杀】使用或打出。', wuhujiangdaqi:'五虎将大旗', wuhujiangdaqi_ab:'将旗', wuhujiangdaqi_bg:'旗', wuhujiangdaqi_info:'存活的蜀势力角色的技能按以下规则改动:
武圣:将“红色牌”改为“任意牌”
咆哮:增加描述“你使用的【杀】无视其他角色的防具”
龙胆:增加描述“你发动〖龙胆〗使用或打出牌时摸一张牌”
烈弓:增加描述“你的攻击范围+1”
铁骑:将“一张明置的武将牌”改为“所有明置的武将牌”', zhangwu:'章武', - zhangwu_info:'锁定技。当【飞龙夺凤】进入弃牌堆或其他角色的装备区后,你获得之。当你不因使用而失去【飞龙夺风】时,你展示此牌,将此牌置于牌堆底并摸两张牌', + zhangwu_info:'锁定技。当【飞龙夺凤】进入弃牌堆或其他角色的装备区后,你获得之。当你不因使用而失去【飞龙夺风】时,你展示此牌,将此牌置于牌堆底并摸两张牌。', shouyue:'授钺', shouyue_info:'君主技。只要此武将牌处于明置状态,你便拥有“五虎将大旗”。', jizhao:'激诏', @@ -14749,11 +14729,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gzsuishi2:'随势', gzsuishi_info:'锁定技,其他角色进入濒死状态时,若伤害来源与你势力相同,你摸一张牌;其他角色死亡时,若其与你势力相同,你失去1点体力。', baoling:'暴凌', - baoling_info:'主将技,锁定技,出牌阶段结束时,若你有副将,则你移除副将,然后加3点体力上限,回复3点体力,失去技能〖暴凌〗并获得〖崩坏〗', + baoling_info:'主将技,锁定技,出牌阶段结束时,若你有副将,则你移除副将,然后加3点体力上限,回复3点体力,失去技能〖暴凌〗并获得〖崩坏〗。', yingyang:'鹰扬', yingyang_info:'当你的拼点牌亮出后,你可以令此牌的点数+3或-3(至多为K,至少为1)。', hunshang:'魂殇', - hunshang_info:'副将技,此武将牌减少半个阴阳鱼;准备阶段,若你的体力值不大于1,则你本回合获得“英姿”和“英魂”', + hunshang_info:'副将技,此武将牌减少半个阴阳鱼;准备阶段,若你的体力值不大于1,则你本回合获得“英姿”和“英魂”。', gzguixiu:'闺秀', gzguixiu_info:'当你明置此武将牌时,你可以摸两张牌;当你移除此武将牌时,你可以回复1点体力。', gzcunsi:'存嗣', @@ -14761,7 +14741,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gzyongjue:'勇决', gzyongjue_info:'与你势力相同的一名角色于其回合内使用【杀】结算完成后,若此牌是其本回合内使用的第一张牌,则其可以获得此牌对应的所有实体牌。', gzqianxi:'潜袭', - gzqianxi_info:'准备阶段开始时,你可以进行判定,然后你选择距离为1的一名角色,直到回合结束,该角色不能使用或打出与结果颜色相同的手牌', + gzqianxi_info:'准备阶段开始时,你可以进行判定,然后你选择距离为1的一名角色,直到回合结束,该角色不能使用或打出与结果颜色相同的手牌。', gzshangyi:'尚义', gzshangyi_info:'出牌阶段限一次,你可以令一名其他角色观看你的手牌。若如此做,你选择一项:1.观看其手牌并可以弃置其中的一张黑色牌;2.观看其所有暗置的武将牌。', niaoxiang:'鸟翔', @@ -14776,7 +14756,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ tianfu:'天覆', tianfu_info:'主将技,阵法技,若当前回合角色与你处于同一队列,则你视为拥有技能〖看破〗。', ziliang:'资粮', - ziliang_info:'副将技,当与你势力相同的一名角色受到伤害后,你可以将一张“田”交给该角色 ', + ziliang_info:'副将技,当与你势力相同的一名角色受到伤害后,你可以将一张“田”交给该角色。', gzjixi:'急袭', gzjixi_info:'主将技,此武将牌减少半个阴阳鱼。你可以将一张“田”当作【顺手牵羊】使用。', huyuan:'护援', @@ -14806,11 +14786,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gzqianxun:'谦逊', gzqianxun_info:'锁定技,当你成为【顺手牵羊】的目标时,或有【乐不思蜀】进入你的判定区时,取消之。', gzkongcheng:'空城', - gzkongcheng_info:'锁定技,当你成为【杀】或【决斗】的目标时,若你没有手牌,则取消之', + gzkongcheng_info:'锁定技,当你成为【杀】或【决斗】的目标时,若你没有手牌,则取消之。', gzxiaoji:'枭姬', gzxiaoji_info:'当你失去装备区里的牌后,你可以摸一张牌。若你不是当前回合角色,则你改为摸三张牌。', gzrende:'仁德', - gzrende_info:'出牌阶段,你可以将任意张手牌交给其他角色,然后若你于此阶段内给出第三张“仁德”牌时,你回复1点体力', + gzrende_info:'出牌阶段,你可以将任意张手牌交给其他角色,然后若你于此阶段内给出第三张“仁德”牌时,你回复1点体力。', gzzhiheng:'制衡', gzzhiheng_info:'出牌阶段限一次,你可以弃置至多X张牌(X为你的体力上限),然后摸等量的牌。', duoshi:'度势', @@ -14843,7 +14823,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gzpozhu:'破竹', gzpozhu_info:'主将技。此武将牌减少半个阴阳鱼。出牌阶段,你可以移去一枚“陈”并将一张手牌当做【出其不意】使用。若你未因此牌造成过伤害,则你不能再发动〖破竹〗直到回合结束。', gzyimie:'夷灭', - gzyimie_info:'主将技,此武将牌减少一整个阴阳鱼。每轮限一次,当你对其他角色造成伤害时,若伤害值X小于Y,则你可失去1点体力,将伤害值改为Y。此伤害结算结束后,其回复(Y-X)点体力。(Y为其体力值)’', + gzyimie_info:'主将技,此武将牌减少一整个阴阳鱼。每轮限一次,当你对其他角色造成伤害时,若伤害值X小于Y,则你可失去1点体力,将伤害值改为Y。此伤害结算结束后,其回复(Y-X)点体力。(Y为其体力值)', gztairan:'泰然', gztairan_info:'出牌阶段开始时,你可以失去任意点体力并弃置任意张牌(弃牌数不能大于你已损失的体力值)。若如此做,本回合结束时,你回复等量的体力并摸等量的牌。', gzxuanbei:'选备', @@ -16059,7 +16039,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } if(_status.yeidentity&&_status.yeidentity.contains(group)) return false; if(get.zhu(this,null,group)) return true; - return get.totalPopulation(group)+1<=get.population()/2; + return get.totalPopulation(group)+1<=_status.separatism?Math.max(get.population()/2-1,1):get.population()/2; }, perfectPair:function(choosing){ if(_status.connectMode){ @@ -16472,7 +16452,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ '
声明
  • 以下所有规则均为根据公开爆料整理,经村规改动后制定的临时规则。不代表任何官方意见。请以后续发布的官方规则作为标准。
' +'
双势力武将
  • 双势力武将牌可以和野心家武将牌/包含势力单武将牌/含有重叠势力的其他双势力武将牌组合,若你的主将为双势力武将,则:若你的副将为单势力武将牌,你的势力视为此势力;若你的副将为双势力武将,你的势力视为两张武将牌上的重叠势力(若重叠势力不止一个则需在游戏开始时选择一个作为自己的势力);野心家武将牌为主将,双势力武将牌为副将时,游戏开始时需选择一个副将所含势力作为副将的势力。
  • 变更副将时,可以选择包含原势力的双势力武将牌。左慈发动【役鬼】时,可以使用双势力武将牌同时指定两个不同势力的角色为目标。
  • 特殊地,“冈崎汐”作为多势力武将牌,结算流程和规则与其他双势力武将相同。
' +'
野心家武将
  • 野心家武将只能放在主将位置。副将可以为任意非野心家武将牌。
  • 选择了野心家武将牌的角色(以下简称“野心家角色”)仅明置副将时,若副将为单势力武将牌,则势力暂时视为与该武将牌相同。若副将为双势力武将牌,则势力视为游戏开始时选择的副将代表的势力。
  • 野心家角色明置主将时,其势力改为野心家。若其是首次明置该武将牌,则其获得一个“野心家”标记。
  • “野心家”标记可以当做“先驱”标记,“阴阳鱼”标记或是“珠联璧合”标记使用。当同时拥有两种标记时,优先弃置原装标记,下次发动时才弃置“野心家”标记。
  • 野心家角色变更副将时,若其主将未明置过,则按照副将的势力进行变更。若主将已经明置过,则可以选择所有的非野心家武将牌。左慈发动【役鬼】时,可以使用野心家武将牌同时指定所有势力的角色为目标。' - +'
  • 当场上触发了胜利条件时,若这些角色中存在未明置过主将的野心家角色,则这些野心家角色选择是否“暴露野心”。若无人选择“是”且场上存在非野心家角色存活,则所有非野心家角色胜利,野心家角色失败。若有人选择“是”,则这些角色明置主将,然后选择是否发起“拉拢人心”
  • 选择发起“拉拢人心”的野心家角色选择一个新的势力作为自己的势力,弃置“野心家”标记,令所有其他非野心家角色且非君主且非已“结盟”角色依次选择是否和该野心家角色“结盟”。选择“是”的角色将势力改为和该野心家势力相同。此次“拉拢人心”对所有其他角色询问结束后,所有选择“否”的角色将手牌摸至四张并回复1点体力。
' + +'
  • 当场上触发了胜利条件时,若这些角色中存在未明置过主将的野心家角色,则这些野心家角色选择是否“暴露野心”。若无人选择“是”且场上存在非野心家角色存活,则所有非野心家角色胜利,野心家角色失败。若有人选择“是”,则这些角色明置主将,然后选择是否发起“拉拢人心”。
  • 选择发起“拉拢人心”的野心家角色选择一个新的势力作为自己的势力,弃置“野心家”标记,令所有其他非野心家角色且非君主且非已“结盟”角色依次选择是否和该野心家角色“结盟”。选择“是”的角色将势力改为和该野心家势力相同。此次“拉拢人心”对所有其他角色询问结束后,所有选择“否”的角色将手牌摸至四张并回复1点体力。' +'
    纵横捭阖
    • 当一名角色对目标角色发动具有拥有“纵横”衍生技的技能时,其可以令对方获得“纵横”衍生技直到其下回合结束。
    ', }, }; diff --git a/mode/identity.js b/mode/identity.js index 5dac34c85..4ea9a2b98 100644 --- a/mode/identity.js +++ b/mode/identity.js @@ -234,11 +234,44 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ game.players[i].ai.shown=0; } } + var stratagemMode=_status.mode=='stratagem'; + if(stratagemMode){ + var beginner; + if(_status.cheat_seat){ + var seat=_status.cheat_seat.link; + beginner=seat==0?game.me:game.players[game.players.length-seat]; + if(!beginner) beginner=game.me; + delete _status.cheat_seat; + } + else{ + beginner=game.players[Math.floor(Math.random()*game.players.length)]; + } + event.beginner=beginner; + + var stratagemBroadcast=()=>{ + _status.stratagemFuryMax=3; + ui.css.stratagemCardStyle=lib.init.sheet([ + '.card.stratagem-fury-glow:before{', + 'opacity:0.2;', + 'box-shadow:rgba(0,0,0,0.2) 0 0 0 1px,rgb(255,109,12) 0 0 5px,rgb(255,0,0) 0 0 10px;', + 'background-color:yellow;', + '-webkit-filter:blur(5px);', + 'filter:blur(5px);', + '}' + ].join('')); + }; + game.broadcastAll(stratagemBroadcast); + if(_status.connectMode&&!_status.postReconnect.stratagemReinit) _status.postReconnect.stratagemReinit=[stratagemBroadcast,{}]; + for(var current of game.players){ + if(current.identity=='zhu') current.addSkill('stratagem_monarchy'); + if(current.identity=='fan') current.addSkill('stratagem_revitalization'); + } + } if(game.zhu==game.me&&game.zhu.identity!='zhu'&&_status.brawl&&_status.brawl.identityShown){ delete game.zhu; } else{ - game.zhu.ai.shown=1; + if(!stratagemMode) game.zhu.ai.shown=1; if(game.zhu2){ game.zhong=game.zhu; game.zhu=game.zhu2; @@ -252,10 +285,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } var enhance_zhu=false; if(_status.connectMode){ - enhance_zhu=(_status.mode!='zhong'&&_status.mode!='purple'&&lib.configOL.enhance_zhu&&get.population('fan')>=3); + enhance_zhu=(!['zhong','stratagem','purple'].includes(_status.mode)&&lib.configOL.enhance_zhu&&get.population('fan')>=3); } else{ - enhance_zhu=(_status.mode!='zhong'&&_status.mode!='purple'&&get.config('enhance_zhu')&&get.population('fan')>=3); + enhance_zhu=(!['zhong','stratagem','purple'].includes(_status.mode)&&get.config('enhance_zhu')&&get.population('fan')>=3); } if(enhance_zhu){ var skill; @@ -286,22 +319,47 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ var players=get.players(lib.sort.position); var info=[]; for(var i=0;i5) return 5; return 4; }); if(_status.connectMode&&lib.configOL.change_card) game.replaceHandcards(game.players.slice(0)); "step 7" - game.phaseLoop(_status.firstAct2||game.zhong||game.zhu||_status.firstAct||game.me); + game.phaseLoop(event.beginner); }, game:{ canReplaceViewpoint:()=>true, @@ -359,8 +417,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ uiintro.add('
    游戏模式:'+(lib.configOL.identity_mode=='zhong'?'明忠':'标准')); uiintro.add('
    双将模式:'+(lib.configOL.double_character?'开启':'关闭')); if(lib.configOL.identity_mode!='zhong'){ - uiintro.add('
    双内奸:'+(lib.configOL.double_nei?'开启':'关闭')); - uiintro.add('
    加强主公:'+(lib.configOL.enhance_zhu?'开启':'关闭')); + if(lib.configOL.identity_mode=='stratagem'){ + uiintro.add('
    首轮强化:'+(lib.configOL.round_one_use_fury?'开启':'关闭')); + } + else{ + uiintro.add('
    双内奸:'+(lib.configOL.double_nei?'开启':'关闭')); + uiintro.add('
    加强主公:'+(lib.configOL.enhance_zhu?'开启':'关闭')); + } } else{ uiintro.add('
    卡牌替换:'+(lib.configOL.zhong_card?'开启':'关闭')); @@ -414,6 +477,29 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } } } + else if(_status.mode=='stratagem'){ + if(game.zhu&&game.zhu.isZhu&&game.zhu.identityShown||game.me.identity=='zhu'){ + return { + fan:'反', + zhong:'忠', + nei:'内', + enemy:'敌', + friend:'友', + cai:'猜', + } + } + else{ + return { + fan:'反', + zhong:'忠', + nei:'内', + zhu:'主', + enemy:'敌', + friend:'友', + cai:'猜', + } + } + } else{ return { fan:'反', @@ -430,6 +516,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ case 'zhong':list[i]='忠臣';break; case 'nei':list[i]='内奸';break; case 'zhu':list[i]='主公';break; + case 'enemy':list[i]='敌方';break; + case 'friend':list[i]='友方';break; case 'cai':case 'cai2':list[i]='未知';break; case 'rZhong':case 'bZhong':list[i]='前锋';break; case 'rNei':case 'bNei':list[i]='细作';break; @@ -448,6 +536,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ switch(_status.mode){ case 'purple':str2='3v3v2 - '+(game.me.identity.indexOf('r')==0?'暖色':'冷色')+lib.translate[game.me.identity+'2'];break; case 'zhong':str2='忠胆英杰 - '+lib.translate[game.me.identity+'2'];break; + case 'stratagem':str2=get.cnNumber(get.playerNumber())+'人谋攻'+'-'+lib.translate[game.me.identity+'2']; default:str2=get.cnNumber(get.playerNumber())+'人'+ get.translation(lib.config.mode)+' - '+lib.translate[game.me.identity+'2'] } @@ -753,7 +842,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ player.init(result.links[0]); player.hp++; player.maxHp++; - player.update(); + player.$update(); } }); "step 5" @@ -960,6 +1049,237 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ },500); }); }, + chooseCharacterStratagemOL:function(){ + var next=game.createEvent('chooseCharacter'); + next.setContent(function(){ + 'step 0' + ui.arena.classList.add('choose-character'); + var i; + var identityList=get.identityList(game.players.length); + if(lib.configOL.double_nei){ + switch(lib.configOL.number){ + case 8: + identityList.remove('fan'); + identityList.push('nei'); + break; + case 7: + identityList.remove('zhong'); + identityList.push('nei'); + break; + case 6: + identityList.remove('fan'); + identityList.push('nei'); + break; + case 5: + identityList.remove('fan'); + identityList.push('nei'); + break; + case 4: + identityList.remove('zhong'); + identityList.push('nei'); + break; + case 3: + identityList.remove('fan'); + identityList.push('nei'); + break; + } + } + identityList.randomSort(); + for(i=0;i5){ + num=5; + } + num2=event.list.length-num*(game.players.length-1); + if(lib.configOL.double_nei){ + num2=Math.floor(num2/2); + } + if(num2>2){ + num2=2; + } + for(var i=0;igame.addGlobalSkill(globalSkill)); + game.players.forEach(current=>{ + current.storage.zhibi=[]; + current.storage.stratagem_expose=[]; + current.markSkill('stratagem_fury'); + }); + + setTimeout(function(){ + ui.arena.classList.remove('choose-character'); + },500); + }); + }, chooseCharacter:function(){ if(_status.mode=='purple'){ game.chooseCharacterPurple(); @@ -968,8 +1288,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ var next=game.createEvent('chooseCharacter'); next.showConfig=true; next.addPlayer=function(player){ - var list=lib.config.mode_config.identity.identity[game.players.length-3].slice(0); - var list2=lib.config.mode_config.identity.identity[game.players.length-2].slice(0); + var list=get.identityList(game.players.length-1); + var list2=get.identityList(game.players.length); for(var i=0;i4){ + if(!event.stratagemMode&&game.me==game.zhu&&game.players.length>4){ game.me.hp++; game.me.maxHp++; game.me.update(); } for(var i=0;igame.addGlobalSkill(globalSkill)); + game.players.forEach(i=>{ + i.storage.zhibi=[]; + i.storage.stratagem_expose=[]; + i.markSkill('stratagem_fury'); + }); + } setTimeout(function(){ ui.arena.classList.remove('choose-character'); },500); @@ -1742,6 +2105,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ game.chooseCharacterPurpleOL(); return; } + else if(_status.mode=='stratagem'){ + game.chooseCharacterStratagemOL(); + return; + } var next=game.createEvent('chooseCharacter'); next.setContent(function(){ "step 0" @@ -1753,7 +2120,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ identityList=['zhu','zhong','mingzhong','nei','fan','fan','fan','fan']; } else{ - identityList=lib.config.mode_config.identity.identity[game.players.length-2].slice(0); + identityList=get.identityList(game.players.length); if(lib.configOL.double_nei){ switch(lib.configOL.number){ case 8: @@ -1852,6 +2219,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } zhu.identityShown=true; zhu.identity=zhuid; + if(zhuid=='zhu') zhu.isZhu=true; zhu.setIdentity(); zhu.node.identity.classList.remove('guessing'); me.setIdentity(identity); @@ -1950,14 +2318,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ var next=game.zhu.chooseButton(true); next.set('selectButton',(lib.configOL.double_character?2:1)); next.set('createDialog',['选择角色',[list,'characterx']]); - next.set('callback',function(player,result){ - player.init(result.links[0],result.links[1]); - }); next.set('ai',function(button){ return Math.random(); }); "step 1" - if(game.me!=game.zhu){ + if(!game.zhu.name){ game.zhu.init(result.links[0],result.links[1]) } event.list.remove(get.sourceCharacter(game.zhu.name1)); @@ -1971,7 +2336,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ game.zhu.update(); } game.broadcast(function(zhu,name,name2,addMaxHp){ - if(game.zhu!=game.me){ + if(!zhu.name){ zhu.init(name,name2); } if(addMaxHp){ @@ -2160,6 +2525,16 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ },500); }); }, + stratagemCamouflage:function(){ + var next=game.createEvent('stratagemCamouflage'); + next.players=game.players.slice(); + if(_status.connectMode){ + next.setContent('stratagemCamouflageOL'); + } + else{ + next.setContent('stratagemCamouflage'); + } + }, }, translate:{ zhu:"主", @@ -2191,6 +2566,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ nei2:"内奸", fan2:"反贼", random2:"随机", + enemy:'敌', + friend:'友', + enemy2:'敌方', + friend2:'友方', identity_junshi_bg:'师', identity_dajiang_bg:'将', identity_zeishou_bg:'首', @@ -2204,13 +2583,31 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ ai_strategy_5:'天使', ai_strategy_6:'仇主', dongcha:'洞察', - dongcha_info:'游戏开始时,随机一名反贼的身份对你可见;准备阶段,你可以弃置场上的一张牌', + dongcha_info:'游戏开始时,随机一名反贼的身份对你可见;准备阶段,你可以弃置场上的一张牌。', sheshen:'舍身', - sheshen_info:'锁定技,主公处于濒死状态即将死亡时,令主公+1体力上限,回复体力至X点(X为你的体力值数),获得你的所有牌,然后你死亡', + sheshen_info:'锁定技,主公处于濒死状态即将死亡时,令主公+1体力上限,回复体力至X点(X为你的体力值数),获得你的所有牌,然后你死亡。', yexinbilu:'野心毕露', + stratagem_insight:'洞察' }, element:{ player:{ + insightInto:function(target){ + var next=game.createEvent('stratagemInsight'); + next.player=this; + next.target=target; + next.setContent('stratagemInsight'); + return next; + }, + addExpose:function(num){ + if(!game.zhu||!game.zhu.isZhu||!game.zhu.identityShown) return; + if(typeof this.ai.shown=='number'&&!this.identityShown&&this.ai.shown<1){ + this.ai.shown+=num; + if(this.ai.shown>0.95){ + this.ai.shown=0.95; + } + } + return this; + }, yexinbilu:function(){ game.broadcastAll(function(player){ player.showIdentity(); @@ -2253,6 +2650,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } }, dieAfter2:function(source){ + if(_status.mode=='stratagem') return; if(_status.mode=='purple'){ if(source){ if(this.identity=='rZhu'||this.identity=='bZhu'){ @@ -2392,6 +2790,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, logAi:function(targets,card){ if(this.ai.shown==1||this.isMad()) return; + var stratagemMode=get.mode()=='identity'&&_status.mode=='stratagem'; + if(stratagemMode&&(!game.zhu||!game.zhu.isZhu||!game.zhu.identityShown)) return; if(typeof targets=='number'){ this.ai.shown+=targets; } @@ -2438,10 +2838,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ else this.ai.shown-=0.1; } } - if(this!=game.me) this.ai.shown*=2; + if(!stratagemMode&&this!=game.me) this.ai.shown*=2; if(this.ai.shown>0.95) this.ai.shown=0.95; if(this.ai.shown<-0.5) this.ai.shown=-0.5; if(_status.mode=='purple') return; + if(stratagemMode) return; var marknow=(!_status.connectMode&&this!=game.me&&get.config('auto_mark_identity')&&this.ai.identity_mark!='finished'); // if(true){ @@ -2540,6 +2941,188 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ delete _status.clickingidentity; } } + }, + content:{ + stratagemInsight:event=>{ + 'step 0' + game.log(player,'洞察了',target,'与其的阵营关系'); + 'step 1' + var storage=player.storage; + if(!storage.zhibi) storage.zhibi=[]; + var zhibi=storage.zhibi; + if(!zhibi.includes(target)) zhibi.push(target); + var insightResult=event.insightResult=get.insightResult(player,target); + event.videoId=lib.status.videoId++; + var send=(clientTarget,clientInsightResult,id)=>{ + var classList=clientTarget.classList,nonStratagemInsightFlashing=classList.contains('flash-animation-iteration-count-infinite'); + if(nonStratagemInsightFlashing) clientTarget.nonStratagemInsightFlashing=true; + else classList.add('flash-animation-iteration-count-infinite'); + var identity=get.translation(`${clientInsightResult}2`); + clientTarget.prompt(identity,clientInsightResult); + var dialog=ui.create.dialog(`${get.translation(clientTarget)}是${identity}
    `,'forcebutton'); + ui.create.spinningIdentityCard(clientInsightResult,dialog); + var control=ui.create.control('ok',()=>{ + dialog.close(); + control.close(); + _status.imchoosing=false; + _status.event._result={ + bool:true + }; + game.resume(); + }); + dialog.videoId=id; + game.pause(); + game.countChoose(); + }; + game.broadcastAll((clientPlayer,clientTarget,id)=>{ + if(clientPlayer!=game.me) ui.create.dialog(`${get.translation(clientPlayer)}正在洞察${get.translation(clientTarget)}的阵营...
    `).videoId=id; + },player,target,event.videoId); + if(event.isMine()) send(target,insightResult,event.videoId); + else if(event.isOnline()){ + player.send(send,target,insightResult,event.videoId); + player.wait(); + game.pause(); + } + 'step 2' + game.broadcastAll('closeDialog',event.videoId); + if(!_status.connectMode&&get.config('auto_mark_identity')&&!target.node.identity.firstChild.innerHTML.length) game.broadcastAll((clientPlayer,clientTarget,insightResult)=>{ + if(clientPlayer.isUnderControl(true)) clientTarget.setIdentity(insightResult); + },player,target,event.insightResult); + var afterInsight=clientTarget=>{ + clientTarget.unprompt(); + if(clientTarget.nonStratagemInsightFlashing){ + delete clientTarget.nonStratagemInsightFlashing; + return; + } + var classList=clientTarget.classList; + if(classList.contains('flash-animation-iteration-count-infinite')) classList.remove('flash-animation-iteration-count-infinite'); + }; + if(event.isMine()) afterInsight(target); + else if(event.isOnline()) player.send(afterInsight,target); + }, + stratagemCamouflage:()=>{ + 'step 0' + var camouflaged=event.targets=game.players.filter(current=>current.identity=='fan'&&!current.ai.stratagemCamouflage).randomGets(Math.max(Math.round(get.population()/6),1)); + camouflaged.forEach(current=>current.ai.stratagemCamouflage=true); + var me=game.me; + if(event.players.includes(me)&&me.identity=='nei'){ + event.videoId=lib.status.videoId++; + var rebel=get.translation('fan2'),dialog=ui.create.dialog(`${get.translation(camouflaged)}是${rebel}
    `,'forcebutton'); + ui.create.spinningIdentityCard('fan',dialog); + dialog.videoId=event.videoId; + camouflaged.forEach(victim=>{ + var classList=victim.classList,nonCamouflageFlashing=classList.contains('flash-animation-iteration-count-infinite'); + if(nonCamouflageFlashing) victim.nonCamouflageFlashing=true; + else classList.add('flash-animation-iteration-count-infinite'); + victim.prompt(rebel,'fan'); + }); + me.chooseControl('ok').set('dialog',dialog); + } + game.filterPlayer(current=>{ + if(current.identity!='nei') return; + var storage=current.storage; + if(!storage.zhibi) storage.zhibi=[]; + storage.zhibi.addArray(camouflaged); + }); + 'step 1' + targets.forEach(current=>{ + if(game.me.identity=='nei'&&get.config('nei_auto_mark_camouflage')) current.setIdentity(); + current.unprompt(); + if(current.nonCamouflageFlashing){ + delete current.nonCamouflageFlashing; + return; + } + var classList=current.classList; + if(classList.contains('flash-animation-iteration-count-infinite')) classList.remove('flash-animation-iteration-count-infinite'); + }); + }, + stratagemCamouflageOL:()=>{ + 'step 0' + var send=(clientCamouflaged,id,online)=>{ + var me=game.me; + if(me.identity=='nei'){ + var storage=me.storage; + if(!storage.zhibi) storage.zhibi=[]; + storage.zhibi.addArray(clientCamouflaged); + var rebel=get.translation('fan2'),dialog=ui.create.dialog(`${get.translation(clientCamouflaged)}是${rebel}
    `,'forcebutton'); + ui.create.spinningIdentityCard('fan',dialog); + dialog.videoId=id; + clientCamouflaged.forEach(victim=>{ + var classList=victim.classList,nonCamouflageFlashing=classList.contains('flash-animation-iteration-count-infinite'); + if(nonCamouflageFlashing) victim.nonCamouflageFlashing=true; + else classList.add('flash-animation-iteration-count-infinite'); + victim.prompt(rebel,'fan'); + }); + me.chooseControl('ok').set('dialog',dialog); + } + else ui.create.dialog('请等待内奸身份确认...').videoId=id; + if(online) game.resume(); + }; + var camouflaged=event.targets=game.players.filter(current=>current.identity=='fan'&&!current.ai.stratagemCamouflage).randomGets(Math.max(Math.round(get.population()/6),1)); + camouflaged.forEach(current=>current.ai.stratagemCamouflage=true); + event.videoId=lib.status.videoId++; + var time=10000; + if(lib.configOL&&lib.configOL.choose_timeout) time=parseInt(lib.configOL.choose_timeout)*1000; + var aiTargets=event.aiTargets=[]; + event.players.forEach(current=>{ + current.showTimer(time); + if(current.isOnline()){ + current.send(send,camouflaged,event.videoId,true); + current.wait(); + if(current.identity=='nei') event.withOL=true; + return; + } + var me=game.me; + if(current==me){ + event.withMe=true; + send(camouflaged,event.videoId); + if(me.identity=='nei') me.wait(); + else event._result={ + bool:true + }; + return; + } + if(current.identity=='nei') aiTargets.push(current); + }); + if(!aiTargets.length) return; + aiTargets.randomSort(); + new Promise(resolve=>setTimeout(resolve,Math.ceil(5000+5000*Math.random()))).then(()=>{ + var interval=setInterval(()=>{ + aiTargets.shift(); + if(aiTargets.length) return; + clearInterval(interval); + if(event.withAI) game.resume(); + },Math.ceil(500+500*Math.random())) + }); + 'step 1' + if(event.withMe) game.me.unwait(result); + 'step 2' + if(event.withOL&&!event.resultOL) game.pause(); + 'step 3' + if(!event.aiTargets.length) return; + event.withAI=true; + game.pause(); + 'step 4' + game.broadcastAll('closeDialog',event.videoId); + event.players.forEach(current=>current.hideTimer()); + var afterCamouflage=clientCamouflaged=>clientCamouflaged.forEach(victim=>{ + victim.unprompt(); + if(victim.nonCamouflageFlashing){ + delete victim.nonCamouflageFlashing; + return; + } + var classList=victim.classList; + if(classList.contains('flash-animation-iteration-count-infinite')) classList.remove('flash-animation-iteration-count-infinite'); + }); + event.players.forEach(current=>{ + if(current.isOnline()){ + current.send(afterCamouflage,targets); + return; + } + var me=game.me; + if(current==me&&me.identity=='nei') afterCamouflage(targets); + }); + } } }, get:{ @@ -2562,6 +3145,92 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ if(from==to||to.identityShown||from.storage.zhibi&&from.storage.zhibi.contains(to)||(_status.yeconfirm&&['rYe','bYe'].contains(to.identity)&&['rYe','bYe'].contains(to.identity))) return real*1.1; return ((to.ai.shown+0.1)*real+(from.identity.slice(0,1)==to.identity.slice(0,1)?3:-3)*(1-to.ai.shown)) } + else if(_status.mode=='stratagem'){ + var x=0,num=0,temp,i; + if(_status.ai.customAttitude){ + for(i=0;i<_status.ai.customAttitude.length;i++){ + temp=_status.ai.customAttitude[i](from,to); + if(temp!=undefined){ + x+=temp; + num++; + } + } + } + if(num){ + return x/num; + } + var real=get.realAttitude(from,to),zhibi=from.storage.zhibi,stratagem_expose=from.storage.stratagem_expose,followCamouflage=true; + if(to.ai.shown) return to.ai.shown*(real+(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu'||(to.identity=='nei'&&get.situation()<=0&&['zhu','zhong'].contains(from.identity)||get.situation()>=3&&from.identity=='fan')?3:-3)) + if(from==to||to.identityShown||((stratagem_expose&&stratagem_expose.contains(to))||(zhibi&&zhibi.contains(to)))&&!to.ai.stratagemCamouflage) return real*1.1; + if(from.identity=='nei'&&to.ai.stratagemCamouflage) return real*1.1; + if(to.identity=='nei'){ + if(from.identity=='fan'){ + if(get.population('zhong')==0){ + if(zhibi){ + var dead=game.dead.slice(); + for(var current of dead){ + if(from.storage.zhibi.contains(current)&¤t.ai.stratagemCamouflage){ + if(from.storage.stratagem_expose&&from.storage.stratagem_expose.contains(to)) return -7; + } + } + if(zhibi.contains(to)) return 3; + } + } + } + } + if(to.identity=='fan'&&from.identity=='nei'&&zhibi.contains(game.zhu)&&game.players.filter(i=>i!=from&&!zhibi.contains(i)).map(i=>i.identity).reduce((p,c)=>(!p.contains(c)?(p.push(c)&&p):p),[]).length==1) return real; + for(var fan of game.dead){ + if(fan.identity!='fan'||!fan.storage.stratagem_revitalization) continue; + for(var current of fan.storage.stratagem_expose){ + if(to==current){ + return real; + } + } + } + if(from.identity=='fan'&&to.identity=='fan'){ + if(from.ai.stratagemCamouflage){ + var zhu=game.zhu&&game.zhu.isZhu&&game.zhu.identityShown?game.zhu:undefined; + if(zhu){ + if(zhu.storage.stratagem_expose&&zhu.storage.stratagem_expose.contains(to)) return 0; + } + if(zhibi&&zhibi.contains(to)) return -7; + } + if(to.ai.stratagemCamouflage){ + var zhu=game.zhu&&game.zhu.isZhu&&game.zhu.identityShown?game.zhu:undefined; + if(zhu){ + if(zhu.storage.stratagem_expose&&zhu.storage.stratagem_expose.contains(to)) return 0; + } + if(zhibi&&zhibi.contains(to)) return -7; + } + } + if(from.identity!='nei'&&zhibi&&zhibi.contains(to)&&!to.identityShown&&(followCamouflage&&to.ai.stratagemCamouflage)) return -5; + if(from.identity!='nei'&&stratagem_expose&&stratagem_expose.contains(to)&&!to.identityShown) return -5; + if(zhibi){ + for(var to2 of zhibi){ + if(to2.storage.stratagem_expose){ + if(to2.ai.stratagemCamouflage){ + for(var to3 of to2.storage.stratagem_expose){ + if(zhibi.slice().addArray(stratagem_expose).contains(to3)){ + if(to==to2){ + return real; + } + } else if(to==to3){ + return Math.abs(real+10)/10; + } + } + }else{ + for(var to3 of to2.storage.stratagem_expose){ + if(!zhibi.slice().addArray(stratagem_expose).contains(to3)&&to==to3){ + return get.rawAttitude(to3,to)*Math.sign(real); + } + } + } + } + } + } + return Math.max(-1,Math.min(-0.1,(-Math.min(5,to.countCards('hes')/2+1)/5-Math.max(0,5-to.hp)/4)/2)); + } + //正常身份模式态度 var difficulty=0; if(to==game.me) difficulty=2-get.difficulty(); if(from==to||to.identityShown||(from.storage.dongcha==to)||to.identityShown||from.storage.zhibi&&from.storage.zhibi.contains(to)){ @@ -2612,6 +3281,179 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ return -7; } } + else if(_status.mode=='stratagem'){ + if(!game.zhu){ + if(from.identity=='nei'||to.identity=='nei') return -1; + if(from.identity==to.identity) return 6; + return -6; + } + var situation=get.situation(); + var identity=from.identity; + var identity2=to.identity; + if(identity2=='zhu'&&!to.isZhu){ + identity2='zhong'; + if(from==to) return 10; + } + if(from!=to&&to.identity=='nei'&&to.ai.shown<1&&(to.ai.identity_mark=='fan'||to.ai.identity_mark=='zhong')){ + identity2=to.ai.identity_mark; + } + if(from.identity!='nei'&&from!=to&&get.population('fan')==0&&identity2=='zhong'){ + for(var i=0;i1&&to.hp>fan.hp&&to.countCards('he')>fan.countCards('he')){ + return -3; + } + } + return 0; + } + if(situation>1) return Math.max((situation-8)/3,-2); + return Math.min(3,get.population('fan')); + case 'fan': + if(get.population('fan')==1&&get.population('nei')==1&&game.players.length==3){ + var nei; + for(var i=0;i1&&nei.hp>to.hp&&nei.countCards('he')>to.countCards('he')){ + return 0; + } + } + return -3; + } + return -4; + } + break; + case 'zhong': + switch (identity2){ + case 'zhu':return 10; + case 'zhong': + if(from==to) return 5; + if(get.population('zhong')>1) return 3; + return 4; + case 'nei': + if(get.population('fan')==0&&get.population('zhong')==1) return -2; + if(get.population('zhong')>=1) return Math.min(3,-situation); + return 3; + case 'fan':return -8; + } + break; + case 'nei': + if(identity2=='zhu'&&game.players.length==2) return -10; + if(from!=to&&identity2!='zhu'&&game.players.length==3) return -8; + var strategy=get.aiStrategy(); + if(strategy==4){ + if(from==to) return 10; + return 0; + } + var num; + switch (identity2){ + case 'zhu': + if(strategy==6) return -1; + if(strategy==5) return 10; + if(to.hp<=0) return 10; + if(get.population('fan')==1){ + var fan; + for(var i=0;i1&&to.hp>fan.hp&&to.countCards('he')>fan.countCards('he')){ + return -3; + } + } + return 0; + } + else{ + if(situation>1||get.population('fan')==0) num=0; + else num=get.population('fan')+Math.max(0,3-game.zhu.hp); + } + if(strategy==2) num--; + if(strategy==3) num++; + return num; + case 'zhong': + if(strategy==5) return Math.min(0,-situation); + if(strategy==6) return Math.max(-1,-situation); + if(get.population('fan')==0) num=-5; + else if(situation<=0) num=0; + else if(game.zhu&&game.zhu.hp<2) num=0; + else if(game.zhu&&game.zhu.hp==2) num=-1; + else if(game.zhu&&game.zhu.hp<=2&&situation>1) num=-1; + else num=-2; + if(strategy==2) num--; + if(strategy==3) num++; + return num; + case 'nei': + if(from==to) return 10; + if(from.ai.friend.contains(to)) return 5; + if(get.population('fan')+get.population('zhong')>0) return 0; + return -5; + case 'fan': + if(strategy==5) return Math.max(-1,situation); + if(strategy==6) return Math.min(0,situation); + if((game.zhu&&game.zhu.hp<=2&&situation<0)||situation<-1) num=-3; + else if(situation<0||get.population('zhong')==0) num=-2; + else if((game.zhu&&game.zhu.hp>=4&&situation>0)||situation>1) num=1; + else num=0; + if(strategy==2) num++; + if(strategy==3) num--; + return num; + } + break; + case 'fan': + switch (identity2){ + case 'zhu': + if(get.population('nei')>0){ + if(situation==1) return -6; + if(situation>1) return -5; + } + return -8; + case 'zhong': + if(game.zhu.hp>=3&&to.hp==1){ + return -10; + } + return -7; + case 'nei': + if(get.population('fan')==1) return 0; + if(get.population('zhong')==0) return -2; + if(game.zhu&&game.zhu.hp<=2&&game.zhu.identityShown) return -1; + return 3; + case 'fan': + return 5; + } + } + } + //正常身份模式态度 if(!game.zhu){ if(from.identity=='nei'||to.identity=='nei') return -1; if(from.identity==to.identity) return 6; @@ -2842,8 +3684,171 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } return result; }, + insightResult:function(from,to){ + var friend='friend',enemy='enemy'; + if(from.identity=='nei') return to.identity; + if(to.identity=='nei') return friend; + if(from.ai.stratagemCamouflage||to.ai.stratagemCamouflage) return enemy; + if(from.identity==to.identity||from.identity=='zhu'&&to.identity=='zhong'||from.identity=='zhong'&&to.identity=='zhu') return friend; + return enemy; + } }, skill:{ + stratagem_gain:{ + silent:true, + charlotte:true, + ruleSkill:true, + trigger:{ + player:['phaseBegin','damageEnd'] + }, + content:()=>{ + player.changeFury(trigger.name=='damage'?trigger.num:1,true); + } + }, + stratagem_insight:{ + trigger:{ + source:'damageSource', + global:'loseHpEnd' + }, + filter:(event,player)=>{ + if(!player.storage.stratagem_fury) return false; + const target=event.player; + if(target==player||!target.isIn()||target.identityShown) return false; + let source=event.source; + if(event.name=='loseHp'){ + const trigger=event.getParent()._trigger; + if(trigger) source=trigger.source; + } + return player==source; + }, + logTarget:'player', + prompt2:event=>`消耗1点怒气,洞察${get.translation(event.player)}的身份`, + check:(event,player)=>{ + const storage=player.storage,zhibi=storage.zhibi; + if(zhibi&&zhibi.includes(event.player)) return false; + const stratagemExpose=storage.stratagem_expose; + if(stratagemExpose&&stratagemExpose.includes(event.player)) return false; + if(get.population('zhong')==0&&player.identity=='fan') return false; + return Math.abs(get.attitude(player,event.player))<=1; + }, + content:()=>{ + player.changeFury(-1,true); + player.insightInto(trigger.player); + } + }, + stratagem_monarchy:{ + trigger:{ + player:['dying','phaseZhunbeiBegin'], + global:'dieAfter', + }, + forced:true, + priority:100, + popup:false, + unique:true, + firstDo:true, + silent:true, + charlotte:true, + ruleSkill:true, + filter:(event,player,name)=>{ + if(player.storage.stratagem_monarchy||player.identity!='zhu') return false; + if(name=='dieAfter') return game.dead.length>=Math.max(Math.round(get.population()/3),2); + return name=='dying'||game.roundNumber>=Math.max(Math.round(get.population()/2),3); + }, + content:()=>{ + 'step 0' + if(event.triggername=='dying') game.delayx(); + 'step 1' + player.storage.stratagem_monarchy=true; + game.broadcastAll(clientPlayer=>{ + if(!game.zhu) game.zhu=clientPlayer; + clientPlayer.identityShown=true; + clientPlayer.ai.shown=1; + clientPlayer.setIdentity(); + clientPlayer.isZhu=true; + clientPlayer.node.identity.classList.remove('guessing'); + var config=lib.config; + if(config.animation&&!config.low_performance) clientPlayer.$legend(); + var clickingIdentity=_status.clickingidentity; + if(!clickingIdentity||clickingIdentity[0]!=clientPlayer) return; + clickingIdentity[1].forEach(element=>{ + element.delete(); + element.style.transform=''; + }); + delete _status.clickingidentity; + },player); + game.addVideo('showIdentity',player,'zhu'); + game.delay(2); + player.playerfocus(1000); + event.trigger('zhuUpdate'); + 'step 2' + player.recover(); + player.draw(); + player.getStockSkills(true,true).forEach(stockSkill=>{ + if(player.hasSkill(stockSkill)) return; + var info=get.info(stockSkill); + if(!info||!info.zhuSkill) return; + player.addSkillLog(stockSkill); + }); + } + }, + stratagem_revitalization:{ + trigger:{ + player:'dying', + }, + forced:true, + unique:true, + silent:true, + charlotte:true, + ruleSkill:true, + filter:(event,player)=>{ + const storage=player.storage; + return !storage.stratagem_revitalization&&player.ai.stratagemCamouflage&&game.dead.length=2; + }, + content:()=>{ + 'step 0' + game.delayx(); + 'step 1' + player.storage.stratagem_revitalization=true; + game.broadcastAll(clientPlayer=>{ + clientPlayer.identityShown=true; + clientPlayer.ai.shown=1; + clientPlayer.setIdentity(); + clientPlayer.node.identity.classList.remove('guessing'); + if(lib.config.animation&&!lib.config.low_performance) clientPlayer.$thunder(); + },player); + game.addVideo('showIdentity',player,'fan'); + game.delay(2); + player.playerfocus(800); + 'step 2' + player.changeFury(-player.storage.stratagem_fury,true); + player.discard(player.getCards('hej')); + player.link(false); + player.turnOver(false); + player.recover(2-player.hp); + player.draw(3); + } + }, + stratagem_expose:{ + trigger:{player:'useCard'}, + forced:true, + silent:true, + popup:false, + filter:(event,player)=>{ + const targets=event.targets; + if(targets.length!=1) return false; + const target=targets[0]; + return target==player&&(target.identityShown||player.storage.zhibi.includes(target)||game.hasPlayer2(current=>{ + if(!current.identityShown) return false; + const storage=current.storage; + return (storage.stratagem_revitalization||storage.stratagem_monarchy)&&storage.stratagem_expose.includes(target); + })); + }, + content:()=>{ + var storage=trigger.targets[0].storage; + if(!storage.stratagem_expose) storage.stratagem_expose=[]; + storage.stratagem_expose.add(player); + } + }, yexinbilu:{ enable:'phaseUse', filter:function(event,player){ @@ -3087,6 +4092,20 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ '明忠模式':'
    明忠模式(忠胆英杰)
    • 本模式需要8名玩家进行游戏,使用的身份牌为:1主公、2忠臣、4反贼和1内奸。游戏开始时,每名玩家随机获得一个身份,由系统随机选择一名忠臣身份的玩家亮出身份(将忠臣牌正面朝上放在面前),其他身份(包括主公)的玩家不亮出身份。
    • '+ '首先由亮出身份的忠臣玩家随机获得六张武将牌,挑选一名角色,并将选好的武将牌展示给其他玩家。之后其余每名玩家随机获得三张武将牌,各自从其中挑选一张同时亮出
    • '+ '亮出身份牌的忠臣增加1点体力上限。角色濒死和死亡的结算及胜利条件与普通身份局相同。', + '谋攻模式':'
      模式命名由来
      • 《谋攻篇》一词出自《孙子兵法·谋攻篇》,是春秋时期兵法家孙武创作的一篇散文。《谋攻篇》故知胜有五:知可以战与不可以战者胜,识众寡之用者胜,上下同欲者胜,以虞待不虞者胜,将能而君不御者胜。
      '+ + '
      游戏规则
      • 谋攻篇模式为六名玩家参与的全暗身份模式,引入新机制“怒气”,玩家可以消耗怒气探查其他角色的身份是敌人或者队友,或使用怒气强化手牌,以达到识别出队友并击杀敌人的目标。'+ + '
      • 各身份玩家的胜利条件与身份局中对应身份的胜利条件一致,且该模式下没有奖惩。'+ + '
      • 当主公进入濒死、场上有两名角色阵亡、第三轮的主公准备阶段,主公将会翻开身份牌,回复1点体力并摸一张牌,并获得武将牌上的主公技。'+ + '
      • 内奸在游戏开始时将会得知一名反贼的身份,并令该反贼被“伪装”。本局游戏内,被“伪装”的反贼在被任何人探查身份时,结果都提示为“敌人”。作为补偿,其第一次进入濒死时,若场上没有角色死亡且其怒气值不小于2,其弃置区域内所有牌,重置武将牌,将体力回复至2点并摸三张牌。'+ + '
      • 特殊地,内奸在被所有角色探查时,都提示为“队友”;内奸在进行探查时,直接得知目标的身份。
      '+ + '
      新机制“怒气”
      • 一名角色在回合开始时或受到1点伤害后,将获得1点怒气;怒气上限为3。
      • 一名角色令其他角色扣减体力后,该角色可以消耗1点怒气,查探扣减体力的角色是敌或友。
      '+ + '
      强化卡牌规则
      • 在第二轮游戏开始后,当你需要使用一张“强化表”内的牌时,你可以通过消耗怒气将此牌强化。'+ + '
      • 可强化卡牌
          '+ + '
        • 【杀】:消耗1点怒气进行强化,你令响应此杀所需使用的【闪】数+1'+ + '
        • 【闪】:消耗1点怒气进行强化,使用时视为两张【闪】的效果'+ + '
        • 【决斗】:消耗2点怒气进行强化,对此牌的目标造成伤害时,伤害+1'+ + '
        • 【火攻】:消耗2点怒气进行强化,造成的伤害+1'+ + '
        • 【桃】:消耗3点怒气进行强化,回复的体力+1
      ', '3v3v2':'
      3v3v2模式
      • 游戏准备
        本模式需要8名玩家进行游戏。游戏开始前,所有玩家随机分成两组,每组四人,分别称为「冷色阵营」和「暖色阵营」,然后分发身份牌,抽取到「主帅」身份的玩家亮出身份牌。'+ '
      • 身份牌
        每组的身份分为四种。
        主帅(主)和前锋(忠):联合对方阵营的细作,击杀己方细作,对方阵营的主帅和前锋以及所有的野心家。
        细作(内):帮助对方阵营的主帅和前锋,击杀对方细作,己方阵营的主帅和前锋以及所有的野心家。
        野心家(野):联合对方阵营中的野心家,击杀所有其他角色,成为最后的生还者。
        '+ '
      • 胜负判定
        冷色主帅,先锋和暖色细作在所有野心家和对方主帅全部阵亡后视为胜利,在冷色主帅阵亡后视为游戏失败。
        暖色主帅,先锋和冷色细作在所有野心家和对方主帅阵亡后视为胜利,在暖色主帅阵亡后视为失败。
        野心家在所有不为野心家的角色阵亡后视为胜利,在双方主帅全部阵亡而有非野心家角色存活时失败。
        当有角色阵亡后,若有角色满足胜利条件,游戏结束。若所有角色均满足失败条件,则游戏平局。若一名角色满足失败条件,即使其满足胜利条件,也视为游戏失败。
        '+ diff --git a/mode/stone.js b/mode/stone.js index c802ce002..56b701296 100644 --- a/mode/stone.js +++ b/mode/stone.js @@ -2856,7 +2856,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseControl('两点','一点').prompt='造成两点伤害,或造成一点伤害并从牌库中获得一张牌'; + player.chooseControl('两点','一点').prompt='造成2点伤害,或造成1点伤害并从牌库中获得一张牌'; 'step 1' if(result.control=='一点'){ target.damage(); @@ -5745,7 +5745,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ 'step 0' var target=player.getLeader(); var next=target.chooseControl('召唤树人','增强随从'); - next.prompt='召唤两个嘲讽树人,或令所有其他随从增加一点体力和体力上限并摸两张牌'; + next.prompt='召唤两个嘲讽树人,或令所有其他随从增加1点体力和体力上限并摸两张牌'; next.ai=function(){ if(target.countFellow()<=2) return '召唤树人'; return '增强随从'; @@ -6049,7 +6049,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" event.chooser=player.getLeader(); - event.chooser.chooseTarget('普照:选择一名己方随从增加两点体力和体力上限',function(card,playerx,target){ + event.chooser.chooseTarget('普照:选择一名己方随从增加2点体力和体力上限',function(card,playerx,target){ return player!=target&&player.side==target.side&&target.isMin(); }).ai=function(target){ return get.attitude(event.chooser,target)*Math.max(1,10-target.hp); @@ -6077,7 +6077,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" event.chooser=player.getLeader(); - event.chooser.chooseTarget('缩小:令一名随从减少两点体力上限',function(card,playerx,target){ + event.chooser.chooseTarget('缩小:令一名随从减少2点体力上限',function(card,playerx,target){ return player!=target&&target.isMin()&&target.maxHp>1; }).ai=function(target){ if(get.attitude(player,target)>=0) return 0; @@ -6525,7 +6525,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" event.chooser=player.getLeader(); - event.chooser.chooseTarget('保卫:令一名友方随从获得一点护甲',function(card,playerx,target){ + event.chooser.chooseTarget('保卫:令一名友方随从获得1点护甲',function(card,playerx,target){ return player!=target&&player.side==target.side&&target.isMin(); }).ai=function(target){ return get.attitude(event.chooser,target); @@ -6883,7 +6883,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ forced:true, mark:true, intro:{ - content:'在你的下一准备阶段,令所有友方随从增加一点体力和体力上限并摸一张牌' + content:'在你的下一准备阶段,令所有友方随从增加1点体力和体力上限并摸一张牌' }, content:function(){ player.removeSkill('paladin_zhengqianghaosheng'); @@ -7391,7 +7391,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ ai2:function(target){ return get.damageEffect(target,player,player); }, - prompt:'偷袭:弃置一张装备区内的牌并对一名敌方角色一点伤害' + prompt:'偷袭:弃置一张装备区内的牌并对一名敌方角色1点伤害' }); player.line(event.chooser); "step 1" @@ -7538,7 +7538,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" event.chooser=player.getLeader(); - event.chooser.chooseTarget('监工:对一名随从造成一点伤害然后令其摸两张牌',function(card,playerx,target){ + event.chooser.chooseTarget('监工:对一名随从造成1点伤害然后令其摸两张牌',function(card,playerx,target){ return player!=target&&target.isMin(); }).ai=function(target){ var att=get.attitude(event.chooser,target); @@ -7868,7 +7868,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" event.chooser=player.getLeader(); - event.chooser.chooseTarget('驯兽:选择一名己方随从增加一点体力和体力上限并摸两张牌',function(card,playerx,target){ + event.chooser.chooseTarget('驯兽:选择一名己方随从增加1点体力和体力上限并摸两张牌',function(card,playerx,target){ return player!=target&&player.side==target.side&&target.isMin(); }).ai=function(target){ return get.attitude(event.chooser,target); @@ -7992,7 +7992,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" event.chooser=player.getLeader(); - event.chooser.chooseTarget('护卫:对一名对方随从造成一点伤害或弃置其所有牌并将其体力上限改为1',function(card,playerx,target){ + event.chooser.chooseTarget('护卫:对一名对方随从造成1点伤害或弃置其所有牌并将其体力上限改为1',function(card,playerx,target){ return player.side!=target.side&&target.isMin(); }).ai=function(target){ return Math.max(1,10-target.hp); @@ -8110,7 +8110,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" event.chooser=player.getLeader(); - event.chooser.chooseTarget('火袭:对一名对方随从造成两点伤害',function(card,playerx,target){ + event.chooser.chooseTarget('火袭:对一名对方随从造成2点伤害',function(card,playerx,target){ return player.side!=target.side&&target.isMin(); }).ai=function(target){ return Math.max(1,10-target.hp); @@ -8186,8 +8186,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, usable:1, prompt:function(event){ - if(event.player.hasFellowSkill('priest_hunwu')) return '令目标流失一点体力'; - return '回复一点体力'; + if(event.player.hasFellowSkill('priest_hunwu')) return '令目标失去1点体力'; + return '回复1点体力'; }, filterTarget:function(card,player,target){ if(player.hasFellowSkill('priest_hunwu')) return true; @@ -8341,8 +8341,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, usable:1, prompt:function(event){ - if(event.player.hasFellowSkill('hunter_juji')) return '造成一点伤害'; - return '对敌方主将造成一点伤害'; + if(event.player.hasFellowSkill('hunter_juji')) return '造成1点伤害'; + return '对敌方主将造成1点伤害'; }, selectTarget:function(){ if(_status.event.player.hasFellowSkill('hunter_juji')) return 1; @@ -8661,7 +8661,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" event.chooser=player.getLeader(); - event.chooser.chooseTarget('毒液:令一名敌方随从失去一点体力',function(card,playerx,target){ + event.chooser.chooseTarget('毒液:令一名敌方随从失去1点体力',function(card,playerx,target){ return player.side!=target.side&&target.isMin(); }).ai=function(target){ return Math.max(1,10-target.hp); @@ -8858,7 +8858,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0" event.chooser=player.getLeader(); - event.chooser.chooseTarget('火枪:对一名对方随从造成一点伤害',function(card,playerx,target){ + event.chooser.chooseTarget('火枪:对一名对方随从造成1点伤害',function(card,playerx,target){ return player.side!=target.side&&target.isMin(); }).ai=function(target){ return Math.max(1,10-target.hp); @@ -9352,7 +9352,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_fushi:'缚誓', stone_fushi_info:'你出场时,为所有友方角色回复所有体力值', stone_mieshi:'灭世', - stone_mieshi_info:'你出场时,对所有其他随从造成两点伤害,然后弃置己方主将的所有手牌', + stone_mieshi_info:'你出场时,对所有其他随从造成2点伤害,然后弃置己方主将的所有手牌', stone_shixu:'时序', stone_shixu_info:'你出场的回合内,己方主将获得4点行动值', stone_chenshui:'沉睡', @@ -9367,9 +9367,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_lianyu:'炼狱', stone_lianyu_info:'你的职业技能改为召唤一个地狱火', stone_lianji:'连击', - stone_lianji_info:'每当己方主将召唤一个随从,便增加一点体力和体力上限并摸一张牌', + stone_lianji_info:'每当己方主将召唤一个随从,便增加1点体力和体力上限并摸一张牌', stone_shenyu:'神谕', - stone_shenyu_info:'你出场时,己方主将可以选择一项:召唤两个嘲讽树人,或令所有其他随从增加一点体力和体力上限并摸两张牌', + stone_shenyu_info:'你出场时,己方主将可以选择一项:召唤两个嘲讽树人,或令所有其他随从增加1点体力和体力上限并摸两张牌', stone_fuchou:'复仇', stone_fuchou_info:'你死亡后,视为己方主将使用了一张复仇之怒', stone_shenyou:'神佑', @@ -9378,7 +9378,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_jinu_info:'摸牌阶段,若你己受伤,则额外摸两张牌', spell_shenshengxinxing:'神圣新星', - spell_shenshengxinxing_info:'对所有敌方角色造成一点伤害,令所有友方角色回复一点体力', + spell_shenshengxinxing_info:'对所有敌方角色造成1点伤害,令所有友方角色回复1点体力', spell_shengguangzhadan:'圣光炸弹', spell_shengguangzhadan_info:'对所有随从造成等同于其手牌数的伤害', spell_maizang:'埋葬', @@ -9386,21 +9386,21 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_xinlingshijie:'心灵视界', spell_xinlingshijie_info:'将一张敌方主将手牌的复制置于你的手牌', spell_naluzhiguang:'纳鲁之光', - spell_naluzhiguang_info:'恢复一点体力值,若目标仍处于受伤状态,则召唤一名圣光护卫', + spell_naluzhiguang_info:'恢复1点体力值,若目标仍处于受伤状态,则召唤一名圣光护卫', spell_zhiliaozhihuan:'治疗之环', - spell_zhiliaozhihuan_info:'令所有随从回复三点体力', + spell_zhiliaozhihuan_info:'令所有随从回复3点体力', spell_zhenyanshu:'真言术', - spell_zhenyanshu_info:'令一名随从增加一点体力和体力上限;从牌库中获得一张牌', + spell_zhenyanshu_info:'令一名随从增加1点体力和体力上限;从牌库中获得一张牌', spell_enzeshu:'恩泽术', - spell_enzeshu_info:'令一名随从增加三点体力和体力上限', + spell_enzeshu_info:'令一名随从增加3点体力和体力上限', spell_anyingxingtai:'暗影形态', priest_anyingxingtai:'暗影形态', - spell_anyingxingtai_info:'你的职业技能改为造成一点伤害,若已进入暗影形态,则改为造成两点伤害', + spell_anyingxingtai_info:'你的职业技能改为造成1点伤害,若已进入暗影形态,则改为造成2点伤害', spell_kuaisuzhiliao:'快速治疗', - spell_kuaisuzhiliao_info:'回复两点体力', + spell_kuaisuzhiliao_info:'回复2点体力', spell_xinlinghanbao:'心灵撼爆', - spell_xinlinghanbao_info:'对敌方主将造成两点伤害', + spell_xinlinghanbao_info:'对敌方主将造成2点伤害', spell_kongxinshu:'控心术', spell_kongxinshu_info:'复制敌方牌库中的一张随从,将其置入战场', @@ -9409,15 +9409,15 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ priest_shengguang_info:'每当一名随从获得治疗,摸一张牌', spell_nuxi:'怒袭', - spell_nuxi_info:'造成一点伤害,获得两点护甲', + spell_nuxi_info:'造成1点伤害,获得2点护甲', spell_dunpaimengji:'盾牌猛击', spell_dunpaimengji_info:'对一名随从造成等同于你护甲值的伤害', spell_zhansha:'斩杀', spell_zhansha_info:'令一名已受伤的敌方随从死亡', spell_nuhuozhongshao:'怒火中烧', - spell_nuhuozhongshao_info:'对一名随从造成一点伤害,然后令其摸两张牌', + spell_nuhuozhongshao_info:'对一名随从造成1点伤害,然后令其摸两张牌', spell_xuanfengzhan:'旋风斩', - spell_xuanfengzhan_info:'对所有随从造成一点伤害', + spell_xuanfengzhan_info:'对所有随从造成1点伤害', spell_juemingluandou:'绝命乱斗', spell_juemingluandou_info:'随机保留一名随从,然后令所有其他随从死亡', @@ -9428,22 +9428,22 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_chongfeng:'冲锋', spell_chongfeng_info:'令一名武将牌背面朝上的友方随从摸三张牌,然后将武将牌翻至正面', spell_fuchoudaji:'复仇打击', - spell_fuchoudaji_info:'对所有随从造成一点伤害,若你的体力值不大于2,改为造成三点伤害', + spell_fuchoudaji_info:'对所有随从造成1点伤害,若你的体力值不大于2,改为造成3点伤害', spell_kuangbao:'狂暴', spell_kuangbao_info:'令一名已受伤的友方随从摸四张牌', spell_yingyongdaji:'英勇打击', - spell_yingyongdaji_info:'令一名敌方角色对你造成两点伤害,然后对其造成两点伤害', + spell_yingyongdaji_info:'令一名敌方角色对你造成2点伤害,然后对其造成2点伤害', spell_dubiao:'毒镖', - spell_dubiao_info:'对一名随机敌方角色造成一点伤害', + spell_dubiao_info:'对一名随机敌方角色造成1点伤害', spell_qiangfengsheji:'强风射击', - spell_qiangfengsheji_info:'对两名敌方随从各造成一点伤害,并弃置其两张手牌', + spell_qiangfengsheji_info:'对两名敌方随从各造成1点伤害,并弃置其两张手牌', spell_tanxianmao:'探险帽', hunter_tanxianmao:'探险帽', hunter_tanxianmao_info:'你死亡时,将一张探险帽置入主将的手牌', - spell_tanxianmao_info:'令一名友方随从增加一点体力和体力上限并摸一张牌,当该随从死亡时,将一张探险帽置入你的手牌', + spell_tanxianmao_info:'令一名友方随从增加1点体力和体力上限并摸一张牌,当该随从死亡时,将一张探险帽置入你的手牌', spell_shalumingling:'杀戮命令', - spell_shalumingling_info:'造成一点伤害,如果你控制任何野兽,则改为造成两点伤害', + spell_shalumingling_info:'造成1点伤害,如果你控制任何野兽,则改为造成2点伤害', spell_zhuizongshu:'追踪术', spell_zhuizongshu_info:'从牌库中随机选择三张牌,获得其中的一张', spell_tianjiangzhuqun:'天降蛛群', @@ -9452,15 +9452,15 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_lierenyinji:'猎人印记', spell_lierenyinji_info:'将一名随从的体力上限降至1', spell_kuaisusheji:'快速射击', - spell_kuaisusheji_info:'造成一点伤害,摸一张牌', + spell_kuaisusheji_info:'造成1点伤害,摸一张牌', spell_guanmenfanggou:'关门放狗', spell_guanmenfanggou_info:'每有一名敌方随从,便召唤一只猎狗', spell_zhaohuanchongwu:'动物伙伴', spell_zhaohuanchongwu_info:'随机召唤一只野兽', spell_zidanshangtang:'子弹上膛', - spell_zidanshangtang_info:'随机获得一张猎人职业法术牌,并获得技能【上膛】直到回合结束', + spell_zidanshangtang_info:'随机获得一张猎人职业法术牌,并获得技能〖上膛〗直到回合结束', spell_duochongsheji:'多重射击', - spell_duochongsheji_info:'对两名随机敌方随从各造成两点伤害', + spell_duochongsheji_info:'对两名随机敌方随从各造成2点伤害', stone_liegou:'猎狗', hunter_zidanshangtang:'上膛', @@ -9472,18 +9472,18 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_xishengqiyue:'牺牲契约', spell_xishengqiyue_info:'令双方各一名随从立即死亡', spell_xiaoguibaopo:'小鬼爆破', - spell_xiaoguibaopo_info:'对一名随从造成1~3点伤害,每造成一点伤害,便召唤一只小鬼', + spell_xiaoguibaopo_info:'对一名随从造成1~3点伤害,每造成1点伤害,便召唤一只小鬼', spell_anyinglieyan:'暗影裂焰', spell_anyinglieyan_info:'杀死一名友方随从,并对所有敌方随从造成等于其体力值的伤害', spell_liliangdaijia:'力量代价', - spell_liliangdaijia_info:'令一名友方随从摸4张牌,将体力值变为5,并在其下个回合结束后死亡', + spell_liliangdaijia_info:'令一名友方随从摸四张牌,将体力值变为5,并在其下个回合结束后死亡', spell_emozhinu:'恶魔之怒', - spell_emozhinu_info:'对所有随从造成两点伤害', + spell_emozhinu_info:'对所有随从造成2点伤害', spell_emozhixin:'恶魔之心', - spell_emozhixin_info:'对一名敌方随从造成四点伤害,或令一名友方随从摸四张牌', + spell_emozhixin_info:'对一名敌方随从造成4点伤害,或令一名友方随从摸四张牌', spell_ansezhadan:'暗色炸弹', - spell_ansezhadan_info:'造成两点伤害', + spell_ansezhadan_info:'造成2点伤害', spell_fushishu:'腐蚀术', warlock_fushishu:'腐蚀', warlock_fushishu_info:'下个回合结束后死亡', @@ -9491,16 +9491,16 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_heianqiyue:'黑暗契约', spell_heianqiyue_info:'随机令两名敌方随从死亡,随机弃置两张手牌', spell_linghunhongxi:'灵魂虹吸', - spell_linghunhongxi_info:'令一名随从死亡,回复一点体力', + spell_linghunhongxi_info:'令一名随从死亡,回复1点体力', spell_siwangchanrao:'死亡缠绕', - spell_siwangchanrao_info:'对一名随从造成一点伤害;若该随从死亡,从牌库中获得一张牌', + spell_siwangchanrao_info:'对一名随从造成1点伤害;若该随从死亡,从牌库中获得一张牌', spell_wuyashenxiang:'乌鸦神像', spell_wuyashenxiang_info:'从三张法术牌或随从牌中选择一张加入手牌', spell_huotigenxu:'活体根须', - spell_huotigenxu_info:'造成一点伤害,或召唤两个树苗', + spell_huotigenxu_info:'造成1点伤害,或召唤两个树苗', spell_hengsao:'横扫', - spell_hengsao_info:'对一名敌方角色造成两点伤害,然后对其他敌方角色造成一点伤害', + spell_hengsao_info:'对一名敌方角色造成2点伤害,然后对其他敌方角色造成1点伤害', spell_yexingchengzhang:'野性成长', spell_yexingchengzhang_info:'下个出牌阶段开始时获得三点额外行动值', spell_ziranzhili:'自然之力', @@ -9515,15 +9515,15 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ druid_conglinzhihun_info:'你死亡后召唤一个树人', spell_conglinzhihun_info:'令所有友方随从获得技能树魂(你死亡后召唤一个树人)', spell_ziyang:'滋养', - spell_ziyang_info:'下个出牌开始阶段获得四点额外行动值,或从牌库中获得三张牌', + spell_ziyang_info:'下个出牌开始阶段获得4点额外行动值,或从牌库中获得三张牌', spell_fugen:'腐根', spell_fugen_info:'令一名随从死亡,将一张随机随从置入对手的手牌', spell_xingchenzhuiluo:'星辰坠落', - spell_xingchenzhuiluo_info:'对一名敌方随从造成五点伤害,或对所有敌方随从造成两点伤害', + spell_xingchenzhuiluo_info:'对一名敌方随从造成5点伤害,或对所有敌方随从造成2点伤害', spell_fennu:'愤怒', - spell_fennu_info:'对一名随从造成两点伤害,或造成一点伤害并从牌库中获得一张牌', + spell_fennu_info:'对一名随从造成2点伤害,或造成1点伤害并从牌库中获得一张牌', spell_heiandiyu:'黑暗低语', - spell_heiandiyu_info:'召唤若干个小精灵直到你的随从数达到4;或令一名随从增加一点体力和体力上限并摸三张牌', + spell_heiandiyu_info:'召唤若干个小精灵直到你的随从数达到4;或令一名随从增加1点体力和体力上限并摸三张牌', druid_yexingchengzhang:'成长', druid_yexingchengzhang_bg:'长', @@ -9540,11 +9540,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_zibao_info:'结合结束后立即死亡', spell_cigu:'刺骨', - spell_cigu_info:'造成一点伤害,你可以弃置一张装备区内的牌令伤害+1', + spell_cigu_info:'造成1点伤害,你可以弃置一张装备区内的牌令伤害+1', spell_jianrenluanwu:'剑刃乱舞', - spell_jianrenluanwu_info:'弃置你的武器牌,并对所有敌方角色造成一点伤害', + spell_jianrenluanwu_info:'弃置你的武器牌,并对所有敌方角色造成1点伤害', spell_daoshan:'刀扇', - spell_daoshan_info:'对所有敌方随从造成一点伤害,从牌库中获得一张牌', + spell_daoshan_info:'对所有敌方随从造成1点伤害,从牌库中获得一张牌', spell_sijidaifa:'伺机待发', spell_sijidaifa_info:'你使用下一张法术牌时获得X点行动值,X为该法术的行动值消耗且不超过3', spell_cisha:'刺杀', @@ -9557,7 +9557,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_anzhongpohuai:'暗中破坏', spell_anzhongpohuai_info:'随机杀死一名敌方随从,随机弃置敌方的一张装备牌', spell_beici:'背刺', - spell_beici_info:'令一名未受伤的随从流失一点体力', + spell_beici_info:'令一名未受伤的随从失去1点体力', spell_weijisifu:'危机四伏', spell_zhumo:'蛛魔', stone_zhumo:'蛛魔', @@ -9569,13 +9569,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_jipao_info:'从牌库中获得四张牌', spell_fengxian:'奉献', - spell_fengxian_info:'对所有敌方角色造成一点伤害', + spell_fengxian_info:'对所有敌方角色造成1点伤害', spell_fuchouzhinu:'复仇之怒', spell_fuchouzhinu_info:'造成5点伤害,随机分配到所有敌方随从上', spell_shengliaoshu:'圣疗术', - spell_shengliaoshu_info:'恢复两点体力,摸两张牌', + spell_shengliaoshu_info:'恢复2点体力,摸两张牌', spell_fennuzhichui:'愤怒之锤', - spell_fennuzhichui_info:'造成一点伤害,从牌库中获得一张牌', + spell_fennuzhichui_info:'造成1点伤害,从牌库中获得一张牌', spell_zuozhandongyuan:'作战动员', spell_zuozhandongyuan_info:'召唤两个新兵,随机装备一把武器', spell_liliangzhufu:'力量祝福', @@ -9591,8 +9591,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_yongshizhufu_info:'令一名随从的手牌数翻倍', spell_zhengqianghaosheng:'争强好胜', paladin_zhengqianghaosheng:'争强好胜', - paladin_zhengqianghaosheng_info:'在你的下一准备阶段,令所有友方随从增加一点体力和体力上限并摸一张牌', - spell_zhengqianghaosheng_info:'在你的下一准备阶段,令所有友方随从增加一点体力和体力上限并摸一张牌', + paladin_zhengqianghaosheng_info:'在你的下一准备阶段,令所有友方随从增加1点体力和体力上限并摸一张牌', + spell_zhengqianghaosheng_info:'在你的下一准备阶段,令所有友方随从增加1点体力和体力上限并摸一张牌', spell_zhihuizhufu:'智慧祝福', paladin_zhihuizhufu:'智慧祝福', spell_zhihuizhufu_info:'选择一名随从,在其每个准备阶段,你从牌库中获得一张牌', @@ -9602,7 +9602,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ shaman_fengnu_info:'回合结束后,你获得一个额外回合', spell_fengnu_info:'令一名随从获得技能风怒(回合结束后,你获得一个额外回合)', spell_rongyanbaolie:'熔岩爆裂', - spell_rongyanbaolie_info:'造成三点火焰伤害,流失一点体力', + spell_rongyanbaolie_info:'造成3点火焰伤害,失去1点体力', spell_shihuawuqi:'石化武器', shaman_shihuawuqi:'充能', shaman_shihuawuqi_info:'准备阶段,你摸三张牌', @@ -9629,7 +9629,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_shixue:'嗜血', spell_shixue_info:'所有友方随从摸两张牌', spell_chazhuangshandian:'叉状闪电', - spell_chazhuangshandian_info:'对两个随机敌方随从各造成一点雷电伤害', + spell_chazhuangshandian_info:'对两个随机敌方随从各造成1点雷电伤害', stone_qingwa:'青蛙', stone_youlinglang:'幽灵狼', @@ -9640,13 +9640,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_xiaojingling:'小精灵', spell_laojiuhuoba:'老旧火把', - spell_laojiuhuoba_info:'造成一点伤害,将一张炽热火把置入你的牌库', + spell_laojiuhuoba_info:'造成1点伤害,将一张炽热火把置入你的牌库', spell_chirehuoba:'炽热火把', - spell_chirehuoba_info:'造成两点火焰伤害', + spell_chirehuoba_info:'造成2点火焰伤害', spell_canying:'残影', spell_canying_info:'复制你的所有随从,并将其置入你的手牌', spell_yanbaoshu:'炎爆术', - spell_yanbaoshu_info:'造成四点火焰伤害(若目标为主将,伤害不能超过目标的当前体力值)', + spell_yanbaoshu_info:'造成4点火焰伤害(若目标为主将,伤害不能超过目标的当前体力值)', spell_jingxiang:'镜像', spell_jingxiang_info:'召唤两个具有嘲讽且摸牌阶段不摸牌的随从', spell_aoshufeidan:'奥术飞弹', @@ -9657,17 +9657,17 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_hanbingpingzhang_info:'令一名角色的体力值不能降到2以内,直到你的下一回合开始', spell_hanbingjian:'寒冰箭', - spell_hanbingjian_info:'对一个随从造成两点伤害,然后将其翻面', + spell_hanbingjian_info:'对一个随从造成2点伤害,然后将其翻面', spell_lieyanfengbao:'烈焰风暴', - spell_lieyanfengbao_info:'对所有敌方随从造成两点伤害', + spell_lieyanfengbao_info:'对所有敌方随从造成2点伤害', spell_baofengxue:'暴风雪', - spell_baofengxue_info:'对所有敌方随从造成一点伤害,然后将其翻面', + spell_baofengxue_info:'对所有敌方随从造成1点伤害,然后将其翻面', spell_aoshuzhihui:'奥术智慧', spell_aoshuzhihui_info:'从牌库中获得两张牌', spell_bianxingshu:'变形术', spell_bianxingshu_info:'将一个随从变成一只绵羊', spell_huoqiushu:'火球术', - spell_huoqiushu_info:'造成三点火焰伤害(若目标为主将,伤害不能超过目标的当前体力值)', + spell_huoqiushu_info:'造成3点火焰伤害(若目标为主将,伤害不能超过目标的当前体力值)', stone_mianyang:'绵羊', mage_mianyang:'绵羊', @@ -9688,15 +9688,15 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_shenshengyongshi:'神圣勇士', priest_puzhao:'普照', - priest_puzhao_info:'你出场时,己方主将可令一名其他友方随从增加两点体力和体力上限', + priest_puzhao_info:'你出场时,己方主将可令一名其他友方随从增加2点体力和体力上限', priest_suoxiao:'缩小', - priest_suoxiao_info:'你出场时,己方主将可令一名其他随从减少两点体力上限(不能小于1)', + priest_suoxiao_info:'你出场时,己方主将可令一名其他随从减少2点体力上限(不能小于1)', priest_shengshui:'圣水', - priest_shengshui_info:'你跳过摸牌阶段;在你的准备阶段,令一名随机友方角色回复两点体力', + priest_shengshui_info:'你跳过摸牌阶段;在你的准备阶段,令一名随机友方角色回复2点体力', priest_muguang:'暮光', - priest_muguang_info:'你出场时,若主将手牌中有随从牌,则增加一点体力和体力上限', + priest_muguang_info:'你出场时,若主将手牌中有随从牌,则增加1点体力和体力上限', priest_shixin:'蚀心', - priest_shixin_info:'每当己方主将使用一次职业技能,对双方主将各造成一点伤害', + priest_shixin_info:'每当己方主将使用一次职业技能,对双方主将各造成1点伤害', priest_shengliao:'圣疗', priest_shengliao_info:'每当一名随从回复体力,己方主将从牌库中获得一张牌', @@ -9705,11 +9705,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ priest_xundao:'训导', priest_xundao_info:'你出场时,若己方主将手牌中有随从牌,则摸一张牌并获得嘲讽', priest_hunwu:'魂舞', - priest_hunwu_info:'己方主将的职业技能及法术的治疗效果改为令目标流失等量体力', + priest_hunwu_info:'己方主将的职业技能及法术的治疗效果改为令目标失去等量体力', priest_faxian:'发现', priest_faxian_info:'你出场时,己方主将从三张随机随从牌中选择一张加入手牌', priest_zhufu:'献身', - priest_zhufu_info:'你死亡时,令一名随机友方随从增加一点体力和体力上限', + priest_zhufu_info:'你死亡时,令一名随机友方随从增加1点体力和体力上限', stone_daomufeizei:'盗墓匪贼', stone_haidao:'海盗', @@ -9729,9 +9729,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ rogue_duxing:'独行', rogue_duxing_info:'每当敌方主将召唤一名随从,便获得潜行', rogue_shoudao:'授道', - rogue_shoudao_info:'在己方主将的结束阶段,令一名随机友方随从增加一点体力和体力上限并摸一张牌', + rogue_shoudao_info:'在己方主将的结束阶段,令一名随机友方随从增加1点体力和体力上限并摸一张牌', rogue_lifa:'理发', - rogue_lifa_info:'为己方主将装备一把武器,若已有武器,改为对敌方主将造成一点伤害', + rogue_lifa_info:'为己方主将装备一把武器,若已有武器,改为对敌方主将造成1点伤害', rogue_fusheng:'复生', rogue_fusheng_info:'你出场时,体力值和体力上限变为X,X为场上体力最高的随从的体力值', rogue_jielue:'劫掠', @@ -9746,9 +9746,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ rogue_cisha:'刺杀', rogue_cisha_info:'每当你对一名随从造成伤害,受伤害随从立即死亡', rogue_touxi:'偷袭', - rogue_touxi_info:'你出场时,己方主将可弃置一张装备区内的牌并对一名敌方角色造成一点伤害', + rogue_touxi_info:'你出场时,己方主将可弃置一张装备区内的牌并对一名敌方角色造成1点伤害', rogue_qiancang:'潜藏', - rogue_qiancang_info:'你出场时,对所有未受伤害的敌方随从造成一点伤害', + rogue_qiancang_info:'你出场时,对所有未受伤害的敌方随从造成1点伤害', rogue_zhaomu:'结伙', rogue_zhaomu_info:'你出场时,召唤一个海盗', @@ -9776,18 +9776,18 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ warrior_chuanci:'穿刺', warrior_chuanci_info:'每当你对一名敌方随从造成伤害,对另一名随机敌方随从造成等量的伤害', warrior_zhifu:'掷斧', - warrior_zhifu_info:'每当你受到一次伤害,对敌方主将造成一点伤害', + warrior_zhifu_info:'每当你受到一次伤害,对敌方主将造成1点伤害', warrior_tongling:'统领', warrior_tongling_info:'每当你召唤一个初始手牌数不大于2的随从,令其获得冲锋', warrior_baoluan:'暴乱', warrior_baoluan_info:'每当一名随从受到一次伤害,摸一张牌', warrior_jiangong:'监工', - warrior_jiangong_info:'你出场时,己方主将可对一名随从造成一点伤害,然后令该随从摸两张牌', + warrior_jiangong_info:'你出场时,己方主将可对一名随从造成1点伤害,然后令该随从摸两张牌', warrior_zhujia:'铸甲', - warrior_zhujia_info:'每当你受到一次伤害,己方主将获得一点护甲', + warrior_zhujia_info:'每当你受到一次伤害,己方主将获得1点护甲', warrior_tidun:'提盾', - warrior_tidun_info:'你出场时,己方主将获得两点护甲', + warrior_tidun_info:'你出场时,己方主将获得2点护甲', stone_lieyanxiaogui:'烈焰小鬼', stone_xiaoguishouling:'小鬼首领', @@ -9812,11 +9812,11 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ warlock_huanmeng:'幻梦', warlock_huanmeng_info:'你出场时,己方主将随机弃置一张手牌', warlock_tongku:'痛苦', - warlock_tongku_info:'每当你造成一次伤害,令己方主将回复一点体力', + warlock_tongku_info:'每当你造成一次伤害,令己方主将回复1点体力', warlock_tunshi:'吞噬', warlock_tunshi_info:'你出场时,己方主将须令一名其他友方随从死亡,然后你获得其全部的手牌和体力值', warlock_shijie:'视界', - warlock_shijie_info:'每当己方主将受到一次伤害,你增加一点体力和体力上限并摸一张牌', + warlock_shijie_info:'每当己方主将受到一次伤害,你增加1点体力和体力上限并摸一张牌', warlock_nonghuo:'弄火', warlock_nonghuo_info:'你出场时,对己方主将造成1点火焰伤害', @@ -9825,7 +9825,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ warlock_yongsheng:'永生', warlock_yongsheng_info:'你死亡后,召唤一匹恐惧战马', warlock_yuhuo:'狱火', - warlock_yuhuo_info:'你出场时,对所有其他随从造成一点伤害', + warlock_yuhuo_info:'你出场时,对所有其他随从造成1点伤害', warlock_zaihuo:'灾祸', warlock_zaihuo_info:'你出场时,随机弃置主将的两张手牌', @@ -9844,15 +9844,15 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_xunmashi:'训马师', paladin_baowei:'保卫', - paladin_baowei_info:'你出场时,己方主将可令一名其他随从获得一点护甲', + paladin_baowei_info:'你出场时,己方主将可令一名其他随从获得1点护甲', paladin_tuxi:'吐息', - paladin_tuxi_info:'你出场时,己方主将进行一次判定,若为红色,则回复一点体力', + paladin_tuxi_info:'你出场时,己方主将进行一次判定,若为红色,则回复1点体力', paladin_miying:'秘影', paladin_miying_info:'你出场时,依次将牌堆中的所有不重名的判定牌置入敌方主将的判定区', paladin_huashi:'化石', paladin_huashi_info:'你出场时,己方主将可将一名其他随从的体力值及体力上限变为2', paladin_jinghua:'净化', - paladin_jinghua_info:'你出场时,对所有手牌数大于1的随从造成两点伤害', + paladin_jinghua_info:'你出场时,对所有手牌数大于1的随从造成2点伤害', paladin_moma:'秣马', paladin_moma2:'秣马', paladin_moma_info:'所有友方新兵摸牌阶段摸牌数+1', @@ -9861,13 +9861,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ paladin_zhaohuan2:'召唤', paladin_zhaohuan_info:'你出场后,你的主将在使用下一张随从牌时获得两点行动值', paladin_shouwei:'守卫', - paladin_shouwei_info:'你出场时,你的主将回复两点体力值', + paladin_shouwei_info:'你出场时,你的主将回复2点体力值', paladin_chidun:'持盾', paladin_chidun_info:'你出场时,己方主将可以弃置对方一名随从的所有牌', paladin_buji:'补给', - paladin_buji_info:'你出场时,所有友方新兵增加一点体力和体力上限并摸两张牌', + paladin_buji_info:'你出场时,所有友方新兵增加1点体力和体力上限并摸两张牌', paladin_hudun:'护盾', - paladin_hudun_info:'你出场时,获得一点护甲值', + paladin_hudun_info:'你出场时,获得1点护甲值', paladin_zhaochao:'招潮', paladin_zhaochao_info:'每当你的主将使用一次英雄技能,便摸两张牌', @@ -9892,7 +9892,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ mage_gushou:'固守', mage_gushou_info:'每当己方主将受到多于1伤害时,防止其余伤害', mage_yufa:'驭法', - mage_yufa_info:'每当己方主将使用一次职业技能,令其获得一点行动值', + mage_yufa_info:'每当己方主将使用一次职业技能,令其获得1点行动值', mage_yanshu:'炎术', mage_yanshu_info:'你出场时,造成X点火焰伤害,随机分配到敌方随从上,X为己方主将装备区内装备牌的数量', mage_pingxu:'冯虚', @@ -9905,9 +9905,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ mage_tunfa:'吞法', mage_tunfa_info:'每当己方主将使用一张法术牌,摸一张牌', mage_lieyan:'烈焰', - mage_lieyan_info:'每当己方主将使用一张法术牌,对一名随机敌方角色造成一点火焰伤害', + mage_lieyan_info:'每当己方主将使用一张法术牌,对一名随机敌方角色造成1点火焰伤害', mage_zhufa:'助法', - mage_zhufa_info:'每当己方主将使用一张法术牌,令其获得一点行动值', + mage_zhufa_info:'每当己方主将使用一张法术牌,令其获得1点行动值', mage_bingdong:'冰冻', mage_bingdong_info:'每当你对一个随从造成伤害,该随从将武将牌翻至背面', @@ -9928,9 +9928,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ hunter_jiewang:'结网', hunter_jiewang_info:'你死亡时,己方主将获得一张随机野兽牌', hunter_xunshou:'驯兽', - hunter_xunshou_info:'你出场时,己方主将可选择一名其他友方随从令其增加一点体力和体力上限,摸两张牌并获得嘲讽', + hunter_xunshou_info:'你出场时,己方主将可选择一名其他友方随从令其增加1点体力和体力上限,摸两张牌并获得嘲讽', hunter_nuhou:'怒吼', - hunter_nuhou_info:'当你死亡时,对所有敌方角色造成一点伤害', + hunter_nuhou_info:'当你死亡时,对所有敌方角色造成1点伤害', hunter_zhanhuo:'战火', hunter_zhanhuo2:'战火', hunter_zhanhuo_info:'其他友方随从摸牌阶段的摸牌数+1', @@ -9963,7 +9963,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_huoshanxiemu:'火山邪木', druid_renya:'刃牙', - druid_renya_info:'你出场时,己方主将可以选择一项:令你摸一张牌并将武将牌翻至正面,或令你增加一点体力上限并获得技能潜行', + druid_renya_info:'你出场时,己方主将可以选择一项:令你摸一张牌并将武将牌翻至正面,或令你增加1点体力上限并获得技能潜行', druid_yuehuo:'月火', druid_yuehuo_info:'所有锦囊牌造成的伤害+1', druid_qicheng:'骑乘', @@ -9973,17 +9973,17 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ druid_yeyou:'夜游', druid_yeyou_info:'双方主将各从牌库中获得一张牌', druid_juhuo:'举火', - druid_juhuo_info:'己方主将回合内,每有一名随从死亡,令己方主将获得一点行动值', + druid_juhuo_info:'己方主将回合内,每有一名随从死亡,令己方主将获得1点行动值', stone_chongfeng:'冲锋', stone_chongfeng_info:'你出场时,立即将武将牌翻至正面', druid_nuhuo:'怒火', - druid_nuhuo_info:'每当己方主将使用一次职业技能,便对一名随机敌人造成一点伤害', + druid_nuhuo_info:'每当己方主将使用一次职业技能,便对一名随机敌人造成1点伤害', druid_chengzhang:'成长', druid_chengzhang2:'成长', - druid_chengzhang_info:'你出场时,己方主将获得一点行动值;你死亡时,己方主将需弃置一张手牌', + druid_chengzhang_info:'你出场时,己方主将获得1点行动值;你死亡时,己方主将需弃置一张手牌', druid_huwei:'护卫', - druid_huwei_info:'你出场时,己方主将可以选择一项:对一名随从造成一点伤害,或弃置一名随从的所有牌并将其体力上限改为2', + druid_huwei_info:'你出场时,己方主将可以选择一项:对一名随从造成1点伤害,或弃置一名随从的所有牌并将其体力上限改为2', stone_fachao:'法潮图腾', @@ -10003,19 +10003,19 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ shaman_anhun:'暗魂', shaman_anhun_info:'每当一名友方随从死亡,令主将从牌库中获得一张牌', shaman_zoushi:'走石', - shaman_zoushi_info:'每当己方主将使用一张随从牌,对一名随机敌方角色造成一点伤害', + shaman_zoushi_info:'每当己方主将使用一张随从牌,对一名随机敌方角色造成1点伤害', shaman_zhuhuo:'逐火', shaman_zhuhuo_info:'你出场时,摸1~3张牌', shaman_peiyu:'培育', shaman_peiyu_info:'你出场时,增加X点体力和体力上限,X为友方图腾数', shaman_huoli:'活力', - shaman_huoli_info:'己方主将出牌阶段开始时,你令其获得一点行动值', + shaman_huoli_info:'己方主将出牌阶段开始时,你令其获得1点行动值', shaman_xueju:'穴居', shaman_xueju_info:'每当己主将使用一张随从牌,摸一张牌', shaman_huoxi:'火袭', - shaman_huoxi_info:'你出场时,己方主将可以对对方一名随从造成两点火焰伤害', + shaman_huoxi_info:'你出场时,己方主将可以对对方一名随从造成2点火焰伤害', shaman_fachao:'法潮', - shaman_fachao_info:'己方主将在其每个回合结束阶从牌库中获得一张牌并回复一点体力', + shaman_fachao_info:'己方主将在其每个回合结束阶从牌库中获得一张牌并回复1点体力', shaman_huoshe:'火舌', shaman_huoshe_info:'其他友方随从造成的伤害始终+1', @@ -10026,20 +10026,20 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ shaman_fali:'空气', shaman_fali_info:'已方主将使用的法术牌伤害+1', shaman_zhiliao:'治疗', - shaman_zhiliao_info:'在你的结束阶段,令所有友方随从回复一点体力', + shaman_zhiliao_info:'在你的结束阶段,令所有友方随从回复1点体力', shaman_zhuore:'灼热', - shaman_zhuore_info:'已方主将的结束阶段,对一名随机敌方随从造成一点伤害', + shaman_zhuore_info:'已方主将的结束阶段,对一名随机敌方随从造成1点伤害', _shaman_skill:'图腾', _shaman_skill_info:'召唤一个随机图腾', _mage_skill:'火冲', - _mage_skill_info:'对一名随从造成一点火焰伤害', + _mage_skill_info:'对一名随从造成1点火焰伤害', _priest_skill:'治疗', - _priest_skill_info:'回复一点体力', + _priest_skill_info:'回复1点体力', _priest_skillx:'心刺', - _priest_skillx_info:'造成一点伤害', + _priest_skillx_info:'造成1点伤害', _warrior_skill:'战甲', - _warrior_skill_info:'获得一点护甲(不能超过3点)', + _warrior_skill_info:'获得1点护甲(不能超过3点)', _warlock_skill:'分流', _warlock_skill_info:'从牌库中获得两张牌', _warlock_skillx:'炼狱', @@ -10049,7 +10049,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ _paladin_skill:'动员', _paladin_skill_info:'召唤一名士兵', _hunter_skill:'射击', - _hunter_skill_info:'对敌方主将造成一点伤害', + _hunter_skill_info:'对敌方主将造成1点伤害', _druid_skill:'猛击', _druid_skill_info:'视为使用一张不计入出杀次数的杀', @@ -10068,7 +10068,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_zhucangzhe1_info:'你出场时,己方主将可以令己方一名其他角色摸一张牌', stone_huoqiangshou:'火枪手', stone_huoqiangshou1:'火枪', - stone_huoqiangshou1_info:'你出场时,己方主将可以对对方一名随从造成一点伤害', + stone_huoqiangshou1_info:'你出场时,己方主将可以对对方一名随从造成1点伤害', stone_lansaizhanshi:'蓝腮战士', stone_kutongsiseng:'苦痛侍僧', @@ -10117,17 +10117,17 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ stone_mingguangjisi:'明光祭司', stone_nianqingjisi:'年轻祭司', stone_zhufu:'祝福', - stone_zhufu_info:'己方主将的结束阶段,你令一名随机的受伤友方随从回复一点体力', + stone_zhufu_info:'己方主将的结束阶段,你令一名随机的受伤友方随从回复1点体力', stone_aomishouwei:'奥秘守卫', stone_yanjingshe:'眼镜蛇', stone_yanjingshe1:'毒噬', stone_yanjingshe1_info:'你出场时,若敌方随从数不少于己方,则随机杀死一名随从', stone_zhiyuzhe:'治愈者', stone_zhiyu:'治愈', - stone_zhiyu_info:'你出场时,令所有友方随从回复一点体力', + stone_zhiyu_info:'你出场时,令所有友方随从回复1点体力', stone_mafengzhuru:'麻风侏儒', stone_mafengzhuru1:'麻风', - stone_mafengzhuru1_info:'杀死你的随从失去一点体力', + stone_mafengzhuru1_info:'杀死你的随从失去1点体力', stone_fatiaozhuru:'发条侏儒', stone_fatiaozhuru1:'发条', stone_fatiaozhuru1_info:'结束阶段,若你没有手牌,你摸两张牌', @@ -10149,19 +10149,19 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ spell_binghuan:'冰环', spell_binghuan_info:'将场上所有随从翻面', spell_morizaihuo:'末日灾祸', - spell_morizaihuo_info:'令场上所有随从立即死亡,回复两点体力', + spell_morizaihuo_info:'令场上所有随从立即死亡,回复2点体力', spell_zhiliaozhichu:'治疗之触', spell_zhiliaozhichu_info:'令目标随从恢复所有体力值并获得嘲讽', lschaofeng:'嘲讽', lschaofeng_info:'同阵营的无嘲讽角色不以能成为杀的目标', spell_wangzhezhufu:'王者祝福', - spell_wangzhezhufu_info:'令一名随从增加两点体力和体力上限并摸两张牌', + spell_wangzhezhufu_info:'令一名随从增加2点体力和体力上限并摸两张牌', spell_diyulieyan:'地狱烈焰', - spell_diyulieyan_info:'所有角色失去一点体力', + spell_diyulieyan_info:'所有角色失去1点体力', spell_chenmo:'沉默', spell_chenmo_info:'弃置一名随从的所有牌,并令其体力上限减至2', spell_zhiliaoshui:'治疗水', - spell_zhiliaoshui_info:'出牌阶段对自己使用,恢复两点体力值;或于濒死阶段对一名角色使用,令目标恢复一点体力', + spell_zhiliaoshui_info:'出牌阶段对自己使用,恢复2点体力值;或于濒死阶段对一名角色使用,令目标恢复1点体力', spell_yanmie:'极恶之咒', spell_yanmie_info:'交换你与敌方主将的装备区,并摸若干张牌直到你的手牌数与敌方主将相等', spell_xiaoshi:'消失', @@ -10180,13 +10180,13 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ '
      • 每名角色使用一套卡组,卡组用完后会重新补满'+ '
      • 卡组与职业绑定,每个职业有一个专属技能,每回合限用一次,消耗两点行动值
      '+ '
      职业技能
      • 祭司:召唤一个随机图腾'+ - '
      • 法师:对一名随从造成一点火焰伤害'+ - '
      • 牧师:回复一点体力'+ - '
      • 战士:获得一点护甲(不能超过3点)'+ + '
      • 法师:对一名随从造成1点火焰伤害'+ + '
      • 牧师:回复1点体力'+ + '
      • 战士:获得1点护甲(不能超过3点)'+ '
      • 术士:牌库中摸两张牌'+ '
      • 潜行者:装备一把武器和一个随机非武器装备'+ '
      • 圣骑士:召唤一名士兵'+ - '
      • 猎人:对敌方主将造成一点伤害'+ + '
      • 猎人:对敌方主将造成1点伤害'+ '
      • 德鲁伊:视为使用一张不计入出杀次数的杀
      '+ '
      怒气值
      • 每当友方随从受到伤害获得3点怒气值,主将受到伤害获得6点怒气值'+ '
      • 每有一个友方随从死亡,获得10点怒气值,主将死亡获得20点怒气值'+ diff --git a/mode/tafang.js b/mode/tafang.js index 988c2b0c7..26c8ab268 100644 --- a/mode/tafang.js +++ b/mode/tafang.js @@ -1129,26 +1129,26 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ tafang_mech_weixingxianjing:'小型陷阱', tafang_mech_weixingxianjing_skill:'捕猎', - tafang_mech_weixingxianjing_skill_info:'每一轮令距离你2格以内的一名随机敌人翻面', + tafang_mech_weixingxianjing_skill_info:'每一轮令距离你2格以内的一名随机敌人翻面。', tafang_mech_mutong:'木桶', tafang_mech_mutong_skill:'飞滚', - tafang_mech_mutong_skill_info:'每一轮对距离3格以内的一名随机敌人造成一点伤害', + tafang_mech_mutong_skill_info:'每一轮对距离3格以内的一名随机敌人造成1点伤害。', tafang_mech_nengliangqiu:'能量球', tafang_mech_nengliangqiu_skill:'充能', - tafang_mech_nengliangqiu_skill_info:'每一轮令距离3格以内的所有友方角色摸1张牌,距离1以内改为摸2张', + tafang_mech_nengliangqiu_skill_info:'每一轮令距离3格以内的所有友方角色摸1张牌,距离1以内改为摸2张。', tafang_mech_jiguanren:'机关人', tafang_mech_jiguanren_skill:'掠夺', - tafang_mech_jiguanren_skill_info:'每一轮弃置3格以内的所有敌方角色各1~2张牌', + tafang_mech_jiguanren_skill_info:'每一轮弃置3格以内的所有敌方角色各1~2张牌。', tafang_mech_gongchengche:'攻城车', tafang_mech_gongchengche_skill:'攻坚', - tafang_mech_gongchengche_skill_info:'每一轮对距离2格以内的一名随机敌方角色造成1点火焰伤害,并随机弃置其一张牌', + tafang_mech_gongchengche_skill_info:'每一轮对距离2格以内的一名随机敌方角色造成1点火焰伤害,并随机弃置其一张牌。', tafang_mech_guangmingquan:'光明泉', tafang_mech_guangmingquan_skill:'圣疗', - tafang_mech_guangmingquan_skill_info:'每一轮令距离2格以内的所有友方角色各回复一点体力', + tafang_mech_guangmingquan_skill_info:'每一轮令距离2格以内的所有友方角色各回复1点体力。', tafang_mech_dubiaoxianjing:'毒镖陷阱', tafang_mech_dubiaoxianjing_skill:'毒镖', - tafang_mech_dubiaoxianjing_skill_info:'每当距离2格以内的一名敌方角色', + tafang_mech_dubiaoxianjing_skill_info:'每当距离2格以内的一名敌方角色。', tafang_mech_jiqishi:'集合石', tafang_mech_shenmidiaoxiang:'神秘雕像', tafang_mech_shenpanxianjing:'审判之刃', diff --git a/mode/versus.js b/mode/versus.js index b12384b13..7f76d96d6 100644 --- a/mode/versus.js +++ b/mode/versus.js @@ -1660,7 +1660,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } for(var i=0;i胜利条件:满足一下任意条件游戏结束:(1)在新的一轮开始时,若你的势力获得的龙船至宝至少为4个,则你和队友获胜;(2)消灭所有敌人。'+ '
      '+ '
      2v2 替补模式
      • 选将时额外选择一名替补武将,阵亡时使用自己的替补武将上场,无替补时改为用队友的替补武将,两人均无替补时游戏结束'+ - '
      • 杀死敌方武将摸3张牌,杀死友方武将弃置所有牌
      '+ + '
    • 杀死敌方武将摸三张牌,杀死友方武将弃置所有牌
    '+ '
    4v4
    • 双方各有一名主公和三名忠臣,杀死对方主公获胜
    • '+ '8号位游戏开始时额外摸一张牌,7、8号位可在游戏开始时置换一次手牌
    • '+ '杀死对方忠臣摸2+x张牌,x为对方(含刚被杀的忠臣)与己方的存活人数之差;主公杀死己方忠臣须弃置所有牌',