diff --git a/parts/data.lua b/parts/data.lua index aee0555e..c7dc7ad2 100644 --- a/parts/data.lua +++ b/parts/data.lua @@ -99,6 +99,7 @@ function DATA.pasteBoard(str)-- Paste [str] data to [page] board local fX,fY=1,1-- *ptr for Field(r*10+(c-1)) local p=1 + local lineLimit=126 while true do local b=byte(str,p)-- 1byte @@ -120,13 +121,13 @@ function DATA.pasteBoard(str)-- Paste [str] data to [page] board fX=fX+1 else fY=fY+1 - if fY>126 then break end + if fY>lineLimit then break end fX=1 end p=p+1 end - return true, F + return true, F, #str>lineLimit*10 end --[[ @@ -213,9 +214,26 @@ function DATA.pasteQuestArgs(str) if #str<4 then return end local ENV={} ENV.holdCount= str:byte(1)-48 + if ENV.holdCount<0 or ENV.holdCount>6 then + -- hold count invalid + if ENV.holdCount>=7 and ENV.holdCount<=9 then + -- hold count clearly intended to be a number, set to 6 + ENV.holdCount=6 + MES.new('warn',text.customDataInvalidHold1) + else + -- hold count is a random character, reset to 1 + ENV.holdCount=1 + MES.new('warn',text.customDataInvalidHold2) + end + end ENV.ospin= str:byte(2)~=90 ENV.missionKill=str:byte(3)~=90 ENV.sequence= str:sub(4) + -- hard coding list of generators because there is no other way to obtain it + if not TABLE.find({'bag','bagES','his','hisPool','c2','bagP1inf','rnd','mess','reverb','loop','fixed'}, ENV.sequence) then + MES.new('warn',text.customDataInvalidSequence) + ENV.sequence='bag' + end return true,ENV end diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index fec20580..9ff7b6c6 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -95,6 +95,13 @@ return { dataCorrupted="Data corrupted", pasteWrongPlace="Did you paste in the wrong place?", noFile="File missing", + + -- data validation for custom game data import + customDataInvalidHold1="Invalid Hold queue length in custom mode data. Resetting to 6.", + customDataInvalidHold2="Invalid Hold queue length in custom mode data. Resetting to 1.", + customDataInvalidSequence="Invalid sequence mode in custom mode data. Resetting to bag.", + customDataBoardLineLimit="One or more fields in the data exceeded height limit (126 lines).\nParts exceeding the limit have been removed.", + customDataSingleBoardLineLimit="Field data exceeded height limit (126 lines).\nParts exceeding the limit have been removed.", nowPlaying="Now playing:", diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua index 9b600219..aa7a9a78 100644 --- a/parts/language/lang_zh.lua +++ b/parts/language/lang_zh.lua @@ -95,6 +95,13 @@ return { dataCorrupted="数据损坏", pasteWrongPlace="提醒:可能粘贴错地方了", noFile="找不到文件", + + -- data validation for custom game data import + customDataInvalidHold1="自定义模式数据中的 Hold 数量错误。重置为 6。", + customDataInvalidHold2="自定义模式数据中的 Hold 数量错误。重置为 1。", + customDataInvalidSequence="自定义模式数据中的序列模式不存在。重置为 bag。", + customDataBoardLineLimit="数据中一个或多个自定义场地的高度超过限制(126 行)。超出限制的部分已被移除。", + customDataSingleBoardLineLimit="数据中自定义场地的高度超过限制(126 行)。超出限制的部分已被移除。", nowPlaying="正在播放:", diff --git a/parts/scenes/customGame.lua b/parts/scenes/customGame.lua index 59ea064d..a127207c 100644 --- a/parts/scenes/customGame.lua +++ b/parts/scenes/customGame.lua @@ -191,6 +191,7 @@ function scene.keyDown(key,isRep) elseif key=='v' and kb.isDown('lctrl','rctrl') or key=='cV' then local str=sys.getClipboardText() local args=str:sub((str:find(":") or 0)+1):split("!") + local flagHasBoardWithLineLimit=false repeat if #args<4 then break end-- goto THROW_fail local success,env=DATA.pasteQuestArgs(args[1]) @@ -210,15 +211,22 @@ function scene.keyDown(key,isRep) TABLE.cut(CUSTOMGAME_LOCAL.field) CUSTOMGAME_LOCAL.field[1]=DATA.newBoard() for i=4,#args do + if args[i]:find("%S") then - local success,F=DATA.pasteBoard(args[i]) + local success, F, flagBoardLineLimit=DATA.pasteBoard(args[i]) if success then + if flagBoardLineLimit then + flagHasBoardWithLineLimit=true + end CUSTOMGAME_LOCAL.field[i-3]=F else if i<#args then break end-- goto THROW_fail end end end + if flagHasBoardWithLineLimit then + MES.new('warn', text.customDataBoardLineLimit) + end MES.new('check',text.importSuccess) return until true diff --git a/parts/scenes/custom_field.lua b/parts/scenes/custom_field.lua index b90f5170..426e7e16 100644 --- a/parts/scenes/custom_field.lua +++ b/parts/scenes/custom_field.lua @@ -237,9 +237,12 @@ function scene.keyDown(key) end str=str:sub(p+1) end - local success,F=DATA.pasteBoard(str) + local success,F, flagBoardLineLimit=DATA.pasteBoard(str) if success then FIELD[page]=F + if flagBoardLineLimit then + MES.new('warn', text.customDataSingleBoardLineLimit) + end MES.new('check',text.importSuccess) else MES.new('error',text.dataCorrupted)