diff --git a/audio/die/ol_sb_guanyu.mp3 b/audio/die/ol_sb_guanyu.mp3 new file mode 100644 index 000000000..76ce3f303 Binary files /dev/null and b/audio/die/ol_sb_guanyu.mp3 differ diff --git a/audio/die/ol_sb_taishici.mp3 b/audio/die/ol_sb_taishici.mp3 new file mode 100644 index 000000000..4468d15e6 Binary files /dev/null and b/audio/die/ol_sb_taishici.mp3 differ diff --git a/audio/die/yuantanyuanshang.mp3 b/audio/die/yuantanyuanshang.mp3 index 9570aac6a..6a07c8a89 100644 Binary files a/audio/die/yuantanyuanshang.mp3 and b/audio/die/yuantanyuanshang.mp3 differ diff --git a/audio/skill/neifa1.mp3 b/audio/skill/neifa1.mp3 index 864478139..9ada04d0d 100644 Binary files a/audio/skill/neifa1.mp3 and b/audio/skill/neifa1.mp3 differ diff --git a/audio/skill/neifa2.mp3 b/audio/skill/neifa2.mp3 index 33b082a6b..b324726f5 100644 Binary files a/audio/skill/neifa2.mp3 and b/audio/skill/neifa2.mp3 differ diff --git a/audio/skill/olsbdouchan1.mp3 b/audio/skill/olsbdouchan1.mp3 new file mode 100644 index 000000000..18069e4e7 Binary files /dev/null and b/audio/skill/olsbdouchan1.mp3 differ diff --git a/audio/skill/olsbdouchan2.mp3 b/audio/skill/olsbdouchan2.mp3 new file mode 100644 index 000000000..d4e436951 Binary files /dev/null and b/audio/skill/olsbdouchan2.mp3 differ diff --git a/audio/skill/olsbdulie1.mp3 b/audio/skill/olsbdulie1.mp3 new file mode 100644 index 000000000..3dbf68e06 Binary files /dev/null and b/audio/skill/olsbdulie1.mp3 differ diff --git a/audio/skill/olsbdulie2.mp3 b/audio/skill/olsbdulie2.mp3 new file mode 100644 index 000000000..25e7eb3d4 Binary files /dev/null and b/audio/skill/olsbdulie2.mp3 differ diff --git a/audio/skill/olsbfumeng1.mp3 b/audio/skill/olsbfumeng1.mp3 new file mode 100644 index 000000000..cedfd96b6 Binary files /dev/null and b/audio/skill/olsbfumeng1.mp3 differ diff --git a/audio/skill/olsbfumeng2.mp3 b/audio/skill/olsbfumeng2.mp3 new file mode 100644 index 000000000..0d176c8ec Binary files /dev/null and b/audio/skill/olsbfumeng2.mp3 differ diff --git a/audio/skill/olsbguidao1.mp3 b/audio/skill/olsbguidao1.mp3 new file mode 100644 index 000000000..54fedd310 Binary files /dev/null and b/audio/skill/olsbguidao1.mp3 differ diff --git a/audio/skill/olsbguidao2.mp3 b/audio/skill/olsbguidao2.mp3 new file mode 100644 index 000000000..fa1226b08 Binary files /dev/null and b/audio/skill/olsbguidao2.mp3 differ diff --git a/character/onlyOL.js b/character/onlyOL.js index d6eafc99b..fb2e22792 100644 --- a/character/onlyOL.js +++ b/character/onlyOL.js @@ -9,12 +9,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ ol_jianyong:['male','shu',3,['olqiaoshui','jyzongshi'],['tempname:re_jianyong','die_audio:re_jianyong']], ol_lingtong:['male','wu',4,['olxuanfeng'],['die_audio:re_lingtong']], ol_sb_guanyu:['male','shu',4,['olsbfumeng','olsbguidao']], + ol_sb_taishici:['male','wu',4,['olsbdulie','olsbdouchan']], }, characterSort:{ onlyOL:{ onlyOL_yijiang1:['ol_jianyong','ol_lingtong'], onlyOL_yijiang2:['ol_caozhang'], - onlyOL_sb:['ol_sb_jiangwei','ol_sb_guanyu'], + onlyOL_sb:['ol_sb_jiangwei','ol_sb_guanyu','ol_sb_taishici'], }, }, characterIntro:{ @@ -22,17 +23,71 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterReplace:{ }, skill:{ + //OL谋太史慈 + olsbdulie:{ + audio:2, + trigger:{target:'useCardToTarget'}, + filter(event,player){ + if(event.player==player||!event.isFirstTarget||event.targets.length!=1) return false; + if(player.getAttackRange()<=0) return; + return ['basic','trick'].includes(get.type(event.card)); + }, + prompt2(event,player){ + return '令'+get.translation(event.card)+'额外结算一次,此牌结算完毕后,你摸等同于你攻击范围的牌'; + }, + check(event,player){ + const num=Math.min(5,player.getAttackRange()); + if(get.effect(player,event.card,event.player,player)>0) return true; + if(event.card.name=='guohe'||event.card.name=='shunshou'||event.card.name=='zhujinqiyuan') return num>(event.effectCount||0); + if(!get.tag(event.card,'damage')) return true; + return num>1; + }, + usable:1, + async content(event,trigger,player){ + trigger.getParent().effectCount++; + player.when({global:'useCardAfter'}) + .filter(evt=>evt==trigger.getParent()) + .then(()=>{ + const num=Math.min(5,player.getAttackRange()); + if(num>0) player.draw(num); + }); + }, + }, + olsbdouchan:{ + audio:2, + trigger:{player:'phaseZhunbeiBegin'}, + forced:true, + async content(event,trigger,player){ + const card=get.cardPile2(card=>card.name=='juedou'); + if(card) player.gain(card,'gain2'); + else if(player.countMark('olsbdouchan')攻击距离+#
  • 使用【杀】的次数上限+#'}, + }, //OL谋关羽 //可以和手杀谋关羽组成卧龙凤雏了 olsbfumeng:{ audio:2, trigger:{global:'roundStart'}, filter(event,player){ - return player.countCards('h'); + return player.countCards('h',card=>{ + if(_status.connectMode) return true; + return get.name(card,player)!='sha'; + }); }, direct:true, async content(event,trigger,player){ - const {result:{bool,cards}}=await player.chooseCard(get.prompt2('olsbfumeng'),[1,Infinity]).set('ai',card=>{ + const {result:{bool,cards}}=await player.chooseCard(get.prompt2('olsbfumeng'),[1,Infinity],(card,player)=>{ + return get.name(card,player)!='sha'; + }).set('ai',card=>{ const player=get.event('player'); if(player.hasSkill('olsbfumeng')) return 7-get.value(card); return 4.5-get.value(card); @@ -131,7 +186,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, trigger:{global:'damageBegin3'}, filter(event,player){ - return event.card&&event.source&&event.card.storage&&event.card.storage.olsbguidao&&event.source==player; + if(!event.card||!event.card.storage||!event.card.storage.olsbguidao) return false; + if(!event.source||event.source!=player) return false; + const evt=event.getParent('useCard'); + return evt.player==player&&evt.targets.includes(event.player); }, forced:true, popup:false, @@ -281,14 +339,14 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }).set('list',[-num1,player.getDamagedHp()]); } if(result.index==0){ - if(num1<0) player.drawTo(player.getHandcardLimit()); - else player.chooseToDiscard(num1,'h',true); + if(num1<0) yield player.drawTo(player.getHandcardLimit()); + else yield player.chooseToDiscard(num1,'h',true); } else{ - player.recover(player.maxHp-player.hp); + yield player.recover(player.maxHp-player.hp); } } - player.when('olsbranjiAfter').then(()=>player.addSkill('olsbranji_norecover')); + player.addSkill('olsbranji_norecover'); player.when({source:'dieAfter'}).then(()=>player.removeSkill('olsbranji_norecover')); }, derivation:['kunfenx','zhaxiang'], @@ -495,6 +553,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ olsbfumeng_info:'一轮游戏开始时,你可以令任意张手牌的牌名视为【杀】。', olsbguidao:'归刀', olsbguidao_info:'出牌阶段,你可以重铸两张牌并视为使用一张【决斗】(重铸的【杀】数须比本回合上次发动〖归刀〗重铸的【杀】数多)。目标角色受到此牌伤害时,其须猜测你手牌中牌名为【杀】的牌数量多还是牌名不为【杀】的牌数多,若其猜错,则此【决斗】对其造成的伤害+1。', + ol_sb_taishici:'OL谋太史慈', + ol_sb_taishici_prefix:'OL谋', + olsbdulie:'笃烈', + olsbdulie_info:'每回合限一次,当你成为其他角色使用基本牌或普通锦囊牌的目标时,你可以令此牌额外结算一次。若如此做,此牌结算完毕后,你摸X张牌(X为你的攻击范围且至多为5)。', + olsbdouchan:'斗缠', + olsbdouchan_info:'锁定技,准备阶段,你从牌堆中获得一张【决斗】,若牌堆没有【决斗】,则你的攻击范围和出牌阶段使用【杀】的次数上限+1(增加次数不超过游戏人数)。', onlyOL_yijiang1:'OL专属·将1', onlyOL_yijiang2:'OL专属·将2', diff --git a/character/rank.js b/character/rank.js index eb436de45..5daf5f9c1 100644 --- a/character/rank.js +++ b/character/rank.js @@ -664,6 +664,7 @@ window.noname_character_rank={ 'jsrg_zhaoyun', 'jsrg_zhangxuan', 'sb_xunyu', + 'ol_sb_taishici', ], bp:[ 'xin_huojun', @@ -2122,6 +2123,7 @@ window.noname_character_rank={ 'xia_shitao', ], rare:[ + 'ol_sb_taishici', 'clan_wuqiao', 'xin_huojun', 'muludawang', diff --git a/character/sb.js b/character/sb.js index b6b2e57c9..2c744aec4 100644 --- a/character/sb.js +++ b/character/sb.js @@ -805,7 +805,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ direct:true, content:function*(event,map){ var player=map.player; - var result=yield player.chooseTarget(get.prompt('sbwusheng'),'选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用'+(get.mode()==='identity'?'五':'三')+'张【杀】后不能对其使用【杀】',(card,player,target)=>{ + var result=yield player.chooseTarget(get.prompt('sbwusheng'),'选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸'+(get.mode()==='identity'?'两':'一')+'张牌,对其使用三张【杀】后不能对其使用【杀】',(card,player,target)=>{ return target!=player&&!target.isZhu2(); }).set('ai',target=>{ var player=_status.event.player; @@ -908,7 +908,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, playerEnabled:function(card,player,target){ if(card.name!='sha'||typeof player.storage.sbwusheng_effect[target.playerid]!='number') return; - if(player.storage.sbwusheng_effect[target.playerid]>=(get.mode()==='identity'?5:3)) return false; + if(player.storage.sbwusheng_effect[target.playerid]>=3) return false; }, }, audio:'sbwusheng', @@ -926,7 +926,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } else{ player.logSkill('sbwusheng_effect',trigger.target); - player.draw(); + player.draw(get.mode()==='identity'?2:1); } }, }, @@ -954,7 +954,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ charlotte:true, onremove:true, audio:'sbyijue', - trigger:{player:'useCardToPlayered'}, + trigger:{player:'useCardToPlayer'}, filter:function(event,player){ return player.getStorage('sbyijue_effect').includes(event.target); }, @@ -6710,9 +6710,9 @@ game.import('character',function(lib,game,ui,get,ai,_status){ sbwusheng:'武圣', sbwusheng_wusheng_backup:'武圣', sbwusheng_info:'你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用三张【杀】后不能对其使用【杀】。', - sbwusheng_info_identity:'你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸一张牌,对其使用五张【杀】后不能对其使用【杀】。', + sbwusheng_info_identity:'你可以将一张手牌当作任意【杀】使用或打出。出牌阶段开始时,你可以选择一名非主公的其他角色,本阶段对其使用【杀】无距离和次数限制,使用【杀】指定其为目标后摸两张牌,对其使用三张【杀】后不能对其使用【杀】。', sbyijue:'义绝', - sbyijue_info:'锁定技,每名角色每局游戏限一次,当你对一名角色造成大于等于其体力值的伤害时,你防止此伤害,且本回合你使用牌指定其为目标后,取消之。', + sbyijue_info:'锁定技,每名角色每局游戏限一次,当你对一名角色造成大于等于其体力值的伤害时,你防止此伤害,且本回合你使用牌指定其为目标时,此牌对其无效。', sb_caopi:'谋曹丕', sb_caopi_prefix:'谋', sbxingshang:'行殇', diff --git a/character/sp.js b/character/sp.js index 3e5fb366d..f74c0de1d 100755 --- a/character/sp.js +++ b/character/sp.js @@ -24763,12 +24763,13 @@ game.import('character',function(lib,game,ui,get,ai,_status){ player:'enterGame', }, filter:function(event,player){ + if(player.countMark('xinfu_xionghuo')>=3) return false; return event.name!='phase'||game.phaseNumber==0; }, forced:true, locked:false, content:function(){ - player.addMark('xinfu_xionghuo',3); + player.addMark('xinfu_xionghuo',3-player.countMark('xinfu_xionghuo')); }, }, damage:{ @@ -24856,13 +24857,16 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:2, trigger:{global:'dying'}, filter:function(event,player){ - return event.player!=player; + if(event.player==player) return false; + const bool1=(!player.hasSkill('xinfu_xionghuo')||player.countMark('xinfu_xionghuo')<3); + const bool2=(event.player.hp<0&&get.itemtype(event.parent.cards)=='cards'&&event.parent.cards.some(card=>get.position(card,true)=='o')); + return bool1||bool2; }, forced:true, content:function(){ - if(player.countMark('xinfu_xionghuo')<3) player.addMark('xinfu_xionghuo',1); - if(trigger.player.hp<0&&get.itemtype(trigger.parent.cards)=='cards'&&get.position(trigger.parent.cards[0],true)=='o'){ - player.gain(trigger.parent.cards,'gain2'); + if(!player.hasSkill('xinfu_xionghuo')||player.countMark('xinfu_xionghuo')<3) player.addMark('xinfu_xionghuo',1); + if(trigger.player.hp<0&&get.itemtype(trigger.parent.cards)=='cards'&&trigger.parent.cards.some(card=>get.position(card,true)=='o')){ + player.gain(trigger.parent.cards.filter(card=>get.position(card,true)=='o'),'gain2'); } }, }, diff --git a/character/tw.js b/character/tw.js index 226a042eb..9c50706ca 100644 --- a/character/tw.js +++ b/character/tw.js @@ -780,45 +780,11 @@ game.import('character',function(lib,game,ui,get,ai,_status){ } target.disableEquip(disables); if(num) target.draw(num); - target.when('phaseDiscardEnd') - .then(()=>{ - if(!trigger.cards||!trigger.cards.length||!player.hasDisabledSlot()){ - event.finish(); - return; - } - const num=trigger.cards.length; - let list=[]; - for(let i=1;i<6;i++){ - if(player.hasDisabledSlot(i)){ - for(let j=0;jget.translation(i)); - player.chooseButton([ - '劫囚:请选择你要恢复的装备栏', - [transList,'tdnodes'], - ],num,true).set('ai',button=>['equip5','equip4','equip1','equip3','equip2'].indexOf(button.link)+2); - }) - .then(()=>{ - if(result.bool){ - let map={}; - for(let i of event.list){ - if(!map[get.translation(i)]) map[get.translation(i)]=i; - } - player.enableEquip(result.links.slice().map(i=>map[i])); - } - }); - target.when('phaseEnd') - .then(()=>{ - if(player.hasDisabledSlot()&&target.isIn()&&!target.hasSkill('twjieqiu_used')){ - target.popup('劫囚'); - target.addTempSkill('twjieqiu_used','roundStart'); - target.insertPhase(); - } - }).vars({target:player}); + target.addSkill('twjieqiu_buff'); + target.markAuto('twjieqiu_buff',[player]); + target.when('enableEquipEnd') + .filter((e,p)=>!p.hasDisabledSlot()) + .then(()=>player.removeSkill('twjieqiu_buff')); }, ai:{ order:7, @@ -828,7 +794,60 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, }, }, - subSkill:{used:{charlotte:true}}, + subSkill:{ + used:{charlotte:true}, + buff:{ + charlotte:true, + onremove:true, + trigger:{player:'phaseDiscardEnd'}, + filter(event,player){ + return player.hasDisabledSlot()&&event.cards&&event.cards.length; + }, + forced:true, + popup:false, + async content(event,trigger,player){ + const num=trigger.cards.length; + let list=[],map={}; + for(let i=1;i<6;i++){ + map[get.translation('equip'+i)]=('equip'+i); + if(player.hasDisabledSlot(i)){ + for(let j=0;jget.translation(i)); + const {result:{bool,links}}=await player.chooseButton([ + '劫囚:请选择你要恢复的装备栏', + [transList,'tdnodes'], + ],num,true).set('map',map) + .set('ai',button=>['equip5','equip4','equip1','equip3','equip2'].indexOf(get.event('map')[button.link])+2); + if(bool) player.enableEquip(links.slice().map(i=>map[i])); + }, + group:['twjieqiu_end'], + }, + end:{ + charlotte:true, + trigger:{player:'phaseEnd'}, + filter(event,player){ + return player.hasDisabledSlot()&&player.getStorage('twjieqiu_buff').some(target=>{ + return target.isIn()&&!target.hasSkill('twjieqiu_used'); + }); + }, + forced:true, + popup:false, + async content(event,trigger,player){ + const targets=player.getStorage('twjieqiu_buff').filter(target=>{ + return target.isIn()&&!target.hasSkill('twjieqiu_used'); + }).sortBySeat(); + for(const target of targets){ + target.popup('劫囚'); + target.addTempSkill('twjieqiu_used','roundStart'); + target.insertPhase(); + } + }, + }, + }, }, twenchou:{ audio:2, @@ -855,7 +874,8 @@ game.import('character',function(lib,game,ui,get,ai,_status){ const {result:{bool,links}}=await player.chooseButton([ '恩仇:请选择'+get.translation(target)+'要恢复的装备栏', [transList,'tdnodes'], - ],true).set('ai',button=>1/(['equip5','equip4','equip1','equip3','equip2'].indexOf(button.link)+2)); + ],true).set('map',map) + .set('ai',button=>1/(['equip5','equip4','equip1','equip3','equip2'].indexOf(get.event('map')[button.link])+2)); if(bool) target.enableEquip(links.slice().map(i=>map[i])); }, ai:{ @@ -945,7 +965,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ locked:false, async content(event,trigger,player){ await player.draw(); - await player.addMark('twchue',1); + player.addMark('twchue',1); }, }, effect:{ @@ -15976,7 +15996,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twchue_info:'①当你使用【杀】指定唯一目标时,你可以失去1点体力,为此牌额外指定Z个目标。②当你受到伤害或失去体力后,你摸一张牌并获得1个“勇”标记。③回合结束时,若你本回合发动过〖除恶②〗,则你可以失去Z个“勇”标记,视为使用一张伤害+1且可以额外指定Z个目标的【杀】。(Z为你的体力值)', xia_shitao:'石韬', twjieqiu:'劫囚', - twjieqiu_info:'出牌阶段限一次,你可以选择一名装备区没有废除栏的其他角色,废除其所有装备栏,然后其摸X张牌(X为其废除装备栏前的装备区牌数)。其下个弃牌阶段结束时,其恢复等同于其弃置牌数的装备栏;其下个回合结束时,若其仍有已废除的装备栏,则你执行一个额外回合(每轮限一次)。', + twjieqiu_info:'出牌阶段限一次,你可以选择一名装备区没有废除栏的其他角色,废除其所有装备栏,然后其摸X张牌(X为其废除装备栏前的装备区牌数),直到其恢复所有装备栏前:其弃牌阶段结束时,其恢复等同于其弃置牌数的装备栏;其回合结束时,若其仍有已废除的装备栏,则你执行一个额外回合(每轮限一次)。', twenchou:'恩仇', twenchou_info:'出牌阶段限一次,你可以观看一名存在废除装备栏的其他角色的手牌并获得其中一张牌,然后你恢复其一个装备栏。', xia_shie:'史阿', @@ -15984,7 +16004,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ twdengjianx:'剑法', twdengjian_info:'①其他角色的弃牌阶段结束时,你可以弃置一张牌并随机获得本回合所有造成伤害的牌对应的实体牌的其中一张与你本轮以此法获得的牌的颜色均不同的【杀】,称为“剑法”。②你使用“剑法”牌不计入次数限制。', twxinshou:'心授', - twxinshou_info:'当你于出牌阶段使用【杀】时,若此【杀】与你本回合使用的所有其他【杀】的颜色均不相同,则你可以选择执行以下一项本回合未执行过的项:⒈摸一张牌;⒉交给一名其他角色一张牌。若这两项本回合均已被选择过,则你可以令〖登剑①〗失效并令一名其他角色获得〖登剑〗,你的下个回合开始时,其失去〖登剑〗,若其这期间使用【杀】造成过伤害,则你结束〖登剑①〗的失效状态。', + twxinshou_info:'①当你于出牌阶段使用【杀】时,若此【杀】与你本回合使用的所有其他【杀】的颜色均不相同,则你可以选择执行以下一项本回合未执行过的项:⒈摸一张牌;⒉交给一名其他角色一张牌。②当你使用【杀】时,若〖心授①〗的两项本回合均已被你选择过,则你可以令〖登剑①〗失效并令一名其他角色获得〖登剑〗,你的下个回合开始时,其失去〖登剑〗,若其这期间使用【杀】造成过伤害,则你结束〖登剑①〗的失效状态。', xia_yuzhenzi:'玉真子', twhuajing:'化境', twhuajing_info:'①游戏开始时,你获得6个效果各不相同的无效果“武”标记。②一名拥有“武”标记的角色的攻击范围+X(X为其拥有的“武”标记数)。③出牌阶段限一次,你可以展示至多四张手牌,然后根据这些牌含有的花色数于本回合获得等量你拥有的“武”标记的效果。④拥有“武”标记效果的角色的武器牌失效(武器牌不提供攻击范围且武器技能失效)。', diff --git a/image/character/ol_sb_taishici.jpg b/image/character/ol_sb_taishici.jpg new file mode 100644 index 000000000..ab132f8e1 Binary files /dev/null and b/image/character/ol_sb_taishici.jpg differ