Compare commits

...

2 Commits

Author SHA1 Message Date
MrZ_26
4da080c6f5 0.8.7 2020-02-14 19:26:57 +08:00
MrZ_26
5f62127f28 0.8.6 2020-02-14 00:22:15 +08:00
79 changed files with 454 additions and 310 deletions

BIN
SFX/enter.ogg Normal file

Binary file not shown.

View File

@@ -1,4 +1,4 @@
gameVersion="Alpha V0.8.5-"
gameVersion="Alpha V0.8.7"
function love.conf(t)
t.identity="Techmino"--Save directory name
t.version="11.1"

View File

@@ -23,29 +23,10 @@ end
-------------------------<Events>-------------------------
local function gameOver()
local M=curMode
if M.score then
local R=M.getRank
if R then
local P=players[1]
local D=M.score(P)
local L=M.records
local p=#L--排名数-1
if p>0 then
::L::
if M.comp(D,L[p])then--是否靠前
p=p-1
if p>0 then
goto L
end
end
end
if p<10 then
if p==0 then
P:showText(text.newRecord,0,-100,100,"beat",.5)
end
ins(L,p+1,D)
if L[11]then L[11]=nil end
saveRecord(M.saveFileName,L)
end
local R=M.getRank(P)--new rank
R=R(P)--new rank
if R then
local r=modeRanks[M.id]--old rank
if R>r then
@@ -57,10 +38,30 @@ local function gameOver()
end
end
end
local D=M.score(P)
local L=M.records
local p=#L--排名数-1
if p>0 then
::L::
if M.comp(D,L[p])then--是否靠前
p=p-1
if p>0 then
goto L
end
end
end
if p<10 then
if p==0 then
P:showText(text.newRecord,0,-100,100,"beat",.5)
end
ins(L,p+1,D)
if L[11]then L[11]=nil end
saveRecord(M.saveFileName,L)
end
end
end
end--Save record
local function die(P)
local function die(P)--Same thing when win/lose,not really die!
P.alive=false
P.control=false
P.timing=false
@@ -76,7 +77,7 @@ local function die(P)
P.visTime[i][j]=min(P.visTime[i][j],20)
end
end
end--Same thing when win/lose/finish
end
Event={}
function Event.reach_winCheck(P)
if P.stat.row>=P.gameEnv.target then

View File

@@ -11,12 +11,19 @@ spin判定:
细节不赘述
攻击系统:
消1/2/3/4攻击0/1/2/4
spin1/2/3攻击2/4/6,若mini则减半
B2B:增加1~2(techrash)/1~3(spin)攻击
B3B:满B2B效果+1额外抵挡
PC:将其它的伤害之和开根号后向上取整,再+6~10(本局内递增)+2额外抵挡
连击:0,0,1,1,2,2,3,3,4,4,3……
普通消除:
1/2/3/4攻击0.25/1.25/2.25/4
特殊消除:
spin1/2/3攻击2/4/6,若mini则减半
B2B:加1(techrash/spin1/spin2)或2(spin3)攻击
B3B:在B2B效果之上再+1攻击和+1额外抵挡
连击:0,0,1,1,2,2,3,3,4,4,3……
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
PC:将上述伤害之和开根号,再+6~10(本局内递增)+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)
根据上述规则计算后,向下取整,攻击打出
分数系统:
玩得越牛逼得分越高嗷(
攻击延迟:
消2/3的攻击生效最快,消四其次,spin攻击生效较慢,高连击生效最慢
@@ -27,13 +34,12 @@ spin判定:
没有用上的额外抵挡会被丢弃,最后剩下的攻击力会发送给对手
back to back(B2B)点数说明:
B2B点数的范围在0~1200
在40及以上特殊消除时B2B,在1000以上特殊消除时B3B,1200封顶
消四+100
空spin加20,不超过1000
spin1~3+50/100/180 (mini*.5)
B2B点数的范围在0~1200,在点数>=40时进行特殊消除为B2B,>1000时特殊消除为B3B
普通消除-250
1000以上空放一块-40(不减到低于1000)
spin1/2/3:+50/100/180(mini减半)
消四:+100
空spin:+20,此法得到的点数不能超过1000
当点数在1000以上时空放一块-40(不减到低于1000)
混战模式说明:
许多玩家同时进行一局游戏对手都是AI,不是真人).随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力.

BIN
font.ttf

Binary file not shown.

View File

