继续整联网,数字action填入一个大表方便统一管理

This commit is contained in:
MrZ_26
2022-10-06 22:30:35 +08:00
parent 8e99565a9d
commit 37b76a1cb4
9 changed files with 194 additions and 128 deletions

View File

@@ -229,7 +229,7 @@ do-- Z.setOnFocus
end)
end
Z.setOnBeforeQuit(function()
NET.ws.close()
NET.ws_close()
TASK.new(function()
TEST.yieldT(.26)
love.event.quit()

View File

@@ -141,7 +141,7 @@ function NET.codeLogin(code)
if res.code==200 then
USER.rToken=res.data.refreshToken
USER.aToken=res.data.accessToken
NET.ws.connect()
NET.ws_connect()
SCN.pop()SCN.go('net_menu')
elseif res.code==201 then
USER.rToken=res.data.refreshToken
@@ -189,10 +189,7 @@ function NET.setPW(code,pw)
end)
end
function NET.autoLogin()
if not USER.password then
SCN.go('login')
return
end
if not USER.password then SCN.go('login') return end
if not TASK.lock('autoLogin') then return end
TASK.new(function()
WAIT{
@@ -212,7 +209,7 @@ function NET.autoLogin()
if res then
if res.code==200 then
NET.ws.connect()
NET.ws_connect()
SCN.go('net_menu')
WAIT.interrupt()
return
@@ -233,7 +230,7 @@ function NET.autoLogin()
if res.code==200 then
USER.rToken=res.data.refreshToken
USER.aToken=res.data.accessToken
NET.ws.connect()
NET.ws_connect()
SCN.go('net_menu')
WAIT.interrupt()
return
@@ -256,7 +253,7 @@ function NET.autoLogin()
if res.code==200 then
USER.rToken=res.data.refreshToken
USER.aToken=res.data.accessToken
NET.ws.connect()
NET.ws_connect()
SCN.go('net_menu')
WAIT.interrupt()
return
@@ -299,7 +296,7 @@ function NET.pwLogin(email,pw)
USER.password=pw
USER.rToken=res.data.refreshToken
USER.aToken=res.data.accessToken
NET.ws.connect()
NET.ws_connect()
SCN.go('net_menu')
end
end
@@ -309,6 +306,33 @@ function NET.pwLogin(email,pw)
end
--------------------------<NEW WS API>
local actMap={
global_getOnlineCount= 1000,
match_finish= 1100,
match_ready= 1101,
match_start= 1102,
player_updateConf= 1200,
player_finish= 1201,
player_joinGroup= 1202,
player_setReady= 1203,
player_setHost= 1204,
player_setState= 1205,
player_stream= 1206,
player_setPlaying= 1207,
room_chat= 1300,
room_create= 1301,
room_getData= 1302,
room_setData= 1303,
room_getInfo= 1304,
room_setInfo= 1305,
room_enter= 1306,
room_kick= 1307,
room_leave= 1308,
room_fetch= 1309,
room_setPW= 1310,
room_remove= 1311,
} for k,v in next,actMap do actMap[v]=k end
local function wsSend(act,data)
-- print("SEND ACT: "..act)
WS.send('game',JSON.encode{
@@ -317,15 +341,24 @@ local function wsSend(act,data)
})
end
-- Room
NET.room={}
function NET.room.chat(msg,rid)
wsSend(1300,{
message=msg,
roomId=rid,-- Admin
})
-- Global
function NET.global_getOnlineCount()
wsSend(actMap.global_getOnlineCount)
end
function NET.room.create(roomName,description,capacity,roomType,roomData,password)
-- Room
function NET.room_chat(msg,rid)
if not TASK.lock('chatLimit',2.6) then
MES.new('warn',"Talk too fast")
elseif #msg>0 then
wsSend(1300,{
message=msg,
roomId=rid,-- Admin
})
return true
end
end
function NET.room_create(roomName,description,capacity,roomType,roomData,password)
if not TASK.lock('createRoom',6) then return end
WAIT{
quit=function()
@@ -333,7 +366,7 @@ function NET.room.create(roomName,description,capacity,roomType,roomData,passwor
end,
timeout=1e99,
}
wsSend(1301,{
wsSend(actMap.room_create,{
capacity=capacity,
info={
name=roomName,
@@ -345,115 +378,174 @@ function NET.room.create(roomName,description,capacity,roomType,roomData,passwor
password=password,
})
end
function NET.room.getData(rid)
wsSend(1302,{
function NET.room_getData(rid)
wsSend(actMap.room_getData,{
roomId=rid,-- Admin
})
end
function NET.room.setData(data,rid)
wsSend(1303,{
function NET.room_setData(data,rid)
wsSend(actMap.room_setData,{
data=data,
roomId=rid,-- Admin
})
end
function NET.room.getInfo(rid)
wsSend(1304,{
function NET.room_getInfo(rid)
wsSend(actMap.room_getInfo,{
roomId=rid,-- Admin
})
end
function NET.room.setInfo(info,rid)
wsSend(1305,{
function NET.room_setInfo(info,rid)
wsSend(actMap.room_setInfo,{
info=info,
roomId=rid,-- Admin
})
end
function NET.room.enter(rid,password)
function NET.room_enter(rid,password)
if not TASK.lock('enterRoom',6) then return end
SFX.play('reach',.6)
wsSend(1306,{
wsSend(actMap.room_enter,{
data={
roomId=rid,
password=password,
}
})
end
function NET.room.kick(pid,rid)
wsSend(1307,{
function NET.room_kick(pid,rid)
wsSend(actMap.room_kick,{
playerId=pid,-- Host
roomId=rid,-- Admin
})
end
function NET.room.leave()
wsSend(1308)
function NET.room_leave()
wsSend(actMap.room_leave)
end
function NET.room.fetch()
function NET.room_fetch()
if not TASK.lock('fetchRoom',3) then return end
wsSend(1309,{
data={
pageIndex=0,
pageSize=26,
}
wsSend(actMap.room_lock,{
pageIndex=0,
pageSize=26,
})
end
function NET.room.setPW(pw,rid)
function NET.room_setPW(pw,rid)
if not TASK.lock('setRoomPW',2) then return end
wsSend(1310,{
data={
password=pw,
roomId=rid,-- Admin
}
wsSend(actMap.room_lock,{
password=pw,
roomId=rid,-- Admin
})
end
function NET.room.remove(rid)
wsSend(1311,{
function NET.room_remove(rid)
wsSend(actMap.room_remove,{
roomId=rid-- Admin
})
end
-- Player
NET.player={}
function NET.player.updateConf()
wsSend(1200,dumpBasicConfig())
function NET.player_updateConf()
wsSend(actMap.player_updateConf,dumpBasicConfig())
end
function NET.player.finish(msg)-- what msg?
wsSend(1201,msg)
function NET.player_finish(msg)-- what msg?
wsSend(actMap.player_finish,msg)
end
function NET.player.joinGroup(gid)
wsSend(1202,gid)
function NET.player_joinGroup(gid)
wsSend(actMap.player_joinGroup,gid)
end
function NET.player.setReady(bool)
wsSend(1203,bool)
function NET.player_setReady(bool)
wsSend(actMap.player_setReady,bool)
end
function NET.player.setHost(pid)
wsSend(1204,{
function NET.player_setHost(pid)
wsSend(actMap.player_setHost,{
playerId=pid,
role='Admin',
})
end
function NET.player.setState(state)-- what state?
wsSend(1205,state)
function NET.player_setState(state)-- what state?
wsSend(actMap.player_setState,state)
end
function NET.player.stream(stream)
wsSend(1206,stream)
function NET.player_stream(stream)
wsSend(actMap.player_stream,stream)
end
function NET.player.setPlaying(playing)
wsSend(1207,playing and 'Gamer' or 'Spectator')
function NET.player_setPlaying(playing)
wsSend(actMap.player_setPlaying,playing and 'Gamer' or 'Spectator')
end
-- Match
-- WS
NET.ws={}
function NET.ws.connect()
NET.wsCallBack={}
function NET.wsCallBack.global_getOnlineCount(body)
NET.onlineCount=tonumber(body.data) or "_"
end
function NET.wsCallBack.room_chat(body)-- TODO
end
function NET.wsCallBack.room_create(body)
TASK.unlock('createRoom')
-- NET.roomState=...
-- SCN.go('net_game')
WAIT.interrupt()
end
function NET.wsCallBack.room_getData(body)-- TODO
end
function NET.wsCallBack.room_setData(body)-- TODO
end
function NET.wsCallBack.room_getInfo(body)-- TODO
end
function NET.wsCallBack.room_setInfo(body)-- TODO
end
function NET.wsCallBack.room_enter(body)
TASK.unlock('enterRoom')
-- NET.roomState=...
-- SCN.go('net_game')
WAIT.interrupt()
end
function NET.wsCallBack.room_kick(body)-- TODO
end
function NET.wsCallBack.room_leave(body)-- TODO
end
function NET.wsCallBack.room_fetch(body)
TASK.unlock('fetchRoom')
if body.data then SCN.scenes.net_rooms.widgetList.roomList:setList(body.data) end
end
function NET.wsCallBack.room_setPW(body)-- TODO
end
function NET.wsCallBack.room_remove(body)-- TODO
end
function NET.wsCallBack.player_updateConf(body)-- TODO
end
function NET.wsCallBack.player_finish(body)-- TODO
end
function NET.wsCallBack.player_joinGroup(body)-- TODO
end
function NET.wsCallBack.player_setReady(body)-- TODO
end
function NET.wsCallBack.player_setHost(body)-- TODO
end
function NET.wsCallBack.player_setState(body)-- TODO
end
function NET.wsCallBack.player_stream(body)-- TODO
end
function NET.wsCallBack.player_setPlaying(body)-- TODO
end
function NET.ws_connect()
if WS.status('game')=='dead' then
WS.connect('game','',{['x-access-token']=USER.aToken},6)
TASK.new(NET.ws.update)
TASK.new(NET.ws_update)
end
end
function NET.ws.close()
function NET.ws_close()
WS.close('game')
end
function NET.ws.update()
function NET.ws_update()
local updateOnlineTimer=0
while WS.status('game')~='dead' do
coroutine.yield()
local dt=coroutine.yield()
updateOnlineTimer=updateOnlineTimer+dt
if updateOnlineTimer>6.26 then
NET.global_getOnlineCount()
updateOnlineTimer=0
end
local msg,op=WS.read('game')
if msg then
if op=='ping' then
@@ -469,42 +561,16 @@ function NET.ws.update()
else
local body=JSON.decode(msg)
if body then
-- print(("RECV ACT: $1 ($2)"):repD(res.action,res.type))
-- print(("RECV ACT: $1 ($2)"):repD(body.action,body.type))
-- print(TABLE.dump(body))
if body.type=='Failed' then
parseError(body.message~=nil and body.message or msg)
elseif body.action==1100 then-- TODO
elseif body.action==1101 then-- TODO
elseif body.action==1102 then-- TODO
elseif body.action==1201 then-- Finish
elseif body.action==1202 then-- Join group
elseif body.action==1203 then-- Set ready
elseif body.action==1204 then-- Set host
elseif body.action==1205 then-- Set state
elseif body.action==1206 then-- Stream
elseif body.action==1207 then-- Set playing
elseif body.action==1301 then-- Create room
TASK.unlock('createRoom')
-- NET.roomState=...
-- SCN.go('net_game')
WAIT.interrupt()
elseif body.action==1302 then-- Get room data
elseif body.action==1303 then-- Set room data
elseif body.action==1304 then-- Get room info
elseif body.action==1305 then-- Set room info
elseif body.action==1306 then-- Enter room
TASK.unlock('enterRoom')
-- NET.roomState=...
-- SCN.go('net_game')
WAIT.interrupt()
elseif body.action==1307 then-- Kick room
elseif body.action==1308 then-- Leave room
elseif body.action==1309 then-- Fetch rooms
TASK.unlock('fetchRoom')
if body.data then SCN.scenes.net_rooms.widgetList.roomList:setList(body.data) end
elseif body.action==1310 then-- Set password
elseif body.action==1311 then-- Remove room
else
local f=NET.wsCallBack[actMap[body.action]]
if f then f(body) else print("Wrong action number: "..body.action) end
end
else
MES.new('warn',"Wrong json: "..msg,5)
WS.alert('user')
end
end
@@ -516,10 +582,8 @@ end
-- Account & User
function NET.getUserInfo(uid)
wsSend({
data={
uid=uid,
hash=USERS.getHash(uid),
},
uid=uid,
hash=USERS.getHash(uid),
})
end

View File

@@ -2845,7 +2845,7 @@ function Player:lose(force)
gameOver()
self:newTask(#PLAYERS>1 and task_lose or task_finish)
if GAME.net and not NET.spectate then
NET.player.finish()
NET.player_finish()
else
TASK.new(task_autoPause)
end

View File

@@ -9,7 +9,7 @@ function scene.sceneInit()
sysAndScn=SYSTEM.."-"..VERSION.string.." scene:"..Z.getErr('#').scene
errorText=LOADED and text.errorMsg or "An error has occurred while the game was loading.\nAn error log has been created so you can send it to the author."
errorShot,errorInfo=Z.getErr('#').shot,Z.getErr('#').mes
NET.ws.close()
NET.ws_close()
if SETTING then
SFX.fplay('error',SETTING.voc*.8 or 0)
end

View File

@@ -28,14 +28,14 @@ local function _hideReadyUI()
end
local function _setCancel()
NET.player.setPlaying(true)
NET.player.setReady(true)
NET.player_setPlaying(true)
NET.player_setReady(true)
end
local function _setReady()
NET.player.setReady(true)
NET.player_setReady(true)
end
local function _setSpectate()
NET.player.setPlaying(false)
NET.player_setPlaying(false)
end
local function _gotoSetting()
@@ -44,7 +44,7 @@ local function _gotoSetting()
end
local function _quit()
if tryBack() then
NET.room.leave()
NET.room_leave()
if SCN.stack[#SCN.stack-1]=='net_newRoom' then
SCN.pop()
end
@@ -77,7 +77,7 @@ function scene.sceneInit()
newMessageTimer=0
if SCN.prev=='setting_game' then
NET.player.updateConf()
NET.player_updateConf()
end
if GAME.prevBG then
BG.set(GAME.prevBG)
@@ -144,8 +144,9 @@ function scene.keyDown(key,isRep)
elseif key=='return' then
local mes=STRING.trim(inputBox:getText())
if not inputBox.hide and #mes>0 then
NET.room.chat(mes)
inputBox:clear()
if NET.room.chat(mes) then
inputBox:clear()
end
else
_switchChat()
end
@@ -239,7 +240,7 @@ end
function scene.update(dt)
if WS.status('game')~='running' then
NET.ws.close()
NET.ws_close()
SCN.back()
return
end
@@ -268,7 +269,7 @@ function scene.update(dt)
elseif #stream%3==2 then
stream=stream.."\0\0\0\0"
end
NET.player.stream(stream)
NET.player_stream(stream)
lastUpstreamTime=PLAYERS[1].alive and P1.frameRun or 1e99
end
else

View File

@@ -4,7 +4,7 @@ function scene.sceneInit()
BG.set()
end
function scene.sceneBack()
NET.ws.close()
NET.ws_close()
end
function scene.draw()
@@ -24,7 +24,7 @@ scene.widgetList={
USER.__data.password=false
USER.__data.rToken=false
USER.__data.aToken=false
NET.ws.close()
NET.ws_close()
SCN.back()
end
end},

View File

@@ -36,7 +36,7 @@ local function _createRoom()
if #roomname==0 then
roomname=(USERS.getUsername(USER.uid) or "Anonymous").."'s room"
end
NET.room.create(
NET.room_create(
roomname,
descriptionBox.value,
ROOMENV.capacity,

View File

@@ -67,7 +67,7 @@ local passwordBox=WIDGET.newInputBox{name='password',x=350,y=505,w=500,h=50,secr
}]]
local function _fetchRoom()
fetchTimer=10
NET.room.fetch()
NET.room_fetch()
end
local scene={}
@@ -84,11 +84,12 @@ function scene.keyDown(key)
end
elseif roomList:getLen()>0 and (key=='join' or key=='return' and love.keyboard.isDown('lctrl','rctrl')) then
local R=roomList:getSel()
if TASK.getLock('fetchRoom') or not R then return end
if R.info.version==VERSION.room then
NET.room.enter(R.roomId,passwordBox.value)
else
MES.new('error',text.versionNotMatch)
if R and not TASK.getLock('fetchRoom') then
if R.info.version==VERSION.room then
NET.room.enter(R.roomId,passwordBox.value)
else
MES.new('error',text.versionNotMatch)
end
end
else
return true