diff --git a/parts/gametoolfunc.lua b/parts/gametoolfunc.lua
index 10c7edcd..30e16db1 100644
--- a/parts/gametoolfunc.lua
+++ b/parts/gametoolfunc.lua
@@ -462,6 +462,21 @@ function loadGame(M,ifQuickPlay)
SFX.play("enter")
end
end
+local function tick_showMods()
+ local time=0
+ while true do
+ coroutine.yield()
+ time=time+1
+ if time%20==0 then
+ local M=GAME.mod[time/20]
+ if M then
+ TEXT.show(M.id,700+(time-20)%120*4,36,45,"spin",.5)
+ else
+ return
+ end
+ end
+ end
+end
function resetGameData(replaying)
if PLAYERS[1]and not GAME.replaying then
mergeStat(STAT,PLAYERS[1].stat)
@@ -489,7 +504,6 @@ function resetGameData(replaying)
GAME.seed=rnd(1046101471,2662622626)
end
- TASK.removeTask_code(TICK.autoPause)
destroyPlayers()
GAME.curMode.load()
restoreVirtualKey()
@@ -516,8 +530,8 @@ function resetGameData(replaying)
end
STAT.game=STAT.game+1
FREEROW.reset(30*#PLAYERS)
- TASK.removeTask_code(TICK.showMods)
- TASK.new(TICK.showMods)
+ TASK.removeTask_code(tick_showMods)
+ TASK.new(tick_showMods)
SFX.play("ready")
collectgarbage()
end
diff --git a/parts/player/player.lua b/parts/player/player.lua
index 6365f8ff..7b66a580 100644
--- a/parts/player/player.lua
+++ b/parts/player/player.lua
@@ -1354,6 +1354,96 @@ function Player.loadAI(P,data)--Load AI params
end
----------------------------------------------------
+----------------------------------------------------
+local function tick_throwBadge(ifAI,sender,time)
+ while true do
+ coroutine.yield()
+ time=time-1
+ if time%4==0 then
+ local S,R=sender,sender.lastRecv
+ local x1,y1,x2,y2
+ if S.small then
+ x1,y1=S.centerX,S.centerY
+ else
+ x1,y1=S.x+308*S.size,S.y+450*S.size
+ end
+ if R.small then
+ x2,y2=R.centerX,R.centerY
+ else
+ x2,y2=R.x+66*R.size,R.y+344*R.size
+ end
+
+ --Generate badge object
+ SYSFX.newBadge(x1,y1,x2,y2)
+
+ if not ifAI and time%8==0 then
+ SFX.play("collect")
+ end
+ end
+ if time<=0 then return end
+ end
+end
+local function tick_finish(P)
+ while true do
+ coroutine.yield()
+ P.endCounter=P.endCounter+1
+ if P.endCounter<40 then
+ --Make field visible
+ for j=1,#P.field do for i=1,10 do
+ if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
+ end end
+ elseif P.endCounter==60 then
+ return
+ end
+ end
+end
+local function tick_lose(P)
+ while true do
+ coroutine.yield()
+ P.endCounter=P.endCounter+1
+ if P.endCounter<40 then
+ --Make field visible
+ for j=1,#P.field do for i=1,10 do
+ if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
+ end end
+ elseif P.endCounter>80 then
+ for i=1,#P.field do
+ for j=1,10 do
+ if P.visTime[i][j]>0 then
+ P.visTime[i][j]=P.visTime[i][j]-1
+ end
+ end
+ end
+ if P.endCounter==120 then
+ for _=#P.field,1,-1 do
+ FREEROW.discard(P.field[_])
+ FREEROW.discard(P.visTime[_])
+ P.field[_],P.visTime[_]=nil
+ end
+ return
+ end
+ end
+ if not GAME.modeEnv.royaleMode and #PLAYERS>1 then
+ P.y=P.y+P.endCounter*.26
+ P.absFieldY=P.absFieldY+P.endCounter*.26
+ end
+ end
+end
+function tick_autoPause()
+ local time=0
+ while true do
+ coroutine.yield()
+ time=time+1
+ if SCN.cur~="play"or GAME.frame<180 then
+ return
+ elseif time==120 then
+ pauseGame()
+ return
+ end
+ end
+end
+----------------------------------------------------
+
----------------------------------------------------
local function gameOver()--Save record
if GAME.replaying then return end
@@ -1453,12 +1543,12 @@ function Player.win(P,result)
end
if P.human then
gameOver()
- TASK.new(TICK.autoPause)
+ TASK.new(tick_autoPause)
if MARKING then
P:showTextF(text.marking,0,-226,25,"appear",.4,.0626)
end
end
- P:newTask(TICK.finish)
+ P:newTask(tick_finish)
end
function Player.lose(P,force)
if P.result then return end
@@ -1532,7 +1622,7 @@ function Player.lose(P,force)
end
P.lastRecv=A
if P.id==1 or A.id==1 then
- TASK.new(TICK.throwBadge,not A.human,P,max(3,P.badge)*4)
+ TASK.new(tick_throwBadge,not A.human,P,max(3,P.badge)*4)
end
end
else
@@ -1560,13 +1650,13 @@ function Player.lose(P,force)
end
end
gameOver()
- P:newTask(#PLAYERS>1 and TICK.lose or TICK.finish)
- TASK.new(TICK.autoPause)
+ P:newTask(#PLAYERS>1 and tick_lose or tick_finish)
+ TASK.new(tick_autoPause)
if MARKING then
P:showTextF(text.marking,0,-226,25,"appear",.4,.0626)
end
else
- P:newTask(TICK.lose)
+ P:newTask(tick_lose)
end
if #PLAYERS.alive==1 then
PLAYERS.alive[1]:win()
diff --git a/parts/scenes/load.lua b/parts/scenes/load.lua
index 884357c3..9aa6a5d6 100644
--- a/parts/scenes/load.lua
+++ b/parts/scenes/load.lua
@@ -4,6 +4,69 @@ local Timer=love.timer.getTime
local max,min,sin=math.max,math.min,math.sin
+local function tick_httpREQ_launch(task)
+ local time=0
+ while true do
+ coroutine.yield()
+ local response,request_error=client.poll(task)
+ if response then
+ local res=json.decode(response.body)
+ if res then
+ if response.code==200 then
+ LOG.print(res.notice,360,COLOR.sky)
+ if VERSION_CODE>=res.version_code then
+ LOG.print(text.versionIsNew,360,COLOR.sky)
+ else
+ LOG.print(string.gsub(text.versionIsOld,"$1",res.version_name),"warn")
+ end
+ else
+ LOG.print(text.netErrorCode..response.code..": "..res.message,"warn")
+ end
+ end
+ return
+ elseif request_error then
+ LOG.print(text.getNoticeFail..": "..request_error,"warn")
+ return
+ end
+ time=time+1
+ if time>360 then
+ LOG.print(text.httpTimeout,"message")
+ return
+ end
+ end
+end
+function tick_httpREQ_autoLogin(task)
+ local time=0
+ while true do
+ coroutine.yield()
+ local response,request_error=client.poll(task)
+ if response then
+ if response.code==200 then
+ LOGIN=true
+ local res=json.decode(response.body)
+ if res then
+ LOG.print(text.loginSuccessed)
+ end
+ else
+ LOGIN=false
+ local err=json.decode(response.body)
+ if err then
+ LOG.print(text.loginFailed..": "..text.netErrorCode..response.code.."-"..err.message,"warn")
+ end
+ end
+ return
+ elseif request_error then
+ LOG.print(text.loginFailed..": "..request_error,"warn")
+ return
+ end
+ time=time+1
+ if time>360 then
+ LOG.print(text.httpTimeout,"message")
+ return
+ end
+ end
+end
+
local scene={}
function scene.sceneInit()
@@ -118,10 +181,10 @@ function scene.update()
LOADED=true
SFX.play("welcome_sfx")
VOC.play("welcome_voc")
- httpRequest(TICK.httpREQ_launch,PATH.api..PATH.appInfo)
+ httpRequest(tick_httpREQ_launch,PATH.api..PATH.appInfo)
if ACCOUNT.auth_token and ACCOUNT.email then
httpRequest(
- TICK.httpREQ_autoLogin,
+ tick_httpREQ_autoLogin,
PATH.api..PATH.auth,
"GET",
{["Content-Type"]="application/json"},
diff --git a/parts/scenes/login.lua b/parts/scenes/login.lua
index 1d2bb170..cc136f51 100644
--- a/parts/scenes/login.lua
+++ b/parts/scenes/login.lua
@@ -1,15 +1,55 @@
-local scene={}
+local function tick_httpREQ_newLogin(task)
+ local time=0
+ while true do
+ coroutine.yield()
+ local response,request_error=client.poll(task)
+ if response then
+ local res=json.decode(response.body)
+ LOGIN=response.code==200
+ if res then
+ if LOGIN then
+ LOG.print(text.loginSuccessed)
+ ACCOUNT.email=res.email
+ ACCOUNT.auth_token=res.auth_token
+ FILE.save(ACCOUNT,"account","")
-function login()
+ httpRequest(
+ TICK.httpREQ_getAccessToken,
+ PATH.api..PATH.access,
+ "POST",
+ {["Content-Type"]="application/json"},
+ json.encode{
+ email=ACCOUNT.email,
+ auth_token=ACCOUNT.auth_token,
+ }
+ )
+ else
+ LOG.print(text.netErrorCode..response.code..": "..res.message,"warn")
+ end
+ end
+ return
+ elseif request_error then
+ LOG.print(text.loginFailed..": "..request_error,"warn")
+ return
+ end
+ time=time+1
+ if time>360 then
+ LOG.print(text.httpTimeout,"message")
+ return
+ end
+ end
+end
+
+local function login()
local email= WIDGET.active.email.value
local password= WIDGET.active.password.value
- if #email==0 or not email:match("^[a-zA-Z0-9_]+@[a-zA-Z0-9_-]+%.[a-zA-Z0-9_]+$") then
+ if #email==0 or not email:match("^[a-zA-Z0-9_]+@[a-zA-Z0-9_-]+%.[a-zA-Z0-9_]+$")then
LOG.print(text.wrongEmail)return
elseif #password==0 then
LOG.print(text.noPassword)return
end
httpRequest(
- TICK.httpREQ_newLogin,
+ tick_httpREQ_newLogin,
PATH.api..PATH.auth,
"GET",
{["Content-Type"]="application/json"},
@@ -20,6 +60,8 @@ function login()
)
end
+local scene={}
+
function scene.keyDown(key)
if key=="escape"then
SCN.back()
diff --git a/parts/scenes/main.lua b/parts/scenes/main.lua
index 4dc1e00e..863ce847 100644
--- a/parts/scenes/main.lua
+++ b/parts/scenes/main.lua
@@ -1,5 +1,45 @@
local gc=love.graphics
+local function tick_httpREQ_checkAccessToken(task)
+ local time=0
+ while true do
+ coroutine.yield()
+ local response,request_error=client.poll(task)
+ if response then
+ if response.code==200 then
+ LOG.print(text.accessSuccessed)
+ SCN.pop()
+ SCN.go("netgame")
+ elseif response.code==403 or response.code==401 then
+ httpRequest(
+ TICK.httpREQ_getAccessToken,
+ PATH.api..PATH.access,
+ "POST",
+ {["Content-Type"]="application/json"},
+ json.encode{
+ email=ACCOUNT.email,
+ auth_token=ACCOUNT.auth_token,
+ }
+ )
+ else
+ local err=json.decode(response.body)
+ if err then
+ LOG.print(text.netErrorCode..response.code..": "..err.message,"warn")
+ end
+ end
+ return
+ elseif request_error then
+ LOG.print(text.loginFailed..": "..request_error,"warn")
+ return
+ end
+ time=time+1
+ if time>360 then
+ LOG.print(text.httpTimeout,"message")
+ return
+ end
+ end
+end
+
local scene={}
function scene.sceneInit()
@@ -41,7 +81,7 @@ scene.widgetList={
if LOGIN then
if ACCOUNT.access_token then
httpRequest(
- TICK.httpREQ_checkAccessToken,
+ tick_httpREQ_checkAccessToken,
PATH.api..PATH.access,
"GET",
{["Content-Type"]="application/json"},
diff --git a/parts/scenes/register.lua b/parts/scenes/register.lua
index b2c3d14a..a00fcbd5 100644
--- a/parts/scenes/register.lua
+++ b/parts/scenes/register.lua
@@ -1,3 +1,30 @@
+local function tick_httpREQ_register(task)
+ local time=0
+ while true do
+ coroutine.yield()
+ local response,request_error=client.poll(task)
+ if response then
+ local res=json.decode(response.body)
+ if res then
+ if response.code==200 then
+ LOG.print(text.registerSuccessed..": "..res.message)
+ else
+ LOG.print(text.netErrorCode..response.code..": "..res.message,"warn")
+ end
+ end
+ return
+ elseif request_error then
+ LOG.print(text.loginFailed..": "..request_error,"warn")
+ return
+ end
+ time=time+1
+ if time>360 then
+ LOG.print(text.httpTimeout,"message")
+ return
+ end
+ end
+end
+
local scene={}
function scene.keyDown(key)
@@ -16,7 +43,7 @@ function scene.keyDown(key)
LOG.print(text.diffPassword)return
end
httpRequest(
- TICK.httpREQ_register,
+ tick_httpREQ_register,
PATH.api..PATH.auth,
"POST",
{["Content-Type"]="application/json"},
diff --git a/parts/tick.lua b/parts/tick.lua
index 896ac941..bc4c019e 100644
--- a/parts/tick.lua
+++ b/parts/tick.lua
@@ -1,280 +1,8 @@
-local yield=coroutine.yield
-
local Tick={}
-function Tick.showMods()
- local time=0
- while true do
- yield()
- time=time+1
- if time%20==0 then
- local M=GAME.mod[time/20]
- if M then
- TEXT.show(M.id,700+(time-20)%120*4,36,45,"spin",.5)
- else
- return
- end
- end
- end
-end
-function Tick.finish(P)
- while true do
- yield()
- P.endCounter=P.endCounter+1
- if P.endCounter<40 then
- --Make field visible
- for j=1,#P.field do for i=1,10 do
- if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
- end end
- elseif P.endCounter==60 then
- return
- end
- end
-end
-function Tick.lose(P)
- while true do
- yield()
- P.endCounter=P.endCounter+1
- if P.endCounter<40 then
- --Make field visible
- for j=1,#P.field do for i=1,10 do
- if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
- end end
- elseif P.endCounter>80 then
- for i=1,#P.field do
- for j=1,10 do
- if P.visTime[i][j]>0 then
- P.visTime[i][j]=P.visTime[i][j]-1
- end
- end
- end
- if P.endCounter==120 then
- for _=#P.field,1,-1 do
- FREEROW.discard(P.field[_])
- FREEROW.discard(P.visTime[_])
- P.field[_],P.visTime[_]=nil
- end
- return
- end
- end
- if not GAME.modeEnv.royaleMode and #PLAYERS>1 then
- P.y=P.y+P.endCounter*.26
- P.absFieldY=P.absFieldY+P.endCounter*.26
- end
- end
-end
-function Tick.throwBadge(ifAI,sender,time)
- while true do
- yield()
- time=time-1
- if time%4==0 then
- local S,R=sender,sender.lastRecv
- local x1,y1,x2,y2
- if S.small then
- x1,y1=S.centerX,S.centerY
- else
- x1,y1=S.x+308*S.size,S.y+450*S.size
- end
- if R.small then
- x2,y2=R.centerX,R.centerY
- else
- x2,y2=R.x+66*R.size,R.y+344*R.size
- end
-
- --Generate badge object
- SYSFX.newBadge(x1,y1,x2,y2)
-
- if not ifAI and time%8==0 then
- SFX.play("collect")
- end
- end
- if time<=0 then return end
- end
-end
-function Tick.autoPause()
- local time=0
- while true do
- yield()
- time=time+1
- if SCN.cur~="play"then
- return
- elseif time==120 then
- pauseGame()
- return
- end
- end
-end
-function Tick.httpREQ_launch(task)
- local time=0
- while true do
- yield()
- local response,request_error=client.poll(task)
- if response then
- local res=json.decode(response.body)
- if res then
- if response.code==200 then
- LOG.print(res.notice,360,COLOR.sky)
- if VERSION_CODE>=res.version_code then
- LOG.print(text.versionIsNew,360,COLOR.sky)
- else
- LOG.print(string.gsub(text.versionIsOld,"$1",res.version_name),"warn")
- end
- else
- LOG.print(text.netErrorCode..response.code..": "..res.message,"warn")
- end
- end
- return
- elseif request_error then
- LOG.print(text.getNoticeFail..": "..request_error,"warn")
- return
- end
- time=time+1
- if time>360 then
- LOG.print(text.httpTimeout,"message")
- return
- end
- end
-end
-function Tick.httpREQ_register(task)
- local time=0
- while true do
- yield()
- local response,request_error=client.poll(task)
- if response then
- local res=json.decode(response.body)
- if res then
- if response.code==200 then
- LOG.print(text.registerSuccessed..": "..res.message)
- else
- LOG.print(text.netErrorCode..response.code..": "..res.message,"warn")
- end
- end
- return
- elseif request_error then
- LOG.print(text.loginFailed..": "..request_error,"warn")
- return
- end
- time=time+1
- if time>360 then
- LOG.print(text.httpTimeout,"message")
- return
- end
- end
-end
-function Tick.httpREQ_newLogin(task)
- local time=0
- while true do
- yield()
- local response,request_error=client.poll(task)
- if response then
- local res=json.decode(response.body)
- LOGIN=response.code==200
- if res then
- if LOGIN then
- LOG.print(text.loginSuccessed)
- ACCOUNT.email=res.email
- ACCOUNT.auth_token=res.auth_token
- FILE.save(ACCOUNT,"account","")
-
- httpRequest(
- TICK.httpREQ_getAccessToken,
- PATH.api..PATH.access,
- "POST",
- {["Content-Type"]="application/json"},
- json.encode{
- email=ACCOUNT.email,
- auth_token=ACCOUNT.auth_token,
- }
- )
- else
- LOG.print(text.netErrorCode..response.code..": "..res.message,"warn")
- end
- end
- return
- elseif request_error then
- LOG.print(text.loginFailed..": "..request_error,"warn")
- return
- end
- time=time+1
- if time>360 then
- LOG.print(text.httpTimeout,"message")
- return
- end
- end
-end
-function Tick.httpREQ_autoLogin(task)
- local time=0
- while true do
- yield()
- local response,request_error=client.poll(task)
- if response then
- if response.code==200 then
- LOGIN=true
- local res=json.decode(response.body)
- if res then
- LOG.print(text.loginSuccessed)
- end
- else
- LOGIN=false
- local err=json.decode(response.body)
- if err then
- LOG.print(text.loginFailed..": "..text.netErrorCode..response.code.."-"..err.message,"warn")
- end
- end
- return
- elseif request_error then
- LOG.print(text.loginFailed..": "..request_error,"warn")
- return
- end
- time=time+1
- if time>360 then
- LOG.print(text.httpTimeout,"message")
- return
- end
- end
-end
-function Tick.httpREQ_checkAccessToken(task)
- local time=0
- while true do
- yield()
- local response,request_error=client.poll(task)
- if response then
- if response.code==200 then
- LOG.print(text.accessSuccessed)
- SCN.pop()
- SCN.go("netgame")
- elseif response.code==403 or response.code==401 then
- httpRequest(
- TICK.httpREQ_getAccessToken,
- PATH.api..PATH.access,
- "POST",
- {["Content-Type"]="application/json"},
- json.encode{
- email=ACCOUNT.email,
- auth_token=ACCOUNT.auth_token,
- }
- )
- else
- local err=json.decode(response.body)
- if err then
- LOG.print(text.netErrorCode..response.code..": "..err.message,"warn")
- end
- end
- return
- elseif request_error then
- LOG.print(text.loginFailed..": "..request_error,"warn")
- return
- end
- time=time+1
- if time>360 then
- LOG.print(text.httpTimeout,"message")
- return
- end
- end
-end
function Tick.httpREQ_getAccessToken(task)
local time=0
while true do
- yield()
+ coroutine.yield()
local response,request_error=client.poll(task)
if response then
if response.code==200 then
@@ -315,30 +43,10 @@ function Tick.httpREQ_getAccessToken(task)
end
end
end
-function Tick.wsCONN_connect(task)
- local time=0
+
+local function tick_wsCONN_read()
while true do
- yield()
- local wsconn,connErr=client.poll(task)
- if wsconn then
- WSCONN=wsconn
- TASK.new(Tick.wsCONN_read)
- LOG.print(text.wsSuccessed,"warn")
- return
- elseif connErr then
- LOG.print(text.wsFailed..": "..connErr,"warn")
- return
- end
- time=time+1
- if time>360 then
- LOG.print(text.httpTimeout,"message")
- return
- end
- end
-end
-function Tick.wsCONN_read()
- while true do
- yield()
+ coroutine.yield()
if not WSCONN then return end
local messages,readErr=client.read(WSCONN)
if messages then
@@ -353,9 +61,30 @@ function Tick.wsCONN_read()
end
end
end
+function Tick.wsCONN_connect(task)
+ local time=0
+ while true do
+ coroutine.yield()
+ local wsconn,connErr=client.poll(task)
+ if wsconn then
+ WSCONN=wsconn
+ TASK.new(tick_wsCONN_read)
+ LOG.print(text.wsSuccessed,"warn")
+ return
+ elseif connErr then
+ LOG.print(text.wsFailed..": "..connErr,"warn")
+ return
+ end
+ time=time+1
+ if time>360 then
+ LOG.print(text.httpTimeout,"message")
+ return
+ end
+ end
+end
-- function Tick.wsCONN_write()
-- while true do
--- local message=yield()
+-- local message=coroutine.yield()
-- if message then
-- local writeErr=client.write(WSCONN,message)
-- if writeErr then