框架跟进

推进中途加入房间的观战相关
This commit is contained in:
MrZ_26
2022-11-03 12:23:29 +08:00
parent e688458cfd
commit 9e882e6188
7 changed files with 41 additions and 15 deletions

View File

@@ -60,11 +60,11 @@ BGM.setMaxSources(5)
VOC.setDiversion(.62)
WIDGET.setOnChange(function()
if SCN.stack[#SCN.stack]~='custom_field' then
if SCN.current~='custom_field' then
local colorList=THEME.getThemeColor()
if not colorList then return end
local rnd=math.random
for _,W in next,SCN.scenes[SCN.stack[#SCN.stack]].widgetList do
for _,W in next,SCN.scenes[SCN.current].widgetList do
if W.color then
W.color=colorList[rnd(#colorList)]
end
@@ -218,10 +218,10 @@ do-- Z.setOnFocus
TASK.new(task_autoSoundOn)
end
else
if SCN.stack[#SCN.stack]=='game' and SETTING.autoPause then
if SCN.current=='game' and SETTING.autoPause then
pauseGame()
end
if SETTING.autoMute and SCN.stack[#SCN.stack]~='music' then
if SETTING.autoMute and SCN.current~='music' then
TASK.removeTask_code(task_autoSoundOn)
TASK.new(task_autoSoundOff)
end

View File

@@ -3,6 +3,7 @@ local WS=WS
local NET={
uid=false,
uid_sid={},
storedStream={},
roomState={-- A copy of room structure on server
info={
@@ -18,7 +19,7 @@ local NET={
},
capacity=false,
private=false,
state='Playing',
state='Standby',
},
spectate=false,-- If player is spectating
@@ -439,7 +440,7 @@ end
--Remove player when leave
local function _playerLeaveRoom(uid)
if SCN.stack[#SCN.stack]=='net_game' then
if SCN.current=='net_game' then
for i=1,#PLAYERS do if PLAYERS[i].uid==uid then table.remove(PLAYERS,i) break end end
for i=1,#PLY_ALIVE do if PLY_ALIVE[i].uid==uid then table.remove(PLY_ALIVE,i) break end end
if uid==USER.uid then
@@ -585,7 +586,7 @@ function NET.wsCallBack.global_getOnlineCount(body)
NET.onlineCount=tonumber(body.data) or "_"
end
function NET.wsCallBack.room_chat(body)
if SCN.stack[#SCN.stack]=='net_game' then
if SCN.current=='net_game' then
TASK.unlock('receiveMessage')
TASK.lock('receiveMessage',1)
NET.textBox:push{
@@ -623,6 +624,8 @@ function NET.wsCallBack.room_enter(body)
NET.roomState=body.data
NETPLY.clear()
destroyPlayers()
TABLE.cut(NET.storedStream)
loadGame('netBattle',true,true)
for _,p in next,body.data.players do
NETPLY.add{
@@ -634,7 +637,18 @@ function NET.wsCallBack.room_enter(body)
config=p.config,
}
end
NET.freshRoomAllReady()
if NET.roomState.state=='Playing' then
for _,p in next,body.data.players do
table.insert(NET.storedStream,{
playerId=p.playerId,
data=p.history,
})
end
NET.seed=body.data.seed
TASK.lock('netPlaying')
else
NET.freshRoomAllReady()
end
else
local p=body.data
NETPLY.add{
@@ -670,18 +684,22 @@ function NET.wsCallBack.room_fetch(body)
SCN.scenes.net_rooms.widgetList.roomList:setList(body.data)
end
function NET.wsCallBack.room_setPW()
if SCN.current~='net_game' then return end
MES.new(text.roomPasswordChanged)
end
function NET.wsCallBack.room_remove()
if SCN.current~='net_game' then return end
MES.new('info',text.roomRemoved)
_playerLeaveRoom(USER.uid)
end
function NET.wsCallBack.player_updateConf(body)
if SCN.current~='net_game' then return end
if type(body.data)=='table' then
NETPLY.map[body.data.playerId].config=body.data.config
end
end
function NET.wsCallBack.player_finish(body)
if SCN.current~='net_game' then return end
for _,P in next,PLY_ALIVE do
if P.uid==body.data.playerId then
P.loseTimer=26
@@ -691,9 +709,11 @@ function NET.wsCallBack.player_finish(body)
end
end
function NET.wsCallBack.player_joinGroup(body)
if SCN.current~='net_game' then return end
NETPLY.map[body.data.playerId].group=body.data.group
end
function NET.wsCallBack.player_setHost(body)
if SCN.current~='net_game' then return end
if body.data.role=='Admin' then
MES.new('info',text.becomeHost:repD(_getFullName(body.data.playerId)))
end
@@ -702,17 +722,21 @@ end
function NET.wsCallBack.player_setState(body)-- not used
end
function NET.wsCallBack.player_stream(body)
if SCN.current~='net_game' then return end
_pumpStream(body.data)
end
function NET.wsCallBack.player_setPlayMode(body)
if SCN.current~='net_game' then return end
NETPLY.map[body.data.playerId].playMode=body.data.type
NET.freshRoomAllReady()
end
function NET.wsCallBack.player_setReadyMode(body)
if SCN.current~='net_game' then return end
NETPLY.map[body.data.playerId].readyMode=body.data.isReady and 'Ready' or 'Standby'
NET.freshRoomAllReady()
end
function NET.wsCallBack.match_finish()
if SCN.current~='net_game' then return end
for _,P in next,PLAYERS do
NETPLY.setStat(P.uid,P.stat)
end
@@ -724,6 +748,7 @@ end
function NET.wsCallBack.match_ready()-- not used
end
function NET.wsCallBack.match_start(body)
if SCN.current~='net_game' then return end
TASK.lock('netPlaying')
NET.seed=body.data and body.data.seed
if not NET.seed then
@@ -804,7 +829,7 @@ function NET.ws_update()
elseif msg then
msg=JSON.decode(msg)
-- print(("Recv: <-- $1 err:$2"):repD(msg.action,msg.errno))
-- print(("Recv: <-- $1 err:$2"):repD(msg.action,msg.errno)) print(TABLE.dump(msg),"\n")
print(("Recv: <-- $1 err:$2"):repD(msg.action,msg.errno)) print(TABLE.dump(msg),"\n")
if msg.errno~=0 then
parseError(msg.message~=nil and msg.message or msg)
else

View File

@@ -2192,7 +2192,7 @@ local function task_autoPause()
while true do
yield()
time=time+1
if SCN.stack[#SCN.stack]~='game' or PLAYERS[1].frameRun<180 then
if SCN.current~='game' or PLAYERS[1].frameRun<180 then
return
elseif time==120 then
pauseGame()

View File

@@ -6,7 +6,7 @@ local scene={}
function scene.sceneInit()
BGcolor=math.random()>.026 and{.3,.5,.9} or{.62,.3,.926}
sysAndScn=SYSTEM.."-"..VERSION.string.." scene:"..Z.getErr('#').scene
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()

View File

@@ -22,7 +22,7 @@ function scene.sceneInit()
if THEME.cur=='halloween' then
TASK.new(function()
TEST.yieldT(.26)
while SCN.stack[#SCN.stack]=='main' do
while SCN.current=='main' do
flash=.355
SFX.play('clear_'..math.random(4,6),1,math.random()*2-1,-9-math.random()*3)
TEST.yieldT(.626+math.random()*6.26)

View File

@@ -247,8 +247,9 @@ function scene.update(dt)
end
end
else
NETPLY.update(dt)
if TASK.getLock('netPlaying') and not playing then
if not TASK.getLock('netPlaying') then
NETPLY.update(dt)
else
playing=true
TASK.lock('netPlaying')
lastUpstreamTime=0