模式文件应当是一个合(语)法的lua程序文件，其必须返回一个table，里面的内容包括：
	color:
		必选
		模式的颜色，用于点击地图图标后显示的提示文本
	env:
		必选
		模式环境变量，决定了关卡的各项属性
			*属性名*		*默认值*		*说明*
			drop			60			下落延迟(帧，支持自然数和2的整数次幂)
			lock			60			锁定延迟(帧)
			wait			0			出块延迟(帧)
			fall			0			消行延迟(帧)
			bone			false		是否开启骨块模式
			fieldH			20			场地高度
			heightLimit		1e99		允许的最大场地高度
			nextCount		6			显示next个数
			nextStartPos	1			next从第几个开始显示
			holdCount		1			hold个数
			infHold			false		是否能无限hold
			phyHold			false		是否开启物理hold
			ospin			true		是否能O-spin
			deepDrop		false		是否开启深降
			RS				'TRS'		旋转系统名

			das				10			DAS
			arr				2			ARR
			sddas			2			软降DAS
			sdarr			2			软降ARR
			mindas			0			允许的最小DAS
			minarr			0			允许的最小ARR
			minsdarr		0			允许的最小软降ARR
			ihs				true		提前Hold
			irs				true		提前旋转
			ims				true		提前移动

			skin			[设置值]		方块颜色，包含25个整数(1~16)的table
			face			[设置值]		方块朝向，包含25个整数(0~3)的table

			block			true		是否显示方块
			ghost			0.3			影子透明度(0~1)
			center			1			旋转中心透明度(0~1)
			smooth			false		是否平滑下落
			grid			0.16		网格透明度(0~1)
			bagLine			true		是否显示包分界线(如果存在)
			lockFX			2			锁定特效等级(0~5整数)
			dropFX			2			瞬间下落特效等级(0~5整数)
			moveFX			2			移动特效等级(0~5整数)
			clearFX			2			消除特效等级(0~5整数)
			splashFX		2			溅射特效等级(0~5整数)
			shakeFX			2			晃动特效等级(0~5整数)
			atkFX			2			攻击特效等级(0~5整数)

			text			true		是否显示消行文本
			score			true		是否显示落块分数
			highCam			false		是否开启超屏视野
			nextPos			false		是否开启生成预览
			showSpike		false		是否开启spike计数器

			hideBoard		false		场地隐藏模式("down"|"up"|"all")
			flipBoard		false		场地翻转模式("U-D"|"L-R"|"180")

			sequence		'bag'		序列模式，是放一块后对next序列的刷新函数，可以使用默认的几个函数用字符串表示。也可以自己写一个，注意：使用协程技术
			seqData			{1,2,3,4,5,6,7}序列模式使用的"包"数据(本质是生成序列用的数据，会作为参数传进上面那个叫sequence的序列生成函数，不一定是包)
			mission			false		包含任务的table，说明暂时略

			life			0			生命数(复活次数)
			garbageSpeed	1			垃圾行释放速度
			pushSpeed		3			垃圾行上涨速度
			noTele			false		是否禁止10个高级按键
			visible			'show'		方块可见性，填写固定的几个字符串
			freshLimit		1e99		锁延刷新次数限制
			easyFresh		true		是否使用简单锁延刷新规则
			bufferLimit		1e99		攻击缓冲行数上限

			fkey1			false		按下功能键1后执行的函数
			fkey2			false		按下功能键2后执行的函数
			keyCancel		{}			包含禁止使用的按键的id，例如{1,2}就是禁止左移和右移
			fine			[设置值]		是否开启非极简提示音
			fineKill		false		是否开启非极简即死
			b2bKill			false		是否开启断b2b即死
			missionKill		false		是否开启强制任务
			dropPiece		NULL		放一块后要执行的函数，输入玩家对象
			task			NULL		每帧会*继续执行*的函数，输入玩家对象，注意：使用协程技术

			bg				'none'		背景，只能填写内置背景的名字
			bgm				'race'		背景音乐名(或者列表随机，例如{'race','push'})，只能用内置音乐库的音乐名
			allowMod		true		是否允许mod
	load:
		必选
		模式初始化函数，一般创建一个玩家即可
		无输入
		无输出
	mesDisp:
		必选
		模式显示信息，是一个绘图函数，坐标系原点是玩家对象最左上角
		输入玩家对象
		无输出

	score:
		可选(不填就没有分数保存和计算)
		一局打完后要存储的数据
		输入玩家对象
		输出游戏结束瞬间返回一个包含直接决定该模式成绩的数据table(会被强制加上date标签)

	scoreDisp:
		可选(模式不出现在地图上的时候不用写)
		是把score()存起来的table转换为字符串显示出来的函数
		输入一个成绩table
		输出一个字符串

	comp:
		可选(没有score函数的时候不用写)
		是成绩table之间对比并排序的规则
		输入两个成绩table
		输出[第一个是不是排在第二个前面]的布尔值(可以类比"小于"运算)

	getRank:
		可选，模式评级函数
		是用于评价玩家表现的函数
		输入玩家对象
		输出0~5，0表示除了记录到排行榜外什么都不做；1/2/3/4/5表示D/C/B/A/S级，能解锁连接的模式，还会让模式图标在地图上显示不同的颜色

以下是40行的模式文件内容:
//sprint_40l.lua
return{--返回一个table，你也可以在之前定义一些常量或者函数什么的
	color=COLOR.green,--颜色
	env={--模式环境变量
		drop=60,lock=60,
		dropPiece=function(P)if P.stat.row>=40 then P			win('finish')end end,
		bg='bg2',bgm='race',
	},
	load=function()--生成玩家
		PLY.newPlayer(1)--1是玩家编号，默认用户控制1号玩家
	end,
	mesDisp=function(P)--40行模式需要显示的信息
		setFont(55)
		local r=40-P.stat.row
		if r<0 then r=0 end
		mStr(r,69,265)--把计算出来的剩余行数r显示出来
		PLY.draw.drawTargetLine(P,r)--使用自带的境界高度线绘制函数
	end,
	score=function(P)return{P.stat.time,P.stat.piece}end,--游戏结束时需要保存的本局关键信息
	scoreDisp=function(D)return STRING.time(D[1]).."   "..D[2].." Pieces"end,--把score返回的数据显示出来的方法
	comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,--按照时间排序，时间一样就看块数
	getRank=function(P)--计算评级
		if P.stat.row<40 then return end--你总得打完40行对吧，否则直接return空掉，成绩都不记录
		local T=P.stat.time
		return
		T<=26 and 5 or--时间小于等于26秒就是S级要求
		T<=32.6 and 4 or--A级要求
		T<=52.6 and 3 or--B级要求
		T<=92.9 and 2 or--C级要求
		T<=183 and 1 or--D级要求，解锁别的模式的最低标准
		0--记录成绩的最低标准
	end,
}