This commit is contained in:
user670
2021-06-13 21:50:47 +08:00
52 changed files with 379 additions and 354 deletions

View File

@@ -50,7 +50,7 @@ function BGM.init(list)
Sources[list[i]]:setLooping(true)
Sources[list[i]]:setVolume(0)
else
LOG.print("No BGM file: "..list[i],5,'warn')
MES.new("No BGM file: "..list[i],5)
end
if not skip and i~=count then
coroutine.yield()

View File

@@ -21,7 +21,7 @@ function FILE.load(name)
return s
end
end
LOG.print(name.." "..text.loadError,'error')
MES.new(name.." "..text.loadError)
end
end
function FILE.save(data,name,mode)
@@ -30,13 +30,13 @@ function FILE.save(data,name,mode)
if mode:find'l'then
data=TABLE.dump(data)
if not data then
LOG.print(name.." "..text.saveError.."dump error",'error')
MES.new(name.." "..text.saveError.."dump error")
return
end
else
data=JSON.encode(data)
if not data then
LOG.print(name.." "..text.saveError.."json error",'error')
MES.new(name.." "..text.saveError.."json error")
return
end
end
@@ -50,11 +50,11 @@ function FILE.save(data,name,mode)
F:flush()F:close()
if success then
if not mode:find'q'then
LOG.print(text.saveDone,'message')
MES.new(text.saveDone)
end
else
LOG.print(text.saveError..(mes or"unknown error"),'error')
LOG.print(debug.traceback(),'error')
MES.new(text.saveError..(mes or"unknown error"))
MES.new(debug.traceback())
end
end
function FILE.clear(path)

View File

