diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..d8a6ed938 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,11 @@ + +root = true + +[*] +charset = utf-8 +end_of_line = crlf +insert_final_newline = true + +[*.js] +indent_style = tab +indent_size = 4 diff --git a/.eslintrc.json b/.eslintrc.json index 88229aedd..f0d2bdc86 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,15 +1,31 @@ { - "extends": "chrome 46", - "env": { - "browser": true, - "node": true, - "es6": true, - "worker": true - }, - "rules": { - "no-console": 0, - "no-unused-vars": 0, - "no-undef": 0, - "no-redeclare": 0 - } + "extends": "eslint:recommended", + "env": { + "browser": true, + "node": true, + "es6": true, + "worker": true + }, + "rules": { + "no-console": 0, + "no-unused-vars": 0, + "no-undef": 0, + "no-redeclare": 0, + "require-yield": 0, + "no-irregular-whitespace": [ + "error", + { + "skipStrings": true, + "skipTemplates": true + } + ], + "no-constant-condition": [ + "error", + { + "checkLoops": false + } + ] /* , + "comma-dangle": ["error", "only-multiline"], + "complexity": ["error",100] */ + } } \ No newline at end of file diff --git a/.gitignore b/.gitignore index ccd888ae8..576ce9437 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ .Trashes ehthumbs.db Thumbs.db -localStorage.json \ No newline at end of file +localStorage.json +.vscode +.idea diff --git a/README.md b/README.md index 9ca0dd34c..a6a416cab 100644 --- a/README.md +++ b/README.md @@ -4,10 +4,24 @@ https://spmario233.github.io/noname/index.html (图片素材加载速度较慢 客户端下载戳这里: -GitHub: https://github.com/libccy/noname/releases/tag/SSS +GitHub: https://github.com/libccy/noname/releases/tag/chromium77-client -Coding: https://nakamurayuri.coding.net/p/noname/d/noname/git/releases/SSS +网页端推荐使用Chrome系内核浏览器游玩,不推荐使用低版本Firefox浏览器 -网页端推荐使用Chrome系内核浏览器游玩,不推荐使用Firefox浏览器 +请尽量保证游玩的Chrome系浏览器或手机Webview的`内核版本大于等于77` 提交Pull Request时请推送到"PR-Branch"分支! + +--- + +最近有一伙人号称是《无名杀十周年》的开发团队,宣称《无名杀十周年》“全新无名杀,比旧版拥有更多武将,兼容更多扩展”,实际上: + +- 《无名杀十周年》(原《无名杀清瑶版》)由无名杀v1.9.124修改而来,属于无名杀的一种**Fork**,并非“全新无名杀”;且《无名杀十周年》开发团队**公然违反GPL-3.0协议**,详情请看[这里](https://github.com/github/dmca/blob/master/2023/09/2023-09-20-noname.md)、[这里](https://tieba.baidu.com/p/8623890806)以及[这里](https://tieba.baidu.com/p/8624582238)。 +- 《无名杀十周年》至今没有更新神典韦等新机制武将,且删除了部分无名杀的原创武将,导致《无名杀十周年》的武将数量远远不及无名杀前几个版本的武将数量;不仅如此,《无名杀十周年》自分裂后的部分武将源码依然来自无名杀和其他开发者开源的代码。 +- 《无名杀十周年》兼容扩展的方式是不更新本体数据,从而导致《无名杀十周年》仍然在用1.9.124版本的代码,无法兼容使用1.10以后功能的扩展;而且《无名杀十周年》开发团队在使用**大量**GPL-3.0开源的代码后对生成产物进行了**混淆加密**,在**违反开源精神**的同时,也导致扩展稳定性极具下降,更容易出问题。 + +《无名杀十周年》就是彻头彻尾的骗局,《无名杀十周年》的开发团队更是一群拿无名杀吸血的骗子,虽然号称“不忘初心”,却公然对最有资格论述无名杀创作初心的无名杀创始人进行侮辱谩骂,直接违背其制定的规则和开源精神,恶劣程度远超当初在多个无名杀社群“自立”的水叶之流。 + +先秦介子推曾言:“窃人之财,犹谓之盗,况贪天之功以为己力乎。”无名杀社区发展至今,正是因为有大量的开源代码进行参考,才能不断推陈出新。试想每个扩展开发者在成为一个扩展开发者之前,谁敢说没有大量参考社区内的源码?每个作品凝聚的都是大家的心血,而不是仅仅归属于个别人。我们相信:开放、共享、多元才是无名杀的初心,绝不是封闭、私藏与趋同。 + +我们在此呼吁无名杀社区正确认识《无名杀十周年》开发团队的一些行为与做法,并希望《无名杀十周年》开发团队能反省迄今以来的所作所为。**自由开源**是无名杀社区的灵魂,希望各方都能够遵循这一精神。 diff --git a/audio/die/bianfuren.mp3 b/audio/die/bianfuren.mp3 index 997fb0e30..5eee2acc1 100644 Binary files a/audio/die/bianfuren.mp3 and b/audio/die/bianfuren.mp3 differ diff --git a/audio/die/boss_lvbu1.mp3 b/audio/die/boss_lvbu1.mp3 index 9e375c495..e33533f5c 100644 Binary files a/audio/die/boss_lvbu1.mp3 and b/audio/die/boss_lvbu1.mp3 differ diff --git a/audio/die/boss_lvbu2.mp3 b/audio/die/boss_lvbu2.mp3 index 86667689e..e33533f5c 100644 Binary files a/audio/die/boss_lvbu2.mp3 and b/audio/die/boss_lvbu2.mp3 differ diff --git a/audio/die/boss_lvbu3.mp3 b/audio/die/boss_lvbu3.mp3 new file mode 100644 index 000000000..378fc2dd0 Binary files /dev/null and b/audio/die/boss_lvbu3.mp3 differ diff --git a/audio/die/caojie.mp3 b/audio/die/caojie.mp3 index 99627c2e9..7a4286c92 100644 Binary files a/audio/die/caojie.mp3 and b/audio/die/caojie.mp3 differ diff --git a/audio/die/chengjichengcui.mp3 b/audio/die/chengjichengcui.mp3 new file mode 100644 index 000000000..727435bd0 Binary files /dev/null and b/audio/die/chengjichengcui.mp3 differ diff --git a/audio/die/chenshi.mp3 b/audio/die/chenshi.mp3 new file mode 100644 index 000000000..25723de47 Binary files /dev/null and b/audio/die/chenshi.mp3 differ diff --git a/audio/die/clan_xunyou.mp3 b/audio/die/clan_xunyou.mp3 new file mode 100644 index 000000000..ece1d4b01 Binary files /dev/null and b/audio/die/clan_xunyou.mp3 differ diff --git a/audio/die/clan_zhongyu.mp3 b/audio/die/clan_zhongyu.mp3 new file mode 100644 index 000000000..2db8de1cc Binary files /dev/null and b/audio/die/clan_zhongyu.mp3 differ diff --git a/audio/die/dc_dongzhao.mp3 b/audio/die/dc_dongzhao.mp3 new file mode 100644 index 000000000..fe3091a24 Binary files /dev/null and b/audio/die/dc_dongzhao.mp3 differ diff --git a/audio/die/dc_jiachong.mp3 b/audio/die/dc_jiachong.mp3 new file mode 100644 index 000000000..aab2c8e92 Binary files /dev/null and b/audio/die/dc_jiachong.mp3 differ diff --git a/audio/die/dc_wuban.mp3 b/audio/die/dc_wuban.mp3 new file mode 100644 index 000000000..89d3aa9ea Binary files /dev/null and b/audio/die/dc_wuban.mp3 differ diff --git a/audio/die/dianwei.mp3 b/audio/die/dianwei.mp3 index 5b4a712e8..4786c1cde 100644 Binary files a/audio/die/dianwei.mp3 and b/audio/die/dianwei.mp3 differ diff --git a/audio/die/jsp_caoren.mp3 b/audio/die/jsp_caoren.mp3 new file mode 100644 index 000000000..23073eb03 Binary files /dev/null and b/audio/die/jsp_caoren.mp3 differ diff --git a/audio/die/kuaiqi.mp3 b/audio/die/kuaiqi.mp3 new file mode 100644 index 000000000..bc1795bfa Binary files /dev/null and b/audio/die/kuaiqi.mp3 differ diff --git a/audio/die/malingli.mp3 b/audio/die/malingli.mp3 new file mode 100644 index 000000000..1ee310d7d Binary files /dev/null and b/audio/die/malingli.mp3 differ diff --git a/audio/die/mb_xianglang.mp3 b/audio/die/mb_xianglang.mp3 new file mode 100644 index 000000000..82356340f Binary files /dev/null and b/audio/die/mb_xianglang.mp3 differ diff --git a/audio/die/nezha.mp3 b/audio/die/nezha.mp3 new file mode 100644 index 000000000..6489f3ed6 Binary files /dev/null and b/audio/die/nezha.mp3 differ diff --git a/audio/die/ol_qianzhao.mp3 b/audio/die/ol_qianzhao.mp3 new file mode 100644 index 000000000..4ec4a04c8 Binary files /dev/null and b/audio/die/ol_qianzhao.mp3 differ diff --git a/audio/die/pangtong.mp3 b/audio/die/pangtong.mp3 index 0e00bf743..0380afc74 100644 Binary files a/audio/die/pangtong.mp3 and b/audio/die/pangtong.mp3 differ diff --git a/audio/die/re_huaxiong.mp3 b/audio/die/re_huaxiong.mp3 index 1a76a4ac0..431f69b7a 100644 Binary files a/audio/die/re_huaxiong.mp3 and b/audio/die/re_huaxiong.mp3 differ diff --git a/audio/die/sb_huangyueying.mp3 b/audio/die/sb_huangyueying.mp3 new file mode 100644 index 000000000..adc2bd3e9 Binary files /dev/null and b/audio/die/sb_huangyueying.mp3 differ diff --git a/audio/die/sb_sp_zhugeliang.mp3 b/audio/die/sb_sp_zhugeliang.mp3 new file mode 100644 index 000000000..617bc8557 Binary files /dev/null and b/audio/die/sb_sp_zhugeliang.mp3 differ diff --git a/audio/die/sb_zhugeliang.mp3 b/audio/die/sb_zhugeliang.mp3 new file mode 100644 index 000000000..2704bbb03 Binary files /dev/null and b/audio/die/sb_zhugeliang.mp3 differ diff --git a/audio/die/shen_guanyu.mp3 b/audio/die/shen_guanyu.mp3 index 76bbde019..425c3389a 100644 Binary files a/audio/die/shen_guanyu.mp3 and b/audio/die/shen_guanyu.mp3 differ diff --git a/audio/die/shen_huatuo.mp3 b/audio/die/shen_huatuo.mp3 new file mode 100644 index 000000000..7ef623d09 Binary files /dev/null and b/audio/die/shen_huatuo.mp3 differ diff --git a/audio/die/sp_caoren.mp3 b/audio/die/sp_caoren.mp3 index 2f7c75a00..e782e9cc8 100644 Binary files a/audio/die/sp_caoren.mp3 and b/audio/die/sp_caoren.mp3 differ diff --git a/audio/die/sp_machao.mp3 b/audio/die/sp_machao.mp3 new file mode 100644 index 000000000..1cf900b66 Binary files /dev/null and b/audio/die/sp_machao.mp3 differ diff --git a/audio/die/star_caoren.mp3 b/audio/die/star_caoren.mp3 new file mode 100644 index 000000000..8321eaee4 Binary files /dev/null and b/audio/die/star_caoren.mp3 differ diff --git a/audio/die/star_yuanshu.mp3 b/audio/die/star_yuanshu.mp3 new file mode 100644 index 000000000..96b97f6e5 Binary files /dev/null and b/audio/die/star_yuanshu.mp3 differ diff --git a/audio/die/sunhuan.mp3 b/audio/die/sunhuan.mp3 new file mode 100644 index 000000000..5ef463e4e Binary files /dev/null and b/audio/die/sunhuan.mp3 differ diff --git a/audio/die/sunyu.mp3 b/audio/die/sunyu.mp3 new file mode 100644 index 000000000..cee5ed52d Binary files /dev/null and b/audio/die/sunyu.mp3 differ diff --git a/audio/die/taishici.mp3 b/audio/die/taishici.mp3 index ce5a3db1f..68b51f778 100644 Binary files a/audio/die/taishici.mp3 and b/audio/die/taishici.mp3 differ diff --git a/audio/die/wuxian.mp3 b/audio/die/wuxian.mp3 index eea4d68d8..05e80d223 100644 Binary files a/audio/die/wuxian.mp3 and b/audio/die/wuxian.mp3 differ diff --git a/audio/die/xin_fazheng.mp3 b/audio/die/xin_fazheng.mp3 new file mode 100644 index 000000000..e6443765e Binary files /dev/null and b/audio/die/xin_fazheng.mp3 differ diff --git a/audio/die/xin_xushu.mp3 b/audio/die/xin_xushu.mp3 new file mode 100644 index 000000000..88ee4a4b0 Binary files /dev/null and b/audio/die/xin_xushu.mp3 differ diff --git a/audio/die/xinxianying.mp3 b/audio/die/xinxianying.mp3 index 8d0ec0e6c..ee71b1445 100644 Binary files a/audio/die/xinxianying.mp3 and b/audio/die/xinxianying.mp3 differ diff --git a/audio/die/xushi.mp3 b/audio/die/xushi.mp3 index b12bac49a..0ef56b3ba 100644 Binary files a/audio/die/xushi.mp3 and b/audio/die/xushi.mp3 differ diff --git a/audio/die/yanwen.mp3 b/audio/die/yanwen.mp3 index 253667174..76533587c 100644 Binary files a/audio/die/yanwen.mp3 and b/audio/die/yanwen.mp3 differ diff --git a/audio/die/yj_sufei.mp3 b/audio/die/yj_sufei.mp3 new file mode 100644 index 000000000..90d3c7378 Binary files /dev/null and b/audio/die/yj_sufei.mp3 differ diff --git a/audio/die/yuanshao.mp3 b/audio/die/yuanshao.mp3 index 40efb95f4..49074551c 100644 Binary files a/audio/die/yuanshao.mp3 and b/audio/die/yuanshao.mp3 differ diff --git a/audio/die/yuanshu.mp3 b/audio/die/yuanshu.mp3 index a864cf44f..8fcdbeb0f 100644 Binary files a/audio/die/yuanshu.mp3 and b/audio/die/yuanshu.mp3 differ diff --git a/audio/die/zhanghe.mp3 b/audio/die/zhanghe.mp3 index 6611baf22..b3b8f88d4 100644 Binary files a/audio/die/zhanghe.mp3 and b/audio/die/zhanghe.mp3 differ diff --git a/audio/die/zhugeruoxue.mp3 b/audio/die/zhugeruoxue.mp3 new file mode 100644 index 000000000..8008f234a Binary files /dev/null and b/audio/die/zhugeruoxue.mp3 differ diff --git a/audio/die/zuoci.mp3 b/audio/die/zuoci.mp3 index 90f9fe13c..b113715ef 100644 Binary files a/audio/die/zuoci.mp3 and b/audio/die/zuoci.mp3 differ diff --git a/audio/skill/bazhen1.mp3 b/audio/skill/bazhen1.mp3 index 65085badc..43da4a7d2 100755 Binary files a/audio/skill/bazhen1.mp3 and b/audio/skill/bazhen1.mp3 differ diff --git a/audio/skill/bazhen2.mp3 b/audio/skill/bazhen2.mp3 index 3b582a6c1..5d805f25a 100755 Binary files a/audio/skill/bazhen2.mp3 and b/audio/skill/bazhen2.mp3 differ diff --git a/audio/skill/beige3.mp3 b/audio/skill/beige3.mp3 deleted file mode 100644 index 70b89b408..000000000 Binary files a/audio/skill/beige3.mp3 and /dev/null differ diff --git a/audio/skill/beige4.mp3 b/audio/skill/beige4.mp3 deleted file mode 100644 index f5f592dc0..000000000 Binary files a/audio/skill/beige4.mp3 and /dev/null differ diff --git a/audio/skill/benghuai3.mp3 b/audio/skill/benghuai3.mp3 deleted file mode 100644 index 67ff913b2..000000000 Binary files a/audio/skill/benghuai3.mp3 and /dev/null differ diff --git a/audio/skill/benghuai4.mp3 b/audio/skill/benghuai4.mp3 deleted file mode 100644 index 9dfd3ff99..000000000 Binary files a/audio/skill/benghuai4.mp3 and /dev/null differ diff --git a/audio/skill/caishi1.mp3 b/audio/skill/caishi1.mp3 index 6de9cada9..7c6f86882 100644 Binary files a/audio/skill/caishi1.mp3 and b/audio/skill/caishi1.mp3 differ diff --git a/audio/skill/caishi2.mp3 b/audio/skill/caishi2.mp3 index 88ede5b2e..e554860b1 100644 Binary files a/audio/skill/caishi2.mp3 and b/audio/skill/caishi2.mp3 differ diff --git a/audio/skill/chanyuan1.mp3 b/audio/skill/chanyuan1.mp3 new file mode 100644 index 000000000..25d8f04a4 Binary files /dev/null and b/audio/skill/chanyuan1.mp3 differ diff --git a/audio/skill/chanyuan2.mp3 b/audio/skill/chanyuan2.mp3 new file mode 100644 index 000000000..8d7eca8e8 Binary files /dev/null and b/audio/skill/chanyuan2.mp3 differ diff --git a/audio/skill/chongzhen1.mp3 b/audio/skill/chongzhen1.mp3 new file mode 100644 index 000000000..a6fe33780 Binary files /dev/null and b/audio/skill/chongzhen1.mp3 differ diff --git a/audio/skill/chongzhen11.mp3 b/audio/skill/chongzhen11.mp3 deleted file mode 100644 index dcd4ae149..000000000 Binary files a/audio/skill/chongzhen11.mp3 and /dev/null differ diff --git a/audio/skill/chongzhen12.mp3 b/audio/skill/chongzhen12.mp3 deleted file mode 100644 index 2412b86fe..000000000 Binary files a/audio/skill/chongzhen12.mp3 and /dev/null differ diff --git a/audio/skill/chongzhen2.mp3 b/audio/skill/chongzhen2.mp3 new file mode 100644 index 000000000..0c5bfda72 Binary files /dev/null and b/audio/skill/chongzhen2.mp3 differ diff --git a/audio/skill/chongzhen21.mp3 b/audio/skill/chongzhen21.mp3 deleted file mode 100644 index dcd4ae149..000000000 Binary files a/audio/skill/chongzhen21.mp3 and /dev/null differ diff --git a/audio/skill/chongzhen22.mp3 b/audio/skill/chongzhen22.mp3 deleted file mode 100644 index 2412b86fe..000000000 Binary files a/audio/skill/chongzhen22.mp3 and /dev/null differ diff --git a/audio/skill/chunlao3.mp3 b/audio/skill/chunlao3.mp3 deleted file mode 100644 index 8008926fd..000000000 Binary files a/audio/skill/chunlao3.mp3 and /dev/null differ diff --git a/audio/skill/clanbaichu1.mp3 b/audio/skill/clanbaichu1.mp3 new file mode 100644 index 000000000..5c9ab8004 Binary files /dev/null and b/audio/skill/clanbaichu1.mp3 differ diff --git a/audio/skill/clanbaichu2.mp3 b/audio/skill/clanbaichu2.mp3 new file mode 100644 index 000000000..0f0eb5f5d Binary files /dev/null and b/audio/skill/clanbaichu2.mp3 differ diff --git a/audio/skill/clanbaozu_clan_zhongyu1.mp3 b/audio/skill/clanbaozu_clan_zhongyu1.mp3 new file mode 100644 index 000000000..66e4efcfc Binary files /dev/null and b/audio/skill/clanbaozu_clan_zhongyu1.mp3 differ diff --git a/audio/skill/clanbaozu_clan_zhongyu2.mp3 b/audio/skill/clanbaozu_clan_zhongyu2.mp3 new file mode 100644 index 000000000..629d16fcb Binary files /dev/null and b/audio/skill/clanbaozu_clan_zhongyu2.mp3 differ diff --git a/audio/skill/clandaojie_clan_xunyou1.mp3 b/audio/skill/clandaojie_clan_xunyou1.mp3 new file mode 100644 index 000000000..83a274170 Binary files /dev/null and b/audio/skill/clandaojie_clan_xunyou1.mp3 differ diff --git a/audio/skill/clandaojie_clan_xunyou2.mp3 b/audio/skill/clandaojie_clan_xunyou2.mp3 new file mode 100644 index 000000000..4102b31f1 Binary files /dev/null and b/audio/skill/clandaojie_clan_xunyou2.mp3 differ diff --git a/audio/skill/clanhuanghan1.mp3 b/audio/skill/clanhuanghan1.mp3 new file mode 100644 index 000000000..ea8e0cead Binary files /dev/null and b/audio/skill/clanhuanghan1.mp3 differ diff --git a/audio/skill/clanhuanghan2.mp3 b/audio/skill/clanhuanghan2.mp3 new file mode 100644 index 000000000..e1838bb36 Binary files /dev/null and b/audio/skill/clanhuanghan2.mp3 differ diff --git a/audio/skill/clanjiejian1.mp3 b/audio/skill/clanjiejian1.mp3 new file mode 100644 index 000000000..81789f469 Binary files /dev/null and b/audio/skill/clanjiejian1.mp3 differ diff --git a/audio/skill/clanjiejian2.mp3 b/audio/skill/clanjiejian2.mp3 new file mode 100644 index 000000000..12b530c16 Binary files /dev/null and b/audio/skill/clanjiejian2.mp3 differ diff --git a/audio/skill/daiyan1.mp3 b/audio/skill/daiyan1.mp3 index aed39345a..75467e969 100644 Binary files a/audio/skill/daiyan1.mp3 and b/audio/skill/daiyan1.mp3 differ diff --git a/audio/skill/daiyan2.mp3 b/audio/skill/daiyan2.mp3 index 28c37d7c7..ae7787495 100644 Binary files a/audio/skill/daiyan2.mp3 and b/audio/skill/daiyan2.mp3 differ diff --git a/audio/skill/dcbeini1.mp3 b/audio/skill/dcbeini1.mp3 new file mode 100644 index 000000000..f9e5439ae Binary files /dev/null and b/audio/skill/dcbeini1.mp3 differ diff --git a/audio/skill/dcbeini2.mp3 b/audio/skill/dcbeini2.mp3 new file mode 100644 index 000000000..eb9f926fc Binary files /dev/null and b/audio/skill/dcbeini2.mp3 differ diff --git a/audio/skill/dcdingji1.mp3 b/audio/skill/dcdingji1.mp3 new file mode 100644 index 000000000..0cf2a0dca Binary files /dev/null and b/audio/skill/dcdingji1.mp3 differ diff --git a/audio/skill/dcdingji2.mp3 b/audio/skill/dcdingji2.mp3 new file mode 100644 index 000000000..abbad77cd Binary files /dev/null and b/audio/skill/dcdingji2.mp3 differ diff --git a/audio/skill/dcfaqi1.mp3 b/audio/skill/dcfaqi1.mp3 new file mode 100644 index 000000000..ea548de73 Binary files /dev/null and b/audio/skill/dcfaqi1.mp3 differ diff --git a/audio/skill/dcfaqi2.mp3 b/audio/skill/dcfaqi2.mp3 new file mode 100644 index 000000000..d1c2f19d2 Binary files /dev/null and b/audio/skill/dcfaqi2.mp3 differ diff --git a/audio/skill/dchuahuo1.mp3 b/audio/skill/dchuahuo1.mp3 new file mode 100644 index 000000000..f53325096 Binary files /dev/null and b/audio/skill/dchuahuo1.mp3 differ diff --git a/audio/skill/dchuahuo2.mp3 b/audio/skill/dchuahuo2.mp3 new file mode 100644 index 000000000..046702df3 Binary files /dev/null and b/audio/skill/dchuahuo2.mp3 differ diff --git a/audio/skill/dcliangxiu1.mp3 b/audio/skill/dcliangxiu1.mp3 new file mode 100644 index 000000000..e6d2a26f5 Binary files /dev/null and b/audio/skill/dcliangxiu1.mp3 differ diff --git a/audio/skill/dcliangxiu2.mp3 b/audio/skill/dcliangxiu2.mp3 new file mode 100644 index 000000000..e5776ae27 Binary files /dev/null and b/audio/skill/dcliangxiu2.mp3 differ diff --git a/audio/skill/dcliuzhuan_gain1.mp3 b/audio/skill/dcliuzhuan_gain1.mp3 deleted file mode 100644 index 09c6f0fce..000000000 Binary files a/audio/skill/dcliuzhuan_gain1.mp3 and /dev/null differ diff --git a/audio/skill/dcliuzhuan_gain2.mp3 b/audio/skill/dcliuzhuan_gain2.mp3 deleted file mode 100644 index dfa7456b8..000000000 Binary files a/audio/skill/dcliuzhuan_gain2.mp3 and /dev/null differ diff --git a/audio/skill/dcniji1.mp3 b/audio/skill/dcniji1.mp3 new file mode 100644 index 000000000..356cefe5c Binary files /dev/null and b/audio/skill/dcniji1.mp3 differ diff --git a/audio/skill/dcniji2.mp3 b/audio/skill/dcniji2.mp3 new file mode 100644 index 000000000..47e3a80ca Binary files /dev/null and b/audio/skill/dcniji2.mp3 differ diff --git a/audio/skill/dcnuanhui1.mp3 b/audio/skill/dcnuanhui1.mp3 new file mode 100644 index 000000000..6294394cd Binary files /dev/null and b/audio/skill/dcnuanhui1.mp3 differ diff --git a/audio/skill/dcnuanhui2.mp3 b/audio/skill/dcnuanhui2.mp3 new file mode 100644 index 000000000..fe01afd34 Binary files /dev/null and b/audio/skill/dcnuanhui2.mp3 differ diff --git a/audio/skill/dcqiongying1.mp3 b/audio/skill/dcqiongying1.mp3 new file mode 100644 index 000000000..6578d9fbb Binary files /dev/null and b/audio/skill/dcqiongying1.mp3 differ diff --git a/audio/skill/dcqiongying2.mp3 b/audio/skill/dcqiongying2.mp3 new file mode 100644 index 000000000..d4d871cee Binary files /dev/null and b/audio/skill/dcqiongying2.mp3 differ diff --git a/audio/skill/dcquanshou1.mp3 b/audio/skill/dcquanshou1.mp3 new file mode 100644 index 000000000..0a35033a6 Binary files /dev/null and b/audio/skill/dcquanshou1.mp3 differ diff --git a/audio/skill/dcquanshou2.mp3 b/audio/skill/dcquanshou2.mp3 new file mode 100644 index 000000000..6ca04d340 Binary files /dev/null and b/audio/skill/dcquanshou2.mp3 differ diff --git a/audio/skill/dcsantou1.mp3 b/audio/skill/dcsantou1.mp3 new file mode 100644 index 000000000..97ee2779e Binary files /dev/null and b/audio/skill/dcsantou1.mp3 differ diff --git a/audio/skill/dcsantou2.mp3 b/audio/skill/dcsantou2.mp3 new file mode 100644 index 000000000..485cb3084 Binary files /dev/null and b/audio/skill/dcsantou2.mp3 differ diff --git a/audio/skill/dcshexue1.mp3 b/audio/skill/dcshexue1.mp3 new file mode 100644 index 000000000..15b41c2a5 Binary files /dev/null and b/audio/skill/dcshexue1.mp3 differ diff --git a/audio/skill/dcshexue2.mp3 b/audio/skill/dcshexue2.mp3 new file mode 100644 index 000000000..ca9948403 Binary files /dev/null and b/audio/skill/dcshexue2.mp3 differ diff --git a/audio/skill/dcshizong1.mp3 b/audio/skill/dcshizong1.mp3 new file mode 100644 index 000000000..7823f32e8 Binary files /dev/null and b/audio/skill/dcshizong1.mp3 differ diff --git a/audio/skill/dcshizong2.mp3 b/audio/skill/dcshizong2.mp3 new file mode 100644 index 000000000..679d6ee28 Binary files /dev/null and b/audio/skill/dcshizong2.mp3 differ diff --git a/audio/skill/dcxiaoyin1.mp3 b/audio/skill/dcxiaoyin1.mp3 new file mode 100644 index 000000000..161568688 Binary files /dev/null and b/audio/skill/dcxiaoyin1.mp3 differ diff --git a/audio/skill/dcxiaoyin2.mp3 b/audio/skill/dcxiaoyin2.mp3 new file mode 100644 index 000000000..bb97e2009 Binary files /dev/null and b/audio/skill/dcxiaoyin2.mp3 differ diff --git a/audio/skill/dcxunjie1.mp3 b/audio/skill/dcxunjie1.mp3 new file mode 100644 index 000000000..69ec53ad2 Binary files /dev/null and b/audio/skill/dcxunjie1.mp3 differ diff --git a/audio/skill/dcxunjie2.mp3 b/audio/skill/dcxunjie2.mp3 new file mode 100644 index 000000000..a14df2d77 Binary files /dev/null and b/audio/skill/dcxunjie2.mp3 differ diff --git a/audio/skill/dcyijia1.mp3 b/audio/skill/dcyijia1.mp3 new file mode 100644 index 000000000..7537b4336 Binary files /dev/null and b/audio/skill/dcyijia1.mp3 differ diff --git a/audio/skill/dcyijia2.mp3 b/audio/skill/dcyijia2.mp3 new file mode 100644 index 000000000..211374fd1 Binary files /dev/null and b/audio/skill/dcyijia2.mp3 differ diff --git a/audio/skill/dcyouzhan1.mp3 b/audio/skill/dcyouzhan1.mp3 new file mode 100644 index 000000000..32d5f447c Binary files /dev/null and b/audio/skill/dcyouzhan1.mp3 differ diff --git a/audio/skill/dcyouzhan2.mp3 b/audio/skill/dcyouzhan2.mp3 new file mode 100644 index 000000000..ac25033b1 Binary files /dev/null and b/audio/skill/dcyouzhan2.mp3 differ diff --git a/audio/skill/duanbing3.mp3 b/audio/skill/duanbing3.mp3 deleted file mode 100644 index e65bc7192..000000000 Binary files a/audio/skill/duanbing3.mp3 and /dev/null differ diff --git a/audio/skill/duanchang3.mp3 b/audio/skill/duanchang3.mp3 deleted file mode 100644 index e43ce8e90..000000000 Binary files a/audio/skill/duanchang3.mp3 and /dev/null differ diff --git a/audio/skill/duanchang4.mp3 b/audio/skill/duanchang4.mp3 deleted file mode 100644 index 849913131..000000000 Binary files a/audio/skill/duanchang4.mp3 and /dev/null differ diff --git a/audio/skill/enyuan11.mp3 b/audio/skill/enyuan1.mp3 similarity index 100% rename from audio/skill/enyuan11.mp3 rename to audio/skill/enyuan1.mp3 diff --git a/audio/skill/enyuan12.mp3 b/audio/skill/enyuan12.mp3 deleted file mode 100644 index 3d6f16f81..000000000 Binary files a/audio/skill/enyuan12.mp3 and /dev/null differ diff --git a/audio/skill/enyuan2.mp3 b/audio/skill/enyuan2.mp3 index c2b1784e6..3d6f16f81 100644 Binary files a/audio/skill/enyuan2.mp3 and b/audio/skill/enyuan2.mp3 differ diff --git a/audio/skill/enyuan21.mp3 b/audio/skill/enyuan21.mp3 deleted file mode 100644 index e90de1a80..000000000 Binary files a/audio/skill/enyuan21.mp3 and /dev/null differ diff --git a/audio/skill/enyuan22.mp3 b/audio/skill/enyuan22.mp3 deleted file mode 100644 index 0e14e74b3..000000000 Binary files a/audio/skill/enyuan22.mp3 and /dev/null differ diff --git a/audio/skill/fumian1.mp3 b/audio/skill/fumian1.mp3 index 721457e26..d7d67799a 100644 Binary files a/audio/skill/fumian1.mp3 and b/audio/skill/fumian1.mp3 differ diff --git a/audio/skill/fumian2.mp3 b/audio/skill/fumian2.mp3 index 0da38c5e6..35a8066ff 100644 Binary files a/audio/skill/fumian2.mp3 and b/audio/skill/fumian2.mp3 differ diff --git a/audio/skill/fuzhu1.mp3 b/audio/skill/fuzhu1.mp3 index fb7f38f39..367850692 100644 Binary files a/audio/skill/fuzhu1.mp3 and b/audio/skill/fuzhu1.mp3 differ diff --git a/audio/skill/fuzhu2.mp3 b/audio/skill/fuzhu2.mp3 index 819ff0b4d..4d644a724 100644 Binary files a/audio/skill/fuzhu2.mp3 and b/audio/skill/fuzhu2.mp3 differ diff --git a/audio/skill/gnjinfan_gain1.mp3 b/audio/skill/gnjinfan_gain1.mp3 deleted file mode 100644 index 0ba595ca7..000000000 Binary files a/audio/skill/gnjinfan_gain1.mp3 and /dev/null differ diff --git a/audio/skill/gnjinfan_gain2.mp3 b/audio/skill/gnjinfan_gain2.mp3 deleted file mode 100644 index ee9cf2eaa..000000000 Binary files a/audio/skill/gnjinfan_gain2.mp3 and /dev/null differ diff --git a/audio/skill/huimin1.mp3 b/audio/skill/huimin1.mp3 index 23084252b..070377381 100644 Binary files a/audio/skill/huimin1.mp3 and b/audio/skill/huimin1.mp3 differ diff --git a/audio/skill/huimin2.mp3 b/audio/skill/huimin2.mp3 index 62aa30fd0..1a2fb9cfa 100644 Binary files a/audio/skill/huimin2.mp3 and b/audio/skill/huimin2.mp3 differ diff --git a/audio/skill/huoji1.mp3 b/audio/skill/huoji1.mp3 index 117c15875..e41397339 100755 Binary files a/audio/skill/huoji1.mp3 and b/audio/skill/huoji1.mp3 differ diff --git a/audio/skill/huoji2.mp3 b/audio/skill/huoji2.mp3 index 935aa5edd..50ef4a50f 100755 Binary files a/audio/skill/huoji2.mp3 and b/audio/skill/huoji2.mp3 differ diff --git a/audio/skill/jieyue11.mp3 b/audio/skill/jieyue1.mp3 similarity index 100% rename from audio/skill/jieyue11.mp3 rename to audio/skill/jieyue1.mp3 diff --git a/audio/skill/jieyue12.mp3 b/audio/skill/jieyue12.mp3 deleted file mode 100644 index b02153629..000000000 Binary files a/audio/skill/jieyue12.mp3 and /dev/null differ diff --git a/audio/skill/jieyue2.mp3 b/audio/skill/jieyue2.mp3 index 42b2ce156..b02153629 100755 Binary files a/audio/skill/jieyue2.mp3 and b/audio/skill/jieyue2.mp3 differ diff --git a/audio/skill/jieyue3.mp3 b/audio/skill/jieyue_shan.mp3 old mode 100755 new mode 100644 similarity index 100% rename from audio/skill/jieyue3.mp3 rename to audio/skill/jieyue_shan.mp3 diff --git a/audio/skill/jieyue_wuxie.mp3 b/audio/skill/jieyue_wuxie.mp3 new file mode 100644 index 000000000..42b2ce156 Binary files /dev/null and b/audio/skill/jieyue_wuxie.mp3 differ diff --git a/audio/skill/jiwu1.mp3 b/audio/skill/jiwu1.mp3 index 0853e261c..88af172e0 100644 Binary files a/audio/skill/jiwu1.mp3 and b/audio/skill/jiwu1.mp3 differ diff --git a/audio/skill/jiwu2.mp3 b/audio/skill/jiwu2.mp3 index 2d90caccc..5fd91738a 100644 Binary files a/audio/skill/jiwu2.mp3 and b/audio/skill/jiwu2.mp3 differ diff --git a/audio/skill/kanpo1.mp3 b/audio/skill/kanpo1.mp3 index 49713052c..fc993a908 100755 Binary files a/audio/skill/kanpo1.mp3 and b/audio/skill/kanpo1.mp3 differ diff --git a/audio/skill/kanpo2.mp3 b/audio/skill/kanpo2.mp3 index dfe6cc93a..3e50f7503 100755 Binary files a/audio/skill/kanpo2.mp3 and b/audio/skill/kanpo2.mp3 differ diff --git a/audio/skill/keji3.mp3 b/audio/skill/keji3.mp3 deleted file mode 100755 index 909e9e2da..000000000 Binary files a/audio/skill/keji3.mp3 and /dev/null differ diff --git a/audio/skill/keji4.mp3 b/audio/skill/keji4.mp3 deleted file mode 100755 index 5a9b4a116..000000000 Binary files a/audio/skill/keji4.mp3 and /dev/null differ diff --git a/audio/skill/kurou3.mp3 b/audio/skill/kurou3.mp3 deleted file mode 100644 index fae235878..000000000 Binary files a/audio/skill/kurou3.mp3 and /dev/null differ diff --git a/audio/skill/kurou4.mp3 b/audio/skill/kurou4.mp3 deleted file mode 100644 index fcd6c2cd6..000000000 Binary files a/audio/skill/kurou4.mp3 and /dev/null differ diff --git a/audio/skill/lianhuan1.mp3 b/audio/skill/lianhuan1.mp3 new file mode 100644 index 000000000..797d8db17 Binary files /dev/null and b/audio/skill/lianhuan1.mp3 differ diff --git a/audio/skill/lianhuan11.mp3 b/audio/skill/lianhuan11.mp3 deleted file mode 100755 index 3e04ba4c1..000000000 Binary files a/audio/skill/lianhuan11.mp3 and /dev/null differ diff --git a/audio/skill/lianhuan12.mp3 b/audio/skill/lianhuan12.mp3 deleted file mode 100755 index 1a1ae544a..000000000 Binary files a/audio/skill/lianhuan12.mp3 and /dev/null differ diff --git a/audio/skill/lianhuan2.mp3 b/audio/skill/lianhuan2.mp3 new file mode 100644 index 000000000..f9a882efa Binary files /dev/null and b/audio/skill/lianhuan2.mp3 differ diff --git a/audio/skill/lianhuan21.mp3 b/audio/skill/lianhuan21.mp3 deleted file mode 100755 index fa00b1464..000000000 Binary files a/audio/skill/lianhuan21.mp3 and /dev/null differ diff --git a/audio/skill/lianhuan22.mp3 b/audio/skill/lianhuan22.mp3 deleted file mode 100755 index a45f1f15f..000000000 Binary files a/audio/skill/lianhuan22.mp3 and /dev/null differ diff --git a/audio/skill/lizhan1.mp3 b/audio/skill/lizhan1.mp3 new file mode 100644 index 000000000..d5e1a780b Binary files /dev/null and b/audio/skill/lizhan1.mp3 differ diff --git a/audio/skill/lizhan2.mp3 b/audio/skill/lizhan2.mp3 new file mode 100644 index 000000000..99e0c9789 Binary files /dev/null and b/audio/skill/lizhan2.mp3 differ diff --git a/audio/skill/longdan_shan1.mp3 b/audio/skill/longdan_shan1.mp3 deleted file mode 100755 index 89bc5033f..000000000 Binary files a/audio/skill/longdan_shan1.mp3 and /dev/null differ diff --git a/audio/skill/longdan_shan2.mp3 b/audio/skill/longdan_shan2.mp3 deleted file mode 100755 index ee1d32918..000000000 Binary files a/audio/skill/longdan_shan2.mp3 and /dev/null differ diff --git a/audio/skill/longyin3.mp3 b/audio/skill/longyin3.mp3 deleted file mode 100644 index 240e747af..000000000 Binary files a/audio/skill/longyin3.mp3 and /dev/null differ diff --git a/audio/skill/luanji1.mp3 b/audio/skill/luanji1.mp3 index 4aae5f3a6..214cd3050 100755 Binary files a/audio/skill/luanji1.mp3 and b/audio/skill/luanji1.mp3 differ diff --git a/audio/skill/luanji2.mp3 b/audio/skill/luanji2.mp3 index f5032f7aa..a1bddefbe 100755 Binary files a/audio/skill/luanji2.mp3 and b/audio/skill/luanji2.mp3 differ diff --git a/audio/skill/luoyan1.mp3 b/audio/skill/luoyan1.mp3 deleted file mode 100644 index 6d3930eba..000000000 Binary files a/audio/skill/luoyan1.mp3 and /dev/null differ diff --git a/audio/skill/luoyan2.mp3 b/audio/skill/luoyan2.mp3 deleted file mode 100644 index 48bbe83b2..000000000 Binary files a/audio/skill/luoyan2.mp3 and /dev/null differ diff --git a/audio/skill/luoyan3.mp3 b/audio/skill/luoyan3.mp3 deleted file mode 100644 index 67afb3923..000000000 Binary files a/audio/skill/luoyan3.mp3 and /dev/null differ diff --git a/audio/skill/luoyan4.mp3 b/audio/skill/luoyan4.mp3 deleted file mode 100644 index c0144e047..000000000 Binary files a/audio/skill/luoyan4.mp3 and /dev/null differ diff --git a/audio/skill/naxue1.mp3 b/audio/skill/naxue1.mp3 new file mode 100644 index 000000000..f4765a890 Binary files /dev/null and b/audio/skill/naxue1.mp3 differ diff --git a/audio/skill/naxue2.mp3 b/audio/skill/naxue2.mp3 new file mode 100644 index 000000000..18c29a43c Binary files /dev/null and b/audio/skill/naxue2.mp3 differ diff --git a/audio/skill/new_reyaowu1.mp3 b/audio/skill/new_reyaowu1.mp3 index c3827e1d4..88c39b1f8 100644 Binary files a/audio/skill/new_reyaowu1.mp3 and b/audio/skill/new_reyaowu1.mp3 differ diff --git a/audio/skill/new_reyaowu2.mp3 b/audio/skill/new_reyaowu2.mp3 index 01c5f5e63..ccc92d47e 100644 Binary files a/audio/skill/new_reyaowu2.mp3 and b/audio/skill/new_reyaowu2.mp3 differ diff --git a/audio/skill/niepan1.mp3 b/audio/skill/niepan1.mp3 index 616e96354..bd1ff3549 100755 Binary files a/audio/skill/niepan1.mp3 and b/audio/skill/niepan1.mp3 differ diff --git a/audio/skill/niepan2.mp3 b/audio/skill/niepan2.mp3 index eb9e987ac..5fab190c7 100755 Binary files a/audio/skill/niepan2.mp3 and b/audio/skill/niepan2.mp3 differ diff --git a/audio/skill/nzry_jieying_11.mp3 b/audio/skill/nzry_jieying_11.mp3 deleted file mode 100755 index c3fa86d4a..000000000 Binary files a/audio/skill/nzry_jieying_11.mp3 and /dev/null differ diff --git a/audio/skill/nzry_jieying_12.mp3 b/audio/skill/nzry_jieying_12.mp3 deleted file mode 100755 index 6393b7db1..000000000 Binary files a/audio/skill/nzry_jieying_12.mp3 and /dev/null differ diff --git a/audio/skill/nzry_jieying_21.mp3 b/audio/skill/nzry_jieying_21.mp3 deleted file mode 100755 index c3fa86d4a..000000000 Binary files a/audio/skill/nzry_jieying_21.mp3 and /dev/null differ diff --git a/audio/skill/nzry_jieying_22.mp3 b/audio/skill/nzry_jieying_22.mp3 deleted file mode 100755 index 6393b7db1..000000000 Binary files a/audio/skill/nzry_jieying_22.mp3 and /dev/null differ diff --git a/audio/skill/nzry_juzhan_21.mp3 b/audio/skill/nzry_juzhan_21.mp3 deleted file mode 100755 index d59b61d87..000000000 Binary files a/audio/skill/nzry_juzhan_21.mp3 and /dev/null differ diff --git a/audio/skill/nzry_juzhan_22.mp3 b/audio/skill/nzry_juzhan_22.mp3 deleted file mode 100755 index 46acb5d6e..000000000 Binary files a/audio/skill/nzry_juzhan_22.mp3 and /dev/null differ diff --git a/audio/skill/nzry_mingren_11.mp3 b/audio/skill/nzry_mingren_11.mp3 index d74e8e43e..d6e72296c 100755 Binary files a/audio/skill/nzry_mingren_11.mp3 and b/audio/skill/nzry_mingren_11.mp3 differ diff --git a/audio/skill/nzry_mingren_12.mp3 b/audio/skill/nzry_mingren_12.mp3 index d6e72296c..576e79766 100755 Binary files a/audio/skill/nzry_mingren_12.mp3 and b/audio/skill/nzry_mingren_12.mp3 differ diff --git a/audio/skill/nzry_mingren_21.mp3 b/audio/skill/nzry_mingren_21.mp3 deleted file mode 100755 index d74e8e43e..000000000 Binary files a/audio/skill/nzry_mingren_21.mp3 and /dev/null differ diff --git a/audio/skill/nzry_mingren_22.mp3 b/audio/skill/nzry_mingren_22.mp3 deleted file mode 100755 index d6e72296c..000000000 Binary files a/audio/skill/nzry_mingren_22.mp3 and /dev/null differ diff --git a/audio/skill/nzry_shenshi11.mp3 b/audio/skill/nzry_shenshi11.mp3 deleted file mode 100755 index 76a623673..000000000 Binary files a/audio/skill/nzry_shenshi11.mp3 and /dev/null differ diff --git a/audio/skill/nzry_shenshi12.mp3 b/audio/skill/nzry_shenshi12.mp3 deleted file mode 100755 index e92a89922..000000000 Binary files a/audio/skill/nzry_shenshi12.mp3 and /dev/null differ diff --git a/audio/skill/nzry_shenshi_21.mp3 b/audio/skill/nzry_shenshi_21.mp3 deleted file mode 100755 index 76a623673..000000000 Binary files a/audio/skill/nzry_shenshi_21.mp3 and /dev/null differ diff --git a/audio/skill/nzry_shenshi_22.mp3 b/audio/skill/nzry_shenshi_22.mp3 deleted file mode 100755 index e92a89922..000000000 Binary files a/audio/skill/nzry_shenshi_22.mp3 and /dev/null differ diff --git a/audio/skill/nzry_zhenliang_11.mp3 b/audio/skill/nzry_zhenliang_11.mp3 index 1d9b6b772..9a0eb72f0 100755 Binary files a/audio/skill/nzry_zhenliang_11.mp3 and b/audio/skill/nzry_zhenliang_11.mp3 differ diff --git a/audio/skill/nzry_zhenliang_12.mp3 b/audio/skill/nzry_zhenliang_12.mp3 index 9a0eb72f0..38bec04b6 100755 Binary files a/audio/skill/nzry_zhenliang_12.mp3 and b/audio/skill/nzry_zhenliang_12.mp3 differ diff --git a/audio/skill/nzry_zhenliang_21.mp3 b/audio/skill/nzry_zhenliang_21.mp3 deleted file mode 100755 index 1d9b6b772..000000000 Binary files a/audio/skill/nzry_zhenliang_21.mp3 and /dev/null differ diff --git a/audio/skill/nzry_zhenliang_22.mp3 b/audio/skill/nzry_zhenliang_22.mp3 deleted file mode 100755 index 9a0eb72f0..000000000 Binary files a/audio/skill/nzry_zhenliang_22.mp3 and /dev/null differ diff --git a/audio/skill/olchuming1.mp3 b/audio/skill/olchuming1.mp3 new file mode 100644 index 000000000..c0262cf68 Binary files /dev/null and b/audio/skill/olchuming1.mp3 differ diff --git a/audio/skill/olchuming2.mp3 b/audio/skill/olchuming2.mp3 new file mode 100644 index 000000000..f38fba6c8 Binary files /dev/null and b/audio/skill/olchuming2.mp3 differ diff --git a/audio/skill/olkuansai1.mp3 b/audio/skill/olkuansai1.mp3 new file mode 100644 index 000000000..12be55776 Binary files /dev/null and b/audio/skill/olkuansai1.mp3 differ diff --git a/audio/skill/olkuansai2.mp3 b/audio/skill/olkuansai2.mp3 new file mode 100644 index 000000000..aa8ccbf4f Binary files /dev/null and b/audio/skill/olkuansai2.mp3 differ diff --git a/audio/skill/oltousui1.mp3 b/audio/skill/oltousui1.mp3 new file mode 100644 index 000000000..46af6d9df Binary files /dev/null and b/audio/skill/oltousui1.mp3 differ diff --git a/audio/skill/oltousui2.mp3 b/audio/skill/oltousui2.mp3 new file mode 100644 index 000000000..59b028d21 Binary files /dev/null and b/audio/skill/oltousui2.mp3 differ diff --git a/audio/skill/olweifu1.mp3 b/audio/skill/olweifu1.mp3 new file mode 100644 index 000000000..276c54bb4 Binary files /dev/null and b/audio/skill/olweifu1.mp3 differ diff --git a/audio/skill/olweifu2.mp3 b/audio/skill/olweifu2.mp3 new file mode 100644 index 000000000..13ca4fc29 Binary files /dev/null and b/audio/skill/olweifu2.mp3 differ diff --git a/audio/skill/qiangxi1.mp3 b/audio/skill/qiangxi1.mp3 index f9a6357ce..84270af42 100755 Binary files a/audio/skill/qiangxi1.mp3 and b/audio/skill/qiangxi1.mp3 differ diff --git a/audio/skill/qiangxi2.mp3 b/audio/skill/qiangxi2.mp3 index 32b923058..1acebbfb1 100755 Binary files a/audio/skill/qiangxi2.mp3 and b/audio/skill/qiangxi2.mp3 differ diff --git a/audio/skill/qiangxi_boss_lvbu31.mp3 b/audio/skill/qiangxi_boss_lvbu31.mp3 index 800238093..44e56d48f 100644 Binary files a/audio/skill/qiangxi_boss_lvbu31.mp3 and b/audio/skill/qiangxi_boss_lvbu31.mp3 differ diff --git a/audio/skill/qiangxi_boss_lvbu32.mp3 b/audio/skill/qiangxi_boss_lvbu32.mp3 index 06dc94697..7329a17ce 100644 Binary files a/audio/skill/qiangxi_boss_lvbu32.mp3 and b/audio/skill/qiangxi_boss_lvbu32.mp3 differ diff --git a/audio/skill/qiaobian1.mp3 b/audio/skill/qiaobian1.mp3 index 76c6f5e66..927d26c53 100755 Binary files a/audio/skill/qiaobian1.mp3 and b/audio/skill/qiaobian1.mp3 differ diff --git a/audio/skill/qiaobian11.mp3 b/audio/skill/qiaobian11.mp3 deleted file mode 100755 index 730431ba0..000000000 Binary files a/audio/skill/qiaobian11.mp3 and /dev/null differ diff --git a/audio/skill/qiaobian12.mp3 b/audio/skill/qiaobian12.mp3 deleted file mode 100755 index 126cefd92..000000000 Binary files a/audio/skill/qiaobian12.mp3 and /dev/null differ diff --git a/audio/skill/qiaobian2.mp3 b/audio/skill/qiaobian2.mp3 index 9e937ad0c..88ec22c45 100755 Binary files a/audio/skill/qiaobian2.mp3 and b/audio/skill/qiaobian2.mp3 differ diff --git a/audio/skill/qiaobian21.mp3 b/audio/skill/qiaobian21.mp3 deleted file mode 100755 index 730431ba0..000000000 Binary files a/audio/skill/qiaobian21.mp3 and /dev/null differ diff --git a/audio/skill/qiaobian22.mp3 b/audio/skill/qiaobian22.mp3 deleted file mode 100755 index 126cefd92..000000000 Binary files a/audio/skill/qiaobian22.mp3 and /dev/null differ diff --git a/audio/skill/qiaobian31.mp3 b/audio/skill/qiaobian31.mp3 deleted file mode 100755 index 730431ba0..000000000 Binary files a/audio/skill/qiaobian31.mp3 and /dev/null differ diff --git a/audio/skill/qiaobian32.mp3 b/audio/skill/qiaobian32.mp3 deleted file mode 100755 index 126cefd92..000000000 Binary files a/audio/skill/qiaobian32.mp3 and /dev/null differ diff --git a/audio/skill/qiaobian41.mp3 b/audio/skill/qiaobian41.mp3 deleted file mode 100755 index 730431ba0..000000000 Binary files a/audio/skill/qiaobian41.mp3 and /dev/null differ diff --git a/audio/skill/qiaobian42.mp3 b/audio/skill/qiaobian42.mp3 deleted file mode 100755 index 126cefd92..000000000 Binary files a/audio/skill/qiaobian42.mp3 and /dev/null differ diff --git a/audio/skill/qice_clan_xunyou1.mp3 b/audio/skill/qice_clan_xunyou1.mp3 new file mode 100644 index 000000000..8b6ccad1e Binary files /dev/null and b/audio/skill/qice_clan_xunyou1.mp3 differ diff --git a/audio/skill/qice_clan_xunyou2.mp3 b/audio/skill/qice_clan_xunyou2.mp3 new file mode 100644 index 000000000..426f2fe79 Binary files /dev/null and b/audio/skill/qice_clan_xunyou2.mp3 differ diff --git a/audio/skill/qingbei1.mp3 b/audio/skill/qingbei1.mp3 new file mode 100644 index 000000000..adb155731 Binary files /dev/null and b/audio/skill/qingbei1.mp3 differ diff --git a/audio/skill/qingbei2.mp3 b/audio/skill/qingbei2.mp3 new file mode 100644 index 000000000..c6e55c737 Binary files /dev/null and b/audio/skill/qingbei2.mp3 differ diff --git a/audio/skill/qixi3.mp3 b/audio/skill/qixi3.mp3 deleted file mode 100755 index 53354c739..000000000 Binary files a/audio/skill/qixi3.mp3 and /dev/null differ diff --git a/audio/skill/qixi4.mp3 b/audio/skill/qixi4.mp3 deleted file mode 100755 index 14bbce6da..000000000 Binary files a/audio/skill/qixi4.mp3 and /dev/null differ diff --git a/audio/skill/qixing3.mp3 b/audio/skill/qixing3.mp3 deleted file mode 100644 index 91cbee118..000000000 Binary files a/audio/skill/qixing3.mp3 and /dev/null differ diff --git a/audio/skill/rechanyuan1.mp3 b/audio/skill/rechanyuan1.mp3 new file mode 100644 index 000000000..e2dffc256 Binary files /dev/null and b/audio/skill/rechanyuan1.mp3 differ diff --git a/audio/skill/rechanyuan2.mp3 b/audio/skill/rechanyuan2.mp3 new file mode 100644 index 000000000..583d8dab2 Binary files /dev/null and b/audio/skill/rechanyuan2.mp3 differ diff --git a/audio/skill/rehongyan1.mp3 b/audio/skill/rehongyan1.mp3 index 4e0962348..be3c39d5c 100644 Binary files a/audio/skill/rehongyan1.mp3 and b/audio/skill/rehongyan1.mp3 differ diff --git a/audio/skill/renxin3.mp3 b/audio/skill/renxin3.mp3 deleted file mode 100644 index bbf57283b..000000000 Binary files a/audio/skill/renxin3.mp3 and /dev/null differ diff --git a/audio/skill/retieji_boss_lvbu31.mp3 b/audio/skill/retieji_boss_lvbu31.mp3 new file mode 100644 index 000000000..61fed065c Binary files /dev/null and b/audio/skill/retieji_boss_lvbu31.mp3 differ diff --git a/audio/skill/retieji_boss_lvbu32.mp3 b/audio/skill/retieji_boss_lvbu32.mp3 new file mode 100644 index 000000000..835d34c23 Binary files /dev/null and b/audio/skill/retieji_boss_lvbu32.mp3 differ diff --git a/audio/skill/sbguanxing1.mp3 b/audio/skill/sbguanxing1.mp3 new file mode 100644 index 000000000..8ce7148fe Binary files /dev/null and b/audio/skill/sbguanxing1.mp3 differ diff --git a/audio/skill/sbguanxing2.mp3 b/audio/skill/sbguanxing2.mp3 new file mode 100644 index 000000000..b919f0284 Binary files /dev/null and b/audio/skill/sbguanxing2.mp3 differ diff --git a/audio/skill/sbhuoji1.mp3 b/audio/skill/sbhuoji1.mp3 new file mode 100644 index 000000000..4cf18052b Binary files /dev/null and b/audio/skill/sbhuoji1.mp3 differ diff --git a/audio/skill/sbhuoji2.mp3 b/audio/skill/sbhuoji2.mp3 new file mode 100644 index 000000000..24f5fffc9 Binary files /dev/null and b/audio/skill/sbhuoji2.mp3 differ diff --git a/audio/skill/sbjizhi1.mp3 b/audio/skill/sbjizhi1.mp3 new file mode 100644 index 000000000..8704fb065 Binary files /dev/null and b/audio/skill/sbjizhi1.mp3 differ diff --git a/audio/skill/sbjizhi2.mp3 b/audio/skill/sbjizhi2.mp3 new file mode 100644 index 000000000..0f2ab5c81 Binary files /dev/null and b/audio/skill/sbjizhi2.mp3 differ diff --git a/audio/skill/sbkanpo1.mp3 b/audio/skill/sbkanpo1.mp3 new file mode 100644 index 000000000..c97d9b0be Binary files /dev/null and b/audio/skill/sbkanpo1.mp3 differ diff --git a/audio/skill/sbkanpo2.mp3 b/audio/skill/sbkanpo2.mp3 new file mode 100644 index 000000000..fffb63014 Binary files /dev/null and b/audio/skill/sbkanpo2.mp3 differ diff --git a/audio/skill/sbkongcheng1.mp3 b/audio/skill/sbkongcheng1.mp3 new file mode 100644 index 000000000..8ff3b11bc Binary files /dev/null and b/audio/skill/sbkongcheng1.mp3 differ diff --git a/audio/skill/sbkongcheng2.mp3 b/audio/skill/sbkongcheng2.mp3 new file mode 100644 index 000000000..fc43543be Binary files /dev/null and b/audio/skill/sbkongcheng2.mp3 differ diff --git a/audio/skill/sbqicai1.mp3 b/audio/skill/sbqicai1.mp3 new file mode 100644 index 000000000..705ed6786 Binary files /dev/null and b/audio/skill/sbqicai1.mp3 differ diff --git a/audio/skill/sbqicai2.mp3 b/audio/skill/sbqicai2.mp3 new file mode 100644 index 000000000..87f84f943 Binary files /dev/null and b/audio/skill/sbqicai2.mp3 differ diff --git a/audio/skill/shenji1.mp3 b/audio/skill/shenji1.mp3 index c660a71c0..f306e86b6 100644 Binary files a/audio/skill/shenji1.mp3 and b/audio/skill/shenji1.mp3 differ diff --git a/audio/skill/shenji2.mp3 b/audio/skill/shenji2.mp3 index 2dfa3b94d..510d2470d 100644 Binary files a/audio/skill/shenji2.mp3 and b/audio/skill/shenji2.mp3 differ diff --git a/audio/skill/shenqu1.mp3 b/audio/skill/shenqu1.mp3 index 368f4ab42..ebbb9f16b 100644 Binary files a/audio/skill/shenqu1.mp3 and b/audio/skill/shenqu1.mp3 differ diff --git a/audio/skill/shenqu2.mp3 b/audio/skill/shenqu2.mp3 index 108cf594e..a50b35df4 100644 Binary files a/audio/skill/shenqu2.mp3 and b/audio/skill/shenqu2.mp3 differ diff --git a/audio/skill/shenwei1.mp3 b/audio/skill/shenwei1.mp3 index cfcf44a39..22593f4fc 100644 Binary files a/audio/skill/shenwei1.mp3 and b/audio/skill/shenwei1.mp3 differ diff --git a/audio/skill/shenwei2.mp3 b/audio/skill/shenwei2.mp3 index e4e62b4ac..c7e5e21b7 100644 Binary files a/audio/skill/shenwei2.mp3 and b/audio/skill/shenwei2.mp3 differ diff --git a/audio/skill/shouxi1.mp3 b/audio/skill/shouxi1.mp3 index 4cd2de960..d45aa9c7d 100644 Binary files a/audio/skill/shouxi1.mp3 and b/audio/skill/shouxi1.mp3 differ diff --git a/audio/skill/shouxi2.mp3 b/audio/skill/shouxi2.mp3 index a50ece551..250e654dc 100644 Binary files a/audio/skill/shouxi2.mp3 and b/audio/skill/shouxi2.mp3 differ diff --git a/audio/skill/shuangxiong.mp3 b/audio/skill/shuangxiong.mp3 deleted file mode 100755 index ad341846d..000000000 Binary files a/audio/skill/shuangxiong.mp3 and /dev/null differ diff --git a/audio/skill/shuangxiong1.mp3 b/audio/skill/shuangxiong1.mp3 index ad341846d..0d02fcd46 100644 Binary files a/audio/skill/shuangxiong1.mp3 and b/audio/skill/shuangxiong1.mp3 differ diff --git a/audio/skill/shuangxiong2.mp3 b/audio/skill/shuangxiong2.mp3 index 8eccc4791..f5d5f0e3f 100755 Binary files a/audio/skill/shuangxiong2.mp3 and b/audio/skill/shuangxiong2.mp3 differ diff --git a/audio/skill/shuangxiong2_re_yanwen.mp3 b/audio/skill/shuangxiong2_re_yanwen.mp3 deleted file mode 100644 index 91548b71c..000000000 Binary files a/audio/skill/shuangxiong2_re_yanwen.mp3 and /dev/null differ diff --git a/audio/skill/shuangxiong1_re_yanwen.mp3 b/audio/skill/shuangxiong_re_yanwen1.mp3 similarity index 100% rename from audio/skill/shuangxiong1_re_yanwen.mp3 rename to audio/skill/shuangxiong_re_yanwen1.mp3 diff --git a/audio/skill/shuangxiong_re_yanwen.mp3 b/audio/skill/shuangxiong_re_yanwen2.mp3 similarity index 100% rename from audio/skill/shuangxiong_re_yanwen.mp3 rename to audio/skill/shuangxiong_re_yanwen2.mp3 diff --git a/audio/skill/shuojian1.mp3 b/audio/skill/shuojian1.mp3 new file mode 100644 index 000000000..5c31087b2 Binary files /dev/null and b/audio/skill/shuojian1.mp3 differ diff --git a/audio/skill/shuojian2.mp3 b/audio/skill/shuojian2.mp3 new file mode 100644 index 000000000..d91f49556 Binary files /dev/null and b/audio/skill/shuojian2.mp3 differ diff --git a/audio/skill/starcanxi1.mp3 b/audio/skill/starcanxi1.mp3 new file mode 100644 index 000000000..09c939bc0 Binary files /dev/null and b/audio/skill/starcanxi1.mp3 differ diff --git a/audio/skill/starcanxi2.mp3 b/audio/skill/starcanxi2.mp3 new file mode 100644 index 000000000..cadb37671 Binary files /dev/null and b/audio/skill/starcanxi2.mp3 differ diff --git a/audio/skill/starlifeng1.mp3 b/audio/skill/starlifeng1.mp3 new file mode 100644 index 000000000..eb0251d42 Binary files /dev/null and b/audio/skill/starlifeng1.mp3 differ diff --git a/audio/skill/starlifeng2.mp3 b/audio/skill/starlifeng2.mp3 new file mode 100644 index 000000000..5655e897f Binary files /dev/null and b/audio/skill/starlifeng2.mp3 differ diff --git a/audio/skill/starpizhi1.mp3 b/audio/skill/starpizhi1.mp3 new file mode 100644 index 000000000..aac8f0dae Binary files /dev/null and b/audio/skill/starpizhi1.mp3 differ diff --git a/audio/skill/starpizhi2.mp3 b/audio/skill/starpizhi2.mp3 new file mode 100644 index 000000000..7b5ea337f Binary files /dev/null and b/audio/skill/starpizhi2.mp3 differ diff --git a/audio/skill/starsujun1.mp3 b/audio/skill/starsujun1.mp3 new file mode 100644 index 000000000..144bd5f9b Binary files /dev/null and b/audio/skill/starsujun1.mp3 differ diff --git a/audio/skill/starsujun2.mp3 b/audio/skill/starsujun2.mp3 new file mode 100644 index 000000000..8e8e54039 Binary files /dev/null and b/audio/skill/starsujun2.mp3 differ diff --git a/audio/skill/starzhonggu1.mp3 b/audio/skill/starzhonggu1.mp3 new file mode 100644 index 000000000..5cb768697 Binary files /dev/null and b/audio/skill/starzhonggu1.mp3 differ diff --git a/audio/skill/starzhonggu2.mp3 b/audio/skill/starzhonggu2.mp3 new file mode 100644 index 000000000..b6825aa47 Binary files /dev/null and b/audio/skill/starzhonggu2.mp3 differ diff --git a/audio/skill/tianyi1.mp3 b/audio/skill/tianyi1.mp3 index f656d6f99..f5fe07100 100755 Binary files a/audio/skill/tianyi1.mp3 and b/audio/skill/tianyi1.mp3 differ diff --git a/audio/skill/tianyi2.mp3 b/audio/skill/tianyi2.mp3 index 4ecfe958a..e4dc622ee 100755 Binary files a/audio/skill/tianyi2.mp3 and b/audio/skill/tianyi2.mp3 differ diff --git a/audio/skill/tiaoxin3.mp3 b/audio/skill/tiaoxin3.mp3 deleted file mode 100644 index e4cf9ed71..000000000 Binary files a/audio/skill/tiaoxin3.mp3 and /dev/null differ diff --git a/audio/skill/tiaoxin4.mp3 b/audio/skill/tiaoxin4.mp3 deleted file mode 100644 index c8193c99e..000000000 Binary files a/audio/skill/tiaoxin4.mp3 and /dev/null differ diff --git a/audio/skill/twjizhu2.mp3 b/audio/skill/twjizhu2.mp3 deleted file mode 100644 index d5c7ec948..000000000 Binary files a/audio/skill/twjizhu2.mp3 and /dev/null differ diff --git a/audio/skill/twjizhu3.mp3 b/audio/skill/twjizhu3.mp3 deleted file mode 100644 index ac9cc31ce..000000000 Binary files a/audio/skill/twjizhu3.mp3 and /dev/null differ diff --git a/audio/skill/twrende1.mp3 b/audio/skill/twrende1.mp3 deleted file mode 100644 index 1842d2337..000000000 Binary files a/audio/skill/twrende1.mp3 and /dev/null differ diff --git a/audio/skill/twrende2.mp3 b/audio/skill/twrende2.mp3 deleted file mode 100644 index a12f36fb3..000000000 Binary files a/audio/skill/twrende2.mp3 and /dev/null differ diff --git a/audio/skill/twrende3.mp3 b/audio/skill/twrende3.mp3 deleted file mode 100644 index 68866a572..000000000 Binary files a/audio/skill/twrende3.mp3 and /dev/null differ diff --git a/audio/skill/wansha_boss_lvbu31.mp3 b/audio/skill/wansha_boss_lvbu31.mp3 index 13e2aa489..de541aa74 100644 Binary files a/audio/skill/wansha_boss_lvbu31.mp3 and b/audio/skill/wansha_boss_lvbu31.mp3 differ diff --git a/audio/skill/wansha_boss_lvbu32.mp3 b/audio/skill/wansha_boss_lvbu32.mp3 index 2d0689887..37fbdd6cb 100644 Binary files a/audio/skill/wansha_boss_lvbu32.mp3 and b/audio/skill/wansha_boss_lvbu32.mp3 differ diff --git a/audio/skill/wanwei1.mp3 b/audio/skill/wanwei1.mp3 index 7ea052a3b..f7df76dc7 100644 Binary files a/audio/skill/wanwei1.mp3 and b/audio/skill/wanwei1.mp3 differ diff --git a/audio/skill/wanwei2.mp3 b/audio/skill/wanwei2.mp3 index f46acc58b..c9b880837 100644 Binary files a/audio/skill/wanwei2.mp3 and b/audio/skill/wanwei2.mp3 differ diff --git a/audio/skill/weidi1.mp3 b/audio/skill/weidi1.mp3 index 509ede9fa..f0c044534 100644 Binary files a/audio/skill/weidi1.mp3 and b/audio/skill/weidi1.mp3 differ diff --git a/audio/skill/weidi2.mp3 b/audio/skill/weidi2.mp3 index 5903ab1f8..14576b98d 100644 Binary files a/audio/skill/weidi2.mp3 and b/audio/skill/weidi2.mp3 differ diff --git a/audio/skill/weikui1.mp3 b/audio/skill/weikui1.mp3 new file mode 100644 index 000000000..c329a1fac Binary files /dev/null and b/audio/skill/weikui1.mp3 differ diff --git a/audio/skill/weikui2.mp3 b/audio/skill/weikui2.mp3 new file mode 100644 index 000000000..332c90e1d Binary files /dev/null and b/audio/skill/weikui2.mp3 differ diff --git a/audio/skill/wengua1.mp3 b/audio/skill/wengua1.mp3 index 608f8903e..cb5e6b19e 100644 Binary files a/audio/skill/wengua1.mp3 and b/audio/skill/wengua1.mp3 differ diff --git a/audio/skill/wengua2.mp3 b/audio/skill/wengua2.mp3 index b5ed96b73..4cba2ceea 100644 Binary files a/audio/skill/wengua2.mp3 and b/audio/skill/wengua2.mp3 differ diff --git a/audio/skill/wuhun21.mp3 b/audio/skill/wuhun21.mp3 index 0f08a5966..59f308757 100644 Binary files a/audio/skill/wuhun21.mp3 and b/audio/skill/wuhun21.mp3 differ diff --git a/audio/skill/wuhun22.mp3 b/audio/skill/wuhun22.mp3 index fb410dea7..abb84f50a 100644 Binary files a/audio/skill/wuhun22.mp3 and b/audio/skill/wuhun22.mp3 differ diff --git a/audio/skill/wuhun23.mp3 b/audio/skill/wuhun23.mp3 deleted file mode 100644 index 923313569..000000000 Binary files a/audio/skill/wuhun23.mp3 and /dev/null differ diff --git a/audio/skill/wuling1.mp3 b/audio/skill/wuling1.mp3 new file mode 100644 index 000000000..d19c3be7a Binary files /dev/null and b/audio/skill/wuling1.mp3 differ diff --git a/audio/skill/wuling2.mp3 b/audio/skill/wuling2.mp3 new file mode 100644 index 000000000..255fbcef2 Binary files /dev/null and b/audio/skill/wuling2.mp3 differ diff --git a/audio/skill/wusheng3.mp3 b/audio/skill/wusheng3.mp3 deleted file mode 100755 index 2ebad6cb0..000000000 Binary files a/audio/skill/wusheng3.mp3 and /dev/null differ diff --git a/audio/skill/wushuang_shen_lvbu1.mp3 b/audio/skill/wushuang_shen_lvbu1.mp3 new file mode 100644 index 000000000..6ed1b7505 Binary files /dev/null and b/audio/skill/wushuang_shen_lvbu1.mp3 differ diff --git a/audio/skill/wushuang_shen_lvbu2.mp3 b/audio/skill/wushuang_shen_lvbu2.mp3 new file mode 100644 index 000000000..bd7ab7805 Binary files /dev/null and b/audio/skill/wushuang_shen_lvbu2.mp3 differ diff --git a/audio/skill/xiaoji3.mp3 b/audio/skill/xiaoji3.mp3 deleted file mode 100644 index 642788685..000000000 Binary files a/audio/skill/xiaoji3.mp3 and /dev/null differ diff --git a/audio/skill/xiaoji4.mp3 b/audio/skill/xiaoji4.mp3 deleted file mode 100644 index 3d17f7f1e..000000000 Binary files a/audio/skill/xiaoji4.mp3 and /dev/null differ diff --git a/audio/skill/xinenyuan.mp3 b/audio/skill/xinenyuan.mp3 deleted file mode 100644 index c2b1784e6..000000000 Binary files a/audio/skill/xinenyuan.mp3 and /dev/null differ diff --git a/audio/skill/xinenyuan1.mp3 b/audio/skill/xinenyuan1.mp3 new file mode 100644 index 000000000..bd65c8e83 Binary files /dev/null and b/audio/skill/xinenyuan1.mp3 differ diff --git a/audio/skill/xinenyuan2.mp3 b/audio/skill/xinenyuan2.mp3 index 727ad702a..3eca98867 100644 Binary files a/audio/skill/xinenyuan2.mp3 and b/audio/skill/xinenyuan2.mp3 differ diff --git a/audio/skill/xinfu_jianjie11.mp3 b/audio/skill/xinfu_jianjie11.mp3 deleted file mode 100755 index 28fba3f48..000000000 Binary files a/audio/skill/xinfu_jianjie11.mp3 and /dev/null differ diff --git a/audio/skill/xinfu_jianjie12.mp3 b/audio/skill/xinfu_jianjie12.mp3 deleted file mode 100755 index 1899d62c2..000000000 Binary files a/audio/skill/xinfu_jianjie12.mp3 and /dev/null differ diff --git a/audio/skill/xinfu_jianjie13.mp3 b/audio/skill/xinfu_jianjie13.mp3 deleted file mode 100755 index fd70cbc98..000000000 Binary files a/audio/skill/xinfu_jianjie13.mp3 and /dev/null differ diff --git a/audio/skill/xinxuanhuo1.mp3 b/audio/skill/xinxuanhuo1.mp3 index 79a5639dc..79c45cb43 100644 Binary files a/audio/skill/xinxuanhuo1.mp3 and b/audio/skill/xinxuanhuo1.mp3 differ diff --git a/audio/skill/xinxuanhuo2.mp3 b/audio/skill/xinxuanhuo2.mp3 index 9b99c324d..e7391c305 100644 Binary files a/audio/skill/xinxuanhuo2.mp3 and b/audio/skill/xinxuanhuo2.mp3 differ diff --git a/audio/skill/xiuluo1.mp3 b/audio/skill/xiuluo1.mp3 index 96ac602af..22364690d 100644 Binary files a/audio/skill/xiuluo1.mp3 and b/audio/skill/xiuluo1.mp3 differ diff --git a/audio/skill/xiuluo2.mp3 b/audio/skill/xiuluo2.mp3 index 90deada1b..0797a4b5c 100644 Binary files a/audio/skill/xiuluo2.mp3 and b/audio/skill/xiuluo2.mp3 differ diff --git a/audio/skill/xuanfeng_boss_lvbu31.mp3 b/audio/skill/xuanfeng_boss_lvbu31.mp3 index cd34723fe..ae67b6fd8 100644 Binary files a/audio/skill/xuanfeng_boss_lvbu31.mp3 and b/audio/skill/xuanfeng_boss_lvbu31.mp3 differ diff --git a/audio/skill/xuanfeng_boss_lvbu32.mp3 b/audio/skill/xuanfeng_boss_lvbu32.mp3 index 8e8b786d3..aa202125c 100644 Binary files a/audio/skill/xuanfeng_boss_lvbu32.mp3 and b/audio/skill/xuanfeng_boss_lvbu32.mp3 differ diff --git a/audio/skill/yicong3.mp3 b/audio/skill/yicong3.mp3 deleted file mode 100644 index 4249c5363..000000000 Binary files a/audio/skill/yicong3.mp3 and /dev/null differ diff --git a/audio/skill/yicong4.mp3 b/audio/skill/yicong4.mp3 deleted file mode 100644 index 08a1ab9a2..000000000 Binary files a/audio/skill/yicong4.mp3 and /dev/null differ diff --git a/audio/skill/yijie1.mp3 b/audio/skill/yijie1.mp3 new file mode 100644 index 000000000..deb501c2a Binary files /dev/null and b/audio/skill/yijie1.mp3 differ diff --git a/audio/skill/yijie2.mp3 b/audio/skill/yijie2.mp3 new file mode 100644 index 000000000..de6f3efb7 Binary files /dev/null and b/audio/skill/yijie2.mp3 differ diff --git a/audio/skill/yongsi1.mp3 b/audio/skill/yongsi1.mp3 new file mode 100644 index 000000000..586766d9b Binary files /dev/null and b/audio/skill/yongsi1.mp3 differ diff --git a/audio/skill/yongsi11.mp3 b/audio/skill/yongsi11.mp3 deleted file mode 100644 index d8207e3de..000000000 Binary files a/audio/skill/yongsi11.mp3 and /dev/null differ diff --git a/audio/skill/yongsi12.mp3 b/audio/skill/yongsi12.mp3 deleted file mode 100644 index 86e32940e..000000000 Binary files a/audio/skill/yongsi12.mp3 and /dev/null differ diff --git a/audio/skill/yongsi2.mp3 b/audio/skill/yongsi2.mp3 new file mode 100644 index 000000000..8308a5744 Binary files /dev/null and b/audio/skill/yongsi2.mp3 differ diff --git a/audio/skill/yongsi21.mp3 b/audio/skill/yongsi21.mp3 deleted file mode 100644 index d8207e3de..000000000 Binary files a/audio/skill/yongsi21.mp3 and /dev/null differ diff --git a/audio/skill/yongsi22.mp3 b/audio/skill/yongsi22.mp3 deleted file mode 100644 index 86e32940e..000000000 Binary files a/audio/skill/yongsi22.mp3 and /dev/null differ diff --git a/audio/skill/youyi1.mp3 b/audio/skill/youyi1.mp3 new file mode 100644 index 000000000..96e9be648 Binary files /dev/null and b/audio/skill/youyi1.mp3 differ diff --git a/audio/skill/youyi2.mp3 b/audio/skill/youyi2.mp3 new file mode 100644 index 000000000..fd360162d Binary files /dev/null and b/audio/skill/youyi2.mp3 differ diff --git a/audio/skill/yuejian1.mp3 b/audio/skill/yuejian1.mp3 index 715a569a3..a61f37afb 100644 Binary files a/audio/skill/yuejian1.mp3 and b/audio/skill/yuejian1.mp3 differ diff --git a/audio/skill/yuejian2.mp3 b/audio/skill/yuejian2.mp3 index 91a255801..6e437b469 100644 Binary files a/audio/skill/yuejian2.mp3 and b/audio/skill/yuejian2.mp3 differ diff --git a/audio/skill/zhongjian1.mp3 b/audio/skill/zhongjian1.mp3 index 548180225..f2644666d 100644 Binary files a/audio/skill/zhongjian1.mp3 and b/audio/skill/zhongjian1.mp3 differ diff --git a/audio/skill/zhongjian2.mp3 b/audio/skill/zhongjian2.mp3 index c20c93e82..ba1abd585 100644 Binary files a/audio/skill/zhongjian2.mp3 and b/audio/skill/zhongjian2.mp3 differ diff --git a/audio/skill/zili3.mp3 b/audio/skill/zili3.mp3 deleted file mode 100644 index 327ad77c0..000000000 Binary files a/audio/skill/zili3.mp3 and /dev/null differ diff --git a/card/extra.js b/card/extra.js index 1fb1be66d..5fdfcdf0b 100644 --- a/card/extra.js +++ b/card/extra.js @@ -289,35 +289,55 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, recastable:true, ai:{ - wuxie:function(target,card,player,viewer){ - if(_status.event.getRand()<0.5) return 0; - if(player==game.me&&get.attitude(viewer,player)>0){ - return 0; - } + wuxie:(target,card,player,viewer, status)=>{ + if(status*get.attitude(viewer,player)>0&&!player.isMad() || target.hasSkillTag('nodamage') || target.hasSkillTag('nofire') || target.hasSkillTag('nothunder') || get.attitude(viewer,player)>0 || (1+target.countCards('hs'))*_status.event.getRand()>1.57) return 0; }, basic:{ - useful:4, - value:4, - order:7 + order:(item,player)=>{ + if(player.hasCard(card=>{ + return get.tag(card,'damage')&&game.hasNature(card)&&player.hasValueTarget(card); + },'hs')) return 7.3; + return 4.1; + }, + useful:1.2, + value:4 }, result:{ - target:function(player,target){ - if(target.isLinked()){ - if(target.hasSkillTag('link')) return 0; - var f=target.hasSkillTag('nofire'); - var t=target.hasSkillTag('nothunder'); - if(f&&t) return 0; - if(f||t) return 0.5; - return 2; + target:(player,target)=>{ + if(target.hasSkillTag('link')) return 0; + let curs = game.filterPlayer(current=>{ + if(current.hasSkillTag('nodamage')) return false; + return !current.hasSkillTag('nofire') || !current.hasSkillTag('nothunder'); + }); + if(curs.length<2) return 0; + let f = target.hasSkillTag('nofire'), + t = target.hasSkillTag('nothunder'), + res = 0.9; + if(f&&t || target.hasSkillTag('nodamage')) return 0; + if(f || t) res = 0.45; + if(target.getEquip('tengjia')) res *= 2; + if(!target.isLinked()) res = -res; + if(ui.selected.targets.length) return res; + let fs = 0, + es = 0, + att = get.attitude(player,target), + linkf = false, + alink = true; + curs.forEach(i=>{ + let atti = get.attitude(player,i); + if(atti>0){ + fs++; + if(i.isLinked()) linkf = true; + } + else if(atti<0){ + es++; + if(!i.isLinked()) alink = false; + } + }); + if(es<2&&!alink) { + if(att<=0 || att>0 && linkf && fs<2) return 0; } - if(get.attitude(player,target)>=0) return -0.9; - if(ui.selected.targets.length) return -0.9; - if(game.hasPlayer(function(current){ - return get.attitude(player,current)<=-1&¤t!=target&&!current.isLinked(); - })){ - return -0.9; - } - return 0; + return res; } }, tag:{ @@ -358,7 +378,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ result:{ target:function(player,target){ if(target.hasJudge('caomu')) return 0; - return -1.5/Math.sqrt(target.countCards('h')+1); + return -2.7/Math.sqrt(target.countCards('h')+1); } }, tag:{ @@ -433,10 +453,14 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return Math.max(0.1,equipValue-value); }, equipValue:function(card,player){ + if(player._tengjiaEv_temp) return Math.max(1,6-player.hp); if(player.hasSkillTag('maixie')&&player.hp>1) return 0; if(player.hasSkillTag('noDirectDamage')) return 10; - if(get.damageEffect(player,player,player,'fire')>=0) return 10; - var num=4-game.countPlayer(function(current){ + player._tengjiaEv_temp=true; + let eff=get.damageEffect(player,player,player,'fire'); + delete player._tengjiaEv_temp; + if(eff>=0) return 10; + let num=4-game.countPlayer(function(current){ if(get.attitude(current,player)<0){ if(current.hasSkillTag('fireAttack',null,null,true)) return 3; return 1; diff --git a/card/guozhan.js b/card/guozhan.js index e087fc6a0..a3ef0eda2 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -474,12 +474,13 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return; } else target.chooseControl('discard_card','take_damage',function(event,player){ - if(get.damageEffect(player,event.player,player,'thunder')>=0){ - return 'take_damage'; - } - if(player.hp>=3&&player.countCards('e')>=2){ - return 'take_damage'; - } + let eff=get.damageEffect(player,event.player,player,'thunder'); + if(eff>0) return 'take_damage'; + if(player.hasSkillTag('noe')) return 'discard_card'; + if(!eff) return 'take_damage'; + if(player.isDamaged()&&player.hasCard((card)=>get.name(card)=='baiyin'&&get.recoverEffect(player,player,_status.event.player)>0,'e')) return 'discard_card'; + if(player.hasCard((card)=>get.value(card,player)<=0,'e')&&!player.hasCard((card)=>get.value(card,player)>Math.max(7,12-player.hp),'e')) return 'discard_card'; + if(player.hp>2&&player.countCards('e')>2||player.hp>1&&player.countCards('e')>3) return 'take_damage'; return 'discard_card'; }).set('prompt','水淹七军').set('prompt2','请选择一项:⒈弃置装备区里的所有牌;⒉受到'+get.translation(player)+'造成的1点雷电伤害。'); 'step 1' @@ -497,12 +498,14 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ canLink:function(player,target,card){ if(!target.isLinked()||player.hasSkill('jueqing')||target.hasSkill('gangzhi')||player.hasSkill('gangzhi')) return false; - var es=target.countCards('e'); - if(!es) return true; - if(target.hp>=3&&es>=2){ - return true; + let es=target.getCards('e'),val=0; + if(!es.length) return true; + for(let i of es){ + if(i.name=='baiyin'&&target.isDamaged()&&get.recoverEffect(target)) val+=get.value({name:'tao'},target); + else val-=get.value(i,target); } - return false; + if(0.15*val>2*get.sgn(get.damageEffect(target,player,target,'thunder'))) return false; + return true; }, order:6, value:4, @@ -534,12 +537,14 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, result:{ target:function(player,target,card,isLink){ - if(isLink) return -1.5; - var es=target.getCards('e'); - if(!es.length) return -1.5; - var val=0; - for(var i of es) val+=get.value(i,target); - return -Math.min(1.5,val/5); + let es=target.getCards('e'), eff=2*get.sgn(get.damageEffect(target,player,target,'thunder')); + if(isLink || !es.length) return eff; + let val=0; + for(let i of es){ + if(i.name=='baiyin'&&target.isDamaged()&&get.recoverEffect(target)) val+=6; + else val-=get.value(i,target); + } + return Math.max(eff,0.15*val); } } } @@ -1531,7 +1536,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ target:target, card:card })) return; - if(get.tag(card,'natureDamage')) return 'zerotarget'; + if(get.tag(card,'natureDamage')) return 'zeroplayertarget'; if(card.name=='tiesuo'){ return [0,0]; } diff --git a/card/sp.js b/card/sp.js index 12a809800..2a00dc468 100644 --- a/card/sp.js +++ b/card/sp.js @@ -268,10 +268,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ multitarget:true, targetprompt:['给一张牌','得两张牌'], filterTarget:function(card,player,target){ - return target!=player; + return target!==player; }, - filterAddedTarget:function(card,player,target){ - return target!=player; + filterAddedTarget:function(card,player,target,preTarget){ + return target!==preTarget&&target!==player; }, content:function(){ 'step 0' @@ -313,21 +313,17 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, result:{ target:function(player,target){ - var ok=false; - var hs=player.getCards('h'); - if(hs.length<=1) return 0; - for(var i=0;i{ + return get.value(i)<5.5; + })) return 0; + let targets=get.copy(ui.selected.targets); + if(_status.event.preTarget) targets.add(_status.event.preTarget); + if(targets.length){ + if(target.hasSkillTag('nogain')) return 0.01; return 2; } - if(target.countCards('he')==0) return 0; + if(!target.countCards('he')) return 0; if(player.hasFriend()) return -1; return 0; } diff --git a/card/standard.js b/card/standard.js index 6c5c4b117..be39d7805 100644 --- a/card/standard.js +++ b/card/standard.js @@ -227,18 +227,18 @@ game.import('card',function(lib,game,ui,get,ai,_status){ var base=0,hit=false; if(get.cardtag(card,'yingbian_hit')){ hit=true; - if(targets.filter(function(target){ - return target.hasShan()&&get.attitude(viewer,target)<0&&get.damageEffect(target,player,viewer,get.nature(card))>0; + if(targets.some(target=>{ + return target.mayHaveShan(viewer)&&get.attitude(viewer,target)<0&&get.damageEffect(target,player,viewer,get.natureList(card))>0; })) base+=5; } - if(get.cardtag(card,'yingbian_all')){ + if(get.cardtag(card,'yingbian_add')){ if(game.hasPlayer(function(current){ return !targets.contains(current)&&lib.filter.targetEnabled2(card,player,current)&&get.effect(current,card,player,player)>0; })) base+=5; } if(get.cardtag(card,'yingbian_damage')){ - if(targets.filter(function(target){ - return get.attitude(player,target)<0&&(hit||!target.mayHaveShan()||player.hasSkillTag('directHit_ai',true,{ + if(targets.some(target=>{ + return get.attitude(player,target)<0&&(hit||!target.mayHaveShan(viewer)||player.hasSkillTag('directHit_ai',true,{ target:target, card:card, },true))&&!target.hasSkillTag('filterDamage',null,{ @@ -310,7 +310,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return 1; }, natureDamage:function(card){ - if(game.hasNature(card)) return 1; + if(game.hasNature(card,'linked')) return 1; }, fireDamage:function(card,nature){ if(game.hasNature(card,'fire')) return 1; @@ -372,7 +372,12 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ order:3, basic:{ - useful:[7,5.1,2], + useful:(card,i)=>{ + let player = _status.event.player, basic = [7, 5.1, 2], num = basic[Math.min(2, i)]; + if(player.hp>2&&player.hasSkillTag('maixie')) num *= 0.57; + if(player.getEquip('bagua') || player.getEquip('rewrite_bagua') || player.getEquip('renwang') || player.getEquip('rewrite_renwang')) num *= 0.8; + return num; + }, value:[7,5.1,2], }, result:{player:1}, @@ -406,12 +411,12 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, useful:(card,i)=>{ let player = _status.event.player; - if(player.isDamaged()&&!game.checkMod(card,player,'unchanged','cardEnabled2',player)) return 2/(1+i); + if(!game.checkMod(card,player,'unchanged','cardEnabled2',player)) return 2/(1+i); let fs = game.filterPlayer(current=>{ return get.attitude(player,current)>0&¤t.hp<=2; }), damaged = 0, needs = 0; fs.forEach(f=>{ - if(!lib.filter.cardSavable(card,player,f)) return; + if(f.hp>3 || !lib.filter.cardSavable(card,player,f)) return; if(f.hp>1) damaged++; else needs++; }); @@ -419,10 +424,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(needs+damaged>1 || player.hasSkillTag('maixie')) return 8; if(player.hp/player.maxHp<0.7) return 7+Math.abs(player.hp/player.maxHp-0.5); if(needs) return 7; - if(damaged) return Math.max(3,6.4-i); - return 6.8-Math.min(5,player.hp); + if(damaged) return Math.max(3,7.8-i); + return Math.max(1,7.2-i); }, - value:(card,player,i)=>{ + value:(card,player)=>{ let fs = game.filterPlayer(current=>{ return get.attitude(_status.event.player,current)>0; }), damaged = 0, needs = 0; @@ -431,12 +436,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(f.hp<=1) needs++; else if(f.hp==2) damaged++; }); - if(needs>2) return 11; - if(needs>1) return 10; - if(needs&&damaged || player.hasSkillTag('maixie')) return 9; + if(needs&&damaged || player.hasSkillTag('maixie')) return Math.max(9,5*needs+3*damaged); if(needs || damaged>1) return 8; if(damaged) return 7.5; - return Math.max(1,9.2-player.hp); + return Math.max(5,9.2-player.hp); } }, result:{ @@ -452,31 +455,28 @@ game.import('card',function(lib,game,ui,get,ai,_status){ let mode = get.mode(), taos = player.getCards('hs',i=>get.name(i)==='tao'&&lib.filter.cardEnabled(i,target,'forceEnable')); if(target.hp>0){ - let min = 7.2-1.2*Math.min(3,player.hp), + if(!player.isPhaseUsing()) return 0; + let min = 7.2-4*player.hp/player.maxHp, nd = player.needsToDiscard(-player.countCards('h',i=>!taos.includes(i)&&get.value(i)1&&(nd>1||nd&&player.hp<1+taos.length) || target.identity==='zhu'&&target.hp<3&&(mode==='identity'||mode==='versus'||mode==='chess')) return 2; - if(nd<3&&game.hasPlayer(current=>{ + keep = nd?0:2; + if(nd>2 || taos.length>1&&(nd>1||nd&&player.hp<1+taos.length) || target.identity==='zhu'&&(nd||target.hp<3)&&(mode==='identity'||mode==='versus'||mode==='chess') || !player.hasFriend()) return 2; + if(game.hasPlayer(current=>{ return player!==current&¤t.identity==='zhu'&¤t.hp<3&&(mode==='identity'||mode==='versus'||mode==='chess')&&get.attitude(player,current)>0; - })){ - nd=0; - keep=3; - } - else if(nd<2 || !player.isPhaseUsing()){ - if(nd<1) keep = 3; - else if(target.hp>=2&&taos.length<=target.hp/2) keep = 1; - } - if(keep){ - if(!nd || game.countPlayer(current=>{ - if(player!==current&¤t.hp<3&&player.hp>current.hp&&get.attitude(player,current)>2){ - keep += player.hp-current.hp; - return true; - } - return false; - })){ - if(keep>2) return 0; + })) keep = 3; + else if(nd===2||player.hp<2) return 2; + if(nd===2&&player.hp<=1) return 2; + if(keep===3) return 0; + if(taos.length<=player.hp/2) keep = 1; + if(keep&&game.countPlayer(current=>{ + if(player!==current&¤t.hp<3&&player.hp>current.hp&&get.attitude(player,current)>2){ + keep += player.hp-current.hp; + return true; } + return false; + })){ + if(keep>2) return 0; } + return 2; } if(target.isZhu2() || target===game.boss) return 2; if(player!==target){ @@ -718,11 +718,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ event.finish(); return; } - if(get.is.versus()){ + if(card.storage&&card.storage.chooseDirection||get.is.versus()){ player.chooseControl('顺时针','逆时针',function(event,player){ - if(player.next.side==player.side) return '逆时针'; + if(get.event('isVersus')&&player.next.side==player.side||get.attitude(player,player.next)>get.attitude(player,player.previous)) return '逆时针'; return '顺时针'; - }).set('prompt','选择'+get.translation(card)+'的结算方向'); + }).set('prompt','选择'+get.translation(card)+'的结算方向').set('isVersus',get.is.versus()); } else{ event.goto(2); @@ -768,7 +768,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ event.dialog=ui.dialogs[i];break; } } - if(!event.dialog){ + if(!event.dialog || event.dialog.buttons.length == 0){ event.finish(); return; } @@ -1168,26 +1168,21 @@ game.import('card',function(lib,game,ui,get,ai,_status){ } else{ var next=event.turn.chooseToRespond({name:'sha'}); - if(event.shaRequired>1){ - next.set('prompt2','共需打出'+event.shaRequired+'张杀') - } + if(event.shaRequired>1) next.set('prompt2','共需打出'+event.shaRequired+'张杀'); next.set('ai',function(card){ - var event=_status.event; - var player=event.splayer; - var target=event.starget; - if(player.hasSkillTag('notricksource')) return 0; - if(target.hasSkillTag('notrick')) return 0; + let event=_status.event,player=event.splayer,target=event.starget; + if(player.hasSkillTag('notricksource')||target.hasSkillTag('notrick')) return 0; if(event.shaRequired>1&&player.countCards('h','sha')=0||player.hasSkill('naman')) return -1; + if(get.attitude(target,player)<=0||event.player.hp<=1&&_status.event.tdamage<_status.event.pdamage){ return get.order(card); } return -1; } else{ - if(target.hasSkill('naman')) return -1; - if(get.attitude(player,target)<0||event.player.hp<=1&&get.damageEffect(target,player,event.player)>get.damageEffect(player,target,event.player)){ + if(_status.event.pdamage>=0||target.hasSkill('naman')) return -1; + if(get.attitude(player,target)<=0||event.player.hp<=1&&_status.event.tdamage>_status.event.pdamage){ return get.order(card); } return -1; @@ -1195,6 +1190,8 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }); next.set('splayer',player); next.set('starget',target); + next.set('pdamage',get.damageEffect(player,target,event.turn)); + next.set('tdamage',get.damageEffect(target,player,event.turn)); next.set('shaRequired',event.shaRequired); next.autochoose=lib.filter.autoRespondSha; if(event.turn==target){ @@ -1297,10 +1294,8 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return target.hasCard(card=>lib.filter.canBeGained(card,target,player),get.is.single()?'he':'hej'); }, content:function(){ - var position=get.is.single()?'he':'hej'; - if(target.countGainableCards(player,position)){ - player.gainPlayerCard(position,target,true); - } + let pos=get.is.single()?'he':'hej'; + if(target.countGainableCards(player,pos)) player.gainPlayerCard(pos, target, true).set('target',target).set('ai',lib.card.shunshou.ai.button); }, ai:{ wuxie:function(target,card,player,viewer){ @@ -1310,54 +1305,143 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, basic:{ order:7.5, - useful:4, - value:9 + useful:(card,i)=>8/(3+i), + value:(card,player)=>{ + let max=0; + game.countPlayer(cur=>{ + max=Math.max(max,lib.card.shunshou.ai.result.target(player,cur)*get.attitude(player,cur)); + }); + if(max<=0) return 2; + return 0.53*max; + } + }, + button:(button)=>{ + let player = _status.event.player, target = _status.event.target; + if(!lib.filter.canBeGained(button.link,player,target)) return 0; + let att = get.attitude(player, target), + val = get.value(button.link,player)/60, + btv = get.buttonValue(button), + pos = get.position(button.link), + name = get.name(button.link); + if(pos=='j'){ + if(name=='lebu'){ + let needs=target.needsToDiscard(2); + btv*=1.08+0.2*needs; + } + else if(name=='shandian'||name=='fulei'||name=='plague') btv/=2; + } + if(get.attitude(player,get.owner(button.link))>0) btv=-btv; + if(pos!='e'){ + if(pos=='h'&&!player.hasSkillTag('viewHandcard',null,target,true)) return btv+0.1; + return btv+val; + } + let sub = get.subtype(button.link); + if(sub=='equip1') return btv*Math.min(3.6,target.hp)/3; + if(sub=='equip2'){ + if(name=='baiyin'&&pos=='e'&&target.isDamaged()){ + let by=3-0.6*Math.min(5,target.hp); + return get.sgn(get.recoverEffect(target,player,player))*by; + } + return 1.57*btv+val; + } + if(att<=0&&(sub=='equip3'||sub=='equip4')&&(player.hasSkill('shouli')||player.hasSkill('psshouli'))) return 0; + if(sub=='equip3'&&!game.hasPlayer((cur)=>!cur.inRange(target)&&get.attitude(cur,target)<0)) return 0.4*btv+val; + if(sub=='equip4') return btv/2+val; + return btv+val; }, result:{ - target:function(player,target){ - const hs=target.getGainableCards(player,'h'); - const es=target.getGainableCards(player,'e'); - const js=target.getGainableCards(player,'j'); - - if(get.attitude(player,target)<=0){ - if(hs.length>0) return -1.5; - return (es.some(card=>{ - return get.value(card,target)>0&&card!=target.getEquip('jinhe'); - })||js.some(card=>{ - var cardj=card.viewAs?{name:card.viewAs}:card; - return get.effect(target,cardj,target,player)<0; - }))?-1.5:1.5; - } - return (es.some(card=>{ - return get.value(card,target)<=0; - })||js.some(card=>{ - var cardj=card.viewAs?{name:card.viewAs}:card; - return get.effect(target,cardj,target,player)<0; - }))?1.5:-1.5; - }, player:function(player,target){ - const hs=target.getGainableCards(player,'h'); - const es=target.getGainableCards(player,'e'); - const js=target.getGainableCards(player,'j'); - - const att=get.attitude(player,target); - if(att<0){ - if(!hs.length&&!es.some(card=>{ - return get.value(card,target)>0&&card!=target.getEquip('jinhe'); - })&&!js.some(card=>{ - var cardj=card.viewAs?{name:card.viewAs}:card; - return get.effect(target,cardj,target,player)<0; - })) return 0; + let att=get.attitude(player,target), + hs=target.hasCard((card)=>lib.filter.canBeGained(card,player,target),'h'), + lose=hs, + gain=att>0?0.52:1.28; + if(Math.abs(att)<5.03){ + let temp=0.015*att*att; + if(att<0) gain=0.9+temp; + else gain=0.9-temp; } - else if(att>1){ - return (es.some(card=>{ - return get.value(card,target)<=0; - })||js.some(card=>{ - var cardj=card.viewAs?{name:card.viewAs}:card; - return get.effect(target,cardj,target,player)<0; - }))?1.5:0; + target.countCards('e',function(card){ + if(card.name!='jinhe'&&lib.filter.canBeGained(card,player,target)&&att*get.value(card,target)<0){ + lose=true; + let val=get.value(card,player); + if(val>0) gain=Math.max(gain,val/7); + } + }); + target.countCards('j',function(card){ + let cardj=card.viewAs?new lib.element.VCard({name:card.viewAs}):card; + if(lib.filter.canBeGained(card,player,target)&&att*get.effect(target,cardj,target,target)<0){ + lose=true; + if(cardj.name=='lebu'){ + let needs=target.needsToDiscard(2); + if(att>0) gain=Math.max(gain,1.6+needs/10); + } + else if(cardj.name=='shandian'||cardj.name=='fulei'||cardj.name=='plague') gain=Math.max(gain,1.5/Math.max(1,target.hp)); + else if(att>0) gain=Math.max(gain,1.7); + } + }); + if(!lose) return 0; + return gain; + }, + target:function(player,target){ + let att=get.attitude(player,target), + hs=target.countCards('h',(card)=>lib.filter.canBeGained(card,player,target)), + es=target.countCards('e',(card)=>lib.filter.canBeGained(card,player,target)), + js=target.countCards('j',(card)=>lib.filter.canBeGained(card,player,target)), + noh=!hs||target.hasSkillTag('noh'), + noe=!es||target.hasSkillTag('noe'), + check=[-1,att>0?-1.3:1.3,att>0?-2.5:2.5], + idx=-1; + if(hs){ + idx=0; + if(noh) check[0]=0.7; } - return 1; + if(es){ + if(idx<0) idx=1; + if(target.getEquip('baiyin')&&target.isDamaged()&&lib.filter.canBeGained(target.getEquip('baiyin'),player,target)){ + let rec=get.recoverEffect(target,player,target); + if(es==1||att*rec>0){ + let val=3-0.6*Math.min(5,target.hp); + if(rec>0) check[1]=val; + else if(rec<0) check[1]=-val; + } + } + target.countCards('e',function(card){ + let val=get.value(card,target); + if(card.name=='jinhe'||att*val>=0||!lib.filter.canBeGained(card,player,target)) return false; + if(att>0){ + check[1]=Math.max(1.3,check[1]); + return true; + } + let sub=get.subtype(card); + if(sub=='equip2'||sub=='equip5') val+=4; + else if(sub=='equip1') val*=0.4*Math.min(3.6,target.hp); + else val*=0.6; + if(target.hp<3&&sub!='equip2'&&sub!='equip5') val*=0.4; + check[1]=Math.min(-0.16*val,check[1]); + }); + if(noe) check[1]+=0.9; + } + if(js){ + let func=function(num){ + if(att>0) check[2]=Math.max(check[2],num); + else check[2]=Math.min(check[2],0.6-num); + }; + if(idx<0) idx=2; + target.countCards('j',function(card){ + let cardj=card.viewAs?new lib.element.VCard({name:card.viewAs}):card; + if(!lib.filter.canBeGained(card,player,target)||att*get.effect(target,cardj,target,target)>=0) return false; + if(cardj.name=='lebu') func(2.1+0.4*target.needsToDiscard(2)); + else if(cardj.name=='bingliang') func(2.4); + else if(cardj.name=='shandian'||cardj.name=='fulei'||cardj.name=='plague') func(Math.abs(check[2])/(1+target.hp)); + else func(2.1); + }); + } + if(idx<0) return 0; + for(let i=idx+1;i<3;i++){ + if(i==1&&!es||i==2&&!js) continue; + if(att>0&&check[i]>check[idx]||att<=0&&check[i]{ if(status*get.attitude(viewer,player)>0&&!player.isMad() || target.hp>2&&!target.hasCard(i=>{ - return get.value(i,target)>3+Math.min(5,target.hp); + let val=get.value(i,target),subtypes=get.subtypes(i); + if(val<8&&target.hp<2&&!subtypes.includes('equip2')&&!subtypes.includes('equip5')) return false; + return val>3+Math.min(5,target.hp); },'e')&&target.countCards('h')*_status.event.getRand('guohe_wuxie')>1.57) return 0; }, basic:{ order:9, - useful:5, - value:5, + useful:(card,i)=>10/(3+i), + value:(card,player)=>{ + let max=0; + game.countPlayer(cur=>{ + max=Math.max(max,lib.card.guohe.ai.result.target(player,cur)*get.attitude(player,cur)); + }); + if(max<=0) return 5; + return 0.42*max; + } }, yingbian:function(card,player,targets,viewer){ if(get.attitude(viewer,player)<=0) return 0; @@ -1509,40 +1603,100 @@ game.import('card',function(lib,game,ui,get,ai,_status){ })) return 6; return 0; }, + button:(button)=>{ + let player = _status.event.player, target = _status.event.target; + if(!lib.filter.canBeDiscarded(button.link,player,target)) return 0; + let att = get.attitude(player, target), + val = get.buttonValue(button), + pos = get.position(button.link), + name = get.name(button.link); + if(pos==='j'){ + if(name==='lebu'){ + let needs=target.needsToDiscard(2); + val *= 1.08+0.2*needs; + } + else if(name=='shandian'||name=='fulei'||name=='plague') val /= 2; + } + if(get.attitude(player,get.owner(button.link))>0) val = -val; + if(pos!=='e') return val; + let sub = get.subtypes(button.link); + if(sub.includes('equip1')) return val*Math.min(3.6,target.hp)/3; + if(sub.includes('equip2')){ + if(name==='baiyin'&&pos==='e'&&target.isDamaged()){ + let by=3-0.6*Math.min(5,target.hp); + return get.sgn(get.recoverEffect(target,player,player))*by; + } + return 1.57*val; + } + if(att<=0&&(sub.includes('equip3')||sub.includes('equip4'))&&(player.hasSkill('shouli')||player.hasSkill('psshouli'))) return 0; + if(sub.includes('equip6')) return val; + if(sub.includes('equip4')) return val/2; + if(sub.includes('equip3')&&!game.hasPlayer((cur)=>{ + return !cur.inRange(target)&&get.attitude(cur,target)<0; + })) return 0.4*val; + return val; + }, result:{ target:function(player,target){ - const att=get.attitude(player,target); - const hs=target.getDiscardableCards(player,'h'); - const es=target.getDiscardableCards(player,'e'); - const js=target.getDiscardableCards(player,'j'); - if(!hs.length&&!es.length&&!js.length) return 0; - if(att>0){ - if(js.some(card=>{ - const cardj=card.viewAs?{name:card.viewAs}:card; - return get.effect(target,cardj,target,player)<0; - })) return 3; - if(target.isDamaged()&&es.some(card=>card.name=='baiyin')&& - get.recoverEffect(target,player,player)>0){ - if(target.hp==1&&!target.hujia) return 1.6; + let att=get.attitude(player, target), + hs=target.countCards('h',(card)=>lib.filter.canBeDiscarded(card,player,target)), + es=target.countCards('e',(card)=>lib.filter.canBeDiscarded(card,player,target)), + js=target.countCards('j',(card)=>lib.filter.canBeDiscarded(card,player,target)), + noh=!hs||target.hasSkillTag('noh'), + noe=!es||target.hasSkillTag('noe'), + check=[-1,att>0?-1.3:1.3,att>0?-2.5:2.5], + idx=-1; + if(hs){ + idx=0; + if(noh) check[0]=0.7; + } + if(es){ + if(idx<0) idx=1; + if(target.getEquip('baiyin')&&target.isDamaged()&&lib.filter.canBeDiscarded(target.getEquip('baiyin'),player,target)){ + let rec=get.recoverEffect(target,player,target); + if(es==1||att*rec>0){ + let val=3-0.6*Math.min(5,target.hp); + if(rec>0) check[1]=val; + else if(rec<0) check[1]=-val; + } } - if(es.some(card=>{ - return get.value(card,target)<0; - })) return 1; - return -1.5; + target.countCards('e',function(card){ + let val=get.value(card,target); + if(card.name=='jinhe'||att*val>=0||!lib.filter.canBeDiscarded(card,player,target)) return false; + if(att>0){ + check[1]=Math.max(1.3,check[1]); + return true; + } + let sub=get.subtype(card); + if(sub=='equip2'||sub=='equip5') val+=4; + else if(sub=='equip1') val*=0.4*Math.min(3.6,target.hp); + else val*=0.6; + if(target.hp<3&&sub!='equip2'&&sub!='equip5') val*=0.4; + check[1]=Math.min(-0.16*val,check[1]); + }); + if(noe) check[1]+=0.9; } - else{ - const noh=(hs.length==0||target.hasSkillTag('noh')); - const noe=(es.length==0||target.hasSkillTag('noe')); - const noe2=(noe||!es.some(card=>{ - return get.value(card,target)>0; - })); - const noj=(js.length==0||!js.some(card=>{ - const cardj=card.viewAs?{name:card.viewAs}:card; - return get.effect(target,cardj,target,player)<0; - })) - if(noh&&noe2&&noj) return 1.5; - return -1.5; + if(js){ + let func=function(num){ + if(att>0) check[2]=Math.max(check[2],num); + else check[2]=Math.min(check[2],0.6-num); + }; + if(idx<0) idx=2; + target.countCards('j',function(card){ + let cardj=card.viewAs?new lib.element.VCard({name:card.viewAs}):card; + if(!lib.filter.canBeDiscarded(card,player,target)||att*get.effect(target,cardj,target,target)>=0) return false; + if(cardj.name=='lebu') func(2.1+0.4*target.needsToDiscard(2)); + else if(cardj.name=='bingliang') func(2.4); + else if(cardj.name=='shandian'||cardj.name=='fulei'||cardj.name=='plague') func(Math.abs(check[2])/(1+target.hp)); + else func(2.1); + }); } + if(idx<0) return 0; + for(let i=idx+1;i<3;i++){ + if(i==1&&!es||i==2&&!js) continue; + if(att>0&&check[i]>check[idx]||att<=0&&check[i]{ + if(!target.hasSkillTag('noe')&&get.attitude(player,target)>0) return 0; + return (player.hasSkillTag('noe')?0.32:0.15)*target.getEquips(1).reduce((num,i)=>{ + return num+get.value(i,player); + },0); }, + target:(player,target)=>{ + let targets=get.copy(ui.selected.targets); + if(_status.event.preTarget) targets.add(_status.event.preTarget); + if(targets.length){ + let preTarget=targets.lastItem,pre=_status.event.getTempCache('jiedao_result',preTarget); + if(pre&&pre.target.isIn()) return target===pre.target?pre.eff:0; + return get.effect(target,{name:'sha'},preTarget,player)/get.attitude(player,target); + } + let arms=(target.hasSkillTag('noe')?0.32:-0.15)*target.getEquips(1).reduce((num,i)=>{ + return num+get.value(i,target); + },0); + if(!target.mayHaveSha(player,'use')) return arms; + let sha=game.filterPlayer(get.info({name:'jiedao'}).filterAddedTarget),addTar=null; + sha=sha.reduce((num,current)=>{ + let eff=get.effect(current,{name:'sha'},target,player); + if(eff<=num) return num; + addTar=current; + return eff; + },-100); + if(!addTar) return arms; + sha/=get.attitude(player,target); + _status.event.putTempCache('jiedao_result',target,{ + target:addTar, + eff:sha + }); + return Math.max(arms,sha); + } }, tag:{ gain:1, @@ -1795,14 +1977,18 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, result:{ ignoreStatus:true, - target:function(player,target){ - var num=target.hp-target.countCards('h')-2; - if(num>-1) return -0.01; - if(target.hp<3) num--; - if(target.isTurnedOver()) num/=2; - var dist=get.distance(player,target,'absolute'); + target:(player,target)=>{ + if(target===_status.currentPhase&&target.skipList.includes('phaseUse')){ + let evt=_status.event.getParent('phase'); + if(evt&&evt.phaseList.indexOf('phaseJudge')<=evt.num) return 0; + } + let num=target.needsToDiscard(3),cf=Math.pow(get.threaten(target,player),2); + if(!num) return -0.01*cf; + if(target.hp>2) num--; + let dist=Math.sqrt(get.distance(player,target,'absolute')); if(dist<1) dist=1; - return num/Math.sqrt(dist)*get.threaten(target,player); + if(target.isTurnedOver()) dist++; + return Math.min(-0.1,-num)*cf/dist; } }, tag:{ @@ -2050,7 +2236,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target){ - if(target.hasSkillTag('unequip2')) return; + if(typeof card!=='object'||target.hasSkillTag('unequip2')) return; if(player.hasSkillTag('unequip',false,{ name:card?card.name:null, target:target, @@ -2060,7 +2246,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ target:target, card:card })) return; - if(card.name=='sha'&&get.color(card)=='black') return 'zerotarget'; + if(card.name=='sha'&&get.color(card)=='black') return 'zeroplayertarget'; } } } diff --git a/card/yingbian.js b/card/yingbian.js index 288f64211..f00b13dd4 100644 --- a/card/yingbian.js +++ b/card/yingbian.js @@ -19,18 +19,21 @@ game.import('card',function(lib,game,ui,get,ai,_status){ defaultYingbianEffect:'add', content:function(){ var dist=get.distance(player,target); - if(dist>1||card.yingbian_all) player.discardPlayerCard(target,'hej',true); - if(dist<=1||card.yingbian_all) player.gainPlayerCard(target,'hej',true); + if(dist>1||card.yingbian_all) player.discardPlayerCard(target,'hej',true).set('target',target).set('ai',lib.card.guohe.ai.button); + if(dist<=1||card.yingbian_all) player.gainPlayerCard(target,'hej',true).set('target',target).set('ai',lib.card.shunshou.ai.button); }, fullskin:true, postAi:function(targets){ return targets.length==1&&targets[0].countCards('j'); }, ai:{ - wuxie:function(target,card,player,viewer){ - if(get.attitude(viewer,player)>0&&get.attitude(viewer,target)>0){ - return 0; - } + wuxie:function(target,card,player,viewer,status){ + if(status*get.attitude(viewer,player)>0&&!player.isMad()) return 0; + if(!card.yingbian_all&&get.distance(player,target)>1&&!target.hasCard(i=>{ + let val=get.value(i,target),subtypes=get.subtypes(i); + if(val<8&&target.hp<2&&!subtypes.includes('equip2')&&!subtypes.includes('equip5')) return false; + return val>3+Math.min(5,target.hp); + },'e')&&target.countCards('h')*_status.event.getRand('guohe_wuxie')>1.57) return 0; }, yingbian:function(card,player,targets,viewer){ if(get.attitude(viewer,player)<=0) return 0; @@ -60,8 +63,18 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, basic:{ order:7.5, - useful:4, - value:9 + useful:(card,i)=>9.6/(2+i), + value:(card,player)=>{ + let max=0; + game.countPlayer(cur=>{ + let dist=get.distance(player,cur); + if(dist>1||card.yingbian_all) max=Math.max(max,lib.card.shunshou.ai.result.target(player,cur)*get.attitude(player,cur)); + else max=Math.max(max,lib.card.guohe.ai.result.target(player,cur)*get.attitude(player,cur)); + }); + if(max<=0) return 7; + if(card.yingbian_all) return 0.75*max; + return 0.6*max; + } }, result:{ target:function(player,target){ @@ -238,7 +251,6 @@ game.import('card',function(lib,game,ui,get,ai,_status){ fullskin:true, type:'equip', subtype:'equip5', - loseDelay:false, skills:['tianjitu_skill'], onLose:function(){ player.addTempSkill('tianjitu_skill_lose') @@ -582,46 +594,43 @@ game.import('card',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ player:function(card,player,target){ - if(typeof card!='object'||!target||get.name(card)!='sha'&&(get.type(card)!='trick'||(get.color(card)!='black'&&!get.tag(card,'damage')))) return; - var info=get.info(card); - var targets=[]; + if(typeof card!=='object'||!target||get.name(card)!=='sha'&&(get.type(card)!=='trick'||get.color(card)!=='black'&&!get.tag(card,'damage'))) return; + if(!target.hasSkill('heiguangkai_skill')||target.hasSkillTag('unequip2')||player.hasSkillTag('unequip',false,{ + name:card?card.name:null, + target:target, + card:card, + })||player.hasSkillTag('unequip_ai',false,{ + name:card?card.name:null, + target:target, + card:card, + })) return; + let targets=[],evt=_status.event.getParent('useCard'); targets.addArray(ui.selected.targets); - var evt=_status.event.getParent('useCard'); if(evt&&evt.card==card) targets.addArray(evt.targets); if(targets.length){ - if(!targets.contains(target)){ - if(target.hasSkill('heiguangkai_skill')&&!target.hasSkillTag('unequip2')&&!player.hasSkillTag('unequip',false,{ - name:card?card.name:null, - target:target, - card:card, - })&&!player.hasSkillTag('unequip_ai',false,{ - name:card?card.name:null, - target:target, - card:card, - })) return 'zerotarget'; - } - else{ - if(targets.length>1) return; - if(info.selectTarget!=-1&&targets[0].hasSkill('heiguangkai_skill')&&!targets[0].hasSkillTag('unequip2')&&!player.hasSkillTag('unequip',false,{ - name:card?card.name:null, - target:targets[0], - card:card, - })&&!player.hasSkillTag('unequip_ai',false,{ - name:card?card.name:null, - target:targets[0], - card:card, - })) return 'zerotarget'; - } + if(targets.length>1||!targets.includes(target)) return 'zeroplayertarget'; + return; } - if(target.hasSkill('heiguangkai_skill')&&!target.hasSkillTag('unequip2')&&!player.hasSkillTag('unequip',false,{ - name:card?card.name:null, - target:target, - card:card, - })&&!player.hasSkillTag('unequip_ai',false,{ - name:card?card.name:null, - target:target, - card:card, - })) return [1,0,0.7,0]; + let info=get.info(card); + if(!info||info.notarget||!info.filterTarget) return; + let range,select=get.copy(info.selectTarget),filter; + if(select===undefined) 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[1]<-1) range=[1, 1]; + else if(range[0]<0){ + if(info.filterTarget===true) filter=game.players.length; + else filter=game.countPlayer(current=>{ + return info.filterTarget(card,player,current); + }); + range=[filter,filter]; + } + if(!range) return; + if(range[0]>1&&range[1]>1) return 'zeroplayertarget'; + return [1,0,0.7,0]; }, }, }, diff --git a/card/yongjian.js b/card/yongjian.js index f37ec87f7..c01819e63 100644 --- a/card/yongjian.js +++ b/card/yongjian.js @@ -561,13 +561,13 @@ game.import('card',function(lib,game,ui,get,ai,_status){ prompt:'是否发动【赠毒】?', prompt2:'将本次获得的【毒】交给其他角色', ai1:function(card){ - var player = _status.event.player; - if(player.hasSkillTag("usedu")||get.effect(player,{name: "losehp"}, player, player)>0) return 0; + var player=get.player(); + if(['usedu','keepdu'].some(tag=>player.hasSkillTag(tag))||get.effect(player,{name:"losehp"},player,player)>0) return 0; if(!ui.selected.cards.length) return 1; return 0; }, ai2:function(target){ - if (target.hasSkillTag("usedu")) return get.attitude(_status.event.player,target)-0.01; + if(['usedu','keepdu'].some(tag=>target.hasSkillTag(tag))) return get.attitude(_status.event.player,target)-0.01; return -get.attitude(_status.event.player,target)+0.01; }, }); diff --git a/card/yunchou.js b/card/yunchou.js index 60b18712e..c4713cb59 100644 --- a/card/yunchou.js +++ b/card/yunchou.js @@ -841,15 +841,17 @@ game.import('card',function(lib,game,ui,get,ai,_status){ nothunder:true, effect:{ target:function(card,player,target,current){ + if(target.hasSkillTag('unequip2')) return; if(player.hasSkillTag('unequip',false,{ name:card?card.name:null, target:player, card:card + })||player.hasSkillTag('unequip_ai',false,{ + name:card?card.name:null, + target:target, + card:card })) return; - if(get.tag(card,'natureDamage')) return 'zerotarget'; - if(card.name=='tiesuo'){ - return [0,0]; - } + if(card.name=='tiesuo'||get.tag(card,'natureDamage')) return 'zeroplayertarget'; } } } diff --git a/card/zhulu.js b/card/zhulu.js index 886d7ee99..5b76a4d35 100644 --- a/card/zhulu.js +++ b/card/zhulu.js @@ -48,7 +48,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ return get.type(card)=='equip'&&!cards.contains(card); }); if(cardx) cards.push(cardx); - }; + } if(!cards.length){ event.finish(); event.getParent().excluded.addArray(game.players); @@ -115,11 +115,11 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(dialog.buttons[i].link==card){ button=dialog.buttons[i]; button.querySelector('.info').innerHTML=function(target){ - if(target._tempTranslate) return target._tempTranslate; - var name=target.name; - if(lib.translate[name+'_ab']) return lib.translate[name+'_ab']; - return get.translation(name); - }(target); + if(target._tempTranslate) return target._tempTranslate; + var name=target.name; + if(lib.translate[name+'_ab']) return lib.translate[name+'_ab']; + return get.translation(name); + }(target); dialog.buttons.remove(button); break; } @@ -701,7 +701,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ player.$throw(card); game.log(card,'进入了弃牌堆'); delete _status.jinhe[es[i].cardid]; - }; + } } game.broadcastAll(function(jinhe){ _status.jinhe=jinhe; @@ -784,7 +784,10 @@ game.import('card',function(lib,game,ui,get,ai,_status){ name:card?card.name:null, target:target, card:card - })) return false; + })){ + const cards=player.getEquips('yexingyi'); + if(player.hasSkill('yexingyi_skill',null,false)||!card.cards||!cards.some(cardx=>card.cards.includes(cardx)||ui.selected.cards.includes(cardx))) return false; + } }, }, }, diff --git a/character/clan.js b/character/clan.js index 61c3cbe2f..706833aee 100644 --- a/character/clan.js +++ b/character/clan.js @@ -204,16 +204,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.target=target; var list=[]; for(var name of lib.inpile){ + if(name!='sha'&&get.type(name)!='trick') continue; if(trigger.card.name=='sha'&&get.type(name)!='trick') continue; - if(name=='sha'&&get.type(trigger.card.name)!='trick') continue; + if(name=='sha'&&get.type(trigger.card)!='trick') continue; if(!player.canUse(get.autoViewAs({name:name},[]),target)) continue; list.push([get.translation(get.type(name)),'',name]); - if(name=='sha'){ - for(var nature of lib.inpile_nature){ - if(!player.canUse(get.autoViewAs({name:name,nature,nature},[]),target)) continue; - list.push([get.translation(get.type(name)),'',name,nature]); - } - } } if(!list.length) event.goto(3); else{ @@ -669,6 +664,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ init:function(player){ player.addSkill('clanmingjie_record'); }, + initSkill:function(skill){ + if(!lib.skill[skill]){ + lib.skill[skill]={ + charlotte:true, + mark:true, + marktext:'戒', + intro:{content:'已被$指定为【铭戒】目标'}, + }; + lib.translate[skill]='铭戒'; + lib.translate[skill+'_bg']='戒'; + } + }, onremove:function(player){ player.removeSkill('clanmingjie_record'); }, @@ -676,23 +683,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', limited:true, filterTarget:function(card,player,target){ - return !player.getStorage('clanmingjie_effect').contains(target); + return !target.hasSkill('clanmingjie_'+player.playerid); }, skillAnimation:true, animationColor:'thunder', content:function(){ - 'step 0' player.awakenSkill('clanmingjie'); player.addSkill('clanmingjie_effect'); - player.markAuto('clanmingjie_effect',[target]); - target.addSkill('clanmingjie_mark'); - target.markAuto('clanmingjie_mark',[player]); + var skill='clanmingjie_'+player.playerid; + game.broadcastAll(lib.skill.clanmingjie.initSkill,skill); + target.addTempSkill(skill,{player:'phaseAfter'}); + target.storage[skill]=player; }, ai:{ order:10, result:{ target:function(player,target){ - if(player.getStorage('clanmingjie_effect').contains(target)) return 0; if(player.hasSkill('clanzhongliu')||player.hp==1){ if(!player.hasCard(card=>{ var info=get.info(card); @@ -715,7 +721,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } return get.sgnAttitude(player,target); }, - } + }, }, subSkill:{ effect:{ @@ -727,8 +733,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var info=get.info(card); if(info.allowMultiple==false) return false; if(event.targets&&!info.multitarget){ - return player.getStorage('clanmingjie_effect').some(current=>{ - return current.isIn()&&!event.targets.contains(current)&&lib.filter.targetEnabled2(card,player,current)&&lib.filter.targetInRange(card,player,current); + return game.filterPlayer().some(current=>{ + if(!current.hasSkill('clanmingjie_'+player.playerid)) return false; + return !event.targets.contains(current)&&lib.filter.targetEnabled2(card,player,current)&&lib.filter.targetInRange(card,player,current); }); } return false; @@ -738,7 +745,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' player.chooseTarget(get.prompt('clanmingjie_effect'),'令任意【铭戒】目标角色成为'+get.translation(trigger.card)+'的目标',function(card,player,target){ var trigger=_status.event.getTrigger(); - if(trigger.targets.contains(target)||!target.isIn()||!player.getStorage('clanmingjie_effect').contains(target)) return false; + if(trigger.targets.contains(target)||!target.isIn()||!target.hasSkill('clanmingjie_'+player.playerid)) return false; return lib.filter.targetEnabled2(trigger.card,player,target)&&lib.filter.targetInRange(trigger.card,player,target); },[1,Infinity]).set('ai',function(target){ var player=_status.event.player; @@ -754,14 +761,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, group:'clanmingjie_targeted', - intro:{content:'使用牌时可以额外指定$为目标'}, }, targeted:{ charlotte:true, trigger:{global:'phaseEnd'}, filter:function(event,player){ - if(!player.getStorage('clanmingjie_effect').contains(event.player)) return false; - return event.player!=player||!player.getHistory('useSkill',evt=>evt.skill=='clanmingjie'&&evt.targets[0]==player).length; + var cards=player.getStorage('clanmingjie_record').slice(); + cards=cards.filterInD('d'); + if(!cards.length) return false; + var history=player.getHistory('useSkill',evt=>evt.skill=='clanmingjie'); + if(history.length){ + var targets=history.reduce((list,evt)=>list.addArray(evt.targets),[]); + if(event.player!=player&&targets.includes(event.player)) return true; + } + if(player.actionHistory.length>=2){ + for(var i=player.actionHistory.length-2;i>=0;i--){ + if(!player.actionHistory[i].isMe) continue; + var history2=player.actionHistory[i].useSkill.filter(evt=>evt.skill=='clanmingjie'); + if(history2.length){ + var targets2=history2.reduce((list,evt)=>list.addArray(evt.targets),[]); + if(targets2.includes(event.player)) return true; + } + break; + } + } + return false; }, forced:true, popup:false, @@ -769,10 +793,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' var cards=player.getStorage('clanmingjie_record').slice(); cards=cards.filterInD('d'); - if(cards.length){ - event.cards=cards; - } - else event.goto(4); + event.cards=cards; 'step 1' player.chooseButton(['铭戒:是否使用这些牌?',cards]).set('filterButton',button=>{ return _status.event.player.hasUseTarget(button.link); @@ -787,24 +808,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.delayx(); player.chooseUseTarget(card,true); } - else event.goto(4); + else event.finish(); 'step 3' if(event.cards.filter(card=>{ return get.position(card,true)=='d'&&player.hasUseTarget(card); }).length) event.goto(1); - 'step 4' - player.unmarkAuto('clanmingjie_effect',[trigger.player]); - trigger.player.unmarkAuto('clanmingjie_mark',[player]); - 'step 5' - if(!player.getStorage('clanmingjie_effect').length) player.removeSkill('clanmingjie_effect'); - if(!trigger.player.getStorage('clanmingjie_mark').length) player.removeSkill('clanmingjie_mark'); }, }, - mark:{ - charlotte:true, - marktext:'戒', - intro:{content:'已被$指定为【铭戒】目标'}, - }, record:{ charlotte:true, trigger:{ @@ -1178,6 +1188,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ delete player.storage[skill+'_roundcount']; resetSkills.add(skill); } + if(player.storage[`temp_ban_${skill}`]){ + delete player.storage[`temp_ban_${skill}`]; + } if(player.awakenedSkills.contains(skill)){ player.restoreSkill(skill); resetSkills.add(skill); @@ -2636,7 +2649,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clanjiexuan:'解悬', clanjiexuan_info:'限定技,转换技。阴:你可以将一张红色牌当【顺手牵羊】使用;阳:你可以将一张黑色牌当【过河拆桥】使用。', clanmingjie:'铭戒', - clanmingjie_info:'限定技。出牌阶段,你可以选择一名角色,然后直到其下回合结束时,当你使用牌时你可以指定其为额外目标。然后其下回合结束时,你可以使用本回合使用过的黑桃牌和被抵消过的牌。', + clanmingjie_info:'限定技。出牌阶段,你可以选择一名角色,然后你获得此下效果:①你使用牌时你可以指定其为额外目标直到其下个回合结束。②其下个回合结束时(若该角色为你则改为你的下下个回合结束时),你可以使用本回合使用过的黑桃牌和被抵消过的牌。', clan_wanghun:'族王浑', clanfuxun:'抚循', clanfuxun_info:'出牌阶段限一次。你可以获得或交给一名其他角色一张手牌,然后若其手牌数与你相等且于此阶段仅以此法获得或失去过牌,你可以将一张牌当任意基本牌使用。', diff --git a/character/collab.js b/character/collab.js index d159b30ea..cc55af7b4 100644 --- a/character/collab.js +++ b/character/collab.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'collab', connect:true, character:{ + nezha:['male','qun',2,['dcsantou','dcfaqi']], dc_caocao:['male','wei',4,['dcjianxiong']], dc_liubei:['male','shu',4,['dcrende']], dc_sunquan:['male','wu',4,['dczhiheng']], @@ -20,7 +21,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_fuhuanghou:['female','qun',3,['spcangni','spmixin']], sp_fuwan:['male','qun',3,['spfengyin','spchizhong']], old_lingju:['female','qun',3,['jieyuan','fenxin_old']], - sp_mushun:['male','qun',4,['dcmoukui']], + sp_mushun:['male','qun',4,['moukui']], }, characterFilter:{ old_lingju:function(mode){ @@ -33,10 +34,134 @@ 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'], + collab_remake:['dc_caocao','dc_liubei','dc_sunquan','nezha'], }, }, skill:{ + //哪吒 + dcsantou:{ + audio:2, + trigger:{player:'damageBegin4'}, + forced:true, + group:'dcsantou_gain', + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + var source=trigger.source; + trigger.cancel(); + var hp=player.getHp(); + var lose=false; + if(hp>=3){ + if(player.hasHistory('useSkill',evt=>{ + var evtx=evt.event; + return evt.skill=='dcsantou'&&evtx.getTrigger().source==source&&evtx.getParent(2)!=trigger; + })) lose=true; + } + else if(hp==2){ + if(trigger.hasNature()) lose=true; + } + else if(hp==1){ + if(trigger.card&&get.color(trigger.card)=='red') lose=true; + } + if(lose) player.loseHp(); + }, + subSkill:{ + gain:{ + audio:'dcsantou', + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + filter:function(event,player){ + if(player.maxHp>=3) return false; + return (event.name!='phase'||game.phaseNumber==0); + }, + content:function*(event,map){ + var player=map.player; + yield player.gainMaxHp(3-player.maxHp); + var num=3-player.getHp(true); + if(num>0) player.recover(num); + } + } + }, + ai:{ + filterDamage:true, + skillTagFilter:function(player,tag,arg){ + if(arg&&arg.player&&arg.player.hasSkillTag('jueqing',false,player)) return false; + }, + effect:{ + target:function(card,player,target){ + if(player.hasSkillTag('jueqing',false,target)) return; + if(player._dcsantou_temp) return; + if(get.tag(card,'damage')){ + const hp=target.getHp(); + if(hp>=3){ + if(target.hasHistory('useSkill',evt=>evt.skill=='dcsantou'&&evt.event.getTrigger().source==player)) return [1,-2]; + else if(get.attitude(player,target)<0){ + if(card.name=='sha') return; + let sha=false; + player._dcsantou_temp=true; + let num=player.countCards('h',card=>{ + if(card.name=='sha'){ + if(sha) return false; + else sha=true; + } + return get.tag(card,'damage')&&player.canUse(card,target)&&get.effect(target,card,player,player)>0; + }); + delete player._dcsantou_temp; + if(player.hasSkillTag('damage')){ + num++; + } + if(num<2){ + var enemies=player.getEnemies(); + if(enemies.length==1&&enemies[0]==target&&player.needsToDiscard()){ + return; + } + return 0; + } + } + } + else if(hp==2&&get.tag(card,'natureDamage')||hp==1&&get.color(card)=='red'&&get.itemtype(card)=='card') return [1,-2]; + else return 0; + } + } + } + }, + }, + dcfaqi:{ + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + if(get.type(event.card)!='equip') return false; + if(!player.isPhaseUsing()) return false; + for(const name of lib.inpile){ + if(get.type(name)!='trick') continue; + if(!player.hasStorage('dcfaqi',name)&&player.hasUseTarget({name:name,isCard:true})) return true; + } + return false; + }, + direct:true, + content:function*(event,map){ + var player=map.player; + var list=get.inpileVCardList(info=>{ + if(info[0]!='trick') return false; + var name=info[2]; + return !player.hasStorage('dcfaqi',name)&&player.hasUseTarget({name:name,isCard:true}); + }); + if(list.length){ + var result=yield player.chooseButton(['法器:视为使用一张普通锦囊牌',[list,'vcard']],true).set('ai',button=>{ + return get.player().getUseValue({name:button.link[2]}); + }); + if(result.bool){ + var name=result.links[0][2]; + if(!player.storage.dcfaqi) player.when({global:'phaseAfter'}).then(()=>delete player.storage.dcfaqi); + player.markAuto('dcfaqi',name); + player.chooseUseTarget({name:name,isCard:true},true,false).logSkill='dcfaqi'; + } + } + else event.finish(); + } + }, //隅泣曹操 dcjianxiong:{ audio:'rejianxiong', @@ -359,8 +484,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return card!=card2&&get.number(card2,player){ + return get.is.yayun(get.translation(card.name),get.translation(history[history.length-1].card.name)); + }),'dcshixian_yayun'); } }, + onremove:function(player){ + player.removeSkill('dcshixian_yayun'); + player.removeGaintag('dcshixian_yayun'); + }, + subSkill:{ + yayun:{ + charlotte:true, + trigger:{player:'useCard1'}, + filter:function(event,player){ + return player.countCards('h'); + }, + direct:true, + priority:11+45+14+19+19+810, + content:function(){ + 'step 0' + player.removeGaintag('dcshixian_yayun'); + 'step 1' + player.addGaintag(player.getCards('h',card=>{ + return get.is.yayun(get.translation(card.name),get.translation(trigger.card.name)); + }),'dcshixian_yayun'); + }, + }, + }, }, //龙王 dclonggong:{ @@ -819,11 +950,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.isIn()){ var num=target.countCards('e'); if(num>0){ - player.discardPlayerCard(target,true,'e',num) + player.discardPlayerCard(target,true,'e',num) } else{ - target.loseHp(); - game.delayex(); + target.loseHp(); + game.delayex(); } } if(targets.length>0) event.redo(); @@ -860,11 +991,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.line(target,'green'); var num=target.countCards('h'); if(num>0){ - player.discardPlayerCard(target,true,'h',num) + player.discardPlayerCard(target,true,'h',num) } else{ - target.loseHp(); - game.delayex(); + target.loseHp(); + game.delayex(); } } }, @@ -1281,9 +1412,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - player.chooseDrawRecover('###'+get.prompt('spcangni')+'###摸两张牌或回复1点体力,然后将武将牌翻面',2).set('ai',function(){ - return 'cancel2'; - }).logSkill='spcangni'; + player.chooseDrawRecover('###'+get.prompt('spcangni')+'###摸两张牌或回复1点体力,然后将武将牌翻面',2).logSkill='spcangni'; 'step 1' if(result.control!='cancel2') player.turnOver(); }, @@ -1479,6 +1608,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(stat==0) return Math.random()<0.7; return false; } + return false; }, prompt:function(event,player){ return '焚心:是否与'+get.translation(event.player)+'交换身份?'; @@ -1508,6 +1638,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jiben:'吉本(?—218年),东汉末年太医令。建安二十三年春正月,时金祎自以世为汉臣,睹汉祚将移,谓可季兴,乃喟然发愤,遂与太医令本、少府耿纪、司直韦晃、本子邈、邈弟穆等结谋攻许,杀曹公长史王必,南援刘备。后必营,必与典农中郎将严匡讨斩之。在《三国演义》中,吉本在此为吉平或吉太,因字称平,故又唤作吉平。曾参与董承等人刺杀曹操的计划,并企图在为曹操治病时毒死曹操,但被曹操识破而遭处刑。之后其子吉邈和吉穆都参与了由耿纪和韦晃等人所发动的反叛曹操的行动,但都失败被杀。', xiaoyuehankehan:'小约翰可汗,知乎答主,bilibili知识区up主,其视频以介绍冷门国家和名人为主,因其视频极具特色的幽默风格而知名。代表作包括《奇葩小国》系列和《硬核狠人》系列。昵称里的“小约翰”来源于《纸牌屋》里的主角弗朗西斯·厄克特的外号Little John。家乡在内蒙古通辽市,在《奇葩小国》系列视频中,介绍小国面积和人口时,常用通辽市的面积和人口作为计量单位,后简化为T。1T=6万平方公里或287万人(如:阿富汗面积约为64万平方公里,超过10T)。此梗成为该系列视频的特色之一,可汗也因此被称为“通辽可汗”。', zhutiexiong:'朱铁雄,福建莆田人,1994年出生,短视频创作者。中国魔法少年的英雄梦,国风变装的热血与浪漫。抖音年度高光时刻作者,国风变装现象级人物。创玩节期间化身三国杀武将,来一场热血变身!', + nezha:'哪吒是中国神话中的民俗神之一,在古典名著《西游记》《封神演义》等及其衍生作品中也多有登场。传说中,哪吒是托塔天王李靖的第三子。哪吒之母怀胎三年,而哪吒出生之时是一个肉球,李靖惊怒之下,用剑劈开了肉球,而哪吒就在肉球中。哪吒广泛流传于道教以及民间传说中,被称为三坛海会大神、威灵显圣大将军、中坛元帅等,民间俗称“三太子”,又常冠其父姓,称为“李哪吒”。哪吒的原型为佛教护法神“那咤”。在不同作品的设定中,哪吒的师承关系有所不同,比如《封神演义》中,哪吒是太乙真人的弟子、元始天尊的徒孙,而《西游记》之中,哪吒则是释迦牟尼(如来佛祖)的弟子。在传说中,哪吒的形象常被形容为可化作三头六臂(封神之中是三头八臂),使用多种武器战斗。比如,《封神演义》中哪吒使用的武器(法宝)为乾坤圈、混天绫、火尖枪和风火轮等,西游记中是斩妖剑、砍妖刀、缚妖索、降妖杵、绣球儿、火轮儿。而哪吒第一次死后被其师父(太乙真人或如来佛祖)以莲花和莲藕复活。', }, card:{ ruyijingubang:{ @@ -1565,6 +1696,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dclbjiuxian:'酒仙', dclbjiuxian_info:'①你可以将额定目标数大于1的锦囊牌当做【酒】使用。②你使用【酒】无次数限制。', dcshixian:'诗仙', + dcshixian_yayun:'押韵', dcshixian_info:'当你使用一张牌时,若此牌的牌名与你于本局游戏使用的上一张牌的牌名押韵,则你可以摸一张牌,并令此牌额外结算一次。', taoshen:'涛神', dcnutao:'怒涛', @@ -1615,6 +1747,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dc_sunquan_prefix:'经典', dczhiheng:'制衡', dczhiheng_info:'①出牌阶段限一次。你可以弃置任意张牌并摸等量的牌,若你在发动〖制衡〗时弃置了所有手牌,则你多摸一张牌。②每回合每名角色限一次。当你对其他角色造成伤害后,你令〖制衡①〗于此回合发动次数上限+1。', + nezha:'哪吒', + dcsantou:'三头', + dcsantou_info:'锁定技。①当你受到伤害时,防止之,然后若以下有条件成立,你失去1点体力:1.你于本回合此前以此法防止过该伤害来源的伤害,且你的体力值不小于3;2.本次伤害为属性伤害,且你的体力值为2;3.本次伤害的渠道为红色的牌,且你的体力值为1。②游戏开始时,若你的体力上限小于3,你将体力上限加至3并将体力回复至3。', + dcfaqi:'法器', + dcfaqi_info:'当你于出牌阶段使用装备牌结算结束后,你视为使用一张本回合未以此法使用过的普通锦囊牌。', collab_olympic:'OL·伦敦奥运会', collab_tongque:'OL·铜雀台', diff --git a/character/ddd.js b/character/ddd.js index cb630b754..cbbdf2f66 100644 --- a/character/ddd.js +++ b/character/ddd.js @@ -6,15 +6,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connect:true, character:{ ddd_handang:["male","wu",4,["dddxianxi"]], - ddd_wuzhi:["male","wei",3,["dddlingyong","dddxuxiao"]], + // ddd_wuzhi:["male","wei",3,["dddlingyong","dddxuxiao"]], ddd_xujing:["male","shu",3,["dddxuyu","dddshijian"]], - ddd_caomao:["male","wei",3,["dddtaisi","dddquche","dddqianlong"],["zhu"]], - ddd_xinxianying:["female","wei",3,["ddddongcha","dddzhijie"]], + // ddd_caomao:["male","wei",3,["dddtaisi","dddquche","dddqianlong"],["zhu"]], + // ddd_xinxianying:["female","wei",3,["ddddongcha","dddzhijie"]], ddd_xianglang:["male","shu",3,["dddqiahua","dddfusi","dddtuoji"]], ddd_yujin:['male','wei',4,['dddzhengjun']], ddd_liuye:['male','wei',3,['dddchashi','dddqice']], ddd_baosanniang:['female','shu',3,['dddzhilian','dddjijian']], - ddd_zhenji:['female','wei',3,['dddmiaoxing','dddfushi']], + // ddd_zhenji:['female','wei',3,['dddmiaoxing','dddfushi']], ddd_zhaoang:['male','wei',4,['dddfenji']], ddd_zhouchu:['male','wu',5,['dddxiaheng']], ddd_liuba:['male','shu',3,['dddfengzheng','dddyulv']], @@ -23,13 +23,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ddd_dingfeng:['male','wu',4,['dddduanbing']], ddd_caoshuang:['male','wei',5,['dddzhuanshe','dddweiqiu']], ddd_xuelingyun:['female','wei',3,['dddlianer','dddanzhi']], - ddd_liuhong:['male','qun',4,['dddshixing','ddddanggu']], + ddd_liuhong:['male','qun',4,['dddshixing','ddddanggu','dddfuzong'],['zhu']], ddd_xiahouxuan:['male','wei',3,['dddlanghuai','dddxuanlun']], ddd_zhangkai:['male','qun','3/4',['dddjiexing','dddbailei']], ddd_liangxi:['male','wei',3,['dddtongyu']], ddd_wangkanglvkai:['male','shu',4,['dddbingjian']], - ddd_sunliang:['male','wu',3,['ddddiedang','dddanliu','dddguiying'],['zhu']], + // ddd_sunliang:['male','wu',3,['ddddiedang','dddanliu','dddguiying'],['zhu']], ddd_lie:['female','wu',3,['dddyeshen','dddqiaoduan']], + ddd_kebineng:['male','qun',4,['dddxiaoxing','dddlangzhi','dddfuyi'],['zhu']], + ddd_qianzhao:['male','wei',4,['dddyuanzhen','dddzhishu']], + ddd_zhangmiao:['male','qun',4,['dddxiaxing']], + ddd_zhangcheng:['male','wu',3,['dddjuxian','dddjungui']], + ddd_liuchong:['male','qun',4,['dddjinggou','dddmoyan']], + ddd_luoxian:['male','shu',4,['dddshilie']], }, characterFilter:{}, characterSort:{}, @@ -58,8 +64,523 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ddd_guanning:'#g虎鲸', ddd_lie:'#gyyuaN', ddd_liangxi:'#g先負', + // ddd_liuchong:'#g', + ddd_luoxian:'#g绝代倾国倾城貌', }, skill:{ + //牵招 + dddyuanzhen:{ + audio:2, + trigger:{player:'useCardToPlayered'}, + forced:true, + filter:function(event,player){ + return event.target!=player&&get.distance(player,event.target)!=1&&event.isFirstTarget&&event.targets.length==1; + }, + logTarget:'target', + content:function*(event,map){ + const player=map.player,trigger=map.trigger,target=trigger.target; + let result; + game.delayex(); + if(!target.countCards('he')) result={bool:false}; + else result=yield target.chooseToDiscard('he',`${get.translation(player)}对你使用了【远振】`,'请弃置一张牌,或点击“取消”令其摸一张牌').set('ai',card=>{ + if(get.event('goon')) return 4.5-get.value(card); + }).set('goon',get.attitude(target,player)>0); + if(!result.bool){ + target.line(player); + player.draw(); + } + }, + }, + dddzhishu:{ + audio:2, + trigger:{player:'phaseUseBegin'}, + filter:function(event,player){ + return player.canMoveCard(null,true); + }, + check:function(event,player){ + return player.canMoveCard(true,true); + }, + content:function*(event,map){ + const player=map.player; + let result=yield player.moveCard(); + const targets=result.targets; + const guohe=new lib.element.VCard({name:'guohe',isCard:true}); + if(targets[0].canUse(guohe,targets[1])) targets[0].useCard(guohe,targets[1],'noai'); + } + }, + //张邈 + dddxiaxing:{ + audio:2, + enable:'chooseToUse', + hiddenCard:function(player,name){ + return name=='tao'; + }, + filter:function(event,player){ + if(event.type!='dying') return false; + if(!player.countCards('he')) return false; + const evt=get.event().getParent('_save'); + if(!evt||!evt.dying||!evt.dying.isIn()) return false; + return !player.hasSkill('dddxiaxing_used'); + }, + check:card=>{ + return 7-get.value(card); + }, + filterCard:true, + position:'he', + discard:false, + delay:false, + lose:false, + group:['dddxiaxing_begin','dddxiaxing_viewas'], + prompt:function(){ + const evt=get.event().getParent('_save'); + return `将一张牌置于牌堆顶,视为${get.translation(evt.dying)}使用一张【桃】`; + }, + content:function*(event,map){ + const player=map.player,cards=event.cards; + player.addTempSkill('dddxiaxing_used','roundStart'); + game.log(player,'将一张牌置于了牌堆顶'); + player.$throw(cards.length,1000); + yield player.lose(cards,ui.cardPile,'insert'); + const evt=event.getParent('_save'); + yield evt.dying.chooseUseTarget('tao',true); + if(!player.hasMark('dddxiaxing')) player.addMark('dddxiaxing'); + }, + marktext:'侠', + intro:{ + markcount:()=>0, + name:'侠行', + name2:'侠', + content:'已拥有“侠”标记', + }, + ai:{ + order:4, + result:{ + player:function(player){ + if(_status.event.dying) return get.attitude(player,_status.event.dying); + return 1; + }, + } + }, + subSkill:{ + begin:{ + audio:2, + trigger:{global:'phaseZhunbeiBegin'}, + filter:function(event,player){ + if(!player.countCards('he')) return false; + return !player.hasSkill('dddxiaxing_used'); + }, + direct:true, + content:function*(event,map){ + const player=map.player,trigger=map.trigger,target=trigger.player; + let result=yield player.chooseCard(get.prompt('dddxiaxing'),`将一张牌置于牌堆顶,视为${get.translation(target)}使用一张【酒】`,'he').set('ai',card=>{ + if(get.event('goon')) return 5-get.value(card); + return 0; + }).set('goon',get.effect(target,{name:'jiu'},player,player)>0); + if(!result.bool) return event.finish(); + const cards=result.cards; + player.logSkill('dddxiaxing_begin',target); + player.addTempSkill('dddxiaxing_used','roundStart'); + game.log(player,'将一张牌置于了牌堆顶'); + player.$throw(cards.length,1000); + yield player.lose(cards,ui.cardPile,'insert'); + yield target.chooseUseTarget('jiu',true); + if(!player.hasMark('dddxiaxing')) player.addMark('dddxiaxing'); + } + }, + used:{charlotte:true}, + viewas:{ + audio:'dddxiaxing', + enable:'chooseToUse', + filter:function(event,player){ + if(event.type=='wuxie'||!player.hasMark('dddxiaxing')) return false; + for(const name of ['sha','shan']){ + if(event.filterCard({name:name,isCard:true},player,event)) return true; + } + return false; + }, + chooseButton:{ + dialog:function(event,player){ + const vcards=[]; + for(const name of ['sha','shan']){ + const card={name:name,isCard:true}; + if(event.filterCard(card,player,event)) vcards.push(['基本','',name]); + } + const dialog=ui.create.dialog('侠行',[vcards,'vcard'],'hidden'); + dialog.direct=true; + return dialog; + }, + backup:function(links,player){ + return { + filterCard:()=>false, + selectCard:-1, + viewAs:{ + name:links[0][2], + isCard:true, + }, + popname:true, + precontent:function(){ + player.logSkill('dddxiaxing_viewas'); + player.clearMark('dddxiaxing'); + }, + } + }, + prompt:function(links,player){ + return '侠行:移去“侠”标记,视为使用一张【'+get.translation(links[0][2])+'】'; + } + }, + ai:{ + order:function(item,player){ + const event=get.event(); + if(event.filterCard({name:'sha'},player,event)){ + if(!player.hasShan()&&!game.hasPlayer(function(current){ + return player.canUse('sha',current)&¤t.hp==1&&get.effect(current,{name:'sha'},player,player)>0; + })){ + return 0; + } + return 2.95; + } + else return 3.15; + }, + respondSha:true, + respondShan:true, + skillTagFilter:function(player,tag,arg){ + if(!player.hasMark('dddxiaxing')) return false; + if(arg!='use') return false; + }, + result:{ + player:1 + } + }, + }, + } + }, + //张承 + dddjuxian:{ + enable:'phaseUse', + usable:2, + filter:function(event,player){ + return !player.hasSkill('dddjuxian_ban'); + }, + chooseButton:{ + dialog:function(event,player){ + var dialog=ui.create.dialog('聚贤:请选择一项','hidden'); + dialog.add([[ + ['top','展示一张牌,然后将此牌置于牌堆顶'], + ['hand','展示一张牌,然后将此牌交给一名其他角色'] + ],'textbutton']); + return dialog; + }, + filter:function(button,player){ + return !player.hasSkill('dddjuxian_'+button.link,null,null,false); + }, + check:function(button){ + return 1; + }, + backup:function(links){ + return get.copy(lib.skill['dddjuxian_'+links[0]]); + }, + prompt:function(links){ + if(links[0]=='top') return '展示一张牌,然后将此牌置于牌堆顶'; + return '展示一张牌,然后将此牌交给一名其他角色'; + }, + }, + ai:{ + order:10, + threaten:1.7, + result:{player:1}, + }, + subSkill:{ + backup:{audio:'dddjuxian'}, + ban:{charlotte:true}, + top:{ + audio:'dddjuxian', + filterCard:true, + selectCard:1, + position:'he', + discard:false, + delay:false, + lose:false, + content:function*(event,map){ + const player=map.player,cards=event.cards; + player.addTempSkill('dddjuxian_top','phaseUseAfter'); + player.showCards(cards); + const color1=get.color(cards); + player.$throw(cards,1000); + game.log(player,'将',cards,'置于了牌堆顶'); + yield player.lose(cards,ui.cardPile,'insert'); + const targets=game.filterPlayer(target=>target.countGainableCards(player,'he')); + let result; + if(!targets.length) return event.finish(); + else if(targets.length==1) result={bool:true,targets:targets}; + else result=yield player.chooseTarget('聚贤:获得一名其他角色的一张牌',(card,player,target)=>{ + if(target==player) return false; + return target.countGainableCards(player,'he'); + },true).set('ai',target=>{ + const player=get.player(); + return get.effect(target,{name:'shunshou'},player,player); + }); + if(!result.bool) return event.finish(); + const target=result.targets[0]; + player.line(target); + result=yield player.gainPlayerCard(target,'he',true); + if(!result.bool) return event.finish(); + const cards2=result.links; + const color2=get.color(cards2); + if(color1&&color2&&color1!=color2) player.addTempSkill('dddjuxian_ban'); + }, + ai:{ + result:{ + player:1, + }, + }, + }, + hand:{ + audio:'dddjuxian', + filterTarget:lib.filter.notMe, + filterCard:true, + selectCard:1, + position:'he', + discard:false, + delay:false, + lose:false, + content:function*(event,map){ + const player=map.player,cards=event.cards,target=event.targets[0]; + player.addTempSkill('dddjuxian_hand','phaseUseAfter'); + player.showCards(cards); + const color1=get.color(cards); + let result; + yield player.give(cards,target); + result=yield player.draw(); + const cards2=result.filter(i=>get.owner(i)==player&&get.position(i)=='h'); + if(!cards.length) return event.finish(); + const color2=get.color(cards2); + player.showCards(cards2); + if(color1&&color2&&color1!=color2) player.addTempSkill('dddjuxian_ban'); + }, + ai:{ + result:{ + player:1, + target:1, + }, + }, + }, + }, + }, + dddjungui:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + direct:true, + content:function*(event,map){ + const player=map.player; + let result=yield player.chooseTarget(get.prompt2('dddjungui')); + if(!result.bool) return event.finish(); + const target=result.targets[0]; + player.logSkill('dddjungui',target); + target.draw(2); + yield target.showHandcards(); + const targetSuitsCount=target.getCards('h').map(card=>{ + return get.suit(card); + }).toUniqued().length; + const usedCount=player.getHistory('useCard').map(evt=>{ + return get.suit(evt.card); + }).toUniqued().length; + let decreasedCount=0; + if(usedCount>0){ + const numbers=Array.from({length:usedCount},(_,i)=>get.cnNumber(i+1,true)); + result=yield player.chooseControl(numbers,'cancel2').set('prompt',`是否令${get.translation(target)}少弃置任意张牌?`).set('ai',()=>{ + return get.event('choice'); + }).set('choice',get.attitude(player,target)>0?numbers.lastItem:'cancel2'); + if(result.control!='cancel'){ + decreasedCount=result.index+1; + game.log(player,'选择令',target,'少弃置',get.cnNumber(decreasedCount),'张牌'); + } + } + const toDiscardNum=targetSuitsCount-decreasedCount; + if(toDiscardNum<=0) return event.finish(); + target.chooseToDiscard(`隽轨:请弃置${get.cnNumber(toDiscardNum)}张花色不同的手牌`,toDiscardNum,true,(card,player)=>{ + const suit=get.suit(card); + for(const cardx of ui.selected.cards){ + if(get.suit(cardx)==suit) return false; + } + return true; + }).set('complexCard',true); + } + }, + //刘宠 + dddjinggou:{ + audio:2, + trigger:{player:'useCardAfter'}, + forced:true, + filter:function(event,player){ + if(get.type(event.card)!='equip') return false; + const range=player.getAttackRange(); + return !game.hasPlayer(current=>{ + return current.getAttackRange()>range; + }); + }, + direct:true, + content:function*(event,map){ + const player=map.player; + let result=yield player.chooseTarget('精彀:对一名其他角色造成1点伤害',true,lib.filter.notMe).set('ai',target=>{ + var player=get.player(); + return get.damageEffect(target,player,player); + }); + if(result.bool){ + const target=result.targets[0]; + player.logSkill('dddjinggou',target); + target.damage(); + } + }, + }, + dddmoyan:{ + audio:2, + trigger:{global:'roundStart'}, + content:function*(event,map){ + const player=map.player; + const cards=game.cardsGotoOrdering(get.cards(3)).cards; + yield player.showCards(cards,`${get.translation(player)}发动了【末焱】`); + let result=yield player.chooseTarget('末焱:选择一名角色获得其中至少一张牌').set('ai',target=>get.attitude(get.player(),target)); + if(!result.bool) return event.finish(); + const target=result.targets[0]; + result=yield target.chooseButton(['末焱:获得至少一张牌',cards],true,[1,cards.length]).set('ai',button=>{ + return get.value(button.link); + }); + if(!result.bool) return event.finish(); + const gains=result.links; + target.gain(gains,'gain2'); + player.setStorage('dddmoyan_target',[target,gains.length]); + player.addTempSkill('dddmoyan_target','roundStart'); + }, + subSkill:{ + target:{ + onremove:true, + trigger:{player:'damageBegin3'}, + filter:function(event,player){ + const info=player.getStorage('dddmoyan_target'); + return info[0]&&info[0].isIn()&&info[0].countCards('h')<=info[1]; + }, + forced:true, + charlotte:true, + content:function(){ + trigger.increase('num'); + }, + }, + }, + }, + //罗宪 + dddshilie:{ + audio:2, + enable:'chooseToUse', + hiddenCard:function(player,name){ + if(!player.countCards('h')) return false; + return name=='sha'||name=='shan'; + }, + filter:function(event,player){ + if(event.type=='wuxie'||!_status.currentPhase) return false; + if(!player.countCards('h')||player.hasSkill('dddshilie_used',null,null,false)) return false; + for(var name of ['sha','shan']){ + if(event.filterCard({name:name,isCard:true},player,event)) return true; + } + return false; + }, + chooseButton:{ + dialog:function(event,player){ + var vcards=[]; + for(var name of ['sha','shan']){ + var card={name:name,isCard:true}; + if(event.filterCard(card,player,event)) vcards.push(['基本','',name]); + } + const dialog=ui.create.dialog('示烈',[vcards,'vcard'],'hidden'); + dialog.direct=true; + return dialog; + }, + check:function(button){ + return 1; + }, + backup:function(links,player){ + return { + filterCard:function(card){ + return !get.is.shownCard(card); + }, + filterOk:()=>{ + return ui.selected.cards.map(card=>{ + return get.number(card); + }).reduce((p,c)=>{ + return p+c; + },0)>=get.player().getHp()+(_status.currentPhase?_status.currentPhase.getHp():0); + }, + selectCard:[1,Infinity], + viewAs:{ + name:links[0][2], + isCard:true, + }, + popname:true, + ignoreMod:true, + ai1:function(card){ + const need=get.player().getHp()+(_status.currentPhase?_status.currentPhase.getHp():0); + let num=0; + for(var i=0;i=need){ + if(cards[i]==card||cards[j]==card) return 15-get.value(card); + } + } + } + } + return 0.1; + }, + precontent:function(){ + 'step 0' + player.logSkill('dddshilie'); + player.addTempSkill('dddshilie_used'); + var cards=event.result.cards.slice(); + player.addShownCards(cards,'visible_dddshilie'); + delete event.result.skill; + player.showCards(cards,get.translation(player)+'发动了【示烈】'); + if(cards.map(card=>{ + return get.number(card); + }).reduce((p,c)=>{ + return p+c; + },0)==player.getHp()+(_status.currentPhase?_status.currentPhase.getHp():0)){ + player.draw(cards.length); + } + event.result.card=new lib.element.VCard({name:event.result.card.name,isCard:true}); + event.result.cards=[]; + game.delayx(); + }, + } + }, + prompt:function(links,player){ + return `###示烈###明置任意张点数之和不小于${player.getHp()+(_status.currentPhase?_status.currentPhase.getHp():0)}的牌,视为使用【${get.translation(links[0][2])}】`; + } + }, + subSkill:{used:{charlotte:true}}, + ai:{ + order:function(item,player){ + const evt=get.event(); + for(var name of ['sha','shan']){ + if(evt.filterCard({name:name},player,evt)) return get.order({name:name})+0.1; + } + return 1; + }, + respondSha:true, + respondShan:true, + skillTagFilter:function(player,tag,arg){ + if(!player.countCards('h')) return false; + }, + result:{ + player:function(player){ + return 1; + } + } + } + }, //李娥 dddyeshen:{ trigger:{global:'phaseJieshuBegin'}, @@ -86,7 +607,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.isIn()){ var blacks=cards.filter(card=>get.color(card)=='black'); if(blacks.length>1) target.chooseButton([ - '选择一张牌当作【铁索连环】使用或打出', + '选择一张牌当作【铁索连环】使用或重铸', blacks, ],true).set('ai',button=>get.translation(button.link.name).length); else event._result={ @@ -483,7 +1004,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddbingjian:{ enable:['chooseToUse','chooseToRespond'], filter:function(event,player){ - if(event.type=='wuxie'||player.hasSkill('dddbingjian_round',null,false,false)) return false; + if(event.type=='wuxie') return false; + if(player.countMark('dddbingjian_used')>=2) return false; + if(player.countCards('h')==2) return false; return event.filterCard({ name:'sha', isCard:true, @@ -496,43 +1019,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dialog:function(event,player){ return ui.create.dialog( '并肩', - [[ - [2,'调整至2张'], - [4,'调整至4张'] - ],'tdnodes'], + // [[ + // [2,'调整至2张'], + // [4,'调整至4张'] + // ],'tdnodes'], [['sha','shan'],'vcard'], 'hidden' ) }, - select:2, + // select:2, filter:function(button,player){ if(ui.selected.buttons.length){ if(typeof button.link==typeof ui.selected.buttons[0].link) return false; } - if(typeof button.link=='number'){ - return button.link!=player.countCards('h'); - } + // if(typeof button.link=='number'){ + // return button.link!=player.countCards('h'); + // } return _status.event.getParent().filterCard({ name:button.link[2], isCard:true, }); }, check:function(button){ - if(typeof button.link=='number') return button.link; + // if(typeof button.link=='number') return button.link; return 1; }, backup:function(links,player){ - if(typeof links[0]=='number') links.reverse(); + // if(typeof links[0]=='number') links.reverse(); var skill={ viewAs:{ name:links[0][2], - isCard:true, suit:'none', number:null, isCard:true, } } - var num=links[1]-player.countCards('h'); + var num=2-player.countCards('h'); if(num>0){ skill.draw=num; skill.filterCard=function(){ @@ -553,8 +1075,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return skill; }, prompt:function(links,player){ - if(typeof links[0]=='number') links.reverse(); - var num=links[1]-player.countCards('h'); + // if(typeof links[0]=='number') links.reverse(); + var num=2-player.countCards('h'); if(num>0){ return '摸'+get.cnNumber(num)+'张牌并视为使用'+get.translation(links[0][2]); } @@ -574,6 +1096,53 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, content_draw:function(){ + 'step 0' + delete event.result.skill; + player.logSkill('dddbingjian'); + player.draw(lib.skill.dddbingjian_backup.draw); + player.addTempSkill('dddbingjian_used'); + player.addMark('dddbingjian_used',1,false); + 'step 1' + player.chooseTarget('是否令一名其他角色摸等量的牌?',lib.filter.notMe).set('ai',target=>{ + var player=get.player(); + return get.effect(target,{name:'wuzhong'},player,player); + }); + 'step 2' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'green'); + target.draw(lib.skill.dddbingjian_backup.draw); + } + }, + content_discard:function(){ + 'step 0' + delete event.result.skill; + player.logSkill('dddbingjian'); + player.discard(event.result.cards); + event.num=event.result.cards.length; + player.addTempSkill('dddbingjian_used'); + player.addMark('dddbingjian_used',1,false); + event.result.card={ + name:event.result.card.name, + isCard:true, + } + event.result.cards=[]; + 'step 1' + player.chooseTarget('是否弃置一名其他角色等量的牌?',lib.filter.notMe).set('ai',target=>{ + var player=get.player(),num=target.countCards('he')-get.event('num'); + if(num>=0) num=1; + else num=1-num/5; + var eff=get.effect(target,{name:'guohe_copy2'},player,player); + return eff/num; + }).set('num',event.num); + 'step 2' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'fire'); + player.discardPlayerCard(target,'he',true,event.num); + } + }, + content_draw_old:function(){ 'step 0' delete event.result.skill; player.logSkill('dddbingjian'); @@ -594,7 +1163,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.delayx(); } }, - content_discard:function(){ + content_discard_old:function(){ 'step 0' delete event.result.skill; player.logSkill('dddbingjian'); @@ -647,6 +1216,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:'本轮内不能使用或打出$', }, }, + used:{ + charlotte:true, + onremove:true, + }, } }, //梁习 @@ -677,6 +1250,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, precontent:function(){ if(!event.result.card.storage) event.result.card.storage={}; + event.result.card.storage.chooseDirection=true; event.result.card.storage.extraCardsNum=event.result.cards.length; player.addTempSkill('dddtongyu_effect'); }, @@ -690,11 +1264,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, popup:false, filter:function(event,player){ - return event.skill=='dddtongyu'; + return event.skill=='dddtongyu'&&event.isFirstTarget; }, content:function(){ 'step 0' - var target=trigger.target; + event.targets=trigger.targets.slice().sortBySeat(_status.currentPhase||player); + 'step 1' + var target=targets.shift(); event.target=target; if(!target.isUnderControl(true)&&!target.isOnline()) game.delayx(); target.chooseControl().set('choiceList',[ @@ -705,7 +1281,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var source=_status.event.getTrigger().player; return player==source?1:0; }); - 'step 1' + 'step 2' if(result.index==0){ target.chat('接受五谷'); target.addTempSkill('dddtongyu_blocker'); @@ -719,6 +1295,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ evt.dddtongyu_targets.add(target); game.log(target,'令',trigger.card,'对其无效'); } + if(targets.length) event.goto(1); }, group:'dddtongyu_give', }, @@ -766,14 +1343,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, filter:function(event,player){ var targets=game.filterPlayer2(function(current){ - return current.getHistory('useCard').length>0; + return current.getHistory('useCard').length+current.getHistory('respond').length>0; }); + if(!targets.includes(player)||!targets.some(target=>target!=player&&target.hasSex('male'))) return false; return targets.length==2&&!targets.some(target=>!target.isIn()); }, content:function(){ 'step 0' var targets=game.filterPlayer(function(current){ - return current.getHistory('useCard').length>0; + return current.getHistory('useCard').length+current.getHistory('respond').length>0; }).sortBySeat(trigger.player); event.targets=targets; var choices=['摸牌']; @@ -828,7 +1406,93 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddjijian:{ enable:'phaseUse', usable:1, + filterCard:{name:'sha'}, + position:'h', + discard:false, + delay:false, + lose:false, filter:(event,player)=>game.hasPlayer(current=>lib.skill.dddjijian.filterTarget(null,player,current)), + filterTarget:(card,player,target)=>(target!=player&&target.hasSex('male')), + content:function(){ + 'step 0' + player.showCards(cards); + player.give(cards,target); + 'step 1' + var cards=target.getCards('h'); + if(!cards.length) event.finish(); + else if(cards.length==1) event._result={bool:true,cards:cards}; + else target.chooseCard('h',true,[1,2],'请展示一至两张颜色相同的【杀】或普通锦囊牌',(card,player)=>{ + var color=get.color(card); + for(var cardx of ui.selected.cards){ + if(get.color(cardx)!=color) return false; + } + return get.name(card)=='sha'||get.type(card)=='trick'; + }).set('complexCard',true).set('ai',function(card){ + var player=_status.event.player,source=_status.event.getParent().player; + if(get.attitude(source,player)<=0) return -get.value(card); + var name=get.name(card),color=get.color(card); + if(name=='sha'||player.getUseValue(card)<=0||player.hasCard(card2=>{ + return card2!=card&&!ui.selected.cards.contains(card2)&&get.name(card2)==name; + })){ + if(!ui.selected.cards.length&&color=='black') return 1+Math.random(); + return Math.random(); + } + if(!ui.selected.cards.length||get.color(ui.selected.cards[0]=='red')){ + if(color=='black') return 0.2-player.getUseValue(card)/100+Math.random(); + } + return 0.1-player.getUseValue(card)/100; + }); + 'step 2' + if(result.bool){ + var cards=result.cards; + event.cards=cards; + target.showCards(cards,get.translation(player)+'对'+get.translation(target)+'发动了【赍剑】'); + event.usedName=[]; + event.targets=[player,target].sortBySeat(_status.currentPhase||player); + } + else event.finish(); + 'step 3' + var current=event.targets.shift(); + if(!current.isIn()){ + event.goto(5); + return; + } + event.current=current; + var list=event.cards.filter(card=>{ + return !event.usedName.includes(get.name(card))&¤t.hasUseTarget({ + name:get.name(card), + nature:get.nature(card) + }); + }).map(card=>{ + return [get.type(card),'',get.name(card),get.nature(card)]; + }); + if(!list.length) event.finish(); + else current.chooseButton(['赍剑:视为使用一张牌',[list,'vcard']],true).set('ai',function(button){ + return get.player().getUseValue({name:button.link[2],nature:button.link[3]}); + }); + 'step 4' + if(result.bool){ + var name=result.links[0][2]; + event.usedName.add(name); + event.current.chooseUseTarget({name:name,nature:result.links[0][3],isCard:true},true,false); + } + 'step 5' + if(event.targets.length) event.goto(3); + }, + ai:{ + order:4, + result:{ + player:function(player,target){ + if(get.attitude(player,target)>0&&player.hasCard(card=>get.name(card)=='sha','h')) return target.countCards('h'); + return 0.1/target.countCards('h'); + }, + }, + }, + }, + dddjijian_old:{ + enable:'phaseUse', + usable:1, + filter:(event,player)=>game.hasPlayer(current=>lib.skill.dddjijian_old.filterTarget(null,player,current)), filterTarget:(card,player,target)=>(target!=player&&target.hasSex('male')&&target.countCards('h')>0), content:function(){ 'step 0' @@ -972,22 +1636,86 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var boolh=!player.hasSkill('dddzhengjun_handcard',null,false,false),boole=(!player.hasSkill('dddzhengjun_equip')&&player.canMoveCard(null,true)); var hs=player.countCards('h'),es=player.countCards('e'); return game.hasPlayer(function(current){ - if(player==current) return false; + // if(player==current) return false; if(boolh&¤t.countCards('h')==hs){ var num=event.getl(current).hs.length; if(event.getg) num-=event.getg(current).length; - if(num!=0) return true; + if(num!=0) return game.hasPlayer(current=>{ + if(player==current) return false; + return current.countCards('h')==player.countCards('h'); + }); } if(boole&¤t.countCards('e')==es){ var num=event.getl(current).es.length; if(event.name=='equip'&¤t==event.player) num--; - if(num!=0) return true; + if(num!=0) return game.hasPlayer(current=>{ + if(player==current) return false; + return current.countCards('e')==player.countCards('e'); + }); } return false; }); }, direct:true, - content:function(){ + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + var boolh=!player.hasSkill('dddzhengjun_handcard',null,false,false),hs=player.countCards('h'); + if(boolh&&game.hasPlayer(function(current){ + // if(player==current) return false; + if(boolh&¤t.countCards('h')==hs){ + var num=trigger.getl(current).hs.length; + if(trigger.getg) num-=trigger.getg(current).length; + if(num!=0) return game.hasPlayer(current=>{ + if(player==current) return false; + return current.countCards('h')==player.countCards('h'); + }); + } + return false; + })){ + var result=yield player.chooseTarget(get.prompt('dddzhengjun'),'令一名手牌数与你相等的其他角色摸或弃置一张牌',(card,player,target)=>{ + return player.countCards('h')==target.countCards('h')&&player!=target; + }).set('ai',target=>{ + var player=get.player(); + return Math.max(get.effect(target,{name:'wuzhong'},player,player),get.effect(target,{name:'guohe'},player,player)/2); + }); + if(result.bool){ + var target=result.targets[0]; + var choices=['摸牌']; + if(target.countCards('he')) choices.push('弃牌'); + result=yield player.chooseControl(choices).set('prompt',`整军:请选择一项`).set('prompt2',`令${get.translation(target)}摸一张牌或弃置一张牌`).set('ai',()=>{ + return get.event('choice'); + }).set('choice',get.attitude(player,target)>0||!choices.includes('弃牌')?0:1); + player.logSkill('dddzhengjun',target); + player.addTempSkill('dddzhengjun_handcard','phaseUseAfter'); + if(result.control=='摸牌') target.draw(); + else target.chooseToDiscard('he',true); + } + } + var boole=(!player.hasSkill('dddzhengjun_equip')&&player.canMoveCard(null,true)),es=player.countCards('h'); + if(boolh&&game.hasPlayer(function(current){ + // if(player==current) return false; + if(boole&¤t.countCards('e')==es){ + var num=trigger.getl(current).es.length; + if(trigger.name=='equip'&&trigger.player==current) num--; + if(num!=0) return game.hasPlayer(current=>{ + if(player==current) return false; + return current.countCards('e')==player.countCards('e'); + }); + } + return false; + })){ + var result=yield player.chooseBool(get.prompt('dddzhengjun'),'移动一名装备区牌数与你相等的其他角色装备区里的一张牌').set('ai',function(){ + var targets=game.filterPlayer(target=>player.countCards('e')==target.countCards('e')&&player!=target); + return get.player().canMoveCard(true,true,targets); + }); + if(result.bool){ + player.logSkill('dddzhengjun'); + player.addTempSkill('dddzhengjun_equip','phaseUseAfter'); + player.moveCard(true,true,game.filterPlayer(target=>player.countCards('e')==target.countCards('e')&&player!=target)); + } + } + }, + content_old:function(){ 'step 0' var boolh=!player.hasSkill('dddzhengjun_handcard',null,false,false),hs=player.countCards('h'); if(boolh&&game.hasPlayer(function(current){ @@ -1043,9 +1771,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{global:['damageEnd','loseHpEnd','recoverEnd']}, direct:true, filter:function(event,player){ - if(player==event.player||player.hp!=event.player.hp) return false; + if(player.hp!=event.player.hp) return false; if(event.hujia&&event.hujia==event.num) return false; - if(!game.hasPlayer(current=>current.isDamaged())) return false; + if(!game.hasPlayer(current=>current.getHp()==player.getHp()&¤t!=player)) return false; var evt=event.getParent('phaseUse'); if(!evt||evt.player!=player) return false; return !player.hasHistory('useSkill',function(evt){ @@ -1057,18 +1785,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseTarget('整军:是否令一名角色回复1点体力?',function(card,player,target){ - return target.isDamaged(); - }).set('ai',function(target){ - var player=_status.event.player; - return get.recoverEffect(target,player,player); + player.chooseTarget(get.prompt('dddzhengjun'),'令一名体力值与你相等的其他角色回复或失去1点体力',function(card,player,target){ + return target.getHp()==player.getHp()&&player!=target; + }).set('ai',target=>{ + var player=get.player(); + return Math.max(get.recoverEffect(target,player,player),get.effect(target,{name:'losehp'},player,player)); }); 'step 1' if(result.bool){ var target=result.targets[0]; - player.logSkill('dddzhengjun_hp',target); - target.recover(); + event.target=target; + var choices=['失去体力']; + if(target.isDamaged()) choices.push('回复体力'); + player.chooseControl(choices).set('prompt',`整军:请选择一项`).set('prompt2',`令${get.translation(target)}失去1点体力或回复1点体力`).set('ai',()=>{ + return get.event('choice'); + }).set('choice',get.recoverEffect(target,player,player)>0&&target.isDamaged()?1:0); } + else event.finish(); + 'step 2' + player.logSkill('dddzhengjun_hp',target); + target[result.control=='失去体力'?'loseHp':'draw'](); } }, }, @@ -1243,6 +1979,70 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, dddxuyu:{ + trigger:{ + player:"useCardAfter", + }, + content:function(){ + player.draw(); + player.when({player:'useCardAfter',global:'phaseAfter'}).filter(evt=>evt!=trigger).then(()=>{ + if(trigger.name=='useCard') player.chooseToDiscard('he',true); + }); + }, + }, + dddshijian:{ + trigger:{ + global:'useCardAfter', + }, + filter:function(event,player){ + if(player==event.player) return false; + const evt=event.getParent('phaseUse'); + if(!evt||evt.player!=event.player) return false; + return event.player.getHistory('useCard',evtx=>{ + return evtx.getParent('phaseUse')==evt; + },event).length==2; + }, + direct:true, + content:function*(event,map){ + const player=map.player,trigger=map.trigger,target=trigger.player; + let result=yield player.chooseCard('he',get.prompt('dddshijian',target),`交给${get.translation(target)}一张牌,然后其本回合使用下一张牌指定目标时,你令此牌额外结算一次或摸一张牌。`).set('ai',card=>{ + if(get.event('goon')) return 6-get.value(card); + return 0; + }).set('goon',get.attitude(player,target)>0&&target.hasCard(card=>target.hasValueTarget(card))); + if(!result.bool) return event.finish(); + player.logSkill('dddshijian',target); + player.give(result.cards,target); + player.addTempSkill('dddshijian_extra'); + player.markAuto('dddshijian_extra',target); + }, + subSkill:{ + extra:{ + trigger:{global:'useCardToPlayer'}, + filter:function(event,player){ + if(!event.isFirstTarget) return false; + return player.getStorage('dddshijian_extra').includes(event.player); + }, + charlotte:true, + forced:true, + onremove:true, + content:function*(event,map){ + const player=map.player,trigger=map.trigger,target=trigger.player; + if(trigger.targets&&trigger.targets.length){ + let result=yield player.chooseControl(['额外结算','摸一张牌']).set('prompt','实荐:请选择一项').set('prompt2',`令${get.translation(trigger.card)}额外结算一次,或摸一张牌`).set('ai',()=>{ + return get.event('choice'); + }).set('choice',['basic','trick'].includes(get.type(trigger.card))&&trigger.targets.map(i=>get.effect(i,trigger.card,target,player)).reduce((p,c)=>p+c,0)>=5?0:1); + if(result.index==0){ + trigger.getParent().effectCount++; + game.log(player,'令',trigger.card,'额外结算一次'); + } + else player.draw(); + } + else player.draw(); + player.removeSkill('dddshijian_extra'); + } + } + }, + }, + dddxuyu_old:{ trigger:{ player:"useCardAfter", }, @@ -1255,7 +2055,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function (){ player.draw(2); - player.addTempSkill('dddxuyu_discard','phaseUseAfter'); + player.addTempSkill('dddxuyu_old_discard','phaseUseAfter'); }, subSkill:{ discard:{ @@ -1279,7 +2079,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, - dddshijian:{ + dddshijian_old:{ trigger:{ global:"useCardAfter", }, @@ -1297,7 +2097,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function (){ trigger.player.draw(); - player.addTempSkill('dddshijian_draw','phaseUseAfter'); + player.addTempSkill('dddshijian_old_draw','phaseUseAfter'); }, subSkill:{ draw:{ @@ -1385,8 +2185,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ color:"red", }, filterTarget:function (card,player,target){ - return player!=target; - }, + return player!=target; + }, discard:false, delay:false, lose:false, @@ -1697,7 +2497,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dddxunxun:{ inherit:"xunxun", - audio:"ext:3D8测试包:2", + audio:2, }, dddfusi:{ mod:{ @@ -1879,7 +2679,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ return player!=event.player&&player.countCards('he')>0; }, - content:function(){ + content:function*(event,map){ + const player=map.player,trigger=map.trigger,target=trigger.player; + const valuableCards=target.getCards('hs',card=>target.hasValueTarget(card)); + let result=yield player.chooseToDiscard(get.prompt('dddchashi',target),'弃置一张牌,若其使用的下一张牌的花色或类型与此牌相同,你与其各摸一张牌','he').set('logSkill',['dddchashi',target]).set('ai',card=>{ + if(!get.event('goon')) return 0; + var list=get.event('list'); + return list[0].includes(get.suit(card))||list[1].includes(get.type2(card)); + }).set('list',[ + valuableCards.map(card=>get.suit(card)).toUniqued(), + valuableCards.map(card=>get.type2(card)).toUniqued() + ]).set('goon',get.attitude(player,target)>0); + if(!result.bool) return event.finish(); + player.storage['dddchashi']=[result.cards[0],target]; + player.addTempSkill('dddchashi_effect','phaseUseAfter'); + target.addTempSkill('dddchashi_ai',{player:['phaseUseAfter','useCard1']}); + }, + content_old:function(){ 'step 0' var target=trigger.player,history=target.getHistory('useCard',function(evt){ return evt.getParent('phaseUse')==trigger; @@ -1930,23 +2746,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var storage=player.getStorage('dddchashi'); if(!storage||!storage.length) return false; if(event.player!=storage[1]||!event.player.isIn()) return false; - if(!player.getCards('he').contains(storage[0])||!storage[0].hasGaintag('dddchashi')) return false; - if(get.suit(event.card)!=get.suit(storage[0])) return false; - var evt=event.getParent('phaseUse'); - if(evt.player) - if(event.player.getHistory('useCard',function(evtx){ - return evtx.getParent('phaseUse')==evt; - }).indexOf(event)!=0) return false; + // if(!player.getCards('he').contains(storage[0])||!storage[0].hasGaintag('dddchashi')) return false; + if(get.suit(event.card)!=get.suit(storage[0])&&get.type2(event.card)!=get.type2(storage[0])) return false; + // var evt=event.getParent('phaseUse'); + // if(evt.player) + // if(event.player.getHistory('useCard',function(evtx){ + // return evtx.getParent('phaseUse')==evt; + // }).indexOf(event)!=0) return false; return true; }, content:function(){ var storage=player.getStorage('dddchashi'); - storage[1].gain(storage[0],player,'give'); - player.draw(); + // storage[1].gain(storage[0],player,'give'); + // player.draw(); + game.asyncDraw([player,storage[1]].sortBySeat(_status.currentPhase)); + player.removeSkill('dddchashi_effect'); }, onremove:function(player,storage){ delete player.storage['dddchashi']; - player.removeGaintag('dddchashi'); + // player.removeGaintag('dddchashi'); }, }, ai:{ @@ -1956,9 +2774,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dddqice:{ trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return !player.storage['dddqice']; + }, content:function(){ player.draw(2); - player.addTempSkill('dddqice_effect'); + // player.addTempSkill('dddqice_effect'); + player.setStorage('dddqice',true); + player.when('useCard1').filter(evt=>get.type2(evt.card)=='trick').then(()=>{ + delete player.storage['dddqice']; + }) }, subSkill:{ effect:{ @@ -2323,7 +3148,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.storage['dddxiaheng_del']) return eff; var fix=player.getStorage('dddxiaheng').contains(target)?0.75:1; if(target==player&&targetx!=player&&player.isHealthy()&&!player.getStorage('dddxiaheng').contains(player)&&player.hp>2) return 100; - return eff*(player.hp==1&&target==targetx?0.5:1)*fix; + return eff*(player.hp==1||target==targetx?0.1:1)*fix; }).set('targetx',targets[0]); 'step 3' if(result.bool){ @@ -2337,7 +3162,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.storage['dddxiaheng_del']) event.finish(); else{ if(!targets.contains(player)) player.loseMaxHp(); - if(targets.length==1) player.loseHp(); + if(targets.length==1){ + player.removeSkill('dddxiaheng'); + game.log(player,'失去了技能','#g【侠横】'); + } } 'step 5' if(player.getStorage('dddxiaheng').length>=3){ @@ -2507,15 +3335,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ group:'dddyulv_enter', content:function(){ 'step 0' - player.chooseControl(Array.from({length:13},(_,i)=>get.strNumber(i+1))).set('prompt','玉律:声明一个点数').set('ai',()=>_status.event.controls.randomGet()); + player.draw(); 'step 1' - player.popup(result.control); - var number=result.index+1; - player.storage['dddyulv']=number; - player.markSkill('dddyulv'); + if(!player.countCards('he')) event.finish(); + else player.chooseCard('玉律:将一张牌置于武将牌上',true); + 'step 2' + if(result.bool){ + player.addToExpansion(result.cards,player,'give').gaintag.add('dddyulv'); + } }, + marktext:'律', intro:{ - content:'声明的点数为#', + markcount:'expansion', + content:'expansion', }, subSkill:{ enter:{ @@ -2524,9 +3356,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, filter:function(event,player){ var cards=event.getd(); - if(!cards.length||!player.storage['dddyulv']) return false; + if(!cards.length) return false; + const card=player.getExpansions('dddyulv')[0]; + if(!card) return false; + const number=get.number(card,false); if(!_status.currentPhase||!_status.currentPhase.isIn()) return false; - return cards.some(i=>get.number(i,false)==player.storage['dddyulv']); + return cards.some(i=>get.number(i,false)==number); }, content:function(){ 'step 0' @@ -2538,18 +3373,80 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var reset=false; if(result.index==0) _status.currentPhase.draw(); else _status.currentPhase.chooseToDiscard(true,'he'); - if(_status.currentPhase.hasSkill('dddyulv_'+result.index)) reset=true; - _status.currentPhase.removeSkill('dddyulv_0'); - _status.currentPhase.removeSkill('dddyulv_1'); - _status.currentPhase.addSkill('dddyulv_'+result.index); + var reset=player.getHistory('useSkill',evt=>{ + return evt.skill=='dddyulv_enter'; + }).length==2; + if(!reset) event.finish(); + 'step 2' + if(!player.countCards('h')) player.draw(); + 'step 3' + if(!player.countCards('h')) event.finish(); + else player.chooseCard('玉律:选择一张手牌交换“玉律”('+get.translation(player.getExpansions('dddyulv'))+')',true); + 'step 4' + if(result.bool){ + player.gain(player.getExpansions('dddyulv'),player,'give'); + player.addToExpansion(result.cards,player,'log','give').gaintag.add('dddyulv'); + } + } + }, + } + }, + dddyulv_old:{ + audio:2, + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, + group:'dddyulv_old_enter', + content:function(){ + 'step 0' + player.chooseControl(Array.from({length:13},(_,i)=>get.strNumber(i+1))).set('prompt','玉律:声明一个点数').set('ai',()=>_status.event.controls.randomGet()); + 'step 1' + player.popup(result.control); + var number=result.index+1; + player.storage['dddyulv_old']=number; + player.markSkill('dddyulv_old'); + }, + intro:{ + content:'声明的点数为#', + }, + subSkill:{ + enter:{ + trigger:{global:['loseAfter','cardsDiscardAfter','loseAsyncAfter','equipAfter']}, + forced:true, + direct:true, + filter:function(event,player){ + var cards=event.getd(); + if(!cards.length||!player.storage['dddyulv_old']) return false; + if(!_status.currentPhase||!_status.currentPhase.isIn()) return false; + return cards.some(i=>get.number(i,false)==player.storage['dddyulv_old']); + }, + content:function(){ + 'step 0' + player.chooseControl('摸牌','弃牌').set('prompt','玉律:令'+get.translation(_status.currentPhase)+'摸一张牌或弃置一张牌').set('ai',()=>{ + return get.attitude(_status.event.player,_status.currentPhase)>0?'摸牌':'弃牌'; + }); + 'step 1' + player.logSkill('dddyulv_old_enter',_status.currentPhase); + var reset=false; + if(result.index==0) _status.currentPhase.draw(); + else _status.currentPhase.chooseToDiscard(true,'he'); + if(_status.currentPhase.hasSkill('dddyulv_old_'+result.index)) reset=true; + _status.currentPhase.removeSkill('dddyulv_old_0'); + _status.currentPhase.removeSkill('dddyulv_old_1'); + _status.currentPhase.addSkill('dddyulv_old_'+result.index); if(!reset) event.finish(); 'step 2' player.chooseControl(Array.from({length:13},(_,i)=>get.strNumber(i+1))).set('prompt','玉律:重新声明一个点数').set('ai',()=>_status.event.controls.randomGet()); 'step 3' player.popup(result.control); var number=result.index+1; - player.storage['dddyulv']=number; - player.markSkill('dddyulv'); + player.storage['dddyulv_old']=number; + player.markSkill('dddyulv_old'); 'step 4' var evt=trigger.getParent('phaseUse'); if(evt&&evt.name=='phaseUse'){ @@ -2596,7 +3493,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ current.chooseTarget('是否视为对一名没赢的角色使用一张【杀】?',(card,player,target)=>{ return player.canUse('sha',target,false)&&_status.event.targets.contains(target); }).set('ai',target=>{ - return get.effect(target,{name:'sha'},_status.event.player); + return get.effect(target,{name:'sha'},get.player(),get.player()); }).set('targets',event.targets); 'step 3' if(result.bool){ @@ -3083,7 +3980,122 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, content:function(){ 'step 0' - var vpos=player.hasMark('dddyouxue')?game.filterPlayer2(i=>i.getSeatNum()==player.countMark('dddyouxue'))[0]:player; + if(!game.hasPlayer(current=>current.hasMark('dddyouxue'))) player.addMark('dddyouxue'); + if(!game.hasPlayer(current=>!current.hasMark('dddyouxue'))) event.finish(); + 'step 1' + player.chooseTarget('游学:将“游学”标记交给另一名角色',true,(card,player,target)=>{ + return !target.hasMark('dddyouxue'); + }).set('ai',target=>{ + return get.distance(game.findPlayer(current=>current.hasMark('dddyouxue')),target); + }); + 'step 2' + if(result.bool){ + var target=result.targets[0]; + var source=game.findPlayer(current=>current.hasMark('dddyouxue')); + if(source==player) player.line(target,'green'); + else player.line2([source,target],'green'); + source.clearMark('dddyouxue'); + target.addMark('dddyouxue'); + player.draw(get.distance(source,target)); + } + }, + marktext:'游', + intro:{ + name:'游学', + content:()=>get.translation(game.filterPlayer(current=>current.hasSkill('dddyouxue')))+'到此一游', + }, + }, + dddchengjing:{ + audio:2, + trigger:{global:'phaseEnd'}, + filter:function(event,player){ + if(!event.player.hasMark('dddyouxue')) return false; + return event.player.hasHistory('useCard',evt=>{ + if(!['basic','trick'].includes(get.type(evt.card))) return false; + if(!evt.card.isCard||evt.cards.length!=1) return false; + return get.position(evt.cards[0],true)=='d'; + }); + }, + forced:true, + locked:false, + group:'dddchengjing_use', + logTarget:'player', + content:function*(event,map){ + const player=map.player,trigger=map.trigger,target=trigger.player; + let history=target.getHistory('useCard').reverse(); + let cards=[]; + for(var evt of history){ + if(!['basic','trick'].includes(get.type(evt.card))) continue; + if(!evt.card.isCard||evt.cards.length!=1) continue; + if(get.position(evt.cards[0],true)=='d'){ + cards.addArray(evt.cards); + break; + } + } + const jing=player.getExpansions('dddchengjing'); + if(jing.length) player.loseToDiscardpile(jing); + player.addToExpansion(cards,'log','gain2').gaintag.add('dddchengjing'); + }, + marktext:'经', + intro:{ + name:'经(承经)', + name2:'经', + markcount:'expansion', + content:'expansion', + }, + subSkill:{ + use:{ + audio:'dddchengjing', + enable:'phaseUse', + usable:1, + filterCard:true, + position:'hes', + filter:function(event,player){ + return player.getExpansions('dddchengjing').length; + }, + viewAs:function(cards,player){ + const card=player.getExpansions('dddchengjing')[0]; + return new lib.element.VCard({ + name:get.name(card,false), + nature:get.nature(card,false), + storage:{dddchengjing:true}, + }); + }, + popname:true, + prompt:function(){ + const card=get.player().getExpansions('dddchengjing')[0]; + return '将一张牌当'+get.translation({ + name:get.name(card,false), + nature:get.nature(card,false) + })+'使用'; + }, + precontent:function(){ + player.when('useCardAfter').filter(evt=>evt.card.storage.dddchengjing).then(()=>{ + var cards=trigger.cards.filterInD('od'); + if(!cards.length){event.finish();return}; + var target=game.findPlayer(current=>current.hasMark('dddyouxue')); + if(!target){event.finish();return}; + target=target.getNext(); + event.target=target; + player.chooseBool(`承经:是否将${get.translation(cards)}交给${get.translation(target)}?`).set('choice',get.attitude(player,target)>0); + }).then(()=>{ + if(result.bool){ + player.line(event.target); + player.addExpose(0.1); + event.target.gain(trigger.cards.filterInD('od'),'gain2'); + } + }); + }, + } + }, + }, + dddyouxue_old:{ + audio:2, + trigger:{global:'roundStart'}, + forced:true, + content:function(){ + 'step 0' + var vpos=player.hasMark('dddyouxue_old')?game.filterPlayer2(i=>i.getSeatNum()==player.countMark('dddyouxue_old'))[0]:player; event.vpos=vpos; player.chooseTarget('游学:选择你的行动次序',true).set('ai',target=>{ return get.distance(_status.event.vpos,target); @@ -3094,9 +4106,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.vpos==player) player.line(target,'green'); else player.line2([event.vpos,target],'green'); event.num=get.distance(event.vpos,target); - player.storage['dddyouxue']=target.getSeatNum(); - player.addSkill('dddyouxue_act'); - player.markSkill('dddyouxue'); + player.storage['dddyouxue_old']=target.getSeatNum(); + player.addSkill('dddyouxue_old_act'); + player.markSkill('dddyouxue_old'); } else event.finish(); 'step 2' @@ -3121,9 +4133,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, filter:function(event,player,name){ if(event.skill) return false; - var vseat=player.countMark('dddyouxue'); + var vseat=player.countMark('dddyouxue_old'); if(name!='phaseBefore'){ - if(player.hasSkill('dddyouxue_acted',null,false,false)) return false; + if(player.hasSkill('dddyouxue_old_acted',null,false,false)) return false; var seat=event.player.getSeatNum(); var next=event.player.next; if(!game.players.contains(next)) next=game.findNext(next); @@ -3144,26 +4156,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.trigger('phaseYouxueed'); } else{ - player.insertPhase('dddyouxue_act'); - player.addTempSkill('dddyouxue_acted','roundStart'); + player.insertPhase('dddyouxue_old_act'); + player.addTempSkill('dddyouxue_old_acted','roundStart'); } } }, acted:{charlotte:true} } }, - dddchengjing:{ + dddchengjing_old:{ audio:2, usable:1, enable:'phaseUse', filter:function(event,player){ - return player.countCards('hes')&&player.countMark('dddyouxue')&&lib.skill['dddchengjing'].getList(player).length; + return player.countCards('hes')&&player.countMark('dddyouxue_old')&&lib.skill['dddchengjing_old'].getList(player).length; }, getList:function(player){ - var vpos=player.hasMark('dddyouxue')?game.filterPlayer2(i=>i.getSeatNum()==player.countMark('dddyouxue'))[0]:player; + var vpos=player.hasMark('dddyouxue_old')?game.filterPlayer2(i=>i.getSeatNum()==player.countMark('dddyouxue_old'))[0]:player; if(!vpos||!vpos.isIn()) return []; var vcard=[]; - var history=vpos.getPrevious().actionHistory.filter(evt=>!evt.custom.some(i=>i['dddyouxue'])); + var history=vpos.getPrevious().actionHistory.filter(evt=>!evt.custom.some(i=>i['dddyouxue_old'])); history=history[history.length-2]; var evts=history.useCard; for(var evt of evts){ @@ -3179,7 +4191,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, chooseButton:{ dialog:function(event,player){ - var list=lib.skill['dddchengjing'].getList(player); + var list=lib.skill['dddchengjing_old'].getList(player); list.sort((a,b)=>{ return 100*(lib.inpile.indexOf(a[2])-lib.inpile.indexOf(b[2]))+lib.inpile_nature.indexOf(a[3])-lib.inpile_nature.indexOf(b[3]); }); @@ -3202,7 +4214,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ backup:function(links,player){ return { filterCard:true, - audio:'dddchengjing', + audio:'dddchengjing_old', popname:true, check:function(card){ return 8-get.value(card); @@ -3211,10 +4223,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ viewAs:{ name:links[0][2], nature:links[0][3], - storage:{'dddchengjing':true} + storage:{'dddchengjing_old':true} }, precontent:function(){ - player.addTempSkill('dddchengjing_effect'); + player.addTempSkill('dddchengjing_old_effect'); }, } }, @@ -3223,7 +4235,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, ai:{ - combo:'dddyouxue', + combo:'dddyouxue_old', order:1, result:{ player:1, @@ -3231,18 +4243,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ effect:{ - audio:'dddchengjing', + audio:'dddchengjing_old', trigger:{global:'useCardAfter'}, charlotte:true, direct:true, filter:function(event,player){ - return event.card&&event.card.storage&&event.card.storage['dddchengjing']; + return event.card&&event.card.storage&&event.card.storage['dddchengjing_old']; }, content:function(){ 'step 0' var damaged=game.hasPlayer2(current=>current.hasHistory('damage',evt=>evt.card==trigger.card)); event.damaged=damaged; - var vpos=player.hasMark('dddyouxue')?game.filterPlayer2(i=>i.getSeatNum()==player.countMark('dddyouxue'))[0]:player; + var vpos=player.hasMark('dddyouxue_old')?game.filterPlayer2(i=>i.getSeatNum()==player.countMark('dddyouxue_old'))[0]:player; var target=vpos.getNext(); event.target=target; player.chooseControl(' +1 ',' -1 ','cancel2').set('prompt','是否令“虚位”下家('+get.translation(target)+')下回合的'+(damaged?'摸牌数':'手牌上限')+'+1或-1?').set('ai',function(){ @@ -3253,10 +4265,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('target',target); 'step 1' if(result.index!=2){ - player.logSkill('dddchengjing_effect',target); + player.logSkill('dddchengjing_old_effect',target); var name=(event.damaged?'draw':'limit')+result.index; - target.addTempSkill('dddchengjing_check',{player:'phaseAfter'}); - target.addMark('dddchengjing_'+name,1,false); + target.addTempSkill('dddchengjing_old_check',{player:'phaseAfter'}); + target.addMark('dddchengjing_old_'+name,1,false); game.log(target,'下回合的'+(event.damaged?'摸牌数':'手牌上限'),'#y'+(['+1','-1'][result.index])); } } @@ -3266,21 +4278,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, forced:true, filter:function(event,player){ - return player.countMark('dddchengjing_draw0')||player.countMark('dddchengjing_draw1'); + return player.countMark('dddchengjing_old_draw0')||player.countMark('dddchengjing_old_draw1'); }, content:function(){ - trigger.num+=player.countMark('dddchengjing_draw0')-player.countMark('dddchengjing_draw1'); + trigger.num+=player.countMark('dddchengjing_old_draw0')-player.countMark('dddchengjing_old_draw1'); }, mod:{ maxHandcard:function(player,num){ - return num+player.countMark('dddchengjing_limit0')-player.countMark('dddchengjing_limit1'); + return num+player.countMark('dddchengjing_old_limit0')-player.countMark('dddchengjing_old_limit1'); } }, onremove:function(player){ - delete player.storage['dddchengjing_draw0']; - delete player.storage['dddchengjing_draw1']; - delete player.storage['dddchengjing_limit0']; - delete player.storage['dddchengjing_limit1']; + delete player.storage['dddchengjing_old_draw0']; + delete player.storage['dddchengjing_old_draw1']; + delete player.storage['dddchengjing_old_limit0']; + delete player.storage['dddchengjing_old_limit1']; }, mark:true, marktext:'承', @@ -3288,12 +4300,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'承经', content:function(storage,player){ var str=''; - if(player.countMark('dddchengjing_draw0')||player.countMark('dddchengjing_draw1')){ - var num=player.countMark('dddchengjing_draw0')-player.countMark('dddchengjing_draw1'); + if(player.countMark('dddchengjing_old_draw0')||player.countMark('dddchengjing_old_draw1')){ + var num=player.countMark('dddchengjing_old_draw0')-player.countMark('dddchengjing_old_draw1'); str+='
  • 摸牌阶段摸牌数'+(num>=0?'+':'')+num; } - if(player.countMark('dddchengjing_limit0')||player.countMark('dddchengjing_limit1')){ - var num=player.countMark('dddchengjing_limit0')-player.countMark('dddchengjing_limit1'); + if(player.countMark('dddchengjing_old_limit0')||player.countMark('dddchengjing_old_limit1')){ + var num=player.countMark('dddchengjing_old_limit0')-player.countMark('dddchengjing_old_limit1'); str+='
  • 手牌上限'+(num>=0?'+':'')+num; } return str; @@ -3322,6 +4334,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lose:false, delay:false, prepare:'throw', + group:'dddduanbing_effect', + position:'he', content:function(){ 'step 0' player.addJudge({name:'bingliang'},cards); @@ -3329,7 +4343,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.delayx(); player.draw(2); 'step 2' - player.addTempSkill('dddduanbing_effect'); player.chooseUseTarget({ name:'sha', isCard:true, @@ -3351,29 +4364,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{source:'damageSource'}, charlotte:true, filter:function(event,player){ - if(!event.card||!event.card.storage||!event.card.storage._dddduanbing) return false; if(event.getParent().type!='card'||!event.player.isIn()) return false; - var cards=event.getParent(4).cards; - if(cards&&cards.length==1){ - var card=cards[0]; - return player.getCards('j').contains(card)&&(card.viewAs||card.name)=='bingliang'&&event.player.canAddJudge(card); - } - return false; + return player.hasCard(card=>{ + return (card.viewAs||card.name)=='bingliang'&&event.player.canAddJudge(card); + },'j'); }, prompt:(event)=>('是否将【兵粮寸断】转移给'+get.translation(event.player)+'?'), check:function(event,player){ - var cards=event.getParent(4).cards; - if(cards&&cards.length==1){ - var card=get.autoViewAs({name:'bingliang'},cards); - return get.effect(event.player,card,player,player)>=0; - } - return false; + return player.hasCard(card=>{ + return (card.viewAs||card.name)=='bingliang'&&event.player.canAddJudge(card)&&get.effect(event.player,card,player,player)>=0; + },'j'); }, content:function(){ - var card=trigger.getParent(4).cards[0],target=trigger.player; + var cards=player.getCards('j',card=>{ + return (card.viewAs||card.name)=='bingliang'&&trigger.player.canAddJudge(card); + }); + var target=trigger.player; player.line(target); - player.$give(card,target); - target.addJudge({name:'bingliang'},card); + player.$give(cards,target,false); + cards.forEach(card=>{ + target.addJudge({name:'bingliang'},card); + }); }, }, }, @@ -3381,10 +4392,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //轲比能 dddxiaoxing:{ audio:2, - forced:true, trigger:{global:'gameDrawBegin'}, forced:true, group:'dddxiaoxing_remove', + init:function(player,skill){ + if(game.online) return; + var bool=get.event().getParent('phaseLoop',true); + if(!bool) return; + if(player.hasSkill(skill)){ + player.logSkill('dddxiaoxing'); + player.draw(3); + } + }, content:function(){ var me=player; var numx=trigger.num; @@ -3408,11 +4427,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ remove:{ trigger:{player:'dying'}, forced:true, - direct:true, - filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source.getEquips(1).length>0; - }, + // direct:true, + // filter:function(event,player){ + // return event.source&&event.source.isIn()&&event.source.getEquips(1).length>0; + // }, content:function(){ + player.removeSkill('dddxiaoxing'); + game.log(player,'失去了技能','#g【枭行】'); + }, + content_old:function(){ 'step 0' trigger.source.chooseBool(get.prompt('dddxiaoxing',player),'废除武器栏,令其失去〖枭行〗').set('ai',()=>{ if(_status.event.maybe) return Math.random()<0.5; @@ -3435,6 +4458,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ logTarget:function(event,player){ return game.filterPlayer(current=>player.inRange(current)&¤t.countCards('he')); }, + prompt:'是否发动【狼志】?', + prompt2:function(event,player){ + return `展示${get.translation(game.filterPlayer(current=>player.inRange(current)&¤t.countCards('he')))}的各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。` + }, content:function(){ 'step 0' event.targets=game.filterPlayer(current=>player.inRange(current)&¤t.countCards('he')); @@ -3456,12 +4483,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ event.videoId=lib.status.videoId++; if(event.isMine()){ - event.dialog=ui.create.dialog('###是否替换其中的任意张牌?###或点击“取消”,获得所有展示牌,然后失去〖狼志〗',cards); + event.dialog=ui.create.dialog('###是否替换其中的任意张牌?###
    或点击“取消”,获得所有展示牌,然后失去〖狼志〗
    ',cards); event.dialog.videoId=event.videoId; } else if(player.isOnline2()){ player.send(function(cards,id){ - var dialog=ui.create.dialog('###是否替换其中的任意张牌?###或点击“取消”,获得所有展示牌,然后失去〖狼志〗',cards); + var dialog=ui.create.dialog('###是否替换其中的任意张牌?###
    或点击“取消”,获得所有展示牌,然后失去〖狼志〗
    ',cards); dialog.videoId=id; },cards,event.videoId); } @@ -3532,9 +4559,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, zhuSkill:true, trigger:{ - global:['discardBegin','drawBegin'], + // global:['discardBegin','drawBegin'], + global:'dieAfter', }, filter:function(event,player){ + if(!event.source||!event.source.isIn()||event.source.group!='qun') return false; + if(!event.souce.countCards('he')<2) return false; + if(!player.hasZhuSkill('dddfuyi',event.source)) return false; + const skills=player.getStockSkills(true,true).filter(skill=>{ + return !player.hasSkill(skill,null,false,false); + }); + return skills.length; + }, + filter_old:function(event,player){ var evt=event.getParent(); if(evt.name!='die'||evt.source!=event.player||event.player==player) return false; if(!player.hasZhuSkill('dddfuyi',event.player)) return false; @@ -3542,7 +4579,37 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return !skills.contains('dddxiaoxing')||!skills.contains('dddlangzhi'); }, direct:true, + global:'dddfuyi_sha', content:function(){ + 'step 0' + trigger.source.chooseCard('是否响应'+get.translation(player)+'的【附义】?','弃置两张牌,令其获得其武将牌上的一个技能','he',2,lib.filter.cardDiscardable).set('ai',()=>{ + if(get.attitude(_status.event.player,_status.event.getParent().player)<=2) return 0; + return 6-get.value(card); + }); + 'step 1' + if(result.bool){ + player.logSkill('dddfuyi',trigger.source); + trigger.source.discard(result.cards).discarder=trigger.source; + var skills=player.getStockSkills(true,true).filter(skill=>{ + return !player.hasSkill(skill,null,false,false); + }); + if(skills.length==1) event._result={control:skills[0]}; + else trigger.source.chooseControl(skills).set('choiceList',skills.map(skill=>{ + return '
    【'+get.translation(lib.translate[skill+'_ab']||get.translation(skill).slice(0,2))+'】
    '+get.skillInfoTranslation(skill,player)+'
    '; + })).set('displayIndex',false).set('prompt',`附义:选择令${get.translation(player)}获得一个技能`).set('ai',()=>{ + var controls=get.event('controls'); + if(controls.includes('dddxiaoxing')) return 'dddxiaoxing'; + return controls.sort((a,b)=>{ + return get.skillrank(b,'inout')-get.skillrank(a,'inout'); + })[0]; + }); + } + else event.finish(); + 'step 2' + var skill=result.control; + player.addSkillLog(skill); + }, + content_old:function(){ 'step 0' var str='取消此次奖惩,令其获得'; var skills=player.getSkills('dddxiaoxing',null,false,false); @@ -3586,7 +4653,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 2' player.removeSkill('dddfuyi'); game.log(player,'失去了技能','#g【附义】'); - } + }, + subSkill:{ + sha:{ + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha'){ + if(player.group!='qun') return; + return num+game.countPlayer(current=>{ + return current.hasZhuSkill('dddfuyi',player); + }); + } + }, + }, + }, + }, }, //曹爽 dddzhuanshe:{ @@ -3760,12 +4841,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{global:'phaseBegin'}, filter:function(event,player){ - var evts=game.getAllGlobalHistory('cardMove'); + var evts=game.getAllGlobalHistory('everything',evt=>['useCard','respond'].includes(evt.name)); if(!evts.length) return false; - var cards=evts[evts.length-1].cards; - return cards.some(i=>{ - return get.color(i,false)=='black'&&get.position(i,true)=='d'; - }); + const color=get.color(evts.lastItem.card,false); + return color=='black' }, direct:true, content:function(){ @@ -3897,6 +4976,41 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, + dddfuzong:{ + audio:2, + zhuSkill:true, + forced:true, + trigger:{ + global:'phaseBefore', + player:'enterGame', + }, + forced:true, + filter:function(event,player){ + if(!player.hasZhuSkill('dddfuzong')) return false; + return (event.name!='phase'||game.phaseNumber==0); + }, + group:'dddfuzong_discard', + content:function(){ + player.draw(game.countPlayer(current=>{ + return current.group=='qun'; + })); + }, + subSkill:{ + discard:{ + trigger:{global:'die'}, + filter:function(event,player){ + if(!player.hasZhuSkill('dddfuzong')) return false; + return event.player.group=='qun'; + }, + zhuSkill:true, + forced:true, + logTarget:'player', + content:function(){ + trigger.player.discardPlayerCard(player,'he',true).set('forceDie',true); + }, + } + } + }, //夏侯玄 dddlanghuai:{ audio:2, @@ -4137,17 +5251,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'phaseZhunbeiBegin'}, filter:function(event,player){ - return game.hasPlayer(current=>current.isMaxEquip(true)&¤t.countGainableCards(player,'he'))||game.countPlayer(current=>current.hp==1)==1; + return game.hasPlayer(current=>current.isMaxEquip(true)&¤t.countGainableCards(player,'he'))||game.hasPlayer(current=>current.getHp()==1); }, direct:true, content:function(){ 'step 0' player.chooseTarget(get.prompt2('dddbailei'),(card,player,target)=>{ - return target.isMaxEquip(true)&&target.countGainableCards(player,'he')||target.hp==1&&game.countPlayer(current=>current.hp==1)==1; + return target.isMaxEquip(true)&&target.countGainableCards(player,'he')||target.getHp()==1; }).set('ai',target=>{ var att=get.attitude(_status.event.player,target); if(att>=3) return false; - if(target.hp==1&&game.countPlayer(current=>current.hp==1)==1) return 100; + if(target.hp==1) return 100; return 1; }); 'step 1' @@ -4155,9 +5269,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=result.targets[0]; event.target=target; player.logSkill('dddbailei',target); - if(target.isMaxEquip(true)&&target.hp==1&&game.countPlayer(current=>current.hp==1)==1){ + if(target.isMaxEquip(true)&&target.hp==1){ if(target.countGainableCards(player,'he')){ - player.gainPlayerCard('拜泪:获得'+get.translation(target)+'一张牌,或点击“取消”杀死其','he',target); + player.gainPlayerCard('拜泪:获得'+get.translation(target)+'一张牌,或点击“取消”对其造成1点伤害','he',target); } else event._result={bool:false}; } @@ -4170,12 +5284,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 2' if(!result.bool){ player.line(target); - player.trySkillAnimate('dddbailei_animate','dddbailei_animate',player.checkShow('dddbailei')); + // player.trySkillAnimate('dddbailei_animate','dddbailei_animate',player.checkShow('dddbailei')); + target.damage(); game.delayx(); } else event.finish(); 'step 3' - target.die({source:player}); + if(target.isIn()){event.finish(); return}; player.removeSkill('dddbailei'); game.log(player,'失去了技能','#g【拜泪】'); }, @@ -4189,7 +5304,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dynamicTranslate:{ dddxiaheng:function(player){ - return '锁定技,出牌阶段开始时,你令一名角色弃置两张牌(不足则全弃),再对一名角色造成1点伤害'+(player.storage['dddxiaheng_del']?'':'。“若两名角色:均不为你,你失去一点体力上限;为同一名角色,你失去一点体力;然后若以此法对包括你在内三名不同的角色造成伤害,删除双引号里的描述内容”')+'。'; + return '锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。'+(player.storage['dddxiaheng_del']?'':'。“若两名角色:均不为你,你失去一点体力上限;为同一名角色,你失去一点体力;然后若以此法对包括你在内三名不同的角色造成伤害,删除双引号里的描述内容”'); }, dddshichao:function(player){ return '锁定技,准备阶段,你选择一名手牌数为全场第('+(1+player.countMark('dddshichao'))+')大的角色,将手牌数调整至与其相等且至多等于主公的体力上限;其于你的下回合开始前对你造成伤害时,其可防止之,然后令()内的数字+1。'; @@ -4206,7 +5321,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return '出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃置”。'; }, dddyeshen:function(player){ - return '一名角色的结束阶段,你可以亮出牌堆底'+get.cnNumber(3-player.countMark('dddyeshen'))+'张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张,你复原此技能并对自己造成一点火焰伤害。'; + return '一名角色的结束阶段,你可以亮出牌堆底'+get.cnNumber(3-player.countMark('dddyeshen'))+'张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。'; }, }, translate:{ @@ -4220,9 +5335,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddxuxiao_info:"当有黑色基本牌因弃置而进入弃牌堆后,你可将其当做【兵粮寸断】置于一名角色的判定区,然后其摸两张牌。", ddd_xujing:"许靖", dddxuyu:"虚誉", - dddxuyu_info:"当你于出牌阶段使用的第一张牌结算结束后,你可以摸两张牌。若如此做,当你于本阶段使用的第三张牌结算结束后,你弃置一张牌。", + dddxuyu_info:"当你使用牌结算结束后,你可以摸一张牌。若如此做,当你于本回合使用下一张牌结算结束后,你弃置一张牌。", dddshijian:"实荐", - dddshijian_info:"其他角色于出牌阶段使用的第三张牌结算结束后,你可以令其摸一张牌。若如此做,当其于本阶段使用的第四张牌结算结束后,你摸两张牌。", + dddshijian_info:"其他角色于其出牌阶段使用的第二张牌结算结束后,你可以交给其一张牌。若如此做,其本回合使用的下一张牌指定第一个目标时,你选择一项:1.令此牌额外结算一次;2.你摸一张牌。", ddd_caomao:"曹髦", dddtaisi:"太思", dddtaisi_info:"一名角色的回合结束时,若你的体力值于本回合内发生过变化,则你可以令一名角色获得一张于本回合内进入弃牌堆的牌。然后若该角色于本回合内对你造成过伤害,则你摸两张牌。", @@ -4246,17 +5361,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ visible_dddxianglang:"明", ddd_yujin:'于禁', dddzhengjun:'整军', - dddzhengjun_info:'出牌阶段内每项各限一次。当有其他角色的手牌数/体力值/装备区内牌数变化后,若其的对应数值与你相同,则你可以执行对应的选项。体力值:你令一名角色回复1点体力;手牌数:你令一名角色摸一张牌;装备区内牌数:你移动场上的一张装备牌。', + dddzhengjun_info:'出牌阶段内每项各限一次。当有角色的手牌数/体力值/装备区内牌数变化后,若其的对应数值与你相同,则你可以执行对应的选项。体力值:你令其回复或失去1点体力;手牌数:你令其摸或弃置一张牌;装备区内牌数:你移动其的一张装备牌。', ddd_liuye:'刘晔', dddchashi:'察势', - dddchashi_info:'其他角色的出牌阶段开始时,你可展示一张牌A。若其本阶段内:已经使用过牌,{则你判断A和第一张使用的牌的花色,若花色相同,则其获得A,你摸一张牌};未使用过牌,{则当其于本阶段内使用第一张牌时,若此牌与A花色相同,其获得A,然后你摸一张牌}。', + dddchashi_info:'其他角色的出牌阶段开始时,你可弃置一张牌A。当其于本阶段内使用下一张牌结算结束后,若此牌与A花色或类型相同,你与其各摸一张牌。', dddqice:'齐策', - dddqice_info:'准备阶段开始时,你可以摸两张牌。若如此做,本回合的结束阶段开始时,若你本回合内:使用过普通锦囊牌,则你可以视为使用这些牌中的一张;未使用过普通锦囊牌,则你失去此技能。', + dddqice_info:'准备阶段开始时,你可以摸两张牌,然后你的〖齐策〗失效直到你使用锦囊牌。', ddd_baosanniang:'鲍三娘', dddzhilian:'枝连', - dddzhilian_info:'一名角色的回合结束时,若本回合使用过牌的角色数为2,则你可以令这些角色各摸一张牌或各弃置一张牌。然后若这两名角色中包含你,则你获得本回合内进入弃牌堆的所有【杀】。', + dddzhilian_info:'一名角色的回合结束时,若本回合仅有你与另一名男性角色使用或打出过牌,则你可以令你与其各摸一张牌或各弃置一张牌,然后你获得本回合内进入弃牌堆的所有【杀】。', dddjijian:'赍剑', - dddjijian_info:'出牌阶段限一次。你可以指定一名其他男性角色,令其展示至多两张手牌。然后你可以交给其一张【杀】,且其可以依次视为使用X张与其手牌中未展示牌牌名相同的不重复基本牌或普通锦囊牌(X为此【杀】与其展示牌中颜色相同的牌的数量)。', + dddjijian_info:'出牌阶段限一次。你可以展示一张【杀】并交给一名其他男性角色,然后其展示至多两张颜色相同的【杀】或普通锦囊牌,你与其依次视为使用一张其展示的牌(不能重复使用同一张展示牌)。', ddd_zhenji:'甄姬', dddmiaoxing:'淼形', dddmiaoxing_info:'锁定技。①分发起始手牌时,你额外获得两份起始手牌,然后将其中的两份移出游戏,称为“水相”。②摸牌阶段结束后,你须将至少一份“水相”调整至与你的手牌数相等。', @@ -4267,12 +5382,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddfenji_info:'摸牌/弃牌阶段开始时,你可视为使用一张未以此法使用过的普通锦囊牌,然后将此阶段摸牌/弃牌数改为此牌造成的伤害值/此牌的目标数。', ddd_zhouchu:'周处', dddxiaheng:'侠横', - dddxiaheng_info:'锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。“若这两名角色:均不为你,你减1点体力上限;为同一名角色,你失去1点体力;然后若你以此法对三名不同的角色造成过伤害,删除该技能双引号里的描述。”', + dddxiaheng_info:'锁定技。出牌阶段开始时,你选择一名角色,其弃置两张牌,然后你对一名角色造成1点伤害。“若这两名角色:均不为你,你减1点体力上限;为同一名角色,你失去〖侠横〗;然后若你以此法对三名不同的角色造成过伤害,删除该技能双引号里的描述。”', ddd_liuba:'刘巴', dddfengzheng:'丰政', dddfengzheng_info:'①每名角色的出牌阶段限一次。其可将点数之和为13的任意张手牌当一张【无中生有】使用。②一轮游戏开始时,你可观看并分配牌堆顶的X张牌(X为上一轮发动过〖丰政〗的角色数),若有角色以此法得到的牌数多于两张,你失去〖丰政〗。', dddyulv:'玉律', - dddyulv_info:'锁定技。①游戏开始时,你声明一个点数。②当有你〖玉律①〗声明的点数的牌进入弃牌堆后,你令当前回合角色摸一张牌或弃置一张牌。然后该角色连续以此法摸牌或弃牌,你为〖玉律①〗重新声明一个点数,然后于结算后结束当前回合。', + dddyulv_info:'锁定技。①游戏开始时,你摸一张牌。将一张手牌置于武将牌上,称为“玉律”。②当有与“玉律”牌点数相同的牌进入弃牌堆后,你令当前回合角色摸一张牌或弃置一张牌。然后若本次为此回合使用的第二次〖玉律②〗,你用一张手牌交换“玉律”牌(若你没有手牌则先摸一张牌)。', ddd_jianshuo:'蹇硕', dddfenye:'分野', dddfenye_info:'出牌阶段限一次。你可与一名其他角色拼点,其余角色于此次拼点中可加入其中一方并扣置一张手牌作为其拼点牌,本次拼点判断胜负的条件改为比较双方点数均值。然后拼点胜方角色依次可视为对一名不同的拼点败方角色使用【杀】。', @@ -4280,20 +5395,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddshichao_info:'锁定技。准备阶段,你选择一名手牌数为全场第(1)大的角色,将手牌数调整至与其相等且至多等于主公的体力上限。然后当其于你的下回合开始前对你造成伤害时,其可防止之,令你〖逝潮〗的()内的数字+1。', ddd_guanning:'管宁', dddyouxue:'游学', - dddyouxue_info:'锁定技。一轮游戏开始时,你选择一名角色并以此确定你的行动次序,其对应的座次位置称为“虚位”,然后你执行额定的摸牌阶段,且摸牌数改为“虚位”移动的距离。', + dddyouxue_info:'锁定技。一轮游戏开始时,你将场上的“游学”标记交给一名其他角色(若场上没有“游学”,你获得“游学”),然后摸X张牌(X为本次失去“游学”的角色至获得“游学”的角色的距离)。', dddchengjing:'承经', - dddchengjing_info:'出牌阶段限一次。你可将一张牌当虚位上家角色上回合使用的一张基本牌或普通锦囊牌使用,若之造成/未造成伤害,你可令虚位下家角色下回合的摸牌数/手牌上限+1或-1。', + dddchengjing_info:'①一名角色的回合结束时,若其有“游学”,你将其于此回合内使用的最后一张{非转化且对应的实体牌数为1且均位于弃牌堆中}的基本牌或普通锦囊牌对应的所有实体牌置于武将牌上,称为“经”(若你此前有“经”,你先将这些“经”置入弃牌堆)。②出牌阶段限一次,你可以将一张牌当“经”使用,然后可以将该牌交给有“游学”的角色的下家。', ddd_dingfeng:'丁奉', dddduanbing:'短兵', - dddduanbing_info:'出牌阶段,你可将一张黑色非锦囊牌当一张【兵粮寸断】置入自己的判定区,摸两张牌,然后视为使用一张无视距离限制的【杀】;当此【杀】对目标角色造成伤害后,你可将此【兵粮寸断】移至目标角色的判定区。', + dddduanbing_info:'①出牌阶段,你可将一张黑色非锦囊牌当一张【兵粮寸断】置入自己的判定区,摸两张牌,然后视为使用一张无视距离限制的【杀】。②当你使用【杀】对目标角色造成伤害后,若你判定区里有【兵粮寸断】,你可将【兵粮寸断】移至目标角色的判定区。', ddd_kebineng:'轲比能', dddxiaoxing:'枭行', - dddxiaoxing_info:'锁定技。①你的初始手牌,攻击范围和手牌上限+3。②当你进入濒死状态时,来源可以废除其有装备牌的武器栏,然后令你失去〖枭行〗。', + dddxiaoxing_info:'锁定技。①你的初始手牌,攻击范围和手牌上限+3。②当你进入濒死状态时,你失去〖枭行〗。③当你获得〖枭行〗后,你摸三张牌。', dddlangzhi:'狼志', dddlangzhi_info:'结束阶段,你可展示你攻击范围内的所有角色各一张牌,然后选择一项:1.用任意张牌替换其中等量张牌;2.获得所有展示牌,失去〖狼志〗。', dddfuyi:'附义', dddfuyi_both:'〖枭行〗和〖狼志〗', - dddfuyi_info:'主公技。当其他群势力角色执行奖惩时,若你没有〖枭行〗或〖狼志〗,其可改为令你获得其中一或两个,若为两个,你摸三张牌,失去〖附义〗。', + dddfuyi_info:'主公技,锁定技。①群势力角色使用【杀】的次数上限+1。②当一名群势力角色杀死角色后,其可以弃置两张牌,令你获得你武将牌上的一个技能。', ddd_caoshuang:'曹爽', ddd_xuelingyun:'薛灵芸', ddd_liuhong:'刘宏', @@ -4306,11 +5421,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddlianer:'涟洏', dddlianer_info:'当你使用红色牌结算后,你可以获得之,然后你只能使用点数小于此牌的牌直到回合结束。', dddanzhi:'暗织', - dddanzhi_info:'一名角色的回合开始时,若最近进入并在弃牌堆的牌包含黑色,你可以指定一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效。', + dddanzhi_info:'一名角色的回合开始时,若上一张被使用或打出的牌为黑色,你可以指定一名角色,此回合其第一次成为黑色牌的目标时,此牌对其无效。', dddshixing:'失兴', dddshixing_info:'锁定技。若有未受伤的女性角色,你视为拥有〖享乐〗;若当前回合没有锦囊牌被使用,你视为拥有〖酒诗〗;若你没有上述技能,你视为拥有〖制衡〗。', ddddanggu:'党锢', ddddanggu_info:'锁定技。①结束阶段,你横置任意名角色的武将牌,直到场上已横置的角色数不少于X(X为群势力角色数)。②其他角色的弃牌阶段,若其处于连环状态,其装备区里的牌视为手牌。', + dddfuzong:'覆宗', + dddfuzong_info:'主公技,锁定技。①游戏开始时,你摸等同于场上群势力角色数的牌。②一名群势力角色死亡时,其弃置你的一张牌。', dddlanghuai:'朗怀', dddlanghuai_info:'转换技。摸牌阶段,你可展示手牌(无牌则不展示),并改为摸其中:阴,包含花色数的牌;阳,缺少花色数的牌。', dddxuanlun:'玄论', @@ -4318,13 +5435,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddjiexing:'劫行', dddjiexing_info:'限定技。其他角色回复体力时,你可改为你回复等量体力;其他角色使用装备牌时,你可改为将此牌置入你的装备区。当你不以此法回复体力后或使用装备牌后,重置此技能。', dddbailei:'拜泪', - dddbailei_info:'准备阶段,你可获得装备区牌数唯一最多的角色的一张牌,或杀死体力值唯一为1的角色并失去此技能。', + dddbailei_info:'准备阶段,你可以选择一项:1.获得装备区牌数唯一最多的角色的一张牌;2.对一名体力值为1的角色造成1点伤害,若其因此死亡,你失去此技能。', ddd_liangxi:'梁习', dddtongyu:'仝御', - dddtongyu_info:'出牌阶段限一次,你可以将任意张花色不同的牌当做【五谷丰登】使用,且此牌的展示牌数+X(X为此牌对应的实体牌数量)。此牌的所有目标角色在被指定目标后选择一项:⒈本回合不能再使用或打出手牌。⒉令此【五谷丰登】对其无效。此【五谷丰登】的多余展示牌置入弃牌堆前,你可以令一名选择了选项二的角色获得这些牌。', + dddtongyu_info:'出牌阶段限一次,你可以将任意张花色不同的牌当做【五谷丰登】使用,且你为此牌选择结算方向,此牌的亮出牌数+X(X为此牌对应的实体牌数量)。此牌的所有目标角色在被指定目标后选择一项:⒈本回合不能再使用或打出手牌。⒉令此【五谷丰登】对其无效。此【五谷丰登】的多余展示牌置入弃牌堆前,你可以令一名选择了选项二的角色获得这些牌。', ddd_wangkanglvkai:'王伉吕凯', dddbingjian:'并肩', - dddbingjian_info:'你可以将手牌数调整至2或4,然后视为使用或打出一张【杀】或【闪】。若你:因此摸牌,则你令一名角色本轮内不能使用或打出同名牌,且你本轮内不能再发动〖并肩〗。因此弃牌,则你令一名角色将手牌数调整至与你相同。', + dddbingjian_info:'每回合限两次。你可以将手牌数调整至2(至少调整一张),视为使用或打出一张【杀】或【闪】。若你:因此摸牌,则你可以令一名其他角色摸等量的牌;因此弃牌,则你可以弃置一名其他角色等量的牌。', ddd_sunliang:'孙亮', ddddiedang:'迭宕', ddddiedang_info:'出牌阶段限一次,你可以摸三张牌,然后弃置一张牌;然后若你的手牌数为全场最多或最少,则你交换上述描述中的“摸”和“弃”。', @@ -4332,11 +5449,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dddanliu_info:'结束阶段,你可以与一名其他角色依次观看并选择对方的一张手牌,然后交换这两张牌。若这两张牌颜色相同,则你可以逾期交换这两张牌,且:若此牌为红色,则你回复1点体力;若此牌为黑色,则其摸两张牌。', dddguiying:'归萤', dddguiying_info:'主公技。准备阶段,其他吴势力角色可依次展示其一张手牌,然后将其点数最大的一张牌交给你,然后其可以获得场上点数最小的一张牌。', + ddd_qianzhao:'牵招', + dddyuanzhen:'远振', + dddyuanzhen_info:'锁定技。当你使用牌指定其他角色为唯一目标后,若你至其距离不为1,你令其选择一项:1.弃置一张牌;2.令你摸一张牌。', + dddzhishu:'制戍', + dddzhishu_info:'出牌阶段开始时,你可以移动场上的一张装备牌,然后以此法失去牌的角色视为对以此法装备区被置入牌的角色使用一张【过河拆桥】。', + ddd_zhangmiao:'张邈', + dddxiaxing:'侠行', + dddxiaxing_info:'①每轮限一次。一名角色处于濒死状态时/回合开始时,你可以将一张牌置于牌堆顶,视为其使用一张【桃】/【酒】。若你没有“侠”标记,你获得“侠”。②你可以移去“侠”,视为使用一张【杀】或【闪】。', + ddd_zhangcheng:'张承', + dddjuxian:'聚贤', + dddjuxian_info:'出牌阶段每项各限一次。你可以展示一张牌,然后:1.将其置于牌堆顶,然后获得其他角色的一张牌并展示之;2.将此牌交给一名其他角色,然后摸一张牌并展示之。若你以此法展示的两张牌颜色不同,此技能本回合失效。', + dddjungui:'隽轨', + dddjungui_info:'结束阶段,你可以令一名角色摸两张牌,然后其展示所有手牌,你选择一个不大于X的值。若Y大于0,你令其弃置Y张花色各不同的手牌(X为你于本回合使用过的牌的花色数,Y为其手牌中包含的花色数-X)。', + ddd_liuchong:'刘宠', + dddjinggou:'精彀', + dddjinggou_info:'锁定技。当你使用武器牌结算结束后,若你的攻击范围为全场最大,你对一名其他角色造成1点伤害。', + dddmoyan:'末焱', + dddmoyan_info:'一轮游戏开始时,你可以亮出牌堆顶三张牌,令一名角色选择获得其中至少一张牌,然后当你于本轮受到伤害时,若其手牌数不大于X,此伤害+1(X为其本次获得的牌数)。', + ddd_luoxian:'罗宪', + dddshilie:'示烈', + visible_dddshilie:'明', + dddshilie_info:'每回合限一次。当你需要使用一张【杀】或【闪】时,你可以明置任意点数之和不小于X的手牌,视为你使用之。若本次明置的牌点数等于X,你摸等同于本次明置的牌数的牌(X为你于当前回合角色的体力值之和)。', ddd_lie:'李娥', dddyeshen:'冶身', - dddyeshen_info:'一名角色的结束阶段,你可以亮出牌堆底三张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张,你复原此技能并对自己造成一点火焰伤害。', + dddyeshen_info:'一名角色的结束阶段,你可以亮出牌堆底三张牌,令其将其中一张黑色牌当做最大目标数为牌名字数的【铁索连环】使用或重铸,其余牌置于牌堆顶,然后此技能亮出牌数-1;若减至零张或其中没有黑色牌,你复原此技能并对自己造成1点火焰伤害。', dddqiaoduan:'巧锻', - dddqiaoduan_info:'每回合限一次。当有角色:重置后,你可以令至多X名角色各摸一张牌;横置后,你可以将X张牌置于牌堆底,并令一名角色回复一点体力(X为横置角色数)。', + dddqiaoduan_info:'每回合限一次。当有角色:重置后,你可以令至多X名角色各摸一张牌;横置后,你可以将X张牌置于牌堆底,并令一名角色回复1点体力(X为横置角色数)。', }, }; }); diff --git a/character/diy.js b/character/diy.js index 21af540ec..01eecb361 100755 --- a/character/diy.js +++ b/character/diy.js @@ -294,7 +294,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_inari:'#bSummer Pockets', key_saya:'#bLittle Busters!', key_harukakanata:'#bLittle Busters!', - key_tsumugi:'#bSummer Pockets', key_yui:'#rAngel Beats!', key_yoshino:'#bRewrite', key_kengo:'#bLittle Busters!', @@ -753,8 +752,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(map[1]){ if(map[1].length==len&&len>4){ for(var i=0;i5){ for(var i=0;i5){ for(var i=0;i0) player.chooseToDiscard('he',true); }, @@ -3008,7 +3007,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; }, content:function(){ - player.draw(); + player.draw(); }, mod:{ maxHandcard:function(player,num){ @@ -3793,7 +3792,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseButton(['选择获得一张“兴”',player.getExpansions('tenzen_yixing')],true); 'step 1' if(result.bool){ - player.gain(result.links,'gain2');; + player.gain(result.links,'gain2'); } var next=game.createEvent('tenzen_yixing_insert'); event.next.remove(next); @@ -3968,9 +3967,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filterTarget:function(card,kyouko,hina){ if(kyouko==hina||kyouko.getStorage('kyouko_gongmian').contains(hina)) return false; - var hs=hina.countCards('he'); - if(hs==0) return kyouko.countCards('h')==0; - return true; + var hs=hina.countCards('he'); + if(hs==0) return kyouko.countCards('h')==0; + return true; }, content:function(){ 'step 0' @@ -4958,10 +4957,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } switch(button.link){ - case 3:return 4.5;break; - case 4:return 4.4;break; - case 5:return 4.3;break; - case 2:return (3-player.hp)*1.5;break; + case 3:return 4.5; + case 4:return 4.4; + case 5:return 4.3; + case 2:return (3-player.hp)*1.5; case 1:{ if(game.hasPlayer(function(current){ return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current)>1; @@ -6122,7 +6121,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.popup('花绽',get.groupnature(name.slice(12))); game.log(player,'发动了技能',lib.translate[name].replace(/魔物/g,'【花绽】')); player.removeMark(name,1,false); - ;game.log(player,'移去了一个',lib.translate[name].replace(/魔物/g,'【魔物】')); + game.log(player,'移去了一个',lib.translate[name].replace(/魔物/g,'【魔物】')); }, } } @@ -6388,7 +6387,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{source:'damageBefore'}, forced:true, charlotte:true, - audio:'abyusa_jueqing', filter:function(event,player){ return player.storage.abyusa_jueqing_rewrite==true; }, @@ -9106,7 +9104,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); }, filterCard:true, - log:false, filterTarget:function(card,player,target){ return target!=player&&target.hasZhuSkill('akane_yifu',player)&&!target.hasSkill('akane_yifu3'); }, @@ -9349,7 +9346,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var i=0;i!player.getStorage('junktaoluan2').includes(get.suit(card)))>0&&!player.hasSkill('junktaoluan3')&&lib.inpile.includes(name); + }, audio:'taoluan', enable:'chooseToUse', filter:function(event,player){ - return event.type!='wuxie'&&event.type!='respondShan'&&!player.hasSkill('junktaoluan3')&&player.countCards('hes',function(card){ - return !player.storage.junktaoluan2.contains(get.suit(card)); + return !player.hasSkill('junktaoluan3')&&player.countCards('hes',card=>{ + return lib.inpile.some(name=>{ + if(player.getStorage('junktaoluan2').includes(get.suit(card))) return false; + if(player.getStorage('junktaoluan').includes(name)) return false; + if(get.type(name)!='basic'&&get.type(name)!='trick') return false; + if(event.filterCard({name:name,isCard:true,cards:[card]})) return true; + if(name=='sha'){ + for(var nature of lib.inpile_nature){ + if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]})) return true; + } + } + return false; + }); })>0; }, - init:function(player){ - if(!player.storage.junktaoluan) player.storage.junktaoluan=[]; - if(!player.storage.junktaoluan2) player.storage.junktaoluan2=[]; - }, chooseButton:{ dialog:function(event,player){ - var list=[]; - for(var i=0;i0) return 0; - if(button.link[2]=='wugu') return; - var effect=player.getUseValue(button.link[2]); - if(effect>0) return effect; - return 0; + var card={name:button.link[2],nature:button.link[3]}; + if(player.countCards('hes',cardx=>cardx.name==card.name)) return 0; + return _status.event.getParent().type=='phase'?player.getUseValue(card):1; }, backup:function(links,player){ return { filterCard:function(card,player){ - return !player.storage.junktaoluan2.contains(get.suit(card)); + return !player.getStorage('junktaoluan2').includes(get.suit(card)); }, audio:'taoluan', - selectCard:1, popname:true, check:function(card){ - return 6-get.value(card); + return 7-get.value(card); }, position:'hse', viewAs:{name:links[0][2],nature:links[0][3]}, onuse:function(result,player){ - player.storage.junktaoluan2.add(get.suit(result.cards[0],player)); + player.markAuto('junktaoluan2',[get.suit(result.cards[0],player)]); var evt=_status.event.getParent('phase'); if(evt&&evt.name=='phase'&&!evt.junktaoluan){ evt.junktaoluan=true; @@ -12693,11 +12692,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ evt.after.push(next); next.player=player; next.setContent(function(){ - //player.storage.junktaoluan=[]; - player.storage.junktaoluan2=[]; + delete player.storage.junktaoluan2; }); } - player.storage.junktaoluan.add(result.card.name); + player.markAuto('junktaoluan',[result.card.name]); }, } }, @@ -12707,6 +12705,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ order:4, + save:true, + respondSha:true, + respondShan:true, + skillTagFilter:function(player,tag,arg){ + if(!player.countCards('hes',card=>!player.getStorage('junktaoluan2').includes(get.suit(card)))||player.hasSkill('taoluan3')) return false; + if(tag=='respondSha'||tag=='respondShan'){ + if(arg=='respond') return false; + return !player.getStorage('taoluan').includes(tag=='respondSha'?'sha':'shan'); + } + return !player.getStorage('taoluan').includes('tao')||(!player.getStorage('taoluan').includes('jiu')&&arg==player); + }, result:{ player:function(player){ var players=game.filterPlayer(); @@ -12720,7 +12729,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, threaten:1.9, }, - group:['junktaoluan2','junktaoluan4','junktaoluan5'] + group:'junktaoluan2', }, junktaoluan2:{ trigger:{player:['useCardAfter','respondAfter']}, @@ -12729,7 +12738,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, filter:function(event,player){ if(!game.hasPlayer(current=>current!=player)) return false; - return event.skill=='junktaoluan_backup'||event.skill=='junktaoluan5'||event.skill=='junktaoluan4'; + return event.skill=='junktaoluan_backup'; }, content:function(){ 'step 0' @@ -12768,117 +12777,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, junktaoluan3:{ + charlotte:true, trigger:{player:'phaseEnd'}, forced:true, popup:false, - charlotte:true, content:function(){ player.loseHp(); }, }, - junktaoluan4:{ - audio:'taoluan', - prompt:'将一张牌当做闪使用', - enable:'chooseToUse', - filter:function(event,player){ - return player.countCards('hes',function(card){ - return !player.storage.junktaoluan2.contains(get.suit(card)); - })&&!player.storage.junktaoluan.contains('shan')&&!player.hasSkill('junktaoluan3'); - }, - onuse:function(result,player){ - player.storage.junktaoluan2.add(get.suit(result.cards[0],player)); - var evt=_status.event.getParent('phase'); - if(evt&&evt.name=='phase'&&!evt.junktaoluan){ - var next=game.createEvent('taoluan_clear'); - _status.event.next.remove(next); - evt.after.push(next); - evt.junktaoluan=true; - next.player=player; - next.setContent(function(){ - //player.storage.junktaoluan=[]; - player.storage.junktaoluan2=[]; - }); - } - player.storage.junktaoluan.add('shan'); - }, - filterCard:function(card,player){ - return !player.storage.junktaoluan2.contains(get.suit(card)); - }, - position:'hes', - selectCard:1, - viewAs:{name:'shan'}, - check:function(card){ - var player=_status.event.player; - var allshown=true,players=game.filterPlayer(); - for(var i=0;i0){ - return 6-get.value(card); - } - } - return 0; - }, - ai:{ - skillTagFilter:function(player){ - return player.countCards('hse')&&!player.storage.junktaoluan.contains('shan')&&!player.hasSkill('junktaoluan3'); - }, - threaten:1.5, - respondShan:true, - } - }, - junktaoluan5:{ - audio:'taoluan', - enable:'chooseToUse', - prompt:'将一张牌当做无懈可击使用', - filter:function(event,player){ - return player.countCards('hes',function(card){ - return !player.storage.junktaoluan2.contains(get.suit(card)); - })&&(!player.storage.junktaoluan.contains('wuxie'))&&!player.hasSkill('junktaoluan3'); - }, - viewAsFilter:function(player){ - return player.countCards('hes',function(card){ - return !player.storage.junktaoluan2.contains(get.suit(card)); - })&&(!player.storage.junktaoluan.contains('wuxie'))&&!player.hasSkill('junktaoluan3'); - }, - onuse:function(result,player){ - player.storage.junktaoluan2.add(get.suit(result.cards[0],player)); - var evt=_status.event.getParent('phase'); - if(evt&&evt.name=='phase'&&!evt.junktaoluan){ - evt.junktaoluan=true; - var next=game.createEvent('taoluan_clear'); - _status.event.next.remove(next); - evt.after.push(next); - next.player=player; - next.setContent(function(){ - //player.storage.junktaoluan=[]; - player.storage.junktaoluan2=[]; - }); - } - player.storage.junktaoluan.add('wuxie'); - }, - filterCard:function(card,player){ - return !player.storage.junktaoluan2.contains(get.suit(card)); - }, - position:'hse', - selectCard:1, - viewAs:{name:'wuxie'}, - check:function(card){ - var player=_status.event.player; - if(player.isPhaseUsing()) return 0; - var allshown=true,players=game.filterPlayer(); - for(var i=0;i0){ - return 6-get.value(card); - } - } - return 0; - }, - }, junktaoluan_backup:{charlotte:true}, nshuaishuang:{ @@ -13140,11 +13046,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(n==1){ player.addTempSkill("releiji",{player:"phaseUseBegin"}); player.markSkill("releiji",{player:"phaseUseBegin"}); - }; + } if(n==2){ player.addTempSkill("guidao",{player:"phaseUseBegin"}); player.markSkill("guidao",{player:"phaseUseBegin"}); - }; + } }, }, ns_xiandao2:{ @@ -17736,7 +17642,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, group:'junkyuheng_remove', - derivation:['olbingyi','shenxing','xiashu','old_anxu','rezhiheng','xinanguo','lanjiang','xinfu_guanwei','oldimeng','xindiaodu','xingxue','jiexun','olhongyuan','xinfu_youdi','bizheng'], + derivation:['olbingyi','shenxing','xiashu','old_anxu','rezhiheng','xinanguo','lanjiang','xinfu_guanwei','dimeng','xindiaodu','xingxue','jiexun','olhongyuan','xinfu_youdi','bizheng'], subSkill:{ remove:{ audio:'yuheng', @@ -19026,9 +18932,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nshanlang_info:'准备阶段,你可以和至多三名角色拼点。然后若这些角色中有拼点牌唯一最大的角色,则你可以令该角色从牌堆中获得一张不符合“四象天阵”的牌。', junktaoluan:'滔乱', - junktaoluan3:'滔乱', - junktaoluan4:'滔乱', - junktaoluan5:'滔乱', junktaoluan_backup:'滔乱', junktaoluan_info:'你可将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌,且每回合每种花色限一次),然后你令一名其他角色选择一项:1.交给你一张与“滔乱”声明的牌类别不同的牌;2.本回合“滔乱”失效且回合结束时你失去1点体力。', ns_caimao:'蔡瑁', diff --git a/character/extra.js b/character/extra.js index 6059245a1..0c82308e6 100755 --- a/character/extra.js +++ b/character/extra.js @@ -17,11 +17,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ extra_ol:['ol_zhangliao','shen_caopi','shen_zhenji','shen_sunquan'], extra_mobilezhi:['shen_guojia','shen_xunyu'], extra_mobilexin:['shen_taishici','shen_sunce'], + extra_mobileren:['shen_huatuo'], extra_tw:['tw_shen_guanyu','tw_shen_lvmeng'], extra_offline:['shen_diaochan','boss_zhaoyun','shen_dianwei','le_shen_jiaxu'], }, }, character:{ + shen_huatuo:['male','shen',3,['wuling','youyi'],['qun']], le_shen_jiaxu:['male','shen',4,['jxlianpo','jxzhaoluan'],['qun']], shen_dianwei:['male','shen',4,['juanjia','qiexie','cuijue'],['wei']], shen_dengai:['male','shen',4,['dctuoyu','dcxianjin','dcqijing'],['wei']], @@ -41,7 +43,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shen_taishici:['male','shen',4,['dulie','tspowei'],['wu']], shen_guojia:['male','shen',3,['reshuishi','stianyi','resghuishi'],['wei']], shen_diaochan:['female','shen',3,['meihun','huoxin'],['qun']], - shen_guanyu:['male','shen',5,['new_wuhun','wushen'],['shu']], + shen_guanyu:['male','shen',5,['wushen','new_wuhun'],['shu']], shen_zhaoyun:['male','shen',2,['xinjuejing','relonghun'],['shu']], shen_zhugeliang:['male','shen',3,['qixing','kuangfeng','dawu'],['shu']], shen_lvmeng:['male','shen',3,['shelie','gongxin'],['wu']], @@ -88,6 +90,287 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //神华佗 + wuling:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + return game.hasPlayer(target=>lib.skill.wuling.filterTarget(null,player,target)); + }, + filterTarget:function(card,player,target){ + return !target.hasSkill('wuling_wuqinxi'); + }, + usable:1, + prompt:'选择一名角色,向其传授“五禽戏”', + group:'wuling_die', + content:function(){ + 'step 0' + target.addAdditionalSkill(`wuling_${player.playerid}`,'wuling_wuqinxi'); + var next=player.chooseToMove(`五灵:调整向${get.translation(target)}传授的“五禽戏”顺序`); + next.set('list',[ + ['',[lib.skill.wuling.wuqinxi,(item,type,position,noclick,node)=>{ + node=ui.create.buttonPresets.vcard(item,type,position,noclick); + node._customintro=[ + node=>`五禽戏:${node.link[2]}`, + node=>lib.skill.wuling.wuqinxiMap[lib.skill.wuling.wuqinxi.indexOf(node.link[2])].slice(2) + ]; + return node; + }]] + ]); + next.set('processAI',()=>{ + const event=get.event().getParent(),player=event.player,target=event.target; + const spirits=[]; + let nextPlayer=player; + do{ + nextPlayer=nextPlayer.getNext(); + if(get.attitude(player,nextPlayer)<0){ + spirits.add('熊'); + break; + } + } + while(nextPlayer!=target); + if(!spirits.length) spirits.add('猿'); + if(get.recoverEffect(target,player,player)>0||target.hasCard(card=>{ + return get.effect(target,{ + name:card.viewAs||card.name, + cards:[card], + },target,target)<-1; + },'j')) spirits.add('鹿'); + const others=lib.skill.wuling.wuqinxi.slice().removeArray(spirits); + do{ + others.randomSort(); + } + while(others.length>1&&others[0]=='鹿'); + return [spirits.concat(others).map(i=>['','',i])]; + }) + 'step 1' + var sortedWuqinxi=result.moved[0].map(i=>i[2]); + game.log(target,'习得的五禽戏顺序为','#g'+sortedWuqinxi.join('、')); + sortedWuqinxi.unshift(sortedWuqinxi[0]); + target.storage.wuling_wuqinxi=sortedWuqinxi; + lib.skill.wuling.updateMark(target); + }, + wuqinxi:['虎','鹿','熊','猿','鹤'], + wuqinxiMap:[ + '虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。', + '鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。', + '熊:当你受到伤害时,此伤害-1。', + '猿:出牌阶段开始时,你选择一名角色,随机获得其装备区里的一张牌。', + '鹤:出牌阶段开始时,你摸两张牌。', + ], + updateMark:function(player){ + var wuqinxi=player.storage.wuling_wuqinxi; + if(!wuqinxi) return; + var prevMark=wuqinxi.shift(); + // wuqinxi.push(prevMark); + var curMark=wuqinxi[0]; + if(!curMark){ + for(var skill in player.additionalSkills){ + if(!skill.startsWith('wuling_')) continue; + player.removeAdditionalSkill(skill); + } + game.log(player,'完成了五禽戏的操练'); + return; + } + game.log(player,'获得了','#g【'+curMark+'】','标记'); + player.markSkill('wuling_wuqinxi'); + game.broadcastAll(function(player,curMark){ + if(player.marks.wuling_wuqinxi) player.marks.wuling_wuqinxi.firstChild.innerHTML=curMark; + },player,curMark); + if(curMark=='鹿'){ + player.logSkill('wuling_wuqinxi'); + player.recover(); + player.discard(player.getCards('j')).discarder=player; + } + }, + ai:{ + order:7, + threaten:5, + result:{target:1}, + }, + derivation:'wuling_wuqinxi', + subSkill:{ + wuqinxi:{ + nopop:true, + charlotte:true, + intro:{ + markcount:()=>0, + mark:function(dialog,storage){ + const wuqinxiMap=lib.skill.wuling.wuqinxiMap; + const str=`
  • 当前效果:${storage[0]}
  • ${wuqinxiMap.find(str=>storage[0]==str[0]).slice(2)}
    `; + dialog.addText(str,false); + const str2='
    “五禽戏”顺序:
    '+storage.join(' ')+'
    '; + dialog.addText(str2); + if(storage.length>1){ + const str3=`
    [下一效果] ${wuqinxiMap.find(str=>storage[1]==str[0])}
    `; + dialog.add(str3); + } + }, + }, + mod:{ + targetEnabled:function(card,player,target){ + if(get.type(card)=='delay'&&target.storage.wuling_wuqinxi&&target.storage.wuling_wuqinxi[0]=='鹿') return false; + }, + }, + trigger:{ + source:'damageBegin1', + player:['phaseZhunbeiBegin','damageBegin4','phaseUseBegin'], + }, + filter:function(event,player,name){ + const wuqinxi=player.storage.wuling_wuqinxi&&player.storage.wuling_wuqinxi[0]; + if(!wuqinxi) return false; + if(event.name=='phaseZhunbei') return true; + switch(name){ + case 'damageBegin1': + if(wuqinxi!='虎'||!event.card) return false; + var evt=event.getParent('useCard'); + return evt.targets&&evt.targets.length==1&&evt.targets.includes(event.player); + case 'damageBegin4': + return wuqinxi=='熊'; + default: + if(wuqinxi=='鹤') return true; + if(wuqinxi!='猿') return false; + return game.hasPlayer(target=>target.countGainableCards(player,'e')); + } + }, + forced:true, + onremove:true, + content:function(){ + 'step 0' + var wuqinxi=player.storage.wuling_wuqinxi[0]; + if(trigger.name=='phaseZhunbei'){ + lib.skill.wuling.updateMark(player); + event.finish(); + } + else{ + var name=event.triggername; + switch(name){ + case 'damageBegin1': + player.line(trigger.player); + trigger.num++; + event.finish(); + break; + case 'damageBegin4': + trigger.num--; + event.finish(); + break; + default: + if(wuqinxi=='鹤'){ + player.draw(2); + event.finish(); + } + else{ + player.chooseTarget('五禽戏:获得一名角色装备区里的一张装备牌',function(card,player,target){ + return target.countGainableCards(player,'e'); + }).set('ai',function(target){ + var player=_status.event.player; + var att=get.attitude(player,target),eff=0; + target.getCards('e',function(card){ + var val=get.value(card,target); + eff=Math.max(eff,-val*att); + }); + return eff; + }); + } + } + } + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.line(target,'green'); + var cards=target.getGainableCards(player,'e'); + player.gain(cards.randomGets(1),target,'give'); + } + }, + ai:{ + effect:{ + target:function(card,player,target){ + const wuqinxi=target.storage.wuling_wuqinxi; + if(!wuqinxi||!wuqinxi.length) return; + const curWuqinxi=wuqinxi[0]; + const nextWuqinxi=wuqinxi[1]; + if(nextWuqinxi=='鹿'&&get.type(card)=='delay') return 'zerotarget'; + if(curWuqinxi!='熊') return; + if(player.hasSkillTag('jueqing',false,target)) return; + var num=get.tag(card,'damage'); + if(num){ + if(num>1) return 0.5; + return 0; + } + } + } + }, + }, + die:{ + trigger:{player:'die'}, + filter:function(event,player){ + return game.hasPlayer(current=>current.additionalSkills[`wuling_${player.playerid}`]); + }, + forced:true, + locked:false, + forceDie:true, + content:function(){ + var targets=game.filterPlayer(current=>{ + return current.additionalSkills[`wuling_${player.playerid}`]; + }); + player.line(targets); + targets.forEach(current=>current.removeAdditionalSkill(`wuling_${player.playerid}`)); + }, + }, + }, + }, + youyi:{ + init:function(player){ + player.storage.renku=true; + }, + audio:2, + enable:'phaseUse', + filter:function(event,player){ + return _status.renku.length; + }, + prompt:'将仁区所有牌置入弃牌堆,令所有角色各回复1点体力', + content:function(){ + 'step 0' + var cards=_status.renku.slice(); + game.cardsDiscard(cards).fromRenku=true; + _status.renku.removeArray(cards); + player.$throw(cards,1000); + game.updateRenku(); + game.log(cards,'从仁库进入了弃牌堆'); + 'step 1' + var targets=game.filterPlayer(); + player.line(targets); + targets.forEach(target=>target.recover()); + }, + ai:{ + order:function(item,player){ + return get.order({name:'taoyuan'},player); + }, + result:{ + player:function(player){ + return Math.max(0,game.filterPlayer().reduce((num,target)=>num+get.recoverEffect(target,player,player),0)); + }, + }, + }, + group:'youyi_put', + subSkill:{ + put:{ + audio:'youyi', + trigger:{player:'phaseDiscardEnd'}, + filter:function(event,player){ + return lib.skill.twlijian.getCards(event).length; + }, + prompt2:function(event,player){ + return '将'+get.translation(lib.skill.twlijian.getCards(event))+'置入仁区'; + }, + content:function(){ + var cards=lib.skill.twlijian.getCards(trigger); + game.log(player,'将',cards,'置于了仁库'); + game.cardsGotoSpecial(cards,'toRenku'); + }, + }, + }, + }, //神贾诩 jxlianpo:{ audio:2, @@ -114,8 +397,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ num+=current.countMark('jxlianpo_mark_fan'); return num; }), - nei:(game.hasPlayer(current=>current.identity=='nei')?0:1)+game.countPlayer(current=>{ - return current.countMark('jxlianpo_mark_nei'); + nei:game.countPlayer(current=>{ + let num=0; + if(current.identity=='nei') num++; + num+=current.countMark('jxlianpo_mark_nei'); + return num; + }), + commoner:game.countPlayer(current=>{ + let num=0; + if(current.identity=='commoner') num++; + num+=current.countMark('jxlianpo_mark_commoner'); + return num; }), }; let population=0,identities=[]; @@ -126,7 +418,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ identities.add(i); population=curPopulation; } - }; + } return identities; }, group:'jxlianpo_show', @@ -139,9 +431,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{ content:()=>`场上最大阵营为${lib.skill.jxlianpo.getMax().map(i=>{ if(i=='zhu') return '主忠'; - if(i=='fan') return '反贼'; - if(i=='nei') return '内奸'; - return ''; + return get.translation(i+'2'); }).join('、')}`, }, $createButton:function(item,type,position,noclick,node){ @@ -613,7 +903,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })){ goon=6; } - }catch(e){} + }catch(e){ + console.trace(e); + } ui.selected.cards.remove(card); return goon-get.value(card); }, @@ -1715,13 +2007,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ if(event.responded||event.shouli||event.type=='wuxie') return false; if(game.hasPlayer(function(current){ - return current.getCards('e',card=>get.subtype(card)=='equip4').length>0; + return current.getCards('e',card=>get.is.attackingMount(card)).length>0; })&&event.filterCard({ name:'sha', storage:{shouli:true}, },player,event)) return true; if(game.hasPlayer(function(current){ - return current.getCards('e',card=>get.subtype(card)=='equip3').length>0; + return current.getCards('e',card=>get.is.defendingMount(card)).length>0; })&&event.filterCard({ name:'shan', storage:{shouli:true}, @@ -1733,8 +2025,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ var event=_status.event,evt=event; if(event._backup) evt=event._backup; - var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); - var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); + var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); + var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({ name:'shan', storage:{shouli:true}, @@ -1749,7 +2041,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return game.hasPlayer(function(current){ return evt.filterTarget(sha,player,current); }) - }; + } }) }, prompt:'将场上的一张坐骑牌当做【杀】或【闪】使用或打出', @@ -1758,8 +2050,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=event.getParent(2); evt.set('shouli',true); var list=[]; - var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); - var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); + var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); + var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); var backupx=_status.event; _status.event=evt; try{ @@ -1784,8 +2076,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; })){ list.push('sha'); - }; - }catch(e){game.print(e)}; + } + }catch(e){game.print(e)} _status.event=backupx; if(list.length==1){ event.cardName=list[0]; @@ -1799,13 +2091,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('cards',cards) } else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ - var type=get.subtype(button.link); - return type=='equip3'||type=='equip4'; + var card=button.link; + return get.is.attackingMount(card)||get.is.defendingMount(card); }); 'step 1' var evt=event.getParent(2); if(result.bool&&result.links&&result.links.length){ - var name=(event.cardName||(get.subtype(result.links[0])=='equip4'?'sha':'shan')); + var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan')); if(evt.name=='chooseToUse'){ game.broadcastAll(function(result,name){ lib.skill.shouli_backup.viewAs={ @@ -1847,9 +2139,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ respondSha:true, respondShan:true, skillTagFilter:function(player,tag){ - var subtype=(tag=='respondSha'?'equip4':'equip3'); + var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount']; return game.hasPlayer(function(current){ - return current.hasCard(card=>get.subtype(card,false)==subtype,'e'); + return current.hasCard(card=>func(card,false),'e'); }); }, order:2, @@ -4393,110 +4685,87 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var list=[]; for(var i in player.disabledSkills){ if(player.disabledSkills[i].contains(skill)) list.push(i); - }; + } if(list.length){ var str='失效技能:'; for(var i=0;inum){ - num=current.countMark('new_wuhun_mark'); + if(current!=player&¤t.countMark('new_wuhun')>num){ + num=current.countMark('new_wuhun'); } } - player.chooseTarget(true,'请选择【武魂】的目标',function(card,player,target){ - return target!=player&&target.countMark('new_wuhun_mark')==_status.event.num; + player.chooseTarget(true,'请选择【武魂】的目标','令其进行判定,若判定结果不为【桃】或【桃园结义】,则其死亡',function(card,player,target){ + return target!=player&&target.countMark('new_wuhun')==_status.event.num; }).set('ai',function(target){ return -get.attitude(_status.event.player,target); }).set('forceDie',true).set('num',num); - "step 1" - if(result.bool&&result.targets&&result.targets.length){ + 'step 1' + if(result.bool){ var target=result.targets[0]; event.target=target; - player.logSkill(Math.random()<0.5?'wuhun21':'wuhun22',target); + player.logSkill('new_wuhun_die',target); player.line(target,{color:[255, 255, 0]}); game.delay(2); } - "step 2" + 'step 2' target.judge(function(card){ if(['tao','taoyuan'].contains(card.name)) return 10; return -10; }).judge2=function(result){ return result.bool==false?true:false; }; - "step 3" - if(!result.bool){ - lib.element.Player.prototype.die.apply(target,[]); - } + 'step 3' + if(!result.bool) target.die(); }, - sub:true, }, - mark:{ - marktext:"魇", - intro:{ - name:"梦魇", - content:"mark", - }, - sub:true, - }, - }, - ai:{ - threaten:0.01, - notemp:true, }, }, "new_guixin":{ @@ -4670,7 +4939,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', derivation:'wushuang', filter:function(event,player){ - return player.countMark('baonu')>=2; + return player.countMark('baonu')>=2&&game.hasPlayer(target=>lib.skill.ol_wuqian.filterTarget(null,player,target)); }, filterTarget:function(card,player,target){ return target!=player&&!target.hasSkill('ol_wuqian_targeted'); @@ -4678,29 +4947,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ player.removeMark('baonu',2); player.addTempSkill('wushuang'); - player.storage.ol_wuqian_target=target; - player.addTempSkill('ol_wuqian_target'); + player.popup('无双'); + game.log(player,'获得了技能','#g【无双】'); target.addTempSkill('ol_wuqian_targeted'); }, - subSkill:{ - equip:{ - ai:{ - unequip:true, - skillTagFilter:function(player,tag,arg){ - if(arg&&arg.target&&arg.target.hasSkill('ol_wuqian_targeted')) return true; - return false; - } - } - }, - targeted:{ai:{unequip2:true}}, - target:{ - mark:'character', - onremove:true, - intro:{ - content:'获得无双且$防具失效直到回合结束' + ai:{ + order:9, + result:{ + target:function(player,target){ + if(player.countCards('hs',card=>{ + if(!player.getCardUsable({name:card.name})) return false; + if(!player.canUse(card,target)) return false; + var eff1=get.effect(target,card,player,player); + _status.baonuCheck=true; + var eff2=get.effect(target,card,player,player); + delete _status.baonuCheck; + return eff2>Math.max(0,eff1); + })) return -1; + return 0; }, - } - } + }, + }, + global:'ol_wuqian_ai', + subSkill:{ + targeted:{ + charlotte:true, + ai:{unequip2:true}, + }, + ai:{ + ai:{ + unequip2:true, + skillTagFilter:function(player){ + if(!_status.baonuCheck) return false; + }, + }, + }, + }, }, wumou:{ audio:2, @@ -4967,7 +5249,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ maixie:true, maixie_hp:true, combo:'sbaiyin', - /*effect:{ + effect:{ target:function(card,player,target){ if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; if(get.tag(card,'damage')){ @@ -4991,7 +5273,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 'zeroplayertarget'; } } - }*/ + } } }, renjie2:{ @@ -5008,7 +5290,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ player.addMark('renjie',trigger.getl(player).cards2.length); - } + }, }, sbaiyin:{ skillAnimation:'epic', @@ -5026,11 +5308,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addSkill('jilue'); player.awakenSkill('sbaiyin'); }, - derivation:'jilue', + derivation:['jilue','reguicai','fangzhu','rejizhi','rezhiheng','rewansha'], }, jilue:{ unique:true, - group:['jilue_guicai','jilue_fangzhu','jilue_wansha','jilue_zhiheng','jilue_jizhi','jilue_jizhi_clear'] + group:['jilue_guicai','jilue_fangzhu','jilue_wansha','jilue_zhiheng','jilue_jizhi'], }, jilue_guicai:{ audio:1, @@ -5231,7 +5513,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ skillTagFilter:function(player,tag,arg){ if(tag==='nokeep') return player.isPhaseUsing()&&!player.getStat().skill.jilue_zhiheng&&player.hasCard((card)=>get.name(card)!=='tao','h'); }, - threaten:1.5 }, }, jilue_jizhi:{ @@ -5240,9 +5521,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ return (get.type(event.card,'trick')=='trick'&&event.card.isCard&&player.hasMark('renjie')); }, - init:function(player){ - player.storage.jilue_jizhi=0; - }, content:function(){ 'step 0' player.removeMark('renjie',1); @@ -5257,33 +5535,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 2' if(result.bool){ player.discard(event.card); - player.storage.jilue_jizhi++; - if(_status.currentPhase==player){ - player.markSkill('jilue_jizhi'); - } + player.addTempSkill('jilue_jizhi_clear'); + player.addMark('jilue_jizhi_clear',1,false); } }, - ai:{ - threaten:1.4 - }, - mod:{ - maxHandcard:function(player,num){ - return num+player.storage.jilue_jizhi; - } - }, - intro:{ - content:'本回合手牌上限+#', - }, subSkill:{ clear:{ - trigger:{global:'phaseAfter'}, - silent:true, - content:function(){ - player.storage.jilue_jizhi=0; - player.unmarkSkill('jilue_jizhi'); - } - } - } + charlotte:true, + onremove:true, + mod:{ + maxHandcard:function(player,num){ + return num+player.countMark('jilue_jizhi_clear'); + }, + }, + intro:{content:'手牌上限+#'}, + }, + }, }, wushen:{ mod:{ @@ -5328,161 +5595,39 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, wuhun:{ - trigger:{ - player:"damageEnd", - }, - //alter:true, - filter:function (event,player){ - if(event.source==undefined) return false; - if(!get.is.altered('wuhun')) return false - return true; - }, - forced:true, - content:function (){ - if(!trigger.source.storage.wuhun_mark){ - trigger.source.storage.wuhun_mark=0; - } - trigger.source.storage.wuhun_mark+=trigger.num; - trigger.source.syncStorage('wuhun_mark'); - trigger.source.markSkill('wuhun_mark'); - }, - global:["wuhun_mark"], - subSkill:{ - mark:{ - marktext:"魇", - intro:{ - content:"mark", - }, - sub:true, - }, - }, - group:["wuhun2","wuhun4","wuhun5"], - }, - wuhun2:{ - trigger:{ - player:'dieBegin', - }, - forced:true, - popup:false, - filter:function (event,player){ - for(var i=0;itarget.storage.wuhun_mark){ - return false; - } - } - return true; - }).set('ai',function(target){ - return -ai.get.attitude(_status.event.player,target); - }); - "step 1" - player.line(result.targets[0],'fire'); - result.targets[0].addSkill('wuhun3') - }, - ai:{ - threaten:0.5, - effect:{ - target:function (card,player,target,current){ - if(get.tag(card,'damage')){ - if(player.hasSkill('jueqing')) return [1,-5]; - var hasfriend=false; - for(var i=0;i=0){ - hasfriend=true;break; - } - } - if(!hasfriend) return; - if(player.hp>2&&ai.get.attitude(player,target)<=0) return [0,2]; - return [1,0,0,-player.hp]; - } - }, - }, - }, - }, - wuhun3:{ - audio:3, - trigger:{ - global:'dieAfter', - }, - forced:true, - content:function (){ - "step 0" - player.judge(function(card){ - if(card.name=='tao'||card.name=='taoyuan') return 2; - return -2; - }) - "step 1" - if(result.judge==-2){ - player.die(); - } - player.removeSkill('wuhun3'); - }, - }, - wuhun4:{ - trigger:{ - player:'dieAfter', - }, - forced:true, - popup:false, - content:function (){ - for(var i=0;i0) trigger.source.loseHp(num); }, ai:{ threaten:function(player,target){ - if(target.hp==1) return 0.5; + if(target.hp==1){ + if(player.getHp()<=0) return 100; + return 0.2; + } + return 0.8; }, effect:{ target:function(card,player,target,current){ - if(target.hp<=1&&get.tag(card,'damage')){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-5]; - if(!target.hasFriend()) return; - if(player.hp>2&&get.attitude(player,target)<=0) return [0,2]; - return [1,0,0,-player.hp]; - } - } - } - } + if(player.getHp()<=0) return; + if(!target.hasFriend()) return; + if(target.hp<=1&&get.tag(card,'damage')) return [1,0,0,-2]; + }, + }, + }, }, - wuhun6:{ - audio:3, - trigger:{global:'dieAfter'}, - forced:true, - content:function(){ - if(player.hp1) return true; @@ -5497,59 +5642,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return num>=2; }, content:function(){ - "step 0" - var targets=game.filterPlayer(); - targets.remove(player); - targets.sort(lib.sort.seat); - event.targets=targets; + 'step 0' event.count=trigger.num; - "step 1" - event.num=0; - player.line(targets,'green'); - "step 2" - if(numcurrent!=player).sortBySeat(); + player.line(targets); + player.gainMultiple(targets,'hej'); + 'step 2' player.turnOver(); - "step 4" + 'step 3' event.count--; if(event.count&&player.hasSkill('guixin')){ player.chooseBool(get.prompt2('guixin')); } - else{ - event.finish(); - } - "step 5" - if(event.count&&result.bool){ - event.goto(1); - } + else event.finish(); + 'step 4' + if(event.count&&result.bool) event.goto(1); }, ai:{ maixie:true, maixie_hp:true, threaten:function(player,target){ if(target.hp==1) return 2.5; - return 1; + return 0.5; }, effect:{ target:function(card,player,target){ @@ -5704,6 +5819,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(target.hasSkill('biantian2')||target.hasSkill('dawu2')) return 0; var att=get.attitude(player,target); if(att>=4){ + if(target.hp>2&&(target.isHealthy()||target.hasSkillTag('maixie'))) return 0; if(_status.event.allUse) return att; if(target.hp==1) return att; if(target.hp==2&&target.countCards('he')<=2) return att*0.7; @@ -5944,7 +6060,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.countCards('he',{suit:'heart'})7){ player.chooseBool().set('ai',function(){ @@ -6650,7 +6766,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('prompt','是否弃置所有“军略”标记并对所有其他角色造成1点伤害?'); }else{ event.finish(); - }; + } 'step 3' if(result.bool){ var players=game.players.slice(0).sortBySeat(); @@ -6658,8 +6774,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.removeMark('nzry_junlve',player.countMark('nzry_junlve')); for(var i=0;i
  • “五禽戏”分为“虎、鹿、熊、猿、鹤”五个不同的效果:'+ + '
  • 虎:当你使用指定唯一目标的牌对目标角色造成伤害时,此伤害+1。'+ + '
  • 鹿:①当你获得此效果时,你回复1点体力并弃置判定区的所有牌。②你不能成为延时锦囊牌的目标。'+ + '
  • 熊:当你受到伤害时,此伤害-1。'+ + '
  • 猿:出牌阶段开始时,你选择一名角色,随机获得其装备区里的一张牌。'+ + '
  • 鹤:出牌阶段开始时,你摸两张牌。', + youyi:'游医', + youyi_info:'①弃牌阶段结束时,你可以将所有于此阶段弃置的牌置入仁区。②出牌阶段限一次。你可以将仁区的所有牌置入弃牌堆,令所有角色各回复1点体力。', extra_feng:'神话再临·风', extra_huo:'神话再临·火', @@ -7773,6 +7896,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ extra_ol:'神话再临OL', extra_mobilezhi:'始计篇·智', extra_mobilexin:'始计篇·信', + extra_mobileren:'始计篇·仁', extra_offline:'神话再临·线下', extra_decade:'神·武', extra_tw:'海外服神将', diff --git a/character/gujian.js b/character/gujian.js index 55264de28..311284c64 100644 --- a/character/gujian.js +++ b/character/gujian.js @@ -803,7 +803,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ silent:true, content:function(){ player.exitSubPlayer(true); - game.createTrigger('phaseAfter','lianjing',player,trigger); + if(lib.filter.filterTrigger(trigger,player,'phaseAfter','lianjing')) game.createTrigger('phaseAfter','lianjing',player,trigger); } } }, diff --git a/character/hearth.js b/character/hearth.js index 51dd45b0e..442b1ca0e 100644 --- a/character/hearth.js +++ b/character/hearth.js @@ -1959,7 +1959,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ case 'jiu':return 3.01; case 'sha': if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='fire') return 2.92; + else if(button.link[3]=='thunder') return 2.92; else return 2.9; default:return 2+_status.event.getRand()*2; } @@ -8203,7 +8203,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hs:get.cards(4) }); player.callSubPlayer(player.storage.huanfeng_end); - // game.createTrigger('phaseBegin','shengdun',player,trigger); + // if(lib.filter.filterTrigger(trigger,player,'phaseBegin','shengdun')) game.createTrigger('phaseBegin','shengdun',player,trigger); }, // group:'huanfeng_end', subSkill:{ diff --git a/character/huicui.js b/character/huicui.js index 8c5d15c1c..68eff99f8 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -4,15 +4,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'huicui', connect:true, character:{ + dc_dongzhao:['male','wei',3,['dcyijia','dcdingji']], + kuaiqi:['male','wei',3,['dcliangxiu','dcxunjie']], + yue_caiyong:['male','qun',3,['dcjiaowei','dcfeibai']], + pangshanmin:['male','wei',3,['dccaisi','dczhuoli']], + dc_jiachong:['male','wei',3,['dcbeini','dcshizong']], + dc_sunchen:['male','wu',4,['dczigu','dczuowei']], dc_zhangmancheng:['male','qun',4,['dclvecheng','dczhongji']], yue_zhoufei:['female','wu',3,['dclingkong','dcxianshu']], - dc_wuban:['male','shu',4,['dcyouzhan'],['clan:陈留吴氏','unseen']], + dc_wuban:['male','shu',4,['dcyouzhan'],['clan:陈留吴氏']], yue_caiwenji:['female','qun',3,['dcshuangjia','dcbeifen']], liuchongluojun:['male','qun',3,['dcminze','dcjini']], yuechen:['male','wei',4,['dcporui','dcgonghu']], zhangkai:['male','qun',4,['dcxiangshu']], gaoxiang:['male','shu',4,['dcchiying']], - yuanyin:['male','qun',3,['dcmoshou','dcyunjiu'],['unseen']], + yuanyin:['male','qun',3,['dcmoshou','dcyunjiu']], dongwan:['female','qun',3,['dcshengdu','dcjieling']], zhangchu:['female','qun',3,['dcjizhong','dcrihui','dcguangshi']], peiyuanshao:['male','qun',4,['dcmoyu']], @@ -89,21 +95,690 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterSort:{ huicui:{ sp_baigei:['re_panfeng','xingdaorong','caoxing','re_chunyuqiong','xiahoujie','dc_caiyang','zhoushan'], - sp_caizijiaren:['re_dongbai','re_sunluyu','heyan','zhaoyan','wangtao','wangyue','zhangxuan','tengyin','zhangyao','xiahoulingnv','dc_sunru'], + sp_caizijiaren:['re_dongbai','re_sunluyu','heyan','zhaoyan','wangtao','wangyue','zhangxuan','tengyin','zhangyao','xiahoulingnv','dc_sunru','pangshanmin','kuaiqi'], sp_zhilan:['liuyong','wanniangongzhu','zhanghu','lvlingqi','tenggongzhu','panghui','dc_zhaotongzhaoguang','yuantanyuanxiyuanshang','yuechen'], - sp_guixin:['re_kanze','re_chendeng','caimaozhangyun','dc_lvkuanglvxiang','dc_gaolan','yinfuren','chengui','chenjiao','dc_sp_jiaxu','qinlang'], + sp_guixin:['re_kanze','re_chendeng','caimaozhangyun','dc_lvkuanglvxiang','dc_gaolan','yinfuren','chengui','chenjiao','dc_sp_jiaxu','qinlang','dc_dongzhao'], sp_daihan:['mamidi','dc_jiling','zhangxun','dc_yuejiu','wanglie','leibo','qiaorui','dongwan','yuanyin'], sp_jianghu:['guanning','huzhao','dc_huangchengyan','mengjie'], sp_zongheng:['huaxin','luyusheng','re_xunchen','re_miheng','fengxi','re_dengzhi','dc_yanghu','zongyu'], sp_taiping:['guanhai','liupi','peiyuanshao','zhangchu','zhangkai','dc_zhangmancheng'], sp_yanhan:['dc_liuba','dc_huangquan','furongfuqian','xianglang','dc_huojun','gaoxiang','dc_wuban'], sp_jishi:['dc_jiben','zhenghun','dc_sunhanhua','liuchongluojun'], - sp_raoting:['dc_huanghao','dc_sunziliufang','dc_sunchen'], + sp_raoting:['dc_huanghao','dc_sunziliufang','dc_sunchen','dc_jiachong'], sp_yijun:['gongsundu','mengyou'], - sp_zhengyin:['yue_caiwenji','yue_zhoufei'], + sp_zhengyin:['yue_caiwenji','yue_zhoufei','yue_caiyong'], } }, skill:{ + //董昭 + dcyijia:{ + audio:2, + trigger:{global:'damageEnd'}, + filter:function(event,player){ + if(!event.player.isIn()) return false; + if(get.distance(player,event.player)>1) return false; + return player.canMoveCard(null,true,game.filterPlayer(i=>i!=event.player),event.player,'canReplace'); + }, + check:function(event,player){ + return player.canMoveCard(true,true,game.filterPlayer(i=>i!=event.player),event.player,'canReplace'); + }, + prompt2:function(event,player){ + return `将场上一张装备牌移动至${get.translation(event.player)}的装备区内(替换原装备)。然后若其因此脱离了一名角色的攻击范围,你摸一张牌。`; + }, + logTarget:'player', + line:false, + content:function*(event,map){ + const player=map.player,trigger=map.trigger,target=trigger.player; + const inRangeList=game.filterPlayer(current=>current.inRange(target)); + yield player.moveCard(true,game.filterPlayer(i=>i!=target),target,'canReplace'); + const leaveSomeone=inRangeList.some(current=>!current.inRange(target)); + if(leaveSomeone) player.draw(); + }, + ai:{ + maixie:true, + expose:0.2, + threaten:3.3, + }, + }, + dcdingji:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + direct:true, + content:function*(event,map){ + const player=map.player; + let result; + result=yield player.chooseTarget(get.prompt2('dcdingji')).set('ai',target=>{ + const att=get.attitude(get.player(),target)/2; + const delta=5-target.countCards('h'); + let fix=1; + const hs=target.getCards('h'); + outer:for(let i=0;i0){ + if(target.hasSkillTag('nogain')) att/=3; + return Math.sqrt(delta)*att*fix; + } + if(delta>-2&&att>0) return fix==0.5?0.1:-1; + return -Math.sqrt(-delta)*att/2; + }); + if(!result.bool) return event.finish(); + const target=result.targets[0]; + player.logSkill('dcdingji',target); + if(target!=player) player.addExpose(0.3); + const delta=5-target.countCards('h'); + if(delta!=0){ + yield target[delta>0?'draw':'chooseToDiscard'](Math.abs(delta),true); + } + target.showHandcards(); + const hs=target.getCards('h'); + let hasSame=false; + outer:for(let i=0;i{ + if(!['basic','trick'].includes(info[0])) return false; + if(!target.hasUseTarget(new lib.element.VCard({name:info[2],nature:info[3],isCard:true}))) return false; + return hs.some(card=>{ + return get.name(card)==info[2]&&get.is.sameNature([card,info[3]],true); + }); + }); + if(!list.length) return event.finish(); + result=yield target.chooseButton(['是否视为使用其中一张牌?',[list,'vcard']]).set('ai',button=>{ + return get.player().getUseValue({name:button.link[2]}); + }); + if(result.bool){ + target.chooseUseTarget(new lib.element.VCard({ + name:result.links[0][2], + nature:result.links[0][3], + isCard:true, + }),true,false); + } + }, + }, + //蒯祺 + dcliangxiu:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + return player.hasCard(card=>{ + const type=get.type2(card,player); + return player.hasCard(cardx=>{ + if(card==cardx) return false; + return get.type2(cardx,player)!=type; + },'he'); + },'he'); + }, + filterCard:function(card,player){ + if(!ui.selected.cards.length) return true; + return get.type2(ui.selected.cards[0],player)!=get.type2(card,player); + }, + selectCard:2, + check:function(card){ + const player=get.player(); + const bannedTypes=[]; + bannedTypes.addArray(player.getStorage('dcliangxiu')); + if(!ui.selected.cards.length){ + let val=get.value(card); + if(val>5.5) return 0; + if(bannedTypes.includes(get.type2(card,player))) return 7.5-val; + return 5.5-val; + } + bannedTypes.addArray(ui.selected.cards.map(card=>get.type2(card,player))); + bannedTypes.add(get.type2(card,player)); + const filter=card=>!bannedTypes.includes(get.type2(card,player)); + if(!get.cardPile(filter)) return 0; + return 6-get.value(card); + }, + position:'he', + complexCard:true, + onremove:true, + content:function*(event,map){ + const player=map.player; + const cards=[]; + const bannedTypes=[]; + bannedTypes.addArray(event.cards.map(card=>get.type2(card,player))); + bannedTypes.addArray(player.getStorage('dcliangxiu')); + + const filter=card=>!bannedTypes.includes(get.type2(card,player)); + const piles=['cardPile','discardPile']; + for(const pile of piles){ + for(let i=0;i=2) break; + } + } + if(cards.length>=2) break; + } + let result; + if(!cards.length){ + player.chat('没牌了…'); + game.log('但是哪里都找不到没有符合条件的牌!'); + event.finish(); + return; + } + else if(cards.length==1) result={bool:true,links:cards}; + else result=yield player.chooseButton(['良秀:获得一张牌',cards],true).set('ai',get.buttonValue); + if(result.bool){ + const toGain=result.links; + player.markAuto('dcliangxiu',get.type2(toGain[0],false)); + player.when({global:'phaseChange'}).then(()=>{ + player.unmarkSkill('dcliangxiu'); + }); + player.gain(toGain,'gain2'); + } + }, + intro:{ + content:'已因此技能获得过$牌', + onunmark:true, + }, + ai:{ + order:2, + result:{player:1}, + }, + }, + dcxunjie:{ + audio:2, + trigger:{global:'phaseEnd'}, + filter:function(event,player){ + if(['handcard','hp'].every(i=>player.isTempBanned(`dcxunjie_${i}`))) return false; + return player.hasHistory('gain',evt=>{ + return !evt.getParent('phaseDraw',true); + }); + }, + direct:true, + content:function*(event,map){ + const player=map.player; + const choices=[]; + const choiceList=[ + '令一名角色将手牌数摸或弃置至与其体力值相同', + '令一名角色将体力回复或失去至与其手牌数相同', + ]; + if(!player.isTempBanned('dcxunjie_handcard')) choices.push('选项一'); + else choiceList[0]=''+choiceList[0]+'(已被选择过)'; + if(!player.isTempBanned('dcxunjie_hp')) choices.push('选项二'); + else choiceList[1]=''+choiceList[1]+'(已被选择过)'; + let result; + if(_status.connectMode) game.broadcastAll(()=>{_status.noclearcountdown=true}); + if(choices.length==1) result={control:choices[0]}; + else result=yield player.chooseControl(choices,'cancel2').set('choiceList',choiceList).set('prompt',get.prompt('dcxunjie')).set('ai',()=>{ + return get.event('choice'); + }).set('choice',(()=>{ + const getValue=(index,target)=>{ + let att=get.attitude(player,target); + att=Math.sign(att)*Math.sqrt(Math.abs(att)); + let delt=target.getHp(true)-target.countCards('h'); + if(index==1&&delt<0) delt=0; + return (1-3*index)*att*delt; + } + const list=game.filterPlayer().map(current=>{ + const val0=getValue(0,current),val1=getValue(1,current); + return [val0,val1,Math.max(val0,val1)]; + }).sort((a,b)=>{ + return b[2]-a[2]; + }); + const toChoose=list[0]; + if(toChoose[2]<=0) return 'cancel2'; + return toChoose[0]>toChoose[1]?0:1; + })()); + if(result.control=='cancel2'){ + if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} + return event.finish(); + } + let prompt=''; + const choice=result.control,index=choice=='选项一'?0:1; + if(choices.length==1){ + prompt=`###${get.prompt('dcxunjie')}###
    ${choiceList[index]}
    `; + } + else prompt=`###殉节:请选择一名角色###
    ${choiceList[index].replace('一名','该')}
    `; + result=yield player.chooseTarget(prompt).set('ai',target=>{ + const player=get.player(),index=get.event('index'); + let att=get.attitude(player,target); + att=Math.sign(att)*Math.sqrt(Math.abs(att)); + let delt=target.getHp(true)-target.countCards('h'); + if(index==1&&delt<0) delt=0; + return (1-2*index)*att*delt; + }).set('index',index); + if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} + if(!result.bool) return event.finish(); + const target=result.targets[0]; + player.logSkill('dcxunjie',target); + player.tempBanSkill(`dcxunjie_${index==0?'handcard':'hp'}`,'roundStart',false); + const delt=(target.getHp(true)-target.countCards('h'))*(1-2*index); + if(delt==0) event.finish(); + else if(index==0) target[delt>0?'draw':'chooseToDiscard'](Math.abs(delt),true); + else target[delt>0?'recover':'loseHp'](Math.abs(delt)); + } + }, + //乐蔡邕 + dcjiaowei:{ + audio:2, + trigger:{ + global:'phaseBefore', + player:'enterGame' + }, + forced:true, + filter:function(event,player){ + return (event.name!='phase'||game.phaseNumber==0); + }, + group:'dcjiaowei_prevent', + content:function*(event,map){ + const player=map.player; + var cards=player.getCards('h'); + player.addGaintag(cards,'dcjiaowei_tag'); + }, + mod:{ + ignoredHandcard:function(card,player){ + if(card.hasGaintag('dcjiaowei_tag')) return true; + }, + cardDiscardable:function(card,player,name){ + if(name=='phaseDiscard'&&card.hasGaintag('dcjiaowei_tag')) return false; + }, + }, + subSkill:{ + prevent:{ + audio:'dcjiaowei', + trigger:{ + player:'damageBegin4', + }, + forced:true, + filter:function(event,player){ + if(!event.source||!event.source.isIn()) return false; + return event.source.countCards('h')<=player.countCards('h',card=>card.hasGaintag('dcjiaowei_tag')); + }, + content:function*(event,map){ + map.trigger.cancel(); + }, + ai:{ + effect:{ + target:function(card,player,target){ + if(get.tag(card,'damage')){ + const num=target.countCards('h',card=>card.hasGaintag('dcjiaowei_tag')); + let cards=[]; + if(card.cards) cards.addArray(card.cards); + if(ui.selected.cards) cards.addArray(ui.selected.cards); + cards=cards.filter(card=>{ + if(get.itemtype(card)!='card') return false; + return get.owner(card)==player&&get.position(card)=='e'; + }); + if(player.countCards('h')-cards.length<=num) return 'zeroplayertarget'; + } + }, + }, + }, + }, + }, + }, + dcfeibai:{ + audio:2, + trigger:{player:'useCardAfter'}, + usable:1, + locked:false, + filter:function(event,player){ + return player.getHistory('useCard').indexOf(event)>0; + }, + prompt2:function(event,player){ + const history=player.getHistory('useCard'); + const ind=history.indexOf(event)-1,evt=history[ind]; + const len=get.cardNameLength(event.card)+get.cardNameLength(evt.card); + return `随机获得一张字数为${len}的牌`; + }, + check:function(event,player){ + const history=player.getHistory('useCard'); + const ind=history.indexOf(event)-1,evt=history[ind]; + const len=get.cardNameLength(event.card)+get.cardNameLength(evt.card); + return player.countCards('h',card=>card.hasGaintag('dcjiaowei_tag'))<=len||get.cardPile(card=>{ + return get.cardNameLength(card,false)==len; + }); + }, + content:function*(event,map){ + const player=map.player,trigger=map.trigger; + const history=player.getHistory('useCard'); + const ind=history.indexOf(trigger)-1,evt=history[ind]; + const len=get.cardNameLength(trigger.card)+get.cardNameLength(evt.card); + const card=get.cardPile(card=>{ + return get.cardNameLength(card,false)==len; + }); + if(card){ + yield player.gain(card,'gain2'); + } + else{ + let str=`没有${len}字的牌…`; + if(len==5&&Math.random()<=0.2) str='五字不行哇'; + player.chat(str); + game.log(`但是找不到字数为${len}的牌!`); + } + if(player.countCards('h',card=>card.hasGaintag('dcjiaowei_tag'))<=len){ + player.storage.counttrigger.dcfeibai--; + game.log(player,'重置了','#【飞白】'); + } + }, + mod:{ + aiOrder:function(player,card,num){ + const evt=player.getLastUsed(); + if(!evt) return; + const len=get.cardNameLength(card)+get.cardNameLength(evt.card); + const cardx=get.cardPile(card=>{ + return get.cardNameLength(card,false)==len; + }); + if(cardx) return num+8+(len==2||len==4?2:0); + }, + } + }, + //庞山民 + dccaisi:{ + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + if(get.type(event.card)!='basic') return false; + if(player.getHistory('gain',evt=>evt.getParent().name=='dccaisi').length>player.maxHp) return false; + return _status.currentPhase; + }, + prompt2:function(event,player){ + return `从${player==_status.currentPhase?'牌堆':'弃牌'}堆中随机获得一张非基本牌`; + }, + content:function*(event,map){ + const player=map.player,trigger=map.trigger; + const position=player==_status.currentPhase?'cardPile':'discardPile'; + const card=get[position](card=>{ + return get.type(card,false)!='basic'; + }); + if(card){ + player.gain(card,'gain2'); + } + else{ + player.chat('没有非基本牌…'); + game.log(`但是${position=='discardPile'?'弃':''}牌堆里没有非基本牌!`); + + } + }, + }, + dczhuoli:{ + audio:2, + trigger:{global:'phaseEnd'}, + forced:true, + filter:function(event,player){ + return player.getHistory('useCard').length>player.maxHp; + }, + content:function*(event,map){ + const player=map.player; + if(player.maxHp0; + }, + selectCard:function(){ + const player=get.player(); + const delt=player.countCards('h')-player.maxHp; + return delt>0?delt:-1; + }, + promptfunc:()=>{ + const player=get.player(); + const delt=player.countCards('h')-player.maxHp; + let str=''; + if(delt>0) str+=`弃置${get.cnNumber(delt)}张牌`; + else if(delt==0) str+=`点击“确定”`; + else str+=`摸${get.cnNumber(-delt)}张牌`; + return `${str},然后选择两名角色,前者视为对后者使用一张【杀】,且这两者的非锁定技失效。`; + }, + content:function*(event,map){ + var player=map.player; + if(player.countCards('h'){ + var sha=new lib.element.VCard({name:'sha',isCard:true}); + if(ui.selected.targets.length){ + var targetx=ui.selected.targets[0]; + return targetx.canUse(sha,target,false); + } + return lib.filter.cardEnabled(sha,target); + }).set('targetprompt',['打人','被打']).set('multitarget',true).set('ai',target=>{ + var aiTargets=get.event('aiTargets'); + if(aiTargets){ + return aiTargets[ui.selected.targets.length]==target?10:0; + } + return 0; + }).set('aiTargets',(()=>{ + var targets=[],eff=0; + var sha=new lib.element.VCard({name:'sha',isCard:true}); + for(var user of game.filterPlayer()){ + for(var target of game.filterPlayer()){ + if(user==target) continue; + var targetsx=[user,target]; + targetsx.forEach(i=>i.addSkill('dcbeini_fengyin')); + var effx=get.effect(target,sha,user,player); + targetsx.forEach(i=>i.removeSkill('dcbeini_fengyin')); + if(user==player) effx+=1; + if(get.attitude(player,user)>0) effx-=0.1; + if(effx>eff){ + eff=effx; + targets=targetsx; + } + } + } + if(targets.length) return targets; + return null; + })()); + if(result.bool){ + var user=result.targets[0],target=result.targets[1]; + result.targets.forEach(i=>i.addTempSkill('dcbeini_fengyin')); + var sha=new lib.element.VCard({name:'sha',isCard:true}); + if(user.canUse(sha,target,false)) user.useCard(sha,target,false,'noai'); + } + }, + ai:{ + order:0.1, + result:{ + player:function(player){ + if(player.countCards('h')-player.maxHp>=3) return 1; + return game.hasPlayer(current=>get.attitude(player,current)<=0)?1:0; + } + }, + }, + subSkill:{ + fengyin:{ + inherit:'fengyin', + }, + } + }, + dcshizong:{ + audio:2, + enable:'chooseToUse', + hiddenCard:function(player,name){ + if(get.type(name)!='basic') return false; + return player.countCards('he')>=player.countMark('dcshizong')+1; + }, + filter:function(event,player){ + if(event.type=='wuxie'||event.dcshizong) return false; + if(player.countCards('he'){ + if(info[0]!='basic') return; + const card={name:info[2],nature:info[3],isCard:true}; + return event.filterCard(card,player,event); + }) + return ui.create.dialog('恃纵',[vcards,'vcard'],'hidden'); + }, + check:function(button){ + if(get.event().getParent().type!='phase') return 1; + const player=get.player(); + const card={name:button.link[2],nature:button.link[3]}; + if(game.hasPlayer(current=>{ + return player.canUse(card,current)&&get.effect(current,card,player,player)>0; + })){ + switch(button.link[2]){ + case 'tao':return 5; + case 'jiu':return 3.01; + case 'sha': + if(button.link[3]=='fire') return 2.95; + else if(button.link[3]=='thunder') return 2.92; + else return 2.9; + } + } + return 0; + }, + backup:function(links,player){ + return { + filterCard:true, + filterTarget:lib.filter.notMe, + selectTarget:1, + selectCard:()=>get.player().countMark('dcshizong')+1, + viewAs:{ + name:links[0][2], + nature:links[0][3], + suit:'none', + number:null, + isCard:true, + }, + position:'he', + popname:true, + ignoreMod:true, + ai1:function(card){ + return 1/(1.1+Math.max(-1,get.value(card))); + }, + ai2:function(target){ + const att=get.attitude(get.player(),target); + const value=ui.selected.cards.map(card=>get.value(card)).reduce((p,c)=>{ + return p+c; + },0); + if(value>0||player.getHp()<=1) return att; + return -att; + }, + precontent:function*(event,map){ + var player=map.player,target=event.result.targets[0]; + player.logSkill('dcshizong',target); + if(!player.countMark('dcshizong')) player.when({global:'phaseAfter'}).then(()=>delete player.storage.dcshizong); + player.addMark('dcshizong',1,false); + yield player.give(event.result.cards.slice(),target); + var viewAs=new lib.element.VCard({name:event.result.card.name,nature:event.result.card.nature,isCard:true}); + var result=yield target.chooseCard('恃纵:是否将一张牌置于牌堆底?',`若如此做,${get.translation(player)}视为使用一张${get.translation(viewAs.nature)}【${get.translation(viewAs.name)}】`,'he').set('ai',card=>{ + if(get.event('goon')) return 7-get.value(card); + return 0; + }).set('goon',get.attitude(target,player)*(player.getUseValue(viewAs)||1)>=1); + var card=event.result.cards[0]; + if(result.bool){ + var card=result.cards[0]; + game.delayex(); + var next=target.loseToDiscardpile(card,ui.cardPile); + next.log=false; + if(get.position(card)=='e'){ + game.log(target,'将',card,'置于了牌堆底'); + } + else{ + next.blank=true; + game.log(target,'将一张牌置于了牌堆底'); + } + result=yield next; + game.broadcastAll(viewAs=>{ + lib.skill.dcshizong_backup2.viewAs=viewAs; + },lib.skill.dcshizong_backup.viewAs); + var evt=event.getParent(); + evt.set('_backupevent','dcshizong_backup2'); + evt.set('openskilldialog',`请选择${get.translation(viewAs.nature)}${get.translation(viewAs.name)}的目标`); + evt.backup('dcshizong_backup2'); + evt.set('norestore',true); + evt.set('custom',{ + add:{}, + replace:{window:function(){}} + }); + evt.goto(0); + if(target!=_status.currentPhase) player.tempBanSkill('dcshizong'); + } + else{ + target.chat('不放!'); + game.log(target,'选择不将牌置于牌堆底'); + var evt=event.getParent(); + evt.set('dcshizong',true); + evt.goto(0); + } + game.delayx(); + }, + ai:{ + order:10, + }, + } + }, + prompt:function(links,player){ + return `###恃纵:选择要交出的牌和目标角色###将${get.cnNumber(player.countMark('dcshizong')+1)}张牌交给一名其他角色,其可以选择将一张牌置于牌堆底,视为你使用一张${get.translation(links[0][3]||'')}${get.translation(links[0][2])}。`; + } + }, + ai:{ + order:function(){ + const player=get.player(),event=get.event(); + if(event.filterCard({name:'jiu'},player,event)&&get.effect(player,{name:'jiu'})>0){ + return get.order({name:'jiu'})+0.1; + } + return get.order({name:'sha'})+0.1; + }, + respondSha:true, + fireAttack:true, + respondShan:true, + skillTagFilter:function(player,tag,arg){ + if(tag=='fireAttack') return true; + if(player.countCards('he')false, + selectCard:-1, + precontent:function(){ + delete event.result.skill; + } + }, + }, + }, //张曼成 dclvecheng:{ audio:2, @@ -275,7 +950,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:['gainAfter','loseAsyncAfter']}, forced:true, filter:(event,player)=>{ - if(player==_status.currentPhase) return false; + // if(player==_status.currentPhase) return false; + if(event.getParent('phaseDraw',true)) return false; + const evt=player.getHistory('gain')[0]; + if(!evt) return false; + if(event.name=='gain'){ + if(evt!=event||event.getlx===false) return false; + } + else if(evt.getParent()!=event) return false; const hs=player.getCards('h'); if(!hs.length) return false; const cards=event.getg(player); @@ -323,17 +1005,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.give(cards,target,true); event.color=get.color(cards[0],player); 'step 1' + if(target.isIn()){ + var num=Math.min(Math.abs(target.getHp()-player.getHp()),5); + if(num>0) player.draw(num); + } + 'step 2' if(event.color=='red'){ if(target.getHp()<=player.getHp()&&target.isDamaged()) target.recover(); } else if(event.color=='black'){ if(target.getHp()>=player.getHp()) target.loseHp() } - 'step 2' - if(target.isIn()){ - var num=Math.min(Math.abs(target.getHp()-player.getHp()),5); - if(num>0) player.draw(num); - } }, ai:{ combo:'dclingkong', @@ -364,6 +1046,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], }, forced:true, + direct:true, filter:function(event,player){ if(player!=_status.currentPhase) return false; return game.hasPlayer(current=>{ @@ -383,7 +1066,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.logSkill('dcyouzhan',targets); 'step 1' var target=targets.shift(); - player.draw(); + player.draw().gaintag=['dcyouzhan']; + player.addTempSkill('dcyouzhan_limit'); target.addTempSkill('dcyouzhan_effect'); target.addMark('dcyouzhan_effect',1,false); target.addTempSkill('dcyouzhan_draw'); @@ -391,8 +1075,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.redo(); } }, + ai:{ + damageBonus:true, + skillTagFilter:function(player,tag,arg){ + if(!arg||!arg.target||!arg.target.hasSkill('dcyouzhan_effect')) return false; + } + }, subSkill:{ effect:{ + audio:'dcyouzhan', trigger:{ player:'damageBegin3', }, @@ -412,7 +1103,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:'本回合下一次受到的伤害+#', }, ai:{ - damageBonus:true, effect:{ target:function(card,player,target){ if(get.tag(card,'damage')) return 1+0.5*target.countMark('dcyouzhan_effect'); @@ -430,9 +1120,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return !player.getHistory('damage').length; }, content:function(){ - player.draw(player.getHistory('lose').length); + player.draw(Math.min(3,player.getHistory('lose').length)); }, }, + limit:{ + charlotte:true, + onremove:function(player){ + player.removeGaintag('dcyouzhan'); + }, + mod:{ + ignoredHandcard:function(card,player){ + if(card.hasGaintag('dcyouzhan')) return true; + }, + cardDiscardable:function(card,player,name){ + if(name=='phaseDiscard'&&card.hasGaintag('dcyouzhan')) return false; + }, + }, + } } }, //乐蔡文姬 @@ -564,6 +1268,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget(get.prompt2('dcmanzhi'),(card,player,target)=>{ if(player==target) return false; return !player.hasSkill('dcmanzhi_1')&&target.countCards('he')||!player.hasSkill('dcmanzhi_2')&&target.countCards('hej'); + }).set('ai',target=>{ + return 1-get.attitude(get.player(),target); }); 'step 1' if(result.bool){ @@ -691,7 +1397,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'useCard'}, filter:function(event,player){ - return !player.hasSkill('dczuowei_ban')&&_status.currentPhase==player; + if(_status.currentPhase!=player) return false; + if(!player.hasSkill('dczuowei_ban')) return true; + return Math.sign(player.countCards('h')-Math.max(1,player.countCards('e')))>=0; }, direct:true, locked:false, @@ -705,7 +1413,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else if(sign==0) player.chooseTarget(get.prompt('dczuowei'),'对一名其他角色造成1点伤害',lib.filter.notMe).set('ai',target=>{ return get.damageEffect(target,_status.event.player,_status.event.player); }); - else player.chooseBool(get.prompt('dczuowei'),'摸两张牌,然后此技能于本回合失效').set('ai',()=>1); + else player.chooseBool(get.prompt('dczuowei'),'摸两张牌,然后本回合你不能再触发该分支').set('ai',()=>1); 'step 1' if(!result.bool) event.finish() else if(event.sign<=0&&!event.isMine()&&!event.isOnline()) game.delayx(); @@ -731,18 +1439,35 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ban:{charlotte:true} }, mod:{ + aiValue:function(player,card,num){ + if(_status.currentPhase!=player) return; + const event=get.event(); + if(!player.isPhaseUsing()) return; + if(event.type!='phase') return; + const cardsh=[],cardse=[]; + for(const cardx of ui.selected.cards){ + const pos=get.position(cardx); + if(pos=='h') cardsh.add(cardx); + else if(pos=='e') cardse.add(cardx); + } + const hs=player.countCards('h')-cardsh.length,es=Math.max(1,player.countCards('e')-cardse.length); + const delt=hs-es; + if(delt<=0) return; + if(get.position(card)=='h'&&delt==1) return num/1.25; + }, + aiUseful:function(){ + return lib.skill.dczuowei.mod.aiValue.apply(this,arguments); + }, aiOrder:function(player,card,num){ if(player.hasSkill('dczuowei_ban')||_status.currentPhase!=player) return; - var cardsh=[],cardse=[]; - if(Array.isArray(card.cards)){ - cardsh.addArray(card.cards.filter(i=>get.position(i)=='h')); - cardse.addArray(card.cards.filter(i=>get.position(i)=='e')); - } - if(_status.currentPhase==player){ - if(get.tag(card,'draw')||get.tag(card,'gain')){ - if(player.countCards('h')-cardsh.length<=Math.max(1,player.countCards('e'))-cardse.length+(get.type(card)=='equip')) return num+10; - return num/5; - } + const cardsh=[],cardse=[]; + const pos=get.position(card); + if(pos=='h') cardsh.add(card); + else if(pos=='e') cardse.add(card); + if(get.tag(card,'draw')||get.tag(card,'gain')){ + const hs=player.countCards('h')-cardsh.length,es=Math.max(1,player.countCards('e')-cardse.length+(get.type(card)=='equip')); + if(player.hasSkill('dczuowei_ban')&&hsMath.max(1,player.countCards('e'))) return [1,3]; } @@ -1226,17 +1951,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.draw(2); 'step 1' var marked=target.hasMark('dcjizhong'); + var cards=target.getCards('h'); if(marked){ - if(target.countCards('h')) target.chooseToDiscard('集众:弃置三张手牌',3,true); - event.finish(); + if(cards.length<=3) event._result={bool:true,cards:cards}; + else target.chooseCard(`集众:交给${get.translation(player)}三张手牌`,3,true); } else{ - target.chooseToDiscard('集众:弃置三张手牌,或点击“取消”获得“信众”标记',3); + target.chooseCard(`集众:交给${get.translation(player)}三张手牌,或点击“取消”获得“信众”标记`,3).set('ai',card=>{ + if(get.event('goon')) return 20-get.value(card); + return 1-get.value(card); + }).set('goon',get.attitude(target,player)>0); } 'step 2' if(!result.bool){ target.addMark('dcjizhong',1); } + else{ + target.give(result.cards,player); + } }, marktext:'信', intro:{ @@ -1317,8 +2049,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, content:function(){ - player.loseHp(); player.draw(2); + player.loseHp(); } }, //董绾 @@ -1735,7 +2467,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.useCard({name:'sha',isCard:true},trigger.player,false).set('shanReq',num).set('oncard',card=>{ var evt=_status.event; evt.baseDamage++; - for(var target of evt.targets){ + for(var target of game.filterPlayer(null,null,true)){ var id=target.playerid; var map=evt.customArgs; if(!map[id]) map[id]={}; @@ -2539,7 +3271,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ onremove:true, intro:{ name:'内伐 - 基本牌', - content:'本回合内不能使用锦囊牌,且使用【杀】选择目标时可以多选择1个目标,且使用【杀】的目标次数上限+#。', + content:'本回合内不能使用锦囊牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。', }, mod:{ cardEnabled:function(card,player){ @@ -2599,7 +3331,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, intro:{ name:'内伐 - 锦囊牌', - content:'本回合内不能使用基本牌,且使用普通锦囊牌选择目标时可以多选择或者取消1个目标。' + content:'本回合内不能使用基本牌,且使用普通锦囊牌选择目标时可以增加或减少一个目标。' }, filter:function(event,player){ if(get.type(event.card)!='trick') return false; @@ -4137,7 +4869,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=evt.cards.filterInD(); return get.value(cards,evt.player)*get.attitude(player,evt.player); } - return 0; }) 'step 1' if(result.bool){ @@ -5150,6 +5881,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ gain:{ + audio:'dcliuzhuan', trigger:{global:['loseAfter','loseAsyncAfter','cardsDiscardAfter']}, forced:true, logTarget:()=>_status.currentPhase, @@ -5780,7 +6512,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ blocker:{ - charlotte:true, init:function(player,skill){ player.addSkillBlocker(skill); }, @@ -10161,10 +10892,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mengyou:'孟优,《三国演义》里的人物,南蛮王孟获之弟。与诸葛亮的南征军交战,向败战的兄长推荐朵思大王,劝兄长借助朵思之力与蜀汉军对抗。后来与兄长一起发誓归顺蜀汉。', liuchongluojun:'刘宠(?~197年),汉明帝刘庄玄孙,陈敬王刘羡曾孙,陈顷王刘崇之孙,陈孝王刘承之子,陈国第六位国君,也是东汉陈国的最后一位国君。骆俊(?-197),字孝远,东汉末年扬州会稽郡乌伤县(今浙江义乌)人。宗室陈王刘宠的国相,在任期间励精图治,深得民众爱戴。刘宠勇猛过人,善使弓弩,箭法高超。在其父刘承死后,继承陈王爵位。中平年间,黄巾军起义,郡县官兵都弃城逃走,刘宠于是征兵自守卫。当时天下饥荒,诸王侯都已不再享有租赋,反屡遭抢掠,有的甚至流离在外,死于荒野。只有陈国仍很富强,邻郡百姓纷纷前去投靠,陈国拥有部众达十余万人。初平元年(190年),各州郡起兵讨伐董卓,刘宠率军屯驻阳夏,自称辅汉大将军。建安二年(197年),袁术向陈国求取粮草,遭陈国国相骆俊拒绝,袁术大为生气,便派刺客张闿假装路过陈国,乘机杀死骆俊和刘宠。', yuechen:'乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。', + kuaiqi:'蒯祺(?~219年),南郡中卢人,荆州望族子弟,与荆州牧刘表帐下谋士蒯良、蒯越为同族,东汉末年房陵太守。建安二十四年(219年),汉中王刘备遣宜都太守孟达从秭归北攻房陵,蒯祺于战斗中被孟达所部士兵所杀。清朝任兆麟《心斋十种》中的《襄阳记》辑本引用《万历襄阳府志》“(蒯)钦从祖祺妇,即诸葛孔明之姊也”,称蒯祺娶故兖州泰山郡丞诸葛珪长女,即他是知名政治家、蜀汉丞相诸葛亮的姐夫。但在任兆麟之前的《襄阳记》辑本中,并没有这一条。', }, characterTitle:{ }, - perfectPair:{}, characterFilter:{ }, dynamicTranslate:{ @@ -10205,6 +10936,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mamidi:['mamidi','xin_mamidi'], mengyou:['mengyou','ns_mengyou'], zhangchu:['zhangchu','jsrg_zhangchu'], + xianglang:['xianglang','mb_xianglang'], }, translate:{ re_panfeng:'潘凤', @@ -10573,11 +11305,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcmoyu_info:'出牌阶段每名角色限一次。你可以获得一名其他角色区域里的一张牌,然后其可以对你使用一张无距离限制的【杀】,且此【杀】伤害基数为X(X为你于本回合发动此技能的次数)。若此【杀】对你造成了伤害,你令此技能于本回合失效。', zhangchu:'张楚', dcjizhong:'集众', - dcjizhong_info:'出牌阶段限一次。你可以令一名其他角色摸两张牌,然后其选择一项:1.若其没有“信众”标记,其获得“信众”标记;2.弃置三张手牌。', + dcjizhong_info:'出牌阶段限一次。你可以令一名其他角色摸两张牌,然后其选择一项:1.若其没有“信众”标记,其获得“信众”标记;2.交给你三张手牌。', dcrihui:'日彗', dcrihui_info:'每回合限一次。当你使用普通锦囊牌或黑色基本牌结算结束后,若此牌的目标数为1且目标不为你,且其:没有“信众”,则所有有“信众”的角色依次视为对其使用一张与此牌牌名和属性相同的牌;有“信众”,则你可以获得其区域里的一张牌。', dcguangshi:'光噬', - dcguangshi_info:'锁定技。准备阶段,若所有其他角色均有“信众”,你失去1点体力并摸两张牌。', + dcguangshi_info:'锁定技。准备阶段,若所有其他角色均有“信众”,你摸两张牌并失去1点体力。', dongwan:'董绾', dcshengdu:'生妒', dcshengdu_info:'回合开始时,你可以选择一名其他角色。当其于其的下个摸牌阶段得到牌后,你摸等量的牌。', @@ -10601,7 +11333,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dczigu:'自固', dczigu_info:'出牌阶段限一次。你可以弃置一张牌,然后获得场上的一张装备牌。若你没有因此获得其他角色的牌,你摸一张牌。', dczuowei:'作威', - dczuowei_info:'当你于回合内使用牌时,你可以根据你的手牌数执行对应效果:大于X,令此牌不可被响应;等于X,对一名其他角色造成1点伤害;小于X,摸两张牌并令此技能于本回合失效(X为你装备区里牌的数量且至少为1)。', + dczuowei_info:'当你于回合内使用牌时,你可以根据你的手牌数执行对应效果:大于X,令此牌不可被响应;等于X,对一名其他角色造成1点伤害;小于X,摸两张牌且不能于本回合再触发该选项(X为你装备区里牌的数量且至少为1)。', liuchongluojun:'刘宠骆俊', dcminze:'悯泽', dcminze_info:'①出牌阶段每名角色限一次。你可以将至多两张牌名不同的牌交给一名手牌数小于你的角色,若其因此手牌数大于你,〖悯泽①〗于此阶段失效。②结束阶段,你将手牌摸至X张(X为你本回合因〖悯泽①〗失去过的牌的牌名数且至多为5)。', @@ -10621,19 +11353,46 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcbeifen_info:'锁定技。①当你失去牌后,若这些牌中有“胡笳”牌,你获得与你手牌中“胡笳”牌花色均不同的每种花色的牌各一张。②若你手牌中“胡笳”牌数小于不为“胡笳”牌的牌数,你使用牌无距离和次数限制。', dc_wuban:'吴班', dcyouzhan:'诱战', - dcyouzhan_info:'锁定技。当其他角色于你的回合内失去牌后,你摸一张牌,且其获得如下效果:1.其于此回合下一次受到的伤害+1;2.结束阶段,若其于此回合未受到过伤害,其摸X张牌(X为其此回合失去过牌的次数)。', + dcyouzhan_info:'锁定技。当其他角色于你的回合内失去牌后,你摸一张牌(不计入本回合的手牌上限),且其获得如下效果:1.其于此回合下一次受到的伤害+1;2.结束阶段,若其于此回合未受到过伤害,其摸X张牌(X为其此回合失去过牌的次数且至多为3)。', yue_zhoufei:'乐周妃', yue_zhoufei_prefix:'乐', dclingkong:'灵箜', dclingkong_tag:'箜篌', - dclingkong_info:'锁定技。①游戏开始时,你将所有手牌标记为“箜篌”。②你的“箜篌”牌不计入手牌上限。③当你于回合外获得牌后,系统随机将其中的一张牌标记为“箜篌”。', + dclingkong_info:'锁定技。①游戏开始时,你将所有手牌标记为“箜篌”。②你的“箜篌”牌不计入手牌上限。③当你于一回合内首次于摸牌阶段外得到牌后,系统随机将其中的一张牌标记为“箜篌”。', dcxianshu:'贤淑', - dcxianshu_info:'出牌阶段,你可以将一张“箜篌”正面向上交给一名其他角色。若此牌为红色,且该角色的体力值不大于你,则其回复1点体力;若此牌为黑色,且该角色的体力值不小于你,则其失去1点体力。此技能结算完成后,你摸X张牌(X为你与其的体力值之差且至多为5)。', + dcxianshu_info:'出牌阶段,你可以将一张“箜篌”正面向上交给一名其他角色,然后你摸X张牌(X为你与其的体力值之差且至多为5)。若此牌为红色,且该角色的体力值不大于你,则其回复1点体力;若此牌为黑色,且该角色的体力值不小于你,则其失去1点体力。', dc_zhangmancheng:'张曼成', dclvecheng:'掠城', dclvecheng_info:'出牌阶段限一次。你可以选择一名其他角色,你于本回合对其使用当前手牌中的【杀】无任何次数限制。然后回合结束时,其展示所有手牌,若其中有【杀】,其可以选择对你依次使用其中所有的【杀】。', dczhongji:'螽集', dczhongji_info:'当你使用牌时,若此牌无花色或你手牌区里没有与此牌花色相同的手牌,你可以将手牌摸至体力上限并弃置X张牌(X为本回合发动〖螽集〗的次数)。', + dc_jiachong:'贾充', + dcbeini:'悖逆', + dcbeini_info:'出牌阶段限一次。你可以将手牌调整至体力上限,然后令一名角色视为对另一名角色使用一张【杀】,且这些角色的非锁定技失效直到回合结束。', + dcshizong:'恃纵', + dcshizong_info:'当你需要使用一张基本牌时,你可以交给一名其他角色X张牌,然后其可以将一张牌置于牌堆底,视为你使用之。若其不为当前回合角色,此技能失效直到回合结束(X为你本回合发动〖恃纵〗的次数)。', + pangshanmin:'庞山民', + dccaisi:'才思', + dccaisi_info:'当你于回合内/回合外使用基本牌结算结束后,若你本回合以此法得到的牌数不大于你的体力上限,你可以从牌堆/弃牌堆随机获得一张非基本牌。', + dczhuoli:'擢吏', + dczhuoli_info:'锁定技。一名角色的回合结束时,若你本回合使用的牌数大于体力上限,你加1点体力上限(不能超过存活角色数),回复1点体力。', + yue_caiyong:'乐蔡邕', + yue_caiyong_prefix:'乐', + dcjiaowei:'焦尾', + dcjiaowei_tag:'弦', + dcjiaowei_info:'锁定技。①游戏开始时,你将所有手牌标记为“弦”。②你的“弦”牌不计入手牌上限。③当你受到伤害时,若来源的手牌数不大于你的“弦”牌数,防止此伤害。', + dcfeibai:'飞白', + dcfeibai_info:'每回合限一次。当你使用牌结算结束后,若你本回合使用过至少两张牌,你可以随机获得一张字数为X的牌。若你的“弦”数不大于X,你重置〖飞白〗(X为此牌与你使用的上一张牌的字数之和)。', + kuaiqi:'蒯祺', + dcliangxiu:'良秀', + dcliangxiu_info:'出牌阶段,你可以弃置两张不同类型的牌,然后从两张与你弃置的牌类型均不同的牌中选择一张获得之(每阶段每种类型限一次)。', + dcxunjie:'殉节', + dcxunjie_info:'每轮每项限一次。一名角色的回合结束时,若你本回合于摸牌阶段外得到过牌,你可以选择一项:1.令一名角色将手牌数摸或弃置至与其体力值相同;2.令一名角色将体力回复或失去至与其手牌数相同。', + dc_dongzhao:'董昭', + dcyijia:'移驾', + dcyijia_info:'一名角色受到伤害后,若你至其的距离不大于1,你可以将场上一张装备牌移动至其对应装备栏(替换原装备)。若其因此脱离了一名角色的攻击范围,你摸一张牌。', + dcdingji:'定基', + dcdingji_info:'准备阶段,你可以令一名角色将手牌摸或弃置至五张,然后其展示手牌。若牌名均不同,则其可以视为使用其中一张基本或普通锦囊牌。', sp_baigei:'无双上将', sp_caizijiaren:'才子佳人', diff --git a/character/jsrg.js b/character/jsrg.js index a9b05cd16..628d6cc20 100644 --- a/character/jsrg.js +++ b/character/jsrg.js @@ -384,7 +384,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ onremove:true, filter:function(event,player){ if(!event.card.storage||!event.card.storage.jsrgzhenfeng) return false; - debugger + // debugger var str=event.target.getSkills(null,false,false).map(skill=>{ var info=get.info(skill); if(!info||info.charlotte) return; @@ -615,13 +615,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('targets',targets).set('ai',target=>{ return target==get.event('targetx')?1:0; }).set('targetx',(()=>{ - var info=targets.map(target=>{ - var att=get.attitude(player,target); - return [target,att*Math.sqrt(target.getHistory('lose').map(evt=>evt.cards2.length).reduce((p,c)=>p+c,0))]; - }).sort((a,b)=>{ + let info=[]; + targets.filter(target=>{ + let att=get.attitude(player,target); + if(att<=0) return false; + if(Math.abs(att)>1) att=Math.sign(att)*Math.sqrt(Math.abs(att)); + info.push([target,att*target.getHistory('lose').map(evt=>evt.cards2.length).reduce((p,c)=>p+c,0)]); + return false; + }); + if(!info.length) return null; + info=info.sort((a,b)=>{ return b[1]-a[1]; })[0]; - if(info[1]<0) return null; + if(info[1]<=0) return null; return info[0]; })()); 'step 1' @@ -687,11 +693,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ frozen:{ mod:{ cardnature:function(card,player){ - if(get.suit(card)=='club'&&card.name=='sha') return 'ice'; + if(card.name==='sha'&&get.suit(card)==='club') return 'ice'; }, + aiOrder:(player,card,num)=>{ + if(num&&card.name==='sha'&&game.hasNature(card,'ice')){ + let lg=game.findPlayer(current=>current.hasSkill('jsrgninghan')); + if(lg) return num+0.15*Math.sign(get.attitude(player,lg)); + } + } } }, }, + ai:{ + combo:'jsrgshacheng' + } }, //张任 jsrgfuni:{ @@ -1211,8 +1226,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ player.logSkill('jsrgguiji_swapback',trigger.player); player.swapHandcards(trigger.player); - player.unmarkAuto('jsrgguiji_swapback',[trigger.player]); } + player.unmarkAuto('jsrgguiji_swapback',[trigger.player]); }, intro:{ content:'$的下个出牌阶段结束时,你可以与其交换手牌' @@ -1992,7 +2007,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ subSkill:{ undist:{ group:'undist', - charlotte:true, trigger:{ player:['useCardAfter','damageEnd'], }, @@ -2233,14 +2247,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 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; + target:(player,target)=>{ + let num=player.countCards('h')-target.countCards('h'), + eff=get.effect(target,{name:'sha',nature:'stab'},player,target), + val=0, + ph=_status.event.getTempCache('jsrgqingxi_result','ph'); + if(!ph){ + ph=player.getCards('h').sort((a,b)=>{ + return get.value(a)-get.value(b); + }); + _status.event.putTempCache('jsrgqingxi_result','ph',ph); + } + ph.slice(0,num).forEach(i=>{ + val+=get.value(i,player); }); - if(cnt2*Math.abs(eff)) return 0; + return eff/num; } } }, @@ -2954,7 +2977,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(count==1) return true; for(var i=0;i{ var player=_status.event.player; @@ -3107,7 +3130,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 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]; + if(!(i in next)) next[i]=trigger[i]; } next.filterTargetx=trigger.filterTarget||(()=>false); next.filterTarget=function(card,player,target){ @@ -3708,7 +3731,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ list.remove('锁定技'); if(list.length>0) continue; var info=get.info(skill); - if(info&&(!info.unique||info.gainable)) skills.add(skill); + if(info&&(!info.unique||info.gainable)){ + // lib.skill.rehuashen.createAudio(name,skill,'jsrg_xushao'); + skills.add(skill); + } } } } @@ -3718,6 +3744,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addSkillBlocker('sbyingmen'); game.log(player,'将','#y'+get.translation(characters),'加入了','#g“访客”'); game.broadcastAll(function(player,characters){ + player.tempname.addArray(characters); player.$draw(characters.map(function(name){ var cardname='huashen_card_'+name; lib.card[cardname]={ @@ -3738,6 +3765,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var characters2=player.getStorage('sbyingmen').slice(0); characters2.removeArray(characters); skills.removeArray(lib.skill.sbyingmen.getSkills(characters2,player)); + game.broadcastAll((player,characters)=>player.tempname.removeArray(characters),player,characters); player.unmarkAuto('sbyingmen',characters); _status.characterlist.addArray(characters); player.removeInvisibleSkill(skills); @@ -4390,7 +4418,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var ind=skillx.lastIndexOf('_'); if(ind==-1) break; skillx=skillx.slice(0,ind); - }; + } } if(popup!=false&&!infox.silent) infox.forced=false; if(!infox.charlotte&&infox.mod) delete infox.mod; diff --git a/character/mobile.js b/character/mobile.js index 175af643b..cf0588a74 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -6,7 +6,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connect:true, characterSort:{ mobile:{ - mobile_default:['yanxiang','xin_wuban','laimin','baoxin','jiangji','liwei','xin_guozhao',"miheng","taoqian","lingcao","sunru","lifeng","zhuling","liuye","zhaotongzhaoguang","majun","simazhao","wangyuanji","pangdegong","shenpei","hujinding","zhangyì","jiakui","yangbiao","chendeng","dongcheng","yangyi","dengzhi","zhengxuan","sp_sufei","furong","dingyuan","simashi","yanghuiyu","hucheer","gongsunkang","nanhualaoxian","zhouqun","qiaozhou","fuqian","simafu","mayuanyi","yanpu","sunhanhua","sp_maojie","peixiu","sp_jianggan","ruanhui","xin_mamidi","sp_caosong","yangfu","wangjun","sp_pengyang","qianzhao",'shichangshi'], + mobile_default:['mb_xianglang','yanxiang','xin_wuban','laimin','baoxin','jiangji','liwei','xin_guozhao',"miheng","taoqian","lingcao","sunru","lifeng","zhuling","liuye","zhaotongzhaoguang","majun","simazhao","wangyuanji","pangdegong","shenpei","hujinding","zhangyì","jiakui","yangbiao","chendeng","dongcheng","yangyi","dengzhi","zhengxuan","sp_sufei","furong","dingyuan","simashi","yanghuiyu","hucheer","gongsunkang","nanhualaoxian","zhouqun","qiaozhou","fuqian","simafu","mayuanyi","yanpu","sunhanhua","sp_maojie","peixiu","sp_jianggan","ruanhui","xin_mamidi","sp_caosong","yangfu","wangjun","sp_pengyang","qianzhao",'shichangshi'], mobile_yijiang:["yj_zhanghe","yj_zhangliao","yj_xuhuang","yj_ganning",'yj_huangzhong','yj_weiyan','yj_zhoubuyi'], mobile_standard:["xin_xiahoudun","xin_zhangfei"], mobile_shenhua_feng:['re_xiaoqiao',"xin_zhoutai"], @@ -26,13 +26,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + mb_xianglang:['male','shu',3,['naxue','yijie']], yanxiang:['male','qun',3,['kujian','twruilian'],['character:tw_yanxiang','die_audio:tw_yanxiang']], mb_sunluyu:['female','wu',3,['mbmeibu','mbmumu']], xin_wuban:['male','shu',4,['xinjintao'],['clan:陈留吴氏','character:wuban']], - baoxin:['male','qun',4,['mutao','yimou'],['character:tw_baoxin','die_audio:tw_baoxin']], + baoxin:['male','qun',4,['mutao','yimou'],['die_audio:tw_baoxin']], jiangji:['male','wei',3,['twjichou','jilun'],['character:tw_jiangji','die_audio:tw_jiangji']], - liwei:['male','shu',4,['jiaohua'],['character:tw_liwei','die:tw_liwei']], - laimin:['male','shu',3,['laishou','luanqun'],['unseen']], + liwei:['male','shu',4,['jiaohua'],['die_audio:tw_liwei']], + laimin:['male','shu',3,['laishou','luanqun']], yj_zhoubuyi:['male','wei',3,['mbhuiyao','mbquesong']], xin_guozhao:['female','wei',3,['yichong','wufei']], xin_zhangyi:['male','shu',4,['xinwurong','shizhi']], @@ -388,6 +389,106 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //向朗 + naxue:{ + audio:2, + trigger:{player:'phaseUseBefore'}, + check:function(event,player){ + var cards=player.getCards('h',card=>player.hasValueTarget(card)); + if(!cards.length) return true; + if(!(player.hp>=2&&player.countCards('h')<=player.hp+1)) return false; + return game.hasPlayer(function(target){ + if(target.hasJudge('lebu')||target==player) return false; + if(get.attitude(player,target)>4){ + return (get.threaten(target)/Math.sqrt(target.hp+1)/Math.sqrt(target.countCards('h')+1)>0); + } + return false; + }); + }, + content:function*(event,map){ + var player=map.player; + map.trigger.cancel(); + var num=player.countDiscardableCards(player,'he'); + if(num){ + var result=yield player.chooseToDiscard('纳学:是否弃置任意张牌并摸等量的牌?','he',[1,num]).set('ai',lib.skill.zhiheng.check); + if(result.bool) yield player.draw(result.cards.length); + } + if(player.countCards('h')){ + var result2=yield player.chooseCardTarget({ + prompt:'是否交给至多两名其他角色各一张手牌?', + prompt2:'先按顺序选中所有要给出的牌,然后再按顺序选择等量的目标角色。', + selectCard:[1,2], + filterCard:true, + filterTarget:lib.filter.notMe, + selectTarget:function(){ + return ui.selected.cards.length; + }, + filterOk:()=>{ + return ui.selected.cards.length==ui.selected.targets.length; + }, + position:'h', + ai1:function(card){ + if(card.name=='du') return 10; + else if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; + var player=_status.event.player; + if(ui.selected.cards.length>4||!game.hasPlayer(function(current){ + return get.attitude(player,current)>0&&!current.hasSkillTag('nogain'); + })) return 0; + return 1/Math.max(0.1,get.value(card)); + }, + ai2:function(target){ + var player=_status.event.player,att=get.attitude(player,target); + if(ui.selected.cards[0].name=='du') return -att; + if(target.hasSkillTag('nogain')) att/=6; + return att; + }, + }); + if(result2.bool){ + const list=[]; + for(let i=0;itarget!=player); + }, + forced:true, + forceDie:true, + skillAnimation:true, + animationColor:'orange', + logTarget:function(event,player){ + return game.filterPlayer(target=>target!=player); + }, + content:function(){ + 'step 0' + var targets=game.filterPlayer(target=>target!=player); + var sum=targets.reduce((num,target)=>num+=target.hp,0); + sum=Math.max(1,Math.floor(sum/targets.length)); + event.num=sum; + event.targets=targets; + 'step 1' + var target=targets.shift(); + var delta=target.hp-num; + if(delta!=0){ + target[delta>0?'loseHp':'recover'](Math.abs(delta)); + } + if(targets.length) event.redo(); + }, + }, //阎象 kujian:{ audio:'twkujian', @@ -711,7 +812,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'twjilun', inherit:'twjilun', filter:function(event,player){ - return player.hasSkill('twjichou'); + return player.hasSkill('twjichou',null,false,false); }, content:function(){ 'step 0' @@ -797,7 +898,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ onremove:true, audio:'twjiaohua', enable:'phaseUse', - usable:3, + usable:2, chooseButton:{ dialog:function(event,player){ return ui.create.dialog('###教化###选择一种牌的类型,令一名角色从牌堆获得此类型的一张牌'); @@ -815,6 +916,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return{ type:result.control, audio:'twjiaohua', + filterCard:()=>false, + selectCard:-1, filterTarget:true, content:function(){ 'step 0' @@ -912,7 +1015,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=_status.event.list[0]; var targets=_status.event.list[1]; var player=_status.event.player; - if(get.attitude(player,targets[cards.indexOf(button.link)])) return 0; + if(get.attitude(player,targets[cards.indexOf(button.link)])>0) return 0; return get.value(button.link,player); }).set('list',[cards,targets]); } @@ -970,32 +1073,95 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', usable:1, - filterTarget:lib.filter.notMe, + // filterTarget:lib.filter.notMe, content:function(){ + 'step 0' player.damage('nosource'); - target.damage('unreal'); + 'step 1' + if(game.countPlayer()<2) event.finish(); + if(game.countPlayer()==2) event._result={bool:true,targets:[game.findPlayer(i=>i!=player),player]}; + else player.chooseTarget(`慧夭:请选择两名角色`,`令不为你的第一名角色视为对第二名角色造成过1点伤害。`,(card,player,target)=>{ + if(!ui.selected.targets.length) return player!=target; + return true; + },2,true).set('multitarget',true).set('targetprompt',['伤害来源','受伤角色']).set('ai',target=>{ + return target==get.event('aiTargets')[ui.selected.targets.length]?10:0; + }).set('aiTargets',lib.skill.mbhuiyao.getUnrealDamageTargets(player,[game.filterPlayer(i=>i!=player),game.filterPlayer()],true)); + 'step 2' + if(result.bool){ + var targets=result.targets; + player.line2(targets,'green'); + game.delaye(); + targets[1].damage(targets[0],'unreal'); + } + }, + getUnrealDamageTargets:(player,lists,forced)=>{ + const targets=[null,null]; + let sourceList,targetList; + if(lists.length==2&&lists.every(l=>Array.isArray(l))){ + sourceList=lists[0]; targetList=lists[1]; + } + else{ + sourceList=lists.slice(); targetList=lists.slice(); + } + const list=targetList.map(current=>{ + const _hp=current.hp,_maxhp=current.maxHp; + current.hp=100; current.maxHp=100; + const att=-get.sgnAttitude(player,current); + let val=get.damageEffect(current,player,current)*att; + current.getSkills(null,false,false).forEach(skill=>{ + const info=get.info(skill); + if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att); + }); + const eff=100/val+15; + current.hp=_hp; current.maxHp=_maxhp; + return [current,eff]; + }).sort((a,b)=>b[1]-a[1])[0]; + if(list[1]<0&&!forced) return targets; + const targetx=list[0]; + targets[1]=targetx; + const list2=sourceList.filter(i=>i!=targetx).map(current=>{ + const _hp=targetx.hp,_maxhp=targetx.maxHp; + targetx.hp=100; targetx.maxHp=100; + const att=-get.sgnAttitude(player,current); + const eff=get.damageEffect(targetx,current,current)*att; + targetx.hp=_hp; targetx.maxHp=_maxhp; + return [current,eff]; + }).sort((a,b)=>b[1]-a[1])[0]; + if(!list2) return targets; + targets[0]=list2[0]; + return targets; }, ai:{ order:6, result:{ - target:function(player,target){ - if(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<1) return 0; - var _hp=target.hp,_maxhp=target.maxHp; - target.hp=10; target.maxHp=10; - var att=-get.sgnAttitude(player,target); - var val=get.damageEffect(target,player,target)*att; - target.getSkills(null,false,false).forEach(skill=>{ - var info=get.info(skill); - if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att); - }); - var eff=100/val; - target.hp=_hp; target.maxHp=_maxhp; - var limit=17.5; - if(player.hasSkill('mbquesong')){ - if(!player.getStat().damaged) limit+=7.5; + player:function(player){ + if(player.getHp()+player.countCards('hs',card=>player.canSaveCard(card,player))<=1) return 0; + var limit=25; + var quesong=player.hasSkill('mbquesong')&&!player.getStat().damaged; + if(quesong){ + limit-=7.5; } - if(eff{ + var att=get.attitude(player,target); + if(att<0) return false; + return att*Math.sqrt(Math.max(1,[1,2,3,4].reduce((p,c)=>p+target.countEmptySlot(c),0)))>=10||target.getHp()<=2; + })) return 1; + if(!quesong&&game.hasPlayer(target=>{ + if(target==player) return false; + var _hp=target.hp,_maxhp=target.maxHp; + target.hp=100; target.maxHp=100; + var att=-get.sgnAttitude(player,target); + var val=get.damageEffect(target,player,target)*att; + target.getSkills(null,false,false).forEach(skill=>{ + var info=get.info(skill); + if(info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend)) val=Math[val>0?'max':'min'](val>0?0.1:-0.1,val+2*att); + }); + var eff=100/val; + target.hp=_hp; target.maxHp=_maxhp; + if(eff{ var player=_status.event.player; if(get.attitude(player,target)<=0) return 0; - var len=[1,2,3,4,5].reduce((p,c)=>p+target.countEmptySlot(c),0);hp=target.getHp(); + var len=lib.skill.mbquesong.getNum(target),hp=target.getHp(); return len+target.isTurnedOver()*2+1.5*Math.min(4,target.getDamagedHp())/(hp+1); }); 'step 1' @@ -1020,38 +1186,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=result.targets[0]; event.target=target; player.logSkill('mbquesong',target); - var len=[1,2,3,4,5].reduce((p,c)=>p+target.countEmptySlot(c),0);hp=target.getHp(); - var forced=false; - if(len==0) forced=true; - if(hp==0||target.countCards('h'){ - if(!_status.event.goon) return 0; - return 6-get.value(card); - }).set('goon',function(){ - var _hp=hp+target.isTurnedOver()*1.5; - if(forced||_hp+player.countCards('hs',card=>get.tag(card,'recover'))<=2-len/4) return true; - return len>_hp; - }()); + target.chooseControl().set('choiceList',[ + '摸'+get.cnNumber(len)+'张牌并复原武将牌', + '回复1点体力', + ]).set('prompt','雀颂:请选择一项').set('ai',()=>{ + var player=_status.event.player; + var len=_status.event.len; + return get.effect(player,{name:'wuzhong'},player,player)*len/2>=get.recoverEffect(player,player,player)?0:1; + }).set('len',len); } } else event.finish(); 'step 2' - if(result.bool){ + if(result.index==1){ target.recover(); event.finish(); } - else{ - target.draw([1,2,3,4,5].reduce((p,c)=>p+target.countEmptySlot(c),0)); - } + else target.draw(lib.skill.mbquesong.getNum(target)); 'step 3' - player.link(false); + target.link(false); 'step 4' - player.turnOver(false); + target.turnOver(false); + }, + getNum:function(player){ + return player.countCards('e',card=>get.subtype(card)!='equip5')>=3?2:3; }, ai:{ expose:0.2, @@ -1063,9 +1224,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, //郭照 yichong:{ - init:function(player){ - if(!lib.skill['yichong_'+player.playerid]){ - lib.skill['yichong_'+player.playerid]={ + initSkill:function(skill){ + if(!lib.skill[skill]){ + lib.skill[skill]={ + charlotte:true, onremove:true, mark:true, marktext:'雀', @@ -1078,8 +1240,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }; - lib.translate['yichong_'+player.playerid]='易宠'; - lib.translate['yichong_'+player.playerid+'_bg']='雀'; + lib.translate[skill]='易宠'; + lib.translate[skill+'_bg']='雀'; } }, getLimit:1, @@ -1141,6 +1303,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var suit=event.suit; player.storage.yichong=suit; player.markSkill('yichong'); + var skill='yichong_'+player.playerid; + game.broadcastAll(lib.skill.yichong.initSkill,skill); game.broadcastAll(function(player,suit){ if(player.marks.yichong) player.marks.yichong.firstChild.innerHTML=get.translation(suit); },player,suit); @@ -1547,10 +1711,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var others=list.randomGets(4); if(others.length==1) event._result={bool:true,links:others}; else{ + var map={ + 'scs_bilan':'scs_hankui', + 'scs_hankui':'scs_bilan', + 'scs_duangui':'scs_guosheng', + 'scs_guosheng':'scs_duangui', + },map2=lib.skill.mbdanggu.conflictMap(player); var conflictList=others.filter(changshi=>{ - var map=lib.skill.mbdanggu.conflictMap(player); - var names=map[first]; - return names.contains(changshi); + if(map[first]&&others.some(changshi2=>map[first]==changshi2)) return map[first]==changshi; + else return map2[first].includes(changshi); }),list=others.slice(); if(conflictList.length){ var conflict=conflictList.randomGet(); @@ -1697,7 +1866,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.includeOut=true; } }, - ai:{combo:'mbdanggu'}, + ai:{ + combo:'mbdanggu', + neg:true + }, dieContent:function(){ 'step 0' event.forceDie=true; @@ -3655,30 +3827,32 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, derivation:['yijin_wushi','yijin_jinmi','yijin_guxiong','yijin_tongshen','yijin_yongbi','yijin_houren'], getValue:function(player,mark,target){ - var att=get.attitude(player,target); - var dis=Math.sqrt(get.distance(player,target,'absolute')); - switch (mark.slice(6)){ + let dis=Math.sqrt(get.distance(player,target,'absolute')); + if(target.isTurnedOver()) dis++; + let draw=get.effect(target,{name:'wuzhong'},target,target)/2; + switch(mark.slice(6)){ case 'wushi': - return get.effect(target,{name:'wuzhong'},player,player)*2.5/dis; + if(target.hasJudge('bingliang')) return 12/(1+target.getCardUsable('sha',true)); + return 5*draw/dis+12/(1+target.getCardUsable('sha',true)); case 'jinmi': - if(target.hasJudge('lebu')&&!target.hasCard({name:'wuxie'},'hs')) return 1; - return get.effect(target,{name:'lebu'},player,player)/dis; + if(target.hasJudge('lebu')&&!target.hasCard({name:'wuxie'},'hs')) return draw*target.needsToDiscard(2.2)/dis; + return get.effect(target,{name:'lebu'},player,target)+draw*target.needsToDiscard(2.2)/dis; case 'guxiong': - return get.effect(target,{name:'losehp'},player,player)*2/dis; + if(target.hasJudge('lebu')) return -draw*target.needsToDiscard(3)/dis; + return get.effect(target,{name:'losehp'},target,target)*2/dis-draw*target.needsToDiscard(3)/dis; case 'tongshen': if(target.isMin()) return 0; - var eff=get.damageEffect(target,player,target); - if(eff>=0) return 0; - if(att>=4){ - if(target.hp==1) return att*5/Math.max(0.1,5-dis); - if(target.hp==2&&target.countCards('he')<=2) return att*3/Math.max(0.1,5-dis); - } - if(att>0) return 0; - return -eff/5*dis; + var eff=-get.damageEffect(target,player,target); + if(eff<=0) return 0; + if(target.hp<2) return eff*dis*2; + if(target.hp<3&&target.countCards('he')<3) return eff*dis*1.5; + if(target.hp>3) return eff*dis/target.hp; + return eff*dis; case 'yongbi': - return get.effect(target,{name:'bingliang'},player,player)*2; + if(target.hasJudge('bingliang')&&!target.hasCard({name:'wuxie'},'hs')) return 0; + return get.effect(target,{name:'bingliang'},player,target)*2/dis; case 'houren': - return get.recoverEffect(target,player,player)/dis; + return Math.min(5,2+target.getDamagedHp())*get.recoverEffect(target,player,target)/dis; } }, content:function(){ @@ -3686,8 +3860,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseTarget('亿金:令一名其他角色获得1枚“金”',true,(card,player,target)=>{ return player!=target&&!lib.skill.yijin.getKane(target).length; }).set('ai',target=>{ - var player=_status.event.player,kane=lib.skill.yijin.getKane(player); - return Math.abs(Math.max.apply(Math.max,kane.map(i=>lib.skill.yijin.getValue(player,i,target)))); + let player=_status.event.player,att=get.attitude(player,target),kane=lib.skill.yijin.getKane(player); + if(Math.abs(att)>1) att=Math.sign(att)*Math.sqrt(Math.abs(att)); + return Math.max.apply(Math.max,kane.map(i=>{ + return att*lib.skill.yijin.getValue(player,i,target); + })); }); 'step 1' if(result.bool){ @@ -3700,8 +3877,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ '
    '+get.skillInfoTranslation(i,player)+'
    '; }); player.chooseControl(kane).set('choiceList',choiceList).set('displayIndex',false).set('prompt','选择令'+get.translation(target)+'获得的“金”').set('ai',()=>{ - var controls=_status.event.controls,player=_status.event.player,target=_status.event.getParent().target; - var list=controls.map(i=>[i,lib.skill.yijin.getValue(player,i,target)])//.filter(i=>i[1]>=0); + let controls=_status.event.controls,player=_status.event.player,target=_status.event.getParent().target,att=get.attitude(player,target); + if(Math.abs(att)>1) att=Math.sign(att)*Math.sqrt(Math.abs(att)); + let list=controls.map(i=>{ + return [i,att*lib.skill.yijin.getValue(player,i,target)]; + }); list.sort((a,b)=>b[1]-a[1]); if(list.length) return list[0][0]; return controls.randomGet(); @@ -4739,7 +4919,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xingtu:{ trigger:{player:'useCard'}, filter:function(event,player){ - var num1=get.number(event.card),num2=player.storage.xingtu; + var evt=lib.skill.dcjianying.getLastUsed(player,event); + if(!evt||!evt.card) return false; + var num1=get.number(event.card),num2=get.number(evt.card); return typeof num1=='number'&&typeof num2=='number'&&num2%num1==0; }, forced:true, @@ -4748,29 +4930,73 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mod:{ cardUsable:function(card,player){ - var num1=get.number(card),num2=player.storage.xingtu; - if(typeof num1=='number'&&typeof num2=='number'&&num1%num2==0) return Infinity; + if(typeof card=='object'){ + var evt=lib.skill.dcjianying.getLastUsed(player); + if(!evt||!evt.card) return; + var num1=get.number(card),num2=get.number(evt.card); + if(typeof num1=='number'&&typeof num2=='number'&&num1%num2==0) return Infinity; + } }, aiOrder:function(player,card,num){ - var num1=get.number(card),num2=player.storage.xingtu; - if(typeof num1=='number'&&typeof num2=='number'&&num2%num1==0) return num+5; + if(typeof card=='object'){ + var evt=lib.skill.dcjianying.getLastUsed(player); + if(!evt||!evt.card) return; + var num1=get.number(card),num2=num2=get.number(evt.card); + if(typeof num1=='number'&&typeof num2=='number'&&num2%num1==0) return num+5; + } }, }, - group:'xingtu_record', - intro:{ - content:'当前记录:X=#', + init:function(player){ + player.addSkill('xingtu_mark'); + var history=player.getAllHistory('useCard'); + if(history.length){ + var trigger=history[history.length-1],num=get.number(trigger.card); + player.storage.xingtu_mark=num; + player[typeof num!='number'?'unmarkSkill':'markSkill']('xingtu_mark'); + } + }, + onremove:function(player){ + player.removeSkill('xingtu_mark'); + player.removeGaintag('xingtu1'); + player.removeGaintag('xingtu2'); + delete player.storage.xingtu_mark; }, subSkill:{ - record:{ - trigger:{player:'useCardAfter'}, - forced:true, - filter:function(event,player){ - return typeof get.number(event.card)=='number'; + mark:{ + charlotte:true, + trigger:{ + player:['useCard1','gainAfter'], + global:'loseAsyncAfter', }, + filter:function(event,player,name){ + if(!player.countCards('h')) return false; + return name=='useCard1'||event.getg(player).length; + }, + direct:true, + firstDo:true, content:function(){ - player.storage.xingtu=get.number(trigger.card); - player.markSkill('xingtu'); + 'step 0' + player.removeGaintag('xingtu1'); + player.removeGaintag('xingtu2'); + if(event.triggername=='useCard1'){ + var num=get.number(trigger.card,player); + player.storage.xingtu_mark=num; + player[typeof num!='number'?'unmarkSkill':'markSkill']('xingtu_mark'); + if(typeof num!='number') event.finish(); + } + 'step 1' + var cards1=[],cards2=[],num=player.storage.xingtu_mark; + player.getCards('h').forEach(card=>{ + var numx=get.number(card,player); + if(typeof numx=='number'){ + if(numx%num==0) cards1.push(card); + if(num%numx==0) cards2.push(card); + } + }); + player.addGaintag(cards1,'xingtu1'); + player.addGaintag(cards2,'xingtu2'); }, + intro:{content:'上一张牌的点数:#'}, }, }, }, @@ -4784,7 +5010,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){ selectCard:[2,Infinity], check:function(card){ if(ui.selected.cards.length>1) return 0; - return 4-get.value(card); + var player=_status.event.player; + if(player.hasSkill('xingtu')&&player.storage.xingtu){ + var cards=player.getCards('he'); + var num=player.storage.xingtu,stop=false; + for(var i=0;i<=cards.length;i++){ + if(i!=cards.length){ + var num1=get.number(cards[i],player); + if(typeof num1!='number') continue; + for(var j=0;j0; + return (player.storage.mobileyanzhu?player.maxHp:player.hp)>0; }, direct:true, content:function(){ @@ -4895,7 +5146,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 3' if(event.current&&event.current.countCards('he')){ - if(player.storage.mobileyanzhu||event.targets2.length==1) event.current.chooseCard('选择一张牌置于牌堆顶','he',true); + if(!player.storage.mobileyanzhu||event.targets2.length==1) event.current.chooseCard('选择一张牌置于牌堆顶','he',true); else event.current.chooseCardTarget({ prompt:'将一张牌置于牌堆顶,或交给其他目标角色', filterCard:true, @@ -4963,7 +5214,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.removeSkill('mobileyanzhu'); player.storage.mobileyanzhu=true; player.popup('兴学'); - game.log(player,'修改了技能','【兴学】'); + game.log(player,'修改了技能','#g【兴学】'); } else{ player.gainPlayerCard(target,true,'hej'); @@ -6602,8 +6853,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addToExpansion(result.cards,player,'give').gaintag.add('quanji'); } "step 4" - if(event.count>0&&player.hasSkill('requanji')){ - player.chooseBool(get.prompt2('requanji')).set('frequentSkill','requanji'); + if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ + player.chooseBool(get.prompt2('requanji')).set('frequentSkill',event.name); } else event.finish(); "step 5" @@ -8935,6 +9186,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ skillAnimation:true, animationColor:'thunder', prompt2:'(限定技)失去技能【劝封】,并获得该角色武将牌上的所有技能,然后加1点体力上限并回复1点体力', + check:(event,player)=>{ + if(event.player.getStockSkills('仲村由理','天下第一').filter(skill=>{ + let info=get.info(skill); + return info&&!info.hiddenSkill&&!info.zhuSkill&&!info.charlotte; + }).some(i=>{ + let info=get.info(i); + if(info&&info.ai) return info.ai.neg||info.ai.halfneg; + })) return false; + return true; + }, content:function(){ player.awakenSkill('requanfeng'); player.removeSkill('hongyi'); @@ -11097,18 +11358,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 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; + player:(player,target)=>{ + let hs=player.getCards('h').sort(function(a,b){ + return get.number(b)-get.number(a); }); - 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; + if(!hs.length) return 0; + let a=get.number(hs[0]),b=4; + if(player.getDamagedHp()) b=2; + return -b*(1-Math.pow((a-1)/13,target.countCards('h'))); }, + target:(player,target)=>{ + if(target.skipList.includes('phaseDraw')||target.hasSkill('pingkou')||target.hasSkill('xinpingkou')) return 0; + let hs=player.getCards('h').sort(function(a,b){ + return get.number(b)-get.number(a); + }); + if(!hs.length) return 0; + return -Math.pow((get.number(hs[0])-1)/13,target.countCards('h'))*2; + } }, }, }, @@ -11226,10 +11492,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseTarget(get.prompt('zhongzuo'),'令一名角色摸两张牌。若其已受伤,则你摸一张牌。').set('ai',function(target){ - if(target.hasSkillTag('nogain')&&target!=_status.currentPhase) return target.isDamaged()?0:1; - var att=get.attitude(_status.event.player,target); - if(target.isDamaged()) att=att*1.2; - return att; + if(target.hasSkillTag('nogain')) return target.isDamaged()?0:1; + let att=get.attitude(_status.event.player,target); + if(att<=0) return 0; + if(target.isDamaged()) return 1+att/5; + return att/5; }); 'step 1' if(result.bool){ @@ -12543,7 +12810,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 3' if(result.bool){ trigger.player.gain(event.card,'give',player,'bySelf'); - player.chooseBool('是否对'+get.translation(trigger.player)+'造成一点伤害?').ai=function(){ + player.chooseBool('是否对'+get.translation(trigger.player)+'造成1点伤害?').ai=function(){ return get.damageEffect(trigger.player,player,player)>0 }; } @@ -12665,8 +12932,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.draw(); event.count--; "step 2" - if(event.count){ - player.chooseBool(get.prompt2('mingzhe')).set('frequentSkill',event.name); + if(event.count&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ + player.chooseBool(get.prompt2('mingzhe')).set('frequentSkill',event.name); } else event.finish(); "step 3" @@ -12798,7 +13065,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target){ - if(target.hasSkillTag('unequip2')) return; + if(typeof card!=='object'||target.hasSkillTag('unequip2')) return; if(player.hasSkillTag('unequip',false,{ name:card?card.name:null, target:player, @@ -12808,7 +13075,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target:player, card:card })) return; - if(card.name=='sha'&&['spade','club','heart'].contains(get.suit(card))) return 'zerotarget'; + if(card.name=='sha'&&['spade','club','heart'].contains(get.suit(card))) return 'zeroplayertarget'; }, }, }, @@ -12889,7 +13156,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.ingame=game.hasPlayer(function(current){ return ['re_xushu','xin_xushu','xushu','dc_xushu'].contains(current.name)||['re_xushu','xin_xushu','xushu','dc_xushu'].contains(current.name2); })?true:false; - var prompt='请选择一名角色,令其回复一点体力并摸一张牌'; + var prompt='请选择一名角色,令其回复1点体力并摸一张牌'; prompt+=event.ingame?',然后你摸一张牌。':'。'; player.chooseTarget(prompt).set('ai',function(target){ var player=_status.event.player; @@ -14567,6 +14834,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, gnjinfan_gain:{ + audio:'gnjinfan', trigger:{player:'loseAfter'}, forced:true, filter:function(event,player){ @@ -15272,9 +15540,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_gaoshun_prefix:'手杀界', peixiu:'裴秀', xingtu:'行图', - xingtu_info:'锁定技。①当你使用有点数的牌结算结束后,你将此牌点数记录为X。②当你使用牌时,若X÷Y的余数为0,则你摸一张牌(Y为此牌的点数)。③你使用Y÷X的余数为0的牌无次数限制(Y为此牌的点数)。', + xingtu1:'倍数', + xingtu2:'约数', + xingtu_info:'锁定技。你使用点数为X的倍数的牌无次数限制,你使用点数为X的约数的牌时摸一张牌(X为你本局游戏使用的上一张牌的点数)。', juezhi:'爵制', - juezhi_info:'出牌阶段,你可以弃置至少两张牌,然后从牌堆中获得一张点数为X的牌(X为这些牌的点数和除以13后的余数,且当余数为0时X为13)。', + juezhi_info:'出牌阶段,你可以弃置至少两张牌,然后从牌堆中获得一张点数为Y的牌(Y为这些牌的点数和对13取余,余数为0时Y取13)。', sp_jianggan:'手杀蒋干', sp_jianggan_prefix:'手杀', spdaoshu:'盗书', @@ -15453,9 +15723,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yj_zhoubuyi:'☆周不疑', yj_zhoubuyi_prefix:'☆', mbhuiyao:'慧夭', - mbhuiyao_info:'出牌阶段限一次。你可以受到1点无来源伤害,视为对一名其他角色造成过1点伤害。', + mbhuiyao_info:'出牌阶段限一次。你可以受到1点无来源伤害,然后你选择一名其他角色,令其视为对另一名角色造成过1点伤害。', mbquesong:'雀颂', - mbquesong_info:'一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸等同于其装备区中空栏的数量的牌并复原武将牌;2.弃置等同于其体力值的手牌并回复1点体力。', + mbquesong_info:'一名角色的结束阶段,若你于本回合受到过伤害,你可以令一名角色选择一项:1.摸X张牌并复原武将牌(X为3,若其装备区非宝物牌牌数不小于三张则X为2);2.回复1点体力。', xin_yuanshao:'手杀界袁绍', xin_yuanshao_prefix:'手杀界', re_baosanniang:'手杀鲍三娘', @@ -15499,7 +15769,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liwei:'李遗', jiaohua:'教化', jiaohua_backup:'教化', - jiaohua_info:'出牌阶段限三次,你可以选择一个未被〖教化〗记录过的牌的类型,令一名角色从牌堆中获得一张此类型的牌,然后记录此类型,若基本、锦囊、装备均已被你发动〖教化〗记录,则你清空〖教化〗记录。', + jiaohua_info:'出牌阶段限两次,你可以选择一个未被〖教化〗记录过的牌的类型,令一名角色从牌堆中获得一张此类型的牌,然后记录此类型,若基本、锦囊、装备均已被你发动〖教化〗记录,则你清空〖教化〗记录。', laimin:'来敏', laishou:'来寿', laishou_info:'锁定技。①当你受到伤害值大于等于你的体力值的伤害时,若你的体力上限小于9,你防止此伤害并增加等量体力上限。②准备阶段,若你的体力上限不小于9,你死亡。', @@ -15521,6 +15791,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yanxiang:'阎象', kujian:'苦谏', kujian_info:'出牌阶段限一次,你可以将至多两张手牌称为“谏”并交给一名其他角色,然后你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸两张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。', + mb_xianglang:'手杀向朗', + mb_xianglang_prefix:'手杀', + naxue:'纳学', + naxue_info:'你可以跳过出牌阶段。若如此做,你可以弃置任意张牌并摸等量的牌,然后你可以交给至多两名其他角色各一张手牌。', + yijie:'遗诫', + yijie_info:'锁定技。当你死亡时,你令所有其他角色将体力回复或失去至X(X为所有其他角色的体力之和除以所有其他角色数,向下取整,且X至少为1)。', mobile_standard:'手杀异构·标准包', mobile_shenhua_feng:'手杀异构·其疾如风', diff --git a/character/offline.js b/character/offline.js index ffc9fc00c..bb48350bc 100644 --- a/character/offline.js +++ b/character/offline.js @@ -614,8 +614,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ var event=_status.event,evt=event; if(event._backup) evt=event._backup; - var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); - var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); + var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); + var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); if(equip3.length&&equip3.some(card=>evt.filterCard(get.autoViewAs({ name:'shan', storage:{psshouli:true}, @@ -630,7 +630,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return game.hasPlayer(function(current){ return evt.filterTarget(sha,player,current); }) - }; + } }) }, prompt:'将场上的一张坐骑牌当做【杀】或【闪】使用或打出', @@ -639,8 +639,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=event.getParent(2); evt.set('psshouli',true); var list=[]; - var equip3=target.getCards('e',card=>get.subtype(card,false)=='equip3'); - var equip4=target.getCards('e',card=>get.subtype(card,false)=='equip4'); + var equip3=target.getCards('e',card=>get.is.defendingMount(card,false)); + var equip4=target.getCards('e',card=>get.is.attackingMount(card,false)); var backupx=_status.event; _status.event=evt; try{ @@ -665,8 +665,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; })){ list.push('sha'); - }; - }catch(e){game.print(e)}; + } + }catch(e){game.print(e)} _status.event=backupx; if(list.length==1){ event.cardName=list[0]; @@ -680,13 +680,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('cards',cards) } else player.choosePlayerCard(true,target,'e').set('filterButton',function(button){ - var type=get.subtype(button.link); - return type=='equip3'||type=='equip4'; + var card=button.link; + return get.is.attackingMount(card)||get.is.defendingMount(card); }); 'step 1' var evt=event.getParent(2); if(result.bool&&result.links&&result.links.length){ - var name=(event.cardName||(get.subtype(result.links[0])=='equip4'?'sha':'shan')); + var name=(event.cardName||(get.is.attackingMount(result.links[0])?'sha':'shan')); if(evt.name=='chooseToUse'){ game.broadcastAll(function(result,name){ lib.skill.psshouli_backup.viewAs={ @@ -728,9 +728,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ respondSha:true, respondShan:true, skillTagFilter:function(player,tag){ - var subtype=(tag=='respondSha'?'equip4':'equip3'); + var func=get.is[tag=='respondSha'?'attackingMount':'defendingMount']; return game.hasPlayer(function(current){ - return current.getEquip(subtype); + return current.hasCard(card=>func(card,false),'e'); }); }, order:2, @@ -949,7 +949,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target){ - if(card.name==='sha'&&!game.hasNature(card)&&target.hasEmptySlot(2)) return 'zeroplayertarget'; + if(card.name==='sha'&&game.hasNature(card)&&target.hasEmptySlot(2)) return 'zeroplayertarget'; if(get.subtype(card)=='equip2'&&target.isEmpty(2)) return [0.6,-0.8]; } } @@ -1533,7 +1533,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addToExpansion(result.cards[0],'give',player).gaintag.add('psshiyin'); var card=player.getExpansions('psshiyin')[0]; if(card) player.gain(card,'gain2'); - }; + } }, } } @@ -1654,7 +1654,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(card.name=='du') addi-=5; if(get.color(card)=='black') addi-=6; if(player==event.player){ - if(Boolean(event.small)){ + if(event.small){ return -getn(card)-get.value(card)/2+addi; } return getn(card)-get.value(card)/2+addi; @@ -2670,9 +2670,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return '没有“戮”'; } }, - content:function(storage,player){ - return '共有'+get.cnNumber(storage.length)+'张“戮”'; - }, + // content:function(storage,player){ + // return '共有'+get.cnNumber(storage.length)+'张“戮”'; + // }, }, group:'zyshilu_zhiheng', subSkill:{ @@ -4096,7 +4096,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ list.push(['基本','','sha']); } for(var i of lib.inpile_nature){ - if(lib.filter.cardUsable({name:'sha',nature:i},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ + if(lib.filter.cardUsable({name:'sha',nature:i},player,event.getParent('chooseToUse'))&&game.hasPlayer(function(current){ return player.canUse({name:'sha',nature:i},current); })){ list.push(['基本','','sha',i]); @@ -4593,15 +4593,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 4' if(cards.length) player.gain(cards,'gain2','log'); 'step 5' - if(event.count>0&&player.hasSkill('spyinzhi')){ - player.chooseBool(get.prompt2('spyinzhi')).set('frequentSkill','spyinzhi'); + if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ + player.chooseBool(get.prompt2('spyinzhi')).set('frequentSkill',event.name); } else event.finish(); 'step 6' if(result.bool){ player.logSkill('spyinzhi'); event.goto(1); - }; + } }, }, spmingjian:{ @@ -4836,7 +4836,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.chooseButton([get.prompt('sphantong'),player.storage.sphantong],function(button){return -1}); + player.chooseButton([get.prompt('sphantong'),player.storage.sphantong],function(button){ + var player=_status.event.player; + if(_status.currentPhase==player){ + //血裔 + if((player.hasJudge('lebu')||player.skipList.includes('phaseUse'))&&game.hasPlayer(function(current){ + return current!=player&¤t.group=='qun'; + })) return 1; + //激将 + if(!player.hasJudge('lebu')&&!player.skipList.includes('phaseUse')&&game.hasPlayer(function(current){ + return current!=player&¤t.group=='shu'&¤t.hasSha()&&get.attitude(player,current)>0&&get.attitude(current,player)>0; + })&&game.hasPlayer(function(target){ + return player.canUse({name:'sha'},target)&&get.effect(target,{name:'sha'},player,player)>0; + })) return 1; + } + //护驾 + else if(!player.hasShan()&&game.hasPlayer(function(current){ + return current!=player&¤t.group=='wei'&¤t.mayHaveShan()&&get.attitude(player,current)>0&&get.attitude(current,player)>0; + })) return 1; + return -1; + }); 'step 1' if(result.bool){ player.logSkill('sphantong'); @@ -4848,31 +4867,41 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.cardsDiscard(card); var list=['hujia','jijiang','jiuyuan','xueyi']; for(var i=0;i0&&get.attitude(current,player)>0; + })&&game.hasPlayer(function(target){ + return player.canUse({name:'sha'},target)&&get.effect(target,{name:'sha'},player,player)>0; + })) return 'jijiang'; + } + //护驾 + else if(!player.hasShan()&&game.hasPlayer(function(current){ + return current!=player&¤t.group=='wei'&¤t.mayHaveShan()&&get.attitude(player,current)>0&&get.attitude(current,player)>0; + })) return 'hujia'; + }); } - if(list.length>0) player.chooseControl(list).set('prompt','选择获得以下技能中的一个'); else event.finish(); } else event.finish(); 'step 2' var skill=result.control; player.addTempSkill(skill); - if(!player.storage.zhuSkill_sphantong) player.storage.zhuSkill_sphantong=[]; - player.storage.zhuSkill_sphantong.add(skill); player.popup(skill,'wood'); game.log(player,'获得了技能','#g【'+get.translation(skill)+'】'); - var next=game.createEvent('sphantong_clear',false); - event.next.remove(next); - trigger.after.push(next); - next.player=player; - next.skill=skill; - next.setContent(function(){ - if(player.storage.zhuSkill_sphantong) player.storage.zhuSkill_sphantong.remove(event.skill); - }) }, }, sphuangen:{ - trigger:{global:'useCardToPlayered'}, + trigger:{global:'useCardToPlayered'}, filter:function(event,player){ if(!event.isFirstTarget) return false; if(get.type(event.card)!='trick') return false; @@ -5436,7 +5465,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', filterCard:{suit:'diamond'}, - filterTarget:true, + filterTarget:function(card,player,target){ + return target.canAddJudge({name:'yanxiao_card'}); + }, check:function(card){ return 7-get.value(card); }, diff --git a/character/old.js b/character/old.js index c03f2c07a..4d2eb8b0f 100755 --- a/character/old.js +++ b/character/old.js @@ -411,12 +411,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'jiefan', enable:'chooseToUse', filter:function(event,player){ - return event.type=='dying'&&_status.currentPhase&&_status.currentPhase.isIn()&&!event.oldjiefan; + return event.type=='dying'&&_status.currentPhase&&_status.currentPhase.isIn(); }, direct:true, content:function(){ - 'step 0' - if(_status.connectMode) game.broadcastAll(function(){_status.noclearcountdown=true}); player.chooseToUse(function(card,player,event){ if(get.name(card)!='sha') return false; return lib.filter.filterCard.apply(this,arguments); @@ -425,13 +423,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return lib.filter.filterTarget.apply(this,arguments); }).set('logSkill','oldjiefan').set('oncard',function(){ _status.event.player.addTempSkill('oldjiefan_recover'); + }).set('custom',{ + add:{}, + replace:{ + window:()=>{ + ui.click.cancel(); + } + }, }); - 'step 1' - if(!result.bool){ - var evt=event.getParent(2); - evt.oldjiefan=true; - evt.goto(0); - } }, ai:{ save:true, @@ -440,7 +439,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ recover:{ - audio:'jiefan', + // audio:'jiefan', trigger:{source:'damageBegin2'}, filter:function(event,player){ return event.getParent(4).name=='oldjiefan'; @@ -520,7 +519,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, old_guhuo:{ audio:2, - group:['old_guhuo_guess'], enable:['chooseToUse','chooseToRespond'], hiddenCard:function(player,name){ return (lib.inpile.contains(name)&&player.countCards('hs')>0); @@ -636,6 +634,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, precontent:function(){ player.logSkill('old_guhuo'); + player.addTempSkill('old_guhuo_guess'); var card=event.result.cards[0]; event.result.card.suit=get.suit(card); event.result.card.number=get.number(card); diff --git a/character/rank.js b/character/rank.js index 09b861aa5..d6b6dc98d 100644 --- a/character/rank.js +++ b/character/rank.js @@ -124,6 +124,8 @@ window.noname_character_rank={ 'db_key_liyingxia', 'key_kiyu', 'jsrg_pangtong', + 'star_caoren', + 'clan_xunyou', ], a:[ 'diy_zaozhirenjun', @@ -339,6 +341,13 @@ window.noname_character_rank={ 'key_kotarou', 'key_kyou', 'key_tomoyo', + 'star_yuanshu', + 'jiangji', + 'tianshangyi', + 'malingli', + 'caoyi', + 'sb_sp_zhugeliang', + 'sb_zhugeliang', ], am:[ 'diy_caiwenji', @@ -618,6 +627,19 @@ window.noname_character_rank={ 'jsrg_xiahourong', 'jsrg_sunshangxiang', 'jsrg_machao', + 'sunyu', + 're_caorui', + 're_zhugedan', + 'tw_yanxiang', + 'yanxiang', + 'nezha', + 'dc_jiachong', + 'pangshanmin', + 'kuaiqi', + 'shen_huatuo', + 'dc_guansuo', + 'dc_dongzhao', + 'zhugeruoxue', ], bp:[ 'chess_diaochan', @@ -976,6 +998,16 @@ window.noname_character_rank={ 'zhangyan', 'jsrg_huangzhong', 'jsrg_zhangchu', + 'ol_dingshangwan', + 'ol_liwan', + 'chengjichengcui', + 'xin_zhangliang', + 'liwei', + 'xin_wuban', + 'ol_liuyan', + 'sunhuan', + 'yue_caiyong', + 'sb_huangyueying', ], b:[ 'diy_feishi', @@ -1283,6 +1315,12 @@ window.noname_character_rank={ 'feiyao', 'jsrg_xiahouen', 'old_shen_zhaoyun', + 'sb_qiaoxiao', + 're_simalang', + 'laimin', + 'baoxin', + 'mb_xianglang', + 'lvboshe', ], bm:[ 'diy_xizhenxihong', @@ -1475,6 +1513,7 @@ window.noname_character_rank={ 'huanfan', 'jsrg_xugong', 'old_xiaoqiao', + 'old_guanyu', ], c:[ 'xiahoudun', @@ -1538,6 +1577,7 @@ window.noname_character_rank={ 'ol_huban', 'sb_menghuo', 'old_caocao', + 'sb_yl_luzhi', ], d:[ 'lvmeng', @@ -1762,6 +1802,8 @@ window.noname_character_rank={ 'ol_wanglang', 'xin_guozhao', 'shichangshi', + 'dc_guansuo', + 'dc_xujing', ], epic:[ 'ol_pengyang', @@ -2023,6 +2065,11 @@ window.noname_character_rank={ 'key_kotomi', 'db_key_liyingxia', 'key_iriya', + 'star_caoren', + 'star_yuanshu', + 'clan_xunyou', + 'lvboshe', + 'yj_zhoubuyi', ], rare:[ 'luoxian', @@ -2486,6 +2533,8 @@ window.noname_character_rank={ 'ol_wenqin', 'clan_wanghun', 'yue_zhoufei', + 'ol_dingshangwan', + 'ol_liwan', ], junk:[ 'sunshao', diff --git a/character/refresh.js b/character/refresh.js index 2998b3e37..98cb6c6ad 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -20,13 +20,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, connect:true, character:{ + ol_jianyong:['male','shu',3,['olqiaoshui','jyzongshi'],['unseen']], + ol_lingtong:['male','wu',4,['olxuanfeng'],['die_audio:re_lingtong','unseen']], re_xushu:['male','shu',4,['zhuhai','qianxin']], re_lidian:['male','wei',3,['xunxun','xinwangxi']], re_zhongyao:['male','wei',3,['rehuomo','zuoding'],['clan:颍川钟氏']], - xin_zhangliang:['male','qun',4,['rejijun','refangtong'],['unseen']], - re_simalang:['male','wei',3,['requji','rejunbing'],['unseen']], - re_zhugedan:['male','wei',4,['regongao','rejuyi'],['unseen']], - re_caorui:['male','wei',3,['huituo','mingjian','rexingshuai'],['unseen','zhu']], + xin_zhangliang:['male','qun',4,['rejijun','refangtong']], + re_simalang:['male','wei',3,['requji','rejunbing']], + re_zhugedan:['male','wei',4,['regongao','rejuyi']], + re_caorui:['male','wei',3,['huituo','remingjian','rexingshuai'],['zhu']], re_caochong:['male','wei',3,['rechengxiang','renxin']], ol_zhangzhang:['male','wu',3,['olzhijian','olguzheng']], re_jsp_huangyueying:['female','qun',3,['rejiqiao','relinglong']], @@ -169,11 +171,39 @@ game.import('character',function(lib,game,ui,get,ai,_status){ re_guohuai:['xiahouyuan','zhanghe'], }, skill:{ + //界简雍 + olqiaoshui:{ + audio:2, + inherit:'reqiaoshui', + filter:function(event,player){ + return player.countCards('h')>0&&!player.hasSkill('olqiaoshui_used'); + }, + content:function(){ + 'step 0' + player.chooseToCompare(target); + 'step 1' + if(result.bool) player.addTempSkill('qiaoshui3',{player:'phaseUseAfter'}); + else{ + player.addTempSkill('qiaoshui2'); + player.addTempSkill('olqiaoshui_used'); + } + }, + subSkill:{ + used:{ + charlotte:true, + mark:true, + marktext:'', + intro:{content:'被迫闭嘴'}, + }, + }, + }, //界凌统 olxuanfeng:{ - audio:2, + audio:'xuanfeng', + audioname:['boss_lvbu3'], audioname2:{ lingtong:'xuanfeng', + ol_lingtong:'xuanfeng_re_lingtong', }, trigger:{ player:['loseAfter'], @@ -219,6 +249,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ noe:true }, }, + xuanfeng_re_lingtong:{audio:2}, ollianhuan:{ audio:'xinlianhuan', audioname:['ol_pangtong'], @@ -331,10 +362,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ switch(button.link[2]){ case 'tao':return 5; case 'jiu':return 3.01; - case 'shan':return 3.01; case 'sha': if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='fire') return 2.92; + else if(button.link[3]=='thunder') return 2.92; else return 2.9; case 'shan':return 1; } @@ -622,6 +652,63 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, //堪比界曹冲的界曹叡 + remingjian:{ + inherit:'mingjian', + content:function(){ + player.give(cards,target); + target.addTempSkill('remingjian_buff',{player:'phaseAfter'}); + if(!target.storage.remingjian_buff) target.storage.remingjian_buff=[]; + target.storage.remingjian_buff.push(player); + target.markSkill('remingjian_buff'); + }, + subSkill:{ + buff:{ + charlotte:true, + mark:true, + marktext:'鉴', + intro:{ + content:(storage,player)=>{ + const num=storage.length; + return `
  • 被${get.translation(storage.toUniqued())}鉴识
  • 手牌上限+${num},出杀次数+${num}`; + }, + }, + onremove:true, + trigger:{ + source:'damageSource', + }, + filter:function(event,player){ + if(_status.currentPhase!=player) return false; + return player.getHistory('sourceDamage').indexOf(event)==0&&player.getStorage('remingjian_buff').some(i=>i.isIn()); + }, + content:function*(event,map){ + const player=map.player; + const masters=player.getStorage('remingjian_buff').filter(i=>i.isIn()).toUniqued().sortBySeat(_status.currentPhase); + while(masters.length){ + const master=masters.shift(); + if(!master.isIn()) continue; + const result=yield player.chooseBool(`是否令${get.translation(master)}发动一次〖恢拓〗?`).set('choice',get.attitude(player,master)>0); + if(!result.bool) continue; + if(!player.isUnderControl(true)&&!event.isOnline()) game.delayx(); + player.logSkill('remingjian_buff',master); + const next=game.createEvent('huituo'); + next.setContent(lib.skill.huituo.content); + next.player=master; + next.forced=true; + next._trigger=map.trigger; + yield next; + } + }, + mod:{ + maxHandcard:function(player,num){ + return num+player.getStorage('remingjian_buff').length; + }, + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.getStorage('remingjian_buff').length; + } + }, + } + }, + }, rexingshuai:{ audio:2, skillAnimation:true, @@ -1152,8 +1239,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseToDiscard('he',get.prompt('olshuangxiong'),'弃置一张牌,然后你本回合内可以将一张与此牌颜色不同的牌当做【决斗】使用').set('ai',function(card){ - if(!_status.event.goon) return 0.01-get.value(card); - var player=_status.event.player,color=get.color(card),effect=0,cards=player.getCards('hes'),sha=false; + let player=_status.event.player; + if(!_status.event.goon||player.skipList.includes('phaseUse')) return -get.value(card); + let color=get.color(card),effect=0,cards=player.getCards('hes'),sha=false; for(var cardx of cards){ if(cardx==card||get.color(cardx)==color) continue; var cardy=get.autoViewAs({name:'juedou'},[cardx]),eff1=player.getUseValue(cardy); @@ -1195,7 +1283,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var color=get.color(card),colors=player.getStorage('olshuangxiong_effect'); for(var i of colors){ if(color!=i) return true; - }; + } return false; }, prompt:function(){ @@ -2305,7 +2393,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return current!=player; }).sortBySeat(target); for(var target of players){ - if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue}; + if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue} var shao=false; num++; if(target.countCards('he',function(card){ @@ -2853,7 +2941,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, nokeep:true, skillTagFilter:function(player,tag,arg){ - if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&player.countSkill('rezhanjue_draw')<3&&player.hasCard((card)=>get.name(card)!='tao'&&!card.hasGaintag('reqinwang'),'h'); + if(tag==='nokeep') return (!arg||arg.card&&get.name(arg.card)==='tao')&&player.isPhaseUsing()&&player.countSkill('rezhanjue_draw')<3&&player.hasCard((card)=>{ + return get.name(card)!=='tao'&&!card.hasGaintag('reqinwang'); + },'h'); } }, }, @@ -3171,7 +3261,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, audio:2, check:function(event,player){ - return player.getHistory('damage').indexOf(event)==0; + return player.getHistory('damage').indexOf(event)==0; }, filter:function(event,player){ var index=player.getHistory('damage').indexOf(event); @@ -3851,6 +3941,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.loseMaxHp(); player.addSkill('rejianyan'); }, + derivation:'rejianyan', }, rejianyan:{ audio:2, @@ -4416,6 +4507,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.countMark('redanxin')<2) player.addMark('redanxin',1,false); }, intro:{content:'当前升级等级。:Lv#'}, + ai:{ + maixie:true, + effect:{ + target:(card,player,target)=>{ + if(!get.tag(card,'damage')) return; + if(target.hp<2&&target.countCards('hs')<3||player.hasSkillTag('jueqing',false,target)) return -2; + if(target.countMark('redanxin')>1) return [1,1]; + return [1,Math.min(3.2,0.8*target.hp)]; + } + } + } }, //马岱 reqianxi:{ @@ -4501,7 +4603,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ locked:false, enable:'chooseToUse', filterCard:function(card){ - return (get.type2(card)!='trick'&&get.color(card)=='black'); + return (get.type2(card)!='trick'&&get.color(card)=='black'); }, filter:function(event,player){ return player.hasCard((card)=>(get.type2(card)!='trick'&&get.color(card)=='black'),'hes'); @@ -5211,7 +5313,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //贾诩 rewansha:{ audio:'wansha', - audioname:['re_jiaxu','shen_simayi','boss_lvbu2'], + audioname:['re_jiaxu','shen_simayi','boss_lvbu3'], global:'rewansha_global', trigger:{global:'dyingBegin'}, forced:true, @@ -5454,10 +5556,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinquanji:{ audio:2, trigger:{ - global:'gainAfter', - player:['damageEnd','loseAsyncAfter'], + player:['damageEnd'], + global:['gainAfter','loseAsyncAfter'], }, - frequent:true, filter:function(event,player){ if(event.name=='damage') return true; if(event.name=='loseAsync'){ @@ -5477,6 +5578,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=event.getl(player); return evt&&evt.cards2&&evt.cards2.length>0; }, + frequent:true, content:function(){ 'step 0' event.count=(trigger.name=='damage'?trigger.num:1); @@ -5495,8 +5597,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addToExpansion(result.cards,'giveAuto',player).gaintag.add('xinquanji'); } 'step 4' - if(event.count>0&&player.hasSkill('xinquanji')){ - player.chooseBool(get.prompt2('xinquanji')).set('frequentSkill','xinquanji'); + if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ + player.chooseBool(get.prompt2('xinquanji')).set('frequentSkill',event.name); } else event.finish(); 'step 5' @@ -5591,7 +5693,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, select:2, filter:function(button,player){ - if(ui.selected.buttons.length) return (typeof ui.selected.buttons[0].link)!=(typeof button.link) + if(typeof button.link=='number'&&player.hasSkill('xinpaiyi_'+button.link)) return false; + if(ui.selected.buttons.length) return (typeof ui.selected.buttons[0].link)!=(typeof button.link); return true; }, backup:function(links){ @@ -5802,6 +5905,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ relongyin:{ audio:2, shaRelated:true, + init:(player)=>{ + game.addGlobalSkill('relongyin_order'); + }, + onremove:(player)=>{ + game.removeGlobalSkill('relongyin_order'); + }, trigger:{global:'useCard'}, direct:true, filter:function(event,player){ @@ -5874,6 +5983,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ expose:0.2 + }, + subSkill:{ + order:{ + mod:{ + aiOrder:(player,card,num)=>{ + if(num&&card.name==='sha'&&get.color(card)==='red'){ + let gp=game.findPlayer(current=>{ + return current.hasSkill('relongyin')&¤t.hasCard(i=>true,'he'); + }); + if(gp) return num+0.15*Math.sign(get.attitude(player,gp)); + } + } + }, + trigger:{player:'dieAfter'}, + filter:(event,player)=>{ + return !game.hasPlayer(current=>current.hasSkill('relongyin')); + }, + silent:true, + forceDie:true, + charlotte:true, + content:()=>{ + game.removeGlobalSkill('relongyin_order'); + } + } } }, jiezhong:{ @@ -6418,7 +6551,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, enable:'phaseUse', usable:1, - position:'hs', viewAs:{ name:'sha', changbiao:true, @@ -7373,7 +7505,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!lib.skill.yongjin.filter(null,player,cards)){ event.finish(); return; - }; + } var next=player.chooseTarget(2,function(card,player,target){ if(ui.selected.targets.length){ var from=ui.selected.targets[0]; @@ -7655,7 +7787,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return evt&&evt.cards2&&evt.cards2.filter(function(i){ return get.name(i,evt.hs.contains(i)?player:false)=='sha'; }).length>0; - }; + } if(event.name=='gain'&&event.player==player) return false; var evt=event.getl(player); return evt&&evt.cards2&&evt.cards2.length>0; @@ -9468,7 +9600,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:function(player){ if(player.hp<3) return false; var mindist=player.hp; - if(player.countCards('hs',card=>player.canSave(card,player))) mindist++; + if(player.countCards('hs',card=>player.canSaveCard(card,player))) mindist++; if(game.hasPlayer(function(current){ return (get.distance(player,current)<=mindist&& player.canUse('sha',current,false)&& @@ -10358,11 +10490,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, olzhiba3:{}, rehuashen:{ - audio:2, unique:true, + audio:2, + trigger:{ + global:'phaseBefore', + player:['enterGame','phaseBegin','phaseEnd','rehuashen'], + }, + filter:function(event,player,name){ + if(event.name!='phase') return true; + if(name=='phaseBefore') return game.phaseNumber==0; + return player.storage.rehuashen&&player.storage.rehuashen.character.length>0; + }, direct:true, content:function(){ "step 0" + var name=event.triggername; + if(trigger.name!='phase'||(name=='phaseBefore'&&game.phaseNumber==0)){ + player.logSkill('rehuashen'); + lib.skill.rehuashen.addHuashens(player,3); + event.logged=true; + } _status.noclearcountdown=true; event.videoId=lib.status.videoId++; var cards=player.storage.rehuashen.character.slice(0); @@ -10384,16 +10531,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.aiChoice==player.storage.rehuashen.current2||get.skillRank(event.aiChoice,cond)<1) choice='弃置化身'; if(player.isOnline2()){ player.send(function(cards,id){ - var dialog=ui.create.dialog('是否发动【化身】?',[cards,'character']); + var dialog=ui.create.dialog('是否发动【化身】?',[cards,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); dialog.videoId=id; },cards,event.videoId); } - event.dialog=ui.create.dialog(get.prompt('rehuashen'),[cards,'character']); + event.dialog=ui.create.dialog(get.prompt('rehuashen'),[cards,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); event.dialog.videoId=event.videoId; if(!event.isMine()){ event.dialog.style.display='none'; } - if(event.triggername=='rehuashen') event._result={control:'更换技能'}; + if(event.logged) event._result={control:'更换技能'}; else player.chooseControl('弃置化身','更换技能','cancel2').set('ai',function(){ return _status.event.choice; }).set('choice',choice); @@ -10501,10 +10648,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } if(event.control=='弃置化身') return; if(player.storage.rehuashen.current!=event.card){ + const old=player.storage.rehuashen.current; player.storage.rehuashen.current=event.card; - game.broadcastAll(function(player,sex){ - player.sex=sex; - },player,lib.character[event.card][0]); + game.broadcastAll(function(player,character,old){ + player.tempname.remove(old); + player.tempname.add(character); + player.sex=lib.character[event.card][0]; + },player,event.card,old); game.log(player,'将性别变为了','#y'+get.translation(lib.character[event.card][0])+'性'); player.changeGroup(lib.character[event.card][1]); } @@ -10517,6 +10667,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.popup(link); player.syncStorage('rehuashen'); player.updateMarks('rehuashen'); + // lib.skill.rehuashen.createAudio(event.card,link,'re_zuoci'); } }, init:function(player,skill){ @@ -10525,14 +10676,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ map:{}, } }, - group:'rehuashen_init', - trigger:{ - player:['phaseBegin','phaseEnd','rehuashen'], - }, - filter:function(event,player,name){ - return player.storage.rehuashen&&player.storage.rehuashen.character.length>0; - }, - banned:['lisu','sp_xiahoudun','xushao','zhoutai','old_zhoutai','shixie'], + banned:['lisu','sp_xiahoudun','xushao','jsrg_xushao','zhoutai','old_zhoutai','shixie','xin_zhoutai','dc_shixie','old_shixie'], bannedType:['Charlotte','主公技','觉醒技','限定技','隐匿技','使命技'], addHuashen:function(player){ if(!player.storage.rehuashen) return; @@ -10542,7 +10686,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ _status.characterlist.randomSort(); for(let i=0;i<_status.characterlist.length;i++){ let name=_status.characterlist[i]; - if(name.indexOf('zuoci')!=-1||name.indexOf('key_')==0||name.indexOf('sp_key_')==0||lib.skill.rehuashen.banned.includes(name)||player.storage.rehuashen.character.includes(name)) continue; + if(name.indexOf('zuoci')!=-1||name.indexOf('key_')==0||name.indexOf('sp_key_')==0||get.is.double(name)||lib.skill.rehuashen.banned.includes(name)||player.storage.rehuashen.character.includes(name)) continue; let skills=lib.character[name][3].filter(skill=>{ const categories=get.skillCategoriesOf(skill); return !categories.some(type=>lib.skill.rehuashen.bannedType.includes(type)); @@ -10562,7 +10706,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(name) list.push(name); } if(list.length){ - game.log(player,'获得了',get.cnNumber(list.length)+'张','#g化身') + player.syncStorage('rehuashen'); + player.updateMarks('rehuashen'); + game.log(player,'获得了',get.cnNumber(list.length)+'张','#g化身'); lib.skill.rehuashen.drawCharacter(player,list); } }, @@ -10588,6 +10734,91 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } },player,list); }, + $createButton:function(item,type,position,noclick,node){ + node=ui.create.buttonPresets.character(item,'character',position,noclick); + const info=lib.character[item]; + const skills=info[3].filter(function(skill){ + const categories=get.skillCategoriesOf(skill); + return !categories.some(type=>lib.skill.rehuashen.bannedType.includes(type)); + }); + if(skills.length){ + const skillstr=skills.map(i=>`[${get.translation(i)}]`).join('
    '); + const skillnode=ui.create.caption( + `
    ${skillstr}
    `,node); + skillnode.style.left='2px'; + skillnode.style.bottom='2px'; + } + node._customintro=function(uiintro,evt){ + const character=node.link,characterInfo=get.character(node.link); + let capt=get.translation(character); + if(characterInfo){ + capt+=`  ${get.translation(characterInfo[0])}`; + let charactergroup; + const charactergroups=get.is.double(character,true); + if(charactergroups) charactergroup=charactergroups.map(i=>get.translation(i)).join('/'); + else charactergroup=get.translation(characterInfo[1]); + capt+=`  ${charactergroup}`; + } + uiintro.add(capt); + + if(lib.characterTitle[node.link]){ + uiintro.addText(get.colorspan(lib.characterTitle[node.link])); + } + for(let i=0;i
    '+get.translation(skills[i])+'
    '+get.skillInfoTranslation(skills[i])+'
    '); + } + else{ + uiintro.add('
    【'+translation+'】
    '+get.skillInfoTranslation(skills[i])+'
    '); + } + if(lib.translate[skills[i]+'_append']){ + uiintro._place_text=uiintro.add('
    '+lib.translate[skills[i]+'_append']+'
    ') + } + } + } + } + return node; + }, + // createAudio:(character,skillx,name)=>{ + // var skills=game.expandSkills([skillx]); + // skills=skills.filter(skill=>get.info(skill)); + // if(!skills.length) return; + // var skillss=skills.filter(skill=>get.info(skill).derivation); + // if(skillss.length){ + // skillss.forEach(skill=>{ + // var derivationSkill=get.info(skill).derivation; + // skills[Array.isArray(derivationSkill)?'addArray':'add'](derivationSkill); + // }); + // } + // skills.forEach(skill=>{ + // var info=lib.skill[skill]; + // if(info){ + // if(!info.audioname2) info.audioname2={}; + // if(info.audioname&&info.audioname.includes(character)){ + // if(info.audio){ + // if(typeof info.audio=='string') skill=info.audio; + // if(Array.isArray(info.audio)) skill=info.audio[0]; + // } + // if(!lib.skill[skill+'_'+character]) lib.skill[skill+'_'+character]={audio:2}; + // info.audioname2[name]=(skill+'_'+character); + // } + // else if(info.audioname2[character]){ + // info.audioname2[name]=info.audioname2[character]; + // } + // else{ + // if(info.audio){ + // if(typeof info.audio=='string') skill=info.audio; + // if(Array.isArray(info.audio)) skill=info.audio[0]; + // } + // info.audioname2[name]=skill; + // } + // } + // }); + // }, mark:true, intro:{ onunmark:function(storage,player){ @@ -10595,11 +10826,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ storage.character=[]; }, mark:function(dialog,storage,player){ - if(storage&&storage.current) dialog.addSmall([[storage.current],'character']); + if(storage&&storage.current) dialog.addSmall([[storage.current],(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); if(storage&&storage.current2) dialog.add('
    【'+get.translation(lib.translate[storage.current2+'_ab']||get.translation(storage.current2).slice(0,2))+'】
    '+get.skillInfoTranslation(storage.current2,player)+'
    '); if(storage&&storage.character.length){ if(player.isUnderControl(true)){ - dialog.addSmall([storage.character,'character']); + dialog.addSmall([storage.character,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); } else{ dialog.addText('共有'+get.cnNumber(storage.character.length)+'张“化身”'); @@ -10618,36 +10849,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, - rehuashen_init:{ - trigger:{ - global:'phaseBefore', - player:'enterGame', - }, - forced:true, - popup:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); - }, - content:function(){ - lib.skill.rehuashen.addHuashens(player,3); - player.syncStorage('rehuashen'); - player.markSkill('rehuashen'); - var next=game.createEvent('rehuashen'); - next.player=player; - next._trigger=trigger; - next.triggername='rehuashen'; - next.setContent(lib.skill.rehuashen.content); - }, - }, rexinsheng:{ unique:true, audio:2, trigger:{player:'damageEnd'}, frequent:true, content:function(){ - lib.skill.rehuashen.addHuashens(player,trigger.num); - player.syncStorage('rehuashen'); - player.updateMarks('rehuashen'); + 'step 0' + event.num=trigger.num; + 'step 1' + lib.skill.rehuashen.addHuashens(player,1); + 'step 2' + if(--event.num>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ + player.chooseBool(get.prompt2('rexinsheng')).set('frequentSkill',event.name); + } + else event.finish(); + 'step 3' + if(result.bool&&player.hasSkill('rexinsheng')){ + player.logSkill('rexinsheng'); + event.goto(1); + } }, }, reguhuo:{ @@ -10655,12 +10876,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ derivation:'rechanyuan', enable:['chooseToUse','chooseToRespond'], hiddenCard:function(player,name){ - return (lib.inpile.contains(name)&&player.countCards('h')>0&&!player.hasSkill('reguhuo_phase')); + return lib.inpile.contains(name)&&player.countCards('h')>0&&!player.hasSkill('reguhuo_phase'); }, filter:function(event,player){ if(!player.countCards('hs')||player.hasSkill('reguhuo_phase')) return false; for(var i of lib.inpile){ - if(i=='shan'||i=='wuxie') continue; var type=get.type(i); if((type=='basic'||type=='trick')&&event.filterCard({name:i},player,event)) return true; if(i=='sha'){ @@ -10675,7 +10895,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dialog:function(){ var list=[]; for(var i of lib.inpile){ - if(i=='shan'||i=='wuxie') continue; var type=get.type(i); if(type=='basic'||type=='trick') list.push([type,'',i]); if(i=='sha'){ @@ -10743,6 +10962,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, precontent:function(){ player.logSkill('reguhuo'); + player.addTempSkill('reguhuo_guess'); var card=event.result.cards[0]; event.result.card.suit=get.suit(card); event.result.card.number=get.number(card); @@ -10766,94 +10986,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, threaten:1.3, }, - group:['reguhuo_shan','reguhuo_wuxie','reguhuo_guess'], - }, - reguhuo_shan:{ - enable:['chooseToUse','chooseToRespond'], - viewAs:{ - name:'shan', - suit:'none', - number:null, - }, - filterCard:function(card,player,target){ - var result=true; - var suit=card.suit,number=card.number; - card.suit='none';card.number=null; - var mod=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod!='unchanged') result=mod; - card.suit=suit;card.number=number; - return result; - }, - position:'hs', - ignoreMod:true, - viewAsFilter:function(player){ - return player.countCards('hs')&&!player.hasSkill('reguhuo_phase'); - }, - check:function(card){ - var player=_status.event.player; - var hasEnemy=game.hasPlayer(function(current){ - return current!=player&&!current.hasSkill('rechanyuan')&&(get.realAttitude||get.attitude)(current,player)<0; - }); - var cardx='shan'; - if(hasEnemy){ - if(card.name==cardx) return 10; - return 0; - } - return 6-get.value(card); - }, - precontent:function(){ - player.logSkill('reguhuo'); - var card=event.result.cards[0]; - event.result.card.suit=get.suit(card); - event.result.card.number=get.number(card); - }, - prompt:'将一张牌当做【闪】使用或打出', - ai:{ - order:4, - }, - }, - reguhuo_wuxie:{ - enable:'chooseToUse', - viewAs:{ - name:'wuxie', - suit:'none', - number:null, - }, - filterCard:function(card,player,target){ - var result=true; - var suit=card.suit,number=card.number; - card.suit='none';card.number=null; - var mod=game.checkMod(card,player,'unchanged','cardEnabled2',player); - if(mod!='unchanged') result=mod; - card.suit=suit;card.number=number; - return result; - }, - ignoreMod:true, - check:function(card){ - var player=_status.event.player; - var hasEnemy=game.hasPlayer(function(current){ - return current!=player&&!current.hasSkill('rechanyuan')&&(get.realAttitude||get.attitude)(current,player)<0; - }); - var cardx='wuxie'; - if(hasEnemy){ - if(card.name==cardx) return 10; - return 0; - } - return 6-get.value(card); - }, - precontent:function(){ - player.logSkill('reguhuo'); - var card=event.result.cards[0]; - event.result.card.suit=get.suit(card); - event.result.card.number=get.number(card); - }, - viewAsFilter:function(player){ - return player.countCards('hs')&&!player.hasSkill('reguhuo_phase'); - }, - prompt:'将一张牌当做【无懈可击】使用', - ai:{ - order:4, - }, }, reguhuo_guess:{ trigger:{ @@ -10970,7 +11102,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(!result.bool) target.loseHp(); 'step 2' - target.addSkill('rechanyuan'); + target.addSkillLog('rechanyuan'); if(targets.length) event.goto(0); }, }, @@ -10978,13 +11110,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ reguhuo_phase:{}, rechanyuan:{ init:function(player,skill){ + if(player.hp<=1){ + player.logSkill(skill); + player.addSkill('rechanyuan_log'); + } player.addSkillBlocker(skill); }, onremove:function(player,skill){ + player.removeSkill('rechanyuan_log'); player.removeSkillBlocker(skill); }, - charlotte:true, - locked:true, skillBlocker:function(skill,player){ return skill!='chanyuan'&&skill!='rechanyuan'&&!lib.skill[skill].charlotte&&player.hp<=1; }, @@ -10997,8 +11132,25 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); if(list.length) str+=('
  • 失效技能:'+get.translation(list)) return str; + }, + }, + audio:2, + trigger:{player:'changeHp'}, + filter:function(event,player){ + return (player.hp<=1)!=(player.hasSkill('rechanyuan_log')); + }, + direct:true, + locked:true, + content:function(){ + if(player.hp<=1){ + player.logSkill('rechanyuan'); + player.addSkill('rechanyuan_log'); } - } + else player.removeSkill('rechanyuan_log'); + }, + subSkill:{ + log:{charlotte:true}, + }, }, botu:{ audio:2, @@ -11158,7 +11310,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(checkx>0) return checkx; } return 0; - }; + } if(attitude>0){ return result; } @@ -11355,12 +11507,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ check:function (card){return 8-get.value(card)}, }, reshuangxiong:{ + audio:"shuangxiong", + audioname:['re_yanwen'], + group:['reshuangxiong1',"reshuangxiong2"], + }, + reshuangxiong1:{ + audio:"shuangxiong1", + audioname:['re_yanwen'], trigger:{ player:"phaseDrawBegin1", }, - group:"reshuangxiong2", - audio:"shuangxiong", - audioname:['re_yanwen'], check:function (event,player){ if(player.countCards('h')>player.hp) return true; if(player.countCards('h')>3) return true; @@ -11369,7 +11525,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ return !event.numFixed; }, - content:function (){ + prompt2:function(){ + return '放弃摸牌,然后展示牌堆顶的两张牌并选择获得其中的一张。本回合内可以将与此牌颜色不同的一张手牌当做【决斗】使用'; + }, + content:function(){ "step 0" trigger.changeToZero(); event.cards=get.cards(2); @@ -11417,10 +11576,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var card2=event.card2; player.gain(card2,'gain2'); player.addTempSkill('shuangxiong2'); - player.storage.shuangxiong=get.color(card2); + player.markAuto('shuangxiong2',[get.color(card2,false)]); }, }, - "reshuangxiong2":{ + reshuangxiong2:{ trigger:{ player:"damageEnd", }, @@ -11521,7 +11680,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 1; } else return 4; - }; + } return 3; }).set('logSkill',['new_liyu',trigger.player]); 'step 1' @@ -12033,7 +12192,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(get.attitude(_status.event.player,_status.currentPhase)<0&&_status.currentPhase.needsToDiscard()&&card.name!='du') return -1; for(var i=0;ilib.skill.sbqicai.filterCardx(card,player)); + event.set('sbqicai',cards); + } + }, + filter:function(event,player){ + if(!game.hasPlayer(target=>target!=player&&target.hasEmptySlot(2))) return false; + return player.countCards('h',card=>lib.skill.sbqicai.filterCardx(card,player))||event.sbqicai&&event.sbqicai.length; + }, + filterCardx:function(card,player){ + if(player.getStorage('sbqicai').includes(card.name)) return false; + return get.type(card)=='equip'&&get.subtype(card)=='equip2'; + }, + usable:1, + chooseButton:{ + dialog:function(event,player){ + const list1=player.getCards('h',card=>lib.skill.sbqicai.filterCardx(card,player)); + const list2=event.sbqicai; + var dialog=ui.create.dialog('###奇才###
    请选择一张防具牌置入一名其他角色的装备区
    '); + if(list1.length){ + dialog.add('
    手牌区
    '); + dialog.add(list1); + } + if(list2.length){ + dialog.add('
    弃牌堆
    '); + dialog.add(list2); + if(list1.length) dialog.classList.add('fullheight'); + } + return dialog; + }, + check:function(button){ + var player=_status.event.player; + var num=get.value(button.link); + if(!game.hasPlayer(target=>target!=player&&target.hasEmptySlot(2)&&get.attitude(player,target)>0)) num=1/(get.value(button.link)||0.5); + if(get.owner(button.link)) return num; + return num*5; + }, + backup:function(links,player){ + return { + audio:'sbqicai', + card:links[0], + filterCard:function(card,player){ + var cardx=lib.skill.sbqicai_backup.card; + if(get.owner(cardx)) return card==cardx; + return false; + }, + selectCard:-1, + filterTarget:function(card,player,target){ + return target!=player&&target.canEquip(lib.skill.sbqicai_backup.card); + }, + check:()=>1, + discard:false, + lose:false, + prepare:function(cards,player,targets){ + if(cards&&cards.length) player.$give(cards,targets[0],false); + }, + content:function(){ + if(!cards||!cards.length){ + cards=[lib.skill.sbqicai_backup.card]; + target.$gain2(cards); + game.delayx(); + } + player.markAuto('sbqicai',[cards[0].name]); + target.equip(cards[0]); + player.addSkill('sbqicai_gain'); + lib.skill.sbqicai.updateCounter(player,target,0); + }, + ai:{ + result:{ + target:function(player,target){ + var att=get.attitude(player,target); + if(att>0) return 3; + if(att<0) return -1; + return 0; + }, + }, + }, + } + }, + prompt:function(links,player){ + return '请选择置入'+get.translation(links)+'的角色'; + }, + }, + updateCounter:function(player,target,num){ + const skill=`sbqicai_${player.playerid}`; + game.broadcastAll(lib.skill.sbqicai.initSkill,skill); + if(!target.hasSkill(skill)) target.addSkill(skill); + if(num==0) target.clearMark(skill,false); + else if(num>0) target.addMark(skill,num,false); + if(target.countMark(skill)>=lib.skill.sbqicai.getLimit) target.removeSkill(skill); + if(!_status.postReconnect.sbqicai){ + _status.postReconnect.sbqicai=[ + lib.skill.sbqicai.initSkill, + [] + ]; + } + _status.postReconnect.sbqicai[1].add(skill); + }, + initSkill:skill=>{ + if(!lib.skill[skill]){ + lib.skill[skill]={ + onremove:true, + mark:true, + marktext:'奇', + intro:{ + markcount:function(storage){ + return (storage||0).toString(); + }, + content:function(storage){ + return '已被掠夺'+get.cnNumber(storage||0)+'张普通锦囊牌'; + }, + }, + }; + lib.translate[skill]='奇才'; + lib.translate[skill+'_bg']='奇'; + } + }, + ai:{ + order:7, + result:{ + player:function(player){ + if(!game.hasPlayer(target=>target!=player&&target.hasEmptySlot(2)&&get.attitude(player,target)!=0)) return 0; + return 1; + }, + }, + }, + marktext:'才', + intro:{content:'已使用$发动过此技能'}, + subSkill:{ + gain:{ + audio:'sbqicai', + trigger:{global:['gainAfter','loseAsyncAfter']}, + filter:function(event,player){ + return game.hasPlayer(function(current){ + if(!event.getg(current).length||!current.hasSkill('sbqicai_'+player.playerid)) return false; + if(current.countMark('sbqicai_'+player.playerid)>=lib.skill.sbqicai.getLimit) return false; + return event.getg(current).some(card=>get.type(card)=='trick'&&lib.filter.canBeGained(card,current,player)); + }); + }, + forced:true, + direct:true, + charlotte:true, + content:function(){ + 'step 0' + if(!event.checkedTargets) event.checkedTargets=[]; + var target=game.findPlayer(function(current){ + if(!trigger.getg(current).length||!current.hasSkill('sbqicai_'+player.playerid)) return false; + if(event.checkedTargets.includes(current)) return false; + if(current.countMark('sbqicai_'+player.playerid)>=lib.skill.sbqicai.getLimit) return false; + return trigger.getg(current).some(card=>get.type(card)=='trick'&&lib.filter.canBeGained(card,current,player)); + }); + if(!target){ + event.finish(); + return; + } + event.target=target; + player.logSkill('sbqicai_gain',target); + event.checkedTargets.add(target); + var cards=trigger.getg(target).filter(card=>get.type(card)=='trick'&&lib.filter.canBeGained(card,target,player)); + if(cards.length<=lib.skill.sbqicai.getLimit-target.countMark('sbqicai_'+player.playerid)) event._result={bool:true,links:cards}; + else{ + var num=(lib.skill.sbqicai.getLimit-target.countMark('sbqicai_'+player.playerid)); + target.chooseButton(['奇才:将其中'+get.cnNumber(num)+'张牌交给'+get.translation(player),cards],num,true).set('ai',function(button){ + return get.value(button.link)*get.sgn(_status.event.att); + }).set('att',get.attitude(target,player)); + } + 'step 1' + if(result.bool){ + game.delaye(0.5); + target.give(result.links,player); + lib.skill.sbqicai.updateCounter(player,target,result.links.length); + } + event.goto(0); + }, + }, + }, + }, + sbjizhi:{ + audio:2, + trigger:{player:'useCard'}, + filter:function(event,player){ + return get.type(event.card)=='trick'; + }, + forced:true, + content:function(){ + player.draw().gaintag=['sbjizhi']; + player.addTempSkill('sbjizhi_mark') + }, + subSkill:{ + mark:{ + charlotte:true, + onremove:function(player){ + player.removeGaintag('sbjizhi'); + }, + mod:{ + ignoredHandcard:function(card,player){ + if(card.hasGaintag('sbjizhi')) return true; + }, + cardDiscardable:function(card,player,name){ + if(name=='phaseDiscard'&&card.hasGaintag('sbjizhi')) return false; + }, + }, + }, + }, + }, + //诸葛亮 + sbhuoji:{ + audio:2, + enable:'phaseUse', + filterTarget:lib.filter.notMe, + prompt:'选择一名其他角色,对其与其势力相同的所有其他角色各造成1点火属性伤害', + usable:1, + line:'fire', + content:function(){ + 'step 0' + target.damage('fire'); + 'step 1' + var targets=game.filterPlayer(current=>{ + if(current==player||current==target) return false; + return current.group==target.group; + }); + if(targets.length){ + game.delayx(); + player.line(targets,'fire'); + targets.forEach(i=>i.damage('fire')); + } + }, + ai:{ + order:7, + fireAttack:true, + result:{ + target:function(player,target){ + var att=get.attitude(player,target); + return get.sgn(att)*game.filterPlayer(current=>{ + if(current==player) return false; + return current.group==target.group; + }).reduce((num,current)=>num+get.damageEffect(current,player,player,'fire'),0); + }, + }, + }, + derivation:['sbguanxing','sbkongcheng'], + group:['sbhuoji_achieve','sbhuoji_fail','sbhuoji_mark'], + subSkill:{ + achieve:{ + audio:'sbhuoji', + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return player.getAllHistory('sourceDamage',evt=>evt.hasNature('fire')).reduce((num,evt)=>num+evt.num,0)>=game.players.length+game.dead.length; + }, + forced:true, + locked:false, + skillAnimation:true, + animationColor:'fire', + content:function(){ + player.awakenSkill('sbhuoji'); + game.log(player,'成功完成使命'); + var list=[]; + if(player.name&&get.character(player.name)[3].includes('sbhuoji')) list.add(player.name); + if(player.name1&&get.character(player.name1)[3].includes('sbhuoji')) list.add(player.name1); + if(player.name2&&get.character(player.name2)[3].includes('sbhuoji')) list.add(player.name2); + if(list.length) list.forEach(name=>player.reinit(name,'sb_zhugeliang')); + else{ + player.removeSkill(['sbhuoji','sbkanpo']); + player.addSkill(['sbguanxing','sbkongcheng']); + } + }, + }, + fail:{ + audio:'sbhuoji', + trigger:{player:'dying'}, + forced:true, + locked:false, + content:function(){ + player.awakenSkill('sbhuoji'); + game.log(player,'使命失败'); + }, + }, + mark:{ + charlotte:true, + trigger:{source:'damage'}, + filter:function(event,player){ + return event.hasNature('fire'); + }, + firstDo:true, + forced:true, + popup:false, + content:function(){ + player.addTempSkill('sbhuoji_count',{player:['sbhuoji_achieveBegin','sbhuoji_failBegin']}); + player.storage.sbhuoji_count=player.getAllHistory('sourceDamage',evt=>evt.hasNature('fire')).reduce((num,evt)=>num+evt.num,0); + player.markSkill('sbhuoji_count'); + }, + }, + count:{ + charlotte:true, + intro:{content:'本局游戏已造成过#点火属性伤害'}, + }, + }, + }, + sbkanpo:{ + audio:2, + trigger:{global:'roundStart'}, + forced:true, + locked:false, + get getNumber(){ + return 3; + }, + content:function*(event,map){ + var player=map.player; + var storage=player.getStorage('sbkanpo').slice(); + if(storage.length){ + player.unmarkAuto('sbkanpo',storage); + } + const list=get.inpileVCardList(info=>{ + if(info[2]=='sha'&&info[3]) return false; + return info[0]!='equip'; + }); + const func=()=>{ + const event=get.event(); + const controls=[link=>{ + const evt=get.event(); + if(link=='cancel2') ui.click.cancel(); + else{ + if(evt.dialog&&evt.dialog.buttons){ + for(let i=0;i{ + return ui.create.control(controls.concat(control=='清除选择'?[control,'stayleft']:control)); + }); + }; + if(event.isMine()) func(); + else if(event.isOnline()) event.player.send(func); + var result=yield player.chooseButton(['看破:是否记录三个牌名?',[list,'vcard']],[1,3],true).set('ai',function(button){ + switch(button.link[2]){ + case 'wuxie':return 5+Math.random(); + case 'sha':return 5+Math.random(); + case 'tao':return 4+Math.random(); + case 'jiu':return 3+Math.random(); + case 'lebu':return 3+Math.random(); + case 'shan':return 4.5+Math.random(); + case 'wuzhong':return 4+Math.random(); + case 'shunshou':return 2.7+Math.random(); + case 'nanman':return 2+Math.random(); + case 'wanjian':return 1.6+Math.random(); + default:return 1.5+Math.random(); + } + }).set('filterButton',button=>{ + return !_status.event.names.includes(button.link[2]); + }).set('names',storage).set('custom',{ + add:{ + confirm:function(bool){ + if(bool!=true) return; + const event=get.event().parent; + if(event.controls) event.controls.forEach(i=>i.close()); + if(ui.confirm) ui.confirm.close(); + game.uncheck(); + }, + button:function(){ + if(ui.selected.buttons.length) return; + const event=get.event(); + if(event.dialog&&event.dialog.buttons){ + for(let i=0;i=lib.skill.sbkanpo.getNumber) return false; + button.classList.add('selected'); + ui.selected.buttons.push(button); + let counterNode=button.querySelector('.caption'); + const count=ui.selected.buttons.filter(i=>i==button).length; + if(counterNode){ + counterNode=counterNode.childNodes[0]; + counterNode.innerHTML=`×${count}`; + } + else{ + counterNode=ui.create.caption(`×${count}`,button); + counterNode.style.right='5px'; + counterNode.style.bottom='2px'; + } + const evt=event.parent; + if(evt.controls) evt.controls[0].show(); + game.check(); + }, + } + }); + if(result.bool){ + var names=result.links.map(link=>link[2]); + player.setStorage('sbkanpo',names); + player.markSkill('sbkanpo'); + } + }, + marktext:'破', + intro:{ + markcount:function(storage,player){ + if(player.isUnderControl(true)) return storage.length; + return '?'; + }, + mark:function(dialog,content,player){ + if(player.isUnderControl(true)){ + const storage=player.getStorage('sbkanpo'); + dialog.addText('已记录牌名:'); + dialog.addSmall([storage,'vcard']); + } + else{ + return `${get.translation(player)}记录了一些牌名`; + } + }, + }, + group:'sbkanpo_kanpo', + subSkill:{ + kanpo:{ + audio:'sbkanpo', + trigger:{global:'useCard'}, + filter:function(event,player){ + return event.player!=player&&player.getStorage('sbkanpo').includes(event.card.name); + }, + prompt2:function(event,player){ + return '移除'+get.translation(event.card.name)+'的记录,令'+get.translation(event.card)+'无效'; + }, + check:function(event,player){ + var effect=0; + if(event.card.name=='wuxie'||event.card.name=='shan'){ + if(get.attitude(player,event.player)<-1) effect=-1; + } + else if(event.targets&&event.targets.length){ + for(var i=0;icard.hasGaintag('sbguanxing'))); + }, + forced:true, + locked:false, + content:function(){ + 'step 0' + if(trigger.name=='phaseJieshu'){ + event.goto(2); + return; + } + var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); + if(cards.length) player.loseToDiscardpile(cards); + var bool=player.getAllHistory('useSkill',evt=>evt.skill=='sbguanxing').length>1; + event.num=Math.min(7,bool?cards.length+1:7); + 'step 1' + var cards2=get.cards(num); + player.$gain2(cards2,false); + game.log(player,'将',cards2,'置于了武将牌上'); + player.loseToSpecial(cards2,'sbguanxing').visible=true; + player.markSkill('sbguanxing'); + 'step 2' + var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); + if(cards.length){ + player.chooseToMove().set('list',[ + ['你的“星”',cards], + ['牌堆顶'], + ]).set('prompt','观星:点击将牌移动到牌堆顶').set('processAI',function(list){ + var cards=list[0][1].slice(),player=_status.event.player; + var name=_status.event.getTrigger().name; + var target=(name=='phaseZhunbei'?player:player.getNext()); + var judges=target.getCards('j'); + var top=[],att=get.sgn(get.attitude(player,target)); + if(judges.length&&att!=0&&(target!=player||!player.hasWuxie())){ + for(var i=0;iget.judge(card)*num; + cards.sort((a,b)=>judge(b,att)-judge(a,att)); + if(judge(cards[0],att)<0) break; + else top.unshift(cards.shift()); + } + } + return [cards,top]; + }).set('filterOk',function(moved){ + return moved[1].length; + }); + } + else event._result={bool:false}; + 'step 3' + if(result.bool){ + var cards=result.moved[1]; + player.loseToDiscardpile(cards,ui.cardPile,'insert').log=false; + game.log(player,'将',cards,'置于了牌堆顶'); + } + else if(trigger.name=='phaseZhunbei') player.addTempSkill('sbguanxing_on'); + }, + group:'sbguanxing_unmark', + subSkill:{ + on:{charlotte:true}, + unmark:{ + trigger:{player:'loseAfter'}, + filter:function(event,player){ + if(!event.ss||!event.ss.length) return false; + return !player.countCards('s',card=>card.hasGaintag('sbguanxing')); + }, + charlotte:true, + forced:true, + silent:true, + content:function(){ + player.unmarkSkill('sbguanxing'); + }, + }, + }, + marktext:'星', + intro:{ + mark:function(dialog,storage,player){ + var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); + if(!cards||!cards.length) return; + dialog.addAuto(cards); + }, + markcount:function(storage,player){ + return player.countCards('s',card=>card.hasGaintag('sbguanxing')); + }, + onunmark:function(storage,player){ + var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); + if(cards.length) player.loseToDiscardpile(cards); + }, + }, + mod:{ + aiOrder:function(player,card,num){ + var cards=player.getCards('s',card=>card.hasGaintag('sbguanxing')); + if(get.itemtype(card)=='card'&&card.hasGaintag('sbguanxing')) return num+(cards.length>1?0.5:-0.0001); + }, + }, + }, + sbkongcheng:{ + audio:2, + trigger:{player:['damageBegin3','damageBegin4']}, + filter:function(event,player,name){ + if(!player.hasSkill('sbguanxing')) return false; + const num=player.countCards('s',card=>card.hasGaintag('sbguanxing')); + if(name=='damageBegin3'&&!num) return true; + if(name=='damageBegin4'&&num) return true; + return false; + }, + forced:true, + content:function(){ + 'step 0' + var num=player.countCards('s',card=>card.hasGaintag('sbguanxing')); + if(!num&&event.triggername=='damageBegin3'){ + trigger.increase('num'); + } + else if(num&&event.triggername=='damageBegin4'){ + player.judge(function(result){ + if(get.number(result)<=get.player().countCards('s',card=>card.hasGaintag('sbguanxing'))) return 2; + return -1; + }).set('judge2',result=>result.bool).set('callback',function(){ + if(event.judgeResult.number<=player.countCards('s',card=>card.hasGaintag('sbguanxing'))){ + event.getParent('sbkongcheng').getTrigger().decrease('num'); + } + }); + } + }, + }, //卢植 sbzhenliang:{ mark:true, @@ -101,6 +717,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return get.damageEffect(target,player,player); }, }, + combo:'nzry_mingren', }, group:'sbzhenliang_draw', subSkill:{ @@ -129,7 +746,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, - ai:{combo:'nzry_mingren'}, }, //小乔 sbtianxiang:{ @@ -187,6 +803,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.removeSkill(skills); num+=skills.length; }); + if(get.mode()=='versus'&&_status.mode=='two') num+=2; player.draw(num); }, }, @@ -1289,7 +1906,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sblianhuan:{ audio:2, enable:'phaseUse', - filterCard:{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; @@ -2695,7 +3311,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.directHit.add(target); player.chooseToDuiben(target).set('title','谋弈').set('namelist',[ '出阵迎战','拱卫中军','直取敌营','扰阵疲敌' - ]); + ]).set('ai',button=>{ + var source=get.event().getParent().player,target=get.event().getParent().target; + if(!target.countCards('he')&&button.link[2]=='db_def2') return 10; + if(!target.countCards('he')&&get.attitude(target,source)<=0&&button.link[2]=='db_atk1') return 10; + return 1+Math.random(); + }); 'step 1' if(result.bool){ if(result.player=='db_def1') player.gainPlayerCard(target,'he',true); @@ -4697,7 +5318,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, locked:false, filter:function(event,player){ - return player.hasSkill('splveying')&&(get.type(event.card)=='trick'&&!get.tag(event.card,'damage'))&&player.countMark('splveying')>1; + return player.hasSkill('splveying',null,false,false)&&(get.type(event.card)=='trick'&&!get.tag(event.card,'damage'))&&player.countMark('splveying')>1; }, content:function(){ player.removeMark('splveying',2); @@ -5096,6 +5717,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sb_xiaoqiao_prefix:'谋', sbtianxiang:'天香', sbtianxiang_info:'①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸等量的牌。', + sbtianxiang_info_versus_two:'①出牌阶段限三次,你可以交给一名没有“天香”标记的其他角色一张红色牌,然后令其获得此牌花色的“天香”标记。②当你受到伤害时,你可以移去一名角色的“天香”标记,若此“天香”标记为:红桃,你防止此伤害,其受到伤害来源对其造成的1点伤害(若没有伤害来源则改为无来源伤害);方片,其交给你两张牌。③准备阶段,你移去场上所有的“天香”标记,然后摸X张牌(X为移去的“天香”标记数+2)。', + sb_sp_zhugeliang:'谋诸葛亮', + sb_sp_zhugeliang_prefix:'谋', + sb_zhugeliang:'谋诸葛亮', + sb_zhugeliang_prefix:'谋', + sbhuoji:'火计', + sbhuoji_info:'使命技。①使命:出牌阶段限一次。你可以对一名其他角色造成1点火焰伤害,然后你对所有与其势力相同的不为其的其他角色各造成1点火焰伤害。②成功:准备阶段,若你本局游戏已造成的火焰伤害不小于本局游戏总角色数,则你失去〖火计〗和〖看破〗,然后获得〖观星〗和〖空城〗。③失败:使命成功前进入濒死状态。', + sbkanpo:'看破', + sbkanpo_info:'①一轮游戏开始时,你清除〖看破①〗记录的牌名,然后你可以依次记录共计三个未于本次清除过的非装备牌牌名(对其他角色不可见)。②当其他角色使用你〖看破①〗记录过的牌名的牌时,你可以移去一个〖看破①〗中的此牌名的记录,令此牌无效。', + sbguanxing:'观星', + sbguanxing_info:'①准备阶段,你将所有“星”置入弃牌堆,将牌堆顶的X张牌置于你的武将牌上,称为“星”。然后你可以将任意张“星”置于牌堆顶(X为你此次移去的“星”数+1且至多为7,若你此前未发动过〖观星①〗则X为7)。②结束阶段,若你未于本回合的准备阶段将“星”置于过牌堆顶,你可以将任意张“星”置于牌堆顶。③你可以如手牌般使用或打出“星”。', + sbkongcheng:'空城', + sbkongcheng_info:'锁定技。当你受到伤害时,若你有〖观星〗,且若你:有“星”,你判定,若结果点数不大于你的“星”数,此伤害-1;没有“星”,此伤害+1。', + sb_huangyueying:'谋黄月英', + sb_huangyueying_prefix:'谋', + sbqicai:'奇才', + sbqicai_backup:'奇才', + sbqicai_info:'①出牌阶段限一次。你可以将手牌中或弃牌堆中的一张防具牌置于一名其他角色的防具栏,然后其获得如下效果:当其得到普通锦囊牌后,其将此牌交给你(限三张)。②你使用锦囊牌无距离限制。', + sbjizhi:'集智', + sbjizhi_info:'锁定技,当你使用一张普通锦囊牌时,你摸一张牌,且此牌本回合不计入你的手牌上限。', sb_zhi:'谋攻篇·知', sb_shi:'谋攻篇·识', diff --git a/character/shenhua.js b/character/shenhua.js index 0f7d6b7f1..4113463b9 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -27,7 +27,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ // yuji:['male','qun',3,['guhuo']], // xin_yuji:['male','qun',3,['guhuo']], - sp_zhugeliang:['male','shu',3,['huoji','bazhen','kanpo']], + sp_zhugeliang:['male','shu',3,['bazhen','huoji','kanpo']], pangtong:['male','shu',3,['lianhuan','oldniepan']], xunyu:['male','wei',3,['quhu','jieming'],['clan:颍川荀氏']], dianwei:['male','wei',4,['qiangxix']], @@ -143,7 +143,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ skill:{ //庞统写法修改 lianhuan:{ - audio:'lianhuan1', + audio:2, hiddenCard:(player,name)=>{ return name=='tiesuo'&&player.hasCard(card=>get.suit(card)=='club','sh'); }, @@ -215,8 +215,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.recast(cards); }, }, - lianhuan1:{audio:2}, - lianhuan2:{audio:2}, //新杀小加强 陈到 dcwanglie:{ audio:'drlt_wanglie', @@ -750,7 +748,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.line(player,trigger.player); player.logSkill('drlt_zhenrong'); player.addToExpansion(result.links,trigger.player,'give','log').gaintag.add('drlt_zhenrong'); - }; + } }, }, "drlt_hongju":{ @@ -822,11 +820,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=result.links; for(var i=0;ii!==card&&(!card.cards||!card.cards.contains(i))),num=player.getCardUsable('sha'); + let hs=player.getCards('h',i=>i!==card&&(!card.cards||!card.cards.includes(i))),num=player.getCardUsable('sha'); if(card.name!=='sha'&&card.name!=='juedou'||hs.length{ + if(!player.canUse(i,target)) return false; if(i.name==='juedou') return true; if(num&&i.name==='sha'){ num--; @@ -1117,17 +1116,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' switch(result.control){ case 'equip1': - player.addTempSkill('drlt_jueyan1',{player:'phaseAfter'}); + player.addTempSkill('drlt_jueyan1'); break; case 'equip2': player.draw(3); - player.addTempSkill('drlt_jueyan3',{player:'phaseAfter'}); + player.addTempSkill('drlt_jueyan3'); break; case 'equip3_4': - player.addTempSkill('drlt_jueyan2',{player:'phaseAfter'}); + player.addTempSkill('drlt_jueyan2'); break; case 'equip5': - player.addTempSkill('rejizhi',{player:'phaseAfter'}); + player.addTempSkill('rejizhi'); break; } }, @@ -1146,6 +1145,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + derivation:'rejizhi', }, 'drlt_jueyan1':{ mod:{ @@ -1268,7 +1268,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ player.addTempSkill('drlt_yongsi1',{player:'phaseDiscardAfter'}); - }; + } }, }, }, @@ -1482,7 +1482,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=1; if(get.type(result.cards[0])=='equip') num=2; player.draw(num); - }; + } }, }, drlt_wanglie:{ @@ -1728,7 +1728,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, '2':{ - audio:2, + audio:"nzry_juzhan_1", trigger:{ player:'useCardToPlayered' }, @@ -1820,7 +1820,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ },'选择一名装备区里牌数大于你的角色').ai=function(target){ return -get.attitude(player,target) }; - }; + } 'step 2' if(result.bool){ event.target=result.targets[0]; @@ -1846,7 +1846,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 3' if(result.bool){ target.give(result.cards,player); - }; + } }, ai:{ order:11, @@ -1958,14 +1958,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else event._result={index:0}; }else{ event.finish(); - }; + } 'step 2' player.logSkill('nzry_yili',target); if(result.index==1){ player.removeMark('nzry_huaiju',1); }else{ player.loseHp(); - }; + } target.addMark('nzry_huaiju',1); target.addSkill('nzry_huaiju_ai'); }, @@ -2024,7 +2024,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=0; for(var i=0;i=2) player.loseHp(); - }; - }; - }; + } + } + } }, }, rechezheng:{ @@ -2122,7 +2122,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ player.line(result.targets); player.discardPlayerCard(result.targets[0],'he',1,true); - }; + } }, group:'rechezheng', }, @@ -2234,7 +2234,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } player.markSkill('nzry_chenglve'); player.addTempSkill('nzry_chenglve1'); - }; + } }, ai:{ order:2.7, @@ -2252,13 +2252,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=player.storage.nzry_chenglve1; for(var i=0;i0){ pl.draw(4-pl.countCards('h')); pl.logSkill('nzry_shenshi'); - }; + } player.removeSkill('nzry_shenshi1'); delete player.storage.nzry_shenshi1; delete player.storage.nzry_shenshi2; @@ -3495,167 +3494,99 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, qiaobian:{ audio:2, - group:['qiaobian1','qiaobian2','qiaobian3','qiaobian4'], + trigger:{player:['phaseJudgeBefore','phaseDrawBefore','phaseUseBefore','phaseDiscardBefore']}, + filter:function(event,player){ + return player.countCards('h')>0; + }, + direct:true, preHidden:true, - ai:{ - threaten:3 - } - }, - qiaobian1:{ - audio:2, - trigger:{player:'phaseJudgeBefore'}, - filter:function(event,player){ - return player.countCards('h')>0; - }, - direct:true, - frequent:true, content:function(){ - "step 0" - if(player.countCards('j')==0&&!event.isOnline()&&(!event.isMine()||!lib.config.autoskilllist.contains('qiaobian1'))){ - event.finish(); - } - else{ - var next=player.chooseToDiscard(get.prompt('qiaobian'),'弃置一张手牌并跳过判定阶段'); - next.set('ai',get.unuseful2); - next.set('logSkill','qiaobian1'); - next.setHiddenSkill('qiaobian'); - } - "step 1" - if(result.bool){ - trigger.cancel(); - } - } - }, - qiaobian2:{ - audio:2, - trigger:{player:'phaseDrawBefore'}, - filter:function(event,player){ - return player.countCards('h')>0; - }, - direct:true, - content:function(){ - "step 0" - var check,i,num=0,num2=0,players=game.filterPlayer(); - for(i=0;i=2&&num2>0); + break; + case 'phaseUse': + if(!player.canMoveCard(true)){ + check=false; } - } + else{ + check=game.hasPlayer(function(current){ + return get.attitude(player,current)>0&¤t.countCards('j'); + }); + if(!check){ + if(player.countCards('h')>player.hp+1){ + check=false; + } + else if(player.countCards('h',{name:['wuzhong']})){ + check=false; + } + else{ + check=true; + } + } + } + break; + case 'phaseDiscard': + check=player.needsToDiscard(); + break; } - check=(num>=2&&num2>0); - - player.chooseToDiscard(get.prompt('qiaobian'),'弃置一张手牌并跳过摸牌阶段,然后可以获得至多两名角色各一张手牌',lib.filter.cardDiscardable).set('ai',function(card){ - if(!_status.event.check) return 0; + player.chooseToDiscard(get.prompt('qiaobian'),str,lib.filter.cardDiscardable).set('ai',card=>{ + if(!_status.event.check) return -1; return 7-get.value(card); - }).set('check',check).set('logSkill','qiaobian2').setHiddenSkill('qiaobian'); - "step 1" + }).set('check',check).set('logSkill','qiaobian').setHiddenSkill('qiaobian'); + 'step 1' if(result.bool){ trigger.cancel(); - player.chooseTarget([1,2],'获得至多两名角色各一张手牌',function(card,player,target){ - return target!=player&&target.countCards('h'); - }).set('ai',function(target){ - return 1-get.attitude(_status.event.player,target); - }) + game.log(player,'跳过了','#y'+['判定','摸牌','出牌','弃牌'][lib.skill.qiaobian.trigger.player.indexOf(event.triggername)]+'阶段'); + if(trigger.name=='phaseUse'){ + if(player.canMoveCard()) player.moveCard(); + event.finish(); + } + else if(trigger.name=='phaseDraw'){ + player.chooseTarget([1,2],'获得至多两名角色各一张手牌',function(card,player,target){ + return target!=player&&target.countCards('h'); + }).set('ai',function(target){ + return 1-get.attitude(_status.event.player,target); + }); + } + else event.finish(); } - else{ - event.finish(); - } - "step 2" + else event.finish(); + 'step 2' if(result.bool){ result.targets.sortBySeat(); player.line(result.targets,'green'); event.targets=result.targets; if(!event.targets.length) event.finish(); } - else{ - event.finish(); - } - "step 3" + else event.finish(); + 'step 3' player.gainMultiple(event.targets); - "step 4" + 'step 4' game.delay(); }, - ai:{ - expose:0.2 - } - }, - qiaobian3:{ - audio:2, - trigger:{player:'phaseUseBefore'}, - filter:function(event,player){ - return player.countCards('h')>0; - }, - direct:true, - content:function(){ - "step 0" - var check; - if(!player.canMoveCard(true)){ - check=false; - } - else{ - check=game.hasPlayer(function(current){ - return get.attitude(player,current)>0&¤t.countCards('j'); - }); - if(!check){ - if(player.countCards('h')>player.hp+1){ - check=false; - } - else if(player.countCards('h',{name:['wuzhong']})){ - check=false; - } - else{ - check=true; - } - } - } - player.chooseToDiscard(get.prompt('qiaobian'),'弃置一张手牌并跳过出牌阶段,然后可以移动场上的一张牌',lib.filter.cardDiscardable).set('ai',function(card){ - if(!_status.event.check) return 0; - return 7-get.value(card); - }).set('check',check).set('logSkill','qiaobian3').setHiddenSkill('qiaobian'); - "step 1" - if(result.bool){ - trigger.cancel(); - player.moveCard(); - } - else{ - event.finish(); - } - }, - ai:{ - expose:0.2 - } - }, - qiaobian4:{ - audio:2, - trigger:{player:'phaseDiscardBefore'}, - direct:true, - filter:function(event,player){ - return player.countCards('h')>0; - }, - content:function(){ - "step 0" - var discard=player.countCards('h')>player.hp; - var next=player.chooseToDiscard(get.prompt('qiaobian4'),'弃置一张手牌并跳过弃牌阶段'); - next.setHiddenSkill('qiaobian'); - next.logSkill='qiaobian'; - next.ai=function(card){ - if(discard){ - return 100-get.useful(card); - } - else{ - return -1; - } - }; - "step 1" - if(result.bool){ - trigger.cancel(); - } - } + ai:{threaten:3}, }, tuntian:{ audio:2, @@ -3698,7 +3629,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 2' if(!result.bool&&!event.directbool){ return; - }; + } player.addToExpansion(event.card,'gain2').gaintag.add('tuntian'); }, callback:function(){ @@ -3731,7 +3662,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, - locked:false, ai:{ effect:{ target:function(card,player,target,current){ @@ -4233,20 +4163,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'huashen2', unique:true, init:function(player){ - player.storage.huashen={ - shown:[], - owned:{} + if(!player.storage.huashen){ + player.storage.huashen={ + owned:{} + }; } }, - group:['huashen1','huashen2'], intro:{ content:function(storage,player){ var str=''; - var slist=storage.owned; - var list=[]; - for(var i in slist){ - list.push(i); - } + var list=Object.keys(storage.owned); if(list.length){ str+=get.translation(list[0]); for(var i=1;ilib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); + dialog.add('
    【'+get.translation(lib.translate[skill+'_ab']||get.translation(skill).slice(0,2))+'】
    '+ + '
    '+get.skillInfoTranslation(skill,player)+'
    '); } - if(dialog.buttons[i].link==player.storage.huashen.current){ - dialog.buttons[i].classList.add('glow2'); + if(player.isUnderControl(true)){ + dialog.addSmall([list,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); + } + else{ + dialog.addText('共有'+get.cnNumber(list.length)+'张“化身”'); } } - var skill=player.storage.huashen.current2; - if(skill){ - dialog.add('
    【'+get.translation(lib.translate[skill+'_ab']||get.translation(skill).slice(0,2))+'】
    '+ - '
    '+get.skillInfoTranslation(skill,player)+'
    '); + else{ + return '没有化身'; } } }, @@ -4319,46 +4238,28 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(name) list.push(name); } if(list.length){ - game.log(player,'获得了',get.cnNumber(list.length)+'张','#g化身') + player.syncStorage('huashen'); + player.markSkill('huashen'); + game.log(player,'获得了',get.cnNumber(list.length)+'张','#g化身'); lib.skill.rehuashen.drawCharacter(player,list); } }, - }, - huashen1:{ trigger:{ global:'phaseBefore', - player:'enterGame', - }, - forced:true, - popup:false, - filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0); - }, - content:function(){ - var next=game.createEvent('huashen'); - next.player=player; - next._trigger=trigger; - next.triggername='huashen'; - next.setContent(lib.skill.huashen2.content); - }, - }, - huashen2:{ - audio:2, - trigger:{ - player:['phaseBegin','phaseEnd','huashen'], + player:['enterGame','phaseBegin','phaseEnd'], }, filter:function(event,player,name){ + if(event.name!='phase') return true; + if(name=='phaseBefore') return game.phaseNumber==0; return !get.is.empty(player.storage.huashen.owned); }, - forced:true, direct:true, content:function(){ 'step 0' - if(event.triggername=='huashen'){ + var name=event.triggername; + if(trigger.name!='phase'||(name=='phaseBefore'&&game.phaseNumber==0)){ player.logSkill('huashen'); lib.skill.huashen.addHuashens(player,2); - player.syncStorage('huashen'); - player.markSkill('huashen'); event.logged=true; } var cards=[]; @@ -4396,7 +4297,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player=player||event.player; if(!event._result) event._result={}; var prompt=forced?'化身:选择获得一项技能':get.prompt('huashen'); - var dialog=ui.create.dialog(prompt,[list,'character']); + var dialog=ui.create.dialog(prompt,[list,(item,type,position,noclick,node)=>lib.skill.rehuashen.$createButton(item,type,position,noclick,node)]); event.dialog=dialog; event.forceMine=true; event.button=null; @@ -4495,10 +4396,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.countChoose(); }; if(event.isMine()){ - chooseButton(player,cards,event.triggername=='huashen'); + chooseButton(player,cards,event.logged); } else if(event.isOnline()){ - event.player.send(chooseButton,event.player,cards,event.triggername=='huashen'); + event.player.send(chooseButton,event.player,cards,event.logged); event.player.wait(); game.pause(); } @@ -4511,10 +4412,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!event.logged) player.logSkill('huashen'); var skill=map.skill,character=map.character; if(character!=player.storage.huashen.current){ + const old=player.storage.huashen.current; player.storage.huashen.current=character; - player.storage.huashen.shown.add(character); player.markSkill('huashen'); - game.broadcastAll(function(character,player){ + game.broadcastAll(function(player,character,old){ + player.tempname.remove(old); + player.tempname.add(character); player.sex=lib.character[character][0]; //player.group=lib.character[character][1]; //player.node.name.dataset.nature=get.groupnature(player.group); @@ -4534,7 +4437,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ },50); },200); } - },character,player); + },player,character,old); game.log(player,'将性别变为了','#y'+get.translation(lib.character[character][0])+'性'); player.changeGroup(lib.character[character][1]); } @@ -4546,10 +4449,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.popup(skill); player.syncStorage('huashen'); player.updateMarks('huashen'); + // lib.skill.rehuashen.createAudio(character,skill,'zuoci'); } } } }, + huashen2:{audio:2}, xinsheng:{ audio:2, unique:true, @@ -4560,10 +4465,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.num=trigger.num; 'step 1' lib.skill.huashen.addHuashens(player,1); - player.syncStorage('huashen'); - player.updateMarks('huashen'); 'step 2' - if(--event.num>0) player.chooseBool(get.prompt2('xinsheng')).set('frequentSkill','xinsheng'); + if(--event.num>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ + player.chooseBool(get.prompt2('xinsheng')).set('frequentSkill',event.name); + } else event.finish(); 'step 3' if(result.bool&&player.hasSkill('xinsheng')){ @@ -6024,6 +5929,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, }, shuangxiong:{ + audio:2, + audioname:['re_yanwen'], + group:'shuangxiong1', + }, + shuangxiong1:{ audio:true, audioname:['re_yanwen'], trigger:{player:'phaseDrawBegin1'}, @@ -6036,39 +5946,53 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return !event.numFixed; }, preHidden:true, + prompt2:()=>'进行一次判定,本回合可以将一张与此牌颜色不同的手牌当作【决斗】使用', content:function(){ - player.judge().set('callback',lib.skill.shuangxiong.callback); + player.judge().set('callback',lib.skill.shuangxiong1.callback); trigger.changeToZero(); }, callback:function(){ player.gain(card,'gain2'); player.addTempSkill('shuangxiong2'); - player.storage.shuangxiong=event.judgeResult.color; + player.markAuto('shuangxiong2',[event.judgeResult.color]); }, }, shuangxiong2:{ + charlotte:true, + onremove:true, audio:true, audioname:['re_yanwen'], enable:'chooseToUse', - prompt:function(){ - var player=_status.event.player; - var str='将一张'+(player.storage.shuangxiong!='red'?'红':'黑')+'色手牌当做【决斗】使用'; - return str; - }, viewAs:{name:'juedou'}, position:'hs', - onremove:true, + viewAsFilter:function(player){ + return player.hasCard(card=>lib.skill.shuangxiong2.filterCard(card,player),'hs'); + }, filterCard:function(card,player){ - return get.color(card)!=player.storage.shuangxiong; + var color=get.color(card),colors=player.getStorage('shuangxiong2'); + for(var i of colors){ + if(color!=i) return true; + } + return false; + }, + prompt:function(){ + var colors=_status.event.player.getStorage('shuangxiong2'); + var str='将一张颜色'; + for(var i=0;i0) str+='或'; + str+='不为'; + str+=get.translation(colors[i]); + } + str+='的牌当做【决斗】使用'; + return str; }, check:function(card){ - return 8-get.value(card); + var player=_status.event.player; + var raw=player.getUseValue(card,null,true); + var eff=player.getUseValue(get.autoViewAs({name:'juedou'},[card])); + return eff-raw; }, - ai:{ - basic:{ - order:10 - } - } + ai:{order:7}, }, luanji:{ audio:2, @@ -6233,7 +6157,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ "step 0"; player.chooseTarget(get.prompt2('releiji'),function(card,player,target){ - return target!=player; + return target!=player; }).ai=function(target){ if(target.hasSkill('hongyan')) return 0; return get.damageEffect(target,_status.event.player,_status.event.player,'thunder'); @@ -7010,8 +6934,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.count=trigger.num; 'step 1' event.count--; - if((player.hp+player.getExpansions('gzbuqu').length)>1){ - player.chooseCardButton('不屈:移去一张“创”',true,player.getExpansions('gzbuqu')).set('ai',function(button){ + var cards=player.getExpansions('gzbuqu'),count=cards.length; + if(count>0&&(player.hp+count)>1){ + if(count==1) event._result={links:cards}; + else player.chooseCardButton('不屈:移去一张“创”',true,cards).set('ai',function(button){ var buttons=get.selectableButtons(); for(var i=0;i0&&!player.hasSkill('guhuo_phase')); @@ -7554,6 +7480,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, precontent:function(){ player.logSkill('xinfu_guhuo'); + player.addTempSkill('guhuo_guess'); var card=event.result.cards[0]; event.result.card.suit=get.suit(card); event.result.card.number=get.number(card); @@ -7709,22 +7636,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, chanyuan:{ init:function(player,skill){ + if(player.hp==1) player.logSkill(skill); player.addSkillBlocker(skill); }, onremove:function(player,skill){ player.removeSkillBlocker(skill); }, - charlotte:true, - locked:true, skillBlocker:function(skill,player){ return skill!='chanyuan'&&skill!='rechanyuan'&&!lib.skill[skill].charlotte&&player.hp==1; }, - audio:2, - trigger:{player:'changeHp'}, - filter:function(event,player){ - return event.num<0&&player.hp==1; - }, - content:function(){}, mark:true, intro:{ content:function(storage,player,skill){ @@ -7734,8 +7654,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); if(list.length) str+=('
  • 失效技能:'+get.translation(list)) return str; - } - } + }, + }, + audio:2, + trigger:{player:'changeHp'}, + filter:function(event,player){ + return player.hp==1; + }, + forced:true, + content:function(){}, }, guhuo_phase:{}, }, @@ -7765,12 +7692,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huangzhong:['re_huangzhong','ol_huangzhong','sb_huangzhong','huangzhong','jsrg_huangzhong'], weiyan:['re_weiyan','ol_weiyan','weiyan'], zhoutai:['zhoutai','xin_zhoutai','old_zhoutai'], - xiaoqiao:['xiaoqiao','ol_xiaoqiao','re_xiaoqiao','old_xiaoqiao'], + xiaoqiao:['xiaoqiao','ol_xiaoqiao','re_xiaoqiao','sb_xiaoqiao','old_xiaoqiao'], yuji:['xin_yuji','re_yuji','yuji'], zhangjiao:['sp_zhangjiao','re_zhangjiao','sb_zhangjiao','zhangjiao'], dianwei:['dianwei','ol_dianwei','re_dianwei'], xunyu:['xunyu','ol_xunyu','re_xunyu'], - sp_zhugeliang:['sp_zhugeliang','ol_sp_zhugeliang','re_sp_zhugeliang'], + sp_zhugeliang:['sp_zhugeliang','ol_sp_zhugeliang','re_sp_zhugeliang','sb_sp_zhugeliang'], pangtong:['pangtong','ol_pangtong','re_pangtong','sb_pangtong'], re_jsp_pangtong:['re_jsp_pangtong','jsrg_pangtong','sp_pangtong'], taishici:['taishici','re_taishici'], @@ -7798,7 +7725,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhugezhan:['zhugezhan','old_zhugezhan'], ol_lusu:['re_lusu','ol_lusu'], zhanghe:['zhanghe','re_zhanghe','sb_zhanghe'], - yl_luzhi:['yl_luzhi','tw_yl_luzhi'], + yl_luzhi:['yl_luzhi','sb_yl_luzhi','tw_yl_luzhi'], sunliang:['sunliang','xin_sunliang'], }, translate:{ @@ -7874,6 +7801,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ drlt_wanglie:"往烈", drlt_wanglie_info:"①出牌阶段,你使用的第一张牌无距离限制。②当你于出牌阶段内使用牌时,你可以令此牌不能被响应,然后你于本阶段内不能再使用牌。", "drlt_xiongluan":"雄乱", + drlt_xiongluan1:'雄乱', "drlt_xiongluan_info":"限定技,出牌阶段,你可以废除你的判定区和装备区,然后指定一名其他角色。直到回合结束,你对其使用牌无距离和次数限制,其不能使用和打出手牌。", "drlt_congjian":"从谏", "drlt_congjian_info":"当你成为锦囊牌的目标时,若此牌的目标数大于1,则你可以交给其中一名其他目标角色一张牌,然后摸一张牌,若你给出的是装备牌,改为摸两张牌。", @@ -7935,10 +7863,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ fangquan:'放权', ruoyu:'若愚', qiaobian:'巧变', - qiaobian1:'巧变·判定', - qiaobian2:'巧变·摸牌', - qiaobian3:'巧变·出牌', - qiaobian4:'巧变·弃牌', tuntian:'屯田', tuntian_bg:'田', zaoxian:'凿险', @@ -7953,8 +7877,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ duanchang:'断肠', // fushen:'附身', huashen:'化身', - huashen1:'化身', - huashen2:'化身', xinsheng:'新生', qimou:'奇谋', xinqiangxi:'强袭', @@ -7972,7 +7894,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xiangle_info:'锁定技,当其他角色使用【杀】指定你为目标时,其需弃置一张基本牌,否则此【杀】对你无效。', fangquan_info:'你可跳过你的出牌阶段,若如此做,回合结束时,你可以弃置一张手牌并令一名其他角色进行一个额外的回合。', ruoyu_info:'主公技,觉醒技,准备阶段,若你的体力是全场最少的(或之一),你须增加1点体力上限并回复1点体力,然后获得技能〖激将〗。', - qiaobian_info:'你可以弃置一张手牌并跳过自己的一个阶段(准备阶段和结束阶段除外);若你以此法跳过了摸牌阶段,则你可以获得至多两名其他角色的各一张手牌;若你以此法跳过了出牌阶段,则你可以移动场上的一张牌。', + qiaobian_info:'你可以弃置一张手牌并跳过自己的一个阶段(准备阶段和结束阶段除外)。若你以此法跳过了摸牌阶段,则你可以获得至多两名其他角色的各一张手牌;若你以此法跳过了出牌阶段,则你可以移动场上的一张牌。', tuntian_info:'①当你于回合外失去牌后,你可以判定。若判定结果不为♥,则你将此牌置于你的武将牌上,称为“田”。②你计算与其他角色的距离时-X(X为你武将牌上“田”的数目)。', zaoxian_info:'觉醒技,准备阶段,若你武将牌上“田”的数量达到3张或更多,则你减1点体力上限,并获得技能〖急袭〗。', jiang_info:'每当你使用(指定目标后)或被使用(成为目标后)一张【决斗】或红色的【杀】时,你可以摸一张牌。', @@ -8072,6 +7994,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qiangxi:'强袭', tianyi:'天义', shuangxiong:'双雄', + shuangxiong1:'双雄', shuangxiong2:'双雄', luanji:'乱击', xueyi:'血裔', diff --git a/character/shiji.js b/character/shiji.js index 5c17188f5..7845bbdbc 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -14,9 +14,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, character:{ liuba:['male','shu',3,['duanbi','tongduo']], - sp_zhujun:['male','qun',4,['yangjie','zjjuxiang','houfeng']], + sp_zhujun:['male','qun',4,['xinyangjie','xinjuxiang','houfeng']], sp_huangfusong:['male','qun',4,['spzhengjun','spshiji','sptaoluan']], - sp_lvfan:['male','wu',3,['spdiaodu','spdiancai','spyanji']], + sp_lvfan:['male','wu',3,['mbdiaodu','mbdiancai','spyanji']], sp_jiangqing:['male','wu',4,['spjianyi','spshangyi']], sp_jiangwan:['male','shu',3,['spzhenting','spjincui']], sp_zhangchangpu:['female','wei',3,['spdifei','spyanjiao']], @@ -244,6 +244,68 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{expose:10}, }, + xinyangjie: { + audio: 'yangjie', + enable: 'phaseUse', + filter: function (event, player) { + return game.hasPlayer(function (target) { + return player.canCompare(target); + }); + }, + filterTarget: function (card, player, target) { + return player.canCompare(target); + }, + usable: 1, + content: function () { + 'step 0' + player.chooseToCompare(target).set('small', true); + 'step 1' + if (!result.bool && game.hasPlayer(function (current) { + return current != player && current != target && current.canUse({ name: 'sha', nature: 'fire', isCard: true }, target, false); + })) { + player.chooseTarget('佯解:是否选择另一名其他角色?', '令其视为对' + get.translation(target) + '使用一张火【杀】', function (card, player, target) { + return target != player && target != _status.event.getParent().target; + }).set('ai', function (target) { + var player = _status.event.player, target2 = _status.event.getParent().target; + return get.effect(target2, { name: 'sha', nature: 'fire', isCard: true }, target, player); + }); + } + else event.finish(); + 'step 2' + if (result.bool) { + var source = result.targets[0]; + player.line(source); + game.log(player, '选择了', source); + var card = { name: 'sha', nature: 'fire', isCard: true }; + if (target.isIn() && source.isIn() && source.canUse(card, target, false)) source.useCard(card, target, false, 'noai'); + } + }, + ai: { + order: 3, + result: { + target: function (player, target) { + var hs = player.getCards('h').sort(function (a, b) { + return a.number - b.number; + }); + var ts = target.getCards('h').sort(function (a, b) { + return a.number - b.number; + }); + if (!hs.length || !ts.length) return 0; + if (hs[0].number <= ts[0].number) return -3; + if (player.countCards('h') >= target.countCards('h')) return -10; + return -1; + }, + }, + }, + }, + xinjuxiang: { + audio: 'zjjuxiang', + inherit: 'zjjuxiang', + content: function () { + player.awakenSkill('xinjuxiang'); + trigger.player.damage(); + }, + }, houfeng:{ audio:3, group:'houfeng_zhengsu', @@ -435,6 +497,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ evt.finish(); evt._triggered=null; + if(evt.name.startsWith('pre_')){ + var evtx=evt.getParent(); + evtx.finish(); + evtx._triggered=null; + } var nexts=trigger.next.slice(); for(var next of nexts){ if(next.name=='judgeCallback') trigger.next.remove(next); @@ -577,6 +644,109 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.delayx(); }, }, + mbdiaodu: { + audio: 'spdiaodu', + trigger: { player: 'phaseZhunbeiBegin' }, + filter: function (event, player) { + return game.hasPlayer(function (target) { + return target.countCards('e', function (card) { + return game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card); + }); + }); + }); + }, + direct: true, + content: function () { + 'step 0' + player.chooseTarget(get.prompt2('mbdiaodu'), function (card, player, target) { + return target.countCards('e', function (card) { + return game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card); + }); + }); + }).set('ai', function (target) { + var player = _status.event.player, att = get.attitude(player, target); + if (att > 0) { + if (target.hasCard(function (card) { + if (get.value(card, target) <= 0 && game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card, false) && get.effect(current, card, player, player) > 0; + })) return true; + return false; + }, 'e')) return 2 * att; + } + else if (att < 0) { + if (target.hasCard(function (card) { + if (get.value(card, target) >= 4.5 && game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card) && get.effect(current, card, player, player) > 0; + })) return true; + return false; + }, 'e')) return -att; + } + return 0; + }) + 'step 1' + if (result.bool) { + var target = result.targets[0]; + event.target = target; + player.logSkill('mbdiaodu', target); + } + else event.finish(); + 'step 2' + var es = target.getCards('e', function (card) { + return game.hasPlayer(function (current) { + return current != target && current.canEquip(card); + }) + }); + if (es.length == 1) event._result = { bool: true, links: es }; + else player.chooseButton(['移动' + get.translation(target) + '的一张装备牌', es], true).set('ai', function (button) { + var player = _status.event.player, target = _status.event.getParent().target, card = button.link; + if (game.hasPlayer(function (current) { + return current != player && current != target && current.canEquip(card) && get.effect(current, card, player, player) > 0; + })) return -get.value(card, target) * get.attitude(player, target); + return 0; + }); + 'step 3' + if (result.bool) { + event.card = result.links[0]; + player.chooseTarget('请选择' + get.translation(event.card) + '的移动目标', true, function (card, player, target) { + return target != player && target.canEquip(_status.event.card); + }).set('card', event.card).set('ai', function (target) { + var evt = _status.event; + return get.effect(target, evt.getParent().card, evt.player, evt.player); + }); + } + else event.finish(); + 'step 4' + if (result.bool) { + var target2 = result.targets[0]; + target.line(target2); + target.$give(card, target2); + game.delay(0.5); + target2.equip(card); + } + else event.finish(); + 'step 5' + target.draw(); + }, + }, + mbdiancai: { + audio: 'spdiancai', + trigger: { global: 'phaseUseEnd' }, + filter: function (event, player) { + if (_status.currentPhase == player) return false; + var num = 0; + player.getHistory('lose', function (evt) { + if (evt.cards2 && evt.getParent('phaseUse') == event) num += evt.cards2.length; + }); + return num >= player.hp && player.countCards('h') < player.maxHp; + }, + frequent: true, + content: function () { + var num = player.maxHp - player.countCards('h'); + if (num > 0) player.draw(num); + }, + }, spyanji:{ audio:3, group:'spyanji_zhengsu', @@ -1464,15 +1634,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'useCard1'}, forced:true, filter:function(event,player){ - if(event.card.name!='sha'||!event.cards||event.cards.length!=1) return false; + if(event.card.name!='sha'||!event.cards||!event.cards.length) return false; var evt=event.getParent('phaseUse'); return evt&&evt.player==player&&player.getHistory('useCard',function(evt2){ - return evt2.card.name=='sha'&&evt.cards&&evt.cards.length==1&&evt2.getParent('phaseUse')==evt; + return evt2.card.name=='sha'&&evt2.cards&&evt2.cards.length&&evt2.getParent('phaseUse')==evt; }).indexOf(event)==0; }, content:function(){ game.log(player,'将',trigger.card,'的花色改为','#y♦'); trigger.card.suit='diamond'; + trigger.card.color='red'; }, group:'liubing_gain', subSkill:{ @@ -2053,7 +2224,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!list.contains(type)){ list.push(type); cards.push(ui.cardPile.childNodes[i]) - }; + } } player.gain(cards,'gain2').gaintag.add('zhangming'); player.addTempSkill('zhangming_keep'); @@ -4051,13 +4222,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ intro:{content:'上次受到伤害的花色:$'}, ai:{ effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - var color=get.suit(card); - if(color=='none') return; - var all=target.getAllHistory('damage'); + target:(card,player,target)=>{ + if(typeof card==='object'&&get.tag(card,'damage')){ + let suit=get.suit(card); + if(suit==='none') return; + let all=target.getAllHistory('damage'); if(!all.length||!all[all.length-1].card) return; - if(get.suit(all[all.length-1].card)==color) return 'zerotarget'; + if(get.suit(all[all.length-1].card)===suit) return 'zeroplayertarget'; } }, }, @@ -4860,7 +5031,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!list.contains(type)){ list.push(type); cards.push(ui.cardPile.childNodes[i]) - }; + } } player.gain(cards,'gain2'); } @@ -4960,8 +5131,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ onunmark:'throw', }, ai:{ - order:1, - result:{target:-1}, + order:1, + result:{target:-1}, }, subSkill:{ equip:{ @@ -5420,17 +5591,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, fyjianyu:{ - init:function(player){ - if(!lib.skill['fyjianyu_'+player.playerid]){ - lib.skill['fyjianyu_'+player.playerid]={ + initSkill:function(skill){ + if(!lib.skill[skill]){ + lib.skill[skill]={ marktext:'喻', intro:{ markcount:()=>1, content:'指定另一名有“喻”的角色为目标时,其摸一张牌', }, }; - lib.translate['fyjianyu_'+player.playerid]='谏喻'; - lib.translate['fyjianyu_'+player.playerid+'_bg']='喻'; + lib.translate[skill]='谏喻'; + lib.translate[skill+'_bg']='喻'; } }, audio:2, @@ -5446,8 +5617,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, selectTarget:2, content:function(){ + var skill='fyjianyu_'+player.playerid; + game.broadcastAll(lib.skill.fyjianyu.initSkill,skill); player.addTempSkill('fyjianyu_draw',{player:'phaseBegin'}); - target.addMark('fyjianyu_'+player.playerid,1); + target.addMark(skill,1); }, ai:{ order:0.1, @@ -6286,10 +6459,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }; if(!targets.length){ if(get.attitude(player,target)<0){ - if(target.countCards('e',function(card){ + if(target.countCards('e',function(card){ return get.value(card,target)<=0; })) return 1; - if(game.hasPlayer(function(current){ + if(game.hasPlayer(function(current){ return current.countCards('h',fh)==target.countCards('h',fh)-2; })) return -2; if(game.hasPlayer(function(current){ @@ -6356,7 +6529,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhouchu:['jin_zhouchu','zhouchu','tw_zhouchu'], liuzhang:['liuzhang','tw_liuzhang'], chenzhen:['sp_chenzhen','tw_chenzhen'], - feiyi:['feiyi','tw_feiyi'], + feiyi:['ol_feiyi','feiyi','tw_feiyi'], wangling:['wangling','tw_wangling'], qiaogong:['qiaogong','tw_qiaogong'], sp_chendong:['sp_chendong','tw_chendong','chendong'], @@ -6440,7 +6613,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spwanwei_info:'每轮累计限一次。①出牌阶段,你可选择一名其他角色。②当有其他角色处于濒死状态时。你可令该角色回复X+1点体力(至少回复至1),然后你失去X点体力。(X为你的体力值)', spyuejian:'约俭', spyuejian_info:'锁定技,你的手牌上限基数等于你的体力上限。当你处于濒死状态时,你可弃置两张牌,然后回复1点体力。', - feiyi:'费祎', + feiyi:'手杀费祎', + feiyi_prefix:'手杀', reshengxi:'生息', reshengxi_info:'结束阶段,若你于本回合内未造成过伤害,则你可摸两张牌。', fyjianyu:'谏喻', @@ -6466,7 +6640,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ heji:'合击', heji_info:'当有角色使用的【决斗】或红色【杀】结算完成后,若此牌对应的目标数为1,则你可以对相同的目标使用一张【杀】或【决斗】(无距离和次数限制)。若你以此法使用的牌不为转化牌,则你从牌堆中随机获得一张红色牌。', liubing:'流兵', - liubing_info:'锁定技。①你于出牌阶段使用的第一张有唯一对应实体牌的【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。', + liubing_info:'锁定技。①你于出牌阶段使用的第一张非虚拟【杀】的花色视为♦。②其他角色于其出牌阶段内使用的非转化黑色杀结算结束后,若此【杀】未造成伤害,则你获得之。', sp_mifuren:'手杀糜夫人', spcunsi:'存嗣', spcunsi2:'存嗣', @@ -6659,6 +6833,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spdiaodu_info:'准备阶段,你可令一名角色摸一张牌,然后移动其装备区内的一张牌。', spdiancai:'典财', spdiancai_info:'其他角色的结束阶段开始时,你可以令至多X名角色各摸一张牌(X为你本回合失去的手牌数)。', + mbdiaodu:'调度', + mbdiaodu_info:'准备阶段,你可以移动一名角色装备区内的一张牌(不能移动给自己),然后其摸一张牌。', + mbdiancai:'典财', + mbdiancai_info:'其他角色的出牌阶段阶段结束后,若你本阶段失去的牌数不小于你的体力值,则你可将手牌数补至体力上限。', spyanji:'严纪', spyanji_info:'出牌阶段开始时,你可以进行“整肃”。', sp_huangfusong:'手杀皇甫嵩', @@ -6673,6 +6851,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yangjie_info:'出牌阶段限一次,你可以摸一张牌并和一名其他角色A拼点。当你以此法展示你的拼点牌时,你令此牌点数-X(X为你已损失的体力值)。若你没赢,则你可以令另一名其他角色B获得两张拼点牌,然后其视为对A使用一张火【杀】。', zjjuxiang:'拒降', zjjuxiang_info:'限定技。一名其他角色脱离濒死状态时,你可以对其造成1点伤害,然后摸X张牌(X为其体力上限且至多为5)。', + xinyangjie:'佯解', + xinyangjie_info:'出牌阶段限一次,你可以与一名其他角色A拼点。若你没赢,则你可以令另一名其他角色B视为对A使用一张火【杀】。', + xinjuxiang:'拒降', + xinjuxiang_info:'限定技,一名其他角色脱离濒死状态时,你可以对其造成1点伤害。', houfeng:'厚俸', houfeng_info:'每轮限一次。一名其他角色的出牌阶段开始时,若其在你的攻击范围内,则你可以令其进行“整肃”。然后当其于本回合内因整肃而摸牌或回复体力后,你获得相同的整肃奖励。', liuba:'手杀刘巴', diff --git a/character/sp.js b/character/sp.js index 26b77f536..f9224f2e3 100755 --- a/character/sp.js +++ b/character/sp.js @@ -9,7 +9,7 @@ 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','caoxi'], sp_tianzhu:['zhangyan','niujin','hejin','hansui',"wutugu","yanbaihu","shamoke","zhugedan",'huangzu','gaogan',"tadun","fanjiangzhangda","ahuinan","dongtuna",'ol_wenqin'], sp_nvshi:["lingju","guanyinping","zhangxingcai","mayunlu","dongbai","zhaoxiang",'ol_zhangchangpu',"daxiaoqiao","jin_guohuai"], - sp_shaowei:["simahui","zhangbao","zhanglu","zhugeguo","xujing","zhangling",'huangchengyan','zhangzhi','lushi'], + sp_shaowei:['lvboshe',"simahui","zhangbao","zhanglu","zhugeguo","xujing","zhangling",'huangchengyan','zhangzhi','lushi'], sp_huben:['duanjiong','ol_mengda',"caohong","xiahouba","zhugeke","zumao","wenpin","litong","mazhong","heqi","quyi","luzhi","zangba","yuejin","dingfeng","wuyan","ol_zhuling","tianyu","huojun",'zhaoyǎn','dengzhong','ol_furong','macheng','ol_zhangyì','ol_zhujun','maxiumatie','luoxian','ol_huban','haopu','ol_qianzhao'], sp_liesi:['mizhu','weizi','ol_liuba','zhangshiping'], sp_default:["sp_diaochan","sp_zhaoyun","sp_sunshangxiang","sp_caoren","sp_jiangwei","sp_machao","sp_caiwenji","jsp_guanyu","jsp_huangyueying","sp_pangde","sp_jiaxu","yuanshu",'sp_zhangliao','sp_ol_zhanghe','sp_menghuo'], @@ -18,7 +18,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_zhongdan:["cuiyan","huangfusong"], sp_guozhan2:["sp_dongzhuo","liqueguosi","zhangren"], sp_others:["hanba","caiyang"], - sp_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_feiyi','lvboshe','ol_dingshangwan','ol_liwan'], + sp_waitforsort:['ol_luyusheng','ol_pengyang','ol_tw_zhangji','ol_feiyi','ol_dingshangwan','ol_liwan','ol_liuyan'], }, }, characterFilter:{ @@ -34,7 +34,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_dingshangwan:['female','wei',3,['olfudao','olfengyan']], zhangyan:['male','qun',4,['olsuji','ollangdao']], ol_tw_zhangji:['male','wei',3,['skill_zhangji_A','skill_zhangji_B'],['unseen']], - ol_feiyi:['male','shu',3,['skill_feiyi_A','skill_feiyi_B'],['unseen']], + ol_feiyi:['male','shu',3,['yanru','hezhong']], lvboshe:['male','qun',4,['olfushi','oldongdao']], ol_luyusheng:['female','wu',3,['olcangxin','olrunwei']], caoxi:['male','wei',3,['olgangshu','oljianxuan']], @@ -49,7 +49,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ haopu:['male','shu',4,['olzhenying']], ol_mengda:['male','shu',4,['olgoude']], ol_wanglang:['male','wei',3,['gushe','oljici']], - ol_liuyan:['male','qun','4/6',['olpianan','olyinji','olkuisi'],['unseen']], + ol_liuyan:['male','qun','4/6',['olpianan','olyinji','olkuisi']], lushi:['female','qun',3,['olzhuyan','olleijie']], zhangshiping:['male','shu',3,['olhongji','olxinggu']], sunhong:['male','wu',3,['olxianbi','olzenrun']], @@ -703,6 +703,38 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //OL飞扬 + olfeiyang:{ + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return player.countCards('he',card=>{ + if(_status.connectMode&&get.position(card)=='h') return true; + return lib.filter.cardDiscardable(card,player); + })>=3&&player.countCards('j'); + }, + direct:true, + //limited:true, + //skillAnimation:true, + //animationColor:'orange', + content:function(){ + 'step 0' + player.chooseToDiscard(get.prompt2('olfeiyang'),'he',3).set('ai',function(card){ + var player=_status.event.player; + if(player.hasCard(function(card){ + return get.effect(player,{ + name:card.viewAs||card.name, + cards:[card], + },player,player)<0; + },'j')) return 6-get.value(card); + return 0; + }).set('logSkill','olfeiyang'); + 'step 1' + if(result.bool){ + //player.awakenSkill('olfeiyang'); + player.discardPlayerCard(player,'j',true); + } + }, + }, //李婉 ollianju:{ audio:2, @@ -749,7 +781,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!i) continue; str+='
    '; str+=get.translation(target)+'的下个结束阶段,其可令你获得其本回合使用的最后一张牌对应的所有位于弃牌堆的实体牌'; - str+=',然后若此牌名为'+get.translation(player.storage.ollianju_effect[i])+',则你失去1点体力'; + str+=',然后若此牌名为'+get.translation(player.storage.ollianju_effect[i])+',则你失去1点体力,否则你可以视为使用'+get.translation(player.storage.ollianju_effect[i]); } } return str; @@ -779,10 +811,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger.player.chooseBool(get.prompt('ollianju',player),'令'+get.translation(player)+'获得'+get.translation(evt.cards.filterInD('d'))+(event.list.contains(evt.card.name)?',然后'+get.translation(player)+'失去1点体力':'')).set('choice',get.attitude(trigger.player,player)>0&&(!event.list.contains(evt.card.name)||player.getHp()>1)); 'step 2' if(result.bool){ - var evt=event.evt; + var evt=event.evt,cards=evt.cards.filterInD('d'); trigger.player.line(player); - player.gain(evt.cards.filterInD('d'),'gain2'); + player.gain(cards,'gain2'); if(event.list.contains(evt.card.name)) player.loseHp(); + else{ + var card={ + name:evt.card.name, + isCard:true, + }; + if(player.hasUseTarget(card)) player.chooseUseTarget(card,false); + } } }, }, @@ -797,13 +836,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function(event,player){ var name=player.storage.ollianju; if(!name) return false; - if(event.getg) return event.getg(player).some(card=>card.name==name); - return event.getl(player).cards2.some(card=>card.name==name); + if(event.getg) return event.getg(player).some(card=>card.name==name)&&!player.hasSkill('olsilv_gain'); + return event.getl(player).cards2.some(card=>card.name==name)&&!player.hasSkill('olsilv_lose'); }, forced:true, - usable:1, content:function(){ 'step 0' + player.addTempSkill('olsilv'+(trigger.getg?'gain':'lose')); if(!trigger.visible){ var cards,name=player.storage.ollianju; if(trigger.getg) cards=trigger.getg(player).filter(card=>card.name==name); @@ -814,6 +853,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.draw(); }, ai:{combo:'ollianju'}, + subSkill:{ + gain:{charlotte:true}, + lose:{charlotte:true}, + }, }, //丁尚涴 olfudao:{ @@ -829,27 +872,44 @@ game.import('character',function(lib,game,ui,get,ai,_status){ locked:false, content:function(){ 'step 0' - var list=[],num=player.countCards('he'); - for(var i=-4;i<=4;i++){ - if(num+i<0||i==0) continue; - list.push(i); - } - player.chooseControl(list).set('prompt','讽言:请选择一个数字').set('prompt2','令此数值作为调整的手牌数值').set('ai',function(){ - var list=[],num=_status.event.player.countCards('he'); - for(var i=-4;i<=4;i++){ - if(num+i<0||i==0) continue; - if(i>0&&i!=4) continue; - list.push(i); - } - return list.randomGet(); - }); + player.draw(3); 'step 1' - var num=result.control - player.popup(num); - if(num>0) player.draw(num); - else player.chooseToDiscard('he',true,-num); + var num=player.countCards('h'); + if(num>0){ + player.chooseCardTarget({ + prompt:'抚悼:将至多三手张牌交给一名其他角色', + selectCard:[1,3], + filterCard:true, + filterTarget:lib.filter.notMe, + position:'h', + forced:true, + ai1:function(card){ + if(card.name=='du') return 10; + else if(ui.selected.cards.length&&ui.selected.cards[0].name=='du') return 0; + var player=_status.event.player; + if(ui.selected.cards.length>4||!game.hasPlayer(function(current){ + return get.attitude(player,current)>0&&!current.hasSkillTag('nogain'); + })) return 0; + return 1/Math.max(0.1,get.value(card)); + }, + ai2:function(target){ + var player=_status.event.player,att=get.attitude(player,target); + if(ui.selected.cards[0].name=='du') return -att; + if(target.hasSkillTag('nogain')) att/=6; + return att; + }, + }); + } + else event.goto(3); 'step 2' - player.storage.olfudao=player.countCards('he'); + if(result.bool){ + player.give(result.cards,result.targets[0]); + } + 'step 3' + var num=player.countCards('h'); + if(num>0) player.chooseToDiscard('h',[1,num],'抚悼:弃置任意张手牌,然后记录手牌数'); + 'step 4' + player.storage.olfudao=player.countCards('h'); player.markSkill('olfudao'); }, intro:{ @@ -1396,24 +1456,34 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, //费祎 - skill_feiyi_A:{ + yanru:{ audio:2, enable:'phaseUse', filter:function(event,player){ + if(!player.countCards('h')) return false; var num=player.countCards('h')%2; - if(num==0&&!player.countCards('h')) return false; - return !player.hasSkill('skill_feiyi_A_'+num); + return !player.hasSkill('yanru_'+num); }, filterCard:function(card,player){ - return player.countCards('h')%2==0; + if(player.countCards('h')&&player.countCards('h')%2==0) return lib.filter.cardDiscardable(card,player); + return false; }, selectCard:function(){ var player=_status.event.player; - if(player.countCards('h')%2==0) return [player.countCards('h')/2,Infinity]; + if(player.countCards('h')&&player.countCards('h')%2==0) return [player.countCards('h')/2,Infinity]; return -1; }, + prompt:function(){ + var player=_status.event.player; + return [ + (player.countCards('h')?'弃置至少一半的手牌,然后':'')+'摸三张牌', + '摸三张牌,然后弃置至少一半的手牌', + + ][player.countCards('h')%2]; + }, check:function(card){ - if(player.hasSkill('skill_feiyi_B')){ + var player=_status.event.player; + if(player.hasSkill('hezhong')){ if(player.countCards('h')-ui.selected.cards.length>1) return 1/(get.value(card)||0.5); return 0; } @@ -1421,20 +1491,21 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 0; }, complexCard:true, + discard:false, + lose:false, delay:0, content:function(){ 'step 0' - player.addTempSkill('skill_feiyi_A_'+(cards.length?'0':'1'),'phaseUseAfter'); - if(cards.length){ - player.draw(3) - event.finish(); - } - else player.draw(3); + var bool=player.countCards('h')%2; + if(cards) player.discard(cards); + player.addTempSkill('yanru_'+bool,'phaseUseAfter'); + player.draw(3); + if(!bool) event.finish(); 'step 1' - player.chooseToDiscard('h','技能:弃置至少一半手牌',[Math.floor(player.countCards('h')/2),Infinity],true).set('ai',card=>{ + player.chooseToDiscard('h','宴如:弃置至少一半手牌',[Math.floor(player.countCards('h')/2),Infinity],true).set('ai',card=>{ var player=_status.event.player; - if(player.hasSkill('skill_feiyi_B')&&player.countCards('h')-ui.selected.cards.length>1) return 1/(get.value(card)||0.5); - if(!player.hasSkill('skill_feiyi_B')&&ui.selected.cards.length1) return 1/(get.value(card)||0.5); + if(!player.hasSkill('hezhong')&&ui.selected.cards.length0; }, prompt2:function(event,player){ var str='展示最后一张手牌并摸一张牌'; - if(!player.hasSkill('skill_feiyi_B_0')||!player.hasSkill('skill_feiyi_B_0')){ + if(!player.hasSkill('hezhong_0')||!player.hasSkill('hezhong_0')){ str+=',然后令本回合使用点数'; - if(!player.hasSkill('skill_feiyi_B_0')) str+='大于'; - if(!player.hasSkill('skill_feiyi_B_0')&&!player.hasSkill('skill_feiyi_B_0')) str+='或'; - if(!player.hasSkill('skill_feiyi_B_1')) str+='小于'; + if(!player.hasSkill('hezhong_0')) str+='大于'; + if(!player.hasSkill('hezhong_0')&&!player.hasSkill('hezhong_0')) str+='或'; + if(!player.hasSkill('hezhong_1')) str+='小于'; str+=get.number(player.getCards('h')[0],player); - str+='的牌额外结算一次'; + str+='的普通锦囊牌额外结算一次'; } return str; }, @@ -1479,23 +1551,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' player.draw(); 'step 2' - if(player.hasSkill('skill_feiyi_B_0')) event._result={index:1}; - else if(player.hasSkill('skill_feiyi_B_1')) event._result={index:0}; + if(player.hasSkill('hezhong_0')) event._result={index:1}; + else if(player.hasSkill('hezhong_1')) event._result={index:0}; else{ player.chooseControl().set('choiceList',[ - '本回合使用点数大于'+num+'的牌额外结算一次', - '本回合使用点数小于'+num+'的牌额外结算一次', + '本回合使用点数大于'+num+'的普通锦囊牌额外结算一次', + '本回合使用点数小于'+num+'的普通锦囊牌额外结算一次', ]).set('ai',()=>{ var player=_status.event.player; var num=_status.event.player; if(player.getCards('h').reduce(function(num,card){ - return num=(get.number(card,player)||0); + return num+(get.number(card,player)||0); },0)>num*2) return 0; return 1; }).set('num',num); } 'step 3' - var skill='skill_feiyi_B_'+result.index; + var skill='hezhong_'+result.index; player.addTempSkill(skill); player.markAuto(skill,[num]); }, @@ -1503,42 +1575,70 @@ game.import('character',function(lib,game,ui,get,ai,_status){ '0':{ charlotte:true, onremove:true, - marktext:'技', + marktext:'>', intro:{ - markcount:()=>0, - content:'使用点数大于$的牌额外结算一次', + markcount:(list)=>{ + var list2=[1,11,12,13]; + return list.reduce((str,num)=>{ + if(list2.includes(num)) return str+['A','J','Q','K'][list2.indexOf(num)]; + return str+parseFloat(num); + },''); + }, + content:'使用点数大于$的普通锦囊牌额外结算一次', }, - audio:'skill_feiyi_B', + audio:'hezhong', trigger:{player:'useCard'}, filter:function(event,player){ + if(get.type(event.card)!='trick') return false; var num=get.number(event.card,player); - return typeof num=='number'&&player.getStorage('skill_feiyi_B_0').some(numx=>num>numx); + return typeof num=='number'&&player.getStorage('hezhong_0').some(numx=>num>numx); }, forced:true, content:function(){ trigger.effectCount++; game.log(trigger.card,'额外结算一次'); }, + ai:{ + effect:{ + player:function(card,player,target){ + if(card.name=='tiesuo') return 'zerotarget'; + }, + }, + }, }, '1':{ charlotte:true, onremove:true, - marktext:'能', + marktext:'<', intro:{ - markcount:()=>0, - content:'使用点数小于$的牌额外结算一次', + markcount:(list)=>{ + var list2=[1,11,12,13]; + return list.reduce((str,num)=>{ + if(list2.includes(num)) return str+['A','J','Q','K'][list2.indexOf(num)]; + return str+parseFloat(num); + },''); + }, + content:'使用点数小于$的普通锦囊牌额外结算一次', }, - audio:'skill_feiyi_B', + audio:'hezhong', trigger:{player:'useCard'}, filter:function(event,player){ + if(get.type(event.card)!='trick') return false; var num=get.number(event.card,player); - return typeof num=='number'&&player.getStorage('skill_feiyi_B_1').some(numx=>numnum重铸任意“缚豕”牌,视为使用一张【杀】并执行等量项', + '###缚豕###
    将任意“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并执行等量项
    ', player.getExpansions('olfushi'), [['额外目标','伤害-1','伤害+1'],'tdnodes'], 'hidden' @@ -1686,7 +1786,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ delete event.result.skill; event.result.card=new lib.element.VCard(lib.skill.olfushi_wusheng_backup.viewAs); event.result.cards=[]; - player.recast(cards); + player.loseToDiscardpile(cards); + player.draw(cards.length); event.result.card.storage.olfushi_buff=controls; player.addTempSkill('olfushi_buff'); } @@ -1695,7 +1796,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ prompt:function(links,player){ let controls=links.filter(button=>typeof button=='string'); if(!controls.length) controls=['额外目标','伤害-1','伤害+1']; - return `选择【杀】的目标(${controls.join('、')})`; + return `请选择【杀】的目标(${controls.join('、')})`; } }, ai:{ @@ -1937,17 +2038,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ switch(get.sgn(get.attitude(player,target))){ case 0: return 2; - break; case 1: if(num1-1>=num2) return 0; if(num1+1<=num2) return 1; return 2; - break; case -1: if(num1-2<=num2) return 0; if(num1+3>=num2) return 1; return 2; - break; } }).set('prompt',get.prompt('olrunwei',trigger.player)); 'step 1' @@ -4514,15 +4612,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ record:{ - trigger:{player:'showCardsEnd'}, + trigger:{global:'showCardsEnd'}, forced:true, charlotte:true, popup:false, firstDo:true, + filter:function(event,player){ + return event.cards.some(i=>get.owner(i)==player); + }, content:function(){ game.broadcastAll(function(cards){ cards.forEach(card=>card.addGaintag('oldaili_tag')); - },trigger.cards); + },trigger.cards.filter(i=>get.owner(i)==player)); + player.markSkill('oldaili'); } }, } @@ -5690,7 +5792,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards1=list[0][1].slice(),cards2=list[1][1].slice(); var card1=cards1.sort((a,b)=>get.value(b)-get.value(a))[0]; var card2=cards2.sort((a,b)=>get.value(a)-get.value(b))[0]; - if(get.value(card1)>get.value(card2)){ + if(card1&&card2&&get.value(card1)>get.value(card2)){ cards1.remove(card1); cards2.remove(card2); cards1.push(card2); @@ -6253,7 +6355,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else used.push(name); } else used.push(name); - }; + } if(info.isRound) break; } var vcards=[]; @@ -7261,7 +7363,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(evt.card.nature) natures.remove(evt.card.nature); } else tricks.remove(name); - }; + } if(info.isRound) break; } var vcards=[]; @@ -7308,7 +7410,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ storage:{cihuang:true}, }; event.card=card; - player.chooseCard('he','雌黄:将一张牌当'+get.translation(card)+'对'+get.translation(trigger.player)+'使用',function(card,player){ + player.chooseCard('hes','雌黄:将一张牌当'+get.translation(card)+'对'+get.translation(trigger.player)+'使用',function(card,player){ return player.canUse(get.autoViewAs(_status.event.getParent().card,[card]),_status.event.target,false); }).set('target',trigger.player).set('ai',function(card){ if(get.effect(_status.event.target,get.autoViewAs(_status.event.getParent().card,[card]),player)<=0) return false; @@ -8022,7 +8124,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'chooseToUse', hiddenCard:function(player,name){ - if(get.type(name)=='basic'&&lib.inpile.contains(name)&&!player.getStorage('yilie_count').contains(name)){ + if(get.type(name)=='basic'&&lib.inpile.contains(name)&&!player.getStorage('yilie_count').includes(name)){ var hs=player.getCards('hs'); if(hs.length<2) return false; var bool=false,map={}; @@ -8053,7 +8155,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } if(!bool) return false; for(var name of lib.inpile){ - if(get.type(name)!='basic'||list.contains(name)) continue; + if(get.type(name)!='basic'||list.includes(name)) continue; var card={name:name}; if(event.filterCard(card,player,event)) return true; if(name=='sha'){ @@ -8068,10 +8170,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ chooseButton:{ dialog:function(event,player){ var list=[]; - var storage=player.storage.yilie_count; + var storage=player.getStorage('yilie_count'); for(var i of lib.inpile){ - if(get.type(i)!='basic') continue; - if(storage&&storage.contains(i)) continue; + if(get.type(i)!='basic'||storage.includes(i)) continue; var card={name:i,isCard:true}; if(event.filterCard(card,player,event)) list.push(['基本','',i]); if(i=='sha'){ @@ -8084,14 +8185,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return ui.create.dialog('义烈',[list,'vcard'],'hidden') }, check:function(button){ - if(button.link[2]=='shan') return 3; var player=_status.event.player; - if(button.link[2]=='jiu'){ - if(player.getUseValue({name:'jiu'})<=0) return 0; - if(player.countCards('h','sha')) return player.getUseValue({name:'jiu'}); - return 0; + var evt=_status.event.getParent(); + var name=button.link[2],card={name:name,nature:button.link[3]}; + if(name=='shan') return 2; + if(evt.type=='dying'){ + if(get.attitude(player,evt.dying)<2) return 0; + if(name=='jiu') return 2.1; + return 1.9; } - return player.getUseValue({name:button.link[2],nature:button.link[3]})/4; + if(evt.type=='phase'){ + if(button.link[2]=='jiu'){ + if(player.getUseValue({name:'jiu'})<=0) return 0; + var cards=player.getCards('hs',cardx=>get.value(cardx)<8); + cards.sort((a,b)=>get.value(a)-get.value(b)); + if(cards.some(cardx=>get.name(cardx)=='sha'&&!cards.slice(0,2).includes(cardx))) return player.getUseValue({name:'jiu'}); + return 0; + } + return player.getUseValue(card)/4; + } + return 1; }, backup:function(links,player){ return { @@ -8127,12 +8240,33 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ order:function(item,player){ - return 2.6; + if(player&&_status.event.type=='phase'){ + var add=false,max=0; + var names=lib.inpile.filter(name=>get.type(name)=='basic'&&!player.getStorage('yilie_count').includes(name)); + if(names.includes('sha')) add=true; + names=names.map(namex=>{return {name:namex}}); + if(add) lib.inpile_nature.forEach(nature=>names.push({name:'sha',nature:nature})); + names.forEach(card=>{ + if(player.getUseValue(card)>0){ + var temp=get.order(card); + if(card.name=='jiu'){ + var cards=player.getCards('hs',cardx=>get.value(cardx)<8); + cards.sort((a,b)=>get.value(a)-get.value(b)); + if(!cards.some(cardx=>get.name(cardx)=='sha'&&!cards.slice(0,2).includes(cardx))) temp=0; + } + if(temp>max) max=temp; + } + }); + if(max>0) max-=0.001; + return max; + } + return 0.5; }, respondShan:true, respondSha:true, fireAttack:true, - skillTagFilter:function(player,tag){ + skillTagFilter:function(player,tag,arg){ + if(arg=='respond') return false; var hs=player.getCards('hs'); if(hs.length<2) return false; var bool=false,map={}; @@ -10512,6 +10646,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, olzaowang:{ mode:['identity'], + available:function(mode){ + if(mode=='identity'&&_status.mode=='purple') return false; + }, audio:2, enable:'phaseUse', limited:true, @@ -11567,11 +11704,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return target.countCards('h')!=ui.selected.targets[0].countCards('h'); }).set('complexTarget',true).set('ai',function(target){ if(!ui.selected.targets.length){ - var player=_status.event.player,hs=target.countCards('h'); - if(game.hasPlayer(function(current){ - return current!=player&¤t!=target&¤t.countCards('h')>hs&&!current.hasMark('quxi_gain')&&!current.hasMark('quxi_lose'); - })) return get.attitude(player,target)/(Math.sqrt(1+target.countCards('h'))); - return 0; + var player=_status.event.player,hs=target.countCards('h'); + if(game.hasPlayer(function(current){ + return current!=player&¤t!=target&¤t.countCards('h')>hs&&!current.hasMark('quxi_gain')&&!current.hasMark('quxi_lose'); + })) return get.attitude(player,target)/(Math.sqrt(1+target.countCards('h'))); + return 0; } if(target.countCards('h')>ui.selected.targets[0].countCards('h')) return -get.attitude(_status.event.player,target); return 0; @@ -11837,7 +11974,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ silent:true, popup:false, filter:function(event,player){ - return player.storage.juguan_draw&&player.storage.juguan_draw.contains(event.source); + return player.storage.juguan_draw&&player.storage.juguan_draw.contains(event.source); }, content:function(){ player.unmarkAuto('juguan_draw',[trigger.source]); @@ -12689,10 +12826,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 5-val; } switch(button.link){ - case 3:return 4.5;break; - case 4:return 4.4;break; - case 5:return 4.3;break; - case 2:return (3-player.hp)*1.5;break; + case 3:return 4.5; + case 4:return 4.4; + case 5:return 4.3; + case 2:return (3-player.hp)*1.5; case 1:{ if(game.hasPlayer(function(current){ return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current)>1; @@ -12703,25 +12840,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } var name=button.link[2]; var evt=_status.event.getParent(); - if(get.type(name)=='basic'){ + if(evt.type=='phase'){ + var card={name:name,nature:button.link[3],isCard:true}; if(name=='shan') return 2; if(evt.type=='dying'){ if(get.attitude(player,evt.dying)<2) return false; if(name=='jiu') return 2.1; return 1.9; } - if(evt.type=='phase') return player.getUseValue({name:name,nature:button.link[3],isCard:true}); - return 1; + return player.getUseValue(card); } - if(!['chuqibuyi','shuiyanqijunx','juedou','nanman','wanjian','shunshou','zhujinqiyuan'].contains(name)) return 0; - var card={name:name,isCard:true}; - if(['shunshou','zhujinqiyuan'].contains(card.name)){ - if(!game.hasPlayer(function(current){ - return get.attitude(player,current)!=0&&get.distance(player,current)<=1&&player.canUse(card,current)&&get.effect(current,card,player,player)>0; - })) return 0; - return player.getUseValue(card)-7; - } - return player.getUseValue(card)-4; + return 1; }, backup:function(links,player){ if(typeof links[1]=='number') links.reverse(); @@ -12765,10 +12894,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var name=(tag=='respondSha'?'sha':'shan'); return !player.storage.youlong2.contains(name); }, - order:1, - result:{ - player:1, + order:function(item,player){ + if(player&&_status.event.type=='phase'){ + var max=0,add=false; + var type=player.storage.youlong?'basic':'trick'; + var list=lib.inpile.filter(name=>get.type(name)==type&&!player.storage.youlong2.includes(name)); + if(list.includes('sha')) add=true; + list=list.map(namex=>{return {name:namex,isCard:true}}); + if(add) lib.inpile_nature.forEach(naturex=>list.push({name:'sha',nature:naturex,isCard:true})); + for(var card of list){ + if(player.getUseValue(card)>0){ + var temp=get.order(card); + if(temp>max) max=temp; + } + } + if(max>0) max+=0.3; + return max; + } + return 1; }, + result:{player:1}, }, }, youlong_true:{charlotte:true}, @@ -12913,7 +13058,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filterCard:{color:'black'}, position:'hes', - audio:'niluan', viewAsFilter:function(player){ return player.countCards('hes',lib.skill.spniluan.filterCard)>0; }, @@ -13422,7 +13566,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ backup:function(links,player){ return { audio:'jingong', - filterCard:true, popname:true, position:'hes', viewAs:{name:links[0][2]}, @@ -13662,7 +13805,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ onremove:true, intro:{ name:'内伐 - 基本牌', - content:'本回合内不能使用锦囊牌和装备牌,且使用【杀】选择目标时可以多选择1个目标,且使用【杀】的目标次数上限+#。', + content:'本回合内不能使用锦囊牌和装备牌,使用【杀】选择目标时可以额外指定一个目标且使用【杀】的目标次数上限+#。', }, mod:{ cardEnabled:function(card,player){ @@ -13722,7 +13865,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, intro:{ name:'内伐 - 非基本牌', - content:'本回合内不能使用基本牌,且使用普通锦囊牌选择目标时可以多选择1个目标,且本回合的出牌阶段内前两次使用装备牌时摸#张牌。' + content:'本回合内不能使用基本牌,使用普通锦囊牌选择目标时可以增加或减少一个目标,且本回合的出牌阶段内前两次使用装备牌时摸#张牌。' }, filter:function(event,player){ if(get.type(event.card)!='trick') return false; @@ -14707,7 +14850,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, forced:true, popup:false, - onremove:true, firstDo:true, init:function(player,skill){ player.storage[skill]=0; @@ -15627,7 +15769,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ backup:function(links,player){ return { audio:'jingong', - filterCard:true, popname:true, position:'hes', viewAs:{name:links[0][2]}, @@ -15668,7 +15809,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, jingong3:{charlotte:true}, weikui:{ - audio:'kuiwei', + audio:2, enable:'phaseUse', usable:1, filterTarget:function(card,player,target){ @@ -15714,7 +15855,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, lizhan:{ - audio:'yanzheng', + audio:2, trigger:{player:'phaseJieshuBegin'}, direct:true, filter:function(event,player){ @@ -17089,16 +17230,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var map={sha:'shan',tao:'jiu',jiu:'tao'} for(var i=0;i(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){ - var temp=get.order({name:name}); - if(temp>max){ - max=temp; - name2=map[name]; - } - } - } - if(name2==get.name(card,player)) return 1; - return 0; + if(player.countCards('hs',map[name])>(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){ + var temp=get.order({name:name}); + if(temp>max){ + max=temp; + name2=map[name]; + } + } + } + if(name2==get.name(card,player)) return 1; + return 0; } return 1; }, @@ -17123,7 +17264,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, onrespond:function(){return this.onuse.apply(this,arguments)}, onuse:function(result,player){ - player.removeMark('fanghun',1); + player.removeMark('fanghun',1); }, ai:{ respondSha:true, @@ -17144,13 +17285,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var map={sha:'shan',tao:'jiu',jiu:'tao'} for(var i=0;i(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){ - var temp=get.order({name:name}); - if(temp>max) max=temp; - } - } - if(max>0) max+=((player.storage.refuhan||player.storage.twfuhan)?0.3:-0.3); - return max; + if(player.countCards('hs',map[name])>(name=='jiu'?1:0)&&player.getUseValue({name:name})>0){ + var temp=get.order({name:name}); + if(temp>max) max=temp; + } + } + if(max>0) max+=((player.storage.refuhan||player.storage.twfuhan)?0.3:-0.3); + return max; } if(!player) player=_status.event.player; return (player.storage.refuhan||player.storage.twfuhan)?4:1; @@ -17231,7 +17372,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, xinyongsi:{ - audio:'yongsi1', + audio:'yongsi', group:['xinyongsi1','xinyongsi2'], locked:true, }, @@ -17588,7 +17729,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else num=get.population('fan'); } else if(mode=='versus'){ - num=player.getEnemies().length; + if(!_status.mode||_status.mode!='two') num=player.getEnemies().length; + else{ + var target=game.findPlayer(x=>{ + var num=x.getFriends().length; + return !game.hasPlayer(y=>{ + return x!=y&&y.getFriends().length>num; + }); + }); + num=(target?target.getFriends(true).length:1); + } } else{ num=1; @@ -17986,7 +18136,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.awakenSkill('yongdi'); target.gainMaxHp(); target.recover(); - var mode=get.mode(); var skills=target.getStockSkills(true,true).filter(skill=>{ if(target.hasSkill(skill)) return false; var info=get.info(skill); @@ -17995,6 +18144,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(skills.length){ for(var i of skills) target.addSkillLog(i); } + if(target.isZhu2()) event.trigger('zhuUpdate'); } }, ai:{expose:0.2}, @@ -19632,6 +19782,41 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addSkill('mashu'); player.addSkill('nuzhan'); player.awakenSkill('danji'); + }, + ai:{ + maixie:true, + skillTagFilter:(player,tag,arg)=>{ + if(tag==='maixie'){ + if(player.hp<2||player.storage.danji||player.hasSkill('nuzhan')||player.countCards('h')!==player.hp) return false; + let zhu=get.zhu(player); + if(zhu&&zhu.isZhu){ + let name=zhu.name; + while(name.indexOf('_')!==-1){ + name=name.slice(name.indexOf('_')+1); + } + if(name.indexOf('liubei')==0) return false; + } + return true; + } + }, + effect:{ + target:(card,player,target)=>{ + let hs=target.countCards('h'); + if(target.hp<3||target.storage.danji||target.hasSkill('nuzhan')||hs>target.hp+1) return; + let zhu=get.zhu(target); + if(zhu&&zhu.isZhu){ + let name=zhu.name; + while(name.indexOf('_')!==-1){ + name=name.slice(name.indexOf('_')+1); + } + if(name.indexOf('liubei')==0) return; + } + if(get.tag(card,'draw')) return 1.6; + if(get.tag(card,'lose')||get.tag(card,'discard')) return [1,-0.8]; + if(hs===target.hp&&get.tag(card,'damage')) return [1,target.hp/3]; + if(hs>target.hp&&target.hp>3&&(card.name==='shan'||card.name==='wuxie')) return 'zeroplayertarget'; + } + } } }, nuzhan:{ @@ -19756,18 +19941,45 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, fenxin:{ - mode:['identity'], + mode:['identity','versus'], available:function(mode){ if(mode=='identity'&&_status.mode=='purple') return false; + if(mode=='versus'&&_status.mode!='two') return false; }, - trigger:{global:'dieAfter'}, + trigger:{global:['dieAfter','damageEnd']}, filter:function(event,player){ - return ['fan','zhong','nei'].contains(event.player.identity)&&!player.hasSkill('fenxin_'+event.player.identity); + var list=['fan','zhong','nei']; + if(get.mode()=='identity') return event.name=='die'&&list.includes(event.player.identity)&&!player.hasSkill('fenxin_'+event.player.identity); + return event.name=='damage'&&event.player!=player&&list.some(identity=>!player.hasSkill('fenxin_'+identity))&&event.player.getHistory('damage').indexOf(event)==0; }, forced:true, + logTarget:'player', content:function(){ - player.addSkill('fenxin_'+trigger.player.identity); - player.markSkill('fenxin'); + 'step 0' + if(get.mode()=='identity'){ + event._result={ + bool:true, + links:['fenxin_'+trigger.player.identity], + }; + } + else{ + player.chooseButton([ + '焚心:请选择〖竭缘〗的升级方式', + [[ + ['fenxin_fan','发动〖竭缘〗增加伤害无体力值限制'], + ['fenxin_zhong','发动〖竭缘〗减少伤害无体力值限制'], + ['fenxin_nei','将〖竭缘〗中的黑色手牌和红色手牌改为一张牌'], + ].filter(list=>!player.hasSkill(list[0])),'textbutton'] + ],true).set('ai',function(button){ + return ['fenxin_fan','fenxin_zhong','fenxin_nei'].indexOf(button.link)+1; + }); + } + 'step 1' + if(result.bool){ + var ideitity=result.links[0]; + player.addSkill(identity); + player.markSkill('fenxin'); + } }, intro:{ mark:function(dialog,content,player){ @@ -19787,9 +19999,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhong:{charlotte:true}, nei:{charlotte:true} }, - ai:{ - combo:'jieyuan' - } + ai:{combo:'jieyuan'}, }, xisheng:{ enable:'chooseToUse', @@ -20721,7 +20931,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ next.set('filterButton',function(button){ if(button.link==2){ return _status.event.bool1; - }; + } return true; }); next.set('bool1',trigger.player.isDamaged()); @@ -21856,12 +22066,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, moukui:{ + audio:2, + audioname:['sp_mushun'], trigger:{player:'useCardToPlayered'}, direct:true, filter:function(event,player){ return event.card.name=='sha'; }, - audio:2, content:function(){ "step 0" var controls=['draw_card']; @@ -22600,9 +22811,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "step 0" event.target=player; event.player=trigger.player; - var prompt; - if(player==event.player) prompt='是否发动【郡兵】摸一张牌?'; - else prompt=('###是否对'+get.translation(event.target)+'发动【郡兵】?###'+(event.player==event.target?'摸一张牌':'摸一张牌,将所有手牌交给该角色,然后该角色交给你等量的手牌')); + var prompt; + if(player==event.player) prompt='是否发动【郡兵】摸一张牌?'; + else prompt=('###是否对'+get.translation(event.target)+'发动【郡兵】?###'+(event.player==event.target?'摸一张牌':'摸一张牌,将所有手牌交给该角色,然后该角色交给你等量的手牌')); event.player.chooseBool(prompt).set('choice',lib.skill.junbing.checkx(event.target,event.player)); "step 1" if(!result.bool){event.finish();return} @@ -22621,7 +22832,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "step 4" target.give(result.cards,player); }, - audio:2, }, xiongyi:{ skillAnimation:true, @@ -23238,8 +23448,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.draw(); event.count--; "step 2" - if(event.count){ - player.chooseBool(get.prompt2('mingzhe')).set('frequentSkill','mingzhe'); + if(event.count&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ + player.chooseBool(get.prompt2('mingzhe')).set('frequentSkill',event.name); } else event.finish(); "step 3" @@ -23338,15 +23548,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, yongsi:{ - audio:'yongsi1', + audio:2, group:['yongsi1','yongsi2'], locked:true, ai:{ - threaten:2.2 + threaten:3.2 } }, yongsi1:{ - audio:2, + audio:true, trigger:{player:'phaseDrawBegin2'}, forced:true, filter:function(event,player){ @@ -23357,7 +23567,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, yongsi2:{ - audio:2, + audio:true, trigger:{player:'phaseDiscardBegin'}, forced:true, content:function(){ @@ -23570,8 +23780,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, chongzhen:{ - group:['chongzhen1','chongzhen2'], - audio:'chongzhen1', + audio:2, + trigger:{player:['useCard','respond']}, + filter:function(event,player){ + if(event.card.name!='sha'&&event.card.name!='shan') return false; + if(!event.skill||event.skill.indexOf('fanghun')+event.skill.indexOf('longdan')==-2) return false; + var target=lib.skill.chongzhen.logTarget(event,player); + return target&&target.countGainableCards(player,'h')>0; + }, + logTarget:function(event,player){ + if(event.name=='respond') return event.source; + if(event.card.name=='sha') return event.targets[0]; + return event.respondTo[0]; + }, + prompt2:function(event,player){ + var target=lib.skill.chongzhen.logTarget(event,player); + return '获得'+get.translation(target)+'的一张手牌'; + }, + content:function(){ + var target=lib.skill.chongzhen.logTarget(trigger,player); + player.gainPlayerCard(target,'h',true); + }, ai:{ combo:'ollongdan', mingzhi:false, @@ -23588,40 +23817,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, }, - } - }, - chongzhen1:{ - audio:2, - trigger:{player:'useCard'}, - filter:function(event,player){ - if((event.card.name!='sha'&&event.card.name!='shan')||(event.skill!='longdan_shan'&&event.skill!='longdan_sha'&& - event.skill!='fanghun_shan'&&event.skill!='fanghun_sha'&&event.skill!='ollongdan')) return false; - var target=lib.skill.chongzhen1.logTarget(event,player); - return target&&target.countGainableCards(player,'h')>0; }, - logTarget:function(event,player){ - if(event.card.name=='sha') return event.targets[0]; - return event.respondTo[0]; - }, - prompt2:'当你因发动〖龙胆〗而使用或打出【杀】或【闪】时,你可以获得对方的一张手牌。', - content:function(){ - var target=lib.skill.chongzhen1.logTarget(trigger,player); - player.gainPlayerCard(target,'h',true); - } - }, - chongzhen2:{ - audio:2, - trigger:{player:'respond'}, - filter:function(event,player){ - if(event.skill!='longdan_shan'&&event.skill!='longdan_sha'&& - event.skill!='fanghun_shan'&&event.skill!='fanghun_sha'&&event.skill!='ollongdan') return false; - return event.source&&event.source.countGainableCards(player,'h')>0; - }, - logTarget:'source', - prompt2:'当你因发动〖龙胆〗而使用或打出【杀】或【闪】时,你可以获得对方的一张手牌。', - content:function(){ - player.gainPlayerCard(trigger.source,'h',true); - } }, lihun:{ audio:2, @@ -24255,7 +24451,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, xionghuo:{ marktext:"戾", - mark:true, intro:{ name:'暴戾', content:"mark", @@ -25226,7 +25421,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jin_simazhao:['jin_simazhao','simazhao','sp_simazhao'], jin_wangyuanji:['jin_wangyuanji','wangyuanji','sp_wangyuanji'], wangyun:['wangyun','dc_wangyun','re_wangyun','jsrg_wangyun','old_wangyun','pe_wangyun'], - zhangliang:['re_zhangliang','zhangliang'], + zhangliang:['xin_zhangliang','re_zhangliang','zhangliang'], lingju:['lingju','old_lingju'], guansuo:['guansuo','dc_guansuo'], zhangxingcai:['zhangxingcai','old_zhangxingcai'], @@ -25238,7 +25433,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dengzhi:['ol_dengzhi','re_dengzhi','dengzhi','tw_dengzhi'], wangrong:['ol_wangrong','wangrong'], zongyu:['zongyu','sp_zongyu','tw_zongyu'], - ol_dongzhao:['ol_dongzhao','tw_dongzhao'], + ol_dongzhao:['ol_dongzhao','dc_dongzhao','tw_dongzhao'], mayunlu:['mayunlu','tw_mayunlu'], zhuling:['ol_zhuling','dc_zhuling','zhuling'], zangba:['zangba','tw_zangba'], @@ -25268,6 +25463,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_pengyang:['ol_pengyang','sp_pengyang'], ol_luyusheng:['ol_luyusheng','luyusheng'], fanjiangzhangda:['fanjiangzhangda','jsrg_fanjiangzhangda'], + simalang:['re_simalang','simalang'], + zhugedan:['re_zhugedan','zhugedan'], }, translate:{ "xinfu_lingren":"凌人", @@ -25652,6 +25849,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ hongde_info:'当你一次获得或失去至少两张牌后,你可以令一名其他角色摸一张牌。', dingpan:'定叛', dingpan_info_identity:'出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的反贼数)', + dingpan_info_versus_two:'出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的最大阵营角色数)', dingpan_info_versus:'出牌阶段限X次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。(X为场上存活的敌方角色数)', dingpan_info:'出牌阶段限一次,你可以令一名装备区里有牌的角色摸一张牌,然后其选择一项:1.令你弃置其装备区里的一张牌;2.获得其装备区里的所有牌,若如此做,你对其造成1点伤害。', weidi:'伪帝', @@ -25740,6 +25938,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jieyuan_info:'当你对一名其他角色造成伤害时,若其体力值大于或等于你的体力值,你可弃置一张黑色手牌,令此伤害+1;当你受到一名其他角色造成的伤害时,若其体力值大于或等于你的体力值,你可弃置一张红色手牌,令此伤害-1。', fenxin:'焚心', fenxin_info:'锁定技,一名其他角色死亡后,若其身份为:忠臣,你本局内发动〖竭缘〗减少伤害时无视体力值限制;反贼,你本局内发动〖竭缘〗增加伤害时无视体力值限制;内奸,你本局内选择发动〖竭缘〗的牌时无颜色和区域限制。', + fenxin_info_versus:'锁定技,一名其他角色首次受到伤害后,你选择本局游戏未选择过的一项:1.发动〖竭缘〗减少伤害时无视体力值限制;2.发动〖竭缘〗增加伤害时无视体力值限制;3.发动〖竭缘〗选择的牌时无颜色和区域限制。', qingyi:'轻逸', qingyi1:'轻逸', qingyi2:'轻逸', @@ -25797,8 +25996,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ baobian:'豹变', lihun:'离魂', chongzhen:'冲阵', - chongzhen1:'冲阵', - chongzhen2:'冲阵', yuanhu:'援护', tianming:'天命', mizhao:'密诏', @@ -26128,7 +26325,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhuangshu_equip:'金梳', zhuangshu_equip_bg:'金', zhuangshu_equip_info:'锁定技。出牌阶段结束时,你将手牌摸至手牌上限(至多摸五张)。当此牌不因交换装备或移动至其他装备区而离开你的装备区后,销毁之。', - ol_dongzhao:'董昭', + ol_dongzhao:'OL董昭', + ol_dongzhao_prefix:'OL', olxianlve:'先略', olxianlve_info:'①主公的回合开始时,你可声明并记录一个锦囊牌的名称并移除先前的记录。②每回合限一次,其他角色使用〖先略〗记录过的锦囊牌后,你可摸两张牌并可以分配给任意其他角色,然后你可声明并记录一个锦囊牌的名称并移除先前的记录。', olzaowang:'造王', @@ -26448,13 +26646,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ skill_zhangji_B:'技能', skill_zhangji_B_info:'当你受到1点伤害后,你可令一名手牌数小于体力上限的角色摸三张牌,然后其将手牌数弃置至其体力上限数;当你进入濒死状态时,你可令一名其他角色观看五张魏势力武将牌,其可以选择其中一张代替自己的武将牌(体力和体力上限不变)。', ol_feiyi:'费祎', - skill_feiyi_A:'技能', - skill_feiyi_A_info:'出牌阶段各限一次,若你的手牌数为:①奇数,你可以摸三张牌,然后弃置至少一半手牌(向下取整);②偶数,你可以弃置至少一半手牌,然后摸三张牌。', - skill_feiyi_B:'技能', - skill_feiyi_B_info:'每回合每项限一次,当你的手牌数变为1后,你可以展示此唯一手牌A并摸一张牌,然后你选择一项:①本回合使用点数大于A的点数的牌额外结算一次;②本回合使用点数小于A的点数的牌额外结算一次。', + yanru:'宴如', + yanru_info:'出牌阶段各限一次,若你的手牌数为:①奇数,你可以摸三张牌,然后弃置至少一半手牌(向下取整);②偶数,你可以弃置至少一半手牌,然后摸三张牌。', + hezhong:'和衷', + hezhong_info:'每回合每项限一次,当你的手牌数变为1后,你可以展示此唯一手牌A并摸一张牌,然后你选择一项:①本回合使用点数大于A的点数的普通锦囊牌额外结算一次;②本回合使用点数小于A的点数的普通锦囊牌额外结算一次。', lvboshe:'吕伯奢', olfushi:'缚豕', - olfushi_info:'①一名角色使用【杀】结算结束后,若你至其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时,你可以重铸任意张“缚豕”牌,视为使用一张【杀】并选择X项(X为你以此法重铸的牌数且至多为3):1.你为此【杀】额外指定一个目标;2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-1;3.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后,若此牌被选择的效果选项相邻且此牌的目标角色座位连续,则此【杀】不计入次数限制。', + olfushi_info:'①一名角色使用【杀】结算结束后,若你至其的距离不大于1,你将此【杀】对应的所有实体牌置于武将牌上。②当你需要使用一张【杀】时,你可以将任意张“缚豕”牌置入弃牌堆并摸等量的牌,视为使用一张【杀】并选择X项(X为你以此法重铸的牌数且至多为3):1.你为此【杀】额外指定一个目标;2.你选择此【杀】的一个目标角色,此牌对其造成的伤害-1;3.你选择此【杀】的一个目标角色,此【杀】对其造成的伤害+1。当此【杀】指定最后一个目标后,若此牌被选择的效果选项相邻且此牌的目标角色座位连续,则此【杀】不计入次数限制。', oldongdao:'东道', oldongdao_info:'农民的回合结束时:阴,你可以令地主进行一个额外回合;阳,其可以进行一个额外回合。', zhangyan:'张燕', @@ -26465,21 +26663,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_dingshangwan:'OL丁尚涴', ol_dingshangwan_prefix:'OL', olfudao:'抚悼', - olfudao_info:'①游戏开始时,你选择弃置或摸至多四张牌,然后记录你的手牌数。②一名角色的回合结束时,若其手牌数和你发动〖抚悼①〗记录的数值相同,则你可以与其各摸一张牌。', + olfudao_info:'①游戏开始时,你摸三张牌并将至多三张手牌交给一名其他角色,然后弃置任意张手牌并记录你的手牌数。②一名角色的回合结束时,若其手牌数和你发动〖抚悼①〗记录的数值相同,则你可以与其各摸一张牌。', olfengyan:'讽言', olfengyan_info:'锁定技。①当你受到其他角色造成的伤害后,你摸一张牌,然后交给其一张牌。②当你响应其他角色使用的牌时,其摸一张牌,然后弃置两张牌。', ol_liwan:'OL李婉', ol_liwan_prefix:'OL', ollianju:'联句', - ollianju_info:'结束阶段,你可以令一名其他角色获得你本回合使用的最后一张牌A对应的所有位于弃牌堆的实体牌并记录A的牌名,然后其下个结束阶段可以令你获得其本回合使用的最后一张牌B对应的所有位于弃牌堆的实体牌,且若A与B的牌名相同,则你失去1点体力。', + ollianju_info:'结束阶段,你可以令一名其他角色获得你本回合使用的最后一张牌A对应的所有位于弃牌堆的实体牌并记录A的牌名,然后其下个结束阶段可以令你获得其本回合使用的最后一张牌B对应的所有位于弃牌堆的实体牌,然后若A与B的牌名相同,则你失去1点体力;若A与B的牌名不同,则你可以视为使用A。', olsilv:'思闾', - olsilv_info:'锁定技,每回合限一次,当你获得或失去你发动〖联句〗记录的最后一次牌名的同名牌后,你展示这些牌,然后摸一张牌。', + olsilv_info:'锁定技,每回合每项限一次,当你获得或失去你发动〖联句〗记录的最后一次牌名的同名牌后,你展示这些牌,然后摸一张牌。', xueji_old:'血祭', xueji_old_info:'出牌阶段限一次,你可以弃置一张红色牌并对攻击范围内的至多X名角色各造成1点伤害(X为你已损失的体力值),然后这些角色各摸一张牌。', oldhuxiao:'虎啸', oldhuxiao_info:'锁定技,当你使用的【杀】被【闪】抵消后,你令此【杀】不计入使用次数。', oldwuji:'武继', oldwuji_info:'觉醒技,结束阶段,若你本回合造成了3点或更多伤害,你加1点体力上限并回复1点体力,并失去技能〖虎啸〗。', + olfeiyang:'飞扬', + //olfeiyang_info:'限定技。准备阶段,你可以弃置两张牌,然后弃置判定区的一张牌。', + olfeiyang_info:'准备阶段,你可以弃置三张牌,然后弃置判定区的一张牌。', sp_tianji:'天极·皇室宗亲', diff --git a/character/sp2.js b/character/sp2.js index 69e5f4095..fd190e554 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,13 +4,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sp2', connect:true, character:{ + star_yuanshu:['male','qun',4,['starcanxi','starpizhi','starzhonggu'],['zhu']], star_caoren:['male','wei',4,['starsujun','starlifeng']], + mp_liuling:['male','jin',3,['mpjiusong','mpmaotao','mpbishi'],['doublegroup:wei:qun:jin']], dc_jikang:['male','wei',3,['new_qingxian','dcjuexiang']], dc_jsp_guanyu:['male','wei',4,['new_rewusheng','dcdanji']], dc_mengda:['male','wei',4,['dclibang','dcwujie']], //dc_fuwan:['male','qun',4,['dcmoukui']], guānning:['male','shu',3,['dcxiuwen','dclongsong']], - sunhuan:['male','wu',4,['dcniji'],['unseen']], + sunhuan:['male','wu',4,['dcniji']], sunlang:['male','shu',4,['dctingxian','dcbenshi']], shiyi:['male','wu',3,['dccuichuan','dczhengxu']], dc_hujinding:['female','shu','3/6',['dcdeshi','dcwuyuan','huaizi']], @@ -55,7 +57,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dongxie:['female','qun',4,['dcjiaoxia','dchumei']], wangrong:['female','qun',3,['minsi','jijing','zhuide']], ol_dingyuan:['male','qun',4,['cixiao','xianshuai']], - xin_baosanniang:['female','shu',3,['decadewuniang','decadexushen']], re_hejin:['male','qun',4,['spmouzhu','spyanhuo']], re_hansui:['male','qun',4,['spniluan','spweiwu']], liuhong:['male','qun',4,['yujue','tuxing']], @@ -108,11 +109,210 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_xuzhou:['re_taoqian','caosong','zhangmiao','qiuliju'], sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'], sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'], - sp_star:['star_caoren'], - sp_decade:['caobuxing','re_maliang','xin_baosanniang','dc_jikang'], + sp_star:['star_caoren','star_yuanshu'], + mini_qixian:['mp_liuling'], + sp_decade:['caobuxing','re_maliang','dc_jikang'], } }, skill:{ + //星袁术 + starcanxi:{ + audio:2, + trigger:{ + global:['phaseBefore','roundStart'], + player:'enterGame', + }, + filter:function(event,player,name){ + if(name=='roundStart') return player.getSkills().some(skill=>skill.indexOf('starcanxi_')==0); + return event.name!='phase'||game.phaseNumber==0; + }, + forced:true, + content:function(){ + 'step 0' + if(event.triggername!='roundStart'){ + var list=game.filterPlayer().reduce((list,target)=>list.add(target.group),[]); + list.sort((a,b)=>lib.group.indexOf(a)-lib.group.indexOf(b)); + list.forEach(group=>lib.skill.starcanxi.create(group,player)); + } + 'step 1' + var groups=player.getSkills().filter(skill=>skill.indexOf('starcanxi_')==0); + groups=groups.map(group=>group.slice(10)); + groups.sort((a,b)=>lib.group.indexOf(a)-lib.group.indexOf(b)); + var map={}; + groups.forEach(group=>map[group]=get.translation(group+'2')); + event.map=map; + player.chooseButton([ + '###残玺###
    请选择势力和效果
    ', + [Object.values(map),'tdnodes'], + [[ + ['wangsheng',''], + ['xiangsi',''] + ],'textbutton'] + ],2,true).set('filterButton',function(button){ + var list=['wangsheng','xiangsi']; + if(!ui.selected.buttons.length) return true; + return list.includes(ui.selected.buttons[0].link)!=list.includes(button.link); + }).set('ai',function(button){ + var player=_status.event.player; + var map=_status.event.map,list=['wangsheng','xiangsi']; + var getNum=function(group,effect){ + var num=0,sgn=effect=='wangsheng'?1.05:-1; + game.countPlayer(function(current){ + if(!(current==player&&sgn==-1)) num+=get.sgn(get.attitude(player,current))*sgn; + }); + return num; + }; + var listx=[]; + Object.keys(map).forEach(group=>list.forEach(effect=>listx.add([group,effect]))); + listx.sort((a,b)=>getNum(b[0],b[1])-getNum(a[0],a[1])); + if(button.link==map[listx[0][0]]||button.link==listx[0][1]) return 1; + return 0; + }).set('map',map); + 'step 2' + if(result.bool){ + if(!Object.keys(event.map).some(group=>event.map[group]==result.links[0])) result.links.reverse(); + player.popup(result.links[0]); + var group=Object.keys(event.map).find(group=>event.map[group]==result.links[0]); + var skill='starcanxi_'+result.links[1]; + player.popup(skill); + game.log(player,'选择了','#g'+result.links[0],'、','#y'+get.translation(skill)); + player.addTempSkill(skill,'roundStart'); + player.markAuto(skill,[group]); + } + }, + create:function(group,player){ + if(!lib.skill['starcanxi_'+group]){ + lib.skill['starcanxi_'+group]={ + mark:true, + charlotte:true, + onremove:function(player){ + player.addMark('starpizhi',1,false); + }, + intro:{content:'玉玺的一角'}, + }; + lib.translate['starcanxi_'+group]='残玺·'+get.translation(group+'2'); + lib.skill['starcanxi_'+group].marktext=get.translation(group); + lib.translate['starcanxi_'+group+'_bg']=get.translation(group); + } + player.addSkill('starcanxi_'+group); + }, + subSkill:{ + wangsheng:{ + charlotte:true, + onremove:true, + trigger:{global:'damageBegin1'}, + filter:function(event,player){ + if(!event.source||!player.getStorage('starcanxi_wangsheng').includes(event.source.group)) return false; + return !event.source.getHistory('sourceDamage').length; + }, + forced:true, + logTarget:'source', + content:function(){ + trigger.num++; + }, + group:'starcanxi_remove', + global:'starcanxi_effect', + intro:{content:'$势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1'}, + }, + xiangsi:{ + charlotte:true, + onremove:true, + trigger:{global:'recoverEnd'}, + filter:function(event,player){ + if(!player.getStorage('starcanxi_xiangsi').includes(event.player.group)||event.player==player) return false; + return game.getGlobalHistory('changeHp',function(evt){ + return evt.getParent().name=='recover'&&evt.player==event.player; + }).length==1; + }, + forced:true, + logTarget:'player', + content:function(){ + trigger.player.loseHp(); + }, + group:['starcanxi_remove','starcanxi_cancel'], + global:'starcanxi_effect', + intro:{content:'其他$势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效'}, + }, + cancel:{ + charlotte:true, + trigger:{global:'useCard'}, + filter:function(event,player){ + if(!event.targets||!event.targets.includes(player)||!player.getStorage('starcanxi_xiangsi').includes(event.player.group)||event.player==player) return false; + return event.player.getHistory('useCard',evt=>evt.targets&&evt.targets.includes(player)).indexOf(event)==0; + }, + forced:true, + logTarget:'player', + content:function(){ + trigger.excluded.add(player); + }, + }, + effect:{ + mod:{ + globalFrom:function(from,to,distance){ + if(game.hasPlayer(target=>target.getStorage('starcanxi_wangsheng').includes(from.group))) return distance-1; + }, + }, + ai:{ + effect:{ + player_use:function(card,player,target){ + var targets=game.filterPlayer(targetx=>targetx!=player&&targetx.getStorage('starcanxi_xiangsi').includes(player.group)); + if(!targets.length) return; + if(get.tag(card,'recover')&&target==player&&target.hp>2) return 0; + if(get.tag(card,'damage')&&targets.includes(target)) return 0.5; + }, + }, + }, + }, + remove:{ + charlotte:true, + trigger:{player:'die'}, + forced:true, + popup:false, + firstDo:true, + forceDie:true, + content:function(){ + player.removeSkill('starcanxi_wangsheng'); + player.removeSkill('starcanxi_xiangsi'); + }, + }, + }, + }, + starpizhi:{ + audio:2, + trigger:{player:'phaseEnd',global:'die'}, + filter:function(event,player){ + if(event.name=='phase') return player.hasMark('starpizhi'); + var groups=player.getSkills().filter(skill=>skill.indexOf('starcanxi_')==0); + groups=groups.map(group=>group.slice(10)); + return groups.includes(event.player.group); + }, + forced:true, + content:function(){ + 'step 0' + if(trigger.name=='die'){ + var skills=player.getSkills().filter(skill=>skill.indexOf('starcanxi_')==0&&skill.slice(10)==trigger.player.group); + player.removeSkill(skills); + } + 'step 1' + player.draw(player.countMark('starpizhi')); + }, + intro:{content:'已失去#个“玺角”'}, + ai:{combo:'starcanxi'}, + }, + starzhonggu:{ + unique:true, + audio:2, + trigger:{player:'phaseDrawBegin2'}, + filter:function(event,player){ + return !event.numFixed; + }, + forced:true, + zhuSkill:true, + content:function(){ + var num=(game.roundNumber>=game.countPlayer(current=>current.group=='qun')?2:-1); + trigger.num+=num; + }, + }, //星曹仁 starsujun:{ audio:2, @@ -139,7 +339,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'chooseToUse', filter:function(event,player){ if(!event.filterCard({name:'sha'},player,event)&&!event.filterCard({name:'wuxie'},player,event)) return false; - return player.countCards('h',card=>{ + return player.countCards('hs',card=>{ return !player.getStorage('starlifeng_count').contains(get.color(card,player))||_status.connectMode; }); }, @@ -165,7 +365,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.getParent().addCount=false; }, popname:true, - position:'h', viewAs:{ name:links[0][2], }, @@ -185,7 +384,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, hiddenCard:function(player,name){ - if(name=='wuxie') return player.countCards('h',card=>{ + if(name=='wuxie') return player.countCards('hs',card=>{ return !player.getStorage('starlifeng_count').contains(get.color(card,player))||_status.connectMode; }); }, @@ -193,7 +392,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ respondSha:true, skillTagFilter:function(player,tag,arg){ if(arg=='respond') return false; - if(!player.countCards('h',card=>{ + if(!player.countCards('hs',card=>{ return !player.getStorage('starlifeng_count').contains(get.color(card,player))||_status.connectMode; })) return false; }, @@ -222,6 +421,110 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, + //小程序刘伶 + mpjiusong:{ + audio:2, + enable:'chooseToUse', + trigger:{global:'useCard'}, + filterCard:function(card){ + return get.type2(card)=='trick'; + }, + viewAs:{name:'jiu'}, + position:'hs', + viewAsFilter:function(player){ + return player.hasCard(card=>get.type2(card)=='trick','hs'); + }, + check:function(card){ + if(get.event().type=='dying') return 1/Math.max(0.1,get.value(card)); + return 4-get.value(card); + }, + prompt:'将一张锦囊牌当【酒】使用', + filter:function(event,player){ + if(event.name=='chooseToUse') return player.hasCard(card=>get.type2(card)=='trick','hs'); + return event.card.name=='jiu'&&player.countMark('mpjiusong')<3; + }, + forced:true, + locked:false, + content:function(){ + player.addMark('mpjiusong'); + }, + marktext:'醉', + intro:{ + name:'醉(酒颂/酕醄)', + name2:'醉', + content:'mark', + } + }, + mpmaotao:{ + audio:2, + trigger:{global:'useCardToPlayer'}, + filter:function(event,player){ + if(event.targets.length!=1||!event.isFirstTarget) return false; + if(!['basic','trick'].includes(get.type(event.card))) return false; + return event.player!=player&&player.countMark('mpjiusong'); + }, + prompt2:function(event,player){ + let list; + if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{ + return lib.filter.targetEnabled2(event.card,event.player,current); + }); + else list=game.filterPlayer(current=>current.canAddJudge(event.card)); + return `移去1枚“醉”,${list.length>1?`令${get.translation(event.card)}目标改为${get.translation(list)}中的一名随机角色。若新目标与原目标相同,你`:''}获得牌堆中的一张【酒】。` + }, + check:function(event,player){ + const eff=get.effect(event.target,event.card,player,player); + let list; + if(get.type(event.card)!='delay') list=game.filterPlayer(current=>{ + return lib.filter.targetEnabled2(event.card,event.player,current); + }); + else list=game.filterPlayer(current=>current.canAddJudge(event.card)); + let list2=list.filter(current=>get.effect(current,event.card,player,player)>eff); + let list3=list.filter(current=>get.effect(current,event.card,player,player)>0); + return list2.length>=list.length/2||player.countMark('mpjiusong')>=2&&list3.length>=list.length/2; + }, + content:function(){ + player.removeMark('mpjiusong',1); + var list,oriTarget=trigger.target; + trigger.targets.remove(oriTarget); + trigger.getParent().triggeredTargets1.remove(oriTarget); + trigger.untrigger(); + game.delayx(); + if(get.type(trigger.card)!='delay') list=game.filterPlayer(current=>{ + return lib.filter.targetEnabled2(trigger.card,trigger.player,current); + }); + else list=game.filterPlayer(current=>current.canAddJudge(trigger.card)); + if(list.length) target=list.randomGet(); + trigger.targets.push(target); + trigger.player.line(target,'thunder'); + game.log(trigger.card,'的目标被改为',target); + if(target==oriTarget){ + var card=get.cardPile2('jiu'); + if(card) player.gain(card,'gain2'); + else{ + player.chat('没酒了!'); + game.log('但是牌堆中已经没有','#y酒','了!'); + } + } + }, + }, + mpbishi:{ + audio:2, + forced:true, + trigger:{global:'useCard1'}, + filter:function(event,player){ + if(get.type2(event.card)!='trick'||!get.tag(event.card,'damage')) return false; + if(!lib.skill.xunshi.isXunshi(event.card)) return false; + const targets=event.targets.slice(); + targets.remove(event.player); + return targets.length==game.countPlayer()-2; + }, + content:function*(){}, + mod:{ + targetEnabled:function(card){ + if(get.type2(card)=='trick'&&get.tag(card,'damage')>0) return false; + } + } + }, //十周年嵇康 dcjuexiang: { derivation: 'dccanyun', @@ -506,6 +809,22 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addSkill('mashu'); player.addSkill('dcnuchen'); player.awakenSkill('dcdanji'); + }, + ai:{ + maixie:true, + skillTagFilter:(player,tag,arg)=>{ + if(tag==='maixie') return player.hp>=2&&!player.storage.dcdanji&&!player.hasSkill('dcnuchen')&&player.countCards('h')===player.hp; + }, + effect:{ + target:(card,player,target)=>{ + let hs=target.countCards('h'); + if(target.hp<3||target.storage.dcdanji||target.hasSkill('dcnuchen')||hs>target.hp+1) return; + if(get.tag(card,'draw')) return 1.6; + if(get.tag(card,'lose')||get.tag(card,'discard')) return [1,-0.8]; + if(hs===target.hp&&get.tag(card,'damage')) return [1,target.hp/3]; + if(hs>target.hp&&target.hp>3&&(card.name==='shan'||card.name==='wuxie')) return 'zeroplayertarget'; + } + } } }, dcnuchen:{ @@ -669,7 +988,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, dcwujie:{ audio:2, - forced:true, trigger:{ global:['discardBegin','drawBegin'], }, @@ -748,7 +1066,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!num) delete player.getStat().skill[skillx]; else player.getStat().skill[skillx]=num; var bool3=!(bool1&&!bool2); - }catch(e){} + } catch (e) { + console.trace(e); + } if(!bool1&&!bool2&&get.skillInfoTranslation(skill,player).indexOf('出牌阶段限一次')==-1) return false; if((bool1||bool2)&&bool3) return false; } @@ -1008,7 +1328,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ frequent:true, group:'dcniji_discard', content:function(){ - player.draw().gaintag=['dcniji']; + var next=player.draw(); + var evt=trigger.getParent('dcniji_discard'); + if(!evt||evt.player!=player) next.gaintag=['dcniji']; player.addTempSkill('dcniji_clear'); }, subSkill:{ @@ -1022,15 +1344,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'dcniji', trigger:{global:'phaseJieshuBegin'}, filter:function(event,player){ - return player.hasCard(card=>card.hasGaintag('dcniji'),'h'); + return player.hasCard(card=>card.hasGaintag('dcniji')&&lib.filter.cardDiscardable(card,player,'dcniji'),'h'); }, forced:true, - loced:false, + locked:false, content:function(){ 'step 0' - var cards=player.getCards('h',card=>card.hasGaintag('dcniji')); + var cards=player.getCards('h',card=>card.hasGaintag('dcniji')&&lib.filter.cardDiscardable(card,player,'dcniji')); event.cards=cards; - if(cards.length>=player.hp){ + // if(cards.length>=player.hp){ + if(cards.some(card=>player.hasUseTarget(card))){ player.chooseToUse({ prompt:'是否使用一张“逆击”牌?', filterCard:function(card,player){ @@ -1038,12 +1361,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return lib.filter.filterCard.apply(this,arguments); }, ai1:function(card){ - return _status.event.player.getUseValue(card); + return get.player().getUseValue(card); }, }); } + // } 'step 1' - player.discard(cards.filter(card=>get.owner(card)==player&&get.position(card)=='h')); + if(result.bool) game.delayex(); + var cards=cards.filter(card=>get.owner(card)==player&&get.position(card)=='h'&&lib.filter.cardDiscardable(card,player,'dcniji')); + if(cards.length) player.discard(cards); } } } @@ -1227,6 +1553,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ player.draw(trigger.getl(player).cards2.length); + }, + ai:{ + effect:{ + target:(card,player,target)=>{ + if((get.tag(card,'lose')||get.tag(card,'discard'))&&target.getHistory('damage').length&&!target.hasHistory('useSkill',evt=>evt.skill=='dczhengxu_lose')) return [1,1]; + } + } } }, damage:{ @@ -1245,10 +1578,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return; - if(target.hasHistory('useSkill',evt=>evt.skill=='dczhengxu_damage')) return; - if(get.tag(card,'damage')) return 0.6; + target:(card,player,target)=>{ + if(player.hasSkillTag('jueqing',false,target)||!get.tag(card,'damage')) return; + if(target.hasHistory('useSkill',evt=>evt.skill=='dczhengxu_damage')||!target.hasHistory('lose',evt=>evt.cards2&&evt.cards2.length)) return; + if(get.attitude(player,target)>=0) return 'zeroplayertarget'; + let num=0,shas=player.getCardUsable('sha'),hs=player.getCards('hs',i=>{ + if(i===card||card.cards&&card.cards.includes(i)||!get.tag(i,'damage')||!player.canUse(i,target)) return false; + if(get.name(i)==='sha'){ + num++; + return false; + } + return true; + }); + if(card.name==='sha') shas--; + num=Math.min(num,shas); + num+=hs.length; + if(!num) return 'zeroplayertarget'; + num=1-2/3/num; + return [num,0,num,0]; } } } @@ -1288,17 +1635,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(targets.length){ choices.push('选项一'); choiceList[0]+='('+get.translation(targets)+')'; - } else choiceList[0]=''+choiceList[0]+''; + } + else choiceList[0]=''+choiceList[0]+''; if(targets2.length){ choices.push('选项二'); choiceList[1]+='('+get.translation(targets2)+')'; - } else choiceList[1]=''+choiceList[1]+''; + } + else choiceList[1]=''+choiceList[1]+''; if(!choices.length) event.finish(); else player.chooseControl(choices,'cancel2').set('prompt',get.prompt('dczuojian')).set('choiceList',choiceList).set('ai',()=>{ var controls=_status.event.controls,choice=_status.event.choice; if(!controls.contains('选项一')||controls.contains('选项二')&&choice==1) return '选项二'; return '选项一'; - }).set('choice',eff<0&&eff2<0?'cancel2':(eff>eff2?0:1)); + }).set('choice',eff<=0&&eff2<=0?'cancel2':(eff>-eff2?0:1)); 'step 1' if(result.control=='选项一'){ player.logSkill('dczuojian',targets); @@ -2033,7 +2382,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, subSkill:{ blocker:{ - charlotte:true, init:function(player,skill){ player.addSkillBlocker(skill); }, @@ -2428,7 +2776,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(eff2>0) return eff1>0; return player.hp>2&&eff2=0) return 0; if(!target.hasCard(function(card){ - return get.value(card,target)<=0; + return get.value(card,target)<=0; },'he')) return -att/Math.sqrt(target.countCards('he')); return 0; }); @@ -4111,10 +4458,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 5-val; } switch(num){ - case 'equip3':return 4.5;break; - case 'equip4':return 4.4;break; - case 'equip5':return 4.3;break; - case 'equip2':return (3-player.hp)*1.5;break; + case 'equip3':return 4.5; + case 'equip4':return 4.4; + case 'equip5':return 4.3; + case 'equip2':return (3-player.hp)*1.5; case 'equip1':{ if(game.hasPlayer(function(current){ return (get.realAttitude||get.attitude)(player,current)<0&&get.distance(player,current)>1; @@ -4533,7 +4880,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ 'step 0' player.chooseTarget('请选择【抗歌】的目标','其于回合外摸牌后,你摸等量的牌;其进入濒死状态时,你可令其回复体力至1点;其死亡后,你弃置所有牌并失去1点体力',lib.filter.notMe,true).set('ai',function(target){ - return get.attitude(_status.event.player,target)>0; + return get.attitude(_status.event.player,target); }); 'step 1' if(result.bool){ @@ -5200,7 +5547,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ai:{ effect:{ target:function(card,player,target,current,isLink){ - if(isLink||!player.isPhaseUsing()) return; + if(isLink||typeof card!=='object'||!player.isPhaseUsing()) return; var num; var evt=_status.event.getParent('useCard'),evt2=_status.event.getParent('phaseUse'); if(evt.card==card){ @@ -5212,8 +5559,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return evt.getParent('phaseUse')==evt2; }).length; if(num<0||num>1) return; - if(num==0&&get.tag(card,'damage')) return 'zerotarget'; - if(num==1&&get.color(card)=='black') return 'zeroplayertarget'; + if(num===0&&get.tag(card,'damage')){ + if(target.hasSkillTag('filterDamage',null,{ + player:player, + card:card + })||!player.hasSkillTag('damageBonus',true,{ + target:target, + card:card + })) return 'zerotarget'; + return [0.5,0,0.5,0]; + } + if(num===1&&get.color(card)=='black') return 'zeroplayertarget'; }, }, }, @@ -6075,8 +6431,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.num++; if(event.num2) break; } - if(skills.length) player.chooseControl(skills).set('dialog',['评鉴:请选择尝试发动的技能',[list,'character']]); + if(skills.length){ + event.list=list; + player.chooseControl(skills).set('dialog',['评鉴:请选择尝试发动的技能',[list,'character']]); + } else event.finish(); 'step 1' player.markAuto('pingjian',[result.control]); player.addTempSkill(result.control); player.storage.pingjian_check[result.control]=(trigger.name=='damage'?trigger:'phaseJieshu'); + var name=event.list.find(name=>lib.character[name][3].includes(result.control)); + // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); + if(name) game.broadcastAll((player,name)=>player.tempname.add(name),player,name); }, group:'pingjian_use', phaseUse_special:[], @@ -8086,12 +8445,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } if(list.length>2) break; } - if(skills.length) player.chooseControl(skills).set('dialog',['评鉴:请选择尝试发动的技能',[list,'character']]); + if(skills.length){ + event.list=list; + player.chooseControl(skills).set('dialog',['评鉴:请选择尝试发动的技能',[list,'character']]); + } else event.finish(); 'step 1' player.markAuto('pingjian',[result.control]); player.addTempSkill(result.control); player.storage.pingjian_check[result.control]='phaseUse'; + var name=event.list.find(name=>lib.character[name][3].includes(result.control)); + // if(name) lib.skill.rehuashen.createAudio(name,result.control,'xushao'); + if(name) game.broadcastAll((player,name)=>player.tempname.add(name),player,name); }, ai:{order:12,result:{player:1}}, }, @@ -8099,7 +8464,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, trigger:{player:['useSkill','logSkillBegin']}, filter:function(event,player){ - if(get.info(event.skill).charlotte) return false; + var info=get.info(event.skill); + if(info&&info.charlotte) return false; var skill=event.sourceSkill||event.skill; return player.storage.pingjian_check[skill]; }, @@ -8109,6 +8475,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ content:function(){ var skill=trigger.sourceSkill||trigger.skill; player.removeSkill(skill); + const names=player.tempname&&player.tempname.filter(i=>lib.character[i][3].includes(skill)); + if(names) game.broadcastAll((player,names)=>player.tempname.removeArray(names),player,names); delete player.storage.pingjian_check[skill]; }, group:'pingjian_check2', @@ -8131,6 +8499,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return player.storage.pingjian_check[skill]==trigger; }); player.removeSkill(skills); + const names=player.tempname&&player.tempname.filter(i=>skills.some(skill=>lib.character[i][3].includes(skill))); + if(names) game.broadcastAll((player,names)=>player.tempname.removeArray(names),player,names); for(var skill of skills) delete player.storage.pingjian_check[skill]; }, }, @@ -8945,7 +9315,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ target.$damagepop('K','thunder'); event.num=13; - }; + } game.log(target,'选择的点数是','#y'+get.strNumber(event.num)); player.storage.xinfu_lveming++; player.judge(function(card){ @@ -9292,7 +9662,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ player.logSkill('xinfu_zhenxing'); event.num={一张:1,两张:2,三张:3}[result.control]; - }; + } 'step 2' event.cards=get.cards(num); player.chooseButton(['【镇行】:请选择要获得的牌',event.cards]).set('filterButton',function(button){ @@ -9330,8 +9700,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num2=ui.cardPile.childElementCount; var num3=num2; if(num1>num2) num3=0; - else if(!player.storage.xinfu_qianxin){} - else{ + else if(player.storage.xinfu_qianxin){ for(var i=0;i刘伶自幼便失去了父爱,因其父亲身材矮小,及至长大成人后,刘伶身高也不过六尺。魏齐王曹芳正始之末(249年),刘伶已成为当世名重一时的名士,并且常与嵇康、阮籍、阮咸集会于山阳竹林之下,饮酒赋诗,弹琴作歌。晋武帝司马炎泰始初年(265年)前后,曾做过一段时间的建威参军,不久朝廷下诏,入宫中策问。他大谈老庄,强调无为而治,非但没有得到重用,反而连参军之职也被罢免了,从此再无仕进。晋惠帝司马衷永康元年(300年)前后,以寿而终。
    刘伶有“品酒第一人”的美称,也被酒行业传颂至今,后人以古瀑河边上的井水酿酒,还取刘伶墓地的黄土垒成窖池酿酒,为了纪念刘伶,当地百姓也将“润泉涌”更名为“刘伶醉”。其传世作品仅有《酒德颂》《北芒客舍》两篇,其中《酒德颂》所表现出的藐视一切存在的气概,敌视礼教之士的反抗精神,既高扬了人格的力量,批判了当时的黑暗政治,同时也抒发了压抑的愤世之情,充满了浪漫色彩,气魄豪迈,用辞又骈偶间行,有无意追求而自至的特点,对后代影响极大。', }, characterTitle:{ chunyuqiong:'#b对决限定武将', sp_xuyou:'#g4v4限定武将', }, - perfectPair:{}, characterFilter:{ chunyuqiong:function(mode){ return mode!='identity'&&mode!='guozhan'; @@ -10570,7 +10935,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcbenshi_info:'锁定技。①你的攻击范围+1。②你的攻击范围基数不受装备区内武器牌的影响。③由你使用的【杀】的牌面信息中的“使用目标”产生的规则改为“攻击范围内的所有角色”。', sunhuan:'孙桓', dcniji:'逆击', - dcniji_info:'①当你成为非装备牌的目标后,你可以摸一张牌,称为“逆击”。②一名角色的结束阶段,若你于本回合获得的“逆击”数不小于你的体力值,你可以使用一张“逆击”。你弃置所有“逆击”。', + dcniji_info:'①当你成为非装备牌的目标后,你可以摸一张牌。②一名角色的结束阶段,你可以使用一张“逆击”牌,然后弃置所有“逆击”牌。', //dc_fuwan:'新杀伏完', //dc_fuwan_prefix:'新杀', //dc_fuwan_ab:'伏完', @@ -10600,12 +10965,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcjuexiang_info:'当你死亡时,杀死你的角色弃置其装备区内的所有牌并失去1点体力,然后你可以令一名其他角色获得〖残韵〗。', dccanyun:'残韵', dccanyun_info:'每名角色限一次。出牌阶段,你可以弃置一张牌并选择一名其他角色,然后若其装备区里的牌数:小于你,其回复1点体力;大于你,其失去1点体力;等于你,其摸一张牌。若你的体力值为1,你摸一张牌。', + mp_liuling:'刘伶', + mpjiusong:'酒颂', + mpjiusong_info:'①你可以将一张锦囊牌当【酒】使用。②当一名角色使用【酒】时,你获得1枚“醉”标记(“醉”数至多为3)。', + mpmaotao:'酕醄', + mpmaotao_info:'当其他角色使用基本牌或普通锦囊牌指定唯一目标时,你可以移去1枚“醉”,令此牌的目标改为随机一名合法角色(无距离限制)。若目标角色与原目标相同,你从牌堆中获得一张【酒】。', + mpbishi:'避世', + mpbishi_info:'锁定技。你不能成为伤害类锦囊牌的目标。', star_caoren:'星曹仁', star_caoren_prefix:'星', starsujun:'肃军', starsujun_info:'当你使用一张牌时,若你手牌中的基本牌和非基本牌的牌数相等,你可以摸两张牌。', starlifeng:'砺锋', starlifeng_info:'你可以将一张本回合未有角色使用过的颜色的手牌当做不计入次数的【杀】或【无懈可击】使用。', + star_yuanshu:'星袁术', + star_yuanshu_prefix:'星', + starcanxi:'残玺', + starcanxi_wangsheng:'妄生', + starcanxi_xiangsi:'向死', + starcanxi_cancel:'向死', + starcanxi_info:'锁定技。游戏开始时,你获得场上所有角色的势力对应的“玺角”标记,然后选择一个“玺角”对应势力并选择以下一项;一轮开始时,你选择一个“玺角”对应势力并选择以下一项:①妄生:本轮被选择势力角色每回合首次造成的伤害+1且计算与其他角色间的距离-1;②向死:本轮其他被选择势力角色每回合首次回复体力后失去1点体力且每回合对你使用的第一张牌无效。', + starpizhi:'圮秩', + starpizhi_info:'锁定技。①一名角色死亡后,若你拥有该角色对应的“玺角”标记,你失去之并摸X张牌。②结束阶段,你摸X张牌。(X为你本局游戏失去的“玺角”标记数)', + starzhonggu:'冢骨', + starzhonggu_info:'主公技,锁定技。摸牌阶段,若游戏轮数大于等于场上的群势力角色数,则你额外摸两张牌,否则你少摸一张牌。', sp_whlw:"文和乱武", sp_zlzy:"逐鹿中原", @@ -10625,6 +11008,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_danqi:'千里单骑', sp_star:'将星系列', sp_decade:'其他新服武将', + mini_qixian:'小程序·竹林七贤', }, pinyins:{ 卑弥呼:['Himiko'] diff --git a/character/standard.js b/character/standard.js index 27a426093..afbce7932 100755 --- a/character/standard.js +++ b/character/standard.js @@ -12,7 +12,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ - old_re_lidian:['male','wei',3,['xunxun','wangxi']], + old_re_lidian:['male','wei',3,['xunxun','wangxi'],['die_audio:lidian']], ganfuren:['female','shu',3,['stdshushen','shenzhi']], std_panfeng:['male','qun',4,['stdkuangfu']], caocao:['male','wei',4,['jianxiong','hujia'],['zhu']], @@ -532,7 +532,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{player:'phaseDrawBegin2'}, check:function(event,player){ - if(player.countCards('h')<3) return false; + if(player.skipList.includes('phaseUse')||player.countCards('h')<3) return false; if(!player.hasSha()) return false; return game.hasPlayer(function(current){ return get.attitude(player,current)<0&&player.canUse('sha',current); @@ -649,7 +649,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ animate:'draw', }).setContent('gaincardMultiple'); 'step 6' - if(event.count>0&&player.hasSkill(event.name)){ + if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ player.chooseBool(get.prompt2(event.name)).set('frequentSkill',event.name); } else event.finish(); @@ -1114,9 +1114,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ paoxiao:{ audio:2, firstDo:true, - audioname2:{old_guanzhang:'old_fuhun'}, audioname:['re_zhangfei','guanzhang','xiahouba'], - audioname2:{ + audioname2: { + old_guanzhang:'old_fuhun', dc_xiahouba:'paoxiao_xiahouba', }, trigger:{player:'useCard1'}, @@ -1937,7 +1937,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.count--; player.draw(2); "step 2" - if(event.count>0){ + if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ player.chooseBool(get.prompt2('xiaoji')).set('frequentSkill','xiaoji').ai=lib.filter.all; } "step 3" @@ -2539,14 +2539,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_zhangliao:['sp_zhangliao','yj_zhangliao','jsrg_zhangliao'], xiahoudun:['xiahoudun','re_xiahoudun','xin_xiahoudun'], liubei:['liubei','re_liubei','sb_liubei','dc_liubei','junk_liubei'], - guanyu:['guanyu','re_guanyu','ps_guanyu'], + guanyu:['guanyu','re_guanyu','ps_guanyu','old_guanyu'], zhangfei:['zhangfei','re_zhangfei','old_zhangfei','xin_zhangfei','sb_zhangfei','tw_zhangfei','jsrg_zhangfei','yj_zhangfei'], zhaoyun:['zhaoyun','re_zhaoyun','old_zhaoyun','sb_zhaoyun','ps2063_zhaoyun','ps2067_zhaoyun'], sp_zhaoyun:['sp_zhaoyun','jsp_zhaoyun'], machao:['machao','re_machao','sb_machao','ps_machao'], sp_machao:['sp_machao','dc_sp_machao','jsrg_machao','old_machao'], - zhugeliang:['zhugeliang','re_zhugeliang','ps2066_zhugeliang','ps_zhugeliang'], - huangyueying:['huangyueying','re_huangyueying','junk_huangyueying'], + zhugeliang:['zhugeliang','re_zhugeliang','ps2066_zhugeliang','ps_zhugeliang','sb_zhugeliang'], + huangyueying:['huangyueying','re_huangyueying','junk_huangyueying','sb_huangyueying'], sunquan:['sunquan','re_sunquan','sb_sunquan','dc_sunquan'], zhouyu:['zhouyu','re_zhouyu','sb_zhouyu','ps1062_zhouyu','ps2080_zhouyu'], luxun:['luxun','re_luxun'], diff --git a/character/swd.js b/character/swd.js index eaa2d656a..f4447266a 100644 --- a/character/swd.js +++ b/character/swd.js @@ -5351,7 +5351,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } for(j=0;jplayer.canCompare(target)); + }, + filterTarget:function(card,player,target){ + return player.canCompare(target); + }, + usable:1, + selectTarget:[1,3], + multitarget:true, + multiline:true, + group:'twdanlie_add', + content:function(){ + 'step 0' + player.chooseToCompare(targets).setContent('chooseToCompareMeanwhile'); + 'step 1' + if(result.winner&&result.winner==player){ + player.line(targets); + targets.forEach(target=>target.damage()); + } + else player.loseHp(); + }, + ai:{ + order:10, + result:{ + target:function(player,target){ + var att=get.attitude(player,target); + if(att>=0) return 0; + if(player.getHp()>2) return -get.damageEffect(target,player,player)-10/target.countCards('h'); + var hs=player.getCards('h').sort((a,b)=>b.number-a.number); + var ts=target.getCards('h').sort((a,b)=>b.number-a.number); + if(!hs.length||!ts.length) return 0; + if(Math.min(13,hs[0].number+player.getDamagedHp())>ts[0].number) return -get.damageEffect(target,player,player); + return 0; + }, + }, + }, + subSkill:{ + add:{ + audio:'twdanlie', + trigger:{player:'compare',target:'compare'}, + filter:function(event,player){ + if(!player.isDamaged()) return false; + if(player!=event.target&&event.iwhile) return false; + return true; + }, + forced:true, + locked:false, + content:function(){ + var num=player.getDamagedHp(); + if(player==trigger.player){ + trigger.num1+=num; + if(trigger.num1>13) trigger.num1=13; + } + else{ + trigger.num2+=num; + if(trigger.num2>13) trigger.num2=13; + } + game.log(player,'的拼点牌点数+',num); + }, + }, + }, + }, + //张葳 + twhuzhong:{ + audio:2, + trigger:{player:'useCardToPlayer'}, + filter:function(event,player){ + return event.card.name=='sha'&&!game.hasNature(event.card,'linked')&&event.targets.length==1&&player.isPhaseUsing()&&((player.countCards('h')&&game.hasPlayer(target=>!event.targets.includes(target)&&player.canUse(event.card,target)))||event.target.countCards('h')>0); + }, + direct:true, + content:function(){ + 'step 0' + var target=trigger.target; + event.target=target; + var list=['cancel2']; + var choiceList=[ + '弃置一张手牌,令此【杀】可以额外指定一个目标', + '令其弃置一张手牌,若此【杀】造成伤害,则你摸一张牌且本阶段可以额外使用一张【杀】;若此【杀】未造成伤害,你受到其对你造成的1点伤害', + ]; + if(target.countCards('h')) list.unshift('其弃置'); + else choiceList[1]=''+choiceList[1]+''; + if(player.countCards('h')&&game.hasPlayer(targetx=>!trigger.targets.includes(targetx)&&player.canUse(trigger.card,targetx))) list.unshift('你弃置'); + else choiceList[0]=''+choiceList[0]+''; + player.chooseControl(list).set('choiceList',choiceList).set('ai',()=>{ + var controls=_status.event.controls; + var trigger=_status.event.getTrigger(); + var player=trigger.player; + var target=trigger.target; + if(controls.contains('其弃置')&&_status.event.goon) return '其弃置'; + if(controls.contains('你弃置')){ + if(game.hasPlayer(targetx=>!trigger.targets.includes(targetx)&&player.canUse(trigger.card,targetx)&&get.effect(targetx,trigger.card,player,player)>0)) return '你弃置'; + } + return 'cancel2'; + }).set('goon',function(){ + var d1=true; + if(player.hasSkill('jueqing')||player.hasSkill('gangzhi')) d1=false; + if(!target.mayHaveShan()||player.hasSkillTag('directHit_ai',true,{ + target:target, + card:trigger.card, + },true)){ + if(!target.hasSkill('gangzhi')) d1=false; + if(!target.hasSkillTag('filterDamage',null,{ + player:player, + card:trigger.card, + })&&get.attitude(player,target)<0) return true; + } + if(d1) return get.damageEffect(player,player,player)>0; + return false; + }()); + 'step 1' + if(result.control!='cancel2'){ + player.logSkill('twhuzhong',target); + if(result.control=='其弃置'){ + target.chooseToDiscard('h',true); + player.when('useCardAfter').filter(evt=>evt==trigger.getParent()).then(()=>{ + if(player.getHistory('sourceDamage',evt=>evt.card==trigger.card).length){ + player.draw(); + player.addTempSkill('twhuzhong_sha','phaseUseAfter'); + player.addMark('twhuzhong_sha',1,false); + } + else{ + target.line(player); + player.damage(1,target); + } + }).vars({target:target}); + event.finish(); + } + else{ + player.chooseToDiscard('h',true); + player.chooseTarget('请选择'+get.translation(trigger.card)+'的额外目标',function(card,player,target){ + var trigger=_status.event.getTrigger(); + return !trigger.targets.includes(target)&&player.canUse(trigger.card,target); + }).set('ai',function(target){ + var player=_status.event.player; + var trigger=_status.event.getTrigger(); + return get.effect(target,trigger.card,player,player); + }); + } + } + else event.finish(); + 'step 2' + if(result.bool){ + player.line(result.targets); + trigger.getParent().targets.addArray(result.targets); + game.log(result.targets,'成为了',trigger.card,'的额外目标'); + } + }, + subSkill:{ + sha:{ + charlotte:true, + onremove:true, + mod:{ + cardUsable:function(card,player,num){ + if(card.name=='sha') return num+player.countMark('twhuzhong_sha'); + }, + }, + } + } + }, + twfenwang:{ + audio:2, + trigger:{source:'damageBegin2',player:'damageBegin4'}, + filter:function(event,player,name){ + if(name=='damageBegin2'){ + return !event.hasNature()&&player.countCards('h')>event.player.countCards('h'); + } + return event.hasNature(); + }, + forced:true, + content:function(){ + 'step 0' + if(event.triggername=='damageBegin2'){ + player.line(trigger.player); + trigger.num++; + event.finish(); + } + else player.chooseToDiscard('h','弃置一张手牌,或令此伤害+1').set('ai',function(card){ + return 8-get.value(card); + }); + 'step 1' + if(!result.bool) trigger.num++; + }, + }, + //夏侯子萼 + //差点和夏侯紫萼搞混 + twchengxi:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + return game.hasPlayer(target=>lib.skill.twchengxi.filterTarget(null,player,target)); + }, + filterTarget:function(card,player,target){ + if(player.getStorage('twchengxi_used').contains(target)||target==player) return false; + return !player.hasSkillTag('noCompareSource')&&target.countCards('h')>0&&!target.hasSkillTag('noCompareTarget'); + }, + content:function(){ + 'step 0' + if(!player.storage.twchengxi_used){ + player.when('phaseUseAfter').then(()=>delete player.storage.twchengxi_used); + } + player.markAuto('twchengxi_used',[target]); + player.draw(); + 'step 1' + if(player.canCompare(target)) player.chooseToCompare(target); + else event.finish(); + 'step 2' + if(result.bool){ + player.addSkill('twchengxi_effect'); + } + else{ + var card={name:'sha',isCard:true}; + if(target.canUse(card,player,false)) target.useCard(card,player,false); + } + }, + ai:{ + order:8, + result:{ + target:function(player,target){ + if(player.hasSkill('twchengxi_effect')) return 0; + var hs=player.getCards('h').sort((a,b)=>b.number-a.number); + var ts=target.getCards('h').sort((a,b)=>b.number-a.number); + if(!hs.length||!ts.length) return 0; + if(hs[0].number>ts[0].number) return -3; + if(!target.canUse({name:'sha',isCard:true},player,false)) return -1; + return 0; + }, + }, + }, + subSkill:{ + effect:{ + charlotte:true, + trigger:{player:'useCard1'}, + filter:function(event,player){ + return get.type(event.card)=='basic'||get.type(event.card)=='trick'; + }, + forced:true, + popup:false, + content:function(){ + player.removeSkill('twchengxi_effect'); + player.when('useCardAfter').filter(evt=>evt==trigger).then(()=>{ + if(trigger.targets){ + var card={ + name:trigger.card.name, + isCard:true, + }; + var targets=trigger.targets.filter(i=>i.isIn()&&player.canUse(card,i,false)); + if(targets.length) player.useCard(card,targets,false); + } + }); + }, + mark:true, + marktext:'袭', + intro:{content:'使用的下一张基本牌或非延时锦囊牌结算完毕后视为对相同目标再使用一张无次数限制的同名牌'}, + }, + }, + }, + //侠刘备 + twshenyi:{ + audio:2, + trigger:{global:'damageEnd'}, + filter:function(event,player){ + if(!event.player.isIn()) return false; + if(event.player.getHistory('damage').indexOf(event)!=0) return false; + return event.player==player||player.inRange(event.player); + }, + usable:1, + direct:true, + content:function(){ + 'step 0' + var list=get.inpileVCardList(info=>{ + return ['basic','trick','delay'].includes(info[0])&&!player.getStorage('twshenyi').includes(info[2]); + }); + var dialog=[`###${get.prompt('twshenyi',trigger.player)}###
    从牌堆中将一张牌作为“侠义”置于武将牌上${player!=trigger.player&&player.countCards('h')?',然后将所有手牌交给其':''}
    `,[list,'vcard']]; + player.chooseButton(dialog).set('ai',function(button){ + var trigger=_status.event.getTrigger(); + var player=_status.event.player,name=button.link[2]; + if(get.attitude(player,trigger.player)<=0) return 0; + if(!get.cardPile2(card=>card.name==name)) return 0; + var value=get.value({name:name}); + if(['tao','jiu','caochuan','wuxie'].includes(name)&&get.event().getRand()>0.4) return value*2; + return value; + }); + 'step 1' + if(result.bool){ + var name=result.links[0][2],nature=result.links[0][3]; + var cardx={name:name,nature:nature}; + player.logSkill('twshenyi',trigger.player); + player.popup(cardx); + player.markAuto('twshenyi',[name]); + game.log(player,'声明了',`#y${get.translation(cardx)}`); + var card=get.cardPile2(card=>get.name(card,false)==name&&get.nature(card,false)==nature); + if(card) player.addToExpansion([card],'gain2').gaintag.add('twshenyi'); + else{ + player.chat('无牌可得?!'); + game.log('但是牌堆中已经没有','#y'+get.translation(name),'了!'); + } + if(trigger.player!=player&&player.countCards('h')){ + game.delayex(); + var skill='twshenyi_'+player.playerid; + game.broadcastAll(lib.skill.twshenyi.createGainTag,skill,player.name); + game.addVideo('skill',player,['twshenyi',[skill,player.name]]); + player.give(player.getCards('h'),trigger.player).gaintag.add(skill); + player.addSkill('twshenyi_draw'); + } + } + else player.storage.counttrigger.twshenyi--; + }, + video:(player,info)=>lib.skill.twshenyi.createGainTag(info[0],info[1]), + createGainTag:function(skill,name){ + if(!lib.skill[skill]){ + lib.skill[skill]={charlotte:true}; + lib.translate[skill]='义·'+get.translation(name); + } + if(!_status.postReconnect.twshenyi){ + _status.postReconnect.twshenyi=[ + lib.skill.twshenyi.createGainTag,[],[] + ]; + } + _status.postReconnect.twshenyi[1].add(skill); + _status.postReconnect.twshenyi[2].add(name); + }, + marktext:'义', + intro:{ + name:'侠义', + content:'expansion', + markcount:'expansion', + }, + onremove:function(player,skill){ + delete player.storage[skill]; + //var cards=player.getExpansions(skill); + //if(cards.length) player.loseToDiscardpile(cards); + }, + subSkill:{ + draw:{ + charlotte:true, + audio:'twshenyi', + trigger:{ + global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + filter:function(event,player){ + var skill='twshenyi_'+player.playerid; + return game.hasPlayer(target=>{ + var evt=event.getl(target); + if(!evt||!evt.hs||!evt.hs.length) return false; + for(let i in evt.gaintag_map){ + if(evt.gaintag_map[i].includes(skill)) return true; + } + return false; + }); + }, + forced:true, + direct:true, + content:function(){ + var skill='twshenyi_'+player.playerid; + var num=0; + var targets=game.filterPlayer(target=>{ + var evt=trigger.getl(target); + var numx=0; + if(!evt||!evt.hs||!evt.hs.length) return false; + for(var i in evt.gaintag_map){ + if(evt.gaintag_map[i].includes(skill)) numx++; + } + if(numx>0) return num+=numx; + return false; + }); + if(num>0){ + player.logSkill('twshenyi_draw',targets); + player.draw(num); + } + }, + }, + }, + }, + twxinghan:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return player.getExpansions('twshenyi').length>game.countPlayer(); + }, + check:function(event,player){ + if(player.hp>=3||(player.countCards('h')>=4&&player.getExpansions('twshenyi').every(card=>!player.hasValueTarget(card)||!get.tag(card,'damage')||!lib.skill.xunshi.isXunshi(card)))) return false; + return player.getExpansions('twshenyi').some(card=>player.hasValueTarget(card)); + }, + direct:true, + content:function*(event,map){ + var player=map.player; + var result=yield player.chooseBool().set('createDialog',[ + get.prompt('twxinghan'), + `
    按顺序使用以下“侠义”牌。但是回合结束时你须弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)
    `, + player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse(), + 'hidden', + ]).set('choice',lib.skill.twxinghan.check(null,player)); + if(!result.bool){ + event.finish(); + return; + } + while(true){ + var cards=player.getExpansions('twshenyi').filter(card=>player.hasUseTarget(card)).reverse(); + if(!cards.length) break; + yield player.chooseUseTarget(true,cards[0],false); + } + player.when('phaseEnd').then(()=>{ + if(player.countCards('h')) player.chooseToDiscard(player.countCards('h'),true); + var num=Math.max(1,player.getHp()-1); + player.loseHp(num); + }); + }, + group:'twxinghan_init', + subSkill:{ + init:{ + audio:'twxinghan', + trigger:{ + player:['loseEnd','dying','die','dyingAfter'], + global:['equipEnd','addJudgeEnd','gainEnd','loseAsyncEnd','addToExpansionEnd'], + }, + filter:function(event,player){ + return (player.getExpansions('twshenyi').length&&event.name!='die'&&(!player.countCards('h')||player.isDying()))^player.hasSkill('twxinghan_in'); + }, + forced:true, + firstDo:true, + silent:true, + forceDie:true, + content:function(){ + if(player.getExpansions('twshenyi').length&&trigger.name!='die'&&(!player.countCards('h')||player.isDying())){ + var cards=player.getExpansions('twshenyi'); + var cardsx=cards.map(card=>{ + var cardx=ui.create.card(); + cardx.init(get.cardInfo(card)); + cardx._cardid=card.cardid; + return cardx; + }); + player.directgains(cardsx,null,'twxinghan'); + player.addSkill('twxinghan_in'); + } + else player.removeSkill('twxinghan_in'); + }, + }, + in:{ + charlotte:true, + audio:'twxinghan', + trigger:{player:'addToExpansionEnd'}, + filter:function(event,player){ + return event.gaintag.contains('twshenyi'); + }, + forced:true, + locked:false, + silent:true, + content:function(){ + 'step 0' + var cards2=player.getCards('s',card=>card.hasGaintag('twxinghan')); + if(player.isOnline2()){ + player.send(function(cards,player){ + cards.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + },cards2,player); + } + cards2.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + 'step 1' + var cards=player.getExpansions('twshenyi'); + var cardsx=cards.map(card=>{ + var cardx=ui.create.card(); + cardx.init(get.cardInfo(card)); + cardx._cardid=card.cardid; + return cardx; + }); + player.directgains(cardsx,null,'twxinghan'); + }, + onremove:function(player){ + var cards2=player.getCards('s',card=>card.hasGaintag('twxinghan')); + if(player.isOnline2()){ + player.send(function(cards,player){ + cards.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + },cards2,player); + } + cards2.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + }, + group:'twxinghan_use', + }, + use:{ + charlotte:true, + trigger:{player:['useCardBefore','respondBefore']}, + filter:function(event,player){ + var cards=player.getCards('s',card=>card.hasGaintag('twxinghan')&&card._cardid); + return event.cards&&event.cards.some(card=>{ + return cards.includes(card); + }); + }, + forced:true, + popup:false, + firstDo:true, + content:function(){ + var idList=player.getCards('s',card=>card.hasGaintag('twxinghan')).map(i=>i._cardid); + var cards=player.getExpansions('twshenyi'); + var cards2=[]; + for(var card of trigger.cards){ + var cardx=cards.find(cardx=>cardx.cardid==card._cardid); + if(cardx) cards2.push(cardx); + } + var cards3=trigger.cards.slice(); + trigger.cards=cards2; + trigger.card.cards=cards2; + if(player.isOnline2()){ + player.send(function(cards,player){ + cards.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + },cards3,player); + } + cards3.forEach(i=>i.delete()); + if(player==game.me) ui.updatehl(); + }, + }, + }, + }, //张纮 twquanqian:{ audio:2, @@ -430,7 +956,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ game.checkGlobalHistory('cardMove',function(evt){ if(evt.name=='cardsDiscard'&&evt.getParent('phaseDiscard')==event) cards.addArray(evt.cards); }); - return cards; + return cards.filterInD('d'); }, audio:2, sunbenSkill:true, @@ -462,10 +988,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ switch(get.sgn(att)){ case 1: return [cards,[]]; - break; case 0: return [cardx,cardy]; - break; case -1: var num=Math.ceil(cards.length/2)+(cards.length%2==0?1:0); if(num>1&&player.hasSkill('twchungang')) num--; @@ -475,7 +999,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ cardy.sort((a,b)=>get.value(b)-get.value(a)); cardx.addArray(cardy.slice(num,cardy.length)); return [cardx,cardy.slice(0,num)]; - break; } }).set('cards',cards); 'step 1' @@ -4453,13 +4976,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ effect:{ - target:function(card,player,target){ - if(get.tag(card,'damage')){ - var color=get.color(card); - if(color=='none') return; - var all=target.getAllHistory('damage'); + target:(card,player,target)=>{ + if(typeof card==='object'&&get.tag(card,'damage')){ + let color=get.color(card); + if(color==='none') return; + let all=target.getAllHistory('damage'); if(!all.length||!all[all.length-1].card) return; - if(get.color(all[all.length-1].card)==color) return 'zerotarget'; + if(get.color(all[all.length-1].card)===color) return 'zeroplayertarget'; } }, }, @@ -5226,7 +5749,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; }); }, - direct:true, content:function(){ 'step 0' var target=lib.skill.twenyuan1.logTarget(trigger,player)[0]; @@ -5508,7 +6030,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ })){ event.finish(); return; - }; + } player.chooseTarget(get.prompt('twzhengrong'),'将一名其他角色的一张牌置于武将牌上,称为“荣”',function(card,player,target){ return target!=player&&target.countCards('he'); }).set('ai',function(target){ @@ -5937,7 +6459,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addToExpansion(result.cards[0],'log','give',player).gaintag.add('twmingren'); var card=player.getExpansions('twmingren')[0]; if(card) player.gain(card,'gain2'); - }; + } }, }, }, @@ -8329,7 +8851,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return 6+get.effect(player,card,target,target); } return get.effect(target,{name:'guohe_copy2'},player,player)/2+get.effect(target,card,player,player); - });; + }); 'step 1' if(result.bool){ event.targets=result.targets; @@ -9251,42 +9773,42 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mod:{ cardEnabled:function(card,player){ if(game.hasPlayer(function(current){ - var list=current.storage.twgongsun_shadow; - if(!list) return false; - for(var i=0;i_status.event.goon).set('goon',get.damageEffect(target,player,player)>0); + player.chooseBool('征建:是否对'+get.translation(target)+'造成1点伤害?').set('ai',()=>_status.event.goon).set('goon',get.damageEffect(target,player,_status.event.player)>0); } else{ target.chooseCard('he',true,'交给'+get.translation(player)+'一张牌'); @@ -9350,7 +9872,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else target.damage(); } - player.chooseBool('是否变更【征建】的效果?'); + player.chooseBool('是否变更【征建】的效果?').set('ai',()=>Math.random()>0.5); 'step 2' if(result.bool){ player.removeSkill('twzhengjian_eff0'); @@ -9386,7 +9908,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=trigger.player; event.target=target; if(player.storage.twzhengjian){ - player.chooseBool('征建:是否对'+get.translation(target)+'造成1点伤害?'); + player.chooseBool('征建:是否对'+get.translation(target)+'造成1点伤害?').set('ai',()=>_status.event.goon).set('goon',get.damageEffect(target,player,_status.event.player)>0); } else{ target.chooseCard('he',true,'交给'+get.translation(player)+'一张牌'); @@ -9867,8 +10389,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.logSkill('twfenghan',targets); if(targets.length>1) game.asyncDraw(targets); else{ - targets[0].draw(); - event.finish(); + targets[0].draw(); + event.finish(); } } else{ @@ -10249,20 +10771,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); }, content:function(){ - 'step 0' - player.chooseTarget(lib.skill.twfuzuan.filterTarget,get.prompt('twfuzuan'),'变更一名角色的一个转换技的状态').set('ai',function(target){ - var player=_status.event.player; - return get.effect(target,'twfuzuan',player,player); - }); - 'step 1' - if(result.bool){ - var target=result.targets[0]; - player.logSkill('twfuzuan',target); - var next=game.createEvent('twfuzuan'); - next.player=player; - next.target=target; - next.setContent(lib.skill.twfuzuan.content); - } + 'step 0' + player.chooseTarget(lib.skill.twfuzuan.filterTarget,get.prompt('twfuzuan'),'变更一名角色的一个转换技的状态').set('ai',function(target){ + var player=_status.event.player; + return get.effect(target,'twfuzuan',player,player); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('twfuzuan',target); + var next=game.createEvent('twfuzuan'); + next.player=player; + next.target=target; + next.setContent(lib.skill.twfuzuan.content); + } }, }, }, @@ -10384,7 +10906,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if (trigger.source.countCards('he')) choiceList.push('令'+get.translation(trigger.source)+'弃置两张牌'); player.chooseControl('cancel2').set('prompt2',get.prompt2('yuzhang')).set('choiceList',choiceList).set('ai',function(){ var player=_status.event.player,source=_status.event.source; - if(get.attitude(player,event.source)>=0) return 'cancel2'; + if(get.attitude(player,source)>=0) return 'cancel2'; if(source.hasSkillTag('noh')||source.hasSkillTag('noe')||source.countCards('h')>=4) return 0; if(source.hp>1&&source.countCards('he')>1) return 1; return [0,1].randomGet(); @@ -10417,7 +10939,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, check:function(event,player){ if(event.name=='phaseDiscard') return player.needsToDiscard(); - return event.name=='phaseJudge'; + if(event.name=='phaseJudge') return player.countCards('j'); + return false; }, content:function(){ player.removeMark('twjingce',1); @@ -10702,7 +11225,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(storage){ if(storage){ - return '经过'+storage[1]+'个“回合结束时”后,若有“示”,则从牌堆中获得'+storage[0]+'张和“示”名称相同的牌'; + return '经过'+storage[1]+'个“回合结束时”后,若有“示”,则从牌堆中获得'+storage[0]+'张和“示”名称相同的牌'; } return '未指定施法效果'; }, @@ -10876,7 +11399,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(storage){ if(storage){ - return '经过'+storage[1]+'个“回合结束时”后,回复'+storage[0]+'点体力'; + return '经过'+storage[1]+'个“回合结束时”后,回复'+storage[0]+'点体力'; } return '未指定施法效果'; }, @@ -10952,7 +11475,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(storage){ if(storage){ - return '经过'+storage[1]+'个“回合结束时”后,摸'+storage[0]*2+'张牌'; + return '经过'+storage[1]+'个“回合结束时”后,摸'+storage[0]*2+'张牌'; } return '未指定施法效果'; }, @@ -11032,7 +11555,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(storage){ if(storage){ - return '经过'+storage[1]+'个“回合结束时”后,获得'+storage[0]+'层“防止一次伤害”的效果'; + return '经过'+storage[1]+'个“回合结束时”后,获得'+storage[0]+'层“防止一次伤害”的效果'; } return '未指定施法效果'; }, @@ -11254,7 +11777,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var checkx=get.color(card,player)==get.color(judging); if(checkx>0) return checkx; return 0; - }; + } return result*(attitude>0?1:-1); }).set('judging',trigger.player.judging[0]); 'step 1' @@ -12610,7 +13133,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); }).sortBySeat(); for(var i of list){ - i.discardPlayerCard(player,true,'he').boolline=true; + i.discardPlayerCard(player,true,'he').boolline=true; } }, }, @@ -13189,11 +13712,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ effect:{ target:function(card,player,target){ if(typeof card=='object'&&target.storage.gx_chongyingshenfu_effect&&target.getStorage('gx_chongyingshenfu_effect').includes(card.name)&&!target.hasSkillTag('unequip2')&& - get.itemtype(player)!=='player'||!player.hasSkillTag('jueqing',false,target)&&!player.hasSkillTag('unequip',false,{ + (get.itemtype(player)!=='player'||!player.hasSkillTag('jueqing',false,target)&&!player.hasSkillTag('unequip',false,{ name:card.name, target:target, card:card, - })){ + }))){ if(player&&player.hasSkillTag('damageBonus',true,{ target:target, card:card @@ -14057,6 +14580,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jiangji:['tw_jiangji','jiangji'], baoxin:['tw_baoxin','baoxin'], yanxiang:['yanxiang','tw_yanxiang'], + liwei:['liwei','tw_liwei'], }, dynamicTranslate:{ twfeifu:function(player){ @@ -14698,6 +15222,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kaisa:"凯撒", zhengfu:"征服", zhengfu_info:"当你使用【杀】指定目标时,你可以选择一种牌的类别,然后除非目标角色交给你一种该类别的牌,否则其不能闪避此【杀】。", + xia_xiahoudun:'侠夏侯惇', + xia_xiahoudun_prefix:'侠', + twdanlie:'胆烈', + twdanlie_info:'①出牌阶段限一次。你可以与至多三名其他角色共同拼点。若你赢,你对没赢的角色依次造成1点伤害;若你没赢,你失去1点体力。②你的拼点牌点数+X(X为你已损失的体力值)。', + xia_zhangwei:'张葳', + twhuzhong:'护众', + twhuzhong_info:'当你于出牌阶段使用无属性【杀】指定唯一目标角色时,你可以选择一项:①弃置一张手牌,然后你可以为此牌额外选择一个目标;②令其弃置一张手牌,此牌结算完毕后,若此牌造成过伤害,则你摸一张牌且本阶段可以额外使用一张【杀】,否则其对你造成1点伤害。', + twfenwang:'焚亡', + twfenwang_info:'①当你受到属性伤害时,你须弃置一张牌或令此伤害+1。②当你对其他角色造成非属性伤害时,若你的手牌数大于其,则此伤害+1。', + xia_xiahousone:'夏侯子萼', + twchengxi:'承袭', + twchengxi_info:'出牌阶段每名角色限一次,你可以摸一张牌并与一名其他角色拼点。若你赢,你使用的下一张基本牌或非延时锦囊牌结算完毕后,你视为对原目标使用一张无次数限制的同名牌;若你没赢,其视为对你使用一张无距离限制的【杀】。', + xia_liubei:'侠刘备', + xia_liubei_prefix:'侠', + twshenyi:'伸义', + twshenyi_info:'每回合限一次。当你或你攻击范围内的一名角色于一回合内首次受到伤害后,你可以声明一种基本牌或锦囊牌(每种牌名限一次),然后从牌堆中将一张同名牌称为“侠义”置于武将牌上。若受伤角色不为你,则你将所有手牌交给其,且当其失去一张你以此法交给其的牌后,你摸一张牌。', + twxinghan:'兴汉', + twxinghan_info:'①当你没有手牌时或你处于濒死状态时,你可以如手牌般使用或打出“侠义”牌。②准备阶段,若“侠义”牌数大于存活角色数,则你可以依次使用其中所有可以使用的牌。然后你获得如下效果:回合结束时,你弃置所有手牌并失去X点体力(X为你的体力值-1且X至少为1)。', tw_mobile:'海外服·稀有专属', tw_yunchouzhi:'运筹帷幄·智', diff --git a/character/xianding.js b/character/xianding.js index ff7c6b997..284da0d6f 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4,16 +4,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'xianding', connect:true, character:{ + zhugeruoxue:['female','wei',3,['dcqiongying','dcnuanhui']], + caoyi:['female','wei',4,['dcmiyi','dcyinjun']], + malingli:['female','shu',3,['dclima','dcxiaoyin','dchuahuo']], wu_luxun:['male','wu',3,['dcxiongmu','dczhangcai','dcruxian']], dc_xujing:['male','shu',3,['dcshangyu','dccaixia']], dc_zhaoxiang:['female','shu',4,['refanghun','refuhan']], dc_guansuo:['male','shu',4,['xinzhengnan','xiefang']], + xin_baosanniang:['female','shu',3,['decadewuniang','decadexushen']], dc_shixie:['male','qun',3,['rebiluan','ollixia']], dc_sp_machao:['male','qun',4,['zhuiji','dc_olshichou']], old_huangfusong:['male','qun',4,['xinfenyue']], dc_xiahouba:['male','shu',4,['rebaobian']], dc_daxiaoqiao:['female','wu',3,['dcxingwu','dcluoyan']], - tianshangyi:['female','wei',3,['dcposuo','dcxiaoren'],['unseen']], + tianshangyi:['female','wei',3,['dcposuo','dcxiaoren']], sunlingluan:['female','wu',3,['dclingyue','dcpandi']], dc_wangjun:['male','qun',4,['dctongye','dcchangqu']], zhoubuyi:['male','wei',3,['dcshiji','dcsilun']], @@ -28,7 +32,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhangjinyun:['female','shu',3,['dchuizhi','dcjijiao']], huanfan:['male','wei',3,['dcjianzheng','dcfumou']], chentai:['male','wei',4,['dcctjiuxian','dcchenyong']], - sunyu:['male','wu',3,['dcquanshou','dcshexue'],['unseen']], + sunyu:['male','wu',3,['dcquanshou','dcshexue']], xizheng:['male','shu',3,['dcdanyi','dcwencan']], dc_ruiji:['female','wu',4,['dcwangyuan','dclingyin','dcliying']], zerong:['male','qun',4,['dccansi','dcfozong']], @@ -89,18 +93,491 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp2_bizhe:['dc_luotong','dc_wangchang','chengbing','dc_yangbiao','ruanji'], sp2_huangjia:['caomao','liubian','dc_liuyu','quanhuijie','dingshangwan','yuanji','xielingyu','sunyu','ganfurenmifuren','dc_ganfuren','dc_mifuren','dc_shixie'], sp2_zhangtai:['guozhao','fanyufeng','ruanyu','yangwan','re_panshu'], - sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger','zhangfen'], - sp2_yinyu:['zhouyi','luyi','sunlingluan'], + sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger','zhangfen','zhugeruoxue'], + sp2_yinyu:['zhouyi','luyi','sunlingluan','caoyi'], sp2_wangzhe:['dc_daxiaoqiao','dc_sp_machao'], - sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi'], + sp2_doukou:['re_xinxianying','huaman','xuelingyun','dc_ruiji','duanqiaoxiao','tianshangyi','malingli'], sp2_jichu:['zhaoang','dc_liuye','dc_wangyun','yanghong','huanfan','xizheng'], sp2_yuxiu:['dongguiren','dc_tengfanglan','zhangjinyun','zhoubuyi','dc_xujing'], - sp2_qifu:['dc_guansuo','dc_zhaoxiang'], + sp2_qifu:['dc_guansuo','xin_baosanniang','dc_zhaoxiang'], sp2_gaoshan:['wanglang','liuhui'], sp2_wumiao:['wu_zhugeliang','wu_luxun'], } }, skill:{ + //诸葛若雪 + dcqiongying:{ + audio:2, + enable:'phaseUse', + usable:1, + direct:true, + filter:function(event,player){ + return player.canMoveCard(); + }, + content:function*(event,map){ + const player=map.player; + event.pushHandler('onNextMoveCard',(event,option)=>{ + if(_status.connectMode&&event.step==1&&event._result.bool&&option.state=='end'){ + game.broadcastAll(()=>{ + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + }); + let result=yield player.moveCard(false,`###琼英###移动场上的一张牌,然后弃置一张与此牌花色相同的手牌(若没有则展示手牌)。`).set('logSkill','dcqiongying').set('custom',{ + add:{}, + replace:{ + window:()=>{ + if(get.event().name=='chooseTarget') ui.click.cancel(); + } + }, + }); + if(result.bool){ + const card=result.card,suit=get.suit(card); + if(!player.hasCard({suit:suit})) player.showHandcards(); + else player.chooseToDiscard({suit:suit},true,`请弃置一张${get.translation(suit)}手牌`); + } + else{ + player.getStat('skill').dcqiongying--; + } + }, + ai:{ + expose:0.2, + order:function(item,player){ + if(player.countCards('h')<=4) return 0.5; + return 9; + }, + result:{ + player:function(player){ + if(player.canMoveCard(true)) return 1; + return 0; + } + } + } + }, + dcnuanhui:{ + audio:2, + trigger:{player:'phaseJieshuBegin'}, + direct:true, + filter:function(event,player){ + return game.hasPlayer(current=>current.countCards('e')); + }, + content:function*(event,map){ + const player=map.player; + let result=yield player.chooseTarget(get.prompt('dcnuanhui'),'选择一名装备区有牌的角色,该角色可以依次使用X张基本牌(X为其装备区牌数)。',(card,player,target)=>{ + return target.countCards('e'); + }).set('ai',target=>{ + return get.event('aiTarget')==target?10:0; + }).set('aiTarget',(()=>{ + const player=get.player(); + const list=get.inpileVCardList(info=>{ + return info[0]=='basic'; + }); + if(!list.length) return null; + const getUseValue=target=>{ + if(get.attitude(player,target)<=0) return -1; + const toUse=[]; + const hp=target.hp; + let eff=0,count=target.countCards('e'); + while(count--){ + target.hp=Math.min(target.maxHp,target.hp+toUse.filter(card=>card.name=='tao').length); + const listx=list.map(info=>{ + const card=new lib.element.VCard({name:info[2],nature:info[3],isCard:true}); + return [card,target.getUseValue(card)]; + }).sort((a,b)=>{ + return b[1]-a[1]; + }); + const mostValuablePair=listx[0].slice(); + if(mostValuablePair[1]<=0) mostValuablePair[1]=0; + eff+=mostValuablePair[1]; + toUse.push(mostValuablePair[0]); + target.hp=hp; + } + if(toUse.length>1&&eff>0){ + eff-=target.getCards('e',card=>{ + return lib.filter.cardDiscardable(card,target,'dcnuanhui'); + }).map(card=>{ + return get.value(card,target); + }).reduce((p,c)=>{ + return p+c; + },0); + } + return eff; + } + const playerList=game.filterPlayer(current=>{ + return current.countCards('e'); + }).map(current=>[current,getUseValue(current)]).sort((a,b)=>{ + return b[1]-a[1]; + }); + if(playerList[0][1]<=0) return null; + return playerList[0][0]; + })()); + if(!result.bool) return event.finish(); + const target=result.targets[0]; + player.logSkill('dcnuanhui',target); + if(!target.isUnderControl(true)&&!target.isOnline()) game.delayx(); + const total=target.countCards('e'); + let count=0,forced=false; + while(count{ + return info[0]=='basic'&&target.hasUseTarget({name:info[2],nature:info[3],isCard:true}); + }); + if(!basicList.length){ + game.log('但是',target,'无牌可出!'); + break; + } + const str=forced?'视为使用一张基本牌':'是否视为使用一张基本牌?'; + result=yield target.chooseButton([str,[basicList,'vcard']],forced).set('ai',button=>{ + return get.player().getUseValue({name:button.link[2],nature:button.link[3],isCard:true}); + }); + if(!result.bool){ + game.log('但是',target,'不愿出牌!'); + break; + } + forced=true; + const card=new lib.element.VCard({name:result.links[0][2],nature:result.links[0][3],isCard:true}); + yield target.chooseUseTarget(card,true,false); + count++; + } + if(count>1){ + const cards=target.getCards('e',card=>{ + return lib.filter.cardDiscardable(card,target,'dcnuanhui'); + }); + if(cards.length) target.discard(cards).discarder=target; + } + }, + ai:{ + expose:0.3, + threaten:3.7, + }, + }, + //曹轶 + dcmiyi:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + direct:true, + content:function*(event,map){ + const player=map.player; + if(_status.connectMode) game.broadcastAll(()=>{_status.noclearcountdown=true}); + let result=yield player.chooseControl(['回复体力','受到伤害'],'cancel2').set('choiceList',[ + '令你即将选择的角色各回复1点体力', + '令你即将选择的角色各受到你造成的1点伤害' + ]).set('prompt',get.prompt('dcmiyi')).set('ai',()=>{ + return get.event('choice'); + }).set('choice',(()=>{ + let damage=0; + game.countPlayer(current=>{ + let eff=get.damageEffect(current,player,player); + if(!current.isDamaged()){ + if(eff>0) eff=-eff; + } + else if(current.hasSkillTag('maixie')){ + if(get.attitude(player,current)<=0){ + if(current.getHp(true)>=2) eff=0; + else eff/=10; + } + else if(current.getHp(true)>=2){ + eff+=30; + } + } + else eff/=3; + damage+=eff; + }) + if(damage<-20) return 0; + if(damage>5) return 1; + if(lib.skill.mbhuiyao.getUnrealDamageTargets(player,[[player],game.filterPlayer()])) return 0; + return 'cancel2'; + })()); + if(result.control=='cancel2'){ + if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} + return event.finish(); + } + const func=['recover','damage'],ind=result.index; + const fn=func[ind]; + result=yield player.chooseTarget(`蜜饴:令任意名角色${result.control.slice(0,2)}1点${result.control.slice(2)}`,[1,Infinity]).set('ai',target=>{ + const toDamage=get.event('toDamage'); + let eff=get.damageEffect(target,player,player); + if(toDamage){ + if(target.hasSkillTag('maixie')){ + if(get.attitude(player,target)<=0){ + if(target.getHp(true)>=2) eff=0; + else eff/=10; + } + else if(target.getHp(true)>=2){ + eff+=30; + } + } + return eff; + } + if(!target.isDamaged()){ + eff*=-2; + } + if(target.getHp(true)>=2) return -eff; + return 0; + }).set('toDamage',result.index==1); + if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} + if(!result.bool) return event.finish(); + const targets=result.targets.slice().sortBySeat(); + player.logSkill('dcmiyi',targets,fn=='damage'?'fire':'green'); + while(targets.length){ + const target=targets.shift(); + if(!target.isIn()) continue; + target[fn](); + target.when({global:'phaseJieshuBegin'}).vars({ + fn:func[ind^1], + source:player, + }).then(()=>{ + if(source.isIn()){ + if(!trigger._dcmiyi_logged){ + source.logSkill('dcmiyi'); + trigger._dcmiyi_logged=true; + } + source.line(player,fn=='damage'?'fire':'green'); + } + player[fn](source); + }); + } + }, + }, + dcyinjun:{ + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + if(get.name(event.card,false)!='sha'&&get.type2(event.card)!='trick') return false; + if(event.targets.length!=1||!event.targets[0].isIn()) return false; + if(!player.canUse(new lib.element.VCard({name:'sha'}),event.targets[0])) return false; + return player.hasHistory('lose',evt=>{ + if(evt.getParent()!=event) return false; + return event.cards.every(card=>{ + return evt.hs.includes(card); + }); + }); + }, + prompt2:function(event,player){ + return `视为对${get.translation(event.targets)}使用一张无伤害来源的【杀】`; + }, + check:function(event,player){ + const sha=new lib.element.VCard({name:'sha'}); + return Math.max(...[event.targets[0],player].map(source=>get.effect(event.targets[0],sha,source,player)))>0; + }, + logTarget:'targets', + content:function*(event,map){ + const player=map.player,trigger=map.trigger,target=trigger.targets[0]; + yield player.useCard(new lib.element.VCard({name:'sha'}),target,false).oncard=()=>{ + get.event().customArgs.default.customSource={ + isDead:()=>true, + } + }; + if(player.getHistory('useSkill',evt=>evt.skill=='dcyinjun').length>player.getHp()){ + player.tempBanSkill('dcyinjun'); + } + } + }, + //马伶俐 + dclima:{ + audio:2, + mod:{ + globalFrom:function(from,to,distance){ + return distance-Math.max(1,game.countPlayer(current=>{ + return current.countCards('e',card=>{ + return get.is.attackingMount(card)||get.is.defendingMount(card); + }); + })); + } + } + }, + dcxiaoyin:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return game.hasPlayer(current=>get.distance(player,current)<=1); + }, + group:'dcxiaoyin_damage', + prompt2:function(event,player){ + return `亮出牌堆顶的${get.cnNumber(game.countPlayer(current=>get.distance(player,current)<=1))}张牌,获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上。`; + }, + frequent:true, + check:()=>true, + content:function*(event,map){ + var player=map.player; + var count=game.countPlayer(current=>get.distance(player,current)<=1); + var cards=game.cardsGotoOrdering(get.cards(count)).cards; + yield player.showCards(cards,`${get.translation(player)}【硝引】亮出`); + player.gain(cards.filter(i=>get.color(i,false)=='red'),'gain2'); + var blackOnes=cards.filter(i=>get.color(i,false)=='black'); + if(!blackOnes.length) return event.finish(); + event.videoId=lib.status.videoId++; + var func=(cards,id)=>{ + var dialog=ui.create.dialog('硝引:剩余的黑色牌',`
    请选择至多${get.cnNumber(cards.length)}名座次连续的其他角色,然后将以下这些牌置于这些角色的武将牌上。
    `,cards); + dialog.videoId=id; + return dialog; + }; + if(player==game.me) func(blackOnes,event.videoId); + else if(player.isOnline2()){ + player.send(func,blackOnes,event.videoId); + } + var targets=game.filterPlayer(current=>current!=player); + if(targets.length==1) var result={bool:true,targets:targets}; + else var result=yield player.chooseTarget([1,blackOnes.length],true,(card,player,target)=>{ + if(player==target) return false; + var selected=ui.selected.targets; + if(!selected.length) return true; + for(var i of selected){ + if(i.getNext()==target||i.getPrevious()==target) return true; + } + return false; + }).set('complexSelect',true).set('complexTarget',true).set('multitarget',true).set('multiline',true).set('ai',target=>{ + if(get.event('aiTargets').includes(target)) return 10; + return 0.1; + }).set('aiTargets',(()=>{ + var targets=game.filterPlayer(i=>i!=player).sortBySeat(player); + var maxEff=-Infinity,aiTargets=[]; + for(var i=0;i{ + return get.damageEffect(current,current,player,'fire'); + }).reduce((p,c)=>{ + return p+c; + },0); + if(tmpEff>maxEff){ + maxEff=tmpEff; + aiTargets=targetsx; + } + } + } + return aiTargets; + })()).set('prompt',false); + if(!result.bool){ + event.finish(); + return; + } + var func=(num,id)=>{ + var dialog=get.idDialog(id); + if(dialog) dialog.content.childNodes[1].innerHTML=`
    将${get.cnNumber(num)}张黑色牌按照选择的角色的座次顺序置于这些角色武将牌上
    `; + }; + var targets=result.targets.slice().sortBySeat(player); + var num=targets.length; + if(player==game.me) func(num,event.videoId); + else if(player.isOnline2()) player.send(func,num,event.videoId); + if(blackOnes.length==1) var result={bool:true,links:blackOnes}; + else var result=yield player.chooseButton(true,num).set('dialog',event.videoId).set('ai',()=>1); + game.broadcastAll('closeDialog',event.videoId); + if(result.bool){ + var cards=result.links; + player.line(targets); + targets.forEach((current,ind)=>{ + current.addToExpansion(cards[ind],'gain2').gaintag.add('dcxiaoyin'); + game.log(current,'将',cards[ind],'当“硝引”置于了武将牌上'); + }); + } + }, + marktext:'硝', + intro:{ + content:'expansion', + markcount:'expansion', + }, + subSkill:{ + damage:{ + audio:'dcxiaoyin', + trigger:{global:'damageBegin3'}, + filter:function(event,player){ + if(!event.source||!event.source.isIn()) return false; + return event.player.getExpansions('dcxiaoyin').length; + }, + direct:true, + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + var source=trigger.source,target=trigger.player; + var cards=target.getExpansions('dcxiaoyin'); + if(trigger.hasNature('fire')){ + var types=cards.map(i=>get.type2(i,false)); + var str=get.translation(types).replace(/(.*)、/, '$1或'); + var result=yield source.chooseCard(`硝引:是否弃置一张${str}牌?`,`若如此做,将${get.translation(target)}的所有“硝引”牌置入弃牌堆,令你对其造成的伤害+1`,'he',function(card,player){ + if(!get.event('types').includes(get.type2(card))) return false; + return lib.filter.cardDiscardable.apply(this,arguments); + }).set('types',types).set('ai',card=>{ + if(get.event('goon')) return 7-get.value(card); + return 0; + }).set('goon',get.damageEffect(target,player,player,'fire')>0&&get.attitude(player,target)<=0); + if(result.bool){ + player.logSkill('dcxiaoyin_damage',source); + source.line(target,'fire'); + source.discard(result.cards).discarder=source; + game.delayex(); + target.loseToDiscardpile(cards); + trigger.addNumber('num',1); + } + } + else{ + var result=yield source.chooseBool(`###是否响应${get.translation(player)}的【硝引】?###获得${get.translation(target)}的“硝引”牌(${get.translation(cards)}),然后将你对其造成的此次伤害改为火焰伤害。`).set('choice',(()=>{ + if(get.damageEffect(target,source,source,'fire')get.value(i)).reduce((p,c)=>p+c,0)>0) return true; + return false; + })()); + if(result.bool){ + player.logSkill('dcxiaoyin_damage',source); + source.line(target,'fire'); + source.gain(cards,target,'give'); + game.setNature(trigger,'fire'); + } + } + }, + }, + }, + ai:{ + threaten:4, + }, + }, + dchuahuo:{ + audio:2, + enable:'phaseUse', + usable:1, + viewAs:{ + name:'sha', + nature:'fire', + storage:{dchuahuo:true}, + }, + filterCard:{color:'red'}, + position:'hs', + filter:function(event,player){ + return player.countCards('hs',{color:'red'}); + }, + check:function(card){ + return 6-get.value(card); + }, + precontent:function(){ + event.getParent().addCount=false; + player.when('useCardToPlayer').filter(evt=>evt.card.storage&&evt.card.storage.dchuahuo).then(()=>{ + if(trigger.target.getExpansions('dcxiaoyin').length){ + var targets=game.filterPlayer(current=>{ + return current.getExpansions('dcxiaoyin').length; + }); + player.chooseBool(`是否更改${get.translation(trigger.card)}的目标?`,`将此牌的目标改为所有有“硝引”的角色(${get.translation(targets)})。`) + .set('choice',targets.map(current=>get.effect(current,trigger.card,player,player)).reduce((p,c)=>p+c,0)>get.effect(trigger.target,trigger.card,player,player)); + } + else event.finish(); + }).then(()=>{ + if(result.bool){ + trigger.targets.length=0; + trigger.getParent().triggeredTargets1.length=0; + trigger.untrigger(); + var targets=game.filterPlayer(current=>{ + return current.getExpansions('dcxiaoyin').length; + }); + player.line(targets,'fire'); + trigger.targets.addArray(targets); + game.log(targets,'成为了',trigger.card,'的新目标'); + game.delayx(); + } + }) + }, + ai:{ + order:()=>get.order({name:'sha'})+0.2, + result:{player:1}, + } + }, //武陆逊 dcxiongmu:{ audio:2, @@ -155,7 +632,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(shown.length0){ player.$gain2(shown,false); @@ -1506,7 +1983,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(type=='equip'&&game.hasPlayer(current=>{ return current.canEquip(card); })||type=='delay'&&game.hasPlayer(current=>{ - return !current.storage._disableJudge&&!current.hasJudge(card.name); + return current.canAddJudge(card); })) choices.unshift('场上'); player.chooseControl(choices).set('prompt','请选择要将'+get.translation(card)+'置于的位置').set('ai',()=>{ return _status.event.choice; @@ -1526,7 +2003,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 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); + if(type=='delay') return current.canAddJudge(card); return false; })).set('ai',target=>{ var player=_status.event.player; @@ -1539,7 +2016,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ player.$throw(card,1000); - var next=player.lose(card,ui.cardPile); + var next=player.lose(card,ui.cardPile,'visible'); if(result.control=='牌堆顶') next.insert_card=true; game.log(player,'将',card,'置于了','#y'+result.control); } @@ -1555,7 +2032,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ target.addJudge(card); } } - if(event.count<4) event.goto(1); 'step 5' game.countPlayer(current=>{ var count=current.countCards('e'); @@ -1564,7 +2040,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ current.link(false); current.turnOver(false); } + event.equipCount[current.playerid]=count; }); + if(event.count<4) event.goto(1); } }, //杜预 @@ -1624,7 +2102,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterTarget:()=>true, filterCard:()=>false, selectCard:-1, - charlotte:true, content:function(){ 'step 0' target.draw(); @@ -1652,7 +2129,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, filterCard:()=>false, selectCard:-1, - charlotte:true, content:function(){ 'step 0' target.chooseToDiscard('he',true,'谏国:请弃置一张牌'); @@ -2806,7 +3282,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ result:{ target:function(player,target){ if(ui.cardPile.childNodes.length>game.players.length*5&&!player.hasSkill('dcjijiao_risutoa')&& - !game.hasPlayer(current=>current.hp<=1)&&game.countPlayer(current=>current.hp===2&¤t.countCards('hes')<3)<=1) return 0; + !game.hasPlayer(current=>current.hp<=1)&&game.countPlayer(current=>current.hp===2&¤t.countCards('hes')<3)<=1) return 0; return 5; } } @@ -3145,11 +3621,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{global:'phaseBegin'}, filter:function(event,player){ - return event.player.countCards('h')0||event.player.maxHp-event.player.countCards('h')<=2; + if(get.attitude(player,event.player)>0) return true; + const draw=event.player.maxHp-event.player.countCards('h'); + return draw<=2&&event.player.getHp(true)-draw>=1; }, content:function(){ 'step 0' @@ -3161,7 +3639,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var draw=Math.min(5,Math.max(0,trigger.player.maxHp-trigger.player.countCards('h'))); if(get.attitude(trigger.player,player)>0){ if(draw>=3||trigger.player.getCardUsable('sha')>1) return '选项一'; - if(draw<=1&&trigger.player.countCards('hs',card=>{ + if(!draw||draw<=1&&trigger.player.countCards('hs',card=>{ return get.name(card)=='sha'&&trigger.player.hasValueTarget(card); })) return '选项二'; return '选项一'; @@ -3212,7 +3690,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ popup:false, charlotte:true, onremove:true, - marktext:'守', + marktext:'', intro:{content:'本回合使用的牌被抵消后,$摸一张牌'}, content:function(){ var targets=player.getStorage('dcquanshou_respond'); @@ -3232,7 +3710,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseUseBegin'}, filter:function(event,player){ var card=lib.skill.dcshexue.getLast(); - return card&&player.hasUseTarget(card); + return card&&player.hasUseTarget(card,false); }, getLast:function(){ for(var current of game.filterPlayer()){ @@ -3258,10 +3736,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var card=lib.skill.dcshexue.getLast(); game.broadcastAll(function(card){ lib.skill.dcshexue_backup.viewAs=card; - lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?'; },card); var next=player.chooseToUse(); - next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?'); + next.set('openskilldialog',`###${get.prompt('dcshexue')}###将一张牌当做${get.translation(card.nature)||''}【${get.translation(card.name)}】使用`); next.set('norestore',true); next.set('addCount',false); next.set('_backupevent','dcshexue_backup'); @@ -3277,6 +3754,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filterCard:function(card){ return get.itemtype(card)=='card'; }, + filterTarget:lib.filter.targetEnabled, position:'hes', selectCard:1, check:(card)=>6-get.value(card), @@ -3297,6 +3775,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var card=history[history.length-1].card; return '令下一回合的角色于其出牌阶段开始时选择是否将一张牌当做'+(get.translation(card.nature)||'')+'【'+get.translation(card.name)+'】使用'; }, + check:function(event,player){ + let evt=event.getParent('phase').getParent(); + let nextPlayer=player.getNext(); + if(evt&&evt.next&&evt.next.length){ + nextPlayer=evt.next[0].player; + } + return get.attitude(player,nextPlayer)>0; + }, content:function(){ var history=player.getHistory('useCard',evt=>{ return evt.getParent('phaseUse')==trigger&&(get.type(evt.card)=='basic'||get.type(evt.card)=='trick'); @@ -3311,7 +3797,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ study:{ trigger:{player:'phaseUseBegin'}, filter:function(event,player){ - return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i)); + return player.getStorage('dcshexue_study').some(i=>event.player.hasUseTarget(i,false)); }, onremove:true, charlotte:true, @@ -3321,13 +3807,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ event.cards=player.getStorage('dcshexue_study'); 'step 1' var card=cards.pop(); - if(trigger.player.hasUseTarget(card)){ + if(trigger.player.hasUseTarget(card,false)){ game.broadcastAll(function(card){ lib.skill.dcshexue_backup.viewAs=card; lib.skill.dcshexue_backup.prompt='设学:是否将一张牌当做'+get.translation(card)+'使用?'; },card); var next=trigger.player.chooseToUse(); - next.set('openskilldialog','设学:是否将一张牌当做'+get.translation(card)+'使用?'); + next.set('openskilldialog',`###${get.prompt('dcshexue_study')}###将一张牌当做${get.translation(card.nature)||''}【${get.translation(card.name)}】使用`); next.set('norestore',true); next.set('addCount',false); next.set('_backupevent','dcshexue_backup'); @@ -3706,12 +4192,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - player.recover(player.getDamagedHp()); + player.recover(player.getDamagedHp(true)); player.drawTo(player.maxHp); 'step 1' var check=0; if(player.hasHistory('gain',evt=>{ - return evt.getParent(2)==event&&evt.cards.length>=2; + return evt.getParent(2)==event&&evt.cards.length>=3; })) check|=1; if(game.getGlobalHistory('changeHp',evt=>{ return evt.getParent().name=='recover'&&evt.getParent(2)==event; @@ -3737,7 +4223,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ if((player.storage.dcxinyou_effect&1)>0) player.loseHp(); - if((player.storage.dcxinyou_effect&2)>0) player.chooseToDiscard('心幽:弃置两张牌',2,true,'he'); + if((player.storage.dcxinyou_effect&2)>0) player.chooseToDiscard('心幽:请弃置一张牌',1,true,'he'); } } } @@ -4061,43 +4547,40 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - if(lib.skill.dcjinjie.hasPhase(player)){ - player.chooseBool(get.prompt('dcjinjie',trigger.player),'令其摸一张牌').set('ai',()=>{ - return get.attitude(_status.event.player,_status.event.getTrigger().player)>0; - }); - } - else{ - var num=0; - var history=player.actionHistory; - for(var i=history.length-1;i>=0;i--){ - for(var evt of history[i].useSkill){ - if(evt.skill=='dcjinjie') num++; - } - if(history[i].isRound) break; - } - if(num==0){ - player.chooseBool(get.prompt('dcjinjie',trigger.player),'令其回复1点体力').set('ai',()=>{ - var player=_status.event.player; - return get.effect(_status.event.getTrigger().player,{name:'tao'},player,player)>0; - }); - } - else{ - player.chooseToDiscard(get.prompt('dcjinjie',trigger.player),'弃置'+get.cnNumber(num)+'张牌,令其回复1点体力','he',num).set('ai',card=>{ - if(_status.event.eff>0) return get.value({name:'tao'})-get.value(card); - return 0; - }).set('eff',get.effect(trigger.player,{name:'tao'},player,player)).set('logSkill',['dcjinjie',trigger.player]); - } - event.goto(2); - } + player.chooseBool(get.prompt('dcjinjie',trigger.player),'令其摸一张牌').set('ai',()=>{ + return get.attitude(_status.event.player,_status.event.getTrigger().player)>0; + }); 'step 1' if(result.bool){ player.logSkill('dcjinjie',trigger.player); trigger.player.draw(); } - event.finish(); + else event.finish(); + if(lib.skill.dcjinjie.hasPhase(player)) event.finish(); 'step 2' + var num=0; + var history=player.actionHistory; + for(var i=history.length-1;i>=0;i--){ + for(var evt of history[i].useSkill){ + if(evt.skill=='dcjinjie') num++; + } + if(history[i].isRound) break; + } + if(num==0){ + player.chooseBool(get.prompt('dcjinjie',trigger.player),'令其回复1点体力').set('ai',()=>{ + var player=_status.event.player; + return get.effect(_status.event.getTrigger().player,{name:'tao'},player,player)>0; + }); + } + else{ + player.chooseToDiscard(get.prompt('dcjinjie',trigger.player),'弃置'+get.cnNumber(num)+'张牌,令其回复1点体力','he',num).set('ai',card=>{ + if(_status.event.eff>0) return get.value({name:'tao'})-get.value(card); + return 0; + }).set('eff',get.effect(trigger.player,{name:'tao'},player,player)); + } + 'step 3' if(result.bool){ - if(!result.cards||!result.cards.length) player.logSkill('dcjinjie',trigger.player); + player.line(trigger.player,'green'); trigger.player.recover(); } }, @@ -4107,12 +4590,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseZhunbeiBegin'}, direct:true, filter:function(event,player){ - return game.hasPlayer(current=>current.isHealthy()&&player.canUse('sha',current,false)); + return game.hasPlayer(current=>(current.getHp()>player.getHp()||current.countCards('h')>player.countCards('h'))&&player.canUse('sha',current,false)); }, content:function(){ 'step 0' - player.chooseTarget(get.prompt('dcjue'),'视为对一名未受伤的角色使用一张【杀】',(card,player,target)=>{ - return player.canUse('sha',target,false)&&target.isHealthy(); + player.chooseTarget(get.prompt('dcjue'),'视为对一名体力值或手牌数大于你的角色使用一张【杀】',(card,player,target)=>{ + return player.canUse('sha',target,false)&&(target.getHp()>player.getHp()||target.countCards('h')>player.countCards('h')); }).set('ai',target=>{ return get.effect(target,{name:'sha'},_status.event.player); }); @@ -4141,7 +4624,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var selected=ui.selected.targets; if(!selected.length) return true; for(var i of selected){ - if(i.getNext()==target||i.getPrevious()==target) return true; + if(i.getNext()==target||i.getPrevious()==target) return true; } return false; }, @@ -4245,7 +4728,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ try{ targetsx=game.filterPlayer(current=>player.inRange(current)); } - catch(e){player.storage.dcyuanmo_range=_tmp}; + catch(e){ + player.storage.dcyuanmo_range=_tmp + } player.storage.dcyuanmo_range=_tmp; targetsx.removeArray(targets); return targetsx.reduce((p,c)=>{ @@ -4926,11 +5411,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ effect:{ - target:function(card,player,target){ - if(player==target) return; + target:(card,player,target)=>{ + if(player===target) return; if(game.hasPlayer2(current=>{ return current.hasHistory('useCard',evt=>evt.card.name==card.name&&evt.targets&&evt.targets.contains(player)); - })) return 'zerotarget'; + })) return 'zeroplayertarget'; } } } @@ -6061,7 +6546,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcshoutan:{ audio:2, enable:'phaseUse', - selectCard:-1, position:'h', filter:function(event,player){ if(player.hasSkill('dcyaoyi')) return !player.hasSkill('dcshoutan_blocker',null,null,false); @@ -8052,7 +8536,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 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; + if(i.getNext()==target||i.getPrevious()==target) return true; } return false; }, @@ -8626,20 +9110,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, group:'baoshu_draw', subSkill:{ - draw:{ - trigger:{global:'phaseDrawBegin2'}, - forced:true, - popup:false, - filter:function(event,player){ - return !event.numFixed&&event.player.hasMark('baoshu'); - }, - content:function(){ - var target=trigger.player,num=target.countMark('baoshu'); - trigger.player.logSkill('baoshu_draw'); - trigger.num+=num; - trigger.player.removeMark('baoshu',num); - }, - }, + draw:{ + trigger:{global:'phaseDrawBegin2'}, + forced:true, + popup:false, + filter:function(event,player){ + return !event.numFixed&&event.player.hasMark('baoshu'); + }, + content:function(){ + var target=trigger.player,num=target.countMark('baoshu'); + trigger.player.logSkill('baoshu_draw'); + trigger.num+=num; + trigger.player.removeMark('baoshu',num); + }, + }, }, }, //吴范 @@ -8908,7 +9392,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(blacks.length>0){ dialog.push('
    黑色牌
    '); dialog.push(blacks); - }; + } player.chooseButton(dialog,true).set('ai',function(button){ var player=_status.event.player; var color=get.color(button.link),cards=player.getExpansions('syjiqiao'); @@ -9255,7 +9739,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ switch(button.link){ case 0: return 2; - break; case 1: return Math.max(0.5,player.countCards('hs',function(card){ return get.name(card)=='sha'&&player.hasValueTarget(card); @@ -9264,10 +9747,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).map(function(target){ return get.damageEffect(target,player,player); })); - break; case 2: return player.needsToDiscard()/4; - break; case 3: var num=0; return 0.8*Math.max.apply(Math,game.filterPlayer(function(current){ @@ -9275,7 +9756,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).map(function(target){ return get.effect(target,{name:'shunshou_copy'},player,player); })); - break; case 4: var num=0; game.countPlayer(function(current){ @@ -9285,7 +9765,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }); return num*0.8; - break; } }); if(player.getDamagedHp()>0) next.set('selectButton',[1,1+player.getDamagedHp()]); @@ -10230,7 +10709,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ enable:'phaseUse', usable:1, filter:function(event,player){ - return !player.storage.zunwei||player.storage.zunwei.length<3; + let storage=player.getStorage('zunwei'); + return storage.length<3&&game.hasPlayer(current=>{ + return player.isDamaged()&¤t.getHp()>player.getHp()&&!storage.includes(0)|| + current.countCards('h')>player.countCards('h')&&!storage.includes(1)|| + current.countCards('e')>player.countCards('e')&&!storage.includes(2); + }); }, chooseButton:{ dialog:function(event,player){ @@ -10241,12 +10725,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ]; var choiceList=ui.create.dialog('尊位:请选择一项','forcebutton','hidden'); choiceList.add([list.map((item,i)=>{ + if(player.getStorage('zunwei').includes(i)) item=`${item}`; return [i,item]; }),'textbutton']) return choiceList; }, filter:function(button){ - return button._filterButton; + const player=get.player(); + if(player.getStorage('zunwei').includes(button.link)) return false; + if(button.link==0){ + if(!player.isDamaged()) return false; + return game.hasPlayer(current=>{ + return current.getHp()>player.getHp(); + }); + } + if(button.link==1){ + return game.hasPlayer(current=>{ + return current.countCards('h')>player.countCards('h'); + }); + } + if(button.link==2){ + return game.hasPlayer(current=>{ + return current.countCards('e')>player.countCards('e'); + }); + } }, backup:function(links){ var next=get.copy(lib.skill.zunwei.backups[links[0]]); @@ -10256,27 +10758,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return next; }, check:function(button){ - var player=_status.event.player; - switch(button.link){ - case 0:{ - var target=game.findPlayer(function(current){ - return current.isMaxHp(); - }); - return (Math.min(target.hp,player.maxHp)-player.hp)*2; - } - case 1:{ - var target=game.findPlayer(function(current){ - return current.isMaxHandcard(); - }); - return Math.min(5,target.countCards('h')-player.countCards('h'))*0.8; - } - case 2:{ - var target=game.findPlayer(function(current){ - return current.isMaxEquip(); - }); - return (target.countCards('e')-player.countCards('e'))*1.4; - } - } + var player=_status.event.player; + switch(button.link){ + case 0:{ + var target=game.findPlayer(function(current){ + return current.isMaxHp(); + }); + return (Math.min(target.hp,player.maxHp)-player.hp)*2; + } + case 1:{ + var target=game.findPlayer(function(current){ + return current.isMaxHandcard(); + }); + return Math.min(5,target.countCards('h')-player.countCards('h'))*0.8; + } + case 2:{ + var target=game.findPlayer(function(current){ + return current.isMaxEquip(); + }); + return (target.countCards('e')-player.countCards('e'))*1.4; + } + } }, prompt:function(links){ return [ @@ -11041,7 +11543,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mod:{ cardUsable:function(card,player,num){ - if(card.name=='sha') return num+player.countMark('spzhuilie2'); + if(card.name=='sha') return num+player.countMark('spzhuilie2'); }, }, }, @@ -11071,8 +11573,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, frequent:true, content:function(){ - player.draw(); - player.addMark('mansi',1,false); + player.draw(); + player.addMark('mansi',1,false); }, intro:{content:'已因此技能得到了#张牌'}, }, @@ -11766,6 +12268,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ check:function(event,player){ return get.attitude(player,event.target)<=0; }, + equipSkill:true, logTarget:'target', content:function(){ var num=player.getHistory('useSkill',function(evt){ @@ -11790,6 +12293,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ check:function(event,player){ return get.attitude(player,event.target)<=0; }, + equipSkill:true, logTarget:'target', content:function(){ 'step 0' @@ -11852,7 +12356,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //filter:function(event,player){ // return player.storage.gxlianhua&&player.storage.gxlianhua.red+player.storage.gxlianhua.black>0; //}, - forced:true, content:function(){ var cards=[]; var cards2=[]; @@ -12234,6 +12737,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sunlingluan:'孙翎鸾,孙坚与妾室丁氏的女儿,孙策的妹妹,孙权、孙尚香的姐姐。孙翎年幼时曾得杜夔点化,窥得音律玄妙,丝竹八音,擅长琵琶,每次弹奏琵琶时,经常引来百鸟,称为奇观。早年孙翎鸾出游,山林巧遇葛玄,葛玄观其面相为吉,特传授修行辟谷之法,可令其身心洗涤,容颜久存。孙翎鸾有恋人名张奋,两人情投意合,可惜造化弄人,张奋病死外域,孙翎鸾倚楼盼归,日复一日、年复一年。后有五彩孔雀自东南而来,绕楼而鸣,其声如慕,孙翎鸾泪染笑靥,与孔雀耳语几句后乘翎而去。', zhoubuyi:'周不疑(192年—208年),字元直(或作“文直”),零陵重安(今湖南衡阳县)人,刘表别驾刘先的外甥,少有异才,聪明敏达,在十七岁时就著有文论四首。曹冲死后,曹操怀疑曹丕无法驾驭周不疑,于是派人杀了周不疑。', tianshangyi:'田尚衣,一作陈尚衣,魏文帝曹丕宫中著名宫人。能歌善舞,一时冠绝于世,私以为比之汉宫飞燕也不遑多让。', + malingli:'马伶俐,游卡桌游原创角色,设定上为,马超之女,其身形虽娇小,却继承了马超英勇略带冲动的个性,活泼阳光,调皮伶俐,爱摆弄爆竹烟花一类的小器具,包包里经常放置用五色彩纸包装的小炸弹球。马伶俐从小跟随马超和马云騄学习战斗技巧,战斗力超强,坚强的意志和勇气也得到了提升,同时擅长马术,有一匹可爱的小白马伴随其身边。后马伶俐成年,嫁与刘备之子刘理,获封梁王妃。两人琴瑟相和,极为恩爱,常结伴出游,被人誉为天作之合。', + zhugeruoxue:'诸葛氏(“若雪”为网络小说虚构),诸葛亮的二姐,庞山民之妻。', }, characterTitle:{ // wulan:'#b对决限定武将', @@ -12308,7 +12813,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return '当你使用或打出'+(player.hasSkill('dczhangcai_all')?'':'点数为8的')+'牌时,你可以摸X张牌(X为你手牌区里'+(player.hasSkill('dczhangcai_all')?'与此牌点数相同':'点数为8')+'的牌数且至少为1)。'; }, }, - perfectPair:{}, characterReplace:{ wenyang:['wenyang','db_wenyang','diy_wenyang'], gexuan:['gexuan','tw_gexuan'], @@ -12648,7 +13152,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dczhaohan:'昭汉', dczhaohan_info:'摸牌阶段,你可以多摸两张牌,然后你于得到牌后选择一项:1.将两张手牌交给一名没有手牌的角色;2.弃置两张手牌。', dcjinjie:'尽节', - dcjinjie_info:'当一名角色进入濒死状态时,若你本轮:进行过回合,你可以令其摸一张牌;未进行过回合,你可以弃置X张手牌令其回复1点体力(X为本轮你发动过〖尽节〗的次数)。', + dcjinjie_info:'当一名角色进入濒死状态时,可以令其摸一张牌。然后若你本轮未进行过回合,你可以弃置X张手牌令其回复1点体力(X为本轮你发动过〖尽节〗的次数)。', dcjue:'举讹', dcjue_info:'准备阶段,你可以视为对一名未受伤的角色使用一张【杀】。', dc_tengfanglan:'滕芳兰', @@ -12660,7 +13164,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcyuandi:'元嫡', dcyuandi_info:'当其他角色于其出牌阶段使用第一张牌时,若此牌仅指定其为目标,你可以选择一项:1.弃置其一张手牌;2.你与其各摸一张牌。', dcxinyou:'心幽', - dcxinyou_info:'出牌阶段限一次。你可以将体力回复至上限并将手牌补至体力上限。若你以此法:获得了至少两张牌,你于结束阶段失去1点体力;回复了体力,你于结束阶段弃置两张牌。', + dcxinyou_info:'出牌阶段限一次。你可以将体力回复至上限并将手牌补至体力上限。若你以此法:获得了至少三张牌,你于结束阶段失去1点体力;回复了体力,你于结束阶段弃置一张牌。', zerong:'笮融', dccansi:'残肆', dccansi_info:'锁定技。准备阶段,你回复1点体力,然后选择一名其他角色,其回复1点体力,你视为对其依次使用以下能使用的牌:【杀】(无距离限制)、【决斗】、【火攻】。当其以此法受到1点伤害后,你摸两张牌。', @@ -12686,9 +13190,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcchenyong_info:'结束阶段,你可以摸X张牌(X为本回合你使用过的牌的类型数)。', sunyu:'孙瑜', dcquanshou:'劝守', - dcquanshou_info:'一名角色的回合开始时,若其手牌数小于其体力上限,你可以令其选择一项:1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1(至多摸五张);2.其本回合使用牌被抵消后,你摸一张牌。', + dcquanshou_info:'一名角色的回合开始时,若其手牌数不大于其体力上限,你可以令其选择一项:1.将手牌摸至体力上限,然后本回合使用【杀】的次数上限-1(至多摸五张);2.其本回合使用牌被抵消后,你摸一张牌。', dcshexue:'设学', - dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做于上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用。', + dcshexue_info:'①出牌阶段开始时,你可以将一张牌当做上回合的角色于其出牌阶段内使用的最后一张基本牌或普通锦囊牌使用。②出牌阶段结束时,你可以令下回合的角色于其出牌阶段开始时可以将一张牌当做你于此阶段内使用的最后一张基本牌或普通锦囊牌使用(一名角色因〖设学〗使用的牌均无距离和次数限制)。', xizheng:'郤正', dcdanyi:'耽意', dcdanyi_info:'当你使用牌指定第一个目标后,若此牌的目标与你使用的上一张牌目标相同,你可以摸X张牌(X为此牌目标数)。', @@ -12796,6 +13300,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dczhangcai_info:'当你使用或打出点数为8的牌时,你可以摸X张牌(X为你手牌区里点数为8的牌数且至少为1)。', dcruxian:'儒贤', dcruxian_info:'限定技。出牌阶段,你可以令你〖彰才〗的点数限制取消,且摸牌数改为等同于你手牌区内与此牌点数相同的牌数且至少为1,直到你的下回合开始。', + malingli:'马伶俐', + dclima:'骊马', + dclima_info:'锁定技。你计算至其他角色的距离-X(X为场上的坐骑牌数且至少为1)。', + dcxiaoyin:'硝引', + dcxiaoyin_info:'①准备阶段,你可以亮出牌堆顶的Y张牌(Y为你距离1以内的角色数),获得其中的红色牌,将其中任意张黑色牌置于等量名座次连续的其他角色的武将牌上,称为“硝引”。②当一名有“硝引”牌的角色受到伤害时,若此伤害为:火焰伤害,来源可以弃置一张其“硝引”牌包含的类型的牌,将其“硝引”置入弃牌堆,令此伤害+1;非火焰伤害,来源可以获得其“硝引”牌,将此伤害改为火焰伤害。', + dchuahuo:'花火', + dchuahuo_info:'出牌阶段限一次。你可以将一张红色手牌当不计入次数的火【杀】使用。然后当你使用此牌指定第一个目标后,若目标角色有“硝引”牌,你可以将此【杀】的目标改为所有有“硝引”牌的角色。', + caoyi:'曹轶', + dcmiyi:'蜜饴', + dcmiyi_info:'准备阶段,你可以选择一项:1.回复1点体力;2.受到你造成的1点伤害。然后你令任意名角色执行该项。若如此做,这些角色于结束阶段执行另一项。', + dcyinjun:'寅君', + dcyinjun_info:'当你使用对应实体牌均为你的手牌的【杀】或锦囊牌结算结束后,若此牌目标为1,你可以视为对该目标使用一张无伤害来源的【杀】。然后若你本回合发动〖寅君〗的次数大于你的体力值,〖寅君〗失效直到回合结束。', + zhugeruoxue:'诸葛若雪', + dcqiongying:'琼英', + dcqiongying_info:'出牌阶段限一次。你可以移动场上的一张牌,然后你弃置一张与此牌花色相同的手牌(若没有该花色的手牌则改为展示所有手牌)。', + dcnuanhui:'暖惠', + dcnuanhui_info:'结束阶段,你可以选择一名装备区有牌的角色,其可以视为依次使用X张基本牌(X为其装备区牌数)。若其以此法使用了至少两张牌,其弃置装备区里的所有牌。', sp2_yinyu:'隐山之玉', sp2_huben:'百战虎贲', diff --git a/character/xianjian.js b/character/xianjian.js index 29824d23c..b3d6a1a44 100644 --- a/character/xianjian.js +++ b/character/xianjian.js @@ -100,7 +100,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.draw(3); player.addSkill('shuiyun'); 'step 1' - game.createTrigger('phaseEnd','shuiyun',player,trigger); + if(lib.filter.filterTrigger(trigger,player,'phaseEnd','shuiyun')) game.createTrigger('phaseEnd','shuiyun',player,trigger); }, }, shenwu:{ diff --git a/character/xinghuoliaoyuan.js b/character/xinghuoliaoyuan.js index fb60a2d82..2f881f09f 100755 --- a/character/xinghuoliaoyuan.js +++ b/character/xinghuoliaoyuan.js @@ -811,7 +811,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, limited:true, enable:"phaseUse", - filter:function(event,player){; + filter:function(event,player){ return player.countCards('e')>0; }, filterTarget:lib.filter.notMe, diff --git a/character/yijiang.js b/character/yijiang.js index d135fe7f5..e890f60a6 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -30,7 +30,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhugeshang:['male','shu',3,['sangu','yizu']], kebineng:['male','qun',4,['kousheng']], lukai:['male','wu',4,['lkbushi','lkzhongzhuang']], - xin_fazheng:['male','shu',3,['xinenyuan','xinxuanhuo'],['die_audio']], + xin_fazheng:['male','shu',3,['xinxuanhuo','xinenyuan']], guanzhang:['male','shu',4,['fuhun']], wangyi:['female','wei',3,['zhenlie','miji']], caozhang:['male','wei',4,['new_jiangchi']], @@ -404,6 +404,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(result.bool){ var suits=result.links.map(i=>i[2].slice(6)); + player.logSkill('qingbei'); player.addTempSkill('qingbei_effect','roundStart'); player.setStorage('qingbei_effect',suits); player.markSkill('qingbei_effect'); @@ -415,13 +416,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ subSkill:{ effect:{ audio:'qingbei', - trigger:{ - player:'useCardAfter', - }, - forced:true, + trigger:{player:'useCardAfter'}, charlotte:true, onremove:true, + forced:true, filter:function(event,player){ + if(!lib.suit.includes(get.suit(event.card))) return false; return player.getStorage('qingbei_effect').length; }, content:function(){ @@ -429,7 +429,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mark:true, intro:{ - content:(storage)=>`本轮内不能使用${get.translation(storage)}花色的牌,且使用牌后摸${get.cnNumber(storage.length)}张牌`, + content:(storage)=>`本轮内不能使用${get.translation(storage)}花色的牌,且使用一张有花色的牌后摸${get.cnNumber(storage.length)}张牌`, }, mod:{ cardEnabled:function(card,player){ @@ -595,9 +595,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, enable:'phaseUse', usable:3, - filter:function(event,player){ - return !player.hasSkill('shuojian_ban'); - }, filterTarget:lib.filter.notMe, filterCard:true, position:'he', @@ -611,7 +608,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 0' player.give(cards,target); 'step 1' - var num=3-get.skillCount('shuojian'); + var num=3-get.skillCount('shuojian')+1; event.num=num; event.num2=num; if(event.num==0) event.finish(); @@ -624,19 +621,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(evt.name=='chooseTarget') evt=evt.getParent(); if(!evt.goon) return 0; return get.effect_use.apply(this,arguments); - }).set('goon',target.getUseValue({name:'guohe'})>player.getUseValue({name:'wuzhong'})/(1.8-num*0.3)); + }).set('goon',target.getUseValue({name:'guohe'})>get.sgnAttitude(target,player)*player.getUseValue({name:'wuzhong'})/(2-num*0.4)); 'step 3' if(!result.bool){ player.draw(num); + if(num>1) player.chooseToDiscard('he',num-1,true); event.finish(); } 'step 4' if(--event.num2>0){ event.goto(2); } - else player.addTempSkill('shuojian_ban'); + else player.tempBanSkill('shuojian'); }, - subSkill:{ban:{charlotte:true}}, ai:{ expose:0.15, order:8, @@ -1388,10 +1385,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, cardname:function(card){ - if(card.hasGaintag('kousheng')) return 'sha'; + if(get.itemtype(card)=='card'&&card.hasGaintag('kousheng')) return 'sha'; }, cardnature:function(card){ - if(card.hasGaintag('kousheng')) return false; + if(get.itemtype(card)=='card'&&card.hasGaintag('kousheng')) return false; }, }, group:'kousheng_damage', @@ -1514,7 +1511,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ unlimit:{ mod:{ cardUsable:function(card,player){ - var list=lib.skill.lkbushi.getBushi(player); + var list=lib.skill.lkbushi.getBushi(player); if(list[0]==get.suit(card)) return Infinity; }, }, @@ -2043,6 +2040,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addTempSkill('paoxiao'); } }, + derivation:['wusheng','paoxiao'], }, shiyong:{ audio:2, @@ -2210,7 +2208,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ next.set('filterButton',function(button){ if(button.link==0){ return _status.event.bool1; - }; + } return true; }); next.set('bool1',lib.skill.xinbenxi.filterx(trigger,player)); @@ -2674,29 +2672,35 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, xintaoluan:{ + hiddenCard:function(player,name){ + return !player.getStorage('xintaoluan').includes(name)&&player.countCards('hes')>0&&!player.hasSkill('xintaoluan3')&&lib.inpile.includes(name); + }, audio:'taoluan', enable:'chooseToUse', filter:function(event,player){ - return event.type!='wuxie'&&event.type!='respondShan'&&!player.hasSkill('xintaoluan3')&&player.countCards('hes')>0&&!_status.dying.length; - }, - init:function(player){ - if(!player.storage.xintaoluan) player.storage.xintaoluan=[]; + return !player.hasSkill('xintaoluan3')&&player.countCards('hes',card=>lib.inpile.some(name=>{ + if(player.getStorage('xintaoluan').includes(name)) return false; + if(get.type(name)!='basic'&&get.type(name)!='trick') return false; + if(event.filterCard({name:name,isCard:true,cards:[card]})) return true; + if(name=='sha'){ + for(var nature of lib.inpile_nature){ + if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]})) return true; + } + } + return false; + }))>0&&!_status.dying.length; }, chooseButton:{ dialog:function(event,player){ var list=[]; - for(var i=0;i0) return 0; - if(button.link[2]=='wugu') return; - var effect=player.getUseValue(button.link[2]); - if(effect>0) return effect; - return 0; + var card={name:button.link[2],nature:button.link[3]}; + if(player.countCards('hes',cardx=>cardx.name==card.name)) return 0; + return _status.event.getParent().type=='phase'?player.getUseValue(card):1; }, backup:function(links,player){ return { filterCard:true, audio:'taoluan', - selectCard:1, popname:true, check:function(card){ - return 6-get.value(card); + return 7-get.value(card); }, position:'hes', viewAs:{name:links[0][2],nature:links[0][3]}, @@ -2726,16 +2727,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var evt=_status.event.getParent('phase'); if(evt&&evt.name=='phase'&&!evt.xintaoluan){ evt.xintaoluan=true; - var next=game.createEvent('taoluan_clear'); + var next=game.createEvent('xintaoluan_clear'); _status.event.next.remove(next); evt.after.push(next); next.player=player; next.setContent(function(){ - player.storage.xintaoluan=[]; + delete player.storage.xintaoluan; delete player.storage.xintaoluan2; }); } - player.storage.xintaoluan.add(result.card.name); + player.markAuto('xintaoluan',[result.card.name]); }, } }, @@ -2745,12 +2746,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ order:4, + save:true, + respondSha:true, + respondShan:true, + skillTagFilter:function(player,tag,arg){ + if(!player.countCards('hes')||player.hasSkill('taoluan3')) return false; + if(tag=='respondSha'||tag=='respondShan'){ + if(arg=='respond') return false; + return !player.getStorage('taoluan').includes(tag=='respondSha'?'sha':'shan'); + } + return !player.getStorage('taoluan').includes('tao')||(!player.getStorage('taoluan').includes('jiu')&&arg==player); + }, result:{ player:function(player){ - if(!player.storage.xintaoluan2) player.storage.xintaoluan2=0; + var num=player.countMark('xintaoluan2'); var players=game.filterPlayer(); for(var i=0;i((player.storage.xintaoluan2+1)*2)&&get.attitude(player,players[i])>0){ + if(players[i]!=player&&players[i].countCards('he')>((num+1)*2)&&get.attitude(player,players[i])>0){ return 1; } } @@ -2759,7 +2771,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, threaten:1.9, }, - group:['xintaoluan2','xintaoluan4','xintaoluan5'] + group:'xintaoluan2', }, xintaoluan2:{ trigger:{player:['useCardAfter','respondAfter']}, @@ -2768,13 +2780,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, filter:function(event,player){ if(!game.hasPlayer(current=>current!=player)) return false; - return event.skill=='xintaoluan_backup'||event.skill=='xintaoluan5'||event.skill=='xintaoluan4'; + return event.skill=='xintaoluan_backup'; }, content:function(){ 'step 0' - if(!player.storage.xintaoluan2) player.storage.xintaoluan2=0; - if(player.storage.xintaoluan2<3) player.storage.xintaoluan2++; - event.num=player.storage.xintaoluan2; + player.addMark('xintaoluan2',1,false); + event.num=player.countMark('xintaoluan2'); player.chooseTarget(true,function(card,player,target){ return target!=player; },'滔乱

    令一名其他角色选择一项:1.交给你'+get.cnNumber(event.num)+'张与你以此法使用的牌类别相同的牌;2.你失去'+get.cnNumber(event.num)+'点体力').set('ai',function(target){ @@ -2812,108 +2823,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, xintaoluan3:{charlotte:true}, - xintaoluan4:{ - audio:'taoluan', - prompt:'将一张牌当做闪使用', - enable:'chooseToUse', - filter:function(event,player){ - return player.countCards('hes')&&!player.storage.xintaoluan.contains('shan')&&!player.hasSkill('xintaoluan3')&&!_status.dying.length; - }, - onuse:function(result,player){ - var evt=_status.event.getParent('phase'); - if(evt&&evt.name=='phase'&&!evt.xintaoluan){ - var next=game.createEvent('taoluan_clear'); - _status.event.next.remove(next); - evt.after.push(next); - evt.xintaoluan=true; - next.player=player; - next.setContent(function(){ - player.storage.xintaoluan=[]; - delete player.storage.xintaoluan2; - }); - } - player.storage.xintaoluan.add('shan'); - }, - filterCard:true, - position:'hes', - selectCard:1, - viewAs:{name:'shan'}, - check:function(card){ - var player=_status.event.player; - if(!player.storage.xintaoluan2) player.storage.xintaoluan2=0; - var allshown=true,players=game.filterPlayer(); - for(var i=0;i((player.storage.xintaoluan2+1)*2)&&get.attitude(player,players[i])>0){ - return 6-get.value(card); - } - } - return 0; - }, - ai:{ - skillTagFilter:function(player){ - return player.countCards('hes')&&!player.storage.xintaoluan.contains('shan')&&!player.hasSkill('xintaoluan3'); - }, - threaten:1.5, - respondShan:true, - } - }, - xintaoluan5:{ - audio:'taoluan', - enable:'chooseToUse', - prompt:'将一张牌当做无懈可击使用', - filter:function(event,player){ - return player.countCards('hes')&&(!player.storage.xintaoluan.contains('wuxie'))&&!player.hasSkill('xintaoluan3')&&!_status.dying.length; - }, - viewAsFilter:function(player){ - return player.countCards('hes')&&(!player.storage.xintaoluan.contains('wuxie'))&&!player.hasSkill('xintaoluan3')&&!_status.dying.length; - }, - onuse:function(result,player){ - var evt=_status.event.getParent('phase'); - if(evt&&evt.name=='phase'&&!evt.xintaoluan){ - evt.xintaoluan=true; - var next=game.createEvent('taoluan_clear'); - _status.event.next.remove(next); - evt.after.push(next); - next.player=player; - next.setContent(function(){ - player.storage.xintaoluan=[]; - delete player.storage.xintaoluan2; - }); - } - player.storage.xintaoluan.add('wuxie'); - }, - filterCard:true, - position:'hes', - selectCard:1, - viewAs:{name:'wuxie'}, - check:function(card){ - var player=_status.event.player; - if(player.isPhaseUsing()) return 0; - if(!player.storage.xintaoluan2) player.storage.xintaoluan2=0; - var allshown=true,players=game.filterPlayer(); - for(var i=0;i((player.storage.xintaoluan2+1)*2)&&get.attitude(player,players[i])>0){ - return 6-get.value(card); - } - } - return 0; - }, - }, - xintaoluan6:{ - trigger:{global:'phaseAfter'}, - silent:true, - charlotte:true, - content:function(){ - player.storage.xintaoluan=[]; - player.storage.xintaoluan2=0; - }, - }, xintaoluan_backup:{}, xincaishi:{ trigger:{ @@ -3151,7 +3060,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ for(var i=0;i
  • 已对'+str+'发动过〖残韵〗'); } @@ -3304,7 +3213,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function (){ 'step 0' - player.chooseTarget(get.prompt2('rezhenjun')).ai=function(target){ + player.chooseTarget(get.prompt2('rezhenjun'),(card,player,target)=>{ + return target.countCards('he'); + }).ai=function(target){ return -get.attitude(_status.event.player,target)*(target.countCards('e')+1); }; 'step 1' @@ -4167,7 +4078,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!player.storage.juexiang_lie){ event.finish(); return; - }; + } player.storage.juexiang_lie--; } player.chooseTarget(get.prompt2('juexiang_lie'),function(card,player,target){ @@ -5203,7 +5114,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, jyzongshi:{ audio:2, - audioname:['re_jianyong'], + audioname:['re_jianyong','ol_jianyong'], trigger:{player:['chooseToCompareAfter','compareMultipleAfter'],target:['chooseToCompareAfter','compareMultipleAfter']}, filter:function(event,player){ if(event.preserve) return false; @@ -5343,33 +5254,36 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, taoluan:{ + hiddenCard:function(player,name){ + return !player.getStorage('taoluan').includes(name)&&player.countCards('hes')>0&&!player.hasSkill('taoluan3')&&lib.inpile.includes(name); + }, audio:2, enable:'chooseToUse', filter:function(event,player){ - return event.type!='wuxie'&&event.type!='respondShan'&&!player.hasSkill('taoluan3')&&player.countCards('hes')>0;//&&!_status.dying.length; - }, - hiddenCard:function(player,name){ - return (!player.getStorage('taoluan').contains(name)&&player.countCards('hes')>0&&!player.hasSkill('taoluan3')&&lib.inpile.contains(name)); - }, - init:function(player){ - if(!player.storage.taoluan) player.storage.taoluan=[]; + return !player.hasSkill('taoluan3')&&player.countCards('hes',card=>lib.inpile.some(name=>{ + if(player.getStorage('taoluan').includes(name)) return false; + if(get.type(name)!='basic'&&get.type(name)!='trick') return false; + if(event.filterCard({name:name,isCard:true,cards:[card]})) return true; + if(name=='sha'){ + for(var nature of lib.inpile_nature){ + if(event.filterCard({name:name,nature:nature,isCard:true,cards:[card]})) return true; + } + } + return false; + }))>0; }, onremove:true, chooseButton:{ dialog:function(event,player){ var list=[]; - for(var i=0;i0) return 0; - if(button.link[2]=='wugu') return 0; - var effect=player.getUseValue(button.link[2]); - if(effect>0) return effect; - return 0; + var card={name:button.link[2],nature:button.link[3]}; + if(player.countCards('hes',cardx=>cardx.name==card.name)) return 0; + return _status.event.getParent().type=='phase'?player.getUseValue(card):1; }, backup:function(links,player){ return { - filterCard:true, audio:'taoluan', - selectCard:1, + filterCard:true, popname:true, check:function(card){ - return 6-get.value(card); + return 7-get.value(card); }, position:'hes', viewAs:{name:links[0][2],nature:links[0][3]}, onuse:function(result,player){ - player.storage.taoluan.add(result.card.name); + player.markAuto('taoluan',[result.card.name]); }, } }, @@ -5405,11 +5316,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, ai:{ - skillTagFilter:function(player){ + save:true, + respondSha:true, + respondShan:true, + skillTagFilter:function(player,tag,arg){ if(!player.countCards('hes')||player.hasSkill('taoluan3')) return false; - if(!player.storage.taoluan.contains('tao')){} - else if(player.isDying()&&!player.storage.taoluan.contains('jiu')){} - else return false; + if(tag=='respondSha'||tag=='respondShan'){ + if(arg=='respond') return false; + return !player.getStorage('taoluan').includes(tag=='respondSha'?'sha':'shan'); + } + return !player.getStorage('taoluan').includes('tao')||(!player.getStorage('taoluan').includes('jiu')&&arg==player); }, order:4, result:{ @@ -5429,17 +5345,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, threaten:1.9, }, - group:['taoluan2','taoluan4','taoluan5'] + group:'taoluan2', }, taoluan2:{ - trigger:{player:['useCardAfter','respondAfter']}, - forced:true, - popup:false, charlotte:true, + trigger:{player:'useCardAfter'}, filter:function(event,player){ if(!game.hasPlayer(current=>current!=player)) return false; - return event.skill=='taoluan_backup'||event.skill=='taoluan5'||event.skill=='taoluan4'; + return event.skill=='taoluan_backup'; }, + forced:true, + popup:false, content:function(){ 'step 0' player.chooseTarget(true,function(card,player,target){ @@ -5474,49 +5390,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ player.addTempSkill('taoluan3'); - var next=player.loseHp(); - event.next.remove(next); - event.getParent('phase').after.push(next); + player.loseHp(); } } }, taoluan3:{charlotte:true}, - taoluan4:{ - prompt:'将一张牌当做闪使用', - enable:'chooseToUse', - filter:function(event,player){ - return !player.getStorage('taoluan').contains('shan')&&!player.hasSkill('taoluan3')&&player.countCards('hes');//&&!_status.dying.length; - }, - onuse:function(result,player){ - player.storage.taoluan.add('shan'); - }, - filterCard:true, - position:'hes', - selectCard:1, - viewAs:{name:'shan'}, - ai:{ - skillTagFilter:function(player){ - return player.countCards('hes')&&!player.getStorage('taoluan').contains('shan')&&!player.hasSkill('taoluan3'); - }, - threaten:1.5, - respondShan:true, - } - }, - taoluan5:{ - audio:'taoluan', - enable:'chooseToUse', - prompt:'将一张牌当做无懈可击使用', - viewAsFilter:function(player){ - return !player.getStorage('taoluan').contains('wuxie')&&!player.hasSkill('taoluan3')&&player.countCards('hes'); - }, - onuse:function(result,player){ - player.storage.taoluan.add('wuxie'); - }, - filterCard:true, - position:'hes', - selectCard:1, - viewAs:{name:'wuxie'}, - }, taoluan_backup:{}, jishe:{ audio:2, @@ -6121,6 +5999,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.popup('更改描述'); player.addMark('xindanxin',1,false); } + }, + ai:{ + maixie:true, + effect:{ + target:(card,player,target)=>{ + if(!get.tag(card,'damage')) return; + if(target.hp<2||player.hasSkillTag('jueqing',false,target)) return -1.5; + return [1,1]; + } + } } }, zongzuo:{ @@ -6461,7 +6349,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return current!=player; }).sortBySeat(player); for(var target of players){ - if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue}; + if(get.damageEffect(target,player,target,'fire')>=0){num=0;continue} var shao=false; num++; if(target.countCards('he',function(card){ @@ -6710,15 +6598,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, jieyue:{ - group:'jieyue1' - }, - jieyue1:{ audio:2, trigger:{player:'phaseJieshuBegin'}, direct:true, - filter:function(event,player){ - return !player.getExpansions('jieyue2').length; - }, content:function(){ 'step 0' player.chooseCardTarget({ @@ -6736,7 +6618,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); 'step 1' if(result.bool){ - player.logSkill('jieyue1',result.targets); + player.logSkill('jieyue',result.targets); player.discard(result.cards); var target=result.targets[0]; event.target=target; @@ -6761,18 +6643,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 2' if(result.bool&&result.cards&&result.cards.length){ - player.addToExpansion(result.cards,'give',target).gaintag.add('jieyue2'); - player.addSkill('jieyue2'); + player.addToExpansion(result.cards,'give',target).gaintag.add('jieyue'); } else if(event.target.countCards('he')){ player.discardPlayerCard(event.target,true); } }, - ai:{ - expose:0.1 - }, - }, - jieyue2:{ + ai:{expose:0.1}, + marktext:'节', intro:{ content:'expansion', markcount:'expansion', @@ -6781,58 +6659,62 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var cards=player.getExpansions(skill); if(cards.length) player.loseToDiscardpile(cards); }, - marktext:'钺', - audio:true, - enable:'chooseToUse', - filterCard:function(card){ - return get.color(card)=='black'; - }, - viewAsFilter:function(player){ - return player.countCards('hs',{color:'black'})>0; - }, - position:'hs', - viewAs:{name:'wuxie'}, - prompt:'将一张黑色手牌当无懈可击使用', - check:function(card){return 8-get.value(card)}, - threaten:1.2, - charlotte:true, - group:['jieyue3','jieyue4'] - }, - jieyue3:{ - enable:['chooseToRespond','chooseToUse'], - filterCard:function(card){ - return get.color(card)=='red'; - }, - viewAs:{name:'shan'}, - position:'hs', - viewAsFilter:function(player){ - if(!player.countCards('hs',{color:'red'})) return false; - }, - audio:true, - prompt:'将一张红色手牌当闪使用或打出', - check:function(){return 1}, - ai:{ - respondShan:true, - skillTagFilter:function(player){ - if(!player.countCards('h',{color:'red'})) return false; + group:['jieyue_wuxie','jieyue_shan','jieyue_gain'], + subSkill:{ + wuxie:{ + audio:true, + enable:'chooseToUse', + filterCard:function(card){ + return get.color(card)=='black'; + }, + viewAsFilter:function(player){ + return player.getExpansions('jieyue').length&&player.countCards('hs',{color:'black'})>0; + }, + position:'hs', + viewAs:{name:'wuxie'}, + prompt:'将一张黑色手牌当无懈可击使用', + check:function(card){ + return 8-get.value(card); + }, }, - effect:{ - target:function(card,player,target,current){ - if(get.tag(card,'respondShan')&¤t<0) return 0.8 - } - } - } - }, - jieyue4:{ - trigger:{player:'phaseZhunbeiBegin'}, - forced:true, - content:function(){ - 'step 0' - var cards=player.getExpansions('jieyue2'); - if(cards.length) player.gain(cards,'gain2'); - 'step 1' - player.removeSkill('jieyue2'); - } + shan:{ + audio:true, + enable:['chooseToRespond','chooseToUse'], + filterCard:function(card){ + return get.color(card)=='red'; + }, + position:'hs', + viewAs:{name:'shan'}, + viewAsFilter:function(player){ + return player.getExpansions('jieyue').length&&player.countCards('hs',{color:'red'})>0; + }, + prompt:'将一张红色手牌当闪使用或打出', + check:()=>1, + ai:{ + respondShan:true, + skillTagFilter:function(player){ + if(!player.getExpansions('jieyue').length||!player.countCards('hs',{color:'red'})) return false; + }, + effect:{ + target:function(card,player,target,current){ + if(get.tag(card,'respondShan')&¤t<0) return 0.8 + }, + }, + }, + }, + gain:{ + audio:'jieyue', + trigger:{player:'phaseZhunbeiBegin'}, + filter:function(event,player){ + return player.getExpansions('jieyue').length; + }, + forced:true, + content:function(){ + var cards=player.getExpansions('jieyue'); + if(cards.length) player.gain(cards,'gain2'); + }, + }, + }, }, jinjiu:{ mod:{ @@ -7672,6 +7554,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ longyin:{ audio:2, shaRelated:true, + init:(player)=>{ + game.addGlobalSkill('longyin_order'); + }, + onremove:(player)=>{ + game.removeGlobalSkill('longyin_order'); + }, trigger:{global:'useCard'}, direct:true, filter:function(event,player){ @@ -7744,6 +7632,30 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, ai:{ expose:0.2 + }, + subSkill:{ + order:{ + mod:{ + aiOrder:(player,card,num)=>{ + if(num&&card.name==='sha'&&get.color(card)==='red'){ + let gp=game.findPlayer(current=>{ + return current.hasSkill('longyin')&¤t.hasCard(i=>true,'he'); + }); + if(gp) return num+0.15*Math.sign(get.attitude(player,gp)); + } + } + }, + trigger:{player:'dieAfter'}, + filter:(event,player)=>{ + return !game.hasPlayer(current=>current.hasSkill('longyin')); + }, + silent:true, + forceDie:true, + charlotte:true, + content:()=>{ + game.removeGlobalSkill('longyin_order'); + } + } } }, jigong:{ @@ -8754,10 +8666,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ switch(button.link[2]){ case 'tao':return 5; case 'jiu':return 3.01; - case 'shan':return 3.01; case 'sha': if(button.link[3]=='fire') return 2.95; - else if(button.link[3]=='fire') return 2.92; + else if(button.link[3]=='thunder') return 2.92; else return 2.9; case 'shan':return 1; } @@ -9149,7 +9060,6 @@ 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){ @@ -9267,7 +9177,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function(){ 'step 0' - player.chooseTarget(get.prompt2('huituo')).set('ai',function(target){ + var forced=event.forced===undefined?false:event.forced; + var info=get.skillInfoTranslation('huituo',player); + var str=`###${forced?'恢拓:请选择一名角色':get.prompt('huituo')}###令一名角色判定。若结果为红色,其回复1点体力;若结果为黑色,其摸${get.cnNumber(trigger.num)}张牌`; + player.chooseTarget(str,event.forced).set('ai',function(target){ var player=_status.event.player; if(get.attitude(player,target)>0){ return get.recoverEffect(target,player,player)+1; @@ -10045,7 +9958,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return false; }, filter:function(event,player){ - return player!=event.player; + return player!=event.player; }, logTarget:'player', content:function(){ @@ -10359,6 +10272,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audioname2:{ re_jianyong:'reqiaoshui', xin_jianyong:'xinqiaoshui', + ol_jianyong:'olqiaoshui', }, trigger:{player:'useCard2'}, filter:function(event,player){ @@ -10485,9 +10399,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } if(red>2&&black>2) return 4-get.value(card); if(red==0||black==0) return 8-get.value(card); - var color=get.color(red); + var color=get.color(card); if(black<=red) return ((color=='black'&&get.position(card)=='h')?8:4)-get.value(card); - return ((color=='red'&&get.position(card)=='h'?8:4))-get.value(card); + return (color=='red'&&get.position(card)=='h'?8:4)-get.value(card); }, content:function(){ player.draw(); @@ -10968,8 +10882,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.addToExpansion(result.cards,player,'giveAuto').gaintag.add('quanji'); } "step 4" - if(event.count>0&&player.hasSkill('quanji')){ - player.chooseBool(get.prompt2('quanji')).set('frequentSkill','quanji'); + if(event.count>0&&player.hasSkill(event.name)&&!get.is.blocked(event.name,player)){ + player.chooseBool(get.prompt2('quanji')).set('frequentSkill',event.name); } else event.finish(); "step 5" @@ -11060,11 +10974,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ order:10, result:{ target:function(player,target){ - if(player!=target) return 0; - if(player.hasSkill('requanji')||(player.countCards('h')+2<=player.hp+player.getExpansions('quanji').length)) return 1; - return 0; - } - }, + if(player!=target) return 0; + if(player.hasSkill('requanji')||(player.countCards('h')+2<=player.hp+player.getExpansions('quanji').length)) return 1; + return 0; + } + }, }, } }, @@ -12004,12 +11918,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ expose:0.3 } }, + //吾彦... wuyan:{audio:2}, xswuyan:{ audio:'wuyan', trigger:{target:'useCardToBefore',player:'useCardToBefore'}, forced:true, - priority:15, check:function(event,player){ return get.effect(event.target,event.card,event.player,player)<0; }, @@ -12028,15 +11942,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, player:function(card,player,target,current){ if(get.type(card)=='trick'&&player!=target) return 'zeroplayertarget'; - } - } - } + }, + }, + }, }, xinwuyan:{ audio:2, trigger:{source:'damageBegin2',player:'damageBegin4'}, forced:true, - //priority:15, check:function(event,player){ if(player==event.player) return true; return false; @@ -12854,6 +12767,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, xinenyuan:{ + audio:2, + group:['xinenyuan1','xinenyuan2'], + }, + xinenyuan1:{ + audio:true, + trigger:{player:'gainEnd'}, + filter:function(event,player){ + return event.source&&event.source.isIn()&&event.source!=player&&event.cards.length>=2; + }, + logTarget:'source', + check:function(event,player){ + return get.attitude(player,event.source)>0; + }, + prompt2:function(event,player){ + return '令'+get.translation(event.source)+'摸一张牌'; + }, + content:function(){ + trigger.source.draw(); + }, + }, + xinenyuan2:{ audio:true, trigger:{player:'damageEnd'}, check:function(event,player){ @@ -12868,17 +12802,20 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return event.source&&event.source!=player&&event.num>0&&event.source.isIn(); }, logTarget:'source', + prompt2:function(event,player){ + return '令'+get.translation(event.source)+'交给你一张手牌或失去1点体力'; + }, content:function(){ - "step 0" + 'step 0' event.num=trigger.num; - "step 1" + 'step 1' trigger.source.chooseCard('选择一张手牌交给'+get.translation(player)+',或点“取消”失去1点体力').set('ai',function(card){ var player=_status.event.getParent().player,source=_status.event.player; if(get.effect(source,{name:'losehp'},source,source)>=0) return 0; if(get.attitude(player,source)>0) return 11-get.value(card); return 7-get.value(card); }); - "step 2" + 'step 2' if(result.bool){ trigger.source.give(result.cards,player); } @@ -12898,67 +12835,23 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.hasSkillTag('jueqing',false,target)) return [1,-1.5]; if(!target.hasFriend()) return; if(get.tag(card,'damage')) return [1,0,0,-0.7]; - } - } + }, + }, }, - group:'xinenyuan2' - }, - xinenyuan2:{ - audio:true, - trigger:{player:'gainEnd'}, - filter:function(event,player){ - return event.source&&event.source.isIn()&&event.source!=player&&event.cards.length>=2; - }, - logTarget:'source', - check:function(event,player){ - return get.attitude(player,event.source)>0; - }, - content:function(){ - trigger.source.draw(); - } }, enyuan:{ - audio:'enyuan1', + audio:2, locked:true, group:['enyuan1','enyuan2'], - ai:{ - maixie_defend:true, - effect:{ - target:function(card,player,target){ - if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; - if(!target.hasFriend()) return; - if(get.tag(card,'damage')) return [1,0,0,-1]; - } - } - } }, enyuan1:{ - trigger:{player:'recoverEnd'}, - forced:true, - audio:2, - logTarget:'source', - filter:function(event,player){ - return event.source&&event.source!=player; - }, - content:function(){ - 'step 0' - event.num=trigger.num; - 'step 1' - if(event.num>0){ - player.logSkill('enyuan1',trigger.source); - trigger.source.draw(); - event.num--; - event.redo(); - } - } - }, - enyuan2:{ + audio:true, trigger:{player:'damageEnd'}, forced:true, - audio:2, filter:function(event,player){ - return event.source&&event.source!=player; + return event.source&&event.source!=player&&event.source.isIn(); }, + logTarget:'source', content:function(){ 'step 0' trigger.source.chooseCard('选择一张红桃牌交给'+get.translation(player)+',或点“取消”失去1点体力',function(card){ @@ -12976,7 +12869,37 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else{ trigger.source.loseHp(); } - } + }, + ai:{ + maixie_defend:true, + effect:{ + target:function(card,player,target){ + if(player.hasSkillTag('jueqing',false,target)) return [1,-2]; + if(!target.hasFriend()) return; + if(get.tag(card,'damage')) return [1,0,0,-1]; + }, + }, + }, + }, + enyuan2:{ + audio:true, + trigger:{player:'recoverEnd'}, + forced:true, + logTarget:'source', + filter:function(event,player){ + return event.source&&event.source!=player&&event.source.isIn(); + }, + content:function(){ + 'step 0' + event.num=trigger.num; + 'step 1' + if(event.num>0){ + player.logSkill('enyuan1',trigger.source); + trigger.source.draw(); + event.num--; + event.redo(); + } + }, }, xuanhuo:{ audio:2, @@ -13233,7 +13156,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); next.set('maxNum',event.name=='oldchengxiang'?12:13); next.set('ai',function(button){ - return get.value(button.link,_status.event.player); + let player=_status.event.player,name=get.name(button.link),val=get.value(button.link,player); + if(name==='tao') return val + 2*Math.min(3,1+player.getDamagedHp()); + if(name==='jiu'&&player.hp<3) return val + 2*(2.8-player.hp); + if(name==='wuxie'&&player.countCards('j')&&!player.hasWuxie()) return val + 5; + if(player.hp>1&&player.hasSkill('renxin')&&player.hasFriend()&&get.type(button.link)==='equip') return val + 4; + return val; }); "step 2" if(result.bool&&result.links){ @@ -13525,7 +13453,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, audioname:['xin_jushou'], check:function(event,player){ - return player.getHistory('damage').indexOf(event)==0; + return player.getHistory('damage').indexOf(event)==0; }, content:function(){ if(player.getHistory('damage').indexOf(trigger)>0){ @@ -13780,7 +13708,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{player:'phaseZhunbeiBegin'}, forced:true, unique:true, - derivation:['zyexin','zzili'], + derivation:['zyexin','zzili','zpaiyi'], filter:function(event,player){ return player.countCards('e')>=2; }, @@ -13983,7 +13911,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ masu:['xin_masu','re_masu','masu'], xusheng:['xusheng','xin_xusheng','re_xusheng','old_xusheng'], wuguotai:['wuguotai','xin_wuguotai','re_wuguotai'], - lingtong:['lingtong','xin_lingtong','re_lingtong','old_lingtong'], + lingtong:['lingtong','xin_lingtong','ol_lingtong','re_lingtong','old_lingtong'], gaoshun:['gaoshun','xin_gaoshun','re_gaoshun','old_gaoshun'], zhonghui:['zhonghui','xin_zhonghui','re_zhonghui','old_zhonghui','pe_zhonghui'], wangyi:['wangyi','re_wangyi','old_wangyi'], @@ -13998,7 +13926,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ manchong:['manchong','re_manchong'], caochong:['caochong','re_caochong','old_caochong'], guohuai:['guohuai','re_guohuai','xin_guohuai','tw_guohuai','ol_guohuai'], - jianyong:['jianyong','re_jianyong','xin_jianyong'], + jianyong:['jianyong','ol_jianyong','re_jianyong','xin_jianyong'], panzhangmazhong:['panzhangmazhong','re_panzhangmazhong','xin_panzhangmazhong'], yufan:['yufan','xin_yufan','re_yufan'], zhuran:['zhuran','re_zhuran','xin_zhuran','old_zhuran'], @@ -14218,13 +14146,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ lianhuo:'链祸', lianhuo_info:'锁定技,当你受到火焰伤害时,若你的武将牌处于横置状态且此伤害不为连环伤害,则此伤害+1。', taoluan:'滔乱', - taoluan4:'滔乱', - taoluan5:'滔乱', taoluan_backup:'滔乱', - taoluan_info:'你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你于回合结束时失去1点体力且〖滔乱〗无效直到回合结束。', + taoluan_info:'你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本局游戏你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你一张与你以此法使用的牌类别不同的牌;2.你失去1点体力且〖滔乱〗无效直到回合结束。', xintaoluan:'滔乱', - xintaoluan4:'滔乱', - xintaoluan5:'滔乱', xintaoluan_backup:'滔乱', xintaoluan_info:'若场上没有濒死的角色,则你可以将一张牌当做任意一张基本牌或普通锦囊牌使用(此牌不得是本回合内你以此法使用过的牌),然后你令一名其他角色选择一项:1.交给你X张与你以此法使用的牌类别不同的牌;2.你失去X点体力且滔乱无效直到回合结束(X为你本回合内发动过〖滔乱〗的次数且至多为3)。', jiaozhao:'矫诏', @@ -14266,11 +14190,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ reqingxi:'倾袭', reqingxi_info:'当你使用【杀】或【决斗】指定目标后,你可以令其选择一项:1、弃置X张手牌(X为你攻击范围内的角色数,且当你装备区内有武器牌/没有武器牌时至多为4/2),若如此做,其弃置你的此武器牌;2、令此牌的伤害值+1且你进行判定,若结果为红色,则其不能响应此牌。', jieyue:'节钺', - jieyue1:'节钺', - jieyue2:'节钺', - jieyue3:'节钺', - jieyue4:'节钺', - jieyue_info:'结束阶段开始时,你可以弃置一张手牌,然后令一名其他角色选择一项:将一张牌置于你的武将牌上(称之为“节”);或令你弃置其一张牌。当你你武将牌上有“节”时,你可以将红色手牌当作【闪】、黑色的手牌当作【无懈可击】使用或打出。准备阶段开始时,你获得你武将牌上的“节”。', + jieyue_info:'①结束阶段,你可以弃置一张手牌,然后令一名其他角色选择一项:1.将一张牌置于你的武将牌上,称之为“节”;2.令你弃置其一张牌。②若你有“节”,你可以将红色/黑色手牌当作【闪】/【无懈可击】使用或打出。③准备阶段,若你有“节”,则你获得之。', xianzhen:'陷阵', xianzhen_info:'出牌阶段限一次,你可以与一名角色拼点。若你赢,你获得以下效果直到回合结束:无视与该角色的距离;无视该角色的防具且对其使用【杀】没有次数限制。若你没赢,你不能使用【杀】直到回合结束。', xinxianzhen:'陷阵', @@ -14363,7 +14283,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ huituo_info:'当你受到伤害后,你可以令一名角色进行一次判定,若结果为红色,该角色回复1点体力;若结果为黑色,该角色摸X张牌(X为此次伤害的伤害点数)。', mingjian:'明鉴', mingjian2:'明鉴', - mingjian_info:'出牌阶段限一次,你可以将所有手牌交给一名其他角色,若如此做,该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。', + mingjian_info:'出牌阶段限一次。你可以将所有手牌交给一名其他角色,然后该角色于其下个回合的手牌上限+1,且使用【杀】的次数上限+1。', xingshuai:'兴衰', xingshuai_info:'主公技,限定技,当你进入濒死状态时,其他魏势力角色可依次令你回复1点体力,然后这些角色依次受到1点伤害。', reduodao:'夺刀', @@ -14402,6 +14322,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jianying:'渐营', jianying_info:'当你于出牌阶段内使用与此阶段你使用的上一张牌点数或花色相同的牌时,你可以摸一张牌。', xinenyuan:'恩怨', + xinenyuan1:'恩怨', xinenyuan2:'恩怨', xinenyuan_info:'当你获得一名其他角色两张或更多的牌后,你可以令其摸一张牌;当你受到1点伤害后,你可以令伤害来源选择一项:1、将一张手牌交给你;2、失去1点体力。', xinxuanhuo:'眩惑', @@ -14655,7 +14576,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ biejun_info:'①其他角色的出牌阶段限一次。其可以将一张手牌交给你。②每回合限一次。当你受到伤害时,若你手牌中没有本回合因〖别君①〗得到的牌,你可以翻面并防止此伤害。', yj_sufei:'苏飞', shuojian:'数谏', - shuojian_info:'出牌阶段限三次。你可以交给一名其他角色一张牌,其选择一项:1.令你摸X张牌;2.视为使用X张【过河拆桥】,然后此技能本回合失效(X为此技能本阶段剩余发动次数)。', + shuojian_info:'出牌阶段限三次。你可以交给一名其他角色一张牌,其选择一项:1.令你摸X张牌并弃置X-1张牌;2.视为使用X张【过河拆桥】,然后此技能本回合失效(X为此技能本阶段剩余发动次数+1)。', yj_qiaozhou:'谯周', shiming:'识命', shiming_info:'每轮限一次。一名角色的摸牌阶段,你可以观看牌堆顶的两张牌,并可以将其中一张置于牌堆底。然后该角色可以改为对自己造成1点伤害,然后从牌堆底摸三张牌。', @@ -14684,7 +14605,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ cuguo_info:'锁定技。当你于一回合使用牌首次被抵消后,你弃置一张牌,视为对此牌的目标角色使用一张该被抵消的牌。此牌结算结束后,若此牌被抵消,你失去1点体力。', chenshi:'陈式', qingbei:'擎北', - qingbei_info:'一轮游戏开始时,你可以选择任意种花色,你不能于本轮内使用这些花色的牌。然后当你于本轮使用牌结算结束后,你摸等同于你上一次〖擎北〗选择过的花色数的牌。', + qingbei_info:'一轮游戏开始时,你可以选择任意种花色,你不能于本轮内使用这些花色的牌。然后当你于本轮使用一张有花色的牌结算结束后,你摸等同于你上一次〖擎北〗选择过的花色数的牌。', feiyao:'费曜', zhenfeng:'镇锋', zhenfeng_info:'每回合限一次。当其他角色于其回合内使用牌时,若其手牌数不大于其体力值,你可以猜测其手牌中与此牌类别相同的牌数。若你猜对,你摸X张牌并视为对其使用一张【杀】(X为你连续猜对的次数且至多为5);若你猜错且差值大于1,其视为对你使用一张【杀】。', diff --git a/character/yingbian.js b/character/yingbian.js index 30de75455..0d9bfa30c 100644 --- a/character/yingbian.js +++ b/character/yingbian.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'yingbian', connect:true, character:{ + chengjichengcui:['male','jin',6,['oltousui','olchuming']], wangxiang:['male','jin',3,['bingxin']], jin_jiachong:['male','jin',3,['xiongshu','jianhui']], xuangongzhu:['female','jin',3,['gaoling','qimei','ybzhuiji'],['hiddenSkill']], @@ -30,13 +31,160 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterSort:{ yingbian:{ yingbian_pack1:['jin_simayi','jin_zhangchunhua','ol_lisu','simazhou','cheliji','ol_huaxin'], - yingbian_pack2:['jin_simashi','jin_xiahouhui','zhanghuyuechen','shibao','jin_yanghuiyu'], + yingbian_pack2:['jin_simashi','jin_xiahouhui','zhanghuyuechen','shibao','jin_yanghuiyu','chengjichengcui'], yingbian_pack3:['jin_simazhao','jin_wangyuanji','duyu','weiguan','xuangongzhu'], yingbian_pack4:['zhongyan','xinchang','jin_jiachong','wangxiang'], yingbian_pack5:['yangyan','yangzhi'], }, }, skill:{ + //二成 + oltousui:{ + audio:2, + enable:'chooseToUse', + viewAsFilter:function(player){ + return player.countCards('he'); + }, + viewAs:{ + name:'sha', + suit:'none', + number:null, + isCard:true, + }, + filterCard:true, + selectCard:[1,Infinity], + position:'he', + check:function(card){ + const player=get.player(); + return 4.5+(player.hasSkill('olchuming')?1:0)-1.5*ui.selected.cards.length-get.value(card); + }, + popname:true, + ignoreMod:true, + precontent:function*(event,map){ + var player=map.player; + var evt=event.getParent(); + if(evt.dialog&&typeof evt.dialog=='object') evt.dialog.close(); + player.logSkill('oltousui'); + delete event.result.skill; + var cards=event.result.cards; + player.loseToDiscardpile(cards,ui.cardPile,false,'blank').log=false; + var shownCards=cards.filter(i=>get.position(i)=='e'),handcardsLength=cards.length-shownCards.length; + if(shownCards.length){ + player.$throw(shownCards,null); + game.log(player,'将',shownCards,'置于了牌堆底'); + } + if(handcardsLength>0){ + player.$throw(handcardsLength,null); + game.log(player,'将',get.cnNumber(handcardsLength),'张牌置于了牌堆底'); + } + game.delayex(); + var viewAs=new lib.element.VCard({name:event.result.card.name,isCard:true}); + event.result.card=viewAs; + event.result.cards=[]; + event.result._apply_args={ + shanReq:cards.length, + oncard:()=>{ + var evt=get.event(); + for(var target of game.filterPlayer(null,null,true)){ + var id=target.playerid; + var map=evt.customArgs; + if(!map[id]) map[id]={}; + map[id].shanRequired=evt.shanReq; + } + } + }; + }, + ai:{ + order:function(item,player){ + return get.order({name:'sha'})+0.1; + }, + result:{player:1}, + keepdu:true, + respondSha:true, + skillTagFilter:(player,tag,arg)=>{ + if(tag=='respondSha'&&arg!='use') return false; + }, + }, + }, + olchuming:{ + audio:2, + trigger:{ + source:'damageBegin1', + player:'damageBegin3', + }, + filter:function(event,player){ + return event.source!=event.player; + }, + forced:true, + content:function*(event,map){ + var player=map.player,trigger=map.trigger; + if(!trigger.card||!trigger.cards.length){ + trigger.num++; + event.finish(); + return; + } + else{ + var target=trigger[trigger.source==player?'player':'source']; + trigger._olchuming=true; + target.addTempSkill('olchuming_effect'); + } + }, + ai:{ + effect:{ + player:function(card,player,target){ + if(!get.tag(card,'damage')) return; + if(!lib.card[card.name]||!card.cards||!card.cards.length) return [1,0,1,-1]; + return [1,-1]; + }, + }, + }, + subSkill:{ + effect:{ + charlotte:true, + trigger:{global:'phaseEnd'}, + forced:true, + popup:false, + content:function*(event,map){ + var player=map.player; + var mapx={}; + var history=player.getHistory('damage').concat(player.getHistory('sourceDamage')); + history.forEach(evt=>{ + if(!evt._olchuming) return; + var target=evt[evt.source==player?'player':'source']; + if(!target.isIn()) return; + var cards=evt.cards.filterInD('d'); + if(!cards.length) return; + if(!mapx[target.playerid]) mapx[target.playerid]=[]; + mapx[target.playerid].addArray(cards); + }); + var entries=Object.entries(mapx).map(entry=>{ + return [(_status.connectMode?lib.playerOL:game.playerMap)[entry[0]],entry[1]]; + }); + if(!entries.length){ + event.finish(); + return; + } + player.logSkill('olchuming_effect',entries.map(i=>i[0])); + entries.sort((a,b)=>lib.sort.seat(a[0],b[0])); + for(var entry of entries){ + var current=entry[0],cards=entry[1]; + var list=['jiedao','guohe'].filter(i=>player.canUse(new lib.element.VCard({name:i,cards:cards}),current,false)); + if(!list.length) return; + var result=({}); + if(list.length==1) result={bool:true,links:[['','',list[0]]]}; + else result=yield player.chooseButton([`畜鸣:请选择要对${get.translation(current)}使用的牌`,[list,'vcard']],true).set('ai',button=>{ + var player=get.player(); + return get.effect(get.event('currentTarget'),{name:button.link[2]},player,player); + }).set('currentTarget',current); + if(result.bool){ + var card=get.autoViewAs({name:result.links[0][2]},cards); + if(player.canUse(card,current,false)) player.useCard(card,cards,current,false); + } + } + } + } + } + }, bingxin:{ audio:2, enable:'chooseToUse', @@ -295,7 +443,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, }, - logTarget:'target', marktext:'嫕', intro:{ markcount:'expansion', @@ -531,7 +678,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(trigger.name=='lose'){ for(var i in trigger.gaintag_map){ if(trigger.gaintag_map[i].contains('huaiyuanx')) num++; - }; + } } else player.getHistory('lose',function(evt){ if(trigger!=evt.getParent()) return false; @@ -588,7 +735,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ forced:true, locked:false, filter:function(event,player){ - return (event.name!='phase'||game.phaseNumber==0)&&player.countCards('h')>0; + return (event.name!='phase'||game.phaseNumber==0)&&player.countCards('h')>0; }, content:function(){ var hs=player.getCards('h'); @@ -2671,7 +2818,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var type=get.type(card); return (type=='basic'||type=='trick'); }, - log:false, visible:true, filterTarget:function(card,player,target){ return target!=player&&target.hasZhuSkill('ruilve',player)&&!target.hasSkill('ruilve3'); @@ -3588,9 +3734,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xuangongzhu:'高陵宣公主(?—?)司马氏,晋宣帝司马懿第二女。司马氏下嫁杜预。其侄司马炎登基时,司马氏已经去世。泰始年间(265年—274年)追赠高陵公主。', jin_guohuai:'郭槐(237年-296年),字媛韶,太原阳曲(今山西太原)人,魏晋权臣贾充的妻子。父亲是曹魏城阳郡太守郭配,伯父是曹魏名将郭淮。出身太原郭氏。二十一岁时,嫁贾充作继室,生二女二子,长女贾南风,次女贾午,一子贾黎民。贾南风是西晋惠帝司马衷皇后,干预国政,专权误国,直接导致“八王之乱”和西晋亡国。', wangxiang:'王祥(184年,一作180年-268年4月30日),字休徵。琅邪临沂(今山东省临沂市西孝友村)人。三国曹魏及西晋时大臣。王祥于东汉末隐居二十年,在曹魏,先后任县令、大司农、司空、太尉等职,封爵睢陵侯。西晋建立,拜太保,进封睢陵公。泰始四年四月戊戌日(268年4月30日)去世,年八十五(一作八十九),谥号“元”。有《训子孙遗令》一文传世。王祥侍奉后母朱氏极孝,为传统文化中二十四孝之一“卧冰求鲤”的主人翁。', + chengjichengcui:'成倅、成济(?~260年6月21日),扬州丹阳(今安徽省宣城市)人。三国时期曹魏将领。依附于司马氏家族,得到司马昭的心腹贾充指使,刺死魏帝曹髦。司马昭为平息众怒,将成倅、成济兄弟二人杀死。据《魏氏春秋》记载,成济兄弟不服罪,光着身子跑到屋顶,大骂司马昭,被军士从下乱箭射杀。', }, characterTitle:{}, - perfectPair:{}, characterFilter:{}, dynamicTranslate:{}, perfectPair:{ @@ -3805,6 +3951,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qiaoyan_info:'锁定技,当你于回合外受到其他角色造成的伤害时,若你:有“珠”,则你令伤害来源获得“珠”;没有“珠”,则你防止此伤害,然后摸一张牌,并将一张牌正面朝上置于武将牌上,称为“珠”。', xianzhu:'献珠', xianzhu_info:'锁定技,出牌阶段开始时,你令一名角色A获得“珠”。若A不为你自己,则你选择A攻击范围内的一名角色B,视为A对B使用一张【杀】。', + chengjichengcui:'成济成倅', + oltousui:'透髓', + oltousui_info:'你可以将任意张牌置于牌堆底,视为使用一张需使用等量张【闪】抵消的【杀】。', + olchuming:'畜鸣', + olchuming_info:'锁定技。当你对其他角色造成伤害时,或当你受到其他角色造成的伤害时,若此伤害的渠道不为牌或没有对应的实体牌,此伤害+1,否则其于本回合结束时将所有以此法造成伤害的牌当【借刀杀人】或【过河拆桥】对你使用。', yingbian_pack1:'文德武备·理', yingbian_pack2:'文德武备·备', diff --git a/character/yxs.js b/character/yxs.js index eb2c86eed..cc159e5b5 100644 --- a/character/yxs.js +++ b/character/yxs.js @@ -136,7 +136,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); }, content:function(){ - for(var i=0;i1; }, content:function(){ - "step 0" - player.chooseTarget('选择【门神】的目标',lib.translate.yxs_menshen_info,true,function(card,player,target){ + "step 0" + player.chooseTarget('选择【门神】的目标',lib.translate.yxs_menshen_info,true,function(card,player,target){ return target!=player; }).set('ai',function(target){ return get.attitude(player,target); @@ -177,7 +177,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ expose:0.5, }, }, - yxs_menshen2:{ + yxs_menshen2:{ audio:2, mark:'character', intro:{ @@ -188,7 +188,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ trigger:{ target:["shaBegin","juedouBegin"], }, - forced:true, + forced:true, popup:false, filter:function(event,player){ return player.isAlive(); @@ -197,10 +197,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var target=player.storage.yxs_menshen2; trigger.player.line(target,'green'); trigger.targets.remove(player); - trigger.targets.push(target); + trigger.targets.push(target); trigger.target = target; }, - }, + }, guimian:{ trigger:{source:'damageEnd'}, forced:true, diff --git a/game/asset.js b/game/asset.js index 4918f2049..f62319521 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.10.4', + 'v1.10.5', /*audio start*/ 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', @@ -187,6 +187,7 @@ window.noname_asset_list=[ 'audio/die/bianxi.mp3', 'audio/die/boss_lvbu1.mp3', 'audio/die/boss_lvbu2.mp3', + 'audio/die/boss_lvbu3.mp3', 'audio/die/boss_wuguanwang.mp3', 'audio/die/boss_zhaoyun.mp3', 'audio/die/bulianshi.mp3', @@ -227,6 +228,7 @@ window.noname_asset_list=[ 'audio/die/chendeng.mp3', 'audio/die/chendong.mp3', 'audio/die/chengbing.mp3', + 'audio/die/chengjichengcui.mp3', 'audio/die/chengong.mp3', 'audio/die/chengpu.mp3', 'audio/die/chengui.mp3', @@ -234,6 +236,7 @@ window.noname_asset_list=[ 'audio/die/chenjiao.mp3', 'audio/die/chenlin.mp3', 'audio/die/chenqun.mp3', + 'audio/die/chenshi.mp3', 'audio/die/chentai.mp3', 'audio/die/chenwudongxi.mp3', 'audio/die/chunyuqiong.mp3', @@ -250,8 +253,10 @@ window.noname_asset_list=[ 'audio/die/clan_xuncan.mp3', 'audio/die/clan_xunchen.mp3', 'audio/die/clan_xunshu.mp3', + 'audio/die/clan_xunyou.mp3', 'audio/die/clan_zhonghui.mp3', 'audio/die/clan_zhongyan.mp3', + 'audio/die/clan_zhongyu.mp3', 'audio/die/cuimao.mp3', 'audio/die/cuiyan.mp3', 'audio/die/daqiao.mp3', @@ -262,6 +267,7 @@ window.noname_asset_list=[ 'audio/die/dc_caozhi.mp3', 'audio/die/dc_chenqun.mp3', 'audio/die/dc_dengzhi.mp3', + 'audio/die/dc_dongzhao.mp3', 'audio/die/dc_duyu.mp3', 'audio/die/dc_gaolan.mp3', 'audio/die/dc_gongsunzan.mp3', @@ -272,6 +278,7 @@ window.noname_asset_list=[ 'audio/die/dc_huban.mp3', 'audio/die/dc_hujinding.mp3', 'audio/die/dc_huojun.mp3', + 'audio/die/dc_jiachong.mp3', 'audio/die/dc_jiben.mp3', 'audio/die/dc_jiling.mp3', 'audio/die/dc_liru.mp3', @@ -290,6 +297,7 @@ window.noname_asset_list=[ 'audio/die/dc_wangchang.mp3', 'audio/die/dc_wangjun.mp3', 'audio/die/dc_wangyun.mp3', + 'audio/die/dc_wuban.mp3', 'audio/die/dc_xujing.mp3', 'audio/die/dc_xushu.mp3', 'audio/die/dc_yangbiao.mp3', @@ -456,6 +464,7 @@ window.noname_asset_list=[ 'audio/die/jin_zhangchunhua.mp3', 'audio/die/jin_zhouchu.mp3', 'audio/die/jinxuandi.mp3', + 'audio/die/jsp_caoren.mp3', 'audio/die/jsp_guanyu.mp3', 'audio/die/jsp_huangyueying.mp3', 'audio/die/kanze.mp3', @@ -472,6 +481,7 @@ window.noname_asset_list=[ 'audio/die/key_yuri.mp3', 'audio/die/kongrong.mp3', 'audio/die/kuailiangkuaiyue.mp3', + 'audio/die/kuaiqi.mp3', 'audio/die/laimin.mp3', 'audio/die/laiyinger.mp3', 'audio/die/leibo.mp3', @@ -541,6 +551,7 @@ window.noname_asset_list=[ 'audio/die/madai.mp3', 'audio/die/majun.mp3', 'audio/die/maliang.mp3', + 'audio/die/malingli.mp3', 'audio/die/mamidi.mp3', 'audio/die/manchong.mp3', 'audio/die/mangyachang.mp3', @@ -549,6 +560,7 @@ window.noname_asset_list=[ 'audio/die/mayuanyi.mp3', 'audio/die/mayunlu.mp3', 'audio/die/mazhong.mp3', + 'audio/die/mb_xianglang.mp3', 'audio/die/mengda.mp3', 'audio/die/menghuo.mp3', 'audio/die/mengjie.mp3', @@ -563,6 +575,7 @@ window.noname_asset_list=[ 'audio/die/neo_xuchu.mp3', 'audio/die/neo_zhouyu.mp3', 'audio/die/new_caoren.mp3', + 'audio/die/nezha.mp3', 'audio/die/niufu.mp3', 'audio/die/niujin.mp3', 'audio/die/ns_zanghong.mp3', @@ -588,6 +601,7 @@ window.noname_asset_list=[ 'audio/die/ol_pangde.mp3', 'audio/die/ol_pangtong.mp3', 'audio/die/ol_puyuan.mp3', + 'audio/die/ol_qianzhao.mp3', 'audio/die/ol_sp_zhugeliang.mp3', 'audio/die/ol_sunjian.mp3', 'audio/die/ol_wangrong.mp3', @@ -786,6 +800,7 @@ window.noname_asset_list=[ 'audio/die/sb_fazheng.mp3', 'audio/die/sb_ganning.mp3', 'audio/die/sb_huanggai.mp3', + 'audio/die/sb_huangyueying.mp3', 'audio/die/sb_huangzhong.mp3', 'audio/die/sb_huaxiong.mp3', 'audio/die/sb_jiangwei.mp3', @@ -795,6 +810,7 @@ window.noname_asset_list=[ 'audio/die/sb_machao.mp3', 'audio/die/sb_menghuo.mp3', 'audio/die/sb_pangtong.mp3', + 'audio/die/sb_sp_zhugeliang.mp3', 'audio/die/sb_sunce.mp3', 'audio/die/sb_sunquan.mp3', 'audio/die/sb_sunshangxiang.mp3', @@ -810,6 +826,7 @@ window.noname_asset_list=[ 'audio/die/sb_zhaoyun.mp3', 'audio/die/sb_zhenji.mp3', 'audio/die/sb_zhouyu.mp3', + 'audio/die/sb_zhugeliang.mp3', 'audio/die/sb_zhurong.mp3', 'audio/die/shamoke.mp3', 'audio/die/shen_caocao.mp3', @@ -820,6 +837,7 @@ window.noname_asset_list=[ 'audio/die/shen_ganning.mp3', 'audio/die/shen_guanyu.mp3', 'audio/die/shen_guojia.mp3', + 'audio/die/shen_huatuo.mp3', 'audio/die/shen_jiangwei.mp3', 'audio/die/shen_liubei.mp3', 'audio/die/shen_luxun.mp3', @@ -876,6 +894,7 @@ window.noname_asset_list=[ 'audio/die/sp_key_kanade.mp3', 'audio/die/sp_kongrong.mp3', 'audio/die/sp_lvfan.mp3', + 'audio/die/sp_machao.mp3', 'audio/die/sp_maojie.mp3', 'audio/die/sp_menghuo.mp3', 'audio/die/sp_mifangfushiren.mp3', @@ -910,12 +929,15 @@ window.noname_asset_list=[ 'audio/die/sp_zongyu.mp3', 'audio/die/st_xushu.mp3', 'audio/die/st_yuanshu.mp3', + 'audio/die/star_caoren.mp3', + 'audio/die/star_yuanshu.mp3', 'audio/die/sufei.mp3', 'audio/die/sunce.mp3', 'audio/die/sundeng.mp3', 'audio/die/sunhanhua.mp3', 'audio/die/sunhao.mp3', 'audio/die/sunhong.mp3', + 'audio/die/sunhuan.mp3', 'audio/die/sunjian.mp3', 'audio/die/sunlang.mp3', 'audio/die/sunliang.mp3', @@ -930,6 +952,7 @@ window.noname_asset_list=[ 'audio/die/sunwukong.mp3', 'audio/die/sunxiu.mp3', 'audio/die/sunyi.mp3', + 'audio/die/sunyu.mp3', 'audio/die/sunziliufang.mp3', 'audio/die/tadun.mp3', 'audio/die/taishici.mp3', @@ -1063,6 +1086,7 @@ window.noname_asset_list=[ 'audio/die/xin_caozhang.mp3', 'audio/die/xin_caozhen.mp3', 'audio/die/xin_chengpu.mp3', + 'audio/die/xin_fazheng.mp3', 'audio/die/xin_fuhuanghou.mp3', 'audio/die/xin_gaoshun.mp3', 'audio/die/xin_gongsunzan.mp3', @@ -1084,6 +1108,7 @@ window.noname_asset_list=[ 'audio/die/xin_wuguotai.mp3', 'audio/die/xin_wuyi.mp3', 'audio/die/xin_xusheng.mp3', + 'audio/die/xin_xushu.mp3', 'audio/die/xin_yuanshao.mp3', 'audio/die/xin_yufan.mp3', 'audio/die/xin_yuji.mp3', @@ -1139,6 +1164,7 @@ window.noname_asset_list=[ 'audio/die/yj_huangzhong.mp3', 'audio/die/yj_jushou.mp3', 'audio/die/yj_qiaozhou.mp3', + 'audio/die/yj_sufei.mp3', 'audio/die/yj_weiyan.mp3', 'audio/die/yj_xuhuang.mp3', 'audio/die/yj_zhanghe.mp3', @@ -1235,6 +1261,7 @@ window.noname_asset_list=[ 'audio/die/zhugejin.mp3', 'audio/die/zhugeke.mp3', 'audio/die/zhugeliang.mp3', + 'audio/die/zhugeruoxue.mp3', 'audio/die/zhugeshang.mp3', 'audio/die/zhugezhan.mp3', 'audio/die/zhuhuan.mp3', @@ -1309,8 +1336,6 @@ window.noname_asset_list=[ 'audio/skill/beige_re_caiwenji2.mp3', 'audio/skill/beige1.mp3', 'audio/skill/beige2.mp3', - 'audio/skill/beige3.mp3', - 'audio/skill/beige4.mp3', 'audio/skill/beini1.mp3', 'audio/skill/beini2.mp3', 'audio/skill/beishui1.mp3', @@ -1328,8 +1353,6 @@ window.noname_asset_list=[ 'audio/skill/benghuai_zhugedan2.mp3', 'audio/skill/benghuai1.mp3', 'audio/skill/benghuai2.mp3', - 'audio/skill/benghuai3.mp3', - 'audio/skill/benghuai4.mp3', 'audio/skill/benxi1.mp3', 'audio/skill/benxi2.mp3', 'audio/skill/benyu1.mp3', @@ -1478,6 +1501,8 @@ window.noname_asset_list=[ 'audio/skill/chanhui2.mp3', 'audio/skill/channi1.mp3', 'audio/skill/channi2.mp3', + 'audio/skill/chanyuan1.mp3', + 'audio/skill/chanyuan2.mp3', 'audio/skill/chaofeng1.mp3', 'audio/skill/chaofeng2.mp3', 'audio/skill/chenggong1.mp3', @@ -1510,10 +1535,8 @@ window.noname_asset_list=[ 'audio/skill/chongxin2.mp3', 'audio/skill/chongxu1.mp3', 'audio/skill/chongxu2.mp3', - 'audio/skill/chongzhen11.mp3', - 'audio/skill/chongzhen12.mp3', - 'audio/skill/chongzhen21.mp3', - 'audio/skill/chongzhen22.mp3', + 'audio/skill/chongzhen1.mp3', + 'audio/skill/chongzhen2.mp3', 'audio/skill/chouce1.mp3', 'audio/skill/chouce2.mp3', 'audio/skill/choufa1.mp3', @@ -1545,7 +1568,6 @@ window.noname_asset_list=[ 'audio/skill/chunlao_xin_chengpu2.mp3', 'audio/skill/chunlao1.mp3', 'audio/skill/chunlao2.mp3', - 'audio/skill/chunlao3.mp3', 'audio/skill/chuyuan1.mp3', 'audio/skill/chuyuan2.mp3', 'audio/skill/cibei1.mp3', @@ -1557,12 +1579,16 @@ window.noname_asset_list=[ 'audio/skill/cixiao1.mp3', 'audio/skill/cixiao2.mp3', 'audio/skill/cixiong_skill.mp3', + 'audio/skill/clanbaichu1.mp3', + 'audio/skill/clanbaichu2.mp3', 'audio/skill/clanbalong1.mp3', 'audio/skill/clanbalong2.mp3', 'audio/skill/clanbaozu_clan_zhonghui1.mp3', 'audio/skill/clanbaozu_clan_zhonghui2.mp3', 'audio/skill/clanbaozu_clan_zhongyan1.mp3', 'audio/skill/clanbaozu_clan_zhongyan2.mp3', + 'audio/skill/clanbaozu_clan_zhongyu1.mp3', + 'audio/skill/clanbaozu_clan_zhongyu2.mp3', 'audio/skill/clanbeishi1.mp3', 'audio/skill/clanbeishi2.mp3', 'audio/skill/clanbolong1.mp3', @@ -1577,6 +1603,8 @@ window.noname_asset_list=[ 'audio/skill/clandaojie_clan_xunchen2.mp3', 'audio/skill/clandaojie_clan_xunshu1.mp3', 'audio/skill/clandaojie_clan_xunshu2.mp3', + 'audio/skill/clandaojie_clan_xunyou1.mp3', + 'audio/skill/clandaojie_clan_xunyou2.mp3', 'audio/skill/clandianzhan1.mp3', 'audio/skill/clandianzhan2.mp3', 'audio/skill/clanfangzhen1.mp3', @@ -1589,12 +1617,16 @@ window.noname_asset_list=[ 'audio/skill/clanguangu2.mp3', 'audio/skill/clanguixiang1.mp3', 'audio/skill/clanguixiang2.mp3', + 'audio/skill/clanhuanghan1.mp3', + 'audio/skill/clanhuanghan2.mp3', 'audio/skill/clanhuanjia1.mp3', 'audio/skill/clanhuanjia2.mp3', 'audio/skill/clanhuanyin1.mp3', 'audio/skill/clanhuanyin2.mp3', 'audio/skill/clanjianyuan1.mp3', 'audio/skill/clanjianyuan2.mp3', + 'audio/skill/clanjiejian1.mp3', + 'audio/skill/clanjiejian2.mp3', 'audio/skill/clanjiexuan1.mp3', 'audio/skill/clanjiexuan2.mp3', 'audio/skill/clanlianhe1.mp3', @@ -1714,6 +1746,8 @@ window.noname_asset_list=[ 'audio/skill/dcanzhi2.mp3', 'audio/skill/dcbeifen1.mp3', 'audio/skill/dcbeifen2.mp3', + 'audio/skill/dcbeini1.mp3', + 'audio/skill/dcbeini2.mp3', 'audio/skill/dcbenshi1.mp3', 'audio/skill/dcbenshi2.mp3', 'audio/skill/dcbianzhuang1.mp3', @@ -1766,6 +1800,8 @@ window.noname_asset_list=[ 'audio/skill/dcdeshao2.mp3', 'audio/skill/dcdeshi1.mp3', 'audio/skill/dcdeshi2.mp3', + 'audio/skill/dcdingji1.mp3', + 'audio/skill/dcdingji2.mp3', 'audio/skill/dcditing1.mp3', 'audio/skill/dcditing2.mp3', 'audio/skill/dcdouzhen1.mp3', @@ -1778,6 +1814,8 @@ window.noname_asset_list=[ 'audio/skill/dcfangdu2.mp3', 'audio/skill/dcfanyin1.mp3', 'audio/skill/dcfanyin2.mp3', + 'audio/skill/dcfaqi1.mp3', + 'audio/skill/dcfaqi2.mp3', 'audio/skill/dcfencheng1.mp3', 'audio/skill/dcfencheng2.mp3', 'audio/skill/dcfengyan1.mp3', @@ -1810,6 +1848,8 @@ window.noname_asset_list=[ 'audio/skill/dchuace2.mp3', 'audio/skill/dchuagui1.mp3', 'audio/skill/dchuagui2.mp3', + 'audio/skill/dchuahuo1.mp3', + 'audio/skill/dchuahuo2.mp3', 'audio/skill/dchuayi1.mp3', 'audio/skill/dchuayi2.mp3', 'audio/skill/dchuiling1.mp3', @@ -1870,6 +1910,8 @@ window.noname_asset_list=[ 'audio/skill/dckanji2.mp3', 'audio/skill/dclbjiuxian1.mp3', 'audio/skill/dclbjiuxian2.mp3', + 'audio/skill/dcliangxiu1.mp3', + 'audio/skill/dcliangxiu2.mp3', 'audio/skill/dclianzhi1.mp3', 'audio/skill/dclianzhi2.mp3', 'audio/skill/dclibang1.mp3', @@ -1886,8 +1928,6 @@ window.noname_asset_list=[ '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', 'audio/skill/dcliuzhuan2.mp3', 'audio/skill/dcliying1.mp3', @@ -1916,6 +1956,10 @@ window.noname_asset_list=[ 'audio/skill/dcmoyu2.mp3', 'audio/skill/dcneifa1.mp3', 'audio/skill/dcneifa2.mp3', + 'audio/skill/dcniji1.mp3', + 'audio/skill/dcniji2.mp3', + 'audio/skill/dcnuanhui1.mp3', + 'audio/skill/dcnuanhui2.mp3', 'audio/skill/dcnuchen1.mp3', 'audio/skill/dcnuchen2.mp3', 'audio/skill/dcnutao1.mp3', @@ -1956,8 +2000,12 @@ window.noname_asset_list=[ 'audio/skill/dcqinqing2.mp3', 'audio/skill/dcqinshen1.mp3', 'audio/skill/dcqinshen2.mp3', + 'audio/skill/dcqiongying1.mp3', + 'audio/skill/dcqiongying2.mp3', 'audio/skill/dcquanjian1.mp3', 'audio/skill/dcquanjian2.mp3', + 'audio/skill/dcquanshou1.mp3', + 'audio/skill/dcquanshou2.mp3', 'audio/skill/dcrihui1.mp3', 'audio/skill/dcrihui2.mp3', 'audio/skill/dcruizhan1.mp3', @@ -1966,10 +2014,14 @@ window.noname_asset_list=[ 'audio/skill/dcruxian2.mp3', 'audio/skill/dcruyi1.mp3', 'audio/skill/dcruyi2.mp3', + 'audio/skill/dcsantou1.mp3', + 'audio/skill/dcsantou2.mp3', 'audio/skill/dcsaowei1.mp3', 'audio/skill/dcsaowei2.mp3', 'audio/skill/dcshangyu1.mp3', 'audio/skill/dcshangyu2.mp3', + 'audio/skill/dcshexue1.mp3', + 'audio/skill/dcshexue2.mp3', 'audio/skill/dcshibei1.mp3', 'audio/skill/dcshibei2.mp3', 'audio/skill/dcshiji1.mp3', @@ -1980,6 +2032,8 @@ window.noname_asset_list=[ 'audio/skill/dcshixian2.mp3', 'audio/skill/dcshizhao1.mp3', 'audio/skill/dcshizhao2.mp3', + 'audio/skill/dcshizong1.mp3', + 'audio/skill/dcshizong2.mp3', 'audio/skill/dcshoutan1.mp3', 'audio/skill/dcshoutan2.mp3', 'audio/skill/dcshuaijie1.mp3', @@ -2052,6 +2106,8 @@ window.noname_asset_list=[ 'audio/skill/dcxiaojuan2.mp3', 'audio/skill/dcxiaoxi1.mp3', 'audio/skill/dcxiaoxi2.mp3', + 'audio/skill/dcxiaoyin1.mp3', + 'audio/skill/dcxiaoyin2.mp3', 'audio/skill/dcxieshou1.mp3', 'audio/skill/dcxieshou2.mp3', 'audio/skill/dcxinyou1.mp3', @@ -2066,10 +2122,14 @@ window.noname_asset_list=[ 'audio/skill/dcxunbie2.mp3', 'audio/skill/dcxunji1.mp3', 'audio/skill/dcxunji2.mp3', + 'audio/skill/dcxunjie1.mp3', + 'audio/skill/dcxunjie2.mp3', 'audio/skill/dcyaoyi1.mp3', 'audio/skill/dcyaoyi2.mp3', 'audio/skill/dcyicong1.mp3', 'audio/skill/dcyicong2.mp3', + 'audio/skill/dcyijia1.mp3', + 'audio/skill/dcyijia2.mp3', 'audio/skill/dcyingtu1.mp3', 'audio/skill/dcyingtu2.mp3', 'audio/skill/dcyingyu1.mp3', @@ -2086,6 +2146,8 @@ window.noname_asset_list=[ 'audio/skill/dcyongbi2.mp3', 'audio/skill/dcyouqi1.mp3', 'audio/skill/dcyouqi2.mp3', + 'audio/skill/dcyouzhan1.mp3', + 'audio/skill/dcyouzhan2.mp3', 'audio/skill/dcyuandi1.mp3', 'audio/skill/dcyuandi2.mp3', 'audio/skill/dcyuanmo1.mp3', @@ -2220,15 +2282,12 @@ window.noname_asset_list=[ 'audio/skill/duanbing_heqi2.mp3', 'audio/skill/duanbing1.mp3', 'audio/skill/duanbing2.mp3', - 'audio/skill/duanbing3.mp3', 'audio/skill/duanchang_ol_caiwenji1.mp3', 'audio/skill/duanchang_ol_caiwenji2.mp3', 'audio/skill/duanchang_re_caiwenji1.mp3', 'audio/skill/duanchang_re_caiwenji2.mp3', 'audio/skill/duanchang1.mp3', 'audio/skill/duanchang2.mp3', - 'audio/skill/duanchang3.mp3', - 'audio/skill/duanchang4.mp3', 'audio/skill/duanliang1_re_xuhuang1.mp3', 'audio/skill/duanliang1_re_xuhuang2.mp3', 'audio/skill/duanliang11.mp3', @@ -2269,11 +2328,8 @@ window.noname_asset_list=[ 'audio/skill/dzkanpo2.mp3', 'audio/skill/ejian1.mp3', 'audio/skill/ejian2.mp3', - 'audio/skill/enyuan11.mp3', - 'audio/skill/enyuan12.mp3', + 'audio/skill/enyuan1.mp3', 'audio/skill/enyuan2.mp3', - 'audio/skill/enyuan21.mp3', - 'audio/skill/enyuan22.mp3', 'audio/skill/equan1.mp3', 'audio/skill/equan2.mp3', 'audio/skill/faen1.mp3', @@ -2387,8 +2443,6 @@ window.noname_asset_list=[ 'audio/skill/gaoyuan2.mp3', 'audio/skill/gebo1.mp3', 'audio/skill/gebo2.mp3', - 'audio/skill/gnjinfan_gain1.mp3', - 'audio/skill/gnjinfan_gain2.mp3', 'audio/skill/gnjinfan1.mp3', 'audio/skill/gnjinfan2.mp3', 'audio/skill/gnsheque1.mp3', @@ -2751,10 +2805,10 @@ window.noname_asset_list=[ 'audio/skill/jieyin2.mp3', 'audio/skill/jieyuan_less.mp3', 'audio/skill/jieyuan_more.mp3', - 'audio/skill/jieyue11.mp3', - 'audio/skill/jieyue12.mp3', + 'audio/skill/jieyue_shan.mp3', + 'audio/skill/jieyue_wuxie.mp3', + 'audio/skill/jieyue1.mp3', 'audio/skill/jieyue2.mp3', - 'audio/skill/jieyue3.mp3', 'audio/skill/jiezhong1.mp3', 'audio/skill/jiezhong2.mp3', 'audio/skill/jiezi1.mp3', @@ -2936,8 +2990,6 @@ window.noname_asset_list=[ 'audio/skill/keji_re_lvmeng2.mp3', 'audio/skill/keji1.mp3', 'audio/skill/keji2.mp3', - 'audio/skill/keji3.mp3', - 'audio/skill/keji4.mp3', 'audio/skill/keshou1.mp3', 'audio/skill/keshou2.mp3', 'audio/skill/kongcheng_re_zhugeliang1.mp3', @@ -2976,8 +3028,6 @@ window.noname_asset_list=[ 'audio/skill/kunfen2.mp3', 'audio/skill/kurou1.mp3', 'audio/skill/kurou2.mp3', - 'audio/skill/kurou3.mp3', - 'audio/skill/kurou4.mp3', 'audio/skill/kuwu.mp3', 'audio/skill/laishou1.mp3', 'audio/skill/laishou2.mp3', @@ -3001,10 +3051,8 @@ window.noname_asset_list=[ 'audio/skill/liangyuan2.mp3', 'audio/skill/liangzhu1.mp3', 'audio/skill/liangzhu2.mp3', - 'audio/skill/lianhuan11.mp3', - 'audio/skill/lianhuan12.mp3', - 'audio/skill/lianhuan21.mp3', - 'audio/skill/lianhuan22.mp3', + 'audio/skill/lianhuan1.mp3', + 'audio/skill/lianhuan2.mp3', 'audio/skill/lianhuo1.mp3', 'audio/skill/lianhuo2.mp3', 'audio/skill/lianji.mp3', @@ -3083,6 +3131,8 @@ window.noname_asset_list=[ 'audio/skill/lixia2.mp3', 'audio/skill/liyu1.mp3', 'audio/skill/liyu2.mp3', + 'audio/skill/lizhan1.mp3', + 'audio/skill/lizhan2.mp3', 'audio/skill/lkbushi1.mp3', 'audio/skill/lkbushi2.mp3', 'audio/skill/lkzhongzhuang1.mp3', @@ -3093,8 +3143,6 @@ window.noname_asset_list=[ 'audio/skill/longdan_sha_re_zhaoyun2.mp3', 'audio/skill/longdan_sha1.mp3', 'audio/skill/longdan_sha2.mp3', - 'audio/skill/longdan_shan1.mp3', - 'audio/skill/longdan_shan2.mp3', 'audio/skill/longdan_tongyuan.mp3', 'audio/skill/longhun1.mp3', 'audio/skill/longhun2.mp3', @@ -3102,7 +3150,6 @@ window.noname_asset_list=[ 'audio/skill/longhun4.mp3', 'audio/skill/longyin1.mp3', 'audio/skill/longyin2.mp3', - 'audio/skill/longyin3.mp3', 'audio/skill/longyuan1.mp3', 'audio/skill/longyuan2.mp3', 'audio/skill/lskuizhu1.mp3', @@ -3129,10 +3176,6 @@ window.noname_asset_list=[ 'audio/skill/luochong2.mp3', 'audio/skill/luoshen1.mp3', 'audio/skill/luoshen2.mp3', - 'audio/skill/luoyan1.mp3', - 'audio/skill/luoyan2.mp3', - 'audio/skill/luoyan3.mp3', - 'audio/skill/luoyan4.mp3', 'audio/skill/luoyi1.mp3', 'audio/skill/luoyi2.mp3', 'audio/skill/luoying_discard1.mp3', @@ -3261,6 +3304,8 @@ window.noname_asset_list=[ 'audio/skill/naman2.mp3', 'audio/skill/naxiang1.mp3', 'audio/skill/naxiang2.mp3', + 'audio/skill/naxue1.mp3', + 'audio/skill/naxue2.mp3', 'audio/skill/neifa1.mp3', 'audio/skill/neifa2.mp3', 'audio/skill/new_jiangchi1.mp3', @@ -3301,18 +3346,12 @@ window.noname_asset_list=[ 'audio/skill/nzry_huaiju2.mp3', 'audio/skill/nzry_jianxiang1.mp3', 'audio/skill/nzry_jianxiang2.mp3', - 'audio/skill/nzry_jieying_11.mp3', - 'audio/skill/nzry_jieying_12.mp3', - 'audio/skill/nzry_jieying_21.mp3', - 'audio/skill/nzry_jieying_22.mp3', 'audio/skill/nzry_jieying1.mp3', 'audio/skill/nzry_jieying2.mp3', 'audio/skill/nzry_junlve1.mp3', 'audio/skill/nzry_junlve2.mp3', 'audio/skill/nzry_juzhan_11.mp3', 'audio/skill/nzry_juzhan_12.mp3', - 'audio/skill/nzry_juzhan_21.mp3', - 'audio/skill/nzry_juzhan_22.mp3', 'audio/skill/nzry_kuizhu1.mp3', 'audio/skill/nzry_kuizhu2.mp3', 'audio/skill/nzry_lijun11.mp3', @@ -3323,14 +3362,8 @@ window.noname_asset_list=[ 'audio/skill/nzry_mingren_1_sb_yl_luzhi2.mp3', 'audio/skill/nzry_mingren_11.mp3', 'audio/skill/nzry_mingren_12.mp3', - 'audio/skill/nzry_mingren_21.mp3', - 'audio/skill/nzry_mingren_22.mp3', 'audio/skill/nzry_shenshi_11.mp3', 'audio/skill/nzry_shenshi_12.mp3', - 'audio/skill/nzry_shenshi_21.mp3', - 'audio/skill/nzry_shenshi_22.mp3', - 'audio/skill/nzry_shenshi11.mp3', - 'audio/skill/nzry_shenshi12.mp3', 'audio/skill/nzry_shicai_21.mp3', 'audio/skill/nzry_shicai_22.mp3', 'audio/skill/nzry_yili1.mp3', @@ -3339,8 +3372,6 @@ window.noname_asset_list=[ 'audio/skill/nzry_zhenglun2.mp3', 'audio/skill/nzry_zhenliang_11.mp3', 'audio/skill/nzry_zhenliang_12.mp3', - 'audio/skill/nzry_zhenliang_21.mp3', - 'audio/skill/nzry_zhenliang_22.mp3', 'audio/skill/nzry_zhizheng1.mp3', 'audio/skill/nzry_zhizheng2.mp3', 'audio/skill/ocongjian_tongyuan.mp3', @@ -3364,6 +3395,8 @@ window.noname_asset_list=[ 'audio/skill/olchenshuo2.mp3', 'audio/skill/olchuanwu1.mp3', 'audio/skill/olchuanwu2.mp3', + 'audio/skill/olchuming1.mp3', + 'audio/skill/olchuming2.mp3', 'audio/skill/olcuipo1.mp3', 'audio/skill/olcuipo2.mp3', 'audio/skill/old_fuhun1.mp3', @@ -3444,6 +3477,8 @@ window.noname_asset_list=[ 'audio/skill/olkangrui2.mp3', 'audio/skill/olkenshang1.mp3', 'audio/skill/olkenshang2.mp3', + 'audio/skill/olkuansai1.mp3', + 'audio/skill/olkuansai2.mp3', 'audio/skill/ollangdao1.mp3', 'audio/skill/ollangdao2.mp3', 'audio/skill/olleijie1.mp3', @@ -3488,8 +3523,12 @@ window.noname_asset_list=[ 'audio/skill/oltianhou2.mp3', 'audio/skill/oltongduo1.mp3', 'audio/skill/oltongduo2.mp3', + 'audio/skill/oltousui1.mp3', + 'audio/skill/oltousui2.mp3', 'audio/skill/oltuntian1.mp3', 'audio/skill/oltuntian2.mp3', + 'audio/skill/olweifu1.mp3', + 'audio/skill/olweifu2.mp3', 'audio/skill/olxianbi1.mp3', 'audio/skill/olxianbi2.mp3', 'audio/skill/olxianlve1.mp3', @@ -3606,15 +3645,7 @@ window.noname_asset_list=[ 'audio/skill/qianya1.mp3', 'audio/skill/qianya2.mp3', 'audio/skill/qiaobian1.mp3', - 'audio/skill/qiaobian11.mp3', - 'audio/skill/qiaobian12.mp3', 'audio/skill/qiaobian2.mp3', - 'audio/skill/qiaobian21.mp3', - 'audio/skill/qiaobian22.mp3', - 'audio/skill/qiaobian31.mp3', - 'audio/skill/qiaobian32.mp3', - 'audio/skill/qiaobian41.mp3', - 'audio/skill/qiaobian42.mp3', 'audio/skill/qiaoli1.mp3', 'audio/skill/qiaoli2.mp3', 'audio/skill/qiaomeng1.mp3', @@ -3628,6 +3659,8 @@ window.noname_asset_list=[ 'audio/skill/qibaodao2.mp3', 'audio/skill/qibie1.mp3', 'audio/skill/qibie2.mp3', + 'audio/skill/qice_clan_xunyou1.mp3', + 'audio/skill/qice_clan_xunyou2.mp3', 'audio/skill/qice1.mp3', 'audio/skill/qice2.mp3', 'audio/skill/qieting1.mp3', @@ -3645,6 +3678,8 @@ window.noname_asset_list=[ 'audio/skill/qimou2.mp3', 'audio/skill/qinbao1.mp3', 'audio/skill/qinbao2.mp3', + 'audio/skill/qingbei1.mp3', + 'audio/skill/qingbei2.mp3', 'audio/skill/qingcheng1.mp3', 'audio/skill/qingcheng2.mp3', 'audio/skill/qinggang_skill.mp3', @@ -3713,11 +3748,8 @@ window.noname_asset_list=[ 'audio/skill/qixi_re_heqi2.mp3', 'audio/skill/qixi1.mp3', 'audio/skill/qixi2.mp3', - 'audio/skill/qixi3.mp3', - 'audio/skill/qixi4.mp3', 'audio/skill/qixing1.mp3', 'audio/skill/qixing2.mp3', - 'audio/skill/qixing3.mp3', 'audio/skill/qizhi1.mp3', 'audio/skill/qizhi2.mp3', 'audio/skill/qljsuiren1.mp3', @@ -3768,6 +3800,8 @@ window.noname_asset_list=[ 'audio/skill/recangchu2.mp3', 'audio/skill/rechanhui1.mp3', 'audio/skill/rechanhui2.mp3', + 'audio/skill/rechanyuan1.mp3', + 'audio/skill/rechanyuan2.mp3', 'audio/skill/rechengxiang1.mp3', 'audio/skill/rechengxiang2.mp3', 'audio/skill/rechunlao1.mp3', @@ -3935,7 +3969,6 @@ window.noname_asset_list=[ 'audio/skill/renxin_re_caochong2.mp3', 'audio/skill/renxin1.mp3', 'audio/skill/renxin2.mp3', - 'audio/skill/renxin3.mp3', 'audio/skill/renzheng1.mp3', 'audio/skill/renzheng2.mp3', 'audio/skill/repaoxiao1.mp3', @@ -3997,6 +4030,8 @@ window.noname_asset_list=[ 'audio/skill/reshishou2.mp3', 'audio/skill/residi1.mp3', 'audio/skill/residi2.mp3', + 'audio/skill/retieji_boss_lvbu31.mp3', + 'audio/skill/retieji_boss_lvbu32.mp3', 'audio/skill/retieji1.mp3', 'audio/skill/retieji2.mp3', 'audio/skill/retishen1.mp3', @@ -4145,6 +4180,8 @@ window.noname_asset_list=[ 'audio/skill/sbfanjian2.mp3', 'audio/skill/sbfenwei1.mp3', 'audio/skill/sbfenwei2.mp3', + 'audio/skill/sbguanxing1.mp3', + 'audio/skill/sbguanxing2.mp3', 'audio/skill/sbguidao1.mp3', 'audio/skill/sbguidao2.mp3', 'audio/skill/sbguose1.mp3', @@ -4155,6 +4192,8 @@ window.noname_asset_list=[ 'audio/skill/sbhujia2.mp3', 'audio/skill/sbhunzi1.mp3', 'audio/skill/sbhunzi2.mp3', + 'audio/skill/sbhuoji1.mp3', + 'audio/skill/sbhuoji2.mp3', 'audio/skill/sbhuoshou1.mp3', 'audio/skill/sbhuoshou2.mp3', 'audio/skill/sbjiang1.mp3', @@ -4173,6 +4212,8 @@ window.noname_asset_list=[ 'audio/skill/sbjijiang2.mp3', 'audio/skill/sbjiuyuan1.mp3', 'audio/skill/sbjiuyuan2.mp3', + 'audio/skill/sbjizhi1.mp3', + 'audio/skill/sbjizhi2.mp3', 'audio/skill/sbjizhu1.mp3', 'audio/skill/sbjizhu2.mp3', 'audio/skill/sbjizhu3.mp3', @@ -4181,8 +4222,12 @@ window.noname_asset_list=[ 'audio/skill/sbjushou3.mp3', 'audio/skill/sbjuxiang1.mp3', 'audio/skill/sbjuxiang2.mp3', + 'audio/skill/sbkanpo1.mp3', + 'audio/skill/sbkanpo2.mp3', 'audio/skill/sbkeji1.mp3', 'audio/skill/sbkeji2.mp3', + 'audio/skill/sbkongcheng1.mp3', + 'audio/skill/sbkongcheng2.mp3', 'audio/skill/sbkurou1.mp3', 'audio/skill/sbkurou2.mp3', 'audio/skill/sbleiji1.mp3', @@ -4215,6 +4260,8 @@ window.noname_asset_list=[ 'audio/skill/sbqiaobian2.mp3', 'audio/skill/sbqiaoshi1.mp3', 'audio/skill/sbqiaoshi2.mp3', + 'audio/skill/sbqicai1.mp3', + 'audio/skill/sbqicai2.mp3', 'audio/skill/sbqingzheng1.mp3', 'audio/skill/sbqingzheng2.mp3', 'audio/skill/sbqixi1.mp3', @@ -4426,12 +4473,10 @@ window.noname_asset_list=[ 'audio/skill/shuaiyan2.mp3', 'audio/skill/shuangren1.mp3', 'audio/skill/shuangren2.mp3', - 'audio/skill/shuangxiong.mp3', - 'audio/skill/shuangxiong_re_yanwen.mp3', + 'audio/skill/shuangxiong_re_yanwen1.mp3', + 'audio/skill/shuangxiong_re_yanwen2.mp3', 'audio/skill/shuangxiong1.mp3', - 'audio/skill/shuangxiong1_re_yanwen.mp3', 'audio/skill/shuangxiong2.mp3', - 'audio/skill/shuangxiong2_re_yanwen.mp3', 'audio/skill/shuchen1.mp3', 'audio/skill/shuchen2.mp3', 'audio/skill/shuimeng1.mp3', @@ -4442,6 +4487,8 @@ window.noname_asset_list=[ 'audio/skill/shuliang2.mp3', 'audio/skill/shunshi1.mp3', 'audio/skill/shunshi2.mp3', + 'audio/skill/shuojian1.mp3', + 'audio/skill/shuojian2.mp3', 'audio/skill/shushen1.mp3', 'audio/skill/shushen2.mp3', 'audio/skill/sibian1.mp3', @@ -4589,6 +4636,16 @@ window.noname_asset_list=[ 'audio/skill/spzhuilie2.mp3', 'audio/skill/spzundi1.mp3', 'audio/skill/spzundi2.mp3', + 'audio/skill/starcanxi1.mp3', + 'audio/skill/starcanxi2.mp3', + 'audio/skill/starlifeng1.mp3', + 'audio/skill/starlifeng2.mp3', + 'audio/skill/starpizhi1.mp3', + 'audio/skill/starpizhi2.mp3', + 'audio/skill/starsujun1.mp3', + 'audio/skill/starsujun2.mp3', + 'audio/skill/starzhonggu1.mp3', + 'audio/skill/starzhonggu2.mp3', 'audio/skill/stianyi1.mp3', 'audio/skill/stianyi2.mp3', 'audio/skill/suishi1.mp3', @@ -4675,8 +4732,6 @@ window.noname_asset_list=[ 'audio/skill/tiaoxin_xiahouba2.mp3', 'audio/skill/tiaoxin1.mp3', 'audio/skill/tiaoxin2.mp3', - 'audio/skill/tiaoxin3.mp3', - 'audio/skill/tiaoxin4.mp3', 'audio/skill/tieji1.mp3', 'audio/skill/tieji2.mp3', 'audio/skill/tiqi1.mp3', @@ -4786,8 +4841,6 @@ window.noname_asset_list=[ 'audio/skill/twjilun2.mp3', 'audio/skill/twjingce1.mp3', 'audio/skill/twjingce2.mp3', - 'audio/skill/twjizhu2.mp3', - 'audio/skill/twjizhu3.mp3', 'audio/skill/twjuchen1.mp3', 'audio/skill/twjuchen2.mp3', 'audio/skill/twjuntun1.mp3', @@ -4835,9 +4888,6 @@ window.noname_asset_list=[ 'audio/skill/twquanqian2.mp3', 'audio/skill/twrenchou1.mp3', 'audio/skill/twrenchou2.mp3', - 'audio/skill/twrende1.mp3', - 'audio/skill/twrende2.mp3', - 'audio/skill/twrende3.mp3', 'audio/skill/twrouke1.mp3', 'audio/skill/twrouke2.mp3', 'audio/skill/twruilian1.mp3', @@ -4966,6 +5016,8 @@ window.noname_asset_list=[ 'audio/skill/weifeng2.mp3', 'audio/skill/weijing1.mp3', 'audio/skill/weijing2.mp3', + 'audio/skill/weikui1.mp3', + 'audio/skill/weikui2.mp3', 'audio/skill/weilie1.mp3', 'audio/skill/weilie2.mp3', 'audio/skill/weimeng1.mp3', @@ -4992,11 +5044,12 @@ window.noname_asset_list=[ 'audio/skill/wufei2.mp3', 'audio/skill/wuhun21.mp3', 'audio/skill/wuhun22.mp3', - 'audio/skill/wuhun23.mp3', 'audio/skill/wuji1.mp3', 'audio/skill/wuji2.mp3', 'audio/skill/wulie1.mp3', 'audio/skill/wulie2.mp3', + 'audio/skill/wuling1.mp3', + 'audio/skill/wuling2.mp3', 'audio/skill/wumou1.mp3', 'audio/skill/wumou2.mp3', 'audio/skill/wuniang1.mp3', @@ -5023,11 +5076,12 @@ window.noname_asset_list=[ 'audio/skill/wusheng_re_guanzhang2.mp3', 'audio/skill/wusheng1.mp3', 'audio/skill/wusheng2.mp3', - 'audio/skill/wusheng3.mp3', 'audio/skill/wushuang_lvlingqi1.mp3', 'audio/skill/wushuang_lvlingqi2.mp3', 'audio/skill/wushuang_re_lvbu1.mp3', 'audio/skill/wushuang_re_lvbu2.mp3', + 'audio/skill/wushuang_shen_lvbu1.mp3', + 'audio/skill/wushuang_shen_lvbu2.mp3', 'audio/skill/wushuang_wechat_lvbu1.mp3', 'audio/skill/wushuang_wechat_lvbu2.mp3', 'audio/skill/wushuang1.mp3', @@ -5096,8 +5150,6 @@ window.noname_asset_list=[ 'audio/skill/xiaoji_sp_sunshangxiang2.mp3', 'audio/skill/xiaoji1.mp3', 'audio/skill/xiaoji2.mp3', - 'audio/skill/xiaoji3.mp3', - 'audio/skill/xiaoji4.mp3', 'audio/skill/xiaoni1.mp3', 'audio/skill/xiaoni2.mp3', 'audio/skill/xiaowu1.mp3', @@ -5134,7 +5186,7 @@ window.noname_asset_list=[ 'audio/skill/xindanshou2.mp3', 'audio/skill/xinduodao1.mp3', 'audio/skill/xinduodao2.mp3', - 'audio/skill/xinenyuan.mp3', + 'audio/skill/xinenyuan1.mp3', 'audio/skill/xinenyuan2.mp3', 'audio/skill/xinfencheng_re_liru1.mp3', 'audio/skill/xinfencheng_re_liru2.mp3', @@ -5180,9 +5232,6 @@ window.noname_asset_list=[ 'audio/skill/xinfu_jianji1.mp3', 'audio/skill/xinfu_jianji2.mp3', 'audio/skill/xinfu_jianjie1.mp3', - 'audio/skill/xinfu_jianjie11.mp3', - 'audio/skill/xinfu_jianjie12.mp3', - 'audio/skill/xinfu_jianjie13.mp3', 'audio/skill/xinfu_jianjie2.mp3', 'audio/skill/xinfu_jianjie3.mp3', 'audio/skill/xinfu_jijie1.mp3', @@ -5514,8 +5563,6 @@ window.noname_asset_list=[ 'audio/skill/yichong2.mp3', 'audio/skill/yicong1.mp3', 'audio/skill/yicong2.mp3', - 'audio/skill/yicong3.mp3', - 'audio/skill/yicong4.mp3', 'audio/skill/yidian1.mp3', 'audio/skill/yidian2.mp3', 'audio/skill/yidu1.mp3', @@ -5528,6 +5575,8 @@ window.noname_asset_list=[ 'audio/skill/yiji2.mp3', 'audio/skill/yijiao1.mp3', 'audio/skill/yijiao2.mp3', + 'audio/skill/yijie1.mp3', + 'audio/skill/yijie2.mp3', 'audio/skill/yijin1.mp3', 'audio/skill/yijin2.mp3', 'audio/skill/yijin3.mp3', @@ -5618,10 +5667,8 @@ window.noname_asset_list=[ 'audio/skill/yongjue2.mp3', 'audio/skill/yonglve1.mp3', 'audio/skill/yonglve2.mp3', - 'audio/skill/yongsi11.mp3', - 'audio/skill/yongsi12.mp3', - 'audio/skill/yongsi21.mp3', - 'audio/skill/yongsi22.mp3', + 'audio/skill/yongsi1.mp3', + 'audio/skill/yongsi2.mp3', 'audio/skill/youdi1.mp3', 'audio/skill/youdi2.mp3', 'audio/skill/youlong1.mp3', @@ -5630,6 +5677,8 @@ window.noname_asset_list=[ 'audio/skill/youxu2.mp3', 'audio/skill/youyan1.mp3', 'audio/skill/youyan2.mp3', + 'audio/skill/youyi1.mp3', + 'audio/skill/youyi2.mp3', 'audio/skill/yuanchou1.mp3', 'audio/skill/yuanchou2.mp3', 'audio/skill/yuanhu1.mp3', @@ -5880,7 +5929,6 @@ window.noname_asset_list=[ 'audio/skill/zili_re_zhonghui2.mp3', 'audio/skill/zili1.mp3', 'audio/skill/zili2.mp3', - 'audio/skill/zili3.mp3', 'audio/skill/ziliang1.mp3', 'audio/skill/ziliang2.mp3', 'audio/skill/ziqu1.mp3', @@ -6223,6 +6271,7 @@ window.noname_asset_list=[ 'image/card/huoshan.png', 'image/card/huoshaolianying.png', 'image/card/huxinjing.png', + 'image/card/identity_commoner.jpg', 'image/card/identity_enemy.jpg', 'image/card/identity_fan.jpg', 'image/card/identity_friend.jpg', @@ -6497,1964 +6546,1985 @@ window.noname_asset_list=[ /*card image end*/ /*character image begin*/ - 'image/character/ahuinan.jpg', - 'image/character/baiwuchang.jpg', - 'image/character/baosanniang.jpg', - 'image/character/beimihu.jpg', - 'image/character/bianfuren.jpg', - 'image/character/bianxi.jpg', - 'image/character/boss_zhaoyun.jpg', - 'image/character/bulianshi.jpg', - 'image/character/buzhi.jpg', - 'image/character/caifuren.jpg', - 'image/character/caimaozhangyun.jpg', - 'image/character/caiwenji.jpg', - 'image/character/caiyang.jpg', - 'image/character/caiyong.jpg', - 'image/character/caizhenji.jpg', - 'image/character/caoang.jpg', - 'image/character/caoanmin.jpg', - 'image/character/caobuxing.jpg', - 'image/character/caocao.jpg', - 'image/character/caochong.jpg', - 'image/character/caochun.jpg', - 'image/character/caohong.jpg', - 'image/character/caohua.jpg', - 'image/character/caojie.jpg', - 'image/character/caojinyu.jpg', - 'image/character/caomao.jpg', - 'image/character/caopi.jpg', - 'image/character/caoren.jpg', - 'image/character/caorui.jpg', - 'image/character/caoshuang.jpg', - 'image/character/caosong.jpg', - 'image/character/caoxi.jpg', - 'image/character/caoxiancaohua.jpg', - 'image/character/caoxing.jpg', - 'image/character/caoxiu.jpg', - 'image/character/caoying.jpg', - 'image/character/caozhang.jpg', - 'image/character/caozhen.jpg', - 'image/character/caozhi.jpg', - 'image/character/cenhun.jpg', - 'image/character/cheliji.jpg', - 'image/character/chendao.jpg', - 'image/character/chendeng.jpg', - 'image/character/chendong.jpg', - 'image/character/chengbing.jpg', - 'image/character/chengong.jpg', - 'image/character/chengpu.jpg', - 'image/character/chengui.jpg', - 'image/character/chengyu.jpg', - 'image/character/chenjiao.jpg', - 'image/character/chenlin.jpg', - 'image/character/chenqun.jpg', - 'image/character/chenshi.jpg', - 'image/character/chentai.jpg', - 'image/character/chunyuqiong.jpg', - 'image/character/clan_hanrong.jpg', - 'image/character/clan_hanshao.jpg', - 'image/character/clan_wanghun.jpg', - 'image/character/clan_wangling.jpg', - 'image/character/clan_wanglun.jpg', - 'image/character/clan_wangyun.jpg', - 'image/character/clan_wuban.jpg', - 'image/character/clan_wukuang.jpg', - 'image/character/clan_wuxian.jpg', - 'image/character/clan_xuncai.jpg', - 'image/character/clan_xuncan.jpg', - 'image/character/clan_xunchen.jpg', - 'image/character/clan_xunshu.jpg', - 'image/character/clan_xunyou.jpg', - 'image/character/clan_zhonghui.jpg', - 'image/character/clan_zhongyan.jpg', - 'image/character/clan_zhongyu.jpg', - 'image/character/cuimao.jpg', - 'image/character/cuiyan.jpg', - 'image/character/daqiao.jpg', - 'image/character/daxiaoqiao.jpg', - 'image/character/db_key_hina.jpg', - 'image/character/db_key_liyingxia.jpg', - '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_daxiaoqiao.jpg', - 'image/character/dc_duyu.jpg', - 'image/character/dc_fuwan.jpg', - 'image/character/dc_ganfuren.jpg', - 'image/character/dc_gaolan.jpg', - 'image/character/dc_gongsunzan.jpg', - 'image/character/dc_guansuo.jpg', - 'image/character/dc_huangchengyan.jpg', - 'image/character/dc_huanghao.jpg', - 'image/character/dc_huangquan.jpg', - 'image/character/dc_huangzu.jpg', - 'image/character/dc_huban.jpg', - 'image/character/dc_hujinding.jpg', - 'image/character/dc_huojun.jpg', - 'image/character/dc_jiben.jpg', - 'image/character/dc_jikang.jpg', - 'image/character/dc_jiling.jpg', - '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', - 'image/character/dc_lvkuanglvxiang.jpg', - 'image/character/dc_mengda.jpg', - 'image/character/dc_mifuren.jpg', - 'image/character/dc_ruiji.jpg', - 'image/character/dc_shixie.jpg', - 'image/character/dc_sp_jiaxu.jpg', - 'image/character/dc_sp_machao.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', - 'image/character/dc_wangchang.jpg', - 'image/character/dc_wangjun.jpg', - 'image/character/dc_wangyun.jpg', - 'image/character/dc_xiahouba.jpg', - 'image/character/dc_xujing.jpg', - 'image/character/dc_xushu.jpg', - 'image/character/dc_yangbiao.jpg', - 'image/character/dc_yanghu.jpg', - 'image/character/dc_yuejiu.jpg', - 'image/character/dc_zhangmancheng.jpg', - 'image/character/dc_zhaotongzhaoguang.jpg', - 'image/character/dc_zhaoxiang.jpg', - 'image/character/dc_zhaoyǎn.jpg', - 'image/character/dc_zhouxuān.jpg', - 'image/character/dc_zhuling.jpg', - 'image/character/ddd_baosanniang.jpg', - 'image/character/ddd_caomao.jpg', - 'image/character/ddd_caoshuang.jpg', - 'image/character/ddd_dingfeng.jpg', - 'image/character/ddd_guanning.jpg', - 'image/character/ddd_handang.jpg', - 'image/character/ddd_jianshuo.jpg', - 'image/character/ddd_kebineng.jpg', - 'image/character/ddd_liangxi.jpg', - 'image/character/ddd_lie.jpg', - 'image/character/ddd_liuba.jpg', - 'image/character/ddd_liuhong.jpg', - 'image/character/ddd_liuye.jpg', - 'image/character/ddd_sunliang.jpg', - 'image/character/ddd_wangkanglvkai.jpg', - 'image/character/ddd_wuzhi.jpg', - 'image/character/ddd_xiahouxuan.jpg', - 'image/character/ddd_xianglang.jpg', - 'image/character/ddd_xinxianying.jpg', - 'image/character/ddd_xuelingyun.jpg', - 'image/character/ddd_xujing.jpg', - 'image/character/ddd_yujin.jpg', - 'image/character/ddd_zhangkai.jpg', - 'image/character/ddd_zhaoang.jpg', - 'image/character/ddd_zhenji.jpg', - 'image/character/ddd_zhouchu.jpg', - 'image/character/dengai.jpg', - 'image/character/dengzhi.jpg', - 'image/character/dengzhong.jpg', - 'image/character/dianwei.jpg', - 'image/character/diaochan.jpg', - 'image/character/dingfeng.jpg', - 'image/character/dingshangwan.jpg', - 'image/character/dingyuan.jpg', - 'image/character/diy_caiwenji.jpg', - 'image/character/diy_feishi.jpg', - 'image/character/diy_hanlong.jpg', - 'image/character/diy_huangzhong.jpg', - 'image/character/diy_liufu.jpg', - 'image/character/diy_liuyan.jpg', - 'image/character/diy_liuzan.jpg', - 'image/character/diy_lukang.jpg', - 'image/character/diy_menghuo.jpg', - 'image/character/diy_tianyu.jpg', - 'image/character/diy_weiyan.jpg', - 'image/character/diy_wenyang.jpg', - 'image/character/diy_xizhenxihong.jpg', - 'image/character/diy_xuhuang.jpg', - 'image/character/diy_yangyi.jpg', - 'image/character/diy_yuji.jpg', - 'image/character/diy_zaozhirenjun.jpg', - 'image/character/diy_zhenji.jpg', - 'image/character/diy_zhouyu.jpg', - 'image/character/dongbai.jpg', - 'image/character/dongcheng.jpg', - 'image/character/dongguiren.jpg', - 'image/character/dongtuna.jpg', - 'image/character/dongwan.jpg', - 'image/character/dongxie.jpg', - 'image/character/dongyun.jpg', - 'image/character/dongzhao.jpg', - 'image/character/dongzhuo.jpg', - 'image/character/duanjiong.jpg', - 'image/character/duanqiaoxiao.jpg', - 'image/character/duanwei.jpg', - 'image/character/dufuren.jpg', - 'image/character/duji.jpg', - 'image/character/dukui.jpg', - 'image/character/duosidawang.jpg', - 'image/character/duxi.jpg', - 'image/character/duyu.jpg', - 'image/character/fanchou.jpg', - 'image/character/fanjiangzhangda.jpg', - 'image/character/fanyufeng.jpg', - 'image/character/fazheng.jpg', - 'image/character/feiyao.jpg', - 'image/character/feiyi.jpg', - 'image/character/fengfang.jpg', - 'image/character/fengfangnv.jpg', - 'image/character/fengxi.jpg', - 'image/character/fuhuanghou.jpg', - 'image/character/fuqian.jpg', - 'image/character/furong.jpg', - 'image/character/furongfuqian.jpg', - 'image/character/fuwan.jpg', - 'image/character/ganfuren.jpg', - 'image/character/ganfurenmifuren.jpg', - 'image/character/ganning.jpg', - 'image/character/gaogan.jpg', - 'image/character/gaolan.jpg', - 'image/character/gaoshun.jpg', - 'image/character/gaoxiang.jpg', - 'image/character/gexuan.jpg', - 'image/character/gjqt_aruan.jpg', - 'image/character/gjqt_bailitusu.jpg', - 'image/character/gjqt_beiluo.jpg', - 'image/character/gjqt_cenying.jpg', - 'image/character/gjqt_chuqi.jpg', - 'image/character/gjqt_fanglansheng.jpg', - 'image/character/gjqt_fengqingxue.jpg', - 'image/character/gjqt_hongyu.jpg', - 'image/character/gjqt_ouyangshaogong.jpg', - 'image/character/gjqt_wenrenyu.jpg', - 'image/character/gjqt_xiangling.jpg', - 'image/character/gjqt_xiayize.jpg', - 'image/character/gjqt_xieyi.jpg', - 'image/character/gjqt_xunfang.jpg', - 'image/character/gjqt_yanjiaxieyi.jpg', - 'image/character/gjqt_yinqianshang.jpg', - 'image/character/gjqt_yuewuyi.jpg', - 'image/character/gjqt_yunwuyue.jpg', - 'image/character/gongsundu.jpg', - 'image/character/gongsunkang.jpg', - 'image/character/gongsunyuan.jpg', - 'image/character/gongsunzan.jpg', - 'image/character/guanhai.jpg', - 'image/character/guanlu.jpg', - 'image/character/guanning.jpg', - 'image/character/guānning.jpg', - 'image/character/guanping.jpg', - 'image/character/guanqiujian.jpg', - 'image/character/guansuo.jpg', - 'image/character/guanxingzhangbao.jpg', - 'image/character/guanyinping.jpg', - 'image/character/guanyu.jpg', - 'image/character/guanzhang.jpg', - 'image/character/guohuai.jpg', - 'image/character/guohuanghou.jpg', - 'image/character/guojia.jpg', - 'image/character/guosi.jpg', - 'image/character/guotufengji.jpg', - 'image/character/guozhao.jpg', - 'image/character/guyong.jpg', - 'image/character/gw_aigeleisi.jpg', - 'image/character/gw_aimin.jpg', - 'image/character/gw_airuiting.jpg', - 'image/character/gw_aisinie.jpg', - 'image/character/gw_aokeweisite.jpg', - 'image/character/gw_bierna.jpg', - 'image/character/gw_bulanwang.jpg', - 'image/character/gw_dagong.jpg', - 'image/character/gw_diandian.jpg', - 'image/character/gw_enxier.jpg', - 'image/character/gw_falanxisika.jpg', - 'image/character/gw_feilafanruide.jpg', - 'image/character/gw_fenghuang.jpg', - 'image/character/gw_fuertaisite.jpg', - 'image/character/gw_fulisi.jpg', - 'image/character/gw_gaier.jpg', - 'image/character/gw_haizhiyezhu.jpg', - 'image/character/gw_haluo.jpg', - 'image/character/gw_hanmuduoer.jpg', - 'image/character/gw_hengsaite.jpg', - 'image/character/gw_huoge.jpg', - 'image/character/gw_jieluote.jpg', - 'image/character/gw_kaerweite.jpg', - 'image/character/gw_kairuisi.jpg', - 'image/character/gw_kanbi.jpg', - 'image/character/gw_kaxier.jpg', - 'image/character/gw_kuite.jpg', - 'image/character/gw_laduoweide.jpg', - 'image/character/gw_lanbote.jpg', - 'image/character/gw_laomaotou.jpg', - 'image/character/gw_laomaotou2.jpg', - 'image/character/gw_linjing.jpg', - 'image/character/gw_luobo.jpg', - 'image/character/gw_luoqi.jpg', - 'image/character/gw_meizi.jpg', - 'image/character/gw_mieren.jpg', - 'image/character/gw_nitelila.jpg', - 'image/character/gw_nvyemo.jpg', - 'image/character/gw_oudimu.jpg', - 'image/character/gw_puxila.jpg', - 'image/character/gw_qigaiwang.jpg', - 'image/character/gw_sanhanya.jpg', - 'image/character/gw_saqiya.jpg', - 'image/character/gw_saqiya1.jpg', - 'image/character/gw_saqiya2.jpg', - 'image/character/gw_shanhu.jpg', - 'image/character/gw_shasixiwusi.jpg', - 'image/character/gw_telisi.jpg', - 'image/character/gw_xigedelifa.jpg', - 'image/character/gw_xili.jpg', - 'image/character/gw_yenaifa.jpg', - 'image/character/gw_yioufeisi.jpg', - 'image/character/gw_yioufeisisp.jpg', - 'image/character/gw_yisilinni.jpg', - 'image/character/gw_zhangyujushou.jpg', - 'image/character/gw_zhuoertan.jpg', - 'image/character/gz_caohong.jpg', - 'image/character/gz_caopi.jpg', - 'image/character/gz_chengong.jpg', - 'image/character/gz_dengai.jpg', - 'image/character/gz_dengzhi.jpg', - 'image/character/gz_dianwei.jpg', - 'image/character/gz_diaochan.jpg', - 'image/character/gz_dingfeng.jpg', - 'image/character/gz_fazheng.jpg', - 'image/character/gz_fengxi.jpg', - 'image/character/gz_ganfuren.jpg', - 'image/character/gz_gongsunyuan.jpg', - 'image/character/gz_guanyu.jpg', - 'image/character/gz_guohuai.jpg', - 'image/character/gz_guojia.jpg', - 'image/character/gz_hetaihou.jpg', - 'image/character/gz_huangyueying.jpg', - 'image/character/gz_huangzhong.jpg', - 'image/character/gz_huangzu.jpg', - 'image/character/gz_jiangwei.jpg', - 'image/character/gz_jiaxu.jpg', - 'image/character/gz_lingtong.jpg', - 'image/character/gz_liuba.jpg', - 'image/character/gz_liuqi.jpg', - 'image/character/gz_lukang.jpg', - 'image/character/gz_luxun.jpg', - 'image/character/gz_lvbu.jpg', - 'image/character/gz_lvlingqi.jpg', - 'image/character/gz_madai.jpg', - 'image/character/gz_masu.jpg', - 'image/character/gz_miheng.jpg', - 'image/character/gz_panfeng.jpg', - 'image/character/gz_panjun.jpg', - 'image/character/gz_pengyang.jpg', - 'image/character/gz_re_xushu.jpg', - 'image/character/gz_re_yuanshao.jpg', - 'image/character/gz_shamoke.jpg', - 'image/character/gz_shixie.jpg', - 'image/character/gz_simazhao.jpg', - 'image/character/gz_sp_zhugeliang.jpg', - 'image/character/gz_sunce.jpg', - 'image/character/gz_sunjian.jpg', - 'image/character/gz_sunshangxiang.jpg', - 'image/character/gz_tangzi.jpg', - 'image/character/gz_wangping.jpg', - 'image/character/gz_wenqin.jpg', - 'image/character/gz_wuguotai.jpg', - 'image/character/gz_wujing.jpg', - 'image/character/gz_xf_sufei.jpg', - 'image/character/gz_xiahouba.jpg', - 'image/character/gz_xiahouyuan.jpg', - 'image/character/gz_xiaoqiao.jpg', - 'image/character/gz_xunyou.jpg', - 'image/character/gz_xusheng.jpg', - 'image/character/gz_xuyou.jpg', - 'image/character/gz_yanbaihu.jpg', - 'image/character/gz_yangwan.jpg', - 'image/character/gz_yuanshu.jpg', - 'image/character/gz_yuejin.jpg', - 'image/character/gz_yuji.jpg', - 'image/character/gz_yujin.jpg', - 'image/character/gz_zhanglu.jpg', - 'image/character/gz_zhangxiu.jpg', - 'image/character/gz_zhenji.jpg', - 'image/character/gz_zhonghui.jpg', - 'image/character/gz_zhouyu.jpg', - 'image/character/gz_zhugeke.jpg', - 'image/character/gz_zhugeliang.jpg', - 'image/character/gz_zhuling.jpg', - 'image/character/gz_zuoci.jpg', - 'image/character/hanba.jpg', - 'image/character/handang.jpg', - 'image/character/hanfu.jpg', - 'image/character/hanhaoshihuan.jpg', - 'image/character/hanlong.jpg', - 'image/character/hanmeng.jpg', - 'image/character/hansui.jpg', - 'image/character/haomeng.jpg', - 'image/character/haopu.jpg', - 'image/character/haozhao.jpg', - 'image/character/heiwuchang.jpg', - 'image/character/hejin.jpg', - 'image/character/heqi.jpg', - 'image/character/hetaihou.jpg', - 'image/character/heyan.jpg', - 'image/character/hhzz_kanade.jpg', - 'image/character/hhzz_shiona.jpg', - 'image/character/hhzz_takaramono1.jpg', - 'image/character/hhzz_takaramono2.jpg', - 'image/character/hs_aedwin.jpg', - 'image/character/hs_aerfusi.jpg', - 'image/character/hs_aiqinvyao.jpg', - 'image/character/hs_alakir.jpg', - 'image/character/hs_alextrasza.jpg', - 'image/character/hs_alleria.jpg', - 'image/character/hs_amala.jpg', - 'image/character/hs_anduin.jpg', - 'image/character/hs_anomalus.jpg', - 'image/character/hs_antonidas.jpg', - 'image/character/hs_ashamoer.jpg', - 'image/character/hs_aya.jpg', - 'image/character/hs_baiguyoulong.jpg', - 'image/character/hs_bannabusi.jpg', - 'image/character/hs_barnes.jpg', - 'image/character/hs_bchillmaw.jpg', - 'image/character/hs_bilanyoulong.jpg', - 'image/character/hs_bingshuangnvwang.jpg', - 'image/character/hs_blingtron.jpg', - 'image/character/hs_bolvar.jpg', - 'image/character/hs_brann.jpg', - 'image/character/hs_duyaxinshi.jpg', - 'image/character/hs_enzoth.jpg', - 'image/character/hs_fachaotuteng.jpg', - 'image/character/hs_fandral.jpg', - 'image/character/hs_fengjianhuanfengzhe.jpg', - 'image/character/hs_fenjie.jpg', - 'image/character/hs_finley.jpg', - 'image/character/hs_fuding.jpg', - 'image/character/hs_guldan.jpg', - 'image/character/hs_hajiasha.jpg', - 'image/character/hs_hallazeal.jpg', - 'image/character/hs_heifengqishi.jpg', - 'image/character/hs_hemite.jpg', - 'image/character/hs_hudunren.jpg', - 'image/character/hs_huolituteng.jpg', - 'image/character/hs_huzhixiannv.jpg', - 'image/character/hs_jaina.jpg', - 'image/character/hs_jgarrosh.jpg', - 'image/character/hs_jiawodun.jpg', - 'image/character/hs_jiaziruila.jpg', - 'image/character/hs_jinglinglong.jpg', - 'image/character/hs_kaituozhe.jpg', - 'image/character/hs_kalimosi.jpg', - 'image/character/hs_kazhakusi.jpg', - 'image/character/hs_kchromaggus.jpg', - 'image/character/hs_kcthun.jpg', - 'image/character/hs_khadgar.jpg', - 'image/character/hs_lafamu.jpg', - 'image/character/hs_laila.jpg', - 'image/character/hs_laxiao.jpg', - 'image/character/hs_lazi.jpg', - 'image/character/hs_liadrin.jpg', - 'image/character/hs_loatheb.jpg', - 'image/character/hs_lreno.jpg', - 'image/character/hs_lrexxar.jpg', - 'image/character/hs_lrhonin.jpg', - 'image/character/hs_magni.jpg', - 'image/character/hs_malfurion.jpg', - 'image/character/hs_malorne.jpg', - 'image/character/hs_malygos.jpg', - 'image/character/hs_manyututeng.jpg', - 'image/character/hs_medivh.jpg', - 'image/character/hs_mijiaojisi.jpg', - 'image/character/hs_mojinbaozi.jpg', - 'image/character/hs_morgl.jpg', - 'image/character/hs_nate.jpg', - 'image/character/hs_neptulon.jpg', - 'image/character/hs_nozdormu.jpg', - 'image/character/hs_nuogefu.jpg', - 'image/character/hs_pengpeng.jpg', - 'image/character/hs_pyros.jpg', - 'image/character/hs_pyros1.jpg', - 'image/character/hs_pyros2.jpg', - 'image/character/hs_ronghejuren.jpg', - 'image/character/hs_ruanniguai.jpg', - 'image/character/hs_sainaliusi.jpg', - 'image/character/hs_sapphiron.jpg', - 'image/character/hs_selajin.jpg', - 'image/character/hs_selajin2.jpg', - 'image/character/hs_shaku.jpg', - 'image/character/hs_shanlingjuren.jpg', - 'image/character/hs_shifazhe.jpg', - 'image/character/hs_shirencao.jpg', - 'image/character/hs_shizugui.jpg', - 'image/character/hs_shuiwenxuejia.jpg', - 'image/character/hs_siwangxianzhi.jpg', - 'image/character/hs_siwangzhiyi.jpg', - 'image/character/hs_sthrall.jpg', - 'image/character/hs_taisi.jpg', - 'image/character/hs_tanghangu.jpg', - 'image/character/hs_tgolem.jpg', - 'image/character/hs_totemic.jpg', - 'image/character/hs_trueheart.jpg', - 'image/character/hs_tuoqi.jpg', - 'image/character/hs_tyrande.jpg', - 'image/character/hs_waleera.jpg', - 'image/character/hs_walian.jpg', - 'image/character/hs_wolazi.jpg', - 'image/character/hs_wujiyuansu.jpg', - 'image/character/hs_wuther.jpg', - 'image/character/hs_wuyaowang.jpg', - 'image/character/hs_wvelen.jpg', - 'image/character/hs_xialikeer.jpg', - 'image/character/hs_xiangyaqishi.jpg', - 'image/character/hs_xsylvanas.jpg', - 'image/character/hs_xuanzhuanjijia.jpg', - 'image/character/hs_xuefashi.jpg', - 'image/character/hs_xukongzhiying.jpg', - 'image/character/hs_yangyanwageli.jpg', - 'image/character/hs_yashaji.jpg', - 'image/character/hs_yelinchulong.jpg', - 'image/character/hs_yelinlonghou.jpg', - 'image/character/hs_yelise.jpg', - 'image/character/hs_yinggencao.jpg', - 'image/character/hs_yngvar.jpg', - 'image/character/hs_yogg.jpg', - 'image/character/hs_ysera.jpg', - 'image/character/hs_yuhuozhe.jpg', - 'image/character/hs_zhanzhenggushu.jpg', - 'image/character/hs_zhihuanhua.jpg', - 'image/character/hs_zhishigushu.jpg', - 'image/character/hs_zhouzhuo.jpg', - 'image/character/huaman.jpg', - 'image/character/huanfan.jpg', - 'image/character/huangchengyan.jpg', - 'image/character/huangfusong.jpg', - 'image/character/huanggai.jpg', - 'image/character/huanghao.jpg', - 'image/character/huangjinleishi.jpg', - 'image/character/huangyueying.jpg', - 'image/character/huangzhong.jpg', - 'image/character/huangzu.jpg', - 'image/character/huatuo.jpg', - 'image/character/huaxin.jpg', - 'image/character/huaxiong.jpg', - 'image/character/huban.jpg', - 'image/character/hucheer.jpg', - 'image/character/hujinding.jpg', - 'image/character/huojun.jpg', - 'image/character/huzhao.jpg', - 'image/character/jiachong.jpg', - 'image/character/jiakui.jpg', - 'image/character/jiangfei.jpg', - 'image/character/jianggan.jpg', - 'image/character/jiangqing.jpg', - 'image/character/jiangwei.jpg', - 'image/character/jianyong.jpg', - 'image/character/jiaxu.jpg', - 'image/character/jikang.jpg', - 'image/character/jiling.jpg', - 'image/character/jin_guohuai.jpg', - 'image/character/jin_jiachong.jpg', - 'image/character/jin_simashi.jpg', - 'image/character/jin_simayi.jpg', - 'image/character/jin_simazhao.jpg', - 'image/character/jin_wangyuanji.jpg', - 'image/character/jin_xiahouhui.jpg', - 'image/character/jin_yanghu.jpg', - 'image/character/jin_yanghuiyu.jpg', - 'image/character/jin_zhangchunhua.jpg', - 'image/character/jin_zhouchu.jpg', - 'image/character/jsp_caoren.jpg', - 'image/character/jsp_guanyu.jpg', - 'image/character/jsp_huangyueying.jpg', - '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_fanjiangzhangda.jpg', - 'image/character/jsrg_guanyu.jpg', - 'image/character/jsrg_guojia.jpg', - 'image/character/jsrg_hansui.jpg', - 'image/character/jsrg_hejin.jpg', - 'image/character/jsrg_huangfusong.jpg', - 'image/character/jsrg_huangzhong.jpg', - 'image/character/jsrg_kongrong.jpg', - 'image/character/jsrg_liubei.jpg', - 'image/character/jsrg_liuhong.jpg', - 'image/character/jsrg_liuyan.jpg', - 'image/character/jsrg_lougui.jpg', - 'image/character/jsrg_lvbu.jpg', - 'image/character/jsrg_machao.jpg', - 'image/character/jsrg_nanhualaoxian.jpg', - 'image/character/jsrg_pangtong.jpg', - 'image/character/jsrg_qiaoxuan.jpg', - 'image/character/jsrg_sunce.jpg', - 'image/character/jsrg_sunjian.jpg', - 'image/character/jsrg_sunshangxiang.jpg', - 'image/character/jsrg_wangyun.jpg', - 'image/character/jsrg_xiahouen.jpg', - 'image/character/jsrg_xiahourong.jpg', - 'image/character/jsrg_xugong.jpg', - 'image/character/jsrg_xushao.jpg', - 'image/character/jsrg_xuyou.jpg', - 'image/character/jsrg_yangbiao.jpg', - 'image/character/jsrg_zhangchu.jpg', - 'image/character/jsrg_zhangfei.jpg', - 'image/character/jsrg_zhanghe.jpg', - 'image/character/jsrg_zhangliao.jpg', - 'image/character/jsrg_zhangren.jpg', - 'image/character/jsrg_zhenji.jpg', - 'image/character/jsrg_zhujun.jpg', - 'image/character/jsrg_zoushi.jpg', - 'image/character/jun_caocao.jpg', - 'image/character/jun_liubei.jpg', - 'image/character/jun_sunquan.jpg', - 'image/character/jun_zhangjiao.jpg', - 'image/character/junk_duanwei.jpg', - 'image/character/junk_huangyueying.jpg', - 'image/character/junk_lidian.jpg', - 'image/character/junk_liubei.jpg', - 'image/character/junk_simayi.jpg', - 'image/character/junk_sunquan.jpg', - 'image/character/junk_xuyou.jpg', - 'image/character/junk_zhangrang.jpg', - 'image/character/kaisa.jpg', - 'image/character/kanze.jpg', - 'image/character/kebineng.jpg', - 'image/character/key_abyusa.jpg', - 'image/character/key_akane.jpg', - 'image/character/key_akiko.jpg', - 'image/character/key_ao.jpg', - 'image/character/key_asara.jpg', - 'image/character/key_ayato.jpg', - 'image/character/key_chihaya.jpg', - 'image/character/key_doruji.jpg', - 'image/character/key_erika.jpg', - 'image/character/key_fuuko.jpg', - 'image/character/key_godan.jpg', - 'image/character/key_harukakanata.jpg', - 'image/character/key_haruko.jpg', - 'image/character/key_hina.jpg', - 'image/character/key_hinata.jpg', - 'image/character/key_hiroto.jpg', - 'image/character/key_hisako.jpg', - 'image/character/key_inari.jpg', - 'image/character/key_iriya.jpg', - 'image/character/key_iwasawa.jpg', - 'image/character/key_jojiro.jpg', - 'image/character/key_kagari.jpg', - 'image/character/key_kamome.jpg', - 'image/character/key_kano.jpg', - 'image/character/key_kaori.jpg', - 'image/character/key_kengo.jpg', - 'image/character/key_kiyu.jpg', - 'image/character/key_komari.jpg', - 'image/character/key_kotarou.jpg', - 'image/character/key_kotomi.jpg', - 'image/character/key_kotori.jpg', - 'image/character/key_kud.jpg', - 'image/character/key_kyoko.jpg', - 'image/character/key_kyou.jpg', - 'image/character/key_kyouko.jpg', - 'image/character/key_kyousuke.jpg', - 'image/character/key_lucia.jpg', - 'image/character/key_masato.jpg', - 'image/character/key_mia.jpg', - 'image/character/key_michiru.jpg', - 'image/character/key_midori.jpg', - 'image/character/key_miki.jpg', - 'image/character/key_minagi.jpg', - 'image/character/key_mio.jpg', - 'image/character/key_misa.jpg', - 'image/character/key_misuzu.jpg', - 'image/character/key_nagisa.jpg', - 'image/character/key_nao.jpg', - 'image/character/key_noda.jpg', - 'image/character/key_rei.jpg', - 'image/character/key_riki.jpg', - 'image/character/key_rin.jpg', - 'image/character/key_rumi.jpg', - 'image/character/key_ryoichi.jpg', - 'image/character/key_sakuya.jpg', - 'image/character/key_sasami.jpg', - 'image/character/key_satomi.jpg', - 'image/character/key_saya.jpg', - 'image/character/key_seira.jpg', - 'image/character/key_shiina.jpg', - 'image/character/key_shiki.jpg', - 'image/character/key_shiori.jpg', - 'image/character/key_shiorimiyuki.jpg', - 'image/character/key_shiroha.jpg', - 'image/character/key_shizuku.jpg', - 'image/character/key_shizuru.jpg', - 'image/character/key_sunohara.jpg', - 'image/character/key_tenzen.jpg', - 'image/character/key_tomoya.jpg', - 'image/character/key_tomoyo.jpg', - 'image/character/key_tsumugi.jpg', - 'image/character/key_umi.jpg', - 'image/character/key_ushio.jpg', - 'image/character/key_yoshino.jpg', - 'image/character/key_youta.jpg', - 'image/character/key_yui.jpg', - 'image/character/key_yuiko.jpg', - 'image/character/key_yukine.jpg', - 'image/character/key_yukito.jpg', - 'image/character/key_yuri.jpg', - 'image/character/key_yusa.jpg', - 'image/character/key_yuu.jpg', - 'image/character/key_yuuki.jpg', - 'image/character/key_yuzuru.jpg', - 'image/character/kongrong.jpg', - 'image/character/kuailiangkuaiyue.jpg', - 'image/character/laiyinger.jpg', - 'image/character/le_shen_jiaxu.jpg', - 'image/character/leibo.jpg', - 'image/character/leitong.jpg', - 'image/character/liangxing.jpg', - 'image/character/liaohua.jpg', - 'image/character/libai.jpg', - 'image/character/licaiwei.jpg', - 'image/character/lifeng.jpg', - 'image/character/lijue.jpg', - 'image/character/lingcao.jpg', - 'image/character/lingju.jpg', - 'image/character/lingtong.jpg', - 'image/character/liqueguosi.jpg', - 'image/character/liru.jpg', - 'image/character/lisu.jpg', - 'image/character/litong.jpg', - 'image/character/liuba.jpg', - 'image/character/liubei.jpg', - 'image/character/liubian.jpg', - 'image/character/liubiao.jpg', - 'image/character/liuchen.jpg', - 'image/character/liucheng.jpg', - 'image/character/liuchongluojun.jpg', - 'image/character/liufeng.jpg', - 'image/character/liuhong.jpg', - 'image/character/liuhui.jpg', - 'image/character/liupi.jpg', - 'image/character/liuqi.jpg', - 'image/character/liushan.jpg', - 'image/character/liuxie.jpg', - 'image/character/liuyan.jpg', - 'image/character/liuyao.jpg', - 'image/character/liuye.jpg', - 'image/character/liuyong.jpg', - 'image/character/liuyu.jpg', - 'image/character/liuzan.jpg', - 'image/character/liuzhang.jpg', - 'image/character/liwan.jpg', - 'image/character/liyan.jpg', - 'image/character/liyixiejing.jpg', - 'image/character/longwang.jpg', - 'image/character/longyufei.jpg', - 'image/character/luji.jpg', - 'image/character/lukai.jpg', - 'image/character/lukang.jpg', - 'image/character/luotong.jpg', - 'image/character/luoxian.jpg', - 'image/character/lushi.jpg', - 'image/character/luxun.jpg', - 'image/character/luyi.jpg', - 'image/character/luyusheng.jpg', - 'image/character/luzhi.jpg', - 'image/character/lvboshe.jpg', - 'image/character/lvbu.jpg', - 'image/character/lvdai.jpg', - 'image/character/lvfan.jpg', - 'image/character/lvkai.jpg', - 'image/character/lvkuanglvxiang.jpg', - 'image/character/lvlingqi.jpg', - 'image/character/lvmeng.jpg', - 'image/character/lvqian.jpg', - 'image/character/machao.jpg', - 'image/character/macheng.jpg', - 'image/character/madai.jpg', - 'image/character/majun.jpg', - 'image/character/maliang.jpg', - 'image/character/mamian.jpg', - 'image/character/mamidi.jpg', - 'image/character/manchong.jpg', - 'image/character/mangyachang.jpg', - 'image/character/masu.jpg', - 'image/character/mateng.jpg', - 'image/character/maxiumatie.jpg', - 'image/character/mayuanyi.jpg', - 'image/character/mayunlu.jpg', - 'image/character/mazhong.jpg', - 'image/character/mb_sunluyu.jpg', - 'image/character/mengda.jpg', - 'image/character/menghuo.jpg', - 'image/character/mengjie.jpg', - 'image/character/mengyou.jpg', - 'image/character/mifangfushiren.jpg', - 'image/character/mifuren.jpg', - 'image/character/miheng.jpg', - 'image/character/mizhu.jpg', - 'image/character/mtg_ayeni.jpg', - 'image/character/mtg_jiding.jpg', - 'image/character/mtg_jiesi.jpg', - 'image/character/mtg_lilianna.jpg', - 'image/character/mtg_nisha.jpg', - 'image/character/mtg_qianzhuo.jpg', - 'image/character/mushun.jpg', - 'image/character/nanhualaoxian.jpg', - 'image/character/nashime.jpg', - 'image/character/new_caoren.jpg', - 'image/character/nianshou.jpg', - 'image/character/niufu.jpg', - 'image/character/niujin.jpg', - 'image/character/niutou.jpg', - 'image/character/noname.jpg', - 'image/character/noname_machao.png', - 'image/character/noname_sunce.png', - 'image/character/ns_caimao.jpg', - 'image/character/ns_caoanmin.jpg', - 'image/character/ns_caocao.jpg', - 'image/character/ns_caocaosp.jpg', - 'image/character/ns_caoshuang.jpg', - 'image/character/ns_chendao.jpg', - 'image/character/ns_chengpu.jpg', - 'image/character/ns_chentai.jpg', - 'image/character/ns_duangui.jpg', - 'image/character/ns_duji.jpg', - 'image/character/ns_fanchou.jpg', - 'image/character/ns_guanlu.jpg', - 'image/character/ns_huamulan.jpg', - 'image/character/ns_huangchengyan.jpg', - 'image/character/ns_huangwudie.jpg', - 'image/character/ns_huangzu.jpg', - 'image/character/ns_jiaxu.jpg', - 'image/character/ns_jinke.jpg', - 'image/character/ns_lijue.jpg', - 'image/character/ns_limi.jpg', - 'image/character/ns_lisu.jpg', - 'image/character/ns_liuzhang.jpg', - 'image/character/ns_luyusheng.jpg', - 'image/character/ns_lvmeng.jpg', - 'image/character/ns_lvzhi.jpg', - 'image/character/ns_masu.jpg', - 'image/character/ns_mengyou.jpg', - 'image/character/ns_nanhua.jpg', - 'image/character/ns_nanhua_left.jpg', - 'image/character/ns_nanhua_right.jpg', - 'image/character/ns_ruanji.jpg', - 'image/character/ns_shenpei.jpg', - 'image/character/ns_simazhao.jpg', - 'image/character/ns_sunchensunjun.jpg', - 'image/character/ns_sundeng.jpg', - 'image/character/ns_sunjian.jpg', - 'image/character/ns_sunyi.jpg', - 'image/character/ns_wangyue.jpg', - 'image/character/ns_wangyun.jpg', - 'image/character/ns_wenchou.jpg', - 'image/character/ns_xinnanhua.jpg', - 'image/character/ns_xinxianying.jpg', - 'image/character/ns_yanghu.jpg', - 'image/character/ns_yangyi.jpg', - 'image/character/ns_yanliang.jpg', - 'image/character/ns_yuanxi.jpg', - 'image/character/ns_yuji.jpg', - 'image/character/ns_yujisp.jpg', - 'image/character/ns_zanghong.jpg', - 'image/character/ns_zhangbao.jpg', - 'image/character/ns_zhangji.jpg', - 'image/character/ns_zhangning.jpg', - 'image/character/ns_zhangwei.jpg', - 'image/character/ns_zhangxiu.jpg', - 'image/character/ns_zhonglimu.jpg', - 'image/character/ns_zhugeliang.jpg', - 'image/character/ns_zuoci.jpg', - 'image/character/ol_bianfuren.jpg', - 'image/character/ol_caiwenji.jpg', - 'image/character/ol_chendeng.jpg', - 'image/character/ol_dengai.jpg', - 'image/character/ol_dengzhi.jpg', - 'image/character/ol_dianwei.jpg', - 'image/character/ol_dingshangwan.jpg', - 'image/character/ol_dingyuan.jpg', - 'image/character/ol_dongzhao.jpg', - 'image/character/ol_dongzhuo.jpg', - 'image/character/ol_furong.jpg', - 'image/character/ol_guohuai.jpg', - 'image/character/ol_huangzhong.jpg', - 'image/character/ol_huaxin.jpg', - 'image/character/ol_huaxiong.jpg', - 'image/character/ol_huban.jpg', - 'image/character/ol_jiangwei.jpg', - 'image/character/ol_lingtong.jpg', - 'image/character/ol_lisu.jpg', - 'image/character/ol_liuba.jpg', - 'image/character/ol_liushan.jpg', - 'image/character/ol_liuyu.jpg', - 'image/character/ol_liwan.jpg', - 'image/character/ol_lusu.jpg', - 'image/character/ol_luyusheng.jpg', - 'image/character/ol_maliang.jpg', - 'image/character/ol_mengda.jpg', - 'image/character/ol_pangde.jpg', - 'image/character/ol_pangtong.jpg', - 'image/character/ol_pengyang.jpg', - 'image/character/ol_puyuan.jpg', - 'image/character/ol_qianzhao.jpg', - 'image/character/ol_sp_zhugeliang.jpg', - 'image/character/ol_sunjian.jpg', - 'image/character/ol_wanglang.jpg', - 'image/character/ol_wangrong.jpg', - 'image/character/ol_weiyan.jpg', - 'image/character/ol_wenqin.jpg', - 'image/character/ol_xiahouyuan.jpg', - 'image/character/ol_xiaoqiao.jpg', - 'image/character/ol_xinxianying.jpg', - 'image/character/ol_xuhuang.jpg', - 'image/character/ol_xunyu.jpg', - 'image/character/ol_yangyi.jpg', - 'image/character/ol_yanwen.jpg', - 'image/character/ol_yuanshao.jpg', - 'image/character/ol_yuanshu.jpg', - 'image/character/ol_yujin.jpg', - 'image/character/ol_zhangchangpu.jpg', - 'image/character/ol_zhangliao.jpg', - '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_zhurong.jpg', - 'image/character/old_bulianshi.jpg', - 'image/character/old_caocao.jpg', - 'image/character/old_caochong.jpg', - 'image/character/old_caochun.jpg', - 'image/character/old_caoren.jpg', - 'image/character/old_caorui.jpg', - 'image/character/old_caoxiu.jpg', - 'image/character/old_caozhen.jpg', - 'image/character/old_chendao.jpg', - 'image/character/old_chenqun.jpg', - 'image/character/old_dingfeng.jpg', - 'image/character/old_fuhuanghou.jpg', - 'image/character/old_gaoshun.jpg', - 'image/character/old_guanqiujian.jpg', - 'image/character/old_guanyinping.jpg', - 'image/character/old_guanyu.jpg', - 'image/character/old_guanzhang.jpg', - 'image/character/old_handang.jpg', - 'image/character/old_huangfusong.jpg', - 'image/character/old_huanghao.jpg', - 'image/character/old_huatuo.jpg', - 'image/character/old_huaxiong.jpg', - 'image/character/old_jiakui.jpg', - 'image/character/old_lingju.jpg', - 'image/character/old_lingtong.jpg', - 'image/character/old_liubiao.jpg', - 'image/character/old_liuzan.jpg', - 'image/character/old_liyan.jpg', - 'image/character/old_machao.jpg', - 'image/character/old_madai.jpg', - 'image/character/old_majun.jpg', - 'image/character/old_maliang.jpg', - 'image/character/old_quancong.jpg', - 'image/character/old_re_lidian.jpg', - 'image/character/old_shen_zhaoyun.jpg', - 'image/character/old_shixie.jpg', - 'image/character/old_wanglang.jpg', - 'image/character/old_wangyi.jpg', - 'image/character/old_wangyun.jpg', - 'image/character/old_xiaoqiao.jpg', - 'image/character/old_xusheng.jpg', - 'image/character/old_yangyan.jpg', - 'image/character/old_yangzhi.jpg', - 'image/character/old_yuanshu.jpg', - 'image/character/old_zhangfei.jpg', - 'image/character/old_zhangxingcai.jpg', - 'image/character/old_zhaoyun.jpg', - 'image/character/old_zhonghui.jpg', - 'image/character/old_zhoutai.jpg', - 'image/character/old_zhugezhan.jpg', - 'image/character/old_zhuhuan.jpg', - 'image/character/old_zhuran.jpg', - 'image/character/old_zhuzhi.jpg', - 'image/character/oldre_liubiao.jpg', - 'image/character/ow_ana.jpg', - 'image/character/ow_banzang.jpg', - 'image/character/ow_baolei.jpg', - 'image/character/ow_chanyata.jpg', - 'image/character/ow_dva.jpg', - 'image/character/ow_falaozhiying.jpg', - 'image/character/ow_heibaihe.jpg', - 'image/character/ow_heiying.jpg', - 'image/character/ow_kuangshu.jpg', - 'image/character/ow_laiyinhate.jpg', - 'image/character/ow_liekong.jpg', - 'image/character/ow_luba.jpg', - 'image/character/ow_luxiao.jpg', - 'image/character/ow_maikelei.jpg', - 'image/character/ow_mei.jpg', - 'image/character/ow_orisa.jpg', - 'image/character/ow_shibing.jpg', - 'image/character/ow_sishen.jpg', - 'image/character/ow_tianshi.jpg', - 'image/character/ow_tuobiang.jpg', - 'image/character/ow_wensidun.jpg', - 'image/character/ow_yuanshi.jpg', - 'image/character/ow_zhaliya.jpg', - 'image/character/ow_zhixuzhiguang.jpg', - 'image/character/pal_anu.jpg', - 'image/character/pal_changqing.jpg', - 'image/character/pal_hanlingsha.jpg', - 'image/character/pal_jiangcheng.jpg', - 'image/character/pal_jiangyunfan.jpg', - 'image/character/pal_jingtian.jpg', - 'image/character/pal_jushifang.jpg', - 'image/character/pal_leiyuange.jpg', - 'image/character/pal_linyueru.jpg', - 'image/character/pal_liumengli.jpg', - 'image/character/pal_lixiaoyao.jpg', - 'image/character/pal_longkui.jpg', - 'image/character/pal_longkuigui.jpg', - 'image/character/pal_longyou.jpg', - 'image/character/pal_luozhaoyan.jpg', - 'image/character/pal_mingxiu.jpg', - 'image/character/pal_muchanglan.jpg', - 'image/character/pal_murongziying.jpg', - 'image/character/pal_nangonghuang.jpg', - 'image/character/pal_shenqishuang.jpg', - 'image/character/pal_sumei.jpg', - 'image/character/pal_tangyurou.jpg', - 'image/character/pal_wangpengxu.jpg', - 'image/character/pal_wangxiaohu.jpg', - 'image/character/pal_wenhui.jpg', - 'image/character/pal_xia.jpg', - 'image/character/pal_xiahoujinxuan.jpg', - 'image/character/pal_xianqing.jpg', - 'image/character/pal_xiaoman.jpg', - 'image/character/pal_xingxuan.jpg', - 'image/character/pal_xuanxiao.jpg', - 'image/character/pal_xuejian.jpg', - 'image/character/pal_yuejinzhao.jpg', - 'image/character/pal_yueqi.jpg', - 'image/character/pal_yuntianhe.jpg', - 'image/character/pal_zhaoliner.jpg', - 'image/character/pal_zixuan.jpg', - 'image/character/panfeng.jpg', - 'image/character/pangde.jpg', - 'image/character/pangdegong.jpg', - 'image/character/panghui.jpg', - 'image/character/pangtong.jpg', - 'image/character/panjun.jpg', - 'image/character/panshu.jpg', - 'image/character/panzhangmazhong.jpg', - 'image/character/pe_mengda.jpg', - 'image/character/pe_sunchen.jpg', - 'image/character/pe_wangyun.jpg', - 'image/character/pe_wenqin.jpg', - 'image/character/pe_zhonghui.jpg', - 'image/character/peixiu.jpg', - 'image/character/peiyuanshao.jpg', - 'image/character/pengyang.jpg', - 'image/character/pk_sp_duyu.jpg', - 'image/character/prp_zhugeliang.jpg', - 'image/character/ps_caopi.jpg', - 'image/character/ps_caozhi.jpg', - 'image/character/ps_guanyu.jpg', - 'image/character/ps_jiaxu.jpg', - 'image/character/ps_jin_simayi.jpg', - 'image/character/ps_lvbu.jpg', - 'image/character/ps_machao.jpg', - 'image/character/ps_shen_machao.jpg', - 'image/character/ps_simayi.jpg', - 'image/character/ps_zhugeliang.jpg', - 'image/character/ps1059_guojia.jpg', - 'image/character/ps1062_zhouyu.jpg', - 'image/character/ps2063_zhaoyun.jpg', - 'image/character/ps2066_zhugeliang.jpg', - 'image/character/ps2067_zhaoyun.jpg', - 'image/character/ps2068_simayi.jpg', - 'image/character/ps2070_guojia.jpg', - 'image/character/ps2080_zhouyu.jpg', - 'image/character/pujing.jpg', - 'image/character/puyuan.jpg', - 'image/character/qianzhao.jpg', - 'image/character/qiaogong.jpg', - 'image/character/qiaorui.jpg', - 'image/character/qiaozhou.jpg', - 'image/character/qinghegongzhu.jpg', - 'image/character/qinlang.jpg', - 'image/character/qinmi.jpg', - 'image/character/qinyilu.jpg', - 'image/character/qiuliju.jpg', - 'image/character/quancong.jpg', - 'image/character/quanhuijie.jpg', - 'image/character/quhuang.jpg', - 'image/character/quyi.jpg', - 'image/character/re_baosanniang.jpg', - 'image/character/re_bulianshi.jpg', - 'image/character/re_caifuren.jpg', - 'image/character/re_caiwenji.jpg', - 'image/character/re_caiyong.jpg', - 'image/character/re_caocao.jpg', - 'image/character/re_caochong.jpg', - 'image/character/re_caopi.jpg', - 'image/character/re_caoxiu.jpg', - 'image/character/re_caozhang.jpg', - 'image/character/re_caozhen.jpg', - 'image/character/re_caozhi.jpg', - 'image/character/re_chendeng.jpg', - 'image/character/re_chengong.jpg', - 'image/character/re_chengpu.jpg', - 'image/character/re_chenqun.jpg', - 'image/character/re_chunyuqiong.jpg', - 'image/character/re_daqiao.jpg', - 'image/character/re_dengai.jpg', - 'image/character/re_dengzhi.jpg', - 'image/character/re_dianwei.jpg', - 'image/character/re_diaochan.jpg', - 'image/character/re_dongbai.jpg', - 'image/character/re_dongcheng.jpg', - 'image/character/re_dongzhuo.jpg', - 'image/character/re_duji.jpg', - 'image/character/re_fazheng.jpg', - 'image/character/re_fengfangnv.jpg', - 'image/character/re_fuhuanghou.jpg', - 'image/character/re_ganning.jpg', - 'image/character/re_gaoshun.jpg', - 'image/character/re_gongsunyuan.jpg', - 'image/character/re_gongsunzan.jpg', - 'image/character/re_guanping.jpg', - 'image/character/re_guanqiujian.jpg', - 'image/character/re_guanyu.jpg', - 'image/character/re_guanzhang.jpg', - 'image/character/re_guohuai.jpg', - 'image/character/re_guohuanghou.jpg', - 'image/character/re_guojia.jpg', - 'image/character/re_guotufengji.jpg', - 'image/character/re_guyong.jpg', - 'image/character/re_handang.jpg', - 'image/character/re_hanhaoshihuan.jpg', - 'image/character/re_hansui.jpg', - 'image/character/re_hejin.jpg', - 'image/character/re_heqi.jpg', - 'image/character/re_huanggai.jpg', - 'image/character/re_huangyueying.jpg', - 'image/character/re_huangzhong.jpg', - 'image/character/re_huatuo.jpg', - 'image/character/re_huaxiong.jpg', - 'image/character/re_hucheer.jpg', - 'image/character/re_jiangwei.jpg', - 'image/character/re_jianyong.jpg', - 'image/character/re_jiaxu.jpg', - 'image/character/re_jikang.jpg', - 'image/character/re_jsp_huangyueying.jpg', - 'image/character/re_jsp_pangtong.jpg', - 'image/character/re_jushou.jpg', - 'image/character/re_kanze.jpg', - 'image/character/re_liaohua.jpg', - 'image/character/re_lidian.jpg', - 'image/character/re_lingtong.jpg', - 'image/character/re_liru.jpg', - 'image/character/re_liubei.jpg', - 'image/character/re_liubiao.jpg', - 'image/character/re_liuchen.jpg', - 'image/character/re_liufeng.jpg', - 'image/character/re_liushan.jpg', - 'image/character/re_liuzan.jpg', - 'image/character/re_lusu.jpg', - 'image/character/re_luxun.jpg', - 'image/character/re_lvbu.jpg', - 'image/character/re_lvmeng.jpg', - 'image/character/re_machao.jpg', - 'image/character/re_madai.jpg', - 'image/character/re_maliang.jpg', - 'image/character/re_manchong.jpg', - 'image/character/re_masu.jpg', - 'image/character/re_mazhong.jpg', - 'image/character/re_menghuo.jpg', - 'image/character/re_miheng.jpg', - 'image/character/re_nanhualaoxian.jpg', - 'image/character/re_niujin.jpg', - 'image/character/re_panfeng.jpg', - 'image/character/re_pangde.jpg', - 'image/character/re_pangdegong.jpg', - 'image/character/re_pangtong.jpg', - 'image/character/re_panshu.jpg', - 'image/character/re_panzhangmazhong.jpg', - 'image/character/re_quancong.jpg', - 'image/character/re_quyi.jpg', - 'image/character/re_simayi.jpg', - 'image/character/re_sp_taishici.jpg', - 'image/character/re_sp_zhugeliang.jpg', - 'image/character/re_sunben.jpg', - 'image/character/re_sunce.jpg', - 'image/character/re_sundeng.jpg', - 'image/character/re_sunjian.jpg', - 'image/character/re_sunluban.jpg', - 'image/character/re_sunluyu.jpg', - 'image/character/re_sunquan.jpg', - 'image/character/re_sunshangxiang.jpg', - 'image/character/re_sunxiu.jpg', - 'image/character/re_sunyi.jpg', - 'image/character/re_taishici.jpg', - 'image/character/re_taoqian.jpg', - 'image/character/re_wangyi.jpg', - 'image/character/re_wangyun.jpg', - 'image/character/re_weiwenzhugezhi.jpg', - 'image/character/re_weiyan.jpg', - 'image/character/re_wenpin.jpg', - 'image/character/re_wuguotai.jpg', - 'image/character/re_wuyi.jpg', - 'image/character/re_xiahoudun.jpg', - 'image/character/re_xiahoushi.jpg', - 'image/character/re_xiahouyuan.jpg', - 'image/character/re_xiaoqiao.jpg', - 'image/character/re_xinxianying.jpg', - 'image/character/re_xugong.jpg', - 'image/character/re_xuhuang.jpg', - 'image/character/re_xunchen.jpg', - 'image/character/re_xunyou.jpg', - 'image/character/re_xunyu.jpg', - 'image/character/re_xusheng.jpg', - 'image/character/re_xushu.jpg', - 'image/character/re_xuzhu.jpg', - 'image/character/re_yanwen.jpg', - 'image/character/re_yuanshao.jpg', - 'image/character/re_yuanshu.jpg', - 'image/character/re_yufan.jpg', - 'image/character/re_yuji.jpg', - 'image/character/re_yujin.jpg', - 'image/character/re_zhangbao.jpg', - 'image/character/re_zhangchunhua.jpg', - 'image/character/re_zhangfei.jpg', - 'image/character/re_zhanggong.jpg', - 'image/character/re_zhanghe.jpg', - 'image/character/re_zhangjiao.jpg', - 'image/character/re_zhangliang.jpg', - 'image/character/re_zhangliao.jpg', - 'image/character/re_zhangsong.jpg', - 'image/character/re_zhangyi.jpg', - 'image/character/re_zhangzhang.jpg', - 'image/character/re_zhaoyun.jpg', - 'image/character/re_zhenji.jpg', - 'image/character/re_zhonghui.jpg', - 'image/character/re_zhongyao.jpg', - 'image/character/re_zhoucang.jpg', - 'image/character/re_zhouyu.jpg', - 'image/character/re_zhugeliang.jpg', - 'image/character/re_zhuhuan.jpg', - 'image/character/re_zhuran.jpg', - 'image/character/re_zhurong.jpg', - 'image/character/re_zhuzhi.jpg', - 'image/character/re_zoushi.jpg', - 'image/character/re_zuoci.jpg', - 'image/character/ruanhui.jpg', - 'image/character/ruanji.jpg', - 'image/character/ruanyu.jpg', - 'image/character/ruiji.jpg', - 'image/character/sb_caocao.jpg', - 'image/character/sb_caoren.jpg', - 'image/character/sb_chengong.jpg', - 'image/character/sb_daqiao.jpg', - 'image/character/sb_diaochan.jpg', - 'image/character/sb_fazheng.jpg', - 'image/character/sb_ganning.jpg', - 'image/character/sb_huanggai.jpg', - 'image/character/sb_huangzhong.jpg', - 'image/character/sb_huaxiong.jpg', - 'image/character/sb_jiangwei.jpg', - 'image/character/sb_liubei.jpg', - 'image/character/sb_liubiao.jpg', - 'image/character/sb_lvmeng.jpg', - 'image/character/sb_machao.jpg', - 'image/character/sb_menghuo.jpg', - 'image/character/sb_pangtong.jpg', - 'image/character/sb_sunce.jpg', - 'image/character/sb_sunquan.jpg', - 'image/character/sb_sunshangxiang.jpg', - 'image/character/sb_xiahoushi.jpg', - 'image/character/sb_xuhuang.jpg', - 'image/character/sb_yuanshao.jpg', - 'image/character/sb_yujin.jpg', - 'image/character/sb_zhangfei.jpg', - 'image/character/sb_zhanghe.jpg', - 'image/character/sb_zhangjiao.jpg', - 'image/character/sb_zhaoyun.jpg', - 'image/character/sb_zhenji.jpg', - 'image/character/sb_zhouyu.jpg', - 'image/character/sb_zhurong.jpg', - 'image/character/scs_bilan.jpg', - 'image/character/scs_bilan_dead.jpg', - 'image/character/scs_duangui.jpg', - 'image/character/scs_duangui_dead.jpg', - 'image/character/scs_gaowang.jpg', - 'image/character/scs_gaowang_dead.jpg', - 'image/character/scs_guosheng.jpg', - 'image/character/scs_guosheng_dead.jpg', - 'image/character/scs_hankui.jpg', - 'image/character/scs_hankui_dead.jpg', - 'image/character/scs_lisong.jpg', - 'image/character/scs_lisong_dead.jpg', - 'image/character/scs_sunzhang.jpg', - 'image/character/scs_sunzhang_dead.jpg', - 'image/character/scs_xiayun.jpg', - 'image/character/scs_xiayun_dead.jpg', - 'image/character/scs_zhangrang.jpg', - 'image/character/scs_zhangrang_dead.jpg', - 'image/character/scs_zhaozhong.jpg', - 'image/character/scs_zhaozhong_dead.jpg', - 'image/character/shamoke.jpg', - 'image/character/shen_caocao.jpg', - 'image/character/shen_caopi.jpg', - 'image/character/shen_dengai.jpg', - 'image/character/shen_dianwei.jpg', - 'image/character/shen_diaochan.jpg', - 'image/character/shen_ganning.jpg', - 'image/character/shen_guanyu.jpg', - 'image/character/shen_guojia.jpg', - 'image/character/shen_jiangwei.jpg', - 'image/character/shen_jiaxu.jpg', - 'image/character/shen_liubei.jpg', - 'image/character/shen_luxun.jpg', - 'image/character/shen_lvbu.jpg', - 'image/character/shen_lvmeng.jpg', - 'image/character/shen_machao.jpg', - 'image/character/shen_simayi.jpg', - 'image/character/shen_sunce.jpg', - 'image/character/shen_sunquan.jpg', - 'image/character/shen_taishici.jpg', - 'image/character/shen_xunyu.jpg', - 'image/character/shen_zhangfei.jpg', - 'image/character/shen_zhangjiao.jpg', - 'image/character/shen_zhangliao.jpg', - 'image/character/shen_zhaoyun.jpg', - 'image/character/shen_zhenji.jpg', - 'image/character/shen_zhouyu.jpg', - 'image/character/shen_zhugeliang.jpg', - 'image/character/shenpei.jpg', - 'image/character/shibao.jpg', - 'image/character/shibing1.jpg', - 'image/character/shibing2.jpg', - 'image/character/shichangshi.jpg', - 'image/character/shichangshi_dead.jpg', - 'image/character/shixie.jpg', - 'image/character/shiyi.jpg', - 'image/character/simafu.jpg', - 'image/character/simahui.jpg', - 'image/character/simalang.jpg', - 'image/character/simashi.jpg', - 'image/character/simayi.jpg', - 'image/character/simazhao.jpg', - 'image/character/simazhou.jpg', - 'image/character/sp_bianfuren.jpg', - 'image/character/sp_caiwenji.jpg', - 'image/character/sp_caoren.jpg', - 'image/character/sp_caosong.jpg', - 'image/character/sp_chendong.jpg', - 'image/character/sp_chenzhen.jpg', - 'image/character/sp_cuiyan.jpg', - 'image/character/sp_daqiao.jpg', - 'image/character/sp_diaochan.jpg', - 'image/character/sp_dongzhuo.jpg', - 'image/character/sp_duyu.jpg', - 'image/character/sp_fuhuanghou.jpg', - 'image/character/sp_fuwan.jpg', - 'image/character/sp_ganning.jpg', - 'image/character/sp_gaolan.jpg', - 'image/character/sp_gongsunzan.jpg', - 'image/character/sp_huaman.jpg', - 'image/character/sp_huangfusong.jpg', - 'image/character/sp_huaxin.jpg', - 'image/character/sp_jianggan.jpg', - 'image/character/sp_jiangqing.jpg', - 'image/character/sp_jiangwan.jpg', - 'image/character/sp_jiangwei.jpg', - 'image/character/sp_jiaxu.jpg', - 'image/character/sp_jiben.jpg', - 'image/character/sp_key_kanade.jpg', - 'image/character/sp_key_yuri.jpg', - 'image/character/sp_kongrong.jpg', - 'image/character/sp_liubei.jpg', - 'image/character/sp_liuqi.jpg', - 'image/character/sp_liuxie.jpg', - 'image/character/sp_lvfan.jpg', - 'image/character/sp_lvmeng.jpg', - 'image/character/sp_machao.jpg', - 'image/character/sp_maojie.jpg', - 'image/character/sp_menghuo.jpg', - 'image/character/sp_mifangfushiren.jpg', - 'image/character/sp_mifuren.jpg', - 'image/character/sp_mushun.jpg', - 'image/character/sp_ol_zhanghe.jpg', - 'image/character/sp_pangde.jpg', - 'image/character/sp_pangtong.jpg', - 'image/character/sp_pengyang.jpg', - 'image/character/sp_shenpei.jpg', - 'image/character/sp_simazhao.jpg', - 'image/character/sp_sufei.jpg', - 'image/character/sp_sunshangxiang.jpg', - 'image/character/sp_sunshao.jpg', - 'image/character/sp_taishici.jpg', - 'image/character/sp_wangcan.jpg', - 'image/character/sp_wangshuang.jpg', - 'image/character/sp_wangyuanji.jpg', - 'image/character/sp_xiahoudun.jpg', - 'image/character/sp_xiahoushi.jpg', - 'image/character/sp_xinpi.jpg', - 'image/character/sp_xinxianying.jpg', - 'image/character/sp_xujing.jpg', - 'image/character/sp_xunchen.jpg', - 'image/character/sp_xuyou.jpg', - 'image/character/sp_yanghu.jpg', - 'image/character/sp_yangwan.jpg', - 'image/character/sp_zhangchangpu.jpg', - 'image/character/sp_zhangfei.jpg', - 'image/character/sp_zhanghe.jpg', - 'image/character/sp_zhangjiao.jpg', - 'image/character/sp_zhangliao.jpg', - 'image/character/sp_zhangwen.jpg', - 'image/character/sp_zhaoyun.jpg', - 'image/character/sp_zhugeliang.jpg', - 'image/character/sp_zhujun.jpg', - 'image/character/sp_zongyu.jpg', - 'image/character/star_caoren.jpg', - 'image/character/std_panfeng.jpg', - 'image/character/sunce.jpg', - 'image/character/sunchen.jpg', - 'image/character/sundeng.jpg', - 'image/character/sunhanhua.jpg', - 'image/character/sunhao.jpg', - 'image/character/sunhong.jpg', - 'image/character/sunjian.jpg', - 'image/character/sunlang.jpg', - 'image/character/sunli.jpg', - 'image/character/sunliang.jpg', - 'image/character/sunlingluan.jpg', - 'image/character/sunluban.jpg', - 'image/character/sunluyu.jpg', - 'image/character/sunqian.jpg', - 'image/character/sunquan.jpg', - 'image/character/sunru.jpg', - 'image/character/sunshangxiang.jpg', - 'image/character/sunshao.jpg', - 'image/character/sunwukong.jpg', - 'image/character/sunxiu.jpg', - 'image/character/sunyang.jpg', - 'image/character/sunyi.jpg', - 'image/character/sunziliufang.jpg', - 'image/character/swd_anka.jpg', - 'image/character/swd_chenfu.jpg', - 'image/character/swd_chengyaojin.jpg', - 'image/character/swd_chenjingchou.jpg', - 'image/character/swd_cheyun.jpg', - 'image/character/swd_chunyuheng.jpg', - 'image/character/swd_duanmeng.jpg', - 'image/character/swd_duguningke.jpg', - 'image/character/swd_duopeng.jpg', - 'image/character/swd_fengtianling.jpg', - 'image/character/swd_fengyu.jpg', - 'image/character/swd_fu.jpg', - 'image/character/swd_fuyan.jpg', - 'image/character/swd_guyue.jpg', - 'image/character/swd_haidapang.jpg', - 'image/character/swd_hanlong.jpg', - 'image/character/swd_hanluo.jpg', - 'image/character/swd_hengai.jpg', - 'image/character/swd_huanglei.jpg', - 'image/character/swd_huanyuanzhi.jpg', - 'image/character/swd_huiyan.jpg', - 'image/character/swd_hupo.jpg', - 'image/character/swd_huyue.jpg', - 'image/character/swd_huzhongxian.jpg', - 'image/character/swd_jialanduo.jpg', - 'image/character/swd_jiangwu.jpg', - 'image/character/swd_jiangziya.jpg', - 'image/character/swd_jiliang.jpg', - 'image/character/swd_jipeng.jpg', - 'image/character/swd_jiting.jpg', - 'image/character/swd_jiuyou.jpg', - 'image/character/swd_kama.jpg', - 'image/character/swd_kangnalishi.jpg', - 'image/character/swd_kendi.jpg', - 'image/character/swd_lanmoshen.jpg', - 'image/character/swd_lanyin.jpg', - 'image/character/swd_lilian.jpg', - 'image/character/swd_linyue.jpg', - 'image/character/swd_luchengxuan.jpg', - 'image/character/swd_maixing.jpg', - 'image/character/swd_miles.jpg', - 'image/character/swd_moye.jpg', - 'image/character/swd_murongshi.jpg', - 'image/character/swd_muyue.jpg', - 'image/character/swd_muyun.jpg', - 'image/character/swd_nicole.jpg', - 'image/character/swd_qi.jpg', - 'image/character/swd_qiner.jpg', - 'image/character/swd_qinshubao.jpg', - 'image/character/swd_quxian.jpg', - 'image/character/swd_rongshuang.jpg', - 'image/character/swd_septem.jpg', - 'image/character/swd_shangzhang.jpg', - 'image/character/swd_shanxiaoxiao.jpg', - 'image/character/swd_shaowei.jpg', - 'image/character/swd_shuijing.jpg', - 'image/character/swd_shuwaner.jpg', - 'image/character/swd_sikongyu.jpg', - 'image/character/swd_situqiang.jpg', - 'image/character/swd_tuobayuer.jpg', - 'image/character/swd_tuwei.jpg', - 'image/character/swd_wangsiyue.jpg', - 'image/character/swd_weida.jpg', - 'image/character/swd_wushi.jpg', - 'image/character/swd_xiaohuanglong.jpg', - 'image/character/swd_xiarou.jpg', - 'image/character/swd_xiyan.jpg', - 'image/character/swd_xuanyuanjiantong.jpg', - 'image/character/swd_xuanyuanjianxian.jpg', - 'image/character/swd_yeyaxi.jpg', - 'image/character/swd_youzhao.jpg', - 'image/character/swd_yuchiyanhong.jpg', - 'image/character/swd_yuli.jpg', - 'image/character/swd_yunhu.jpg', - 'image/character/swd_yuwentuo.jpg', - 'image/character/swd_yuxiaoxue.jpg', - 'image/character/swd_zhanggao.jpg', - 'image/character/swd_zhaoyun.jpg', - 'image/character/swd_zhiyin.jpg', - 'image/character/swd_zhuoshanzhu.jpg', - 'image/character/swd_zidashu.jpg', - 'image/character/swd_ziqiao.jpg', - 'image/character/tadun.jpg', - 'image/character/taishici.jpg', - 'image/character/tangji.jpg', - 'image/character/tangzi.jpg', - 'image/character/taoqian.jpg', - 'image/character/taoshen.jpg', - 'image/character/tengfanglan.jpg', - 'image/character/tenggongzhu.jpg', - 'image/character/tengyin.jpg', - 'image/character/tianfeng.jpg', - 'image/character/tianyu.jpg', - 'image/character/tongyuan.jpg', - 'image/character/tw_baoxin.jpg', - 'image/character/tw_beimihu.jpg', - 'image/character/tw_bianfuren.jpg', - 'image/character/tw_bingyuan.jpg', - 'image/character/tw_caoang.jpg', - 'image/character/tw_caocao.jpg', - 'image/character/tw_caohong.jpg', - 'image/character/tw_caoxiu.jpg', - 'image/character/tw_caozhao.jpg', - 'image/character/tw_chendong.jpg', - 'image/character/tw_chengpu.jpg', - 'image/character/tw_chenzhen.jpg', - 'image/character/tw_daxiaoqiao.jpg', - 'image/character/tw_dengzhi.jpg', - 'image/character/tw_dingfeng.jpg', - 'image/character/tw_dongzhao.jpg', - 'image/character/tw_fanchou.jpg', - 'image/character/tw_feiyi.jpg', - 'image/character/tw_fengxí.jpg', - 'image/character/tw_furong.jpg', - 'image/character/tw_fuwan.jpg', - 'image/character/tw_gexuan.jpg', - 'image/character/tw_gongsunfan.jpg', - 'image/character/tw_guanqiujian.jpg', - 'image/character/tw_guohuai.jpg', - 'image/character/tw_guyong.jpg', - 'image/character/tw_handang.jpg', - 'image/character/tw_haomeng.jpg', - 'image/character/tw_hejin.jpg', - 'image/character/tw_hucheer.jpg', - 'image/character/tw_huchuquan.jpg', - 'image/character/tw_huojun.jpg', - 'image/character/tw_jiangji.jpg', - 'image/character/tw_jiangqing.jpg', - 'image/character/tw_jianshuo.jpg', - 'image/character/tw_jiling.jpg', - 'image/character/tw_liufuren.jpg', - 'image/character/tw_liuhong.jpg', - 'image/character/tw_liuzhang.jpg', - 'image/character/tw_liwei.jpg', - 'image/character/tw_madai.jpg', - 'image/character/tw_maliang.jpg', - 'image/character/tw_mateng.jpg', - 'image/character/tw_mayunlu.jpg', - 'image/character/tw_menghuo.jpg', - 'image/character/tw_niufudongxie.jpg', - 'image/character/tw_niujin.jpg', - 'image/character/tw_ol_sunjian.jpg', - 'image/character/tw_puyangxing.jpg', - 'image/character/tw_qiaogong.jpg', - 'image/character/tw_qiaorui.jpg', - 'image/character/tw_re_caohong.jpg', - 'image/character/tw_re_fazheng.jpg', - 'image/character/tw_shen_guanyu.jpg', - 'image/character/tw_shen_lvmeng.jpg', - 'image/character/tw_sunyi.jpg', - 'image/character/tw_tianyu.jpg', - 'image/character/tw_wangcan.jpg', - 'image/character/tw_wangchang.jpg', - 'image/character/tw_wangling.jpg', - 'image/character/tw_weixu.jpg', - 'image/character/tw_wujing.jpg', - 'image/character/tw_xiahouba.jpg', - 'image/character/tw_xiahouen.jpg', - 'image/character/tw_xiahoushang.jpg', - 'image/character/tw_xuezong.jpg', - 'image/character/tw_xujing.jpg', - 'image/character/tw_xunchen.jpg', - 'image/character/tw_yangang.jpg', - 'image/character/tw_yangyi.jpg', - 'image/character/tw_yanxiang.jpg', - 'image/character/tw_yl_luzhi.jpg', - 'image/character/tw_yufuluo.jpg', - 'image/character/tw_yujin.jpg', - 'image/character/tw_zangba.jpg', - 'image/character/tw_zhangfei.jpg', - 'image/character/tw_zhanghong.jpg', - 'image/character/tw_zhangji.jpg', - 'image/character/tw_zhangmancheng.jpg', - 'image/character/tw_zhangnan.jpg', - 'image/character/tw_zhangning.jpg', - 'image/character/tw_zhangzhao.jpg', - 'image/character/tw_zhaoxiang.jpg', - 'image/character/tw_zhouchu.jpg', - 'image/character/tw_zhugeguo.jpg', - 'image/character/tw_zongyu.jpg', - 'image/character/tw_zumao.jpg', - 'image/character/vtb_xiaojiu.jpg', - 'image/character/vtb_xiaole.jpg', - 'image/character/vtb_xiaosha.jpg', - 'image/character/vtb_xiaoshan.jpg', - 'image/character/vtb_xiaotao.jpg', - 'image/character/wangcan.jpg', - 'image/character/wangfuzhaolei.jpg', - 'image/character/wangguan.jpg', - 'image/character/wangji.jpg', - 'image/character/wangjun.jpg', - 'image/character/wanglang.jpg', - 'image/character/wanglie.jpg', - 'image/character/wangling.jpg', - 'image/character/wangping.jpg', - 'image/character/wangrong.jpg', - 'image/character/wangshuang.jpg', - 'image/character/wangtao.jpg', - 'image/character/wangwei.jpg', - 'image/character/wangxiang.jpg', - 'image/character/wangyan.jpg', - 'image/character/wangyi.jpg', - 'image/character/wangyuanji.jpg', - 'image/character/wangyue.jpg', - 'image/character/wangyun.jpg', - 'image/character/wanniangongzhu.jpg', - 'image/character/weiguan.jpg', - 'image/character/weiwenzhugezhi.jpg', - 'image/character/weiyan.jpg', - 'image/character/weizi.jpg', - 'image/character/wenpin.jpg', - 'image/character/wenqin.jpg', - 'image/character/wenyang.jpg', - 'image/character/wolongfengchu.jpg', - 'image/character/wu_luxun.jpg', - 'image/character/wu_zhugeliang.jpg', - 'image/character/wu_zhutiexiong.jpg', - 'image/character/wuanguo.jpg', - 'image/character/wuban.jpg', - 'image/character/wufan.jpg', - 'image/character/wuguotai.jpg', - 'image/character/wujing.jpg', - 'image/character/wulan.jpg', - 'image/character/wutugu.jpg', - 'image/character/wuxian.jpg', - 'image/character/wuyan.jpg', - 'image/character/wuyi.jpg', - 'image/character/xf_huangquan.jpg', - 'image/character/xf_sufei.jpg', - 'image/character/xf_tangzi.jpg', - 'image/character/xf_yiji.jpg', - 'image/character/xia_dianwei.jpg', - 'image/character/xia_liyàn.jpg', - 'image/character/xia_lusu.jpg', - 'image/character/xia_tongyuan.jpg', - 'image/character/xia_wangyue.jpg', - 'image/character/xia_xiahouzie.jpg', - 'image/character/xia_xushu.jpg', - 'image/character/xia_zhaoe.jpg', - 'image/character/xiahouba.jpg', - 'image/character/xiahoudun.jpg', - 'image/character/xiahoujie.jpg', - 'image/character/xiahoulingnv.jpg', - 'image/character/xiahoumao.jpg', - 'image/character/xiahoushi.jpg', - 'image/character/xiahouxuan.jpg', - 'image/character/xiahouyuan.jpg', - 'image/character/xiangchong.jpg', - 'image/character/xianglang.jpg', - 'image/character/xiaoqiao.jpg', - 'image/character/xiaoyuehankehan.jpg', - 'image/character/xielingyu.jpg', - 'image/character/xin_baosanniang.jpg', - 'image/character/xin_caifuren.jpg', - 'image/character/xin_caoxiu.jpg', - 'image/character/xin_caozhang.jpg', - 'image/character/xin_caozhen.jpg', - 'image/character/xin_chengpu.jpg', - 'image/character/xin_fazheng.jpg', - 'image/character/xin_fuhuanghou.jpg', - 'image/character/xin_gaoshun.jpg', - 'image/character/xin_gongsunzan.jpg', - 'image/character/xin_guohuai.jpg', - 'image/character/xin_guozhao.jpg', - 'image/character/xin_guyong.jpg', - 'image/character/xin_handang.jpg', - 'image/character/xin_hansui.jpg', - 'image/character/xin_jianyong.jpg', - 'image/character/xin_jushou.jpg', - 'image/character/xin_liaohua.jpg', - 'image/character/xin_lingtong.jpg', - 'image/character/xin_liru.jpg', - 'image/character/xin_liubiao.jpg', - 'image/character/xin_mamidi.jpg', - 'image/character/xin_masu.jpg', - 'image/character/xin_panzhangmazhong.jpg', - 'image/character/xin_quancong.jpg', - 'image/character/xin_sunliang.jpg', - 'image/character/xin_sunluban.jpg', - 'image/character/xin_sunxiu.jpg', - 'image/character/xin_wuguotai.jpg', - 'image/character/xin_wuyi.jpg', - 'image/character/xin_xiahoudun.jpg', - 'image/character/xin_xusheng.jpg', - 'image/character/xin_xushu.jpg', - 'image/character/xin_yuanshao.jpg', - 'image/character/xin_yufan.jpg', - 'image/character/xin_yuji.jpg', - 'image/character/xin_yujin.jpg', - 'image/character/xin_zhangfei.jpg', - 'image/character/xin_zhangyi.jpg', - 'image/character/xin_zhonghui.jpg', - 'image/character/xin_zhoucang.jpg', - 'image/character/xin_zhoutai.jpg', - 'image/character/xin_zhuhuan.jpg', - 'image/character/xin_zhuran.jpg', - 'image/character/xin_zhuzhi.jpg', - 'image/character/xinchang.jpg', - 'image/character/xingdaorong.jpg', - 'image/character/xinpi.jpg', - 'image/character/xinping.jpg', - 'image/character/xinxianying.jpg', - 'image/character/xizheng.jpg', - 'image/character/xizhicai.jpg', - 'image/character/xuangongzhu.jpg', - 'image/character/xuelingyun.jpg', - 'image/character/xuezong.jpg', - 'image/character/xugong.jpg', - 'image/character/xuhuang.jpg', - 'image/character/xujing.jpg', - 'image/character/xunchen.jpg', - 'image/character/xunyou.jpg', - 'image/character/xunyu.jpg', - 'image/character/xurong.jpg', - 'image/character/xushao.jpg', - 'image/character/xusheng.jpg', - 'image/character/xushi.jpg', - 'image/character/xushu.jpg', - 'image/character/xuyou.jpg', - 'image/character/xuzhu.jpg', - 'image/character/yanbaihu.jpg', - 'image/character/yanfuren.jpg', - 'image/character/yangbiao.jpg', - 'image/character/yangfu.jpg', - 'image/character/yanghong.jpg', - 'image/character/yanghuiyu.jpg', - 'image/character/yangwan.jpg', - 'image/character/yangxiu.jpg', - 'image/character/yangyan.jpg', - 'image/character/yangyi.jpg', - 'image/character/yangzhi.jpg', - 'image/character/yanjun.jpg', - 'image/character/yanpu.jpg', - 'image/character/yanrou.jpg', - 'image/character/yanwen.jpg', - 'image/character/yanyan.jpg', - 'image/character/yeshiwen.jpg', - 'image/character/yinfuren.jpg', - 'image/character/yj_caoang.jpg', - 'image/character/yj_caocao.jpg', - 'image/character/yj_caohong.jpg', - 'image/character/yj_dongzhuo.jpg', - 'image/character/yj_ganning.jpg', - 'image/character/yj_huangzhong.jpg', - 'image/character/yj_jiaxu.jpg', - 'image/character/yj_jushou.jpg', - 'image/character/yj_liru.jpg', - 'image/character/yj_qiaozhou.jpg', - 'image/character/yj_sufei.jpg', - 'image/character/yj_weiyan.jpg', - 'image/character/yj_xuhuang.jpg', - 'image/character/yj_xuyou.jpg', - 'image/character/yj_zhangfei.jpg', - 'image/character/yj_zhanghe.jpg', - 'image/character/yj_zhangliao.jpg', - 'image/character/yj_zhenji.jpg', - 'image/character/yj_zhoubuyi.jpg', - 'image/character/yl_luzhi.jpg', - 'image/character/yl_yuanshu.jpg', - 'image/character/yongjian_ganning.jpg', - 'image/character/yuanhuan.jpg', - 'image/character/yuanji.jpg', - 'image/character/yuanshu.jpg', - 'image/character/yuantanyuanshang.jpg', - 'image/character/yuantanyuanxiyuanshang.jpg', - 'image/character/yue_caiwenji.jpg', - 'image/character/yue_zhoufei.jpg', - 'image/character/yuechen.jpg', - 'image/character/yuejin.jpg', - 'image/character/yuejiu.jpg', - 'image/character/yufan.jpg', - 'image/character/yuji.jpg', - 'image/character/yujin.jpg', - 'image/character/yujin_yujin.jpg', - 'image/character/yxs_aijiyanhou.jpg', - 'image/character/yxs_baosi.jpg', - 'image/character/yxs_bole.jpg', - 'image/character/yxs_caocao.jpg', - 'image/character/yxs_chengjisihan.jpg', - 'image/character/yxs_chengyaojin.jpg', - 'image/character/yxs_diaochan.jpg', - 'image/character/yxs_direnjie.jpg', - 'image/character/yxs_fuermosi.jpg', - 'image/character/yxs_goujian.jpg', - 'image/character/yxs_guiguzi.jpg', - 'image/character/yxs_handingdun.jpg', - 'image/character/yxs_huamulan.jpg', - 'image/character/yxs_jinke.jpg', - 'image/character/yxs_kaisa.jpg', - 'image/character/yxs_lanlinwang.jpg', - 'image/character/yxs_libai.jpg', - 'image/character/yxs_lishimin.jpg', - 'image/character/yxs_luban.jpg', - 'image/character/yxs_luobinhan.jpg', - 'image/character/yxs_luocheng.jpg', - 'image/character/yxs_luzhishen.jpg', - 'image/character/yxs_lvzhi.jpg', - 'image/character/yxs_meixi.jpg', - 'image/character/yxs_mingchenghuanghou.jpg', - 'image/character/yxs_mozi.jpg', - 'image/character/yxs_nandinggeer.jpg', - 'image/character/yxs_napolun.jpg', - 'image/character/yxs_qinqiong.jpg', - 'image/character/yxs_sunwu.jpg', - 'image/character/yxs_tangbohu.jpg', - 'image/character/yxs_wangzhaojun.jpg', - 'image/character/yxs_weizhongxian.jpg', - 'image/character/yxs_wuzetian.jpg', - 'image/character/yxs_xiangyu.jpg', - 'image/character/yxs_xiaoqiao.jpg', - 'image/character/yxs_yangguang.jpg', - 'image/character/yxs_yangyuhuan.jpg', - 'image/character/yxs_yingzheng.jpg', - 'image/character/yxs_yuefei.jpg', - 'image/character/yxs_yujix.jpg', - 'image/character/yxs_zhangsanfeng.jpg', - 'image/character/yxs_zhaoyong.jpg', - 'image/character/yxs_zhuyuanzhang.jpg', - 'image/character/zangba.jpg', - 'image/character/zerong.jpg', - 'image/character/zhangbao.jpg', - 'image/character/zhangchangpu.jpg', - 'image/character/zhangchu.jpg', - 'image/character/zhangchunhua.jpg', - 'image/character/zhangfei.jpg', - 'image/character/zhangfen.jpg', - 'image/character/zhanggong.jpg', - 'image/character/zhanghe.jpg', - 'image/character/zhangheng.jpg', - 'image/character/zhanghu.jpg', - 'image/character/zhanghua.jpg', - 'image/character/zhanghuyuechen.jpg', - 'image/character/zhangji.jpg', - 'image/character/zhangjiao.jpg', - 'image/character/zhangjinyun.jpg', - 'image/character/zhangkai.jpg', - 'image/character/zhangliang.jpg', - 'image/character/zhangliao.jpg', - 'image/character/zhangling.jpg', - 'image/character/zhanglu.jpg', - 'image/character/zhangmiao.jpg', - 'image/character/zhangning.jpg', - 'image/character/zhangqiying.jpg', - 'image/character/zhangrang.jpg', - 'image/character/zhangren.jpg', - 'image/character/zhangshiping.jpg', - 'image/character/zhangsong.jpg', - 'image/character/zhangwen.jpg', - 'image/character/zhangxingcai.jpg', - 'image/character/zhangxiu.jpg', - 'image/character/zhangxuan.jpg', - 'image/character/zhangxun.jpg', - 'image/character/zhangyan.jpg', - 'image/character/zhangyao.jpg', - 'image/character/zhangyi.jpg', - 'image/character/zhangyì.jpg', - 'image/character/zhangzhang.jpg', - 'image/character/zhangzhi.jpg', - 'image/character/zhangzhongjing.jpg', - 'image/character/zhaoang.jpg', - 'image/character/zhaotongzhaoguang.jpg', - 'image/character/zhaoxiang.jpg', - 'image/character/zhaoyan.jpg', - 'image/character/zhaoyǎn.jpg', - 'image/character/zhaoyun.jpg', - 'image/character/zhaozhi.jpg', - 'image/character/zhaozhong.jpg', - 'image/character/zhenghun.jpg', - 'image/character/zhengxuan.jpg', - 'image/character/zhenji.jpg', - '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', - 'image/character/zhoufei.jpg', - 'image/character/zhouqun.jpg', - 'image/character/zhoushan.jpg', - 'image/character/zhoutai.jpg', - 'image/character/zhouyi.jpg', - 'image/character/zhouyu.jpg', - 'image/character/zhugedan.jpg', - 'image/character/zhugeguo.jpg', - 'image/character/zhugejin.jpg', - 'image/character/zhugeke.jpg', - 'image/character/zhugeliang.jpg', - 'image/character/zhugeshang.jpg', - 'image/character/zhugezhan.jpg', - 'image/character/zhuhuan.jpg', - 'image/character/zhujianping.jpg', - 'image/character/zhujun.jpg', - 'image/character/zhuling.jpg', - 'image/character/zhuran.jpg', - 'image/character/zhurong.jpg', - 'image/character/zhutiexiong.jpg', - 'image/character/zhuzhi.jpg', - 'image/character/zongyu.jpg', - 'image/character/zoushi.jpg', - 'image/character/zumao.jpg', - 'image/character/zuoci.jpg', - 'image/character/zuofen.jpg', + 'image/card/ahuinan.jpg', + 'image/card/baiwuchang.jpg', + 'image/card/baosanniang.jpg', + 'image/card/baoxin.jpg', + 'image/card/beimihu.jpg', + 'image/card/bianfuren.jpg', + 'image/card/bianxi.jpg', + 'image/card/boss_zhaoyun.jpg', + 'image/card/bulianshi.jpg', + 'image/card/buzhi.jpg', + 'image/card/caifuren.jpg', + 'image/card/caimaozhangyun.jpg', + 'image/card/caiwenji.jpg', + 'image/card/caiyang.jpg', + 'image/card/caiyong.jpg', + 'image/card/caizhenji.jpg', + 'image/card/caoang.jpg', + 'image/card/caoanmin.jpg', + 'image/card/caobuxing.jpg', + 'image/card/caocao.jpg', + 'image/card/caochong.jpg', + 'image/card/caochun.jpg', + 'image/card/caohong.jpg', + 'image/card/caohua.jpg', + 'image/card/caojie.jpg', + 'image/card/caojinyu.jpg', + 'image/card/caomao.jpg', + 'image/card/caopi.jpg', + 'image/card/caoren.jpg', + 'image/card/caorui.jpg', + 'image/card/caoshuang.jpg', + 'image/card/caosong.jpg', + 'image/card/caoxi.jpg', + 'image/card/caoxiancaohua.jpg', + 'image/card/caoxing.jpg', + 'image/card/caoxiu.jpg', + 'image/card/caoying.jpg', + 'image/card/caozhang.jpg', + 'image/card/caozhen.jpg', + 'image/card/caozhi.jpg', + 'image/card/cenhun.jpg', + 'image/card/cheliji.jpg', + 'image/card/chendao.jpg', + 'image/card/chendeng.jpg', + 'image/card/chendong.jpg', + 'image/card/chengbing.jpg', + 'image/card/chengjichengcui.jpg', + 'image/card/chengong.jpg', + 'image/card/chengpu.jpg', + 'image/card/chengui.jpg', + 'image/card/chengyu.jpg', + 'image/card/chenjiao.jpg', + 'image/card/chenlin.jpg', + 'image/card/chenqun.jpg', + 'image/card/chenshi.jpg', + 'image/card/chentai.jpg', + 'image/card/chunyuqiong.jpg', + 'image/card/clan_hanrong.jpg', + 'image/card/clan_hanshao.jpg', + 'image/card/clan_wanghun.jpg', + 'image/card/clan_wangling.jpg', + 'image/card/clan_wanglun.jpg', + 'image/card/clan_wangyun.jpg', + 'image/card/clan_wuban.jpg', + 'image/card/clan_wukuang.jpg', + 'image/card/clan_wuxian.jpg', + 'image/card/clan_xuncai.jpg', + 'image/card/clan_xuncan.jpg', + 'image/card/clan_xunchen.jpg', + 'image/card/clan_xunshu.jpg', + 'image/card/clan_xunyou.jpg', + 'image/card/clan_zhonghui.jpg', + 'image/card/clan_zhongyan.jpg', + 'image/card/clan_zhongyu.jpg', + 'image/card/cuimao.jpg', + 'image/card/cuiyan.jpg', + 'image/card/daqiao.jpg', + 'image/card/daxiaoqiao.jpg', + 'image/card/db_key_hina.jpg', + 'image/card/db_key_liyingxia.jpg', + 'image/card/db_wenyang.jpg', + 'image/card/dc_bulianshi.jpg', + 'image/card/dc_caiyang.jpg', + 'image/card/dc_caocao.jpg', + 'image/card/dc_caozhi.jpg', + 'image/card/dc_chenqun.jpg', + 'image/card/dc_daxiaoqiao.jpg', + 'image/card/dc_dongzhao.jpg', + 'image/card/dc_duyu.jpg', + 'image/card/dc_fuwan.jpg', + 'image/card/dc_ganfuren.jpg', + 'image/card/dc_gaolan.jpg', + 'image/card/dc_gongsunzan.jpg', + 'image/card/dc_guansuo.jpg', + 'image/card/dc_huangchengyan.jpg', + 'image/card/dc_huanghao.jpg', + 'image/card/dc_huangquan.jpg', + 'image/card/dc_huangzu.jpg', + 'image/card/dc_huban.jpg', + 'image/card/dc_hujinding.jpg', + 'image/card/dc_huojun.jpg', + 'image/card/dc_jiachong.jpg', + 'image/card/dc_jiben.jpg', + 'image/card/dc_jikang.jpg', + 'image/card/dc_jiling.jpg', + 'image/card/dc_jsp_guanyu.jpg', + 'image/card/dc_liru.jpg', + 'image/card/dc_liuba.jpg', + 'image/card/dc_liubei.jpg', + 'image/card/dc_liuye.jpg', + 'image/card/dc_liuyu.jpg', + 'image/card/dc_luotong.jpg', + 'image/card/dc_lvkuanglvxiang.jpg', + 'image/card/dc_mengda.jpg', + 'image/card/dc_mifuren.jpg', + 'image/card/dc_ruiji.jpg', + 'image/card/dc_shixie.jpg', + 'image/card/dc_sp_jiaxu.jpg', + 'image/card/dc_sp_machao.jpg', + 'image/card/dc_sunhanhua.jpg', + 'image/card/dc_sunquan.jpg', + 'image/card/dc_sunru.jpg', + 'image/card/dc_sunziliufang.jpg', + 'image/card/dc_tengfanglan.jpg', + 'image/card/dc_wangchang.jpg', + 'image/card/dc_wangjun.jpg', + 'image/card/dc_wangyun.jpg', + 'image/card/dc_wuban.jpg', + 'image/card/dc_xiahouba.jpg', + 'image/card/dc_xujing.jpg', + 'image/card/dc_xushu.jpg', + 'image/card/dc_yangbiao.jpg', + 'image/card/dc_yanghu.jpg', + 'image/card/dc_yuejiu.jpg', + 'image/card/dc_zhangmancheng.jpg', + 'image/card/dc_zhaotongzhaoguang.jpg', + 'image/card/dc_zhaoxiang.jpg', + 'image/card/dc_zhaoyǎn.jpg', + 'image/card/dc_zhouxuān.jpg', + 'image/card/dc_zhuling.jpg', + 'image/card/ddd_baosanniang.jpg', + 'image/card/ddd_caomao.jpg', + 'image/card/ddd_caoshuang.jpg', + 'image/card/ddd_dingfeng.jpg', + 'image/card/ddd_guanning.jpg', + 'image/card/ddd_handang.jpg', + 'image/card/ddd_jianshuo.jpg', + 'image/card/ddd_kebineng.jpg', + 'image/card/ddd_liangxi.jpg', + 'image/card/ddd_lie.jpg', + 'image/card/ddd_liuba.jpg', + 'image/card/ddd_liuhong.jpg', + 'image/card/ddd_liuye.jpg', + 'image/card/ddd_sunliang.jpg', + 'image/card/ddd_wangkanglvkai.jpg', + 'image/card/ddd_wuzhi.jpg', + 'image/card/ddd_xiahouxuan.jpg', + 'image/card/ddd_xianglang.jpg', + 'image/card/ddd_xinxianying.jpg', + 'image/card/ddd_xuelingyun.jpg', + 'image/card/ddd_xujing.jpg', + 'image/card/ddd_yujin.jpg', + 'image/card/ddd_zhangkai.jpg', + 'image/card/ddd_zhaoang.jpg', + 'image/card/ddd_zhenji.jpg', + 'image/card/ddd_zhouchu.jpg', + 'image/card/default_silhouette_female.jpg', + 'image/card/default_silhouette_male.jpg', + 'image/card/dengai.jpg', + 'image/card/dengzhi.jpg', + 'image/card/dengzhong.jpg', + 'image/card/dianwei.jpg', + 'image/card/diaochan.jpg', + 'image/card/dingfeng.jpg', + 'image/card/dingshangwan.jpg', + 'image/card/dingyuan.jpg', + 'image/card/diy_caiwenji.jpg', + 'image/card/diy_feishi.jpg', + 'image/card/diy_hanlong.jpg', + 'image/card/diy_huangzhong.jpg', + 'image/card/diy_liufu.jpg', + 'image/card/diy_liuyan.jpg', + 'image/card/diy_liuzan.jpg', + 'image/card/diy_lukang.jpg', + 'image/card/diy_menghuo.jpg', + 'image/card/diy_tianyu.jpg', + 'image/card/diy_weiyan.jpg', + 'image/card/diy_wenyang.jpg', + 'image/card/diy_xizhenxihong.jpg', + 'image/card/diy_xuhuang.jpg', + 'image/card/diy_yangyi.jpg', + 'image/card/diy_yuji.jpg', + 'image/card/diy_zaozhirenjun.jpg', + 'image/card/diy_zhenji.jpg', + 'image/card/diy_zhouyu.jpg', + 'image/card/dongbai.jpg', + 'image/card/dongcheng.jpg', + 'image/card/dongguiren.jpg', + 'image/card/dongtuna.jpg', + 'image/card/dongwan.jpg', + 'image/card/dongxie.jpg', + 'image/card/dongyun.jpg', + 'image/card/dongzhao.jpg', + 'image/card/dongzhuo.jpg', + 'image/card/duanjiong.jpg', + 'image/card/duanqiaoxiao.jpg', + 'image/card/duanwei.jpg', + 'image/card/dufuren.jpg', + 'image/card/duji.jpg', + 'image/card/dukui.jpg', + 'image/card/duosidawang.jpg', + 'image/card/duxi.jpg', + 'image/card/duyu.jpg', + 'image/card/fanchou.jpg', + 'image/card/fanjiangzhangda.jpg', + 'image/card/fanyufeng.jpg', + 'image/card/fazheng.jpg', + 'image/card/feiyao.jpg', + 'image/card/feiyi.jpg', + 'image/card/fengfang.jpg', + 'image/card/fengfangnv.jpg', + 'image/card/fengxi.jpg', + 'image/card/fuhuanghou.jpg', + 'image/card/fuqian.jpg', + 'image/card/furong.jpg', + 'image/card/furongfuqian.jpg', + 'image/card/fuwan.jpg', + 'image/card/ganfuren.jpg', + 'image/card/ganfurenmifuren.jpg', + 'image/card/ganning.jpg', + 'image/card/gaogan.jpg', + 'image/card/gaolan.jpg', + 'image/card/gaoshun.jpg', + 'image/card/gaoxiang.jpg', + 'image/card/gexuan.jpg', + 'image/card/gjqt_aruan.jpg', + 'image/card/gjqt_bailitusu.jpg', + 'image/card/gjqt_beiluo.jpg', + 'image/card/gjqt_cenying.jpg', + 'image/card/gjqt_chuqi.jpg', + 'image/card/gjqt_fanglansheng.jpg', + 'image/card/gjqt_fengqingxue.jpg', + 'image/card/gjqt_hongyu.jpg', + 'image/card/gjqt_ouyangshaogong.jpg', + 'image/card/gjqt_wenrenyu.jpg', + 'image/card/gjqt_xiangling.jpg', + 'image/card/gjqt_xiayize.jpg', + 'image/card/gjqt_xieyi.jpg', + 'image/card/gjqt_xunfang.jpg', + 'image/card/gjqt_yanjiaxieyi.jpg', + 'image/card/gjqt_yinqianshang.jpg', + 'image/card/gjqt_yuewuyi.jpg', + 'image/card/gjqt_yunwuyue.jpg', + 'image/card/gongsundu.jpg', + 'image/card/gongsunkang.jpg', + 'image/card/gongsunyuan.jpg', + 'image/card/gongsunzan.jpg', + 'image/card/guanhai.jpg', + 'image/card/guanlu.jpg', + 'image/card/guanning.jpg', + 'image/card/guānning.jpg', + 'image/card/guanping.jpg', + 'image/card/guanqiujian.jpg', + 'image/card/guansuo.jpg', + 'image/card/guanxingzhangbao.jpg', + 'image/card/guanyinping.jpg', + 'image/card/guanyu.jpg', + 'image/card/guanzhang.jpg', + 'image/card/guohuai.jpg', + 'image/card/guohuanghou.jpg', + 'image/card/guojia.jpg', + 'image/card/guosi.jpg', + 'image/card/guotufengji.jpg', + 'image/card/guozhao.jpg', + 'image/card/guyong.jpg', + 'image/card/gw_aigeleisi.jpg', + 'image/card/gw_aimin.jpg', + 'image/card/gw_airuiting.jpg', + 'image/card/gw_aisinie.jpg', + 'image/card/gw_aokeweisite.jpg', + 'image/card/gw_bierna.jpg', + 'image/card/gw_bulanwang.jpg', + 'image/card/gw_dagong.jpg', + 'image/card/gw_diandian.jpg', + 'image/card/gw_enxier.jpg', + 'image/card/gw_falanxisika.jpg', + 'image/card/gw_feilafanruide.jpg', + 'image/card/gw_fenghuang.jpg', + 'image/card/gw_fuertaisite.jpg', + 'image/card/gw_fulisi.jpg', + 'image/card/gw_gaier.jpg', + 'image/card/gw_haizhiyezhu.jpg', + 'image/card/gw_haluo.jpg', + 'image/card/gw_hanmuduoer.jpg', + 'image/card/gw_hengsaite.jpg', + 'image/card/gw_huoge.jpg', + 'image/card/gw_jieluote.jpg', + 'image/card/gw_kaerweite.jpg', + 'image/card/gw_kairuisi.jpg', + 'image/card/gw_kanbi.jpg', + 'image/card/gw_kaxier.jpg', + 'image/card/gw_kuite.jpg', + 'image/card/gw_laduoweide.jpg', + 'image/card/gw_lanbote.jpg', + 'image/card/gw_laomaotou.jpg', + 'image/card/gw_laomaotou2.jpg', + 'image/card/gw_linjing.jpg', + 'image/card/gw_luobo.jpg', + 'image/card/gw_luoqi.jpg', + 'image/card/gw_meizi.jpg', + 'image/card/gw_mieren.jpg', + 'image/card/gw_nitelila.jpg', + 'image/card/gw_nvyemo.jpg', + 'image/card/gw_oudimu.jpg', + 'image/card/gw_puxila.jpg', + 'image/card/gw_qigaiwang.jpg', + 'image/card/gw_sanhanya.jpg', + 'image/card/gw_saqiya.jpg', + 'image/card/gw_saqiya1.jpg', + 'image/card/gw_saqiya2.jpg', + 'image/card/gw_shanhu.jpg', + 'image/card/gw_shasixiwusi.jpg', + 'image/card/gw_telisi.jpg', + 'image/card/gw_xigedelifa.jpg', + 'image/card/gw_xili.jpg', + 'image/card/gw_yenaifa.jpg', + 'image/card/gw_yioufeisi.jpg', + 'image/card/gw_yioufeisisp.jpg', + 'image/card/gw_yisilinni.jpg', + 'image/card/gw_zhangyujushou.jpg', + 'image/card/gw_zhuoertan.jpg', + 'image/card/gz_caohong.jpg', + 'image/card/gz_caopi.jpg', + 'image/card/gz_chengong.jpg', + 'image/card/gz_dengai.jpg', + 'image/card/gz_dengzhi.jpg', + 'image/card/gz_dianwei.jpg', + 'image/card/gz_diaochan.jpg', + 'image/card/gz_dingfeng.jpg', + 'image/card/gz_fazheng.jpg', + 'image/card/gz_fengxi.jpg', + 'image/card/gz_ganfuren.jpg', + 'image/card/gz_gongsunyuan.jpg', + 'image/card/gz_guanyu.jpg', + 'image/card/gz_guohuai.jpg', + 'image/card/gz_guojia.jpg', + 'image/card/gz_hetaihou.jpg', + 'image/card/gz_huangyueying.jpg', + 'image/card/gz_huangzhong.jpg', + 'image/card/gz_huangzu.jpg', + 'image/card/gz_jiangwei.jpg', + 'image/card/gz_jiaxu.jpg', + 'image/card/gz_lingtong.jpg', + 'image/card/gz_liuba.jpg', + 'image/card/gz_liuqi.jpg', + 'image/card/gz_lukang.jpg', + 'image/card/gz_luxun.jpg', + 'image/card/gz_lvbu.jpg', + 'image/card/gz_lvlingqi.jpg', + 'image/card/gz_madai.jpg', + 'image/card/gz_masu.jpg', + 'image/card/gz_miheng.jpg', + 'image/card/gz_panfeng.jpg', + 'image/card/gz_panjun.jpg', + 'image/card/gz_pengyang.jpg', + 'image/card/gz_re_xushu.jpg', + 'image/card/gz_re_yuanshao.jpg', + 'image/card/gz_shamoke.jpg', + 'image/card/gz_shixie.jpg', + 'image/card/gz_simazhao.jpg', + 'image/card/gz_sp_zhugeliang.jpg', + 'image/card/gz_sunce.jpg', + 'image/card/gz_sunjian.jpg', + 'image/card/gz_sunshangxiang.jpg', + 'image/card/gz_tangzi.jpg', + 'image/card/gz_wangping.jpg', + 'image/card/gz_wenqin.jpg', + 'image/card/gz_wuguotai.jpg', + 'image/card/gz_wujing.jpg', + 'image/card/gz_xf_sufei.jpg', + 'image/card/gz_xiahouba.jpg', + 'image/card/gz_xiahouyuan.jpg', + 'image/card/gz_xiaoqiao.jpg', + 'image/card/gz_xunyou.jpg', + 'image/card/gz_xusheng.jpg', + 'image/card/gz_xuyou.jpg', + 'image/card/gz_yanbaihu.jpg', + 'image/card/gz_yangwan.jpg', + 'image/card/gz_yuanshu.jpg', + 'image/card/gz_yuejin.jpg', + 'image/card/gz_yuji.jpg', + 'image/card/gz_yujin.jpg', + 'image/card/gz_zhanglu.jpg', + 'image/card/gz_zhangxiu.jpg', + 'image/card/gz_zhenji.jpg', + 'image/card/gz_zhonghui.jpg', + 'image/card/gz_zhouyu.jpg', + 'image/card/gz_zhugeke.jpg', + 'image/card/gz_zhugeliang.jpg', + 'image/card/gz_zhuling.jpg', + 'image/card/gz_zuoci.jpg', + 'image/card/hanba.jpg', + 'image/card/handang.jpg', + 'image/card/hanfu.jpg', + 'image/card/hanhaoshihuan.jpg', + 'image/card/hanlong.jpg', + 'image/card/hanmeng.jpg', + 'image/card/hansui.jpg', + 'image/card/haomeng.jpg', + 'image/card/haopu.jpg', + 'image/card/haozhao.jpg', + 'image/card/heiwuchang.jpg', + 'image/card/hejin.jpg', + 'image/card/heqi.jpg', + 'image/card/hetaihou.jpg', + 'image/card/heyan.jpg', + 'image/card/hhzz_kanade.jpg', + 'image/card/hhzz_shiona.jpg', + 'image/card/hhzz_takaramono1.jpg', + 'image/card/hhzz_takaramono2.jpg', + 'image/card/hs_aedwin.jpg', + 'image/card/hs_aerfusi.jpg', + 'image/card/hs_aiqinvyao.jpg', + 'image/card/hs_alakir.jpg', + 'image/card/hs_alextrasza.jpg', + 'image/card/hs_alleria.jpg', + 'image/card/hs_amala.jpg', + 'image/card/hs_anduin.jpg', + 'image/card/hs_anomalus.jpg', + 'image/card/hs_antonidas.jpg', + 'image/card/hs_ashamoer.jpg', + 'image/card/hs_aya.jpg', + 'image/card/hs_baiguyoulong.jpg', + 'image/card/hs_bannabusi.jpg', + 'image/card/hs_barnes.jpg', + 'image/card/hs_bchillmaw.jpg', + 'image/card/hs_bilanyoulong.jpg', + 'image/card/hs_bingshuangnvwang.jpg', + 'image/card/hs_blingtron.jpg', + 'image/card/hs_bolvar.jpg', + 'image/card/hs_brann.jpg', + 'image/card/hs_duyaxinshi.jpg', + 'image/card/hs_enzoth.jpg', + 'image/card/hs_fachaotuteng.jpg', + 'image/card/hs_fandral.jpg', + 'image/card/hs_fengjianhuanfengzhe.jpg', + 'image/card/hs_fenjie.jpg', + 'image/card/hs_finley.jpg', + 'image/card/hs_fuding.jpg', + 'image/card/hs_guldan.jpg', + 'image/card/hs_hajiasha.jpg', + 'image/card/hs_hallazeal.jpg', + 'image/card/hs_heifengqishi.jpg', + 'image/card/hs_hemite.jpg', + 'image/card/hs_hudunren.jpg', + 'image/card/hs_huolituteng.jpg', + 'image/card/hs_huzhixiannv.jpg', + 'image/card/hs_jaina.jpg', + 'image/card/hs_jgarrosh.jpg', + 'image/card/hs_jiawodun.jpg', + 'image/card/hs_jiaziruila.jpg', + 'image/card/hs_jinglinglong.jpg', + 'image/card/hs_kaituozhe.jpg', + 'image/card/hs_kalimosi.jpg', + 'image/card/hs_kazhakusi.jpg', + 'image/card/hs_kchromaggus.jpg', + 'image/card/hs_kcthun.jpg', + 'image/card/hs_khadgar.jpg', + 'image/card/hs_lafamu.jpg', + 'image/card/hs_laila.jpg', + 'image/card/hs_laxiao.jpg', + 'image/card/hs_lazi.jpg', + 'image/card/hs_liadrin.jpg', + 'image/card/hs_loatheb.jpg', + 'image/card/hs_lreno.jpg', + 'image/card/hs_lrexxar.jpg', + 'image/card/hs_lrhonin.jpg', + 'image/card/hs_magni.jpg', + 'image/card/hs_malfurion.jpg', + 'image/card/hs_malorne.jpg', + 'image/card/hs_malygos.jpg', + 'image/card/hs_manyututeng.jpg', + 'image/card/hs_medivh.jpg', + 'image/card/hs_mijiaojisi.jpg', + 'image/card/hs_mojinbaozi.jpg', + 'image/card/hs_morgl.jpg', + 'image/card/hs_nate.jpg', + 'image/card/hs_neptulon.jpg', + 'image/card/hs_nozdormu.jpg', + 'image/card/hs_nuogefu.jpg', + 'image/card/hs_pengpeng.jpg', + 'image/card/hs_pyros.jpg', + 'image/card/hs_pyros1.jpg', + 'image/card/hs_pyros2.jpg', + 'image/card/hs_ronghejuren.jpg', + 'image/card/hs_ruanniguai.jpg', + 'image/card/hs_sainaliusi.jpg', + 'image/card/hs_sapphiron.jpg', + 'image/card/hs_selajin.jpg', + 'image/card/hs_selajin2.jpg', + 'image/card/hs_shaku.jpg', + 'image/card/hs_shanlingjuren.jpg', + 'image/card/hs_shifazhe.jpg', + 'image/card/hs_shirencao.jpg', + 'image/card/hs_shizugui.jpg', + 'image/card/hs_shuiwenxuejia.jpg', + 'image/card/hs_siwangxianzhi.jpg', + 'image/card/hs_siwangzhiyi.jpg', + 'image/card/hs_sthrall.jpg', + 'image/card/hs_taisi.jpg', + 'image/card/hs_tanghangu.jpg', + 'image/card/hs_tgolem.jpg', + 'image/card/hs_totemic.jpg', + 'image/card/hs_trueheart.jpg', + 'image/card/hs_tuoqi.jpg', + 'image/card/hs_tyrande.jpg', + 'image/card/hs_waleera.jpg', + 'image/card/hs_walian.jpg', + 'image/card/hs_wolazi.jpg', + 'image/card/hs_wujiyuansu.jpg', + 'image/card/hs_wuther.jpg', + 'image/card/hs_wuyaowang.jpg', + 'image/card/hs_wvelen.jpg', + 'image/card/hs_xialikeer.jpg', + 'image/card/hs_xiangyaqishi.jpg', + 'image/card/hs_xsylvanas.jpg', + 'image/card/hs_xuanzhuanjijia.jpg', + 'image/card/hs_xuefashi.jpg', + 'image/card/hs_xukongzhiying.jpg', + 'image/card/hs_yangyanwageli.jpg', + 'image/card/hs_yashaji.jpg', + 'image/card/hs_yelinchulong.jpg', + 'image/card/hs_yelinlonghou.jpg', + 'image/card/hs_yelise.jpg', + 'image/card/hs_yinggencao.jpg', + 'image/card/hs_yngvar.jpg', + 'image/card/hs_yogg.jpg', + 'image/card/hs_ysera.jpg', + 'image/card/hs_yuhuozhe.jpg', + 'image/card/hs_zhanzhenggushu.jpg', + 'image/card/hs_zhihuanhua.jpg', + 'image/card/hs_zhishigushu.jpg', + 'image/card/hs_zhouzhuo.jpg', + 'image/card/huaman.jpg', + 'image/card/huanfan.jpg', + 'image/card/huangchengyan.jpg', + 'image/card/huangfusong.jpg', + 'image/card/huanggai.jpg', + 'image/card/huanghao.jpg', + 'image/card/huangjinleishi.jpg', + 'image/card/huangyueying.jpg', + 'image/card/huangzhong.jpg', + 'image/card/huangzu.jpg', + 'image/card/huatuo.jpg', + 'image/card/huaxin.jpg', + 'image/card/huaxiong.jpg', + 'image/card/huban.jpg', + 'image/card/hucheer.jpg', + 'image/card/hujinding.jpg', + 'image/card/huojun.jpg', + 'image/card/huzhao.jpg', + 'image/card/jiachong.jpg', + 'image/card/jiakui.jpg', + 'image/card/jiangfei.jpg', + 'image/card/jianggan.jpg', + 'image/card/jiangqing.jpg', + 'image/card/jiangwei.jpg', + 'image/card/jianyong.jpg', + 'image/card/jiaxu.jpg', + 'image/card/jikang.jpg', + 'image/card/jiling.jpg', + 'image/card/jin_guohuai.jpg', + 'image/card/jin_jiachong.jpg', + 'image/card/jin_simashi.jpg', + 'image/card/jin_simayi.jpg', + 'image/card/jin_simazhao.jpg', + 'image/card/jin_wangyuanji.jpg', + 'image/card/jin_xiahouhui.jpg', + 'image/card/jin_yanghu.jpg', + 'image/card/jin_yanghuiyu.jpg', + 'image/card/jin_zhangchunhua.jpg', + 'image/card/jin_zhouchu.jpg', + 'image/card/jsp_caoren.jpg', + 'image/card/jsp_guanyu.jpg', + 'image/card/jsp_huangyueying.jpg', + 'image/card/jsp_liubei.jpg', + 'image/card/jsp_zhaoyun.jpg', + 'image/card/jsrg_caocao.jpg', + 'image/card/jsrg_chendeng.jpg', + 'image/card/jsrg_chunyuqiong.jpg', + 'image/card/jsrg_dongbai.jpg', + 'image/card/jsrg_fanjiangzhangda.jpg', + 'image/card/jsrg_guanyu.jpg', + 'image/card/jsrg_guojia.jpg', + 'image/card/jsrg_hansui.jpg', + 'image/card/jsrg_hejin.jpg', + 'image/card/jsrg_huangfusong.jpg', + 'image/card/jsrg_huangzhong.jpg', + 'image/card/jsrg_kongrong.jpg', + 'image/card/jsrg_liubei.jpg', + 'image/card/jsrg_liuhong.jpg', + 'image/card/jsrg_liuyan.jpg', + 'image/card/jsrg_lougui.jpg', + 'image/card/jsrg_lvbu.jpg', + 'image/card/jsrg_machao.jpg', + 'image/card/jsrg_nanhualaoxian.jpg', + 'image/card/jsrg_pangtong.jpg', + 'image/card/jsrg_qiaoxuan.jpg', + 'image/card/jsrg_sunce.jpg', + 'image/card/jsrg_sunjian.jpg', + 'image/card/jsrg_sunshangxiang.jpg', + 'image/card/jsrg_wangyun.jpg', + 'image/card/jsrg_xiahouen.jpg', + 'image/card/jsrg_xiahourong.jpg', + 'image/card/jsrg_xugong.jpg', + 'image/card/jsrg_xushao.jpg', + 'image/card/jsrg_xuyou.jpg', + 'image/card/jsrg_yangbiao.jpg', + 'image/card/jsrg_zhangchu.jpg', + 'image/card/jsrg_zhangfei.jpg', + 'image/card/jsrg_zhanghe.jpg', + 'image/card/jsrg_zhangliao.jpg', + 'image/card/jsrg_zhangren.jpg', + 'image/card/jsrg_zhenji.jpg', + 'image/card/jsrg_zhujun.jpg', + 'image/card/jsrg_zoushi.jpg', + 'image/card/jun_caocao.jpg', + 'image/card/jun_liubei.jpg', + 'image/card/jun_sunquan.jpg', + 'image/card/jun_zhangjiao.jpg', + 'image/card/junk_duanwei.jpg', + 'image/card/junk_huangyueying.jpg', + 'image/card/junk_lidian.jpg', + 'image/card/junk_liubei.jpg', + 'image/card/junk_simayi.jpg', + 'image/card/junk_sunquan.jpg', + 'image/card/junk_xuyou.jpg', + 'image/card/junk_zhangrang.jpg', + 'image/card/kaisa.jpg', + 'image/card/kanze.jpg', + 'image/card/kebineng.jpg', + 'image/card/key_abyusa.jpg', + 'image/card/key_akane.jpg', + 'image/card/key_akiko.jpg', + 'image/card/key_ao.jpg', + 'image/card/key_asara.jpg', + 'image/card/key_ayato.jpg', + 'image/card/key_chihaya.jpg', + 'image/card/key_doruji.jpg', + 'image/card/key_erika.jpg', + 'image/card/key_fuuko.jpg', + 'image/card/key_godan.jpg', + 'image/card/key_harukakanata.jpg', + 'image/card/key_haruko.jpg', + 'image/card/key_hina.jpg', + 'image/card/key_hinata.jpg', + 'image/card/key_hiroto.jpg', + 'image/card/key_hisako.jpg', + 'image/card/key_inari.jpg', + 'image/card/key_iriya.jpg', + 'image/card/key_iwasawa.jpg', + 'image/card/key_jojiro.jpg', + 'image/card/key_kagari.jpg', + 'image/card/key_kamome.jpg', + 'image/card/key_kano.jpg', + 'image/card/key_kaori.jpg', + 'image/card/key_kengo.jpg', + 'image/card/key_kiyu.jpg', + 'image/card/key_komari.jpg', + 'image/card/key_kotarou.jpg', + 'image/card/key_kotomi.jpg', + 'image/card/key_kotori.jpg', + 'image/card/key_kud.jpg', + 'image/card/key_kyoko.jpg', + 'image/card/key_kyou.jpg', + 'image/card/key_kyouko.jpg', + 'image/card/key_kyousuke.jpg', + 'image/card/key_lucia.jpg', + 'image/card/key_masato.jpg', + 'image/card/key_mia.jpg', + 'image/card/key_michiru.jpg', + 'image/card/key_midori.jpg', + 'image/card/key_miki.jpg', + 'image/card/key_minagi.jpg', + 'image/card/key_mio.jpg', + 'image/card/key_misa.jpg', + 'image/card/key_misuzu.jpg', + 'image/card/key_nagisa.jpg', + 'image/card/key_nao.jpg', + 'image/card/key_noda.jpg', + 'image/card/key_rei.jpg', + 'image/card/key_riki.jpg', + 'image/card/key_rin.jpg', + 'image/card/key_rumi.jpg', + 'image/card/key_ryoichi.jpg', + 'image/card/key_sakuya.jpg', + 'image/card/key_sasami.jpg', + 'image/card/key_satomi.jpg', + 'image/card/key_saya.jpg', + 'image/card/key_seira.jpg', + 'image/card/key_shiina.jpg', + 'image/card/key_shiki.jpg', + 'image/card/key_shiori.jpg', + 'image/card/key_shiorimiyuki.jpg', + 'image/card/key_shiroha.jpg', + 'image/card/key_shizuku.jpg', + 'image/card/key_shizuru.jpg', + 'image/card/key_sunohara.jpg', + 'image/card/key_tenzen.jpg', + 'image/card/key_tomoya.jpg', + 'image/card/key_tomoyo.jpg', + 'image/card/key_tsumugi.jpg', + 'image/card/key_umi.jpg', + 'image/card/key_ushio.jpg', + 'image/card/key_yoshino.jpg', + 'image/card/key_youta.jpg', + 'image/card/key_yui.jpg', + 'image/card/key_yuiko.jpg', + 'image/card/key_yukine.jpg', + 'image/card/key_yukito.jpg', + 'image/card/key_yuri.jpg', + 'image/card/key_yusa.jpg', + 'image/card/key_yuu.jpg', + 'image/card/key_yuuki.jpg', + 'image/card/key_yuzuru.jpg', + 'image/card/kongrong.jpg', + 'image/card/kuailiangkuaiyue.jpg', + 'image/card/kuaiqi.jpg', + 'image/card/laimin.jpg', + 'image/card/laiyinger.jpg', + 'image/card/le_shen_jiaxu.jpg', + 'image/card/leibo.jpg', + 'image/card/leitong.jpg', + 'image/card/liangxing.jpg', + 'image/card/liaohua.jpg', + 'image/card/libai.jpg', + 'image/card/licaiwei.jpg', + 'image/card/lifeng.jpg', + 'image/card/lijue.jpg', + 'image/card/lingcao.jpg', + 'image/card/lingju.jpg', + 'image/card/lingtong.jpg', + 'image/card/liqueguosi.jpg', + 'image/card/liru.jpg', + 'image/card/lisu.jpg', + 'image/card/litong.jpg', + 'image/card/liuba.jpg', + 'image/card/liubei.jpg', + 'image/card/liubian.jpg', + 'image/card/liubiao.jpg', + 'image/card/liuchen.jpg', + 'image/card/liucheng.jpg', + 'image/card/liuchongluojun.jpg', + 'image/card/liufeng.jpg', + 'image/card/liuhong.jpg', + 'image/card/liuhui.jpg', + 'image/card/liupi.jpg', + 'image/card/liuqi.jpg', + 'image/card/liushan.jpg', + 'image/card/liuxie.jpg', + 'image/card/liuyan.jpg', + 'image/card/liuyao.jpg', + 'image/card/liuye.jpg', + 'image/card/liuyong.jpg', + 'image/card/liuyu.jpg', + 'image/card/liuzan.jpg', + 'image/card/liuzhang.jpg', + 'image/card/liwan.jpg', + 'image/card/liwei.jpg', + 'image/card/liyan.jpg', + 'image/card/liyixiejing.jpg', + 'image/card/longwang.jpg', + 'image/card/longyufei.jpg', + 'image/card/luji.jpg', + 'image/card/lukai.jpg', + 'image/card/lukang.jpg', + 'image/card/luotong.jpg', + 'image/card/luoxian.jpg', + 'image/card/lushi.jpg', + 'image/card/luxun.jpg', + 'image/card/luyi.jpg', + 'image/card/luyusheng.jpg', + 'image/card/luzhi.jpg', + 'image/card/lvboshe.jpg', + 'image/card/lvbu.jpg', + 'image/card/lvdai.jpg', + 'image/card/lvfan.jpg', + 'image/card/lvkai.jpg', + 'image/card/lvkuanglvxiang.jpg', + 'image/card/lvlingqi.jpg', + 'image/card/lvmeng.jpg', + 'image/card/lvqian.jpg', + 'image/card/machao.jpg', + 'image/card/macheng.jpg', + 'image/card/madai.jpg', + 'image/card/majun.jpg', + 'image/card/maliang.jpg', + 'image/card/malingli.jpg', + 'image/card/mamian.jpg', + 'image/card/mamidi.jpg', + 'image/card/manchong.jpg', + 'image/card/mangyachang.jpg', + 'image/card/masu.jpg', + 'image/card/mateng.jpg', + 'image/card/maxiumatie.jpg', + 'image/card/mayuanyi.jpg', + 'image/card/mayunlu.jpg', + 'image/card/mazhong.jpg', + 'image/card/mb_sunluyu.jpg', + 'image/card/mengda.jpg', + 'image/card/menghuo.jpg', + 'image/card/mengjie.jpg', + 'image/card/mengyou.jpg', + 'image/card/mifangfushiren.jpg', + 'image/card/mifuren.jpg', + 'image/card/miheng.jpg', + 'image/card/mizhu.jpg', + 'image/card/mp_liuling.jpg', + 'image/card/mtg_ayeni.jpg', + 'image/card/mtg_jiding.jpg', + 'image/card/mtg_jiesi.jpg', + 'image/card/mtg_lilianna.jpg', + 'image/card/mtg_nisha.jpg', + 'image/card/mtg_qianzhuo.jpg', + 'image/card/mushun.jpg', + 'image/card/nanhualaoxian.jpg', + 'image/card/nashime.jpg', + 'image/card/new_caoren.jpg', + 'image/card/nezha.jpg', + 'image/card/nianshou.jpg', + 'image/card/niufu.jpg', + 'image/card/niujin.jpg', + 'image/card/niutou.jpg', + 'image/card/noname.jpg', + 'image/card/noname_machao.png', + 'image/card/noname_sunce.png', + 'image/card/ns_caimao.jpg', + 'image/card/ns_caoanmin.jpg', + 'image/card/ns_caocao.jpg', + 'image/card/ns_caocaosp.jpg', + 'image/card/ns_caoshuang.jpg', + 'image/card/ns_chendao.jpg', + 'image/card/ns_chengpu.jpg', + 'image/card/ns_chentai.jpg', + 'image/card/ns_duangui.jpg', + 'image/card/ns_duji.jpg', + 'image/card/ns_fanchou.jpg', + 'image/card/ns_guanlu.jpg', + 'image/card/ns_huamulan.jpg', + 'image/card/ns_huangchengyan.jpg', + 'image/card/ns_huangwudie.jpg', + 'image/card/ns_huangzu.jpg', + 'image/card/ns_jiaxu.jpg', + 'image/card/ns_jinke.jpg', + 'image/card/ns_lijue.jpg', + 'image/card/ns_limi.jpg', + 'image/card/ns_lisu.jpg', + 'image/card/ns_liuzhang.jpg', + 'image/card/ns_luyusheng.jpg', + 'image/card/ns_lvmeng.jpg', + 'image/card/ns_lvzhi.jpg', + 'image/card/ns_masu.jpg', + 'image/card/ns_mengyou.jpg', + 'image/card/ns_nanhua.jpg', + 'image/card/ns_nanhua_left.jpg', + 'image/card/ns_nanhua_right.jpg', + 'image/card/ns_ruanji.jpg', + 'image/card/ns_shenpei.jpg', + 'image/card/ns_simazhao.jpg', + 'image/card/ns_sunchensunjun.jpg', + 'image/card/ns_sundeng.jpg', + 'image/card/ns_sunjian.jpg', + 'image/card/ns_sunyi.jpg', + 'image/card/ns_wangyue.jpg', + 'image/card/ns_wangyun.jpg', + 'image/card/ns_wenchou.jpg', + 'image/card/ns_xinnanhua.jpg', + 'image/card/ns_xinxianying.jpg', + 'image/card/ns_yanghu.jpg', + 'image/card/ns_yangyi.jpg', + 'image/card/ns_yanliang.jpg', + 'image/card/ns_yuanxi.jpg', + 'image/card/ns_yuji.jpg', + 'image/card/ns_yujisp.jpg', + 'image/card/ns_zanghong.jpg', + 'image/card/ns_zhangbao.jpg', + 'image/card/ns_zhangji.jpg', + 'image/card/ns_zhangning.jpg', + 'image/card/ns_zhangwei.jpg', + 'image/card/ns_zhangxiu.jpg', + 'image/card/ns_zhonglimu.jpg', + 'image/card/ns_zhugeliang.jpg', + 'image/card/ns_zuoci.jpg', + 'image/card/ol_bianfuren.jpg', + 'image/card/ol_caiwenji.jpg', + 'image/card/ol_chendeng.jpg', + 'image/card/ol_dengai.jpg', + 'image/card/ol_dengzhi.jpg', + 'image/card/ol_dianwei.jpg', + 'image/card/ol_dingshangwan.jpg', + 'image/card/ol_dingyuan.jpg', + 'image/card/ol_dongzhao.jpg', + 'image/card/ol_dongzhuo.jpg', + 'image/card/ol_feiyi.jpg', + 'image/card/ol_furong.jpg', + 'image/card/ol_guohuai.jpg', + 'image/card/ol_huangzhong.jpg', + 'image/card/ol_huaxin.jpg', + 'image/card/ol_huaxiong.jpg', + 'image/card/ol_huban.jpg', + 'image/card/ol_jiangwei.jpg', + 'image/card/ol_jianyong.jpg', + 'image/card/ol_lingtong.jpg', + 'image/card/ol_lisu.jpg', + 'image/card/ol_liuba.jpg', + 'image/card/ol_liushan.jpg', + 'image/card/ol_liuyu.jpg', + 'image/card/ol_liwan.jpg', + 'image/card/ol_lusu.jpg', + 'image/card/ol_luyusheng.jpg', + 'image/card/ol_maliang.jpg', + 'image/card/ol_mengda.jpg', + 'image/card/ol_pangde.jpg', + 'image/card/ol_pangtong.jpg', + 'image/card/ol_pengyang.jpg', + 'image/card/ol_puyuan.jpg', + 'image/card/ol_qianzhao.jpg', + 'image/card/ol_sp_zhugeliang.jpg', + 'image/card/ol_sunjian.jpg', + 'image/card/ol_wanglang.jpg', + 'image/card/ol_wangrong.jpg', + 'image/card/ol_weiyan.jpg', + 'image/card/ol_wenqin.jpg', + 'image/card/ol_xiahouyuan.jpg', + 'image/card/ol_xiaoqiao.jpg', + 'image/card/ol_xinxianying.jpg', + 'image/card/ol_xuhuang.jpg', + 'image/card/ol_xunyu.jpg', + 'image/card/ol_yangyi.jpg', + 'image/card/ol_yanwen.jpg', + 'image/card/ol_yuanshao.jpg', + 'image/card/ol_yuanshu.jpg', + 'image/card/ol_yujin.jpg', + 'image/card/ol_zhangchangpu.jpg', + 'image/card/ol_zhangliao.jpg', + 'image/card/ol_zhangrang.jpg', + 'image/card/ol_zhangyì.jpg', + 'image/card/ol_zhangzhang.jpg', + 'image/card/ol_zhouqun.jpg', + 'image/card/ol_zhujun.jpg', + 'image/card/ol_zhuling.jpg', + 'image/card/ol_zhurong.jpg', + 'image/card/old_bulianshi.jpg', + 'image/card/old_caocao.jpg', + 'image/card/old_caochong.jpg', + 'image/card/old_caochun.jpg', + 'image/card/old_caoren.jpg', + 'image/card/old_caorui.jpg', + 'image/card/old_caoxiu.jpg', + 'image/card/old_caozhen.jpg', + 'image/card/old_chendao.jpg', + 'image/card/old_chenqun.jpg', + 'image/card/old_dingfeng.jpg', + 'image/card/old_fuhuanghou.jpg', + 'image/card/old_gaoshun.jpg', + 'image/card/old_guanqiujian.jpg', + 'image/card/old_guanyinping.jpg', + 'image/card/old_guanyu.jpg', + 'image/card/old_guanzhang.jpg', + 'image/card/old_handang.jpg', + 'image/card/old_huangfusong.jpg', + 'image/card/old_huanghao.jpg', + 'image/card/old_huatuo.jpg', + 'image/card/old_huaxiong.jpg', + 'image/card/old_jiakui.jpg', + 'image/card/old_lingju.jpg', + 'image/card/old_lingtong.jpg', + 'image/card/old_liubiao.jpg', + 'image/card/old_liuzan.jpg', + 'image/card/old_liyan.jpg', + 'image/card/old_machao.jpg', + 'image/card/old_madai.jpg', + 'image/card/old_majun.jpg', + 'image/card/old_maliang.jpg', + 'image/card/old_quancong.jpg', + 'image/card/old_re_lidian.jpg', + 'image/card/old_shen_zhaoyun.jpg', + 'image/card/old_shixie.jpg', + 'image/card/old_wanglang.jpg', + 'image/card/old_wangyi.jpg', + 'image/card/old_wangyun.jpg', + 'image/card/old_xiaoqiao.jpg', + 'image/card/old_xusheng.jpg', + 'image/card/old_yangyan.jpg', + 'image/card/old_yangzhi.jpg', + 'image/card/old_yuanshu.jpg', + 'image/card/old_zhangfei.jpg', + 'image/card/old_zhangxingcai.jpg', + 'image/card/old_zhaoyun.jpg', + 'image/card/old_zhonghui.jpg', + 'image/card/old_zhoutai.jpg', + 'image/card/old_zhugezhan.jpg', + 'image/card/old_zhuhuan.jpg', + 'image/card/old_zhuran.jpg', + 'image/card/old_zhuzhi.jpg', + 'image/card/oldre_liubiao.jpg', + 'image/card/ow_ana.jpg', + 'image/card/ow_banzang.jpg', + 'image/card/ow_baolei.jpg', + 'image/card/ow_chanyata.jpg', + 'image/card/ow_dva.jpg', + 'image/card/ow_falaozhiying.jpg', + 'image/card/ow_heibaihe.jpg', + 'image/card/ow_heiying.jpg', + 'image/card/ow_kuangshu.jpg', + 'image/card/ow_laiyinhate.jpg', + 'image/card/ow_liekong.jpg', + 'image/card/ow_luba.jpg', + 'image/card/ow_luxiao.jpg', + 'image/card/ow_maikelei.jpg', + 'image/card/ow_mei.jpg', + 'image/card/ow_orisa.jpg', + 'image/card/ow_shibing.jpg', + 'image/card/ow_sishen.jpg', + 'image/card/ow_tianshi.jpg', + 'image/card/ow_tuobiang.jpg', + 'image/card/ow_wensidun.jpg', + 'image/card/ow_yuanshi.jpg', + 'image/card/ow_zhaliya.jpg', + 'image/card/ow_zhixuzhiguang.jpg', + 'image/card/pal_anu.jpg', + 'image/card/pal_changqing.jpg', + 'image/card/pal_hanlingsha.jpg', + 'image/card/pal_jiangcheng.jpg', + 'image/card/pal_jiangyunfan.jpg', + 'image/card/pal_jingtian.jpg', + 'image/card/pal_jushifang.jpg', + 'image/card/pal_leiyuange.jpg', + 'image/card/pal_linyueru.jpg', + 'image/card/pal_liumengli.jpg', + 'image/card/pal_lixiaoyao.jpg', + 'image/card/pal_longkui.jpg', + 'image/card/pal_longkuigui.jpg', + 'image/card/pal_longyou.jpg', + 'image/card/pal_luozhaoyan.jpg', + 'image/card/pal_mingxiu.jpg', + 'image/card/pal_muchanglan.jpg', + 'image/card/pal_murongziying.jpg', + 'image/card/pal_nangonghuang.jpg', + 'image/card/pal_shenqishuang.jpg', + 'image/card/pal_sumei.jpg', + 'image/card/pal_tangyurou.jpg', + 'image/card/pal_wangpengxu.jpg', + 'image/card/pal_wangxiaohu.jpg', + 'image/card/pal_wenhui.jpg', + 'image/card/pal_xia.jpg', + 'image/card/pal_xiahoujinxuan.jpg', + 'image/card/pal_xianqing.jpg', + 'image/card/pal_xiaoman.jpg', + 'image/card/pal_xingxuan.jpg', + 'image/card/pal_xuanxiao.jpg', + 'image/card/pal_xuejian.jpg', + 'image/card/pal_yuejinzhao.jpg', + 'image/card/pal_yueqi.jpg', + 'image/card/pal_yuntianhe.jpg', + 'image/card/pal_zhaoliner.jpg', + 'image/card/pal_zixuan.jpg', + 'image/card/panfeng.jpg', + 'image/card/pangde.jpg', + 'image/card/pangdegong.jpg', + 'image/card/panghui.jpg', + 'image/card/pangtong.jpg', + 'image/card/panjun.jpg', + 'image/card/panshu.jpg', + 'image/card/panzhangmazhong.jpg', + 'image/card/pe_mengda.jpg', + 'image/card/pe_sunchen.jpg', + 'image/card/pe_wangyun.jpg', + 'image/card/pe_wenqin.jpg', + 'image/card/pe_zhonghui.jpg', + 'image/card/peixiu.jpg', + 'image/card/peiyuanshao.jpg', + 'image/card/pengyang.jpg', + 'image/card/pk_sp_duyu.jpg', + 'image/card/prp_zhugeliang.jpg', + 'image/card/ps_caopi.jpg', + 'image/card/ps_caozhi.jpg', + 'image/card/ps_guanyu.jpg', + 'image/card/ps_jiaxu.jpg', + 'image/card/ps_jin_simayi.jpg', + 'image/card/ps_lvbu.jpg', + 'image/card/ps_machao.jpg', + 'image/card/ps_shen_machao.jpg', + 'image/card/ps_simayi.jpg', + 'image/card/ps_zhugeliang.jpg', + 'image/card/ps1059_guojia.jpg', + 'image/card/ps1062_zhouyu.jpg', + 'image/card/ps2063_zhaoyun.jpg', + 'image/card/ps2066_zhugeliang.jpg', + 'image/card/ps2067_zhaoyun.jpg', + 'image/card/ps2068_simayi.jpg', + 'image/card/ps2070_guojia.jpg', + 'image/card/ps2080_zhouyu.jpg', + 'image/card/pujing.jpg', + 'image/card/puyuan.jpg', + 'image/card/qianzhao.jpg', + 'image/card/qiaogong.jpg', + 'image/card/qiaorui.jpg', + 'image/card/qiaozhou.jpg', + 'image/card/qinghegongzhu.jpg', + 'image/card/qinlang.jpg', + 'image/card/qinmi.jpg', + 'image/card/qinyilu.jpg', + 'image/card/qiuliju.jpg', + 'image/card/quancong.jpg', + 'image/card/quanhuijie.jpg', + 'image/card/quhuang.jpg', + 'image/card/quyi.jpg', + 'image/card/re_baosanniang.jpg', + 'image/card/re_bulianshi.jpg', + 'image/card/re_caifuren.jpg', + 'image/card/re_caiwenji.jpg', + 'image/card/re_caiyong.jpg', + 'image/card/re_caocao.jpg', + 'image/card/re_caochong.jpg', + 'image/card/re_caopi.jpg', + 'image/card/re_caoxiu.jpg', + 'image/card/re_caozhang.jpg', + 'image/card/re_caozhen.jpg', + 'image/card/re_caozhi.jpg', + 'image/card/re_chendeng.jpg', + 'image/card/re_chengong.jpg', + 'image/card/re_chengpu.jpg', + 'image/card/re_chenqun.jpg', + 'image/card/re_chunyuqiong.jpg', + 'image/card/re_daqiao.jpg', + 'image/card/re_dengai.jpg', + 'image/card/re_dengzhi.jpg', + 'image/card/re_dianwei.jpg', + 'image/card/re_diaochan.jpg', + 'image/card/re_dongbai.jpg', + 'image/card/re_dongcheng.jpg', + 'image/card/re_dongzhuo.jpg', + 'image/card/re_duji.jpg', + 'image/card/re_fazheng.jpg', + 'image/card/re_fengfangnv.jpg', + 'image/card/re_fuhuanghou.jpg', + 'image/card/re_ganning.jpg', + 'image/card/re_gaoshun.jpg', + 'image/card/re_gongsunyuan.jpg', + 'image/card/re_gongsunzan.jpg', + 'image/card/re_guanping.jpg', + 'image/card/re_guanqiujian.jpg', + 'image/card/re_guanyu.jpg', + 'image/card/re_guanzhang.jpg', + 'image/card/re_guohuai.jpg', + 'image/card/re_guohuanghou.jpg', + 'image/card/re_guojia.jpg', + 'image/card/re_guotufengji.jpg', + 'image/card/re_guyong.jpg', + 'image/card/re_handang.jpg', + 'image/card/re_hanhaoshihuan.jpg', + 'image/card/re_hansui.jpg', + 'image/card/re_hejin.jpg', + 'image/card/re_heqi.jpg', + 'image/card/re_huanggai.jpg', + 'image/card/re_huangyueying.jpg', + 'image/card/re_huangzhong.jpg', + 'image/card/re_huatuo.jpg', + 'image/card/re_huaxiong.jpg', + 'image/card/re_hucheer.jpg', + 'image/card/re_jiangwei.jpg', + 'image/card/re_jianyong.jpg', + 'image/card/re_jiaxu.jpg', + 'image/card/re_jikang.jpg', + 'image/card/re_jsp_huangyueying.jpg', + 'image/card/re_jsp_pangtong.jpg', + 'image/card/re_jushou.jpg', + 'image/card/re_kanze.jpg', + 'image/card/re_liaohua.jpg', + 'image/card/re_lidian.jpg', + 'image/card/re_lingtong.jpg', + 'image/card/re_liru.jpg', + 'image/card/re_liubei.jpg', + 'image/card/re_liubiao.jpg', + 'image/card/re_liuchen.jpg', + 'image/card/re_liufeng.jpg', + 'image/card/re_liushan.jpg', + 'image/card/re_liuzan.jpg', + 'image/card/re_lusu.jpg', + 'image/card/re_luxun.jpg', + 'image/card/re_lvbu.jpg', + 'image/card/re_lvmeng.jpg', + 'image/card/re_machao.jpg', + 'image/card/re_madai.jpg', + 'image/card/re_maliang.jpg', + 'image/card/re_manchong.jpg', + 'image/card/re_masu.jpg', + 'image/card/re_mazhong.jpg', + 'image/card/re_menghuo.jpg', + 'image/card/re_miheng.jpg', + 'image/card/re_nanhualaoxian.jpg', + 'image/card/re_niujin.jpg', + 'image/card/re_panfeng.jpg', + 'image/card/re_pangde.jpg', + 'image/card/re_pangdegong.jpg', + 'image/card/re_pangtong.jpg', + 'image/card/re_panshu.jpg', + 'image/card/re_panzhangmazhong.jpg', + 'image/card/re_quancong.jpg', + 'image/card/re_quyi.jpg', + 'image/card/re_simayi.jpg', + 'image/card/re_sp_taishici.jpg', + 'image/card/re_sp_zhugeliang.jpg', + 'image/card/re_sunben.jpg', + 'image/card/re_sunce.jpg', + 'image/card/re_sundeng.jpg', + 'image/card/re_sunjian.jpg', + 'image/card/re_sunluban.jpg', + 'image/card/re_sunluyu.jpg', + 'image/card/re_sunquan.jpg', + 'image/card/re_sunshangxiang.jpg', + 'image/card/re_sunxiu.jpg', + 'image/card/re_sunyi.jpg', + 'image/card/re_taishici.jpg', + 'image/card/re_taoqian.jpg', + 'image/card/re_wangyi.jpg', + 'image/card/re_wangyun.jpg', + 'image/card/re_weiwenzhugezhi.jpg', + 'image/card/re_weiyan.jpg', + 'image/card/re_wenpin.jpg', + 'image/card/re_wuguotai.jpg', + 'image/card/re_wuyi.jpg', + 'image/card/re_xiahoudun.jpg', + 'image/card/re_xiahoushi.jpg', + 'image/card/re_xiahouyuan.jpg', + 'image/card/re_xiaoqiao.jpg', + 'image/card/re_xinxianying.jpg', + 'image/card/re_xugong.jpg', + 'image/card/re_xuhuang.jpg', + 'image/card/re_xunchen.jpg', + 'image/card/re_xunyou.jpg', + 'image/card/re_xunyu.jpg', + 'image/card/re_xusheng.jpg', + 'image/card/re_xushu.jpg', + 'image/card/re_xuzhu.jpg', + 'image/card/re_yanwen.jpg', + 'image/card/re_yuanshao.jpg', + 'image/card/re_yuanshu.jpg', + 'image/card/re_yufan.jpg', + 'image/card/re_yuji.jpg', + 'image/card/re_yujin.jpg', + 'image/card/re_zhangbao.jpg', + 'image/card/re_zhangchunhua.jpg', + 'image/card/re_zhangfei.jpg', + 'image/card/re_zhanggong.jpg', + 'image/card/re_zhanghe.jpg', + 'image/card/re_zhangjiao.jpg', + 'image/card/re_zhangliang.jpg', + 'image/card/re_zhangliao.jpg', + 'image/card/re_zhangsong.jpg', + 'image/card/re_zhangyi.jpg', + 'image/card/re_zhangzhang.jpg', + 'image/card/re_zhaoyun.jpg', + 'image/card/re_zhenji.jpg', + 'image/card/re_zhonghui.jpg', + 'image/card/re_zhongyao.jpg', + 'image/card/re_zhoucang.jpg', + 'image/card/re_zhouyu.jpg', + 'image/card/re_zhugeliang.jpg', + 'image/card/re_zhuhuan.jpg', + 'image/card/re_zhuran.jpg', + 'image/card/re_zhurong.jpg', + 'image/card/re_zhuzhi.jpg', + 'image/card/re_zoushi.jpg', + 'image/card/re_zuoci.jpg', + 'image/card/ruanhui.jpg', + 'image/card/ruanji.jpg', + 'image/card/ruanyu.jpg', + 'image/card/ruiji.jpg', + 'image/card/sb_caocao.jpg', + 'image/card/sb_caoren.jpg', + 'image/card/sb_chengong.jpg', + 'image/card/sb_daqiao.jpg', + 'image/card/sb_diaochan.jpg', + 'image/card/sb_fazheng.jpg', + 'image/card/sb_ganning.jpg', + 'image/card/sb_huanggai.jpg', + 'image/card/sb_huangzhong.jpg', + 'image/card/sb_huaxiong.jpg', + 'image/card/sb_jiangwei.jpg', + 'image/card/sb_liubei.jpg', + 'image/card/sb_liubiao.jpg', + 'image/card/sb_lvmeng.jpg', + 'image/card/sb_machao.jpg', + 'image/card/sb_menghuo.jpg', + 'image/card/sb_pangtong.jpg', + 'image/card/sb_sunce.jpg', + 'image/card/sb_sunquan.jpg', + 'image/card/sb_sunshangxiang.jpg', + 'image/card/sb_xiahoushi.jpg', + 'image/card/sb_xiaoqiao.jpg', + 'image/card/sb_xuhuang.jpg', + 'image/card/sb_yl_luzhi.jpg', + 'image/card/sb_yuanshao.jpg', + 'image/card/sb_yujin.jpg', + 'image/card/sb_zhangfei.jpg', + 'image/card/sb_zhanghe.jpg', + 'image/card/sb_zhangjiao.jpg', + 'image/card/sb_zhaoyun.jpg', + 'image/card/sb_zhenji.jpg', + 'image/card/sb_zhouyu.jpg', + 'image/card/sb_zhurong.jpg', + 'image/card/scs_bilan.jpg', + 'image/card/scs_bilan_dead.jpg', + 'image/card/scs_duangui.jpg', + 'image/card/scs_duangui_dead.jpg', + 'image/card/scs_gaowang.jpg', + 'image/card/scs_gaowang_dead.jpg', + 'image/card/scs_guosheng.jpg', + 'image/card/scs_guosheng_dead.jpg', + 'image/card/scs_hankui.jpg', + 'image/card/scs_hankui_dead.jpg', + 'image/card/scs_lisong.jpg', + 'image/card/scs_lisong_dead.jpg', + 'image/card/scs_sunzhang.jpg', + 'image/card/scs_sunzhang_dead.jpg', + 'image/card/scs_xiayun.jpg', + 'image/card/scs_xiayun_dead.jpg', + 'image/card/scs_zhangrang.jpg', + 'image/card/scs_zhangrang_dead.jpg', + 'image/card/scs_zhaozhong.jpg', + 'image/card/scs_zhaozhong_dead.jpg', + 'image/card/shamoke.jpg', + 'image/card/shen_caocao.jpg', + 'image/card/shen_caopi.jpg', + 'image/card/shen_dengai.jpg', + 'image/card/shen_dianwei.jpg', + 'image/card/shen_diaochan.jpg', + 'image/card/shen_ganning.jpg', + 'image/card/shen_guanyu.jpg', + 'image/card/shen_guojia.jpg', + 'image/card/shen_jiangwei.jpg', + 'image/card/shen_jiaxu.jpg', + 'image/card/shen_liubei.jpg', + 'image/card/shen_luxun.jpg', + 'image/card/shen_lvbu.jpg', + 'image/card/shen_lvmeng.jpg', + 'image/card/shen_machao.jpg', + 'image/card/shen_simayi.jpg', + 'image/card/shen_sunce.jpg', + 'image/card/shen_sunquan.jpg', + 'image/card/shen_taishici.jpg', + 'image/card/shen_xunyu.jpg', + 'image/card/shen_zhangfei.jpg', + 'image/card/shen_zhangjiao.jpg', + 'image/card/shen_zhangliao.jpg', + 'image/card/shen_zhaoyun.jpg', + 'image/card/shen_zhenji.jpg', + 'image/card/shen_zhouyu.jpg', + 'image/card/shen_zhugeliang.jpg', + 'image/card/shenpei.jpg', + 'image/card/shibao.jpg', + 'image/card/shibing1.jpg', + 'image/card/shibing2.jpg', + 'image/card/shichangshi.jpg', + 'image/card/shichangshi_dead.jpg', + 'image/card/shixie.jpg', + 'image/card/shiyi.jpg', + 'image/card/simafu.jpg', + 'image/card/simahui.jpg', + 'image/card/simalang.jpg', + 'image/card/simashi.jpg', + 'image/card/simayi.jpg', + 'image/card/simazhao.jpg', + 'image/card/simazhou.jpg', + 'image/card/sp_bianfuren.jpg', + 'image/card/sp_caiwenji.jpg', + 'image/card/sp_caoren.jpg', + 'image/card/sp_caosong.jpg', + 'image/card/sp_chendong.jpg', + 'image/card/sp_chenzhen.jpg', + 'image/card/sp_cuiyan.jpg', + 'image/card/sp_daqiao.jpg', + 'image/card/sp_diaochan.jpg', + 'image/card/sp_dongzhuo.jpg', + 'image/card/sp_duyu.jpg', + 'image/card/sp_fuhuanghou.jpg', + 'image/card/sp_fuwan.jpg', + 'image/card/sp_ganning.jpg', + 'image/card/sp_gaolan.jpg', + 'image/card/sp_gongsunzan.jpg', + 'image/card/sp_huaman.jpg', + 'image/card/sp_huangfusong.jpg', + 'image/card/sp_huaxin.jpg', + 'image/card/sp_jianggan.jpg', + 'image/card/sp_jiangqing.jpg', + 'image/card/sp_jiangwan.jpg', + 'image/card/sp_jiangwei.jpg', + 'image/card/sp_jiaxu.jpg', + 'image/card/sp_jiben.jpg', + 'image/card/sp_key_kanade.jpg', + 'image/card/sp_key_yuri.jpg', + 'image/card/sp_kongrong.jpg', + 'image/card/sp_liubei.jpg', + 'image/card/sp_liuqi.jpg', + 'image/card/sp_liuxie.jpg', + 'image/card/sp_lvfan.jpg', + 'image/card/sp_lvmeng.jpg', + 'image/card/sp_machao.jpg', + 'image/card/sp_maojie.jpg', + 'image/card/sp_menghuo.jpg', + 'image/card/sp_mifangfushiren.jpg', + 'image/card/sp_mifuren.jpg', + 'image/card/sp_mushun.jpg', + 'image/card/sp_ol_zhanghe.jpg', + 'image/card/sp_pangde.jpg', + 'image/card/sp_pangtong.jpg', + 'image/card/sp_pengyang.jpg', + 'image/card/sp_shenpei.jpg', + 'image/card/sp_simazhao.jpg', + 'image/card/sp_sufei.jpg', + 'image/card/sp_sunshangxiang.jpg', + 'image/card/sp_sunshao.jpg', + 'image/card/sp_taishici.jpg', + 'image/card/sp_wangcan.jpg', + 'image/card/sp_wangshuang.jpg', + 'image/card/sp_wangyuanji.jpg', + 'image/card/sp_xiahoudun.jpg', + 'image/card/sp_xiahoushi.jpg', + 'image/card/sp_xinpi.jpg', + 'image/card/sp_xinxianying.jpg', + 'image/card/sp_xujing.jpg', + 'image/card/sp_xunchen.jpg', + 'image/card/sp_xuyou.jpg', + 'image/card/sp_yanghu.jpg', + 'image/card/sp_yangwan.jpg', + 'image/card/sp_zhangchangpu.jpg', + 'image/card/sp_zhangfei.jpg', + 'image/card/sp_zhanghe.jpg', + 'image/card/sp_zhangjiao.jpg', + 'image/card/sp_zhangliao.jpg', + 'image/card/sp_zhangwen.jpg', + 'image/card/sp_zhaoyun.jpg', + 'image/card/sp_zhugeliang.jpg', + 'image/card/sp_zhujun.jpg', + 'image/card/sp_zongyu.jpg', + 'image/card/star_caoren.jpg', + 'image/card/star_yuanshu.jpg', + 'image/card/std_panfeng.jpg', + 'image/card/sunce.jpg', + 'image/card/sunchen.jpg', + 'image/card/sundeng.jpg', + 'image/card/sunhanhua.jpg', + 'image/card/sunhao.jpg', + 'image/card/sunhong.jpg', + 'image/card/sunhuan.jpg', + 'image/card/sunjian.jpg', + 'image/card/sunlang.jpg', + 'image/card/sunli.jpg', + 'image/card/sunliang.jpg', + 'image/card/sunlingluan.jpg', + 'image/card/sunluban.jpg', + 'image/card/sunluyu.jpg', + 'image/card/sunqian.jpg', + 'image/card/sunquan.jpg', + 'image/card/sunru.jpg', + 'image/card/sunshangxiang.jpg', + 'image/card/sunshao.jpg', + 'image/card/sunwukong.jpg', + 'image/card/sunxiu.jpg', + 'image/card/sunyang.jpg', + 'image/card/sunyi.jpg', + 'image/card/sunyu.jpg', + 'image/card/sunziliufang.jpg', + 'image/card/swd_anka.jpg', + 'image/card/swd_chenfu.jpg', + 'image/card/swd_chengyaojin.jpg', + 'image/card/swd_chenjingchou.jpg', + 'image/card/swd_cheyun.jpg', + 'image/card/swd_chunyuheng.jpg', + 'image/card/swd_duanmeng.jpg', + 'image/card/swd_duguningke.jpg', + 'image/card/swd_duopeng.jpg', + 'image/card/swd_fengtianling.jpg', + 'image/card/swd_fengyu.jpg', + 'image/card/swd_fu.jpg', + 'image/card/swd_fuyan.jpg', + 'image/card/swd_guyue.jpg', + 'image/card/swd_haidapang.jpg', + 'image/card/swd_hanlong.jpg', + 'image/card/swd_hanluo.jpg', + 'image/card/swd_hengai.jpg', + 'image/card/swd_huanglei.jpg', + 'image/card/swd_huanyuanzhi.jpg', + 'image/card/swd_huiyan.jpg', + 'image/card/swd_hupo.jpg', + 'image/card/swd_huyue.jpg', + 'image/card/swd_huzhongxian.jpg', + 'image/card/swd_jialanduo.jpg', + 'image/card/swd_jiangwu.jpg', + 'image/card/swd_jiangziya.jpg', + 'image/card/swd_jiliang.jpg', + 'image/card/swd_jipeng.jpg', + 'image/card/swd_jiting.jpg', + 'image/card/swd_jiuyou.jpg', + 'image/card/swd_kama.jpg', + 'image/card/swd_kangnalishi.jpg', + 'image/card/swd_kendi.jpg', + 'image/card/swd_lanmoshen.jpg', + 'image/card/swd_lanyin.jpg', + 'image/card/swd_lilian.jpg', + 'image/card/swd_linyue.jpg', + 'image/card/swd_luchengxuan.jpg', + 'image/card/swd_maixing.jpg', + 'image/card/swd_miles.jpg', + 'image/card/swd_moye.jpg', + 'image/card/swd_murongshi.jpg', + 'image/card/swd_muyue.jpg', + 'image/card/swd_muyun.jpg', + 'image/card/swd_nicole.jpg', + 'image/card/swd_qi.jpg', + 'image/card/swd_qiner.jpg', + 'image/card/swd_qinshubao.jpg', + 'image/card/swd_quxian.jpg', + 'image/card/swd_rongshuang.jpg', + 'image/card/swd_septem.jpg', + 'image/card/swd_shangzhang.jpg', + 'image/card/swd_shanxiaoxiao.jpg', + 'image/card/swd_shaowei.jpg', + 'image/card/swd_shuijing.jpg', + 'image/card/swd_shuwaner.jpg', + 'image/card/swd_sikongyu.jpg', + 'image/card/swd_situqiang.jpg', + 'image/card/swd_tuobayuer.jpg', + 'image/card/swd_tuwei.jpg', + 'image/card/swd_wangsiyue.jpg', + 'image/card/swd_weida.jpg', + 'image/card/swd_wushi.jpg', + 'image/card/swd_xiaohuanglong.jpg', + 'image/card/swd_xiarou.jpg', + 'image/card/swd_xiyan.jpg', + 'image/card/swd_xuanyuanjiantong.jpg', + 'image/card/swd_xuanyuanjianxian.jpg', + 'image/card/swd_yeyaxi.jpg', + 'image/card/swd_youzhao.jpg', + 'image/card/swd_yuchiyanhong.jpg', + 'image/card/swd_yuli.jpg', + 'image/card/swd_yunhu.jpg', + 'image/card/swd_yuwentuo.jpg', + 'image/card/swd_yuxiaoxue.jpg', + 'image/card/swd_zhanggao.jpg', + 'image/card/swd_zhaoyun.jpg', + 'image/card/swd_zhiyin.jpg', + 'image/card/swd_zhuoshanzhu.jpg', + 'image/card/swd_zidashu.jpg', + 'image/card/swd_ziqiao.jpg', + 'image/card/tadun.jpg', + 'image/card/taishici.jpg', + 'image/card/tangji.jpg', + 'image/card/tangzi.jpg', + 'image/card/taoqian.jpg', + 'image/card/taoshen.jpg', + 'image/card/tengfanglan.jpg', + 'image/card/tenggongzhu.jpg', + 'image/card/tengyin.jpg', + 'image/card/tianfeng.jpg', + 'image/card/tianyu.jpg', + 'image/card/tongyuan.jpg', + 'image/card/tw_baoxin.jpg', + 'image/card/tw_beimihu.jpg', + 'image/card/tw_bianfuren.jpg', + 'image/card/tw_bingyuan.jpg', + 'image/card/tw_caoang.jpg', + 'image/card/tw_caocao.jpg', + 'image/card/tw_caohong.jpg', + 'image/card/tw_caoxiu.jpg', + 'image/card/tw_caozhao.jpg', + 'image/card/tw_chendong.jpg', + 'image/card/tw_chengpu.jpg', + 'image/card/tw_chenzhen.jpg', + 'image/card/tw_daxiaoqiao.jpg', + 'image/card/tw_dengzhi.jpg', + 'image/card/tw_dingfeng.jpg', + 'image/card/tw_dongzhao.jpg', + 'image/card/tw_fanchou.jpg', + 'image/card/tw_feiyi.jpg', + 'image/card/tw_fengxí.jpg', + 'image/card/tw_furong.jpg', + 'image/card/tw_fuwan.jpg', + 'image/card/tw_gexuan.jpg', + 'image/card/tw_gongsunfan.jpg', + 'image/card/tw_guanqiujian.jpg', + 'image/card/tw_guohuai.jpg', + 'image/card/tw_guyong.jpg', + 'image/card/tw_handang.jpg', + 'image/card/tw_haomeng.jpg', + 'image/card/tw_hejin.jpg', + 'image/card/tw_hucheer.jpg', + 'image/card/tw_huchuquan.jpg', + 'image/card/tw_huojun.jpg', + 'image/card/tw_jiangji.jpg', + 'image/card/tw_jiangqing.jpg', + 'image/card/tw_jianshuo.jpg', + 'image/card/tw_jiling.jpg', + 'image/card/tw_liufuren.jpg', + 'image/card/tw_liuhong.jpg', + 'image/card/tw_liuzhang.jpg', + 'image/card/tw_liwei.jpg', + 'image/card/tw_madai.jpg', + 'image/card/tw_maliang.jpg', + 'image/card/tw_mateng.jpg', + 'image/card/tw_mayunlu.jpg', + 'image/card/tw_menghuo.jpg', + 'image/card/tw_niufudongxie.jpg', + 'image/card/tw_niujin.jpg', + 'image/card/tw_ol_sunjian.jpg', + 'image/card/tw_puyangxing.jpg', + 'image/card/tw_qiaogong.jpg', + 'image/card/tw_qiaorui.jpg', + 'image/card/tw_re_caohong.jpg', + 'image/card/tw_re_fazheng.jpg', + 'image/card/tw_shen_guanyu.jpg', + 'image/card/tw_shen_lvmeng.jpg', + 'image/card/tw_sunyi.jpg', + 'image/card/tw_tianyu.jpg', + 'image/card/tw_wangcan.jpg', + 'image/card/tw_wangchang.jpg', + 'image/card/tw_wangling.jpg', + 'image/card/tw_weixu.jpg', + 'image/card/tw_wujing.jpg', + 'image/card/tw_xiahouba.jpg', + 'image/card/tw_xiahouen.jpg', + 'image/card/tw_xiahoushang.jpg', + 'image/card/tw_xuezong.jpg', + 'image/card/tw_xujing.jpg', + 'image/card/tw_xunchen.jpg', + 'image/card/tw_yangang.jpg', + 'image/card/tw_yangyi.jpg', + 'image/card/tw_yanxiang.jpg', + 'image/card/tw_yl_luzhi.jpg', + 'image/card/tw_yufuluo.jpg', + 'image/card/tw_yujin.jpg', + 'image/card/tw_zangba.jpg', + 'image/card/tw_zhangfei.jpg', + 'image/card/tw_zhanghong.jpg', + 'image/card/tw_zhangji.jpg', + 'image/card/tw_zhangmancheng.jpg', + 'image/card/tw_zhangnan.jpg', + 'image/card/tw_zhangning.jpg', + 'image/card/tw_zhangzhao.jpg', + 'image/card/tw_zhaoxiang.jpg', + 'image/card/tw_zhouchu.jpg', + 'image/card/tw_zhugeguo.jpg', + 'image/card/tw_zongyu.jpg', + 'image/card/tw_zumao.jpg', + 'image/card/vtb_xiaojiu.jpg', + 'image/card/vtb_xiaole.jpg', + 'image/card/vtb_xiaosha.jpg', + 'image/card/vtb_xiaoshan.jpg', + 'image/card/vtb_xiaotao.jpg', + 'image/card/wangcan.jpg', + 'image/card/wangfuzhaolei.jpg', + 'image/card/wangguan.jpg', + 'image/card/wangji.jpg', + 'image/card/wangjun.jpg', + 'image/card/wanglang.jpg', + 'image/card/wanglie.jpg', + 'image/card/wangling.jpg', + 'image/card/wangping.jpg', + 'image/card/wangrong.jpg', + 'image/card/wangshuang.jpg', + 'image/card/wangtao.jpg', + 'image/card/wangwei.jpg', + 'image/card/wangxiang.jpg', + 'image/card/wangyan.jpg', + 'image/card/wangyi.jpg', + 'image/card/wangyuanji.jpg', + 'image/card/wangyue.jpg', + 'image/card/wangyun.jpg', + 'image/card/wanniangongzhu.jpg', + 'image/card/weiguan.jpg', + 'image/card/weiwenzhugezhi.jpg', + 'image/card/weiyan.jpg', + 'image/card/weizi.jpg', + 'image/card/wenpin.jpg', + 'image/card/wenqin.jpg', + 'image/card/wenyang.jpg', + 'image/card/wolongfengchu.jpg', + 'image/card/wu_luxun.jpg', + 'image/card/wu_zhugeliang.jpg', + 'image/card/wu_zhutiexiong.jpg', + 'image/card/wuanguo.jpg', + 'image/card/wuban.jpg', + 'image/card/wufan.jpg', + 'image/card/wuguotai.jpg', + 'image/card/wujing.jpg', + 'image/card/wulan.jpg', + 'image/card/wutugu.jpg', + 'image/card/wuxian.jpg', + 'image/card/wuyan.jpg', + 'image/card/wuyi.jpg', + 'image/card/xf_huangquan.jpg', + 'image/card/xf_sufei.jpg', + 'image/card/xf_tangzi.jpg', + 'image/card/xf_yiji.jpg', + 'image/card/xia_dianwei.jpg', + 'image/card/xia_liyàn.jpg', + 'image/card/xia_lusu.jpg', + 'image/card/xia_tongyuan.jpg', + 'image/card/xia_wangyue.jpg', + 'image/card/xia_xiahouzie.jpg', + 'image/card/xia_xushu.jpg', + 'image/card/xia_zhaoe.jpg', + 'image/card/xiahouba.jpg', + 'image/card/xiahoudun.jpg', + 'image/card/xiahoujie.jpg', + 'image/card/xiahoulingnv.jpg', + 'image/card/xiahoumao.jpg', + 'image/card/xiahoushi.jpg', + 'image/card/xiahouxuan.jpg', + 'image/card/xiahouyuan.jpg', + 'image/card/xiangchong.jpg', + 'image/card/xianglang.jpg', + 'image/card/xiaoqiao.jpg', + 'image/card/xiaoyuehankehan.jpg', + 'image/card/xielingyu.jpg', + 'image/card/xin_baosanniang.jpg', + 'image/card/xin_caifuren.jpg', + 'image/card/xin_caoxiu.jpg', + 'image/card/xin_caozhang.jpg', + 'image/card/xin_caozhen.jpg', + 'image/card/xin_chengpu.jpg', + 'image/card/xin_fazheng.jpg', + 'image/card/xin_fuhuanghou.jpg', + 'image/card/xin_gaoshun.jpg', + 'image/card/xin_gongsunzan.jpg', + 'image/card/xin_guohuai.jpg', + 'image/card/xin_guozhao.jpg', + 'image/card/xin_guyong.jpg', + 'image/card/xin_handang.jpg', + 'image/card/xin_hansui.jpg', + 'image/card/xin_jianyong.jpg', + 'image/card/xin_jushou.jpg', + 'image/card/xin_liaohua.jpg', + 'image/card/xin_lingtong.jpg', + 'image/card/xin_liru.jpg', + 'image/card/xin_liubiao.jpg', + 'image/card/xin_mamidi.jpg', + 'image/card/xin_masu.jpg', + 'image/card/xin_panzhangmazhong.jpg', + 'image/card/xin_quancong.jpg', + 'image/card/xin_sunliang.jpg', + 'image/card/xin_sunluban.jpg', + 'image/card/xin_sunxiu.jpg', + 'image/card/xin_wuguotai.jpg', + 'image/card/xin_wuyi.jpg', + 'image/card/xin_xiahoudun.jpg', + 'image/card/xin_xusheng.jpg', + 'image/card/xin_xushu.jpg', + 'image/card/xin_yuanshao.jpg', + 'image/card/xin_yufan.jpg', + 'image/card/xin_yuji.jpg', + 'image/card/xin_yujin.jpg', + 'image/card/xin_zhangfei.jpg', + 'image/card/xin_zhangyi.jpg', + 'image/card/xin_zhonghui.jpg', + 'image/card/xin_zhoucang.jpg', + 'image/card/xin_zhoutai.jpg', + 'image/card/xin_zhuhuan.jpg', + 'image/card/xin_zhuran.jpg', + 'image/card/xin_zhuzhi.jpg', + 'image/card/xinchang.jpg', + 'image/card/xingdaorong.jpg', + 'image/card/xinpi.jpg', + 'image/card/xinping.jpg', + 'image/card/xinxianying.jpg', + 'image/card/xizheng.jpg', + 'image/card/xizhicai.jpg', + 'image/card/xuangongzhu.jpg', + 'image/card/xuelingyun.jpg', + 'image/card/xuezong.jpg', + 'image/card/xugong.jpg', + 'image/card/xuhuang.jpg', + 'image/card/xujing.jpg', + 'image/card/xunchen.jpg', + 'image/card/xunyou.jpg', + 'image/card/xunyu.jpg', + 'image/card/xurong.jpg', + 'image/card/xushao.jpg', + 'image/card/xusheng.jpg', + 'image/card/xushi.jpg', + 'image/card/xushu.jpg', + 'image/card/xuyou.jpg', + 'image/card/xuzhu.jpg', + 'image/card/yanbaihu.jpg', + 'image/card/yanfuren.jpg', + 'image/card/yangbiao.jpg', + 'image/card/yangfu.jpg', + 'image/card/yanghong.jpg', + 'image/card/yanghuiyu.jpg', + 'image/card/yangwan.jpg', + 'image/card/yangxiu.jpg', + 'image/card/yangyan.jpg', + 'image/card/yangyi.jpg', + 'image/card/yangzhi.jpg', + 'image/card/yanjun.jpg', + 'image/card/yanpu.jpg', + 'image/card/yanrou.jpg', + 'image/card/yanwen.jpg', + 'image/card/yanyan.jpg', + 'image/card/yeshiwen.jpg', + 'image/card/yinfuren.jpg', + 'image/card/yj_caoang.jpg', + 'image/card/yj_caocao.jpg', + 'image/card/yj_caohong.jpg', + 'image/card/yj_dongzhuo.jpg', + 'image/card/yj_ganning.jpg', + 'image/card/yj_huangzhong.jpg', + 'image/card/yj_jiaxu.jpg', + 'image/card/yj_jushou.jpg', + 'image/card/yj_liru.jpg', + 'image/card/yj_qiaozhou.jpg', + 'image/card/yj_sufei.jpg', + 'image/card/yj_weiyan.jpg', + 'image/card/yj_xuhuang.jpg', + 'image/card/yj_xuyou.jpg', + 'image/card/yj_zhangfei.jpg', + 'image/card/yj_zhanghe.jpg', + 'image/card/yj_zhangliao.jpg', + 'image/card/yj_zhenji.jpg', + 'image/card/yj_zhoubuyi.jpg', + 'image/card/yl_luzhi.jpg', + 'image/card/yl_yuanshu.jpg', + 'image/card/yongjian_ganning.jpg', + 'image/card/yuanhuan.jpg', + 'image/card/yuanji.jpg', + 'image/card/yuanshu.jpg', + 'image/card/yuantanyuanshang.jpg', + 'image/card/yuantanyuanxiyuanshang.jpg', + 'image/card/yue_caiwenji.jpg', + 'image/card/yue_zhoufei.jpg', + 'image/card/yuechen.jpg', + 'image/card/yuejin.jpg', + 'image/card/yuejiu.jpg', + 'image/card/yufan.jpg', + 'image/card/yuji.jpg', + 'image/card/yujin.jpg', + 'image/card/yujin_yujin.jpg', + 'image/card/yxs_aijiyanhou.jpg', + 'image/card/yxs_baosi.jpg', + 'image/card/yxs_bole.jpg', + 'image/card/yxs_caocao.jpg', + 'image/card/yxs_chengjisihan.jpg', + 'image/card/yxs_chengyaojin.jpg', + 'image/card/yxs_diaochan.jpg', + 'image/card/yxs_direnjie.jpg', + 'image/card/yxs_fuermosi.jpg', + 'image/card/yxs_goujian.jpg', + 'image/card/yxs_guiguzi.jpg', + 'image/card/yxs_handingdun.jpg', + 'image/card/yxs_huamulan.jpg', + 'image/card/yxs_jinke.jpg', + 'image/card/yxs_kaisa.jpg', + 'image/card/yxs_lanlinwang.jpg', + 'image/card/yxs_libai.jpg', + 'image/card/yxs_lishimin.jpg', + 'image/card/yxs_luban.jpg', + 'image/card/yxs_luobinhan.jpg', + 'image/card/yxs_luocheng.jpg', + 'image/card/yxs_luzhishen.jpg', + 'image/card/yxs_lvzhi.jpg', + 'image/card/yxs_meixi.jpg', + 'image/card/yxs_mingchenghuanghou.jpg', + 'image/card/yxs_mozi.jpg', + 'image/card/yxs_nandinggeer.jpg', + 'image/card/yxs_napolun.jpg', + 'image/card/yxs_qinqiong.jpg', + 'image/card/yxs_sunwu.jpg', + 'image/card/yxs_tangbohu.jpg', + 'image/card/yxs_wangzhaojun.jpg', + 'image/card/yxs_weizhongxian.jpg', + 'image/card/yxs_wuzetian.jpg', + 'image/card/yxs_xiangyu.jpg', + 'image/card/yxs_xiaoqiao.jpg', + 'image/card/yxs_yangguang.jpg', + 'image/card/yxs_yangyuhuan.jpg', + 'image/card/yxs_yingzheng.jpg', + 'image/card/yxs_yuefei.jpg', + 'image/card/yxs_yujix.jpg', + 'image/card/yxs_zhangsanfeng.jpg', + 'image/card/yxs_zhaoyong.jpg', + 'image/card/yxs_zhuyuanzhang.jpg', + 'image/card/zangba.jpg', + 'image/card/zerong.jpg', + 'image/card/zhangbao.jpg', + 'image/card/zhangchangpu.jpg', + 'image/card/zhangchu.jpg', + 'image/card/zhangchunhua.jpg', + 'image/card/zhangfei.jpg', + 'image/card/zhangfen.jpg', + 'image/card/zhanggong.jpg', + 'image/card/zhanghe.jpg', + 'image/card/zhangheng.jpg', + 'image/card/zhanghu.jpg', + 'image/card/zhanghua.jpg', + 'image/card/zhanghuyuechen.jpg', + 'image/card/zhangji.jpg', + 'image/card/zhangjiao.jpg', + 'image/card/zhangjinyun.jpg', + 'image/card/zhangkai.jpg', + 'image/card/zhangliang.jpg', + 'image/card/zhangliao.jpg', + 'image/card/zhangling.jpg', + 'image/card/zhanglu.jpg', + 'image/card/zhangmiao.jpg', + 'image/card/zhangning.jpg', + 'image/card/zhangqiying.jpg', + 'image/card/zhangrang.jpg', + 'image/card/zhangren.jpg', + 'image/card/zhangshiping.jpg', + 'image/card/zhangsong.jpg', + 'image/card/zhangwen.jpg', + 'image/card/zhangxingcai.jpg', + 'image/card/zhangxiu.jpg', + 'image/card/zhangxuan.jpg', + 'image/card/zhangxun.jpg', + 'image/card/zhangyan.jpg', + 'image/card/zhangyao.jpg', + 'image/card/zhangyi.jpg', + 'image/card/zhangyì.jpg', + 'image/card/zhangzhang.jpg', + 'image/card/zhangzhi.jpg', + 'image/card/zhangzhongjing.jpg', + 'image/card/zhaoang.jpg', + 'image/card/zhaotongzhaoguang.jpg', + 'image/card/zhaoxiang.jpg', + 'image/card/zhaoyan.jpg', + 'image/card/zhaoyǎn.jpg', + 'image/card/zhaoyun.jpg', + 'image/card/zhaozhi.jpg', + 'image/card/zhaozhong.jpg', + 'image/card/zhenghun.jpg', + 'image/card/zhengxuan.jpg', + 'image/card/zhenji.jpg', + 'image/card/zhonghui.jpg', + 'image/card/zhongyan.jpg', + 'image/card/zhongyao.jpg', + 'image/card/zhoubuyi.jpg', + 'image/card/zhoucang.jpg', + 'image/card/zhouchu.jpg', + 'image/card/zhoufang.jpg', + 'image/card/zhoufei.jpg', + 'image/card/zhouqun.jpg', + 'image/card/zhoushan.jpg', + 'image/card/zhoutai.jpg', + 'image/card/zhouyi.jpg', + 'image/card/zhouyu.jpg', + 'image/card/zhugedan.jpg', + 'image/card/zhugeguo.jpg', + 'image/card/zhugejin.jpg', + 'image/card/zhugeke.jpg', + 'image/card/zhugeliang.jpg', + 'image/card/zhugeruoxue.jpg', + 'image/card/zhugeshang.jpg', + 'image/card/zhugezhan.jpg', + 'image/card/zhuhuan.jpg', + 'image/card/zhujianping.jpg', + 'image/card/zhujun.jpg', + 'image/card/zhuling.jpg', + 'image/card/zhuran.jpg', + 'image/card/zhurong.jpg', + 'image/card/zhutiexiong.jpg', + 'image/card/zhuzhi.jpg', + 'image/card/zongyu.jpg', + 'image/card/zoushi.jpg', + 'image/card/zumao.jpg', + 'image/card/zuoci.jpg', + 'image/card/zuofen.jpg', /*character image end*/ 'image/emotion/shibing_emotion/1.gif', @@ -8632,88 +8702,88 @@ window.noname_asset_list=[ 'image/mode/boss/card/xingtianpojunfu.png', 'image/mode/boss/card/niaobaidaowenha.png', - 'image/mode/boss/character/boss_bianchengwang.jpg', - 'image/mode/boss/character/boss_chujiangwang.jpg', - 'image/mode/boss/character/boss_dushiwang.jpg', - 'image/mode/boss/character/boss_pingdengwang.jpg', - 'image/mode/boss/character/boss_qinguangwang.jpg', - 'image/mode/boss/character/boss_songdiwang.jpg', - 'image/mode/boss/character/boss_taishanwang.jpg', - 'image/mode/boss/character/boss_wuguanwang.jpg', - 'image/mode/boss/character/boss_yanluowang.jpg', - 'image/mode/boss/character/boss_zhuanlunwang.jpg', - 'image/mode/boss/character/boss_dizangwang.jpg', - 'image/mode/boss/character/boss_mengpo.jpg', + 'image/mode/boss/boss_baihu.jpg', + 'image/mode/boss/boss_baimangshilian.jpg', + 'image/mode/boss/boss_baiwuchang.jpg', + 'image/mode/boss/boss_bianchengwang.jpg', + 'image/mode/boss/boss_bifang.jpg', + 'image/mode/boss/boss_caiwenji.jpg', + 'image/mode/boss/boss_caocao.jpg', + 'image/mode/boss/boss_chi.jpg', + 'image/mode/boss/boss_chiyanshilian.jpg', + 'image/mode/boss/boss_chujiangwang.jpg', + 'image/mode/boss/boss_diaochan.jpg', + 'image/mode/boss/boss_dizangwang.jpg', + 'image/mode/boss/boss_dongzhuo.jpg', + 'image/mode/boss/boss_dushiwang.jpg', + 'image/mode/boss/boss_guojia.jpg', + 'image/mode/boss/boss_heiwuchang.jpg', + 'image/mode/boss/boss_huangyueying.jpg', + 'image/mode/boss/boss_huatuo.jpg', + 'image/mode/boss/boss_hundun.jpg', + 'image/mode/boss/boss_huoshenzhurong.jpg', + 'image/mode/boss/boss_jinshenrushou.jpg', + 'image/mode/boss/boss_liang.jpg', + 'image/mode/boss/boss_liubei.jpg', + 'image/mode/boss/boss_luocha.jpg', + 'image/mode/boss/boss_luxun.jpg', + 'image/mode/boss/boss_lvbu1.jpg', + 'image/mode/boss/boss_lvbu2.jpg', + 'image/mode/boss/boss_lvbu3.jpg', + 'image/mode/boss/boss_mamian.jpg', + 'image/mode/boss/boss_mengpo.jpg', + 'image/mode/boss/boss_mingxingzhu.jpg', + 'image/mode/boss/boss_mo.jpg', + 'image/mode/boss/boss_mushengoumang.jpg', + 'image/mode/boss/boss_nianshou.jpg', + 'image/mode/boss/boss_nianshou_baonu.jpg', + 'image/mode/boss/boss_nianshou_heti.jpg', + 'image/mode/boss/boss_nianshou_jingjue.jpg', + 'image/mode/boss/boss_nianshou_renxing.jpg', + 'image/mode/boss/boss_nianshou_ruizhi.jpg', + 'image/mode/boss/boss_niutou.jpg', + 'image/mode/boss/boss_pangtong.jpg', + 'image/mode/boss/boss_pingdengwang.jpg', + 'image/mode/boss/boss_qinglong.jpg', + 'image/mode/boss/boss_qingmushilian.jpg', + 'image/mode/boss/boss_qinguangwang.jpg', + 'image/mode/boss/boss_qiongqi.jpg', + 'image/mode/boss/boss_satan.jpg', + 'image/mode/boss/boss_shaohao.jpg', + 'image/mode/boss/boss_shuijing.jpg', + 'image/mode/boss/boss_shuishengonggong.jpg', + 'image/mode/boss/boss_shuishenxuanming.jpg', + 'image/mode/boss/boss_shujing.jpg', + 'image/mode/boss/boss_songdiwang.jpg', + 'image/mode/boss/boss_sunshangxiang.jpg', + 'image/mode/boss/boss_taihao.jpg', + 'image/mode/boss/boss_taishanwang.jpg', + 'image/mode/boss/boss_taotie.jpg', + 'image/mode/boss/boss_taowu.jpg', + 'image/mode/boss/boss_wang.jpg', + 'image/mode/boss/boss_wuguanwang.jpg', + 'image/mode/boss/boss_xiangliu.jpg', + 'image/mode/boss/boss_xuanlinshilian.jpg', + 'image/mode/boss/boss_xuanwu.jpg', + 'image/mode/boss/boss_yandi.jpg', + 'image/mode/boss/boss_yanling.jpg', + 'image/mode/boss/boss_yanluowang.jpg', + 'image/mode/boss/boss_yecha.jpg', + 'image/mode/boss/boss_yingzhao.jpg', + 'image/mode/boss/boss_yuji.jpg', + 'image/mode/boss/boss_zhangchunhua.jpg', + 'image/mode/boss/boss_zhangjiao.jpg', + 'image/mode/boss/boss_zhenji.jpg', + 'image/mode/boss/boss_zhouyu.jpg', + 'image/mode/boss/boss_zhuanlunwang.jpg', + 'image/mode/boss/boss_zhuanxu.jpg', + 'image/mode/boss/boss_zhugeliang.jpg', + 'image/mode/boss/boss_zhuoguiquxie.jpg', + 'image/mode/boss/boss_zhuque.jpg', + 'image/mode/boss/boss_zhuyan.jpg', + 'image/mode/boss/boss_zhuyin.jpg', + 'image/mode/boss/boss_zuoci.jpg', - 'image/mode/boss/character/boss_xiangliu.jpg', - 'image/mode/boss/character/boss_zhuyan.jpg', - 'image/mode/boss/character/boss_bifang.jpg', - 'image/mode/boss/character/boss_yingzhao.jpg', - 'image/mode/boss/character/boss_baihu.jpg', - 'image/mode/boss/character/boss_baimangshilian.jpg', - 'image/mode/boss/character/boss_baiwuchang.jpg', - 'image/mode/boss/character/boss_caiwenji.jpg', - 'image/mode/boss/character/boss_caocao.jpg', - 'image/mode/boss/character/boss_chi.jpg', - 'image/mode/boss/character/boss_chiyanshilian.jpg', - 'image/mode/boss/character/boss_diaochan.jpg', - 'image/mode/boss/character/boss_dongzhuo.jpg', - 'image/mode/boss/character/boss_guojia.jpg', - 'image/mode/boss/character/boss_heiwuchang.jpg', - 'image/mode/boss/character/boss_huangyueying.jpg', - 'image/mode/boss/character/boss_huatuo.jpg', - 'image/mode/boss/character/boss_hundun.jpg', - 'image/mode/boss/character/boss_huoshenzhurong.jpg', - 'image/mode/boss/character/boss_jinshenrushou.jpg', - 'image/mode/boss/character/boss_liang.jpg', - 'image/mode/boss/character/boss_liubei.jpg', - 'image/mode/boss/character/boss_luocha.jpg', - 'image/mode/boss/character/boss_luxun.jpg', - 'image/mode/boss/character/boss_lvbu1.jpg', - 'image/mode/boss/character/boss_lvbu2.jpg', - 'image/mode/boss/character/boss_lvbu3.jpg', - 'image/mode/boss/character/boss_mamian.jpg', - 'image/mode/boss/character/boss_mingxingzhu.jpg', - 'image/mode/boss/character/boss_mo.jpg', - 'image/mode/boss/character/boss_mushengoumang.jpg', - 'image/mode/boss/character/boss_nianshou.jpg', - 'image/mode/boss/character/boss_nianshou_baonu.jpg', - 'image/mode/boss/character/boss_nianshou_heti.jpg', - 'image/mode/boss/character/boss_nianshou_jingjue.jpg', - 'image/mode/boss/character/boss_nianshou_renxing.jpg', - 'image/mode/boss/character/boss_nianshou_ruizhi.jpg', - 'image/mode/boss/character/boss_niutou.jpg', - 'image/mode/boss/character/boss_pangtong.jpg', - 'image/mode/boss/character/boss_qinglong.jpg', - 'image/mode/boss/character/boss_qingmushilian.jpg', - 'image/mode/boss/character/boss_qiongqi.jpg', - 'image/mode/boss/character/boss_satan.jpg', - 'image/mode/boss/character/boss_shaohao.jpg', - 'image/mode/boss/character/boss_shuijing.jpg', - 'image/mode/boss/character/boss_shuishengonggong.jpg', - 'image/mode/boss/character/boss_shuishenxuanming.jpg', - 'image/mode/boss/character/boss_shujing.jpg', - 'image/mode/boss/character/boss_sunshangxiang.jpg', - 'image/mode/boss/character/boss_taihao.jpg', - 'image/mode/boss/character/boss_taotie.jpg', - 'image/mode/boss/character/boss_taowu.jpg', - 'image/mode/boss/character/boss_wang.jpg', - 'image/mode/boss/character/boss_xuanlinshilian.jpg', - 'image/mode/boss/character/boss_xuanwu.jpg', - 'image/mode/boss/character/boss_yandi.jpg', - 'image/mode/boss/character/boss_yanling.jpg', - 'image/mode/boss/character/boss_yecha.jpg', - 'image/mode/boss/character/boss_yuji.jpg', - 'image/mode/boss/character/boss_zhangchunhua.jpg', - 'image/mode/boss/character/boss_zhangjiao.jpg', - 'image/mode/boss/character/boss_zhenji.jpg', - 'image/mode/boss/character/boss_zhouyu.jpg', - 'image/mode/boss/character/boss_zhuanxu.jpg', - 'image/mode/boss/character/boss_zhugeliang.jpg', - 'image/mode/boss/character/boss_zhuoguiquxie.jpg', - 'image/mode/boss/character/boss_zhuque.jpg', - 'image/mode/boss/character/boss_zhuyin.jpg', - 'image/mode/boss/character/boss_zuoci.jpg', 'image/mode/chess/card/chess_chuzhang.png', 'image/mode/chess/card/chess_shezhang.png', 'image/mode/chess/character/chess_beimingjukun.jpg', diff --git a/game/config.js b/game/config.js index 62c0c8735..8647acd4f 100644 --- a/game/config.js +++ b/game/config.js @@ -1,6 +1,6 @@ window.config={ extension_sources:{ - 'GitHub Proxy':'https://ghproxy.com/https://raw.githubusercontent.com/libccy/noname-extension/master/', + 'GitHub Proxy':'https://mirror.ghproxy.com/https://raw.githubusercontent.com/libccy/noname-extension/master/', FastGit:'https://raw.fgit.cf/libccy/noname-extension/master/', GitHub:'https://raw.githubusercontent.com/libccy/noname-extension/master/' }, diff --git a/game/core-js-bundle.js b/game/core-js-bundle.js index bbca29b3c..aa0e34730 100644 --- a/game/core-js-bundle.js +++ b/game/core-js-bundle.js @@ -1,7 +1,7 @@ /** - * core-js 3.33.0 + * core-js 3.33.2 * © 2014-2023 Denis Pushkarev (zloirock.ru) - * license: https://github.com/zloirock/core-js/blob/v3.33.0/LICENSE + * license: https://github.com/zloirock/core-js/blob/v3.33.2/LICENSE * source: https://github.com/zloirock/core-js */ !function (undefined) { 'use strict'; /******/ (function(modules) { // webpackBootstrap @@ -721,14 +721,15 @@ if (!NATIVE_SYMBOL) { var description = !arguments.length || arguments[0] === undefined ? undefined : $toString(arguments[0]); var tag = uid(description); var setter = function (value) { - if (this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); - if (hasOwn(this, HIDDEN) && hasOwn(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + var $this = this === undefined ? global : this; + if ($this === ObjectPrototype) call(setter, ObjectPrototypeSymbols, value); + if (hasOwn($this, HIDDEN) && hasOwn($this[HIDDEN], tag)) $this[HIDDEN][tag] = false; var descriptor = createPropertyDescriptor(1, value); try { - setSymbolDescriptor(this, tag, descriptor); + setSymbolDescriptor($this, tag, descriptor); } catch (error) { if (!(error instanceof RangeError)) throw error; - fallbackDefineProperty(this, tag, descriptor); + fallbackDefineProperty($this, tag, descriptor); } }; if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter }); @@ -1483,10 +1484,10 @@ var store = __webpack_require__(37); (module.exports = function (key, value) { return store[key] || (store[key] = value !== undefined ? value : {}); })('versions', []).push({ - version: '3.33.0', + version: '3.33.2', mode: IS_PURE ? 'pure' : 'global', copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)', - license: 'https://github.com/zloirock/core-js/blob/v3.33.0/LICENSE', + license: 'https://github.com/zloirock/core-js/blob/v3.33.2/LICENSE', source: 'https://github.com/zloirock/core-js' }); @@ -3758,7 +3759,6 @@ if (ErrorPrototype.toString !== errorToString) { var DESCRIPTORS = __webpack_require__(6); var fails = __webpack_require__(7); var anObject = __webpack_require__(47); -var create = __webpack_require__(72); var normalizeStringArgument = __webpack_require__(121); var nativeErrorToString = Error.prototype.toString; @@ -3766,8 +3766,8 @@ var nativeErrorToString = Error.prototype.toString; var INCORRECT_TO_STRING = fails(function () { if (DESCRIPTORS) { // Chrome 32- incorrectly call accessor - // eslint-disable-next-line es/no-object-defineproperty -- safe - var object = create(Object.defineProperty({}, 'name', { get: function () { + // eslint-disable-next-line es/no-object-create, es/no-object-defineproperty -- safe + var object = Object.create(Object.defineProperty({}, 'name', { get: function () { return this === object; } })); if (nativeErrorToString.call(object) !== 'true') return true; @@ -4977,13 +4977,12 @@ module.exports = defineIterator(Array, 'Array', function (iterated, kind) { }, function () { var state = getInternalState(this); var target = state.target; - var kind = state.kind; var index = state.index++; if (!target || index >= target.length) { state.target = undefined; return createIterResultObject(undefined, true); } - switch (kind) { + switch (state.kind) { case 'keys': return createIterResultObject(index, false); case 'values': return createIterResultObject(target[index], false); } return createIterResultObject([index, target[index]], false); @@ -6008,11 +6007,11 @@ var uncurryThis = __webpack_require__(14); var aCallable = __webpack_require__(31); var toIndexedObject = __webpack_require__(12); var arrayFromConstructorAndList = __webpack_require__(199); -var getVirtual = __webpack_require__(200); +var getBuiltInPrototypeMethod = __webpack_require__(200); var addToUnscopables = __webpack_require__(140); var $Array = Array; -var sort = uncurryThis(getVirtual('Array').sort); +var sort = uncurryThis(getBuiltInPrototypeMethod('Array', 'sort')); // `Array.prototype.toSorted` method // https://tc39.es/ecma262/#sec-array.prototype.tosorted @@ -6053,8 +6052,10 @@ module.exports = function (Constructor, list) { var global = __webpack_require__(4); -module.exports = function (CONSTRUCTOR) { - return global[CONSTRUCTOR].prototype; +module.exports = function (CONSTRUCTOR, METHOD) { + var Constructor = global[CONSTRUCTOR]; + var Prototype = Constructor && Constructor.prototype; + return Prototype && Prototype[METHOD]; }; @@ -15957,14 +15958,14 @@ var getIterator = __webpack_require__(135); var getIteratorDirect = __webpack_require__(496); var getIteratorMethod = __webpack_require__(136); var getMethod = __webpack_require__(30); -var getVirtual = __webpack_require__(200); var getBuiltIn = __webpack_require__(24); +var getBuiltInPrototypeMethod = __webpack_require__(200); var wellKnownSymbol = __webpack_require__(34); var AsyncFromSyncIterator = __webpack_require__(494); var toArray = __webpack_require__(497).toArray; var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator'); -var arrayIterator = uncurryThis(getVirtual('Array').values); +var arrayIterator = uncurryThis(getBuiltInPrototypeMethod('Array', 'values')); var arrayIteratorNext = uncurryThis(arrayIterator([]).next); var safeArrayIterator = function () { @@ -17721,7 +17722,7 @@ var AsyncFromSyncIterator = __webpack_require__(494); var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator'); -module.exports = function from(obj) { +module.exports = function (obj) { var object = anObject(obj); var alreadyAsync = true; var method = getMethod(object, ASYNC_ITERATOR); @@ -18272,7 +18273,7 @@ var uncurryThis = __webpack_require__(14); var getUint8 = uncurryThis(DataView.prototype.getUint8); // `DataView.prototype.getUint8Clamped` method -// https://github.com/tc39/proposal-dataview-get-set-uint8c +// https://github.com/tc39/proposal-dataview-get-set-uint8clamped $({ target: 'DataView', proto: true, forced: true }, { getUint8Clamped: function getUint8Clamped(byteOffset) { return getUint8(this, byteOffset); @@ -18345,7 +18346,7 @@ var $TypeError = TypeError; var setUint8 = uncurryThis(DataView.prototype.setUint8); // `DataView.prototype.setUint8Clamped` method -// https://github.com/tc39/proposal-dataview-get-set-uint8c +// https://github.com/tc39/proposal-dataview-get-set-uint8clamped $({ target: 'DataView', proto: true, forced: true }, { setUint8Clamped: function setUint8Clamped(byteOffset, value) { if (classof(this) !== 'DataView') throw new $TypeError('Incorrect receiver'); @@ -20734,18 +20735,19 @@ var INVALID_RADIX = 'Invalid radix'; var $RangeError = RangeError; var $SyntaxError = SyntaxError; var $TypeError = TypeError; -var valid = /^[\da-z]+$/; +var pow = Math.pow; +var valid = /^[\d.a-z]+$/; var charAt = uncurryThis(''.charAt); var exec = uncurryThis(valid.exec); var numberToString = uncurryThis(1.0.toString); var stringSlice = uncurryThis(''.slice); +var split = uncurryThis(''.split); // `Number.fromString` method // https://github.com/tc39/proposal-number-fromstring $({ target: 'Number', stat: true, forced: true }, { fromString: function fromString(string, radix) { var sign = 1; - var R, mathNum; if (typeof string != 'string') throw new $TypeError(INVALID_NUMBER_REPRESENTATION); if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION); if (charAt(string, 0) === '-') { @@ -20753,11 +20755,13 @@ $({ target: 'Number', stat: true, forced: true }, { string = stringSlice(string, 1); if (!string.length) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION); } - R = radix === undefined ? 10 : toIntegerOrInfinity(radix); + var R = radix === undefined ? 10 : toIntegerOrInfinity(radix); if (R < 2 || R > 36) throw new $RangeError(INVALID_RADIX); - if (!exec(valid, string) || numberToString(mathNum = parseInt(string, R), R) !== string) { - throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION); - } + if (!exec(valid, string)) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION); + var parts = split(string, '.'); + var mathNum = parseInt(parts[0], R); + if (parts.length > 1) mathNum += parseInt(parts[1], R) / pow(R, parts[1].length); + if (numberToString(mathNum, R) !== string) throw new $SyntaxError(INVALID_NUMBER_REPRESENTATION); return sign * mathNum; } }); @@ -23203,7 +23207,6 @@ defineWellKnownSymbol('matcher'); "use strict"; -// TODO: Remove from `core-js@4` var defineWellKnownSymbol = __webpack_require__(81); // `Symbol.metadata` well-known symbol @@ -23217,6 +23220,7 @@ defineWellKnownSymbol('metadata'); "use strict"; +// TODO: Remove from `core-js@4` var defineWellKnownSymbol = __webpack_require__(81); // `Symbol.metadataKey` well-known symbol @@ -24449,7 +24453,7 @@ try { var IS_PURE = __webpack_require__(36); var $ = __webpack_require__(3); var global = __webpack_require__(4); -var getBuiltin = __webpack_require__(24); +var getBuiltIn = __webpack_require__(24); var uncurryThis = __webpack_require__(14); var fails = __webpack_require__(7); var uid = __webpack_require__(41); @@ -24469,7 +24473,8 @@ var validateArgumentsLength = __webpack_require__(329); var getRegExpFlags = __webpack_require__(369); var MapHelpers = __webpack_require__(506); var SetHelpers = __webpack_require__(659); -var arrayBufferTransfer = __webpack_require__(519); +var setIterate = __webpack_require__(664); +var detachTransferable = __webpack_require__(520); var ERROR_STACK_INSTALLABLE = __webpack_require__(125); var PROPER_STRUCTURED_CLONE_TRANSFER = __webpack_require__(522); @@ -24477,25 +24482,17 @@ var Object = global.Object; var Array = global.Array; var Date = global.Date; var Error = global.Error; -var EvalError = global.EvalError; -var RangeError = global.RangeError; -var ReferenceError = global.ReferenceError; -var SyntaxError = global.SyntaxError; var TypeError = global.TypeError; -var URIError = global.URIError; var PerformanceMark = global.PerformanceMark; -var WebAssembly = global.WebAssembly; -var CompileError = WebAssembly && WebAssembly.CompileError || Error; -var LinkError = WebAssembly && WebAssembly.LinkError || Error; -var RuntimeError = WebAssembly && WebAssembly.RuntimeError || Error; -var DOMException = getBuiltin('DOMException'); +var DOMException = getBuiltIn('DOMException'); var Map = MapHelpers.Map; var mapHas = MapHelpers.has; var mapGet = MapHelpers.get; var mapSet = MapHelpers.set; var Set = SetHelpers.Set; var setAdd = SetHelpers.add; -var objectKeys = getBuiltin('Object', 'keys'); +var setHas = SetHelpers.has; +var objectKeys = getBuiltIn('Object', 'keys'); var push = uncurryThis([].push); var thisBooleanValue = uncurryThis(true.valueOf); var thisNumberValue = uncurryThis(1.0.valueOf); @@ -24510,7 +24507,7 @@ var checkBasicSemantic = function (structuredCloneImplementation) { var set1 = new global.Set([7]); var set2 = structuredCloneImplementation(set1); var number = structuredCloneImplementation(Object(7)); - return set2 === set1 || !set2.has(7) || typeof number != 'object' || +number !== 7; + return set2 === set1 || !set2.has(7) || !isObject(number) || +number !== 7; }) && structuredCloneImplementation; }; @@ -24606,10 +24603,10 @@ var cloneBuffer = function (value, map, $type) { // `ArrayBuffer#slice` is not available in IE10 // `ArrayBuffer#slice` and `DataView` are not available in old FF - if (!DataView && typeof value.slice != 'function') throwUnpolyfillable('ArrayBuffer'); + if (!DataView && !isCallable(value.slice)) throwUnpolyfillable('ArrayBuffer'); // detached buffers throws in `DataView` and `.slice` try { - if (typeof value.slice == 'function' && !value.resizable) { + if (isCallable(value.slice) && !value.resizable) { clone = value.slice(0); } else { length = value.byteLength; @@ -24639,13 +24636,7 @@ var cloneView = function (value, type, offset, length, map) { return new C(cloneBuffer(value.buffer, map), offset, length); }; -var Placeholder = function (object, type, metadata) { - this.object = object; - this.type = type; - this.metadata = metadata; -}; - -var structuredCloneInternal = function (value, map, transferredBuffers) { +var structuredCloneInternal = function (value, map) { if (isSymbol(value)) throwUncloneable('Symbol'); if (!isObject(value)) return value; // effectively preserves circular references @@ -24678,34 +24669,21 @@ var structuredCloneInternal = function (value, map, transferredBuffers) { name = value.name; switch (name) { case 'AggregateError': - cloned = new (getBuiltin('AggregateError'))([]); + cloned = new (getBuiltIn(name))([]); break; case 'EvalError': - cloned = new EvalError(); - break; case 'RangeError': - cloned = new RangeError(); - break; case 'ReferenceError': - cloned = new ReferenceError(); - break; + case 'SuppressedError': case 'SyntaxError': - cloned = new SyntaxError(); - break; case 'TypeError': - cloned = new TypeError(); - break; case 'URIError': - cloned = new URIError(); + cloned = new (getBuiltIn(name))(); break; case 'CompileError': - cloned = new CompileError(); - break; case 'LinkError': - cloned = new LinkError(); - break; case 'RuntimeError': - cloned = new RuntimeError(); + cloned = new (getBuiltIn('WebAssembly', name))(); break; default: cloned = new Error(); @@ -24716,9 +24694,7 @@ var structuredCloneInternal = function (value, map, transferredBuffers) { break; case 'ArrayBuffer': case 'SharedArrayBuffer': - cloned = transferredBuffers - ? new Placeholder(value, type) - : cloneBuffer(value, map, type); + cloned = cloneBuffer(value, map, type); break; case 'DataView': case 'Int8Array': @@ -24734,17 +24710,15 @@ var structuredCloneInternal = function (value, map, transferredBuffers) { case 'BigInt64Array': case 'BigUint64Array': length = type === 'DataView' ? value.byteLength : value.length; - cloned = transferredBuffers - ? new Placeholder(value, type, { offset: value.byteOffset, length: length }) - : cloneView(value, type, value.byteOffset, length, map); + cloned = cloneView(value, type, value.byteOffset, length, map); break; case 'DOMQuad': try { cloned = new DOMQuad( - structuredCloneInternal(value.p1, map, transferredBuffers), - structuredCloneInternal(value.p2, map, transferredBuffers), - structuredCloneInternal(value.p3, map, transferredBuffers), - structuredCloneInternal(value.p4, map, transferredBuffers) + structuredCloneInternal(value.p1, map), + structuredCloneInternal(value.p2, map), + structuredCloneInternal(value.p3, map), + structuredCloneInternal(value.p4, map) ); } catch (error) { cloned = tryNativeRestrictedStructuredClone(value, type); @@ -24765,7 +24739,7 @@ var structuredCloneInternal = function (value, map, transferredBuffers) { dataTransfer = createDataTransfer(); if (dataTransfer) { for (i = 0, length = lengthOfArrayLike(value); i < length; i++) { - dataTransfer.items.add(structuredCloneInternal(value[i], map, transferredBuffers)); + dataTransfer.items.add(structuredCloneInternal(value[i], map)); } cloned = dataTransfer.files; } else cloned = tryNativeRestrictedStructuredClone(value, type); @@ -24774,7 +24748,7 @@ var structuredCloneInternal = function (value, map, transferredBuffers) { // Safari 9 ImageData is a constructor, but typeof ImageData is 'object' try { cloned = new ImageData( - structuredCloneInternal(value.data, map, transferredBuffers), + structuredCloneInternal(value.data, map), value.width, value.height, { colorSpace: value.colorSpace } @@ -24871,105 +24845,38 @@ var structuredCloneInternal = function (value, map, transferredBuffers) { keys = objectKeys(value); for (i = 0, length = lengthOfArrayLike(keys); i < length; i++) { key = keys[i]; - createProperty(cloned, key, structuredCloneInternal(value[key], map, transferredBuffers)); + createProperty(cloned, key, structuredCloneInternal(value[key], map)); } break; case 'Map': value.forEach(function (v, k) { - mapSet(cloned, structuredCloneInternal(k, map, transferredBuffers), structuredCloneInternal(v, map, transferredBuffers)); + mapSet(cloned, structuredCloneInternal(k, map), structuredCloneInternal(v, map)); }); break; case 'Set': value.forEach(function (v) { - setAdd(cloned, structuredCloneInternal(v, map, transferredBuffers)); + setAdd(cloned, structuredCloneInternal(v, map)); }); break; case 'Error': - createNonEnumerableProperty(cloned, 'message', structuredCloneInternal(value.message, map, transferredBuffers)); + createNonEnumerableProperty(cloned, 'message', structuredCloneInternal(value.message, map)); if (hasOwn(value, 'cause')) { - createNonEnumerableProperty(cloned, 'cause', structuredCloneInternal(value.cause, map, transferredBuffers)); + createNonEnumerableProperty(cloned, 'cause', structuredCloneInternal(value.cause, map)); } if (name === 'AggregateError') { - cloned.errors = structuredCloneInternal(value.errors, map, transferredBuffers); + cloned.errors = structuredCloneInternal(value.errors, map); + } else if (name === 'SuppressedError') { + cloned.error = structuredCloneInternal(value.error, map); + cloned.suppressed = structuredCloneInternal(value.suppressed, map); } // break omitted case 'DOMException': if (ERROR_STACK_INSTALLABLE) { - createNonEnumerableProperty(cloned, 'stack', structuredCloneInternal(value.stack, map, transferredBuffers)); + createNonEnumerableProperty(cloned, 'stack', structuredCloneInternal(value.stack, map)); } } return cloned; }; -var replacePlaceholders = function (value, map) { - if (!isObject(value)) return value; - if (mapHas(map, value)) return mapGet(map, value); - - var type, object, metadata, i, length, keys, key, replacement; - - if (value instanceof Placeholder) { - type = value.type; - object = value.object; - - switch (type) { - case 'ArrayBuffer': - case 'SharedArrayBuffer': - replacement = cloneBuffer(object, map, type); - break; - case 'DataView': - case 'Int8Array': - case 'Uint8Array': - case 'Uint8ClampedArray': - case 'Int16Array': - case 'Uint16Array': - case 'Int32Array': - case 'Uint32Array': - case 'Float16Array': - case 'Float32Array': - case 'Float64Array': - case 'BigInt64Array': - case 'BigUint64Array': - metadata = value.metadata; - replacement = cloneView(object, type, metadata.offset, metadata.length, map); - } - } else switch (classof(value)) { - case 'Array': - case 'Object': - keys = objectKeys(value); - for (i = 0, length = lengthOfArrayLike(keys); i < length; i++) { - key = keys[i]; - value[key] = replacePlaceholders(value[key], map); - } break; - case 'Map': - replacement = new Map(); - value.forEach(function (v, k) { - mapSet(replacement, replacePlaceholders(k, map), replacePlaceholders(v, map)); - }); - break; - case 'Set': - replacement = new Set(); - value.forEach(function (v) { - setAdd(replacement, replacePlaceholders(v, map)); - }); - break; - case 'Error': - value.message = replacePlaceholders(value.message, map); - if (hasOwn(value, 'cause')) { - value.cause = replacePlaceholders(value.cause, map); - } - if (value.name === 'AggregateError') { - value.errors = replacePlaceholders(value.errors, map); - } // break omitted - case 'DOMException': - if (ERROR_STACK_INSTALLABLE) { - value.stack = replacePlaceholders(value.stack, map); - } - } - - mapSet(map, value, replacement || value); - - return replacement || value; -}; - var tryToTransfer = function (rawTransfer, map) { if (!isObject(rawTransfer)) throw new TypeError('Transfer option cannot be converted to a sequence'); @@ -24981,7 +24888,7 @@ var tryToTransfer = function (rawTransfer, map) { var i = 0; var length = lengthOfArrayLike(transfer); - var buffers = []; + var buffers = new Set(); var value, type, C, transferred, canvas, context; while (i < length) { @@ -24989,12 +24896,14 @@ var tryToTransfer = function (rawTransfer, map) { type = classof(value); - if (type === 'ArrayBuffer') { - push(buffers, value); - continue; + if (type === 'ArrayBuffer' ? setHas(buffers, value) : mapHas(map, value)) { + throw new DOMException('Duplicate transferable', DATA_CLONE_ERROR); } - if (mapHas(map, value)) throw new DOMException('Duplicate transferable', DATA_CLONE_ERROR); + if (type === 'ArrayBuffer') { + setAdd(buffers, value); + continue; + } if (PROPER_STRUCTURED_CLONE_TRANSFER) { transferred = nativeStructuredClone(value, { transfer: [value] }); @@ -25034,25 +24943,18 @@ var tryToTransfer = function (rawTransfer, map) { return buffers; }; -var tryToTransferBuffers = function (transfer, map) { - var i = 0; - var length = lengthOfArrayLike(transfer); - var value, transferred; - - while (i < length) { - value = transfer[i++]; - - if (mapHas(map, value)) throw new DOMException('Duplicate transferable', DATA_CLONE_ERROR); - - if (arrayBufferTransfer) { - transferred = arrayBufferTransfer(value, undefined, true); +var detachBuffers = function (buffers) { + setIterate(buffers, function (buffer) { + if (PROPER_STRUCTURED_CLONE_TRANSFER) { + nativeRestrictedStructuredClone(buffer, { transfer: [buffer] }); + } else if (isCallable(buffer.transfer)) { + buffer.transfer(); + } else if (detachTransferable) { + detachTransferable(buffer); } else { - if (!isCallable(value.transfer)) throwUnpolyfillable('ArrayBuffer', TRANSFERRING); - transferred = value.transfer(); + throwUnpolyfillable('ArrayBuffer', TRANSFERRING); } - - mapSet(map, value, transferred); - } + }); }; // `structuredClone` method @@ -25061,24 +24963,18 @@ $({ global: true, enumerable: true, sham: !PROPER_STRUCTURED_CLONE_TRANSFER, for structuredClone: function structuredClone(value /* , { transfer } */) { var options = validateArgumentsLength(arguments.length, 1) > 1 && !isNullOrUndefined(arguments[1]) ? anObject(arguments[1]) : undefined; var transfer = options ? options.transfer : undefined; - var transferredBuffers = false; var map, buffers; if (transfer !== undefined) { map = new Map(); buffers = tryToTransfer(transfer, map); - transferredBuffers = !!lengthOfArrayLike(buffers); } - var clone = structuredCloneInternal(value, map, transferredBuffers); + var clone = structuredCloneInternal(value, map); - // since of an issue with cloning views of transferred buffers, we a forced to transfer / clone them in 2 steps + // since of an issue with cloning views of transferred buffers, we a forced to detach them later // https://github.com/zloirock/core-js/issues/1265 - if (transferredBuffers) { - map = new Map(); - tryToTransferBuffers(transfer, map); - clone = replacePlaceholders(clone, map); - } + if (buffers) detachBuffers(buffers); return clone; } @@ -26468,6 +26364,7 @@ var create = __webpack_require__(72); var createPropertyDescriptor = __webpack_require__(11); var getIterator = __webpack_require__(135); var getIteratorMethod = __webpack_require__(136); +var createIterResultObject = __webpack_require__(173); var validateArgumentsLength = __webpack_require__(329); var wellKnownSymbol = __webpack_require__(34); var arraySort = __webpack_require__(189); @@ -26556,17 +26453,23 @@ var serialize = function (it) { var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) { setInternalState(this, { type: URL_SEARCH_PARAMS_ITERATOR, - iterator: getIterator(getInternalParamsState(params).entries), + target: getInternalParamsState(params).entries, + index: 0, kind: kind }); -}, 'Iterator', function next() { +}, URL_SEARCH_PARAMS, function next() { var state = getInternalIteratorState(this); - var kind = state.kind; - var step = state.iterator.next(); - var entry = step.value; - if (!step.done) { - step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value]; - } return step; + var target = state.target; + var index = state.index++; + if (!target || index >= target.length) { + state.target = undefined; + return createIterResultObject(undefined, true); + } + var entry = target[index]; + switch (state.kind) { + case 'keys': return createIterResultObject(entry.key, false); + case 'values': return createIterResultObject(entry.value, false); + } return createIterResultObject([entry.key, entry.value], false); }, true); var URLSearchParamsState = function (init) { @@ -26586,6 +26489,7 @@ URLSearchParamsState.prototype = { this.update(); }, parseObject: function (object) { + var entries = this.entries; var iteratorMethod = getIteratorMethod(object); var iterator, next, step, entryIterator, entryNext, first, second; @@ -26600,14 +26504,15 @@ URLSearchParamsState.prototype = { (second = call(entryNext, entryIterator)).done || !call(entryNext, entryIterator).done ) throw new TypeError('Expected sequence with length 2'); - push(this.entries, { key: $toString(first.value), value: $toString(second.value) }); + push(entries, { key: $toString(first.value), value: $toString(second.value) }); } } else for (var key in object) if (hasOwn(object, key)) { - push(this.entries, { key: key, value: $toString(object[key]) }); + push(entries, { key: key, value: $toString(object[key]) }); } }, parseQuery: function (query) { if (query) { + var entries = this.entries; var attributes = split(query, '&'); var index = 0; var attribute, entry; @@ -26615,7 +26520,7 @@ URLSearchParamsState.prototype = { attribute = attributes[index++]; if (attribute.length) { entry = split(attribute, '='); - push(this.entries, { + push(entries, { key: deserialize(shift(entry)), value: deserialize(join(entry, '=')) }); diff --git a/game/game.js b/game/game.js index 7fc6f30da..e7840298e 100644 --- a/game/game.js +++ b/game/game.js @@ -1,5 +1,15 @@ "use strict"; -{ +const nonameInitialized=localStorage.getItem('noname_inited'); +const assetURL=typeof nonameInitialized!='string'||nonameInitialized=='nodejs'?'':nonameInitialized; +new Promise(resolve=>{ + if('__core-js_shared__' in window) resolve(); + else{ + const coreJSBundle=document.createElement('script'); + coreJSBundle.onerror=coreJSBundle.onload=resolve; + coreJSBundle.src=`${assetURL}game/core-js-bundle.js`; + document.head.appendChild(coreJSBundle); + } +}).then(()=>{ /** * @typedef {InstanceType} Player * @typedef {InstanceType} Card @@ -36,7 +46,6 @@ } } } - const nonameInitialized=localStorage.getItem('noname_inited'); const GeneratorFunction=(function*(){}).constructor; // gnc: GeNCoroutine const gnc={ @@ -116,13 +125,13 @@ configprefix:'noname_0.9_', versionOL:27, updateURLS:{ - coding:'https://raw.fgit.cf/libccy/noname', + coding:'https://gitcode.net/sinat_33405273/noname/-/raw/', github:'https://raw.githubusercontent.com/libccy/noname', }, updateURL:'https://raw.githubusercontent.com/libccy/noname', - mirrorURL:'https://raw.fgit.cf/libccy/noname', + mirrorURL:'https://gitcode.net/sinat_33405273/noname/-/raw/', hallURL:'47.99.105.222', - assetURL:typeof nonameInitialized!='string'||nonameInitialized=='nodejs'?'':nonameInitialized, + assetURL:assetURL, userAgent:userAgent, compatibleEdition:Boolean(typeof nonameInitialized=='string'&&nonameInitialized.match(/\/(?:com\.widget|yuri\.nakamura)\.noname\//)), changeLog:[], @@ -172,7 +181,7 @@ extensions:[], extensionPack:{}, cardType:{}, - hook:{globaltrigger:{},globalskill:{}}, + hook:{globalskill:{}}, //函数钩子 hooks:{ // 本体势力的颜色 @@ -354,25 +363,181 @@ } }], }, - announce:{ - init(){ - _status._announce=document.createElement("Announce"); - _status._announce_cache=new Map(); - delete lib.announce.init; - }, - //推送一个对象给所有监听了name的订阅者。 + /** + * **无名杀频道推送机制** + * + * 鉴于`Javascript`的特性及自身对所需功能的思考,这是一个参考`Golang`的`channel`设计的、完全和`go channel`不一样的异步消息传递对象 + * + * 当且仅当接收方和发送方均存在时进行消息传递,完全保证信息传递的单一性(发送方/接收方一旦确定则无法更改)和准确性(发送方必然将消息发送给接收方) + * + * 若存在发送方/接收方时调用`send`/`receive`,将报错 + * + * 若需要异步/不报错发送信息,请等待`lib.actor` + * + * @template T + * @example + * // 创建一个频道 + * const channel = new lib.channel(); + * + * // 从某个角落接收channel发出的消息,若无消息则等待 + * const message = await channel.receive(); + * + * // 从某个角落向channel发消息,若无消息接收则等待 + * await channel.send(item); + */ + channel: class { + /** + * @template TValue + * @callback PromiseResolve + * @param {TValue} value + * @returns {void} + */ + constructor() { + /** + * @type {"active" | "receiving" | "sending"} + */ + this.status = "active"; + + /** + * @type {PromiseResolve | [T, PromiseResolve] | null} + */ + this._buffer = null; + } + + /** + * 向该频道发送消息,在消息未被接受前将等待 + * + * @param {T} value - 要发送的消息 + * @returns {Promise} + */ + send(value) { + return new Promise((resolve, reject) => { + switch (this.status) { + case "sending": + // TODO: handle the error. + reject(new Error()); + break; + case "receiving":{ + /** + * @type {PromiseResolve} + */ + const buffer = this._buffer; + this._buffer = null; + buffer(value); + this.status = "active"; + resolve(); + break ; + } + case "active": + this.status = "sending"; + this._buffer = [value, resolve]; + break; + } + }); + } + + /** + * 接收频道所发送的消息,若无消息发送则等待 + * + * @returns {Promise} 接收到的消息 + */ + receive() { + return new Promise((resolve, reject) => { + switch (this.status) { + case "receiving": + // TODO: handle the error. + reject(new Error()); + break; + case "sending":{ + /** + * @type {[T, PromiseResolve]} + */ + const buffer = this._buffer; + this._buffer = null; + resolve(buffer[0]); + this.status = "active"; + buffer[1](); + break ; + } + case "active": + this.status = "receiving"; + this._buffer = resolve; + break; + } + }); + } + }, + /** + * **无名杀消息推送库** + * + * 通过`EventTarget`机制,实现消息推送和接收的解耦, + * 从而使消息接收方无需依赖发布方,发布方也无需考虑接收方 + * + * > `lib.announce`不是`actor`模型,若不存在订阅者,则消息发送将无意义 + * + * @example + * // 甲扩展(如《千幻聆音》)在角色皮肤切换后,调用: + * lib.announce.publish("skinChange", { + * player, + * playerName: "zhangfei", + * originSkin: "image/xxx.jpg", + * currentSkin: "image/yyy.jpg" + * }); + * + * // 乙扩展监听此`skinChange`事件,并修改自己扩展相关界面的图片: + * const method = lib.announce.subscribe("skinChange", (e) => { + * div.setBackgroundImage(e.currentSkin); + * }); + * + * // 若此时乙扩展不想继续订阅`skinChange`事件,可以通过`unsubscribe`解除订阅 + * lib.announce.unsubscribe("skinChange", method); + */ + announce:new class{ + constructor(){ + /** + * @type {HTMLElement} + */ + this._announce=document.createElement("Announce"); + /** + * @type {Map} + */ + this._announce_cache=new Map(); + } + + /** + * 推送任意数据给所有监听了指定事件的订阅者,并返回给定的数据 + * + * 若不存在订阅指定事件的订阅者,则推送的数据将无意义 + * + * @template T + * @param {string} name - 要推送事件的名称 + * @param {T} values - 要推送的数据 + * @returns {T} + */ publish(name,values){ - if(_status._announce) _status._announce.dispatchEvent(new CustomEvent(name,{ + if(this._announce) this._announce.dispatchEvent(new CustomEvent(name,{ detail:values })); return values; - }, - //订阅name相关的事件。 + } + + /** + * 订阅给定名字的事件,并返回给定的函数 + * + * 在事件触发时执行给定的函数 + * + * 给定的函数将被存储至当前实例中,用于取消订阅时获取 + * + * @template T + * @param {string} name - 要订阅事件的名称 + * @param {(values: T) => void} method - 事件触发时执行的函数 + * @returns {(values: T) => void} + */ subscribe(name,method){ - if(_status._announce&&_status._announce_cache) { + if(this._announce&&this._announce_cache) { let subscribeFunction; - if(_status._announce_cache.has(method)){ - let records=_status._announce_cache.get(method); + if(this._announce_cache.has(method)){ + let records=this._announce_cache.get(method); subscribeFunction=records.get("Listener"); records.get("EventTargets").add(name); } @@ -381,21 +546,31 @@ let records=new Map(); records.set("Listener",subscribeFunction); records.set("EventTargets",[name]); - _status._announce_cache.set(method,records); + this._announce_cache.set(method,records); } - _status._announce.addEventListener(name,subscribeFunction); + this._announce.addEventListener(name,subscribeFunction); } return method; - }, - //取消对事件name的订阅 + } + + /** + * 取消指定事件某一函数的订阅,并返回该函数 + * + * 给定的函数将不再于事件触发时执行,其余同事件需触发的函数不受限制 + * + * @template T + * @param {string} name - 要取消订阅事件的名称 + * @param {(values: T) => void} method - 订阅指定事件的函数 + * @returns {(values: T) => void} + */ unsubscribe(name,method){ - if(_status._announce&&_status._announce_cache&&_status._announce_cache.has(method)){ - let records=_status._announce_cache.get(method); + if(this._announce&&this._announce_cache&&this._announce_cache.has(method)){ + let records=this._announce_cache.get(method); const listener=records.get("Listener"); let eventTargets=records.get("EventTargets"); eventTargets.remove(name); - if(eventTargets.length<=0) _status._announce_cache.remove(method); - _status._announce.removeEventListener(name,listener); + if(eventTargets.length<=0) this._announce_cache.remove(method); + this._announce.removeEventListener(name,listener); } return method; } @@ -1169,7 +1344,7 @@ init:'coding', unfrequent:true, item:{ - coding:'FastGit', + coding:'CSDN', github:'GitHub', }, onclick:function(item){ @@ -1390,25 +1565,30 @@ node.menu=ui.create.div(node,'','
    '); } }, - onclick:function(theme){ + onclick:gnc.of(function*(theme){ game.saveConfig('theme',theme); ui.arena.hide(); lib.init.background(); if(lib.config.autostyle){ - if(theme=='simple'){ - lib.configMenu.appearence.config.player_border.onclick('slim'); + if(theme === "simple"){ + lib.configMenu.appearence.config.player_border.onclick("slim"); } else{ - lib.configMenu.appearence.config.player_border.onclick('normal'); + lib.configMenu.appearence.config.player_border.onclick("normal"); } } - setTimeout(function(){ - var theme=ui.css.theme; - ui.css.theme=lib.init.css(lib.assetURL+'theme/'+lib.config.theme,'style'); - theme.remove(); - setTimeout(function(){ui.arena.show();},100); - },500); - } + lib.announce.publish("Noname.Apperaence.Theme.onChanging", theme); + yield new Promise(resolve => setTimeout(resolve, 500)); + + const deletingTheme = ui.css.theme; + ui.css.theme=lib.init.css(lib.assetURL+'theme/'+lib.config.theme,'style'); + deletingTheme.remove(); + lib.announce.publish("Noname.Apperaence.Theme.onChanged", theme); + yield new Promise(resolve => setTimeout(resolve, 100)); + + ui.arena.show(); + lib.announce.publish("Noname.Apperaence.Theme.onChangeFinished", theme); + }) }, layout:{ name:'布局', @@ -3770,7 +3950,7 @@ name:'显示状态栏', init:false, unfrequent:true, - content:function(bool){ + onclick:function(bool){ game.saveConfig('show_statusbar',bool); if(window.StatusBar&&lib.device=='android'){ if(bool){ @@ -4982,6 +5162,8 @@ map.connect_limit_zhu.hide(); map.connect_enhance_zhu.hide(); map.connect_double_nei.hide(); + map.connect_enable_commoner.hide(); + map.connect_enable_year_limit.show(); map.connect_zhong_card.show(); map.connect_special_identity.hide(); map.connect_double_character.show(); @@ -4992,6 +5174,8 @@ map.connect_limit_zhu.hide(); map.connect_enhance_zhu.hide(); map.connect_double_nei.hide(); + map.connect_enable_commoner.hide(); + map.connect_enable_year_limit.show(); map.connect_zhong_card.hide(); map.connect_special_identity.hide(); } @@ -5000,6 +5184,8 @@ map.connect_limit_zhu.hide(); map.connect_enhance_zhu.hide(); map.connect_double_nei.hide(); + map.connect_enable_commoner.hide(); + map.connect_enable_year_limit.hide(); map.connect_zhong_card.hide(); map.connect_special_identity.hide(); map.connect_double_character.hide(); @@ -5009,12 +5195,9 @@ map.connect_player_number.show(); map.connect_limit_zhu.show(); map.connect_enhance_zhu.show(); - if(config.connect_player_number!='2'){ - map.connect_double_nei.show(); - } - else{ - map.connect_double_nei.hide(); - } + map.connect_double_nei[config.connect_player_number!='2'&&!config.connect_enable_commoner?'show':'hide'](); + map.connect_enable_commoner[config.connect_player_number!='2'&&!config.connect_double_nei?'show':'hide'](); + map.connect_enable_year_limit.show(); map.connect_zhong_card.hide(); if(config.connect_player_number=='8'){ @@ -5074,6 +5257,15 @@ return lib.mode.identity.config.double_nei.intro; } }, + connect_enable_commoner:{ + name:'启用平民', + init:false, + restart:true, + frequent:false, + get intro(){ + return lib.mode.identity.config.enable_commoner.intro; + } + }, connect_double_character:{ name:'双将模式', init:false, @@ -5093,6 +5285,15 @@ frequent:true, intro:'开启后游戏中将增加军师、大将、贼首三个身份' }, + connect_enable_year_limit:{ + name:'启用年机制', + init:false, + restart:true, + frequent:false, + get intro(){ + return lib.mode.identity.config.enable_year_limit.intro; + } + }, connect_round_one_use_fury:{ name:'开启首轮强化卡牌', init:false, @@ -5137,6 +5338,9 @@ map.choice_zhong.hide(); map.choice_nei.hide(); map.choice_fan.hide(); + map.enable_commoner.hide(); + map.choice_commoner.hide(); + map.enable_year_limit.show(); map.ban_identity.hide(); map.ban_identity2.hide(); map.ban_identity3.hide(); @@ -5172,6 +5376,9 @@ map.choice_zhong.show(); map.choice_nei.show(); map.choice_fan.show(); + map.enable_commoner.hide(); + map.choice_commoner.hide(); + map.enable_year_limit.show(); map.ban_identity.show(); if(config.ban_identity=='off'){ map.ban_identity2.hide(); @@ -5210,6 +5417,9 @@ map.choice_zhong.hide(); map.choice_nei.hide(); map.choice_fan.hide(); + map.enable_commoner.hide(); + map.choice_commoner.hide(); + map.enable_year_limit.hide(); map.ban_identity.hide(); map.ban_identity2.hide(); map.ban_identity3.hide(); @@ -5229,17 +5439,15 @@ map.player_number.show(); map.enhance_zhu.show(); map.auto_identity.show(); - if(config.player_number!='2'){ - map.double_nei.show(); - } - else{ - map.double_nei.hide(); - } + map.double_nei[config.player_number!='2'&&!config.enable_commoner?'show':'hide'](); map.choice_zhu.show(); map.limit_zhu.show(); map.choice_zhong.show(); map.choice_nei.show(); map.choice_fan.show(); + map.enable_commoner[config.player_number!='2'&&!config.double_nei?'show':'hide'](); + map.choice_commoner[config.enable_commoner?'show':'hide'](); + map.enable_year_limit.show(); map.ban_identity.show(); if(config.ban_identity=='off'){ map.ban_identity2.hide(); @@ -5305,7 +5513,7 @@ init:false, restart:true, frequent:true, - intro:'若游戏人数不大于8,则开启后游戏中将有两个内奸(内奸胜利条件仍为主内1v1时击杀主公)' + intro:'若游戏人数不大于9,则开启后游戏中将有两个内奸(内奸胜利条件仍为主内1v1时击杀主公)' }, choose_group:{ name:'神武将选择势力', @@ -5632,6 +5840,33 @@ '10':'十', }, }, + enable_commoner:{ + name:'启用平民', + init:false, + restart:true, + frequent:false, + intro:'开启后游戏中将有一个平民(身份)加入游戏。
    具体规则请查看帮助。', + }, + choice_commoner:{ + name:'平民候选武将数', + init:'4', + restart:true, + item:{ + '3':'三', + '4':'四', + '5':'五', + '6':'六', + '8':'八', + '10':'十', + }, + }, + enable_year_limit:{ + name:'启用年机制', + init:false, + restart:true, + frequent:false, + intro:'开启后将会加入年机制。
    年机制的具体规则请查看帮助。', + }, } }, guozhan:{ @@ -6034,6 +6269,12 @@ frequent:true, intro:'最后行动的角色起始手牌数+1' }, + connect_olfeiyang_four:{ + name:'四号位获得【飞扬】', + init:true, + frequent:true, + intro:'最后行动的角色获得技能【飞扬】(准备阶段,你可以弃置三张牌,然后弃置判定区的一张牌)', + }, connect_choice_num:{ name:'侯选武将数', init:'20', @@ -6137,12 +6378,14 @@ } if(config.versus_mode=='two'){ map.replace_handcard_two.show(); + map.olfeiyang_four.show(); map.replace_character_two.show(); map.two_assign.show(); map.two_phaseswap.show(); } else{ map.replace_handcard_two.hide(); + map.olfeiyang_four.hide(); map.replace_character_two.hide(); map.two_assign.hide(); map.two_phaseswap.hide(); @@ -6317,6 +6560,12 @@ frequent:true, intro:'最后行动的角色起始手牌+1' }, + olfeiyang_four:{ + name:'四号位获得【飞扬】', + init:true, + frequent:true, + intro:'最后行动的角色获得技能【飞扬】(准备阶段,你可以弃置三张牌,然后弃置判定区的一张牌)', + }, replace_character_two:{ name:'替补模式', init:false, @@ -6456,7 +6705,7 @@ else{ lib.codeMirrorReady(node,editor); } - }; + } }, }, reset_character_three:{ @@ -6548,7 +6797,7 @@ else{ lib.codeMirrorReady(node,editor); } - }; + } }, }, reset_character_four:{ @@ -6609,6 +6858,12 @@ frequent:true, intro:'在用户填写的IP地址没有直接指定使用WS/WSS协议的情况下,默认使用WSS协议,而非WS协议来连接到联机服务器。
    请不要轻易勾选此项!', }, + read_clipboard:{ + name:'读取邀请链接', + init:false, + frequent:true, + intro:'读取剪贴板以解析邀请链接自动加入联机房间', + } } }, boss:{ @@ -7002,7 +7257,7 @@ else{ lib.codeMirrorReady(node,editor); } - }; + } }, }, reset_character:{ @@ -7583,6 +7838,7 @@ /** * @type {import('path')} */ + // @ts-ignore path:{}, getErrorTip:msg=>{ if(typeof msg!='string'){ @@ -7639,9 +7895,9 @@ }else if(newMessage.includes("Invalid regular expression flags")){ newMessage="无效的正则表达式的标记"; }else if(newMessage.includes("missing ) after argument list")){ - newMessage="参数列表后面缺少 \')\' (丢失运算符或者转义字符等)"; + newMessage="参数列表后面缺少 ')' (丢失运算符或者转义字符等)"; }else if(newMessage.includes("Invalid shorthand property initializer")){ - newMessage="在定义一个{}对象时,应该使用\':\'而不是\'=\'"; + newMessage="在定义一个{}对象时,应该使用':'而不是'='"; }else if(newMessage.includes("Missing initializer in const declaration")){ newMessage="在使用const定义一个对象时,必须指定初始值"; }else if(newMessage.includes("Unexpected number")||newMessage.includes("Unexpected string")){ @@ -7668,11 +7924,11 @@ }else if(newMessage.includes("Cannot read property")){ messageName=newMessage.replace('TypeError: Cannot read property ', '').replace(' of null', '').replace(' of undefined', ''); let ofName=newMessage.slice(newMessage.indexOf(" of ")+4); - newMessage="无法读取\'"+ofName+"\'的属性值"+messageName; + newMessage="无法读取'"+ofName+"'的属性值"+messageName; }else if(newMessage.includes("Cannot read properties")){ messageName=newMessage.slice(newMessage.indexOf("reading '")+9,-2); let ofName=newMessage.slice(newMessage.indexOf(" of ")+4,newMessage.indexOf("(")-1); - newMessage="无法读取\'"+ofName+"\'的属性值"+messageName; + newMessage="无法读取'"+ofName+"'的属性值"+messageName; }else if(newMessage.includes("Property description must be an object")){ messageName=newMessage.replace('TypeError: Property description must be an object: ', ''); newMessage=messageName+"是非对象类型的值"; @@ -7685,7 +7941,7 @@ messageName=newMessage.slice(newMessage.indexOf('\'')+1); messageName=messageName.slice(0,messageName.indexOf('\'')); let obj=newMessage.slice(newMessage.indexOf(messageName)+16); - newMessage=obj+"不能添加或修改\'"+messageName+"\'属性,任何 Primitive 值都不允许有property"; + newMessage=obj+"不能添加或修改'"+messageName+"'属性,任何 Primitive 值都不允许有property"; }else if(newMessage.includes("Can't add property")&&newMessage.includes("is not extensible")){ newMessage="对象不可添加属性(不可扩展)"; }else if(newMessage.includes("Cannot redefine property")){ @@ -7755,10 +8011,10 @@ code=node.editor.getValue(); }else if(node.textarea){ code=node.textarea.value; - }; + } //动态绑定文本 if(code.length&&change.origin=="+input" && - /{|}|\s|=|;|:|,|,|。|?|!|\!|\?|&|#|%|@|‘|’|;/.test(change.text[0])==false&& + /{|}|\s|=|;|:|,|,|。|?|!|!|\?|&|#|%|@|‘|’|;/.test(change.text[0])==false&& change.text.length==1) { //输入了代码,并且不包括空格,{},=, ; , : , 逗号等,才可以自动提示 node.editor.showHint(); @@ -7887,7 +8143,7 @@ } function javascriptHint(editor,options){ return scriptHint(editor,javascriptKeywords,function(e,cur){return e.getTokenAt(cur);},options); - }; + } //覆盖原本的javascript提示 CodeMirror.registerHelper("hint","javascript",javascriptHint); const stringProps=Object.getOwnPropertyNames(String.prototype); @@ -8081,7 +8337,7 @@ run:function(time){ lib.status.time=time; for(var i=0;i} + */ + js:(path,file)=>new Promise((resolve,reject)=>lib.init.js(path,file,resolve,reject)), + + /** + * Promise版的`lib.init.css` + * + * @param {string} path - 文件路径 + * @param {string | string[]} [file] - 文件名或文件名组,忽略则直接读取`path`的内容 + * @param {Element} [before] 新样式dom的位置 + * @returns {Promise} + */ + css:(path,file,before)=>new Promise((resolve,reject)=>{ + const style=lib.init.css(path,file,before); + style.addEventListener("load",()=>resolve(style)); + style.addEventListener("error",reject); + }), + + /** + * Promise版的`lib.init.req` + * + * @param {string} str - 要读取的地址 + * @param {string} [master] + * @returns {Promise} + */ + req:(str,master)=>new Promise((resolve,reject)=>lib.init.req(str,resolve,reject,master)), + + /** + * Promise版的`lib.init.json` + * + * @param {string} url - 要读取的地址 + * @returns {Promise} + */ + json:(url)=>new Promise((resolve,reject)=>lib.init.json(url,resolve,reject)), + + /** + * Promise版的`lib.init.sheet` + * + * @returns {Promise} + */ + sheet(){ + return new Promise((resolve,reject)=>{ + const style=lib.init.sheet.apply(lib.init,arguments); + style.addEventListener("load",()=>resolve(style)); + style.addEventListener("error",reject); + }) + } + }, init:function(){ if(typeof __dirname==='string'&&__dirname.length){ var dirsplit=__dirname.split('/'); @@ -8470,13 +8783,39 @@ } else if(modeimage) src=`image/mode/${modeimage}/character/${name}${ext}`; else if(type=='character'&&lib.config.skin[name]&&arguments[2]!='noskin') src=`image/skin/${name}/${lib.config.skin[name]}${ext}`; - else if(type=='character') src=`image/character/${gzbool?'gz_':''}${name}${ext}`; + else if(type=='character'){ + src=`image/character/${gzbool?'gz_':''}${name}${ext}`; + } else src=`image/${type}/${subfolder}/${name}${ext}`; } else src=`image/${name}${ext}`; this.setBackgroundImage(src); this.style.backgroundPositionX='center'; this.style.backgroundSize='cover'; + if(type=='character'){ + new Promise((_,reject)=>{ + const image=new Image(); + image.src=`${lib.assetURL}${src}`; + image.onerror=reject; + }).catch(()=>new Promise((_,reject)=>{ + const nameinfo=get.character(name); + if(!nameinfo) reject('noinfo'); + const sex=nameinfo[0]; + src=`image/character/default_silhouette_${sex}${ext}`; + const image=new Image(); + image.src=`${lib.assetURL}${src}`; + image.onload=()=>this.setBackgroundImage(src); + image.onerror=()=>reject(`sex:${sex}`); + })).catch(reason=>{ + let sex; + if(reason=='noinfo') sex='male'; + else sex=reason.slice(4); + src=`image/character/default_silhouette_${sex=='female'?'female':'male'}${ext}`; + const image=new Image(); + image.src=`${lib.assetURL}${src}`; + image.onload=()=>this.setBackgroundImage(src); + }); + } return this; } }); @@ -8700,7 +9039,12 @@ writable:true, value:function(){ for(const item of arguments){ - const pos=this.indexOf(item); + let pos=-1; + if (typeof item=='number'&&isNaN(item)){ + pos=this.findIndex(v=>isNaN(v)) + }else{ + pos=this.indexOf(item); + } if(pos==-1) continue; this.splice(pos,1); } @@ -8951,7 +9295,7 @@ str+=`\n行号: ${line}`; str+=`\n列号: ${column}`; const version=lib.version||''; - const reg=/[^\d\.]/; + const reg=/[^\d.]/; const match=version.match(reg)!=null; str+='\n'+`${match?'游戏':'无名杀'}版本: ${version||'未知版本'}`; if(match) str+='\n⚠️您使用的游戏代码不是源于libccy/noname无名杀官方仓库,请自行寻找您所使用的游戏版本开发者反馈!'; @@ -8990,7 +9334,7 @@ } str+='\n-------------'; if(typeof line=='number'&&(typeof game.readFile=='function'||location.origin!='file://')){ - function createShowCode(lines){ + const createShowCode=function(lines){ let showCode=''; if(lines.length>=10){ if(line>4){ @@ -9427,7 +9771,6 @@ delete _status.htmlbg; window.game=game; - lib.announce.init(); // node:path library alternative if (typeof module!="object"||typeof module.exports!="object") lib.init.js(`${lib.assetURL}game`,"path",()=>{ lib.path=window._noname_path; @@ -9446,6 +9789,10 @@ --extToLoad; if(extToLoad==0){ yield Promise.allSettled(_status.extensionLoading); + _status.extensionLoaded.filter(Boolean).forEach(name => { + lib.announce.publish("Noname.Init.Extension.onLoad", name); + lib.announce.publish(`Noname.Init.Extension.${name}.onLoad`, void 0); + }); delete _status.extensionLoading; loadPack(); } @@ -9598,7 +9945,7 @@ '是否退出游戏?', function(index){ switch(index){ - case 2:game.saveConfig('null');game.reload();break; + case 2:game.reload();break; case 3:navigator.app.exitApp();break; } }, @@ -9610,12 +9957,23 @@ navigator.app.exitApp(); } }); + if ("cordova" in window && "plugins" in window.cordova && "permissions" in window.cordova.plugins) { + const permissions = cordova.plugins.permissions; + const requests = ["WRITE_EXTERNAL_STORAGE", "READ_EXTERNAL_STORAGE"] + requests.forEach(request => { + permissions.checkPermission(permissions[request], status => { + if (!status.hasPermission) { + permissions.requestPermission(permissions[request], lib.other.ignore, lib.other.ignore); + } + }, lib.other.ignore); + }); + } } game.download=function(url,folder,onsuccess,onerror,dev,onprogress){ if(!url.startsWith('http')){ url=get.url(dev)+url; } - var fileTransfer = new FileTransfer(); + var fileTransfer=new FileTransfer(); folder=lib.assetURL+folder; if(onprogress){ fileTransfer.onprogress=function(progressEvent){ @@ -9636,8 +9994,8 @@ window.resolveLocalFileSystemURL(lib.assetURL,function(entry){ entry.getFile(filename,{},function(fileEntry){ fileEntry.file(function(fileToLoad){ - var fileReader = new FileReader(); - fileReader.onload = function(e){ + var fileReader=new FileReader(); + fileReader.onload=function(e){ callback(e.target.result); }; fileReader.readAsArrayBuffer(fileToLoad, "UTF-8"); @@ -9649,8 +10007,8 @@ window.resolveLocalFileSystemURL(lib.assetURL,function(entry){ entry.getFile(filename,{},function(fileEntry){ fileEntry.file(function(fileToLoad){ - var fileReader = new FileReader(); - fileReader.onload = function(e){ + var fileReader=new FileReader(); + fileReader.onload=function(e){ callback(e.target.result); }; fileReader.readAsText(fileToLoad, "UTF-8"); @@ -9661,33 +10019,31 @@ game.writeFile=function(data,path,name,callback){ game.ensureDirectory(path,function(){ if(Object.prototype.toString.call(data)=='[object File]'){ - var fileReader = new FileReader(); - fileReader.onload = function(e){ - game.writeFile(e.target.result,path,name,callback); - }; - fileReader.readAsArrayBuffer(data, "UTF-8"); - } - else{ - window.resolveLocalFileSystemURL(lib.assetURL+path,function(entry){ - entry.getFile(name,{create:true},function(fileEntry){ - fileEntry.createWriter(function(fileWriter){ - fileWriter.onwriteend=callback; - fileWriter.write(data); - }); - }); - }); - } + var fileReader=new FileReader(); + fileReader.onload=function(e){ + game.writeFile(e.target.result,path,name,callback); + }; + fileReader.readAsArrayBuffer(data,"UTF-8"); + } + else{ + window.resolveLocalFileSystemURL(lib.assetURL+path,function(entry){ + entry.getFile(name,{create:true},function(fileEntry){ + fileEntry.createWriter(function(fileWriter){ + fileWriter.onwriteend=callback; + fileWriter.write(data); + },callback); + },callback); + },callback); + } }); }; game.removeFile=function(dir,callback){ window.resolveLocalFileSystemURL(lib.assetURL,function(entry){ entry.getFile(dir,{},function(fileEntry){ fileEntry.remove(); - if(callback){ - callback(); - } - }); - }); + if(callback) callback(); + },callback||function(){}); + },callback||function(){}); }; game.getFileList=(dir,success,failure)=>{ var files=[],folders=[]; @@ -9771,7 +10127,7 @@ else{ showbar(); } - } + }; } else if(typeof window.require=='function'){ lib.node={ @@ -9928,14 +10284,33 @@ } } else{ - window.onbeforeunload=function(){ - if(lib.config.confirm_exit&&!_status.reloading){ + //为其他自定义平台提供文件读写函数赋值的一种方式。 + //但这种方式只能修改game的文件读写函数。 + if(window.initReadWriteFunction){ + const g={}; + const ReadWriteFunctionName=['download','readFile','readFileAsText','writeFile','removeFile','getFileList','ensureDirectory','createDir']; + ReadWriteFunctionName.forEach(prop=>{ + Object.defineProperty(g,prop,{ + configurable:true, + get(){ return undefined; }, + set(newValue) { + if(typeof newValue=='function'){ + delete g[prop]; + g[prop]=game[prop]=newValue; + } + } + }) + }); + window.initReadWriteFunction(g); + } + window.onbeforeunload = function () { + if (lib.config.confirm_exit && !_status.reloading) { return '是否离开游戏?' } - else{ + else { return null; } - } + }; } lib.config=window.config; @@ -11305,7 +11680,13 @@ localStorage.removeItem(lib.configprefix+'background'); } }, - parsex:function(item){ + /** + * + * @param {*} item + * @param {Function} [scope] 作用域 + * @returns + */ + parsex:function(item,scope){ //by 诗笺、Tipx-L /** * @param {Function} func @@ -11313,7 +11694,7 @@ function Legacy(func){ //Remove all comments //移除所有注释 - let str=func.toString().replace(/((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/))|(?=\r?\n))))+)|("(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|(?:\r?\n|[\s\S])[^\/"'\\\s]*)/mg,'$2').trim(); + let str=func.toString().replace(/((?:(?:^[ \t]*)?(?:\/\*[^*]*\*+(?:[^/*][^*]*\*+)*\/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/)))?|\/\/(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|\/\*|\/\/))|(?=\r?\n))))+)|("(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|(?:\r?\n|[\s\S])[^/"'\\\s]*)/mg,'$2').trim(); //获取第一个 { 后的所有字符 str=str.slice(str.indexOf('{')+1); //判断代码中是否有debugger @@ -11365,9 +11746,15 @@ } str=`if(event.step==${k}){event.finish();return;}`+str; } - return (new (hasDebugger?GeneratorFunction:Function)('event','step','source','player','target','targets', + if(!scope){ + return (new (hasDebugger?GeneratorFunction:Function)('event','step','source','player','target','targets', 'card','cards','skill','forced','num','trigger','result', '_status','lib','game','ui','get','ai',str)); + }else{ + return scope(`function${hasDebugger?'*':''} anonymous(event,step,source,player,target,targets, + card,cards,skill,forced,num,trigger,result, + _status,lib,game,ui,get,ai){${str}}; anonymous;`); + } } switch(typeof item){ case "object": @@ -11428,15 +11815,20 @@ result:result }); var res=gen.next((lastEvent&&("result" in lastEvent))?lastEvent.result:null); - if(res.done) event.finish(); - else { - var currentResult=res.value; - // TODO: use `event.debugger` to replace source - if(typeof currentResult=="function") yield currentResult; - else lastEvent=currentResult; + if(res.done) return event.finish(); + var currentResult=res.value; + // TODO: use `event.debugger` to replace source + if(typeof currentResult=="function") yield currentResult; + else{ + if(Array.isArray(currentResult)){ + event.step=currentResult[1]; + currentResult=currentResult[0]; + } + lastEvent=currentResult; } } - } + }else if(item._parsed) return item; + // falls through default: return Legacy(item); } @@ -11447,7 +11839,7 @@ } else if(typeof func=='object'){ for(var i in func){ - if(func.hasOwnProperty(i)){ + if(Object.prototype.hasOwnProperty.call(func, i)){ func[i]=lib.init.eval(func[i]); } } @@ -12332,11 +12724,14 @@ feichu_equip4_info:"攻击坐骑栏已废除", feichu_equip5:"已废除", feichu_equip5_info:"宝物栏已废除", + feichu_equip6:'已废除', + feichu_equip6_info:'特殊装备栏已废除', feichu_equip1_bg:"废", feichu_equip2_bg:"废", feichu_equip3_bg:"废", feichu_equip4_bg:"废", feichu_equip5_bg:"废", + feichu_equip6_bg:'废', disable_judge:'已废除', disable_judge_info:'判定区已废除', disable_judge_bg:'废', @@ -13508,7 +13903,9 @@ bool:true, targets:event.targets2||result.targets, }; - var next=player.useCard(card,event.targets2||result.targets); + var args=[card,event.targets2||result.targets]; + if(cards) args.push(cards.slice()); + var next=player.useCard(...args); next.oncard=event.oncard; if(cards) next.cards=cards.slice(0); if(event.nopopup) next.nopopup=true; @@ -14105,6 +14502,7 @@ },true); next.set('_get_card',card); next.set('preTarget',targets[num]); + next.set('ai',target=>get.effect(target,get.card(),player,_status.event.player)); } else{ event.addedTargets[num]=false; @@ -14378,270 +14776,142 @@ }, arrangeTrigger:function(){ 'step 0' - event.filter1=function(info){ - if(info[1].isDead()&&!lib.skill[info[0]].forceDie) return false; - if(info[1].isOut()&&!lib.skill[info[0]].forceOut) return false; - return lib.filter.filterTrigger(trigger,info[1],event.triggername,info[0]); - } - event.filter2=function(info2){ - var info=lib.skill[info2[0]]; - if(!lib.translate[info2[0]]||info.silent) return false; - return true; - } - event.filter3=function(info,info2){ - return event.filter2(info2)&&event.filter1(info2)&&info2[1]==info[1]&&info[2]==info2[2]&&(lib.skill.global.contains(info2[0])||info[1].hasSkill(info2[0],true)); - } + event.noDirectUse=info=>!lib.skill[info.skill].silent&&lib.translate[info.skill];//是否触发同顺序选择 'step 1' - if(trigger.filterStop&&trigger.filterStop()){ - event.finish(); - } - else if(event.list.length){ - var info=event.list.shift(); - game.createTrigger(event.triggername,info[0],info[1],trigger); - event.redo(); - } + if(event.doing&&event.doing.todoList.length) return; + if(event.doingList.length) return event.doing=event.doingList.shift(); + event.finish(); 'step 2' - if(!event.map.length){ - if(event.list2.length){ - var info=event.list2.shift(); - game.createTrigger(event.triggername,info[0],info[1],trigger); - event.redo(); - } - else{ - if(trigger._triggering==this){ - delete trigger._triggering; - } - event.finish(); - return; - } - }; - event.doing=event.map.shift(); + if(trigger.filterStop&&trigger.filterStop()) return event.finish(); + const current=event.doing.todoList.find(info=>lib.filter.filterTrigger(trigger,info.player,event.triggername,info.skill)); + if(!current){ + event.doing.todoList=[]; + return event.goto(1); + } + event.doing.todoList=event.doing.todoList.filter(i=>i.priority<=current.priority); + event.num=event.doing.todoList.indexOf(current); + if(!event.noDirectUse(current)) return event.goto(5); + event.choice=event.doing.todoList.filter(info=>{ + if(!lib.filter.filterTrigger(trigger,info.player,event.triggername,info.skill)) return false; + if(!event.noDirectUse(info)) return false; + if(current.skill!=info.skill) return false; + if(current.player!=info.player) return false; + return lib.skill.global.includes(info.skill)||current.player.hasSkill(info.skill,true); + }); + if(event.choice.length<2) event.goto(5); 'step 3' - event.num=0; - var bool=false; - var list=event.doing.list; - for(var i=0;ipriority){ - event.doing.list.splice(i--,1); - event.num--; - } - } - event.choice=[]; - if(event.numi.skill)); + next.set('prompt','选择下一个触发的技能'); + next.set('forceDie',true); + next.set('arrangeSkill',true); + next.set('includeOut',true); 'step 4' - var controls=[]; - event.current=event.choice[0][1] - for(var i=0;iinfo.skill==result.control&&info.player==event.choice[0].player); 'step 5' - if(result.control){ - for(var i=0;i