Merge branch 'main' into main

This commit is contained in:
user670
2021-04-19 18:02:37 +08:00
committed by GitHub
93 changed files with 1401 additions and 1284 deletions

View File

@@ -3,10 +3,10 @@ local COLOR={
fire= {1.0, 0.4, 0.0},
orange= {1.0, 0.6, 0.0},
yellow= {1.0, 1.0, 0.0},
lame= {0.7, 1.0, 0.0},
lime= {0.7, 1.0, 0.0},
grass= {0.5, 1.0, 0.0},
green= {0.0, 1.0, 0.0},
water= {0.0, 1.0, 0.6},
aqua= {0.0, 1.0, 0.6},
cyan= {0.0, 1.0, 1.0},
sky= {0.0, 0.7, 1.0},
sea= {0.0, 0.4, 1.0},
@@ -20,10 +20,10 @@ local COLOR={
lFire= {1.0, 0.7, 0.5},
lOrange= {1.0, 0.8, 0.3},
lYellow= {1.0, 1.0, 0.5},
lLame= {0.8, 1.0, 0.4},
lLime= {0.8, 1.0, 0.4},
lGrass= {0.6, 1.0, 0.4},
lGreen= {0.5, 1.0, 0.5},
lWater= {0.4, 1.0, 0.7},
lAqua= {0.4, 1.0, 0.7},
lCyan= {0.5, 1.0, 1.0},
lSky= {0.5, 0.8, 1.0},
lSea= {0.4, 0.7, 1.0},
@@ -37,10 +37,10 @@ local COLOR={
dFire= {0.6, 0.3, 0.0},
dOrange= {0.6, 0.4, 0.0},
dYellow= {0.6, 0.6, 0.0},
dLame= {0.5, 0.6, 0.0},
dLime= {0.5, 0.6, 0.0},
dGrass= {0.3, 0.6, 0.0},
dGreen= {0.0, 0.6, 0.0},
dWater= {0.0, 0.6, 0.4},
dAqua= {0.0, 0.6, 0.4},
dCyan= {0.0, 0.6, 0.6},
dSky= {0.0, 0.4, 0.6},
dSea= {0.0, 0.2, 0.6},
@@ -51,9 +51,9 @@ local COLOR={
dPink= {0.6, 0.0, 0.3},
black= {0.0, 0.0, 0.0},
dGrey= {0.3, 0.3, 0.3},
grey= {0.6, 0.6, 0.6},
lGrey= {0.8, 0.8, 0.8},
dGray= {0.3, 0.3, 0.3},
gray= {0.6, 0.6, 0.6},
lGray= {0.8, 0.8, 0.8},
white= {1.0, 1.0, 1.0},
}
local map={
@@ -63,20 +63,20 @@ local map={
W="white",
}for k,v in next,map do COLOR[k]=COLOR[v]end
local list_norm={"red","fire","orange","yellow","lame","grass","green","water","cyan","sky","sea","blue","purple","grape","magenta","pink"}
local list_norm={"red","fire","orange","yellow","i","grass","green","aqua","cyan","sky","sea","blue","purple","grape","magenta","pink"}
local len_list_norm=#list_norm
local rnd=math.random
function COLOR.random_norm()
return COLOR[list_norm[rnd(len_list_norm)]]
end
local list_bright={"lRed","lFire","lOrange","lYellow","lLame","lGrass","lGreen","lWater","lCyan","lSky","lSea","lBlue","lPurple","lGrape","lMagenta","lPink"}
local list_bright={"lRed","lFire","lOrange","lYellow","lLime","lGrass","lGreen","lAqua","lCyan","lSky","lSea","lBlue","lPurple","lGrape","lMagenta","lPink"}
local len_list_bright=#list_bright
function COLOR.random_bright()
return COLOR[list_bright[rnd(len_list_bright)]]
end
local list_dark={"dRed","dFire","dOrange","dYellow","dLame","dGrass","dGreen","dWater","dCyan","dSky","dSea","dBlue","dPurple","dGrape","dMagenta","dPink"}
local list_dark={"dRed","dFire","dOrange","dYellow","dLime","dGrass","dGreen","dAqua","dCyan","dSky","dSea","dBlue","dPurple","dGrape","dMagenta","dPink"}
local len_list_dark=#list_dark
function COLOR.random_dark()
return COLOR[list_dark[rnd(len_list_dark)]]
@@ -101,7 +101,7 @@ function COLOR.rainbow_dark(phase)
sin(phase+2.0944)*.2+.4,
sin(phase-2.0944)*.2+.4
end
function COLOR.rainbow_grey(phase)
function COLOR.rainbow_gray(phase)
return
sin(phase)*.16+.5,
sin(phase+2.0944)*.16+.5,

View File

@@ -1,13 +1,24 @@
local gc=love.graphics
local cmds={
move="translate",
zoom="scale",
rgb="setColor",
wid="setLineWidth",
line="line",
rect="rectangle",
circ="circle",
poly="polygon",
reset="origin",
trans="translate",
scale="scale",
rotat="rotate",
setCL="setColor",
setCM="setColorMask",
setLW="setLineWidth",
setLS="setLineStyle",
setLJ="setLineJoin",
draw="draw",
dLine="line",
fRect=function(...)gc.rectangle("fill",...)end,
dRect=function(...)gc.rectangle("line",...)end,
fCirc=function(...)gc.circle("fill",...)end,
dCirc=function(...)gc.circle("line",...)end,
fPoly=function(...)gc.polygon("fill",...)end,
dPoly=function(...)gc.polygon("line",...)end,
}
return function(L)
gc.push()
@@ -17,7 +28,14 @@ return function(L)
gc.setColor(1,1,1)
gc.setLineWidth(1)
for i=3,#L do
gc[cmds[L[i][1]]](unpack(L[i],2))
print(L[i][1])
local cmd=cmds[L[i][1]]
print(L[i][1])
if type(cmd)=="string"then
gc[cmd](unpack(L[i],2))
else
cmd(unpack(L[i],2))
end
end
gc.setCanvas()
gc.pop()

View File

@@ -12,11 +12,13 @@ function FILE.load(name)
setfenv(s,{})
return s()
end
else
elseif s:sub(1,1)=="["or s:sub(1,1)=="{"then
local res=JSON.decode(s)
if res then
return res
end
else
return s
end
end
LOG.print(name.." "..text.loadError,COLOR.red)
@@ -24,19 +26,22 @@ function FILE.load(name)
end
function FILE.save(data,name,mode)
if not mode then mode=""end
name=name
if mode:find("l")then
data=DUMPTABLE(data)
if not data then
LOG.print(name.." "..text.saveError.."dump error","error")
return
if type(data)=="table"then
if mode:find("l")then
data=DUMPTABLE(data)
if not data then
LOG.print(name.." "..text.saveError.."dump error","error")
return
end
else
data=JSON.encode(data)
if not data then
LOG.print(name.." "..text.saveError.."json error","error")
return
end
end
else
data=JSON.encode(data)
if not data then
LOG.print(name.." "..text.saveError.."json error","error")
return
end
data=tostring(data)
end
local F=fs.newFile(name)

View File

@@ -349,7 +349,7 @@ end
function love.focus(f)
if f then
love.timer.step()
elseif SCN.cur=="play"and SETTING.autoPause then
elseif SCN.cur=="game"and SETTING.autoPause then
pauseGame()
end
end
@@ -461,10 +461,15 @@ local devColor={
}
love.draw,love.update=nil--remove default draw/update
function love.run()
local SCN=SCN
local SETTING=SETTING
local love=love
local SCN,WIDGET=SCN,WIDGET
local VOC,BG,SYSFX=VOC,BG,SYSFX
local TASK,LOG,TEXT=TASK,LOG,TEXT
local SETTING=SETTING
local TIME=TIME
local STEP,WAIT=love.timer.step,love.timer.sleep
local FPS=love.timer.getFPS
local MINI=love.window.isMinimized
@@ -506,12 +511,12 @@ function love.run()
TASK.update()
WS.update(dt)
VOC.update()
BG.update(dt)
BG.update(dt)--BG animation
SYSFX.update(dt)
WIDGET.update()--Widgets animation
if SCN.update then SCN.update(dt)end--Scene Updater
if SCN.update then SCN.update(dt)end--Scene updater
if SCN.swapping then SCN.swapUpdate()end--Scene swapping animation
TEXT.update()
TEXT.update()--Update global texts animation
LOG.update()
--DRAW

View File

@@ -1,7 +1,7 @@
VERSION={
code=1404,
string="Alpha V0.14.4",
name="日出 Sunrise",
code=1405,
string="Alpha V0.14.5",
name="晨 Morn",
}
function love.conf(t)
t.identity="Techmino"--Saving folder

View File

@@ -63,6 +63,7 @@ FIELD[1]=newBoard()--Initialize field[1]
NET= require"parts.net"
AIBUILDER= require"parts.AITemplate"
FREEROW= require"parts.freeRow"
USERS= require"parts.users"
TEXTURE= require"parts.texture"
SKIN= require"parts.skin"

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 183 B

View File

@@ -614,7 +614,7 @@ function loadGame(M,ifQuickPlay,ifNet)--Load a mode and go to game scene
SCN.go("net_game","swipeD")
else
drawableText.modeName:set(text.modes[M][1].." "..text.modes[M][2])
SCN.go("play",ifQuickPlay and"swipeD"or"fade_togame")
SCN.go("game",ifQuickPlay and"swipeD"or"fade_togame")
SFX.play("enter")
end
end
@@ -731,7 +731,7 @@ do--function resetGameData(args)
end
function resetGameData(args,seed)
if not args then args=""end
if PLAYERS[1]and not GAME.replaying and(GAME.frame>400 or GAME.result)then
if PLAYERS[1]and not GAME.replaying and(PLAYERS[1].frameRun>400 or GAME.result)then
mergeStat(STAT,PLAYERS[1].stat)
STAT.todayTime=STAT.todayTime+PLAYERS[1].stat.time
end
@@ -740,11 +740,11 @@ do--function resetGameData(args)
GAME.warnLVL0=0
GAME.warnLVL=0
if args:find("r")then
GAME.frame=0
GAME.frameStart=0
GAME.recording=false
GAME.replaying=1
else
GAME.frame=args:find("n")and 0 or 150-SETTING.reTime*15
GAME.frameStart=args:find("n")and 0 or 150-SETTING.reTime*15
GAME.seed=seed or rnd(1046101471,2662622626)
GAME.pauseTime=0
GAME.pauseCount=0
@@ -790,39 +790,10 @@ do--function resetGameData(args)
collectgarbage()
end
end
function gameStart()--Call when countdown finish (GAME.frame==180)
SFX.play("start")
for P=1,#PLAYERS do
P=PLAYERS[P]
P.control=true
P.timing=true
P:popNext()
end
end
function checkStart()
if GAME.frame<=180 then
if GAME.frame==180 then
gameStart()
elseif GAME.frame==60 or GAME.frame==120 then
SFX.play("ready")
end
for p=1,#PLAYERS do
local P=PLAYERS[p]
if P.movDir~=0 then
if P.moving<P.gameEnv.das then
P.moving=P.moving+1
end
else
P.moving=0
end
end
return true
end
end
function checkWarning()
local P1=PLAYERS[1]
if P1.alive then
if GAME.frame%26==0 then
if P1.frameRun%26==0 then
local F=P1.field
local height=0--Max height of row 4~7
for x=4,7 do
@@ -847,7 +818,7 @@ function checkWarning()
elseif GAME.warnLVL>0 then
GAME.warnLVL=max(GAME.warnLVL-.026,0)
end
if GAME.warnLVL>1.126 and GAME.frame%30==0 then
if GAME.warnLVL>1.126 and P1.frameRun%30==0 then
SFX.fplay("warning",SETTING.sfx_warn)
end
end
@@ -973,7 +944,7 @@ do--function saveRecording()
os.date("%Y/%m/%d %A %H:%M:%S\n")..
GAME.curModeName.."\n"..
VERSION.string.."\n"..
(USER.username or"Player")
"Local Player"
local fileBody=
GAME.seed.."\n"..
JSON.encode(GAME.setting).."\n"..
@@ -1006,22 +977,22 @@ do--function drawFWM()
string.char(65,117,116,111,114,32,100,111,32,106,111,103,111,58,32,77,114,90,95,50,54,10,71,114,97,118,97,195,167,195,181,101,115,32,99,111,110,116,101,110,100,111,32,101,115,116,97,32,77,97,114,99,97,10,100,101,32,195,161,103,117,97,32,110,195,163,111,32,115,195,163,111,32,97,117,116,111,114,105,122,97,100,97,115),
string.char(65,117,116,104,111,114,58,32,77,114,90,95,50,54,10,82,101,99,111,114,100,105,110,103,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104,105,115,10,119,97,116,101,114,109,97,114,107,32,97,114,101,32,117,110,97,117,116,104,111,114,105,122,101,100),
}
--你竟然找到了这里那么在动手之前读读下面这些吧。
--【魔幻躲关键字搜索警告,看得懂就行】
--千万不要为了在网络公共场合发视屏或者直播需要而擅自删除这部分代码
--录制视屏上传到公共场合(包括但不限于任何视屏平台/论坛/几十个人以上的社区群等)很可能会对Techmino未来的发展有负面影响
--如果被TTC发现TTC随时可以用DMCA从法律层面强迫停止开发到时候谁都没得玩。这是真的已经有几个方块这么死了…
--你竟然找到了这里!那么在动手之前读读下面这些吧。
--【魔幻错别字躲关键字搜索警告,看得懂就行】
--千万不要为了在网络公共场合发视屏或者直播需要而擅自删除这部分代码!
--录制视屏上传到公共场合(包括但不限于任何视屏平台/论坛/几十个人以上的非方块社区/群等)很可能会对Techmino未来的发展有负面影响
--如果被TTC发现随时可能被他们用DMCA从法律层面强迫停止开发到时候谁都没得玩。这是真的已经有几个方块这么死了…
--氵印限制还可以减少低质量视屏泛滥,也能减轻过多不是真的感兴趣路人玩家入坑可能带来的压力
--想发视屏的话请先向作者申请,描述录制的大致内容,同意了才可以去关闭氵印
--等Techmino发展到一定程度之后会解除这个限制
--最后,别把藏在这里的东西截图/复制出去哦~
--感谢您对Techmino的支持
--感谢您对Techmino的支持!!!
local setFont,TIME,mStr=setFont,TIME,mStr
function drawFWM()
local t=TIME()
setFont(25)
gc_setColor(1,1,1,.2+.1*(sin(3*t)+sin(2.6*t)))
mStr(m[SETTING.lang]or m[1],240,60+26*sin(t))
mStr(m[_G["\83\69\84\84\73\78\71"]["\108\97\110\103"]or m[1]],240,60+26*sin(t))
end
end
function drawWarning()

View File

@@ -15,12 +15,12 @@ MODOPT={--Mod options
unranked=true,
},
{no=2,id="FL",name="hideNext",
key="e",x=320,y=230,color="water",
key="e",x=320,y=230,color="aqua",
list={1,2,3,4,5},
func=function(P,O)P.gameEnv.nextStartPos=O +1 end,
},
{no=3,id="IH",name="infHold",
key="r",x=440,y=230,color="water",
key="r",x=440,y=230,color="aqua",
func=function(P)P.gameEnv.infHold=true end,
unranked=true,
},
@@ -91,7 +91,7 @@ MODOPT={--Mod options
},
{no=16,id="TL",name="tele",
key="z",x=200,y=470,color="lGrey",
key="z",x=200,y=470,color="lGray",
func=function(P)
P.gameEnv.das,P.gameEnv.arr=0,0
P.gameEnv.sddas,P.gameEnv.sdarr=0,0
@@ -99,7 +99,7 @@ MODOPT={--Mod options
unranked=true,
},
{no=17,id="FX",name="noRotation",
key="x",x=320,y=470,color="lGrey",
key="x",x=320,y=470,color="lGray",
func=function(P)
disableKey(P,3)
disableKey(P,4)
@@ -108,7 +108,7 @@ MODOPT={--Mod options
unranked=true,
},
{no=18,id="GL",name="noMove",
key="c",x=440,y=470,color="lGrey",
key="c",x=440,y=470,color="lGray",
func=function(P)
disableKey(P,1)disableKey(P,2)
disableKey(P,11)disableKey(P,12)
@@ -190,7 +190,6 @@ GAME={--Global game data
init=false, --If need initializing game when enter scene-play
net=false, --If play net game
frame=0, --Frame count
result=false, --Game result (string)
rank=false, --Rank reached
pauseTime=0, --Time paused
@@ -222,14 +221,12 @@ GAME={--Global game data
RANKS=FILE.load("conf/unlock")or{sprint_10l=0}--Ranks of modes
USER=FILE.load("conf/user")or{--User infomation
--Network infos
username=false,
uid=false,
authToken=false,
--Local data
xp=0,lv=1,
}
USERS=FILE.load("conf/users")or{}
SETTING={--Settings
--Tuning
das=10,arr=2,dascut=0,
@@ -252,6 +249,7 @@ SETTING={--Settings
10,13,2,8
},
face={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
dataSaving=false,
--Graphic
block=true,ghost=.3,center=1,
@@ -333,8 +331,8 @@ keyMap=FILE.load("conf/key")or{--Key setting
},
}
VK_org=FILE.load("conf/virtualkey")or{--Virtualkey layout, refresh all VKs' position with this before each game
{ava=true, x=80, y=720-200, r=80,color=COLOR.lame},--moveLeft
{ava=true, x=320, y=720-200, r=80,color=COLOR.lame},--moveRight
{ava=true, x=80, y=720-200, r=80,color=COLOR.lime},--moveLeft
{ava=true, x=320, y=720-200, r=80,color=COLOR.lime},--moveRight
{ava=true, x=1280-80, y=720-200, r=80,color=COLOR.red},--rotRight
{ava=true, x=1280-200, y=720-80, r=80,color=COLOR.orange},--rotLeft
{ava=true, x=1280-200, y=720-320, r=80,color=COLOR.magenta},--rot180
@@ -343,16 +341,16 @@ VK_org=FILE.load("conf/virtualkey")or{--Virtualkey layout, refresh all VKs' posi
{ava=true, x=1280-320, y=720-200, r=80,color=COLOR.yellow},--hold
{ava=true, x=1280-80, y=280, r=80,color=COLOR.lRed},--func1
{ava=true, x=80, y=280, r=80,color=COLOR.lMagenta},--func2
{ava=false, x=100, y=50, r=80,color=COLOR.water},--insLeft
{ava=false, x=200, y=50, r=80,color=COLOR.water},--insRight
{ava=false, x=100, y=50, r=80,color=COLOR.aqua},--insLeft
{ava=false, x=200, y=50, r=80,color=COLOR.aqua},--insRight
{ava=false, x=300, y=50, r=80,color={COLOR.rainbow(3.5)}},--insDown
{ava=false, x=400, y=50, r=80,color={COLOR.rainbow(3.3)}},--down1
{ava=false, x=500, y=50, r=80,color={COLOR.rainbow(3.1)}},--down4
{ava=false, x=600, y=50, r=80,color={COLOR.rainbow(2.9)}},--down10
{ava=false, x=700, y=50, r=80,color=COLOR.lLame},--dropLeft
{ava=false, x=800, y=50, r=80,color=COLOR.lLame},--dropRight
{ava=false, x=900, y=50, r=80,color=COLOR.lWater},--addToLeft
{ava=false, x=1000, y=50, r=80,color=COLOR.lWater},--addToRight
{ava=false, x=700, y=50, r=80,color=COLOR.lLime},--dropLeft
{ava=false, x=800, y=50, r=80,color=COLOR.lLime},--dropRight
{ava=false, x=900, y=50, r=80,color=COLOR.laqua},--addToLeft
{ava=false, x=1000, y=50, r=80,color=COLOR.laqua},--addToRight
}
virtualkey={}for i=1,#VK_org do virtualkey[i]={}end--In-game virtualkey layout
REPLAY=FILE.load("conf/replay")or{}

View File

@@ -1,14 +1,15 @@
local noKick,noKick_180,pushZero do
local zero={0,0}
local Zero={zero}
noKick={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero}
noKick_180={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero,[02]=Zero,[20]=Zero,[13]=Zero,[31]=Zero}
local map={}for x=-4,4 do map[x]={}for y=-4,4 do map[x][y]={x,y}end end
local noKickSet,noKickSet_180,pushZero do
local Zero={map[0][0]}
noKickSet={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero}
noKickSet_180={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero,[02]=Zero,[20]=Zero,[13]=Zero,[31]=Zero}
function pushZero(t)
for _,L in next,t do
if type(L)=="table"then
for _,v in next,L do
if not v[1]or v[1][1]~=0 or v[1][2]~=0 then
table.insert(v,1,zero)
table.insert(v,1,map[0][0])
end
end
end
@@ -16,33 +17,40 @@ local noKick,noKick_180,pushZero do
end
end
local collect do
local map={}
for x=-3,3 do map[x]={}for y=-3,3 do map[x][y]={x,y}end end
function collect(T)--Make all vec point to the same vec
if type(T)=="table"then
for _,t in next,T do
for k,vec in next,t do
t[k]=map[vec[1]][vec[2]]
end
end
--Convert vector string to table
local function vecStrConv(list)
for k,vecStr in next,list do
list[k]=map[tonumber(vecStr:sub(1,2))][tonumber(vecStr:sub(3,4))]
end
end
--Make all vec point to the same vec
local function collectSet(set)
if type(set)~="table"then return end
for _,list in next,set do
if type(list[1])=="string"then
vecStrConv(list)
end
end
end
local function C_sym(L)--Use this if the block is centrosymmetry, *PTR!!!
--Use this if the block is centrosymmetry, *PTR!!!
local function centroSymSet(L)
L[23]=L[01]L[32]=L[10]
L[21]=L[03]L[12]=L[30]
L[20]=L[02]L[31]=L[13]
end
local function flipList(O)--Use this to copy a symmetry list
--Use this to copy a symmetry set
local function flipList(O)
if not O then return end
local L={}
for i=1,#O do
L[i]={-O[i][1],O[i][2]}
for i,s in next,O do
L[i]=string.char(88-s:byte())..s:sub(2)
end
return L
end
local function reflect(a)
local b={}
b[03]=flipList(a[01])
@@ -80,48 +88,48 @@ do
}
TRS={
{
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1, 2},{ 0, 1}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1,-2},{ 1,-2}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}},
[12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}},
[32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2}},
[23]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[02]={{ 1, 0},{-1, 0},{ 0,-1},{ 0, 1}},
[20]={{-1, 0},{ 1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{-1, 0},{ 0,-2}},
[31]={{ 0, 1},{ 0,-1},{ 1, 0}},
[01]={"-1+0","-1+1","+0-2","-1+2","+0+1"},
[10]={"+1+0","+1-1","+0+2","+1-2","+1-2"},
[03]={"+1+0","+1+1","+0-2","+1-1","+1-2"},
[30]={"-1+0","-1-1","+0+2","-1+2","+0-1"},
[12]={"+1+0","+1-1","+0+2","+1+2"},
[21]={"-1+0","-1+1","+0-2","-1-2"},
[32]={"-1+0","-1-1","+0+2","-1+2"},
[23]={"+1+0","+1+1","+0-2","+1-2"},
[02]={"+1+0","-1+0","+0-1","+0+1"},
[20]={"-1+0","+1+0","+0+1","+0-1"},
[13]={"+0-1","+0+1","+0-2"},
[31]={"+0+1","+0-1","+0+2"},
},--Z
false,--S
{
[01]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{ 1, 1}},
[10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 1, 2}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-1},{ 0, 1}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1},{-1, 1}},
[12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 1},{ 0,-2},{-1,-2}},
[32]={{-1, 0},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{-1, 1}},
[23]={{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0}},
[31]={{ 0, 1},{ 0,-1},{-1, 0}},
[01]={"-1+0","-1+1","+1+0","+0-2","+1+1"},
[10]={"+1+0","+1-1","-1+0","+0+2","+1+2"},
[03]={"+1+0","+1+1","+0-2","+1-2","+1-1","+0+1"},
[30]={"-1+0","-1-1","+0+2","-1+2","+0-1","-1+1"},
[12]={"+1+0","+1-1","+1+1","-1+0","+0-1","+0+2","+1+2"},
[21]={"-1+0","-1+1","-1-1","+1+0","+0+1","+0-2","-1-2"},
[32]={"-1+0","-1-1","+1+0","+0+2","-1+2","-1+1"},
[23]={"+1+0","+1-1","-1+0","+1+1","+0-2","+1-2"},
[02]={"-1+0","+1+0","+0-1","+0+1"},
[20]={"+1+0","-1+0","+0+1","+0-1"},
[13]={"+0-1","+0+1","+1+0"},
[31]={"+0+1","+0-1","-1+0"},
},--J
false,--L
{
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{ 0, 1}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0, 1}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}},
[12]={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{ 0,-2},{-1,-2},{ 1, 1}},
[32]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{ 0, 2},{-1, 2}},
[23]={{ 1, 0},{ 0,-2},{ 1,-2},{-1, 1}},
[02]={{-1, 0},{ 1, 0},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0},{ 0,-2},{ 0, 2}},
[31]={{ 0,-1},{ 0, 1},{-1, 0},{ 0,-2},{ 0, 2}},
[01]={"-1+0","-1+1","+0-2","-1-2","+0+1"},
[10]={"+1+0","+1-1","+0+2","+1+2","+0-1"},
[03]={"+1+0","+1+1","+0-2","+1-2","+0+1"},
[30]={"-1+0","-1-1","+0+2","-1+2","+0-1"},
[12]={"+1+0","+1-1","+0-1","-1-1","+0+2","+1+2"},
[21]={"-1+0","+0-2","-1-2","+1+1"},
[32]={"-1+0","-1-1","+0-1","+1-1","+0+2","-1+2"},
[23]={"+1+0","+0-2","+1-2","-1+1"},
[02]={"-1+0","+1+0","+0+1"},
[20]={"+1+0","-1+0","+0-1"},
[13]={"+0-1","+0+1","+1+0","+0-2","+0+2"},
[31]={"+0-1","+0+1","-1+0","+0-2","+0+2"},
},--T
function(P,d)
if P.gameEnv.easyFresh then
@@ -162,111 +170,111 @@ do
end
end,--O
{
[01]={{ 0, 1},{ 1, 0},{-2, 0},{-2,-1},{ 1, 2}},
[10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}},
[03]={{ 0, 1},{-1, 0},{ 2, 0},{ 2,-1},{-1, 2}},
[30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
[12]={{-1, 0},{ 2, 0},{ 2,-1},{ 0,-1},{-1, 2}},
[21]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
[32]={{ 1, 0},{-2, 0},{-2,-1},{ 0,-1},{ 1, 2}},
[23]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}},
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{-1, 0},{ 1, 0},{ 0, 1}},
[31]={{ 0,-1},{ 1, 0},{-1, 0},{ 0, 1}},
[01]={"+0+1","+1+0","-2+0","-2-1","+1+2"},
[10]={"+2+0","-1+0","-1-2","+2+1","+0+1"},
[03]={"+0+1","-1+0","+2+0","+2-1","-1+2"},
[30]={"-2+0","+1+0","+1-2","-2+1","+0+1"},
[12]={"-1+0","+2+0","+2-1","+0-1","-1+2"},
[21]={"-2+0","+1+0","+1-2","-2+1","+0+1"},
[32]={"+1+0","-2+0","-2-1","+0-1","+1+2"},
[23]={"+2+0","-1+0","-1-2","+2+1","+0+1"},
[02]={"-1+0","+1+0","+0-1","+0+1"},
[20]={"+1+0","-1+0","+0+1","+0-1"},
[13]={"+0-1","-1+0","+1+0","+0+1"},
[31]={"+0-1","+1+0","-1+0","+0+1"},
},--I
{
[01]={{-1, 0},{ 0, 1},{ 1, 1},{ 0,-3},{ 0, 2},{ 0, 3},{-1, 2}},
[10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{ 0,-3},{ 0, 3},{ 1,-2}},
[03]={{ 1, 0},{ 0,-3},{ 0, 1},{ 0, 2},{ 0, 3},{ 1, 2}},
[30]={{-1, 0},{ 0, 1},{ 0,-2},{ 0,-3},{ 0, 3},{-1,-2}},
[01]={"-1+0","+0+1","+1+1","+0-3","+0+2","+0+3","-1+2"},
[10]={"+1+0","+0-1","-1-1","+0-2","+0-3","+0+3","+1-2"},
[03]={"+1+0","+0-3","+0+1","+0+2","+0+3","+1+2"},
[30]={"-1+0","+0+1","+0-2","+0-3","+0+3","-1-2"},
},--Z5
false,--S5
{
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{-1,-1},{ 0, 1}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1},{ 1, 1}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{-1, 1}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2}},
[12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 1, 1}},
[21]={{-1, 0},{-1,-1},{-1, 1},{ 0,-2},{-1,-2},{-1,-1}},
[32]={{-1, 0},{-1,-1},{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{-1, 2}},
[23]={{ 1, 0},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2}},
[02]={{-1, 0},{ 0,-1},{ 0, 1}},
[20]={{ 1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 1, 0},{ 0, 1},{-1, 0}},
[31]={{-1, 0},{ 0,-1},{ 1, 0}},
[01]={"-1+0","-1+1","+0-2","-1-2","-1-1","+0+1"},
[10]={"+1+0","+1-1","+0+2","+1+2","+0-1","+1+1"},
[03]={"+1+0","+1+1","+0-2","-1+1"},
[30]={"-1+0","-1-1","+0+2","-1+2"},
[12]={"+1+0","+1-1","+0+2","+1+2","+1+1"},
[21]={"-1+0","-1-1","-1+1","+0-2","-1-2","-1-1"},
[32]={"-1+0","-1-1","-1+1","+0-1","+0+2","-1+2"},
[23]={"+1+0","+1+1","-1+0","+0-2","+1-2"},
[02]={"-1+0","+0-1","+0+1"},
[20]={"+1+0","+0+1","+0-1"},
[13]={"+1+0","+0+1","-1+0"},
[31]={"-1+0","+0-1","+1+0"},
},--P
false,--Q
{
[01]={{-1, 0},{ 1, 0},{-1, 1},{ 0,-2},{ 0,-3}},
[10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 0, 3}},
[03]={{ 1, 0},{ 1,-1},{ 0, 1},{ 0,-2},{ 0,-3}},
[30]={{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}},
[12]={{ 1, 0},{ 0,-1},{-1, 0},{ 0, 2}},
[21]={{-1, 0},{ 0, 1},{ 1, 0},{ 0,-2}},
[32]={{-1, 0},{ 0, 1},{-1, 1},{ 1, 0},{ 0, 2},{-2, 0}},
[23]={{ 1, 0},{ 1,-1},{ 0,-1},{-1, 0},{ 0,-2},{ 2, 0}},
[02]={{ 1, 0},{-1, 0},{-1,-1}},
[20]={{-1, 0},{ 1, 0},{ 1, 1}},
[13]={{ 0,-1},{-1, 1},{ 0, 1}},
[31]={{ 0,-1},{ 1,-1},{ 0, 1}},
[01]={"-1+0","+1+0","-1+1","+0-2","+0-3"},
[10]={"+1+0","+1-1","-1+0","+0+2","+0+3"},
[03]={"+1+0","+1-1","+0+1","+0-2","+0-3"},
[30]={"-1+1","+1+0","+0-1","+0+2","+0+3"},
[12]={"+1+0","+0-1","-1+0","+0+2"},
[21]={"-1+0","+0+1","+1+0","+0-2"},
[32]={"-1+0","+0+1","-1+1","+1+0","+0+2","-2+0"},
[23]={"+1+0","+1-1","+0-1","-1+0","+0-2","+2+0"},
[02]={"+1+0","-1+0","-1-1"},
[20]={"-1+0","+1+0","+1+1"},
[13]={"+0-1","-1+1","+0+1"},
[31]={"+0-1","+1-1","+0+1"},
},--F
false,--E
{
[01]={{ 0,-1},{-1,-1},{ 1, 1},{ 1, 0},{ 1,-3},{-1, 0},{ 0, 2},{-1, 2}},
[10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{-1, 1},{ 0,-3},{ 1,-2},{ 0, 1}},
[03]={{ 0,-1},{ 1,-1},{-1,-1},{-1, 0},{-1,-3},{ 1, 0},{ 0, 2},{ 1, 2}},
[30]={{-1, 0},{ 0,-1},{ 1,-1},{ 0,-2},{ 1, 1},{ 0,-3},{-1,-2},{ 0, 1}},
[12]={{ 1, 0},{-1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{-1, 1}},
[21]={{ 1,-1},{-1, 0},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}},
[32]={{-1, 0},{ 1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{ 1, 1}},
[23]={{-1,-1},{ 1, 0},{-1, 0},{ 0,-1},{ 0, 2},{ 0, 3}},
[02]={{ 0, 1},{ 0,-1},{ 0, 2}},
[20]={{ 0,-1},{ 0, 1},{ 0,-2}},
[13]={{ 1, 0},{-1, 1},{-2, 0}},
[31]={{-1, 0},{ 1, 1},{ 2, 0}},
[01]={"+0-1","-1-1","+1+0","+1+1","+0-3","-1+0","+0+2","-1+2"},
[10]={"+1+0","+0-1","-1-1","+0-2","-1+1","+0-3","+1-2","+0+1"},
[03]={"+0-1","+1-1","-1+0","-1+1","+0-3","+1+0","+0+2","+1+2"},
[30]={"-1+0","+0-1","+1-1","+0-2","+1+1","+0-3","-1-2","+0+1"},
[12]={"+1+0","-1+0","+0-2","+0-3","+0+1","-1+1"},
[21]={"+1-1","-1+0","+1+0","+0-1","+0+2","+0+3"},
[32]={"-1+0","+1+0","+0-2","+0-3","+0+1","+1+1"},
[23]={"-1-1","+1+0","-1+0","+0-1","+0+2","+0+3"},
[02]={"+0-1","+0+1","+0+2"},
[20]={"+0-1","+0+1","+0-2"},
[13]={"+1+0","-1+1","-2+0"},
[31]={"-1+0","+1+1","+2+0"},
},--T5
{
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2}},
[12]={{ 1, 0},{ 1,-1},{ 1, 1}},
[21]={{-1,-1},{-1, 1},{-1,-1}},
[32]={{-1, 0},{-1,-1},{-1, 1}},
[23]={{ 1,-1},{ 1, 1},{ 1,-1}},
[02]={{ 0, 1}},
[20]={{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0}},
[31]={{ 0,-1},{ 0, 1},{-1, 0}},
[01]={"-1+0","-1+1","+0-2","-1-2"},
[10]={"+1+0","+1-1","+0+2","+1+2"},
[03]={"+1+0","+1+1","+0-2","+1-2"},
[30]={"-1+0","-1-1","+0-2","-1+2"},
[12]={"+1+0","+1-1","+1+1"},
[21]={"-1-1","-1+1","-1-1"},
[32]={"-1+0","-1-1","-1+1"},
[23]={"+1-1","+1+1","+1-1"},
[02]={"+0+1"},
[20]={"+0-1"},
[13]={"+0-1","+0+1","+1+0"},
[31]={"+0-1","+0+1","-1+0"},
},--U
{
[01]={{ 0, 1},{-1, 0},{ 0,-2},{-1,-2}},
[10]={{ 0, 1},{ 1, 0},{ 0,-2},{ 1,-2}},
[03]={{ 0,-1},{ 0, 1},{ 0, 2}},
[30]={{ 0,-1},{ 0, 1},{ 0,-2}},
[12]={{ 0,-1},{ 0, 1}},
[21]={{ 0,-1},{ 0,-2}},
[32]={{ 1, 0},{-1, 0}},
[23]={{-1, 0},{ 1, 0}},
[02]={{-1, 1},{ 1,-1}},
[20]={{ 1,-1},{-1, 1}},
[13]={{ 1, 1},{-1,-1}},
[31]={{-1,-1},{ 1, 1}},
[01]={"+0+1","-1+0","+0-2","-1-2"},
[10]={"+0+1","+1+0","+0-2","+1-2"},
[03]={"+0-1","+0+1","+0+2"},
[30]={"+0-1","+0+1","+0-2"},
[12]={"+0-1","+0+1"},
[21]={"+0-1","+0-2"},
[32]={"+1+0","-1+0"},
[23]={"-1+0","+1+0"},
[02]={"-1+1","+1-1"},
[20]={"+1-1","-1+1"},
[13]={"+1+1","-1-1"},
[31]={"-1-1","+1+1"},
},--V
{
[01]={{ 0,-1},{-1, 0},{ 1, 0},{ 1,-1},{ 0, 2}},
[10]={{ 0,-1},{-1,-1},{ 0, 1},{ 0,-2},{ 1,-2},{ 0, 2}},
[03]={{ 1, 0},{ 1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{ 1,-1},{ 0, 1},{ 0, 2},{ 0, 3}},
[30]={{-1, 0},{-1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{-1,-1},{ 0, 1},{ 0, 2},{ 0, 3}},
[12]={{ 1, 0},{ 0,-1},{-2, 0},{ 1, 1},{-1, 0},{ 0, 1},{-1,-1}},
[21]={{-1, 0},{ 0,-1},{ 2, 0},{-1, 1},{ 1, 0},{ 0, 1},{ 1,-1}},
[32]={{ 0,-1},{ 1, 0},{ 0, 1},{-1, 0},{-1,-1},{ 0, 2}},
[23]={{ 0,-1},{ 1,-1},{ 0, 1},{ 0,-2},{-1,-2},{ 0, 2}},
[02]={{ 0,-1},{-1, 0}},
[20]={{ 0, 1},{ 1, 0}},
[13]={{ 0, 1},{-1, 0}},
[31]={{ 0,-1},{ 1, 0}},
[01]={"+0-1","-1+0","+1+0","+1-1","+0+2"},
[10]={"+0-1","-1-1","+0+1","+0-2","+1-2","+0+2"},
[03]={"+1+0","+1+1","+0-1","+0-2","+0-3","+1-1","+0+1","+0+2","+0+3"},
[30]={"-1+0","-1+1","+0-1","+0-2","+0-3","-1-1","+0+1","+0+2","+0+3"},
[12]={"+1+0","+0-1","-2+0","+1+1","-1+0","+0+1","-1-1"},
[21]={"-1+0","+0-1","+2+0","-1+1","+1+0","+0+1","+1-1"},
[32]={"+0-1","+1+0","+0+1","-1+0","-1-1","+0+2"},
[23]={"+0-1","+1-1","+0+1","+0-2","-1-2","+0+2"},
[02]={"+0-1","-1+0"},
[20]={"+0+1","+1+0"},
[13]={"+0+1","-1+0"},
[31]={"+0-1","+1+0"},
},--W
function(P,d)
if P.type=="human"then SFX.play("rotate",nil,P:getCenterX()*.15)end
@@ -284,89 +292,89 @@ do
P:freshBlock("fresh")
end,--X
{
[01]={{-1, 0},{-1, 1},{ 0,-3},{-1, 1},{-1, 2},{ 0, 1}},
[10]={{-1, 0},{ 1,-1},{ 0, 3},{ 1,-1},{ 1,-2},{ 0, 1}},
[03]={{ 0,-1},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}},
[30]={{ 0, 1},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}},
[12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}},
[32]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}},
[23]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}},
[02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}},
[20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}},
[13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}},
[31]={{ 1, 0},{ 1, 1},{ 0,-1},{ 1, 2}},
[01]={"-1+0","-1+1","+0-3","-1+1","-1+2","+0+1"},
[10]={"-1+0","+1-1","+0+3","+1-1","+1-2","+0+1"},
[03]={"+0-1","+1-1","-1+0","+1+1","+0-2","+1-2","+0-3","+1-3","-1+1"},
[30]={"+0+1","-1+1","+1+0","-1-1","+0+2","-1+2","+0+3","-1+3","+1-1"},
[12]={"+1+0","+1-1","+0-1","+1-2","+0-2","+1+1","-1+0","+0+2","+1+2"},
[21]={"-1+0","-1+1","+0+1","-1+2","+0+2","-1-1","+1+0","+0-2","-1-2"},
[32]={"-1+0","-1+1","-1-1","+1+0","+0+2","-1+2","+0-2"},
[23]={"+1+0","+1-1","+1+1","-1+0","+0-2","+1-2","+0+2"},
[02]={"+0-1","+1-1","-1+0","+2-1"},
[20]={"+0+1","-1+1","+1+0","-2+1"},
[13]={"-1+0","-1-1","+0+1","-1-2"},
[31]={"+1+0","+1+1","+0-1","+1+2"},
},--J5
false,--L5
{
[01]={{-1, 0},{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}},
[10]={{-1, 0},{ 1, 0},{ 1,-1},{ 1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}},
[03]={{ 0,-1},{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}},
[30]={{ 0, 1},{-1, 0},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}},
[12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}},
[32]={{ 0,-1},{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}},
[23]={{ 0, 1},{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}},
[02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}},
[20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}},
[13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}},
[31]={{ 1, 0},{ 1, 1},{ 0,-1},{ 1, 2}},
[01]={"-1+0","-1+0","-1+1","+1+0","-1+2","-1-1","+0-3","+0+1"},
[10]={"-1+0","+1+0","+1-1","+1+0","+1-2","+1+1","+0+3","+0+1"},
[03]={"+0-1","+1+0","+1-1","-1+0","+1+1","+0-2","+1-2","+0-3","+1-3","-1+1"},
[30]={"+0+1","-1+0","-1+1","+1+0","-1-1","+0+2","-1+2","+0+3","-1+3","+1-1"},
[12]={"+1+0","+1-1","+0-1","+1-2","+0-2","+1+1","-1+0","+0+2","+1+2"},
[21]={"-1+0","-1+1","+0+1","-1+2","+0+2","-1-1","+1+0","+0-2","-1-2"},
[32]={"+0-1","-1+0","-1+1","-1-1","+1+0","+0+2","-1+2","+0-2"},
[23]={"+0+1","+1+0","+1-1","+1+1","-1+0","+0-2","+1-2","+0+2"},
[02]={"+0-1","+1-1","-1+0","+2-1","+0+1"},
[20]={"+0+1","-1+1","+1+0","-2+1","+0-1"},
[13]={"-1+0","-1-1","+0+1","-1-2"},
[31]={"+1+0","+1+1","+0-1","+1+2"},
},--R
false,--Y
{
[01]={{-1, 0},{-1, 1},{ 0, 1},{ 1, 0},{-1, 2},{-2, 0},{ 0,-2}},
[10]={{ 1, 0},{-1, 0},{ 0,-1},{ 1,-1},{ 1,-2},{ 2, 0},{ 0, 2}},
[03]={{-1, 0},{ 1,-1},{ 0,-2},{ 0,-3},{ 1, 0},{ 1,-2},{ 1,-3},{ 0, 1},{-1, 1}},
[30]={{-1, 0},{ 1,-1},{ 1,-2},{ 1, 0},{ 0,-2},{ 1,-3},{-1, 2},{ 0, 3},{-1, 3}},
[12]={{-1, 0},{ 1,-1},{-1,-1},{ 1,-2},{ 1, 0},{ 0,-2},{ 1,-3},{-1, 2},{ 0, 3},{-1, 3}},
[21]={{-1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 0,-3},{ 1, 0},{ 1,-2},{ 1,-3},{ 0, 1},{-1, 1}},
[32]={{-1, 0},{ 0,-1},{-1,-2},{ 1,-1},{ 1, 0},{ 1, 1},{ 0, 2},{ 0, 3}},
[23]={{ 0,-2},{ 0,-3},{ 1, 2},{ 1, 0},{ 0, 1},{-1, 1},{ 0,-1},{ 0, 2}},
[02]={{-1, 0},{ 0, 2},{ 0,-1}},
[20]={{ 1, 0},{ 0,-2},{ 0, 1}},
[13]={{-1, 0},{-1,-1},{ 0, 1},{ 1, 2}},
[31]={{ 1, 0},{ 1, 1},{ 0,-1},{-1,-2}},
[01]={"-1+0","-1+1","+0+1","+1+0","-1+2","-2+0","+0-2"},
[10]={"+1+0","-1+0","+0-1","+1-1","+1-2","+2+0","+0+2"},
[03]={"-1+0","+1-1","+0-2","+0-3","+1+0","+1-2","+1-3","+0+1","-1+1"},
[30]={"-1+0","+1-1","+1-2","+1+0","+0-2","+1-3","-1+2","+0+3","-1+3"},
[12]={"-1+0","+1-1","-1-1","+1-2","+1+0","+0-2","+1-3","-1+2","+0+3","-1+3"},
[21]={"-1+0","+1-1","+1+1","+0-2","+0-3","+1+0","+1-2","+1-3","+0+1","-1+1"},
[32]={"-1+0","+0-1","-1-2","+1-1","+1+0","+1+1","+0+2","+0+3"},
[23]={"+0-2","+0-3","+1+2","+1+0","+0+1","-1+1","+0-1","+0+2"},
[02]={"-1+0","+0+2","+0-1"},
[20]={"+1+0","+0-2","+0+1"},
[13]={"-1+0","-1-1","+0+1","+1+2"},
[31]={"+1+0","+1+1","+0-1","-1-2"},
},--N
false,--H
{
[01]={{ 1,-1},{ 1, 0},{ 1, 1},{ 0, 1},{-1, 1},{-1, 0},{-1,-1},{ 0,-1},{ 0,-2},{-2,-1},{-2,-2},{ 2, 0},{ 2,-1},{ 2,-2},{ 1, 2},{ 2, 2},{-1, 2},{-2, 2}},
[10]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{-2,-2},{-2,-1},{-2, 0},{-1,-2},{ 0,-2},{ 1,-2},{ 2,-2},{-1, 1},{-2, 1},{-2, 2},{ 1, 0},{ 2, 0},{ 2,-1},{ 0, 1},{ 1,-1},{ 2,-2}},
[03]={{-1,-1},{-1, 0},{-1, 1},{-0, 1},{ 1, 1},{ 1, 0},{ 1,-1},{-0,-1},{-0,-2},{ 2,-1},{ 2,-2},{-2, 0},{-2,-1},{-2,-2},{-1, 2},{-2, 2},{ 1, 2},{ 2, 2}},
[30]={{ 1, 0},{ 1,-1},{-0,-1},{-1,-1},{ 2,-2},{ 2,-1},{ 2, 0},{ 1,-2},{-0,-2},{-1,-2},{-2,-2},{ 1, 1},{ 2, 1},{ 2, 2},{-1, 0},{-2, 0},{-2,-1},{ 0, 1},{-1,-1},{-2,-2}},
[01]={"+1-1","+1+0","+1+1","+0+1","-1+1","-1+0","-1-1","+0-1","+0-2","-2-1","-2-2","+2+0","+2-1","+2-2","+1+2","+2+2","-1+2","-2+2"},
[10]={"-1+0","-1-1","+0-1","+1-1","-2-2","-2-1","-2+0","-1-2","+0-2","+1-2","+2-2","-1+1","-2+1","-2+2","+1+0","+2+0","+2-1","+0+1","+1-1","+2-2"},
[03]={"-1-1","-1+0","-1+1","-0+1","+1+1","+1+0","+1-1","-0-1","-0-2","+2-1","+2-2","-2+0","-2-1","-2-2","-1+2","-2+2","+1+2","+2+2"},
[30]={"+1+0","+1-1","-0-1","-1-1","+2-2","+2-1","+2+0","+1-2","-0-2","-1-2","-2-2","+1+1","+2+1","+2+2","-1+0","-2+0","-2-1","+0+1","-1-1","-2-2"},
},--I5
{
[01]={{-1, 0},{-1,-1},{ 1, 1},{-1, 1}},
[10]={{-1, 0},{ 1, 0},{-1,-1},{ 1, 1}},
[03]={{ 1, 0},{ 1,-1},{-1, 1},{ 1, 1}},
[30]={{ 1, 0},{-1, 0},{ 1,-1},{-1, 1}},
[01]={"-1+0","-1-1","+1+1","-1+1"},
[10]={"-1+0","+1+0","-1-1","+1+1"},
[03]={"+1+0","+1-1","-1+1","+1+1"},
[30]={"+1+0","-1+0","+1-1","-1+1"},
},--I3
{
[01]={{-1, 0},{ 1, 0}},
[10]={{ 1, 0},{-1, 0}},
[03]={{ 0, 1},{ 0,-1}},
[30]={{ 0,-1},{ 0, 1}},
[12]={{ 0, 1},{ 0,-1}},
[21]={{ 0,-1},{ 0, 1}},
[32]={{-1, 0},{ 1, 0}},
[23]={{ 1, 0},{-1, 0}},
[02]={{ 0,-1},{ 1,-1},{-1,-1}},
[20]={{ 0, 1},{-1, 1},{ 1, 1}},
[13]={{ 0,-1},{-1,-1},{ 1,-1}},
[31]={{ 0, 1},{ 1, 1},{-1, 1}},
[01]={"-1+0","+1+0"},
[10]={"+1+0","-1+0"},
[03]={"+0+1","+0-1"},
[30]={"+0-1","+0+1"},
[12]={"+0+1","+0-1"},
[21]={"+0-1","+0+1"},
[32]={"-1+0","+1+0"},
[23]={"+1+0","-1+0"},
[02]={"+0-1","+1-1","-1-1"},
[20]={"+0+1","-1+1","+1+1"},
[13]={"+0-1","-1-1","+1-1"},
[31]={"+0+1","+1+1","-1+1"},
},--C
{
[01]={{-1, 0},{ 0, 1}},
[10]={{ 1, 0},{ 0, 1}},
[03]={{ 1, 0},{ 0, 1}},
[30]={{-1, 0},{ 0, 1}},
[12]={{ 1, 0},{ 0, 2}},
[21]={{ 0,-1},{-1, 0}},
[32]={{-1, 0},{ 0, 2}},
[23]={{ 0,-1},{-1, 0}},
[02]={{ 0,-1},{ 0, 1}},
[20]={{ 0, 1},{ 0,-1}},
[13]={{-1, 0},{ 1, 0}},
[31]={{ 1, 0},{-1, 0}},
[01]={"-1+0","+0+1"},
[10]={"+1+0","+0+1"},
[03]={"+1+0","+0+1"},
[30]={"-1+0","+0+1"},
[12]={"+1+0","+0+2"},
[21]={"+0-1","-1+0"},
[32]={"-1+0","+0+2"},
[23]={"+0-1","-1+0"},
[02]={"+0-1","+0+1"},
[20]={"+0+1","+0-1"},
[13]={"-1+0","+1+0"},
[31]={"+1+0","-1+0"},
},--I2
nil,--O1
}
@@ -378,9 +386,9 @@ do
TRS[20]=reflect(TRS[19])--L5J5
TRS[22]=reflect(TRS[21])--RY
TRS[24]=reflect(TRS[23])--NH
C_sym(TRS[8])C_sym(TRS[9])--S5Z5
C_sym(TRS[25])C_sym(TRS[26])--I5I3
for i=1,29 do collect(TRS[i])end
centroSymSet(TRS[8])centroSymSet(TRS[9])--S5Z5
centroSymSet(TRS[25])centroSymSet(TRS[26])--I5I3
for i=1,29 do collectSet(TRS[i])end
pushZero(TRS)
end
@@ -388,35 +396,35 @@ local SRS
do
SRS={
{
[01]={{-1,0},{-1, 1},{ 0,-2},{-1,-2}},
[10]={{ 1,0},{ 1,-1},{ 0, 2},{ 1, 2}},
[03]={{ 1,0},{ 1, 1},{ 0,-2},{ 1,-2}},
[30]={{-1,0},{-1,-1},{ 0, 2},{-1, 2}},
[12]={{ 1,0},{ 1,-1},{ 0, 2},{ 1, 2}},
[21]={{-1,0},{-1, 1},{ 0,-2},{-1,-2}},
[32]={{-1,0},{-1,-1},{ 0, 2},{-1, 2}},
[23]={{ 1,0},{ 1, 1},{ 0,-2},{ 1,-2}},
[01]={"-1+0","-1+1","+0-2","-1-2"},
[10]={"+1+0","+1-1","+0+2","+1+2"},
[03]={"+1+0","+1+1","+0-2","+1-2"},
[30]={"-1+0","-1-1","+0+2","-1+2"},
[12]={"+1+0","+1-1","+0+2","+1+2"},
[21]={"-1+0","-1+1","+0-2","-1-2"},
[32]={"-1+0","-1-1","+0+2","-1+2"},
[23]={"+1+0","+1+1","+0-2","+1-2"},
[02]={},[20]={},[13]={},[31]={},
},--Z
false,--S
false,--J
false,--L
false,--T
noKick,--O
noKickSet,--O
{
[01]={{-2, 0},{ 1, 0},{-2,-1},{ 1, 2}},
[10]={{ 2, 0},{-1, 0},{ 2, 1},{-1,-2}},
[12]={{-1, 0},{ 2, 0},{-1, 2},{ 2,-1}},
[21]={{ 1, 0},{-2, 0},{ 1,-2},{-2, 1}},
[23]={{ 2, 0},{-1, 0},{ 2, 1},{-1,-2}},
[32]={{-2, 0},{ 1, 0},{-2,-1},{ 1, 2}},
[30]={{ 1, 0},{-2, 0},{ 1,-2},{-2, 1}},
[03]={{-1, 0},{ 2, 0},{-1, 2},{ 2,-1}},
[01]={"-2+0","+1+0","-2-1","+1+2"},
[10]={"+2+0","-1+0","+2+1","-1-2"},
[12]={"-1+0","+2+0","-1+2","+2-1"},
[21]={"+1+0","-2+0","+1-2","-2+1"},
[23]={"+2+0","-1+0","+2+1","-1-2"},
[32]={"-2+0","+1+0","-2-1","+1+2"},
[30]={"+1+0","-2+0","+1-2","-2+1"},
[03]={"-1+0","+2+0","-1+2","+2-1"},
[02]={},[20]={},[13]={},[31]={},
}--I
}
collect(SRS[1])
collect(SRS[7])
collectSet(SRS[1])
collectSet(SRS[7])
pushZero(SRS)
for i=2,5 do SRS[i]=SRS[1]end
for i=8,29 do SRS[i]=SRS[1]end
@@ -424,7 +432,8 @@ end
local C2
do
local L={{0,0},{-1,0},{1,0},{0,-1},{-1,-1},{1,-1},{-2,0},{2,0}}
local L={"+0+0","-1+0","+1+0","+0-1","-1-1","+1-1","-2+0","+2+0"}
vecStrConv(L)
C2={
{
[01]=L,[10]=L,[12]=L,[21]=L,
@@ -432,36 +441,35 @@ do
[02]=L,[20]=L,[13]=L,[31]=L,
}
}
collect(C2[1])
for i=2,29 do C2[i]=C2[1]end
end
local C2sym
do
local L={{0,0},{-1,0},{1,0},{0,-1},{-1,-1},{1,-1},{-2,0},{2,0}}
local R={{0,0},{1,0},{-1,0},{0,-1},{1,-1},{-1,-1},{2,0},{-2,0}}
local L={"+0+0","-1+0","+1+0","+0-1","-1-1","+1-1","-2+0","+2+0"}
local R={"+0+0","+1+0","-1+0","+0-1","+1-1","-1-1","+2+0","-2+0"}
local Z={
[01]=R,[10]=L,[03]=L,[30]=R,
[12]=R,[21]=L,[32]=L,[23]=R,
[02]=R,[20]=L,[13]=L,[31]=R,
}
collect(Z)
local S=reflect(Z)
collect(S)
collectSet(Z)
collectSet(S)
C2sym={
Z,S,--Z,S
Z,S,--J,L
Z,--T
noKick,--O
noKickSet,--O
Z,--I
Z,S,--Z5,S5
Z,S,--P,Q
Z,S,--F,E
Z,Z,Z,Z,--T5,U,V,W
noKick,--X
noKickSet,--X
Z,S,--J5,L5
Z,S,--R,Y
Z,S,--N,H
@@ -472,10 +480,10 @@ do
end
local Classic={}
for i=1,29 do Classic[i]=noKick end
for i=1,29 do Classic[i]=noKickSet end
local None={}
for i=1,29 do None[i]=noKick_180 end
for i=1,29 do None[i]=noKickSet_180 end
return{
TRS=TRS,

View File

@@ -39,7 +39,7 @@ return{
{"Applets",
"applets",
"help",
"[Entrance of applets has been moved to command line]",
"[Entrance of applets has been moved to console]",
},
--Games
@@ -202,26 +202,6 @@ return{
"term",
"Blocks per minute\n\tReflects playing speed of a player.\nAlso apparently MrZ forgot that it can be called PPM to avoid confusing with the music term.",
},
{"APM",
"apm attackperminute",
"term",
"Attack per minute\n\tReflects offensive power of a player.\nIn Techmino, the concept of \"attack\" sometimes includes the fractional lines of an attack. Since sending garbage rounds down before sending, this value can be higher than your actual attack power.",
},
{"SPM",
"spm linessentperminute",
"term",
"[lines] Sent per minute\n\tReflects *actual* offensive power of a player. (Seems like this does not count lines used for cancelling garbage in buffer.)",
},
{"ADPM",
"adpm attackdigperminute",
"term",
"Attack&Dig per minute\n\tUsed to compare skill differences between the two players within one match; slightly more accurate than APM.",
},
{"DPM",
"dpm digperminute defendperminute",
"term",
"Dig/Defend per minute\n\tSometimes can reflect how well a player can survive garbage.",
},
{"KPM",
"kpm keysperminute keypressesperminute",
"term",
@@ -232,47 +212,32 @@ return{
"term",
"Keypresses per piece\n\tReflects how efficient the player is with the controls. Reduce this number by learning to finesse.",
},
{"APM",
"apm attackperminute",
"term",
"Attack per minute\n\tReflects offensive power of a player.\nIn Techmino, the concept of \"attack\" sometimes includes the fractional lines of an attack. Since sending garbage rounds down before sending, this value can be higher than your actual attack power.",
},
{"SPM",
"spm linessentperminute",
"term",
"[lines] Sent per minute\n\tReflects *actual* offensive power of a player. (Seems like this does not count lines used for cancelling garbage in buffer.)",
},
{"DPM",
"dpm digperminute defendperminute",
"term",
"Dig/Defend per minute\n\tSometimes can reflect how well a player can survive garbage.",
},
{"ADPM",
"adpm attackdigperminute",
"term",
"Attack&Dig per minute\n\tUsed to compare skill differences between the two players within one match; slightly more accurate than APM.",
},
{"APL",
"apl attackperline efficiency",
"term",
"Attack per line [cleared]\n\tAlso known as \"efficiency\"; reflects the per-line efficiency of attacks. For example, Tetrises and T-spins have higher efficiency than doubles and triples.",
},
{"All Clear",
"pc perfectclear ac allclear",
"term",
"Formerly known as Perfect Clear (PC). That is also still the term preferred by the communities and used in Techmino.\nClear all minoes on the field.",
},
{"HPC",
"hpc hc clear halfperfectclear",
"term",
"*Techmino-exclusive*\nHalf Perfect Clear\nExtension of an All Clear. Should a line clear resemble an All Clear when ignoring lines below the clear, the clear is a Half Perfect Clear, and sends a small extra amount of attack.",
},
{"TSS",
"tss t1 tspinsingle",
"term",
"T-Spin Single\nClear 1 line with a T-Spin.",
},
{"TSD",
"tsd t2 tspindouble",
"term",
"T-Spin Double\nClear 2 lines with a T-Spin.",
},
{"TST",
"tst t3 tspintriple",
"term",
"T-Spin Triple\nClear 3 lines with a T-Spin.",
},
{"MTSS",
"mtss minitspinsingle tsms tspinminisingle",
"term",
"Mini T-Spin Single\nFormerly known as T-Spin Mini Single.\nClear 1 line with a Mini T-Spin.\nDifferent games apparently have different ways to determine whether a T-Spin is a Mini.",
},
{"MTSD",
"mtsd minitspindouble tsmd tspinminidouble",
"term",
"Mini T-Spin Double\nFormerly known as T-Spin Mini Double (TSMD).\nClear 2 lines with a Mini T-Spin.\nDifferent games apparently have different ways to determine whether a T-Spin is a Mini.\nIn addition, different games have different behavior when clearing a Mini T-Spin Double: some games credit this move correctly, and some games use a different displayed text because they never programmed this in.",
},
{"Single",
"single",
"term",
@@ -298,12 +263,27 @@ return{
"term",
"The name of the game (and its trademark). Also the name for clearing 4 lines.\nCoined from Tetra (greek for \"four\") and Tennis (favorite sport of Alexey Pajitnov, creator of Tetris).",
},
{"All Clear",
"pc perfectclear ac allclear",
"term",
"Formerly known as Perfect Clear (PC). That is also still the term preferred by the communities and used in Techmino.\nClear all minoes on the field.",
},
{"HPC",
"hpc hc clear halfperfectclear",
"term",
"*Techmino-exclusive*\nHalf Perfect Clear\nExtension of an All Clear. Should a line clear resemble an All Clear when ignoring lines below the clear, the clear is a Half Perfect Clear, and sends a small extra amount of attack.",
},
{"Spin",
"spin",
"term",
"Use rotation to move a piece into a position otherwise unreachable. In some games, this sends extra attack or awards extra score.",
},
{"Mini",
"mini",
"term",
"A modifier to Spins, applied to Spin actions that the game considers easy (thus the name \"EZ T-Spin\" in an old game). Score and attack bonuses are reduced for Mini Spins.\nDifferent games have different rules for what counts as a Mini, and many are not intuitive. You can just remember a few common shapes.",
},
{"All-Spin",
"allspin",
"term",
@@ -314,6 +294,31 @@ return{
"term",
"A spin using the T piece.\nIn modern official games, T-Spins are detected using the 3-corner rule, i.e. if at least three of the four cells diagonal to the rotation center, it is a T-Spin. Some games have extra rules to mark a T-Spin as a Mini T-Spin instead, which has reduced attack/score.",
},
{"TSS",
"tss t1 tspinsingle",
"term",
"T-Spin Single\nClear 1 line with a T-Spin.",
},
{"TSD",
"tsd t2 tspindouble",
"term",
"T-Spin Double\nClear 2 lines with a T-Spin.",
},
{"TST",
"tst t3 tspintriple",
"term",
"T-Spin Triple\nClear 3 lines with a T-Spin.",
},
{"MTSS",
"mtss minitspinsingle tsms tspinminisingle",
"term",
"Mini T-Spin Single\nFormerly known as T-Spin Mini Single.\nClear 1 line with a Mini T-Spin.\nDifferent games apparently have different ways to determine whether a T-Spin is a Mini.",
},
{"MTSD",
"mtsd minitspindouble tsmd tspinminidouble",
"term",
"Mini T-Spin Double\nFormerly known as T-Spin Mini Double (TSMD).\nClear 2 lines with a Mini T-Spin.\nDifferent games apparently have different ways to determine whether a T-Spin is a Mini.\nIn addition, different games have different behavior when clearing a Mini T-Spin Double: some games credit this move correctly, and some games use a different displayed text because they never programmed this in.",
},
{"O-Spin",
"ospin",
"term",
@@ -350,11 +355,6 @@ return{
"*Techmino-exclusive*\nTechmino Rotation System\nThe rotation system used in Techmino.\nIt is based on SRS, with fixes on common cases where S/Z are locked from rotating, and some extra useful kicks. Each pentomino also has a kick table roughly based on SRS logic.",
},
{"Mini",
"mini",
"term",
"A modifier to Spins, applied to Spin actions that the game considers easy (thus the name \"EZ T-Spin\" in an old game). Score and attack bonuses are reduced for Mini Spins.\nDifferent games have different rules for what counts as a Mini, and many are not intuitive. You can just remember a few common shapes.",
},
{"Back to Back",
"b2b btb backtoback",
"term",
@@ -903,17 +903,22 @@ return{
"Tetris Research community member.\nPersonal bests: Sprint 26.193 seconds\nOne of the prestigious players in the Chinese Tetris community. Author of T-ex and Tetr.js Farter's Dig Mod.",
"https://space.bilibili.com/132966",
},
{"Teatube",
"teatube ttb chaguan chanaiye sifangchaye 022",
"name",
"Administrator of the Tetris Research community, Operator of the Tetris Online Study private server, chief editor of the Huiji wiki.\nPersonal bests: Sprint 33 seconds, Tetris Online peak stats 50LPM, 70APM.",
"https://space.bilibili.com/834903",
},
{"Sniraite",
"sniraite",
"name",
"Tetris Research community member.\nPersonal bests: Sprint 23 seconds\nOne of the top players in China. Should be the fastest player in Mainland China.",
"https://space.bilibili.com/561589",
},
{"Teatube",
"teatube ttb chaguan chanaiye sifangchaye 022",
{"xb",
"xb",
"name",
"Administrator of the Tetris Research community, Operator of the Tetris Online Study private server, chief editor of the Huiji wiki.\nPersonal bests: Sprint 33 seconds, Tetris Online peak stats 50LPM, 70APM.",
"https://space.bilibili.com/834903",
"Tetris Research community member.\nMain organizer for competitions in the community.",
},
{"Flyz",
"flyz fxg",
@@ -927,11 +932,6 @@ return{
"Tetris Research community member.\nPersonal bests: Sprint 22.831 seconds (25.483 seconds on mobile), MPH Sprint 56 seconds, X rank on Tetr.io\nOne of the top players of 20G in China, achieved almost every achievement in TGM3.",
"https://space.bilibili.com/287769888",
},
{"xb",
"xb",
"name",
"Tetris Research community member.\nMain organizer for competitions in the community.",
},
{"蕴空之灵",
"ykzl yunkongzhiling niao bird",
"name",
@@ -1022,12 +1022,6 @@ return{
"Tetris Research community member, Virtual content creator.\nA top Tetris 99 players known for his strategies.",
"https://space.bilibili.com/147529",
},
{"ditoly",
"ditoly icrem kuimei jk",
"name",
"Tetris Research community member.",
"https://space.bilibili.com/13014410",
},
{"蓝绿",
"lanlv gompyn imple lee blari'o blariho",
"name",
@@ -1039,11 +1033,4 @@ return{
"Tetris Research community member, Virtual content creator.\nPractically the mascot of the community. Voice actress of Techmino.",
"https://space.bilibili.com/846180",
},
{"Windkey",
"wdk windkey fengyaoshi",
"name",
"Former community member.\nBad reputation due to excessive center 4-wides.",
"https://space.bilibili.com/25576872",
},
}

View File

@@ -28,13 +28,13 @@ return{
{"灰机wiki",
"灰机wiki huiji wiki",
"help",
"俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n当前大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki",
"俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n目前其大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki",
"https://tetris.huijiwiki.com",
},
{"小程序",
"小程序 applets",
"help",
"[小程序入口已移动至命令行]",
"[小程序入口已移动至控制台]",
},
--游戏(题库)
@@ -61,7 +61,7 @@ return{
{"King of Stackers",
"回合制 kos kingofstackers",
"game",
"King of Stackers\n网页版回合制对战方块点击即玩(可能很卡)",
"King of Stackers\n网页版回合制对战方块点击即玩(可能很卡)主要规则为以7块为一个回合双方轮流在自己场地中放置方块任何的攻击只在对方回合放一块不消行后生效策略性很强。有不同的伤害表设置。",
"https://kingofstackers.com/games.php",
},
{"Tetr.js",
@@ -79,13 +79,13 @@ return{
{"Jstris",
"网页 手机 js jstris",
"game",
"全平台网页对战方块点击即玩(服务器在国外可能很卡)",
"全平台网页对战方块点击即玩(服务器在国外可能很卡)。有常用的科研向单机模式和自定义各种参数的功能,但没有很多强制速度向的挑战项目。都是纯色素材导致画面效果不怎么好。移动端的键位设置并不舒适。",
"https://jstris.jezevec10.com",
},
{"TETR.IO",
"网页 io tetrio",
"game",
"炫酷在线对战方块点击即玩(推荐使用电脑,移动设备需要外接键盘)(服务器在国外,可能超级慢甚至打不开)",
"炫酷在线对战方块点击即玩(推荐使用电脑,移动设备需要外接键盘)(服务器在国外,可能超级慢甚至打不开)有很科学的排位系统,自定义功能非常全面,同时也提供电脑客户端下载(可以去除广告)。缺点是单机模式非常非常少。",
"https://tetr.io",
},
{"World Wide Combo",
@@ -202,26 +202,6 @@ return{
"term",
"Block per Minute\n块每分,体现玩家下块速度\n别问为什么不是PPM问就是不知道",
},
{"APM",
"apm attack gongji",
"term",
"Attack per Minute\n攻击每分,即玩家每分钟能打出的垃圾行数。\n一定程度体现玩家攻击力",
},
{"SPM",
"spm send gongji",
"term",
"Send per Minute\n送出每分,即玩家每分钟实际打出去给对手的垃圾行数。\n一定程度体现玩家给对手实际造成的攻击力",
},
{"ADPM",
"adpm attack defend",
"term",
"Atk+Dig per Minute\n攻击+挖掘每分用于在同一局游戏内对比玩家间水平差距比apm更准确一些",
},
{"DPM",
"dpm dig defend",
"term",
"Dig/Defend per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力\n\n或:防御(抵消+挖掘)每分",
},
{"KPM",
"kpm sudu",
"term",
@@ -232,6 +212,26 @@ return{
"term",
"Key per Piece\n按键每块,体现玩家操作是否繁琐。\n学会极简提升操作效率以减少此数字",
},
{"APM",
"apm attack gongji",
"term",
"Attack per Minute\n攻击每分,即玩家每分钟能打出的垃圾行数。\n一定程度体现玩家攻击力",
},
{"SPM",
"spm send gongji",
"term",
"Send per Minute\n送出每分,即玩家每分钟实际打出去给对手的垃圾行数。\n一定程度体现玩家给对手实际造成的攻击力",
},
{"DPM",
"dpm dig defend",
"term",
"Dig/Defend per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力\n\n或:防御(抵消+挖掘)每分",
},
{"ADPM",
"adpm attack defend",
"term",
"Atk+Dig per Minute\n攻击+挖掘每分用于在同一局游戏内对比玩家间水平差距比apm更准确一些。\n在TETR.IO中有一个叫vs的数据就是ADPM(调整了比例)",--TODO
},
{"APL",
"apl xiaolv",
"term",
@@ -239,6 +239,31 @@ return{
},
--术语(消除名)
{"Single",
"single xiaoyi",
"term",
"消一行",
},
{"Double",
"double xiaoer",
"term",
"消两行",
},
{"Triple",
"triple xiaosan",
"term",
"消三行",
},
{"Techrash",
"techrash xiaosi",
"term",
"消四行(Tech限定)",
},
{"Tetris",
"tetris xiaosi",
"term",
"商标Tetris游戏名同时也是别的方块游戏里消四行的名字。\n含义是Tetra(古希腊语 四)+Tennis(游戏原作者喜欢的运动)。",
},
{"PC",
"pc perfectclear ac allclear quanxiao quanqing",
"term",
@@ -247,7 +272,29 @@ return{
{"HPC",
"hpc hc clear banqing banquanqing banquanxiao",
"term",
"Half-PC\nPC(全消)的外延,如果去掉消除部分之下的场地后上面部分是一个PC那么这个消除就是半PC打出一些攻击(仅Tech中有)。",
"Half-PC\nPC(全消)的外延,\"下方有剩余方块\"的全消(特别地如果只消1行则必须不剩余玩家放置的方块),能打出一些攻击和防御(仅Tech中有)。",
},
--术语(旋转相关)
{"Spin",
"spin xuanzhuan zuandong",
"term",
"(部分游戏中)使用旋转将方块卡进不能直接移动进入的位置,具体判定规则不同游戏不一样,可能会有攻击加成。",
},
{"Mini",
"迷你 mini",
"term",
"spin附加mini后攻击会弱化用于平衡不同难易度的tspin攻击判定在不同游戏都不一样而且大多数很不好理解建议只记住常见形状即可。",
},
{"Allspin",
"allspin",
"term",
"一种规则指所有方块的spin都有攻击力而不止是Tspin才有攻击(Tspin only)。",
},
{"Tspin",
"tspin txuan",
"term",
"在官方规则中当T方块在锁定前的最后一个操作是旋转并且锁定后旋转中心对应的四个斜角位置有三个不是空气那么这就是一个Tspin。PS:如果满足一些额外条件会被打上mini标签减少攻击力。",
},
{"TSS",
"tss t1 tspin",
@@ -274,55 +321,13 @@ return{
"term",
"mini T-spin double\n指T方块mini spin消2行(仅部分游戏内存在且判定不一样)。",
},
{"Single",
"single xiaoyi",
"term",
"消一行",
},
{"Double",
"double xiaoer",
"term",
"消两行",
},
{"Triple",
"triple xiaosan",
"term",
"消三行",
},
{"Techrash",
"techrash xiaosi",
"term",
"消四行(Tech限定)",
},
{"Tetris",
"tetris xiaosi",
"term",
"商标Tetris游戏名同时也是别的方块游戏里消四行的名字。\n含义是Tetra(古希腊语 四)+Tennis(作者喜欢的运动)。",
},
--术语(旋转相关)
{"Spin",
"spin xuanzhuan zuandong",
"term",
"(部分游戏中)使用旋转将方块卡进不能直接移动进入的位置,具体判定规则不同游戏不一样,可能会有攻击加成。",
},
{"Allspin",
"allspin",
"term",
"一种规则指所有方块的spin都有攻击力而不止是Tspin才有攻击(Tspin only)。",
},
{"Tspin",
"tspin txuan",
"term",
"在官方规则中当T方块在锁定前的最后一个操作是旋转并且锁定后旋转中心对应的四个斜角位置有三个不是空气那么这就是一个Tspin。PS:如果满足一些额外条件会被打上mini标签减少攻击力。",
},
{"Ospin",
"ospin",
"term",
"由于O方块旋转后形状不变只能左右移动所以经常被卡住于是方块圈就有了ospin的梗:\n有人做过T99/TF中的O变形的特效视频且广为流传;\nT-ex设计的旋转系统可以用spin使O传送进坑;\nTech设计的变形系统中可以旋转O来变形/传送进入一些特定形状的洞。",
},
{"踢墙",
"踢墙 wallkick tiqiang",
{"旋转系统(踢墙)",
"旋转系统 踢墙 xuanzhuanxitong wallkick tiqiang",
"term",
"(部分游戏中)方块旋转后可能和场地或者墙壁有碰撞此时系统可能会给方块施加的偏移让方块不会因此被卡住而不能操作。详见SRS词条",
},
@@ -353,11 +358,6 @@ return{
},
--术语(游戏内名词)
{"mini",
"迷你 mini",
"term",
"spin附加mini后攻击会弱化用于平衡不同难易度的tspin攻击判定在不同游戏都不一样而且大多数很不好理解建议只记住常见形状即可。",
},
{"B2B",
"大满贯 b2b btb backtoback",
"term",
@@ -433,7 +433,7 @@ return{
{"连击",
"连击 ren combo",
"term",
"从第二次消除起叫1ren/combo",
"从第二次消除起叫1ren/combo,打出的攻击根据游戏设计的不同也不同",
},
{"Side",
"连击 ·side",
@@ -538,7 +538,7 @@ return{
{"SDF",
"软降速度 sdf softdropfactor",
"term",
"Soft Drop Factor软降速度因子(倍率),部分游戏中的软降机制是让重力变为原来的若干倍SDF就是这个倍数。\n基本所有官块和tetr.io使用这个机制本游戏不使用。",
"Soft Drop Factor软降速度因子(倍率),部分游戏中的软降机制就是在按住软件键时方块受到的重力变为原来的若干倍SDF就是这个变大的倍数。\n基本所有官块和tetr.io使用这个机制本游戏不使用。",
},
{"bag7出块",
"bag出块 bag7bag",
@@ -913,17 +913,23 @@ return{
"【研究群】「TTTT」\n40行26.193秒\nCN块圈元老之一《T-ex》和《屁块》的作者",
"https://space.bilibili.com/132966",
},
{"Teatube",
"teatube ttb chaguan chanaiye sifangchaye t022",
"name",
"【研究群】「T022」\n40行33秒 top数据高峰约50L70A\n研究群管理,探索群群主,茶服服主,人形方块百科史书,现中文方块维基主催\n自2011年正式加入CN方块社区以来以探索方块有趣的思想作为主动力茶茶今天也在茶馆里当着茶房管理员——\n\n其他名称:TTB永远旋转的炸弹茶乃叶四方茶叶\n明明茶管是蓝孩子却被群友叫茶娘…怎么想都很奇怪啊!嘛大家喜欢的话就随便啦——",
"https://space.bilibili.com/834903",
},
{"Sniraite",
"sniraite shege 11renpc t024",
"name",
"【研究群】「T024」\n40行sub23\n国内一流方块玩家,应该是大陆最速",
"https://space.bilibili.com/561589",
},
{"Teatube",
"teatube ttb chaguan chanaiye sifangchaye t022",
{"xb",
"xb t043",
"name",
"【研究群】「T022」\n40行33秒 top数据高峰约50L70A\n研究群管理,探索群群主,茶服服主,人形方块百科史书,现中文方块维基主催\n自2011年正式加入CN方块社区以来以探索方块有趣的思想作为主动力茶茶今天也在茶馆里当着茶房管理员——\n\n其他名称:TTB永远旋转的炸弹茶乃叶四方茶叶\n明明茶管是蓝孩子却被群友叫茶娘…怎么想都很奇怪啊!嘛大家喜欢的话就随便啦——",
"https://space.bilibili.com/834903",
"【研究群】「T043」\n俄罗斯方块中文维基(灰机wiki)主要编者(之一",
"https://space.bilibili.com/226132",
},
{"Flyz",
"flyz fxg t114",
@@ -937,12 +943,6 @@ return{
"【研究群】「T127」\n40行22.831秒(手机25.483)MPH40行56秒tetr.io段位X数据约60L95A\n20G规则国内一流玩家拿到了TGM3几乎全部的最终成就(全世界都没几个)\n其他名称:小柒 kissne 127\n还是车车人,几个正作成绩:永EX NM 1B FS 风L NM",
"https://space.bilibili.com/287769888",
},
{"xb",
"xb t043",
"name",
"【研究群】「T043」\n研究群赛事主要主办人",
"https://space.bilibili.com/226132",
},
{"蕴空之灵",
"蕴空之灵 ykzl yunkongzhiling niao bird t196",
"name",
@@ -1033,12 +1033,6 @@ return{
"【研究群】「T1934」\nvupT99国内一流战术型玩家",
"https://space.bilibili.com/147529",
},
{"ditoly",
"葵 ditoly icrem kuimei jk t3055",
"name",
"【研究群】「T3055」\n被清华劝退现于北大的打块天才jk\n(好像也被北大劝退了?不知道)",
"https://space.bilibili.com/13014410",
},
{"蓝绿",
"蓝绿 lanlv gompyn imple lee blari'o blariho t3182",
"name",
@@ -1050,11 +1044,4 @@ return{
"【研究群】「T7023」\nvup喜欢打块的猫猫(Z酱单推)techmino配音之一",
"https://space.bilibili.com/846180",
},
{"Windkey",
"wdk windkey fengyaoshi",
"name",
"曾经是群友对战基本只用开局c4w导致风评很差想学c4w可以看他",
"https://space.bilibili.com/25576872",
},
}

View File

@@ -95,6 +95,7 @@ return{
createRoomTooFast="You are creating a room too fast!",
createRoomSuccessed="Room successfully created!",
started="Playing",
joinRoom="has joined the room.",
leaveRoom="has left the room.",
notReady="Waiting",
@@ -253,7 +254,8 @@ return{
refreshing="Refreshing rooms",
noRoom="There aren't any rooms right now...",
refresh="Refresh",
new="New Room",
new="New Room(2)",
new2="New Room(5)",
join="Join",
up="",
down="",
@@ -503,8 +505,8 @@ return{
dict={
title="TetroDictionary",
link="Open URL",
up="",
down="",
up="",down="",
pageup="↑↑",pagedown="",
},
stat={
path="Open Data Folder",
@@ -646,6 +648,7 @@ return{
},
app_dtw={
reset="Reset",
arcade="Arcade",
mode="Mode",
},
savedata={
@@ -665,7 +668,7 @@ return{
resetData="Reset Data",
},
error={
cmd="CMD",
cmd="Console",
quit="Quit",
},
},
@@ -867,7 +870,7 @@ return{
{c.fire,"Also try Tetr.js!"},
{c.fire,"Also try Tetra Legends!"},
{c.grape,"T-spin!"},
{c.grey,"REGRET!!"},
{c.gray,"REGRET!!"},
{c.lR,"Z ",c.lG,"S ",c.lSea,"J ",c.lOrange,"L ",c.lGrape,"T ",c.lY,"O ",c.lC,"I"},
{c.lY,"COOL!!"},
{c.R,"\"DMCA abusing\""},

View File

@@ -96,6 +96,7 @@ return{
createRoomTooFast="Vous avez créé un salon trop rapidement !",
createRoomSuccessed="Salon créé avec succès !",
-- started="Playing",
joinRoom="a rejoint le salon.",
leaveRoom="a quitté le salon.",
notReady="Attente",
@@ -460,8 +461,6 @@ return{
dict={
title="TetroDictionary",
link="Ouvrir URL",
up="",
down="",
},
stat={
path="Ouvrir dossier des données",
@@ -556,6 +555,7 @@ return{
},
app_dtw={
reset="Réinitialiser",
-- arcade="Arcade",
-- mode="Mode",
},
about={
@@ -580,7 +580,7 @@ return{
resetData="Réinitialiser les données",
},
error={
cmd="CMD",
cmd="Console",
quit="Quit",
},
},

View File

@@ -95,6 +95,7 @@ return{
-- createRoomTooFast="Create room too fast!",
-- createRoomSuccessed="Room successfully created!",
-- started="Playing",
joinRoom="Entrou a sala.",
leaveRoom="Saiu da sala.",
-- notReady="Waiting",
@@ -253,7 +254,8 @@ return{
-- refreshing="Refreshing Rooms",
noRoom="Nenhuma sala agora",
-- refresh="Refresh",
-- new="New room",
-- new="New Room(2)",
-- new2="New Room(5)",
-- join="Join",
up="",
down="",
@@ -503,8 +505,6 @@ return{
dict={
title="TetroDictionary",
link="Abrir URL",
up="",
down="",
},
stat={
path="Abrir Pasta De Data",
@@ -644,6 +644,7 @@ return{
},
app_dtw={
reset="Resetar",
-- arcade="Arcade",
-- mode="Mode",
},
savedata={
@@ -663,7 +664,7 @@ return{
resetData="Reset data",
},
error={
cmd="CMD",
cmd="Console",
quit="Quit",
},
},
@@ -857,8 +858,8 @@ return{
{COLOR.fire,"Tente também Tetr.js"},
{COLOR.fire,"Tente também Tetralegends"},
{COLOR.grape,"T-spin!"},
{COLOR.grey,"暫定段位:9"},
{COLOR.grey,"REGRET!!"},
{COLOR.gray,"暫定段位:9"},
{COLOR.gray,"REGRET!!"},
{COLOR.lR,"Z ",COLOR.lG,"S ",COLOR.lSea,"J ",COLOR.lOrange,"L ",COLOR.lGrape,"T ",COLOR.lY,"O ",COLOR.lC,"I"},
{COLOR.lY,"LEGAL!!"},
{COLOR.R,"\"DMCA abusing\""},

View File

@@ -96,6 +96,7 @@ return{
createRoomTooFast="¡Creas salas muy rápido, párale we!",
createRoomSuccessed="¡Sala creada con éxito!",
-- started="Playing",
joinRoom="entró a la sala.",
leaveRoom="salió de la sala.",
notReady="En espera",
@@ -231,7 +232,8 @@ return{
-- refreshing="Refreshing Rooms",
noRoom="No Hay Salas Actualmente",
refresh="Refrescar",
new="Sala Nueva",
new="Sala Nueva(2)",
new2="Sala Nueva(5)",
join="Unirse",
up="",
down="",
@@ -464,8 +466,6 @@ return{
dict={
title="TetroDictionary",
link="Abrir URL",
up="",
down="",
},
stat={
path="Abrir carpeta del juego",
@@ -559,6 +559,7 @@ return{
},
app_dtw={
reset="Reiniciar",
-- arcade="Arcade",
mode="Modo",
},
savedata={
@@ -578,7 +579,7 @@ return{
resetData="Reiniciar datos",
},
error={
cmd="CMD",
cmd="Console",
quit="Salir",
},
},

View File

@@ -346,8 +346,6 @@ return{
dict={
title="TetroDictionary",
link="~~e>>",
up="",
down="",
},
stat={
path="%$%",
@@ -487,6 +485,7 @@ return{
},
app_dtw={
reset="R",
arcade="↓↓",
mode="?",
},
},

View File

@@ -43,9 +43,10 @@ return{
createRoomTooFast="手痒要开这么多房间?",
createRoomSuccessed="创好了",
started="开了",
notReady="没有准备好",
beReady="准备好了",
champion="爷爷是 $1",
champion="神仙是 $1",
stat={
"开了几次:",
@@ -182,7 +183,7 @@ return{
tapFX="动画",
},
error={
cmd="CMD",
cmd="Console",
quit="Quit",
},
},

View File

@@ -95,6 +95,7 @@ return{
createRoomTooFast="创建房间太快啦,等等吧",
createRoomSuccessed="创建房间成功!",
started="游戏中",
joinRoom="进入房间",
leaveRoom="离开房间",
notReady="等待中",
@@ -253,7 +254,8 @@ return{
refreshing="刷新房间列表中",
noRoom="一个房间都没有哎...",
refresh="刷新",
new="创建房间",
new="创建房间(2)",
new2="创建房间(5)",
join="加入",
up="",
down="",
@@ -580,8 +582,8 @@ return{
dict={
title="小Z方块词典",
link="打开链接",
up="",
down="",
up="",down="",
pageup="↑↑",pagedown="",
},
stat={
path="打开存储目录",
@@ -647,6 +649,7 @@ return{
},
app_dtw={
reset="重置",
arcade="街机",
mode="模式",
},
savedata={
@@ -666,7 +669,7 @@ return{
resetData="重置统计",
},
error={
cmd="命令行",
cmd="控制台",
quit="退出",
},
},
@@ -800,8 +803,9 @@ return{
"本游戏的一部分内容是国际合作的!",
"本游戏的B2B是气槽机制,和传统的开关机制不一样哦",
"本游戏可不是休闲游戏。",
"本游戏内置了几个休(ying)闲(he)小游戏哦~去词典找找吧",
"本游戏内置了几个休(ying)闲(he)小游戏哦~入口就藏在这个菜单",
"必须要软降才能到达的位置都会判定为极简操作",
"别看攻击效率不高,其实消四还是很强的",
"别问游戏名怎么取的,问就是随便想的",
"不同人打40行最合适的方式不一样,s1w/63/散消/s2w...",
"不同游戏(甚至不同模式)中不同战术的能力都不一样,并没有绝对的强弱之分",
@@ -826,6 +830,7 @@ return{
"对战游戏不是单机游戏,所以timing在对战里也非常重要!",
"多年小游戏玩家表示痛恨假加载,启动动画主要是在加载资源",
"多hold现代块又回来了!",
"俄罗斯方块完全可以作为电竞游戏",
"发现有个\"隐形\"皮肤了吗",
"方块不能吃",
"方块教会我们,合群了就会消失,...",
@@ -943,6 +948,7 @@ return{
"这里的极简判定不松不严,放心软降,小心hold!",
"震惊,我只是一条凑数tip吗",
"中国的方块起步晚,所以世界级高手很少…下一个会是你吗?",
"众所周知俄罗斯方块是经典编程练手游戏(?",
"注意到方块\"旋转\"的时候到底发生了些什么吗?",
"自定义场地可以画图实现逐页演示",
"总共有300多条tip哦",
@@ -977,7 +983,7 @@ return{
"Farter:\"是民间UI动效艺术作品\"",
"Farter:\"是一滩散乱的代码组成的蜜汁结构\"",
"Farter:\"它是现在的techmino已发布版本\"",
"Farter:论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(",
"Farter:\"论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(\"",
"fin neo iso 是满足tspin条件的特殊t2的名字",
"if a==true",
"l-=-1",
@@ -987,14 +993,17 @@ return{
"sin²α-cos²β=-C(α+β)C(α-β)",
"sin²α-sin²β=S(α+β)S(α-β)",
"sin2α=2SαCα",
"Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给Z酱打赞助",
"Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给Z酱打赞助",
"SΔABC=√(h(h-a)(h-b)(h-c)), h=(a+b+c)/2",
"Tech生日不太清楚,那就定在2019.6.26吧",
"Tech也有节日主题了哦",
"Techmino = Technique + tetromino",
"Techmino n.铁壳米诺(游戏名)",
"Techmino console了解一下",
"Techmino安卓下载",
"Techmino好玩!",
"Techmino 好玩!",
"Techmino 濂界帺锛",
"Techmino有一个Nspire-CX版本!",
"Techmino在哪里下载",
"Techminohaowan",
@@ -1004,6 +1013,7 @@ return{
"Z酱累了,Z酱不想更新",
"Z酱只是个写代码的,懂什么方块",
"Z块等身抱枕来一个(x",
{c.aqua,"AQUA"},
{c.B,"BLUE"},
{c.C,"<PURE ",c.grape,"MEMORY>"},
{c.C,"15puzzle好玩!"},
@@ -1034,23 +1044,24 @@ return{
{c.G,"快捷键: Ctrl+Tab=切换标签页"},
{c.G,"快捷键: Ctrl+W=关闭当前标签页"},
{c.G,"快捷键: shift+del=永久删除文件 (技术人员别杠)"},
{c.G,"GREEN"},
{c.grape,"GRAPE"},
{c.grape,"T-spin!"},
{c.grass,"GRASS"},
{c.grey,"感谢Phigros提供部分tip模板("},
{c.grey,"暂定段位:9"},
{c.grey,"REGRET!!"},
{c.lame,"LAME"},
{c.gray,"感谢Phigros提供部分tip模板("},
{c.gray,"暂定段位:9"},
{c.gray,"REGRET!!"},
{c.lime,"LIME"},
{c.lC,"26连T2来一个?"},
{c.lC,"Xspin",c.W,"是啥"},
{c.lGrape,"Naki",c.W," 可爱!"},
{c.lGrey,"腱鞘炎警告"},
{c.lGrey,"看起来是个计算器,其实…"},
{c.lGrey,"没学过编曲,音乐都是自己瞎写的,觉得不好听就去设置关了吧"},
{c.lGrey,"秘密数字:626"},
{c.lGrey,"你有一个好"},
{c.lGrey,"STSD必死"},
{c.lGrey,"Techmino没有抽卡没有氪金,太良心了"},
{c.lGray,"腱鞘炎警告"},
{c.lGray,"看起来是个计算器,其实…"},
{c.lGray,"没学过编曲,音乐都是自己瞎写的,觉得不好听就去设置关了吧"},
{c.lGray,"秘密数字:626"},
{c.lGray,"你有一个好"},
{c.lGray,"STSD必死"},
{c.lGray,"Techmino没有抽卡没有氪金,太良心了"},
{c.lR,"Z ",c.lG,"S ",c.lSea,"J ",c.lOrange,"L ",c.lGrape,"T ",c.lY,"O ",c.lC,"I"},
{c.lSea,"茶娘",c.W," 可爱!"},
{c.lY,"COOL!!"},
@@ -1076,16 +1087,14 @@ return{
{c.sky,"Lua",c.W,"天下第一"},
{c.sky,"SKY"},
{c.W,"1, 2, ",c.C,"",c.W,"!!!!!"},
{c.W,"效率药水",c.grey," 效率提升 (8:00)"},
{c.W,"协调药水",c.grey," MD减少 II(1:30)"},
{c.water,"WATER"},
{c.W,"效率药水",c.gray," 效率提升 (8:00)"},
{c.W,"协调药水",c.gray," MD减少 II(1:30)"},
{c.Y,"暂定段位:GM"},
{c.Y,"暂定段位:M"},
{c.Y,"暂定段位:MK"},
{c.Y,"暂定段位:MM"},
{c.Y,"暂定段位:MO"},
{c.Y,"暂定段位:MV"},
{c.Y,"GREEN"},
{c.Y,"Miya",c.W," 可爱!"},
{c.Y,"O-spin Triple!"},
{c.Y,"YELLOW"},

View File

@@ -32,12 +32,12 @@ Attack system:
Special line clears will the increase B2B gauge, making later special line clears have either a B2B or B2B2B bonus (see below)
Half Perfect Clear (a P.C. "with blocks left below". If it's an I clearing 1 line, the remaining blocks must not be player-placed):
Attack +2, Extra Blocking +2
Hemi Perfect Clear (a P.C. "with blocks left below". If it's an I clearing 1 line, the remaining blocks must not be player-placed):
Attack +4, Extra Blocking +2
Perfect Clear (aka All Clear):
Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher,
and +2 extra blocking. (note: if lines cleared in this round >4, then B2B gauge will be completely filled)
and +2 extra blocking.
Combos: All damage above will be given a (combo x25%) bonus, or (combo x15% for Single clear) (capped at 12 combo),
+1 more attack for 3 Combo or more.
@@ -63,6 +63,8 @@ Back to Back (B2B) gauge:
A regular line clear -250
Spin Single/Double/Triple/Techrash/Techrash+ + 50/100/180/800/1000 (x50% if Mini)
Techrash/Techrash+ + 150/200/...
PC when lines cleared in this round >4, +800
Hemi-PC, +100
Spin (0 lines) +20. Do note that the B2B gauge cannot exceed 800 using this method.
When gauge is above 800, a drop without clearing lines decreases it by 40, but cannot drop below 800

View File

@@ -27,8 +27,8 @@ spin判定:
B2B攻击+1
B3B攻击+50%,+1额外抵挡
特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2
全消:全消伤害为8~16(本局内递增2),和上述其他伤害取大,然后+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)
半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+4,额外抵挡+2
全消:全消伤害为8~16(本局内递增2),和上述其他伤害取大,然后+2额外抵挡
连击:每次连击给予上述攻击[连击数*25%(上限12连)(如果只消一行就是15%)]的加成,>=3次时再额外加1攻击
根据上述规则计算后,向下取整,攻击打出
@@ -48,6 +48,8 @@ back to back(B2B)点数说明:
普通消除:-250
spin1~5:+[50/100/180/800/1000](mini变为原来50%)
消四/五/六:+[150/200/...]
本局内消行数>4时全消:+800
半全消:+100
空spin:+20,此法得到的点数不能超过800
当点数在800以上时空放一块-40(不低于800)

View File

@@ -181,54 +181,6 @@ do--drawableText
}
end
do--SCS(spinCenters)
local N1,N2,N3,N4={0,1},{1,0},{1,1},{.5,.5}
local I1,I2,I3,I4={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}
local V4={1.5,1.5}
local L1,L2={0,2},{2,0}
local S1,S2={-.5,.5},{.5,-.5}
local D={0,0}
SCS={
--Tetramino
{[0]=N1,N2,N3,N3},--Z
{[0]=N1,N2,N3,N3},--S
{[0]=N1,N2,N3,N3},--L
{[0]=N1,N2,N3,N3},--J
{[0]=N1,N2,N3,N3},--T
{[0]=N4,N4,N4,N4},--O
{[0]=I1,I2,I3,I4},--I
--Pentomino
{[0]=N3,N3,N3,N3},--Z5
{[0]=N3,N3,N3,N3},--S5
{[0]=N1,N2,N3,N3},--P
{[0]=N1,N2,N3,N3},--Q
{[0]=N3,N3,N3,N3},--F
{[0]=N3,N3,N3,N3},--E
{[0]=N3,N3,N3,N3},--T5
{[0]=N1,N2,N3,N3},--U
{[0]=I3,N4,I4,V4},--V
{[0]=N3,N3,N3,N3},--W
{[0]=N3,N3,N3,N3},--X
{[0]=I3,I4,I3,I4},--J5
{[0]=I3,I4,I3,I4},--L5
{[0]=I3,I4,I3,I4},--R
{[0]=I3,I4,I3,I4},--Y
{[0]=I3,I4,I3,I4},--N
{[0]=I3,I4,I3,I4},--H
{[0]=L1,L2,L1,L2},--I5
--Trimino
{[0]=N1,N2,N1,N2},--I3
{[0]=N4,N4,N4,N4},--C
--Domino
{[0]=S1,S2,N4,N4},--I2
--Dot
{[0]=D,D,D,D},--O1
}
end
do--BLOCKS
local O,_=true,false
BLOCKS={
@@ -292,6 +244,55 @@ do--BLOCKS
end
end
do--SCS(spinCenters)
local N1,N2,N3,N4={0,1},{1,0},{1,1},{.5,.5}
local I1,I2,I3,I4={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5}
local V4={1.5,1.5}
local L1,L2={0,2},{2,0}
local S1,S2={-.5,.5},{.5,-.5}
local D={0,0}
SCS={
--Tetramino
{[0]=N1,N2,N3,N3},--Z
{[0]=N1,N2,N3,N3},--S
{[0]=N1,N2,N3,N3},--L
{[0]=N1,N2,N3,N3},--J
{[0]=N1,N2,N3,N3},--T
{[0]=N4,N4,N4,N4},--O
{[0]=I1,I2,I3,I4},--I
--Pentomino
{[0]=N3,N3,N3,N3},--Z5
{[0]=N3,N3,N3,N3},--S5
{[0]=N1,N2,N3,N3},--P
{[0]=N1,N2,N3,N3},--Q
{[0]=N3,N3,N3,N3},--F
{[0]=N3,N3,N3,N3},--E
{[0]=N3,N3,N3,N3},--T5
{[0]=N1,N2,N3,N3},--U
{[0]=I3,N4,I4,V4},--V
{[0]=N3,N3,N3,N3},--W
{[0]=N3,N3,N3,N3},--X
{[0]=I3,I4,I3,I4},--J5
{[0]=I3,I4,I3,I4},--L5
{[0]=I3,I4,I3,I4},--R
{[0]=I3,I4,I3,I4},--Y
{[0]=I3,I4,I3,I4},--N
{[0]=I3,I4,I3,I4},--H
{[0]=L1,L2,L1,L2},--I5
--Trimino
{[0]=N1,N2,N1,N2},--I3
{[0]=N4,N4,N4,N4},--C
--Domino
{[0]=S1,S2,N4,N4},--I2
--Dot
{[0]=D,D,D,D},--O1
}
end
rankColor={
{.6,.3,.3},
{.7,.5,.3},
@@ -301,28 +302,7 @@ rankColor={
}
minoColor={
COLOR.red,
COLOR.fire,
COLOR.orange,
COLOR.yellow,
COLOR.lame,
COLOR.grass,
COLOR.green,
COLOR.water,
COLOR.cyan,
COLOR.sky,
COLOR.sea,
COLOR.blue,
COLOR.purple,
COLOR.grape,
COLOR.magenta,
COLOR.pink,
COLOR.dGrey,
COLOR.black,
COLOR.lYellow,
COLOR.grey,
COLOR.lGrey,
COLOR.dPurple,
COLOR.dRed,
COLOR.dGreen,
COLOR.red, COLOR.fire, COLOR.orange, COLOR.yellow, COLOR.lime, COLOR.grass, COLOR.green, COLOR.aqua,
COLOR.cyan, COLOR.sky, COLOR.sea, COLOR.blue, COLOR.purple, COLOR.grape, COLOR.magenta, COLOR.pink,
COLOR.dGray,COLOR.black,COLOR.lYellow, COLOR.gray, COLOR.lGray, COLOR.dPurple, COLOR.dRed, COLOR.dGreen,
}

View File

@@ -8,7 +8,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"and P.atkBuffer.sum==0 then
if P.control and P.atkBuffer.sum==0 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
local t

View File

@@ -7,7 +7,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"and P.atkBuffer.sum<4 then
if P.control and P.atkBuffer.sum<4 then
local p=#P.atkBuffer+1
local B,D=P.atkBuffer,P.modeData
local s

View File

@@ -1,6 +1,6 @@
local format=string.format
return{
color=COLOR.lGrey,
color=COLOR.lGray,
env={
drop=1e99,lock=1e99,
holdCount=0,

View File

@@ -1,4 +1,3 @@
local rnd=math.random
local rem=table.remove
local function check_c4w(P)
if P.lastPiece.row==0 then
@@ -38,18 +37,18 @@ return{
P.visTime[i]=FREEROW.get(20)
for x=4,7 do F[i][x]=0 end
end
if rnd()<.6 then
if P:RND()<.6 then
local initCell={11,14,12,13,21,24}
for _=1,3 do
_=rem(initCell,rnd(#initCell))
_=rem(initCell,P:RND(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
else
local initCell={11,12,13,14,21,22,23,24}
rem(initCell,rnd(5,8))
rem(initCell,rnd(1,4))
rem(initCell,P:RND(5,8))
rem(initCell,P:RND(1,4))
for _=1,6 do
_=rem(initCell,rnd(#initCell))
_=rem(initCell,P:RND(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
end

View File

@@ -1,4 +1,3 @@
local rnd=math.random
local rem=table.remove
local function check_c4w(P)
if P.lastPiece.row>0 then
@@ -36,18 +35,18 @@ return{
P.visTime[i]=FREEROW.get(20)
for x=4,7 do F[i][x]=0 end
end
if rnd()<.6 then
if P:RND()<.6 then
local initCell={11,14,12,13,21,24}
for _=1,3 do
_=rem(initCell,rnd(#initCell))
_=rem(initCell,P:RND(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
else
local initCell={11,12,13,14,21,22,23,24}
rem(initCell,rnd(5,8))
rem(initCell,rnd(1,4))
rem(initCell,P:RND(5,8))
rem(initCell,P:RND(1,4))
for _=1,6 do
_=rem(initCell,rnd(#initCell))
_=rem(initCell,P:RND(#initCell))
F[math.floor(_/10)][3+_%10]=20
end
end

View File

@@ -9,7 +9,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"then
if P.control then
local D=P.modeData
D.counter=D.counter+1
local t=math.max(240-2*D.wave,40)

View File

@@ -9,7 +9,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"then
if P.control then
local D=P.modeData
D.counter=D.counter+1
local t=math.max(360-D.wave*2,60)

View File

@@ -7,7 +7,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"then
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(90,180-D.wave)then

View File

@@ -6,7 +6,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"then
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(30,80-.3*D.wave)then

View File

@@ -7,7 +7,7 @@ return{
for _=1,3 do P:getNext(7)end
while true do
YIELD()
if not P.nextQueue[1] then
if not P.nextQueue[1]then
local height=FREEROW.get(0)
local max=#P.field
if max>0 then

View File

@@ -40,7 +40,7 @@ local function score(P)
end
return{
color=COLOR.lGrey,
color=COLOR.lGray,
env={
noTele=true,
das=5,arr=1,

View File

@@ -85,7 +85,7 @@ return{
p=41
end
elseif T==62 then--Stage 5: survive without easy-fresh rule
P.life=1
P.life=P.life+1
ENV.lock=13
ENV.wait=5
ENV.fall=5
@@ -113,7 +113,7 @@ return{
P.modeData.target=226
SFX.play("reach")
elseif T==226 then--Stage 8: final invisible
P.life=P.life+2
P.life=P.life+1
ENV.bone=false
P:setInvisible(90)

View File

@@ -6,7 +6,6 @@ return{
pushSpeed=5,
garbageSpeed=2,
noMod=true,
bg="space",
bgm={"race","push","secret8th","secret7th","waterfall","oxygen","shining terminal","storm","rockblock","magicblock","cruelty"},
},
load=function()

View File

@@ -19,7 +19,7 @@ return{
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or(a[1]==b[1] and a[2]<b[2])end,
comp=function(a,b)return a[1]<b[1]or(a[1]==b[1]and a[2]<b[2])end,
getRank=function(P)
if P.stat.row<40 then return end
local T=P.stat.time

View File

@@ -18,7 +18,7 @@ return{
end,
score=function(P)return{P.stat.time,P.stat.piece}end,
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
comp=function(a,b)return a[1]<b[1]or(a[1]==b[1] and a[2]<b[2])end,
comp=function(a,b)return a[1]<b[1]or(a[1]==b[1]and a[2]<b[2])end,
getRank=function(P)
if P.stat.row<40 then return end
local T=P.stat.time

View File

@@ -1,5 +1,5 @@
return{
color=COLOR.lGrey,
color=COLOR.lGray,
env={
drop=60,lock=60,
dropPiece=function(P)if P.stat.row>=1000 then P:win("finish")end end, bg="rainbow",bgm="push",
@@ -22,10 +22,10 @@ return{
local T=P.stat.time
return
T<=750 and 5 or
T<=950 and 4 or
T<=1100 and 3 or
T<=1260 and 2 or
T<=1600 and 1 or
T<=900 and 4 or
T<=1260 and 3 or
T<=1620 and 2 or
T<=2000 and 1 or
0
end,
}

View File

@@ -23,9 +23,9 @@ return{
return
T<=70 and 5 or
T<=90 and 4 or
T<=120 and 3 or
T<=150 and 2 or
T<=200 and 1 or
T<=126 and 3 or
T<=162 and 2 or
T<=226 and 1 or
0
end,
}

View File

@@ -23,9 +23,9 @@ return{
return
T<=300 and 5 or
T<=380 and 4 or
T<=440 and 3 or
T<=500 and 2 or
T<=640 and 1 or
T<=500 and 3 or
T<=626 and 2 or
T<=800 and 1 or
0
end,
}

View File

@@ -23,7 +23,7 @@ return{
local T=P.stat.time
return
T<=26 and 5 or
T<=32.6 and 4 or
T<=36 and 4 or
T<=52.6 and 3 or
T<=92.9 and 2 or
T<=183 and 1 or

View File

@@ -6,7 +6,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"then
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(60,150-2*D.wave)and P.atkBuffer.sum<4 then

View File

@@ -6,7 +6,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"then
if P.control then
local D=P.modeData
D.timer=D.timer+1
local B=P.atkBuffer

View File

@@ -6,7 +6,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"then
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(60,150-D.wave)and P.atkBuffer.sum<20 then

View File

@@ -6,7 +6,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"then
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(90,180-2*D.wave)and P.atkBuffer.sum<8 then

View File

@@ -8,7 +8,7 @@ return{
task=function(P)
while true do
YIELD()
if P.control and SCN.cur=="play"then
if P.control then
local D=P.modeData
D.timer=D.timer+1
if D.timer>=math.max(300,600-10*D.wave)and P.atkBuffer.sum<20 then

View File

@@ -6,7 +6,7 @@ return{
arr=0,
drop=1e99,lock=60,
freshLimit=15,
function(P)if P.stat.atk>=200 then P:win("finish")end end,
function(P)if P.stat.atk>=100 then P:win("finish")end end,
fineKill=true,
bg="flink",bgm="infinite",
},

View File

@@ -7,13 +7,13 @@ local function tech_check_hard(P)
return
end
end
if P.stat.atk>=200 then
if P.stat.atk>=100 then
P:win("finish")
end
end
return{
color=COLOR.grey,
color=COLOR.gray,
env={
arr=0,
drop=1e99,lock=60,

View File

@@ -6,7 +6,7 @@ return{
drop=20,lock=60,
freshLimit=15,
b2bKill=true,
function(P)if P.stat.atk>=200 then P:win("finish")end end,
function(P)if P.stat.atk>=100 then P:win("finish")end end,
bg="matrix",bgm="down",
},
load=function()

View File

@@ -7,7 +7,7 @@ local function tech_check_hard(P)
return
end
end
if P.stat.atk>=200 then
if P.stat.atk>=100 then
P:win("finish")
end
end

View File

@@ -6,7 +6,7 @@ return{
drop=0,lock=60,
freshLimit=15,
b2bKill=true,
function(P)if P.stat.atk>=200 then P:win("finish")end end,
function(P)if P.stat.atk>=100 then P:win("finish")end end,
bg="matrix",bgm="warped",
},
load=function()

View File

@@ -7,7 +7,7 @@ local function tech_check_hard(P)
return
end
end
if P.stat.atk>=200 then
if P.stat.atk>=100 then
P:win("finish")
end
end

View File

@@ -6,7 +6,7 @@ return{
infHold=true,
drop=1e99,lock=1e99,
b2bKill=true,
function(P)if P.stat.atk>=200 then P:win("finish")end end,
function(P)if P.stat.atk>=100 then P:win("finish")end end,
bg="matrix",bgm="new era",
},
load=function()

View File

@@ -7,7 +7,7 @@ local function tech_check_hard(P)
return
end
end
if P.stat.atk>=200 then
if P.stat.atk>=100 then
P:win("finish")
end
end

View File

@@ -1,7 +1,7 @@
local gc=love.graphics
local warnTime={60,90,105,115,116,117,118,119,120}
return{
color=COLOR.lGrey,
color=COLOR.lGray,
env={
noTele=true,
minarr=1,minsdarr=1,

View File

@@ -1,5 +1,5 @@
return{
color=COLOR.lGrey,
color=COLOR.lGray,
env={
drop=120,lock=120,
infHold=true,

View File

@@ -110,17 +110,12 @@ function NET.wsconn_stream()
end
--Disconnect
function NET.wsclose_user()
WS.close("user")
end
function NET.wsclose_play()
WS.close("play")
end
function NET.wsclose_stream()
WS.close("stream")
end
function NET.wsclose_app()WS.close("app")end
function NET.wsclose_user()WS.close("user")end
function NET.wsclose_play()WS.close("play")end
function NET.wsclose_stream()WS.close("stream")end
--Account
--Account & User
function NET.register(username,email,password)
if NET.lock("register")then
WS.send("app",JSON.encode{
@@ -141,34 +136,16 @@ function NET.getAccessToken()
WS.send("user",JSON.encode{action=0})
end
end
function NET.getUserInfo(id,ifDetail)
function NET.getUserInfo(uid)
local hash=not SETTING.dataSaving and USERS.getHash(uid)
WS.send("user",JSON.encode{
action=1,
data={
id=id or USER.uid,
detailed=ifDetail or false,
id=uid,
hash=hash,
},
})
end
function NET.storeUserInfo(d)
local user=USERS[d.uid]
if not user then
user={}
USERS[d.uid]=user
end
user.uid=d.uid
user.username=d.username
user.motto=d.motto
user.avatar=d.avatar
--Get own name
if d.uid==USER.uid then
USER.username=d.username
FILE.save(USER,"conf/user","q")
end
-- FILE.save(USERS,"conf/users")
end
--Room
function NET.fetchRoom()
@@ -323,7 +300,7 @@ function NET.updateWS_user()
LOG.print(text.accessSuccessed)
NET.wsconn_play()
elseif res.action==1 then--Get userInfo
NET.storeUserInfo(res.data)
USERS.updateUserData(res.data)
end
else
WS.alert("user")
@@ -490,9 +467,8 @@ function NET.updateWS_stream()
elseif res.action==3 then--Player leave
--?
elseif res.action==4 then--Player died
local uid=res.data.uid
for _,P in next,PLY_ALIVE do
if P.uid==uid then
if P.uid==d.uid then
P:lose(true)
break
end

View File

@@ -110,337 +110,337 @@ return{
{
name="八零哥",
font=25,
color=C.grey,
color=C.gray,
},
{
name="蕴空之灵",
font=25,
color=C.grey,
color=C.gray,
},
{
name="gggf127",
font=25,
color=C.grey,
color=C.gray,
},
{
name="solainu",
font=25,
color=C.grey,
color=C.gray,
},
{
name="ThTsOd",
font=25,
color=C.grey,
color=C.gray,
},
{
name="Fireboos",
font=25,
color=C.grey,
color=C.gray,
},
{
name="星月千雪",
font=25,
color=C.grey,
color=C.gray,
},
{
name="10元",
font=25,
color=C.grey,
color=C.gray,
},
{
name="立斐",
font=25,
color=C.grey,
color=C.gray,
},
{
name="Deep_Sea",
font=25,
color=C.grey,
color=C.gray,
},
{
name="时雪",
font=25,
color=C.grey,
color=C.gray,
},
{
name="yyangdid",
font=25,
color=C.grey,
color=C.gray,
},
{
name="sfqr",
font=25,
color=C.grey,
color=C.gray,
},
{
name="心痕",
font=25,
color=C.grey,
color=C.gray,
},
{
name="Sasoric",
font=25,
color=C.grey,
color=C.gray,
},
{
name="夏小亚",
font=25,
color=C.grey,
color=C.gray,
},
{
name="仁参",
font=25,
color=C.grey,
color=C.gray,
},
{
name="乐↗乐↘",
font=25,
color=C.grey,
color=C.gray,
},
{
name="喜欢c4w的ztcjoin",
font=25,
color=C.grey,
color=C.gray,
},
{
name="面包",
font=25,
color=C.grey,
color=C.gray,
},
{
name="蠢熏",
font=25,
color=C.grey,
color=C.gray,
},
{
name="潘一栗",
font=25,
color=C.grey,
color=C.gray,
},
{
name="Lied",
font=25,
color=C.grey,
color=C.gray,
},
{
name="星街书婉",
font=25,
color=C.grey,
color=C.gray,
},
{
name="祝西",
font=25,
color=C.grey,
color=C.gray,
},
{
name="829",
font=25,
color=C.grey,
color=C.gray,
},
{
name="e m*12",
font=25,
color=C.grey,
color=C.gray,
},
{
name="我永远爱白银诺艾尔(鹏",
font=25,
color=C.grey,
color=C.gray,
},
{
name="PCX",
font=25,
color=C.grey,
color=C.gray,
},
{
name="kagura77",
font=25,
color=C.grey,
color=C.gray,
},
{
name="呆喂",
font=25,
color=C.grey,
color=C.gray,
},
{
name="GlowingEmbers",
font=25,
color=C.grey,
color=C.gray,
},
{
name="轩辕辚",
font=25,
color=C.grey,
color=C.gray,
},
{
name="HimuroAki",
font=25,
color=C.grey,
color=C.gray,
},
{
name="TCV100",
font=25,
color=C.grey,
color=C.gray,
},
{
name="tech有养成系统了@6565",
name="tech有养成系统了@7065",
font=25,
color=C.grey,
color=C.gray,
},
{
name="HAGE KANOBU",
font=25,
color=C.grey,
color=C.gray,
},
{
name="闪电和拐棍",
font=25,
color=C.grey,
color=C.gray,
},
{
name="葡萄味的曼妥思",
font=25,
color=C.grey,
color=C.gray,
},
{
name="蓝绿",
font=25,
color=C.grey,
color=C.gray,
},
{
name="天生的魔法师",
font=25,
color=C.grey,
color=C.gray,
},
{
name="琳雨空",
font=25,
color=C.grey,
color=C.gray,
},
{
name="T8779.易缄",
font=25,
color=C.grey,
color=C.gray,
},
{
name="诗情画意",
font=25,
color=C.grey,
color=C.gray,
},
{
name="星姐阿夸双推Man暗炎",
font=25,
color=C.grey,
color=C.gray,
},
{
name="[*炎]",
font=25,
color=C.grey,
color=C.gray,
},
{
name="[*Y]",
font=25,
color=C.grey,
color=C.gray,
},
{
name="aaa222",
font=25,
color=C.grey,
color=C.gray,
},
{
name="[**城]",
font=25,
color=C.grey,
color=C.gray,
},
{
name="cnDD",
font=25,
color=C.grey,
color=C.gray,
},
{
name="红桃老给",
font=25,
color=C.grey,
color=C.gray,
},
{
name="昭庭玲秋",
font=25,
color=C.grey,
color=C.gray,
},
{
name="旋树墩",
font=25,
color=C.grey,
color=C.gray,
},
{
name="火花工作室",
font=25,
color=C.grey,
color=C.gray,
},
{
name="Cosine",
font=25,
color=C.grey,
color=C.gray,
},
{
name="沁音的芝麻王",
font=25,
color=C.grey,
color=C.gray,
},
{
name="SuperJH",
font=25,
color=C.grey,
color=C.gray,
},
{
name="天上_飞",
font=25,
color=C.grey,
color=C.gray,
},
{
name="uiro",
font=25,
color=C.grey,
color=C.gray,
},
{
name="宇酱",
font=25,
color=C.grey,
color=C.gray,
},
{
name="[W*N]",
font=25,
color=C.grey,
color=C.gray,
},
{
name="[Z*.]",
font=25,
color=C.grey,
color=C.gray,
},
{
name="[*之]",
font=25,
color=C.grey,
color=C.gray,
},
{
name="白衣",
font=25,
color=C.grey,
color=C.gray,
},
{
name="给虫",
font=25,
color=C.grey,
color=C.gray,
},
{
name="我永远喜欢樱花小姐",
font=25,
color=C.grey,
color=C.gray,
},
{
name="xb",
font=25,
color=C.grey,
color=C.gray,
},
{
name="flaribbit",
@@ -450,47 +450,47 @@ return{
{
name="工口发动机",
font=25,
color=C.grey,
color=C.gray,
},
{
name="金海星",
font=25,
color=C.grey,
color=C.gray,
},
{
name="tatianyi",
font=25,
color=C.grey,
color=C.gray,
},
{
name="[*瞳]",
font=25,
color=C.grey,
color=C.gray,
},
{
name="彼方云城",
font=25,
color=C.grey,
color=C.gray,
},
{
name="pm250",
font=25,
color=C.grey,
color=C.gray,
},
{
name="nanaya",
font=25,
color=C.grey,
color=C.gray,
},
{
name="黑红蓝白",
font=25,
color=C.grey,
color=C.gray,
},
{
name="细胞",
font=25,
color=C.grey,
color=C.gray,
},
{
name="流光梦",
@@ -500,16 +500,16 @@ return{
{
name="George2003",
font=25,
color=C.grey,
color=C.gray,
},
{
name="竹月可安",
font=25,
color=C.grey,
color=C.gray,
},
{
name="T7887库德里尔",
font=25,
color=C.grey,
color=C.gray,
},
}

View File

@@ -218,8 +218,8 @@ local function drawBoarders(P)
gc_rectangle("line",-16,-3,15,604)--B2b bar boarder
end
local attackColor={
{COLOR.dGrey,COLOR.white},
{COLOR.grey,COLOR.white},
{COLOR.dGray,COLOR.white},
{COLOR.gray,COLOR.white},
{COLOR.lPurple,COLOR.white},
{COLOR.lRed,COLOR.white},
{COLOR.dGreen,COLOR.cyan},
@@ -426,12 +426,12 @@ local function drawMission(P)
end
local function drawStartCounter(P)
gc_setColor(1,1,1)
if GAME.frame<180 then
if GAME.frame==0 then
if P.frameRun<180 then
if P.frameRun==0 then
setFont(70)
mStr(P.ready and text.beReady or text.notReady,305,220)
else
local count=179-GAME.frame
local count=179-P.frameRun
gc_push("transform")
gc_translate(305,220)
setFont(95)
@@ -459,7 +459,7 @@ function draw.drawNext_norm(P)
local bk,clr=P.nextQueue[N].bk,P.nextQueue[N].color
local k=#bk>2 and 2.2/#bk or 1
gc_scale(k)
for i=1,#bk do for j=1,#bk[1] do
for i=1,#bk do for j=1,#bk[1]do
if bk[i][j]then
gc_draw(texture[clr],30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))-- drawCell(i-#bk*.5,j-#bk[1]*.5,clr)
end
@@ -497,7 +497,7 @@ function draw.drawNext_hidden(P)
local bk,clr=P.nextQueue[N].bk,P.nextQueue[N].color
local k=#bk>2 and 2.2/#bk or 1
gc_scale(k)
for i=1,#bk do for j=1,#bk[1] do
for i=1,#bk do for j=1,#bk[1]do
if bk[i][j]then
gc_draw(texture[clr],30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))-- drawCell(i-#bk*.5,j-#bk[1]*.5,clr)
end
@@ -650,7 +650,7 @@ function draw.norm(P)
gc_setStencilTest("equal",1)
gc_setLineWidth(20)
for i=0,24 do
gc_setColor(COLOR.rainbow_grey(t*.626+i*.1))
gc_setColor(COLOR.rainbow_gray(t*.626+i*.1))
gc_line(20*i-190,-2,20*i+10,602)
end
gc_setStencilTest()
@@ -800,7 +800,7 @@ function draw.norm_remote(P)
gc_setStencilTest("equal",1)
gc_setLineWidth(20)
for i=0,24 do
gc_setColor(COLOR.rainbow_grey(t*.626+i*.1))
gc_setColor(COLOR.rainbow_gray(t*.626+i*.1))
gc_line(20*i-190,-2,20*i+10,602)
end
gc_setStencilTest()

View File

@@ -43,7 +43,7 @@ local function pressKey(P,keyID)
P.keyPressing[keyID]=true
P.actList[keyID](P)
if P.control then
ins(P.keyTime,1,GAME.frame)
ins(P.keyTime,1,P.frameRun)
P.keyTime[11]=nil
end
P.stat.key=P.stat.key+1
@@ -55,12 +55,12 @@ end
local function pressKey_Rec(P,keyID)
if P.keyAvailable[keyID]and P.alive then
local L=GAME.rep
ins(L,GAME.frame)
ins(L,P.frameRun)
ins(L,keyID)
P.keyPressing[keyID]=true
P.actList[keyID](P)
if P.control then
ins(P.keyTime,1,GAME.frame)
ins(P.keyTime,1,P.frameRun)
P.keyTime[11]=nil
end
P.stat.key=P.stat.key+1
@@ -68,7 +68,7 @@ local function pressKey_Rec(P,keyID)
end
local function releaseKey_Rec(P,keyID)
local L=GAME.rep
ins(L,GAME.frame)
ins(L,P.frameRun)
ins(L,32+keyID)
P.keyPressing[keyID]=false
end
@@ -97,22 +97,24 @@ local function newEmptyPlayer(id,mini)
P.x,P.y,P.size=0,0,1
P.frameColor=0
P.mini=mini--If draw in small mode
--Set these at Player:setPosition()
-- P.fieldX,P.fieldY=...
-- P.centerX,P.centerY=...
-- P.absFieldX,P.absFieldY=...
if P.mini then
--If draw in small mode
P.mini=mini
if mini then
P.canvas=love.graphics.newCanvas(60,120)
P.frameWait=rnd(30,120)
P.frameWait=rnd(26,62)
P.draw=PLY.draw.small
else
P.draw=PLY.draw.norm
end
P.randGen=love.math.newRandomGenerator(GAME.seed)
P.frameRun=GAME.frameStart
P.alive=true
P.control=false
P.timing=false
@@ -323,15 +325,14 @@ local function applyGameEnv(P)--Finish gameEnv processing
ENV.splashFX=false
ENV.shakeFX=false
ENV.text=false
else
if ENV.lockFX==0 then ENV.lockFX=false end
if ENV.dropFX==0 then ENV.dropFX=false end
if ENV.moveFX==0 then ENV.moveFX=false end
if ENV.clearFX==0 then ENV.clearFX=false end
if ENV.splashFX==0 then ENV.splashFX=false end
if ENV.shakeFX==0 then ENV.shakeFX=false end
if ENV.atkFX==0 then ENV.atkFX=false end
end
if ENV.lockFX==0 then ENV.lockFX=false end
if ENV.dropFX==0 then ENV.dropFX=false end
if ENV.moveFX==0 then ENV.moveFX=false end
if ENV.clearFX==0 then ENV.clearFX=false end
if ENV.splashFX==0 then ENV.splashFX=false end
if ENV.shakeFX==0 then ENV.shakeFX=false end
if ENV.atkFX==0 then ENV.atkFX=false end
if ENV.ghost==0 then ENV.ghost=false end
if ENV.center==0 then ENV.center=false end
end
@@ -354,6 +355,7 @@ function PLY.newDemoPlayer(id)
P.sound=true
P.demo=true
P.frameRun=180
P.draw=PLY.draw.demo
P.control=true
GAME.modeEnv=DemoEnv

View File

@@ -336,9 +336,10 @@ function Player:ifoverlap(bk,x,y)
end
end
function Player:attack(R,send,time,line,fromStream)
local atkFX=self.gameEnv.atkFX
if GAME.net then
if self.type=="human"then--Local player attack others
ins(GAME.rep,GAME.frame)
ins(GAME.rep,self.frameRun)
ins(GAME.rep,
R.sid+
send*0x100+
@@ -346,9 +347,12 @@ function Player:attack(R,send,time,line,fromStream)
line*0x100000000+
0x2000000000000
)
if atkFX then
self:createBeam(R,send,atkFX,self.cur.color)
end
end
if fromStream and R.type=="human"then--Local player receiving lines
ins(GAME.rep,GAME.frame)
ins(GAME.rep,R.frameRun)
ins(GAME.rep,
self.sid+
send*0x100+
@@ -360,6 +364,9 @@ function Player:attack(R,send,time,line,fromStream)
end
else
R:receive(self,send,time,line)
if atkFX then
self:createBeam(R,send,atkFX,self.cur.color)
end
end
end
function Player:receive(A,send,time,line)
@@ -589,7 +596,7 @@ function Player:spin(d,ifpre)
local ix,iy=self.curX+self.cur.sc[2]-isc[2],self.curY+self.cur.sc[1]-isc[1]
for test=1,#kickData do
local x,y=ix+kickData[test][1],iy+kickData[test][2]
if not self:ifoverlap(icb,x,y)and(self.freshTime>=0 or kickData[test][2]<0)then
if not self:ifoverlap(icb,x,y)and(self.freshTime>0 or kickData[test][2]<0)then
ix,iy=x,y
if self.gameEnv.moveFX and self.gameEnv.block then
self:createMoveFX()
@@ -602,7 +609,7 @@ function Player:spin(d,ifpre)
if not ifpre then
self:freshBlock("move")
end
if kickData[test][2]>0 and self.freshTime~=t and self.curY~=self.imgY then
if kickData[test][2]>0 and self.freshTime==t and self.curY~=self.imgY then
self.freshTime=self.freshTime-1
end
@@ -774,12 +781,12 @@ function Player:popNext(ifhold)--Pop nextQueue to hand
end
end
local _=self.keyPressing
local pressing=self.keyPressing
--IHS
if not ifhold and _[8]and self.gameEnv.ihs then
if not ifhold and pressing[8]and self.gameEnv.ihs and self.holdTime>0 then
self:hold(true)
_[8]=false
pressing[8]=false
else
self:resetBlock()
end
@@ -797,9 +804,9 @@ function Player:popNext(ifhold)--Pop nextQueue to hand
end
--IHdS
if _[6]and not ifhold then
if pressing[6]and not ifhold then
self.act_hardDrop(self)
_[6]=false
pressing[6]=false
end
else
self:hold()
@@ -953,9 +960,9 @@ do--Player.drop(self)--Place piece
function Player:drop()
local _
local CHN=VOC.getFreeChannel()
self.dropTime[11]=ins(self.dropTime,1,GAME.frame)--Update speed dial
self.dropTime[11]=ins(self.dropTime,1,self.frameRun)--Update speed dial
local ENV=self.gameEnv
local STAT=self.stat
local Stat=self.stat
local piece=self.lastPiece
local finish
@@ -974,7 +981,7 @@ do--Player.drop(self)--Place piece
--Tri-corner spin check
if self.spinLast then
if C.id<6 then
local x,y=CX+self.cur.sc[2],CY+self.cur.sc[1]
local x,y=CX+C.sc[2],CY+C.sc[1]
local c=0
if self:solid(x-1,y+1)then c=c+1 end
if self:solid(x+1,y+1)then c=c+1 end
@@ -1100,15 +1107,17 @@ do--Player.drop(self)--Place piece
end
end
--Cancel no-sense clearing FX
_=#self.clearingRow
while _>0 and self.clearingRow[_]>#self.field do
self.clearingRow[_]=nil
_=_-1
--Cancel top clearing FX
for i=#self.clearingRow,1,-1 do
if self.clearingRow[i]>#self.field then
rem(self.clearingRow)
else
break
end
end
if self.clearingRow[1]then
self.falling=ENV.fall
elseif cc>=#C.bk then
else
clear=true
end
@@ -1117,16 +1126,16 @@ do--Player.drop(self)--Place piece
if not finesse then
if dospin then self.ctrlCount=self.ctrlCount-2 end--Allow 2 more step for roof-less spin
local id=C.id
local d=self.ctrlCount-finesseList[id][self.cur.dir+1][CX]
local d=self.ctrlCount-finesseList[id][C.dir+1][CX]
finePts=d<=0 and 5 or max(3-d,0)
else
finePts=5
end
piece.finePts=finePts
STAT.finesseRate=STAT.finesseRate+finePts
Stat.finesseRate=Stat.finesseRate+finePts
if finePts<5 then
STAT.extraPiece=STAT.extraPiece+1
Stat.extraPiece=Stat.extraPiece+1
if ENV.fineKill then
finish=true
end
@@ -1164,7 +1173,7 @@ do--Player.drop(self)--Place piece
atk=b2bATK[cc]+cc*.5
exblock=exblock+1
cscore=cscore*2
STAT.b3b=STAT.b3b+1
Stat.b3b=Stat.b3b+1
if self.sound then
VOC.play("b3b",CHN)
end
@@ -1172,7 +1181,7 @@ do--Player.drop(self)--Place piece
self:showText(text.b2b..text.block[C.name]..text.spin.." "..text.clear[cc],0,-30,35,"spin")
atk=b2bATK[cc]
cscore=cscore*1.2
STAT.b2b=STAT.b2b+1
Stat.b2b=Stat.b2b+1
if self.sound then
VOC.play("b2b",CHN)
end
@@ -1207,7 +1216,7 @@ do--Player.drop(self)--Place piece
sendTime=100
exblock=exblock+1
cscore=cscore*1.8
STAT.b3b=STAT.b3b+1
Stat.b3b=Stat.b3b+1
if self.sound then
VOC.play("b3b",CHN)
end
@@ -1216,7 +1225,7 @@ do--Player.drop(self)--Place piece
sendTime=80
atk=3*cc-7
cscore=cscore*1.3
STAT.b2b=STAT.b2b+1
Stat.b2b=Stat.b2b+1
if self.sound then
VOC.play("b2b",CHN)
end
@@ -1258,37 +1267,40 @@ do--Player.drop(self)--Place piece
end
--PC/HPC
if clear and #self.field==0 then
self:showText(text.PC,0,-80,50,"flicker")
atk=max(atk,min(8+STAT.pc*2,16))
exblock=exblock+2
sendTime=sendTime+120
if STAT.row+cc>4 then
self.b2b=1000
cscore=cscore+300*min(6+STAT.pc,10)
else
if clear then
if #self.field==0 then
self:showText(text.PC,0,-80,50,"flicker")
atk=max(atk,min(8+Stat.pc*2,16))
exblock=exblock+2
sendTime=sendTime+120
if Stat.row+cc>4 then
self.b2b=self.b2b+800
cscore=cscore+300*min(6+Stat.pc,10)
else
cscore=cscore+626
end
Stat.pc=Stat.pc+1
if self.sound then
SFX.play("clear")
VOC.play("perfect_clear",CHN)
end
piece.pc=true
piece.special=true
elseif cc>=#C.bk and(cc>1 or #self.field==self.garbageBeneath)then
self:showText(text.HPC,0,-80,50,"fly")
atk=atk+4
exblock=exblock+2
sendTime=sendTime+60
self.b2b=self.b2b+100
cscore=cscore+626
Stat.hpc=Stat.hpc+1
if self.sound then
SFX.play("clear")
VOC.play("half_clear",CHN)
end
piece.hpc=true
piece.special=true
end
STAT.pc=STAT.pc+1
if self.sound then
SFX.play("clear")
VOC.play("perfect_clear",CHN)
end
piece.pc=true
piece.special=true
elseif clear and(cc>1 or #self.field==self.garbageBeneath)then
self:showText(text.HPC,0,-80,50,"fly")
atk=atk+2
exblock=exblock+2
sendTime=sendTime+60
cscore=cscore+626
STAT.hpc=STAT.hpc+1
if self.sound then
SFX.play("clear")
VOC.play("half_clear",CHN)
end
piece.hpc=true
piece.special=true
end
if self.b2b>1000 then self.b2b=1000 end
@@ -1323,9 +1335,6 @@ do--Player.drop(self)--Place piece
if M>0 then
for i=1,M do
self:attack(self.atker[i],send,sendTime,generateLine(self:RND(10)))
if ENV.atkFX then
self:createBeam(self.atker[i],send,ENV.atkFX,C.color)
end
end
else
T=randomTarget(self)
@@ -1339,9 +1348,6 @@ do--Player.drop(self)--Place piece
end
if T then
self:attack(T,send,sendTime,generateLine(self:RND(10)))
if ENV.atkFX then
self:createBeam(T,send,ENV.atkFX,C.color)
end
end
end
if self.sound and send>3 then SFX.play("emit",min(send,7)*.1)end
@@ -1386,13 +1392,18 @@ do--Player.drop(self)--Place piece
end
--Speed bonus
if self.dropSpeed>60 then
cscore=cscore*(.9+self.dropSpeed/600)
end
if self.dropSpeed>60 then cscore=cscore*(.9+self.dropSpeed/600)end
cscore=int(cscore)
if ENV.score then
self:showText(cscore,(self.curX+self.cur.sc[2]-5.5)*30,(10-self.curY-self.cur.sc[1])*30+self.fieldBeneath+self.fieldUp,40-600/(cscore+20),"score",2)
self:showText(
cscore,
(self.curX+C.sc[2]-5.5)*30,
(10-self.curY-C.sc[1])*30+self.fieldBeneath+self.fieldUp,
40-600/(cscore+20),
"score",
2
)
end
piece.row,piece.dig=cc,gbcc
@@ -1436,33 +1447,33 @@ do--Player.drop(self)--Place piece
end
--Update stat
STAT.score=STAT.score+cscore
STAT.piece=STAT.piece+1
STAT.row=STAT.row+cc
STAT.maxFinesseCombo=max(STAT.maxFinesseCombo,self.finesseCombo)
STAT.maxCombo=max(STAT.maxCombo,self.combo)
Stat.score=Stat.score+cscore
Stat.piece=Stat.piece+1
Stat.row=Stat.row+cc
Stat.maxFinesseCombo=max(Stat.maxFinesseCombo,self.finesseCombo)
Stat.maxCombo=max(Stat.maxCombo,self.combo)
if atk>0 then
STAT.atk=STAT.atk+atk
Stat.atk=Stat.atk+atk
if send>0 then
STAT.send=STAT.send+int(send)
Stat.send=Stat.send+int(send)
end
if off>0 then
STAT.off=STAT.off+off
Stat.off=Stat.off+off
end
end
if gbcc>0 then
STAT.dig=STAT.dig+gbcc
Stat.dig=Stat.dig+gbcc
if atk>0 then
STAT.digatk=STAT.digatk+atk*gbcc/cc
Stat.digatk=Stat.digatk+atk*gbcc/cc
end
end
local n=C.name
if dospin then
_=STAT.spin[n] _[cc+1]=_[cc+1]+1--Spin[1~25][0~4]
_=STAT.spins _[cc+1]=_[cc+1]+1--Spin[0~4]
_=Stat.spin[n] _[cc+1]=_[cc+1]+1--Spin[1~25][0~4]
_=Stat.spins _[cc+1]=_[cc+1]+1--Spin[0~4]
elseif cc>0 then
_=STAT.clear[n] _[cc]=_[cc]+1--Clear[1~25][1~5]
_=STAT.clears _[cc]=_[cc]+1--Clear[1~5]
_=Stat.clear[n] _[cc]=_[cc]+1--Clear[1~25][1~5]
_=Stat.clears _[cc]=_[cc]+1--Clear[1~5]
end
if finish then
@@ -1598,7 +1609,7 @@ function tick_autoPause()
while true do
yield()
time=time+1
if SCN.cur~="play"or GAME.frame<180 then
if SCN.cur~="game"or PLAYERS[1].frameRun<180 then
return
elseif time==120 then
pauseGame()
@@ -1686,7 +1697,7 @@ function Player:die()--Called both when win/lose!
end
if GAME.net then
if self.id==1 then
ins(GAME.rep,GAME.frame)
ins(GAME.rep,self.frameRun)
ins(GAME.rep,0)
else
if self.lastRecv and self.lastRecv.id==1 then

View File

@@ -114,8 +114,29 @@ local update={
}
function update.alive(P,dt)
local ENV=P.gameEnv
local S=P.stat
P.frameRun=P.frameRun+1
if P.frameRun<=180 then
if P.frameRun==180 then
if P.id==1 then SFX.play("start")end
P.control=true
P.timing=true
P:popNext()
elseif P.frameRun==60 or P.frameRun==120 then
if P.id==1 then SFX.play("ready")end
end
if P.movDir~=0 then
if P.moving<P.gameEnv.das then
P.moving=P.moving+1
end
else
P.moving=0
end
return true
end
if P.timing then
local S=P.stat
S.time=S.time+dt
S.frame=S.frame+1
end
@@ -123,10 +144,10 @@ function update.alive(P,dt)
--Calculate key speed
do
local v=0
for i=2,10 do v=v+i*(i-1)*72/(GAME.frame-P.keyTime[i]+1)end
for i=2,10 do v=v+i*(i-1)*72/(P.frameRun-P.keyTime[i]+1)end
P.keySpeed=P.keySpeed*.99+v*.01
v=0
for i=2,10 do v=v+i*(i-1)*72/(GAME.frame-P.dropTime[i])end
for i=2,10 do v=v+i*(i-1)*72/(P.frameRun-P.dropTime[i])end
P.dropSpeed=P.dropSpeed*.99+v*.01
end
@@ -372,17 +393,17 @@ function update.dead(P,dt)
updateTasks(P)
end
function update.remote_alive(P,dt)
local frmStep=GAME.frame-P.stat.frame
local frmDelta=PLAYERS[1].frameRun-P.frameRun
for _=1,
frmStep<20 and 1 or
frmStep<45 and rnd(2)or
frmStep<90 and 2 or
frmStep<180 and rnd(2,3) or
frmDelta<20 and 1 or
frmDelta<45 and rnd(2)or
frmDelta<90 and 2 or
frmDelta<180 and rnd(2,3) or
3
do
local eventTime=P.stream[P.streamProgress]
if eventTime then--Normal state, event forward
if P.stat.frame==eventTime then--Event time, execute action, read next so don't update immediately
if P.frameRun==eventTime then--Event time, execute action, read next so don't update immediately
local event=P.stream[P.streamProgress+1]
if event==0 then--Just wait
elseif event<=32 then--Press key

View File

@@ -223,7 +223,7 @@ local frontColor={
COLOR.white,COLOR.white,COLOR.white,COLOR.white,
COLOR.white,COLOR.white,COLOR.white,COLOR.white,
COLOR.white,COLOR.white,COLOR.white,COLOR.white,
},--Grey
},--Gray
{
COLOR.white,COLOR.white,COLOR.white,COLOR.white,
COLOR.white,COLOR.white,COLOR.white,COLOR.white,
@@ -251,11 +251,11 @@ local backColor={
COLOR.dGreen,COLOR.dYellow,COLOR.dPurple,COLOR.dPurple,
},--Colored(row)
{
COLOR.dGrey,COLOR.dGrey,COLOR.dGrey,COLOR.dGrey,
COLOR.dGrey,COLOR.dGrey,COLOR.dGrey,COLOR.dGrey,
COLOR.dGrey,COLOR.dGrey,COLOR.dGrey,COLOR.dGrey,
COLOR.dGrey,COLOR.dGrey,COLOR.dGrey,COLOR.dGrey,
},--Grey
COLOR.dGray,COLOR.dGray,COLOR.dGray,COLOR.dGray,
COLOR.dGray,COLOR.dGray,COLOR.dGray,COLOR.dGray,
COLOR.dGray,COLOR.dGray,COLOR.dGray,COLOR.dGray,
COLOR.dGray,COLOR.dGray,COLOR.dGray,COLOR.dGray,
},--Gray
{
COLOR.black,COLOR.black,COLOR.black,COLOR.black,
COLOR.black,COLOR.black,COLOR.black,COLOR.black,

View File

@@ -370,7 +370,7 @@ function scene.draw()
"Y"
)or(
repeater.seq[i]==repeater.last[i]and
"grey"or
"gray"or
"white"
)
])
@@ -414,7 +414,7 @@ function scene.draw()
mStr(tileName[N],320+(x-.5)*160,40+(y-.5)*160-fontSize*.7)
end
else
setColor(COLOR.grey)
setColor(COLOR.gray)
rectangle("fill",x*160+163,y*160-117,154,154,15)
end
else
@@ -489,8 +489,8 @@ scene.widgetList={
WIDGET.newKey{name="left", x=55,y=560,w=100,fText="",font=50,color="yellow",code=pressKey"left",hide=function()return tapControl end},
WIDGET.newKey{name="right", x=255,y=560,w=100,fText="",font=50,color="yellow",code=pressKey"right",hide=function()return tapControl end},
WIDGET.newKey{name="skip", x=155,y=400,w=100,font=20,color="yellow",code=pressKey"space",hide=function()return state~=1 or not skipper.cd or skipper.cd>0 end},
WIDGET.newKey{name="record1", x=1100,y=390,w=220,h=50,fText="",color="grey",code=pressKey"1",hide=function()return state==2 end},
WIDGET.newKey{name="record2", x=1100,y=450,w=220,h=50,fText="",color="grey",code=pressKey"2",hide=function()return state==2 end},
WIDGET.newKey{name="record1", x=1100,y=390,w=220,h=50,fText="",color="gray",code=pressKey"1",hide=function()return state==2 end},
WIDGET.newKey{name="record2", x=1100,y=450,w=220,h=50,fText="",color="gray",code=pressKey"2",hide=function()return state==2 end},
WIDGET.newKey{name="replay1", x=1245,y=390,w=50,fText="!",color="green",code=pressKey"c1",hide=function()return state==2 or #repeater.seq[1]==0 end},
WIDGET.newKey{name="replay2", x=1245,y=450,w=50,fText="!",color="green",code=pressKey"c2",hide=function()return state==2 or #repeater.seq[2]==0 end},
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=40,code=backScene},

View File

@@ -82,16 +82,16 @@ end
local scoreColor={
"white",--0
"water",--20
"aqua",--20
"sky",--40
"blue",--60
"grape",--80
"pink",--100
"red","fire","orange","yellow","lWater",--200
"red","fire","orange","yellow","lAqua",--200
"lSky","lBlue","lGrape","lPink","lRed",--300
"lFire","lOrange","lYellow","dWater","dSky",--400
"lFire","lOrange","lYellow","dAqua","dSky",--400
"dBlue","dGrape","dPink","dRed","dFire",--500
"dYellow","lGrey","grey","dGrey",--before 600, black after
"dYellow","lGray","gray","dGray",--before 600, black after
}
function scene.draw()
--Spawn area

View File

@@ -6,7 +6,7 @@ local C=COLOR
local inputBox=WIDGET.newInputBox{name="input",x=40,y=650,w=1200,h=50}
local outputBox=WIDGET.newTextBox{name="output",x=40,y=30,w=1200,h=600,font=25,lineH=25,fix=true}
local function log(str)outputBox:push(str)end
log{C.lGrape,"Techmino Shell"}
log{C.lGrape,"Techmino Console"}
log{C.lBlue,"©2020 26F Studio some rights reserved"}
log{C.dRed,"DO NOT RUN ANY CODE YOU DON'T UNDERSTAND"}
@@ -275,7 +275,7 @@ do--commands.help(arg)
log{C.lPink,"Page ",C.lG,page,C.lPink," of ",C.lG,maxPage}
for i=pageSize*(page-1)+1,math.min(pageSize*page,#command_help_list)do
local cmd=command_help_list[i]
log{C.W,cmd,C.grey," "..command_help_messages[cmd].description}
log{C.W,cmd,C.gray," "..command_help_messages[cmd].description}
end
else
log{C.R,"Invalid page number. Must be between 1 and "..maxPage.." (inclusive)."}
@@ -306,7 +306,7 @@ function commands.print(name)
log{C.R,"No file called '"..name.."'"}
end
else
log{C.water,"Usage: print [filename]"}
log{C.aqua,"Usage: print [filename]"}
end
end
function commands.url(url)
@@ -316,7 +316,7 @@ function commands.url(url)
log{C.R,"[ERR] ",C.W,err}
end
else
log{C.water,"Usage: url [url]"}
log{C.aqua,"Usage: url [url]"}
end
end
local function tree(path,name,depth)
@@ -368,7 +368,7 @@ function commands.del(name)
log{C.R,"No file called '"..name.."'"}
end
else
log{C.water,"Usage: del [filename]"}
log{C.aqua,"Usage: del [filename]"}
end
end
commands.exit=backScene
@@ -384,7 +384,7 @@ function commands.fn(n)
return
end
end
log{C.water,"Usage: fn [1~12]"}
log{C.aqua,"Usage: fn [1~12]"}
end
function commands.scrinfo()
for _,v in next,SCR.info()do
@@ -396,7 +396,7 @@ function commands.wireframe(bool)
gc.setWireframe(bool=="true")
log("Wireframe: "..(gc.isWireframe()and"on"or"off"))
else
log{C.water,"Usage: wireframe [true|false]"}
log{C.aqua,"Usage: wireframe [true|false]"}
end
end
function commands.gammacorrect(bool)
@@ -404,7 +404,7 @@ function commands.gammacorrect(bool)
love._setGammaCorrect(bool=="true")
log("GammaCorrect: "..(gc.isGammaCorrect()and"on"or"off"))
else
log{C.water,"Usage: gammacorrect [true|false]"}
log{C.aqua,"Usage: gammacorrect [true|false]"}
end
end
function commands.rmwtm(pw)
@@ -413,7 +413,7 @@ function commands.rmwtm(pw)
log{C.lC,"\87\97\116\101\114\109\97\114\107\32\82\101\109\111\118\101\100"}
SFX.play("clear")
else
log{C.water,"Usage: rmwtm [password]"}
log{C.aqua,"Usage: rmwtm [password]"}
end
end
function commands.unlockall(bool)
@@ -437,7 +437,7 @@ function commands.play(m)--marathon_bfmax can only entered through here
elseif m~=""then
log{C.R,"No mode called "..m}
else
log{C.water,"Usage: play [modeName]"}
log{C.aqua,"Usage: play [modeName]"}
end
end
function commands.playbgm(bgm)
@@ -452,7 +452,7 @@ function commands.playbgm(bgm)
log("Already playing: "..bgm)
end
else
log{C.water,"Usage: playbgm [bgmName]"}
log{C.aqua,"Usage: playbgm [bgmName]"}
end
end
function commands.stopbgm()
@@ -470,7 +470,7 @@ function commands.setbg(name)
log("Background already set to '"..name.."'")
end
else
log{C.water,"Usage: setbg [bgName]"}
log{C.aqua,"Usage: setbg [bgName]"}
end
end
function commands.theme(name)
@@ -481,7 +481,7 @@ function commands.theme(name)
log("No theme called "..name)
end
else
log{C.water,"Usage: theme [themeName]"}
log{C.aqua,"Usage: theme [themeName]"}
end
end
function commands.demo()
@@ -519,11 +519,11 @@ do--commands.applet(name)
return
end
end
log{C.water,"No this applet"}
log{C.aqua,"No this applet"}
else
log{C.water,"Usage:"}
log{C.water,"applet -list"}
log{C.water,"applet [appName]"}
log{C.aqua,"Usage:"}
log{C.aqua,"applet -list"}
log{C.aqua,"applet [appName]"}
end
end
commands.app=commands.applet
@@ -689,7 +689,7 @@ function scene.keyDown(k)
log(">Commands start with '"..str.."' :")
table.sort(res)
for i=1,#res do
log{COLOR.lGrey,res[i]}
log{COLOR.lGray,res[i]}
end
elseif #res==1 then
inputBox.value=res[1]

View File

@@ -188,7 +188,7 @@ function scene.draw()
gc.setColor(COLOR.rainbow_light(TIME()*2.6))
mStr("DROPPER",640,120)
gc.setColor(COLOR.rainbow_grey(TIME()*1.626))
gc.setColor(COLOR.rainbow_gray(TIME()*1.626))
setFont(55)
mStr("Score - "..score,640,290)
mStr("High Score - "..highScore,640,370)

View File

@@ -12,25 +12,23 @@ local targets={
[620]=true,
[1000]=true,
[2600]=true,
[5000]=true,
[10000]=true,
[26000]=true,
}
local state,progress
local startTime,time
local keyTime
local speed,maxSpeed
local arcade,rollSpeed
local tileColor={
COLOR.black,
COLOR.dRed,
COLOR.dG,
COLOR.dB,
COLOR.dY,
COLOR.dSky,
COLOR.dPurple,
{.0,.0,.0},
{.3,.0,.0},
{.0,.3,.0},
{.0,.0,.3},
{.3,.3,.0},
{.0,.1,.3},
{.2,.0,.3},
}
local modeName={
"Normal",
@@ -96,8 +94,9 @@ local function reset()
progress={}
state,time=0,0
score=0
rollSpeed=6.26
pos={rnd(4)}for _=1,5 do newTile()end
pos={rnd(4)}for _=1,6 do newTile()end
height=0
diePos=false
end
@@ -106,8 +105,9 @@ local scene={}
function scene.sceneInit()
mode=1
arcade=true
reset()
BG.set("grey")
BG.set("gray")
BGM.play("way")
love.keyboard.setKeyRepeat(false)
end
@@ -131,9 +131,9 @@ local function touch(n)
ins(keyTime,1,TIME())
keyTime[21]=nil
score=score+1
if targets[score]then
if not arcade and targets[score]then
ins(progress,format("%s - %.3fs",score,TIME()-startTime))
if score==26000 then
if score==2600 then
for i=1,#pos do
pos[i]=626
end
@@ -158,13 +158,15 @@ function scene.keyDown(key)
if key=="r"then reset()
elseif key=="escape"then SCN.back()
elseif state~=2 then
if key=="d"or key=="c"then touch(1)
elseif key=="f"or key=="v"then touch(2)
elseif key=="j"or key=="n"then touch(3)
elseif key=="k"or key=="m"then touch(4)
if key=="d"or key=="c"then touch(1)
elseif key=="f"or key=="v"then touch(2)
elseif key=="j"or key=="n"then touch(3)
elseif key=="k"or key=="m"then touch(4)
elseif(key=="q"or key=="tab")and state==0 then
mode=mode%#modeName+1
reset()
elseif key=="w"and state==0 then
arcade=not arcade
end
end
end
@@ -181,62 +183,80 @@ end
function scene.update()
if state==1 then
time=TIME()-startTime
local t=TIME()
time=t-startTime
local v=0
for i=2,20 do v=v+i*(i-1)*.3/(t-keyTime[i])end
speed=speed*.99+v*.01
if speed>maxSpeed then maxSpeed=speed end
if arcade then
height=height-rollSpeed
rollSpeed=rollSpeed+.00355
if height<-120 then
state=2
SFX.play("clear_2")
end
else
height=height*.6
end
end
height=height*.6
end
function scene.draw()
--Draw mode
gc.setColor(1,1,1)
setFont(50)
mStr(modeName[mode],155,300)
mStr(modeName[mode],155,380)
--Draw speed
setFont(45)
gc.setColor(1,.6,.6)
mStr(format("%.2f",maxSpeed/60),155,400)
gc.setColor(1,1,1)
mStr(format("%.2f",speed/60),155,460)
if arcade then
--Draw rolling speed
mStr(format("%.2f/s",rollSpeed/2),155,490)
else
--Draw speed
setFont(45)
gc.setColor(1,.6,.6)
mStr(format("%.2f",maxSpeed/60),155,460)
gc.setColor(1,1,1)
mStr(format("%.2f",speed/60),155,520)
--Draw time
setFont(45)
gc.print(format("%.3f",time),1030,70)
--Progress time list
setFont(30)
gc.setColor(.6,.6,.6)
for i=1,#progress do
gc.print(progress[i],1030,120+25*i)
end
--Progress time list
setFont(30)
gc.setColor(.6,.6,.6)
for i=1,#progress do
gc.print(progress[i],1030,120+25*i)
--Draw time
gc.setColor(1,1,1)
setFont(45)
gc.print(format("%.3f",time),1030,70)
end
--Draw tiles
gc.setColor(1,1,1)
gc.rectangle("fill",300,0,680,720)
gc.setColor(tileColor[mode])
for i=1,#pos do
if pos[i]<10 then
gc.rectangle("fill",130+170*pos[i]+8,720-i*120-height+8,170-16,120-16)
else
gc.rectangle("fill",130+170*(pos[i]%10)+8,720-i*120-height+8,170-16,120-16)
gc.rectangle("fill",130+170*int(pos[i]/10)+8,720-i*120-height+8,170-16,120-16)
gc.push("transform")
gc.translate(0,720-height+8)
for i=1,#pos do
if pos[i]<10 then
gc.rectangle("fill",130+170*pos[i]+8,-i*120,170-16,120-16)
else
gc.rectangle("fill",130+170*(pos[i]%10)+8,-i*120,170-16,120-16)
gc.rectangle("fill",130+170*int(pos[i]/10)+8,-i*120,170-16,120-16)
end
end
end
gc.pop()
--Draw track line
gc.setColor(0,0,0)
gc.setLineWidth(4)
gc.setLineWidth(2)
for x=1,5 do
x=130+170*x
gc.line(x,0,x,720)
end
for y=0,6 do
y=720-120*y-height
y=720-120*y-height%120
gc.line(300,y,980,y)
end
@@ -259,6 +279,7 @@ end
scene.widgetList={
WIDGET.newButton{name="reset", x=155,y=100,w=180,h=100,color="lGreen",font=40,code=pressKey"r"},
WIDGET.newButton{name="mode", x=155,y=220,w=180,h=100,font=40,code=pressKey"q",hide=function()return state~=0 end},
WIDGET.newSwitch{name="arcade", x=230,y=330,font=40,disp=function()return arcade end,code=pressKey"w",hide=function()return state~=0 end},
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=40,code=backScene},
}

View File

@@ -13,7 +13,7 @@ function scene.sceneInit()
lastKey=nil
speed=0
keyTime={}for i=1,40 do keyTime[i]=-1e99 end
BG.set("grey")
BG.set("gray")
BGM.play("push")
love.keyboard.setKeyRepeat(false)
end

View File

@@ -269,7 +269,7 @@ function scene.draw()
local N=board[i][j]
if N>0 then
if hide and N>maxNew then
setColor(COLOR.dGrey)
setColor(COLOR.dGray)
rectangle("fill",320+j*128-128,40+i*128-128,128,128)
setColor(1,1,1,.3)
mStr("?",j*128+256,i*128-75)

View File

@@ -144,9 +144,9 @@ end
scene.widgetList={
WIDGET.newText{name="title", x=520, y=5,font=70,align="R"},
WIDGET.newText{name="subTitle", x=530, y=50,font=35,align="L",color="grey"},
WIDGET.newText{name="defSeq", x=330, y=550,align="L",color="grey",hide=function()return BAG[1]end},
WIDGET.newText{name="noMsn", x=610, y=550,align="L",color="grey",hide=function()return MISSION[1]end},
WIDGET.newText{name="subTitle", x=530, y=50,font=35,align="L",color="gray"},
WIDGET.newText{name="defSeq", x=330, y=550,align="L",color="gray",hide=function()return BAG[1]end},
WIDGET.newText{name="noMsn", x=610, y=550,align="L",color="gray",hide=function()return MISSION[1]end},
--Basic
WIDGET.newSelector{name="drop", x=170, y=150,w=220,color="orange", list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},disp=CUSval("drop"),code=CUSsto("drop")},
@@ -167,7 +167,7 @@ scene.widgetList={
--More
WIDGET.newKey{name="advance", x=730, y=190,w=220,h=90,color="red", font=35,code=goScene"custom_advance"},
WIDGET.newKey{name="mod", x=730, y=310,w=220,h=90,color="white", font=35,code=goScene"mod"},
WIDGET.newKey{name="field", x=170, y=640,w=240,h=80,color="water", font=25,code=goScene"custom_field"},
WIDGET.newKey{name="field", x=170, y=640,w=240,h=80,color="aqua", font=25,code=goScene"custom_field"},
WIDGET.newKey{name="sequence", x=450, y=640,w=240,h=80,color="pink", font=25,code=goScene"custom_sequence"},
WIDGET.newKey{name="mission", x=730, y=640,w=240,h=80,color="sky", font=25,code=goScene"custom_mission"},

View File

@@ -11,7 +11,7 @@ local scene={}
scene.widgetList={
WIDGET.newText{name="title", x=520,y=5,font=70,align="R"},
WIDGET.newText{name="subTitle", x=530,y=50,font=35,align="L",color="grey"},
WIDGET.newText{name="subTitle", x=530,y=50,font=35,align="L",color="gray"},
--Control
WIDGET.newSlider{name="nextCount", x=200, y=150, w=200,unit=6,disp=CUSval("nextCount"),code=CUSsto("nextCount")},

View File

@@ -424,16 +424,16 @@ end
local function setPen(i)return function()penType=i end end
scene.widgetList={
WIDGET.newText{name="title", x=1020,y=5,font=70,align="R"},
WIDGET.newText{name="subTitle", x=1030,y=50,font=35,align="L",color="grey"},
WIDGET.newText{name="subTitle", x=1030,y=50,font=35,align="L",color="gray"},
WIDGET.newButton{name="b1", x=580, y=130,w=75,fText="",color=COLOR.red, code=setPen(1)},--B1
WIDGET.newButton{name="b2", x=660, y=130,w=75,fText="",color=COLOR.fire, code=setPen(2)},--B2
WIDGET.newButton{name="b3", x=740, y=130,w=75,fText="",color=COLOR.orange, code=setPen(3)},--B3
WIDGET.newButton{name="b4", x=820, y=130,w=75,fText="",color=COLOR.yellow, code=setPen(4)},--B4
WIDGET.newButton{name="b5", x=900, y=130,w=75,fText="",color=COLOR.lame, code=setPen(5)},--B5
WIDGET.newButton{name="b5", x=900, y=130,w=75,fText="",color=COLOR.lime, code=setPen(5)},--B5
WIDGET.newButton{name="b6", x=980, y=130,w=75,fText="",color=COLOR.grass, code=setPen(6)},--B6
WIDGET.newButton{name="b7", x=1060, y=130,w=75,fText="",color=COLOR.green, code=setPen(7)},--B7
WIDGET.newButton{name="b8", x=1140, y=130,w=75,fText="",color=COLOR.water, code=setPen(8)},--B8
WIDGET.newButton{name="b8", x=1140, y=130,w=75,fText="",color=COLOR.aqua, code=setPen(8)},--B8
WIDGET.newButton{name="b9", x=580, y=210,w=75,fText="",color=COLOR.cyan, code=setPen(9)},--B9
WIDGET.newButton{name="b10", x=660, y=210,w=75,fText="",color=COLOR.sky, code=setPen(10)},--B10
@@ -444,17 +444,17 @@ scene.widgetList={
WIDGET.newButton{name="b15", x=1060, y=210,w=75,fText="",color=COLOR.magenta,code=setPen(15)},--B15
WIDGET.newButton{name="b16", x=1140, y=210,w=75,fText="",color=COLOR.pink, code=setPen(16)},--B16
WIDGET.newButton{name="b17", x=580, y=290,w=75,fText="[ ]",color="dGrey", code=setPen(17)},--BONE
WIDGET.newButton{name="b17", x=580, y=290,w=75,fText="[ ]",color="dGray", code=setPen(17)},--BONE
WIDGET.newButton{name="b18", x=660, y=290,w=75,fText="N", color="black", code=setPen(18)},--HIDE
WIDGET.newButton{name="b19", x=740, y=290,w=75,fText="B", color="lYellow",code=setPen(19)},--BOMB
WIDGET.newButton{name="b20", x=820, y=290,w=75,fText="_", color="grey", code=setPen(20)},--GB1
WIDGET.newButton{name="b21", x=900, y=290,w=75,fText="_", color="lGrey", code=setPen(21)},--GB2
WIDGET.newButton{name="b20", x=820, y=290,w=75,fText="_", color="gray", code=setPen(20)},--GB1
WIDGET.newButton{name="b21", x=900, y=290,w=75,fText="_", color="lGray", code=setPen(21)},--GB2
WIDGET.newButton{name="b22", x=980, y=290,w=75,fText="_", color="dPurple",code=setPen(22)},--GB3
WIDGET.newButton{name="b23", x=1060, y=290,w=75,fText="_", color="dRed", code=setPen(23)},--GB4
WIDGET.newButton{name="b24", x=1140, y=290,w=75,fText="_", color="dGreen", code=setPen(24)},--GB5
WIDGET.newButton{name="any", x=600, y=400,w=120,color="lGrey", font=40,code=setPen(0)},
WIDGET.newButton{name="space", x=730, y=400,w=120,color="grey", font=65,code=setPen(-1)},
WIDGET.newButton{name="any", x=600, y=400,w=120,color="lGray", font=40,code=setPen(0)},
WIDGET.newButton{name="space", x=730, y=400,w=120,color="gray", font=65,code=setPen(-1)},
WIDGET.newButton{name="smartPen", x=860, y=400,w=120,color="lGreen", font=30,code=setPen(-2)},
WIDGET.newButton{name="pushLine", x=990, y=400,w=120,h=120,color="lYellow",font=20,code=pressKey"k"},
WIDGET.newButton{name="delLine", x=1120, y=400,w=120,h=120,color="lYellow",font=20,code=pressKey"l"},

View File

@@ -160,7 +160,7 @@ function scene.draw()
elseif L[i]>4 then
gc.setColor(COLOR.rainbow(i+TIME()*6.26))
else
gc.setColor(COLOR.grey)
gc.setColor(COLOR.gray)
end
gc.print(missionEnum[L[i]],x,y-25)
x=x+56
@@ -185,7 +185,7 @@ end
scene.widgetList={
WIDGET.newText{name="title", x=520,y=5,font=70,align="R"},
WIDGET.newText{name="subTitle", x=530,y=50,font=35,align="L",color="grey"},
WIDGET.newText{name="subTitle", x=530,y=50,font=35,align="L",color="gray"},
WIDGET.newKey{name="_1", x=800, y=540, w=90, font=50,code=pressKey(01)},
WIDGET.newKey{name="_2", x=900, y=540, w=90, font=50,code=pressKey(02)},

View File

@@ -186,7 +186,7 @@ end
scene.widgetList={
WIDGET.newText{name="title", x=520,y=5,font=70,align="R"},
WIDGET.newText{name="subTitle",x=530,y=50,font=35,align="L",color="grey"},
WIDGET.newText{name="subTitle",x=530,y=50,font=35,align="L",color="gray"},
WIDGET.newSelector{name="sequence",
x=1080,y=60,w=200,color="yellow",
@@ -208,30 +208,30 @@ scene.widgetList={
WIDGET.newKey{name="backsp",x=920,y=460,w=80,color="lYellow",font=50,code=pressKey"backspace"},
WIDGET.newKey{name="reset", x=1000,y=460,w=80,color="lYellow",font=25,code=pressKey"delete"},
WIDGET.newKey{name="Z5", x=120,y=540,w=80,color="lGrey",font=50,code=pressKey(8)},
WIDGET.newKey{name="S5", x=200,y=540,w=80,color="lGrey",font=50,code=pressKey(9)},
WIDGET.newKey{name="P", x=280,y=540,w=80,color="lGrey",font=50,code=pressKey(10)},
WIDGET.newKey{name="Q", x=360,y=540,w=80,color="lGrey",font=50,code=pressKey(11)},
WIDGET.newKey{name="F", x=440,y=540,w=80,color="lGrey",font=50,code=pressKey(12)},
WIDGET.newKey{name="E", x=520,y=540,w=80,color="lGrey",font=50,code=pressKey(13)},
WIDGET.newKey{name="T5", x=600,y=540,w=80,color="lGrey",font=50,code=pressKey(14)},
WIDGET.newKey{name="U", x=680,y=540,w=80,color="lGrey",font=50,code=pressKey(15)},
WIDGET.newKey{name="V", x=760,y=540,w=80,color="lGrey",font=50,code=pressKey(16)},
WIDGET.newKey{name="I3", x=840,y=540,w=80,color="grey",font=50,code=pressKey(26)},
WIDGET.newKey{name="C", x=920,y=540,w=80,color="grey",font=50,code=pressKey(27)},
WIDGET.newKey{name="Z5", x=120,y=540,w=80,color="lGray",font=50,code=pressKey(8)},
WIDGET.newKey{name="S5", x=200,y=540,w=80,color="lGray",font=50,code=pressKey(9)},
WIDGET.newKey{name="P", x=280,y=540,w=80,color="lGray",font=50,code=pressKey(10)},
WIDGET.newKey{name="Q", x=360,y=540,w=80,color="lGray",font=50,code=pressKey(11)},
WIDGET.newKey{name="F", x=440,y=540,w=80,color="lGray",font=50,code=pressKey(12)},
WIDGET.newKey{name="E", x=520,y=540,w=80,color="lGray",font=50,code=pressKey(13)},
WIDGET.newKey{name="T5", x=600,y=540,w=80,color="lGray",font=50,code=pressKey(14)},
WIDGET.newKey{name="U", x=680,y=540,w=80,color="lGray",font=50,code=pressKey(15)},
WIDGET.newKey{name="V", x=760,y=540,w=80,color="lGray",font=50,code=pressKey(16)},
WIDGET.newKey{name="I3", x=840,y=540,w=80,color="gray",font=50,code=pressKey(26)},
WIDGET.newKey{name="C", x=920,y=540,w=80,color="gray",font=50,code=pressKey(27)},
WIDGET.newKey{name="rnd", x=1000,y=540,w=80,color="red",font=25,code=pressKey"="},
WIDGET.newKey{name="W", x=120,y=620,w=80,color="lGrey",font=50,code=pressKey(17)},
WIDGET.newKey{name="X", x=200,y=620,w=80,color="lGrey",font=50,code=pressKey(18)},
WIDGET.newKey{name="J5", x=280,y=620,w=80,color="lGrey",font=50,code=pressKey(19)},
WIDGET.newKey{name="L5", x=360,y=620,w=80,color="lGrey",font=50,code=pressKey(20)},
WIDGET.newKey{name="R", x=440,y=620,w=80,color="lGrey",font=50,code=pressKey(21)},
WIDGET.newKey{name="Y", x=520,y=620,w=80,color="lGrey",font=50,code=pressKey(22)},
WIDGET.newKey{name="N", x=600,y=620,w=80,color="lGrey",font=50,code=pressKey(23)},
WIDGET.newKey{name="H", x=680,y=620,w=80,color="lGrey",font=50,code=pressKey(24)},
WIDGET.newKey{name="I5", x=760,y=620,w=80,color="lGrey",font=50,code=pressKey(25)},
WIDGET.newKey{name="I2", x=840,y=620,w=80,color="dGrey",font=50,code=pressKey(28)},
WIDGET.newKey{name="O1", x=920,y=620,w=80,color="dGrey",font=50,code=pressKey(29)},
WIDGET.newKey{name="W", x=120,y=620,w=80,color="lGray",font=50,code=pressKey(17)},
WIDGET.newKey{name="X", x=200,y=620,w=80,color="lGray",font=50,code=pressKey(18)},
WIDGET.newKey{name="J5", x=280,y=620,w=80,color="lGray",font=50,code=pressKey(19)},
WIDGET.newKey{name="L5", x=360,y=620,w=80,color="lGray",font=50,code=pressKey(20)},
WIDGET.newKey{name="R", x=440,y=620,w=80,color="lGray",font=50,code=pressKey(21)},
WIDGET.newKey{name="Y", x=520,y=620,w=80,color="lGray",font=50,code=pressKey(22)},
WIDGET.newKey{name="N", x=600,y=620,w=80,color="lGray",font=50,code=pressKey(23)},
WIDGET.newKey{name="H", x=680,y=620,w=80,color="lGray",font=50,code=pressKey(24)},
WIDGET.newKey{name="I5", x=760,y=620,w=80,color="lGray",font=50,code=pressKey(25)},
WIDGET.newKey{name="I2", x=840,y=620,w=80,color="dGray",font=50,code=pressKey(28)},
WIDGET.newKey{name="O1", x=920,y=620,w=80,color="dGray",font=50,code=pressKey(29)},
WIDGET.newButton{name="copy", x=1140, y=460,w=170,h=80,color="lRed", font=40,code=pressKey"cC",hide=function()return #BAG==0 end},

View File

@@ -14,17 +14,17 @@ function scene.update(dt)
timer=timer-dt*.8
if timer<0 then
SFX.play("click")
SCN.swapTo("play","none")
SCN.swapTo("game","none")
end
end
function scene.draw()
--Game scene
if timer*1.26<1 then
SCN.scenes.play.draw()
SCN.scenes.game.draw()
end
--Grey screen cover
--Gray screen cover
gc.setColor(.15,.15,.15,timer*1.26)
gc.push("transform")
gc.origin()

View File

@@ -3,7 +3,7 @@ local gc=love.graphics
local inputBox=WIDGET.newInputBox{name="input",x=20,y=110,w=726,h=60,font=40}
local int,abs=math.floor,math.abs
local min,sin=math.min,math.sin
local ins,rem=table.insert,table.remove
local ins=table.insert
local find=string.find
local scene={}
@@ -19,22 +19,17 @@ local scrollPos--Scroll down length
local lastSearch--Last searched string
function scene.sceneInit()
dict=require("parts.language.dict_"..({"zh","zh","zh","en","en","en","en","en"})[SETTING.lang])
inputBox:clear()
result={}
url=dict[1][5]
waiting=0
selected=1
scrollPos=0
lastSearch=false
TASK.new(function()YIELD()WIDGET.sel=inputBox end)
BG.set("rainbow")
end
local typeColor={
help=COLOR.Y,
other=COLOR.lOrange,
game=COLOR.lC,
term=COLOR.lR,
setup=COLOR.lY,
pattern=COLOR.lGrass,
english=COLOR.B,
name=COLOR.lPurple,
}
local function getList()return result[1]and result or dict end
local function clearResult()
TABLE.clear(result)
selected,scrollPos=1,0
@@ -56,10 +51,26 @@ local function search()
if #result>0 then
SFX.play("reach")
end
url=(result[1]and result or dict)[selected][5]
url=getList()[selected][5]
lastSearch=input
end
function scene.sceneInit()
dict=require("parts.language.dict_"..({"zh","zh","zh","en","en","en","en","en"})[SETTING.lang])
inputBox:clear()
result={}
url=dict[1][5]
waiting=0
selected=1
scrollPos=0
lastSearch=false
TASK.new(function()YIELD()WIDGET.sel=inputBox end)
BG.set("rainbow")
end
function scene.wheelMoved(_,y)
WHEELMOV(y)
end
@@ -72,15 +83,15 @@ function scene.keyDown(key)
end
end
elseif key=="down"then
if selected and selected<#(result[1]and result or dict)then
if selected and selected<#getList()then
selected=selected+1
if selected>scrollPos+15 then
scrollPos=selected-15
end
end
elseif key=="pageup"then
elseif key=="left"or key=="pageup"then
for _=1,12 do scene.keyDown("up")end
elseif key=="pagedown"then
elseif key=="right"or key=="pagedown"then
for _=1,12 do scene.keyDown("down")end
elseif key=="link"then
love.system.openURL(url)
@@ -99,7 +110,7 @@ function scene.keyDown(key)
SCN.back()
end
end
url=(result[1]and result or dict)[selected][5]
url=getList()[selected][5]
end
function scene.update(dt)
@@ -122,18 +133,8 @@ function scene.update(dt)
end
end
local typeColor={
help=COLOR.yellow,
other=COLOR.lOrange,
game=COLOR.lCyan,
term=COLOR.lRed,
setup=COLOR.lYellow,
pattern=COLOR.lGrass,
english=COLOR.blue,
name=COLOR.lPurple,
}
function scene.draw()
local list=result[1]and result or dict
local list=getList()
gc.setColor(1,1,1)
local t=list[selected][4]
if #t>900 then
@@ -181,9 +182,11 @@ end
scene.widgetList={
WIDGET.newText{name="title", x=20, y=5,font=70,align="L"},
inputBox,
WIDGET.newKey{name="link", x=1140, y=650,w=200,h=80,font=35,code=pressKey"link",hide=function()return not url end},
WIDGET.newKey{name="up", x=1190, y=440,w=100,h=100,font=35,code=pressKey"up",hide=not MOBILE},
WIDGET.newKey{name="down", x=1190, y=550,w=100,h=100,font=35,code=pressKey"down",hide=not MOBILE},
WIDGET.newKey{name="link", x=1150, y=655,w=200,h=80,font=35,code=pressKey"link",hide=function()return not url end},
WIDGET.newKey{name="up", x=1130, y=460,w=60,h=90,font=35,code=pressKey"up",hide=not MOBILE},
WIDGET.newKey{name="down", x=1130, y=560,w=60,h=90,font=35,code=pressKey"down",hide=not MOBILE},
WIDGET.newKey{name="pageup", x=1210, y=460,w=80,h=90,font=35,code=pressKey"pageup",hide=not MOBILE},
WIDGET.newKey{name="pagedown", x=1210, y=560,w=80,h=90,font=35,code=pressKey"pagedown",hide=not MOBILE},
WIDGET.newButton{name="back", x=1165, y=60,w=170,h=80,font=40,code=backScene},
}

View File

@@ -12,6 +12,10 @@ function scene.sceneInit()
stateInfo=SYSTEM.."-"..VERSION.string.." scene:"..ERRDATA[#ERRDATA].scene
errorText=LOADED and text.errorMsg or"An error has occurred during loading.\nError info has been created, and you can send it to the author."
errorShot,errorInfo=ERRDATA[#ERRDATA].shot,ERRDATA[#ERRDATA].mes
NET.wsclose_app()
NET.wsclose_user()
NET.wsclose_play()
NET.wsclose_stream()
if SETTING then SFX.fplay("error",SETTING.voc*.8 or 0)end
end

View File

@@ -27,7 +27,7 @@ end
scene.mouseDown=NULL
local function restart()
resetGameData(GAME.frame<240 and"q")
resetGameData(PLAYERS[1].frameRun<240 and"q")
noKey=GAME.replaying
noTouch=noKey
end
@@ -133,7 +133,7 @@ function scene.update(dt)
_=GAME.replaying
local P1=PLAYERS[1]
local L=GAME.rep
while GAME.frame==L[_]do
while P1.frameRun==L[_]do
local key=L[_+1]
if key==0 then--Just wait
elseif key<=32 then--Press key
@@ -150,10 +150,6 @@ function scene.update(dt)
touchMoveLastFrame=false
updateVirtualkey()
GAME.frame=GAME.frame+1
--Counting, include pre-das
if checkStart()then return end
--Update players
for p=1,#PLAYERS do PLAYERS[p]:update(dt)end
@@ -162,7 +158,7 @@ function scene.update(dt)
checkWarning()
--Fresh royale target
if GAME.modeEnv.royaleMode and GAME.frame%120==0 then
if GAME.modeEnv.royaleMode and PLAYERS[1].frameRun%120==0 then
freshMostDangerous()
end
end

View File

@@ -75,50 +75,57 @@ local loadingThread=coroutine.wrap(function()
upFloor()
local modeIcons={}
modeIcons.marathon=DOGC{32,32,
{"move",3,1},
{"rect","fill",10,4,-2,23},
{"poly","fill",10,4,24,10,10,16.5},
{"rect","fill",4,24,10,3},
}YIELD()
modeIcons.tsd=DOGC{64,64,
{"rect","fill",7,7,16,16},
{"rect","fill",7,41,16,16},
{"rect","fill",41,41,16,16},
{"move",.5,.5},
{"poly","line",7,24,56,24,56,39,39,39,39,56,24,56,24,39,7,39},
{"trans",3,1},
{"fRect",10,4,-2,23},
{"fPoly",10,4,24,10,10,16.5},
{"fRect",4,24,10,3},
}YIELD()
modeIcons.infinite=DOGC{64,64,
{"wid",4},
{"circ","line",32,32,28},
{"line",32,32,32,14},
{"line",32,32,41,41},
{"move",.5,.5},
{"rect","fill",30,7,4,4},
{"rect","fill",7,30,4,4},
{"rect","fill",52,30,4,4},
{"rect","fill",30,52,4,4},
{"setLW",4},
{"dCirc",32,32,28},
{"dLine",32,32,32,14},
{"dLine",32,32,41,41},
{"trans",.5,.5},
{"fRect",30,7,4,4},
{"fRect",7,30,4,4},
{"fRect",52,30,4,4},
{"fRect",30,52,4,4},
}YIELD()
modeIcons.classic=DOGC{64,64,
{"setLW",6},
{"dRect",10,24,12,12},
{"dRect",26,24,12,12},
{"dRect",42,24,12,12},
{"dRect",26,40,12,12},
}YIELD()
modeIcons.tsd=DOGC{64,64,
{"fRect",7,7,16,16},
{"fRect",7,41,16,16},
{"fRect",41,41,16,16},
{"trans",.5,.5},
{"fPoly",7,24,56,24,56,39,39,39,39,56,24,56,24,39,7,39},
}YIELD()
modeIcons.t49=DOGC{64,64,
{"wid",2},
{"rect","line",05,05,10,20},{"rect","line",49,05,10,20},
{"rect","line",05,39,10,20},{"rect","line",49,39,10,20},
{"rect","line",20,10,23,43},
{"rgb",1,1,1,.7},
{"rect","fill",20,10,23,43},
{"setLW",2},
{"dRect",05,05,10,20},{"dRect",49,05,10,20},
{"dRect",05,39,10,20},{"dRect",49,39,10,20},
{"dRect",20,10,23,43},
{"setCL",1,1,1,.7},
{"fRect",20,10,23,43},
}YIELD()
modeIcons.t99=DOGC{64,64,
{"wid",2},
{"rect","line",02,02,6,12},{"rect","line",11,02,6,12},
{"rect","line",02,18,6,12},{"rect","line",11,18,6,12},
{"rect","line",02,34,6,12},{"rect","line",11,34,6,12},
{"rect","line",02,50,6,12},{"rect","line",11,50,6,12},
{"rect","line",47,02,6,12},{"rect","line",56,02,6,12},
{"rect","line",47,18,6,12},{"rect","line",56,18,6,12},
{"rect","line",47,34,6,12},{"rect","line",56,34,6,12},
{"rect","line",47,50,6,12},{"rect","line",56,50,6,12},
{"rect","line",20,10,23,43},
{"rgb",1,1,1,.7},
{"rect","fill",20,10,23,43},
{"setLW",2},
{"dRect",02,02,6,12},{"dRect",11,02,6,12},
{"dRect",02,18,6,12},{"dRect",11,18,6,12},
{"dRect",02,34,6,12},{"dRect",11,34,6,12},
{"dRect",02,50,6,12},{"dRect",11,50,6,12},
{"dRect",47,02,6,12},{"dRect",56,02,6,12},
{"dRect",47,18,6,12},{"dRect",56,18,6,12},
{"dRect",47,34,6,12},{"dRect",56,34,6,12},
{"dRect",47,50,6,12},{"dRect",56,50,6,12},
{"dRect",20,10,23,43},
{"setCL",1,1,1,.7},
{"fRect",20,10,23,43},
}YIELD()
upFloor()
@@ -356,7 +363,7 @@ function scene.draw()
setFont(25)
for i=0,26 do
local x,y=light[3*i+1],light[3*i+2]
gc.setColor(COLOR[i==progress and"grey"or light[3*i+3]and"dOrange"or"dGrey"])
gc.setColor(COLOR[i==progress and"gray"or light[3*i+3]and"dOrange"or"dGray"])
gc.circle("fill",x,y,23)
gc.setColor(.16,.16,.16)
gc.circle("line",x,y,23)

View File

@@ -37,7 +37,6 @@ function scene.sceneInit()
--Create demo player
destroyPlayers()
GAME.modeEnv=NONE
GAME.frame=0
GAME.seed=math.random(2e6)
PLY.newDemoPlayer(1)
PLAYERS[1]:setPosition(520,140,.8)
@@ -71,18 +70,21 @@ function scene.keyDown(key)
end
elseif key=="a"then
if testButton(3)then
if WS.status("user")=="running"then
if not NET.connected then
TEXT.show(text.noInternet,640,450,60,"flicker")
SFX.play("finesseError")
elseif not NET.allow_online then
if NET.connected then
if NET.allow_online then
if WS.status("user")=="running"then
NET.getAccessToken()
else
SCN.go("login")
end
else
TEXT.show(text.needUpdate,640,450,60,"flicker")
SFX.play("finesseError")
else
NET.getAccessToken()
end
else
SCN.go("login")
TEXT.show(text.noInternet,640,450,60,"flicker")
NET.wsconn_app()
SFX.play("finesseError")
end
end
elseif key=="z"then
@@ -127,7 +129,6 @@ function scene.keyDown(key)
end
function scene.update(dt)
GAME.frame=GAME.frame+1
PLAYERS[1]:update(dt)
scrollX=scrollX-2.6
if scrollX<-tip:getWidth()then
@@ -176,7 +177,7 @@ scene.widgetList={
WIDGET.newButton{name="custom", x=-1200,y=570,w=800,h=100, color="lSea", font=45,align="R",edge=30, code=pressKey"z"},
WIDGET.newButton{name="setting",x=2480,y=210,w=800,h=100, color="lOrange",font=40,align="L",edge=30, code=pressKey"-"},
WIDGET.newButton{name="stat", x=2480,y=330,w=800,h=100, color="lLame", font=40,align="L",edge=30, code=pressKey"p"},
WIDGET.newButton{name="stat", x=2480,y=330,w=800,h=100, color="lLime", font=40,align="L",edge=30, code=pressKey"p"},
WIDGET.newButton{name="dict", x=2480,y=450,w=800,h=100, color="lGreen", font=40,align="L",edge=30, code=pressKey"l"},
WIDGET.newButton{name="manual", x=2480,y=570,w=800,h=100, color="lC", font=40,align="L",edge=30, code=pressKey","},

View File

@@ -173,7 +173,7 @@ function scene.update()
end
local _=SCN.stat.tar
mapCam.zoomMethod=_=="play"and 1 or _=="mode"and 2
mapCam.zoomMethod=_=="game"and 1 or _=="mode"and 2
if mapCam.zoomMethod==1 then
_=mapCam.zoomK
if _<.8 then _=_*1.05 end

View File

@@ -199,15 +199,11 @@ function scene.update(dt)
if NET.checkPlayDisconn()then SCN.back()end
if not playing then return end
local _
local P1=PLAYERS[1]
local GAME=GAME
touchMoveLastFrame=false
updateVirtualkey()
GAME.frame=GAME.frame+1
--Counting, include pre-das
if checkStart()then return end
--Update players
for p=1,#PLAYERS do PLAYERS[p]:update(dt)end
@@ -216,16 +212,16 @@ function scene.update(dt)
checkWarning()
--Upload stream
if GAME.frame-lastUpstreamTime>8 then
if P1.frameRun-lastUpstreamTime>8 then
local stream
stream,upstreamProgress=dumpRecording(GAME.rep,upstreamProgress)
if #stream>0 then
NET.uploadRecStream(stream)
else
ins(GAME.rep,GAME.frame)
ins(GAME.rep,P1.frameRun)
ins(GAME.rep,0)
end
lastUpstreamTime=PLAYERS[1].alive and GAME.frame or 1e99
lastUpstreamTime=PLAYERS[1].alive and P1.frameRun or 1e99
end
end
@@ -271,19 +267,21 @@ function scene.draw()
end
scene.widgetList={
textBox,
WIDGET.newKey{name="ready",x=900,y=560,w=400,h=100,color="lB",font=40,code=pressKey"space",hide=function()
return
playing or
not textBox.hide or
PLY_NET[1].ready or
NET.getlock("ready")
WIDGET.newKey{name="ready",x=900,y=560,w=400,h=100,color="lB",font=40,code=pressKey"space",
hide=function()
return
playing or
not textBox.hide or
PLY_NET[1].ready or
NET.getlock("ready")
end},
WIDGET.newKey{name="cancel",x=900,y=560,w=400,h=100,color="grey",font=40,code=pressKey"space",hide=function()
return
playing or
not textBox.hide or
not PLY_NET[1].ready or
NET.getlock("ready")
WIDGET.newKey{name="cancel",x=900,y=560,w=400,h=100,color="gray",font=40,code=pressKey"space",
hide=function()
return
playing or
not textBox.hide or
not PLY_NET[1].ready or
NET.getlock("ready")
end},
WIDGET.newKey{name="hideChat",fText="...",x=380,y=35,w=60,font=35,code=pressKey"\\"},
WIDGET.newKey{name="quit",fText="X",x=900,y=35,w=60,font=40,code=pressKey"escape"},

View File

@@ -4,32 +4,32 @@ local scene={}
function scene.sceneInit()
lastLogoutTime=-1e99
BG.set("space")
BG.set()
end
function scene.sceneBack()
NET.wsclose_play()
end
scene.widgetList={
WIDGET.newButton{name="ffa", x=640, y=200,w=350,h=120,color="black",font=40,code=NULL},
WIDGET.newButton{name="rooms", x=640, y=360,w=350,h=120, font=40,code=goScene"net_rooms"},
WIDGET.newButton{name="ffa", x=640, y=200,w=350,h=120,font=40,code=function()NET.enterRoom("ffa")end},
WIDGET.newButton{name="rooms", x=640, y=360,w=350,h=120,font=40,code=goScene"net_rooms"},
WIDGET.newButton{name="chat", x=640, y=540,w=350,h=120,color="black",font=40,code=NULL},
WIDGET.newButton{name="logout", x=1140, y=70,w=180,h=70,color="dR",code=function()
if TIME()-lastLogoutTime<1 then
if USER.uid then
NET.wsclose_play()
NET.wsclose_user()
USER.username=false
USER.uid=false
USER.authToken=false
FILE.save(USER,"conf/user","q")
SCN.back()
WIDGET.newButton{name="logout", x=1140, y=70,w=180,h=70,color="dR",
code=function()
if TIME()-lastLogoutTime<1 then
if USER.uid then
NET.wsclose_play()
NET.wsclose_user()
USER.uid=false
USER.authToken=false
FILE.save(USER,"conf/user","q")
SCN.back()
end
else
LOG.print(text.sureQuit,COLOR.orange)
lastLogoutTime=TIME()
end
else
LOG.print(text.sureQuit,COLOR.orange)
lastLogoutTime=TIME()
end
end},
end},
WIDGET.newButton{name="back", x=1140, y=640,w=170,h=80, font=40,code=backScene},
}

View File

@@ -14,7 +14,7 @@ end
local scene={}
function scene.sceneInit()
BG.set("space")
BG.set()
scrollPos=0
selected=1
fetchRoom()
@@ -28,17 +28,16 @@ function scene.keyDown(k)
if fetchTimer<=3.26 then
fetchRoom()
end
elseif k=="n"then
if TIME()-lastCreateRoomTime>16.2 then
elseif k=="m"or k=="n"then
if TIME()-lastCreateRoomTime>6.26 then
NET.createRoom(
kb.isDown("1")and"solo"or
kb.isDown("2")and"classic"or
k=="m"and"classic"or
tonumber(USER.uid)<100 and(
kb.isDown("3")and"r49"or
kb.isDown("4")and"r99"or
kb.isDown("5")and"unlimited"
kb.isDown("q")and"r49"or
kb.isDown("w")and"r99"or
kb.isDown("e")and"unlimited"
)or"solo",
(USER.username or"???").."'s room"
(USERS.getUsername(USER.uid)or"???").."'s room"
)
lastCreateRoomTime=TIME()
else
@@ -87,7 +86,7 @@ end
function scene.draw()
--Fetching timer
gc.setColor(1,1,1,.26)
gc.arc("fill","pie",240,620,60,-1.5708,-1.5708-1.2566*fetchTimer)
gc.arc("fill","pie",130,620,60,-1.5708,-1.5708-1.2566*fetchTimer)
--Room list
gc.setColor(1,1,1)
@@ -105,7 +104,7 @@ function scene.draw()
end
if R.start then
gc.setColor(0,1,0)
gc.print("S",800,66+40*i)
gc.print(text.started,800,66+40*i)
end
gc.setColor(.9,.9,1)
gc.print(scrollPos+i,95,66+40*i)
@@ -122,11 +121,12 @@ local function hide_noRoom()return #NET.roomList==0 end
scene.widgetList={
WIDGET.newText{name="refreshing",x=640,y=255,font=45,hide=function()return not NET.getlock("fetchRoom")end},
WIDGET.newText{name="noRoom", x=640,y=260,font=40,hide=function()return #NET.roomList>0 or NET.getlock("fetchRoom")end},
WIDGET.newKey{name="refresh", x=240,y=620,w=140,h=140,font=35,code=fetchRoom, hide=function()return fetchTimer>3.26 end},
WIDGET.newKey{name="new", x=440,y=620,w=140,h=140,font=25,code=pressKey"n"},
WIDGET.newKey{name="join", x=640,y=620,w=140,h=140,font=40,code=pressKey"return", hide=hide_noRoom},
WIDGET.newKey{name="up", x=840,y=585,w=140,h=70,font=40,code=pressKey"up", hide=hide_noRoom},
WIDGET.newKey{name="down", x=840,y=655,w=140,h=70,font=40,code=pressKey"down", hide=hide_noRoom},
WIDGET.newKey{name="refresh", x=130,y=620,w=140,h=140,font=35,code=fetchRoom, hide=function()return fetchTimer>3.26 end},
WIDGET.newKey{name="new", x=330,y=620,w=140,h=140,font=20,code=pressKey"n"},
WIDGET.newKey{name="new2", x=530,y=620,w=140,h=140,font=20,code=pressKey"m"},
WIDGET.newKey{name="join", x=730,y=620,w=140,h=140,font=40,code=pressKey"return", hide=hide_noRoom},
WIDGET.newKey{name="up", x=930,y=585,w=140,h=70,font=40,code=pressKey"up", hide=hide_noRoom},
WIDGET.newKey{name="down", x=930,y=655,w=140,h=70,font=40,code=pressKey"down", hide=hide_noRoom},
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=40,code=backScene},
}

View File

@@ -6,7 +6,7 @@ local SCR,setFont,mStr=SCR,setFont,mStr
local fnsRankColor={
Z=COLOR.lYellow,
S=COLOR.lGrey,
S=COLOR.lGray,
A=COLOR.sky,
B=COLOR.lGreen,
C=COLOR.magenta,
@@ -34,11 +34,11 @@ function scene.sceneInit(org)
local P=PLAYERS[1]
local S=P.stat
timer=org=="play"and 0 or 50
timer=org=="game"and 0 or 50
local frameLostRate=(S.frame/S.time/60-1)*100
form={
{COLOR.white,TIMESTR(S.time),COLOR[frameLostRate>10 and"red"or frameLostRate>3 and"yellow"or"grey"],format(" (%.2f%%)",frameLostRate)},
{COLOR.white,TIMESTR(S.time),COLOR[frameLostRate>10 and"red"or frameLostRate>3 and"yellow"or"gray"],format(" (%.2f%%)",frameLostRate)},
format("%d/%d/%d",S.key,S.rotate,S.hold),
format("%d %.2fPPS",S.piece,S.piece/S.time),
format("%d(%d) %.2fLPM",S.row,S.dig,S.row/S.time*60),
@@ -113,14 +113,14 @@ function scene.sceneInit(org)
else
rank,trophy=nil
end
if org~="play"and GAME.prevBG then
if org~="game"and GAME.prevBG then
BG.set(GAME.prevBG)
end
end
function scene.sceneBack()
love.keyboard.setKeyRepeat(true)
STAT.todayTime=STAT.todayTime+PLAYERS[1].stat.time
if not GAME.replaying and(GAME.frame>400 or GAME.result)and not GAME.result then
if not GAME.replaying and(PLAYERS[1].frameRun>400 or GAME.result)and not GAME.result then
mergeStat(STAT,PLAYERS[1].stat)
FILE.save(STAT,"conf/data")
end
@@ -130,17 +130,17 @@ function scene.keyDown(key)
if key=="q"then
SCN.back()
elseif key=="escape"then
SCN.swapTo(GAME.result and"play"or"depause","none")
SCN.swapTo(GAME.result and"game"or"depause","none")
elseif key=="s"then
GAME.prevBG=BG.cur
SCN.go("setting_sound")
elseif key=="r"then
resetGameData()
SCN.swapTo("play","none")
SCN.swapTo("game","none")
elseif key=="p"then
if(GAME.result or GAME.replaying)and #PLAYERS==1 then
resetGameData("r")
SCN.swapTo("play","none")
SCN.swapTo("game","none")
end
elseif key=="o"then
if(GAME.result or GAME.replaying)and #PLAYERS==1 and not GAME.saved and saveRecording()then
@@ -166,7 +166,7 @@ local textPos={90,131,-90,131,-200,-25,-90,-181,90,-181,200,-25}
local dataPos={90,143,-90,143,-200,-13,-90,-169,90,-169,200,-13}
function scene.draw()
local T=timer*.02
if T<1 or GAME.result then SCN.scenes.play.draw()end
if T<1 or GAME.result then SCN.scenes.game.draw()end
--Dark BG
local _=T
@@ -194,7 +194,7 @@ function scene.draw()
gc.draw(drawableText.modeName,40,240)
--Infos
if GAME.frame>180 then
if PLAYERS[1].frameRun>180 then
gc.setLineWidth(2)
--Finesse rank & trophy
if rank then
@@ -264,7 +264,7 @@ function scene.draw()
end
--Radar Chart
if T>.5 and GAME.frame>180 then
if T>.5 and PLAYERS[1].frameRun>180 then
T=T*2-1
gc.setLineWidth(2)
gc.push("transform")

View File

@@ -34,53 +34,57 @@ scene.widgetList={
WIDGET.newButton{name="exportSetting", x=790,y=150,w=280,h=100,color="lGreen",font=25,code=function()dumpCB(SETTING)end},
WIDGET.newButton{name="exportVK", x=1090,y=150,w=280,h=100,color="lGreen",font=25,code=function()dumpCB(VK_org)end},
WIDGET.newButton{name="importUnlock", x=190,y=300,w=280,h=100,color="lBlue",font=25,code=function()
local D=parseCB()
if D then
TABLE.update(D,RANKS)
FILE.save(RANKS,"conf/unlock")
LOG.print(text.importSuccess,"message")
else
LOG.print(text.dataCorrupted,"warn")
end
end},
WIDGET.newButton{name="importData", x=490,y=300,w=280,h=100,color="lBlue",font=25,code=function()
local D=parseCB()
if D and D.version==STAT.version then
TABLE.update(D,STAT)
FILE.save(STAT,"conf/data")
LOG.print(text.importSuccess,"message")
else
LOG.print(text.dataCorrupted,"warn")
end
end},
WIDGET.newButton{name="importSetting", x=790,y=300,w=280,h=100,color="lBlue",font=25,code=function()
local D=parseCB()
if D then
TABLE.update(D,SETTING)
FILE.save(SETTING,"conf/settings")
LOG.print(text.importSuccess,"message")
else
LOG.print(text.dataCorrupted,"warn")
end
end},
WIDGET.newButton{name="importVK", x=1090,y=300,w=280,h=100,color="lBlue",font=25,code=function()
local D=parseCB()
if D then
TABLE.update(D,VK_org)
FILE.save(VK_org,"conf/virtualkey")
LOG.print(text.importSuccess,"message")
else
LOG.print(text.dataCorrupted,"warn")
end
end},
WIDGET.newButton{name="reset", x=640,y=460,w=280,h=100,color="lRed",font=40,code=function()
scene.widgetList.reset.hide=true
scene.widgetList.resetUnlock.hide=false
scene.widgetList.resetRecord.hide=false
scene.widgetList.resetData.hide=false
end},
WIDGET.newButton{name="importUnlock", x=190,y=300,w=280,h=100,color="lBlue",font=25,
code=function()
local D=parseCB()
if D then
TABLE.update(D,RANKS)
FILE.save(RANKS,"conf/unlock")
LOG.print(text.importSuccess,"message")
else
LOG.print(text.dataCorrupted,"warn")
end
end},
WIDGET.newButton{name="importData", x=490,y=300,w=280,h=100,color="lBlue",font=25,
code=function()
local D=parseCB()
if D and D.version==STAT.version then
TABLE.update(D,STAT)
FILE.save(STAT,"conf/data")
LOG.print(text.importSuccess,"message")
else
LOG.print(text.dataCorrupted,"warn")
end
end},
WIDGET.newButton{name="importSetting", x=790,y=300,w=280,h=100,color="lBlue",font=25,
code=function()
local D=parseCB()
if D then
TABLE.update(D,SETTING)
FILE.save(SETTING,"conf/settings")
LOG.print(text.importSuccess,"message")
else
LOG.print(text.dataCorrupted,"warn")
end
end},
WIDGET.newButton{name="importVK", x=1090,y=300,w=280,h=100,color="lBlue",font=25,
code=function()
local D=parseCB()
if D then
TABLE.update(D,VK_org)
FILE.save(VK_org,"conf/virtualkey")
LOG.print(text.importSuccess,"message")
else
LOG.print(text.dataCorrupted,"warn")
end
end},
WIDGET.newButton{name="reset", x=640,y=460,w=280,h=100,color="lRed",font=40,
code=function()
scene.widgetList.reset.hide=true
scene.widgetList.resetUnlock.hide=false
scene.widgetList.resetRecord.hide=false
scene.widgetList.resetData.hide=false
end},
WIDGET.newButton{name="resetUnlock", x=340,y=460,w=280,h=100,color="red",
code=function()
love.filesystem.remove("conf/unlock")
@@ -106,7 +110,6 @@ scene.widgetList={
LOG.print("effected after restart game","message")
LOG.print("play one game to get data back","message")
end,hide=true},
WIDGET.newButton{name="back", x=640,y=620,w=200,h=80,font=40,code=backScene},
}

View File

@@ -34,15 +34,16 @@ scene.widgetList={
WIDGET.newSwitch{name="swap", x=1060, y=370, font=20,disp=SETval("swap"), code=SETrev("swap")},
WIDGET.newSwitch{name="fine", x=1060, y=430, font=20,disp=SETval("fine"), code=function()SETTING.fine=not SETTING.fine if SETTING.fine then SFX.play("finesseError",.6) end end},
WIDGET.newSwitch{name="appLock", x=1060, y=490, font=20,disp=SETval("appLock"), code=SETrev("appLock")},
WIDGET.newSwitch{name="simpMode", x=1060, y=550, font=25,disp=SETval("simpMode"),code=function()
SETTING.simpMode=not SETTING.simpMode
for i=1,#SCN.stack,2 do
if SCN.stack[i]=="main"or SCN.stack[i]=="main_simple"then
SCN.stack[i]=SETTING.simpMode and"main_simple"or"main"
break
WIDGET.newSwitch{name="simpMode", x=1060, y=550, font=25,disp=SETval("simpMode"),
code=function()
SETTING.simpMode=not SETTING.simpMode
for i=1,#SCN.stack,2 do
if SCN.stack[i]=="main"or SCN.stack[i]=="main_simple"then
SCN.stack[i]=SETTING.simpMode and"main_simple"or"main"
break
end
end
end
end},
end},
WIDGET.newButton{name="back", x=1140, y=640, w=170,h=80, font=40,code=backScene},
}

View File

@@ -24,13 +24,13 @@ function scene.gamepadDown(key)
push("[gamepadDown] <"..key..">")
end
function scene.gamepadUp(key)
push{COLOR.grey,"[gamepadUp] <"..key..">"}
push{COLOR.gray,"[gamepadUp] <"..key..">"}
end
function scene.keyDown(key)
push("[keyDown] <"..key..">")
end
function scene.keyUp(key)
push{COLOR.grey,"[keyUp] <"..key..">"}
push{COLOR.gray,"[keyUp] <"..key..">"}
end
function scene.mouseDown(x,y,k)
push(("[mouseDown] <%d: %d, %d>"):format(k,x,y))
@@ -40,7 +40,7 @@ function scene.mouseMove(x,y)
end
function scene.mouseUp(x,y,k)
SYSFX.newRectRipple(1,x-10,y-10,21,21)
push{COLOR.grey,"[mouseUp] <"..k..">"}
push{COLOR.gray,"[mouseUp] <"..k..">"}
end
function scene.touchClick(x,y)
SYSFX.newRipple(.5,x,y,50)
@@ -55,7 +55,7 @@ function scene.touchMove(x,y)
end
function scene.touchUp(x,y)
SYSFX.newRipple(.5,x,y,50)
push{COLOR.grey,"[touchUp]"}
push{COLOR.gray,"[touchUp]"}
end
function scene.wheelMoved(dx,dy)
push(("[wheelMoved] <%d, %d>"):format(dx,dy))

View File

@@ -34,7 +34,6 @@ end
--Texture of puzzle mode
TEXTURE.puzzleMark={}
gc.setLineWidth(3)
for i=1,17 do
TEXTURE.puzzleMark[i]=NSC(30,30)
local _=minoColor[i]
@@ -47,15 +46,14 @@ for i=18,24 do
gc.setColor(minoColor[i])
gc.rectangle("line",7,7,16,16)
end
local _=NSC(30,30)
gc.setColor(1,1,1)
gc.line(5,5,25,25)
gc.line(5,25,25,5)
TEXTURE.puzzleMark[-1]=NSC(30,30)
gc.setColor(1,1,1,.8)
gc.draw(_)
_:release()
gc.setCanvas()
TEXTURE.puzzleMark[-1]=DOGC{30,30,
{"setCL",1,1,1,.8},
{"draw",DOGC{30,30,
{"setLW",3},
{"dLine",5,5,25,25},
{"dLine",5,25,25,5},
}}
}
--A simple pixel font
TEXTURE.pixelNum={}

View File

@@ -1,7 +1,7 @@
return SPLITSTR([=[
未来模式:
无尽PC挑战; 简单极简练习; 任务生存; 对称; 无摩擦; 连击练习; 拼方形
极简教程/考试; 大爆炸; 音游模式; 跑酷; 术语问答; 养成玩法
极简教程/考试; 大爆炸; 音游模式; 跑酷; 术语问答; 养成玩法; 收集向抽奖玩法
OSD; 强制Misdrop; 涂色模式(模仿喷喷, designed by teatube)
未来大游戏:
puyo; 花仙子方块; 2048; 泡泡龙
@@ -22,6 +22,39 @@ return SPLITSTR([=[
可选虚拟按键颜色; 工程编译到字节码; task-Z(新AI)
录像回放菜单; 跳帧开关; 教学关; 超60帧; 热更新
0.14.5: 晨 Morn
新增:
新增BGM:Empty(用于节日主题,by ERM)
音乐室显示音乐作者
新增开5人房的按钮
小程序dtw增加街机模式
改动:
微调TRS中PQT5J5L5的踢墙表
加强消四,增加b2b点数(100→150)
增强hpc攻击力(2→4)
修改pc和hpc对b2b点数的影响
调低竞速模式部分评价要求,科研模式通关条件改为100攻击(原200)
调整master-ph命数奖励
对战背景改为主题默认背景
修改硬降音效
词典修改部分词条,调整词条顺序(意见来自群友 库德里尔)
移除词典中两个不必要的个人词条
词典支持左右键翻页,添加触屏可用的翻页按钮
"命令行"改名控制台
代码:
file模块升级
新增users模块用来管理网络用户缓存信息
play场景改名game
重构GAME.frame相关内容
修复:
登录界面邮箱格式判定错误
调整主菜单点击联网游戏按钮代码的逻辑
没开ihs的时候提前hold会死
修复锁延刷新次数比显示(设置)的多一次
网络玩家倒计时阶段按键会让别人看到的录像播放不正确
c4w模式回放时初始地形会不一样
上踢无限悬空
0.14.4: 日出 Sunrise
新增:
添加触摸/点击特效开关

67
parts/users.lua Normal file
View File

@@ -0,0 +1,67 @@
local loadImage=love.graphics.newImage
local fs=love.filesystem
local texture_noImage=DOGC{32,32,
{"setCL",0,0,0},
{"fRect",0,0,32,32},
{"setCL",1,1,1},
{"setLW",3},
{"dLine",0,0,31,31},
{"dLine",0,31,31,0},
}
local function _getEmptyUser()
return{
username="[X]",
motto="Techmino haowan",
hash="",
new=false,
}
end
local db_img={}
local db=setmetatable({},{__index=function(self,k)
local file="cache/user"..k..".dat"
local d=fs.getInfo(file)and JSON.decode(fs.read(file))or _getEmptyUser()
rawset(self,k,d)
if type(d.hash)=="string"and #d.hash>0 and fs.getInfo(d.hash)then
db_img[k].avatar=loadImage(d.hash)
end
return d
end})
local USERS={}
function USERS.updateUserData(data)
local uid=data.uid
db[uid].username=data.username
db[uid].motto=data.motto
fs.write("cache/user"..uid..".dat",JSON.encode{
username=data.username,
motto=data.motto,
hash=data.hash,
})
if data.avatar then
fs.write("cache/"..data.hash,data.avatar:sub(data.avatar:find","+1))
db_img[uid].avatar=loadImage("cache/"..data.hash)
db[uid].hash=type(data.hash)=="string"and data.hash>0 and data.hash
db[uid].new=true
end
end
function USERS.getUsername(uid)return db[uid].username end
function USERS.getMotto(uid)return db[uid].motto end
function USERS.getHash(uid)return db[uid].hash end
function USERS.getAvatar(uid)
if db_img[uid]then
return db_img[uid]
else
if not db[uid].new then
NET.getUserInfo(uid)
db[uid].new=true
end
return texture_noImage
end
end
return USERS