diff --git a/character/offline.js b/character/offline.js index 749ac2e60..9fdab1f57 100644 --- a/character/offline.js +++ b/character/offline.js @@ -15,10 +15,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ offline_piracyS:['ns_jiaxu','longyufei','ps_guanyu','ps1059_guojia','ps2070_guojia','ps2063_zhaoyun','ps2067_zhaoyun','ps1062_zhouyu','ps2080_zhouyu','ps_caozhi','ps_jin_simayi','ps_caopi','ps_simayi','ps2068_simayi','ps_machao','ps_zhugeliang','ps2066_zhugeliang','ps_jiaxu','ps_lvbu','ps_shen_machao','jsp_liubei'], offline_piracyK:['pk_sp_duyu'], offline_vtuber:['vtb_xiaosha','vtb_xiaoshan','vtb_xiaotao','vtb_xiaole','vtb_xiaojiu'], + offline_longyutao:['drag_guanyu','drag_caoren','drag_lvchang'], //offline_others:[""], }, }, character:{ + drag_guanyu:['male','shu',4,['dragchaojue','dragjunshen']], + drag_caoren:['male','wei',4,['draglizhong','dragjuesui']], + drag_lvchang:['male','wei',3,['dragjuwu','dragshouxiang']], jsp_ganfuren:['female','shu',3,['shushen','shenzhi'],['character:gz_ganfuren']], ol_xinxianying:['female','wei',3,['xincaishi','xinzhongjian']], zhangliang:["male","qun",4,["old_jijun","old_fangtong"]], @@ -94,6 +98,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ jsp_liubei:['male','qun',4,['jsprende']], }, characterIntro:{ + lvchang:'吕常(161—221年),荆州南阳博望(今河南省南阳市方城县博望镇)人,汉末至三国时期曹魏将领。吕常曾担任曹魏横海将军、章陵太守,为武猛都尉厉节中郎将裨将军,封关内侯。常以中勇,显名州司,试守雉长,执戈秉戎,慎守易,兵不顿于敌国,坠不侵于四邻,拜武猛都尉厉节中郎将裨将军,封关内侯。王师南征,与充军从,奄有江汉,舍爵册勋,封阴德亭侯,领郡。鸠集荒散,为民统纪,三考有成,转拜平狄将军,改封卢亭侯,莅国赋政,十有三年。会蜀将关羽猖獗为寇,常御之,羽不能克。文帝加其庸,转拜横海将军,徙封西鄂都乡侯,食邑并七百户。年六十一,黄初二年正月卒。', huangjinleishi:"黄巾军中负责施法的女祭司二人组。", longyufei:'《三国杀·阵面对决》中的虚构角色,设定是由刘备之女夏侯岚、关羽之女关银屏、张飞之女张星彩三人在与吕布之魔魂战斗时,释放雅典娜的惊叹而召唤出来的精元化神。', pk_sp_duyu:'杜预(222年-285年),字元凯,京兆郡杜陵县(今陕西西安)人,中国魏晋时期军事家、经学家、律学家,曹魏散骑常侍杜恕之子。杜预初仕曹魏,任尚书郎,后成为权臣司马昭的幕僚,封丰乐亭侯。西晋建立后,历任河南尹、安西军司、秦州刺史、度支尚书等职。咸宁四年(278年)接替羊祜出任镇南大将军,镇守荆州。他积极备战,支持晋武帝司马炎对孙吴作战,并在咸宁五年(279年)成为晋灭吴之战的统帅之一。战后因功进封当阳县侯,仍镇荆州。太康五年(285年),杜预被征入朝,拜司隶校尉,途中于邓县逝世,终年六十三岁。获赠征南大将军、开府仪同三司,谥号为成。杜预耽思经籍,博学多通,多有建树,时誉为“杜武库”。著有《春秋左氏传集解》及《春秋释例》等。为明朝之前唯一一个同时进入文庙和武庙之人。', @@ -149,6 +154,468 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterFilter:{ }, skill:{ + //龙起襄樊 + //关羽 + //界界关羽 + dragchaojue:{ + trigger:{player:'phaseZhunbeiBegin'}, + filter(event,player){ + if(!game.hasPlayer(target=>target!=player)) return false; + return player.countCards('h',card=>_status.connectMode||lib.filter.cardDiscardable(card,player)); + }, + async cost(event,trigger,player){ + event.result=await player.chooseToDiscard(get.prompt2('dragchaojue'),'h').set('ai',card=>{ + const player=get.event('player'); + if(!game.hasPlayer(target=>get.attitude(player,target)<0)) return 0; + return 7.5-get.value(card); + }).set('logSkill','dragchaojue').forResult(); + }, + popup:false, + async content(event,trigger,player){ + const targets=game.filterPlayer(target=>target!=player).sortBySeat(); + if(targets.length){ + const suits=event.cards.reduce((list,card)=>list.add(get.suit(card,player)),[]).sort((a,b)=>{ + return lib.suit.indexOf(a)-lib.suit.indexOf(b); + }); + player.line(targets); + for(const i of targets){ + i.addTempSkill('dragchaojue_buff'); + i.markAuto('dragchaojue_buff',suits); + } + for(const target of targets){ + const {result:{bool}}=await target.chooseToGive(player,(card,player)=>{ + return get.event('suits').includes(get.suit(card)); + },'h','give').set('suits',suits).set('ai',card=>{ + const player=get.event('player'),target=get.event().getParent().player; + const att=get.attitude(player,target); + if(att>0) return 7.5-get.value(card); + if(att==0&&get.attitude(target,player)==0) return 0; + if(att<0&&get.attitude(target,player)<0&&player.getSkills(null,false,false).some(skill=>{ + if(get.is.locked(skill,player)) return false; + const info=get.info(skill); + return info&&info.ai&&(info.ai.maixie||info.ai.maixie_hp||info.ai.maixie_defend); + })&&player.getHp()>2) return 0; + return 7.5-get.value(card); + }).set('prompt','超绝:交给'+get.translation(player)+'一张'+get.translation(suits)+'手牌,或本回合非锁定技失效'); + if(!bool) target.addTempSkill('fengyin'); + } + } + }, + subSkill:{ + buff:{ + onremove:true, + charlotte:true, + mod:{ + cardEnabled2(card,player){ + if(player.getStorage('jsrgguanjue_ban').includes(get.suit(card))) return false; + }, + }, + marktext:'绝', + intro:{content:'本回合内不能使用或打出$牌'}, + }, + }, + }, + dragjunshen:{ + mod:{ + targetInRange(card,player){ + if(get.suit(card)=='diamond'&&card.name=='sha') return true; + }, + }, + locked:false, + enable:['chooseToUse','chooseToRespond'], + filterCard(card,player){ + return get.color(card)=='red'; + }, + viewAsFilter(player){ + return player.countCards('hes',{color:'red'}); + }, + position:'hes', + viewAs:{name:'sha'}, + prompt:'将一张红色牌当作【杀】使用或打出', + check(card){ + const val=get.value(card); + if(_status.event.name=='chooseToRespond') return 1/Math.max(0.1,val); + return 5-val; + }, + ai:{ + order(item,player){ + if(!player||!_status.event.type||_status.event.type!='phase'){ + return 0.1; + } + return get.order({name:'sha'},player)+0.3; + }, + respondSha:true, + skillTagFilter(player){ + if(!player.countCards('hes',{color:'red'})) return false; + }, + }, + group:['dragjunshen_add','dragjunshen_damage'], + subSkill:{ + add:{ + trigger:{player:'useCard2'}, + filter(event,player){ + if(event.card.name!='sha'||get.suit(event.card)!='heart') return false; + return game.hasPlayer(target=>{ + return target!=player&&!event.targets.includes(target)&&lib.filter.targetEnabled2(event.card,player,target)&&lib.filter.targetInRange(event.card,player,target); + }); + }, + async cost(event,trigger,player){ + event.result=await player.chooseTarget(get.prompt('dragjunshen_add'),'为'+get.translation(trigger.card)+'额外指定一个目标',(card,player,target)=>{ + const evt=get.event().getTrigger(); + return target!=player&&!evt.targets.includes(target)&&lib.filter.targetEnabled2(evt.card,player,target)&&lib.filter.targetInRange(evt.card,player,target); + }).set('ai',target=>get.effect(target,_status.event.getTrigger().card,_status.event.player)).forResult(); + }, + content(){ + trigger.targets.addArray(event.targets); + }, + }, + damage:{ + trigger:{source:'damageBegin1'}, + filter(event,player){ + const evt=event.getParent(2); + return evt.name=='useCard'&&evt.skill=='dragjunshen'; + }, + logTarget:'player', + prompt2(event,player){ + return '令'+get.translation(event.player)+'选择弃置装备区所有牌或令此伤害+1'; + }, + async content(event,trigger,player){ + const target=trigger.player; + let result; + if(!target.countDiscardableCards(target,'e')) result={index:1}; + else result=await target.chooseControl().set('choiceList',[ + '弃置装备区所有牌', + '令此伤害+1', + ]).set('ai',()=>{ + const player=get.event('player'),trigger=get.event().getTrigger(); + if(player.getHp()<=2||player.getDiscardableCards(player,'e').reduce((sum,card)=>{ + return sum+get.value(card,player); + },0)<7) return 0; + return 1; + }).forResult(); + if(result.index==0){ + await target.discard(target.getDiscardableCards(target,'e')); + } + else trigger.increase('num'); + }, + }, + }, + }, + //龙曹仁 + draglizhong:{ + trigger:{player:'phaseJieshuBegin'}, + async cost(event,trigger,player){ + let choiceList=[ + '将任意张装备牌至于任意名角色的装备区', + '令你或任意名装备区里有牌的角色摸一张牌', + ],choices=['置入装备','团体摸牌','cancel2']; + if(!player.countCards('he',card=>{ + if(get.type(card)!='equip') return false; + return game.hasPlayer(target=>{ + return target.canEquip(card); + }) + })){ + choices.shift(); + choiceList[0]=''+choiceList[0]+''; + } + const {result:{control}}=await player.chooseControl(choices).set('choiceList',choiceList).set('prompt',get.prompt('draglizhong')).set('ai',()=>{ + return get.event('controls')[0]; + }); + event.result={bool:(control!='cancel2'),cost_data:control}; + }, + async content(event,trigger,player){ + let choices=['置入装备','团体摸牌'],used=false; + if(event.cost_data=='团体摸牌') choices.reverse(); + choices.push(event.cost_data); + for(let i=1;i<=3;i++){ + if(i==3&&used) break; + switch(choices[i-1]){ + case '置入装备': + while(player.hasCard(card=>{ + if(get.type(card)!='equip') return false; + return game.hasPlayer(target=>{ + return target.canEquip(card); + }) + },'he')){ + const {result:{bool,cards,targets}}=await player.chooseCardTarget({ + prompt:'厉战:将一张装备牌置于一名角色的装备区', + filterCard(card){ + return get.type(card)=='equip'; + }, + position:'he', + filterTarget(card,player,target){ + return target.canEquip(card); + }, + ai1(card){ + return 6-get.value(card); + }, + ai2(target){ + const player=get.event('player'); + const att=get.attitude(player,target); + if(att<=0||target.countCards('e')) return 0; + return att*(target==player?1:3); + }, + }); + if(bool){ + if(i==1&&!used) used=true; + const card=cards[0],target=targets[0]; + player.line(target); + if(target!=player){ + player.$give(card,target,false); + } + await game.asyncDelay(0.5); + await target.equip(card); + } + else break; + } + break; + case '团体摸牌': + const {result}=await player.chooseTarget('厉战:令你或任意名装备区有牌的角色摸一张牌',(card,player,target)=>{ + if(ui.selected.targets.length){ + const choose=ui.selected.targets[0]; + return choose!=player||choose.countCards('e'); + } + return target==player||target.countCards('e'); + },[1,Infinity]).set('multitarget',true).set('complexTarget',true).set('ai',target=>{ + const player=get.event('player'); + if(!player.countCards('e')){ + if(game.countPlayer(choose=>{ + return choose.countCards('e')&&get.attitude(player,choose)>0; + })>1&&target==player) return 0; + } + return get.attitude(player,target); + }); + if(result.bool){ + if(i==1&&!used) used=true; + const targets=result.targets.sortBySeat(); + player.line(targets); + choices.addArray(targets); + for(let j=0;j0; + }, + viewAsFilter(player){ + return player.countCards('e')>0; + }, + prompt:'将一张装备区的牌当作【无懈可击】使用', + check(card){ + return 8-get.equipValue(card); + }, + mark:true, + marktext:'守', + intro:{content:'手牌上限+2,可将装备区的牌当作【无懈可击】使用'}, + }, + }, + }, + //撅碎(难视 + dragjuesui:{ + trigger:{global:'dying'}, + filter(event,player){ + return !player.getStorage('dragjuesui').includes(event.player)&&event.player.hasEnabledSlot(); + }, + check(event,player){ + const target=event.player; + if(get.attitude(player,target)<=0) return false; + return player.countCards('hs',card=>player.canSaveCard(card,target))+target.countCards('hs',card=>target.canSaveCard(card,target))<1-target.hp; + }, + logTarget:'player', + async content(event,trigger,player){ + const target=trigger.player; + player.markAuto('dragjuesui',[target]); + const {result:{bool}}=await target.chooseBool('是否将体力值回复至1点并废除装备栏?'); + if(bool){ + await target.recoverTo(1); + let disables=[]; + for(let i=1;i<=5;i++){ + for(let j=0;j{ + return get.color(card)=='black'&&get.type(card)!='basic'; + })) return false; + }, + prompt:'将一张黑色非基本牌当作无次数限制的【杀】使用或打出', + check(card){ + return 7-get.value(card); + }, + ai:{ + order(item,player){ + if(!player||!_status.event.type||_status.event.type!='phase'){ + return 0.1; + } + return get.order({name:'sha'},player)*0.99; + }, + respondSha:true, + skillTagFilter(player){ + if(!player.countCards('hes',card=>{ + return get.color(card)=='black'&&get.type(card)!='basic'; + })) return false; + }, + }, + }, + }, + }, + //吕常×SP淳于琼√ + dragjuwu:{ + trigger:{target:'shaBefore'}, + filter(event,player){ + return game.countPlayer(target=>event.player.inRange(target))>=3; + }, + forced:true, + content(){ + trigger.cancel(); + }, + ai:{ + effect:{ + target(card,player,target){ + if(card.name=='sha'&&game.countPlayer(targetx=>player.inRange(targetx))>=3) return 'zerotarget'; + }, + }, + }, + }, + dragshouxiang:{ + trigger:{player:'phaseDrawBegin2'}, + filter(event,player){ + if(!game.hasPlayer(target=>target.inRange(player))) return false; + return !event.numFixed; + }, + check(event,player){ + if(player.skipList.includes('phaseUse')) return true; + return player.countCards('h')+event.num+Math.min(5,game.countPlayer(target=>{ + return target.inRange(player); + }))-game.countPlayer(target=>{ + return target!=player&&get.attitude(player,target)>0; + })<=player.getHandcardLimit(); + }, + content(){ + trigger.num+=Math.min(5,game.countPlayer(target=>target.inRange(player))); + player.skip('phaseUse'); + player.addTempSkill('dragshouxiang_effect'); + }, + subSkill:{ + effect:{ + charlotte:true, + trigger:{player:'phaseDiscardBegin'}, + filter(event,player){ + return game.hasPlayer(target=>target.inRange(player)); + }, + forced:true, + async content(event,trigger,player){ + const num=Math.min(5,game.countPlayer(target=>target.inRange(player))); + if(num){ + if(_status.connectMode) game.broadcastAll(()=>_status.noclearcountdown=true); + let list=[]; + while(num-list.length>0&&player.hasCard(card=>{ + return !list.some(list=>list[1]==card); + },'h')&&game.hasPlayer(target=>{ + return target!=player&&!list.some(list=>list[0]==target); + })){ + const {result:{bool,targets,cards}}=await player.chooseCardTarget({ + prompt:'守襄:你可以交给任意名角色各一张手牌', + prompt2:'(还可分配'+(num-list.length)+'张)', + position:'h', + animate:false, + filterCard(card,player){ + return !get.event('list').some(list=>list[1]==card); + }, + filterTarget(card,player,target){ + return target!=player&&!get.event('list').some(list=>list[0]==target); + }, + ai1(card){ + if(card.name=='shan') return 1; + return Math.random(); + }, + ai2(target){ + return get.attitude(get.event('player'),target); + }, + }).set('list',list); + if(bool){ + list.push([targets[0],cards[0]]); + player.addGaintag(cards,'olsujian_given'); + } + else break; + } + if(_status.connectMode){ + game.broadcastAll(()=>{ + delete _status.noclearcountdown; + game.stopCountChoose(); + }); + } + if(list.length){ + await game.loseAsync({ + gain_list:list, + player:player, + cards:list.slice().map(list=>list[1]), + giver:player, + animate:'giveAuto', + }).setContent('gaincardMultiple'); + } + } + }, + }, + }, + }, //天书乱斗虚拟偶像线下化 //小杀 vtbguisha:{ @@ -6808,6 +7275,24 @@ game.import('character',function(lib,game,ui,get,ai,_status){ kongrong_prefix:'战役篇', mateng:'战役篇马腾', mateng_prefix:'战役篇', + drag_guanyu:'龙关羽', + drag_guanyu_prefix:'龙', + drag_caoren:'龙曹仁', + drag_caoren_prefix:'龙', + drag_lvchang:'龙吕常', + drag_lvchang_prefix:'龙', + dragchaojue:'超绝', + dragchaojue_info:'准备阶段,你可以弃置一张手牌,然后令所有其他角色本回合不能使用或打出此花色的牌,然后这些角色依次选择一项:①正面朝上交给你一张牌;②本回合非锁定技失效。', + dragjunshen:'军神', + dragjunshen_info:'①你可以将一张红色牌当作【杀】使用或打出。②当你使用〖军神①〗转化的【杀】造成伤害时,你可以令受伤角色选择弃置装备区的所有牌或令此伤害+1。③你使用方片【杀】无距离限制,使用红桃【杀】可以额外选择一个目标。', + draglizhong:'厉众', + draglizhong_info:'结束阶段,你可以以任意顺序选择执行任意项:①将任意张装备牌置入任意名角色的装备区;②令你或任意名装备区里有牌的角色各摸一张牌。然后本次成为〖厉众②〗的角色于本轮手牌上限+2且可以将装备区的牌当作【无懈可击】使用。', + dragjuesui:'玦碎', + dragjuesui_info:'每名角色限一次,一名角色进入濒死状态时,你可以令其选择是否将体力值回复至1点并废除装备栏。若其选择是,则其本局游戏获得以下效果:你可以将一张黑色非基本牌当作无次数限制的【杀】使用或打出。', + dragjuwu:'拒武', + dragjuwu_info:'锁定技,攻击范围内至少包含三名角色的角色使用的无属性【杀】对你无效。', + dragshouxiang:'守襄', + dragshouxiang_info:'摸牌阶段,你可以额外摸X张牌。若如此做,你跳过出牌阶段,且本回合的弃牌阶段开始时,你可以交给至多X名角色各一张手牌。(X为攻击范围内包含你的角色)', offline_star:'桌游志·SP', offline_sticker:'桌游志·贴纸', @@ -6821,6 +7306,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ offline_vtuber:'天书乱斗·虚拟偶像', offline_piracyK:'官盗K系列', offline_others:'线下其他系列', + offline_longyutao:'龙起襄樊', }, }; }); diff --git a/character/rank.js b/character/rank.js index d0ec80e6c..ba8c0ab92 100644 --- a/character/rank.js +++ b/character/rank.js @@ -377,6 +377,9 @@ window.noname_character_rank={ 'huzun', 'star_zhangchunhua', 'mb_caomao', + 'drag_guanyu', + 'drag_caoren', + 'drag_lvchang', ], am:[ 'tw_yanliang', @@ -2193,8 +2196,11 @@ window.noname_character_rank={ 'mb_caomao', 'dc_shen_huatuo', 'sp_zhenji', + 'drag_guanyu', + 'drag_caoren', ], rare:[ + 'drag_lvchang', 're_wangyi', 'ol_wangyi', 'tw_yanliang', diff --git a/image/character/drag_caoren.jpg b/image/character/drag_caoren.jpg new file mode 100644 index 000000000..8f1492091 Binary files /dev/null and b/image/character/drag_caoren.jpg differ diff --git a/image/character/drag_guanyu.jpg b/image/character/drag_guanyu.jpg new file mode 100644 index 000000000..7259b49e3 Binary files /dev/null and b/image/character/drag_guanyu.jpg differ diff --git a/image/character/drag_lvchang.jpg b/image/character/drag_lvchang.jpg new file mode 100644 index 000000000..686982d14 Binary files /dev/null and b/image/character/drag_lvchang.jpg differ