diff --git a/audio/die/re_liuzan.mp3 b/audio/die/re_liuzan.mp3 new file mode 100644 index 000000000..57e7e03ee Binary files /dev/null and b/audio/die/re_liuzan.mp3 differ diff --git a/audio/skill/liji1.mp3 b/audio/skill/liji1.mp3 new file mode 100644 index 000000000..8552843fe Binary files /dev/null and b/audio/skill/liji1.mp3 differ diff --git a/audio/skill/liji2.mp3 b/audio/skill/liji2.mp3 new file mode 100644 index 000000000..bbca01064 Binary files /dev/null and b/audio/skill/liji2.mp3 differ diff --git a/audio/skill/refenyin1.mp3 b/audio/skill/refenyin1.mp3 new file mode 100644 index 000000000..d3a9a6ac6 Binary files /dev/null and b/audio/skill/refenyin1.mp3 differ diff --git a/audio/skill/refenyin2.mp3 b/audio/skill/refenyin2.mp3 new file mode 100644 index 000000000..f79b3d557 Binary files /dev/null and b/audio/skill/refenyin2.mp3 differ diff --git a/character/diy.js b/character/diy.js index 7178d5bf9..b6eb19613 100755 --- a/character/diy.js +++ b/character/diy.js @@ -2261,8 +2261,10 @@ game.import('character',function(lib,game,ui,get,ai,_status){ if(!trigger.player.countCards('h')) event.finish(); else player.chooseButton(['选择一张牌作为「蝶」',trigger.player.getCards('h')]).set('ai',function(button){ var val=get.buttonValue(button); - if(get.attitude(_status.event.player,get.owner(button.link))>0) return -val; - return val; + if(get.attitude(_status.event.player,get.owner(button.link))<=0) return 10+val; + if(val<=0) return 20; + if(button.link.name=='tao'||button.link.name=='jiu') return 0; + return 1/val; }); 'step 2' if(result.bool){ diff --git a/character/extra.js b/character/extra.js index 7f64d79db..53970d556 100755 --- a/character/extra.js +++ b/character/extra.js @@ -3,6 +3,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ return { name:'extra', connect:true, + connectBanned:['shen_diaochan'], characterSort:{ extra:{ extra_feng:['shen_guanyu','shen_lvmeng'], @@ -13,6 +14,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ extra_lei:['shen_ganning','shen_zhangliao'], extra_key:['key_kagari','key_shiki'], extra_ol:['ol_zhangliao','shen_caopi','shen_zhenji'], + extra_offline:['shen_diaochan'], }, }, character:{ @@ -20,7 +22,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ key_shiki:['female','shen','3/5',['shiki_omusubi'],['key']], //key_hina:['female','shen',3,[],['key']], - //shen_diaochan:['female','shen',3,[],['qun']], + shen_diaochan:['female','shen',3,['meihun','huoxin'],['qun']], shen_guanyu:['male','shen',5,['new_wuhun','wushen'],['shu']], shen_zhaoyun:['male','shen',2,['xinjuejing','relonghun'],['shu']], shen_zhugeliang:['male','shen',3,['qixing','kuangfeng','dawu'],['shu']], @@ -47,7 +49,174 @@ game.import('character',function(lib,game,ui,get,ai,_status){ characterTitle:{ //shen_ganning:"体力上限:6", }, + characterFilter:{ + shen_diaochan:function(mode){ + return mode=='identity'||mode=='doudizhu'; + }, + }, skill:{ + meihun:{ + audio:2, + trigger:{ + player:'phaseJieshuBegin', + target:'useCardToTargeted', + }, + direct:true, + filter:function(event,player){ + if(event.name!='phaseJieshu'&&event.card.name!='sha') return false; + return game.hasPlayer(function(current){ + return current!=player&¤t.countCards('h'); + }); + }, + content:function(){ + 'step 0' + player.chooseTarget(get.prompt2('meihun'),function(card,player,target){ + return target!=player&&target.countCards('h')>0; + }).set('ai',function(target){ + var player=_status.event.player; + var att=get.attitude(player,target); + if(att>0) return 0; + return 0.1-att/target.countCards('h'); + }); + 'step 1' + if(result.bool){ + var target=result.targets[0]; + player.logSkill('meihun',target); + event.target=target; + player.chooseControl(lib.suit).set('prompt','请选择一种花色').set('ai',function(){ + return lib.suit.randomGet(); + }) + } + else event.finish(); + 'step 2' + var suit=result.control; + player.chat(get.translation(suit+2)); + if(target.countCards('h',{suit:suit})){ + target.chooseCard('h','交给'+get.translation(player)+'一张'+get.translation(suit)+'花色的手牌',true,function(card,player){ + return get.suit(card,player)==_status.event.suit; + }).set('suit',suit); + } + else{ + player.discardPlayerCard(target,true,'h','visible'); + event.finish(); + } + 'step 3' + if(result.bool&&result.cards&&result.cards.length) player.gain(result.cards,target,'give'); + }, + }, + //Connect Mode support after Angel Beats! -2nd beat- + huoxin:{ + audio:2, + enable:'phaseUse', + usable:1, + filter:function(event,player){ + if(game.countPlayer()<3) return false; + for(var i of lib.suit){ + if(player.countCards('h',{suit:i})>1) return true; + } + return false; + }, + complexCard:true, + position:'h', + filterCard:function(card,player){ + if(!ui.selected.cards.length){ + var suit=get.suit(card); + return player.countCards('h',function(card2){ + return card!=card2&&get.suit(card2,player)==suit; + })>0; + } + return get.suit(card,player)==get.suit(ui.selected.cards[0],player); + }, + selectCard:2, + selectTarget:2, + filterTarget:lib.filter.notMe, + multitarget:true, + multiline:true, + delay:false, + check:function(card){ + return 6-get.value(card); + }, + targetprompt:['拼点发起人','拼点目标'], + content:function(){ + 'step 0' + player.showCards(cards); + 'step 1' + var target=targets[0]; + targets.sortBySeat(); + if(target!=targets[0]) cards.reverse(); + for(var i=0;i1; + }, + logTarget:'player', + skillAnimation:true, + animationColor:'key', + content:function(){ + trigger.player.removeMark('huoxin',trigger.player.countMark('huoxin')); + trigger.player._trueMe=player; + game.addGlobalSkill('autoswap'); + if(trigger.player==game.me){ + game.notMe=true; + if(!_status.auto) ui.click.auto(); + } + trigger.player.addSkill('huoxin2'); + }, + }, + huoxin2:{ + trigger:{ + player:['phaseAfter','dieAfter'], + global:'phaseBefore', + }, + lastDo:true, + charlotte:true, + forceDie:true, + forced:true, + silent:true, + content:function(){ + player.removeSkill('huoxin2'); + }, + onremove:function(player){ + if(player==game.me){ + if(!game.notMe) game.swapPlayerAuto(player._trueMe) + else delete game.notMe; + if(_status.auto) ui.click.auto(); + } + delete player._trueMe; + }, + }, shiki_omusubi:{ audio:2, trigger:{global:'roundStart'}, @@ -3423,7 +3592,12 @@ game.import('character',function(lib,game,ui,get,ai,_status){ qixian_info:'锁定技,你的手牌上限视为7。', caopi_xingdong:'行动', caopi_xingdong_info:'出牌阶段限一次,你可以将一张【杀】或普通锦囊牌交给一名其他角色,然后该角色选择一项:对除你以外的角色使用此牌并在此牌结算完成后和你各摸一张牌;或跳过下回合的判定阶段和摸牌阶段。', - //shen_diaochan:'神貂蝉', + shen_diaochan:'神貂蝉', + meihun:'魅魂', + meihun_info:'结束阶段或当你成为【杀】的目标后,你可以令一名其他角色交给你一张你声明的花色的牌,若其没有则你观看其手牌然后弃置其中一张。', + huoxin_control:'惑心', + huoxin:'惑心', + huoxin_info:'出牌阶段限一次,你可以展示两张花色相同的手牌并分别交给两名其他角色,然后令这两名角色拼点,没赢的角色获得1个“魅惑”标记。拥有2个或更多“魅惑”的角色回合即将开始时,该角色移去其所有“魅惑”,此回合改为由你操控。', key_kagari:'篝', kagari_zongsi:'纵丝', @@ -3442,6 +3616,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ extra_lei:'神话再临·雷', extra_key:'神话再临·论外', extra_ol:'神话再临OL', + extra_offline:'神话再临·线下', }, }; }); diff --git a/character/refresh.js b/character/refresh.js index c573bd38e..96ba7760f 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -1108,7 +1108,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ audio:'xuanfeng', audioname:['boss_lvbu3','re_heqi','re_lingtong'], trigger:{ - player:'loseAfter', + player:['loseAfter','phaseDiscardEnd'], source:'gainAfter', global:['equipAfter','addJudgeAfter'], }, diff --git a/character/sp2.js b/character/sp2.js index 06c26eca0..89d9d3be3 100644 --- a/character/sp2.js +++ b/character/sp2.js @@ -475,6 +475,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ backup:function(links,player){ return { audio:'juanhui', + popname·true, filterCard:true, viewAs:{ name:links[0][2], @@ -788,7 +789,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, //新岩泽(划掉)留赞 refenyin:{ - audio:'fenyin', + audio:2, trigger:{global:['loseAfter','cardsDiscardAfter']}, forced:true, filter:function(event,player){ @@ -859,28 +860,40 @@ game.import('character',function(lib,game,ui,get,ai,_status){ }, liji:{ enable:'phaseUse', + audio:2, filter:function(event,player){ return (player.getStat().skill.liji||0)<(event.liji_num||0); }, onChooseToUse:function(event){ if(game.online) return var num=0; + var evt2=event.getParent(); + if(!evt2.liji_all) evt2.liji_all=(game.players.length>4?8:4); game.getGlobalHistory('cardMove',function(evt){ if(evt.name=='cardsDiscard'||(evt.name=='lose'&&evt.position==ui.discardPile)) num+=evt.cards.length; }); - event.set('liji_num',Math.floor(num/(game.players.length>4?8:4))); + event.set('liji_num',Math.floor(num/evt2.liji_all)); }, filterCard:true, position:'he', check:function(card){ var val=get.value(card); - if(!_status.event.player.getStorage('fenyin_mark').contains(get.suit(card))) return 12-val; + if(!_status.event.player.getStorage('refenyin_mark').contains(get.suit(card))) return 12-val; return 8-val; }, filterTarget:lib.filter.notMe, content:function(){ target.damage('nocard'); }, + ai:{ + order:1, + result:{ + target:-1.5 + }, + tag:{ + damage:1 + }, + }, }, //文鸯 xinlvli:{ diff --git a/character/xinghuoliaoyuan.js b/character/xinghuoliaoyuan.js index f0babf26b..a756a4930 100755 --- a/character/xinghuoliaoyuan.js +++ b/character/xinghuoliaoyuan.js @@ -447,7 +447,7 @@ game.import('character',function(lib,game,ui,get,ai,_status){ filter:function (event,player){ if(player.isHealthy()||player.countCards('e')!=player.hp) return false; var evt=event.getl(player); - if(event.name=='equip') return !evt||evt.cards.length!=1; + if(event.name=='equip'&&event.player==player) return !evt||evt.cards.length!=1; return evt&&evt.es.length; }, frequent:true, diff --git a/game/asset.js b/game/asset.js index 418fbe79f..e6aecf167 100644 --- a/game/asset.js +++ b/game/asset.js @@ -1,5 +1,5 @@ window.noname_asset_list=[ - 'v1.9.105.3', + 'v1.9.105.4', 'audio/background/aozhan_chaoming.mp3', 'audio/background/aozhan_online.mp3', 'audio/background/aozhan_rewrite.mp3', @@ -625,6 +625,7 @@ window.noname_asset_list=[ 'audio/die/simazhao.mp3', 'audio/die/sunqian.mp3', 'audio/die/wuxian.mp3', + 'audio/die/re_liuzan.mp3', 'audio/skill/anguo1.mp3', 'audio/skill/anguo2.mp3', @@ -2751,6 +2752,10 @@ window.noname_asset_list=[ 'audio/skill/sbaiyin2.mp3', 'audio/skill/wansha_shen_simayi1.mp3', 'audio/skill/wansha_shen_simayi2.mp3', + 'audio/skill/liji1.mp3', + 'audio/skill/liji2.mp3', + 'audio/skill/refenyin1.mp3', + 'audio/skill/refenyin2.mp3', 'font/huangcao.ttf', 'font/shousha.ttf', @@ -3380,6 +3385,7 @@ window.noname_asset_list=[ 'image/character/xin_gongsunzan.jpg', 'image/character/xin_liaohua.jpg', 'image/character/key_godan.jpg', + 'image/character/shen_diaochan.jpg', 'image/character/baiwuchang.jpg', 'image/character/baosanniang.jpg', diff --git a/game/game.js b/game/game.js index aa02597aa..63e02f304 100644 --- a/game/game.js +++ b/game/game.js @@ -10895,7 +10895,7 @@ return false; } if(info.direct&&player.isUnderControl()){ - game.modeSwapPlayer(player); + game.swapPlayerAuto(player); event._result={bool:true}; event._direct=true; } @@ -21055,12 +21055,14 @@ } }, isUnderControl:function(self,me){ - me=me||game.me; - if(this.isMad()) return false; + me=(me||game.me); + var that=this._trueMe||this; + if(that.isMad()||game.notMe) return false; if(this===me){ if(self) return true; return false; } + if(that===me||this==me._trueMe) return true; if(_status.connectMode) return false; if(lib.config.mode=='versus'){ if(_status.mode=='three') return this.side==me.side; @@ -23639,7 +23641,7 @@ delete this.filterCard2; }, isMine:function(){ - return (this.player&&this.player==game.me&&!_status.auto&&!this.player.isMad()); + return (this.player&&this.player==game.me&&!_status.auto&&!this.player.isMad()&&!game.notMe); }, isOnline:function(){ return (this.player&&this.player.isOnline()); @@ -24892,7 +24894,7 @@ return true; }, content:function(){ - game.modeSwapPlayer(player); + game.swapPlayerAuto(player); }, }, dualside:{ @@ -30174,6 +30176,7 @@ }, over:function(result){ if(_status.over) return; + if(game.me._trueMe) game.swapPlayer(game.me._trueMe); var i,j,k,num,table,tr,td,dialog; _status.over=true; ui.control.show(); @@ -38705,7 +38708,7 @@ editnode.classList.add('disabled'); delnode.innerHTML='取消'; delete delnode.button; - container.code='skill={\n \n}\n\n\/*\n示例:\nskill={\n trigger:{player:"phaseJieshuBegin"},\n frequent:true,\n content:function(){\n player.draw()\n }\n}\n此例为闭月代码\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/'; + container.code='skill={\n \n}\n\n\/*\n示例:\nskill={\n trigger:{player:"phaseJieshuBegin"},\n frequent:true,\n content:function(){\n player.draw()\n }\n}\n此例为闭月代码\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/'; if(page.fromchar=='add'){ page.fromchar=true; } @@ -38806,7 +38809,7 @@ }; var saveConfig=ui.create.div('.editbutton','保存',editorpage,saveInput); var editor=ui.create.div(editorpage); - container.code='skill={\n \n}\n\n\/*\n示例:\nskill={\n trigger:{player:"phaseJieshuBegin"},\n frequent:true,\n content:function(){\n player.draw()\n }\n}\n此例为闭月代码\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/'; + container.code='skill={\n \n}\n\n\/*\n示例:\nskill={\n trigger:{player:"phaseJieshuBegin"},\n frequent:true,\n content:function(){\n player.draw()\n }\n}\n此例为闭月代码\n导出时本段代码中的换行、缩进以及注释将被清除\n*\/'; var citebutton=document.createElement('button'); citebutton.innerHTML='引用代码'; @@ -40461,8 +40464,10 @@ row1.hide(); row2.hide(); } - if(lib.config.mode=='identity'||lib.config.mode=='guozhan'){ - if(!game.phaseNumber||_status.qianlidanji){ + if(lib.config.mode=='identity'||lib.config.mode=='guozhan'||lib.config.mode=='doudizhu'){ + if(game.notMe||(game.me&&(game.me._trueMe||game.hasPlayer(function(current){ + return current._trueMe==game.me; + })))||!game.phaseNumber||_status.qianlidanji){ nodereplace.classList.add('unselectable'); } else if(_status.event.isMine()&&ui.auto.classList.contains('hidden')){ @@ -46702,6 +46707,7 @@ } } else{ + if(game.notMe) return; ui.control.show(); _status.auto=false; ui.auto.classList.remove('glow'); @@ -50932,6 +50938,8 @@ }, attitude:function(from,to){ if(!from||!to) return 0; + from=from._trueMe||from; + arguments[0]=from; var att=get.rawAttitude.apply(this,arguments); if(from.isMad()) att=-att; if(to.isMad()&&att>0){ diff --git a/game/update.js b/game/update.js index 20b84e750..90c633992 100644 --- a/game/update.js +++ b/game/update.js @@ -1,51 +1,50 @@ window.noname_update={ - version:'1.9.105.3', - update:'1.9.105.2', + version:'1.9.105.4', + update:'1.9.105.3', changeLog:[ - '新留赞插画', - 'getl机制', + '神貂蝉(单机身份/斗地主限定)', 'bug修复', ], files:[ - 'card/extra.js', + //'card/extra.js', //'card/huanlekapai.js', //'card/sp.js', - 'card/standard.js', + //'card/standard.js', //'card/swd.js', //'card/mtg.js', //'card/gujian.js', - 'card/guozhan.js', + //'card/guozhan.js', //'card/gwent.js', //'card/yunchou.js', //'card/zhenfa.js', - 'card/zhulu.js', + //'card/zhulu.js', 'character/diy.js', 'character/extra.js', //'character/hearth.js', //'character/gujian.js', //'character/gwent.js', //'character/hearth.js', - 'character/mobile.js', + //'character/mobile.js', //'character/mtg.js', //'character/old.js', 'character/refresh.js', - 'character/shenhua.js', - 'character/sp.js', + //'character/shenhua.js', + //'character/sp.js', 'character/sp2.js', - 'character/tw.js', - 'character/standard.js', + //'character/tw.js', + //'character/standard.js', //'character/swd.js', //'character/xianjian.js', 'character/xinghuoliaoyuan.js', - 'character/yijiang.js', + //'character/yijiang.js', //'character/yxs.js', //'extension/boss/extension.js', //'layout/default/layout.css', //'layout/nova/layout.css', - //'mode/identity.js', - //'mode/doudizhu.js', - 'mode/guozhan.js', + 'mode/identity.js', + 'mode/doudizhu.js', + //'mode/guozhan.js', //'mode/chess.js', //'mode/tafang.js', //'mode/single.js', diff --git a/image/character/shen_diaochan.jpg b/image/character/shen_diaochan.jpg new file mode 100644 index 000000000..78272a62a Binary files /dev/null and b/image/character/shen_diaochan.jpg differ diff --git a/mode/doudizhu.js b/mode/doudizhu.js index 7fd6e4d40..0d93d0c92 100644 --- a/mode/doudizhu.js +++ b/mode/doudizhu.js @@ -178,9 +178,10 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } }, checkResult:function(){ + var me=game.me._trueMe||game.me; if(game.zhu.isAlive()){ if(game.players.length>1) return; - if(game.me==game.zhu){ + if(me==game.zhu){ game.over(true); } else{ @@ -188,7 +189,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } } else { - if(game.me==game.zhu){ + if(me==game.zhu){ game.over(false); } else{ diff --git a/mode/identity.js b/mode/identity.js index 85be0af29..3fb50bfd3 100644 --- a/mode/identity.js +++ b/mode/identity.js @@ -530,6 +530,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } }, checkResult:function(){ + var me=game.trueMe||game.me; if(_status.brawl&&_status.brawl.checkResult){ _status.brawl.checkResult(); return; @@ -587,9 +588,9 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ game.showIdentity(); game.over('游戏平局'); } - else if(winner2.contains(game.me)){ + else if(winner2.contains(me)){ game.showIdentity(); - if(loser2.contains(game.me)) game.over(false); + if(loser2.contains(game.trueMe||me)) game.over(false); else game.over(true); } else{ @@ -601,14 +602,14 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ } if(!game.zhu){ if(get.population('fan')==0){ - switch(game.me.identity){ + switch(me.identity){ case 'fan':game.over(false);break; case 'zhong':game.over(true);break; default:game.over();break; } } else if(get.population('zhong')==0){ - switch(game.me.identity){ + switch(me.identity){ case 'fan':game.over(true);break; case 'zhong':game.over(false);break; default:game.over();break; @@ -621,7 +622,7 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ game.zhong.identity='zhong'; } game.showIdentity(); - if(game.me.identity=='zhu'||game.me.identity=='zhong'||game.me.identity=='mingzhong'){ + if(me.identity=='zhu'||me.identity=='zhong'||me.identity=='mingzhong'){ if(game.zhu.classList.contains('dead')){ game.over(false); } @@ -629,8 +630,8 @@ game.import('mode',function(lib,game,ui,get,ai,_status){ game.over(true); } } - else if(game.me.identity=='nei'){ - if(game.players.length==1&&game.me.isAlive()){ + else if(me.identity=='nei'){ + if(game.players.length==1&&me.isAlive()){ game.over(true); } else{