Compare commits
27 Commits
pre0.17.0-
...
pre0.17.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
afa69ce9a4 | ||
|
|
3226c0c831 | ||
|
|
4e759cad4c | ||
|
|
291795928d | ||
|
|
a1315e7f7f | ||
|
|
657bc2b4e0 | ||
|
|
d8b12fc55d | ||
|
|
6d11367ea4 | ||
|
|
eb9e741b4f | ||
|
|
c47546d501 | ||
|
|
11aa178fc1 | ||
|
|
f3a88ef269 | ||
|
|
720dc2131f | ||
|
|
701ef17ae1 | ||
|
|
1a689a5f07 | ||
|
|
ef12ab0cee | ||
|
|
3d26db7a01 | ||
|
|
dd3df9981b | ||
|
|
5d04e83529 | ||
|
|
7ed4626d71 | ||
|
|
ecf5a29a71 | ||
|
|
1a24b346a0 | ||
|
|
72d06c7a02 | ||
|
|
26fde8c694 | ||
|
|
8adeb99be7 | ||
|
|
c92f15156b | ||
|
|
63f69d712b |
@@ -1,66 +1,60 @@
|
|||||||
local fs=love.filesystem
|
local fs=love.filesystem
|
||||||
local FILE={}
|
local FILE={}
|
||||||
function FILE.load(name,mode)
|
function FILE.load(name,args)
|
||||||
|
if not args then args=''end
|
||||||
if fs.getInfo(name)then
|
if fs.getInfo(name)then
|
||||||
local F=fs.newFile(name)
|
local F=fs.newFile(name)
|
||||||
if F:open'r'then
|
assert(F:open'r','open error')
|
||||||
local s=F:read()
|
local s=F:read()F:close()
|
||||||
F:close()
|
if args:sArg'-luaon'or args==''and s:sub(1,6)=='return{'then
|
||||||
if mode=='luaon'or not mode and s:sub(1,6)=="return{"then
|
local func=loadstring(s)
|
||||||
s=loadstring(s)
|
if func then
|
||||||
if s then
|
setfenv(func,{})
|
||||||
setfenv(s,{})
|
local res=func()
|
||||||
return s()
|
return assert(res,'decode error')
|
||||||
end
|
|
||||||
elseif mode=='json'or not mode and s:sub(1,1)=="["and s:sub(-1)=="]"or s:sub(1,1)=="{"and s:sub(-1)=="}"then
|
|
||||||
local res=JSON.decode(s)
|
|
||||||
if res then
|
|
||||||
return res
|
|
||||||
end
|
|
||||||
elseif mode=='string'or not mode then
|
|
||||||
return s
|
|
||||||
else
|
else
|
||||||
MES.new("No file loading mode called "..tostring(mode))
|
error('decode error')
|
||||||
end
|
end
|
||||||
|
elseif args:sArg'-json'or args==''and s:sub(1,1)=='['and s:sub(-1)==']'or s:sub(1,1)=='{'and s:sub(-1)=='}'then
|
||||||
|
local res=JSON.decode(s)
|
||||||
|
if res then
|
||||||
|
return res
|
||||||
|
end
|
||||||
|
error('decode error')
|
||||||
|
elseif args:sArg'-string'or args==''then
|
||||||
|
return s
|
||||||
else
|
else
|
||||||
MES.new('error',name.." "..text.loadError)
|
error('unknown mode')
|
||||||
end
|
end
|
||||||
|
else
|
||||||
|
error('no file')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function FILE.save(data,name,mode)
|
function FILE.save(data,name,args)
|
||||||
if not mode then mode=""end
|
if not args then args=''end
|
||||||
|
if args:sArg'-d'and fs.getInfo(name)then
|
||||||
|
error('duplicate')
|
||||||
|
end
|
||||||
|
|
||||||
if type(data)=='table'then
|
if type(data)=='table'then
|
||||||
if mode:find'l'then
|
if args:sArg'-luaon'then
|
||||||
data=TABLE.dump(data)
|
data=TABLE.dump(data)
|
||||||
if not data then
|
if not data then
|
||||||
MES.new('error',name.." "..text.saveError.."dump error")
|
error('encode error')
|
||||||
return
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
data=JSON.encode(data)
|
data=JSON.encode(data)
|
||||||
if not data then
|
if not data then
|
||||||
MES.new('error',name.." "..text.saveError.."json error")
|
error('encode error')
|
||||||
return
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
data=tostring(data)
|
data=tostring(data)
|
||||||
end
|
end
|
||||||
|
|
||||||
if mode:find'd'and fs.getInfo(name)then
|
|
||||||
MES.new('error',text.saveError_duplicate)
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local F=fs.newFile(name)
|
local F=fs.newFile(name)
|
||||||
F:open'w'
|
assert(F:open('w'),'open error')
|
||||||
local success,mes=F:write(data)
|
F:write(data)F:flush()F:close()
|
||||||
F:flush()F:close()
|
|
||||||
if success then
|
|
||||||
return true
|
|
||||||
else
|
|
||||||
MES.new('error',text.saveError..(mes or"unknown error"))
|
|
||||||
MES.traceback()
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
function FILE.clear(path)
|
function FILE.clear(path)
|
||||||
if fs.getRealDirectory(path)==SAVEDIR and fs.getInfo(path).type=='directory'then
|
if fs.getRealDirectory(path)==SAVEDIR and fs.getInfo(path).type=='directory'then
|
||||||
|
|||||||
@@ -1,67 +1,60 @@
|
|||||||
local gc=love.graphics
|
local gc=love.graphics
|
||||||
local set=gc.setFont
|
local set=gc.setFont
|
||||||
local fontCache={}
|
local fontFiles,fontCache={},{}
|
||||||
local currentFontSize
|
local defaultFont,defaultFallBack
|
||||||
|
local curFont=false--Current using font object
|
||||||
|
|
||||||
local FONT={}
|
local FONT={}
|
||||||
function FONT.set(s)
|
function FONT.setDefault(name)defaultFont=name end
|
||||||
if s~=currentFontSize then
|
function FONT.setFallback(name)defaultFallBack=name end
|
||||||
if not fontCache[s]then
|
function FONT.rawget(s)
|
||||||
fontCache[s]=gc.setNewFont(s,'light',gc.getDPIScale()*SCR.k*2)
|
|
||||||
end
|
|
||||||
set(fontCache[s])
|
|
||||||
currentFontSize=s
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function FONT.get(s)
|
|
||||||
if not fontCache[s]then
|
if not fontCache[s]then
|
||||||
fontCache[s]=gc.setNewFont(s,'light',gc.getDPIScale()*SCR.k*2)
|
fontCache[s]=gc.setNewFont(s,'light',gc.getDPIScale()*SCR.k*2)
|
||||||
end
|
end
|
||||||
return fontCache[s]
|
return fontCache[s]
|
||||||
end
|
end
|
||||||
function FONT.reset()
|
function FONT.rawset(s)
|
||||||
for s in next,fontCache do
|
set(fontCache[s]or FONT.rawget(s))
|
||||||
fontCache[s]=gc.setNewFont(s,'light',gc.getDPIScale()*SCR.k*2)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
function FONT.load(fonts)
|
||||||
function FONT.load(mainFont,secFont)
|
for name,path in next,fonts do
|
||||||
assert(love.filesystem.getInfo(mainFont),"Font file '"..mainFont.."' not exist!")
|
assert(love.filesystem.getInfo(path),("Font file $1($2) not exist!"):repD(name,path))
|
||||||
mainFont=love.filesystem.newFile(mainFont)
|
fontFiles[name]=love.filesystem.newFile(path)
|
||||||
if secFont and love.filesystem.getInfo(secFont)then
|
fontCache[name]={}
|
||||||
secFont=love.filesystem.newFile(secFont)
|
|
||||||
else
|
|
||||||
secFont=false
|
|
||||||
end
|
|
||||||
function FONT.set(s)
|
|
||||||
if s~=currentFontSize then
|
|
||||||
if not fontCache[s]then
|
|
||||||
fontCache[s]=gc.setNewFont(mainFont,s,'light',gc.getDPIScale()*SCR.k*2)
|
|
||||||
if secFont then
|
|
||||||
fontCache[s]:setFallbacks(gc.setNewFont(secFont,s,'light',gc.getDPIScale()*SCR.k*2))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
set(fontCache[s])
|
|
||||||
currentFontSize=s
|
|
||||||
end
|
|
||||||
end
|
|
||||||
function FONT.get(s)
|
|
||||||
if not fontCache[s]then
|
|
||||||
fontCache[s]=gc.setNewFont(mainFont,s,'light',gc.getDPIScale()*SCR.k*2)
|
|
||||||
if secFont then
|
|
||||||
fontCache[s]:setFallbacks(gc.setNewFont(secFont,s,'light',gc.getDPIScale()*SCR.k*2))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return fontCache[s]
|
|
||||||
end
|
|
||||||
function FONT.reset()
|
|
||||||
for s in next,fontCache do
|
|
||||||
fontCache[s]=gc.setNewFont(mainFont,s,'light',gc.getDPIScale()*SCR.k*2)
|
|
||||||
if secFont then
|
|
||||||
fontCache[s]:setFallbacks(gc.setNewFont(secFont,s,'light',gc.getDPIScale()*SCR.k*2))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
FONT.reset()
|
FONT.reset()
|
||||||
end
|
end
|
||||||
|
function FONT.get(size,name)
|
||||||
|
if not name then name=defaultFont end
|
||||||
|
local f=fontCache[name][size]
|
||||||
|
if not f then
|
||||||
|
f=gc.setNewFont(fontFiles[name],size,'light',gc.getDPIScale()*SCR.k*2)
|
||||||
|
if defaultFallBack and name~=defaultFallBack then
|
||||||
|
f:setFallbacks(FONT.get(size,defaultFallBack))
|
||||||
|
end
|
||||||
|
fontCache[name][size]=f
|
||||||
|
end
|
||||||
|
return f
|
||||||
|
end
|
||||||
|
function FONT.set(size,name)
|
||||||
|
if not name then name=defaultFont end
|
||||||
|
|
||||||
|
local f=fontCache[name][size]
|
||||||
|
if f~=curFont then
|
||||||
|
curFont=f or FONT.get(size,name)
|
||||||
|
set(curFont)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function FONT.reset()
|
||||||
|
for name,cache in next,fontCache do
|
||||||
|
if type(cache)=='table'then
|
||||||
|
for size in next,cache do
|
||||||
|
cache[size]=FONT.get(size,name)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
fontCache[name]=FONT.rawget(name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return FONT
|
return FONT
|
||||||
|
|||||||
@@ -95,6 +95,7 @@ do--function GC.DO(L)
|
|||||||
setLJ="setLineJoin",
|
setLJ="setLineJoin",
|
||||||
|
|
||||||
print="print",
|
print="print",
|
||||||
|
rawFT=function(...)FONT.rawset(...)end,
|
||||||
setFT=function(...)FONT.set(...)end,
|
setFT=function(...)FONT.set(...)end,
|
||||||
mText=GC.mStr,
|
mText=GC.mStr,
|
||||||
mDraw=GC.draw,
|
mDraw=GC.draw,
|
||||||
|
|||||||
@@ -339,8 +339,8 @@ function love.gamepadaxis(JS,axis,val)
|
|||||||
if js then
|
if js then
|
||||||
if axis=='leftx'or axis=='lefty'or axis=='rightx'or axis=='righty'then
|
if axis=='leftx'or axis=='lefty'or axis=='rightx'or axis=='righty'then
|
||||||
local newVal=--range: [0,1]
|
local newVal=--range: [0,1]
|
||||||
val>.5 and 1 or
|
val>.4 and 1 or
|
||||||
val<-.5 and -1 or
|
val<-.4 and -1 or
|
||||||
0
|
0
|
||||||
if newVal~=js[axis]then
|
if newVal~=js[axis]then
|
||||||
if js[axis]==-1 then
|
if js[axis]==-1 then
|
||||||
@@ -356,7 +356,7 @@ function love.gamepadaxis(JS,axis,val)
|
|||||||
js[axis]=newVal
|
js[axis]=newVal
|
||||||
end
|
end
|
||||||
elseif axis=='triggerleft'or axis=='triggerright'then
|
elseif axis=='triggerleft'or axis=='triggerright'then
|
||||||
local newVal=val>0 and 1 or 0--range: [-1,1]
|
local newVal=val>-.3 and 1 or 0--range: [-1,1]
|
||||||
if newVal~=js[axis]then
|
if newVal~=js[axis]then
|
||||||
if newVal==1 then
|
if newVal==1 then
|
||||||
love.gamepadpressed(JS,jsAxisEventName[axis])
|
love.gamepadpressed(JS,jsAxisEventName[axis])
|
||||||
@@ -527,17 +527,17 @@ local wsBottomImage do
|
|||||||
wsBottomImage=GC.DO(L)
|
wsBottomImage=GC.DO(L)
|
||||||
end
|
end
|
||||||
local ws_deadImg=GC.DO{20,20,
|
local ws_deadImg=GC.DO{20,20,
|
||||||
{'setFT',20},
|
{'rawFT',20},
|
||||||
{'setCL',1,.3,.3},
|
{'setCL',1,.3,.3},
|
||||||
{'mText',"X",11,-1},
|
{'mText',"X",11,-1},
|
||||||
}
|
}
|
||||||
local ws_connectingImg=GC.DO{20,20,
|
local ws_connectingImg=GC.DO{20,20,
|
||||||
{'setFT',20},
|
{'rawFT',20},
|
||||||
{'setLW',3},
|
{'setLW',3},
|
||||||
{'mText',"C",11,-1},
|
{'mText',"C",11,-1},
|
||||||
}
|
}
|
||||||
local ws_runningImg=GC.DO{20,20,
|
local ws_runningImg=GC.DO{20,20,
|
||||||
{'setFT',20},
|
{'rawFT',20},
|
||||||
{'setCL',.5,1,0},
|
{'setCL',.5,1,0},
|
||||||
{'mText',"R",11,-1},
|
{'mText',"R",11,-1},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,25 @@ local data=love.data
|
|||||||
local STRING={}
|
local STRING={}
|
||||||
local assert,tostring,tonumber=assert,tostring,tonumber
|
local assert,tostring,tonumber=assert,tostring,tonumber
|
||||||
local int,format=math.floor,string.format
|
local int,format=math.floor,string.format
|
||||||
local find,sub,upper=string.find,string.sub,string.upper
|
local find,sub,gsub,upper=string.find,string.sub,string.gsub,string.upper
|
||||||
local char,byte=string.char,string.byte
|
local char,byte=string.char,string.byte
|
||||||
|
|
||||||
|
--"Replace dollars", replace all $n with ...
|
||||||
|
function string.repD(str,...)
|
||||||
|
local l={...}
|
||||||
|
for i=#l,1,-1 do
|
||||||
|
str=gsub(str,'$'..i,l[i])
|
||||||
|
end
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
|
||||||
|
--"Scan arg", scan if str has the arg (format of str is like "-json -q", arg is like "-q")
|
||||||
|
function string.sArg(str,switch)
|
||||||
|
if find(str.." ",switch.." ")then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
do--function STRING.shiftChar(c)
|
do--function STRING.shiftChar(c)
|
||||||
local shiftMap={
|
local shiftMap={
|
||||||
['1']='!',['2']='@',['3']='#',['4']='$',['5']='%',
|
['1']='!',['2']='@',['3']='#',['4']='$',['5']='%',
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ local clearIcon=GC.DO{40,40,
|
|||||||
{'fRect',11,14,18,21},
|
{'fRect',11,14,18,21},
|
||||||
}
|
}
|
||||||
local sureIcon=GC.DO{40,40,
|
local sureIcon=GC.DO{40,40,
|
||||||
{'setFT',35},
|
{'rawFT',35},
|
||||||
{'mText',"?",20,0},
|
{'mText',"?",20,0},
|
||||||
}
|
}
|
||||||
local smallerThen=GC.DO{20,20,
|
local smallerThen=GC.DO{20,20,
|
||||||
@@ -82,7 +82,7 @@ function text:draw()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,align='M'][,hideF][,hide]
|
function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,fType][,align='M'][,hideF][,hide]
|
||||||
local _={
|
local _={
|
||||||
name= D.name or"_",
|
name= D.name or"_",
|
||||||
x= D.x,
|
x= D.x,
|
||||||
@@ -91,6 +91,7 @@ function WIDGET.newText(D)--name,x,y[,fText][,color][,font=30][,align='M'][,hide
|
|||||||
fText=D.fText,
|
fText=D.fText,
|
||||||
color=D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
color=D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||||
font= D.font or 30,
|
font= D.font or 30,
|
||||||
|
fType=D.fType,
|
||||||
align=D.align or'M',
|
align=D.align or'M',
|
||||||
hideF=D.hideF,
|
hideF=D.hideF,
|
||||||
}
|
}
|
||||||
@@ -139,7 +140,7 @@ function button:reset()
|
|||||||
end
|
end
|
||||||
function button:setObject(obj)
|
function button:setObject(obj)
|
||||||
if type(obj)=='string'or type(obj)=='number'then
|
if type(obj)=='string'or type(obj)=='number'then
|
||||||
self.obj=gc.newText(FONT.get(self.font),obj)
|
self.obj=gc.newText(FONT.get(self.font,self.fType),obj)
|
||||||
elseif obj then
|
elseif obj then
|
||||||
self.obj=obj
|
self.obj=obj
|
||||||
end
|
end
|
||||||
@@ -209,7 +210,7 @@ function button:draw()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function button:getInfo()
|
function button:getInfo()
|
||||||
return("x=%d,y=%d,w=%d,h=%d,font=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font)
|
return("x=%d,y=%d,w=%d,h=%d,font=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font,self.fType)
|
||||||
end
|
end
|
||||||
function button:press(_,_,k)
|
function button:press(_,_,k)
|
||||||
self.code(k)
|
self.code(k)
|
||||||
@@ -225,7 +226,7 @@ function button:press(_,_,k)
|
|||||||
SFX.play('button')
|
SFX.play('button')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hideF][,hide]
|
function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0],code[,hideF][,hide]
|
||||||
if not D.h then D.h=D.w end
|
if not D.h then D.h=D.w end
|
||||||
local _={
|
local _={
|
||||||
name= D.name or"_",
|
name= D.name or"_",
|
||||||
@@ -246,6 +247,7 @@ function WIDGET.newButton(D)--name,x,y,w[,h][,fText][,color][,font=30][,sound=tr
|
|||||||
fText=D.fText,
|
fText=D.fText,
|
||||||
color=D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
color=D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||||
font= D.font or 30,
|
font= D.font or 30,
|
||||||
|
fType=D.fType,
|
||||||
align=D.align or'M',
|
align=D.align or'M',
|
||||||
edge= D.edge or 0,
|
edge= D.edge or 0,
|
||||||
sound=D.sound~=false,
|
sound=D.sound~=false,
|
||||||
@@ -268,7 +270,7 @@ function key:reset()
|
|||||||
end
|
end
|
||||||
function key:setObject(obj)
|
function key:setObject(obj)
|
||||||
if type(obj)=='string'or type(obj)=='number'then
|
if type(obj)=='string'or type(obj)=='number'then
|
||||||
self.obj=gc.newText(FONT.get(self.font),obj)
|
self.obj=gc.newText(FONT.get(self.font,self.fType),obj)
|
||||||
elseif obj then
|
elseif obj then
|
||||||
self.obj=obj
|
self.obj=obj
|
||||||
end
|
end
|
||||||
@@ -331,7 +333,7 @@ function key:draw()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function key:getInfo()
|
function key:getInfo()
|
||||||
return("x=%d,y=%d,w=%d,h=%d,font=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font)
|
return("x=%d,y=%d,w=%d,h=%d,font=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font,self.fType)
|
||||||
end
|
end
|
||||||
function key:press(_,_,k)
|
function key:press(_,_,k)
|
||||||
self.code(k)
|
self.code(k)
|
||||||
@@ -339,7 +341,7 @@ function key:press(_,_,k)
|
|||||||
SFX.play('key')
|
SFX.play('key')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,font=30][,sound=true][,align='M'][,edge=0],code[,hideF][,hide]
|
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0],code[,hideF][,hide]
|
||||||
if not D.h then D.h=D.w end
|
if not D.h then D.h=D.w end
|
||||||
local _={
|
local _={
|
||||||
name= D.name or"_",
|
name= D.name or"_",
|
||||||
@@ -362,6 +364,7 @@ function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,fo
|
|||||||
noFrame=D.noFrame,
|
noFrame=D.noFrame,
|
||||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||||
font= D.font or 30,
|
font= D.font or 30,
|
||||||
|
fType=D.fType,
|
||||||
sound= D.sound~=false,
|
sound= D.sound~=false,
|
||||||
align= D.align or'M',
|
align= D.align or'M',
|
||||||
edge= D.edge or 0,
|
edge= D.edge or 0,
|
||||||
@@ -430,7 +433,7 @@ function switch:draw()
|
|||||||
gc_draw(obj,x-12-ATV,y,nil,min(self.lim/obj:getWidth(),1),1,obj:getWidth(),obj:getHeight()*.5)
|
gc_draw(obj,x-12-ATV,y,nil,min(self.lim/obj:getWidth(),1),1,obj:getWidth(),obj:getHeight()*.5)
|
||||||
end
|
end
|
||||||
function switch:getInfo()
|
function switch:getInfo()
|
||||||
return("x=%d,y=%d,font=%d"):format(self.x,self.y,self.font)
|
return("x=%d,y=%d,font=%d"):format(self.x,self.y,self.font,self.fType)
|
||||||
end
|
end
|
||||||
function switch:press()
|
function switch:press()
|
||||||
self.code()
|
self.code()
|
||||||
@@ -438,7 +441,7 @@ function switch:press()
|
|||||||
SFX.play('touch')
|
SFX.play('touch')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function WIDGET.newSwitch(D)--name,x,y[,lim][,fText][,color][,font=30][,sound=true][,disp],code[,hideF][,hide]
|
function WIDGET.newSwitch(D)--name,x,y[,lim][,fText][,color][,font=30][,fType][,sound=true][,disp],code[,hideF][,hide]
|
||||||
local _={
|
local _={
|
||||||
name= D.name or"_",
|
name= D.name or"_",
|
||||||
|
|
||||||
@@ -453,6 +456,7 @@ function WIDGET.newSwitch(D)--name,x,y[,lim][,fText][,color][,font=30][,sound=tr
|
|||||||
fText=D.fText,
|
fText=D.fText,
|
||||||
color=D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
color=D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||||
font= D.font or 30,
|
font= D.font or 30,
|
||||||
|
fType=D.fType,
|
||||||
sound=D.sound~=false,
|
sound=D.sound~=false,
|
||||||
disp= D.disp,
|
disp= D.disp,
|
||||||
code= D.code,
|
code= D.code,
|
||||||
@@ -595,7 +599,7 @@ end
|
|||||||
function slider:arrowKey(k)
|
function slider:arrowKey(k)
|
||||||
self:scroll((k=="left"or k=="up")and -1 or 1)
|
self:scroll((k=="left"or k=="up")and -1 or 1)
|
||||||
end
|
end
|
||||||
function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,font=30][,change],disp[,show],code,hide
|
function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,font=30][,fType][,change],disp[,show],code,hide
|
||||||
local _={
|
local _={
|
||||||
name= D.name or"_",
|
name= D.name or"_",
|
||||||
|
|
||||||
@@ -617,6 +621,7 @@ function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,
|
|||||||
unit= D.unit or 1,
|
unit= D.unit or 1,
|
||||||
smooth=false,
|
smooth=false,
|
||||||
font= D.font or 30,
|
font= D.font or 30,
|
||||||
|
fType=D.fType,
|
||||||
change=D.change,
|
change=D.change,
|
||||||
disp= D.disp,
|
disp= D.disp,
|
||||||
code= D.code,
|
code= D.code,
|
||||||
@@ -863,7 +868,7 @@ function inputBox:draw()
|
|||||||
|
|
||||||
--Drawable
|
--Drawable
|
||||||
local f=self.font
|
local f=self.font
|
||||||
FONT.set(f)
|
FONT.set(f,self.fType)
|
||||||
if self.obj then
|
if self.obj then
|
||||||
mDraw_Y(self.obj,x-12-self.obj:getWidth(),y+h*.5)
|
mDraw_Y(self.obj,x-12-self.obj:getWidth(),y+h*.5)
|
||||||
end
|
end
|
||||||
@@ -906,7 +911,7 @@ function inputBox:keypress(k)
|
|||||||
self.value=t
|
self.value=t
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,secret][,regex][,limit],hide
|
function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,fType][,secret][,regex][,limit],hide
|
||||||
local _={
|
local _={
|
||||||
name= D.name or"_",
|
name= D.name or"_",
|
||||||
|
|
||||||
@@ -922,6 +927,7 @@ function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,secret][,regex][,limit
|
|||||||
},
|
},
|
||||||
|
|
||||||
font= D.font or int(D.h/7-1)*5,
|
font= D.font or int(D.h/7-1)*5,
|
||||||
|
fType=D.fType,
|
||||||
secret=D.secret==true,
|
secret=D.secret==true,
|
||||||
regex= D.regex,
|
regex= D.regex,
|
||||||
limit= D.limit,
|
limit= D.limit,
|
||||||
@@ -1022,7 +1028,7 @@ function textBox:draw()
|
|||||||
gc_rectangle('line',x,y,w,h,3)
|
gc_rectangle('line',x,y,w,h,3)
|
||||||
|
|
||||||
--Texts
|
--Texts
|
||||||
FONT.set(self.font)
|
FONT.set(self.font,self.fType)
|
||||||
gc_push('transform')
|
gc_push('transform')
|
||||||
gc_translate(x,y)
|
gc_translate(x,y)
|
||||||
|
|
||||||
@@ -1054,7 +1060,7 @@ end
|
|||||||
function textBox:getInfo()
|
function textBox:getInfo()
|
||||||
return("x=%d,y=%d,w=%d,h=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h)
|
return("x=%d,y=%d,w=%d,h=%d"):format(self.x+self.w*.5,self.y+self.h*.5,self.w,self.h)
|
||||||
end
|
end
|
||||||
function WIDGET.newTextBox(D)--name,x,y,w,h[,font=30][,lineH][,fix],hide
|
function WIDGET.newTextBox(D)--name,x,y,w,h[,font=30][,fType][,lineH][,fix],hide
|
||||||
local _={
|
local _={
|
||||||
name= D.name or"_",
|
name= D.name or"_",
|
||||||
|
|
||||||
@@ -1076,6 +1082,7 @@ function WIDGET.newTextBox(D)--name,x,y,w,h[,font=30][,lineH][,fix],hide
|
|||||||
h= D.h,
|
h= D.h,
|
||||||
|
|
||||||
font= D.font or 30,
|
font= D.font or 30,
|
||||||
|
fType=D.fType,
|
||||||
fix= D.fix,
|
fix= D.fix,
|
||||||
texts={},
|
texts={},
|
||||||
hideF=D.hideF,
|
hideF=D.hideF,
|
||||||
|
|||||||
32
main.lua
32
main.lua
@@ -50,7 +50,13 @@ local _LOADTIME_=TIME()
|
|||||||
|
|
||||||
--Load modules
|
--Load modules
|
||||||
Z=require'Zframework'
|
Z=require'Zframework'
|
||||||
FONT.load('parts/fonts/proportional.ttf')
|
FONT.load{
|
||||||
|
norm='parts/fonts/proportional.ttf',
|
||||||
|
mono='parts/fonts/monospaced.ttf',
|
||||||
|
}
|
||||||
|
FONT.setDefault('norm')
|
||||||
|
FONT.setFallback('norm')
|
||||||
|
|
||||||
SCR.setSize(1280,720)--Initialize Screen size
|
SCR.setSize(1280,720)--Initialize Screen size
|
||||||
BGM.setMaxSources(5)
|
BGM.setMaxSources(5)
|
||||||
BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end)
|
BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end)
|
||||||
@@ -205,15 +211,15 @@ end
|
|||||||
Z.setOnQuit(destroyPlayers)
|
Z.setOnQuit(destroyPlayers)
|
||||||
|
|
||||||
--Load settings and statistics
|
--Load settings and statistics
|
||||||
TABLE.cover (FILE.load('conf/user')or{},USER)
|
TABLE.cover (loadFile('conf/user')or{},USER)
|
||||||
TABLE.cover (FILE.load('conf/unlock')or{},RANKS)
|
TABLE.cover (loadFile('conf/unlock')or{},RANKS)
|
||||||
TABLE.update(FILE.load('conf/settings')or{},SETTING)
|
TABLE.update(loadFile('conf/settings')or{},SETTING)
|
||||||
TABLE.coverR(FILE.load('conf/data')or{},STAT)
|
TABLE.coverR(loadFile('conf/data')or{},STAT)
|
||||||
TABLE.cover (FILE.load('conf/key')or{},KEY_MAP)
|
TABLE.cover (loadFile('conf/key')or{},KEY_MAP)
|
||||||
TABLE.cover (FILE.load('conf/virtualkey')or{},VK_ORG)
|
TABLE.cover (loadFile('conf/virtualkey')or{},VK_ORG)
|
||||||
|
|
||||||
--Initialize fields, sequence, missions, gameEnv for cutsom game
|
--Initialize fields, sequence, missions, gameEnv for cutsom game
|
||||||
local fieldData=FILE.load('conf/customBoards','string')
|
local fieldData=loadFile('conf/customBoards','-string')
|
||||||
if fieldData then
|
if fieldData then
|
||||||
fieldData=STRING.split(fieldData,"!")
|
fieldData=STRING.split(fieldData,"!")
|
||||||
for i=1,#fieldData do
|
for i=1,#fieldData do
|
||||||
@@ -222,15 +228,15 @@ if fieldData then
|
|||||||
else
|
else
|
||||||
FIELD[1]=DATA.newBoard()
|
FIELD[1]=DATA.newBoard()
|
||||||
end
|
end
|
||||||
local sequenceData=FILE.load('conf/customSequence','string')
|
local sequenceData=loadFile('conf/customSequence','-string')
|
||||||
if sequenceData then
|
if sequenceData then
|
||||||
DATA.pasteSequence(sequenceData)
|
DATA.pasteSequence(sequenceData)
|
||||||
end
|
end
|
||||||
local missionData=FILE.load('conf/customMissions','string')
|
local missionData=loadFile('conf/customMissions','-string')
|
||||||
if missionData then
|
if missionData then
|
||||||
DATA.pasteMission(missionData)
|
DATA.pasteMission(missionData)
|
||||||
end
|
end
|
||||||
local customData=FILE.load('conf/customEnv')
|
local customData=loadFile('conf/customEnv')
|
||||||
if customData and customData['version']==VERSION.code then
|
if customData and customData['version']==VERSION.code then
|
||||||
TABLE.complete(customData,CUSTOMENV)
|
TABLE.complete(customData,CUSTOMENV)
|
||||||
end
|
end
|
||||||
@@ -477,6 +483,10 @@ do
|
|||||||
fs.remove('record/rhythm_h.rec')
|
fs.remove('record/rhythm_h.rec')
|
||||||
fs.remove('record/rhythm_u.rec')
|
fs.remove('record/rhythm_u.rec')
|
||||||
end
|
end
|
||||||
|
if RANKS.bigbang then
|
||||||
|
RANKS.clearRush,RANKS.bigbang=RANKS.bigbang
|
||||||
|
fs.remove('record/bigbang.rec')
|
||||||
|
end
|
||||||
if STAT.version~=VERSION.code then
|
if STAT.version~=VERSION.code then
|
||||||
for k,v in next,MODE_UPDATE_MAP do
|
for k,v in next,MODE_UPDATE_MAP do
|
||||||
if RANKS[k]then
|
if RANKS[k]then
|
||||||
|
|||||||
BIN
media/music/malate.ogg
Normal file
BIN
media/music/malate.ogg
Normal file
Binary file not shown.
@@ -140,8 +140,8 @@ do
|
|||||||
},--Z
|
},--Z
|
||||||
false,--S
|
false,--S
|
||||||
{
|
{
|
||||||
[01]={'+0+0','-1+0','-1+1','+0-2','+1+1','+0+1'},
|
[01]={'+0+0','-1+0','-1+1','+0-2','+1+1','+0+1','+0-1'},
|
||||||
[10]={'+0+0','+1+0','+1-1','+0+2','-1-1','+0-1'},
|
[10]={'+0+0','+1+0','+1-1','+0+2','-1-1','+0-1','+0+1'},
|
||||||
[03]={'+0+0','+1+0','+1+1','+0-2','+1-2','+1-1','+0+1'},
|
[03]={'+0+0','+1+0','+1+1','+0-2','+1-2','+1-1','+0+1'},
|
||||||
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0-1','-1+1'},
|
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0-1','-1+1'},
|
||||||
[12]={'+0+0','+1+0','+1-1','+1+1','-1+0','+0-1','+0+2','+1+2'},
|
[12]={'+0+0','+1+0','+1-1','+1+1','-1+0','+0-1','+0+2','+1+2'},
|
||||||
|
|||||||
@@ -1,24 +1,34 @@
|
|||||||
local gc=love.graphics
|
local gc=love.graphics
|
||||||
local warnTime={60,90,105,115,116,117,118,119,120}
|
local warnTime={60,90,105,115,116,117,118,119,120}
|
||||||
|
for i=1,#warnTime do warnTime[i]=warnTime[i]*60 end
|
||||||
|
|
||||||
return{
|
return{
|
||||||
mesDisp=function(P)
|
mesDisp=function(P)
|
||||||
gc.setLineWidth(2)
|
gc.setLineWidth(2)
|
||||||
gc.rectangle('line',55,110,32,402)
|
gc.setColor(.98,.98,.98,.8)
|
||||||
local T=P.stat.frame/60/120
|
gc.rectangle('line',0,260,126,80,4)
|
||||||
gc.setColor(2*T,2-2*T,.2)
|
gc.setColor(.98,.98,.98,.4)
|
||||||
gc.rectangle('fill',56,511,30,(T-1)*400)
|
gc.rectangle('fill',0+2,260+2,126-4,80-4,2)
|
||||||
|
setFont(45)
|
||||||
|
local t=P.stat.frame/60
|
||||||
|
local T=("%.1f"):format(120-t)
|
||||||
|
gc.setColor(COLOR.dH)
|
||||||
|
mStr(T,65,270)
|
||||||
|
t=t/120
|
||||||
|
gc.setColor(1.7*t,2.3-2*t,.3)
|
||||||
|
mStr(T,63,268)
|
||||||
end,
|
end,
|
||||||
task=function(P)
|
task=function(P)
|
||||||
P.modeData.stage=1
|
BGM.seek(0)
|
||||||
|
P.modeData.section=1
|
||||||
while true do
|
while true do
|
||||||
YIELD()
|
YIELD()
|
||||||
if P.stat.frame/60>=warnTime[P.modeData.stage]then
|
while P.stat.frame>=warnTime[P.modeData.section]do
|
||||||
if P.modeData.stage<9 then
|
if P.modeData.section<9 then
|
||||||
P.modeData.stage=P.modeData.stage+1
|
P.modeData.section=P.modeData.section+1
|
||||||
playReadySFX(3,.7+P.modeData.stage*.03)
|
playReadySFX(3,.7+P.modeData.section*.03)
|
||||||
else
|
else
|
||||||
playReadySFX(0,.7+P.modeData.stage*.03)
|
playReadySFX(0,.7+P.modeData.section*.03)
|
||||||
P:win('finish')
|
P:win('finish')
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -15,6 +15,48 @@ local playSFX=SFX.play
|
|||||||
|
|
||||||
|
|
||||||
--System
|
--System
|
||||||
|
do--function loadFile(name,args), function saveFile(data,name,args)
|
||||||
|
local t=setmetatable({},{__index=function()return"'$1' loading failed: $2"end})
|
||||||
|
function loadFile(name,args)
|
||||||
|
local text=text or t
|
||||||
|
if not args then args=''end
|
||||||
|
local res,mes=pcall(FILE.load,name,args)
|
||||||
|
if res then
|
||||||
|
return mes
|
||||||
|
else
|
||||||
|
if mes:find'open error'then
|
||||||
|
MES.new('error',text.loadError_open:repD(name,""))
|
||||||
|
elseif mes:find'unknown mode'then
|
||||||
|
MES.new('error',text.loadError_errorMode:repD(name,args))
|
||||||
|
elseif mes:find'no file'then
|
||||||
|
if not args:sArg'-canSkip'then
|
||||||
|
MES.new('error',text.loadError_noFile:repD(name,""))
|
||||||
|
end
|
||||||
|
elseif mes then
|
||||||
|
MES.new('error',text.loadError_other:repD(name,mes))
|
||||||
|
else
|
||||||
|
MES.new('error',text.loadError_unknown:repD(name,""))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
function saveFile(data,name,args)
|
||||||
|
local text=text or t
|
||||||
|
local res,mes=pcall(FILE.save,data,name,args)
|
||||||
|
if res then
|
||||||
|
return mes
|
||||||
|
else
|
||||||
|
MES.new('error',
|
||||||
|
mes:find'duplicate'and
|
||||||
|
text.saveError_duplicate:repD(name)or
|
||||||
|
mes:find'encode error'and
|
||||||
|
text.saveError_encode:repD(name)or
|
||||||
|
mes and
|
||||||
|
text.saveError_other:repD(name,mes)or
|
||||||
|
text.saveError_unknown:repD(name)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
function isSafeFile(file,mes)
|
function isSafeFile(file,mes)
|
||||||
if love.filesystem.getRealDirectory(file)~=SAVEDIR then
|
if love.filesystem.getRealDirectory(file)~=SAVEDIR then
|
||||||
return true
|
return true
|
||||||
@@ -23,13 +65,13 @@ function isSafeFile(file,mes)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function saveStats()
|
function saveStats()
|
||||||
return FILE.save(STAT,'conf/data')
|
return saveFile(STAT,'conf/data')
|
||||||
end
|
end
|
||||||
function saveProgress()
|
function saveProgress()
|
||||||
return FILE.save(RANKS,'conf/unlock')
|
return saveFile(RANKS,'conf/unlock')
|
||||||
end
|
end
|
||||||
function saveSettings()
|
function saveSettings()
|
||||||
return FILE.save(SETTING,'conf/settings')
|
return saveFile(SETTING,'conf/settings')
|
||||||
end
|
end
|
||||||
function applyLanguage()
|
function applyLanguage()
|
||||||
text=LANG.get(SETTING.locale)
|
text=LANG.get(SETTING.locale)
|
||||||
@@ -263,16 +305,16 @@ function setField(P,page)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function freshDate(mode)
|
function freshDate(args)
|
||||||
if not mode then
|
if not args then
|
||||||
mode=""
|
args=""
|
||||||
end
|
end
|
||||||
local date=os.date("%Y/%m/%d")
|
local date=os.date("%Y/%m/%d")
|
||||||
if STAT.date~=date then
|
if STAT.date~=date then
|
||||||
STAT.date=date
|
STAT.date=date
|
||||||
STAT.todayTime=0
|
STAT.todayTime=0
|
||||||
getItem('zTicket',1)
|
getItem('zTicket',1)
|
||||||
if not mode:find'q'then
|
if not args:find'q'then
|
||||||
MES.new('info',text.newDay)
|
MES.new('info',text.newDay)
|
||||||
end
|
end
|
||||||
saveStats()
|
saveStats()
|
||||||
@@ -297,6 +339,15 @@ function legalGameTime()--Check if today's playtime is legal
|
|||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
do--function trySettingWarn()
|
||||||
|
local lastWarnTime=0
|
||||||
|
function trySettingWarn()
|
||||||
|
if TIME()-lastWarnTime>2.6 then
|
||||||
|
MES.new('warn',text.settingWarn,5)
|
||||||
|
end
|
||||||
|
lastWarnTime=TIME()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function mergeStat(stat,delta)--Merge delta stat. to global stat.
|
function mergeStat(stat,delta)--Merge delta stat. to global stat.
|
||||||
for k,v in next,delta do
|
for k,v in next,delta do
|
||||||
@@ -466,7 +517,7 @@ function gameOver()--Save record
|
|||||||
D.date=os.date("%Y/%m/%d %H:%M")
|
D.date=os.date("%Y/%m/%d %H:%M")
|
||||||
ins(L,p+1,D)
|
ins(L,p+1,D)
|
||||||
if L[11]then L[11]=nil end
|
if L[11]then L[11]=nil end
|
||||||
FILE.save(L,('record/%s.rec'):format(M.name),'l')
|
saveFile(L,('record/%s.rec'):format(M.name),'-luaon')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -818,13 +869,20 @@ do--function pressKey(k)
|
|||||||
end
|
end
|
||||||
do--CUS/SETXXX(k)
|
do--CUS/SETXXX(k)
|
||||||
local CUSTOMENV=CUSTOMENV
|
local CUSTOMENV=CUSTOMENV
|
||||||
|
local warnList={
|
||||||
|
'das','arr','dascut','dropcut','sddas','sdarr',
|
||||||
|
'ihs','irs','ims','RS',
|
||||||
|
'FTLock','frameMul','highCam',
|
||||||
|
'VKSwitch','VKIcon','VKTrack','VKDodge',
|
||||||
|
'simpMode',
|
||||||
|
}
|
||||||
function CUSval(k)return function()return CUSTOMENV[k]end end
|
function CUSval(k)return function()return CUSTOMENV[k]end end
|
||||||
function ROOMval(k)return function()return ROOMENV[k]end end
|
function ROOMval(k)return function()return ROOMENV[k]end end
|
||||||
function SETval(k)return function()return SETTING[k]end end
|
function SETval(k)return function()return SETTING[k]end end
|
||||||
function CUSrev(k)return function()CUSTOMENV[k]=not CUSTOMENV[k]end end
|
function CUSrev(k)return function()CUSTOMENV[k]=not CUSTOMENV[k]end end
|
||||||
function ROOMrev(k)return function()ROOMENV[k]=not ROOMENV[k]end end
|
function ROOMrev(k)return function()ROOMENV[k]=not ROOMENV[k]end end
|
||||||
function SETrev(k)return function()SETTING[k]=not SETTING[k]end end
|
function SETrev(k)return function()if TABLE.find(warnList,k)then trySettingWarn()end SETTING[k]=not SETTING[k]end end
|
||||||
function CUSsto(k)return function(i)CUSTOMENV[k]=i end end
|
function CUSsto(k)return function(i)CUSTOMENV[k]=i end end
|
||||||
function ROOMsto(k)return function(i)ROOMENV[k]=i end end
|
function ROOMsto(k)return function(i)ROOMENV[k]=i end end
|
||||||
function SETsto(k)return function(i)SETTING[k]=i end end
|
function SETsto(k)return function(i)if TABLE.find(warnList,k)then trySettingWarn()end SETTING[k]=i end end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ return{
|
|||||||
newDay="A new day, a new beginning!",
|
newDay="A new day, a new beginning!",
|
||||||
playedLong="You have been playing for a long time. Time to a break!",
|
playedLong="You have been playing for a long time. Time to a break!",
|
||||||
playedTooMuch="You have been playing for far too long! Techmino is fun, but remember to have some rests!",
|
playedTooMuch="You have been playing for far too long! Techmino is fun, but remember to have some rests!",
|
||||||
|
settingWarn="Modifing uncommon setting, be careful!",
|
||||||
|
|
||||||
atkModeName={"Random","Badges","K.O.s","Attackers"},
|
atkModeName={"Random","Badges","K.O.s","Attackers"},
|
||||||
royale_remain="$1 Players Remains",
|
royale_remain="$1 Players Remains",
|
||||||
@@ -66,11 +67,19 @@ return{
|
|||||||
switchSpawnSFX="Please turn on the block spawn SFX!",
|
switchSpawnSFX="Please turn on the block spawn SFX!",
|
||||||
needRestart="Restart to apply all changes",
|
needRestart="Restart to apply all changes",
|
||||||
|
|
||||||
|
loadError_errorMode="'$1' loading failed: no load mode '$2'",
|
||||||
|
loadError_read="'$1' loading failed: read failed",
|
||||||
|
loadError_noFile="'$1' loading failed no file:",
|
||||||
|
loadError_other="'$1' loading failed: $2",
|
||||||
|
loadError_unknown="'$1' loading failed: unknown reason",
|
||||||
|
|
||||||
|
saveError_duplicate="'$1' saving failed: duplicated filename",
|
||||||
|
saveError_encode="'$1' saving failed: encode failed",
|
||||||
|
saveError_other="'$1' saving failed: $2",
|
||||||
|
saveError_unknown="'$1' saving failed: unknown reason",
|
||||||
|
|
||||||
copyDone="Copied!",
|
copyDone="Copied!",
|
||||||
saveDone="Data saved",
|
saveDone="Data saved",
|
||||||
saveError="Failed to save:",
|
|
||||||
saveError_duplicate="Duplicated filename",
|
|
||||||
loadError="Failed to load:",
|
|
||||||
exportSuccess="Exported successfully",
|
exportSuccess="Exported successfully",
|
||||||
importSuccess="Imported successfully",
|
importSuccess="Imported successfully",
|
||||||
dataCorrupted="Data corrupted",
|
dataCorrupted="Data corrupted",
|
||||||
@@ -332,6 +341,7 @@ return{
|
|||||||
ctrl="Control Settings",
|
ctrl="Control Settings",
|
||||||
key="Key Mappings",
|
key="Key Mappings",
|
||||||
touch="Touch Settings",
|
touch="Touch Settings",
|
||||||
|
showVK="Show Virtual Keys",
|
||||||
reTime="Start Delay",
|
reTime="Start Delay",
|
||||||
RS="Rotation System",
|
RS="Rotation System",
|
||||||
menuPos="Menu Button Pos.",
|
menuPos="Menu Button Pos.",
|
||||||
@@ -463,7 +473,6 @@ return{
|
|||||||
|
|
||||||
norm="Normal",
|
norm="Normal",
|
||||||
pro="Advanced",
|
pro="Advanced",
|
||||||
hide="Show Virtual Keys",
|
|
||||||
icon="Icon",
|
icon="Icon",
|
||||||
sfx="SFX",
|
sfx="SFX",
|
||||||
vib="VIB",
|
vib="VIB",
|
||||||
@@ -501,6 +510,7 @@ return{
|
|||||||
|
|
||||||
eventSet="Rule Set",
|
eventSet="Rule Set",
|
||||||
|
|
||||||
|
holdMode="Hold Mode",
|
||||||
nextCount="Next",
|
nextCount="Next",
|
||||||
holdCount="Hold",
|
holdCount="Hold",
|
||||||
infHold="Infinite Hold",
|
infHold="Infinite Hold",
|
||||||
@@ -732,7 +742,7 @@ return{
|
|||||||
['defender_l']= {"Defender", "LUNATIC", "Practice your defencing skills!"},
|
['defender_l']= {"Defender", "LUNATIC", "Practice your defencing skills!"},
|
||||||
['dig_h']= {"Driller", "HARD", "Digging practice!"},
|
['dig_h']= {"Driller", "HARD", "Digging practice!"},
|
||||||
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
|
['dig_u']= {"Driller", "ULTIMATE", "Digging practice!"},
|
||||||
['bigbang']= {"Big Bang", "EASY", "All-spin tutorial!\n[Under construction]"},
|
['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"},
|
||||||
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
|
['c4wtrain_n']= {"C4W Training", "NORMAL", "Infinite combos"},
|
||||||
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
|
['c4wtrain_l']= {"C4W Training", "LUNATIC", "Infinite combos"},
|
||||||
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
|
['pctrain_n']= {"PC Training", "NORMAL", "Perfect Clear practice"},
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ return{
|
|||||||
newDay="[Anti-adicción] ¡Nuevo día, nuevo comienzo!",
|
newDay="[Anti-adicción] ¡Nuevo día, nuevo comienzo!",
|
||||||
playedLong="[Anti-adicción] Estuviste jugando un buen rato hoy. Recuerda descansar de vez en cuando.",
|
playedLong="[Anti-adicción] Estuviste jugando un buen rato hoy. Recuerda descansar de vez en cuando.",
|
||||||
playedTooMuch="[Anti-adicción] ¡Has jugado mucho por hoy! No puedes jugar más.",
|
playedTooMuch="[Anti-adicción] ¡Has jugado mucho por hoy! No puedes jugar más.",
|
||||||
|
-- settingWarn="Modifing uncommon setting, be careful!",
|
||||||
|
|
||||||
atkModeName={"Al azar","Medallas","KOs","Atacantes"},
|
atkModeName={"Al azar","Medallas","KOs","Atacantes"},
|
||||||
royale_remain="$1 Jugadores Restantes",
|
royale_remain="$1 Jugadores Restantes",
|
||||||
@@ -55,11 +56,19 @@ return{
|
|||||||
switchSpawnSFX="Habilita los sonidos de aparición de las piezas ;)",
|
switchSpawnSFX="Habilita los sonidos de aparición de las piezas ;)",
|
||||||
needRestart="Reinicia Techmino para que los cambios tengan efecto.",
|
needRestart="Reinicia Techmino para que los cambios tengan efecto.",
|
||||||
|
|
||||||
|
-- loadError_errorMode="'$1' loading failed: no load mode '$2'",
|
||||||
|
-- loadError_read="'$1' loading failed: read failed",
|
||||||
|
-- loadError_noFile="'$1' loading failed no file:",
|
||||||
|
-- loadError_other="'$1' loading failed: $2",
|
||||||
|
-- loadError_unknown="'$1' loading failed: unknown reason",
|
||||||
|
|
||||||
|
-- saveError_duplicate="'$1' saving failed: duplicated filename",
|
||||||
|
-- saveError_encode="'$1' saving failed: encode failed",
|
||||||
|
-- saveError_other="'$1' saving failed: $2",
|
||||||
|
-- saveError_unknown="'$1' saving failed: unknown reason",
|
||||||
|
|
||||||
-- copyDone="Copied!",
|
-- copyDone="Copied!",
|
||||||
saveDone="Datos guardados",
|
saveDone="Datos guardados",
|
||||||
saveError="Error al guardar:",
|
|
||||||
saveError_duplicate="Archivo ya existente",
|
|
||||||
loadError="Error al cargar:",
|
|
||||||
exportSuccess="Exportado con éxito",
|
exportSuccess="Exportado con éxito",
|
||||||
importSuccess="Importado con éxito",
|
importSuccess="Importado con éxito",
|
||||||
dataCorrupted="Los datos están corruptos.",
|
dataCorrupted="Los datos están corruptos.",
|
||||||
@@ -298,6 +307,7 @@ return{
|
|||||||
ctrl="Sensibilidad",
|
ctrl="Sensibilidad",
|
||||||
key="Teclas",
|
key="Teclas",
|
||||||
touch="Controles Táctiles",
|
touch="Controles Táctiles",
|
||||||
|
showVK="Mostrar Tec. Virtual",
|
||||||
reTime="Retraso de Inicio",
|
reTime="Retraso de Inicio",
|
||||||
RS="Sistema de Rotación",
|
RS="Sistema de Rotación",
|
||||||
menuPos="Pos. del Botón de Menú",
|
menuPos="Pos. del Botón de Menú",
|
||||||
@@ -428,7 +438,6 @@ return{
|
|||||||
|
|
||||||
norm="Normal",
|
norm="Normal",
|
||||||
pro="Profesional",
|
pro="Profesional",
|
||||||
hide="Mostrar Tec. Virtual",
|
|
||||||
icon="Ícono",
|
icon="Ícono",
|
||||||
sfx="SFX",
|
sfx="SFX",
|
||||||
vib="Vibr.",
|
vib="Vibr.",
|
||||||
@@ -692,7 +701,7 @@ return{
|
|||||||
['defender_l']= {"Defensor", "Lunático", "¡Practica la defensa!"},
|
['defender_l']= {"Defensor", "Lunático", "¡Practica la defensa!"},
|
||||||
['dig_h']= {"Downstack", "Difícil", "¡Practica el downstackeo!"},
|
['dig_h']= {"Downstack", "Difícil", "¡Practica el downstackeo!"},
|
||||||
['dig_u']= {"Downstack", "Supremo", "¡Practica el downstackeo!"},
|
['dig_u']= {"Downstack", "Supremo", "¡Practica el downstackeo!"},
|
||||||
['bigbang']= {"Big Bang", "Fácil", "¡Tutorial de All-spins!\n[Sin finalizar]"},
|
-- ['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"},
|
||||||
['c4wtrain_n']= {"Entrenar C4W", "Normal", "Combos infinitos."},
|
['c4wtrain_n']= {"Entrenar C4W", "Normal", "Combos infinitos."},
|
||||||
['c4wtrain_l']= {"Entrenar C4W", "Lunático", "Combos infinitos."},
|
['c4wtrain_l']= {"Entrenar C4W", "Lunático", "Combos infinitos."},
|
||||||
['pctrain_n']= {"Entrenar PC", "Normal", "Modo sencillo para practicar Perfect Clears."},
|
['pctrain_n']= {"Entrenar PC", "Normal", "Modo sencillo para practicar Perfect Clears."},
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ return{
|
|||||||
newDay="[Anti-addiction] Nouveau jour, nouveau commencement !",
|
newDay="[Anti-addiction] Nouveau jour, nouveau commencement !",
|
||||||
playedLong="[Anti-addiction] Vous avez joué pendant un bon bout de temps aujourd'hui. Faites des pauses.",
|
playedLong="[Anti-addiction] Vous avez joué pendant un bon bout de temps aujourd'hui. Faites des pauses.",
|
||||||
playedTooMuch="[Anti-addiction] Vous avez joué trop longtemps ! Vous ne pouvez plus jouer.",
|
playedTooMuch="[Anti-addiction] Vous avez joué trop longtemps ! Vous ne pouvez plus jouer.",
|
||||||
|
-- settingWarn="Modifing uncommon setting, be careful!",
|
||||||
|
|
||||||
atkModeName={"Aléatoire","Badges","K.O.s faciles","Attaquants"},
|
atkModeName={"Aléatoire","Badges","K.O.s faciles","Attaquants"},
|
||||||
royale_remain="$1 Joueurs restants",
|
royale_remain="$1 Joueurs restants",
|
||||||
@@ -56,11 +57,19 @@ return{
|
|||||||
switchSpawnSFX="Activez les effets sonores d'apparition des pièces pour jouer",
|
switchSpawnSFX="Activez les effets sonores d'apparition des pièces pour jouer",
|
||||||
needRestart="Fonctionnera dès la prochaine partie",
|
needRestart="Fonctionnera dès la prochaine partie",
|
||||||
|
|
||||||
|
-- loadError_errorMode="'$1' loading failed: no load mode '$2'",
|
||||||
|
-- loadError_read="'$1' loading failed: read failed",
|
||||||
|
-- loadError_noFile="'$1' loading failed no file:",
|
||||||
|
-- loadError_other="'$1' loading failed: $2",
|
||||||
|
-- loadError_unknown="'$1' loading failed: unknown reason",
|
||||||
|
|
||||||
|
-- saveError_duplicate="'$1' saving failed: duplicated filename",
|
||||||
|
-- saveError_encode="'$1' saving failed: encode failed",
|
||||||
|
-- saveError_other="'$1' saving failed: $2",
|
||||||
|
-- saveError_unknown="'$1' saving failed: unknown reason",
|
||||||
|
|
||||||
-- copyDone="Copied!",
|
-- copyDone="Copied!",
|
||||||
saveDone="Données sauvegardées",
|
saveDone="Données sauvegardées",
|
||||||
saveError="Sauvegarde échouée : ",
|
|
||||||
-- saveError_duplicate="Duplicate filename",
|
|
||||||
loadError="Lecture échouée : ",
|
|
||||||
exportSuccess="Exporté avec succès",
|
exportSuccess="Exporté avec succès",
|
||||||
importSuccess="Importé avec succès",
|
importSuccess="Importé avec succès",
|
||||||
dataCorrupted="Données corrompues",
|
dataCorrupted="Données corrompues",
|
||||||
@@ -295,6 +304,7 @@ return{
|
|||||||
ctrl="Paramètres de contrôle",
|
ctrl="Paramètres de contrôle",
|
||||||
key="Touches",
|
key="Touches",
|
||||||
touch="Boutons virtuels",
|
touch="Boutons virtuels",
|
||||||
|
showVK="Montrer les touches virtuelles",
|
||||||
reTime="Délai de démarrage",
|
reTime="Délai de démarrage",
|
||||||
RS="Système de rotation",
|
RS="Système de rotation",
|
||||||
-- menuPos="Menu button pos.",
|
-- menuPos="Menu button pos.",
|
||||||
@@ -429,7 +439,6 @@ return{
|
|||||||
|
|
||||||
norm="Normal",
|
norm="Normal",
|
||||||
pro="Professionel",
|
pro="Professionel",
|
||||||
hide="Montrer les touches virtuelles",
|
|
||||||
icon="Icône",
|
icon="Icône",
|
||||||
sfx="Sons",
|
sfx="Sons",
|
||||||
vib="Vib.",
|
vib="Vib.",
|
||||||
@@ -696,7 +705,7 @@ return{
|
|||||||
['defender_l']= {"Défendant", "LUNATIQUE", "Soyez défensifs !"},
|
['defender_l']= {"Défendant", "LUNATIQUE", "Soyez défensifs !"},
|
||||||
['dig_h']= {"Perceuse", "DIFFICILE", "Essayez de creuser !"},
|
['dig_h']= {"Perceuse", "DIFFICILE", "Essayez de creuser !"},
|
||||||
['dig_u']= {"Perceuse", "ULTIME", "Essayez de creuser !"},
|
['dig_u']= {"Perceuse", "ULTIME", "Essayez de creuser !"},
|
||||||
['bigbang']= {"Big Bang", "FACILE", "Tutoriel All-Spin\nEn construction..."},
|
-- ['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"},
|
||||||
['c4wtrain_n']= {"Mode essai C4W", "NORMAL", "Combos infinis."},
|
['c4wtrain_n']= {"Mode essai C4W", "NORMAL", "Combos infinis."},
|
||||||
['c4wtrain_l']= {"Mode essai C4W", "LUNATIQUE", "Combos infinis."},
|
['c4wtrain_l']= {"Mode essai C4W", "LUNATIQUE", "Combos infinis."},
|
||||||
['pctrain_n']= {"Mode essai PC", "NORMAL", "Mode Perfect Clear simple"},
|
['pctrain_n']= {"Mode essai PC", "NORMAL", "Mode Perfect Clear simple"},
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ return{
|
|||||||
newDay="[Anti-vício] Novo dia, um começo novo!",
|
newDay="[Anti-vício] Novo dia, um começo novo!",
|
||||||
playedLong="[Anti-vício] Você andou jogando bastante hoje. Certifique-se de fazer pausas.",
|
playedLong="[Anti-vício] Você andou jogando bastante hoje. Certifique-se de fazer pausas.",
|
||||||
playedTooMuch="[Anti-vício] Você esteve jogando demais hoje! Você não pode jogar mais.",
|
playedTooMuch="[Anti-vício] Você esteve jogando demais hoje! Você não pode jogar mais.",
|
||||||
|
-- settingWarn="Modifing uncommon setting, be careful!",
|
||||||
|
|
||||||
atkModeName={"Aleatório","Emblemas","K.O.s","Atacantes"},
|
atkModeName={"Aleatório","Emblemas","K.O.s","Atacantes"},
|
||||||
royale_remain="$1 Jogadores restantes",
|
royale_remain="$1 Jogadores restantes",
|
||||||
@@ -56,11 +57,19 @@ return{
|
|||||||
switchSpawnSFX="Switch on spawn SFX to play",
|
switchSpawnSFX="Switch on spawn SFX to play",
|
||||||
needRestart="Funciona após reiniciar",
|
needRestart="Funciona após reiniciar",
|
||||||
|
|
||||||
|
-- loadError_errorMode="'$1' loading failed: no load mode '$2'",
|
||||||
|
-- loadError_read="'$1' loading failed: read failed",
|
||||||
|
-- loadError_noFile="'$1' loading failed no file:",
|
||||||
|
-- loadError_other="'$1' loading failed: $2",
|
||||||
|
-- loadError_unknown="'$1' loading failed: unknown reason",
|
||||||
|
|
||||||
|
-- saveError_duplicate="'$1' saving failed: duplicated filename",
|
||||||
|
-- saveError_encode="'$1' saving failed: encode failed",
|
||||||
|
-- saveError_other="'$1' saving failed: $2",
|
||||||
|
-- saveError_unknown="'$1' saving failed: unknown reason",
|
||||||
|
|
||||||
-- copyDone="Copied!",
|
-- copyDone="Copied!",
|
||||||
saveDone="Data Salva",
|
saveDone="Data Salva",
|
||||||
saveError="Falha ao salvar:",
|
|
||||||
-- saveError_duplicate="Duplicate filename",
|
|
||||||
loadError="Falha ao ler:",
|
|
||||||
exportSuccess="Exportado com sucesso",
|
exportSuccess="Exportado com sucesso",
|
||||||
importSuccess="Importado com sucesso",
|
importSuccess="Importado com sucesso",
|
||||||
dataCorrupted="Data corrompida",
|
dataCorrupted="Data corrompida",
|
||||||
@@ -320,6 +329,7 @@ return{
|
|||||||
ctrl="Config. controle",
|
ctrl="Config. controle",
|
||||||
key="Map. teclas",
|
key="Map. teclas",
|
||||||
touch="Config. toque",
|
touch="Config. toque",
|
||||||
|
showVK="Mostrar tecla virtual",
|
||||||
reTime="Demora iniciação",
|
reTime="Demora iniciação",
|
||||||
RS="Sistema de rotação",
|
RS="Sistema de rotação",
|
||||||
-- menuPos="Menu button pos.",
|
-- menuPos="Menu button pos.",
|
||||||
@@ -451,7 +461,6 @@ return{
|
|||||||
|
|
||||||
norm="Normal",
|
norm="Normal",
|
||||||
pro="Professional",
|
pro="Professional",
|
||||||
hide="Mostrar tecla virtual",
|
|
||||||
icon="Icone",
|
icon="Icone",
|
||||||
sfx="SFX",
|
sfx="SFX",
|
||||||
vib="VIB",
|
vib="VIB",
|
||||||
@@ -726,7 +735,7 @@ return{
|
|||||||
['defender_l']= {"Defensor", "LUNÁTICO", "Prática de defensiva!"},
|
['defender_l']= {"Defensor", "LUNÁTICO", "Prática de defensiva!"},
|
||||||
['dig_h']= {"Cavador", "DIFÍCIL", "Prática de cavar!"},
|
['dig_h']= {"Cavador", "DIFÍCIL", "Prática de cavar!"},
|
||||||
['dig_u']= {"Cavador", "ULTIMATE", "Prática de cavar!"},
|
['dig_u']= {"Cavador", "ULTIMATE", "Prática de cavar!"},
|
||||||
['bigbang']= {"Big Bang", "FÁCIL", "Tutorial de todos giros!\n[Em construção]"},
|
-- ['clearRush']= {"Clear Rush", "NORMAL", "All-spin tutorial!\n[Under construction]"},
|
||||||
['c4wtrain_n']= {"Treinamento C4W", "NORMAL", "Combos infinitos."},
|
['c4wtrain_n']= {"Treinamento C4W", "NORMAL", "Combos infinitos."},
|
||||||
['c4wtrain_l']= {"Treinamento C4W", "LUNÁTICO", "Combos infinitos."},
|
['c4wtrain_l']= {"Treinamento C4W", "LUNÁTICO", "Combos infinitos."},
|
||||||
['pctrain_n']= {"Treinamento PC", "NORMAL", "Modo simples de limpeza perfeita."},
|
['pctrain_n']= {"Treinamento PC", "NORMAL", "Modo simples de limpeza perfeita."},
|
||||||
|
|||||||
@@ -58,11 +58,19 @@ return{
|
|||||||
ai_mission="X!!!",
|
ai_mission="X!!!",
|
||||||
needRestart="!!*#R#*!!",
|
needRestart="!!*#R#*!!",
|
||||||
|
|
||||||
|
loadError_errorMode="'$1' ↑x!: no load mode '$2'",
|
||||||
|
loadError_read="'$1' ↑x!: read failed",
|
||||||
|
loadError_noFile="'$1' ↑oading failed no file:",
|
||||||
|
loadError_other="'$1' ↑x!: $2",
|
||||||
|
loadError_unknown="'$1' ↑x!: unknown reason",
|
||||||
|
|
||||||
|
saveError_duplicate="'$1' ↓x!: duplicated filename",
|
||||||
|
saveError_encode="'$1' ↓x!: encode failed",
|
||||||
|
saveError_other="'$1' ↓x!: $2",
|
||||||
|
saveError_unknown="'$1' ↓x!: unknown reason",
|
||||||
|
|
||||||
-- copyDone="Copied!",
|
-- copyDone="Copied!",
|
||||||
saveDone="~~~",
|
saveDone="~~~",
|
||||||
saveError="x!:",
|
|
||||||
saveError_duplicate="X←→X ?",
|
|
||||||
loadError="x!:",
|
|
||||||
exportSuccess="~Out~",
|
exportSuccess="~Out~",
|
||||||
importSuccess="~In~",
|
importSuccess="~In~",
|
||||||
dataCorrupted="XXXXX",
|
dataCorrupted="XXXXX",
|
||||||
@@ -227,6 +235,7 @@ return{
|
|||||||
ctrl="=?=",
|
ctrl="=?=",
|
||||||
key="=?",
|
key="=?",
|
||||||
touch="_?",
|
touch="_?",
|
||||||
|
showVK="--?",
|
||||||
reTime="3-2-1",
|
reTime="3-2-1",
|
||||||
RS="''?",
|
RS="''?",
|
||||||
menuPos="←M→?",
|
menuPos="←M→?",
|
||||||
@@ -356,7 +365,6 @@ return{
|
|||||||
|
|
||||||
norm="-",
|
norm="-",
|
||||||
pro="+",
|
pro="+",
|
||||||
hide="--?",
|
|
||||||
icon="@?",
|
icon="@?",
|
||||||
sfx="#!#",
|
sfx="#!#",
|
||||||
vib="=~=",
|
vib="=~=",
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ return{fallback='zh',
|
|||||||
},
|
},
|
||||||
playedLong="玩很久了, 给我注意点",
|
playedLong="玩很久了, 给我注意点",
|
||||||
playedTooMuch="特么再敢玩眼睛瞎掉, 爬!",
|
playedTooMuch="特么再敢玩眼睛瞎掉, 爬!",
|
||||||
|
settingWarn="别乱动,小心点",
|
||||||
|
|
||||||
royale_remain="剩 $1 人",
|
royale_remain="剩 $1 人",
|
||||||
cmb={nil,"1连","2连","3连","4连","5连","6连","7连","8连","9连","10连!","11连!","12连!","13连!","14连!","15连!","16连!","17连!","18连!","19连!","Very 连"},
|
cmb={nil,"1连","2连","3连","4连","5连","6连","7连","8连","9连","10连!","11连!","12连!","13连!","14连!","15连!","16连!","17连!","18连!","19连!","Very 连"},
|
||||||
@@ -253,7 +254,7 @@ return{fallback='zh',
|
|||||||
['defender_l']= {"防守", "疯狂", "防守练习"},
|
['defender_l']= {"防守", "疯狂", "防守练习"},
|
||||||
['dig_h']= {"挖掘", "困难", "挖掘练习"},
|
['dig_h']= {"挖掘", "困难", "挖掘练习"},
|
||||||
['dig_u']= {"挖掘", "极限", "挖掘练习"},
|
['dig_u']= {"挖掘", "极限", "挖掘练习"},
|
||||||
['bigbang']= {"大爆炸", "简单", "All-spin入门\n还没做好"},
|
['clearRush']= {"清版竞速", "普通", "舒服"},
|
||||||
['c4wtrain_n']= {"C4W练习", "普通", "无 限 连 击"},
|
['c4wtrain_n']= {"C4W练习", "普通", "无 限 连 击"},
|
||||||
['c4wtrain_l']= {"C4W练习", "疯狂", "无 限 连 击"},
|
['c4wtrain_l']= {"C4W练习", "疯狂", "无 限 连 击"},
|
||||||
['pctrain_n']= {"全清训练", "普通", "随便打打"},
|
['pctrain_n']= {"全清训练", "普通", "随便打打"},
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ return{
|
|||||||
newDay="新的一天,新的开始~",
|
newDay="新的一天,新的开始~",
|
||||||
playedLong="已经玩很久了!注意休息!",
|
playedLong="已经玩很久了!注意休息!",
|
||||||
playedTooMuch="今天玩太久啦!打块好玩但也要适可而止哦~",
|
playedTooMuch="今天玩太久啦!打块好玩但也要适可而止哦~",
|
||||||
|
settingWarn="正在修改不常用设置,小心操作!",
|
||||||
|
|
||||||
atkModeName={"随机","徽章","击杀","反击"},
|
atkModeName={"随机","徽章","击杀","反击"},
|
||||||
royale_remain="剩余 $1 名玩家",
|
royale_remain="剩余 $1 名玩家",
|
||||||
@@ -66,11 +67,19 @@ return{
|
|||||||
switchSpawnSFX="请开启方块出生音效",
|
switchSpawnSFX="请开启方块出生音效",
|
||||||
needRestart="重新开始以生效",
|
needRestart="重新开始以生效",
|
||||||
|
|
||||||
|
loadError_errorMode="文件 '$1' 读取失败:无加载模式 '$2'",
|
||||||
|
loadError_read="文件 '$1' 读取失败:读取失败",
|
||||||
|
loadError_noFile="文件 '$1' 读取失败:没有文件",
|
||||||
|
loadError_other="文件 '$1' 读取失败:$2",
|
||||||
|
loadError_unknown="文件 '$1' 读取失败:原因未知",
|
||||||
|
|
||||||
|
saveError_duplicate="文件 '$1' 保存失败:文件已存在",
|
||||||
|
saveError_encode="文件 '$1' 保存失败:编码错误",
|
||||||
|
saveError_other="文件 '$1' 保存失败:$2",
|
||||||
|
saveError_unknown="文件 '$1' 保存失败:原因未知",
|
||||||
|
|
||||||
copyDone="复制成功!",
|
copyDone="复制成功!",
|
||||||
saveDone="保存成功!",
|
saveDone="保存成功!",
|
||||||
saveError="保存失败:",
|
|
||||||
saveError_duplicate="文件名重复",
|
|
||||||
loadError="读取失败:",
|
|
||||||
exportSuccess="导出成功",
|
exportSuccess="导出成功",
|
||||||
importSuccess="导入成功",
|
importSuccess="导入成功",
|
||||||
dataCorrupted="数据损坏",
|
dataCorrupted="数据损坏",
|
||||||
@@ -332,6 +341,7 @@ return{
|
|||||||
ctrl="控制设置",
|
ctrl="控制设置",
|
||||||
key="键位设置",
|
key="键位设置",
|
||||||
touch="触屏设置",
|
touch="触屏设置",
|
||||||
|
showVK="显示虚拟按键",
|
||||||
reTime="开局等待时间",
|
reTime="开局等待时间",
|
||||||
RS="旋转系统",
|
RS="旋转系统",
|
||||||
menuPos="菜单按钮位置",
|
menuPos="菜单按钮位置",
|
||||||
@@ -462,7 +472,6 @@ return{
|
|||||||
|
|
||||||
norm="标准",
|
norm="标准",
|
||||||
pro="专业",
|
pro="专业",
|
||||||
hide="显示虚拟按键",
|
|
||||||
icon="图标",
|
icon="图标",
|
||||||
sfx="按键音效",
|
sfx="按键音效",
|
||||||
vib="按键振动",
|
vib="按键振动",
|
||||||
@@ -738,7 +747,7 @@ return{
|
|||||||
['defender_l']= {"防守", "疯狂", "防守练习"},
|
['defender_l']= {"防守", "疯狂", "防守练习"},
|
||||||
['dig_h']= {"挖掘", "困难", "挖掘练习"},
|
['dig_h']= {"挖掘", "困难", "挖掘练习"},
|
||||||
['dig_u']= {"挖掘", "极限", "挖掘练习"},
|
['dig_u']= {"挖掘", "极限", "挖掘练习"},
|
||||||
['bigbang']= {"大爆炸", "简单", "All-spin 入门教程\n施工中"},
|
['clearRush']= {"清版竞速", "普通", "All-spin 入门教程\n施工中"},
|
||||||
['c4wtrain_n']= {"C4W练习", "普通", "无 限 连 击"},
|
['c4wtrain_n']= {"C4W练习", "普通", "无 限 连 击"},
|
||||||
['c4wtrain_l']= {"C4W练习", "疯狂", "无 限 连 击"},
|
['c4wtrain_l']= {"C4W练习", "疯狂", "无 限 连 击"},
|
||||||
['pctrain_n']= {"全清训练", "普通", "简易PC题库,熟悉全清定式的组合"},
|
['pctrain_n']= {"全清训练", "普通", "简易PC题库,熟悉全清定式的组合"},
|
||||||
|
|||||||
@@ -142,21 +142,21 @@ return{
|
|||||||
['defender_l']= {"防守", "疯狂", "防守练习"},
|
['defender_l']= {"防守", "疯狂", "防守练习"},
|
||||||
['dig_h']= {"挖掘", "困难", "挖掘练习"},
|
['dig_h']= {"挖掘", "困难", "挖掘练习"},
|
||||||
['dig_u']= {"挖掘", "极限", "挖掘练习"},
|
['dig_u']= {"挖掘", "极限", "挖掘练习"},
|
||||||
['bigbang']= {"大爆炸", "简单", "All-spin 入门教程\n施工中"},
|
['clearRush']= {"清版竞速", "普通", "所有块的回旋入门\n还没做好"},
|
||||||
['c4wtrain_n']= {"中四宽练习", "普通", "无 限 连 击"},
|
['c4wtrain_n']= {"中四宽练习", "普通", "无 限 连 击"},
|
||||||
['c4wtrain_l']= {"中四宽练习", "疯狂", "无 限 连 击"},
|
['c4wtrain_l']= {"中四宽练习", "疯狂", "无 限 连 击"},
|
||||||
['pctrain_n']= {"全清训练", "普通", "简易全清题库,熟悉全清定式的组合"},
|
['pctrain_n']= {"全清训练", "普通", "简易全清题库,熟悉全清定式的组合"},
|
||||||
['pctrain_l']= {"全清训练", "疯狂", "困难PC题库,强算力者进"},
|
['pctrain_l']= {"全清训练", "疯狂", "困难全清题库,强算力者进"},
|
||||||
['pc_n']= {"全清挑战", "普通", "100行内刷全清"},
|
['pc_n']= {"全清挑战", "普通", "100行内刷全清"},
|
||||||
['pc_h']= {"全清挑战", "困难", "100行内刷全清"},
|
['pc_h']= {"全清挑战", "困难", "100行内刷全清"},
|
||||||
['pc_l']= {"全清挑战", "疯狂", "100行内刷全清"},
|
['pc_l']= {"全清挑战", "疯狂", "100行内刷全清"},
|
||||||
['pc_inf']= {"无尽全清挑战", "", "你能连续做多少PC?"},
|
['pc_inf']= {"无尽全清挑战", "", "你能连续做多少全清?"},
|
||||||
['tech_n']= {"科研", "普通", "禁止断B2B"},
|
['tech_n']= {"科研", "普通", "禁止断满贯"},
|
||||||
['tech_n_plus']= {"科研", "普通+", "仅允许回旋与全清"},
|
['tech_n_plus']= {"科研", "普通+", "仅允许回旋与全清"},
|
||||||
['tech_h']= {"科研", "困难", "禁止断B2B"},
|
['tech_h']= {"科研", "困难", "禁止断满贯"},
|
||||||
['tech_h_plus']= {"科研", "困难+", "仅允许回旋与全清"},
|
['tech_h_plus']= {"科研", "困难+", "仅允许回旋与全清"},
|
||||||
['tech_l']= {"科研", "疯狂", "禁止断B2B"},
|
['tech_l']= {"科研", "疯狂", "禁止断满贯"},
|
||||||
['tech_l_plus']= {"科研", "疯狂+", "仅允许spin与PC"},
|
['tech_l_plus']= {"科研", "疯狂+", "仅允许回旋与全清"},
|
||||||
['tech_finesse']= {"科研", "极简", "强制最简操作"},
|
['tech_finesse']= {"科研", "极简", "强制最简操作"},
|
||||||
['tech_finesse_f']= {"科研", "极简+", "禁止普通消除,强制最简操作"},
|
['tech_finesse_f']= {"科研", "极简+", "禁止普通消除,强制最简操作"},
|
||||||
['tsd_e']= {"T2挑战", "简单", "你能连续做几个T旋双清?"},
|
['tsd_e']= {"T2挑战", "简单", "你能连续做几个T旋双清?"},
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ return{
|
|||||||
newDay="新的一天,新的开始!",
|
newDay="新的一天,新的开始!",
|
||||||
playedLong="你已经玩了很长时间了。一定要好好休息!",
|
playedLong="你已经玩了很长时间了。一定要好好休息!",
|
||||||
playedTooMuch="你玩得太久了!玩方块游戏很有趣,但现在是休息的时候了。",
|
playedTooMuch="你玩得太久了!玩方块游戏很有趣,但现在是休息的时候了。",
|
||||||
|
settingWarn="修改设置时,请小心!",
|
||||||
|
|
||||||
atkModeName={"随机的","徽章","击败","攻击者"},
|
atkModeName={"随机的","徽章","击败","攻击者"},
|
||||||
royale_remain="剩余$1球员",
|
royale_remain="剩余$1球员",
|
||||||
@@ -66,11 +67,19 @@ return{
|
|||||||
switchSpawnSFX="请打开繁殖特技效果",
|
switchSpawnSFX="请打开繁殖特技效果",
|
||||||
needRestart="请重试以使更改生效",
|
needRestart="请重试以使更改生效",
|
||||||
|
|
||||||
|
loadError_errorMode="'$1' 加载失败:无加载模式 '$2'",
|
||||||
|
loadError_read="'$1' 加载失败:读取失败",
|
||||||
|
loadError_noFile="'$1' 加载失败:没有文件",
|
||||||
|
loadError_other="'$1' 加载失败:$2",
|
||||||
|
loadError_unknown="'$1' 加载失败:原因未知",
|
||||||
|
|
||||||
|
saveError_duplicate="'$1' 保存失败:文件名重复",
|
||||||
|
saveError_encode="'$1' 保存失败:编码失败",
|
||||||
|
saveError_other="'$1' 保存失败:$2",
|
||||||
|
saveError_unknown="'$1' 保存失败:原因未知",
|
||||||
|
|
||||||
copyDone="收到了!",
|
copyDone="收到了!",
|
||||||
saveDone="保存的数据",
|
saveDone="保存的数据",
|
||||||
saveError="未能保存:",
|
|
||||||
saveError_duplicate="重复文件名",
|
|
||||||
loadError="未能加载:",
|
|
||||||
exportSuccess="成功导出",
|
exportSuccess="成功导出",
|
||||||
importSuccess="导入成功",
|
importSuccess="导入成功",
|
||||||
dataCorrupted="数据损坏",
|
dataCorrupted="数据损坏",
|
||||||
@@ -330,6 +339,7 @@ return{
|
|||||||
ctrl="控制设置",
|
ctrl="控制设置",
|
||||||
key="键映射",
|
key="键映射",
|
||||||
touch="触摸设置",
|
touch="触摸设置",
|
||||||
|
showVK="显示虚拟密钥",
|
||||||
reTime="启动延迟",
|
reTime="启动延迟",
|
||||||
RS="轮换制",
|
RS="轮换制",
|
||||||
menuPos="菜单按钮位置",
|
menuPos="菜单按钮位置",
|
||||||
@@ -460,7 +470,6 @@ return{
|
|||||||
|
|
||||||
norm="正常",
|
norm="正常",
|
||||||
pro="专业的",
|
pro="专业的",
|
||||||
hide="显示虚拟密钥",
|
|
||||||
icon="偶像",
|
icon="偶像",
|
||||||
sfx="特技效果",
|
sfx="特技效果",
|
||||||
vib="振动",
|
vib="振动",
|
||||||
@@ -724,7 +733,7 @@ return{
|
|||||||
['defender_l']= {"防守者", "疯子", "练习你的防守技巧!"},
|
['defender_l']= {"防守者", "疯子", "练习你的防守技巧!"},
|
||||||
['dig_h']= {"钻机", "硬的", "挖掘练习!"},
|
['dig_h']= {"钻机", "硬的", "挖掘练习!"},
|
||||||
['dig_u']= {"钻机", "终极", "挖掘练习!"},
|
['dig_u']= {"钻机", "终极", "挖掘练习!"},
|
||||||
['bigbang']= {"大爆炸", "容易", "所有旋转教程\n[在建]"},
|
['clearRush']= {"清晰的冲", "普通", "所有旋转教程\n[在建]"},
|
||||||
['c4wtrain_n']= {"C4W训练", "正常", "无限组合"},
|
['c4wtrain_n']= {"C4W训练", "正常", "无限组合"},
|
||||||
['c4wtrain_l']= {"C4W训练", "疯子", "无限组合"},
|
['c4wtrain_l']= {"C4W训练", "疯子", "无限组合"},
|
||||||
['pctrain_n']= {"电脑培训", "正常", "完美清晰的实践"},
|
['pctrain_n']= {"电脑培训", "正常", "完美清晰的实践"},
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -17,7 +17,7 @@ return{
|
|||||||
{name='dig_100l', x=-600, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_400l'}},
|
{name='dig_100l', x=-600, y=-200, size=40,shape=1,icon="dig_sprint", unlock={'dig_400l'}},
|
||||||
{name='dig_400l', x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
|
{name='dig_400l', x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
|
||||||
|
|
||||||
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon", unlock={'marathon_h','solo_e','round_e','blind_e','classic_e','survivor_e','bigbang','zen'}},
|
{name='marathon_n', x=0, y=-600, size=60,shape=1,icon="marathon", unlock={'marathon_h','solo_e','round_e','blind_e','classic_e','survivor_e','clearRush','zen'}},
|
||||||
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon", unlock={'master_n','strategy_e'}},
|
{name='marathon_h', x=0, y=-800, size=50,shape=1,icon="marathon", unlock={'master_n','strategy_e'}},
|
||||||
|
|
||||||
{name='solo_e', x=-600, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_n'}},
|
{name='solo_e', x=-600, y=-1000, size=40,shape=1,icon="solo", unlock={'solo_n'}},
|
||||||
@@ -76,7 +76,7 @@ return{
|
|||||||
{name='dig_h', x=700, y=-800, size=40,shape=1,icon="dig", unlock={'dig_u'}},
|
{name='dig_h', x=700, y=-800, size=40,shape=1,icon="dig", unlock={'dig_u'}},
|
||||||
{name='dig_u', x=700, y=-1000, size=40,shape=1,icon="dig"},
|
{name='dig_u', x=700, y=-1000, size=40,shape=1,icon="dig"},
|
||||||
|
|
||||||
{name='bigbang', x=400, y=-400, size=50,shape=1,icon="bigbang", unlock={'c4wtrain_n','pctrain_n','sprintAtk'}},
|
{name='clearRush', x=400, y=-400, size=50,shape=1,icon="bigbang", unlock={'c4wtrain_n','pctrain_n','sprintAtk'}},
|
||||||
{name='c4wtrain_n', x=700, y=-400, size=40,shape=1,icon="pc", unlock={'c4wtrain_l'}},
|
{name='c4wtrain_n', x=700, y=-400, size=40,shape=1,icon="pc", unlock={'c4wtrain_l'}},
|
||||||
{name='c4wtrain_l', x=900, y=-400, size=40,shape=1,icon="pc"},
|
{name='c4wtrain_l', x=900, y=-400, size=40,shape=1,icon="pc"},
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ return{
|
|||||||
das=8,arr=1,
|
das=8,arr=1,
|
||||||
drop=30,lock=30,
|
drop=30,lock=30,
|
||||||
holdCount=0,
|
holdCount=0,
|
||||||
eventSet='bigbang',
|
eventSet='clearRush',
|
||||||
bg='blockhole',bgm='peak',
|
bg='blockhole',bgm='peak',
|
||||||
},
|
},
|
||||||
score=function(P)return{P.modeData.stage,P.stat.time}end,
|
score=function(P)return{P.modeData.stage,P.stat.time}end,
|
||||||
@@ -240,8 +240,8 @@ function NET.uploadSave()
|
|||||||
{section=3,data=STRING.packTable(SETTING)},
|
{section=3,data=STRING.packTable(SETTING)},
|
||||||
{section=4,data=STRING.packTable(KEY_MAP)},
|
{section=4,data=STRING.packTable(KEY_MAP)},
|
||||||
{section=5,data=STRING.packTable(VK_ORG)},
|
{section=5,data=STRING.packTable(VK_ORG)},
|
||||||
{section=6,data=STRING.packTable(FILE.load('conf/vkSave1'))},
|
{section=6,data=STRING.packTable(loadFile('conf/vkSave1'))},
|
||||||
{section=7,data=STRING.packTable(FILE.load('conf/vkSave2'))},
|
{section=7,data=STRING.packTable(loadFile('conf/vkSave2'))},
|
||||||
}..'}}')
|
}..'}}')
|
||||||
MES.new('info',"Uploading")
|
MES.new('info',"Uploading")
|
||||||
end
|
end
|
||||||
@@ -282,13 +282,13 @@ function NET.loadSavedData(sections)
|
|||||||
applyAllSettings()
|
applyAllSettings()
|
||||||
|
|
||||||
TABLE.cover(NET.cloudData.keyMap,KEY_MAP)
|
TABLE.cover(NET.cloudData.keyMap,KEY_MAP)
|
||||||
success=success and FILE.save(KEY_MAP,'conf/key')
|
success=success and saveFile(KEY_MAP,'conf/key')
|
||||||
|
|
||||||
TABLE.cover(NET.cloudData.VK_org,VK_ORG)
|
TABLE.cover(NET.cloudData.VK_org,VK_ORG)
|
||||||
success=success and FILE.save(VK_ORG,'conf/virtualkey')
|
success=success and saveFile(VK_ORG,'conf/virtualkey')
|
||||||
|
|
||||||
success=success and FILE.save(NET.cloudData.vkSave1,'conf/vkSave1')
|
success=success and saveFile(NET.cloudData.vkSave1,'conf/vkSave1')
|
||||||
success=success and FILE.save(NET.cloudData.vkSave2,'conf/vkSave2')
|
success=success and saveFile(NET.cloudData.vkSave2,'conf/vkSave2')
|
||||||
if success then
|
if success then
|
||||||
MES.new('check',text.saveDone)
|
MES.new('check',text.saveDone)
|
||||||
end
|
end
|
||||||
@@ -460,7 +460,7 @@ function NET.updateWS_user()
|
|||||||
if res.uid then
|
if res.uid then
|
||||||
USER.uid=res.uid
|
USER.uid=res.uid
|
||||||
USER.authToken=res.authToken
|
USER.authToken=res.authToken
|
||||||
FILE.save(USER,'conf/user')
|
saveFile(USER,'conf/user')
|
||||||
if SCN.cur=='login'then
|
if SCN.cur=='login'then
|
||||||
SCN.back()
|
SCN.back()
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ return{
|
|||||||
{font=25,name="[*炎]"},
|
{font=25,name="[*炎]"},
|
||||||
{font=25,name="[*Y]"},
|
{font=25,name="[*Y]"},
|
||||||
{font=25,name="aaa222"},
|
{font=25,name="aaa222"},
|
||||||
{font=25,name="[**城]"},
|
{font=25,name="人偶"},
|
||||||
{font=25,name="cnDD"},
|
{font=25,name="cnDD"},
|
||||||
{font=25,name="红桃老给"},
|
{font=25,name="红桃老给"},
|
||||||
{font=25,name="昭庭玲秋"},
|
{font=25,name="昭庭玲秋"},
|
||||||
@@ -126,4 +126,5 @@ return{
|
|||||||
{font=25,name="费尔特林"},
|
{font=25,name="费尔特林"},
|
||||||
{font=25,name="零醇丘卡"},
|
{font=25,name="零醇丘卡"},
|
||||||
{font=25,name="Hathtiz"},
|
{font=25,name="Hathtiz"},
|
||||||
|
{font=25,name="江江江江17"},
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -782,7 +782,7 @@ function draw.norm(P,repMode)
|
|||||||
_drawFXs(P)
|
_drawFXs(P)
|
||||||
|
|
||||||
--Draw current block
|
--Draw current block
|
||||||
if P.cur and P.waiting==0 then
|
if P.alive and P.cur then
|
||||||
local C=P.cur
|
local C=P.cur
|
||||||
local curColor=C.color
|
local curColor=C.color
|
||||||
|
|
||||||
@@ -981,7 +981,6 @@ function draw.small(P)
|
|||||||
end
|
end
|
||||||
function draw.demo(P)
|
function draw.demo(P)
|
||||||
local ENV=P.gameEnv
|
local ENV=P.gameEnv
|
||||||
local curColor=P.cur.color
|
|
||||||
|
|
||||||
--Camera
|
--Camera
|
||||||
gc_push('transform')
|
gc_push('transform')
|
||||||
@@ -997,7 +996,8 @@ function draw.demo(P)
|
|||||||
gc_translate(0,600)
|
gc_translate(0,600)
|
||||||
_drawField(P)
|
_drawField(P)
|
||||||
_drawFXs(P)
|
_drawFXs(P)
|
||||||
if P.cur and P.waiting==0 then
|
if P.alive and P.cur then
|
||||||
|
local curColor=P.cur.color
|
||||||
if ENV.ghost then
|
if ENV.ghost then
|
||||||
drawGhost[ENV.ghostType](P.cur.bk,P.curX,P.ghoY,ENV.ghost,P.skinLib,curColor)
|
drawGhost[ENV.ghostType](P.cur.bk,P.curX,P.ghoY,ENV.ghost,P.skinLib,curColor)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -201,6 +201,20 @@ end
|
|||||||
--------------------------</FX>--------------------------
|
--------------------------</FX>--------------------------
|
||||||
|
|
||||||
--------------------------<Action>--------------------------
|
--------------------------<Action>--------------------------
|
||||||
|
function Player:_deepDrop()
|
||||||
|
local CB=self.cur.bk
|
||||||
|
local y=self.curY-1
|
||||||
|
while self:ifoverlap(CB,self.curX,y)and y>0 do
|
||||||
|
y=y-1
|
||||||
|
end
|
||||||
|
if y>0 then
|
||||||
|
self.ghoY=y
|
||||||
|
self:createDropFX()
|
||||||
|
self.curY=y
|
||||||
|
self:freshBlock('move')
|
||||||
|
SFX.play('swipe')
|
||||||
|
end
|
||||||
|
end
|
||||||
function Player:act_moveLeft(auto)
|
function Player:act_moveLeft(auto)
|
||||||
if not auto then
|
if not auto then
|
||||||
self.ctrlCount=self.ctrlCount+1
|
self.ctrlCount=self.ctrlCount+1
|
||||||
@@ -244,21 +258,21 @@ function Player:act_moveRight(auto)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_rotRight()
|
function Player:act_rotRight()
|
||||||
if self.control and self.waiting==0 and self.cur then
|
if self.control and self.cur then
|
||||||
self.ctrlCount=self.ctrlCount+1
|
self.ctrlCount=self.ctrlCount+1
|
||||||
self:spin(1)
|
self:spin(1)
|
||||||
self.keyPressing[3]=false
|
self.keyPressing[3]=false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_rotLeft()
|
function Player:act_rotLeft()
|
||||||
if self.control and self.waiting==0 and self.cur then
|
if self.control and self.cur then
|
||||||
self.ctrlCount=self.ctrlCount+1
|
self.ctrlCount=self.ctrlCount+1
|
||||||
self:spin(3)
|
self:spin(3)
|
||||||
self.keyPressing[4]=false
|
self.keyPressing[4]=false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_rot180()
|
function Player:act_rot180()
|
||||||
if self.control and self.waiting==0 and self.cur then
|
if self.control and self.cur then
|
||||||
self.ctrlCount=self.ctrlCount+2
|
self.ctrlCount=self.ctrlCount+2
|
||||||
self:spin(2)
|
self:spin(2)
|
||||||
self.keyPressing[5]=false
|
self.keyPressing[5]=false
|
||||||
@@ -266,7 +280,7 @@ function Player:act_rot180()
|
|||||||
end
|
end
|
||||||
function Player:act_hardDrop()
|
function Player:act_hardDrop()
|
||||||
local ENV=self.gameEnv
|
local ENV=self.gameEnv
|
||||||
if self.control and self.waiting==0 and self.cur then
|
if self.control and self.cur then
|
||||||
if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frame<ENV.dropcut then
|
if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frame<ENV.dropcut then
|
||||||
SFX.play('drop_cancel',.3)
|
SFX.play('drop_cancel',.3)
|
||||||
else
|
else
|
||||||
@@ -290,34 +304,23 @@ function Player:act_hardDrop()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_softDrop()
|
function Player:act_softDrop()
|
||||||
local ENV=self.gameEnv
|
|
||||||
self.downing=1
|
self.downing=1
|
||||||
if self.control and self.waiting==0 and self.cur then
|
if self.control and self.cur then
|
||||||
if self.curY>self.ghoY then
|
if self.curY>self.ghoY then
|
||||||
self.curY=self.curY-1
|
self.curY=self.curY-1
|
||||||
self:freshBlock('fresh')
|
self:freshBlock('fresh')
|
||||||
self.spinLast=false
|
self.spinLast=false
|
||||||
self:checkTouchSound()
|
self:checkTouchSound()
|
||||||
elseif ENV.deepDrop then
|
elseif self.gameEnv.deepdrop then
|
||||||
local CB=self.cur.bk
|
self:_deepdrop()
|
||||||
local y=self.curY-1
|
|
||||||
while self:ifoverlap(CB,self.curX,y)and y>0 do
|
|
||||||
y=y-1
|
|
||||||
end
|
|
||||||
if y>0 then
|
|
||||||
self.ghoY=y
|
|
||||||
self:createDropFX()
|
|
||||||
self.curY=y
|
|
||||||
self:freshBlock('move')
|
|
||||||
SFX.play('swipe')
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_hold()
|
function Player:act_hold()
|
||||||
if self.control and self.waiting==0 then
|
if self.control and self.cur then
|
||||||
self:hold()
|
if self:hold()then
|
||||||
self.keyPressing[8]=false
|
self.keyPressing[8]=false
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_func1()
|
function Player:act_func1()
|
||||||
@@ -392,31 +395,43 @@ function Player:act_insDown()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_down1()
|
function Player:act_down1()
|
||||||
if self.cur and self.curY>self.ghoY then
|
if self.cur then
|
||||||
self:createMoveFX('down')
|
if self.curY>self.ghoY then
|
||||||
self.curY=self.curY-1
|
self:createMoveFX('down')
|
||||||
self:freshBlock('fresh')
|
self.curY=self.curY-1
|
||||||
self.spinLast=false
|
self:freshBlock('fresh')
|
||||||
|
self.spinLast=false
|
||||||
|
elseif self.gameEnv.deepdrop then
|
||||||
|
self:_deepdrop()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_down4()
|
function Player:act_down4()
|
||||||
if self.cur and self.curY>self.ghoY then
|
if self.cur then
|
||||||
local ghoY0=self.ghoY
|
if self.curY>self.ghoY then
|
||||||
self.ghoY=max(self.curY-4,self.ghoY)
|
local ghoY0=self.ghoY
|
||||||
self:createDropFX()
|
self.ghoY=max(self.curY-4,self.ghoY)
|
||||||
self.curY,self.ghoY=self.ghoY,ghoY0
|
self:createDropFX()
|
||||||
self:freshBlock('fresh')
|
self.curY,self.ghoY=self.ghoY,ghoY0
|
||||||
self.spinLast=false
|
self:freshBlock('fresh')
|
||||||
|
self.spinLast=false
|
||||||
|
elseif self.gameEnv.deepdrop then
|
||||||
|
self:_deepdrop()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_down10()
|
function Player:act_down10()
|
||||||
if self.cur and self.curY>self.ghoY then
|
if self.cur then
|
||||||
local ghoY0=self.ghoY
|
if self.curY>self.ghoY then
|
||||||
self.ghoY=max(self.curY-10,self.ghoY)
|
local ghoY0=self.ghoY
|
||||||
self:createDropFX()
|
self.ghoY=max(self.curY-0,self.ghoY)
|
||||||
self.curY,self.ghoY=self.ghoY,ghoY0
|
self:createDropFX()
|
||||||
self:freshBlock('fresh')
|
self.curY,self.ghoY=self.ghoY,ghoY0
|
||||||
self.spinLast=false
|
self:freshBlock('fresh')
|
||||||
|
self.spinLast=false
|
||||||
|
elseif self.gameEnv.deepdrop then
|
||||||
|
self:_deepdrop()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
function Player:act_dropLeft()
|
function Player:act_dropLeft()
|
||||||
@@ -475,7 +490,9 @@ local playerActions={
|
|||||||
if self.keyAvailable[keyID]and self.alive then
|
if self.keyAvailable[keyID]and self.alive then
|
||||||
if self.waiting>self.gameEnv.hurry then
|
if self.waiting>self.gameEnv.hurry then
|
||||||
self.waiting=self.gameEnv.hurry
|
self.waiting=self.gameEnv.hurry
|
||||||
if self.waiting==0 then self:popNext()end
|
if self.waiting==0 and self.falling==0 then
|
||||||
|
self:popNext()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
self.keyPressing[keyID]=true
|
self.keyPressing[keyID]=true
|
||||||
playerActions[keyID](self)
|
playerActions[keyID](self)
|
||||||
@@ -1308,12 +1325,13 @@ function Player:hold_swap(ifpre)
|
|||||||
self.stat.hold=self.stat.hold+1
|
self.stat.hold=self.stat.hold+1
|
||||||
end
|
end
|
||||||
function Player:hold(ifpre)
|
function Player:hold(ifpre)
|
||||||
if self.holdTime>0 and(ifpre or self.waiting==0)then
|
if self.holdTime>0 and(ifpre or self.falling==0 and self.waiting==0)then
|
||||||
if self.gameEnv.holdMode=='hold'then
|
if self.gameEnv.holdMode=='hold'then
|
||||||
self:hold_norm(ifpre)
|
self:hold_norm(ifpre)
|
||||||
elseif self.gameEnv.holdMode=='swap'then
|
elseif self.gameEnv.holdMode=='swap'then
|
||||||
self:hold_swap(ifpre)
|
self:hold_swap(ifpre)
|
||||||
end
|
end
|
||||||
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1372,8 +1390,10 @@ function Player:popNext(ifhold)--Pop nextQueue to hand
|
|||||||
self:act_hardDrop()
|
self:act_hardDrop()
|
||||||
pressing[6]=false
|
pressing[6]=false
|
||||||
end
|
end
|
||||||
else
|
elseif self.holdQueue[1]then--Force using hold
|
||||||
self:hold()
|
self:hold()
|
||||||
|
else--Next queue is empty, force lose
|
||||||
|
self:lose(true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -2005,7 +2025,12 @@ do
|
|||||||
self:_triggerEvent('hook_drop')
|
self:_triggerEvent('hook_drop')
|
||||||
end
|
end
|
||||||
|
|
||||||
if self.waiting==0 then self:popNext()end
|
--Remove controling block
|
||||||
|
self.cur=nil
|
||||||
|
|
||||||
|
if self.waiting==0 and self.falling==0 then
|
||||||
|
self:popNext()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function Player:clearFilledLines(start,height)
|
function Player:clearFilledLines(start,height)
|
||||||
@@ -2321,7 +2346,7 @@ local function update_alive(P)
|
|||||||
if P.movDir~=0 then
|
if P.movDir~=0 then
|
||||||
local das,arr=ENV.das,ENV.arr
|
local das,arr=ENV.das,ENV.arr
|
||||||
local mov=P.moving
|
local mov=P.moving
|
||||||
if P.waiting==0 then
|
if P.cur then
|
||||||
if P.movDir==1 then
|
if P.movDir==1 then
|
||||||
if P.keyPressing[2]then
|
if P.keyPressing[2]then
|
||||||
if arr>0 then
|
if arr>0 then
|
||||||
@@ -2405,8 +2430,11 @@ local function update_alive(P)
|
|||||||
P.downing=0
|
P.downing=0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local stopAtFalling
|
||||||
|
|
||||||
--Falling animation
|
--Falling animation
|
||||||
if P.falling>0 then
|
if P.falling>0 then
|
||||||
|
stopAtFalling=true
|
||||||
P:_updateFalling(P.falling-1)
|
P:_updateFalling(P.falling-1)
|
||||||
if P.falling>0 then
|
if P.falling>0 then
|
||||||
goto THROW_stop
|
goto THROW_stop
|
||||||
@@ -2416,8 +2444,10 @@ local function update_alive(P)
|
|||||||
--Update block state
|
--Update block state
|
||||||
if P.control then
|
if P.control then
|
||||||
--Try spawn new block
|
--Try spawn new block
|
||||||
if P.waiting>0 then
|
if not P.cur then
|
||||||
P.waiting=P.waiting-1
|
if not stopAtFalling and P.waiting>0 then
|
||||||
|
P.waiting=P.waiting-1
|
||||||
|
end
|
||||||
if P.waiting<=0 then
|
if P.waiting<=0 then
|
||||||
P:popNext()
|
P:popNext()
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -256,9 +256,6 @@ local seqGenerators={
|
|||||||
if seq[1]then
|
if seq[1]then
|
||||||
P:getNext(rem(seq))
|
P:getNext(rem(seq))
|
||||||
else
|
else
|
||||||
if not(P.cur or P.nextQueue[1]or P.holdQueue[1])then
|
|
||||||
P:lose(true)
|
|
||||||
end
|
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ end
|
|||||||
|
|
||||||
function scene.mouseDown(x,y)
|
function scene.mouseDown(x,y)
|
||||||
if x>55 and y>550 and x<510 and y<670 then
|
if x>55 and y>550 and x<510 and y<670 then
|
||||||
loadGame('sprintSym',true)
|
loadGame('stack_e',true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
scene.touchDown=scene.mouseDown
|
scene.touchDown=scene.mouseDown
|
||||||
@@ -19,7 +19,7 @@ function scene.keyDown(key)
|
|||||||
if key=="escape"then
|
if key=="escape"then
|
||||||
SCN.back()
|
SCN.back()
|
||||||
elseif key=="space"then
|
elseif key=="space"then
|
||||||
loadGame('sprintSym',true)
|
loadGame('stack_e',true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ local kb=love.keyboard
|
|||||||
local ins,rem=table.insert,table.remove
|
local ins,rem=table.insert,table.remove
|
||||||
local C=COLOR
|
local C=COLOR
|
||||||
|
|
||||||
local inputBox=WIDGET.newInputBox{name='input',x=40,y=650,w=1200,h=50}
|
local inputBox=WIDGET.newInputBox{name='input',x=40,y=650,w=1200,h=50,fType='mono'}
|
||||||
local outputBox=WIDGET.newTextBox{name='output',x=40,y=30,w=1200,h=610,font=25,lineH=25,fix=true}
|
local outputBox=WIDGET.newTextBox{name='output',x=40,y=30,w=1200,h=610,font=25,fType='mono',lineH=25,fix=true}
|
||||||
|
|
||||||
local function log(str)outputBox:push(str)end
|
local function log(str)outputBox:push(str)end
|
||||||
log{C.lP,"Techmino Console"}
|
log{C.lP,"Techmino Console"}
|
||||||
|
|||||||
@@ -64,11 +64,11 @@ function scene.keyDown(key,isRep)
|
|||||||
end
|
end
|
||||||
if key=="return2"or kb.isDown("lalt","lctrl","lshift")then
|
if key=="return2"or kb.isDown("lalt","lctrl","lshift")then
|
||||||
if #FIELD[1]>0 then
|
if #FIELD[1]>0 then
|
||||||
FILE.save(CUSTOMENV,'conf/customEnv')
|
saveFile(CUSTOMENV,'conf/customEnv')
|
||||||
loadGame('custom_puzzle',true)
|
loadGame('custom_puzzle',true)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
FILE.save(CUSTOMENV,'conf/customEnv')
|
saveFile(CUSTOMENV,'conf/customEnv')
|
||||||
loadGame('custom_clear',true)
|
loadGame('custom_clear',true)
|
||||||
end
|
end
|
||||||
elseif key=="f"then
|
elseif key=="f"then
|
||||||
@@ -84,10 +84,10 @@ function scene.keyDown(key,isRep)
|
|||||||
TABLE.clear(CUSTOMENV)
|
TABLE.clear(CUSTOMENV)
|
||||||
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
|
TABLE.complete(require"parts.customEnv0",CUSTOMENV)
|
||||||
for _,W in next,scene.widgetList do W:reset()end
|
for _,W in next,scene.widgetList do W:reset()end
|
||||||
FILE.save(DATA.copyMission(),'conf/customMissions')
|
saveFile(DATA.copyMission(),'conf/customMissions')
|
||||||
FILE.save(DATA.copyBoards(),'conf/customBoards')
|
saveFile(DATA.copyBoards(),'conf/customBoards')
|
||||||
FILE.save(DATA.copySequence(),'conf/customSequence')
|
saveFile(DATA.copySequence(),'conf/customSequence')
|
||||||
FILE.save(CUSTOMENV,'conf/customEnv')
|
saveFile(CUSTOMENV,'conf/customEnv')
|
||||||
sure=0
|
sure=0
|
||||||
SFX.play('finesseError',.7)
|
SFX.play('finesseError',.7)
|
||||||
BG.set(CUSTOMENV.bg)
|
BG.set(CUSTOMENV.bg)
|
||||||
@@ -123,7 +123,7 @@ function scene.keyDown(key,isRep)
|
|||||||
do return end
|
do return end
|
||||||
::THROW_fail::MES.new('error',text.dataCorrupted)
|
::THROW_fail::MES.new('error',text.dataCorrupted)
|
||||||
elseif key=="escape"then
|
elseif key=="escape"then
|
||||||
FILE.save(CUSTOMENV,'conf/customEnv')
|
saveFile(CUSTOMENV,'conf/customEnv')
|
||||||
SCN.back()
|
SCN.back()
|
||||||
else
|
else
|
||||||
WIDGET.keyPressed(key)
|
WIDGET.keyPressed(key)
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ function scene.sceneInit()
|
|||||||
page=1
|
page=1
|
||||||
end
|
end
|
||||||
function scene.sceneBack()
|
function scene.sceneBack()
|
||||||
FILE.save(DATA.copyBoards(),'conf/customBoards')
|
saveFile(DATA.copyBoards(),'conf/customBoards')
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.mouseMove(x,y)
|
function scene.mouseMove(x,y)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ function scene.sceneInit()
|
|||||||
sure=0
|
sure=0
|
||||||
end
|
end
|
||||||
function scene.sceneBack()
|
function scene.sceneBack()
|
||||||
FILE.save(DATA.copyMission(),'conf/customMissions')
|
saveFile(DATA.copyMission(),'conf/customMissions')
|
||||||
end
|
end
|
||||||
|
|
||||||
local ENUM_MISSION=ENUM_MISSION
|
local ENUM_MISSION=ENUM_MISSION
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ function scene.sceneInit()
|
|||||||
sure=0
|
sure=0
|
||||||
end
|
end
|
||||||
function scene.sceneBack()
|
function scene.sceneBack()
|
||||||
FILE.save(DATA.copySequence(),'conf/customSequence')
|
saveFile(DATA.copySequence(),'conf/customSequence')
|
||||||
end
|
end
|
||||||
|
|
||||||
local minoKey={
|
local minoKey={
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ local loadingThread=coroutine.wrap(function()
|
|||||||
YIELD('loadSample')SFX.loadSample{name='lead',path='media/sample/lead',base='A3'}--A3~A5
|
YIELD('loadSample')SFX.loadSample{name='lead',path='media/sample/lead',base='A3'}--A3~A5
|
||||||
YIELD('loadSample')SFX.loadSample{name='bell',path='media/sample/bell',base='A4'}--A4~A6
|
YIELD('loadSample')SFX.loadSample{name='bell',path='media/sample/bell',base='A4'}--A4~A6
|
||||||
YIELD('loadVoice')VOC.load('media/vocal/'..SETTING.vocPack..'/')
|
YIELD('loadVoice')VOC.load('media/vocal/'..SETTING.vocPack..'/')
|
||||||
YIELD('loadFont')for i=1,17 do getFont(15+5*i)end
|
YIELD('loadFont')for i=1,17 do getFont(15+5*i)getFont(15+5*i,'mono')end
|
||||||
|
|
||||||
YIELD('loadModeIcon')
|
YIELD('loadModeIcon')
|
||||||
local modeIcons={}
|
local modeIcons={}
|
||||||
@@ -96,7 +96,7 @@ local loadingThread=coroutine.wrap(function()
|
|||||||
|
|
||||||
YIELD('loadMode')
|
YIELD('loadMode')
|
||||||
for _,M in next,MODES do
|
for _,M in next,MODES do
|
||||||
M.records=FILE.load("record/"..M.name..".rec",'luaon')or M.score and{}
|
M.records=loadFile("record/"..M.name..".rec",'-luaon -canSkip')or M.score and{}
|
||||||
M.icon=M.icon and(modeIcons[M.icon]or gc.newImage("media/image/modeicon/"..M.icon..".png"))
|
M.icon=M.icon and(modeIcons[M.icon]or gc.newImage("media/image/modeicon/"..M.icon..".png"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ local function _login()
|
|||||||
end
|
end
|
||||||
NET.wsconn_user_pswd(email,password)
|
NET.wsconn_user_pswd(email,password)
|
||||||
if savePW then
|
if savePW then
|
||||||
FILE.save({email,password},'conf/account')
|
saveFile({email,password},'conf/account')
|
||||||
else
|
else
|
||||||
love.filesystem.remove('conf/account')
|
love.filesystem.remove('conf/account')
|
||||||
end
|
end
|
||||||
@@ -21,7 +21,7 @@ end
|
|||||||
local scene={}
|
local scene={}
|
||||||
|
|
||||||
function scene.sceneInit()
|
function scene.sceneInit()
|
||||||
local data=FILE.load('conf/account')
|
local data=loadFile('conf/account')
|
||||||
if data then
|
if data then
|
||||||
savePW=true
|
savePW=true
|
||||||
emailBox:setText(data[1])
|
emailBox:setText(data[1])
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ local author={
|
|||||||
["race remix"]="柒栎流星",
|
["race remix"]="柒栎流星",
|
||||||
["sakura"]="ZUN & C₂₉H₂₅N₃O₅",
|
["sakura"]="ZUN & C₂₉H₂₅N₃O₅",
|
||||||
["1980s"]="C₂₉H₂₅N₃O₅",
|
["1980s"]="C₂₉H₂₅N₃O₅",
|
||||||
|
["malate"]="ZUN & C₂₉H₂₅N₃O₅",
|
||||||
}
|
}
|
||||||
|
|
||||||
local scene={}
|
local scene={}
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ scene.widgetList={
|
|||||||
NET.wsclose_user()
|
NET.wsclose_user()
|
||||||
USER.uid=false
|
USER.uid=false
|
||||||
USER.authToken=false
|
USER.authToken=false
|
||||||
FILE.save(USER,'conf/user')
|
saveFile(USER,'conf/user')
|
||||||
SCN.back()
|
SCN.back()
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ scene.widgetList={
|
|||||||
WIDGET.newSwitch{name='ospin', x=850, y=850, lim=210,disp=ROOMval('ospin'), code=ROOMrev('ospin')},
|
WIDGET.newSwitch{name='ospin', x=850, y=850, lim=210,disp=ROOMval('ospin'), code=ROOMrev('ospin')},
|
||||||
WIDGET.newSwitch{name='fineKill', x=850, y=910, lim=210,disp=ROOMval('fineKill'), code=ROOMrev('fineKill')},
|
WIDGET.newSwitch{name='fineKill', x=850, y=910, lim=210,disp=ROOMval('fineKill'), code=ROOMrev('fineKill')},
|
||||||
WIDGET.newSwitch{name='b2bKill', x=850, y=970, lim=210,disp=ROOMval('b2bKill'), code=ROOMrev('b2bKill')},
|
WIDGET.newSwitch{name='b2bKill', x=850, y=970, lim=210,disp=ROOMval('b2bKill'), code=ROOMrev('b2bKill')},
|
||||||
WIDGET.newSwitch{name='lockout', x=850, y=1030,lim=210,disp=ROOMval('lockout'), code=ROOMval('lockout')},
|
WIDGET.newSwitch{name='lockout', x=850, y=1030,lim=210,disp=ROOMval('lockout'), code=ROOMrev('lockout')},
|
||||||
WIDGET.newSwitch{name='easyFresh', x=1170,y=850, lim=250,disp=ROOMval('easyFresh'),code=ROOMrev('easyFresh')},
|
WIDGET.newSwitch{name='easyFresh', x=1170,y=850, lim=250,disp=ROOMval('easyFresh'),code=ROOMrev('easyFresh')},
|
||||||
WIDGET.newSwitch{name='deepDrop', x=1170,y=910, lim=250,disp=ROOMval('deepDrop'), code=ROOMrev('deepDrop')},
|
WIDGET.newSwitch{name='deepDrop', x=1170,y=910, lim=250,disp=ROOMval('deepDrop'), code=ROOMrev('deepDrop')},
|
||||||
WIDGET.newSwitch{name='bone', x=1170,y=970, lim=250,disp=ROOMval('bone'), code=ROOMrev('bone')},
|
WIDGET.newSwitch{name='bone', x=1170,y=970, lim=250,disp=ROOMval('bone'), code=ROOMrev('bone')},
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ function scene.keyDown(key)
|
|||||||
local rep=listBox:getSel()
|
local rep=listBox:getSel()
|
||||||
if rep then
|
if rep then
|
||||||
if rep.available and rep.fileName then
|
if rep.available and rep.fileName then
|
||||||
local repStr=FILE.load(rep.fileName,'string')
|
local repStr=loadFile(rep.fileName,'-string')
|
||||||
if repStr then
|
if repStr then
|
||||||
love.system.setClipboardText(love.data.encode('string','base64',repStr))
|
love.system.setClipboardText(love.data.encode('string','base64',repStr))
|
||||||
MES.new('info',text.exportSuccess)
|
MES.new('info',text.exportSuccess)
|
||||||
@@ -108,7 +108,7 @@ function scene.keyDown(key)
|
|||||||
local fileName=os.date("replay/%Y_%m_%d_%H%M%S_import.rep")
|
local fileName=os.date("replay/%Y_%m_%d_%H%M%S_import.rep")
|
||||||
local rep=DATA.parseReplayData(fileName,fileData,false)
|
local rep=DATA.parseReplayData(fileName,fileData,false)
|
||||||
if rep.available then
|
if rep.available then
|
||||||
if FILE.save(fileData,fileName,'d')then
|
if saveFile(fileData,fileName,'-d')then
|
||||||
table.insert(REPLAY,1,rep)
|
table.insert(REPLAY,1,rep)
|
||||||
MES.new('info',text.importSuccess)
|
MES.new('info',text.importSuccess)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -71,7 +71,7 @@ scene.widgetList={
|
|||||||
local D=_parseCB()
|
local D=_parseCB()
|
||||||
if D then
|
if D then
|
||||||
TABLE.update(D,VK_ORG)
|
TABLE.update(D,VK_ORG)
|
||||||
FILE.save(VK_ORG,'conf/virtualkey')
|
saveFile(VK_ORG,'conf/virtualkey')
|
||||||
MES.new('check',text.importSuccess)
|
MES.new('check',text.importSuccess)
|
||||||
else
|
else
|
||||||
MES.new('error',text.dataCorrupted)
|
MES.new('error',text.dataCorrupted)
|
||||||
|
|||||||
@@ -39,8 +39,9 @@ scene.widgetList={
|
|||||||
WIDGET.newButton{name='layout', x=250, y=540, w=200,h=70,font=35,code=goScene'setting_skin'},
|
WIDGET.newButton{name='layout', x=250, y=540, w=200,h=70,font=35,code=goScene'setting_skin'},
|
||||||
|
|
||||||
WIDGET.newButton{name='ctrl', x=290, y=220, w=320,h=80,font=35,code=goScene'setting_control'},
|
WIDGET.newButton{name='ctrl', x=290, y=220, w=320,h=80,font=35,code=goScene'setting_control'},
|
||||||
WIDGET.newButton{name='key', x=640, y=220, w=320,h=80,color=MOBILE and'dH',font=35,code=goScene'setting_key'},
|
WIDGET.newButton{name='key', x=640, y=220, w=320,h=80,color=MOBILE and'dH',font=35, code=goScene'setting_key'},
|
||||||
WIDGET.newButton{name='touch', x=990, y=220, w=320,h=80,color=not MOBILE and'dH',font=35,code=goScene'setting_touch'},
|
WIDGET.newButton{name='touch', x=990, y=220, w=320,h=80,color=not MOBILE and'dH',font=35, code=goScene'setting_touch',hideF=function()return not SETTING.VKSwitch end},
|
||||||
|
WIDGET.newSwitch{name='showVK', x=1100, y=150, lim=400, disp=SETval('VKSwitch'), code=SETrev('VKSwitch')},
|
||||||
WIDGET.newSlider{name='reTime', x=330, y=320, w=300,lim=180,unit=10,disp=SETval('reTime'), code=SETsto('reTime'),show=function(S)return(.5+S.disp()*.25).."s"end},
|
WIDGET.newSlider{name='reTime', x=330, y=320, w=300,lim=180,unit=10,disp=SETval('reTime'), code=SETsto('reTime'),show=function(S)return(.5+S.disp()*.25).."s"end},
|
||||||
WIDGET.newSelector{name='RS', x=300, y=420, w=300,color='S', disp=SETval('RS'), code=SETsto('RS'),list={'TRS','SRS','SRS_plus','SRS_X','BiRS','ARS_Z','ASC','ASC_plus','C2','C2_sym','Classic','Classic_plus','None','None_plus'}},
|
WIDGET.newSelector{name='RS', x=300, y=420, w=300,color='S', disp=SETval('RS'), code=SETsto('RS'),list={'TRS','SRS','SRS_plus','SRS_X','BiRS','ARS_Z','ASC','ASC_plus','C2','C2_sym','Classic','Classic_plus','None','None_plus'}},
|
||||||
WIDGET.newSelector{name='menuPos',x=980, y=320, w=300,color='O', disp=SETval('menuPos'), code=SETsto('menuPos'),list={'left','middle','right'}},
|
WIDGET.newSelector{name='menuPos',x=980, y=320, w=300,color='O', disp=SETval('menuPos'), code=SETsto('menuPos'),list={'left','middle','right'}},
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ function scene.sceneInit()
|
|||||||
BG.set('none')
|
BG.set('none')
|
||||||
end
|
end
|
||||||
function scene.sceneBack()
|
function scene.sceneBack()
|
||||||
FILE.save(KEY_MAP,'conf/key')
|
saveFile(KEY_MAP,'conf/key')
|
||||||
end
|
end
|
||||||
|
|
||||||
local forbbidenKeys={
|
local forbbidenKeys={
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ local function _nextSkin(i)
|
|||||||
SETTING.skin[i]=SETTING.skin[i]%16+1
|
SETTING.skin[i]=SETTING.skin[i]%16+1
|
||||||
end
|
end
|
||||||
local function _nextDir(i)
|
local function _nextDir(i)
|
||||||
|
trySettingWarn()
|
||||||
SETTING.face[i]=(SETTING.face[i]+1)%4
|
SETTING.face[i]=(SETTING.face[i]+1)%4
|
||||||
minoRot0[i]=minoRot0[i]+1.5707963
|
minoRot0[i]=minoRot0[i]+1.5707963
|
||||||
if not selEggMode and not GAME.playing then
|
if not selEggMode and not GAME.playing then
|
||||||
|
|||||||
@@ -9,10 +9,10 @@ local snapUnit=1
|
|||||||
local selected--Button selected
|
local selected--Button selected
|
||||||
|
|
||||||
local function _save1()
|
local function _save1()
|
||||||
FILE.save(VK_ORG,'conf/vkSave1')
|
saveFile(VK_ORG,'conf/vkSave1')
|
||||||
end
|
end
|
||||||
local function _load1()
|
local function _load1()
|
||||||
local D=FILE.load('conf/vkSave1')
|
local D=loadFile('conf/vkSave1')
|
||||||
if D then
|
if D then
|
||||||
TABLE.update(D,VK_ORG)
|
TABLE.update(D,VK_ORG)
|
||||||
else
|
else
|
||||||
@@ -20,10 +20,10 @@ local function _load1()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
local function _save2()
|
local function _save2()
|
||||||
FILE.save(VK_ORG,'conf/vkSave2')
|
saveFile(VK_ORG,'conf/vkSave2')
|
||||||
end
|
end
|
||||||
local function _load2()
|
local function _load2()
|
||||||
local D=FILE.load('conf/vkSave2')
|
local D=loadFile('conf/vkSave2')
|
||||||
if D then
|
if D then
|
||||||
TABLE.update(D,VK_ORG)
|
TABLE.update(D,VK_ORG)
|
||||||
else
|
else
|
||||||
@@ -37,7 +37,7 @@ function scene.sceneInit()
|
|||||||
selected=false
|
selected=false
|
||||||
end
|
end
|
||||||
function scene.sceneBack()
|
function scene.sceneBack()
|
||||||
FILE.save(VK_ORG,'conf/virtualkey')
|
saveFile(VK_ORG,'conf/virtualkey')
|
||||||
end
|
end
|
||||||
|
|
||||||
local function _onVK_org(x,y)
|
local function _onVK_org(x,y)
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ function scene.sceneInit()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function scene.draw()
|
function scene.draw()
|
||||||
if SETTING.VKSwitch and SETTING.VKTrack then
|
if SETTING.VKTrack then
|
||||||
love.graphics.setColor(1,1,1)
|
love.graphics.setColor(1,1,1)
|
||||||
setFont(30)
|
setFont(30)
|
||||||
mStr(text.VKTchW,140+500*SETTING.VKTchW,800-WIDGET.scrollPos)
|
mStr(text.VKTchW,140+500*SETTING.VKTchW,800-WIDGET.scrollPos)
|
||||||
@@ -15,9 +15,17 @@ function scene.draw()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function _VKAdisp(n)return function()return VK_ORG[n].ava end end
|
local function _VKAdisp(n)return function()return VK_ORG[n].ava end end
|
||||||
local function _VKAcode(n)return function()VK_ORG[n].ava=not VK_ORG[n].ava end end
|
local function _VKAcode(n)
|
||||||
local function _notShow()return not SETTING.VKSwitch end
|
return n<10 and
|
||||||
local function _notTrack()return not(SETTING.VKSwitch and SETTING.VKTrack)end
|
function()
|
||||||
|
VK_ORG[n].ava=not VK_ORG[n].ava
|
||||||
|
trySettingWarn()
|
||||||
|
end or
|
||||||
|
function()
|
||||||
|
VK_ORG[n].ava=not VK_ORG[n].ava
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local function _notTrack()return not SETTING.VKTrack end
|
||||||
|
|
||||||
scene.widgetScrollHeight=340
|
scene.widgetScrollHeight=340
|
||||||
scene.widgetList={
|
scene.widgetList={
|
||||||
@@ -44,13 +52,12 @@ scene.widgetList={
|
|||||||
|
|
||||||
WIDGET.newButton{name='norm', x=840, y=80, w=240,h=80, font=35,code=function()for i=1,20 do VK_ORG[i].ava=i<11 end end},
|
WIDGET.newButton{name='norm', x=840, y=80, w=240,h=80, font=35,code=function()for i=1,20 do VK_ORG[i].ava=i<11 end end},
|
||||||
WIDGET.newButton{name='pro', x=1120, y=80, w=240,h=80, font=35,code=function()for i=1,20 do VK_ORG[i].ava=true end end},
|
WIDGET.newButton{name='pro', x=1120, y=80, w=240,h=80, font=35,code=function()for i=1,20 do VK_ORG[i].ava=true end end},
|
||||||
WIDGET.newSwitch{name='hide', x=1150, y=200, lim=400, font=40,disp=SETval('VKSwitch'),code=SETrev('VKSwitch')},
|
WIDGET.newSwitch{name='icon', x=1150, y=240, lim=400, font=35,disp=SETval('VKIcon'),code=SETrev('VKIcon')},
|
||||||
WIDGET.newSwitch{name='icon', x=1150, y=300, lim=400, font=40,disp=SETval('VKIcon'),code=SETrev('VKIcon'),hideF=_notShow},
|
WIDGET.newSlider{name='sfx', x=830, y=320, lim=160,w=400, font=35,change=function()SFX.play('virtualKey',SETTING.VKSFX)end,disp=SETval('VKSFX'),code=SETsto('VKSFX')},
|
||||||
WIDGET.newSlider{name='sfx', x=830, y=380, lim=160,w=400, font=35,change=function()SFX.play('virtualKey',SETTING.VKSFX)end,disp=SETval('VKSFX'),code=SETsto('VKSFX'),hideF=_notShow},
|
WIDGET.newSlider{name='vib', x=830, y=390, lim=160,w=400,unit=6, font=35,change=function()if SETTING.vib>0 then VIB(SETTING.vib+SETTING.VKVIB)end end,disp=SETval('VKVIB'),code=SETsto('VKVIB')},
|
||||||
WIDGET.newSlider{name='vib', x=830, y=450, lim=160,w=400,unit=6, font=35,change=function()if SETTING.vib>0 then VIB(SETTING.vib+SETTING.VKVIB)end end,disp=SETval('VKVIB'),code=SETsto('VKVIB'),hideF=_notShow},
|
WIDGET.newSlider{name='alpha', x=830, y=460, lim=160,w=400, font=35,disp=SETval('VKAlpha'),code=SETsto('VKAlpha')},
|
||||||
WIDGET.newSlider{name='alpha', x=830, y=520, lim=160,w=400, font=40,disp=SETval('VKAlpha'),code=SETsto('VKAlpha'),hideF=_notShow},
|
|
||||||
|
|
||||||
WIDGET.newSwitch{name='track', x=360, y=720, lim=250, font=35,disp=SETval('VKTrack'),code=SETrev('VKTrack'),hideF=_notShow},
|
WIDGET.newSwitch{name='track', x=360, y=720, lim=250, font=35,disp=SETval('VKTrack'),code=SETrev('VKTrack')},
|
||||||
WIDGET.newSwitch{name='dodge', x=800, y=720, lim=250, font=35,disp=SETval('VKDodge'),code=SETrev('VKDodge'),hideF=_notTrack},
|
WIDGET.newSwitch{name='dodge', x=800, y=720, lim=250, font=35,disp=SETval('VKDodge'),code=SETrev('VKDodge'),hideF=_notTrack},
|
||||||
WIDGET.newSlider{name='tchW', x=140, y=860, w=1000, font=35,disp=SETval('VKTchW'),code=function(i)SETTING.VKTchW=i SETTING.VKCurW=math.max(SETTING.VKCurW,i)end,hideF=_notTrack},
|
WIDGET.newSlider{name='tchW', x=140, y=860, w=1000, font=35,disp=SETval('VKTchW'),code=function(i)SETTING.VKTchW=i SETTING.VKCurW=math.max(SETTING.VKCurW,i)end,hideF=_notTrack},
|
||||||
WIDGET.newSlider{name='curW', x=140, y=930, w=1000, font=35,disp=SETval('VKCurW'),code=function(i)SETTING.VKCurW=i SETTING.VKTchW=math.min(SETTING.VKTchW,i)end,hideF=_notTrack},
|
WIDGET.newSlider{name='curW', x=140, y=930, w=1000, font=35,disp=SETval('VKCurW'),code=function(i)SETTING.VKCurW=i SETTING.VKTchW=math.min(SETTING.VKTchW,i)end,hideF=_notTrack},
|
||||||
|
|||||||
@@ -69,13 +69,13 @@ end
|
|||||||
gc.setDefaultFilter('linear','linear')
|
gc.setDefaultFilter('linear','linear')
|
||||||
|
|
||||||
|
|
||||||
TEXTURE.title=NSC(1130,236)--Title image (Middle: 580,118)
|
TEXTURE.title=NSC(1040,236)--Title image (Middle: 580,118)
|
||||||
do
|
do
|
||||||
gc.setLineWidth(12)
|
gc.setLineWidth(12)
|
||||||
|
gc.translate(10,10)
|
||||||
for i=1,#SVG_TITLE_FILL do
|
for i=1,#SVG_TITLE_FILL do
|
||||||
local triangles=love.math.triangulate(SVG_TITLE_FILL[i])
|
local triangles=love.math.triangulate(SVG_TITLE_FILL[i])
|
||||||
|
|
||||||
gc.translate(12*i,i==1 and 8 or 14)
|
|
||||||
|
|
||||||
gc.setColor(COLOR.Z)
|
gc.setColor(COLOR.Z)
|
||||||
gc.polygon('line',SVG_TITLE_FILL[i])
|
gc.polygon('line',SVG_TITLE_FILL[i])
|
||||||
@@ -85,19 +85,18 @@ do
|
|||||||
gc.polygon('fill',triangles[j])
|
gc.polygon('fill',triangles[j])
|
||||||
end
|
end
|
||||||
|
|
||||||
gc.translate(-12*i,i==1 and -8 or -14)
|
|
||||||
end
|
end
|
||||||
|
gc.translate(-10,-10)
|
||||||
end
|
end
|
||||||
|
|
||||||
TEXTURE.title_color=NSC(1130,236)--Title image (colored)
|
TEXTURE.title_color=NSC(1040,236)--Title image (colored)
|
||||||
do
|
do
|
||||||
local titleColor={COLOR.P,COLOR.F,COLOR.V,COLOR.A,COLOR.M,COLOR.N,COLOR.W,COLOR.Y}
|
local titleColor={COLOR.P,COLOR.F,COLOR.V,COLOR.A,COLOR.M,COLOR.N,COLOR.W,COLOR.Y}
|
||||||
|
|
||||||
|
gc.translate(10,10)
|
||||||
for i=1,8 do
|
for i=1,8 do
|
||||||
local triangles=love.math.triangulate(SVG_TITLE_FILL[i])
|
local triangles=love.math.triangulate(SVG_TITLE_FILL[i])
|
||||||
|
|
||||||
gc.translate(12*i,i==1 and 8 or 14)
|
|
||||||
|
|
||||||
gc.setLineWidth(12)
|
gc.setLineWidth(12)
|
||||||
gc.setColor(COLOR.Z)
|
gc.setColor(COLOR.Z)
|
||||||
gc.polygon('line',SVG_TITLE_FILL[i])
|
gc.polygon('line',SVG_TITLE_FILL[i])
|
||||||
@@ -112,9 +111,8 @@ do
|
|||||||
for j=1,#triangles do
|
for j=1,#triangles do
|
||||||
gc.polygon('fill',triangles[j])
|
gc.polygon('fill',triangles[j])
|
||||||
end
|
end
|
||||||
|
|
||||||
gc.translate(-12*i,i==1 and -8 or -14)
|
|
||||||
end
|
end
|
||||||
|
gc.translate(-10,-10)
|
||||||
end
|
end
|
||||||
|
|
||||||
TEXTURE.multiple=GC.DO{15,15,
|
TEXTURE.multiple=GC.DO{15,15,
|
||||||
|
|||||||
@@ -3,33 +3,42 @@ return[=[
|
|||||||
Tetro-1010(2C2N, 重力); Tetra-link(桌游)
|
Tetro-1010(2C2N, 重力); Tetra-link(桌游)
|
||||||
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 记忆
|
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 记忆
|
||||||
其他未来内容:
|
其他未来内容:
|
||||||
组队战; 实时统计数据可视化; 教学关; 从录像继续
|
实时统计数据可视化; 教学关脚本语言; 从录像继续
|
||||||
重做模式选择UI; 重做模组UI; 加速下落; spike相关统计数据
|
模式系统重做; 重做模组UI; 加速下落; spike相关统计数据
|
||||||
支持更多手柄; 场地格边缘线; 模式数据分析; 高级自定义序列
|
等级系统; 场地格边缘线; 模式数据分析; 高级自定义序列
|
||||||
等级系统; 成就系统; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
|
成就系统; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
|
||||||
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统
|
组队战; 方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统
|
||||||
可调攻击系统; 更多消除方式; 可调场地宽度; 新联网游戏场景切换逻辑
|
更自由的攻击系统; 更多消除方式; 可调场地宽度; 新联网游戏场景切换逻辑
|
||||||
工程编译到字节码; task-Z(新AI); 自适应UI; 多方块
|
task-Z(新AI); 自适应UI; 多方块
|
||||||
|
|
||||||
0.17.0: 硬着陆 Hard Landing
|
0.17.0: 硬着陆 Hard Landing
|
||||||
新增:
|
新增:
|
||||||
新模式:大爆炸
|
新模式:清版竞速
|
||||||
新模式:策略堆叠(原设计来自游戏Cambridge, by NOT_A_ROBOT)
|
新模式:策略堆叠(原设计来自游戏Cambridge, by NOT_A_ROBOT)
|
||||||
新机制:出块延迟打断(ARE打断)(默认不开启此功能) #471
|
新BGM:malate(暂未使用)
|
||||||
添加锁定延迟判负(lockout)规则(默认关闭)
|
新机制:出块延迟打断(ARE打断)(默认关闭) #471
|
||||||
|
添加锁定在外判负(lockout)规则(默认关闭)
|
||||||
全局默认使用5帧窒息延迟
|
全局默认使用5帧窒息延迟
|
||||||
尝试支持摇杆和扳机
|
支持摇杆和扳机(参数暂时不能调整)
|
||||||
改动:
|
改动:
|
||||||
出块/消行延迟真的是0延迟,不再有一帧等待了
|
调整游戏大logo为正体字
|
||||||
TRS的S/Z添加四个踢墙防止在一些地方卡死
|
软降n格的键也可以触发深降
|
||||||
|
ultra模式计时器改为秒表,重开的时候会重播bgm
|
||||||
|
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了(略微影响手感,更滑)
|
||||||
生成位置预览开启后hold的生成位置也可见 #453
|
生成位置预览开启后hold的生成位置也可见 #453
|
||||||
|
TRS的S/Z添加四个踢墙防止在一些地方卡死
|
||||||
优化pc训练模式体验,添加胜利条件,不再无尽
|
优化pc训练模式体验,添加胜利条件,不再无尽
|
||||||
堆积模式添加15帧的窒息延迟 #465
|
堆积模式添加15帧的窒息延迟 #465
|
||||||
|
修改部分不常用设置时会显示警告
|
||||||
小程序arm加入计时器和重置按钮
|
小程序arm加入计时器和重置按钮
|
||||||
|
控制台使用等宽字体,更有味道(
|
||||||
代码:
|
代码:
|
||||||
bgm模块可限制最大加载数,不容易达到上限导致没声 #447
|
BGM模块可限制最大加载数,不容易达到上限导致没声 #447
|
||||||
语音模块支持设置轻微随机音调偏移半径(游戏内固定使用1)
|
语音模块支持设置轻微随机音调偏移半径(游戏内固定使用1)
|
||||||
较大规模整理玩家相关代码,重构出块延迟和消行延迟逻辑
|
较大规模整理玩家相关代码,重构出块延迟/消行延迟/`当前块`逻辑
|
||||||
|
重构字体模块,支持多字体
|
||||||
|
再次封装FILE模块
|
||||||
|
扩展字符串扩展模块
|
||||||
修复:
|
修复:
|
||||||
机翻语言超级消除无行数显示 #462
|
机翻语言超级消除无行数显示 #462
|
||||||
竞速-效率左侧信息颜色问题
|
竞速-效率左侧信息颜色问题
|
||||||
@@ -116,7 +125,7 @@ return[=[
|
|||||||
新语音包:miku(by vocaloidvictory)
|
新语音包:miku(by vocaloidvictory)
|
||||||
新BGM:Jazz nihilism(用于节日主题, by Trebor)
|
新BGM:Jazz nihilism(用于节日主题, by Trebor)
|
||||||
新BGM:Race remix(用于大师-ph, by 柒栎流星)
|
新BGM:Race remix(用于大师-ph, by 柒栎流星)
|
||||||
新BGM:Sakura(用于限时打分, by C₂₉H₂₅N₃O₅)
|
新BGM:Sakura(用于ultra, by C₂₉H₂₅N₃O₅)
|
||||||
新BGM:Null(用于节日主题)
|
新BGM:Null(用于节日主题)
|
||||||
新音效:单次消5/6行
|
新音效:单次消5/6行
|
||||||
新机制:swap(hold的另一种实现)
|
新机制:swap(hold的另一种实现)
|
||||||
@@ -1333,7 +1342,7 @@ return[=[
|
|||||||
0.10.5: 特效更新 FX update
|
0.10.5: 特效更新 FX update
|
||||||
新内容:
|
新内容:
|
||||||
瞬移特效独立为瞬降和移动(旋转)特效,增加移动特效滑条,各特效范围均为0~5
|
瞬移特效独立为瞬降和移动(旋转)特效,增加移动特效滑条,各特效范围均为0~5
|
||||||
增加两个莫名其妙的背景(放在无尽和限时打分)
|
增加两个莫名其妙的背景(放在无尽和ultra)
|
||||||
把之前不小心弄丢的自制蓝屏报错界面捡回来了
|
把之前不小心弄丢的自制蓝屏报错界面捡回来了
|
||||||
改动:
|
改动:
|
||||||
雷达图OPM参数改为ADPM
|
雷达图OPM参数改为ADPM
|
||||||
@@ -1453,7 +1462,7 @@ return[=[
|
|||||||
pc训练方块ghost浮空
|
pc训练方块ghost浮空
|
||||||
i平放顶层消1的奇怪行为
|
i平放顶层消1的奇怪行为
|
||||||
玩家掉出屏幕过程中绘制场地时剪裁不正确
|
玩家掉出屏幕过程中绘制场地时剪裁不正确
|
||||||
限时打分的时间条和hold重合
|
ultra的时间条和hold重合
|
||||||
|
|
||||||
0.9.2: Global Update
|
0.9.2: Global Update
|
||||||
new:
|
new:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
return{
|
return{
|
||||||
["apkCode"]=407,
|
["apkCode"]=410,
|
||||||
["code"]=1700,
|
["code"]=1700,
|
||||||
["string"]="V0.17.0",
|
["string"]="V0.17.0",
|
||||||
["room"]="ver A-2",
|
["room"]="ver A-2",
|
||||||
|
|||||||
Reference in New Issue
Block a user