From 51d6fbad646dc4be9e90e9f3b905e8442d60a923 Mon Sep 17 00:00:00 2001 From: libccy Date: Tue, 18 Apr 2017 23:56:01 +0800 Subject: [PATCH] 1 --- game/game.js | 366 +++++++++++++++++++++++++++++++++++--- game/server.js | 89 ++++++++- layout/default/layout.css | 30 +++- layout/default/menu.css | 47 +++++ theme/woodden/style.css | 6 +- 5 files changed, 503 insertions(+), 35 deletions(-) diff --git a/game/game.js b/game/game.js index 665a36a7b..a791f118a 100644 --- a/game/game.js +++ b/game/game.js @@ -19,7 +19,7 @@ }; var lib={ configprefix:'noname_0.9_', - versionOL:24, + versionOL:25, updateURL:'https://raw.githubusercontent.com/libccy/noname', mirrorURL:'https://coding.net/u/libccy/p/noname/git/raw', extensionURL:'http://extension-1252061710.costj.myqcloud.com/', @@ -9117,11 +9117,18 @@ "step 0" if(player.node.judges.childElementCount){ event.card=player.node.judges.firstChild; - player.lose(event.card); - player.$phaseJudge(event.card); - event.cancelled=false; - event.trigger('phaseJudge'); - player.popup(event.card.viewAs||event.card.name,'thunder'); + if(event.card.classList.contains('removing')){ + event.card.remove(); + delete event.card; + event.redo(); + } + else{ + player.lose(event.card); + player.$phaseJudge(event.card); + event.cancelled=false; + event.trigger('phaseJudge'); + player.popup(event.card.viewAs||event.card.name,'thunder'); + } } else event.finish(); "step 1" @@ -19692,7 +19699,7 @@ alert('请稍后再试'); _status.enteringroom=false; }, - roomlist:function(list){ + roomlist:function(list,events,clients){ game.online=true; game.onlinehall=true; lib.config.recentIP.remove(_status.ip); @@ -19708,6 +19715,7 @@ ui.auto.hide(); clearTimeout(_status.createNodeTimeout); + game.send('server','changeAvatar',lib.config.connect_nickname,lib.config.connect_avatar); var proceed=function(){ ui.rooms=[]; @@ -19720,7 +19728,17 @@ player.node.hp.classList.add('room'); ui.rooms.push(player); } - lib.message.client.updaterooms(list); + if(events){ + ui.connectEvents=ui.create.div('.forceopaque.menubutton.large.connectevents.pointerdiv','约战',ui.window,ui.click.connectEvents); + ui.connectEventsCount=ui.create.div('.forceopaque.menubutton.icon.connectevents.highlight.hidden','',ui.window); + ui.connectClients=ui.create.div('.forceopaque.menubutton.large.connectevents.pointerdiv.left','在线',ui.window,ui.click.connectClients); + ui.connectClientsCount=ui.create.div('.forceopaque.menubutton.icon.connectevents.highlight.left','1',ui.window); + if(events.length){ + ui.connectEventsCount.innerHTML=events.length; + ui.connectEventsCount.show(); + } + } + lib.message.client.updaterooms(list,events,clients); ui.exitroom=ui.create.system('退出房间',function(){ if(ui.rooms){ game.saveConfig('reconnect_info'); @@ -19764,33 +19782,45 @@ proceed(); } }, - updaterooms:function(list){ + updaterooms:function(list,events,clients){ if(ui.rooms){ ui.window.classList.add('more_room'); var list2=['re_caocao','re_liubei','sunquan','sp_zhangjiao','re_yuanshao','dongzhuo']; - var more_room=true; for(var i=0;i=3){ - more_room=true; - } ui.rooms[i].initRoom(list[i],list2[i]); } - // if(!more_room){ - // if(list[0]&&list[1]&&list[2]){ - // more_room=true; - // } - // else if(list[0]=='server'||list[1]=='server'||list2=='server'){ - // more_room=true; - // } - // } - if(more_room){ - ui.window.classList.add('more_room'); - } - else{ - ui.window.classList.remove('more_room'); - } } + if(events&&ui.connectEvents){ + ui.connectEvents.info=events; + if(events.length){ + ui.connectEventsCount.innerHTML=events.length; + ui.connectEventsCount.show(); + } + else{ + ui.connectEventsCount.hide(); + } + if(_status.connectEventsCallback){ + _status.connectEventsCallback(); + } + } + if(clients&&ui.connectClients){ + ui.connectClients.info=clients; + ui.connectClientsCount.innerHTML=clients.length; + } }, + eventsaccepted:function(){ + + }, + eventsdenied:function(reason){ + var str='创建约战失败'; + if(reason=='total'){ + str+=',约战总数不能超过20'; + } + else if(reason=='time'){ + str+=',时间已过'; + } + alert(str); + }, init:function(id,config,ip,servermode,roomId){ game.online=true; game.onlineID=id; @@ -20247,6 +20277,7 @@ var game={ online:false, onlineID:null, + onlineKey:null, showHistory:function(pause){ if(lib.config.show_history=='left'){ ui.window.classList.add('leftbar'); @@ -25807,6 +25838,16 @@ } delete ui.rooms; } + if(ui.connectEvents){ + ui.connectEvents.remove(); + ui.connectEventsCount.remove(); + ui.connectClients.remove(); + ui.connectClientsCount.remove(); + delete ui.connectEvents; + delete ui.connectEventsCount; + delete ui.connectClients; + delete ui.connectClientsCount; + } }, log:function(){ var str='',logvid=null; @@ -26860,7 +26901,7 @@ option.value=list[i]; option.innerHTML=list[i]; } - if(init==list[i]){ + if(init==option.value){ option.selected='selected'; } select.appendChild(option); @@ -35495,6 +35536,275 @@ }, }, click:{ + connectEvents:function(){ + if(this.info){ + if(!game.onlineKey){ + game.onlineKey=localStorage.getItem(lib.configprefix+'key'); + if(!game.onlineKey){ + game.onlineKey=get.id(); + localStorage.setItem(lib.configprefix+'key',game.onlineKey); + } + } + + var button=this; + var layer=ui.create.div('.poplayer',ui.window); + var uiintro=ui.create.dialog('hidden','notouchscroll'); + layer.listen(function(){ + if(this.clicked){ + this.clicked=false; + return; + } + uiintro.delete(); + this.delete(); + }); + uiintro.listen(function(){ + _status.clicked=true; + }); + uiintro.style.zIndex=21; + uiintro.classList.add('popped'); + uiintro.classList.add('static'); + uiintro.classList.add('onlineclient'); + uiintro.style.width='180px'; + uiintro.style.height='300px'; + uiintro.style.left='auto'; + uiintro.style.right='20px'; + uiintro.style.top='auto'; + uiintro.style.bottom='75px'; + + uiintro.refresh=function(){ + uiintro.content.innerHTML=''; + uiintro.addText('创建约战'); + button.textnode=uiintro.content.lastChild.lastChild; + uiintro.add(''); + uiintro.content.lastChild.style.paddingTop=0; + button.input=uiintro.content.lastChild.lastChild; + if(button.interval){ + button.input.disabled=true; + button.input.style.opacity=0.6; + if(button.intervaltext){ + button.textnode.innerHTML=button.intervaltext; + } + } + var datenode=ui.create.div(uiintro.content); + datenode.style.marginTop=0; + datenode.style.whiteSpace='nowrap'; + var date=new Date(); + var days=[]; + var currentDay=date.getDay(); + if(currentDay==0) currentDay=7; + for(var i=1;i<=7;i++){ + if(i7){ + initday-=7; + } + var daysselect=ui.create.selectlist(days,initday.toString(),datenode); + daysselect.style.width='55px'; + var hours=[]; + for(var i=0;i<24;i++){ + hours.push([i.toString(),i.toString()+'点']); + } + var hoursselect=ui.create.selectlist(hours,date.getHours().toString(),datenode); + hoursselect.style.marginLeft='5px'; + hoursselect.style.width='55px'; + var timeconfirm=ui.create.node('button','确定',datenode); + timeconfirm.style.marginLeft='5px'; + timeconfirm.onclick=function(){ + if(!button.input.value){ + alert('请填写约战标题'); + return; + } + var date2=new Date(); + date2.setHours(parseInt(hoursselect.value)); + date2.setMinutes(0); + date2.setSeconds(0); + var deltaday=parseInt(daysselect.value)-currentDay; + if(deltaday<0){ + deltaday+=7; + } + var utc=date2.getTime()+deltaday*24*3600000; + if(utc=3){ + button.input.disabled=true; + button.input.style.opacity=0.6; + hoursselect.disabled=true; + daysselect.disabled=true; + timeconfirm.disabled=true; + } + } + uiintro.refresh(); + ui.window.appendChild(uiintro); + _status.connectEventsCallback=uiintro.refresh; + } + }, + connectClients:function(){ + if(this.info){ + var button=this; + var layer=ui.create.div('.poplayer',ui.window); + var uiintro=ui.create.dialog('hidden','notouchscroll'); + layer.listen(function(){ + if(this.clicked){ + this.clicked=false; + return; + } + uiintro.delete(); + this.delete(); + }); + uiintro.listen(function(){ + _status.clicked=true; + }); + uiintro.style.zIndex=21; + uiintro.classList.add('popped'); + uiintro.classList.add('static'); + uiintro.classList.add('onlineclient'); + uiintro.style.width='180px'; + uiintro.style.height='300px'; + uiintro.style.left='auto'; + uiintro.style.right='20px'; + uiintro.style.top='auto'; + uiintro.style.bottom='75px'; + + uiintro.addText('发状态'); + button.textnode=uiintro.content.lastChild.lastChild; + uiintro.add(''); + uiintro.content.lastChild.style.paddingTop=0; + button.input=uiintro.content.lastChild.lastChild; + if(button.interval){ + button.input.disabled=true; + button.input.style.opacity=0.6; + if(button.intervaltext){ + button.textnode.innerHTML=button.intervaltext; + } + } + button.input.onkeydown=function(e){ + if(e.keyCode==13&&!this.disabled){ + game.send('server','status',this.value); + this.disabled=true; + this.style.opacity=0.6; + button.textnode.innerHTML='发状态(10)'; + var num=10; + var that=this; + button.input.disabled=true; + button.input.style.opacity=0.6; + for(var i=0;i0){ + button.textnode.innerHTML='发状态('+num+')'; + button.intervaltext=button.textnode.innerHTML; + } + else{ + button.textnode.innerHTML='发状态'; + button.input.disabled=false; + button.input.style.opacity=''; + clearInterval(button.interval); + delete button.interval; + delete button.intervaltext; + } + },1000); + } + } + + for(var i=0;i'+(this.info[i][0]||'无名玩家'),node);node.isme=true;break; + case 1:ui.create.div('.name',''+(this.info[i][0]||'无名玩家'),node);break; + case 2:ui.create.div('.name',(this.info[i][0]||'无名玩家'),node);break; + } + if(this.info[i][3]){ + ui.create.div('.menubutton.videotext',uiintro.content,this.info[i][3]); + } + } + + ui.window.appendChild(uiintro); + } + }, autoskin:function(){ if(!lib.config.change_skin) return; var players=game.filterPlayer(); diff --git a/game/server.js b/game/server.js index f83681141..74b2ac013 100644 --- a/game/server.js +++ b/game/server.js @@ -3,6 +3,7 @@ var wss=new WebSocketServer({port:8080}); var rooms=[{},{},{},{},{},{}]; + var events=[]; var clients={}; var messages={ enter:function(index,nickname,avatar,config,mode){ @@ -68,6 +69,64 @@ util.updaterooms(); } }, + events:function(cfg,id,type){ + var changed=false; + var time=(new Date()).getTime(); + for(var i=0;i=20){ + this.sendl('eventsdenied','total'); + } + else if(cfg.utc<=time){ + this.sendl('eventsdenied','time'); + } + else{ + cfg.nickname=cfg.nickname||'无名玩家'; + cfg.avatar=cfg.nickname||'caocao'; + cfg.creator=id; + cfg.id=(Math.floor(1000000+9000000*Math.random())).toString(); + cfg.members=[id]; + events.unshift(cfg); + changed=true; + this.sendl('eventsaccepted'); + } + } + } + if(changed){ + util.updaterooms(); + } + }, config:function(config){ var room=this.room; if(room&&room.owner==this){ @@ -85,6 +144,15 @@ } util.updaterooms(); }, + status:function(str){ + if(typeof str=='string'){ + this.status=str; + } + else{ + delete this.status; + } + util.updaterooms(); + }, send:function(id,message){ if(clients[id]&&clients[id].owner==this){ try{ @@ -145,11 +213,28 @@ } return roomlist; }, + getclientlist:function(me){ + var clientlist=[]; + for(var i in clients){ + var num; + if(clients[i]==me){ + num=0; + } + else if(clients[i].room){ + num=1; + } + else{ + num=2; + } + clientlist.push([clients[i].nickname,clients[i].avatar,num,clients[i].status]); + } + return clientlist; + }, updaterooms:function(){ var roomlist=util.getroomlist(); for(var i in clients){ if(!clients[i].room){ - clients[i].sendl('updaterooms',roomlist); + clients[i].sendl('updaterooms',roomlist,events,util.getclientlist(clients[i])); } } }, @@ -158,7 +243,7 @@ ws.sendl=util.sendl; ws.wsid=util.getid(); clients[ws.wsid]=ws; - ws.sendl('roomlist',util.getroomlist()); + ws.sendl('roomlist',util.getroomlist(),events,util.getclientlist(ws)); ws.heartbeat=setInterval(function(){ if(ws.beat){ ws.close(); diff --git a/layout/default/layout.css b/layout/default/layout.css index 13a9548b6..e3dd503db 100644 --- a/layout/default/layout.css +++ b/layout/default/layout.css @@ -81,12 +81,11 @@ table { #window.shortcutpaused.modepaused>.modenopause.popup-container:not(.filter-character) { opacity: 0.3; } -#window.shortcutpaused>div:not(.background):not(#shortcut):not(#system):not(#arena):not(.hidden): -not(.removing):not(.dialog):not(.centermenu):not(.popup-container):not(.forceopaque) { - opacity: 0.3 !important +#window.shortcutpaused>div:not(.background):not(#shortcut):not(#system):not(#arena):not(.hidden):not(.removing):not(.dialog):not(.centermenu):not(.popup-container):not(.forceopaque) { + opacity: 0.3 !important; } #window.shortcutpaused>#arena>div:not(#timer):not(.removing):not(.hidden):not(#autonode) { - opacity: 0.3 !important + opacity: 0.3 !important; } #window.systempaused>#system { opacity: 0.3 !important; @@ -2741,11 +2740,34 @@ div:not(.handcards)>.card>.info>span, #window>.player.connect { width: 120px; } +#window.menupaused>.player.connect{ + opacity: 0.5; +} .connectbutton { top: calc(400% / 7 - 35px); width: 130px; left: calc(50% - 70px); } +.connectevents { + left: auto; + top: auto; + right: 20px; + bottom: 20px; +} +.connectevents.left{ + transform: translateX(-85px); +} +.connectevents.icon{ + width: 20px; + height: 20px; + border-radius: 100%; + padding: 0; + font-size: 15px; + font-family: 'xinwei'; + line-height: 22px; + bottom: 47px; + right: 13px; +} /*--------动画--------*/ .start,.equips>.card,.popup { diff --git a/layout/default/menu.css b/layout/default/menu.css index c6c1d4fa2..265ee4d0f 100644 --- a/layout/default/menu.css +++ b/layout/default/menu.css @@ -1232,6 +1232,53 @@ input.fileinput::-webkit-file-upload-button { .videonode.starred>.video_star{ opacity: 1 } + +.onlineclient .videonode{ + margin: 5px; + padding: 0; + width: calc(100% - 20px); + height: 30px; + overflow: visible; + border-top-left-radius:10px; + border-bottom-left-radius:10px; +} +.onlineclient .videonode>.videoavatar{ + padding: 0; + left: -4px; + top: -2px; + width: 34px; + height: 34px; + border-radius: 100%; +} +.onlineclient .videotext{ + margin-top: 0px; + font-size: 14px; + width: calc(100% - 30px); +} +.onlineclient .onlineevent.videotext{ + margin-top: 2px; +} +.onlineclient .videonode>.name{ + left: 35px; + white-space: nowrap; + text-align: left; + height: 30px; + line-height: 30px; + font-size: 18px; + font-family: 'xinwei'; +} +.onlineevent>div{ + text-align: left; + position: relative; + display: block; + margin-top: 5px; + margin-bottom: 5px; +} +.onlineevent>div.title{ + font-family: 'xinwei'; + font-size: 18px; +} + .button-downloading>.button-progress{ width: 100%; border-radius: 4px; diff --git a/theme/woodden/style.css b/theme/woodden/style.css index 7dae6f597..8f1314d1c 100644 --- a/theme/woodden/style.css +++ b/theme/woodden/style.css @@ -81,7 +81,7 @@ html{ .dialog.popped .yellowtext{ color:#631515; } -.dialog.popped .greentext,.control span.greentext{ +.dialog.popped .greentext,.control span.greentext,.poisontext.poisonauto{ color:#00312d; } .control span.firetext{ @@ -150,6 +150,10 @@ html{ .menubutton.active{ box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(0, 133, 255, 0.4) 0 0 0 2px, rgba(0, 133, 255, 1) 0 0 5px !important; } +.connectevents.icon.highlight{ + box-shadow: rgba(0, 0, 0, 0.3) 0 0 0 1px, rgba(0, 0, 0, 0.3) 0 0 5px !important; + background: url('wood.jpg'); +} .videonode.menubutton.extension>.caption>.menubutton.active{ box-shadow: rgba(0, 0, 0, 0.2) 0 0 0 1px, rgba(0, 0, 0, 0.2) 0 3px 10px !important; }