Compare commits

..

39 Commits

Author SHA1 Message Date
MrZ626
bd90e051d4 版本推进 2021-12-01 02:41:18 +08:00
MrZ626
26e66b313f 继续收拾各种ui相关
空心控件统一加上灰色背景方便观察
按钮样式调整
2021-12-01 02:40:11 +08:00
MrZ626
c534bbd12a 微调马拉松和混战的速度曲线 2021-12-01 00:39:21 +08:00
NOT_A_ROBOT
83b5e217e5 Add Big Mode (#515)
I even halved the gravity :)
2021-12-01 00:10:00 +08:00
MrZ626
c0adf5bf0b COLOR模块新增三个半透明灰色并大量应用
微调颜色V和lV的hue值
2021-11-30 23:36:04 +08:00
MrZ626
4ff737a4ac 减小语音随机偏差范围 2021-11-30 23:20:59 +08:00
MrZ626
5af0706c09 普通消1不再有single语音 2021-11-30 22:52:27 +08:00
MrZ626
4ccee0f1de 修改小程序trp的next生成 2021-11-30 22:31:46 +08:00
MrZ626
9b752d540e 修正慢速下落有拖影不好看
测试代码忘删
2021-11-30 22:24:58 +08:00
MrZ626
e860c7b7ec 大改重力和软降的结算逻辑,两个值接近的时候不会看起来不自然了 close #438 2021-11-30 19:40:53 +08:00
C29H25N3O5
8a1fd9531f 修复NH块搞反的问题 2021-11-30 15:54:54 +08:00
C29H25N3O5
5fd6e0ee99 再更新虚拟按键贴图, 使用Plex字体 2021-11-30 15:54:52 +08:00
MrZ626
53b2b81fe0 再新增几个tip 2021-11-30 14:51:04 +08:00
MrZ626
6ccc811b46 微调tip 2021-11-30 12:56:32 +08:00
MrZ626
962a61567a OS X系统名称字符串强制改为macOS close #513 2021-11-30 12:25:59 +08:00
MrZ626
58f05e1cec 控制台sudo命令改名su 2021-11-30 12:22:14 +08:00
MrZ626
6b426790c7 调整小程序triple 2021-11-30 11:49:48 +08:00
MrZ626
d4fc578673 词典添加穿透词条 2021-11-30 11:17:17 +08:00
MrZ626
51b567b8db app -list输出美化 2021-11-30 03:53:22 +08:00
MrZ626
07b47dee3f 版本推进 2021-11-30 01:50:13 +08:00
MrZ626
4431a906b9 整理代码 2021-11-30 01:44:21 +08:00
NOT_A_ROBOT
2bb6852e3e Added multiple bg and bgm to Strategy Mode (#506)
(excluding strategy_e for the bgm)
2021-11-30 01:42:39 +08:00
user670
1948ed3e16 Update gameTables.lua (#508)
On an XBox controller, B is on the right and A is on the bottom (unlike a Nintendo controller), and it makes more sense to default B to rotate right and A to rotate left.
2021-11-30 01:42:02 +08:00
MrZ626
81b5ccae30 修复检测第一次启动失败 2021-11-30 01:40:53 +08:00
MrZ626
5543ff0d29 新小程序:Triple 2021-11-30 01:40:49 +08:00
MrZ626
cd567e9e98 删除添加作者qq按钮 2021-11-30 01:40:01 +08:00
MrZ626
5d86925a8a 大多数菜单的二次确认统一用tryXXX管理 2021-11-30 01:40:01 +08:00
MrZ626
e3db564a4b 整理代码,返回需要二次确认的小程序统一用一个函数 2021-11-30 01:40:01 +08:00
MrZ626
a4293624ab 微调wine颜色 2021-11-29 22:24:17 +08:00
MrZ626
367e2dc81a 新增几个tip 2021-11-29 21:32:09 +08:00
MrZ626
9ec33c6eef 修改BGM: sugar fairy的作者标注 2021-11-29 21:32:08 +08:00
MrZ626
9c9b8d36f2 小程序mem平衡调整 2021-11-29 21:32:08 +08:00
MrZ626
4fc6f335c7 新增小程序:Memorize 2021-11-29 15:40:55 +08:00
MrZ626
d2f4123d08 修改两个有数字键盘的小程序的退格键图标 2021-11-29 15:40:40 +08:00
MrZ626
b29d352a1b 把主菜单快捷键加回来 2021-11-29 12:57:17 +08:00
MrZ626
cd5a71cd12 更新赞助名单 2021-11-29 12:49:58 +08:00
MrZ626
cdd68e985d 修正键位设置菜单里mac的del键符号错误 2021-11-29 11:15:24 +08:00
MrZ626
8cf4d4280c 修正Ospin变O后操作序列不清空
Ospin变远端朝下JL时允许水平可移动
2021-11-29 11:11:54 +08:00
C29H25N3O5
cd29bf8702 调整字体
* Monospaced字体简中字库使用大陆标准字形, 日语部分仍然使用日语字形
* 调整自定义图标手柄和键盘部分的文字字体
* 修复proportional字体a的变音符没对齐的问题
* 修复Monospaced字体ij连字的问题
* 修复Monospaced字体slash还用的是plex字体的问题
2021-11-28 18:24:11 -06:00
69 changed files with 1048 additions and 378 deletions

View File

@@ -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,10 +28,10 @@ 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.94, 0.96, 0.91)},
wine= {hsv(0.92, 0.98, 0.91)},
lRed= {hsv(0.00, 0.38, 0.93)},
lFire= {hsv(0.04, 0.45, 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]

View File

@@ -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)

View File

@@ -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)

View File

@@ -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_))
@@ -415,7 +416,6 @@ do
local needSave
if not fs.getInfo('conf/data')then
FIRSTLAUNCH=true
needSave=true
end
if type(STAT.version)~='number'then
@@ -559,7 +559,8 @@ do
end
end
--First start for phones
--First start
FIRSTLAUNCH=STAT.run==0
if FIRSTLAUNCH and MOBILE then
SETTING.VKSwitch=true
SETTING.powerInfo=true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 41 KiB

View File

@@ -97,12 +97,12 @@ do
{131,2,2, 0, 0,0},{131,2,2,-1,-1,0},{131,2,2,-1, 0,0},--S
{131,1,2,-1, 0,0},{131,1,2, 0,-1,0},{131,1,2, 0, 0,0},--Z(misOrder)
{313,2,2, 0, 0,0},{313,2,2,-1,-1,0},{313,2,2,-1, 0,0},--S(misOrder)
{331,3,2, 0,-1,0},--J(farDown)
{113,4,2,-1,-1,0},--L(farDown)
{331,3,2, 0,-1,1},--J(farDown)
{113,4,2,-1,-1,1},--L(farDown)
{113,3,2,-1,-1,0},{113,3,0, 0, 0,0},--J
{331,4,2, 0,-1,0},{331,4,0,-1, 0,0},--L
{222,7,2,-1, 0,2},{222,7,2,-2, 0,2},{222,7,2, 0, 0,2},--I
{222,7,0,-1, 1,1},{222,7,0,-2, 1,1},{222,7,0, 0, 1,1},--I(high)
{222,7,2,-1, 0,2},{222,7,2,-2, 0,2},{222,7,2, 0, 0,2},--I(low)
{121,6,0, 1,-1,2},{112,6,0, 2,-1,2},{122,6,0, 1,-2,2},--O
{323,6,0,-1,-1,2},{332,6,0,-2,-1,2},{322,6,0,-1,-2,2},--O
}--{keys, ID, dir, dx, dy, freeLevel (0=immovable, 1=U/D-immovable, 2=free)}
@@ -204,6 +204,7 @@ do
P.spinLast=2
P.stat.rotate=P.stat.rotate+1
P:freshBlock('move')
C.spinSeq=nil
return
end
end

View 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
View 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
View 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
}

View File

