diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 3db280475..5d9607ae9 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,6 +1,2 @@ -1.4.1 -game.print命令(在命令输入框中输出结果) -修正触屏问题 -修正技能bug -新布局 -素材(by @tanyuanjkl) +1.4.2 +富含bug的录像功能 diff --git a/card/extra.js b/card/extra.js index f9e717694..86b134105 100755 --- a/card/extra.js +++ b/card/extra.js @@ -19,6 +19,7 @@ card.extra={ target.addTempSkill('jiu','phaseAfter'); if(card.clone&&card.clone.parentNode==ui.arena){ card.clone.moveTo(target).delete(); + game.addVideo('gain2',target,get.cardsInfo([card])); } } }, @@ -88,6 +89,8 @@ card.extra={ }; "step 1" event.dialog=ui.create.dialog(get.translation(target.name)+'展示的手牌',result.cards); + event.videoId=lib.status.videoId++; + game.addVideo('cardDialog',null,[get.translation(target.name)+'展示的手牌',get.cardsInfo(result.cards),event.videoId]); event.card2=result.cards[0]; game.log(get.translation(target.name)+'展示了'+get.translation(event.card2)); player.chooseToDiscard(function(card){ @@ -106,6 +109,7 @@ card.extra={ else{ target.addTempSkill('huogong2','phaseBegin'); } + game.addVideo('cardDialog',null,event.videoId); event.dialog.close(); }, ai:{ diff --git a/card/hearth.js b/card/hearth.js index dcebe7ece..f597f92ec 100644 --- a/card/hearth.js +++ b/card/hearth.js @@ -180,6 +180,8 @@ card.hearth={ "step 1" event.dialog=ui.create.dialog(get.translation(target.name)+'展示的手牌',result.cards); event.card2=result.cards[0]; + event.videoId=lib.status.videoId++; + game.addVideo('cardDialog',null,[get.translation(target.name)+'展示的手牌',get.cardsInfo(result.cards),event.videoId]); game.log(get.translation(target.name)+'展示了'+get.translation(event.card2)); player.chooseToDiscard(function(card){ return get.suit(card)==get.suit(_status.event.parent.card2); @@ -197,6 +199,7 @@ card.hearth={ else{ target.addTempSkill('shandianjian2','phaseBegin'); } + game.addVideo('cardDialog',null,event.videoId); event.dialog.close(); }, ai:{ @@ -396,6 +399,7 @@ card.hearth={ event.current=targets.randomGet(); } if(!targets.length) event.finish(); + event.num=0; 'step 1' var current; if(targets.length>1){ @@ -411,7 +415,10 @@ card.hearth={ } if(hs.length>1){ event.current=current; - event.redo(); + event.num++; + if(event.num<10){ + event.redo(); + } } }, ai:{ @@ -620,7 +627,7 @@ card.hearth={ xingjiegoutong:'星界沟通', xingjiegoutong_info:'增加一点体力上限并回复一点体力,弃置你的所有手牌', tanshezhiren:'弹射之刃', - tanshezhiren_info:'弃置一名随机角色的手牌,重复此过程直到有一名角色失去最后一张手牌', + tanshezhiren_info:'弃置一名随机角色的手牌,重复此过程直到有一名角色失去最后一张手牌(最多重复10次)', chuansongmen:'传送门', chuansongmen_info:'摸一张牌,若你能立即使用之,则将此牌回手(每回合最多使用3次)', dunpaigedang:'盾牌格挡', diff --git a/card/qimou.js b/card/qimou.js index c420f2ab8..285068497 100755 --- a/card/qimou.js +++ b/card/qimou.js @@ -168,10 +168,12 @@ card.qimou={ player.gain([result.player,result.target]); result.player.clone.moveTo(player).delete(); result.target.clone.moveTo(player).delete(); + game.addVideo('gain2',player,get.cardsInfo([result.player,result.target])); } else if(!result.cancelled){ result.player.clone.delete(); result.target.clone.delete(); + game.addVideo('deletenode',player,get.cardsInfo([result.player,result.target])); } }, ai:{ diff --git a/card/standard.js b/card/standard.js index 4b1ce4783..8f48882ae 100755 --- a/card/standard.js +++ b/card/standard.js @@ -424,18 +424,36 @@ card.standard={ game.delay(); "step 1" ui.clear(); - ui.create.dialog('五谷丰登',get.cards(game.players.length),true).id='wugu'; + var cards=get.cards(game.players.length); + var dialog=ui.create.dialog('五谷丰登',cards,true); + dialog.videoId=lib.status.videoId++; + game.addVideo('cardDialog',null,['五谷丰登',get.cardsInfo(cards),dialog.videoId]); + event.parent.preResult=dialog.videoId; }, content:function(){ "step 0" - target.chooseButton(true,function(button){ - return ai.get.value(button.link,_status.event.player); - }); + for(var i=0;i1){ + var next=target.chooseButton(event.dialog,true,function(button){ + return ai.get.value(button.link,_status.event.player); + }); + next.closeDialog=false; + next.dialog.style.display=''; + } + else{ + event.directButton=event.dialog.buttons[0]; + } "step 1" - var dialog; - if(ui.dialog.id=='wugu') dialog=ui.dialog; - else dialog=document.getElementById('wugu'); - var button=result.buttons[0]; + var dialog=event.dialog; + var button=event.directButton||result.buttons[0]; if(button.link){ target.gain(button.link); target.$gain2(button.link); @@ -444,12 +462,18 @@ card.standard={ button.getElementsByClassName('info')[0].innerHTML=get.translation(target.name); dialog.content.firstChild.innerHTML= get.translation(target)+'选择了'+get.translation(button.link); + game.addVideo('dialogCapt',null,[dialog.videoId,dialog.content.firstChild.innerHTML]); game.log(get.translation(target)+'选择了'+get.translation(button.link)); game.delay(); }, contentAfter:function(){ - if(ui.dialog.id=='wugu') ui.dialog.close(); - else document.getElementById('wugu').close(); + for(var i=0;i=0) return 0; if(target.hasSkillTag('maixie')&&target.hp>1&&ui.selected.cards.length){ return 0; } @@ -323,6 +324,7 @@ card.yibao={ clone.style.transition='all 0.5s'; clone.style.webkitTransform='scale(1.2)'; clone.delete(); + game.addVideo('deletenode',player,get.cardsInfo([clone])); } target.loseHp(); } diff --git a/character/extra.js b/character/extra.js index 25bed1207..3d7f863c2 100755 --- a/character/extra.js +++ b/character/extra.js @@ -39,9 +39,11 @@ character.extra={ }, init:function(player){ player.storage.baonu=2; + game.addVideo('storage',player,['baonu',player.storage.baonu]); }, content:function(){ player.storage.baonu+=trigger.num; + game.addVideo('storage',player,['baonu',player.storage.baonu]); }, intro:{ content:'mark' @@ -142,9 +144,11 @@ character.extra={ }, init:function(player){ player.storage.renjie=0; + game.addVideo('storage',player,['renjie',player.storage.renjie]); }, content:function(){ player.storage.renjie+=trigger.num; + game.addVideo('storage',player,['renjie',player.storage.renjie]); }, intro:{ content:'mark' @@ -186,6 +190,7 @@ character.extra={ }, content:function(){ player.storage.renjie+=trigger.cards.length; + game.addVideo('storage',player,['renjie',player.storage.renjie]); } }, sbaiyin:{ @@ -239,7 +244,10 @@ character.extra={ if(result.bool){ player.logSkill('jilue_guicai'); player.storage.renjie--; - if(trigger.player.judging.clone) trigger.player.judging.clone.delete(); + if(trigger.player.judging.clone){ + trigger.player.judging.clone.delete(); + game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging.clone])); + } ui.discardPile.appendChild(trigger.player.judging); trigger.player.judging=result.cards[0]; trigger.position.appendChild(result.cards[0]); @@ -504,12 +512,16 @@ character.extra={ "step 0" player.gain(get.cards(7))._triggered=null; "step 1" + if(player==game.me){ + game.addVideo('delay',null); + } player.chooseCard('选择七张牌作为星',7,true).ai=function(card){ return ai.get.value(card); }; "step 2" player.lose(result.cards,ui.special)._triggered=null; player.storage.qixing=result.cards; + game.addVideo('storage',player,['qixing',get.cardsInfo(player.storage.qixing),'cards']); }, mark:true, intro:{ @@ -550,6 +562,7 @@ character.extra={ player.logSkill('qixing'); player.lose(result.cards,ui.special)._triggered=null; player.storage.qixing=player.storage.qixing.concat(result.cards); + game.addVideo('storage',player,['qixing',get.cardsInfo(player.storage.qixing),'cards']); event.num=result.cards.length; } else{ @@ -570,6 +583,7 @@ character.extra={ for(var i=0;i1){ player.storage.shahun--; + game.addVideo('storage',player,['shahun',player.storage.shahun]); } else{ player.die(); @@ -680,6 +682,7 @@ character.gujian={ content:function(){ player.storage.xuanning=3; player.markSkill('xuanning'); + game.addVideo('storage',player,['xuanning',player.storage.xuanning]); }, ai:{ result:{ @@ -710,6 +713,7 @@ character.gujian={ if(!player.storage.xuanning){ player.unmarkSkill('xuanning'); } + game.addVideo('storage',player,['xuanning',player.storage.xuanning]); } }, liuguang:{ @@ -735,6 +739,7 @@ character.gujian={ event.targets=result.targets.slice(0); event.targets.sort(lib.sort.seat); player.logSkill('liuguang',result.targets); + game.addVideo('storage',player,['xuanning',player.storage.xuanning]); } else{ event.finish(); @@ -780,6 +785,7 @@ character.gujian={ content:function(){ player.storage.yangming2=2; player.addSkill('yangming2'); + game.addVideo('storage',player,['yangming2',player.storage.yangming2]); }, check:function(card){ return 6-ai.get.value(card); @@ -798,6 +804,7 @@ character.gujian={ content:function(){ "step 0" player.storage.yangming2--; + game.addVideo('storage',player,['yangming2',player.storage.yangming2]); if(player.storage.yangming2>0){ event.finish(); } @@ -839,6 +846,7 @@ character.gujian={ forbid:['infinity'], init:function(player){ player.storage.zhaolu=Math.min(5,game.players.length); + game.addVideo('storage',player,['zhaolu',player.storage.zhaolu]); }, trigger:{player:['phaseEnd','damageEnd'],global:'dieAfter'}, forced:true, @@ -852,6 +860,7 @@ character.gujian={ player.loseMaxHp(true); player.storage.zhaolu=Math.min(5,game.players.length); } + game.addVideo('storage',player,['zhaolu',player.storage.zhaolu]); }, intro:{ content:'turn' @@ -875,6 +884,7 @@ character.gujian={ intro:{ content:'limited' }, + // mark:true, line:'fire', filterTarget:function(card,player,target){ return player!=target; @@ -885,6 +895,7 @@ character.gujian={ player.storage.jiehuo2=player.maxHp; player.addSkill('jiehuo2'); } + player.storage.jiehuo=true; target.damage(Math.min(target.hp,player.storage.jiehuo2),'fire'); } }, diff --git a/character/hearth.js b/character/hearth.js index 6669b7345..6c3d5f701 100755 --- a/character/hearth.js +++ b/character/hearth.js @@ -72,6 +72,7 @@ character.hearth={ mark:true, init:function(player){ player.storage.chongsheng=0; + game.addVideo('storage',player,['chongsheng',player.storage.chongsheng]); }, filter:function(event,player){ if(event.type!='dying') return false; @@ -88,6 +89,7 @@ character.hearth={ } if(player.classList.contains('linked')) player.link(); if(player.classList.contains('turnedover')) player.turnOver(); + game.addVideo('storage',player,['chongsheng',player.storage.chongsheng]); }, ai:{ skillTagFilter:function(player){ @@ -104,7 +106,7 @@ character.hearth={ }, intro:{ content:function(storage){ - return '剩余'+get.cnNumber(3-storage)+'次'; + return '剩余'+get.cnNumber(2-storage)+'次'; } } }, @@ -122,6 +124,7 @@ character.hearth={ player.draw(num); player.addSkill('guozai2'); player.storage.guozai2+=num; + game.addVideo('storage',player,['guozai2',player.storage.guozai2]); }, ai:{ order:1, @@ -174,7 +177,7 @@ character.hearth={ trigger:{global:'dieAfter'}, forced:true, filter:function(event,player){ - return event.player.skills.contains('bingshi'); + return event.player.skills.contains('bingshi')&&event.player.isDead(); }, content:function(){ trigger.player.line(player,'thunder'); @@ -198,6 +201,11 @@ character.hearth={ name:'唤雾', content:'已发动' }); + game.addVideo('mark',target,{ + name:'唤雾', + content:'已发动', + id:'huanwu' + }); }, ai:{ threaten:1.2, @@ -805,6 +813,7 @@ character.hearth={ content:function(){ player.storage.bingjia=cards[0]; player.addSkill('bingjia2'); + game.addVideo('storage',player,['bingjia',get.cardInfo(cards[0]),'card']); }, ai:{ order:1, @@ -828,6 +837,7 @@ character.hearth={ delete player.storage.bingjia; player.changeHujia(); player.removeSkill('bingjia2'); + game.addVideo('storage',player,['bingjia',null]); }, intro:{ mark:function(dialog,content,player){ @@ -913,6 +923,7 @@ character.hearth={ target.storage.mdzhoufu2=cards[0]; target.addSkill('mdzhoufu2'); target.storage.mdzhoufu3=player; + game.addVideo('storage',target,['mdzhoufu2',get.cardInfo(cards[0]),'card']); ui.special.appendChild(cards[0]); }, check:function(card){ @@ -1132,6 +1143,7 @@ character.hearth={ trigger.player.$gain2(trigger.cards); trigger.player.gain(trigger.cards); trigger.player.storage.mengun2=trigger.cards[0]; + game.addVideo('storage',player,['mengun2',get.cardInfo(trigger.cards[0]),'card']); trigger.player.addTempSkill('mengun2','phaseEnd'); } }, @@ -1865,7 +1877,7 @@ character.hearth={ zhongjia:'重甲', zhongjia_info:'锁定技,每当你受到一次伤害,你获得一点护甲值;当你的体力值大于1时,你的护甲不为你抵挡伤害', dunji:'盾击', - dunji_info:'出牌阶段限,你可以失去你的所有护甲,并对等量的其他角色各造成一点伤害', + dunji_info:'出牌阶段,你可以失去你的所有护甲,并对等量的其他角色各造成一点伤害', qiaodong:'巧动', qiaodong_info:'你可以将一张装备牌当作闪使用或打出', fengxian:'奉献', diff --git a/character/jiange.js b/character/jiange.js index 72e483d34..ef5043839 100755 --- a/character/jiange.js +++ b/character/jiange.js @@ -411,7 +411,7 @@ character.jiange={ event.cards2.push(event.cards[i]); } } - if(!event.isMine()){ + if(!event.isMine()||event.cards2.length==0){ player.showCards(event.cards); } "step 1" diff --git a/character/mountain.js b/character/mountain.js index 97483f46d..f13579c34 100755 --- a/character/mountain.js +++ b/character/mountain.js @@ -145,6 +145,12 @@ character.mountain={ name:'放权', content:'进行一个额外的回合' }); + game.addVideo('markCharacter',target,{ + name:'放权', + content:'进行一个额外的回合', + id:'fangquan', + target:player.dataset.position + }); target.phase(); target.addSkill('fangquan3'); player.removeSkill('fangquan2'); @@ -159,6 +165,7 @@ character.mountain={ if(player.marks.fangquan){ player.marks.fangquan.delete(); delete player.marks.fangquan; + game.addVideo('unmark',player,'fangquan'); } player.removeSkill('fangquan3'); } @@ -452,7 +459,9 @@ character.mountain={ result.card.goto(ui.special); player.storage.tuntian.push(result.card); result.node.moveTo(player).delete(); + game.addVideo('gain2',player,get.cardsInfo([result.node])); player.markSkill('tuntian'); + game.addVideo('storage',player,['tuntian',get.cardsInfo(player.storage.tuntian),'cards']); } }, init:function(player){ @@ -519,6 +528,7 @@ character.mountain={ var card=result.buttons[0].link; event.card=card; player.storage.tuntian.remove(card); + game.addVideo('storage',player,['tuntian',get.cardsInfo(player.storage.tuntian),'cards']); if(!player.storage.tuntian.length){ player.unmarkSkill('tuntian'); } diff --git a/character/rank.js b/character/rank.js index 0f2df2e0d..95fefaa90 100644 --- a/character/rank.js +++ b/character/rank.js @@ -5,7 +5,6 @@ window.characterRank={ 'swd_septem', 'hs_sthrall', 'hs_malorne', - 'swd_yuwentuo', 'swd_duguningke', 'swd_guyue', 'swd_murongshi', @@ -18,6 +17,7 @@ window.characterRank={ ], ap:[ 'swd_xuanyuanjianxian', + 'swd_yuwentuo', 'pal_xuanxiao', 'xk_fujianhan', 'swd_cheyun', diff --git a/character/refresh.js b/character/refresh.js index 74594404a..3291cf922 100755 --- a/character/refresh.js +++ b/character/refresh.js @@ -119,7 +119,10 @@ character.refresh={ "step 2" if(result.bool){ player.logSkill('reguicai'); - if(trigger.player.judging.clone) trigger.player.judging.clone.delete(); + if(trigger.player.judging.clone){ + trigger.player.judging.clone.delete(); + game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging.clone])); + } ui.discardPile.appendChild(trigger.player.judging); trigger.player.judging=result.cards[0]; game.delay(2); @@ -393,6 +396,7 @@ character.refresh={ }, content:function(){ player.storage.reqianxun2=player.storage.reqianxun2.concat(player.get('h')); + game.addVideo('storage',player,['reqianxun2',get.cardsInfo(player.storage.reqianxun2),'cards']); player.lose(player.get('h'),ui.special); player.addSkill('reqianxun2'); }, @@ -409,6 +413,7 @@ character.refresh={ player.gain(player.storage.reqianxun2); player.removeSkill('reqianxun2'); player.storage.reqianxun2=[]; + game.addVideo('storage',player,['reqianxun2',get.cardsInfo(player.storage.reqianxun2),'cards']); }, mark:true, intro:{ @@ -496,6 +501,7 @@ character.refresh={ silent:true, content:function(){ player.storage.retishen2=player.hp; + game.addVideo('storage',player,['retishen2',player.storage.retishen2]); }, intro:{ content:function(storage,player){ @@ -515,6 +521,7 @@ character.refresh={ "step 0" event.card=get.cards()[0]; event.node=event.card.copy('thrown','center',ui.arena).animate('start'); + game.addVideo('centernode',null,get.cardInfo(event.card)); if(get.type(event.card,'trick')==get.type(trigger.card,'trick')){ player.chooseTarget('选择获得此牌的角色').ai=function(target){ var att=ai.get.attitude(player,target); @@ -539,15 +546,18 @@ character.refresh={ game.log(get.translation(player)+'展示并弃掉了'+get.translation(event.card)); ui.discardPile.appendChild(event.card); } + game.addVideo('deletenode',player,[get.cardInfo(event.node)]); } else if(result.targets){ result.targets[0].gain(event.card); event.node.moveTo(result.targets[0]); game.log(get.translation(result.targets[0])+'获得了'+get.translation(event.card)); + game.addVideo('gain2',result.targets[0],[get.cardInfo(event.node)]); } else{ game.log(get.translation(player)+'展示并弃掉了'+get.translation(event.card)); ui.discardPile.appendChild(event.card); + game.addVideo('deletenode',player,[get.cardInfo(event.node)]); } event.node.delete(); }, @@ -636,6 +646,7 @@ character.refresh={ result.targets[0].storage.reyiji2=result.cards; } player.$give(result.cards.length,result.targets[0]); + game.addVideo('storage',result.targets[0],['reyiji2',get.cardsInfo(result.targets[0].storage.reyiji2),'cards']); if(num==1){ event.temp=result.targets[0]; event.num++; diff --git a/character/sp.js b/character/sp.js index a9c716f08..304e7ed0e 100755 --- a/character/sp.js +++ b/character/sp.js @@ -394,6 +394,7 @@ character.sp={ content:function(){ "step 0" player.storage.zuixiang=get.cards(3); + game.addVideo('storage',player,['zuixiang',get.cardsInfo(player.storage.zuixiang),'cards']); player.showCards(player.storage.zuixiang); "step 1" var cards=player.storage.zuixiang; @@ -402,6 +403,7 @@ character.sp={ cards[2].number==cards[1].number){ player.gain(player.storage.zuixiang,'draw2'); player.storage.zuixiang=[]; + player.unmarkSkill('zuixiang'); delete player.storage.zuixiang2; } else{ @@ -447,7 +449,7 @@ character.sp={ zuixiang2:{ unique:true, trigger:{player:'phaseBegin'}, - priority:10, + priority:9.5, filter:function(event,player){ if(player.storage.zuixiang&&player.storage.zuixiang.length) return true; return false; @@ -465,6 +467,7 @@ character.sp={ ui.discardPile.appendChild(player.storage.zuixiang[i]); } player.storage.zuixiang=get.cards(3); + game.addVideo('storage',player,['zuixiang',get.cardsInfo(player.storage.zuixiang),'cards']); player.showCards(player.storage.zuixiang); } "step 1" @@ -615,6 +618,7 @@ character.sp={ target.addSkill('zhoufu2'); target.storage.zhoufu3=player; ui.special.appendChild(cards[0]); + game.addVideo('storage',target,['zhoufu2',get.cardInfo(cards[0]),'card']); }, check:function(card){ return 3-ai.get.value(card) @@ -661,7 +665,7 @@ character.sp={ trigger:{player:'phaseEnd'}, forced:true, content:function(){ - player.unmark(player.storage.zhoufu2); + player.unmark(player.storage.zhoufu2.name); if(player.storage.zhoufu3.isAlive()){ player.storage.zhoufu3.gain(player.storage.zhoufu2); player.$give(player.storage.zhoufu2,player.storage.zhoufu3); @@ -1289,6 +1293,12 @@ character.sp={ name:'存嗣', content:'$
【勇决】
每当其他角色于回合内使用一张杀,若目标不是你,你可以获得之(每回合最多能以此法获得一张杀)
' }) + game.addVideo('markCharacter',target,{ + name:'存嗣', + content:'$
【勇决】
每当其他角色于回合内使用一张杀,若目标不是你,你可以获得之(每回合最多能以此法获得一张杀)', + id:'yongjue', + target:player.dataset.position + }); "step 1" player.turnOver(); player.removeSkill('guixiu'); @@ -2003,7 +2013,10 @@ character.sp={ } "step 2" if(result.bool){ - if(trigger.player.judging.clone) trigger.player.judging.clone.delete(); + if(trigger.player.judging.clone){ + trigger.player.judging.clone.delete(); + game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging.clone])); + } ui.discardPile.appendChild(trigger.player.judging); trigger.player.judging=event.card; game.delay(2); @@ -2246,6 +2259,11 @@ character.sp={ name:'颂词', content:'已发动' }); + game.addVideo('mark',target,{ + name:'颂词', + content:'已发动', + id:'songci' + }); }, ai:{ order:7, diff --git a/character/standard.js b/character/standard.js index 55813101e..acd8dbf4b 100755 --- a/character/standard.js +++ b/character/standard.js @@ -169,7 +169,10 @@ character.standard={ "step 2" if(result.bool){ player.logSkill('guicai'); - if(trigger.player.judging.clone) trigger.player.judging.clone.delete(); + if(trigger.player.judging.clone){ + trigger.player.judging.clone.delete(); + game.addVideo('deletenode',player,get.cardsInfo([trigger.player.judging.clone])); + } ui.discardPile.appendChild(trigger.player.judging); trigger.player.judging=result.cards[0]; trigger.position.appendChild(result.cards[0]); diff --git a/character/swd.js b/character/swd.js index c2483def0..92b7ff861 100755 --- a/character/swd.js +++ b/character/swd.js @@ -1422,6 +1422,7 @@ character.swd={ player.addTempSkill('hutian4','phaseAfter'); target.addSkill('hutian2'); target.storage.hutian2=result.cards; + game.addVideo('storage',target,['hutian2',get.cardsInfo(result.cards),'cards']); } else{ event.finish(); @@ -1561,6 +1562,12 @@ character.swd={ } player.additionalSkills.huanxing=list; player.markCharacter(name,null,true,true); + game.addVideo('markCharacter',player,{ + name:'幻形', + content:'', + id:'huanxing', + target:name + }); player.storage.huanxing=name; } }, @@ -1790,6 +1797,7 @@ character.swd={ if(player.storage.pozhou){ player.markSkill('pozhou'); } + game.addVideo('storage',player,['pozhou',player.storage.pozhou]); }, intro:{ content:'mark' @@ -3408,6 +3416,42 @@ character.swd={ kunlunjing:{ unique:true, group:['kunlunjing1','kunlunjing2'], + video:function(player,data){ + if(data){ + for(var i in data){ + var current=game.playerMap[i]; + current.node.handcards1.innerHTML=''; + current.node.handcards2.innerHTML=''; + current.node.equips.innerHTML=''; + current.node.judges.innerHTML=''; + current.directgain(get.infoCards(data[i].h)); + var es=get.infoCards(data[i].e); + for(var j=0;j2; + if(player.hp==2) return num>4; return num>Math.min(3,game.players.length); }, content:function(){ @@ -3484,10 +3530,12 @@ character.swd={ game.delay(0.5); "step 1" event.player.storage.kunlunjing2=true; - ui.arena.classList.add('zoomout3'); - ui.arena.delete(); - ui.arena.hide(); + ui.window.style.transition='all 0.5s'; + ui.window.classList.add('zoomout3'); + ui.window.delete(); + ui.window.hide(); game.delay(0,500); + game.addVideo('skill',event.player,'kunlunjing'); "step 2" var storage=event.player.storage.kunlunjing; var player,frag; @@ -3537,15 +3585,35 @@ character.swd={ } } game.delay(0,100); - ui.arena.classList.remove('zoomout3'); - ui.arena.classList.add('zoomin3'); - ui.window.appendChild(ui.arena); + ui.window.classList.remove('zoomout3'); + ui.window.classList.add('zoomin3'); + document.body.appendChild(ui.window); + var data={}; + for(var i=0;i0){ + num-=game.players[i].num('he')-2; + } + else if(att<0){ + num+=game.players[i].num('he')-2; + } + } + if(player.hp==1) return num-1; + return num-game.players.length/2; + } + } + } + }, ningjian:{ group:['ningjian1','ningjian2'], ai:{ @@ -5292,6 +5410,12 @@ character.swd={ name:get.translation(link), content:lib.translate[link+'_info'] }); + game.addVideo('markCharacter',player,{ + name:'get.translation(link)', + content:lib.translate[link+'_info'], + id:'tianshu', + target:target.name + }); player.storage.tianshu=target.name; player.checkMarks(); player.addTempSkill('tianshu_ai','phaseAfter'); @@ -5389,6 +5513,12 @@ character.swd={ name:get.translation(link), content:lib.translate[link+'_info'] }); + game.addVideo('markCharacter',player,{ + name:'get.translation(link)', + content:lib.translate[link+'_info'], + id:'tianshu', + target:target.name + }); player.storage.tianshu=target.name; player.checkMarks(); player.popup(link); @@ -7003,6 +7133,7 @@ character.swd={ "step 1" ui.auto.show(); player.storage.mailun=event.choice; + game.addVideo('storage',player,['mailun',player.storage.mailun]); if(event.choice){ player.logSkill('mailun'); player.markSkill('mailun'); @@ -7314,12 +7445,14 @@ character.swd={ discard:false, prepare:function(cards,player,targets){ player.$give(cards,targets[0]); + player.line(targets[0],'green'); }, content:function(){ "step 0" game.delay(); "step 1" target.storage.zhenjiu2=cards[0]; + game.addVideo('storage',target,['zhenjiu2',get.cardInfo(target.storage.zhenjiu2),'card']); target.addSkill('zhenjiu2'); }, ai:{ @@ -7364,6 +7497,7 @@ character.swd={ discard:false, prepare:function(cards,player,targets){ player.$give(cards,targets[0]); + player.line(targets[0],'green'); }, content:function(){ "step 0" @@ -7371,6 +7505,7 @@ character.swd={ "step 1" target.storage.mazui2=cards[0]; target.addSkill('mazui2'); + game.addVideo('storage',target,['mazui2',get.cardInfo(target.storage.mazui2),'card']); }, ai:{ expose:0.2, @@ -7644,6 +7779,9 @@ character.swd={ swd_lanmoshen:'蓝魔神', swd_wushi:'巫师', + jingjie:'镜界', + jingjie_info:'回合开始阶段,你可以流失一点体力,并', + jingjie_old_info:'限定技,出牌阶段,你可以令所有角色弃置所有牌,然后摸两张牌(不触发任何技能)', kongmo:'恐魔', kongmo_info:'锁定技,你使用基本牌或非延时锦囊牌后将额外结算一次卡牌效果', miaobi:'妙笔', @@ -7992,7 +8130,7 @@ character.swd={ shengshou_info:'你可以将一张黑色手牌当作草药使用', susheng_info:'在任意一名角色即将死亡时,你可以弃置一张手牌防止其死亡,并将其体力回复至1,每回合限发动一次', zhanlu_info:'出牌阶段,你可以弃置一张黑桃牌令至多3名角色各回复一点体力', - kunlunjing_info:'回合开始前,你可以令场上所有牌还原到你上一回合结束时的位置,然后流失一点体力', + kunlunjing_info:'回合开始前,你可以令场上所有牌还原到你上一回合结束时的位置,此时有其他角色的体力值比你少,你流失一点体力', swd_xiuluo_info:'回合开始阶段,你可以弃一张手牌来弃置你判断区里的一张延时类锦囊(必须花色相同)', xianyin_info:'出牌阶段,你可以令所有判定区内有牌的角色弃置判定区内的牌,然后交给你一张手牌', qiaoxie_info:'每当你装备一张牌,可摸一张牌,每当你失去一张装备牌(不含替换),你可以弃置其他角色的一张牌', diff --git a/character/wind.js b/character/wind.js index 809851531..9cb3bb8c8 100755 --- a/character/wind.js +++ b/character/wind.js @@ -221,16 +221,15 @@ character.wind={ event.card=get.cards()[0]; if(player.storage.buqu==undefined) player.storage.buqu=[]; player.storage.buqu.push(event.card); - event.dialog=ui.create.dialog('不屈',player.storage.buqu); + game.addVideo('storage',player,['buqu',get.cardsInfo(player.storage.buqu),'cards']); var str=get.translation(player)+'的不屈牌为'+player.storage.buqu[0].number; for(var i=1;i
【追思】
锁定技,回合结束阶段,你摸一张牌
' }); + game.addVideo('markCharacter',target,{ + name:'长念', + content:'$
【追思】
锁定技,回合结束阶段,你摸一张牌
', + id:'changnian', + target:player.dataset.position + }); } }, ai:{ @@ -617,10 +627,13 @@ character.xianjian={ if(player.storage.shuangren){ player.unmark(player.storage.shuangren,'shuangren'); player.discard(player.storage.shuangren); + game.addVideo('unmarkId',player,[get.cardInfo(player.storage.shuangren),'shuangren']); } if(card.clone){ card.clone.moveTo(player,'flip').delete(); + game.addVideo('gain2',player,get.cardsInfo([card.clone])); player.mark(card,'shuangren'); + game.addVideo('markId',player,[get.cardInfo(card),'shuangren']); } ui.special.appendChild(card); player.storage.shuangren=card; @@ -1103,6 +1116,7 @@ character.xianjian={ var card=get.cards()[0]; target.$draw(card); target.storage.zhimeng2=card; + game.addVideo('storage',target,['zhimeng2',get.cardInfo(card),'card']); target.addSkill('zhimeng2'); event.finish(); player.logSkill('zhimeng',target); diff --git a/character/yijiang.js b/character/yijiang.js index 0940e810f..fa55399ff 100755 --- a/character/yijiang.js +++ b/character/yijiang.js @@ -465,6 +465,7 @@ character.yijiang={ result.targets[0].storage.qianxi2=event.color; result.targets[0].addSkill('qianxi2'); player.line(result.targets,'green'); + game.addVideo('storage',result.targets[0],['qianxi2',event.color]); } }, }, @@ -734,6 +735,7 @@ character.yijiang={ var card=target.get('h').randomGet(); player.showCards(card); player.storage.qiangzhi=get.type(card,'trick'); + game.addVideo('storage',player,['qiangzhi',player.storage.qiangzhi]); player.markSkill('qiangzhi'); }, intro:{ @@ -938,6 +940,7 @@ character.yijiang={ if(result.cards&&result.cards.length){ player.lose(result.cards,ui.special); player.storage.quanji=player.storage.quanji.concat(result.cards); + game.addVideo('storage',player,['quanji',get.cardsInfo(player.storage.quanji),'cards']); game.log(get.translation(player)+'将'+get.translation(result.cards)+'置于武将牌上作为“权”'); player.markSkill('quanji'); } @@ -1016,6 +1019,7 @@ character.yijiang={ if(!player.storage.quanji.length){ player.unmarkSkill('quanji'); } + game.addVideo('storage',player,['quanji',get.cardsInfo(player.storage.quanji),'cards']); "step 2" target.draw(2); "step 3" @@ -2675,20 +2679,28 @@ character.yijiang={ }, content:function(){ "step 0" - if(trigger.player!=player) event.card=trigger.player.get('h').randomGet(); - else{ - event.card=trigger.player.get('h',function(card){ - return get.type(card)!='basic'; - }).randomGet(); + if(trigger.player!=player){ + event.card=trigger.player.get('h').randomGet(); + } + else{ + player.chooseCard(true,'选择展示一张手牌').ai=function(card){ + if(get.type(card)!='basic'){ + return 10-ai.get.value(card); + } + return 0; + } + event.selfSelect=true; } - event.dialog=ui.create.dialog(get.translation(player)+'展示的手牌',[event.card]); - game.delay(2); "step 1" + if(event.selfSelect){ + event.card=result.cards[0]; + } + player.showCards([event.card],get.translation(player)+'展示的手牌'); + "step 2" if(get.type(event.card)!='basic'){ trigger.player.recover(); trigger.player.discard(event.card); } - event.dialog.close(); }, ai:{ threaten:1.4 @@ -2742,6 +2754,8 @@ character.yijiang={ event.dialog=ui.create.dialog('称象',event.cards); game.delay(2); } + game.addVideo('showCards',player,['称象',get.cardsInfo(event.cards)]); + game.addVideo('delay',null,2); "step 1" if(event.dialog) event.dialog.close(); var dialog=ui.create.dialog('称象:选择任意张点数小于13的牌',event.cards); @@ -2917,6 +2931,7 @@ character.yijiang={ if(result.bool){ player.markSkill('xiansi'); player.storage.xiansi=player.storage.xiansi.concat(result.links); + game.addVideo('storage',player,['xiansi',get.cardsInfo(player.storage.xiansi),'cards']); event.current.lose(result.links,ui.special); event.current.$give(result.links,player); event.goto(2); @@ -2977,6 +2992,7 @@ character.yijiang={ for(var i=0;i
  • 控制台命令
    开启后可用浏览器控制台控制游戏
  • 自动确认
    开启后当候选目标仅有1个时点击目标无需再点击确定
  • '+ @@ -1443,6 +1449,9 @@ lib.status.delayed=0; } }, + getUTC:function(date){ + return date.getTime(); + }, init:{ init:function(){ lib.config={}; @@ -1529,6 +1538,28 @@ ui.css.theme=lib.init.css('theme/'+lib.config.theme,'style'); lib.config.duration=500; + + if(window.indexedDB){ + var request = window.indexedDB.open(lib.configprefix+'data', 1); + request.onupgradeneeded=function(e){ + var db=e.target.result; + if(db.objectStoreNames.contains('video')){ + db.deleteObjectStore('video'); + } + db.createObjectStore('video',{keyPath:'time'}); + lib.db=db; + for(var i=0;i1){ if(!info.multitarget){ lib.tempSortSeat=player; @@ -2638,6 +2673,7 @@ next.card=card; next.cards=cards; next.player=player; + next.preResult=event.preResult; } "step 5" if(document.getElementsByClassName('thrown').length){ @@ -2883,6 +2919,12 @@ var j,sort,position; var frag1=document.createDocumentFragment(); var frag2=document.createDocumentFragment(); + var hs=player.get('h'); + for(var i=0;i0) frag1.appendChild(cards[num]); else frag2.appendChild(cards[num]); } + var addv=function(){ + if(player==game.me){ + game.addVideo('gain12',player,[get.cardsInfo(frag1.childNodes),get.cardsInfo(frag2.childNodes)]); + } + }; if(event.animate=='draw'){ player.$draw(cards.length); game.delay(1,500); setTimeout(function(){ + addv(); player.node.handcards1.insertBefore(frag1,player.node.handcards1.firstChild); player.node.handcards2.insertBefore(frag2,player.node.handcards2.firstChild); player.update(); @@ -2905,6 +2953,7 @@ player.$gain(cards); game.delay(1,700); setTimeout(function(){ + addv(); player.node.handcards1.insertBefore(frag1,player.node.handcards1.firstChild); player.node.handcards2.insertBefore(frag2,player.node.handcards2.firstChild); player.update(); @@ -2914,12 +2963,14 @@ player.$gain2(cards); game.delay(1,500); setTimeout(function(){ + addv(); player.node.handcards1.insertBefore(frag1,player.node.handcards1.firstChild); player.node.handcards2.insertBefore(frag2,player.node.handcards2.firstChild); player.update(); },500); } else{ + addv(); player.node.handcards1.insertBefore(frag1,player.node.handcards1.firstChild); player.node.handcards2.insertBefore(frag2,player.node.handcards2.firstChild); player.update(); @@ -2927,16 +2978,20 @@ }, lose:function(){ "step 0" + var hs=[],es=[],js=[]; for(var i=0;i0;i--){ if(player.node.handcards1.childNodes[i].classList.contains('removing')==false){ player.node.handcards1.childNodes[i].animate('last'); @@ -3258,6 +3315,7 @@ if(ui.auto) ui.auto.hide(); if(ui.wuxie) ui.wuxie.hide(); } + game.addVideo('diex',player); player.$die(source); }, equip:function(){ @@ -3266,6 +3324,7 @@ if(card.clone){ card.clone.moveTo(player,Math.random()<0.8?'flip':'rotate').delete(); + game.addVideo('gain2',player,get.cardsInfo([card.clone])); } player.equiping=true; @@ -3281,20 +3340,9 @@ if(lib.config.background_audio){ game.playAudio('effect',get.subtype(card)); } - var equipNum=get.equipNum(card); - var equipped=false; - for(var i=0;i=equipNum){ - player.node.equips.insertBefore(card,player.node.equips.childNodes[i]); - equipped=true; - break; - } - } - if(!equipped){ - player.node.equips.appendChild(card); - } - player.node.equips.dataset.number=player.num('e'); - game.log(get.translation(player)+'装备了'+get.translation(card)) + player.$equip(card); + game.addVideo('equip',player,get.cardInfo(card)); + game.log(get.translation(player)+'装备了'+get.translation(card)); "step 2" var info=get.info(card); if(info.onEquip&&(!info.filterEquip||info.filterEquip(card,player))){ @@ -3334,13 +3382,17 @@ else{ game.log(get.translation(player)+'被贴上了'+get.translation(cards)); } + game.addVideo('addJudge',player,[get.cardInfo(cards[0]),cards[0].viewAs]); } }, judge:function(){ "step 0" + var judgestr=get.translation(player)+'的'+event.judgestr+'判定'; + event.videoId=lib.status.videoId++; player.judging=get.cards()[0]; + game.addVideo('judge1',player,[get.cardInfo(player.judging),judgestr,event.videoId]); event.node=player.judging.copy('thrown','center',ui.arena).animate('start'); - event.dialog=ui.create.dialog(get.translation(player)+'的'+event.judgestr+'判定'); + event.dialog=ui.create.dialog(judgestr); event.dialog.classList.add('center'); game.log(get.translation(player)+'进行'+event.judgestr+'判定,亮出的判定牌为'+get.translation(player.judging)); game.delay(2); @@ -3365,12 +3417,14 @@ } if(event.clearArena!=false) ui.clear(); event.dialog.close(); + game.addVideo('judge2',null,event.videoId); game.log(get.translation(player)+'的判定结果为'+get.translation(event.result.card)); if(!get.owner(event.result.card)) event.position.appendChild(event.result.card); }, turnOver:function(){ game.log(get.translation(player)+'翻面'); player.classList.toggle('turnedover'); + game.addVideo('turnOver',player,player.classList.contains('turnedover')); }, link:function(){ if(player.isLinked()){ @@ -3383,6 +3437,7 @@ game.playAudio('effect','link'); } player.classList.toggle('linked'); + game.addVideo('link',player,player.classList.contains('linked')); }, }, @@ -3550,14 +3605,17 @@ return this; }, update:function(){ + if(_status.video&&arguments.length==0) return; if(this.hp>=this.maxHp) this.hp=this.maxHp; var hp=this.node.hp; hp.style.transition='none'; - if(this.hujia){ - this.markSkill('ghujia'); - } - else{ - this.unmarkSkill('ghujia'); + if(!_status.video){ + if(this.hujia){ + this.markSkill('ghujia'); + } + else{ + this.unmarkSkill('ghujia'); + } } if(lib.config.layout=='default'&&this.maxHp>14){ hp.innerHTML=this.hp+'/'+this.maxHp; @@ -3614,6 +3672,9 @@ hp.style.transition=''; }); var numh=this.num('h'); + if(_status.video){ + numh=arguments[0]; + } if(numh>=10){ numh=numh.toString(); this.node.count.dataset.condition='low'; @@ -3643,6 +3704,9 @@ lib.element.player.updates[i](this); } } + if(!_status.video){ + game.addVideo('update',this,[this.num('h'),this.hp,this.maxHp,this.hujia]); + } return this; }, num:function(arg1,arg2,arg3){ @@ -3667,6 +3731,7 @@ } else if(get.itemtype(target)=='player'){ if(target==this) return; + game.addVideo('line',this,[target.dataset.position,config]); game.linexy([ this.offsetLeft+this.offsetWidth/2, this.offsetTop+this.offsetHeight/2, @@ -3675,7 +3740,7 @@ ],config,true); } }, - line2:function(targets,config){ + line2:function(targets,config,init){ this.line(targets[0],config); targets=targets.slice(0); for(var i=1;i0){ @@ -4608,7 +4679,10 @@ this.node.handcards2.appendChild(cards[i].animate('start')); } } - this.update(); + if(!_status.video){ + game.addVideo('directgain',this,get.cardsInfo(cards)); + this.update(); + } return this; }, gain:function(){ @@ -4791,6 +4865,7 @@ else{ this.hp=1; } + game.addVideo('revive',this); this.classList.remove('dead'); this.removeAttribute('style'); this.update(); @@ -4995,6 +5070,7 @@ node.remove(); return node; } + game.addVideo('popup',this,[name,className]); node.dataset.position=this.dataset.position; if(this.dataset.position==0||parseInt(this.dataset.position)==parseInt(ui.arena.dataset.number)/2|| typeof name2=='number'||this.classList.contains('minskin')){ @@ -5029,6 +5105,12 @@ } }, markSkill:function(name,info,card){ + if(get.itemtype(card)=='card'){ + game.addVideo('markSkill',this,[name,get.cardInfo(card)]); + } + else{ + game.addVideo('markSkill',this,[name]); + } if(!info){ if(this.marks[name]){ return this; @@ -5054,6 +5136,7 @@ return this; }, unmarkSkill:function(name){ + game.addVideo('unmarkSkill',this,name); if(this.marks[name]){ this.marks[name].delete(); delete this.marks[name]; @@ -5138,6 +5221,7 @@ } }, unmark:function(name,info){ + game.addVideo('unmarkname',this,name); if(get.itemtype(name)=='card'){ this.unmark(name.name,info); } @@ -5290,6 +5374,7 @@ if(player.queueCount==0){ player.removeAttribute('style'); player.node.avatar.style.transform=''; + player.node.avatar2.style.transform=''; if(player==game.me) ui.me.removeAttribute('style'); } },time) @@ -5367,7 +5452,7 @@ } return null; }, - $draw:function(num){ + $draw:function(num,init){ var cards,node; if(get.itemtype(num)=='cards'){ cards=num; @@ -5377,6 +5462,14 @@ cards=[num]; num=1; } + if(init!==false){ + if(cards){ + game.addVideo('drawCard',this,get.cardsInfo(cards)); + } + else{ + game.addVideo('draw',this,num); + } + } if(cards){ cards=cards.slice(0); node=cards.shift().copy('drawing','thrown'); @@ -5394,15 +5487,16 @@ if(num&&num>1){ setTimeout(function(){ if(cards){ - that.$draw(cards) + that.$draw(cards,false) } else{ - that.$draw(num-1) + that.$draw(num-1,false) } },200); } }, $compare:function(card1,target,card2){ + game.addVideo('compare',this,[get.cardInfo(card1),target.dataset.position,get.cardInfo(card2)]); var player=this; var node1=player.$throwxy(card1, 'calc(50% - 114px)','calc(50% - 52px)' @@ -5440,10 +5534,21 @@ },200); }, - $throw:function(card,time){ + $throw:function(card,time,init){ + if(init!==false){ + if(get.itemtype(card)!='cards'){ + if(get.itemtype(card)=='card'){ + card=[card]; + } + else{ + return; + } + } + game.addVideo('throw',this,[get.cardsInfo(card),time]); + } if(get.itemtype(card)=='cards'){ for(var i=0;i=0){ + game.addVideo('give',this,[card,player.dataset.position]); + } + else{ + if(get.itemtype(card)=='card'){ + card=[card]; + } + if(get.itemtype(card)=='cards'){ + game.addVideo('giveCard',this,[get.cardsInfo(card),player.dataset.position]); + } + } + } if(get.itemtype(card)=='cards'){ if(log!=false){ var str=get.translation(player)+'从'+get.translation(this)+'获得了'+get.translation(card[0]); @@ -5487,7 +5605,7 @@ } else{ for(var i=0;i=equipNum){ + player.node.equips.insertBefore(card,player.node.equips.childNodes[i]); + equipped=true; + break; + } + } + if(!equipped){ + player.node.equips.appendChild(card); + } + player.node.equips.dataset.number=player.num('e'); + return player; + }, + $gain:function(card,log,init){ + if(init!==false){ + if(typeof card=='number'&&card>=0){ + game.addVideo('gain',this,card); + } + else{ + if(get.itemtype(card)=='card'){ + card=[card]; + } + if(get.itemtype(card)=='cards'){ + game.addVideo('gainCard',this,get.cardsInfo(card)); + } + else{ + game.addVideo('gain',this,1); + } + } + } if(get.itemtype(card)=='cards'){ if(log!=false){ var str=get.translation(this)+'获得了'+get.translation(card[0]); @@ -5557,7 +5708,7 @@ } else{ for(var i=0;i0){ num='+'+num; @@ -5739,6 +5903,12 @@ } }, $damage:function(source){ + if(get.itemtype(source)=='player'){ + game.addVideo('damage',this,source.dataset.position); + } + else{ + game.addVideo('damage',this); + } if(source&&source!=this){ var left,top; if(source.offsetTop==this.offsetTop){ @@ -5755,9 +5925,11 @@ if(lib.isMobileMe(this)){ if(this.isLinked()){ this.node.avatar.style.webkitTransform='translate('+left+'px,'+top+'px) rotate(-90deg)'; + this.node.avatar2.style.webkitTransform='translate('+left+'px,'+top+'px) rotate(-90deg)'; } else{ this.node.avatar.style.webkitTransform='translate('+left+'px,'+top+'px)'; + this.node.avatar2.style.webkitTransform='translate('+left+'px,'+top+'px)'; } } else if(this.isLinked()&&lib.isNewLayout()){ @@ -5771,9 +5943,11 @@ if(lib.isMobileMe(this)){ if(this.isLinked()){ this.node.avatar.style.webkitTransform='scale(0.9) rotate(-90deg)'; + this.node.avatar2.style.webkitTransform='scale(0.9) rotate(-90deg)'; } else{ this.node.avatar.style.webkitTransform='scale(0.9)'; + this.node.avatar2.style.webkitTransform='scale(0.9)'; } } else if(this.isLinked()&&lib.isNewLayout()){ @@ -5787,6 +5961,7 @@ }, $die:function(){ if(lib.isMobileMe(this)) return; + game.addVideo('die',this); var top0=ui.window.offsetHeight/2; var left0=ui.window.offsetWidth/2; var ratio=(left0-this.offsetLeft)/(top0-this.offsetTop); @@ -5800,6 +5975,7 @@ this.queue(false); }, $phaseJudge:function(card){ + game.addVideo('phaseJudge',this,get.cardInfo(card)); var clone=card.copy('thrown',ui.arena).animate('judgestart'); var player=this; clone.style.opacity=0.6; @@ -5923,6 +6099,9 @@ }, copy:function(){ var node=this.cloneNode(true); + node.name=this.name; + node.suit=this.suit; + node.number=this.number; node.classList.remove('hidden'); node.classList.remove('start'); node.classList.remove('thrown'); @@ -6023,6 +6202,7 @@ return (this.player&&this.player==game.me&&!_status.auto&&!this.player.isMad()); }, trigger:function(name){ + if(_status.video) return; var event=this; var i,j,iwhile,next,add; var totalPopulation=game.players.length+game.dead.length+1; @@ -6552,7 +6732,7 @@ default:num=0;break; } if(num&&!_status.identityShown&&game.phaseNumber>game.players.length*num&&game.showIdentity){ - player.popup('显示身份'); + if(!_status.video) player.popup('显示身份'); _status.identityShown=true; game.showIdentity(false); } @@ -6801,6 +6981,716 @@ ui.backgroundMusic.src='audio/background/'+music+'.mp3'; } }, + export:function(textToWrite,name){ + var textFileAsBlob = new Blob([textToWrite], {type:'text/plain'}); + var fileNameToSaveAs = name||'noname'; + + var downloadLink = document.createElement("a"); + downloadLink.download = fileNameToSaveAs; + downloadLink.innerHTML = "Download File"; + downloadLink.href = window.URL.createObjectURL(textFileAsBlob); + + downloadLink.click(); + }, + playVideo:function(time,mode){ + game.saveConfig('mode',mode); + localStorage.setItem(lib.configprefix+'playback',time); + game.reload(); + }, + playVideoContent:function(video){ + var next=game.createEvent('video',false); + next.video=video; + ui.system.style.display='none'; + ui.system.hide(); + ui.arena.style.display='none'; + ui.arena.hide(); + _status.event=next; + _status.paused=false; + _status.paused2=false; + _status.over=false; + _status.video=true; + clearTimeout(_status.timeout); + + for(var i in lib.characterPack){ + for(var j in lib.characterPack[i]){ + lib.character[j]=lib.character[j]||lib.characterPack[i][j]; + } + } + next.content=function(){ + 'step 0' + game.delay(0,500); + 'step 1' + if(lib.config.mode!='chess'){ + ui.control.innerHTML=''; + var nodes=[]; + for(var i=0;i1){ + slow.classList.add('glow'); + } + else{ + slow.classList.remove('glow'); + } + if(_status.videoDuration<1){ + fast.classList.add('glow'); + } + else{ + fast.classList.remove('glow'); + } + } + ui.system.style.display=''; + ui.refresh(ui.system); + ui.system.show(); + if(lib.config.mode!='versus'&&lib.config.mode!='boss'){ + ui.arena.style.display=''; + ui.refresh(ui.arena); + ui.arena.show(); + } + if(lib.config.mode!='chess'){ + game.playerMap={}; + } + 'step 2' + if(event.video.length){ + var content=event.video.shift(); + // console.log(content); + if(content.type=='delay'){ + game.delay(content.content); + } + else if(typeof content.player=='string'&&game.playerMap[content.player]){ + game.videoContent[content.type](game.playerMap[content.player],content.content); + } + else{ + game.videoContent[content.type](content.content); + } + if(event.video.length){ + game.delay(0,_status.videoDuration*Math.min(2000,event.video[0].delay)); + } + event.redo(); + } + else{ + _status.over=true; + ui.system.lastChild.hide(); + setTimeout(function(){ + ui.system.lastChild.innerHTML=''; + },500); + } + } + game.loop(); + }, + videoContent:{ + init:function(players){ + if(lib.config.mode=='chess') return; + ui.arena.dataset.number=players.length; + ui.arena.classList.add('video'); + game.players.length=0; + game.dead.length=0; + ui.create.players(players.length); + game.me=game.players[0]; + ui.handcards1=game.me.node.handcards1; + ui.handcards2=game.me.node.handcards2; + ui.me.appendChild(ui.handcards1); + ui.me.appendChild(ui.handcards2); + if(lib.config.mode=='versus'){ + if(players.bool){ + ui.arena.dataset.number=parseInt(ui.arena.dataset.number)+1; + for(var i=0;i.card,#chess>.card'); + var nodes=[]; + for(var i=0;i.card,#chess>.card'); + var nodes=[]; + for(var i=0;i0;i--){ + if(player.node.handcards1.childNodes[i].classList.contains('removing')==false){ + player.node.handcards1.childNodes[i].animate('last'); + break; + } + } + for(var i=player.node.handcards2.childNodes.length-1;i>0;i--){ + if(player.node.handcards2.childNodes[i].classList.contains('removing')==false){ + player.node.handcards2.childNodes[i].animate('last'); + break; + } + } + }, + link:function(player,bool){ + if(bool){ + player.classList.add('linked'); + } + else{ + player.classList.remove('linked'); + } + }, + turnOver:function(player,bool){ + if(bool){ + player.classList.add('turnedover'); + } + else{ + player.classList.remove('turnedover'); + } + }, + showCards:function(player,info){ + var dialog=ui.create.dialog(info[0],get.infoCards(info[1])); + setTimeout(function(){ + dialog.close(); + },1000); + }, + cardDialog:function(content){ + if(Array.isArray(content)){ + ui.create.dialog(content[0],get.infoCards(content[1])).videoId=content[2]; + } + else if(typeof content=='number'){ + for(var i=0;i=vinum){ + var toremove=lib.videos.pop(); + store.delete(toremove.time); + } + var newvid={ + name:game.getVideoName(), + mode:lib.config.mode, + video:lib.video, + win:result=='战斗胜利', + name1:game.me.name1||game.me.name, + name2:game.me.name2, + time:lib.getUTC(new Date()) + }; + lib.videos.unshift(newvid); + store.put(newvid); + } if(ui.auto) ui.auto.hide(); if(ui.wuxie) ui.wuxie.hide(); + if(lib.storage.test){ + setTimeout(game.reload,500); + } if(game.controlOver){ game.controlOver();return; } if(!ui.restart){ ui.restart=ui.create.control('restart',game.reload); } - if(lib.storage.test){ - setTimeout(game.reload,500); - } if(ui.revive){ ui.revive.close(); @@ -7411,11 +8341,17 @@ var num=event.num; var trigger=event._trigger; var result=event._result; - if(_status.paused||_status.paused2){ + if(_status.paused2||_status.imchoosing){ + if(!lib.status.dateDelaying){ + lib.status.dateDelaying=new Date(); + } + } + if(_status.paused||_status.paused2||_status.over){ return; } - if(_status.over){ - return; + if(lib.status.dateDelaying){ + lib.status.dateDelayed+=lib.getUTC(new Date())-lib.getUTC(lib.status.dateDelaying); + delete lib.status.dateDelaying; } if(event.next.length>0){ var next=event.next.shift(); @@ -7836,6 +8772,7 @@ } } else{ + game.addVideo('swapSeat',null,[player1.dataset.position,player2.dataset.position]); var temp1,pos,i,num; temp1=player1.dataset.position; player1.dataset.position=player2.dataset.position; @@ -7870,6 +8807,7 @@ } else{ if(player==game.me) return; + game.addVideo('swapPlayer',player,get.cardsInfo(player.get('h'))); var pos=parseInt(player.dataset.position); var num=game.players.length+game.dead.length; var players=game.players.concat(game.dead); @@ -7919,6 +8857,7 @@ ui.me.appendChild(ui.handcards1); ui.me.appendChild(ui.handcards2); ui.updateh(true); + game.addVideo('swapControl',player,get.cardsInfo(player.get('h'))); if(game.me.isAlive()){ if(ui.auto) ui.auto.show(); @@ -8149,6 +9088,7 @@ var node=ui.create.div(); node.innerHTML=str; ui.sidebar.insertBefore(node,ui.sidebar.firstChild); + game.addVideo('log',null,str); if(lib.config.title) document.title=str; }, save:function(key,value){ @@ -8227,6 +9167,7 @@ return player; }, addFellow:function(position,character){ + game.addVideo('addFellow',null,[position,character]); var player=ui.create.player(ui.arena).animate('start'); player.dataset.position=position||game.players.length+game.dead.length; if(character) player.init(character); @@ -10556,6 +11497,14 @@ var cheatButton=ui.create.div('.menubutton.round.highlight','作',start); var runButton=ui.create.div('.menubutton.round.highlight','执',start); runButton.style.display='none'; + var playButton=ui.create.div('.menubutton.round.highlight','播',start); + playButton.style.display='none'; + playButton.style.left='215px'; + var deleteButton=ui.create.div('.menubutton.round.highlight','删',start); + deleteButton.style.display='none'; + deleteButton.style.left='275px'; + var saveButton=ui.create.div('.menubutton.round.highlight','存',start); + saveButton.style.display='none'; var clickMode=function(){ if(this.classList.contains('off')) return; @@ -10580,6 +11529,16 @@ else{ runButton.style.display='none'; } + if(this.type=='video'){ + playButton.style.display=''; + saveButton.style.display=''; + deleteButton.style.display=''; + } + else{ + playButton.style.display='none'; + saveButton.style.display='none'; + deleteButton.style.display='none'; + } }; (function(){ var checkCheat=function(){ @@ -10785,6 +11744,141 @@ } }); }()); + (function(){ + if(!window.indexedDB) return; + var page=ui.create.div(''); + var node=ui.create.div('.menubutton.large','录像',start.firstChild,clickMode); + node.type='video'; + node.link=page; + + lib.onDB(function(){ + var store=lib.db.transaction(['video'],'readwrite').objectStore('video'); + lib.videos=[]; + store.openCursor().onsuccess=function(e){ + var cursor=e.target.result; + if(cursor){ + lib.videos.push(cursor.value); + cursor.continue(); + } + else{ + lib.videos.sort(function(a,b){ + return parseInt(b.time)-parseInt(a.time); + }); + var clickcapt=function(){ + var current=this.parentNode.querySelector('.videonode.active'); + if(current&¤t!=this){ + current.classList.remove('active'); + } + this.classList.toggle('active'); + }; + var createNode=function(video,before){ + var node=ui.create.div('.videonode.menubutton.large',clickcapt); + node.link=video; + ui.create.div('.menubutton.videoavatar',node).setBackground(video.name1,'character'); + if(video.name2){ + ui.create.div('.menubutton.videoavatar2',node).setBackground(video.name2,'character'); + } + var date=new Date(video.time); + var str=date.getFullYear()+'.'+(date.getMonth()+2)+'.'+(date.getDay()+1)+' '+ + date.getHours()+':'; + var minutes=date.getMinutes(); + if(minutes<10){ + str+='0'; + } + str+=minutes; + ui.create.div('.caption',video.name[0],node); + ui.create.div('.text',str+'
    '+video.name[1],node); + if(video.win){ + ui.create.div('.victory','胜',node); + } + + if(before){ + page.insertBefore(node,page.firstChild); + } + else{ + page.appendChild(node); + } + } + for(var i=0;i导入录像...',function(){ + this.nextSibling.classList.toggle('hidden'); + },page); + importVideoNode.style.marginLeft='12px'; + importVideoNode.style.marginTop='3px'; + var importVideo=ui.create.div('.config.hidden',page); + importVideo.style.whiteSpace='nowrap'; + importVideo.style.marginBottom='80px'; + importVideo.style.marginLeft='13px'; + importVideo.style.width='calc(100% - 30px)'; + importVideo.innerHTML=''+ + ''; + importVideo.lastChild.onclick=function(){ + var fileToLoad = importVideo.firstChild.files[0]; + + var fileReader = new FileReader(); + fileReader.onload = function(fileLoadedEvent) + { + var data = fileLoadedEvent.target.result; + if(!data) return; + try{ + data=JSON.parse(lib.init.decode(data)); + } + catch(e){ + alert('导入失败'); + return; + } + var store=lib.db.transaction(['video'],'readwrite').objectStore('video'); + if(lib.videos.length>=parseInt(lib.config.video)&&lib.videos.length){ + var toremove=lib.videos.pop(); + store.delete(toremove.time); + for(var i=0;i.background, -#arena.selecting .player[data-position='0'] .card:not(.selectable)>.image, -#arena.selecting .player[data-position='0'] .card:not(.selectable)>.name, -#arena.selecting .player[data-position='0'] .card:not(.selectable)>.name2, -#arena.selecting .player[data-position='0'] .card:not(.selectable)>.info, -#arena.selecting #me .card:not(.selectable)>.background, -#arena.selecting #me .card:not(.selectable)>.image, -#arena.selecting #me .card:not(.selectable)>.name, -#arena.selecting #me .card:not(.selectable)>.name2, -#arena.selecting #me .card:not(.selectable)>.info, -#arena.selecting #me .card:not(.selectable)>.addinfo, -#arena.selecting .dialog:not(.noselect) .button:not(.selectable):not(.noclick), +#arena.selecting:not(.video) .player[data-position='0'] .card:not(.selectable)>.background, +#arena.selecting:not(.video) .player[data-position='0'] .card:not(.selectable)>.image, +#arena.selecting:not(.video) .player[data-position='0'] .card:not(.selectable)>.name, +#arena.selecting:not(.video) .player[data-position='0'] .card:not(.selectable)>.name2, +#arena.selecting:not(.video) .player[data-position='0'] .card:not(.selectable)>.info, +#arena.selecting:not(.video) #me .card:not(.selectable)>.background, +#arena.selecting:not(.video) #me .card:not(.selectable)>.image, +#arena.selecting:not(.video) #me .card:not(.selectable)>.name, +#arena.selecting:not(.video) #me .card:not(.selectable)>.name2, +#arena.selecting:not(.video) #me .card:not(.selectable)>.info, +#arena.selecting:not(.video) #me .card:not(.selectable)>.addinfo, +#arena.selecting:not(.video) .dialog:not(.noselect) .button:not(.selectable):not(.noclick), .dead,.likedead{opacity: 0.6;} .unselectable:not(.selected):not(.removing){opacity: 0.6 !important} .mark>.background{opacity: 1 !important;} -#arena.selecting #me .card:not(.selectable){ +#arena.selecting:not(.video) #me .card:not(.selectable){ opacity:0.8 } @@ -557,6 +557,9 @@ div:hover>.intro{opacity: 1;} border-style:solid; border-color:transparent; } +.underlinenode.slim{ + padding-bottom: 0; +} .on>.underline,.underlinenode.on{ border-color:rgb(0, 133, 255); } diff --git a/layout/default/menu.css b/layout/default/menu.css index c99f415d0..e201c4824 100644 --- a/layout/default/menu.css +++ b/layout/default/menu.css @@ -38,6 +38,14 @@ .menu-cheat>.selecting{ box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px, rgba(255, 0, 0, 0.8) 0 0 5px, rgba(255, 0, 0, 0.8) 0 0 5px !important } +.menu-cheat.config>.menubutton{ + height:16px; + line-height: 16px; + transform: translateY(-10px); +} +.menu-cheat.config{ + transition-property: opacity; +} .menu-buttons>.toggle{ position:relative; margin-bottom: 10px !important; @@ -375,3 +383,54 @@ background-image: linear-gradient(rgba(47,101,150,1), rgba(43, 90, 132,1)); box-shadow: rgba(0,0,0,0.2) 0 0 0 1px; } +.videonode.menubutton{ + width: calc(100% - 50px); + height: 70px; + margin-bottom: 6px; + margin-left: -10px; + margin-top: 6px; + overflow: hidden; +} +.videonode.menubutton>div{ + position: absolute; +} +.videonode.menubutton>.videoavatar{ + width: 56px; + height: 56px; + top:7px; + left:7px; + background-size: cover; +} +.videonode.menubutton>.videoavatar2{ + width: 24px; + height: 24px; + top:43px; + left:3px; + background-size: cover; + border-radius: 100%; +} +.videonode.menubutton>.caption{ + display: inline-block; + left: 84px; + top: 6px; + padding-top: 0; + white-space: nowrap; +} +.videonode.menubutton>.text{ + font-size: 14px; + left: 85px; + top: 35px; + line-height: 20px; + text-align: left; + font-family:'STHeiti','SimHei','Microsoft JhengHei','Microsoft YaHei','WenQuanYi Micro Hei',Helvetica,Arial,sans-serif +} +.videonode.menubutton>.victory{ + font-family: 'huangcao'; + font-size: 25px; + text-shadow: black 0 0 1px,rgba(255, 203, 0,1) 0 0 2px,rgba(255, 203, 0,1) 0 0 5px,rgba(255, 203, 0,1) 0 0 5px, + rgba(255, 203, 0,1) 0 0 5px,black 0 0 1px; + color:white; + position: absolute; + left: 48px; + top: 48px; +} diff --git a/layout/mobile/layout.css b/layout/mobile/layout.css index 1ebba4de9..1e45171ff 100644 --- a/layout/mobile/layout.css +++ b/layout/mobile/layout.css @@ -8,10 +8,10 @@ left: 3%; } #control{ - width: 100%; + width: calc(5000% / 47 - 240px); + left:calc(-150% / 47 + 120px); bottom:150px; height: 40px; - left:0; } /*#control>div{ height: 40px; @@ -42,11 +42,15 @@ } #arena:not(.chess) .player[data-position='0']>.equips>div{ - width: 42px; - height: 42px; + width: 45px; + height: 45px; margin: 0; + border-radius: 4px; position: absolute; } +#arena:not(.chess) .player[data-position='0']>.equips>.equip5{ + border-radius: 45px; +} #arena:not(.chess) .player[data-position='0']{ width: calc(5000% / 47); left:calc(-150% / 47); @@ -59,6 +63,7 @@ box-shadow: none !important; } #arena:not(.chess) .player[data-position='0']:not(.minskin)>.avatar, +#arena:not(.chess) .player[data-position='0']:not(.minskin)>.avatar2, #arena:not(.chess) .player[data-position='0']:not(.minskin)>.equips{ width:120px; height:120px; @@ -147,9 +152,16 @@ #arena:not(.chess) .player[data-position='0'].linked{ transform: none; } -#arena:not(.chess) .player[data-position='0'].linked .avatar{ +#arena:not(.chess) .player[data-position='0'].linked .avatar, +#arena:not(.chess) .player[data-position='0'].linked .avatar2{ transform: rotate(-90deg); } +#arena:not(.chess) .player[data-position='0'].fullskin2 .avatar{ + transform-origin: right center; +} +#arena:not(.chess) .player[data-position='0'].fullskin2 .avatar2{ + transform-origin: left center; +} .dialog{ height:calc(100% - 370px); diff --git a/mode/boss.js b/mode/boss.js index 1e65c4f36..c00acb44b 100755 --- a/mode/boss.js +++ b/mode/boss.js @@ -22,10 +22,43 @@ mode.boss={ game.over(!game.boss.isAlive()); } }, + getVideoName:function(){ + var str=get.translation(game.me.name); + if(game.me.name2){ + str+='/'+get.translation(game.me.name2); + } + var str2='挑战'; + if(game.me!=game.boss){ + str2+=' - '+get.translation(game.boss); + } + var name=[str,str2]; + return name; + }, start:function(){ var next=game.createEvent('game',false); next.content=function(){ "step 0" + var playback=localStorage.getItem(lib.configprefix+'playback'); + if(playback){ + ui.create.arena(); + ui.create.me(); + ui.arena.style.display='none'; + ui.system.style.display='none'; + _status.playback=playback; + localStorage.removeItem(lib.configprefix+'playback'); + var store=lib.db.transaction(['video'],'readwrite').objectStore('video'); + store.get(parseInt(playback)).onsuccess=function(e){ + if(e.target.result){ + game.playVideoContent(e.target.result.video); + } + else{ + alert('播放失败:找不到录像'); + game.reload(); + } + } + event.finish(); + return; + } for(var i in lib.skill){ if(lib.skill[i].changeSeat){ lib.skill[i]={}; @@ -158,9 +191,11 @@ mode.boss={ boss.style.left=(rect.left-ui.arena.offsetLeft)+'px'; boss.style.top=(rect.top-ui.arena.offsetTop)+'px'; boss.setIdentity('zhu'); + boss.identity='zhu'; for(var i=0;i=ui.chesswidth){ x=ui.chesswidth-1; } @@ -79,6 +84,7 @@ mode.chess={ return this; }, chessFocus:function(){ + game.addVideo('chessFocus',this); if(ui.chess._chessdrag) return; if(_status.chessscrolling) return; var player=this; @@ -194,6 +200,20 @@ mode.chess={ game.over(game.me.side==game.players[0].side); }, $draw:function(num){ + var cards; + if(get.itemtype(num)=='cards'){ + cards=num; + } + else if(get.itemtype(num)=='card'){ + cards=[num]; + } + if(cards){ + game.addVideo('chessgainmod',this,get.cardsInfo(num)); + } + else if(!num||typeof num=='number'){ + game.addVideo('chessgainmod',this,num); + } + return this.$gainmod(num); }, $drawx:function(num){ @@ -265,18 +285,29 @@ mode.chess={ var that=this; if(num&&num>1){ if(cards){ - that.$gain(cards) + that.$gain(cards,null,false) } else{ - that.$gain(num-1) + that.$gain(num-1,null,false) } } }, - $throw:function(card,time){ + $throw:function(card,time,init){ + if(init!==false){ + if(get.itemtype(card)!='cards'){ + if(get.itemtype(card)=='card'){ + card=[card]; + } + else{ + return; + } + } + game.addVideo('throw',this,[get.cardsInfo(card),time]); + } this.chessFocus(); if(get.itemtype(card)=='cards'){ for(var i=0;ithis.node.actcount.childElementCount){ ui.create.div(this.node.actcount); @@ -30,7 +36,13 @@ mode.stone={ } } if(used!==false){ - var count=this.actcount-this.getActCount(); + var count; + if(_status.video){ + count=this.actcount-(current||0); + } + else{ + count=this.actcount-this.getActCount(); + } for(var i=0;i=4){ ui.fakemebg.show(); game.onSwapControl(); } + + var players=get.players(lib.sort.position); + var info=[]; + for(var i=0;i=4); + game.addVideo('init',null,info); } }, versusPhaseLoop:function(player){ @@ -575,6 +621,7 @@ mode.versus={ name:source.name, stat:source.stat }); + game.addVideo('reinit',source,[event.character,get.translation(source.side+'Color')]); source.uninit(); source.init(event.character); source.node.identity.dataset.color=get.translation(source.side+'Color'); @@ -824,6 +871,7 @@ mode.versus={ game.save('autoreplaceinnerhtml',this.classList.contains('on')); }, onSwapControl:function(){ + game.addVideo('onSwapControl'); var name=game.me.name; if(ui.fakeme&&ui.fakeme.current!=name){ ui.fakeme.current=name;