diff --git a/audio/die/re_caoxiu.mp3 b/audio/die/re_caoxiu.mp3 index 67bfe9400..b879a0ad4 100644 Binary files a/audio/die/re_caoxiu.mp3 and b/audio/die/re_caoxiu.mp3 differ diff --git a/audio/die/re_caozhang.mp3 b/audio/die/re_caozhang.mp3 index ca916b4a5..cd793fc67 100644 Binary files a/audio/die/re_caozhang.mp3 and b/audio/die/re_caozhang.mp3 differ diff --git a/audio/die/re_chengpu.mp3 b/audio/die/re_chengpu.mp3 index 90b9991d0..6ce1e9558 100644 Binary files a/audio/die/re_chengpu.mp3 and b/audio/die/re_chengpu.mp3 differ diff --git a/audio/die/re_hanhaoshihuan.mp3 b/audio/die/re_hanhaoshihuan.mp3 index b11d67925..0fd524df6 100644 Binary files a/audio/die/re_hanhaoshihuan.mp3 and b/audio/die/re_hanhaoshihuan.mp3 differ diff --git a/audio/die/re_jianyong.mp3 b/audio/die/re_jianyong.mp3 index 6dac0aa9c..5d79b1e88 100644 Binary files a/audio/die/re_jianyong.mp3 and b/audio/die/re_jianyong.mp3 differ diff --git a/audio/die/re_jsp_huangyueying.mp3 b/audio/die/re_jsp_huangyueying.mp3 index 3dbd0bc46..58d731ab2 100644 Binary files a/audio/die/re_jsp_huangyueying.mp3 and b/audio/die/re_jsp_huangyueying.mp3 differ diff --git a/audio/die/re_sunxiu.mp3 b/audio/die/re_sunxiu.mp3 index 8e8d6722d..d87aaeac7 100644 Binary files a/audio/die/re_sunxiu.mp3 and b/audio/die/re_sunxiu.mp3 differ diff --git a/audio/die/re_wangyi.mp3 b/audio/die/re_wangyi.mp3 new file mode 100644 index 000000000..da624213f Binary files /dev/null and b/audio/die/re_wangyi.mp3 differ diff --git a/audio/die/xin_liubiao.mp3 b/audio/die/xin_liubiao.mp3 index 90654b0b6..4446db23f 100644 Binary files a/audio/die/xin_liubiao.mp3 and b/audio/die/xin_liubiao.mp3 differ diff --git a/audio/skill/decadezishou1.mp3 b/audio/skill/decadezishou1.mp3 index 8905ca791..644471ce0 100644 Binary files a/audio/skill/decadezishou1.mp3 and b/audio/skill/decadezishou1.mp3 differ diff --git a/audio/skill/decadezishou2.mp3 b/audio/skill/decadezishou2.mp3 index 4989a7501..2462e87e5 100644 Binary files a/audio/skill/decadezishou2.mp3 and b/audio/skill/decadezishou2.mp3 differ diff --git a/audio/skill/decadezongshi1.mp3 b/audio/skill/decadezongshi1.mp3 index c07dc27a1..05a3fa1c1 100644 Binary files a/audio/skill/decadezongshi1.mp3 and b/audio/skill/decadezongshi1.mp3 differ diff --git a/audio/skill/decadezongshi2.mp3 b/audio/skill/decadezongshi2.mp3 index 91f591a70..a6b636524 100644 Binary files a/audio/skill/decadezongshi2.mp3 and b/audio/skill/decadezongshi2.mp3 differ diff --git a/audio/skill/jyzongshi_re_jianyong1.mp3 b/audio/skill/jyzongshi_re_jianyong1.mp3 index f7f2ddf0b..96f7d26e9 100644 Binary files a/audio/skill/jyzongshi_re_jianyong1.mp3 and b/audio/skill/jyzongshi_re_jianyong1.mp3 differ diff --git a/audio/skill/jyzongshi_re_jianyong2.mp3 b/audio/skill/jyzongshi_re_jianyong2.mp3 index 11c3310d2..4a22f3f60 100644 Binary files a/audio/skill/jyzongshi_re_jianyong2.mp3 and b/audio/skill/jyzongshi_re_jianyong2.mp3 differ diff --git a/audio/skill/lihuo_re_chengpu1.mp3 b/audio/skill/lihuo_re_chengpu1.mp3 index a3cb83ef3..5b839b79f 100644 Binary files a/audio/skill/lihuo_re_chengpu1.mp3 and b/audio/skill/lihuo_re_chengpu1.mp3 differ diff --git a/audio/skill/lihuo_re_chengpu2.mp3 b/audio/skill/lihuo_re_chengpu2.mp3 index 26e2cb585..0ae13ab1d 100644 Binary files a/audio/skill/lihuo_re_chengpu2.mp3 and b/audio/skill/lihuo_re_chengpu2.mp3 differ diff --git a/audio/skill/miji_re_wangyi1.mp3 b/audio/skill/miji_re_wangyi1.mp3 new file mode 100644 index 000000000..12e4a54fc Binary files /dev/null and b/audio/skill/miji_re_wangyi1.mp3 differ diff --git a/audio/skill/miji_re_wangyi2.mp3 b/audio/skill/miji_re_wangyi2.mp3 new file mode 100644 index 000000000..8dadc02d7 Binary files /dev/null and b/audio/skill/miji_re_wangyi2.mp3 differ diff --git a/audio/skill/rechunlao1.mp3 b/audio/skill/rechunlao1.mp3 index 9891715fc..d3ba2b8dd 100644 Binary files a/audio/skill/rechunlao1.mp3 and b/audio/skill/rechunlao1.mp3 differ diff --git a/audio/skill/rechunlao2.mp3 b/audio/skill/rechunlao2.mp3 index 244e041fb..376715241 100644 Binary files a/audio/skill/rechunlao2.mp3 and b/audio/skill/rechunlao2.mp3 differ diff --git a/audio/skill/rejiqiao1.mp3 b/audio/skill/rejiqiao1.mp3 index 1b09d9d74..0bbb8d212 100644 Binary files a/audio/skill/rejiqiao1.mp3 and b/audio/skill/rejiqiao1.mp3 differ diff --git a/audio/skill/rejiqiao2.mp3 b/audio/skill/rejiqiao2.mp3 index cd3fc396d..3a12fc601 100644 Binary files a/audio/skill/rejiqiao2.mp3 and b/audio/skill/rejiqiao2.mp3 differ diff --git a/audio/skill/relinglong1.mp3 b/audio/skill/relinglong1.mp3 index c03677525..074bb5201 100644 Binary files a/audio/skill/relinglong1.mp3 and b/audio/skill/relinglong1.mp3 differ diff --git a/audio/skill/relinglong2.mp3 b/audio/skill/relinglong2.mp3 index 08d47aade..81c658f34 100644 Binary files a/audio/skill/relinglong2.mp3 and b/audio/skill/relinglong2.mp3 differ diff --git a/audio/skill/reqiaoshui1.mp3 b/audio/skill/reqiaoshui1.mp3 index 5fbe25630..9e18c31bd 100644 Binary files a/audio/skill/reqiaoshui1.mp3 and b/audio/skill/reqiaoshui1.mp3 differ diff --git a/audio/skill/reqiaoshui2.mp3 b/audio/skill/reqiaoshui2.mp3 index 7a95b1e8b..936d55530 100644 Binary files a/audio/skill/reqiaoshui2.mp3 and b/audio/skill/reqiaoshui2.mp3 differ diff --git a/audio/skill/reqingxi1.mp3 b/audio/skill/reqingxi1.mp3 index fcaf8cbaf..cb353cbea 100644 Binary files a/audio/skill/reqingxi1.mp3 and b/audio/skill/reqingxi1.mp3 differ diff --git a/audio/skill/reqingxi2.mp3 b/audio/skill/reqingxi2.mp3 index 07b695ae0..62531ec91 100644 Binary files a/audio/skill/reqingxi2.mp3 and b/audio/skill/reqingxi2.mp3 differ diff --git a/audio/skill/reshenduan1.mp3 b/audio/skill/reshenduan1.mp3 index c34aefa4c..13ddba401 100644 Binary files a/audio/skill/reshenduan1.mp3 and b/audio/skill/reshenduan1.mp3 differ diff --git a/audio/skill/reshenduan2.mp3 b/audio/skill/reshenduan2.mp3 index 2f96cd4e7..8c33513ac 100644 Binary files a/audio/skill/reshenduan2.mp3 and b/audio/skill/reshenduan2.mp3 differ diff --git a/audio/skill/rexingxue1.mp3 b/audio/skill/rexingxue1.mp3 index a6e688014..7bade19a9 100644 Binary files a/audio/skill/rexingxue1.mp3 and b/audio/skill/rexingxue1.mp3 differ diff --git a/audio/skill/rexingxue2.mp3 b/audio/skill/rexingxue2.mp3 index 96bd69fdb..c9616b926 100644 Binary files a/audio/skill/rexingxue2.mp3 and b/audio/skill/rexingxue2.mp3 differ diff --git a/audio/skill/reyanzhu1.mp3 b/audio/skill/reyanzhu1.mp3 index b768c2df0..4e82f5014 100644 Binary files a/audio/skill/reyanzhu1.mp3 and b/audio/skill/reyanzhu1.mp3 differ diff --git a/audio/skill/reyanzhu2.mp3 b/audio/skill/reyanzhu2.mp3 index 5397533b9..3eff5eb79 100644 Binary files a/audio/skill/reyanzhu2.mp3 and b/audio/skill/reyanzhu2.mp3 differ diff --git a/audio/skill/reyonglve1.mp3 b/audio/skill/reyonglve1.mp3 index d025a26f9..a3f28184c 100644 Binary files a/audio/skill/reyonglve1.mp3 and b/audio/skill/reyonglve1.mp3 differ diff --git a/audio/skill/reyonglve2.mp3 b/audio/skill/reyonglve2.mp3 index df7d98f2e..e8f3cc5b8 100644 Binary files a/audio/skill/reyonglve2.mp3 and b/audio/skill/reyonglve2.mp3 differ diff --git a/audio/skill/xinjiangchi1.mp3 b/audio/skill/xinjiangchi1.mp3 new file mode 100644 index 000000000..dcef12ef5 Binary files /dev/null and b/audio/skill/xinjiangchi1.mp3 differ diff --git a/audio/skill/xinjiangchi2.mp3 b/audio/skill/xinjiangchi2.mp3 new file mode 100644 index 000000000..23222b9db Binary files /dev/null and b/audio/skill/xinjiangchi2.mp3 differ diff --git a/audio/skill/zhenlie_re_wangyi1.mp3 b/audio/skill/zhenlie_re_wangyi1.mp3 new file mode 100644 index 000000000..bfa7e392f Binary files /dev/null and b/audio/skill/zhenlie_re_wangyi1.mp3 differ diff --git a/audio/skill/zhenlie_re_wangyi2.mp3 b/audio/skill/zhenlie_re_wangyi2.mp3 new file mode 100644 index 000000000..073ce8fa1 Binary files /dev/null and b/audio/skill/zhenlie_re_wangyi2.mp3 differ diff --git a/character/clan.js b/character/clan.js index fbe858224..7ea0ea235 100644 --- a/character/clan.js +++ b/character/clan.js @@ -21,17 +21,99 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clan_zhonghui:['male','wei','3/4',['clanyuzhi','clanxieshu','clanbaozu'],['clan:颍川钟氏']], clan_zhongyu:['male','wei',3,['clanjiejian','clanhuanghan','clanbaozu'],['clan:颍川钟氏']], clan_wanglun:['male','wei',3,['clanqiuxin','clanjianyuan','clanzhongliu'],['clan:太原王氏']], + clan_xunyou:['male','wei',3,['clanbaichu','clandaojie'],['clan:颍川荀氏']], }, characterSort:{ clan:{ clan_wu:['clan_wuxian','clan_wuban','clan_wukuang'], - clan_xun:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan'], + clan_xun:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan','clan_xunyou'], clan_han:['clan_hanshao','clan_hanrong'], clan_wang:['clan_wangling','clan_wangyun','clan_wanghun','clan_wanglun'], clan_zhong:['clan_zhongyan','clan_zhonghui','clan_zhongyu'], }, }, skill:{ + //族荀攸 + clanbaichu:{ + derivation:'qice', + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + if(player.getStorage('clanbaichu').contains(event.card.name)) return true; + if(get.suit(event.card)=='none') return false; + var str=(get.suit(event.card)+'、'+get.type2(event.card)); + if(!player.getStorage('clanbaichu').contains(str)) return true; + return !player.hasSkill('qice'); + }, + forced:true, + content:function(){ + 'step 0' + if(player.getStorage('clanbaichu').contains(trigger.card.name)){ + event.draw=true; + } + if(get.suit(trigger.card)!='none'){ + var str=(get.suit(trigger.card)+'+'+get.type2(trigger.card)); + if(player.getStorage('clanbaichu').contains(str)){ + if(!player.hasSkill('qice')){ + player.addTempSkill('qice','roundStart'); + player.popup('奇策'); + game.log(player,'获得了技能','#g【奇策】'); + } + event.goto(2); + } + else{ + player.markAuto('clanbaichu',[str]); + var list=lib.inpile.filter(name=>get.type(name)=='trick'&&!player.getStorage('clanbaichu').contains(name)); + if(list.length){ + var dialog=['请选择【百出】记录的普通锦囊牌牌名',[list,'vcard']]; + player.chooseButton(dialog,true).set('ai',function(button){ + var player=_status.event.player,name=button.link[2]; + if(name=='wuxie') return 114514; + return get.effect(player,{name:name},player,player)*(1+player.countCards('hs',name)); + }); + } + else event.goto(2); + } + } + else event.goto(2); + 'step 1' + if(result.bool){ + var name=result.links[0][2]; + player.markAuto('clanbaichu',[name]); + player.popup(get.translation(name)); + game.log(player,'记录中了','#y'+get.translation(name)); + game.delayx(); + } + 'step 2' + if(event.draw) player.chooseDrawRecover(true); + }, + intro:{ + markcount:()=>0, + content:function(storage){ + var str=''; + var list=storage.filter(str=>str.includes('+')); + var cards=storage.filter(str=>!list.contains(str)); + if(list.length){ + str+='
  • 已记录的花色点数组合:'; + list.forEach(strx=>{ + var listx=strx.split('+'); + str+='
    '; + str+=get.translation(listx[0]); + str+='+'; + str+=get.translation(listx[1]); + }); + } + if(list.length&&cards.length) str+='
    '; + if(cards.length){ + str+='
  • 已记录的普通锦囊牌名:'; + str+='
    '; + str+=get.translation(cards); + } + str+=''; + return str; + }, + }, + }, //族王沦 clanqiuxin:{ audio:2, @@ -2191,7 +2273,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, clandaojie:{ audio:2, - audioname:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan'], + audioname:['clan_xunshu','clan_xunchen','clan_xuncai','clan_xuncan','clan_xunyou'], trigger:{player:'useCardAfter'}, filter:function(event,player){ return get.type(event.card,null,false)=='trick'&&!get.tag(event.card,'damage')&&event.cards.filterInD().length>0&&player.getHistory('useCard',evt=>{ @@ -2446,7 +2528,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, characterReplace:{ - wuban:['clan_wuban','dc_wuban','wuban'], + wuban:['clan_wuban','dc_wuban','wuban','xin_wuban'], }, characterIntro:{ xunshu:'荀淑(83年~149年),字季和,为郎陵侯相,颍川颍阴人(今河南省许昌市)人。汉和帝至汉桓帝时人物,以品行高洁著称。有子八人,号八龙。年轻时有高尚的德行,学问渊博,不喜欢雕章琢句,徒在文字上用功,不注重实际的学识。因此,常常被俗儒看不起。但州里却称他有知人之明。安帝时,征召任为郎中,后来再升当涂长。离职还乡里。他的孙子荀彧是曹操部下著名的谋士。', @@ -2490,6 +2572,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clan_zhonghui_prefix:'族', clan_zhongyu_prefix:'族', clan_wanglun_prefix:'族', + clan_xunyou_prefix:'族', clan_wuxian:'族吴苋', clanyirong:'移荣', @@ -2580,6 +2663,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ clanqiuxin_info:'出牌阶段限一次,你可以令一名其他角色选择一项:①你对其使用【杀】;②你对其使用任意普通锦囊牌。当你执行其选择的选项后,你视为执行另一项。', clanjianyuan:'简远', clanjianyuan_info:'当一名角色发动“出牌阶段限一次”的技能后,你可以令其重铸任意张牌名字数为X的牌(X为其本阶段的使用牌数)。', + clan_xunyou:'族荀攸', + clanbaichu:'百出', + clanbaichu_info:'锁定技,当你使用一张牌结算完毕后,若你:未记录过此牌的点数和类型组合,则你记录此组合并记录一个普通锦囊牌名,否则你于本轮获得技能〖奇策〗;已记录此牌牌名,你回复1点体力或摸一张牌。', clan_wu:'陈留·吴氏', clan_xun:'颍川·荀氏', diff --git a/character/mobile.js b/character/mobile.js index b4c39a8a6..ed74f34cd 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -6,7 +6,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connect:true, characterSort:{ mobile:{ - mobile_default:['xin_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:['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,6 +26,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + yanxiang:['male','qun',3,['kujian','twruilian'],['character:tw_yanxiang','die_audio:tw_yanxiang']], mb_sunluyu:['female','wu',3,['mbmeibu','mbmumu']], xin_wuban:['male','shu',4,['xinjintao'],['clan:陈留吴氏','character:wuban']], baoxin:['male','qun',4,['mutao','yimou'],['character:tw_baoxin','die_audio:tw_baoxin']], @@ -387,6 +388,40 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //阎象 + kujian:{ + audio:'twkujian', + inherit:'twkujian', + selectCard:[1,2], + content:function(){ + player.give(cards,target).gaintag.add('twkujianx'); + player.addSkill('kujian_draw'); + player.addSkill('twkujian_discard'); + }, + subSkill:{ + draw:{ + charlotte:true, + audio:'twkujian', + trigger:{global:['useCardAfter','respondAfter']}, + filter:function(event,player){ + return event.player.hasHistory('lose',evt=>{ + if(event!=evt.getParent()) return false; + for(var i in evt.gaintag_map){ + if(evt.gaintag_map[i].contains('twkujianx')) return true; + } + }); + }, + forced:true, + logTarget:'player', + content:function(){ + 'step 0' + game.asyncDraw([player,trigger.player],2); + 'step 1' + game.delayx(); + }, + }, + }, + }, //手杀差异化孙鲁育 mbmumu:{ audio:'mumu', @@ -1086,14 +1121,29 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else event.finish(); 'step 2' var suit=result.control; + event.suit=suit; player.chat(get.translation(suit+2)); game.log(player,'选择了','#y'+get.translation(suit+2)); + if(target.countCards('e',{suit:suit})) player.gain(target.getCards('e',{suit:suit}),target,'giveAuto'); + 'step 3' + var suit=event.suit; + if(target.countCards('h',{suit:suit})){ + player.chooseButton(['选择获得其中一张牌',target.getCards('h',{suit:suit})],true).set('ai',button=>get.value(button.link)); + } + else event.goto(5); + 'step 4' + if(result.bool){ + var card=result.links[0]; + if(lib.filter.canBeGained(card,player,target)) player.gain(card,target,'giveAuto','bySelf'); + else game.log('但',card,'不能被',player,'获得!'); + } + 'step 5' + var suit=event.suit; player.storage.yichong=suit; player.markSkill('yichong'); game.broadcastAll(function(player,suit){ if(player.marks.yichong) player.marks.yichong.firstChild.innerHTML=get.translation(suit); },player,suit); - if(target.countCards('he',{suit:suit})) player.gain(target.getCards('he',{suit:suit}),target,'giveAuto'); game.countPlayer(function(current){ current.removeSkill('yichong_'+player.playerid); if(current==target) target.addSkill('yichong_'+player.playerid); @@ -15396,7 +15446,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xin_guozhao:'手杀郭照', xin_guozhao_prefix:'手杀', yichong:'易宠', - yichong_info:'①准备阶段,你可以选择一名其他角色并选择一个花色,然后你获得其所有此花色的牌,移除场上的所有“雀”标记,令其获得“雀”标记直到你的下个回合开始。②拥有“雀”标记的角色获得你最后一次发动〖易宠①〗选择的花色的牌后,你获得这些牌(你至多通过每个“雀”得到一张牌)。', + yichong_info:'①准备阶段,你可以选择一名其他角色并选择一个花色,然后你获得其所有此花色的装备牌和其一张此花色的手牌,移除场上的所有“雀”标记,令其获得“雀”标记直到你的下个回合开始。②拥有“雀”标记的角色获得你最后一次发动〖易宠①〗选择的花色的牌后,你获得这些牌(你至多通过每个“雀”得到一张牌)。', wufei:'诬诽', wufei_info:'若场上存在拥有“雀”标记的角色A,则:①当你使用【杀】或伤害类锦囊牌指定第一个目标后,你令A成为此牌伤害来源。②当你受到伤害后,若A的体力值大于3,则你可以令A受到1点无来源伤害。', yj_zhoubuyi:'☆周不疑', @@ -15467,6 +15517,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mbmeibu_info:'其他角色的出牌阶段开始时,若你在其攻击范围内,你可以弃置一张牌,令该角色于本回合内获得〖止息〗。若你以此法弃置的牌不是【杀】或黑色锦囊牌,则本回合其与你的距离视为1。', mbzhixi:'止息', mbzhixi_info:'锁定技。出牌阶段,若你于此阶段使用过的牌数不小于X,你不能使用牌(X为你的体力值);当你使用锦囊牌时,你结束此阶段。', + yanxiang:'阎象', + kujian:'苦谏', + kujian_info:'出牌阶段限一次,你可以将至多两张手牌称为“谏”并交给一名其他角色,然后你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸两张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。', mobile_standard:'手杀异构·标准包', mobile_shenhua_feng:'手杀异构·其疾如风', diff --git a/character/refresh.js b/character/refresh.js index c977cbf85..7281bf06d 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -72,7 +72,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xin_lingtong:['male','wu',4,['decadexuanfeng','yongjin']], xin_liubiao:['male','qun',3,['decadezishou','decadezongshi']], re_caoxiu:['male','wei',4,['qianju','reqingxi']], - re_sunxiu:['male','wu',3,['reyanzhu','rexingxue','xinzhaofu'],['zhu']], + re_sunxiu:['male','wu',3,['reyanzhu','rexingxue','zhaofu'],['zhu']], ol_dengai:['male','wei',4,['oltuntian','olzaoxian']], re_gongsunzan:['male','qun',4,['reqiaomeng','reyicong']], re_manchong:['male','wei',3,['rejunxing','yuce']], @@ -935,6 +935,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var skills=player.additionalSkills['relinglong']; return (skills&&skills.length>0)!=player.hasEmptySlot(5); }, + direct:true, content:function(){ player.removeAdditionalSkill('relinglong'); if(player.hasEmptySlot(5)){ @@ -6206,7 +6207,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, //界曹彰 xinjiangchi:{ - audio:'new_jiangchi', + audio:2, trigger:{player:'phaseUseBegin'}, direct:true, content:function(){ @@ -11095,7 +11096,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.logSkill('xinleiji'); player.recover(); } - player.chooseTarget('雷击:是否对一名角色造成'+event.num+'点雷电伤害?',lib.filter.notMe).ai=function(target){ + player.chooseTarget('雷击:是否对一名角色造成'+event.num+'点雷电伤害?').ai=function(target){ var player=_status.event.player; return get.damageEffect(target,player,player,'thunder'); }; @@ -14736,7 +14737,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinleiji:'雷击', xinleiji_misa:'雷击', xinguidao:'鬼道', - xinleiji_info:'①当你使用【闪】或【闪电】,或打出【闪】时,你可以进行判定。②当你的判定的判定牌生效后,若结果为:黑桃,你可对一名其他角色造成2点雷电伤害;梅花:你回复1点体力并可对一名其他其他角色造成1点雷电伤害。', + xinleiji_info:'①当你使用【闪】或【闪电】,或打出【闪】时,你可以进行判定。②当你的判定的判定牌生效后,若结果为:黑桃,你可对一名角色造成2点雷电伤害;梅花:你回复1点体力并可对一名角色造成1点雷电伤害。', xinleiji_append:'不能触发〖雷击〗的判定:〖暴虐〗、〖助祭〗、
    〖弘仪〗、〖孤影〗。
    ', xinleiji_faq:'不能触发〖雷击〗的判定', xinleiji_faq_info:'
    董卓/界董卓〖暴虐〗
    黄巾雷使〖助祭〗
    羊徽瑜〖弘仪〗
    鸣濑白羽〖孤影〗', diff --git a/character/sb.js b/character/sb.js index d3a35945f..757988dee 100644 --- a/character/sb.js +++ b/character/sb.js @@ -3237,8 +3237,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbguidao:{ audio:2, trigger:{ - global:[/*'phaseBefore',*/'damageEnd'], - //player:'enterGame', + global:['phaseBefore','damageEnd'], + player:'enterGame', }, forced:true, locked:false, @@ -3320,9 +3320,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return true; }, content:function(){ - player.addMark('sbguidao',1); + var num=Math.min(8-player.countMark('sbhuangtian_count'),2); + player.addMark('sbguidao',num); player.addTempSkill('sbhuangtian_count','roundStart'); - player.addMark('sbhuangtian_count',1,false); + player.addMark('sbhuangtian_count',num,false); } }, count:{onremove:true} @@ -4980,9 +4981,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbleiji:'雷击', sbleiji_info:'出牌阶段,你可以选择一名其他角色并弃4枚“道兵”,对其造成1点雷电伤害。', sbguidao:'鬼道', - sbguidao_info:'①一名角色受到属性伤害后,你获得2枚“道兵”。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。③“道兵”上限为8。', + sbguidao_info:'①游戏开始时/一名角色受到属性伤害后,你获得4/2枚“道兵”。②当你受到伤害时,你可以弃2枚“道兵”并防止此伤害。然后若当前回合角色不为你,〖鬼道①〗于你下回合开始前无效。③“道兵”上限为8。', sbhuangtian:'黄天', - sbhuangtian_info:'主公技,锁定技。①回合开始时,若本回合为你的第一个回合且游戏轮数为1,且游戏内没有【太平要术】,你装备【太平要术】。②其他群势力角色造成伤害后,若你拥有〖鬼道〗,你获得1枚“道兵”(每轮你至多以此法获得4枚“道兵”)。', + sbhuangtian_info:'主公技,锁定技。①回合开始时,若本回合为你的第一个回合且游戏轮数为1,且游戏内没有【太平要术】,你装备【太平要术】。②其他群势力角色造成伤害后,若你拥有〖鬼道〗,你获得2枚“道兵”(每轮你至多以此法获得4枚“道兵”)。', sb_caocao:'谋曹操', sbjianxiong:'奸雄', sbjianxiong_info:'①游戏开始时,你可获得至多2枚“治世”标记。②当你受到伤害后,你可获得伤害牌,摸1-X张牌(X为“治世”数),然后你可弃1枚“治世”。', diff --git a/character/sp.js b/character/sp.js index 52a61508d..ced27a3a9 100755 --- a/character/sp.js +++ b/character/sp.js @@ -1971,24 +1971,26 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('choice',function(){ var info=lib.skill.olgangshu.getInfo(player); if(info[1]==0) return 1; - if(player.hasCard(card=>{ + if(info[2]<5&&player.hasCard(card=>{ return get.name(card)=='sha'&&player.hasValueTarget(card); },'hs')&&!player.getCardUsable('sha')) return 2; - if(!game.hasPlayer(current=>{ + if(info[0]<5&&!game.hasPlayer(current=>{ return player.inRange(current)&&get.effect(current,{name:'sha'},player,player)>0; })) return 0; var rand=Math.random(); - if(rand<0.2) return 0; - if(rand<0.7) return 1; - if(rand<1.0) return 2; - return get.rand(0,2); + var list=[0,1,2].filter(i=>info[i]<5); + if(!list.length) return 'cancel2'; + if(rand<0.2&&list.includes(0)) return 0; + if(rand<0.7&&list.includes(1)) return 1; + if(rand<1.0&&list.includes(2)) return 2; + return list.randomGet(); }()); 'step 1' if(result.control!='cancel2'){ player.logSkill('olgangshu'); player.addSkill('olgangshu_buff'); var info=lib.skill.olgangshu.getInfo(player); - info[result.index]=info[result.index]+1; + info[result.index]=Math.min(5,info[result.index]+1); game.log(player,'的',result.control.slice(0,result.control.indexOf('(')),'#y+1'); player.markSkill('olgangshu_buff'); } @@ -2026,7 +2028,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, mark:true, intro:{ - markcount:()=>0, + markcount:function(storage,player){ + var info=lib.skill.olgangshu.getInfo(player); + var str=''; + info.forEach(num=>str+=parseFloat(num)); + return str; + }, content:function(storage,player){ var info=lib.skill.olgangshu.getInfo(player); var str=''; @@ -26389,7 +26396,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olrunwei_info:'其他角色的弃牌阶段开始时,若其已受伤,则你可以选择一项:①令其弃置一张牌,其本回合手牌上限+1;②令其摸一张牌,其本回合手牌上限-1。', caoxi:'曹羲', olgangshu:'刚述', - olgangshu_info:'①当你使用非基本牌结算结束后,你可以令以下一项数值+1:1.攻击范围;2.受〖刚述〗影响的下个摸牌阶段摸牌数;3.使用【杀】的次数上限。②当有牌被你抵消后,重置你〖刚述①〗增加的所有数值。', + olgangshu_info:'①当你使用非基本牌结算结束后,你可以令以下一项数值+1(每项至多加至5):1.攻击范围;2.受〖刚述〗影响的下个摸牌阶段摸牌数;3.使用【杀】的次数上限。②当有牌被你抵消后,重置你〖刚述①〗增加的所有数值。', oljianxuan:'谏旋', oljianxuan_info:'当你受到伤害后,你可以令一名角色摸一张牌,然后若其手牌数等于你〖刚述①〗中的任意一项对应的数值,其重复此流程。', ol_pengyang:'OL彭羕', diff --git a/character/sp2.js b/character/sp2.js index 6d431163b..049c9043a 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4765,12 +4765,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ else return true; } }, - direct:true, + frequent:true, content:function(){ - 'step 0' - player.chooseToDiscard('he',get.prompt('langmie'),'弃置一张牌并摸两张牌').set('ai',(card)=>8-get.value(card)).logSkill='langmie'; - 'step 1' - if(result.bool) player.draw(2); + player.draw(); }, group:'langmie_damage', }, @@ -10429,7 +10426,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ duanwei:'段煨', langmie:'狼灭', langmie_damage:'狼灭', - langmie_info:'其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以弃置一张牌并摸两张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。', + langmie_info:'其他角色的出牌阶段结束时,若其本阶段内使用过的牌中有类型相同的牌,则你可以摸一张牌;其他角色的结束阶段开始时,若其本回合内造成的伤害大于1,则你可以弃置一张牌并对其造成1点伤害。', zhangheng:'张横', dangzai:'挡灾', dangzai_info:'出牌阶段开始时,你可将一名其他角色判定区内的一张牌移动至你的判定区内。', diff --git a/character/tw.js b/character/tw.js index c958e4231..63341ee28 100644 --- a/character/tw.js +++ b/character/tw.js @@ -14054,6 +14054,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tw_caocao:['tw_caocao','jsrg_caocao','yj_caocao'], mateng:['tw_mateng','mateng'], xiahouen:['tw_xiahouen','jsrg_xiahouen'], + jiangji:['tw_jiangji','jiangji'], + baoxin:['tw_baoxin','baoxin'], + yanxiang:['yanxiang','tw_yanxiang'], }, dynamicTranslate:{ twfeifu:function(player){ @@ -14518,7 +14521,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tw_liwei_prefix:'TW', twjiaohua:'教化', twjiaohua_info:'当你或体力值最小的其他角色因摸牌而得到牌后,你可以令该角色从牌堆或弃牌堆中获得一张本次未获得的类别的牌(每种类别每回合限一次)。', - tw_yanxiang:'阎象', + tw_yanxiang:'TW阎象', + tw_yanxiang_prefix:'TW', twkujian:'苦谏', twkujianx:'谏', twkujian_info:'出牌阶段限一次。你可以将至多三张手牌交给一名其他角色,称为“谏”,你获得以下效果:当其他角色使用或打出牌后,若其中有“谏”,你与其各摸一张牌;当其他角色不因使用或打出而失去牌后,若其中有“谏”,你与其各弃置一张牌。', diff --git a/character/yijiang.js b/character/yijiang.js index e376d5c5e..b601ae723 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -10305,6 +10305,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, qiaoshui:{ audio:2, + audioname2:{ + re_jianyong:'reqiaoshui', + xin_jianyong:'xinqiaoshui', + }, trigger:{player:'phaseUseBegin'}, direct:true, filter:function(event,player){ @@ -10345,12 +10349,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, qiaoshui3:{ + charlotte:true, + audio:'qiaoshui', + audioname2:{ + re_jianyong:'reqiaoshui', + xin_jianyong:'xinqiaoshui', + }, trigger:{player:'useCard2'}, - direct:true, filter:function(event,player){ var type=get.type(event.card); return type=='basic'||type=='trick'; }, + direct:true, content:function(){ 'step 0' player.removeSkill('qiaoshui3'); @@ -10390,7 +10400,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } 'step 2' if(event.target){ - player.logSkill('qiaoshui',event.target); + player.logSkill('qiaoshui3',event.target); trigger.targets.add(event.target); } event.finish(); @@ -10405,7 +10415,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(result.bool){ event.targets=result.targets; if(event.isMine()){ - player.logSkill('qiaoshui',event.targets); + player.logSkill('qiaoshui3',event.targets); event.finish(); } for(var i=0;i0&&_status.event&&_status.event.type==='phase'&&get.tag(card,'recover')){ @@ -11944,6 +11955,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, zhenlie:{ audio:2, + audioname:['re_wangyi'], filter:function(event,player){ return event.player!=player&&event.card&&(event.card.name=='sha'||get.type(event.card)=='trick'); }, @@ -12549,9 +12561,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, qice:{ + audio:2, + audioname:['clan_xunyou'], enable:'phaseUse', - usable:1, - audio:'qice_backup', filter:function(event,player){ const hs=player.getCards('h'); if(!hs.length) return false; @@ -12565,6 +12577,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return event.filterCard(card,player,event); }); }, + usable:1, chooseButton:{ dialog:function(player){ var list=[]; @@ -12621,10 +12634,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, backup:function(links,player){ return { + audio:'qice', + audioname:['clan_xunyou'], filterCard:true, selectCard:-1, position:'h', - audio:2, popname:true, viewAs:{name:links[0][2]}, } @@ -12655,7 +12669,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ threaten:1.6, } }, - qice_backup:{audio:2}, zhiyu:{ audio:2, trigger:{player:'damageEnd'}, @@ -14424,6 +14437,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jyzongshi:'纵适', jyzongshi_info:'当你拼点赢时,你可以获得对方此次拼点的牌;当你拼点没赢时,你可以收回你此次拼点的牌。', qiaoshui:'巧说', + qiaoshui3:'巧说', qiaoshui_info:'出牌阶段开始时,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你不能使用锦囊牌直到回合结束。', reqiaoshui:'巧说', reqiaoshui_info:'出牌阶段,你可与一名其他角色拼点。若你赢,你使用的下一张基本牌或普通锦囊牌可以额外指定任意一名其他角色为目标或减少指定一个目标;若你没赢,你结束出牌阶段且本回合内锦囊牌不计入手牌上限。', diff --git a/game/game.js b/game/game.js index e74f377ba..aa62d8076 100644 --- a/game/game.js +++ b/game/game.js @@ -36859,6 +36859,101 @@ }); return audio; }, + /** + * 根据skill中的audio,audioname,audioname2和player来获取音频地址列表 + * @param {String} skill 技能名 + * @param {Player|String} player 角色/角色名 + * @returns {Array} 分析完的语音地址列表 + */ + parseSkillAudio:function(skill,player){ + if(typeof player=='string') player={name:player}; + else if(get.itemtype(player)!='player') player={}; + + /** + * 处理 audioInfo 外的参数 + * @param {String} skill 技能名 + * @param {Player|{name:string}} player 角色 + * @param {Array} audioname audioname历史 + * @param {Array} history 判断deadlock + * @param {Number} fixedNum [audioname, number] 中的第二个参数,用来限制语音数 + * @returns {Array} 音频地址数组(有需要playSkillAudio的为[skillname]) + */ + function getAudioList(skill,player,audioname,history,fixedNum){ + let info=lib.skill[skill]; + if(!info) return []; + if(!history) history=[]; + if(history.includes(skill)){//判断deadlock + console.trace(`${skill} in ${history} forms a deadlock`); + if(info.audio!==false) return [[skill]]; + return []; + } + history.push(skill); + + let audioInfo=info.audio; + if(info.audioname2){ + if(info.audioname2[player.name]) audioInfo=info.audioname2[player.name]; + else if(info.audioname2[player.name1]) audioInfo=info.audioname2[player.name1]; + else if(info.audioname2[player.name2]) audioInfo=info.audioname2[player.name2]; + } + if(typeof audioInfo=='function') audioInfo=audioInfo(player); + + if(!audioname) audioname=[]; + if(Array.isArray(info.audioname)) audioname.addArray(info.audioname); + + let audioList=parseAudio(skill,audioInfo,audioname,player,history,fixedNum); + if(fixedNum&&fixedNum} audioname 要判断的audioname + * @param {Player|{name:string}} player 角色 + * @param {Array} history 判断deadlock + * @param {Number} fixedNum [audioname, number] 中的第二个参数,用来限制语音数 + * @returns {Array} 音频地址数组(有需要playSkillAudio的为[skillname]) + */ + function parseAudio(skill,audioInfo,audioname,player,history,fixedNum){ + if(Array.isArray(audioInfo)){ + if(typeof audioInfo[0]=='string'&&typeof audioInfo[1]=='number'){// [audioname, number] + if(lib.skill[audioInfo[0]]) return getAudioList(audioInfo[0],player,audioname,history,fixedNum||audioInfo[1]); + return parseAudio(audioInfo[0],audioInfo[1],audioname,player,history,fixedNum||audioInfo[1]); + } + return audioInfo.reduce((total,i)=>total.addArray(parseAudio(skill,i,audioname,player,history,fixedNum)),[]); + } + + if(!['string','number','boolean'].includes(typeof audioInfo)) return []; + if(audioInfo===false) return []; + if(typeof audioInfo=='string'&&lib.skill[audioInfo]) return getAudioList(audioInfo,player,audioname,history,fixedNum); + + let audioList=[]; + audioInfo=String(audioInfo); + let list=audioInfo.match(/(?:(.*):|^)(true|\d*)(?::(.*)|$)/); + if(list&&list[2]){ + let _audioname=''; + if(audioname.includes(player.name)) _audioname=`_${player.name}`; + else if(audioname.includes(player.name1)) _audioname=`_${player.name1}`; + else if(audioname.includes(player.name2)) _audioname=`_${player.name2}`; + + list=list.slice(1);//[路径,number/true,格式] + if(list[1]=='true') audioList.add(`${list[0]||'skill'}/${skill}${_audioname}.${list[2]||'mp3'}`); + else{ + list[1]=parseInt(list[1]); + for(let i=1;i<=list[1];i++){ + audioList.add(`${list[0]||'skill'}/${skill}${_audioname}${i}.${list[2]||'mp3'}`); + } + } + } + else audioList.add(`${/(?:^db:|^ext:|\/)/.test(audioInfo)?'':'skill/'}${audioInfo}`); + return audioList; + } + + return getAudioList(skill,player); + }, trySkillAudio:function(skill,player,directaudio,nobroadcast/*,index*/){ if(!nobroadcast) game.broadcast(game.trySkillAudio,skill,player,directaudio,nobroadcast/*,index*/); var info=get.info(skill); @@ -36866,73 +36961,8 @@ if(!lib.config.background_speak) return; if(info.direct&&!directaudio) return; if(lib.skill.global.includes(skill)&&!lib.skill[skill].forceaudio) return; - if(typeof player=='string') player={name:player}; - function getAudioList(skill,player,history,fixedNum){ - let info=lib.skill[skill]; - if(!info) return []; - if(!history) history=[]; - if(history.includes(skill)){//直接跳出 - console.trace(`${skill} in ${history} forms a deadlock`); - if(info.audio!==false) return [[skill]];//标记为playSkillAudio - return []; - } - history.push(skill); - - let audioInfo=info.audio; - if(info.audioname2&&player){ - if(info.audioname2[player.name]) audioInfo=info.audioname2[player.name]; - else if(info.audioname2[player.name1]) audioInfo=info.audioname2[player.name1]; - else if(info.audioname2[player.name2]) audioInfo=info.audioname2[player.name2]; - } - if(typeof audioInfo=='function') audioInfo=audioInfo(player); - - let audioname=''; - if(Array.isArray(info.audioname)&&player){ - if(info.audioname.includes(player.name)) audioname=`_${player.name}`; - else if(info.audioname.includes(player.name1)) audioname=`_${player.name1}`; - else if(info.audioname.includes(player.name2)) audioname=`_${player.name2}`; - } - - let audioList=parseAudio(skill,audioInfo,audioname,player,history,fixedNum); - if(fixedNum&&fixedNumtotal.addArray(parseAudio(skill,i,audioname,player,history,fixedNum)),[]); - } - - if(!['string','number','boolean'].includes(typeof audioInfo)) return []; - if(audioInfo===false) return []; - if(typeof audioInfo=='string'&&lib.skill[audioInfo]) return getAudioList(audioInfo,player,history,fixedNum); - audioInfo=String(audioInfo); - - let audioList=[]; - let list=audioInfo.match(/(?:(.*):|^)(true|\d*)(?::(.*)|$)/); - if(list&&list[2]){ - list=list.slice(1);//形如[路径,number/true,格式]的形式 - if(list[1]=='true') audioList.add(`${list[0]||'skill'}/${skill}${audioname}.${list[2]||'mp3'}`); - else{ - list[1]=parseInt(list[1]); - for(let i=1;i<=list[1];i++){ - audioList.add(`${list[0]||'skill'}/${skill}${audioname}${i}.${list[2]||'mp3'}`); - } - } - } - else audioList.add(`${/(?:^db:|^ext:|\/)/.test(audioInfo)?'':'skill/'}${audioInfo}`); - return audioList; - } - - let list=getAudioList(skill,player); - // console.log(skill,lib.skill[skill]&&lib.skill[skill].audio,list); + let list=game.parseSkillAudio(skill,player); if(!list.length) return; // if(index) index=index%list.length||list.length; // let audio=list[index?index-1:Math.floor(Math.random()*list.length)]; diff --git a/image/character/clan_xunyou.jpg b/image/character/clan_xunyou.jpg new file mode 100644 index 000000000..6fc771605 Binary files /dev/null and b/image/character/clan_xunyou.jpg differ diff --git a/image/character/ol_dingshangwan.jpg b/image/character/ol_dingshangwan.jpg new file mode 100644 index 000000000..cc702d225 Binary files /dev/null and b/image/character/ol_dingshangwan.jpg differ