Compare commits
19 Commits
pre0.17.0-
...
pre0.17.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bd90e051d4 | ||
|
|
26e66b313f | ||
|
|
c534bbd12a | ||
|
|
83b5e217e5 | ||
|
|
c0adf5bf0b | ||
|
|
4ff737a4ac | ||
|
|
5af0706c09 | ||
|
|
4ccee0f1de | ||
|
|
9b752d540e | ||
|
|
e860c7b7ec | ||
|
|
8a1fd9531f | ||
|
|
5fd6e0ee99 | ||
|
|
53b2b81fe0 | ||
|
|
6ccc811b46 | ||
|
|
962a61567a | ||
|
|
58f05e1cec | ||
|
|
6b426790c7 | ||
|
|
d4fc578673 | ||
|
|
51b567b8db |
@@ -1,5 +1,5 @@
|
||||
local abs=math.abs
|
||||
local function hsv(h,s,v,a)
|
||||
local function hsv(h,s,v,a)--Color type, Color amount, Light
|
||||
if s<=0 then return v,v,v,a end
|
||||
h=h*6
|
||||
local c=v*s
|
||||
@@ -28,7 +28,7 @@ local COLOR={
|
||||
navy= {hsv(0.56, 1.00, 1.00)},
|
||||
sea= {hsv(0.61, 1.00, 1.00)},
|
||||
blue= {hsv(0.64, 1.00, 0.95)},
|
||||
violet= {hsv(0.73, 1.00, 0.91)},
|
||||
violet= {hsv(0.74, 1.00, 0.91)},
|
||||
purple= {hsv(0.80, 1.00, 0.81)},
|
||||
magenta= {hsv(0.86, 1.00, 0.78)},
|
||||
wine= {hsv(0.92, 0.98, 0.91)},
|
||||
@@ -45,7 +45,7 @@ local COLOR={
|
||||
lNavy= {hsv(0.54, 0.80, 0.95)},
|
||||
lSea= {hsv(0.56, 0.72, 0.97)},
|
||||
lBlue= {hsv(0.64, 0.44, 0.96)},
|
||||
lViolet= {hsv(0.73, 0.47, 0.95)},
|
||||
lViolet= {hsv(0.72, 0.47, 0.95)},
|
||||
lPurple= {hsv(0.80, 0.62, 0.89)},
|
||||
lMagenta= {hsv(0.86, 0.61, 0.89)},
|
||||
lWine= {hsv(0.93, 0.57, 0.92)},
|
||||
@@ -72,12 +72,17 @@ local COLOR={
|
||||
gray= {hsv(0.02, 0.05, 0.65)},
|
||||
lGray= {hsv(0.02, 0.06, 0.86)},
|
||||
white= {hsv(0.01, 0.02, 0.99)},
|
||||
|
||||
xGray= {hsv(0.00, 0.00, 0.35,.8)},
|
||||
lxGray= {hsv(0.00, 0.00, 0.62,.8)},
|
||||
dxGray= {hsv(0.00, 0.00, 0.16,.8)},
|
||||
}
|
||||
for k,v in next,{
|
||||
R='red', F='fire', O='orange', Y='yellow', L='lime', J='jade', G='green', A='aqua', C='cyan', N='navy', S='sea', B='blue', V='violet', P='purple', M='magenta', W='wine',
|
||||
lR='lRed',lF='lFire',lO='lOrange',lY='lYellow',lL='lLime',lJ='lJade',lG='lGreen',lA='lAqua',lC='lCyan',lN='lNavy',lS='lSea',lB='lBlue',lV='lViolet',lP='lPurple',lM='lMagenta',lW='lWine',
|
||||
dR='dRed',dF='dFire',dO='dOrange',dY='dYellow',dL='dLime',dJ='dJade',dG='dGreen',dA='dAqua',dC='dCyan',dN='dNavy',dS='dSea',dB='dBlue',dV='dViolet',dP='dPurple',dM='dMagenta',dW='dWine',
|
||||
D='black',dH='dGray',H='gray',lH='lGray',Z='white',
|
||||
X='xGray',lX='lxGray',dX='dxGray',
|
||||
--Remain letter: EIKQTUX
|
||||
}do
|
||||
COLOR[k]=COLOR[v]
|
||||
|
||||
@@ -733,7 +733,7 @@ function love.run()
|
||||
end
|
||||
gc_replaceTransform(SCR.xOy_d)
|
||||
--Draw Version string
|
||||
gc_setColor(.8,.8,.8,.4)
|
||||
gc_setColor(.9,.9,.9,.42)
|
||||
FONT.set(20)
|
||||
mStr(VERSION.string,0,-30)
|
||||
gc_replaceTransform(SCR.xOy_dl)
|
||||
|
||||
@@ -148,9 +148,9 @@ function button:isAbove(x,y)
|
||||
local ATV=self.ATV
|
||||
return
|
||||
x>self.x-ATV and
|
||||
y>self.y-ATV and
|
||||
y>self.y and
|
||||
x<self.x+self.w+2*ATV and
|
||||
y<self.y+self.h+2*ATV
|
||||
y<self.y+self.h
|
||||
end
|
||||
function button:getCenter()
|
||||
return self.x+self.w*.5,self.y+self.h*.5
|
||||
@@ -171,17 +171,19 @@ function button:draw()
|
||||
|
||||
--Button
|
||||
gc_setColor(.15+r*.7,.15+g*.7,.15+b*.7,.9)
|
||||
gc_rectangle('fill',x-ATV,y-ATV,w+2*ATV,h+2*ATV,3)
|
||||
gc_rectangle('fill',x-ATV,y,w+2*ATV,h,4)
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(.3+r*.7,.3+g*.7,.3+b*.7)
|
||||
gc_rectangle('line',x-ATV,y,w+2*ATV,h,5)
|
||||
if ATV>0 then
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(.97,.97,.97,ATV*.125)
|
||||
gc_rectangle('line',x-ATV+2,y-ATV+2,w+2*ATV-4,h+2*ATV-4,3)
|
||||
gc_rectangle('line',x-ATV,y,w+2*ATV,h,3)
|
||||
end
|
||||
|
||||
--Drawable
|
||||
local obj=self.obj
|
||||
local ox,oy=obj:getWidth()*.5,obj:getHeight()*.5
|
||||
local y0=y+h*.5-ATV*.5
|
||||
local y0=y+h*.5
|
||||
gc_setColor(1,1,1,.2+ATV*.05)
|
||||
if self.align=='M'then
|
||||
local x0=x+w*.5
|
||||
@@ -219,9 +221,9 @@ function button:press(_,_,k)
|
||||
SYSFX.newRectRipple(
|
||||
6,
|
||||
self.x-ATV,
|
||||
self.y-ATV-WIDGET.scrollPos,
|
||||
self.y-WIDGET.scrollPos,
|
||||
self.w+2*ATV,
|
||||
self.h+2*ATV
|
||||
self.h
|
||||
)
|
||||
if self.sound then
|
||||
SFX.play('button')
|
||||
@@ -301,6 +303,10 @@ function key:draw()
|
||||
local align=self.align
|
||||
local r,g,b=c[1],c[2],c[3]
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Frame
|
||||
if not self.noFrame then
|
||||
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
|
||||
@@ -415,6 +421,10 @@ function switch:draw()
|
||||
local x,y=self.x,self.y
|
||||
local ATV=self.ATV
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y-25,50,50,4)
|
||||
|
||||
--Frame
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(1,1,1,.6+ATV*.1)
|
||||
@@ -700,6 +710,10 @@ function selector:draw()
|
||||
local w=self.w
|
||||
local ATV=self.ATV
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y,w,60,4)
|
||||
|
||||
--Frame
|
||||
gc_setColor(1,1,1,.6+ATV*.1)
|
||||
gc_setLineWidth(2)
|
||||
@@ -863,9 +877,15 @@ function inputBox:draw()
|
||||
local x,y,w,h=self.x,self.y,self.w,self.h
|
||||
local ATV=self.ATV
|
||||
|
||||
gc_setColor(1,1,1,ATV*.08)
|
||||
gc_rectangle('fill',x,y,w,h,3)
|
||||
--Background
|
||||
gc_setColor(0,0,0,.4)
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Highlight
|
||||
gc_setColor(1,1,1,ATV*.08*(math.sin(TIME()*4.2)*.2+.8))
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Frame
|
||||
gc_setColor(1,1,1)
|
||||
gc_setLineWidth(3)
|
||||
gc_rectangle('line',x,y,w,h,3)
|
||||
@@ -1023,8 +1043,8 @@ function textBox:draw()
|
||||
local lineH=self.lineH
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.4)
|
||||
gc_rectangle('fill',x,y,w,h,3)
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Frame
|
||||
gc_setLineWidth(2)
|
||||
@@ -1197,6 +1217,10 @@ function listBox:draw()
|
||||
gc_push('transform')
|
||||
gc_translate(x,y)
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.4)
|
||||
gc_rectangle('fill',0,0,w,h,4)
|
||||
|
||||
--Frame
|
||||
gc_setColor(WIDGET.sel==self and COLOR.lN or COLOR.Z)
|
||||
gc_setLineWidth(2)
|
||||
|
||||
3
main.lua
3
main.lua
@@ -24,6 +24,7 @@ VERSION=require"version"
|
||||
TIME=love.timer.getTime
|
||||
YIELD=coroutine.yield
|
||||
SYSTEM=love.system.getOS()
|
||||
if SYSTEM=='OS X'then SYSTEM='macOS'end
|
||||
FNSF=SYSTEM:find'\79\83'--What does FNSF stand for? IDK so don't ask me lol
|
||||
MOBILE=SYSTEM=='Android'or SYSTEM=='iOS'
|
||||
SAVEDIR=fs.getSaveDirectory()
|
||||
@@ -60,7 +61,7 @@ FONT.setFallback('norm')
|
||||
SCR.setSize(1280,720)--Initialize Screen size
|
||||
BGM.setMaxSources(5)
|
||||
BGM.setChange(function(name)MES.new('music',text.nowPlaying..name,5)end)
|
||||
VOC.setDiversion(1)
|
||||
VOC.setDiversion(.62)
|
||||
|
||||
table.insert(_LOADTIMELIST_,("Load Zframework: %.3fs"):format(TIME()-_LOADTIME_))
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 41 KiB |
18
parts/eventsets/bigWallGen.lua
Normal file
18
parts/eventsets/bigWallGen.lua
Normal file
@@ -0,0 +1,18 @@
|
||||
return{
|
||||
hook_drop=function(P)
|
||||
if P.lastPiece.row>0 then
|
||||
for _=1,#P.clearedRow do
|
||||
local h=#P.field
|
||||
P.field[h+1]=LINE.new(20)
|
||||
P.visTime[h+1]=LINE.new(20)
|
||||
for i=3,7 do P.field[h+1][i]=0 end
|
||||
end
|
||||
if P.combo>P.modeData.maxCombo then
|
||||
P.modeData.maxCombo=P.combo
|
||||
end
|
||||
if P.stat.row>=200 then
|
||||
P:win('finish')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
38
parts/eventsets/big_h.lua
Normal file
38
parts/eventsets/big_h.lua
Normal file
@@ -0,0 +1,38 @@
|
||||
return
|
||||
{
|
||||
drop=1,
|
||||
wait=8,
|
||||
fall=20,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
local F=P.field
|
||||
for i=1,24 do
|
||||
F[i]=LINE.new(20)
|
||||
P.visTime[i]=LINE.new(20)
|
||||
for x=3,7 do F[i][x]=0 end
|
||||
end
|
||||
P.modeData.target=50
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==50 then
|
||||
P.gameEnv.drop=.5
|
||||
P.modeData.target=100
|
||||
SFX.play('reach')
|
||||
elseif P.modeData.target==100 then
|
||||
P.gameEnv.drop=.25
|
||||
P.modeData.target=150
|
||||
SFX.play('reach')
|
||||
elseif P.modeData.target==150 then
|
||||
P:set20G(true)
|
||||
P.modeData.target=200
|
||||
SFX.play('reach')
|
||||
else
|
||||
P:win('finish')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
32
parts/eventsets/big_n.lua
Normal file
32
parts/eventsets/big_n.lua
Normal file
@@ -0,0 +1,32 @@
|
||||
local dropSpeed={100,80,60,48,36,28,20,16,12,10,8,6,4,2,2,1,1,.5,.5}
|
||||
|
||||
return
|
||||
{
|
||||
drop=120,
|
||||
wait=8,
|
||||
fall=20,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
end,
|
||||
task=function(P)
|
||||
local F=P.field
|
||||
for i=1,24 do
|
||||
F[i]=LINE.new(20)
|
||||
P.visTime[i]=LINE.new(20)
|
||||
for x=3,7 do F[i][x]=0 end
|
||||
end
|
||||
P.modeData.target=10
|
||||
end,
|
||||
hook_drop=function(P)
|
||||
if P.stat.row>=P.modeData.target then
|
||||
if P.modeData.target==200 then
|
||||
P:win('finish')
|
||||
else
|
||||
P.gameEnv.drop=dropSpeed[P.modeData.target/10]
|
||||
P.modeData.target=P.modeData.target+10
|
||||
SFX.play('reach')
|
||||
end
|
||||
end
|
||||
end
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
local dropSpeed={50,40,30,24,18,14,10,8,6,5,4,3,2,1,1,.5,.5,.25,.25}
|
||||
local dropSpeed={50,40,30,24,18,13,9,6,4,3,2,2,1,1,.5,.5,.5,.25,.25}
|
||||
|
||||
return
|
||||
{
|
||||
|
||||
Binary file not shown.
@@ -252,17 +252,17 @@ function royaleLevelup()
|
||||
BGM.play('cruelty')
|
||||
end
|
||||
elseif GAME.stage==4 then
|
||||
spd=10
|
||||
spd=8
|
||||
for _,P in next,PLY_ALIVE do
|
||||
P.gameEnv.pushSpeed=3
|
||||
end
|
||||
elseif GAME.stage==5 then
|
||||
spd=5
|
||||
spd=4
|
||||
for _,P in next,PLY_ALIVE do
|
||||
P.gameEnv.garbageSpeed=1
|
||||
end
|
||||
elseif GAME.stage==6 then
|
||||
spd=3
|
||||
spd=2
|
||||
if PLAYERS[1].alive then
|
||||
BGM.play('final')
|
||||
end
|
||||
@@ -273,7 +273,7 @@ function royaleLevelup()
|
||||
if GAME.curMode.name:find("_u")then
|
||||
for i=1,#PLY_ALIVE do
|
||||
local P=PLY_ALIVE[i]
|
||||
P.gameEnv.drop=int(P.gameEnv.drop*.3)
|
||||
P.gameEnv.drop=int(P.gameEnv.drop*.4)
|
||||
if P.gameEnv.drop==0 then
|
||||
P.curY=P.ghoY
|
||||
P:set20G(true)
|
||||
@@ -856,7 +856,7 @@ do--function drawSelfProfile()
|
||||
|
||||
--Draw avatar
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(.3,.3,.3,.8)gc_rectangle('fill',0,0,-300,80)
|
||||
gc_setColor(COLOR.X)gc_rectangle('fill',0,0,-300,80)
|
||||
gc_setColor(1,1,1)gc_rectangle('line',-300,0,300,80,5)
|
||||
gc_rectangle('line',-73,7,66,66,2)
|
||||
gc_draw(selfAvatar,-72,8,nil,.5)
|
||||
|
||||
@@ -788,6 +788,11 @@ return{
|
||||
"term",
|
||||
"Vibrate your finger on the controller to achieve faster sideways movement speed than holding it.\nIt is most commonly used on classic Tetris where DAS is rather slow. In most cases, you do not need to hypertap in modern Tetris games, because their DAS is often fast enough.",
|
||||
},
|
||||
{"Passthrough",
|
||||
"passthrough pingthrough",
|
||||
"term",
|
||||
"",--TODO
|
||||
},
|
||||
{"Tetris OL attack",
|
||||
"top tetrisonlineattack",
|
||||
"term",
|
||||
|
||||
@@ -809,6 +809,11 @@ return{
|
||||
"term",
|
||||
"快速震动手指,实现比长按更快速+灵活的高速单点移动,主要在经典块的高难度下(因为das不可调而且特别慢,高速下很容易md导致失败,此时手动连点就比自动移动更快)或者受特殊情况限制不适合用自动移动时使用。会使用这个技术的人称为“Hypertapper”。",
|
||||
},
|
||||
{"穿透 Passthrough",
|
||||
"穿透 passthrough pingthrough",
|
||||
"term",
|
||||
"(攻击)穿透,指双方的攻击明明时间上很接近但没有抵消,互相都收到的现象。\nTETR.IO中自定义房间如果开启passthrough规则(曾经天梯默认开启),那么对手消行攻击的瞬间能看到自己的红条出现但其处于“无敌时间”内,不会触发也不能抵消,此时你的攻击会直接打给对手。(应该是给攻击的飞行动画预留时间,同时也让玩家能反应过来并主动选择要不要抵消,要的话就再等一会)\n另有pingthrough的说法,最终效果同passthrough,只是根本原因是不可避免的网络传输延迟。设计比较简单的联网对战块没有特殊考虑的话可能自然就会带有这个机制。",
|
||||
},
|
||||
{"TOP攻击表",
|
||||
"攻击表 top attack",
|
||||
"term",
|
||||
|
||||
@@ -776,7 +776,6 @@ return{
|
||||
"……,合群了就会消失,但消失不代表没有意义",
|
||||
"……,没有对比就没有伤害",
|
||||
"“Techmino.app”将对您的电脑造成伤害。您应该将它移到废纸篓。",
|
||||
"“TechminOS”",
|
||||
"(a+b)³=a³+3a²b+3ab²+b³",
|
||||
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
||||
"《按钮风格进化史》",
|
||||
@@ -839,6 +838,7 @@ return{
|
||||
"凑数tip什么时候能站起来!",
|
||||
"打好块跟学习一样没有捷径,多练。",
|
||||
"打铁.png",
|
||||
"打铁",
|
||||
"打网络对战前请确认自己有一定的水平,不然会毫无游戏体验的",
|
||||
"大概还是有人会看tip的",
|
||||
"大量使用开局定式的数据是不准的",
|
||||
@@ -903,6 +903,7 @@ return{
|
||||
"绝大多数按钮上的图标是调用Unicode私用区里的自制字符实现的",
|
||||
"觉得移动速度太慢或太快,手感不好?快去设置调整DAS/ARR",
|
||||
"开启省流模式后将不会加载用户头像(应该能省不少流吧)",
|
||||
"科技骨牌 你的创新式块堆栈业务技术管理器",
|
||||
"块东V共荣",
|
||||
"快去打一把100%极简看看会怎样",
|
||||
"锟斤拷锟斤拷锟斤拷",
|
||||
@@ -945,7 +946,7 @@ return{
|
||||
"请勿使用三只手游玩",
|
||||
"去玩别的方块的时候记得没有Ospin!",
|
||||
"全球目前应该没人能全X评价(大爆炸不算)",
|
||||
"群友翻译的中文方块百科全书! tetris.huijiwiki.com",
|
||||
"群友翻译的中文方块百科全书!tetris.huijiwiki.com",
|
||||
"让他三尺又何妨",
|
||||
"如何O-spin: 一秒转626圈(误",
|
||||
"三连块只有2种",
|
||||
@@ -1028,7 +1029,7 @@ return{
|
||||
"有建议的话可以把信息反馈给作者~",
|
||||
"有两个模式是以东方Project里的角色为主题的",
|
||||
"有一些隐藏模式不能从地图进入,到处找找看吧",
|
||||
"有疑问? 先看设置有没有你想要的",
|
||||
"有疑问?先看设置有没有你想要的",
|
||||
"右下角那个问号按钮是游戏说明书 (开了简洁模式当我没说)",
|
||||
"长期睡眠不足会引起不可逆的脑损伤(变傻)",
|
||||
"这不是休闲游戏……别怪关卡要求太高,多练吧",
|
||||
@@ -1100,6 +1101,8 @@ return{
|
||||
"Techmino 濂界帺锛",
|
||||
"Techmino 英['tɛkmɪnəʊ] 美/'tekmɪnoʊ/ n.铁壳米诺(游戏名)",
|
||||
"Techmino console了解一下",
|
||||
"Techmino: App意外退出。",
|
||||
"Techmino.exe 已停止工作",
|
||||
"Techmino安卓下载",
|
||||
"Techmino不是工业产品也不是练手程序,是游戏作品(至少目前是,嗯……)",
|
||||
"Techmino好玩!",
|
||||
@@ -1111,6 +1114,7 @@ return{
|
||||
"Techmino怎么念啊",
|
||||
"techminohaowan",
|
||||
"techminoisfun",
|
||||
"TechminOS coming s∞n",
|
||||
"viod main[]",
|
||||
"while(false)",
|
||||
"Z酱竟是我自己",
|
||||
@@ -1150,7 +1154,7 @@ return{
|
||||
{C.R,"不要向不感兴趣的路人推荐!!!!!!!!"},
|
||||
{C.R,"不要在上课时玩游戏!"},
|
||||
{C.R,"光敏性癫痫警告"},
|
||||
{C.R,"请在有一定游戏基础之后再学Tspin! 不然副作用非常大!"},
|
||||
{C.R,"请在有一定游戏基础之后再学Tspin!不然副作用非常大!"},
|
||||
{C.R,"新人请千万记住,打好基础,不要太早学那些花里胡哨的。"},
|
||||
{C.R,"长时间游戏状态会越来越差!玩久了记得放松一下~"},
|
||||
{C.R,"DD",C.Z,"炮=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"D",C.Z,"炮"},
|
||||
|
||||
28
parts/modes/big_h.lua
Normal file
28
parts/modes/big_h.lua
Normal file
@@ -0,0 +1,28 @@
|
||||
return{
|
||||
env={
|
||||
noTele=true,
|
||||
mindas=7,minarr=1,minsdarr=1,
|
||||
sequence="bagES",
|
||||
hook_drop=require'parts.eventsets.bigWallGen'.hook_drop,
|
||||
eventSet='big_h',
|
||||
bg='cubes',bgm='push',
|
||||
},
|
||||
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=160 and 5 or
|
||||
T<=280 and 4 or
|
||||
3
|
||||
else
|
||||
return
|
||||
L>=100 and 2 or
|
||||
L>=50 and 1 or
|
||||
L>=10 and 0
|
||||
end
|
||||
end,
|
||||
}
|
||||
28
parts/modes/big_n.lua
Normal file
28
parts/modes/big_n.lua
Normal file
@@ -0,0 +1,28 @@
|
||||
return{
|
||||
env={
|
||||
noTele=true,
|
||||
mindas=7,minarr=1,minsdarr=1,
|
||||
sequence="bagES",
|
||||
hook_drop=require'parts.eventsets.bigWallGen'.hook_drop,
|
||||
eventSet='big_n',
|
||||
bg='bg2',bgm='push',
|
||||
},
|
||||
score=function(P)return{math.min(P.modeData.maxCombo,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..STRING.time(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=200 then
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=180 and 5 or
|
||||
T<=300 and 4 or
|
||||
3
|
||||
else
|
||||
return
|
||||
L>=150 and 2 or
|
||||
L>=100 and 1 or
|
||||
L>=20 and 0
|
||||
end
|
||||
end,
|
||||
}
|
||||
@@ -21,7 +21,7 @@ return{
|
||||
gc.push('transform')
|
||||
if repMode then
|
||||
gc.origin()
|
||||
gc.setColor(.3,.3,.3,.7)
|
||||
gc.setColor(COLOR.X)
|
||||
gc.rectangle('fill',0,0,SCR.w,SCR.h)
|
||||
else
|
||||
gc.clear(.2,.2,.2)
|
||||
|
||||
@@ -267,7 +267,7 @@ function NETPLY.draw()
|
||||
end
|
||||
if selP then
|
||||
gc_translate(min(mouseX,880),min(mouseY,460))
|
||||
gc_setColor(.2,.2,.2,.7)
|
||||
gc_setColor(COLOR.X)
|
||||
gc_rectangle('fill',0,0,400,260)
|
||||
gc_setColor(1,1,1)
|
||||
gc_setLineWidth(2)
|
||||
|
||||
@@ -1764,7 +1764,7 @@ do
|
||||
else
|
||||
piece.special=false
|
||||
end
|
||||
if self.sound then
|
||||
if self.sound and(cc~=1 or dospin)then
|
||||
VOC.play(clearVoice[cc],CHN)
|
||||
end
|
||||
|
||||
@@ -2415,11 +2415,7 @@ local function update_alive(P)
|
||||
P.downing=P.downing+1
|
||||
local d=P.downing-ENV.sddas
|
||||
if d>1 then
|
||||
if ENV.sdarr>0 then
|
||||
if d%ENV.sdarr==0 then
|
||||
P:act_down1()
|
||||
end
|
||||
else
|
||||
if ENV.sdarr==0 then
|
||||
P:act_insDown()
|
||||
end
|
||||
if ENV.shakeFX then
|
||||
@@ -2458,33 +2454,51 @@ local function update_alive(P)
|
||||
if P.cur then
|
||||
if P.curY>P.ghoY then
|
||||
local D=P.dropDelay
|
||||
local dist--Drop distance
|
||||
if D>1 then
|
||||
P.dropDelay=D-1
|
||||
goto THROW_stop
|
||||
end
|
||||
|
||||
if D==1 then
|
||||
if ENV.moveFX and ENV.block then
|
||||
P:createMoveFX('down')
|
||||
D=D-1
|
||||
if P.downing>ENV.sddas then
|
||||
D=D-ceil(ENV.drop/ENV.sdarr)
|
||||
end
|
||||
P.curY=P.curY-1
|
||||
else
|
||||
D=min(1/D,P.curY-P.ghoY)--1/D=Drop dist, lowest to ghost
|
||||
if ENV.moveFX and ENV.block then
|
||||
for _=1,D do
|
||||
P:createMoveFX('down')
|
||||
P.curY=P.curY-1
|
||||
end
|
||||
if D<=0 then
|
||||
dist=1
|
||||
P.dropDelay=(D-1)%ENV.drop+1
|
||||
else
|
||||
P.curY=P.curY-D
|
||||
P.dropDelay=D
|
||||
goto THROW_stop
|
||||
end
|
||||
elseif D==1 then--We don't know why dropDelay is 1, so checking ENV.drop>1 is neccessary
|
||||
if ENV.drop>1 and P.downing>ENV.sddas and(P.downing-ENV.sddas)%ENV.sdarr==0 then
|
||||
dist=2
|
||||
else
|
||||
dist=1
|
||||
end
|
||||
--Reset drop delay
|
||||
P.dropDelay=ENV.drop
|
||||
else--High gravity case (>1G)
|
||||
--Add extra 1 if time to auto softdrop
|
||||
if P.downing>ENV.sddas and(P.downing-ENV.sddas)%ENV.sdarr==0 then
|
||||
dist=1/D+1
|
||||
else
|
||||
dist=1/D
|
||||
end
|
||||
end
|
||||
P:freshBlock('fresh')
|
||||
P.spinLast=false
|
||||
|
||||
if P.ghoY~=P.curY then
|
||||
P.dropDelay=ENV.drop
|
||||
--Limit dropping to ghost at max
|
||||
dist=min(dist,P.curY-P.ghoY)
|
||||
|
||||
--Drop and create FXs
|
||||
if ENV.moveFX and ENV.block and dist>1 then
|
||||
for _=1,dist do
|
||||
P:createMoveFX('down')
|
||||
P.curY=P.curY-1
|
||||
end
|
||||
else
|
||||
P.curY=P.curY-dist
|
||||
end
|
||||
|
||||
P.spinLast=false
|
||||
P:freshBlock('fresh')
|
||||
P:checkTouchSound()
|
||||
else
|
||||
P.lockDelay=P.lockDelay-1
|
||||
|
||||
@@ -303,7 +303,7 @@ function scene.draw()
|
||||
end
|
||||
end
|
||||
end
|
||||
gc.setColor(0,0,0,.3)
|
||||
gc.setColor(COLOR.dX)
|
||||
gc.setLineWidth(10)
|
||||
gc.rectangle('line',cx*160+173,cy*160-107,134,134,50)
|
||||
end
|
||||
|
||||
@@ -135,11 +135,11 @@ function scene.draw()
|
||||
gc.scale(8)
|
||||
|
||||
--Draw board
|
||||
gc.setColor(0,0,0,.4)
|
||||
gc.setColor(COLOR.dX)
|
||||
gc.rectangle('fill',0,0,90,90)
|
||||
|
||||
--Draw target area
|
||||
gc.setColor(1,1,1,math.sin((TIME()-placeTime)*5)/5+.2)
|
||||
gc.setColor(1,1,1,math.sin((TIME()-placeTime)*5)*.1+.15)
|
||||
if target then
|
||||
gc.rectangle('fill',(target-1)%3*30,int((target-1)/3)*30,30,30)
|
||||
elseif not gameover then
|
||||
@@ -212,7 +212,7 @@ function scene.draw()
|
||||
end
|
||||
else
|
||||
--Draw current round mark
|
||||
gc.setColor(.8,.8,.8,.8)
|
||||
gc.setColor(COLOR.X)
|
||||
gc.rectangle('fill',80,80,160,160)
|
||||
gc.setColor(COLOR.Z)
|
||||
gc.setLineWidth(6)
|
||||
|
||||
@@ -135,6 +135,8 @@ function scene.keyDown(key)
|
||||
end
|
||||
|
||||
function scene.draw()
|
||||
gc.setColor(COLOR.dX)
|
||||
gc.rectangle('fill',100,80,650,150,5)
|
||||
gc.setColor(COLOR.Z)
|
||||
gc.setLineWidth(2)
|
||||
gc.rectangle('line',100,80,650,150,5)
|
||||
|
||||
@@ -4,7 +4,7 @@ local ins,rem=table.insert,table.remove
|
||||
local C=COLOR
|
||||
|
||||
local inputBox=WIDGET.newInputBox{name='input',x=40,y=650,w=1200,h=50,fType='mono'}
|
||||
local outputBox=WIDGET.newTextBox{name='output',x=40,y=30,w=1200,h=610,font=25,fType='mono',lineH=23,fix=true}
|
||||
local outputBox=WIDGET.newTextBox{name='output',x=40,y=30,w=1200,h=610,font=25,fType='mono',lineH=25,fix=true}
|
||||
|
||||
local function log(str)outputBox:push(str)end
|
||||
_SCLOG=log
|
||||
@@ -14,7 +14,7 @@ log{C.lC,"©2021 26F Studio some rights reserved"}
|
||||
log{C.dR,"WARNING: DO NOT RUN ANY CODE THAT YOU DON'T UNDERSTAND."}
|
||||
|
||||
local history,hisPtr={"?"}
|
||||
local sudomode=false
|
||||
local sumode=false
|
||||
local the_secret=(0xe^2*10)..(2*0xb)
|
||||
|
||||
local commands={}do
|
||||
@@ -566,7 +566,7 @@ local commands={}do
|
||||
{
|
||||
code="2048",
|
||||
scene='app_2048',
|
||||
description="2048 with some new features\nOriginal by Asher Vollmer"
|
||||
description="2048 with some new features. Original by Asher Vollmer"
|
||||
},
|
||||
{
|
||||
code="ten",
|
||||
@@ -601,7 +601,7 @@ local commands={}do
|
||||
{
|
||||
code="poly",
|
||||
scene='app_polyforge',
|
||||
description="Polyforge\nOriginal by ImpactBlue Studios"
|
||||
description="Polyforge. Original by ImpactBlue Studios"
|
||||
},
|
||||
{
|
||||
code="link",
|
||||
@@ -626,7 +626,7 @@ local commands={}do
|
||||
{
|
||||
code="trp",
|
||||
scene='app_triple',
|
||||
description="A simply clone of a famous Match-3 Game\nOriginal idea from Sanlitun / Triple Town"
|
||||
description="A Match-3 Game. Original idea from Sanlitun / Triple Town"
|
||||
},
|
||||
{
|
||||
code="spin",
|
||||
@@ -638,7 +638,7 @@ local commands={}do
|
||||
code=function(name)
|
||||
if name=="-list"then
|
||||
for i=1,#APPs do
|
||||
log(APPs[i].code..": "..APPs[i].description)
|
||||
log(("$1 $2 $3"):repD(APPs[i].code,("·"):rep(10-#APPs[i].code),APPs[i].description))
|
||||
end
|
||||
elseif name~=""then
|
||||
for i=1,#APPs do
|
||||
@@ -708,14 +708,14 @@ local commands={}do
|
||||
end,
|
||||
description="Reset everything and delete all saved data.",
|
||||
}
|
||||
commands.sudo={
|
||||
commands.su={
|
||||
code=function(code)
|
||||
if sudomode then
|
||||
log{C.Y,"You are already in sudo mode. Use # to run any lua code"}
|
||||
if sumode then
|
||||
log{C.Y,"You are already in su mode. Use # to run any lua code"}
|
||||
log{C.Y,"已经进入最高权限模式了, 请使用 # 执行任意lua代码"}
|
||||
elseif code=="7126"then
|
||||
sudomode=true
|
||||
log{C.Y,"* SUDO MODE ON - DO NOT RUN ANY CODES IF YOU DO NOT KNOW WHAT THEY DO *"}
|
||||
sumode=true
|
||||
log{C.Y,"* SU MODE ON - DO NOT RUN ANY CODES IF YOU DO NOT KNOW WHAT THEY DO *"}
|
||||
log{C.Y,"* Use function _SCLOG(message) to print message here *"}
|
||||
log{C.Y,"* 最高权限模式开启, 请不要执行任何自己不懂确切含义的代码 *"}
|
||||
log{C.Y,"* 使用_SCLOG(信息)函数在控制台打印信息 *"}
|
||||
@@ -723,7 +723,7 @@ local commands={}do
|
||||
log{C.Y,"Password incorrect"}
|
||||
end
|
||||
end,
|
||||
}commands.su="sudo"
|
||||
}
|
||||
|
||||
--Game
|
||||
commands.rmconf={
|
||||
@@ -1021,7 +1021,7 @@ function scene.keyDown(key)
|
||||
local code,err=loadstring(input:sub(2))
|
||||
if code then
|
||||
local resultColor
|
||||
if sudomode then
|
||||
if sumode then
|
||||
resultColor=C.lY
|
||||
else
|
||||
setfenv(code,userG)
|
||||
|
||||
@@ -216,6 +216,9 @@ function scene.update(dt)
|
||||
end
|
||||
end
|
||||
|
||||
local function _sunStencil()
|
||||
gc.rectangle('fill',-60,-440,120,120)
|
||||
end
|
||||
function scene.draw()
|
||||
--Health bar
|
||||
if life1>0 then
|
||||
@@ -235,12 +238,11 @@ function scene.draw()
|
||||
gc.rotate(rot)
|
||||
|
||||
--Draw sun
|
||||
gc.setStencilTest('notequal',1)
|
||||
gc.stencil(_sunStencil)
|
||||
gc.setColor(.7,.5,.3)
|
||||
gc.circle('fill',0,-380-sunH,60)
|
||||
|
||||
--Draw sun-board
|
||||
gc.setColor(.08,.08,.084)
|
||||
gc.rectangle('fill',-60,-440,120,120)
|
||||
gc.setStencilTest()
|
||||
|
||||
--Draw direction
|
||||
if play then
|
||||
|
||||
@@ -51,7 +51,6 @@ local iconList={
|
||||
}
|
||||
gc.setDefaultFilter('linear','linear')
|
||||
|
||||
local sure=0
|
||||
local invis
|
||||
local state
|
||||
local startTime,time
|
||||
@@ -253,21 +252,14 @@ end
|
||||
function scene.keyDown(key,isRep)
|
||||
if isRep then return end
|
||||
if key=='r'then
|
||||
if state~=1 or sure>.2 then
|
||||
if state~=1 or tryReset()then
|
||||
newGame()
|
||||
else
|
||||
sure=1
|
||||
MES.new('info',"Press again")
|
||||
end
|
||||
elseif key=='z'or key=='x'then
|
||||
love.mousepressed(ms.getPosition())
|
||||
elseif key=='escape'then
|
||||
if state~=1 then
|
||||
if tryBack()then
|
||||
SCN.back()
|
||||
end
|
||||
else
|
||||
sure=1
|
||||
if state~=1 or tryBack()then
|
||||
SCN.back()
|
||||
end
|
||||
elseif state==0 then
|
||||
if key=='q'then
|
||||
@@ -292,8 +284,6 @@ function scene.update(dt)
|
||||
score1=score1+MATH.sign(score-score1)+int((score-score1)*.1+.5)
|
||||
end
|
||||
|
||||
if sure>0 then sure=sure-dt end
|
||||
|
||||
for i=#lines,1,-1 do
|
||||
local L=lines[i]
|
||||
L.time=L.time+dt
|
||||
@@ -309,6 +299,10 @@ function scene.draw()
|
||||
gc.translate(field.x,field.y)
|
||||
gc.scale(field.w/field.c,field.h/field.r)
|
||||
|
||||
--Background
|
||||
gc.setColor(COLOR.dX)
|
||||
gc.rectangle('fill',0,0,field.w,field.h)
|
||||
|
||||
--Matrix
|
||||
local mono=state==0 or invis and not field.full
|
||||
if mono then
|
||||
@@ -348,12 +342,9 @@ function scene.draw()
|
||||
gc.line(lines[i].line)
|
||||
end
|
||||
gc.pop()
|
||||
--Frame
|
||||
|
||||
if state==2 then
|
||||
--Draw no-setting area
|
||||
gc.setColor(1,0,0,.3)
|
||||
gc.rectangle('fill',0,100,155,80)
|
||||
|
||||
gc.setColor(.9,.9,0)--win
|
||||
elseif state==1 then
|
||||
gc.setColor(.9,.9,.9)--game
|
||||
@@ -363,6 +354,12 @@ function scene.draw()
|
||||
gc.setLineWidth(6)
|
||||
gc.rectangle('line',field.x-5,field.y-5,field.w+10,field.h+10)
|
||||
|
||||
--Draw no-setting area
|
||||
if state==2 then
|
||||
gc.setColor(1,0,0,.3)
|
||||
gc.rectangle('fill',0,100,155,80)
|
||||
end
|
||||
|
||||
--Maxcombo
|
||||
setFont(20)gc.setColor(COLOR.dF)
|
||||
gc.print(maxCombo,1142,1)
|
||||
|
||||
@@ -159,8 +159,8 @@ function scene.draw()
|
||||
gc.setColor(0,0,0,timer/50)
|
||||
gc.print("POLYFORGE",20,620)
|
||||
setFont(30)
|
||||
gc.print("Idea by ImpactBlue Studios",860,630)
|
||||
gc.print("n-Spire ver. & ported & improved by MrZ",670,670)
|
||||
gc.printf("Idea by ImpactBlue Studios",0,630,1260,'right')
|
||||
gc.printf("n-Spire ver. & ported & improved by MrZ",0,670,1260,'right')
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -125,11 +125,9 @@ function scene.draw()
|
||||
setFont(70)
|
||||
mStr(state==1 and progress or state==0 and"Ready"or state==2 and"Win",1130,300)
|
||||
|
||||
gc.setColor(COLOR.dX)
|
||||
gc.rectangle('fill',310,30,660,660)
|
||||
if state==2 then
|
||||
--Draw no-setting area
|
||||
gc.setColor(1,0,0,.3)
|
||||
gc.rectangle('fill',15,295,285,250)
|
||||
|
||||
gc.setColor(.9,.9,0)--win
|
||||
elseif state==1 then
|
||||
gc.setColor(.9,.9,.9)--game
|
||||
@@ -139,6 +137,12 @@ function scene.draw()
|
||||
gc.setLineWidth(10)
|
||||
gc.rectangle('line',310,30,660,660)
|
||||
|
||||
--Draw no-setting area
|
||||
if state==2 then
|
||||
gc.setColor(1,0,0,.3)
|
||||
gc.rectangle('fill',15,295,285,250)
|
||||
end
|
||||
|
||||
local width=640/rank
|
||||
local mono=state==0 or invis and state==1 and progress>0
|
||||
gc.setLineWidth(4)
|
||||
|
||||
@@ -241,7 +241,7 @@ function scene.draw()
|
||||
|
||||
--Previews
|
||||
if nexts then
|
||||
gc.setColor(0,0,0,.2)
|
||||
gc.setColor(COLOR.dX)
|
||||
rectangle('fill',20,450,280,75)
|
||||
gc.setLineWidth(6)
|
||||
setColor(1,1,1)
|
||||
|
||||
@@ -7,22 +7,24 @@ local ins,rem=table.insert,table.remove
|
||||
local setFont,mStr=FONT.set,GC.mStr
|
||||
|
||||
local tileColor={
|
||||
[-1]=COLOR.H,
|
||||
{.39, 1.0, .39},
|
||||
{.39, .39, 1.0},
|
||||
{1.0, .70, .31},
|
||||
{.94, .31, .31},
|
||||
{.00, .71, .12},
|
||||
{.90, .20, .90},
|
||||
{.94, .47, .39},
|
||||
{.90, .00, .00},
|
||||
{.86, .86, .31},
|
||||
{.78, .31, .00},
|
||||
{.78, .55, .04},
|
||||
{.12, .12, .51},
|
||||
[-2]=COLOR.R, --Bomb
|
||||
[-1]=COLOR.H, --Stone
|
||||
{.39, 1.0, .39},--Tile 1
|
||||
{.39, .39, 1.0},--Tile 2
|
||||
{1.0, .70, .31},--Tile 3
|
||||
{.94, .31, .31},--Tile 4
|
||||
{.00, .71, .12},--Tile 5
|
||||
{.90, .20, .90},--Tile 6
|
||||
{.94, .47, .39},--Tile 7
|
||||
{.90, .00, .00},--Tile 8
|
||||
{.86, .86, .31},--Tile 9
|
||||
{.78, .31, .00},--Tile 10
|
||||
{.78, .55, .04},--Tile 11
|
||||
{.12, .12, .51},--Tile 12
|
||||
}
|
||||
local textColor={
|
||||
[-1]=COLOR.D,
|
||||
[-2]=COLOR.dR,
|
||||
[-1]=COLOR.dH,
|
||||
{.26, .66, .26},
|
||||
{.26, .26, .66},
|
||||
{.66, .46, .20},
|
||||
@@ -43,21 +45,28 @@ local tileTexts=setmetatable({
|
||||
local player={x=340,y=90}
|
||||
|
||||
function player:newTile()
|
||||
local r=1
|
||||
if rnd()<.3 then
|
||||
r=r+1
|
||||
if rnd()<.3 then r=r+1 end
|
||||
end
|
||||
if self.maxTile>=4 and rnd()<.3 then
|
||||
r=r+1
|
||||
if self.maxTile>=6 and rnd()<.3 then
|
||||
r=r+1
|
||||
if self.maxTile>=8 and rnd()<.3 then
|
||||
r=r+1
|
||||
local r=rnd()
|
||||
if r<.006 then
|
||||
return self.maxTile
|
||||
elseif r<.026 then
|
||||
return -2
|
||||
else
|
||||
local t=1
|
||||
if rnd()<.3 then
|
||||
t=t+1
|
||||
if rnd()<.3 then t=t+1 end
|
||||
end
|
||||
if self.maxTile>=4 and rnd()<.3 then
|
||||
t=t+1
|
||||
if self.maxTile>=6 and rnd()<.3 then
|
||||
t=t+1
|
||||
if self.maxTile>=8 and rnd()<.3 then
|
||||
t=t+1
|
||||
end
|
||||
end
|
||||
end
|
||||
return t
|
||||
end
|
||||
return r
|
||||
end
|
||||
|
||||
function player:reset()
|
||||
@@ -101,6 +110,16 @@ function player:merge(b,v,y,x)
|
||||
end
|
||||
end
|
||||
|
||||
local function availablePos(b,t)
|
||||
return
|
||||
t>0 and b==0 or
|
||||
t==-2 and b~=0
|
||||
end
|
||||
local function newMergeFX(y,x,tile)
|
||||
local r,g,b
|
||||
if tile==-2 then r,g,b=1,.6,.3 end
|
||||
SYSFX.newShade(3,player.x+100*x-100,player.y+100*y-100,100,100,r,g,b)
|
||||
end
|
||||
function player:click(y,x)
|
||||
if y==1 and x==1 then
|
||||
self.nexts[1],self.hold=self.hold,self.nexts[1]
|
||||
@@ -109,70 +128,81 @@ function player:click(y,x)
|
||||
rem(self.nexts,1)
|
||||
ins(self.nexts,self:newTile())
|
||||
end
|
||||
elseif self.board[y][x]~=0 then
|
||||
self.selectX,self.selectY=false,false
|
||||
elseif y~=self.selectY or x~=self.selectX then
|
||||
if availablePos(self.board[y][x],self.nexts[1])then
|
||||
self.selectX,self.selectY=x,y
|
||||
else
|
||||
self.selectX,self.selectY=false,false
|
||||
end
|
||||
elseif y==self.selectY and x==self.selectX then
|
||||
if not availablePos(self.board[y][x],self.nexts[1])then return end
|
||||
if self.state==0 then
|
||||
self.state=1
|
||||
self.startTime=TIME()
|
||||
end
|
||||
|
||||
self.board[y][x]=rem(self.nexts,1)
|
||||
SFX.play('touch')
|
||||
|
||||
local merged
|
||||
::REPEAT_merge::
|
||||
local cur=self.board[y][x]
|
||||
local b1=TABLE.shift(self.board)
|
||||
self.mergedTiles={}
|
||||
local count=self:merge(b1,cur,y,x)
|
||||
if count>2 then
|
||||
merged=true
|
||||
self.board=b1
|
||||
b1[y][x]=cur+1
|
||||
|
||||
if cur+1>self.maxTile then
|
||||
self.maxTile=cur+1
|
||||
if self.maxTile>=6 then
|
||||
ins(self.progress,("%s - %.3fs"):format(self.maxTile,TIME()-player.startTime))
|
||||
end
|
||||
SFX.play('reach')
|
||||
end
|
||||
|
||||
local getScore=4^cur*count
|
||||
self.score=self.score+getScore
|
||||
TEXT.show(getScore,player.x+self.selectX*100-50,player.y+self.selectY*100-50,40,'score')
|
||||
for i=1,#self.mergedTiles do
|
||||
SYSFX.newShade(3,player.x+100*self.mergedTiles[i][2]-100,player.y+100*self.mergedTiles[i][1]-100,100,100)
|
||||
end
|
||||
goto REPEAT_merge
|
||||
end
|
||||
|
||||
ins(self.nexts,self:newTile())
|
||||
|
||||
self.selectX,self.selectY=false,false
|
||||
|
||||
print('-------------')
|
||||
if merged then
|
||||
SFX.play('lock')
|
||||
if cur>=4 then
|
||||
SFX.play(
|
||||
cur>=8 and'ren_mega'or
|
||||
cur>=7 and'spin_3'or
|
||||
cur>=6 and'spin_2'or
|
||||
cur>=5 and'spin_1'or
|
||||
'spin_0'
|
||||
)
|
||||
end
|
||||
if self.nexts[1]==-2 then
|
||||
self.board[y][x]=0
|
||||
SFX.play('clear_2')
|
||||
rem(self.nexts,1)
|
||||
ins(self.nexts,self:newTile())
|
||||
newMergeFX(y,x,-2)
|
||||
else
|
||||
for i=1,6 do
|
||||
if TABLE.find(self.board[i],0)then
|
||||
print(i,TABLE.find(self.board[i],0))
|
||||
return
|
||||
self.board[y][x]=rem(self.nexts,1)
|
||||
SFX.play('touch')
|
||||
|
||||
local merged
|
||||
::REPEAT_merge::
|
||||
local cur=self.board[y][x]
|
||||
local b1=TABLE.shift(self.board)
|
||||
self.mergedTiles={}
|
||||
local count=self:merge(b1,cur,y,x)
|
||||
if count>2 then
|
||||
merged=true
|
||||
self.board=b1
|
||||
b1[y][x]=cur+1
|
||||
|
||||
if cur+1>self.maxTile then
|
||||
self.maxTile=cur+1
|
||||
if self.maxTile>=6 then
|
||||
ins(self.progress,("%s - %.3fs"):format(self.maxTile,TIME()-player.startTime))
|
||||
end
|
||||
SFX.play('reach')
|
||||
end
|
||||
|
||||
local getScore=4^cur*count
|
||||
self.score=self.score+getScore
|
||||
TEXT.show(getScore,player.x+self.selectX*100-50,player.y+self.selectY*100-50,40,'score')
|
||||
for i=1,#self.mergedTiles do
|
||||
newMergeFX(self.mergedTiles[i][1],self.mergedTiles[i][2],cur+1)
|
||||
end
|
||||
goto REPEAT_merge
|
||||
end
|
||||
|
||||
ins(self.nexts,self:newTile())
|
||||
|
||||
self.selectX,self.selectY=false,false
|
||||
|
||||
if merged then
|
||||
SFX.play('lock')
|
||||
if cur>=4 then
|
||||
SFX.play(
|
||||
cur>=8 and'ren_mega'or
|
||||
cur>=7 and'spin_3'or
|
||||
cur>=6 and'spin_2'or
|
||||
cur>=5 and'spin_1'or
|
||||
'spin_0'
|
||||
)
|
||||
end
|
||||
else
|
||||
for i=1,6 do
|
||||
if TABLE.find(self.board[i],0)then
|
||||
return
|
||||
end
|
||||
end
|
||||
self.state=2
|
||||
SFX.play('fail')
|
||||
end
|
||||
self.state=2
|
||||
SFX.play('fail')
|
||||
end
|
||||
else
|
||||
self.selectX,self.selectY=x,y
|
||||
@@ -187,13 +217,12 @@ local function drawTile(x,y,v)
|
||||
mStr(tileTexts[v],x*100-50,y*100-92)
|
||||
end
|
||||
end
|
||||
|
||||
function player:drawBoard()
|
||||
gc.push('transform')
|
||||
gc.translate(self.x,self.y)
|
||||
|
||||
--Board background
|
||||
setColor(.2,.2,.2,.7)
|
||||
setColor(COLOR.dX)
|
||||
rectangle("fill",0,0,600,600)
|
||||
|
||||
|
||||
|
||||
@@ -166,6 +166,14 @@ function scene.update(dt)
|
||||
end
|
||||
|
||||
function scene.draw()
|
||||
gc.setColor(COLOR.dX)
|
||||
gc.rectangle('fill',300,180,958,526,5)
|
||||
gc.rectangle('fill',20,180,280,526,5)
|
||||
gc.setLineWidth(2)
|
||||
gc.setColor(COLOR.Z)
|
||||
gc.rectangle('line',300,180,958,526,5)
|
||||
gc.rectangle('line',20,180,280,526,5)
|
||||
|
||||
local list=_getList()
|
||||
gc.setColor(COLOR.Z)
|
||||
local t=list[selected].content
|
||||
@@ -178,7 +186,7 @@ function scene.draw()
|
||||
gc.printf(t,306,180,950)
|
||||
|
||||
setFont(30)
|
||||
gc.setColor(1,1,1,.4+.2*sin(TIME()*4))
|
||||
gc.setColor(1,1,1,.4+.05*sin(TIME()*12.6))
|
||||
gc.rectangle('fill',20,143+35*(selected-scrollPos),280,35)
|
||||
|
||||
setFont(30)
|
||||
@@ -195,11 +203,6 @@ function scene.draw()
|
||||
gc.print(item.title,30,y)
|
||||
end
|
||||
|
||||
gc.setLineWidth(2)
|
||||
gc.setColor(COLOR.Z)
|
||||
gc.rectangle('line',300,180,958,526,5)
|
||||
gc.rectangle('line',20,180,280,526,5)
|
||||
|
||||
if searchWait>0 then
|
||||
local r=TIME()*2
|
||||
local R=int(r)%7+1
|
||||
|
||||
@@ -4,7 +4,7 @@ local langList={
|
||||
zh_trad="繁體中文",
|
||||
en="English",
|
||||
fr="Français",
|
||||
es="Español",
|
||||
es="Español\nCastellano",
|
||||
pt="Português",
|
||||
|
||||
zh_grass="机翻",
|
||||
@@ -33,7 +33,7 @@ scene.widgetList={
|
||||
|
||||
WIDGET.newButton{x=225,y=331,w=255,h=120,font=40, fText=langList.en, color='L',code=function()_setLang('en')end},
|
||||
WIDGET.newButton{x=500,y=331,w=255,h=120,font=40, fText=langList.fr, color='J',code=function()_setLang('fr')end},
|
||||
WIDGET.newButton{x=775,y=331,w=255,h=120,font=40, fText=langList.es, color='G',code=function()_setLang('es')end},
|
||||
WIDGET.newButton{x=775,y=331,w=255,h=120,font=35, fText=langList.es, color='G',code=function()_setLang('es')end},
|
||||
WIDGET.newButton{x=1050,y=331,w=255,h=120,font=40, fText=langList.pt, color='dG',code=function()_setLang('pt')end},
|
||||
|
||||
WIDGET.newButton{x=271,y=472,w=346,h=120,font=45, fText=langList.zh_grass,color='N',code=function()_setLang('zh_grass')end},
|
||||
|
||||
@@ -235,11 +235,15 @@ function scene.draw()
|
||||
gc_setLineWidth(2)
|
||||
|
||||
--Pad frame
|
||||
gc_setColor(COLOR.dX)
|
||||
gc_rectangle('fill',-3,-3,726,646,2)
|
||||
gc_setColor(white)
|
||||
gc_rectangle('line',-3,-3,726,646,2)
|
||||
|
||||
--Buttons
|
||||
for y=1,8 do
|
||||
gc_setColor(COLOR.dX)
|
||||
gc_circle('fill',40,(y-1)*80+40,34)
|
||||
gc_setColor(white)
|
||||
gc_circle('line',40,(y-1)*80+40,34)
|
||||
if pad.funcAlpha[y]>0 then
|
||||
@@ -248,6 +252,10 @@ function scene.draw()
|
||||
end
|
||||
end
|
||||
setFont(10)
|
||||
gc_setColor(COLOR.dX)
|
||||
for y=1,8 do for x=1,8 do
|
||||
gc_rectangle('fill',x*80+2,(y-1)*80+2,76,76,5)
|
||||
end end
|
||||
gc_setColor(white)
|
||||
for y=1,8 do for x=1,8 do
|
||||
gc_rectangle('line',x*80+2,(y-1)*80+2,76,76,5)
|
||||
|
||||
@@ -2,7 +2,6 @@ local gc=love.graphics
|
||||
|
||||
local scene={}
|
||||
|
||||
local lastQuitTime
|
||||
local verName=("%s %s %s"):format(SYSTEM,VERSION.string,VERSION.name)
|
||||
local tipLength=760
|
||||
local tip=gc.newText(getFont(30),"")
|
||||
@@ -22,7 +21,6 @@ local enterConsole=coroutine.wrap(function()
|
||||
end)
|
||||
function scene.sceneInit()
|
||||
BG.set()
|
||||
lastQuitTime=-1e99
|
||||
|
||||
--Set tip
|
||||
tip:set(text.getTip())
|
||||
|
||||
@@ -271,7 +271,7 @@ function scene.draw()
|
||||
if unlocked==1 then
|
||||
name=RANK_CHARS[rank]
|
||||
if name then
|
||||
gc_setColor(0,0,0,.8)
|
||||
gc_setColor(COLOR.dX)
|
||||
mStr(name,M.x+M.size*.7,M.y-50-M.size*.7)
|
||||
gc_setColor(RANK_COLORS[rank])
|
||||
mStr(name,M.x+M.size*.7+4,M.y-50-M.size*.7-4)
|
||||
@@ -284,7 +284,7 @@ function scene.draw()
|
||||
--Score board
|
||||
if sel then
|
||||
local M=MODES[sel]
|
||||
gc_setColor(.5,.5,.5,.8)
|
||||
gc_setColor(COLOR.lX)
|
||||
gc_rectangle('fill',920,0,360,720,5)--Info board
|
||||
gc_setColor(COLOR.Z)
|
||||
setFont(40)mStr(text.modes[sel][1],1100,5)
|
||||
@@ -295,7 +295,7 @@ function scene.draw()
|
||||
end
|
||||
if M.score then
|
||||
mText(TEXTOBJ.highScore,1100,240)
|
||||
gc_setColor(.3,.3,.3,.7)
|
||||
gc_setColor(COLOR.X)
|
||||
gc_rectangle('fill',940,290,320,280,5)--Highscore board
|
||||
local L=M.records
|
||||
gc_setColor(1,1,1)
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
return[=[
|
||||
未来小游戏:
|
||||
Tetro-1010(2C2N, 重力); Tetra-link(桌游)
|
||||
求合体; 坦克大战; 扫雷; 接水管
|
||||
Tetro-1010(2C2N, 重力)
|
||||
Tetra-link(桌游)
|
||||
坦克大战; 扫雷; 接水管
|
||||
其他未来内容:
|
||||
模式包系统; 新模组系统; 加速下落; spike相关统计数据
|
||||
实时统计数据可视化; 教学关脚本语言; 从录像继续
|
||||
@@ -14,7 +15,7 @@ return[=[
|
||||
0.17.0: 硬着陆 Hard Landing
|
||||
新增:
|
||||
新模式:策略堆叠(原设计来自游戏Cambridge, by NOT_A_ROBOT)
|
||||
新旋转系统:DRS_weak,移除了滞后旋转(五连块朝向风格模仿) #441
|
||||
新旋转系统:DRS_weak,没有滞后旋转(五连块风格模仿) #441
|
||||
新机制:出块延迟打断(ARE打断)(默认关闭) #471
|
||||
新机制:锁定在外判负(lockout)(默认关闭)
|
||||
新机制:全局默认使用5帧窒息延迟
|
||||
@@ -25,14 +26,19 @@ return[=[
|
||||
新小程序:Memorize,Triple
|
||||
改动:
|
||||
关闭背景的灰底亮度可调 #119
|
||||
美化各种控件样式
|
||||
调整游戏大logo为正体字
|
||||
软降n格的键也可以触发深降
|
||||
普通消1不再有single语音
|
||||
优化键位设置菜单各种键的显示
|
||||
优化大量菜单的背景颜色细节
|
||||
修改默认和zday节日的主菜单BGM
|
||||
平滑马拉松-普通和混战模式的速度曲线
|
||||
三个高难隐形使用不同模式图标 #493
|
||||
修改按钮音效,给复选框和选择器添加新音效
|
||||
ultra模式计时器改为秒表,重开的时候会重播bgm
|
||||
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了(略微影响手感,更滑)
|
||||
大改重力和软降的结算逻辑,两个值接近的时候不会看起来不自然了 #438
|
||||
Ospin变O后操作序列清空,变远端朝下JL时允许水平可移动
|
||||
生成位置预览开启后hold的生成位置也可见 #453
|
||||
TRS的S/Z添加四个踢墙防止在一些地方卡死
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
["apkCode"]=414,
|
||||
["apkCode"]=415,
|
||||
["code"]=1700,
|
||||
["string"]="V0.17.0",
|
||||
["room"]="ver A-2",
|
||||
|
||||
Reference in New Issue
Block a user