275 lines
5.3 KiB
Lua
275 lines
5.3 KiB
Lua
local fs=love.filesystem
|
|
local int,max,min=math.floor,math.max,math.min
|
|
local sub,find=string.sub,string.find
|
|
local toN,toS=tonumber,tostring
|
|
local concat=table.concat
|
|
|
|
local function splitS(s,sep)
|
|
local t,n={},1
|
|
repeat
|
|
local p=find(s,sep)or #s+1
|
|
t[n]=sub(s,1,p-1)
|
|
n=n+1
|
|
s=sub(s,p+#sep)
|
|
until #s==0
|
|
return t
|
|
end
|
|
|
|
function loadRecord(N)
|
|
local F=fs.newFile(N..".dat")
|
|
if F:open("r")then
|
|
local s=loadstring(F:read())
|
|
local T={}
|
|
setfenv(s,T)
|
|
T[1]=s()
|
|
return T[1]
|
|
end
|
|
end
|
|
local function dumpTable(L)
|
|
local s="{\n"
|
|
for k,v in next,L do
|
|
local T
|
|
T=type(k)
|
|
if T=="number"then k="["..k.."]="
|
|
elseif T=="string"then k=k.."="
|
|
else error("Error data type!")
|
|
end
|
|
T=type(v)
|
|
if T=="number"then v=tostring(v)
|
|
elseif T=="string"then v="\""..v.."\""
|
|
elseif T=="table"then v=dumpTable(v)
|
|
else error("Error data type!")
|
|
end
|
|
s=s..k..v..",\n"
|
|
end
|
|
return s.."}"
|
|
end
|
|
function saveRecord(N,L)
|
|
local F=fs.newFile(N..".dat")
|
|
F:open("w")
|
|
local _=F:write("return"..dumpTable(L))
|
|
F:flush()
|
|
F:close()
|
|
if not _ then
|
|
TEXT(text.recSavingError..mes,640,480,40,"appear",.4)
|
|
end
|
|
end
|
|
function delRecord(N)
|
|
fs.remove(N..".dat")
|
|
end
|
|
|
|
function saveUnlock()
|
|
local t={}
|
|
local RR=modeRanks
|
|
for i=1,#RR do
|
|
t[i]=RR[i]or"X"
|
|
end
|
|
t=concat(t,",")
|
|
local F=FILE.unlock
|
|
F:open("w")
|
|
local _=F:write(t)
|
|
F:flush()
|
|
F:close()
|
|
if not _ then
|
|
TEXT(text.unlockSavingError..mes,640,480,40,"appear",.4)
|
|
end
|
|
end
|
|
function loadUnlock()
|
|
local F=FILE.unlock
|
|
F:open("r")
|
|
local t=F:read()
|
|
F:close()
|
|
t=splitS(t,",")
|
|
for i=1,#modeRanks do
|
|
local v=toN(t[i])
|
|
if not v or v<0 or v>6 or v~=int(v)then v=false end
|
|
modeRanks[i]=v
|
|
end
|
|
end
|
|
|
|
local statOpy={
|
|
"run","game","time",
|
|
"extraPiece","extraRate",
|
|
"key","rotate","hold","piece","row",
|
|
"atk","send","recv","pend",
|
|
"clear_1","clear_2","clear_3","clear_4",
|
|
"spin_0","spin_1","spin_2","spin_3",
|
|
"b2b","b3b","pc","score",
|
|
}
|
|
function loadStat()
|
|
local F=FILE.data
|
|
F:open("r")
|
|
local t=F:read()
|
|
F:close()
|
|
t=splitS(t,"\r\n")
|
|
for i=1,#t do
|
|
local p=find(t[i],"=")
|
|
if p then
|
|
local t,v=sub(t[i],1,p-1),sub(t[i],p+1)
|
|
for i=1,#statOpy do
|
|
if t==statOpy[i]then
|
|
v=toN(v)if not v or v<0 then v=0 end
|
|
stat[t]=v
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
function saveStat()
|
|
local t={}
|
|
for i=1,#statOpy do
|
|
t[i]=statOpy[i].."="..toS(stat[statOpy[i]])
|
|
end
|
|
|
|
t=concat(t,"\r\n")
|
|
local F=FILE.data
|
|
F:open("w")
|
|
local _=F:write(t)
|
|
F:flush()
|
|
F:close()
|
|
if not _ then
|
|
TEXT(text.statSavingError..mes,640,480,40,"appear",.4)
|
|
end
|
|
end
|
|
|
|
function loadSetting()
|
|
local F=FILE.setting
|
|
F:open("r")
|
|
local t=F:read()
|
|
F:close()
|
|
t=splitS(t,"\r\n")
|
|
for i=1,#t do
|
|
local p=find(t[i],"=")
|
|
if p then
|
|
local t,v=sub(t[i],1,p-1),sub(t[i],p+1)
|
|
if--10档的设置
|
|
--声音
|
|
t=="sfx"or t=="bgm"or t=="voc"or t=="stereo"or
|
|
--三个触摸设置项
|
|
t=="VKTchW"or t=="VKCurW"or t=="VKAlpha"or
|
|
--重开时间
|
|
t=="reTime"
|
|
then
|
|
v=toN(v)
|
|
if v and v==int(v)and v>=0 and v<=10 then
|
|
setting[t]=v
|
|
end
|
|
elseif t=="vib"then
|
|
setting.vib=toN(v:match("[012345]"))or 0
|
|
elseif t=="fullscreen"then
|
|
setting.fullscreen=v=="true"
|
|
love.window.setFullscreen(setting.fullscreen)
|
|
elseif
|
|
--开关设置们
|
|
t=="bg"or
|
|
t=="ghost"or t=="center"or t=="grid"or t=="swap"or
|
|
t=="quickR"or t=="fine"or t=="bgspace"or t=="smo"or
|
|
t=="VKSwitch"or t=="VKTrack"or t=="VKDodge"or t=="VKIcon"
|
|
then
|
|
setting[t]=v=="true"
|
|
elseif t=="frameMul"then
|
|
setting.frameMul=min(max(toN(v)or 100,0),100)
|
|
elseif t=="das"or t=="arr"or t=="sddas"or t=="sdarr"then
|
|
v=toN(v)if not v or v<0 then v=0 end
|
|
setting[t]=int(v)
|
|
elseif t=="dropFX"or t=="shakeFX"or t=="atkFX"then
|
|
setting[t]=toN(v:match("[012345]"))or 0
|
|
elseif t=="lang"then
|
|
setting[t]=toN(v:match("[123]"))or 1
|
|
elseif t=="skin"then
|
|
setting[t]=toN(v:match("[12345678]"))or 1
|
|
elseif t=="keymap"then
|
|
v=splitS(v,"/")
|
|
for i=1,16 do
|
|
local v1=splitS(v[i],",")
|
|
for j=1,#v1 do
|
|
setting.keyMap[i][j]=v1[j]
|
|
end
|
|
end
|
|
elseif t=="VK"then
|
|
v=splitS(v,"/")
|
|
local SK
|
|
for i=1,#v do
|
|
if v[i]then
|
|
SK=splitS(v[i],",")
|
|
local K=VK_org[i]
|
|
K.ava=SK[1]=="T"
|
|
K.x,K.y,K.r=toN(SK[2]),toN(SK[3]),toN(SK[4])
|
|
end
|
|
end
|
|
elseif t=="lastPlay"then
|
|
v=toN(v)
|
|
mapCam.lastPlay=v and modeRanks[v]and v or 1
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local saveOpt={
|
|
"das","arr",
|
|
"sddas","sdarr",
|
|
"reTime",
|
|
"quickR",
|
|
"swap",
|
|
"fine",
|
|
|
|
"ghost","center",
|
|
"smo","grid",
|
|
"dropFX",
|
|
"shakeFX",
|
|
"atkFX",
|
|
"frameMul",
|
|
|
|
"fullscreen",
|
|
"bg",
|
|
"bgspace",
|
|
"lang",
|
|
"skin",
|
|
|
|
"sfx","bgm",
|
|
"vib","voc",
|
|
"stereo",
|
|
|
|
"VKSwitch",
|
|
"VKTrack",
|
|
"VKDodge",
|
|
"VKTchW",
|
|
"VKCurW",
|
|
"VKIcon",
|
|
"VKAlpha",
|
|
}
|
|
function saveSetting()
|
|
local vk={}--virtualkey table
|
|
for i=1,#VK_org do
|
|
local V=VK_org[i]
|
|
vk[i]=concat({
|
|
V.ava and"T"or"F",
|
|
int(V.x+.5),
|
|
int(V.y+.5),
|
|
V.r,
|
|
},",")
|
|
end--pre-pack virtualkey setting
|
|
local map={}
|
|
for i=1,16 do
|
|
map[i]=concat(setting.keyMap[i],",")
|
|
end
|
|
local t={
|
|
"keymap="..toS(concat(map,"/")),
|
|
"VK="..toS(concat(vk,"/")),
|
|
"lastPlay="..mapCam.lastPlay,
|
|
}
|
|
for i=1,#saveOpt do
|
|
t[#t+1]=saveOpt[i].."="..toS(setting[saveOpt[i]])
|
|
end
|
|
t=concat(t,"\r\n")
|
|
local F=FILE.setting
|
|
F:open("w")
|
|
local _,mes=F:write(t)
|
|
F:flush()
|
|
F:close()
|
|
if _ then
|
|
TEXT(text.settingSaved,370,330,30,"appear")
|
|
else
|
|
TEXT(text.settingSavingError.."123",370,350,20,"appear",.3)
|
|
end
|
|
end |