@@ -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
{

View File

@@ -18,8 +18,15 @@ return
if P.modeData.target==200 then
P:win('finish')
else
if P.modeData.target==100 then
if P.modeData.target==40 then
BG.set('rainbow')
elseif P.modeData.target==80 then
BG.set('rainbow2')
elseif P.modeData.target==100 then
BG.set('glow')
P.modeData.lock=6
elseif P.modeData.target==120 then
BG.set('lightning')
end
P.gameEnv.wait=waitSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10

View File

@@ -18,8 +18,16 @@ return
if P.modeData.target==200 then
P:win('finish')
else
if P.modeData.target==100 then
if P.modeData.target==40 then
BG.set('rainbow')
elseif P.modeData.target==80 then
BG.set('rainbow2')
elseif P.modeData.target==100 then
BG.set('glow')
P.modeData.lock=5
BGM.play('secret8th remix')
elseif P.modeData.target==120 then
BG.set('lightning')
end
P.gameEnv.wait=waitSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10

View File

@@ -18,8 +18,16 @@ return
if P.modeData.target==200 then
P:win('finish')
else
if P.modeData.target==100 then
if P.modeData.target==40 then
BG.set('rainbow')
elseif P.modeData.target==80 then
BG.set('rainbow2')
elseif P.modeData.target==100 then
BG.set('glow')
P.modeData.lock=4
BGM.play('secret7th remix')
elseif P.modeData.target==120 then
BG.set('lightning')
end
P.gameEnv.wait=waitSpeed[P.modeData.target/10]
P.modeData.target=P.modeData.target+10

Binary file not shown.

Binary file not shown.

View File

@@ -15,6 +15,42 @@ local playSFX=SFX.play
--System
do--function tryBack()
local sureTime=-1e99
function tryBack()
if TIME()-sureTime<1 then
sureTime=-1e99
return true
else
sureTime=TIME()
MES.new('warn',text.sureQuit)
end
end
end
do--function tryReset()
local sureTime=-1e99
function tryReset()
if TIME()-sureTime<1 then
sureTime=-1e99
return true
else
sureTime=TIME()
MES.new('warn',text.sureReset)
end
end
end
do--function tryDelete()
local sureTime=-1e99
function tryDelete()
if TIME()-sureTime<1 then
sureTime=-1e99
return true
else
sureTime=TIME()
MES.new('warn',text.sureDelete)
end
end
end
do--function loadFile(name,args), function saveFile(data,name,args)
local t=setmetatable({},{__index=function()return"'$1' loading failed: $2"end})
function loadFile(name,args)
@@ -216,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
@@ -237,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)
@@ -820,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)

View File

@@ -675,7 +675,7 @@ do--Userdata tables
r=0,
},
joystick={
dpleft=1,dpright=2,a=3,b=4,y=5,
dpleft=1,dpright=2,b=3,a=4,y=5,
dpup=6,dpdown=7,rightshoulder=8,x=9,
leftshoulder=0,
},
@@ -722,4 +722,4 @@ do--Userdata tables
date=false,
todayTime=0,
}
end
end

View File

@@ -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",

View File

