Merge branch '26F-Studio:main' into main
This commit is contained in:
@@ -44,15 +44,20 @@ function FILE.save(data,name,mode)
|
|||||||
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'
|
F:open'w'
|
||||||
local success,mes=F:write(data)
|
local success,mes=F:write(data)
|
||||||
F:flush()F:close()
|
F:flush()F:close()
|
||||||
if not success then
|
if success then
|
||||||
|
return true
|
||||||
|
else
|
||||||
MES.new('error',text.saveError..(mes or"unknown error"))
|
MES.new('error',text.saveError..(mes or"unknown error"))
|
||||||
MES.traceback()
|
MES.traceback()
|
||||||
end
|
end
|
||||||
return success
|
|
||||||
end
|
end
|
||||||
function FILE.clear(path)
|
function FILE.clear(path)
|
||||||
if fs.getRealDirectory(path)~=SAVEDIR or fs.getInfo(path).type~='directory'then return end
|
if fs.getRealDirectory(path)~=SAVEDIR or fs.getInfo(path).type~='directory'then return end
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ do--Connect
|
|||||||
error((code or"XXX")..":"..(res and res.reason or"Server Error"))
|
error((code or"XXX")..":"..(res and res.reason or"Server Error"))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
SOCK:settimeout(0)
|
||||||
end
|
end
|
||||||
|
|
||||||
local YIELD=coroutine.yield
|
local YIELD=coroutine.yield
|
||||||
|
|||||||
2
conf.lua
2
conf.lua
@@ -1,5 +1,5 @@
|
|||||||
VERSION={
|
VERSION={
|
||||||
build=352,
|
build=353,
|
||||||
code=1600,
|
code=1600,
|
||||||
short="V0.16.0",
|
short="V0.16.0",
|
||||||
string="Alpha V0.16.0",
|
string="Alpha V0.16.0",
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
local loveCompress=love.data.compress
|
|
||||||
local loveDecompress=love.data.decompress
|
|
||||||
|
|
||||||
local int=math.floor
|
local int=math.floor
|
||||||
local char,byte=string.char,string.byte
|
local char,byte=string.char,string.byte
|
||||||
local ins=table.insert
|
local ins=table.insert
|
||||||
@@ -239,10 +236,13 @@ function DATA.pasteQuestArgs(str)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
Table data format:
|
Replay file:
|
||||||
|
a zlib-compressed json table
|
||||||
|
|
||||||
|
Replay data format (table):
|
||||||
{frame,event, frame,event, ...}
|
{frame,event, frame,event, ...}
|
||||||
|
|
||||||
Byte data format: (1 byte each period)
|
Replay data format (byte): (1 byte each period)
|
||||||
dt, event, dt, event, ...
|
dt, event, dt, event, ...
|
||||||
all data range from 0 to 127
|
all data range from 0 to 127
|
||||||
large value will be encoded as 1xxxxxxx(high)-1xxxxxxx-...-0xxxxxxx(low)
|
large value will be encoded as 1xxxxxxx(high)-1xxxxxxx-...-0xxxxxxx(low)
|
||||||
@@ -357,7 +357,7 @@ do--function DATA.saveReplay()
|
|||||||
local fileName=os.date("replay/%Y_%m_%d_%H%M%S.rep")
|
local fileName=os.date("replay/%Y_%m_%d_%H%M%S.rep")
|
||||||
if not love.filesystem.getInfo(fileName)then
|
if not love.filesystem.getInfo(fileName)then
|
||||||
love.filesystem.write(fileName,
|
love.filesystem.write(fileName,
|
||||||
loveCompress('string','zlib',
|
love.data.compress('string','zlib',
|
||||||
JSON.encode{
|
JSON.encode{
|
||||||
date=os.date("%Y/%m/%d %H:%M:%S"),
|
date=os.date("%Y/%m/%d %H:%M:%S"),
|
||||||
mode=GAME.curModeName,
|
mode=GAME.curModeName,
|
||||||
@@ -378,14 +378,18 @@ do--function DATA.saveReplay()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function DATA.parseReplay(fileName,ifFull)
|
function DATA.parseReplay(fileName,ifFull)
|
||||||
local fileData,success,metaData,rep
|
local fileData
|
||||||
|
|
||||||
--Read file
|
--Read file
|
||||||
fileData=love.filesystem.read(fileName)
|
fileData=love.filesystem.read(fileName)
|
||||||
|
return DATA.parseReplayData(fileName,fileData,ifFull)
|
||||||
|
end
|
||||||
|
function DATA.parseReplayData(fileName,fileData,ifFull)
|
||||||
|
local success,metaData,rep
|
||||||
|
|
||||||
if not(fileData and #fileData>0)then goto BREAK_cannotParse end
|
if not(fileData and #fileData>0)then goto BREAK_cannotParse end
|
||||||
|
|
||||||
--Decompress file
|
--Decompress file
|
||||||
success,fileData=pcall(loveDecompress,'string','zlib',fileData)
|
success,fileData=pcall(love.data.decompress,'string','zlib',fileData)
|
||||||
if not success then goto BREAK_cannotParse end
|
if not success then goto BREAK_cannotParse end
|
||||||
|
|
||||||
--Load metadata
|
--Load metadata
|
||||||
@@ -421,5 +425,4 @@ function DATA.parseReplay(fileName,ifFull)
|
|||||||
available=false,
|
available=false,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
return DATA
|
return DATA
|
||||||
@@ -365,7 +365,7 @@ return{
|
|||||||
{"BiRS",
|
{"BiRS",
|
||||||
"birs biasrs biasrotationsystem",
|
"birs biasrs biasrotationsystem",
|
||||||
"term",
|
"term",
|
||||||
"*Techmino exclusive*\n\nBias Rotation System, Techmino's original rotation system based on XRS and SRS.\nIt sets an offset to rotation if you hold left/right/soft drop when you rotate.\nIf rotation fails when downwards offset is applied, it tries again without the downwards offset.\nThen it tries without left/right offset.\nIf it fails, then rotation will not occur.\n\nCompared to XRS, BiRS only uses a single kick table, making it easier to memorize; also keeps the climbing-over-terrain feature of SRS.\n\nThe final kick offset's euclidean distance can't be larger than sqrt(5) and if there is a horizontal offset, the final kick offset can't be in the opposite direction.",--todo
|
"*Techmino exclusive*\n\nBias Rotation System, Techmino's original rotation system based on XRS and SRS.\nIt sets an offset to rotation if you hold left/right/soft drop when you rotate.\nIf rotation fails when downwards offset is applied, it tries again without the downwards offset.\nThen it tries without left/right offset.\nIf it fails, then rotation will not occur.\n\nCompared to XRS, BiRS only uses a single kick table, making it easier to memorize; also keeps the climbing-over-terrain feature of SRS.\n\nThe final kick offset's euclidean distance can't be larger than sqrt(5) and if there is a horizontal offset, the final kick offset can't be in the opposite direction.",
|
||||||
},
|
},
|
||||||
{"C2RS",
|
{"C2RS",
|
||||||
"c2rs",
|
"c2rs",
|
||||||
@@ -395,7 +395,7 @@ return{
|
|||||||
{"XRS",
|
{"XRS",
|
||||||
"xrs",
|
"xrs",
|
||||||
"term",
|
"term",
|
||||||
"X rotation system, a rotation system used in T-ex.\n\nIt introduced a feature to \"use another kick table if you hold a direction key\", making it possible for players to tell the game where they want the piece to go.",--todo
|
"X rotation system, a rotation system used in T-ex.\n\nIt introduced a feature to \"use another kick table if you hold a direction key\", making it possible for players to tell the game where they want the piece to go.",
|
||||||
},
|
},
|
||||||
|
|
||||||
{"Back to Back",
|
{"Back to Back",
|
||||||
|
|||||||
@@ -56,14 +56,14 @@ return{
|
|||||||
ai_fixed="The AI is incompatible with fixed sequences.",
|
ai_fixed="The AI is incompatible with fixed sequences.",
|
||||||
ai_prebag="The AI is incompatible with custom sequences which have nontetramino.",
|
ai_prebag="The AI is incompatible with custom sequences which have nontetramino.",
|
||||||
ai_mission="The AI is incompatible with custom missions.",
|
ai_mission="The AI is incompatible with custom missions.",
|
||||||
saveDone="Data Saved",
|
|
||||||
saveError="Failed to save:",
|
|
||||||
loadError="Failed to load:",
|
|
||||||
switchSpawnSFX="Please turn on the spawn SFX .",
|
switchSpawnSFX="Please turn on the spawn SFX .",
|
||||||
ranks={"D","C","B","A","S"},
|
ranks={"D","C","B","A","S"},
|
||||||
|
|
||||||
needRestart="Retry for the changes to take effect.",
|
needRestart="Retry for the changes to take effect.",
|
||||||
|
|
||||||
|
saveDone="Data Saved",
|
||||||
|
saveError="Failed to save:",
|
||||||
|
saveError_duplicate="Duplicate filename",
|
||||||
|
loadError="Failed to load:",
|
||||||
exportSuccess="Exported successfully",
|
exportSuccess="Exported successfully",
|
||||||
importSuccess="Imported successfully",
|
importSuccess="Imported successfully",
|
||||||
dataCorrupted="Data corrupted",
|
dataCorrupted="Data corrupted",
|
||||||
@@ -99,7 +99,7 @@ return{
|
|||||||
|
|
||||||
wsConnecting="Websocket Connecting",
|
wsConnecting="Websocket Connecting",
|
||||||
wsFailed="WebSocket Connection Failed",
|
wsFailed="WebSocket Connection Failed",
|
||||||
wsClose="WebSocket Closed: ",
|
wsClose="WebSocket Closed:",
|
||||||
netTimeout="Network connection timeout",
|
netTimeout="Network connection timeout",
|
||||||
|
|
||||||
onlinePlayerCount="Online",
|
onlinePlayerCount="Online",
|
||||||
|
|||||||
@@ -46,13 +46,13 @@ return{
|
|||||||
ai_fixed="La IA no es compatible con secuencias de piezas prefijadas.",
|
ai_fixed="La IA no es compatible con secuencias de piezas prefijadas.",
|
||||||
--ai_prebag="The AI is incompatible with custom sequences which have nontetramino.",a IA no es compatible con secuencias de piezas personalizadas.",
|
--ai_prebag="The AI is incompatible with custom sequences which have nontetramino.",a IA no es compatible con secuencias de piezas personalizadas.",
|
||||||
ai_mission="La IA no es compatible con misiones personalizadas.",
|
ai_mission="La IA no es compatible con misiones personalizadas.",
|
||||||
saveDone="Datos guardados",
|
|
||||||
saveError="Error al guardar:",
|
|
||||||
loadError="Error al cargar:",
|
|
||||||
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.",
|
||||||
|
|
||||||
|
saveDone="Datos guardados",
|
||||||
|
saveError="Error al guardar:",
|
||||||
|
-- saveError_duplicate="Duplicate filename",
|
||||||
|
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.",
|
||||||
@@ -88,7 +88,7 @@ return{
|
|||||||
|
|
||||||
wsConnecting="Websocket Conectando",
|
wsConnecting="Websocket Conectando",
|
||||||
wsFailed="WebSocket conexión fallida",
|
wsFailed="WebSocket conexión fallida",
|
||||||
wsClose="WebSocket cerrado: ",
|
wsClose="WebSocket cerrado:",
|
||||||
netTimeout="Tiempo de conexión agotado",
|
netTimeout="Tiempo de conexión agotado",
|
||||||
|
|
||||||
onlinePlayerCount="En línea",
|
onlinePlayerCount="En línea",
|
||||||
@@ -100,7 +100,7 @@ return{
|
|||||||
connStream="CONECTANDO",
|
connStream="CONECTANDO",
|
||||||
waitStream="ESPERANDO",
|
waitStream="ESPERANDO",
|
||||||
spectating="Especteando",
|
spectating="Especteando",
|
||||||
chatRemain="Usuarios en línea: ",
|
chatRemain="Usuarios en línea:",
|
||||||
chatStart="------Comienzo del historial------",
|
chatStart="------Comienzo del historial------",
|
||||||
chatHistory="------Nuevos mensajes------",
|
chatHistory="------Nuevos mensajes------",
|
||||||
|
|
||||||
@@ -688,7 +688,7 @@ return{
|
|||||||
['pc_n']= {"Desafío de PCs", "Normal", "¡Consigue los PCs que puedas en 100 líneas!"},
|
['pc_n']= {"Desafío de PCs", "Normal", "¡Consigue los PCs que puedas en 100 líneas!"},
|
||||||
['pc_h']= {"Desafío de PCs", "Difícil", "¡Consigue los PCs que puedas en 100 líneas!"},
|
['pc_h']= {"Desafío de PCs", "Difícil", "¡Consigue los PCs que puedas en 100 líneas!"},
|
||||||
['pc_l']= {"Desafío de PCs", "Lunático", "¡Consigue los PCs que puedas en 100 líneas!"},
|
['pc_l']= {"Desafío de PCs", "Lunático", "¡Consigue los PCs que puedas en 100 líneas!"},
|
||||||
['pc_inf']= {"Desafío de PCs Infinito","", "Consigue todos los PCs que puedas."},
|
['pc_inf']= {"Desafío de PCs Infinito","", "Consigue todos los PCs que puedas."},
|
||||||
['tech_n']= {"Tech", "Normal", "¡Mantén el B2B!"},
|
['tech_n']= {"Tech", "Normal", "¡Mantén el B2B!"},
|
||||||
['tech_n_plus']= {"Tech", "Normal+", "¡Sólo se permiten Spins y PCs!"},
|
['tech_n_plus']= {"Tech", "Normal+", "¡Sólo se permiten Spins y PCs!"},
|
||||||
['tech_h']= {"Tech", "Difícil", "¡Mantén el B2B!"},
|
['tech_h']= {"Tech", "Difícil", "¡Mantén el B2B!"},
|
||||||
|
|||||||
@@ -47,13 +47,13 @@ return{
|
|||||||
ai_fixed="L'IA est incompatible avec les séquences fixes.",
|
ai_fixed="L'IA est incompatible avec les séquences fixes.",
|
||||||
--ai_prebag="The AI is incompatible with custom sequences which have nontetramino.",'IA est incompatible avec les séquences personnalisées.",
|
--ai_prebag="The AI is incompatible with custom sequences which have nontetramino.",'IA est incompatible avec les séquences personnalisées.",
|
||||||
ai_mission="L'IA est incompatible avec les missions personnalisées.",
|
ai_mission="L'IA est incompatible avec les missions personnalisées.",
|
||||||
saveDone="Données sauvegardées",
|
|
||||||
saveError="Sauvegarde échouée : ",
|
|
||||||
loadError="Lecture échouée : ",
|
|
||||||
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",
|
||||||
|
|
||||||
|
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",
|
||||||
@@ -89,7 +89,7 @@ return{
|
|||||||
|
|
||||||
-- wsConnecting="Websocket Connecting",
|
-- wsConnecting="Websocket Connecting",
|
||||||
wsFailed="WebSocket connection échouée",
|
wsFailed="WebSocket connection échouée",
|
||||||
-- wsClose="WebSocket Closed: ",
|
-- wsClose="WebSocket Closed:",
|
||||||
-- netTimeout="Network connection timeout",
|
-- netTimeout="Network connection timeout",
|
||||||
|
|
||||||
-- onlinePlayerCount="Online",
|
-- onlinePlayerCount="Online",
|
||||||
|
|||||||
@@ -47,13 +47,13 @@ return{
|
|||||||
ai_fixed="A inteligência é incompatível com sequências fixas.",
|
ai_fixed="A inteligência é incompatível com sequências fixas.",
|
||||||
--ai_prebag="The AI is incompatible with custom sequences which have nontetramino.", inteligência é incompatível com sequências fixas.",
|
--ai_prebag="The AI is incompatible with custom sequences which have nontetramino.", inteligência é incompatível com sequências fixas.",
|
||||||
ai_mission="A inteligência é incompatível com missões costumizadas.",
|
ai_mission="A inteligência é incompatível com missões costumizadas.",
|
||||||
saveDone="Data Salva",
|
|
||||||
saveError="Falha ao salvar:",
|
|
||||||
loadError="Falha ao ler:",
|
|
||||||
switchSpawnSFX="Switch on spawn SFX to play",
|
switchSpawnSFX="Switch on spawn SFX to play",
|
||||||
|
|
||||||
needRestart="Funciona após reiniciar",
|
needRestart="Funciona após reiniciar",
|
||||||
|
|
||||||
|
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",
|
||||||
@@ -89,7 +89,7 @@ return{
|
|||||||
|
|
||||||
-- wsConnecting="Websocket Connecting",
|
-- wsConnecting="Websocket Connecting",
|
||||||
wsFailed="WebSocket falha na conexão",
|
wsFailed="WebSocket falha na conexão",
|
||||||
wsClose="WebSocket closed: ",
|
wsClose="WebSocket closed:",
|
||||||
-- netTimeout="Network connection timeout",
|
-- netTimeout="Network connection timeout",
|
||||||
|
|
||||||
-- onlinePlayerCount="Online",
|
-- onlinePlayerCount="Online",
|
||||||
|
|||||||
@@ -34,11 +34,12 @@ return{
|
|||||||
ai_fixed="X!!!",
|
ai_fixed="X!!!",
|
||||||
ai_prebag="X!!!",
|
ai_prebag="X!!!",
|
||||||
ai_mission="X!!!",
|
ai_mission="X!!!",
|
||||||
|
needRestart="!!*#R#*!!",
|
||||||
|
|
||||||
saveDone="~~~",
|
saveDone="~~~",
|
||||||
saveError="x!:",
|
saveError="x!:",
|
||||||
|
saveError_duplicate="X←→X ?",
|
||||||
loadError="x!:",
|
loadError="x!:",
|
||||||
|
|
||||||
needRestart="!!*#R#*!!",
|
|
||||||
exportSuccess="~Out~",
|
exportSuccess="~Out~",
|
||||||
importSuccess="~In~",
|
importSuccess="~In~",
|
||||||
dataCorrupted="XXXXX",
|
dataCorrupted="XXXXX",
|
||||||
|
|||||||
@@ -56,14 +56,14 @@ return{
|
|||||||
ai_fixed="不能同时开启AI和固定序列",
|
ai_fixed="不能同时开启AI和固定序列",
|
||||||
ai_prebag="不能同时开启AI和含有非四连块的自定义序列",
|
ai_prebag="不能同时开启AI和含有非四连块的自定义序列",
|
||||||
ai_mission="不能同时开启AI和自定义任务",
|
ai_mission="不能同时开启AI和自定义任务",
|
||||||
saveDone="保存成功!",
|
|
||||||
saveError="保存失败:",
|
|
||||||
loadError="读取失败:",
|
|
||||||
switchSpawnSFX="请开启方块出生音效",
|
switchSpawnSFX="请开启方块出生音效",
|
||||||
ranks={"D","C","B","A","S"},
|
ranks={"D","C","B","A","S"},
|
||||||
|
|
||||||
needRestart="重新开始以生效",
|
needRestart="重新开始以生效",
|
||||||
|
|
||||||
|
saveDone="保存成功!",
|
||||||
|
saveError="保存失败:",
|
||||||
|
saveError_duplicate="文件名重复",
|
||||||
|
loadError="读取失败:",
|
||||||
exportSuccess="导出成功",
|
exportSuccess="导出成功",
|
||||||
importSuccess="导入成功",
|
importSuccess="导入成功",
|
||||||
dataCorrupted="数据损坏",
|
dataCorrupted="数据损坏",
|
||||||
@@ -99,7 +99,7 @@ return{
|
|||||||
|
|
||||||
wsConnecting="正在连接",
|
wsConnecting="正在连接",
|
||||||
wsFailed="连接失败",
|
wsFailed="连接失败",
|
||||||
wsClose="连接被断开: ",
|
wsClose="连接被断开:",
|
||||||
netTimeout="连接超时",
|
netTimeout="连接超时",
|
||||||
|
|
||||||
onlinePlayerCount="在线人数",
|
onlinePlayerCount="在线人数",
|
||||||
@@ -899,6 +899,7 @@ return{
|
|||||||
"俄罗斯方块完全可以作为电竞游戏",
|
"俄罗斯方块完全可以作为电竞游戏",
|
||||||
"发现有个\"隐形\"皮肤了吗",
|
"发现有个\"隐形\"皮肤了吗",
|
||||||
"方块不能吃",
|
"方块不能吃",
|
||||||
|
"方块不是你生活的全部,适当走出去看看",
|
||||||
"方块教会我们,合群了就会消失,...",
|
"方块教会我们,合群了就会消失,...",
|
||||||
"方块默认出现的方向都是重心在下哦",
|
"方块默认出现的方向都是重心在下哦",
|
||||||
"方块能吃吗",
|
"方块能吃吗",
|
||||||
@@ -911,6 +912,7 @@ return{
|
|||||||
"感谢Phigros提供部分tip模板(",
|
"感谢Phigros提供部分tip模板(",
|
||||||
"刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
|
"刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
|
||||||
"刚开始练全隐形可以尽量堆平,留一列消四",
|
"刚开始练全隐形可以尽量堆平,留一列消四",
|
||||||
|
"隔壁不在乎玩家意见但是我们在乎,没人提过的合理建议一定会回应",
|
||||||
"隔断消除即将到来!",
|
"隔断消除即将到来!",
|
||||||
"各种画面细节选项都可以在设置里找到哦",
|
"各种画面细节选项都可以在设置里找到哦",
|
||||||
"更换方块皮肤也许能帮助提升成绩?不懂,玄学",
|
"更换方块皮肤也许能帮助提升成绩?不懂,玄学",
|
||||||
@@ -1120,6 +1122,7 @@ return{
|
|||||||
{C.C,"<PURE ",C.P,"MEMORY>"},
|
{C.C,"<PURE ",C.P,"MEMORY>"},
|
||||||
{C.C,"15puzzle好玩!"},
|
{C.C,"15puzzle好玩!"},
|
||||||
{C.C,"魔方好玩!"},
|
{C.C,"魔方好玩!"},
|
||||||
|
{C.C,"噗哟噗哟好玩!"},
|
||||||
{C.C,"扫雷好玩!"},
|
{C.C,"扫雷好玩!"},
|
||||||
{C.C,"Celeste好玩!"},
|
{C.C,"Celeste好玩!"},
|
||||||
{C.C,"CYAN"},
|
{C.C,"CYAN"},
|
||||||
|
|||||||
@@ -4,7 +4,10 @@ return{
|
|||||||
drop=60,lock=60,
|
drop=60,lock=60,
|
||||||
freshLimit=15,
|
freshLimit=15,
|
||||||
fieldH=100,
|
fieldH=100,
|
||||||
|
highCam=true,
|
||||||
fillClear=false,
|
fillClear=false,
|
||||||
|
seqData={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25},
|
||||||
|
sequence='bag',
|
||||||
bg='none',bgm='there',
|
bg='none',bgm='there',
|
||||||
},
|
},
|
||||||
mesDisp=function(P)
|
mesDisp=function(P)
|
||||||
@@ -17,11 +20,11 @@ return{
|
|||||||
getRank=function(P)
|
getRank=function(P)
|
||||||
local B=P.stat.piece
|
local B=P.stat.piece
|
||||||
return
|
return
|
||||||
B>=260 and 5 or
|
B>=215 and 5 or
|
||||||
B>=254 and 4 or
|
B>=208 and 4 or
|
||||||
B>=250 and 3 or
|
B>=200 and 3 or
|
||||||
B>=243 and 2 or
|
B>=190 and 2 or
|
||||||
B>=235 and 1 or
|
B>=180 and 1 or
|
||||||
0
|
0
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
@@ -3,6 +3,7 @@ return{
|
|||||||
env={
|
env={
|
||||||
drop=60,lock=60,
|
drop=60,lock=60,
|
||||||
freshLimit=15,
|
freshLimit=15,
|
||||||
|
highCam=true,
|
||||||
fillClear=false,
|
fillClear=false,
|
||||||
bg='none',bgm='there',
|
bg='none',bgm='there',
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ return{
|
|||||||
drop=60,lock=60,
|
drop=60,lock=60,
|
||||||
freshLimit=15,
|
freshLimit=15,
|
||||||
fieldH=40,
|
fieldH=40,
|
||||||
|
highCam=true,
|
||||||
fillClear=false,
|
fillClear=false,
|
||||||
|
seqData={1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25},
|
||||||
bg='none',bgm='there',
|
bg='none',bgm='there',
|
||||||
},
|
},
|
||||||
mesDisp=function(P)
|
mesDisp=function(P)
|
||||||
@@ -17,11 +19,11 @@ return{
|
|||||||
getRank=function(P)
|
getRank=function(P)
|
||||||
local B=P.stat.piece
|
local B=P.stat.piece
|
||||||
return
|
return
|
||||||
B>=105 and 5 or
|
B>=90 and 5 or
|
||||||
B>=101 and 4 or
|
B>=87 and 4 or
|
||||||
B>=97 and 3 or
|
B>=83 and 3 or
|
||||||
B>=94 and 2 or
|
B>=78 and 2 or
|
||||||
B>=90 and 1 or
|
B>=70 and 1 or
|
||||||
0
|
0
|
||||||
end,
|
end,
|
||||||
}
|
}
|
||||||
@@ -317,7 +317,7 @@ function NET.createRoom(roomName,description,capacity,roomType,roomData,password
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
function NET.enterRoom(room,password)
|
function NET.enterRoom(room,password)
|
||||||
if NET.lock('enterRoom',2)then
|
if NET.lock('enterRoom',6)then
|
||||||
SFX.play('reach',.6)
|
SFX.play('reach',.6)
|
||||||
WS.send('play',JSON.encode{
|
WS.send('play',JSON.encode{
|
||||||
action=2,
|
action=2,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ local max,min,modf=math.max,math.min,math.modf
|
|||||||
local ins,rem=table.insert,table.remove
|
local ins,rem=table.insert,table.remove
|
||||||
local resume,yield,status=coroutine.resume,coroutine.yield,coroutine.status
|
local resume,yield,status=coroutine.resume,coroutine.yield,coroutine.status
|
||||||
|
|
||||||
local SFX,BGM,VOC,VIB,SYSFX,SKIN=SFX,BGM,VOC,VIB,SYSFX,SKIN
|
local SFX,BGM,VOC,VIB,SYSFX=SFX,BGM,VOC,VIB,SYSFX
|
||||||
local FREEROW,TABLE,TEXT,NET,TASK=FREEROW,TABLE,TEXT,NET,TASK
|
local FREEROW,TABLE,TEXT,NET,TASK=FREEROW,TABLE,TEXT,NET,TASK
|
||||||
local PLAYERS,PLY_ALIVE,GAME=PLAYERS,PLY_ALIVE,GAME
|
local PLAYERS,PLY_ALIVE,GAME=PLAYERS,PLY_ALIVE,GAME
|
||||||
|
|
||||||
@@ -1931,6 +1931,7 @@ function Player:act_hold()
|
|||||||
if self.control then
|
if self.control then
|
||||||
if self.waiting==-1 then
|
if self.waiting==-1 then
|
||||||
self:hold()
|
self:hold()
|
||||||
|
self.keyPressing[8]=false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -222,11 +222,11 @@ return function(P)--Return a piece-generating function for player P
|
|||||||
elseif type(s)=='string'and seqGenerators[s]then
|
elseif type(s)=='string'and seqGenerators[s]then
|
||||||
return seqGenerators[s]
|
return seqGenerators[s]
|
||||||
else
|
else
|
||||||
MES.new(
|
MES.new('warn',
|
||||||
type(s)=='string'and
|
type(s)=='string'and
|
||||||
"No sequence mode called "..s or
|
"No sequence mode called "..s or
|
||||||
"Wrong sequence generator",
|
"Wrong sequence generator"
|
||||||
'warn')
|
)
|
||||||
P.gameEnv.sequence='bag'
|
P.gameEnv.sequence='bag'
|
||||||
return seqGenerators.bag
|
return seqGenerators.bag
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ function scene.keyDown(key,isRep)
|
|||||||
elseif key=="m"then
|
elseif key=="m"then
|
||||||
SCN.go('custom_mission','swipeD')
|
SCN.go('custom_mission','swipeD')
|
||||||
elseif key=="delete"then
|
elseif key=="delete"then
|
||||||
if sure>20 then
|
if sure>.3 then
|
||||||
TABLE.cut(FIELD)TABLE.cut(BAG)TABLE.cut(MISSION)
|
TABLE.cut(FIELD)TABLE.cut(BAG)TABLE.cut(MISSION)
|
||||||
FIELD[1]=DATA.newBoard()
|
FIELD[1]=DATA.newBoard()
|
||||||
freshMiniFieldVisible()
|
freshMiniFieldVisible()
|
||||||
@@ -96,7 +96,7 @@ function scene.keyDown(key,isRep)
|
|||||||
BG.set(CUSTOMENV.bg)
|
BG.set(CUSTOMENV.bg)
|
||||||
BGM.play(CUSTOMENV.bgm)
|
BGM.play(CUSTOMENV.bgm)
|
||||||
else
|
else
|
||||||
sure=50
|
sure=1
|
||||||
end
|
end
|
||||||
elseif key=="f1"then
|
elseif key=="f1"then
|
||||||
SCN.go('mod','swipeD')
|
SCN.go('mod','swipeD')
|
||||||
@@ -133,8 +133,8 @@ function scene.keyDown(key,isRep)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.update()
|
function scene.update(dt)
|
||||||
if sure>0 then sure=sure-1 end
|
if sure>0 then sure=sure-dt end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.draw()
|
function scene.draw()
|
||||||
@@ -184,7 +184,7 @@ function scene.draw()
|
|||||||
|
|
||||||
--Confirm reset
|
--Confirm reset
|
||||||
if sure>0 then
|
if sure>0 then
|
||||||
gc.setColor(1,1,1,sure*.02)
|
gc.setColor(1,1,1,sure)
|
||||||
gc.draw(TEXTURE.sure,920,50)
|
gc.draw(TEXTURE.sure,920,50)
|
||||||
end
|
end
|
||||||
gc.translate(0, WIDGET.scrollPos)
|
gc.translate(0, WIDGET.scrollPos)
|
||||||
|
|||||||
@@ -172,12 +172,12 @@ function scene.keyDown(key)
|
|||||||
pTouch(penX,penY)
|
pTouch(penX,penY)
|
||||||
end
|
end
|
||||||
elseif key=="delete"then
|
elseif key=="delete"then
|
||||||
if sure>20 then
|
if sure>.3 then
|
||||||
for y=1,20 do for x=1,10 do FIELD[page][y][x]=0 end end
|
for y=1,20 do for x=1,10 do FIELD[page][y][x]=0 end end
|
||||||
sure=0
|
sure=0
|
||||||
SFX.play('finesseError',.7)
|
SFX.play('finesseError',.7)
|
||||||
else
|
else
|
||||||
sure=50
|
sure=1
|
||||||
end
|
end
|
||||||
elseif key=="j"then
|
elseif key=="j"then
|
||||||
demo=not demo
|
demo=not demo
|
||||||
@@ -256,8 +256,8 @@ function scene.keyUp(key)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.update()
|
function scene.update(dt)
|
||||||
if sure>0 then sure=sure-1 end
|
if sure>0 then sure=sure-dt end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.draw()
|
function scene.draw()
|
||||||
@@ -427,8 +427,8 @@ function scene.draw()
|
|||||||
|
|
||||||
--Confirm reset
|
--Confirm reset
|
||||||
if sure>0 then
|
if sure>0 then
|
||||||
gc.setColor(1,1,1,sure*.02)
|
gc.setColor(1,1,1,sure)
|
||||||
gc.draw(TEXTURE.sure,1070,490)
|
mDraw(TEXTURE.sure,990,530,nil,1.2)
|
||||||
end
|
end
|
||||||
|
|
||||||
--Block name
|
--Block name
|
||||||
|
|||||||
@@ -62,13 +62,13 @@ function scene.keyDown(key)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif key=="delete"then
|
elseif key=="delete"then
|
||||||
if sure>20 then
|
if sure>.3 then
|
||||||
TABLE.cut(MISSION)
|
TABLE.cut(MISSION)
|
||||||
cur=0
|
cur=0
|
||||||
sure=0
|
sure=0
|
||||||
SFX.play('finesseError',.7)
|
SFX.play('finesseError',.7)
|
||||||
else
|
else
|
||||||
sure=50
|
sure=1
|
||||||
end
|
end
|
||||||
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
|
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
|
||||||
if #MISSION>0 then
|
if #MISSION>0 then
|
||||||
@@ -116,8 +116,8 @@ function scene.keyDown(key)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.update()
|
function scene.update(dt)
|
||||||
if sure>0 then sure=sure-1 end
|
if sure>0 then sure=sure-dt end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.draw()
|
function scene.draw()
|
||||||
@@ -184,8 +184,8 @@ function scene.draw()
|
|||||||
|
|
||||||
--Confirm reset
|
--Confirm reset
|
||||||
if sure>0 then
|
if sure>0 then
|
||||||
gc.setColor(1,1,1,sure*.02)
|
gc.setColor(1,1,1,sure)
|
||||||
gc.draw(TEXTURE.sure,980,600)
|
mDraw(TEXTURE.sure,1000,640,nil,.9)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -67,13 +67,13 @@ function scene.keyDown(key)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
elseif key=="delete"then
|
elseif key=="delete"then
|
||||||
if sure>20 then
|
if sure>.3 then
|
||||||
TABLE.cut(BAG)
|
TABLE.cut(BAG)
|
||||||
cur=0
|
cur=0
|
||||||
sure=0
|
sure=0
|
||||||
SFX.play('finesseError',.7)
|
SFX.play('finesseError',.7)
|
||||||
else
|
else
|
||||||
sure=50
|
sure=1
|
||||||
end
|
end
|
||||||
elseif key=="="then
|
elseif key=="="then
|
||||||
local l={1,2,3,4,5,6,7}
|
local l={1,2,3,4,5,6,7}
|
||||||
@@ -124,8 +124,8 @@ function scene.keyDown(key)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.update()
|
function scene.update(dt)
|
||||||
if sure>0 then sure=sure-1 end
|
if sure>0 then sure=sure-dt end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.draw()
|
function scene.draw()
|
||||||
@@ -187,8 +187,8 @@ function scene.draw()
|
|||||||
|
|
||||||
--Confirm reset
|
--Confirm reset
|
||||||
if sure>0 then
|
if sure>0 then
|
||||||
gc.setColor(1,1,1,sure*.02)
|
gc.setColor(1,1,1,sure)
|
||||||
gc.draw(TEXTURE.sure,1050,430,nil,.6)
|
mDraw(TEXTURE.sure,1000,460,nil,.8)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ function scene.draw()
|
|||||||
end
|
end
|
||||||
scene.widgetList={
|
scene.widgetList={
|
||||||
WIDGET.newKey{name="setting",fText=TEXTURE.setting,x=1200,y=160,w=90,h=90,code=goScene'setting_game'},
|
WIDGET.newKey{name="setting",fText=TEXTURE.setting,x=1200,y=160,w=90,h=90,code=goScene'setting_game'},
|
||||||
WIDGET.newKey{name="match",x=640,y=500,w=760,h=140,font=60,code=function()MES.new('warn',"Coming soon 开发中,敬请期待")end},
|
WIDGET.newKey{name="match",x=640,y=500,w=760,h=140,font=60,code=function()MES.new('warn',text.notFinished)end},
|
||||||
WIDGET.newButton{name="back",x=1140,y=640,w=170,h=80,fText=TEXTURE.back,code=backScene},
|
WIDGET.newButton{name="back",x=1140,y=640,w=170,h=80,fText=TEXTURE.back,code=backScene},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ end
|
|||||||
scene.widgetList={
|
scene.widgetList={
|
||||||
WIDGET.newKey{name="setting",fText=TEXTURE.setting,x=1200,y=160,w=90,h=90,code=goScene'setting_game'},
|
WIDGET.newKey{name="setting",fText=TEXTURE.setting,x=1200,y=160,w=90,h=90,code=goScene'setting_game'},
|
||||||
WIDGET.newButton{name="league", x=640, y=180,w=350,h=120,font=40,color='D',code=goScene'net_league'},
|
WIDGET.newButton{name="league", x=640, y=180,w=350,h=120,font=40,color='D',code=goScene'net_league'},
|
||||||
WIDGET.newButton{name="ffa", x=640, y=360,w=350,h=120,font=40,color='D',code=function()MES.new('warn',"Coming soon 开发中,敬请期待")--[[NET.enterRoom({name="ffa"})]]end},
|
WIDGET.newButton{name="ffa", x=640, y=360,w=350,h=120,font=40,color='D',code=function()MES.new('warn',text.notFinished)--[[NET.enterRoom({name="ffa"})]]end},
|
||||||
WIDGET.newButton{name="rooms", x=640, y=540,w=350,h=120,font=40,code=goScene'net_rooms'},
|
WIDGET.newButton{name="rooms", x=640, y=540,w=350,h=120,font=40,code=goScene'net_rooms'},
|
||||||
WIDGET.newButton{name="logout", x=880, y=40,w=180,h=60,color='dR',
|
WIDGET.newButton{name="logout", x=880, y=40,w=180,h=60,color='dR',
|
||||||
code=function()
|
code=function()
|
||||||
|
|||||||
@@ -59,23 +59,28 @@ function scene.sceneInit()
|
|||||||
end
|
end
|
||||||
|
|
||||||
function scene.keyDown(key)
|
function scene.keyDown(key)
|
||||||
if key=="r"then
|
if NET.getlock('enterRoom')then return end
|
||||||
if fetchTimer<=7 then
|
if WIDGET.sel~=passwordBox then
|
||||||
fetchRoom()
|
if key=="r"then
|
||||||
end
|
if fetchTimer<=7 then
|
||||||
elseif key=="s"then
|
fetchRoom()
|
||||||
SCN.go('setting_game')
|
end
|
||||||
elseif key=="n"then
|
elseif key=="s"then
|
||||||
SCN.go('net_newRoom')
|
SCN.go('setting_game')
|
||||||
elseif key=="escape"then
|
elseif key=="n"then
|
||||||
SCN.back()
|
SCN.go('net_newRoom')
|
||||||
elseif roomList:getLen()>0 and key=="return"then
|
elseif key=="escape"then
|
||||||
local R=roomList:getSel()
|
SCN.back()
|
||||||
if NET.getlock('fetchRoom')or not R then return end
|
elseif roomList:getLen()>0 and key=="return"then
|
||||||
if R.roomInfo.version==VERSION.room then
|
local R=roomList:getSel()
|
||||||
NET.enterRoom(R,passwordBox.value)
|
if NET.getlock('fetchRoom')or not R then return end
|
||||||
|
if R.roomInfo.version==VERSION.room then
|
||||||
|
NET.enterRoom(R,passwordBox.value)
|
||||||
|
else
|
||||||
|
MES.new('error',"Version doesn't compatible 版本不兼容")
|
||||||
|
end
|
||||||
else
|
else
|
||||||
MES.new('error',"Version doesn't compatible 版本不兼容")
|
WIDGET.keyPressed(key)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
WIDGET.keyPressed(key)
|
WIDGET.keyPressed(key)
|
||||||
@@ -96,6 +101,14 @@ function scene.draw()
|
|||||||
gc_setColor(1,1,1,.12)
|
gc_setColor(1,1,1,.12)
|
||||||
gc_arc('fill','pie',250,630,40,-1.5708,-1.5708-.6283*fetchTimer)
|
gc_arc('fill','pie',250,630,40,-1.5708,-1.5708-.6283*fetchTimer)
|
||||||
|
|
||||||
|
--Joining mark
|
||||||
|
if NET.getlock('enterRoom')then
|
||||||
|
gc.setColor(1,1,1)
|
||||||
|
gc.setLineWidth(15)
|
||||||
|
local t=TIME()*6.26%6.2832
|
||||||
|
gc.arc('line','open',640,360,80,t,t+4.26)
|
||||||
|
end
|
||||||
|
|
||||||
--Room list
|
--Room list
|
||||||
local R=roomList:getSel()
|
local R=roomList:getSel()
|
||||||
if R then
|
if R then
|
||||||
@@ -135,7 +148,7 @@ scene.widgetList={
|
|||||||
WIDGET.newKey{name="refresh", x=250,y=630,w=140,h=120,code=fetchRoom,hideF=function()return fetchTimer>7 end},
|
WIDGET.newKey{name="refresh", x=250,y=630,w=140,h=120,code=fetchRoom,hideF=function()return fetchTimer>7 end},
|
||||||
WIDGET.newKey{name="new", x=510,y=630,w=260,h=120,code=pressKey"n"},
|
WIDGET.newKey{name="new", x=510,y=630,w=260,h=120,code=pressKey"n"},
|
||||||
WIDGET.newKey{name="join", x=780,y=630,w=140,h=120,code=pressKey"return",hideF=function()return roomList:getLen()==0 or NET.getlock('enterRoom')end},
|
WIDGET.newKey{name="join", x=780,y=630,w=140,h=120,code=pressKey"return",hideF=function()return roomList:getLen()==0 or NET.getlock('enterRoom')end},
|
||||||
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,fText=TEXTURE.back,code=backScene},
|
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,fText=TEXTURE.back,code=pressKey"escape"},
|
||||||
}
|
}
|
||||||
|
|
||||||
return scene
|
return scene
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
local gc=love.graphics
|
local gc=love.graphics
|
||||||
local gc_setColor=gc.setColor
|
local gc_setColor=gc.setColor
|
||||||
local gc_draw,gc_rectangle=gc.draw,gc.rectangle
|
local gc_rectangle=gc.rectangle
|
||||||
local gc_print,gc_printf=gc.print,gc.printf
|
local gc_print,gc_printf=gc.print,gc.printf
|
||||||
|
|
||||||
|
local kb=love.keyboard
|
||||||
local setFont=setFont
|
local setFont=setFont
|
||||||
|
|
||||||
local listBox=WIDGET.newListBox{name="list",x=50,y=50,w=1200,h=520,lineH=40,drawF=function(rep,id,ifSel)
|
local listBox=WIDGET.newListBox{name="list",x=50,y=50,w=1200,h=520,lineH=40,drawF=function(rep,id,ifSel)
|
||||||
@@ -54,6 +55,7 @@ local function replay(fileName)
|
|||||||
|
|
||||||
loadGame(rep.mode,true)
|
loadGame(rep.mode,true)
|
||||||
resetGameData('r')
|
resetGameData('r')
|
||||||
|
PLAYERS[1].username=rep.player
|
||||||
GAME.init=false
|
GAME.init=false
|
||||||
GAME.saved=true
|
GAME.saved=true
|
||||||
GAME.fromRepMenu=true
|
GAME.fromRepMenu=true
|
||||||
@@ -65,6 +67,10 @@ end
|
|||||||
function scene.sceneInit()
|
function scene.sceneInit()
|
||||||
sure=0
|
sure=0
|
||||||
listBox:setList(REPLAY)
|
listBox:setList(REPLAY)
|
||||||
|
local hide=listBox:getLen()==0
|
||||||
|
for i=3,5 do
|
||||||
|
scene.widgetList[i].hide=hide
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.keyDown(key)
|
function scene.keyDown(key)
|
||||||
@@ -73,12 +79,42 @@ function scene.keyDown(key)
|
|||||||
if rep then
|
if rep then
|
||||||
replay(rep.fileName)
|
replay(rep.fileName)
|
||||||
end
|
end
|
||||||
elseif key=="escape"then
|
elseif key=="c"and kb.isDown("lctrl","rctrl")or key=="cC"then
|
||||||
SCN.back()
|
local rep=listBox:getSel()
|
||||||
|
if rep then
|
||||||
|
if rep.available and rep.fileName then
|
||||||
|
local repStr=FILE.load(rep.fileName)
|
||||||
|
if repStr then
|
||||||
|
love.system.setClipboardText(love.data.encode('string','base64',repStr))
|
||||||
|
MES.new('info',text.exportSuccess)
|
||||||
|
else
|
||||||
|
MES.new('error',text.replayBroken)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
MES.new('error',text.replayBroken)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif key=="v"and kb.isDown("lctrl","rctrl")or key=="cV"then
|
||||||
|
local repStr=love.system.getClipboardText()
|
||||||
|
local res,fileData=pcall(love.data.decode,'string','base64',repStr)
|
||||||
|
if res then
|
||||||
|
local fileName=os.date("replay/%Y_%m_%d_%H%M%S_import.rep")
|
||||||
|
local rep=DATA.parseReplayData(fileName,fileData,false)
|
||||||
|
if rep.available then
|
||||||
|
if FILE.save(fileData,fileName,'d')then
|
||||||
|
table.insert(REPLAY,1,rep)
|
||||||
|
MES.new('info',text.importSuccess)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
MES.new('error',text.dataCorrupted)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
MES.new('error',text.dataCorrupted)
|
||||||
|
end
|
||||||
elseif key=="delete"then
|
elseif key=="delete"then
|
||||||
local rep=listBox:getSel()
|
local rep=listBox:getSel()
|
||||||
if rep then
|
if rep then
|
||||||
if sure>20 then
|
if sure>.3 then
|
||||||
sure=0
|
sure=0
|
||||||
listBox:remove()
|
listBox:remove()
|
||||||
love.filesystem.remove(rep.fileName)
|
love.filesystem.remove(rep.fileName)
|
||||||
@@ -90,31 +126,34 @@ function scene.keyDown(key)
|
|||||||
end
|
end
|
||||||
SFX.play('finesseError',.7)
|
SFX.play('finesseError',.7)
|
||||||
else
|
else
|
||||||
sure=50
|
sure=1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
elseif key=="escape"then
|
||||||
|
SCN.back()
|
||||||
else
|
else
|
||||||
WIDGET.keyPressed(key)
|
WIDGET.keyPressed(key)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.update()
|
function scene.update(dt)
|
||||||
if sure>0 then sure=sure-1 end
|
if sure>0 then sure=sure-dt end
|
||||||
end
|
end
|
||||||
|
|
||||||
function scene.draw()
|
function scene.draw()
|
||||||
--Confirm delete
|
--Confirm delete
|
||||||
if sure>0 then
|
if sure>0 then
|
||||||
gc_setColor(1,1,1,sure*.02)
|
gc_setColor(1,1,1,sure)
|
||||||
gc_draw(TEXTURE.sure,910,610)
|
mDraw(TEXTURE.sure,930,640,nil,.9)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
scene.widgetList={
|
scene.widgetList={
|
||||||
listBox,
|
listBox,
|
||||||
WIDGET.newButton{name="play",x=700,y=640,w=170,h=80,color='lY',code=pressKey"return",hideF=function()return listBox:getLen()==0 end,fText=DOGC{50,50,{'fPoly',10,0,49,24,10,49}}},
|
WIDGET.newButton{name="export",x=200,y=640,w=70,color='lG',code=pressKey"cC",fText=DOGC{50,50,{'fRect',8,44,34,4},{'fRect',22,17,6,23},{'fPoly',25,5,10,20,40,20}}},
|
||||||
WIDGET.newButton{name="delete",x=850,y=640,w=80,h=80,color='lR',code=pressKey"delete",hideF=function()return listBox:getLen()==0 end,fText=DOGC{50,50,{'setLW',8},{'line',5,5,45,45},{'line',5,45,45,5}}},
|
WIDGET.newButton{name="import",x=300,y=640,w=70,color='lN',code=pressKey"cV",fText=DOGC{50,50,{'fRect',8,44,34,4},{'fRect',22,5,6,23},{'fPoly',25,40,10,25,40,25}}},
|
||||||
WIDGET.newButton{name="back",x=1140,y=640,w=170,h=80,fText=TEXTURE.back,code=backScene},
|
WIDGET.newButton{name="play",x=700,y=640,w=170,h=80,color='lY',code=pressKey"return",fText=DOGC{50,50,{'fPoly',10,0,49,24,10,49}}},
|
||||||
|
WIDGET.newButton{name="delete",x=850,y=640,w=80,h=80,color='lR',code=pressKey"delete",fText=DOGC{50,50,{'setLW',8},{'line',5,5,45,45},{'line',5,45,45,5}}},
|
||||||
WIDGET.newButton{name="back",x=1140,y=640,w=170,h=80,fText=TEXTURE.back,code=backScene},
|
WIDGET.newButton{name="back",x=1140,y=640,w=170,h=80,fText=TEXTURE.back,code=backScene},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,9 +42,10 @@ return STRING.split([=[
|
|||||||
新BGM:Secret8th Remix(用于master-hard)
|
新BGM:Secret8th Remix(用于master-hard)
|
||||||
新增小亚(xiaoya)语音包
|
新增小亚(xiaoya)语音包
|
||||||
旋转系统新增BiRS(Bias RS)(实验性),ASC,ASCplus(添加180度踢墙,实验性)
|
旋转系统新增BiRS(Bias RS)(实验性),ASC,ASCplus(添加180度踢墙,实验性)
|
||||||
新增noInitSZO模式参数,自动跳过开局SZO(目前仅用于马拉松/20G模式) #121
|
可以通过剪切板导入/导出录像
|
||||||
自定义游戏的序列任务场地等数据退出保存
|
自定义游戏的序列任务场地等数据退出保存
|
||||||
第一次启动会自动进入语言设置菜单 #150
|
第一次启动会自动进入语言设置菜单 #150
|
||||||
|
新增noInitSZO模式参数,自动跳过开局SZO(目前仅用于马拉松/20G模式) #121
|
||||||
改动:
|
改动:
|
||||||
更换更简洁的加载动画,合并intro场景
|
更换更简洁的加载动画,合并intro场景
|
||||||
调整TRS中S5和Z5的踢墙表,增加Ospin时SZ按反的尝试
|
调整TRS中S5和Z5的踢墙表,增加Ospin时SZ按反的尝试
|
||||||
|
|||||||
Reference in New Issue
Block a user