Compare commits
37 Commits
pre0.17.0-
...
pre0.17.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0826a748ae | ||
|
|
a595fe99ef | ||
|
|
9dbc7942e3 | ||
|
|
845d8ae32e | ||
|
|
5c524e138c | ||
|
|
86d9265ff9 | ||
|
|
6994a5d6d3 | ||
|
|
e6213b00c1 | ||
|
|
43e2caa30e | ||
|
|
97ca245dfc | ||
|
|
36de1c0751 | ||
|
|
704341fd15 | ||
|
|
22b61bc9c3 | ||
|
|
f4cbbc0a2a | ||
|
|
dc99187b9d | ||
|
|
915598dec4 | ||
|
|
e7b4518d73 | ||
|
|
9603a78e87 | ||
|
|
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)
|
||||
|
||||
@@ -42,16 +42,28 @@ function SFX.init(list)
|
||||
end
|
||||
function SFX.load(path)
|
||||
local c=0
|
||||
local missing=0
|
||||
for i=1,#sfxList do
|
||||
local fullPath=path..sfxList[i]..'.ogg'
|
||||
if love.filesystem.getInfo(fullPath)then
|
||||
if Sources[sfxList[i]]then
|
||||
for j=1,#Sources[sfxList[i]]do
|
||||
Sources[sfxList[i]][j]:release()
|
||||
end
|
||||
end
|
||||
Sources[sfxList[i]]={love.audio.newSource(fullPath,'static')}
|
||||
c=c+1
|
||||
else
|
||||
LOG("No SFX: "..sfxList[i]..'.ogg',.1)
|
||||
missing=missing+1
|
||||
end
|
||||
end
|
||||
LOG(c.."/"..#sfxList.." SFX files loaded")
|
||||
LOG(missing.." SFX files missing")
|
||||
if missing>0 then
|
||||
MES.new('info',missing.." SFX files missing")
|
||||
end
|
||||
collectgarbage()
|
||||
end
|
||||
function SFX.loadSample(pack)
|
||||
assert(type(pack)=='table',"Usage: SFX.loadsample([table])")
|
||||
|
||||
@@ -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,13 +303,6 @@ function key:draw()
|
||||
local align=self.align
|
||||
local r,g,b=c[1],c[2],c[3]
|
||||
|
||||
--Frame
|
||||
if not self.noFrame then
|
||||
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
|
||||
gc_setLineWidth(2)
|
||||
gc_rectangle('line',x,y,w,h,3)
|
||||
end
|
||||
|
||||
--Fill
|
||||
if self.fShade then
|
||||
gc_setColor(r,g,b,ATV*.25)
|
||||
@@ -319,6 +314,16 @@ function key:draw()
|
||||
gc_draw(self.fShade,x+w-self.edge-self.fShade:getWidth(),y+h*.5-self.fShade:getHeight()*.5)
|
||||
end
|
||||
else
|
||||
--Background
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Frame
|
||||
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
|
||||
gc_setLineWidth(2)
|
||||
gc_rectangle('line',x,y,w,h,3)
|
||||
|
||||
--Shade
|
||||
gc_setColor(1,1,1,ATV*.05)
|
||||
gc_rectangle('fill',x,y,w,h,3)
|
||||
end
|
||||
@@ -345,7 +350,7 @@ function key:press(_,_,k)
|
||||
SFX.play('key')
|
||||
end
|
||||
end
|
||||
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0][,code][,hideF][,hide]
|
||||
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0][,code][,hideF][,hide]
|
||||
if not D.h then D.h=D.w end
|
||||
local _={
|
||||
name= D.name or"_",
|
||||
@@ -365,10 +370,9 @@ function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,fo
|
||||
|
||||
fText= D.fText,
|
||||
fShade= D.fShade,
|
||||
noFrame=D.noFrame,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
font= D.font or 30,
|
||||
fType=D.fType,
|
||||
fType= D.fType,
|
||||
sound= D.sound~=false,
|
||||
align= D.align or'M',
|
||||
edge= D.edge or 0,
|
||||
@@ -415,6 +419,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)
|
||||
@@ -625,7 +633,7 @@ function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,
|
||||
unit= D.unit or 1,
|
||||
smooth=false,
|
||||
font= D.font or 30,
|
||||
fType=D.fType,
|
||||
fType= D.fType,
|
||||
change=D.change,
|
||||
disp= D.disp,
|
||||
code= D.code or NULL,
|
||||
@@ -700,6 +708,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 +875,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)
|
||||
@@ -931,7 +949,7 @@ function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,fType][,secret][,regex
|
||||
},
|
||||
|
||||
font= D.font or int(D.h/7-1)*5,
|
||||
fType=D.fType,
|
||||
fType= D.fType,
|
||||
secret=D.secret==true,
|
||||
regex= D.regex,
|
||||
limit= D.limit,
|
||||
@@ -1023,8 +1041,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 +1215,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)
|
||||
|
||||
6
main.lua
6
main.lua
@@ -23,7 +23,7 @@ local fs=love.filesystem
|
||||
VERSION=require"version"
|
||||
TIME=love.timer.getTime
|
||||
YIELD=coroutine.yield
|
||||
SYSTEM=love.system.getOS()
|
||||
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 +60,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_))
|
||||
|
||||
@@ -340,8 +340,8 @@ VOC.init{
|
||||
LANG.init('zh',
|
||||
{
|
||||
zh=require'parts.language.lang_zh',
|
||||
zh_full=require'parts.language.lang_zh_full',
|
||||
zh_trad=require'parts.language.lang_zh_trad',
|
||||
zh_full=require'parts.language.lang_zh_full',
|
||||
en=require'parts.language.lang_en',
|
||||
fr=require'parts.language.lang_fr',
|
||||
es=require'parts.language.lang_es',
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 41 KiB |
@@ -25,8 +25,8 @@ function bot_cc:revive()
|
||||
self.P:loadAI(self.data)
|
||||
end
|
||||
function bot_cc:pushNewNext(id)
|
||||
self.ccBot:addNext(rem(self.nexts,1))
|
||||
ins(self.nexts,id)
|
||||
self.ccBot:addNext(rem(self.bufferedNexts,1))
|
||||
ins(self.bufferedNexts,id)
|
||||
end
|
||||
function bot_cc:thread()
|
||||
local P,keys=self.P,self.keys
|
||||
|
||||
@@ -12,7 +12,7 @@ local baseBot={
|
||||
function baseBot.update(bot)
|
||||
local P=bot.P
|
||||
local keys=bot.keys
|
||||
if P.control and P.waiting==0 then
|
||||
if P.control and P.cur then
|
||||
bot.delay=bot.delay-1
|
||||
if not keys[1]then
|
||||
if bot.runningThread then
|
||||
@@ -85,7 +85,7 @@ function BOT.new(P,data)
|
||||
if data.type=="CC"then
|
||||
P:setRS('SRS')
|
||||
bot.keys={}
|
||||
bot.nexts={}
|
||||
bot.bufferedNexts={}
|
||||
bot.delay=data.delay
|
||||
bot.delay0=data.delay
|
||||
if P.gameEnv.holdCount>1 then
|
||||
@@ -109,20 +109,25 @@ function BOT.new(P,data)
|
||||
return
|
||||
self.ccBot[k]and function(_,...)self.ccBot[k](self.ccBot,...)end or
|
||||
cc_lua[k]and function(_,...)cc_lua[k](self,...)end or
|
||||
baseBot[k]and baseBot[k]or
|
||||
error("No actions called "..k)
|
||||
assert(baseBot[k],"No CC action called "..k)
|
||||
end})
|
||||
|
||||
for i,B in next,P.nextQueue do
|
||||
if i<=data.next then
|
||||
local pushed=0
|
||||
if P.cur then
|
||||
bot:addNext(P.cur.id)
|
||||
pushed=pushed+1
|
||||
end
|
||||
for _,B in next,P.nextQueue do
|
||||
if pushed<=data.next then
|
||||
bot:addNext(B.id)
|
||||
pushed=pushed+1
|
||||
else
|
||||
ins(bot.nexts,B.id)
|
||||
ins(bot.bufferedNexts,B.id)
|
||||
end
|
||||
end
|
||||
bot.runningThread=coroutine.wrap(cc_lua.thread)
|
||||
bot.runningThread(bot)
|
||||
elseif data.type=="9S"or true then--9s or else
|
||||
else--if data.type=="9S"then--9s or else
|
||||
TABLE.cover(baseBot,bot)
|
||||
TABLE.cover(require"parts.bot.bot_9s",bot)
|
||||
P:setRS('TRS')
|
||||
|
||||
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
|
||||
}
|
||||
39
parts/eventsets/big_h.lua
Normal file
39
parts/eventsets/big_h.lua
Normal file
@@ -0,0 +1,39 @@
|
||||
return
|
||||
{
|
||||
drop=1,
|
||||
wait=8,
|
||||
fall=20,
|
||||
fieldH=10,
|
||||
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
|
||||
}
|
||||
33
parts/eventsets/big_n.lua
Normal file
33
parts/eventsets/big_n.lua
Normal file
@@ -0,0 +1,33 @@
|
||||
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,
|
||||
fieldH=10,
|
||||
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
|
||||
}
|
||||
@@ -10,7 +10,7 @@ return{
|
||||
end
|
||||
setField(P,D.finished+1)
|
||||
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6)
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
else
|
||||
P:win('finish')
|
||||
end
|
||||
|
||||
@@ -41,15 +41,15 @@ return{
|
||||
if D.target==110 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=5,5
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=5,5
|
||||
SFX.play('blip_2',.7)
|
||||
SFX.play('warn_2',.7)
|
||||
elseif D.target==140 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=4,4
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=4,4
|
||||
SFX.play('blip_2',.7)
|
||||
SFX.play('warn_2',.7)
|
||||
elseif D.target==170 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=3,3
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=3,3
|
||||
SFX.play('blip_2',.7)
|
||||
SFX.play('warn_2',.7)
|
||||
elseif D.target==200 then
|
||||
P:win('finish')
|
||||
return
|
||||
|
||||
@@ -40,7 +40,7 @@ return{
|
||||
if D.target==110 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=2,2
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=2,2
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.target==200 then
|
||||
P:win('finish')
|
||||
return
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -20,7 +20,7 @@ return{
|
||||
D.pt=D.pt+s
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100--range from 1 to 9
|
||||
local E=P.gameEnv
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
D.pt=D.pt+s
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
D.pt=D.pt+s
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
|
||||
@@ -147,7 +147,7 @@ return
|
||||
|
||||
P.modeData.target=260
|
||||
p=260
|
||||
SFX.play('blip_2')
|
||||
SFX.play('warn_2')
|
||||
SFX.play('reach')
|
||||
else
|
||||
p=260
|
||||
|
||||
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)
|
||||
@@ -818,7 +818,7 @@ do--function checkWarning()
|
||||
end
|
||||
GAME.warnLVL=_
|
||||
if GAME.warnLVL>1.126 and P1.frameRun%30==0 then
|
||||
SFX.fplay('warning',SETTING.sfx_warn)
|
||||
SFX.fplay('warn_beep',SETTING.sfx_warn)
|
||||
end
|
||||
elseif GAME.warnLVL>0 then
|
||||
GAME.warnLVL=max(GAME.warnLVL-.026,0)
|
||||
@@ -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",
|
||||
|
||||
@@ -772,21 +772,11 @@ return{
|
||||
['custom_puzzle']= {"自定义", "拼图"},
|
||||
},
|
||||
getTip={refuseCopy=true,
|
||||
"……,合群了就会消失,不合群世界毁灭(指game over",
|
||||
"……,合群了就会消失,但消失不代表没有意义",
|
||||
"……,没有对比就没有伤害",
|
||||
"“Techmino.app”将对您的电脑造成伤害。您应该将它移到废纸篓。",
|
||||
"“TechminOS”",
|
||||
"(a+b)³=a³+3a²b+3ab²+b³",
|
||||
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
||||
"《按钮风格进化史》",
|
||||
"《加载动画进化史》",
|
||||
"《教育的力量》",
|
||||
"《练习的力量》",
|
||||
"《梦想的意义》",
|
||||
"《天赋的力量》",
|
||||
"《游戏的意义》",
|
||||
"《知识的力量》",
|
||||
"《主题曲进化史》",
|
||||
"↑↑↓↓←→←→BA",
|
||||
"∫u dv=uv-∫v du",
|
||||
@@ -796,34 +786,16 @@ return{
|
||||
"1next 0hold",
|
||||
"1next 1hold!",
|
||||
"1next 6hold!",
|
||||
"2021年是Techmino联机元年",
|
||||
"20G本质是一个全新的游戏规则!",
|
||||
"29种块里28个都能spin你敢信?",
|
||||
"3.1415926535897932384???",
|
||||
"3.1415926535897932384(\\d{3})",
|
||||
"3next 1hold?",
|
||||
"40行世界纪录:14.915s by Reset_",
|
||||
"6236326236327175",
|
||||
"626in1",
|
||||
"6next 1hold!",
|
||||
"6next 6hold?!",
|
||||
"7宽三SZ架空捐了解一下",
|
||||
"把手机调到特殊的日期也许会发生什么",
|
||||
"报时机器人:新的一天开始了",
|
||||
"背景影响游玩?可以去设置关闭",
|
||||
"本游戏不叫Teachmino",
|
||||
"本游戏的一部分内容是国际合作的!",
|
||||
"本游戏的B2B是气槽机制,和传统的开关机制不一样哦",
|
||||
"本游戏还在测试中,出各种问题都是有可能的哦",
|
||||
"本游戏内置了几个休(yìng)闲(hé)小游戏哦~",
|
||||
"本游戏使用精简版字体,可能有些特殊字符不能正确显示",
|
||||
"本游戏在设计的时候受到了大量其他块游甚至一些音游的启发",
|
||||
"必须要软降才能到达的位置都会判定为极简操作",
|
||||
"别看攻击效率不高,其实消四还是很强的",
|
||||
"别问游戏名怎么取的,问就是随便想的",
|
||||
"不同人打40行最合适的方式不一样,s1w/63/散消/s2w……",
|
||||
"不同游戏(甚至不同模式)中不同战术的强度都不一样,并不能简单的按顺序排名",
|
||||
"不希望激烈的零和竞争充斥整个游戏",
|
||||
"不要悲伤,不要心急",
|
||||
"不要大力拍打或滑动哦",
|
||||
"不要卖弱不要卖弱不要卖弱",
|
||||
"不知道有多少人玩游戏的时候会关心游戏是谁做的",
|
||||
@@ -833,166 +805,73 @@ return{
|
||||
"车万方块是一家(暴论",
|
||||
"成就系统在做了!",
|
||||
"吃键?真的吗?建议回放看看到底按没按到,按了多久",
|
||||
"除了雨宫太阳还有很多高手玩家,甚至强出很多很多",
|
||||
"触发游戏报错后日志文件会越来越大(不过顶多几百K)",
|
||||
"触摸板打osu也很好!",
|
||||
"凑数tip什么时候能站起来!",
|
||||
"打好块跟学习一样没有捷径,多练。",
|
||||
"打铁.png",
|
||||
"打网络对战前请确认自己有一定的水平,不然会毫无游戏体验的",
|
||||
"打铁",
|
||||
"大概还是有人会看tip的",
|
||||
"大量使用开局定式的数据是不准的",
|
||||
"大陆的方块社区起步晚,所以世界级高手很少……下一个会是你吗?",
|
||||
"大家认为的俄罗斯方块很可能不是你以为的俄罗斯方块,场合合适的时候可以适当提醒一下哦",
|
||||
"大满贯10连击消四全清!",
|
||||
"戴上耳机以获得最佳体验",
|
||||
"单手也能玩!",
|
||||
"低帧率会降低游戏体验",
|
||||
"点击添加标题",
|
||||
"电脑游玩自带按键显示~",
|
||||
"对编程有真·兴趣推荐Lua,安装无脑 语法简单 执行速度快 远离枯燥学校编程(雾",
|
||||
"对战模式跟单机模式有本质区别,timing等能力需要专门练习",
|
||||
"多年小游戏玩家表示痛恨故意拖时间的假加载",
|
||||
"多hold现代块又回来了!",
|
||||
"俄罗斯方块完全可以作为电竞游戏",
|
||||
"发现有个“隐形”皮肤了吗",
|
||||
"发现Bug可以去GitHub上开个issue反馈",
|
||||
"方块不能吃",
|
||||
"方块不是你生活的全部,适当走出去看看",
|
||||
"方块教会我们,合群了就会消失,……",
|
||||
"方块默认出现的方向都是重心在下哦(如果你没乱动设置",
|
||||
"方块能吃吗",
|
||||
"分数一般只是好看的没有实际用途,建议只关心关卡要求",
|
||||
"服务器随时爆炸",
|
||||
"感觉明明按键了但是没反应?你真的按到了吗?",
|
||||
"感觉自己速度到上限了?试着把das调低一点",
|
||||
"感谢群友帮忙想tip",
|
||||
"感谢Orzmic为这个tip框提供修改意见",
|
||||
"感谢Phigros提供部分tip模板",
|
||||
"刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
|
||||
"刚开始练全隐形可以尽量堆平,留一列消四",
|
||||
"感谢Phigros提供(确信)部分tip模板",
|
||||
"隔壁不在乎玩家意见但是我们在乎,没人提过的合理建议一定会回应",
|
||||
"隔断消除即将到来!",
|
||||
"各种画面细节选项都可以在设置里找到哦",
|
||||
"更换方块皮肤也许能帮助提升成绩?不懂,玄学",
|
||||
"更小的DAS和ARR拥有更高的操作上限(能控制得了的话)",
|
||||
"更新内容在游戏里和群公告都有写!",
|
||||
"攻击生效速度(从快到慢):消二/三,消四,spin,高连击",
|
||||
"还能写些什么tip呢",
|
||||
"好像还没人能用脚打块打到一定水平",
|
||||
"好像可以把手机倒过来打场地旋转180……那还是不建议违反规则",
|
||||
"很有精神!",
|
||||
"欢迎来帮忙制作音乐或音效!",
|
||||
"欢迎提供更多游戏创意!",
|
||||
"混合消除即将到来!",
|
||||
"基础堆叠和挖掘能力非常重要,忽视这两项的人都后悔了(确信)",
|
||||
"即使被顶到天上了也不要放弃,每一行垃圾都有可能成为你的武器",
|
||||
"极简率决定了你大概的速度上限和相等手速下的放块速度",
|
||||
"假如生活欺骗了你,不要悲伤,不要心急,还有块陪着你",
|
||||
"架空消除即将到来!",
|
||||
"建议使用双手游玩",
|
||||
"健康小贴士:不要熬夜,真的会猝死",
|
||||
"健康小贴士:戴耳机(尤其是半入耳式)时音量千万别拉满,不然真的会影响听力(虽然很慢)",
|
||||
"健康小贴士:玩游戏多眨眼,不然会干眼病",
|
||||
"键位是可以自定义的",
|
||||
"键位有可能决定了上限,可能的话还是尽量考虑一下自己的键位是否利于超高速操作",
|
||||
"尽早学双旋吧,单旋没前途的",
|
||||
"经典块的水也很深,不要小看经典块玩家",
|
||||
"经典块跟现代块是两个游戏,一个厉害不代表另一个也厉害,得从头练起",
|
||||
"经典块和渣方块不是一回事",
|
||||
"据某个群友描述玩了Techmino之后打字速度变快了",
|
||||
"绝大多数按钮上的图标是调用Unicode私用区里的自制字符实现的",
|
||||
"觉得移动速度太慢或太快,手感不好?快去设置调整DAS/ARR",
|
||||
"开启省流模式后将不会加载用户头像(应该能省不少流吧)",
|
||||
"科技骨牌 你的创新式块堆栈业务技术管理器",
|
||||
"块东V共荣",
|
||||
"快去打一把100%极简看看会怎样",
|
||||
"锟斤拷锟斤拷锟斤拷",
|
||||
"来学编程,好玩的",
|
||||
"老牌益智游戏了",
|
||||
"连续pc有大量知识要背,不过背出来后随手10连pc不是问题",
|
||||
"六连块总共有……?那不重要,不会做的(大概",
|
||||
"论如何正确使用Unicode私用区定制字体",
|
||||
"卖弱和谦虚不是一回事,发言前三思呀",
|
||||
"卖弱禁言警告",
|
||||
"没学过编曲,音乐都是自己瞎写的,如果真的觉得好听就太好了!",
|
||||
"没有量化就没有对比,……",
|
||||
"每个块的出现方向可以自定义",
|
||||
"每个块的颜色可以自定义",
|
||||
"每个虚拟按键都可以隐藏/显示,尺寸也可调",
|
||||
"免费吃鸡方块",
|
||||
"喵!",
|
||||
"魔方也是方块(确信",
|
||||
"能导致吃键的问题有很多,建议说清楚具体发生了什么并且录视频说明",
|
||||
"能玩到Techmino不是你有优越感的理由",
|
||||
"你的双手是为了你的一生服务的,而不是Techmino",
|
||||
"你今天的人品值是(满分100):"..math.random(100),
|
||||
"你可以从统计页面打开游戏存档目录",
|
||||
"你们考虑过Z酱的感受吗?没有!你们只考虑你自己。",
|
||||
"你说彩蛋?嗯…算是有,可以找找",
|
||||
"你有一个好",
|
||||
"你这场地是金子堆的还是块是金子做的",
|
||||
"你知道吗[001]看主页机器人玩可能比较费电",
|
||||
"你知道吗[002]全程不使用任何旋转键完成40行模式是有可能的",
|
||||
"你知道吗[003]全程不使用左右移动键完成40行模式是有可能的",
|
||||
"你知道吗[004]停留在模式地图界面很费电",
|
||||
"你知道吗[005]在其他(方块)游戏相关场合提及本游戏是很不礼貌的",
|
||||
"你知道吗[006]O-Spin是在0.8.20 (Fantastic Global Update II)中诞生的",
|
||||
"你知道吗[007]TRS旋转系统的最初形态在0.0.091726版本就存在了",
|
||||
"你准备好了吗?",
|
||||
"其实很多时候“吃键”是玩家对游戏机制不了解或者自己的操作问题导致的",
|
||||
"其实S和Z有四个方向(状态),虽然看起来只有两个",
|
||||
"请谨慎向没有方块经验的玩家推荐,会对本游戏的生存环境造成影响,感谢配合。",
|
||||
"请勿大力敲打设备!敲坏了就没有Techmino玩了",
|
||||
"请勿使用三只手游玩",
|
||||
"去玩别的方块的时候记得没有Ospin!",
|
||||
"全球目前应该没人能全X评价(大爆炸不算)",
|
||||
"群友翻译的中文方块百科全书! tetris.huijiwiki.com",
|
||||
"让他三尺又何妨",
|
||||
"群友翻译的中文方块百科全书!tetris.huijiwiki.com",
|
||||
"如何O-spin: 一秒转626圈(误",
|
||||
"三连块只有2种",
|
||||
"三岁通关困难马拉松",
|
||||
"上面这个不是录像,是机器人实时在玩",
|
||||
"少女祈祷中",
|
||||
"少玩点游戏,多注意眨眼和休息",
|
||||
"深降了解一下",
|
||||
"时间碎片[000] 2021/11/21开始tip加入这个版块",
|
||||
"时间碎片[001] V0.7.9加入O-spin",
|
||||
"时间碎片[002] V0.7.19加入语音系统",
|
||||
"时间碎片[003] V0.7.22加入平滑下落",
|
||||
"时间碎片[004] V0.8.5加入模式地图",
|
||||
"时间碎片[005] V0.8.19加入五连块",
|
||||
"时间碎片[006] V0.9.0加入自定义序列和模式",
|
||||
"时间碎片[007] V0.10.0加入录像回放",
|
||||
"时间碎片[008] V0.11.1加入小z词典",
|
||||
"时间碎片[009] V0.12.2加入mod系统",
|
||||
"时间碎片[010] V0.13.0联网对战测试",
|
||||
"时间碎片[011] V0.13.2加入任意场地高度",
|
||||
"时间碎片[012] V0.13.3加入控制台",
|
||||
"时间碎片[013] V0.14.4加入第一首不是用Beepbox制作的BGM",
|
||||
"时间碎片[014] V0.14.5加入第一首社区玩家自制BGM",
|
||||
"时间碎片[015] V0.15.5加入录像回放菜单",
|
||||
"时间碎片[016] V0.16.0应该是单次更新内容最多的(起码更新历史最长)",
|
||||
"时间碎片[017] V0.16.2加入打击垫样式的音效室",
|
||||
"时间碎片[018] V0.17.0加入手柄的摇杆和扳机支持",
|
||||
"使用固定堆叠方法达成20TSD难度很低",
|
||||
"试试用跳舞毯打块",
|
||||
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
|
||||
"手机玩也可以外接键盘哦(iOS除外)",
|
||||
"首页的机器人可能会不小心把自己给玩死",
|
||||
"术语不认识?去右边那个词典里查查吧",
|
||||
"水平是随着时间一点点提升的,不是几天几星期就能玩好的哦",
|
||||
"四连块总共7种",
|
||||
"虽然极简连击和极简率计算看着很怪,但以后你会发现还挺科学!",
|
||||
"所有大道理tip都是亲眼目睹后加的,如果觉得多余说明就不是给你看的呀!消消气",
|
||||
"烫烫烫烫烫烫",
|
||||
"提前旋转等功能可以用来救命",
|
||||
"天哪,我竟然是一条凑数tip",
|
||||
"退一步海阔天空",
|
||||
"挖掘能力在对战里非常非常非常重要!!!!",
|
||||
"玩到一半弹出消息框?快去设置禁止弹窗",
|
||||
"玩得开心的话游戏作者也会很开心哦",
|
||||
"为了保护玩家们的健康,本游戏有一个临时的简易防沉迷系统!(不过估计你也触发不了/笑)",
|
||||
"为什么关卡那么少!因为前一模式成绩连B都没达到,再加把劲吧~",
|
||||
"为数不多走向世界的国产方块游戏",
|
||||
"我曾经在极度愤怒的时候15秒消了40行",
|
||||
"我们联合!",
|
||||
"我们是不是第一个在方块游戏做tip的?",
|
||||
@@ -1001,46 +880,24 @@ return{
|
||||
"我一个滑铲就挖了个11renPC",
|
||||
"我永远喜……",
|
||||
"无法打开“Techmino.app”,因为无法验证开发者。",
|
||||
"无聊翻翻设置是好习惯",
|
||||
"五连块总共18种",
|
||||
"物理hold了解一下",
|
||||
"希望极简率没事",
|
||||
"希望你们都能喜欢Z……哦不是,喜欢Techmino",
|
||||
"喜欢本游戏的话可以到应用商……好像没上架呢还,不过快了就是(",
|
||||
"喜欢本游戏的话可以到应用商店下载",
|
||||
"享受Tech的特色旋转系统!",
|
||||
"向其他人询问练习方法最好提供自己的详细水平,最好录些视频,不然很难给出合适的建议",
|
||||
"小心腱鞘炎",
|
||||
"写不出那种很酷的音乐(哭",
|
||||
"旋转不是变形!请尽量灵活利用顺逆时针两个旋转键",
|
||||
"学会使用两个旋转键,三个更好",
|
||||
"学习能力很重要,无论是玩游戏还是学知识",
|
||||
"要盯着bug不放",
|
||||
"音乐风格是什么,能吃吗",
|
||||
"音乐使用beepbox制作",
|
||||
"音游方块是一家(暴论",
|
||||
"隐形真的不难,只要花几个小时耐心练下去",
|
||||
"游戏确实可以是艺术,而不一定是纯“玩具”",
|
||||
"游戏使用LÖVE引擎制作",
|
||||
"游戏使用un……LÖVE引擎制作",
|
||||
"游戏也是一种艺术形式",
|
||||
"游戏中左下角三个信息分别是分数/时间/极简连击数",
|
||||
"游戏字体里藏了一套Z块表情包",
|
||||
"有建议的话可以把信息反馈给作者~",
|
||||
"有建议的话可以反馈给作者~",
|
||||
"有两个模式是以东方Project里的角色为主题的",
|
||||
"有一些隐藏模式不能从地图进入,到处找找看吧",
|
||||
"有疑问? 先看设置有没有你想要的",
|
||||
"右下角那个问号按钮是游戏说明书 (开了简洁模式当我没说)",
|
||||
"长期睡眠不足会引起不可逆的脑损伤(变傻)",
|
||||
"这不是休闲游戏……别怪关卡要求太高,多练吧",
|
||||
"这个菜单可以用纯键盘控制",
|
||||
"这里的极简判定不松不严,放心软降",
|
||||
"震惊,我只是一条凑数tip吗",
|
||||
"众所周知俄罗斯方块是经典编程练手游戏(?",
|
||||
"众所周知mac不能拿来玩游戏",
|
||||
"注意到方块“旋转”的时候到底发生了些什么吗?",
|
||||
"自定义场地可以画图实现逐页演示",
|
||||
"自己不确定的问题尽量不要教别人哦",
|
||||
"总共有400多条tip哦",
|
||||
"作业都没做完别玩手机",
|
||||
"作者40行sub26了",
|
||||
"作者电脑上装了11个方块",
|
||||
@@ -1051,8 +908,6 @@ return{
|
||||
"B2B2B???",
|
||||
"B2B2B2B并不存在……",
|
||||
"B2B2B2B存在吗?",
|
||||
"BT炮=beta炮=TCM-β炮",
|
||||
"c4w可不是在所有游戏里都很强哦",
|
||||
"c4w人竟是我自己",
|
||||
"c4w人竟在我身边",
|
||||
"cos(α+β)=CαCβ-SβSα",
|
||||
@@ -1062,18 +917,6 @@ return{
|
||||
"e^(πi)=-1",
|
||||
"e^(πi/2)=i",
|
||||
"e^(πi/4)=(1+i)/√2",
|
||||
"Farter评[01]:“成天被夸赞‘好玩’的”",
|
||||
"Farter评[02]:“可以形成方块圈子小中心话题,同作者一起衍生一些概念与梗的”",
|
||||
"Farter评[03]:“论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(”",
|
||||
"Farter评[04]:“民间微创新”",
|
||||
"Farter评[05]:“民间音lè与图案”",
|
||||
"Farter评[06]:“民间游戏设计”",
|
||||
"Farter评[07]:“是方块爱好者研究平台”",
|
||||
"Farter评[08]:“是方块萌新入坑接收器”",
|
||||
"Farter评[09]:“是居家旅行装逼必备”",
|
||||
"Farter评[10]:“是民间UI动效艺术作品”",
|
||||
"Farter评[11]:“是一滩散乱的代码组成的蜜汁结构”",
|
||||
"Farter评[12]:“它是现在的techmino已发布版本”",
|
||||
"fin neo iso 是满足tspin条件的特殊t2的名字",
|
||||
"git commit",
|
||||
"git push -f",
|
||||
@@ -1092,25 +935,22 @@ return{
|
||||
"sin²α-sin²β=S(α+β)S(α-β)",
|
||||
"sin2α=2SαCα",
|
||||
"sofunhowtoget",
|
||||
"Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给我们打赞助支持开发哦~",
|
||||
"STSD必死",
|
||||
"sudo rm -rf /*",
|
||||
"Techmino /'tɛkmɪnoʊ/ n.铁壳米诺(游戏名)",
|
||||
"Techmino = Technique + Tetromino",
|
||||
"Techmino 好玩!",
|
||||
"Techmino 濂界帺锛",
|
||||
"Techmino 英['tɛkmɪnəʊ] 美/'tekmɪnoʊ/ n.铁壳米诺(游戏名)",
|
||||
"Techmino console了解一下",
|
||||
"Techmino: App意外退出。",
|
||||
"Techmino.exe 已停止工作",
|
||||
"Techmino安卓下载",
|
||||
"Techmino不是工业产品也不是练手程序,是游戏作品(至少目前是,嗯……)",
|
||||
"Techmino好玩!",
|
||||
"Techmino没有氪金没有逼肝,良不良心~",
|
||||
"Techmino生日不太清楚,那就定在2019.6.26吧",
|
||||
"Techmino也有节日主题了哦",
|
||||
"Techmino有一个Nspire-CX版本!",
|
||||
"Techmino在哪里下载",
|
||||
"Techmino怎么念啊",
|
||||
"techminohaowan",
|
||||
"techminoisfun",
|
||||
"TechminOS coming s∞n",
|
||||
"viod main[]",
|
||||
"while(false)",
|
||||
"Z酱竟是我自己",
|
||||
@@ -1118,22 +958,182 @@ return{
|
||||
"Z酱是谁",
|
||||
"Z酱只是个写代码的,懂什么方块",
|
||||
"Z块等身抱枕来一个(x",
|
||||
"豆知识[001]总共有400多条tip哦",
|
||||
"豆知识[002]背景影响游玩?可以去设置关闭",
|
||||
"豆知识[003]方块默认出现的方向都是重心在下哦(如果你没乱动设置",
|
||||
"豆知识[004]各种画面细节选项都可以在设置里找到哦",
|
||||
"豆知识[005]觉得移动速度太慢或太快,手感不好?快去设置调整DAS/ARR",
|
||||
"豆知识[006]无聊翻翻设置是好习惯",
|
||||
"豆知识[007]有疑问?先看设置有没有你想要的",
|
||||
"豆知识[008]2021年是Techmino联机元年",
|
||||
"豆知识[009]20G本质是一个全新的游戏规则!",
|
||||
"豆知识[010]29种块里28个都能spin你敢信?",
|
||||
"豆知识[011]7宽三SZ架空捐了解一下",
|
||||
"豆知识[012]把手机调到特殊的日期也许会发生什么",
|
||||
"豆知识[013]本游戏不叫Teachmino",
|
||||
"豆知识[014]本游戏的一部分内容是国际合作的!",
|
||||
"豆知识[015]本游戏的中文名叫《方块研究所》",
|
||||
"豆知识[016]本游戏的B2B是气槽机制,和传统的开关机制不一样哦",
|
||||
"豆知识[017]本游戏内置了几个休(yìng)闲(hé)小游戏哦~",
|
||||
"豆知识[018]本游戏在设计的时候受到了大量其他块游甚至一些音游的启发",
|
||||
"豆知识[019]必须要软降才能到达的位置都会判定为极简操作",
|
||||
"豆知识[020]别看攻击效率不高,其实消四还是很强的",
|
||||
"豆知识[021]别问游戏名字怎么取的,问就是随便想的",
|
||||
"豆知识[022]不同人打40行最合适的方式不一样,s1w/63/散消/s2w……",
|
||||
"豆知识[023]不同游戏(甚至不同模式)中不同战术的强度都不一样,并不能简单的按顺序排名",
|
||||
"豆知识[024]除了雨宫太阳还有很多高手玩家,尤其是不在PPT里,甚至强出不少",
|
||||
"豆知识[025]触发游戏报错后日志文件会越来越大(不过顶多几百K)",
|
||||
"豆知识[026]打好块跟学习一样没有捷径,多练!",
|
||||
"豆知识[027]打网络对战前请确认自己有一定的水平,不然会毫无游戏体验的",
|
||||
"豆知识[028]大量使用开局定式的数据是不准的",
|
||||
"豆知识[029]大陆的方块社区起步晚,所以世界级高手很少……下一个会是你吗?",
|
||||
"豆知识[030]低帧率会降低游戏体验",
|
||||
"豆知识[031]电脑游玩自带按键显示~",
|
||||
"豆知识[032]对战模式跟单机模式有本质区别,timing等能力需要专门练习",
|
||||
"豆知识[033]发现Bug可以去GitHub上开个issue反馈",
|
||||
"豆知识[034]分数一般只是好看的没有实际用途,建议只关心关卡要求",
|
||||
"豆知识[035]服务器随时爆炸",
|
||||
"豆知识[036]感觉自己速度到上限了?试着把das调低一点",
|
||||
"豆知识[037]刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
|
||||
"豆知识[038]刚开始练全隐形可以尽量堆平,留一列消四",
|
||||
"豆知识[039]更小的DAS和ARR拥有更高的操作上限(能控制得了的话)",
|
||||
"豆知识[040]更新内容在游戏里和群公告都有写!",
|
||||
"豆知识[041]攻击生效速度(从快到慢):消二/三,消四,spin,高连击",
|
||||
"豆知识[042]好像可以把手机倒过来打场地旋转180……那还是不建议违反规则",
|
||||
"豆知识[043]基础堆叠和挖掘能力非常重要,忽视这两项的人都后悔了(确信)",
|
||||
"豆知识[044]即使被顶到天上了也不要放弃,每一行垃圾都有可能成为你的武器",
|
||||
"豆知识[045]极简率决定了你大概的速度上限和相等手速下的放块速度",
|
||||
"豆知识[046]键位是可以自定义的",
|
||||
"豆知识[047]键位有可能决定了上限,可能的话还是尽量考虑一下自己的键位是否利于超高速操作",
|
||||
"豆知识[048]尽早学双旋吧,单旋没前途的",
|
||||
"豆知识[049]经典块的水也很深,不要小看经典块玩家",
|
||||
"豆知识[050]经典块跟现代块是两个游戏,一个厉害不代表另一个也厉害,得从头练起",
|
||||
"豆知识[051]经典块和渣方块不是一回事",
|
||||
"豆知识[052]开启省流模式后将不会加载用户头像(应该能省不少流吧)",
|
||||
"豆知识[053]看主页机器人玩可能比较费电",
|
||||
"豆知识[054]连续pc有大量知识要背,不过背出来后随手10连pc不是问题",
|
||||
"豆知识[055]每个块的出现方向可以自定义",
|
||||
"豆知识[056]每个块的颜色可以自定义",
|
||||
"豆知识[057]每个虚拟按键都可以隐藏/显示,尺寸也可调",
|
||||
"豆知识[058]能导致吃键的问题有很多,建议说清楚具体发生了什么并且录视频说明",
|
||||
"豆知识[059]你可以从统计页面打开游戏存档目录",
|
||||
"豆知识[060]你说彩蛋?嗯…算是有,可以找找",
|
||||
"豆知识[061]其实很多时候“吃键”是玩家对游戏机制不了解或者自己的操作问题导致的",
|
||||
"豆知识[062]其实S和Z有四个方向(状态),虽然看起来只有两个",
|
||||
"豆知识[063]去玩别的方块的时候记得没有Ospin!",
|
||||
"豆知识[064]全程不使用任何旋转键完成40行模式是有可能的",
|
||||
"豆知识[065]三连块只有2种",
|
||||
"豆知识[066]四连块总共7种",
|
||||
"豆知识[067]五连块总共18种",
|
||||
"豆知识[068]六连块总共有……?那不重要,不会做的(大概",
|
||||
"豆知识[069]上面这个不是录像,是机器人实时在玩",
|
||||
"豆知识[070]使用固定堆叠方法达成20TSD难度很低",
|
||||
"豆知识[071]手机玩也可以外接键盘哦(iOS除外)",
|
||||
"豆知识[072]首页的机器人可能会不小心把自己给玩死",
|
||||
"豆知识[073]术语不认识?去右边那个词典里查查吧",
|
||||
"豆知识[074]水平是随着时间一点点提升的,不是几天几星期就能玩好的哦",
|
||||
"豆知识[075]虽然极简连击和极简率计算看着很怪,但以后你会发现还挺科学!",
|
||||
"豆知识[076]提前旋转等功能可以用来救命",
|
||||
"豆知识[077]停留在模式地图界面很费电",
|
||||
"豆知识[078]为了保护玩家们的健康,本游戏有一个临时的简易防沉迷系统!(不过估计你也触发不了/笑)",
|
||||
"豆知识[079]为什么关卡那么少!因为前一模式成绩连B都没达到,再加把劲吧~",
|
||||
"豆知识[080]为数不多走向世界的国产方块游戏",
|
||||
"豆知识[081]向其他人询问练习方法最好提供自己的详细水平,最好录些视频,不然很难给出合适的建议",
|
||||
"豆知识[082]小心腱鞘炎",
|
||||
"豆知识[083]玄学研究显示,更换方块皮肤也许能帮助提升成绩",
|
||||
"豆知识[084]旋转不是变形!请尽量灵活利用顺逆时针两个旋转键",
|
||||
"豆知识[085]学会使用两个旋转键,三个更好",
|
||||
"豆知识[086]隐形真的不难,只要耐心花几个小时练下去",
|
||||
"豆知识[087]游戏中左下角三个信息分别是分数/时间/极简连击数",
|
||||
"豆知识[088]游戏字体里藏了一套Z块表情包",
|
||||
"豆知识[089]有几个隐藏模式不能从地图进入,到处找找看吧",
|
||||
"豆知识[090]右下角那个问号按钮是游戏说明书 (开了简洁模式当我没说)",
|
||||
"豆知识[091]在其他(方块)游戏相关场合提及本游戏是很不礼貌的",
|
||||
"豆知识[092]这里的极简判定不松不严,放心软降",
|
||||
"豆知识[093]注意到方块“旋转”的时候到底发生了些什么吗?",
|
||||
"豆知识[094]自定义场地可以画图实现逐页演示",
|
||||
"豆知识[095]自己不确定的问题尽量不要教别人哦",
|
||||
"豆知识[096]BT炮=beta炮=TCM-β炮",
|
||||
"豆知识[097]c4w可不是在所有游戏里都很强哦",
|
||||
"豆知识[098]Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给我们打赞助支持开发哦~",
|
||||
"豆知识[099]Techmino不是工业产品也不是练手程序,是游戏作品(至少目前是,嗯……)",
|
||||
"豆知识[100]Techmino生日不太清楚,那就定在2019.6.26吧",
|
||||
"豆知识[101]Techmino有一个简单的节日主题系统",
|
||||
"豆知识[102]Techmino有一个Nspire-CX原型版本",
|
||||
"健康小贴士[01]玩游戏多眨眼,不然会干眼病",
|
||||
"健康小贴士[02]少玩点游戏,多注意眨眼和休息",
|
||||
"健康小贴士[03]戴耳机(尤其是半入耳式)时音量千万别拉满,不然真的会影响听力(虽然很慢)",
|
||||
"健康小贴士[04]不要熬夜,真的会猝死",
|
||||
"健康小贴士[05]长期睡眠不足会引起不可逆的脑损伤(变傻)",
|
||||
"Z思辨[01]《教育的力量》",
|
||||
"Z思辨[02]《学习的意义》",
|
||||
"Z思辨[03]《练习的力量》",
|
||||
"Z思辨[04]《知识的力量》",
|
||||
"Z思辨[05]《梦想的价值》",
|
||||
"Z思辨[06]《天赋的力量》",
|
||||
"Z思辨[07]《游戏的意义》",
|
||||
"Farter评[01]:“成天被夸赞‘好玩’的”",
|
||||
"Farter评[02]:“可以形成方块圈子小中心话题,同作者一起衍生一些概念与梗的”",
|
||||
"Farter评[03]:“论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(”",
|
||||
"Farter评[04]:“民间微创新”",
|
||||
"Farter评[05]:“民间音lè与图案”",
|
||||
"Farter评[06]:“民间游戏设计”",
|
||||
"Farter评[07]:“是方块爱好者研究平台”",
|
||||
"Farter评[08]:“是方块萌新入坑接收器”",
|
||||
"Farter评[09]:“是居家旅行装逼必备”",
|
||||
"Farter评[10]:“是民间UI动效艺术作品”",
|
||||
"Farter评[11]:“是一滩散乱的代码组成的蜜汁结构”",
|
||||
"Farter评[12]:“它是现在的techmino已发布版本”",
|
||||
"时间碎片[000] 2021/11/21加入这个版块",
|
||||
"时间碎片[001] V0.0.091726加入TRS旋转系统",
|
||||
"时间碎片[002] V0.7.9加入O-spin",
|
||||
"时间碎片[003] V0.7.19加入语音系统",
|
||||
"时间碎片[004] V0.7.22加入平滑下落",
|
||||
"时间碎片[005] V0.8.5加入模式地图",
|
||||
"时间碎片[006] V0.8.19加入五连块",
|
||||
"时间碎片[007] V0.9.0加入自定义序列和模式",
|
||||
"时间碎片[008] V0.10.0加入录像回放",
|
||||
"时间碎片[009] V0.11.1加入小z词典",
|
||||
"时间碎片[010] V0.12.2加入mod系统",
|
||||
"时间碎片[011] V0.13.0联网对战测试",
|
||||
"时间碎片[012] V0.13.2加入任意场地高度",
|
||||
"时间碎片[013] V0.13.3加入控制台",
|
||||
"时间碎片[014] V0.14.4加入第一首非Beepbox制作的BGM",
|
||||
"时间碎片[015] V0.14.5加入第一首社区玩家自制BGM",
|
||||
"时间碎片[016] V0.15.5加入录像回放菜单",
|
||||
"时间碎片[017] V0.16.0加入BIRS",
|
||||
"时间碎片[018] V0.16.2加入打击垫样式的音效室",
|
||||
"时间碎片[019] V0.17.0加入手柄的摇杆和扳机支持",
|
||||
"Z哲[01]方块教会我们,合群了就会消失,……",
|
||||
"Z哲[02]假如生活欺骗了你,不要悲伤,不要心急,还有块陪着你",
|
||||
"Z哲[03]……,合群了就会消失,不合群世界毁灭(指game over",
|
||||
"Z哲[04]……,合群了就会消失,但消失不代表没有意义",
|
||||
"Z哲[05]没有量化就没有对比,……",
|
||||
"Z哲[06]……,没有对比就没有伤害",
|
||||
"Z哲[07]方块不是你生活的全部,适当走出去看看",
|
||||
"Z哲[08]能玩到Techmino不是你有优越感的理由",
|
||||
"Z哲[09]卖弱和谦虚不是一回事,发言前三思呀",
|
||||
"Z哲[10]让他三尺又何妨",
|
||||
"Z哲[11]退一步海阔天空",
|
||||
"Z哲[12]学习能力很重要,只要你以变强为目的,无论玩游戏学知识都可以很难",
|
||||
"Z哲[13]游戏确实可以是一种艺术形式,而不一定是纯“玩具”",
|
||||
"Z哲[14]不希望激烈的零和竞争充斥整个游戏",
|
||||
{C.C,"<PURE ",C.P,"MEMORY>"},
|
||||
{C.C,"15puzzle好玩!"},
|
||||
{C.C,"东方Project好玩!"},
|
||||
{C.C,"魔方好玩!"},
|
||||
{C.C,"噗哟噗哟好玩!"},
|
||||
{C.C,"扫雷好玩!"},
|
||||
{C.C,"Ballance好玩!"},
|
||||
{C.C,"Celeste好玩!"},
|
||||
{C.C,"Minecraft好玩!"},
|
||||
{C.C,"Orzmic好玩!"},
|
||||
{C.C,"Osu! 好玩!"},
|
||||
{C.C,"Phigros好玩!"},
|
||||
{C.C,"Terraria好玩!"},
|
||||
{C.C,"VVVVVV好玩!"},
|
||||
{C.C,"World of goo好玩!"},
|
||||
{C.C,"Zuma好玩!"},
|
||||
{C.C,"z推[01]东方Project好玩!"},
|
||||
{C.C,"z推[02]Minecraft好玩!"},
|
||||
{C.C,"z推[03]Osu!好玩!"},
|
||||
{C.C,"z推[04]Terraria好玩!"},
|
||||
{C.C,"z推[05]Celeste好玩!"},
|
||||
{C.C,"z推[06]World of goo好玩!"},
|
||||
{C.C,"z推[07]Orzmic好玩!"},
|
||||
{C.C,"z推[08]噗哟噗哟好玩!"},
|
||||
{C.C,"z推[09]Phigros好玩!"},
|
||||
{C.C,"z推[10]VVVVVV好玩!"},
|
||||
{C.C,"z推[11]Ballance好玩!"},
|
||||
{C.C,"z推[12]Zuma好玩!"},
|
||||
{C.C,"z推[13]魔方好玩!"},
|
||||
{C.C,"z推[14]15puzzle好玩!"},
|
||||
{C.C,"z推[15]扫雷好玩!"},
|
||||
{C.H,"暂定段位:9"},
|
||||
{C.H,"REGRET!!"},
|
||||
{C.lC,"Xspin",C.Z,"是啥"},
|
||||
@@ -1150,7 +1150,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)
|
||||
|
||||
@@ -15,12 +15,12 @@ local function check_rise(P)
|
||||
if L==0 then
|
||||
P:_showText(text.awesome,0,-120,80,'beat',.6)
|
||||
SFX.play('pc')
|
||||
BG.send(26)
|
||||
if BG.cur=='wing'then BG.send(26)end
|
||||
for _=1,8 do
|
||||
P:garbageRise(13,1,generateLine(P.holeRND:random(10)))
|
||||
end
|
||||
else
|
||||
BG.send(#P.clearedRow)
|
||||
if BG.cur=='wing'then BG.send(#P.clearedRow)end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -157,7 +157,7 @@ function NETPLY.setJoinMode(uid,ready)
|
||||
return
|
||||
end
|
||||
end
|
||||
SFX.play('blip_2',.5)
|
||||
SFX.play('warn_2',.5)
|
||||
end
|
||||
end
|
||||
return
|
||||
@@ -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)
|
||||
|
||||
@@ -136,7 +136,7 @@ local function _newEmptyPlayer(id,mini)
|
||||
}
|
||||
P.newNext=false--Warped coroutine to get new next, loaded in applyGameEnv()
|
||||
]]
|
||||
P.movDir,P.moving,P.downing=0,0,0--Last move key,DAS charging,downDAS charging
|
||||
P.movDir,P.moving,P.downing=0,0,-1--Last move key,DAS charging,downDAS charging
|
||||
P.dropDelay,P.lockDelay=0,0
|
||||
P.waiting,P.falling=0,0
|
||||
P.freshTime=0
|
||||
|
||||
@@ -220,7 +220,7 @@ function Player:act_moveLeft(auto)
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=-1
|
||||
if self.control and self.waiting==0 then
|
||||
if self.cur then
|
||||
if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)then
|
||||
self:createMoveFX('left')
|
||||
self.curX=self.curX-1
|
||||
@@ -241,7 +241,7 @@ function Player:act_moveRight(auto)
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=1
|
||||
if self.control and self.waiting==0 then
|
||||
if self.cur then
|
||||
if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)then
|
||||
self:createMoveFX('right')
|
||||
self.curX=self.curX+1
|
||||
@@ -258,21 +258,21 @@ function Player:act_moveRight(auto)
|
||||
end
|
||||
end
|
||||
function Player:act_rotRight()
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
self:spin(1)
|
||||
self.keyPressing[3]=false
|
||||
end
|
||||
end
|
||||
function Player:act_rotLeft()
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
self:spin(3)
|
||||
self.keyPressing[4]=false
|
||||
end
|
||||
end
|
||||
function Player:act_rot180()
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
self.ctrlCount=self.ctrlCount+2
|
||||
self:spin(2)
|
||||
self.keyPressing[5]=false
|
||||
@@ -280,7 +280,7 @@ function Player:act_rot180()
|
||||
end
|
||||
function Player:act_hardDrop()
|
||||
local ENV=self.gameEnv
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frame<ENV.dropcut then
|
||||
SFX.play('drop_cancel',.3)
|
||||
else
|
||||
@@ -304,12 +304,19 @@ function Player:act_hardDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_softDrop()
|
||||
self.downing=1
|
||||
if self.control and self.cur then
|
||||
self.downing=0
|
||||
if self.cur then
|
||||
if self.curY>self.ghoY then
|
||||
self.curY=self.curY-1
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
if self.gameEnv.sddas==0 then
|
||||
if self.gameEnv.sdarr==0 then
|
||||
self:act_insDown()
|
||||
else
|
||||
self:act_down1()
|
||||
self:act_down1()
|
||||
end
|
||||
else
|
||||
self:act_down1()
|
||||
end
|
||||
self:checkTouchSound()
|
||||
elseif self.gameEnv.deepdrop then
|
||||
self:_deepdrop()
|
||||
@@ -317,7 +324,7 @@ function Player:act_softDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_hold()
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
if self:hold()then
|
||||
self.keyPressing[8]=false
|
||||
end
|
||||
@@ -497,19 +504,27 @@ local playerActions={
|
||||
self.keyPressing[keyID]=true
|
||||
playerActions[keyID](self)
|
||||
self.stat.key=self.stat.key+1
|
||||
if self.id==1 and GAME.recording then
|
||||
end
|
||||
if self.id==1 then
|
||||
if GAME.recording then
|
||||
local L=GAME.rep
|
||||
ins(L,self.frameRun)
|
||||
ins(L,keyID)
|
||||
elseif self.streamProgress then
|
||||
VK.press(keyID)
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:releaseKey(keyID)
|
||||
self.keyPressing[keyID]=false
|
||||
if self.id==1 and GAME.recording then
|
||||
local L=GAME.rep
|
||||
ins(L,self.frameRun)
|
||||
ins(L,32+keyID)
|
||||
if self.id==1 then
|
||||
if GAME.recording then
|
||||
local L=GAME.rep
|
||||
ins(L,self.frameRun)
|
||||
ins(L,32+keyID)
|
||||
elseif self.streamProgress then
|
||||
VK.release(keyID)
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:newTask(code,...)
|
||||
@@ -819,7 +834,7 @@ function Player:receive(A,send,time,line)
|
||||
self.atkBufferSum=self.atkBufferSum+send
|
||||
self.stat.recv=self.stat.recv+send
|
||||
if self.sound then
|
||||
SFX.play(send<4 and'blip_1'or'blip_2',min(send+1,5)*.1)
|
||||
SFX.play(send<4 and'warn_1'or'warn_2',min(send+1,5)*.1)
|
||||
end
|
||||
if send>=2 then
|
||||
self:shakeField(send/2)
|
||||
@@ -889,7 +904,7 @@ function Player:freshBlock(mode,ifTele)--string mode: push/move/fresh/newBlock
|
||||
if(mode=='move'or mode=='newBlock'or mode=='push')and self.cur then
|
||||
local CB=self.cur.bk
|
||||
self.ghoY=min(#self.field+1,self.curY)
|
||||
if self._20G or ENV.sdarr==0 and self.keyPressing[7]and self.downing>ENV.sddas then
|
||||
if self._20G or ENV.sdarr==0 and self.keyPressing[7]and self.downing>=ENV.sddas then
|
||||
local _=self.ghoY
|
||||
|
||||
--Move ghost to bottom
|
||||
@@ -1324,8 +1339,8 @@ function Player:hold_swap(ifpre)
|
||||
|
||||
self.stat.hold=self.stat.hold+1
|
||||
end
|
||||
function Player:hold(ifpre)
|
||||
if self.holdTime>0 and(ifpre or self.falling==0 and self.waiting==0)then
|
||||
function Player:hold(ifpre,force)
|
||||
if self.holdTime>0 and(self.cur or ifpre or force)then
|
||||
if self.gameEnv.holdMode=='hold'then
|
||||
self:hold_norm(ifpre)
|
||||
elseif self.gameEnv.holdMode=='swap'then
|
||||
@@ -1391,7 +1406,7 @@ function Player:popNext(ifhold)--Pop nextQueue to hand
|
||||
pressing[6]=false
|
||||
end
|
||||
elseif self.holdQueue[1]then--Force using hold
|
||||
self:hold()
|
||||
self:hold(true,true)
|
||||
else--Next queue is empty, force lose
|
||||
self:lose(true)
|
||||
end
|
||||
@@ -1764,7 +1779,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
|
||||
|
||||
@@ -2048,7 +2063,7 @@ do
|
||||
return _cc,_gbcc
|
||||
end
|
||||
end
|
||||
function Player:loadAI(data)--Load AI params
|
||||
function Player:loadAI(data)--Load AI with params
|
||||
self.bot=BOT.new(self,data)
|
||||
self.bot.data=data
|
||||
end
|
||||
@@ -2301,6 +2316,9 @@ local function update_alive(P)
|
||||
P.control=true
|
||||
P.timing=true
|
||||
P:popNext()
|
||||
if P.bot then
|
||||
P.bot:updateField()
|
||||
end
|
||||
end
|
||||
if P.movDir~=0 then
|
||||
if P.moving<P.gameEnv.das then
|
||||
@@ -2413,13 +2431,8 @@ local function update_alive(P)
|
||||
--Drop pressed
|
||||
if P.keyPressing[7]then
|
||||
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 P.downing>=ENV.sddas then
|
||||
if ENV.sdarr==0 then
|
||||
P:act_insDown()
|
||||
end
|
||||
if ENV.shakeFX then
|
||||
@@ -2427,7 +2440,7 @@ local function update_alive(P)
|
||||
end
|
||||
end
|
||||
else
|
||||
P.downing=0
|
||||
P.downing=-1
|
||||
end
|
||||
|
||||
local stopAtFalling
|
||||
@@ -2458,33 +2471,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.keyPressing[7]and 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)
|
||||
|
||||
@@ -187,7 +187,7 @@ function scene.update(dt)
|
||||
speed=speed+.2
|
||||
end
|
||||
level=level+1
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
end
|
||||
sunH=sunH+.01
|
||||
elseif menu==1 then
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -209,7 +209,7 @@ function scene.keyDown(key)
|
||||
elseif key=='n'then
|
||||
ins(FIELD,page+1,DATA.newBoard(FIELD[page]))
|
||||
page=page+1
|
||||
SFX.play('blip_1',.8)
|
||||
SFX.play('warn_1',.8)
|
||||
SYSFX.newShade(3,200,60,300,600,.5,1,.5)
|
||||
elseif key=='m'then
|
||||
rem(FIELD,page)
|
||||
@@ -438,32 +438,32 @@ scene.widgetList={
|
||||
WIDGET.newText{name='title', x=1020,y=5,font=70,align='R'},
|
||||
WIDGET.newText{name='subTitle', x=1030,y=50,font=35,align='L',color='H'},
|
||||
|
||||
WIDGET.newButton{name='b1', x=580, y=130,w=76,fText="",color='R',code=_setPen(1)},--B1
|
||||
WIDGET.newButton{name='b2', x=660, y=130,w=76,fText="",color='F',code=_setPen(2)},--B2
|
||||
WIDGET.newButton{name='b3', x=740, y=130,w=76,fText="",color='O',code=_setPen(3)},--B3
|
||||
WIDGET.newButton{name='b4', x=820, y=130,w=76,fText="",color='Y',code=_setPen(4)},--B4
|
||||
WIDGET.newButton{name='b5', x=900, y=130,w=76,fText="",color='L',code=_setPen(5)},--B5
|
||||
WIDGET.newButton{name='b6', x=980, y=130,w=76,fText="",color='J',code=_setPen(6)},--B6
|
||||
WIDGET.newButton{name='b7', x=1060,y=130,w=76,fText="",color='G',code=_setPen(7)},--B7
|
||||
WIDGET.newButton{name='b8', x=1140,y=130,w=76,fText="",color='A',code=_setPen(8)},--B8
|
||||
WIDGET.newButton{name='b1', x=580, y=130,w=73,fText="",color='R',code=_setPen(1)},--B1
|
||||
WIDGET.newButton{name='b2', x=660, y=130,w=73,fText="",color='F',code=_setPen(2)},--B2
|
||||
WIDGET.newButton{name='b3', x=740, y=130,w=73,fText="",color='O',code=_setPen(3)},--B3
|
||||
WIDGET.newButton{name='b4', x=820, y=130,w=73,fText="",color='Y',code=_setPen(4)},--B4
|
||||
WIDGET.newButton{name='b5', x=900, y=130,w=73,fText="",color='L',code=_setPen(5)},--B5
|
||||
WIDGET.newButton{name='b6', x=980, y=130,w=73,fText="",color='J',code=_setPen(6)},--B6
|
||||
WIDGET.newButton{name='b7', x=1060,y=130,w=73,fText="",color='G',code=_setPen(7)},--B7
|
||||
WIDGET.newButton{name='b8', x=1140,y=130,w=73,fText="",color='A',code=_setPen(8)},--B8
|
||||
|
||||
WIDGET.newButton{name='b9', x=580, y=210,w=76,fText="",color='C',code=_setPen(9)},--B9
|
||||
WIDGET.newButton{name='b10', x=660, y=210,w=76,fText="",color='N',code=_setPen(10)},--B10
|
||||
WIDGET.newButton{name='b11', x=740, y=210,w=76,fText="",color='S',code=_setPen(11)},--B11
|
||||
WIDGET.newButton{name='b12', x=820, y=210,w=76,fText="",color='B',code=_setPen(12)},--B12
|
||||
WIDGET.newButton{name='b13', x=900, y=210,w=76,fText="",color='V',code=_setPen(13)},--B13
|
||||
WIDGET.newButton{name='b14', x=980, y=210,w=76,fText="",color='P',code=_setPen(14)},--B14
|
||||
WIDGET.newButton{name='b15', x=1060,y=210,w=76,fText="",color='M',code=_setPen(15)},--B15
|
||||
WIDGET.newButton{name='b16', x=1140,y=210,w=76,fText="",color='W',code=_setPen(16)},--B16
|
||||
WIDGET.newButton{name='b9', x=580, y=210,w=73,fText="",color='C',code=_setPen(9)},--B9
|
||||
WIDGET.newButton{name='b10', x=660, y=210,w=73,fText="",color='N',code=_setPen(10)},--B10
|
||||
WIDGET.newButton{name='b11', x=740, y=210,w=73,fText="",color='S',code=_setPen(11)},--B11
|
||||
WIDGET.newButton{name='b12', x=820, y=210,w=73,fText="",color='B',code=_setPen(12)},--B12
|
||||
WIDGET.newButton{name='b13', x=900, y=210,w=73,fText="",color='V',code=_setPen(13)},--B13
|
||||
WIDGET.newButton{name='b14', x=980, y=210,w=73,fText="",color='P',code=_setPen(14)},--B14
|
||||
WIDGET.newButton{name='b15', x=1060,y=210,w=73,fText="",color='M',code=_setPen(15)},--B15
|
||||
WIDGET.newButton{name='b16', x=1140,y=210,w=73,fText="",color='W',code=_setPen(16)},--B16
|
||||
|
||||
WIDGET.newButton{name='b17', x=580, y=290,w=76,font=40,fText=CHAR.icon.bone, color='dH',code=_setPen(17)},--BONE
|
||||
WIDGET.newButton{name='b18', x=660, y=290,w=76,font=40,fText=CHAR.icon.invis, color='D', code=_setPen(18)},--HIDE
|
||||
WIDGET.newButton{name='b19', x=740, y=290,w=76,font=40,fText=CHAR.icon.bomb, color='lY',code=_setPen(19)},--BOMB
|
||||
WIDGET.newButton{name='b20', x=820, y=290,w=76,font=40,fText=CHAR.icon.garbage,color='H', code=_setPen(20)},--GB1
|
||||
WIDGET.newButton{name='b21', x=900, y=290,w=76,font=40,fText=CHAR.icon.garbage,color='lH',code=_setPen(21)},--GB2
|
||||
WIDGET.newButton{name='b22', x=980, y=290,w=76,font=40,fText=CHAR.icon.garbage,color='dV',code=_setPen(22)},--GB3
|
||||
WIDGET.newButton{name='b23', x=1060,y=290,w=76,font=40,fText=CHAR.icon.garbage,color='dR',code=_setPen(23)},--GB4
|
||||
WIDGET.newButton{name='b24', x=1140,y=290,w=76,font=40,fText=CHAR.icon.garbage,color='dG',code=_setPen(24)},--GB5
|
||||
WIDGET.newButton{name='b17', x=580, y=290,w=73,font=40,fText=CHAR.icon.bone, color='dH',code=_setPen(17)},--BONE
|
||||
WIDGET.newButton{name='b18', x=660, y=290,w=73,font=40,fText=CHAR.icon.invis, color='D', code=_setPen(18)},--HIDE
|
||||
WIDGET.newButton{name='b19', x=740, y=290,w=73,font=40,fText=CHAR.icon.bomb, color='lY',code=_setPen(19)},--BOMB
|
||||
WIDGET.newButton{name='b20', x=820, y=290,w=73,font=40,fText=CHAR.icon.garbage,color='H', code=_setPen(20)},--GB1
|
||||
WIDGET.newButton{name='b21', x=900, y=290,w=73,font=40,fText=CHAR.icon.garbage,color='lH',code=_setPen(21)},--GB2
|
||||
WIDGET.newButton{name='b22', x=980, y=290,w=73,font=40,fText=CHAR.icon.garbage,color='dV',code=_setPen(22)},--GB3
|
||||
WIDGET.newButton{name='b23', x=1060,y=290,w=73,font=40,fText=CHAR.icon.garbage,color='dR',code=_setPen(23)},--GB4
|
||||
WIDGET.newButton{name='b24', x=1140,y=290,w=73,font=40,fText=CHAR.icon.garbage,color='dG',code=_setPen(24)},--GB5
|
||||
|
||||
WIDGET.newButton{name='any', x=600, y=400,w=120,color='lH', font=40,code=_setPen(0)},
|
||||
WIDGET.newButton{name='space', x=730, y=400,w=120,color='H', font=55,code=_setPen(-1),fText=CHAR.icon.cross_thick},
|
||||
|
||||
@@ -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,13 +4,27 @@ local langList={
|
||||
zh_trad="繁體中文",
|
||||
en="English",
|
||||
fr="Français",
|
||||
es="Español",
|
||||
es="Español\n(Castellano)",
|
||||
pt="Português",
|
||||
|
||||
zh_grass="机翻",
|
||||
zh_yygq="就这?",
|
||||
symbol="?????",
|
||||
}
|
||||
local languages={
|
||||
"Language",
|
||||
"语言",
|
||||
"言語",
|
||||
"Langue",
|
||||
"Idioma",
|
||||
"Línguas",
|
||||
"Sprache",
|
||||
"Lingua",
|
||||
"Язык",
|
||||
"Γλώσσα",
|
||||
"언어",
|
||||
}
|
||||
local curLang=1
|
||||
|
||||
local scene={}
|
||||
|
||||
@@ -18,6 +32,21 @@ function scene.sceneBack()
|
||||
saveSettings()
|
||||
end
|
||||
|
||||
function scene.update(dt)
|
||||
curLang=curLang+dt*0.6
|
||||
if curLang>=#languages+1 then
|
||||
curLang=1
|
||||
end
|
||||
end
|
||||
|
||||
function scene.draw()
|
||||
setFont(60)
|
||||
love.graphics.setColor(1,1,1,1-curLang%1)
|
||||
GC.mStr(languages[curLang-curLang%1],640,20)
|
||||
love.graphics.setColor(1,1,1,curLang%1)
|
||||
GC.mStr(languages[curLang-curLang%1+1]or languages[1],640,20)
|
||||
end
|
||||
|
||||
local function _setLang(lid)
|
||||
SETTING.locale=lid
|
||||
applyLanguage()
|
||||
@@ -27,18 +56,18 @@ local function _setLang(lid)
|
||||
end
|
||||
|
||||
scene.widgetList={
|
||||
WIDGET.newButton{x=271,y=190,w=346,h=120,font=40, fText=langList.zh, color='O',code=function()_setLang('zh')end},
|
||||
WIDGET.newButton{x=637,y=190,w=346,h=120,font=40, fText=langList.zh_trad, color='F',code=function()_setLang('zh_trad')end},
|
||||
WIDGET.newButton{x=1003,y=190,w=346,h=120,font=40, fText=langList.zh_full, color='R',code=function()_setLang('zh_full')end},
|
||||
WIDGET.newButton{x=271,y=190,w=346,h=120,font=40, fText=langList.zh, color='O',code=function()_setLang('zh')end},
|
||||
WIDGET.newButton{x=637,y=190,w=346,h=120,font=40, fText=langList.zh_trad, color='F',code=function()_setLang('zh_trad')end},
|
||||
WIDGET.newButton{x=1003,y=190,w=346,h=120,font=40,fText=langList.zh_full, color='R',code=function()_setLang('zh_full')end},
|
||||
|
||||
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=1050,y=331,w=255,h=120,font=40, fText=langList.pt, color='dG',code=function()_setLang('pt')end},
|
||||
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=33, 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='A',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},
|
||||
WIDGET.newButton{x=637,y=472,w=346,h=120,font=45, fText=langList.zh_yygq, color='S',code=function()_setLang('zh_yygq')end},
|
||||
WIDGET.newButton{x=1003,y=472,w=346,h=120,font=45, fText=langList.symbol, color='B',code=function()_setLang('symbol')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},
|
||||
WIDGET.newButton{x=637,y=472,w=346,h=120,font=45, fText=langList.zh_yygq, color='S',code=function()_setLang('zh_yygq')end},
|
||||
WIDGET.newButton{x=1003,y=472,w=346,h=120,font=45,fText=langList.symbol, color='B',code=function()_setLang('symbol')end},
|
||||
WIDGET.newButton{name='back',x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
|
||||
}
|
||||
|
||||
|
||||
@@ -53,12 +53,12 @@ pad={x=140,y=65,page=1,
|
||||
{samp={tag='clear_7',func=function()playClearSFX(7)end}},
|
||||
{samp={tag='clear_10',func=function()playClearSFX(10)end}},
|
||||
},
|
||||
{{sfx='prerotate'}, {sfx='rotate'}, {sfx='rotatekick'}, {}, {voc='single'}, {voc='double'}, {voc='triple'}, {voc='techrash'}},
|
||||
{{sfx='finesseError'},{sfx='finesseError_long'},{sfx='drop_cancel'},{}, {sfx='spin_0'}, {sfx='spin_1'}, {sfx='spin_2'}, {sfx='spin_3'}},
|
||||
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {}, {sfx='warning'},{sfx='reach'}, {sfx='pc'}},
|
||||
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {}, {sfx='collect'},{sfx='emit'}, {sfx='blip_1'}},
|
||||
{{sfx='ren_9'}, {sfx='ren_10'}, {sfx='ren_11'}, {sfx='ren_mega'},{voc='win'}, {voc='lose'}, {sfx='win'}, {sfx='fail'}},
|
||||
{{sfx='spawn_1'}, {sfx='spawn_2'}, {sfx='spawn_3'}, {sfx='spawn_4'}, {sfx='spawn_5'},{sfx='spawn_6'},{sfx='spawn_7'},{}},
|
||||
{{sfx='prerotate'}, {sfx='rotate'}, {sfx='rotatekick'}, {}, {voc='single'}, {voc='double'}, {voc='triple'}, {voc='techrash'}},
|
||||
{{sfx='finesseError'},{sfx='finesseError_long'},{sfx='drop_cancel'},{}, {sfx='spin_0'}, {sfx='spin_1'}, {sfx='spin_2'}, {sfx='spin_3'}},
|
||||
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {}, {sfx='warn_beep'},{sfx='reach'}, {sfx='pc'}},
|
||||
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {}, {sfx='collect'}, {sfx='emit'}, {sfx='warn_1'}},
|
||||
{{sfx='ren_9'}, {sfx='ren_10'}, {sfx='ren_11'}, {sfx='ren_mega'},{voc='win'}, {voc='lose'}, {sfx='win'}, {sfx='fail'}},
|
||||
{{sfx='spawn_1'}, {sfx='spawn_2'}, {sfx='spawn_3'}, {sfx='spawn_4'}, {sfx='spawn_5'},{sfx='spawn_6'}, {sfx='spawn_7'},{}},
|
||||
},
|
||||
{
|
||||
{{voc='mini'}, {voc='b2b'}, {voc='b3b'}, {voc='perfect_clear'},{voc='half_clear'},{}, {}, {}},
|
||||
@@ -90,8 +90,8 @@ pad={x=140,y=65,page=1,
|
||||
{{voc='mini'}, {voc='b2b'}, {voc='b3b'}, {voc='perfect_clear'}, {voc='half_clear'}, {sfx='finesseError'}, {sfx='finesseError_long'}, {sfx='drop_cancel'},},
|
||||
{{voc='zspin'}, {voc='sspin'}, {voc='jspin'}, {voc='lspin'}, {voc='tspin'}, {voc='ospin'}, {voc='ispin'}, {}},
|
||||
{{voc='single'}, {voc='double'}, {voc='triple'},{voc='techrash'}, {sfx='ren_mega', vol=0.25},{sfx='ren_mega', vol=0.5},{sfx='ren_mega', vol=0.75},{sfx='ren_mega'}},
|
||||
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {sfx='blip_1'}, {sfx='warning'}, {sfx='reach'}, {sfx='pc'}},
|
||||
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {sfx='blip_2'}, {sfx='collect'}, {sfx='emit'}, {}},
|
||||
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {sfx='warn_1'}, {sfx='warn_beep'}, {sfx='reach'}, {sfx='pc'}},
|
||||
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {sfx='warn_2'}, {sfx='collect'}, {sfx='emit'}, {}},
|
||||
{{sfx='ren_9'}, {sfx='ren_10'}, {sfx='ren_11'},{sfx='ren_mega'}, {voc='win'}, {voc='lose'}, {sfx='win'}, {sfx='fail'}},
|
||||
},
|
||||
{
|
||||
@@ -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)
|
||||
|
||||
@@ -21,7 +21,7 @@ end
|
||||
local scene={}
|
||||
|
||||
function scene.sceneInit()
|
||||
local data=loadFile('conf/account')
|
||||
local data=loadFile('conf/account','-canSkip')
|
||||
if data then
|
||||
savePW=true
|
||||
emailBox:setText(data[1])
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -200,7 +200,7 @@ function scene.socketRead(cmd,d)
|
||||
COLOR.dY,"#"..d.uid.." ",
|
||||
COLOR.Y,text.joinRoom,
|
||||
}
|
||||
SFX.play('click')
|
||||
SFX.play('warn_1')
|
||||
elseif cmd=='leave'then
|
||||
textBox:push{
|
||||
COLOR.lR,d.username,
|
||||
|
||||
@@ -222,7 +222,7 @@ function scene.draw()
|
||||
end
|
||||
|
||||
--Big info frame
|
||||
if PLAYERS[1].frameRun>180 then
|
||||
if PLAYERS[1].frameRun>=180 then
|
||||
gc.push('transform')
|
||||
gc.translate(560,205)
|
||||
gc.setLineWidth(2)
|
||||
@@ -349,12 +349,12 @@ scene.widgetList={
|
||||
WIDGET.newKey{name='setting', x=290,y=440,w=300,h=70,code=pressKey's',hideF=function()return GAME.fromRepMenu end},
|
||||
WIDGET.newKey{name='quit', x=290,y=540,w=300,h=70,code=pressKey'q'},
|
||||
WIDGET.newKey{name='tas', x=290,y=620,w=240,h=50,code=pressKey't',hideF=function()return not SETTING.allowTAS or GAME.tasUsed or GAME.result or GAME.replaying end},
|
||||
WIDGET.newKey{name='page_prev',x=500,y=390,w=70,code=pressKey'tab',noFrame=true,
|
||||
WIDGET.newKey{name='page_prev',x=500,y=390,w=70,code=pressKey'tab',
|
||||
fText=GC.DO{70,70,{'setLW',2}, {'dRPol',33,35,32,3,6,3.142},{'dRPol',45,35,32,3,6,3.142}},
|
||||
fShade=GC.DO{70,70,{'setCL',1,1,1,.4},{'draw',GC.DO{70,70,{'setCL',1,1,1,1},{'fRPol',33,35,32,3,6,3.142},{'fRPol',45,35,32,3,6,3.142}}}},
|
||||
hideF=function()return PLAYERS[1].frameRun<=180 end,
|
||||
},
|
||||
WIDGET.newKey{name='page_next',x=1230,y=390,w=70,code=pressKey'Stab',noFrame=true,
|
||||
WIDGET.newKey{name='page_next',x=1230,y=390,w=70,code=pressKey'Stab',
|
||||
fText=GC.DO{70,70,{'setLW',2}, {'dRPol',37,35,32,3,6},{'dRPol',25,35,32,3,6}},
|
||||
fShade=GC.DO{70,70,{'setCL',1,1,1,.4},{'draw',GC.DO{70,70,{'setCL',1,1,1,1},{'fRPol',37,35,32,3,6},{'fRPol',25,35,32,3,6}}}},
|
||||
hideF=function()return PLAYERS[1].frameRun<=180 end,
|
||||
|
||||
@@ -81,10 +81,10 @@ scene.widgetList={
|
||||
|
||||
WIDGET.newSlider{name='mainVol', x=300, y=170,w=420,lim=220,color='lG',disp=SETval('mainVol'), code=function(v)SETTING.mainVol=v love.audio.setVolume(SETTING.mainVol)end},
|
||||
WIDGET.newSlider{name='bgm', x=300, y=240,w=420,lim=220,color='lG',disp=SETval('bgm'), code=function(v)SETTING.bgm=v BGM.setVol(SETTING.bgm)end},
|
||||
WIDGET.newSlider{name='sfx', x=300, y=310,w=420,lim=220,color='lC',disp=SETval('sfx'), code=function(v)SETTING.sfx=v SFX.setVol(SETTING.sfx)end, change=function()SFX.play('blip_1')end},
|
||||
WIDGET.newSlider{name='sfx', x=300, y=310,w=420,lim=220,color='lC',disp=SETval('sfx'), code=function(v)SETTING.sfx=v SFX.setVol(SETTING.sfx)end, change=function()SFX.play('warn_1')end},
|
||||
WIDGET.newSlider{name='stereo', x=300, y=380,w=420,lim=220,color='lC',disp=SETval('stereo'), code=function(v)SETTING.stereo=v SFX.setStereo(SETTING.stereo)end,change=function()SFX.play('move',1,-1)SFX.play('lock',1,1)end,hideF=function()return SETTING.sfx==0 end},
|
||||
WIDGET.newSlider{name='spawn', x=300, y=450,w=420,lim=220,color='lC',disp=SETval('sfx_spawn'), code=function(v)SETTING.sfx_spawn=v end, change=function()SFX.fplay('spawn_'..math.random(7),SETTING.sfx_spawn)end,},
|
||||
WIDGET.newSlider{name='warn', x=300, y=520,w=420,lim=220,color='lC',disp=SETval('sfx_warn'), code=function(v)SETTING.sfx_warn=v end, change=function()SFX.fplay('warning',SETTING.sfx_warn)end},
|
||||
WIDGET.newSlider{name='warn', x=300, y=520,w=420,lim=220,color='lC',disp=SETval('sfx_warn'), code=function(v)SETTING.sfx_warn=v end, change=function()SFX.fplay('warn_beep',SETTING.sfx_warn)end},
|
||||
WIDGET.newSlider{name='vib', x=300, y=590,w=420,lim=220,color='lN',disp=SETval('vib'),unit=10,code=function(v)SETTING.vib=v end, change=function()if SETTING.vib>0 then VIB(SETTING.vib+2)end end},
|
||||
WIDGET.newSlider{name='voc', x=300, y=660,w=420,lim=220,color='lN',disp=SETval('voc'), code=function(v)SETTING.voc=v VOC.setVol(SETTING.voc)end, change=function()VOC.play('test')end},
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
return[=[
|
||||
未来小游戏:
|
||||
Tetro-1010(2C2N, 重力); Tetra-link(桌游)
|
||||
求合体; 坦克大战; 扫雷; 接水管
|
||||
Tetro-1010(2C2N, 重力)
|
||||
Tetra-link(桌游)
|
||||
坦克大战; 扫雷; 接水管
|
||||
其他未来内容:
|
||||
模式包系统; 新模组系统; 加速下落; spike相关统计数据
|
||||
实时统计数据可视化; 教学关脚本语言; 从录像继续
|
||||
@@ -13,36 +14,42 @@ return[=[
|
||||
|
||||
0.17.0: 硬着陆 Hard Landing
|
||||
新增:
|
||||
新模式:策略堆叠(原设计来自游戏Cambridge, by NOT_A_ROBOT)
|
||||
新旋转系统:DRS_weak,移除了滞后旋转(五连块朝向风格模仿) #441
|
||||
新模式:策略堆叠(原设计来自游戏Cambridge by Milla, NOT_A_ROBOT移植)
|
||||
新旋转系统:DRS_weak,没有滞后旋转(五连块风格模仿) #441
|
||||
新机制:出块延迟打断(ARE打断)(默认关闭) #471
|
||||
新机制:锁定在外判负(lockout)(默认关闭)
|
||||
新机制:全局默认使用5帧窒息延迟
|
||||
新功能:没有键盘全支持的场景可以用方向键控制光标操作 #329
|
||||
新功能:自定义图片背景功能(可调透明度)(目前仅电脑可用)
|
||||
新功能:支持摇杆和扳机(参数暂时不能调整)
|
||||
新功能:没有键盘全支持的场景可以用方向键控制光标操作 #329
|
||||
新BGM:malate(暂未使用)
|
||||
新小程序:Memorize,Triple
|
||||
改动:
|
||||
关闭背景的灰底亮度可调 #119
|
||||
调整游戏大logo为正体字
|
||||
软降n格的键也可以触发深降
|
||||
优化键位设置菜单各种键的显示
|
||||
修改默认和zday节日的主菜单BGM
|
||||
三个高难隐形使用不同模式图标 #493
|
||||
修改按钮音效,给复选框和选择器添加新音效
|
||||
ultra模式计时器改为秒表,重开的时候会重播bgm
|
||||
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了(略微影响手感,更滑)
|
||||
新BGM:malate(暂未使用)
|
||||
玩法改动:
|
||||
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了(灵敏度上限增加一点点)
|
||||
大改重力和软降的结算逻辑,两个值接近的时候不会看起来不自然了 #438
|
||||
Ospin变O后操作序列清空,变远端朝下JL时允许水平可移动
|
||||
生成位置预览开启后hold的生成位置也可见 #453
|
||||
ultra模式计时器改为秒表,重开的时候会重播bgm
|
||||
TRS的S/Z添加四个踢墙防止在一些地方卡死
|
||||
优化pc训练模式体验,添加胜利条件,不再无尽
|
||||
平滑马拉松-普通和混战模式的速度曲线
|
||||
堆积模式添加15帧的窒息延迟 #465
|
||||
软降n格的键也可以触发深降
|
||||
系统改动:
|
||||
美化各种控件样式
|
||||
调整游戏大logo为正体字
|
||||
优化大量菜单的背景颜色细节
|
||||
普通消1不再有single语音
|
||||
优化键位设置菜单各种键的显示
|
||||
修改部分不常用设置时会显示警告
|
||||
两种按钮上的文本也会挤压绘制了
|
||||
关闭背景的灰底亮度可调 #119
|
||||
修改默认和zday节日的主菜单BGM
|
||||
修改按钮音效,给复选框和选择器添加新音效
|
||||
三个高难隐形使用不同模式图标 #493
|
||||
小程序arm加入计时器和重置按钮
|
||||
控制台使用等宽字体,更有味道(
|
||||
控制台使用等宽字体,更对味
|
||||
美化控制台help命令列表
|
||||
大规模整理首页tip
|
||||
代码:
|
||||
BGM模块可限制最大加载数,不容易达到上限导致没声 #447
|
||||
语音模块支持设置轻微随机音调偏移半径(游戏内固定使用1)
|
||||
@@ -52,6 +59,7 @@ return[=[
|
||||
扩展字符串扩展模块
|
||||
THEME模块移出框架
|
||||
修复:
|
||||
软降在sddas/sdarr很小的时候行为不正确
|
||||
机翻语言超级消除无行数显示 #462
|
||||
竞速-效率左侧信息颜色问题
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
["apkCode"]=414,
|
||||
["apkCode"]=417,
|
||||
["code"]=1700,
|
||||
["string"]="V0.17.0",
|
||||
["room"]="ver A-2",
|
||||
|
||||
Reference in New Issue
Block a user