Compare commits

..

90 Commits

Author SHA1 Message Date
MrZ626
0650323f47 0.11.0:谜题更新 2020-09-23 20:15:43 +08:00
MrZ626
c70951797f 修复自定义任务解码错误 2020-09-22 23:27:14 +08:00
MrZ626
966e09e7bf 文档Ospin地图更新 2020-09-22 23:22:03 +08:00
MrZ626
db36423f48 修复选中selector按空格报错 2020-09-22 22:58:31 +08:00
MrZ626
868abe1396 新增显示落块分数 2020-09-22 22:58:22 +08:00
MrZ626
39e35a8cd6 文本微调 2020-09-22 17:41:18 +08:00
MrZ626
9803a6a056 精简代码 2020-09-22 14:29:56 +08:00
MrZ626
1b2c0efe9c 语音系统升级 2020-09-22 11:09:46 +08:00
MrZ626
98b2fe6260 语言文件微调 2020-09-22 00:33:53 +08:00
MrZ626
1ddb665583 优化自定义序列/任务编码 2020-09-22 00:33:45 +08:00
MrZ626
ad957ca488 添加笔记文件 2020-09-22 00:08:51 +08:00
MrZ626
513348958c 自定义任务id错误修复 2020-09-21 23:20:57 +08:00
MrZ626
e05160bdcb 加了几个tip 2020-09-21 22:52:48 +08:00
MrZ626
916e168eb9 debug模式光标坐标显示必定整数 2020-09-21 21:19:56 +08:00
MrZ626
8fd49c9a87 更强的debug模式 2020-09-21 16:58:49 +08:00
MrZ626
5c21b10686 使用元表输出控件信息 2020-09-21 16:55:20 +08:00
MrZ626
9303821c0f 自定义任务可以键入 2020-09-21 15:31:48 +08:00
MrZ626
4f07726f89 调整文本相关 2020-09-21 15:20:47 +08:00
MrZ626
aa0f064262 非单人游戏不允许回放 2020-09-21 14:35:35 +08:00
MrZ626
0b7032ce50 整理代码 2020-09-21 14:33:51 +08:00
MrZ626
fce0b3862d 修改任务和序列的编码 2020-09-21 14:25:34 +08:00
MrZ626
d5634c0f6f 粘贴任务的非法判断if写反 2020-09-21 09:33:10 +08:00
MrZ626
75b82496a5 修改消行任务ID 2020-09-21 09:32:33 +08:00
MrZ626
c1a3abcf50 序列/任务自定义编辑bug 2020-09-20 21:33:11 +08:00
MrZ626
27827d5ab1 自定义游戏默认关闭ospin 2020-09-20 20:21:02 +08:00
MrZ626
3e8010d512 文档更新 2020-09-20 20:20:41 +08:00
MrZ626
e091cb6749 计算器支持小数点和科学计数法 2020-09-20 20:19:47 +08:00
MrZ626
8b202d9d05 整理local 2020-09-20 20:17:02 +08:00
MrZ626
0aacf855fb b2b点数计算微调,调整mini判定 2020-09-20 20:14:49 +08:00
MrZ626
6a61d4a0e5 自定义游戏支持复制所有【题目】信息 2020-09-20 20:14:44 +08:00
MrZ626
e48ebe91f0 dumpTable和addToTable函数改为全局放入toolfunc文件 2020-09-20 18:53:32 +08:00
MrZ626
dcc119015e 任务列表显示在hold下方 2020-09-20 18:53:14 +08:00
MrZ626
469533c604 微调任务失败信息和防御值显示动画 2020-09-20 16:15:03 +08:00
MrZ626
f0d4c7ae7d 自定义序列/任务连续同种方块使用缩略显示 2020-09-20 15:37:39 +08:00
MrZ626
6f90b85da5 color模块新增生成随机色,生成彩虹色功能 2020-09-20 15:34:58 +08:00
MrZ626
5717fb4b08 干旱2进入就报错 2020-09-20 12:00:31 +08:00
MrZ626
034c1b3c40 修改flink背景闪烁频率 2020-09-20 01:09:13 +08:00
MrZ626
d568e6d071 修改攻击算法,文档后续更新 2020-09-20 01:06:18 +08:00
MrZ626
a4cd661ed8 保护执行剩余部分CC代码,也许不会再闪退了 2020-09-20 01:06:12 +08:00
MrZ626
b456c2eb5e 隐形WTF模式回放场地可见 2020-09-20 01:06:07 +08:00
MrZ626
7e726bc18a 小屏幕Log.print输出间隔也缩小 2020-09-19 11:20:04 +08:00
MrZ626
e9e81a993e 微调自定义游戏部分选择器的输出 2020-09-19 02:02:44 +08:00
MrZ626
3cd6335e9d 整理代码 2020-09-19 01:57:30 +08:00
MrZ626
155a5bf71c 修复自定义任务数据缺失(lua特性导致) 2020-09-19 01:56:12 +08:00
MrZ626
ade20aed9a 安卓端提醒用户打开全屏 2020-09-19 00:43:23 +08:00
MrZ626
dfbdd2ba47 删除 更新后删除三个模式文件 的代码 2020-09-19 00:36:32 +08:00
MrZ626
9636b2a34e debug2模式下按q可在游戏内展示控件属性 2020-09-19 00:31:51 +08:00
MrZ626
f174a02bdc debug页面新增复制日志信息和输出屏幕信息 2020-09-19 00:31:45 +08:00
MrZ626
2044f4096d 隐形WTF模式会提示玩家打开生成音效 2020-09-19 00:30:27 +08:00
MrZ626
754d9a2afc 任务系统完成,支持导入导出,修复错误(之前的anyN有问题) 2020-09-19 00:02:58 +08:00
MrZ626
0c648a8c1e 整理代码,自定义序列新增光标右移10按钮 2020-09-18 23:09:34 +08:00
MrZ626
e2d06503ad 自定义模式允许设置消行任务 2020-09-18 23:07:39 +08:00
MrZ626
a5285a9beb 【方块透明度改为显示开关】遗留问题处理 2020-09-18 22:54:55 +08:00
MrZ626
333211a312 修复O4或I4后游戏崩溃 2020-09-18 19:52:45 +08:00
MrZ626
dba1043ed8 splitStr函数定义放入toolFunc文件并全局 2020-09-18 19:30:19 +08:00
MrZ626
8e6b721a73 自定义游戏设置重新分页+排版 2020-09-18 19:29:06 +08:00
MrZ626
e1d7e05aff 命数超过3使用缩略显示 2020-09-18 14:18:31 +08:00
MrZ626
2deb9b8137 焦点选择器控件上时按方向键闪退 2020-09-18 14:03:37 +08:00
MrZ626
87b84f971d 自定义序列中光标位置可循环 2020-09-18 14:01:06 +08:00
MrZ626
d3e72c5cac 方块透明度改为显示开关 2020-09-18 14:00:19 +08:00
MrZ626
b2922cb871 软件锁场景层次更改,可以从设置进入 2020-09-18 12:29:22 +08:00
MrZ626
1e68993e7c 改自定义游戏标题位置 2020-09-17 23:56:28 +08:00
MrZ626
147e4d9dc7 修复科研极简+模式不能消四 2020-09-17 23:51:54 +08:00
MrZ626
92f71c02b5 软件锁微调 2020-09-17 23:39:53 +08:00
MrZ626
48def931bf LOG.print输出字体随屏幕大小变化 2020-09-17 23:39:45 +08:00
MrZ626
98b48cc89e 0.10.11:自定义游戏更新 2020-09-17 23:39:34 +08:00
MrZ626
f7d435748c 对CC崩溃进行一定保护,游戏可能不会闪退 2020-09-17 22:10:28 +08:00
MrZ626
7983c3a645 修复回放录像时间轴错开一帧 2020-09-17 21:48:22 +08:00
MrZ626
e2e633bef2 科研模式显示的攻击改为一位小数 2020-09-17 21:18:38 +08:00
MrZ626
31f5393dfc 选择器控件完成 2020-09-17 21:05:08 +08:00
MrZ626
2f4cd650fd 修复背景lightning2 2020-09-17 20:49:13 +08:00
MrZ626
d47629e64a 微调LOG.print使用 2020-09-17 20:49:08 +08:00
MrZ626
43874a09db 全新自定义游戏设置界面 2020-09-17 18:17:06 +08:00
MrZ626
3099043c62 20G移出gameEnv属性 2020-09-17 18:01:16 +08:00
MrZ626
62099773f6 几个菜单大标题微调 2020-09-17 18:01:12 +08:00
MrZ626
70b96a44a7 修改MPH模式信息文本 2020-09-17 11:15:19 +08:00
MrZ626
079df818a6 当前方块透明度可调 2020-09-16 18:29:32 +08:00
MrZ626
d9920c3772 整理游戏设置变量 2020-09-16 18:25:07 +08:00
MrZ626
045b352064 整理并重写部分玩家绘制代码 2020-09-16 17:47:35 +08:00
MrZ626
b139cfe62f 代码整理 2020-09-15 11:05:18 +08:00
MrZ626
f64bf2bc27 虚拟按键最大尺寸增加 2020-09-15 11:04:29 +08:00
MrZ626
3c4491ec42 玩家上次消行信息lastClear属性改为表,包含更多信息 2020-09-15 00:36:09 +08:00
MrZ626
e6fea98822 新模式:MPH竞速 2020-09-14 12:41:18 +08:00
MrZ626
c83328c28b 0next时不显示生成预览 2020-09-14 11:00:53 +08:00
MrZ626
0e8c40d6d9 不跟踪vscode配置目录 2020-09-14 10:32:54 +08:00
MrZ626
61073bfdcb 玩家方法reach_winCheck改为check_lineReach,新增攻击达标检测函数 2020-09-14 00:46:52 +08:00
MrZ626
c787612aa6 重开提示语修改 2020-09-14 00:46:19 +08:00
MrZ626
2368b93efc 小游戏开关排版调整,使用qwer切换选项,增加舒尔特方格特效开关 2020-09-14 00:43:57 +08:00
MrZ626
23e8739151 科研模式目标改为200行攻击 2020-09-14 00:41:34 +08:00
MrZ626
7a2477ae46 玩家方法reach_winCheck改为check_lineReach 2020-09-13 21:12:30 +08:00
69 changed files with 2855 additions and 1617 deletions

4
.gitignore vendored
View File

@@ -1,3 +1,5 @@
.vscode
libAndroid
BGM
font.ttf
BGM
note.lua

View File

