diff --git a/audio/skill/huoshaowuchao.mp3 b/audio/skill/huoshaowuchao.mp3 new file mode 100644 index 000000000..f9efc9039 Binary files /dev/null and b/audio/skill/huoshaowuchao.mp3 differ diff --git a/audio/skill/jianshoudaiyuan.mp3 b/audio/skill/jianshoudaiyuan.mp3 new file mode 100644 index 000000000..9e10ef7b2 Binary files /dev/null and b/audio/skill/jianshoudaiyuan.mp3 differ diff --git a/audio/skill/liangcaokuifa.mp3 b/audio/skill/liangcaokuifa.mp3 new file mode 100644 index 000000000..2f08cd0ad Binary files /dev/null and b/audio/skill/liangcaokuifa.mp3 differ diff --git a/audio/skill/liangjunxiangchi.mp3 b/audio/skill/liangjunxiangchi.mp3 new file mode 100644 index 000000000..ac579e207 Binary files /dev/null and b/audio/skill/liangjunxiangchi.mp3 differ diff --git a/audio/skill/shishengshibai.mp3 b/audio/skill/shishengshibai.mp3 new file mode 100644 index 000000000..f0447d2a5 Binary files /dev/null and b/audio/skill/shishengshibai.mp3 differ diff --git a/audio/skill/xutuhuanjin.mp3 b/audio/skill/xutuhuanjin.mp3 new file mode 100644 index 000000000..7e9744440 Binary files /dev/null and b/audio/skill/xutuhuanjin.mp3 differ diff --git a/audio/skill/zhanyanliangzhuwenchou.mp3 b/audio/skill/zhanyanliangzhuwenchou.mp3 new file mode 100644 index 000000000..da395d81d Binary files /dev/null and b/audio/skill/zhanyanliangzhuwenchou.mp3 differ diff --git a/mode/versus.js b/mode/versus.js index 0ef22594b..ada1918c1 100644 --- a/mode/versus.js +++ b/mode/versus.js @@ -85,6 +85,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ else if(_status.mode=='guandu'){ for(var i=0;i1+target.countMark('xujiu2')}, + }, shishengshibai:{ mod:{ aiOrder:function(player,card,num){ @@ -4659,6 +4693,198 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ }, }, }, + liangjunxiangchi: { + mod: { + maxHandcard: function(player, num) { + if (game.roundNumber <= 4) return num + game.roundNumber; + }, + }, + trigger: { source: 'damageBegin1' }, + filter: function(event, player) { + if (game.roundNumber <= 4) return false; + var evt2 = event.getParent('phaseUse'); + if (evt2.player != player) return false; + return player.getHistory('useCard', function (evt) { + return evt.card.name == 'sha' && evt.getParent('phaseUse') == evt2; + }).indexOf(event.getParent()) == 0; + }, + silent: true, + forced: true, + content: function() { + trigger.num++; + }, + }, + xutuhuanjin: { + trigger: { player: 'phaseUseEnd' }, + filter: function(event, player) { + if (player.getHistory('useCard', function (evt) { + return evt.card && evt.card.name == 'sha' && evt.getParent('phaseUse') == event; + }).length > 0) return false; + if (player.getHistory('respond', function (evt) { + return evt.card && evt.card.name == 'sha' && evt.getParent('phaseUse') == event; + }).length > 0) return false; + return true; + }, + forced: true, + content: function() { + player.addTempSkill('xutuhuanjin_yingzi', { player: 'phaseDrawAfter' }); + player.addMark('xutuhuanjin_yingzi', 1, false); + }, + subSkill: { + yingzi: { + charlotte: true, + onremove: true, + trigger: { player: 'phaseDrawBegin2' }, + filter: function(event, player) { + return !event.numFixed && player.hasMark('xutuhuanjin_yingzi'); + }, + forced: true, + content: function() { + trigger.num += player.countMark('xutuhuanjin_yingzi'); + }, + marktext: '缓', + intro: { content: '下个摸牌阶段多摸#张牌' }, + }, + }, + }, + jianshoudaiyuan: { + charlotte: true, + mod: { + aiValue: function(player, card, num) { + if (card.name != 'sha' && card.name != 'shan') return; + var geti = function () { + var cards = player.getCards('hs', function (card) { + return card.name == 'sha' || card.name == 'shan'; + }); + if (cards.contains(card)) { + return cards.indexOf(card); + } + return cards.length; + }; + return Math.max(num, [7, 5, 5, 3][Math.min(geti(), 3)]); + }, + aiUseful: function() { + return lib.skill.jianshoudaiyuan.mod.aiValue.apply(this, arguments); + }, + }, + locked: false, + enable: ['chooseToUse', 'chooseToRespond'], + position: 'hs', + prompt: '将【杀】当作【闪】,或将【闪】当作的【杀】使用或打出,然后你的下个弃牌阶段的手牌上限-1', + viewAs: function(cards, player) { + var name = false; + switch (get.name(cards[0], player)) { + case 'sha': name = 'shan'; break; + case 'shan': name = 'sha'; break; + } + if (name) return { name: name }; + return null; + }, + onuse: function(links, player) { + player.addTempSkill('jianshoudaiyuan_less', { player: 'phaseDiscardAfter' }); + player.addMark('jianshoudaiyuan_less', 1, false); + player.markSkill('jianshoudaiyuan_less'); + }, + onrespond: function(links, player) { + player.addTempSkill('jianshoudaiyuan_less', { player: 'phaseDiscardAfter' }); + player.addMark('jianshoudaiyuan_less', 1, false); + player.markSkill('jianshoudaiyuan_less'); + }, + check: function(card) { + var player = _status.event.player; + if (_status.event.type == 'phase') { + var max = 0; + var name2; + var list = ['sha']; + var map = { sha: 'shan' }; + for (var i = 0; i < list.length; i++) { + var name = list[i]; + if (player.countCards('hs', map[name]) && player.getUseValue({ name: name }) > 0) { + var temp = get.order({ name: name }); + if (temp > max) { + max = temp; + name2 = map[name]; + } + } + } + if (name2 == get.name(card, player)) return 1; + return 0; + } + return 1; + }, + filterCard: function(card, player, event) { + event = event || _status.event; + var filter = event._backup.filterCard; + var name = get.name(card, player); + if (name == 'sha' && filter({ name: 'shan', cards: [card] }, player, event)) return true; + if (name == 'shan' && filter({ name: 'sha', cards: [card] }, player, event)) return true; + return false; + }, + filter: function(event, player) { + var filter = event.filterCard; + if (filter({ name: 'sha' }, player, event) && player.countCards('hs', 'shan')) return true; + if (filter({ name: 'shan' }, player, event) && player.countCards('hs', 'sha')) return true; + return false; + }, + ai: { + respondSha: true, + respondShan: true, + skillTagFilter: function(player, tag) { + var name; + switch (tag) { + case 'respondSha': name = 'shan'; break; + case 'respondShan': name = 'sha'; break; + } + if (!player.countCards('hs', name)) return false; + }, + order: 0.01, + }, + subSkill: { + less: { + onremove: true, + charlotte: true, + market: '守', + intro: { content: '手牌上限-#' }, + mod: { + maxHandcard: function(player, num) { + return num - player.countMark('jianshoudaiyuan_less'); + }, + }, + }, + }, + }, + yiruoshengqiang: { + trigger: { source: 'damageBegin2' }, + filter: function(event, player) { + return event.player.hp > player.hp; + }, + forced: true, + silent: true, + content: function() { + trigger.num++; + }, + }, + shichongerjiao: { + charlotte: true, + trigger: { player: 'phaseJieshu' }, + filter: function(event, player) { + return lib.skill.shichongerjiao.filterx(event, player) || lib.skill.shichongerjiao.filtery(event, player); + }, + filterx: function(event, player) { + return player.isMaxHp(); + }, + filtery: function(event, player) { + return player.isMaxHandcard(); + }, + forced: true, + silent: true, + content: function() { + var bool1 = lib.skill.shichongerjiao.filterx(trigger, player); + var bool2 = lib.skill.shichongerjiao.filtery(trigger, player); + if (bool1) player.chooseToDiscard('he', true); + if (bool2) player.loseHp(); + }, + }, wenji:{ trigger:{global:'phaseUseBegin'}, filter:function(event,player){ @@ -6169,6 +6395,48 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } } }, + xujiu:{ + audio:'jiu', + cardimage:'jiu', + fullskin:true, + type:'basic', + enable:true, + filterTarget:function(card,player,target){ + return target.isEnemyOf(player); + }, + selectTarget:1, + content:function(){ + target.addTempSkill('xujiu2'); + target.addMark('xujiu2',(event.baseDamage||1),false); + }, + ai:{ + basic:{ + order:(item,player)=>{ + var cards=player.getCards('hs',card=>get.tag(card,'damage')&&player.hasValueTarget(card)); + if(!cards.length) return 0; + var cardx=cards.filter(card=>get.name(card)=='sha'); + cardx.sort((a,b)=>player.getUseValue(b)-player.getUseValue(a)); + cardx=cardx.slice(Math.min(cardx.length,player.getCardUsable('sha')),cardx.length); + cards.removeArray(cardx); + return get.order(cards.sort((a,b)=>get.order(b,player)-get.order(a,player))[0])+0.3; + }, + useful:5, + value:3, + }, + result:{ + target:(player,target)=>{ + if(target.hasSkill('gangzhi')||get.attitude(player,target)>=0) return 0; + var cards=player.getCards('hs',card=>get.tag(card,'damage')&&player.canUse(card,target)&&get.effect(target,card,player,player)>0); + if(!cards.length) return 0; + var cardx=cards.filter(card=>get.name(card)=='sha'); + cardx.sort((a,b)=>get.effect(target,b,player,player)-get.effect(target,a,player,player)); + cardx=cardx.slice(Math.min(cardx.length,player.getCardUsable('sha')),cardx.length); + cards.removeArray(cardx); + return -cards.reduce((sum,card)=>sum+get.effect(target,card,player,player),0); + }, + }, + }, + }, zong:{ fullskin:true, type:'basic',