diff --git a/card/extra.js b/card/extra.js index 2830e97ee..54f8c056e 100644 --- a/card/extra.js +++ b/card/extra.js @@ -149,7 +149,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(card){ if(game.hasPlayer(function(current){ return (get.attitude(target,current)<0&& - target.canUse(card,current,true,true)&& + target.canUse(card,current,null,true)&& !current.hasSkillTag('filterDamage',null,{ player:player, card:card, @@ -164,7 +164,8 @@ game.import('card',function(lib,game,ui,get,ai,_status){ }, }, tag:{ - save:1 + save:1, + recover:0.1, } } }, diff --git a/card/guozhan.js b/card/guozhan.js index 727c2dbbf..f28f87f5c 100644 --- a/card/guozhan.js +++ b/card/guozhan.js @@ -1070,7 +1070,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ distance:{attackFrom:-1}, ai:{ equipValue:function(card,player){ - if(player.identity=='unknown'||player.identity=='ye') return 2.5; + if(player.identity=='unknown'||player.identity=='ye') return 2; return 2+game.countPlayer(function(current){ return current.isFriendOf(player); })/2; diff --git a/card/sp.js b/card/sp.js index 9e3b934c0..be32bb5d4 100644 --- a/card/sp.js +++ b/card/sp.js @@ -156,16 +156,24 @@ game.import('card',function(lib,game,ui,get,ai,_status){ if(get.suit(card)=='spade') return -6; return 0; }, + cardPrompt:function(card){ + var str='出牌阶段,对你使用。你将【浮雷】置入判定区。若判定结果为♠,则目标角色受到X点雷电伤害(X为此牌判定结果为♠的次数)。判定完成后,将此牌移动到下家的判定区里。'; + if(card.storage&&card.storage.fulei) str+=('
此牌已判定命中过:'+card.storage.fulei+'次'); + return str; + }, effect:function(){ 'step 0' if(result.bool==false){ - if(!card.storage.fulei){ - card.storage.fulei=1; + var card=cards[0]; + if(card){ + if(!card.storage.fulei){ + card.storage.fulei=1; + } + else{ + card.storage.fulei++; + } + player.damage(card.storage.fulei,'thunder','nosource'); } - else{ - card.storage.fulei++; - } - player.damage(card.storage.fulei,'thunder','nosource'); } 'step 1' player.addJudgeNext(card); @@ -608,7 +616,7 @@ game.import('card',function(lib,game,ui,get,ai,_status){ g_jinchan2_info:'当你因弃置而失去【金蝉脱壳】时,你摸一张牌', jinchan_info:'当你成为其他角色使用牌的目标时,若你的手牌里只有【金蝉脱壳】,使目标锦囊牌或基本牌对你无效,你摸两张牌。当你因弃置而失去【金蝉脱壳】时,你摸一张牌。', fulei:'浮雷', - fulei_info:'出牌阶段,对你使用。将【浮雷】放置于你的判定区里,若判定结果为黑桃,则目标角色受到X点雷电伤害(X为此锦囊判定结果为黑桃的次数)。判定完成后,将此牌移动到下家的判定区里。', + fulei_info:'出牌阶段,对你使用。你将【浮雷】置入判定区。若判定结果为♠,则目标角色受到X点雷电伤害(X为此牌判定结果为♠的次数)。判定完成后,将此牌移动到下家的判定区里。', qibaodao:'七宝刀', qibaodao_info:'攻击范围2;锁定技,你使用【杀】无视目标防具,若目标角色未损失体力值,此【杀】伤害+1', qibaodao2:'七宝刀', diff --git a/character/diy.js b/character/diy.js index 787c85236..0215f6057 100755 --- a/character/diy.js +++ b/character/diy.js @@ -85,6 +85,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_tenzen:['male','key',4,['tenzen_fenghuan','tenzen_retianquan']], key_kyouko:['female','key',3,['kyouko_rongzhu','kyouko_gongmian']], key_kyou:['female','key',3,['kyou_zhidian','kyou_duanfa']], + key_seira:['female','key',3,['seira_xinghui','seira_yuanying']], ns_huangchengyan:['male','shu',3,['nslongyue','nszhenyin']], ns_sunchensunjun:['male','wu',5,['nsxianhai','nsxingchu']], @@ -99,6 +100,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ns_ruanji:['male','wei',3,['nsshizui','nsxiaoye']], ns_limi:['male','jin',3,['nstuilun']], ns_zhonglimu:['male','wu',4,['nskuanhuai','nsdingbian']], + prp_zhugeliang:['male','shu',3,['nsxingyun','nshanlang']], ns_zhangwei:['female','shu',3,['nsqiyue','nsxuezhu']], diy_wenyang:['male','wei','4/6',['lvli','choujue']], @@ -200,7 +202,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ "ns_huangchengyan","ns_sunchensunjun","ns_yuanxi","ns_caoshuang"], diy_yijiang2:["key_yuuki","key_tenzen","key_kyouko","key_kotarou","key_kyou", "ns_chentai","ns_huangwudie","ns_sunyi","ns_zhangning","ns_yanghu"], - diy_yijiang3:['ns_ruanji','ns_zanghong','ns_limi','ns_zhonglimu'], + diy_yijiang3:['ns_ruanji','ns_zanghong','ns_limi','ns_zhonglimu','prp_zhugeliang','key_seira'], diy_tieba:["ns_zuoci","ns_lvzhi","ns_wangyun","ns_nanhua","ns_nanhua_left","ns_nanhua_right","ns_huamulan","ns_huangzu","ns_jinke","ns_yanliang","ns_wenchou","ns_caocao","ns_caocaosp","ns_zhugeliang","ns_wangyue","ns_yuji","ns_xinxianying","ns_guanlu","ns_simazhao","ns_sunjian","ns_duangui","ns_zhangbao","ns_masu","ns_zhangxiu","ns_lvmeng","ns_shenpei","ns_yujisp","ns_yangyi","ns_liuzhang","ns_xinnanhua","ns_luyusheng"], diy_fakenews:["diy_wenyang","ns_zhangwei","ns_caimao","ns_chengpu"], diy_xushi:["diy_feishi","diy_hanlong","diy_liufu","diy_liuyan","diy_liuzan","diy_tianyu","diy_xizhenxihong","diy_yangyi","diy_zaozhirenjun"], @@ -302,6 +304,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_kyouko:'#b阿阿阿687', key_tenzen:'#b皋耳击', key_kotarou:'#bb1154486224', + key_seira:'#b阿开木木W🍀', ns_huangchengyan:'#g竹邀月', ns_sunchensunjun:'#gVenusjeu', @@ -316,6 +319,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ns_zanghong:'#g阿七', ns_limi:'#g-心若困兽-', ns_zhonglimu:'#gJG赛文♠7', + prp_zhugeliang:'#g阿开木木W🍀', ns_luyusheng:'#g猫咪大院 - 魚と水', ns_caimao:'#gP尔号玩家◆', @@ -463,7 +467,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return -4; }, effect:function(){ - var source=card.storage.nsfuzhou_source; + var source=cards[0].storage.nsfuzhou_source; if(!source||!source.isAlive()) return; source.line(player,'thunder'); if(result.color=='black'){ @@ -523,6 +527,359 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_lucia:['key_shizuru'], }, skill:{ + //樱庭星罗 + seira_xinghui:{ + trigger:{player:'phaseZhunbeiBegin'}, + check:function(event,player){ + return !player.getExpansions('seira_xinghui').length; + }, + content:function(){ + 'step 0' + game.delayx(); + 'step 1' + if(get.isLuckyStar(player)){ + event.num=6; + player.throwDice(6); + } + else player.throwDice(); + 'step 2' + var cards=get.cards(num); + event.cards=cards; + game.cardsGotoOrdering(cards); + var next=player.chooseToMove(); + next.set('prompt','星辉:选择要作为“星屑”的牌(先选择的在上)'); + next.set('list',[ + ['置于武将牌上',cards], + ['置入弃牌堆'], + ]); + next.processAI=function(list){ + var cards=list[0][1],player=_status.event.player; + var top=[]; + var judges=player.getCards('j'); + var stopped=false; + if(!player.hasWuxie()){ + for(var i=0;i0; + }, + content:function(){ + trigger.num++; + game.log(player,'造成了','#y暴击伤害'); + }, + group:['seira_xinghui_draw','seira_xinghui_judge'], + }, + draw:{ + trigger:{player:'drawBefore'}, + forced:true, + filter:function(event,player){ + return player.getExpansions('seira_xinghui').length>0; + }, + content:function(){ + var cards=player.getExpansions('seira_xinghui'); + var num=Math.min(cards.length,trigger.num); + trigger.num-=num; + player.gain(cards.slice(0,num),'draw'); + if(trigger.num==0) trigger.cancel(); + }, + }, + judge:{ + trigger:{player:'judgeBegin'}, + forced:true, + filter:function(event,player){ + return player.getExpansions('seira_xinghui').length>0; + }, + content:function(){ + trigger.directresult=player.getExpansions('seira_xinghui')[0]; + }, + }, + }, + }, + seira_yuanying:{ + enable:'phaseUse', + usable:1, + filterTarget:true, + selectTarget:2, + multitarget:true, + multiline:true, + line:{color:[253, 153, 182]}, + content:function(){ + game.countPlayer(function(current){ + if(!targets.contains(current)){ + current.removeSkill('seira_yinyuan'); + } + else{ + current.addSkillLog('seira_yinyuan'); + } + }); + game.delayx(); + }, + ai:{ + order:1, + result:{target:1}, + expose:0.1, + }, + derivation:'seira_yinyuan', + }, + seira_yinyuan:{ + enable:'phaseUse', + usable:1, + filterTarget:function(card,player,target){ + return target!=player&&target.hasSkill('seira_yinyuan',null,null,false)&&target.countCards('hej')>0; + }, + content:function(){ + player.gainPlayerCard(target,true,'hej'); + target.recover(); + }, + mark:true, + intro:{content:'skillinfo'}, + ai:{ + order:9, + viewHandcard:true, + skillTagFilter:function(player,tag,arg){ + if(player==arg) return false; + return player.hasSkill('seira_yinyuan')&&arg.hasSkill('seira_yinyuan'); + }, + result:{ + player:function(player,target){ + var effect=get.effect(target,{name:'shunshou_copy'},player,player); + if(target.isDamaged()){ + if(effect<0) effect/=2; + effect+=get.recoverEffect(target,player,player); + } + return effect; + }, + }, + }, + }, + //派对浪客 + nsxingyun:{ + audio:2, + enable:'chooseToUse', + getSixiang:function(card){ + if(typeof card=='string') card={name:card}; + if(card.name=='shan') return '玄武'; + var type=get.type(card,null,false); + if(type=='delay') return '朱雀'; + if(get.tag(card,'damage')) return '白虎'; + if(get.tag(card,'recover')) return '玄武'; + if(type=='trick') return '青龙'; + return false; + }, + filter:function(event,player){ + if(player.hasSkill('nsxingyun_round')) return false; + var list=player.getStorage('nsxingyun'); + if(list.length>=4) return false; + for(var i of lib.inpile){ + var type=lib.skill.nsxingyun.getSixiang(i); + if(!type||list.contains(type)) continue; + if(event.filterCard({name:i},player,event)) return true; + if(i=='sha'){ + for(var j of lib.inpile_nature){ + if(event.filterCard({name:i,nature:j},player,event)) return true; + } + } + } + return false; + }, + chooseButton:{ + dialog:function(event,player){ + var map={青龙:[],朱雀:[],白虎:[],玄武:[]}; + var list=player.getStorage('nsxingyun'); + for(var i of lib.inpile){ + var type=lib.skill.nsxingyun.getSixiang(i); + if(!type||list.contains(type)) continue; + if(event.filterCard({name:i},player,event)) map[type].push([get.type2(i,false),'',i]); + if(i=='sha'){ + for(var j of lib.inpile_nature){ + if(event.filterCard({name:i,nature:j},player,event)) map[type].push([get.type2(i,false),'',i,j]); + } + } + } + var dialog=['星陨','hidden']; + for(var i in map){ + if(map[i].length>0){ + dialog.push('
'+i+'
'); + dialog.push([map[i],'vcard']); + } + } + return ui.create.dialog.apply(ui.create,dialog); + }, + filter:function(button,player){ + return _status.event.getParent().filterCard({ + name:button.link[2], + nature:button.link[3], + },player,_status.event.getParent()); + }, + check:function(button){ + if(_status.event.getParent().type!='phase') return 1; + return _status.event.player.getUseValue({ + name:button.link[2], + nature:button.link[3], + },false); + }, + backup:function(links,player){ + return { + selectCard:1, + filterCard:true, + popname:true, + position:'hs', + check:function(card){ + return 7-get.value(card); + }, + viewAs:{name:links[0][2],nature:links[0][3]}, + precontent:function(){ + player.addTempSkill('nsxingyun_round'); + }, + } + }, + prompt:function(links,player){ + return '将一张手牌当做'+(get.translation(links[0][3])||'')+get.translation(links[0][2])+'使用'; + } + }, + ai:{ + threaten:2.6, + order:1, + result:{player:1}, + }, + group:'nsxingyun_clear', + derivation:['nsxingyun_faq','bazhen'], + subSkill:{ + backup:{}, + clear:{ + trigger:{player:'useCardAfter'}, + forced:true, + popup:false, + filter:function(event,player){ + return event.skill=='nsxingyun_backup'&&event.cards.length==1 + &&lib.skill.nsxingyun.getSixiang(event.card)!=lib.skill.nsxingyun.getSixiang(event.cards[0])&&!player.getStorage('nsxingyun').contains(lib.skill.nsxingyun.getSixiang(event.card)); + }, + content:function(){ + 'step 0' + player.draw(2); + player.markAuto('nsxingyun',[lib.skill.nsxingyun.getSixiang(trigger.card)]); + 'step 1' + if(player.getStorage('nsxingyun').length>=4) player.addSkillLog('bazhen'); + }, + }, + round:{ + charlotte:true, + onremove:true, + }, + }, + }, + nshanlang:{ + trigger:{player:'phaseZhunbeiBegin'}, + direct:true, + filter:function(event,player){ + return player.countCards('h')>0&&game.hasPlayer( + (current)=>player!=current&&player.canCompare(current) + ); + }, + content:function(){ + 'step 0' + var goon=player.hasCard(function(card){ + return get.value(card)<=7; + },'h'); + player.chooseTarget([1,3],get.prompt('nshanlang'),'和至多三名角色进行拼点',function(card,player,target){ + return target!=player&&player.canCompare(target); + }).set('ai',function(target){ + if(!_status.event.goon) return false; + var att=get.attitude(_status.event.player,target); + if(att>=0) return 0; + if(target.hasSkillTag('noh')) att/=3; + return -att/Math.sqrt(target.countCards('h')); + }).set('goon',goon); + 'step 1' + if(result.bool){ + event.max_num=0; + var targets=result.targets.sortBySeat(); + player.logSkill('nshanlang',targets); + player.chooseToCompare(targets).callback=lib.skill.nshanlang.callback; + } + else event.finish(); + 'step 2' + if(event.target){ + player.chooseBool('是否令'+get.translation(target)+'获得一张牌?').set('goon',get.attitude(player,target)>0).set('ai',()=>_status.event.goon); + } + else event.finish(); + 'step 3' + if(result.bool){ + var card=get.cardPile2(function(card){ + return !lib.skill.nsxingyun.getSixiang(card); + }); + if(card) target.gain(card,'gain2'); + } + }, + callback:function(){ + var list=[[player,event.num1],[target,event.num2]],evt=event.getParent(2); + for(var i of list){ + if(i[1]>evt.max_num){ + evt.max_num=i[1]; + evt.target=i[0]; + } + else if(evt.target&&i[1]==evt.max_num&&i[0]!=evt.target){ + delete evt.target; + } + } + }, + }, //钟离牧 nskuanhuai:{ trigger:{player:'phaseUseBegin'}, @@ -2283,6 +2640,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(get.position(result.card,true)=='o'){ var pos=event.positions.randomRemove(); + event._first_pos=pos; game.broadcastAll(function(card,id,player,pos){ lib.skill.yuuki_yicha.addCard(card,id,pos); lib.skill.yuuki_yicha.changePrompt(get.translation(player)+'放置了'+get.translation(card),id); @@ -2296,7 +2654,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }); 'step 2' if(get.position(result.card,true)=='o'){ - var pos=event.positions.randomRemove(); + var list=event.positions; + if(get.isLuckyStar(player)){ + var index=(get.color(cards[0],false)==get.color(result.card,false)?0:1); + list=list.filter(function(i){ + return Math.abs(i%2-event._first_pos%2)==index; + }) + } + var pos=list.randomRemove(); game.broadcastAll(function(card,id,player,pos){ lib.skill.yuuki_yicha.addCard(card,id,pos); lib.skill.yuuki_yicha.changePrompt(get.translation(player)+'放置了'+get.translation(card),id); @@ -15640,7 +16005,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - var card=target.getCards('hej').randomGet(); + var cards=target.getCards('hej'); + if(get.isLuckyStar(player)){ + var cardx=ui.cardPile.firstChild; + if(cardx){ + var color=get.color(card),cardsx=cards.filter(function(i){ + return get.color(i)==color; + }); + if(cardsx.length>0) cards=cardsx; + } + } + var card=cards.randomGet(); event.card=card; player.gain(card,target,'giveAuto','bySelf'); player.draw(); @@ -16283,6 +16658,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kyou_zhidian_info:'你可以将一张锦囊牌当做【杀】使用(无距离限制)。当你使用【杀】指定第一个目标后,你选择一个与上次不同的选项:①此【杀】不可被响应。②此【杀】无视防具。③此【杀】伤害+1。④此【杀】不计入次数限制。', kyou_duanfa:'断发', kyou_duanfa_info:'限定技,当你受到伤害时,若伤害值不小于你的体力值,则你可弃置所有手牌,防止此伤害并回复1点体力;且当你于你的下回合开始前成为【杀】或伤害性锦囊牌的目标后,你摸一张牌。', + key_seira:'樱庭星罗', + seira_xinghui:'星辉', + seira_xinghui_info:'准备阶段,你可以投掷一枚骰子,观看牌堆顶的X张牌(X为投掷点数)并以任意顺序扣置于一名没有“星屑”的角色的武将牌上,称为“星屑”。有“星屑”的角色造成的伤害+1,且当其从牌堆顶摸牌或取得判定牌时,改为从“星屑”中获取。', + seira_yuanying:'缘映', + seira_yuanying_info:'出牌阶段限一次,你可选择两名角色。这两名角色成为“姻缘者”且获得〖姻缘〗直到你下次发动〖缘映〗。', + seira_yinyuan:'姻缘', + seira_yinyuan_info:'你的手牌对其他“姻缘者”可见。出牌阶段限一次,你可以获得一名其他“姻缘者”区域内的一张牌,然后其回复1点体力。', noname:"小无", noname_zhuyuan:"祝愿", @@ -16610,6 +16992,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ nskuanhuai_info:'出牌阶段开始时,你可以从弃牌堆中获得一张非基本牌。若如此做:你本阶段内不能使用基本牌,且本回合的弃牌阶段结束时,你可以依次使用本阶段内弃置的基本牌。', nsdingbian:'定边', nsdingbian_info:'锁定技。当你于回合内使用锦囊牌或装备牌后,你令自己本回合的手牌上限-1且选择一项:⒈从牌堆获得一张基本牌。⒉令一种基本牌于本回合内不计入手牌上限。', + prp_zhugeliang_ab:'诸葛亮', + prp_zhugeliang:'派对浪客', + nsxingyun:'星陨', + nsxingyun_info:'每回合限一次。你可以将一张手牌当做任意一张符合“四象天阵”的牌使用。然后若这两张牌的类型不同,则你删除此“四象天阵”并摸两张牌。当你删除“四象天阵”中的最后一个项目后,你获得技能〖八阵〗。', + nsxingyun_faq:'四象天阵', + nsxingyun_faq_info:'青龙:无标签普通锦囊牌
朱雀:延时锦囊牌
白虎:伤害类卡牌
玄武:【闪】/回复类卡牌', + nshanlang:'酣浪', + nshanlang_info:'准备阶段,你可以和至多三名角色拼点。然后若这些角色中有拼点牌唯一最大的角色,则你可以令该角色从牌堆中获得一张不符合“四象天阵”的牌。', junk_zhangrang:'四花张让', junktaoluan:'滔乱', diff --git a/character/extra.js b/character/extra.js index cac55fbc2..edbcd70cd 100755 --- a/character/extra.js +++ b/character/extra.js @@ -264,19 +264,27 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var list=[]; var equip3=target.getEquip(3); var equip4=target.getEquip(4); - if(equip3&&evt.filterCard(get.autoViewAs({ - name:'shan', - storage:{shouli:true}, - },[equip3]),player,evt)) list.push('shan'); - var sha=get.autoViewAs({ - name:'sha', - storage:{shouli:true}, - },[equip4]); - if(equip4&&evt.filterCard(sha,player,evt)){ - if(!evt.filterTarget||game.hasPlayer(function(current){ - return evt.filterTarget(sha,player,current); - })) list.push('sha'); - }; + var backupx=_status.event; + _status.event=evt; + try{ + if(equip3){ + var shan=get.autoViewAs({ + name:'shan', + storage:{shouli:true}, + },[equip3]); + if(evt.filterCard(shan,player,event)) list.push('shan'); + } + if(equip4){ + var sha=get.autoViewAs({ + name:'sha', + storage:{shouli:true}, + },[equip4]); + if(evt.filterCard(sha,player,evt)&&(!evt.filterTarget||game.hasPlayer(function(current){ + return evt.filterTarget(sha,player,current); + }))) list.push('sha'); + }; + }catch(e){game.print(e)}; + _status.event=backupx; if(list.length==1) event._result={ bool:true, links:[list[0]=='shan'?equip3:equip4], @@ -1003,7 +1011,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ group:'jiufa_count', subSkill:{ count:{ - trigger:{player:'useCard1'}, + trigger:{player:['useCard1','respond']}, forced:true, charlotte:true, popup:false, @@ -6163,7 +6171,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ pinghe_info:'锁定技。①你的手牌上限基数等于你已损失的体力值。②当你受到其他角色造成的伤害时,若你有牌且你的体力上限大于1,则你防止此伤害,减一点体力上限并将一张手牌交给一名其他角色。然后若你拥有〖英霸〗,则伤害来源获得一个“平定”标记。', shen_jiangwei:'神姜维', jiufa:'九伐', - jiufa_info:'①当你声明使用牌时,你记录此牌的牌名。②当你使用或打出的牌结算结束后,若你的〖九伐〗记录中包含至少⑨种不同的牌名,则你可以展示牌堆顶的⑨张牌,选择并获得其中任意张点数各不相同且{这九张牌中存在未被选择且和已选择的牌点数相同}的牌,清除所有的记录,将其余牌置入弃牌堆。', + jiufa_info:'①当你声明使用或打出牌时,你记录此牌的牌名。②当你使用或打出的牌结算结束后,若你的〖九伐〗记录中包含至少⑨种不同的牌名,则你可以展示牌堆顶的⑨张牌,选择并获得其中任意张点数各不相同且{这九张牌中存在未被选择且和已选择的牌点数相同}的牌,清除所有的记录,将其余牌置入弃牌堆。', tianren:'天任', tianren_info:'锁定技。①当有一张基本牌或普通锦囊牌不因使用而进入弃牌堆后,你获得一枚“天任”标记。②当你获得“天任”标记或体力上限变化后,若你的“天任”数不小于X,则你移去X枚“天任”,加1点体力上限并摸两张牌(X为你的体力上限)。', pingxiang:'平襄', diff --git a/character/mobile.js b/character/mobile.js index 97e571c48..ca02032c8 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -14673,15 +14673,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, - "rw_tengjia4":{ + rw_tengjia4:{ inherit:"tengjia3", audio:"tengjia1", }, - "xinfu_pingcai":{ - "wolong_card":function(){ + xinfu_pingcai:{ + subSkill:{backup:{}}, + wolong_card:function(){ 'step 0' var ingame=game.hasPlayer(function(current){ - return ['sp_zhugeliang','re_sp_zhugeliang','ol_sp_zhugeliang'].contains(current.name)||['sp_zhugeliang','re_sp_zhugeliang','ol_sp_zhugeliang'].contains(current.name2); + return ['sp_zhugeliang','re_sp_zhugeliang','ol_sp_zhugeliang','prp_zhugeliang'].contains(current.name)||['sp_zhugeliang','re_sp_zhugeliang','ol_sp_zhugeliang','prp_zhugeliang'].contains(current.name2); })?true:false; var prompt='请选择'; prompt+=ingame?'至多两名':'一名'; @@ -14700,7 +14701,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, - "fengchu_card":function(){ + fengchu_card:function(){ 'step 0' var ingame=game.hasPlayer(function(current){ return ['re_pangtong','pangtong','ol_pangtong'].contains(current.name)||['re_pangtong','pangtong','ol_pangtong'].contains(current.name2); @@ -14722,10 +14723,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, - "xuanjian_card":function(){ + xuanjian_card:function(){ 'step 0' event.ingame=game.hasPlayer(function(current){ - return ['re_xushu','xin_xushu','xushu'].contains(current.name)||['re_xushu','xin_xushu','xushu'].contains(current.name2); + 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='请选择一名角色,令其回复一点体力并摸一张牌'; prompt+=event.ingame?',然后你摸一张牌。':'。'; @@ -14742,7 +14743,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.ingame) player.draw(); } }, - "shuijing_card":function(){ + shuijing_card:function(){ 'step 0' event.ingame=game.hasPlayer(function(current){ return current.name=='simahui'||current.name2=='simahui'; @@ -14850,70 +14851,264 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:true, enable:"phaseUse", usable:1, - content:function(){ - "step 0" - var list=["wolong","fengchu","xuanjian","shuijing"]; - var list2=[]; - for(var i=0;i1; })) return 1+Math.random(); else return 1; } - else if(button.link.name=='wolong_card'){ + else if(name=='wolong_card'){ if(game.hasPlayer(function(current){ return get.damageEffect(current,player,player,'fire')>0; })) return 1.2+Math.random(); else return 0.5; } else return 0.6; - }); + }, + backup:function(links,player){ + return { + audio:'xinfu_pingcai', + filterCard:()=>false, + selectCard:-1, + takara:links[0][2], + content:lib.skill.xinfu_pingcai.contentx, + } + }, + }, + contentx:function(){ + "step 0" + event.pingcai_delayed=true; + var name=lib.skill.xinfu_pingcai_backup.takara; + event.cardname=name; + event.videoId=lib.status.videoId++; + if(player.isUnderControl()){ + game.swapPlayerAuto(player); + } + var switchToAuto=function(){ + game.pause(); + game.countChoose(); + setTimeout(function(){ + _status.imchoosing=false; + event._result={ + bool:true, + }; + game.resume(); + },9000); + }; + var createDialog=function(player,id,name){ + if(player==game.me) return; + var dialog=ui.create.dialog('forcebutton','hidden'); + var str=get.translation(player)+'正在擦拭宝物上的灰尘…'; + var canSkip=(!_status.connectMode); + if(canSkip) str+='
(点击宝物可以跳过等待AI操作)'; + dialog.textPrompt=dialog.add('
'+str+'
'); + dialog.classList.add('fixed'); + dialog.classList.add('scroll1'); + dialog.classList.add('scroll2'); + dialog.classList.add('fullwidth'); + dialog.classList.add('fullheight'); + dialog.classList.add('noupdate'); + dialog.videoId=id; + + var canvas2=document.createElement('canvas'); + dialog.canvas_viewer=canvas2; + dialog.appendChild(canvas2); + canvas2.classList.add('grayscale'); + canvas2.style.position="absolute"; + canvas2.style.width='249px'; + canvas2.style.height='249px'; + canvas2.style['border-radius']='6px'; + canvas2.style.left="calc(50% - 125px)"; + canvas2.style.top="calc(50% - 125px)"; + canvas2.width=249; + canvas2.height=249; + canvas2.style.border='3px solid'; + + var ctx2=canvas2.getContext('2d'); + var img=new Image(); + img.src=lib.assetURL+'image/card/'+name+'.png'; + img.onload=function(){ + ctx2.drawImage(this,0,0,this.width,this.height,0,0,canvas2.width,canvas2.height); + } + if(canSkip){ + var skip=function(){ + if(event.pingcai_delayed){ + delete event.pingcai_delayed; + event._result={ + bool:true, + }; + game.resume(); + canvas2.removeEventListener(lib.config.touchscreen?'touchend':'click',skip); + } + }; + canvas2.addEventListener(lib.config.touchscreen?'touchend':'click',skip); + } + dialog.open(); + }; + var chooseButton=function(id,name){ + var event=_status.event; + _status.xinfu_pingcai_finished=false; + + var dialog=ui.create.dialog('forcebutton','hidden'); + dialog.textPrompt=dialog.add('
擦拭掉宝物上的灰尘吧!
'); + event.switchToAuto=function(){ + event._result={ + bool:_status.xinfu_pingcai_finished, + }; + game.resume(); + _status.imchoosing=false; + _status.xinfu_pingcai_finished=true; + }; + dialog.classList.add('fixed'); + dialog.classList.add('scroll1'); + dialog.classList.add('scroll2'); + dialog.classList.add('fullwidth'); + dialog.classList.add('fullheight'); + dialog.classList.add('noupdate'); + dialog.videoId=id; + + var canvas=document.createElement('canvas'); + var canvas2=document.createElement('canvas'); + + dialog.appendChild(canvas2); + dialog.appendChild(canvas); + + canvas.style.position="absolute"; + canvas.style.width='249px'; + canvas.style.height='249px'; + canvas.style['border-radius']='6px'; + canvas.style.left="calc(50% - 125px)"; + canvas.style.top="calc(50% - 125px)"; + canvas.width=249; + canvas.height=249; + canvas.style.border='3px solid'; + + canvas2.style.position="absolute"; + canvas2.style.width='249px'; + canvas2.style.height='249px'; + canvas2.style['border-radius']='6px'; + canvas2.style.left="calc(50% - 125px)"; + canvas2.style.top="calc(50% - 125px)"; + canvas2.width=249; + canvas2.height=249; + canvas2.style.border='3px solid'; + + var ctx=canvas.getContext('2d'); + var ctx2=canvas2.getContext('2d'); + + var img=new Image(); + img.src=lib.assetURL+'image/card/'+name+'.png'; + img.onload=function(){ + ctx2.drawImage(this,0,0,this.width,this.height,0,0,canvas2.width,canvas2.height); + } + + ctx.fillStyle='lightgray'; + ctx.fillRect(0,0,canvas.width,canvas.height); + + canvas.onmousedown=function(ev){ + //if(_status.xinfu_pingcai_finished) return; + canvas.onmousemove=function(e){ + if(_status.xinfu_pingcai_finished) return; + ctx.beginPath(); + ctx.clearRect(e.offsetX-16,e.offsetY-16,32,32); + var data=ctx.getImageData(canvas.width*0.1,canvas.height*0.1,canvas.width*0.8,canvas.height*0.8).data; + var sum=0; + for(var i=3;i=(canvas.width*canvas.height)*0.6){ + //ctx.clearRect(0,0,canvas.width,canvas.height); + if(!_status.xinfu_pingcai_finished){ + _status.xinfu_pingcai_finished=true; + event.switchToAuto(); + } + } + } + } + canvas.ontouchstart=function(ev){ + //if(_status.xinfu_pingcai_finished) return; + canvas.ontouchmove=function(e){ + if(_status.xinfu_pingcai_finished) return; + ctx.beginPath(); + var rect=canvas.getBoundingClientRect(); + var X=((e.touches[0].clientX-rect.left)/rect.width*canvas.width); + var Y=((e.touches[0].clientY-rect.top)/rect.height*canvas.height); + ctx.clearRect(X-16,Y-16,32,32); + var data=ctx.getImageData(canvas.width*0.1,canvas.height*0.1,canvas.width*0.8,canvas.height*0.8).data; + var sum=0; + for(var i=3;i=(canvas.width*canvas.height)*0.6){ + if(!_status.xinfu_pingcai_finished){ + _status.xinfu_pingcai_finished=true; + event.switchToAuto(); + } + } + } + } + canvas.onmouseup=function(ev){ + canvas.onmousemove=null; + } + canvas.ontouchend=function(ev){ + canvas.ontouchmove=null; + } + + dialog.open(); + + game.pause(); + game.countChoose(); + }; + //event.switchToAuto=switchToAuto; + game.broadcastAll(createDialog,player,event.videoId,name); + if(event.isMine()){ + chooseButton(event.videoId,name); + } + else if(event.isOnline()){ + event.player.send(chooseButton,event.videoId,name); + event.player.wait(); + game.pause(); + } + else{ + switchToAuto(); + } "step 1" - var delay=8400-(get.utc()-event.time); - if(delay>0){ - event.delay2=true; - event.dialog=ui.create.dialog(get.translation(player)+'正在擦拭宝物...'+(_status.connectMode?'':'
(点击屏幕可跳过等待)')); - event.videoId=lib.status.videoId++; - game.broadcast('createDialog',event.videoId,get.translation(player)+'正在擦拭宝物...'); - game.pause(); - event.pingcai_delayed=true; - setTimeout(function(){ - if(event.pingcai_delayed==true){ - delete event.pingcai_delayed; - game.resume(); - } - },delay); - if(!_status.connectMode){ - event.forceMine=true; - event.custom.replace.window=function(){ - if(event.pingcai_delayed==true){ - delete event.forceMine; - delete event.pingcai_delayed; - game.resume(); - } - } - } - } - event.card=result.links[0]; + var result=event.result||result; + if(!result) result={bool:false}; + event._result=result; + game.broadcastAll(function(id,result,player){ + _status.xinfu_pingcai_finished=true; + var dialog=get.idDialog(id); + if(dialog){ + dialog.textPrompt.innerHTML='
'+(get.translation(player)+'擦拭宝物'+(result.bool?'成功!':'失败…'))+'
'; + if(result.bool&&dialog.canvas_viewer) dialog.canvas_viewer.classList.remove('grayscale'); + } + if(!_status.connectMode) delete event.pingcai_delayed; + },event.videoId,result,player); + game.delay(2.5); "step 2" - if(event.delay2){ - delete event.custom.replace.window; - event.dialog.close(); - game.addVideo('cardDialog',null,event.videoId); - game.broadcast('closeDialog',event.videoId); + game.broadcastAll('closeDialog',event.videoId); + if(result.bool){ + player.logSkill('pcaudio_'+event.cardname); + event.insert(lib.skill.xinfu_pingcai[event.cardname],{ + player:player, + }); } - player.logSkill('pcaudio_'+event.card.name); - player.$throw(event.card); - event.insert(lib.skill.xinfu_pingcai[event.card.name],{ - player:player, - }); }, ai:{ order:7, diff --git a/character/old.js b/character/old.js index 18126323e..83392eea7 100755 --- a/character/old.js +++ b/character/old.js @@ -584,7 +584,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_zhuran:'OL朱然', ol_guansuo:'OL关索', ol_manchong:'OL满宠', - old_fuhuanghou:'旧伏皇后', + old_fuhuanghou:'旧伏寿', old_caochong:'旧曹冲', old_guanqiujian:'旧毌丘俭', old_huangfusong:'旧皇甫嵩', diff --git a/character/rank.js b/character/rank.js index b95d9992e..26cee7375 100644 --- a/character/rank.js +++ b/character/rank.js @@ -526,6 +526,7 @@ window.noname_character_rank={ 'dc_sunru', 'dc_wangchang', 'fengfang', + 'prp_zhugeliang', ], bp:[ 'chess_diaochan', @@ -802,6 +803,10 @@ window.noname_character_rank={ 'caohua', 'zhaoang', 'ns_zhonglimu', + 'caoxiancaohua', + 'dc_liuba', + 'key_seira', + 'lukai', ], b:[ 'diy_feishi', @@ -1039,6 +1044,7 @@ window.noname_character_rank={ 'qinyilu', 'zhaoyǎn', 'zhangxun', + 'xiahoulingnv', ], bm:[ 'diy_xizhenxihong', @@ -1415,6 +1421,7 @@ window.noname_character_rank={ 'key_kyou', 'key_erika', 'key_satomi', + 'key_seira', 'noname', ], epic:[ @@ -1597,6 +1604,7 @@ window.noname_character_rank={ 'ol_xunyu', 'ns_zhonglimu', 'dc_sunru', + 'prp_zhugeliang', 'key_kano', 'key_haruko', 'key_akiko', @@ -2006,6 +2014,8 @@ window.noname_character_rank={ 'dc_jiling', 'dc_wangchang', 'jin_zhouchu', + 'lukai', + 'caoxiancaohua', ], junk:[ 'sunshao', @@ -2027,6 +2037,7 @@ window.noname_character_rank={ 'fanjiangzhangda', 'wangxiang', 'duji', + 'dc_liuba', ], } }; diff --git a/character/refresh.js b/character/refresh.js index 25db82cd0..894986cef 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -1886,6 +1886,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //徐晃 olduanliang:{ audio:2, + locked:false, enable:'chooseToUse', filterCard:function(card){ return (get.type2(card)!='trick'&&get.color(card)=='black'); @@ -4203,12 +4204,18 @@ game.import('character',function(lib,game,ui,get,ai,_status){ residi2:{ onremove:true, mod:{ - cardEnabled2:function(card,player){ + cardEnabled:function(card,player){ + if(player.getStorage('residi2').contains(get.color(card,player))) return false; + }, + cardRespondable:function(card,player){ + if(player.getStorage('residi2').contains(get.color(card,player))) return false; + }, + cardSavable:function(card,player){ if(player.getStorage('residi2').contains(get.color(card,player))) return false; }, }, intro:{ - content:'不能使用$的牌', + content:'不能使用或打出$牌', }, marktext:'敌', }, diff --git a/character/shenhua.js b/character/shenhua.js index d1f9e5347..7b77a0c17 100755 --- a/character/shenhua.js +++ b/character/shenhua.js @@ -1393,7 +1393,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ order:11, result:{ player:function(player){ - if(game.countPlayer(function(current){return (current.countCards('h')>player.countCards('h')||current.countCards('e')>player.countCards('e'))&&get.attitude(player,current)<0&&!player.storage.nzry_feijun.contains(current)})>0||game.countPlayer(function(current){return current.countCards('h')>player.countCards('h')&&get.attitude(player,current)<0})>0||(player.countCards('h')>=2&&game.countPlayer(function(current){return current.countCards('e')>player.countCards('e')&&get.attitude(player,current)<0})>0)) return 1; + if(game.hasPlayer(function(current){ + return (current.countCards('h')>player.countCards('h')||current.countCards('e')>player.countCards('e'))&&get.attitude(player,current)<0&&player.getStorage('nzry_feijun').contains(current); + })||game.hasPlayer(function(current){ + return current.countCards('h')>player.countCards('h')&&get.attitude(player,current)<0; + })||(player.countCards('h')>=2&&game.hasPlayer(function(current){ + return current.countCards('e')>player.countCards('e')&&get.attitude(player,current)<0; + }))) return 1; }, }, }, diff --git a/character/sp.js b/character/sp.js index 64f3fc6f6..1389035cf 100755 --- a/character/sp.js +++ b/character/sp.js @@ -5,7 +5,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ connect:true, characterSort:{ sp:{ - sp_tianji:["sunhao","liuxie","caoang","hetaihou","sunluyu",'ol_wangrong',"zuofen","ganfuren","ol_bianfuren","qinghegongzhu","tengfanglan","ruiji"], + sp_tianji:["sunhao","liuxie","caoang","hetaihou","sunluyu",'ol_wangrong',"zuofen","ganfuren","ol_bianfuren","qinghegongzhu","tengfanglan","ruiji",'caoxiancaohua'], sp_sibi:["yangxiu","chenlin","chengyu","shixie","fuwan","wangyun","zhugejin","simalang","maliang","buzhi","dongyun","kanze","sunqian","xizhicai","sunshao",'duxi',"jianggan",'ol_dengzhi','ol_yangyi','ol_dongzhao','ol_chendeng','jin_yanghu','zhaoyǎn'], sp_tianzhu:["wutugu","yanbaihu","shamoke","panfeng","zhugedan",'huangzu','gaogan',"tadun"], sp_nvshi:["lingju","guanyinping","zhangxingcai","mayunlu","dongbai","zhaoxiang",'ol_zhangchangpu','ol_xinxianying',"daxiaoqiao"], @@ -28,6 +28,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, character:{ + caoxiancaohua:['female','qun',3,['huamu','qianmeng','liangyuan','jisi']], jin_zhouchu:['male','jin',4,['shanduan','yilie']], zhaoyǎn:['male','wei',4,['tongxie']], ol_puyuan:['male','shu',4,['olshengong','olqisi']], @@ -172,6 +173,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ //kaisa:["male","western",4,["zhengfu"]], }, characterIntro:{ + caoxiancaohua:'此处为「曹宪」的相关介绍。关于「曹华」的部分请参考原本的介绍。
曹宪(生卒年不详),女,沛国谯县(今安徽省亳州市)人。东汉末年历史人物,汉献帝刘协嫔妃,魏武帝曹操女儿。建安十八年,嫁给汉献帝刘协,受封为贵人。黄初元年(220年),兄弟曹丕称帝后,汉献帝成为山阳公,不知所终。', zhaoyǎn:'赵俨(171~245年),字伯然,颍川阳翟(今河南禹州市)。东汉末年颍川“四大名士”之一,三国时期魏国名臣。熟读经史,精明强干。建安二年,投靠大将军曹操之后,起家朗陵县令,历任司空府掾、司空主薄、都督护军、扶风太守等职。魏文帝曹丕继位后,历任魏国侍中、驸马都尉、河东太守、典农中郎将、度支尚书,封宜土亭侯。魏明帝曹睿时期,历任大司农、骠骑将军、大司空等职。正始六年,去世,时年七十五,谥号为穆。', ruiji:'芮姬,芮玄之女,太子孙登妃,黄武五年卒。', weizi:'卫兹(?-190年),字子许,(《三国演义》中其名为卫弘,当为误记),陈留襄邑(今河南睢县)人。曾举孝廉,先后被车骑将军何苗、司徒杨赐等召辟。中平六年(189年)十二月,曹操在陈留己吾募兵,而卫兹以家财资助曹操,使曹操顺利募得五千士兵。此后,卫兹与曹操共同讨伐董卓。初平元年(190年),卫兹在跟随曹操讨伐董卓途中,于荥阳汴水遭遇董卓军徐荣,力战终日,失利身亡。', @@ -647,6 +649,348 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, skill:{ + //曹宪曹华 + huamu:{ + audio:2, + trigger:{player:'useCardAfter'}, + filter:function(event,player){ + var color=get.color(event.card); + if(color=='none') return false; + if(!player.hasHistory('lose',function(evt){ + return evt.hs.length>0&&evt.getParent()==event; + })||!event.cards.filterInD('oe').length) return false; + var history=game.getGlobalHistory('useCard'); + var index=history.indexOf(event); + if(index<1) return false; + var evt=history[index-1],color2=get.color(evt.card); + return color!=color2&&color2!='none'; + }, + prompt2:(event)=>'将'+get.translation(event.cards.filterInD('oe'))+'置于武将牌上', + check:function(event,player){ + if(!game.hasPlayer(function(current){ + return current.hasSkill('qianmeng',null,null,false)&&get.attitude(player,current)>0; + })) return false; + var cards=event.cards.filterInD('e'); + if(!cards.length) return true; + var card=cards[0]; + if(get.owner(card)==player){ + if(get.value(card,player)<=0) return true; + var subtype=get.subtype(card); + if(player.hasCard('hs',function(card){ + return get.subtype(card)==subtype&&player.canUse(card,player)&&get.effect(player,card,player,player)>0; + })) return true; + } + return false; + }, + content:function(){ + var cards=trigger.cards.filterInD('oe'); + player.addToExpansion(cards,'gain2').gaintag.add('huamu'); + }, + ai:{ + reverseOrder:true, + combo:'qianmeng', + }, + mod:{ + aiOrder:function(player,card,num){ + if(typeof card=='object'){ + var history=game.getGlobalHistory('useCard'); + if(!history.length) return; + var evt=history[history.length-1]; + if(evt&&evt.card&&get.color(evt.card)!='none'&&get.color(card)!='none'&&get.color(evt.card)!=get.color(card)){ + return num+4; + } + } + }, + }, + marktext:'木', + intro:{ + name:'灵杉&玉树', + markcount:function(storage,player){ + var red=[],black=[]; + var cards=player.getExpansions('huamu'); + for(var i of cards){ + var color=get.color(i,false); + (color=='red'?red:black).push(i); + } + return (''+black.length+'/'+red.length); + }, + content:'expansion', + mark:function(dialog,storage,player){ + var red=[],black=[]; + var cards=player.getExpansions('huamu'); + for(var i of cards){ + var color=get.color(i,false); + (color=='red'?red:black).push(i); + } + if(black.length){ + dialog.addText('灵杉'); + dialog.addSmall(black); + } + if(red.length){ + dialog.addText('玉树'); + dialog.addSmall(red); + } + }, + }, + }, + qianmeng:{ + audio:2, + trigger:{ + global:['loseAfter','equipAfter','addJudgeAfter','gainAfter','loseAsyncAfter','addToExpansionAfter'], + }, + filter:function(event,player){ + if(event.name=='addToExpansion'){ + if(event.gaintag.contains('huamu')){ + var cards=event.player.getExpansions('huamu'),red=cards.filter(function(i){ + return get.color(i,false)=='red'; + }); + if(cards.length==red.length||red.length==0||cards.length==red.length*2) return true; + } + } + if(event.name=='lose'&&event.getlx!==false){ + for(var i in event.gaintag_map){ + if(event.gaintag_map[i].contains('huamu')){ + var cards=event.player.getExpansions('huamu'),red=cards.filter(function(i){ + return get.color(i,false)=='red'; + }); + return (cards.length==red.length||red.length==0||cards.length==red.length/2); + } + } + return false; + } + return game.getGlobalHistory('cardMove',function(evt){ + if(evt.name!='lose'||event!=evt.getParent()) return false; + for(var i in evt.gaintag_map){ + if(evt.gaintag_map[i].contains('huamu')){ + var cards=evt.player.getExpansions('huamu'),red=cards.filter(function(i){ + return get.color(i,false)=='red'; + }); + return (cards.length==red.length||red.length==0||cards.length==red.length/2); + } + } + return false; + }).length>0; + }, + forced:true, + content:function(){ + player.draw(); + }, + ai:{combo:'huamu'}, + }, + liangyuan:{ + enable:'chooseToUse', + hiddenCard:function(player,name){ + if(name=='tao'){ + return !player.hasSkill('liangyuan_tao',null,null,false)&&game.hasPlayer(function(current){ + var storage=current.getExpansions('huamu'); + return storage.length>0&&storage.filter(function(i){ + return get.color(i,false)=='red'; + }).length>0; + }); + } + else if(name=='jiu'){ + return !player.hasSkill('liangyuan_jiu',null,null,false)&&game.hasPlayer(function(current){ + var storage=current.getExpansions('huamu'); + return storage.length>0&&storage.filter(function(i){ + return get.color(i,false)=='black'; + }).length>0; + }) + } + return false; + }, + filter:function(event,player){ + if(event.type=='wuxie') return false; + if(!player.hasSkill('liangyuan_tao',null,null,false)&&event.filterCard({name:'tao'},player,event)&&game.hasPlayer(function(current){ + var storage=current.getExpansions('huamu'); + return storage.length>0&&storage.filter(function(i){ + return get.color(i,false)=='red'; + }).length>0; + })) return true; + if(!player.hasSkill('liangyuan_jiu',null,null,false)&&event.filterCard({name:'jiu'},player,event)&&game.hasPlayer(function(current){ + var storage=current.getExpansions('huamu'); + return storage.length>0&&storage.filter(function(i){ + return get.color(i,false)=='black'; + }).length>0; + })) return true; + return false; + }, + chooseButton:{ + dialog:function(){ + return ui.create.dialog('良缘',[['tao','jiu'],'vcard'],'hidden'); + }, + filter:function(button,player){ + var evt=_status.event.getParent(); + var name=button.link[2],color=(name=='tao')?'red':'black'; + if(player.hasSkill('liangyuan_'+name,null,null,false)) return false; + var cards=[]; + game.countPlayer(function(current){ + cards.addArray(current.getExpansions('huamu').filter(function(i){ + return get.color(i,false)==color; + })); + }); + if(!cards.length) return false; + var card=get.autoViewAs({name:name},cards); + return evt.filterCard(card,player,evt); + }, + check:function(button){ + if(_status.event.getParent().type!='phase') return 1; + var player=_status.event.player; + var name=button.link[2],color=(name=='tao')?'red':'black'; + var cards=[]; + game.countPlayer(function(current){ + cards.addArray(current.getExpansions('huamu').filter(function(i){ + return get.color(i,false)==color; + })); + }); + var card=get.autoViewAs({name:name},cards); + return player.getUseValue(card,null,true); + }, + backup:function(links,player){ + var name=links[0][2],color=(name=='tao')?'red':'black'; + var cards=[]; + game.countPlayer(function(current){ + cards.addArray(current.getExpansions('huamu').filter(function(i){ + return get.color(i,false)==color; + })); + }); + if(!cards.length) return false; + var card=get.autoViewAs({name:name},cards); + return { + viewAs:card, + color:color, + selectCard:-1, + filterCard:()=>false, + precontent:function(){ + player.addTempSkill('liangyuan_'+event.result.card.name,'roundStart'); + player.logSkill('liangyuan'); + var list=[],color=lib.skill.liangyuan_backup.color; + var cards=[]; + game.countPlayer(function(current){ + var cardsx=current.getExpansions('huamu').filter(function(i){ + return get.color(i,false)==color; + }); + if(cardsx.length){ + cards.addArray(cardsx); + list.push([current,cardsx]); + current.$throw(cardsx); + game.log(current,'将',cardsx,'化作“'+(color==''?'':'')+'”良缘') + } + }); + event.result.cards=cards; + delete event.result.skill; + event.result._apply_args={'throw':false}; + game.loseAsync({ + lose_list:list, + }).setContent('chooseToCompareLose'); + }, + } + }, + prompt:function(links,player){ + var name=links[0][2],color=(name=='tao')?'玉树':'灵杉'; + return '将场上所有的“'+color+'”当做【'+get.translation(name)+'】使用'; + }, + }, + subSkill:{ + tao:{charlotte:true}, + jiu:{charlotte:true}, + }, + ai:{ + order:function(item,player){ + if(!player) player=_status.event.player; + return get.order({name:lib.skill.liangyuan.hiddenCard(player,'jiu')?'jiu':'tao'})+4; + }, + result:{ + player:function(player){ + if(_status.event.dying) return get.attitude(player,_status.event.dying); + return 1; + }, + }, + combo:'huamu', + threaten:3, + }, + }, + jisi:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + direct:true, + limited:true, + skillAnimation:true, + animationColor:'metal', + filter:function(event,player){ + var skills=player.getStockSkills('一!','五!').filter(function(skill){ + if(skill=='jisi') return false; + var info=get.info(skill); + return info&&!info.charlotte; + }); + var history=player.getAllHistory('useSkill'); + for(var i of history){ + if(skills.contains(i.sourceSkill)||skills.contains(i.skill)) return true; + } + return false; + }, + content:function(){ + 'step 0' + var skills2=[]; + var skills=player.getStockSkills('只!','因!').filter(function(skill){ + if(skill=='jisi') return false; + var info=get.info(skill); + return info&&!info.charlotte; + }); + var history=player.getAllHistory('useSkill'); + for(var i of history){ + if(skills.contains(i.sourceSkill)) skills2.add(i.sourceSkill); + if(skills.contains(i.skill)) skills2.add(i.skill); + if(skills.length==skills2.length) break; + } + event.skills2=skills2; + var str='令一名其他角色获得'; + for(var i=0;i1) str+='中的一个技能'; + str+='然后你'; + if(player.countCards('h')>0) str+='弃置所有手牌,并'; + str+='视为对其使用一张【杀】'; + player.chooseTarget(get.prompt('jisi'),str,lib.filter.notMe).set('ai',function(target){ + if(!_status.event.goon) return false; + var att=get.attitude(player,target); + if(att<4) return false; + var eff=get.effect(target,{name:'sha',isCard:true},player,player); + if(eff>=0) return att+eff; + if(target.hp<=2) return false; + return att/Math.max(1,-eff); + }).set('goon',function(){ + if(player.hasUnknown()||player.identity=='nei') return false; + var hs=player.getCards('h'); + if(!hs.length||get.value(hs,player)<=9-player.hp) return true; + return false; + }()); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + event.target=target; + player.logSkill('jisi',target); + player.awakenSkill('jisi'); + var list=event.skills2; + if(list.length==0) event._result={control:list[0]}; + player.chooseControl(list).set('prompt','令'+get.translation(target)+'获得一个技能').set( + 'ai',()=>_status.event.choice + ).set('choice',list.contains('qianmeng')?'qianmeng':list.randomGet()); + } + else event.finish(); + 'step 2' + target.addSkill(result.control); + 'step 3' + var num=player.countCards('h'); + if(num>0) player.chooseToDiscard('h',num,true); + 'step 4' + if(player.canUse('sha',target,false)) player.useCard(false,target,{ + name:'sha', + isCard:true, + },'noai') + }, + }, //周处 shanduan:{ audio:2, @@ -18888,7 +19232,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ spfengyin_info:'其他角色的回合开始时,若其体力值不少于你,你可以交给其一张【杀】,令其跳过出牌阶段和弃牌阶段。', spchizhong:'持重', spchizhong_info:'锁定技,你的手牌上限等于体力上限;其他角色死亡时,你加1点体力上限。', - sp_fuhuanghou:'SP伏皇后', + sp_fuhuanghou:'SP伏寿', spcangni:'藏匿', spcangni_info:'弃牌阶段开始时,你可以回复1点体力或摸两张牌,然后将你的武将牌翻面;其他角色的回合内,当你获得(每回合限一次)/失去一次牌时,若你的武将牌背面朝上,你可以令该角色摸/弃置一张牌。', spmixin:'密信', @@ -19077,6 +19421,15 @@ game.import('character',function(lib,game,ui,get,ai,_status){ shanduan_info:'①回合开始时,你生成数组R=[1,2,3,4]。②摸牌阶段开始时,你从数组R中选择并移除一个数字A。你本阶段的额定摸牌数改为A。③出牌阶段开始时,你从数组R中选择并移除两个数字B和C。你将你本阶段内的攻击范围基数最小值和使用【杀】的次数上限基础值改为B和C。④弃牌阶段开始时,你从数组R中选择并移除一个数字D。你令你本回合的手牌上限基数改为D。⑤当你于回合外受到伤害后,你令下回合生成的R中最小的一个数字+1。', yilie:'义烈', yilie_info:'每轮每种牌名限一次。你可以将两张颜色相同的手牌当做任意一种基本牌使用。', + caoxiancaohua:'曹宪曹华', + huamu:'化木', + huamu_info:'当你使用手牌后,若此牌和本回合内上一张被使用的牌颜色不同,则你可以将此牌对应的所有{位于处理区或装备区}的实体牌置于你的武将牌上。这些牌中的黑色牌称为“灵杉”,红色牌称为“玉树”。', + qianmeng:'前盟', + qianmeng_info:'锁定技。当有牌移动事件结算结束后,若有角色的“灵杉”和“玉树”数量发生了变化,且二者数量相等或有一项为0,则你摸一张牌', + liangyuan:'良缘', + liangyuan_info:'每轮每项各限一次。你可以将场上所有的“灵杉”/“玉树”置于处理区,然后将这些牌当做【酒】/【桃】使用。', + jisi:'羁肆', + jisi_info:'限定技。准备阶段,你可以令一名其他角色获得你武将牌上的一个已发动过的其他技能。然后你弃置所有手牌,并视为对其使用一张【杀】(无距离关系的限制)。', sp_tianji:'天极·皇室宗亲', sp_sibi:'四弼·辅国文曲', diff --git a/character/sp2.js b/character/sp2.js index acdf6e1ee..45f842f5b 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,6 +4,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sp2', connect:true, character:{ + xiahoulingnv:['female','wei',4,['fuping','weilie']], + dc_liuba:['male','shu',3,['dczhubi','dcliuzhuan']], zhangxun:['male','qun',4,['suizheng']], zongyu:['male','shu',3,['zyqiao','chengshang']], fengfang:['male','qun',3,['dcditing','dcbihuo']], @@ -169,10 +171,245 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp2_huangjia:['caomao','liubian','dc_liuyu'], sp2_zhangtai:['guozhao','fanyufeng','ruanyu','yangwan','re_panshu'], sp2_jinse:['caojinyu','re_sunyi','re_fengfangnv','caohua','laiyinger'], - sp_decade:['huaman','caobuxing','re_maliang','xin_baosanniang','re_xinxianying','dongxie','re_dongzhao','zhouyi','mamidi','dc_jiben','dc_luotong','guanning','dc_huangchengyan','dc_jiling','dc_sunru','zhaoang','dc_wangchang','fengfang','zhangxun'], + sp_decade:['huaman','caobuxing','re_maliang','xin_baosanniang','re_xinxianying','dongxie','re_dongzhao','zhouyi','mamidi','dc_jiben','dc_luotong','guanning','dc_huangchengyan','dc_jiling','dc_sunru','zhaoang','dc_wangchang','fengfang','zhangxun','xiahoulingnv','dc_liuba'], } }, skill:{ + //夏侯令女 + fuping:{ + audio:2, + hiddenCard:function(player,name){ + var list=player.getStorage('fuping').slice(0); + list.removeArray(player.getStorage('fuping_round')); + return list.contains(name)&&player.hasCard((card)=>(get.type(card)!='basic'),'ehs'); + }, + enable:'chooseToUse', + filter:function(event,player){ + var list=player.getStorage('fuping').slice(0); + list.removeArray(player.getStorage('fuping_round')); + if(!list.length) return false; + if(!player.hasCard((card)=>(get.type(card)!='basic'),'ehs')) return false; + for(var i of list){ + var type=get.type2(i,false); + if((type=='basic'||type=='trick')&&event.filterCard({name:i},player,event)) return true; + } + return false; + }, + chooseButton:{ + dialog:function(event,player){ + var list=player.getStorage('fuping').slice(0); + list.removeArray(player.getStorage('fuping_round')); + var list2=[]; + for(var i of list){ + var type=get.type2(i,false); + if((type=='basic'||type=='trick')&&event.filterCard({name:i},player,event)) list2.push([type,'',i]); + } + return ui.create.dialog('浮萍',[list2,'vcard']); + }, + check:function(button){ + if(_status.event.getParent().type!='phase') return 1; + return _status.event.player.getUseValue({name:button.link[2]},null,true); + }, + backup:function(links,player){ + return { + audio:'fuping', + filterCard:(card)=>get.type(card)!='basic', + position:'he', + popname:true, + viewAs:{ + name:links[0][2], + isCard:true, + }, + check:function(card){ + return 8-get.value(card); + }, + precontent:function(){ + player.addTempSkill('fuping_round'); + player.markAuto('fuping_round',[event.result.card.name]); + }, + } + }, + prompt:function(links,player){ + return '将一张非基本牌当做【'+get.translation(links[0][2])+'】使用'; + }, + }, + ai:{ + order:8, + result:{player:1}, + respondSha:true, + skillTagFilter:function(player){ + var list=player.getStorage('fuping').slice(0); + list.removeArray(player.getStorage('fuping_round')); + return list.contains('sha'); + }, + }, + mod:{ + targetInRange:function(card,player,target){ + if(player.countDisabled()>=5) return true; + }, + }, + marktext:'萍', + intro:{content:'已记录$'}, + group:'fuping_mark', + subSkill:{ + mark:{ + trigger:{global:'useCardAfter'}, + filter:function(event,player){ + return player!=event.player&&event.targets.contains(player)&& + player.countDisabled()<5&&!player.getStorage('fuping').contains(event.card.name); + }, + logTarget:'player', + prompt2:(event)=>('废除一个装备栏并记录【'+get.translation(event.card.name)+'】'), + check:function(event,player){ + var list=['tao','juedou','guohe','shunshou','wuzhong','xietianzi','yuanjiao','wanjian','nanman','huoshaolianying','chuqibuyi','zhujinqiyuan','lebu','bingliang']; + if(!list.contains(event.card.name)) return false; + if(['nanman','wanjian'].contains(event.card.name)&&!player.hasValueTarget({name:event.card.name})) return false; + var list=[3,5,4,1,2]; + for(var i of list){ + if(!player.isDisabled(i)){ + var card=player.getEquip(i); + if(!card) return true; + if(get.value(card,player)<=0) return true; + } + } + return false; + }, + content:function(){ + player.markAuto('fuping',[trigger.card.name]); + game.log(player,'记录了','#y'+get.translation(trigger.card.name)); + player.chooseToDisable().set('ai',function(event,player,list){ + var list=[3,5,4,1,2]; + for(var i of list){ + if(!player.isDisabled(i)){ + var card=player.getEquip(i); + if(!card) return 'equip'+i; + if(get.value(card,player)<=0) return 'equip'+i; + } + } + return list.randomGet(); + }); + }, + }, + backup:{audio:'fuping'}, + round:{charlotte:true,onremove:true}, + }, + }, + weilie:{ + audio:2, + enable:'phaseUse', + filter:function(event,player){ + return player.countMark('weilie')<=player.getStorage('fuping').length&&player.countCards('he')>0&&game.hasPlayer((current)=>current.isDamaged()) + }, + filterCard:true, + position:'he', + filterTarget:(card,player,target)=>target.isDamaged(), + check:function(card){ + return 8-get.value(card); + }, + content:function(){ + 'step 0' + player.addMark('weilie',1,false); + target.recover(); + 'step 1' + if(target.isDamaged()) target.draw(); + }, + onremove:true, + ai:{ + order:1, + result:{ + target:function(player,target){ + var eff=get.recoverEffect(target,player,player); + if(target.getDamagedHp()>1) eff+=get.effect(target,{name:'wuzhong'},player,target)/2; + return eff; + }, + }, + }, + }, + //刘巴 + dczhubi:{ + audio:2, + trigger:{global:'loseAfter'}, + filter:function(event,player){ + if(event.type!='discard'||event.position!=ui.discardPile) return false; + for(var i of event.cards){ + if(get.suit(i,event.player)=='diamond') return true; + } + return false; + }, + prompt2:'检索一张【无中生有】并置于牌堆顶', + check:function(event,player){ + return get.attitude(player,_status.currentPhase.next)>0; + }, + content:function(){ + var card=get.cardPile(function(card){ + return card.name=='wuzhong'&&get.suit(card)!='diamond'; + }); + if(card){ + game.log(player,'将',card,'置于牌堆顶'); + card.fix(); + ui.cardPile.insertBefore(card,ui.cardPile.firstChild); + game.updateRoundNumber(); + game.delayx(); + } + }, + }, + dcliuzhuan:{ + audio:2, + group:['dcliuzhuan_mark','dcliuzhuan_gain'], + mod:{ + targetEnabled:function(card){ + if(card.cards){ + for(var i of card.cards){ + if(i.hasGaintag('dcliuzhuan_tag')) return false; + } + } + else if(get.itemtype(card)=='card'){ + if(card.hasGaintag('dcliuzhuan_tag')) return false; + } + }, + }, + subSkill:{ + gain:{ + trigger:{global:'loseAfter'}, + forced:true, + logTarget:'player', + filter:function(event,player){ + if(event.type!='discard'||event.player!=_status.currentPhase) return false; + for(var i in event.gaintag_map){ + if(event.gaintag_map[i].contains('dcliuzhuan_tag')) return true; + } + return false; + }, + content:function(){ + var cards=trigger.hs.filter(function(i){ + return trigger.gaintag_map[i.cardid]&&trigger.gaintag_map[i.cardid].contains('dcliuzhuan_tag'); + }); + if(cards.length>0) player.gain(cards,'gain2'); + }, + }, + mark:{ + trigger:{global:'gainBegin'}, + forced:true, + popup:false, + silent:true, + lastDo:true, + filter:function(event,player){ + if(player==event.player||event.player!=_status.currentPhase) return false; + var evt=event.getParent('phaseDraw'); + if(evt&&evt.name=='phaseDraw') return false; + return true; + }, + content:function(){ + trigger.gaintag.add('dcliuzhuan_tag'); + trigger.player.addTempSkill('dcliuzhuan_tag'); + }, + }, + tag:{ + charlotte:true, + onremove:(player,skill)=>player.removeGaintag(skill), + }, + }, + }, //张勋 suizheng:{ audio:2, @@ -419,7 +656,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var num=lib.skill.dcpingxi.getNum()+ui.selected.cards.length; if(num0; + return get.effect(current,{name:'guohe_copy2'},player,player)+get.effect(current,{name:'sha'},player,player)>0; })){ if(get.position(card)=='h'&&player.needsToDiscard()>ui.selected.cards.length) return 7+1/Math.max(1,get.value(card)); return 7-get.value(card); @@ -1292,6 +1529,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.card.name=='sha'&&event.card.nature) str+=get.translation(event.card.nature); return (str+'【'+get.translation(event.card.name)+'】'); }, + check:function(event,player){ + return !get.tag(event.card,'norepeat') + }, content:function(){ player.addTempSkill('tongli_effect'); var evt=trigger.getParent('phaseUse'); @@ -1700,7 +1940,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, content:function(){ 'step 0' - event.num=player.getStat('damage'); + event.num=Math.min(5,player.getStat('damage')); player.chooseTarget('是否发动限定技【襄戍】?','令一名角色回复'+event.num+'点体力并摸'+get.cnNumber(event.num)+'张牌',function(card,player,target){ return target.isDamaged(); }).set('ai',function(target){ @@ -4678,7 +4918,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player.chooseButton(dialog,true).set('ai',function(button){ var player=_status.event.player; var color=get.color(button.link),cards=player.getExpansions('syjiqiao'); - var num1=cards.filter((card)=>get.color(card)==color),num2=cards.length-num1; + var num1=cards.filter((card)=>get.color(card)==color).length,num2=cards.length-num1; if(num1>=num2) return get.value(button.link); return 0; }); @@ -4810,7 +5050,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ var list=[]; for(var name of lib.inpile){ if(get.type(name)!='basic') continue; - if(player.hasUseTarget({name:name},false)) list.push(['基本','',name]); + if(source.hasUseTarget({name:name},false)) list.push(['基本','',name]); if(name=='sha'){ for(var nature of lib.inpile_nature){ if(source.hasUseTarget({name:name,nature:nature},false)) list.push(['基本','',name,nature]); @@ -7422,10 +7662,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ global:['phaseBefore'], }, direct:true, - filter:function(event,player){ + filter:function(event,player,name){ if(player.hasSkill('zhiwei2')) return false; if(get.mode()=='guozhan') return event.name=='showCharacter'&&(event.toShow.contains('gz_luyusheng')||event.toShow.contains('luyusheng')); - return event.name!='showCharacter'&&(event.name!='phase'||game.phaseNumber==0); + return event.name!='showCharacter'&&(name!='phaseBefore'||game.phaseNumber==0); }, content:function(){ 'step 0' @@ -14450,6 +14690,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(event.card.name!='sha'&&get.type(event.card)!='trick') return false; var info=get.info(event.card); if(info.allowMultiple==false) return false; + var num=player.getHistory('useSkill',function(evt){ + return evt.skill=='pyzhuren_club'; + }).length; + if(num>=2) return false; if(event.targets&&!info.multitarget){ if(game.hasPlayer(function(current){ return lib.filter.targetEnabled2(event.card,player,current)&&!event.targets.contains(current); @@ -14476,10 +14720,6 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!event.isMine()&&!event.isOnline()) game.delayx(); event.targets=result.targets; } - else{ - player.storage.counttrigger[event.name]--; - event.finish(); - } 'step 2' if(event.targets){ player.logSkill(event.name,event.targets); @@ -16623,6 +16863,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhaoang:'赵昂,字伟章(一作伟璋),天水冀人。汉末时曹操部下。初为羌道令,建安中转参军事徒居州治冀城。建安十八年,马超围冀城多天,城中饥困,凉州刺史韦康不愿百姓再受苦而打算投降,赵昂进劝但不为所纳。后马超背信弃义杀韦康并劫其子赵月为人质,把他送至南郑。欲以此要迫使赵昂为己所用。后与梁宽、赵衢、庞恭、杨阜等结谋为康报仇,并举兵讨伐马超。马超兵败遂弃城,投奔张鲁。得张鲁之援后马超于建安十九年复寇,赵昂与妻子王异坚守祁山三十天至夏侯渊的救兵解围,其子赵月终为马超斩杀。自冀城之难,至于祁山,赵昂出九奇策。', fengfang:'冯方,其字不详,司隶人。初掌校事,监察京师及周边地区,刺探文武百官秘事。十常侍之乱后,董卓进京,掌控朝政。冯方认为他胸怀不臣之心,于是弃官携女儿冯妤至江南避祸。其后董卓果然乱政,京师之地生灵涂炭,更将洛阳付之一炬。冯方因其先见之明得以保全家人。
冯妤长大成人后,有倾国之貌。一日袁术登城观景,得见冯妤,心中非常喜欢,于是将其纳为夫人。冯方心忧自家女儿不谙世事,于是将可以让人更显妩媚的家传宝梳交给她,希望能借此使其获得袁术的宠爱。其后果然传来袁术偏爱冯夫人的消息,冯方因此宽心,接受了袁术的征辟,为其效力。然而好景不长,没过多久,冯妤自缢身亡的消息传出,冯方悲愤不已,弃官而走,自此销声匿迹。', zhangxun:'张勋,东汉末年军阀袁术帐下大将,袁术称帝后受封大将军。初平四年(公元193年),袁术引兵入陈留,被曹操、袁绍合力击败,逃至雍丘。后入九江,杀死扬州刺史陈温而自领之,并任命张勋、桥蕤为大将。时孙策依附于袁术,被表为怀义校尉,张勋对其倾心敬服。袁术称帝后,任命张勋为大将军,攻打吕布,大败而还。其后曹操又以袁术称帝为名南下进攻,袁术闻之大惊,即走度淮,留张勋、桥蕤守蕲阳以拒曹。曹操破其军,斩桥蕤,张勋退走。建安四年(公元199年),袁术病死,张勋率残军欲南投孙策,途中被袁术旧部刘勋俘虏,其后下落不明。', + xiahoulingnv:'夏侯令女,字令女,名不详。生卒年不详,三国时期人物。夏侯文宁之女(《三国演义》中为夏侯令之女),曹文叔之妻。其事迹见于《三国志·魏书·诸夏侯曹传第九》裴松之注引皇甫谧《列女传》。而在《三国演义》中,由于作者断句错误,便认为“夏侯令女”是“夏侯令之女”之意(见《三国演义》第107回:“乃夏侯令女也”,由其语气可推断)。', }, characterTitle:{ wulan:'#b对决限定武将', @@ -16755,6 +16996,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ luotong:['luotong','dc_luotong'], mamidi:['mamidi','xin_mamidi'], dc_wangchang:['dc_wangchang','tw_wangchang'], + liuba:['dc_liuba','liuba'], }, translate:{ lijue:"李傕", @@ -17288,7 +17530,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ rexingluan:'兴乱', rexingluan_info:'出牌阶段限一次,当你使用的仅指定一个目标的牌结算完成后,你可以获得场上一张与此牌点数相同的牌,或获得牌堆中随机一张点数与此牌相同的牌。', xinxingluan:'兴乱', - xinxingluan_info:'出牌阶段限一次。当你使用牌结算结束后,你可选择一项:①观看牌堆中的两张点数为6的牌并获得其中一张(没有则改为摸六张牌);②令一名其他角色弃置一张点数为6的牌或交给你一张牌;③获得场上的一张点数为6的牌。', + xinxingluan_info:'每回合限一次。当你于出牌阶段使用牌结算结束后,你可选择一项:①观看牌堆中的两张点数为6的牌并获得其中一张(没有则改为摸六张牌);②令一名其他角色弃置一张点数为6的牌或交给你一张牌;③获得场上的一张点数为6的牌。', zhouyi:'周夷', zhukou:'逐寇', zhukou_info:'①当你于一名角色的出牌阶段第一次造成伤害后,你可以摸X张牌(X为本回合你已使用的牌数)。②你的结束阶段,若你本回合没有造成伤害,你可以对两名其他角色各造成1点伤害。', @@ -17575,6 +17817,17 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhangxun:'张勋', suizheng:'随征', suizheng_info:'结束阶段,你可以选择一名角色A,获得如下效果直到其下回合结束:①A于下回合出牌阶段内使用【杀】的次数上限+1且无距离限制;②A下回合的出牌阶段结束时,你可以选择一名此阶段内受到过A造成的伤害的角色B,视为对B使用一张【杀】。', + dc_liuba:'刘巴', + dczhubi:'铸币', + dczhubi_info:'当有♦牌因弃置而进入弃牌堆后,你可以令系统从牌堆/弃牌堆中检索一张【无中生有】,并将此牌置于牌堆顶。', + dcliuzhuan:'流转', + dcliuzhuan_tag:'转', + dcliuzhuan_info:'锁定技。①其他角色于其回合内不于摸牌阶段而获得的牌称为“转”。②你不能成为实体牌中包含“转”的牌的目标。③当有“转”因弃置而进入弃牌堆后,你获得之。', + xiahoulingnv:'夏侯令女', + fuping:'浮萍', + fuping_info:'①其他角色对你使用的结算结束后,若你未因此技能记录过此牌的名称且你有未废除的装备栏,则你可以废除一个装备栏,记录此牌的名称。②每回合每种牌名限一次。你可以将一张非基本牌当做〖浮萍①〗记录过的基本牌或锦囊牌使用或打出。③若你的所有装备栏均已被废除,则你使用牌无距离限制。', + weilie:'炜烈', + weilie_info:'每局游戏限X次。出牌阶段,你可以弃置一张牌并选择一名已受伤的角色,令该角色回复1点体力。然后若其体力值小于体力上限,则其摸一张牌(X为你〖浮萍①〗中的记录数+1)。', sp_whlw:"文和乱武", sp_zlzy:"逐鹿中原", diff --git a/character/yijiang.js b/character/yijiang.js index f2d94a938..18971244f 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -12,10 +12,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yijiang_2014:['hanhaoshihuan','chenqun','caozhen','zhangsong','wuyi','zhoucang','zhuhuan','guyong','sunluban','yj_jushou','caifuren'], yijiang_2015:['caoxiu','caorui','zhongyao','xiahoushi','liuchen','zhangyi','zhuzhi','quancong','sunxiu','gongsunyuan','guotufengji'], yijiang_2016:['guohuanghou','sunziliufang','huanghao','liyan','sundeng','cenhun','zhangrang','liuyu'], - yijiang_2017:['xinxianying','jikang','wuxian','qinmi','xuezong','xushi','caiyong','caojie',], + yijiang_2017:['xinxianying','jikang','wuxian','qinmi','xuezong','xushi','caiyong','caojie'], + yijiang_2022:['lukai'], }, }, character:{ + lukai:['male','wu',4,['lkbushi','lkzhongzhuang']], xin_fazheng:['male','shu',3,['xinenyuan','xinxuanhuo'],['die_audio']], old_guanzhang:['male','shu',4,['old_fuhun']], old_wangyi:['female','wei',3,['oldzhenlie','oldmiji']], @@ -99,6 +101,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yujin:["male","wei",4,["yizhong"],[]], }, characterIntro:{ + lukai:'陆凯(198-269年),字敬风,吴郡吴县(今江苏省苏州市)人。三国时期吴国重臣,丞相陆逊的族侄,大司马陆抗的族兄。黄武年间,举孝廉出身,曾任永兴县长、诸暨县长,颇有治绩。拜建武都尉、儋耳太守,与聂友率军讨伐朱崖和儋耳,迁建武校尉。五凤二年(255年),讨斩零陵山贼陈毖,拜偏将军、巴丘督,册封都乡侯。迁武昌右部督,随军进入寿春。后拜荡魏将军,加号绥远将军。吴景帝孙休继位,拜征北将军、假节、领豫州牧。孙皓即位,迁任镇西大将军,都督巴丘,又领荆州牧,进封嘉兴侯。宝鼎元年(266年),迁左丞相。以正直及屡次劝谏孙皓而闻名。建衡元年(269年),去世,时年七十二。', caozhi:'字子建,沛国谯人,三国曹魏著名文学家,建安文学代表人物。魏武帝曹操之子,魏文帝曹丕之弟,生前曾为陈王,去世后谥号“思”,因此又称陈思王。南朝宋文学家谢灵运更有“天下才有一石,曹子建独占八斗”的评价。王士祯尝论汉魏以来二千年间诗家堪称“仙才”者,曹植、李白、苏轼三人耳。', gaoshun:'中国东汉末年将领,吕布帐下中郎将。史载高顺为人清白有威严,不好饮酒,所统率的部队精锐非常,号称“陷阵营”。屡进忠言于吕布,吕布虽知其忠而不能用。曹操击破吕布后,高顺被曹操所杀。', chengong:'字公台,东汉末年吕布帐下谋士,东郡东武阳人。性情刚直,足智多谋,年少时与海内知名之士相互结交。192年,陈宫等人主张曹操接任兖州牧。但此后陈宫因曹操杀害边让而与曹操反目,并游说张邈等人背叛曹操迎吕布入兖州,辅助吕布攻打曹操。吕布战败后,随吕布等一同被曹操所擒,决意赴死。', @@ -194,6 +197,184 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhonghui:['jiangwei'], }, skill:{ + //陆凯 + lkbushi:{ + audio:2, + getBushi:function(player){ + if(!player.storage.lkbushi) return ['spade','heart','club','diamond']; + return player.storage.lkbushi; + }, + onremove:true, + trigger:{player:'phaseZhunbeiBegin'}, + direct:true, + locked:false, + content:function(){ + 'step 0' + var list=lib.skill.lkbushi.getBushi(player); + list=list.map(function(i){ + return ['','','lukai_'+i]; + }); + var next=player.chooseToMove('卜筮:是否调整〖卜筮〗的花色顺序?'); + next.set('list',[ + ['无次数限制/使用打出摸牌
可弃牌无效/结束阶段获得',[list,'vcard'],function(list){ + var list2=list.map(function(i){ + return get.translation(i[2].slice(6)); + }); + return '你使用'+list2[0]+'牌时无次数限制;使用或打出'+list2[1]+'时,摸一张牌;
成为'+list2[2]+'牌目标后可弃一张牌无效;结束阶段获得一张'+list2[3]+'牌'; + }], + ]); + next.set('processAI',function(){ + var player=_status.event.player; + var list=lib.skill.lkbushi.getBushi(player); + var list2=[]; + var hs=player.getCards('hs',function(card){ + return player.hasValueTarget(card); + }); + list.sort(function(a,b){ + return hs.filter((i)=>get.suit(i)==b).length-hs.filter((i)=>get.suit(i)==a).length; + }); + list2.push(list.shift()); + hs=player.getCards('hs','sha'); + list.sort(function(a,b){ + return hs.filter((i)=>get.suit(i)==b).length-hs.filter((i)=>get.suit(i)==a).length; + }); + list2.unshift(list.shift()); + list.randomSort(); + list2.addArray(list); + return [list2.map((i)=>['','','lukai_'+i])] + }); + 'step 1' + if(result.bool){ + var list=lib.skill.lkbushi.getBushi(player),list2=result.moved[0].map(function(i){ + return i[2].slice(6); + }); + for(var i=0;i<4;i++){ + if(list[i]!=list2[i]){ + player.logSkill('lkbushi'); + player.storage.lkbushi=list2; + var str='#g'; + for(var j=0;j<4;j++){ + str+=get.translation(list2[j]); + if(j!=3) str+='/'; + } + game.log(player,'将','#g【卜筮】','的花色序列改为',str); + game.delayx(); + break; + } + } + } + }, + mark:true, + marktext:'筮', + intro:{ + content:function(storage,player){ + var list=lib.skill.lkbushi.getBushi(player).map((i)=>get.translation(i)); + return '①你使用'+list[0]+'牌无次数限制。②当你使用或打出'+list[1]+'牌后,你摸一张牌。③当你成为'+list[2]+'牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张'+list[3]+'牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。'; + }, + }, + group:['lkbushi_unlimit','lkbushi_draw','lkbushi_defend','lkbushi_gain'], + subSkill:{ + unlimit:{ + mod:{ + cardUsable:function(card,player){ + var list=lib.skill.lkbushi.getBushi(player); + if(list[0]==get.suit(card)) return Infinity; + }, + }, + trigger:{player:'useCard1'}, + forced:true, + popup:false, + silent:true, + firstDo:true, + filter:function(event,player){ + if(event.addCount===false) return true; + var list=lib.skill.lkbushi.getBushi(player); + return (list[0]==get.suit(event.card)); + }, + content:function(){ + trigger.addCount=false; + var stat=player.getStat().card,name=trigger.card.name; + if(stat[name]&&typeof stat[name]=='number') stat[name]--; + }, + }, + draw:{ + audio:'lkbushi', + trigger:{player:['useCard','respond']}, + forced:true, + locked:false, + filter:function(event,player){ + var list=lib.skill.lkbushi.getBushi(player); + return list[1]==get.suit(event.card); + }, + content:function(){ + player.draw(); + }, + }, + defend:{ + audio:'lkbushi', + trigger:{target:'useCardToTargeted'}, + direct:true, + filter:function(event,player){ + var list=lib.skill.lkbushi.getBushi(player); + return list[2]==get.suit(event.card)&&!event.excluded.contains(player)&&player.countCards('he')>0; + }, + content:function(){ + 'step 0' + player.chooseToDiscard('he',get.prompt('lkbushi'),'弃置一张牌,令'+get.translation(trigger.card)+'对你无效').set('ai',function(card){ + if(_status.event.eff>=0) return false; + return -_status.event.eff*1.1-get.value(card); + }).set('eff',get.effect(player,trigger.card,trigger.player,player)).logSkill=['lkbushi_defend',trigger.player]; + 'step 1' + if(result.bool){ + trigger.excluded.add(player); + } + }, + }, + gain:{ + audio:'lkbushi', + trigger:{player:'phaseJieshuBegin'}, + forced:true, + locked:false, + content:function(){ + var list=lib.skill.lkbushi.getBushi(player); + var card=get.cardPile(function(card){ + return get.suit(card,false)==list[3]; + }); + if(card) player.gain(card,'gain2'); + }, + }, + }, + }, + lkzhongzhuang:{ + audio:2, + trigger:{source:'damageBegin1'}, + forced:true, + filter:function(event,player){ + if(!event.card||event.card.name!='sha'||event.getParent().type!='card') return false; + var range=player.getAttackRange(); + if(range>3) return true; + return range<3&&event.num>1; + }, + content:function(){ + var range=player.getAttackRange(); + if(range>3) trigger.num++; + else trigger.num=1; + }, + global:'lkzhongzhuang_ai', + subSkill:{ + ai:{ + ai:{ + filterDamage:true, + skillTagFilter:function(player,tag,arg){ + if(arg&&arg.card&&arg.card.name=='sha'){ + if(arg.player&&arg.player.hasSkill('lkzhongzhuang')&&arg.player.getAttackRange()<3) return true; + } + return false; + }, + }, + }, + }, + }, //顾雍 olbingyi:{ audio:'bingyi', @@ -3808,7 +3989,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ 'step 1' if(result.bool){ trigger.player.addSkill('xinsidi2'); - trigger.player.storage.xinsidi2=get.color(result.cards[0],result.cards[0].original=='h'?player:false); + trigger.player.markAuto('xinsidi2',[get.color(result.cards[0],result.cards[0].original=='h'?player:false)]); trigger.player.storage.xinsidi4=player; trigger.player.syncStorage('xinsidi2'); } @@ -3843,8 +4024,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, mod:{ - cardEnabled2:function(card,player){ - if(get.color(card)==player.storage.xinsidi2) return false; + cardEnabled:function(card,player){ + if(player.getStorage('xinsidi2').contains(get.color(card))) return false; + }, + cardRespondable:function(card,player){ + if(player.getStorage('xinsidi2').contains(get.color(card))) return false; + }, + cardSavable:function(card,player){ + if(player.getStorage('xinsidi2').contains(get.color(card))) return false; }, }, intro:{ @@ -10065,6 +10252,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhichi2:{ trigger:{target:'useCardToBefore'}, forced:true, + charlotte:true, priority:15, filter:function(event,player){ return get.type(event.card)=='trick'||event.card.name=='sha'; @@ -12092,6 +12280,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } } }, + card:{ + lukai_spade:{fullskin:true}, + lukai_heart:{fullskin:true}, + lukai_diamond:{fullskin:true}, + lukai_club:{fullskin:true}, + }, dynamicTranslate:{ rejueqing:function(player){ if(player.storage.rejueqing_rewrite) return '锁定技,你即将造成的伤害均视为失去体力。'; @@ -12116,6 +12310,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(player.hasSkill('funan_jiexun')) return '其他角色使用或打出牌响应你使用的牌时,你可获得其使用或打出的牌。'; return '其他角色使用或打出牌响应你使用的牌时,你可令其获得你使用的牌(其本回合不能使用或打出这些牌),然后你获得其使用或打出的牌。'; }, + lkbushi:function(player){ + var list=lib.skill.lkbushi.getBushi(player).map((i)=>get.translation(i)); + return '①你使用'+list[0]+'牌无次数限制。②当你使用或打出'+list[1]+'牌后,你摸一张牌。③当你成为'+list[2]+'牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张'+list[3]+'牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。'; + }, }, characterReplace:{ caozhi:['re_caozhi','caozhi'], @@ -12754,6 +12952,19 @@ game.import('character',function(lib,game,ui,get,ai,_status){ xinzhaofu_info:'主公技,限定技。出牌阶段,你可选择至多两名其他角色。这两名角色视为在所有其他吴势力角色的攻击范围内。', olbingyi:'秉壹', olbingyi_info:'每阶段限一次。当你因弃置而失去牌后,你可以展示所有手牌。若这些牌的颜色均相同,则你可以与至多X名其他角色各摸一张牌(X为你的手牌数)。', + lukai:'陆凯', + lukai_spade:'♠', + lukai_spade_bg:'♠️', + lukai_heart:'♥', + lukai_heart_bg:'♥️', + lukai_club:'♣', + lukai_club_bg:'♣', + lukai_diamond:'♦', + lukai_diamond_bg:'♦️️', + lkbushi:'卜筮', + lkbushi_info:'①你使用♠牌无次数限制。②当你使用或打出♥牌后,你摸一张牌。③当你成为♣牌的目标后,你可以弃置一张牌,令此牌对你无效。④结束阶段开始时,你从牌堆或弃牌堆获得一张♦牌。⑤准备阶段开始时,你可调整此技能中四种花色的对应顺序。', + lkzhongzhuang:'忠壮', + lkzhongzhuang_info:'锁定技。当你因执行【杀】的效果而造成伤害时,若你的攻击范围:大于3,则此伤害+1;小于3,则此伤害改为1。', yijiang_2011:'一将成名2011', yijiang_2012:'一将成名2012', @@ -12762,6 +12973,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yijiang_2015:'一将成名2015', yijiang_2016:'原创设计2016', yijiang_2017:'原创设计2017', + yijiang_2022:'原创设计2022', }, }; }); diff --git a/font/suits.ttf b/font/suits.ttf new file mode 100644 index 000000000..dd15c8f52 Binary files /dev/null and b/font/suits.ttf differ diff --git a/game/asset.js b/game/asset.js index 2cbd6d00f..0503b3c36 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.9.115.3', + 'v1.9.116', 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', 'audio/background/aozhan_rewrite.mp3', @@ -4630,6 +4630,10 @@ window.noname_asset_list=[ 'image/card/sanlve.png', 'image/card/zhaogujing.png', 'image/card/changandajian_equip1.png', + 'image/card/lukai_club.png', + 'image/card/lukai_diamond.png', + 'image/card/lukai_heart.png', + 'image/card/lukai_spade.png', 'image/card/bagua.png', 'image/card/baihupifeng.png', @@ -5644,6 +5648,12 @@ window.noname_asset_list=[ 'image/character/zhangxun.jpg', 'image/character/zhaoang.jpg', 'image/character/zhaoyǎn.jpg', + 'image/character/caoxiancaohua.jpg', + 'image/character/dc_liuba.jpg', + 'image/character/key_seira.jpg', + 'image/character/lukai.jpg', + 'image/character/prp_zhugeliang.jpg', + 'image/character/xiahoulingnv.jpg', 'image/character/baiwuchang.jpg', 'image/character/baosanniang.jpg', diff --git a/game/config.js b/game/config.js index 5f8d38742..c8c9aa464 100644 --- a/game/config.js +++ b/game/config.js @@ -1,6 +1,5 @@ window.config={ extension_sources:{ - Coding:'https://nakamurayuri.coding.net/p/noname-extension/d/noname-extension/git/raw/master/', GitHub:'https://raw.githubusercontent.com/libccy/noname-extension/master/', }, extension_source:'Coding', @@ -134,7 +133,7 @@ window.config={ sort:'type_sort', cards:['standard','extra'], - characters:['standard','shenhua','sp','sp2','yijiang','refresh','xinghuoliaoyuan','mobile','extra','yingbian','sb'], + characters:['standard','shenhua','sp','sp2','yijiang','refresh','xinghuoliaoyuan','mobile','extra','yingbian','sb','tw','offline'], connect_characters:['diy'], connect_cards:['huanlekapai','guozhan','sp','zhulu','yingbian','yongjian'], plays:[], diff --git a/game/game.js b/game/game.js index e80cc4ebb..2e738e4c0 100644 --- a/game/game.js +++ b/game/game.js @@ -21,6 +21,7 @@ globalHistory:[{ cardMove:[], custom:[], + useCard:[], }], cardtag:{ yingbian_zhuzhan:[], @@ -35,7 +36,7 @@ configprefix:'noname_0.9_', versionOL:27, updateURLS:{ - coding:'https://nakamurayuri.coding.net/p/noname/d/noname/git/raw', + coding:'https://ghproxy.com/https://raw.githubusercontent.com/libccy/noname', github:'https://raw.githubusercontent.com/libccy/noname', }, updateURL:'https://raw.githubusercontent.com/libccy/noname', @@ -540,7 +541,7 @@ init:'coding', unfrequent:true, item:{ - coding:'Coding', + coding:'Github Proxy', github:'GitHub', }, onclick:function(item){ @@ -7438,6 +7439,9 @@ } lib.assetURL=noname_inited; } + if(lib.assetURL.indexOf('com.widget.noname.qingyao')!='-1'){ + alert('您正在一个不受信任的闭源客户端上运行《无名杀》。建议您更换为其他开源的无名杀客户端,避免给您带来不必要的损失。'); + } var config3=null; var proceed=function(config2){ @@ -7493,13 +7497,13 @@ var pack=window.noname_package; delete window.noname_package; for(i in pack.character){ - if(lib.config.hiddenCharacterPack.indexOf(i)==-1){ + if(lib.config.all.sgscharacters.contains(i)||lib.config.hiddenCharacterPack.indexOf(i)==-1){ lib.config.all.characters.push(i); lib.translate[i+'_character_config']=pack.character[i]; } } for(i in pack.card){ - if(lib.config.hiddenCardPack.indexOf(i)==-1){ + if(lib.config.all.sgscards.contains(i)||lib.config.hiddenCardPack.indexOf(i)==-1){ lib.config.all.cards.push(i); lib.translate[i+'_card_config']=pack.card[i]; } @@ -7580,8 +7584,10 @@ lib.configMenu.appearence.config.identity_font.item[i]=pack.font[i]; lib.configMenu.appearence.config.cardtext_font.item[i]=pack.font[i]; lib.configMenu.appearence.config.global_font.item[i]=pack.font[i]; - ui.css.fontsheet.sheet.insertRule("@font-face {font-family: '"+i+"';src: url('"+lib.assetURL+"font/"+i+".ttf');}",0); + ui.css.fontsheet.sheet.insertRule("@font-face {font-family: '"+i+"'; src: url('"+lib.assetURL+"font/"+i+".ttf');}",0); + ui.css.fontsheet.sheet.insertRule("@font-face {font-family: '"+i+"'; src: url('"+lib.assetURL+"font/suits.ttf');}",0); } + ui.css.fontsheet.sheet.insertRule("@font-face {font-family: 'Suits'; src: url('"+lib.assetURL+"font/suits.ttf');}",0); lib.configMenu.appearence.config.cardtext_font.item.default='默认'; lib.configMenu.appearence.config.global_font.item.default='默认'; } @@ -10671,9 +10677,14 @@ buttons.classList.add('guanxing'); buttons._link=i; if(list[i][1]){ - var cardsb=ui.create.buttons(list[i][1],'card',buttons); - if(list[i][2]&&typeof list[i][2]=='string'){ - for(var ij of cardsb) ij.node.gaintag.innerHTML=get.translation(list[i][2]); + if(get.itemtype(list[i][1])=='cards'){ + var cardsb=ui.create.buttons(list[i][1],'card',buttons); + if(list[i][2]&&typeof list[i][2]=='string'){ + for(var ij of cardsb) ij.node.gaintag.innerHTML=get.translation(list[i][2]); + } + } + else if(list[i][1].length==2){ + ui.create.buttons(list[i][1][0],list[i][1][1],buttons); } } if(list[i][2]&&typeof list[i][2]=='function') buttons.textPrompt=list[i][2]; @@ -11255,6 +11266,7 @@ _status.globalHistory.push({ cardMove:[], custom:[], + useCard:[], }); game.countPlayer2(function(current){ current.actionHistory.push({useCard:[],respond:[],skipped:[],lose:[],gain:[],sourceDamage:[],damage:[],custom:[],useSkill:[]}); @@ -12590,12 +12602,16 @@ var next=player.chooseControl(info.chooseButton.chooseControl(event,player)); next.dialog=dialog; next.set('ai',info.chooseButton.check||function(){return 0;}); + if(event.id) next._parent_id=event.id; + next.type='chooseToUse_button'; } else{ var next=player.chooseButton(dialog); next.set('ai',info.chooseButton.check||function(){return 1;}); next.set('filterButton',info.chooseButton.filter||function(){return true;}); next.set('selectButton',info.chooseButton.select||1); + if(event.id) next._parent_id=event.id; + next.type='chooseToUse_button'; } event.buttoned=event.result.skill; } @@ -14173,7 +14189,7 @@ choosePlayerCard:function(){ "step 0" if(!event.dialog) event.dialog=ui.create.dialog('hidden'); - else if(!event.isMine){ + else if(!event.isMine()){ event.dialog.style.display='none'; } if(event.prompt){ @@ -14286,7 +14302,7 @@ return; } if(!event.dialog) event.dialog=ui.create.dialog('hidden'); - else if(!event.isMine){ + else if(!event.isMine()){ event.dialog.style.display='none'; } if(event.prompt==undefined){ @@ -14431,7 +14447,7 @@ return; } if(!event.dialog) event.dialog=ui.create.dialog('hidden'); - else if(!event.isMine){ + else if(!event.isMine()){ event.dialog.style.display='none'; } if(event.prompt==undefined){ @@ -14937,6 +14953,7 @@ event.oncard(event.card,event.player); } player.actionHistory[player.actionHistory.length-1].useCard.push(event); + game.getGlobalHistory().useCard.push(event); if(event.addCount!==false){ if(player.stat[player.stat.length-1].card[card.name]==undefined){ player.stat[player.stat.length-1].card[card.name]=1; @@ -20266,6 +20283,11 @@ if(event.addCount===false){ next.addCount=false; } + if(result._apply_args){ + for(var i in result._apply_args){ + next[i]=result._apply_args[i]; + } + } return next; } else if(result.skill){ @@ -22117,6 +22139,7 @@ var info=get.info(card); if(info.multicheck&&!info.multicheck(card,this)) return false; if(!lib.filter.cardEnabled(card,this)) return false; + if(includecard&&!lib.filter.cardUsable(card,this)) return false; if(distance!==false&&!lib.filter.targetInRange(card,this,target)) return false; return lib.filter[includecard?'targetEnabledx':'targetEnabled'](card,this,target); }, @@ -25171,8 +25194,8 @@ } var cardnum=card[1]||''; if(parseInt(cardnum)==cardnum) cardnum=parseInt(cardnum); - if([1,11,12,13].contains(cardnum)){ - cardnum={'1':'A','11':'J','12':'Q','13':'K'}[cardnum]; + if(cardnum>0&&cardnum<14){ + cardnum=['A','2','3','4','5','6','7','8','9','10','J','Q','K'][cardnum-1]; } if(!lib.card[card[2]]){ lib.card[card[2]]={}; @@ -25378,7 +25401,7 @@ this.node.info.innerHTML=info.modinfo; } else{ - this.node.info.innerHTML=get.translation(card[0])+' '+cardnum; + this.node.info.innerHTML=get.translation(card[0])+' '+cardnum+''; } if(info.addinfo){ if(!this.node.addinfo){ @@ -26805,6 +26828,7 @@ var info=get.info(card); if(info.updateUsable=='phaseUse'){ event=event||_status.event; + if(event.type=='chooseToUse_button') event=event.getParent(); if(player!=_status.event.player) return true; if(event.getParent().name!='phaseUse') return true; if(event.getParent().player!=player) return true; @@ -26819,6 +26843,7 @@ card=get.autoViewAs(card,null,player); var info=get.info(card); event=event||_status.event; + if(event.type=='chooseToUse_button') event=event.getParent(); if(player!=_status.event.player) return true; if(info.updateUsable=='phaseUse'){ if(event.getParent().name!='phaseUse') return true; @@ -29016,6 +29041,9 @@ } }, cancel:function(id){ + if(_status.event._parent_id==id&&_status.event.isMine()&&_status.paused&&_status.imchoosing){ + ui.click.cancel(); + } if(_status.event.id==id&&_status.event.isMine()&&_status.paused&&_status.imchoosing){ ui.click.cancel(); if(ui.confirm){ @@ -33746,6 +33774,7 @@ check:function(event){ var i,j,range; if(event==undefined) event=_status.event; + event._checked=true; var custom=event.custom||{}; var ok=true,auto=true; var player=event.player; @@ -36590,7 +36619,7 @@ roundNumber:0, shuffleNumber:0, }; - window['b'+'ann'+'e'+'dE'+'x'+'ten'+'s'+'i'+'o'+'ns']=[]; + window['b'+'ann'+'e'+'dE'+'x'+'ten'+'s'+'i'+'o'+'ns']=['\u5047装\u65e0敌']; var ui={ updates:[], thrown:[], @@ -39104,14 +39133,19 @@ page.classList.add('menu-buttons'); page.classList.add('leftbutton'); if(!connectMenu){ - if(mode.indexOf('mode_')!=0){ + if(lib.config.all.sgscharacters.contains(mode)){ + ui.create.div('.config.pointerspan','该武将包不可被隐藏',page); + } + else if(mode.indexOf('mode_')!=0){ ui.create.div('.config.pointerspan','隐藏武将包',page,function(){ if(this.firstChild.innerHTML=='隐藏武将包'){ - this.firstChild.innerHTML='武将包将在重启后隐藏'; - lib.config.hiddenCharacterPack.add(mode); - if(!lib.config.prompt_hidepack){ - alert('隐藏的扩展包可通过选项-其它-重置隐藏内容恢复'); - game.saveConfig('prompt_hidepack',true); + if(confirm('真的要隐藏“'+get.translation(mode+'_character_config')+'”武将包吗?\n建议使用“关闭”而不是“隐藏”功能,否则将会影响其他相关武将包的正常运行!')){ + this.firstChild.innerHTML='武将包将在重启后隐藏'; + lib.config.hiddenCharacterPack.add(mode); + if(!lib.config.prompt_hidepack){ + alert('隐藏的扩展包可通过选项-其它-重置隐藏内容恢复'); + game.saveConfig('prompt_hidepack',true); + } } } else{ @@ -39315,7 +39349,7 @@ var list=[]; for(var i=0;i隐藏卡牌包',page,function(){ if(this.firstChild.innerHTML=='隐藏卡牌包'){ this.firstChild.innerHTML='卡牌包将在重启后隐藏'; @@ -48655,7 +48689,7 @@ if(_status.event.skill&&_status.event.name=='chooseToUse'){ ui.click.cancel(); } - else{ + else if(_status.event._checked){ game.uncheck(); game.check(); } diff --git a/game/source.js b/game/source.js index 986daac8c..3a055581e 100644 --- a/game/source.js +++ b/game/source.js @@ -38,6 +38,7 @@ window.noname_source_list=[ 'character/yijiang.js', 'character/yingbian.js', 'character/yxs.js', + 'font/suits.ttf', 'game/asset.js', 'game/codemirror.js', 'game/config.js', diff --git a/game/update.js b/game/update.js index 34c8c7821..783326037 100644 --- a/game/update.js +++ b/game/update.js @@ -1,26 +1,25 @@ window.noname_update={ - version:'1.9.115.3', - update:'1.9.115.2.1', + version:'1.9.116', + update:'1.9.115.3', changeLog:[ - '钟离牧入选稿公布', - 'OL周处、赵俨', - '十周年纪灵、孙茹、王昶、冯芳、张勋、赵昂', - '海外服神关羽', + '派对浪客、樱庭星罗入选稿公布', + 'OL曹宪曹华、十周年刘巴、陆凯、夏侯令女', + '花色字体显示优化', '技能调整与bug修复', ], files:[ - //'card/extra.js', + 'card/extra.js', //'card/gujian.js', - //'card/guozhan.js', + 'card/guozhan.js', //'card/gwent.js', //'card/huanlekapai.js', //'card/mtg.js', - //'card/sp.js', + 'card/sp.js', //'card/standard.js', //'card/swd.js', //'card/yunchou.js', //'card/yingbian.js', - 'card/yongjian.js', + //'card/yongjian.js', //'card/zhenfa.js', //'card/zhulu.js', 'character/diy.js', @@ -32,7 +31,7 @@ window.noname_update={ 'character/mobile.js', //'character/mtg.js', //'character/offline.js', - //'character/old.js', + 'character/old.js', //'character/ow.js', 'character/rank.js', 'character/refresh.js', @@ -45,11 +44,12 @@ window.noname_update={ //'character/swd.js', //'character/xianjian.js', //'character/xinghuoliaoyuan.js', - 'character/yingbian.js', + //'character/yingbian.js', 'character/yijiang.js', //'character/yxs.js', //'extension/boss/extension.js', - //'layout/default/layout.css', + 'font/suits.ttf', + 'layout/default/layout.css', //'layout/newlayout/global.css', //'layout/default/menu.css', //'layout/nova/layout.css', @@ -59,7 +59,7 @@ window.noname_update={ //'mode/chess.js', //'mode/connect.js', //'mode/doudizhu.js', - //'mode/guozhan.js', + 'mode/guozhan.js', //'mode/identity.js', //'mode/single.js', //'mode/stone.js', @@ -68,16 +68,16 @@ window.noname_update={ 'game/game.js', //'game/keyWords.js', //'game/NoSleep.js', - //'game/config.js', + 'game/config.js', //'game/package.js', //'game/asset.js', - //'game/source.js', + 'game/source.js', //'theme/style/hp/custom.css', //'theme/style/hp/emotion.css', //'theme/style/hp/glass.css', //'theme/style/hp/image', //'theme/style/hp/official.css', - //'theme/style/hp/ol.css', + 'theme/style/hp/ol.css', //'theme/style/hp/round.css', //'theme/style/hp/xinglass.css', //'theme/style/hp/xinround.css', diff --git a/image/card/lukai_club.png b/image/card/lukai_club.png new file mode 100644 index 000000000..b13b153e9 Binary files /dev/null and b/image/card/lukai_club.png differ diff --git a/image/card/lukai_diamond.png b/image/card/lukai_diamond.png new file mode 100644 index 000000000..3591db5a7 Binary files /dev/null and b/image/card/lukai_diamond.png differ diff --git a/image/card/lukai_heart.png b/image/card/lukai_heart.png new file mode 100644 index 000000000..16bb0883c Binary files /dev/null and b/image/card/lukai_heart.png differ diff --git a/image/card/lukai_spade.png b/image/card/lukai_spade.png new file mode 100644 index 000000000..e56994d38 Binary files /dev/null and b/image/card/lukai_spade.png differ diff --git a/image/character/caoxiancaohua.jpg b/image/character/caoxiancaohua.jpg new file mode 100644 index 000000000..6e5ff163a Binary files /dev/null and b/image/character/caoxiancaohua.jpg differ diff --git a/image/character/dc_liuba.jpg b/image/character/dc_liuba.jpg new file mode 100644 index 000000000..0f5e71b7c Binary files /dev/null and b/image/character/dc_liuba.jpg differ diff --git a/image/character/key_seira.jpg b/image/character/key_seira.jpg new file mode 100644 index 000000000..8da6c2457 Binary files /dev/null and b/image/character/key_seira.jpg differ diff --git a/image/character/lukai.jpg b/image/character/lukai.jpg new file mode 100644 index 000000000..0bb658432 Binary files /dev/null and b/image/character/lukai.jpg differ diff --git a/image/character/prp_zhugeliang.jpg b/image/character/prp_zhugeliang.jpg new file mode 100644 index 000000000..443c1305b Binary files /dev/null and b/image/character/prp_zhugeliang.jpg differ diff --git a/image/character/xiahoulingnv.jpg b/image/character/xiahoulingnv.jpg new file mode 100644 index 000000000..9d48b8845 Binary files /dev/null and b/image/character/xiahoulingnv.jpg differ diff --git a/layout/default/layout.css b/layout/default/layout.css index 1511e6f72..ff5ef7efe 100644 --- a/layout/default/layout.css +++ b/layout/default/layout.css @@ -25,7 +25,7 @@ body { overflow: hidden; text-rendering: optimizeLegibility; transform-origin: top left; - font-family: 'STHeiti','SimHei','Microsoft JhengHei','Microsoft YaHei','WenQuanYi Micro Hei',Helvetica,Arial,sans-serif + font-family: 'STHeiti','SimHei','Microsoft JhengHei','Microsoft YaHei','WenQuanYi Micro Hei','Suits',Helvetica,Arial,sans-serif; } div { @@ -1295,9 +1295,10 @@ body>.background.land { /*overflow: hidden;*/ } .card>.info { - right: 6px; - top: 9px; + top: 5.2px; + right: 7px; white-space: nowrap; + word-spacing: -0.1em; } .card>.range { bottom: 5px; @@ -4251,13 +4252,14 @@ div[data-decoration="bronze"]::after{ color: rgb(255,235,59); } .card.fullskin>.info { - top: 8px; - right: 6px; + top: 5.2px; + right: 7px; color: rgba(0,0,0,0.8); + white-space: nowrap; text-shadow: none; } .card.fullskin>.info.red { - color: #631515; + color: #A82424; } .config>.toggle.onoff { diff --git a/mode/guozhan.js b/mode/guozhan.js index 96e883b5a..0162f88d7 100644 --- a/mode/guozhan.js +++ b/mode/guozhan.js @@ -3039,7 +3039,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ return player.countMark('gzsuzhi_count')<3; }, content:function(){ - player.addTempSkill('fankui',{player:'phaseBegin'}); + player.addTempSkill('gzfankui',{player:'phaseBegin'}); }, group:['gzsuzhi_damage','gzsuzhi_draw','gzsuzhi_gain'], preHidden:['gzsuzhi_damage','gzsuzhi_draw','gzsuzhi_gain'], @@ -3365,7 +3365,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ var evt=_status.event.getParent(); if(evt.name!='gzzhuhai'||!arg||!arg.target) return false; if(!arg.target.getHistory('sourceDamage',function(evt){ - return evt.player.sameIdentityAs(player); + return evt.player.isFriendOf(player); }).length) return false; return true; }, @@ -3998,14 +3998,19 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ gzxingzhao:{ audio:2, getNum:function(){ - var num=0; - var list=[]; - game.countPlayer(function(current){ - if(current.identity=='unknown'||current.isHealthy()) return; - if(current.identity=='ye') num++; - else list.add(current.identity); - }); - return num+list.length; + var list=[],players=game.filterPlayer(); + for(var target of players){ + if(target.isUnseen()||target.isHealthy()) continue; + var add=true; + for(var i of list){ + if(i.isFriendOf(target)){ + add=false; + break; + } + } + if(add) list.add(target); + } + return list.length; }, mod:{ maxHandcard:function(player,num){ @@ -6588,7 +6593,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ silent:true, filter:function(event){ if(event.player.isUnseen()) return false; - return event.getParent(2).skill=='new_luanji'&&event.player.sameIdentityAs(_status.currentPhase); + return event.getParent(2).skill=='new_luanji'&&event.player.isFriendOf(_status.currentPhase); }, content:function(){ trigger.player.draw(); @@ -7881,8 +7886,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ filterTarget:function(card,player,target){ if(target==player) return false; if(player.isUnseen()) return target.isUnseen(); - if(player.identity=='ye') return true; - return target.identity!=player.identity; + return !target.isFriendOf(player); }, check:function(card){ if(card.name=='tao') return 0; @@ -7975,7 +7979,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ trigger:{global:'useCardToTarget'}, filter:function(event,player){ if(!['basic','trick'].contains(get.type(event.card,'trick'))) return false; - return event.target&&player.sameIdentityAs(event.target)&&event.targets.length==1&&player.getExpansions('qianhuan').length; + return event.target&&player.isFriendOf(event.target)&&event.targets.length==1&&player.getExpansions('qianhuan').length; }, direct:true, content:function(){ @@ -8031,7 +8035,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } trigger.cancel(); 'step 1' - if(player.sameIdentityAs(trigger.player)){ + if(player.isFriendOf(trigger.player)){ trigger.player.mayChangeVice(); } } @@ -8507,7 +8511,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ audio:'yuejian', preHidden:true, filter:function(event,player){ - if(player.sameIdentityAs(event.player)){ + if(player.isFriendOf(event.player)){ return event.player.getHistory('useCard',function(evt){ if(evt.targets){ var targets=evt.targets.slice(0); @@ -12434,6 +12438,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, changeViceOnline:function(){ 'step 0' + player.showCharacter(2); var group=lib.character[player.name1][1]; _status.characterlist.randomSort(); var name=false; @@ -12450,16 +12455,19 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ event.toChange=name; if(event.change) event.trigger('removeCharacterBefore'); 'step 1' - var name=event.toChange; - game.log(player,'将副将变更为','#g'+get.translation(name)); - player.viceChanged=true; - if(player.isUnseen(1)){ - player.showCharacter(1,false); + if(event.hidden){ + if(!player.isUnseen(1)) player.hideCharacter(1); } + 'step 2' + var name=event.toChange; + if(event.hidden) game.log(player,'替换了副将','#g'+get.translation(player.name2)); + else game.log(player,'将副将从','#g'+get.translation(player.name2),'变更为','#g'+get.translation(name)); + player.viceChanged=true; player.reinit(player.name2,name,false); }, changeVice:function(){ 'step 0' + player.showCharacter(2); if(!event.num) event.num=3; var group=player.identity; if(!lib.group.contains(group)) group=lib.character[player.name1][1]; @@ -12491,12 +12499,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ event.toChange=name; if(event.change) event.trigger('removeCharacterBefore'); if(event.hidden){ - if(player.isUnseen(0)) player.showCharacter(0,false); if(!player.isUnseen(1)) player.hideCharacter(1); } - else if(player.isUnseen(1)){ - player.showCharacter(1,false); - } 'step 2' var name=event.toChange; if(event.hidden) game.log(player,'替换了副将','#g'+get.translation(player.name2)); diff --git a/theme/style/hp/ol.css b/theme/style/hp/ol.css index 18ab30f6b..7e9ba13bf 100644 --- a/theme/style/hp/ol.css +++ b/theme/style/hp/ol.css @@ -35,7 +35,7 @@ filter:grayscale(1) opacity(0.8); -webkit-filter:grayscale(1) opacity(0.8); } -.hp:not(.text):not(.actcount):not(.treasure)>.lost{ +.hp:not(.text):not(.actcount):not(.treasure)>.shield{ background: url('image/shield.png'); box-shadow: none; border: none;