From 5b43ff8c459e44c71398df3baffd00fb420e9dde Mon Sep 17 00:00:00 2001 From: MrZ626 <1046101471@qq.com> Date: Tue, 18 May 2021 19:52:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=94=E7=BD=91=E6=8E=A8=E8=BF=9B=EF=BC=88?= =?UTF-8?q?=E8=A7=82=E6=88=98=E5=8A=9F=E8=83=BD=E6=B5=8B=E8=AF=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- parts/language/lang_en.lua | 8 +++-- parts/language/lang_fr.lua | 2 ++ parts/language/lang_pt.lua | 1 + parts/language/lang_sp.lua | 2 ++ parts/language/lang_yygq.lua | 1 + parts/language/lang_zh.lua | 2 ++ parts/net.lua | 68 ++++++++++++++++++++++++------------ parts/netPlayer.lua | 27 +++++++------- parts/scenes/mode.lua | 2 +- parts/scenes/net_game.lua | 65 ++++++++++++++++++++++++---------- parts/scenes/net_rooms.lua | 5 --- parts/scenes/pause.lua | 2 +- 12 files changed, 123 insertions(+), 62 deletions(-) diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index 6cb37204..d5b0ce52 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -105,10 +105,11 @@ return{ started="Playing", joinRoom="has joined the room.", leaveRoom="has left the room.", - ready="READY", - connStream="CONNECTING", - waitStream="WAITING", + ready="Ready", + connStream="Connecting", + waitStream="Waiting", champion="$1 won", + spectating="Spectating", chatRemain="Online", chatStart="------Beginning of log------", chatHistory="------New messages below------", @@ -266,6 +267,7 @@ return{ }, net_game={ ready="Ready", + spectate="Spectate", cancel="Cancel", }, setting_game={ diff --git a/parts/language/lang_fr.lua b/parts/language/lang_fr.lua index 18f797b0..74f79148 100644 --- a/parts/language/lang_fr.lua +++ b/parts/language/lang_fr.lua @@ -109,6 +109,7 @@ return{ -- connStream="CONNECTING", -- waitStream="WAITING", champion="$1 a gagné", + -- spectating="Spectating", chatRemain="En ligne : ", chatStart="--------Début des logs--------", chatHistory="-Nouveaux messages en dessous-", @@ -236,6 +237,7 @@ return{ }, net_game={ -- ready="Ready", + -- spectate="Spectate", -- cancel="Cancel", }, setting_game={ diff --git a/parts/language/lang_pt.lua b/parts/language/lang_pt.lua index 4db41b96..c7264146 100644 --- a/parts/language/lang_pt.lua +++ b/parts/language/lang_pt.lua @@ -266,6 +266,7 @@ return{ }, net_game={ -- ready="Ready", + -- spectate="Spectate", -- cancel="Cancel", }, setting_game={ diff --git a/parts/language/lang_sp.lua b/parts/language/lang_sp.lua index 8854e608..55a11923 100644 --- a/parts/language/lang_sp.lua +++ b/parts/language/lang_sp.lua @@ -109,6 +109,7 @@ return{ -- connStream="CONNECTING", -- waitStream="WAITING", champion="$1 ganó!", + -- spectating="Spectating", chatRemain="Usuarios en línea: ", chatStart="------Comienzo del historial------", chatHistory="------Nuevos mensajes------", @@ -243,6 +244,7 @@ return{ }, net_game={ ready="Estoy Listo", + -- spectate="Spectate", -- cancel="Cancel", }, setting_game={ diff --git a/parts/language/lang_yygq.lua b/parts/language/lang_yygq.lua index 0f31b99d..f46f842a 100644 --- a/parts/language/lang_yygq.lua +++ b/parts/language/lang_yygq.lua @@ -47,6 +47,7 @@ return{ createRoomSuccessed="创好了", started="开了", champion="神仙是 $1", + spectating="看戏中", stat={ "开了几次:", diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua index d99f8909..db53edaa 100644 --- a/parts/language/lang_zh.lua +++ b/parts/language/lang_zh.lua @@ -109,6 +109,7 @@ return{ connStream="正在连接", waitStream="等待其他人连接", champion="$1 获胜", + spectating="观战中", chatRemain="人数:", chatStart="------消息的开头------", chatHistory="------以上是历史消息------", @@ -266,6 +267,7 @@ return{ }, net_game={ ready="准备", + spectate="观战", cancel="取消", }, setting_game={ diff --git a/parts/net.lua b/parts/net.lua index 2051c0e5..62dbc386 100644 --- a/parts/net.lua +++ b/parts/net.lua @@ -8,8 +8,8 @@ local NET={ connected=false, allow_online=false, accessToken=false, - roomList={}, - roomState={ + roomList={},--Local roomlist, updated frequently + roomState={--A copy of room structure on server roomInfo={ name=false, type=false, @@ -21,10 +21,13 @@ local NET={ private=false, start=false, }, - watch=false, - allReady=false, - waitingStream=false, + spectate=false,--If player is spectating streamRoomID=false, + seed=false, + + allReady=false, + connectingStream=false, + waitingStream=false, UserCount="_", PlayCount="_", @@ -136,7 +139,7 @@ function NET.wsconn_stream() WS.connect('stream','/stream',JSON.encode{ uid=USER.uid, accessToken=NET.accessToken, - rid=NET.streamRoomID, + srid=NET.streamRoomID, }) TASK.new(NET.updateWS_stream) end @@ -266,9 +269,9 @@ end function NET.changeConfig() WS.send('play','{"action":5,"data":'..JSON.encode({config=dumpBasicConfig()})..'}') end -function NET.signal_ready(ready) +function NET.signal_joinMode(ready) if NET.lock('ready',3)and not NET.roomState.start then - WS.send('play','{"action":6,"data":{"ready":'..tostring(ready)..'}}') + WS.send('play','{"action":6,"data":'..JSON.encode{mode=ready}..'}') end end function NET.signal_die() @@ -423,7 +426,7 @@ function NET.updateWS_play() uid=p.uid, username=p.username, sid=p.sid, - ready=p.ready, + mode=p.mode, config=p.config, } end @@ -434,15 +437,27 @@ function NET.updateWS_play() NET.roomState.capacity=d.capacity NET.roomState.private=d.private NET.roomState.start=d.start - NET.srid=d.srid + + NET.allReady=false + NET.connectingStream=false + NET.waitingStream=false + + NET.spectate=false + NET.streamRoomID=false + loadGame('netBattle',true,true) + if d.srid then + NET.spectate=true + NET.streamRoomID=d.srid + NET.connectingStream=true + end else --Load other players netPLY.add{ uid=d.uid, username=d.username, sid=d.sid, - ready=d.ready, + mode=d.mode, config=d.config, } if SCN.socketRead then SCN.socketRead('join',d)end @@ -464,13 +479,13 @@ function NET.updateWS_play() if SCN.socketRead then SCN.socketRead('talk',d)end elseif res.action==5 then--Player change settings netPLY.setConf(d.uid,d.config) - elseif res.action==6 then--One ready - netPLY.setReady(d.uid,d.ready) + elseif res.action==6 then--Player change join mode + netPLY.setJoinMode(d.uid,d.mode) elseif res.action==7 then--All Ready SFX.play('reach',.6) NET.allReady=true elseif res.action==8 then--Set - NET.streamRoomID=d.rid + NET.streamRoomID=d.srid NET.allReady=false NET.connectingStream=true NET.wsconn_stream() @@ -507,25 +522,34 @@ function NET.updateWS_stream() if res.type=='Connect'then NET.unlock('wsc_stream') NET.connectingStream=false - NET.waitingStream=true elseif res.action==0 then--Game start NET.waitingStream=false - NET.roomState.start=true - if SCN.socketRead then SCN.socketRead('go',d)end + SCN.socketRead('go') elseif res.action==1 then--Game finished --? elseif res.action==2 then--Player join if res.type=='Self'then + NET.seed=d.seed + NET.spectate=d.spectate + netPLY.setConnect(d.uid) for _,p in next,d.connected do - if not p.watch then + if not p.spectate then netPLY.setConnect(p.uid) end end - netPLY.setConnect(d.uid) - NET.spectate=d.watch==true + if d.spectate then + if d.start then + SCN.socketRead('go') + for _,v in next,d.history or{}do + SCN.socketRead('stream',v) + end + end + else + NET.waitingStream=true + end else - if d.watch then - netPLY.setWatch(d.uid) + if d.spectate then + netPLY.setJoinMode(d.uid,2) else netPLY.setConnect(d.uid) end diff --git a/parts/netPlayer.lua b/parts/netPlayer.lua index 84d3f79f..97699613 100644 --- a/parts/netPlayer.lua +++ b/parts/netPlayer.lua @@ -87,7 +87,7 @@ end function netPLY.clear()for _=1,netPLY.getCount()do rem(PLY)end end function netPLY.add(p) - p.watch=false + p.mode=0 p.connected=false ins(PLY,p.uid==USER.uid and 1 or #PLY+1,p) local a=rnd()*6.2832 @@ -101,21 +101,22 @@ end function netPLY.getCount()return #PLY end function netPLY.rawgetPLY(i)return PLY[i]end function netPLY.getSID(uid)return getPLY(uid).sid end -function netPLY.getSelfReady()return PLY[1].ready end +function netPLY.getSelfJoinMode()return PLY[1].mode end +function netPLY.getSelfReady()return PLY[1].mode>0 end function netPLY.setPlayerObj(ply,p)ply.p=p end function netPLY.setConf(uid,config)getPLY(uid).config=config end -function netPLY.setReady(uid,ready) +function netPLY.setJoinMode(uid,ready) for i,p in next,PLY do if p.uid==uid then - if p.ready~=ready then - p.ready=ready - if not ready then NET.allReady=false end + if p.mode~=ready then + p.mode=ready + if ready==0 then NET.allReady=false end SFX.play('spin_0',.6) if i==1 then NET.unlock('ready') - elseif not PLY[1].ready then + elseif PLY[1].mode==0 then for j=2,#PLY do - if not PLY[j].ready then + if PLY[j].mode==0 then return end end @@ -127,11 +128,9 @@ function netPLY.setReady(uid,ready) end end function netPLY.setConnect(uid)getPLY(uid).connected=true end -function netPLY.setWatch(uid)getPLY(uid).watch=true end function netPLY.resetState() for i=1,#PLY do - PLY[i].ready=false - PLY[i].watch=false + PLY[i].mode=0 PLY[i].connected=false end end @@ -169,7 +168,11 @@ function netPLY.draw() local p=PLY[i] gc.translate(p.x,p.y) --Rectangle - gc.setColor(COLOR[p.watch and"L"or p.connected and"N"or p.ready and'G'or'Z']) + gc.setColor(COLOR[ + p.mode==0 and'Z'or + p.mode==1 and(p.connected and"N"or"G")or + p.mode==2 and(p.connected and"Y"or"F") + ]) gc.setLineWidth(2) gc.rectangle('line',0,0,p.w,p.h) diff --git a/parts/scenes/mode.lua b/parts/scenes/mode.lua index 0348b5ba..226fdcd2 100644 --- a/parts/scenes/mode.lua +++ b/parts/scenes/mode.lua @@ -21,7 +21,7 @@ local scene={} function scene.sceneInit(org) BG.set() destroyPlayers() - mapCam.zoomK=org=="main"and 5 or 1 + mapCam.zoomK=org=='main'and 5 or 1 end local function getK() diff --git a/parts/scenes/net_game.lua b/parts/scenes/net_game.lua index b6a3963e..d11231af 100644 --- a/parts/scenes/net_game.lua +++ b/parts/scenes/net_game.lua @@ -1,5 +1,8 @@ local gc,tc=love.graphics,love.touch +local gc_setColor,gc_print=gc.setColor,gc.print +local setFont,mStr=setFont,mStr + local ins=table.insert local SCR,VK,NET,netPLY=SCR,VK,NET,netPLY @@ -15,9 +18,9 @@ local lastBackTime=0 local noTouch,noKey=false,false local touchMoveLastFrame=false -local function _switchReady() - NET.signal_ready(not netPLY.getSelfReady()) -end +local function _setReady()NET.signal_joinMode(1)end +local function _setSpectate()NET.signal_joinMode(2)end +local function _setCancel()NET.signal_joinMode(0)end local function _gotoSetting() if not(netPLY.getSelfReady()or NET.getlock('ready'))then SCN.go('setting_game') @@ -36,8 +39,10 @@ function scene.sceneInit(org) lastUpstreamTime=0 upstreamProgress=1 - if org=="setting_game"then - NET.changeConfig() + if org=='setting_game'then NET.changeConfig()end + if NET.streamRoomID then + NET.wsconn_stream() + NET.streamRoomID=false end end function scene.sceneBack() @@ -123,7 +128,15 @@ function scene.keyDown(key) end else if key=="space"then - _switchReady() + if netPLY.getSelfJoinMode()==0 then + _setReady() + else + _setCancel() + end + elseif key=="p"then + if netPLY.getSelfJoinMode()==0 then + _setSpectate() + end elseif key=="s"then _gotoSetting() end @@ -184,7 +197,7 @@ function scene.socketRead(cmd,d) love.keyboard.setKeyRepeat(false) lastUpstreamTime=0 upstreamProgress=1 - resetGameData('n',d.seed) + resetGameData('n',NET.seed) netPLY.mouseMove(0,0) else LOG.print("Redundant [Go]",'warn') @@ -204,7 +217,7 @@ function scene.socketRead(cmd,d) end netPLY.resetState() elseif cmd=='stream'then - if d.uid~=USER.uid and playing then + if d.uid~=USER.uid then for _,P in next,PLAYERS do if P.uid==d.uid then local res,stream=pcall(love.data.decode,'string','base64',d.stream) @@ -213,9 +226,11 @@ function scene.socketRead(cmd,d) else LOG.print("Bad stream from "..P.username.."#"..P.uid,30) end + break end end end + end end @@ -271,6 +286,12 @@ function scene.draw() --Warning drawWarning() + + if NET.spectate then + setFont(30) + gc_setColor(.2,1,0,.8) + gc_print(text.spectating,940,0) + end else --Users netPLY.draw() @@ -278,24 +299,24 @@ function scene.draw() --Ready & Set mark setFont(50) if NET.allReady then - gc.setColor(0,1,.5,.9) + gc_setColor(0,1,.5,.9) mStr(text.ready,640,15) elseif NET.connectingStream then - gc.setColor(.1,1,.8,.9) + gc_setColor(.1,1,.8,.9) mStr(text.connStream,640,15) elseif NET.waitingStream then - gc.setColor(0,.8,1,.9) + gc_setColor(0,.8,1,.9) mStr(text.waitStream,640,15) end --Room info. - gc.setColor(1,1,1) + gc_setColor(1,1,1) setFont(25) gc.printf(NET.roomState.roomInfo.name,0,685,1270,'right') setFont(40) gc.print(netPLY.getCount().."/"..NET.roomState.capacity,70,655) if NET.roomState.private then gc.draw(IMG.lock,30,668)end - if NET.roomState.start then gc.setColor(0,1,0)gc.print(text.started,230,655)end + if NET.roomState.start then gc_setColor(0,1,0)gc_print(text.started,230,655)end --Profile drawSelfProfile() @@ -307,7 +328,7 @@ function scene.draw() --New message if textBox.new then setFont(40) - gc.setColor(1,1,0) + gc_setColor(1,1,0) gc.print("M",430,10) end end @@ -315,20 +336,28 @@ scene.widgetList={ textBox, inputBox, WIDGET.newKey{name="setting",fText=TEXTURE.setting,x=1200,y=160,w=90,h=90,code=_gotoSetting,hideF=function()return playing or netPLY.getSelfReady()or NET.getlock('ready')end}, - WIDGET.newKey{name="ready",x=1060,y=630,w=300,h=80,color='lB',font=40,code=_switchReady, + WIDGET.newKey{name="ready",x=950,y=630,w=190,h=80,color='lG',font=35,code=_setReady, hideF=function() return playing or NET.roomState.start or - netPLY.getSelfReady()or + netPLY.getSelfReady() or NET.getlock('ready') end}, - WIDGET.newKey{name="cancel",x=1060,y=630,w=300,h=80,color='H',font=40,code=_switchReady, + WIDGET.newKey{name="spectate",x=1150,y=630,w=190,h=80,color='lO',font=35,code=_setSpectate, hideF=function() return playing or NET.roomState.start or - not netPLY.getSelfReady()or + netPLY.getSelfReady() or + NET.getlock('ready') + end}, + WIDGET.newKey{name="cancel",x=1050,y=630,w=390,h=80,color='lH',font=40,code=_setCancel, + hideF=function() + return + playing or + NET.roomState.start or + not netPLY.getSelfReady() or NET.getlock('ready') end}, WIDGET.newKey{name="hideChat",fText="...",x=380,y=35,w=60,font=35,code=pressKey"return"}, diff --git a/parts/scenes/net_rooms.lua b/parts/scenes/net_rooms.lua index f40b1a58..e694a4ad 100644 --- a/parts/scenes/net_rooms.lua +++ b/parts/scenes/net_rooms.lua @@ -29,10 +29,6 @@ local scene={} function scene.sceneInit() BG.set() - NET.spectate=false - NET.allReady=false - NET.connectingStream=false - NET.waitingStream=false scrollPos=0 selected=1 fetchRoom() @@ -113,7 +109,6 @@ function scene.mouseClick(x,y) if NET.roomList[s]then if selected~=s then selected=s - print(1) SFX.play('click',.4) else scene.keyDown("return") diff --git a/parts/scenes/pause.lua b/parts/scenes/pause.lua index 7038fe00..736d19d1 100644 --- a/parts/scenes/pause.lua +++ b/parts/scenes/pause.lua @@ -34,7 +34,7 @@ function scene.sceneInit(org) local P=PLAYERS[1] local S=P.stat - timer=org=="game"and 0 or 50 + timer=org=='game'and 0 or 50 local frameLostRate=(S.frame/S.time/60-1)*100 form={