报错系统大升级,更不容易闪退并且不会把程序搞死

This commit is contained in:
MrZ626
2021-03-16 01:21:42 +08:00
parent a728d4427e
commit 782732278e
10 changed files with 95 additions and 69 deletions

View File

@@ -47,7 +47,7 @@ local gc=love.graphics
local gc_push,gc_pop=gc.push,gc.pop local gc_push,gc_pop=gc.push,gc.pop
local gc_discard,gc_present=gc.discard,gc.present local gc_discard,gc_present=gc.discard,gc.present
local gc_setColor,gc_draw,gc_rectangle=gc.setColor,gc.draw,gc.rectangle local gc_setColor,gc_draw,gc_rectangle=gc.setColor,gc.draw,gc.rectangle
local gc_print,gc_printf=gc.print,gc.printf local gc_print=gc.print
local setFont=setFont local setFont=setFont
local int,rnd,abs=math.floor,math.random,math.abs local int,rnd,abs=math.floor,math.random,math.abs
@@ -350,87 +350,47 @@ function love.focus(f)
pauseGame() pauseGame()
end end
end end
function love.errorhandler(msg)
ms.setVisible(true)
love.audio.stop()
local err={"Error:"..msg} local yield=coroutine.yield
local trace=debug.traceback("",2) local function secondLoopThread()
local mainLoop=love.run()
repeat yield()until mainLoop()
end
function love.errorhandler(msg)
--Generate error message
local errData={}
errData.mes={"Error:"..msg}
local c=2 local c=2
for l in trace:gmatch("(.-)\n")do for l in debug.traceback("",2):gmatch("(.-)\n")do
if c>2 then if c>2 then
if not l:find("boot")then if not l:find("boot")then
err[c]=l:gsub("^\t*","") errData.mes[c]=l:gsub("^\t*","")
c=c+1 c=c+1
end end
else else
err[2]="Traceback" errData.mes[2]="Traceback"
c=3 c=3
end end
end end
DBP(table.concat(err,"\n"),1,c-2) DBP(table.concat(errData.mes,"\n"),1,c-2)
gc.reset() ins(ERRDATA,errData)
local errScrShot --Get screencapture
gc.captureScreenshot(function(_)errScrShot=gc.newImage(_)end) love.audio.stop()
gc.reset()
gc.captureScreenshot(function(_)errData.shot=gc.newImage(_)end)
gc.present() gc.present()
SFX.fplay("error",SETTING and SETTING.voc*.8 or 0) --Create a new mainLoop thread to keep game alive
local status,resume=coroutine.status,coroutine.resume
local BGcolor=rnd()>.026 and{.3,.5,.9}or{.62,.3,.926} local loopThread=coroutine.create(secondLoopThread)
local needDraw=true repeat
local count=0 local res,err=resume(loopThread)
local errorMsg=text and text.errorMsg or"An error has occurred during loading.\nError info has been created, and you can send it to the author." if not res then
return function() love.errorhandler(err)
love.event.pump() return
for E,a,b,k in love.event.poll()do
if E=="quit"or a=="escape"then
destroyPlayers()
return 1
elseif E=="resize"then
love.resize(a,b)
needDraw=true
elseif E=="focus"then
needDraw=true
elseif E=="touchpressed"and b<26 or E=="mousepressed"and k==2 or E=="keypressed"and a=="z"then
if count<3 then
count=count+1
SFX.play("ready",.5)
else
local code=loadstring(love.system.getClipboardText())
if code then
code()
SFX.play("reach",.5)
else
SFX.play("finesseError",.5)
end
count=0
end
end
end end
if needDraw then until status(loopThread)=="dead"
gc_discard()
gc.clear(BGcolor)
gc_setColor(1,1,1)
gc_push("transform")
gc.replaceTransform(xOy)
gc_draw(errScrShot,100,365,nil,512/errScrShot:getWidth(),288/errScrShot:getHeight())
setFont(100)gc_print(":(",100,40,0,1.2)
setFont(40)gc_printf(errorMsg,100,200,SCR.w0-100)
setFont(20)
gc_print(SYSTEM.."-"..VERSION_NAME,100,660)
gc_print("scene:"..SCN.cur,400,660)
gc_printf(err[1],626,360,1260-626)
gc_print("TRACEBACK",626,426)
for i=4,#err-2 do
gc_print(err[i],626,370+20*i)
end
gc_pop()
gc_present()
needDraw=false
end
love.timer.sleep(.26)
end
end end
local WSnames={"app","user","chat","play","stream"} local WSnames={"app","user","chat","play","stream"}
local WScolor={ local WScolor={
@@ -466,8 +426,9 @@ function love.run()
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
--Scene Launch --Scene Launch
while #SCN.stack>0 do SCN.pop()end
SCN.push("quit","slowFade") SCN.push("quit","slowFade")
SCN.init("load") SCN.init(#ERRDATA==0 and"load"or"error")
return function() return function()
local _ local _

View File

@@ -27,6 +27,7 @@ LOGIN=false
EDITING="" EDITING=""
WSCONN=false WSCONN=false
LATEST_VERSION=false LATEST_VERSION=false
ERRDATA={}
--Festival check within one statement --Festival check within one statement
THEME=( THEME=(

View File

@@ -658,6 +658,10 @@ return{
resetRecord="Reset records", resetRecord="Reset records",
resetData="Reset data", resetData="Reset data",
}, },
error={
cmd="CMD",
quit="Quit",
},
}, },
modes={ modes={
["sprint_10l"]= {"Sprint", "10L", "Clear 10 lines!"}, ["sprint_10l"]= {"Sprint", "10L", "Clear 10 lines!"},

View File

@@ -576,6 +576,10 @@ return{
resetRecord="Réinitialiser les records", resetRecord="Réinitialiser les records",
resetData="Réinitialiser les données", resetData="Réinitialiser les données",
}, },
error={
cmd="CMD",
quit="Quit",
},
}, },
modes={ modes={
["sprint_10l"]= {"Sprint", "10L", "Nettoyez 10 lignes !"}, ["sprint_10l"]= {"Sprint", "10L", "Nettoyez 10 lignes !"},

View File

@@ -657,6 +657,10 @@ return{
resetRecord="Reset records", resetRecord="Reset records",
resetData="Reset data", resetData="Reset data",
}, },
error={
cmd="CMD",
quit="Quit",
},
}, },
modes={ modes={
["sprint_10l"]= {"Sprint", "10L", "Limpe 10 linhas!"}, ["sprint_10l"]= {"Sprint", "10L", "Limpe 10 linhas!"},

View File

@@ -573,6 +573,10 @@ return{
-- resetRecord="Reset records", -- resetRecord="Reset records",
resetData="Reiniciar datos", resetData="Reiniciar datos",
}, },
error={
cmd="CMD",
quit="Quit",
},
}, },
modes={ modes={
["sprint_10l"]= {"Sprint", "10L", "¡Limpia 10 líneas!"}, ["sprint_10l"]= {"Sprint", "10L", "¡Limpia 10 líneas!"},

View File

@@ -183,6 +183,10 @@ return{
disappear="消失", disappear="消失",
tapFX="动画", tapFX="动画",
}, },
error={
cmd="CMD",
quit="Quit",
},
}, },
modes={ modes={
["sprint_10l"]= {"竞速", "10L", "消10行"}, ["sprint_10l"]= {"竞速", "10L", "消10行"},

View File

@@ -661,6 +661,10 @@ return{
resetRecord="重置纪录", resetRecord="重置纪录",
resetData="重置统计", resetData="重置统计",
}, },
error={
cmd="命令行",
quit="退出",
},
}, },
modes={ modes={
["sprint_10l"]= {"竞速", "10L", "消除10行"}, ["sprint_10l"]= {"竞速", "10L", "消除10行"},

View File

@@ -258,6 +258,7 @@ do--commands.help(arg)
end end
end end
function commands.shutdown(arg)os.execute("shutdown "..arg)end function commands.shutdown(arg)os.execute("shutdown "..arg)end
function commands.error(mes)error(mes)end
function commands.cls()outputBox:clear()end function commands.cls()outputBox:clear()end
function commands.rst() function commands.rst()
history,hisPtr={} history,hisPtr={}

39
parts/scenes/error.lua Normal file
View File

@@ -0,0 +1,39 @@
local gc=love.graphics
local rnd=math.random
local BGcolor
local stateInfo,errorText
local errorShot,errorInfo
local scene={}
function scene.sceneInit()
BGcolor=rnd()>.026 and{.3,.5,.9}or{.62,.3,.926}
stateInfo=SYSTEM.."-"..VERSION_NAME.." scene:"..SCN.cur
errorText=LOADED and text.errorMsg or"An error has occurred during loading.\nError info has been created, and you can send it to the author."
errorShot,errorInfo=ERRDATA[#ERRDATA].shot,ERRDATA[#ERRDATA].mes
if SETTING then SFX.fplay("error",SETTING.voc*.8 or 0)end
end
function scene.draw()
gc.clear(BGcolor)
gc.setColor(1,1,1)
gc.draw(errorShot,100,345,nil,512/errorShot:getWidth(),288/errorShot:getHeight())
setFont(100)gc.print(":(",100,00,0,1.2)
setFont(40)gc.printf(errorText,100,160,SCR.w0-100)
setFont(20)
gc.print(stateInfo,100,640)
gc.printf(errorInfo[1],626,326,1260-626)
gc.print("TRACEBACK",626,390)
for i=4,#errorInfo do
gc.print(errorInfo[i],626,340+20*i)
end
end
scene.widgetList={
WIDGET.newKey{name="cmd",x=940,y=640,w=170,h=80,font=40,code=goScene"app_cmd"},
WIDGET.newKey{name="quit",x=1140,y=640,w=170,h=80,font=40,code=backScene},
}
return scene