Compare commits

...

8 Commits

Author SHA1 Message Date
MrZ_26
4652be7067 0.8.14 2020-04-30 01:23:11 +08:00
MrZ_26
ed0f8031d0 0.8.13 2020-04-30 01:23:11 +08:00
MrZ_26
15df07ae3f 0.8.12 2020-04-30 01:22:06 +08:00
MrZ_26
57857ceb67 0.8.11 2020-02-22 00:47:35 +08:00
MrZ_26
527352ce15 0.8.10 2020-02-20 00:44:51 +08:00
MrZ_26
b8f57f5a1c 0.8.9 2020-02-19 17:41:23 +08:00
MrZ_26
d02048f0dc 0.8.8 2020-02-18 23:05:10 +08:00
MrZ_26
4da080c6f5 0.8.7 2020-02-14 19:26:57 +08:00
142 changed files with 4259 additions and 3202 deletions

BIN
BGM/distortion.ogg Normal file

Binary file not shown.

BIN
BGM/oxygen.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
SFX/finesseError.ogg Normal file

Binary file not shown.

22
ai.lua
View File

@@ -72,7 +72,7 @@ function CC_switch20G(P)
P.r,P.c=#P.cur.bk,#P.cur.bk[1]
P.curX,P.curY=blockPos[P.cur.id],21+ceil(P.fieldBeneath/30)-P.r+min(int(#P.field*.2),2)
P:freshNext()
P:newNext()
BOT.addNext(P.AI_bot,CCblockID[P.next[P.AIdata.next].id])
collectgarbage()
end
@@ -120,11 +120,12 @@ local function ifoverlapAI(f,bk,x,y)
end end
end
local function resetField(f0,f,start)
while f[start]do
removeRow(f,start)
for _=#f,start,-1 do
freeRow.discard(f[_])
f[_]=nil
end
for i=start,#f0 do
f[i]=getNewRow(0)
f[i]=freeRow.get(0)
for j=1,10 do
f[i][j]=f0[i][j]
end
@@ -133,7 +134,7 @@ end
local function getScore(field,cb,cy)
local score=0
local highest=0
local height=getNewRow(0)
local height=freeRow.get(0)
local clear=0
local hole=0
@@ -141,7 +142,7 @@ local function getScore(field,cb,cy)
for j=1,10 do
if field[i][j]==0 then goto L end
end
removeRow(field,i)
freeRow.discard(rem(field,i))
clear=clear+1
::L::
end
@@ -174,8 +175,7 @@ local function getScore(field,cb,cy)
end
sdh=sdh+min(dh^1.6,20)
end
freeRow[#freeRow+1]=height
freeRow.L=freeRow.L+1
freeRow.discard(height)
score=
-#field*30
-#cb*15
@@ -201,7 +201,7 @@ AI_think={
local Tfield={}--test field
local field_org=P.field
for i=1,#field_org do
Tfield[i]=getNewRow(0)
Tfield[i]=freeRow.get(0)
for j=1,10 do
Tfield[i][j]=field_org[i][j]
end
@@ -218,7 +218,7 @@ AI_think={
end--move to bottom
for i=1,#cb do
local y=cy+i-1
if not Tfield[y]then Tfield[y]=getNewRow(0)end
if not Tfield[y]then Tfield[y]=freeRow.get(0)end
for j=1,#cb[1]do
if cb[i][j]then
Tfield[y][cx+j-1]=1
@@ -236,7 +236,7 @@ AI_think={
::L::
if #Tfield>0 then
removeRow(Tfield,1)
freeRow.discard(rem(Tfield,1))
goto L
end--Release cache
local p=#ctrl+1

View File

@@ -1,10 +1,10 @@
gameVersion="Alpha V0.8.6"
gameVersion="Alpha V0.8.14"
function love.conf(t)
t.identity="Techmino"--Save directory name
t.identity="Techmino"--SaveDir name
t.version="11.1"
t.console=X
t.gammacorrect=X
t.appendidentity=X--Search files in source before save directory
t.console=false
t.gammacorrect=false
t.appendidentity=true--Search files in source before save directory
t.accelerometerjoystick=false--ios/android加速度计=摇杆
t.audio.mixwithsystem=true
@@ -13,23 +13,23 @@ function love.conf(t)
W.icon="/image/icon.png"
W.width,W.height=1280,720
W.minwidth,W.minheight=640,360
W.borderless=X
W.resizable=1
W.borderless=false
W.resizable=true
W.fullscreentype="desktop"--"exclusive"
W.fullscreen=X
W.fullscreen=false
W.vsync=0--0:∞fps
W.msaa=X--The number of samples to use with multi-sampled antialiasing (number)
W.depth=0--Bits per sample in the depth buffer
W.stencil=1--Bits per sample in the stencil buffer
W.msaa=false--num of samples to use with multi-sampled antialiasing
W.depth=0--bits/samp of depth buffer
W.stencil=1--bits/samp of stencil buffer
W.display=1--Monitor ID
W.highdpi=X--Enable high-dpi mode for the window on a Retina display (boolean)
W.highdpi=false--High-dpi mode for the window on a Retina display
W.x,W.y=nil
local M=t.modules
M.window,M.system,M.event=1,1,1
M.audio,M.sound=1,1
M.math,M.data=1,1
M.timer,M.graphics,M.font,M.image=1,1,1,1
M.mouse,M.touch,M.keyboard,M.joystick=1,1,1,1
M.physics,M.thread,M.video=X
M.window,M.system,M.event=true,true,true
M.audio,M.sound=true,true
M.math,M.data=true,true
M.timer,M.graphics,M.font,M.image=true,true,true,true
M.mouse,M.touch,M.keyboard,M.joystick=true,true,true,true
M.physics,M.thread,M.video=false,false,false
end

View File

@@ -1,348 +0,0 @@
local int,rnd,max,min=math.floor,math.random,math.max,math.min
local format=string.format
local ins,rem=table.insert,table.remove
local gc=love.graphics
local AISpeed={60,50,45,35,25,15,9,6,4,2}
function AITemplate(type,speedLV,next,hold,node)
if type=="CC"then
return{
type="CC",
next=next,
hold=hold,--hold,-------------!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
delta=AISpeed[speedLV],
node=node,
}
elseif type=="9S"then
return{
type="9S",
delta=int(AISpeed[speedLV]*.5),
}
end
end
-------------------------<Events>-------------------------
local function gameOver()
local M=curMode
local R=M.getRank
if R then
local P=players[1]
R=R(P)--new rank
if R then
local r=modeRanks[M.id]--old rank
if R>r then
modeRanks[M.id]=R
if r==0 then
for i=1,#M.unlock do
local m=M.unlock[i]
modeRanks[m]=modes[m].score and 0 or 6
end
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--Save record
local function die(P)--Same thing when win/lose,not really die!
P.alive=false
P.control=false
P.timing=false
P.waiting=1e99
P.b2b=0
clearTask(P)
for i=1,#P.atkBuffer do
P.atkBuffer[i].sent=true
P.atkBuffer[i].time=0
end
for i=1,#P.field do
for j=1,10 do
P.visTime[i][j]=min(P.visTime[i][j],20)
end
end
end
Event={}
function Event.reach_winCheck(P)
if P.stat.row>=P.gameEnv.target then
Event.win(P,"finish")
end
end
function Event.win(P,result)
die(P)
P.result="WIN"
if modeEnv.royaleMode then
P.rank=1
P:changeAtk()
end
if P.human then
gameResult=result or"win"
SFX("win")
VOICE("win")
if modeEnv.royaleMode then
BGM("8-bit happiness")
end
end
newTask(Event_task.finish,P)
if curMode.id=="custom_puzzle"then
P:showText(text.win,0,0,90,"beat",.4)
else
P:showText(text.win,0,0,90,"beat",.5,.2)
end
if P.human then
gameOver()
end
end
function Event.lose(P)
if P.invincible then
while P.field[1]do
removeRow(P.field)
removeRow(P.visTime)
end
if P.AI_mode=="CC"then
P.AI_needFresh=true
end
return
end
die(P)
for i=1,#players.alive do
if players.alive[i]==P then
rem(players.alive,i)
break
end
end
P.result="K.O."
if modeEnv.royaleMode then
P:changeAtk()
P.rank=#players.alive+1
P:showText(P.rank,0,-120,60,"appear",1,12)
P.strength=0
if P.lastRecv then
local A,i=P,0
repeat
A,i=A.lastRecv,i+1
until not A or A.alive or A==P or i==3
if A and A.alive then
if P.id==1 or A.id==1 then
P.killMark=A.id==1
end
A.ko,A.badge=A.ko+1,A.badge+P.badge+1
for i=A.strength+1,4 do
if A.badge>=royaleData.powerUp[i]then
A.strength=i
end
end
P.lastRecv=A
if P.id==1 or A.id==1 then
newTask(Event_task.throwBadge,A,{P,max(3,P.badge)*4})
end
freshMostBadge()
end
else
P.badge=-1
end
freshMostDangerous()
for i=1,#players.alive do
if players.alive[i].atking==P then
players.alive[i]:freshTarget()
end
end
if #players.alive==royaleData.stage[gameStage]then
royaleLevelup()
end
end
P.gameEnv.keepVisible=P.gameEnv.visible~="show"
P:showText(text.lose,0,0,90,"appear",.5,.2)
if P.human then
gameResult="lose"
SFX("fail")
VOICE("lose")
if modeEnv.royaleMode then BGM("end")end
end
if #players.alive==1 then
Event.win(players.alive[1])
end
if #players==1 or(P.human and not players[2].human)then
gameOver()
end
newTask(#players>1 and Event_task.lose or Event_task.finish,P)
end
-------------------------</Events>-------------------------
-------------------------<Tasks>-------------------------
Event_task={}
function Event_task.finish(P)
if scene.cur~="play"then return true end
P.endCounter=P.endCounter+1
if P.endCounter>120 then pauseGame()end
end
function Event_task.lose(P)
P.endCounter=P.endCounter+1
if P.endCounter>80 then
for i=1,#P.field do
for j=1,10 do
if P.visTime[i][j]>0 then
P.visTime[i][j]=P.visTime[i][j]-1
end
end
end
if P.endCounter==120 then
while P.field[1]do
removeRow(P.field)
removeRow(P.visTime)
end
if #players==1 and scene=="play"then
pauseGame()
end
return true
end
end
end
function Event_task.throwBadge(A,data)
data[2]=data[2]-1
if data[2]%4==0 then
local S,R=data[1],data[1].lastRecv
local x1,y1,x2,y2
if S.small then
x1,y1=S.centerX,S.centerY
else
x1,y1=S.x+308*S.size,S.y+450*S.size
end
if R.small then
x2,y2=R.centerX,R.centerY
else
x2,y2=R.x+66*R.size,R.y+344*R.size
end
FX_badge[#FX_badge+1]={x1,y1,x2,y2,t=0}
--generate badge object
if not A.ai and data[2]%8==0 then
SFX("collect")
end
end
if data[2]<=0 then return true end
end
function Event_task.bgmFadeOut(_,id)
local v=bgm[id]:getVolume()-.025*setting.bgm*.1
bgm[id]:setVolume(v>0 and v or 0)
if v<=0 then
bgm[id]:stop()
return true
end
end
function Event_task.bgmFadeIn(_,id)
local v=min(bgm[id]:getVolume()+.025*setting.bgm*.1,setting.bgm*.1)
bgm[id]:setVolume(v)
if v>=setting.bgm*.1 then return true end
end
-------------------------</Tasks>-------------------------
-------------------------<Modes>--------------------------
modes={
{"sprint_10", id=1, x=0, y=0, shape=1,size=35,unlock={2,3}},
{"sprint_20", id=2, x=-300, y=0, shape=1,size=45,unlock={73,74,75}},
{"sprint_40", id=3, x=0, y=-400, shape=1,size=55,unlock={4,9}},
{"sprint_100", id=4, x=-200, y=-400, shape=1,size=45,unlock={5,7}},
{"sprint_400", id=5, x=-400, y=-400, shape=1,size=35,unlock={6}},
{"sprint_1000", id=6, x=-600, y=-400, shape=1,size=35,unlock={}},
{"drought_normal", id=7, x=-400, y=-200, shape=1,size=35,unlock={8}},
{"drought_lunatic", id=8, x=-600, y=-200, shape=1,size=35,unlock={}},
{"marathon_normal", id=9, x=0, y=-600, shape=1,size=55,unlock={10,11,22,31,36,37,48,68,71,72}},
{"marathon_hard", id=10, x=0, y=-800, shape=1,size=45,unlock={27}},
{"solo_1", id=11, x=-300, y=-1000, shape=1,size=35,unlock={12}},
{"solo_2", id=12, x=-500, y=-1000, shape=1,size=35,unlock={13}},
{"solo_3", id=13, x=-700, y=-1000, shape=1,size=35,unlock={14,16}},
{"solo_4", id=14, x=-900, y=-1000, shape=1,size=35,unlock={15}},
{"solo_5", id=15, x=-1100, y=-1000, shape=1,size=35,unlock={}},
{"techmino49_easy", id=16, x=-900, y=-1200, shape=1,size=35,unlock={17,19}},
{"techmino49_hard", id=17, x=-900, y=-1400, shape=1,size=35,unlock={18}},
{"techmino49_ultimate", id=18, x=-900, y=-1600, shape=1,size=35,unlock={}},
{"techmino99_easy", id=19, x=-1100, y=-1400, shape=1,size=35,unlock={20}},
{"techmino99_hard", id=20, x=-1100, y=-1600, shape=1,size=35,unlock={21}},
{"techmino99_ultimate", id=21, x=-1100, y=-1800, shape=1,size=35,unlock={}},
{"round_1", id=22, x=-300, y=-800, shape=1,size=35,unlock={23}},
{"round_2", id=23, x=-500, y=-800, shape=1,size=35,unlock={24}},
{"round_3", id=24, x=-700, y=-800, shape=1,size=35,unlock={25}},
{"round_4", id=25, x=-900, y=-800, shape=1,size=35,unlock={26}},
{"round_5", id=26, x=-1100, y=-800, shape=1,size=35,unlock={}},
{"master_beginner", id=27, x=0, y=-1000, shape=1,size=35,unlock={28}},
{"master_adavnce", id=28, x=0, y=-1200, shape=1,size=35,unlock={29,30}},
{"master_final", id=29, x=0, y=-1400, shape=1,size=35,unlock={}},
{"GM", id=30, x=150, y=-1500, shape=1,size=35,unlock={}},
{"blind_easy", id=31, x=150, y=-700, shape=1,size=35,unlock={32}},
{"blind_normal", id=32, x=150, y=-800, shape=1,size=35,unlock={33}},
{"blind_hard", id=33, x=150, y=-900, shape=1,size=35,unlock={34}},
{"blind_lunatic", id=34, x=150, y=-1000, shape=1,size=35,unlock={35}},
{"blind_ultimate", id=35, x=150, y=-1100, shape=1,size=35,unlock={}},
{"classic_fast", id=36, x=-300, y=-1200, shape=1,size=35,unlock={}},
{"survivor_easy", id=37, x=300, y=-600, shape=1,size=35,unlock={38}},
{"survivor_normal", id=38, x=500, y=-600, shape=1,size=35,unlock={39,42,44,46}},
{"survivor_hard", id=39, x=700, y=-600, shape=1,size=35,unlock={40}},
{"survivor_lunatic", id=40, x=900, y=-600, shape=1,size=35,unlock={41}},
{"survivor_ultimate", id=41, x=1100, y=-600, shape=1,size=35,unlock={}},
{"attacker_hard", id=42, x=300, y=-800, shape=1,size=35,unlock={43}},
{"attacker_ultimate", id=43, x=300, y=-1000, shape=1,size=35,unlock={}},
{"defender_normal", id=44, x=500, y=-800, shape=1,size=35,unlock={45}},
{"defender_lunatic", id=45, x=500, y=-1000, shape=1,size=35,unlock={}},
{"dig_hard", id=46, x=700, y=-800, shape=1,size=35,unlock={47}},
{"dig_ultimate", id=47, x=700, y=-1000, shape=1,size=35,unlock={}},
{"bigbang", id=48, x=400, y=-400, shape=1,size=55,unlock={49,51,56}},
{"c4wtrain_normal", id=49, x=700, y=-400, shape=1,size=35,unlock={50}},
{"c4wtrain_lunatic", id=50, x=900, y=-400, shape=1,size=35,unlock={}},
{"pctrain_normal", id=51, x=700, y=-200, shape=1,size=35,unlock={52,53}},
{"pctrain_lunatic", id=52, x=900, y=-200, shape=1,size=35,unlock={}},
{"pcchallenge_normal", id=53, x=800, y=-100, shape=1,size=35,unlock={54}},
{"pcchallenge_hard", id=54, x=1000, y=-100, shape=1,size=35,unlock={55}},
{"pcchallenge_lunatic", id=55, x=1200, y=-100, shape=1,size=35,unlock={}},
{"tech_normal", id=56, x=400, y=-100, shape=1,size=35,unlock={57,58}},
{"tech_normal+", id=57, x=650, y=150, shape=1,size=35,unlock={64,67}},
{"tech_hard", id=58, x=400, y=50, shape=1,size=35,unlock={59,60}},
{"tech_hard+", id=59, x=250, y=50, shape=1,size=35,unlock={}},
{"tech_lunatic", id=60, x=400, y=200, shape=1,size=35,unlock={61,62}},
{"tech_lunatic+", id=61, x=250, y=200, shape=1,size=35,unlock={}},
{"tech_ultimate", id=62, x=400, y=350, shape=1,size=35,unlock={63}},
{"tech_ultimate+", id=63, x=250, y=350, shape=1,size=35,unlock={}},
{"tsd_easy", id=64, x=800, y=200, shape=1,size=35,unlock={65}},
{"tsd_hard", id=65, x=1000, y=200, shape=1,size=35,unlock={66}},
{"tsd_ultimate", id=66, x=1200, y=200, shape=1,size=35,unlock={}},
{"ultra", id=67, x=650, y=400, shape=1,size=35,unlock={}},
{"zen", id=68, x=-900, y=-600, shape=1,size=35,unlock={69,70}},
{"infinite", id=69, x=-900, y=-400, shape=1,size=35,unlock={}},
{"infinite_dig", id=70, x=-1100, y=-600, shape=1,size=35,unlock={}},
{"custom_clear", id=71, x=200, y=-350, shape=2,size=45,unlock={}},
{"custom_puzzle", id=72, x=200, y=-200, shape=2,size=45,unlock={}},
{"hotseat_2P", id=73, x=-300, y=200, shape=2,size=45,unlock={}},
{"hotseat_3P", id=74, x=-450, y=200, shape=2,size=45,unlock={}},
{"hotseat_4P", id=75, x=-600, y=200, shape=2,size=45,unlock={}},
}
modeRanks={}
for i=1,#modes do
modeRanks[i]=false
assert(i==modes[i].id,"ModeID error:"..i)
end
modeRanks[1]=0

View File

@@ -1,12 +1,18 @@
setting={
das=10,arr=2,
sddas=0,sdarr=2,
quickR=true,swap=true,
reTime=10,
maxNext=6,
quickR=true,
swap=true,
fine=false,
autoPause=true,
face={0,0,0,0,0,0,0},
--game
ghost=true,center=true,
smo=true,grid=false,
smooth=true,grid=false,
lockFX=2,
dropFX=3,
shakeFX=2,
atkFX=3,
@@ -14,41 +20,26 @@ setting={
fullscreen=false,
bg=true,
bgblock=true,
bgspace=true,
lang=1,
skin=1,
skinSet=1,
skin={1,5,2,8,10,3,7},
--graphic
sfx=10,bgm=7,
vib=3,voc=0,
vib=0,voc=0,
stereo=6,
--sound
keyMap={
{"left","right","x","z","c","up","down","space","tab","r"},
{},{},{},{},{},{},{},
--keyboard
{"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder"},
{},{},{},{},{},{},{},
--joystick
},
VKSwitch=true,
VKTrack=true,--If tracked
VKDodge=false,--If repel
VKTchW=3,--Touch Weight
VKCurW=4,--CurPos Weight
VKIcon=true,
VKSwitch=false,--if disp
VKTrack=false,--if tracked
VKDodge=false,--if dodge
VKTchW=3,--Touch-Pos Weight
VKCurW=4,--Cur-Pos Weight
VKIcon=true,--if disp icon
VKAlpha=3,
--control
}
local L=setting.keyMap
for i=1,#L do
for j=1,20 do
if not L[i][j]then
L[i][j]=""
end
end
end
stat={
run=0,game=0,time=0,
extraPiece=0,extraRate=0,
@@ -57,32 +48,40 @@ stat={
clear_1=0,clear_2=0,clear_3=0,clear_4=0,
spin_0=0,spin_1=0,spin_2=0,spin_3=0,
b2b=0,b3b=0,pc=0,score=0,
lastPlay=1,--last played mode ID
}
keyMap={
{"left","right","x","z","c","up","down","space","tab","r"},
{},{},{},{},{},{},{},
--keyboard
{"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder"},
{},{},{},{},{},{},{},
--joystick
}
for i=1,#keyMap do for j=1,20 do
if not keyMap[i][j]then keyMap[i][j]=""end
end end
--Things related to virtualkey
local O,_=true,false
VK_org={--Original set,for restore VK' position
{ava=O,x=80, y=720-200, r=80},--moveLeft
{ava=O,x=320, y=720-200, r=80},--moveRight
{ava=O,x=1280-80, y=720-200, r=80},--rotRight
{ava=O,x=1280-200, y=720-80, r=80},--rotLeft
{ava=O,x=1280-200, y=720-320, r=80},--rotFlip
{ava=O,x=200, y=720-320, r=80},--hardDrop
{ava=O,x=200, y=720-80, r=80},--softDrop
{ava=O,x=1280-320, y=720-200, r=80},--hold
{ava=O,x=1280-80, y=280, r=80},--func
{ava=O,x=80, y=280, r=80},--restart
{ava=_,x=100, y=50, r=80},--insLeft
{ava=_,x=200, y=50, r=80},--insRight
{ava=_,x=300, y=50, r=80},--insDown
{ava=_,x=400, y=50, r=80},--down1
{ava=_,x=500, y=50, r=80},--down4
{ava=_,x=600, y=50, r=80},--down10
{ava=_,x=700, y=50, r=80},--dropLeft
{ava=_,x=800, y=50, r=80},--dropRight
{ava=_,x=900, y=50, r=80},--addToLeft
{ava=_,x=1000, y=50, r=80},--addToRight
{ava=true, x=80, y=720-200, r=80},--moveLeft
{ava=true, x=320, y=720-200, r=80},--moveRight
{ava=true, x=1280-80, y=720-200, r=80},--rotRight
{ava=true, x=1280-200, y=720-80, r=80},--rotLeft
{ava=true, x=1280-200, y=720-320, r=80},--rot180
{ava=true, x=200, y=720-320, r=80},--hardDrop
{ava=true, x=200, y=720-80, r=80},--softDrop
{ava=true, x=1280-320, y=720-200, r=80},--hold
{ava=true, x=1280-80, y=280, r=80},--func
{ava=true, x=80, y=280, r=80},--restart
{ava=false, x=100, y=50, r=80},--insLeft
{ava=false, x=200, y=50, r=80},--insRight
{ava=false, x=300, y=50, r=80},--insDown
{ava=false, x=400, y=50, r=80},--down1
{ava=false, x=500, y=50, r=80},--down4
{ava=false, x=600, y=50, r=80},--down10
{ava=false, x=700, y=50, r=80},--dropLeft
{ava=false, x=800, y=50, r=80},--dropRight
{ava=false, x=900, y=50, r=80},--addToLeft
{ava=false, x=1000, y=50, r=80},--addToRight
}
virtualkey={}
for i=1,#VK_org do
virtualkey[i]={}
end
virtualkey={}for i=1,#VK_org do virtualkey[i]={}end

View File

@@ -1,22 +1,29 @@
游戏方法:
控制系统提供的一个个四联方块(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
系统提供的一个个四联骨牌("方块",总共7种),玩家需要控制(左右移动和旋转90,180,270度),每填满场地的一行就会将其消除,根据消除方式会给对手攻击(如果有对手的话)
活到最后或者完成目标即胜利.
旋转系统:
使用Techmino专属旋转系统
细节不赘述
细节懒得写(?)
spin判定:
结合了不可移动判定和三角判定,是否为mini也与判定过程数据有关
细节不赘述
细节也懒得写(?)
攻击系统:
消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,spin再加0.5*消行数攻击,二者都+1额外抵挡
连击:0,0,1,1,2,2,2,3,3,4,3,2…(后面都是2)
特殊消除会增加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,不是真人).随着玩家数量的减少,方块下落/垃圾生效速度/垃圾升起速度都会增加.淘汰其它玩家后可以获得一个徽章和该玩家持有的徽章,增强自己的攻击力.

223
file.lua Normal file
View File

@@ -0,0 +1,223 @@
local fs=love.filesystem
local int,max,min=math.floor,math.max,math.min
local sub,find=string.sub,string.find
local toN,toS=tonumber,tostring
local concat=table.concat
local FILE={
data= fs.newFile("data.dat"),
setting=fs.newFile("setting.dat"),
VK= fs.newFile("virtualkey.dat"),
keyMap= fs.newFile("key.dat"),
unlock= fs.newFile("unlock.dat"),
}
local function splitS(s,sep)
local t,n={},1
repeat
local p=find(s,sep)or #s+1
t[n]=sub(s,1,p-1)
n=n+1
s=sub(s,p+#sep)
until #s==0
return t
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 k=k.."="
elseif T=="boolean"then k="["..k.."]="
else error("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 error("Error data type!")
end
s=s..tabs[t]..k..v..",\n"
end
return s..tabs[t-1].."}"
end
local function addToTable(G,base)--push all values to base
for k,v in next,G do
if type(v)=="table"and type(base[k])=="table"then
addToTable(v,base[k])
else
base[k]=v
end
end
end
function loadRecord(N)
local F=fs.newFile(N..".dat")
if F:open("r")then
local s=loadstring(F:read())
F:close()
if s then
setfenv(s,{})
return s()
else
return{}
end
end
end
function saveRecord(N,L)
local F=fs.newFile(N..".dat")
F:open("w")
local _,mes=F:write(dumpTable(L))
F:flush()F:close()
if not _ then
TEXT(text.recSavingError..mes,1140,650,20,"sudden",.5)
end
end
function delRecord(N)
fs.remove(N..".dat")
end
function loadUnlock()
local F=FILE.unlock
if F:open("r")then
local s=F:read()
if s:sub(1,6)~="return"then s="return{"..s.."}"end
s=loadstring(s)
F:close()
if s then
setfenv(s,{})
modeRanks=s()
end
end
end
function saveUnlock()
local F=FILE.unlock
F:open("w")
local _,mes=F:write(dumpTable(modeRanks))
F:flush()F:close()
if not _ then
TEXT(text.unlockSavingError..mes,1140,650,20,"sudden",.5)
end
end
function loadData()
local F=FILE.data
if F:open("r")then
local s=F:read()
if s:sub(1,6)~="return"then
s="return{"..s:gsub("\n",",").."}"
end
s=loadstring(s)
F:close()
if s then
setfenv(s,{})
addToTable(s(),stat)
end
end
end
function saveData()
local F=FILE.data
F:open("w")
local _,mes=F:write(dumpTable(stat))
F:flush()F:close()
if not _ then
TEXT(text.statSavingError..mes,1140,650,20,"sudden",.5)
end
end
function loadSetting()
local F=FILE.setting
if F:open("r")then
local s=F:read()
if s:sub(1,6)~="return"then
s="return{"..s:gsub("\n",",").."}"
end
s=loadstring(s)
F:close()
if s then
setfenv(s,{})
addToTable(s(),setting)
end
end
end
function saveSetting()
local F=FILE.setting
F:open("w")
local _,mes=F:write(dumpTable(setting))
F:flush()F:close()
if _ then TEXT(text.settingSaved,1140,650,40,"sudden",.5)
else TEXT(text.settingSavingError..mes,1140,650,20,"sudden",.5)
end
end
function loadKeyMap()
local F=FILE.keyMap
if F:open("r")then
local s=loadstring(F:read())
F:close()
if s then
setfenv(s,{})
addToTable(s(),keyMap)
end
end
end
function saveKeyMap()
local F=FILE.keyMap
F:open("w")
local _,mes=F:write(dumpTable(keyMap))
F:flush()F:close()
if _ then TEXT(text.keyMapSaved,1140,650,26,"sudden",.5)
else TEXT(text.keyMapSavingError..mes,1140,650,20,"sudden",.5)
end
end
function loadVK()
local F=FILE.VK
if F:open("r")then
local s=loadstring(F:read())
F:close()
if s then
setfenv(s,{})
addToTable(s(),VK_org)
end
end
end
function saveVK()
local F=FILE.VK
F:open("w")
local _,mes=F:write(dumpTable(VK_org))
F:flush()F:close()
if _ then TEXT(text.VKSaved,1140,650,26,"sudden",.5)
else TEXT(text.VKSavingError..mes,1140,650,20,"sudden",.5)
end
end
if fs.getInfo("unlock.dat")then loadUnlock()end
if fs.getInfo("data.dat")then loadData()end
if fs.getInfo("key.dat")then loadKeyMap()end
if fs.getInfo("virtualkey.dat")then loadVK()end
if fs.getInfo("setting.dat")then loadSetting()
elseif system=="Android"or system=="iOS" then
setting.VKSwitch=true
setting.swap=false
setting.vib=2
end

BIN
font.ttf

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

BIN
image/BG/bg1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 28 KiB

BIN
image/mess/speedLimit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
image/skin/ball(shaw).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
image/skin/glow(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

BIN
image/skin/jelly(miya).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

BIN
image/skin/normal(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
image/skin/plastic(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
image/skin/pure(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 B

BIN
image/skin/smooth(mrz).png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

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,
@@ -68,19 +68,29 @@ return{
},
softdropdas="软降DAS:",
softdroparr="软降ARR:",
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
keyboard="键盘",joystick="手柄",
space="空格",enter="回车",
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
snapLevelName={"无吸附","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
setting_game="游戏设置",
setting_graphic="画面设置",
setting_sound="声音设置",
setting_control="控制设置",
setting_skin="外观设置",
preview="预览",
keyboard="键盘",joystick="手柄",
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
musicRoom="音乐室",
nowPlaying="正在播放:",
recSavingError="纪录保存失败:",
settingSaved="设置已保存",
settingSavingError="设置保存失败:",
statSavingError="数据保存失败:",
keyMapSaved="键位设置已保存",
keyMapSavingError="键位保存失败:",
VKSaved="虚拟按键设置已保存",
VKSavingError="虚拟按键保存失败:",
statSavingError="统计保存失败:",
unlockSavingError="解锁保存失败:",
recSavingError="纪录保存失败:",
needRestart="重新开始以生效",
copySuccess="已复制到剪切板",
dataCorrupted="数据损坏",
VKTchW="触摸点权重",
@@ -89,43 +99,26 @@ return{
noScore="暂无成绩",
highScore="最佳成绩",
newRecord="打破纪录",
errorMsg="Techmino遇到了问题,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.",
actName=actName,
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效ing","加载模式ing","加载乱七八糟的东西ing"},
tips={
"不是动画,真的在加载!",
"大满贯10连击消四全清!",
"<方块研究所>有一个Nspire-CX版本!",
"B2B2B???",
"B2B2B2B存在吗?",
"MEGACMB!",
"ALLSPIN!",
"O spin triple!",
"Miya:喵!",
"225238922 哔哩哔哩 干杯~",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"合群了就会消失,但是消失不代表没有意义",
"学会使用两个旋转键,三个更好",
"更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)",
"注意到\"旋转\"到底对方块做了些什么吗?",
"20G本质是一套全新的游戏规则",
"不要在上课时玩游戏!",
"本游戏难度上限很高,做好心理准备",
"本游戏可不是休闲游戏",
"调到特殊的日期也不会发生什么的",
"3.1415926535897932384",
"2.7182818284590452353",
"Let-The-Bass-Kick!",
"使用love2d引擎制作",
"有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~",
"不要按F8",
"秘密数字:626",
"CLASSIC SEXY RUSSIAN BLOCKS",
"戴上耳机以获得最佳体验",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
"(第一次才准)今日幸运数字:"..math.random(100,626),
pauseStat={
"时间:",
"按键/旋转/暂存:",
"使用方块:",
"消行数:",
"攻击数:",
"发送数:",
"接收数:",
"直接消除数:",
"旋转消除数:",
"满贯数:",
"全清数:",
"效率:",
"多余操作方块:",
"最简操作率:",
},
stat={
"游戏运行次数:",
@@ -133,32 +126,33 @@ return{
"游戏时间:",
"按键数:",
"旋转数:",
"Hold次数:",
"方块使用:",
"暂存数:",
"方块使用:",
"消行数:",
"攻击数:",
"发送数:",
"攻击(发送)数:",
"接收数:",
"上涨数:",
"消除数:",
"Spin数:",
"B2B数:",
"PC数:",
"直接消除数:",
"旋转消除数:",
"满贯数:",
"全清数:",
"效率:",
"多余操作:",
"最简操作率:",
},
help={
"好像也没啥好帮助的吧?就当是关于了",
"这只是一个普通的方块游戏,请勿称此游戏为某某某方块",
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
"游戏还在测试阶段,请 勿 外 传",
"TO/C2/KOS/TGM3/JS等方块获得过灵感",
"",
"使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
"特别感谢:Farter,Flyz,196,Teatube,T830,[所有测人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~",
"特别感谢:Flyz,Farter,196,Teatube,T830,[所有测人员]和 你!",
"",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过唯一内测群1057456078进行免费下载/更新",
"其他渠道获得游戏皆有被修改/植入病毒的风险,程序只申请了震动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
},
used=[[
使用工具:
@@ -171,20 +165,20 @@ return{
]],
support="支持作者",
group="官方QQ群",
warning="禁 止 私 自 传 播",
WidgetText={
main={
lang="言/A",
play="开始",
setting="设置",
music="音乐室",
stat="统计信息",
help="帮助",
qplay="快速开始",
lang="言/A",
quit="退出",
},
mode={
draw="画图(Q)",
setting="参数(E)",
custom="参数(E)",
start="开始",
back=BK,
},
@@ -209,21 +203,9 @@ return{
},
draw={
any="不定",
block1="Z",
block2="S",
block3="L",
block4="J",
block5="T",
block6="O",
block7="I",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
space="×",
clear="清除",
demo="演示模式",
demo="不显示×",
copy="复制",
paste="粘贴",
back=BK,
@@ -232,24 +214,25 @@ return{
pause="暂停",
},
pause={
resume= "继续",
restart="重新开始",
sfx="音效",
bgm="音乐",
quit= "退出",
resume= "继续(空格)",
restart="重新开始(R)",
setting="设置(S)",
quit= "退出(esc)",
},
setting_game={
graphic="←画面设置",
sound="声音设置→",
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="控制设置",
reTime="开局等待时间",
maxNext="最大预览数量",
autoPause="自动暂停",
layout="外观",
key="键位设置",
touch="触屏设置",
quickR="快速重新开始",
autoPause="自动暂停",
swap="组合键切换攻击模式",
fine="极简操作提示音",
ctrl="键位设置",
touch="触屏设置",
back=BK,
},
setting_graphic={
@@ -258,10 +241,10 @@ return{
ghost="阴影",
grid="网格",
center="旋转中心",
skin="皮肤",
bg="背景",
bgblock="背景动画",
smo="平滑下落",
bgspace="星空背景",
smooth="平滑下落",
lockFX="锁定特效等级",
dropFX="下落特效等级",
shakeFX="晃动特效等级",
atkFX="攻击特效等级",
@@ -279,9 +262,28 @@ return{
stereo="立体声",
back=BK,
},
setting_control={
das="DAS",arr="ARR",
sddas="软降DAS",sdarr="软降ARR",
reset="重置",
back=BK,
},
setting_key={
back=BK,
},
setting_skin={
prev="",next="",
prev1="",next1="",spin1="R",
prev2="",next2="",spin2="R",
prev3="",next3="",spin3="R",
prev4="",next4="",spin4="R",
prev5="",next5="",spin5="R",
prev6="",next6="",spin6="R",
prev7="",next7="",spin7="R",
skinR="重置配色",
faceR="重置方向",
back=BK,
},
setting_touch={
default="默认组合",
snap=function()return text.snapLevelName[sceneTemp.snap]end,

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,
@@ -66,21 +66,29 @@ return{
freshLimit={0,8,15,""},
opponent={"无电脑","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
},
softdropdas="软降DAS:",
softdroparr="软降ARR:",
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
keyboard="键盘",joystick="手柄",
space="空格",enter="回车",
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
snapLevelName={"无吸附","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
setting_game="游戏设置",
setting_graphic="画面设置",
setting_sound="声音设置",
setting_control="控制设置",
setting_skin="外观设置",
preview="预览",
keyboard="键盘",joystick="手柄",
ctrlSetHelp="方向键选择/翻页,回车修改,esc返回",
musicRoom="音乐室",
nowPlaying="正在播放:",
recSavingError="纪录保存失败:",
settingSaved="设置已保存",
settingSavingError="设置保存失败:",
statSavingError="数据保存失败:",
keyMapSaved="键位设置已保存",
keyMapSavingError="键位保存失败:",
VKSaved="虚拟按键设置已保存",
VKSavingError="虚拟按键保存失败:",
statSavingError="统计保存失败:",
unlockSavingError="解锁保存失败:",
recSavingError="纪录保存失败:",
needRestart="重新开始以生效",
copySuccess="已复制到剪切板",
dataCorrupted="数据损坏",
VKTchW="触摸点权重",
@@ -89,43 +97,26 @@ return{
noScore="暂无成绩",
highScore="最佳成绩",
newRecord="打破纪录",
errorMsg="Techmino遇到了问题,需要重新启动.\n我们已收集了一些错误信息,你可以向作者进行反馈.",
actName=actName,
load={[0]="加载完成","加载语音ing","加载音乐ing","加载音效ing","加载模式ing","加载乱七八糟的东西ing"},
tips={
"不是动画,真的在加载!",
"大满贯10连击消四全清!",
"<方块研究所>有一个Nspire-CX版本!",
"B2B2B???",
"B2B2B2B存在吗?",
"MEGACMB!",
"ALLSPIN!",
"O型回旋三清!",
"Miya:喵!",
"225238922 哔哩哔哩 干杯~",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"合群了就会消失,但是消失不代表没有意义",
"学会使用两个旋转键,三个更好",
"更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)",
"注意到\"旋转\"到底对方块做了些什么吗?",
"20G本质是一套全新的游戏规则",
"不要在上课时玩游戏!",
"本游戏难度上限很高,做好心理准备",
"本游戏可不是休闲游戏",
"调到特殊的日期也不会发生什么的",
"3.1415926535897932384",
"2.7182818284590452353",
"Let-The-Bass-Kick!",
"使用love2d引擎制作",
"有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~",
"不要按F8",
"秘密数字:626",
"CLASSIC SEXY RUSSIAN BLOCKS",
"戴上耳机以获得最佳体验",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
"(第一次才准)今日幸运数字:"..math.random(100,626),
pauseStat={
"时间:",
"按键/旋转/暂存:",
"使用方块:",
"消行数:",
"攻击数:",
"发送数:",
"接收数:",
"直接消除数:",
"旋转消除数:",
"满贯数:",
"全清数:",
"效率:",
"多余操作方块:",
"最简操作率:",
},
stat={
"游戏运行次数:",
@@ -133,32 +124,33 @@ return{
"游戏时间:",
"按键数:",
"旋转数:",
"暂存数:",
"暂存数:",
"方块使用:",
"消行数:",
"攻击数:",
"发送数:",
"攻击(发送)数:",
"接收数:",
"上涨数:",
"消除数:",
"旋转消行数:",
"直接消除数:",
"旋转消除数:",
"满贯数:",
"全清数:",
"效率:",
"多余操作:",
"最简操作率:",
},
help={
"好像也没啥好帮助的吧?就当是关于了",
"这只是一个普通的方块游戏,请勿称此游戏为某某某方块",
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
"游戏还在测试阶段,请 勿 外 传",
"TO/C2/KOS/TGM3/JS等方块获得过灵感",
"",
"使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
"特别感谢:Farter,Flyz,196,Teatube,T830,[所有测人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~",
"特别感谢:Flyz,Farter,196,Teatube,T830,[所有测人员]和 你!",
"",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过唯一内测群1057456078进行免费下载/更新",
"其他渠道获得游戏皆有被修改/植入病毒的风险,程序只申请了震动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
},
used=[[
使用工具:
@@ -171,20 +163,20 @@ return{
]],
support="支持作者",
group="官方QQ群",
warning="禁 止 私 自 传 播",
WidgetText={
main={
lang="言/A",
play="开始",
setting="设置",
music="音乐室",
stat="统计信息",
help="帮助",
qplay="快速开始",
lang="言/A",
quit="退出",
},
mode={
draw="画图(Q)",
setting="参数(E)",
custon="参数(E)",
start="开始",
back=BK,
},
@@ -209,21 +201,9 @@ return{
},
draw={
any="不定",
block1="Z",
block2="S",
block3="L",
block4="J",
block5="T",
block6="O",
block7="I",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
space="×",
clear="清除",
demo="演示模式",
demo="不显示×",
copy="复制",
paste="粘贴",
back=BK,
@@ -232,25 +212,24 @@ return{
pause="暂停",
},
pause={
resume= "继续",
restart="重新开始",
sfx="音效",
bgm="音乐",
quit= "退出",
resume= "继续(空格)",
restart="重新开始(R)",
setting="设置(S)",
quit= "退出(esc)",
},
setting_game={
graphic="←画面设置",
sound="声音设置→",
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="控制设置",
reTime="开局等待时间",
maxNext="最大预览数量",
autoPause="自动暂停",
layout="外观",
key="键位设置",
touch="触屏设置",
quickR="快速重新开始",
swap="组合键切换攻击模式",
fine="极简操作提示音",
ctrl="键位设置",
touch="触屏设置",
back=BK,
},
setting_graphic={
@@ -259,10 +238,10 @@ return{
ghost="阴影",
grid="网格",
center="旋转中心",
skin="皮肤",
bg="背景",
bgblock="背景动画",
smo="平滑下落",
bgspace="星空背景",
smooth="平滑下落",
lockFX="锁定特效等级",
dropFX="下落特效等级",
shakeFX="晃动特效等级",
atkFX="攻击特效等级",
@@ -280,9 +259,28 @@ return{
stereo="立体声",
back=BK,
},
setting_control={
das="首次移动延迟",arr="移动重复延迟",
sddas="首次软降延迟",sdarr="软降重复延迟",
reset="重置",
back=BK,
},
setting_key={
back=BK,
},
setting_skin={
prev="",next="",
prev1="",next1="",spin1="",
prev2="",next2="",spin2="",
prev3="",next3="",spin3="",
prev4="",next4="",spin4="",
prev5="",next5="",spin5="",
prev6="",next6="",spin6="",
prev7="",next7="",spin7="",
skinR="重置配色",
faceR="重置方向",
back=BK,
},
setting_touch={
default="默认组合",
snap=function()return text.snapLevelName[sceneTemp.snap]end,

View File

@@ -1,7 +1,7 @@
local BK="Back"
local actName={
"Move Left:","Move Right:",
"Rotate Right:","Rotate Left:","Rotate Flip:",
"Rotate Right:","Rotate Left:","Rotate 180°:",
"Hard Drop:","Soft Drop:","Hold:","Function:","Restart:",
"Instant Left:","Instant Right:","Ins Down:","Down 1:","Down 4:","Down 10:",
"Left Drop:","Right Drop:","Left INS:","Right INS:",
@@ -37,7 +37,7 @@ return{
custom="Custom Game",
customOption={
drop="Drop delay:",
drop="Drop speed:",
lock="Lock delay:",
wait="Next piece delay:",
fall="Clear row delay:",
@@ -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,
@@ -64,21 +64,29 @@ return{
freshLimit={0,8,15,""},
opponent={"No CPU","9S Lv1","9S Lv2","9S Lv3","9S Lv4","9S Lv5","CC Lv1","CC Lv2","CC Lv3","CC Lv4","CC Lv5","CC Lv6"},
},
softdropdas="Down DAS:",
softdroparr="Down ARR:",
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"},
keyboard="Keyboard",joystick="Joystick",
space="Space",enter="Enter",
ctrlSetHelp="Arrowkey to select/change slot,Enter to change,Esc back",
setting_game="Game setting",
setting_graphic="Graphic setting",
setting_sound="Sound setting",
setting_control="Control Setting",
setting_skin="Layout Setting",
preview="Preview",
keyboard="Keyboard",joystick="Joystick",
ctrlSetHelp="Arrowkey to select/change slot,Enter to change,Esc back",
musicRoom="Music Room",
nowPlaying="Now Playing:",
recSavingError="Failed to save record:",
settingSaved="Setting saved",
settingSaved="Setting Saved",
settingSavingError="Failed to save setting:",
keyMapSaved="Key setting saved",
keyMapSavingError="Failed to save key setting:",
VKSaved="virtual key saved",
VKSavingError="Failed to save virtual key:",
statSavingError="Failed to save stat:",
unlockSavingError="Failed to save unlock:",
recSavingError="Failed to save record:",
needRestart="Effective after restart",
copySuccess="Copy Success",
dataCorrupted="Data Corrupted",
VKTchW="Touch weight",
@@ -87,44 +95,26 @@ return{
noScore="No Score Yet",
highScore="Highscore",
newRecord="New Rocord",
errorMsg="Techmino ran into a problem and needs to restart.\nWe collected some error info,and you can send them to author.",
actName=actName,
load={[0]="Finished","Loading VOICE","Loading BGM","Loading SFX","Loading modes","Loading other things"},
tips={
"Not animation,real loading!",
"Back to Back 10 combo Techrash PC!",
"Techmino has a Nspire-CX edition!",
"B2B2B???",
"Is B2B2B2B possible?",
"MEGACMB!",
"ALLSPIN!",
"O spin triple!",
"Miya:Nya!",
"225238922 Bilibili cheers!",
"Playing too much = taking drugs",
"Disappearing doesn't mean useless",
"Try to use two rotate button,three better",
"Small DAS&ARR can make you faster,if you can control block correctly",
"Have you noticed what does \"rotating\" do to block?",
"20G actually is a brand new game rule",
"Do not play game in class!",
"This game can be very hard,be mentally perpared",
"This in not a casual game",
"Nothing will happen when some special day come",
"3.1415926535897932384",
"2.7182818284590452353",
"Let-The-Bass-Kick!",
"Powered by love2d",
"Find out what's in the setting!",
"Any suggestions to author!",
"DO NOT PRESS F8",
"Secret num:626",
"Techmino=Technique+Tetromino",
"CLASSIC SEXY RUSSIAN BLOCKS",
"Headphones for better experience",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
"(first effective)Your luck number today:"..math.random(100,626),
pauseStat={
"Time:",
"Key/Rot./Hold:",
"Block used:",
"Lines:",
"Attack:",
"Send:",
"Receive:",
"Clear:",
"Spin:",
"B2B:",
"PC:",
"Efficiency:",
"Finesse err:",
"Finesse rate:",
},
stat={
"Games run:",
@@ -135,29 +125,30 @@ return{
"Hold:",
"Block used:",
"Lines cleared:",
"Attack:",
"Sent:",
"Attack(Sent):",
"Receive:",
"Pend:",
"Clear:",
"Spin:",
"B2B:",
"PC:",
"Efficiency:",
"Finesse error:",
"Finesse rate:",
},
help={
"I don't think you need \"help\".",
"THIS IS ONLY A BLOCK GAME,not T****s",
"But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE",
"But just play like playing TO/C2/KOS/TGM3",
"",
"Powered by LOVE2D",
"Author:MrZ E-mail:1046101471@qq.com",
"Program:MrZ Art:MrZ Music:MrZ SFX:MrZ VOICE:Miya",
"Special thanks:Farter,Flyz,196,Teatube,T830,[all test staff] and YOU!",
"Any bugs/suggestions to my E-mail.",
"Special thanks:Flyz,Farter,196,Teatube,T830,[all test staff] and YOU!",
"",
"Any bugs/suggestions to my E-mail.(may with screenshot)",
"Only released in test group for FREE",
"Game downloaded from other way may implanted with virous",
"Only network/vibrating permission applied",
"Author is not responsible for any loss by eddited game",
},
used=[[
Tool used:
@@ -170,20 +161,20 @@ Lib used:
]],
support="Support Author",
group="Official QQ Group",
warning="DO NOT DISTRIBUTE",
WidgetText={
main={
lang="言/A",
play="Play",
setting="Settings",
music="Music room",
stat="Statistics",
help="Help",
qplay="qPlay",
lang="言/A",
quit="Quit",
},
mode={
draw="Draw(Q)",
setting="Setting(E)",
custom="Setting(E)",
start="Start",
back=BK,
},
@@ -207,22 +198,10 @@ Lib used:
back=BK,
},
draw={
any="ANY",
block1="Z",
block2="S",
block3="L",
block4="J",
block5="T",
block6="O",
block7="I",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
any="Erase",
space="×",
clear="Clear",
demo="Demo",
demo="Don't show ×",
copy="Copy",
paste="Paste",
back=BK,
@@ -231,24 +210,25 @@ Lib used:
pause="Pause",
},
pause={
resume="Resume",
restart="Restart",
sfx="SFX",
bgm="BGM",
quit="Quit",
resume="Resume(space)",
restart="Restart(R)",
setting="Setting(S)",
quit="Quit(esc)",
},
setting_game={
graphic="←Graphic",
sound="Sound→",
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="Control setting",
reTime="Delay before game",
maxNext="Max next count",
autoPause="Auto pause",
layout="Layout",
key="Key Setting",
touch="Touch Setting",
quickR="Quick restart",
autoPause="Auto pause",
swap="Combo key to change ATK mode",
fine="Finesse error SFX",
ctrl="Key Setting",
touch="Touch Setting",
back=BK,
},
setting_graphic={
@@ -257,10 +237,10 @@ Lib used:
ghost="Ghost",
grid="Grid",
center="Center",
skin="Skin",
bg="Background",
bgblock="BG animation",
smo="Smoooth drop",
bgspace="BG space",
smooth="Smooth drop",
lockFX="Lock FX level",
dropFX="Drop FX level",
shakeFX="Shake FX level",
atkFX="ATK FX level",
@@ -273,14 +253,33 @@ Lib used:
graphic="Graphic→",
sfx="SFX",
bgm="BGM",
vib="VIB",
voc="VOC",
vib="Vibration",
voc="Vocal",
stereo="Stereo",
back=BK,
},
setting_control={
das="DAS",arr="ARR",
sddas="softdrop DAS",sdarr="softdrop ARR",
reset="Reset",
back=BK,
},
setting_key={
back=BK,
},
setting_skin={
prev="",next="",
prev1="",next1="",spin1="R",
prev2="",next2="",spin2="R",
prev3="",next3="",spin3="R",
prev4="",next4="",spin4="R",
prev5="",next5="",spin5="R",
prev6="",next6="",spin6="R",
prev7="",next7="",spin7="R",
skinR="reset Color",
faceR="reset Dir",
back=BK,
},
setting_touch={
default="Defaults",
snap=function()return text.snapLevelName[sceneTemp.snap]end,

589
main.lua

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,8 @@ local sectionName={"M7","M8","M9","M","MK","MV","MO","MM","GM"}
local function score(P)
local F=false
if P.modeData.point<70 then--if Less then MM
local R=#P.cleared
local R=#P.clearedRow
if R==0 then return end
if R==4 then R=10 end
P.modeData.point=P.modeData.point+R
P.modeData.event=sectionName[int(P.modeData.point*.1)+1]
@@ -12,14 +13,14 @@ end
return{
name={
"",
"",
"GM",
"",
"",
"GrandMaster",
},
level={
"",
"",
"",
"GM",
"GM",
"GM",
},
info={
"成为方块大师",
@@ -28,9 +29,11 @@ return{
},
color=color.lightBlue,
env={
noFly=true,
minarr=1,
_20G=true,
drop=0,lock=15,
wait=10,fall=15,
wait=15,fall=6,
next=3,
visible="fast",
freshLimit=15,
@@ -39,30 +42,31 @@ return{
if P.stat.time>=53.5 then
P.modeData.point=min(P.modeData.point+16,80)
P.modeData.event=sectionName[int(P.modeData.point*.1)+1]
Event.win(P,"finish")
P:win("finish")
end
end,
arr=1,
bg="game3",bgm="shining terminal",
},
},
slowMark=true,
load=function()
newPlayer(1,340,15)
players[1].modeData.event="M7"
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.grade,-82,170)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
mDraw(drawableText.grade,-81,170)
setFont(55)
mStr(P.modeData.event,-82,110)
mStr(P.modeData.event,-81,110)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_4,-81,340)
end,
score=function(P)return{P.modeData.point,P.stat.score}end,
scoreDisp=function(D)return sectionName[int(D[1]*.1)+1].." "..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 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

@@ -22,7 +22,7 @@ return{
freshLimit=15,
pushSpeed=2,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
if P.atkBuffer.sum==0 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
@@ -52,21 +52,22 @@ return{
end,
bg="game3",bgm="push",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr("24",-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.nextWave,-82,380)
mStr(P.modeData.event,-81,200)
mStr("24",-81,320)
mDraw(drawableText.wave,-81,260)
mDraw(drawableText.nextWave,-81,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..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 W=P.modedata.event
return W>100 and 4 or W>=80 and 3 or W>=50 and 2 or W>=20 and 1
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 or W>=5 and 0
end,
}

View File

@@ -21,7 +21,7 @@ return{
fall=8,
freshLimit=15,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
if P.atkBuffer.sum<2 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
@@ -60,26 +60,27 @@ return{
end
end,
bg="game4",bgm="shining terminal",
},
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr(P.modeData.event,-81,200)
mStr(
P.modeData.event<10 and 22
or P.modeData.event<20 and 25
or 28
,-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.nextWave,-82,380)
,-81,320)
mDraw(drawableText.wave,-81,260)
mDraw(drawableText.nextWave,-81,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..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 W=P.modedata.event
return W>40 and 4 or W>=30 and 3 or W>=20 and 2 or W>=10 and 1
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 or W>=5 and 0
end,
}

View File

@@ -18,24 +18,23 @@ return{
"EASY",
},
info={
"All-spin 入门教程",
"All-spin 入门教程",
"All-spin Tutorial!",
"All-spin 入门教程\n未制作完成,下块即通",
"All-spin 入门教程\n未制作完成,下块即通",
"All-spin Tutorial!\nUNFINISHED,drop to win",
},
color=color.grey,
color=color.lightGrey,
env={
drop=1e99,lock=1e99,
hold=false,
dropPiece=Event.lose,
dropPiece=player.lose,
task=nil,
bg="game1",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(50)
mStr("UNFINISHED",150,100)
end,
score=function(P)return{P.modeData.event,P.stat.extraRate}end,
scoreDisp=function(D)return D[1].."Stage "..format("%.2f",D[2]).."%"end,

View File

@@ -1,3 +1,4 @@
local min=math.min
return{
name={
"隐形",
@@ -18,22 +19,23 @@ return{
env={
drop=30,lock=45,
visible="time",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=10,
target=200,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_4,-81,340)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}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,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
@@ -48,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

@@ -1,3 +1,4 @@
local min=math.min
return{
name={
"隐形",
@@ -20,22 +21,23 @@ return{
fall=10,lock=60,
center=false,
visible="none",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=15,
target=200,
bg="rgb",bgm="secret7th",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_4,-81,340)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}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,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
@@ -50,7 +52,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

@@ -1,3 +1,4 @@
local min=math.min
return{
name={
"隐形",
@@ -20,22 +21,23 @@ return{
fall=5,
center=false,ghost=false,
visible="none",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=15,
target=200,
bg="rgb",bgm="secret8th",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_4,-81,340)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}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,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
@@ -50,7 +52,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

@@ -1,3 +1,4 @@
local min=math.min
return{
name={
"隐形",
@@ -19,22 +20,23 @@ return{
drop=15,lock=45,
freshLimit=10,
visible="fast",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=10,
target=200,
bg="glow",bgm="reason",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_4,-81,340)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}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,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
@@ -49,7 +51,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

@@ -1,3 +1,4 @@
local min=math.min
return{
name={
"隐形",
@@ -21,22 +22,23 @@ return{
block=false,
center=false,ghost=false,
visible="none",
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
freshLimit=15,
target=200,
bg="rgb",bgm="secret7th",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
mDraw(drawableText.line,-81,300)
mDraw(drawableText.techrash,-81,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
mStr(P.stat.row,-81,220)
mStr(P.stat.clear_4,-81,340)
end,
score=function(P)return{P.stat.row<=200 and P.stat.row or 200,P.stat.time}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,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
getRank=function(P)
@@ -46,6 +48,7 @@ return{
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

@@ -1,18 +1,18 @@
local rnd=math.random
local rnd,min=math.random,math.min
local function check_c4w(P)
for i=1,#P.cleared do
P.field[#P.field+1]=getNewRow(10)
P.visTime[#P.visTime+1]=getNewRow(20)
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(10)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if #P.cleared==0 then
Event.lose(P)
if #P.clearedRow==0 then
P:lose()
else
if P.combo>P.modeData.point then
P.modeData.point=P.combo
end
if P.stat.row>=100 then
Event.win(P,"finish")
P:win("finish")
end
end
end
@@ -21,7 +21,7 @@ return{
name={
"C4W练习",
"中四宽练习",
"C4W Train",
"C4W Training",
},
level={
"疯狂",
@@ -38,15 +38,16 @@ return{
drop=5,lock=30,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg="rgb",bgm="newera",
bg="rgb",bgm="oxygen",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
local P=players[1]
local F=P.field
for i=1,24 do
F[i]=getNewRow(10)
P.visTime[i]=getNewRow(20)
F[i]=freeRow.get(10)
P.visTime[i]=freeRow.get(20)
for x=4,7 do F[i][x]=0 end
end
local r=rnd(6)
@@ -60,12 +61,12 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.combo,-82,310)
mStr(P.modeData.point,-82,400)
mDraw(drawableText.combo,-82,358)
mDraw(drawableText.mxcmb,-82,450)
mStr(P.combo,-81,310)
mStr(P.modeData.point,-81,400)
mDraw(drawableText.combo,-81,358)
mDraw(drawableText.mxcmb,-81,450)
end,
score=function(P)return{P.combo<=100 and P.combo or 100,P.stat.time}end,
score=function(P)return{min(P.modeData.point,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..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)
@@ -80,7 +81,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

@@ -1,16 +1,16 @@
local rnd=math.random
local rnd,min=math.random,math.min
local function check_c4w(P)
for i=1,#P.cleared do
P.field[#P.field+1]=getNewRow(10)
P.visTime[#P.visTime+1]=getNewRow(20)
for i=1,#P.clearedRow do
P.field[#P.field+1]=freeRow.get(10)
P.visTime[#P.visTime+1]=freeRow.get(20)
for i=4,7 do P.field[#P.field][i]=0 end
end
if #P.cleared>0 then
if #P.clearedRow>0 then
if P.combo>P.modeData.point then
P.modeData.point=P.combo
end
if P.stat.row>=100 then
Event.win(P,"finish")
P:win("finish")
end
end
end
@@ -19,7 +19,7 @@ return{
name={
"C4W练习",
"中四宽练习",
"C4W Train",
"C4W Training",
},
level={
"普通",
@@ -36,15 +36,16 @@ return{
drop=30,lock=60,oncehold=false,
dropPiece=check_c4w,
freshLimit=15,ospin=false,
bg="rgb",bgm="newera",
bg="rgb",bgm="oxygen",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
local P=players[1]
local F=P.field
for i=1,24 do
F[i]=getNewRow(10)
P.visTime[i]=getNewRow(20)
F[i]=freeRow.get(10)
P.visTime[i]=freeRow.get(20)
for x=4,7 do F[i][x]=0 end
end
local r=rnd(6)
@@ -58,12 +59,12 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.combo,-82,310)
mStr(P.modeData.point,-82,400)
mDraw(drawableText.combo,-82,358)
mDraw(drawableText.mxcmb,-82,450)
mStr(P.combo,-81,310)
mStr(P.modeData.point,-81,400)
mDraw(drawableText.combo,-81,358)
mDraw(drawableText.mxcmb,-81,450)
end,
score=function(P)return{P.modeData.point<=100 and P.modeData.point or 100,P.stat.time}end,
score=function(P)return{min(P.modeData.point,100),P.stat.time}end,
scoreDisp=function(D)return D[1].." Combo "..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)
@@ -78,7 +79,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

@@ -8,7 +8,7 @@ local function check_LVup(P)
P.gameEnv.drop,P.gameEnv.lock=1,1
end
if P.gameEnv.target>100 then
SFX("reach")
SFX.play("reach")
end
end
end
@@ -31,31 +31,34 @@ return{
},
color=color.lightBlue,
env={
noFly=true,
das=16,arr=6,sddas=2,sdarr=2,
ghost=false,center=false,
drop=3,lock=3,wait=10,fall=25,
next=1,hold=false,
sequence="rnd",
freshLimit=0,
face={0,0,2,2,2,0,0},
target=10,dropPiece=check_LVup,
bg="rgb",bgm="rockblock",
},
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(75)
local r=P.gameEnv.target*.1
mStr(r<11 and 18 or r<22 and r+8 or r==22 and"00"or r==23 and"0a"or format("%x",r*10-220),-82,210)
mDraw(drawableText.speedLV,-82,290)
mStr(r<11 and 18 or r<22 and r+8 or r==22 and"00"or r==23 and"0a"or format("%x",r*10-220),-81,210)
mDraw(drawableText.speedLV,-81,290)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(P.gameEnv.target,-82,370)
mStr(P.stat.row,-81,320)
mStr(P.gameEnv.target,-81,370)
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].." Lines "..D[2]end,
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]>b[2]end,
score=function(P)return{P.stat.score,P.stat.row}end,
scoreDisp=function(D)return D[1].." "..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 L=P.stat.row
return
@@ -63,6 +66,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

@@ -18,7 +18,7 @@ return{
},
color=color.white,
env={
dropPiece=Event.reach_winCheck,
dropPiece=player.reach_winCheck,
},
load=function()
for i=1,#customID do
@@ -50,8 +50,8 @@ return{
for _,P in next,players.alive do
local t=P.showTime*3
for y=1,preField.h do
P.field[y]=getNewRow(0)
P.visTime[y]=getNewRow(t)
P.field[y]=freeRow.get(0)
P.visTime[y]=freeRow.get(t)
for x=1,10 do P.field[y][x]=preField[y][x]end
end
end
@@ -61,11 +61,11 @@ return{
mesDisp=function(P,dx,dy)
setFont(55)
if P.gameEnv.puzzle or P.gameEnv.target>1e10 then
mStr(P.stat.row,-82,225)
mDraw(drawableText.line,-82,290)
mStr(P.stat.row,-81,225)
mDraw(drawableText.line,-81,290)
else
local R=P.gameEnv.target-P.stat.row
mStr(R>=0 and R or 0,-82,240)
mStr(R>=0 and R or 0,-81,240)
end
if P.gameEnv.puzzle and P.modeData.event==0 then
local m=puzzleMark

View File

@@ -7,14 +7,14 @@ local function puzzleCheck(P)
local a,b=preField[y][x],L and L[x]or 0
if a~=0 then
if a==-1 then if b>0 then return end
elseif a<8 then if a~=b then return end
elseif a<12 then if a~=b then return end
elseif a>7 then if b==0 then return end
end
end
end
end
P.modeData.event=1
Event.win(P,"finish")
P:win("finish")
end
return{
@@ -73,8 +73,8 @@ return{
mesDisp=function(P)
local dx,dy=P.fieldOff.x,P.fieldOff.y
setFont(55)
mStr(P.stat.row,-82,225)
mDraw(drawableText.line,-82,290)
mStr(P.stat.row,-81,225)
mDraw(drawableText.line,-81,290)
if P.gameEnv.puzzle and P.modeData.event==0 then
local m=puzzleMark
for y=1,preField.h do for x=1,10 do

View File

@@ -22,7 +22,7 @@ return{
freshLimit=15,
pushSpeed=2,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
local t=240-2*P.modeData.event
if P.modeData.counter>=t then
@@ -51,17 +51,18 @@ return{
end
end
end,
bg="game4",bgm="way",
bg="game4",bgm="shining terminal",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr(P.modeData.point,-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.rpm,-82,380)
mStr(P.modeData.event,-81,200)
mStr(P.modeData.point,-81,320)
mDraw(drawableText.wave,-81,260)
mDraw(drawableText.rpm,-81,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
@@ -73,6 +74,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
W>=5 and 0
end,
}

View File

@@ -22,7 +22,7 @@ return{
freshLimit=15,
pushSpeed=1,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
local t=360-P.modeData.event*2
if P.modeData.counter>=t then
@@ -53,15 +53,16 @@ return{
end,
bg="game3",bgm="way",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(55)
mStr(P.modeData.event,-82,200)
mStr(P.modeData.point,-82,320)
mDraw(drawableText.wave,-82,260)
mDraw(drawableText.rpm,-82,380)
mStr(P.modeData.event,-81,200)
mStr(P.modeData.point,-81,320)
mDraw(drawableText.wave,-81,260)
mDraw(drawableText.rpm,-81,380)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
@@ -73,6 +74,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
W>=3 and 0
end,
}

View File

@@ -21,23 +21,25 @@ return{
fall=20,
freshLimit=15,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(90,180-P.modeData.event)then
P.modeData.counter=0
if not(P.control and scene.cur=="play")then return end
local D=P.modeData
D.counter=D.counter+1
if D.counter>=max(90,180-D.event)then
P:garbageRise(10,1,rnd(10))
P.modeData.event=P.modeData.event+1
D.counter=0
D.event=D.event+1
end
end,
bg="game2",bgm="push",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,
@@ -49,6 +51,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
P.stat.row>=5 and 0
end,
}

View File

@@ -20,23 +20,25 @@ return{
drop=10,lock=30,
freshLimit=15,
task=function(P)
if not P.control then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(45,80-.3*P.modeData.event)then
P.modeData.counter=0
P:garbageRise(11+P.modeData.event%3,1,rnd(10))
P.modeData.event=P.modeData.event+1
if not(P.control and scene.cur=="play")then return end
local D=P.modeData
D.counter=D.counter+1
if D.counter>=max(30,80-.3*D.event)then
P:garbageRise(11+D.event%3,1,rnd(10))
D.counter=0
D.event=D.event+1
end
end,
bg="game2",bgm="secret7th",
},
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.row}end,
scoreDisp=function(D)return D[1].." Waves "..D[2].." Lines"end,
@@ -44,10 +46,11 @@ return{
getRank=function(P)
local W=P.modeData.event
return
W>=120 and 5 or
W>=100 and 4 or
W>=150 and 5 or
W>=110 and 4 or
W>=80 and 3 or
W>=50 and 2 or
W>=20 and 1
W>=20 and 1 or
P.stat.row>=5 and 0
end,
}

View File

@@ -1,3 +1,4 @@
local min=math.min
return{
name={
"干旱",
@@ -18,30 +19,37 @@ return{
env={
drop=20,lock=60,
sequence="drought2",
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
ospin=false,
freshLimit=15,
bg="glow",bgm="reason",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,280)
mStr(R>=0 and R or 0,-81,280)
end,
score=function(P)return{P.stat.row<=100 and P.stat.row or 100,P.stat.time}end,
score=function(P)return{min(P.stat.row,100),P.stat.time}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

@@ -1,3 +1,4 @@
local min=math.min
return{
name={
"干旱",
@@ -18,30 +19,37 @@ return{
env={
drop=20,lock=60,
sequence="drought1",
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
ospin=false,
freshLimit=15,
bg="glow",bgm="reason",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(70)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,280)
mStr(R>=0 and R or 0,-81,280)
end,
score=function(P)return{P.stat.row<=100 and P.stat.row or 100,P.stat.time}end,
score=function(P)return{min(P.stat.row,100),P.stat.time}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

@@ -6,9 +6,9 @@ return{
"Infinite",
},
level={
"时间杀手 II",
"时间杀手 II",
"Time Killer II",
"",
"",
"",
},
info={
"沙盒",
@@ -26,13 +26,13 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,370)
mDraw(drawableText.atk,-82,313)
mDraw(drawableText.eff,-82,425)
mStr(P.stat.atk,-81,260)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,370)
mDraw(drawableText.atk,-81,313)
mDraw(drawableText.eff,-81,425)
end,
score=function(P)return{P.stat.score}end,
scoreDisp=function(D)return D[1]end,
scoreDisp=function(D)return tostring(D[1])end,
comp=function(a,b)return a[1]>b[1]end,
getRank=function(P)
local L=P.stat.row
@@ -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

@@ -1,6 +1,6 @@
local format,rnd=string.format,math.random
local function check_rise(P)
local L=P.cleared
local L=P.clearedRow
for i=1,#L do
if L[i]<6 then
P:garbageRise(10,1,rnd(10))
@@ -16,9 +16,9 @@ return{
"Infinite:dig",
},
level={
"时间杀手 III",
"时间杀手 III",
"Time Killer III",
"",
"",
"",
},
info={
"挖呀挖呀挖",
@@ -41,12 +41,12 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.modeData.point,-82,190)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.line,-82,243)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.modeData.point,-81,190)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.line,-81,243)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,475)
end,
score=function(P)return{P.modeData.point}end,
scoreDisp=function(D)return D[1].." Lines"end,
@@ -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
P:win("finish")
end
end
end
@@ -17,23 +26,27 @@ return{
"HARD",
},
info={
"200行20G马拉松",
"200行20G马拉松",
"200L marathon in 20G",
"200行高速马拉松",
"200行高速马拉松",
"200L marathon in high speed",
},
color=color.magenta,
env={
_20G=true,fall=15,
dropPiece=check,
noFly=true,
mindas=7,minarr=1,minsdarr=1,
drop=.5,fall=30,
target=50,dropPiece=check,
bg="strap",bgm="race",
},
pauseLimit=true,
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(200,-82,370)
mStr(P.stat.row,-81,320)
mStr(P.gameEnv.target,-81,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,
@@ -45,12 +58,13 @@ return{
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")
P:win("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.play("reach")
end
end
end
@@ -26,23 +25,28 @@ return{
"NORMAL",
},
info={
"200行速马拉松",
"200行速马拉松",
"200行速马拉松",
"200行速马拉松",
"200L marathon with acceleration",
},
color=color.green,
env={
drop=60,fall=20,
noFly=true,
minsdarr=1,
fall=30,
target=10,dropPiece=check_LVup,
mindas=7,minarr=1,minsdarr=1,
bg="strap",bgm="way",
},
pauseLimit=true,
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.row,-82,320)
mStr(P.modeData.point+10,-82,370)
mStr(P.stat.row,-81,320)
mStr(P.modeData.point+10,-81,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,
@@ -53,13 +57,14 @@ return{
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

@@ -4,7 +4,7 @@ local death_lock={12,11,10,9,8}
local death_wait={10,9,8,7,6}
local death_fall={10,9,8,7,6}
local function score(P)
local c=#P.cleared
local c=#P.clearedRow
if c==0 and P.modeData.point%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
@@ -12,7 +12,7 @@ local function score(P)
end
P.modeData.point=P.modeData.point+s
if P.modeData.point%100==99 then
SFX("blip_1")
SFX.play("blip_1")
elseif P.modeData.point>=100*(P.modeData.event+1)then
local s=P.modeData.event+1;P.modeData.event=s--level up!
local E=P.gameEnv
@@ -24,11 +24,11 @@ local function score(P)
if s==3 then P.gameEnv.bone=true end
if s==5 then
P.modeData.point,P.modeData.event=500,4
Event.win(P,"finish")
P:win("finish")
else
P:showText(text.stage(s),0,-120,80,"fly")
end
SFX("reach")
SFX.play("reach")
end
end
@@ -44,28 +44,30 @@ return{
"ULTIMATE",
},
info={
"进阶20G",
"进阶20G",
"Advanced 20G",
"20G:上级者的挑战",
"20G:上级者的挑战",
"20G:For Pro",
},
color=color.red,
env={
noFly=true,
mindas=6,minarr=1,
_20G=true,
lock=death_lock[1],
wait=death_wait[1],
fall=death_fall[1],
dropPiece=score,
das=6,arr=1,
freshLimit=15,
bg="game2",bgm="secret7th",
},
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.modeData.point,-82,320)
mStr((P.modeData.event+1)*100,-82,370)
mStr(P.modeData.point,-81,320)
mStr((P.modeData.event+1)*100,-81,370)
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.row,P.stat.time}end,
@@ -74,18 +76,19 @@ return{
return a[1]>b[1]or(a[1]==b[1]and(a[2]<b[2]or a[2]==b[2]and a[3]<b[3]))
end,
getRank=function(P)
local L=P.stat.row
local S=P.modeData.point
if S==500 then
local L=P.stat.clear_4
return
L<=260 and 5 or
L<=320 and 4 or
L>=30 and 5 or
L>=25 and 4 or
3
else
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

@@ -3,7 +3,7 @@ local rush_lock={20,18,16,15,14}
local rush_wait={12,10,9,8,7}
local rush_fall={18,16,14,13,12}
local function score(P)
local c=#P.cleared
local c=#P.clearedRow
if c==0 and P.modeData.point%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
@@ -11,7 +11,7 @@ local function score(P)
end
P.modeData.point=P.modeData.point+s
if P.modeData.point%100==99 then
SFX("blip_1")
SFX.play("blip_1")
elseif P.modeData.point>=100*(P.modeData.event+1)then
local s=P.modeData.event+1;P.modeData.event=s--level up!
local E=P.gameEnv
@@ -28,11 +28,11 @@ local function score(P)
if s==5 then
P.modeData.point,P.modeData.event=500,4
Event.win(P,"finish")
P:win("finish")
else
P:showText(text.stage(s),0,-120,80,"fly")
end
SFX("reach")
SFX.play("reach")
end
end
@@ -48,28 +48,30 @@ return{
"LUNATIC",
},
info={
"初心20G",
"初心20G",
"Beginner 20G",
"20G:初心者适用",
"20G:初心者适用",
"20G:Back to beginner",
},
color=color.red,
env={
noFly=true,
das=9,arr=3,
_20G=true,
lock=rush_lock[1],
wait=rush_wait[1],
fall=rush_fall[1],
dropPiece=score,
das=9,arr=3,
freshLimit=15,
bg="strap",bgm="secret8th",
},
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.modeData.point,-82,320)
mStr((P.modeData.event+1)*100,-82,370)
mStr(P.modeData.point,-81,320)
mStr((P.modeData.event+1)*100,-81,370)
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.row,P.stat.time}end,
@@ -78,18 +80,19 @@ return{
return a[1]>b[1]or(a[1]==b[1]and(a[2]<b[2]or a[2]==b[2]and a[3]<b[3]))
end,
getRank=function(P)
local L=P.stat.row
local S=P.modeData.point
if S==500 then
local L=P.stat.clear_4
return
L<=250 and 5 or
L<=300 and 4 or
L>=30 and 5 or
L>=25 and 4 or
3
else
return
S>=420 and 3 or
S>=250 and 2 or
S>=120 and 1
S>=120 and 1 or
S>=30 and 0
end
end,
}

View File

@@ -1,7 +1,7 @@
local gc=love.graphics
local int=math.floor
local function score(P)
local c=#P.cleared
local c=#P.clearedRow
if c==0 and P.modeData.point%100==99 then return end
local s=c<3 and c+1 or c==3 and 5 or 7
if P.combo>7 then s=s+2
@@ -9,7 +9,7 @@ local function score(P)
end
local MD=P.modeData
MD.point=MD.point+s
if MD.point%100==99 then SFX("blip_1")end
if MD.point%100==99 then SFX.play("blip_1")end
if int(MD.point*.01)>MD.event then
local s=MD.event+1;MD.event=s--level up!
P:showText(text.stage(s),0,-120,80,"fly")
@@ -27,9 +27,9 @@ local function score(P)
end
else
MD.point,MD.event=1000,9
Event.win(P,"finish")
P:win("finish")
end
SFX("reach")
SFX.play("reach")
end
end
@@ -45,28 +45,30 @@ return{
"FINAL",
},
info={
"究极20G:无法到达的终点",
"究极20G:无法到达的终点",
"究极20G:无法触及的终点",
"究极20G:无法触及的终点",
"Extreme 20G:Unreachable destination",
},
color=color.lightGrey,
env={
noFly=true,
mindas=5,minarr=1,
_20G=true,lock=12,
wait=10,fall=10,
dropPiece=score,
das=5,arr=1,
freshLimit=15,
easyFresh=false,bone=true,
bg="none",bgm="shining terminal",
bg="none",bgm="distortion",
},
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local MD=P.modeData
mStr(MD.point,-82,320)
mStr((MD.event+1)*100,-82,370)
mStr(MD.point,-81,320)
mStr((MD.event+1)*100,-81,370)
gc.rectangle("fill",-125,375,90,4)
end,
score=function(P)return{P.modeData.point,P.stat.time}end,
@@ -79,6 +81,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
S>=50 and 0
end,
}

View File

@@ -19,22 +19,23 @@ return{
env={
drop=60,lock=120,
fall=10,
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
freshLimit=15,
ospin=false,
bg="rgb",bgm="infinite",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,250)
mStr(R>=0 and R or 0,-81,250)
setFont(75)
mStr(P.stat.pc,-82,350)
mDraw(drawableText.pc,-82,432)
mStr(P.stat.pc,-81,350)
mDraw(drawableText.pc,-81,432)
gc.setColor(.5,.5,.5)
if frame>179 then
@@ -52,6 +53,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

@@ -19,22 +19,23 @@ return{
env={
drop=20,lock=60,
fall=20,
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
freshLimit=15,
ospin=false,
bg="rgb",bgm="infinite",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,250)
mStr(R>=0 and R or 0,-81,250)
setFont(75)
mStr(P.stat.pc,-82,350)
mDraw(drawableText.pc,-82,432)
mStr(P.stat.pc,-81,350)
mDraw(drawableText.pc,-81,432)
gc.setColor(.5,.5,.5)
if frame>179 then
@@ -52,6 +53,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

@@ -19,21 +19,22 @@ return{
env={
oncehold=false,
drop=300,lock=1e99,
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
ospin=false,
bg="rgb",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
local R=100-P.stat.row
mStr(R>=0 and R or 0,-82,250)
mStr(R>=0 and R or 0,-81,250)
setFont(75)
mStr(P.stat.pc,-82,350)
mDraw(drawableText.pc,-82,432)
mStr(P.stat.pc,-81,350)
mDraw(drawableText.pc,-81,432)
gc.setColor(.5,.5,.5)
if frame>179 then
@@ -51,6 +52,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

@@ -10,12 +10,12 @@ local function task_PC(P)
if P.modeData.counter==21 then
local t=P.stat.pc%2
for i=1,4 do
local r=getNewRow(0)
local r=freeRow.get(0)
for j=1,10 do
r[j]=PCbase[4*t+i][j]
end
ins(P.field,1,r)
ins(P.visTime,1,getNewRow(20))
ins(P.visTime,1,freeRow.get(20))
end
P.fieldBeneath=P.fieldBeneath+120
P.curY=P.curY+4
@@ -30,7 +30,7 @@ local function newPC(P)
local c=0
for i=1,10 do if r[i]>0 then c=c+1 end end
if c<5 then
Event.lose(P)
P:lose()
end
end
if P.stat.piece%4==0 and #P.field==0 then
@@ -66,7 +66,7 @@ return{
name={
"全清训练",
"全清训练",
"PC Train",
"PC Training",
},
level={
"疯狂",
@@ -88,16 +88,17 @@ return{
freshLimit=15,
dropPiece=newPC,
ospin=false,
bg="rgb",bgm="newera",
bg="rgb",bgm="oxygen",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPC(players[1])
end,
mesDisp=function(P,dx,dy)
setFont(75)
mStr(P.stat.pc,-82,330)
mDraw(drawableText.pc,-82,412)
mStr(P.stat.pc,-81,330)
mDraw(drawableText.pc,-81,412)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(D[2])end,
@@ -109,6 +110,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

@@ -7,12 +7,12 @@ local function task_PC(P)
if P.modeData.counter==21 then
local t=P.stat.pc%2
for i=1,4 do
local r=getNewRow(0)
local r=freeRow.get(0)
for j=1,10 do
r[j]=PCbase[4*t+i][j]
end
ins(P.field,1,r)
ins(P.visTime,1,getNewRow(20))
ins(P.visTime,1,freeRow.get(20))
end
P.fieldBeneath=P.fieldBeneath+120
P.curY=P.curY+4
@@ -26,7 +26,7 @@ local function newPC(P)
local c=0
for i=1,10 do if r[i]>0 then c=c+1 end end
if c<5 then
Event.lose(P)
P:lose()
end
end
if P.stat.piece%4==0 and #P.field==0 then
@@ -50,7 +50,7 @@ return{
name={
"全清训练",
"全清训练",
"PC Train",
"PC Training",
},
level={
"普通",
@@ -71,16 +71,17 @@ return{
sequence="none",
dropPiece=newPC,
ospin=false,
bg="rgb",bgm="newera",
bg="rgb",bgm="oxygen",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPC(players[1])
end,
mesDisp=function(P,dx,dy)
setFont(75)
mStr(P.stat.pc,-82,330)
mDraw(drawableText.pc,-82,412)
mStr(P.stat.pc,-81,330)
mDraw(drawableText.pc,-81,412)
end,
score=function(P)return{P.stat.pc,P.stat.time}end,
scoreDisp=function(D)return D[1].." PCs "..toTime(D[2])end,
@@ -92,6 +93,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

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"简单",
@@ -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

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"普通",
@@ -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

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"困难",
@@ -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

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"疯狂",
@@ -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

@@ -14,7 +14,7 @@ return{
name={
"回合制",
"回合制",
"Turn-Base",
"Turn-Based",
},
level={
"极限",
@@ -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

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",3))

View File

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",5))

View File

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",7))

View File

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",8))

View File

@@ -20,6 +20,7 @@ return{
freshLimit=15,
bg="game2",bgm="race",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
newPlayer(2,965,360,.5,AITemplate("9S",9))

View File

@@ -19,7 +19,7 @@ return{
color=color.cyan,
env={
drop=60,lock=60,
target=10,dropPiece=Event.reach_winCheck,
target=10,dropPiece=player.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=10-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -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<=62 and 1 or
0
end,
}

View File

@@ -19,7 +19,7 @@ return{
color=color.orange,
env={
drop=60,lock=60,
target=100,dropPiece=Event.reach_winCheck,
target=100,dropPiece=player.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=100-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -44,10 +44,11 @@ return{
if P.stat.row<100 then return end
local T=P.stat.time
return
T<=60 and 5 or
T<=62 and 5 or
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

@@ -19,7 +19,7 @@ return{
color=color.lightGrey,
env={
drop=60,lock=60,
target=1000,dropPiece=Event.reach_winCheck,
target=1000,dropPiece=player.reach_winCheck,
bg="strap",bgm="push",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=1000-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -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

@@ -19,7 +19,7 @@ return{
color=color.lightBlue,
env={
drop=60,lock=60,
target=20,dropPiece=Event.reach_winCheck,
target=20,dropPiece=player.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=20-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -47,7 +47,8 @@ return{
T<=13 and 5 or
T<=18 and 4 or
T<=45 and 3 or
T<=70 and 2 or
T<=100 and 1
T<=80 and 2 or
T<=126 and 1 or
0
end,
}

View File

@@ -19,7 +19,7 @@ return{
color=color.green,
env={
drop=60,lock=60,
target=40,dropPiece=Event.reach_winCheck,
target=40,dropPiece=player.reach_winCheck,
bg="strap",bgm="race",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=40-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -44,10 +44,11 @@ return{
if P.stat.row<40 then return end
local T=P.stat.time
return
T<=25 and 5 or
T<=32 and 4 or
T<=26 and 5 or
T<=32.6 and 4 or
T<=40 and 3 or
T<=60 and 2 or
T<=120 and 1
T<=62 and 2 or
T<=183 and 1 or
0
end,
}

View File

@@ -19,7 +19,7 @@ return{
color=color.red,
env={
drop=60,lock=60,
target=400,dropPiece=Event.reach_winCheck,
target=400,dropPiece=player.reach_winCheck,
bg="strap",bgm="push",
},
load=function()
@@ -30,7 +30,7 @@ return{
setFont(55)
local r=400-P.stat.row
if r<0 then r=0 end
mStr(r,-82,265)
mStr(r,-81,265)
if r<21 and r>0 then
gc.setLineWidth(4)
gc.setColor(1,r>10 and 0 or rnd(),.5)
@@ -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

@@ -20,7 +20,7 @@ return{
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(60,150-2*P.modeData.event)and P.atkBuffer.sum<4 then
P.atkBuffer[#P.atkBuffer+1]={pos=rnd(10),amount=1,countdown=30,cd0=30,time=0,sent=false,lv=1}
@@ -33,15 +33,14 @@ return{
end,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
setFont(65)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
@@ -53,6 +52,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

@@ -20,7 +20,7 @@ return{
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(60,180-2*P.modeData.event)and P.atkBuffer.sum<15 then
P.atkBuffer[#P.atkBuffer+1]=
@@ -38,15 +38,14 @@ return{
end,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
setFont(65)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
@@ -58,6 +57,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

@@ -20,7 +20,7 @@ return{
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(60,150-P.modeData.event)and P.atkBuffer.sum<20 then
local t=max(60,90-P.modeData.event)
@@ -34,15 +34,14 @@ return{
end,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
setFont(65)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
@@ -54,6 +53,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

@@ -20,7 +20,7 @@ return{
drop=30,lock=45,
freshLimit=10,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(90,180-2*P.modeData.event)and P.atkBuffer.sum<8 then
local d=P.modeData.event+1
@@ -38,15 +38,14 @@ return{
end,
bg="glow",bgm="newera",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
mDraw(drawableText.line,-82,300)
mDraw(drawableText.techrash,-82,420)
setFont(75)
mStr(P.stat.row,-82,220)
mStr(P.stat.clear_4,-82,340)
setFont(65)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
@@ -58,6 +57,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

@@ -22,7 +22,7 @@ return{
freshLimit=15,
pushSpeed=2,
task=function(P)
if not P.control then return end
if not(P.control and scene.cur=="play")then return end
P.modeData.counter=P.modeData.counter+1
if P.modeData.counter>=max(300,600-10*P.modeData.event)and P.atkBuffer.sum<20 then
local t=max(300,480-12*P.modeData.event)
@@ -33,20 +33,21 @@ return{
P.atkBuffer[p+3]={pos=rnd(10),amount=6,countdown=1.5*t,cd0=1.5*t,time=0,sent=false,lv=5}
P.atkBuffer.sum=P.atkBuffer.sum+20
P.stat.recv=P.stat.recv+20
P.modeData.counter=0
if P.modeData.event==31 then P:showText(text.maxspeed,0,-140,100,"appear",.6)end
P.modeData.counter=0
P.modeData.event=P.modeData.event+1
end
end,
bg="rgb",bgm="secret7th",
},
pauseLimit=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(65)
mStr(P.modeData.event,-82,310)
mDraw(drawableText.wave,-82,375)
mStr(P.modeData.event,-81,310)
mDraw(drawableText.wave,-81,375)
end,
score=function(P)return{P.modeData.event,P.stat.time}end,
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
@@ -58,6 +59,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,7 +1,7 @@
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)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
end
end
@@ -26,7 +26,7 @@ return{
drop=30,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_reach_ultimate,
dropPiece=tech_check_ultimate,
bg="matrix",bgm="secret8th",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,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].." Lines "..toTime(D[2])end,
@@ -49,6 +49,7 @@ return{
L>=126 and 4 or
L>=90 and 3 or
L>=60 and 2 or
L>=30 and 1
L>=30 and 1 or
L>=5 and 0
end,
}

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_easy(P)
if #P.cleared>0 and P.b2b<40 then
Event.lose(P)
if #P.clearedRow>0 and P.b2b<40 then
P:lose()
end
end
@@ -26,7 +26,7 @@ return{
drop=20,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_reach_easy,
dropPiece=tech_check_easy,
bg="matrix",bgm="secret8th",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,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].." Lines "..toTime(D[2])end,
@@ -49,6 +49,7 @@ return{
L>=126 and 4 or
L>=90 and 3 or
L>=60 and 2 or
L>=30 and 1
L>=30 and 1 or
L>=5 and 0
end,
}

View File

@@ -1,7 +1,7 @@
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)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
end
end
@@ -26,7 +26,7 @@ return{
_20G=true,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_reach_ultimate,
dropPiece=tech_check_ultimate,
bg="matrix",bgm="secret7th",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,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].." Lines "..toTime(D[2])end,
@@ -49,6 +49,7 @@ return{
L>=140 and 4 or
L>=90 and 3 or
L>=60 and 2 or
L>=30 and 1
L>=30 and 1 or
L>=5 and 0
end,
}

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_hard(P)
if #P.cleared>0 and P.lastClear<10 then
Event.lose(P)
if #P.clearedRow>0 and P.lastClear<10 then
P:lose()
end
end
@@ -17,16 +17,16 @@ return{
"LUNATIC",
},
info={
"禁止断B2B",
"禁止断满贯",
"Keep B2B",
"禁止普通消除",
"禁止普通消除",
"No normal clear",
},
color=color.red,
env={
_20G=true,lock=60,
freshLimit=15,
target=200,
dropPiece=tech_reach_hard,
dropPiece=tech_check_hard,
bg="matrix",bgm="secret7th",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,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].." Lines "..toTime(D[2])end,
@@ -49,6 +49,7 @@ return{
L>=140 and 4 or
L>=90 and 3 or
L>=60 and 2 or
L>=30 and 1
L>=30 and 1 or
L>=5 and 0
end,
}

View File

@@ -1,7 +1,7 @@
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)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
end
end
@@ -26,7 +26,7 @@ return{
oncehold=false,
drop=1e99,lock=1e99,
target=200,
dropPiece=tech_reach_ultimate,
dropPiece=tech_check_ultimate,
bg="matrix",bgm="newera",
},
load=function()
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,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].." Lines "..toTime(D[2])end,
@@ -49,6 +49,7 @@ return{
L>=126 and 4 or
L>=80 and 3 or
L>=50 and 2 or
L>=20 and 1
L>=20 and 1 or
L>=5 and 0
end,
}

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_easy(P)
if #P.cleared>0 and P.b2b<40 then
Event.lose(P)
if #P.clearedRow>0 and P.b2b<40 then
P:lose()
end
end
@@ -34,10 +34,10 @@ return{
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,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].." Lines "..toTime(D[2])end,
@@ -49,6 +49,7 @@ return{
L>=126 and 4 or
L>=80 and 3 or
L>=50 and 2 or
L>=20 and 1
L>=20 and 1 or
L>=5 and 0
end,
}

View File

@@ -1,7 +1,7 @@
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)
if #P.clearedRow>0 and P.lastClear<10 or P.lastClear==74 then
P:lose()
end
end
@@ -17,28 +17,30 @@ return{
"ULTIMATE+",
},
info={
"禁止普通消除,强制最简操作",
"禁止普通消除,强制最简操作",
"Don't do normal clear,no finesse error",
"仅允许spin与PC,强制最简操作",
"仅允许spin与全清,强制最简操作",
"Spin&PC only,no finesse error",
},
color=color.grey,
env={
arr=0,
drop=1e99,lock=60,
freshLimit=15,
target=200,
fineKill=true,
dropPiece=tech_reach_ultimate,
dropPiece=tech_check_ultimate,
bg="flink",bgm="infinite",
},
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,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].." Lines "..toTime(D[2])end,
@@ -50,6 +52,7 @@ return{
L>=150 and 4 or
L>=100 and 3 or
L>=70 and 2 or
L>=40 and 1
L>=40 and 1 or
L>=10 and 0
end,
}

View File

@@ -1,7 +1,7 @@
local format=string.format
local function tech_check_hard(P)
if #P.cleared>0 and P.lastClear<10 then
Event.lose(P)
if #P.clearedRow>0 and P.lastClear<10 then
P:lose()
end
end
@@ -17,28 +17,30 @@ return{
"ULTIMATE",
},
info={
"仅允许spin与PC,强制最简操作",
"仅允许spin与全清,强制最简操作",
"Don't do normal clear,no finesse error",
"禁止普通消除,强制最简操作",
"禁止普通消除,强制最简操作",
"No normal clear,no finesse error",
},
color=color.lightYellow,
env={
arr=0,
drop=1e99,lock=60,
freshLimit=15,
target=200,
fineKill=true,
dropPiece=tech_reach_hard,
dropPiece=tech_check_hard,
bg="flink",bgm="infinite",
},
slowMark=true,
load=function()
newPlayer(1,340,15)
end,
mesDisp=function(P,dx,dy)
setFont(45)
mStr(P.stat.atk,-82,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-82,420)
mDraw(drawableText.atk,-82,363)
mDraw(drawableText.eff,-82,475)
mStr(P.stat.atk,-81,310)
mStr(format("%.2f",P.stat.atk/P.stat.row),-81,420)
mDraw(drawableText.atk,-81,363)
mDraw(drawableText.eff,-81,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].." Lines "..toTime(D[2])end,
@@ -50,6 +52,7 @@ return{
L>=150 and 4 or
L>=100 and 3 or
L>=70 and 2 or
L>=40 and 1
L>=40 and 1 or
L>=10 and 0
end,
}

Some files were not shown because too many files have changed in this diff Show More