@@ -11,7 +11,6 @@ ADRAW=require"Zframework.aDraw"
SCR= require"Zframework.screen"
COLOR= require"Zframework.color"
LOG= require"Zframework.log"
SCN= require"Zframework.scene"
WS= require"Zframework.websocket"
@@ -31,6 +30,7 @@ BG= require"Zframework.background"
WIDGET= require"Zframework.widget"
TEXT= require"Zframework.text"
SYSFX= require"Zframework.sysFX"
MES= require"Zframework.message"
IMG= require"Zframework.image"
BGM= require"Zframework.bgm"
@@ -208,7 +208,7 @@ local function noDevkeyPressed(key)
if key=="f1"then
PROFILE.switch()
elseif key=="f2"then
LOG.print(("System:%s[%s]\nluaVer:%s\njitVer:%s\njitVerNum:%s"):format(SYSTEM,jit.arch,_VERSION,jit.version,jit.version_num),'message')
MES.new(("System:%s[%s]\nluaVer:%s\njitVer:%s\njitVerNum:%s"):format(SYSTEM,jit.arch,_VERSION,jit.version,jit.version_num))
elseif key=="f3"then
for _=1,8 do
local P=PLY_ALIVE[rnd(#PLY_ALIVE)]
@@ -218,7 +218,7 @@ local function noDevkeyPressed(key)
end
end
elseif key=="f4"and not kb.isDown("lalt","ralt")then
LOG.copy()
MES.new.copy()
elseif key=="f5"then
print(WIDGET.isFocus()or"no widget selected")
elseif key=="f6"then
@@ -226,15 +226,15 @@ local function noDevkeyPressed(key)
elseif key=="f7"and love._openConsole then
love._openConsole()
elseif key=="f8"then
devMode=nil LOG.print("DEBUG OFF",10)
devMode=nil MES.new("DEBUG OFF",.2)
elseif key=="f9"then
devMode=1 LOG.print("DEBUG 1")
devMode=1 MES.new("DEBUG 1")
elseif key=="f10"then
devMode=2 LOG.print("DEBUG 2")
devMode=2 MES.new("DEBUG 2")
elseif key=="f11"then
devMode=3 LOG.print("DEBUG 3")
devMode=3 MES.new("DEBUG 3")
elseif key=="f12"then
devMode=4 LOG.print("DEBUG 4")
devMode=4 MES.new("DEBUG 4")
elseif devMode==2 then
local W=WIDGET.sel
if W then
@@ -263,7 +263,7 @@ function love.keypressed(key)
return
elseif key=="f8"then
devMode=1
LOG.print("DEBUG ON",10)
MES.new("DEBUG ON",.2)
elseif key=="f11"then
if kb.isDown("lctrl","rctrl")then
_G["\100\114\97\119\70\87\77"]=NULL
@@ -272,7 +272,7 @@ function love.keypressed(key)
end
elseif not SCN.swapping then
if SCN.keyDown then
SCN.keyDown(key)
if #EDITING==0 then SCN.keyDown(key)end
elseif key=="escape"then
SCN.back()
else
@@ -294,13 +294,13 @@ end
function love.joystickadded(JS)
ins(joysticks,JS)
LOG.print("Joystick added",'message')
MES.new("Joystick added")
end
function love.joystickremoved(JS)
local i=TABLE.find(joysticks,JS)
if i then
rem(joysticks,i)
LOG.print("Joystick removed",'message')
MES.new("Joystick removed")
end
end
local keyMirror={
@@ -359,7 +359,7 @@ function love.lowmemory()
if TIME()-lastGCtime>6.26 then
collectgarbage()
lastGCtime=TIME()
LOG.print("[auto GC] low MEM 设备内存过低",'warn')
MES.new("[auto GC] low MEM 设备内存过低")
end
end
function love.resize(w,h)
@@ -369,7 +369,6 @@ function love.resize(w,h)
WIDGET.resize(w,h)
SHADER.warning:send("w",w*SCR.dpi)
SHADER.warning:send("h",h*SCR.dpi)
end
function love.focus(f)
if f then
@@ -520,7 +519,7 @@ function love.run()
local love=love
local VOC,BG,SYSFX=VOC,BG,SYSFX
local TASK,LOG,TEXT=TASK,LOG,TEXT
local TASK,TEXT=TASK,TEXT
local TEXTURE,TIME=TEXTURE,TIME
local SETTING,VERSION=SETTING,VERSION
@@ -571,7 +570,7 @@ function love.run()
if SCN.update then SCN.update(dt)end
if SCN.swapping then SCN.swapUpdate()end
TEXT.update()
LOG.update()
MES.update(dt)
--DRAW
if not MINI()then
@@ -598,9 +597,8 @@ function love.run()
gc_setColor(1,1,1)
gc_draw(ms.isDown(1)and cursor_holdImg or cursorImg,mx,my,nil,nil,nil,8,8)
end
gc_replaceTransform(SCR.xOy_ul)
LOG.draw()
gc_replaceTransform(SCR.origin)
MES.draw()
--Draw power info.
if SETTING.powerInfo then
gc_setColor(1,1,1)
@@ -613,7 +611,7 @@ function love.run()
_=SCN.stat
_.draw(_.time)
end
gc_replaceTransform(SCR.xOy_dm)
gc_replaceTransform(SCR.xOy_d)
--Draw Version string
gc_setColor(.8,.8,.8,.4)
setFont(20)

View File

@@ -118,8 +118,8 @@ function json.encode(val)
local a,b=pcall(encode,val)
if a then
return b
elseif LOG then
LOG.print(text.jsonError..": "..(b or"uknErr"),'warn')
elseif MES.new then
MES.new(text.jsonError..": "..(b or"uknErr"))
end
end
@@ -348,8 +348,8 @@ function json.decode(str)
local a,b=pcall(decode,str)
if a then
return b
elseif LOG then
LOG.print(text.jsonError..": "..(b or"uknErr"),'warn')
elseif MES.new then
MES.new(text.jsonError..": "..(b or"uknErr"))
end
end
return json

View File

@@ -4,7 +4,7 @@ return function(name,libName)
if r1 and r2 then
return r2
else
LOG.print("Cannot load "..name..": "..(r2 or r3),'warn')
MES.new("Cannot load "..name..": "..(r2 or r3))
end
elseif SYSTEM=="Android"then
local fs=love.filesystem
@@ -17,25 +17,25 @@ return function(name,libName)
if success then
libFunc,mes2=package.loadlib(SAVEDIR.."/lib/"..libName.Android,libName.libFunc)
if libFunc then
LOG.print(name.." lib loaded",'message')
MES.new(name.." lib loaded")
break
else
LOG.print("Cannot load "..name..": "..mes2,'error')
MES.new("Cannot load "..name..": "..mes2)
end
else
LOG.print(("Write %s-%s to saving failed: %s"):format(name,platform[i],mes2),'error')
MES.new(("Write %s-%s to saving failed: %s"):format(name,platform[i],mes2))
end
else
LOG.print(("Read %s-%s to saving failed: %s"):format(name,platform[i],mes1),'error')
MES.new(("Read %s-%s to saving failed: %s"):format(name,platform[i],mes1))
end
end
if not libFunc then
LOG.print("Cannot load "..name,'error')
MES.new("Cannot load "..name)
return
end
return libFunc()
else
LOG.print("No "..name.." for "..SYSTEM,'error')
MES.new("No "..name.." for "..SYSTEM)
return
end
return true

View File

@@ -1,64 +0,0 @@
local utf8=require"utf8"
local gc=love.graphics
local gc_setColor,gc_print=gc.setColor,gc.print
local int,min=math.floor,math.min
local ins,rem=table.insert,table.remove
local setFont=setFont
local mesList={}
local mesHistory={
"Version: "..VERSION.string,
os.date("Launched at %Y/%m/%d %H:%M"),
}
local LOG={}
function LOG.update()
if mesList[1]then
for i=#mesList,1,-1 do
local M=mesList[i]
if M.blink>0 then
M.blink=M.blink-1
else
M.time=M.time-1
if M.time==0 then
rem(mesList,i)
end
end
end
end
end
function LOG.draw()
if mesList[1]then
setFont(20)
for i=1,#mesList do
local M=mesList[i]
M.rgba[4]=M.blink>0 and int(M.blink/3)%2 or min(M.time/26,1)
gc_setColor(M.rgba)
gc_print(M.text,10+(20-min(M.time,20))^1.5/4,25*i)
end
end
end
function LOG.print(text,T)--text,type/time
local color=COLOR.Z
local his,time
if T=='message'then
color=COLOR.N
his,time=true,180
elseif T=='warn'then
color=COLOR.Y
his,time=true,180
elseif T=='error'then
color=COLOR.R
his,time=true,210
elseif type(T)=='number'then
time=T
end
text=tostring(text)
assert(utf8.len(text),"Error UTF-8 coding")
if his then ins(mesHistory,SCN.cur..": "..text)end
ins(mesList,{text=text,rgba={color[1],color[2],color[3],nil},blink=30,time=time or 120})
end
function LOG.copy()
love.system.setClipboardText(table.concat(mesHistory,"\n"))
LOG.print("Log copied",'message')
end
return LOG

70
Zframework/message.lua Normal file
View File

@@ -0,0 +1,70 @@
local gc=love.graphics
local gc_push,gc_pop=gc.push,gc.pop
local gc_replaceTransform=gc.replaceTransform
local gc_translate,gc_setColor,gc_draw=gc.translate,gc.setColor,gc.draw
local ins,rem=table.insert,table.remove
local mesList={}
local MES={}
function MES.new(...)
local icon,str,time=...
if type(icon)~='userdata'then
icon,str,time=false,icon,str
else
end
local t=gc.newText(getFont(30),str)
local w=math.max(t:getWidth()+(icon and 45 or 5),200)
local L={w+20,48,
{'setCL',.5,.5,.5,.7},
{'fRect',0,0,w+20,48},
{'setCL',.9,.9,.9},
{'setLW',2},
{'dRect',1,1,w+18,46},
{'setCL',1,1,1},
}
if icon then
ins(L,{'draw',icon,4,4,nil,40/icon:getWidth(),40/icon:getHeight()})
end
ins(L,{'draw',t,icon and 50 or 10,2})
ins(mesList,{
startTime=.5,
endTime=.5,
time=time or 3,
canvas=DOGC(L),
})
end
function MES.update(dt)
for i=#mesList,1,-1 do
local m=mesList[i]
if m.startTime>0 then
m.startTime=m.startTime-dt
elseif m.time>0 then
m.time=m.time-dt
elseif m.endTime>0 then
m.endTime=m.endTime-dt
else
rem(mesList,i)
end
end
end
function MES.draw()
gc_push('transform')
if #mesList>0 then
gc_translate(0,25)
for i=1,#mesList do
local m=mesList[i]
gc_setColor(1,1,1,2*(m.endTime-m.startTime))
gc_draw(m.canvas,40-80*(m.endTime+m.startTime))
gc_translate(0,52)
end
gc_replaceTransform(SCR.xOy)
end
gc_pop()
end
return MES

View File

@@ -141,10 +141,10 @@ function profile.switch()
profile.stop()
love.system.setClipboardText(PROFILE.report())
PROFILE.reset()
LOG.print("profile report copied!",'message')
MES.new("profile report copied!")
else
PROFILE.start()
LOG.print("profile start!",'message')
MES.new("profile start!")
end
switch=not switch
end

View File

@@ -150,7 +150,7 @@ function SCN.swapTo(tar,style)--Parallel scene swapping, cannot back
S.time,S.mid,S.draw=s[1],s[2],s[3]
end
else
LOG.print("No Scene: "..tar,'warn')
MES.new("No Scene: "..tar)
end
end
function SCN.go(tar,style)--Normal scene swapping, can back
@@ -158,7 +158,7 @@ function SCN.go(tar,style)--Normal scene swapping, can back
SCN.push()
SCN.swapTo(tar,style)
else
LOG.print("No Scene: "..tar,'warn')
MES.new("No Scene: "..tar)
end
end
function SCN.back()

View File

@@ -16,12 +16,12 @@ local SCR={
xOy_m=love.math.newTransform(),
xOy=love.math.newTransform(),
xOy_ul=love.math.newTransform(),
xOy_um=love.math.newTransform(),
xOy_u=love.math.newTransform(),
xOy_ur=love.math.newTransform(),
xOy_ml=love.math.newTransform(),
xOy_mr=love.math.newTransform(),
xOy_l=love.math.newTransform(),
xOy_r=love.math.newTransform(),
xOy_dl=love.math.newTransform(),
xOy_dm=love.math.newTransform(),
xOy_d=love.math.newTransform(),
xOy_dr=love.math.newTransform(),
}
function SCR.setSize(w,h)
@@ -49,12 +49,12 @@ function SCR.resize(w,h)
SCR.xOy:setTransformation(SCR.x,SCR.y,0,SCR.k)
SCR.xOy_m:setTransformation(w/2,h/2,0,SCR.k)
SCR.xOy_ul:setTransformation(0,0,0,SCR.k)
SCR.xOy_um:setTransformation(w/2,0,0,SCR.k)
SCR.xOy_u:setTransformation(w/2,0,0,SCR.k)
SCR.xOy_ur:setTransformation(w,0,0,SCR.k)
SCR.xOy_ml:setTransformation(0,h/2,0,SCR.k)
SCR.xOy_mr:setTransformation(w,h/2,0,SCR.k)
SCR.xOy_l:setTransformation(0,h/2,0,SCR.k)
SCR.xOy_r:setTransformation(w,h/2,0,SCR.k)
SCR.xOy_dl:setTransformation(0,h,0,SCR.k)
SCR.xOy_dm:setTransformation(w/2,h,0,SCR.k)
SCR.xOy_d:setTransformation(w/2,h,0,SCR.k)
SCR.xOy_dr:setTransformation(w,h,0,SCR.k)
end
function SCR.info()

View File

@@ -17,7 +17,7 @@ function SFX.init(list)
if love.filesystem.getInfo(N)then
Sources[list[i]]={love.audio.newSource(N,'static')}
else
LOG.print("No SFX file: "..N,5)
MES.new("No SFX file: "..N,.1)
end
if not skip and i~=count then
coroutine.yield()

View File

@@ -52,18 +52,18 @@ function THEME.set(theme)
elseif theme=='xmas'then
BG.setDefault('snow')
BGM.setDefault('xmas')
LOG.print("==============")
LOG.print("Merry Christmas!")
LOG.print("==============")
MES.new("==============")
MES.new("Merry Christmas!")
MES.new("==============")
elseif theme=='birth'then
BG.setDefault('firework')
BGM.setDefault('magicblock')
elseif theme=='sprfes'then
BG.setDefault('firework')
BGM.setDefault("spring festival")
LOG.print(" ★☆☆★")
LOG.print("新年快乐!")
LOG.print(" ★☆☆★")
MES.new(" ★☆☆★")
MES.new("新年快乐!")
MES.new(" ★☆☆★")
elseif theme=='zday1'then
BG.setDefault('lanterns')
BGM.setDefault("empty")

View File

@@ -45,7 +45,7 @@ function VOC.init(list)
if n==1 then
if not loadVoiceFile(list[i],list[i])then
LOG.print("No VOICE file: "..list[i],5)
MES.new("No VOICE file: "..list[i],.1)
end
end
if not Source[list[i]][1]then Source[list[i]]=nil end

View File

@@ -349,7 +349,7 @@ function WS.update(dt)
ws.pongTimer=1
else
ws.status='dead'
LOG.print(text.wsFailed..": "..(mes=="timeout"and text.netTimeout or mes),'warn')
MES.new(text.wsFailed..": "..(mes=="timeout"and text.netTimeout or mes))
end
end
elseif ws.status=='running'then

View File

@@ -617,7 +617,7 @@ function selector:reset()
self.selText=self.list[i]
else
self.hide=true
LOG.print("Selector "..self.name.." dead, disp= "..tostring(V),'warn')
MES.new("Selector "..self.name.." dead, disp= "..tostring(V))
end
end
function selector:isAbove(x,y)
@@ -771,7 +771,7 @@ function inputBox:addText(str)
if type(str)=='string'then
self.value=self.value..str
else
LOG.print("inputBox "..self.name.." dead, addText("..type(str)..")",'warn')
MES.new("inputBox "..self.name.." dead, addText("..type(str)..")")
end
end
function inputBox:clear()
@@ -1093,7 +1093,10 @@ function WIDGET.isFocus(W)
end
function WIDGET.focus(W)
if WIDGET.sel==W then return end
if WIDGET.sel and WIDGET.sel.type=='inputBox'then kb.setTextInput(false)end
if WIDGET.sel and WIDGET.sel.type=='inputBox'then
kb.setTextInput(false)
EDITING=""
end
WIDGET.sel=W
if W and W.type=='inputBox'then
local _,y1=xOy:transformPoint(0,W.y+W.h)
@@ -1103,7 +1106,10 @@ end
function WIDGET.unFocus(force)
local W=WIDGET.sel
if W and(force or not W.keepFocus)then
if W.type=='inputBox'then kb.setTextInput(false)end
if W.type=='inputBox'then
kb.setTextInput(false)
EDITING=""
end
WIDGET.sel=false
end
end

View File

@@ -161,7 +161,7 @@ SFX.init((function()
if fs.getRealDirectory("media/SFX/"..v)~=SAVEDIR then
table.insert(L,v:sub(1,-5))
else
LOG.print("Dangerous file : %SAVE%/media/SFX/"..v,'warn')
MES.new("Dangerous file : %SAVE%/media/SFX/"..v)
end
end
return L
@@ -172,7 +172,7 @@ BGM.init((function()
if fs.getRealDirectory("media/BGM/"..v)~=SAVEDIR then
table.insert(L,v:sub(1,-5))
else
LOG.print("Dangerous file : %SAVE%/media/BGM/"..v,'warn')
MES.new("Dangerous file : %SAVE%/media/BGM/"..v)
end
end
return L

View File

@@ -1,4 +1,4 @@
local data=love.data
local loveCompress=love.data.compress
local int=math.floor
local char,byte=string.char,string.byte
@@ -352,7 +352,7 @@ do--function DATA.saveRecording()
--Filtering modes that cannot be saved
for _,v in next,noRecList do
if GAME.curModeName:find(v)then
LOG.print("Cannot save recording of this mode now!",'warn')
MES.new("Cannot save recording of this mode now!")
return
end
end
@@ -371,12 +371,12 @@ do--function DATA.saveRecording()
JSON.encode(getModList()).."\n"..
DATA.dumpRecording(GAME.rep)
love.filesystem.write(fileName,fileHead.."\n"..data.compress('string','zlib',fileBody))
love.filesystem.write(fileName,fileHead.."\n"..loveCompress('string','zlib',fileBody))
ins(REPLAY,fileName)
FILE.save(REPLAY,'conf/replay')
return true
else
LOG.print("Save failed: File already exists",'error')
MES.new("Save failed: File already exists")
end
end
end

View File

@@ -127,7 +127,7 @@ function freshDate(mode)
STAT.date=date
STAT.todayTime=0
if not mode:find'q'then
LOG.print(text.newDay,'message')
MES.new(text.newDay)
end
return true
end
@@ -141,10 +141,10 @@ function legalGameTime()--Check if today's playtime is legal
if STAT.todayTime<14400 then
return true
elseif STAT.todayTime<21600 then
LOG.print(text.playedLong,'warn')
MES.new(text.playedLong)
return true
else
LOG.print(text.playedTooMuch,'warn')
MES.new(text.playedTooMuch)
return false
end
end
@@ -484,7 +484,7 @@ do--function resetGameData(args)
end
end
else
LOG.print("Wrong task type",'warn')
MES.new("Wrong task type")
end
end
BG.set(GAME.modeEnv.bg)
@@ -574,8 +574,8 @@ do--function drawSelfProfile()
--Draw avatar
gc_setLineWidth(2)
gc_setColor(.3,.3,.3,.8)gc_rectangle('fill',-300,0,300,80)
gc_setColor(1,1,1)gc_rectangle('line',-300,0,300,80)
gc_setColor(.3,.3,.3,.8)gc_rectangle('fill',0,0,-300,80)
gc_setColor(1,1,1)gc_rectangle('line',0,0,-300,80)
gc_rectangle('line',-73,7,66,66,2)
gc_draw(selfAvatar,-72,8,nil,.5)

View File

@@ -164,7 +164,7 @@ GAME={--Global game data
modeEnv=false, --Current gamemode environment
setting={}, --Game settings
rep={}, --Recording list, key,time,key,time...
statSaved=false, --If recording saved
statSaved=true, --If recording saved
recording=false, --If recording
replaying=false, --If replaying
saved=false, --If recording saved

View File

@@ -256,7 +256,7 @@ return{
join="Join",
},
net_newRoom={
title="Custom room config",
title="Room config",
roomName="Room name(default to username's room)",
roomDescription="Room description",
@@ -863,8 +863,8 @@ return{
"Online mode is planned - please be patient.",
"Play single-handedly!",
"Playing good takes some time!",
"Powered by Love2D",
"Powered by Un..Love2D",
"Powered by LÖVE",
"Powered by Un..LÖVE",
"pps-0.01",
"REGRET!!",
"Secret number: 626",

View File

@@ -154,7 +154,7 @@ return{
},
staff={
"Author: MrZ E-mail: 1046101471@qq.com",
"Powered by LOVE2D",
"Powered by LÖVE",
"",
"Programme : MrZ, Particle_G, [FinnTenzor]",
"Art : MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
@@ -227,7 +227,7 @@ return{
join="Rejoindre",
},
net_newRoom={
-- title="Custom room config",
-- title="Room config",
-- roomName="Room name(default to username's room)",
-- roomDescription="Room description",

View File

@@ -178,7 +178,7 @@ return{
},
staff={
"Author: MrZ E-mail: 1046101471@qq.com",
"Powered by LOVE2D",
"Powered by LÖVE",
"",
"Programa: MrZ, Particle_G, [FinnTenzor]",
"Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
@@ -255,7 +255,7 @@ return{
-- join="Join",
},
net_newRoom={
-- title="Custom room config",
-- title="Room config",
-- roomName="Room name(default to username's room)",
-- roomDescription="Room description",
@@ -855,7 +855,7 @@ return{
"Apenas 2 triminoes",
"Pirataria não é legal!",
"Jogue com uma mão!",
"Powered by Love2D",
"Powered by LÖVE",
"pps-0.01",
"REGRET!!",
"Número secreto: 626",

View File

@@ -33,8 +33,8 @@ return{
combo="Combo",maxcmb="Combo Máx.",
pc="Perfect Clear",ko="KO",
-- win="Win",
-- lose="Lose",
win="Victoria",
lose="Derrota",
finish="Fin",
gamewin="Victoria",
gameover="Fin del Juego",
@@ -58,8 +58,8 @@ return{
exportSuccess="Exportado con éxito",
importSuccess="Importado con éxito",
dataCorrupted="Los datos están corruptos.",
-- pasteWrongPlace="Paste at wrong place?",
-- noFile="File not found",
pasteWrongPlace="¿Pegaste en la carpeta correcta?",
noFile="Archivo no encontrado",
VKTchW="Sens. al tacto",
VKOrgW="Sens. al origen",
@@ -71,8 +71,8 @@ return{
getNoticeFail="Error al buscar novedades.",
oldVersion="¡Está disponible la nueva versión $1!",
-- versionNotMatch="Version do not match!",
-- needUpdate="¡Nueva versión requerida!",
versionNotMatch="¡Las versiones no coinciden!",
needUpdate="¡Nueva versión requerida!",
notFinished="Próximamente",
jsonError="Error en Json",
@@ -88,21 +88,21 @@ return{
accessSuccessed="¡Autorizado exitoso!",
accessFailed="Error al autorizar",
-- wsConnecting="Websocket: Connecting",
wsConnecting="Websocket: Conectando",
wsFailed="WebSocket: conexión fallida",
wsClose="WebSocket cerrado: ",
-- netTimeout="Network connection timeout",
netTimeout="Tiempo de conexión agotado",
-- onlinePlayerCount="Online",
onlinePlayerCount="En línea",
createRoomSuccessed="¡Sala creada con éxito!",
-- started="Playing",
started="En juego",
joinRoom="entró a la sala.",
leaveRoom="salió de la sala.",
-- ready="READY",
-- connStream="CONNECTING",
-- waitStream="WAITING",
-- spectating="Spectating",
ready="LISTO",
connStream="CONECTANDO",
waitStream="ESPERANDO",
spectating="Especteando",
chatRemain="Usuarios en línea: ",
chatStart="------Comienzo del historial------",
chatHistory="------Nuevos mensajes------",
@@ -145,7 +145,7 @@ return{
"Este es simplemente un juego de puzzle ordinario, no pienses de él como un juego promedio.",
"Está inspirado en otros como C2/IO/JS/WWC/KOS.",
"",
"Creado con LOVE2D",
"Creado con LÖVE",
"Puedes reportar errores o enviar sugerencias al grupo de testeo del autor o por email ~",
"Descarga disponible únicamente vía el grupo de testeo y discord.gg/f9pUvkh",
"Descargas desde otros sitios pueden contener malware/viruses, y en smartphones sólo requiere permisos de internet y vibración.",
@@ -154,7 +154,7 @@ return{
},
staff={
"Autor:MrZ Email: 1046101471@qq.com",
"Creado con LOVE2D",
"Creado con LÖVE",
"",
"Programación: MrZ, Particle_G, [FinnTenzor]",
"Artistas: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
@@ -184,7 +184,7 @@ return{
WidgetText={
main={
offline="1 Jugador",
qplay="Juego rápido",
qplay="Jgo. Ráp.",
online="Multijugador",
custom="Personalizado",
setting="Opciones",
@@ -215,43 +215,43 @@ return{
quit="Finalizar (Q)",
},
net_menu={
-- league="Tech League",
league="Liga Tech",
ffa="FFA",
rooms="Salas",
-- logout="Log out",
logout="Desconec.",
},
net_league={
-- match="Find Match",
match="Buscar Match",
},
net_rooms={
-- refreshing="Refreshing Rooms",
refreshing="Refrescando Salas",
noRoom="No Hay Salas Actualmente",
refresh="Refrescar",
-- new="New Room",
new="Nueva Sala",
join="Unirse",
},
net_newRoom={
-- title="Custom room config",
-- roomName="Room name(default to username's room)",
-- roomDescription="Room description",
title="Ajustes de sala",
roomName="Nombre (Por defecto: *usuario*'s room)",
roomDescription="Descripción",
life="Vida",
-- pushSpeed="Garbage Speed",
pushSpeed="Velocidad de Subida",
garbageSpeed="Velocidad de Basura",
visible="Visibilidad",
freshLimit="Límite de Reinicio LD",
fieldH="Altura del tablero",
-- bufferLimit="Buffer Limit",
-- heightLimit="Height Limit",
bufferLimit="Buffer Límite",
heightLimit="Altura Límite",
drop="Retraso de Caída",
lock="Retraso de Bloqueo",
wait="Retraso de Spawneo",
fall="Retraso de Línea",
-- capacity="Capacity",
-- create="Create",
capacity="Capacidad",
create="Crear",
ospin="O-Spin",
fineKill="100% Finesse",
@@ -270,8 +270,8 @@ return{
},
net_game={
ready="Estoy Listo",
-- spectate="Spectate",
-- cancel="Cancel",
spectate="Espectear",
cancel="Cancelar",
},
setting_game={
title="Ajustes del Juego",
@@ -314,13 +314,13 @@ return{
text="Texto de Acciones",
score="Puntaje en Pantalla",
-- bufferWarn="Buffer Alert",
-- showSpike="Spike Counter",
bufferWarn="Alerta de Búfer",
showSpike="Contador de Spike",
nextPos="Ver Spawn de Pza. Sig.",
highCam="Cám. Vista Aérea",
warn="Alerta de Peligro",
-- clickFX="Click FX",
clickFX="FX de Clickeo",
power="Inf. de Batería",
clean="Fast Draw",
fullscreen="Pant. Completa",
@@ -381,12 +381,12 @@ return{
setting_touch={
default="Por Defecto",
snap="Snap",
-- save1="Save1",
-- load1="Load1",
-- save2="Save2",
-- load2="Load2",
save1="Save1",
load1="Load1",
save2="Save2",
load2="Load2",
size="Tamaño",
-- shape="Shape",
shape="Forma",
},
setting_touchSwitch={
b1= "Mover Izq.:",b2="Mover Der.:",b3="Rotar Der.:",b4="Rotar Izq.:",
@@ -425,7 +425,7 @@ return{
clear="Inicio-Fin",
puzzle="Inicio-Puzzle",
-- reset="Reset (Del)",
reset="Reiniciar (Supr)",
advance="Más opciones (A)",
mod="Mods (F1)",
field="Editar Tablero (F)",
@@ -442,11 +442,11 @@ return{
freshLimit="Límite de Reinicio LD",
opponent="Oponente",
life="Vida",
-- pushSpeed="Garbage Speed",
pushSpeed="Velocidad de Subida",
garbageSpeed="Velocidad de Basura",
-- bufferLimit="Buffer Limit",
-- heightLimit="Height Limit",
bufferLimit="fer Límite",
heightLimit="Altura Límite",
ospin="O-Spin",
fineKill="100% Finesse",
b2bKill="No Romper B2B ",
@@ -541,7 +541,7 @@ return{
register="Registrarse",
email="Correo Elec.",
password="Contraseña",
-- keepPW="Remember me",
keepPW="Recordar credenciales",
login="Entrar",
},
register={
@@ -593,24 +593,24 @@ return{
},
app_dtw={
reset="Reiniciar",
-- arcade="Arcade",
arcade="Arcade",
mode="Modo",
},
savedata={
-- export="Export to clipboard",
-- import="Import from clipboard",
-- unlock="Progress",
-- data="Stats",
-- setting="Settings",
-- vk="Virtual Key Layout",
export="Exportar al portapapeles",
import="Importar de portapapeles",
unlock="Progreso",
data="Estads.",
setting="Ajustes",
vk="Diseño de Tecl. Virtual",
-- couldSave="Cloud Save (need login) (CAUTION: TESTING)",
-- notLogin="[Login to access cloud save]",
-- upload="Upload to cloud",
-- download="Download from cloud",
couldSave="Guardado en la nube (requiere iniciar sesión) (PRECAUCIÓN: EN TESTEO)",
notLogin="[Inicia sesión para acceder al guardado en la nube]",
upload="Subir a la nube",
download="Descargar de la nube",
},
error={
console="Console",
console="Consola",
quit="Salir",
},
},
@@ -660,7 +660,7 @@ return{
['blind_h']= {"A Ciegas", "Inmediato", "Para jugadores experimentados"},
['blind_l']= {"A Ciegas", "Inmediato+", "Para profesionales."},
['blind_u']= {"A Ciegas", "?", "¿Estás preparado?"},
['blind_wtf']= {"A Ciegas", "Guat de Foc", "No, no lo estás."},
['blind_wtf']= {"A Ciegas", "ELFUF", "No, no lo estás."},
['classic_fast']= {"Clásico", "CTWC", "Modo clásico con alta velocidad."},
['survivor_e']= {"Supervivencia", "Fácil", "¿Cuánto tiempo podrás sobrevivir?"},
['survivor_n']= {"Supervivencia", "Normal", "¿Cuánto tiempo podrás sobrevivir?"},
@@ -681,7 +681,7 @@ return{
['pc_n']= {"Desafío de PCs", "Normal", "¡Consigue los PCs que puedas en 100 líneas!"},
['pc_h']= {"Desafío de PCs", "Difícil", "¡Consigue los PCs que puedas en 100 líneas!"},
['pc_l']= {"Desafío de PCs", "Lunático", "¡Consigue los PCs que puedas en 100 líneas!"},
-- ['pc_inf']= {"Inf. PC Challenge","", "Get PCs as much as you can"},
['pc_inf']= {"Desafío de PCs Infinito","", "Consigue todos los PCs que puedas."},
['tech_n']= {"Tech", "Normal", "¡Mantén el B2B!"},
['tech_n_plus']= {"Tech", "Normal+", "¡Sólo se permiten Spins y PCs!"},
['tech_h']= {"Tech", "Difícil", "¡Mantén el B2B!"},
@@ -703,9 +703,9 @@ return{
['infinite_dig']= {"Infinito: Queso", "", "Limpia, limpia, más limpia que tú."},
['sprintFix']= {"Sprint", "Sin mover a Izq./Der."},
['sprintLock']= {"Sprint", "Sin rotar"},
-- ['sprintSmooth']= {"Sprint", "NO FRICTION"},
['sprintSmooth']= {"Sprint", "SIN FRICCIÓN"},
['marathon_bfmax']= {"Maratón", "Supremo"},
['custom_clear']= {"Personalizado", "Normal"},
['custom_puzzle']= {"Personalizado", "Puzzle"},
},
}
}

View File

@@ -170,16 +170,16 @@ return{
"这只是一个普通的方块游戏,请勿将此与某带国家名的事物强行联系",
"从C2/IO/JS/WWC/KOS等方块获得过灵感",
"",
"使用LOVE2D引擎",
"使用LÖVE引擎",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过内测qq群/discord群进行免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了振动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~记得备注id,方便记录!",
},
staff={
"作者:MrZ 邮箱:1046101471@qq.com",
"使用LOVE2D引擎",
"使用LÖVE引擎",
"",
"程序: MrZ, Particle_G, [FinnTenzor]",
"美术: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
@@ -256,8 +256,8 @@ return{
join="加入",
},
net_newRoom={
title="自定义房间参数",
roomName="房间名(留空默认 用户名's room)",
title="房间参数",
roomName="房间名 (留空默认 用户名's room)",
roomDescription="房间描述",
life="命数",
@@ -276,7 +276,7 @@ return{
fall="消行延迟",
capacity="房间容量",
create="创建房间",
create="创建",
ospin="O-spin",
fineKill="强制极简",

View File

@@ -16,7 +16,7 @@ return{
load=function()
PLY.newPlayer(1)
if SETTING.sfx_spawn==0 then
LOG.print(text.switchSpawnSFX,'warn')
MES.new(text.switchSpawnSFX)
end
end,
mesDisp=function(P)

View File

@@ -1,11 +1,11 @@
local sectionName={"D","C","B","A","A+","S-","S","S+","S+","SS","SS","U","U","X","X+"}
local passPoint=16
local function score(P)
if P.modeData.rankPoint<130 then--If Less then X
if P.modeData.rankPoint<140-passPoint then--If Less then X
local R=#P.clearedRow
if R>0 then
if R==4 then R=10 end--Techrash +10
P.modeData.rankPoint=math.min(P.modeData.rankPoint+R,130-passPoint)
P.modeData.rankPoint=math.min(P.modeData.rankPoint+R,140-passPoint)
P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1]
end
end
@@ -24,13 +24,13 @@ return{
freshLimit=15,
dropPiece=score,
task=function(P)
P.modeData.rankScore=0
P.modeData.rankPoint=0
P.modeData.rankName=sectionName[1]
while true do
YIELD()
if P.stat.frame>=3600 then
P.modeData.rankScore=math.min(P.modeData.rankScore+passPoint,130)
P.modeData.rankName=sectionName[math.floor(P.modeData.rankScore*.1)+1]
P.modeData.rankPoint=math.min(P.modeData.rankPoint+passPoint,140)
P.modeData.rankName=sectionName[math.floor(P.modeData.rankPoint/10)+1]
P:win('finish')
return
end
@@ -52,11 +52,11 @@ return{
mStr(P.stat.row,69,220)
mStr(P.stat.clears[4],69,340)
end,
score=function(P)return{P.modeData.rankScore,P.stat.score}end,
score=function(P)return{P.modeData.rankPoint,P.stat.score}end,
scoreDisp=function(D)return sectionName[math.floor(D[1]/10)+1].." "..D[2]end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
getRank=function(P)
P=P.modeData.rankScore
P=P.modeData.rankPoint
return
P==140 and 5 or
P>=110 and 4 or

View File

@@ -1,4 +1,4 @@
local data=love.data
local loveEncode,loveDecode=love.data.encode,love.data.decode
local rem=table.remove
local WS,TIME=WS,TIME
@@ -66,6 +66,11 @@ function NET.getlock(name)
return TIME()<locks[name]
end
--Pong back
local function _pong(wsName,message)
WS.send(wsName,message or"",'pong')
end
--Parse json message
local function _parse(res)
res=JSON.decode(res)
@@ -73,11 +78,13 @@ local function _parse(res)
if mesType[res.type]then
return res
else
LOG.print(
"WS error:"..(
MES.new(
"Error ws-mes type:"..(
res.type and(
res.reason and res.type..": "..res.reason or
res.type
res.reason and
res.type..": "..res.reason
or
res.type
)or
"[NO Message]"
),
@@ -87,12 +94,12 @@ local function _parse(res)
end
--WS close message
local function wsCloseMessage(message)
local function _closeMessage(message)
local mes=JSON.decode(message:sub(3))
if mes then
LOG.print(("%s [%s] %s"):format(text.wsClose,mes.type or"unknown type",mes.reason or""),'error')
MES.new(("%s [%s] %s"):format(text.wsClose,mes.type or"unknown type",mes.reason or""))
else
LOG.print(text.wsClose,'error')
MES.new(text.wsClose)
end
end
@@ -111,11 +118,11 @@ local function pumpStream(d)
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)
local res,stream=pcall(loveDecode,'string','base64',d.stream)
if res then
DATA.pumpRecording(stream,P.stream)
else
LOG.print("Bad stream from "..P.username.."#"..P.uid,10)
MES.new("Bad stream from "..P.username.."#"..P.uid,.2)
end
break
end
@@ -215,9 +222,6 @@ function NET.tryLogin(ifAuto)
SFX.play('finesseError')
end
end
function NET.pong(wsName,message)
WS.send(wsName,type(message)=='string'and message or"",'pong')
end
function NET.getAccessToken()
if NET.lock('access_and_login',10)then
WS.send('user',JSON.encode{action=0})
@@ -245,13 +249,13 @@ function NET.uploadSave()
{section=6,data=STRING.packTable(FILE.load('conf/vkSave1'))},
{section=7,data=STRING.packTable(FILE.load('conf/vkSave2'))},
}..'}}')
LOG.print("Uploading")
MES.new("Uploading")
end
end
function NET.downloadSave()
if NET.lock('downloadSave',10)then
WS.send('user','{"action":3,"data":{"sections":[1,2,3,4,5,6,7]}}')
LOG.print("Downloading")
MES.new("Downloading")
end
end
function NET.loadSavedData(sections)
@@ -291,7 +295,7 @@ function NET.loadSavedData(sections)
FILE.save(NET.cloudData.vkSave1,'conf/vkSave1','q')
FILE.save(NET.cloudData.vkSave2,'conf/vkSave2','q')
else
LOG.print(text.versionNotMatch,60)
MES.new(text.versionNotMatch,1)
end
end
@@ -368,12 +372,12 @@ function NET.signal_die()
WS.send('stream','{"action":4,"data":{"score":0,"survivalTime":0}}')
end
function NET.uploadRecStream(stream)
WS.send('stream','{"action":5,"data":{"stream":"'..data.encode('string','base64',stream)..'"}}')
WS.send('stream','{"action":5,"data":{"stream":"'..loveEncode('string','base64',stream)..'"}}')
end
--Chat
function NET.sendChatMes(mes)
WS.send('chat',"T"..data.encode('string','base64',mes))
WS.send('chat',"T"..loveEncode('string','base64',mes))
end
function NET.quitChat()
WS.send('chat','q')
@@ -392,10 +396,10 @@ function NET.updateWS_app()
local message,op=WS.read('app')
if message then
if op=='ping'then
NET.pong('app',message)
_pong('app',message)
elseif op=='pong'then
elseif op=='close'then
wsCloseMessage(message)
_closeMessage(message)
return
else
local res=_parse(message)
@@ -410,22 +414,22 @@ function NET.updateWS_app()
end
end
if VERSION.code<res.newestCode then
LOG.print(text.oldVersion:gsub("$1",res.newestName),180)
MES.new(text.oldVersion:gsub("$1",res.newestName),3)
end
LOG.print(res.notice,300)
MES.new(res.notice,5)
NET.tryLogin(true)
elseif res.action==0 then--Broadcast
LOG.print(res.data.message,300)
MES.new(res.data.message,5)
elseif res.action==1 then--Get notice
--?
elseif res.action==2 then--Register
if res.type=='Self'or res.type=='Server'then
LOG.print(res.data.message,300)
MES.new(res.data.message,5)
if SCN.cur=='register'then
SCN.back()
end
else
LOG.print(res.reason or"Registration failed",300)
MES.new(res.reason or"Registration failed",5)
end
NET.unlock('register')
elseif res.action==3 then--Get player counts
@@ -447,10 +451,10 @@ function NET.updateWS_user()
local message,op=WS.read('user')
if message then
if op=='ping'then
NET.pong('user',message)
_pong('user',message)
elseif op=='pong'then
elseif op=='close'then
wsCloseMessage(message)
_closeMessage(message)
return
else
local res=_parse(message)
@@ -462,24 +466,24 @@ function NET.updateWS_user()
FILE.save(USER,'conf/user','q')
if SCN.cur=='login'then SCN.back()end
end
LOG.print(text.loginSuccessed,'message')
MES.new(text.loginSuccessed)
--Get self infos
NET.getUserInfo(USER.uid)
NET.unlock('wsc_user')
elseif res.action==0 then--Get accessToken
NET.accessToken=res.accessToken
LOG.print(text.accessSuccessed,'message')
MES.new(text.accessSuccessed)
NET.wsconn_play()
elseif res.action==1 then--Get userInfo
USERS.updateUserData(res.data)
elseif res.action==2 then--Upload successed
NET.unlock('uploadSave')
LOG.print(text.exportSuccess)
MES.new(text.exportSuccess)
elseif res.action==3 then--Download successed
NET.unlock('downloadSave')
NET.loadSavedData(res.data.sections)
LOG.print(text.importSuccess)
MES.new(text.importSuccess)
end
else
WS.alert('user')
@@ -494,10 +498,10 @@ function NET.updateWS_play()
local message,op=WS.read('play')
if message then
if op=='ping'then
NET.pong('play',message)
_pong('play',message)
elseif op=='pong'then
elseif op=='close'then
wsCloseMessage(message)
_closeMessage(message)
return
else
local res=_parse(message)
@@ -566,8 +570,7 @@ function NET.updateWS_play()
if SCN.stack[#SCN.stack-1]=='net_newRoom'then SCN.pop()end
SCN.back()
else
removePlayer(netPLY.list,d.sid)
netPLY.freshPos()
netPLY.remove(d.sid)
removePlayer(PLAYERS,d.sid)
removePlayer(PLY_ALIVE,d.sid)
if SCN.socketRead then SCN.socketRead('leave',d)end
@@ -619,10 +622,10 @@ function NET.updateWS_stream()
local message,op=WS.read('stream')
if message then
if op=='ping'then
NET.pong('stream',message)
_pong('stream',message)
elseif op=='pong'then
elseif op=='close'then
wsCloseMessage(message)
_closeMessage(message)
return
else
local res=_parse(message)
@@ -690,10 +693,10 @@ function NET.updateWS_chat()
local message,op=WS.read('chat')
if message then
if op=='ping'then
NET.pong('chat',message)
_pong('chat',message)
elseif op=='pong'then
elseif op=='close'then
wsCloseMessage(message)
_closeMessage(message)
return
else
local res=_parse(message)
@@ -712,26 +715,26 @@ function NET.updateWS_manage()
local message,op=WS.read('manage')
if message then
if op=='ping'then
NET.pong('manage',message)
_pong('manage',message)
elseif op=='pong'then
elseif op=='close'then
wsCloseMessage(message)
_closeMessage(message)
return
else
local res=_parse(message)
if res then
if res.type=='Connect'then
LOG.print("Manage connected",'warn')
MES.new("Manage connected")
elseif res.action==0 then
LOG.print("success",'message')
MES.new("success")
elseif res.action==9 then
LOG.print("success",'message')
MES.new("success")
elseif res.action==10 then
LOG.print(TABLE.dump(res.data))
MES.new(TABLE.dump(res.data))
elseif res.action==11 then
LOG.print(TABLE.dump(res.data))
MES.new(TABLE.dump(res.data))
elseif res.action==12 then
LOG.print(TABLE.dump(res.data))
MES.new(TABLE.dump(res.data))
end
else
WS.alert('manage')

View File

@@ -5,7 +5,7 @@ local gc_stencil,gc_setStencilTest=gc.stencil,gc.setStencilTest
local rnd,min=math.random,math.min
local sin,cos=math.sin,math.cos
local ins=table.insert
local ins,rem=table.insert,table.remove
local setFont=setFont
local posLists={
@@ -66,7 +66,7 @@ local posList
local function _placeSort(a,b)return a.place<b.place end
local PLYlist,PLYmap={},{}
local function freshPosList()
local function freshPos()
table.sort(PLYlist,_placeSort)
if #PLYlist<=5 then
posList=posLists[1]
@@ -83,7 +83,7 @@ end
local netPLY={
list=PLYlist,
map=PLYmap,
freshPos=freshPosList,
freshPos=freshPos,
}
function netPLY.clear()
@@ -99,7 +99,17 @@ function netPLY.add(p)
ins(PLYlist,p)
PLYmap[p.uid]=p
freshPosList()
freshPos()
end
function netPLY.remove(sid)
for i=1,#PLYlist do
if PLYlist[i].sid==sid then
PLYmap[PLYlist[i].sid]=nil
rem(PLYlist,i)
freshPos()
break
end
end
end
function netPLY.getCount()return #PLYlist end

View File

@@ -244,7 +244,7 @@ local function loadRemoteEnv(P,confStr)--Load gameEnv
confStr=JSON.decode(confStr)
if not confStr then
confStr={}
LOG.print("Bad conf from "..P.username.."#"..P.uid)
MES.new("Bad conf from "..P.username.."#"..P.uid)
end
P.gameEnv={}--Current game setting environment

View File

@@ -222,7 +222,7 @@ return function(P)--Return a piece-generating funtion for player P
elseif type(s)=='string'and seqGenerators[s]then
return seqGenerators[s]
else
LOG.print(
MES.new(
type(s)=='string'and
"No sequence mode called "..s or
"Wrong sequence generator",

View File

@@ -1,5 +1,5 @@
local max,min=math.max,math.min
local int,abs,rnd=math.floor,math.abs,math.random
local int,abs=math.floor,math.abs
local rem=table.remove
local assert,resume,status=assert,coroutine.resume,coroutine.status
@@ -281,8 +281,8 @@ function update.alive(P,dt)
--Drop pressed
if P.keyPressing[7]and not P.keyPressing[9]then
local d=P.downing-ENV.sddas
P.downing=P.downing+1
local d=P.downing-ENV.sddas
if d>1 then
if ENV.sdarr>0 then
if d%ENV.sdarr==0 then
@@ -411,13 +411,12 @@ end
function update.remote_alive(P,dt)
local frameRate=(P.stream[#P.stream-1]or 0)-P.frameRun
frameRate=
frameRate<20 and 1 or
frameRate<30 and rnd(2)or
frameRate<60 and 2 or
frameRate<90 and 3 or
frameRate<26 and 1 or
frameRate<50 and 2 or
frameRate<80 and 3 or
frameRate<120 and 5 or
frameRate<150 and 7 or
frameRate<180 and 10 or
frameRate<160 and 7 or
frameRate<200 and 10 or
20
for _=1,frameRate do
local eventTime=P.stream[P.streamProgress]
@@ -460,6 +459,7 @@ function update.remote_alive(P,dt)
P.streamProgress=P.streamProgress+2
else--No event now, run one frame
update.alive(P,dt/frameRate)
P.stat.time=P.frameRun/60
end
else--Pause state, no actions, quit loop
break

View File

@@ -116,16 +116,16 @@ local function tapBoard(x,y,key)
if checkBoard(b)then
state=2
time=TIME()-startTime
if time<1 then LOG.print("不是人")
elseif time<2 then LOG.print("还是人")
elseif time<3 then LOG.print("神仙")
elseif time<5 then LOG.print("太强了")
elseif time<7.5 then LOG.print("很强")
elseif time<10 then LOG.print("可以的")
elseif time<20 then LOG.print("马上入门了")
elseif time<30 then LOG.print("入门不远了")
elseif time<60 then LOG.print("多加练习")
else LOG.print("第一次玩?加油")
if time<1 then MES.new("不是人")
elseif time<2 then MES.new("还是人")
elseif time<3 then MES.new("神仙")
elseif time<5 then MES.new("太强了")
elseif time<7.5 then MES.new("很强")
elseif time<10 then MES.new("可以的")
elseif time<20 then MES.new("马上入门了")
elseif time<30 then MES.new("入门不远了")
elseif time<60 then MES.new("多加练习")
else MES.new("第一次玩?加油")
end
SFX.play('win')
return

View File

@@ -218,6 +218,8 @@ function scene.mouseMove(x,y)
x,y=int((x-280)/80),int(y/80)
curX,curx=int(x/3)+int(y/3)*3+1,x%3+y%3*3+1
if
x<0 or x>8 or
y<0 or y>8 or
curX<1 or curX>9 or
curx<1 or curx>9 or
score[curX]or

View File

@@ -544,12 +544,13 @@ local commands={}do
log(APPs[i].code..": "..APPs[i].description)
end
elseif name~=""then
local i=TABLE.find(APPs,name)
if i then
SCN.go(APPs[i].scene)
else
log{C.A,"No this applet"}
for i=1,#APPs do
if APPs[i].code==name then
SCN.go(APPs[i].scene)
return
end
end
log{C.A,"No this applet"}
else
log{C.A,"Usage:"}
log{C.A,"app -list"}

View File

@@ -51,13 +51,13 @@ function scene.keyDown(key)
if key=="return"or key=="return2"then
if CUSTOMENV.opponent~="X"then
if CUSTOMENV.opponent:sub(1,2)=='CC'and CUSTOMENV.sequence=="fixed"then
LOG.print(text.ai_fixed,'warn')
MES.new(text.ai_fixed)
return
elseif #BAG>0 then
LOG.print(text.ai_prebag,'warn')
MES.new(text.ai_prebag)
return
elseif #MISSION>0 then
LOG.print(text.ai_mission,'warn')
MES.new(text.ai_mission)
return
end
end
@@ -95,7 +95,7 @@ function scene.keyDown(key)
str=str.."!"
if #MISSION>0 then str=str..DATA.copyMission()end
sys.setClipboardText(str.."!"..DATA.copyBoards().."!")
LOG.print(text.exportSuccess,'message')
MES.new(text.exportSuccess)
elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then
local str=sys.getClipboardText()
local args=STRING.split(str:sub((str:find(":")or 0)+1),"!")
@@ -111,9 +111,9 @@ function scene.keyDown(key)
if args[i]:find("%S")and not DATA.pasteBoard(args[i],i-3)and i<#args then goto THROW_fail end
end
freshMiniFieldVisible()
LOG.print(text.importSuccess,'message')
MES.new(text.importSuccess)
do return end
::THROW_fail::LOG.print(text.dataCorrupted,'error')
::THROW_fail::MES.new(text.dataCorrupted)
elseif key=="escape"then
FILE.save(CUSTOMENV,'conf/customEnv','q')
SCN.back()

View File

@@ -216,20 +216,20 @@ function scene.keyDown(key)
SFX.play('fall',.8)
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
sys.setClipboardText("Techmino Field:"..DATA.copyBoard(page))
LOG.print(text.exportSuccess,'message')
MES.new(text.exportSuccess)
elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then
local str=sys.getClipboardText()
local p=str:find(":")--ptr*
if p then
if not str:sub(1,p-1):find("Field")then
LOG.print(text.pasteWrongPlace,'warn')
MES.new(text.pasteWrongPlace)
end
str=str:sub(p+1)
end
if DATA.pasteBoard(str,page)then
LOG.print(text.importSuccess,'message')
MES.new(text.importSuccess)
else
LOG.print(text.dataCorrupted,'error')
MES.new(text.dataCorrupted)
end
elseif key=="pageup"then
page=max(page-1,1)

View File

@@ -71,22 +71,22 @@ function scene.keyDown(key)
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
if #MISSION>0 then
sys.setClipboardText("Techmino Target:"..DATA.copyMission())
LOG.print(text.exportSuccess,'message')
MES.new(text.exportSuccess)
end
elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then
local str=sys.getClipboardText()
local p=str:find(":")--ptr*
if p then
if not str:sub(1,p-1):find("Target")then
LOG.print(text.pasteWrongPlace,'warn')
MES.new(text.pasteWrongPlace)
end
str=str:sub(p+1)
end
if DATA.pasteMission(str)then
LOG.print(text.importSuccess,'message')
MES.new(text.importSuccess)
cur=#MISSION
else
LOG.print(text.dataCorrupted,'error')
MES.new(text.dataCorrupted)
end
elseif key=="escape"then
SCN.back()

View File

@@ -85,22 +85,22 @@ function scene.keyDown(key)
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
if #BAG>0 then
sys.setClipboardText("Techmino SEQ:"..DATA.copySequence())
LOG.print(text.exportSuccess,'message')
MES.new(text.exportSuccess)
end
elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then
local str=sys.getClipboardText()
local p=str:find(":")--ptr*
if p then
if not str:sub(1,p-1):find("SEQ")then
LOG.print(text.pasteWrongPlace,'warn')
MES.new(text.pasteWrongPlace)
end
str=str:sub(p+1)
end
if DATA.pasteSequence(str)then
LOG.print(text.importSuccess,'message')
MES.new(text.importSuccess)
cur=#BAG
else
LOG.print(text.dataCorrupted,'error')
MES.new(text.dataCorrupted)
end
elseif key=="escape"then
SCN.back()

View File

@@ -6,9 +6,9 @@ local savePW=false
local function login()
local email,password=emailBox:getText(),passwordBox:getText()
if not STRING.simpEmailCheck(email)then
LOG.print(text.wrongEmail,'warn')return
MES.new(text.wrongEmail)return
elseif #password==0 then
LOG.print(text.noPassword,'warn')return
MES.new(text.noPassword)return
end
NET.wsconn_user_pswd(email,password)
if savePW then

View File

@@ -67,7 +67,7 @@ function scene.keyDown(key)
NET.tryLogin(false)
else
NET.wsconn_app()
LOG.print(text.wsConnecting,'message')
MES.new(text.wsConnecting)
SFX.play('connect')
end
end

View File

@@ -35,7 +35,7 @@ local function _quit()
NET.signal_quit()
else
lastBackTime=TIME()
LOG.print(text.sureQuit,'warn')
MES.new(text.sureQuit)
end
end
local function _switchChat()
@@ -133,7 +133,7 @@ function scene.keyDown(key)
if #mes>0 then
NET.sendMessage(mes)
inputBox:clear()
elseif #EDITING==0 then
else
_switchChat()
end
else
@@ -220,7 +220,7 @@ function scene.socketRead(cmd,d)
resetGameData('n',NET.seed)
netPLY.mouseMove(0,0)
else
LOG.print("Redundant [Go]",'warn')
MES.new("Redundant [Go]")
end
elseif cmd=='finish'then
playing=false

View File

@@ -16,7 +16,7 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newKey{name="setting",fText=TEXTURE.setting,x=1200,y=160,w=90,h=90,code=goScene'setting_game'},
WIDGET.newKey{name="match",x=640,y=500,w=760,h=140,font=60,code=function()LOG.print("Coming soon 开发中,敬请期待")end},
WIDGET.newKey{name="match",x=640,y=500,w=760,h=140,font=60,code=function()MES.new("Coming soon 开发中,敬请期待")end},
WIDGET.newButton{name="back",x=1140,y=640,w=170,h=80,fText=TEXTURE.back,code=backScene},
}

View File

@@ -18,7 +18,7 @@ end
scene.widgetList={
WIDGET.newKey{name="setting",fText=TEXTURE.setting,x=1200,y=160,w=90,h=90,code=goScene'setting_game'},
WIDGET.newButton{name="league", x=640, y=180,w=350,h=120,font=40,color='D',code=goScene'net_league'},
WIDGET.newButton{name="ffa", x=640, y=360,w=350,h=120,font=40,color='D',code=function()LOG.print("Coming soon 开发中,敬请期待")--[[NET.enterRoom({name="ffa"})]]end},
WIDGET.newButton{name="ffa", x=640, y=360,w=350,h=120,font=40,color='D',code=function()MES.new("Coming soon 开发中,敬请期待")--[[NET.enterRoom({name="ffa"})]]end},
WIDGET.newButton{name="rooms", x=640, y=540,w=350,h=120,font=40,code=goScene'net_rooms'},
WIDGET.newButton{name="logout", x=880, y=40,w=180,h=60,color='dR',
code=function()
@@ -32,7 +32,7 @@ scene.widgetList={
SCN.back()
end
else
LOG.print(text.sureQuit,'warn')
MES.new(text.sureQuit)
lastLogoutTime=TIME()
end
end},

View File

@@ -43,10 +43,10 @@ function scene.sceneBack()
end
function scene.keyDown(k)
if k=="return"and #EDITING==0 then
if k=="return"then
createRoom()
elseif k=="escape"then
SCN.go('net_rooms')
SCN.back()
else
WIDGET.keyPressed(k)
end
@@ -85,11 +85,11 @@ scene.widgetList={
ROOMENV.capacity=i
WIDGET.active.capacity.color=COLOR.lY
else
LOG.print("没有权限 Permission Denied",'warn')
MES.new("没有权限 Permission Denied")
WIDGET.active.capacity.color=COLOR.R
end
end},
WIDGET.newButton{name="create", x=1070,y=480,w=310,h=140,color='lY',font=40,code=pressKey"return"},
WIDGET.newButton{name="create", x=1070,y=480,w=310,h=140,color='lN',font=40,code=pressKey"return"},
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,fText=TEXTURE.back,code=backScene},
--Special rules

View File

@@ -61,8 +61,8 @@ function scene.keyDown(k)
elseif k=="return"then
if NET.getlock('fetchRoom')or not NET.roomList[selected]then return end
local R=NET.roomList[selected]
if R.roomInfo.version~=VERSION.short then LOG.print("Version doesn't match",'message')return end
if R.private then LOG.print("Can't enter private room now",'message')return end
if R.roomInfo.version~=VERSION.short then MES.new("Version doesn't match")return end
if R.private then MES.new("Can't enter private room now")return end
NET.enterRoom(R)--,password
end
end

View File

@@ -6,13 +6,13 @@ local function register()
local password= WIDGET.active.password:getText()
local password2=WIDGET.active.password2:getText()
if #username==0 then
LOG.print(text.noUsername,'warn')return
MES.new(text.noUsername)return
elseif not STRING.simpEmailCheck(email)then
LOG.print(text.wrongEmail,'warn')return
MES.new(text.wrongEmail)return
elseif #password==0 or #password2==0 then
LOG.print(text.noPassword,'warn')return
MES.new(text.noPassword)return
elseif password~=password2 then
LOG.print(text.diffPassword,'warn')return
MES.new(text.diffPassword)return
end
NET.register(username,email,password)
end

View File

@@ -2,7 +2,7 @@ local scene={}
local function dumpCB(T)
love.system.setClipboardText(STRING.packText(TABLE.dump(T)))
LOG.print(text.exportSuccess,'message')
MES.new(text.exportSuccess)
end
local function parseCB()
local _
@@ -10,7 +10,7 @@ local function parseCB()
--Decode
s=STRING.unpackText(s)
if not s then LOG.print(text.dataCorrupted,'error')return end
if not s then MES.new(text.dataCorrupted)return end
s=loadstring(s)
if s then
@@ -32,9 +32,9 @@ scene.widgetList={
if D then
TABLE.update(D,RANKS)
FILE.save(RANKS,'conf/unlock')
LOG.print(text.importSuccess,'message')
MES.new(text.importSuccess)
else
LOG.print(text.dataCorrupted,'warn')
MES.new(text.dataCorrupted)
end
end},
WIDGET.newButton{name="data", x=490,y=390,w=280,h=100,color='lR',
@@ -43,9 +43,9 @@ scene.widgetList={
if D and D.version==STAT.version then
TABLE.update(D,STAT)
FILE.save(STAT,'conf/data')
LOG.print(text.importSuccess,'message')
MES.new(text.importSuccess)
else
LOG.print(text.dataCorrupted,'warn')
MES.new(text.dataCorrupted)
end
end},
WIDGET.newButton{name="setting", x=790,y=390,w=280,h=100,color='lR',
@@ -54,9 +54,9 @@ scene.widgetList={
if D then
TABLE.update(D,SETTING)
FILE.save(SETTING,'conf/settings')
LOG.print(text.importSuccess,'message')
MES.new(text.importSuccess)
else
LOG.print(text.dataCorrupted,'warn')
MES.new(text.dataCorrupted)
end
end},
WIDGET.newButton{name="vk", x=1090,y=390,w=280,h=100,color='lR',
@@ -65,9 +65,9 @@ scene.widgetList={
if D then
TABLE.update(D,VK_org)
FILE.save(VK_org,'conf/virtualkey')
LOG.print(text.importSuccess,'message')
MES.new(text.importSuccess)
else
LOG.print(text.dataCorrupted,'warn')
MES.new(text.dataCorrupted)
end
end},

View File

@@ -16,7 +16,7 @@ local function load1()
if D then
TABLE.update(D,VK_org)
else
LOG.print(text.noFile,'message')
MES.new(text.noFile)
end
end
local function save2()
@@ -27,7 +27,7 @@ local function load2()
if D then
TABLE.update(D,VK_org)
else
LOG.print(text.noFile,'message')
MES.new(text.noFile)
end
end
@@ -188,7 +188,7 @@ scene.widgetList={
B.x,B.y,B.r=T[2],T[3],T[4]
end
end
LOG.print(("==[ %d ]=="):format(defaultSetSelect))
MES.new(("==[ %d ]=="):format(defaultSetSelect))
defaultSetSelect=defaultSetSelect%5+1
selected=false
end},

View File

@@ -35,7 +35,7 @@ function scene.keyDown(key)
if backCounter==0 then
SCN.back()
else
LOG.print(backCounter)
MES.new(backCounter)
end
end
end

View File

@@ -4,6 +4,6 @@ vec4 effect(vec4 color,Image tex,vec2 tex_coords,vec2 scr_coords){
pow(texcolor.r+.26,.7023),
pow(texcolor.g+.26,.7023),
pow(texcolor.b+.26,.7023),
texcolor.a
texcolor.a*color.a
);
}

View File

@@ -1,8 +1,7 @@
extern float w,h;
extern float w;
extern float level;
vec4 effect(vec4 color,Image tex,vec2 tex_coords,vec2 scr_coords){
float dx=abs(scr_coords.x/w-0.5);
float dy=abs(scr_coords.y/h-0.5);
float a=(max(dx*2.6,dy*1.8)-.626)*level;
float a=(dx*2.6-.626)*level;
return vec4(1.,0.,0.,a);
}

View File

@@ -32,7 +32,7 @@ function SKIN.init(list)
I=gc.newImage(N)
else
I=gc.newImage("media/image/skin/"..list[1]..".png")
LOG.print("No skin file: "..list[i],'warn')
MES.new("No skin file: "..list[i])
end
gc.setDefaultFilter('linear','linear')
for y=0,2 do