@@ -54,7 +54,7 @@ return{
bgm="背景音乐:",
},
customVal={
drop={"[20G]",1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
drop={"0G","1/180G","1/60G","1/40G","1/30G","1/25G","1/20G","1/18G","1/16G","1/14G","1/12G","1/10G","1/9G","1/8G","1/7G","1/6G","1/5G","1/4G","1/3G","1/2G","1G","2G","4G","8G","20G"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
@@ -171,7 +171,7 @@ return{
]],
support="支持作者",
group="官方QQ群",
warning=" 止 私 自 传 播",
warning="止直接传播游戏本体",
WidgetText={
main={
lang="言/A",

View File

@@ -39,7 +39,7 @@ return{
custom="自定义游戏",
customOption={
drop="下落延迟:",
drop="下落速度:",
lock="锁定延迟:",
wait="放块延迟:",
fall="消行延迟:",
@@ -54,7 +54,7 @@ return{
bgm="背景音乐:",
},
customVal={
drop={"[20G]",1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
drop={"0G","1/180G","1/60G","1/40G","1/30G","1/25G","1/20G","1/18G","1/16G","1/14G","1/12G","1/10G","1/9G","1/8G","1/7G","1/6G","1/5G","1/4G","1/3G","1/2G","1G","2G","4G","8G","20G"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
@@ -171,7 +171,7 @@ return{
]],
support="支持作者",
group="官方QQ群",
warning=" 止 私 自 传 播",
warning="止直接传播游戏本体",
WidgetText={
main={
lang="言/A",

View File

@@ -52,7 +52,7 @@ return{
bgm="BGM:",
},
customVal={
drop={"[20G]",1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
drop={"0G","1/180G","1/60G","1/40G","1/30G","1/25G","1/20G","1/18G","1/16G","1/14G","1/12G","1/10G","1/9G","1/8G","1/7G","1/6G","1/5G","1/4G","1/3G","1/2G","1G","2G","4G","8G","20G"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
@@ -170,7 +170,7 @@ Lib used:
]],
support="Support Author",
group="Official QQ Group",
warning="DO NOT DISTRIBUTE",
warning="DO NOT SHARE APP",
WidgetText={
main={
lang="言/A",

View File

@@ -58,7 +58,7 @@ blockColor={
}
sfx={
"welcome",
"click",
"click","enter",
"error","error_long",
--Stereo sfxs(cannot set position)
"button","swipe",
@@ -160,7 +160,7 @@ customID={
"bg","bgm",
}
customRange={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
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},

View File

@@ -9,8 +9,8 @@ local Timer=love.timer.getTime
local int,rnd,max,min=math.floor,math.random,math.max,math.min
local rem=table.remove
package.path="?.lua"
NULL=function()end
package.path="?.lua"--boost
function NULL()end
--Libs
-------------------------------------------------------------
system=sys.getOS()
@@ -51,7 +51,7 @@ kb.setTextInput(false)
ms.setVisible(false)
--Application Vars
-------------------------------------------------------------
customSel={22,22,1,1,7,3,1,1,8,4,1,1,1}
customSel={1,22,1,1,7,3,1,1,8,4,1,1,1}
preField={h=20}
for i=1,10 do preField[i]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}end
for i=11,20 do preField[i]={0,0,0,0,0,0,0,0,0,0}end
@@ -253,13 +253,19 @@ function mouseClick.mode(x,y,k)
local _=cam.sel
if not cam.sel or x<920 then
local __=onMode(x,y)
if __ and _~=__ then
SFX("click")
cam.moving=true
_=modes[__]
cam.x,cam.y=_.x*cam.k+180,_.y*cam.k
if _~=__ then
if __ then
SFX("click")
cam.moving=true
_=modes[__]
cam.x=_.x*cam.k+180
cam.y=_.y*cam.k
cam.sel=__
else
cam.sel=nil
cam.x=cam.x-180
end
end
cam.sel=__
end
cam.keyCtrl=false
end
@@ -470,9 +476,11 @@ function keyDown.setting_key(key)
for y=1,20 do
if setting.keyMap[l][y]==key then
setting.keyMap[l][y]=""
goto L
end
end
end
::L::
setting.keyMap[s.board][s.kb]=key
SFX("reach",.5)
s.kS=false
@@ -515,31 +523,33 @@ function gamepadDown.setting_key(key)
for y=1,20 do
if setting.keyMap[l][y]==key then
setting.keyMap[l][y]=""
goto L
end
end
end
::L::
setting.keyMap[8+s.board][s.js]=key
SFX("reach",.5)
s.jS=false
elseif key=="start"then
s.jS=true
SFX("lock",.5)
elseif key=="up"then
elseif key=="dpup"then
if s.js>1 then
s.js=s.js-1
SFX("move",.5)
end
elseif key=="down"then
elseif key=="dpdown"then
if s.js<20 then
s.js=s.js+1
SFX("move",.5)
end
elseif key=="left"then
elseif key=="dpleft"then
if s.board>1 then
s.board=s.board-1
SFX("rotate",.5)
end
elseif key=="right"then
elseif key=="dpright"then
if s.board<8 then
s.board=s.board+1
SFX("rotate",.5)
@@ -647,7 +657,7 @@ function touchMove.play(id,x,y,dx,dy)
end
end
function keyDown.play(key)
if key=="escape"and not scene.swapping then
if key=="escape"then
(frame<180 and back or pauseGame)()
return
end
@@ -745,7 +755,7 @@ local function widgetControl_key(i)
widget_sel=select(2,next(Widget[scene.cur]))
end
elseif i=="space"or i=="return"then
if not scene.swapping and widget_sel then
if widget_sel then
widgetPress(widget_sel)
end
elseif i=="left"or i=="right"then
@@ -769,10 +779,8 @@ local function widgetControl_gamepad(i)
widget_sel=select(2,next(Widget[scene.cur]))
end
elseif i=="start"then
if not scene.swapping and widget_sel then
if not scene.swapping and widget_sel then
widgetPress(widget_sel)
end
if widget_sel then
widgetPress(widget_sel)
end
elseif i=="dpleft"or i=="dpright"then
if widget_sel then
@@ -789,26 +797,27 @@ local function widgetControl_gamepad(i)
end
local lastX,lastY--last clickDown pos
function love.mousepressed(x,y,k,t,num)
if devMode>0 then print(x,y)end
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
if devMode>0 then print(mx,my)end
if t or scene.swapping then return end
if mouseDown[scene.cur]then
mouseDown[scene.cur](mx,my,k)
elseif k==2 then
scene.back()
end
if k==1 then
if widget_sel and not scene.swapping then
if widget_sel then
widgetPress(widget_sel,mx,my)
end
end
lastX=mx
lastY=my
mouseShow=true
end
function love.mousemoved(x,y,dx,dy,t)
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
if t or scene.swapping then return end
dx,dy=dx/scr.k,dy/scr.k
if mouseMove[scene.cur]then
mouseMove[scene.cur](mx,my,dx,dy)
@@ -824,11 +833,10 @@ function love.mousemoved(x,y,dx,dy,t)
end
end
end
mouseShow=true
end
function love.mousereleased(x,y,k,t,num)
if t then return end
mx,my=xOy:inverseTransformPoint(x,y)
if t or scene.swapping then return end
if mouseUp[scene.cur]then
mouseUp[scene.cur](mx,my,k)
end
@@ -837,11 +845,13 @@ function love.mousereleased(x,y,k,t,num)
end
end
function love.wheelmoved(x,y)
if scene.swapping then return end
if wheelMoved[scene.cur]then wheelMoved[scene.cur](x,y)end
end
function love.touchpressed(id,x,y)
mouseShow=false
if scene.swapping then return end
if not touching then
touching=id
love.touchmoved(id,x,y,0,0)
@@ -853,6 +863,7 @@ function love.touchpressed(id,x,y)
end
end
function love.touchmoved(id,x,y,dx,dy)
if scene.swapping then return end
x,y=xOy:inverseTransformPoint(x,y)
if touchMove[scene.cur]then
touchMove[scene.cur](id,x,y,dx/scr.k,dy/scr.k)
@@ -873,10 +884,11 @@ function love.touchmoved(id,x,y,dx,dy)
end
end
function love.touchreleased(id,x,y)
if scene.swapping then return end
x,y=xOy:inverseTransformPoint(x,y)
if id==touching then
touching=nil
if widget_sel and not scene.swapping then
if widget_sel then
widgetPress(widget_sel,x,y)
end
widget_sel=nil
@@ -890,6 +902,7 @@ function love.touchreleased(id,x,y)
end
function love.keypressed(i)
mouseShow=false
if scene.swapping then return end
if i=="f8"then devMode=0
elseif i=="f9"then devMode=1
elseif i=="f10"then devMode=2
@@ -926,6 +939,7 @@ function love.keypressed(i)
end
end
function love.keyreleased(i)
if scene.swapping then return end
if keyUp[scene.cur]then keyUp[scene.cur](i)end
end
@@ -939,6 +953,7 @@ local keyMirror={
}
function love.gamepadpressed(joystick,i)
mouseShow=false
if scene.swapping then return end
if gamepadDown[scene.cur]then gamepadDown[scene.cur](i)
elseif keyDown[scene.cur]then keyDown[scene.cur](keyMirror[i]or i)
elseif i=="back"then scene.back()
@@ -946,6 +961,7 @@ function love.gamepadpressed(joystick,i)
end
end
function love.gamepadreleased(joystick,i)
if scene.swapping then return end
if gamepadUp[scene.cur]then gamepadUp[scene.cur](i)
end
end
@@ -1170,8 +1186,6 @@ function love.run()
for N,a,b,c,d,e in POLL()do
if N=="quit"then
destroyPlayers()
saveStat()
saveSetting()
goto END
elseif love[N]then
love[N](a,b,c,d,e)
@@ -1206,7 +1220,7 @@ local F=love.filesystem
if F.getInfo("data")then
F.write("data.dat",F.read("data"))
F.remove("data")
end
end
if F.getInfo("userdata")then
F.write("data.dat",F.read("userdata"))
F.remove("userdata")
@@ -1223,7 +1237,6 @@ end
FILE={
data=F.newFile("data.dat"),
setting=F.newFile("setting.dat"),
vk=F.newFile("vk"),
}
if F.getInfo("data.dat")then loadStat()end
if F.getInfo("setting.dat")then
@@ -1234,5 +1247,5 @@ else
setting.VKSwitch=false
end
math.randomseed(os.time()*626)
swapLanguage(setting.lang)
changeLanguage(setting.lang)
changeBlockSkin(setting.skin)

View File

@@ -42,7 +42,7 @@ return{
Event.win(P,"finish")
end
end,
arr=1,
minarr=1,
bg="game3",bgm="shining terminal",
},
load=function()
@@ -63,6 +63,6 @@ return{
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
getRank=function(P)
local P=P.modeData.point
return P==80 and 5 or P>=70 and 4 or P>=60 and 3 or P>=40 and 2 or P>=20 and 1
return P==80 and 5 or P>=70 and 4 or P>=60 and 3 or P>=40 and 2 or P>=20 and 1 or P>=5 and 0
end,
}

View File

@@ -67,6 +67,6 @@ return{
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modedata.event
return W>100 and 4 or W>=80 and 3 or W>=50 and 2 or W>=20 and 1
return W>100 and 4 or W>=80 and 3 or W>=50 and 2 or W>=20 and 1 or W>=5 and 0
end,
}

View File

@@ -80,6 +80,6 @@ return{
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
local W=P.modedata.event
return W>40 and 4 or W>=30 and 3 or W>=20 and 2 or W>=10 and 1
return W>40 and 4 or W>=30 and 3 or W>=20 and 2 or W>=10 and 1 or W>=5 and 0
end,
}

View File

@@ -34,11 +34,11 @@ return{
mStr(P.stat.clear_4,-82,340)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
if L==200 then
if L>=200 then
local T=P.stat.time
return
T<=140 and 5 or
@@ -48,7 +48,8 @@ return{
return
L>=150 and 3 or
L>=100 and 2 or
L>=40 and 1
L>=40 and 1 or
L>=1 and 0
end
end,
}

View File

@@ -36,11 +36,11 @@ return{
mStr(P.stat.clear_4,-82,340)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
if L==200 then
if L>=200 then
local T=P.stat.time
return
T<=150 and 5 or
@@ -50,7 +50,8 @@ return{
return
L>=150 and 3 or
L>=90 and 2 or
L>=40 and 1
L>=40 and 1 or
L>=1 and 0
end
end,
}

View File

@@ -36,11 +36,11 @@ return{
mStr(P.stat.clear_4,-82,340)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
if L==200 then
if L>=200 then
local T=P.stat.time
return
T<=180 and 5 or
@@ -50,7 +50,8 @@ return{
return
L>=150 and 3 or
L>=100 and 2 or
L>=40 and 1
L>=40 and 1 or
L>=1 and 0
end
end,
}

View File

@@ -35,11 +35,11 @@ return{
mStr(P.stat.clear_4,-82,340)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
if L==200 then
if L>=200 then
local T=P.stat.time
return
T<=150 and 5 or
@@ -49,7 +49,8 @@ return{
return
L>=150 and 3 or
L>=100 and 2 or
L>=40 and 1
L>=40 and 1 or
L>=1 and 0
end
end,
}

View File

@@ -37,15 +37,16 @@ return{
mStr(P.stat.clear_4,-82,340)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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>=200 and 5 or
L>=100 and 4 or
L>=50 and 3 or
L>=26 and 2 or
L>=10 and 1
L>=10 and 1 or
L>=1 and 0
end,
}

View File

@@ -80,7 +80,8 @@ return{
return
L>=70 and 3 or
L>=40 and 2 or
L>=20 and 1
L>=20 and 1 or
L>=5 and 0
end
end,
}

View File

@@ -78,7 +78,8 @@ return{
else
return
L>=60 and 2 or
L>=30 and 1
L>=30 and 1 or
L>=10 and 0
end
end,
}

View File

@@ -54,7 +54,7 @@ return{
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.stat.row,P.stat.score}end,
scoreDisp=function(D)return D[1].." Rows "..D[2]end,
scoreDisp=function(D)return D[1].." Lines "..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
@@ -63,6 +63,7 @@ return{
L>=191 and 4 or
L>=110 and 3 or
L>=50 and 2 or
L>=2 and 1
L>=5 and 1 or
L>=1 and 0
end,
}

View File

@@ -73,6 +73,7 @@ return{
W>=80 and 4 or
W>=55 and 3 or
W>=30 and 2 or
W>=20 and 1
W>=20 and 1 or
L>=5 and 0
end,
}

View File

@@ -73,6 +73,7 @@ return{
W>=100 and 4 or
W>=70 and 3 or
W>=40 and 2 or
W>=10 and 1
W>=10 and 1 or
L>=3 and 0
end,
}

View File

@@ -40,7 +40,7 @@ return{
mDraw(drawableText.wave,-82,375)
end,
score=function(P)return{P.modeData.event,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Rows"end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"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 W=P.modeData.event
@@ -49,6 +49,7 @@ return{
W>=110 and 4 or
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1
W>=20 and 1 or
L>=5 and 0
end,
}

View File

@@ -39,7 +39,7 @@ return{
mDraw(drawableText.wave,-82,375)
end,
score=function(P)return{P.modeData.event,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Rows"end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"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 W=P.modeData.event
@@ -48,6 +48,7 @@ return{
W>=100 and 4 or
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1
W>=20 and 1 or
L>=5 and 0
end,
}

View File

@@ -32,16 +32,22 @@ return{
mStr(R>=0 and R or 0,-82,280)
end,
score=function(P)return{P.stat.row<=100 and P.stat.row or 100,P.stat.time}end,
scoreDisp=function(D)return D[1].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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)
if P.stat.row<100 then return end
local T=P.stat.time
return
T<=70 and 5 or
T<=110 and 4 or
T<=160 and 3 or
T<=240 and 2 or
1
local L=P.stat.row
if L>=100 then
local T=P.stat.time
return
T<=70 and 5 or
T<=110 and 4 or
T<=160 and 3 or
T<=240 and 2 or
1
else
return
L>=50 and 1 or
L>=10 and 0
end
end,
}

View File

@@ -32,16 +32,22 @@ return{
mStr(R>=0 and R or 0,-82,280)
end,
score=function(P)return{P.stat.row<=100 and P.stat.row or 100,P.stat.time}end,
scoreDisp=function(D)return D[1].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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)
if P.stat.row<100 then return end
local T=P.stat.time
return
T<=65 and 5 or
T<=100 and 4 or
T<=145 and 3 or
T<=220 and 2 or
1
local L=P.stat.row
if L>=100 then
local T=P.stat.time
return
T<=65 and 5 or
T<=100 and 4 or
T<=145 and 3 or
T<=220 and 2 or
1
else
return
L>=50 and 1 or
L>=10 and 0
end
end,
}

View File

@@ -41,6 +41,7 @@ return{
L>=1500 and 4 or
L>=1000 and 3 or
L>=500 and 2 or
L>=100 and 1
L>=100 and 1 or
L>=20 and 0
end,
}

View File

@@ -49,7 +49,7 @@ return{
mDraw(drawableText.eff,-82,475)
end,
score=function(P)return{P.modeData.point}end,
scoreDisp=function(D)return D[1].." Rows"end,
scoreDisp=function(D)return D[1].." Lines"end,
comp=function(a,b)return a[1]>b[1]end,
getRank=function(P)
local L=P.modeData.point
@@ -58,6 +58,7 @@ return{
L>=400 and 4 or
L>=200 and 3 or
L>=100 and 2 or
L>=10 and 1
L>=40 and 1 or
L>=5 and 0
end,
}

View File

@@ -1,7 +1,16 @@
local gc=love.graphics
local function check(P)
if P.stat.row>=200 then
Event.win(P,"finish")
if P.stat.row>=P.gameEnv.target then
local T=P.gameEnv.target
if T==50 then
P.gameEnv.drop=.25
P.gameEnv.target=100
elseif T==100 then
P.gameEnv._20G=true
P.gameEnv.target=200
else
Event.win(P,"finish")
end
end
end
@@ -23,8 +32,9 @@ return{
},
color=color.magenta,
env={
_20G=true,fall=15,
dropPiece=check,
drop=.5,fall=30,
target=50,dropPiece=check,
mindas=7,minarr=1,
bg="strap",bgm="race",
},
load=function()
@@ -33,24 +43,25 @@ return{
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(200,-82,370)
mStr(P.gameEnv.target,-82,370)
gc.rectangle("fill",-125,375,90,4)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
if L==200 then
if L>=200 then
local T=P.stat.time
return
T<=200 and 5 or
T<=260 and 4 or
T<=270 and 4 or
3
else
return
L>=100 and 2 or
L>=50 and 1
L>=50 and 1 or
L>=10 and 0
end
end,
}

View File

@@ -1,15 +1,14 @@
local gc=love.graphics
local marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0}
local dropSpeed={[0]=60,50,40,30,25,20,15,12,9,7,5,4,3,2,1,1,.5,.5,.25,.25}
local function check_LVup(P)
local T=P.modeData.point+10
if P.stat.row>=T then
if T==200 then
Event.win(P,"finish")
else
P.gameEnv.drop=marathon_drop[T/10]
if T==180 then P.gameEnv._20G=true end
SFX("reach")
P.gameEnv.drop=dropSpeed[T/10]
P.modeData.point=T
SFX("reach")
end
end
end
@@ -32,8 +31,9 @@ return{
},
color=color.green,
env={
drop=60,fall=20,
fall=30,
target=10,dropPiece=check_LVup,
mindas=7,minarr=1,
bg="strap",bgm="way",
},
load=function()
@@ -46,20 +46,21 @@ return{
gc.rectangle("fill",-125,375,90,4)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
if L==200 then
if L>=200 then
local T=P.stat.time
return
T<=180 and 5 or
T<=240 and 4 or
T<=185 and 5 or
T<=250 and 4 or
3
else
return
L>=150 and 2 or
L>=100 and 1
L>=100 and 1 or
L>=20 and 0
end
end,
}

View File

@@ -55,7 +55,7 @@ return{
wait=death_wait[1],
fall=death_fall[1],
dropPiece=score,
das=6,arr=1,
mindas=6,minarr=1,
freshLimit=15,
bg="game2",bgm="secret7th",
},
@@ -85,7 +85,8 @@ return{
return
S>=426 and 3 or
S>=326 and 2 or
S>=226 and 1
S>=226 and 1 or
S>=50 and 0
end
end,
}

View File

@@ -89,7 +89,8 @@ return{
return
S>=420 and 3 or
S>=250 and 2 or
S>=120 and 1
S>=120 and 1 or
L>=30 and 0
end
end,
}

View File

@@ -54,7 +54,7 @@ return{
_20G=true,lock=12,
wait=10,fall=10,
dropPiece=score,
das=5,arr=1,
mindas=5,minarr=1,
freshLimit=15,
easyFresh=false,bone=true,
bg="none",bgm="shining terminal",
@@ -79,6 +79,7 @@ return{
S>=800 and 4 or
S>=600 and 3 or
S>=400 and 2 or
S>=200 and 1
S>=200 and 1 or
L>=50 and 0
end,
}

View File

@@ -52,6 +52,7 @@ return{
L>=13 and 4 or
L>=10 and 3 or
L>=7 and 2 or
L>=4 and 1
L>=4 and 1 or
L>=1 and 0
end,
}

View File

@@ -52,6 +52,7 @@ return{
L>=12 and 4 or
L>=9 and 3 or
L>=6 and 2 or
L>=3 and 1
L>=3 and 1 or
L>=1 and 0
end,
}

View File

@@ -51,6 +51,7 @@ return{
L>=20 and 4 or
L>=16 and 3 or
L>=13 and 2 or
L>=10 and 1
L>=10 and 1 or
L>=1 and 0
end,
}

View File

@@ -109,6 +109,7 @@ return{
L>=40 and 4 or
L>=30 and 3 or
L>=20 and 2 or
L>=10 and 1
L>=10 and 1 or
L>=1 and 0
end,
}

View File

@@ -92,6 +92,7 @@ return{
L>=60 and 4 or
L>=40 and 3 or
L>=25 and 2 or
L>=15 and 1
L>=15 and 1 or
L>=1 and 0
end,
}

View File

@@ -28,7 +28,7 @@ return{
},
color=color.cyan,
env={
drop=60,lock=60,
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",

View File

@@ -28,7 +28,7 @@ return{
},
color=color.green,
env={
drop=60,lock=60,
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",

View File

@@ -28,7 +28,7 @@ return{
},
color=color.magenta,
env={
drop=60,lock=60,
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",

View File

@@ -28,7 +28,7 @@ return{
},
color=color.red,
env={
drop=60,lock=60,
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",

View File

@@ -28,7 +28,7 @@ return{
},
color=color.lightYellow,
env={
drop=60,lock=60,
drop=1e99,lock=1e99,
oncehold=false,
dropPiece=update_round,
bg="game2",bgm="push",

View File

@@ -48,6 +48,7 @@ return{
T<=10 and 4 or
T<=25 and 3 or
T<=40 and 2 or
T<=60 and 1
T<=60 and 1 or
0
end,
}

View File

@@ -48,6 +48,7 @@ return{
T<=90 and 4 or
T<=130 and 3 or
T<=200 and 2 or
T<=270 and 1
T<=270 and 1 or
0
end,
}

View File

@@ -48,6 +48,7 @@ return{
T<=1000 and 4 or
T<=1400 and 3 or
T<=2200 and 2 or
T<=3000 and 1
T<=3000 and 1 or
0
end,
}
}

View File

@@ -48,6 +48,7 @@ return{
T<=18 and 4 or
T<=45 and 3 or
T<=70 and 2 or
T<=100 and 1
T<=100 and 1 or
0
end,
}

View File

@@ -47,7 +47,8 @@ return{
T<=25 and 5 or
T<=32 and 4 or
T<=40 and 3 or
T<=60 and 2 or
T<=100 and 1
T<=62 and 2 or
T<=126 and 1 or
0
end,
}

View File

@@ -48,6 +48,7 @@ return{
T<=330 and 4 or
T<=420 and 3 or
T<=626 and 2 or
T<=1000 and 1
T<=1000 and 1 or
0
end,
}

View File

@@ -19,7 +19,6 @@ return{
env={
drop=30,lock=45,
freshLimit=10,
visible="time",
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
@@ -54,6 +53,7 @@ return{
W>=60 and 4 or
W>=45 and 3 or
W>=30 and 2 or
W>=15 and 1
W>=15 and 1 or
W>=5 and 0
end,
}

View File

@@ -19,7 +19,6 @@ return{
env={
drop=30,lock=45,
freshLimit=10,
visible="time",
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
@@ -59,6 +58,7 @@ return{
W>=60 and 4 or
W>=45 and 3 or
W>=30 and 2 or
W>=15 and 1
W>=15 and 1 or
W>=5 and 0
end,
}

View File

@@ -19,7 +19,6 @@ return{
env={
drop=30,lock=45,
freshLimit=10,
visible="time",
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
@@ -55,6 +54,7 @@ return{
W>=80 and 4 or
W>=55 and 3 or
W>=30 and 2 or
W>=15 and 1
W>=15 and 1 or
W>=5 and 0
end,
}

View File

@@ -19,7 +19,6 @@ return{
env={
drop=30,lock=45,
freshLimit=10,
visible="time",
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
@@ -59,6 +58,7 @@ return{
W>=55 and 4 or
W>=45 and 3 or
W>=30 and 2 or
W>=15 and 1
W>=15 and 1 or
W>=5 and 0
end,
}

View File

@@ -58,6 +58,7 @@ return{
W>=26 and 4 or
W>=20 and 3 or
W>=10 and 2 or
W>=5 and 1
W>=5 and 1 or
W>=1 and 0
end,
}

View File

@@ -1,3 +1,4 @@
local format=string.format
local function tech_check_ultimate(P)
if #P.cleared>0 and P.lastClear<10 or P.lastClear==74 then
Event.lose(P)
@@ -39,15 +40,16 @@ return{
mDraw(drawableText.eff,-82,475)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
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
end,
}

View File

@@ -1,3 +1,4 @@
local format=string.format
local function tech_check_easy(P)
if #P.cleared>0 and P.b2b<40 then
Event.lose(P)
@@ -39,15 +40,16 @@ return{
mDraw(drawableText.eff,-82,475)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
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
end,
}

View File

@@ -1,3 +1,4 @@
local format=string.format
local function tech_check_ultimate(P)
if #P.cleared>0 and P.lastClear<10 or P.lastClear==74 then
Event.lose(P)
@@ -39,15 +40,16 @@ return{
mDraw(drawableText.eff,-82,475)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
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
end,
}

View File

@@ -1,3 +1,4 @@
local format=string.format
local function tech_check_hard(P)
if #P.cleared>0 and P.lastClear<10 then
Event.lose(P)
@@ -39,15 +40,16 @@ return{
mDraw(drawableText.eff,-82,475)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
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
end,
}

View File

@@ -1,3 +1,4 @@
local format=string.format
local function tech_check_ultimate(P)
if #P.cleared>0 and P.lastClear<10 or P.lastClear==74 then
Event.lose(P)
@@ -39,15 +40,16 @@ return{
mDraw(drawableText.eff,-82,475)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
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
end,
}

View File

@@ -1,3 +1,4 @@
local format=string.format
local function tech_check_easy(P)
if #P.cleared>0 and P.b2b<40 then
Event.lose(P)
@@ -39,15 +40,16 @@ return{
mDraw(drawableText.eff,-82,475)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
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
end,
}

View File

@@ -1,3 +1,4 @@
local format=string.format
local function tech_check_ultimate(P)
if #P.cleared>0 and P.lastClear<10 or P.lastClear==74 then
Event.lose(P)
@@ -40,15 +41,16 @@ return{
mDraw(drawableText.eff,-82,475)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
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
end,
}

View File

@@ -1,3 +1,4 @@
local format=string.format
local function tech_check_hard(P)
if #P.cleared>0 and P.lastClear<10 then
Event.lose(P)
@@ -40,15 +41,16 @@ return{
mDraw(drawableText.eff,-82,475)
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].." Rows "..toTime(D[2])end,
scoreDisp=function(D)return D[1].." Lines "..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
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
end,
}

View File

@@ -96,6 +96,7 @@ return{
R<=3 and 4 or
R<=5 and 3 or
R<=10 and 2 or
R<=15 and 1
R<=15 and 1 or
R<=45 and 0
end,
}

View File

@@ -96,6 +96,7 @@ return{
R==2 and 4 or
R<=4 and 3 or
R<=6 and 2 or
R<=8 and 1
R<=8 and 1 or
R<=45 and 0
end,
}

View File

@@ -96,6 +96,7 @@ return{
R==2 and 4 or
R==3 and 3 or
R==4 and 2 or
R<=6 and 1
R<=6 and 1 or
R<=45 and 0
end,
}

View File

@@ -96,6 +96,7 @@ return{
R<=3 and 4 or
R<=6 and 3 or
R<=10 and 2 or
R<=20 and 1
R<=20 and 1 or
R<=90 and 0
end,
}

View File

@@ -96,6 +96,7 @@ return{
R<=3 and 4 or
R<=6 and 3 or
R<=8 and 2 or
R<=10 and 1
R<=10 and 1 or
R<=90 and 0
end,
}

View File

@@ -96,6 +96,7 @@ return{
R==2 and 4 or
R==3 and 3 or
R<=5 and 2 or
R<=7 and 1
R<=7 and 1 or
R<=90 and 0
end,
}

View File

@@ -41,7 +41,7 @@ return{
mDraw(drawableText.tsd,-82,407)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return"NO."..D[1]" KO:"..D[2]end,
scoreDisp=function(D)return"NO."..D[1].." KO:"..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 T=P.modeData.event
@@ -50,6 +50,7 @@ return{
T>=20 and 4 or
T>=15 and 3 or
T>=10 and 2 or
T>=6 and 1
T>=6 and 1 or
T>=1 and 0
end,
}

View File

@@ -41,7 +41,7 @@ return{
mDraw(drawableText.tsd,-82,407)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return"NO."..D[1]" KO:"..D[2]end,
scoreDisp=function(D)return"NO."..D[1].." KO:"..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 T=P.modeData.event
@@ -50,6 +50,7 @@ return{
T>=19 and 4 or
T>=16 and 3 or
T>=13 and 2 or
T>=10 and 1
T>=10 and 1 or
T>=1 and 0
end,
}

View File

@@ -41,7 +41,7 @@ return{
mDraw(drawableText.tsd,-82,407)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return"NO."..D[1]" KO:"..D[2]end,
scoreDisp=function(D)return"NO."..D[1].." KO:"..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 T=P.modeData.event
@@ -50,6 +50,7 @@ return{
T>=18 and 4 or
T>=16 and 3 or
T>=14 and 2 or
T>=12 and 1
T>=12 and 1 or
T>=1 and 0
end,
}

View File

@@ -35,10 +35,10 @@ return{
getRank=function(P)
local T=P.stat.score
return
T>=1e5 and 5 or
T>=8e4 and 4 or
T>=5e4 and 3 or
T>=2e4 and 2 or
T>=12e4 and 5 or
T>=10e4 and 4 or
T>=6e4 and 3 or
T>=3e4 and 2 or
T>=1e4 and 1
end,
}

View File

@@ -213,7 +213,7 @@ function Pnt.mode()
local M=MM[_]
if R[_]then
gc.setLineWidth(8)
gc.setColor(1,1,1,.15)
gc.setColor(1,1,1,.2)
for _=1,#M.unlock do
local m=M.unlock[_]
if R[m]then
@@ -223,8 +223,8 @@ function Pnt.mode()
end
local S=M.size
local d=((M.x-(cam.x1-180)/cam.k1)^2+(M.y-cam.y1/cam.k1)^2)^.5
if d<600 then S=S*(1.3-d*0.0005) end
local d=((M.x-(cam.x1+(cam.sel and -180 or 0))/cam.k1)^2+(M.y-cam.y1/cam.k1)^2)^.55
if d<500 then S=S*(1.25-d*0.0005) end
gc.setColor(modeRankColor[modeRanks[M.id]])
if M.shape==1 then--Rectangle
gc.rectangle("fill",M.x-S,M.y-S,2*S,2*S)

View File

@@ -27,6 +27,7 @@ local gameEnv0={
freshLimit=1e99,easyFresh=true,
fine=false,fineKill=false,
target=1e99,dropPiece=NULL,
mindas=0,minarr=0,
bg="none",bgm="race"
}
local renATK={[0]=0,0,0,1,1,2,2,3,3,4,4}--3 else
@@ -41,9 +42,10 @@ local spinSCR={--[blockName][row]
{250,800,1500},--T
{300,1000,2200},--O
{300,1000,1800},--I
}--MUL:1.2,2.0
--Techrash:1K;MUL:1.3,1.8
--Mini*=.5
}
--B2BMUL:1.2/2.0
--Techrash:1K;MUL:1.3/1.8
--Mini*=.6
local visible_opt={show=1e99,time=300,fast=20,none=5}
local reAtk={0,0,1,1,1,2,2,3,3}
local reDef={0,1,1,2,3,3,4,4,5}
@@ -724,11 +726,23 @@ function player.update(P,dt)
goto stop
end
if P.curY~=P.y_img then
if P.dropDelay>=0 then
P.dropDelay=P.dropDelay-1
if P.dropDelay>0 then goto stop end
local D=P.dropDelay
if D>1 then
P.dropDelay=D-1
goto stop
end
if D==1 then
P.curY=P.curY-1
else
local _=P.curY-P.y_img--max fall dist
D=1/D--fall dist
if D<_ then
P.curY=P.curY-D
assert(P.curY==int(P.curY),"y:"..P.curY.." fall:"..D.." D_env:"..P.gameEnv.drop)
else
P.curY=P.y_img
end
end
P.curY=P.curY-1
P.spinLast=false
if P.y_img~=P.curY then
P.dropDelay=P.gameEnv.drop
@@ -1507,7 +1521,7 @@ function player.drop(P)--Place piece
P:showText(text.mini,0,-80,35,"appear")
send=send*.5
sendTime=sendTime+60
cscore=cscore*.5
cscore=cscore*.6
P.b2b=P.b2b+b2bPoint[cc]*.5
if P.human then
VOICE("mini",CHN)
@@ -1524,7 +1538,7 @@ function player.drop(P)--Place piece
elseif #P.field>0 then
P.b2b=max(P.b2b-250,0)
P:showText(text.clear[cc],0,-30,27+cc*3,"appear",(8-cc)*.3)
send=cc-1
send=cc-.75
sendTime=20+send*20
cscore=cscore+clearSCR[cc]
P.lastClear=cc
@@ -1542,7 +1556,7 @@ function player.drop(P)--Place piece
end
if #P.field==0 then
P:showText(text.PC,0,-80,50,"flicker")
send=ceil(send^.5)+min(6+P.stat.pc,10)
send=send^.5+min(6+P.stat.pc,10)
exblock=exblock+2
sendTime=sendTime+60
if P.stat.row>4 then
@@ -2100,6 +2114,9 @@ function newPlayer(id,x,y,size,AIdata)
P.gameEnv[k]=v
end
end--reset current game settings
P.gameEnv.das=max(P.gameEnv.das,P.gameEnv.mindas)
P.gameEnv.arr=max(P.gameEnv.arr,P.gameEnv.minarr)
P.cur={bk={{}},id=0,color=0,name=0}--shape,shapeID,colorID,nameID
P.sc,P.dir,P.r,P.c={0,0},0,0,0--spinCenter,direction,row,col
P.curX,P.curY,P.y_img=0,0,0--x,y,ghostY

View File

@@ -47,10 +47,16 @@ local sceneInit={
end
end,
mode=function()
curBG="none"
curBG="glow"
BGM("blank")
destroyPlayers()
mapCam.zoomK=scene.swap.tar=="mode"and 5 or 1
local cam=mapCam
cam.zoomK=scene.swap.tar=="mode"and 5 or 1
if cam.sel then
local M=modes[cam.sel]
cam.x,cam.y=M.x*cam.k+180,M.y*cam.k
cam.x1,cam.y1=cam.x,cam.y
end
end,
custom=function()
sceneTemp=1--option select
@@ -236,7 +242,8 @@ function scene.push(tar,style)
end
end
function scene.pop()
scene.seq={}
local _=scene.seq
_[#_-1]=nil
end
function scene.swapTo(tar,style)
local S=scene.swap
@@ -253,15 +260,13 @@ function scene.swapTo(tar,style)
end
end
function scene.back()
if not scene.swapping then
if backFunc[scene.cur] then backFunc[scene.cur]()end
--func when scene end
local m=#scene.seq
if m>0 then
scene.swapTo(scene.seq[m-1],scene.seq[m])
scene.seq[m],scene.seq[m-1]=nil
--Poll&Back to preScene
end
if backFunc[scene.cur] then backFunc[scene.cur]()end
--func when scene end
local m=#scene.seq
if m>0 then
scene.swapTo(scene.seq[m-1],scene.seq[m])
scene.seq[m],scene.seq[m-1]=nil
--Poll&Back to preScene
end
end
return scene

View File

@@ -20,12 +20,12 @@ end
function toTime(s)
if s<60 then
return format("%.2fs",s)
return format("%.3f",s)
elseif s<3600 then
return format("%dm%.2fs",int(s/60),s%60)
return format("%d:%.2f",int(s/60),s%60)
else
local h=int(s/3600)
return format("%dh%dm%.2fs",h,int(s-h/60),s%60)
return format("%d:%d:%.2f",h,int(s-h/60),s%60)
end
end
function mStr(s,x,y)
@@ -95,7 +95,7 @@ local drawableTextLoad={
"noScore",
"highScore",
}
function swapLanguage(l)
function changeLanguage(l)
text=require("language/"..langID[l])
for S,L in next,Widget do
for N,W in next,L do
@@ -145,53 +145,65 @@ function restoreVirtualKey()
end
function copyBoard()
local str=""
for y=1,20 do
local H=20
for y=20,1,-1 do
for x=1,10 do
if preField[y][x]~=0 then
H=y
goto L
end
end
end
::L::
for y=1,H do
local L=""
for x=1,10 do
local s=preField[y][x]
if s>7 then s=s-1 end
L=L..char(66+s)
end
str=str..L.."\n"
-- str=str..L.."\n"
end
love.system.setClipboardText("Techmino sketchpad:\n"..str)
love.system.setClipboardText("Techmino sketchpad:"..str)
TEXT(text.copySuccess,350,360,40,"appear",.5)
end
function pasteBoard()
local str=love.system.getClipboardText()
local len=#str
local s,p,P,_=0,1,10--sum,pStr,pField
if sub(str,1,20)=="Techmino sketchpad:\n"then
p=21
else
p=find(str,":")
if p then
p=p+1
else
p=find(str,"[A-N]")
end
end
::L1::
_=byte(str,p)
if _<65 or _>78 then
local _
local p,P=1,10--sum,pStr,pField(r*10+(c-1))
p=find(str,":")
if p then
p=p+1
goto L1
end
::L2::
if s==200 then return end
if p>len then
if s~=200 then
else
p=find(str,"[A-N]")
if not p then
goto E
end
end
_=byte(sub(str,p))-66
end--int p*//head
::L::
_=byte(str,p)
if P==210 then
return
elseif not _ then
if P%10~=0 then
goto E
else
return
end
end--end check
_=_-66
if _<-1 or _>12 then
p=p+1
goto L
end--skip illegal char
if _>-2 and _<13 then
if _>7 then _=_+1 end
preField[int(P/10)][P%10+1]=_
s,P=s+1,P+1
P=P+1
end
p=p+1
goto L2
goto L
::E::
TEXT(text.dataCorrupted,350,360,35,"flicker",.5)
end
@@ -305,6 +317,7 @@ function loadGame(M)
drawableText.levelName:set(M.level[lang])
needResetGameData=true
scene.swapTo("play","fade_togame")
SFX("enter")
end
function resetPartGameData()
gameResult=false
@@ -614,8 +627,8 @@ function saveSetting()
F:flush()
F:close()
if _ then
TEXT(text.settingSaved,640,360,80,"appear")
TEXT(text.settingSaved,370,330,30,"appear")
else
TEXT(text.settingSavingError..mes,640,360,40,"appear",.4)
TEXT(text.settingSavingError.."123",370,350,20,"appear",.3)
end
end

View File

@@ -1,6 +1,3 @@
--[[
big bang未完成
]]
local S=[=[
Patron(rmb10+):
Fireboos
@@ -34,13 +31,27 @@ Future outlook:
auto GUI position in any screen size
more FXs & 3d features & animations
Encrypt source code(compile to byte code)
0.8.7:
better user experience in mode selecting
support 2^n G falling speed
speed of marathon mode changed
shorter clipboard string(when air above)
attack system/score system little changed
bugs fixed(rank system,some mode error when enter)(again!)
0.8.6:
gamepad can adjust key
add SFX when enter game
map GUI little adjusted
event system little changed(no ctrl when scene swapping)
bugs fixed(rank system,some mode error when enter)
0.8.5-:
mode map!Brandly new GUI for mode selecting
mode unlock system,not that scary for noob
every mode has rank calculating method(may some mistakes/inappropriate number)
save 10 best recoreds for each mode
can save/share custom map now
new mode:Big Bang
button appearance changed
better widget performence
many bug fixed
0.8.4:

View File

@@ -73,11 +73,11 @@ local virtualkeySet={
},--PC key feedback(top&in a row)
}
local customSet={
{20,20,1,1,7,1,1,1,3,4,1,2,3},
{18,20,1,1,7,1,1,1,8,3,8,3,3},
{22,22,1,1,7,3,1,1,8,4,1,7,7},
{20,20,1,1,7,1,1,3,8,3,1,7,8},
{1,11,8,11,4,1,2,1,8,3,1,4,9},
{3,20,1,1,7,1,1,1,3,4,1,2,3},
{5,20,1,1,7,1,1,1,8,3,8,3,3},
{1,22,1,1,7,3,1,1,8,4,1,7,7},
{3,20,1,1,7,1,1,3,8,3,1,7,8},
{25,11,8,11,4,1,2,1,8,3,1,4,9},
}
local function useDefaultSet(n)
for i=1,#customSet[n]do
@@ -142,7 +142,7 @@ local Widget={
stat= newButton(370,460,200,160,C.lightCyan, 43,function()scene.push()scene.swapTo("stat")end, nil,"lang"),
lang= newButton(150,610,160,100,C.lightGreen, 45,function()
setting.lang=setting.lang%#langName+1
swapLanguage(setting.lang)
changeLanguage(setting.lang)
TEXT(text.lang,370,610,50,"appear",1.6)
end,nil,"quit"),
quit= newButton(590,460,200,160,C.lightGrey, 55,function()VOICE("bye")scene.swapTo("quit","slowFade")end,nil,"play"),