diff --git a/character/diy.js b/character/diy.js index 68d02e874..d3a71396e 100755 --- a/character/diy.js +++ b/character/diy.js @@ -17702,8 +17702,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, async content(event,trigger,player){ const skills = player.additionalSkills.junkyuheng; - await player.draw(skills.length); await player.removeAdditionalSkills('junkyuheng'); + await player.draw(skills.length); }, }, }, diff --git a/character/huicui.js b/character/huicui.js index 351817d31..86bf56dc2 100644 --- a/character/huicui.js +++ b/character/huicui.js @@ -4,6 +4,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'huicui', connect:true, character:{ + dc_simashi:['male','wei',3,['dcsanshi','dczhenrao','dcchenlve']], + dc_wangling:['male','wei',4,['dcjichou','dcmouli'],['clan:太原王氏']], + dc_jiangji:['male','wei',3,['dcshiju','dcyingshi']], + gongsunxiu:['male','qun',4,['dcgangu','dckuizhen']], dc_liuli:['male','shu',3,['dcfuli','dcdehua']], yue_daqiao:['female','wu',3,['dcqiqin','dczixi']], dc_kongrong:['male','qun',3,['dckrmingshi','lirang']], @@ -112,12 +116,651 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_yanhan:['dc_liuba','dc_huangquan','furongfuqian','xianglang','dc_huojun','gaoxiang','dc_wuban','jiangfei'], sp_jishi:['dc_jiben','zhenghun','dc_sunhanhua','liuchongluojun'], sp_raoting:['dc_huanghao','dc_sunziliufang','dc_sunchen','dc_jiachong'], - sp_yijun:['gongsundu','mengyou','dc_sp_menghuo'], + sp_yijun:['gongsundu','mengyou','dc_sp_menghuo','gongsunxiu'], sp_zhengyin:['yue_caiwenji','yue_zhoufei','yue_caiyong','yue_xiaoqiao','yue_daqiao'], + sp_zhonghu:['dc_jiangji','dc_wangling','dc_simashi'], } }, /** @type { importCharacterConfig['skill'] } */ skill:{ + //司马师 + dcsanshi:{ + audio:2, + trigger:{global:'roundStart'}, + forced:true, + filter(event,player){ + return game.roundNumber===1; + }, + group:['dcsanshi_gain','dcsanshi_directHit'], + async content(event,trigger,player){ + const recordedNumbers=[]; + let num=get.rand(0,ui.cardPile.childNodes.length-1); + for(let i=0;i=ui.cardPile.childNodes.length) j-=ui.cardPile.childNodes.length; + const card=ui.cardPile.childNodes[j],number=get.number(card,false); + if(!recordedNumbers.includes(number)){ + recordedNumbers.add(number); + card.storage.dcsanshi=true; + num=get.rand(0,ui.cardPile.childNodes.length-1); + } + } + player.addSkill('dcsanshi_mark'); + }, + subSkill:{ + gain:{ + audio:'dcsanshi', + trigger:{global:'phaseEnd'}, + filter(event,player){ + return game.hasGlobalHistory('cardMove',evt=>{ + if(evt.name=='lose'){ + if(evt.position!==ui.discardPile) return false; + } + else if(evt.name!=='cardsDiscard') return false; + if(lib.skill.dcsanshi_gain.notUseOrRespond(evt,player)){ + return evt.cards.some(card=>{ + return card.storage.dcsanshi&&get.position(card)==='d'; + }); + } + return false; + }); + }, + forced:true, + notUseOrRespond(event,player){ + if(event.name==='cardsDiscard') return false; + const evtx=event.getParent(); + if(evtx.name==='orderingDiscard') return false; + const evt2=(evtx.relatedEvent||evtx.getParent()); + return !['useCard','respond'].includes(evt2.name)||evt2.player!==player; + }, + async content(event,trigger,player){ + const cards=[]; + game.checkGlobalHistory('cardMove',evt=>{ + if(evt.name=='lose'){ + if(evt.position!==ui.discardPile) return false; + } + else if(evt.name!=='cardsDiscard') return false; + if(lib.skill.dcsanshi_gain.notUseOrRespond(evt,player)){ + cards.addArray(evt.cards.filter(card=>{ + return card.storage.dcsanshi&&get.position(card)==='d'; + })); + } + }); + if(cards.length) player.gain(cards,'gain2'); + } + }, + directHit:{ + audio:'dcsanshi', + trigger:{player:'useCard'}, + forced:true, + filter(event,player){ + return event.cards&&event.cards.some(card=>{ + return card.storage.dcsanshi; + }); + }, + async content(event,trigger,player){ + trigger.directHit.addArray(game.filterPlayer()); + game.log(trigger.card,'不可被响应'); + }, + }, + mark:{ + trigger:{ + player:'gainEnd', + global:'loseAsyncEnd', + }, + forced:true, + popup:false, + silent:true, + lastDo:true, + filter(event,player){ + if(!['dcsanshi','dcchenlve'].every(skill=>player.hasSkill(skill,null,false,false))) return false; + const cards=event.getg(player); + if(!cards.length) return false; + return cards.some(card=>card.storage.dcsanshi); + }, + async content(event,trigger,player){ + var cards=trigger.getg(player); + if(cards.length){ + cards=cards.filter(card=>card.storage.dcsanshi); + player.addGaintag(cards,'dcsanshi_tag'); + } + }, + }, + }, + ai:{ + threaten:3, + }, + }, + dczhenrao:{ + audio:2, + trigger:{global:'useCardToPlayered'}, + filter(event,player){ + if((()=>{ + if(event.player===player){ + if(!event.isFirstTarget) return false; + return event.targets.some(target=>target!==player); + } + return event.target===player; + })()){ + return event.targets.concat(event.player).some(target=>{ + return target.countCards('h')>player.countCards('h')&&!player.getStorage('dczhenrao').includes(target); + }); + } + return false; + }, + direct:true, + async content(event,trigger,player){ + const result=await player.chooseTarget(get.prompt('dczhenrao'),'对一名可选角色造成1点伤害',(card,player,target)=>{ + return get.event('targets').includes(target); + }) + .set('targets',trigger.targets.concat(trigger.player).filter(target=>target.countCards('h')>player.countCards('h'))) + .set('ai',target=>{ + const player=get.player(); + return get.damageEffect(target,player,player); + }) + .forResult(); + if(!result.bool) return; + const target=result.targets[0]; + player.logSkill('dczhenrao',target); + await target.damage(); + await game.asyncDelayx(); + if(!player.storage.dczhenrao){ + player.when({global:'phaseAfter'}).then(()=>player.unmarkSkill('dczhenrao')); + } + player.markAuto('dczhenrao',target); + }, + intro:{ + content:'已以此法对$造成过伤害', + onunmark:true, + }, + ai:{ + expose:0.2, + threaten:3, + }, + }, + dcchenlve:{ + audio:2, + enable:'phaseUse', + limited:true, + skillAnimation:true, + animationColor:'thunder', + filterCard:()=>false, + selectCard:[-2,-1], + async content(event,trigger,player){ + player.awakenSkill('dcchenlve'); + const cards=['cardPile','discardPile'].map(pos=>Array.from(ui[pos].childNodes)).flat(); + const sishiList=[]; + const isSishi=card=>card.storage.dcsanshi; + const lose_list=[],players=game.filterPlayer(); + players.forEach(current=>{ + const pos='ej'+(current===player?'h':''); + const sishis=current.getCards(pos,isSishi); + if(sishis.length>0){ + current.$throw(sishis); + lose_list.push([current,sishis]); + sishiList.addArray(sishis); + } + }); + if(lose_list.length){ + await game.loseAsync({lose_list}).setContent('chooseToCompareLose'); + } + sishiList.addArray(cards.filter(isSishi)); + if(lose_list.length) await game.asyncDelayx(); + player.gain(sishiList,'gain2'); + player.when('phaseEnd') + .filter(evt=>evt===event.getParent('phase')) + .vars({ + sishiList + }) + .then(()=>{ + const lose_list=[],players=game.filterPlayer(); + players.forEach(current=>{ + const cards=current.getCards('hej').filter(card=>sishiList.includes(card)); + if(cards.length>0){ + current.$throw(cards); + lose_list.push([current,cards]); + } + }); + if(lose_list.length){ + game.loseAsync({lose_list}).setContent('chooseToCompareLose'); + } + }) + .then(()=>{ + game.cardsGotoSpecial(sishiList); + game.log(sishiList,'被移出了游戏'); + }); + player.when('die') + .vars({ + sishiList + }) + .assign({ + forceDie:true, + }) + .then(()=>{ + game.cardsDiscard(sishiList); + game.log(sishiList,'被置入了弃牌堆'); + }); + }, + ai:{ + order:0.5, + result:{ + player(player){ + if(player.getHp(true)>1&&player.countCards('he')>1) return 0; + if(!player.isDamaged()&&(player.countCards('h')>1||player.countCards('e')>0)) return 0; + return 13; + } + }, + }, + }, + //王凌 + dcjichou:{ + audio:2, + trigger:{player:'phaseUseEnd'}, + filter(event,player){ + const evts=player.getHistory('useCard',evt=>evt.getParent('phaseUse')===event); + const names=evts.map(evt=>evt.card.name).unique(); + return evts.length>0&&evts.length===names.length&&evts.some(evt=>evt.cards.some(card=>get.position(card)==='d')); + }, + async content(event,trigger,player){ + const cards=[]; + player.checkHistory('useCard',evt=>{ + if(evt.getParent('phaseUse')!==trigger) return; + cards.addArray(evt.cards.filterInD('d')); + }); + const num=Math.min(cards.length,game.countPlayer()); + if(_status.connectMode) game.broadcastAll(()=>{_status.noclearcountdown=true}); + const [bool,links]=await player.chooseButton([ + `集筹:将${numget.attitude(player,current)>0), + game.countPlayer(current=>get.attitude(player,current)<0) + ]) + .set('ai',button=>{ + const card=button.link,population=get.event('population'); + if(ui.selected.buttons.length>population[0]+population[1]) return 0; + if(ui.selected.buttons.length>get.event('population')[0]) return 2-get.value(card); + return 2+get.value(card); + }) + .forResult('bool','links'); + if(bool){ + const [bool,targets]=await player.chooseTarget( + `集筹:请选择${get.cnNumber(links.length)}名角色`, + `操作提示:请按照顺序选择要交给牌的目标,令这些角色按顺序获得这些牌:${get.translation(links)}`, + true, + links.length, + ) + .set('values',links.map(i=>get.value(i))) + .set('ai',target=>{ + const att=get.attitude(get.player(),target); + const chosenNum=ui.selected.targets.length,values=get.event('values'); + if(values[chosenNum]>0) return att; + return 0.01-att; + }) + .forResult('bool','targets'); + if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} + if(bool){ + const gain_list=[],givenCards=[]; + targets.forEach((target,i)=>{ + player.line(target,'green'); + gain_list.push([target,links[i]]); + givenCards.push(links[i]); + game.log(player,'将',links[i],'交给了',target); + }); + event.getParent().set('givenCards',givenCards); + await game.loseAsync({ + gain_list, + player:player, + cards:givenCards, + giver:player, + animate:'gain2', + }).setContent('gaincardMultiple'); + const toDraw=player.getAllHistory('useSkill',evt=>{ + const evtx=evt.event; + return evt.skill==='dcjichou'&&evtx.givenCards&&evtx.givenCards.length; + })[0].event.givenCards.length; + await game.asyncDelayx(); + await player.draw(toDraw); + } + } + if(_status.connectMode){game.broadcastAll(()=>{delete _status.noclearcountdown;game.stopCountChoose()})} + }, + }, + dcmouli:{ + audio:2, + trigger:{player:'phaseEnd'}, + filter(event,player){ + const names=[]; + player.checkAllHistory('useSkill',evt=>{ + if(evt.skill!=='dcjichou') return; + const evtx=evt.event; + if(evtx.givenCards) names.addArray(evtx.givenCards.map(card=>get.name(card,false))); + }); + return names.length>=5; + }, + forced:true, + juexingji:true, + skillAnimation:true, + animationColor:'water', + derivation:['dczifu'], + async content(event,trigger,player){ + player.awakenSkill('dcmouli'); + await player.gainMaxHp(); + await player.recover(); + await player.addSkills('dczifu'); + }, + }, + dczifu:{ + audio:2, + trigger:{player:'phaseUseBegin'}, + forced:true, + async content(event,trigger,player){ + const maxLimit=Math.min(5,player.maxHp); + let count=player.countCards('h'); + if(countevt.getParent(2)===event)) return; + count=player.countCards('h'); + const toKeepCount=player.getCards('h').map(card=>get.name(card)).unique(); + if(count>toKeepCount){ + const [bool,cards]=await player.chooseCard('自缚:选择要保留的手牌','选择不同牌名的手牌各一张,然后弃置其余手牌',toKeepCount) + .set('filterCard',card=>{ + if(!ui.selected.cards.length) return true; + const name=get.name(card,player); + if(ui.selected.cards.some(card=>get.name(card,player)===name)) return false; + return true; + }) + .set('complexCard',true) + .set('ai',get.value) + .forResult('bool','cards'); + if(!bool) return; + const toDiscard=player.getCards('h').removeArray(cards); + if(toDiscard.length) player.discard(toDiscard); + } + }, + ai:{ + halfneg:true, + }, + }, + //蒋济 + dcshiju:{ + audio:2, + global:'dcshiju_global', + subSkill:{ + global:{ + audio:'dcshiju', + enable:'phaseUse', + usable:1, + filter(event,player){ + return game.hasPlayer(current=>{ + if(current==player||!current.hasSkill('dcshiju')) return false; + return player.countCards('he'); + }); + }, + filterTarget(card,player,target){ + return target!=player&&target.hasSkill('dcshiju'); + }, + selectTarget(){ + const num=game.countPlayer(current=>{ + return current.hasSkill('dcshiju'); + }); + return num>1?1:-1; + }, + filterCard:true, + position:'he', + check(card){ + const player=get.player(); + if(get.type(card)==='equip'){ + const subtype=get.subtype(card); + let valueFix=0; + if(game.hasPlayer(current=>{ + if(current==player||!current.hasSkill('dcshiju')) return false; + if(current.hasUseTarget(card)&&!player.countEmptySlot(subtype)) return true; + })) valueFix+=5; + if(player.countCards('he',{subtype})>1){ + return valueFix+12-get.equipValue(card); + } + return valueFix+6-get.value(card); + } + return 4-get.value(card); + }, + prompt(){ + const list=game.filterPlayer(current=>{ + return current.hasSkill('dcshiju'); + }); + return `将一张牌交给${get.translation(list)}${list.length>1?'中的一人':''},若此牌为装备牌,其可以使用之,且你本回合的攻击范围+X(X为其装备区的牌数)。若其以此法替换了装备,你与其各摸两张牌。`; + }, + discard:false, + lose:false, + prepare(cards,player,targets){ + player.$give(cards,targets[0],false); + }, + async content(event,trigger,player){ + const card=event.cards[0],target=event.target; + await player.give(card,target); + if(!target.getCards('h').includes(card)||get.type(card)!=='equip') return; + const bool=await target.chooseUseTarget(card).forResultBool(); + if(!bool) return; + const count=target.countCards('e'); + if(count>0){ + player.addTempSkill('dcshiju_range'); + player.addMark('dcshiju_range',count,false); + if(target.hasHistory('lose',evt=>{ + return evt.getParent().name==='equip'&&evt.getParent(5)===event&&evt.es&&evt.es.length>0; + })){ + for(const current of [player,target]) await current.draw(2); + } + } + }, + ai:{ + order:10, + result:{ + target(player,target){ + const card=ui.selected.cards[0]; + if(!card) return; + if(target.hasSkillTag('nogain')&&get.type(card)!='equip') return 0; + if(card.name=='du'&&target.hasSkillTag('nodu')) return 0; + if(get.value(card)<0) return -5; + const nh=target.countCards('h'); + return Math.max(1,5-nh); + }, + }, + }, + }, + range:{ + charlotte:true, + onremove:true, + mod:{ + attackRange:function(player,num){ + return num+player.countMark('dcshiju_range'); + }, + }, + intro:{content:'本回合攻击范围+#'}, + }, + }, + }, + dcyingshi:{ + audio:2, + trigger:{player:'useCardToPlayered'}, + filter(event,player){ + if(!event.isFirstTarget) return false; + if(get.type(event.card)!=='trick') return false; + const evt=event.getParent(); + const evts=game.getGlobalHistory('useCard',null,evt).slice().remove(evt); + return event.targets.some(target=>{ + return evts.some(evt=>evt.targets.includes(target)); + }); + }, + direct:true, + async content(event,trigger,player){ + const evt=trigger.getParent(); + const evts=game.getGlobalHistory('useCard',null,evt).slice().remove(evt); + const chooseableTargets=trigger.targets.filter(target=>{ + return evts.some(evt=>evt.targets.includes(target)); + }); + const result=await player.chooseTarget() + .set('prompt',get.prompt('dcyingshi')) + .set('prompt2',`令一名可选角色选择本回合未被选择过的一项:⒈令你于此牌结算结束后视为对其使用一张${get.translation(trigger.card.name)};⒉弃置${get.cnNumber(player.countCards('e'))}张牌,此牌对其无效。`) + .set('filterTarget',(card,player,target)=>{ + return get.event('targets').includes(target); + }) + .set('targets',chooseableTargets) + .set('toFriends',(()=>{ + const isPositive=chooseableTargets.some(current=>{ + return get.effect(current,trigger.card,trigger.player,player)>0; + }),isNegative=chooseableTargets.some(current=>{ + return get.effect(current,trigger.card,trigger.player,player)<-5; + }); + if((player.hasSkill('dcyingshi_choice1')||player.countCards('e')<2)&&isNegative) return true; + if(!player.hasSkill('dcyingshi_choice1')&&(get.tag(trigger.card,'norepeat')&&isNegative||isPositive)) return true; + return false; + })()) + .set('ai',target=>{ + const player=get.player(),count=player.countCards('e'),att=get.attitude(player,target); + if(att>0&&get.event('toFriends')){ + if(target.countCards('he',card=>get.value(card)<5)0){ + const prompt=`###${get.translation(player)}对你发动了【应时】###${forced?'请':'是否'}弃置${get.cnNumber(count)}张牌,令${get.translation(trigger.card)}对你无效${forced?'。':'?或点击“取消”,令其与此牌结算后视为对你使用一张同名牌。'}`; + bool=await target.chooseToDiscard(prompt,count,forced,'he').set('ai',card=>{ + if(get.event('goon')) return 5.5-get.value(card); + return 0; + }).set('goon',!get.tag(trigger.card,'norepeat')&&get.effect(target,trigger.card,trigger.player,target)<-5).forResultBool(); + } + else bool=false; + } + else bool=player.hasSkill('dcyingshi_choice1'); + if(bool){ + trigger.excluded.add(target); + } + else{ + player.when({global:'useCardAfter'}) + .filter(evt=>evt===trigger.getParent()) + .vars({ + targetx:target, + cardx:{ + name:trigger.card.name, + nature:trigger.card.nature, + isCard:true, + storage:{dcyingshi:true}, + }, + }) + .then(()=>{ + const next=player.useCard(get.copy(cardx),targetx,false); + if(trigger.addedTarget) next.addedTarget=trigger.addedTarget; + if(trigger.addedTargets&&trigger.addedTargets.length) next.addedTargets=trigger.addedTargets.slice(0); + }); + } + player.addTempSkill(`dcyingshi_choice${bool+1}`); + }, + subSkill:{ + choice1:{charlotte:true}, + choice2:{charlotte:true}, + }, + }, + //公孙修 + dcgangu:{ + audio:2, + trigger:{global:'loseHpAfter'}, + filter(event,player){ + return event.player!==player; + }, + usable:1, + forced:true, + async content(event,trigger,player){ + await player.draw(2); + await player.loseHp(); + }, + }, + dckuizhen:{ + audio:2, + enable:'phaseUse', + filter(event,player){ + return game.hasPlayer(current=>{ + return lib.skill.dckuizhen.filterTarget(null,player,current); + }); + }, + filterTarget(card,player,target){ + return target.countCards('h')>player.countCards('h')||target.getHp()>player.getHp(); + }, + usable:1, + forced:true, + async content(event,trigger,player){ + const {target}=event,juedou=new lib.element.VCard({name:'juedou'}); + if(target.canUse(juedou,player,false)){ + await target.useCard(juedou,player,'noai'); + } + if(player.hasHistory('damage',evt=>{ + return evt.getParent(3)===event; + })){ + await player.viewHandcards(target); + const shas=target.getGainableCards(player,'h').filter(card=>get.name(card)==='sha'); + if(shas.length){ + player.addTempSkill('dckuizhen_effect'); + await player.gain(shas,'give',target).gaintag.add('dckuizhen'); + } + } + else{ + await target.loseHp(); + } + }, + ai:{ + result:{ + target(player,target){ + const [juedouEff,loseEff]=[ + get.effect(player,{name:'juedou'},target,player), + get.effect(target,{name:'losehp'},target,player) + ]; + if(juedouEff>0) return loseEff*get.attitude(player,target)/10; + return 0; + }, + } + }, + subSkill:{ + effect:{ + trigger:{player:'useCard1'}, + forced:true, + popup:false, + firstDo:true, + charlotte:true, + filter:function(event,player){ + if(event.addCount===false) return false; + return player.hasHistory('lose',evt=>{ + if(evt.getParent()!=event) return false; + for(const i in evt.gaintag_map){ + if(evt.gaintag_map[i].includes('dckuizhen')) return true; + } + return false; + }); + }, + async content(event,trigger,player){ + trigger.addCount=false; + var stat=player.getStat().card,name=trigger.card.name; + if(typeof stat[name]=='number') stat[name]--; + }, + mod:{ + cardUsable(card){ + if(!card.cards) return; + if(card.cards.some(card=>card.hasGaintag('dckuizhen'))) return Infinity; + }, + }, + } + } + }, //刘理 dcfuli:{ audio:2, @@ -11548,6 +12191,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ yuechen:'乐綝(195~257年),字号不详,阳平郡卫国县(今河南省清丰县)人。三国时期曹魏将领,右将军乐进的儿子。果毅坚毅,袭封广昌亭侯,累迁扬州刺史。甘露二年,为叛乱的征东大将军诸葛诞所杀,追赠卫尉。', kuaiqi:'蒯祺(?~219年),南郡中卢人,荆州望族子弟,与荆州牧刘表帐下谋士蒯良、蒯越为同族,东汉末年房陵太守。建安二十四年(219年),汉中王刘备遣宜都太守孟达从秭归北攻房陵,蒯祺于战斗中被孟达所部士兵所杀。清朝任兆麟《心斋十种》中的《襄阳记》辑本引用《万历襄阳府志》“(蒯)钦从祖祺妇,即诸葛孔明之姊也”,称蒯祺娶故兖州泰山郡丞诸葛珪长女,即他是知名政治家、蜀汉丞相诸葛亮的姐夫。但在任兆麟之前的《襄阳记》辑本中,并没有这一条。', pangshanmin:'庞山民,荆州襄阳人,三国时期曹魏大臣。庞山民出身荆州庞氏,为隐士庞德公之子、凤雏庞统的堂兄,娶诸葛亮二姐诸葛氏(“若雪”为网络小说虚构)为妻。后出仕曹魏,历任黄门、吏部郎等职。', + gongsunxiu:'公孙修(?-238),三国时期人物,公孙渊之子。景初元年(237年),魏明帝曹叡派出幽州刺史毌丘俭攻打公孙渊,久战不利回师。公孙渊即自立为燕王,改元绍汉,引诱鲜卑侵扰北方,背叛曹魏。景初二年(238年)春,曹魏又派司马懿和高句丽国王高位宫率军攻打公孙渊,围城日久,公孙渊粮尽之后,与儿子公孙修一起出逃后被擒获,父子二人同时被斩首示众。', }, characterTitle:{ }, @@ -12107,6 +12751,31 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcfuli_info:'出牌阶段限一次,你可以展示手牌并弃置一种类别的所有手牌,然后摸X张牌(X为这些牌的牌名字数和且X至多为场上手牌数最多的角色的手牌数)。若你因此弃置了伤害类卡牌,则你可以选择一名角色,令其攻击范围-1直到你的下个回合开始。', dcdehua:'德化', dcdehua_info:'锁定技。①一轮游戏开始时,若有你可以使用的非延时类伤害类牌的牌名,你选择其中一个并视为使用之,然后你不能从手牌中使用此牌名的牌,然后若你已选择过所有的伤害类牌牌名,你失去〖德化〗。②你的手牌上限+Y(Y为你〖德化①〗选择过的牌名数)。', + gongsunxiu:'公孙修', + dcgangu:'干蛊', + dcgangu_info:'锁定技。每回合限一次。当其他角色失去体力后,你摸两张牌,然后失去1点体力。', + dckuizhen:'溃阵', + dckuizhen_info:'出牌阶段限一次。你可以令一名手牌数或体力值大于你的角色视为对你使用一张【决斗】。若你:受到渠道为此牌的伤害,你观看其手牌并获得其中所有的【杀】(你使用以此法得到的牌无任何次数限制);未受到渠道为此牌的伤害,其失去1点体力。', + dc_jiangji:'蒋济', + dcshiju:'势举', + dcshiju_info:'其他角色的出牌阶段限一次。其可以交给你一张牌,若此牌为装备牌,你可以使用之,然后其本回合攻击范围+X(X为你装备区里的牌数)。若你以此法替换了装备,你与其各摸两张牌。', + dcyingshi:'应时', + dcyingshi_info:'每回合每项各限一次。当你使用普通锦囊牌指定第一个目标后,若有目标不为本回合第一次成为牌的目标,则你可以令其选择一项:⒈令你于此牌结算结束后视为对其使用一张与此牌牌名相同的牌;⒉弃置X张牌,此牌对其无效(X为你装备区里的牌数)。', + dc_wangling:'王凌', + dcjichou:'集筹', + dcjichou_info:'出牌阶段结束时,若你于此阶段使用过牌且这些牌的牌名均不同,你可以观看位于弃牌堆中的这些牌,选择任意张牌并选择等量角色,将这些牌交给这些角色各一张,然后你摸X张牌(X为你本局游戏首次发动〖集筹〗给出的牌数)。', + dcmouli:'谋立', + dcmouli_info:'觉醒技。回合结束时,若你因〖集筹〗给出的牌的牌名总数不小于5,你加1点体力上限并回复1点体力,然后获得〖自缚〗。', + dczifu:'自缚', + dczifu_info:'锁定技。出牌阶段开始时,你将手牌摸至体力上限(至多摸至五张)。若你以此法得到牌,你须选择手牌中不同牌名的牌各一张,然后弃置其余的手牌。', + dc_simashi:'司马师', + dcsanshi:'散士', + dcsanshi_tag:'死士', + dcsanshi_info:'锁定技。①第一轮游戏开始时,你令系统将牌堆中每个点数的随机一张牌永久标记为“死士”(“死士”对你可见)。②一名角色的回合结束时,若本回合有“死士”不因你使用或打出而进入弃牌堆,你于弃牌堆中获得这些牌。③你使用“死士”不能被响应。', + dczhenrao:'震扰', + dczhenrao_info:'每回合每名角色限一次。当你使用牌指定第一个目标后,若目标角色包含其他角色,或当其他角色使用牌指定你为目标后,你可以选择手牌数大于你的其中一个目标或此牌的使用者,然后对其造成1点伤害。', + dcchenlve:'沉略', + dcchenlve_info:'限定技。出牌阶段,你可以将牌堆、弃牌堆、场上及其他角色的手牌区里的所有“死士”置入处理区,然后你获得这些牌。若如此做,你获得如下效果:1.此回合结束时,你将这些牌移出游戏;2.当你死亡时,你将所有以此法移出游戏的“死士”置入弃牌堆。', sp_baigei:'无双上将', sp_caizijiaren:'才子佳人', @@ -12121,6 +12790,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_raoting:'绕庭之鸦', sp_yijun:'异军突起', sp_zhengyin:'正音雅乐', + sp_zhonghu:'冢虎狼顾', }, }; }); diff --git a/character/mobile.js b/character/mobile.js index 36e4e0a85..b8d54c128 100644 --- a/character/mobile.js +++ b/character/mobile.js @@ -16465,7 +16465,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ mutao_info:'出牌阶段限一次。你可以选择一名角色,令其将手牌中所有的【杀】置于武将牌上,然后将这些牌依次随机交给其下家开始的每一名角色。然后其对最后一名以此法获得【杀】的角色A造成X点伤害(X为A手牌中【杀】的数量且至多为2)。', yimou:'毅谋', yimou_info:'当一名角色受到伤害后,若其存活且你至其的距离不大于1,你可以选择一项:1.令其从牌堆中获得一张【杀】;2.令其将一张手牌交给另一名角色,然后摸一张牌。', - jiangji:'蒋济', + jiangji:'手杀蒋济', + jiangji_prefix:'手杀', jilun:'机论', jilun_info:'①当你受到伤害后,若你拥有技能〖急筹〗,则你可以一项:1.摸两张牌。2.获得1枚“机论”标记。②一名角色的结束阶段,若你拥有“机论”,则重复选择执行以下项直到你没有“机论”标记:1.失去1枚“机论”标记,视为使用一张〖急筹①〗记录过且未被〖机论②〗记录过的普通锦囊牌并记录此牌牌名。2.失去所有“机论”标记。', liwei:'李遗', diff --git a/character/offline.js b/character/offline.js index ab84dee39..6b365cc6a 100644 --- a/character/offline.js +++ b/character/offline.js @@ -456,137 +456,137 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, //小乐 - vtbleyu:{ - audio:1, - trigger:{ - global:'phaseBegin', - }, - direct:true, - filter:function(event,player){ - return player.countCards('he')>=3; - }, - content:function(){ - 'step 0' - player.chooseToDiscard(get.prompt2('vtbleyu',trigger.player),3,'he').set('ai',card=>{ - if(ui.selected.cards.length==2) return 10-get.value(card); - if(_status.event.effect>0){ - return 6-get.value(card); - } - return 0; - }).set('effect',trigger.player.hasJudge('lebu')?0:get.effect(trigger.player,{name:'lebu'},player,player)).set('logSkill',['vtbleyu',trigger.player]); - 'step 1' - if(result.bool){ - trigger.player.judge(lib.card.lebu.judge).judge2=lib.card.lebu.judge2; - } else event.finish(); - 'step 2' - if(!result.bool){ - trigger.player.skip('phaseUse'); - } - }, - ai:{ - expose:0.3, + vtbleyu:{ + audio:1, + trigger:{ + global:'phaseBegin', + }, + direct:true, + filter:function(event,player){ + return player.countCards('he')>=3; + }, + content:function(){ + 'step 0' + player.chooseToDiscard(get.prompt2('vtbleyu',trigger.player),3,'he').set('ai',card=>{ + if(ui.selected.cards.length==2) return 10-get.value(card); + if(_status.event.effect>0){ + return 6-get.value(card); + } + return 0; + }).set('effect',trigger.player.hasJudge('lebu')?0:get.effect(trigger.player,{name:'lebu'},player,player)).set('logSkill',['vtbleyu',trigger.player]); + 'step 1' + if(result.bool){ + trigger.player.judge(lib.card.lebu.judge).judge2=lib.card.lebu.judge2; + } else event.finish(); + 'step 2' + if(!result.bool){ + trigger.player.skip('phaseUse'); + } + }, + ai:{ + expose:0.3, threaten:2.9, - }, - }, - vtbyuanli:{ - audio:1, - trigger:{global:['phaseUseSkipped','phaseUseCancelled']}, - direct:true, - content:function(){ - 'step 0' - player.chooseTarget(get.prompt2('vtbyuanli'),lib.filter.notMe).set('ai',target=>get.attitude(_status.event.player,target)+1); - 'step 1' - if(result.bool){ - player.logSkill('vtbyuanli',result.targets[0]); - game.asyncDraw([player,result.targets[0]].sortBySeat(_status.currentPhase)); - } - }, - ai:{ - expose:0.1, - }, - }, - vtbmeiniang:{ - audio:1, - trigger:{global:'phaseUseBegin'}, - filter:function(event,player){ - return event.player!=player; - }, - check:function(event,player){ - return get.attitude(player,event.player)>0&&event.player.getUseValue('jiu')>=0; - }, - logTarget:'player', - content:function(){ - trigger.player.chooseUseTarget('jiu',true,false); - } - }, - vtbyaoli:{ - audio:1, - trigger:{global:'useCardAfter'}, - filter:function(event,player){ - return event.card.name=='jiu'&&event.player!=player&&event.player.isPhaseUsing(); - }, - logTarget:'player', + }, + }, + vtbyuanli:{ + audio:1, + trigger:{global:['phaseUseSkipped','phaseUseCancelled']}, + direct:true, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('vtbyuanli'),lib.filter.notMe).set('ai',target=>get.attitude(_status.event.player,target)+1); + 'step 1' + if(result.bool){ + player.logSkill('vtbyuanli',result.targets[0]); + game.asyncDraw([player,result.targets[0]].sortBySeat(_status.currentPhase)); + } + }, + ai:{ + expose:0.1, + }, + }, + vtbmeiniang:{ + audio:1, + trigger:{global:'phaseUseBegin'}, + filter:function(event,player){ + return event.player!=player; + }, + check:function(event,player){ + return get.attitude(player,event.player)>0&&event.player.getUseValue('jiu')>=0; + }, + logTarget:'player', + content:function(){ + trigger.player.chooseUseTarget('jiu',true,false); + } + }, + vtbyaoli:{ + audio:1, + trigger:{global:'useCardAfter'}, + filter:function(event,player){ + return event.card.name=='jiu'&&event.player!=player&&event.player.isPhaseUsing(); + }, + logTarget:'player', check:function(event,player){ return get.attitude(player,event.player)>0; }, - content:function(){ - trigger.player.addTempSkill('vtbyaoli_effect'); - trigger.player.addMark('vtbyaoli_effect',1,false); - }, - ai:{ - expose:0.15, - }, - subSkill:{ - effect:{ - audio:'vtbyaoli', - charlotte:true, - trigger:{player:'useCard2'}, - forced:true, - popup:false, - onremove:true, - nopop:true, - filter:function(event,player){ - return event.card.name=='sha'&&player.countMark('vtbyaoli_effect')>0; - }, - content:function(){ - 'step 0' - trigger.directHit.addArray(game.filterPlayer()); - var num=player.countMark('vtbyaoli_effect'); - if(!game.hasPlayer(current=>{ - return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,player,current); - })) event.finish(); - else player.chooseTarget('媱丽:是否为'+get.translation(trigger.card)+'额外指定'+(num>1?'至多':'')+get.cnNumber(num)+'个目标?',num==1?1:[1,num],(card,player,target)=>{ - return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target); - }).set('sourcex',trigger.targets).set('ai',target=>{ - var player=_status.event.player; - return get.effect(target,_status.event.card,player,player); - }).set('card',trigger.card); - 'step 1' - if(result.bool){ - if(!event.isMine()&&!event.isOnline()) game.delayx(); - event.targets=result.targets; - } - else { - event.finish(); - } - 'step 2' - player.logSkill('vtbyaoli_effect',event.targets); - trigger.targets.addArray(event.targets); - player.removeSkill('vtbyaoli_effect'); - }, - marktext:'媱', - intro:{ - content:'下一张【杀】不可被响应且可以额外指定&个目标', - }, - ai:{ - directHit_ai:true, - skillTagFilter:function(player,tag,arg){ - return arg.card.name=='sha'; - }, - } - } - } - }, + content:function(){ + trigger.player.addTempSkill('vtbyaoli_effect'); + trigger.player.addMark('vtbyaoli_effect',1,false); + }, + ai:{ + expose:0.15, + }, + subSkill:{ + effect:{ + audio:'vtbyaoli', + charlotte:true, + trigger:{player:'useCard2'}, + forced:true, + popup:false, + onremove:true, + nopop:true, + filter:function(event,player){ + return event.card.name=='sha'&&player.countMark('vtbyaoli_effect')>0; + }, + content:function(){ + 'step 0' + trigger.directHit.addArray(game.filterPlayer()); + var num=player.countMark('vtbyaoli_effect'); + if(!game.hasPlayer(current=>{ + return !trigger.targets.includes(current)&&lib.filter.targetEnabled2(trigger.card,player,current); + })) event.finish(); + else player.chooseTarget('媱丽:是否为'+get.translation(trigger.card)+'额外指定'+(num>1?'至多':'')+get.cnNumber(num)+'个目标?',num==1?1:[1,num],(card,player,target)=>{ + return !_status.event.sourcex.includes(target)&&player.canUse(_status.event.card,target); + }).set('sourcex',trigger.targets).set('ai',target=>{ + var player=_status.event.player; + return get.effect(target,_status.event.card,player,player); + }).set('card',trigger.card); + 'step 1' + if(result.bool){ + if(!event.isMine()&&!event.isOnline()) game.delayx(); + event.targets=result.targets; + } + else { + event.finish(); + } + 'step 2' + player.logSkill('vtbyaoli_effect',event.targets); + trigger.targets.addArray(event.targets); + player.removeSkill('vtbyaoli_effect'); + }, + marktext:'媱', + intro:{ + content:'下一张【杀】不可被响应且可以额外指定&个目标', + }, + ai:{ + directHit_ai:true, + skillTagFilter:function(player,tag,arg){ + return arg.card.name=='sha'; + }, + } + } + } + }, //官盗S特015神马超 psshouli:{ audio:'shouli', @@ -6771,16 +6771,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ vtbtaoyan_info:'回合开始时,你可以令至多两名其他角色摸一张牌并于游戏外获得一张【桃】(共五张且均为♥6)。', vtbyanli:'妍丽', vtbyanli_info:'每轮限一次。一名角色于你的回合外进入濒死状态时,你可以令其回复至1点体力,然后其摸一张牌。', - vtb_xiaole:'小乐', - vtbleyu:'乐虞', - vtbleyu_info:'一名角色的回合开始时,你可以弃置三张牌令其判定。若结果不为♥,其跳过本回合的出牌阶段。', - vtbyuanli:'媛丽', - vtbyuanli_info:'一名角色跳过出牌阶段后,你可以与一名其他角色各摸一张牌。', - vtb_xiaojiu:'小酒', - vtbmeiniang:'美酿', - vtbmeiniang_info:'其他角色的出牌阶段开始时,你可以令其视为使用一张无次数限制且不计入次数的【酒】。', - vtbyaoli:'媱丽', - vtbyaoli_info:'其他角色于其出牌阶段内使用【酒】后,你可以令其于本回合内使用的下一张【杀】不能被响应且可以额外指定一个目标。', + vtb_xiaole:'小乐', + vtbleyu:'乐虞', + vtbleyu_info:'一名角色的回合开始时,你可以弃置三张牌令其判定。若结果不为♥,其跳过本回合的出牌阶段。', + vtbyuanli:'媛丽', + vtbyuanli_info:'一名角色跳过出牌阶段后,你可以与一名其他角色各摸一张牌。', + vtb_xiaojiu:'小酒', + vtbmeiniang:'美酿', + vtbmeiniang_info:'其他角色的出牌阶段开始时,你可以令其视为使用一张无次数限制且不计入次数的【酒】。', + vtbyaoli:'媱丽', + vtbyaoli_info:'其他角色于其出牌阶段内使用【酒】后,你可以令其于本回合内使用的下一张【杀】不能被响应且可以额外指定一个目标。', old_machao:'J.SP马超', old_machao_prefix:'J.SP', jsp_caoren:'☆SP曹仁', diff --git a/character/rank.js b/character/rank.js index b97b21996..2fda41539 100644 --- a/character/rank.js +++ b/character/rank.js @@ -135,6 +135,7 @@ window.noname_character_rank={ 'jsrg_guozhao', 'sb_caopi', 'xia_yuzhenzi', + 'dc_simashi', ], a:[ 'star_caoren', @@ -368,6 +369,8 @@ window.noname_character_rank={ 'dc_lingcao', 'jsrg_zhugeliang', 'shen_lusu', + 'huzun', + 'star_zhangchunhua', ], am:[ 'bailingyun', @@ -675,6 +678,7 @@ window.noname_character_rank={ 'ol_sb_taishici', 'tianchou', 'ol_sb_guanyu', + 'gongsunxiu', ], bp:[ 'xin_huojun', @@ -1055,6 +1059,8 @@ window.noname_character_rank={ 'jsrg_sunlubansunluyu', 'jsrg_weiwenzhugezhi', 'shen_xuzhu', + 'dc_jiangji', + 'dc_wangling', ], b:[ 'junk_guanyu', diff --git a/character/shiji.js b/character/shiji.js index 9641498b6..4225f338b 100644 --- a/character/shiji.js +++ b/character/shiji.js @@ -6527,11 +6527,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ liuzhang:['liuzhang','tw_liuzhang'], chenzhen:['sp_chenzhen','tw_chenzhen'], feiyi:['ol_feiyi','feiyi','tw_feiyi'], - wangling:['wangling','tw_wangling'], + wangling:['dc_wangling','wangling','tw_wangling'], qiaogong:['qiaogong','tw_qiaogong'], sp_chendong:['sp_chendong','tw_chendong','chendong'], sp_jiangqing:['sp_jiangqing','tw_jiangqing','jiangqing'], - kongrong:['dc_kongrong','sp_kongrong','jsrg_kongrong','kongrong'], + kongrong:['dc_kongrong','sp_kongrong','jsrg_kongrong','kongrong'], dc_mifuren:['dc_mifuren','sp_mifuren'], }, translate:{ diff --git a/character/sp2.js b/character/sp2.js index 00edc2f4b..4600aef42 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'sp2', connect:true, character:{ + star_zhangchunhua:['female','wei',3,['starliangyan','starminghui']], star_yuanshao:['male','qun',4,['starxiaoyan','starzongshi','starjiaowang','staraoshi'],['zhu']], star_dongzhuo:['male','qun',5,['starweilin','starzhangrong','starhaoshou'],['zhu']], star_yuanshu:['male','qun',4,['starcanxi','starpizhi','starzhonggu'],['zhu']], @@ -111,12 +112,159 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sp_xuzhou:['re_taoqian','caosong','zhangmiao','qiuliju'], sp_zhongyuan:['re_hucheer','re_zoushi','caoanmin','re_dongcheng'], sp_xiaohu:['haomeng','yanfuren','yanrou','dc_zhuling'], - sp_star:['star_caoren','star_yuanshu','star_dongzhuo','star_yuanshao'], + sp_star:['star_caoren','star_yuanshu','star_dongzhuo','star_yuanshao','star_zhangchunhua'], mini_qixian:['mp_liuling'], sp_decade:['caobuxing','re_maliang','dc_jikang'], } }, skill:{ + //张春华 + starliangyan:{ + audio:2, + enable:'phaseUse', + usable:1, + filterTarget:lib.filter.notMe, + chooseButton:{ + dialog(event,player){ + const name=get.translation(event.result.targets[0]); + const list=[ + '你摸一张牌,其弃置一张牌','你弃置一张牌,其摸一张牌', + '你摸两张牌,其弃置两张牌','你弃置两张牌,其摸两张牌' + ].map((item,i)=>[i,item]); + const dialog=ui.create.dialog( + `梁燕:请选择你与${name}要执行的选项`, + [list.slice(0,2),'tdnodes'], + [list.slice(2,4),'tdnodes'], + 'hidden' + ); + return dialog; + }, + filter(button,player){ + const link=button.link; + if(link%2===0) return true; + return player.countDiscardableCards(player,'he')>=(link+1)/2; + }, + check(button){ + const player=get.player(),target=get.event().getParent().result.targets[0]; + const link=button.link; + if(get.attitude(player,target)<=0&&link===2) return 100; + const ph=player.countCards('h'),th=target.countCards('h'); + if(link%2===0){ + const num=(link/2)+1; + if(ph+num===th-num) return 10; + } + else{ + const num=(link+1)/2; + if(ph-num===th+num) return 10; + } + return 5; + }, + backup(links){ + return { + audio:'starliangyan', + target:get.event().result.targets[0], + link:links[0], + filterTarget(card,player,target){ + return target===lib.skill.starliangyan_backup.target; + }, + selectTarget:-1, + async content(content,trigger,player){ + const target=lib.skill.starliangyan_backup.target; + const link=lib.skill.starliangyan_backup.link; + const num=link<=1?1:2; + const fn=['draw','chooseToDiscard']; + if(link%2===1) fn.reverse(); + await player[fn[0]](num,true,'he'); + await target[fn[1]](num,true,'he'); + if(player.countCards('h')===target.countCards('h')){ + const skipper=[player,target][link%2]; + skipper.skip('phaseDiscard'); + game.log(skipper,'跳过了下一个','#y弃牌阶段'); + } + } + }; + }, + prompt(links){ + return '点击“确定”以执行效果'; + }, + }, + subSkill:{ + backup:{}, + }, + ai:{ + order(item,player){ + if(!game.hasPlayer(current=>current!==player&&get.attitude(player,current)>0)&&game.hasPlayer(current=>get.attitude(player,current)<=0)) return 10; + if(game.hasPlayer(current=>{ + const del=player.countCards('h')-current.countCards('h'),toFind=[2,4].find(num=>Math.abs(del)===num); + if(toFind===4&&del<0&&get.attitude(player,current)<=0){ + return true; + } + return false; + })) return 10; + return 1; + }, + result:{ + target(player,target){ + const del=player.countCards('h')-target.countCards('h'),toFind=[2,4].find(num=>Math.abs(del)===num); + if(toFind){ + return -del*(get.attitude(player,target)*Math.min(3,target.countCards('h')))*toFind/10; + } + return -1; + }, + }, + }, + }, + starminghui:{ + audio:2, + trigger:{global:'phaseEnd'}, + filter(event,player){ + return player.isMinHandcard()||player.isMaxHandcard(); + }, + direct:true, + async content(event,trigger,player){ + let logged=false; + if(player.isMinHandcard()){ + const card=new lib.element.VCard({ + name:'sha', + }); + const result=await player.chooseUseTarget(`###${get.prompt('starminghui')}###视为使用一张无距离限制的【杀】`,card,false,'nodistance').set('logSkill','starminghui').forResult(); + if(result.bool) logged=true; + } + const num=player.countCards('h'); + if(player.isMaxHandcard()&&num>0){ + const maxNum=game.findPlayer(current=>{ + return !game.hasPlayer(current2=>{ + if(current2===player) return false; + return current2.countCards('h')>current.countCards('h'); + }); + }).countCards('h'); + const leastDiscardNum=num-maxNum+1; + const prompt=logged?`是否将手牌弃置至不为最多?`:get.prompt('starminghui'); + const next=player.chooseToDiscard(prompt,`弃置至少${get.cnNumber(leastDiscardNum)}张手牌,然后你令一名角色回复1点体力`) + .set('selectCard',[leastDiscardNum,Infinity]) + .set('goon',game.hasPlayer(current=>get.recoverEffect(current,get.player(),get.player()))) + .set('ai',card=>{ + if(!get.event('goon')) return 0; + if(get.tag(card,'recover')) return 0; + if(ui.selected.cards.length===get.event('selectCard')[0]-1) return 6.5-get.value(card); + return 4-get.value(card); + }); + if(!logged) next.set('logSkill','starminghui'); + const result=await next.forResult(); + if(!result.bool) return; + if(!player.isUnderControl(true)&&!player.isOnline()) await game.asyncDelayx(); + const [bool,targets]=await player.chooseTarget('令一名角色回复1点体力') + .set('ai',target=>get.recoverEffect(target,get.player(),get.player())) + .forResult('bool','targets'); + if(bool){ + const target=targets[0]; + player.line(target,'green'); + await target.recover(); + } + } + }, + + }, //星袁绍 starxiaoyan:{ audio:2, @@ -10793,7 +10941,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dingyuan:['ol_dingyuan','dingyuan'], quyi:['quyi','re_quyi'], hansui:['hansui','re_hansui','xin_hansui','jsrg_hansui'], - jin_simashi:['jin_simashi','simashi'], + jin_simashi:['dc_simashi','jin_simashi','simashi'], jin_yanghuiyu:['jin_yanghuiyu','yanghuiyu'], taoqian:['re_taoqian','taoqian'], sp_liubei:['jsrg_liubei','sp_liubei'], @@ -11383,6 +11531,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ starjiaowang_info:'锁定技,非首轮游戏开始时,若上一轮没有角色死亡(因〖硝焰〗死亡的角色除外),则你失去1点体力并发动〖硝焰〗。', staraoshi:'傲势', staraoshi_info:'主公技,其他群势力角色的出牌阶段限一次,其可以交给你一张手牌,然后你可以发动一次〖纵势〗。', + star_zhangchunhua:'星张春华', + star_zhangchunhua_prefix:'星', + starliangyan:'梁燕', + starliangyan_info:'出牌阶段限一次。你可以选择一名其他角色,你摸/弃置至多两张牌,令其弃置/摸等量的牌。然后若你与其手牌数相同,以此法摸牌的角色跳过其下一个弃牌阶段。', + starminghui:'明慧', + starminghui_info:'一名角色的回合结束时,若你的手牌数:最少,你可以视为使用一张无距离限制的【杀】;最多,你可以将手牌弃置至你手牌数不为最多,然后令一名角色回复1点体力。', sp_whlw:"文和乱武", sp_zlzy:"逐鹿中原", diff --git a/character/tw.js b/character/tw.js index ee0cf5ea2..5af1ce462 100644 --- a/character/tw.js +++ b/character/tw.js @@ -15338,7 +15338,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ tw_caocao:['tw_caocao','jsrg_caocao','yj_caocao'], mateng:['tw_mateng','mateng'], xiahouen:['tw_xiahouen','jsrg_xiahouen'], - jiangji:['tw_jiangji','jiangji'], + jiangji:['dc_jiangji','tw_jiangji','jiangji'], baoxin:['tw_baoxin','baoxin'], yanxiang:['yanxiang','tw_yanxiang'], liwei:['liwei','tw_liwei'], diff --git a/character/xianding.js b/character/xianding.js index 4874b9313..7a3d624f4 100644 --- a/character/xianding.js +++ b/character/xianding.js @@ -4,6 +4,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ name:'xianding', connect:true, character:{ + huzun:['male','wei',4,['dczhantao','dcanjing']], zhugemengxue:['female','wei',3,['dcjichun','dchanying']], bailingyun:['female','wei',3,['dclinghui','dcxiace','dcyuxin']], dc_qinghegongzhu:['female','wei',3,['dczhangji','dczengou']], @@ -95,7 +96,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, characterSort:{ xianding:{ - sp2_huben:['wangshuang','wenyang','re_liuzan','dc_huangzu','wulan','leitong','chentai','dc_duyu','dc_wangjun','dc_xiahouba','old_huangfusong'], + sp2_huben:['wangshuang','wenyang','re_liuzan','dc_huangzu','wulan','leitong','chentai','dc_duyu','dc_wangjun','dc_xiahouba','old_huangfusong','huzun'], sp2_shengun:["puyuan","guanlu","gexuan",'wufan','re_zhangbao','dukui','zhaozhi','zhujianping','dc_zhouxuān','zerong'], sp2_bizhe:['dc_luotong','dc_wangchang','chengbing','dc_yangbiao','ruanji'], sp2_huangjia:['caomao','liubian','dc_liuyu','quanhuijie','dingshangwan','yuanji','xielingyu','sunyu','ganfurenmifuren','dc_ganfuren','dc_mifuren','dc_shixie'], @@ -113,6 +114,63 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } }, skill:{ + //胡遵 + dczhantao:{ + audio:2, + trigger:{global:'damageEnd'}, + filter(event,player){ + return event.source&&event.source!=player&&event.player.isIn(); + }, + check(event,player){ + if(!event.source.isIn()||!event.card||typeof get.number(event.card)!=='number') return 0; + return get.effect(event.source,{name:'sha'},player,player)>=0; + }, + logTarget:'player', + async content(event,trigger,player){ + player.judge(card=>{ + const evt=get.event().getParent().getTrigger(); + if(!evt.source.isIn()||!evt.card||typeof get.number(evt.card)!=='number') return 0; + if(get.number(card)>get.number(evt.card)) return 1.5; + return 0; + }).set('judge2',r=>r.bool).set('callback',()=>{ + const evt=event.getParent(2).getTrigger(); + if(!evt.source.isIn()||!evt.card||typeof get.number(evt.card)!=='number') return; + if(event.judgeResult.number>get.number(evt.card)){ + const sha=new lib.element.VCard({name:'sha'}),target=evt.source; + if(player.canUse(sha,target,false,false)){ + player.useCard(sha,target,false); + } + } + }) + } + }, + dcanjing:{ + audio:2, + trigger:{source:'damageSource'}, + filter(event,player){ + return game.hasPlayer(current=>current.isDamaged()); + }, + usable:1, + async content(event,trigger,player){ + const maxCount=player.getAllHistory('useSkill',evt=>evt.skill==='dcanjing').length+1; + const result=await player.chooseTarget(get.prompt2('dcanjing'),(card,player,target)=>target.isDamaged(),[1,maxCount]) + .set('ai',target=>{ + return get.attitude(get.player(),target)>0; + }) + .forResult(); + if(!result.bool) return; + const targets=result.targets.slice(); + targets.sortBySeat(_status.currentPhase); + player.logSkill('dcanjing',targets); + for(const target of targets) await target.draw(); + const minHp=targets.map(i=>i.getHp()).sort((a,b)=>a-b)[0]; + await game.asyncDelayx(); + for(const target of targets){ + if(!target.isIn()) continue; + if(target.getHp()===minHp) await target.recover(); + } + } + }, //诸葛梦雪 dcjichun:{ audio:2, @@ -13806,6 +13864,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ zhugeruoxue:'诸葛氏(“若雪”为网络小说虚构),诸葛亮的二姐,庞山民之妻。', zhugemengxue:'诸葛氏(“梦雪”为网络小说虚构),诸葛亮的大姐。', caoyi:'曹轶,游卡桌游旗下产品《三国杀》原创角色。设定上为曹纯所收养的孙女,从小受到曹纯的教导,在军营中长大,性情坚毅有担当,军事谋略丰富,战斗能力超强。曹轶喜欢美食,特别是甜食,并且擅长制作各种点心。她身边跟随的雪白小老虎是曹纯在她及笄时送的生辰礼物,希望她如小老虎一样,英勇无畏。曹轶与曹婴交好,两人以姐妹相称。曹轶成年后继承祖父衣钵,接手精锐部队“虎豹骑”,成为新的虎豹骑的统领者。', + huzun:'胡遵(?~256年),安定临泾(今甘肃省镇原县)人,三国时期曹魏大臣,官至卫将军,封阴密侯。出身安定胡氏。历任征东将军、征东大将军、卫将军等职。早年由张既征辟。后追随司马懿,参与平定匈奴胡薄居姿职叛乱、抵御诸葛亮北伐、平定公孙渊叛乱。嘉平四年(252年),作为曹魏三征之一的征东将军,主持征讨东吴,被诸葛恪击败。正元元年(255年)参与平定淮南三叛的第二叛毌丘俭、文钦之乱,事后升任卫将军。甘露元年(256年)秋七月己卯去世,追赠车骑将军。', }, characterTitle:{ // wulan:'#b对决限定武将', @@ -14449,6 +14508,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ dcjichun_info:'出牌阶段限一次,你可以展示一张手牌并选择一项:①将此牌交给一名手牌数小于你的角色,然后摸X张牌。②弃置此牌并弃置一名手牌数大于你的角色区域里至多X张牌。(X为此牌牌名字数)', dchanying:'寒英', dchanying_info:'准备阶段,你可以展示牌堆里的一张非赠物装备牌,然后令一名手牌数等于你的角色使用此牌。', + huzun:'胡遵', + dczhantao:'斩涛', + dczhantao_info:'当你或你攻击范围内的角色受到伤害后,若你不为伤害来源,你可以判定,若造成此伤害的渠道为牌且此牌有点数且判定结果点数大于此牌的点数,你视为对来源使用一张【杀】。', + dcanjing:'安境', + dcanjing_info:'每回合限一次。当你造成伤害后,你可以令至多X名已受伤的角色各摸一张牌,然后其中体力值最少的角色回复1点体力(X为你本局游戏发动〖安境〗的次数)。', sp2_yinyu:'隐山之玉', sp2_huben:'百战虎贲', diff --git a/image/character/dc_simashi.jpg b/image/character/dc_simashi.jpg new file mode 100644 index 000000000..28d9178e5 Binary files /dev/null and b/image/character/dc_simashi.jpg differ diff --git a/image/character/dc_wangling.jpg b/image/character/dc_wangling.jpg new file mode 100644 index 000000000..95aeb7844 Binary files /dev/null and b/image/character/dc_wangling.jpg differ diff --git a/image/character/star_zhangchunhua.jpg b/image/character/star_zhangchunhua.jpg new file mode 100644 index 000000000..5a583eb98 Binary files /dev/null and b/image/character/star_zhangchunhua.jpg differ diff --git a/noname/library/element/content.js b/noname/library/element/content.js index 37f481037..1ee63eaa4 100644 --- a/noname/library/element/content.js +++ b/noname/library/element/content.js @@ -2247,6 +2247,7 @@ export const Content = { } "step 2"; var info = get.info(event.skill); + if (result && result.control) result.bool = !result.control.includes('cancel'); if (!result || !result.bool) return; var autodelay = info.autodelay; if (typeof autodelay == 'function') autodelay = autodelay(trigger, player);