@@ -809,6 +809,11 @@ return{
"term",
"快速震动手指,实现比长按更快速+灵活的高速单点移动主要在经典块的高难度下因为das不可调而且特别慢高速下很容易md导致失败此时手动连点就比自动移动更快或者受特殊情况限制不适合用自动移动时使用。会使用这个技术的人称为“Hypertapper”。",
},
{"穿透 Passthrough",
"穿透 passthrough pingthrough",
"term",
"(攻击)穿透,指双方的攻击明明时间上很接近但没有抵消,互相都收到的现象。\nTETR.IO中自定义房间如果开启passthrough规则曾经天梯默认开启那么对手消行攻击的瞬间能看到自己的红条出现但其处于“无敌时间”内不会触发也不能抵消此时你的攻击会直接打给对手。应该是给攻击的飞行动画预留时间同时也让玩家能反应过来并主动选择要不要抵消要的话就再等一会\n另有pingthrough的说法最终效果同passthrough只是根本原因是不可避免的网络传输延迟。设计比较简单的联网对战块没有特殊考虑的话可能自然就会带有这个机制。",
},
{"TOP攻击表",
"攻击表 top attack",
"term",

View File

@@ -12,6 +12,7 @@ return{
},
sureQuit="Press again to quit",
sureReset="Press again to reset",
sureDelete="Press again to delete",
newDay="A new day, a new beginning!",
playedLong="You have been playing for a long time. Time to a break!",
playedTooMuch="You have been playing for far too long! Techmino is fun, but remember to take some rests!",
@@ -506,7 +507,7 @@ return{
play_clear="Start-Clear",
play_puzzle="Start-Puzzle",
reset="Reset (Del)",
reset="Reset (del)",
advance="More (A)",
mod="Mods (F1)",
field="Edit Field (F)",
@@ -578,7 +579,6 @@ return{
staff="Staff",
his="History",
legals="Legals",
qq="Author's QQ",
},
dict={
title="TetroDictionary",
@@ -625,7 +625,6 @@ return{
title="Account",
},
app_15p={
reset="Shuffle",
color="Color",
invis="Invis",
slide="Slide",
@@ -633,42 +632,33 @@ return{
revKB="Reverse",
},
app_schulteG={
reset="Reset",
rank="Size",
invis="Invis",
disappear="Hide",
tapFX="Tap FX",
},
app_pong={
reset="Restart",
},
app_AtoZ={
level="Level",
keyboard="Keyboard",
reset="Reset",
},
app_2048={
reset="Reset",
invis="Invis",
tapControl="Tap controls",
skip="Skip Round",
},
app_ten={
reset="Reset",
next="Next",
invis="Invis",
fast="Fast",
},
app_dtw={
reset="Reset",
color="Color",
mode="Mode",
bgm="BGM",
arcade="Arcade",
},
app_link={
reset="Reset",
invis="Invis",
},
savedata={

View File

@@ -2,6 +2,7 @@ return{
fallback='en',
sureQuit="Pulsa de nuevo para salir",
-- sureReset="Press again to reset",
-- sureDelete="Press again to delete",
newDay="[Anti-adicción] ¡Nuevo día, nuevo comienzo!",
playedLong="[Anti-adicción] Estuviste jugando un buen rato hoy. Recuerda descansar de vez en cuando.",
playedTooMuch="[Anti-adicción] ¡Has jugado mucho por hoy! No puedes jugar más.",
@@ -535,7 +536,6 @@ return{
staff="Staff",
his="Hist. de Acts.",
-- legals="Legals",
qq="QQ del Autor",
},
dict={
title="TetroDictionary",
@@ -583,7 +583,6 @@ return{
title="Cuenta",
},
app_15p={
reset="Mezclar",
color="Color",
invis="A ciegas",
slide="Mover",
@@ -591,46 +590,34 @@ return{
revKB="Deshacer",
},
app_schulteG={
reset="Reiniciar",
rank="Tamaño",
invis="A ciegas",
disappear="No mostrar",
tapFX="Sonido al pulsar",
},
app_pong={
reset="Reiniciar",
},
app_AtoZ={
level="Nivel",
keyboard="Teclado",
reset="Reiniciar",
},
app_2048={
reset="Reiniciar",
invis="A ciegas",
tapControl="Control táctil",
skip="Saltar ronda",
},
app_ten={
reset="Reiniciar",
next="Siguiente",
invis="A ciegas",
fast="Rápido",
},
app_dtw={
reset="Reiniciar",
color="Color",
mode="Modo",
bgm="BGM",
arcade="Arcade",
},
app_link={
reset="Reiniciar",
invis="A ciegas",
},
app_arithmetic={
reset="Reiniciar",
},
savedata={
export="Exportar al portapapeles",
import="Importar de portapapeles",

View File

@@ -2,6 +2,7 @@ return{
fallback='en',
sureQuit="Appuyez à nouveau pour sortir",
-- sureReset="Press again to reset",
-- sureDelete="Press again to delete",
newDay="[Anti-addiction] Nouveau jour, nouveau commencement !",
playedLong="[Anti-addiction] Vous avez joué pendant un bon bout de temps aujourd'hui. Faites des pauses.",
playedTooMuch="[Anti-addiction] Vous avez joué trop longtemps ! Vous ne pouvez plus jouer.",
@@ -472,7 +473,7 @@ return{
play_clear="Démarrer Clear",
play_puzzle="Démarrer Puzzle",
-- reset="Reset (Del)",
-- reset="Reset (del)",
advance="Plus (A)",
mod="Mods (F1)",
field="Modifier la matrice (F)",
@@ -578,7 +579,6 @@ return{
title="Compte",
},
app_15p={
reset="Réinitialiser",
color="Couleur",
invis="Aveugler",
slide="Glisser",
@@ -586,34 +586,26 @@ return{
revKB="Inverser",
},
app_schulteG={
reset="Réinitialiser",
rank="Taille",
invis="Aveugler",
disappear="Cacher",
tapFX="Effet quand tapé",
},
app_pong={
reset="Redémarrer",
},
app_AtoZ={
level="niveau",
keyboard="Clavier",
reset="Redémarrer",
},
app_2048={
reset="Réinitialiser",
invis="Aveugler",
tapControl="Contrôle par toucher",
skip="Passer Round",
},
app_ten={
reset="Réinitialiser",
next="Prévisualisations",
invis="Aveugler",
-- fast="Fast",
},
app_dtw={
reset="Réinitialiser",
color="Couleur",
mode="Mode",
bgm="Musique",
@@ -623,15 +615,10 @@ return{
staff="Staff",
his="History",
-- legals="Legals",
qq="QQ du créateur",
},
app_link={
reset="Réinitialiser",
invis="Aveugler",
},
app_arithmetic={
reset="Réinitialiser",
},
savedata={
-- export="Export to clipboard",
-- import="Import from clipboard",

View File

@@ -3,6 +3,7 @@ return{
fallback='en',
sureQuit="Aparte novamente para sair",
-- sureReset="Press again to reset",
-- sureDelete="Press again to delete",
newDay="[Anti-vício] Novo dia, um começo novo!",
playedLong="[Anti-vício] Você andou jogando bastante hoje. Certifique-se de fazer pausas.",
playedTooMuch="[Anti-vício] Você esteve jogando demais hoje! Você não pode jogar mais.",
@@ -494,7 +495,7 @@ return{
play_clear="Iniciar-Limpar",
play_puzzle="Iniciar-Puzzle",
-- reset="Reset (Del)",
-- reset="Reset (del)",
advance="Mais (A)",
mod="Mods (F1)",
field="Editar Tab. (F)",
@@ -566,7 +567,6 @@ return{
staff="Staff",
his="History",
-- legals="Legals",
qq="Author's qq",
},
dict={
title="TetroDictionary",
@@ -614,7 +614,6 @@ return{
title="Conta",
},
app_15p={
reset="Embaralhar",
C="Cor",
invis="Cego",
slide="Deslizar",
@@ -622,46 +621,34 @@ return{
revKB="Reverso",
},
app_schulteG={
reset="Resetar",
rank="Tamanho",
invis="Cego",
disappear="Escond.",
tapFX="FX De Toque",
},
app_pong={
reset="Reiniciar",
},
app_AtoZ={
level="Nivel",
keyboard="Teclado",
reset="Reiniciar",
},
app_2048={
reset="Resetar",
invis="Cego",
-- tapControl="Tap control",
-- skip="Skip Round",
},
app_ten={
reset="Resetar",
next="Próxima",
invis="Cego",
-- fast="Fast",
},
app_dtw={
reset="Resetar",
-- color="Color",
-- mode="Mode",
bgm="BGM",
-- arcade="Arcade",
},
app_link={
reset="Resetar",
invis="Cego",
},
app_arithmetic={
reset="Resetar",
},
savedata={
-- export="Export to clipboard",
-- import="Import from clipboard",

View File

@@ -14,6 +14,7 @@ return{
sureQuit="X?",
sureReset="R?",
sureDelete="D?",
newDay="→→!→→",
playedLong="→→→→!, XX□XX!",
playedTooMuch="→→→→→→→→→→→!, XX□XX!!!!!!!",
@@ -149,7 +150,7 @@ return{
},
mod={
title="?!?!?!",
reset="R",
reset="R (tab)",
unranked="X!!!",
},
pause={
@@ -396,7 +397,7 @@ return{
play_clear="Start-Clear",
play_puzzle="Start-Puzzle",
reset="Reset (Del)",
reset="Reset (del)",
advance="More (A)",
mod="?!?!?! (F1)",
field="Edit Field (F)",
@@ -461,7 +462,6 @@ return{
staff="Orz",
his="_&_",
legals="",
qq="_@_",
},
dict={
title="TetroDictionary",
@@ -508,7 +508,6 @@ return{
title="@_@",
},
app_15p={
reset="!@#$%",
color="~~~",
invis="???",
slide="~_~",
@@ -516,34 +515,26 @@ return{
revKB="Reverse",
},
app_schulteG={
reset="!@#$%",
rank="←?→",
invis="???",
disappear="=X=",
tapFX="↓ !",
},
app_pong={
reset="R",
},
app_AtoZ={
level="_ _ _",
keyboard="[##]",
reset="R",
},
app_2048={
reset="R",
invis="???",
tapControl="_↓",
skip=">>",
},
app_ten={
reset="R",
next="",
invis="???",
fast="~~→",
},
app_dtw={
reset="R",
color="~~~",
mode="?",
bgm="#~#",

View File

@@ -140,7 +140,6 @@ return{fallback='zh',
staff="游戏谁写的",
his="黑历史",
legals="正经人谁看啊",
qq="QQ对线",
},
register={
password2="你懂的",

View File

@@ -12,6 +12,7 @@ return{
},
sureQuit="再按一次退出",
sureReset="再按一次重置",
sureDelete="再按一次删除",
newDay="新的一天,新的开始~",
playedLong="已经玩很久了!注意休息!",
playedTooMuch="今天玩太久啦!打块好玩但也要适可而止哦~",
@@ -505,7 +506,7 @@ return{
play_clear="开始-消除",
play_puzzle="开始-拼图",
reset="重置所有(Del)",
reset="重置所有(del)",
advance="更多设置(A)",
mod="Mods (F1)",
field="场地编辑(F)",
@@ -593,7 +594,6 @@ return{
staff="制作人员",
his="更新历史",
legals="法律信息",
qq="作者QQ",
},
dict={
title="小Z方块词典",
@@ -624,7 +624,6 @@ return{
title="帐户",
},
app_15p={
reset="打乱",
color="颜色",
invis="盲打",
slide="滑动操作",
@@ -632,50 +631,35 @@ return{
revKB="键盘反向",
},
app_schulteG={
reset="重来",
rank="尺寸",
invis="盲打",
disappear="消失",
tapFX="点击动画",
},
app_pong={
reset="重置",
},
app_AtoZ={
level="关卡",
keyboard="键盘",
reset="重置",
},
app_UTTT={
reset="重置",
},
app_2048={
reset="重置",
invis="盲打",
tapControl="点击操作",
skip="跳过回合",
},
app_ten={
reset="重置",
next="预览",
invis="盲打",
fast="速打",
},
app_dtw={
reset="重置",
color="颜色",
mode="模式",
bgm="音乐",
arcade="街机",
},
app_link={
reset="重置",
invis="盲打",
},
app_arithmetic={
reset="重置",
},
savedata={
export="导出到剪切板",
import="从剪切板导入",
@@ -792,7 +776,6 @@ return{
"……,合群了就会消失,但消失不代表没有意义",
"……,没有对比就没有伤害",
"“Techmino.app”将对您的电脑造成伤害。您应该将它移到废纸篓。",
"“TechminOS”",
"(a+b)³=a³+3a²b+3ab²+b³",
"(RUR'U')R'FR2U'R'U'(RUR'F')",
"《按钮风格进化史》",
@@ -854,6 +837,8 @@ return{
"触摸板打osu也很好",
"凑数tip什么时候能站起来",
"打好块跟学习一样没有捷径,多练。",
"打铁.png",
"打铁",
"打网络对战前请确认自己有一定的水平,不然会毫无游戏体验的",
"大概还是有人会看tip的",
"大量使用开局定式的数据是不准的",
@@ -918,6 +903,7 @@ return{
"绝大多数按钮上的图标是调用Unicode私用区里的自制字符实现的",
"觉得移动速度太慢或太快手感不好快去设置调整DAS/ARR",
"开启省流模式后将不会加载用户头像(应该能省不少流吧)",
"科技骨牌 你的创新式块堆栈业务技术管理器",
"块东V共荣",
"快去打一把100%极简看看会怎样",
"锟斤拷锟斤拷锟斤拷",
@@ -944,6 +930,7 @@ return{
"你们考虑过Z酱的感受吗没有你们只考虑你自己。",
"你说彩蛋?嗯…算是有,可以找找",
"你有一个好",
"你这场地是金子堆的还是块是金子做的",
"你知道吗[001]看主页机器人玩可能比较费电",
"你知道吗[002]全程不使用任何旋转键完成40行模式是有可能的",
"你知道吗[003]全程不使用左右移动键完成40行模式是有可能的",
@@ -959,7 +946,7 @@ return{
"请勿使用三只手游玩",
"去玩别的方块的时候记得没有Ospin",
"全球目前应该没人能全X评价(大爆炸不算)",
"群友翻译的中文方块百科全书! tetris.huijiwiki.com",
"群友翻译的中文方块百科全书tetris.huijiwiki.com",
"让他三尺又何妨",
"如何O-spin: 一秒转626圈(误",
"三连块只有2种",
@@ -1042,7 +1029,7 @@ return{
"有建议的话可以把信息反馈给作者~",
"有两个模式是以东方Project里的角色为主题的",
"有一些隐藏模式不能从地图进入,到处找找看吧",
"有疑问? 先看设置有没有你想要的",
"有疑问?先看设置有没有你想要的",
"右下角那个问号按钮是游戏说明书 (开了简洁模式当我没说)",
"长期睡眠不足会引起不可逆的脑损伤(变傻)",
"这不是休闲游戏……别怪关卡要求太高,多练吧",
@@ -1114,6 +1101,8 @@ return{
"Techmino 濂界帺锛",
"Techmino 英['tɛkmɪnəʊ] 美/'tekmɪnoʊ/ n.铁壳米诺(游戏名)",
"Techmino console了解一下",
"Techmino: App意外退出。",
"Techmino.exe 已停止工作",
"Techmino安卓下载",
"Techmino不是工业产品也不是练手程序是游戏作品(至少目前是,嗯……)",
"Techmino好玩",
@@ -1125,10 +1114,12 @@ return{
"Techmino怎么念啊",
"techminohaowan",
"techminoisfun",
"TechminOS coming s∞n",
"viod main[]",
"while(false)",
"Z酱竟是我自己",
"Z酱累了Z酱不想更新",
"Z酱是谁",
"Z酱只是个写代码的懂什么方块",
"Z块等身抱枕来一个(x",
{C.C,"<PURE ",C.P,"MEMORY>"},
@@ -1163,13 +1154,15 @@ 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,""},
{C.R,"DT",C.Z,"炮=",C.P,"TS",C.R,"D",C.Z,"+",C.P,"TS",C.R,"T",C.Z,""},
{C.R,"LrL ",C.G,"RlR ",C.B,"LLr ",C.O,"RRl ",C.P,"RRR LLL ",C.C,"FFF ",C.Y,"RfR RRf rFF"},
{C.W,"uid:225238922"},
{C.Y,"<φ> 10000"},
{C.Y,"10000 φ"},
{C.Y,"暂定段位:GM"},
{C.Y,"暂定段位:M"},
{C.Y,"暂定段位:MK"},

View File

@@ -12,6 +12,7 @@ return{
},
sureQuit="再次按退出",
sureReset="再次按下可重置",
sureDelete="再次按可删除",
newDay="新的一天,新的开始!",
playedLong="你已经玩了很长时间了。一定要好好休息!",
playedTooMuch="你玩得太久了!玩方块游戏很有趣,但现在是休息的时候了。",
@@ -503,7 +504,7 @@ return{
play_clear="清场",
play_puzzle="开始拼图",
reset="复位(Del)",
reset="复位(del)",
advance="更多(A)",
mod="多重器官衰竭(F1)",
field="编辑字段(F)",
@@ -575,7 +576,6 @@ return{
staff="工作人员",
his="历史",
legals="法律",
qq="作者QQ",
},
dict={
title="四联词典",
@@ -622,7 +622,6 @@ return{
title="帐户",
},
app_15p={
reset="洗牌",
color="颜色",
invis="英维斯",
slide="滑动",
@@ -635,9 +634,6 @@ return{
disappear="隐藏",
tapFX="Tap外汇",
},
app_pong={
reset="重新启动",
},
app_AtoZ={
level="水平仪",
keyboard="键盘",

View File

@@ -12,6 +12,7 @@ return{
},
sureQuit="再按一次退出",
sureReset="再按一次重設",
sureDelete="再按一次删除",
newDay="新的一天,新的開始~",
playedLong="你玩太久了!注意休息!",
playedTooMuch="今天玩得太久啦Techmino好玩但也要注意休息哦~",
@@ -504,7 +505,7 @@ return{
play_clear="開始-清除",
play_puzzle="開始-拼圖",
reset="重設所有(Del)",
reset="重設所有(del)",
advance="更多設置(A)",
mod="Mods (F1)",
field="場地編輯(F)",
@@ -592,7 +593,6 @@ return{
staff="製作人員",
his="更新曆史",
legals="法律信息",
qq="作者QQ",
},
dict={
title="小Z方塊詞典",
@@ -623,7 +623,6 @@ return{
title="賬戶",
},
app_15p={
reset="打亂",
color="顏色",
invis="盲打",
slide="滑動操作",
@@ -631,50 +630,35 @@ return{
revKB="鍵盤反向",
},
app_schulteG={
reset="重新啟動",
rank="尺寸",
invis="盲打",
disappear="消失",
tapFX="點擊動畫",
},
app_pong={
reset="重設",
},
app_AtoZ={
level="等級",
keyboard="鍵盤",
reset="重設",
},
app_UTTT={
reset="重設",
},
app_2048={
reset="重設",
invis="盲打",
tapControl="點擊操作",
skip="跳過回合",
},
app_ten={
reset="重設",
next="預覽",
invis="盲打",
fast="速打",
},
app_dtw={
reset="重設",
color="顏色",
mode="模式",
bgm="音樂",
arcade="街機",
},
app_link={
reset="重設",
invis="盲打",
},
app_arithmetic={
reset="重設",
},
savedata={
export="導出到剪貼板",
import="從剪貼板導入",

28
parts/modes/big_h.lua Normal file
View 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
View 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,
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -128,4 +128,5 @@ return{
{font=25,name="Hathtiz"},
{font=25,name="江江江江17"},
{font=25,name="TetraCepra"},
{font=25,name="爱抢姐姐布丁的芙兰酱(CHNO)"},
}

View File

@@ -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

View File

@@ -57,9 +57,8 @@ scene.widgetList={
WIDGET.newImage{name='pay1', x=20, y=20,hide=SYSTEM=='iOS'},
WIDGET.newImage{name='pay2', x=1014,y=20,hide=SYSTEM=='iOS'},
WIDGET.newButton{name='staff', x=1140,y=380,w=220,h=80,font=35,code=goScene'staff'},
WIDGET.newButton{name='his', x=1140,y=470,w=220,h=80,font=35,code=goScene'history'},
WIDGET.newButton{name='legals', x=1140,y=560,w=220,h=80,font=35,code=goScene'legals'},
WIDGET.newButton{name='qq', x=1140,y=650,w=220,h=80,font=35,code=function()love.system.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,hide=MOBILE},
WIDGET.newButton{name='his', x=1140,y=480,w=220,h=80,font=35,code=goScene'history'},
WIDGET.newButton{name='legals', x=1140,y=580,w=220,h=80,font=35,code=goScene'legals'},
WIDGET.newButton{name='back', x=640, y=600,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
}

View File

@@ -303,13 +303,13 @@ 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
scene.widgetList={
WIDGET.newButton{name='reset', x=160, y=100,w=180,h=100,color='lG',font=40,code=pressKey'space'},
WIDGET.newButton{name='reset', x=160, y=100,w=180,h=100,color='lG',font=50,fText=CHAR.icon.retry_spin,code=pressKey'space'},
colorSelector,
WIDGET.newSwitch{name='invis', x=240, y=330,lim=200,font=40,disp=function()return invis end, code=pressKey'w',hideF=ifGaming},
WIDGET.newSwitch{name='slide', x=240, y=420,lim=200,font=40,disp=function()return slide end, code=pressKey'e',hideF=ifGaming},

View File

@@ -331,7 +331,7 @@ function scene.keyDown(key,isRep)
elseif key=='escape'then
if repeater.focus then
repeater.focus=false
else
elseif tryBack()then
SCN.back()
end
end
@@ -480,7 +480,7 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newButton{name='reset', x=155, y=100,w=180,h=100,color='lG',font=40,code=pressKey'r'},
WIDGET.newButton{name='reset', x=155, y=100,w=180,h=100,color='lG',font=50,fText=CHAR.icon.retry_spin,code=pressKey'r'},
WIDGET.newSwitch{name='invis', x=240, y=300,lim=200,font=40,disp=function()return invis end,code=pressKey'q',hideF=function()return state==1 end},
WIDGET.newSwitch{name='tapControl',x=240, y=370,lim=200,font=40,disp=function()return tapControl end,code=pressKey'w',hideF=function()return state==1 end},

View File

@@ -117,7 +117,7 @@ end
scene.widgetList={
WIDGET.newSelector{name='level', x=640,y=640,w=200,list={'A_Z','Z_A','Tech1','Tech2','KeyTest1','KeyTest2','Hello','Roll1','Roll2','Roll3','ZZZ','ZXZX','ZMZM','Stair','Stair2','Stair3','BPW'},disp=function()return levelName end,code=function(i)levelName=i;targetString=levels[i]end,hideF=function()return state>0 end},
WIDGET.newButton{name='reset', x=160,y=100,w=180,h=100,color='lG',font=40,code=pressKey'space'},
WIDGET.newButton{name='reset', x=160,y=100,w=180,h=100,color='lG',font=50,fText=CHAR.icon.retry_spin,code=pressKey'space'},
WIDGET.newButton{name='keyboard',x=160,y=210,w=180,h=100,code=function()love.keyboard.setTextInput(true,0,select(2,SCR.xOy:transformPoint(0,500)),1,1)end,hide=not MOBILE},
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
}

View File

@@ -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)
@@ -231,7 +231,7 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newButton{name='reset',x=1140,y=540,w=170,h=80,font=40,color='lG',code=restart},
WIDGET.newButton{name='reset',x=1140,y=540,w=170,h=80,font=50,fText=CHAR.icon.retry_spin,color='lG',code=restart},
WIDGET.newButton{name='back',x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
}

View File

@@ -185,7 +185,9 @@ function scene.keyDown(key,isRep)
elseif key=='r'then
reset()
elseif key=='escape'then
SCN.back()
if tryBack()then
SCN.back()
end
end
end
@@ -216,8 +218,8 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newButton{name='reset',x=155,y=100,w=180,h=100,color='lG',font=40,code=pressKey'r'},
WIDGET.newKey{name='X',x=540,y=620,w=90,font=60,fText="X",code=pressKey'backspace'},
WIDGET.newButton{name='reset',x=155,y=100,w=180,h=100,color='lG',font=50,fText=CHAR.icon.retry_spin,code=pressKey'r'},
WIDGET.newKey{name='X',x=540,y=620,w=90,font=60,fText=CHAR.key.clear,code=pressKey'backspace'},
WIDGET.newKey{name='0',x=640,y=620,w=90,font=60,fText="0",code=pressKey'0'},
WIDGET.newKey{name='-',x=740,y=620,w=90,font=60,fText="-",code=pressKey'-'},
WIDGET.newKey{name='1',x=540,y=520,w=90,font=60,fText="1",code=pressKey'1'},

View File

@@ -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)
@@ -161,7 +163,7 @@ scene.widgetList={
WIDGET.newKey{name='-',x=445,y=400,w=90,sound=false,fText="-",color='lB',font=50,code=pressKey'-'},
WIDGET.newKey{name='*',x=445,y=500,w=90,sound=false,fText="*",color='lB',font=50,code=pressKey'*'},
WIDGET.newKey{name='/',x=445,y=600,w=90,sound=false,fText="/",color='lB',font=50,code=pressKey'/'},
WIDGET.newKey{name='<',x=545,y=300,w=90,sound=false,fText="<",color='lR',font=50,code=pressKey'backspace'},
WIDGET.newKey{name='<',x=545,y=300,w=90,sound=false,fText=CHAR.key.backspace,color='lR',font=50,code=pressKey'backspace'},
WIDGET.newKey{name='=',x=545,y=400,w=90,sound=false,fText="=",color='lY',font=50,code=pressKey'return'},
WIDGET.newKey{name='back',x=1135,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
}

View File

@@ -28,7 +28,9 @@ function scene.keyDown(key,isRep)
vy=pow*sin(ang)/2.6
end
elseif key=='escape'then
SCN.back()
if tryBack()then
SCN.back()
end
end
end
function scene.mouseDown(_,_,k)

View File

@@ -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"
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, original by ImpactBlue Studios"
description="Polyforge. Original by ImpactBlue Studios"
},
{
code="link",
@@ -618,17 +618,27 @@ local commands={}do
scene='app_piano',
description="A simple keyboard piano"
},
{
code="mem",
scene='app_memorize',
description="Number memorize"
},
{
code="trp",
scene='app_triple',
description="A Match-3 Game. Original idea from Sanlitun / Triple Town"
},
{
code="spin",
scene='app_spin',
description="???"
description="¿"
},
}
commands.app={
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
@@ -698,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(信息)函数在控制台打印信息 *"}
@@ -713,7 +723,7 @@ local commands={}do
log{C.Y,"Password incorrect"}
end
end,
}commands.su="sudo"
}
--Game
commands.rmconf={
@@ -1011,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)

View File

@@ -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

View File

@@ -62,7 +62,9 @@ function scene.keyDown(key,isRep)
state='move'
end
elseif key=='escape'then
SCN.back()
if tryBack()then
SCN.back()
end
end
end
function scene.mouseDown(_,_,k)

View File

@@ -380,7 +380,7 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newButton{name='reset',x=155,y=100,w=180,h=100,color='lG',font=40,code=pressKey'r'},
WIDGET.newButton{name='reset',x=155,y=100,w=180,h=100,color='lG',font=50,fText=CHAR.icon.retry_spin,code=pressKey'r'},
modeSelector,bgmSelector,colorSelector,
arcadeSwitch,
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},

View File

@@ -51,7 +51,6 @@ local iconList={
}
gc.setDefaultFilter('linear','linear')
local sure=0
local invis
local state
local startTime,time
@@ -253,20 +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 or sure>.2 then
if state~=1 or tryBack()then
SCN.back()
else
sure=1
MES.new('info',"Press again")
end
elseif state==0 then
if key=='q'then
@@ -291,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
@@ -308,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
@@ -347,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
@@ -362,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)
@@ -399,7 +397,7 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newButton{name='reset',x=80,y=60,w=110,h=60,color='lG',code=pressKey'r',hideF=function()return state==0 end},
WIDGET.newButton{name='reset',x=80,y=60,w=110,h=60,color='lG',fText=CHAR.icon.retry_spin,code=pressKey'r',hideF=function()return state==0 end},
WIDGET.newSwitch{name='invis',x=100,y=140,lim=80,disp=function()return invis end,code=pressKey'q',hideF=function()return state==1 end},
WIDGET.newButton{name='back',x=1200,y=660,w=110,font=50,fText=CHAR.icon.back,code=pressKey'escape'},
}

View File

@@ -0,0 +1,126 @@
local gc=love.graphics
local state--0=playing, 1=gameover
local timeUsed
local level
local showNum
local showTime
local input
local inputTime
local scene={}
local function newNum(lv)
local num=""
for _=1,4+lv^.66 do num=num..math.random(0,9)end
return num
end
local function freshLevel()
showNum=newNum(level)
showTime=math.max(4-level,0)+#showNum*math.max(.5-#showNum*.01,.3)
inputTime=2+#showNum*math.max(1-#showNum*.01,.626)
input=''
end
local function _reset()
state=0
timeUsed=0
level=1
freshLevel()
end
function scene.sceneInit()
state=1
timeUsed=0
level=0
input=''
showNum='memoriZe'
BGM.play('reason')
end
function scene.keyDown(key,isRep)
if isRep then return end
if key=='escape'then
if tryBack()then
SCN.back()
end
elseif key=='r'then
_reset()
elseif state==0 then
if key:sub(1,2)=="kp"then key=key:sub(3)end
if #key==1 and("0123456789"):find(key,nil,true)then
input=input..key
showTime=math.min(showTime,0)
if input==showNum then
level=level+1
freshLevel()
SFX.play('reach')
end
elseif key=='space'or key=='backspace'then
input=""
end
end
end
function scene.update(dt)
if state==0 then
showTime=showTime-dt
if showTime<=0 then
timeUsed=timeUsed+dt
inputTime=inputTime-dt
if inputTime<=0 then
inputTime=0
state=1
SFX.play('finesseError_long',.6)
end
end
end
end
function scene.draw()
gc.setColor(COLOR.Z)
FONT.set(45)
gc.print(("%.3f"):format(timeUsed),1026,70)
FONT.set(35)
GC.mStr("["..level.."]",640,30)
FONT.set(60)
GC.mStr(input,640,160)
if state==0 then
if showTime<=0 then
FONT.set(30)
gc.setColor(1,.7,.7,-3*showTime)
GC.mStr(("%.1f"):format(inputTime),640,230)
end
gc.setColor(1,1,1,showTime/1.26)
else
gc.setColor(1,.4,.4)
end
if #showNum<=10 then
FONT.set(100)
GC.mStr(showNum,640,60)
else
FONT.set(60)
GC.mStr(showNum,640,90)
end
end
scene.widgetList={
WIDGET.newButton{name='reset',x=155,y=100,w=180,h=100,color='lG',font=50,fText=CHAR.icon.retry_spin,code=pressKey'r'},
WIDGET.newKey{name='X',x=540,y=620,w=90,font=60,fText=CHAR.key.clear,code=pressKey'backspace'},
WIDGET.newKey{name='0',x=640,y=620,w=90,font=60,fText="0",code=pressKey'0'},
WIDGET.newKey{name='1',x=540,y=520,w=90,font=60,fText="1",code=pressKey'1'},
WIDGET.newKey{name='2',x=640,y=520,w=90,font=60,fText="2",code=pressKey'2'},
WIDGET.newKey{name='3',x=740,y=520,w=90,font=60,fText="3",code=pressKey'3'},
WIDGET.newKey{name='4',x=540,y=420,w=90,font=60,fText="4",code=pressKey'4'},
WIDGET.newKey{name='5',x=640,y=420,w=90,font=60,fText="5",code=pressKey'5'},
WIDGET.newKey{name='6',x=740,y=420,w=90,font=60,fText="6",code=pressKey'6'},
WIDGET.newKey{name='7',x=540,y=320,w=90,font=60,fText="7",code=pressKey'7'},
WIDGET.newKey{name='8',x=640,y=320,w=90,font=60,fText="8",code=pressKey'8'},
WIDGET.newKey{name='9',x=740,y=320,w=90,font=60,fText="9",code=pressKey'9'},
WIDGET.newButton{name='back',x=1200,y=660,w=110,h=60,font=60,fText=CHAR.icon.back,code=backScene},
}
return scene

View File

@@ -45,7 +45,9 @@ end
function scene.keyDown(key,isRep)
if isRep then return end
if key=='escape'then
SCN.back()
if tryBack()then
SCN.back()
end
elseif key=='space'then
if state==0 then--main
if timer==0 then
@@ -157,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

View File

@@ -176,7 +176,7 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newKey{name='reset',x=640,y=45,w=150,h=50,font=35,code=pressKey'r'},
WIDGET.newKey{name='reset',x=640,y=45,w=150,h=50,font=35,fText=CHAR.icon.retry_spin,code=pressKey'r'},
WIDGET.newKey{name='back',x=640,y=675,w=150,h=50,font=40,fText=CHAR.icon.back,code=backScene},
}

View File

@@ -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)
@@ -166,7 +170,7 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newButton{name='reset', x=160,y=100,w=180,h=100,color='lG',font=40,code=pressKey'space',hideF=function()return state==0 end},
WIDGET.newButton{name='reset', x=160,y=100,w=180,h=100,color='lG',font=50,fText=CHAR.icon.retry_spin,code=pressKey'space',hideF=function()return state==0 end},
WIDGET.newSlider{name='rank', x=130,y=250,lim=105,w=150,unit=3,show=false,font=40,disp=function()return rank-3 end,code=function(v)rank=v+3 end,hideF=function()return state>0 end},
WIDGET.newSwitch{name='invis', x=240,y=330,lim=200,font=40,disp=function()return invis end, code=pressKey'q',hideF=function()return state==1 end},
WIDGET.newSwitch{name='disappear',x=240,y=420,lim=200,font=40,disp=function()return disappear end,code=pressKey'w',hideF=function()return state==1 end},

View File

@@ -109,11 +109,11 @@ local function merge()
end
if chosen>=5 then
SFX.play(
chosen>=9 and"ren_mega"or
chosen>=8 and"spin_3"or
chosen>=7 and"spin_2"or
chosen>=6 and"spin_1"or
"spin_0"
chosen>=9 and'ren_mega'or
chosen>=8 and'spin_3'or
chosen>=7 and'spin_2'or
chosen>=6 and'spin_1'or
'spin_0'
)
end
fallingTimer=fast and 8 or 12
@@ -157,7 +157,9 @@ function scene.keyDown(key,isRep)
fast=not fast
end
elseif key=='escape'then
SCN.back()
if tryBack()then
SCN.back()
end
end
end
function scene.mouseMove(x,y)
@@ -239,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)
@@ -302,7 +304,7 @@ function scene.draw()
end
scene.widgetList={
WIDGET.newButton{name='reset',x=160,y=100,w=180,h=100,color='lG',font=40,code=pressKey'r'},
WIDGET.newButton{name='reset',x=160,y=100,w=180,h=100,color='lG',font=50,fText=CHAR.icon.retry_spin,code=pressKey'r'},
WIDGET.newSwitch{name='next', x=240,y=235,lim=200,font=40,disp=function()return nexts end,code=pressKey'q',hideF=function()return state==1 end},
WIDGET.newSwitch{name='invis',x=240,y=305,lim=200,font=40,disp=function()return invis end,code=pressKey'w',hideF=function()return state==1 end},
WIDGET.newSwitch{name='fast', x=240,y=375,lim=200,font=30,disp=function()return fast end,code=pressKey'e',hideF=function()return state==1 end},

350
parts/scenes/app_triple.lua Normal file
View File

@@ -0,0 +1,350 @@
local gc=love.graphics
local setColor,rectangle=gc.setColor,gc.rectangle
local int,rnd=math.floor,math.random
local ins,rem=table.insert,table.remove
local setFont,mStr=FONT.set,GC.mStr
local tileColor={
[-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={
[-2]=COLOR.dR,
[-1]=COLOR.dH,
{.26, .66, .26},
{.26, .26, .66},
{.66, .46, .20},
{.62, .20, .20},
{.00, .48, .08},
{.60, .14, .60},
{.62, .32, .26},
{.60, .00, .00},
{.58, .58, .20},
{.52, .20, .00},
{.52, .36, .20},
{.08, .80, .34},
}
local tileTexts=setmetatable({
[-1]="×",
},{__index=function(self,k)self[k]=k return k end})
local player={x=340,y=90}
function player:newTile()
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
end
function player:reset()
self.progress={}
self.state=0
self.time=0
self.startTime=false
self.score=0
self.maxTile=3
self.nexts,self.hold={self:newTile(),self:newTile(),self:newTile()},false
self.selectX,self.selectY=false,false
self.board={}
for y=1,6 do
self.board[y]={}
for x=1,6 do
self.board[y][x]=0
end
end
self.board[1][1]=false
for _,n in next,{-1,-1,1,1,2,2,3,3}do
local x,y
repeat
x,y=rnd(6),rnd(6)
until not(x==1 and y==1)and self.board[y][x]==0
self.board[y][x]=n
end
end
function player:merge(b,v,y,x)
if b[y]and v==b[y][x]then
ins(self.mergedTiles,{y,x})
b[y][x]=0
return 1
+self:merge(b,v,y,x-1)
+self:merge(b,v,y,x+1)
+self:merge(b,v,y-1,x)
+self:merge(b,v,y+1,x)
else
return 0
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]
SFX.play('hold')
if not self.nexts[1] then
rem(self.nexts,1)
ins(self.nexts,self:newTile())
end
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
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
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
end
else
self.selectX,self.selectY=x,y
end
end
local function drawTile(x,y,v)
if v and v~=0 then
setColor(tileColor[v])
rectangle('fill',x*100-100,y*100-100,100,100)
setColor(textColor[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(COLOR.dX)
rectangle("fill",0,0,600,600)
--Hold slot
setColor(0,1,1,.4)
rectangle("fill",0,0,100,100)
gc.setLineWidth(10)
setColor(COLOR.lC)
rectangle("line",5,5,90,90)
--Hold tile
setFont(60)
drawTile(1,1,self.hold)
--Board tiles
local b=self.board
for y=1,6 do for x=1,6 do
drawTile(x,y,b[y][x])
end end
--Board lines
setColor(COLOR.Z)
gc.setLineWidth(2)
for x=1,5 do gc.line(x*100,0,x*100,600)end
for y=1,5 do gc.line(0,y*100,600,y*100)end
gc.setLineWidth(6)
rectangle("line",0,0,600,600)
--Select box
if self.selectX then
local c=tileColor[self.nexts[1]]
setColor(c[1],c[2],c[3],.6+.3*math.sin(TIME()*9.29))
rectangle("line",self.selectX*100-95,self.selectY*100-95,90,90)
end
gc.pop()
end
local scene={}
function scene.sceneInit()
player:reset()
BGM.play('truth')
end
function scene.mouseDown(x,y)
x,y=int((x-player.x)/100)+1,int((y-player.y)/100)+1
if x>=1 and x<=6 and y>=1 and y<=6 then
player:click(y,x)
end
end
function scene.keyDown(key,isRep)
if isRep then return end
if key=='up'or key=='down'or key=='left'or key=='right'then
if not player.selectX then
player.selectX,player.selectY=3,3
else
if key=='up'then player.selectY=math.max(player.selectY-1,1)
elseif key=='down'then player.selectY=math.min(player.selectY+1,6)
elseif key=='left'then player.selectX=math.max(player.selectX-1,1)
elseif key=='right'then player.selectX=math.min(player.selectX+1,6)
end
end
elseif key=='z'or key=='space'then
if not player.selectX then
player.selectX,player.selectY=3,3
else
local y,x=player.selectY,player.selectX
player:click(player.selectY,player.selectX)
player.selectY,player.selectX=y,x
end
elseif key=='x'then
player:click(1,1)
elseif key=='r'then
if player.state~=1 or tryReset()then
player:reset()
end
elseif key=='escape'then
if tryBack()then
SCN.back()
end
end
end
function scene.update()
if player.state==1 then
player.time=TIME()-player.startTime
end
end
function scene.draw()
setFont(40)
setColor(1,1,1)
gc.print(("%.3f"):format(player.time),1026,50)
gc.print(player.score,1026,100)
--Progress time list
setFont(25)
setColor(.7,.7,.7)
for i=1,#player.progress do
gc.print(player.progress[i],1000,140+30*i)
end
gc.push('transform')
gc.translate(745,13)
setColor(COLOR.Z)
gc.setLineWidth(4)
gc.rectangle("line",-5,-5,200,70)
for i=1,3 do
setColor(tileColor[player.nexts[i]])
rectangle('fill',65*i-65,0,60,60)
setFont(40)
setColor(textColor[player.nexts[i]])
mStr(player.nexts[i],65*i-35,0)
end
gc.pop()
player:drawBoard()
end
scene.widgetList={
WIDGET.newButton{name='reset',x=160,y=100,w=180,h=100,color='lG',font=50,fText=CHAR.icon.retry_spin,code=pressKey'r'},
WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
}
return scene

View File

@@ -24,9 +24,7 @@ local sList={
local scene={}
local sure
function scene.sceneInit()
sure=0
destroyPlayers()
BG.set(CUSTOMENV.bg)
BGM.play(CUSTOMENV.bgm)
@@ -80,7 +78,7 @@ function scene.keyDown(key,isRep)
elseif key=='m'then
SCN.go('custom_mission','swipeD')
elseif key=='delete'then
if sure>.3 then
if tryReset()then
TABLE.cut(FIELD)TABLE.cut(BAG)TABLE.cut(MISSION)
FIELD[1]=DATA.newBoard()
TABLE.clear(CUSTOMENV)
@@ -90,13 +88,9 @@ function scene.keyDown(key,isRep)
saveFile(DATA.copyBoards(),'conf/customBoards')
saveFile(DATA.copySequence(),'conf/customSequence')
saveFile(CUSTOMENV,'conf/customEnv')
sure=0
SFX.play('finesseError',.7)
BG.set(CUSTOMENV.bg)
BGM.play(CUSTOMENV.bgm)
else
sure=1
MES.new('info',text.sureReset)
end
elseif key=='f1'then
SCN.go('mod','swipeD')
@@ -129,10 +123,6 @@ function scene.keyDown(key,isRep)
end
end
function scene.update(dt)
if sure>0 then sure=sure-dt end
end
function scene.draw()
gc.translate(0,-WIDGET.scrollPos)
setFont(30)

View File

@@ -7,7 +7,6 @@ local ins,rem=table.insert,table.remove
local FIELD=FIELD
local scene={}
local sure
local curPen
local pens={-2,0,-1,[false]=false}--Color (air/smart)
local penMode
@@ -119,7 +118,6 @@ local function _pDraw()
end
function scene.sceneInit()
sure=0
curPen=false
penMode=0
penX,penY=1,1
@@ -182,13 +180,9 @@ function scene.keyDown(key)
_pTouch(penX,penY)
end
elseif key=='delete'then
if sure>.3 then
if tryReset()then
FIELD[page]=DATA.newBoard()
sure=0
SFX.play('finesseError',.7)
else
sure=1
MES.new('info',text.sureReset)
end
elseif key=='j'then
demo=not demo
@@ -265,12 +259,6 @@ function scene.keyUp(key)
end
end
function scene.update(dt)
if sure>0 then
sure=sure-dt
end
end
function scene.draw()
gc.translate(200,60)

View File

@@ -8,12 +8,10 @@ local scene={}
local input--Input buffer
local cur--Cursor position
local sure
function scene.sceneInit()
input=""
cur=#MISSION
sure=0
end
function scene.sceneBack()
saveFile(DATA.copyMission(),'conf/customMissions')
@@ -62,14 +60,10 @@ function scene.keyDown(key)
end
end
elseif key=='delete'then
if sure>.3 then
if tryReset()then
TABLE.cut(MISSION)
cur=0
sure=0
SFX.play('finesseError',.7)
else
sure=1
MES.new('info',text.sureReset)
end
elseif key=='c'and kb.isDown('lctrl','rctrl')or key=='cC'then
if #MISSION>0 then
@@ -117,12 +111,6 @@ function scene.keyDown(key)
end
end
function scene.update(dt)
if sure>0 then
sure=sure-dt
end
end
function scene.draw()
--Draw frame
gc.setLineWidth(2)

View File

@@ -9,11 +9,9 @@ local gc_setColor,gc_print=gc.setColor,gc.print
local scene={}
local cur--Cursor position
local sure
function scene.sceneInit()
cur=#BAG
sure=0
end
function scene.sceneBack()
saveFile(DATA.copySequence(),'conf/customSequence')
@@ -66,14 +64,10 @@ function scene.keyDown(key)
cur=cur-1
end
elseif key=='delete'then
if sure>.3 then
if tryReset()then
TABLE.cut(BAG)
cur=0
sure=0
SFX.play('finesseError',.7)
else
sure=1
MES.new('info',text.sureReset)
end
elseif key=='='then
local l={1,2,3,4,5,6,7}
@@ -119,12 +113,6 @@ function scene.keyDown(key)
end
end
function scene.update(dt)
if sure>0 then
sure=sure-dt
end
end
local blockCharWidth={}for i=1,#BLOCK_CHARS do blockCharWidth[i]=gc.newText(FONT.get(60),BLOCK_CHARS[i]):getWidth()end
function scene.draw()
--Draw frame

View File

@@ -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

View File

@@ -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},

View File

@@ -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)

View File

@@ -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())
@@ -46,15 +44,79 @@ function scene.mouseDown(x,y)
end
end
scene.touchDown=scene.mouseDown
local function _testButton(n)
if NET.getlock('access_and_login')then
MES.new('warn',text.wsConnecting)
else
if WIDGET.isFocus(scene.widgetList[n])then
return true
else
WIDGET.focus(scene.widgetList[n])
end
end
end
function scene.keyDown(key,isRep)
if isRep then return true end
if key=='escape'then
if TIME()-lastQuitTime<1 then
if key=='1'then
if _testButton(1)then
SCN.go('mode')
end
elseif key=='q'then
if _testButton(2)then
loadGame(STAT.lastPlay,true)
end
elseif key=='a'then
if _testButton(3)then
if WS.status('app')=='running'then
NET.tryLogin(false)
elseif WS.status('app')=='dead'then
NET.wsconn_app()
SFX.play('connect')
MES.new('info',text.wsConnecting)
end
end
elseif key=='z'then
if _testButton(4)then
SCN.go('customGame')
end
elseif key=='-'then
if _testButton(5)then
SCN.go('setting_game')
end
elseif key=='p'then
if _testButton(6)then
SCN.go('stat')
end
elseif key=='l'then
if _testButton(7)then
SCN.go('dict')
end
elseif key==','then
if _testButton(8)then
SCN.go('replays')
end
elseif key=='2'then
if _testButton(9)then
SCN.go('music')
end
elseif key=='3'then
if _testButton(10)then
SCN.go('lang')
end
elseif key=='x'then
if _testButton(11)then
SCN.go('about')
end
elseif key=='m'then
if _testButton(12)then
SCN.go('manual')
end
elseif key=='c'then
enterConsole()
elseif key=='escape'then
if tryBack()then
VOC.play('bye')
SCN.swapTo('quit','slowFade')
else
lastQuitTime=TIME()
MES.new('warn',text.sureQuit)
end
elseif key=='c'then
enterConsole()
@@ -120,36 +182,20 @@ function scene.draw()
end
end
local function notConn()
if NET.getlock('access_and_login')then
MES.new('warn',text.wsConnecting)
else
return true
end
end
scene.widgetList={
WIDGET.newButton{name='offline',x=-1200,y=210,w=800,h=100,color='lR',font=45,align='R',edge=30,code=function()if notConn()then SCN.go('mode')end end},
WIDGET.newButton{name='qplay', x=-1200,y=330,w=800,h=100,color='lM',font=40,align='R',edge=30,code=function()loadGame(STAT.lastPlay,true)end},
WIDGET.newButton{name='online', x=-1200,y=450,w=800,h=100,color='lV',font=45,align='R',edge=30,code=function()
if WS.status('app')=='running'then
NET.tryLogin(false)
elseif WS.status('app')=='dead'then
NET.wsconn_app()
SFX.play('connect')
MES.new('info',text.wsConnecting)
end
end},
WIDGET.newButton{name='custom', x=-1200,y=570,w=800,h=100,color='lS',font=45,align='R',edge=30,code=function()if notConn()then SCN.go('customGame')end end},
WIDGET.newButton{name='offline',x=-1200,y=210,w=800,h=100,color='lR',font=45,align='R',edge=30,code=pressKey'1'},
WIDGET.newButton{name='qplay', x=-1200,y=330,w=800,h=100,color='lM',font=40,align='R',edge=30,code=pressKey'q'},
WIDGET.newButton{name='online', x=-1200,y=450,w=800,h=100,color='lV',font=45,align='R',edge=30,code=pressKey'a'},
WIDGET.newButton{name='custom', x=-1200,y=570,w=800,h=100,color='lS',font=45,align='R',edge=30,code=pressKey'z'},
WIDGET.newButton{name='setting',x=2480,y=210,w=800,h=100, color='lO',font=40,align='L',edge=30,code=function()if notConn()then SCN.go('setting_game')end end},
WIDGET.newButton{name='stat', x=2480,y=330,w=800,h=100, color='lL',font=40,align='L',edge=30,code=function()if notConn()then SCN.go('stat')end end},
WIDGET.newButton{name='dict', x=2480,y=450,w=800,h=100, color='lG',font=40,align='L',edge=30,code=function()if notConn()then SCN.go('dict')end end},
WIDGET.newButton{name='replays',x=2480,y=570,w=800,h=100, color='lC',font=40,align='L',edge=30,code=function()if notConn()then SCN.go('replays')end end},
WIDGET.newButton{name='setting',x=2480,y=210,w=800,h=100, color='lO',font=40,align='L',edge=30,code=pressKey'-'},
WIDGET.newButton{name='stat', x=2480,y=330,w=800,h=100, color='lL',font=40,align='L',edge=30,code=pressKey'p'},
WIDGET.newButton{name='dict', x=2480,y=450,w=800,h=100, color='lG',font=40,align='L',edge=30,code=pressKey'l'},
WIDGET.newButton{name='replays',x=2480,y=570,w=800,h=100, color='lC',font=40,align='L',edge=30,code=pressKey','},
WIDGET.newButton{name='music', x=120,y=80,w=100, color='lO',code=function()if notConn()then SCN.go('music')end end,font=70,fText=CHAR.icon.music},
WIDGET.newButton{name='lang', x=280,y=80,w=100, color='lN',code=function()if notConn()then SCN.go('lang')end end,font=70,fText=CHAR.icon.language},
WIDGET.newButton{name='about', x=-110,y=670,w=600,h=70, color='lB',align='R',edge=20,code=function()if notConn()then SCN.go('about')end end,font=50,fText=CHAR.icon.info},
WIDGET.newButton{name='manual', x=1390,y=670,w=600,h=70, color='lR',align='L',edge=20,code=function()if notConn()then SCN.go('manual')end end,font=50,fText=CHAR.icon.help},
WIDGET.newButton{name='music', x=120,y=80,w=100, color='lO',code=pressKey'2',font=70,fText=CHAR.icon.music},
WIDGET.newButton{name='lang', x=280,y=80,w=100, color='lN',code=pressKey'3',font=70,fText=CHAR.icon.language},
WIDGET.newButton{name='about', x=-110,y=670,w=600,h=70, color='lB',align='R',edge=20,code=pressKey'x',font=50,fText=CHAR.icon.info},
WIDGET.newButton{name='manual', x=1390,y=670,w=600,h=70, color='lR',align='L',edge=20,code=pressKey'm',font=50,fText=CHAR.icon.help},
}
return scene

View File

@@ -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)

View File

@@ -17,12 +17,13 @@ local author={
moonbeam="Beethoven & MrZ",
empty="ERM",
["how feeling"]="V.A.",
["sugar fairy"]="Tchaikovsky & MrZ",
["secret7th remix"]="柒栎流星",
["jazz nihilism"]="Trebor",
["race remix"]="柒栎流星",
["sakura"]="ZUN & C₂₉H₂₅N₃O₅",
sakura="ZUN & C₂₉H₂₅N₃O₅",
["1980s"]="C₂₉H₂₅N₃O₅",
["malate"]="ZUN & C₂₉H₂₅N₃O₅",
malate="ZUN & C₂₉H₂₅N₃O₅",
}
local scene={}

View File

@@ -16,7 +16,6 @@ local inputBox=WIDGET.newInputBox{name='input',x=340,y=660,w=600,h=50,limit=256}
local playing
local lastUpstreamTime
local upstreamProgress
local lastBackTime=0
local noTouch,noKey=false,false
local touchMoveLastFrame=false
local newMessageTimer
@@ -36,15 +35,12 @@ local function _gotoSetting()
SCN.go('setting_game')
end
local function _quit()
if TIME()-lastBackTime<1 then
if tryBack()then
NET.signal_quit()
if SCN.stack[#SCN.stack-1]=='net_newRoom'then
SCN.pop()
end
SCN.back()
else
lastBackTime=TIME()
MES.new('info',text.sureQuit)
end
end
local function _switchChat()

View File

@@ -1,9 +1,6 @@
local lastLogoutTime
local scene={}
function scene.sceneInit()
lastLogoutTime=-1e99
BG.set()
end
function scene.sceneBack()
@@ -22,7 +19,7 @@ scene.widgetList={
WIDGET.newButton{name='rooms', x=640, y=540,w=350,h=120,font=40,code=goScene'net_rooms'},
WIDGET.newButton{name='logout',x=880, y=40,w=180, h=60,color='dR',
code=function()
if TIME()-lastLogoutTime<1 then
if tryBack()then
if USER.uid then
NET.wsclose_play()
NET.wsclose_user()
@@ -31,9 +28,6 @@ scene.widgetList={
saveFile(USER,'conf/user')
SCN.back()
end
else
MES.new('info',text.sureQuit)
lastLogoutTime=TIME()
end
end},
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},

View File

@@ -39,8 +39,6 @@ end}
local scene={}
local sure
local function _playRep(fileName)
local rep=DATA.parseReplay(fileName,true)
if not rep.available then
@@ -72,7 +70,6 @@ end
function scene.sceneInit()
BG.set()
sure=0
listBox:setList(REPLAY)
local hide=listBox:getLen()==0
for i=3,5 do
@@ -121,8 +118,7 @@ function scene.keyDown(key)
elseif key=='delete'then
local rep=listBox:getSel()
if rep then
if sure>.3 then
sure=0
if tryDelete()then
listBox:remove()
love.filesystem.remove(rep.fileName)
for i=1,#REPLAY do
@@ -132,9 +128,6 @@ function scene.keyDown(key)
end
end
SFX.play('finesseError',.7)
else
sure=1
MES.new('info',text.sureReset)
end
end
else
@@ -142,12 +135,6 @@ function scene.keyDown(key)
end
end
function scene.update(dt)
if sure>0 then
sure=sure-dt
end
end
scene.widgetList={
listBox,
WIDGET.newButton{name='export',x=180,y=640,w=140,h=80,color='lG',code=pressKey'cC',font=50,fText=CHAR.icon.export},

View File

@@ -54,7 +54,7 @@ local keyNames={
lgui='L'..CHAR.key.macCmd,
rgui='R'..CHAR.key.macCmd,
space=CHAR.key.space,
delete=CHAR.key.del,
delete=CHAR.key.macFowardDel,
pageup=CHAR.key.macPgup,
pagedown=CHAR.key.macPgdn,
home=CHAR.key.macHome,

View File

@@ -1,7 +1,8 @@
return[=[
未来小游戏:
Tetro-1010(2C2N, 重力); Tetra-link(桌游)
求合体; 坦克大战; 扫雷; 接水管; 记忆
Tetro-1010(2C2N, 重力)
Tetra-link(桌游)
坦克大战; 扫雷; 接水管
其他未来内容:
模式包系统; 新模组系统; 加速下落; spike相关统计数据
实时统计数据可视化; 教学关脚本语言; 从录像继续
@@ -13,26 +14,32 @@ return[=[
0.17.0: 硬着陆 Hard Landing
新增:
新模式:清版竞速
新模式:策略堆叠(原设计来自游戏Cambridge, by NOT_A_ROBOT)
新旋转系统:DRS_weak,移除了滞后旋转(五连块朝向风格模仿) #441
新BGM:malate(暂未使用)
新旋转系统:DRS_weak,没有滞后旋转(五连块风格模仿) #441
新机制:出块延迟打断(ARE打断)(默认关闭) #471
新机制:锁定在外判负(lockout)(默认关闭)
新机制:全局默认使用5帧窒息延迟
新功能:自定义图片背景功能(可调透明度)(目前仅电脑可用)
新功能:支持摇杆和扳机(参数暂时不能调整)
新功能:没有键盘全支持的场景可以用方向键控制光标操作 #329
新BGM:malate(暂未使用)
新小程序:Memorize,Triple
改动:
关闭背景亮度可调 #119
关闭背景的灰底亮度可调 #119
美化各种控件样式
调整游戏大logo为正体字
软降n格的键也可以触发深降
普通消1不再有single语音
优化键位设置菜单各种键的显示
优化大量菜单的背景颜色细节
修改默认和zday节日的主菜单BGM
平滑马拉松-普通和混战模式的速度曲线
三个高难隐形使用不同模式图标 #493
修改按钮音效,给复选框和选择器添加新音效
ultra模式计时器改为秒表,重开的时候会重播bgm
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了(略微影响手感,更滑)
大改重力和软降的结算逻辑,两个值接近的时候不会看起来不自然了 #438
Ospin变O后操作序列清空,变远端朝下JL时允许水平可移动
生成位置预览开启后hold的生成位置也可见 #453
TRS的S/Z添加四个踢墙防止在一些地方卡死
优化pc训练模式体验,添加胜利条件,不再无尽

View File

@@ -1,5 +1,5 @@
return{
["apkCode"]=413,
["apkCode"]=415,
["code"]=1700,
["string"]="V0.17.0",
["room"]="ver A-2",