@@ -53,7 +53,7 @@ back.flink={
t=t+dt
end,
draw=function()
local t=.13-t%3%1.7
local t=.13-t%3%1.9
if t<.2 then gc.clear(t,t,t)
else gc.clear(0,0,0)
end
@@ -130,7 +130,6 @@ back.wing={
end,
}--Flandre's wing
local _
back.fan={
init=function()
fan=_G.title_fan
@@ -313,7 +312,7 @@ back.lightning={
}--Lightning
local blocks=require("parts/mino")
local scs=require("parts/spinCenters")
local scs={.5,1.5,.5,1.5,.5,1.5,.5,1.5,.5,1.5,1,1,0,2}
back.lightning2={
init=function()
t=0
@@ -325,14 +324,14 @@ back.lightning2={
t=t+dt
end,
draw=function()
local t=1.2-t%10%3%1.2
if t<.3 then gc.clear(t,t,t)
local R=7-int(t*.5%7)
local T=1.2-t%10%3%1.2
if T<.3 then gc.clear(T,T,T)
else gc.clear(0,0,0)
end
local R=7-int(t*.5)%7
local _=colorLib[colorSet[R]]
gc.setColor(_[1],_[2],_[3],.1)
gc.draw(blockImg[R],640,360,t%3.1416*6,400,400,scs[R][0][2]-.5,#blocks[R][0]-scs[R][0][1]+.5)
gc.setColor(_[1],_[2],_[3],.12)
gc.draw(blockImg[R],640,360,t%3.1416*6,400,400,scs[2*R],#blocks[R][0]-scs[2*R-1])
end,
}--Fast lightning + spining tetromino
@@ -430,6 +429,10 @@ function BG.set(bg,data)
BG.discard()
collectgarbage()
end
if not back[bg]then
LOG.print("No BG called"..bg,"warn")
return
end
BG.cur=bg
bg=back[bg]

View File

@@ -41,7 +41,7 @@ function BGM.loadOne(N)
BGM.list[N]:setLooping(true)
BGM.list[N]:setVolume(0)
else
LOG.print("No BGM file: "..N,color.red)
LOG.print("No BGM file: "..N,"warn")
end
end
function BGM.loadAll()

View File

@@ -1,3 +1,5 @@
local rnd=math.random
local sin=math.sin
local color={
red={1,0,0},
green={0,1,0},
@@ -5,14 +7,16 @@ local color={
yellow={1,1,0},
magenta={1,0,1},
cyan={0,1,1},
purple={.5,0,1},
orange={1,.6,0},
grey={.6,.6,.6},
lRed={1,.5,.5},
lGreen={.5,1,.5},
lBlue={.6,.7,1},
lCyan={.5,1,1},
lMagenta={1,.5,1},
lYellow={1,1,.5},
lMagenta={1,.5,1},
lCyan={.5,1,1},
lPurple={.8,.4,1},
lOrange={1,.7,.3},
lGrey={.8,.8,.8},
@@ -20,19 +24,43 @@ local color={
dRed={.6,0,0},
dGreen={0,.6,0},
dBlue={0,0,.6},
dCyan={0,.6,.6},
dMagenta={.6,0,.6},
dYellow={.6,.6,0},
dMagenta={.6,0,.6},
dCyan={0,.6,.6},
dPurple={.3,0,.6},
dOrange={.6,.4,0},
dGrey={.3,.3,.3},
black={0,0,0},
orange={1,.6,0},
pink={1,0,.6},
grass={.6,1,0},
water={0,1,.6},
black={0,0,0},
white={1,1,1},
purple={.5,0,1},
}
local list_norm={"red","green","blue","yellow","magenta","cyan","purple","orange","pink","grass"}
local len_list_norm=#list_norm
function color.random_norm()
return color[list_norm[rnd(len_list_norm)]]
end
local list_bright={"lRed","lGreen","lBlue","lYellow","lMagenta","lCyan","lPurple","lOrange"}
local len_list_bright=#list_bright
function color.random_bright()
return color[list_bright[rnd(len_list_bright)]]
end
local list_dark={"dRed","dGreen","dBlue","dYellow","dMagenta","dCyan","dPurple","dOrange"}
local len_list_dark=#list_dark
function color.random_bright()
return color[list_dark[rnd(len_list_dark)]]
end
function color.rainbow(phase)
return
sin(phase)*.4+.6,
sin(phase+6.28/3)*.4+.6,
sin(phase-6.28/3)*.4+.6
end
return color

View File

@@ -1,76 +1,6 @@
local fs=love.filesystem
local int,max,min=math.floor,math.max,math.min
local sub,find=string.sub,string.find
local int=math.floor
local toN,toS=tonumber,tostring
local concat=table.concat
local function splitS(s,sep)
local L={}
local p1,p2=1--start,target
while p1<=#s do
p2=find(s,sep,p1)or #s+1
L[#L+1]=sub(s,p1,p2-1)
p1=p2+#sep
end
return L
end
local tabs={
[0]="",
"\t",
"\t\t",
"\t\t\t",
"\t\t\t\t",
"\t\t\t\t\t",
}
local function dumpTable(L,t)
local s
if t then
s="{\n"
else
s="return{\n"
t=1
end
local count=1
for k,v in next,L do
local T=type(k)
if T=="number"then
if k==count then
k=""
count=count+1
else
k="["..k.."]="
end
elseif T=="string"then
if find(k,"[^0-9a-zA-Z_]")then
k="[\""..k.."\"]="
else
k=k.."="
end
elseif T=="boolean"then k="["..k.."]="
else assert(false,"Error key 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,t+1)
elseif T=="boolean"then v=tostring(v)
else assert(false,"Error data type!")
end
s=s..tabs[t]..k..v..",\n"
end
return s..tabs[t-1].."}"
end
local function addToTable(G,base)--Refresh default base with G-values
for k,v in next,G do
if type(v)==type(base[k])then
if type(v)=="table"then
addToTable(v,base[k])
else
base[k]=v
end
end
end
end
local files={
data= fs.newFile("data.dat"),

View File

@@ -20,7 +20,6 @@ LOG= require("Zframework/log")
local ms=love.mouse
local gc=love.graphics
local Timer=love.timer.getTime
local int,rnd,abs=math.floor,math.random,math.abs
local max,min=math.max,math.min
local ins,rem=table.insert,table.remove
@@ -188,32 +187,27 @@ end
function love.keypressed(i)
mouseShow=false
if devMode then
if i=="f5"then
DBP("DEBUG:")
elseif i=="f3"then LOG.print("挂了.gif")
elseif i=="f4"then LOG.copy()
if i=="f1"then love._setGammaCorrect(true)LOG.print("GammaCorrect: on","warn")
elseif i=="f2"then love._setGammaCorrect(false)LOG.print("GammaCorrect: off","warn")
elseif i=="f3"then
for i=1,8 do
local P=players.alive[rnd(#players.alive)]
if P~=players[1]then
P.lastRecv=players[1]
P:lose()
end
end
elseif i=="f4"then LOG.copy()
elseif i=="f5"then if love._openConsole then love._openConsole()end
elseif i=="f6"then if WIDGET.sel then DBP(WIDGET.sel)end
elseif i=="f7"then for k,v in next,_G do DBP(k,v)end
elseif i=="f8"then devMode=nil LOG.print("DEBUG OFF",color.yellow)
elseif i=="f9"then devMode=1 LOG.print("DEBUG 1",color.yellow)
elseif i=="f10"then devMode=2 LOG.print("DEBUG 2",color.yellow)
elseif i=="f11"then devMode=3 LOG.print("DEBUG 3",color.yellow)
elseif i=="f12"then devMode=4 LOG.print("DEBUG 4",color.yellow)
elseif devMode==2 then
if i=="k"then
for i=1,8 do
local P=players.alive[rnd(#players.alive)]
if P~=players[1]then
P.lastRecv=players[1]
P:lose()
end
end
elseif i=="q"then
local W=WIDGET.sel
if W then W:printInfo()end
elseif i=="e"then
for k,v in next,_G do
DBP(k,v)
end
elseif WIDGET.sel then
if WIDGET.sel then
local W=WIDGET.sel
if i=="left"then W.x=W.x-10
elseif i=="right"then W.x=W.x+10
@@ -416,6 +410,7 @@ local FPS=love.timer.getFPS
love.draw,love.update=nil--remove default draw/update
function love.run()
local T=love.timer
local Timer=T.getTime
local STEP,GETDelta,WAIT=T.step,T.getDelta,T.sleep
local mini=love.window.isMinimized
local PUMP,POLL=love.event.pump,love.event.poll
@@ -513,7 +508,7 @@ function love.run()
gc.setColor(devColor[devMode])
gc.print("Memory:"..gcinfo(),5,_-20)
gc.print("Lines:"..freeRow.getCount(),5,_-40)
gc.print("Cursor:"..mx.." "..my,5,_-60)
gc.print("Cursor:"..int(mx+.5).." "..int(my+.5),5,_-60)
gc.print("Voices:"..VOC.getCount(),5,_-80)
gc.print("Tasks:"..TASK.getCount(),5,_-100)
ins(frameTimeList,1,dt)rem(frameTimeList,126)

File diff suppressed because it is too large Load Diff

View File

@@ -22,7 +22,7 @@ function LOG.update()
if not debugMesList[1]then
debugMesFloat=0
elseif i==1 then
debugMesFloat=debugMesFloat+25
debugMesFloat=debugMesFloat
end
end
end
@@ -34,16 +34,19 @@ function LOG.update()
end
function LOG.draw()
if debugMesList[1]then
setFont(20)
gc.push("transform")
local k=scr.w/1280
setFont(int(20*k))
for i=1,#debugMesList do
local M=debugMesList[i]
local t=M.time
gc.setColor(M.r,M.g,M.b,M.blink>0 and int(M.blink/3)%2 or min(t/26,1))
gc.print(M.text,10+(20-min(t,20))^1.5/4,25*i+debugMesFloat)
gc.print(M.text,10+(20-min(t,20))^1.5/4,25*i*k+debugMesFloat)
end
gc.pop()
end
end
function LOG.print(text,T,C)--type/time,color
function LOG.print(text,T,C)--text,type/time,color
local time
local his
if T=="warn"then

View File

@@ -30,7 +30,7 @@ function SFX.loadOne(_)
if love.filesystem.getInfo(N)then
SFX.list[_]={love.audio.newSource(N,"static")}
else
LOG.print("No SFX file: "..N,color.red)
LOG.print("No SFX file: "..N,"warn")
end
end
function SFX.loadAll()

View File

@@ -64,10 +64,10 @@ function textFX.beat(t)
mStr(t.text,0,-t.font*.7)
gc.pop()
end
function textFX.mark(t)
function textFX.score(t)
local _,_,_,T=gc.getColor()
gc.setColor(1,1,1,T*.08)
mStr(t.text,t.x,t.y-t.font*.7)
gc.setColor(1,1,1,T*.5)
mStr(t.text,t.x,t.y-t.font*.7-t.c^.3*50)
end
local TEXT={}

View File

@@ -1,8 +1,9 @@
local gc=love.graphics
local int=math.floor
local format=string.format
local find=string.find
do
do--setFont
local newFont=gc.setNewFont
local setNewFont=gc.setFont
local fontCache,currentFontSize={}
@@ -39,7 +40,75 @@ do
end
end
end
do--dumpTable
local tabs={
[0]="",
"\t",
"\t\t",
"\t\t\t",
"\t\t\t\t",
"\t\t\t\t\t",
}
function dumpTable(L,t)
local s
if t then
s="{\n"
else
s="return{\n"
t=1
end
local count=1
for k,v in next,L do
local T=type(k)
if T=="number"then
if k==count then
k=""
count=count+1
else
k="["..k.."]="
end
elseif T=="string"then
if find(k,"[^0-9a-zA-Z_]")then
k="[\""..k.."\"]="
else
k=k.."="
end
elseif T=="boolean"then k="["..k.."]="
else assert(false,"Error key 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,t+1)
elseif T=="boolean"then v=tostring(v)
else assert(false,"Error data type!")
end
s=s..tabs[t]..k..v..",\n"
end
return s..tabs[t-1].."}"
end
end
function addToTable(G,base)--Refresh default base with G-values
for k,v in next,G do
if type(v)==type(base[k])then
if type(v)=="table"then
addToTable(v,base[k])
else
base[k]=v
end
end
end
end
function splitStr(s,sep)
local L={}
local p1,p2=1--start,target
while p1<=#s do
p2=find(s,sep,p1)or #s+1
L[#L+1]=sub(s,p1,p2-1)
p1=p2+#sep
end
return L
end
function toTime(s)
if s<60 then
return format("%.3fs",s)

View File

@@ -1,49 +1,66 @@
local rnd=math.random
local rem=table.remove
local voiceQueue={free=0}
local bank={}--{{SRC1s},{SRC2s},...}
local bank={}--{vocName1={SRC1s},vocName2={SRC2s},...}
local VOC={}
VOC.name={
"zspin","sspin","lspin","jspin","tspin","ospin","ispin",
"single","double","triple","techrash",
"mini","b2b","b3b","pc",
"mini","b2b","b3b","clear",
"win","lose",
"bye",
"nya",
"happy",
"doubt",
"sad",
"nya_happy",
"nya_doubt",
"nya_sad",
"egg",
"welcome"
"welcome_voc"
}
VOC.list={
zspin={"zspin_1","zspin_2","zspin_3"},
sspin={"sspin_1","sspin_2","sspin_3","sspin_4","sspin_5","sspin_6"},
lspin={"lspin_1","lspin_2"},
jspin={"jspin_1","jspin_2","jspin_3","jspin_4"},
tspin={"tspin_1","tspin_2","tspin_3","tspin_4","tspin_5","tspin_6"},
ospin={"ospin_1","ospin_2","ospin_3"},
ispin={"ispin_1","ispin_2","ispin_3"},
VOC.list={}
single={"single_1","single_2","single_3","single_4","single_5","single_6","single_7"},
double={"double_1","double_2","double_3","double_4","double_5"},
triple={"triple_1","triple_2","triple_3","triple_4","triple_5","triple_6","triple_7"},
techrash={"techrash_1","techrash_2","techrash_3","techrash_4"},
local function loadVoiceFile(N,vocName)
local fileName="VOICE/"..vocName..".ogg"
if love.filesystem.getInfo(fileName)then
bank[vocName]={love.audio.newSource(fileName,"static")}
table.insert(VOC.list[N],vocName)
return true
else
return
end
end
function VOC.loadOne(_)
local N=VOC.name[_]
VOC.list[N]={}
local i=1
while true do
if not loadVoiceFile(N,N.."_"..i)then
break
end
i=i+1
end
if i==1 then
if not loadVoiceFile(N,N)then
LOG.print("No VOICE file: "..N,"warn")
end
end
end
function VOC.loadAll()
for i=1,#VOC.name do
VOC.loadOne(i)
end
end
mini={"mini_1","mini_2","mini_3"},
b2b={"b2b_1","b2b_2","b2b_3"},
b3b={"b3b_1","b3b_2"},
pc={"clear_1","clear_2"},
win={"win_1","win_2","win_3","win_4","win_5","win_6","win_6","win_7"},
lose={"lose_1","lose_2","lose_3"},
bye={"bye_1","bye_2"},
nya={"nya_1","nya_2","nya_3","nya_4"},
happy={"nya_happy_1","nya_happy_2","nya_happy_3","nya_happy_4"},
doubt={"nya_doubt_1","nya_doubt_2"},
sad={"nya_sad_1"},
egg={"egg_1","egg_2"},
welcome={"welcome_voc"},
}
function VOC.getFreeChannel()
local i=#voiceQueue
for i=1,i do
if #voiceQueue[i]==0 then return i end
end
voiceQueue[i+1]={s=0}
return i+1
end
function VOC.getCount()
return #voiceQueue
end
local function getVoice(str)
local L=bank[str]
@@ -59,29 +76,6 @@ local function getVoice(str)
return L[n]
--Load voice with string
end
function VOC.loadOne(_)
local N=VOC.name[_]
for i=1,#VOC.list[N]do
local V=VOC.list[N][i]
bank[V]={love.audio.newSource("VOICE/"..V..".ogg","static")}
end
end
function VOC.loadAll()
for i=1,#VOC.list do
VOC.loadOne(i)
end
end
function VOC.getFreeChannel()
local i=#voiceQueue
for i=1,i do
if #voiceQueue[i]==0 then return i end
end
voiceQueue[i+1]={s=0}
return i+1
end
function VOC.getCount()
return #voiceQueue
end
function VOC.update()
for i=#voiceQueue,1,-1 do
local Q=voiceQueue[i]
@@ -118,15 +112,15 @@ function VOC.update()
end
function VOC.play(s,chn)
if setting.voc>0 then
local _=VOC.list[s]
if not _ then return end
if chn then
local L=voiceQueue[chn]
local _=VOC.list[s]
if not _ then return end
L[#L+1]=_[rnd(#_)]
L.s=1
--Add to queue[chn]
else
voiceQueue[VOC.getFreeChannel()]={s=1,VOC.list[s][rnd(#VOC.list[s])]}
voiceQueue[VOC.getFreeChannel()]={s=1,_[rnd(#_)]}
--Create new channel & play
end
end

View File

@@ -69,8 +69,8 @@ function button:draw()
gc.printf(t,x,y0,w,"center")
end
end
function button:printInfo()
DBP(format("x=%d,y=%d,w=%d,h=%d,font=%d",self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font))
function button:getInfo()
return format("x=%d,y=%d,w=%d,h=%d,font=%d",self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font)
end
local key={
@@ -119,8 +119,8 @@ function key:draw()
gc.printf(t,x,y+h*.5-self.font*.7,w,"center")
end
end
function key:printInfo()
DBP(format("x=%d,y=%d,w=%d,h=%d,font=%d",self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font))
function key:getInfo()
return format("x=%d,y=%d,w=%d,h=%d,font=%d",self.x+self.w*.5,self.y+self.h*.5,self.w,self.h,self.font)
end
local switch={
@@ -176,8 +176,8 @@ function switch:draw()
gc.printf(t,x-412-ATV,y+20-self.font*.7,400,"right")
end
end
function switch:printInfo()
DBP(format("x=%d,y=%d,font=%d",self.x,self.y,self.font))
function switch:getInfo()
return format("x=%d,y=%d,font=%d",self.x,self.y,self.font)
end
local slider={
@@ -208,7 +208,7 @@ function slider:reset()
self.pos=0
end
function slider:isAbove(x,y)
return x>self.x-10 and x<self.x+self.w+10 and y>self.y-20 and y<self.y+20
return x>self.x-10 and x<self.x+self.w+10 and y>self.y-25 and y<self.y+25
end
function slider:getCenter()
return self.x+self.w*(self.pos/self.unit),self.y
@@ -280,12 +280,94 @@ function slider:draw()
gc.printf(t,x-312-ATV,y-self.font*.7,300,"right")
end
end
function slider:printInfo()
DBP(format("x=%d,y=%d,w=%d",self.x,self.y,self.w))
function slider:getInfo()
return format("x=%d,y=%d,w=%d",self.x,self.y,self.w)
end
local selector={
type="selector",
ATV=8,--Activating time(0~4)
select=0,--Selected item ID
selText=nil,--Selected item name
}
function selector:reset()
self.ATV=0
local V=self.disp()
local L=self.list
for i=1,#L do
if L[i]==V then
self.select=i
self.selText=self.list[i]
break
end
end
end
function selector:isAbove(x,y)
return
x>self.x and
x<self.x+self.w+2 and
y>self.y and
y<self.y+60
end
function selector:getCenter()
return self.x+self.w*.5,self.y+30
end
function selector:update()
local atv=self.ATV
if WIDGET.sel==self then
if atv<8 then
self.ATV=atv+1
end
else
if atv>0 then
self.ATV=atv-.5
end
end
end
function selector:draw()
local x,y=self.x,self.y
local r,g,b=unpack(self.color)
local w=self.w
local ATV=self.ATV
gc.setColor(1,1,1,.6+ATV*.1)
gc.setLineWidth(3)
gc.rectangle("line",x,y,w,60)
gc.setColor(1,1,1,.2+ATV*.1)
local t=(Timer()%.5)^.5
if self.select>1 then
gc.draw(drawableText.small,x+6,y+20)
if ATV>0 then
gc.setColor(1,1,1,ATV*.4*(.5-t))
gc.draw(drawableText.small,x+6-t*40,y+20)
gc.setColor(1,1,1,.2+ATV*.1)
end
end
if self.select<#self.list then
gc.draw(drawableText.large,x+w-24,y+20)
if ATV>0 then
gc.setColor(1,1,1,ATV*.4*(.5-t))
gc.draw(drawableText.large,x+w-24+t*40,y+20)
end
end
setFont(28)
t=self.text
if t then
if type(t)=="function"then t=t()end
gc.setColor(r,g,b)
mStr(self.text,x+w*.5,y+17-21)
end
gc.setColor(1,1,1)
mStr(self.selText,x+w*.5,y+43-21)
end
function selector:getInfo()
return format("x=%d,y=%d,w=%d",self.x,self.y,self.w)
end
local WIDGET={}
WIDGET.active={}--Table, contains all active widgets
WIDGET.active={}--Table contains all active widgets
WIDGET.sel=nil--Selected widget
function WIDGET.set(L)
WIDGET.sel=nil
@@ -299,17 +381,24 @@ function WIDGET.set(L)
end
end
WIDGET.new={}
local widgetMetatable={
__tostring=function(self)
return self:getInfo()
end,
}
function WIDGET.newText(D)
local _={
name= D.name,
x= D.x,
y= D.y,
align= D.align,
color= color[D.color]or D.color,
color= D.color and(color[D.color]or D.color)or color.white,
font= D.font,
hide= D.hide,
}for k,v in next,button do _[k]=v end return _
}
for k,v in next,button do _[k]=v end
setmetatable(_,widgetMetatable)
return _
end
function WIDGET.newImage(D)
local _={
@@ -318,11 +407,14 @@ function WIDGET.newImage(D)
y= D.y-h*.5,
w= D.w,
h= D.h,
color= color[D.color]or D.color,
color= D.color and(color[D.color]or D.color)or color.white,
font= D.font,
code= D.code,
hide= D.hide,
}for k,v in next,button do _[k]=v end return _
}
for k,v in next,button do _[k]=v end
setmetatable(_,widgetMetatable)
return _
end
function WIDGET.newButton(D)
if not D.h then D.h=D.w end
@@ -342,11 +434,14 @@ function WIDGET.newButton(D)
D.x+D.w*.35,D.y+D.h*.35,
},
color= color[D.color]or D.color,
color= D.color and(color[D.color]or D.color)or color.white,
font= D.font,
code= D.code,
hide= D.hide,
}for k,v in next,button do _[k]=v end return _
}
for k,v in next,button do _[k]=v end
setmetatable(_,widgetMetatable)
return _
end
function WIDGET.newKey(D)
if not D.h then D.h=D.w end
@@ -366,11 +461,14 @@ function WIDGET.newKey(D)
D.x+D.w*.35,D.y+D.h*.35,
},
color= color[D.color]or D.color,
color= D.color and(color[D.color]or D.color)or color.white,
font= D.font,
code= D.code,
hide= D.hide,
}for k,v in next,key do _[k]=v end return _
}
for k,v in next,key do _[k]=v end
setmetatable(_,widgetMetatable)
return _
end
function WIDGET.newSwitch(D)
local _={
@@ -379,8 +477,6 @@ function WIDGET.newSwitch(D)
x= D.x,
y= D.y,
cx= D.x+25,
cy= D.y,
resCtr={
D.x+25,D.y,
},
@@ -389,7 +485,10 @@ function WIDGET.newSwitch(D)
disp= D.disp,
code= D.code,
hide= D.hide,
}for k,v in next,switch do _[k]=v end return _
}
for k,v in next,switch do _[k]=v end
setmetatable(_,widgetMetatable)
return _
end
function WIDGET.newSlider(D)
local _={
@@ -399,8 +498,6 @@ function WIDGET.newSlider(D)
y= D.y,
w= D.w,
cx= D.x+D.w*.5,
cy= D.y,
resCtr={
D.x,D.y,
D.x+D.w*.25,D.y,
@@ -438,7 +535,35 @@ function WIDGET.newSlider(D)
_.show=sliderShowFunc.int
end
end
for k,v in next,slider do _[k]=v end return _
for k,v in next,slider do _[k]=v end
setmetatable(_,widgetMetatable)
return _
end
function WIDGET.newSelector(D)
local _={
name= D.name,
x= D.x-D.w*.5,
y= D.y-30,
w= D.w,
resCtr={
D.x,D.y,
D.x+D.w*.25,D.y,
D.x+D.w*.5,D.y,
D.x+D.w*.75,D.y,
D.x+D.w,D.y,
},
color= D.color and(color[D.color]or D.color)or color.white,
list= D.list,
disp= D.disp,
code= D.code,
hide= D.hide,
}
for k,v in next,selector do _[k]=v end
setmetatable(_,widgetMetatable)
return _
end
function WIDGET.moveCursor(x,y)
@@ -462,9 +587,30 @@ function WIDGET.press(x,y)
SFX.play("lock")
elseif W.type=="switch"then
W.code()
SFX.play("move",.6)
SFX.play("move")
elseif W.type=="slider"then
WIDGET.drag(x,y)
elseif W.type=="selector"then
if x then
local s=W.select
if x<W.x+W.w*.5 then
if s>1 then
s=s-1
sysFX.newShade(.3,1,1,1,W.x,W.y,W.w*.5,60)
end
else
if s<#W.list then
s=s+1
sysFX.newShade(.3,1,1,1,W.x+W.w*.5,W.y,W.w*.5,60)
end
end
if W.select~=s then
W.code(W.list[s])
W.select=s
W.selText=W.list[s]
SFX.play("prerotate")
end
end
end
if W.hide and W.hide()then WIDGET.sel=nil end
end
@@ -473,8 +619,9 @@ function WIDGET.drag(x,y,dx,dy)
if not W then return end
if W.type=="slider"then
if not x then return end
x=x-W.x
local p=W.disp()
local P=x<W.x and 0 or x>W.x+W.w and W.unit or(x-W.x)/W.w*W.unit
local P=x<0 and 0 or x>W.w and W.unit or x/W.w*W.unit
if not W.smooth then
P=int(P+.5)
end
@@ -518,6 +665,26 @@ function WIDGET.keyPressed(i)
W.lastTime=Timer()
W.change()
end
elseif W.type=="selector"then
print(1)
local s=W.select
if i=="left"then
if s>1 then
s=s-1
sysFX.newShade(.3,1,1,1,W.x,W.y,W.w*.5,60)
end
else
if s<#W.list then
s=s+1
sysFX.newShade(.3,1,1,1,W.x+W.w*.5,W.y,W.w*.5,60)
end
end
if W.select~=s then
W.code(W.list[s])
W.select=s
W.selText=W.list[s]
SFX.play("prerotate")
end
end
end
end

View File

@@ -74,28 +74,47 @@ local virtualkeySet={
{20,1210, 50,30},--zangiRight
},--PC key feedback(top&in a row)
}
local CUSlist={
drop={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
sequence={"bag","his4","rnd","loop","fixed"},
target={10,20,40,100,200,500,1000,1e99},
visible={"show","time","fast","none"},
freshLimit={0,8,15,1e99},
opponent={0,1,2,3,4,5,6,7,8,9,10},
life={0,1,2,3,5,10,15,26,42,87,500},
pushSpeed={1,2,3,5,15},
bg={"none","bg1","bg2","rainbow","rainbow2","glow","rgb","aura","wing","matrix","space"},
bgm={"blank","race","push","way","reason","newera","oxygen","infinite","down","secret7th","secret8th","rockblock","cruelty","final"},
}
--Lambda Funcs for widgets,delete at file end
function SETval(k) return function()return setting[k] end end
function SETsto(k) return function(i)setting[k]=i end end
function SETrev(k) return function()setting[k]=not setting[k] end end
function pressKey(k)return function()love.keypressed(k) end end
function setPen(i) return function()sceneTemp.pen=i end end
function prevSkin(n)return function()SKIN.prev(n) end end
function nextSkin(n)return function()SKIN.next(n) end end
function nextDir(n) return function()SKIN.rotate(n) end end
function VKAdisp(n) return function()return VK_org[n].ava end end
function VKAcode(n) return function()VK_org[n].ava=not VK_org[n].ava end end
function setLang(n) return function()LANG.set(n)setting.lang=n end end
function goScene(s) return function()SCN.go(s) end end
local function CUSval(k) return function() return customEnv[k] end end
local function CUSrev(k) return function() customEnv[k]=not customEnv[k] end end
local function CUSsto(k) return function(i) customEnv[k]=i end end
local function SETval(k) return function() return setting[k] end end
local function SETrev(k) return function() setting[k]=not setting[k] end end
local function SETsto(k) return function(i) setting[k]=i end end
local function pressKey(k) return function() love.keypressed(k) end end
local function setPen(i) return function() sceneTemp.pen=i end end
local function prevSkin(n) return function() SKIN.prev(n) end end
local function nextSkin(n) return function() SKIN.next(n) end end
local function nextDir(n) return function() SKIN.rotate(n) end end
local function VKAdisp(n) return function() return VK_org[n].ava end end
local function VKAcode(n) return function() VK_org[n].ava=not VK_org[n].ava end end
local function setLang(n) return function() LANG.set(n)setting.lang=n end end
local function goScene(t,s) return function() SCN.go(t,s) end end
local function swapScene(t,s)return function() SCN.swapTo(t,s) end end
--NewXXX
newText=WIDGET.newText
newImage=WIDGET.newImage
newButton=WIDGET.newButton
newKey=WIDGET.newKey
newSwitch=WIDGET.newSwitch
newSlider=WIDGET.newSlider
local newText= WIDGET.newText
local newImage= WIDGET.newImage
local newButton= WIDGET.newButton
local newKey= WIDGET.newKey
local newSwitch= WIDGET.newSwitch
local newSlider= WIDGET.newSlider
local newSelector= WIDGET.newSelector
--All widgets
local Widgets={
@@ -111,12 +130,14 @@ local Widgets={
newKey({name="_8", x=250,y=500,w=90, color="white", font=50,code=pressKey("8")}),
newKey({name="_9", x=350,y=500,w=90, color="white", font=50,code=pressKey("9")}),
newKey({name="_0", x=150,y=600,w=90, color="white", font=50,code=pressKey("0")}),
newKey({name="<", x=250,y=600,w=90, color="lRed", font=50,code=pressKey("backspace")}),
newKey({name="=", x=350,y=600,w=90, color="lYellow",font=50,code=pressKey("return")}),
newKey({name=".", x=250,y=600,w=90, color="lPurple",font=50,code=pressKey(".")}),
newKey({name="e", x=350,y=600,w=90, color="lPurple",font=50,code=pressKey("e")}),
newKey({name="+", x=450,y=300,w=90, color="lBlue", font=50,code=pressKey("+")}),
newKey({name="-", x=450,y=400,w=90, color="lBlue", font=50,code=pressKey("-")}),
newKey({name="*", x=450,y=500,w=90, color="lBlue", font=50,code=pressKey("*")}),
newKey({name="/", x=450,y=600,w=90, color="lBlue", font=50,code=pressKey("/")}),
newKey({name="<", x=550,y=300,w=90, color="lRed", font=50,code=pressKey("backspace")}),
newKey({name="=", x=550,y=400,w=90, color="lYellow",font=50,code=pressKey("return")}),
newButton({name="play", x=640,y=600,w=180,h=90, color="lGreen", font=40,code=pressKey("space"),hide=function()return not sceneTemp.pass end}),
},
main={
@@ -131,12 +152,7 @@ local Widgets={
newButton({name="quit", x=590,y=610,w=160,h=100,color="lGrey", font=45,code=function()VOC.play("bye")SCN.swapTo("quit","slowFade")end}),
},
mode={
newButton({name="setting", x=1100,y=540,w=240,h=90,color="lGreen", font=40,code=function()
SCN.go("custom")
end,
hide=function()
return mapCam.sel~="custom_clear" and mapCam.sel~="custom_puzzle"
end}),
newButton({name="setting", x=1100,y=540,w=240,h=90,color="lGreen", font=40,code=pressKey("e"),hide=function()return mapCam.sel~="custom_clear" and mapCam.sel~="custom_puzzle"end}),
newButton({name="start", x=1040,y=655,w=180,h=80,color="white", font=40,code=pressKey("return"),hide=function()return not mapCam.sel end}),
newButton({name="back", x=1200,y=655,w=120,h=80,color="white", font=40,code=BACK}),
},
@@ -145,25 +161,61 @@ local Widgets={
newButton({name="up", x=200, y=250, w=120, color="white", font=55,code=pressKey("up"),hide=function()return sceneTemp==1 end}),
newButton({name="play", x=200, y=390, w=120, color="white", font=35,code=pressKey("space"),hide=function()return setting.bgm==0 end}),
newButton({name="down", x=200, y=530, w=120, color="white", font=55,code=pressKey("down"),hide=function()return sceneTemp==BGM.len end}),
newButton({name="back", x=1140, y=640, w=180,h=80, color="white", font=35,code=BACK}),
newButton({name="back", x=1140, y=640, w=170,h=80, color="white", font=40,code=BACK}),
},
custom={
newKey({name="up", x=1140, y=100, w=100, color="white", font=45,code=function()sceneTemp=(sceneTemp-2)%#customID+1 end}),
newKey({name="down", x=1140, y=340, w=100, color="white", font=45,code=function()sceneTemp=sceneTemp%#customID+1 end}),
newKey({name="left", x=1080, y=220, w=100, color="white", font=45,code=pressKey("left")}),
newKey({name="right", x=1200, y=220, w=100, color="white", font=45,code=pressKey("right")}),
custom_basic={
--Basic
newSelector({name="drop", x=250, y=150,w=260,color="orange", list=CUSlist.drop, disp=CUSval("drop"), code=CUSsto("drop")}),
newSelector({name="lock", x=250, y=230,w=260,color="red", list=CUSlist.lock, disp=CUSval("lock"), code=CUSsto("lock")}),
newSelector({name="wait", x=250, y=310,w=260,color="green", list=CUSlist.wait, disp=CUSval("wait"), code=CUSsto("wait")}),
newSelector({name="fall", x=250, y=390,w=260,color="yellow", list=CUSlist.fall, disp=CUSval("fall"), code=CUSsto("fall")}),
newButton({name="set1", x=900, y=320, w=210,h=70, color="lYellow",font=32,code=pressKey("1")}),
newButton({name="set2", x=900, y=400, w=210,h=70, color="lYellow",font=32,code=pressKey("2")}),
newButton({name="set3", x=900, y=480, w=210,h=70, color="lYellow",font=32,code=pressKey("3")}),
newButton({name="set4", x=900, y=560, w=210,h=70, color="lYellow",font=32,code=pressKey("4")}),
newButton({name="set5", x=900, y=640, w=210,h=70, color="lYellow",font=32,code=pressKey("5")}),
newSlider({name="next", x=170, y=470,w=200,unit=6, font=30, disp=CUSval("next"), code=CUSsto("next")}),
newSwitch({name="hold", x=300, y=540, font=30, disp=CUSval("hold"), code=CUSrev("hold")}),
newSwitch({name="oncehold", x=300, y=620, font=30, disp=CUSval("oncehold"),code=CUSrev("oncehold"),hide=function()return not customEnv.hold end}),
newButton({name="seq", x=665, y=415, w=200,h=40, color="lGreen", font=30,code=pressKey("q")}),
newButton({name="draw", x=150, y=80, w=220,h=80, color="white", font=35,code=pressKey("e")}),
newButton({name="back", x=1140, y=640, w=180,h=80, color="white", font=35,code=BACK}),
--Visual
newSwitch({name="block", x=700, y=160, font=25, disp=CUSval("block"), code=CUSrev("block")}),
newSlider({name="ghost", x=570, y=230,w=200,unit=.6, font=25, disp=CUSval("ghost"), code=CUSsto("ghost")}),
newSlider({name="center", x=570, y=290,w=200,unit=1, font=25, disp=CUSval("center"), code=CUSsto("center")}),
newSwitch({name="bagLine", x=1190, y=160, font=30, disp=CUSval("bagLine"), code=CUSrev("bagLine")}),
newSwitch({name="highCam", x=1190, y=230, font=30, disp=CUSval("highCam"), code=CUSrev("highCam")}),
newSwitch({name="nextPos", x=1190, y=300, font=30, disp=CUSval("nextPos"), code=CUSrev("nextPos")}),
newSwitch({name="bone", x=1190, y=370, font=30, disp=CUSval("bone"), code=CUSrev("bone")}),
--Else
newSelector({name="bg", x=1140, y=460, w=220,color="yellow", list=CUSlist.bg, disp=CUSval("bg"), code=function(i)customEnv.bg=i BG.set(i)end}),
newSelector({name="bgm", x=1140, y=540, w=220,color="yellow", list=CUSlist.bgm, disp=CUSval("bgm"), code=function(i)customEnv.bgm=i BGM.play(i)end}),
--Copy/Paste Quest
newButton({name="copy", x=560, y=640, w=300,h=100, color="lRed", font=25,code=pressKey("cC")}),
newButton({name="paste", x=870, y=640, w=300,h=100, color="lBlue", font=25,code=pressKey("cV")}),
newButton({name="mission", x=900, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_mission","swipeR")}),
newButton({name="rule", x=1140, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_rule","swipeL")}),
newButton({name="back", x=1140, y=640, w=170,h=80, color="white", font=40,code=BACK}),
},
sequence={
custom_rule={
--Rule
newSlider({name="mindas", x=180, y=150,w=400,unit=15,font=25, disp=CUSval("mindas"), code=CUSsto("mindas")}),
newSlider({name="minarr", x=180, y=220,w=400,unit=10,font=25, disp=CUSval("minarr"), code=CUSsto("minarr")}),
newSlider({name="minsdarr", x=180, y=290,w=200,unit=4, font=22, disp=CUSval("minsdarr"),code=CUSsto("minsdarr")}),
newSwitch({name="ospin", x=260, y=380, font=30, disp=CUSval("ospin"), code=CUSrev("ospin")}),
newSwitch({name="noTele", x=260, y=460, font=25, disp=CUSval("noTele"), code=CUSrev("noTele")}),
newSwitch({name="fineKill", x=260, y=530, font=22, disp=CUSval("fineKill"),code=CUSrev("fineKill")}),
newSwitch({name="easyFresh", x=260, y=600, font=18, disp=CUSval("easyFresh"),code=CUSrev("easyFresh")}),
newSelector({name="visible", x=800, y=160,w=260,color="lBlue", list=CUSlist.visible, disp=CUSval("visible"), code=CUSsto("visible")}),
newSelector({name="target", x=800, y=260,w=260,color="green", list=CUSlist.target, disp=CUSval("target"), code=CUSsto("target")}),
newSelector({name="freshLimit", x=800, y=360,w=260,color="purple", list=CUSlist.freshLimit,disp=CUSval("freshLimit"),code=CUSsto("freshLimit")}),
newSelector({name="opponent", x=1100, y=160,w=260,color="red", list=CUSlist.opponent, disp=CUSval("opponent"),code=CUSsto("opponent")}),
newSelector({name="life", x=1100, y=260,w=260,color="red", list=CUSlist.life, disp=CUSval("life"), code=CUSsto("life")}),
newSelector({name="pushSpeed", x=1100, y=360,w=260,color="red", list=CUSlist.pushSpeed, disp=CUSval("pushSpeed"),code=CUSsto("pushSpeed")}),
newButton({name="basic", x=900, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_basic","swipeR")}),
newButton({name="sequence", x=1140, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_seq","swipeL")}),
newButton({name="back", x=1140, y=640, w=170,h=80, color="white", font=40,code=BACK}),
},
custom_seq={
newKey({name="Z", x=100, y=440, w=90, color="white", font=50,code=pressKey(1)}),
newKey({name="S", x=200, y=440, w=90, color="white", font=50,code=pressKey(2)}),
newKey({name="J", x=300, y=440, w=90, color="white", font=50,code=pressKey(3)}),
@@ -193,123 +245,188 @@ local Widgets={
newKey({name="left", x=800, y=440, w=90, color="lGreen", font=55,code=pressKey("left")}),
newKey({name="right", x=900, y=440, w=90, color="lGreen", font=55,code=pressKey("right")}),
newKey({name="backsp", x=1000, y=440, w=90, color="lYellow",font=50,code=pressKey("backspace")}),
newKey({name="reset", x=1000, y=540, w=90, color="lYellow",font=50,code=pressKey("delete")}),
newButton({name="copy", x=1140, y=440, w=170,h=90, color="lRed", font=40,code=pressKey("cC"),hide=function()return #preBag==0 end}),
newButton({name="paste", x=1140, y=540, w=170,h=90, color="lBlue", font=40,code=pressKey("cV")}),
newButton({name="back", x=1140, y=640, w=180,h=80, color="white", font=35,code=BACK}),
newKey({name="ten", x=1000, y=440, w=90, color="lGreen", font=40,code=pressKey("ten")}),
newKey({name="backsp", x=1000, y=540, w=90, color="lYellow",font=50,code=pressKey("backspace")}),
newKey({name="reset", x=1000, y=640, w=90, color="lYellow",font=50,code=pressKey("delete")}),
newButton({name="copy", x=1140, y=440, w=170,h=80, color="lRed", font=40,code=pressKey("cC"),hide=function()return #preBag==0 end}),
newButton({name="paste", x=1140, y=540, w=170,h=80, color="lBlue", font=40,code=pressKey("cV")}),
newSelector({name="sequence",x=670, y=60, w=200,color="yellow",list=CUSlist.sequence,disp=CUSval("sequence"),code=CUSsto("sequence")}),
newButton({name="rule", x=900, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_rule","swipeR")}),
newButton({name="draw", x=1140, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_draw","swipeL")}),
newButton({name="back", x=1140, y=640, w=170,h=80, color="white", font=40,code=BACK}),
},
draw={
newButton({name="b1", x=500+65*1, y=150, w=58, color="red", font=30,code=setPen(1)}),--B1
newButton({name="b2", x=500+65*2, y=150, w=58, color="orange", font=30,code=setPen(2)}),--B2
newButton({name="b3", x=500+65*3, y=150, w=58, color="yellow", font=30,code=setPen(3)}),--B3
newButton({name="b4", x=500+65*4, y=150, w=58, color="grass", font=30,code=setPen(4)}),--B4
newButton({name="b5", x=500+65*5, y=150, w=58, color="green", font=30,code=setPen(5)}),--B5
newButton({name="b6", x=500+65*6, y=150, w=58, color="water", font=30,code=setPen(6)}),--B6
newButton({name="b7", x=500+65*7, y=150, w=58, color="cyan", font=30,code=setPen(7)}),--B7
newButton({name="b8", x=500+65*8, y=150, w=58, color="blue", font=30,code=setPen(8)}),--B8
newButton({name="b9", x=500+65*9, y=150, w=58, color="purple", font=30,code=setPen(9)}),--B9
newButton({name="b10", x=500+65*10,y=150, w=58, color="magenta",font=30,code=setPen(10)}),--B10
newButton({name="b11", x=500+65*11,y=150, w=58, color="pink", font=30,code=setPen(11)}),--B11
custom_draw={
newButton({name="b1", x=500+65*1, y=200, w=58, color="red", font=30,code=setPen(1)}),--B1
newButton({name="b2", x=500+65*2, y=200, w=58, color="orange", font=30,code=setPen(2)}),--B2
newButton({name="b3", x=500+65*3, y=200, w=58, color="yellow", font=30,code=setPen(3)}),--B3
newButton({name="b4", x=500+65*4, y=200, w=58, color="grass", font=30,code=setPen(4)}),--B4
newButton({name="b5", x=500+65*5, y=200, w=58, color="green", font=30,code=setPen(5)}),--B5
newButton({name="b6", x=500+65*6, y=200, w=58, color="water", font=30,code=setPen(6)}),--B6
newButton({name="b7", x=500+65*7, y=200, w=58, color="cyan", font=30,code=setPen(7)}),--B7
newButton({name="b8", x=500+65*8, y=200, w=58, color="blue", font=30,code=setPen(8)}),--B8
newButton({name="b9", x=500+65*9, y=200, w=58, color="purple", font=30,code=setPen(9)}),--B9
newButton({name="b10", x=500+65*10,y=200, w=58, color="magenta",font=30,code=setPen(10)}),--B10
newButton({name="b11", x=500+65*11,y=200, w=58, color="pink", font=30,code=setPen(11)}),--B11
newButton({name="b12", x=500+65*1, y=230, w=58, color="dGrey", font=30,code=setPen(12)}),--Bone
newButton({name="b13", x=500+65*2, y=230, w=58, color="grey", font=30,code=setPen(13)}),--GB1
newButton({name="b14", x=500+65*3, y=230, w=58, color="lGrey", font=30,code=setPen(14)}),--GB2
newButton({name="b15", x=500+65*4, y=230, w=58, color="dPurple",font=30,code=setPen(15)}),--GB3
newButton({name="b16", x=500+65*5, y=230, w=58, color="dRed", font=30,code=setPen(16)}),--GB4
newButton({name="b17", x=500+65*6, y=230, w=58, color="dGreen", font=30,code=setPen(17)}),--GB5
newButton({name="b12", x=500+65*1, y=270, w=58, color="dGrey", font=30,code=setPen(12)}),--Bone
newButton({name="b13", x=500+65*2, y=270, w=58, color="grey", font=30,code=setPen(13)}),--GB1
newButton({name="b14", x=500+65*3, y=270, w=58, color="lGrey", font=30,code=setPen(14)}),--GB2
newButton({name="b15", x=500+65*4, y=270, w=58, color="dPurple",font=30,code=setPen(15)}),--GB3
newButton({name="b16", x=500+65*5, y=270, w=58, color="dRed", font=30,code=setPen(16)}),--GB4
newButton({name="b17", x=500+65*6, y=270, w=58, color="dGreen", font=30,code=setPen(17)}),--GB5
newButton({name="any", x=600, y=360, w=120, color="lGrey", font=40,code=setPen(0)}),
newButton({name="space", x=730, y=360, w=120, color="grey", font=65,code=setPen(-1)}),
newButton({name="copy", x=920, y=360, w=120, color="lRed", font=35,code=pressKey("cC")}),
newButton({name="paste", x=1060, y=360, w=120, color="lBlue", font=35,code=pressKey("cV")}),
newButton({name="clear", x=1200, y=360, w=120, color="white", font=40,code=pressKey("delete")}),
newButton({name="pushLine", x=1060, y=500, w=120, color="lYellow",font=20,code=pressKey("k")}),
newButton({name="delLine", x=1200, y=500, w=120, color="lYellow",font=20,code=pressKey("l")}),
newButton({name="any", x=600, y=380, w=120, color="lGrey", font=40,code=setPen(0)}),
newButton({name="space", x=730, y=380, w=120, color="grey", font=65,code=setPen(-1)}),
newButton({name="copy", x=920, y=380, w=120, color="lRed", font=35,code=pressKey("cC")}),
newButton({name="paste", x=1060, y=380, w=120, color="lBlue", font=35,code=pressKey("cV")}),
newButton({name="clear", x=1200, y=380, w=120, color="white", font=40,code=pressKey("delete")}),
newButton({name="pushLine", x=1060, y=520, w=120, color="lYellow",font=20,code=pressKey("k")}),
newButton({name="delLine", x=1200, y=520, w=120, color="lYellow",font=20,code=pressKey("l")}),
newSwitch({name="demo", x=755, y=640, font=30,disp=function()return sceneTemp.demo end,code=function()sceneTemp.demo=not sceneTemp.demo end}),
newButton({name="custom", x=110, y=80, w=140,h=80, color="white", font=35,code=pressKey("e")}),
newButton({name="back", x=1140, y=640, w=180,h=80, color="white", font=35,code=BACK}),
newButton({name="sequence", x=900, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_seq","swipeR")}),
newButton({name="mission", x=1140, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_mission","swipeL")}),
newButton({name="back", x=1140, y=640, w=170,h=80, color="white", font=40,code=BACK}),
},
custom_mission={
newKey({name="_1", x=800, y=540, w=90, color="white", font=50,code=pressKey(01)}),
newKey({name="_2", x=900, y=540, w=90, color="white", font=50,code=pressKey(02)}),
newKey({name="_3", x=800, y=640, w=90, color="white", font=50,code=pressKey(03)}),
newKey({name="_4", x=900, y=640, w=90, color="white", font=50,code=pressKey(04)}),
newKey({name="any1", x=100, y=640, w=90, color="white", font=30,code=pressKey(05)}),
newKey({name="any2", x=200, y=640, w=90, color="white", font=30,code=pressKey(06)}),
newKey({name="any3", x=300, y=640, w=90, color="white", font=30,code=pressKey(07)}),
newKey({name="any4", x=400, y=640, w=90, color="white", font=30,code=pressKey(08)}),
newKey({name="PC", x=500, y=640, w=90, color="white", font=50,code=pressKey(09)}),
newKey({name="Z1", x=100, y=340, w=90, color="white", font=50,code=pressKey(11)}),
newKey({name="S1", x=200, y=340, w=90, color="white", font=50,code=pressKey(21)}),
newKey({name="J1", x=300, y=340, w=90, color="white", font=50,code=pressKey(31)}),
newKey({name="L1", x=400, y=340, w=90, color="white", font=50,code=pressKey(41)}),
newKey({name="T1", x=500, y=340, w=90, color="white", font=50,code=pressKey(51)}),
newKey({name="O1", x=600, y=340, w=90, color="white", font=50,code=pressKey(61)}),
newKey({name="I1", x=700, y=340, w=90, color="white", font=50,code=pressKey(71)}),
newKey({name="Z2", x=100, y=440, w=90, color="white", font=50,code=pressKey(12)}),
newKey({name="S2", x=200, y=440, w=90, color="white", font=50,code=pressKey(22)}),
newKey({name="J2", x=300, y=440, w=90, color="white", font=50,code=pressKey(32)}),
newKey({name="L2", x=400, y=440, w=90, color="white", font=50,code=pressKey(42)}),
newKey({name="T2", x=500, y=440, w=90, color="white", font=50,code=pressKey(52)}),
newKey({name="O2", x=600, y=440, w=90, color="white", font=50,code=pressKey(62)}),
newKey({name="I2", x=700, y=440, w=90, color="white", font=50,code=pressKey(72)}),
newKey({name="Z3", x=100, y=540, w=90, color="white", font=50,code=pressKey(13)}),
newKey({name="S3", x=200, y=540, w=90, color="white", font=50,code=pressKey(23)}),
newKey({name="J3", x=300, y=540, w=90, color="white", font=50,code=pressKey(33)}),
newKey({name="L3", x=400, y=540, w=90, color="white", font=50,code=pressKey(43)}),
newKey({name="T3", x=500, y=540, w=90, color="white", font=50,code=pressKey(53)}),
newKey({name="O3", x=600, y=540, w=90, color="white", font=50,code=pressKey(63)}),
newKey({name="I3", x=700, y=540, w=90, color="white", font=50,code=pressKey(73)}),
newKey({name="O4", x=600, y=640, w=90, color="white", font=50,code=pressKey(64)}),
newKey({name="I4", x=700, y=640, w=90, color="white", font=50,code=pressKey(74)}),
newKey({name="left", x=800, y=440, w=90, color="lGreen", font=55,code=pressKey("left")}),
newKey({name="right", x=900, y=440, w=90, color="lGreen", font=55,code=pressKey("right")}),
newKey({name="ten", x=1000, y=440, w=90, color="lGreen", font=40,code=pressKey("ten")}),
newKey({name="backsp", x=1000, y=540, w=90, color="lYellow",font=50,code=pressKey("backspace")}),
newKey({name="reset", x=1000, y=640, w=90, color="lYellow",font=50,code=pressKey("delete")}),
newButton({name="copy", x=1140, y=440, w=170,h=80, color="lRed", font=40,code=pressKey("cC"),hide=function()return #preMission==0 end}),
newButton({name="paste", x=1140, y=540, w=170,h=80, color="lBlue", font=40,code=pressKey("cV")}),
newSwitch({name="mission", x=1150, y=350, font=30, disp=CUSval("missionKill"), code=CUSrev("missionKill")}),
newButton({name="draw", x=900, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_draw","swipeR")}),
newButton({name="basic", x=1140, y=60, w=220,h=80, color="lBlue", font=25,code=swapScene("custom_basic","swipeL")}),
newButton({name="back", x=1140, y=640, w=170,h=80, color="white", font=40,code=BACK}),
},
play={
newButton({name="pause", x=1235, y=45, w=80, color="white", font=25,code=function()pauseGame()end}),
},
pause={
newButton({name="setting", x=1120, y=70, w=240,h=90, color="lBlue", font=35,code=pressKey("s")}),
newButton({name="replay", x=640, y=250, w=240,h=100,color="lYellow",font=30,code=pressKey("p"),hide=function()return not(game.result or game.replaying)end}),
newButton({name="replay", x=640, y=250, w=240,h=100,color="lYellow",font=30,code=pressKey("p"),hide=function()return not(game.result or game.replaying)or #players>1 end}),
newButton({name="resume", x=640, y=367, w=240,h=100,color="lGreen", font=30,code=pressKey("escape")}),
newButton({name="restart", x=640, y=483, w=240,h=100,color="lRed", font=33,code=pressKey("r")}),
newButton({name="quit", x=640, y=600, w=240,h=100,color="white", font=35,code=BACK}),
},
setting_game={
newButton({name="graphic", x=200, y=80, w=240,h=80, color="lCyan", font=35,code=function()SCN.swapTo("setting_video","swipeR")end}),
newButton({name="sound", x=1080, y=80, w=240,h=80, color="lCyan", font=35,code=function()SCN.swapTo("setting_sound","swipeL")end}),
newButton({name="graphic", x=200, y=80, w=240,h=80, color="lCyan", font=35,code=swapScene("setting_video","swipeR")}),
newButton({name="sound", x=1080, y=80, w=240,h=80, color="lCyan", font=35,code=swapScene("setting_sound","swipeL")}),
newButton({name="ctrl", x=290, y=220, w=320,h=80, color="lYellow",font=35,code=goScene("setting_control")}),
newButton({name="key", x=640, y=220, w=320,h=80, color="lGreen", font=35,code=goScene("setting_key")}),
newButton({name="touch", x=990, y=220, w=320,h=80, color="lBlue", font=35,code=goScene("setting_touch")}),
newSlider({name="reTime", x=350, y=340, w=300,unit=10, font=30,disp=SETval("reTime"), code=SETsto("reTime"),show=function(S)return(.5+S.disp()*.25).."s"end}),
newSlider({name="maxNext", x=350, y=440, w=300,unit=6, font=30,disp=SETval("maxNext"), code=SETsto("maxNext")}),
newButton({name="layout", x=460, y=540, w=140,h=70,color="white", font=35,code=function()
SCN.go("setting_skin")
end}),
newButton({name="layout", x=460, y=540, w=140,h=70,color="white", font=35,code=goScene("setting_skin")}),
newSwitch({name="autoPause",x=1080, y=320, font=20,disp=SETval("autoPause"), code=SETrev("autoPause")}),
newSwitch({name="swap", x=1080, y=380, font=20,disp=SETval("swap"), code=SETrev("swap")}),
newSwitch({name="fine", x=1080, y=440, font=20,disp=SETval("fine"), code=SETrev("fine")}),
newSwitch({name="appLock", x=1080, y=500, font=20,disp=SETval("appLock"), code=SETrev("appLock")}),
newButton({name="back", x=1140, y=640, w=180,h=80,color="white", font=35,code=BACK}),
newButton({name="calc", x=970, y=550, w=150,h=60,color="dGrey", font=25,code=goScene("calculator"),hide=function()return not setting.appLock end}),
newButton({name="back", x=1140, y=640, w=170,h=80,color="white", font=40,code=BACK}),
},
setting_video={
newButton({name="sound", x=200, y=80,w=240,h=80,color="lCyan",font=35,code=function()SCN.swapTo("setting_sound","swipeR")end}),
newButton({name="game", x=1080, y=80,w=240,h=80,color="lCyan",font=35,code=function()SCN.swapTo("setting_game","swipeL")end}),
newSlider({name="ghost", x=250, y=180,w=200,unit=.6,font=35,disp=SETval("ghost"),show="percent",code=SETsto("ghost")}),
newSlider({name="center", x=620, y=180,w=200,unit=1, font=35,disp=SETval("center"), code=SETsto("center")}),
newSwitch({name="smooth", x=260, y=260, font=25,disp=SETval("smooth"), code=SETrev("smooth")}),
newSwitch({name="grid", x=480, y=260, font=35,disp=SETval("grid"), code=SETrev("grid")}),
newSwitch({name="bagLine", x=700, y=260, font=30,disp=SETval("bagLine"), code=SETrev("bagLine")}),
newSlider({name="lockFX", x=350, y=340,w=373,unit=5, font=32,disp=SETval("lockFX"), code=SETsto("lockFX")}),
newSlider({name="dropFX", x=350, y=390,w=373,unit=5, font=32,disp=SETval("dropFX"), code=SETsto("dropFX")}),
newSlider({name="moveFX", x=350, y=440,w=373,unit=5, font=32,disp=SETval("moveFX"), code=SETsto("moveFX")}),
newSlider({name="clearFX", x=350, y=490,w=373,unit=5, font=32,disp=SETval("clearFX"), code=SETsto("clearFX")}),
newSlider({name="shakeFX", x=350, y=540,w=373,unit=5, font=32,disp=SETval("shakeFX"), code=SETsto("shakeFX")}),
newSlider({name="atkFX", x=350, y=590,w=373,unit=5, font=32,disp=SETval("atkFX"), code=SETsto("atkFX")}),
newSlider({name="frame", x=350, y=640,w=373,unit=10,font=30,
newButton({name="sound", x=200, y=80,w=240,h=80,color="lCyan",font=35,code=swapScene("setting_sound","swipeR")}),
newButton({name="game", x=1080, y=80,w=240,h=80,color="lCyan",font=35,code=swapScene("setting_game","swipeL")}),
newSwitch({name="block", x=360, y=180, font=30,disp=SETval("block"), code=SETrev("block")}),
newSlider({name="ghost", x=260, y=250,w=200,unit=.6,font=30,disp=SETval("ghost"),show="percent",code=SETsto("ghost")}),
newSlider({name="center", x=260, y=300,w=200,unit=1, font=30,disp=SETval("center"), code=SETsto("center")}),
newSwitch({name="smooth", x=700, y=180, font=30,disp=SETval("smooth"), code=SETrev("smooth")}),
newSwitch({name="grid", x=700, y=240, font=30,disp=SETval("grid"), code=SETrev("grid")}),
newSwitch({name="bagLine", x=700, y=300, font=30,disp=SETval("bagLine"), code=SETrev("bagLine")}),
newSlider({name="lockFX", x=350, y=350,w=373,unit=5, font=32,disp=SETval("lockFX"), code=SETsto("lockFX")}),
newSlider({name="dropFX", x=350, y=400,w=373,unit=5, font=32,disp=SETval("dropFX"), code=SETsto("dropFX")}),
newSlider({name="moveFX", x=350, y=450,w=373,unit=5, font=32,disp=SETval("moveFX"), code=SETsto("moveFX")}),
newSlider({name="clearFX", x=350, y=500,w=373,unit=5, font=32,disp=SETval("clearFX"), code=SETsto("clearFX")}),
newSlider({name="shakeFX", x=350, y=550,w=373,unit=5, font=32,disp=SETval("shakeFX"), code=SETsto("shakeFX")}),
newSlider({name="atkFX", x=350, y=600,w=373,unit=5, font=32,disp=SETval("atkFX"), code=SETsto("atkFX")}),
newSlider({name="frame", x=350, y=650,w=373,unit=10,font=30,
disp=function()
return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4
end,
code=function(i)
setting.frameMul=i<5 and 5*i+20 or 10*i
end}),
newSwitch({name="text", x=1050, y=180,font=35,disp=SETval("text"),code=SETrev("text")}),
newSwitch({name="warn", x=1050, y=240,font=35,disp=SETval("warn"),code=SETrev("warn")}),
newSwitch({name="highCam", x=1050, y=300,font=35,disp=SETval("highCam"),code=SETrev("highCam")}),
newSwitch({name="nextPos", x=1050, y=360,font=35,disp=SETval("nextPos"),code=SETrev("nextPos")}),
newSwitch({name="fullscreen",x=1050,y=420,font=35,disp=SETval("fullscreen"),
newSwitch({name="text", x=1100, y=180,font=35,disp=SETval("text"),code=SETrev("text")}),
newSwitch({name="score", x=1100, y=240,font=35,disp=SETval("score"),code=SETrev("score")}),
newSwitch({name="warn", x=1100, y=300,font=35,disp=SETval("warn"),code=SETrev("warn")}),
newSwitch({name="highCam", x=1100, y=360,font=35,disp=SETval("highCam"),code=SETrev("highCam")}),
newSwitch({name="nextPos", x=1100, y=420,font=35,disp=SETval("nextPos"),code=SETrev("nextPos")}),
newSwitch({name="fullscreen",x=1100,y=480,font=30,disp=SETval("fullscreen"),
code=function()
setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen)
love.resize(love.graphics.getWidth(),love.graphics.getHeight())
end}),
newSwitch({name="bg", x=1050, y=480,font=35,disp=SETval("bg"),
newSwitch({name="bg", x=1100, y=540,font=35,disp=SETval("bg"),
code=function()
BG.set("none")
setting.bg=not setting.bg
BG.set("space")
end}),
newSwitch({name="power", x=1050, y=540,font=35,disp=SETval("powerInfo"),
newSwitch({name="power", x=990, y=640,font=35,disp=SETval("powerInfo"),
code=function()
setting.powerInfo=not setting.powerInfo
end}),
newButton({name="back", x=1140, y=640,w=180,h=80,color="white", font=35,code=BACK}),
newButton({name="back", x=1140, y=640,w=170,h=80,color="white", font=40,code=BACK}),
},
setting_sound={
newButton({name="game", x=200, y=80,w=240,h=80,color="lCyan", font=35,code=function()SCN.swapTo("setting_game","swipeR")end}),
newButton({name="graphic", x=1080, y=80,w=240,h=80,color="lCyan", font=35,code=function()SCN.swapTo("setting_video","swipeL")end}),
newButton({name="game", x=200, y=80,w=240,h=80,color="lCyan", font=35,code=swapScene("setting_game","swipeR")}),
newButton({name="graphic", x=1080, y=80,w=240,h=80,color="lCyan", font=35,code=swapScene("setting_video","swipeL")}),
newSlider({name="sfx", x=180, y=200,w=400, font=35,change=function()SFX.play("blip_1")end, disp=SETval("sfx"), code=SETsto("sfx")}),
newSlider({name="stereo", x=180, y=500,w=400, font=35,change=function()SFX.play("move",1,-1)SFX.play("lock",1,1)end,disp=SETval("stereo"),code=SETsto("stereo"),hide=function()return setting.sfx==0 end}),
newSlider({name="spawn", x=180, y=300,w=400, font=30,change=function()SFX.fplay("spawn_"..rnd(7),setting.spawn)end,disp=SETval("spawn"), code=SETsto("spawn")}),
newSlider({name="bgm", x=180, y=400,w=400, font=35,change=function()BGM.freshVolume()end, disp=SETval("bgm"), code=SETsto("bgm")}),
newSlider({name="vib", x=750, y=200,w=400, unit=5, font=28,change=function()VIB(2)end, disp=SETval("vib"), code=SETsto("vib")}),
newSlider({name="voc", x=750, y=300,w=400, font=32,change=function()VOC.play("nya")end, disp=SETval("voc"), code=SETsto("voc")}),
newButton({name="back", x=1140, y=640,w=180,h=80,color="white", font=35,code=BACK}),
newButton({name="back", x=1140, y=640,w=170,h=80,color="white", font=40,code=BACK}),
},
setting_control={
newSlider({name="das", x=250, y=200,w=910, unit=26, font=30,disp=SETval("das"), show="frame_time",code=SETsto("das")}),
@@ -326,10 +443,10 @@ local Widgets={
_.sddas,_.sdarr=0,2
_.ihs,_.irs,_.ims=false,false,false
end}),
newButton({name="back", x=1140, y=640,w=180,h=80,color="white",font=35,code=BACK}),
newButton({name="back", x=1140, y=640,w=170,h=80,color="white",font=40,code=BACK}),
},
setting_key={
newButton({name="back", x=1140,y=640,w=180,h=80,color="white",font=35,code=BACK}),
newButton({name="back", x=1140,y=640,w=170,h=80,color="white",font=40,code=BACK}),
},
setting_skin={
newButton({name="prev", x=700,y=100,w=140,h=100,color="white",font=50,code=function()SKIN.prevSet()end}),
@@ -370,7 +487,7 @@ local Widgets={
end
SFX.play("hold")
end}),
newButton({name="back", x=1140,y=640,w=180,h=80,color="white",font=35,code=BACK}),
newButton({name="back", x=1140,y=640,w=170,h=80,color="white",font=40,code=BACK}),
},
setting_touch={
newButton({name="default", x=520,y=80,w=200,h=80,color="white",font=35,
@@ -401,13 +518,13 @@ local Widgets={
SCN.go("setting_touchSwitch")
end}),
newButton({name="back", x=760,y=180,w=200,h=80,color="white",font=35,code=BACK}),
newSlider({name="size", x=450,y=265,w=460,unit=14,font=40,show="vkSize",
newSlider({name="size", x=450,y=265,w=460,unit=19,font=40,show="vkSize",
disp=function()
return VK_org[sceneTemp.sel].r/10-1
end,
code=function(v)
if sceneTemp.sel then
VK_org[sceneTemp.sel].r=10+v*10
VK_org[sceneTemp.sel].r=(v+1)*10
end
end,
hide=function()
@@ -450,13 +567,13 @@ local Widgets={
return not setting.VKTrack
end}),
newSlider({name="alpha", x=840, y=540, w=400,font=40,disp=SETval("VKAlpha"),code=SETsto("VKAlpha")}),
newButton({name="back", x=1140, y=640, w=180,h=80,color="white",font=35,code=BACK}),
newButton({name="back", x=1140, y=640, w=170,h=80,color="white",font=40,code=BACK}),
},
setting_trackSetting={
newSwitch({name="VKDodge", x=400, y=200, font=35, disp=SETval("VKDodge"),code=SETrev("VKDodge")}),
newSlider({name="VKTchW", x=140, y=310, w=1000, unit=10,font=35,disp=SETval("VKTchW"),code=function(i)setting.VKTchW=i setting.VKCurW=math.max(setting.VKCurW,i)end}),
newSlider({name="VKCurW", x=140, y=370, w=1000, unit=10,font=35,disp=SETval("VKCurW"),code=function(i)setting.VKCurW=i setting.VKTchW=math.min(setting.VKTchW,i)end}),
newButton({name="back", x=1140, y=640, w=180,h=80,color="white",font=35,code=BACK}),
newButton({name="back", x=1140, y=640, w=170,h=80,color="white",font=40,code=BACK}),
},
setting_lang={
newButton({name="chi", x=160, y=100,w=200,h=120,color="white",font=45,code=setLang(1)}),
@@ -469,23 +586,24 @@ local Widgets={
minigame={
newButton({name="p15", x=640, y=100,w=350,h=120,color="white",font=40,code=goScene("p15")}),
newButton({name="schulte_G",x=640, y=250,w=350,h=120,color="white",font=40,code=goScene("schulte_G")}),
newButton({name="back", x=1140, y=640,w=180,h=80,color="white", font=35,code=BACK}),
newButton({name="back", x=1140, y=640,w=170,h=80,color="white", font=40,code=BACK}),
},
p15={
newButton({name="reset", x=160,y=100,w=180,h=100,color="lGreen", font=40,code=pressKey("space")}),
newSlider({name="color", x=110,y=250,w=170,unit=4,show=false, font=30,disp=function()return sceneTemp.color end,code=function(v)if sceneTemp.state~=1 then sceneTemp.color=v end end,hide=function()return sceneTemp.state==1 end}),
newSwitch({name="blind", x=240,y=330,w=60, font=40,disp=function()return sceneTemp.blind end,code=pressKey("b"),hide=function()return sceneTemp.state==1 end}),
newSwitch({name="slide", x=240,y=420,w=60, font=40,disp=function()return sceneTemp.slide end,code=pressKey("s"),hide=function()return sceneTemp.state==1 end}),
newSwitch({name="pathVis", x=240,y=510,w=60, font=40,disp=function()return sceneTemp.pathVis end,code=pressKey("p"),hide=function()return sceneTemp.state==1 or not sceneTemp.slide end}),
newSwitch({name="revKB", x=240,y=600,w=60, font=40,disp=function()return sceneTemp.revKB end,code=pressKey("r"),hide=function()return sceneTemp.state==1 end}),
newButton({name="back", x=1140,y=640,w=180,h=80,color="white", font=35,code=BACK}),
newSwitch({name="blind", x=240,y=330,w=60, font=40,disp=function()return sceneTemp.blind end,code=pressKey("w"), hide=function()return sceneTemp.state==1 end}),
newSwitch({name="slide", x=240,y=420,w=60, font=40,disp=function()return sceneTemp.slide end,code=pressKey("e"), hide=function()return sceneTemp.state==1 end}),
newSwitch({name="pathVis", x=240,y=510,w=60, font=40,disp=function()return sceneTemp.pathVis end,code=pressKey("r"), hide=function()return sceneTemp.state==1 or not sceneTemp.slide end}),
newSwitch({name="revKB", x=240,y=600,w=60, font=40,disp=function()return sceneTemp.revKB end,code=pressKey("t"), hide=function()return sceneTemp.state==1 end}),
newButton({name="back", x=1140,y=640,w=170,h=80,color="white", font=40,code=BACK}),
},
schulte_G={
newButton({name="reset", x=160,y=100,w=180,h=100,color="lGreen", font=40,code=pressKey("r"),hide=function()return sceneTemp.state==0 end}),
newSlider({name="rank", x=130,y=250,w=150,unit=3,show=false, font=40,disp=function()return sceneTemp.rank-3 end,code=function(v)sceneTemp.rank=v+3 end,hide=function()return sceneTemp.state>0 end}),
newSwitch({name="blind", x=200,y=330,w=60, font=40,disp=function()return sceneTemp.blind end,code=pressKey("b"),hide=function()return sceneTemp.state==1 end}),
newSwitch({name="disappear",x=200,y=410,w=60, font=40,disp=function()return sceneTemp.disappear end,code=pressKey("d"),hide=function()return sceneTemp.state==1 end}),
newButton({name="back", x=1140,y=640,w=180,h=80,color="white", font=35,code=BACK}),
newSlider({name="rank", x=130,y=250,w=150,unit=3,show=false, font=40,disp=function()return sceneTemp.rank-3 end, code=function(v)sceneTemp.rank=v+3 end,hide=function()return sceneTemp.state>0 end}),
newSwitch({name="blind", x=240,y=330,w=60, font=40,disp=function()return sceneTemp.blind end, code=pressKey("q"),hide=function()return sceneTemp.state==1 end}),
newSwitch({name="disappear",x=240,y=420,w=60, font=40,disp=function()return sceneTemp.disappear end, code=pressKey("w"),hide=function()return sceneTemp.state==1 end}),
newSwitch({name="tapFX", x=240,y=510,w=60, font=40,disp=function()return sceneTemp.tapFX end, code=pressKey("e"),hide=function()return sceneTemp.state==1 end}),
newButton({name="back", x=1140,y=640,w=170,h=80,color="white", font=40,code=BACK}),
},
help={
newButton({name="staff", x=980, y=500,w=150,h=80,color="white",font=32,code=goScene("staff")}),
@@ -494,26 +612,32 @@ local Widgets={
newButton({name="back", x=640, y=600,w=200,h=80,color="white",font=35,code=BACK}),
},
staff={
newButton({name="back", x=1140, y=640,w=180,h=80,color="white",font=35,code=BACK}),
newButton({name="back", x=1140, y=640,w=170,h=80,color="white",font=40,code=BACK}),
},
history={
newKey({name="prev", x=1155, y=170,w=180, color="white",font=65,code=pressKey("up"),hide=function()return sceneTemp.pos==1 end}),
newKey({name="next", x=1155, y=400,w=180, color="white",font=65,code=pressKey("down"),hide=function()return sceneTemp.pos==#sceneTemp.text end}),
newButton({name="back", x=1140, y=640,w=180,h=80,color="white",font=35,code=BACK}),
newButton({name="back", x=1140, y=640,w=170,h=80,color="white",font=40,code=BACK}),
},
stat={
newButton({name="path", x=980, y=620,w=250,h=80,color="white",font=25,code=function()love.system.openURL(love.filesystem.getSaveDirectory())end,hide=mobileHide}),
newButton({name="back", x=640, y=620,w=200,h=80,color="white",font=35,code=BACK}),
},
debug={
newButton({name="reset", x=640,y=200,w=260,h=100,color="yellow",font=40,
code=function()
sceneTemp.reset=true
end,
hide=function()
return sceneTemp.reset
end}),
newButton({name="reset1", x=340,y=400,w=260,h=100,color="red",font=40,
newButton({name="copyLog", x=300,y=120,w=300,h=100,color="green", font=30,code=function()LOG.copy()end}),
newButton({name="scrInfo", x=640,y=120,w=300,h=100,color="green", font=30,code=function()
LOG.print("Screen Info:")
LOG.print("x y: "..scr.x.." "..scr.y)
LOG.print("w h: "..scr.w.." "..scr.h)
LOG.print("W H: "..scr.W.." "..scr.H)
LOG.print("k: "..math.floor(scr.k*100)*.01)
LOG.print("rad: "..math.floor(scr.rad*100)*.01)
LOG.print("dpi: "..scr.dpi)
end}),
newButton({name="reset", x=640,y=380,w=240,h=100,color="orange", font=40,
code=function()sceneTemp.reset=true end,
hide=function()return sceneTemp.reset end}),
newButton({name="reset1", x=340,y=480,w=240,h=100,color="red", font=40,
code=function()
love.filesystem.remove("unlock.dat")
SFX.play("finesseError_long")
@@ -521,10 +645,8 @@ local Widgets={
TEXT.show("effected after restart game",640,360,60,"stretch",.4)
TEXT.show("play one game if you regret",640,390,40,"stretch",.4)
end,
hide=function()
return not sceneTemp.reset
end}),
newButton({name="reset2", x=640,y=400,w=260,h=100,color="red",font=40,
hide=function()return not sceneTemp.reset end}),
newButton({name="reset2", x=640,y=480,w=260,h=100,color="red", font=40,
code=function()
love.filesystem.remove("data.dat")
SFX.play("finesseError_long")
@@ -532,10 +654,8 @@ local Widgets={
TEXT.show("effected after restart game",640,360,60,"stretch",.4)
TEXT.show("play one game if you regret",640,390,40,"stretch",.4)
end,
hide=function()
return not sceneTemp.reset
end}),
newButton({name="reset3", x=940,y=400,w=260,h=100,color="red",font=40,
hide=function()return not sceneTemp.reset end}),
newButton({name="reset3", x=940,y=480,w=260,h=100,color="red", font=40,
code=function()
local L=love.filesystem.getDirectoryItems("")
for i=1,#L do
@@ -549,17 +669,8 @@ local Widgets={
TEXT.show("effected after restart game",640,390,60,"stretch",.4)
SCN.back()
end,
hide=function()
return not sceneTemp.reset
end}),
newButton({name="back", x=640,y=620,w=200,h=80,color="white",font=35,code=BACK}),
hide=function()return not sceneTemp.reset end}),
newButton({name="back", x=640,y=620,w=200,h=80,color="white", font=40,code=BACK}),
},
}
--Remove temp vars
mobileHide,SETval,SETsto,SETrev=nil
pressKey,setPen,prevSkin,nextSkin=nil
nextDir,VKAdisp,VKAcode,setLang=nil
goScene=nil
newText,newImage,newButton,newSwitch,newSlider=nil
return Widgets

View File

@@ -1,4 +1,5 @@
gameVersion="Alpha V0.10.10"
gameVersion="Alpha V0.11.0"
love.setDeprecationOutput(false)
function love.conf(t)
t.identity="Techmino"--Saving folder
t.version="11.1"

View File

@@ -1,26 +1,34 @@
(ENG ver. below)
游戏方法:
系统会提供的一个个四联骨牌("方块",总共7种),玩家需要控制(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击如果有对手的话
系统会提供的一个个四联骨牌("方块",总共7种),玩家需要控制(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
活到最后或者完成目标即胜利.
旋转系统:
使用Techmino专属旋转系统,细节懒得写(
spin判定:
结合了不可移动判定和三角判定,是否为mini也与判定过程数据有关,细节也懒得写(
满足三角判定+2分
满足不可移动判定+2分
--满足以上之一就算是spin
满足非第二个test+1分
--如果分数只有2,方块是SZJLT之一,并且没有把当前方块整个消除那么就是mini
攻击系统:
普通消除:
1/2/3/4攻击0.5/1.5/2.5/4
<4行打出[消行数-0.5]攻击
特殊消除:
spin1/2/3攻击2/4/6,若mini则减至一半
B2B:加1(techrash/spin1/spin2)或2(spin3)攻击
B3B:在B2B效果之上消四再加1,spin再加0.5*消行数攻击,二者都+1额外抵挡
连击:给予上述攻击[连击数*20%]的加成,上限200%,连消3次之后额外加1攻击
如果是spin,打出[2*消行数]攻击,
B2B攻击+[1/1/2/4/8(spin1~5)]
B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡
mini减至25%
不是spin但是单次消>=4行,打出[消行数]攻击,
B2B攻击+1
B3B攻击+50%,+1额外抵挡
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2
全消:将上述伤害之和减半再+6~12(本局内递增)+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)
根据上述规则计算后,向下取整,攻击打出
全消:将上述伤害之和减半,再+8~20(本局内递增2),+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)
连击:每次连击给予上述攻击[连击数*25%(如果只消一行就是15%)]的加成,12combo达到上限,连击>=3次时再额外加1攻击
根据上述规则计算后,向下取整,攻击打出
分数系统:
操作越牛逼得分越高嗷(
@@ -35,19 +43,19 @@ spin判定:
back to back(B2B)点数说明:
B2B点数的范围在0~1200,在点数>=40时进行特殊消除为B2B,>1000时特殊消除为B3B
普通消除-250
spin1/2/3:+50/100/180(mini变为原来25%)
消四:+100
普通消除:-250
spin1~5:+[50/100/180/1000/1200](mini变为原来25%)
消四/五:+[100/200]
空spin:+20,此法得到的点数不能超过1000
当点数在1000以上时空放一块-40(不减到低于1000)
当点数在1000以上时空放一块-40(不低于1000)
混战模式说明:
许多玩家同时进行一局游戏对手都是AI,不是真人.随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力.
许多玩家同时进行一局游戏(对手都是AI,不是真人).随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力.
玩家可选四个攻击模式:
1.随机:每次攻击后10%随机挑选一个玩家锁定
2.最多徽章:攻击后或者锁定玩家死亡时锁定徽章最多的玩家
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家每秒刷新
4.反击:攻击所有锁定自己的玩家攻击AOE,若未被任何人锁定则攻击随机玩家(不锁定)
3.最高:攻击后或者锁定玩家死亡时锁定场地最高的玩家(每秒刷新)
4.反击:攻击所有锁定自己的玩家(攻击AOE),若未被任何人锁定则攻击随机玩家(不锁定)
坚持到最后的玩家就是胜利者.
自定义模式说明:
@@ -62,19 +70,29 @@ Rotation system:
Uses Techmino's custom rotation system. Too lazy to write the details
Spin detection:
Combines immobile and 3-corner detection, and whether a spin is mini also depends on the data used for detection. Also too lazy to write the details
Satisfies "3 corner" rule +2 points
Satisfies "immobile" rule +2 points
- As long as one of the above is true, it is a Spin
If the rotation was not using the second check in the kick table, +1 point
- The Spin is a Mini if it only has 2 points; the piece is one of S, Z, J, L, T; AND the line clear did not clear the entire piece.
Attack system:
Regular line clears:
Single/Double/Triple/Techrash sends 0.5/1.5/2.5/4
Regular line clears (clearing <=3 lines):
Sends (lines cleared -0.5) attack
Special line clears:
Spin Single/Double/Triple sends 2/4/6, half if Mini
B2B: +1 (Techrash/Spin Single/Spin Double) or +2 (Spin Triple)
B2B2B/B3B: In addition to B2B, +1 if Techrash, +(0.5 * lines cleared) if Spin, and in both cases +1 additional blocking
Combo: each combo gives 20% more attack (capped at 200%), extra 1 attack after 3 combo
Spin sends (lines cleared x2) attack,
- B2B sends extra 1/1/2/4/8 (for Spin Single/Double/Triple/Techrash/Techrash+ respectively)
- B2B2B sends (lines cleared x0.5), and +1 extra blocking
- If it's a Mini, x0.25
Non-Spin Techrash/Techrash+ sends (lines cleared) attack,
- B2B sends extra 1 attack,
- B2B2B sends 50% more attack and +1 extra blocking.
Special line clears will increase B2B gauge, making later special line clears have B2B or B2B2B bonus (see below)
Half Perfect Clear (a Perfect Clear "with blocks left below". If it's an I clearing 1 line, then the remaining blocks must not be player-placed): Attack +2, Extra Blocking +2
Perfect Clear: half all damage above, then +6 to +12 attack (increases within a round) and +2 extra blocking. (note: if lines cleared in this round >4, then B2B gauge will be filled)
Perfect Clear: half all damage above, then +8 to +20 attack (increases within a round by +2 per Perfect Clear) and +2 extra blocking. (note: if lines cleared in this round >4, then B2B gauge will be filled)
Combos: All damage above will be given a (combo x25%) bonus, or (combo x15%) if the line clear is a Single, capped at 12 combo. +1 more attack for 3 Combo or more.
After calculating all above, the damage value will be rounded down then sent
Score system:
@@ -91,8 +109,8 @@ Countering:
Back to Back (B2B) gauge:
The B2B gauge ranges from 0 to 1,200. Special line clears are B2B if the gauge is >=40, B2B2B if >1,000.
A regular line clear -250
Spin Single/Double/Triple +50/100/180 (x25% if Mini)
Techrash +100
Spin Single/Double/Triple/Qudra/Penta +50/100/180/1000/1200 (x25% if Mini)
Techrash/Techrash+ +100/200
Spin without clearing lines +20, but gauge cannot exceed 1,000 with this method
When gauge is above 1,000, a drop without clearing lines -40 (cannot drop below 1,000 with this method)
@@ -110,4 +128,4 @@ Custom mode:
In build (puzzle) mode, you can toggle template display with Function key. Cells with a X cannot have blocks; empty cells can be in any state; regular colored cells have to be made of the corresponding block; garbage-colored cells can be any block but not air. Once you make the shape, you will win.
附录Appendix:
ZXC's cool O-spin map:XY0BCgAwCAIR7v9vHtUSt8AS0xKqgpnNGyXkrmFNePf6qi3BbQPrHT2Owxe6D66NeKi86dwB
ZXC's cool O-spin map:eJxdjQEKADAIAhHu/28e1RK3wBLTEqqCmc0bJeSuYU149/qqLcFtA+sdPY7DF7oPro14qLzp3AGwKgHj

View File

@@ -41,11 +41,53 @@ scr={
W=0,H=0,--Fullscreen w/h in shader
rad=0,--Radius
k=1,--Scale size
dpi=1--DPI from gc.getDPIScale()
}--1280:720-Rect Screen Info
customSel={1,22,1,1,7,3,1,1,8,4,1,1,1}
preField={h=20}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
preBag={}
customEnv={
--Basic
drop=60,
lock=60,
wait=0,
fall=0,
next=6,
hold=true,
oncehold=true,
--Visual
block=true,
ghost=.3,
center=1,
bagLine=false,
highCam=false,
nextPos=false,
bone=false,
--Rule
mindas=0,
minarr=0,
minsdarr=0,
sequence="bag",
ospin=false,
noTele=false,
fineKill=false,
missionKill=false,
easyFresh=true,
visible="show",
target=1e99,
freshLimit=1e99,
opponent=0,
life=0,
pushSpeed=3,
--Else
bg="none",
bgm="race"
}
preField={h=20}for i=1,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end--Field for custom game
preBag={}--Sequence for custom game
preMission={}--Clearing target for custom game
game={
frame=0, --Frame count
@@ -162,9 +204,9 @@ do
if S.version~=gameVersion then
S.version=gameVersion
newVersionLaunch=true
fs.remove("sprintPenta.dat")
fs.remove("master_adavnce.dat")
fs.remove("master_beginner.dat")
end
if system=="Android"and not setting.fullscreen then
LOG.print("如果你的手机状态栏不会消失,请到设置界面开启全屏",300,color.yellow)
LOG.print("Switch fullscreen on if titleBar don't disappear",300,color.yellow)
end
end

View File

@@ -17,7 +17,6 @@ return{
env={
noTele=true,
minarr=1,
_20G=true,
drop=0,lock=15,
wait=15,fall=6,
next=3,

View File

@@ -4,7 +4,7 @@ return{
env={
drop=30,lock=45,
visible="time",
dropPiece=PLY.reach_winCheck,
dropPiece=PLY.check_lineReach,
freshLimit=10,
target=200,
bg="glow",bgm="reason",

View File

@@ -5,10 +5,9 @@ return{
env={
drop=15,lock=45,
fall=10,
center=false,
dropFX=0,lockFX=0,
visible="none",
dropPiece=PLY.reach_winCheck,
dropPiece=PLY.check_lineReach,
freshLimit=15,
target=200,
bg="rgb",bgm="reason",

View File

@@ -5,10 +5,10 @@ return{
env={
drop=10,lock=60,
fall=5,
center=0,ghost=0,
ghost=0,
dropFX=0,lockFX=0,
visible="none",
dropPiece=PLY.reach_winCheck,
dropPiece=PLY.check_lineReach,
freshLimit=15,
target=200,
bg="rgb",bgm="reason",

View File

@@ -6,7 +6,7 @@ return{
drop=15,lock=45,
freshLimit=10,
visible="fast",
dropPiece=PLY.reach_winCheck,
dropPiece=PLY.check_lineReach,
target=200,
bg="glow",bgm="reason",
},

View File

@@ -4,11 +4,10 @@ return{
color=color.red,
env={
drop=30,lock=60,
block=false,
center=0,ghost=0,
block=false,center=0,ghost=0,
dropFX=0,lockFX=0,
visible="none",
dropPiece=PLY.reach_winCheck,
dropPiece=PLY.check_lineReach,
freshLimit=15,
target=200,
bg="rgb",bgm="way",

View File

@@ -6,11 +6,10 @@ return{
env={
drop=30,lock=60,
next=1,
block=false,
center=0,ghost=0,
block=false,center=0,ghost=0,
dropFX=0,lockFX=0,
visible="none",
dropPiece=PLY.reach_winCheck,
dropPiece=PLY.check_lineReach,
freshLimit=15,
target=100,
bg="none",bgm="way",
@@ -18,10 +17,29 @@ return{
pauseLimit=true,
load=function()
PLY.newPlayer(1,340,15)
if setting.spawn==0 then
LOG.print(text.switchSpawnSFX,color.yellow)
end
end,
mesDisp=function(P,dx,dy)
if not game.result then
gc.clear(.26,.26,.26)
if game.replaying then
gc.setColor(.3,.3,.3,.7)
gc.push("transform")
gc.origin()
gc.rectangle("fill",0,0,scr.w,scr.h)
gc.pop()
else
gc.clear(.26,.26,.26)
--Frame
gc.setColor(.5,.5,.5)
gc.push("transform")
gc.translate(150,70)
gc.rectangle("line",-1,-11,302,612)--Boarder
gc.rectangle("line",301,-3,15,604)--AtkBuffer boarder
gc.rectangle("line",-16,-3,15,604)--B2b bar boarder
gc.pop()
end
end
--Figures
@@ -37,12 +55,6 @@ return{
setFont(75)
mStr(P.stat.row,69,290)
mStr(P.stat.clears[4],69,410)
--"Field"
gc.setColor(.5,.5,.5)
gc.rectangle("line",149,59,302,612)
gc.rectangle("line",451,70,15,601)
gc.rectangle("line",134,67,15,604)
end,
score=function(P)return{min(P.stat.row or 200),P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,

View File

@@ -1,13 +1,13 @@
local min=math.min
local function check_c4w(P)
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(13)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if #P.clearedRow==0 then
P:lose()
else
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(13)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if P.combo>P.modeData.point then
P.modeData.point=P.combo
end

View File

@@ -1,11 +1,11 @@
local min=math.min
local function check_c4w(P)
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(13)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if #P.clearedRow>0 then
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(13)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if P.combo>P.modeData.point then
P.modeData.point=P.combo
end

View File

@@ -3,28 +3,30 @@ local int=math.floor
return{
color=color.white,
env={
dropPiece=PLY.reach_winCheck,
dropPiece=PLY.check_lineReach,
},
load=function()
for i=1,#customID do
local k=customID[i]
modeEnv[k]=customRange[k][customSel[i]]
for k,v in next,customEnv do
modeEnv[k]=v
end
modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1
if preBag[1]then
modeEnv.bag=preBag
else
modeEnv.bag=nil
end
if preMission[1]then
modeEnv.mission=preMission
else
modeEnv.mission=nil
end
PLY.newPlayer(1,340,15)
local L=modeEnv.opponent
if L~=0 then
modeEnv.target=nil
if L<10 then
if L<6 then
PLY.newAIPlayer(2,965,360,.5,AITemplate("9S",2*L))
else
PLY.newAIPlayer(2,965,360,.5,AITemplate("CC",L-6,2+int((L-11)*.5),modeEnv.hold,15000+5000*(L-10)))
PLY.newAIPlayer(2,965,360,.5,AITemplate("CC",L,int(L*.5-1.5),modeEnv.hold,4000*L))
end
end
preField.h=20
@@ -46,8 +48,8 @@ return{
end
P.garbageBeneath=preField.h
end
modeEnv.bg=customRange.bg[customSel[12]]
modeEnv.bgm=customRange.bgm[customSel[13]]
modeEnv.bg=customEnv.bg
modeEnv.bgm=customEnv.bgm
end,
mesDisp=function(P,dx,dy)
setFont(55)

View File

@@ -20,31 +20,31 @@ end
return{
color=color.white,
env={
puzzle=true,
Fkey=function(P)P.modeData.event=1-P.modeData.event end,
dropPiece=puzzleCheck,
},
load=function()
for i=1,#customID do
local k=customID[i]
modeEnv[k]=customRange[k][customSel[i]]
for k,v in next,customEnv do
modeEnv[k]=v
end
modeEnv._20G=modeEnv.drop==0
modeEnv.oncehold=customSel[6]==1
if preBag[1]then
modeEnv.bag=preBag
else
modeEnv.bag=nil
end
modeEnv.target=0
if preMission[1]then
modeEnv.mission=preMission
else
modeEnv.mission=nil
end
PLY.newPlayer(1,340,15)
local L=modeEnv.opponent
if L~=0 then
modeEnv.target=nil
if L<10 then
if L<6 then
PLY.newAIPlayer(2,965,360,.5,AITemplate("9S",2*L))
else
PLY.newAIPlayer(2,965,360,.5,AITemplate("CC",L-6,2+int((L-11)*.5),modeEnv.hold,15000+5000*(L-10)))
PLY.newAIPlayer(2,965,360,.5,AITemplate("CC",L,int(L*.5-1.5),modeEnv.hold,4000*L))
end
end
preField.h=20
@@ -57,15 +57,15 @@ return{
preField.h=preField.h-1
until preField.h==0
::L::
modeEnv.bg=customRange.bg[customSel[12]]
modeEnv.bgm=customRange.bgm[customSel[13]]
modeEnv.bg=customEnv.bg
modeEnv.bgm=customEnv.bgm
end,
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
mStr(P.stat.row,69,295)
mText(drawableText.line,69,360)
if P.gameEnv.puzzle and P.modeData.event==0 then
if P.modeData.event==0 then
local m=puzzleMark
for y=1,preField.h do for x=1,10 do
local T=preField[y][x]

View File

@@ -91,7 +91,7 @@ return{
P:getNext(res[P:RND(#res)])
end
end,
target=100,dropPiece=PLY.reach_winCheck,
target=100,dropPiece=PLY.check_lineReach,
next=1,hold=false,
ospin=false,
freshLimit=15,

View File

@@ -5,7 +5,7 @@ return{
drop=20,lock=60,
sequence="bag",
bag={1,1,2,2,3,3,4,4,5,5,6,6},
target=100,dropPiece=PLY.reach_winCheck,
target=100,dropPiece=PLY.check_lineReach,
next=3,
ospin=false,
freshLimit=15,

View File

@@ -11,7 +11,7 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,69,260)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)

View File

@@ -6,7 +6,7 @@ local function check(P)
P.gameEnv.drop=.25
P.gameEnv.target=100
elseif T==100 then
P.gameEnv._20G=true
P._20G=true
P.gameEnv.target=200
else
P:win("finish")

View File

@@ -43,7 +43,7 @@ return{
env={
noTele=true,
das=6,arr=1,
_20G=true,
drop=0,
lock=death_lock[1],
wait=death_wait[1],
fall=death_fall[1],

View File

@@ -45,7 +45,7 @@ return{
env={
noTele=true,
das=9,arr=3,
_20G=true,
drop=0,
lock=rush_lock[1],
wait=rush_wait[1],
fall=rush_fall[1],

View File

@@ -43,7 +43,7 @@ return{
env={
noTele=true,
das=5,arr=1,
_20G=true,lock=12,
drop=0,lock=12,
wait=10,fall=10,
dropPiece=score,
freshLimit=15,

View File

@@ -4,7 +4,7 @@ return{
env={
drop=60,lock=120,
fall=10,
target=100,dropPiece=PLY.reach_winCheck,
target=100,dropPiece=PLY.check_lineReach,
freshLimit=15,
ospin=false,
bg="rgb",bgm="newera",

View File

@@ -4,7 +4,7 @@ return{
env={
drop=20,lock=60,
fall=20,
target=100,dropPiece=PLY.reach_winCheck,
target=100,dropPiece=PLY.check_lineReach,
freshLimit=15,
ospin=false,
bg="rgb",bgm="newera",

View File

@@ -4,7 +4,7 @@ return{
env={
oncehold=false,
drop=300,lock=1e99,
target=100,dropPiece=PLY.reach_winCheck,
target=100,dropPiece=PLY.check_lineReach,
ospin=false,
bg="rgb",bgm="newera",
},

36
modes/sprintMPH.lua Normal file
View File

@@ -0,0 +1,36 @@
local gc=love.graphics
local rnd=math.random
return{
color=color.green,
env={
drop=60,lock=60,
next=0,hold=false,
sequence="rnd",
target=40,dropPiece=PLY.check_lineReach,
bg="aura",bgm="race",
},
load=function()
PLY.newPlayer(1,340,15)
end,
mesDisp=function(P)
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,69,335)
P:drawTargetLine(r)
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
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
local T=P.stat.time
return
T<=60 and 5 or
T<=70 and 4 or
T<=90 and 3 or
T<=110 and 2 or
T<=140 and 1 or
0
end,
}

View File

@@ -5,7 +5,7 @@ return{
env={
drop=60,lock=60,
sequence="bag",bag={8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25},
target=40,dropPiece=PLY.reach_winCheck,
target=40,dropPiece=PLY.check_lineReach,
bg="aura",bgm="race",
},
load=function()

View File

@@ -4,7 +4,7 @@ return{
color=color.cyan,
env={
drop=60,lock=60,
target=10,dropPiece=PLY.reach_winCheck,
target=10,dropPiece=PLY.check_lineReach,
bg="bg2",bgm="race",
},
load=function()

View File

@@ -4,7 +4,7 @@ return{
color=color.orange,
env={
drop=60,lock=60,
target=100,dropPiece=PLY.reach_winCheck,
target=100,dropPiece=PLY.check_lineReach,
bg="bg2",bgm="race",
},
load=function()

View File

@@ -4,7 +4,7 @@ return{
color=color.lGrey,
env={
drop=60,lock=60,
target=1000,dropPiece=PLY.reach_winCheck,
target=1000,dropPiece=PLY.check_lineReach,
bg="rainbow",bgm="push",
},
load=function()

View File

@@ -4,7 +4,7 @@ return{
color=color.lBlue,
env={
drop=60,lock=60,
target=20,dropPiece=PLY.reach_winCheck,
target=20,dropPiece=PLY.check_lineReach,
bg="bg2",bgm="race",
},
load=function()

View File

@@ -4,7 +4,7 @@ return{
color=color.green,
env={
drop=60,lock=60,
target=40,dropPiece=PLY.reach_winCheck,
target=40,dropPiece=PLY.check_lineReach,
bg="bg2",bgm="race",
},
load=function()

View File

@@ -4,7 +4,7 @@ return{
color=color.red,
env={
drop=60,lock=60,
target=400,dropPiece=PLY.reach_winCheck,
target=400,dropPiece=PLY.check_lineReach,
bg="rainbow",bgm="push",
},
load=function()

View File

@@ -1,9 +1,12 @@
local format=string.format
local int=math.floor
local function tech_check_hard(P)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
if #P.clearedRow>0 then
if not P.lastClear.special then
P:lose()
end
end
if P.stat.row>=200 then
if P.stat.atk>=200 then
P:win("finish")
end
end
@@ -14,7 +17,6 @@ return{
arr=0,
drop=1e99,lock=60,
freshLimit=15,
target=200,
fineKill=true,
dropPiece=tech_check_hard,
bg="flink",bgm="infinite",
@@ -25,22 +27,28 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,69,260)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=150 and 4 or
L>=100 and 3 or
L>=70 and 2 or
L>=40 and 1 or
L>=10 and 0
local L=P.stat.atk
if L>=200 then
local T=P.stat.time
return
T<120 and 5 or
T<150 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=60 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,5 +1,5 @@
local format=string.format
local int=math.floor
return{
color=color.lYellow,
env={
@@ -7,7 +7,7 @@ return{
drop=1e99,lock=60,
freshLimit=15,
target=200,
dropPiece=PLY.reach_winCheck,
dropPiece=PLY.check_attackReach,
fineKill=true,
bg="flink",bgm="infinite",
},
@@ -17,22 +17,28 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,69,260)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." "..toTime(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=150 and 4 or
L>=100 and 3 or
L>=70 and 2 or
L>=40 and 1 or
L>=10 and 0
local L=P.stat.atk
if L>=200 then
local T=P.stat.time
return
T<120 and 5 or
T<150 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=60 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,9 +1,12 @@
local format=string.format
local int=math.floor
local function tech_check_hard(P)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
if #P.clearedRow>0 then
if not(P.lastClear.spin or P.lastClear.pc)then
P:lose()
end
end
if P.stat.row>=200 then
if P.stat.atk>=200 then
P:win("finish")
end
end
@@ -13,7 +16,6 @@ return{
env={
drop=30,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_check_hard,
bg="matrix",bgm="push",
},
@@ -22,22 +24,28 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,69,260)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=126 and 4 or
L>=90 and 3 or
L>=60 and 2 or
L>=30 and 1 or
L>=5 and 0
local L=P.stat.atk
if L>=200 then
local T=P.stat.time
return
T<130 and 5 or
T<160 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=60 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,9 +1,10 @@
local format=string.format
local int=math.floor
local function tech_check_easy(P)
if #P.clearedRow>0 and P.b2b<40 then
P:lose()
end
if P.stat.row>=200 then
if P.stat.atk>=200 then
P:win("finish")
end
end
@@ -13,7 +14,6 @@ return{
env={
drop=20,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_check_easy,
bg="matrix",bgm="push",
},
@@ -22,22 +22,28 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,69,260)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=126 and 4 or
L>=90 and 3 or
L>=60 and 2 or
L>=30 and 1 or
L>=5 and 0
local L=P.stat.atk
if L>=200 then
local T=P.stat.time
return
T<120 and 5 or
T<150 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=60 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,9 +1,12 @@
local format=string.format
local int=math.floor
local function tech_check_hard(P)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
if #P.clearedRow>0 then
if not(P.lastClear.spin or P.lastClear.pc)then
P:lose()
end
end
if P.stat.row>=200 then
if P.stat.atk>=200 then
P:win("finish")
end
end
@@ -11,9 +14,8 @@ end
return{
color=color.dRed,
env={
_20G=true,lock=60,
drop=0,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_check_hard,
bg="matrix",bgm="down",
},
@@ -22,22 +24,28 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,69,260)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=140 and 4 or
L>=90 and 3 or
L>=60 and 2 or
L>=30 and 1 or
L>=5 and 0
local L=P.stat.atk
if L>=200 then
local T=P.stat.time
return
T<140 and 5 or
T<180 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=60 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,9 +1,10 @@
local format=string.format
local int=math.floor
local function tech_check_easy(P)
if #P.clearedRow>0 and P.b2b<40 then
P:lose()
end
if P.stat.row>=200 then
if P.stat.atk>=200 then
P:win("finish")
end
end
@@ -11,9 +12,8 @@ end
return{
color=color.red,
env={
_20G=true,lock=60,
drop=0,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_check_easy,
bg="matrix",bgm="down",
},
@@ -22,22 +22,28 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,69,260)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=140 and 4 or
L>=90 and 3 or
L>=60 and 2 or
L>=30 and 1 or
L>=5 and 0
local L=P.stat.atk
if L>=200 then
local T=P.stat.time
return
T<130 and 5 or
T<160 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=60 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,9 +1,12 @@
local format=string.format
local int=math.floor
local function tech_check_hard(P)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
if #P.clearedRow>0 then
if not(P.lastClear.spin or P.lastClear.pc)then
P:lose()
end
end
if P.stat.row>=200 then
if P.stat.atk>=200 then
P:win("finish")
end
end
@@ -13,7 +16,6 @@ return{
env={
oncehold=false,
drop=1e99,lock=1e99,
target=200,
dropPiece=tech_check_hard,
bg="matrix",bgm="newera",
},
@@ -22,22 +24,28 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,69,260)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=126 and 4 or
L>=80 and 3 or
L>=50 and 2 or
L>=20 and 1 or
L>=5 and 0
local L=P.stat.atk
if L>=200 then
local T=P.stat.time
return
T<130 and 5 or
T<160 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=60 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,9 +1,10 @@
local format=string.format
local int=math.floor
local function tech_check_easy(P)
if #P.clearedRow>0 and P.b2b<40 then
P:lose()
end
if P.stat.row>=200 then
if P.stat.atk>=200 then
P:win("finish")
end
end
@@ -13,7 +14,6 @@ return{
env={
oncehold=false,
drop=1e99,lock=1e99,
target=200,
dropPiece=tech_check_easy,
bg="matrix",bgm="newera",
},
@@ -22,22 +22,28 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,69,260)
mStr(format("%.1f",P.stat.atk),69,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
mText(drawableText.atk,69,313)
mText(drawableText.eff,69,433)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.time}end,
scoreDisp=function(D)return D[1].." Attack "..toTime(D[2])end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local L=P.stat.row
return
L>=200 and 5 or
L>=126 and 4 or
L>=80 and 3 or
L>=50 and 2 or
L>=20 and 1 or
L>=5 and 0
local L=P.stat.atk
if L>=200 then
local T=P.stat.time
return
T<120 and 5 or
T<150 and 4 or
3
else
return
L>=150 and 3 or
L>=100 and 2 or
L>=60 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -1,8 +1,8 @@
local function check_tsd(P)
if #P.clearedRow>0 then
if P.lastClear~=52 then
if P.lastClear.id~=5 or P.lastClear.row~=2 then
P:lose()
elseif #P.clearedRow>0 then
else
P.modeData.event=P.modeData.event+1
if P.modeData.event==20 then
P:win("finish")
@@ -24,9 +24,9 @@ return{
PLY.newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(75)
mStr(P.modeData.event,69,400)
mText(drawableText.tsd,69,477)
setFont(65)
mStr(P.modeData.event,69,320)
mText(drawableText.tsd,69,385)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].."TSD "..toTime(D[2])end,

View File

@@ -1,8 +1,8 @@
local function check_tsd(P)
if #P.clearedRow>0 then
if P.lastClear~=52 then
if P.lastClear.id~=5 or P.lastClear.row~=2 then
P:lose()
elseif #P.clearedRow>0 then
else
P.modeData.event=P.modeData.event+1
end
end
@@ -22,9 +22,9 @@ return{
PLY.newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(75)
mStr(P.modeData.event,69,400)
mText(drawableText.tsd,69,477)
setFont(65)
mStr(P.modeData.event,69,320)
mText(drawableText.tsd,69,385)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].."TSD "..toTime(D[2])end,

View File

@@ -1,8 +1,9 @@
local function check_tsd(P)
if #P.clearedRow>0 then
if P.lastClear~=52 then
local C=P.lastClear
if P.lastClear.id~=5 or P.lastClear.row~=2 then
P:lose()
elseif #P.clearedRow>0 then
else
P.modeData.event=P.modeData.event+1
end
end
@@ -22,9 +23,9 @@ return{
PLY.newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(75)
mStr(P.modeData.event,69,400)
mText(drawableText.tsd,69,477)
setFont(65)
mStr(P.modeData.event,69,320)
mText(drawableText.tsd,69,385)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].."TSD "..toTime(D[2])end,

View File

@@ -2,8 +2,8 @@ return{
color=color.lGrey,
env={
drop=120,lock=120,
oncehold=false,target=200,
dropPiece=PLY.reach_winCheck,
oncehold=false,
target=200,dropPiece=PLY.check_lineReach,
bg="bg2",bgm="infinite",
},
load=function()

View File

@@ -91,12 +91,17 @@ do
while i<400 do
F[i],i=false,i+1
end
CC.update(P.AI_bot,F,P.b2b>=100,P.combo)
if not pcall(CC.update,P.AI_bot,F,P.b2b>=100,P.combo)then
LOG.print("CC is dead ("..P.id..")","error")
end
end
function CC_switch20G(P)
if not pcall(CC.destroy,P.AI_bot)then
LOG.print("CC is dead ("..P.id..")","error")
return
end
P.AIdata._20G=true
P.AI_keys={}
CC.destroy(P.AI_bot)
local opt,wei=CC.getConf()
CC.setHold(opt,P.AIdata.hold)
CC.set20G(opt,P.AIdata._20G)
@@ -321,36 +326,45 @@ return{
end,
},
["CC"]={
[0]=NULL,
function(P)--Start thinking
CC.think(P.AI_bot)
if not pcall(CC.think,P.AI_bot)then
LOG.print("CC is dead ("..P.id..")","error")
return 0
end
return 2
end,
function(P,ctrl)--Poll keys
local success,dest,hold,move=CC.getMove(P.AI_bot)
if success==2 then
ins(ctrl,6)
return 3
elseif success==0 then
for i=1,#dest do
for j=1,#dest[i]do
dest[i][j]=dest[i][j]+1
local success,result,dest,hold,move=pcall(CC.getMove,P.AI_bot)
if success then
if result==2 then
ins(ctrl,6)
return 3
elseif result==0 then
for i=1,#dest do
for j=1,#dest[i]do
dest[i][j]=dest[i][j]+1
end
end
end
P.AI_dest=dest
if hold then ctrl[1]=8 end--Hold
while move[1]do
local m=rem(move,1)
if m<4 then
ins(ctrl,m+1)
elseif not P.AIdata._20G then
ins(ctrl,13)
P.AI_dest=dest
if hold then ctrl[1]=8 end--Hold
while move[1]do
local m=rem(move,1)
if m<4 then
ins(ctrl,m+1)
elseif not P.AIdata._20G then
ins(ctrl,13)
end
end
ins(ctrl,6)
return 3
else
--Stay this stage
return 2
end
ins(ctrl,6)
return 3
else
--Stay this stage
return 2
LOG.print("CC is dead ("..P.id..")","error")
return 0
end
end,
function(P)--Check if time to change target

View File

@@ -17,7 +17,7 @@ setting={
face={},
--Graphic
ghost=.3,center=1,
block=true,ghost=.3,center=1,
smooth=true,grid=false,
bagLine=false,
lockFX=2,
@@ -29,6 +29,7 @@ setting={
frameMul=100,
text=true,
score=true,
warn=true,
highCam=false,
nextPos=false,

View File

@@ -62,6 +62,85 @@ function restoreVirtualKey()
end
end
function copyQuestArgs()
local ENV=customEnv
local str=""
str=str..(ENV.hold and"H"or"Z")
str=str..(ENV.ospin and"O"or"Z")
str=str..(ENV.missionKill and"M"or"Z")
str=str..ENV.sequence
return str
end
function pasteQuestArgs(str)
local ENV=customEnv
ENV.hold= byte(str,1)~=90
ENV.ospin= byte(str,2)~=90
ENV.missionKill= byte(str,3)~=90
ENV.sequence= sub(str,4)
end
--Encoding Functions
--Sep symbol: 33 (!)
--Safe char: 34~126
--[[
Count: 34~96
Block: 97~125
Encode: [A] or [AB] sequence, A = block ID, B = repeat times, no B means do not repeat.
Example: "abcdefg" is [SZJLTOI], "a^aDb)" is [Z*63,Z*37,S*10]
]]
function copySequence()
local preBag=preBag
local str=""
local count=1
for i=1,#preBag+1 do
if preBag[i+1]~=preBag[i]or count==64 then
str=str..char(96+preBag[i])
if count>1 then
str=str..char(32+count)
count=1
end
else
count=count+1
end
end
return str
end
function pasteSequence(str)
local _
local bag={}
local reg
for i=1,#str do
_=byte(str,i)
if not reg then
if _>=97 and _<=125 then
reg=_-96
else
return
end
else
if _>=97 and _<=125 then
ins(bag,reg)
reg=_-96
elseif _>=34 and _<=96 then
for i=1,_-32 do
ins(bag,reg)
end
reg=nil
end
end
end
if reg then
ins(bag,reg)
end
preBag=bag
sceneTemp.cur=#bag
return true
end
function copyBoard()
local str=""
local H=0
@@ -85,7 +164,7 @@ function copyBoard()
end
str=str..S
end
return data.encode("string","base64",data.compress("string","deflate",str))
return data.encode("string","base64",data.compress("string","zlib",str))
end
function pasteBoard(str)
local _
@@ -93,7 +172,7 @@ function pasteBoard(str)
--Decode
_,str=pcall(data.decode,"string","base64",str)
if not _ then return end
_,str=pcall(data.decompress,"string","deflate",str)
_,str=pcall(data.decompress,"string","zlib",str)
if not _ then return end
local fX,fY=1,1--*ptr for Field(r*10+(c-1))
@@ -135,36 +214,73 @@ function pasteBoard(str)
return true
end
function copySequence()
--[[
Mission: 34~114
Count: 115~126
Encode: [A] or [AB] sequence, A = mission ID, B = repeat times, no B means do not repeat.
_1=01,_2=02,_3=03,_4=04,
A1=05,A2=06,A3=07,A4=08,
PC=09,
Z1=11,Z2=12,Z3=13,
S1=21,S2=22,S3=23,
J1=31,J2=32,J3=33,
L1=41,L2=42,L3=43,
T1=51,T2=52,T3=53,
O1=61,O2=62,O3=63,O4=64,
I1=71,I2=72,I3=73,I4=74,
]]
function copyMission()
local _
local preMission=preMission
local str=""
for i=1,#preBag do
str=str..char(preBag[i]-1)
end
return data.encode("string","base64",data.compress("string","deflate",str))
end
function pasteSequence(str)
local _
--Decode
_,str=pcall(data.decode,"string","base64",str)
if not _ then return end
_,str=pcall(data.decompress,"string","deflate",str)
if not _ then return end
local bag={}
for i=1,#str do
_=byte(str,i)
if _<25 then
bag[i]=_+1
local count=1
for i=1,#preMission+1 do
if preMission[i+1]~=preMission[i]or count==13 then
_=33+preMission[i]
str=str..char(_)
if count>1 then
str=str..char(113+count)
count=1
end
else
return
count=count+1
end
end
preBag=bag
sceneTemp.cur=#preBag
return str
end
function pasteMission(str)
local _
local mission={}
local reg
for i=1,#str do
_=byte(str,i)
if not reg then
if _>=34 and _<=114 then
reg=_-33
else
return
end
else
if _>=34 and _<=114 then
ins(mission,reg)
reg=_-33
elseif _>=115 and _<=126 then
for i=1,_-113 do
ins(mission,reg)
end
reg=nil
end
end
end
if reg then
ins(mission,reg)
end
preMission=mission
sceneTemp.cur=#mission
return true
end
@@ -209,13 +325,14 @@ function freshMostBadge()
game.mostBadge,game.secBadge=nil
local m,m2=0,0
for i=1,#players.alive do
local h=players.alive[i].badge
if h>=m then
game.mostBadge,game.secBadge=players.alive[i],game.mostBadge
m,m2=h,m
elseif h>=m2 then
game.secBadge=players.alive[i]
m2=h
local P=players.alive[i]
local b=P.badge
if b>=m then
game.mostBadge,game.secBadge=P,game.mostBadge
m,m2=b,m
elseif b>=m2 then
game.secBadge=P
m2=b
end
end
end
@@ -251,7 +368,7 @@ function royaleLevelup()
P.gameEnv.drop=int(P.gameEnv.drop*.3)
if P.gameEnv.drop==0 then
P.curY=P.imgY
P.gameEnv._20G=true
P._20G=true
if P.AI_mode=="CC"then CC_switch20G(P)end
end
end

View File

@@ -58,6 +58,7 @@ if setting.lang==1 or setting.lang==2 then
"少女祈祷中",
"扫雷好玩!",
"请不要向对方块不感兴趣的路人推荐此游戏。",
"请不要随意宣传,出了事都怪你们",
"你可以从统计页面打开游戏存档目录",
"魔方好玩!",
"喵!",
@@ -82,6 +83,7 @@ if setting.lang==1 or setting.lang==2 then
"茶娘 可爱!",
"草(日本语)",
"不要在上课时玩游戏!",
"不要随意宣传,不要随意宣传,不要随意宣传",
"不要盯着bug不放",
"不是动画,真的在加载!",
"别问游戏名怎么取的,问就是随便想的",
@@ -245,7 +247,6 @@ elseif setting.lang==5 then
}
else
L={
"Diao?上次被我c4w秒了的那人?",
"隐形难吗?那个节目上的谁,水平那么菜也打得还行,就是你菜",
"一口一个wtcl还不赶紧去练,你是不思进取还是不想好好说话?",
"我一个滑铲就挖了个11renPC",
@@ -256,23 +257,24 @@ elseif setting.lang==5 then
"设置都看过一遍了吗?明明都能调还嫌这嫌那,可牛逼了您",
"少玩点,多眨眼,到时候瞎了别怪我没提醒你",
"人只用一只手都能玩,你呢?",
"全隐40行全消四很难吗??",
"没那水平别天天整什么花里胡哨的,人玩几年你想几天赶上?",
"满口PCDT信天翁,还会点别的么?",
"叫你多练消四不听,现在要速度没速度,spin打完地形一塌糊涂,开心了?",
"叫你多练就多练,想着几天变神仙,当自己是谁?",
"极限20G不是随手通?",
"还搁这玩手机呢,作业做完了?",
"除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?",
"不会吧不会吧,真的还有人不能随手Tspin?",
"别会个c4w就以为自己多强,这是基本功罢了",
"60lpm?拍硬降刷的吧",
"4pps不是人均水平?",
"别会个c4w就以为自己多强,这是基本功罢了",
"60lpm?拍硬降刷的吧",
"40行还要40多秒,就这?",
"20G很难?是个人都能玩吧",
"3pps不是人均水平?",
"25TSD不难吧。",
"20G很难?是个人都能玩吧。",
"20连pc不是随手?",
"100apm?定式刷的吧",
"100apm?定式刷的吧",
"0202年了,还在玩这种小孩子玩的游戏?",
"极限20G?那不是随手通",
"全隐40行全消四很难吗??",
}
end
end

View File

@@ -163,35 +163,26 @@ for i=1,8 do
end
end
customID={
"drop","lock",
"wait","fall",
"next","hold",
"sequence","visible",
"target",
"freshLimit",
"opponent",
"bg","bgm",
}
customRange={
drop={1e99,180,60,40,30,25,20,18,16,14,12,10,9,8,7,6,5,4,3,2,1,.5,.25,.125,0},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
next={0,1,2,3,4,5,6},
hold={true,false,true},
sequence={"bag","his4","rnd","loop","fixed"},
visible={"show","time","fast","none"},
target={10,20,40,100,200,500,1000,1e99},
freshLimit={0,8,15,1e99},
opponent={0,1,2,3,4,5,11,12,13,14,15,16},
bg={"none","bg1","bg2","rainbow","aura","rgb","glow","matrix"},
bgm={"blank","way","race","newera","push","reason","infinite","secret7th","secret8th","rockblock"},
missionEnum={
_1=01,_2=02,_3=03,_4=04,
A1=05,A2=06,A3=07,A4=08,
PC=09,
Z1=11,Z2=12,Z3=13,
S1=21,S2=22,S3=23,
J1=31,J2=32,J3=33,
L1=41,L2=42,L3=43,
T1=51,T2=52,T3=53,
O1=61,O2=62,O3=63,O4=64,
I1=71,I2=72,I3=73,I4=74,
}
local _={}
for k,v in next,missionEnum do _[v]=k end
for k,v in next,_ do missionEnum[k]=v end
local function T(s,t)return love.graphics.newText(setFont(s),t)end
drawableText={
question=T(100,"?"),
right=T(45,""),
question=T(100,"?"),right=T(45,""),
small=T(30,"<"),large=T(30,">"),
bpm=T(15,"BPM"),kpm=T(15,"KPM"),
speedLV=T(20,"speed level"),
@@ -208,7 +199,6 @@ drawableText={
mxcmb=T(20,"Max Combo"),
pc=T(20,"Perfect Clear"),
ko=T(25,"KO"),
D=T(100,"D"),C=T(100,"C"),B=T(100,"B"),A=T(100,"A"),S=T(100,"S"),
modeName=T(30),levelName=T(30),
@@ -219,8 +209,9 @@ drawableText={
next=T(40),hold=T(40),
win=T(120),finish=T(120),
gameover=T(100),pause=T(120),
D=T(100,"D"),C=T(100,"C"),B=T(100,"B"),A=T(100,"A"),S=T(100,"S"),
custom=T(80),sequence=T(80),
custom=T(80),basic=T(35),rule=T(35),field=T(35),mission=T(35),
setting_game=T(80),setting_video=T(80),setting_sound=T(80),
setting_control=T(70),setting_skin=T(70),
preview=T(40),

View File

@@ -1,7 +1,7 @@
return{
{name="sprint_10", x=0, y=0, size=35,shape=1,icon="sprint", unlock={"sprint_20","sprint_40"}},
{name="sprint_20", x=-300, y=0, size=45,shape=1,icon="sprint", unlock={}},
{name="sprint_40", x=0, y=-400, size=55,shape=1,icon="sprint", unlock={"sprint_100","marathon_normal","custom_clear","custom_puzzle","sprintPenta"}},
{name="sprint_40", x=0, y=-400, size=55,shape=1,icon="sprint", unlock={"sprint_100","marathon_normal","custom_clear","custom_puzzle","sprintPenta","sprintMPH"}},
{name="sprint_100", x=-200, y=-400, size=45,shape=1,icon="sprint", unlock={"sprint_400","drought_normal"}},
{name="sprint_400", x=-400, y=-400, size=35,shape=1,icon="sprint", unlock={"sprint_1000"}},
{name="sprint_1000", x=-600, y=-400, size=35,shape=1,icon="sprint", unlock={}},
@@ -82,5 +82,6 @@ return{
{name="infinite_dig", x=-1000, y=-600, size=35,shape=1,icon="infinite_dig",unlock={}},
{name="custom_clear", x=200, y=-350, size=45,shape=3,icon="custom", unlock={}},
{name="custom_puzzle", x=200, y=-200, size=45,shape=3,icon="puzzle", unlock={}},
{name="sprintPenta", x=-200, y=-200, size=50,shape=2,icon="sprint", unlock={}},
{name="sprintPenta", x=-200, y=-130, size=40,shape=2,icon="sprint", unlock={}},
{name="sprintMPH", x=-200, y=-270, size=40,shape=2,icon="sprint", unlock={}},
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -64,7 +64,7 @@ function SKIN.load()
I=gc.newImage(N)
else
I=gc.newImage("/image/skin/"..list[1]..".png")
LOG.print("No skin file: "..list[i],color.red)
LOG.print("No skin file: "..list[i],"warn")
end
for j=1,11 do
SKIN.lib[i][j]=C(30,30)

View File

@@ -1,4 +1,3 @@
local gc=love.graphics
local Tick={}
function Tick.finish(P)
P.endCounter=P.endCounter+1

View File

@@ -4,7 +4,7 @@ local S=[=[
那没事了(T6300) 加油啊,钉钉动了的大哥哥(T3228)
弥佑瑶 Alan 幽灵3383
靏鸖龘龘 込余 saki
模电
模电 吃水榴莲
<rmb10+>
八零哥 蕴空之灵 gggf127 dtg ThTsOd
Fireboos 金巧 10元 立斐 Deep_Sea
@@ -16,9 +16,9 @@ local S=[=[
HimuroAki TCV100 tech有养成系统了@7065
HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思
世界沃德 蓝绿 天生的魔法师 琳雨空 T8779.易缄
吃水榴莲 诗情画意 星姐阿夸双推Man暗炎 [*炎]
[*Y] aaa222 [**城] cnDD 红桃老给
昭庭玲秋 旋树墩 火花工作室 Cosine 沁音的芝麻王
诗情画意 星姐阿夸双推Man暗炎 [*炎] [*Y]
aaa222 [**城] cnDD 红桃老给 昭庭玲秋
旋树墩 火花工作室 Cosine 沁音的芝麻王
SuperJH 天上_飞 uiro 宇酱
Thanks!!!
@@ -53,13 +53,15 @@ Future outlook:
mine sweeper
tank battle
find difference
soduku
sodoku
link-link
画图智能画笔
改连击攻击
场地序列一起复制
自定义消行要求(可复制)
健康游戏时间提醒
多语音包系统
自定义游戏支持选择旋转系统(C2,DTET,ASC...)
录像保存/导出
按块回放录像
split判定及效果
工程编译到字节码
游戏内文档
方块散落动画
@@ -71,6 +73,59 @@ Future outlook:
task-Z(新AI)
更多画面效果 & 一些3D小玩意
0.11.0: 谜题更新 Puzzle Update
新内容:
自定义游戏支持复制所有【题目】信息
自定义任务(各种消除),可开关强制完成
自定义游戏设置重新分页+排版
新增显示落块分数
计算器支持小数点和科学计数法
改动:
攻击算法大幅改动
命数超过3使用缩略显示
自定义序列/任务连续同种方块使用缩略显示
软件锁场景层次更改,可以从设置进入
自定义序列中光标位置可循环
修改序列的导出格式
方块透明度改为显示开关
隐形WTF模式会提示玩家打开生成音效,回放场地可见
LOG.print输出字体随屏幕大小变化
debug页面新增复制日志信息和输出屏幕信息
debug模式光标坐标显示必定整数
debug功能键增加
代码:
color模块新增生成随机色,生成彩虹色功能
修复:
修复科研极简+模式不能消四
焦点选择器控件上时按方向键闪退
干旱2进入就报错
O4或I4后游戏崩溃
0.10.11: 自定义游戏更新 Custom-game Update
新内容:
全新自定义游戏设置界面
新模式:MPH竞速
新控件:选择器 (用于调整自定义游戏的选项)
当前方块透明度可调
改动:
小游戏开关排版调整,使用qwer切换选项,增加舒尔特方格特效开关
0next时不显示生成预览
垃圾行缓冲槽显示微调
科研模式目标改为200行攻击
虚拟按键最大尺寸增加
画面设置布局微调
代码:
玩家方法reach_winCheck改为check_lineReach,新增攻击达标检测函数
玩家上次消行信息lastClear属性改为表,包含更多信息
整理并重写部分玩家draw_norm代码
整理游戏设置变量
20G移出gameEnv属性
修复:
修复回放录像时间轴错开一帧
对CC崩溃进行一定保护,游戏可能不会闪退
背景lightning2的方块显示错误
科研模式显示的攻击改为一位小数
0.10.10: 画面优化 Graphics Update
新内容:
超屏视野:场地超高时镜头上移