Compare commits

..

9 Commits

Author SHA1 Message Date
MrZ626
d8b12fc55d 版本推进 2021-11-26 01:48:23 +08:00
MrZ626
6d11367ea4 新BGM:malate(暂未使用) 2021-11-26 01:47:14 +08:00
MrZ626
eb9e741b4f 关于界面的对称40行入口换成堆积模式 2021-11-26 00:59:23 +08:00
MrZ626
c47546d501 微调一些玩家动作逻辑
修复零ARE+非零lineARE的时候ihs失效
2021-11-26 00:55:29 +08:00
MrZ626
11aa178fc1 ultra模式计时器样式改为数字 2021-11-25 19:58:22 +08:00
MrZ626
f3a88ef269 游戏内再次封装saveFile和loadFile函数
原本的FILE模块更独立,不基于全局text变量和报错信息而是直接报错
2021-11-25 17:38:09 +08:00
MrZ626
720dc2131f 字符串扩展模块给默认string库补充两个方法repD和sArg 2021-11-25 17:37:46 +08:00
MrZ626
701ef17ae1 大爆炸改名清版竞速 2021-11-25 14:03:36 +08:00
MrZ626
1a689a5f07 修正当前方块显示条件 2021-11-25 09:57:45 +08:00
37 changed files with 1062 additions and 931 deletions

View File

@@ -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

View File

@@ -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']='%',

View File

@@ -205,15 +205,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 +222,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 +477,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

Binary file not shown.

View File

@@ -1,24 +1,33 @@
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 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

View File

@@ -15,6 +15,43 @@ local playSFX=SFX.play
--System --System
function loadFile(name,args)
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 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
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 +60,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 +300,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()
@@ -475,7 +512,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

View File

@@ -67,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",
@@ -734,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"},

View File

@@ -56,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.",
@@ -693,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."},

View File

@@ -57,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",
@@ -697,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"},

View File

@@ -57,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",
@@ -727,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."},

View File

@@ -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",

View File

@@ -254,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']= {"全清训练", "普通", "随便打打"},

View File

@@ -67,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="数据损坏",
@@ -739,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题库熟悉全清定式的组合"},

View File

@@ -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旋双清?"},

View File

@@ -67,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="数据损坏",
@@ -725,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

View File

@@ -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"},

View File

@@ -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,

View File

@@ -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

View File

@@ -782,7 +782,7 @@ function draw.norm(P,repMode)
_drawFXs(P) _drawFXs(P)
--Draw current block --Draw current block
if P.cur then if P.alive and P.cur then
local C=P.cur local C=P.cur
local curColor=C.color local curColor=C.color
@@ -996,7 +996,7 @@ function draw.demo(P)
gc_translate(0,600) gc_translate(0,600)
_drawField(P) _drawField(P)
_drawFXs(P) _drawFXs(P)
if P.cur then if P.alive and P.cur then
local curColor=P.cur.color 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)

View File

@@ -258,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
@@ -280,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
@@ -305,7 +305,7 @@ function Player:act_hardDrop()
end end
function Player:act_softDrop() function Player:act_softDrop()
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')
@@ -317,9 +317,10 @@ function Player:act_softDrop()
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()
@@ -1330,6 +1331,7 @@ function Player:hold(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
@@ -2342,7 +2344,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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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={

View File

@@ -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

View File

@@ -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])

View File

@@ -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={}

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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={

View File

@@ -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)

View File

@@ -13,8 +13,9 @@ return[=[
0.17.0: 硬着陆 Hard Landing 0.17.0: 硬着陆 Hard Landing
新增: 新增:
新模式:大爆炸 新模式:清版竞速
新模式:策略堆叠(原设计来自游戏Cambridge, by NOT_A_ROBOT) 新模式:策略堆叠(原设计来自游戏Cambridge, by NOT_A_ROBOT)
新BGM:malate(暂未使用)
新机制:出块延迟打断(ARE打断)(默认关闭) #471 新机制:出块延迟打断(ARE打断)(默认关闭) #471
添加锁定在外判负(lockout)规则(默认关闭) 添加锁定在外判负(lockout)规则(默认关闭)
全局默认使用5帧窒息延迟 全局默认使用5帧窒息延迟
@@ -22,7 +23,8 @@ return[=[
改动: 改动:
调整游戏大logo为正体字 调整游戏大logo为正体字
软降n格的键也可以触发深降 软降n格的键也可以触发深降
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了 ultra模式计时器改为秒表,容易看清具体时间
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了(略微影响手感,更滑)
生成位置预览开启后hold的生成位置也可见 #453 生成位置预览开启后hold的生成位置也可见 #453
TRS的S/Z添加四个踢墙防止在一些地方卡死 TRS的S/Z添加四个踢墙防止在一些地方卡死
优化pc训练模式体验,添加胜利条件,不再无尽 优化pc训练模式体验,添加胜利条件,不再无尽
@@ -33,6 +35,8 @@ return[=[
bgm模块可限制最大加载数,不容易达到上限导致没声 #447 bgm模块可限制最大加载数,不容易达到上限导致没声 #447
语音模块支持设置轻微随机音调偏移半径(游戏内固定使用1) 语音模块支持设置轻微随机音调偏移半径(游戏内固定使用1)
较大规模整理玩家相关代码,重构出块延迟和消行延迟逻辑 较大规模整理玩家相关代码,重构出块延迟和消行延迟逻辑
再次封装FILE模块
扩展字符串扩展模块
修复: 修复:
机翻语言超级消除无行数显示 #462 机翻语言超级消除无行数显示 #462
竞速-效率左侧信息颜色问题 竞速-效率左侧信息颜色问题
@@ -119,7 +123,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的另一种实现)
@@ -1336,7 +1340,7 @@ return[=[
0.10.5: 特效更新 FX update 0.10.5: 特效更新 FX update
新内容: 新内容:
瞬移特效独立为瞬降和移动(旋转)特效,增加移动特效滑条,各特效范围均为0~5 瞬移特效独立为瞬降和移动(旋转)特效,增加移动特效滑条,各特效范围均为0~5
增加两个莫名其妙的背景(放在无尽和限时打分) 增加两个莫名其妙的背景(放在无尽和ultra)
把之前不小心弄丢的自制蓝屏报错界面捡回来了 把之前不小心弄丢的自制蓝屏报错界面捡回来了
改动: 改动:
雷达图OPM参数改为ADPM 雷达图OPM参数改为ADPM
@@ -1456,7 +1460,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:

View File

@@ -1,5 +1,5 @@
return{ return{
["apkCode"]=408, ["apkCode"]=409,
["code"]=1700, ["code"]=1700,
["string"]="V0.17.0", ["string"]="V0.17.0",
["room"]="ver A-2", ["room"]="ver A-2",