diff --git a/audio/die/clan_wangyun.mp3 b/audio/die/clan_wangyun.mp3 new file mode 100644 index 000000000..1972828e1 Binary files /dev/null and b/audio/die/clan_wangyun.mp3 differ diff --git a/audio/die/dc_duyu.mp3 b/audio/die/dc_duyu.mp3 new file mode 100644 index 000000000..7fff13162 Binary files /dev/null and b/audio/die/dc_duyu.mp3 differ diff --git a/audio/die/dc_huanghao.mp3 b/audio/die/dc_huanghao.mp3 new file mode 100644 index 000000000..e44d2cd2d Binary files /dev/null and b/audio/die/dc_huanghao.mp3 differ diff --git a/audio/die/dc_wangjun.mp3 b/audio/die/dc_wangjun.mp3 new file mode 100644 index 000000000..cc34e23ee Binary files /dev/null and b/audio/die/dc_wangjun.mp3 differ diff --git a/audio/die/haopu.mp3 b/audio/die/haopu.mp3 new file mode 100644 index 000000000..6a5e78d94 Binary files /dev/null and b/audio/die/haopu.mp3 differ diff --git a/audio/die/key_abyusa.mp3 b/audio/die/key_abyusa.mp3 new file mode 100644 index 000000000..5a609f908 Binary files /dev/null and b/audio/die/key_abyusa.mp3 differ diff --git a/audio/die/key_hinata.mp3 b/audio/die/key_hinata.mp3 new file mode 100644 index 000000000..8946a89ee Binary files /dev/null and b/audio/die/key_hinata.mp3 differ diff --git a/audio/die/key_hisako.mp3 b/audio/die/key_hisako.mp3 new file mode 100644 index 000000000..9f0600a11 Binary files /dev/null and b/audio/die/key_hisako.mp3 differ diff --git a/audio/die/key_noda.mp3 b/audio/die/key_noda.mp3 new file mode 100644 index 000000000..b4922f3d6 Binary files /dev/null and b/audio/die/key_noda.mp3 differ diff --git a/audio/die/key_shiina.mp3 b/audio/die/key_shiina.mp3 new file mode 100644 index 000000000..591e85ab5 Binary files /dev/null and b/audio/die/key_shiina.mp3 differ diff --git a/audio/die/key_shiorimiyuki.mp3 b/audio/die/key_shiorimiyuki.mp3 new file mode 100644 index 000000000..dc2d05d8a Binary files /dev/null and b/audio/die/key_shiorimiyuki.mp3 differ diff --git a/audio/die/key_yui.mp3 b/audio/die/key_yui.mp3 new file mode 100644 index 000000000..ccb3b3978 Binary files /dev/null and b/audio/die/key_yui.mp3 differ diff --git a/audio/die/key_yuri.mp3 b/audio/die/key_yuri.mp3 new file mode 100644 index 000000000..d272c9e3e Binary files /dev/null and b/audio/die/key_yuri.mp3 differ diff --git a/audio/die/ol_zhouqun.mp3 b/audio/die/ol_zhouqun.mp3 new file mode 100644 index 000000000..8e4f727f3 Binary files /dev/null and b/audio/die/ol_zhouqun.mp3 differ diff --git a/audio/die/sp_key_kanade.mp3 b/audio/die/sp_key_kanade.mp3 new file mode 100644 index 000000000..f9d1c51e0 Binary files /dev/null and b/audio/die/sp_key_kanade.mp3 differ diff --git a/audio/die/sunlingluan.mp3 b/audio/die/sunlingluan.mp3 new file mode 100644 index 000000000..482dacbf8 Binary files /dev/null and b/audio/die/sunlingluan.mp3 differ diff --git a/audio/die/yuechen.mp3 b/audio/die/yuechen.mp3 new file mode 100644 index 000000000..8fcb39d6b Binary files /dev/null and b/audio/die/yuechen.mp3 differ diff --git a/audio/die/zhoubuyi.mp3 b/audio/die/zhoubuyi.mp3 new file mode 100644 index 000000000..6014f39e9 Binary files /dev/null and b/audio/die/zhoubuyi.mp3 differ diff --git a/audio/skill/abyusa_dunying1.mp3 b/audio/skill/abyusa_dunying1.mp3 new file mode 100644 index 000000000..6be1c09d4 Binary files /dev/null and b/audio/skill/abyusa_dunying1.mp3 differ diff --git a/audio/skill/abyusa_dunying2.mp3 b/audio/skill/abyusa_dunying2.mp3 new file mode 100644 index 000000000..b2c2fda91 Binary files /dev/null and b/audio/skill/abyusa_dunying2.mp3 differ diff --git a/audio/skill/abyusa_jueqing1.mp3 b/audio/skill/abyusa_jueqing1.mp3 new file mode 100644 index 000000000..de86088d7 Binary files /dev/null and b/audio/skill/abyusa_jueqing1.mp3 differ diff --git a/audio/skill/abyusa_jueqing2.mp3 b/audio/skill/abyusa_jueqing2.mp3 new file mode 100644 index 000000000..26b3b0e6b Binary files /dev/null and b/audio/skill/abyusa_jueqing2.mp3 differ diff --git a/audio/skill/clanjiexuan1.mp3 b/audio/skill/clanjiexuan1.mp3 new file mode 100644 index 000000000..be4b660cb Binary files /dev/null and b/audio/skill/clanjiexuan1.mp3 differ diff --git a/audio/skill/clanjiexuan2.mp3 b/audio/skill/clanjiexuan2.mp3 new file mode 100644 index 000000000..5f4da7430 Binary files /dev/null and b/audio/skill/clanjiexuan2.mp3 differ diff --git a/audio/skill/clanmingjie1.mp3 b/audio/skill/clanmingjie1.mp3 new file mode 100644 index 000000000..7af974f44 Binary files /dev/null and b/audio/skill/clanmingjie1.mp3 differ diff --git a/audio/skill/clanmingjie2.mp3 b/audio/skill/clanmingjie2.mp3 new file mode 100644 index 000000000..11d3317d5 Binary files /dev/null and b/audio/skill/clanmingjie2.mp3 differ diff --git a/audio/skill/clanzhongliu_clan_wangyun1.mp3 b/audio/skill/clanzhongliu_clan_wangyun1.mp3 new file mode 100644 index 000000000..2911411f5 Binary files /dev/null and b/audio/skill/clanzhongliu_clan_wangyun1.mp3 differ diff --git a/audio/skill/clanzhongliu_clan_wangyun2.mp3 b/audio/skill/clanzhongliu_clan_wangyun2.mp3 new file mode 100644 index 000000000..ac19d7223 Binary files /dev/null and b/audio/skill/clanzhongliu_clan_wangyun2.mp3 differ diff --git a/audio/skill/dcchangqu1.mp3 b/audio/skill/dcchangqu1.mp3 new file mode 100644 index 000000000..d71e6dff2 Binary files /dev/null and b/audio/skill/dcchangqu1.mp3 differ diff --git a/audio/skill/dcchangqu2.mp3 b/audio/skill/dcchangqu2.mp3 new file mode 100644 index 000000000..722ae7d95 Binary files /dev/null and b/audio/skill/dcchangqu2.mp3 differ diff --git a/audio/skill/dccunwei1.mp3 b/audio/skill/dccunwei1.mp3 new file mode 100644 index 000000000..a6a05a155 Binary files /dev/null and b/audio/skill/dccunwei1.mp3 differ diff --git a/audio/skill/dccunwei2.mp3 b/audio/skill/dccunwei2.mp3 new file mode 100644 index 000000000..ce5f786f2 Binary files /dev/null and b/audio/skill/dccunwei2.mp3 differ diff --git a/audio/skill/dcdyqingshi1.mp3 b/audio/skill/dcdyqingshi1.mp3 new file mode 100644 index 000000000..81820817c Binary files /dev/null and b/audio/skill/dcdyqingshi1.mp3 differ diff --git a/audio/skill/dcdyqingshi2.mp3 b/audio/skill/dcdyqingshi2.mp3 new file mode 100644 index 000000000..00d0125e4 Binary files /dev/null and b/audio/skill/dcdyqingshi2.mp3 differ diff --git a/audio/skill/dcgonghu1.mp3 b/audio/skill/dcgonghu1.mp3 new file mode 100644 index 000000000..2fb837625 Binary files /dev/null and b/audio/skill/dcgonghu1.mp3 differ diff --git a/audio/skill/dcgonghu2.mp3 b/audio/skill/dcgonghu2.mp3 new file mode 100644 index 000000000..27d4c8828 Binary files /dev/null and b/audio/skill/dcgonghu2.mp3 differ diff --git a/audio/skill/dcjianguo1.mp3 b/audio/skill/dcjianguo1.mp3 new file mode 100644 index 000000000..0be7becde Binary files /dev/null and b/audio/skill/dcjianguo1.mp3 differ diff --git a/audio/skill/dcjianguo2.mp3 b/audio/skill/dcjianguo2.mp3 new file mode 100644 index 000000000..98423cb19 Binary files /dev/null and b/audio/skill/dcjianguo2.mp3 differ diff --git a/audio/skill/dclingyue1.mp3 b/audio/skill/dclingyue1.mp3 new file mode 100644 index 000000000..71ee24e0d Binary files /dev/null and b/audio/skill/dclingyue1.mp3 differ diff --git a/audio/skill/dclingyue2.mp3 b/audio/skill/dclingyue2.mp3 new file mode 100644 index 000000000..cb2c2c348 Binary files /dev/null and b/audio/skill/dclingyue2.mp3 differ diff --git a/audio/skill/dcpandi1.mp3 b/audio/skill/dcpandi1.mp3 new file mode 100644 index 000000000..2c8db76a7 Binary files /dev/null and b/audio/skill/dcpandi1.mp3 differ diff --git a/audio/skill/dcpandi2.mp3 b/audio/skill/dcpandi2.mp3 new file mode 100644 index 000000000..5b48b655c Binary files /dev/null and b/audio/skill/dcpandi2.mp3 differ diff --git a/audio/skill/dcporui1.mp3 b/audio/skill/dcporui1.mp3 new file mode 100644 index 000000000..1c2010a85 Binary files /dev/null and b/audio/skill/dcporui1.mp3 differ diff --git a/audio/skill/dcporui2.mp3 b/audio/skill/dcporui2.mp3 new file mode 100644 index 000000000..a12a08890 Binary files /dev/null and b/audio/skill/dcporui2.mp3 differ diff --git a/audio/skill/dcqinqing1.mp3 b/audio/skill/dcqinqing1.mp3 new file mode 100644 index 000000000..69b07e13c Binary files /dev/null and b/audio/skill/dcqinqing1.mp3 differ diff --git a/audio/skill/dcqinqing2.mp3 b/audio/skill/dcqinqing2.mp3 new file mode 100644 index 000000000..cc9f0179e Binary files /dev/null and b/audio/skill/dcqinqing2.mp3 differ diff --git a/audio/skill/dcshiji1.mp3 b/audio/skill/dcshiji1.mp3 new file mode 100644 index 000000000..036f4926f Binary files /dev/null and b/audio/skill/dcshiji1.mp3 differ diff --git a/audio/skill/dcshiji2.mp3 b/audio/skill/dcshiji2.mp3 new file mode 100644 index 000000000..2562858b1 Binary files /dev/null and b/audio/skill/dcshiji2.mp3 differ diff --git a/audio/skill/dcsilun1.mp3 b/audio/skill/dcsilun1.mp3 new file mode 100644 index 000000000..e49281613 Binary files /dev/null and b/audio/skill/dcsilun1.mp3 differ diff --git a/audio/skill/dcsilun2.mp3 b/audio/skill/dcsilun2.mp3 new file mode 100644 index 000000000..818dcd92d Binary files /dev/null and b/audio/skill/dcsilun2.mp3 differ diff --git a/audio/skill/dctongye1.mp3 b/audio/skill/dctongye1.mp3 new file mode 100644 index 000000000..f950ddf48 Binary files /dev/null and b/audio/skill/dctongye1.mp3 differ diff --git a/audio/skill/dctongye2.mp3 b/audio/skill/dctongye2.mp3 new file mode 100644 index 000000000..f2747c93e Binary files /dev/null and b/audio/skill/dctongye2.mp3 differ diff --git a/audio/skill/hinata_ehou1.mp3 b/audio/skill/hinata_ehou1.mp3 new file mode 100644 index 000000000..e0cae28e4 Binary files /dev/null and b/audio/skill/hinata_ehou1.mp3 differ diff --git a/audio/skill/hinata_ehou2.mp3 b/audio/skill/hinata_ehou2.mp3 new file mode 100644 index 000000000..815902363 Binary files /dev/null and b/audio/skill/hinata_ehou2.mp3 differ diff --git a/audio/skill/hinata_qiulve1.mp3 b/audio/skill/hinata_qiulve1.mp3 new file mode 100644 index 000000000..5a4e6f441 Binary files /dev/null and b/audio/skill/hinata_qiulve1.mp3 differ diff --git a/audio/skill/hinata_qiulve2.mp3 b/audio/skill/hinata_qiulve2.mp3 new file mode 100644 index 000000000..e91bbdd15 Binary files /dev/null and b/audio/skill/hinata_qiulve2.mp3 differ diff --git a/audio/skill/hisako_yinbao1.mp3 b/audio/skill/hisako_yinbao1.mp3 new file mode 100644 index 000000000..c56690cde Binary files /dev/null and b/audio/skill/hisako_yinbao1.mp3 differ diff --git a/audio/skill/hisako_yinbao2.mp3 b/audio/skill/hisako_yinbao2.mp3 new file mode 100644 index 000000000..dea8dfa8c Binary files /dev/null and b/audio/skill/hisako_yinbao2.mp3 differ diff --git a/audio/skill/huisheng_dc_huanghao1.mp3 b/audio/skill/huisheng_dc_huanghao1.mp3 new file mode 100644 index 000000000..ec3a440fe Binary files /dev/null and b/audio/skill/huisheng_dc_huanghao1.mp3 differ diff --git a/audio/skill/huisheng_dc_huanghao2.mp3 b/audio/skill/huisheng_dc_huanghao2.mp3 new file mode 100644 index 000000000..f161337fe Binary files /dev/null and b/audio/skill/huisheng_dc_huanghao2.mp3 differ diff --git a/audio/skill/kanade_benzhan1.mp3 b/audio/skill/kanade_benzhan1.mp3 new file mode 100644 index 000000000..783f4b9a6 Binary files /dev/null and b/audio/skill/kanade_benzhan1.mp3 differ diff --git a/audio/skill/kanade_benzhan2.mp3 b/audio/skill/kanade_benzhan2.mp3 new file mode 100644 index 000000000..06bf5af8a Binary files /dev/null and b/audio/skill/kanade_benzhan2.mp3 differ diff --git a/audio/skill/kanade_benzhan3.mp3 b/audio/skill/kanade_benzhan3.mp3 new file mode 100644 index 000000000..a4cf79d06 Binary files /dev/null and b/audio/skill/kanade_benzhan3.mp3 differ diff --git a/audio/skill/kanade_mapo1.mp3 b/audio/skill/kanade_mapo1.mp3 new file mode 100644 index 000000000..6e5b211f4 Binary files /dev/null and b/audio/skill/kanade_mapo1.mp3 differ diff --git a/audio/skill/kanade_mapo2.mp3 b/audio/skill/kanade_mapo2.mp3 new file mode 100644 index 000000000..d2744710c Binary files /dev/null and b/audio/skill/kanade_mapo2.mp3 differ diff --git a/audio/skill/noda_fengcheng1.mp3 b/audio/skill/noda_fengcheng1.mp3 new file mode 100644 index 000000000..c5ec441c6 Binary files /dev/null and b/audio/skill/noda_fengcheng1.mp3 differ diff --git a/audio/skill/noda_fengcheng2.mp3 b/audio/skill/noda_fengcheng2.mp3 new file mode 100644 index 000000000..64329d0ba Binary files /dev/null and b/audio/skill/noda_fengcheng2.mp3 differ diff --git a/audio/skill/noda_xunxin1.mp3 b/audio/skill/noda_xunxin1.mp3 new file mode 100644 index 000000000..3f7b30d9a Binary files /dev/null and b/audio/skill/noda_xunxin1.mp3 differ diff --git a/audio/skill/noda_xunxin2.mp3 b/audio/skill/noda_xunxin2.mp3 new file mode 100644 index 000000000..47fba6d00 Binary files /dev/null and b/audio/skill/noda_xunxin2.mp3 differ diff --git a/audio/skill/olchenshuo1.mp3 b/audio/skill/olchenshuo1.mp3 new file mode 100644 index 000000000..449af0060 Binary files /dev/null and b/audio/skill/olchenshuo1.mp3 differ diff --git a/audio/skill/olchenshuo2.mp3 b/audio/skill/olchenshuo2.mp3 new file mode 100644 index 000000000..f631f6955 Binary files /dev/null and b/audio/skill/olchenshuo2.mp3 differ diff --git a/audio/skill/oltianhou1.mp3 b/audio/skill/oltianhou1.mp3 new file mode 100644 index 000000000..fdd809e56 Binary files /dev/null and b/audio/skill/oltianhou1.mp3 differ diff --git a/audio/skill/oltianhou2.mp3 b/audio/skill/oltianhou2.mp3 new file mode 100644 index 000000000..17f9e9cb4 Binary files /dev/null and b/audio/skill/oltianhou2.mp3 differ diff --git a/audio/skill/oltianhou_club.mp3 b/audio/skill/oltianhou_club.mp3 new file mode 100644 index 000000000..14857360e Binary files /dev/null and b/audio/skill/oltianhou_club.mp3 differ diff --git a/audio/skill/oltianhou_diamond.mp3 b/audio/skill/oltianhou_diamond.mp3 new file mode 100644 index 000000000..a91f6d5c8 Binary files /dev/null and b/audio/skill/oltianhou_diamond.mp3 differ diff --git a/audio/skill/oltianhou_heart.mp3 b/audio/skill/oltianhou_heart.mp3 new file mode 100644 index 000000000..2d38f606a Binary files /dev/null and b/audio/skill/oltianhou_heart.mp3 differ diff --git a/audio/skill/oltianhou_spade.mp3 b/audio/skill/oltianhou_spade.mp3 new file mode 100644 index 000000000..8b23adffe Binary files /dev/null and b/audio/skill/oltianhou_spade.mp3 differ diff --git a/audio/skill/olzhenying1.mp3 b/audio/skill/olzhenying1.mp3 new file mode 100644 index 000000000..463954aa1 Binary files /dev/null and b/audio/skill/olzhenying1.mp3 differ diff --git a/audio/skill/olzhenying2.mp3 b/audio/skill/olzhenying2.mp3 new file mode 100644 index 000000000..1b17adb50 Binary files /dev/null and b/audio/skill/olzhenying2.mp3 differ diff --git a/audio/skill/shiina_feiyan1.mp3 b/audio/skill/shiina_feiyan1.mp3 new file mode 100644 index 000000000..bb13d0512 Binary files /dev/null and b/audio/skill/shiina_feiyan1.mp3 differ diff --git a/audio/skill/shiina_qingshen1.mp3 b/audio/skill/shiina_qingshen1.mp3 new file mode 100644 index 000000000..8a447c226 Binary files /dev/null and b/audio/skill/shiina_qingshen1.mp3 differ diff --git a/audio/skill/shiina_retieji1.mp3 b/audio/skill/shiina_retieji1.mp3 new file mode 100644 index 000000000..cffb589fd Binary files /dev/null and b/audio/skill/shiina_retieji1.mp3 differ diff --git a/audio/skill/shiorimiyuki_banyin1.mp3 b/audio/skill/shiorimiyuki_banyin1.mp3 new file mode 100644 index 000000000..52f1b706b Binary files /dev/null and b/audio/skill/shiorimiyuki_banyin1.mp3 differ diff --git a/audio/skill/shiorimiyuki_banyin2.mp3 b/audio/skill/shiorimiyuki_banyin2.mp3 new file mode 100644 index 000000000..81b7690cb Binary files /dev/null and b/audio/skill/shiorimiyuki_banyin2.mp3 differ diff --git a/audio/skill/shiorimiyuki_tingxian1.mp3 b/audio/skill/shiorimiyuki_tingxian1.mp3 new file mode 100644 index 000000000..a33cd0d77 Binary files /dev/null and b/audio/skill/shiorimiyuki_tingxian1.mp3 differ diff --git a/audio/skill/shiorimiyuki_tingxian2.mp3 b/audio/skill/shiorimiyuki_tingxian2.mp3 new file mode 100644 index 000000000..909f3ccb3 Binary files /dev/null and b/audio/skill/shiorimiyuki_tingxian2.mp3 differ diff --git a/audio/skill/spxizhan3.mp3 b/audio/skill/spxizhan3.mp3 new file mode 100644 index 000000000..12cfe99c3 Binary files /dev/null and b/audio/skill/spxizhan3.mp3 differ diff --git a/audio/skill/spxizhan4.mp3 b/audio/skill/spxizhan4.mp3 new file mode 100644 index 000000000..46100322b Binary files /dev/null and b/audio/skill/spxizhan4.mp3 differ diff --git a/audio/skill/tspowei3.mp3 b/audio/skill/tspowei3.mp3 new file mode 100644 index 000000000..d2c8c54b6 Binary files /dev/null and b/audio/skill/tspowei3.mp3 differ diff --git a/audio/skill/yui_jiang1.mp3 b/audio/skill/yui_jiang1.mp3 new file mode 100644 index 000000000..95ec3643f Binary files /dev/null and b/audio/skill/yui_jiang1.mp3 differ diff --git a/audio/skill/yui_jiang2.mp3 b/audio/skill/yui_jiang2.mp3 new file mode 100644 index 000000000..19e405b22 Binary files /dev/null and b/audio/skill/yui_jiang2.mp3 differ diff --git a/audio/skill/yui_lieyin1.mp3 b/audio/skill/yui_lieyin1.mp3 new file mode 100644 index 000000000..ba79c85a9 Binary files /dev/null and b/audio/skill/yui_lieyin1.mp3 differ diff --git a/audio/skill/yui_lieyin2.mp3 b/audio/skill/yui_lieyin2.mp3 new file mode 100644 index 000000000..d76b6cb58 Binary files /dev/null and b/audio/skill/yui_lieyin2.mp3 differ diff --git a/audio/skill/yui_takaramono1.mp3 b/audio/skill/yui_takaramono1.mp3 new file mode 100644 index 000000000..f75e1e043 Binary files /dev/null and b/audio/skill/yui_takaramono1.mp3 differ diff --git a/audio/skill/yui_takaramono2.mp3 b/audio/skill/yui_takaramono2.mp3 new file mode 100644 index 000000000..1d60f287b Binary files /dev/null and b/audio/skill/yui_takaramono2.mp3 differ diff --git a/audio/skill/yuri_wangxi1.mp3 b/audio/skill/yuri_wangxi1.mp3 new file mode 100644 index 000000000..e506c08d9 Binary files /dev/null and b/audio/skill/yuri_wangxi1.mp3 differ diff --git a/audio/skill/yuri_wangxi2.mp3 b/audio/skill/yuri_wangxi2.mp3 new file mode 100644 index 000000000..91e6ce9d9 Binary files /dev/null and b/audio/skill/yuri_wangxi2.mp3 differ diff --git a/audio/skill/yuri_xingdong1.mp3 b/audio/skill/yuri_xingdong1.mp3 index ac40b68e0..496c41390 100644 Binary files a/audio/skill/yuri_xingdong1.mp3 and b/audio/skill/yuri_xingdong1.mp3 differ diff --git a/audio/skill/yuri_xingdong2.mp3 b/audio/skill/yuri_xingdong2.mp3 index 07d5b2c9d..54216089a 100644 Binary files a/audio/skill/yuri_xingdong2.mp3 and b/audio/skill/yuri_xingdong2.mp3 differ diff --git a/audio/skill/yuri_xingdong3.mp3 b/audio/skill/yuri_xingdong3.mp3 new file mode 100644 index 000000000..3526340fd Binary files /dev/null and b/audio/skill/yuri_xingdong3.mp3 differ diff --git a/audio/skill/yuri_xingdong_gain1.mp3 b/audio/skill/yuri_xingdong_gain1.mp3 new file mode 100644 index 000000000..299682061 Binary files /dev/null and b/audio/skill/yuri_xingdong_gain1.mp3 differ diff --git a/audio/skill/yuri_xingdong_gain2.mp3 b/audio/skill/yuri_xingdong_gain2.mp3 new file mode 100644 index 000000000..02021de99 Binary files /dev/null and b/audio/skill/yuri_xingdong_gain2.mp3 differ diff --git a/card/guozhan.js b/card/guozhan.js index 235033d7f..177477d4c 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -1219,7 +1219,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ equipSkill:true, mod:{ canBeReplaced:function(card,player){ - return false; + if(player.getEquips('liulongcanjia').contains(card)) return false; }, }, }, diff --git a/card/mtg.js b/card/mtg.js index d5b1f22f5..03aa6b308 100644 --- a/card/mtg.js +++ b/card/mtg.js @@ -484,36 +484,32 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, mtg_yixialan_skill:{ enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h',{type:'basic'})>0; - }, - filterCard:{type:'basic'}, - prepare:function(cards,player){ - player.$throw(cards,1000); - }, + filter:(event,player)=>player.hasCard(card=>lib.skill.mtg_yixialan_skill.filterCard(card,player),'h'), + filterCard:(card,player)=>get.type(card)=='basic'&&player.canRecast(card), discard:false, - delay:0.5, + lose:false, check:function(card){ return 7-get.value(card); }, usable:1, content:function(){ - var card=get.cardPile(function(card){ - return get.type(card,'trick')=='trick' + player.recast(cards,null,(player,cards)=>{ + var cardsToGain=[]; + for(let repetition=0;repetitionget.type(card,'trick')=='trick'); + if(card) cardsToGain.push(card); + } + if(cardsToGain.length) player.gain(cardsToGain,'draw'); + if(cards.length-cardsToGain.length) player.draw(cards.length-cardsToGain.length).log=false; + return cardsToGain; }); - if(card){ - player.gain(card,'draw'); - } - else{ - player.draw(); - } }, ai:{ mapValue:2, order:1, result:{ - player:1, - }, + player:1 + } } }, mtg_shuimomuxue_skill:{ diff --git a/card/yingbian.js b/card/yingbian.js index cf75083d8..0b3f0f55c 100644 --- a/card/yingbian.js +++ b/card/yingbian.js @@ -450,7 +450,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseCard('h','是否发动【太公阴符】重铸一张手牌?').set('ai',function(card){ + player.chooseCard('h','是否发动【太公阴符】重铸一张手牌?',lib.filter.cardRecastable).set('ai',function(card){ return 5-get.value(card); }); 'step 1' diff --git a/card/yongjian.js b/card/yongjian.js index 993c0e56f..f42767f49 100644 --- a/card/yongjian.js +++ b/card/yongjian.js @@ -60,7 +60,8 @@ game.import('card',function(lib,game,ui,get,ai,_status){ else player.choosePlayerCard(target,'h',true); 'step 1' if(result.bool){ - event.show_card=result.cards[0],str=get.translation(player); + event.show_card=result.cards[0]; + var str=get.translation(player); player.showCards(event.show_card); target.chooseControl().set('choiceList',[ '令'+str+'获得'+get.translation(event.show_card), @@ -699,11 +700,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ duanjian_append:'不要因为手快而装给自己。', serafuku:'水手服', serafuku_info:'锁定技。当你成为【杀】的目标后,若你的性别包含男性,则你进行判定:若结果为黑色,则此牌对你的伤害值基数+1。', - serafuku_append:'セーラー服だからです、
结论!
', + serafuku_append:'セーラー服だからです、
結論!
', yinfengyi:'引蜂衣', yinfengyi_info:'锁定技。当你受到渠道为锦囊牌的伤害时,此伤害+1。当你因〖毒①〗而失去体力时,失去体力的量值+1。', yonglv:'庸驴', - yonglv_info:'锁定技。其他角色至你的距离视为1。', + yonglv_info:'锁定技。①你至其他角色的距离-1。②其他角色至你的距离视为1。', yonglv_append:'它旁边的就是王仲宣。', zhanxiang:'战象', zhanxiang_info:'锁定技。①其他角色至你的距离+1。②当你成为〖赠予〗的目标后,你将此次赠予的效果改为“将赠予牌移动至弃牌堆”。', diff --git a/character/clan.js b/character/clan.js index 505af2ff3..985ec60c7 100644 --- a/character/clan.js +++ b/character/clan.js @@ -233,8 +233,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var skill=event.sourceSkill||event.skill; var info=get.info(skill); if(info.charlotte) return false; - var translation=lib.translate[skill+'_info']; - if(translation&&!(/(?0; }, check:function(event,player){ @@ -244,22 +244,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' var num=trigger.player.countCards('h'); - trigger.player.chooseCard('是否重铸任意张牌名字数为'+num+'的牌?',[1,Infinity],'he',(card,player,target)=>{ - if(!_status.event.cards.contains(card)) return false; - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - return mod=='unchanged'; - }).set('ai',card=>{ + 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 lib.skill.dcweidang.getLength(card)==num; })); 'step 1' - if(result.bool){ - var cards=result.cards; - trigger.player.loseToDiscardpile(cards); - trigger.player.draw(cards.length); - } + if(result.bool) trigger.player.recast(result.cards); } }, //族王允 @@ -575,8 +567,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!targets.length){ var num=lib.skill.clanguangu_backup.num; var cards=get.cards(num); - game.cardsGotoOrdering(cards); - event.cards=cards; + event.cards=cards.slice(0); + while(cards.length) ui.cardPile.insertBefore(cards.pop().fix(),ui.cardPile.firstChild); + game.updateRoundNumber(); event.goto(2); } else{ @@ -652,11 +645,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ next.set('owner',owner); } } - 'step 4' - if(!targets.length){ - while(cards.length) ui.cardPile.insertBefore(cards.pop().fix(),ui.cardPile.firstChild); - game.updateRoundNumber(); - } }, ai:{ order:10, @@ -787,7 +775,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var num=player.countCards('h'); var str='是否交给其'+get.cnNumber(num)+'张牌,然后视为你对其使用一张【酒】?或者点击“取消”,令其交给你一张牌,然后其视为对你使用一张雷【杀】。'; - target.chooseCard(get.translation(player)+'对你发动了【驳龙】',str,num,'he').set('ai',card=>{ + if(!num||target.countCards('he'){ if(_status.event.canGive) return 5+Math.max(0,3-_status.event.player.hp)/1.5-get.value(card); return 0; }).set('canGive',function(){ @@ -848,7 +837,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ cards.addArray(evt.getl(current).hs); }); }) - return event.cards.some(card=>!cards.contains(card)); + if(event.cards.some(card=>!cards.contains(card))) return false; + return true; }, content:function(){ 'step 0' @@ -910,18 +900,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ subSkill:{ global:{ enable:'phaseUse', - filter:function(event,player){ - return game.hasPlayer(current=>lib.skill.clanlianzhu_global.filterTarget(null,player,current)); - }, - filterCard:function(card,player){ - if(!game.hasPlayer(current=>{ - if(!current.hasSkill('clanlianzhu')||current.hasSkill('clanlianzhu_targeted')) return false; - return !current.storage.clanlianzhu; - })) return false; - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - if(mod!='unchanged') return mod; - return true; - }, + filter:(event,player)=>game.hasPlayer(current=>lib.skill.clanlianzhu_global.filterTarget(null,player,current)), + filterCard:(card,player)=>game.hasPlayer(current=>current.hasSkill('clanlianzhu')&&!current.hasSkill('clanlianzhu_targeted')&&!current.storage.clanlianzhu)&&player.canRecast(card), selectCard:[0,1], check:function(card){ return 5-get.value(card); @@ -968,10 +948,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bocchi.sortBySeat(); kita.sortBySeat(); var str=''; - var getn=function(target){ - if(player==target) return '自己'; - return get.translation(target); - } if(bocchi.length){ str+='重铸一张牌,然后令'; bocchi.forEach((current,i)=>{ @@ -998,19 +974,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.storage.clanlianzhu) event.goto(4); target.changeZhuanhuanji('clanlianzhu'); 'step 1' - player.loseToDiscardpile(cards); - player.draw(cards.length); + player.recast(cards); 'step 2' if(!target.countCards('he')&&!_status.connectMode) event._result={bool:false}; - else target.chooseCard('he','联诛:是否重铸一张牌?',(card,player)=>{ - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - if(mod!='unchanged') return mod; - return true; - }); + else target.chooseCard('he','联诛:是否重铸一张牌?',lib.filter.cardRecastable); 'step 3' if(result.bool){ - target.loseToDiscardpile(result.cards); - target.draw(result.cards.length); + target.recast(result.cards); if(get.color(cards[0])!=get.color(result.cards[0])) lib.skill.chenliuwushi.change(target,-1); } event.finish(); @@ -1473,9 +1443,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=result.targets[0],num=lib.skill.clansankuang.getNum(target),num2=target.countCards('he'); event.target=target; player.logSkill('clansankuang',target); - if(num==0||num2==0) event._result={bool:false}; + if(num2==0) event._result={bool:false}; else if(num2<=num) event._result={bool:true,cards:target.getCards('he')}; - else target.chooseCard('he',true,[num,Infinity]).set('ai',get.unuseful).set('prompt','交给'+get.translation(player)+'至少'+get.cnNumber(num)+'张牌'); + else{ + var cards=trigger.cards.filterInD('oe'); + target.chooseCard('he',num>0,[num,Infinity]).set('ai',get.unuseful).set('prompt',num>0? + '是否交给'+get.translation(player)+'任意张牌'+(cards.length?'并获得'+get.translation(cards):'')+'?': + '交给'+get.translation(player)+'至少'+get.cnNumber(num)+'张牌'); + } }else event.finish(); 'step 2' if(result.bool){ @@ -1483,6 +1458,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.give(cards,player); game.delayx(); } + else event.finish(); 'step 3' if(trigger.cards.filterInD().length) target.gain(trigger.cards.filterInD(),'gain2','bySelf'); else if(trigger.cards.filterInD('e').length) target.gain(trigger.cards.filterInD('e'),get.owner(trigger.cards.filterInD('e')[0]),'give'); @@ -1955,25 +1931,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } if(player.actionHistory[i].isRound) break; } - return event.targets&&event.targets.length==1&&(!event.targets[0].isLinked()|| - player.getCards('h',card=>get.suit(card)==get.suit(event.card)).filter(card=>{ - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - if(mod!='unchanged') return true; - return false; - }).length==0); + return event.targets&&event.targets.length==1&&!event.targets[0].isLinked()|| + player.hasCard(card=>get.suit(card)==get.suit(event.card)&&player.canRecast(card),'h'); }, content:function(){ - 'step 0' if(trigger.targets&&trigger.targets.length==1){ trigger.targets[0].link(true); } - var cards=player.getCards('h',card=>get.suit(card)==get.suit(trigger.card)); - if(cards.length>0){ - player.loseToDiscardpile(cards); - player.draw(cards.length); - } - 'step 1' - player.draw(); + var cards=player.getCards('h',card=>get.suit(card)==get.suit(trigger.card)&&player.canRecast(card)); + if(cards.length>0) player.recast(cards); } }, clanhuanyin:{ @@ -2361,14 +2327,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clanbolong:'驳龙', clanbolong_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.你交给其一张牌,然后视为对其使用一张雷【杀】;2.交给你等同于你手牌数的牌,然后视为对你使用一张【酒】。', clanzhongliu:'中流', - clanzhongliu_info:'宗族技,锁定技。当你使用牌时,若此牌对应的实体牌不全为同族角色的手牌,你重置武将牌上的技能。', + clanzhongliu_info:'宗族技,锁定技。当你使用牌时,若此牌对应的实体牌均不为太原王氏角色的手牌,你重置武将牌上的技能。', clan_zhongyan:'族钟琰', clanguangu:'观骨', clanguangu_info:'转换技,出牌阶段限一次。阴:你可以观看牌堆顶的至多四张牌;阳:你可以观看一名角色的至多四张手牌。然后你可以使用其中的一张牌。', clanxiaoyong:'啸咏', clanxiaoyong_info:'锁定技。当你于回合内首次使用字数为X的牌时,你重置〖观骨〗(X为你上次发动〖观骨〗观看的牌数)。', clanbaozu:'保族', - clanbaozu_info:'宗族技,限定技。当一名同族角色进入濒死状态时,你可以令其横置并回复1点体力。', + clanbaozu_info:'宗族技,限定技。当一名颍川钟氏角色进入濒死状态时,你可以令其横置并回复1点体力。', clan_wangyun:'族王允', clanjiexuan:'解悬', clanjiexuan_info:'限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。', diff --git a/character/collab.js b/character/collab.js index 22921c374..5de2d131d 100644 --- a/character/collab.js +++ b/character/collab.js @@ -4,6 +4,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'collab', connect:true, character:{ + dc_caocao:['male','wei',4,['dcjianxiong']], + dc_liubei:['male','shu',4,['dcrende']], + dc_sunquan:['male','wu',4,['dczhiheng']], zhutiexiong:['male','qun',3,['dcbianzhuang']], wu_zhutiexiong:['male','qun',3,['dcbianzhuang'],['unseen']], xiaoyuehankehan:['male','qun',3,['dctongliao','dcwudao']], @@ -30,9 +33,227 @@ game.import('character',function(lib,game,ui,get,ai,_status){ collab_tongque:["sp_fuwan","sp_fuhuanghou","sp_jiben","old_lingju",'sp_mushun'], collab_duanwu:['sunwukong','longwang','taoshen'], collab_decade:['libai','xiaoyuehankehan','zhutiexiong','wu_zhutiexiong'], + collab_remake:['dc_caocao','dc_liubei','dc_sunquan'], }, }, skill:{ + //隅泣曹操 + dcjianxiong:{ + audio:'rejianxiong', + trigger:{ + player:'damageEnd', + }, + content:function (){ + 'step 0' + if(get.itemtype(trigger.cards)=='cards'&&get.position(trigger.cards[0],true)=='o'){ + player.gain(trigger.cards,'gain2'); + } + player.draw(player.countMark('dcjianxiong')+1,'nodelay'); + 'step 1' + if(player.countMark('dcjianxiong')<4) player.addMark('dcjianxiong',1,false); + }, + marktext:'雄', + intro:{ + markcount:function(storage,player){ + return player.countMark('dcjianxiong')+1; + }, + content:function(storage,player){ + return '摸牌数为'+(player.countMark('dcjianxiong')+1); + }, + }, + ai:{ + maixie:true, + maixie_hp:true, + effect:{ + target:function (card,player,target){ + if(player.hasSkillTag('jueqing',false,target)) return [1,-1]; + if(get.tag(card,'damage')&&player!=target){ + var cards=card.cards,evt=_status.event; + if(evt.player==target&&card.name=='damage'&&evt.getParent().type=='card') cards=evt.getParent().cards.filterInD(); + if(target.hp<=1) return; + if(get.itemtype(cards)!='cards') return; + for(var i of cards){ + if(get.name(i,target)=='tao') return [1,5+player.countMark('dcjianxiong')/2]; + } + if(get.value(cards,target)>=(7-player.countMark('dcjianxiong')/2+target.getDamagedHp())) return [1,3+player.countMark('dcjianxiong')/2]; + return [1,0.6+player.countMark('dcjianxiong')/2]; + } + }, + }, + }, + }, + //缺德刘备 + dcrende:{ + audio:'rerende', + enable:'phaseUse', + filter:function(event,player){ + return game.hasPlayer(current=>{ + return lib.skill.dcrende.filterTarget(null,player,current); + }); + }, + discard:false, + lose:false, + delay:false, + filterTarget:function(card,player,target){ + if(player.getStorage('dcrende_targeted').contains(target)) return false; + return player!=target&&target.countGainableCards(player,'h')>1; + }, + content:function(){ + 'step 0' + player.addTempSkill('dcrende_targeted','phaseUseAfter'); + player.markAuto('dcrende_targeted',[target]); + player.gainPlayerCard(target,'h',true,2); + 'step 1' + var list=[]; + for(var name of lib.inpile){ + if(get.type(name)!='basic') continue; + var card={name:name,isCard:true}; + if(lib.filter.cardUsable(card,player,event.getParent('chooseToUse'))&&game.hasPlayer(current=>{ + return player.canUse(card,current); + })){ + list.push(['基本','',name]); + } + if(name=='sha'){ + for(var nature of lib.inpile_nature){ + card.nature=nature; + if(lib.filter.cardUsable(card,player,event.getParent('chooseToUse'))&&game.hasPlayer(current=>{ + return player.canUse(card,current); + })){ + list.push(['基本','',name,nature]); + } + } + } + } + if(list.length){ + player.chooseButton(['是否视为使用一张基本牌?',[list,'vcard']]).set('ai',function(button){ + var player=_status.event.player; + var card={name:button.link[2],nature:button.link[3],isCard:true}; + if(card.name=='tao'){ + if(player.hp==1||(player.hp==2&&!player.hasShan())||player.needsToDiscard()){ + return 5; + } + return 1; + } + if(card.name=='sha'){ + if(game.hasPlayer(function(current){ + return player.canUse(card,current)&&get.effect(current,card,player,player)>0 + })){ + if(card.nature=='fire') return 2.95; + if(card.nature=='thunder'||card.nature=='ice') return 2.92; + return 2.9; + } + return 0; + } + if(card.name=='jiu'){ + return 0.5; + } + return 0; + }); + } + else{ + event.finish(); + } + 'step 2' + if(result&&result.bool&&result.links[0]){ + var card={name:result.links[0][2],nature:result.links[0][3],isCard:true}; + player.chooseUseTarget(card,true); + } + }, + subSkill:{ + targeted:{ + onremove:true, + charlotte:true, + }, + }, + ai:{ + fireAttack:true, + order:function(skill,player){ + return 10; + }, + result:{ + target:function(player,target){ + if(target.hasSkillTag('noh')) return -0.1; + return -2; + } + }, + threaten:3, + }, + }, + //会玩孙权 + dczhiheng:{ + audio:'rezhiheng', + enable:'phaseUse', + position:'he', + filterCard:lib.filter.cardDiscardable, + discard:false, + lose:false, + delay:false, + selectCard:[1,Infinity], + filter:function(event,player){ + var skill=player.getStat().skill; + return !skill.dczhiheng||skill.dczhiheng<1+player.getStorage('dczhiheng_hit').length; + }, + check:function(card){ + var player=_status.event.player; + if(get.position(card)=='h'&&!player.countCards('h','du')&&(player.hp>2||!player.countCards('h',function(card){ + return get.value(card)>=8; + }))){ + return 1; + } + return 6-get.value(card) + }, + group:'dczhiheng_add', + content:function(){ + 'step 0' + player.discard(cards); + event.num=1; + var hs=player.getCards('h'); + if(!hs.length) event.num=0; + for(var i=0;igame.cardsDiscard(cards).cards); } 'step 4' for(var card of cards){ diff --git a/character/diy.js b/character/diy.js index cc7234575..cc31e6c90 100755 --- a/character/diy.js +++ b/character/diy.js @@ -4919,34 +4919,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:"phaseUse", position:'he', - filter:function(event,player){ - return player.countCards('he',{type:'equip'})>0; - }, - filterCard:function(card){ - return get.type(card)=='equip'; - }, + filter:(event,player)=>player.hasCard(card=>lib.skill.chihaya_huairou.filterCard(card,player),lib.skill.chihaya_huairou.position), + filterCard:(card,player)=>get.type(card)=='equip'&&player.canRecast(card), check:function(card){ if(!_status.event.player.hasEquipableSlot(get.subtype(card))) return 5; return 3-get.value(card); }, content:function(){ - player.draw(); + player.recast(cards); }, discard:false, - visible:true, - loseTo:'discardPile', + lose:false, + delay:false, prompt:"将一张装备牌置入弃牌堆并摸一张牌", - delay:0.5, - prepare:function(cards,player){ - player.$throw(cards,1000); - game.log(player,'将',cards,'置入了弃牌堆'); - }, ai:{ order:10, result:{ - player:1, - }, - }, + player:1 + } + } }, chihaya_youfeng:{ enable:'chooseToUse', @@ -6035,12 +6026,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseDiscardBegin'}, forced:true, filter:function(event,player){ - return (player.isDamaged()||player.countCards('h')-player.hp>1); + return (player.getDamagedHp()>1||player.countCards('h')-player.getHp()>1); }, content:function(){ var num=0; - if(player.isDamaged()) num++; - if(player.countCards('h')-player.hp>1) num++; + if(player.getDamagedHp()>1) num++; + if(player.countCards('h')-player.getHp()>1) num++; player.addMark('kotori_qunxin_temp',num,false); player.addTempSkill('kotori_qunxin_temp','phaseDiscardEnd'); }, @@ -6472,6 +6463,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ group:'abyusa_jueqing_rewrite', subSkill:{ rewrite:{ + audio:'abyusa_jueqing', trigger:{source:'damageBefore'}, forced:true, charlotte:true, @@ -6518,6 +6510,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, abyusa_dunying:{ + audio:2, trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, forced:true, filter:function(event,player){ @@ -7414,6 +7407,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, shiorimiyuki_banyin:{ + audio:2, trigger:{player:['damageEnd','recoverEnd']}, direct:true, filter:function(event,player){ @@ -7436,6 +7430,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, shiorimiyuki_tingxian:{ + audio:2, trigger:{player:'phaseUseBegin'}, direct:true, content:function(){ @@ -7449,14 +7444,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); 'step 1' if(result.control=='cancel2') return; - player.logSkill('shiorimiyuki_tingxian'); + player.logSkill('shiorimiyuki_tingxian1'); var num=1+result.index; player.draw(num).gaintag=['shiorimiyuki_tingxian']; player.recover(); player.addTempSkill('shiorimiyuki_tingxian2'); }, + group:'shiorimiyuki_tingxian1', }, + shiorimiyuki_tingxian1:{audio:true}, shiorimiyuki_tingxian2:{ + audio:true, trigger:{player:'phaseUseEnd'}, forced:true, charlotte:true, @@ -7977,6 +7975,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, kanade_mapo:{ + audio:2, derivation:'mapodoufu', enable:'chooseToUse', viewAs:{name:'mapodoufu'}, @@ -7999,6 +7998,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, kanade_benzhan:{ + audio:3, trigger:{global:['useCard','respond']}, direct:true, usable:1, @@ -8693,6 +8693,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{expose:0.2}, }, noda_fengcheng:{ + audio:2, trigger:{ player:"gainAfter", }, @@ -8709,6 +8710,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, noda_xunxin:{ + audio:2, enable:'phaseUse', viewAs:{name:'juedou'}, filter:function(event,player){ @@ -8740,6 +8742,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, hinata_qiulve:{ + audio:2, enable:['chooseToUse','chooseToRespond'], viewAsFilter:function(player){ return player.countCards('hes',function(card){ @@ -8790,6 +8793,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, hinata_ehou:{ + audio:2, trigger:{global:'useCardAfter'}, direct:true, filter:function(event,player){ @@ -8816,6 +8820,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, hisako_yinbao:{ + audio:2, trigger:{player:['damageEnd','recoverAfter']}, content:function(){ 'step 0' @@ -9464,6 +9469,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, shiina_qingshen:{ + audio:1, trigger:{ player:'damageEnd', source:'damageSource', @@ -9510,6 +9516,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, shiina_feiyan:{ + audio:1, animalList:['key_inari','key_doruji'], trigger:{global:'phaseBegin'}, direct:true, @@ -9543,6 +9550,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, shiina_retieji:{ + audio:1, shaRelated:true, trigger:{player:'useCardToPlayered'}, check:function(event,player){ @@ -10927,7 +10935,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, yuri_xingdong:{ - audio:2, + audio:3, group:'yuri_xingdong_gain', subSkill:{ mark:{ @@ -10938,6 +10946,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, gain:{ + audio:2, trigger:{player:'phaseUseBegin'}, forced:true, content:function(){ @@ -11011,6 +11020,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, yuri_wangxi:{ + audio:2, trigger:{global:'dieAfter'}, direct:true, limited:true, @@ -16569,11 +16579,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, diyjuntun:{ enable:'phaseUse', - filter:function(event,player){ - return player.countCards('he',{type:'equip'})>0; - }, + filter:(event,player)=>player.hasCard(card=>lib.skill.diyjuntun.filterCard(card,player),'he'), position:'he', - filterCard:{type:'equip'}, + filterCard:(card,player)=>get.type(card)=='equip'&&player.canRecast(card), check:function(card){ var player=_status.event.player; var he=player.getCards('he'); @@ -16590,23 +16598,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 0; }, content:function(){ - player.draw(); + player.recast(cards); }, discard:false, + lose:false, + delay:false, prompt:'将一张装备牌置入弃牌堆并摸一张牌', - delay:0.5, - loseTo:'discardPile', - prepare:function(cards,player){ - player.$throw(cards,1000); - game.log(player,'将',cards,'置入了弃牌堆'); - }, ai:{ basic:{ order:8.5 }, result:{ - player:1, - }, + player:1 + } } }, choudu:{ diff --git a/character/extra.js b/character/extra.js index 2c0dc1e4f..d6246f22b 100755 --- a/character/extra.js +++ b/character/extra.js @@ -207,6 +207,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } str+='此牌离开你的装备区后,改为置入剩余武将牌牌堆。'; lib.translate['qiexie_'+name+'_info']=str; + var append=''; + if(skills.length){ + for(var skill of skills){ + if(lib.skill[skill].nobracket){ + append+='
'+get.translation(skill)+'
'+get.skillInfoTranslation(skill)+'


'; + } + else{ + var translation=lib.translate[skill+'_ab']||get.translation(skill).slice(0,2); + append+='
【'+translation+'】
'+get.skillInfoTranslation(skill)+'


'; + } + } + str=str.slice(0,str.length-8); + } + lib.translate['qiexie_'+name+'_append']=append; lib.card['qiexie_'+name]=card; } }, @@ -260,7 +274,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ cuijue:{ enable:'phaseUse', filter:function(event,player){ - return player.countCards('he')>0&&game.hasPlayer(target=>lib.skill.cuijue.filterTarget('SB',player,target)); + return player.countCards('he')>0;//&&game.hasPlayer(target=>lib.skill.cuijue.filterTarget('SB',player,target)); }, filterCard:true, filterTarget:function(card,player,target){ @@ -2921,22 +2935,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, tspowei:{ - audio:2, + audio:3, dutySkill:true, - forced:true, - trigger:{global:'damageEnd'}, - logTarget:'player', - filter:function(event,player){ - return event.player&&event.player.isIn()&&event.player.hasMark('dulie'); - }, - content:function(){ - trigger.player.removeMark('dulie',trigger.player.countMark('dulie')); - }, + locked:true, derivation:'shenzhu', - group:['tspowei_init','tspowei_move','tspowei_achieve','tspowei_fail','tspowei_use'], + group:['tspowei_init','tspowei_move','tspowei_achieve','tspowei_fail','tspowei_use','tspowei_remove'], subSkill:{ + remove:{ + audio:'tspowei3', + trigger:{global:'damageEnd'}, + filter:function(event,player){ + return event.player&&event.player.isIn()&&event.player.hasMark('dulie'); + }, + forced:true, + logTarget:'player', + content:function(){ + trigger.player.removeMark('dulie',trigger.player.countMark('dulie')); + }, + }, use:{ - audio:'tspowei', + audio:'tspowei3', trigger:{global:'phaseBegin'}, direct:true, filter:function(event,player){ @@ -2990,7 +3008,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, init:{ - audio:'tspowei', + audio:'tspowei3', trigger:{ global:'phaseBefore', player:'enterGame', @@ -3008,7 +3026,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, move:{ - audio:'tspowei', + audio:'tspowei3', trigger:{player:'phaseBegin'}, forced:true, filter:function(event,player){ @@ -3064,6 +3082,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, tspowei1:{audio:true}, tspowei2:{audio:true}, + tspowei3:{audio:true}, shenzhu:{ audio:2, trigger:{player:'useCardAfter'}, @@ -4730,7 +4749,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'renjie2', trigger:{player:'damageEnd'}, forced:true, - unique:true, group:'renjie2', notemp:true, //mark:true, @@ -6551,7 +6569,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, filter:function(event,player){ - return event.targets&&event.targets.contains(player)&&event.turn!=player&&player.storage.disableEquip!=undefined&&player.storage.disableEquip.length>0; + return event.targets&&event.targets.contains(player)&&event.turn!=player&&player.hasDisabledSlot(); }, content:function(){ player.chooseToEnable(); @@ -6564,7 +6582,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, filter:function(event,player){ - return event.turn!=player&&player.storage.disableEquip!=undefined&&player.storage.disableEquip.length>0; + return event.turn!=player&&player.hasDisabledSlot(); }, content:function(){ player.chooseToEnable(); @@ -6577,7 +6595,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, filter:function(event,player){ - return event.result.bool==true&&player.storage.disableEquip!=undefined&&player.storage.disableEquip.length>0; + return event.result.bool==true&&player.hasDisabledSlot(); }, content:function(){ 'step 0' @@ -6591,7 +6609,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, filter:function(event,player){ - return (event.targets!=undefined&&event.targets.contains(player)||event.target==player)&&event.result.bool==false&&player.storage.disableEquip!=undefined&&player.storage.disableEquip.length>0; + return (event.targets!=undefined&&event.targets.contains(player)||event.target==player)&&event.result.bool==false&&player.hasDisabledSlot(); }, content:function(){ player.chooseToEnable(); @@ -6604,7 +6622,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, filter:function(event,player){ - return player.storage.disableEquip!=undefined&&player.storage.disableEquip.length>0; + return player.hasDisabledSlot(); }, content:function(){ player.chooseToEnable(); diff --git a/character/gwent.js b/character/gwent.js index 9c065f3bc..6dfd606f3 100644 --- a/character/gwent.js +++ b/character/gwent.js @@ -484,12 +484,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - var hs=player.getCards('h'); - event.num=hs.length; - player.lose(hs,ui.discardPile); + player.recast(player.getCards('h',lib.filter.cardRecastable)); 'step 1' - player.draw(event.num,'nodelay'); - 'step 2' var targets=player.getEnemies(); if(targets.length){ player.useCard({name:'sha'},targets.randomGet(),false); @@ -1376,29 +1372,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yangfan:{ trigger:{player:'useCard'}, forced:true, - filter:function(event,player){ - return get.type(event.card)!='equip'&&player.countCards('h',{color:get.color(event.card)})>0; - }, + filter:(event,player)=>get.type(event.card)!='equip'&&player.hasCard(card=>get.color(card)==get.color(trigger.card)&&player.canRecast(card),'h'), content:function(){ 'step 0' - var cards=player.getCards('h',{suit:get.suit(trigger.card)}); - if(!cards.length){ - cards=player.getCards('h',{color:get.color(trigger.card)}); - } + let cards=player.getCards('h',card=>get.suit(card)==get.suit(trigger.card)&&player.canRecast(card)); + if(!cards.length) cards=player.getCards('h',card=>get.color(card)==get.color(trigger.card)&&player.canRecast(card)); if(!cards.length){ event.finish(); return; } - event.chosen=cards.randomGet(); - game.delay(0.5) - 'step 1' - var card=event.chosen; - player.lose(card,ui.discardPile); - player.$throw(card,1000); - game.delay(0.5); - game.log(player,'重铸了',card); - 'step 2' - player.draw().log=false; + player.recast(cards.randomGet()); }, ai:{ pretao:true diff --git a/character/hearth.js b/character/hearth.js index 50f565e06..dc6a64cac 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -8466,27 +8466,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:true, content:function(){ 'step 0' - target.chooseCard('h',true,'重铸一张手牌'); + target.chooseCard('h',true,'重铸一张手牌',lib.filter.cardRecastable); 'step 1' if(result.bool&&result.cards.length){ - target.$throw(result.cards); - target.lose(result.cards,ui.discardPile); - var type=get.type(result.cards[0],'trick'); - var name=result.cards[0].name; - var card2=get.cardPile(function(card){ - return get.type(card,'trick')==type&&card.name!=name; - }); - if(!card2){ - card2=get.cardPile(function(card){ - return get.type(card,'trick')==type; + target.recast(result.cards,null,(player,cards)=>{ + var type=get.type(result.cards[0],'trick'); + var name=result.cards[0].name; + var card2=get.cardPile(function(card){ + return get.type(card,'trick')==type&&card.name!=name; }); - } - if(card2){ - target.gain(card2,'draw'); - } - else{ - target.draw(); - } + if(!card2){ + card2=get.cardPile(function(card){ + return get.type(card,'trick')==type; + }); + } + if(card2){ + target.gain(card2,'draw'); + } + else{ + target.draw().log=false; + } + }); var clone=game.createCard(card); player.gain(clone,'gain2'); clone.classList.add('glow'); diff --git a/character/huicui.js b/character/huicui.js index 349e1911d..217bb55ea 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -7,7 +7,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dc_wuban:['male','shu',4,['dcyouzhan'],['clan:陈留吴氏','unseen']], yue_caiwenji:['female','qun',3,['dcshuangjia','dcbeifen']], liuchongluojun:['male','qun',3,['dcminze','dcjini']], - yuechen:['male','wei',4,['dcporui','dcgonghu'],['unseen']], + yuechen:['male','wei',4,['dcporui','dcgonghu']], zhangkai:['male','qun',4,['dcxiangshu']], gaoxiang:['male','shu',4,['dcchiying'],['unseen']], yuanyin:['male','qun',3,['dcmoshou','dcyunjiu'],['unseen']], @@ -571,10 +571,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseCard(get.prompt2('dcjini'),[1,player.maxHp-player.countMark('dcjini_counted')],(card,player,target)=>{ - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - return mod=='unchanged'; - }).set('ai',card=>{ + player.chooseCard(get.prompt2('dcjini'),[1,player.maxHp-player.countMark('dcjini_counted')],lib.filter.cardRecastable).set('ai',card=>{ return 6-get.value(card); }); 'step 1' @@ -583,26 +580,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.logSkill('dcjini'); player.addTempSkill('dcjini_counted'); player.addMark('dcjini_counted',cards.length,false); - player.loseToDiscardpile(cards); - player.draw(cards.length); + event.recast=player.recast(cards); } else event.finish(); 'step 2' - if(trigger.source&&trigger.source.isIn()&&Array.isArray(result)){ - for(var i of result){ - if(get.name(i,player)=='sha'&&get.owner(i)==player&&get.position(i)=='h'){ - player.chooseToUse(function(card,player,event){ - if(get.name(card)!='sha') return false; - return lib.filter.filterCard.apply(this,arguments); - },'击逆:是否对'+get.translation(trigger.source)+'使用一张不可被响应的杀?').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',trigger.source).set('oncard',()=>{ - _status.event.directHit.addArray(game.players); - }); - break; - } - } + if(trigger.source&&trigger.source.isIn()&&player.hasHistory('gain',evt=>evt.getParent(2)==event.recast&&evt.cards.some(value=>get.name(value)=='sha'))){ + player.chooseToUse(function(card){ + if(get.name(card)!='sha') return false; + return lib.filter.filterCard.apply(this,arguments); + },'击逆:是否对'+get.translation(trigger.source)+'使用一张不可被响应的杀?').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',trigger.source).set('oncard',()=>{ + _status.event.directHit.addArray(game.players); + }); } }, subSkill:{ @@ -618,10 +609,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:'phaseJieshuBegin'}, filter:function(event,player){ if(player==event.player) return false; - if(player.hasSkill('dcporui_round')) return false; + if(player.countMark('dcporui_round')>=(player.hasMark('dcgonghu_basic')?2:1)||player.countCards('h')==0) return false; return game.hasPlayer(current=>{ if(current==player||current==event.player) return false; - return current.getHistory('lose').length>0; + return current.hasHistory('lose',function(evt){ + return evt.cards.length>0; + }); })&&(_status.connectMode||player.hasCard({type:'basic'},'h')); }, direct:true, @@ -631,23 +624,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ prompt:get.prompt('dcporui'), //prompt2:'弃置一张基本牌并选择一名本回合失去过牌的非当前回合的其他角色,你视为对其依次使用'+get.cnNumber(Math.max(0,player.hp)+1)+'张【杀】', prompt2:get.skillInfoTranslation('dcporui',player), - filterCard:function(card,player){ - if(get.type(card)!='basic') return false; - return lib.filter.cardDiscardable.apply(this,arguments); - }, + filterCard:lib.filter.cardDiscardable, selectCard:1, - targets:game.filterPlayer(current=>{ + position:'he', + list:game.filterPlayer(current=>{ if(current==player||current==trigger.player) return false; - return current.getHistory('lose').length>0; + return current.hasHistory('lose',function(evt){ + return evt.cards.length>0; + }); }), filterTarget:function(card,player,target){ - return _status.event.targets.contains(target); + return _status.event.list.map(i=>i[0]).contains(target); }, ai1:function(card){ return 7-get.value(card); }, ai2:function(target){ - return get.effect(target,{name:'sha'},_status.event.player,_status.event.player); + return get.effect(target,{name:'sha'},_status.event.player,_status.event.player)*_status.event.list.find(i=>{ + return i[0]==target; + })[1]; } }); 'step 1' @@ -656,9 +651,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.target=target; player.logSkill('dcporui',target); player.discard(cards); - event.num2=Math.max(0,player.hp); + event.num2=Math.min(5,target.getHistory('lose').reduce(function(num,evt){ + return num=evt.cards2.length; + },0)); event.num=event.num2+1; player.addTempSkill('dcporui_round','roundStart'); + player.addMark('dcporui_round',1,false); } else event.finish(); 'step 2' @@ -677,11 +675,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else if(cards.length<=event.num2) event._result={bool:true,cards:cards}; else player.chooseCard('破锐:交给'+get.translation(target)+get.cnNumber(event.num2)+'张手牌',true,event.num2); } - else event.goto(6) + else event.finish(); 'step 5' if(result.bool){ player.give(result.cards,target); } + event.finish(); 'step 6' if(player.hasMark('dcgonghu_basic')){ if(!target.hasHistory('damage',evt=>{ @@ -692,11 +691,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, subSkill:{ - round:{charlotte:true} + round:{charlotte:true,onremove:true} }, ai:{ expose:0.4, - threaten:4.8 + threaten:3.8, } }, dcgonghu:{ @@ -708,13 +707,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, filter:function(event,player){ + if(!_status.currentPhase||_status.currentPhase==player) return false; if(event.name=='damage'){ if(player.hasMark('dcgonghu_damage')) return false; - return _status.currentPhase&&_status.currentPhase!=player; + var num=0; + player.getHistory('damage',evt=>num+=evt.num); + player.getHistory('sourceDamage',evt=>num+=evt.num); + return num>1; } if(player.hasMark('dcgonghu_basic')) return false; + if(_status.currentPhase&&_status.currentPhase==player) return false; var evt=event.getl(player); - return evt&&evt.cards2&&evt.cards2.some(i=>get.type2(i,player)=='basic'); + if(!evt||!evt.cards2||!evt.cards2.some(i=>get.type2(i,player)=='basic')) return false; + var num=0; + player.getHistory('lose',function(evtx){ + if(num<2){ + if(evtx&&evtx.cards2) num+=evtx.cards2.filter(i=>get.type2(i,player)=='basic').length; + } + }); + return num>=2; }, group:['dcgonghu_basic','dcgonghu_trick'], content:function(){ @@ -2538,10 +2549,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' var str=',若重铸的牌中没有'+get.translation(get.type2(trigger.card))+'牌,你于'+get.translation(trigger.cards)+'进入弃牌堆后获得之'; - player.chooseCard(get.prompt('dcqianzheng'),'重铸两张牌'+(trigger.cards.length?str:'')+'。',2,'he',(card,player,target)=>{ - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - return mod=='unchanged'; - }).set('ai',card=>{ + player.chooseCard(get.prompt('dcqianzheng'),'重铸两张牌'+(trigger.cards.length?str:'')+'。',2,'he',lib.filter.cardRecastable).set('ai',card=>{ var val=get.value(card); if(get.type2(card)==_status.event.type) val+=0.5; return 6-val; @@ -2550,8 +2558,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ var cards=result.cards; player.logSkill('dcqianzheng'); - player.loseToDiscardpile(cards); - player.draw(cards.length); + player.recast(cards); if(cards.every(card=>get.type2(card)!=get.type2(trigger.card))){ trigger.getParent().dcqianzheng=true; player.addTempSkill('dcqianzheng_gain'); @@ -3248,7 +3255,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(bool1) val+=5; if(bool2){ if(bool1) target.maxHp++; - val+=get.recoverEffect(target,player,player); + val+=Math.max(0,get.recoverEffect(target,player,player)); if(bool1) target.maxHp--; } if(bool3){ @@ -3460,7 +3467,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{ source:'damageBegin1', }, - usable:2, + //usable:2, filter:function(event,player){ return player.countDiscardableCards(player,'he')>0&&player!=event.player; }, @@ -3790,21 +3797,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.choosePlayerCard(target,'he',true).set('filterButton',function(button){ - var player=_status.event.player,card=button.link; - if(get.owner(card)==player){ - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - if(mod!='unchanged') return mod; - } - return true; + var card=button.link,owner=get.owner(card); + return !owner||owner.canRecast(card,_status.event.player); }).set('ai',function(card){ if(get.attitude(_status.event.player,_status.event.getParent().target)>=0) return -get.buttonValue(card); return get.buttonValue(card); }); 'step 1' - if(result.bool){ - target.loseToDiscardpile(result.links); - target.draw(); - } + if(result.bool) target.recast(result.links); }, ai:{ expose:0.1, @@ -4816,7 +4816,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return '恢复一个装备栏或判定区并获得〖活墨〗'; } var numc=get.cnNumber(links.length); - return '废除'+numc+'个装备栏或判定区并令一名角色摸'+numc+'张牌'; + return '废除'+numc+'个区域并令一名角色摸'+numc+'张牌'; }, }, derivation:'huomo', @@ -6855,9 +6855,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 6' if(event.goon1&&event.goon2){ if(player.countMark('chenjian')<2) player.addMark('chenjian',1,false); - var cards=player.getCards('h'); - player.loseToDiscardpile(cards); - player.draw(cards.length); + player.recast(player.getCards('h',lib.filter.cardRecastable)); } }, marktext:'见', @@ -9817,15 +9815,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return str; }, dcporui:function(player){ - return '每轮限一次。其他角色的结束阶段,你可以弃置一张基本牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】'+(player.hasMark('dcgonghu_damage')?'':',然后你交给其X张手牌')+'(X为你的体力值)。'+(player.hasMark('dcgonghu_basic')?'若其没有因此受到伤害,你回复1点体力。':''); + return '每轮限'+(player.hasMark('dcgonghu_basic')?'两':'一')+'次。其他角色的结束阶段,你可以弃置一张基本牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】'+(player.hasMark('dcgonghu_damage')?'':',然后你交给其X张手牌')+'(X为其本回合失去的牌数且至多为5)。'; }, }, perfectPair:{}, characterReplace:{ dongbai:['re_dongbai','dongbai','jsrg_dongbai'], - chunyuqiong:['chunyuqiong','re_chunyuqiong'], + chunyuqiong:['chunyuqiong','re_chunyuqiong','jsrg_chunyuqiong'], kanze:['re_kanze','kanze'], - chendeng:['ol_chendeng','re_chendeng','chendeng'], + chendeng:['ol_chendeng','re_chendeng','chendeng','jsrg_chendeng'], miheng:['miheng','re_miheng'], liuba:['ol_liuba','dc_liuba','liuba'], lvkuanglvxiang:['lvkuanglvxiang','dc_lvkuanglvxiang'], @@ -10100,7 +10098,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dccuijin_info:'当你或你攻击范围内的角色使用【杀】时,你可以弃置一张牌,令此【杀】的伤害基数+1。然后当此杀被目标角色抵消或无效或防止伤害后,你摸一张牌,对使用者造成1点伤害。', panghui:'庞会', dcyiyong:'异勇', - dcyiyong_info:'每回合限两次。当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。', + dcyiyong_info:'当你对其他角色造成伤害时,若你有牌,你可以与其同时弃置至少一张牌。若你以此法弃置的牌的点数之和:不大于其,你摸X张牌;不小于其,此伤害+1(X为其以此法弃置的牌数)。', chenjiao:'陈矫', dcxieshoux:'协守/清严', dcxieshou:'协守', @@ -10122,7 +10120,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liupi:'刘辟', dcjuying:'踞营', dcjuying_info:'出牌阶段结束时,若你于此阶段内使用【杀】的次数未达到上限,你可以选择任意项:1.下回合使用【杀】的次数上限+1;2.本回合手牌上限+2;3.摸三张牌。若你选择的项数超过了你的体力值,你弃置X张牌(X为你选择的项数减你的体力值)。', - dc_huanghao:'黄皓', + dc_huanghao:'新杀黄皓', + dc_huanghao_ab:'黄皓', dcqinqing:'寝情', dcqinqing_info:'结束阶段,你可以弃置一名攻击范围内包含一号位的其他角色一张牌。然后若其手牌数大于一号位,你摸一张牌。', dccunwei:'存畏', @@ -10161,7 +10160,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yuantanyuanxiyuanshang:'袁谭袁尚袁熙', dcneifa:'内伐', dcneifa_info:'出牌阶段开始时,你可以摸三张牌,然后弃置一张牌。若你弃置的牌类型为:基本牌,本阶段你不能使用锦囊牌,且【杀】的使用次数上限+X且可以额外指定一名目标;锦囊牌,本阶段你不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标(X为你发动〖内伐〗弃牌后手牌中因〖内伐〗而不能使用的牌的数量且最多为5。你以此法选择的额外目标均无距离限制)。', - dc_sunziliufang:'孙资刘放', + dc_sunziliufang:'新杀孙资刘放', dcqinshen:'勤慎', dcqinshen_info:'弃牌阶段结束时,你可以摸X张牌(X为本回合未进入过弃牌堆的花色数)。', dcweidang:'伪谠', @@ -10192,7 +10191,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcqinghuang_info:'出牌阶段开始时,你可以减1点体力上限,然后你于本回合发动〖踏寂〗时额外随机执行一种效果。', dc_huojun:'霍峻', dcgue:'孤扼', - dcgue_info:'每名其他角色的回合限一次。当你需要使用或打出【杀】或【闪】时,若你有手牌,你可以展示之。若其中【杀】和【闪】的数量之和不超过1,你视为使用或打出此牌。', + dcgue_info:'每回合限一次。当你需要使用或打出【杀】或【闪】时,若你有手牌,你可以展示之。若其中【杀】和【闪】的数量之和不超过1,你视为使用或打出此牌。', dcsigong:'伺攻', dcsigong_info:'其他角色的回合结束时,若其于本回合内使用牌被响应过,你可以将手牌摸至或弃置至1,视为对其使用一张需使用X张【闪】抵消的【杀】,且此【杀】的伤害基数+1(X为你以此法弃置的牌数且至少为1)。当你以此法造成伤害后,该技能于本轮失效。', peiyuanshao:'裴元绍', @@ -10236,9 +10235,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcjini_info:'当你受到伤害后,你可以重铸至多Y张手牌(Y为你的体力上限减本回合你以此法重铸过的牌数)。若你以此法获得了【杀】,你可以对伤害来源使用一张无视距离且不可被响应的【杀】。', yuechen:'乐綝', dcporui:'破锐', - dcporui_info:'每轮限一次。其他角色的结束阶段,你可以弃置一张基本牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】,然后你交给其X张手牌(X为你的体力值)。', + dcporui_info:'每轮限一次。其他角色的结束阶段,你可以弃置一张基本牌并选择另一名于此回合内失去过牌的其他角色,你视为对其依次使用X+1张【杀】,然后你交给其X张手牌(X为其本回合失去的牌数且至多为5)。', dcgonghu:'共护', - dcgonghu_info:'锁定技。①当你于回合外失去基本牌后,你于〖破锐〗后增加“若其没有因此受到伤害,你回复1点体力”。②当你于回合外造成或受到伤害后,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。', + dcgonghu_info:'锁定技。①当你于回合外失去基本牌后,若你本回合内失去基本牌的数量大于1,你将〖破锐〗改为每轮限两次。②当你于回合外造成或受到伤害后,若你本回合内造成或受到的伤害大于1,你删除〖破锐〗中的“,然后你交给其X张手牌”。③当你使用红色基本牌/红色普通锦囊牌时,若你已发动过〖共护①〗和〖共护②〗,则此牌不可被响应/可额外增加一个目标。', yue_caiwenji:'乐蔡琰', dcshuangjia:'霜笳', dcshuangjia_tag:'胡笳', diff --git a/character/jsrg.js b/character/jsrg.js new file mode 100644 index 000000000..03b69f47a --- /dev/null +++ b/character/jsrg.js @@ -0,0 +1,4276 @@ +'use strict'; +game.import('character',function(lib,game,ui,get,ai,_status){ + return { + name:'jsrg', + connect:true, + characterSort:{ + 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'], + }, + }, + character:{ + //起 + jsrg_liuhong:['male','qun',4,['jsrgchaozheng','jsrgshenchong','jsrgjulian'],['zhu']], + jsrg_hejin:['male','qun',4,['jsrgzhaobing','jsrgzhuhuan','jsrgyanhuo']], + jsrg_sunjian:['male','qun',4,['jsrgpingtao','jsrgjuelie']], + jsrg_huangfusong:['male','qun',4,['jsrgguanhuo','jsrgjuxia']], + jsrg_xushao:['male','qun',3,['sbyingmen','sbpingjian']], + jsrg_dongbai:['female','qun',3,['jsrgshichong','jsrglianzhu']], + jsrg_qiaoxuan:['male','qun',3,['jsrgjuezhi','jsrgjizhao']], + jsrg_yangbiao:['male','qun','3/4',['jsrgzhaohan','jsrgrangjie','jsrgyizheng']], + jsrg_kongrong:['male','qun',3,['jsrglirang','jsrgzhengyi']], + jsrg_zhujun:['male','qun',4,['jsrgfendi','jsrgjuxiang']], + jsrg_liubei:['male','qun',4,['jsrgjishan','jsrgzhenqiao']], + jsrg_wangyun:['male','qun',3,['jsrgshelun','jsrgfayi'],['clan:太原王氏']], + jsrg_liuyan:['male','qun',3,['xinfu_limu','jsrgtushe','jsrgtongjue'],['zhu']], + jsrg_caocao:['male','qun',4,['jsrgzhenglve','jsrghuilie']], + jsrg_nanhualaoxian:['male','qun',3,['jsrgshoushu','jsrgxundao','jsrglinghua']], + //承 + jsrg_sunce:['male','wu',4,['jsrgduxing','jsrgzhiheng','jsrgzhasi','jsrgbashi'],['zhu']], + jsrg_xuyou:['male','wei',3,['jsrglipan','jsrgqingxi','jsrgjinmie'],['doublegroup:wei:qun']], + jsrg_lvbu:['male','qun',5,['jsrgwuchang','jsrgqingjiao','jsrgchengxu'],['doublegroup:qun:shu']], + jsrg_zhanghe:['male','wei',4,['jsrgqiongtu','jsrgxianzhu'],['doublegroup:qun:wei']], + jsrg_zoushi:['female','qun',3,['jsrgguyin','jsrgzhangdeng']], + jsrg_guanyu:['male','shu',5,['jsrgguanjue','jsrgnianen']], + jsrg_chendeng:['male','qun',3,['jsrglunshi','jsrgguitu']], + jsrg_zhenji:['female','qun',3,['jsrgjixiang','jsrgchengxian']], + jsrg_zhangliao:['male','qun',4,['jsrgzhengbing','jsrgtuwei'],['doublegroup:qun:wei']], + jsrg_xugong:['male','wu',3,['jsrgbiaozhao','jsrgyechou']], + jsrg_chunyuqiong:['male','qun',4,['jsrgcangchu','jsrgshishou']], + }, + characterIntro:{ + qiaoxuan:'桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。', + jsrg_caocao:'初平元年二月,董卓徙天子都长安,焚洛阳宫室,众诸侯畏卓兵强,莫敢进。操怒斥众人:“为人臣而临此境,当举义兵以诛暴乱,大众已合,诸君何疑?此一战而天下定矣!”遂引兵汴水,遇卓将徐荣,大破之。操迎天子,攻吕布,伐袁术,安汉室,拜为征西将军。是时,袁绍兼四州之地,将攻许都。操欲扫清寰宇,兴复汉室,遂屯兵官渡。既克绍,操曰:“若天命在吾,吾为周文王矣。”', + jsrg_sunce:'建安五年,操、绍相拒于官渡,孙策欲阴袭许昌,迎汉帝,遂密治兵,部署诸将。未发,会为许贡门客所刺,将计就计,尽托江东于权,诈死以待天时。八月,操、绍决战,孙策亲冒矢石,斩将刈旗,得扬、豫之地。曹操败走冀、青,刘备远遁荆、益。而后历时七年,孙策三分天下已有其二,帝于洛阳,建霸王未竟之功业。权表求吴王,封为仲帝,共治天下。', + }, + characterTitle:{ + }, + perfectPair:{}, + card:{ + }, + characterFilter:{ + jsrg_xushao:function(mode){ + return mode!='guozhan'; + }, + }, + skill:{ + //江山如故·承 + //404孙策 + jsrgduxing:{ + audio:2, + enable:'phaseUse', + viewAs:{ + name:'juedou', + storage:{jsrgduxing:true}, + isCard:true, + }, + viewAsFilter:function(player){ + if(player.hasSkill('jsrgduxing_used')) return false; + }, + filterCard:()=>false, + selectCard:-1, + selectTarget:[1,Infinity], + precontent:function(){ + player.logSkill('jsrgduxing'); + delete event.result.skill; + var targets=event.result.targets; + for(var target of targets){ + target.addTempSkill('jsrgduxing_allsha'); + } + player.addTempSkill('jsrgduxing_restore'); + player.addTempSkill('jsrgduxing_used','phaseUseAfter'); + }, + ai:{ + order:5, + result:{ + target:function(player,target){ + var eff=Math.sign(get.effect(target,{name:'juedou'},player,player)); + if(player.hasSkillTag('directHit_ai',true,{ + target:target, + card:{name:'juedou'}, + },true)||ui.selected.targets.concat(target).reduce((p,c)=>{ + return p+c.countCards('h'); + },0){ + current.removeSkill('jsrgduxing_allsha'); + },true); + } + }, + }, + }, + jsrgzhiheng:{ + audio:2, + trigger:{ + source:'damageBegin1', + }, + forced:true, + filter:function(event,player){ + if(event.getParent().type!='card') return false; + var respondEvts=[]; + respondEvts.addArray(event.player.getHistory('useCard')).addArray(event.player.getHistory('respond')); + respondEvts=respondEvts.filter(i=>i.respondTo).map(evt=>evt.respondTo); + return respondEvts.some(list=>{ + return list[0]==player; + }); + }, + content:function(){ + trigger.num++; + }, + }, + jsrgzhasi:{ + audio:2, + trigger:{ + player:'damageBegin4', + }, + limited:true, + skillAnimation:true, + animationColor:'wood', + filter:function(event,player){ + return event.num>=player.getHp(); + }, + content:function(){ + player.awakenSkill('jsrgzhasi'); + trigger.cancel(); + player.removeSkill('jsrgzhiheng'); + game.log(player,'失去了技能','#g【猘横】'); + player.addSkillLog('rezhiheng'); + player.addSkill('jsrgzhasi_undist'); + }, + subSkill:{ + undist:{ + inherit:'undist', + charlotte:true, + trigger:{ + player:['useCardAfter','damageEnd'], + }, + filter:function(event,player){ + if(event.name=='useCard') return event.targets.some(target=>{ + return target!=player; + }); + return true; + }, + forced:true, + popup:false, + charlotte:true, + content:function(){ + player.removeSkill('jsrgzhasi_undist'); + }, + mark:true, + intro:{ + content:'诈死中,不计入距离和座次的计算', + }, + }, + }, + }, + jsrgbashi:{ + audio:2, + trigger:{player:'chooseToRespondBefore'}, + zhuSkill:true, + filter:function(event,player){ + if(event.responded) return false; + if(player.storage.jsrgbashiing) return false; + if(!player.hasZhuSkill('jsrgbashi')) return false; + if(!event.filterCard({name:'sha'},player,event)&&!event.filterCard({name:'shan'},player,event)) return false; + return game.hasPlayer(function(current){ + return current!=player&¤t.group=='wu'; + }); + }, + check:function(event,player){ + if(get.damageEffect(player,event.player,player)>=0) return false; + return true; + }, + content:function(){ + 'step 0' + event.targets=game.filterPlayer(); + 'step 1' + var target=event.targets.shift(); + event.target=target; + if(!target) event.finish(); + else if(!target.isIn()||target==player) event.redo(); + else if(target.group=='wu'){ + if((target==game.me&&!_status.auto)||( + get.attitude(target,player)>2)|| + 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 next=target.chooseToRespond('是否替'+get.translation(player)+'打出一张'+names+'?',{name:list}); + next.set('ai',function(){ + var event=_status.event; + return (get.attitude(event.player,event.source)-2); + }); + next.set('skillwarn','替'+get.translation(player)+'打出一张'+names); + next.autochoose=function(){ + if(!lib.filter.autoRespondSha.apply(this,arguments)) return false; + return lib.filter.autoRespondShan.apply(this,arguments); + }; + next.set('source',player); + } + } + 'step 2' + delete player.storage.jsrgbashiing; + if(result.bool){ + event.finish(); + var name=result.card.name; + trigger.result={bool:true,card:{name:name,isCard:true}}; + trigger.responded=true; + trigger.animate=false; + if(typeof target.ai.shown=='number'&&target.ai.shown<0.95){ + target.ai.shown+=0.3; + if(target.ai.shown>0.95) target.ai.shown=0.95; + } + } + else{ + event.goto(1); + } + }, + ai:{ + respondSha:true, + respondShan:true, + skillTagFilter:function(player,tag,arg){ + if(arg=='use') return false; + if(player.storage.jsrgbashiing) return false; + if(!player.hasZhuSkill('jsrgbashi')) return false; + return game.hasPlayer(function(current){ + return current!=player&¤t.group=='wu'; + }); + }, + }, + }, + //许攸 + jsrglipan:{ + audio:2, + trigger:{ + player:'phaseEnd', + }, + direct:true, + content:function(){ + 'step 0' + var list=lib.group.slice(); + list.remove(player.group); + var getV=function(group){ + var val=1; + if(group=='wei'||group=='qun') val++; + game.countPlayer(current=>{ + if(current.group!=group) return false; + var att=get.attitude(player,current); + if(att>0) val++; + else if(att==0) val+=0.5; + else val--; + }); + return val; + }; + var maxGroup=list.slice().sort((a,b)=>{ + return getV(b)-getV(a); + })[0]; + list.push('cancel2'); + player.chooseControl(list).set('prompt',get.prompt('jsrglipan')).set('prompt2','变更为另一个势力').set('ai',()=>{ + return _status.event.choice; + }).set('choice',maxGroup); + 'step 1' + var group=result.control; + if(group=='cancel2') + player.logSkill('jsrglipan'); + player.popup(group+'2',get.groupnature(group,'raw')); + player.changeGroup(group); + var num=game.countPlayer(current=>{ + return current.group==group&¤t!=player; + }); + if(num>0) player.draw(num); + var next=player.phaseUse(); + next.jsrglipan=true; + event.next.remove(next); + trigger.next.push(next); + player.addTempSkill('jsrglipan_backfire'); + }, + subSkill:{ + backfire:{ + trigger:{ + player:'phaseUseEnd', + }, + charlotte:true, + forced:true, + popup:false, + filter:function(event,player){ + return event.jsrglipan; + }, + content:function(){ + 'step 0' + var targets=game.filterPlayer(current=>{ + return current.group==player.group; + }); + targets.sortBySeat(); + event.targets=targets; + 'step 1' + var target=targets.shift(); + event.target=target; + if(target&&target.isIn()&&target.canUse({name:'juedou'},player)){ + target.chooseCardTarget({ + position:'hes', + prompt:'是否将一张牌当【决斗】对'+get.translation(player)+'使用?', + filterCard:function(card,player){ + return player.canUse(get.autoViewAs({name:'juedou'},[card]),_status.event.getParent().player); + }, + filterTarget:function(card,player,target){ + var source=_status.event.getParent().player; + if(target!=source&&!ui.selected.targets.contains(source)) return false; + card=get.autoViewAs({name:'juedou'},[card]); + return lib.filter.filterTarget.apply(this,arguments); + }, + selectTarget:function(){ + var card=get.card(),player=get.player(); + if(!card) return; + card=get.autoViewAs({name:'juedou'},[card]); + var range=[1,1]; + game.checkMod(card,player,range,'selectTarget',player); + return range; + }, + ai1:function(card){ + var player=_status.event.player,target=_status.event.getParent().player; + var eff=get.effect(target,get.autoViewAs({name:'juedou'},[card]),player,player); + if(eff<=0) return 0; + return (player.hp==1?10:6)-get.value(card); + }, + ai2:function(target){ + if(target==_status.event.getParent().player) return 100; + return get.effect(target,{name:'juedou'},_status.event.player); + } + }); + } + 'step 2' + if(result.bool){ + var cards=result.cards; + var cardx=get.autoViewAs({name:'juedou'},cards); + var targets=result.targets.filter(targetx=>{ + return target.canUse(cardx,targetx); + }); + if(targets.length) target.useCard(cardx,cards,targets); + } + if(targets.length) event.goto(1); + } + } + }, + }, + jsrgqingxi:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + if(player.group!='qun') return false; + return game.hasPlayer(current=>lib.skill.jsrgqingxi.filterTarget('',player,current)); + }, + groupSkill:true, + filterTarget:function(card,player,target){ + if(target.countCards('h')>=player.countCards('h')) return false; + return !player.getStorage('jsrgqingxi_used').contains(target); + }, + content:function(){ + 'step 0' + player.addTempSkill('jsrgqingxi_used','phaseUseAfter'); + player.markAuto('jsrgqingxi_used',[target]); + var num=player.countCards('h')-target.countCards('h'); + if(num>0) player.chooseToDiscard(num,true,'轻袭:弃置'+get.cnNumber(num)+'张手牌'); + 'step 1' + var card={ + name:'sha', + nature:'stab', + isCard:true, + }; + if(player.canUse(card,target,false)) player.useCard(card,target,false); + }, + ai:{ + order:8, + result:{ + target:function(player,target){ + var num=target.countCards('h')-player.countCards('h'); + var cnt=player.countCards('h',card=>{ + return get.value(card)<5; + }); + if(cntcurrent.countCards('h')>player.countCards('h')); + }, + groupSkill:true, + filterTarget:function(card,player,target){ + return target.countCards('h')>player.countCards('h'); + }, + content:function(){ + 'step 0' + var card={ + name:'sha', + nature:'fire', + storage:{jsrgjinmie:target}, + isCard:true, + }; + if(player.canUse(card,target,false)){ + player.useCard(card,target,false); + player.addTempSkill('jsrgjinmie_effect'); + } + }, + ai:{ + order:0.5, + result:{ + target:function(player,target){ + var eff=get.effect(target,{name:'sha',nature:'fire'},player,target)/30; + if(!target.mayHaveShan()) eff*=2; + var del=target.countCards('h')-player.countCards('h')+1.5; + eff*=Math.sqrt(del); + return eff; + } + } + }, + subSkill:{ + effect:{ + trigger:{ + source:'damageSource', + }, + filter:function(event,player){ + return event.card&&event.card.storage&&event.card.storage.jsrgjinmie&&event.card.storage.jsrgjinmie.isIn(); + }, + forced:true, + popup:false, + charlotte:true, + content:function(){ + 'step 0' + var target=trigger.card.storage.jsrgjinmie; + var del=target.countCards('h')-player.countCards('h'); + if(del>0){ + player.line(target); + player.discardPlayerCard(target,'h',true,del); + } + // else if(del<0){ + // player.line(target); + // target.draw(-del); + // } + } + } + }, + }, + //吕布 + jsrgwuchang:{ + audio:2, + trigger:{ + player:'gainAfter', + global:'loseAsyncAfter', + }, + forced:true, + filter:function(event,player){ + var cards=event.getg(player); + if(!cards.length) return false; + return game.hasPlayer(current=>{ + if(current==player) return false; + return event.getl(current).cards2.length; + }); + }, + group:'jsrgwuchang_add', + content:function(){ + 'step 0' + var targets=game.filterPlayer(current=>{ + if(current==player) return false; + return trigger.getl(current).cards2.length; + }); + var target=targets[0]; + player.changeGroup(target.group); + player.popup(target.group+'2',get.groupnature(target.group,'raw')); + }, + subSkill:{ + add:{ + trigger:{ + source:'damageBegin1', + }, + filter:function(event,player){ + if(!event.card||!['sha','juedou'].contains(event.card.name)||event.getParent().type!='card') return false; + return event.player.group==player.group; + }, + forced:true, + content:function(){ + 'step 0' + trigger.num++; + var group='qun'; + player.changeGroup(group); + player.popup(group+'2',get.groupnature(group,'raw')); + }, + } + }, + }, + jsrgqingjiao:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + if(player.group!='qun') return false; + if(!player.countCards('hes')) return false; + return !player.hasSkill('jsrgqingjiao_tuixinzhifu')&&game.hasPlayer(current=>{ + return current.countCards('h')>player.countCards('h'); + })||!player.hasSkill('jsrgqingjiao_chenghuodajie')&&game.hasPlayer(current=>{ + return current.countCards('h')0?'tuixinzhifu':'chenghuodajie'; + if(player.hasSkill('jsrgqingjiao_'+name)) return false; + return player.canUse({name:name,cards:ui.selected.cards},target); + }, + content:function(){ + var del=target.countCards('h')-player.countCards('h'); + var name=del>0?'tuixinzhifu':'chenghuodajie'; + player.useCard({name:name},target,cards); + player.addTempSkill('jsrgqingjiao_'+name,'phaseUseAfter'); + }, + subSkill:{ + tuixinzhifu:{ + charlotte:true, + }, + chenghuodajie:{ + charlotte:true, + }, + } + }, + jsrgchengxu:{ + audio:2, + trigger:{player:'useCard'}, + forced:true, + filter:function(event,player){ + if(player.group!='shu') return false; + return game.hasPlayer(current=>{ + return current!=player&¤t.group==player.group; + }); + }, + groupSkill:true, + content:function(){ + trigger.directHit.addArray(game.filterPlayer(current=>{ + return current!=player&¤t.group==player.group; + })); + }, + ai:{ + directHit_ai:true, + skillTagFilter:function(player,tag,arg){ + return player.group=='shu'&&player.group==arg.target.group; + }, + }, + }, + //张郃 + jsrgqiongtu:{ + audio:2, + enable:'chooseToUse', + groupSkill:true, + viewAs:{ + name:'wuxie', + suit:'none', + number:null, + isCard:true, + }, + filter:function(event,player){ + return player.group=='qun'&&!player.hasSkill('jsrgqiongtu_check'); + }, + viewAsFilter:function(player){ + return player.group=='qun'&&!player.hasSkill('jsrgqiongtu_check'); + }, + filterCard:function(card){ + return get.type(card)!='basic'; + }, + position:'he', + popname:true, + ignoreMod:true, + precontent:function(){ + 'step 0' + player.logSkill('jsrgqiongtu'); + delete event.result.skill; + var card=event.result.cards[0]; + event.card=card; + event.result.card={ + name:event.result.card.name, + storage:{jsrgqiongtu:true}, + isCard:true, + }; + event.result.cards=[]; + player.addToExpansion(card,player,'give').gaintag.add('jsrgqiongtu'); + player.addTempSkill('jsrgqiongtu_check'); + }, + marktext:'途', + intro:{ + content:'expansion', + markcount:'expansion', + }, + onremove:function(player,skill){ + var cards=player.getExpansions(skill); + if(cards.length) player.loseToDiscardpile(cards); + delete player.storage[skill]; + }, + subSkill:{ + check:{ + trigger:{ + global:'useCardAfter', + }, + filter:function(event,player){ + return event.card.name=='wuxie'&&event.card.storage&&event.card.storage.jsrgqiongtu; + }, + forced:true, + popup:false, + charlotte:true, + content:function(){ + 'step 0' + game.delayx(); + var evt=trigger.getParent(4); + if(evt.name=='phaseJudge'){ + state=evt.cancelled; + } + else{ + state=evt._neutralized; + } + if(state){ + player.draw(); + } + else{ + player.changeGroup('wei'); + var cards=player.getExpansions('jsrgqiongtu'); + if(cards.length) player.gain(cards,'gain2'); + } + } + }, + }, + }, + jsrgxianzhu:{ + audio:2, + enable:'chooseToUse', + filter:function(event,player){ + return player.group=='wei'&&player.hasCard(card=>{ + return _status.connectMode||get.type(card)=='trick'; + },'hs'); + }, + groupSkill:true, + viewAs:{ + name:'sha', + storage:{jsrgxianzhu:true}, + }, + position:'hs', + filterCard:function(card){ + return get.type(card)=='trick'; + }, + check:function(card){ + var player=_status.event.player; + var cardx={ + name:'sha', + storage:{jsrgxianzhu:true}, + cards:[card], + } + if(game.hasPlayer(current=>{ + return player.canUse(cardx,current)&&get.effect(current,card,player,player)>0&&get.effect(current,cardx,player,player)>0; + })) return 15-get.value(card); + return 0; + }, + onuse:function(links,player){ + player.addTempSkill('jsrgxianzhu_after'); + }, + mod:{ + cardUsable:function(card){ + if(card.storage&&card.storage.jsrgxianzhu) return Infinity; + }, + }, + subSkill:{ + after:{ + trigger:{ + global:'damageSource', + }, + filter:function(event,player){ + var targets=event.getParent(2).targets; + if(!targets||targets.length!=1) return false; + if(!event.card||!event.card.storage||!event.card.storage.jsrgxianzhu) return false; + var target=event.player,card=event.cards[0]; + if(!target.isIn()) return false; + if(get.type(card)!='trick') return false; + if(!player.canUse(card,target,false)) return false; + return true; + }, + forced:true, + charlotte:true, + group:'jsrgxianzhu_inf', + content:function(){ + var card={ + name:trigger.cards[0].name, + isCard:true, + } + player.useCard(card,trigger.player,false); + game.delayx(); + }, + }, + inf:{ + trigger:{player:'useCard1'}, + forced:true, + popup:false, + firstDo:true, + filter:function(event,player){ + if(event.card.storage&&event.card.storage.jsrgxianzhu&&event.addCount!==false) return true; + return false; + }, + content:function(){ + trigger.addCount=false; + var stat=player.getStat().card,name=trigger.card.name; + if(typeof stat[name]=='number') stat[name]--; + }, + }, + }, + }, + //邹氏 + jsrgguyin:{ + audio:2, + trigger:{ + player:'phaseZhunbeiBegin', + }, + check:function(event,player){ + return player.isTurnedOver()||game.countPlayer2(current=>current.hasSex('male'))>=2; + }, + content:function(){ + 'step 0' + player.turnOver(); + 'step 1' + var targets=game.filterPlayer(current=>current!=player&¤t.hasSex('male')); + event.targets=targets; + player.line(targets); + game.delayx(); + 'step 2' + var target=targets.shift(); + event.target=target; + target.chooseBool('是否响应'+get.translation(player)+'的【孤吟】?','你可以翻面。').set('ai',()=>{ + return _status.event.bool; + }).set('bool',function(){ + return target.isTurnedOver()||get.attitude(target,player)>0&&(game.countPlayer2(current=>current.hasSex('male'))>=3||target.getHp()<=1&&player.hasSkill('jsrgzhangdeng')); + }()); + 'step 3' + if(result.bool){ + target.turnOver(); + } + if(targets.length) event.goto(2); + 'step 4' + var targets=game.filterPlayer(current=>{ + return current==player||current.isTurnedOver(); + }); + event.targets=targets; + event.num=0; + event.index=0; + 'step 5' + var target=targets[event.index]; + if(target.isIn()){ + target.draw(); + if(target==player) event.num++; + } + event.index++; + if(event.index>=targets.length) event.index=0; + 'step 6' + if(event.num>=game.countPlayer2(current=>current.hasSex('male'))) event.finish(); + else event.goto(5); + }, + }, + jsrgzhangdeng:{ + audio:2, + trigger:{ + global:'logSkill', + }, + filter:function(event,player){ + return event.player.getHistory('useSkill',evt=>{ + return evt.skill=='jsrgzhangdeng_jiu'; + }).map(evt=>evt.event).indexOf(event.log_event)==1; + }, + global:'jsrgzhangdeng_jiu', + forced:true, + locked:false, + content:function(){ + player.turnOver(false); + }, + subSkill:{ + jiu:{ + audio:'jsrgzhangdeng', + enable:'chooseToUse', + filter:function(event,player){ + return player.isTurnedOver()&&game.hasPlayer(current=>{ + return current.hasSkill('jsrgzhangdeng'); + }); + }, + viewAs:{name:'jiu',isCard:true}, + viewAsFilter:function(player){ + return player.isTurnedOver()&&game.hasPlayer(current=>{ + return current.hasSkill('jsrgzhangdeng'); + }); + }, + filterCard:()=>false, + selectCard:-1, + precontent:function(){ + player.logSkill('jsrgzhangdeng_jiu'); + var targets=game.filterPlayer(current=>{ + return current.hasSkill('jsrgzhangdeng'); + }); + player.line(targets[0]); + delete event.result.skill; + }, + }, + }, + }, + //关羽 + jsrgguanjue:{ + audio:2, + trigger:{ + player:['useCard','respond'], + }, + filter:function(event,player){ + return lib.suit.contains(get.suit(event.card)); + }, + forced:true, + content:function(){ + 'step 0' + var targets=game.filterPlayer(current=>current!=player); + var suit=get.suit(trigger.card); + for(var target of targets){ + target.addTempSkill('jsrgguanjue_ban'); + target.markAuto('jsrgguanjue_ban',[suit]); + } + }, + subSkill:{ + ban:{ + onremove:true, + charlotte:true, + mod:{ + cardEnabled:function(card,player){ + if(player.getStorage('jsrgguanjue_ban').contains(get.suit(card))) return false; + }, + cardRespondable:function(card,player){ + if(player.getStorage('jsrgguanjue_ban').contains(get.suit(card))) return false; + }, + cardSavable:function(card,player){ + if(player.getStorage('jsrgguanjue_ban').contains(get.suit(card))) return false; + }, + }, + mark:true, + marktext:'绝', + intro:{ + content:'本回合内不能使用或打出$的牌', + }, + }, + }, + }, + jsrgnianen:{ + audio:2, + enable:['chooseToUse','chooseToRespond'], + filter:function(event,player){ + if(!player.countCards('hes')) return false; + if(player.hasSkill('jsrgnianen_blocker')) return false; + for(var name of lib.inpile){ + if(get.type2(name)!='basic') continue; + var card={name:name}; + if(event.filterCard(card,player,event)) return true; + if(name=='sha'){ + for(var nature of lib.inpile_nature){ + card.nature=nature; + if(event.filterCard(card,player,event)) return true; + } + } + } + return false; + }, + derivation:'mashu', + chooseButton:{ + dialog:function(event,player){ + var list=[]; + for(var name of lib.inpile){ + if(name=='sha'){ + if(event.filterCard({name:name},player,event)) list.push(['基本','','sha']); + for(var nature of lib.inpile_nature){ + if(event.filterCard({name:name,nature:nature},player,event)) list.push(['基本','','sha',nature]); + } + } + else if(get.type(name)=='basic'&&event.filterCard({name:name},player,event)) list.push(['基本','',name]); + } + var dialog=ui.create.dialog('念恩',[list,'vcard']); + dialog.direct=true; + return dialog; + }, + filter:function(button,player){ + return _status.event.getParent().filterCard({name:button.link[2],nature:button.link[3]},player,_status.event.getParent()); + }, + check:function(button){ + if(_status.event.getParent().type!='phase') return 1; + var player=_status.event.player; + if(['wugu','zhulu_card','yiyi','lulitongxin','lianjunshengyan','diaohulishan'].contains(button.link[2])) return 0; + return player.getUseValue({ + name:button.link[2], + nature:button.link[3], + }); + }, + backup:function(links,player){ + return { + audio:'jsrgnianen', + filterCard:true, + popname:true, + check:function(card){ + return 8-get.value(card); + }, + position:'hes', + viewAs:{name:links[0][2],nature:links[0][3]}, + precontent:function(){ + delete event.result.skill; + var card=event.result.card; + if(get.color(card,player)!='red'||get.name(card)!='sha'||get.nature(card)){ + player.addTempSkill('jsrgnianen_blocker'); + player.addAdditionalSkill('jsrgnianen_blocker','mashu'); + } + }, + } + }, + prompt:function(links,player){ + return '将一张牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; + } + }, + hiddenCard:function(player,name){ + if(!lib.inpile.contains(name)) return false; + var type=get.type2(name); + return type=='basic'&&player.countCards('hes')>0&&!player.hasSkill('jsrgnianen_blocker'); + }, + ai:{ + fireAttack:true, + respondSha:true, + respondShan:true, + skillTagFilter:function(player){ + if(!player.countCards('hes')||player.hasSkill('jsrgnianen_blocker')) return false; + }, + order:1, + result:{ + player:function(player){ + if(_status.event.dying) return get.attitude(player,_status.event.dying); + return 1; + }, + }, + }, + subSkill:{ + blocker:{ + charlotte:true, + mark:true, + marktext:'恩', + intro:{content:'视为拥有〖马术〗'}, + }, + }, + }, + //生鱼片 + jsrglunshi:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:function(card,player,target){ + return game.hasPlayer(current=>{ + return current.inRangeOf(target); + }); + }, + content:function(){ + 'step 0' + var num=game.countPlayer(current=>{ + return current.inRangeOf(target); + }); + var len=target.countCards('h'); + num=Math.max(0,Math.min(len+num,5)-len); + if(num>0) target.draw(num); + 'step 1' + var num=game.countPlayer(current=>{ + return current.inRange(target); + }); + if(num>0) target.chooseToDiscard(num,'he',true,get.translation(player)+'对你发动了【论势】','请弃置'+get.cnNumber(num)+'张牌'); + }, + ai:{ + order:6, + result:{ + target:function(player,target){ + var num1=game.countPlayer(current=>{ + return current.inRangeOf(target); + }),num2=game.countPlayer(current=>{ + return current.inRange(target); + }); + var len=target.countCards('h'); + num1=Math.max(0,Math.min(len+num1,5)-len); + return (num1-num2+1)/2; + } + } + }, + }, + jsrgguitu:{ + audio:2, + trigger:{ + player:'phaseZhunbeiBegin', + }, + direct:true, + filter:function(event,player){ + return game.countPlayer(current=>{ + return current.getEquips(1).length; + })>=2; + }, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgguitu'),(card,player,target)=>{ + return target.getEquips(1).length; + },[1,2]).set('filterOk',()=>{ + var num=0; + for(var target of ui.selected.targets){ + num+=target.getEquips(1).length; + } + return num>=2; + }).set('ai',target=>{ + var sign=-1; + var val=0; + if(ui.selected.targets.length){ + sign=1; + var targetx=ui.selected.targets[0]; + var cards=targetx.getEquips(1); + var list=cards.map(card=>{ + return [card,get.value(card,targetx)]; + }); + list.sort((a,b)=>{ + return b[1]-a[1]; + }); + val=get.attitude(_status.event.player,targetx)*list[0][1]; + } + var cards=target.getEquips(1); + var list=cards.map(card=>{ + return [card,get.value(card,target)]; + }); + list.sort((a,b)=>{ + return b[1]-a[1]; + }); + return get.attitude(_status.event.player,target)*list[0][1]*sign-val; + }); + 'step 1' + if(result.bool){ + var targets=result.targets.slice(); + targets.sortBySeat(); + event.targets=targets; + player.logSkill('jsrgguitu',targets); + event.rangeList=targets.map(target=>{ + return target.getAttackRange(); + }); + var weapons=[]; + for(var target of targets){ + weapons.addArray(target.getEquips(1)); + } + if(weapons.length>2){ + var list=['诡图:选择要交换的武器牌']; + for(var target of targets){ + list.addArray([ + '
'+get.translation(target)+'的武器牌
', + target.getEquips(1) + ]) + } + player.chooseButton(list,true,2).set('filterButton',button=>{ + var count=_status.event.count; + if(count==1) return true; + for(var i=0;i{ + var player=_status.event.player; + var card=button.link; + var owner=get.owner(card); + var att=get.attitude(player,owner); + var val=-get.value(card)*att; + return val; + }); + } + else event._result={bool:true,links:weapons}; + } + else event.finish(); + 'step 2' + if(result.bool){ + var links=result.links; + var list=[]; + for(var target of targets){ + var weapons=target.getEquips(1); + weapons=weapons.filter(i=>links.contains(i)); + if(weapons.length){ + list.push([target,weapons]); + } + } + if(list.length==2){ + event.players=list.map(i=>i[0]); + event.cards=list.map(i=>i[1]); + } + else{ + event.players=[list[0][0],list[0][0]]; + event.cards=list[0][1]; + } + game.loseAsync({ + player:event.players[0], + target:event.players[1], + cards1:event.cards[0], + cards2:event.cards[1], + }).setContent('swapHandcardsx'); + } + else event.finish(); + 'step 3' + for(var i=0;i{ + return target.getAttackRange(); + }); + for(var i=0;ilist.contains(name)); + var str=get.translation(trigger.player)+(evt.card?'因'+get.translation(evt.card):'')+'需要'+reason+'一张'+names+',是否弃置一张牌视为其'+reason+'之'+ + (used.length?('(你不能以此法令其'+reason+get.translation(used)+')'):'')+'?若如此做,你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。'; + event.str=str; + if(!listx.length) event.finish(); + if(listx.length==1) event._result={bool:true,links:listx}; + else{ + event.asked=true; + player.chooseButton([ + '###'+get.prompt('jsrgjixiang',trigger.player)+'###
'+str+'
', + [listx,'vcard'] + ]).set('ai',()=>Math.random()+1); + } + 'step 1' + if(result.bool){ + var name=result.links[0][2],nature=result.links[0][3]; + var card={name:name,nature:nature,isCard:true}; + event.card=card; + var reason=(trigger.name=='chooseToUse'?'使用':'打出'); + var prompt=event.asked? + '济乡:是否弃置一张牌'+(trigger.filterTarget?'并选择目标角色':'')+'?': + get.prompt('jsrgjixiang',trigger.player); + var str=event.asked?'若如此做,视为'+get.translation(trigger.player)+reason+get.translation(card)+',然后你摸一张牌并令〖称贤〗此阶段可发动次数上限+1。':event.str; + var next=player.chooseCardTarget({ + prompt:prompt, + prompt2:str, + filterCard:lib.filter.cardDiscardable, + position:'he', + goon:get.attitude(player,trigger.player)>1&&(evt.card?get.effect(trigger.player,evt.card,evt.player,player)<0:get.effect(trigger.player,{name:list[0]},trigger.player,player)>0), + ai1:function(card){ + if(_status.event.goon) return 6-get.value(card); + return 0; + }, + _get_card:card, + }); + var keys=['filterTarget','selectTarget','ai2']; + for(var key of keys) delete next[key]; + for(var i in trigger){ + if(!next.hasOwnProperty(i)) next[i]=trigger[i]; + } + next.filterTargetx=trigger.filterTarget||(()=>false); + next.filterTarget=function(card,player,target){ + var filter=this.filterTargetx; + if(typeof filter!='function') filter=(()=>filter); + card=_status.event._get_card; + player=_status.event.getTrigger().player; + return this.filterTargetx.apply(this,arguments); + }; + if(typeof next.selectTarget!='number'&&typeof next.selectTarget!='function'&&get.itemtype(next.selectTarget)!='select') next.selectTarget=-1; + } + else event.finish(); + 'step 2' + if(result.bool){ + var cardx=result.cards[0]; + var targets=result.targets||[]; + event.targets=targets; + player.logSkill('jsrgjixiang',trigger.player); + player.addTempSkill('jsrgjixiang_used'); + player.markAuto('jsrgjixiang_used',[card.name]); + player.discard(cardx); + trigger.untrigger(); + trigger.set('responded',true); + var result={ + bool:true, + card:card + }; + if(targets.length) result.targets=targets; + trigger.result=result; + player.draw(); + var phaseName; + for(var name of lib.phaseName){ + var evt=trigger.getParent(name); + if(!evt||evt.name!=name) continue; + phaseName=name; + break; + } + if(phaseName){ + player.addTempSkill('jsrgjixiang_add',phaseName+'After'); + player.addMark('jsrgjixiang_add',1,false); + } + } + }, + subSkill:{ + used:{ + charlotte:true, + onremove:true, + mark:true, + marktext:'乡', + intro:{ + content:'已触发过牌名:$', + }, + }, + add:{ + charlotte:true, + onremove:true, + mark:true, + intro:{ + markcount:(storage,player)=>2+(storage||0), + content:(storage,player)=>'〖称贤〗剩余可发动次数为'+(2+(storage||0)), + }, + }, + save:{ + charlotte:true, + ai:{ + save:true, + skillTagFilter:function(player,arg,target){ + return _status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.hasSkill('jsrgjixiang')&&_status.currentPhase.countCards('he'); + }, + }, + }, + }, + }, + jsrgchengxian:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + if(!player.countCards('hs')) return false; + if(2+player.countMark('jsrgjixiang_add')<=0) return false; + for(var name of lib.inpile){ + if(get.type(name)!='trick') continue; + if(player.getStorage('jsrgchengxian_used').contains(name)) continue; + if(event.filterCard({name:name},player,event)) return true; + } + return false; + }, + chooseButton:{ + dialog:function(event,player){ + var list=[]; + for(var name of lib.inpile){ + if(player.getStorage('jsrgchengxian_used').contains(name)) continue; + var info=get.info({name:name}); + if(!info||info.type!='trick') continue; + if(info.notarget) continue; + if(!info.selectTarget) continue; + if(get.type(name)=='trick'&&event.filterCard({name:name},player,event)) list.push(['锦囊','',name]); + } + var dialog=ui.create.dialog('称贤',[list,'vcard']); + return dialog; + }, + filter:function(button,player){ + return _status.event.getParent().filterCard({name:button.link[2],nature:button.link[3]},player,_status.event.getParent()); + }, + check:function(button){ + if(_status.event.getParent().type!='phase') return 1; + var player=_status.event.player; + if(['wugu','zhulu_card','yiyi','lulitongxin','lianjunshengyan','diaohulishan'].contains(button.link[2])) return 0; + return player.getUseValue({ + name:button.link[2], + nature:button.link[3], + }); + }, + backup:function(links,player){ + return { + audio:'jsrgchengxian', + filterCard:function(card,player){ + var num=game.countPlayer(current=>{ + return player.canUse(card,current); + }); + if(!num) return false; + var cardx=get.copy(lib.skill.jsrgchengxian_backup.viewAs); + cardx.cards=[card]; + var num2=game.countPlayer(current=>{ + return player.canUse(cardx,current); + }); + return num==num2; + }, + popname:true, + check:function(card){ + return 8-get.value(card); + }, + position:'hs', + viewAs:{name:links[0][2]}, + precontent:function(){ + player.logSkill('jsrgchengxian'); + player.addTempSkill('jsrgjixiang_add'); + if(typeof player.storage.jsrgjixiang_add!='number') player.storage.jsrgjixiang_add=0; + player.storage.jsrgjixiang_add--; + player.addTempSkill('jsrgchengxian_used'); + player.markAuto('jsrgchengxian_used',[event.result.card.name]); + delete event.result.skill; + }, + } + }, + prompt:function(links,player){ + return '将一张合法目标数与'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'相同的手牌当此牌使用'; + } + }, + //理解错了,下面这个不用了 + getNumber:function(card,player){ + var rangex=null; + var info=get.info(card); + if(!info) return null; + if(info.notarget) return null; + if(info.selectTarget!=undefined){ + var select=get.select(info.selectTarget); + if(select[0]<0){ + if(!info.toself){ + var count=game.countPlayer(current=>{ + return lib.filter.targetEnabled(card,player,current); + }); + } + else count=1; + rangex=[count,count]; + } + else rangex=select; + } + return rangex; + }, + ai:{ + order:1, + result:{ + player:function(player){ + if(_status.event.dying) return get.attitude(player,_status.event.dying); + return 1; + }, + }, + }, + subSkill:{ + used:{ + charlotte:true, + onremove:true, + mark:true, + intro:{ + content:'已使用过$', + }, + }, + }, + }, + //张辽 + jsrgzhengbing:{ + audio:2, + enable:'phaseUse', + usable:3, + filter:function(event,player){ + return player.group=='qun'; + }, + filterCard:lib.filter.cardRecastable, + check:function(card,player){ + var val=5+['shan','tao'].contains(get.name(card))*1.5; + if(player.needsToDiscard()>2&&get.name(card)=='sha'&&player.countCards('hs','sha')>1) val+=0.5; + return val-get.value(card); + }, + position:'he', + groupSkill:true, + lose:false, + discard:false, + delay:false, + content:function(){ + 'step 0' + player.recast(cards); + switch(get.name(cards[0])){ + case 'sha': + player.addTempSkill('jsrgzhengbing_sha'); + player.addMark('jsrgzhengbing_sha',2,false); + break; + case 'shan': + player.draw(); + break; + case 'tao': + player.changeGroup('wei'); + } + }, + ai:{ + order:7, + result:{player:1}, + }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + mod:{ + maxHandcard:function(player,num){ + return num+player.countMark('jsrgzhengbing_sha'); + }, + }, + intro:{ + content:'手牌上限+#', + }, + } + }, + }, + jsrgtuwei:{ + audio:2, + trigger:{ + player:'phaseUseBegin', + }, + filter:function(event,player){ + return player.group=='wei'&&game.hasPlayer(current=>{ + return player.inRange(current)&¤t.countGainableCards(player,'he')>0; + }); + }, + groupSkill:true, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrgtuwei'),'获得攻击范围内任意名角色的各一张牌。然后回合结束时这些角色中未受过伤害的角色依次获得你的一张牌。',(card,player,target)=>{ + return player.inRange(current)&&target.countGainableCards(player,'he')>0; + },[1,Infinity]).set('ai',target=>{ + var player=_status.event.player; + return get.effect(target,{name:'shunshou'},player,player); + }).set('damage',player.hasCard(card=>{ + return player.hasValueTarget(card)&&get.tag(card,'damage'); + },'hs')); + 'step 1' + if(result.bool){ + var targets=result.targets.slice(); + targets.sortBySeat(); + player.logSkill('jsrgtuwei',targets); + player.gainMultiple(result.targets,'he'); + player.addTempSkill('jsrgtuwei_backfire'); + player.markAuto('jsrgtuwei_backfire',targets); + } + }, + subSkill:{ + backfire:{ + audio:'jsrgtuwei', + trigger:{ + player:'phaseEnd', + }, + charlotte:true, + onremove:true, + forced:true, + filter:function(event,player){ + return player.getStorage('jsrgtuwei_backfire').some(target=>{ + return !target.getHistory('damage').length&&target.isIn(); + }); + }, + content:function(){ + 'step 0' + var targets=player.getStorage('jsrgtuwei_backfire').filter(target=>{ + return !target.getHistory('damage').length&&target.isIn(); + }); + event.targets=targets.sortBySeat(); + 'step 1' + var target=targets.shift(); + if(target.isIn()&&player.countGainableCards(target,'he')){ + target.line(player); + target.gainPlayerCard(player,true,'he'); + } + if(player.countCards('he')&&targets.length) event.redo(); + }, + ai:{ + effect:{ + player:function(card,player,target){ + if(player!=target&&get.tag(card,'damage')&&target&&player.getStorage('jsrgtuwei_backfire').contains(target)&&!target.getHistory('damage').length) return [1,1,1,0]; + }, + }, + }, + }, + }, + }, + //许贡 + jsrgbiaozhao:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return game.countPlayer(current=>current!=player)>=2; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgbiaozhao'),lib.filter.notMe,2).set('ai',target=>{ + var player=_status.event.player; + var att=get.attitude(player,target); + if(!ui.selected.targets.length) return att*(Math.sqrt(target.countCards('hs'))+0.1); + return -att/Math.sqrt(target.countCards('hs')+0.1); + }).set('targetprompt',['用牌无限制','打你变疼']); + 'step 1' + if(result.bool){ + var targets=result.targets; + player.logSkill('jsrgbiaozhao',targets); + player.addTempSkill('jsrgbiaozhao_syujin',{player:['phaseBegin','die']}); + if(!player.storage.jsrgbiaozhao_syujin) player.storage.jsrgbiaozhao_syujin=[]; + player.storage.jsrgbiaozhao_syujin.push(targets); + targets[0].addSkill('jsrgbiaozhao_A'); + targets[0].markAuto('jsrgbiaozhao_A',[targets[1]]); + targets[1].addSkill('jsrgbiaozhao_B'); + targets[1].addMark('jsrgbiaozhao_B'+player.playerid,1,false); + targets[1].markAuto('jsrgbiaozhao_B',[player]); + } + }, + subSkill:{ + syujin:{ + charlotte:true, + onremove:function(player,skill){ + var list=player.storage.jsrgbiaozhao_syujin; + for(var targets of list){ + targets[0].unmarkAuto('jsrgbiaozhao_A',[targets[1]]); + targets[1].unmarkAuto('jsrgbiaozhao_B',[player]); + delete targets[1].storage['jsrgbiaozhao_B'+player.playerid]; + if(!targets[0].getStorage('jsrgbiaozhao_A')) targets[0].removeSkill('jsrgbiaozhao_A'); + if(!targets[1].getStorage('jsrgbiaozhao_B')) targets[1].removeSkill('jsrgbiaozhao_B'); + } + delete player.storage.jsrgbiaozhao_syujin; + }, + }, + A:{ + charlotte:true, + onremove:true, + mark:true, + marktext:'表', + intro:{ + content:'对$使用牌无次数和距离限制', + }, + mod:{ + targetInRange:function(card,player,target){ + if(player.getStorage('jsrgbiaozhao_A').contains(target)) return true; + }, + cardUsableTarget:function(card,player,target){ + if(player.getStorage('jsrgbiaozhao_A').contains(target)) return true; + }, + }, + }, + B:{ + trigger:{ + source:'damageBegin1', + }, + charlotte:true, + forced:true, + onremove:function(player,skill){ + for(var i in player.storage){ + if(i.indexOf('jsrgbiaozhao_B')==0) delete player.storage[i]; + } + }, + filter:function(event,player){ + return event.card&&player.getStorage('jsrgbiaozhao_B').contains(event.player); + }, + content:function(){ + trigger.num+=player.countMark('jsrgbiaozhao_B'+trigger.player.playerid)||1; + }, + mark:true, + marktext:'召', + intro:{ + content:function(storage,player){ + var str=''; + for(var target of storage){ + str+='对'+get.translation(target)+'使用牌造成的伤害+'+player.countMark('jsrgbiaozhao_B'+target.playerid); + } + return str; + } + }, + }, + } + }, + jsrgyechou:{ + audio:2, + trigger:{player:'die'}, + forceDie:true, + direct:true, + skillAnimation:true, + animationColor:'wood', + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgyechou'),lib.filter.notMe).set('ai',target=>{ + var player=_status.event.player; + return -get.attitude(player,target); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgyechou',target); + target.addSkill('jsrgyechou_effect'); + target.addMark('jsrgyechou_effect',1,false); + } + }, + subSkill:{ + effect:{ + trigger:{ + player:'damageBegin3', + }, + filter:function(event,player){ + return event.num>=player.getHp(); + }, + forced:true, + charlotte:true, + onremove:true, + content:function(){ + trigger.num*=2*player.countMark('jsrgyechou_effect'); + }, + mark:true, + marktext:'仇', + intro:{ + content:'当你受到伤害值不小于体力值的伤害时,此伤害翻&倍', + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')){ + if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; + if(target.hp==1) return 2; + } + } + } + }, + }, + } + }, + //淳于琼 + jsrgcangchu:{ + audio:'recangchu', + trigger:{ + global:'phaseJieshuBegin', + }, + filter:function(event,player){ + if(player.hasSkill('jsrgshishou_blocker')) return false; + return player.getHistory('gain').length; + }, + direct:true, + content:function(){ + 'step 0' + var num=0; + player.getHistory('gain',evt=>{ + num+=evt.cards.length; + }); + event.num=num; + player.chooseTarget(get.prompt('jsrgcangchu'),'令至多'+get.cnNumber(num)+'名角色各摸'+get.cnNumber(num>game.countPlayer()?2:1)+'张牌',[1,num]).set('ai',target=>{ + var player=_status.event.player; + return get.attitude(player,target)/Math.sqrt(target.countCards('hs')+1); + }); + 'step 1' + if(result.bool){ + var targets=result.targets.slice(); + targets.sortBySeat(); + player.logSkill('jsrgcangchu',targets); + game.asyncDraw(targets,num>game.countPlayer()?2:1); + game.delayex(); + } + }, + }, + jsrgshishou:{ + audio:'reshishou', + trigger:{ + player:'useCard', + }, + forced:true, + filter:function(event,player){ + return event.card.name=='jiu'; + }, + group:'jsrgshishou_burn', + content:function(){ + 'step 0' + player.draw(3); + player.addTempSkill('jsrgshishou_nouse'); + }, + mod:{ + aiOrder:function(player,card,num){ + if(card.name=='jiu') return 0.01; + }, + }, + ai:{ + effect:{ + player_use:function(card,player,target){ + if(card.name=='jiu') return [1,1]; + }, + } + }, + subSkill:{ + nouse:{ + charlotte:true, + mod:{ + cardEnabled:function(card,player){ + return false; + }, + cardUsable:function(card,player){ + return false; + }, + cardSavable:function(card,player){ + return false; + }, + }, + mark:true, + marktext:'失', + intro:{ + content:'喝醉了,不能再使用牌', + } + }, + burn:{ + audio:'reshishou', + trigger:{ + player:'damageEnd', + }, + forced:true, + filter:function(event,player){ + return event.nature=='fire'; + }, + content:function(){ + player.addTempSkill('jsrgshishou_blocker',{player:'phaseEnd'}); + } + }, + blocker:{ + charlotte:true, + mark:true, + marktext:'守', + intro:{ + content:'〖仓储〗失效直到下回合结束', + } + } + }, + }, + //江山如故·起 + sbyingmen:{ + forbid:['guozhan'], + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + filter:function(event,player){ + return event.name!='phase'||game.phaseNumber==0; + }, + content:function(){ + if(!_status.characterlist) lib.skill.pingjian.initList(); + var characters=_status.characterlist.randomRemove(4); + lib.skill.sbyingmen.addVisitors(characters,player); + game.delayx(); + }, + group:'sbyingmen_reload', + subSkill:{ + reload:{ + trigger:{player:'phaseBegin'}, + forced:true, + locked:false, + filter:function(event,player){ + return player.getStorage('sbyingmen').length<4; + }, + content:function(){ + if(!_status.characterlist) lib.skill.pingjian.initList(); + var characters=_status.characterlist.randomRemove(4-player.getStorage('sbyingmen').length); + lib.skill.sbyingmen.addVisitors(characters,player); + game.delayx(); + }, + }, + }, + getSkills:function(characters,player){ + var skills=[]; + for(var name of characters){ + if(Array.isArray(lib.character[name])){ + for(var skill of lib.character[name][3]){ + var list=get.skillCategoriesOf(skill,player); + list.remove('锁定技'); + if(list.length>0) continue; + var info=get.info(skill); + if(info&&(!info.unique||info.gainable)) skills.add(skill); + } + } + } + return skills; + }, + addVisitors:function(characters,player){ + player.addSkillBlocker('sbyingmen'); + game.log(player,'将','#y'+get.translation(characters),'加入了','#g“访客”') + lib.skill.rehuashen.drawCharacter(player,characters); + player.markAuto('sbyingmen',characters) + var storage=player.getStorage('sbyingmen'); + var skills=lib.skill.sbyingmen.getSkills(storage,player); + player.addInvisibleSkill(skills); + }, + removeVisitors:function(characters,player){ + var skills=lib.skill.sbyingmen.getSkills(characters,player); + var characters2=player.getStorage('sbyingmen').slice(0); + characters2.removeArray(characters); + skills.removeArray(lib.skill.sbyingmen.getSkills(characters2,player)); + player.unmarkAuto('sbyingmen',characters); + _status.characterlist.addArray(characters); + player.removeInvisibleSkill(skills); + }, + onremove:function(player,skill){ + lib.skill.sbyingmen.removeVisitors(player.getSkills('sbyingmen'),player); + player.removeSkillBlocker('sbyingmen'); + }, + skillBlocker:function(skill,player){ + if(!player.invisibleSkills.contains(skill)||skill=='sbpingjian'||skill=='sbpingjian') return false; + return !player.hasSkill('sbpingjian'); + }, + marktext:'客', + intro:{ + name:'访客', + mark:function(dialog,storage,player){ + if(!storage||!storage.length) return '当前没有“访客”'; + dialog.addSmall([storage,'character']); + var skills=lib.skill.sbyingmen.getSkills(storage,player); + if(skills.length) dialog.addText('
  • 当前可用技能:'+get.translation(skills),false); + }, + }, + }, + sbpingjian:{ + trigger:{player:['useSkill','logSkillBegin']}, + forced:true, + filter:function(event,player){ + var skill=event.sourceSkill||event.skill; + return player.invisibleSkills.contains(skill)&&lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player).contains(skill); + }, + content:function(){ + 'step 0' + var visitors=player.getStorage('sbyingmen').slice(0); + var drawers=visitors.filter(function(name){ + return Array.isArray(lib.character[name])&&lib.character[name][3].contains(trigger.sourceSkill); + }); + event.drawers=drawers; + if(visitors.length==1) event._result={bool:true,links:visitors}; + else{ + var dialog=['评鉴:请选择移去一张“访客”']; + if(drawers.length) dialog.push('
    如果移去'+get.translation(drawers)+',则你摸一张牌
    '); + dialog.push([visitors,'character']); + player.chooseButton(dialog,true); + } + 'step 1' + if(result.bool){ + lib.skill.sbyingmen.removeVisitors(result.links,player); + game.log(player,'移去了','#y'+get.translation(result.links[0])); + if(event.drawers.contains(result.links[0])){ + player.addTempSkill('sbpingjian_draw'); + player.storage.sbpingjian_draw.push(trigger.skill); + } + } + }, + group:'sbpingjian_trigger', + subSkill:{ + draw:{ + charlotte:true, + init:function(player,skill){ + if(!player.storage[skill]) player.storage[skill]=[]; + }, + onremove:true, + trigger:{player:['useSkillAfter','logSkill']}, + forced:true, + popup:false, + filter:function(event,player){ + return player.getStorage('sbpingjian_draw').contains(event.skill); + }, + content:function(){ + player.storage.sbpingjian_draw.remove(trigger.skill); + player.draw(); + if(!player.storage.sbpingjian_draw.length) player.removeSkill('sbpingjian_draw'); + }, + }, + trigger:{ + trigger:{player:'triggerInvisible'}, + forced:true, + forceDie:true, + popup:false, + charlotte:true, + priority:10, + filter:function(event,player){ + if(event.revealed) return false; + var info=get.info(event.skill); + if(info.charlotte) return false; + var skills=lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player); + game.expandSkills(skills); + return skills.contains(event.skill); + }, + content:function(){ + "step 0" + if(get.info(trigger.skill).silent){ + event.finish(); + } + else{ + var info=get.info(trigger.skill); + var event=trigger,trigger=event._trigger; + var str; + var check=info.check; + if(info.prompt) str=info.prompt; + else{ + if(typeof info.logTarget=='string'){ + str=get.prompt(event.skill,trigger[info.logTarget],player); + } + else if(typeof info.logTarget=='function'){ + var logTarget=info.logTarget(trigger,player); + if(get.itemtype(logTarget).indexOf('player')==0) str=get.prompt(event.skill,logTarget,player); + } + else{ + str=get.prompt(event.skill,null,player); + } + } + if(typeof str=='function'){str=str(trigger,player)} + var next=player.chooseBool('评鉴:'+str); + next.set('yes',!info.check||info.check(trigger,player)); + next.set('hsskill',event.skill); + next.set('forceDie',true); + next.set('ai',function(){ + return _status.event.yes; + }); + if(typeof info.prompt2=='function'){ + next.set('prompt2',info.prompt2(trigger,player)); + } + else if(typeof info.prompt2=='string'){ + next.set('prompt2',info.prompt2); + } + else if(info.prompt2!=false){ + if(lib.dynamicTranslate[event.skill]) next.set('prompt2',lib.dynamicTranslate[event.skill](player,event.skill)); + else if(lib.translate[event.skill+'_info']) next.set('prompt2',lib.translate[event.skill+'_info']); + } + if(trigger.skillwarn){ + if(next.prompt2){ + next.set('prompt2',''+trigger.skillwarn+'。'+next.prompt2); + } + else{ + next.set('prompt2',trigger.skillwarn); + } + } + } + "step 1" + if(result.bool){ + trigger.revealed=true; + } + else{ + trigger.untrigger(); + trigger.cancelled=true; + } + } + }, + }, + }, + jsrgchaozheng:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + logTarget:function(event,player){ + return game.filterPlayer(i=>i!=player); + }, + prompt:'是否发动【朝争】?', + content:function(){ + player.chooseToDebate(game.filterPlayer(i=>i!=player)).set('callback',lib.skill.jsrgchaozheng.callback); + }, + callback:function(){ + var result=event.debateResult; + if(result.bool&&result.opinion){ + var opinion=result.opinion,targets=result.red.map(i=>i[0]); + targets.sortBySeat(); + targets.forEach(i=>i[opinion=='red'?'recover':'loseHp']()); + if(targets.length==0||result.black.length==0) player.draw(result.targets.length); + } + } + }, + jsrgshenchong:{ + audio:2, + enable:'phaseUse', + limited:true, + filterTarget:lib.filter.notMe, + skillAnimation:true, + animationColor:'soil', + content:function(){ + 'step 0' + player.awakenSkill('jsrgshenchong'); + target.addSkillLog('jsrgfeiyang'); + target.addSkillLog('jsrgbahu'); + 'step 1' + player.addSkill('jsrgshenchong_die'); + player.markAuto('jsrgshenchong_die',[target]); + }, + ai:{ + order:1, + result:{target:1} + }, + subSkill:{ + die:{ + audio:'jsrgshenchong', + trigger:{player:'die'}, + charlotte:true, + forced:true, + forceDie:true, + filter:function(event,player){ + return player.getStorage('jsrgshenchong_die').length; + }, + content:function(){ + var targets=player.getStorage('jsrgshenchong_die'); + player.line(targets); + targets.sortBySeat().forEach(current=>{ + current.clearSkills(true); + current.chooseToDiscard(current.countCards('h'),'h',true); + }); + } + } + } + }, + jsrgfeiyang:{ + trigger:{player:'phaseJudgeBegin'}, + direct:true, + filter:function(event,player){ + return player.countCards('j')&&player.countCards('h')>1; + }, + content:function(){ + 'step 0' + player.chooseToDiscard('h',2,get.prompt('jsrgfeiyang'),'弃置两张手牌并弃置判定区里的一张牌').set('logSkill','jsrgfeiyang').set('ai',function(card){ + return 6-get.value(card); + }); + 'step 1' + if(result.bool){ + player.discardPlayerCard(player,'j',true); + } + }, + }, + jsrgbahu:{ + trigger:{player:'phaseZhunbeiBegin'}, + forced:true, + content:function(){ + player.draw(); + }, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+1; + }, + }, + }, + jsrgjulian:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + filter:function(event,player){ + return player.hasZhuSkill('jsrgjulian')&&lib.skill.jsrgjulian.logTarget(null,player).length; + }, + prompt:'是否发动【聚敛】?', + prompt2:'你可以获得其他所有群势力角色的各一张牌', + logTarget:function(event,player){ + return game.filterPlayer(current=>{ + return current.group=='qun'&¤t.countGainableCards(player,'h')>0&¤t!=player; + }) + }, + content:function(){ + game.filterPlayer(current=>{ + return current.group=='qun'&¤t!=player; + }).sortBySeat().forEach(i=>{ + player.gainPlayerCard(i,'h',true); + }); + }, + group:'jsrgjulian_draw', + zhuSkill:true, + subSkill:{ + draw:{ + audio:'jsrgjulian', + trigger:{global:'gainAfter'}, + filter:function(event,player){ + var source=event.player; + if(source==player||source.group!='qun') return false; + var evt=event.getParent('phaseDraw'); + return (!evt||evt.player!=source)&&event.getParent().name=='draw'&&event.getParent(2).name!='jsrgjulian_draw'&&player.hasZhuSkill('jsrgjulian',event.player); + }, + direct:true, + usable:2, + content:function(){ + 'step 0' + var source=trigger.player; + event.source=source; + source.chooseBool('是否响应'+get.translation(player)+'的【聚敛】摸一张牌?'); + 'step 1' + if(result.bool){ + source.logSkill('jsrgjulian_draw',player); + source.draw(); + } + else player.storage.counttrigger.jsrgjulian_draw--; + } + }, + give:{ + charlotte:true, + onremove:true + } + } + }, + //何进 + jsrgzhaobing:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + direct:true, + filter:function(event,player){ + var hs=player.getCards('h'); + if(!hs.length) return false; + for(var i of hs){ + if(!lib.filter.cardDiscardable(i,player,'jsrgzhaobing')) return false; + } + return true; + }, + content:function(){ + 'step 0' + var cards=player.getCards('h'); + var num=cards.length; + var prompt2='弃置所有手牌,令至多'+get.cnNumber(num)+'名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力'; + player.chooseTarget(get.prompt('jsrgzhaobing'),prompt2,[1,num],lib.filter.notMe).set('ai',target=>{ + if(!_status.event.goon) return 0; + return 2-get.attitude(_status.event.player,target); + }).set('goon',num/2{ + return 2-get.attitude(player,current)>0; + })); + 'step 1' + if(result.bool){ + player.logSkill('jsrgzhaobing',result.targets); + event.targets=result.targets; + event.targets.sortBySeat(); + player.chooseToDiscard(true,'h',player.countCards('h')); + } + else event.finish(); + 'step 2' + var target=targets.shift(); + event.target=target; + target.chooseCard('诏兵:交给'+get.translation(player)+'一张【杀】,或失去1点体力',(card)=>{ + return get.name(card)=='sha'; + }).set('ai',card=>{ + if(_status.event.goon) return 0; + return 6-get.value(card); + }).set('goon',get.effect(target,{name:'losehp'},target,target)>=0); + 'step 3' + if(result.bool) target.give(result.cards,player,true); + else target.loseHp(); + if(targets.length) event.goto(2); + }, + ai:{ + expose:0.2 + } + }, + jsrgzhuhuan:{ + audio:'mouzhu', + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + var hs=player.getCards('h','sha'); + if(!hs.length) return false; + for(var i of hs){ + if(!lib.filter.cardDiscardable(i,player,'jsrgzhuhuan')) return false; + } + return true; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgzhuhuan'),lib.filter.notMe).set('ai',target=>{ + var player=_status.event.player; + return get.damageEffect(target,player,player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jsrgzhuhuan',target); + var hs=player.getCards('h','sha'); + event.num=hs.length; + player.discard(hs); + } + else event.finish(); + 'step 2' + target.chooseToDiscard(get.translation(player)+'对你发动了【诛宦】','弃置'+get.cnNumber(num)+'张牌并失去1点体力;或点击“取消”令其回复1点体力且其摸'+get.cnNumber(num)+'张牌').set('ai',card=>{ + if(_status.event.goon) return 0; + return 5.5-get.value(card); + }).set('goon',target.hp<=2||get.attitude(target,player)>=0||player.isHealthy()); + 'step 3' + if(result.bool){ + target.loseHp(); + } + else{ + player.draw(num); + player.recover(); + } + }, + ai:{ + expose:0.2 + } + }, + jsrgyanhuo:{ + inherit:'spyanhuo', + forced:true, + }, + //孙坚 + jsrgpingtao:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:lib.filter.notMe, + content:function(){ + 'step 0' + var att=get.attitude(target,player); + target.chooseCard(get.translation(player)+'对你发动了【平讨】','交给其一张牌并令其此回合使用【杀】的次数上限+1;或点击“取消”令其视为对你使用一张【杀】','he').set('ai',card=>{ + if(_status.event.give){ + if(card.name=='sha'||card.name=='tao'||card.name=='jiu') return 0; + return 8-get.value(card); + } + if(_status.event.att<0&&card.name=='sha') return -1; + return 4-get.value(card); + }).set('give',(att>=0||target.hp==1&&target.countCards('hs','shan')<=1)&&get.effect(target,{name:'sha'},player,target)<0).set('att',att); + 'step 1' + if(result.bool){ + target.give(result.cards,player); + player.addTempSkill('jsrgpingtao_sha'); + player.addMark('jsrgpingtao_sha',1,false); + } + else if(player.canUse('sha',target,false)){ + player.useCard({name:'sha',isCard:true},target,false); + } + }, + ai:{ + expose:0.15, + order:5, + result:{target:-1} + }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + marktext:'讨', + intro:{ + content:'本回合使用【杀】的次数上限+#', + }, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('jsrgpingtao_sha'); + }, + } + } + } + }, + jsrgjuelie:{ + audio:2, + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + return event.card&&event.card.name=='sha'&&event.getParent().type=='card'&&(player.isMinHandcard()||player.isMinHp()); + }, + forced:true, + locked:false, + group:'jsrgjuelie_discard', + content:function(){ + trigger.num++; + }, + shaRelated:true, + ai:{ + unequip_ai:true, + skillTagFilter:function(player,tag,arg){ + if(!arg||!arg.name||arg.name!='sha') return false; + if(!arg.target) return false; + var card=arg.target.getEquip(2); + return card&&get.value(card)>0&&player.hasCard(cardx=>{ + return lib.filter.cardDiscardable(cardx,player,'jsrgjuelie_discard')&&get.value(cardx)<5; + }); + }, + }, + subSkill:{ + discard:{ + audio:'jsrgjuelie', + trigger:{player:'useCardToPlayered'}, + filter:function(event,player){ + return player.countCards('he')&&event.card.name=='sha'; + }, + direct:true, + content:function(){ + 'step 0' + player.chooseToDiscard(get.prompt('jsrgjuelie',trigger.target),'当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌',[1,Infinity],'he').set('ai',card=>{ + if(ui.selected.cards.length>=_status.event.max) return 0; + if(_status.event.goon) return 4.5-get.value(card); + return 0; + }).set('max',trigger.target.countDiscardableCards(player,'he')).set('goon',get.attitude(player,trigger.target)<0).set('logSkill',['jsrgjuelie_discard',trigger.target]); + 'step 1' + if(result.bool){ + var num=result.cards.length; + if(trigger.target.countDiscardableCards(player,'he')) player.discardPlayerCard('平讨:弃置'+get.translation(trigger.target)+get.cnNumber(num)+'张牌',num,'he',trigger.target,true); + } + } + } + } + }, + //皇甫嵩 + jsrgguanhuo:{ + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + return event.card.storage&&event.card.storage.jsrgguanhuo&&!game.hasPlayer2(current=>{ + return current.hasHistory('damage',evt=>evt.card==event.card); + }); + }, + forced:true, + locked:false, + group:'jsrgguanhuo_viewas', + content:function(){ + 'step 0' + var count=player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length; + if(count==1){ + player.addTempSkill('jsrgguanhuo_ex','phaseUseAfter'); + player.addMark('jsrgguanhuo_ex',1,false); + trigger.targets.forEach(i=>i.removeSkill('huogong2')); + } + else{ + player.removeSkill('jsrgguanhuo'); + game.log(player,'失去了技能','#g【观火】'); + } + }, + ai:{ + effect:{ + player:function(card,player){ + if(_status.event.getParent().skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length==1) return 'zeroplayertarget'; + if(_status.event.type=='phase'&&_status.event.skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length>1&&player.countCards('h')<=3) return [0,0]; + } + } + }, + subSkill:{ + viewas:{ + audio:'jsrgguanhuo', + enable:'phaseUse', + viewAs:{ + name:'huogong', + isCard:true, + storage:{ + jsrgguanhuo:true + } + }, + filterCard:()=>false, + selectCard:-1, + prompt:'视为使用一张【火攻】', + ai:{ + order:function(item,player){ + return get.order({name:'huogong'})+0.01; + }, + } + }, + ex:{ + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + return event.card&&event.card.name=='huogong'&&event.getParent().type=='card'; + }, + forced:true, + charlotte:true, + onremove:true, + intro:{content:'当你造成渠道为【火攻】的伤害时,此伤害+#'}, + content:function(){ + trigger.num+=player.countMark('jsrgguanhuo_ex'); + } + } + } + }, + jsrgjuxia:{ + audio:2, + trigger:{target:'useCardToTargeted'}, + usable:1, + countSkill:function(player){ + return player.getSkills(null,false,false).filter(function(skill){ + var info=get.info(skill); + if(!info||info.charlotte) return false; + if(info.zhuSkill) return player.hasZhuSkill(skill); + return true; + }).length; + }, + filter:function(event,player){ + return event.player!=player&&lib.skill.jsrgjuxia.countSkill(event.player)>lib.skill.jsrgjuxia.countSkill(player); + }, + direct:true, + content:function(){ + 'step 0' + var goon=get.effect(player,trigger.card,trigger.player,trigger.player)<1; + if(goon&&!event.isMine()&&!event.isOnline()) game.delayx(); + trigger.player.chooseBool('是否对'+get.translation(player)+'发动【居下】?','令'+get.translation(trigger.card)+'对其无效,然后其摸两张牌').set('ai',()=>{ + return _status.event.goon; + }).set('goon',goon); + 'step 1' + if(result.bool){ + trigger.player.logSkill('jsrgjuxia',player); + trigger.excluded.add(player); + player.draw(2); + } + else player.storage.counttrigger.jsrgjuxia--; + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(lib.skill.jsrgjuxia.countSkill(target)>=lib.skill.jsrgjuxia.countSkill(player)) return; + if(card&&(card.cards||card.isCard)&&get.attitude(target,player)>0&&(!target.storage.counttrigger||!target.storage.counttrigger.jsrgjuxia)) return [0,0.5,0,0.5]; + }, + }, + } + }, + //许劭 + jsrgyingmen:{ + audio:2, + trigger:{ + global:'phaseBefore', + player:['enterGame','phaseBegin'], + }, + forced:true, + filter:function(event,player,name){ + if(player.getStorage('jsrgyingmen').length>=4) return false; + if(name=='phaseBefore') return game.phaseNumber==0; + return event.name!='phase'||event.player==player; + }, + update:function(player){ + var id=player.playerid; + var characters=player.getStorage('jsrgyingmen'); + var skillName='jsrgpingjian_'+id; + var skillsx=[],skillsx2=[]; + var map={}; + var skillsy=lib.skill[skillName]?lib.skill[skillName].group:[]; + for(var name of characters){ + var skills=lib.character[name][3].slice(); + skills=skills.filter(skill=>{ + var list=get.skillCategoriesOf(skill,player); + list.removeArray(['锁定技','Charlotte']); + if(list.length) return false; + var info=get.info(skill); + return info&&(!info.unique||info.gainable); + }); + game.expandSkills(skills); + for(var i=0;i{ + return lib.skill.jsrgyingmen.bannedList.contains(skill); + })) continue; + list.push(name); + _status.characterlist.remove(name); + if(list.length>=4-num) break; + } + if(list.length){ + player.markAuto('jsrgyingmen',list); + if(player.hasSkill('jsrgpingjian',null,false,false)) lib.skill.jsrgyingmen.update(player); + game.log(player,'将','#g'+get.translation(list),'置为','#y访客'); + game.broadcastAll(function(player,list){ + var cards=[]; + for(var i=0;i{ + return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; + })) return true; + } + return false; + }, + content:function(){ + 'step 0' + var current; + var skill=trigger.skill,name=trigger.event?trigger.event.name:''; + var visitors=player.getStorage('jsrgyingmen'); + for(var visitor of visitors){ + var skills=lib.character[visitor][3].slice(); + game.expandSkills(skills); + var info=get.info(skill); + if(info&&info.charlotte) continue; + if(skills.some(skillx=>{ + return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; + })){ + current=visitor; + break; + } + } + event.current=current; + player.chooseButton(['###评鉴:移去一名访客###
    若移去的访客为'+get.translation(current)+',则你摸一张牌
    ',[player.getStorage('jsrgyingmen'),'character']],true).set('ai',button=>{ + if(button.link==_status.event.toremove) return 1; + return Math.random(); + }).set('toremove',function(){ + var list=player.getStorage('jsrgyingmen'); + var rand=Math.random(); + if(rand<0.33) return list[0]; + if(rand<0.66) return current; + return list.randomGet(); + }()); + 'step 1' + if(result.bool){ + var visitor=result.links[0]; + game.log(player,'从','#y访客','中移去了','#g'+get.translation(visitor)); + player.popup(visitor); + player.unmarkAuto('jsrgyingmen',[visitor]); + _status.characterlist.add(visitor); + if(visitor==event.current) player.draw(); + lib.skill.jsrgyingmen.update(player); + } + }, + subSkill:{ + blocker:{ + init:function(player,skill){ + player.addSkillBlocker(skill); + }, + onremove:function(player,skill){ + player.removeSkillBlocker(skill); + }, + charlotte:true, + locked:true, + skillBlocker:function(skill,player){ + if(skill!='jsrgpingjian_'+player.playerid) return false; + if(player._jsrgpingjian_blockerChecking) return; + player._jsrgpingjian_blockerChecking=true; + var own=player.hasSkill('jsrgpingjian'); + delete player._jsrgpingjian_blockerChecking; + return !own; + } + }, + } + }, + //董白 + jsrgshichong:{ + audio:2, + zhuanhuanji:true, + trigger:{player:'useCardToPlayered'}, + direct:true, + filter:function(event,player){ + return event.target!=player&&event.targets.length==1&&event.target.isIn()&&event.target.countCards('h'); + }, + mark:true, + marktext:'☯', + intro:{ + content:function(storage,player){ + var str='转换技。当你使用牌指定其他角色为唯一目标后,'; + if(storage) return str+'目标角色可以交给你一张手牌。'; + return str+'你可以获得目标角色一张手牌。'; + }, + }, + content:function(){ + 'step 0' + if(!player.storage.jsrgshichong){ + player.chooseBool(get.prompt('jsrgshichong',trigger.target),'你可以获得该角色的一张手牌').set('ai',()=>{ + return _status.event.bool; + }).set('bool',get.attitude(player,trigger.target)<=0); + } + else{ + trigger.target.chooseCard('是否发动'+get.translation(player)+'的【恃宠】?','你可以选择一张手牌,并交给该角色').set('ai',card=>{ + if(_status.event.goon) return 5-get.value(card); + return 0-get.value(card); + }).set('goon',get.attitude(trigger.target,player)>2); + } + 'step 1' + if(result.bool){ + if(!player.storage.jsrgshichong){ + player.logSkill('jsrgshichong',trigger.target); + player.gainPlayerCard(trigger.target,'h',true); + } + else{ + trigger.target.logSkill('jsrgshichong',player); + trigger.target.give(result.cards,player); + } + player.changeZhuanhuanji('jsrgshichong'); + } + } + }, + jsrglianzhu:{ + audio:2, + enable:'phaseUse', + usable:1, + filterCard:{color:'black'}, + position:'h', + filterTarget:lib.filter.notMe, + lose:false, + discard:false, + delay:false, + content:function(){ + 'step 0' + player.showCards(cards,get.translation(player)+'发动了【连诛】'); + 'step 1' + player.give(cards,target); + 'step 2' + event.targets=game.filterPlayer(current=>{ + return current.group==target.group&¤t!=player; + }).sortBySeat(); + game.delayx(); + 'step 3' + var target=targets.shift(); + if(player.canUse('guohe',target)){ + player.useCard({name:'guohe',isCard:true},target); + } + if(targets.length) event.redo(); + }, + ai:{ + order:4, + result:{ + target:function(player,target){ + var targets=game.filterPlayer(current=>{ + return current.group==target.group&¤t!=player; + }); + var eff=targets.reduce((p,c)=>{ + return p+get.effect(c,{name:'guohe'},player,player); + }) + if(ui.selected.cards.length) eff+=get.value(ui.selected.cards[0],target); + return eff; + } + } + } + }, + //桥玄 + jsrgjuezhi:{ + audio:2, + trigger:{source:'damageBegin1'}, + filter:function(event,player){ + if(_status.currentPhase!=player||player.hasSkill('jsrgjuezhi_used',null,null,false)) return false; + return event.card&&event.getParent().type=='card'&&lib.skill.jsrgjuezhi.getNum(event.player,player)>0; + }, + forced:true, + locked:false, + getNum:function(target,player){ + return target.countCards(card=>{ + var subtype=get.subtypes(card); + for(var i of subtype){ + if(player.hasDisabledSlot(i)) return true; + } + return false; + }); + }, + group:'jsrgjuezhi_disable', + content:function(){ + player.addTempSkill('jsrgjuezhi_used',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); + trigger.num+=lib.skill.jsrgjuezhi.getNum(trigger.player,player); + }, + subSkill:{ + disable:{ + audio:'jsrgjuezhi', + trigger:{ + player:'loseAfter', + global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + direct:true, + filter:function(event,player){ + var evt=event.getl(player); + return evt&&evt.es&&evt.es.length>0; + }, + content:function(){ + 'step 0' + event.cards=trigger.getl(player).es; + 'step 1' + var card=cards.shift(),subtypes=get.subtypes(card).filter(slot=>player.hasEnabledSlot(slot)); + event.subtypes=subtypes; + if(subtypes.length>0){ + player.chooseBool(get.prompt('jsrgjuezhi_disable'),'废除你的'+get.translation(subtypes)+'栏').set('ai',()=>1); + } + else event._result={bool:false}; + 'step 2' + if(result.bool){ + player.logSkill('jsrgjuezhi_disable'); + player.disableEquip(event.subtypes); + } + if(cards.length>0) event.goto(1); + }, + }, + used:{charlotte:true} + } + }, + jsrgjizhao:{ + audio:2, + trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('jsrgjizhao')).set('ai',target=>{ + var player=_status.event.player; + if(player.countCards('j')) return player==target?10:0.1; + return 6-get.attitude(player,target); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jsrgjizhao',target); + target.chooseToUse({ + filterCard:function(card,player,event){ + if(get.itemtype(card)!='card'||get.position(card)!='h'&&get.position(card)!='s') return false; + return lib.filter.filterCard.apply(this,arguments); + }, + prompt:'急召:使用一张手牌,否则'+get.translation(player)+'可以移动你区域里的一张牌', + addCount:false, + goon:target!=player||!player.countCards('j'), + ai1:function(card){ + if(_status.event.goon) return get.order(card); + return 0; + } + }); + } + 'step 2' + if(result.bool){event.finish();return;} + var targets=game.filterPlayer(current=>{ + if(current==target) return false; + var hs=target.getCards('h'); + if(hs.length) return true; + var js=target.getCards('j'); + for(var i=0;i0) return att; + return 0; + } + return -att*att2; + }); + next.set('targetprompt','移动目标'); + next.set('prompt','急召:是否移动'+get.translation(target)+'的一张牌?'); + } + else event.finish(); + 'step 3' + if(result.bool){ + var target2=result.targets[0]; + event.targets=[target,target2]; + player.line2(event.targets,'green'); + } + else{ + event.finish(); + } + 'step 4' + game.delay(); + 'step 5' + if(targets.length==2){ + player.choosePlayerCard('hej',true,function(button){ + var player=_status.event.player; + var targets0=_status.event.targets0; + var targets1=_status.event.targets1; + if(get.attitude(player,targets0)>0&&get.attitude(player,targets1)<0){ + if(get.position(button.link)=='j') return 12; + if(get.value(button.link,targets0)<0&&get.effect(targets1,button.link,player,targets1)>0) return 10; + return 0; + } + else{ + if(get.position(button.link)=='j') return -10; + if(get.position(button.link)=='h') return 10; + return get.value(button.link)*get.effect(targets1,button.link,player,targets1); + } + },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ + var targets1=_status.event.targets1; + if(get.position(button.link)=='h'){ + return true; + } + else if(get.position(button.link)=='j'){ + return targets1.canAddJudge(button.link); + } + else{ + return targets1.canEquip(button.link); + } + }); + } + else{ + event.finish(); + } + 'step 6' + if(result.bool&&result.links.length){ + var link=result.links[0]; + if(get.position(link)=='h'){ + event.targets[1].gain(link); + } + else if(get.position(link)=='e'){ + event.targets[1].equip(link); + } + else if(link.viewAs){ + event.targets[1].addJudge({name:link.viewAs},[link]); + } + else{ + event.targets[1].addJudge(link); + } + event.targets[0].$give(link,event.targets[1],false); + game.log(event.targets[0],'的',get.position(link)=='h'?'一张手牌':link,'被移动给了',event.targets[1]); + game.delay(); + } + }, + ai:{ + effect:{ + target:function(card,player,target,current){ + if(get.type(card)=='delay'&¤t<0){ + if(target.countCards('j')) return; + return 'zerotarget'; + } + }, + }, + } + }, + //杨彪 + jsrgzhaohan:{ + audio:'zhaohan', + trigger:{player:'phaseZhunbeiBegin'}, + forced:true, + locked:false, + filter:function(event,player){ + if(game.shuffleNumber==0) return player.isDamaged(); + return true; + }, + content:function(){ + player[game.shuffleNumber>0?'loseHp':'recover'](); + } + }, + jsrgrangjie:{ + audio:'rangjie', + trigger:{player:'damageEnd'}, + filter:function(event,player){ + return player.canMoveCard(); + }, + check:function(event,player){ + return player.canMoveCard(true); + }, + content:function(){ + 'step 0' + event.num=trigger.num; + 'step 1' + event.num--; + if(player.canMoveCard()) player.moveCard(true); + 'step 2' + if(result.bool){ + var card=result.card; + var suit=get.suit(card,false); + var cards=Array.from(ui.discardPile.childNodes); + var gains=[]; + var history=game.getGlobalHistory('cardMove',evt=>{ + if(evt.name=='lose') return evt.position==ui.discardPile; + return evt.name=='cardsDiscard'; + }); + for(var i=history.length-1;i>=0;i--){ + var evt=history[i]; + var cards2=evt.cards.filter(card=>{ + return cards.contains(card)&&get.suit(card,false)==suit; + }); + if(cards2.length){ + gains.addArray(cards2); + cards.removeArray(cards2); + } + if(!cards.length) break; + } + if(gains.length){ + player.chooseButton(['让节:是否获得一张'+get.translation(suit)+'牌?',gains]).set('ai',get.buttonValue); + } + else event._result={bool:false}; + } + 'step 3' + if(result.bool){ + player.gain(result.links,'gain2'); + } + 'step 4' + if(event.num>0&&player.hasSkill('jsrgrangjie')){ + player.chooseBool(get.prompt2('jsrgrangjie')).set('ai',()=>_status.event.bool).set('bool',lib.skill.jsrgrangjie.check(trigger,player)); + } + else event.finish(); + 'step 5' + if(result.bool){ + player.logSkill('jsrgrangjie'); + event.goto(1); + } + }, + ai:{ + maixie:true, + maixie_hp:true, + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')){ + if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; + if(target._jsrgrangjie_aiChecking) return; + target._jsrgrangjie_aiChecking=true; + var moveCard=target.canMoveCard(true); + delete target._jsrgrangjie_aiChecking; + if(!moveCard||!target.hasFriend()) return; + var num=1; + if(get.attitude(player,target)>0){ + if(player.needsToDiscard()){ + num=0.5; + } + else{ + num=0.3; + } + } + if(target.hp>=4) return [1,num*2]; + if(target.hp==3) return [1,num*1.5]; + if(target.hp==2) return [1,num*0.5]; + } + }, + }, + }, + }, + jsrgyizheng:{ + audio:'yizheng', + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return game.hasPlayer(function(current){ + return current.countCards('h')>player.countCards('h')&&player.canCompare(current); + }); + }, + filterTarget:function(card,player,current){ + return current.countCards('h')>player.countCards('h')&&player.canCompare(current); + }, + content:function(){ + 'step 0' + player.chooseToCompare(target); + 'step 1' + if(result.bool){ + target.skip('phaseDraw'); + target.addTempSkill('yizheng2',{player:'phaseDrawSkipped'}); + event.finish(); + } + else{ + target.chooseControl('1','2','cancel').set('prompt','是否对'+get.translation(player)+'造成至多2点伤害?').set('ai',()=>{ + return _status.event.choice; + }).set('choice',get.damageEffect(player,target,target)>0?(get.attitude(target,player)>0?0:1):'cancel2'); + } + 'step 2' + if(result.control!='cancel2'){ + var num=result.index+1; + target.line(player); + player.damage(target,num); + } + }, + ai:{ + order:1, + result:{ + target:function(player,target){ + if(target.skipList.contains('phaseDraw')||target.hasSkill('pingkou')) return 0; + var hs=player.getCards('h').sort(function(a,b){ + return b.number-a.number; + }); + var ts=target.getCards('h').sort(function(a,b){ + return b.number-a.number; + }); + if(!hs.length||!ts.length) return 0; + if(hs[0].number>ts[0].number) return -1; + return 0; + }, + }, + }, + }, + //孔融 + jsrglirang:{ + audio:'splirang', + trigger:{global:'phaseDrawBegin'}, + direct:true, + filter:function(event,player){ + return event.player!=player&&!player.hasSkill('jsrglirang_used')&&player.countCards('he')>1; + }, + content:function(){ + 'step 0' + player.chooseCard(get.prompt('jsrglirang',trigger.player),'你可以选择两张牌,将这些牌交给该角色。若如此做,你获得其本回合弃牌阶段弃置的所有牌。',2,'he').set('ai',card=>{ + if(!_status.event.give) return 0; + var player=_status.event.player,target=_status.event.target; + return target.getUseValue(card)-player.getUseValue(card)+0.5; + }).set('give',get.attitude(player,trigger.player)>0).set('target',trigger.player); + 'step 1' + if(result.bool){ + player.logSkill('jsrglirang',trigger.player); + var cards=result.cards; + player.give(cards,trigger.player); + player.addTempSkill('jsrglirang_used','roundStart'); + player.addTempSkill('jsrglirang_given'); + player.markAuto('jsrglirang_used',[trigger.player]); + } + }, + subSkill:{ + used:{ + charlotte:true, + onremove:true, + intro:{content:'本轮〖礼让〗目标:$'}, + }, + given:{ + audio:'splirang', + trigger:{global:'phaseDiscardEnd'}, + filter:function(event,player){ + return event.player.hasHistory('lose',evt=>{ + return evt.type=='discard'&&evt.getParent('phaseDiscard')==event&&evt.cards2.filterInD('d').length>0; + }); + }, + charlotte:true, + prompt2:function(event,player){ + var cards=[]; + event.player.getHistory('lose',evt=>{ + if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards2.filterInD('d')); + }); + return '获得'+get.translation(cards); + }, + content:function(){ + var cards=[]; + trigger.player.getHistory('lose',evt=>{ + if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) cards.addArray(evt.cards2.filterInD('d')); + }); + player.gain(cards,'gain2'); + } + } + } + }, + jsrgzhengyi:{ + audio:2, + trigger:{player:'damageBegin4'}, + filter:function(event,player){ + var list=player.getStorage('jsrglirang_used'); + if(!list.length) return false; + return !player.getHistory('damage').length&&list[0].isIn(); + }, + direct:true, + content:function(){ + 'step 0' + var target=player.getStorage('jsrglirang_used')[0]; + event.target=target; + target.chooseBool('是否对'+get.translation(player)+'发动【争义】?','将此'+(trigger.source?'来源为'+get.translation(trigger.source):'无来源')+'的'+trigger.num+'点伤害转移给你').set('ai',()=>{ + return _status.event.bool; + }).set('bool',get.damageEffect(player,trigger.source,target)>get.damageEffect(target,trigger.source,target)); + 'step 1' + if(result.bool){ + target.logSkill('jsrgzhengyi',player); + trigger.cancel(); + target.damage(trigger.source,trigger.nature,trigger.num).set('card',trigger.card).set('cards',trigger.cards); + } + } + }, + //朱儁 + jsrgfendi:{ + audio:2, + trigger:{player:'useCardToPlayered'}, + filter:function(event,player){ + return event.targets.length==1&&event.card.name=='sha'&&event.targets[0].countCards('h')>0; + }, + usable:1, + logTarget:'target', + content:function(){ + 'step 0' + var target=trigger.target; + event.target=target; + player.choosePlayerCard(target,'h',true,[1,Infinity],'分敌:展示'+get.translation(target)+'的任意张手牌').set('ai',button=>{ + if(_status.event.all) return 1; + if(ui.selected.buttons.length) return 0; + return Math.random(); + }).set('all',!target.mayHaveShan()&&Math.random()<0.75).set('forceAuto',true); + 'step 1' + if(result.bool){ + var cards=result.cards; + target.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【分敌】'); + target.addGaintag(cards,'jsrgfendi_tag'); + target.addTempSkill('jsrgfendi_blocker'); + player.addTempSkill('jsrgfendi_gain'); + if(!trigger.card.storage) trigger.card.storage={}; + trigger.card.storage.jsrgfendi=true; + player.storage.jsrgfendi_gain=target; + } + else player.storage.counttrigger.jsrgfendi--; + }, + subSkill:{ + blocker:{ + trigger:{ + player:['damageBefore','damageCancelled','damageZero'], + target:['shaMiss','useCardToExcluded','useCardToEnd'], + global:['useCardEnd'], + }, + forced:true, + popup:false, + charlotte:true, + content:function(){ + player.removeSkill('jsrgfendi_blocker'); + }, + mod:{ + cardEnabled:function(card,player){ + if(card.cards){ + for(var i of card.cards){ + if(!i.hasGaintag('jsrgfendi_tag')) return false; + } + } + else if(get.itemtype(card)=='card'){ + if(!card.hasGaintag('jsrgfendi_tag')) return false; + } + }, + cardRespondable:function(card,player){ + return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); + }, + cardSavable:function(card,player){ + return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); + }, + }, + }, + gain:{ + trigger:{global:'damageSource'}, + charlotte:true, + forced:true, + direct:true, + onremove:true, + filter:function(event,player){ + var target=player.storage.jsrgfendi_gain; + return event.card&&event.card.storage&&event.card.storage.jsrgfendi&&target&&target.isIn()&&target.hasCard(card=>{ + return card.hasGaintag('jsrgfendi_tag'); + },'h'); + }, + content:function(){ + player.logSkill('jsrgfendi_gain',player.storage.jsrgfendi_gain); + player.gain(player.storage.jsrgfendi_gain.getCards('h',card=>{ + return card.hasGaintag('jsrgfendi_tag'); + }),'give'); + } + } + } + }, + jsrgjuxiang:{ + audio:2, + trigger:{ + player:'gainAfter', + global:'loseAsyncAfter', + }, + filter:function(event,player){ + var evt=event.getParent('phaseDraw'); + if(evt&&evt.name=='phaseDraw') return false; + var hs=player.getCards('h'); + var cards=event.getg(player).filter(i=>hs.contains(i)); + if(!cards.length) return false; + for(var card of cards){ + if(!lib.filter.cardDiscardable(card,player,'jsrgjuxiang')) return false; + } + return true; + }, + check:function(event,player){ + var target=_status.currentPhase; + if(!target||get.attitude(player,target)<=0) return false; + var evt=event.getParent('phaseDiscard'),evt2=event.getParent('phaseJieshu'); + if(evt&&evt.name=='phaseDiscard'||evt2&&evt.name=='phaseJieshu') return false; + if(target.getCardUsable({name:'sha'})>=target.countCards('hs','sha')) return false; + if(!target.hasValueTarget({name:'sha'})) return false; + var hs=player.getCards('h'); + var cards=event.getg(player).filter(i=>hs.contains(i)); + var val=0; + for(var i of cards) val+=get.value(i); + if(val<10) return true; + return false; + }, + prompt2:function(event,player){ + var hs=player.getCards('h'); + var cards=event.getg(player).filter(i=>hs.contains(i)); + var target=_status.currentPhase; + var str='弃置'+get.translation(cards); + if(target&&target.isIn()){ + var list=[]; + for(var card of cards){ + list.add(get.suit(card,player)); + } + var num=list.length; + str+=',然后令'+get.translation(target)+'于此回合额定的出牌阶段内使用【杀】的次数上限+'+num; + } + return str; + }, + content:function(){ + 'step 0' + var hs=player.getCards('h'); + var cards=trigger.getg(player).filter(i=>hs.contains(i)); + var list=[]; + for(var card of cards){ + list.add(get.suit(card,player)); + } + event.num=list.length; + player.discard(cards); + 'step 1' + var target=_status.currentPhase; + if(target&&target.isIn()){ + target.addTempSkill('jsrgjuxiang_sha'); + target.addMark('jsrgjuxiang_sha',num,false); + var evt=trigger.getParent('phaseUse'); + if(evt&&evt.name=='phaseUse'&&!evt.skill){ + evt.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); + evt.player.addMark('jsrgjuxiang_buff',num,false); + } + } + }, + subSkill:{ + sha:{ + trigger:{global:'phaseUseBegin'}, + filter:function(event,player){ + return !event.skill; + }, + silent:true, + charlotte:true, + forced:true, + onremove:true, + content:function(){ + trigger.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); + trigger.player.addMark('jsrgjuxiang_buff',player.countMark('jsrgjuxiang_sha'),false); + } + }, + buff:{ + charlotte:true, + intro:{content:'使用【杀】的次数上限+#'}, + onremove:true, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('jsrgjuxiang_buff'); + }, + } + } + } + }, + //刘备 + jsrgjishan:{ + audio:2, + trigger:{global:'damageBegin4'}, + usable:1, + filter:function(event,player){ + return player.hp>0; + }, + logTarget:'player', + onremove:true, + prompt2:'失去1点体力并防止此伤害,然后你与其各摸一张牌', + check:function(event,player){ + return get.damageEffect(event.player,event.source,player,event.nature)*Math.sqrt(event.num)<=get.effect(player,{name:'losehp'},player,player); + }, + group:'jsrgjishan_recover', + content:function(){ + 'step 0' + trigger.cancel(); + player.loseHp(); + player.markAuto('jsrgjishan',[trigger.player]); + 'step 1' + if(player.isIn()&&trigger.player.isIn()){ + var targets=[player,trigger.player]; + targets.sortBySeat(_status.currentPhase); + targets[0].draw('nodelay'); + targets[1].draw(); + } + }, + intro:{content:'已帮助$抵挡过伤害'}, + ai:{expose:0.2}, + subSkill:{ + recover:{ + audio:'jsrgjishan', + trigger:{source:'damageSource'}, + filter:function(event,player){ + return game.hasPlayer(current=>{ + return current.isMinHp()&&player.getStorage('jsrgjishan').contains(current); + }); + }, + usable:1, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrgjishan_recover'),'令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力',(card,player,target)=>{ + return target.isMinHp()&&player.getStorage('jsrgjishan').contains(target); + }).set('ai',target=>{ + return get.recoverEffect(target,_status.event.player,_status.event.player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgjishan_recover',target); + target.recover(); + } + else player.storage.counttrigger.jsrgjishan_recover--; + } + } + } + }, + jsrgzhenqiao:{ + audio:2, + trigger:{player:'useCardToTargeted'}, + forced:true, + shaRelated:true, + filter:function(event,player){ + return event.isFirstTarget&&event.card.name=='sha'&&player.hasEmptySlot(1); + }, + content:function(){ + // trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); + // trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); + trigger.getParent().effectCount++; + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(player._jsrgzhenqiao_aiChecking) return; + if(target==player&&get.subtype(card)=='equip1'&&!player.getEquip(1)){ + player._jsrgzhenqiao_aiChecking=true; + var eff=get.effect(target,card,player,player); + delete player._jsrgzhenqiao_aiChecking; + if(eff<3) return 'zerotarget'; + } + } + } + }, + mod:{ + attackRange:function(player,num){ + return num+1; + }, + } + }, + //王允 + jsrgshelun:{ + audio:2, + enable:'phaseUse', + usable:1, + filter:function(event,player){ + return game.hasPlayer(current=>player.inRange(current)); + }, + filterTarget:function(card,player,target){ + return player.inRange(target); + }, + content:function(){ + var num=player.countCards('h'); + var targets=game.filterPlayer(current=>{ + return current.countCards('h')<=num&¤t!=target; + }); + player.chooseToDebate(targets).set('callback',function(){ + var result=event.debateResult; + if(result.bool&&result.opinion){ + var opinion=result.opinion; + var target=event.getParent(2).target; + if(opinion=='red') player.discardPlayerCard(target,'he',true); + else target.damage(); + } + }).set('ai',card=>{ + var player=_status.event.player; + var color=(player==_status.event.source||get.damageEffect(_status.event.getParent(2).target,player,player)>0)?'black':'red'; + var val=5-get.value(card); + if(get.color(card)==color) val+=10; + return val; + }).set('aiCard',target=>{ + var color=(target==_status.event.source||get.damageEffect(_status.event.getParent(2).target,target,target)>0)?'black':'red'; + var hs=target.getCards('h',{color:color}); + if(!hs.length) hs=target.getCards('h'); + return {bool:true,cards:[hs.randomGet()]}; + }).set('target',target); + }, + ai:{ + order:8, + expose:0.2, + result:{target:-1}, + } + }, + jsrgfayi:{ + audio:2, + trigger:{global:'chooseToDebateAfter'}, + filter:function(event,player){ + if(!event.targets.contains(player)) return false; + if(event.red.map(i=>i[0]).contains(player)) return event.black.length; + if(event.black.map(i=>i[0]).contains(player)) return event.red.length; + return false; + }, + direct:true, + content:function(){ + 'step 0' + var targets=[]; + if(trigger.red.map(i=>i[0]).contains(player)) targets=trigger.black; + if(trigger.black.map(i=>i[0]).contains(player)) targets=trigger.red; + player.chooseTarget(get.prompt('jsrgfayi'),'对一名与你意见不同的角色造成1点伤害',(card,player,target)=>{ + return _status.event.targets.contains(target); + }).set('targets',targets.map(i=>i[0])).set('ai',target=>{ + var player=_status.event.player; + return get.damageEffect(target,player,player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgfayi',target); + target.damage(); + } + } + }, + jsrgtushe:{ + audio:'xinfu_tushe', + trigger:{ + player:'useCardToPlayered', + }, + filter:function (event,player){ + if(get.type(event.card)=='equip') return false; + if(event.getParent().triggeredTargets3.length>1) return false; + return event.targets.length>0; + }, + check:function(event,player){ + return !player.countCards('h',{type:'basic'}); + }, + content:function (){ + 'step 0' + player.showHandcards(); + 'step 1' + if(player.countCards('h',{type:'basic'})) event.finish(); + else player.chooseBool('图射:是否摸'+get.cnNumber(trigger.targets.length)+'张牌?').set('ai',()=>1); + 'step 2' + if(result.bool){ + player.draw(trigger.targets.length); + } + }, + ai:{ + presha:true, + pretao:true, + threaten:1.8, + }, + }, + jsrgtongjue:{ + audio:2, + enable:'phaseUse', + usable:1, + zhuSkill:true, + filter:function(event,player){ + return player.hasZhuSkill('jsrgtongjue')&&game.hasPlayer(current=>current!=player&¤t.group=='qun'); + }, + filterCard:true, + selectCard:[1,Infinity], + filterTarget:function(card,player,target){ + return target!=player&&target.group=='qun'; + }, + selectTarget:[1,Infinity], + filterOk:function(){ + return ui.selected.cards.length==ui.selected.targets.length; + }, + check:function(card){ + var player=_status.event.player; + if(player.hasCard(card=>{ + return player.hasValueTarget(card); + },'hs')){ + return 3-player.getUseValue(card); + } + return 3-get.value(card); + }, + multiline:true, + multitarget:true, + delay:false, + discard:false, + lose:false, + content:function(){ + 'step 0' + var list=[]; + for(var i=0;icurrent.getSeatNum()==1); + return event.player==zhu; + }, + locked:false, + group:'jsrgzhenglve_damage', + prompt2:function(event,player){ + var num=Math.min(event.player.getHistory('sourceDamage').length>0?1:2,game.countPlayer(current=>{ + return !current.hasMark('jsrgzhenglve_mark'); + })); + if(num==0) return '你可以摸一张牌'; + return '你可以摸一张牌并令'+get.cnNumber(num)+'名角色获得“猎”标记'; + }, + content:function(){ + 'step 0' + player.draw(); + 'step 1' + var damaged=trigger.player.getHistory('sourceDamage').length>0; + var num=damaged?1:2; + var targets=game.filterPlayer(current=>{ + return !current.hasMark('jsrgzhenglve_mark'); + }); + if(!targets.length) event.finish(); + else if(targets.length<=num) event._result={bool:true,targets:targets}; + else player.chooseTarget('令'+get.cnNumber(num)+'名角色获得“猎”标记',true,num,(card,player,target)=>{ + return !target.hasMark('jsrgzhenglve_mark'); + }).set('ai',target=>{ + var att=get.attitude(_status.event.player,target); + return 100-att; + }); + 'step 2' + if(result.bool){ + var targets=result.targets; + player.line(targets); + targets.forEach(i=>i.addMark('jsrgzhenglve_mark',1)); + } + }, + mod:{ + cardUsableTarget:function(card,player,target){ + if(target.hasMark('jsrgzhenglve_mark')) return true; + }, + targetInRange:function(card,player,target){ + if(target.hasMark('jsrgzhenglve_mark')) return true; + }, + }, + subSkill:{ + damage:{ + audio:'jsrgzhenglve', + trigger:{source:'damageSource'}, + usable:1, + filter:function(event,player){ + return event.player.hasMark('jsrgzhenglve_mark'); + }, + prompt2:function(event,player){ + var cards=event.cards||[]; + return '摸一张牌'+(cards.filterInD().length?'并获得'+get.translation(event.cards.filterInD()):''); + }, + content:function(){ + 'step 0' + player.draw(); + var cards=trigger.cards; + if(cards&&cards.filterInD().length){ + player.gain(cards.filterInD(),'gain2'); + } + } + }, + mark:{ + marktext:'猎', + intro:{ + name:'猎(政略)', + name2:'猎', + markcount:()=>0, + content:'已拥有“猎”标记', + } + } + } + }, + jsrghuilie:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + juexingji:true, + forced:true, + skillAnimation:true, + animationColor:'thunder', + derivation:['jsrgpingrong','feiying'], + filter:function(event,player){ + return game.countPlayer(current=>current.hasMark('jsrgzhenglve_mark'))>2; + }, + content:function(){ + 'step 0' + player.awakenSkill('jsrghuilie'); + player.loseMaxHp(); + 'step 1' + player.addSkillLog('jsrgpingrong'); + player.addSkillLog('feiying'); + } + }, + jsrgpingrong:{ + audio:2, + trigger:{global:'phaseEnd'}, + filter:function(event,player){ + return !player.hasSkill('jsrgpingrong_used')&&game.hasPlayer(current=>current.hasMark('jsrgzhenglve_mark')); + }, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrghuilie'),'移去一名角色的“猎”,然后你执行一个额外回合。若你在此额外回合内未造成伤害,则你失去1点体力。',(card,player,target)=>{ + return target.hasMark('jsrgzhenglve_mark'); + }).set('ai',target=>{ + return get.attitude(_status.event.player,target); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('jsrgpingrong',target); + player.addTempSkill('jsrgpingrong_used','roundStart'); + target.removeMark('jsrgzhenglve_mark',target.countMark('jsrgzhenglve_mark')); + player.insertPhase(); + player.addSkill('jsrgpingrong_check'); + } + }, + subSkill:{ + used:{charlotte:true}, + check:{ + audio:'jsrgpingrong', + trigger:{player:'phaseAfter'}, + charlotte:true, + forced:true, + filter:function(event,player){ + return event.skill=='jsrgpingrong'&&!player.getHistory('sourceDamage').length; + }, + content:function(){ + player.loseHp(); + } + } + } + }, + //南华老仙 + jsrgshoushu:{ + audio:2, + forced:true, + trigger:{global:'roundStart'}, + filter:function(event,player){ + return !game.hasPlayer(function(current){ + return current.countCards('hejsx','taipingyaoshu'); + })&&!Array.from(ui.cardPile.childNodes).concat(Array.from(ui.discardPile.childNodes)) + .concat(Array.from(ui.ordering.childNodes)).map(i=>i.name).contains('taipingyaoshu'); + }, + direct:true, + group:'jsrgshoushu_destroy', + content:function(){ + 'step 0' + player.chooseTarget(get.prompt('jsrgshoushu'),'将【太平要术】置入一名角色的装备区',(card,player,target)=>{ + var card={name:'taipingyaoshu'}; + return target.canEquip(card,true); + }).set('ai',target=>{ + return target.getUseValue({name:'taipingyaoshu'})*get.attitude(_status.event.player,target); + }) + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jsrgshoushu',target); + if(!lib.inpile.contains('taipingyaoshu')){ + lib.inpile.push('taipingyaoshu'); + } + event.card=game.createCard2('taipingyaoshu','heart',3); + } + else event.finish(); + 'step 2' + if(card) target.equip(card); + }, + subSkill:{ + destroy:{ + audio:'jsrgshoushu', + trigger:{ + global:['loseEnd','equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], + }, + forced:true, + filter:function(event,player){ + return game.hasPlayer(current=>{ + var evt=event.getl(current); + if(evt&&evt.es) return evt.es.some(i=>i.name=='taipingyaoshu'); + return false; + }); + }, + content:function(){ + var cards=[]; + game.countPlayer(current=>{ + var evt=trigger.getl(current); + if(evt&&evt.es) return cards.addArray(evt.es.filter(i=>i.name=='taipingyaoshu')); + }); + game.cardsGotoSpecial(cards); + game.log(cards,'被销毁了'); + } + } + } + }, + jsrgxundao:{ + audio:2, + trigger:{player:'judge'}, + filter:function(event,player){ + return game.hasPlayer(current=>current.countCards('he')); + }, + direct:true, + content:function(){ + 'step 0' + var prompt2=get.translation(player)+'(你)的'+(trigger.judgestr||'')+'判定为'+ + get.translation(player.judging[0])+','+'是否令至多两名角色依次弃置一张牌,然后选择其中一张作为新判定牌?'; + player.chooseTarget(get.prompt('jsrgxundao'),prompt2,[1,2],(card,player,target)=>{ + return target.countCards('he'); + }).set('ai',target=>{ + var player=_status.event.player; + if(!_status.event.todiscard) return 0; + if(_status.event.todiscard!='all'){ + if(target==_status.event.todiscard) return 100; + } + return get.effect(target,{name:'guohe_copy2'},player,player)/2; + }).set('todiscard',function(){ + if(trigger.judgestr=='闪电'&&get.damageEffect(player,null,player,'thunder')>=0) return 'all'; + var friends=game.filterPlayer(i=>get.attitude(i,player)>0); + for(var friend of friends){ + var cardsx=friend.getCards('he',card=>trigger.judge(card)>0); + cardsx.sort((a,b)=>{ + return get.value(a)-get.value(b); + }); + if(cardsx.length){ + var card=cardsx[0]; + if(trigger.judge(player.judging[0])>=0){ + if(get.value(card)>4) return false; + } + return get.owner(card); + } + } + return 'all'; + }()) + 'step 1' + if(result.bool){ + var targets=result.targets; + targets.sortBySeat(_status.currentPhase); + event.targets=targets; + player.logSkill('jsrgxundao',targets); + event.cards=[]; + } + else event.finish(); + 'step 2' + var target=targets.shift(); + target.chooseToDiscard('寻道:请弃置一张牌'+(target==player?'':',可能被作为新判定牌'),'he',true).set('ai',target=>{ + var trigger=_status.event.getTrigger(); + var player=_status.event.player; + var judging=_status.event.judging; + var result=trigger.judge(card)-trigger.judge(judging); + var attitude=get.attitude(player,trigger.player); + if(attitude==0||result==0) return 0.1; + if(attitude>0){ + return result+0.01; + } + else{ + return 0.01-result; + } + }); + 'step 3' + if(result.bool){ + event.cards.addArray(result.cards); + } + if(targets.length) event.goto(2); + 'step 4' + var cards=event.cards.filterInD('d'); + if(cards.length){ + player.chooseButton(['寻道:选择一张作为新判定牌',cards],true).set('ai',button=>{ + return trigger.judge(button.link); + }); + } + else event.finish(); + 'step 5' + if(result.bool){ + var card=result.links[0]; + event.card=card; + game.cardsGotoOrdering(card).relatedEvent=trigger; + } + else event.finish(); + 'step 6' + if(player.judging[0].clone){ + game.broadcastAll(function(card,card2,player){ + if(card.clone){ + card.clone.classList.remove('thrownhighlight'); + } + var node=player.$throwordered(card2.copy(),true); + node.classList.add('thrownhighlight'); + ui.arena.classList.add('thrownhighlight'); + },player.judging[0],card,player); + game.addVideo('deletenode',player,get.cardsInfo([player.judging[0].clone])); + } + game.cardsDiscard(player.judging[0]); + player.judging[0]=card; + trigger.orderingCards.add(card); + game.log(player,'的判定牌改为',card); + game.delay(2); + }, + ai:{ + rejudge:true, + tag:{ + rejudge:1, + } + } + }, + jsrglinghua:{ + audio:2, + trigger:{ + player:['phaseZhunbeiBegin','phaseJieshuBegin'], + }, + prompt2:function(event,player){ + var zhunbei=event.name=='phaseZhunbei'; + return '进行目标为你'+(zhunbei?'':'且效果反转')+'的【闪电】判定。若你未因此受到伤害,你可以'+(zhunbei?'令一名角色回复1点体力':'对一名角色造成1点雷电伤害'); + }, + check:function(event,player){ + var e2=player.getEquip(2); + if(e2&&e2.name=='taipingyaoshu') return true; + if(event.name=='phaseZhunbei'&&game.hasPlayer(current=>{ + return get.recoverEffect(current,player,player)>=0; + })) return true; + if(event.name=='phaseJieshu'&&game.hasPlayer(current=>{ + return get.damageEffect(current,player,player,'thunder')>=0; + })&&player.hasSkillTag('rejudge')&&player.hasCard(card=>{ + return lib.card.shandian.judge(card)<0; + },'he')) return true; + return false; + }, + content:function(){ + 'step 0' + var judge=trigger.name=='phaseZhunbei'?lib.card.shandian.judge:function(card){ + if(get.suit(card)!='spade'||get.number(card)<=1||get.number(card)>=10) return -5; + return 1; + } + player.judge(judge,get.translation('shandian')).set('judge2',lib.card.shandian.judge2); + game.delayx(1.5); + 'step 1' + var name='shandian'; + if(event.cancelled&&!event.direct){ + if(lib.card[name].cancel){ + var next=game.createEvent(name+'Cancel'); + next.setContent(lib.card[name].cancel); + next.cards=[]; + next.card=get.autoViewAs({name:name}); + next.player=player; + } + } + else{ + var next=game.createEvent(name); + next.setContent(function(){ + if(result.bool==false){ + player.damage(3,'thunder','nosource'); + } + }); + next._result=result; + next.cards=[]; + next.card=get.autoViewAs({name:name}); + next.player=player; + } + 'step 2' + if(!player.hasHistory('damage',evt=>{ + return evt.card&&evt.card.name=='shandian'&&evt.getParent(2)==event; + })){ + if(trigger.name=='phaseZhunbei'){ + player.chooseTarget('灵化:是否令一名角色回复1点体力?').set('ai',target=>{ + var player=_status.event.player; + return get.recoverEffect(target,player,player); + }); + } + else{ + player.chooseTarget('灵化:是否对一名角色造成1点雷电伤害?').set('ai',target=>{ + var player=_status.event.player; + return get.damageEffect(target,player,player,'thunder'); + }); + } + } + else event.finish(); + 'step 3' + if(result.bool){ + var target=result.targets[0]; + player.line(target); + if(trigger.name=='phaseZhunbei') target.recover(); + else target.damage('thunder'); + } + }, + ai:{ + threaten:2.8 + } + }, + }, + characterReplace:{}, + dynamicTranslate:{ + jsrgshichong:function(player){ + if(player.storage.jsrgshichong) return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; + return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; + }, + }, + translate:{ + //江山如故·起 + jsrg_liuhong:'起刘宏', + jsrg_liuhong_ab:'刘宏', + jsrgchaozheng:'朝争', + jsrgchaozheng_info:'准备阶段,你可以令所有其他角色议事。若结果为:红色,意见为红色的角色各回复1点体力;黑色,意见为红色的角色各失去1点体力。然后若所有意见均相同,你摸X张牌(X为此次议事的角色数)。', + jsrgshenchong:'甚宠', + jsrgshenchong_info:'限定技。出牌阶段,你可以令一名其他角色获得〖飞扬〗、〖跋扈〗。若如此做,当你死亡时,其失去所有技能并弃置所有手牌。', + jsrgjulian:'聚敛', + jsrgjulian_info:'主公技。①其他群势力角色每回合限两次。当其不于摸牌阶段且不因〖聚敛〗摸牌后,其可以摸一张牌。②结束阶段,你可以获得所有其他群势力角色各一张牌。', + jsrgfeiyang:'飞扬', + jsrgfeiyang_info:'判定阶段开始时,若你的判定区里有牌,你可以弃置两张手牌并弃置你判定区里的一张牌。', + jsrgbahu:'跋扈', + jsrgbahu_info:'锁定技。①准备阶段,你摸一张牌。②你使用【杀】的次数上限+1。', + jsrg_hejin:'起何进', + jsrg_hejin_ab:'何进', + jsrgzhaobing:'诏兵', + jsrgzhaobing_info:'结束阶段,你可以弃置所有手牌,然后令至多X名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力(X为你本次弃置的牌数)。', + jsrgzhuhuan:'诛宦', + jsrgzhuhuan_info:'准备阶段,你可以展示所有手牌并弃置所有【杀】,然后令一名其他角色选择一项:1.弃置等量的牌,然后受到1点伤害;2.令你摸等量的牌,然后你回复1点体力。', + jsrgyanhuo:'延祸', + jsrgyanhuo_info:'锁定技。当你死亡时,你增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。', + jsrg_sunjian:'起孙坚', + jsrg_sunjian_ab:'孙坚', + jsrgpingtao:'平讨', + jsrgpingtao_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。', + jsrgjuelie:'绝烈', + jsrgjuelie_info:'①当你造成渠道为【杀】的伤害时,若你的手牌数或体力值最小,此伤害+1。②当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌。', + jsrg_huangfusong:'起皇甫嵩', + jsrg_huangfusong_ab:'皇甫嵩', + jsrgguanhuo:'观火', + jsrgguanhuo_info:'①出牌阶段,你可以视为使用一张【火攻】。②当你因〖观火①〗使用的【火攻】结算结束后,若此牌未造成过伤害,且:若{你此阶段发动〖观火①〗的次数为1,则你于此阶段造成渠道为【火攻】的伤害时,此伤害+1},否则你失去〖观火〗。', + jsrgjuxia:'居下', + jsrgjuxia_info:'每回合限一次。当其他角色使用牌指定你为目标后,若其技能数多于你,其可以令此牌对你无效,然后令你摸两张牌。', + jsrg_xushao:'起许劭', + jsrg_xushao_ab:'许劭', + jsrgyingmen:'盈门', + jsrgyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', + jsrgpingjian:'评鉴', + jsrgpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,你摸一张牌。', + jsrg_dongbai:'起董白', + jsrg_dongbai_ab:'董白', + jsrgshichong:'恃宠', + jsrgshichong_info:'转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。', + jsrglianzhu:'连诛', + jsrglianzhu_info:'出牌阶段限一次。你可以展示一张黑色手牌并交给一名其他角色,然后视为你对所有与其势力相同的其他角色依次使用一张【过河拆桥】。', + jsrg_qiaoxuan:'起桥玄', + jsrg_qiaoxuan_ab:'桥玄', + jsrgjuezhi:'绝质', + jsrgjuezhi_info:'①当你失去一张装备区里的装备牌后,你可以废除对应的装备栏。②你的回合每阶段限一次。当你使用牌对目标角色造成伤害时,你令此伤害+X(X为其装备区里的牌与你已废除的装备栏中相同副类别的数量)。', + jsrgjizhao:'急召', + jsrgjizhao_info:'准备阶段或结束阶段,你可以令一名角色选择一项:1.使用一张手牌;2.令你可以移动其区域里的一张牌。', + jsrg_yangbiao:'起杨彪', + jsrg_yangbiao_ab:'杨彪', + jsrgzhaohan:'昭汉', + jsrgzhaohan_info:'准备阶段,若本局游戏:未洗过牌,你回复1点体力;洗过牌,你失去1点体力。', + jsrgrangjie:'让节', + jsrgrangjie_info:'当你受到1点伤害后,你可以移动场上的一张牌,然后你可以于弃牌堆中选择获得一张本回合进入弃牌堆且与此牌花色相同的牌。', + jsrgyizheng:'义争', + jsrgyizheng_info:'出牌阶段限一次。你可以与一名手牌数大于你的角色拼点。若你:赢,其跳过下一个摸牌阶段;没赢,其可以对你造成至多2点伤害。', + jsrg_kongrong:'起孔融', + jsrg_kongrong_ab:'孔融', + jsrglirang:'礼让', + jsrglirang_info:'每轮限一次。其他角色的摸牌阶段开始时,你可以交给其两张牌。然后此回合的弃牌阶段结束时,你可以获得所有其于此阶段因弃置进入弃牌堆的牌。', + jsrgzhengyi:'争义', + jsrgzhengyi_info:'当你每回合首次受到伤害时,本轮因〖礼让〗获得过牌的其他角色可以将此伤害转移给其。', + jsrg_zhujun:'起朱儁', + jsrg_zhujun_ab:'朱儁', + jsrgfendi:'分敌', + jsrgfendi_tag:'分敌', + jsrgfendi_info:'每回合限一次。当你使用【杀】指定唯一目标后,你可以展示其任意张手牌,令其不能使用或打出对应实体牌不全为这些牌的牌直到此【杀】结算结束。然后当此【杀】对其造成伤害后,你获得这些牌。', + jsrgjuxiang:'拒降', + jsrgjuxiang_info:'当你不于摸牌阶段获得牌后,你可以弃置之,令当前回合角色于此回合额定的出牌阶段内使用【杀】的次数上限+X(X为你以此法弃置的牌的花色数)。', + jsrg_liubei:'起刘备', + jsrg_liubei_ab:'刘备', + jsrgjishan:'积善', + jsrgjishan_info:'①每回合限一次。当一名角色受到伤害时,你可以失去1点体力并防止此伤害,然后你与其各摸一张牌。②每回合限一次。当你造成伤害后,你可以令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力。', + jsrgzhenqiao:'振鞘', + jsrgzhenqiao_info:'锁定技。①你的攻击范围+1。②当你使用【杀】指定目标后,若你的武器栏为空且未废除,你令此【杀】的效果额外结算一次。', + jsrg_wangyun:'起王允', + jsrg_wangyun_ab:'王允', + jsrgshelun:'赦论', + jsrgshelun_info:'出牌阶段限一次。你可以选择一名你攻击范围内的角色,然后令除其外所有手牌数不大于你的角色议事。若结果为:红色,你弃置其一张牌;黑色,你对其造成1点伤害。', + jsrgfayi:'伐异', + jsrgfayi_info:'当你议事结算结束后,你可以对一名意见与你不同的角色造成1点伤害。', + jsrg_liuyan:'起刘焉', + jsrg_liuyan_ab:'刘焉', + jsrgtushe:'图射', + jsrgtushe_info:'当你使用非装备牌指定目标后,你可以展示所有手牌。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。', + jsrgtongjue:'通绝', + jsrgtongjue_info:'主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。', + jsrg_caocao:'起曹操', + jsrg_caocao_ab:'曹操', + jsrgzhenglve:'政略', + jsrgzhenglve_info:'①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。', + jsrghuilie:'会猎', + jsrghuilie_info:'觉醒技。准备阶段,若有“猎”的角色数大于2,你减1点体力上限,然后获得〖平戎〗和〖飞影〗。', + jsrgpingrong:'平戎', + jsrgpingrong_info:'每轮限一次。一名角色的回合结束时,你可以移去一名角色的“猎”,然后你于此回合后执行一个额外回合。该回合结束后,若你于此回合未造成过伤害,你失去1点体力。', + jsrg_nanhualaoxian:'起南华老仙', + jsrg_nanhualaoxian_ab:'南华老仙', + jsrgshoushu:'授术', + jsrgshoushu_info:'锁定技。①每轮开始时,若游戏内没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。', + jsrgxundao:'寻道', + jsrgxundao_info:'当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。', + jsrglinghua:'灵化', + jsrglinghua_info:'①准备阶段,你可以进行目标角色为你的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以令一名角色回复1点体力。②结束阶段,你可以进行目标角色为你且判定效果反转的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以对一名角色造成1点雷电伤害。', + sbyingmen:'盈门', + sbyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', + sbpingjian:'评鉴', + sbpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,则你于此技能结算结束时摸一张牌。', + //江山如故·承 + jsrg_sunce:'承孙策', + jsrg_sunce_ab:'孙策', + jsrgduxing:'独行', + jsrgduxing_info:'出牌阶段限一次。你可以视为使用一张可以指定任意名目标角色的【决斗】,且所有目标角色的手牌均视为【杀】直到此牌结算结束。', + jsrgzhiheng:'猘横', + jsrgzhiheng_info:'锁定技。当你因执行牌的效果对目标角色造成伤害时,若其于此回合响应过你使用过的牌,此伤害+1。', + jsrgzhasi:'诈死', + jsrgzhasi_info:'限定技。当你受到伤害值不小于你的体力值的伤害时,你可以防止此伤害,然后失去〖猘横〗并获得〖制衡〗。然后你不计入距离和座次计算直到你对其他角色使用牌后或当你受到伤害后。', + jsrgbashi:'霸世', + jsrgbashi_info:'主公技。当你需要打出【杀】或【闪】时,你可以令其他吴势力角色选择是否打出一张【杀】或【闪】。若有角色响应,则视为你打出了一张【杀】或【闪】。', + jsrg_xuyou:'承许攸', + jsrg_xuyou_ab:'许攸', + jsrglipan:'离叛', + jsrglipan_info:'回合结束时,你可以变更势力,然后摸X张牌并执行一个额外的出牌阶段。此阶段结束时,所有与你势力相同的角色依次可以将一张牌当【决斗】对你使用(X为与你势力相同的其他角色数)。', + jsrgqingxi:'轻袭', + jsrgqingxi_info:'群势力技。出牌阶段每名角色限一次。你可以选择一名手牌数小于你的角色,你将手牌数弃置至与其相同,然后视为对其使用一张刺【杀】。', + jsrgjinmie:'烬灭', + jsrgjinmie_info:'魏势力技。出牌阶段限一次。你可以选择一名手牌数大于你的角色,你视为对其使用一张火【杀】。当此牌造成伤害后,你将其手牌数弃置至与你相同。', + jsrg_lvbu:'承吕布', + jsrg_lvbu_ab:'吕布', + jsrgwuchang:'无常', + jsrgwuchang_info:'锁定技。①当你获得其他角色的牌后,你变更势力为与其相同。②当你使用【杀】或【决斗】对与你势力相同的目标角色造成伤害时,此伤害+1,然后变更势力为群。', + jsrgqingjiao:'轻狡', + jsrgqingjiao_info:'群势力技。出牌阶段各限一次。你可以将一张牌当【推心置腹】/【趁火打劫】对一名手牌数大于/小于你的角色使用。', + jsrgchengxu:'乘虚', + jsrgchengxu_info:'蜀势力技。与你势力相同的其他角色不能响应你使用的牌。', + jsrg_zhanghe:'承张郃', + jsrg_zhanghe_ab:'张郃', + jsrgqiongtu:'穷途', + jsrgqiongtu_info:'群势力技。每回合限一次。你可以将一张非基本牌置于武将牌上视为使用一张【无懈可击】。若此牌生效,你摸一张牌,否则你变更势力为魏并获得所有“穷途”牌。', + jsrgxianzhu:'先著', + jsrgxianzhu_info:'魏势力技。你可以将一张普通锦囊牌当无次数限制的【杀】使用。当此牌对唯一目标造成伤害后,你视为对该角色使用一张此普通锦囊牌。', + jsrg_zoushi:'承邹氏', + jsrg_zoushi_ab:'邹氏', + jsrgguyin:'孤吟', + jsrgguyin_info:'准备阶段,你可以翻面,且令所有其他男性角色依次选择是否翻面。然后你和所有背面朝上的角色轮流各摸一张牌直到你本次以此法获得X张牌(X为场上存活角色与死亡角色中男性角色数)。', + jsrgzhangdeng:'帐灯', + jsrgzhangdeng_info:'①当一名武将牌背面朝上的角色需要使用【酒】时,若你的武将牌背面朝上,其可以视为使用之。②当一名角色于一回合第二次发动〖帐灯①〗时,你将武将牌翻面至正面朝上。', + jsrg_guanyu:'承关羽', + jsrg_guanyu_ab:'关羽', + jsrgguanjue:'冠绝', + jsrgguanjue_info:'锁定技。当你使用或打出有花色的牌时,你令所有其他角色于此回合内不能使用或打出该花色的牌。', + jsrgnianen:'念恩', + jsrgnianen_info:'你可以将一张牌当任意基本牌使用或打出,然后若此牌不为红色或你以此法使用或打出的牌不为普通【杀】,则直到此回合结束,该技能失效且你视为拥有〖马术〗。', + jsrg_chendeng:'承陈登', + jsrg_chendeng_ab:'陈登', + jsrglunshi:'论势', + jsrglunshi_info:'出牌阶段限一次。你可以令一名角色摸等同于其攻击范围内角色数的牌(至多摸至五张),然后其弃置等同于攻击范围内含有其的角色数的牌。', + jsrgguitu:'诡图', + jsrgguitu_info:'准备阶段,你可以交换场上的两张武器牌,然后攻击范围以此法减少的角色回复1点体力。', + jsrg_zhenji:'承甄宓', + jsrg_zhenji_ab:'甄宓', + jsrgjixiang:'济乡', + jsrgjixiang_info:'回合内每种牌名限一次。当一名其他角色需要使用或打出一张基本牌时,你可以弃置一张牌令其视为使用或打出之,然后你摸一张牌并令〖称贤〗于此阶段可发动次数上限+1。', + jsrgchengxian:'称贤', + jsrgchengxian_info:'出牌阶段限两次。你可以将一张手牌当一张本回合未以此法使用过的普通锦囊牌使用(此转化牌须与以此法转化的手牌的合法目标数相同)。', + jsrg_zhangliao:'承张辽', + jsrg_zhangliao_ab:'张辽', + jsrgzhengbing:'整兵', + jsrgzhengbing_info:'群势力技。出牌阶段限三次。你可以重铸一张牌,若此牌为:【杀】,你本回合手牌上限+2;【闪】,你摸一张牌;【桃】,你变更势力为魏。', + jsrgtuwei:'突围', + jsrgtuwei_info:'魏势力技。出牌阶段开始时,你可以获得攻击范围内任意名角色各一张牌。然后此回合结束时,这些角色中未于本回合受到过伤害的角色依次获得你的一张牌。', + jsrg_xugong:'承许贡', + jsrg_xugong_ab:'许贡', + jsrgbiaozhao:'表召', + jsrgbiaozhao_info:'准备阶段,你可以选择两名其他角色A和B。直到你的下回合开始时或你死亡后,A对B使用牌无次数和距离限制,且B对你使用的牌造成的伤害+1。', + jsrgyechou:'业仇', + jsrgyechou_info:'当你死亡时,你可以令一名其他角色获得如下效果:当其受到伤害值不小于其体力值的伤害时,其令此伤害翻倍。', + jsrg_chunyuqiong:'承淳于琼', + jsrg_chunyuqiong_ab:'淳于琼', + jsrgcangchu:'仓储', + jsrgcangchu_info:'一名角色的结束阶段,你可以令至多X名角色各摸一张牌,若X大于存活角色数,则改为各摸两张牌(X为你于此回合获得过的牌数)。', + jsrgshishou:'失守', + jsrgshishou_info:'锁定技。①当你使用【酒】时,你摸三张牌,然后你本回合不能再使用牌。②当你受到火焰伤害后,你令〖仓储〗失效直到你的下回合结束后。', + + jiangshanrugu_qi:'江山如故·起', + jiangshanrugu_cheng:'江山如故·承', + }, + }; +}); diff --git a/character/mobile.js b/character/mobile.js index 002545b4a..0710cc01b 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -155,7 +155,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ scs_lisong:['male','qun','',['scskuiji'],['unseen']], scs_duangui:['male','qun','',['scschihe'],['unseen']], scs_guosheng:['male','qun','',['scsniqu'],['unseen']], - scs_gaowang:['male','qun','',['scsanruo'],['unseen']], + scs_gaowang:['male','qun','',['scsmiaoyu'],['unseen']], }, characterIntro:{ shichangshi:'十常侍,指中国东汉(公元25年—220年)灵帝时期(168年-189年)操纵政权的十二个宦官:张让、赵忠、夏恽、郭胜、孙璋、毕岚、栗嵩、段珪、高望、张恭、韩悝、宋典(在小说《三国演义》里,十常侍指的是指张让、赵忠、封谞、段珪、曹节、侯览、蹇硕、程旷、夏恽、郭胜十人),他们都任职中常侍。玩弄小皇帝于股掌之中,以至灵帝称“张常侍是我父,赵常侍是我母”。十常侍自己横征暴敛,卖官鬻爵,他们的父兄子弟遍布天下,横行乡里,祸害百姓,无官敢管。人民不堪剥削、压迫,纷纷起来反抗。当时一些比较清醒的官吏,已看出宦官集团的黑暗腐败,导致大规模农民起义的形势。郎中张钧在给皇帝的奏章中明确指出,黄巾起义是外戚宦官专权逼出来的,他说:“张角所以能兴兵作乱,万人所以乐附之者,其源皆由十常侍多放父兄、子弟、婚宗、宾客典据州郡,辜确财利,侵略百姓,百姓之怨无所告诉,故谋议不轨,聚为‘盗贼’。”后被曹操、袁绍所歼。', @@ -204,7 +204,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hujinding:'胡金定,女,传说中关羽之妻。关索之母,配偶关羽,出处《花关索传》和元代《三国志评话》民间传说人物。', }, characterTitle:{ - sp_jianggan:'#b对决限定武将', }, card:{ ly_piliche:{ @@ -385,9 +384,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(mode=='versus') return _status.mode!='three'; return true; }, - sp_jianggan:function(mode){ - return mode!='identity'&&mode!='guozhan'; - }, }, skill:{ //十常侍 @@ -417,7 +413,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ['scs_lisong','scskuiji'], ['scs_duangui','scschihe'], ['scs_guosheng','scsniqu'], - ['scs_gaowang','scsanruo'] + ['scs_gaowang','scsmiaoyu'] ], conflictMap:{ scs_zhangrang:[], @@ -581,7 +577,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var next=game.createEvent('mbdanggu_clique'); next.player=player; next.setContent(lib.skill.mbdanggu.contentx); - player.draw(2); + player.draw(); } } } @@ -870,7 +866,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - var next=player.choosePlayerCard(trigger.target,'he',[1,2],get.prompt('scschiyan',trigger.target)); + var next=player.choosePlayerCard(trigger.target,'he',get.prompt('scschiyan',trigger.target)); next.set('ai',function(button){ if(!_status.event.goon) return 0; var val=get.value(button.link); @@ -1053,7 +1049,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.skip('phaseDraw'); target.addTempSkill('scsyaozhuo_skip',{player:'phaseDrawSkipped'}); } - else player.chooseToDiscard(true,'he'); + else player.chooseToDiscard(2,true,'he'); }, subSkill:{ skip:{ @@ -1086,17 +1082,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ usable:1, content:function(){ 'step 0' - player.draw(3); + player.draw(2); 'step 1' var num=player.countCards('he'); if(!num) event.finish(); - else if(num<3) event._result={index:1}; + else if(num<2) event._result={index:1}; else player.chooseControl().set('choiceList',[ - '将三张牌交给一名其他角色', - '弃置三张牌', + '将两张牌交给一名其他角色', + '弃置两张牌', ]).set('ai',function(){ if(game.hasPlayer(function(current){ - return current!=player&&get.attitude(player,current)>2; + return current!=player&&get.attitude(player,current)>0; })) return 0; return 1; }); @@ -1105,7 +1101,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseCardTarget({ position:'he', filterCard:true, - selectCard:3, + selectCard:2, filterTarget:function(card,player,target){ return player!=target; }, @@ -1118,12 +1114,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.hasJudge('lebu')) att/=5; return att; }, - prompt:'选择三张牌,交给一名其他角色', + prompt:'选择两张牌,交给一名其他角色', forced:true, }); } else{ - player.chooseToDiscard(3,true,'he'); + player.chooseToDiscard(2,true,'he'); event.finish(); } 'step 3' @@ -1507,6 +1503,142 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + scsmiaoyu:{ + audio:'scsanruo', + enable:['chooseToUse','chooseToRespond'], + prompt:'将至多两张♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】使用或打出', + viewAs:function(cards,player){ + var name=false; + var nature=null; + switch(get.suit(cards[0],player)){ + case 'club':name='shan';break; + case 'diamond':name='sha';nature='fire';break; + case 'spade':name='wuxie';break; + case 'heart':name='tao';break; + } + //返回判断结果 + if(name) return {name:name,nature:nature}; + return null; + }, + check:function(card){ + if(ui.selected.cards.length) return 0; + var player=_status.event.player; + if(_status.event.type=='phase'){ + var max=0; + var name2; + var list=['sha','tao']; + var map={sha:'diamond',tao:'heart'} + for(var i=0;i0&&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; + name2=map[name]; + } + } + } + if(name2==get.suit(card,player)) return (name2=='diamond'?(5-get.value(card)):20-get.value(card)); + return 0; + } + return 1; + }, + selectCard:[1,2], + complexCard:true, + position:'hes', + filterCard:function(card,player,event){ + if(ui.selected.cards.length) return get.suit(card,player)==get.suit(ui.selected.cards[0],player); + event=event||_status.event; + var filter=event._backup.filterCard; + var name=get.suit(card,player); + if(name=='club'&&filter({name:'shan',cards:[card]},player,event)) return true; + if(name=='diamond'&&filter({name:'sha',cards:[card],nature:'fire'},player,event)) return true; + if(name=='spade'&&filter({name:'wuxie',cards:[card]},player,event)) return true; + if(name=='heart'&&filter({name:'tao',cards:[card]},player,event)) return true; + return false; + }, + filter:function(event,player){ + var filter=event.filterCard; + if(filter({name:'sha',nature:'fire'},player,event)&&player.countCards('hes',{suit:'diamond'})) return true; + if(filter({name:'shan'},player,event)&&player.countCards('hes',{suit:'club'})) return true; + if(filter({name:'tao'},player,event)&&player.countCards('hes',{suit:'heart'})) return true; + if(filter({name:'wuxie'},player,event)&&player.countCards('hes',{suit:'spade'})) return true; + return false; + }, + precontent:function(){ + player.addTempSkill('scsmiaoyu_num'); + player.addTempSkill('scsmiaoyu_discard'); + }, + 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;i0&&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('hs')>0) return true; + if(name=='wuxie') return player.countCards('hes',{suit:'spade'})>0; + if(name=='tao') return player.countCards('hes',{suit:'heart'})>0; + }, + subSkill:{ + num:{ + charlotte:true, + trigger:{player:'useCard'}, + filter:function(event){ + return ['sha','tao'].contains(event.card.name)&&event.skill=='scsmiaoyu'&&event.cards&&event.cards.length==2; + }, + forced:true, + popup:false, + content:function(){ + trigger.baseDamage++; + }, + }, + discard:{ + charlotte:true, + trigger:{player:['useCardAfter','respondAfter']}, + autodelay:function(event){ + return event.name=='respond'?0.5:false; + }, + filter:function(event,player){ + return ['shan','wuxie'].contains(event.card.name)&&event.skill=='scsmiaoyu'&&event.cards&&event.cards.length==2&&_status.currentPhase&&_status.currentPhase!=player&&_status.currentPhase.countDiscardableCards(player,'he'); + }, + forced:true, + popup:false, + content:function(){ + player.line(_status.currentPhase,'green'); + player.discardPlayerCard(_status.currentPhase,'he',true); + }, + }, + }, + }, //牵招 mbshihe:{ audio:2, @@ -3404,78 +3536,90 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, //蒋干 spdaoshu:{ - audio:2, - trigger:{global:'phaseUseBegin'}, - round:1, - filter:function(event,player){ - return event.player.isEnemyOf(player)&&event.player.countCards('h')>0&&event.player.hasUseTarget({name:'jiu',isCard:true},null,true); - }, - logTarget:'player', - prompt2:'令其视为使用一张【酒】。其声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你随机获得其五张手牌,否则你不能响应其使用的牌直到回合结束。', - check:function(event,player){ - var target=event.player; - if(target.countCards('h')<3) return false; - var att=get.attitude(player,target); - if(att>0) return false; - if(att==0) return !player.inRangeOf(target); - return true; - }, - content:function(){ - 'step 0' - event.target=trigger.player; - event.target.chooseUseTarget('jiu',true); - 'step 1' - if(!target.countCards('h')){ - event.finish(); - return; - } - var list=[]; - for(var i of lib.inpile){ - if(get.type(i)=='basic') list.push(i); - } - if(!list.length){ - event.finish(); - return; - } - target.chooseControl(list).set('prompt','请声明一种基本牌').set('ai',()=>_status.event.rand).set('rand',get.rand(0,list.length-1)); - 'step 2' - event.cardname=result.control; - target.chat('我声明'+get.translation(event.cardname)); - game.log(target,'声明的牌名为','#y'+get.translation(event.cardname)); - game.delayx(); - player.chooseControl('有!','没有!').set('prompt','你觉得'+get.translation(target)+'的手牌区里有'+get.translation(event.cardname)+'吗?').set('ai',function(){ - return _status.event.choice; - }).set('choice',function(){ - var rand={ - sha:0.273, - shan:0.149, - tao:0.074, - jiu:0.031, - }[event.cardname]||0.1; - return (1-Math.pow(1-rand,target.countCards('h')))>0.5?'有!':'没有!'; - }()); - 'step 3' - player.chat(result.control); - game.log(player,'认为','#y'+result.control); - game.delayx(); - 'step 4' - var bool1=(result.index==0); - var bool2=(target.hasCard(function(card){ - return get.name(card,target)==event.cardname; - },'h')); - if(bool1==bool2){ - player.popup('判断正确','wood'); - var cards=target.getCards('h',function(card){ - return lib.filter.canBeGained(card,player,target); - }).randomGets(5); - if(cards.length>0) player.gain(cards,target,'giveAuto','bySelf'); - } - else{ - player.popup('判断错误','fire'); - player.addTempSkill('spdaoshu_respond'); - } - }, + audio:3, + group:'spdaoshu_effect', subSkill:{ + effect:{ + audio:'spdaoshu1', + trigger:{global:'phaseUseBegin'}, + filter:function(event,player){ + var goon=(event.player!=player&&(get.mode()=='identity'||get.mode()=='guozhan'||event.player.isEnemyOf(player))); + return goon&&event.player.countCards('h')>0&&event.player.hasUseTarget({name:'jiu',isCard:true},null,true); + }, + round:1, + logTarget:'player', + prompt2:()=>lib.translate.spdaoshu_info, + check:function(event,player){ + var target=event.player; + var att=get.attitude(player,target); + if(att>0) return false; + if(att==0) return !player.inRangeOf(target); + return true; + }, + content:function(){ + 'step 0' + event.target=trigger.player; + event.target.chooseUseTarget('jiu',true); + 'step 1' + if(!target.countCards('h')){ + event.finish(); + return; + } + var list=[]; + for(var i of lib.inpile){ + if(get.type(i)=='basic') list.push(i); + } + if(!list.length){ + event.finish(); + return; + } + target.chooseControl(list).set('prompt','请声明一种基本牌').set('ai',()=>_status.event.rand).set('rand',get.rand(0,list.length-1)); + 'step 2' + event.cardname=result.control; + target.chat('我声明'+get.translation(event.cardname)); + game.log(target,'声明的牌名为','#y'+get.translation(event.cardname)); + game.delayx(); + player.chooseControl('有!','没有!').set('prompt','你觉得'+get.translation(target)+'的手牌区里有'+get.translation(event.cardname)+'吗?').set('ai',function(){ + return _status.event.choice; + }).set('choice',function(){ + var rand={ + sha:0.273, + shan:0.149, + tao:0.074, + jiu:0.031, + }[event.cardname]||0.1; + return (1-Math.pow(1-rand,target.countCards('h')))>0.5?'有!':'没有!'; + }()); + 'step 3' + player.chat(result.control); + game.log(player,'认为','#y'+result.control); + game.delayx(); + 'step 4' + var bool1=(result.index==0); + var bool2=(target.hasCard(function(card){ + return get.name(card,target)==event.cardname; + },'h')); + if(bool1==bool2){ + player.popup('判断正确','wood'); + game.broadcastAll(function(){ + if(lib.config.background_speak) game.playAudio('skill','spdaoshu2'); + }); + player.gainPlayerCard(target,'h',2,true); + //var cards=target.getCards('h',function(card){ + // return lib.filter.canBeGained(card,player,target); + //}).randomGets(5); + //if(cards.length>0) player.gain(cards,target,'giveAuto','bySelf'); + } + else{ + player.popup('判断错误','fire'); + game.broadcastAll(function(){ + if(lib.config.background_speak) game.playAudio('skill','spdaoshu3'); + }); + //player.addTempSkill('spdaoshu_respond'); + } + }, + ai:{expose:0.3}, + }, respond:{ trigger:{global:'useCard1'}, forced:true, @@ -3489,6 +3633,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + spdaoshu1:{audio:true}, spdaizui:{ audio:2, trigger:{player:'damageBegin2'}, @@ -5722,9 +5867,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(_status.event.goon) return -1; var num=_status.event.maxNum; if(ui.selected.cards.length>=num-1){ - var val=get.value(player.getCards('he',function(cardx){ + var cards=player.getCards('he',function(cardx){ return cardx!=card&&!ui.selected.cards.contains(cardx); - })); + }); + var val=0; + for(var cardx of cards) val+=get.value(cardx); if(val>=14) return 0; } return get.value(card); @@ -8759,7 +8906,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseCard('he',get.prompt2('duoduan')).set('ai',function(card){ + player.chooseCard('he',get.prompt2('duoduan'),lib.filter.cardRecastable).set('ai',function(card){ if(_status.event.goon) return 8-get.value(card); return 0; }).set('goon',function(){ @@ -8771,12 +8918,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(result.bool){ player.addTempSkill('duoduan_im'); - var card=result.cards[0]; player.logSkill('duoduan',trigger.player); - player.lose(card,ui.discardPile,'visible'); - player.$throw(card,1000); - game.log(player,'将',card,'置入弃牌堆'); - player.draw(); + player.recast(result.cards); } else event.finish(); 'step 2' @@ -11854,31 +11997,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ prompt:"重铸一张防具牌,然后将体力回复至1点。", audio:'xinfu_jingxie', enable:"chooseToUse", - filterCard:function(card){ - return get.subtype(card)=='equip2'; - }, - filter:function(event,player){ - if(event.type=='dying'){ - if(player!=event.dying) return false; - return player.countCards('he',function(card){ - return get.subtype(card)=='equip2'; - })>0; - } - return false; - }, - check:function(){ - return 1; + filterCard:(card,player)=>get.subtype(card)=='equip2'&&player.canRecast(card), + filter:(event,player)=>{ + if(event.type!='dying') return false; + if(player!=event.dying) return false; + return player.hasCard(card=>lib.skill.xinfu_jingxie2.filterCard(card,player),lib.skill.xinfu_jingxie2.position); }, position:"he", discard:false, - loseTo:'discardPile', - prepare:function(cards,player){ - player.$throw(cards,1000); - game.log(player,'将',cards,'置入了弃牌堆') - }, + lose:false, + delay:false, content:function(){ 'step 0' - player.draw(); + player.recast(cards); 'step 1' var num=1-player.hp; if(num) player.recover(num); @@ -11887,10 +12018,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ order:0.5, skillTagFilter:function(player,arg,target){ if(player!=target) return false; - return player.countCards('he',function(card){ - if(_status.connectMode&&get.position(card)=='h') return true; - return get.subtype(card)=='equip2'; - })>0; + return player.hasCard(card=>_status.connectMode&&get.position(card)=='h'||get.subtype(card)=='equip2'&&player.canRecast(card),'he'); }, save:true, result:{ @@ -13031,7 +13159,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ baosanniang:['xin_baosanniang','re_baosanniang','baosanniang'], heqi:['re_heqi','heqi'], weiwenzhugezhi:['weiwenzhugezhi','re_weiwenzhugezhi'], - xugong:['xugong','re_xugong'], + xugong:['xugong','re_xugong','jsrg_xugong'], liuzan:['re_liuzan','liuzan'], sufei:['yj_sufei','sp_sufei','xf_sufei'], jiakui:['jiakui','old_jiakui'], @@ -13206,7 +13334,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rezhennan:'镇南', rezhennan_info:'当你成为其他角色使用的牌的目标后,若此牌的目标数大于该角色的体力值,则你可以弃置一张牌并对其造成1点伤害。', - hujinding:'胡金定', + hujinding:'手杀胡金定', huaizi:'怀子', huaizi_info:'锁定技,你的手牌上限为你的体力上限。', renshi:'仁释', @@ -13339,7 +13467,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_dongzhuo:'手杀董卓', rejiuchi:'酒池', rejiuchi_info:'你可以将一张黑桃手牌当做【酒】使用。锁定技,当你于回合内使用带有【酒】效果的【杀】造成伤害时,你令你的【崩坏】失效直到回合结束。', - furong:'傅肜', + furong:'手杀傅肜', xuewei:'血卫', xuewei_info:'准备阶段,你可以选择一名其他角色(仅自己可见)。若如此做,直到你的下回合开始前,当其第一次受到伤害时,你防止此伤害,改为由你受到等量的伤害并对伤害来源造成等量同属性的伤害。', liechi:'烈斥', @@ -13386,7 +13514,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shanli_info:'觉醒技,准备阶段,若你已发动过〖败移〗且对至少两名角色发动过〖景略〗,则你减1点体力上限并选择一名角色。系统随机选择三个不为〖忘隙(仲村由理)〗的主公技,然后你选择其中一个技能,令其获得之。其将交互表情中的【拖鞋】和【酒杯】替换为【枷锁】和【玉玺】。', re_lingtong:'手杀凌统', re_liubiao:'手杀刘表', - hucheer:'胡车儿', + hucheer:'手杀胡车儿', daoji:'盗戟', daoji_info:'出牌阶段限一次,你可以弃置一张非基本牌并选择一名装备区里有牌的其他角色,你获得其装备区中的一张牌并使用之。若你以此法获得的牌是武器牌,则你使用此牌后对其造成1点伤害。', xin_hansui:'手杀韩遂', @@ -13469,7 +13597,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinshenxing_info:'出牌阶段限X次(X为你的体力值),你可以弃置两张牌,然后摸一张牌。若这两张牌颜色不同,则改为摸两张牌。', xinbingyi:'秉壹', xinbingyi_info:'结束阶段,你可展示所有手牌。若这些牌的颜色或类型均相同,则你可以令至多X名角色各摸一张牌(X为你的手牌数)。', - qiaozhou:'谯周', + qiaozhou:'手杀谯周', zhiming:'知命', zhiming_info:'准备阶段开始时或弃牌阶段结束时,你摸一张牌,然后可以将一张牌置于牌堆顶。', xingbu:'星卜', @@ -13557,7 +13685,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ juezhi_info:'出牌阶段,你可以弃置至少两张牌,然后从牌堆中获得一张点数为X的牌(X为这些牌的点数和除以13后的余数,且当余数为0时X为13)。', sp_jianggan:'手杀蒋干', spdaoshu:'盗书', - spdaoshu_info:'每轮限一次。一名敌方角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你随机获得其五张手牌,否则你不能响应其使用的牌直到回合结束。', + spdaoshu_info:'每轮限一次。一名敌方角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。', + spdaoshu_info_identity:'每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。', + spdaoshu_info_guozhan:'每轮限一次。一名其他角色的出牌阶段开始时,若其有手牌,则你可以令其视为使用一张【酒】。其须声明一个基本牌的牌名,然后你判断其手牌区内是否有该牌名的牌。若你判断正确,则你获得其两张手牌。', spdaizui:'戴罪', spdaizui2:'戴罪', spdaizui_info:'限定技。当你受到伤害值不小于体力值的伤害时,你可防止此伤害并将此伤害渠道对应的所有实体牌置于伤害来源的武将牌上,称为“释”。本回合结束时,其获得所有“释”。', @@ -13616,7 +13746,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xin_zhuzhi:'手杀朱治', sbanguo:'安国', sbanguo_info:'①游戏开始时,你令一名其他角色获得1枚“安国”标记(有“安国”的角色手牌上限基数等于体力上限)。②出牌阶段开始时,你可以将一名有“安国”的角色的所有“安国”移动给一名本局游戏未获得过“安国”的其他角色。③当你受到伤害时,若有有“安国”的角色且伤害值不小于你的体力值且此伤害没有来源或来源没有“安国”,防止此伤害。④一名角色进入濒死状态时,若其有你因〖安国①〗获得的“安国”,你移去其该“安国”,令其将体力回复至1点。然后你选择一项:1.若你的体力值大于1,你失去体力至1点;2.若你的体力上限大于1,你将体力上限减至1。最后你令其获得X点护甲(X为你以此法失去的体力值或减少的体力上限)。', - wangjun:'王濬', + wangjun:'手杀王濬', zhujian:'筑舰', zhujian_info:'出牌阶段限一次。你可以令至少两名装备区里有牌的角色各摸一张牌。', duansuo:'断索', @@ -13647,7 +13777,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mbzhenfu_info:'结束阶段,若你本回合因弃置失去过牌,你可以令一名其他角色获得1点护甲。', shichangshi:'十常侍', mbdanggu:'党锢', - mbdanggu_info:'锁定技。①游戏开始时,你获得十张“常侍”牌,然后你进行一次结党。②当你修整结束后,你进行一次结党并摸两张牌。③若你有亮出的“常侍”牌,你视为拥有这些牌的技能。', + mbdanggu_info:'锁定技。①游戏开始时,你获得十张“常侍”牌,然后你进行一次结党。②当你修整结束后,你进行一次结党并摸一张牌。③若你有亮出的“常侍”牌,你视为拥有这些牌的技能。', mbdanggu_faq:'关于结党', mbdanggu_faq_info:'
    系统随机选择一张未亮出过的“常侍”牌,然后选择四张未亮出过的“常侍”牌(若剩余“常侍”牌中有「高望」,则必定出现)。你观看前者,然后从后者中选择一名与前者互相认可的“常侍”牌(不认可的“常侍”牌为不可选状态),你选择这两张牌。然后若此时不为双将模式,你将这两张武将牌作为你的武将牌(不移除原有技能);否则你获得这两张武将牌上的技能。', mbmowang:'殁亡', @@ -13659,7 +13789,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ scstaoluan_info:'出牌阶段限一次。你可以将一张牌当任意一种基本牌或普通锦囊牌使用。', scs_zhaozhong:'赵忠', scschiyan:'鸱咽', - scschiyan_info:'①当你使用【杀】指定目标后,你可以将其的至多两张牌置于其武将牌上,然后其于当前回合结束时获得这些牌。②当你因执行【杀】的效果对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,此伤害+1。', + scschiyan_info:'①当你使用【杀】指定目标后,你可以将其的一张牌置于其武将牌上,然后其于当前回合结束时获得这些牌。②当你因执行【杀】的效果对一名角色造成伤害时,若该角色的手牌数和装备区内的牌数均不大于你,此伤害+1。', scs_sunzhang:'孙璋', scszimou:'自谋', scszimou_info:'锁定技。出牌阶段,当你使用第二/四/六张牌时,你从牌堆中获得一张【酒】/【杀】/【决斗】。', @@ -13668,10 +13798,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ scspicai_info:'出牌阶段限一次。你可进行判定牌不置入弃牌堆的判定。若判定结果与本次发动技能时的其他判定结果的花色均不相同,则你可以重复此流程。然后你将所有位于处理区的判定牌交给一名角色。', scs_xiayun:'夏恽', scsyaozhuo:'谣诼', - scsyaozhuo_info:'出牌阶段限一次。你可以与一名角色拼点,若你赢,其跳过下一个摸牌阶段;若你没赢,你弃置一张牌。', + scsyaozhuo_info:'出牌阶段限一次。你可以与一名角色拼点,若你赢,其跳过下一个摸牌阶段;若你没赢,你弃置两张牌。', scs_hankui:'韩悝', scsxiaolu:'宵赂', - scsxiaolu_info:'出牌阶段限一次。你可以摸三张牌,然后选择一项:1.弃置三张牌;2.将三张牌交给一名其他角色。', + scsxiaolu_info:'出牌阶段限一次。你可以摸两张牌,然后选择一项:1.弃置两张牌;2.将两张牌交给一名其他角色。', scs_lisong:'栗嵩', scskuiji:'窥机', scskuiji_info:'出牌阶段限一次。你可以观看一名其他角色的手牌,然后弃置你与其的共计四张花色各不相同的手牌。', @@ -13684,6 +13814,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ scs_gaowang:'高望', scsanruo:'安弱', scsanruo_info:'你可以将一张♥牌当【桃】、♦牌当火【杀】、♣牌当【闪】、♠牌当【无懈可击】使用。当你以此法使用或打出【杀】或【闪】时,你可以获得对方的一张牌;当你以此法使用【桃】时,你可以获得一名其他角色的一张牌;当你以此法使用【无懈可击】时,你可以获得此牌响应的普通锦囊牌的使用者的一张牌。', + scsmiaoyu:'妙语', + scsmiaoyu_info:'你可以将至多两张相同花色的牌按照以下规则使用或打出:♦牌当作火【杀】,♥牌当作【桃】,♣牌当作【闪】,♠牌当作【无懈可击】。若你以此法使用了两张红色牌,则此牌回复值或伤害值+1。若你以此法使用了两张黑色牌,则你弃置当前回合角色一张牌。', mobile_standard:'手杀异构·标准包', diff --git a/character/offline.js b/character/offline.js index e97962f43..071d8a546 100644 --- a/character/offline.js +++ b/character/offline.js @@ -9,7 +9,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ offline_sticker:['sp_gongsunzan','sp_simazhao','sp_wangyuanji','sp_xinxianying','sp_liuxie'], offline_luanwu:["ns_lijue","ns_zhangji","ns_fanchou"], offline_yongjian:["ns_chendao","yj_caoang","yj_caocao",'yj_liru','yj_caohong','yj_zhangfei','yongjian_ganning','yj_dongzhuo','yj_xuyou','yj_jiaxu','yj_zhenji'], - offline_jiangshanruguqi:['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'], offline_piracyE:['shen_jiaxu','pe_wangyun','pe_zhonghui','pe_sunchen','pe_mengda','pe_wenqin','ns_caoanmin','jiangfei','chendong','jiangqing','kongrong','jiling','tianfeng','mateng'], offline_piracyS:['ns_jiaxu','longyufei','ps_guanyu','ps1059_guojia','ps2070_guojia','ps2063_zhaoyun','ps2067_zhaoyun','ps1062_zhouyu','ps2080_zhouyu','ps_caozhi','ps_jin_simayi','ps_caopi','ps_simayi','ps2068_simayi','ps_machao','ps_zhugeliang','ps2066_zhugeliang','ps_jiaxu','ps_lvbu','ps_shen_machao','jsp_liubei'], offline_piracyK:['pk_sp_duyu'], @@ -23,21 +22,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ vtb_xiaotao:['female','qun',4,['vtbtaoyan','vtbyanli']], vtb_xiaole:['female','qun',4,['vtbleyu','vtbyuanli']], vtb_xiaojiu:['female','qun',4,['vtbmeiniang','vtbyaoli']], - jsrg_liuhong:['male','qun',4,['jsrgchaozheng','jsrgshenchong','jsrgjulian'],['zhu']], - jsrg_hejin:['male','qun',4,['jsrgzhaobing','jsrgzhuhuan','jsrgyanhuo']], - jsrg_sunjian:['male','qun',4,['jsrgpingtao','jsrgjuelie']], - jsrg_huangfusong:['male','qun',4,['jsrgguanhuo','jsrgjuxia']], - jsrg_xushao:['male','qun',3,['sbyingmen','sbpingjian']], - jsrg_dongbai:['female','qun',3,['jsrgshichong','jsrglianzhu']], - jsrg_qiaoxuan:['male','qun',3,['jsrgjuezhi','jsrgjizhao']], - jsrg_yangbiao:['male','qun','3/4',['jsrgzhaohan','jsrgrangjie','jsrgyizheng']], - jsrg_kongrong:['male','qun',3,['jsrglirang','jsrgzhengyi']], - jsrg_zhujun:['male','qun',4,['jsrgfendi','jsrgjuxiang']], - jsrg_liubei:['male','qun',4,['jsrgjishan','jsrgzhenqiao']], - jsrg_wangyun:['male','qun',3,['jsrgshelun','jsrgfayi'],['clan:太原王氏']], - jsrg_liuyan:['male','qun',3,['xinfu_limu','jsrgtushe','jsrgtongjue'],['zhu']], - jsrg_caocao:['male','qun',4,['jsrgzhenglve','jsrghuilie']], - jsrg_nanhualaoxian:['male','qun',3,['jsrgshoushu','jsrgxundao','jsrglinghua']], ps_shen_machao:['male','shen',4,['psshouli','pshengwu'],['qun']], mateng:['male','qun',4,['mashu','xiongyi']], tianfeng:['male','qun',3,['sijian','gzsuishi']], @@ -109,7 +93,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ longyufei:'《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。', pk_sp_duyu:'杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。', ps_shen_machao:'字孟起,扶风茂陵人。面如冠玉,目如流星,虎体猿臂,彪腹狼腰,声雄力猛。因衣着讲究,举止非凡,故人称“锦马超”。麾铁骑,捻金枪。', - qiaoxuan:'桥玄(110年-184年6月6日),一作乔玄,字公祖。梁国睢阳县(今河南省商丘市睢阳区)人。东汉时期名臣。桥玄年轻时曾任睢阳县功曹,因坚持追究陈国相羊昌的恶行而闻名。后被举为孝廉,历任洛阳左尉、齐相及上谷、汉阳太守、司徒长史、将作大匠。汉桓帝末年,出任度辽将军,击败鲜卑、南匈奴、高句丽侵扰,保境安民。汉灵帝初年,迁任河南尹、少府、大鸿胪。建宁三年(170年),迁司空。次年,拜司徒。光和元年(178年),升任太尉。桥玄有感于国势日衰,于是称病请辞,改任太中大夫。光和七年(184年),桥玄去世,年七十五。桥玄性格刚强,不阿权贵,待人谦俭,尽管屡历高官,但不因为自己处在高位而有所私请。他为官清廉,去世后连下葬的钱都没有,被时人称为名臣。', xiaosha:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为三国杀新手菜鸡,误打误撞参加了三国杀组织的《三国之星》选秀大赛,没想到一路靠着颜值和风风火火的爽快性格过关斩将吸粉无数,获得了冠军,成为官方签约的形象代言人。
    小杀现于B站还存在对应账号,但早已荒废。', xiaoshan:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀同系不同班的同学,由于本身性格比较安静,所以和风风火火的小杀有些不对盘。知道小杀也玩三国杀后,外表高冷、内心傲娇的她偷偷也去玩了游戏,立志要在游戏里碾压她。
    小闪对应B站账号已销号。', xiaotao:'2021年「虚拟天团」Vtuber企划中推出的虚拟偶像之一,该企划原定培养12位虚拟偶像,然而企划由于各方面原因暴死,现虚拟偶像仅存在于各武将的皮肤中。
    设定上为小杀的亲妹妹,陪姐姐去拍摄代言宣传照的时候,被导演看中,觉得三国美貌姐妹花是非常好的噱头,于是一并签下。正所谓“三国姐妹花,永远不分家!”。
    小桃对应B站账号已销号。', @@ -161,9 +144,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, characterFilter:{ - jsrg_xushao:function(mode){ - return mode!='guozhan'; - }, }, skill:{ //天书乱斗虚拟偶像线下化 @@ -599,2251 +579,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, - //江山如故·起 - sbyingmen:{ - forbid:['guozhan'], - trigger:{ - global:'phaseBefore', - player:'enterGame', - }, - forced:true, - filter:function(event,player){ - return event.name!='phase'||game.phaseNumber==0; - }, - content:function(){ - if(!_status.characterlist) lib.skill.pingjian.initList(); - var characters=_status.characterlist.randomRemove(4); - lib.skill.sbyingmen.addVisitors(characters,player); - game.delayx(); - }, - group:'sbyingmen_reload', - subSkill:{ - reload:{ - trigger:{player:'phaseBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - return player.getStorage('sbyingmen').length<4; - }, - content:function(){ - if(!_status.characterlist) lib.skill.pingjian.initList(); - var characters=_status.characterlist.randomRemove(4-player.getStorage('sbyingmen').length); - lib.skill.sbyingmen.addVisitors(characters,player); - game.delayx(); - }, - }, - }, - getSkills:function(characters,player){ - var skills=[]; - for(var name of characters){ - if(Array.isArray(lib.character[name])){ - for(var skill of lib.character[name][3]){ - var list=get.skillCategoriesOf(skill,player); - list.remove('锁定技'); - if(list.length>0) continue; - var info=get.info(skill); - if(info&&(!info.unique||info.gainable)) skills.add(skill); - } - } - } - return skills; - }, - addVisitors:function(characters,player){ - player.addSkillBlocker('sbyingmen'); - game.log(player,'将','#y'+get.translation(characters),'加入了','#g“访客”') - lib.skill.rehuashen.drawCharacter(player,characters); - player.markAuto('sbyingmen',characters) - var storage=player.getStorage('sbyingmen'); - var skills=lib.skill.sbyingmen.getSkills(storage,player); - player.addInvisibleSkill(skills); - }, - removeVisitors:function(characters,player){ - var skills=lib.skill.sbyingmen.getSkills(characters,player); - var characters2=player.getStorage('sbyingmen').slice(0); - characters2.removeArray(characters); - skills.removeArray(lib.skill.sbyingmen.getSkills(characters2,player)); - player.unmarkAuto('sbyingmen',characters); - _status.characterlist.addArray(characters); - player.removeInvisibleSkill(skills); - }, - onremove:function(player,skill){ - lib.skill.sbyingmen.removeVisitors(player.getSkills('sbyingmen'),player); - player.removeSkillBlocker('sbyingmen'); - }, - skillBlocker:function(skill,player){ - if(!player.invisibleSkills.contains(skill)||skill=='sbpingjian'||skill=='sbpingjian') return false; - return !player.hasSkill('sbpingjian'); - }, - marktext:'客', - intro:{ - name:'访客', - mark:function(dialog,storage,player){ - if(!storage||!storage.length) return '当前没有“访客”'; - dialog.addSmall([storage,'character']); - var skills=lib.skill.sbyingmen.getSkills(storage,player); - if(skills.length) dialog.addText('
  • 当前可用技能:'+get.translation(skills),false); - }, - }, - }, - sbpingjian:{ - trigger:{player:['useSkill','logSkillBegin']}, - forced:true, - filter:function(event,player){ - var skill=event.sourceSkill||event.skill; - return player.invisibleSkills.contains(skill)&&lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player).contains(skill); - }, - content:function(){ - 'step 0' - var visitors=player.getStorage('sbyingmen').slice(0); - var drawers=visitors.filter(function(name){ - return Array.isArray(lib.character[name])&&lib.character[name][3].contains(trigger.sourceSkill); - }); - event.drawers=drawers; - if(visitors.length==1) event._result={bool:true,links:visitors}; - else{ - var dialog=['评鉴:请选择移去一张“访客”']; - if(drawers.length) dialog.push('
    如果移去'+get.translation(drawers)+',则你摸一张牌
    '); - dialog.push([visitors,'character']); - player.chooseButton(dialog,true); - } - 'step 1' - if(result.bool){ - lib.skill.sbyingmen.removeVisitors(result.links,player); - game.log(player,'移去了','#y'+get.translation(result.links[0])); - if(event.drawers.contains(result.links[0])){ - player.addTempSkill('sbpingjian_draw'); - player.storage.sbpingjian_draw.push(trigger.skill); - } - } - }, - group:'sbpingjian_trigger', - subSkill:{ - draw:{ - charlotte:true, - init:function(player,skill){ - if(!player.storage[skill]) player.storage[skill]=[]; - }, - onremove:true, - trigger:{player:['useSkillAfter','logSkill']}, - forced:true, - popup:false, - filter:function(event,player){ - return player.getStorage('sbpingjian_draw').contains(event.skill); - }, - content:function(){ - player.storage.sbpingjian_draw.remove(trigger.skill); - player.draw(); - if(!player.storage.sbpingjian_draw.length) player.removeSkill('sbpingjian_draw'); - }, - }, - trigger:{ - trigger:{player:'triggerInvisible'}, - forced:true, - forceDie:true, - popup:false, - charlotte:true, - priority:10, - filter:function(event,player){ - if(event.revealed) return false; - var info=get.info(event.skill); - if(info.charlotte) return false; - var skills=lib.skill.sbyingmen.getSkills(player.getStorage('sbyingmen'),player); - game.expandSkills(skills); - return skills.contains(event.skill); - }, - content:function(){ - "step 0" - if(get.info(trigger.skill).silent){ - event.finish(); - } - else{ - var info=get.info(trigger.skill); - var event=trigger,trigger=event._trigger; - var str; - var check=info.check; - if(info.prompt) str=info.prompt; - else{ - if(typeof info.logTarget=='string'){ - str=get.prompt(event.skill,trigger[info.logTarget],player); - } - else if(typeof info.logTarget=='function'){ - var logTarget=info.logTarget(trigger,player); - if(get.itemtype(logTarget).indexOf('player')==0) str=get.prompt(event.skill,logTarget,player); - } - else{ - str=get.prompt(event.skill,null,player); - } - } - if(typeof str=='function'){str=str(trigger,player)} - var next=player.chooseBool('评鉴:'+str); - next.set('yes',!info.check||info.check(trigger,player)); - next.set('hsskill',event.skill); - next.set('forceDie',true); - next.set('ai',function(){ - return _status.event.yes; - }); - if(typeof info.prompt2=='function'){ - next.set('prompt2',info.prompt2(trigger,player)); - } - else if(typeof info.prompt2=='string'){ - next.set('prompt2',info.prompt2); - } - else if(info.prompt2!=false){ - if(lib.dynamicTranslate[event.skill]) next.set('prompt2',lib.dynamicTranslate[event.skill](player,event.skill)); - else if(lib.translate[event.skill+'_info']) next.set('prompt2',lib.translate[event.skill+'_info']); - } - if(trigger.skillwarn){ - if(next.prompt2){ - next.set('prompt2',''+trigger.skillwarn+'。'+next.prompt2); - } - else{ - next.set('prompt2',trigger.skillwarn); - } - } - } - "step 1" - if(result.bool){ - trigger.revealed=true; - } - else{ - trigger.untrigger(); - trigger.cancelled=true; - } - } - }, - }, - }, - jsrgchaozheng:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - logTarget:function(event,player){ - return game.filterPlayer(i=>i!=player); - }, - prompt:'是否发动【朝争】?', - content:function(){ - player.chooseToDebate(game.filterPlayer(i=>i!=player)).set('callback',lib.skill.jsrgchaozheng.callback); - }, - callback:function(){ - var result=event.debateResult; - if(result.bool&&result.opinion){ - var opinion=result.opinion,targets=result.red.map(i=>i[0]); - targets.sortBySeat(); - targets.forEach(i=>i[opinion=='red'?'recover':'loseHp']()); - if(targets.length==0||result.black.length==0) player.draw(result.targets.length); - } - } - }, - jsrgshenchong:{ - audio:2, - enable:'phaseUse', - limited:true, - filterTarget:lib.filter.notMe, - skillAnimation:true, - animationColor:'soil', - content:function(){ - 'step 0' - player.awakenSkill('jsrgshenchong'); - target.addSkillLog('jsrgfeiyang'); - target.addSkillLog('jsrgbahu'); - 'step 1' - player.addSkill('jsrgshenchong_die'); - player.markAuto('jsrgshenchong_die',[target]); - }, - ai:{ - order:1, - result:{target:1} - }, - subSkill:{ - die:{ - audio:'jsrgshenchong', - trigger:{player:'die'}, - charlotte:true, - forced:true, - forceDie:true, - filter:function(event,player){ - return player.getStorage('jsrgshenchong_die').length; - }, - content:function(){ - var targets=player.getStorage('jsrgshenchong_die'); - player.line(targets); - targets.sortBySeat().forEach(current=>{ - current.clearSkills(true); - current.chooseToDiscard(current.countCards('h'),'h',true); - }); - } - } - } - }, - jsrgfeiyang:{ - trigger:{player:'phaseJudgeBegin'}, - direct:true, - filter:function(event,player){ - return player.countCards('j')&&player.countCards('h')>1; - }, - content:function(){ - 'step 0' - player.chooseToDiscard('h',2,get.prompt('jsrgfeiyang'),'弃置两张手牌并弃置判定区里的一张牌').set('logSkill','jsrgfeiyang').set('ai',function(card){ - return 6-get.value(card); - }); - 'step 1' - if(result.bool){ - player.discardPlayerCard(player,'j',true); - } - }, - }, - jsrgbahu:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - content:function(){ - player.draw(); - }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+1; - }, - }, - }, - jsrgjulian:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - filter:function(event,player){ - return player.hasZhuSkill('jsrgjulian')&&lib.skill.jsrgjulian.logTarget(null,player).length; - }, - prompt:'是否发动【聚敛】?', - prompt2:'你可以获得其他所有群势力角色的各一张牌', - logTarget:function(event,player){ - return game.filterPlayer(current=>{ - return current.group=='qun'&¤t.countGainableCards(player,'h')>0&¤t!=player; - }) - }, - content:function(){ - game.filterPlayer(current=>{ - return current.group=='qun'&¤t!=player; - }).sortBySeat().forEach(i=>{ - player.gainPlayerCard(i,'h',true); - }); - }, - group:'jsrgjulian_draw', - zhuSkill:true, - subSkill:{ - draw:{ - audio:'jsrgjulian', - trigger:{global:'gainAfter'}, - filter:function(event,player){ - var source=event.player; - if(source==player||source.group!='qun') return false; - var evt=event.getParent('phaseDraw'); - return (!evt||evt.player!=source)&&event.getParent().name=='draw'&&event.getParent(2).name!='jsrgjulian_draw'&&player.hasZhuSkill('jsrgjulian',event.player); - }, - direct:true, - usable:2, - content:function(){ - 'step 0' - var source=trigger.player; - event.source=source; - source.chooseBool('是否响应'+get.translation(player)+'的【聚敛】摸一张牌?'); - 'step 1' - if(result.bool){ - source.logSkill('jsrgjulian_draw',player); - source.draw(); - } - else player.storage.counttrigger.jsrgjulian_draw--; - } - }, - give:{ - charlotte:true, - onremove:true - } - } - }, - //何进 - jsrgzhaobing:{ - audio:2, - trigger:{player:'phaseJieshuBegin'}, - direct:true, - filter:function(event,player){ - var hs=player.getCards('h'); - if(!hs.length) return false; - for(var i of hs){ - if(!lib.filter.cardDiscardable(i,player,'jsrgzhaobing')) return false; - } - return true; - }, - content:function(){ - 'step 0' - var cards=player.getCards('h'); - var num=cards.length; - var prompt2='弃置所有手牌,令至多'+get.cnNumber(num)+'名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力'; - player.chooseTarget(get.prompt('jsrgzhaobing'),prompt2,[1,num],lib.filter.notMe).set('ai',target=>{ - if(!_status.event.goon) return 0; - return 2-get.attitude(_status.event.player,target); - }).set('goon',num/2{ - return 2-get.attitude(player,current)>0; - })); - 'step 1' - if(result.bool){ - player.logSkill('jsrgzhaobing',result.targets); - event.targets=result.targets; - event.targets.sortBySeat(); - player.chooseToDiscard(true,'h',player.countCards('h')); - } - else event.finish(); - 'step 2' - var target=targets.shift(); - event.target=target; - target.chooseCard('诏兵:交给'+get.translation(player)+'一张【杀】,或失去1点体力',(card)=>{ - return get.name(card)=='sha'; - }).set('ai',card=>{ - if(_status.event.goon) return 0; - return 6-get.value(card); - }).set('goon',get.effect(target,{name:'losehp'},target,target)>=0); - 'step 3' - if(result.bool) target.give(result.cards,player,true); - else target.loseHp(); - if(targets.length) event.goto(2); - }, - ai:{ - expose:0.2 - } - }, - jsrgzhuhuan:{ - audio:'mouzhu', - trigger:{player:'phaseZhunbeiBegin'}, - filter:function(event,player){ - var hs=player.getCards('h','sha'); - if(!hs.length) return false; - for(var i of hs){ - if(!lib.filter.cardDiscardable(i,player,'jsrgzhuhuan')) return false; - } - return true; - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jsrgzhuhuan'),lib.filter.notMe).set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jsrgzhuhuan',target); - var hs=player.getCards('h','sha'); - event.num=hs.length; - player.discard(hs); - } - else event.finish(); - 'step 2' - target.chooseToDiscard(get.translation(player)+'对你发动了【诛宦】','弃置'+get.cnNumber(num)+'张牌并失去1点体力;或点击“取消”令其回复1点体力且其摸'+get.cnNumber(num)+'张牌').set('ai',card=>{ - if(_status.event.goon) return 0; - return 5.5-get.value(card); - }).set('goon',target.hp<=2||get.attitude(target,player)>=0||player.isHealthy()); - 'step 3' - if(result.bool){ - target.loseHp(); - } - else{ - player.draw(num); - player.recover(); - } - }, - ai:{ - expose:0.2 - } - }, - jsrgyanhuo:{ - inherit:'spyanhuo', - forced:true, - }, - //孙坚 - jsrgpingtao:{ - audio:2, - enable:'phaseUse', - usable:1, - filterTarget:lib.filter.notMe, - content:function(){ - 'step 0' - var att=get.attitude(target,player); - target.chooseCard(get.translation(player)+'对你发动了【平讨】','交给其一张牌并令其此回合使用【杀】的次数上限+1;或点击“取消”令其视为对你使用一张【杀】','he').set('ai',card=>{ - if(_status.event.give){ - if(card.name=='sha'||card.name=='tao'||card.name=='jiu') return 0; - return 8-get.value(card); - } - if(_status.event.att<0&&card.name=='sha') return -1; - return 4-get.value(card); - }).set('give',(att>=0||target.hp==1&&target.countCards('hs','shan')<=1)&&get.effect(target,{name:'sha'},player,target)<0).set('att',att); - 'step 1' - if(result.bool){ - target.give(result.cards,player); - player.addTempSkill('jsrgpingtao_sha'); - player.addMark('jsrgpingtao_sha',1,false); - } - else if(player.canUse('sha',target,false)){ - player.useCard({name:'sha',isCard:true},target,false); - } - }, - ai:{ - expose:0.15, - order:5, - result:{target:-1} - }, - subSkill:{ - sha:{ - charlotte:true, - onremove:true, - marktext:'讨', - intro:{ - content:'本回合使用【杀】的次数上限+#', - }, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('jsrgpingtao_sha'); - }, - } - } - } - }, - jsrgjuelie:{ - audio:2, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return event.card&&event.card.name=='sha'&&event.getParent().type=='card'&&(player.isMinHandcard()||player.isMinHp()); - }, - forced:true, - locked:false, - group:'jsrgjuelie_discard', - content:function(){ - trigger.num++; - }, - shaRelated:true, - ai:{ - unequip_ai:true, - skillTagFilter:function(player,tag,arg){ - if(!arg||!arg.name||arg.name!='sha') return false; - if(!arg.target) return false; - var card=arg.target.getEquip(2); - return card&&get.value(card)>0&&player.hasCard(cardx=>{ - return lib.filter.cardDiscardable(cardx,player,'jsrgjuelie_discard')&&get.value(cardx)<5; - }); - }, - }, - subSkill:{ - discard:{ - audio:'jsrgjuelie', - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return player.countCards('he')&&event.card.name=='sha'; - }, - direct:true, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt('jsrgjuelie',trigger.target),'当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌',[1,Infinity],'he').set('ai',card=>{ - if(ui.selected.cards.length>=_status.event.max) return 0; - if(_status.event.goon) return 4.5-get.value(card); - return 0; - }).set('max',trigger.target.countDiscardableCards(player,'he')).set('goon',get.attitude(player,trigger.target)<0).set('logSkill',['jsrgjuelie_discard',trigger.target]); - 'step 1' - if(result.bool){ - var num=result.cards.length; - if(trigger.target.countDiscardableCards(player,'he')) player.discardPlayerCard('平讨:弃置'+get.translation(trigger.target)+get.cnNumber(num)+'张牌',num,'he',trigger.target,true); - } - } - } - } - }, - //皇甫嵩 - jsrgguanhuo:{ - audio:2, - trigger:{player:'useCardAfter'}, - filter:function(event,player){ - return event.card.storage&&event.card.storage.jsrgguanhuo&&!game.hasPlayer2(current=>{ - return current.hasHistory('damage',evt=>evt.card==event.card); - }); - }, - forced:true, - locked:false, - group:'jsrgguanhuo_viewas', - content:function(){ - 'step 0' - var count=player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length; - if(count==1){ - player.addTempSkill('jsrgguanhuo_ex','phaseUseAfter'); - player.addMark('jsrgguanhuo_ex',1,false); - trigger.targets.forEach(i=>i.removeSkill('huogong2')); - } - else{ - player.removeSkill('jsrgguanhuo'); - game.log(player,'失去了技能','#g【观火】'); - } - }, - ai:{ - effect:{ - player:function(card,player){ - if(_status.event.getParent().skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length==1) return 'zeroplayertarget'; - if(_status.event.type=='phase'&&_status.event.skill=='jsrgguanhuo_viewas'&&player.getHistory('useSkill',evt=>evt.skill=='jsrgguanhuo_viewas').length>1&&player.countCards('h')<=3) return [0,0]; - } - } - }, - subSkill:{ - viewas:{ - audio:'jsrgguanhuo', - enable:'phaseUse', - viewAs:{ - name:'huogong', - isCard:true, - storage:{ - jsrgguanhuo:true - } - }, - filterCard:()=>false, - selectCard:-1, - prompt:'视为使用一张【火攻】', - ai:{ - order:function(item,player){ - return get.order({name:'huogong'})+0.01; - }, - } - }, - ex:{ - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - return event.card&&event.card.name=='huogong'&&event.getParent().type=='card'; - }, - forced:true, - charlotte:true, - onremove:true, - intro:{content:'当你造成渠道为【火攻】的伤害时,此伤害+#'}, - content:function(){ - trigger.num+=player.countMark('jsrgguanhuo_ex'); - } - } - } - }, - jsrgjuxia:{ - audio:2, - trigger:{target:'useCardToTargeted'}, - usable:1, - countSkill:function(player){ - return player.getSkills(null,false,false).filter(function(skill){ - var info=get.info(skill); - if(!info||info.charlotte) return false; - if(info.zhuSkill) return player.hasZhuSkill(skill); - return true; - }).length; - }, - filter:function(event,player){ - return event.player!=player&&lib.skill.jsrgjuxia.countSkill(event.player)>lib.skill.jsrgjuxia.countSkill(player); - }, - direct:true, - content:function(){ - 'step 0' - var goon=get.effect(player,trigger.card,trigger.player,trigger.player)<1; - if(goon&&!event.isMine()&&!event.isOnline()) game.delayx(); - trigger.player.chooseBool('是否对'+get.translation(player)+'发动【居下】?','令'+get.translation(trigger.card)+'对其无效,然后其摸两张牌').set('ai',()=>{ - return _status.event.goon; - }).set('goon',goon); - 'step 1' - if(result.bool){ - trigger.player.logSkill('jsrgjuxia',player); - trigger.excluded.add(player); - player.draw(2); - } - else player.storage.counttrigger.jsrgjuxia--; - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(lib.skill.jsrgjuxia.countSkill(target)>=lib.skill.jsrgjuxia.countSkill(player)) return; - if(card&&(card.cards||card.isCard)&&get.attitude(target,player)>0&&(!target.storage.counttrigger||!target.storage.counttrigger.jsrgjuxia)) return [0,0.5,0,0.5]; - }, - }, - } - }, - //许劭 - jsrgyingmen:{ - audio:2, - trigger:{ - global:'phaseBefore', - player:['enterGame','phaseBegin'], - }, - forced:true, - filter:function(event,player,name){ - if(player.getStorage('jsrgyingmen').length>=4) return false; - if(name=='phaseBefore') return game.phaseNumber==0; - return event.name!='phase'||event.player==player; - }, - update:function(player){ - var id=player.playerid; - var characters=player.getStorage('jsrgyingmen'); - var skillName='jsrgpingjian_'+id; - var skillsx=[],skillsx2=[]; - var map={}; - var skillsy=lib.skill[skillName]?lib.skill[skillName].group:[]; - for(var name of characters){ - var skills=lib.character[name][3].slice(); - skills=skills.filter(skill=>{ - var list=get.skillCategoriesOf(skill,player); - list.removeArray(['锁定技','Charlotte']); - if(list.length) return false; - var info=get.info(skill); - return info&&(!info.unique||info.gainable); - }); - game.expandSkills(skills); - for(var i=0;i{ - return lib.skill.jsrgyingmen.bannedList.contains(skill); - })) continue; - list.push(name); - _status.characterlist.remove(name); - if(list.length>=4-num) break; - } - if(list.length){ - player.markAuto('jsrgyingmen',list); - if(player.hasSkill('jsrgpingjian',null,false,false)) lib.skill.jsrgyingmen.update(player); - game.log(player,'将','#g'+get.translation(list),'置为','#y访客'); - game.broadcastAll(function(player,list){ - var cards=[]; - for(var i=0;i{ - return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; - })) return true; - } - return false; - }, - content:function(){ - 'step 0' - var current; - var skill=trigger.skill,name=trigger.event?trigger.event.name:''; - var visitors=player.getStorage('jsrgyingmen'); - for(var visitor of visitors){ - var skills=lib.character[visitor][3].slice(); - game.expandSkills(skills); - var info=get.info(skill); - if(info&&info.charlotte) continue; - if(skills.some(skillx=>{ - return skill.indexOf(skillx)==0||name.indexOf(skillx+'_'+player.playerid)==0; - })){ - current=visitor; - break; - } - } - event.current=current; - player.chooseButton(['###评鉴:移去一名访客###
    若移去的访客为'+get.translation(current)+',则你摸一张牌
    ',[player.getStorage('jsrgyingmen'),'character']],true).set('ai',button=>{ - if(button.link==_status.event.toremove) return 1; - return Math.random(); - }).set('toremove',function(){ - var list=player.getStorage('jsrgyingmen'); - var rand=Math.random(); - if(rand<0.33) return list[0]; - if(rand<0.66) return current; - return list.randomGet(); - }()); - 'step 1' - if(result.bool){ - var visitor=result.links[0]; - game.log(player,'从','#y访客','中移去了','#g'+get.translation(visitor)); - player.popup(visitor); - player.unmarkAuto('jsrgyingmen',[visitor]); - _status.characterlist.add(visitor); - if(visitor==event.current) player.draw(); - lib.skill.jsrgyingmen.update(player); - } - }, - subSkill:{ - blocker:{ - init:function(player,skill){ - player.addSkillBlocker(skill); - }, - onremove:function(player,skill){ - player.removeSkillBlocker(skill); - }, - charlotte:true, - locked:true, - skillBlocker:function(skill,player){ - if(skill!='jsrgpingjian_'+player.playerid) return false; - if(player._jsrgpingjian_blockerChecking) return; - player._jsrgpingjian_blockerChecking=true; - var own=player.hasSkill('jsrgpingjian'); - delete player._jsrgpingjian_blockerChecking; - return !own; - } - }, - } - }, - //董白 - jsrgshichong:{ - audio:2, - zhuanhuanji:true, - trigger:{player:'useCardToPlayered'}, - direct:true, - filter:function(event,player){ - return event.target!=player&&event.targets.length==1&&event.target.isIn()&&event.target.countCards('h'); - }, - mark:true, - marktext:'☯', - intro:{ - content:function(storage,player){ - var str='转换技。当你使用牌指定其他角色为唯一目标后,'; - if(storage) return str+'目标角色可以交给你一张手牌。'; - return str+'你可以获得目标角色一张手牌。'; - }, - }, - content:function(){ - 'step 0' - if(!player.storage.jsrgshichong){ - player.chooseBool(get.prompt('jsrgshichong',trigger.target),'你可以获得该角色的一张手牌').set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.attitude(player,trigger.target)<=0); - } - else{ - trigger.target.chooseCard('是否发动'+get.translation(player)+'的【恃宠】?','你可以选择一张手牌,并交给该角色').set('ai',card=>{ - if(_status.event.goon) return 5-get.value(card); - return 0-get.value(card); - }).set('goon',get.attitude(trigger.target,player)>2); - } - 'step 1' - if(result.bool){ - if(!player.storage.jsrgshichong){ - player.logSkill('jsrgshichong',trigger.target); - player.gainPlayerCard(trigger.target,'h',true); - } - else{ - trigger.target.logSkill('jsrgshichong',player); - trigger.target.give(result.cards,player); - } - player.changeZhuanhuanji('jsrgshichong'); - } - } - }, - jsrglianzhu:{ - audio:2, - enable:'phaseUse', - usable:1, - filterCard:{color:'black'}, - position:'h', - filterTarget:lib.filter.notMe, - lose:false, - discard:false, - delay:false, - content:function(){ - 'step 0' - player.showCards(cards,get.translation(player)+'发动了【连诛】'); - 'step 1' - player.give(cards,target); - 'step 2' - event.targets=game.filterPlayer(current=>{ - return current.group==target.group&¤t!=player; - }).sortBySeat(); - game.delayx(); - 'step 3' - var target=targets.shift(); - if(player.canUse('guohe',target)){ - player.useCard({name:'guohe',isCard:true},target); - } - if(targets.length) event.redo(); - }, - ai:{ - order:4, - result:{ - target:function(player,target){ - var targets=game.filterPlayer(current=>{ - return current.group==target.group&¤t!=player; - }); - var eff=targets.reduce((p,c)=>{ - return p+get.effect(c,{name:'guohe'},player,player); - }) - if(ui.selected.cards.length) eff+=get.value(ui.selected.cards[0],target); - return eff; - } - } - } - }, - //桥玄 - jsrgjuezhi:{ - audio:2, - trigger:{source:'damageBegin1'}, - filter:function(event,player){ - if(_status.currentPhase!=player||player.hasSkill('jsrgjuezhi_used',null,null,false)) return false; - return event.card&&event.getParent().type=='card'&&lib.skill.jsrgjuezhi.getNum(event.player,player)>0; - }, - forced:true, - locked:false, - getNum:function(target,player){ - return target.countCards(card=>{ - var subtype=get.subtypes(card); - for(var i of subtype){ - if(player.hasDisabledSlot(i)) return true; - } - return false; - }); - }, - group:'jsrgjuezhi_disable', - content:function(){ - player.addTempSkill('jsrgjuezhi_used',['phaseZhunbeiAfter','phaseJudgeAfter','phaseDrawAfter','phaseUseAfter','phaseDiscardAfter','phaseJieshuAfter']); - trigger.num+=lib.skill.jsrgjuezhi.getNum(trigger.player,player); - }, - subSkill:{ - disable:{ - audio:'jsrgjuezhi', - trigger:{ - player:'loseAfter', - global:['equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], - }, - direct:true, - filter:function(event,player){ - var evt=event.getl(player); - return evt&&evt.es&&evt.es.length>0; - }, - content:function(){ - 'step 0' - event.cards=trigger.getl(player).es; - 'step 1' - var card=cards.shift(),subtypes=get.subtypes(card).filter(slot=>player.hasEnabledSlot(slot)); - event.subtypes=subtypes; - if(subtypes.length>0){ - player.chooseBool(get.prompt('jsrgjuezhi_disable'),'废除你的'+get.translation(subtypes)+'栏').set('ai',()=>1); - } - else event._result={bool:false}; - 'step 2' - if(result.bool){ - player.logSkill('jsrgjuezhi_disable'); - player.disableEquip(event.subtypes); - } - if(cards.length>0) event.goto(1); - }, - }, - used:{charlotte:true} - } - }, - jsrgjizhao:{ - audio:2, - trigger:{player:['phaseZhunbeiBegin','phaseJieshuBegin']}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('jsrgjizhao')).set('ai',target=>{ - var player=_status.event.player; - if(player.countCards('j')) return player==target?10:0.1; - return 6-get.attitude(player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jsrgjizhao',target); - target.chooseToUse({ - filterCard:function(card,player,event){ - if(get.itemtype(card)!='card'||get.position(card)!='h'&&get.position(card)!='s') return false; - return lib.filter.filterCard.apply(this,arguments); - }, - prompt:'急召:使用一张手牌,否则'+get.translation(player)+'可以移动你区域里的一张牌', - addCount:false, - goon:target!=player||!player.countCards('j'), - ai1:function(card){ - if(_status.event.goon) return get.order(card); - return 0; - } - }); - } - 'step 2' - if(result.bool){event.finish();return;} - var targets=game.filterPlayer(current=>{ - if(current==target) return false; - var hs=target.getCards('h'); - if(hs.length) return true; - var js=target.getCards('j'); - for(var i=0;i0) return att; - return 0; - } - return -att*att2; - }); - next.set('targetprompt','移动目标'); - next.set('prompt','急召:是否移动'+get.translation(target)+'的一张牌?'); - } - else event.finish(); - 'step 3' - if(result.bool){ - var target2=result.targets[0]; - event.targets=[target,target2]; - player.line2(event.targets,'green'); - } - else{ - event.finish(); - } - 'step 4' - game.delay(); - 'step 5' - if(targets.length==2){ - player.choosePlayerCard('hej',true,function(button){ - var player=_status.event.player; - var targets0=_status.event.targets0; - var targets1=_status.event.targets1; - if(get.attitude(player,targets0)>0&&get.attitude(player,targets1)<0){ - if(get.position(button.link)=='j') return 12; - if(get.value(button.link,targets0)<0&&get.effect(targets1,button.link,player,targets1)>0) return 10; - return 0; - } - else{ - if(get.position(button.link)=='j') return -10; - if(get.position(button.link)=='h') return 10; - return get.value(button.link)*get.effect(targets1,button.link,player,targets1); - } - },targets[0]).set('targets0',targets[0]).set('targets1',targets[1]).set('filterButton',function(button){ - var targets1=_status.event.targets1; - if(get.position(button.link)=='h'){ - return true; - } - else if(get.position(button.link)=='j'){ - return targets1.canAddJudge(button.link); - } - else{ - return targets1.canEquip(button.link); - } - }); - } - else{ - event.finish(); - } - 'step 6' - if(result.bool&&result.links.length){ - var link=result.links[0]; - if(get.position(link)=='h'){ - event.targets[1].gain(link); - } - else if(get.position(link)=='e'){ - event.targets[1].equip(link); - } - else if(link.viewAs){ - event.targets[1].addJudge({name:link.viewAs},[link]); - } - else{ - event.targets[1].addJudge(link); - } - event.targets[0].$give(link,event.targets[1],false); - game.log(event.targets[0],'的',get.position(link)=='h'?'一张手牌':link,'被移动给了',event.targets[1]); - game.delay(); - } - }, - ai:{ - effect:{ - target:function(card,player,target,current){ - if(get.type(card)=='delay'&¤t<0){ - if(target.countCards('j')) return; - return 'zerotarget'; - } - }, - }, - } - }, - //杨彪 - jsrgzhaohan:{ - audio:'zhaohan', - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - locked:false, - filter:function(event,player){ - if(game.shuffleNumber==0) return player.isDamaged(); - return true; - }, - content:function(){ - player[game.shuffleNumber>0?'loseHp':'recover'](); - } - }, - jsrgrangjie:{ - audio:'rangjie', - trigger:{player:'damageEnd'}, - filter:function(event,player){ - return player.canMoveCard(); - }, - check:function(event,player){ - return player.canMoveCard(true); - }, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' - event.num--; - if(player.canMoveCard()) player.moveCard(true); - 'step 2' - if(result.bool){ - var card=result.card; - var suit=get.suit(card,false); - var cards=Array.from(ui.discardPile.childNodes); - var gains=[]; - var history=game.getGlobalHistory('cardMove',evt=>{ - if(evt.name=='lose') return evt.position==ui.discardPile; - return evt.name=='cardsDiscard'; - }); - for(var i=history.length-1;i>=0;i--){ - var evt=history[i]; - var cards2=evt.cards.filter(card=>{ - return cards.contains(card)&&get.suit(card,false)==suit; - }); - if(cards2.length){ - gains.addArray(cards2); - cards.removeArray(cards2); - } - if(!cards.length) break; - } - if(gains.length){ - player.chooseButton(['让节:是否获得一张'+get.translation(suit)+'牌?',gains]).set('ai',get.buttonValue); - } - else event._result={bool:false}; - } - 'step 3' - if(result.bool){ - player.gain(result.links,'gain2'); - } - 'step 4' - if(event.num>0&&player.hasSkill('jsrgrangjie')){ - player.chooseBool(get.prompt2('jsrgrangjie')).set('ai',()=>_status.event.bool).set('bool',lib.skill.jsrgrangjie.check(trigger,player)); - } - else event.finish(); - 'step 5' - if(result.bool){ - player.logSkill('jsrgrangjie'); - event.goto(1); - } - }, - ai:{ - maixie:true, - maixie_hp:true, - effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(target._jsrgrangjie_aiChecking) return; - target._jsrgrangjie_aiChecking=true; - var moveCard=target.canMoveCard(true); - delete target._jsrgrangjie_aiChecking; - if(!moveCard||!target.hasFriend()) return; - var num=1; - if(get.attitude(player,target)>0){ - if(player.needsToDiscard()){ - num=0.5; - } - else{ - num=0.3; - } - } - if(target.hp>=4) return [1,num*2]; - if(target.hp==3) return [1,num*1.5]; - if(target.hp==2) return [1,num*0.5]; - } - }, - }, - }, - }, - jsrgyizheng:{ - audio:'yizheng', - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(function(current){ - return current.countCards('h')>player.countCards('h')&&player.canCompare(current); - }); - }, - filterTarget:function(card,player,current){ - return current.countCards('h')>player.countCards('h')&&player.canCompare(current); - }, - content:function(){ - 'step 0' - player.chooseToCompare(target); - 'step 1' - if(result.bool){ - target.skip('phaseDraw'); - target.addTempSkill('yizheng2',{player:'phaseDrawSkipped'}); - event.finish(); - } - else{ - target.chooseControl('1','2','cancel').set('prompt','是否对'+get.translation(player)+'造成至多2点伤害?').set('ai',()=>{ - return _status.event.choice; - }).set('choice',get.damageEffect(player,target,target)>0?(get.attitude(target,player)>0?0:1):'cancel2'); - } - 'step 2' - if(result.control!='cancel2'){ - var num=result.index+1; - target.line(player); - player.damage(target,num); - } - }, - ai:{ - order:1, - result:{ - target:function(player,target){ - if(target.skipList.contains('phaseDraw')||target.hasSkill('pingkou')) return 0; - var hs=player.getCards('h').sort(function(a,b){ - return b.number-a.number; - }); - var ts=target.getCards('h').sort(function(a,b){ - return b.number-a.number; - }); - if(!hs.length||!ts.length) return 0; - if(hs[0].number>ts[0].number) return -1; - return 0; - }, - }, - }, - }, - //孔融 - jsrglirang:{ - audio:'splirang', - trigger:{global:'phaseDrawBegin'}, - direct:true, - filter:function(event,player){ - return event.player!=player&&!player.hasSkill('jsrglirang_used')&&player.countCards('he')>1; - }, - content:function(){ - 'step 0' - player.chooseCard(get.prompt('jsrglirang',trigger.player),'你可以选择两张牌,将这些牌交给该角色。若如此做,你获得其本回合弃牌阶段弃置的所有牌。',2,'he').set('ai',card=>{ - if(!_status.event.give) return 0; - var player=_status.event.player,target=_status.event.target; - return target.getUseValue(card)-player.getUseValue(card)+0.5; - }).set('give',get.attitude(player,trigger.player)>0).set('target',trigger.player); - 'step 1' - if(result.bool){ - player.logSkill('jsrglirang',trigger.player); - var cards=result.cards; - player.give(cards,trigger.player); - player.addTempSkill('jsrglirang_used','roundStart'); - player.addTempSkill('jsrglirang_given'); - player.markAuto('jsrglirang_used',[trigger.player]); - } - }, - subSkill:{ - used:{ - charlotte:true, - onremove:true, - intro:{content:'本轮〖礼让〗目标:$'}, - }, - given:{ - audio:'splirang', - trigger:{global:'phaseDiscardEnd'}, - filter:function(event,player){ - return event.player.hasHistory('lose',evt=>{ - return evt.type=='discard'&&evt.getParent('phaseDiscard')==event&&evt.cards2.filterInD('d').length>0; - }); - }, - charlotte:true, - prompt2:function(event,player){ - var cards=[]; - event.player.getHistory('lose',evt=>{ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards2.filterInD('d')); - }); - return '获得'+get.translation(cards); - }, - content:function(){ - var cards=[]; - trigger.player.getHistory('lose',evt=>{ - if(evt.type=='discard'&&evt.getParent('phaseDiscard')==trigger) cards.addArray(evt.cards2.filterInD('d')); - }); - player.gain(cards,'gain2'); - } - } - } - }, - jsrgzhengyi:{ - audio:2, - trigger:{player:'damageBegin4'}, - filter:function(event,player){ - var list=player.getStorage('jsrglirang_used'); - if(!list.length) return false; - return !player.getHistory('damage').length&&list[0].isIn(); - }, - direct:true, - content:function(){ - 'step 0' - var target=player.getStorage('jsrglirang_used')[0]; - event.target=target; - target.chooseBool('是否对'+get.translation(player)+'发动【争义】?','将此'+(trigger.source?'来源为'+get.translation(trigger.source):'无来源')+'的'+trigger.num+'点伤害转移给你').set('ai',()=>{ - return _status.event.bool; - }).set('bool',get.damageEffect(player,trigger.source,target)>get.damageEffect(target,trigger.source,target)); - 'step 1' - if(result.bool){ - target.logSkill('jsrgzhengyi',player); - trigger.cancel(); - target.damage(trigger.source,trigger.nature,trigger.num).set('card',trigger.card).set('cards',trigger.cards); - } - } - }, - //朱儁 - jsrgfendi:{ - audio:2, - trigger:{player:'useCardToPlayered'}, - filter:function(event,player){ - return event.targets.length==1&&event.card.name=='sha'&&event.targets[0].countCards('h')>0; - }, - usable:1, - logTarget:'target', - content:function(){ - 'step 0' - var target=trigger.target; - event.target=target; - player.choosePlayerCard(target,'h',true,[1,Infinity],'分敌:展示'+get.translation(target)+'的任意张手牌').set('ai',button=>{ - if(_status.event.all) return 1; - if(ui.selected.buttons.length) return 0; - return Math.random(); - }).set('all',!target.mayHaveShan()&&Math.random()<0.75).set('forceAuto',true); - 'step 1' - if(result.bool){ - var cards=result.cards; - target.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【分敌】'); - target.addGaintag(cards,'jsrgfendi_tag'); - target.addTempSkill('jsrgfendi_blocker'); - player.addTempSkill('jsrgfendi_gain'); - if(!trigger.card.storage) trigger.card.storage={}; - trigger.card.storage.jsrgfendi=true; - player.storage.jsrgfendi_gain=target; - } - else player.storage.counttrigger.jsrgfendi--; - }, - subSkill:{ - blocker:{ - trigger:{ - player:['damageBefore','damageCancelled','damageZero'], - target:['shaMiss','useCardToExcluded','useCardToEnd'], - global:['useCardEnd'], - }, - forced:true, - popup:false, - charlotte:true, - content:function(){ - player.removeSkill('jsrgfendi_blocker'); - }, - mod:{ - cardEnabled:function(card,player){ - if(card.cards){ - for(var i of card.cards){ - if(!i.hasGaintag('jsrgfendi_tag')) return false; - } - } - else if(get.itemtype(card)=='card'){ - if(!card.hasGaintag('jsrgfendi_tag')) return false; - } - }, - cardRespondable:function(card,player){ - return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); - }, - cardSavable:function(card,player){ - return lib.skill.jsrgfendi.cardEnabled.apply(this,arguments); - }, - }, - }, - gain:{ - trigger:{global:'damageSource'}, - charlotte:true, - forced:true, - direct:true, - onremove:true, - filter:function(event,player){ - var target=player.storage.jsrgfendi_gain; - return event.card&&event.card.storage&&event.card.storage.jsrgfendi&&target&&target.isIn()&&target.hasCard(card=>{ - return card.hasGaintag('jsrgfendi_tag'); - },'h'); - }, - content:function(){ - player.logSkill('jsrgfendi_gain',player.storage.jsrgfendi_gain); - player.gain(player.storage.jsrgfendi_gain.getCards('h',card=>{ - return card.hasGaintag('jsrgfendi_tag'); - }),'give'); - } - } - } - }, - jsrgjuxiang:{ - audio:2, - trigger:{ - player:'gainAfter', - global:'loseAsyncAfter', - }, - filter:function(event,player){ - var evt=event.getParent('phaseDraw'); - if(evt&&evt.name=='phaseDraw') return false; - var hs=player.getCards('h'); - var cards=event.getg(player).filter(i=>hs.contains(i)); - if(!cards.length) return false; - for(var card of cards){ - if(!lib.filter.cardDiscardable(card,player,'jsrgjuxiang')) return false; - } - return true; - }, - check:function(event,player){ - var target=_status.currentPhase; - if(!target||get.attitude(player,target)<=0) return false; - var evt=event.getParent('phaseDiscard'),evt2=event.getParent('phaseJieshu'); - if(evt&&evt.name=='phaseDiscard'||evt2&&evt.name=='phaseJieshu') return false; - if(target.getCardUsable({name:'sha'})>=target.countCards('hs','sha')) return false; - if(!target.hasValueTarget({name:'sha'})) return false; - var hs=player.getCards('h'); - var cards=event.getg(player).filter(i=>hs.contains(i)); - var val=0; - for(var i of cards) val+=get.value(i); - if(val<10) return true; - return false; - }, - prompt2:function(event,player){ - var hs=player.getCards('h'); - var cards=event.getg(player).filter(i=>hs.contains(i)); - var target=_status.currentPhase; - var str='弃置'+get.translation(cards); - if(target&&target.isIn()){ - var list=[]; - for(var card of cards){ - list.add(get.suit(card,player)); - } - var num=list.length; - str+=',然后令'+get.translation(target)+'于此回合额定的出牌阶段内使用【杀】的次数上限+'+num; - } - return str; - }, - content:function(){ - 'step 0' - var hs=player.getCards('h'); - var cards=trigger.getg(player).filter(i=>hs.contains(i)); - var list=[]; - for(var card of cards){ - list.add(get.suit(card,player)); - } - event.num=list.length; - player.discard(cards); - 'step 1' - var target=_status.currentPhase; - if(target&&target.isIn()){ - target.addTempSkill('jsrgjuxiang_sha'); - target.addMark('jsrgjuxiang_sha',num,false); - var evt=trigger.getParent('phaseUse'); - if(evt&&evt.name=='phaseUse'&&!evt.skill){ - evt.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); - evt.player.addMark('jsrgjuxiang_buff',num,false); - } - } - }, - subSkill:{ - sha:{ - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return !event.skill; - }, - silent:true, - charlotte:true, - forced:true, - onremove:true, - content:function(){ - trigger.player.addTempSkill('jsrgjuxiang_buff','phaseUseAfter'); - trigger.player.addMark('jsrgjuxiang_buff',player.countMark('jsrgjuxiang_sha'),false); - } - }, - buff:{ - charlotte:true, - intro:{content:'使用【杀】的次数上限+#'}, - onremove:true, - mod:{ - cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('jsrgjuxiang_buff'); - }, - } - } - } - }, - //刘备 - jsrgjishan:{ - audio:2, - trigger:{global:'damageBegin4'}, - usable:1, - filter:function(event,player){ - return player.hp>0; - }, - logTarget:'player', - onremove:true, - prompt2:'失去1点体力并防止此伤害,然后你与其各摸一张牌', - check:function(event,player){ - return get.damageEffect(event.player,event.source,player,event.nature)*Math.sqrt(event.num)<=get.effect(player,{name:'losehp'},player,player); - }, - group:'jsrgjishan_recover', - content:function(){ - 'step 0' - trigger.cancel(); - player.loseHp(); - player.markAuto('jsrgjishan',[trigger.player]); - 'step 1' - if(player.isIn()&&trigger.player.isIn()){ - var targets=[player,trigger.player]; - targets.sortBySeat(_status.currentPhase); - targets[0].draw('nodelay'); - targets[1].draw(); - } - }, - intro:{content:'已帮助$抵挡过伤害'}, - ai:{expose:0.2}, - subSkill:{ - recover:{ - audio:'jsrgjishan', - trigger:{source:'damageSource'}, - filter:function(event,player){ - return game.hasPlayer(current=>{ - return current.isMinHp()&&player.getStorage('jsrgjishan').contains(current); - }); - }, - usable:1, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrgjishan_recover'),'令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力',(card,player,target)=>{ - return target.isMinHp()&&player.getStorage('jsrgjishan').contains(target); - }).set('ai',target=>{ - return get.recoverEffect(target,_status.event.player,_status.event.player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgjishan_recover',target); - target.recover(); - } - else player.storage.counttrigger.jsrgjishan_recover--; - } - } - } - }, - jsrgzhenqiao:{ - audio:2, - trigger:{player:'useCardToTargeted'}, - forced:true, - shaRelated:true, - filter:function(event,player){ - return event.isFirstTarget&&event.card.name=='sha'&&player.hasEmptySlot(1); - }, - content:function(){ - // trigger.getParent().targets=trigger.getParent().targets.concat(trigger.targets); - // trigger.getParent().triggeredTargets4=trigger.getParent().triggeredTargets4.concat(trigger.targets); - trigger.getParent().effectCount++; - }, - ai:{ - effect:{ - target:function(card,player,target){ - if(player._jsrgzhenqiao_aiChecking) return; - if(target==player&&get.subtype(card)=='equip1'&&!player.getEquip(1)){ - player._jsrgzhenqiao_aiChecking=true; - var eff=get.effect(target,card,player,player); - delete player._jsrgzhenqiao_aiChecking; - if(eff<3) return 'zerotarget'; - } - } - } - }, - mod:{ - attackRange:function(player,num){ - return num+1; - }, - } - }, - //王允 - jsrgshelun:{ - audio:2, - enable:'phaseUse', - usable:1, - filter:function(event,player){ - return game.hasPlayer(current=>player.inRange(current)); - }, - filterTarget:function(card,player,target){ - return player.inRange(target); - }, - content:function(){ - var num=player.countCards('h'); - var targets=game.filterPlayer(current=>{ - return current.countCards('h')<=num&¤t!=target; - }); - player.chooseToDebate(targets).set('callback',function(){ - var result=event.debateResult; - if(result.bool&&result.opinion){ - var opinion=result.opinion; - var target=event.getParent(2).target; - if(opinion=='red') player.discardPlayerCard(target,'he',true); - else target.damage(); - } - }).set('ai',card=>{ - var player=_status.event.player; - var color=(player==_status.event.source||get.damageEffect(_status.event.getParent(2).target,player,player)>0)?'black':'red'; - var val=5-get.value(card); - if(get.color(card)==color) val+=10; - return val; - }).set('aiCard',target=>{ - var color=(target==_status.event.source||get.damageEffect(_status.event.getParent(2).target,target,target)>0)?'black':'red'; - var hs=target.getCards('h',{color:color}); - if(!hs.length) hs=target.getCards('h'); - return {bool:true,cards:[hs.randomGet()]}; - }).set('target',target); - }, - ai:{ - order:8, - expose:0.2, - result:{target:-1}, - } - }, - jsrgfayi:{ - audio:2, - trigger:{global:'chooseToDebateAfter'}, - filter:function(event,player){ - if(!event.targets.contains(player)) return false; - if(event.red.map(i=>i[0]).contains(player)) return event.black.length; - if(event.black.map(i=>i[0]).contains(player)) return event.red.length; - return false; - }, - direct:true, - content:function(){ - 'step 0' - var targets=[]; - if(trigger.red.map(i=>i[0]).contains(player)) targets=trigger.black; - if(trigger.black.map(i=>i[0]).contains(player)) targets=trigger.red; - player.chooseTarget(get.prompt('jsrgfayi'),'对一名与你意见不同的角色造成1点伤害',(card,player,target)=>{ - return _status.event.targets.contains(target); - }).set('targets',targets.map(i=>i[0])).set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgfayi',target); - target.damage(); - } - } - }, - jsrgtushe:{ - audio:'xinfu_tushe', - trigger:{ - player:'useCardToPlayered', - }, - filter:function (event,player){ - if(get.type(event.card)=='equip') return false; - if(event.getParent().triggeredTargets3.length>1) return false; - return event.targets.length>0; - }, - check:function(event,player){ - return !player.countCards('h',{type:'basic'}); - }, - content:function (){ - 'step 0' - player.showHandcards(); - 'step 1' - if(player.countCards('h',{type:'basic'})) event.finish(); - else player.chooseBool('图射:是否摸'+get.cnNumber(trigger.targets.length)+'张牌?').set('ai',()=>1); - 'step 2' - if(result.bool){ - player.draw(trigger.targets.length); - } - }, - ai:{ - presha:true, - pretao:true, - threaten:1.8, - }, - }, - jsrgtongjue:{ - audio:2, - enable:'phaseUse', - usable:1, - zhuSkill:true, - filter:function(event,player){ - return player.hasZhuSkill('jsrgtongjue')&&game.hasPlayer(current=>current!=player&¤t.group=='qun'); - }, - filterCard:true, - selectCard:[1,Infinity], - filterTarget:function(card,player,target){ - return target!=player&&target.group=='qun'; - }, - selectTarget:[1,Infinity], - filterOk:function(){ - return ui.selected.cards.length==ui.selected.targets.length; - }, - check:function(card){ - var player=_status.event.player; - if(player.hasCard(card=>{ - return player.hasValueTarget(card); - },'hs')){ - return 3-player.getUseValue(card); - } - return 3-get.value(card); - }, - multiline:true, - multitarget:true, - delay:false, - discard:false, - lose:false, - content:function(){ - 'step 0' - var list=[]; - for(var i=0;icurrent.getSeatNum()==1); - return event.player==zhu; - }, - locked:false, - group:'jsrgzhenglve_damage', - prompt2:function(event,player){ - var num=Math.min(event.player.getHistory('sourceDamage').length>0?1:2,game.countPlayer(current=>{ - return !current.hasMark('jsrgzhenglve_mark'); - })); - if(num==0) return '你可以摸一张牌'; - return '你可以摸一张牌并令'+get.cnNumber(num)+'名角色获得“猎”标记'; - }, - content:function(){ - 'step 0' - player.draw(); - 'step 1' - var damaged=trigger.player.getHistory('sourceDamage').length>0; - var num=damaged?1:2; - var targets=game.filterPlayer(current=>{ - return !current.hasMark('jsrgzhenglve_mark'); - }); - if(!targets.length) event.finish(); - else if(targets.length<=num) event._result={bool:true,targets:targets}; - else player.chooseTarget('令'+get.cnNumber(num)+'名角色获得“猎”标记',true,num,(card,player,target)=>{ - return !target.hasMark('jsrgzhenglve_mark'); - }).set('ai',target=>{ - var att=get.attitude(_status.event.player,target); - return 100-att; - }); - 'step 2' - if(result.bool){ - var targets=result.targets; - player.line(targets); - targets.forEach(i=>i.addMark('jsrgzhenglve_mark',1)); - } - }, - mod:{ - cardUsableTarget:function(card,player,target){ - if(target.hasMark('jsrgzhenglve_mark')) return true; - }, - targetInRange:function(card,player,target){ - if(target.hasMark('jsrgzhenglve_mark')) return true; - }, - }, - subSkill:{ - damage:{ - audio:'jsrgzhenglve', - trigger:{source:'damageSource'}, - usable:1, - filter:function(event,player){ - return event.player.hasMark('jsrgzhenglve_mark'); - }, - prompt2:function(event,player){ - var cards=event.cards||[]; - return '摸一张牌'+(cards.filterInD().length?'并获得'+get.translation(event.cards.filterInD()):''); - }, - content:function(){ - 'step 0' - player.draw(); - var cards=trigger.cards; - if(cards&&cards.filterInD().length){ - player.gain(cards.filterInD(),'gain2'); - } - } - }, - mark:{ - marktext:'猎', - intro:{ - name:'猎(政略)', - name2:'猎', - markcount:()=>0, - content:'已拥有“猎”标记', - } - } - } - }, - jsrghuilie:{ - audio:2, - trigger:{player:'phaseZhunbeiBegin'}, - juexingji:true, - forced:true, - skillAnimation:true, - animationColor:'thunder', - derivation:['jsrgpingrong','feiying'], - filter:function(event,player){ - return game.countPlayer(current=>current.hasMark('jsrgzhenglve_mark'))>2; - }, - content:function(){ - 'step 0' - player.awakenSkill('jsrghuilie'); - player.loseMaxHp(); - 'step 1' - player.addSkillLog('jsrgpingrong'); - player.addSkillLog('feiying'); - } - }, - jsrgpingrong:{ - audio:2, - trigger:{global:'phaseEnd'}, - filter:function(event,player){ - return !player.hasSkill('jsrgpingrong_used')&&game.hasPlayer(current=>current.hasMark('jsrgzhenglve_mark')); - }, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrghuilie'),'移去一名角色的“猎”,然后你执行一个额外回合。若你在此额外回合内未造成伤害,则你失去1点体力。',(card,player,target)=>{ - return target.hasMark('jsrgzhenglve_mark'); - }).set('ai',target=>{ - return get.attitude(_status.event.player,target); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('jsrgpingrong',target); - player.addTempSkill('jsrgpingrong_used','roundStart'); - target.removeMark('jsrgzhenglve_mark',target.countMark('jsrgzhenglve_mark')); - player.insertPhase(); - player.addSkill('jsrgpingrong_check'); - } - }, - subSkill:{ - used:{charlotte:true}, - check:{ - audio:'jsrgpingrong', - trigger:{player:'phaseAfter'}, - charlotte:true, - forced:true, - filter:function(event,player){ - return event.skill=='jsrgpingrong'&&!player.getHistory('sourceDamage').length; - }, - content:function(){ - player.loseHp(); - } - } - } - }, - //南华老仙 - jsrgshoushu:{ - audio:2, - forced:true, - trigger:{global:'roundStart'}, - filter:function(event,player){ - return !game.hasPlayer(function(current){ - return current.countCards('hejsx','taipingyaoshu'); - })&&!Array.from(ui.cardPile.childNodes).concat(Array.from(ui.discardPile.childNodes)) - .concat(Array.from(ui.ordering.childNodes)).map(i=>i.name).contains('taipingyaoshu'); - }, - direct:true, - group:'jsrgshoushu_destroy', - content:function(){ - 'step 0' - player.chooseTarget(get.prompt('jsrgshoushu'),'将【太平要术】置入一名角色的装备区',(card,player,target)=>{ - var card={name:'taipingyaoshu'}; - return target.canEquip(card,true); - }).set('ai',target=>{ - return target.getUseValue({name:'taipingyaoshu'})*get.attitude(_status.event.player,target); - }) - 'step 1' - if(result.bool){ - var target=result.targets[0]; - event.target=target; - player.logSkill('jsrgshoushu',target); - if(!lib.inpile.contains('taipingyaoshu')){ - lib.inpile.push('taipingyaoshu'); - } - event.card=game.createCard2('taipingyaoshu','heart',3); - } - else event.finish(); - 'step 2' - if(card) target.equip(card); - }, - subSkill:{ - destroy:{ - audio:'jsrgshoushu', - trigger:{ - global:['loseEnd','equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], - }, - forced:true, - filter:function(event,player){ - return game.hasPlayer(current=>{ - var evt=event.getl(current); - if(evt&&evt.es) return evt.es.some(i=>i.name=='taipingyaoshu'); - return false; - }); - }, - content:function(){ - var cards=[]; - game.countPlayer(current=>{ - var evt=trigger.getl(current); - if(evt&&evt.es) return cards.addArray(evt.es.filter(i=>i.name=='taipingyaoshu')); - }); - game.cardsGotoSpecial(cards); - game.log(cards,'被销毁了'); - } - } - } - }, - jsrgxundao:{ - audio:2, - trigger:{player:'judge'}, - filter:function(event,player){ - return game.hasPlayer(current=>current.countCards('he')); - }, - direct:true, - content:function(){ - 'step 0' - var prompt2=get.translation(player)+'(你)的'+(trigger.judgestr||'')+'判定为'+ - get.translation(player.judging[0])+','+'是否令至多两名角色依次弃置一张牌,然后选择其中一张作为新判定牌?'; - player.chooseTarget(get.prompt('jsrgxundao'),prompt2,[1,2],(card,player,target)=>{ - return target.countCards('he'); - }).set('ai',target=>{ - var player=_status.event.player; - if(!_status.event.todiscard) return 0; - if(_status.event.todiscard!='all'){ - if(target==_status.event.todiscard) return 100; - } - return get.effect(target,{name:'guohe_copy2'},player,player)/2; - }).set('todiscard',function(){ - if(trigger.judgestr=='闪电'&&get.damageEffect(player,null,player,'thunder')>=0) return 'all'; - var friends=game.filterPlayer(i=>get.attitude(i,player)>0); - for(var friend of friends){ - var cardsx=friend.getCards('he',card=>trigger.judge(card)>0); - cardsx.sort((a,b)=>{ - return get.value(a)-get.value(b); - }); - if(cardsx.length){ - var card=cardsx[0]; - if(trigger.judge(player.judging[0])>=0){ - if(get.value(card)>4) return false; - } - return get.owner(card); - } - } - return 'all'; - }()) - 'step 1' - if(result.bool){ - var targets=result.targets; - targets.sortBySeat(_status.currentPhase); - event.targets=targets; - player.logSkill('jsrgxundao',targets); - event.cards=[]; - } - else event.finish(); - 'step 2' - var target=targets.shift(); - target.chooseToDiscard('寻道:请弃置一张牌'+(target==player?'':',可能被作为新判定牌'),'he',true).set('ai',target=>{ - var trigger=_status.event.getTrigger(); - var player=_status.event.player; - var judging=_status.event.judging; - var result=trigger.judge(card)-trigger.judge(judging); - var attitude=get.attitude(player,trigger.player); - if(attitude==0||result==0) return 0.1; - if(attitude>0){ - return result+0.01; - } - else{ - return 0.01-result; - } - }); - 'step 3' - if(result.bool){ - event.cards.addArray(result.cards); - } - if(targets.length) event.goto(2); - 'step 4' - var cards=event.cards.filterInD('d'); - if(cards.length){ - player.chooseButton(['寻道:选择一张作为新判定牌',cards],true).set('ai',button=>{ - return trigger.judge(button.link); - }); - } - else event.finish(); - 'step 5' - if(result.bool){ - var card=result.links[0]; - event.card=card; - game.cardsGotoOrdering(card).relatedEvent=trigger; - } - else event.finish(); - 'step 6' - if(player.judging[0].clone){ - game.broadcastAll(function(card,card2,player){ - if(card.clone){ - card.clone.classList.remove('thrownhighlight'); - } - var node=player.$throwordered(card2.copy(),true); - node.classList.add('thrownhighlight'); - ui.arena.classList.add('thrownhighlight'); - },player.judging[0],card,player); - game.addVideo('deletenode',player,get.cardsInfo([player.judging[0].clone])); - } - game.cardsDiscard(player.judging[0]); - player.judging[0]=card; - trigger.orderingCards.add(card); - game.log(player,'的判定牌改为',card); - game.delay(2); - }, - ai:{ - rejudge:true, - tag:{ - rejudge:1, - } - } - }, - jsrglinghua:{ - audio:2, - trigger:{ - player:['phaseZhunbeiBegin','phaseJieshuBegin'], - }, - prompt2:function(event,player){ - var zhunbei=event.name=='phaseZhunbei'; - return '进行目标为你'+(zhunbei?'':'且效果反转')+'的【闪电】判定。若你未因此受到伤害,你可以'+(zhunbei?'令一名角色回复1点体力':'对一名角色造成1点雷电伤害'); - }, - check:function(event,player){ - var e2=player.getEquip(2); - if(e2&&e2.name=='taipingyaoshu') return true; - if(event.name=='phaseZhunbei'&&game.hasPlayer(current=>{ - return get.recoverEffect(current,player,player)>=0; - })) return true; - if(event.name=='phaseJieshu'&&game.hasPlayer(current=>{ - return get.damageEffect(current,player,player,'thunder')>=0; - })&&player.hasSkillTag('rejudge')&&player.hasCard(card=>{ - return lib.card.shandian.judge(card)<0; - },'he')) return true; - return false; - }, - content:function(){ - 'step 0' - var judge=trigger.name=='phaseZhunbei'?lib.card.shandian.judge:function(card){ - if(get.suit(card)!='spade'||get.number(card)<=1||get.number(card)>=10) return -5; - return 1; - } - player.judge(judge,get.translation('shandian')).set('judge2',lib.card.shandian.judge2); - game.delayx(1.5); - 'step 1' - var name='shandian'; - if(event.cancelled&&!event.direct){ - if(lib.card[name].cancel){ - var next=game.createEvent(name+'Cancel'); - next.setContent(lib.card[name].cancel); - next.cards=[]; - next.card=get.autoViewAs({name:name}); - next.player=player; - } - } - else{ - var next=game.createEvent(name); - next.setContent(function(){ - if(result.bool==false){ - player.damage(3,'thunder','nosource'); - } - }); - next._result=result; - next.cards=[]; - next.card=get.autoViewAs({name:name}); - next.player=player; - } - 'step 2' - if(!player.hasHistory('damage',evt=>{ - return evt.card&&evt.card.name=='shandian'&&evt.getParent(2)==event; - })){ - if(trigger.name=='phaseZhunbei'){ - player.chooseTarget('灵化:是否令一名角色回复1点体力?').set('ai',target=>{ - var player=_status.event.player; - return get.recoverEffect(target,player,player); - }); - } - else{ - player.chooseTarget('灵化:是否对一名角色造成1点雷电伤害?').set('ai',target=>{ - var player=_status.event.player; - return get.damageEffect(target,player,player,'thunder'); - }); - } - } - else event.finish(); - 'step 3' - if(result.bool){ - var target=result.targets[0]; - player.line(target); - if(trigger.name=='phaseZhunbei') target.recover(); - else target.damage('thunder'); - } - }, - ai:{ - threaten:2.8 - } - }, //官盗S特015神马超 psshouli:{ audio:'shouli', @@ -8539,10 +6274,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, characterReplace:{}, dynamicTranslate:{ - jsrgshichong:function(player){ - if(player.storage.jsrgshichong) return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; - return '转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。'; - }, }, translate:{ sp_gongsunzan:'SP公孙瓒', @@ -8762,7 +6493,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zyshilu_info:'①一名角色死亡后,你可以将其武将牌置于你的武将牌上,称为“戮”,若杀死其的角色是你,你将一张武将牌堆里的牌置为“戮”。②回合开始时,你可以弃置至多X张牌,然后摸等量的牌(X为“戮”数)。', zyxiongnve:'凶虐', zyxiongnve_info:'①出牌阶段开始时,你可以将一张“戮”置入武将牌堆并选择一项直到回合结束:1.当你造成伤害时,此伤害+1;2.当你对其他角色造成伤害时,获得其一张牌;3.你使用牌无次数限制。②出牌阶段结束时,你可以将两张“戮”置入武将牌堆,然后当你于下回合开始前受到其他角色造成的伤害时,此伤害-1。', - pe_wenqin:'文钦', + pe_wenqin:'战役篇文钦', + pe_wenqin_ab:'文钦', gzjinfa:'矜伐', gzjinfa_info:'出牌阶段限一次。你可以弃置一张牌,令一名其他角色选择一项:1.令你获得其一张牌;2.交给你一张装备牌,若此牌花色为♠,其视为对你使用一张【杀】。', zyshangyi:'尚义', @@ -8861,116 +6593,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ pkmiewu:'灭吴', pkmiewu2:'灭吴', pkmiewu_info:'每回合限一次。你可移去1枚“武库”,视为使用或打出任意一张基本牌或普通锦囊牌,然后摸一张牌。', - //江山如故·起 - jsrg_liuhong:'起刘宏', - jsrg_liuhong_ab:'刘宏', - jsrgchaozheng:'朝争', - jsrgchaozheng_info:'准备阶段,你可以令所有其他角色议事。若结果为:红色,意见为红色的角色各回复1点体力;黑色,意见为红色的角色各失去1点体力。然后若所有意见均相同,你摸X张牌(X为此次议事的角色数)。', - jsrgshenchong:'甚宠', - jsrgshenchong_info:'限定技。出牌阶段,你可以令一名其他角色获得〖飞扬〗、〖跋扈〗。若如此做,当你死亡时,其失去所有技能并弃置所有手牌。', - jsrgjulian:'聚敛', - jsrgjulian_info:'主公技。①其他群势力角色每回合限两次。当其不于摸牌阶段且不因〖聚敛〗摸牌后,其可以摸一张牌。②结束阶段,你可以获得所有其他群势力角色各一张牌。', - jsrgfeiyang:'飞扬', - jsrgfeiyang_info:'判定阶段开始时,若你的判定区里有牌,你可以弃置两张手牌并弃置你判定区里的一张牌。', - jsrgbahu:'跋扈', - jsrgbahu_info:'锁定技。①准备阶段,你摸一张牌。②你使用【杀】的次数上限+1。', - jsrg_hejin:'起何进', - jsrg_hejin_ab:'何进', - jsrgzhaobing:'诏兵', - jsrgzhaobing_info:'结束阶段,你可以弃置所有手牌,然后令至多X名其他角色依次选择一项:1.正面向上交给你一张【杀】;2.失去1点体力(X为你本次弃置的牌数)。', - jsrgzhuhuan:'诛宦', - jsrgzhuhuan_info:'准备阶段,你可以展示所有手牌并弃置所有【杀】,然后令一名其他角色选择一项:1.弃置等量的牌,然后受到1点伤害;2.令你摸等量的牌,然后你回复1点体力。', - jsrgyanhuo:'延祸', - jsrgyanhuo_info:'锁定技。当你死亡时,你增加如下全局技能:当有角色使用【杀】时,此【杀】的伤害值基数+1。', - jsrg_sunjian:'起孙坚', - jsrg_sunjian_ab:'孙坚', - jsrgpingtao:'平讨', - jsrgpingtao_info:'出牌阶段限一次。你可以令一名其他角色选择一项:1.交给你一张牌,然后你于此回合使用【杀】的次数上限+1;2.令你视为对其使用一张【杀】。', - jsrgjuelie:'绝烈', - jsrgjuelie_info:'①当你造成渠道为【杀】的伤害时,若你的手牌数或体力值最小,此伤害+1。②当你使用【杀】指定一名角色为目标后,你可以弃置任意张牌,然后弃置其等量的牌。', - jsrg_huangfusong:'起皇甫嵩', - jsrg_huangfusong_ab:'皇甫嵩', - jsrgguanhuo:'观火', - jsrgguanhuo_info:'①出牌阶段,你可以视为使用一张【火攻】。②当你因〖观火①〗使用的【火攻】结算结束后,若此牌未造成过伤害,且:若{你此阶段发动〖观火①〗的次数为1,则你于此阶段造成渠道为【火攻】的伤害时,此伤害+1},否则你失去〖观火〗。', - jsrgjuxia:'居下', - jsrgjuxia_info:'每回合限一次。当其他角色使用牌指定你为目标后,若其技能数多于你,其可以令此牌对你无效,然后令你摸两张牌。', - jsrg_xushao:'起许劭', - jsrg_xushao_ab:'许劭', - jsrgyingmen:'盈门', - jsrgyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', - jsrgpingjian:'评鉴', - jsrgpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,你摸一张牌。', - jsrg_dongbai:'起董白', - jsrg_dongbai_ab:'董白', - jsrgshichong:'恃宠', - jsrgshichong_info:'转换技。当你使用牌指定其他角色为唯一目标后,阴:你可以获得目标角色一张手牌;阳:目标角色可以交给你一张手牌。', - jsrglianzhu:'连诛', - jsrglianzhu_info:'出牌阶段限一次。你可以展示一张黑色手牌并交给一名其他角色,然后视为你对所有与其势力相同的其他角色依次使用一张【过河拆桥】。', - jsrg_qiaoxuan:'起桥玄', - jsrg_qiaoxuan_ab:'桥玄', - jsrgjuezhi:'绝质', - jsrgjuezhi_info:'①当你失去一张装备区里的装备牌后,你可以废除对应的装备栏。②你的回合每阶段限一次。当你使用牌对目标角色造成伤害时,你令此伤害+X(X为其装备区里的牌与你已废除的装备栏中相同副类别的数量)。', - jsrgjizhao:'急召', - jsrgjizhao_info:'准备阶段或结束阶段,你可以令一名角色选择一项:1.使用一张手牌;2.令你可以移动其区域里的一张牌。', - jsrg_yangbiao:'起杨彪', - jsrg_yangbiao_ab:'杨彪', - jsrgzhaohan:'昭汉', - jsrgzhaohan_info:'准备阶段,若本局游戏:未洗过牌,你回复1点体力;洗过牌,你失去1点体力。', - jsrgrangjie:'让节', - jsrgrangjie_info:'当你受到1点伤害后,你可以移动场上的一张牌,然后你可以于弃牌堆中选择获得一张本回合进入弃牌堆且与此牌花色相同的牌。', - jsrgyizheng:'义争', - jsrgyizheng_info:'出牌阶段限一次。你可以与一名手牌数大于你的角色拼点。若你:赢,其跳过下一个摸牌阶段;没赢,其可以对你造成至多2点伤害。', - jsrg_kongrong:'起孔融', - jsrg_kongrong_ab:'孔融', - jsrglirang:'礼让', - jsrglirang_info:'每轮限一次。其他角色的摸牌阶段开始时,你可以交给其两张牌。然后此回合的弃牌阶段结束时,你可以获得所有其于此阶段因弃置进入弃牌堆的牌。', - jsrgzhengyi:'争义', - jsrgzhengyi_info:'当你每回合首次受到伤害时,本轮因〖礼让〗获得过牌的其他角色可以将此伤害转移给其。', - jsrg_zhujun:'起朱儁', - jsrg_zhujun_ab:'朱儁', - jsrgfendi:'分敌', - jsrgfendi_tag:'分敌', - jsrgfendi_info:'每回合限一次。当你使用【杀】指定唯一目标后,你可以展示其任意张手牌,令其不能使用或打出对应实体牌不全为这些牌的牌直到此【杀】结算结束。然后当此【杀】对其造成伤害后,你获得这些牌。', - jsrgjuxiang:'拒降', - jsrgjuxiang_info:'当你不于摸牌阶段获得牌后,你可以弃置之,令当前回合角色于此回合额定的出牌阶段内使用【杀】的次数上限+X(X为你以此法弃置的牌的花色数)。', - jsrg_liubei:'起刘备', - jsrg_liubei_ab:'刘备', - jsrgjishan:'积善', - jsrgjishan_info:'①每回合限一次。当一名角色受到伤害时,你可以失去1点体力并防止此伤害,然后你与其各摸一张牌。②每回合限一次。当你造成伤害后,你可以令一名体力值最小且你对其发动过〖积善①〗的角色回复1点体力。', - jsrgzhenqiao:'振鞘', - jsrgzhenqiao_info:'锁定技。①你的攻击范围+1。②当你使用【杀】指定目标后,若你的武器栏为空且未废除,你令此【杀】的效果额外结算一次。', - jsrg_wangyun:'起王允', - jsrg_wangyun_ab:'王允', - jsrgshelun:'赦论', - jsrgshelun_info:'出牌阶段限一次。你可以选择一名你攻击范围内的角色,然后令除其外所有手牌数不大于你的角色议事。若结果为:红色,你弃置其一张牌;黑色,你对其造成1点伤害。', - jsrgfayi:'伐异', - jsrgfayi_info:'当你议事结算结束后,你可以对一名意见与你不同的角色造成1点伤害。', - jsrg_liuyan:'起刘焉', - jsrg_liuyan_ab:'刘焉', - jsrgtushe:'图射', - jsrgtushe_info:'当你使用非装备牌指定目标后,你可以展示所有手牌。若你没有基本牌,你可以摸X张牌(X为此牌指定的目标数)。', - jsrgtongjue:'通绝', - jsrgtongjue_info:'主公技。出牌阶段限一次。你可以将任意张牌交给等量名其他群势力角色。然后你不能使用牌指定这些角色为目标直到回合结束。', - jsrg_caocao:'起曹操', - jsrg_caocao_ab:'曹操', - jsrgzhenglve:'政略', - jsrgzhenglve_info:'①主公的回合结束时,你可以摸一张牌,然后令一名没有“猎”标记的角色获得“猎”(若主公本回合没有造成过伤害,则改为两名)。②你对有“猎”的角色使用牌无距离和次数限制。③每回合限一次。当你对有“猎”的角色造成伤害后,你可以摸一张牌并获得造成此伤害的牌。', - jsrghuilie:'会猎', - jsrghuilie_info:'觉醒技。准备阶段,若有“猎”的角色数大于2,你减1点体力上限,然后获得〖平戎〗和〖飞影〗。', - jsrgpingrong:'平戎', - jsrgpingrong_info:'每轮限一次。一名角色的回合结束时,你可以移去一名角色的“猎”,然后你于此回合后执行一个额外回合。该回合结束后,若你于此回合未造成过伤害,你失去1点体力。', - jsrg_nanhualaoxian:'起南华老仙', - jsrg_nanhualaoxian_ab:'南华老仙', - jsrgshoushu:'授术', - jsrgshoushu_info:'锁定技。①每轮开始时,若游戏内没有【太平要术】,你可以从游戏外将【太平要术】置于一名角色的装备区内。②当【太平要术】离开一名角色的装备区后,你令此牌销毁。', - jsrgxundao:'寻道', - jsrgxundao_info:'当你的判定牌生效前,你可以令至多两名角色依次弃置一张牌,然后你选择一张以此法弃置且位于弃牌堆中的牌代替此判定牌。', - jsrglinghua:'灵化', - jsrglinghua_info:'①准备阶段,你可以进行目标角色为你的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以令一名角色回复1点体力。②结束阶段,你可以进行目标角色为你且判定效果反转的【闪电】的特殊的使用流程。若你未因此受到伤害,你可以对一名角色造成1点雷电伤害。', - sbyingmen:'盈门', - sbyingmen_info:'锁定技。①游戏开始时,你将武将牌堆中随机四张武将牌置于你的武将牌上,称为“访客”。②回合开始时,若你的“访客”数小于4,你随机从武将牌堆中将“访客”补至四张。', - sbpingjian:'评鉴', - sbpingjian_info:'你可以于满足你“访客”上的一个无技能标签或仅有锁定技标签的技能条件的时机发动此技能,然后你选择移去一张“访客”。若移去的是本次发动技能的“访客”,则你于此技能结算结束时摸一张牌。', + //天书乱斗虚拟偶像 vtb_xiaosha:'小杀', vtbguisha:'瑰杀', vtbguisha_info:'当其他角色使用【杀】时,你可以弃置一张牌令此【杀】不计入次数,且此【杀】对目标角色造成的伤害+1。', @@ -9001,7 +6624,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ offline_sticker:'桌游志·贴纸', offline_luanwu:'文和乱武', offline_yongjian:'用间篇', - offline_jiangshanruguqi:'江山如故·起', offline_feihongyingxue:'飞鸿映雪', offline_piracyE:'官盗E系列·战役篇', offline_piracyS:'官盗S系列', diff --git a/character/old.js b/character/old.js index 150478ec7..2ae282792 100755 --- a/character/old.js +++ b/character/old.js @@ -953,7 +953,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ old_zhugezhan:"旧诸葛瞻", zhangliang:'SP张梁', yuji:'旧于吉', - old_zhangfei:'十周年张飞', + old_zhangfei:'新杀张飞', old_zhangfei_ab:'张飞', old_huatuo:'OL华佗', jsp_caoren:'☆SP曹仁', @@ -966,9 +966,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ old_caochong:'旧曹冲', old_guanqiujian:'旧毌丘俭', old_huangfusong:'旧皇甫嵩', - ol_liuyu:'OL刘虞', + ol_liuyu:'旧刘虞', old_wangyun:'旧王允', - old_zhaoyun:'十周年赵云', + old_zhaoyun:'新杀赵云', old_zhaoyun_ab:'赵云', ol_huaxiong:'旧华雄', diff --git a/character/rank.js b/character/rank.js index d74424ff4..6828e867f 100644 --- a/character/rank.js +++ b/character/rank.js @@ -30,6 +30,8 @@ window.noname_character_rank={ 'wanglang', 'caojinyu', 'zhangmancheng', + 'wu_zhugeliang', + 'sunlingluan', 'key_mio', 'key_midori', 'key_yuri', @@ -120,7 +122,6 @@ window.noname_character_rank={ 'key_yuuki', 'db_key_liyingxia', 'key_kiyu', - 'wu_zhugeliang', ], a:[ 'diy_zaozhirenjun', @@ -303,6 +304,12 @@ window.noname_character_rank={ 'shichangshi', 'ol_wenqin', 'clan_zhonghui', + 'jsrg_chunyuqiong', + 'jsrg_guanyu', + 'dc_caocao', + 'dc_liubei', + 'dc_sunquan', + 'yuechen', 'key_misuzu', 'key_sunohara', 'key_umi', @@ -587,6 +594,10 @@ window.noname_character_rank={ 'yanghong', 'dc_sunhanhua', 'shen_dianwei', + 'zhoubuyi', + 'jsrg_sunce', + 're_caorui', + 'ol_zhouqun', ], bp:[ 'chess_diaochan', @@ -932,6 +943,10 @@ window.noname_character_rank={ 'ol_mengda', 'dc_wuban', 're_caochong', + 'jsrg_lvbu', + 'jsrg_xuyou', + 'jsrg_zhangliao', + 'jsrg_zhenji', ], b:[ 'diy_feishi', @@ -1221,7 +1236,6 @@ window.noname_character_rank={ 'vtb_xiaoshan', 'vtb_xiaotao', 'zhangchu', - 'dc_duyu', 'chentai', 'clan_zhongyan', 'sb_zhurong', @@ -1229,6 +1243,9 @@ window.noname_character_rank={ 'xizheng', 'dc_duyu', 'clan_wanghun', + 'jsrg_chendeng', + 'jsrg_zhanghe', + 'jsrg_zoushi', ], bm:[ 'diy_xizhenxihong', @@ -1418,6 +1435,7 @@ window.noname_character_rank={ 'qianzhao', 'vtb_xiaosha', 'huanfan', + 'jsrg_xugong', ], c:[ 'xiahoudun', @@ -1670,6 +1688,8 @@ window.noname_character_rank={ 'yue_caiwenji', 'clan_zhongyan', 'shen_dianwei', + 'sunlingluan', + 'ol_zhouqun', 'key_tomoya', 'key_masato', 'key_shiorimiyuki', @@ -1910,6 +1930,8 @@ window.noname_character_rank={ 'zhanghua', 'lushi', 'clan_zhonghui', + 'zhoubuyi', + 'dc_wangjun', 'key_kano', 'key_haruko', 'key_akiko', @@ -2441,6 +2463,7 @@ window.noname_character_rank={ 'zerong', 'std_panfeng', 're_caochong', + 're_caorui', ], } }; diff --git a/character/refresh.js b/character/refresh.js index 3a6e80df1..6db9cdc0a 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -13,13 +13,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ refresh_yijiang2:['re_madai','re_wangyi','xin_handang','xin_zhonghui','re_liaohua','re_chengpu','re_caozhang','dc_bulianshi','xin_liubiao','re_xunyou','re_guanzhang'], refresh_yijiang3:['re_jianyong','re_guohuai','re_zhuran','re_panzhangmazhong','xin_yufan','dc_liru','re_manchong','re_fuhuanghou','re_guanping','re_liufeng','re_caochong'], refresh_yijiang4:['re_sunluban','re_wuyi','re_hanhaoshihuan','re_caozhen','re_zhoucang','dc_chenqun','re_caifuren','re_guyong','re_jushou','re_zhuhuan','re_zhangsong'], - refresh_yijiang5:['re_zhangyi','re_quancong','re_caoxiu','re_sunxiu','re_gongsunyuan','re_guotufengji','re_xiahoushi','re_liuchen','re_zhuzhi'], + refresh_yijiang5:['re_zhangyi','re_quancong','re_caoxiu','re_sunxiu','re_gongsunyuan','re_guotufengji','re_xiahoushi','re_liuchen','re_zhuzhi','re_caorui'], refresh_yijiang6:['re_guohuanghou','re_sundeng'], refresh_xinghuo:['re_duji','dc_gongsunzan','re_sp_taishici','re_caiyong','re_mazhong','re_wenpin','re_jsp_huangyueying'], }, }, connect:true, character:{ + re_caorui:['male','wei',3,['huituo','mingjian','rexingshuai'],['unseen','zhu']], re_caochong:['male','wei',3,['rechengxiang','renxin']], ol_zhangzhang:['male','wu',3,['olzhijian','olguzheng']], re_jsp_huangyueying:['female','qun',3,['rejiqiao','relinglong']], @@ -162,6 +163,95 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_guohuai:['xiahouyuan','zhanghe'], }, skill:{ + //堪比界曹冲的界曹叡 + rexingshuai:{ + audio:2, + skillAnimation:true, + animationColor:'thunder', + trigger:{player:'dying'}, + zhuSkill:true, + filter:function(event,player){ + if(player.hp>0) return false; + if(!player.hasZhuSkill('rexingshuai')) return false; + return game.hasPlayer(function(current){ + return current!=player&¤t.group=='wei'; + }); + }, + init:function(player){ + if(player.hasZhuSkill('rexingshuai')){ + player.markSkill('rexingshuai'); + player.storage.rexingshuai=false; + } + }, + intro:{ + content:'limited', + }, + limited:true, + mark:false, + content:function(){ + 'step 0' + player.awakenSkill('rexingshuai'); + var targets=game.filterPlayer(); + targets.sortBySeat(_status.currentPhase); + targets.remove(player); + event.targets=targets; + event.damages=[]; + player.addSkill('rexingshuai_restore'); + 'step 1' + if(event.targets.length){ + var current=event.targets.shift(); + if(current.group=='wei'){ + current.chooseBool('是否令'+get.translation(player)+'回复一点体力?').set('ai',function(){ + return get.attitude(_status.event.player,_status.event.target)>2; + }).set('target',player); + event.current=current; + } + else{ + event.redo(); + } + } + else{ + event.goto(3); + } + 'step 2' + if(result.bool){ + event.damages.push(event.current); + event.current.line(player,'green'); + game.log(event.current,'令',player,'回复一点体力'); + player.recover(); + } + if(event.targets.length){ + event.goto(1); + } + 'step 3' + if(event.damages.length){ + var next=game.createEvent('rexingshuai_next'); + event.next.remove(next); + trigger.after.push(next); + next.targets=event.damages; + next.setContent(function(){ + targets.shift().damage(); + if(targets.length) event.redo(); + }); + } + }, + subSkill:{ + restore:{ + trigger:{ + global:'dieAfter', + }, + charlotte:true, + forced:true, + filter:function(event,player){ + return event.source&&event.source.isIn()&&event.source.hasSkill('mingjian2'); + }, + content:function(){ + player.restoreSkill('rexingshuai'); + game.log(player,'重置了','#g【兴衰】'); + } + }, + } + }, //不想突破可以不突破的界曹冲 rechengxiang:{ audio:2, @@ -574,19 +664,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 6' if(event.h&&event.hp&&event.e){ - player.chooseCard('安国:是否重铸任意张牌?',[1,Infinity],(card,player)=>{ - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - if(mod!='unchanged') return mod; - return true; - },'he').set('ai',card=>{ + player.chooseCard('安国:是否重铸任意张牌?',[1,Infinity],lib.filter.cardRecastable,'he').set('ai',card=>{ return 6-get.value(card); }); } else event.finish(); 'step 7' if(result.bool){ - player.loseToDiscardpile(result.cards); - player.draw(result.cards.length); + player.recast(result.cards); } }, ai:{ @@ -2141,7 +2226,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //界荀彧 oljieming:{ audio:2, - trigger:{player:['damageEnd','dieAfter']}, + trigger:{player:['damageEnd','die']}, direct:true, forceDie:true, filter:function(event,player){ @@ -4042,45 +4127,32 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', filter:function(event,player){ - return player.countCards('h','sha')>0; - }, - filterCard:{name:'sha'}, - prepare:function(cards,player){ - player.$throw(cards,1000); - game.log(player,'将',cards,'置入了弃牌堆'); + return player.hasCard(card=>lib.skill.reyanyu.filterCard(card,player),'h'); }, + filterCard:(card,player)=>get.name(card)=='sha'&&player.canRecast(card), discard:false, - loseTo:'discardPile', - visible:true, - delay:0.5, + lose:false, + delay:false, content:function(){ - player.draw(); + player.recast(cards); }, ai:{ basic:{ order:1 }, result:{ - player:1, - }, + player:1 + } }, group:'reyanyu2' }, reyanyu2:{ trigger:{player:'phaseUseEnd'}, direct:true, - filter:function(event,player){ - return player.getHistory('lose',function(evt){ - var evt2=evt.getParent(); - return evt2.name=='useSkill'&&evt2.skill=='reyanyu'&&evt.getParent(3)==event; - }).length>0; - }, + filter:(event,player)=>player.hasHistory('useSkill',evt=>evt.skill=='reyanyu'&&evt.event.getParent(2)==event), content:function(){ 'step 0' - event.num=Math.min(3,player.getHistory('lose',function(evt){ - var evt2=evt.getParent(); - return evt2.name=='useSkill'&&evt2.skill=='reyanyu'&&evt.getParent(3)==trigger; - }).length); + event.num=Math.min(3,player.getHistory('useSkill',evt=>evt.skill=='reyanyu'&&evt.event.getParent(2)==trigger).length); player.chooseTarget(get.prompt('reyanyu'),'令一名男性角色摸'+get.cnNumber(event.num)+'张牌',function(card,player,target){ return target.hasSex('male')&&target!=player; }).set('ai',function(target){ @@ -8878,7 +8950,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'chooseToUse', mark:true, skillAnimation:true, - animationStr:'涅盘', limited:true, animationColor:'orange', init:function(player){ @@ -14582,7 +14653,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shizhan_info:'出牌阶段限两次,你可以选择一名其他角色。该角色视为对你使用一张【决斗】。', ol_xunyu:'界荀彧', oljieming:'节命', - oljieming_info:'当你受到1点伤害后或死亡后,你可令一名角色摸X张牌。然后若其手牌数大于X,则其将手牌弃置至X张(X为其体力上限且至多为5)。', + oljieming_info:'当你受到1点伤害后或死亡时,你可令一名角色摸X张牌。然后若其手牌数大于X,则其将手牌弃置至X张(X为其体力上限且至多为5)。', re_liufeng:'界刘封', rexiansi:'陷嗣', rexiansi2:'陷嗣', @@ -14675,6 +14746,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_caochong:'界曹冲', rechengxiang:'称象', rechengxiang_info:'当你受到伤害后,你可以亮出牌堆顶的四张牌。然后获得其中任意数量点数之和不大于13的牌。若你获得的牌点数之和为13,你复原武将牌。', + re_caorui:'界曹叡', + rexingshuai:'兴衰', + rexingshuai_info:'主公技,限定技。当你进入濒死状态时,你可令其他魏势力角色依次选择是否令你回复1点体力。然后这些角色依次受到1点伤害。有〖明鉴〗效果的角色于其回合内杀死角色后,你重置〖兴衰〗。', refresh_standard:'界限突破·标', refresh_feng:'界限突破·风', diff --git a/character/sb.js b/character/sb.js index c6b4800d6..c50977cb8 100644 --- a/character/sb.js +++ b/character/sb.js @@ -707,7 +707,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseJieshuBegin'}, forced:true, content:function(){ - player.draw(Math.min(5,game.countPlayer(current=>{ + player.draw(Math.min(5,game.countPlayer2(current=>{ return current.getHistory('damage').length>0; })+1)); } @@ -932,15 +932,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', filterCard:{suit:'club'}, - filter:function(event,player){ - return player.countCards('hes',{suit:'club'}); - }, + filter:(event,player)=>player.hasCard(card=>lib.skill.sblianhuan.filterCard(card,player),lib.skill.sblianhuan.position), filterTarget:function(card,player,target){ if(player.hasSkill('sblianhuan_blocker')) return false; if(!ui.selected.cards.length) return false; card=get.autoViewAs({name:'tiesuo'},[ui.selected.cards[0]]); return player.canUse(card,target); }, + filterCard:(card,player)=>get.suit(card)=='club'&&(!player.hasSkill('sblianhuan_blocker')||player.canRecast(card)), selectCard:1, position:'hs', derivation:'sblianhuan_lv2', @@ -1094,7 +1093,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'chooseToUse', mark:true, skillAnimation:true, - animationStr:'涅盘', limited:true, animationColor:'orange', filter:function(event,player){ @@ -4610,7 +4608,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sblijian:'离间', sblijian_info:'出牌阶段限一次。你可以选择至少两名其他角色并弃置X张牌(X为你选择的角色数-1)。然后每名你选择的角色依次视为对这些角色中与其逆时针座次最近的另一名角色使用一张【决斗】。', sbbiyue:'闭月', - sbbiyue_info:'锁定技。结束阶段,你摸Y张牌(Y为本回合受到过伤害的角色数+1且至多为5)。', + sbbiyue_info:'锁定技。结束阶段,你摸Y张牌(Y为本回合包括已死亡角色在内受到过伤害的角色数+1且至多为5)。', sb_pangtong:'谋庞统', sblianhuan:'连环', sblianhuan_info:'①出牌阶段,你可以重铸一张♣手牌。②出牌阶段限一次。你可以将一张♣手牌当【铁索连环】使用。③当你使用【铁索连环】时,你可以失去1点体力,然后当此牌指定第一个目标后,你随机弃置每名不处于连环状态的目标角色一张手牌。', diff --git a/character/shenhua.js b/character/shenhua.js index ba401a4f4..da831624d 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -1085,15 +1085,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ unique:true, juexingji:true, derivation:['drlt_huairou'], - init:function(player){ - player.storage.drlt_poshi=false; - }, filter:function(event,player){ - return !player.storage.drlt_poshi&&((player.storage.disableEquip!=undefined&&player.storage.disableEquip.length==5)||player.hp==1); + return !player.hasEnabledSlot()||player.hp==1; }, content:function(){ "step 0" - player.storage.drlt_poshi=true; player.awakenSkill('drlt_poshi'); player.loseMaxHp(); "step 1" @@ -1107,34 +1103,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:"phaseUse", position:'he', - filter:function(event,player){ - return player.countCards('he',{type:'equip'})>0; - }, - filterCard:function(card){ - return get.type(card)=='equip'; - }, + filter:(event,player)=>player.hasCard(card=>lib.skill.drlt_huairou.filterCard(card,player),lib.skill.drlt_huairou.position), + filterCard:(card,player)=>get.type(card)=='equip'&&player.canRecast(card), check:function(card){ if(!_status.event.player.canEquip(card)) return 5; return 3-get.value(card); }, content:function(){ - player.draw(); + player.recast(cards); }, discard:false, - visible:true, - loseTo:'discardPile', + lose:false, + delay:false, prompt:"将一张装备牌置入弃牌堆并摸一张牌", - delay:0.5, - prepare:function(cards,player){ - player.$throw(cards,1000); - game.log(player,'将',cards,'置入了弃牌堆'); - }, ai:{ order:10, result:{ - player:1, - }, - }, + player:1 + } + } }, "drlt_yongsi":{ audio:2, @@ -4231,7 +4218,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dialog.buttons[i].node.group.remove(); dialog.buttons[i].node.hp.remove(); dialog.buttons[i].node.intro.remove(); - dialog.buttons[i].node.name.innerHTML='未
    知'; + dialog.buttons[i].node.name.innerHTML=get.verticalStr('未知'); dialog.buttons[i].node.name.dataset.nature=''; dialog.buttons[i].style.background=''; dialog.buttons[i]._nointro=true; @@ -5499,34 +5486,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, popup:'lianhuan', enable:'phaseUse', - filter:function(event,player){ - return player.countCards('h',{suit:'club'})>0; - }, - filterCard:function(card){ - return get.suit(card)=='club'; - }, + 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.draw(); + player.recast(cards); }, discard:false, - visible:true, - loseTo:'discardPile', + lose:false, + delay:false, prompt:'将一张梅花牌置入弃牌堆并摸一张牌', - delay:0.5, - prepare:function(cards,player){ - player.$throw(cards,1000); - game.log(player,'将',cards,'置入了弃牌堆'); - }, ai:{ basic:{ order:1 }, result:{ - player:1, - }, + player:1 + } } }, niepan:{ @@ -5537,7 +5515,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mark:true, limited:true, skillAnimation:true, - animationStr:'涅盘', animationColor:'fire', init:function(player){ player.storage.niepan=false; @@ -5596,7 +5573,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'chooseToUse', mark:true, skillAnimation:true, - animationStr:'涅盘', limited:true, animationColor:'orange', init:function(player){ @@ -7710,14 +7686,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jiaxu:['re_jiaxu','jiaxu','ns_jiaxu','ps_jiaxu'], dongzhuo:['ol_dongzhuo','sp_dongzhuo','re_dongzhuo','dongzhuo','yj_dongzhuo'], dengai:['re_dengai','ol_dengai','dengai'], - sp_ol_zhanghe:['sp_ol_zhanghe','yj_zhanghe','sp_zhanghe'], + sp_ol_zhanghe:['sp_ol_zhanghe','yj_zhanghe','sp_zhanghe','jsrg_zhanghe'], jiangwei:['ol_jiangwei','re_jiangwei','jiangwei'], liushan:['ol_liushan','re_liushan','liushan'], sunce:['re_sunben','re_sunce','sunce'], zhangzhang:['ol_zhangzhang','re_zhangzhang','zhangzhang'], zuoci:['re_zuoci','zuoci'], caiwenji:['ol_caiwenji','re_caiwenji','caiwenji'], - xuyou:['sp_xuyou','xuyou','yj_xuyou'], + xuyou:['sp_xuyou','xuyou','jsrg_xuyou','yj_xuyou'], guanqiujian:['guanqiujian','tw_guanqiujian','re_guanqiujian','old_guanqiujian'], chendao:['chendao','old_chendao','ns_chendao'], zhugezhan:['zhugezhan','old_zhugezhan'], @@ -7741,7 +7717,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "zhugezhan":"诸葛瞻", "lukang":"陆抗", "haozhao":"郝昭", - "yl_yuanshu":"袁术", + "yl_yuanshu":"雷袁术", + yl_yuanshu_ab:"袁术", "zhangxiu":"张绣", "chendao":"陈到", "guanqiujian":"毌丘俭", @@ -8012,7 +7989,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huoji_info:'出牌阶段,你可以将你的任意一张红色手牌当作【火攻】使用。', bazhen_info:'锁定技,若你的防具栏内没有牌且没有被废除,则你视为装备着【八卦阵】。', kanpo_info:'你可以将你的任意一张黑色手牌当做【无懈可击】使用。', - lianhuan_info:'出牌阶段,你可以将一张梅花手牌当做【铁索连环】使用或重铸。', + lianhuan_info:'出牌阶段,你可以将一张♣手牌当做【铁索连环】使用或重铸。', niepan_info:'限定技,出牌阶段或当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。', oldniepan_info:'限定技,当你处于濒死状态时,你可以弃置你区域内的所有牌并复原你的武将牌,然后摸三张牌并将体力回复至3点。', quhu_info:'出牌阶段限一次,你可以与一名体力值大于你的角色拼点,若你赢,则该角色对其攻击范围内另一名由你指定的角色造成1点伤害。若你没赢,该角色对你造成一点伤害。', @@ -8050,7 +8027,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ weiyan:'旧魏延', xiaoqiao:'旧小乔', zhoutai:'界周泰', - zhangjiao:'张角', + zhangjiao:'旧张角', //yuji:'于吉', shensu:'神速', shensu1:'神速', diff --git a/character/shiji.js b/character/shiji.js index 1f933e32f..17f0102f4 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -130,9 +130,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseTarget(get.prompt('tongduo'),'令一名角色重铸一张牌',function(card,player,target){ - return target.countCards('he')>0; + return target.hasCard(lib.filter.cardRecastable,'he'); }).set('ai',function(target){ - return get.attitude(_status.event.player,target)*Math.min(3,Math.floor(target.countCards('h')/2)); + return get.attitude(_status.event.player,target)*Math.min(3,Math.floor(target.countCards('h',lib.filter.cardRecastable)/2)); }); 'step 1' if(result.bool){ @@ -142,11 +142,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else event.finish(); 'step 2' - if(target.countCards('he')==0) event.finish(); - else target.chooseCard('he',true,'请重铸一张牌'); + if(!target.hasCard(lib.filter.cardRecastable,'he')) event.finish(); + else target.chooseCard('he',true,'请重铸一张牌',lib.filter.cardRecastable); 'step 3' - target.loseToDiscardpile(result.cards); - target.draw(); + target.recast(result.cards); }, }, //朱儁 @@ -1084,65 +1083,72 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, spxizhan:{ - trigger:{global:'phaseBegin'}, - forced:true, - locked:false, - logTarget:'player', - filter:function(event,player){ - return player!=event.player; - }, - content:function(){ - 'step 0' - player.chooseToDiscard('he','嬉战:弃置一张牌或失去1点体力','根据弃置的牌对'+get.translation(trigger.player)+'视为使用如下牌:
    ♠,其使用【酒】;♥,你使用【无中生有】
    ♣,对其使用【铁索连环】;♦:对其使用火【杀】').set('ai',function(card){ - var player=_status.event.player,target=_status.event.getTrigger().player; - var suit=get.suit(card,player),list; - switch(suit){ - case 'spade':list=[{name:'jiu'},target,target];break; - case 'heart':list=[{name:'wuzhong'},player,player];break; - case 'club':list=[{name:'tiesuo'},player,target];break; - case 'diamond':list=[{name:'sha',nature:'fire'},player,target];break; - } - list[0].isCard=true; - var eff=0; - if(list[1].canUse(list[0],list[2],false)) eff=get.effect(list[2],list[0],list[1],player); - if(eff>=0||suit=='club') eff=Math.max(eff,5); - return eff*1.5-get.value(card); - }); - 'step 1' - if(result.bool){ - player.addTempSkill('spxizhan_spfangzong'); - var target=trigger.player,card=result.cards[0],suit=get.suit(card,player); - if((!target||!target.isIn())&&suit!='heart') return; - switch(suit){ - case 'spade': - target.chooseUseTarget('jiu',true); - break; - case 'heart': - player.chooseUseTarget('wuzhong',true); - break; - case 'club': - if(player.canUse('tiesuo',target)) player.useCard({ - name:'tiesuo', - isCard:true, - },target); - break; - case 'diamond': - if(player.canUse({ - name:'sha', - isCard:true, - nature:'fire', - },target,false)) player.useCard({ - name:'sha', - isCard:true, - nature:'fire', - },target,false); - break; - } - } - else player.loseHp(); - }, + audio:4, + group:'spxizhan_effect', + locked:true, subSkill:{ spfangzong:{charlotte:true}, + effect:{ + trigger:{global:'phaseBegin'}, + filter:function(event,player){ + return player!=event.player; + }, + forced:true, + logTarget:'player', + content:function(){ + 'step 0' + player.chooseToDiscard('he','嬉战:弃置一张牌或失去1点体力','根据弃置的牌对'+get.translation(trigger.player)+'视为使用如下牌:
    ♠,其使用【酒】;♥,你使用【无中生有】
    ♣,对其使用【铁索连环】;♦:对其使用火【杀】').set('ai',function(card){ + var player=_status.event.player,target=_status.event.getTrigger().player; + var suit=get.suit(card,player),list; + switch(suit){ + case 'spade':list=[{name:'jiu'},target,target];break; + case 'heart':list=[{name:'wuzhong'},player,player];break; + case 'club':list=[{name:'tiesuo'},player,target];break; + case 'diamond':list=[{name:'sha',nature:'fire'},player,target];break; + } + list[0].isCard=true; + var eff=0; + if(list[1].canUse(list[0],list[2],false)) eff=get.effect(list[2],list[0],list[1],player); + if(eff>=0||suit=='club') eff=Math.max(eff,5); + return eff*1.5-get.value(card); + }); + 'step 1' + if(result.bool){ + player.addTempSkill('spxizhan_spfangzong'); + var target=trigger.player,card=result.cards[0],suit=get.suit(card,player); + if(!lib.suit.contains(suit)||(!target||!target.isIn())&&suit!='heart') return; + game.broadcastAll(function(suit){ + if(lib.config.background_speak) game.playAudio('skill','spfangzong'+(4-lib.suit.indexOf(suit))); + },suit); + switch(suit){ + case 'spade': + target.chooseUseTarget('jiu',true); + break; + case 'heart': + player.chooseUseTarget('wuzhong',true); + break; + case 'club': + if(player.canUse('tiesuo',target)) player.useCard({ + name:'tiesuo', + isCard:true, + },target); + break; + case 'diamond': + if(player.canUse({ + name:'sha', + isCard:true, + nature:'fire', + },target,false)) player.useCard({ + name:'sha', + isCard:true, + nature:'fire', + },target,false); + break; + } + } + else player.loseHp(); + }, + }, }, }, //高览 @@ -1907,28 +1913,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //周处 rechuhai:{ audio:'chuhai', - inherit:'chuhai', dutySkill:true, locked:true, - group:['rechuhai_add','rechuhai_achieve','rechuhai_fail'], + group:['rechuhai_add','rechuhai_achieve','rechuhai_fail','rechuhai_chuhai'], derivation:'zhangming', - prompt:'与一名其他角色进行拼点', subSkill:{ + chuhai:{ + audio:['chuhai',2], + inherit:'chuhai', + prompt:'与一名其他角色进行拼点', + }, add:{ trigger:{player:'compare'}, forced:true, popup:false, filter:function(event,player){ - return event.getParent().name=='rechuhai'&&event.num1<13&&player.countCards('e')<4; + return event.getParent().name=='rechuhai_chuhai'&&event.num1<13&&player.countCards('e')<4; }, content:function(){ var num=4-player.countCards('e'); game.log(player,'的拼点牌点数+',num); trigger.num1=Math.min(13,trigger.num1+num); - } + }, }, achieve:{ - audio:'rechuhai', + audio:['chuhai',2], trigger:{player:'equipAfter'}, forced:true, skillAnimation:true, @@ -1945,10 +1954,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, fail:{ + audio:'chuhai3', trigger:{player:'chooseToCompareAfter'}, forced:true, filter:function(event,player){ - return event.getParent().name=='rechuhai'&&event.num1<7&&!event.result.bool; + return event.getParent().name=='rechuhai_chuhai'&&event.num1<7&&!event.result.bool; }, content:function(){ player.awakenSkill('rechuhai'); @@ -1957,6 +1967,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + chuhai3:{audio:true}, zhangming:{ audio:2, trigger:{player:'useCard'}, @@ -2041,7 +2052,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, chuhai:{ - audio:2, + audio:3, enable:'phaseUse', usable:1, filter:function(event,player){ @@ -2477,8 +2488,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCardAfter'}, dutySkill:true, forced:true, - skillAnimation:true, - animationColor:'water', + direct:true, filter:function(event,player){ if(!player.storage.xingqi||!player.storage.xingqi.length) return false; var map={basic:0,trick:0,equip:0}; @@ -2493,6 +2503,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' + player.logSkill('twmibei_achieve'); game.log(player,'成功完成使命'); player.awakenSkill('mibei'); var list=['basic','equip','trick'],cards=[]; @@ -2510,6 +2521,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ derivation:'xinmouli', subSkill:{ silent:{ + charlotte:true, trigger:{player:'phaseZhunbeiBegin'}, silent:true, lastDo:true, @@ -2519,15 +2531,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.addTempSkill('mibei_mark'); }, - charlotte:true, }, - mark:{}, + mark:{charlotte:true}, fail:{ + audio:'mibei2', trigger:{player:'phaseJieshuBegin'}, - forced:true, filter:function(event,player){ return !player.getStorage('xingqi').length&&player.hasSkill('mibei_mark'); }, + forced:true, content:function(){ game.log(player,'使命失败'); player.awakenSkill('mibei'); @@ -2536,6 +2548,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + mibei1:{audio:true}, + mibei2:{audio:true}, xinmouli:{ audio:'mouli', enable:'phaseUse', @@ -2910,20 +2924,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qingyu:{ audio:3, dutySkill:true, - trigger:{player:'damageBegin2'}, - forced:true, - filter:function(event,player){ - return player.countCards('he',function(card){ - return lib.filter.cardDiscardable(card,player,'qingyu'); - })>1; - }, - content:function(){ - trigger.cancel(); - player.chooseToDiscard(2,'he',true); - }, - group:['qingyu_achieve','qingyu_fail'], + locked:true, + group:['qingyu_achieve','qingyu_fail','qingyu_defend'], subSkill:{ + defend:{ + audio:'qingyu1', + trigger:{player:'damageBegin2'}, + filter:function(event,player){ + return player.countCards('he',function(card){ + return lib.filter.cardDiscardable(card,player,'qingyu_defend'); + })>1; + }, + forced:true, + content:function(){ + trigger.cancel(); + player.chooseToDiscard(2,'he',true); + }, + }, achieve:{ + audio:'qingyu3', trigger:{player:'phaseZhunbeiBegin'}, forced:true, skillAnimation:true, @@ -2938,6 +2957,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, fail:{ + audio:'qingyu2', trigger:{player:'dying'}, forced:true, content:function(){ @@ -2949,6 +2969,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, derivation:'xuancun', }, + qingyu1:{audio:true}, + qingyu2:{audio:true}, + qingyu3:{audio:true}, xuancun:{ audio:2, trigger:{global:'phaseEnd'}, @@ -6459,7 +6482,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mingfa_info:'①结束阶段,你可展示一张牌并记录为“明伐”。②出牌阶段开始时,若“明伐”牌在你的手牌区或装备区,则你可以使用“明伐”牌与一名其他角色拼点。若你赢:你获得对方一张牌并从牌堆中获得一张点数等于“明伐”牌牌面点数-1的牌。若你没赢:你本回合不能使用牌指定其他角色为目标。③你的拼点牌亮出后,你令此牌的点数+2。', rongbei:'戎备', rongbei_info:'限定技。出牌阶段,你可选择一名有空装备栏的角色。系统为该角色的每个空装备栏选择一张装备牌,然后该角色使用之。', - db_wenyang:'文鸯', + db_wenyang:'手杀文鸯', dbquedi:'却敌', dbquedi_info:'每回合限一次。当你使用【杀】或【决斗】指定唯一目标后,你可选择:①获得目标角色的一张手牌。②弃置一张基本牌,并令此牌的伤害值基数+1。③背水:减1点体力上限,然后依次执行上述所有选项。', dbzhuifeng:'椎锋', @@ -6503,9 +6526,9 @@ 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点体力。②弃置一张牌。然后若此牌的花色为:♠,其视为使用一张【酒】;♥,你视为使用一张【无中生有】;♣,你视为对其使用【铁索连环】;♦:你视为对其使用火【杀】(无距离限制)。', + spxizhan_info:'其他角色的回合开始时,你须选择一项:①失去1点体力。②弃置一张牌并令〖芳踪〗于本回合失效,然后若此牌的花色为:♠,其视为使用一张【酒】;♥,你视为使用一张【无中生有】;♣,你视为对其使用【铁索连环】;♦:你视为对其使用火【杀】(无距离限制)。', sp_cuiyan:'手杀崔琰', spyajun:'雅俊', spyajun_info:'①摸牌阶段,你令额定摸牌数+1。②出牌阶段开始时,你可以用一张本回合获得的牌与其他角色拼点。若你赢,则你可将其中一张拼点牌置于牌堆顶。若你没赢,你本回合的手牌上限-1。', @@ -6547,7 +6570,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zjjuxiang_info:'限定技。一名其他角色脱离濒死状态时,你可以对其造成1点伤害,然后摸X张牌(X为其体力上限且至多为5)。', houfeng:'厚俸', houfeng_info:'每轮限一次。一名其他角色的出牌阶段开始时,若其在你的攻击范围内,则你可以令其进行“整肃”。然后当其于本回合内因整肃而摸牌或回复体力后,你获得相同的整肃奖励。', - liuba:'刘巴', + liuba:'手杀刘巴', duanbi:'锻币', duanbi_info:'出牌阶段限一次。若场上所有角色的手牌数之和大于角色数之和的二倍,则你可以令所有其他角色各弃置X张手牌(X为该角色手牌数的一半且向下取整且至多为3)。然后你可选择一名角色,令其随机获得三张以此法被弃置的牌。', tongduo:'统度', diff --git a/character/sp.js b/character/sp.js index 0ea91615f..c8e91f0bd 100755 --- a/character/sp.js +++ b/character/sp.js @@ -9,10 +9,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 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'], sp_tianzhu:["wutugu","yanbaihu","shamoke","panfeng","zhugedan",'huangzu','gaogan',"tadun","fanjiangzhangda","ahuinan","dongtuna"], sp_nvshi:["lingju","guanyinping","zhangxingcai","mayunlu","dongbai","zhaoxiang",'ol_zhangchangpu','ol_xinxianying',"daxiaoqiao","jin_guohuai"], - sp_shaowei:["simahui","zhangbao","zhanglu","zhugeguo","xujing","zhangling",'huangchengyan','ol_puyuan','zhangzhi','lushi'], + sp_shaowei:["simahui","zhangbao","zhanglu","zhugeguo","xujing","zhangling",'huangchengyan','zhangzhi','lushi'], sp_huben:["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_wenqin'], 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_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','ol_puyuan','ol_wenqin'], sp_waitforsort:['ol_huban','ol_mengda','haopu'], sp_qifu:["caoying",'panshu',"caochun","yuantanyuanshang",'caoshuang','wolongfengchu','guansuo','baosanniang','fengfangnv','jin_zhouchu'], sp_wanglang:['ol_wanglang'], @@ -28,6 +28,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + ol_zhouqun:['male','shu',4,['oltianhou','olchenshuo']], ol_wenqin:['male','wei',4,['olguangao','olhuiqi']], haopu:['male','shu',4,['olzhenying']], ol_mengda:['male','shu',4,['olgoude']], @@ -687,6 +688,298 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //OL周群 + oltianhou:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + forced:true, + content:function(){ + 'step 0' + var card=get.cards()[0]; + event.card=card; + game.cardsGotoOrdering(card); + 'step 1' + if(player.countCards('he')>0){ + player.chooseCard('he','天候:是否用一张牌交换牌堆顶的'+get.translation(card)+'?').set('promptx',[[card]]).set('ai',()=>-1) + } + else{ + event._result={bool:false}; + } + 'step 2' + if(result.bool){ + player.lose(result.cards,ui.cardPile,'insert'); + player.gain(event.card,'draw'); + } + else{ + ui.cardPile.insertBefore(event.card,ui.cardPile.firstChild); + } + 'step 3' + var card=get.cards()[0]; + ui.cardPile.insertBefore(card,ui.cardPile.firstChild); + player.showCards(card,get.translation(player)+'发动了【天候】'); + var suit=get.suit(card,false),skill='oltianhou_'+suit; + if(!lib.skill.oltianhou.derivation.contains(skill)) event.finish(); + else{ + event.weather_skill=skill; + player.chooseTarget(true,'令一名角色获得技能【'+get.translation(skill)+'】').set('ai',function(target){ + return get.attitude(_status.event.player,target); + }); + } + 'step 4' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'green'); + target.addAdditionalSkill('oltianhou_'+player.playerid,event.weather_skill); + player.addTempSkill('oltianhou_expire',{player:'phaseZhunbeiBegin'}); + game.log(target,'获得了天气技能','#g【'+get.translation(event.weather_skill)+'】'); + game.broadcastAll(function(bg){ + _status.tempBackground=bg; + game.updateBackground(); + },event.weather_skill+'_bg'); + game.addVideo('skill',player,['oltianhou',[true,event.weather_skill+'_bg']]) + } + }, + video:function(player,info){ + if(info[0]){ + _status.tempBackground=info[1]; + } + else{ + delete _status.tempBackground; + } + game.updateBackground(); + }, + derivation:['oltianhou_spade','oltianhou_heart','oltianhou_club','oltianhou_diamond'], + subSkill:{ + expire:{ + charlotte:true, + onremove:function(player){ + var key='oltianhou_'+player.playerid,players=game.players.concat(game.dead); + for(var current of players){ + current.removeAdditionalSkill(key); + } + game.broadcastAll(function(){ + delete _status.tempBackground; + game.updateBackground(); + }); + game.addVideo('skill',player,['oltianhou',[false]]) + }, + }, + spade:{ + audio:true, + mark:true, + marktext:'雨', + intro:{ + content:'锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。', + }, + trigger:{global:'damageEnd'}, + forced:true, + filter:function(event){ + return event.nature=='thunder'&&lib.skill.oltianhou_spade.logTarget(event).length>0; + }, + logTarget:function(event){ + var list=[]; + if(!event.player.isIn()) return []; + if(event.player.getNext().isIn()) list.push(event.player.getNext()); + if(event.player.getPrevious().isIn()) list.push(event.player.getPrevious()); + return list.sortBySeat(_status.currentPhase); + }, + content:function(){ + var targets=lib.skill.oltianhou_spade.logTarget(trigger); + for(var i of targets) i.loseHp(); + game.delayex(); + }, + group:'oltianhou_miehuo', + global:'oltianhou_spade_ai', + }, + spade_ai:{ + effect:{ + player:function(card,player,target,current){ + if(get.tag(card,'fireDamage')&&!player.hasSkill('oltianhou_spade')){ + return 'zerotarget'; + } + 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', + trigger:{global:'damageBegin2'}, + forced:true, + logTarget:'source', + filter:function(event,player){ + return event.nature=='fire'&&event.source&&event.source.isIn()&&event.source!=player; + }, + content:function(){ + trigger.cancel(); + } + }, + heart:{ + audio:true, + mark:true, + marktext:'暑', + intro:{ + content:'锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。', + }, + trigger:{global:'phaseJieshuBegin'}, + forced:true, + filter:function(event,player){ + return player!=event.player&&event.player.isIn()&&event.player.isMaxHp(); + }, + logTarget:'player', + content:function(){ + trigger.player.loseHp(); + }, + }, + club:{ + audio:true, + mark:true, + marktext:'霜', + intro:{ + content:'锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。', + }, + trigger:{global:'phaseJieshuBegin'}, + forced:true, + filter:function(event,player){ + return player!=event.player&&event.player.isIn()&&event.player.isMinHp(); + }, + logTarget:'player', + content:function(){ + trigger.player.loseHp(); + }, + }, + diamond:{ + audio:true, + mark:true, + marktext:'雾', + intro:{ + content:'锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。', + }, + trigger:{global:'useCardToPlayer'}, + forced:true, + filter:function(event,player){ + if(event.card.name!='sha'||event.player==player||event.targets.length!=1||!event.player.isIn()) return false; + return event.target!=event.player.getNext()&&event.target!=event.player.getPrevious(); + }, + logTarget:'player', + content:function(){ + 'step 0' + var num=get.number(trigger.card); + event.num=num; + trigger.player.judge(card=>{ + var num=get.number(card),num2=_status.event.getParent('oltianhou_diamond').num; + return num>num2?-4:4; + }).set('judge2',result=>{ + if(result.bool==false) return true; + return false; + }) + 'step 1' + if(!result.bool){ + trigger.getParent().all_excluded=true; + trigger.untrigger(); + } + }, + 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; + } + }, + }, + }, + } + }, + olchenshuo:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + direct:true, + filter:function(event,player){ + return player.countCards('h')>0; + }, + hasSame:function(info,card){ + if(info.type==get.type2(card,false)) return true; + if(info.suit!='none'&&info.suit==get.suit(card,false)) return true; + if(typeof info.number=='number'&&info.number>0&&info.number==get.suit(card,false)) return true; + return info.length==lib.skill.dcweidang.getLength(card) + }, + content:function(){ + 'step 0' + player.chooseCard('h',get.prompt('olchenshuo'),'展示一张手牌,然后展示并获得牌堆顶的牌').set('ai',function(card){ + if(get.type(card)=='basic') return 1+Math.random(); + return Math.random(); + }) + 'step 1' + if(result.bool){ + player.logSkill('olchenshuo'); + player.showCards(result.cards,get.translation(player)+'发动了【谶说】'); + var card=result.cards[0]; + event.cardInfo={ + type:get.type2(card,player), + suit:get.suit(card,player), + number:get.number(card,player), + length:lib.skill.dcweidang.getLength(card), + } + event.cards=[]; + event.forceDie=true; + event.includeOut=true; + } + else event.finish(); + 'step 2' + var judgestr=get.translation(player)+'展示的第'+get.cnNumber(cards.length+1,true)+'张【谶说】牌'; + event.videoId=lib.status.videoId++; + var card=get.cards()[0]; + event.card=card; + cards.add(card); + game.cardsGotoOrdering(card); + game.addVideo('judge1',player,[get.cardInfo(card),judgestr,event.videoId]); + game.broadcastAll(function(player,card,str,id,cardid){ + var event; + if(game.online){ + event={}; + } + else{ + event=_status.event; + } + if(game.chess){ + event.node=card.copy('thrown','center',ui.arena).animate('start'); + } + else{ + event.node=player.$throwordered(card.copy(),true); + } + if(lib.cardOL) lib.cardOL[cardid]=event.node; + event.node.cardid=cardid; + event.node.classList.add('thrownhighlight'); + ui.arena.classList.add('thrownhighlight'); + event.dialog=ui.create.dialog(str); + event.dialog.classList.add('center'); + event.dialog.videoId=id; + },player,card,judgestr,event.videoId,get.id()); + game.log(player,'展示了牌堆顶的',card); + game.delay(2); + 'step 3' + game.broadcastAll(function(id){ + var dialog=get.idDialog(id); + if(dialog){ + dialog.close(); + } + ui.arena.classList.remove('thrownhighlight'); + },event.videoId); + game.addVideo('judge2',null,event.videoId); + if(cards.length<3&&player.isIn()&&lib.skill.olchenshuo.hasSame(event.cardInfo,card)) event.goto(2); + else{ + game.broadcastAll(function(){ui.clear()}); + player.gain(cards,'gain2'); + } + }, + }, //OL文钦 olguangao:{ audio:2, @@ -747,7 +1040,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 2' if(player.countCards('h')%2==0){ player.draw(); - player.chooseTarget('犷骜:令此杀对其任意个目标无效',[1,Infinity],true,(card,player,target)=>{ + player.chooseTarget('犷骜:令此杀对其任意个目标无效',[1,Infinity],(card,player,target)=>{ return _status.event.targetsx.contains(target); }).set('ai',target=>{ return 1-get.effect(target,_status.event.getTrigger().card,_status.event.player,_status.event.player); @@ -2052,14 +2345,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else event.goto(6); 'step 3' if(result.bool){ - var hs=target.getCards('h',card=>{ - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - if(mod!='unchanged') return mod; - return true; - }); + var hs=target.getCards('h',lib.filter.cardRecastable); if(hs.length){ - target.loseToDiscardpile(hs); - target.draw(hs.length); + target.recast(hs); } } event.goto(6); @@ -2067,13 +2355,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ var hs=target.getCards('h',card=>{ if(!card.hasGaintag('olhuiyun_tag')) return false; - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - if(mod!='unchanged') return mod; - return true; + return target.canRecast(card); }); if(hs.length){ - target.loseToDiscardpile(hs); - target.draw(hs.length); + target.recast(hs); } } event.goto(6); @@ -2818,16 +3103,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' var type=get.type2(cards[0]); target.chooseCard(get.translation(player)+'对你发动了【剑合】','请重铸'+get.cnNumber(cards.length)+'张'+get.translation(type)+'牌,或点“取消”受到1点雷电伤害',cards.length,'he',(card,player)=>{ - return get.type2(card)==_status.event.type; + return get.type2(card)==_status.event.type&&player.canRecast(card); }).set('ai',card=>{ if(_status.event.goon) return (get.type(card)=='equip'?15:7)-get.value(card); return 0; }).set('type',type).set('goon',get.damageEffect(target,player,target,'thunder')<0); 'step 2' if(result.bool){ - var cards=result.cards; - target.loseToDiscardpile(cards); - target.draw(cards.length); + target.recast(result.cards); } else{ target.damage(player,'thunder'); @@ -3450,16 +3733,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - target.chooseCard('he',true,'铸币:请重铸一张牌',(card,player,target)=>{ - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - if(mod!='unchanged') return mod; - return true; - }); + target.chooseCard('he',true,'铸币:请重铸一张牌',lib.filter.cardRecastable); 'step 1' if(result.bool){ - var cards=result.cards; - target.loseToDiscardpile(cards); - target.draw().gaintag=['olzhubi_tag']; + target.recast(result.cards,null,player=>player.draw().set('log',false).gaintag=['olzhubi_tag']); } }, ai:{ @@ -3909,7 +4186,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'huanshi', trigger:{global:'judge'}, filter:function(event,player){ - return player.countCards('he')>0; + return player.countCards('h')>0; }, logTarget:'player', prompt2:function(event,player){ @@ -3993,7 +4270,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } if(!player.countCards('h')||player.hasSkill('olhuanshi_mark',null,null,false)) event.finish(); 'step 3' - player.chooseCard('是否重铸任意张手牌?','操作提示:选择要重铸的牌并点击“确定”',[1,player.countCards('h')]).set('ai',function(card){ + player.chooseCard('是否重铸任意张手牌?','操作提示:选择要重铸的牌并点击“确定”',[1,player.countCards('h')],lib.filter.cardRecastable).set('ai',function(card){ var player=_status.event.player,cards=ui.selected.cards; if(!player.hasSkill('olmingzhe')) return 5-get.value(card); for(var i of cards){ @@ -4004,8 +4281,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 4' if(result.bool){ player.addTempSkill('olhuanshi_mark'); - player.loseToDiscardpile(result.cards); - player.draw(result.cards.length); + player.recast(result.cards); } }, ai:{ @@ -5728,9 +6004,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.chooseToDiscard('he',true); } else{ - var cards=target.getCards('e'); - target.loseToDiscardpile(cards); - target.draw(cards.length) + target.recast(target.getCards('e',lib.filter.cardRecastable)); } }, }, @@ -5971,7 +6245,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return; } player.chooseTarget(true,'将'+get.translation(card)+'置于一名角色的装备区内',function(card,player,target){ - return target.canEquip(_status.event.card); + return target.canEquip(_status.event.card,true); }).set('card',card).set('ai',function(target){ var card=_status.event.getParent().card,player=_status.event.player; return get.effect(target,card,player,player); @@ -8061,8 +8335,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=[]; game.countPlayer(function(current){ if(player!=current){ - var cards=current.getEquips(5); - if(!cards.some(card=>card.name.indexOf('zhuangshu_')==0)) return false; + var cards2=current.getEquips(5); + if(!cards2.some(card=>card.name.indexOf('zhuangshu_')==0)) return false; } var evt=trigger.getl(current); for(var i of evt.cards2){ @@ -10185,16 +10459,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.awakenSkill('luanfeng'); trigger.player.recover(3-trigger.player.hp); 'step 1' - var list=[]; + var list=[],target=trigger.player; for(var i=1;i<6;i++){ - for(var j=0;j0) player.enableEquip(list); - if(list.length<6) trigger.player.drawTo(6-list.length); - if(trigger.player.storage.kotarou_rewrite) trigger.player.storage.kotarou_rewrite=[]; - if(player==trigger.player) player.storage.youlong2=[]; + if(list.length>0) target.enableEquip(list); + if(list.length<6) target.drawTo(6-list.length); + if(target.storage.kotarou_rewrite) target.storage.kotarou_rewrite=[]; + if(player==target) player.storage.youlong2=[]; }, }, //曹爽,韩遂,何进 @@ -10322,20 +10596,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', usable:1, - viewAs:{name:'shunshou'}, + viewAs:{ + name:'shunshou', + storage:{spweiwu:true}, + }, filterCard:{color:'red'}, position:'hes', check:function(card){ return 7-get.value(card); }, - filterTarget:function(card,player,target){ - if(target.countCards('h')0&&game.hasPlayer(function(current){ - return current.countCards('h')>=player.countCards('h')&&player.canUse('shunshou',current); - }); + mod:{ + targetInRange:function(card){ + if(card.storage&&card.storage.spweiwu) return true; + }, }, }, tuogu:{ @@ -21891,33 +22164,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 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('h',{suit:'club'})>0; + return player.hasCard(card=>lib.skill.smh_lianhuan1.filterCard(card,player),'h'); }, - filterCard:function (card){ - return get.suit(card)=='club'; - }, - check:function (card){ + filterCard:(card,player)=>get.suit(card)=='club'&&player.canRecast(card), + check:function(card){ return -1; }, - content:function (){ - player.draw(); + content:function(){ + player.recast(cards); }, discard:false, - loseTo:'discardPile', + lose:false, + delay:false, prompt:"将一张梅花牌置入弃牌堆并摸一张牌", - delay:0.5, - prepare:function (cards,player){ - player.$throw(cards,1000); - }, ai:{ basic:{ order:1, }, result:{ - player:1, - }, + player:1 + } }, - forced:true, + forced:true }, "smh_yeyan":{ unique:true, @@ -22649,6 +22917,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jsp_huangyueying:['jsp_huangyueying','re_jsp_huangyueying'], ganfuren:['dc_ganfuren','ganfuren'], wenqin:['wenqin','pe_wenqin'], + zhouqun:['ol_zhouqun','zhouqun'], }, translate:{ "xinfu_lingren":"凌人", @@ -22765,7 +23034,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_caiwenji:'SP蔡琰', zhugeguo:'诸葛果', lingcao:'凌操', - sunru:'孙茹', + sunru:'手杀孙茹', lingju:'灵雎', lifeng:'李丰', jsp_guanyu:'SP关羽', @@ -22808,8 +23077,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ caoying:"曹婴", simahui:"司马徽", baosanniang:"OL鲍三娘", - pangdegong:"庞德公", - zhaotongzhaoguang:"赵统赵广", + pangdegong:"手杀庞德公", + zhaotongzhaoguang:"手杀赵统赵广", majun:"马钧", simazhao:"司马昭", wangyuanji:"王元姬", @@ -23381,7 +23650,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spniluan:'逆乱', spniluan_info:'出牌阶段,你可以将一张黑色牌当做【杀】使用。此【杀】使用结算完成后,若你未因此【杀】造成过伤害,则你令此【杀】不计入使用次数。', spweiwu:'违忤', - spweiwu_info:'出牌阶段限一次,你可以将一张红色牌当做【顺手牵羊】对手牌数不小于你的角色使用。', + spweiwu_info:'出牌阶段限一次,你可以将一张红色牌当无距离限制的【顺手牵羊】使用。', spmouzhu:'谋诛', spmouzhu_backup:'谋诛', spmouzhu_info:'出牌阶段限一次,你可以选择任意名“距离为1”或“体力值等于你”的其他角色,这些角色依次进行以下结算:交给你一张手牌,然后若其手牌数小于你,则其视为对你使用一张【杀】或【决斗】。', @@ -23415,7 +23684,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ chengshang:'承赏', chengshang_info:'当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗获得过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。', chengshang_info_guozhan:'当你于出牌阶段内使用的牌结算完成后,若此牌未造成过伤害且此牌的目标包含其他角色且你本阶段内未因〖承赏〗获得过牌,则你可以从牌堆中获得所有与此牌花色点数相同的牌。', - panshu:'潘淑', + panshu:'OL潘淑', weiyi:'威仪', weiyi_info:'每名角色限一次。当有角色受到伤害后,你可选择:①若其体力值不小于你,则其失去1点体力。②若其体力值不大于你且其已受伤,则其回复1点体力。', jinzhi:'锦织', @@ -23428,7 +23697,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ wangong:'挽弓', wangong2:'挽弓', wangong_info:'锁定技,当你使用基本牌时,你获得如下效果:当你使用下一张牌时,若此牌为【杀】,则此牌无次数和距离限制且伤害+1。', - huangchengyan:'黄承彦', + huangchengyan:'OL黄承彦', guanxu:'观虚', guanxu_info:'出牌阶段限一次,你可以观看一名其他角色的手牌,然后你可将其中一张手牌与牌堆顶5张牌中的一张交换。若如此做,你弃置其手牌中3张花色相同的牌。', yashi:'雅士', @@ -23530,7 +23799,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spmanwang_info:'出牌阶段,你可以弃置任意张牌。然后你依次执行以下选项中的前X项:⒈获得〖叛侵〗。⒉摸一张牌。⒊回复1点体力。⒋摸两张牌并失去〖叛侵〗。', sppanqin:'叛侵', sppanqin_info:'出牌阶段或弃牌阶段结束时,你可将你于本阶段内弃置且位于弃牌堆的所有牌当做【南蛮入侵】使用。然后若此牌被使用时对应的实体牌数不大于此牌的目标数,则你执行并移除〖蛮王〗中的最后一个选项。', - tengfanglan:'滕芳兰', + tengfanglan:'OL滕芳兰', luochong:'落宠', luochong_info:'准备阶段开始时/当你于一回合内首次受到伤害后,你可选择本轮内未选择过的一项(每名角色每轮限选一次):⒈令一名角色回复1点体力。⒉令一名角色失去1点体力。⒊令一名角色弃置两张牌。⒋令一名角色摸两张牌。', aichen:'哀尘', @@ -23629,7 +23898,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xindiaodu:"调度", xindiaodu_info:"①每回合限一次,与你势力相同的角色使用装备牌时,其可以摸一张牌。②出牌阶段开始时,你可以获得与你势力相同的一名角色装备区内的一张牌,然后你可以将此牌交给另一名与你势力相同的其他角色。", olhuanshi:'缓释', - olhuanshi_info:'一名角色的判定牌生效前,你可以令其观看你的牌并选择其中的一张牌,你打出此牌代替判定牌。然后你可以重铸任意张牌(每回合限重铸一次)。', + olhuanshi_info:'一名角色的判定牌生效前,你可以令其观看你的手牌并选择你的一张牌,你打出此牌代替判定牌。然后你可以重铸任意张牌(每回合限重铸一次)。', olhongyuan:'弘援', olhongyuan_info:'每阶段限一次。当你一次性获得至少两张牌以后,你可以将至多两张牌交给等量名角色。', olmingzhe:'明哲', @@ -23637,7 +23906,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ahuinan:'阿会喃', jueman:'蟨蛮', jueman_info:'锁定技。一名角色的回合结束时,若本回合被使用过的基本牌数不小于2,且前两张基本牌的使用者:均不为你,你视为使用本回合被使用的第三张基本牌;有且仅有其中之一为你,你摸一张牌。', - ol_liuba:'刘巴', + ol_liuba:'OL刘巴', oltongduo:'统度', oltongduo_info:'准备阶段,你可以令一名角色交给你一张手牌,然后出牌阶段结束时,你将此牌置于牌堆顶。', olzhubi:'铸币', @@ -23735,11 +24004,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olzhenying_info:'出牌阶段限两次。你可以选择一名手牌数不大于你的其他角色,你与其同时将手牌摸或弃置至至多两张。然后你与其中手牌数较少的角色视为对另一名角色使用一张【决斗】。', ol_wenqin:'文钦', olguangao:'犷骜', - olguangao_info:'当你/其他角色使用【杀】时,你/该角色可以额外指定一个目标/你为目标(使用者不为你则有距离限制)。然后若你的手牌数为偶数,你摸一张牌并令此牌对任意目标无效。', + olguangao_info:'当你/其他角色使用【杀】时,你/该角色可以额外指定一个目标/你为目标(使用者不为你则有距离限制)。然后若你的手牌数为偶数,你摸一张牌并令此牌对任意目标无效(可不选)。', olhuiqi:'彗企', olhuiqi_info:'觉醒技。一名角色回合结束后,若仅有三名角色于此回合成为过牌的目标,你获得〖偕举〗并获得一个额外的回合。', olxieju:'偕举', olxieju_info:'出牌阶段限一次。你可以令任意名本回合成为过牌的目标的角色依次视为使用一张【杀】。', + ol_zhouqun:'周群', + oltianhou:'天候', + oltianhou_info:'锁定技。准备阶段,你观看牌堆顶的一张牌,且可以用你的一张牌交换此牌。然后你展示牌堆顶的牌,令一名角色根据此牌的花色获得对应的技能直到你下个准备阶段开始:♠〖骤雨〗;♥〖烈暑〗;♣〖严霜〗;♦〖凝雾〗。', + olchenshuo:'谶说', + olchenshuo_info:'结束阶段,你可以展示一张手牌,然后展示牌堆顶的一张牌。若这两张牌类型/花色/点数/牌名字数中任一项相同且已展示的牌数小于3,则你重复此流程,然后获得所有所有展示牌。', + oltianhou_spade:'骤雨', + oltianhou_spade_miehuo:'骤雨', + oltianhou_spade_info:'锁定技。其他角色造成火属性伤害时,取消之;一名角色受到雷属性伤害后,所有与其座次相邻的角色失去1点体力。', + oltianhou_heart:'烈暑', + oltianhou_heart_info:'锁定技。其他角色的结束阶段开始时,若其体力值为全场最大,则其失去1点体力。', + oltianhou_club:'严霜', + oltianhou_club_info:'锁定技。其他角色的结束阶段开始时,若其体力值为全场最小,则其失去1点体力。', + oltianhou_diamond:'凝雾', + oltianhou_diamond_info:'锁定技。其他角色使用【杀】指定与其座次不相邻唯一目标时,则其判定。若判定结果的点数大于此【杀】,则此【杀】对其无效。', sp_tianji:'天极·皇室宗亲', sp_sibi:'四弼·辅国文曲', diff --git a/character/sp2.js b/character/sp2.js index 04de4f2c7..55591f96f 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,7 +4,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sp2', connect:true, character:{ - dc_wangjun:['male','qun',4,['dcmianyao','dcchangqu']], dc_jsp_guanyu:['male','wei',4,['new_rewusheng','dcdanji']], dc_mengda:['male','wei',4,['dclibang','dcwujie']], dc_zhangmancheng:['male','qun',4,['dclvecheng','dczhongji'],['unseen']], @@ -108,238 +107,10 @@ 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_decade:['caobuxing','re_maliang','xin_baosanniang','dc_wangjun'], + sp_decade:['caobuxing','re_maliang','xin_baosanniang'], } }, skill:{ - //新服灭霸 - dcmianyao:{ - audio:2, - trigger:{ - player:'phaseDrawEnd', - }, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; - }, - content:function(){ - 'step 0' - player.chooseCard('h',get.prompt('dcmianyao'),'展示点数最小的一张牌并随机插入牌堆中,然后于回合结束时摸此牌点数张牌。',function(card,player){ - var num=get.number(card,player); - return !player.hasCard(card2=>{ - return card!=card2&&get.number(card2,player){ - var player=_status.event.player; - var value=player.getUseValue(card,null,true); - if(value>5&&get.number(card)<=2) return 0; - return 1+1/Math.max(0.1,value); - }); - 'step 1' - if(result.bool){ - player.logSkill('dcmianyao'); - var card=result.cards[0]; - event.card=card; - player.showCards([card],get.translation(player)+'发动了【免徭】'); - } - else event.finish(); - 'step 2' - player.$throw(1,1000); - player.lose(card,ui.cardPile).insert_index=function(){ - return ui.cardPile.childNodes[get.rand(0,ui.cardPile.childNodes.length-1)]; - } - player.addTempSkill('dcmianyao_draw'); - var num=get.number(card); - if(num>0) player.addMark('dcmianyao_draw',num,false); - }, - subSkill:{ - draw:{ - trigger:{ - player:'phaseEnd', - }, - filter:function(event,player){ - return player.hasMark('dcmianyao_draw'); - }, - forced:true, - charlotte:true, - onremove:true, - content:function(){ - player.draw(player.countMark('dcmianyao_draw')); - }, - } - } - }, - dcchangqu:{ - audio:2, - enable:'phaseUse', - usable:1, - selectTarget:function(){ - return [1,game.countPlayer()-1]; - }, - complexSelect:true, - complexTarget:true, - multitarget:true, - multiline:true, - filterTarget:function(card,player,target){ - if(player==target) return false; - var next=player.getNext(),prev=player.getPrevious(); - var selected=ui.selected.targets; - if(!selected.contains(next)&&!selected.contains(prev)) return (target==next||target==prev); - for(var i of selected){ - if(i.getNext()==target||i.getPrevious()==target) return true; - } - return false; - }, - contentBefore:function(){ - event.getParent()._dcchangqu_targets=targets.slice(); - }, - content:function(){ - 'step 0' - event.targets=event.getParent()._dcchangqu_targets; - var current=targets[0]; - current.addMark('dcchangqu_warship'); - current.addMark('dcchangqu_warshipx',1,false); - event.num=0; - game.delayx(); - 'step 1' - var target=targets.shift(); - event.target=target; - var num=Math.max(1,event.num); - var nextPlayer=targets.find(i=>{ - return i.isIn(); - }); - if(target.hasMark('dcchangqu_warshipx')){ - var prompt2='是否交给'+get.translation(player)+get.cnNumber(num)+'张手牌?'+(nextPlayer?'若如此做,将“战舰”移动给'+get.translation(nextPlayer)+',':',')+'否则你下次受到的属性伤害值+'+num; - target.chooseCard(get.translation(player)+'对你发动了【长驱】',prompt2).set('ai',card=>{ - if(_status.event.att>0) return 6-get.value(card); - if(_status.event.take) return -get.value(card); - return 5-get.value(card); - }).set('att',get.attitude(target,player)).set('take',function(){ - var base=num; - var getEffect=function(target,player,num){ - var natures=['fire','thunder','ice']; - return natures.map(nature=>{ - return get.damageEffect(target,target,player,nature)*Math.sqrt(num)/Math.min(1.5,1+target.countCards('h')); - }).reduce((sum,eff)=>{ - return sum+eff; - },0)/natures.length; - } - var eff=getEffect(player,player,base); - return targets.some((current,ind)=>{ - var num=base+ind+1; - var effx=getEffect(current,player,num); - return effx{ - return i.isIn(); - }); - if(nextPlayer){ - target.line(nextPlayer); - nextPlayer.addMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); - nextPlayer.addMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); - event.goto(1); - game.delayx(); - } - target.removeMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); - target.removeMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); - 'step 4' - var targets=game.players.slice().concat(game.dead); - targets.forEach(i=>{ - delete i.storage.dcchangqu_warshipx; - }); - }, - ai:{ - order:10, - expose:0.05, - result:{ - target:function(player,target){ - var att=get.attitude(player,target); - var targets=game.filterPlayer(i=>i!=player); - targets.sortBySeat(player); - var targets2=targets.reverse(); - var sum=0; - var maxSum=-Infinity,maxIndex=-1; - var maxSum2=-Infinity,maxIndex2=-1; - for(var i=0;imaxSum){ - maxSum=sum; - maxIndex=i; - } - } - var sum=0; - for(var i=0;imaxSum2){ - maxSum2=sum; - maxIndex2=i; - } - } - if(maxSummaxIndex) return -100*get.sgnAttitude(player,target); - if(target==targets[ui.selected.targets.length]) return get.sgnAttitude(player,target); - return 0; - } - }, - }, - subSkill:{ - warship:{ - marktext:'舰', - intro:{ - name:'战舰', - name2:'战舰', - content:'这里停了&艘战舰!不过啥用没有。', - } - }, - add:{ - trigger:{ - player:'damageBegin3', - }, - filter:function(event,player){ - return event.nature&&player.hasMark('dcchangqu_add'); - }, - forced:true, - onremove:true, - charlotte:true, - content:function(){ - 'step 0' - trigger.num+=player.countMark('dcchangqu_add'); - player.removeSkill('dcchangqu_add'); - }, - marktext:'驱', - intro:{ - content:'下次受到的属性伤害+#', - } - }, - } - }, //魏关羽 dcdanji:{ audio:'danji', @@ -500,8 +271,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai2:function(target){ var player=_status.event.player,card=ui.selected.cards[0]; + var val=get.value(card,target); if(val>0) return get.attitude(player,target)*2; - return (get.value(card,target)-2)*get.attitude(player,target); + return (val-2)*get.attitude(player,target); }, }); 'step 4' @@ -1035,14 +807,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCardToPlayered'}, usable:1, filter:function(event,player){ - return player.countCards('e')>0&&event.card.name=='sha'&&event.getParent().triggeredTargets3.length==event.targets.length; + return event.card.name=='sha'&&event.getParent().triggeredTargets3.length==event.targets.length; }, check:function(event,player){ return event.targets.some(target=>get.effect(target,event.card,player,player)<=0); }, content:function(){ 'step 0' - var num=player.countCards('e'); + var num=player.countCards('e')+1; event.num=num; player.draw(num); 'step 1' @@ -1071,7 +843,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var eff=get.effect(targetx,{name:'sha'},player,player); delete _status._dctingxian_aiChecking; if(eff<0) return true; - }).length0; + return player.hasCard(card=>card.hasGaintag('xinfu_bijing')&&player.canRecast(card),'h'); }, content:function(){ - var cards=player.getCards('h',function(card){ - return card.hasGaintag('xinfu_bijing'); - }); - player.loseToDiscardpile(cards); - player.draw(cards.length); + player.recast(player.getCards('h',card=>card.hasGaintag('xinfu_bijing')&&player.canRecast(card))); }, sub:true, }, @@ -9605,7 +9374,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(num>=3){ str+=';始终跳过弃牌阶段'; } - if(num>=4){ + if(num==0||num>=4){ str+=';造成的伤害+1'; } return str; @@ -9629,7 +9398,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xinfu_xingzhao2":{ audio:true, trigger:{ - player:"phaseDiscardBefore", + player:['phaseJudgeBefore','phaseDiscardBefore'], }, forced:true, filter:function(event,player){ @@ -9640,7 +9409,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ trigger.cancel(); - game.log(player,'跳过了弃牌阶段'); + game.log(player,'跳过了'+(trigger.name=='phaseJudge'?'判定':'弃牌')+'阶段'); }, }, xinfu_xingzhao3:{ @@ -9653,7 +9422,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=game.countPlayer(function(current){ return current.isDamaged(); }); - return num>=4; + return num==0||num>=4; }, content:function(){ trigger.num++; @@ -10050,6 +9819,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mengda:['dc_mengda','ol_mengda','pe_mengda'], jsp_guanyu:['dc_jsp_guanyu','jsp_guanyu'], mushun:['mushun','sp_mushun'], + wangjun:['dc_wangjun','wangjun'], + zoushi:['re_zoushi','jsrg_zoushi'], }, translate:{ lijue:"李傕", @@ -10063,8 +9834,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhangqiying:"张琪瑛", sp_liuqi:'刘琦', xf_tangzi:"唐咨", - xf_huangquan:"黄权", - xf_sufei:"苏飞", + xf_huangquan:"OL黄权", + xf_sufei:"OL苏飞", "xinfu_langxi":"狼袭", "xinfu_langxi_info":"准备阶段,你可以对一名体力小于或等于你的其他角色造成0~2点随机伤害。", "xinfu_yisuan":"亦算", @@ -10106,7 +9877,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "xz_xunxun":"恂恂", "xz_xunxun_info":"摸牌阶段,你可以观看牌堆顶的四张牌,然后将其中的两张牌置于牌堆顶,并将其余的牌以任意顺序置于牌堆底。", "xinfu_xingzhao":"兴棹", - "xinfu_xingzhao_info":"锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,弃牌阶段开始时,你跳过此阶段。若X≥4,当你造成伤害时,此伤害+1。(X为场上已受伤的角色数)", + "xinfu_xingzhao_info":"锁定技。若X≥1,你视为拥有技能〖恂恂〗。若X≥2,当你使用装备牌时,你摸一张牌。若X≥3,判定阶段或弃牌阶段开始时,你跳过此阶段。若X=0或X≥4,当你造成伤害时,此伤害+1(X为场上已受伤的角色数)。", "xinfu_xingzhao2":"兴棹", "xinfu_xingzhao2_info":"", xinfu_xingzhao3:'兴棹', @@ -10519,13 +10290,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dczuojian_info:'出牌阶段结束时,若你于此阶段使用过的牌数不小于体力值,你可以选择一项:1.令装备区牌数多于你的角色各摸一张牌;2.弃置装备区牌数少于你的角色各一张手牌。', sunlang:'孙狼', dctingxian:'铤险', - dctingxian_info:'每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后令此【杀】对其中至多X个目标无效(X为你装备区的牌数)。', + dctingxian_info:'每回合限一次。当你使用【杀】指定最后一个目标后,你可以摸X张牌,然后令此【杀】对其中至多X个目标无效(X为你装备区的牌数+1)。', dcbenshi:'奔矢', dcbenshi_info:'锁定技。①你的攻击范围+1。②你的攻击范围基数不受装备区内武器牌的影响。③由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。', sunhuan:'孙桓', dcniji:'逆击', dcniji_info:'①当你成为非装备牌的目标后,你可以摸一张牌,称为“逆击”。②一名角色的结束阶段,若你于本回合获得的“逆击”数不小于你的体力值,你可以使用一张“逆击”。你弃置所有“逆击”。', - //dc_fuwan:'十周年伏完', + //dc_fuwan:'新杀伏完', //dc_fuwan_ab:'伏完', dcmoukui:'谋溃', dcmoukui_info:'当你使用【杀】指定第一个目标后,你可以选择任意项:1.摸一张牌;2.弃置其中一个目标角色一张牌。若你均选择,当此【杀】被无效后或被抵消后,该角色弃置你一张牌。', @@ -10551,11 +10322,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcdanji_info:'觉醒技。准备阶段,若你的手牌数大于体力值,你减1点体力上限,将体力回复至体力上限,然后获得〖马术〗和〖怒嗔〗。', dcnuchen:'怒嗔', dcnuchen_info:'出牌阶段限一次。你可以展示一名其他角色的一张手牌,然后选择一项:1.弃置任意张该花色的牌,对其造成等量伤害;2.获得该角色手牌中所有此花色的牌。', - dc_wangjun:'王濬', - dcmianyao:'免徭', - dcmianyao_info:'摸牌阶段结束时,你可以展示手牌中点数最小的一张牌并将此牌随机插入牌堆中。然后你于此回合结束时摸等同于此牌点数的牌。', - dcchangqu:'长驱', - dcchangqu_info:'出牌阶段限一次。你可以开一艘战舰(你从你的上家或下家开始选择任意名座位连续的其他角色,且起点角色获得“战舰”标记)。这些角色按照你选择的顺序依次执行:{若其有本次获得的“战舰”,其选择一项:1.交给你X张手牌,然后将“战舰”移动给你选择的下一名目标角色;2.令其下次受到的属性伤害值+X,然后横置(X为本次〖长驱〗中选项一被选择过的次数且至少为1)。}。', sp_whlw:"文和乱武", sp_zlzy:"逐鹿中原", diff --git a/character/standard.js b/character/standard.js index 073d1a8e4..f63932fd3 100755 --- a/character/standard.js +++ b/character/standard.js @@ -2471,17 +2471,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, characterReplace:{ - caocao:['re_caocao','caocao'], + caocao:['re_caocao','caocao','dc_caocao'], guojia:['re_guojia','guojia','ps1059_guojia','ps2070_guojia'], simayi:['re_simayi','simayi','ps_simayi','ps2068_simayi'], jin_simayi:['jin_simayi','junk_simayi','ps_jin_simayi'], zhenji:['re_zhenji','yj_zhenji','zhenji'], xuzhu:['re_xuzhu','xuzhu'], zhangliao:['re_zhangliao','zhangliao'], - sp_zhangliao:['sp_zhangliao','yj_zhangliao'], + sp_zhangliao:['sp_zhangliao','yj_zhangliao','jsrg_zhangliao'], xiahoudun:['re_xiahoudun','xin_xiahoudun','xiahoudun'], - liubei:['re_liubei','liubei','junk_liubei'], - guanyu:['re_guanyu','guanyu','ps_guanyu'], + liubei:['re_liubei','liubei','dc_liubei','junk_liubei'], + guanyu:['re_guanyu','guanyu','jsrg_guanyu','ps_guanyu'], zhangfei:['re_zhangfei','tw_zhangfei','xin_zhangfei','old_zhangfei','zhangfei','yj_zhangfei'], zhaoyun:['re_zhaoyun','old_zhaoyun','zhaoyun','ps2063_zhaoyun','ps2067_zhaoyun'], sp_zhaoyun:['sp_zhaoyun','jsp_zhaoyun'], @@ -2489,7 +2489,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_machao:['sp_machao','old_machao'], zhugeliang:['re_zhugeliang','zhugeliang','ps2066_zhugeliang','ps_zhugeliang'], huangyueying:['re_huangyueying','huangyueying','junk_huangyueying'], - sunquan:['re_sunquan','sunquan'], + sunquan:['re_sunquan','sunquan','dc_sunquan'], zhouyu:['re_zhouyu','zhouyu','ps1062_zhouyu','ps2080_zhouyu'], luxun:['re_luxun','luxun'], lvmeng:['re_lvmeng','lvmeng'], @@ -2498,7 +2498,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sunshangxiang:['re_sunshangxiang','sunshangxiang'], ganning:['re_ganning','ganning','yongjian_ganning'], yj_ganning:['yj_ganning','sp_ganning'], - lvbu:['re_lvbu','lvbu','ps_lvbu'], + lvbu:['re_lvbu','lvbu','jsrg_lvbu','ps_lvbu'], diaochan:['re_diaochan','diaochan'], huatuo:['re_huatuo','old_huatuo','huatuo'], huaxiong:['re_huaxiong','old_huaxiong','huaxiong','ol_huaxiong'], diff --git a/character/tw.js b/character/tw.js index 195afd8ca..1a56ef2a0 100644 --- a/character/tw.js +++ b/character/tw.js @@ -1282,16 +1282,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ group:'twqingtao_jieshu', content:function(){ 'step 0' - player.chooseCard(get.prompt2('twqingtao'),'he').set('ai',function(card){ + player.chooseCard(get.prompt2('twqingtao'),'he',lib.filter.cardRecastable).set('ai',function(card){ if(card.name=='jiu'||get.type(card)!='basic') return 10-get.value(card); return 6-get.value(card); }); 'step 1' if(result.bool){ player.logSkill('twqingtao'); - player.loseToDiscardpile(result.cards); - player.draw(); - if(result.cards[0].name=='jiu'||get.type(result.cards[0],false,player)!='basic') player.draw(); + player.recast(result.cards); + if(get.name(result.cards[0])=='jiu'||get.type(result.cards[0],false,player)!='basic') player.draw(); } }, subSkill:{ @@ -2410,7 +2409,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{content:'已使用牌名:$'}, subSkill:{ achieve:{ - audio:'mibei', + audio:'mibei1', skillAnimation:true, animationColor:'water', }, @@ -2428,7 +2427,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, fail:{ - audio:'mibei', + audio:'mibei2', trigger:{player:'phaseUseEnd'}, forced:true, filter:function(event,player){ @@ -11174,14 +11173,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' if(!event.isMine()&&!event.isOnline()) game.delayx(); - player.chooseCard('是否发动【革制】重铸一张牌?').set('ai',function(card){ + player.chooseCard('是否发动【革制】重铸一张牌?',lib.filter.cardRecastable).set('ai',function(card){ return 5.5-get.value(card); }); 'step 1' if(result.bool){ player.logSkill('twgezhi'); - player.loseToDiscardpile(result.cards); - player.draw(); + player.recast(result.cards); } }, group:'twgezhi_buff', @@ -11192,7 +11190,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, filter:function(event,player){ return player.getHistory('lose',function(evt){ - return evt.getParent(2).name=='twgezhi'&&evt.getParent('phaseUse')==event; + return evt.getParent(3).name=='twgezhi'&&evt.getParent('phaseUse')==event; }).length>1; }, content:function(){ @@ -11695,14 +11693,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, filter:function(event,player){ for(var i of player.getStorage('twjuezhu_restore')){ - if(i[0]==event.player&&player.hasEnabledSlot(i[1])) return true; + if(i[0]==event.player&&player.hasDisabledSlot(i[1])) return true; } return false; }, content:function(){ var list=[]; for(var i of player.getStorage('twjuezhu_restore')){ - if(i[0]==trigger.player&&player.hasEnabledSlot(i[1])) list.push(i[1]); + if(i[0]==trigger.player&&player.hasDisabledSlot(i[1])) list.push(i[1]); } player.enableEquip(list); }, @@ -13564,7 +13562,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twhanyu_info:'锁定技。游戏开始时,你获得牌堆中的基本牌,锦囊牌,装备牌各一张。', twhengjiang:'横江', twhengjiang_info:'出牌阶段限一次,当你使用基本牌或普通锦囊牌指定唯一目标后,你可将此牌的目标改为攻击范围内的所有合法目标,然后你于此牌结算结束后摸X张牌(X为因响应此牌而使用或打出过牌的角色数)。', - tw_huojun:'霍峻', + tw_huojun:'TW霍峻', twsidai:'伺怠', twsidai_info:'限定技。出牌阶段,你可以将手牌区内的所有基本牌当做【杀】使用(无距离和次数限制)。若此牌对应的实体牌中:包含【闪】,则目标角色成为此牌的目标后,需弃置一张基本牌,否则不可响应此牌;包含【桃】,则当目标角色受到此牌的伤害后,其减1点体力上限;包含【酒】,则当目标角色受到此牌的伤害时,此伤害×2。', twjieyu:'竭御', @@ -13869,7 +13867,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twluanchou_info:'出牌阶段限一次。你可以令两名角色获得〖共患〗直到你下次发动此技能。', twgonghuan:'共患', twgonghuan_info:'每回合限一次。当其他角色受到伤害时,若其拥有〖共患〗且其体力值不大于你,你可以将此伤害转移给你(不触发〖共患〗)。', - tw_qiaorui:'桥蕤', + tw_qiaorui:'TW桥蕤', wangxing:'妄行', twxiawei:'狭威', twxiawei_info:'①游戏开始时,你将牌堆中的两张基本牌置于武将牌上,称为“威”。②回合开始时,你将所有“威”置入弃牌堆。③你可以将“威”如手牌般使用或打出。④妄行:准备阶段,你可以将牌堆顶的X+1张牌置于武将牌上,称为“威”。', diff --git a/character/xiake.js b/character/xiake.js index 7d15e350a..298b82e5d 100644 --- a/character/xiake.js +++ b/character/xiake.js @@ -34,12 +34,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', position:'e', filter:function(event,player){ - return player.countCards('e')>0; + return player.hasCard(card=>lib.skill.rouquan.filterCard(card,player),lib.skill.rouquan.position); }, - filterCard:true, + filterCard:lib.filter.cardRecastable, prompt:'将要重铸的牌置入弃牌堆并摸一张牌', discard:false, - delay:0.5, + lose:false, + delay:false, check:function(card,player){ var val=get.equipValue(card); var player=_status.event.player; @@ -51,16 +52,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return 0; }, - prepare:function(cards,player){ - player.$throw(cards,1000); - }, content:function(){ - "step 0" - player.draw(); - "step 1" - for(var i=0;i=0;i--){ + if(i==history.length-1){ + if(history[i].sourceDamage.indexOf(event)>0) return false; + } + else if(history[i].sourceDamage.some(evt=>evt!=event)) return false; + if(history[i].isRound) break; + } + return true; + }, + content:function(){ + var num=1,current=_status.currentPhase; + if(current&&trigger.player!=current){ + var num=0,players=game.players.slice(0).concat(game.dead); + for(var target of players){ + target.getHistory('sourceDamage',function(evt){ + num+=evt.num; + }); + } + } + player.draw(num); + }, + }, + dcpandi:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + var players=event.dcpandi; + if(!players||!players.length) return false; + var source=player.storage.dcpandi_effect; + return get.itemtype(source)!='player'||!source.isIn(); + }, + onChooseToUse:function(event){ + if(!game.online&&event.type=='phase'){ + var players=game.filterPlayer(function(current){ + return current!=event.player&¤t.getHistory('sourceDamage').length==0; + }) + event.set('dcpandi',players) + } + }, + filterTarget:function(card,player,target){ + var players=_status.event.dcpandi; + if(!players||!players.length) return false; + return players.contains(target); + }, + content:function(){ + if(target.isIn()){ + player.storage.dcpandi_effect=target; + player.addTempSkill('dcpandi_effect','phaseUseAfter'); + } + }, + ai:{ + threaten:4, + order:12, + result:{ + player:function(player,target){ + return player.getCards('hs').reduce(function(eff,card){ + return Math.max(eff,lib.skill.dcpandi.getUseValue(card,target,player)-lib.skill.dcpandi.getUseValue(card,player,player)) + },0) + }, + }, + }, + getUseValue:function(card,player,viewer){ + if(typeof(card)=='string'){ + card={name:card,isCard:true}; + } + var targets=game.filterPlayer(); + var value=[]; + var min=0; + var info=get.info(card); + if(!info||info.notarget) return 0; + var range; + var select=get.copy(info.selectTarget); + if(select==undefined){ + if(info.filterTarget==undefined) return true; + range=[1,1]; + } + else if(typeof select=='number') range=[select,select]; + else if(get.itemtype(select)=='select') range=select; + else if(typeof select=='function') range=select(card,player); + if(info.singleCard) range=[1,1]; + game.checkMod(card,player,range,'selectTarget',player); + if(!range) return 0; + + for(var i=0;iplayer.storage.dcpandi_effect, + content:function(){ + trigger.player=player.storage.dcpandi_effect; + trigger.noai=true; + player.removeSkill('dcpandi_effect'); + game.delay(0.5); + }, + ai:{ + order:function(card,player,target,current){ + if(typeof card!='object') return; + var source=player.storage.dcpandi_effect; + if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; + return [0,get.effect_use(target,card,source,player),0,get.effect(target,card,source,target)] + }, + }, + mod:{ + selectCard:function(card,player,range){ + var source=player.storage.dcpandi_effect; + if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; + var range,info=get.info(card); + var select=get.copy(info.selectTarget); + if(select==undefined){ + if(info.filterTarget==undefined) return [0,0]; + range=[1,1]; + } + else if(typeof select=='number') range=[select,select]; + else if(get.itemtype(select)=='select') range=select; + else if(typeof select=='function') range=select(card,source); + game.checkMod(card,source,range,'selectTarget',source); + }, + cardEnabled2:function(card,player,event){ + var source=player.storage.dcpandi_effect; + if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; + var check=game.checkMod(card,source,event,'unchanged','cardEnabled2',source); + return check; + }, + cardEnabled:function(card,player,event){ + var source=player.storage.dcpandi_effect; + if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; + if(event==='forceEnable'){ + var mod=game.checkMod(card,source,event,'unchanged','cardEnabled',source); + if(mod!='unchanged') return mod; + return true; + } + else{ + var filter=get.info(card).enable; + if(!filter) return; + var mod=game.checkMod(card,player,source,'unchanged','cardEnabled',source); + if(mod!='unchanged') return mod; + if(typeof filter=='boolean') return filter; + if(typeof filter=='function') return filter(card,player,event); + } + }, + cardUsable:function(card,player,num){ + var source=player.storage.dcpandi_effect; + if(!source.isIn()||get.itemtype(source)!='player'||get.itemtype(source.storage.dcpandi_effect)=='player') return; + var event=_status.event; + if(event.type=='chooseToUse_button') event=event.getParent(); + if(source!=_status.event.player) return true; + if(info.updateUsable=='phaseUse'){ + if(event.getParent().name!='phaseUse') return true; + if(event.getParent().player!=source) return true; + } + event.addCount_extra=true; + var num=info.usable; + if(typeof num=='function') num=num(card,source); + num=game.checkMod(card,source,num,event,'cardUsable',source); + if(typeof num!='number') return true; + if(source.countUsed(card)4) return false; + if(event.name=='die') return true; + return event.name!='phase'||game.phaseNumber==0; + }, + content:function(){ + player.addSkill('dctongye_buff'); + var num=game.countGroup(); + if(num<=4){ + player.addMark('dctongye_handcard',3,false); + game.log(player,'手牌上限','#y+3'); + } + if(num<=3){ + player.addMark('dctongye_range',3,false); + game.log(player,'攻击范围','#y+3'); + } + if(num<=2){ + player.addMark('dctongye_sha',3,false); + game.log(player,'使用杀的次数上限','#y+3'); + } + if(num<=1){ + player.addMark('dctongye_draw',3,false); + game.log(player,'摸牌阶段额定摸牌数','#y+3'); + } + }, + subSkill:{ + buff:{ + audio:'dctongye', + trigger:{player:'phaseDrawBegin2'}, + forced:true, + filter:function(event,player){ + if(!player.hasMark('dctongye_draw')) return false; + return !event.numFixed; + }, + content:function(){ + trigger.num+=player.countMark('dctongye_draw'); + }, + charlotte:true, + onremove:['dctongye_handcard','dctongye_range','dctongye_sha','dctongye_draw'], + mark:true, + marktext:'统', + intro:{ + content:function(storage,player){ + var str=''; + var hand=player.countMark('dctongye_handcard'),range=player.countMark('dctongye_range'),sha=player.countMark('dctongye_sha'),draw=player.countMark('dctongye_draw'); + if(hand>0){ + str+='
  • 手牌上限+'+hand+';'; + } + if(range>0){ + str+='
  • 攻击范围+'+range+';'; + } + if(sha>0){ + str+='
  • 使用【杀】的次数上限+'+sha+';' + } + if(draw>0){ + str+='
  • 摸牌阶段额定摸牌数+'+draw+'。'; + } + str=str.slice(0,-1)+'。'; + return str; + } + }, + mod:{ + maxHandcard:function(player,num){ + return num+player.countMark('dctongye_handcard'); + }, + attackRange:function(player,num){ + return num+player.countMark('dctongye_range'); + }, + cardUsable:function(card,player,num){ + if(card.name=='sha'){ + return num+player.countMark('dctongye_sha'); + } + }, + }, + ai:{ + threaten:2.6, + }, + }, + }, + }, + dcmianyao:{ + audio:2, + trigger:{ + player:'phaseDrawEnd', + }, + direct:true, + filter:function(event,player){ + return player.countCards('h')>0; + }, + content:function(){ + 'step 0' + player.chooseCard('h',get.prompt('dcmianyao'),'展示点数最小的一张牌并随机插入牌堆中,然后于回合结束时摸此牌点数张牌。',function(card,player){ + var num=get.number(card,player); + return !player.hasCard(card2=>{ + return card!=card2&&get.number(card2,player){ + var player=_status.event.player; + var value=player.getUseValue(card,null,true); + if(value>5&&get.number(card)<=2) return 0; + return 1+1/Math.max(0.1,value); + }); + 'step 1' + if(result.bool){ + player.logSkill('dcmianyao'); + var card=result.cards[0]; + event.card=card; + player.showCards([card],get.translation(player)+'发动了【免徭】'); + } + else event.finish(); + 'step 2' + player.$throw(1,1000); + player.lose(card,ui.cardPile).insert_index=function(){ + return ui.cardPile.childNodes[get.rand(0,ui.cardPile.childNodes.length-1)]; + } + player.addTempSkill('dcmianyao_draw'); + var num=get.number(card); + if(num>0) player.addMark('dcmianyao_draw',num,false); + }, + subSkill:{ + draw:{ + trigger:{ + player:'phaseEnd', + }, + filter:function(event,player){ + return player.hasMark('dcmianyao_draw'); + }, + forced:true, + charlotte:true, + onremove:true, + content:function(){ + player.draw(player.countMark('dcmianyao_draw')); + }, + } + } + }, + dcchangqu:{ + audio:2, + enable:'phaseUse', + usable:1, + selectTarget:function(){ + return [1,game.countPlayer()-1]; + }, + complexSelect:true, + complexTarget:true, + multitarget:true, + multiline:true, + filterTarget:function(card,player,target){ + if(player==target) return false; + var next=player.getNext(),prev=player.getPrevious(); + var selected=ui.selected.targets; + if(!selected.contains(next)&&!selected.contains(prev)) return (target==next||target==prev); + for(var i of selected){ + if(i.getNext()==target||i.getPrevious()==target) return true; + } + return false; + }, + contentBefore:function(){ + event.getParent()._dcchangqu_targets=targets.slice(); + }, + content:function(){ + 'step 0' + event.targets=event.getParent()._dcchangqu_targets; + var current=targets[0]; + current.addMark('dcchangqu_warship'); + current.addMark('dcchangqu_warshipx',1,false); + event.num=0; + game.delayx(); + 'step 1' + var target=targets.shift(); + event.target=target; + var num=Math.max(1,event.num); + var nextPlayer=targets.find(i=>{ + return i.isIn(); + }); + if(target.hasMark('dcchangqu_warshipx')){ + var prompt2='是否交给'+get.translation(player)+get.cnNumber(num)+'张手牌?'+(nextPlayer?'若如此做,将“战舰”移动给'+get.translation(nextPlayer)+',':',')+'否则你下次受到的属性伤害值+'+num; + target.chooseCard(get.translation(player)+'对你发动了【长驱】',prompt2).set('ai',card=>{ + if(_status.event.att>0) return 6-get.value(card); + if(_status.event.take) return -get.value(card); + return 5-get.value(card); + }).set('att',get.attitude(target,player)).set('take',function(){ + var base=num; + var getEffect=function(target,player,num){ + var natures=['fire','thunder','ice']; + return natures.map(nature=>{ + return get.damageEffect(target,target,player,nature)*Math.sqrt(num)/Math.min(1.5,1+target.countCards('h')); + }).reduce((sum,eff)=>{ + return sum+eff; + },0)/natures.length; + } + var eff=getEffect(player,player,base); + return targets.some((current,ind)=>{ + var num=base+ind+1; + var effx=getEffect(current,player,num); + return effx{ + return i.isIn(); + }); + if(nextPlayer){ + target.line(nextPlayer); + nextPlayer.addMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); + nextPlayer.addMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); + event.goto(1); + game.delayx(); + } + target.removeMark('dcchangqu_warship',target.countMark('dcchangqu_warship')); + target.removeMark('dcchangqu_warshipx',target.countMark('dcchangqu_warshipx'),false); + 'step 4' + var targets=game.players.slice().concat(game.dead); + targets.forEach(i=>{ + delete i.storage.dcchangqu_warshipx; + }); + }, + ai:{ + order:10, + expose:0.05, + result:{ + target:function(player,target){ + var att=get.attitude(player,target); + var targets=game.filterPlayer(i=>i!=player); + targets.sortBySeat(player); + var targets2=targets.reverse(); + var sum=0; + var maxSum=-Infinity,maxIndex=-1; + var maxSum2=-Infinity,maxIndex2=-1; + for(var i=0;imaxSum){ + maxSum=sum; + maxIndex=i; + } + } + var sum=0; + for(var i=0;imaxSum2){ + maxSum2=sum; + maxIndex2=i; + } + } + if(maxSummaxIndex) return -100*get.sgnAttitude(player,target); + if(target==targets[ui.selected.targets.length]) return get.sgnAttitude(player,target); + return 0; + } + }, + }, + subSkill:{ + warship:{ + marktext:'舰', + intro:{ + name:'战舰', + name2:'战舰', + content:'这里停了&艘战舰!不过啥用没有。', + } + }, + add:{ + trigger:{ + player:'damageBegin3', + }, + filter:function(event,player){ + return event.nature&&player.hasMark('dcchangqu_add'); + }, + forced:true, + onremove:true, + charlotte:true, + content:function(){ + 'step 0' + trigger.num+=player.countMark('dcchangqu_add'); + player.removeSkill('dcchangqu_add'); + }, + marktext:'驱', + intro:{ + content:'下次受到的属性伤害+#', + } + }, + } + }, + //周不疑 + dcshiji:{ + audio:2, + trigger:{ + global:'phaseJieshuBegin', + }, + filter:function(event,player){ + return event.player.isIn()&&!event.player.getHistory('sourceDamage').length; + }, + direct:true, + content:function(){ + 'step 0' + trigger.player.addTempSkill('dcshiji_forbidself'); + var list=[]; + for(var name of lib.inpile){ + var type=get.type(name); + if(type!='trick') continue; + if(player.getStorage('dcshiji_used').contains(name)) continue; + var card={ + name:name, + storage:{dcshiji:true}, + }; + if(trigger.player.hasUseTarget(card)){ + list.push([type,'',name]); + } + } + if(list.length){ + player.chooseButton([get.prompt('dcshiji',trigger.player),[list,'vcard']]).set('ai',button=>{ + if(_status.event.tochoose) return _status.event.getTrigger().player.getUseValue({name:button.link[2]}); + return 0; + }).set('tochoose',get.attitude(player,trigger.player)>0&&trigger.player.hasCard(card=>{ + return get.value(card)<7; + },'hes')); + } + else event.finish(); + 'step 1' + if(result.bool){ + var card={ + name:result.links[0][2], + storage:{dcshiji:true}, + }; + var str=get.translation(card); + player.logSkill('dcshiji',trigger.player); + player.addTempSkill('dcshiji_used','roundStart'); + player.markAuto('dcshiji_used',[card.name]); + player.popup(str); + game.log(player,'声明了','#y'+str); + game.broadcastAll(function(card){ + lib.skill.dcshiji_backup.viewAs=card; + lib.skill.dcshiji_backup.prompt='十计:是否将一张牌当做'+get.translation(card)+'使用?'; + },card); + var next=trigger.player.chooseToUse(); + next.set('openskilldialog','十计:是否将一张牌当做'+get.translation(card)+'使用?'); + next.set('norestore',true); + next.set('addCount',false); + next.set('_backupevent','dcshiji_backup'); + next.set('custom',{ + add:{}, + replace:{window:function(){}} + }); + next.backup('dcshiji_backup'); + } + }, + subSkill:{ + backup:{ + filterCard:function(card){ + return get.itemtype(card)=='card'; + }, + position:'hes', + selectCard:1, + check:(card)=>7-get.value(card), + popname:true, + }, + used:{ + charlotte:true, + onremove:true, + mark:true, + marktext:'计', + intro:{ + content:'本轮已声明过$', + }, + }, + forbidself:{ + charlotte:true, + mod:{ + targetEnabled:function(card,player,target){ + if(player==target&&card.storage&&card.storage.dcshiji) return false; + }, + }, + } + } + }, + dcsilun:{ + audio:2, + trigger:{ + player:['phaseZhunbeiBegin','damageEnd'], + }, + frequent:true, + content:function(){ + 'step 0' + player.draw(4); + event.count=0; + event.equipCount={}; + game.countPlayer(current=>{ + event.equipCount[current.playerid]=current.countCards('e'); + },true); + 'step 1' + if(!player.countCards('he')) event.goto(5); + else player.chooseCard('四论:选择一张牌('+(event.count+1)+'/'+'4)','然后选择将此牌置于场上或牌堆的两端',true,'he').set('ai',card=>{ + var player=_status.event.player; + if(['equip','delay'].contains(get.type(card))&&player.hasValueTarget(card)) return 50; + return 50-get.value(card); + }); + 'step 2' + if(result.bool){ + var card=result.cards[0]; + event.card=card; + event.count++; + var choices=['牌堆顶','牌堆底']; + var type=get.type(card); + if(type=='equip'&&game.hasPlayer(current=>{ + return current.canEquip(card); + })||type=='delay'&&game.hasPlayer(current=>{ + return !current.storage._disableJudge&&!current.hasJudge(card.name); + })) choices.unshift('场上'); + player.chooseControl(choices).set('prompt','请选择要将'+get.translation(card)+'置于的位置').set('ai',()=>{ + return _status.event.choice; + }).set('choice',function(){ + if(['equip','delay'].contains(get.type(card))&&player.hasValueTarget(card)&&choices.contains('场上')) return '场上'; + var val=get.value(card); + var next=_status.currentPhase; + if(trigger.name=='damage') next=next.getNext(); + if(get.attitude(player,next)>0&&val>=6||get.attitude(player,next)<0&&val<=4.5) return '牌堆顶'; + return '牌堆底'; + }()); + } + 'step 3' + if(result.control=='场上'){ + var type=get.type(card); + player.chooseTarget('将'+get.translation(card)+'置于一名角色的场上',true,(card,player,target)=>{ + return _status.event.targets.contains(target); + }).set('targets',game.filterPlayer(current=>{ + if(type=='equip') return current.canEquip(card); + if(type=='delay') return !current.storage._disableJudge&&!current.hasJudge(card.name); + return false; + })).set('ai',target=>{ + var player=_status.event.player; + var card=_status.event.card; + return get.attitude(player,target)*(get.type(card)=='equip'?get.value(card,target):get.effect(target,{ + name:card.viewAs||card.name, + cards:[card], + },target,target)); + }).set('card',card); + } + else{ + player.$throw(card,1000); + var next=player.lose(card,ui.cardPile); + if(result.control=='牌堆顶') next.insert_card=true; + game.log(player,'将',card,'置于了','#y'+result.control); + } + 'step 4' + if(result.bool&&result.targets&&result.targets.length){ + var target=result.targets[0]; + player.line(target); + player.$give(card,target,false); + if(get.type(card)=='equip'){ + target.equip(card); + } + else{ + target.addJudge(card); + } + } + if(event.count<4) event.goto(1); + 'step 5' + game.countPlayer(current=>{ + var count=current.countCards('e'); + var prevCount=event.equipCount[current.playerid]||0; + if(count!=prevCount){ + current.link(false); + current.turnOver(false); + } + }); + } + }, //杜预 dcjianguo:{ audio:2, @@ -1527,27 +2241,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', usable:1, - filterCard:function(card,player,target){ - var mod=game.checkMod(card,player,'unchanged','cardChongzhuable',player); - return mod=='unchanged'; - }, + filterCard:lib.filter.cardRecastable, selectCard:function(){ return Math.ceil(_status.event.player.countCards('h')/2); }, check:function(card){ return 6.5-get.value(card); }, - prepare:function(cards,player){ - player.$throw(cards,1000); - game.log(player,'将',cards,'置入了弃牌堆'); - }, discard:false, - loseTo:'discardPile', - visible:true, - delay:0.5, + lose:false, + delay:false, content:function(){ 'step 0' - player.draw(cards.length); + player.recast(cards); 'step 1' player.addTempSkill('dcctjiuxian_help'); player.chooseUseTarget({ @@ -1558,7 +2264,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ order:5.5, - result:{player:1}, + result:{player:1} }, subSkill:{ help:{ @@ -4824,7 +5530,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(storage,player){ var list=lib.skill.dchuishu.getList(player); - return '摸牌阶段结束时,你可以摸['+list[0]+']张牌。若如此做:你弃置['+list[1]+']张手牌,且当你于本回合内弃置第['+list[2]+']+1张牌后,你从弃牌堆中获得等量的锦囊牌。'; + return '摸牌阶段结束时,你可以摸['+list[0]+']张牌。若如此做:你弃置['+list[1]+']张手牌,且当你于本回合内弃置第['+list[2]+']+1张牌后,你从弃牌堆中获得等同于本回合弃牌数的锦囊牌。'; }, }, subSkill:{ @@ -4858,7 +5564,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.removeSkill('dchuishu_effect'); var evt=trigger.getl(player); - var num=evt.cards2.length; + var num=0; + player.getHistory('lose',function(evt){ + if(!goon||evt.type!='discard') return false; + num+=evt.cards2.length; + }); var cards=[]; for(var i=0;i1){ + allcards=allcards.concat(list[1][1]); + } + var canchoose=allcards.slice(0); var player=_status.event.player; var getv=function(button){ if(button.name=='sha'&&allcards.filter(function(card){ @@ -10514,7 +11228,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhangjinyun:'张瑾云,张星彩的妹妹,刘禅的第二任皇后,238年正月立为皇后。景耀六年(263年),蜀汉灭亡,刘禅被俘,此后,受封为安乐公。张皇后也随之成为安乐公夫人,咸熙元年(264年),随刘禅到洛阳。', duanqiaoxiao:'段巧笑,三国时代魏国魏文帝时的宫人,甚受到魏文帝的宠爱。传说她以原有的化妆品中的米粉和胡粉,再加入葵花子汁,发明了女性化妆用的脂粉。', ruanji:'阮籍(公元210年~263年),字嗣宗,陈留尉氏(今河南省开封市)人,三国时期魏国诗人、竹林七贤之一。阮瑀之子,门荫入仕,累迁步兵校尉,世称阮步兵。崇奉老庄之学,政治上则采取谨慎避祸的态度。景元四年(公元263年),阮籍去世,享年五十三岁。作为“正始之音”的代表,著有《咏怀八十二首》、《大人先生传》等,其著作收录在《阮籍集》中。', - ganfurenmifuren:'甘夫人,刘备起兵后于沛城娶之为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。
    糜夫人,刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。' + ganfurenmifuren:'甘夫人,刘备起兵后于沛城娶之为妾。后来,甘夫人随刘备到荆州,生了阿斗(也就是后主刘禅)。223年四月,刘备病死于白帝城,追谥甘夫人为“昭烈皇后”。
    糜夫人,刘备夫人。徐州别驾糜竺之妹。长坂兵败,她怀抱年仅两岁的刘禅在乱军中走散,被赵云发现;但麋夫人因为赵云只有一匹马,不肯上马,在将阿斗托付给赵云后投井而亡。', + sunlingluan:'孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。', + zhoubuyi:'周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。', }, characterTitle:{ // wulan:'#b对决限定武将', @@ -10576,7 +11292,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dchuishu:function(player){ var list=lib.skill.dchuishu.getList(player); - return '摸牌阶段结束时,你可以摸['+list[0]+']张牌。若如此做:你弃置['+list[1]+']张手牌,且当你于本回合内弃置第['+list[2]+']+1张牌后,你从弃牌堆中随机获得等量的锦囊牌。'; + return '摸牌阶段结束时,你可以摸['+list[0]+']张牌。若如此做:你弃置['+list[1]+']张手牌,且当你于本回合内弃置第['+list[2]+']+1张牌后,你从弃牌堆中随机获得等同于本回合弃牌数的锦囊牌。'; }, dcshoutan:function(player){ if(player.storage.dcshoutan) return '转换技。出牌阶段限一次,阴:你可以弃置一张不为黑色的手牌。阳:你可以弃置一张黑色手牌。'; @@ -10679,7 +11395,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dushi_info:'锁定技,你处于濒死状态时,其他角色不能对你使用【桃】。你死亡时,你选择一名其他角色获得〖毒逝〗。', yuwei:'余威', yuwei_info:'主公技,锁定技,其他群雄角色的回合内,你将〖诗怨〗改为“每回合每项限两次”。', - re_xinxianying:'辛宪英', + re_xinxianying:'新杀辛宪英', rezhongjian:'忠鉴', rezhongjian2:'忠鉴', rezhongjian_info:'出牌阶段限一次,你可以选择一名本回合内未选择过的角色。你令其获得一项效果直至你的下回合开始:①其下次造成伤害后弃置两张牌,然后你摸一张牌。②其下次受到伤害后摸两张牌,然后你摸一张牌。', @@ -10824,12 +11540,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dagongche_info:'出牌阶段开始时,你可以视为使用一张【杀】,且当此【杀】因执行效果而对目标角色造成伤害后,你弃置其一张牌。若此【大攻车】未被强化,则其他角色无法弃置你装备区内的【大攻车】。当此牌离开你的装备区后,销毁之。', dukui:'杜夔', dcfanyin:'泛音', - dcfanyin_info:'出牌阶段开始时,你可以亮出牌堆中点数最小的一张牌。然后你选择一项,并可以亮出一张点数为此牌二倍的牌且重复此流程:⒈使用此牌;⒉你于本回合内使用的下一张基本牌或普通锦囊牌选择目标后,可以增加一个目标。', + dcfanyin_info:'出牌阶段开始时,你可以亮出牌堆中点数最小的一张牌。然后你选择一项,并可以亮出一张点数为此牌二倍的牌且重复此流程:⒈使用此牌(无距离限制);⒉你于本回合内使用的下一张基本牌或普通锦囊牌选择目标后,可以增加一个目标。', dcpeiqi:'配器', dcpeiqi_info:'当你受到伤害后,你可以移动场上的一张牌。然后若场上所有角色均在彼此的攻击范围内,则你可以再移动场上的一张牌。', quanhuijie:'全惠解', dchuishu:'慧淑', - dchuishu_info:'摸牌阶段结束时,你可以摸[3]张牌。若如此做:你弃置[1]张手牌,且当你于本回合内弃置第[2]+1张牌后,你从弃牌堆中随机获得等量的锦囊牌。', + dchuishu_info:'摸牌阶段结束时,你可以摸[3]张牌。若如此做:你弃置[1]张手牌,且当你于本回合内弃置第[2]+1张牌后,你从弃牌堆中随机获得等同于本回合弃牌数的锦囊牌。', dcyishu:'易数', dcyishu_info:'锁定技。当你不因出牌阶段而失去牌后,你令A={〖慧淑〗的中括号内最小的数字},B={〖慧淑〗的中括号内最大的数字}。然后你令A中的一个数字+2,且B中的一个数字-1。', dcligong:'离宫', @@ -10901,7 +11617,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcwumei_info:'每轮限一次。回合开始时,你可以令一名角色记录场上所有角色的体力值并进行一个额外的回合,并将你的回合移至该回合后进行。该角色以此法进行的回合的结束阶段,将场上所有角色的体力值改为记录内的对应数值。', dczhanmeng:'占梦', dczhanmeng_info:'当你使用牌时,你可以选择本回合未选择过的一项:1.上一回合内,若没有同名牌被使用过,你获得一张非伤害牌;2.下一回合内,当同名牌首次被使用后,你获得一张伤害牌;3.令一名其他角色弃置两张牌,若点数之和大于10,你对其造成1点火焰伤害。', - dc_wangyun:'十周年王允', + dc_wangyun:'新杀王允', dc_wangyun_ab:'王允', dclianji:'连计', dclianji_info:'出牌阶段限一次。你可以弃置一张手牌并选择一名其他角色,其随机使用牌堆中的一张武器牌,然后其选择一项:1.对另一名其他角色使用一张【杀】,并将武器牌交给其中一个目标;2.令你视为对其使用一张【杀】,并将武器牌交给你。', @@ -11013,6 +11729,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcjianguo_info:'出牌阶段限一次。你可以选择一名角色并选择一项:1.令其摸一张牌,然后其弃置一半的手牌;2.令其弃置一张牌,然后其摸等同于手牌数一半的牌(均向下取整)。', dcdyqingshi:'倾势', dcdyqingshi_info:'当你于回合内使用【杀】或普通锦囊牌指定第一个目标后,若目标角色包括其他角色且此牌为你本回合使用的第X张牌,你可以对其中一名不为你的目标角色造成1点伤害(X为你的手牌数)。', + sunlingluan:'孙翎鸾', + dclingyue:'聆乐', + dclingyue_info:'锁定技。一名角色于一轮内首次造成伤害后,你摸一张牌。若此时是该角色回合外,则改为摸X张牌(X为本回合全场造成的伤害值)。', + dcpandi:'盻睇', + dcpandi_info:'出牌阶段,你可以选择一名本回合内未造成过伤害的角色。你本阶段内使用的下一张牌改为以该角色为基准判断使用目标合法性,且使用者改为该角色。', + zhoubuyi:'周不疑', + dcshiji:'十计', + dcshiji_info:'一名角色的结束阶段,若其本回合未造成过伤害,你可以声明一种本轮未以此法声明过的普通锦囊牌,然后其可以将一张牌当你声明的牌使用(其不是此牌的合法目标)。', + dcsilun:'四论', + dcsilun_info:'准备阶段或当你受到伤害后,你可以摸四张牌,然后将四张牌依次置于场上或牌堆两端(对所有角色可见)。装备区牌数因此变化的角色复原其武将牌。', + dc_wangjun:'王濬', + dcmianyao:'免徭', + dcmianyao_info:'摸牌阶段结束时,你可以展示手牌中点数最小的一张牌并将此牌随机插入牌堆中。然后你于此回合结束时摸等同于此牌点数的牌。', + dcchangqu:'长驱', + dcchangqu_info:'出牌阶段限一次。你可以开一艘战舰(你从你的上家或下家开始选择任意名座位连续的其他角色,且起点角色获得“战舰”标记)。这些角色按照你选择的顺序依次执行:{若其有本次获得的“战舰”,其选择一项:1.交给你X张手牌,然后将“战舰”移动给你选择的下一名目标角色;2.令其下次受到的属性伤害值+X,然后横置(X为本次〖长驱〗中选项一被选择过的次数且至少为1)。}。', + dctongye:'统业', + dctongye_info:'锁定技。游戏开始时或一名角色死亡后,若场上势力数:不大于4,你的手牌上限+3;不大于3,你的攻击范围+3;不大于2,你使用【杀】的次数上限+3;不大于1,你摸牌阶段额定摸牌数+3。', sp2_yinyu:'隐山之玉', sp2_huben:'百战虎贲', diff --git a/character/yijiang.js b/character/yijiang.js index 20b7a55b4..fd8a98932 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -8804,6 +8804,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, mingjian:{ + audio:2, + audioname:['re_caorui'], enable:'phaseUse', usable:1, filterTarget:function(card,player,target){ @@ -8916,6 +8918,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, huituo:{ audio:2, + audioname:['re_caorui'], trigger:{player:'damageEnd'}, direct:true, content:function(){ @@ -9174,27 +9177,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', filter:function(event,player){ - return player.countCards('h','sha')>0; - }, - filterCard:{name:'sha'}, - prepare:function(cards,player){ - player.$throw(cards,1000); - game.log(player,'将',cards,'置入了弃牌堆'); + return player.hasCard(card=>lib.skill.yanyu.filterCard(card,player),'h'); }, + filterCard:(card,player)=>get.name(card)=='sha'&&player.canRecast(card), discard:false, - loseTo:'discardPile', - visible:true, - delay:0.5, + lose:false, + delay:false, content:function(){ - player.draw(); + player.recast(cards); }, ai:{ basic:{ order:1 }, result:{ - player:1, - }, + player:1 + } }, group:'yanyu2' }, @@ -13592,13 +13590,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xunyou:['re_xunyou','xunyou'], xuezong:['tw_xuezong','xuezong'], huanghao:['huanghao','dc_huanghao','old_huanghao'], - caorui:['caorui','old_caorui'], + caorui:['re_caorui','caorui','old_caorui'], sunziliufang:['dc_sunziliufang','sunziliufang'], liyan:['liyan','old_liyan'], zhangsong:['re_zhangsong','zhangsong'], }, translate:{ - old_huaxiong:'华雄', + old_huaxiong:'将华雄', + old_huaxiong_ab:'华雄', yufan:'虞翻', xushu:'旧徐庶', caozhi:'曹植', @@ -13658,7 +13657,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xin_yujin:'节钺于禁', xin_liru:'李儒', guohuanghou:'郭皇后', - liuyu:'刘虞', + liuyu:'OL刘虞', sundeng:'孙登', liyan:'李严', sunziliufang:'孙资刘放', diff --git a/character/yingbian.js b/character/yingbian.js index 62ad0489b..c9660b7be 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -682,17 +682,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ position:'he', content:function(){ 'step 0' - player.loseToDiscardpile(cards); - player.draw(); + player.recast(cards); 'step 1' if(target.countCards('he')>0){ - target.chooseCard('he',true,'请重铸一张牌'); + target.chooseCard('he',true,'请重铸一张牌',lib.filter.cardRecastable); } else event.finish(); 'step 2' if(result.bool){ - target.loseToDiscardpile(result.cards); - target.draw(); + target.recast(result.cards); } }, ai:{ @@ -1615,9 +1613,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ var target=trigger.player; - target.addTempSkill('yifa2'); + target.addTempSkill('yifa2',{player:'phaseEnd'}); target.addMark('yifa2',1,false); }, + ai:{threaten:0.8}, }, yifa2:{ charlotte:true, @@ -3616,7 +3615,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xijue_xiaoguo:'骁果', xijue_xiaoguo_info:'其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌,然后你摸一张牌;2.受到你对其造成的1点伤害。', xijue_xiaoguo_info_guozhan:'其他角色的结束阶段开始时,你可以弃置一张基本牌,令该角色选择一项:1.弃置一张装备牌;2.受到你对其造成的1点伤害。', - duyu:'杜预', + duyu:'OL杜预', sanchen:'三陈', sanchen_info:'出牌阶段限一次。你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且〖三陈〗于此阶段内使用次数上限+1。', sanchen_info_guozhan:'出牌阶段,你可选择一名本回合内未选择过的角色。其摸三张牌,然后弃置三张牌。若其未以此法弃置牌或以此法弃置的牌的类别均不相同,则其摸一张牌且你获得技能〖破竹〗直到回合结束。否则你本阶段内不能再发动〖三陈〗。', @@ -3721,7 +3720,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ bolan_info:'①出牌阶段开始时,你可从三个描述中带有“出牌阶段限一次”的技能中选择一个,令当前回合角色获得直至此阶段结束。②其他角色出牌阶段限一次,其可以失去1点体力,令你发动一次〖博览①〗。', yifa:'仪法', yifa2:'仪法', - yifa_info:'锁定技,其他角色使用【杀】或黑色普通锦囊牌指定你为目标后,其手牌上限-1直到回合结束。', + yifa_info:'锁定技,其他角色使用【杀】或黑色普通锦囊牌指定你为目标后,其手牌上限-1直到其回合结束。', ol_huaxin:'OL华歆', caozhao:'草诏', caozhao_backup:'草诏', @@ -3755,7 +3754,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qimei_info:'准备阶段,你可以选择一名其他角色。你获得如下效果直到下回合开始:①每回合限一次,当你或其获得牌/失去手牌后,若你与其手牌数相等,则另一名角色摸一张牌。②每回合限一次,当你或其的体力值变化后,若你与其体力值相等,则另一名角色摸一张牌。', ybzhuiji:'追姬', ybzhuiji_info:'出牌阶段开始时,你可选择一项:①摸两张牌,并于出牌阶段结束时失去1点体力;②回复1点体力,并于出牌阶段结束时弃置两张牌。', - jin_yanghu:'羊祜', + jin_yanghu:'OL羊祜', huaiyuan:'怀远', huaiyuanx:'绥', huaiyuan_info:'①游戏开始时,你将你的手牌标记为“绥”。②当你失去一张“绥”后,你令一名角色执行一项:⒈其的手牌上限+1。⒉其的攻击范围+1。⒊其摸一张牌。③当你死亡时,你可令一名其他角色的手牌上限+X,且攻击范围+Y(X和Y为你自己被执行过〖怀远②〗的选项一和选项二的次数)。', diff --git a/font/huangcao.ttf b/font/huangcao.ttf index 67e0d49a6..8f08e021d 100644 Binary files a/font/huangcao.ttf and b/font/huangcao.ttf differ diff --git a/font/shousha.ttf b/font/shousha.ttf index e99ecbb39..fe8ea1b0a 100644 Binary files a/font/shousha.ttf and b/font/shousha.ttf differ diff --git a/font/suits.ttf b/font/suits.ttf index dd15c8f52..b87937b60 100644 Binary files a/font/suits.ttf and b/font/suits.ttf differ diff --git a/font/xinwei.ttf b/font/xinwei.ttf index afe13f425..013ca4b25 100644 Binary files a/font/xinwei.ttf and b/font/xinwei.ttf differ diff --git a/font/yuanli.ttf b/font/yuanli.ttf index c806ec5eb..bca33e79e 100644 Binary files a/font/yuanli.ttf and b/font/yuanli.ttf differ diff --git a/game/asset.js b/game/asset.js index 3d172541b..e221a310e 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.9.125', + 'v1.9.125.1', 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', 'audio/background/aozhan_rewrite.mp3', @@ -234,6 +234,7 @@ window.noname_asset_list=[ 'audio/die/clan_hanrong.mp3', 'audio/die/clan_hanshao.mp3', 'audio/die/clan_wangling.mp3', + 'audio/die/clan_wangyun.mp3', 'audio/die/clan_wuban.mp3', 'audio/die/clan_wuxian.mp3', 'audio/die/clan_xuncai.mp3', @@ -251,9 +252,11 @@ window.noname_asset_list=[ 'audio/die/dc_caozhi.mp3', 'audio/die/dc_chenqun.mp3', 'audio/die/dc_dengzhi.mp3', + 'audio/die/dc_duyu.mp3', 'audio/die/dc_gaolan.mp3', 'audio/die/dc_gongsunzan.mp3', 'audio/die/dc_huangchengyan.mp3', + 'audio/die/dc_huanghao.mp3', 'audio/die/dc_huangquan.mp3', 'audio/die/dc_huangzu.mp3', 'audio/die/dc_huban.mp3', @@ -275,6 +278,7 @@ window.noname_asset_list=[ 'audio/die/dc_sunziliufang.mp3', 'audio/die/dc_tengfanglan.mp3', 'audio/die/dc_wangchang.mp3', + 'audio/die/dc_wangjun.mp3', 'audio/die/dc_wangyun.mp3', 'audio/die/dc_xushu.mp3', 'audio/die/dc_yangbiao.mp3', @@ -388,6 +392,7 @@ window.noname_asset_list=[ 'audio/die/hanmeng.mp3', 'audio/die/hansui.mp3', 'audio/die/haomeng.mp3', + 'audio/die/haopu.mp3', 'audio/die/haozhao.mp3', 'audio/die/hejin.mp3', 'audio/die/heqi.mp3', @@ -439,8 +444,16 @@ window.noname_asset_list=[ 'audio/die/jsp_huangyueying.mp3', 'audio/die/kanze.mp3', 'audio/die/kebineng.mp3', + 'audio/die/key_abyusa.mp3', + 'audio/die/key_hinata.mp3', + 'audio/die/key_hisako.mp3', + 'audio/die/key_noda.mp3', 'audio/die/key_saya.mp3', + 'audio/die/key_shiina.mp3', 'audio/die/key_shiki.mp3', + 'audio/die/key_shiorimiyuki.mp3', + 'audio/die/key_yui.mp3', + 'audio/die/key_yuri.mp3', 'audio/die/kongrong.mp3', 'audio/die/kuailiangkuaiyue.mp3', 'audio/die/laiyinger.mp3', @@ -568,6 +581,7 @@ window.noname_asset_list=[ 'audio/die/ol_yuanshao.mp3', 'audio/die/ol_yujin.mp3', 'audio/die/ol_zhangyì.mp3', + 'audio/die/ol_zhouqun.mp3', 'audio/die/ol_zhujun.mp3', 'audio/die/ol_zhuling.mp3', 'audio/die/ol_zhurong.mp3', @@ -829,6 +843,7 @@ window.noname_asset_list=[ 'audio/die/sp_jiangwan.mp3', 'audio/die/sp_jiangwei.mp3', 'audio/die/sp_jiaxu.mp3', + 'audio/die/sp_key_kanade.mp3', 'audio/die/sp_kongrong.mp3', 'audio/die/sp_lvfan.mp3', 'audio/die/sp_maojie.mp3', @@ -874,6 +889,7 @@ window.noname_asset_list=[ 'audio/die/sunjian.mp3', 'audio/die/sunlang.mp3', 'audio/die/sunliang.mp3', + 'audio/die/sunlingluan.mp3', 'audio/die/sunluban.mp3', 'audio/die/sunluyu.mp3', 'audio/die/sunqian.mp3', @@ -1100,6 +1116,7 @@ window.noname_asset_list=[ 'audio/die/yuantanyuanshang.mp3', 'audio/die/yuantanyuanxiyuanshang.mp3', 'audio/die/yue_caiwenji.mp3', + 'audio/die/yuechen.mp3', 'audio/die/yuejin.mp3', 'audio/die/yuejiu.mp3', 'audio/die/yufan.mp3', @@ -1164,6 +1181,7 @@ window.noname_asset_list=[ 'audio/die/zhongshiji.mp3', 'audio/die/zhongyan.mp3', 'audio/die/zhongyao.mp3', + 'audio/die/zhoubuyi.mp3', 'audio/die/zhoucang.mp3', 'audio/die/zhouchu.mp3', 'audio/die/zhoufang.mp3', @@ -1234,6 +1252,10 @@ window.noname_asset_list=[ 'audio/effect/tori_no_uta.mp3', 'audio/effect/win.mp3', + 'audio/skill/abyusa_dunying1.mp3', + 'audio/skill/abyusa_dunying2.mp3', + 'audio/skill/abyusa_jueqing1.mp3', + 'audio/skill/abyusa_jueqing2.mp3', 'audio/skill/aichen1.mp3', 'audio/skill/aichen2.mp3', 'audio/skill/anguo1.mp3', @@ -1559,12 +1581,16 @@ window.noname_asset_list=[ 'audio/skill/clanhuanjia2.mp3', 'audio/skill/clanhuanyin1.mp3', 'audio/skill/clanhuanyin2.mp3', + 'audio/skill/clanjiexuan1.mp3', + 'audio/skill/clanjiexuan2.mp3', 'audio/skill/clanlianhe1.mp3', 'audio/skill/clanlianhe2.mp3', 'audio/skill/clanlieshi1.mp3', 'audio/skill/clanlieshi2.mp3', 'audio/skill/clanliuju1.mp3', 'audio/skill/clanliuju2.mp3', + 'audio/skill/clanmingjie1.mp3', + 'audio/skill/clanmingjie2.mp3', 'audio/skill/clanmuyin_clan_wuban1.mp3', 'audio/skill/clanmuyin_clan_wuban2.mp3', 'audio/skill/clanmuyin_clan_wuxian1.mp3', @@ -1591,6 +1617,8 @@ window.noname_asset_list=[ 'audio/skill/clanzhanding2.mp3', 'audio/skill/clanzhongliu_clan_wangling1.mp3', 'audio/skill/clanzhongliu_clan_wangling2.mp3', + 'audio/skill/clanzhongliu_clan_wangyun1.mp3', + 'audio/skill/clanzhongliu_clan_wangyun2.mp3', 'audio/skill/congjian1.mp3', 'audio/skill/congjian2.mp3', 'audio/skill/cslilu1.mp3', @@ -1672,6 +1700,8 @@ window.noname_asset_list=[ 'audio/skill/dccansi2.mp3', 'audio/skill/dcchaixie1.mp3', 'audio/skill/dcchaixie2.mp3', + 'audio/skill/dcchangqu1.mp3', + 'audio/skill/dcchangqu2.mp3', 'audio/skill/dcchanjuan1.mp3', 'audio/skill/dcchanjuan2.mp3', 'audio/skill/dcchenyong1.mp3', @@ -1694,6 +1724,8 @@ window.noname_asset_list=[ 'audio/skill/dccuijin2.mp3', 'audio/skill/dccuixin1.mp3', 'audio/skill/dccuixin2.mp3', + 'audio/skill/dccunwei1.mp3', + 'audio/skill/dccunwei2.mp3', 'audio/skill/dcdanyi1.mp3', 'audio/skill/dcdanyi2.mp3', 'audio/skill/dcdanying1.mp3', @@ -1706,6 +1738,8 @@ window.noname_asset_list=[ 'audio/skill/dcditing2.mp3', 'audio/skill/dcdouzhen1.mp3', 'audio/skill/dcdouzhen2.mp3', + 'audio/skill/dcdyqingshi1.mp3', + 'audio/skill/dcdyqingshi2.mp3', 'audio/skill/dcenyu1.mp3', 'audio/skill/dcenyu2.mp3', 'audio/skill/dcfangdu1.mp3', @@ -1730,6 +1764,8 @@ window.noname_asset_list=[ 'audio/skill/dcfuxue2.mp3', 'audio/skill/dcgeyuan1.mp3', 'audio/skill/dcgeyuan2.mp3', + 'audio/skill/dcgonghu1.mp3', + 'audio/skill/dcgonghu2.mp3', 'audio/skill/dcguangshi1.mp3', 'audio/skill/dcguangshi2.mp3', 'audio/skill/dcgue1.mp3', @@ -1750,6 +1786,8 @@ window.noname_asset_list=[ 'audio/skill/dchuishu2.mp3', 'audio/skill/dchuizhi1.mp3', 'audio/skill/dchuizhi2.mp3', + 'audio/skill/dcjianguo1.mp3', + 'audio/skill/dcjianguo2.mp3', 'audio/skill/dcjianji1.mp3', 'audio/skill/dcjianji2.mp3', 'audio/skill/dcjianying1.mp3', @@ -1808,6 +1846,8 @@ window.noname_asset_list=[ 'audio/skill/dclingfang2.mp3', 'audio/skill/dclingyin1.mp3', 'audio/skill/dclingyin2.mp3', + 'audio/skill/dclingyue1.mp3', + 'audio/skill/dclingyue2.mp3', 'audio/skill/dcliuzhuan_gain1.mp3', 'audio/skill/dcliuzhuan_gain2.mp3', 'audio/skill/dcliuzhuan1.mp3', @@ -1838,6 +1878,8 @@ window.noname_asset_list=[ 'audio/skill/dcnutao2.mp3', 'audio/skill/dcnutao3.mp3', 'audio/skill/dcnutao4.mp3', + 'audio/skill/dcpandi1.mp3', + 'audio/skill/dcpandi2.mp3', 'audio/skill/dcpeiqi1.mp3', 'audio/skill/dcpeiqi2.mp3', 'audio/skill/dcpijing1.mp3', @@ -1846,6 +1888,8 @@ window.noname_asset_list=[ 'audio/skill/dcpingxi2.mp3', 'audio/skill/dcpitian1.mp3', 'audio/skill/dcpitian2.mp3', + 'audio/skill/dcporui1.mp3', + 'audio/skill/dcporui2.mp3', 'audio/skill/dcpoyuan1.mp3', 'audio/skill/dcpoyuan2.mp3', 'audio/skill/dcqiangzhi1.mp3', @@ -1864,6 +1908,8 @@ window.noname_asset_list=[ 'audio/skill/dcqingshi2.mp3', 'audio/skill/dcqingyan1.mp3', 'audio/skill/dcqingyan2.mp3', + 'audio/skill/dcqinqing1.mp3', + 'audio/skill/dcqinqing2.mp3', 'audio/skill/dcqinshen1.mp3', 'audio/skill/dcqinshen2.mp3', 'audio/skill/dcquanjian1.mp3', @@ -1878,6 +1924,8 @@ window.noname_asset_list=[ 'audio/skill/dcsaowei2.mp3', 'audio/skill/dcshibei1.mp3', 'audio/skill/dcshibei2.mp3', + 'audio/skill/dcshiji1.mp3', + 'audio/skill/dcshiji2.mp3', 'audio/skill/dcshilie1.mp3', 'audio/skill/dcshilie2.mp3', 'audio/skill/dcshixian1.mp3', @@ -1896,6 +1944,8 @@ window.noname_asset_list=[ 'audio/skill/dcshuhe2.mp3', 'audio/skill/dcsigong1.mp3', 'audio/skill/dcsigong2.mp3', + 'audio/skill/dcsilun1.mp3', + 'audio/skill/dcsilun2.mp3', 'audio/skill/dcsilve1.mp3', 'audio/skill/dcsilve2.mp3', 'audio/skill/dcsitian1.mp3', @@ -1915,6 +1965,8 @@ window.noname_asset_list=[ 'audio/skill/dctongliao1.mp3', 'audio/skill/dctongliao2.mp3', 'audio/skill/dctongliao3.mp3', + 'audio/skill/dctongye1.mp3', + 'audio/skill/dctongye2.mp3', 'audio/skill/dctujue1.mp3', 'audio/skill/dctujue2.mp3', 'audio/skill/dctuoyu1.mp3', @@ -2465,6 +2517,12 @@ window.noname_asset_list=[ 'audio/skill/heqia2.mp3', 'audio/skill/hfjieying1.mp3', 'audio/skill/hfjieying2.mp3', + 'audio/skill/hinata_ehou1.mp3', + 'audio/skill/hinata_ehou2.mp3', + 'audio/skill/hinata_qiulve1.mp3', + 'audio/skill/hinata_qiulve2.mp3', + 'audio/skill/hisako_yinbao1.mp3', + 'audio/skill/hisako_yinbao2.mp3', 'audio/skill/hmxili1.mp3', 'audio/skill/hmxili2.mp3', 'audio/skill/hongde1.mp3', @@ -2521,6 +2579,8 @@ window.noname_asset_list=[ 'audio/skill/huimin2.mp3', 'audio/skill/huirong1.mp3', 'audio/skill/huirong2.mp3', + 'audio/skill/huisheng_dc_huanghao1.mp3', + 'audio/skill/huisheng_dc_huanghao2.mp3', 'audio/skill/huisheng1.mp3', 'audio/skill/huisheng2.mp3', 'audio/skill/huishi1.mp3', @@ -2798,6 +2858,11 @@ window.noname_asset_list=[ 'audio/skill/jyzongshi2.mp3', 'audio/skill/kaikang1.mp3', 'audio/skill/kaikang2.mp3', + 'audio/skill/kanade_benzhan1.mp3', + 'audio/skill/kanade_benzhan2.mp3', + 'audio/skill/kanade_benzhan3.mp3', + 'audio/skill/kanade_mapo1.mp3', + 'audio/skill/kanade_mapo2.mp3', 'audio/skill/kangge1.mp3', 'audio/skill/kangge2.mp3', 'audio/skill/kanpo1.mp3', @@ -3136,6 +3201,10 @@ window.noname_asset_list=[ 'audio/skill/nifu2.mp3', 'audio/skill/niluan1.mp3', 'audio/skill/niluan2.mp3', + 'audio/skill/noda_fengcheng1.mp3', + 'audio/skill/noda_fengcheng2.mp3', + 'audio/skill/noda_xunxin1.mp3', + 'audio/skill/noda_xunxin2.mp3', 'audio/skill/ns_nsshimeng1.mp3', 'audio/skill/ns_nsshimeng2.mp3', 'audio/skill/nzry_binglve1.mp3', @@ -3211,6 +3280,8 @@ window.noname_asset_list=[ 'audio/skill/olbixin2.mp3', 'audio/skill/olchenglie1.mp3', 'audio/skill/olchenglie2.mp3', + 'audio/skill/olchenshuo1.mp3', + 'audio/skill/olchenshuo2.mp3', 'audio/skill/olchuanwu1.mp3', 'audio/skill/olchuanwu2.mp3', 'audio/skill/olcuipo1.mp3', @@ -3307,6 +3378,12 @@ window.noname_asset_list=[ 'audio/skill/olshuangxiong2.mp3', 'audio/skill/olsujian1.mp3', 'audio/skill/olsujian2.mp3', + 'audio/skill/oltianhou_club.mp3', + 'audio/skill/oltianhou_diamond.mp3', + 'audio/skill/oltianhou_heart.mp3', + 'audio/skill/oltianhou_spade.mp3', + 'audio/skill/oltianhou1.mp3', + 'audio/skill/oltianhou2.mp3', 'audio/skill/oltongduo1.mp3', 'audio/skill/oltongduo2.mp3', 'audio/skill/oltuntian1.mp3', @@ -3336,6 +3413,8 @@ window.noname_asset_list=[ 'audio/skill/olzenrun2.mp3', 'audio/skill/olzeyue1.mp3', 'audio/skill/olzeyue2.mp3', + 'audio/skill/olzhenying1.mp3', + 'audio/skill/olzhenying2.mp3', 'audio/skill/olzhiba1.mp3', 'audio/skill/olzhiba2.mp3', 'audio/skill/olzhiji1.mp3', @@ -4198,8 +4277,15 @@ window.noname_asset_list=[ 'audio/skill/shifei_re_guotufengji2.mp3', 'audio/skill/shifei1.mp3', 'audio/skill/shifei2.mp3', + 'audio/skill/shiina_feiyan1.mp3', + 'audio/skill/shiina_qingshen1.mp3', + 'audio/skill/shiina_retieji1.mp3', 'audio/skill/shiki_omusubi1.mp3', 'audio/skill/shiki_omusubi2.mp3', + 'audio/skill/shiorimiyuki_banyin1.mp3', + 'audio/skill/shiorimiyuki_banyin2.mp3', + 'audio/skill/shiorimiyuki_tingxian1.mp3', + 'audio/skill/shiorimiyuki_tingxian2.mp3', 'audio/skill/shiren1.mp3', 'audio/skill/shiren2.mp3', 'audio/skill/shixin1.mp3', @@ -4357,6 +4443,8 @@ window.noname_asset_list=[ 'audio/skill/spxiaoni2.mp3', 'audio/skill/spxizhan1.mp3', 'audio/skill/spxizhan2.mp3', + 'audio/skill/spxizhan3.mp3', + 'audio/skill/spxizhan4.mp3', 'audio/skill/spyajun1.mp3', 'audio/skill/spyajun2.mp3', 'audio/skill/spyanji1.mp3', @@ -4493,6 +4581,7 @@ window.noname_asset_list=[ 'audio/skill/tongyuan2.mp3', 'audio/skill/tspowei1.mp3', 'audio/skill/tspowei2.mp3', + 'audio/skill/tspowei3.mp3', 'audio/skill/tsumugi_mugyu1.mp3', 'audio/skill/tsumugi_mugyu2.mp3', 'audio/skill/tsumugi_mugyu3.mp3', @@ -5434,12 +5523,23 @@ window.noname_asset_list=[ 'audio/skill/yuheng2.mp3', 'audio/skill/yuhua1.mp3', 'audio/skill/yuhua2.mp3', + 'audio/skill/yui_jiang1.mp3', + 'audio/skill/yui_jiang2.mp3', + 'audio/skill/yui_lieyin1.mp3', + 'audio/skill/yui_lieyin2.mp3', + 'audio/skill/yui_takaramono1.mp3', + 'audio/skill/yui_takaramono2.mp3', 'audio/skill/yujue1.mp3', 'audio/skill/yujue2.mp3', 'audio/skill/yuqi1.mp3', 'audio/skill/yuqi2.mp3', + 'audio/skill/yuri_wangxi1.mp3', + 'audio/skill/yuri_wangxi2.mp3', + 'audio/skill/yuri_xingdong_gain1.mp3', + 'audio/skill/yuri_xingdong_gain2.mp3', 'audio/skill/yuri_xingdong1.mp3', 'audio/skill/yuri_xingdong2.mp3', + 'audio/skill/yuri_xingdong3.mp3', 'audio/skill/yusui1.mp3', 'audio/skill/yusui2.mp3', 'audio/skill/yuxu1.mp3', @@ -5741,29 +5841,34 @@ window.noname_asset_list=[ 'font/xingkai.ttf', 'font/xinwei.ttf', 'font/yuanli.ttf', + + 'image/background/beipan_bg.jpg', + 'image/background/heaven_bg.jpg', 'image/background/huangtian_bg.jpg', 'image/background/key_bg.jpg', 'image/background/kyoani_bg.jpg', - 'image/background/planetarian_bg.jpg', - 'image/background/ol_bg.jpg', - 'image/background/heaven_bg.jpg', + 'image/background/lanting_bg.jpg', + 'image/background/lingju_bg.jpg', 'image/background/noname_bg.jpg', - 'image/background/wuming_bg.jpg', + 'image/background/ol_bg.jpg', + 'image/background/oltianhou_club_bg.jpg', + 'image/background/oltianhou_diamond_bg.jpg', + 'image/background/oltianhou_heart_bg.jpg', + 'image/background/oltianhou_spade_bg.jpg', + 'image/background/planetarian_bg.jpg', + 'image/background/sanying_bg.jpg', 'image/background/september_bg.jpg', 'image/background/shengshi_bg.jpg', 'image/background/taoyuan_bg.jpg', + 'image/background/wangshi_bg.jpg', + 'image/background/wuming_bg.jpg', + 'image/background/xiaowu_bg.jpg', + 'image/background/xinsha_bg.jpg', + 'image/background/xiongxin_bg.jpg', 'image/background/yinxiang_bg.jpg', 'image/background/zhanhuo_bg.jpg', - 'image/background/zhulin_bg.jpg', - 'image/background/beipan_bg.jpg', - 'image/background/lanting_bg.jpg', - 'image/background/lingju_bg.jpg', - 'image/background/sanying_bg.jpg', - 'image/background/wangshi_bg.jpg', - 'image/background/xiongxin_bg.jpg', 'image/background/zhanyun_bg.jpg', - 'image/background/xinsha_bg.jpg', - 'image/background/xiaowu_bg.jpg', + 'image/background/zhulin_bg.jpg', 'image/card/bagua.png', 'image/card/baihupifeng.png', @@ -6295,6 +6400,7 @@ window.noname_asset_list=[ 'image/character/db_wenyang.jpg', 'image/character/dc_bulianshi.jpg', 'image/character/dc_caiyang.jpg', + 'image/character/dc_caocao.jpg', 'image/character/dc_caozhi.jpg', 'image/character/dc_chenqun.jpg', 'image/character/dc_duyu.jpg', @@ -6314,6 +6420,7 @@ window.noname_asset_list=[ 'image/character/dc_jsp_guanyu.jpg', 'image/character/dc_liru.jpg', 'image/character/dc_liuba.jpg', + 'image/character/dc_liubei.jpg', 'image/character/dc_liuye.jpg', 'image/character/dc_liuyu.jpg', 'image/character/dc_luotong.jpg', @@ -6323,6 +6430,7 @@ window.noname_asset_list=[ 'image/character/dc_ruiji.jpg', 'image/character/dc_sp_jiaxu.jpg', 'image/character/dc_sunhanhua.jpg', + 'image/character/dc_sunquan.jpg', 'image/character/dc_sunru.jpg', 'image/character/dc_sunziliufang.jpg', 'image/character/dc_tengfanglan.jpg', @@ -6779,20 +6887,31 @@ window.noname_asset_list=[ 'image/character/jsp_liubei.jpg', 'image/character/jsp_zhaoyun.jpg', 'image/character/jsrg_caocao.jpg', + 'image/character/jsrg_chendeng.jpg', + 'image/character/jsrg_chunyuqiong.jpg', 'image/character/jsrg_dongbai.jpg', + 'image/character/jsrg_guanyu.jpg', 'image/character/jsrg_hejin.jpg', 'image/character/jsrg_huangfusong.jpg', 'image/character/jsrg_kongrong.jpg', 'image/character/jsrg_liubei.jpg', 'image/character/jsrg_liuhong.jpg', 'image/character/jsrg_liuyan.jpg', + 'image/character/jsrg_lvbu.jpg', 'image/character/jsrg_nanhualaoxian.jpg', 'image/character/jsrg_qiaoxuan.jpg', + 'image/character/jsrg_sunce.jpg', 'image/character/jsrg_sunjian.jpg', 'image/character/jsrg_wangyun.jpg', + 'image/character/jsrg_xugong.jpg', 'image/character/jsrg_xushao.jpg', + 'image/character/jsrg_xuyou.jpg', 'image/character/jsrg_yangbiao.jpg', + 'image/character/jsrg_zhanghe.jpg', + 'image/character/jsrg_zhangliao.jpg', + 'image/character/jsrg_zhenji.jpg', 'image/character/jsrg_zhujun.jpg', + 'image/character/jsrg_zoushi.jpg', 'image/character/jun_caocao.jpg', 'image/character/jun_liubei.jpg', 'image/character/jun_sunquan.jpg', @@ -7099,6 +7218,7 @@ window.noname_asset_list=[ 'image/character/ol_zhangrang.jpg', 'image/character/ol_zhangyì.jpg', 'image/character/ol_zhangzhang.jpg', + 'image/character/ol_zhouqun.jpg', 'image/character/ol_zhujun.jpg', 'image/character/ol_zhuling.jpg', 'image/character/ol_zhuran.jpg', @@ -7598,6 +7718,7 @@ window.noname_asset_list=[ 'image/character/sunjian.jpg', 'image/character/sunlang.jpg', 'image/character/sunliang.jpg', + 'image/character/sunlingluan.jpg', 'image/character/sunluban.jpg', 'image/character/sunluyu.jpg', 'image/character/sunqian.jpg', @@ -7967,6 +8088,7 @@ window.noname_asset_list=[ 'image/character/yuantanyuanshang.jpg', 'image/character/yuantanyuanxiyuanshang.jpg', 'image/character/yue_caiwenji.jpg', + 'image/character/yuechen.jpg', 'image/character/yuejin.jpg', 'image/character/yuejiu.jpg', 'image/character/yufan.jpg', @@ -8071,6 +8193,7 @@ window.noname_asset_list=[ 'image/character/zhonghui.jpg', 'image/character/zhongyan.jpg', 'image/character/zhongyao.jpg', + 'image/character/zhoubuyi.jpg', 'image/character/zhoucang.jpg', 'image/character/zhouchu.jpg', 'image/character/zhoufang.jpg', diff --git a/game/config.js b/game/config.js index 4e6d978b5..7294dc11a 100644 --- a/game/config.js +++ b/game/config.js @@ -20,7 +20,7 @@ window.config={ zhinang_tricks:['guohe','wuxie','wuzhong','dongzhuxianji'], connect_zhinang_tricks:['guohe','wuxie','wuzhong','dongzhuxianji'], all:{ - sgscharacters:['standard','shenhua','xinghuoliaoyuan','refresh','yijiang','sp','sp2','xianding','huicui','extra','old','mobile','shiji','tw','yingbian','offline','sb','clan','collab'], + sgscharacters:['standard','shenhua','xinghuoliaoyuan','refresh','yijiang','sp','sp2','xianding','huicui','extra','old','mobile','shiji','tw','yingbian','offline','jsrg','sb','clan','collab'], sgscards:['standard','extra','sp','guozhan','zhulu','yingbian','yongjian'], sgsmodes:['identity','guozhan','versus','doudizhu','single','brawl','connect'], stockmode:['identity','guozhan','versus','boss','doudizhu','single','chess','stone','connect','brawl','tafang'], @@ -133,7 +133,7 @@ window.config={ sort:'type_sort', cards:['standard','extra'], - characters:['standard','shenhua','sp','sp2','yijiang','refresh','xinghuoliaoyuan','mobile','extra','yingbian','sb','tw','offline','clan','collab','xianding','huicui','shiji'], + characters:['standard','shenhua','sp','sp2','yijiang','refresh','xinghuoliaoyuan','mobile','extra','yingbian','sb','tw','offline','clan','collab','xianding','huicui','shiji','jsrg'], connect_characters:['diy'], connect_cards:['huanlekapai','guozhan','sp','zhulu','yingbian','yongjian'], plays:[], diff --git a/game/game.js b/game/game.js index a693edc93..7ffcdf8fb 100644 --- a/game/game.js +++ b/game/game.js @@ -52,6 +52,7 @@ custom:[], useCard:[], changeHp:[], + everything:[], }], cardtag:{ yingbian_zhuzhan:[], @@ -1294,46 +1295,9 @@ } } } - var animate=lib.config.image_background=='default'; game.saveConfig('image_background',background); lib.init.background(); - ui.background.delete(); - ui.background=ui.create.div('.background'); - - if(lib.config.image_background_blur){ - ui.background.style.filter='blur(8px)'; - ui.background.style.webkitFilter='blur(8px)'; - ui.background.style.transform='scale(1.05)'; - } - else{ - ui.background.style.filter=''; - ui.background.style.webkitFilter=''; - ui.background.style.transform=''; - } - - document.body.insertBefore(ui.background,document.body.firstChild); - if(animate) ui.background.animate('start'); - if(lib.config.image_background=='default'){ - ui.background.style.backgroundImage="none"; - } - else if(lib.config.image_background.indexOf('custom_')==0){ - ui.background.style.backgroundImage="none"; - game.getDB('image',lib.config.image_background,function(fileToLoad){ - if(!fileToLoad) return; - var fileReader = new FileReader(); - fileReader.onload = function(fileLoadedEvent) - { - var data = fileLoadedEvent.target.result; - ui.background.style.backgroundImage='url('+data+')'; - }; - fileReader.readAsDataURL(fileToLoad, "UTF-8"); - }); - } - else{ - ui.background.setBackgroundImage('image/background/'+lib.config.image_background+'.jpg'); - } - ui.background.style.backgroundSize='cover'; - ui.background.style.backgroundPosition='50% 50%'; + game.updateBackground(); }, }, image_background_random:{ @@ -7449,16 +7413,39 @@ return false; } }); - } + } + if(!('flat' in Array.prototype)){ + Object.defineProperty(Array.prototype, "flat", { + configurable:true, + enumerable:false, + writable:true, + value:function(depth){ + if(typeof depth!='number') depth=1; + const arr=[]; + for(let i=0;i0&&Array.isArray(obj)){ + obj.flat(depth-1).forEach(function(item){ + arr.push(item) + }); + } + else{ + arr.push(obj); + } + } + return arr; + } + }); + } if(!Array.from){ Object.defineProperty(Array, "from", { configurable:true, enumerable:false, writable:true, value:function(args){ - var list=[]; + const list=[]; if(args&&args.length){ - for(var i=0;i{ + 'step 0' + game.log(player,'重铸了',cards); + if(typeof event.recastingLose=='function') event.recastingLostCards=event.recastingLose(player,cards); + 'step 1' + event.trigger('recast'); + 'step 2' + if(typeof event.recastingGain!='function') return; + event.recastingGainedCards=event.recastingGain(player,cards); + if(get.itemtype(event.recastingGainedCards)=='card') event.recastingGainedCards=[event.recastingGainedCards]; + 'step 3' + event.result=[]; + if(get.itemtype(event.recastingGainedCards)=='cards') event.result.addArray(event.recastingGainedCards); + if(get.itemtype(result.cards)=='card') event.result.push(result.cards); + else if(get.itemtype(result.cards)=='cards') event.result.addArray(result.cards); + if(get.itemtype(result)=='card') event.result.push(result); + else if(get.itemtype(result)=='cards') event.result.addArray(result); + }, //装备栏相关 disableEquip:function(){ 'step 0' @@ -10892,13 +10901,13 @@ var next=game.createEvent('replaceEquip'); next.player=player; next.card=card; - next.setContent(info.replaceEquip||'replaceEquip') + next.setContent(info.replaceEquip||'replaceEquip'); "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; if(info.loseThrow){ - player.$throw(current); + player.$throw(result,1000); } event.swapped=true; } @@ -11181,7 +11190,10 @@ game.resume(); _status.imchoosing=false; if(roundmenu) ui.roundmenu.style.display=''; - if(ui.backgroundMusic) ui.backgroundMusic.play().catch(()=>void 0); + if(ui.backgroundMusic){ + var promise=ui.backgroundMusic.play(); + if(promise) promise.catch(()=>void 0); + } hitsound_audio.remove(); },1000); }; @@ -11370,7 +11382,10 @@ if(dialog){ dialog.close(); } - if(ui.backgroundMusic) ui.backgroundMusic.play().catch(()=>void 0); + if(ui.backgroundMusic){ + var promise=ui.backgroundMusic.play(); + if(promise) promise.catch(()=>void 0); + } },event.videoId,event.time); var result=event.result||result; event.result=result; @@ -11839,9 +11854,12 @@ }, cardsDiscard:function(){ game.getGlobalHistory().cardMove.push(event); + var withPile=false; for(var i=0;i6){ @@ -16752,7 +16776,7 @@ }, loseToDiscardpile:function(){ "step 0" - game.log(player,'将',cards,'置入了弃牌堆'); + if(event.log!=false) game.log(player,'将',cards,'置入了弃牌堆'); event.done=player.lose(cards,event.position,'visible'); event.done.type='loseToDiscardpile'; "step 1" @@ -17191,7 +17215,7 @@ } if(event.animate=='draw'){ player.$draw(cards.length); - game.log(player,'将',get.cnNumber(cards.length),'张牌置于了武将牌上'); + if(event.log) game.log(player,'将',get.cnNumber(cards.length),'张牌置于了武将牌上'); game.pause(); setTimeout(function(){ player.$addToExpansion(cards,null,event.gaintag); @@ -17225,8 +17249,8 @@ if(event.animate=='give'){ for(var i in evtmap){ var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; - source.$give(evtmap[i][0],player); - game.log(player,'将',get.cnNumber(evtmap[i][0]),'置于了武将牌上'); + source.$give(evtmap[i][0],player,false); + if(event.log) game.log(player,'将',evtmap[i][0],'置于了武将牌上'); } } else{ @@ -17234,11 +17258,11 @@ var source=(_status.connectMode?lib.playerOL:game.playerMap)[i]; if(evtmap[i][1].length){ source.$giveAuto(evtmap[i][1],player,false); - game.log(player,'将',get.cnNumber(evtmap[i][1].length),'张牌置于了武将牌上'); + if(event.log) game.log(player,'将',get.cnNumber(evtmap[i][1].length),'张牌置于了武将牌上'); } if(evtmap[i][2].length){ source.$give(evtmap[i][2],player,false); - game.log(player,'将',get.cnNumber(evtmap[i][2]),'置于了武将牌上'); + if(event.log) game.log(player,'将',evtmap[i][2],'置于了武将牌上'); } } } @@ -17263,9 +17287,6 @@ for(var i of event.gaintag) player.markSkill(i); event.finish(); } - if(event.log){ - game.log(player,'将',cards,'置于了武将牌上'); - } "step 4" game.delayx(); if(event.updatePile) game.updateRoundNumber(); @@ -18253,6 +18274,31 @@ }, player:{ //新函数 + //Recast + //重铸 + recast:function(cards,recastingLose,recastingGain){ + const recast=game.createEvent('recast'); + recast.player=this; + if(get.itemtype(cards)=='card') recast.cards=[cards]; + else if(get.itemtype(cards)=='cards'&&cards.length) recast.cards=cards; + else _status.event.next.remove(recast); + if(typeof recastingLose!='function') recastingLose=(player,cards)=>player.loseToDiscardpile(cards).set("log",false).cards; + recast.recastingLose=recastingLose; + if(typeof recastingGain!='function') recastingGain=(player,cards)=>player.draw(cards.length).log=false; + recast.recastingGain=recastingGain; + recast.setContent('recast'); + recast._args=Array.from(arguments); + return recast; + }, + //Check if the player can recast the card + //检查角色是否能重铸此牌 + canRecast:function(card,source,strict){ + const cardRecastable=lib.filter.cardRecastable(card,this,source,strict); + if(cardRecastable!='unchanged') return cardRecastable; + if(get.position(card)!='h') return false; + const info=get.info(card); + return typeof info.chongzhu=='function'?info.chongzhu(_status.event,this):info.chongzhu; + }, //装备栏相关 //判断一名角色的某个区域是否被废除 //type为要判断的区域 若为空 则判断玩家是否有任意一个被废除的区域 @@ -18562,7 +18608,7 @@ return this.hasDisabledSlot(arg)&&!this.hasEnabledSlot(arg); }, isEmpty:function(num){ - return this.countEnabledSlot(num)>this.getEquips(num); + return this.countEnabledSlot(num)>this.getEquips(num).length; }, //以下函数将被废弃 $disableEquip:function(){}, @@ -19060,11 +19106,15 @@ inRangeOf:function(source){ return source.inRange(this); }, - getHp:function(){ - return Math.max(0,this.hp); + //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){ + return raw?this.hp:Math.max(0,this.hp); }, - getDamagedHp:function(){ - return this.maxHp-this.getHp(); + //Set “raw” to true to get the player's raw damaged HP instead. + //设置“raw”为true以获取角色已损失的体力。 + getDamagedHp:function(raw){ + return this.maxHp-this.getHp(raw); }, changeGroup:function(group,log,broadcast){ var next=game.createEvent('changeGroup'); @@ -24845,109 +24895,61 @@ return this.hp=this.maxHp||this.storage.nohp; }, - isMaxHp:function(equal){ - for(var i=0;i=this.hp) return false; - } - else{ - if(game.players[i].hp>this.hp) return false; - } - } - return true; + isMaxHp:function(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(equal){ - var nh=this.countCards('he'); - for(var i=0;i=nh) return false; - } - else{ - if(game.players[i].countCards('he')>nh) return false; - } - } - return true; + isMaxCard:function(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(equal){ - var nh=this.countCards('h'); - for(var i=0;i=nh) return false; - } - else{ - if(game.players[i].countCards('h')>nh) return false; - } - } - return true; + isMaxHandcard:function(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(equal){ - var nh=this.countCards('e'); - for(var i=0;i=nh) return false; - } - else{ - if(game.players[i].countCards('e')>nh) return false; - } - } - return true; + isMaxEquip:function(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(){ if(get.is.linked2(this)){ @@ -25142,9 +25144,8 @@ if(name&&typeof name=='object'){ name=name.viewAs||name.name; } - var judges=this.node.judges.childNodes; + var judges=this.getCards('j'); for(var i=0;i{ + if(typeof player=='undefined') player=get.owner(card); + return game.checkMod(card,player,source,!raw||'unchanged','cardRecastable',player); + }, //装备栏相关 canBeReplaced:function(card,player){ var mod=game.checkMod(card,player,'unchanged','canBeReplaced',player); @@ -28486,19 +28484,19 @@ if(player==undefined) player=_status.event.player; if(!player) return false; if(get.itemtype(card)=='card'){ - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); + var mod2=game.checkMod(card,player,event,'unchanged','cardEnabled2',player); if(mod2!='unchanged') return mod2; } card=get.autoViewAs(card,null,player); if(event==='forceEnable'){ - var mod=game.checkMod(card,player,'unchanged','cardEnabled',player); + var mod=game.checkMod(card,player,event,'unchanged','cardEnabled',player); if(mod!='unchanged') return mod; return true; } else{ var filter=get.info(card).enable; if(!filter) return; - var mod=game.checkMod(card,player,'unchanged','cardEnabled',player); + var mod=game.checkMod(card,player,event,'unchanged','cardEnabled',player); if(mod!='unchanged') return mod; if(typeof filter=='boolean') return filter; if(typeof filter=='function') return filter(card,player,event); @@ -28515,7 +28513,7 @@ } if(player==undefined) player=_status.event.player; if(get.itemtype(card)=='card'){ - var mod2=game.checkMod(card,player,'unchanged','cardEnabled2',player); + var mod2=game.checkMod(card,player,event,'unchanged','cardEnabled2',player); if(mod2!='unchanged') return mod2; } var mod=game.checkMod(card,player,'unchanged','cardRespondable',player); @@ -28534,7 +28532,7 @@ } var num=info.usable; if(typeof num=='function') num=num(card,player); - num=game.checkMod(card,player,num,'cardUsable',player); + num=game.checkMod(card,player,num,event,'cardUsable',player); if(typeof num!='number') return true; else return(player.countUsed(card)player.hasCard(card=>lib.skill._chongzhu.filterCard(card,player),'he'), + position:'he', + filterCard:(card,player)=>player.canRecast(card,null,true), discard:false, - loseTo:'discardPile', - delay:0.5, + lose:false, + delay:false, content:function(){ - "step 0" - if(lib.config.mode=='stone'&&_status.mode=='deck'&& - !player.isMin()&&get.type(cards[0]).indexOf('stone')==0){ - var list=get.stonecard(1,player.career); - if(list.length){ - player.gain(game.createCard(list.randomGet()),'draw'); - } - else{ - player.draw({drawDeck:1}) - } - } - else if(get.subtype(cards[0])=='spell_gold'){ - var list=get.libCard(function(info){ - return info.subtype=='spell_silver'; + player.recast(cards,null,(player,cards)=>{ + var numberOfCardsToDraw=cards.length, cardsToGain=[]; + cards.forEach(value=>{ + if(lib.config.mode=='stone'&&_status.mode=='deck'&&!player.isMin()&&get.type(value).indexOf('stone')==0){ + var stonecard=get.stonecard(1,player.career); + if(stonecard.length){ + numberOfCardsToDraw-=stonecard.length; + var card=game.createCard(stonecard.randomGet()); + player.gain(card,'draw'); + cardsToGain.push(card); + } + else player.draw({ + drawDeck:1 + }).log=false; + } + else if(get.subtype(value)=='spell_gold'){ + var libCard=get.libCard(info=>info.subtype=='spell_silver'); + if(!libCard.length) return; + numberOfCardsToDraw--; + var card=game.createCard(libCard.randomGet()); + player.gain(card,'draw'); + cardsToGain.push(card); + } + else if(get.subtype(value)=='spell_silver'){ + var libCard=get.libCard(info=>info.subtype=='spell_bronze'); + if(!libCard.length) return; + numberOfCardsToDraw--; + var card=game.createCard(libCard.randomGet()); + player.gain(card,'draw'); + cardsToGain.push(card); + } }); - if(list.length){ - player.gain(game.createCard(list.randomGet()),'draw'); - } - else{ - player.draw(); - } - } - else if(get.subtype(cards[0])=='spell_silver'){ - var list=get.libCard(function(info){ - return info.subtype=='spell_bronze'; - }); - if(list.length){ - player.gain(game.createCard(list.randomGet()),'draw'); - } - else{ - player.draw(); - } - } - else{ - player.draw(); - } + if(numberOfCardsToDraw) player.draw(numberOfCardsToDraw).log=false; + return cardsToGain; + }); }, ai:{ basic:{ order:6 }, result:{ - player:1, - }, + player:1 + } } }, _lianhuan:{ @@ -31198,6 +31173,46 @@ ], }; var game={ + updateBackground:function(){ + var background=(_status.tempBackground||lib.config.image_background); + ui.background.delete(); + ui.background=ui.create.div('.background'); + + if(lib.config.image_background_blur){ + ui.background.style.filter='blur(8px)'; + ui.background.style.webkitFilter='blur(8px)'; + ui.background.style.transform='scale(1.05)'; + } + else{ + ui.background.style.filter=''; + ui.background.style.webkitFilter=''; + ui.background.style.transform=''; + } + + document.body.insertBefore(ui.background,document.body.firstChild); + if(background=='default'){ + ui.background.animate('start'); + ui.background.style.backgroundImage="none"; + } + else if(background.indexOf('custom_')==0){ + ui.background.style.backgroundImage="none"; + game.getDB('image',background,function(fileToLoad){ + if(!fileToLoad) return; + var fileReader = new FileReader(); + fileReader.onload = function(fileLoadedEvent) + { + var data = fileLoadedEvent.target.result; + ui.background.style.backgroundImage='url('+data+')'; + }; + fileReader.readAsDataURL(fileToLoad, "UTF-8"); + }); + } + else{ + ui.background.setBackgroundImage('image/background/'+background+'.jpg'); + } + ui.background.style.backgroundSize='cover'; + ui.background.style.backgroundPosition='50% 50%'; + }, generateBeatmapTimeleap:(bpm,beats,offset)=>beats.map(value=>Math.round(value*60000/bpm+(offset||0))), updateRenku:function(){ game.broadcast(function(renku){ @@ -35736,6 +35751,7 @@ else{ next.parent=event; _status.event=next; + game.getGlobalHistory('everything').push(next); } } else if(event.finished){ @@ -37614,7 +37630,7 @@ if(card.ai.basic.equipValue==undefined) card.ai.basic.equipValue=1; } if(card.ai.basic.value==undefined) card.ai.basic.value=function(card,player,index,method){ - if(!player.canEquip(card)) return 0.01; + if(!player.getCards('e').contains(card)&&!player.canEquip(card,true)) return 0.01; var value=0; var info=get.info(card); var current=player.getEquip(info.subtype); @@ -37660,6 +37676,9 @@ } skills=skills.concat(lib.skill.global); game.expandSkills(skills); + skills.sort(function(a,b){ + return get.priority(a)-get.priority(b); + }); var arg=[],i,info; for(i=0;i{ + if(!Array.isArray(list)) list=[]; + if(typeof func!='function') func=lib.filter.all; + return list.addArray(game.players.filter(value=>(includeOut||!value.isOut())&&func(value))); }, - filterPlayer2:function(func,list,includeOut){ - if(!Array.isArray(list)){ - list=[]; - } - if(typeof func!='function'){ - func=lib.filter.all; - } - var players=game.players.slice(0).concat(game.dead); - for(var i=0;i{ + if(!Array.isArray(list)) list=[]; + if(typeof func!='function') func=lib.filter.all; + return list.addArray(game.players.concat(game.dead).filter(value=>(includeOut||!value.isOut())&&func(value))); }, findPlayer:function(func,includeOut){ for(var i=0;i
    ',node), + turnedover:ui.create.div('.turned','
    '+get.verticalStr('翻面')+'
    ',node), framebg:ui.create.div('.framebg',node), intro:ui.create.div('.intro',node), identity:ui.create.div('.identity',node), @@ -52784,6 +52786,21 @@ }, }; var get={ + //优先度判断 + priority:function(skill){ + var info=get.info(skill),priority=0; + if(!info) return 0; + if(info.priority){ + priority=info.priority*100; + } + if(info.silent){ + priority++; + } + if(info.equipSkill) priority-=25; + if(info.cardSkill) priority-=50; + if(info.ruleSkill) priority-=75; + return priority; + }, //新装备栏相关 //获取一张装备牌实际占用的装备栏(君曹操六龙) //用法同get.subtype,返回数组 @@ -52954,7 +52971,7 @@ return false; }, double:function(name,array){ - if(!lib.character[name]||!lib.character[name][4]||name.indexOf('gz_')!=0&&name.indexOf('db_')!=0) return false; + if(!lib.character[name]||!lib.character[name][4]||name.indexOf('gz_')!=0&&name.indexOf('db_')!=0&&name.indexOf('jsrg_')!=0) return false; for(var i of lib.character[name][4]){ if(i.indexOf('doublegroup:')==0){ if(!array) return true; @@ -54352,6 +54369,9 @@ else if(str2.indexOf('手杀')==0){ str2=str2.slice(2); } + else if(str2.indexOf('新杀')==0){ + str2=str2.slice(2); + } else if(str2.indexOf('界')==0&&lib.characterPack.refresh&&lib.characterPack.refresh[str]){ str2=str2.slice(1); } @@ -54385,6 +54405,9 @@ else if(str2.indexOf('手杀')==0){ str2=str2.slice(2); } + else if(str2.indexOf('新杀')==0){ + str2=str2.slice(2); + } return str2; }, slimName:function(str){ @@ -54409,6 +54432,9 @@ else if(str2.indexOf('手杀')==0){ str2=str2.slice(2); } + else if(str2.indexOf('新杀')==0){ + str2=str2.slice(2); + } return get.verticalStr(str2,true); }, time:function(){ @@ -55659,7 +55685,7 @@ } } else if(lib.skill[skills[i]].nobracket){ - uiintro.add('
    '+get.translation(skills[i])+'
    '+lib.translate[skills[i]+'_info']+'
    '); + uiintro.add('
    '+get.translation(skills[i])+'
    '+get.skillInfoTranslation(skills[i],node)+'
    '); } else{ uiintro.add('
    【'+translation+'】
    '+get.skillInfoTranslation(skills[i],node)+'
    '); diff --git a/game/package.js b/game/package.js index 1fc6467fe..959fd63c8 100644 --- a/game/package.js +++ b/game/package.js @@ -18,6 +18,7 @@ window.noname_package={ tw:'外服武将', collab:'联动卡', offline:'线下武将', + jsrg:'江山如故', old:'怀旧', diy:'DIY', ddd:'3D精选', diff --git a/game/source.js b/game/source.js index ee8c1aa01..1d4724e86 100644 --- a/game/source.js +++ b/game/source.js @@ -25,6 +25,7 @@ window.noname_source_list=[ 'character/hearth.js', 'character/huicui.js', 'character/jiange.js', + 'character/jsrg.js', 'character/mobile.js', 'character/mtg.js', 'character/offline.js', diff --git a/game/update.js b/game/update.js index ca8deb2b4..4e620584b 100644 --- a/game/update.js +++ b/game/update.js @@ -1,44 +1,45 @@ window.noname_update={ - version:'1.9.125', - update:'1.9.124.0.1', + version:'1.9.125.1', + update:'1.9.125', changeLog:[ - '整合@Tipx-L @copcap @shijian @lieren2023 @mengxinzxz的Pull Request', - '神典韦,以及配套的一系列“额外装备栏”机制', - 'OL文钦、族王浑;十周年杜预、郤正', - '孙寒华新谱面+AI操作可跳过', + '整合@Tipx-L @copcap @mengxinzxz的Pull Request', + '《江山如故·承》扩展包、重铸类技能代码重写', + 'OL周群、孙翎鸾、周不疑;斗地主曹操、刘备、孙权', + '乐綝、孙狼、庞会、韩遂、唐咨、十常侍、手杀蒋干技能调整', 'bug修复', ], files:[ //'LICENSE', - 'card/extra.js', + //'card/extra.js', //'card/gujian.js', 'card/guozhan.js', //'card/gwent.js', //'card/huanlekapai.js', - //'card/mtg.js', - 'card/sp.js', - 'card/standard.js', + 'card/mtg.js', + //'card/sp.js', + //'card/standard.js', //'card/swd.js', //'card/yunchou.js', - //'card/yingbian.js', + 'card/yingbian.js', 'card/yongjian.js', //'card/zhenfa.js', - 'card/zhulu.js', + //'card/zhulu.js', 'character/clan.js', 'character/collab.js', 'character/ddd.js', 'character/diy.js', 'character/extra.js', //'character/gujian.js', - //'character/gwent.js', - //'character/hearth.js', + 'character/gwent.js', + 'character/hearth.js', 'character/huicui.js', + 'character/jsrg.js', 'character/mobile.js', //'character/mtg.js', 'character/offline.js', 'character/old.js', //'character/ow.js', - //'character/rank.js', + 'character/rank.js', 'character/refresh.js', 'character/sb.js', 'character/shenhua.js', @@ -48,14 +49,15 @@ window.noname_update={ 'character/standard.js', 'character/tw.js', //'character/swd.js', + 'character/xiake.js', 'character/xianding.js', //'character/xianjian.js', - 'character/xinghuoliaoyuan.js', + //'character/xinghuoliaoyuan.js', 'character/yijiang.js', 'character/yingbian.js', //'character/yxs.js', //'extension/boss/extension.js', - //'font/suits.ttf', + 'font/suits.ttf', 'layout/default/layout.css', //'layout/default/menu.css', //'layout/long2/layout.css', @@ -63,7 +65,7 @@ window.noname_update={ //'layout/mobile/layout.css', //'layout/newlayout/global.css', //'layout/nova/layout.css', - 'mode/boss.js', + //'mode/boss.js', //'mode/brawl.js', //'mode/chess.js', //'mode/connect.js', @@ -73,15 +75,15 @@ window.noname_update={ //'mode/single.js', //'mode/stone.js', //'mode/tafang.js', - 'mode/versus.js', + //'mode/versus.js', 'game/game.js', //'game/keyWords.js', //'game/NoSleep.js', - //'game/config.js', - //'game/package.js', + 'game/config.js', + 'game/package.js', //'game/pinyinjs.js', //'game/asset.js', - //'game/source.js', + 'game/source.js', 'theme/simple/style.css', //'theme/style/hp/custom.css', //'theme/style/hp/emotion.css', diff --git a/image/background/oltianhou_club_bg.jpg b/image/background/oltianhou_club_bg.jpg new file mode 100644 index 000000000..dfa0215f2 Binary files /dev/null and b/image/background/oltianhou_club_bg.jpg differ diff --git a/image/background/oltianhou_diamond_bg.jpg b/image/background/oltianhou_diamond_bg.jpg new file mode 100644 index 000000000..70cd19843 Binary files /dev/null and b/image/background/oltianhou_diamond_bg.jpg differ diff --git a/image/background/oltianhou_heart_bg.jpg b/image/background/oltianhou_heart_bg.jpg new file mode 100644 index 000000000..cbe260c4f Binary files /dev/null and b/image/background/oltianhou_heart_bg.jpg differ diff --git a/image/background/oltianhou_spade_bg.jpg b/image/background/oltianhou_spade_bg.jpg new file mode 100644 index 000000000..a838c6645 Binary files /dev/null and b/image/background/oltianhou_spade_bg.jpg differ diff --git a/image/character/dc_caocao.jpg b/image/character/dc_caocao.jpg new file mode 100644 index 000000000..028abb235 Binary files /dev/null and b/image/character/dc_caocao.jpg differ diff --git a/image/character/dc_liubei.jpg b/image/character/dc_liubei.jpg new file mode 100644 index 000000000..ffa854739 Binary files /dev/null and b/image/character/dc_liubei.jpg differ diff --git a/image/character/dc_sunquan.jpg b/image/character/dc_sunquan.jpg new file mode 100644 index 000000000..aefd1bb05 Binary files /dev/null and b/image/character/dc_sunquan.jpg differ diff --git a/image/character/dc_wangjun.jpg b/image/character/dc_wangjun.jpg index c03b7580a..c3e6a517b 100644 Binary files a/image/character/dc_wangjun.jpg and b/image/character/dc_wangjun.jpg differ diff --git a/image/character/jsrg_chendeng.jpg b/image/character/jsrg_chendeng.jpg new file mode 100644 index 000000000..ee824b632 Binary files /dev/null and b/image/character/jsrg_chendeng.jpg differ diff --git a/image/character/jsrg_chunyuqiong.jpg b/image/character/jsrg_chunyuqiong.jpg new file mode 100644 index 000000000..d497a3774 Binary files /dev/null and b/image/character/jsrg_chunyuqiong.jpg differ diff --git a/image/character/jsrg_guanyu.jpg b/image/character/jsrg_guanyu.jpg new file mode 100644 index 000000000..7d6198a46 Binary files /dev/null and b/image/character/jsrg_guanyu.jpg differ diff --git a/image/character/jsrg_lvbu.jpg b/image/character/jsrg_lvbu.jpg new file mode 100644 index 000000000..f4f0a1268 Binary files /dev/null and b/image/character/jsrg_lvbu.jpg differ diff --git a/image/character/jsrg_sunce.jpg b/image/character/jsrg_sunce.jpg new file mode 100644 index 000000000..6e88a4742 Binary files /dev/null and b/image/character/jsrg_sunce.jpg differ diff --git a/image/character/jsrg_xugong.jpg b/image/character/jsrg_xugong.jpg new file mode 100644 index 000000000..ec5335338 Binary files /dev/null and b/image/character/jsrg_xugong.jpg differ diff --git a/image/character/jsrg_xuyou.jpg b/image/character/jsrg_xuyou.jpg new file mode 100644 index 000000000..33e0ac497 Binary files /dev/null and b/image/character/jsrg_xuyou.jpg differ diff --git a/image/character/jsrg_zhanghe.jpg b/image/character/jsrg_zhanghe.jpg new file mode 100644 index 000000000..9922b1c95 Binary files /dev/null and b/image/character/jsrg_zhanghe.jpg differ diff --git a/image/character/jsrg_zhangliao.jpg b/image/character/jsrg_zhangliao.jpg new file mode 100644 index 000000000..e5aca1767 Binary files /dev/null and b/image/character/jsrg_zhangliao.jpg differ diff --git a/image/character/jsrg_zhenji.jpg b/image/character/jsrg_zhenji.jpg new file mode 100644 index 000000000..6b7c498c9 Binary files /dev/null and b/image/character/jsrg_zhenji.jpg differ diff --git a/image/character/jsrg_zoushi.jpg b/image/character/jsrg_zoushi.jpg new file mode 100644 index 000000000..6552f7a7d Binary files /dev/null and b/image/character/jsrg_zoushi.jpg differ diff --git a/image/character/ol_zhouqun.jpg b/image/character/ol_zhouqun.jpg new file mode 100644 index 000000000..b8fe1b477 Binary files /dev/null and b/image/character/ol_zhouqun.jpg differ diff --git a/image/character/sunlingluan.jpg b/image/character/sunlingluan.jpg new file mode 100644 index 000000000..b6e380d33 Binary files /dev/null and b/image/character/sunlingluan.jpg differ diff --git a/image/character/yuechen.jpg b/image/character/yuechen.jpg new file mode 100644 index 000000000..505f82dc0 Binary files /dev/null and b/image/character/yuechen.jpg differ diff --git a/image/character/zhoubuyi.jpg b/image/character/zhoubuyi.jpg new file mode 100644 index 000000000..233cb2a85 Binary files /dev/null and b/image/character/zhoubuyi.jpg differ diff --git a/layout/default/layout.css b/layout/default/layout.css index 6c4b8acc0..1058dd83c 100644 --- a/layout/default/layout.css +++ b/layout/default/layout.css @@ -1741,8 +1741,8 @@ div:not(.handcards)>.card>.info>span, position: relative; margin-top: 8px; margin-bottom: 8px; - margin-left: 4px; - margin-right: 4px; + margin-left: auto; + margin-right: auto; } .content>.caption + .buttons:not(*:last-child){ margin-top: 0; @@ -2239,9 +2239,8 @@ div:not(.handcards)>.card>.info>span, text-shadow: none; } .player>.turned>div{ - top:calc(50% - 50px); - width: 100%; - left: 0; + top: calc(50% - 50px); + left: calc(50% - 25px); white-space: nowrap; writing-mode: vertical-rl; -webkit-writing-mode: vertical-rl; diff --git a/mode/guozhan.js b/mode/guozhan.js index 2bf7b1aab..d022a86b3 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -6457,7 +6457,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ cardEnabled2:function(card){ if(get.position(card)=='h') return false; }, - cardChongzhuable:function(card){ + cardRecastable:function(card){ if(get.position(card)=='h') return false; }, }, @@ -16050,7 +16050,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ name2=name2.slice(name2.indexOf('_')+1); } } - var list=Object.keys(lib.perfectPair).concat(Object.values(lib.perfectPair)).flat(Infinity); + var list=Object.keys(lib.perfectPair).concat(Object.values(lib.perfectPair)).flat(); if(!list.contains(name1)||!list.contains(name2)) return false; return (lib.perfectPair[name1]&&lib.perfectPair[name1].flat(Infinity).contains(name2))||(lib.perfectPair[name2]&&lib.perfectPair[name2].flat(Infinity).contains(name1)); }, diff --git a/theme/simple/style.css b/theme/simple/style.css index 7d8d4f100..5e6dfc79a 100644 --- a/theme/simple/style.css +++ b/theme/simple/style.css @@ -144,6 +144,7 @@ html{ } .player .marks>div:first-child>div{ + filter: invert(0.8) sepia(1); -webkit-filter: invert(0.8) sepia(1); } @@ -201,6 +202,7 @@ html{ transition-property: transform; transition-duration: 0s; background-size: cover; + filter: blur(3px); -webkit-filter: blur(3px); } .popup-container>.prompt-container>div>div{